MICROS START INIT ;ハードウエアレジスタエリア OPSW DS 1;OldPSW IOINT DS 1;IO割り込みは1 IOSTS DS 1;IO状態、0ならREADY、1ならBUSY SCINT DS 1;SystemCall割出し、SCINは1をセット IOISA DS 1;割込み処理開始番地 SCINSA DS 1;SystenCallIN割出し処理開始番地 RSV1 DS 2;未使用 ;OSエリア RUN DS 1;実行中のプロセス READY DS 1;実行可能プロセス WAIT DS 1;IO終了待ちプロセス MOD DS 1;OSmode=1,UserMode=0; RSV2 DS 1;未使用 ;ユーザプロセス1用退避エリア P1SA DS 1;再開アドレス P1GR4 DS 1;GR4退避 P1GR5 DS 1;GR5退避 RSV3 DS 1;未使用 ;ユーザプロセス2用退避エリア P2SA DS 1;再開アドレス P2GR4 DS 1;GR4退避 P2GR5 DS 1;GR5退避 RSV4 DS 1;未使用 ;OS変数、定数 PPT DC '>' DC0 DC 0 DC1 DC 1 DC2 DC 2 DC4 DC 4 DC19 DC 19 CMD DS 1 ILEN DS 1 FG DC 'F' FB DC 'B' FA DC 'A' ERRC DC 'ERRC' ERRP DC 'ERRP' PAS1 DC 'PAS1' PAS2 DC 'PAS2' PAS3 DC 'PAS3' PAS4 DC 'PAS4' PG1 DC 1 PG2 DC 2 ;初期設定 ;0〜19番地を0クリアし、割込みベクトル等をセット INIT LAD GR0,0 LAD GR1,1 LAD GR2,0 CLRL ST GR0,OPSW,GR2 LAD GR2,1,GR2 CPA GR2,DC2;DC19 JZE CLRL VSET LAD GR0,IOI ST GR0,IOISA LAD GR0,SCIN ST GR0,SCINSA LAD GR0,USRPR1 ST GR0,P1SA LAD GR0,USRPR2 ST GR0,P2SA JUMP CMDP ;コマンド処理 ;>プロンプトを出して指示を待つ。 ;fならPR1だけを走らせ(RUNにPR1を入れ、READY,WAITを空にしてPMANへ)、 ;bならPR1とPR2を同時に走らす(RUNにPR1,READYにPR2,WAITを空にしてPMANへ) CMDP OUT PPT,DC1;プロンプト表示 IN CMD,ILEN LD GR0,FG;Fコマンドか? CPL GR0,CMD JZE FGD LD GR0,FB;Bコマンドか? CPL GR0,CMD JZE BGD LD GR0,FA;Aコマンドか? CPL GR0,CMD JZE ALL OUT ERRC,DC4 JUMP CMDP FGD LD GR0,PG1 ST GR0,RUN LD GR0,DC0 ST GR0,READY ST GR0,WAIT JUMP PMAN BGD LD GR0,PG2 ST GR0,RUN LD GR0,DC0 ST GR0,READY ST GR0,WAIT JUMP PMAN ALL LD GR0,PG1 ST GR0,RUN LD GR0,PG2 ST GR0,READY LD GR0,DC0 ST GR0,WAIT JUMP PMAN ;PMANプロセス管理 ;RUNにPG1が入っていればPR1を走らせ、PR2が入っていればPR2を走らす。 PMAN LD GR0,DC1 CPA GR0,RUN JZE STAPG1 LD GR0,DC2 CPA GR0,RUN JZE STAPG2 LD GR0,DC0 CPA GR0,RUN JZE IDL;RUNが無ければIDLEで待つ OUT ERRP,DC4 JUMP ABORT STAPG1 LD GR4,P1GR4 LD GR5,P1GR5 LPSW P1SA STAPG2 LD GR4,P2GR4 LD GR5,P2GR5 LPSW P2SA IDL IDLE ABORT RET ;IO割り込み ;PSWはOPSWに退避されてここに来るので、OPSW、GR4,5をPG2領域に退避し、 ;(割り込まれるのはPR2)、RUN(PR2)をREADYに入れ、 ;WAIT(PG1)をRUNに入れ、WAITを空にし、PMAN(プロセス管理)へ IOI LD GR0,DC0;RUNプロセス無いならIDLWへ CPA GR0,RUN JZE IDLW LD GR0,OPSW ST GR0,P2SA ST GR4,P2GR4 ST GR5,P2GR5 LD GR0,RUN ST GR0,READY IDLW LD GR0,WAIT ST GR0,RUN JUMP PMAN ;SystemCallIN(SCIN) ;PSWはOPSWに退避されてここにくるので、OPSWをPG1領域に退避し ;(これを出すのは今回PR1のみ)、READY(PG2)をRUNに入れ、READYを空にし、 ;WAITにPG1を入れ、PMAN(プロセス管理へ) SCIN LD GR0,OPSW ST GR0,P1SA ST GR4,P1GR4 ST GR5,P1GR5 LD GR0,RUN ST GR0,WAIT LD GR0,READY ST GR0,RUN OUT PAS2,DC4 SIO JUMP PMAN ;ユーザプログラム1:一文字読んでは1文字書き出すことを繰り返す USRPR1 OUT PAS3,DC4 READ U1DA,U1LEN OUT U1DA,U1LEN JUMP USRPR1 U1INC DC 'INPUT' U1LEN DS 1 U1DA DS 3 ;ユーザプログラム2:LD,STを繰り返す USRPR2 LD GR4,U2DC1 ST GR4,U2DA JUMP USRPR2 ; OUT PAS4,DC4 ; RET U2DC1 DC 1 U2DA DS 1 END