復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第385回]
●ZドライブのMBASICでファイルのSAVEを!
人間の慾にはきりが無いのでありまして、ここまで出来ると次はそこまで、という具合に際限がありません。
いい加減にしておかねばなりませぬ。
が、しかし。
前回まさかZドライブでMBASICが動くところまで出来るとは思っておりませんでしたが、それが動いてさらにMBASICでプログラムの作成や実行まで出来てしまったということになりますと。
やっぱりBASICプログラムのSAVE、LOADもできないものか、試してみたくなります。
あ。
CP/M互換DOSの機能といたしましては、これは全く余計な機能でありまして、ここまでできる必要は本来は無いものなのです。
純粋のCP/M互換DOSの機能としましては仮想FDDのA〜Dドライブを使うというのが当初からの設計思想でありまして、Zドライブといいますのは、あくまでWindowsとCP/M互換DOSとの間でファイルの受け渡しをするためのバッファのようなものです。
そういう当初の設計思想からしますとZドライブの上でプログラムを実行するといいますのは、言うなれば邪道ということになります。
まあ、しかし。
ここまで来てしまいますと。
当初の設計思想がどうあれ、また邪道であろうとなかろうと。
できるようにしてみたくなってしまうのであります。
困ったものでありますなあ。まったく。
で。
前回MBASIC上で作成して実行してみましたプログラムをSAVEしてみました。
プログラムの実行まではできても、Zドライブに対してファイルのSAVEまでは無理だろうと思っておりましたので、そのところの画像は保存しませんでした。
ですのでログファイルをお見せすることにいたします。
list 10 FOR A=0 TO 10 20 PRINT "a=";A,"sqrt(a)=";SQR(A) 30 NEXT A Ok run a= 0 sqrt(a)= 0 a= 1 sqrt(a)= 1 a= 2 sqrt(a)= 1.41421 a= 3 sqrt(a)= 1.73205 a= 4 sqrt(a)= 2 a= 5 sqrt(a)= 2.23607 a= 6 sqrt(a)= 2.44949 a= 7 sqrt(a)= 2.64575 a= 8 sqrt(a)= 2.82843 a= 9 sqrt(a)= 3 a= 10 sqrt(a)= 3.16228 Ok save "SQRTEST" Ok dir Syntax error Ok system Z>dir Z: VFTST92 COM : VFTST9 COM : VFTST0 COM : VFTST25 COM Z: VFTST24 COM : VFTST6-2 COM : VFTST205 COM : VFTST204 COM Z: VFTST22 COM : VFTST21 COM : VFTST203 COM : VFTST202 COM Z: VFTST107 COM : VFTST17 COM : VFTST14 COM : VFTST16 COM Z: VFTST15 COM : VFTST19 COM : VFTST18 COM : VFTST13 COM Z: VFTST12 COM : VFTST11 COM : VFTST105 COM : VFTST102 COM Z: VFTST10 COM : VFTST8 COM : VFTST7 COM : VFTST6 COM Z: VFTST4 COM : VFTST2 COM : VFTST5 COM : VFTST1 COM Z: VFTEST1 COM : MBASIC COM : VFTST23 COM : STRTRK2 BAS Z: SQRTEST BAS Z> |
logfile nd80zlog\05010557.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/cpm loading zbds3d.bin ...19d1(6609)bytes loaded,from CC00 to E5D0 drive D ................................ drive C ................................ drive B ................................ drive A ................................ A>zb3 end of ZBDOS >bp cc03 >jp e248 |
drive D ................................ drive C ................................ drive B ................................ drive A ................................ A>z: Z>dir Z: VFTST92 COM : VFTST9 COM : VFTST0 COM : VFTST25 COM Z: VFTST24 COM : VFTST6-2 COM : VFTST205 COM : VFTST204 COM Z: VFTST22 COM : VFTST21 COM : VFTST203 COM : VFTST202 COM Z: VFTST107 COM : VFTST17 COM : VFTST14 COM : VFTST16 COM Z: VFTST15 COM : VFTST19 COM : VFTST18 COM : VFTST13 COM Z: VFTST12 COM : VFTST11 COM : VFTST105 COM : VFTST102 COM Z: VFTST10 COM : VFTST8 COM : VFTST7 COM : VFTST6 COM Z: VFTST4 COM : VFTST2 COM : VFTST5 COM : VFTST1 COM Z: VFTEST1 COM : MBASIC COM : VFTST23 COM : STRTRK2 BAS Z: SQRTEST BAS Z>mbasic A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 194A 0003 E107 E88E 0000 0000 0000 0000 CC03 F7FE 0000 0000 FF 01001010 >bp@d7c5 >rt@ |
; ;DISK FILE OPEN FCALL 0F ; D7C5 CD4AD8 OPEN:CALL SRCHFST D7C8 FEFF CP FF D7CA C8 RET Z D7CB E5 PUSH HL D7CC 010C00 LD BC,$000C D7CF 09 ADD HL,BC D7D0 7E LD A,(HL);extent No. D7D1 E1 POP HL D7D2 B7 OR A D7D3 CAEAD7 JP Z,OPEN2 D7D6 CDC3D8 CALL SRCHNXT D7D9 FEFF CP FF D7DB C8 RET Z D7DC E5 PUSH HL D7DD 010C00 LD BC,$000C |
BASIC-80 Rev. 5.21 [CP/M Version] Copyright 1977-1981 (C) by Microsoft Created: 28-Jul-81 28728 Bytes free Ok load "SQRTEST" A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC C580 D4A4 5D8B D7C5 0000 0000 0000 0000 D7C5 E0FC 0000 0000 FF 10000000 |
狙った通りにファイルOPENのところ(アドレスD7C5)でブレークしました。
さて。
ここを手がかりにして、MBASICに突入します。
MBASICの「侵入経路」を調べます。
どうやって?
CP/M互換DOSのファンクションコールは、呼ばれたときにスタックをユーザースタックからシステムスタックに切り換えます。
そのときにSPの値をシステムのワークエリアに保存します。
その値を確認するのです。
>cm e004 E004 F6- E005 D3- >dm d3f0,d3ff D3F0 AB 5D 8B 5D 00 5D 74 59-8A 5D 62 01 A0 52 44 00 ォ].].]tY.]b.RD. |
>bp@5987 >rt@ A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0162 0600 5D8A 5D97 0000 0000 0000 0000 5987 D3FC 0000 0000 FF 01100010 >bp@598d >rt@ A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0148 0600 5D8A 5DAF 0000 0000 0000 0000 598D D3FA 0000 0000 FF 01001000 >bp@5999 >rt@ A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0193 0600 5D8A 5D8A 0000 0000 0000 0000 5999 D3FC 0000 0000 FF 10010011 >bp@577a >rt@ A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0142 0600 5D8A 5D8A 0000 0000 0000 0000 577A D3FA 0000 0000 FF 01000010 >dm@5d80,5d9f 5D80 9F 0A 7E B7 C2 9A 52 C3-87 0D 01 00 53 51 52 54 ..~キツ.Rテ....SQRT 5D90 45 53 54 20 42 41 53 00-00 00 00 00 00 00 00 00 EST BAS......... >bp@57bb >rt@ A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0148 001A 5DB3 5D8B 0000 0000 0000 0000 57BB D3EE 0000 0000 FF 01001000 >bp@579f >rt@ A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 2144 0000 5D8B 5E32 0000 0000 0000 0000 579F D3F6 0000 0000 FF 01000100 > |