OS9/GAME09/FORTH/TL1
Menu Menu
OS-9 の特徴
Microware 社によりMotorola のMC6809用に作られた 8bit OS。1980年初頭。
Module と言う単位をメモリ上にどこに配置しても良い Time sharing を採用した並列実行(concurrent) (平行(parallel)ではない) Unix like なshell とpipe Basic09 というPascal likeな言語を持つ。
MC6809
Level 1/2
level 1 ROM上のOS9 p1 kernel で動作する。level 2 MMUで2Mbyteのメモリを使える
アドレス変換に対応し、512kメモリを使用できる。
何をするか
Emulator 上で OS-9 を動かそう。
できれば Level 2なんで?
昔、自作のに乗っけれなかった。せっかく5万円も出して買ったのに。
残念ながらハードはもうないけど、Emulator なら?
20年前に「年取ったらやろう」と思っていたが、そろそろやるべき。
OS9 with MMU
kernel構成
kernel構成
OS9p1system callと割り込み処理 Module 発見と管理OS9p2
メモリ管理 Task管理 Signal
kernel構成2
IOMan
SCF/RBFと device driver とdescriptor の登録SCF
sequencial file io managerRBF
randome block file io manager file system管理
Runtime module
init
boot用初期データsysgo
clockとShellの起動Clock
timer 割り込み 日付計算
Runtime module 2
Shell
Device descriptor
D0 TermDevice driver
PTY PDisk
nitros9
OS9 をdisassemble したものらしい
Tandy Coco 上で動いていたらしい
ライセンス的にはだめかも
大目に見られてる?
Emulator
sbc09というアセンブラEmulator上に実装して動作させたsbc09 を mmu 対応にして level 2 まで動かした。
仮想RBF (random block filer manager )
Unix 上のファイルを Emulator 側からos9のファイルシステムとして見せる
OS-9 上のソフト
BASIC09 FORTH BASIC GAME09 TL/1
FORTH
PostScript の元になった言語
関数単位
assembler を自分でかける : ACCEPT-TEST CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR ABUF 80 ACCEPT CR ." RECEIVED: " [CHAR] " EMIT ABUF SWAP TYPE [CHAR] " EMIT CR
GAME09
VTLの日本での実装
記号的なBASIC
コンパイラとかが書かれた
100 "ADDRESS=" A=? 110 "TO =" D=? @ !=900 120 @=(A>D) #=-1 900 / ??=A .=20 E=A !=1000 910 $=$D .=5 B=0,5 ;=E+B>=A .=3 #=930 920 ?$=E:B) " "割とダメ。行番号なしの rvtl というのがある。
Micro C
mohta氏と手塚氏の作った 6809 用の整数Cコンパイラ。構造体がある。
04D7: * getchar() 04D7: * { return getc(stdin); 04D7: getchar 04D7: 3440 PSHS U 04D9: 33E4 LEAU ,S 04DB: EC20 LDD 0,Y 04DD: 3406 PSHS D 04DF: 17FFB7 LBSR getc 04E2: 3262 LEAS 2,S 04E4: * } 04E4: 35C0 PULS U,PCこれを CbC にしたものがある。
TL/1
大西氏のコンパイラ言語、データ型はByteとByte Arrayのみ。手続きと関数がある。
PROC WAIT FUNC TIME %--- MAIN --- VAR MMI,MMJ,MMK BEGIN WRITE(1:ASCII($A)) MMI:=1 MMJ:=2 MMK:=3 WAIT(4,5) WRITE(1:MMI,CRLF) END %-- PROCEDURE WAIT -- WAIT(WWA,WWB) VAR WWJ,WWK BEGIN WWJ:=4 WWK:=TIME(6,7) WRITE(1:MMI,WWJ,WWA,WWB,WWK,CRLF) END型がないのは現代的な気がする
TL/1のオブジェクト
020B: 9F 16 STX <$16 020D: 30 C9 01 C2 LEAX +$01C2,U 0211: 86 01 LDA #$01 0213: A7 00 STA +$00,X Mainの大域変数 0215: 86 02 LDA #$02 =局所変数 0217: A7 01 STA +$01,X 0219: 86 03 LDA #$03 021B: A7 02 STA +$02,X 021D: 86 04 LDA #$04 021F: A7 03 STA +$03,X 0221: 86 05 LDA #$05 0223: A7 04 STA +$04,X 0225: 86 03 LDA #$03 0227: 17 00 0F LBSR $0239 022A: 86 01 LDA #$01 022C: 97 01 STA <$01 022E: A6 00 LDA +$00,X 0230: 17 FE 3A LBSR $006D 0233: 17 FE C6 LBSR $00FC 0236: 16 FE D6 LBRA $010F 0239: AF E3 STX ,--S 023B: 30 86 LEAX A,X 呼出側の局所変数の確保 023D: 86 04 LDA #$04 023F: A7 02 STA +$02,X 0241: 86 06 LDA #$06 0243: A7 04 STA +$04,X 局所変数 0245: 86 07 LDA #$07 0247: A7 05 STA +$05,X 0249: 86 04 LDA #$04 024B: 17 00 24 LBSR $0272 024E: A7 03 STA +$03,X 0250: 86 01 LDA #$01 0252: 97 01 STA <$01 0254: A6 20 LDA +$00,Y 大域変数 0256: 17 FE 14 LBSR $006D 0259: A6 02 LDA +$02,X 呼び出した方の引数 025B: 17 FE 0F LBSR $006D 025E: A6 00 LDA +$00,X 0260: 17 FE 0A LBSR $006D 0263: A6 01 LDA +$01,X 0265: 17 FE 05 LBSR $006D 0268: A6 03 LDA +$03,X 026A: 17 FE 00 LBSR $006D 026D: 17 FE 8C LBSR $00FC 0270: 35 90 PULS PC,X
Gears OS の参考になる?
module は Code Gear 。Data Gear を導入する。
OS 自体を module 構成にする
module を memory に mapping する
module 間の通信
module の生態系 (version 管理 )
動く module の version の組合せTL/1 言語はシンプルに
型はメタレベルで付ける
大きなデータは write などの通信で行う
さらに
qemu で TLB base で動かすinterpreter base の Emualtor ではなく、compile base にする
nitros-9 のソースコードのコメントを増やす
まぁ、あんまりやりすぎないように