標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第241回]
●HTML便利なタグを教えていただきました
[第236回]で「つくるCPU版TK80モニタプログラムリスト」を紹介しました。
リストをそのままHTMLに張りつけると半角英数書式無しのプレーンテキストなのに、そのまま素直には表示してくれません。
これには以前から不満で、それでjpgにして表示しました。
そうしたら、それを読まれた方からメールをいただきました。
<pre><code>〜</code></pre>を使ってみたら?
あー、こんな便利なタグがあったのですね。不勉強で全く知りませんでした。
ホームページ・ビルダーが余りに簡便なので、ついHTMLの存在を忘れてしまいます(もっとも、ときどき融通の利かないことがあって、そういうときだけ、HTMLをさわったりはするのですけれど…)。
FY様、ご親切に教えていただき、有難うございました。
さっそく使ってみます。
いやあ。これは、嬉しいです。
あ。喜んでばかりはいられません。注意する点がありそうです。
本文の中にHTMLタグと同じ並びがあると、それは認識してしまうようです(当たり前か)。その場合には<>を<>に置き換える必要があるようです。
●最新版「TK80モニタプログラムリスト」です
というわけで、せっかく便利なタグを教えていただきましたので、さっそく使ってみました。
最新版のモニタプログラムリストです(<>は使っていませんから、大丈夫です)。
2009/6/5 17:51 TK80MON4.TXT
END=02F3
;;; TK80 MONITOR PROGRAM FOR MC80
; 09/5/28 09/6/1 6/3 6/5
;
ORG $0000
;
USRSP=$FFC7
;
MONSP=$FFD1
RST2=$FFD1
RST3=$FFD4
RST4=$FFD7
RST5=$FFDA
RST6=$FFDD
PSAVE=$FFE0
SSAVE=$FFE2
LSAVE=$FFE4
HSAVE=$FFE5
ESAVE=$FFE6
DSAVE=$FFE7
CSAVE=$FFE8
BSAVE=$FFE9
FSAVE=$FFEA
DATA=$FFEC
DATA1=$FFED
ADRES=$FFEE
ADRES1=$FFEF
BRKAD=$FFF0
BRKCT=$FFF2
KFLAG=$FFF3
DISP=$FFF4
DIG=$FFF8
;
0000 C33B00 JMP MONST
;
ORG $0008
0008 C35100 JMP START
;
ORG $0010
0010 C3D1FF JMP RST2
;
ORG $0018
0018 C3D4FF JMP RST3
;
ORG $0020
0020 C3D7FF JMP RST4
;
ORG $0028
0028 C3DAFF JMP RST5
;
ORG $0030
0030 C3DDFF JMP RST6
;
ORG $0038
0038 C35101 JMP BRENT
;
; INITIALIZE ROUTINE
;
003B 21ECFF MONST:LXI H,DATA
003E 060C MVI B,0C
0040 AF XRA A
0041 77 MONST2:MOV M,A
0042 23 INX H
0043 05 DCR B
0044 C24100 JNZ MONST2
0047 21C7FF LXI H,USRSP
004A 22E2FF SHLD SSAVE
004D C35100 JMP START
0050 00 NOP
;
; MONITOR START
;
0051 3EF7 START:MVI A,F7
0053 D398 OUT 98;PIC reset
0055 31D1FF LXI SP,MONSP
0058 CDC001 CALL SEGCG
005B CD1602 CALL KEYIN
005E 47 MOV B,A
005F E610 ANI 10
0061 CA8400 JZ DIGIT
0064 78 MOV A,B
0065 E60F ANI 0F
0067 0600 MVI B,00
0069 87 ADD A
006A 4F MOV C,A
006B 217400 LXI H,TABL
006E 09 DAD B
006F 7E MOV A,M
0070 23 INX H
0071 66 MOV H,M
0072 6F MOV L,A
0073 E9 PCHL
;
0074 CC00 TABL:DW GOTO
0076 F901 DW RESRG
0078 9400 DW ADSET
007A B800 DW ADDCX
007C 9D00 DW ADINX
007E C200 DW MEMW
0080 D500 DW SDATA
0082 0701 DW LDATA
;
0084 CDB501 DIGIT:CALL SHIFT
0087 3AECFF LDA DATA
008A B0 ORA B
008B 32ECFF STA DATA
008E CDA101 CALL RGDSP
0091 C35100 JMP START
;
; ADDRESS SET
;
0094 2AECFF ADSET:LHLD DATA
0097 22EEFF SHLD ADRES
009A C3A100 JMP ADINX2
;
; MEMORY READ & ADDRESS INCREMENT
;
009D 2AEEFF ADINX:LHLD ADRES
00A0 23 INX H
00A1 CDAD00 ADINX2:CALL MEMR
00A4 22EEFF ADSTR:SHLD ADRES
00A7 CDA101 CALL RGDSP
00AA C35100 JMP START
;
00AD 3AECFF MEMR:LDA DATA
00B0 32EDFF STA DATA1
00B3 7E MOV A,M
00B4 32ECFF STA DATA
00B7 C9 RET
;
; MEMORY READ & ADDRESS DECREMENT
;
00B8 2AEEFF ADDCX:LHLD ADRES
00BB 2B DCX H
00BC CDAD00 CALL MEMR
00BF C3A400 JMP ADSTR
;
; MEMORY WRITE
;
00C2 2AEEFF MEMW:LHLD ADRES
00C5 3AECFF LDA DATA
00C8 77 MOV M,A
00C9 C39D00 JMP ADINX
;
; MONITOR TO USER CONTROL ROUTINE
;
00CC 2AEEFF GOTO:LHLD ADRES
00CF 22E0FF SHLD PSAVE
00D2 C3F901 JMP RESRG
;
; STORE DATA
;
00D5 2AECFF SDATA:LHLD DATA
00D8 EB XCHG
00D9 2AEEFF LHLD ADRES
00DC 3EFB MVI A,FB;PIC active & I/O ADDRESS 94 "out"
00DE D398 OUT 98
00E0 7C MOV A,H
00E1 CD7C02 CALL SOUT
00E4 7D MOV A,L
00E5 CD7C02 CALL SOUT
00E8 7A MOV A,D
00E9 CD7C02 CALL SOUT
00EC 7B MOV A,E
00ED CD7C02 CALL SOUT
00F0 2B DCX H
00F1 23 SDATA2:INX H
00F2 7E MOV A,M
00F3 CD7C02 CALL SOUT
00F6 7D MOV A,L
00F7 BB CMP E
00F8 C2F100 JNZ SDATA2
00FB 7C MOV A,H
00FC BA CMP D
00FD C2F100 JNZ SDATA2
0100 CDB302 CALL SOUTEND
0103 C35100 JMP START
0106 00 NOP
;
;LOAD DATA
;
0107 3EFF LDATA:MVI A,FF;PIC active
0109 D398 OUT 98
010B CDA002 CALL SIN
010E 67 MOV H,A
010F CDA002 CALL SIN
0112 6F MOV L,A
0113 CDA002 CALL SIN
0116 57 MOV D,A
0117 CDA002 CALL SIN
011A 5F MOV E,A
011B 22EEFF SHLD ADRES
011E EB XCHG
011F 22ECFF SHLD DATA
0122 EB XCHG
0123 2B DCX H
0124 23 LDATA2:INX H
0125 CDA002 CALL SIN
0128 77 MOV M,A
0129 7D MOV A,L
012A BB CMP E
012B C22401 JNZ LDATA2
012E 7C MOV A,H
012F BA CMP D
0130 C22401 JNZ LDATA2
0133 CDA101 CALL RGDSP
0136 C35100 JMP START
;
; BREAK ENTRY
; BREAK & ONE STEP OPERATION
;
ORG $0151
;
0151 E3 BRENT:XTHL
0152 22E0FF SHLD PSAVE
0155 F5 PUSH PSW
0156 210400 LXI H,$0004
0159 39 DAD SP
015A F1 POP PSW
015B 22E2FF SHLD SSAVE
015E E1 POP H
015F 31ECFF LXI SP,DATA
0162 F5 PUSH PSW
0163 C5 PUSH B
0164 D5 PUSH D
0165 E5 PUSH H
0166 31D1FF LXI SP,MONSP
0169 3AF2FF LDA BRKCT
016C A7 ANA A
016D CA8B01 JZ BSTOP
0170 2AF0FF LHLD BRKAD
0173 EB XCHG
0174 2AE0FF LHLD PSAVE
0177 7D MOV A,L
0178 BB CMP E
0179 C28501 JNZ NOBRK
017C 7C MOV A,H
017D BA CMP D
017E C28501 JNZ NOBRK
0181 21F2FF LXI H,BRKCT
0184 35 DCR M
0185 CD9101 NOBRK:CALL ADDSP
0188 C3F901 JMP RESRG
018B CD9101 BSTOP:CALL ADDSP
018E C35100 JMP START
0191 2AEAFF ADDSP:LHLD FSAVE
0194 22ECFF SHLD DATA
0197 2AE0FF LHLD PSAVE
019A 22EEFF SHLD ADRES
019D CDA101 CALL RGDSP
01A0 C9 RET
;
;
;;; SUBROUTINE
;
01A1 21EFFF RGDSP:LXI H,ADRES1
01A4 11F4FF LXI D,DISP
01A7 0604 MVI B,04
01A9 7E RGDSP2:MOV A,M
01AA 12 STAX D
01AB 2B DCX H
01AC 13 INX D
01AD 05 DCR B
01AE C2A901 JNZ RGDSP2
01B1 CDC001 CALL SEGCG
01B4 C9 RET
;
;DATA REG SHIFT(4 BITS)
;
01B5 2AECFF SHIFT:LHLD DATA
01B8 29 DAD H
01B9 29 DAD H
01BA 29 DAD H
01BB 29 DAD H
01BC 22ECFF SHLD DATA
01BF C9 RET
;
; SEGMENT CONVERT SUB
;
01C0 21F4FF SEGCG:LXI H,DISP
01C3 11F8FF LXI D,DIG
01C6 01E901 LXI B,SEGD
01C9 7E SEGCG2:MOV A,M
01CA 23 INX H
01CB E5 PUSH H
01CC F5 PUSH PSW
01CD E6F0 ANI F0
01CF 0F RRC
01D0 0F RRC
01D1 0F RRC
01D2 0F RRC
01D3 2600 MVI H,00
01D5 6F MOV L,A
01D6 09 DAD B
01D7 7E MOV A,M
01D8 12 STAX D
01D9 13 INX D
01DA F1 POP PSW
01DB E60F ANI 0F
01DD 2600 MVI H,00
01DF 6F MOV L,A
01E0 09 DAD B
01E1 7E MOV A,M
01E2 12 STAX D
01E3 E1 POP H
01E4 1C INR E
01E5 C2C901 JNZ SEGCG2
01E8 C9 RET
;
; SEGMENT DATA
;
01E9 5C SEGD:DB 5C
01EA 06 DB 06
01EB 5B DB 5B
01EC 4F DB 4F
01ED 66 DB 66
01EE 6D DB 6D
01EF 7D DB 7D
01F0 27 DB 27
01F1 7F DB 7F
01F2 6F DB 6F
01F3 77 DB 77
01F4 7C DB 7C
01F5 39 DB 39
01F6 5E DB 5E
01F7 79 DB 79
01F8 71 DB 71
;
; REGISTER RESTORE
;
01F9 2AE2FF RESRG:LHLD SSAVE
01FC F9 SPHL
01FD 2AE0FF LHLD PSAVE
0200 E5 PUSH H
0201 2AE4FF LHLD LSAVE
0204 E5 PUSH H
0205 2AEAFF LHLD FSAVE
0208 E5 PUSH H
0209 2AE8FF LHLD CSAVE
020C 4D MOV C,L
020D 44 MOV B,H
020E 2AE6FF LHLD ESAVE
0211 EB XCHG
0212 F1 POP PSW
0213 E1 POP H
0214 FB EI
0215 C9 RET
;
; KEY INPUT
;
0216 CD2302 KEYIN:CALL INPUT
0219 47 MOV B,A
021A 3AF3FF LDA KFLAG
021D A7 ANA A
021E CA1602 JZ KEYIN
0221 78 MOV A,B
0222 C9 RET
;
; KEY INPUT SUB
;
0223 CD4702 INPUT:CALL KEY
0226 3C INR A
0227 CA4202 JZ NOKEY
022A CDEA02 INPUT2:CALL D2
022D CD4702 CALL KEY
0230 47 MOV B,A
0231 3C INR A
0232 CA4202 JZ NOKEY
0235 3AF3FF LDA KFLAG
0238 A7 ANA A
0239 C22A02 JNZ INPUT2
023C 3D DCR A
023D 32F3FF INPUT3:STA KFLAG
0240 78 MOV A,B
0241 C9 RET
0242 06FF NOKEY:MVI B,FF
0244 C33D02 JMP INPUT3
;
; KEY SCAN & CONVERT HEX DATA SUB
;
0247 1600 KEY:MVI D,00
0249 42 MOV B,D
024A 3EFE MVI A,FE
024C D39C OUT 9C
024E DB9C IN 9C
0250 EEFF XRI FF
0252 C27102 JNZ KEYI
0255 0608 MVI B,08
0257 3EFD MVI A,FD
0259 D39C OUT 9C
025B DB9C IN 9C
025D EEFF XRI FF
025F C27102 JNZ KEYI
0262 0610 MVI B,10
0264 3EFB MVI A,FB
0266 D39C OUT 9C
0268 DB9C IN 9C
026A EEFF XRI FF
026C C27102 JNZ KEYI
026F 3D DCR A
0270 C9 RET
0271 0F KEYI:RRC
0272 DA7902 JC KEYI2
0275 14 INR D
0276 C37102 JMP KEYI
0279 7A KEYI2:MOV A,D
027A B0 ORA B
027B C9 RET
;
;SERIAL OUTPUT ROUTINE
;
027C 4F SOUT:MOV C,A
027D DB98 SOUT2:IN 98
027F E602 ANI 02
0281 CA7D02 JZ SOUT2
0284 79 MOV A,C
0285 D394 OUT 94
0287 3EF9 MVI A,F9; I/Oaddress 94 "out" & STROBE ON
0289 D398 OUT 98
028B DB98 SOUT3:IN 98
028D E602 ANI 02
028F C28B02 JNZ SOUT3
0292 3EFB MVI A,FB; I/Oaddress 94 "out" & STROBE OFF
0294 D398 OUT 98
0296 C9 RET
;
;SERIAL INPUT ROUTINE
;
ORG $02A0
;
02A0 DB98 SIN:IN 98
02A2 0F RRC
02A3 DAA002 JC SIN
02A6 3EFE MVI A,FE;BUSY
02A8 D398 OUT 98
02AA DB94 IN 94
02AC 4F MOV C,A
02AD 3EFF MVI A,FF;READY
02AF D398 OUT 98
02B1 79 MOV A,C
02B2 C9 RET
;
;0D0A OUT
;
02B3 DB98 SOUTEND:IN 98
02B5 E602 ANI 02
02B7 CAB302 JZ SOUTEND
02BA 3EFE MVI A,FE;DATA END
02BC D398 OUT 98
02BE DB98 SOUTEND2:IN 98
02C0 E602 ANI 02
02C2 C2BE02 JNZ SOUTEND2
02C5 3EFF MVI A,FF
02C7 D398 OUT 98
02C9 DB98 SOUTEND3:IN 98
02CB E602 ANI 02
02CD CAC902 JZ SOUTEND3
02D0 C3EA02 JMP D2
;
;CHATTERING TIMER
;
ORG $02DD
02DD 1624 D1:MVI D,24
02DF 1E0C D1_2:MVI E,0C
02E1 1D D1_3:DCR E
02E2 C2E102 JNZ D1_3
02E5 15 DCR D
02E6 C2DF02 JNZ D1_2
02E9 C9 RET
;
02EA 1648 D2:MVI D,48
02EC C3DF02 JMP D1_2
;
02EF 16D8 D3:MVI D,D8
02F1 C3DF02 JMP D1_2
;
ADDCX =00B8 ADDSP =0191 ADINX =009D
ADINX2 =00A1 ADRES =FFEE ADRES1 =FFEF
ADSET =0094 ADSTR =00A4 BRENT =0151
BRKAD =FFF0 BRKCT =FFF2 BSAVE =FFE9
BSTOP =018B CSAVE =FFE8 D1 =02DD
D1_2 =02DF D1_3 =02E1 D2 =02EA
D3 =02EF DATA =FFEC DATA1 =FFED
DIG =FFF8 DIGIT =0084 DISP =FFF4
DSAVE =FFE7 ESAVE =FFE6 FSAVE =FFEA
GOTO =00CC HSAVE =FFE5 INPUT =0223
INPUT2 =022A INPUT3 =023D KEY =0247
KEYI =0271 KEYI2 =0279 KEYIN =0216
KFLAG =FFF3 LDATA =0107 LDATA2 =0124
LSAVE =FFE4 MEMR =00AD MEMW =00C2
MONSP =FFD1 MONST =003B MONST2 =0041
NOBRK =0185 NOKEY =0242 PSAVE =FFE0
RESRG =01F9 RGDSP =01A1 RGDSP2 =01A9
RST2 =FFD1 RST3 =FFD4 RST4 =FFD7
RST5 =FFDA RST6 =FFDD SDATA =00D5
SDATA2 =00F1 SEGCG =01C0 SEGCG2 =01C9
SEGD =01E9 SHIFT =01B5 SIN =02A0
SOUT =027C SOUT2 =027D SOUT3 =028B
SOUTEND =02B3 SOUTEND2 =02BE SOUTEND3 =02C9
SSAVE =FFE2 START =0051 TABL =0074
USRSP =FFC7
[第236回]のリストでは空白だったSTORE DATA、LOAD DATAにもプログラムが入りました。
主要ルーチンのエントリアドレスやサブルーチンのアドレスもTK80オリジナルに合わせてあります。
LOAD DATAは[第189回]で作った、RS232C送信プログラム(w232.exe)を使って、パソコンからUSB経由で送信されてくるプログラム、データを受け取って、メモリに格納します。
STORE DATAはその逆の動作をします。
パソコン側のRS232C受信プログラムは、これもBorland C++で作ってしまいました(r232.exe)です。
「TK80」からSTORE DATAプログラムによって、USB経由で送信されたプログラム、データはASCIIヘキサ形式のファイル([第182回参照])として、パソコンのハードディスクに格納されます。
(ここは、素直に「お、お、おー」と、感動していただきたいところです)
もちろんうまく動作することは確認済みです。
このあたりについても、いずれご披露いたします。
●ステップ動作のためのサンプルプログラムです
さて、やっと前回の続きです。
今回、ステップ動作の説明のために用意したプログラムです。
ほんの短いプログラムですから、[ADRS SET]と[WRITE INCR]キーを使ってメモリに書き込んでいってもよいのですけれど、せっかく[LOAD DATA]キーも使えるようになったことですし、説明のために、8080アセンブラでオブジェクトプログラムも作成してしまったことですから、パソコンからw232c.exeで送信してしまいました。
2009/6/5 17:54 RETTEST.TXT
END=400B
;;; RET TEST
;;; 09/06/05
ORG $4000
;
MON=$003B
;
4000 3E20 MVI A,20
4002 0605 MVI B,05
4004 3C LOOP:INR A
4005 05 DCR B
4006 C20440 JNZ LOOP
4009 C33B00 JMP MON
;
LOOP =4004 MON =003B
プログラムは簡単なものです。
Aレジスタには20を入れ、Bレジスタには繰り返し回数の05を入れてスタートします。
Aレジスタを+1するとともに、Bレジスタを−1し、その動作を、Bレジスタが0になるまで(5回)繰り返します。最後にモニタプログラムに戻ります。
●[LOAD DATA]キー
[LOAD DATA]キー操作のためのプログラムは、モニタプログラムリストの0107から書いてあります。
LOADするファイルの先頭の4バイトが、そのプログラム(またはデータ)の書き込みを開始するアドレスと書き込みを終了するアドレスになっています。
ところで、[第182回]で、8080アセンブラを改良して、RS232C送信のために、ASCIIヘキサファイルを作成するようにしましたが、そのときに作ったファイルにはアドレス情報はありませんでした。
しかしTK80モニタプログラムでは、STORE DATA、LOAD DATAの仕組みとして、データブロックの先頭に開始アドレスと終了アドレスを置くようになっています。できるだけTK80モニタプログラムに忠実に、という趣旨からすると、ここはやっぱり、またまた8080アセンブラを直して、先頭にアドレス情報を入れるようにするしかありません(やれやれ)。
再び改良して先頭にアドレス情報が付加されるようになった、ASCIIヘキサファイル(RETTEST.HTX)の中身です。
4000400B3E2006053C05C20440C33B00
先頭にアドレス情報が入っています。開始アドレスが4000で終了アドレスが400Bです。
[LOAD DATA]キーを押しても、表示はとくに変わりませんが、受信スタンバイになります。
そこで、パソコン側でw232.exeを実行すると、受信したプログラム(データ)がアドレス情報で指定されたメモリエリアに書き込まれます。
写真は受信が完了した直後のLEDの表示です。
4006に見えますが、”6”ではなくて”b”です。
●[RUN]キー
ここで、[RUN]キーを押すと、LEDのアドレス表示部(左4桁)に表示されたアドレスからプログラムが実行されます。
プログラムは瞬時に実行されて、モニタプログラムに戻ってきたため、LEDの表示がオール0になりました。
でも、これでは速すぎて、何もわかりません。
●ステップ動作(RETキーの働き)
そこで、今度は同じプログラムをステップ動作させてみることにします。
ステップ動作はプログラムの命令を1命令だけ実行してモニタに戻るように動作します。
そういう機能を備えたCPUもありますが、8080にはステップ動作の機能はありません。
「つくるCPU」の本体の回路では、マシンクロックを停止させることで、マシンクロック毎のステップ動作を実現しています。
しかしTK80のステップ動作は、命令毎に、1命令だけ実行させることができます。
実はその動作のために「割込み」が使われているのです。
それもちょいと工夫した、特殊な割込み回路が使われています。
そのハード回路とプログラムの働きについては、後ほど説明することにします。
まずは、ステップ動作の様子を写真で見てみることにしましょう。
最初に、ステップモードにするため、「割込み回路」のスイッチをONにします。
回路の都合で、こんなに離れたところ、「TK80」の回路の反対側のデイップスイッチのたまたま空いていた1桁をステップモードスイッチとして利用しました。
この状態で、まず[4][0][0][0][ADRS SET]と操作します。
アドレス表示部に4000が表示されました。
最初だけは、[RUN]キーを押して、プログラムの実行を開始します。
先ほどの[RUN]とは違って、今回は「ステップモード」になっているため、最初の命令が実行されると、すぐにモニタプログラムに戻ってきます。LEDのアドレス表示部には次に実行するアドレスが表示されます。
データ表示部の左側2桁にはAレジスタの値が表示されます。
最初のMVI A,20が実行された結果が反映されています。
ここからは、[RUN]ではなくて、[RET]を使います。
[RET]を押しました。
アドレス4002のMVI B,05が実行されて、LEDには次のアドレス4004が表示されました。
データ表示部に表示されているAレジスタの値に変化はありません。
[RET]を押しました。
INR Aが実行されて、Aレジスタの値が21になりました。
アドレス表示部は4005になりました。
[RET]を押しました。
4005のDCR Bが実行され、アドレスの表示は次の4006になりました。
[RET]を押しました。
JNZ命令が実行されて、アドレスの表示は4004に戻りました。
[RET]を押しました。
INR Aが実行されてAレジスタの値が22になりました。
ステップ動作は、このように、その命令の長さに関係なく、1命令単位で実行されます。
RAMに書かれているプログラムに対してだけですが、このような動作を、ソフトウエアだけで実現させることもできないことはありませんが、大変なプログラムが必要になってしまいます。
割込みを使うことで、非常に簡単なプログラムだけで、このような不思議な動作をさせることができます。
[RET]キーを押したときに実行されるモニタプログラムはアドレス01F9から0215までの、たったそれだけのプログラムだけなのです(下にその部分だけを切り取って再掲します)。
;
; REGISTER RESTORE
;
01F9 2AE2FF RESRG:LHLD SSAVE
01FC F9 SPHL
01FD 2AE0FF LHLD PSAVE
0200 E5 PUSH H
0201 2AE4FF LHLD LSAVE
0204 E5 PUSH H
0205 2AEAFF LHLD FSAVE
0208 E5 PUSH H
0209 2AE8FF LHLD CSAVE
020C 4D MOV C,L
020D 44 MOV B,H
020E 2AE6FF LHLD ESAVE
0211 EB XCHG
0212 F1 POP PSW
0213 E1 POP H
0214 FB EI
0215 C9 RET
いや、いくらなんでも、これだけでステップ動作ができるわけがない、ということは容易に理解できますでしょう。
そうです。じつは[RET]キーは、メモリに一時的に退避させてあった、ユーザープログラムの実行途中における各レジスタの値をもとのレジスタに戻して、ユーザープログラムに戻るという機能しかないのです。
●割込みプログラム
ステップ動作の主役を演じているのは、「割込み」プログラムです。
ここに書かれています。
;
; BREAK ENTRY
; BREAK & ONE STEP OPERATION
;
ORG $0151
;
0151 E3 BRENT:XTHL
0152 22E0FF SHLD PSAVE
0155 F5 PUSH PSW
0156 210400 LXI H,$0004
0159 39 DAD SP
015A F1 POP PSW
015B 22E2FF SHLD SSAVE
015E E1 POP H
015F 31ECFF LXI SP,DATA
0162 F5 PUSH PSW
0163 C5 PUSH B
0164 D5 PUSH D
0165 E5 PUSH H
0166 31D1FF LXI SP,MONSP
0169 3AF2FF LDA BRKCT
016C A7 ANA A
016D CA8B01 JZ BSTOP
0170 2AF0FF LHLD BRKAD
0173 EB XCHG
0174 2AE0FF LHLD PSAVE
0177 7D MOV A,L
0178 BB CMP E
0179 C28501 JNZ NOBRK
017C 7C MOV A,H
017D BA CMP D
017E C28501 JNZ NOBRK
0181 21F2FF LXI H,BRKCT
0184 35 DCR M
0185 CD9101 NOBRK:CALL ADDSP
0188 C3F901 JMP RESRG
018B CD9101 BSTOP:CALL ADDSP
018E C35100 JMP START
0191 2AEAFF ADDSP:LHLD FSAVE
0194 22ECFF SHLD DATA
0197 2AE0FF LHLD PSAVE
019A 22EEFF SHLD ADRES
019D CDA101 CALL RGDSP
01A0 C9 RET
ちょっと難しいプログラムですが、それにしても、「割込み」を利用すると、こんな不思議な動作をさせることもできるのだ、ということは、合点いただけましたでしょうか。
というところで、タイムアウトになってしまいました。
この続きはまた次回にすることにいたします。
2009.6.5upload
前へ
次へ
ホームページトップへ戻る