標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第241回]

●HTML便利なタグを教えていただきました

[第236回]で「つくるCPU版TK80モニタプログラムリスト」を紹介しました。
リストをそのままHTMLに張りつけると半角英数書式無しのプレーンテキストなのに、そのまま素直には表示してくれません。
これには以前から不満で、それでjpgにして表示しました。

そうしたら、それを読まれた方からメールをいただきました。

<pre><code>〜</code></pre>を使ってみたら?

あー、こんな便利なタグがあったのですね。不勉強で全く知りませんでした。
ホームページ・ビルダーが余りに簡便なので、ついHTMLの存在を忘れてしまいます(もっとも、ときどき融通の利かないことがあって、そういうときだけ、HTMLをさわったりはするのですけれど…)。

FY様、ご親切に教えていただき、有難うございました。
さっそく使ってみます。

いやあ。これは、嬉しいです。
あ。喜んでばかりはいられません。注意する点がありそうです。
本文の中にHTMLタグと同じ並びがあると、それは認識してしまうようです(当たり前か)。その場合には<>を&lt;&gt;に置き換える必要があるようです。

●最新版「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

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