MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第90回]
●エラーの原因は/LDプログラムにありました
前回書きましたように、/LDを実行すると受信エラーになるのですが、CPMにエントリした後にMBASIC.COMのロードやSTARTREK.BASのロードでは受信エラーが発生しないことから、/LDに問題があるらしいと目星はつけたのですけれど、一体そのどこに原因があるのかということを明らかにしなければ、このまま19200bpsを使うというわけにはいきません。
実は受信エラーはロードのためのアドレス情報を読んだあと、続くデータの最初の1バイトを読んだ後で発生していました。
受信エラーが発生するとLEDが点灯することでわかるのですが、そのときMYCPU80のHLレジスタの表示がロード先メモリアドレス+1を示していることからそれがわかりました。
繰り返し試してみて必ずそうなることが特徴的でした。
おそらくはオーバーランエラーだろうと目星をつけて、/LDプログラムの受信サイクル時間を調べてみることにしました。
下はMYCPU80に移植したZB3BASICの/LDプログラムから関係する部分を抜き出して、そこに命令の実行クロックを追記したものです。
;;; LD
1C95 13 LD:INX D
1C96 CD5110 CALL ADRD
1C99 CDAE10 LD2:CALL SIN 18+168=186
1C9C CDF61C CALL MEMWR2;********14.12.26 18+54=72
1C9F 23 INX H 12 or 8
1CA0 CD2710 CALL HDCMP 18+56=74
1CA3 CA991C JZ LD2 8
1CA6 DA991C JC LD2 12 ________186+72+12+74+8+12=364clk*0.5us=182us
1CA9 C3A318 JMP ENTRY
;
;
1CF6 F5 MEMWR2:PUSH PSW 8
1CF7 7C MOV A,H 6
1CF8 B7 ORA A 10
1CF9 F23FE2 JP RAMWR 8
1CFC F1 POP PSW 8
1CFD 77 MOV M,A 6
1CFE C9 RET 8 8+6+10+8+8+6+8=54
;
10AE C34E11 JMP SIN 12+8+6+6+8+100+10+8+8=168
;
114E C5 SIN:PUSH B 8
114F 3EFF MVI A,FF 6
1151 47 MOV B,A 6
1152 D398 OUT 98 8
1154 CDA002 CALL SINSB 18+82=100
1157 B7 ORA A 10
1158 C1 POP B 8
1159 C9 RET 8
;;;
;
02A0 DB98 SIN:IN 98 8
02A2 0F RRC 10
02A3 DAA002 JC SIN 8
02A6 3EFE MVI A,FE;BUSY 6
02A8 D398 OUT 98 8
02AA DB94 IN 94 8
02AC 4F MOV C,A 6
02AD 3EFF MVI A,FF;READY 6
02AF D398 OUT 98 8
02B1 79 MOV A,C 6
02B2 C9 RET 8 8+10+8+6+8+8+6+6+8+6+8=82
;
1027 C39511 HDCMP:JMP HDCP 12+6+10+4+6+10+8=56
;
;;;HL-DE COMP
1195 7C HDCP:MOV A,H 6
1196 BA CMP D 10
1197 C0 RNZ 4
1198 7D MOV A,L 6
1199 BB CMP E 10
119A C9 RET 8
;;;
|
1C96 CD5110 CALL ADRD
;
1051 C33B12 ADRD:JMP ADRD1 12+2046=2058clk*0.5us=1.029ms
;
;;;ADDRESS READ
123B CD4510 ADRD1:CALL ASHX4 18+930=948
123E DA8B16 JC WHAT 4
1241 13 INX D 12 or 8
1242 E5 PUSH H 8
1243 CD4510 CALL ASHX4 18+930=948
1246 DA8B16 JC WHAT 4
1249 42 MOV B,D 6
124A 4B MOV C,E 6
124B D1 POP D 8
124C CD2710 CALL HDCMP 18+56=74
124F DA7F16 JC HOWDP 4
1252 EB XCHG 16
1253 C9 RET 8 948+4+12+8+948+4+6+6+8+74+4+16+8=2046
;;;
1045 C30B12 ASHX4:JMP AHX4 12+918=930
;
;;;ASCII TO HEX
11E2 D630 AHX1:SUI 30 10
11E4 D8 RC 4
11E5 FE0A CPI 0A 10
11E7 3F CMC 6
11E8 D0 RNC 4
11E9 FE31 CPI 31 10
11EB DAF011 JC AHX12 12 or 8
11EE D620 SUI 20 10
11F0 FE11 AHX12:CPI 11 10
11F2 D8 RC 4
11F3 FE17 CPI 17 10
11F5 3F CMC 6
11F6 D8 RC 4
11F7 D607 SUI 07 10
11F9 C9 RET 8 10+4+10+6+4+10+8+10+10+4+10+6+4+10+8=114
;
11FA 7C AHX2:MOV A,H 6
11FB CDE211 CALL AHX1 18+114=132
11FE D8 RC 4
11FF 07 RLC 10
1200 07 RLC 10
1201 07 RLC 10
1202 07 RLC 10
1203 67 MOV H,A 6
1204 7D MOV A,L 6
1205 CDE211 CALL AHX1 18+114=132
1208 D8 RC 4
1209 B4 ORA H 10
120A C9 RET 8 6+132+4+10+10+10+10+6+6+132+4+10+8=348
;
120B CD1712 AHX4:CALL AHXS 18+424=442
120E D8 RC 4
120F 47 MOV B,A 6
1210 CD1712 ASH22:CALL AHXS 18+424=442
1213 D8 RC 4
1214 6F MOV L,A 6
1215 60 MOV H,B 6
1216 C9 RET 8 442+4+6+442+4+6+6+8=918
;
1217 EB AHXS:XCHG 16
1218 56 MOV D,M 6
1219 23 INX H 12 or 8
121A 5E MOV E,M 6
121B 23 INX H 12 or 8
121C EB XCHG 16
121D C3FA11 JMP AHX2 12+348=360,,16+6+12+6+8+16+360=424
;;;
|
if(m==4){
strout("JP 1848 ",0);
xb=x+rfsize-1;
adout(x);
strcat(outbf,",\0");
adout(xb);
dhlout(0x0d);
dhlout(0x0a);
//if(!hidwrite())break;
if(!write()){close();break;}
}
else{
strout("JP 0033\n",0);
if(!write()){close();break;}
}
prints("sleep,,,");//test
Sleep(1000);
prints("sleep end");//test
i=0;
while(1){
|
logfile mycpu80log\12291722.txt open mzbdos3L 2014.12.29 by Chunichidenko MYCPU80に接続しました(19200bps) 0001 001E - z 1000 00C3 - *** mycpu80 zb3basic **** >/ld mtkmon3.btk,8ffc loading MTKMON3.BTK ...sleep,,,sleep end02f8(760)bytes loaded,from 8FFC to 92F3 >/exit 0000 00C3 - リモート接続を終了しました logfile closed at Mon Dec 29 22:39:51 2014 |