5 MSIZE = 20 ; memory size
6 NDRIVES = 2 ; number of drives
7 TTY_D = 0x10 ; usart data port
8 TTY_S = 0x11 ; usart status port
9 ROMDISK = 0x0f ; romdisk port
12 BIAS = (MSIZE-20)*1024 ; address offset from 0x3400
13 CCP = (0x3400+BIAS) ; ccp base
14 BDOS = (CCP+0x806) ; bdos base
15 BIOS = (CCP+0x1600) ; bios base
16 NSECTS = (BIOS-CCP)/128 ; sector count for CCP+BDOS
18 IOBYTE = 3 ; address of IOBYTE
19 CDISK = 4 ; address of CDISK
21 ;============================================================================
27 ;============================================================================
32 JP CONST ; CONSOLE STATUS
33 JP CONIN ; CONSOLE CHARACTER IN
34 JP CONOUT ; CONSOLE CHARACTER OUT
35 JP LIST ; LIST CHARACTER OUT
36 JP PUNCH ; PUNCH CHARACTER OUT
37 JP READER ; READER CHARACTER IN
38 JP HOME ; MOVE HEAD TO HOME
39 JP SELDSK ; SELECT DISK
40 JP SETTRK ; SET TRACK NUMBER
41 JP SETSEC ; SET SECTOR NUMBER
42 JP SETDMA ; SET DMA ADDRESS
45 JP LISTST ; RETURN LIST STATUS
46 JP SECTRAN ; SECTOR TRANSLATE
48 ;============================================================================
52 .dw 0x0000, 0x0000, 0x0000, 0x0000
53 .dw DIRBF, DPB_A, 0x0000, ALV_A
56 .dw 0x0000, 0x0000, 0x0000, 0x0000
57 .dw DIRBF, DPB_B, CHK_B, ALV_B
60 .dw 1 ; SPT -> 1 sector/track
61 .db 3, 7 ; BSH, BLM -> 1k blocksize
62 .db 0 ; EXM -> no extends
63 .dw 23 ; DSM -> 24 blocks
64 .dw 31 ; DRM -> 32 directory entries
65 .db 0x80,0x00 ; AL0/AL1 -> 1 block used for directory
66 .dw 0 ; CKS -> fixed disk (no change scratchpad)
67 .dw 44 ; OFF -> 44 reserved tracks (5.5 KB)
71 .db 26,0,3,7,0,242,0,63,0,192,0,16,0,2,0
73 ;============================================================================
75 MSG_SIGNON: .asciz "CP/M 2.2 CBIOS v0\r\n"
77 ;============================================================================
81 RET Z ; return if zero
107 ;============================================================================
113 LD (IOBYTE),A ; CON:TTY,RDR:TTY,PUN:TTY,LST:TTY
114 LD (CDISK),A ; drive A
117 ;============================================================================
120 LD HL, #CCP ; destination
121 LD C, #ROMDISK ; port
122 LD D, #(NSECTS) ; count sectors down
123 LD A, #0 ; count sectors up
125 OUT (C),A ; select track
126 LD B, #128 ; number of bytes
129 DEC D ; one sector less
134 ;============================================================================
136 LD A, #0xC3 ; JP opcode
137 LD (0), A ; ...at 0x0000
138 LD (5), A ; ...at 0x0005
140 LD (1), HL ; WBOOT pointer at 0x0001
142 LD (6), HL ; BDOS pointer at 0x0006
145 CALL SETDMA ; default DMA address 0x0080
147 EI ; enable interrupts
149 LD C, A ; set active drive
153 ;============================================================================
157 RET Z ; no data: A=0x00
161 ;============================================================================
165 IN A, (TTY_D) ; read data
166 AND #0x7F ; strip parity bit
169 ;============================================================================
172 OUT (TTY_D), A ; write data
175 ;============================================================================
179 ;============================================================================
183 ;============================================================================
189 ;============================================================================
192 JP SETTRK ; will return for us
194 ;============================================================================
195 ; select disk from C (0..15 => A..P)
196 ; return HL=dph or 0x0000 on error
198 ; check for valid drive
199 LD HL, #0 ; error code
201 LD (DISKNO), A ; select drive
203 RET NC ; return if >NDRIVES
205 ; put disk parameter header in HL
207 LD L, A ; drive number in HL
211 ADD HL, HL ; * sizeof(dph)
213 ADD HL, DE ; HL = table base + 16*drive
216 ;============================================================================
221 ;============================================================================
226 ;============================================================================
231 ;============================================================================
232 ; return A=0 on success, A=1 on error; do retry
235 OUT (ROMDISK),A ; select sector=track
237 LD HL,(DMAAD) ; select destination
238 LD C, #ROMDISK ; disk data port
239 LD B, #128 ; 128 bytes
245 ;============================================================================
246 ; return A=0 on success, A=1 on error; do retry
251 ;============================================================================
252 ; return A=0 if printer busy, A=0xFF otherwise
257 ;============================================================================
258 ; logical sector number in BC and translation table address in DE,
259 ; return physical sector in HL
264 ;============================================================================
265 ; VARIABLES AND SCRATCH RAM
266 DISKNO: .ds 1 ; selected disk
267 TRACK: .ds 2 ; selected track
268 SECTOR: .ds 2 ; selected sector
269 DMAAD: .ds 2 ; selected DMA address
271 DIRBF: .ds 128 ; shared directory buffer
272 ALV_A: .ds 3 ; allocation buffer for ROM DISK
273 CHK_B: .ds 16 ; FIXME
274 ALV_B: .ds 31 ; FIXME