2012.7.30
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第185回]


●RT(リターン)プログラム(2)

今回は、前回お見せしましたRTプログラムの説明です。

              ;;;RETURN
1B9E F3       RT:DI
1B9F 2100ED   LD HL,STCWK
1BA2 1100F5   LD DE,STC
1BA5 010003   LD BC,$0300
1BA8 EDB0     LDIR
1BAA 3A83F0   LD A,(BRKCK)
1BAD B7       OR A
1BAE CABA1B   JP Z,RT2
1BB1 FE80     CP 80
1BB3 CABA1B   JP Z,RT2
1BB6 F680     OR 80
1BB8 D301     OUT (01),A

最初のところでスタックの値を300H(768)バイト、システムスタックエリアに戻しています。
768バイトに特別の意味はありません。
アバウトです。

ZB3BASICではシステムスタックをそのままユーザースタックとして使います。
そのため、ユーザーがプログラム内で別のエリアをスタックとして指定しない限りは、システムスタックがそのまま使われることになります。

その場合、ブレーク中のいろいろな処理でスタックの内容が変わってしまう可能性があるため、前回はこのことにふれませんでしたが、ブレーク処理のはじめのところで、スタックの中味をそのまま保存しています。

その保存したスタックの値を、RTルーチンの先頭でもとの通りに戻しているのが、上のリストの部分です。

その後の部分(アドレス1BAAHから後の部分)は、ZB3BASICのもとになった別のシステムのための処理部分です。
ND80ZVのZB3BASICシステムでは意味のない処理ですが、削除するべきなのをうっかり見落として、残ってしまいました。
ここは無視してください。

その次のところで、保存しておいたレジスタの値をもとに戻します(下のプログラム部分)。

1BBA 3184F0   RT2:LD SP,HLBF2   
1BBD E1       POP HL
1BBE D1       POP DE
1BBF C1       POP BC
1BC0 D9       EXX
1BC1 F1       POP AF
1BC2 08       EX AF,AF'
1BC3 E1       POP HL
1BC4 D1       POP DE
1BC5 C1       POP BC
1BC6 F1       POP AF
1BC7 FDE1     POP IY
1BC9 DDE1     POP IX
1BCB ED7B99F0 LD SP,(SPBF)
1BCF F5       PUSH AF
1BD0 3AE6FE   LD A,(EIMK)
1BD3 B7       OR A
1BD4 CAD81B   JP Z,RET22
1BD7 FB       EI
1BD8 F1       RET22:POP AF
1BD9 228CF0   LD (HLBF1),HL   
1BDC 2A9BF0   LD HL,(PCL)   
1BDF E5       PUSH HL
1BE0 2A8CF0   LD HL,(HLBF1)   
1BE3 C9       RET
              ;;;

ここではブレーク処理で行なったのとまったく逆のことを、POP命令を使って行ないます。
こうすることで、フラグを変化させることなく効率良く、各レジスタに値を戻すことができます。
そのあとSP(スタックポインタ)に、保存しておいたSPの値を戻します。
その後のところでEIの処理をしていますが、ここも一般的な処理ではありません。
ここは無視してください。

最後にブレークしたときに保存した、ブレークからリターンしたときに、次に実行するアドレス(実はブレークアドレスのこと)をスタックのトップに置きます。
ここではそれをHLレジスタを使って行なっています。
そして最後にRETを実行すると、スタックのトップに置いたブレークアドレスがPCに入るので、そこからユーザープログラムの実行が再開されます。

ワンボードマイコンでCP/Mを![第185回]
2012.7.30upload

前へ
次へ
ホームページトップへ戻る