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でアセンブルしています。
- Z80 ASSEMBLER - ZASM VER 1.6
- ;
- ; BIOS80 for FM-7 CP/M-80 60K SYSTEM
- ;
- ;*************** BIOS DATA AREA ******************************
- ;
- E500 DIRBF EQU 0E500H ;128bytes
- ;
- E580 CSV00 EQU 0E580H ;32bytes
- E5A0 ALV00 EQU 0E5A0H ;19bytes
- E5B3 CSV01 EQU 0E5B3H ;32bytes
- E5D3 ALV01 EQU 0E5D3H ;19bytes
- E5E6 CSV02 EQU 0E5E6H ;32bytes
- E606 ALV02 EQU 0E606H ;19bytes
- E619 CSV03 EQU 0E619H ;32bytes
- E639 ALV03 EQU 0E639H ;19bytes (-0E64Ch)
- ;
- E650 TRKADRS EQU 0E650H
- E652 SCTADRS EQU 0E652H
- E654 DMAADRS EQU 0E654H
- E656 DRVNO EQU 0E656H
- E658 CMDNO EQU 0E658H ;command no
- E659 PTO09 EQU 0E659H ;parameter to 6809 from Z80
- E65B PTOZ80 EQU 0E65BH ;parameter to Z80 from 6809
- E65D RSIN EQU 0E65DH
- E65F RSOUT EQU 0E65FH
- E661 KCSAVE EQU 0E661H ;for keycode save
- E662 CONSTDT EQU 0E662H
- ;
- 0000 REENT: EQU 0
- 0003 IOBYTE: EQU 3
- 0004 TDRIVE: EQU 4
- D406 FBASE: EQU 0D406H
- CC00 CBASE: EQU 0CC00H
- CC06 INBUFF: EQU 0CC06H
- D70E CHARBUF:EQU 0D70EH
- ;
- E200 ORG 0E200H
- ;
- ;**************************************************************
- ;*
- ;* B I O S J U M P T A B L E
- ;*
- ;**************************************************************
- ;
- E200 C3AFE2 BOOT: JP BOOTJ
- E203 C3B7E2 WBOOT: JP WBOOTJ
- E206 C3DFE2 CONST: JP CONSTJ
- E209 C3EBE2 CONIN: JP CONINJ
- E20C C3F7E2 CONOUT: JP CONOUTJ
- E20F C30CE3 LIST: JP LISTJ
- E212 C30DE3 PUNCH: JP PUNCHJ
- E215 C31AE3 READER: JP READERJ
- E218 C326E3 HOME: JP HOMEJ
- E21B C335E3 SELDSK: JP SELDSKJ
- E21E C351E3 SETTRK: JP SETTRKJ
- E221 C35EE3 SETSEC: JP SETSECJ
- E224 C36BE3 SETDMA: JP SETDMAJ
- E227 C372E3 READ: JP READJ
- E22A C37EE3 WRITE: JP WRITEJ
- E22D C38AE3 PRSTAT: JP PRSTATJ
- E230 C38BE3 SECTRN: JP SECTRNJ
- ;
- ; DISK PARAMETER BASE
- ;
- E233 DPBASE:
- ;
- ;drive No.0 (a drive)
- E233 0000 DEFW 0 ;XLATE
- E235 0000 DEFW 0 ;scratch1
- E237 0000 DEFW 0 ;scratch2
- E239 0000 DEFW 0 ;scratch3
- E23B 00E5 DEFW DIRBF ;address of dirbf.
- E23D 73E2 DEFW DPTOP ;address of disk parameter block.
- E23F 80E5 DEFW CSV00 ;address of check vector.
- E241 A0E5 DEFW ALV00 ;address of allocation vector (bit map).
- ;
- ;drive No.1 (b drive)
- E243 0000 DEFW 0 ;XLATE
- E245 0000 DEFW 0 ;scratch1
- E247 0000 DEFW 0 ;scratch2
- E249 0000 DEFW 0 ;scratch3
- E24B 00E5 DEFW DIRBF ;address of dirbf.
- E24D 73E2 DEFW DPTOP ;address of disk parameter block.
- E24F B3E5 DEFW CSV01 ;address of check vector.
- E251 D3E5 DEFW ALV01 ;address of allocation vector (bit map).
- ;
- ;drive No.2 (c drive)
- E253 0000 DEFW 0 ;XLATE
- E255 0000 DEFW 0 ;scratch1
- E257 0000 DEFW 0 ;scratch2
- E259 0000 DEFW 0 ;scratch3
- E25B 00E5 DEFW DIRBF ;address of dirbf.
- E25D 73E2 DEFW DPTOP ;address of disk parameter block.
- E25F E6E5 DEFW CSV02 ;address of check vector.
- E261 06E6 DEFW ALV02 ;address of allocation vector (bit map).
- ;
- ;drive No.3 (d drive)
- E263 0000 DEFW 0 ;XLATE
- E265 0000 DEFW 0 ;scratch1
- E267 0000 DEFW 0 ;scratch2
- E269 0000 DEFW 0 ;scratch3
- E26B 00E5 DEFW DIRBF ;address of dirbf.
- E26D 73E2 DEFW DPTOP ;address of disk parameter block.
- E26F 19E6 DEFW CSV03 ;address of check vector.
- E271 39E6 DEFW ALV03 ;address of allocation vector (bit map).
- ;
- E273 4000 DPTOP: DEFW 40H ;sectors per track from bios.
- E275 04 DEFB 04H ;block shift.sector in a block 128*2^n
- E276 0F DEFB 0FH ;block mask.sector no. in a block - 1
- E277 01 DEFB 01H ;extent mask.
- E278 9700 DEFW 97H ;disk size (number of blocks-1).
- E27A 7F00 DEFW 7FH ;directory size.(max file name no.-1)
- E27C C000 DEFW 0C0H ;storage for first bytes of bit map (dir space used).
- E27E 2000 DEFW 20H ;check sum vector size
- E280 0200 DEFW 02H ;offset. first usable track number.
- ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ;BIOS ROUTINE
- ;
- E282 210000 SETENTRY:LD HL,0000H
- E285 3EC3 LD A,0C3H
- E287 77 LD (HL),A
- E288 23 INC HL
- E289 118FE2 LD DE,SETEN2 ;reset entry point
- E28C 73 LD (HL),E
- E28D 23 INC HL
- E28E 72 LD (HL),D
- E28F 210300 SETEN2: LD HL,IOBYTE
- E292 AF XOR A
- E293 77 LD (HL),A ;IOBYTE=0
- E294 23 INC HL
- E295 77 LD (HL),A ;TDRIVE=0
- E296 23 INC HL
- E297 3EC3 LD A,0C3H
- E299 77 LD (HL),A
- E29A 23 INC HL
- E29B 1106D4 LD DE,FBASE ;BDOS ENTRY
- E29E 73 LD (HL),E
- E29F 23 INC HL
- E2A0 72 LD (HL),D
- E2A1 AF XOR A
- E2A2 3207CC LD (INBUFF+1),A ;START MESSAGE DISABLE
- E2A5 320ED7 LD (CHARBUF),A
- E2A8 3262E6 LD (CONSTDT),A
- E2AB 4F LD C,A
- E2AC C300CC JP CBASE
- ;
- E2AF AF BOOTJ: XOR A
- E2B0 4F LD C,A
- E2B1 320300 LD (IOBYTE),A
- E2B4 320400 LD (TDRIVE),A
- ;
- E2B7 WBOOTJ:
- ;reload bdos,ccp
- E2B7 3E01 LD A,1
- E2B9 3258E6 LD (CMDNO),A
- E2BC CD04E3 CALL TO09
- ;
- E2BF 210000 LD HL,0000H ;ADR:0-2
- E2C2 3EC3 LD A,0C3H
- E2C4 77 LD (HL),A
- E2C5 23 INC HL
- E2C6 1103E2 LD DE,WBOOT ;wboot entry
- E2C9 73 LD (HL),E
- E2CA 23 INC HL
- E2CB 72 LD (HL),D
- E2CC 23 INC HL
- E2CD 23 INC HL
- E2CE 3EC3 LD A,0C3H ;ADR:5-7
- E2D0 77 LD (HL),A
- E2D1 23 INC HL
- E2D2 1106D4 LD DE,FBASE ;bdos entry
- E2D5 73 LD (HL),E
- E2D6 23 INC HL
- E2D7 72 LD (HL),D
- E2D8 3A0400 LD A,(TDRIVE)
- E2DB 4F LD C,A
- E2DC C300CC JP CBASE
- ;
- ;==========================================================
- E2DF 3E02 CONSTJ: LD A,2
- E2E1 3258E6 LD (CMDNO),A
- E2E4 CD04E3 CALL TO09
- E2E7 3A5BE6 LD A,(PTOZ80) ;FF:ready, 00:not ready
- E2EA C9 RET
- ;
- E2EB 3E03 CONINJ: LD A,3
- E2ED 3258E6 LD (CMDNO),A
- E2F0 CD04E3 CALL TO09
- E2F3 3A5BE6 LD A,(PTOZ80) ;input chr
- E2F6 C9 RET
- ;
- E2F7 2159E6 CONOUTJ:LD HL,PTO09
- E2FA 71 LD (HL),C ;output chr
- E2FB 3E04 LD A,4
- E2FD 3258E6 LD (CMDNO),A
- E300 CD04E3 CALL TO09
- E303 C9 RET
- ;
- ;======================================
- ;goto 6809
- E304 F3 TO09: DI
- E305 AF XOR A
- E306 3205FD LD (0FD05H),A
- E309 00 NOP
- E30A FB EI
- E30B C9 RET
- ;======================================
- ;
- ;PRINTER OUT
- ;
- E30C C9 LISTJ: RET
- ;
- ;PUNCHER OUT(RS232C OUT)
- ;
- E30D 215FE6 PUNCHJ: LD HL,RSOUT
- E310 71 LD (HL),C ;output chr
- E311 3E06 LD A,6
- E313 3258E6 LD (CMDNO),A
- E316 CD04E3 CALL TO09
- E319 C9 RET
- ;
- ;READER IN
- ;
- E31A 3E07 READERJ:LD A,7
- E31C 3258E6 LD (CMDNO),A
- E31F CD04E3 CALL TO09
- E322 3A5DE6 LD A,(RSIN) ;A:input chr
- E325 C9 RET
- ;
- ;SEEK HOME POSITION
- ;
- E326 3A0400 HOMEJ: LD A,(TDRIVE) ;login disk
- E329 3259E6 LD (PTO09),A
- E32C 3E08 LD A,8
- E32E 3258E6 LD (CMDNO),A
- E331 CD04E3 CALL TO09
- E334 C9 RET
- ;
- ;SELECT DRIVE PARAMETER SET
- ;
- E335 210000 SELDSKJ:LD HL,0
- E338 79 LD A,C ;C:select drv no
- E339 FE04 CP 04 ;A,B:FD, C,D:WinDRV
- E33B D0 RET NC
- E33C 3256E6 LD (DRVNO),A
- E33F 6F LD L,A
- E340 29 ADD HL,HL ;*2
- E341 29 ADD HL,HL ;*4
- E342 29 ADD HL,HL ;*8
- E343 29 ADD HL,HL ;*16
- E344 1133E2 LD DE,DPBASE
- E347 19 ADD HL,DE
- E348 3E09 LD A,9
- E34A 3258E6 LD (CMDNO),A
- E34D CD04E3 CALL TO09
- E350 C9 RET
- ;
- ;SET TRKADRS
- ;
- E351 ED4350E6 SETTRKJ:LD (TRKADRS),BC ;BC:trk no
- E355 3E0A LD A,10
- E357 3258E6 LD (CMDNO),A
- E35A CD04E3 CALL TO09
- E35D C9 RET
- ;
- ;SET SCTADRS
- ;
- E35E ED4352E6 SETSECJ:LD (SCTADRS),BC ;BC:sct no
- E362 3E0B LD A,11
- E364 3258E6 LD (CMDNO),A
- E367 CD04E3 CALL TO09
- E36A C9 RET
- ;
- ;SET DMAADRS
- ;
- E36B 60 SETDMAJ:LD H,B ;BC:top adr of dma buffer
- E36C 69 LD L,C
- E36D 2254E6 LD (DMAADRS),HL
- E370 AF XOR A ;?
- E371 C9 RET
- ;
- ;READ SECTOR
- ;
- E372 3E0D READJ: LD A,13
- E374 3258E6 LD (CMDNO),A
- E377 CD04E3 CALL TO09
- E37A 3A5BE6 LD A,(PTOZ80) ;0:normal, 1:error
- E37D C9 RET
- ;
- ;WRITE SECTOR
- ;
- E37E 3E0E WRITEJ: LD A,14
- E380 3258E6 LD (CMDNO),A
- E383 CD04E3 CALL TO09
- E386 3A5BE6 LD A,(PTOZ80) ;0:normal, 1:error
- E389 C9 RET
- ;
- ;PRINTER STATUS
- ;
- E38A C9 PRSTATJ: RET
- ;
- ;sector translator
- ;
- E38B 69 SECTRNJ:LD L,C
- E38C 60 LD H,B
- E38D C9 RET;
- ;
- E38E 3EFF ZREENTJ:LD A,0FFH
- E390 3258E6 LD (CMDNO),A
- E393 CD04E3 CALL TO09
- E396 C30010 JP 1000H
- ;*
- E399 END
◎BIOS09です。自作のクロスアセンブラでアセンブルしています。
- 0001 *
- 0002 * MY BIOS09 for FM-7 CP/M-80 58K SYSTEM
- 0003 *
- 0004 *;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- 0005 E282 SETENTRY EQU $E282
- 0006 D406 FBASE EQU $D406 ;BDOS ENTRY POINT
- 0007 E233 DPBASE EQU $E233 ;DISK PARAMETER HEADER BASE
- 0008 0004 TDRIVE EQU $04
- 0009 0080 TBUFF EQU $80 ;i/o buffer and command line storage.
- 0010 E650 TRKADRS EQU $E650
- 0011 E652 SCTADRS EQU $E652
- 0012 E654 DMAADRS EQU $E654
- 0013 E656 DRVNO EQU $E656
- 0014 E658 CMDNO EQU $E658 ;command no
- 0015 E659 PTO09 EQU $E659 ;parameter to 6809 from Z80
- 0016 E65B PTOZ80 EQU $E65B ;parameter to Z80 from 6809
- 0017 E65D RSIN EQU $E65D
- 0018 E65F RSOUT EQU $E65F
- 0019 E661 KCSAVE EQU $E661 ;for keycode save
- 0020 E662 CONSTDT EQU $E662
- 0021 E664 XSAV EQU $E664 ;X save
- 0022 E666 CSUM EQU $E666 ;check sum
- 0023 E667 TRK EQU $E667
- 0024 E668 SCT EQU $E668
- 0025 E669 SCTCT EQU $E669 ;sct no counter
- 0026 E66A RTRYCT EQU $E66A ;retry counter
- 0027 E700 RCBBUF EQU $E700 ;BIOS buffer
- 0028 *;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- 0029
- 0030 E800 ORG $E800
- 0031 *
- 0032 FD18 FDC EQU $FD18
- 0033 FD05 HLTREG EQU $FD05 ;for sub system use
- 0034 FD0F BANK EQU $FD0F BANK (read:ROM, write:RAM)
- 0035 0006 ACK EQU $06 ;
- 0036 0015 NAK EQU $15 ;
- 0037 001B ESC EQU $1B ;
- 0038 CC00 CPMTOP EQU $CC00
- 0039 0016 SCTCNT EQU 22 ;sct no of ccp,bdos
- 0040
- 0041 *USART 8251A
- 0042 FD06 SDATA EQU $FD06 ;DATA
- 0043 FD07 SCMD EQU SDATA+1 ;CMD
- 0044 FD07 SSTS EQU SDATA+1 ;STATUS
- 0045
- 0046 0040 MRSTU EQU $40 ;master reset
- 0047 004E MODEU EQU $4E ;1stopbit,non pari,8bit,16x
- 0048 0015 CLRTSU EQU $15 ;RTS=H,ER,RxE,TxEN
- 0049 0034 SERTSUR EQU $34 ;RTS=L,ER,RxE for receive
- 0050 0031 SERTSUS EQU $31 ;RTS=L,ER,TxEN for trans
- 0051 0004 TXEMPTY EQU $04
- 0052
- 0053 E800 START EQU *
- 0054 *initialize
- 0055 E800 4F CLRA
- 0056 E801 1F 8B TFR A,DP
- 0057 E803 B7 FD0F STA BANK to RAM mode
- 0058 * reset 8251A
- 0059 E806 4F CLRA
- 0060 E807 B7 FD07 STA SCMD
- 0061 E80A B7 FD07 STA SCMD
- 0062 E80D B7 FD07 STA SCMD
- 0063 E810 86 40 LDA #MRSTU ;reset
- 0064 E812 B7 FD07 STA SCMD
- 0065 E815 86 4E LDA #MODEU ;1stop,nonpari,8bit,16x
- 0066 E817 B7 FD07 STA SCMD
- 0067 * set command to 8251A
- 0068 E81A 86 15 LDA #CLRTSU ;RTS=H,ER,RxE,DTR,TxEN
- 0069 E81C B7 FD07 STA SCMD
- 0070
- 0071 *init screen
- 0072 E81F 17 00C7 LBSR HALT
- 0073 E822 34 06 PSHS A,B
- 0074 E824 8E EB4C LDX #CONINI
- 0075 E827 108E FC82 LDY #$FC82
- 0076 E82B C6 09 LDB #9
- 0077 E82D A6 80 ISLOP LDA ,X+
- 0078 E82F A7 A0 STA ,Y+
- 0079 E831 5A DECB
- 0080 E832 26 F9 BNE ISLOP
- 0081 E834 17 00D3 LBSR SUBRST
- 0082 E837 35 06 PULS A,B
- 0083 *console control
- 0084 E839 17 00AD LBSR HALT
- 0085 E83C 34 06 PSHS A,B
- 0086 E83E 8E FC82 LDX #$FC82
- 0087 E841 CC 0C03 LDD #$0C03 autoLF:off,cursor:on
- 0088 E844 ED 84 STD ,X
- 0089 E846 17 00C1 LBSR SUBRST
- 0090 E849 35 06 PULS A,B
- 0091 *start message
- 0092 E84B 17 009B LBSR HALT
- 0093 E84E 34 06 PSHS A,B
- 0094 E850 8E EB55 LDX #STTMSG
- 0095 E853 108E FC81 LDY #$FC81
- 0096 E857 C6 27 LDB #39
- 0097 E859 A6 80 STLOP2 LDA ,X+
- 0098 E85B A7 A0 STA ,Y+
- 0099 E85D 5A DECB
- 0100 E85E 26 F9 BNE STLOP2
- 0101 E860 17 00A7 LBSR SUBRST
- 0102 E863 35 06 PULS A,B
- 0103
- 0104 *set Z80 cold start
- 0105 *write to $0000
- 0106 E865 8E 0000 LDX #0
- 0107 E868 86 C3 LDA #$C3
- 0108 E86A A7 80 STA ,X+
- 0109 E86C CC E282 LDD #SETENTRY
- 0110 E86F 1E 89 EXG A,B
- 0111 E871 ED 81 STD ,X++
- 0112 *clr IOBYTE,login disk
- 0113 E873 4F CLRA
- 0114 E874 A7 80 STA ,X+
- 0115 E876 A7 80 STA ,X+
- 0116
- 0117 *go to Z80
- 0118 E878 TOZ80 EQU *
- 0119 E878 8E FD05 LDX #$FD05
- 0120 E87B 86 01 LDA #1
- 0121 E87D A7 84 STA ,X
- 0122 E87F 12 NOP
- 0123
- 0124 *from Z80
- 0125 *console control
- 0126 E880 17 0066 LBSR HALT
- 0127 E883 34 06 PSHS A,B
- 0128 E885 8E FC82 LDX #$FC82
- 0129 E888 CC 0C03 LDD #$0C03 autoLF:off,cursor:on
- 0130 E88B ED 84 STD ,X
- 0131 E88D 17 007A LBSR SUBRST
- 0132 E890 35 06 PULS A,B
- 0133
- 0134 *****************************
- 0135 E892 B6 E658 CMDIN LDA CMDNO
- 0136 E895 81 01 CMPA #1 ;WBOOT
- 0137 E897 1027 0409 LBEQ RELOAD
- 0138 E89B 81 02 CMPA #2
- 0139 E89D 27 71 BEQ CONST
- 0140 E89F 81 03 CMPA #3
- 0141 E8A1 1027 0090 LBEQ CONIN
- 0142 E8A5 81 04 CMPA #4
- 0143 E8A7 1027 00AF LBEQ CONOUT
- 0144 E8AB 81 05 CMPA #5
- 0145 E8AD 1027 00C0 LBEQ LIST
- 0146 E8B1 81 06 CMPA #6
- 0147 E8B3 1027 00C3 LBEQ PUNCH
- 0148 E8B7 81 07 CMPA #7
- 0149 E8B9 1027 00C6 LBEQ READER
- 0150 E8BD 81 08 CMPA #8
- 0151 E8BF 1027 00C9 LBEQ HOME
- 0152 E8C3 81 09 CMPA #9
- 0153 E8C5 1027 00FB LBEQ SELDSK
- 0154 E8C9 81 0A CMPA #10
- 0155 E8CB 1027 0108 LBEQ SETTRK
- 0156 E8CF 81 0B CMPA #11
- 0157 E8D1 1027 0149 LBEQ SETSEC
- 0158 * CMPA #12
- 0159 * LBEQ SETDMA
- 0160 E8D5 81 0D CMPA #13
- 0161 E8D7 1027 0178 LBEQ READ
- 0162 E8DB 81 0E CMPA #14
- 0163 E8DD 1027 0206 LBEQ WRITE
- 0164 E8E1 81 0F CMPA #15
- 0165 E8E3 1027 025E LBEQ LISTST
- 0166 * CMPA #16
- 0167 * LBEQ SECTRAN
- 0168 E8E7 20 8F BRA TOZ80
- 0169 *****************************
- 0170 *--------------------------------------
- 0171 *HALT SUB-SYSTEM
- 0172 E8E9 1A 40 HALT ORCC #$40 firq disable
- 0173 E8EB 34 02 PSHS A
- 0174 E8ED B6 FD05 HALT2 LDA HLTREG
- 0175 E8F0 2B FB BMI HALT2
- 0176 E8F2 86 80 LDA #$80 b0:0(6809) subCPU halt
- 0177 E8F4 B7 FD05 STA HLTREG
- 0178 E8F7 B6 FD05 HALT3 LDA HLTREG
- 0179 E8FA 2A FB BPL HALT3
- 0180 E8FC 35 82 PULS A,PC
- 0181
- 0182 *RESTART SUB-SYSTEM
- 0183 E8FE 34 02 RDYREQ PSHS A
- 0184 E900 B6 FC80 LDA $FC80
- 0185 E903 8A 80 ORA #$80
- 0186 E905 B7 FC80 STA $FC80
- 0187 E908 35 02 PULS A
- 0188 *
- 0189 E90A 7F FD05 SUBRST CLR HLTREG subCPU restart
- 0190 E90D 1C AF ANDCC #$AF firq enable
- 0191 E90F 39 RTS
- 0192 *--------------------------------------
- 0193 *console status check
- 0194 E910 CONST EQU * ;2
- 0195 E910 8D D7 BSR HALT
- 0196 E912 34 04 PSHS B
- 0197 E914 CC 2902 LDD #$2902
- 0198 E917 FD FC82 STD $FC82
- 0199 E91A 8D EE BSR SUBRST
- 0200 E91C 8D CB BSR HALT
- 0201 E91E 5F CLRB ;$00
- 0202 E91F B6 FC84 LDA $FC84 ;0:none or 1
- 0203 E922 27 04 BEQ CS1
- 0204 E924 B6 FC83 LDA $FC83
- 0205 E927 5A DECB ;$ff
- 0206 E928 B7 E661 CS1 STA KCSAVE ;0 or keycode
- 0207 E92B F7 E65B STB PTOZ80 ;0 or $ff
- 0208 E92E 8D CE BSR RDYREQ
- 0209 E930 35 04 PULS B
- 0210 E932 16 FF43 LBRA TOZ80
- 0211
- 0212 *console input
- 0213 E935 CONIN EQU * ;3
- 0214 E935 B6 E661 LDA KCSAVE 0:none !0:keycode
- 0215 E938 27 05 BEQ CON1
- 0216 E93A B7 E65B STA PTOZ80
- 0217 E93D 20 18 BRA CON2
- 0218 E93F 8D A8 CON1 BSR HALT
- 0219 E941 34 04 PSHS B
- 0220 E943 CC 2903 LDD #$2903
- 0221 E946 FD FC82 STD $FC82
- 0222 E949 8D BF BSR SUBRST
- 0223 E94B 8D 9C BSR HALT
- 0224 E94D B6 FC83 LDA $FC83
- 0225 E950 B7 E65B STA PTOZ80
- 0226 E953 8D A9 BSR RDYREQ
- 0227 E955 35 04 PULS B
- 0228 E957 16 FF1E CON2 LBRA TOZ80
- 0229
- 0230 *console output
- 0231 E95A CONOUT EQU * ;4
- 0232 E95A B6 E659 LDA PTO09
- 0233 E95D 8D 8A BSR HALT
- 0234 E95F 34 06 PSHS A,B
- 0235 E961 B7 FC84 STA $FC84
- 0236 E964 CC 0301 LDD #$0301
- 0237 E967 FD FC82 STD $FC82
- 0238 E96A 8D 9E BSR SUBRST
- 0239 E96C 35 06 PULS A,B
- 0240 E96E 16 FF07 LBRA TOZ80
- 0241
- 0242 *
- 0243 E971 LIST EQU * ;5
- 0244 E971 B6 E659 LDA PTO09
- 0245 E974 17 030A LBSR SNDCH
- 0246 E977 16 FEFE LBRA TOZ80
- 0247
- 0248 *
- 0249 E97A PUNCH EQU * ;6
- 0250 E97A B6 E65F LDA RSOUT
- 0251 E97D 17 0301 LBSR SNDCH ;rs232c
- 0252 E980 16 FEF5 LBRA TOZ80
- 0253
- 0254 *
- 0255 E983 READER EQU * ;7
- 0256 E983 17 02E2 LBSR RCVCH ;rs232c
- 0257 E986 B7 E65D STA RSIN
- 0258 E989 16 FEEC LBRA TOZ80
- 0259
- 0260 *
- 0261 *PTO09 : login dsk
- 0262 E98C HOME EQU * ;8
- 0263 E98C B6 E659 LDA PTO09 login disk
- 0264 E98F 81 02 CMPA #2
- 0265 E991 24 02 BHS HOM1
- 0266 E993 8D 03 HRSLOP BSR RESTR
- 0267 * TSTB
- 0268 * BNE HRSLOP
- 0269 E995 16 FEE0 HOM1 LBRA TOZ80
- 0270
- 0271 *
- 0272 *A:DRV NO
- 0273 E998 RESTR EQU *
- 0274 E998 8A 80 ORA #$80
- 0275 E99A B7 FD1D STA FDC+5 drv
- 0276 E99D 8D 72 BSR DELAY
- 0277 E99F 4F CLRA trk=0
- 0278 E9A0 B1 FD19 CMPA FDC+1 present trk = target trk?
- 0279 E9A3 27 1E BEQ RES1
- 0280 E9A5 B7 FD1B STA FDC+3 set target trk
- 0281 E9A8 8D 67 BSR DELAY
- 0282 E9AA 86 1E LDA #$1E SEEK CMD
- 0283 E9AC 1A 50 ORCC #$50
- 0284 E9AE B7 FD18 STA FDC
- 0285 E9B1 8D 5E BSR DELAY
- 0286 E9B3 17 0187 LBSR WAIT B:status
- 0287 E9B6 34 14 PSHS B,X
- 0288 E9B8 8E 2260 LDX #8800
- 0289 E9BB 30 1F RESLOP LEAX -1,X
- 0290 E9BD 26 FC BNE RESLOP
- 0291 E9BF 35 14 PULS B,X
- 0292 * BITB #$18 SEEK ERROR,CRC ERROR
- 0293 * STB PTOZ80 !0:error
- 0294 E9C1 1C AF ANDCC #$AF
- 0295 E9C3 39 RES1 RTS
- 0296
- 0297 *
- 0298 E9C4 SELDSK EQU * ;9
- 0299 *DRVNO : drv no
- 0300 * LBSR WAIT busy?
- 0301 E9C4 B6 E656 LDA DRVNO
- 0302 E9C7 84 03 ANDA #$3
- 0303 E9C9 81 02 CMPA #2
- 0304 E9CB 24 07 BHS SEL1
- 0305 E9CD 8A 80 ORA #$80 motor on
- 0306 E9CF B7 FD1D STA FDC+5 drv
- 0307 E9D2 8D 3D BSR DELAY
- 0308 E9D4 16 FEA1 SEL1 LBRA TOZ80
- 0309
- 0310 *
- 0311 E9D7 SETTRK EQU * ;10
- 0312 * LDA DRVNO
- 0313 * ORA #$80
- 0314 * STA FDC+5 drv
- 0315 E9D7 B6 E656 LDA DRVNO
- 0316 E9DA 84 03 ANDA #3
- 0317 E9DC 81 02 CMPA #2
- 0318 E9DE 24 02 BHS SET1
- 0319 E9E0 8D 03 BSR TRKSET
- 0320 E9E2 16 FE93 SET1 LBRA TOZ80
- 0321
- 0322 *
- 0323 E9E5 TRKSET EQU *
- 0324 E9E5 17 0155 LBSR WAIT busy?
- 0325 E9E8 B6 E650 LDA TRKADRS
- 0326 E9EB B1 FD19 CMPA FDC+1 present trk = target trk?
- 0327 E9EE 27 20 BEQ TRK1
- 0328 E9F0 B7 FD1B STA FDC+3 set target trk
- 0329 E9F3 8D 1C BSR DELAY
- 0330 E9F5 86 1E LDA #$1E SEEK CMD
- 0331 E9F7 1A 50 ORCC #$50
- 0332 E9F9 B7 FD18 STA FDC
- 0333 E9FC 8D 13 BSR DELAY
- 0334 E9FE 17 013C LBSR WAIT B:status
- 0335 EA01 34 14 PSHS B,X
- 0336 EA03 8E 2260 LDX #8800
- 0337 EA06 30 1F TRKLOP LEAX -1,X
- 0338 EA08 26 FC BNE TRKLOP
- 0339 EA0A 35 14 PULS B,X
- 0340 EA0C C5 18 BITB #$18 error check
- 0341 EA0E 1C AF ANDCC #$AF
- 0342 EA10 39 TRK1 RTS
- 0343
- 0344 *
- 0345 EA11 17 0003 DELAY LBSR DEL14
- 0346 EA14 17 0000 LBSR DEL14
- 0347 EA17 17 0003 DEL14 LBSR DEL
- 0348 EA1A 17 0000 LBSR DEL
- 0349 EA1D 39 DEL RTS
- 0350
- 0351 *
- 0352 EA1E SETSEC EQU * ;11
- 0353 EA1E B6 E656 LDA DRVNO
- 0354 EA21 84 03 ANDA #3
- 0355 EA23 81 02 CMPA #2
- 0356 EA25 24 0F BHS SETS1
- 0357 EA27 17 0113 LBSR WAIT busy?
- 0358 EA2A 8D 0D BSR SETSCT ;A:sct,B:side,BUFHL:0or1
- 0359 EA2C B7 FD1A STA FDC+2
- 0360 EA2F 8D E0 BSR DELAY
- 0361 EA31 F7 FD1C STB FDC+4
- 0362 EA34 8D DB BSR DELAY
- 0363 EA36 16 FE3F SETS1 LBRA TOZ80
- 0364
- 0365 *
- 0366 *return A:sct,B:side,BUFHL:0or1
- 0367 EA39 SETSCT EQU *
- 0368 EA39 5F CLRB
- 0369 EA3A 7F EA52 CLR BUFHL
- 0370 EA3D B6 E652 LDA SCTADRS sct
- 0371 EA40 85 01 BITA #$01
- 0372 EA42 27 04 BEQ SE1
- 0373 EA44 4A DECA
- 0374 EA45 7C EA52 INC BUFHL 0:even, 1:odd
- 0375 EA48 44 SE1 LSRA
- 0376 EA49 4C INCA
- 0377 EA4A 81 10 CMPA #16
- 0378 EA4C 23 03 BLS SE2
- 0379 EA4E 80 10 SUBA #16
- 0380 EA50 5C INCB
- 0381 EA51 39 SE2 RTS
- 0382 *
- 0383 EA52 00 BUFHL FCB 0 ;flag upper/lower 128bytes in buffer
- 0384
- 0385 *
- 0386 *SETDMA EQU * ;12
- 0387
- 0388 *
- 0389 EA53 READ EQU * ;13
- 0390 EA53 B6 E656 LDA DRVNO
- 0391 EA56 84 03 ANDA #3
- 0392 EA58 81 02 CMPA #2 ;drive C:,D;?
- 0393 EA5A 1024 011E LBHS RDWDRV ;read windows virtual drive
- 0394
- 0395 *----- read fdd -----
- 0396 *read 256bytes
- 0397 EA5E 8D 26 BSR READSUB
- 0398 *set read data to buffer
- 0399 EA60 8E E700 RE0 LDX #RCBBUF
- 0400 EA63 7D EA52 TST BUFHL ;0:even, 1:odd
- 0401 EA66 27 03 BEQ RE1
- 0402 EA68 C6 80 LDB #128
- 0403 EA6A 3A ABX ;rcbbuf+128
- 0404 EA6B 34 06 RE1 PSHS D
- 0405 EA6D FC E654 LDD DMAADRS
- 0406 EA70 1E 89 EXG A,B
- 0407 EA72 1F 02 TFR D,Y
- 0408 EA74 35 06 PULS D
- 0409 EA76 C6 80 LDB #128
- 0410 EA78 A6 80 RLOP LDA ,X+
- 0411 EA7A A7 A0 STA ,Y+
- 0412 EA7C 5A DECB
- 0413 EA7D 26 F9 BNE RLOP
- 0414 EA7F 4F CLRA *no error
- 0415 EA80 B7 E65B STA PTOZ80
- 0416 EA83 16 FDF2 LBRA TOZ80
- 0417
- 0418 *
- 0419 EA86 READSUB EQU *
- 0420 EA86 17 00B4 LBSR WAIT not busy?
- 0421 EA89 8E E700 LDX #RCBBUF
- 0422 EA8C 17 FF56 LBSR TRKSET
- 0423 EA8F 17 FF7F LBSR DELAY
- 0424 EA92 8D A5 BSR SETSCT A:sct,B:side,BUFHL:0or1
- 0425 EA94 B7 FD1A STA FDC+2 sct
- 0426 EA97 17 FF77 LBSR DELAY
- 0427 EA9A F7 FD1C STB FDC+4 side
- 0428 EA9D 17 FF71 LBSR DELAY
- 0429 EAA0 B6 E656 LDA DRVNO
- 0430 EAA3 8A 80 ORA #$80 motor on
- 0431 EAA5 B7 FD1D STA FDC+5 drv
- 0432 EAA8 17 FF66 LBSR DELAY
- 0433 EAAB 86 8C LDA #$8C READ CMD
- 0434 EAAD 1A 50 ORCC #$50
- 0435 EAAF B7 FD18 STA FDC
- 0436 EAB2 F6 FD1F READ2 LDB FDC+7 DRQ,IRQ CHECK
- 0437 EAB5 C4 C0 ANDB #$C0
- 0438 EAB7 27 F9 BEQ READ2
- 0439 EAB9 2A 07 BPL READ3 IRQ?
- 0440 EABB B6 FD1B LDA FDC+3 DRQ? data
- 0441 EABE A7 80 STA ,X+
- 0442 EAC0 20 F0 BRA READ2
- 0443 EAC2 8D 79 READ3 BSR WAIT
- 0444 * BITB #$1C RECORD NOT FOUND,CRC ERROR,LOST DATA
- 0445 EAC4 1C AF ANDCC #$AF
- 0446 EAC6 39 RTS
- 0447 *
- 0448 *set write data to buffer
- 0449 EAC7 WRDTSET EQU *
- 0450 EAC7 8E E700 WRD0 LDX #RCBBUF
- 0451 EACA 7D EA52 TST BUFHL ;0:even, 1:odd
- 0452 EACD 27 03 BEQ WRD1
- 0453 EACF C6 80 LDB #128
- 0454 EAD1 3A ABX
- 0455 EAD2 34 06 WRD1 PSHS D
- 0456 EAD4 FC E654 LDD DMAADRS
- 0457 EAD7 1E 89 EXG A,B
- 0458 EAD9 1F 02 TFR D,Y
- 0459 EADB 35 06 PULS D
- 0460 EADD C6 80 LDB #128
- 0461 EADF A6 A0 WRDLOP LDA ,Y+
- 0462 EAE1 A7 80 STA ,X+
- 0463 EAE3 5A DECB
- 0464 EAE4 26 F9 BNE WRDLOP
- 0465 EAE6 39 RTS
- 0466 *
- 0467 EAE7 WRITE EQU * ;14
- 0468 EAE7 B6 E656 LDA DRVNO
- 0469 EAEA 84 03 ANDA #3
- 0470 EAEC 81 02 CMPA #2 ;drive C:,D;?
- 0471 EAEE 1024 0113 LBHS WRWDRV ;write windows virtual drive
- 0472
- 0473 *----- write fdd -----
- 0474 *read 256bytes
- 0475 EAF2 8D 92 BSR READSUB
- 0476 *set write data 128bytes
- 0477 EAF4 8D D1 BSR WRDTSET
- 0478 *write
- 0479 EAF6 8D 45 BSR WAIT not busy?
- 0480 EAF8 8E E700 LDX #RCBBUF
- 0481 EAFB 17 FEE7 LBSR TRKSET
- 0482 EAFE 17 FF10 LBSR DELAY
- 0483 EB01 17 FF35 LBSR SETSCT ;A:sct,B:side
- 0484 EB04 B7 FD1A STA FDC+2 sct
- 0485 EB07 17 FF07 LBSR DELAY
- 0486 EB0A F7 FD1C STB FDC+4 side
- 0487 EB0D 17 FF01 LBSR DELAY
- 0488 EB10 B6 E656 LDA DRVNO
- 0489 EB13 8A 80 ORA #$80
- 0490 EB15 B7 FD1D STA FDC+5 drv
- 0491 EB18 17 FEF6 LBSR DELAY
- 0492 EB1B 86 AC LDA #$AC WRITE CMD
- 0493 EB1D 1A 50 ORCC #$50
- 0494 EB1F B7 FD18 STA FDC
- 0495 EB22 A6 80 WRITE2 LDA ,X+
- 0496 EB24 F6 FD1F WRITE3 LDB FDC+7 DRQ,IRQ CHECK
- 0497 EB27 C4 C0 ANDB #$C0
- 0498 EB29 27 F9 BEQ WRITE3
- 0499 EB2B 2A 05 BPL WRITE4 irq?
- 0500 EB2D B7 FD1B STA FDC+3 drq? data write
- 0501 EB30 20 F0 BRA WRITE2
- 0502 EB32 30 1F WRITE4 LEAX -1,X
- 0503 EB34 8D 07 BSR WAIT
- 0504 EB36 C5 5C BITB #$5C error?
- 0505 EB38 1C AF ANDCC #$AF
- 0506 EB3A 16 FD3B LBRA TOZ80
- 0507
- 0508 *
- 0509 EB3D F6 FD18 WAIT LDB FDC
- 0510 EB40 C5 01 BITB #$01 busy?
- 0511 EB42 26 F9 BNE WAIT
- 0512 EB44 39 RTS
- 0513
- 0514 *
- 0515 EB45 LISTST EQU * ;15
- 0516 EB45 4F CLRA not ready
- 0517 EB46 B7 E65B STA PTOZ80
- 0518 EB49 16 FD2C LBRA TOZ80
- 0519
- 0520 *
- 0521 *SECTRAN EQU * ;16
- 0522
- 0523 *
- 0524 EB4C 01 CONINI FCB $01,$00,$50,$19,$00,$19,$00,$01,$00 ..9chrs
- 0525 *
- 0526 EB55 00 STTMSG FCC $00,$03,36,$0D,$0A,"FM-7 CP/M-80 Ver2.2 58K System",$0D,$0A,$0D,$0A ...39chars
- 0527 *
- 0528 *================================================
- 0529 *read windows virtual drive
- 0530 EB7C RDWDRV EQU *
- 0531 *read 256bytes
- 0532 EB7C 8D 03 BSR READSUB2
- 0533 EB7E 16 FEDF LBRA RE0
- 0534
- 0535 *read 256bytes
- 0536 EB81 READSUB2 EQU *
- 0537 EB81 7F E666 RDS0 CLR CSUM
- 0538 EB84 86 52 LDA #'R
- 0539 EB86 17 00F8 LBSR SNDCH read cmd
- 0540 EB89 8D 73 BSR ADDCS
- 0541 EB8B B6 E656 LDA DRVNO
- 0542 EB8E 17 00F0 LBSR SNDCH drv
- 0543 EB91 8D 6B BSR ADDCS
- 0544 EB93 B6 E650 LDA TRKADRS
- 0545 EB96 17 00E8 LBSR SNDCH trk
- 0546 EB99 8D 63 BSR ADDCS
- 0547 EB9B B6 E652 LDA SCTADRS
- 0548 EB9E 8D 4D BSR SETSCT2
- 0549 EBA0 17 00DE LBSR SNDCH sct
- 0550 EBA3 8D 59 BSR ADDCS
- 0551 EBA5 B6 E666 LDA CSUM
- 0552 EBA8 17 00D6 LBSR SNDCH csum
- 0553 *wait receive ACKorNAKorESC
- 0554 * if NAK then re-send 'R',Drv,Trk,Sct,csum
- 0555 * if ESC then error return
- 0556 * if ACK then next
- 0557 EBAB 17 00BA RDS1 LBSR RCVCH
- 0558 EBAE 81 15 CMPA #NAK
- 0559 EBB0 27 CF BEQ RDS0
- 0560 EBB2 81 1B CMPA #ESC
- 0561 EBB4 26 03 BNE RDS2
- 0562 EBB6 86 FF LDA #$FF *error
- 0563 EBB8 39 RTS *error end
- 0564 *
- 0565 EBB9 81 06 RDS2 CMPA #ACK
- 0566 EBBB 26 EE BNE RDS1
- 0567 * send ACK
- 0568 EBBD 17 00C1 LBSR SNDCH ACK
- 0569 *receive data(256bytes),csum
- 0570 * data is saved to Buffer(X)
- 0571 * if csum error then send NAK
- 0572 * if csum ok then send ACK and to next process
- 0573 EBC0 8E E700 RDS3 LDX #RCBBUF
- 0574 EBC3 5F CLRB counter(256)
- 0575 EBC4 7F E666 CLR CSUM
- 0576 EBC7 17 009E RDSLOP LBSR RCVCH data
- 0577 EBCA A7 80 STA ,X+
- 0578 EBCC 8D 30 BSR ADDCS
- 0579 EBCE 5A DECB
- 0580 EBCF 26 F6 BNE RDSLOP
- 0581 EBD1 17 0094 LBSR RCVCH csum
- 0582 EBD4 B1 E666 CMPA CSUM
- 0583 EBD7 27 07 BEQ RDS4
- 0584 EBD9 86 15 LDA #NAK
- 0585 EBDB 17 00A3 LBSR SNDCH NAK
- 0586 EBDE 20 E0 BRA RDS3
- 0587 *
- 0588 EBE0 86 06 RDS4 LDA #ACK
- 0589 EBE2 17 009C LBSR SNDCH ACK
- 0590 *wait receive ACK
- 0591 EBE5 17 0080 RDS5 LBSR RCVCH
- 0592 EBE8 81 06 CMPA #ACK
- 0593 EBEA 26 F9 BNE RDS5
- 0594 EBEC 39 RTS
- 0595 *
- 0596 *return A:sct,BUFHL:0or1
- 0597 EBED SETSCT2 EQU *
- 0598 EBED 7F EA52 CLR BUFHL
- 0599 EBF0 B6 E652 LDA SCTADRS ;sct
- 0600 EBF3 85 01 BITA #$01
- 0601 EBF5 27 04 BEQ SE21
- 0602 EBF7 4A DECA
- 0603 EBF8 7C EA52 INC BUFHL ;0:even, 1:odd
- 0604 EBFB 44 SE21 LSRA
- 0605 EBFC 4C INCA
- 0606 EBFD 39 RTS
- 0607 *
- 0608 *--------------------
- 0609 *add check sum
- 0610 EBFE ADDCS EQU *
- 0611 EBFE BB E666 ADDA CSUM
- 0612 EC01 B7 E666 STA CSUM
- 0613 EC04 39 RTS
- 0614 *--------------------
- 0615 *write windows virtual drive
- 0616 EC05 WRWDRV EQU *
- 0617 *read 256bytes
- 0618 EC05 17 FF79 LBSR READSUB2
- 0619 *set write data
- 0620 EC08 17 FEBC LBSR WRDTSET
- 0621 *write
- 0622 EC0B 7F E666 WRW2 CLR CSUM
- 0623 EC0E 86 57 LDA #'W
- 0624 EC10 8D 6F BSR SNDCH write cmd
- 0625 EC12 8D EA BSR ADDCS
- 0626 EC14 B6 E656 LDA DRVNO
- 0627 EC17 8D 68 BSR SNDCH drv
- 0628 EC19 8D E3 BSR ADDCS
- 0629 EC1B B6 E650 LDA TRKADRS
- 0630 EC1E 8D 61 BSR SNDCH trk
- 0631 EC20 8D DC BSR ADDCS
- 0632 EC22 B6 E652 LDA SCTADRS
- 0633 EC25 8D C6 BSR SETSCT2
- 0634 EC27 8D 58 BSR SNDCH sct
- 0635 EC29 8D D3 BSR ADDCS
- 0636 EC2B B6 E666 LDA CSUM
- 0637 EC2E 8D 51 BSR SNDCH csum
- 0638 *wait receive ACKorNAK
- 0639 * if NAK then re-send 'W',Drv,Trk,Sct,csum
- 0640 * if ESC then error return
- 0641 * if ACK then next
- 0642 EC30 8D 36 WRW3 BSR RCVCH
- 0643 EC32 81 15 CMPA #NAK
- 0644 EC34 27 D5 BEQ WRW2
- 0645 EC36 81 1B CMPA #ESC
- 0646 EC38 26 04 BNE WRW4
- 0647 EC3A 86 FF LDA #$FF *error
- 0648 EC3C 20 24 BRA WRW7 *error end
- 0649 *
- 0650 EC3E 81 06 WRW4 CMPA #ACK
- 0651 EC40 26 EE BNE WRW3
- 0652 *send data(256bytes),csum
- 0653 *data is in Buffer(X)
- 0654 EC42 8E E700 WRW5 LDX #RCBBUF
- 0655 EC45 5F CLRB counter(256)
- 0656 EC46 7F E666 CLR CSUM
- 0657 EC49 A6 80 WRWLOP2 LDA ,X+
- 0658 EC4B 8D 34 BSR SNDCH data
- 0659 EC4D 8D AF BSR ADDCS
- 0660 EC4F 5A DECB
- 0661 EC50 26 F7 BNE WRWLOP2
- 0662 EC52 B6 E666 LDA CSUM
- 0663 EC55 8D 2A BSR SNDCH csum
- 0664 *wait receive ACKorNAK
- 0665 * if NAK then re-send data(256bytes),csum
- 0666 * if ACK then next
- 0667 EC57 8D 0F WRW6 BSR RCVCH
- 0668 EC59 81 15 CMPA #NAK
- 0669 EC5B 27 E5 BEQ WRW5
- 0670 EC5D 81 06 CMPA #ACK
- 0671 EC5F 26 F6 BNE WRW6
- 0672 EC61 4F CLRA *no error
- 0673 EC62 B7 E65B WRW7 STA PTOZ80
- 0674 EC65 16 FC10 LBRA TOZ80
- 0675 *
- 0676 *======================================
- 0677 * receive from serial port
- 0678 * (use USART 8251A)
- 0679 * A <- port
- 0680 *
- 0681 EC68 RCVCH EQU *
- 0682 EC68 86 34 LDA #SERTSUR ;RTS=L
- 0683 EC6A B7 FD07 STA SCMD
- 0684 EC6D 12 NOP
- 0685 EC6E B6 FD07 RCV1 LDA SSTS
- 0686 EC71 47 ASRA
- 0687 EC72 47 ASRA
- 0688 EC73 24 F9 BCC RCV1
- 0689 EC75 B6 FD06 LDA SDATA ;get data
- 0690 EC78 34 02 PSHS A
- 0691 EC7A 86 15 LDA #CLRTSU ;RTS=H
- 0692 EC7C B7 FD07 STA SCMD
- 0693 EC7F 35 82 PULS A,PC
- 0694 *
- 0695 *--------------------------------------
- 0696 * send to serial port
- 0697 * (use USART 8251A)
- 0698 * port <- A
- 0699 *
- 0700 EC81 SNDCH EQU *
- 0701 EC81 34 02 PSHS A
- 0702 EC83 86 31 LDA #SERTSUS ;RTS=L
- 0703 EC85 B7 FD07 STA SCMD
- 0704 EC88 12 NOP
- 0705 EC89 B6 FD07 SND1 LDA SSTS
- 0706 EC8C 47 ASRA
- 0707 EC8D 24 FA BCC SND1
- 0708 EC8F 35 02 PULS A
- 0709 EC91 B7 FD06 STA SDATA ;send data
- 0710 EC94 34 02 PSHS A
- 0711 EC96 B6 FD07 SND2 LDA SSTS
- 0712 EC99 85 04 BITA #TxEMPTY
- 0713 EC9B 27 F9 BEQ SND2
- 0714 EC9D 86 15 LDA #CLRTSU ;RTS=H
- 0715 EC9F B7 FD07 STA SCMD
- 0716 ECA2 35 82 PULS A,PC
- 0717 *
- 0718 *================================================
- 0719 *WBOOT : reload CCP,BDOS
- 0720 ECA4 RELOAD EQU *
- 0721 *restore
- 0722 ECA4 4F RELOP CLRA drv=0
- 0723 ECA5 17 FCF0 LBSR RESTR
- 0724 * TSTB
- 0725 * BNE RELOP
- 0726 *dread
- 0727 ECA8 4F CLRA
- 0728 ECA9 B7 FD1C STA FDC+4 side 0
- 0729 ECAC B7 FD19 STA FDC+1 start trk=0
- 0730 ECAF 8A 80 ORA #$80 motor on
- 0731 ECB1 B7 FD1D STA FDC+5 drv
- 0732 ECB4 86 03 LDA #3
- 0733 ECB6 B7 FD1A STA FDC+2 start sct=3
- 0734
- 0735 ECB9 86 16 LDA #SCTCNT
- 0736 ECBB B7 E669 STA SCTCT
- 0737 ECBE 108E CC00 LDY #CPMTOP
- 0738 ECC2 8E E700 DRDLOP LDX #RCBBUF
- 0739 ECC5 8D 3A BSR RD1SCT read 1 sct
- 0740 * TSTB error?
- 0741 * BNE DRDERR
- 0742 ECC7 7A E669 DR0 DEC SCTCT
- 0743 ECCA 27 16 BEQ DRDEND
- 0744 ECCC B6 E668 LDA SCT
- 0745 ECCF 4C INCA
- 0746 ECD0 81 20 CMPA #32 maxsct?
- 0747 ECD2 23 05 BLS DR1
- 0748 ECD4 7C E667 INC TRK next trk
- 0749 ECD7 86 01 LDA #1 sct
- 0750 ECD9 B7 E668 DR1 STA SCT
- 0751 ECDC 31A9 0100 LEAY 256,Y
- 0752 ECE0 20 E0 BRA DRDLOP
- 0753 *
- 0754 ECE2 DRDEND
- 0755 ECE2 16 FB93 LBRA TOZ80
- 0756
- 0757 ECE5 DRDERR EQU *
- 0758 ECE5 C1 0A CMPB #10 drive not ready error?
- 0759 ECE7 27 16 BEQ EREND
- 0760 ECE9 C1 0B DRE1 CMPB #11 disk write protected error?
- 0761 ECEB 27 12 BEQ EREND
- 0762 ECED DRE2 EQU * retry
- 0763 ECED C6 0A LDB #10
- 0764 ECEF F7 E66A STB RTRYCT
- 0765 ECF2 B6 E656 DRELOP LDA DRVNO
- 0766 ECF5 17 FCA0 LBSR RESTR
- 0767 * TSTB
- 0768 * BNE DRELOP
- 0769 ECF8 8D 07 BSR RD1SCT
- 0770 * TSTB
- 0771 * BEQ DR0
- 0772 ECFA 7A E66A DEC RTRYCT
- 0773 ECFD 26 F3 BNE DRELOP
- 0774 ECFF EREND EQU *
- 0775 ECFF 20 E1 BRA DRDEND
- 0776 *
- 0777 *read 1 sct from disk
- 0778 ED01 RD1SCT EQU *
- 0779 ED01 17 FE39 LBSR WAIT not busy?
- 0780 ED04 17 FCDE LBSR TRKSET
- 0781 ED07 17 FD2F LBSR SETSCT
- 0782 ED0A B7 FD1A STA FDC+2 sct
- 0783 ED0D F7 FD1C STB FDC+4 side
- 0784 ED10 B6 E656 LDA DRVNO
- 0785 ED13 8A 80 ORA #$80
- 0786 ED15 B7 FD1D STA FDC+5 drv
- 0787 ED18 86 8C LDA #$8C READ CMD
- 0788 ED1A 1A 50 ORCC #$50
- 0789 ED1C B7 FD18 STA FDC
- 0790 ED1F F6 FD1F RD12 LDB FDC+7 DRQ,IRQ CHECK
- 0791 ED22 C4 C0 ANDB #$C0
- 0792 ED24 27 F9 BEQ RD12
- 0793 ED26 2A 07 BPL RD13 IF IRQ
- 0794 ED28 B6 FD1B LDA FDC+3 IF DRQ
- 0795 ED2B A7 80 STA ,X+
- 0796 ED2D 20 F0 BRA RD12
- 0797 ED2F 17 FE0B RD13 LBSR WAIT
- 0798 * BITB #$1C RECORD NOT FOUND,CRC ERROR,LOST DATA
- 0799 ED32 1C AF ANDCC #$AF
- 0800 ED34 39 RTS
- 0801
- 0802 *=================================================
上記のソフトはまだ制作途中ということで、エラー処理などは不十分ですのでディスクアクセスに失敗などするとハングアップしたりします。
ということで、不具合はありますが何とか使える状態なので、今は、最近入手した「応用CP/M 村瀬康治著」中のシステムコールの実習を一つずつ走らせて確認しているところです。
なお、仮想ドライブ構築ソフトCpmDrvWin.exeですが、もうしばらく使用して不具合が出ないかを確認してから公開する予定です。