2020年5月16日土曜日

FM-7用 58K CP/M-80が一応出来上がりました

RAMモードで動作する58K CP/M-80が一応出来上がりました


Z80カードを製作した勢いでつい手をだしてしまって、もっと簡単にできると思ったのに意外に手間取ってしまい、一ヶ月ほどもかかってしまいましたが、FM-7用のCP/Mが一応できあがりました。
まだまだ直すべき箇所が多々ありますので完成とは言いすぎですが、切りがないので一応の区切りとします。

実行画面


仮想ドライブ画面



装置全景(左がFM-7用のディスプレイ)



メモリマップ


前回のブログで紹介したのはROMモードで$0000~$7FFFの範囲で動作する26K CP/Mでしたが、BIOSを使用せずSubSystemを使用することで、下図のメモリマップのように$0000~$EFFFの範囲で動作する58K CP/Mとなりました。



  58K CP/M-80



3つのファイルから構成されています。


(1)CP/M本体
  サイト「The Unofficial CP/M Web site」中のソース cpm22.z80 を使用しました。
  中日電工さんのサイトに説明されている通りにソースのバグを修正し、ドライブ名の表示を大文字に変更しただけで、あとはオリジナル通りです。58K CP/Mとしてアセンブルしました。
(2)BIOS80
  BIOSのZ80部分で、BIOSのジャンプテーブル、DISKパラメータの他はほぼパラメータをセットしてコマンド番号を6809に送っているだけです。
(3)BIOS09
  BIOSの6809部分で、FM-7のBIOSは用いず、FDD関係はFDC (MB8877A) を直接コントロールし、それ以外はSubSystemを使用しています。


CP/Mとしての機能


CP/Mとしての機能はベーシックなもので、エスケープシーケンスなども実装していませんが、仮想ドライブは実装してありますので、フロッピーが2台、仮想ドライブが2台の計4台です。
ドライブA, Bがフロッピー、C, DがWindows上の仮想ドライブです。以前紹介したRS232Cカードを用いて38400baudで通信しています。



構成図

RS232Cのドライバも実装しているのでPUNCHとREADERも使えるのですが、実際にはまず使用することはなく、もっぱらWindows上のエディタでファイルを作成し、ドライブCかDにセットしたCP/Mのイメージファイル(.77または.DSK形式)にドラッグ&ドロップしてCP/Mでアセンブルしたり、必要があればフロッピーにコピーしたりして使用しています。


機能不足や不具合など


相変わらずブロッキング/デブロッキング機能は実装していませんので、ディスクアクセスは速くはありませんが、そのうちにということで今回はパス。(そもそもブロッキング/デブロッキングについては良く分かっていないので。)

現在分かっている不具合がいくつかあります。
(1)カーソルが表示されない。
  もちろん、SubSystemのCONSOLE CONTROLでカーソル表示をONにしていますが、6809側では表示されますが、Z80側に切り替わるとカーソルが消えます。
今のところ原因が分からず、直せていないので結構不便です。

(2)スタート時にドライブを指定する必要がある。
  スタート直後にディレクトリを表示させると、DIRやDIR A:は表示されるのですが、DIR B:などはダメです。最初にドライブチェンジのB:やC:などを一回実行しておけば以降は普通に表示できるのですが、なぜでしょうか。BIOSがおかしいのは間違いないのですが。


制作した2つのソフト


下にBIOS80とBIOS09を置いておきます。80系の知識がほとんどない私が作ったものなのでおかしな点が多々あるかと思いますが、おかしな箇所や不具合の原因などをご指摘いただけるとありがたいです。

◎BIOS80です。中日電工さんのブログで紹介されているZASM1.64でアセンブルしています。

  1. Z80 ASSEMBLER - ZASM VER 1.6
  2. ;
  3. ; BIOS80 for FM-7 CP/M-80 60K SYSTEM
  4. ;
  5. ;*************** BIOS DATA AREA ******************************
  6. ;
  7. E500 DIRBF EQU 0E500H ;128bytes
  8. ;
  9. E580 CSV00 EQU 0E580H ;32bytes
  10. E5A0 ALV00 EQU 0E5A0H ;19bytes
  11. E5B3 CSV01 EQU 0E5B3H ;32bytes
  12. E5D3 ALV01 EQU 0E5D3H ;19bytes
  13. E5E6 CSV02 EQU 0E5E6H ;32bytes
  14. E606 ALV02 EQU 0E606H ;19bytes
  15. E619 CSV03 EQU 0E619H ;32bytes
  16. E639 ALV03 EQU 0E639H ;19bytes (-0E64Ch)
  17. ;
  18. E650 TRKADRS EQU 0E650H
  19. E652 SCTADRS EQU 0E652H
  20. E654 DMAADRS EQU 0E654H
  21. E656 DRVNO EQU 0E656H
  22. E658 CMDNO EQU 0E658H ;command no
  23. E659 PTO09 EQU 0E659H ;parameter to 6809 from Z80
  24. E65B PTOZ80 EQU 0E65BH ;parameter to Z80 from 6809
  25. E65D RSIN EQU 0E65DH
  26. E65F RSOUT EQU 0E65FH
  27. E661 KCSAVE EQU 0E661H ;for keycode save
  28. E662 CONSTDT EQU 0E662H
  29. ;
  30. 0000 REENT: EQU 0
  31. 0003 IOBYTE: EQU 3
  32. 0004 TDRIVE: EQU 4
  33. D406 FBASE: EQU 0D406H
  34. CC00 CBASE: EQU 0CC00H
  35. CC06 INBUFF: EQU 0CC06H
  36. D70E CHARBUF:EQU 0D70EH
  37. ;
  38. E200 ORG 0E200H
  39. ;
  40. ;**************************************************************
  41. ;*
  42. ;* B I O S J U M P T A B L E
  43. ;*
  44. ;**************************************************************
  45. ;
  46. E200 C3AFE2 BOOT: JP BOOTJ
  47. E203 C3B7E2 WBOOT: JP WBOOTJ
  48. E206 C3DFE2 CONST: JP CONSTJ
  49. E209 C3EBE2 CONIN: JP CONINJ
  50. E20C C3F7E2 CONOUT: JP CONOUTJ
  51. E20F C30CE3 LIST: JP LISTJ
  52. E212 C30DE3 PUNCH: JP PUNCHJ
  53. E215 C31AE3 READER: JP READERJ
  54. E218 C326E3 HOME: JP HOMEJ
  55. E21B C335E3 SELDSK: JP SELDSKJ
  56. E21E C351E3 SETTRK: JP SETTRKJ
  57. E221 C35EE3 SETSEC: JP SETSECJ
  58. E224 C36BE3 SETDMA: JP SETDMAJ
  59. E227 C372E3 READ: JP READJ
  60. E22A C37EE3 WRITE: JP WRITEJ
  61. E22D C38AE3 PRSTAT: JP PRSTATJ
  62. E230 C38BE3 SECTRN: JP SECTRNJ
  63. ;
  64. ; DISK PARAMETER BASE
  65. ;
  66. E233 DPBASE:
  67. ;
  68. ;drive No.0 (a drive)
  69. E233 0000 DEFW 0 ;XLATE
  70. E235 0000 DEFW 0 ;scratch1
  71. E237 0000 DEFW 0 ;scratch2
  72. E239 0000 DEFW 0 ;scratch3
  73. E23B 00E5 DEFW DIRBF ;address of dirbf.
  74. E23D 73E2 DEFW DPTOP ;address of disk parameter block.
  75. E23F 80E5 DEFW CSV00 ;address of check vector.
  76. E241 A0E5 DEFW ALV00 ;address of allocation vector (bit map).
  77. ;
  78. ;drive No.1 (b drive)
  79. E243 0000 DEFW 0 ;XLATE
  80. E245 0000 DEFW 0 ;scratch1
  81. E247 0000 DEFW 0 ;scratch2
  82. E249 0000 DEFW 0 ;scratch3
  83. E24B 00E5 DEFW DIRBF ;address of dirbf.
  84. E24D 73E2 DEFW DPTOP ;address of disk parameter block.
  85. E24F B3E5 DEFW CSV01 ;address of check vector.
  86. E251 D3E5 DEFW ALV01 ;address of allocation vector (bit map).
  87. ;
  88. ;drive No.2 (c drive)
  89. E253 0000 DEFW 0 ;XLATE
  90. E255 0000 DEFW 0 ;scratch1
  91. E257 0000 DEFW 0 ;scratch2
  92. E259 0000 DEFW 0 ;scratch3
  93. E25B 00E5 DEFW DIRBF ;address of dirbf.
  94. E25D 73E2 DEFW DPTOP ;address of disk parameter block.
  95. E25F E6E5 DEFW CSV02 ;address of check vector.
  96. E261 06E6 DEFW ALV02 ;address of allocation vector (bit map).
  97. ;
  98. ;drive No.3 (d drive)
  99. E263 0000 DEFW 0 ;XLATE
  100. E265 0000 DEFW 0 ;scratch1
  101. E267 0000 DEFW 0 ;scratch2
  102. E269 0000 DEFW 0 ;scratch3
  103. E26B 00E5 DEFW DIRBF ;address of dirbf.
  104. E26D 73E2 DEFW DPTOP ;address of disk parameter block.
  105. E26F 19E6 DEFW CSV03 ;address of check vector.
  106. E271 39E6 DEFW ALV03 ;address of allocation vector (bit map).
  107. ;
  108. E273 4000 DPTOP: DEFW 40H ;sectors per track from bios.
  109. E275 04 DEFB 04H ;block shift.sector in a block 128*2^n
  110. E276 0F DEFB 0FH ;block mask.sector no. in a block - 1
  111. E277 01 DEFB 01H ;extent mask.
  112. E278 9700 DEFW 97H ;disk size (number of blocks-1).
  113. E27A 7F00 DEFW 7FH ;directory size.(max file name no.-1)
  114. E27C C000 DEFW 0C0H ;storage for first bytes of bit map (dir space used).
  115. E27E 2000 DEFW 20H ;check sum vector size
  116. E280 0200 DEFW 02H ;offset. first usable track number.
  117. ;
  118. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  119. ;
  120. ;BIOS ROUTINE
  121. ;
  122. E282 210000 SETENTRY:LD HL,0000H
  123. E285 3EC3 LD A,0C3H
  124. E287 77 LD (HL),A
  125. E288 23 INC HL
  126. E289 118FE2 LD DE,SETEN2 ;reset entry point
  127. E28C 73 LD (HL),E
  128. E28D 23 INC HL
  129. E28E 72 LD (HL),D
  130. E28F 210300 SETEN2: LD HL,IOBYTE
  131. E292 AF XOR A
  132. E293 77 LD (HL),A ;IOBYTE=0
  133. E294 23 INC HL
  134. E295 77 LD (HL),A ;TDRIVE=0
  135. E296 23 INC HL
  136. E297 3EC3 LD A,0C3H
  137. E299 77 LD (HL),A
  138. E29A 23 INC HL
  139. E29B 1106D4 LD DE,FBASE ;BDOS ENTRY
  140. E29E 73 LD (HL),E
  141. E29F 23 INC HL
  142. E2A0 72 LD (HL),D
  143. E2A1 AF XOR A
  144. E2A2 3207CC LD (INBUFF+1),A ;START MESSAGE DISABLE
  145. E2A5 320ED7 LD (CHARBUF),A
  146. E2A8 3262E6 LD (CONSTDT),A
  147. E2AB 4F LD C,A
  148. E2AC C300CC JP CBASE
  149. ;
  150. E2AF AF BOOTJ: XOR A
  151. E2B0 4F LD C,A
  152. E2B1 320300 LD (IOBYTE),A
  153. E2B4 320400 LD (TDRIVE),A
  154. ;
  155. E2B7 WBOOTJ:
  156. ;reload bdos,ccp
  157. E2B7 3E01 LD A,1
  158. E2B9 3258E6 LD (CMDNO),A
  159. E2BC CD04E3 CALL TO09
  160. ;
  161. E2BF 210000 LD HL,0000H ;ADR:0-2
  162. E2C2 3EC3 LD A,0C3H
  163. E2C4 77 LD (HL),A
  164. E2C5 23 INC HL
  165. E2C6 1103E2 LD DE,WBOOT ;wboot entry
  166. E2C9 73 LD (HL),E
  167. E2CA 23 INC HL
  168. E2CB 72 LD (HL),D
  169. E2CC 23 INC HL
  170. E2CD 23 INC HL
  171. E2CE 3EC3 LD A,0C3H ;ADR:5-7
  172. E2D0 77 LD (HL),A
  173. E2D1 23 INC HL
  174. E2D2 1106D4 LD DE,FBASE ;bdos entry
  175. E2D5 73 LD (HL),E
  176. E2D6 23 INC HL
  177. E2D7 72 LD (HL),D
  178. E2D8 3A0400 LD A,(TDRIVE)
  179. E2DB 4F LD C,A
  180. E2DC C300CC JP CBASE
  181. ;
  182. ;==========================================================
  183. E2DF 3E02 CONSTJ: LD A,2
  184. E2E1 3258E6 LD (CMDNO),A
  185. E2E4 CD04E3 CALL TO09
  186. E2E7 3A5BE6 LD A,(PTOZ80) ;FF:ready, 00:not ready
  187. E2EA C9 RET
  188. ;
  189. E2EB 3E03 CONINJ: LD A,3
  190. E2ED 3258E6 LD (CMDNO),A
  191. E2F0 CD04E3 CALL TO09
  192. E2F3 3A5BE6 LD A,(PTOZ80) ;input chr
  193. E2F6 C9 RET
  194. ;
  195. E2F7 2159E6 CONOUTJ:LD HL,PTO09
  196. E2FA 71 LD (HL),C ;output chr
  197. E2FB 3E04 LD A,4
  198. E2FD 3258E6 LD (CMDNO),A
  199. E300 CD04E3 CALL TO09
  200. E303 C9 RET
  201. ;
  202. ;======================================
  203. ;goto 6809
  204. E304 F3 TO09: DI
  205. E305 AF XOR A
  206. E306 3205FD LD (0FD05H),A
  207. E309 00 NOP
  208. E30A FB EI
  209. E30B C9 RET
  210. ;======================================
  211. ;
  212. ;PRINTER OUT
  213. ;
  214. E30C C9 LISTJ: RET
  215. ;
  216. ;PUNCHER OUT(RS232C OUT)
  217. ;
  218. E30D 215FE6 PUNCHJ: LD HL,RSOUT
  219. E310 71 LD (HL),C ;output chr
  220. E311 3E06 LD A,6
  221. E313 3258E6 LD (CMDNO),A
  222. E316 CD04E3 CALL TO09
  223. E319 C9 RET
  224. ;
  225. ;READER IN
  226. ;
  227. E31A 3E07 READERJ:LD A,7
  228. E31C 3258E6 LD (CMDNO),A
  229. E31F CD04E3 CALL TO09
  230. E322 3A5DE6 LD A,(RSIN) ;A:input chr
  231. E325 C9 RET
  232. ;
  233. ;SEEK HOME POSITION
  234. ;
  235. E326 3A0400 HOMEJ: LD A,(TDRIVE) ;login disk
  236. E329 3259E6 LD (PTO09),A
  237. E32C 3E08 LD A,8
  238. E32E 3258E6 LD (CMDNO),A
  239. E331 CD04E3 CALL TO09
  240. E334 C9 RET
  241. ;
  242. ;SELECT DRIVE PARAMETER SET
  243. ;
  244. E335 210000 SELDSKJ:LD HL,0
  245. E338 79 LD A,C ;C:select drv no
  246. E339 FE04 CP 04 ;A,B:FD, C,D:WinDRV
  247. E33B D0 RET NC
  248. E33C 3256E6 LD (DRVNO),A
  249. E33F 6F LD L,A
  250. E340 29 ADD HL,HL ;*2
  251. E341 29 ADD HL,HL ;*4
  252. E342 29 ADD HL,HL ;*8
  253. E343 29 ADD HL,HL ;*16
  254. E344 1133E2 LD DE,DPBASE
  255. E347 19 ADD HL,DE
  256. E348 3E09 LD A,9
  257. E34A 3258E6 LD (CMDNO),A
  258. E34D CD04E3 CALL TO09
  259. E350 C9 RET
  260. ;
  261. ;SET TRKADRS
  262. ;
  263. E351 ED4350E6 SETTRKJ:LD (TRKADRS),BC ;BC:trk no
  264. E355 3E0A LD A,10
  265. E357 3258E6 LD (CMDNO),A
  266. E35A CD04E3 CALL TO09
  267. E35D C9 RET
  268. ;
  269. ;SET SCTADRS
  270. ;
  271. E35E ED4352E6 SETSECJ:LD (SCTADRS),BC ;BC:sct no
  272. E362 3E0B LD A,11
  273. E364 3258E6 LD (CMDNO),A
  274. E367 CD04E3 CALL TO09
  275. E36A C9 RET
  276. ;
  277. ;SET DMAADRS
  278. ;
  279. E36B 60 SETDMAJ:LD H,B ;BC:top adr of dma buffer
  280. E36C 69 LD L,C
  281. E36D 2254E6 LD (DMAADRS),HL
  282. E370 AF XOR A ;?
  283. E371 C9 RET
  284. ;
  285. ;READ SECTOR
  286. ;
  287. E372 3E0D READJ: LD A,13
  288. E374 3258E6 LD (CMDNO),A
  289. E377 CD04E3 CALL TO09
  290. E37A 3A5BE6 LD A,(PTOZ80) ;0:normal, 1:error
  291. E37D C9 RET
  292. ;
  293. ;WRITE SECTOR
  294. ;
  295. E37E 3E0E WRITEJ: LD A,14
  296. E380 3258E6 LD (CMDNO),A
  297. E383 CD04E3 CALL TO09
  298. E386 3A5BE6 LD A,(PTOZ80) ;0:normal, 1:error
  299. E389 C9 RET
  300. ;
  301. ;PRINTER STATUS
  302. ;
  303. E38A C9 PRSTATJ: RET
  304. ;
  305. ;sector translator
  306. ;
  307. E38B 69 SECTRNJ:LD L,C
  308. E38C 60 LD H,B
  309. E38D C9 RET;
  310. ;
  311. E38E 3EFF ZREENTJ:LD A,0FFH
  312. E390 3258E6 LD (CMDNO),A
  313. E393 CD04E3 CALL TO09
  314. E396 C30010 JP 1000H
  315. ;*
  316. E399 END
  317. 
 


 ◎BIOS09です。自作のクロスアセンブラでアセンブルしています。

  1. 0001 *
  2. 0002 * MY BIOS09 for FM-7 CP/M-80 58K SYSTEM
  3. 0003 *
  4. 0004 *;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5. 0005 E282 SETENTRY EQU $E282
  6. 0006 D406 FBASE EQU $D406 ;BDOS ENTRY POINT
  7. 0007 E233 DPBASE EQU $E233 ;DISK PARAMETER HEADER BASE
  8. 0008 0004 TDRIVE EQU $04
  9. 0009 0080 TBUFF EQU $80 ;i/o buffer and command line storage.
  10. 0010 E650 TRKADRS EQU $E650
  11. 0011 E652 SCTADRS EQU $E652
  12. 0012 E654 DMAADRS EQU $E654
  13. 0013 E656 DRVNO EQU $E656
  14. 0014 E658 CMDNO EQU $E658 ;command no
  15. 0015 E659 PTO09 EQU $E659 ;parameter to 6809 from Z80
  16. 0016 E65B PTOZ80 EQU $E65B ;parameter to Z80 from 6809
  17. 0017 E65D RSIN EQU $E65D
  18. 0018 E65F RSOUT EQU $E65F
  19. 0019 E661 KCSAVE EQU $E661 ;for keycode save
  20. 0020 E662 CONSTDT EQU $E662
  21. 0021 E664 XSAV EQU $E664 ;X save
  22. 0022 E666 CSUM EQU $E666 ;check sum
  23. 0023 E667 TRK EQU $E667
  24. 0024 E668 SCT EQU $E668
  25. 0025 E669 SCTCT EQU $E669 ;sct no counter
  26. 0026 E66A RTRYCT EQU $E66A ;retry counter
  27. 0027 E700 RCBBUF EQU $E700 ;BIOS buffer
  28. 0028 *;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. 0029
  30. 0030 E800 ORG $E800
  31. 0031 *
  32. 0032 FD18 FDC EQU $FD18
  33. 0033 FD05 HLTREG EQU $FD05 ;for sub system use
  34. 0034 FD0F BANK EQU $FD0F BANK (read:ROM, write:RAM)
  35. 0035 0006 ACK EQU $06 ;
  36. 0036 0015 NAK EQU $15 ;
  37. 0037 001B ESC EQU $1B ;
  38. 0038 CC00 CPMTOP EQU $CC00
  39. 0039 0016 SCTCNT EQU 22 ;sct no of ccp,bdos
  40. 0040
  41. 0041 *USART 8251A
  42. 0042 FD06 SDATA EQU $FD06 ;DATA
  43. 0043 FD07 SCMD EQU SDATA+1 ;CMD
  44. 0044 FD07 SSTS EQU SDATA+1 ;STATUS
  45. 0045
  46. 0046 0040 MRSTU EQU $40 ;master reset
  47. 0047 004E MODEU EQU $4E ;1stopbit,non pari,8bit,16x
  48. 0048 0015 CLRTSU EQU $15 ;RTS=H,ER,RxE,TxEN
  49. 0049 0034 SERTSUR EQU $34 ;RTS=L,ER,RxE for receive
  50. 0050 0031 SERTSUS EQU $31 ;RTS=L,ER,TxEN for trans
  51. 0051 0004 TXEMPTY EQU $04
  52. 0052
  53. 0053 E800 START EQU *
  54. 0054 *initialize
  55. 0055 E800 4F CLRA
  56. 0056 E801 1F 8B TFR A,DP
  57. 0057 E803 B7 FD0F STA BANK to RAM mode
  58. 0058 * reset 8251A
  59. 0059 E806 4F CLRA
  60. 0060 E807 B7 FD07 STA SCMD
  61. 0061 E80A B7 FD07 STA SCMD
  62. 0062 E80D B7 FD07 STA SCMD
  63. 0063 E810 86 40 LDA #MRSTU ;reset
  64. 0064 E812 B7 FD07 STA SCMD
  65. 0065 E815 86 4E LDA #MODEU ;1stop,nonpari,8bit,16x
  66. 0066 E817 B7 FD07 STA SCMD
  67. 0067 * set command to 8251A
  68. 0068 E81A 86 15 LDA #CLRTSU ;RTS=H,ER,RxE,DTR,TxEN
  69. 0069 E81C B7 FD07 STA SCMD
  70. 0070
  71. 0071 *init screen
  72. 0072 E81F 17 00C7 LBSR HALT
  73. 0073 E822 34 06 PSHS A,B
  74. 0074 E824 8E EB4C LDX #CONINI
  75. 0075 E827 108E FC82 LDY #$FC82
  76. 0076 E82B C6 09 LDB #9
  77. 0077 E82D A6 80 ISLOP LDA ,X+
  78. 0078 E82F A7 A0 STA ,Y+
  79. 0079 E831 5A DECB
  80. 0080 E832 26 F9 BNE ISLOP
  81. 0081 E834 17 00D3 LBSR SUBRST
  82. 0082 E837 35 06 PULS A,B
  83. 0083 *console control
  84. 0084 E839 17 00AD LBSR HALT
  85. 0085 E83C 34 06 PSHS A,B
  86. 0086 E83E 8E FC82 LDX #$FC82
  87. 0087 E841 CC 0C03 LDD #$0C03 autoLF:off,cursor:on
  88. 0088 E844 ED 84 STD ,X
  89. 0089 E846 17 00C1 LBSR SUBRST
  90. 0090 E849 35 06 PULS A,B
  91. 0091 *start message
  92. 0092 E84B 17 009B LBSR HALT
  93. 0093 E84E 34 06 PSHS A,B
  94. 0094 E850 8E EB55 LDX #STTMSG
  95. 0095 E853 108E FC81 LDY #$FC81
  96. 0096 E857 C6 27 LDB #39
  97. 0097 E859 A6 80 STLOP2 LDA ,X+
  98. 0098 E85B A7 A0 STA ,Y+
  99. 0099 E85D 5A DECB
  100. 0100 E85E 26 F9 BNE STLOP2
  101. 0101 E860 17 00A7 LBSR SUBRST
  102. 0102 E863 35 06 PULS A,B
  103. 0103
  104. 0104 *set Z80 cold start
  105. 0105 *write to $0000
  106. 0106 E865 8E 0000 LDX #0
  107. 0107 E868 86 C3 LDA #$C3
  108. 0108 E86A A7 80 STA ,X+
  109. 0109 E86C CC E282 LDD #SETENTRY
  110. 0110 E86F 1E 89 EXG A,B
  111. 0111 E871 ED 81 STD ,X++
  112. 0112 *clr IOBYTE,login disk
  113. 0113 E873 4F CLRA
  114. 0114 E874 A7 80 STA ,X+
  115. 0115 E876 A7 80 STA ,X+
  116. 0116
  117. 0117 *go to Z80
  118. 0118 E878 TOZ80 EQU *
  119. 0119 E878 8E FD05 LDX #$FD05
  120. 0120 E87B 86 01 LDA #1
  121. 0121 E87D A7 84 STA ,X
  122. 0122 E87F 12 NOP
  123. 0123
  124. 0124 *from Z80
  125. 0125 *console control
  126. 0126 E880 17 0066 LBSR HALT
  127. 0127 E883 34 06 PSHS A,B
  128. 0128 E885 8E FC82 LDX #$FC82
  129. 0129 E888 CC 0C03 LDD #$0C03 autoLF:off,cursor:on
  130. 0130 E88B ED 84 STD ,X
  131. 0131 E88D 17 007A LBSR SUBRST
  132. 0132 E890 35 06 PULS A,B
  133. 0133
  134. 0134 *****************************
  135. 0135 E892 B6 E658 CMDIN LDA CMDNO
  136. 0136 E895 81 01 CMPA #1 ;WBOOT
  137. 0137 E897 1027 0409 LBEQ RELOAD
  138. 0138 E89B 81 02 CMPA #2
  139. 0139 E89D 27 71 BEQ CONST
  140. 0140 E89F 81 03 CMPA #3
  141. 0141 E8A1 1027 0090 LBEQ CONIN
  142. 0142 E8A5 81 04 CMPA #4
  143. 0143 E8A7 1027 00AF LBEQ CONOUT
  144. 0144 E8AB 81 05 CMPA #5
  145. 0145 E8AD 1027 00C0 LBEQ LIST
  146. 0146 E8B1 81 06 CMPA #6
  147. 0147 E8B3 1027 00C3 LBEQ PUNCH
  148. 0148 E8B7 81 07 CMPA #7
  149. 0149 E8B9 1027 00C6 LBEQ READER
  150. 0150 E8BD 81 08 CMPA #8
  151. 0151 E8BF 1027 00C9 LBEQ HOME
  152. 0152 E8C3 81 09 CMPA #9
  153. 0153 E8C5 1027 00FB LBEQ SELDSK
  154. 0154 E8C9 81 0A CMPA #10
  155. 0155 E8CB 1027 0108 LBEQ SETTRK
  156. 0156 E8CF 81 0B CMPA #11
  157. 0157 E8D1 1027 0149 LBEQ SETSEC
  158. 0158 * CMPA #12
  159. 0159 * LBEQ SETDMA
  160. 0160 E8D5 81 0D CMPA #13
  161. 0161 E8D7 1027 0178 LBEQ READ
  162. 0162 E8DB 81 0E CMPA #14
  163. 0163 E8DD 1027 0206 LBEQ WRITE
  164. 0164 E8E1 81 0F CMPA #15
  165. 0165 E8E3 1027 025E LBEQ LISTST
  166. 0166 * CMPA #16
  167. 0167 * LBEQ SECTRAN
  168. 0168 E8E7 20 8F BRA TOZ80
  169. 0169 *****************************
  170. 0170 *--------------------------------------
  171. 0171 *HALT SUB-SYSTEM
  172. 0172 E8E9 1A 40 HALT ORCC #$40 firq disable
  173. 0173 E8EB 34 02 PSHS A
  174. 0174 E8ED B6 FD05 HALT2 LDA HLTREG
  175. 0175 E8F0 2B FB BMI HALT2
  176. 0176 E8F2 86 80 LDA #$80 b0:0(6809) subCPU halt
  177. 0177 E8F4 B7 FD05 STA HLTREG
  178. 0178 E8F7 B6 FD05 HALT3 LDA HLTREG
  179. 0179 E8FA 2A FB BPL HALT3
  180. 0180 E8FC 35 82 PULS A,PC
  181. 0181
  182. 0182 *RESTART SUB-SYSTEM
  183. 0183 E8FE 34 02 RDYREQ PSHS A
  184. 0184 E900 B6 FC80 LDA $FC80
  185. 0185 E903 8A 80 ORA #$80
  186. 0186 E905 B7 FC80 STA $FC80
  187. 0187 E908 35 02 PULS A
  188. 0188 *
  189. 0189 E90A 7F FD05 SUBRST CLR HLTREG subCPU restart
  190. 0190 E90D 1C AF ANDCC #$AF firq enable
  191. 0191 E90F 39 RTS
  192. 0192 *--------------------------------------
  193. 0193 *console status check
  194. 0194 E910 CONST EQU * ;2
  195. 0195 E910 8D D7 BSR HALT
  196. 0196 E912 34 04 PSHS B
  197. 0197 E914 CC 2902 LDD #$2902
  198. 0198 E917 FD FC82 STD $FC82
  199. 0199 E91A 8D EE BSR SUBRST
  200. 0200 E91C 8D CB BSR HALT
  201. 0201 E91E 5F CLRB ;$00
  202. 0202 E91F B6 FC84 LDA $FC84 ;0:none or 1
  203. 0203 E922 27 04 BEQ CS1
  204. 0204 E924 B6 FC83 LDA $FC83
  205. 0205 E927 5A DECB ;$ff
  206. 0206 E928 B7 E661 CS1 STA KCSAVE ;0 or keycode
  207. 0207 E92B F7 E65B STB PTOZ80 ;0 or $ff
  208. 0208 E92E 8D CE BSR RDYREQ
  209. 0209 E930 35 04 PULS B
  210. 0210 E932 16 FF43 LBRA TOZ80
  211. 0211
  212. 0212 *console input
  213. 0213 E935 CONIN EQU * ;3
  214. 0214 E935 B6 E661 LDA KCSAVE 0:none !0:keycode
  215. 0215 E938 27 05 BEQ CON1
  216. 0216 E93A B7 E65B STA PTOZ80
  217. 0217 E93D 20 18 BRA CON2
  218. 0218 E93F 8D A8 CON1 BSR HALT
  219. 0219 E941 34 04 PSHS B
  220. 0220 E943 CC 2903 LDD #$2903
  221. 0221 E946 FD FC82 STD $FC82
  222. 0222 E949 8D BF BSR SUBRST
  223. 0223 E94B 8D 9C BSR HALT
  224. 0224 E94D B6 FC83 LDA $FC83
  225. 0225 E950 B7 E65B STA PTOZ80
  226. 0226 E953 8D A9 BSR RDYREQ
  227. 0227 E955 35 04 PULS B
  228. 0228 E957 16 FF1E CON2 LBRA TOZ80
  229. 0229
  230. 0230 *console output
  231. 0231 E95A CONOUT EQU * ;4
  232. 0232 E95A B6 E659 LDA PTO09
  233. 0233 E95D 8D 8A BSR HALT
  234. 0234 E95F 34 06 PSHS A,B
  235. 0235 E961 B7 FC84 STA $FC84
  236. 0236 E964 CC 0301 LDD #$0301
  237. 0237 E967 FD FC82 STD $FC82
  238. 0238 E96A 8D 9E BSR SUBRST
  239. 0239 E96C 35 06 PULS A,B
  240. 0240 E96E 16 FF07 LBRA TOZ80
  241. 0241
  242. 0242 *
  243. 0243 E971 LIST EQU * ;5
  244. 0244 E971 B6 E659 LDA PTO09
  245. 0245 E974 17 030A LBSR SNDCH
  246. 0246 E977 16 FEFE LBRA TOZ80
  247. 0247
  248. 0248 *
  249. 0249 E97A PUNCH EQU * ;6
  250. 0250 E97A B6 E65F LDA RSOUT
  251. 0251 E97D 17 0301 LBSR SNDCH ;rs232c
  252. 0252 E980 16 FEF5 LBRA TOZ80
  253. 0253
  254. 0254 *
  255. 0255 E983 READER EQU * ;7
  256. 0256 E983 17 02E2 LBSR RCVCH ;rs232c
  257. 0257 E986 B7 E65D STA RSIN
  258. 0258 E989 16 FEEC LBRA TOZ80
  259. 0259
  260. 0260 *
  261. 0261 *PTO09 : login dsk
  262. 0262 E98C HOME EQU * ;8
  263. 0263 E98C B6 E659 LDA PTO09 login disk
  264. 0264 E98F 81 02 CMPA #2
  265. 0265 E991 24 02 BHS HOM1
  266. 0266 E993 8D 03 HRSLOP BSR RESTR
  267. 0267 * TSTB
  268. 0268 * BNE HRSLOP
  269. 0269 E995 16 FEE0 HOM1 LBRA TOZ80
  270. 0270
  271. 0271 *
  272. 0272 *A:DRV NO
  273. 0273 E998 RESTR EQU *
  274. 0274 E998 8A 80 ORA #$80
  275. 0275 E99A B7 FD1D STA FDC+5 drv
  276. 0276 E99D 8D 72 BSR DELAY
  277. 0277 E99F 4F CLRA trk=0
  278. 0278 E9A0 B1 FD19 CMPA FDC+1 present trk = target trk?
  279. 0279 E9A3 27 1E BEQ RES1
  280. 0280 E9A5 B7 FD1B STA FDC+3 set target trk
  281. 0281 E9A8 8D 67 BSR DELAY
  282. 0282 E9AA 86 1E LDA #$1E SEEK CMD
  283. 0283 E9AC 1A 50 ORCC #$50
  284. 0284 E9AE B7 FD18 STA FDC
  285. 0285 E9B1 8D 5E BSR DELAY
  286. 0286 E9B3 17 0187 LBSR WAIT B:status
  287. 0287 E9B6 34 14 PSHS B,X
  288. 0288 E9B8 8E 2260 LDX #8800
  289. 0289 E9BB 30 1F RESLOP LEAX -1,X
  290. 0290 E9BD 26 FC BNE RESLOP
  291. 0291 E9BF 35 14 PULS B,X
  292. 0292 * BITB #$18 SEEK ERROR,CRC ERROR
  293. 0293 * STB PTOZ80 !0:error
  294. 0294 E9C1 1C AF ANDCC #$AF
  295. 0295 E9C3 39 RES1 RTS
  296. 0296
  297. 0297 *
  298. 0298 E9C4 SELDSK EQU * ;9
  299. 0299 *DRVNO : drv no
  300. 0300 * LBSR WAIT busy?
  301. 0301 E9C4 B6 E656 LDA DRVNO
  302. 0302 E9C7 84 03 ANDA #$3
  303. 0303 E9C9 81 02 CMPA #2
  304. 0304 E9CB 24 07 BHS SEL1
  305. 0305 E9CD 8A 80 ORA #$80 motor on
  306. 0306 E9CF B7 FD1D STA FDC+5 drv
  307. 0307 E9D2 8D 3D BSR DELAY
  308. 0308 E9D4 16 FEA1 SEL1 LBRA TOZ80
  309. 0309
  310. 0310 *
  311. 0311 E9D7 SETTRK EQU * ;10
  312. 0312 * LDA DRVNO
  313. 0313 * ORA #$80
  314. 0314 * STA FDC+5 drv
  315. 0315 E9D7 B6 E656 LDA DRVNO
  316. 0316 E9DA 84 03 ANDA #3
  317. 0317 E9DC 81 02 CMPA #2
  318. 0318 E9DE 24 02 BHS SET1
  319. 0319 E9E0 8D 03 BSR TRKSET
  320. 0320 E9E2 16 FE93 SET1 LBRA TOZ80
  321. 0321
  322. 0322 *
  323. 0323 E9E5 TRKSET EQU *
  324. 0324 E9E5 17 0155 LBSR WAIT busy?
  325. 0325 E9E8 B6 E650 LDA TRKADRS
  326. 0326 E9EB B1 FD19 CMPA FDC+1 present trk = target trk?
  327. 0327 E9EE 27 20 BEQ TRK1
  328. 0328 E9F0 B7 FD1B STA FDC+3 set target trk
  329. 0329 E9F3 8D 1C BSR DELAY
  330. 0330 E9F5 86 1E LDA #$1E SEEK CMD
  331. 0331 E9F7 1A 50 ORCC #$50
  332. 0332 E9F9 B7 FD18 STA FDC
  333. 0333 E9FC 8D 13 BSR DELAY
  334. 0334 E9FE 17 013C LBSR WAIT B:status
  335. 0335 EA01 34 14 PSHS B,X
  336. 0336 EA03 8E 2260 LDX #8800
  337. 0337 EA06 30 1F TRKLOP LEAX -1,X
  338. 0338 EA08 26 FC BNE TRKLOP
  339. 0339 EA0A 35 14 PULS B,X
  340. 0340 EA0C C5 18 BITB #$18 error check
  341. 0341 EA0E 1C AF ANDCC #$AF
  342. 0342 EA10 39 TRK1 RTS
  343. 0343
  344. 0344 *
  345. 0345 EA11 17 0003 DELAY LBSR DEL14
  346. 0346 EA14 17 0000 LBSR DEL14
  347. 0347 EA17 17 0003 DEL14 LBSR DEL
  348. 0348 EA1A 17 0000 LBSR DEL
  349. 0349 EA1D 39 DEL RTS
  350. 0350
  351. 0351 *
  352. 0352 EA1E SETSEC EQU * ;11
  353. 0353 EA1E B6 E656 LDA DRVNO
  354. 0354 EA21 84 03 ANDA #3
  355. 0355 EA23 81 02 CMPA #2
  356. 0356 EA25 24 0F BHS SETS1
  357. 0357 EA27 17 0113 LBSR WAIT busy?
  358. 0358 EA2A 8D 0D BSR SETSCT ;A:sct,B:side,BUFHL:0or1
  359. 0359 EA2C B7 FD1A STA FDC+2
  360. 0360 EA2F 8D E0 BSR DELAY
  361. 0361 EA31 F7 FD1C STB FDC+4
  362. 0362 EA34 8D DB BSR DELAY
  363. 0363 EA36 16 FE3F SETS1 LBRA TOZ80
  364. 0364
  365. 0365 *
  366. 0366 *return A:sct,B:side,BUFHL:0or1
  367. 0367 EA39 SETSCT EQU *
  368. 0368 EA39 5F CLRB
  369. 0369 EA3A 7F EA52 CLR BUFHL
  370. 0370 EA3D B6 E652 LDA SCTADRS sct
  371. 0371 EA40 85 01 BITA #$01
  372. 0372 EA42 27 04 BEQ SE1
  373. 0373 EA44 4A DECA
  374. 0374 EA45 7C EA52 INC BUFHL 0:even, 1:odd
  375. 0375 EA48 44 SE1 LSRA
  376. 0376 EA49 4C INCA
  377. 0377 EA4A 81 10 CMPA #16
  378. 0378 EA4C 23 03 BLS SE2
  379. 0379 EA4E 80 10 SUBA #16
  380. 0380 EA50 5C INCB
  381. 0381 EA51 39 SE2 RTS
  382. 0382 *
  383. 0383 EA52 00 BUFHL FCB 0 ;flag upper/lower 128bytes in buffer
  384. 0384
  385. 0385 *
  386. 0386 *SETDMA EQU * ;12
  387. 0387
  388. 0388 *
  389. 0389 EA53 READ EQU * ;13
  390. 0390 EA53 B6 E656 LDA DRVNO
  391. 0391 EA56 84 03 ANDA #3
  392. 0392 EA58 81 02 CMPA #2 ;drive C:,D;?
  393. 0393 EA5A 1024 011E LBHS RDWDRV ;read windows virtual drive
  394. 0394
  395. 0395 *----- read fdd -----
  396. 0396 *read 256bytes
  397. 0397 EA5E 8D 26 BSR READSUB
  398. 0398 *set read data to buffer
  399. 0399 EA60 8E E700 RE0 LDX #RCBBUF
  400. 0400 EA63 7D EA52 TST BUFHL ;0:even, 1:odd
  401. 0401 EA66 27 03 BEQ RE1
  402. 0402 EA68 C6 80 LDB #128
  403. 0403 EA6A 3A ABX ;rcbbuf+128
  404. 0404 EA6B 34 06 RE1 PSHS D
  405. 0405 EA6D FC E654 LDD DMAADRS
  406. 0406 EA70 1E 89 EXG A,B
  407. 0407 EA72 1F 02 TFR D,Y
  408. 0408 EA74 35 06 PULS D
  409. 0409 EA76 C6 80 LDB #128
  410. 0410 EA78 A6 80 RLOP LDA ,X+
  411. 0411 EA7A A7 A0 STA ,Y+
  412. 0412 EA7C 5A DECB
  413. 0413 EA7D 26 F9 BNE RLOP
  414. 0414 EA7F 4F CLRA *no error
  415. 0415 EA80 B7 E65B STA PTOZ80
  416. 0416 EA83 16 FDF2 LBRA TOZ80
  417. 0417
  418. 0418 *
  419. 0419 EA86 READSUB EQU *
  420. 0420 EA86 17 00B4 LBSR WAIT not busy?
  421. 0421 EA89 8E E700 LDX #RCBBUF
  422. 0422 EA8C 17 FF56 LBSR TRKSET
  423. 0423 EA8F 17 FF7F LBSR DELAY
  424. 0424 EA92 8D A5 BSR SETSCT A:sct,B:side,BUFHL:0or1
  425. 0425 EA94 B7 FD1A STA FDC+2 sct
  426. 0426 EA97 17 FF77 LBSR DELAY
  427. 0427 EA9A F7 FD1C STB FDC+4 side
  428. 0428 EA9D 17 FF71 LBSR DELAY
  429. 0429 EAA0 B6 E656 LDA DRVNO
  430. 0430 EAA3 8A 80 ORA #$80 motor on
  431. 0431 EAA5 B7 FD1D STA FDC+5 drv
  432. 0432 EAA8 17 FF66 LBSR DELAY
  433. 0433 EAAB 86 8C LDA #$8C READ CMD
  434. 0434 EAAD 1A 50 ORCC #$50
  435. 0435 EAAF B7 FD18 STA FDC
  436. 0436 EAB2 F6 FD1F READ2 LDB FDC+7 DRQ,IRQ CHECK
  437. 0437 EAB5 C4 C0 ANDB #$C0
  438. 0438 EAB7 27 F9 BEQ READ2
  439. 0439 EAB9 2A 07 BPL READ3 IRQ?
  440. 0440 EABB B6 FD1B LDA FDC+3 DRQ? data
  441. 0441 EABE A7 80 STA ,X+
  442. 0442 EAC0 20 F0 BRA READ2
  443. 0443 EAC2 8D 79 READ3 BSR WAIT
  444. 0444 * BITB #$1C RECORD NOT FOUND,CRC ERROR,LOST DATA
  445. 0445 EAC4 1C AF ANDCC #$AF
  446. 0446 EAC6 39 RTS
  447. 0447 *
  448. 0448 *set write data to buffer
  449. 0449 EAC7 WRDTSET EQU *
  450. 0450 EAC7 8E E700 WRD0 LDX #RCBBUF
  451. 0451 EACA 7D EA52 TST BUFHL ;0:even, 1:odd
  452. 0452 EACD 27 03 BEQ WRD1
  453. 0453 EACF C6 80 LDB #128
  454. 0454 EAD1 3A ABX
  455. 0455 EAD2 34 06 WRD1 PSHS D
  456. 0456 EAD4 FC E654 LDD DMAADRS
  457. 0457 EAD7 1E 89 EXG A,B
  458. 0458 EAD9 1F 02 TFR D,Y
  459. 0459 EADB 35 06 PULS D
  460. 0460 EADD C6 80 LDB #128
  461. 0461 EADF A6 A0 WRDLOP LDA ,Y+
  462. 0462 EAE1 A7 80 STA ,X+
  463. 0463 EAE3 5A DECB
  464. 0464 EAE4 26 F9 BNE WRDLOP
  465. 0465 EAE6 39 RTS
  466. 0466 *
  467. 0467 EAE7 WRITE EQU * ;14
  468. 0468 EAE7 B6 E656 LDA DRVNO
  469. 0469 EAEA 84 03 ANDA #3
  470. 0470 EAEC 81 02 CMPA #2 ;drive C:,D;?
  471. 0471 EAEE 1024 0113 LBHS WRWDRV ;write windows virtual drive
  472. 0472
  473. 0473 *----- write fdd -----
  474. 0474 *read 256bytes
  475. 0475 EAF2 8D 92 BSR READSUB
  476. 0476 *set write data 128bytes
  477. 0477 EAF4 8D D1 BSR WRDTSET
  478. 0478 *write
  479. 0479 EAF6 8D 45 BSR WAIT not busy?
  480. 0480 EAF8 8E E700 LDX #RCBBUF
  481. 0481 EAFB 17 FEE7 LBSR TRKSET
  482. 0482 EAFE 17 FF10 LBSR DELAY
  483. 0483 EB01 17 FF35 LBSR SETSCT ;A:sct,B:side
  484. 0484 EB04 B7 FD1A STA FDC+2 sct
  485. 0485 EB07 17 FF07 LBSR DELAY
  486. 0486 EB0A F7 FD1C STB FDC+4 side
  487. 0487 EB0D 17 FF01 LBSR DELAY
  488. 0488 EB10 B6 E656 LDA DRVNO
  489. 0489 EB13 8A 80 ORA #$80
  490. 0490 EB15 B7 FD1D STA FDC+5 drv
  491. 0491 EB18 17 FEF6 LBSR DELAY
  492. 0492 EB1B 86 AC LDA #$AC WRITE CMD
  493. 0493 EB1D 1A 50 ORCC #$50
  494. 0494 EB1F B7 FD18 STA FDC
  495. 0495 EB22 A6 80 WRITE2 LDA ,X+
  496. 0496 EB24 F6 FD1F WRITE3 LDB FDC+7 DRQ,IRQ CHECK
  497. 0497 EB27 C4 C0 ANDB #$C0
  498. 0498 EB29 27 F9 BEQ WRITE3
  499. 0499 EB2B 2A 05 BPL WRITE4 irq?
  500. 0500 EB2D B7 FD1B STA FDC+3 drq? data write
  501. 0501 EB30 20 F0 BRA WRITE2
  502. 0502 EB32 30 1F WRITE4 LEAX -1,X
  503. 0503 EB34 8D 07 BSR WAIT
  504. 0504 EB36 C5 5C BITB #$5C error?
  505. 0505 EB38 1C AF ANDCC #$AF
  506. 0506 EB3A 16 FD3B LBRA TOZ80
  507. 0507
  508. 0508 *
  509. 0509 EB3D F6 FD18 WAIT LDB FDC
  510. 0510 EB40 C5 01 BITB #$01 busy?
  511. 0511 EB42 26 F9 BNE WAIT
  512. 0512 EB44 39 RTS
  513. 0513
  514. 0514 *
  515. 0515 EB45 LISTST EQU * ;15
  516. 0516 EB45 4F CLRA not ready
  517. 0517 EB46 B7 E65B STA PTOZ80
  518. 0518 EB49 16 FD2C LBRA TOZ80
  519. 0519
  520. 0520 *
  521. 0521 *SECTRAN EQU * ;16
  522. 0522
  523. 0523 *
  524. 0524 EB4C 01 CONINI FCB $01,$00,$50,$19,$00,$19,$00,$01,$00 ..9chrs
  525. 0525 *
  526. 0526 EB55 00 STTMSG FCC $00,$03,36,$0D,$0A,"FM-7 CP/M-80 Ver2.2 58K System",$0D,$0A,$0D,$0A ...39chars
  527. 0527 *
  528. 0528 *================================================
  529. 0529 *read windows virtual drive
  530. 0530 EB7C RDWDRV EQU *
  531. 0531 *read 256bytes
  532. 0532 EB7C 8D 03 BSR READSUB2
  533. 0533 EB7E 16 FEDF LBRA RE0
  534. 0534
  535. 0535 *read 256bytes
  536. 0536 EB81 READSUB2 EQU *
  537. 0537 EB81 7F E666 RDS0 CLR CSUM
  538. 0538 EB84 86 52 LDA #'R
  539. 0539 EB86 17 00F8 LBSR SNDCH read cmd
  540. 0540 EB89 8D 73 BSR ADDCS
  541. 0541 EB8B B6 E656 LDA DRVNO
  542. 0542 EB8E 17 00F0 LBSR SNDCH drv
  543. 0543 EB91 8D 6B BSR ADDCS
  544. 0544 EB93 B6 E650 LDA TRKADRS
  545. 0545 EB96 17 00E8 LBSR SNDCH trk
  546. 0546 EB99 8D 63 BSR ADDCS
  547. 0547 EB9B B6 E652 LDA SCTADRS
  548. 0548 EB9E 8D 4D BSR SETSCT2
  549. 0549 EBA0 17 00DE LBSR SNDCH sct
  550. 0550 EBA3 8D 59 BSR ADDCS
  551. 0551 EBA5 B6 E666 LDA CSUM
  552. 0552 EBA8 17 00D6 LBSR SNDCH csum
  553. 0553 *wait receive ACKorNAKorESC
  554. 0554 * if NAK then re-send 'R',Drv,Trk,Sct,csum
  555. 0555 * if ESC then error return
  556. 0556 * if ACK then next
  557. 0557 EBAB 17 00BA RDS1 LBSR RCVCH
  558. 0558 EBAE 81 15 CMPA #NAK
  559. 0559 EBB0 27 CF BEQ RDS0
  560. 0560 EBB2 81 1B CMPA #ESC
  561. 0561 EBB4 26 03 BNE RDS2
  562. 0562 EBB6 86 FF LDA #$FF *error
  563. 0563 EBB8 39 RTS *error end
  564. 0564 *
  565. 0565 EBB9 81 06 RDS2 CMPA #ACK
  566. 0566 EBBB 26 EE BNE RDS1
  567. 0567 * send ACK
  568. 0568 EBBD 17 00C1 LBSR SNDCH ACK
  569. 0569 *receive data(256bytes),csum
  570. 0570 * data is saved to Buffer(X)
  571. 0571 * if csum error then send NAK
  572. 0572 * if csum ok then send ACK and to next process
  573. 0573 EBC0 8E E700 RDS3 LDX #RCBBUF
  574. 0574 EBC3 5F CLRB counter(256)
  575. 0575 EBC4 7F E666 CLR CSUM
  576. 0576 EBC7 17 009E RDSLOP LBSR RCVCH data
  577. 0577 EBCA A7 80 STA ,X+
  578. 0578 EBCC 8D 30 BSR ADDCS
  579. 0579 EBCE 5A DECB
  580. 0580 EBCF 26 F6 BNE RDSLOP
  581. 0581 EBD1 17 0094 LBSR RCVCH csum
  582. 0582 EBD4 B1 E666 CMPA CSUM
  583. 0583 EBD7 27 07 BEQ RDS4
  584. 0584 EBD9 86 15 LDA #NAK
  585. 0585 EBDB 17 00A3 LBSR SNDCH NAK
  586. 0586 EBDE 20 E0 BRA RDS3
  587. 0587 *
  588. 0588 EBE0 86 06 RDS4 LDA #ACK
  589. 0589 EBE2 17 009C LBSR SNDCH ACK
  590. 0590 *wait receive ACK
  591. 0591 EBE5 17 0080 RDS5 LBSR RCVCH
  592. 0592 EBE8 81 06 CMPA #ACK
  593. 0593 EBEA 26 F9 BNE RDS5
  594. 0594 EBEC 39 RTS
  595. 0595 *
  596. 0596 *return A:sct,BUFHL:0or1
  597. 0597 EBED SETSCT2 EQU *
  598. 0598 EBED 7F EA52 CLR BUFHL
  599. 0599 EBF0 B6 E652 LDA SCTADRS ;sct
  600. 0600 EBF3 85 01 BITA #$01
  601. 0601 EBF5 27 04 BEQ SE21
  602. 0602 EBF7 4A DECA
  603. 0603 EBF8 7C EA52 INC BUFHL ;0:even, 1:odd
  604. 0604 EBFB 44 SE21 LSRA
  605. 0605 EBFC 4C INCA
  606. 0606 EBFD 39 RTS
  607. 0607 *
  608. 0608 *--------------------
  609. 0609 *add check sum
  610. 0610 EBFE ADDCS EQU *
  611. 0611 EBFE BB E666 ADDA CSUM
  612. 0612 EC01 B7 E666 STA CSUM
  613. 0613 EC04 39 RTS
  614. 0614 *--------------------
  615. 0615 *write windows virtual drive
  616. 0616 EC05 WRWDRV EQU *
  617. 0617 *read 256bytes
  618. 0618 EC05 17 FF79 LBSR READSUB2
  619. 0619 *set write data
  620. 0620 EC08 17 FEBC LBSR WRDTSET
  621. 0621 *write
  622. 0622 EC0B 7F E666 WRW2 CLR CSUM
  623. 0623 EC0E 86 57 LDA #'W
  624. 0624 EC10 8D 6F BSR SNDCH write cmd
  625. 0625 EC12 8D EA BSR ADDCS
  626. 0626 EC14 B6 E656 LDA DRVNO
  627. 0627 EC17 8D 68 BSR SNDCH drv
  628. 0628 EC19 8D E3 BSR ADDCS
  629. 0629 EC1B B6 E650 LDA TRKADRS
  630. 0630 EC1E 8D 61 BSR SNDCH trk
  631. 0631 EC20 8D DC BSR ADDCS
  632. 0632 EC22 B6 E652 LDA SCTADRS
  633. 0633 EC25 8D C6 BSR SETSCT2
  634. 0634 EC27 8D 58 BSR SNDCH sct
  635. 0635 EC29 8D D3 BSR ADDCS
  636. 0636 EC2B B6 E666 LDA CSUM
  637. 0637 EC2E 8D 51 BSR SNDCH csum
  638. 0638 *wait receive ACKorNAK
  639. 0639 * if NAK then re-send 'W',Drv,Trk,Sct,csum
  640. 0640 * if ESC then error return
  641. 0641 * if ACK then next
  642. 0642 EC30 8D 36 WRW3 BSR RCVCH
  643. 0643 EC32 81 15 CMPA #NAK
  644. 0644 EC34 27 D5 BEQ WRW2
  645. 0645 EC36 81 1B CMPA #ESC
  646. 0646 EC38 26 04 BNE WRW4
  647. 0647 EC3A 86 FF LDA #$FF *error
  648. 0648 EC3C 20 24 BRA WRW7 *error end
  649. 0649 *
  650. 0650 EC3E 81 06 WRW4 CMPA #ACK
  651. 0651 EC40 26 EE BNE WRW3
  652. 0652 *send data(256bytes),csum
  653. 0653 *data is in Buffer(X)
  654. 0654 EC42 8E E700 WRW5 LDX #RCBBUF
  655. 0655 EC45 5F CLRB counter(256)
  656. 0656 EC46 7F E666 CLR CSUM
  657. 0657 EC49 A6 80 WRWLOP2 LDA ,X+
  658. 0658 EC4B 8D 34 BSR SNDCH data
  659. 0659 EC4D 8D AF BSR ADDCS
  660. 0660 EC4F 5A DECB
  661. 0661 EC50 26 F7 BNE WRWLOP2
  662. 0662 EC52 B6 E666 LDA CSUM
  663. 0663 EC55 8D 2A BSR SNDCH csum
  664. 0664 *wait receive ACKorNAK
  665. 0665 * if NAK then re-send data(256bytes),csum
  666. 0666 * if ACK then next
  667. 0667 EC57 8D 0F WRW6 BSR RCVCH
  668. 0668 EC59 81 15 CMPA #NAK
  669. 0669 EC5B 27 E5 BEQ WRW5
  670. 0670 EC5D 81 06 CMPA #ACK
  671. 0671 EC5F 26 F6 BNE WRW6
  672. 0672 EC61 4F CLRA *no error
  673. 0673 EC62 B7 E65B WRW7 STA PTOZ80
  674. 0674 EC65 16 FC10 LBRA TOZ80
  675. 0675 *
  676. 0676 *======================================
  677. 0677 * receive from serial port
  678. 0678 * (use USART 8251A)
  679. 0679 * A <- port
  680. 0680 *
  681. 0681 EC68 RCVCH EQU *
  682. 0682 EC68 86 34 LDA #SERTSUR ;RTS=L
  683. 0683 EC6A B7 FD07 STA SCMD
  684. 0684 EC6D 12 NOP
  685. 0685 EC6E B6 FD07 RCV1 LDA SSTS
  686. 0686 EC71 47 ASRA
  687. 0687 EC72 47 ASRA
  688. 0688 EC73 24 F9 BCC RCV1
  689. 0689 EC75 B6 FD06 LDA SDATA ;get data
  690. 0690 EC78 34 02 PSHS A
  691. 0691 EC7A 86 15 LDA #CLRTSU ;RTS=H
  692. 0692 EC7C B7 FD07 STA SCMD
  693. 0693 EC7F 35 82 PULS A,PC
  694. 0694 *
  695. 0695 *--------------------------------------
  696. 0696 * send to serial port
  697. 0697 * (use USART 8251A)
  698. 0698 * port <- A
  699. 0699 *
  700. 0700 EC81 SNDCH EQU *
  701. 0701 EC81 34 02 PSHS A
  702. 0702 EC83 86 31 LDA #SERTSUS ;RTS=L
  703. 0703 EC85 B7 FD07 STA SCMD
  704. 0704 EC88 12 NOP
  705. 0705 EC89 B6 FD07 SND1 LDA SSTS
  706. 0706 EC8C 47 ASRA
  707. 0707 EC8D 24 FA BCC SND1
  708. 0708 EC8F 35 02 PULS A
  709. 0709 EC91 B7 FD06 STA SDATA ;send data
  710. 0710 EC94 34 02 PSHS A
  711. 0711 EC96 B6 FD07 SND2 LDA SSTS
  712. 0712 EC99 85 04 BITA #TxEMPTY
  713. 0713 EC9B 27 F9 BEQ SND2
  714. 0714 EC9D 86 15 LDA #CLRTSU ;RTS=H
  715. 0715 EC9F B7 FD07 STA SCMD
  716. 0716 ECA2 35 82 PULS A,PC
  717. 0717 *
  718. 0718 *================================================
  719. 0719 *WBOOT : reload CCP,BDOS
  720. 0720 ECA4 RELOAD EQU *
  721. 0721 *restore
  722. 0722 ECA4 4F RELOP CLRA drv=0
  723. 0723 ECA5 17 FCF0 LBSR RESTR
  724. 0724 * TSTB
  725. 0725 * BNE RELOP
  726. 0726 *dread
  727. 0727 ECA8 4F CLRA
  728. 0728 ECA9 B7 FD1C STA FDC+4 side 0
  729. 0729 ECAC B7 FD19 STA FDC+1 start trk=0
  730. 0730 ECAF 8A 80 ORA #$80 motor on
  731. 0731 ECB1 B7 FD1D STA FDC+5 drv
  732. 0732 ECB4 86 03 LDA #3
  733. 0733 ECB6 B7 FD1A STA FDC+2 start sct=3
  734. 0734
  735. 0735 ECB9 86 16 LDA #SCTCNT
  736. 0736 ECBB B7 E669 STA SCTCT
  737. 0737 ECBE 108E CC00 LDY #CPMTOP
  738. 0738 ECC2 8E E700 DRDLOP LDX #RCBBUF
  739. 0739 ECC5 8D 3A BSR RD1SCT read 1 sct
  740. 0740 * TSTB error?
  741. 0741 * BNE DRDERR
  742. 0742 ECC7 7A E669 DR0 DEC SCTCT
  743. 0743 ECCA 27 16 BEQ DRDEND
  744. 0744 ECCC B6 E668 LDA SCT
  745. 0745 ECCF 4C INCA
  746. 0746 ECD0 81 20 CMPA #32 maxsct?
  747. 0747 ECD2 23 05 BLS DR1
  748. 0748 ECD4 7C E667 INC TRK next trk
  749. 0749 ECD7 86 01 LDA #1 sct
  750. 0750 ECD9 B7 E668 DR1 STA SCT
  751. 0751 ECDC 31A9 0100 LEAY 256,Y
  752. 0752 ECE0 20 E0 BRA DRDLOP
  753. 0753 *
  754. 0754 ECE2 DRDEND
  755. 0755 ECE2 16 FB93 LBRA TOZ80
  756. 0756
  757. 0757 ECE5 DRDERR EQU *
  758. 0758 ECE5 C1 0A CMPB #10 drive not ready error?
  759. 0759 ECE7 27 16 BEQ EREND
  760. 0760 ECE9 C1 0B DRE1 CMPB #11 disk write protected error?
  761. 0761 ECEB 27 12 BEQ EREND
  762. 0762 ECED DRE2 EQU * retry
  763. 0763 ECED C6 0A LDB #10
  764. 0764 ECEF F7 E66A STB RTRYCT
  765. 0765 ECF2 B6 E656 DRELOP LDA DRVNO
  766. 0766 ECF5 17 FCA0 LBSR RESTR
  767. 0767 * TSTB
  768. 0768 * BNE DRELOP
  769. 0769 ECF8 8D 07 BSR RD1SCT
  770. 0770 * TSTB
  771. 0771 * BEQ DR0
  772. 0772 ECFA 7A E66A DEC RTRYCT
  773. 0773 ECFD 26 F3 BNE DRELOP
  774. 0774 ECFF EREND EQU *
  775. 0775 ECFF 20 E1 BRA DRDEND
  776. 0776 *
  777. 0777 *read 1 sct from disk
  778. 0778 ED01 RD1SCT EQU *
  779. 0779 ED01 17 FE39 LBSR WAIT not busy?
  780. 0780 ED04 17 FCDE LBSR TRKSET
  781. 0781 ED07 17 FD2F LBSR SETSCT
  782. 0782 ED0A B7 FD1A STA FDC+2 sct
  783. 0783 ED0D F7 FD1C STB FDC+4 side
  784. 0784 ED10 B6 E656 LDA DRVNO
  785. 0785 ED13 8A 80 ORA #$80
  786. 0786 ED15 B7 FD1D STA FDC+5 drv
  787. 0787 ED18 86 8C LDA #$8C READ CMD
  788. 0788 ED1A 1A 50 ORCC #$50
  789. 0789 ED1C B7 FD18 STA FDC
  790. 0790 ED1F F6 FD1F RD12 LDB FDC+7 DRQ,IRQ CHECK
  791. 0791 ED22 C4 C0 ANDB #$C0
  792. 0792 ED24 27 F9 BEQ RD12
  793. 0793 ED26 2A 07 BPL RD13 IF IRQ
  794. 0794 ED28 B6 FD1B LDA FDC+3 IF DRQ
  795. 0795 ED2B A7 80 STA ,X+
  796. 0796 ED2D 20 F0 BRA RD12
  797. 0797 ED2F 17 FE0B RD13 LBSR WAIT
  798. 0798 * BITB #$1C RECORD NOT FOUND,CRC ERROR,LOST DATA
  799. 0799 ED32 1C AF ANDCC #$AF
  800. 0800 ED34 39 RTS
  801. 0801
  802. 0802 *=================================================
  803.  
  804. 
 

上記のソフトはまだ制作途中ということで、エラー処理などは不十分ですのでディスクアクセスに失敗などするとハングアップしたりします。

ということで、不具合はありますが何とか使える状態なので、今は、最近入手した「応用CP/M 村瀬康治著」中のシステムコールの実習を一つずつ走らせて確認しているところです。

なお、仮想ドライブ構築ソフトCpmDrvWin.exeですが、もうしばらく使用して不具合が出ないかを確認してから公開する予定です。



2020年5月2日土曜日

CP/M用の仮想ドライブの構築ソフト(その2)

仮想ドライブ構築ソフトCpmDrvWin.exeをCP/Mに接続してみました。


前回報告したCpmDrvWin.exeをCP/Mに接続してみました。
書き直したのは、CP/MのBIOSの6809側のルーチンのみで、DrvNoが0(A:),1(B:)の時は従来のFDDアクセスルーチンのままで、2(C:),3(D:)の場合にはRS232Cを通してCpmDrvWinと通信して仮想ドライブ中のファイルを読み書きします。

具体的には、ファイルを読む場合にはCpmDrvWinに対して’R',DrvNo,TrkNo,SctNo(+チェックサム)という文字列を、書き込む場合には’W',DrvNo,TrkNo,SctNo(+チェックサム)という文字列を送って、その結果を受け取るだけです。



ディレクトリを表示

ドライブA:はフロッピーディスクで、ドライブC:とD:が仮想ドライブです。
まだテスト中ですので、BaudRateを4800baudと遅くしてありますが、完成時には38400baudになります。


ドライブC:のディレクトリ表示時

右のテキストボックスは受信したコマンド列を表示しています。
Trk2,Sct1から始まって、各2回ずつ読んでいるのが分かりますが、これはブロッキング・デブロッキングをちゃんと行っていないためです。(何とかしなければ...)


ドライブD:のディレクトリ表示時

ディレクトリの範囲はTrk2のSct1~16なのですが、ドライブD:の場合のように、ファイル数が少なくても、その範囲のセクタを全て読んで、空を表示しています。(これはBDOSの仕様なのか、それとも自作BIOSの責任なのか...)

前回のブログで書きましたように、左のリストボックス中にWindows上のファイルをドラッグ&ドロップしてファイルを追加すれば、CP/Mからそのファイルにアクセスすることができます。

また、CP/MとWindows上のCpmDrvWinとの間の通信部分は、Flex9用、F-Basic用などと共通で、8251A使用のRS232Cカードや以前発表した拡張I/Oボード上の6850(ACIA)使用の場合の通信ルーチンが使用できますが、FM-7でも6850(ACIA)の方はあっさりと38400baudで動いています。

未だ完成ではありませんが、とりあえずこの程度でできるのだというサンプルとして、BIOSに追加した仮想ドライブアクセスルーチンを記しておきます。

*================================================
*read windows virtual drive
RDWDRV EQU *
*read 256bytes
 BSR READSUB2
 LBRA RE0

*read 256bytes
READSUB2 EQU *
RDS0 CLR CSUM
 LDA #'R
 LBSR SNDCH read cmd
 BSR ADDCS
 LDA DRVNO
 LBSR SNDCH drv
 BSR ADDCS
 LDA TRKADR
 LBSR SNDCH trk
 BSR ADDCS
 LDA SCTADR
 BSR SETSCT2
 LBSR SNDCH sct
 BSR ADDCS
 LDA CSUM
 LBSR SNDCH csum
*wait receive ACKorNAKorESC
*  if NAK then re-send 'R',Drv,Trk,Sct,csum
*  if ESC then error return
*  if ACK then next
RDS1 LBSR RCVCH
 CMPA #NAK
 BEQ RDS0
 CMPA #ESC
 BNE RDS2
 LDA #$FF *error
 RTS *error end
*
RDS2 CMPA #ACK
 BNE RDS1
* send ACK
 LBSR SNDCH ACK
*receive data(256bytes),csum
*  data is saved to Buffer(X)
*  if csum error then send NAK
*  if csum ok then send ACK and to next process
RDS3 LDX #RCBBUF
 CLRB counter(256)
 CLR CSUM
RDSLOP LBSR RCVCH data
 STA ,X+
 BSR ADDCS
 DECB
 BNE RDSLOP
 LBSR RCVCH csum
 CMPA CSUM
 BEQ RDS4
 LDA #NAK
 LBSR SNDCH NAK
 BRA RDS3
*
RDS4 LDA #ACK
 LBSR SNDCH ACK
*wait receive ACK
RDS5 LBSR RCVCH
 CMPA #ACK
 BNE RDS5
 RTS
*
*return A:sct,BUFHL:0or1
SETSCT2 EQU *
 CLR BUFHL
 LDA SCTADR ;sct
 BITA #$01
 BEQ SE21
 DECA
 INC BUFHL ;0:even, 1:odd
SE21 LSRA
 INCA
 RTS
*
*--------------------
*add check sum
ADDCS EQU *
 ADDA CSUM
 STA CSUM
 RTS
*--------------------
*write windows virtual drive
WRWDRV EQU *
*read 256bytes
 LBSR READSUB2
*set write data
 BSR WRDTSET
*write
WRW2 CLR CSUM
 LDA #'W
 BSR SNDCH write cmd
 BSR ADDCS
 LDA DRVNO
 BSR SNDCH drv
 BSR ADDCS
 LDA TRKADR
 BSR SNDCH trk
 BSR ADDCS
 LDA SCTADR
 BSR SETSCT2
 BSR SNDCH sct
 BSR ADDCS
 LDA CSUM
 BSR SNDCH csum
*wait receive ACKorNAK
*  if NAK then re-send 'W',Drv,Trk,Sct,csum
*  if ESC then error return
*  if ACK then next
WRW3 BSR RCVCH
 CMPA #NAK
 BEQ WRW2
 CMPA #ESC
 BNE WRW4
 LDA #$FF  *error
 BRA WRW7 *error end
*
WRW4 CMPA #ACK
 BNE WRW3
*send data(256bytes),csum
*data is in Buffer(X)
WRW5 LDX #RCBBUF
 CLRB counter(256)
 CLR CSUM
WRWLOP2 LDA ,X+
 BSR SNDCH data
 BSR ADDCS
 DECB
 BNE WRWLOP2
 LDA CSUM
 BSR SNDCH csum
*wait receive ACKorNAK
*  if NAK then re-send data(256bytes),csum
*  if ACK then next
WRW6 BSR RCVCH
 CMPA #NAK
 BEQ WRW5
 CMPA #ACK
 BNE WRW6
 CLRA *no error
WRW7 STA PTOZ80
 LBRA TOZ80
*
*======================================

ということで、あちこちに不備があってまだまだ修正の必要がありますが、CP/M用の仮想ドライブのプロトタイプがとりあえずできたという報告でした。