CP/M Operating System Manual
CP/M Manual
Appendix A
The MDS Basic I/O System (BIOS)
NOTE
This appendix consists of a cross-reference listing
generated by the XREF utility from the results of
assembly with MAC. The original source file used to
generate this listing is available
here.
1 ; MDS-800 I/O DRIVERS FOR CP/M 2.2
2 ; (FOUR DRIVE SINGLE DENSITY VERSION)
3 ;
4 ; VERSION 2.2 FEBRUARY, 1980
5 ;
6 0016 = VERS EQU 22 ;VERSION 2.2
7 ;
8 ; COPYRIGHT (C) 1980
9 ; DIGITAL RESEARCH
10 ; BOX 579, PACIFIC GROVE
11 ; CALIFORNIA, 93950
12 ;
13 ;
14 FFFF = TRUE EQU 0FFFFH ;VALUE OF "TRUE"
15 0000 = FALSE EQU NOT TRUE ;"FALSE"
16 0000 = TEST EQU FALSE ;TRUE IF TEST BIOS
17 ;
18 IF TEST
19 BIAS EQU 03400H ;BASE OF CCP IN TEST SYSTEM
20 ENDIF
21 IF NOT TEST
22 0000 = BIAS EQU 0000H ;GENERATE RELOCATABLE CP/M SYSTEM
23 ENDIF
24 ;
25 1600 = PATCH EQU 1600H
26 ;
27 1600 ORG PATCH
28 0000 = CPMB EQU $-PATCH ;BASE OF CPM CONSOLE PROCESSOR
29 0806 = BDOS EQU 806H+CPMB ;BASIC DOS (RESIDENT PORTION)
30 1600 = CPML EQU $-CPMB ;LENGTH (IN BYTES) OF CPM SYSTEM
31 002C = NSECTS EQU CPML/128 ;NUMBER OF SECTORS TO LOAD
32 0002 = OFFSET EQU 2 ;NUMBER OF DISK TRACKS USED BY CP/M
33 0004 = CDISK EQU 0004H ;ADDRESS OF LAST LOGGED DISK ON WARM START
34 0080 = BUFF EQU 0080H ;DEFAULT BUFFER ADDRESS
35 000A = RETRY EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR
36 ;
37 ; PERFORM FOLLOWING FUNCTIONS
38 ; BOOT COLD START
39 ; WBOOT WARM START (SAVE I/O BYTE)
40 ; (BOOT AND WBOOT ARE THE SAME FOR MDS)
41 ; CONST CONSOLE STATUS
42 ; REG-A = 00 IF NO CHARACTER READY
43 ; REG-A = FF IF CHARACTER READY
44 ; CONIN CONSOLE CHARACTER IN (RESULT IN REG-A)
45 ; CONOUT CONSOLE CHARACTER OUT (CHAR IN REG-C)
46 ; LIST LIST OUT (CHAR IN REG-C)
47 ; PUNCH PUNCH OUT (CHAR IN REG-C)
48 ; READER PAPER TAPE READER IN (RESULT TO REG-A)
49 ; HOME MOVE TO TRACK 00
50 ;
51 ; (THE FOLLOWING CALLS SET-UP THE IO PARAMETER BLOCK FOR THE
52 ; MDS, WHICH IS USED TO PERFORM SUBSEQUENT READS AND WRITES)
53 ; SELDSK SELECT DISK GIVEN BY REG-C (0,1,2...)
54 ; SETTRK SET TRACK ADDRESS (0,...76) FOR SUBSEQUENT READ/WRITE
55 ; SETSEC SET SECTOR ADDRESS (1,...,26) FOR SUBSEQUENT READ/WRITE
56 ; SETDMA SET SUBSEQUENT DMA ADDRESS (INITIALLY 80H)
57 ;
58 ; (READ AND WRITE ASSUME PREVIOUS CALLS TO SET UP THE IO PARAMETERS)
59 ; READ READ TRACK/SECTOR TO PRESET DMA ADDRESS
60 ; WRITE WRITE TRACK/SECTOR FROM PRESET DMA ADDRESS
61 ;
62 ; JUMP VECTOR FOR INDIVIUAL ROUTINES
63 1600 C3B316 JMP BOOT
64 1603 C3C316 WBOOTE: JMP WBOOT
65 1606 C36117 JMP CONST
66 1609 C36417 JMP CONIN
67 160C C36A17 JMP CONOUT
68 160F C36D17 JMP LIST
69 1612 C37217 JMP PUNCH
70 1615 C37517 JMP READER
71 1618 C37817 JMP HOME
72 161B C37D17 JMP SELDSK
73 161E C3A717 JMP SETTRK
74 1621 C3AC17 JMP SETSEC
75 1624 C3BB17 JMP SETDMA
76 1627 C3C117 JMP READ
77 162A C3CA17 JMP WRITE
78 162D C37017 JMP LISTST ;LIST STATUS
79 1630 C3B117 JMP SECTRAN
80 ;
81 MACLIB DISKDEF ;LOAD THE DISK DEFINITION LIBRARY
82 DISKS 4 ;FOUR DISKS
83 1633+= DPBASE EQU $ ;BASE OF DISK PARAMETER BLOCKS
84 1633+82160000 DPE0: DW XLT0,0000H ;TRANSLATE TABLE
85 1637+00000000 DW 0000H,0000H ;SCRATCH AREA
86 163B+6E187316 DW DIRBUF,DPB0 ;DIR BUFF,PARM BLOCK
87 163F+0D19EE18 DW CSV0,ALV0 ;CHECK, ALLOC VECTORS
88 1643+82160000 DPE1: DW XLT1,0000H ;TRANSLATE TABLE
89 1647+00000000 DW 0000H,0000H ;SCRATCH AREA
90 164B+6E187316 DW DIRBUF,DPB1 ;DIR BUFF,PARM BLOCK
91 164F+3C191D19 DW CSV1,ALV1 ;CHECK, ALLOC VECTORS
92 1653+82160000 DPE2: DW XLT2,0000H ;TRANSLATE TABLE
93 1657+00000000 DW 0000H,0000H ;SCRATCH AREA
94 165B+6E187316 DW DIRBUF,DPB2 ;DIR BUFF,PARM BLOCK
95 165F+6B194C19 DW CSV2,ALV2 ;CHECK, ALLOC VECTORS
96 1663+82160000 DPE3: DW XLT3,0000H ;TRANSLATE TABLE
97 1667+00000000 DW 0000H,0000H ;SCRATCH AREA
98 166B+6E187316 DW DIRBUF,DPB3 ;DIR BUFF,PARM BLOCK
99 166F+9A197B19 DW CSV3,ALV3 ;CHECK, ALLOC VECTORS
100 DISKDEF 0,1,26,6,1024,243,64,64,OFFSET
101 1673+= DPB0 EQU $ ;DISK PARM BLOCK
102 1673+1A00 DW 26 ;SEC PER TRACK
103 1675+03 DB 3 ;BLOCK SHIFT
104 1676+07 DB 7 ;BLOCK MASK
105 1677+00 DB 0 ;EXTNT MASK
106 1678+F200 DW 242 ;DISK SIZE-1
107 167A+3F00 DW 63 ;DIRECTORY MAX
108 167C+C0 DB 192 ;ALLOC0
109 167D+00 DB 0 ;ALLOC1
110 167E+1000 DW 16 ;CHECK SIZE
111 1680+0200 DW 2 ;OFFSET
112 1682+= XLT0 EQU $ ;TRANSLATE TABLE
113 1682+01 DB 1
114 1683+07 DB 7
115 1684+0D DB 13
116 1685+13 DB 19
117 1686+19 DB 25
118 1687+05 DB 5
119 1688+0B DB 11
120 1689+11 DB 17
121 168A+17 DB 23
122 168B+03 DB 3
123 168C+09 DB 9
124 168D+0F DB 15
125 168E+15 DB 21
126 168F+02 DB 2
127 1690+08 DB 8
128 1691+0E DB 14
129 1692+14 DB 20
130 1693+1A DB 26
131 1694+06 DB 6
132 1695+0C DB 12
133 1696+12 DB 18
134 1697+18 DB 24
135 1698+04 DB 4
136 1699+0A DB 10
137 169A+10 DB 16
138 169B+16 DB 22
139 DISKDEF 1,0
140 1673+= DPB1 EQU DPB0 ;EQUIVALENT PARAMETERS
141 001F+= ALS1 EQU ALS0 ;SAME ALLOCATION VECTOR SIZE
142 0010+= CSS1 EQU CSS0 ;SAME CHECKSUM VECTOR SIZE
143 1682+= XLT1 EQU XLT0 ;SAME TRANSLATE TABLE
144 DISKDEF 2,0
145 1673+= DPB2 EQU DPB0 ;EQUIVALENT PARAMETERS
146 001F+= ALS2 EQU ALS0 ;SAME ALLOCATION VECTOR SIZE
147 0010+= CSS2 EQU CSS0 ;SAME CHECKSUM VECTOR SIZE
148 1682+= XLT2 EQU XLT0 ;SAME TRANSLATE TABLE
149 DISKDEF 3,0
150 1673+= DPB3 EQU DPB0 ;EQUIVALENT PARAMETERS
151 001F+= ALS3 EQU ALS0 ;SAME ALLOCATION VECTOR SIZE
152 0010+= CSS3 EQU CSS0 ;SAME CHECKSUM VECTOR SIZE
153 1682+= XLT3 EQU XLT0 ;SAME TRANSLATE TABLE
154 ; ENDEF OCCURS AT END OF ASSEMBLY
155 ;
156 ; END OF CONTROLLER - INDEPENDENT CODE, THE REMAINING SUBROUTINES
157 ; ARE TAILORED TO THE PARTICULAR OPERATING ENVIRONMENT, AND MUST
158 ; BE ALTERED FOR ANY SYSTEM WHICH DIFFERS FROM THE INTEL MDS.
159 ;
160 ; THE FOLLOWING CODE ASSUMES THE MDS MONITOR EXISTS AT 0F800H
161 ; AND USES THE I/O SUBROUTINES WITHIN THE MONITOR
162 ;
163 ; WE ALSO ASSUME THE MDS SYSTEM HAS FOUR DISK DRIVES
164 00FD = REVRT EQU 0FDH ;INTERRUPT REVERT PORT
165 00FC = INTC EQU 0FCH ;INTERRUPT MASK PORT
166 00F3 = ICON EQU 0F3H ;INTERRUPT CONTROL PORT
167 007E = INTE EQU 0111$1110B ;ENABLE RST 0(WARM BOOT), RST 7 (MONITOR)
168 ;
169 ; MDS MONITOR EQUATES
170 F800 = MON80 EQU 0F800H ;MDS MONITOR
171 FF0F = RMON80 EQU 0FF0FH ;RESTART MON80 (BOOT ERROR)
172 F803 = CI EQU 0F803H ;CONSOLE CHARACTER TO REG-A
173 F806 = RI EQU 0F806H ;READER IN TO REG-A
174 F809 = CO EQU 0F809H ;CONSOLE CHAR FROM C TO CONSOLE OUT
175 F80C = PO EQU 0F80CH ;PUNCH CHAR FROM C TO PUNCH DEVICE
176 F80F = LO EQU 0F80FH ;LIST FROM C TO LIST DEVICE
177 F812 = CSTS EQU 0F812H ;CONSOLE STATUS 00/FF TO REGISTER A
178 ;
179 ; DISK PORTS AND COMMANDS
180 0078 = BASE EQU 78H ;BASE OF DISK COMMAND IO PORTS
181 0078 = DSTAT EQU BASE ;DISK STATUS (INPUT)
182 0079 = RTYPE EQU BASE+1 ;RESULT TYPE (INPUT)
183 007B = RBYTE EQU BASE+3 ;RESULT BYTE (INPUT)
184 ;
185 0079 = ILOW EQU BASE+1 ;IOPB LOW ADDRESS (OUTPUT)
186 007A = IHIGH EQU BASE+2 ;IOPB HIGH ADDRESS (OUTPUT)
187 ;
188 0004 = READF EQU 4H ;READ FUNCTION
189 0006 = WRITF EQU 6H ;WRITE FUNCTION
190 0003 = RECAL EQU 3H ;RECALIBRATE DRIVE
191 0004 = IORDY EQU 4H ;I/O FINISHED MASK
192 000D = CR EQU 0DH ;CARRIAGE RETURN
193 000A = LF EQU 0AH ;LINE FEED
194 ;
195 SIGNON: ;SIGNON MESSAGE: XXK CP/M VERS Y.Y
196 169C 0D0A0A DB CR,LF,LF
197 IF TEST
198 DB '32' ;32K EXAMPLE BIOS
199 ENDIF
200 IF NOT TEST
201 169F 3030 DB '00' ;MEMORY SIZE FILLED BY RELOCATOR
202 ENDIF
203 16A1 6B2043502F DB 'k CP/M vers '
204 16AD 322E32 DB VERS/10+'0','.',VERS MOD 10+'0'
205 16B0 0D0A00 DB CR,LF,0
206 ;
207 BOOT: ;PRINT SIGNON MESSAGE AND GO TO CCP
208 ; (NOTE: MDS BOOT INITIALIZED IOBYTE AT 0003H)
209 16B3 310001 LXI SP,BUFF+80H
210 16B6 219C16 LXI H,SIGNON
211 16B9 CDD317 CALL PRMSG ;PRINT MESSAGE
212 16BC AF XRA A ;CLEAR ACCUMULATOR
213 16BD 320400 STA CDISK ;SET INITIALLY TO DISK A
214 16C0 C30F17 JMP GOCPM ;GO TO CP/M
215 ;
216 ;
217 WBOOT:; LOADER ON TRACK 0, SECTOR 1, WHICH WILL BE SKIPPED FOR WARM
218 ; READ CP/M FROM DISK - ASSUMING THERE IS A 128 BYTE COLD START
219 ; START.
220 ;
221 16C3 318000 LXI SP,BUFF ;USING DMA - THUS 80 THRU FF AVAILABLE FOR STACK
222 ;
223 16C6 0E0A MVI C,RETRY ;MAX RETRIES
224 16C8 C5 PUSH B
225 WBOOT0: ;ENTER HERE ON ERROR RETRIES
226 16C9 010000 LXI B,CPMB ;SET DMA ADDRESS TO START OF DISK SYSTEM
227 16CC CDBB17 CALL SETDMA
228 16CF 0E00 MVI C,0 ;BOOT FROM DRIVE 0
229 16D1 CD7D17 CALL SELDSK
230 16D4 0E00 MVI C,0
231 16D6 CDA717 CALL SETTRK ;START WITH TRACK 0
232 16D9 0E02 MVI C,2 ;START READING SECTOR 2
233 16DB CDAC17 CALL SETSEC
234 ;
235 ; READ SECTORS, COUNT NSECTS TO ZERO
236 16DE C1 POP B ;10-ERROR COUNT
237 16DF 062C MVI B,NSECTS
238 RDSEC: ;READ NEXT SECTOR
239 16E1 C5 PUSH B ;SAVE SECTOR COUNT
240 16E2 CDC117 CALL READ
241 16E5 C24917 JNZ BOOTERR ;RETRY IF ERRORS OCCUR
242 16E8 2A6C18 LHLD IOD ;INCREMENT DMA ADDRESS
243 16EB 118000 LXI D,128 ;SECTOR SIZE
244 16EE 19 DAD D ;INCREMENTED DMA ADDRESS IN HL
245 16EF 44 MOV B,H
246 16F0 4D MOV C,L ;READY FOR CALL TO SET DMA
247 16F1 CDBB17 CALL SETDMA
248 16F4 3A6B18 LDA IOS ;SECTOR NUMBER JUST READ
249 16F7 FE1A CPI 26 ;READ LAST SECTOR?
250 16F9 DA0517 JC RD1
251 ; MUST BE SECTOR 26, ZERO AND GO TO NEXT TRACK
252 16FC 3A6A18 LDA IOT ;GET TRACK TO REGISTER A
253 16FF 3C INR A
254 1700 4F MOV C,A ;READY FOR CALL
255 1701 CDA717 CALL SETTRK
256 1704 AF XRA A ;CLEAR SECTOR NUMBER
257 1705 3C RD1: INR A ;TO NEXT SECTOR
258 1706 4F MOV C,A ;READY FOR CALL
259 1707 CDAC17 CALL SETSEC
260 170A C1 POP B ;RECALL SECTOR COUNT
261 170B 05 DCR B ;DONE?
262 170C C2E116 JNZ RDSEC
263 ;
264 ; DONE WITH THE LOAD, RESET DEFAULT BUFFER ADDRESS
265 GOCPM: ;(ENTER HERE FROM COLD START BOOT)
266 ; ENABLE RST0 AND RST7
267 170F F3 DI
268 1710 3E12 MVI A,12H ;INITIALIZE COMMAND
269 1712 D3FD OUT REVRT
270 1714 AF XRA A
271 1715 D3FC OUT INTC ;CLEARED
272 1717 3E7E MVI A,INTE ;RST0 AND RST7 BITS ON
273 1719 D3FC OUT INTC
274 171B AF XRA A
275 171C D3F3 OUT ICON ;INTERRUPT CONTROL
276 ;
277 ; SET DEFAULT BUFFER ADDRESS TO 80H
278 171E 018000 LXI B,BUFF
279 1721 CDBB17 CALL SETDMA
280 ;
281 ; RESET MONITOR ENTRY POINTS
282 1724 3EC3 MVI A,JMP
283 1726 320000 STA 0
284 1729 210316 LXI H,WBOOTE
285 172C 220100 SHLD 1 ;JMP WBOOT AT LOCATION 00
286 172F 320500 STA 5
287 1732 210608 LXI H,BDOS
288 1735 220600 SHLD 6 ;JMP BDOS AT LOCATION 5
289 IF NOT TEST
290 1738 323800 STA 7*8 ;JMP TO MON80 (MAY HAVE BEEN CHANGED BY DDT)
291 173B 2100F8 LXI H,MON80
292 173E 223900 SHLD 7*8+1
293 ENDIF
294 ; LEAVE IOBYTE SET
295 ; PREVIOUSLY SELECTED DISK WAS B, SEND PARAMETER TO CPM
296 1741 3A0400 LDA CDISK ;LAST LOGGED DISK NUMBER
297 1744 4F MOV C,A ;SEND TO CCP TO LOG IT IN
298 1745 FB EI
299 1746 C30000 JMP CPMB
300 ;
301 ; ERROR CONDITION OCCURRED, PRINT MESSAGE AND RETRY
302 BOOTERR:
303 1749 C1 POP B ;RECALL COUNTS
304 174A 0D DCR C
305 174B CA5217 JZ BOOTER0
306 ; TRY AGAIN
307 174E C5 PUSH B
308 174F C3C916 JMP WBOOT0
309 ;
310 BOOTER0:
311 ; OTHERWISE TOO MANY RETRIES
312 1752 215B17 LXI H,BOOTMSG
313 1755 CDD317 CALL PRMSG
314 1758 C30FFF JMP RMON80 ;MDS HARDWARE MONITOR
315 ;
316 BOOTMSG:
317 175B 3F626F6F74 DB '?boot',0
318 ;
319 ;
320 CONST: ;CONSOLE STATUS TO REG-A
321 ; (EXACTLY THE SAME AS MDS CALL)
322 1761 C312F8 JMP CSTS
323 ;
324 CONIN: ;CONSOLE CHARACTER TO REG-A
325 1764 CD03F8 CALL CI
326 1767 E67F ANI 7FH ;REMOVE PARITY BIT
327 1769 C9 RET
328 ;
329 CONOUT: ;CONSOLE CHARACTER FROM C TO CONSOLE OUT
330 176A C309F8 JMP CO
331 ;
332 LIST: ;LIST DEVICE OUT
333 ; (EXACTLY THE SAME AS MDS CALL)
334 176D C30FF8 JMP LO
335 ;
336 LISTST:
337 ;RETURN LIST STATUS
338 1770 AF XRA A
339 1771 C9 RET ;ALWAYS NOT READY
340 ;
341 PUNCH: ;PUNCH DEVICE OUT
342 ; (EXACTLY THE SAME AS MDS CALL)
343 1772 C30CF8 JMP PO
344 ;
345 READER: ;READER CHARACTER IN TO REG-A
346 ; (EXACTLY THE SAME AS MDS CALL)
347 1775 C306F8 JMP RI
348 ;
349 HOME: ;MOVE TO HOME POSITION
350 ; TREAT AS TRACK 00 SEEK
351 1778 0E00 MVI C,0
352 177A C3A717 JMP SETTRK
353 ;
354 SELDSK: ;SELECT DISK GIVEN BY REGISTER C
355 177D 210000 LXI H,0000H ;RETURN 0000 IF ERROR
356 1780 79 MOV A,C
357 1781 FE04 CPI NDISKS ;TOO LARGE?
358 1783 D0 RNC ;LEAVE HL = 0000
359 ;
360 1784 E602 ANI 10B ;00 00 FOR DRIVE 0,1 AND 10 10 FOR DRIVE 2,3
361 1786 326618 STA DBANK ;TO SELECT DRIVE BANK
362 1789 79 MOV A,C ;00, 01, 10, 11
363 178A E601 ANI 1B ;MDS HAS 0,1 AT 78, 2,3 AT 88
364 178C B7 ORA A ;RESULT 00?
365 178D CA9217 JZ SETDRIVE
366 1790 3E30 MVI A,00110000B ;SELECTS DRIVE 1 IN BANK
367 SETDRIVE:
368 1792 47 MOV B,A ;SAVE THE FUNCTION
369 1793 216818 LXI H,IOF ;IO FUNCTION
370 1796 7E MOV A,M
371 1797 E6CF ANI 11001111B ;MASK OUT DISK NUMBER
372 1799 B0 ORA B ;MASK IN NEW DISK NUMBER
373 179A 77 MOV M,A ;SAVE IT IN IOPB
374 179B 69 MOV L,C
375 179C 2600 MVI H,0 ;HL=DISK NUMBER
376 179E 29 DAD H ;*2
377 179F 29 DAD H ;*4
378 17A0 29 DAD H ;*8
379 17A1 29 DAD H ;*16
380 17A2 113316 LXI D,DPBASE
381 17A5 19 DAD D ;HL=DISK HEADER TABLE ADDRESS
382 17A6 C9 RET
383 ;
384 ;
385 SETTRK: ;SET TRACK ADDRESS GIVEN BY C
386 17A7 216A18 LXI H,IOT
387 17AA 71 MOV M,C
388 17AB C9 RET
389 ;
390 SETSEC: ;SET SECTOR NUMBER GIVEN BY C
391 17AC 216B18 LXI H,IOS
392 17AF 71 MOV M,C
393 17B0 C9 RET
394 SECTRAN:
395 ;TRANSLATE SECTOR BC USING TABLE AT DE
396 17B1 0600 MVI B,0 ;DOUBLE PRECISION SECTOR NUMBER IN BC
397 17B3 EB XCHG ;TRANSLATE TABLE ADDRESS TO HL
398 17B4 09 DAD B ;TRANSLATE(SECTOR) ADDRESS
399 17B5 7E MOV A,M ;TRANSLATED SECTOR NUMBER TO A
400 17B6 326B18 STA IOS
401 17B9 6F MOV L,A ;RETURN SECTOR NUMBER IN L
402 17BA C9 RET
403 ;
404 SETDMA: ;SET DMA ADDRESS GIVEN BY REGS B,C
405 17BB 69 MOV L,C
406 17BC 60 MOV H,B
407 17BD 226C18 SHLD IOD
408 17C0 C9 RET
409 ;
410 READ: ;READ NEXT DISK RECORD (ASSUMING DISK/TRK/SEC/DMA SET)
411 17C1 0E04 MVI C,READF ;SET TO READ FUNCTION
412 17C3 CDE017 CALL SETFUNC
413 17C6 CDF017 CALL WAITIO ;PERFORM READ FUNCTION
414 17C9 C9 RET ;MAY HAVE ERROR SET IN REG-A
415 ;
416 ;
417 WRITE: ;DISK WRITE FUNCTION
418 17CA 0E06 MVI C,WRITF
419 17CC CDE017 CALL SETFUNC ;SET TO WRITE FUNCTION
420 17CF CDF017 CALL WAITIO
421 17D2 C9 RET ;MAY HAVE ERROR SET
422 ;
423 ;
424 ; UTILITY SUBROUTINES
425 PRMSG: ;PRINT MESSAGE AT H,L TO 0
426 17D3 7E MOV A,M
427 17D4 B7 ORA A ;ZERO?
428 17D5 C8 RZ
429 ; MORE TO PRINT
430 17D6 E5 PUSH H
431 17D7 4F MOV C,A
432 17D8 CD6A17 CALL CONOUT
433 17DB E1 POP H
434 17DC 23 INX H
435 17DD C3D317 JMP PRMSG
436 ;
437 SETFUNC:
438 ; SET FUNCTION FOR NEXT I/O (COMMAND IN REG-C)
439 17E0 216818 LXI H,IOF ;IO FUNCTION ADDRESS
440 17E3 7E MOV A,M ;GET IT TO ACCUMULATOR FOR MASKING
441 17E4 E6F8 ANI 11111000B ;REMOVE PREVIOUS COMMAND
442 17E6 B1 ORA C ;SET TO NEW COMMAND
443 17E7 77 MOV M,A ;REPLACED IN IOPB
444 ; THE MDS-800 CONTROLLER REQUIRES DISK BANK BIT IN SECTOR BYTE
445 ; MASK THE BIT FROM THE CURRENT I/O FUNCTION
446 17E8 E620 ANI 00100000B ;MASK THE DISK SELECT BIT
447 17EA 216B18 LXI H,IOS ;ADDRESS THE SECTOR SELECT BYTE
448 17ED B6 ORA M ;SELECT PROPER DISK BANK
449 17EE 77 MOV M,A ;SET DISK SELECT BIT ON/OFF
450 17EF C9 RET
451 ;
452 WAITIO:
453 17F0 0E0A MVI C,RETRY ;MAX RETRIES BEFORE PERM ERROR
454 REWAIT:
455 ; START THE I/O FUNCTION AND WAIT FOR COMPLETION
456 17F2 CD3F18 CALL INTYPE ;IN RTYPE
457 17F5 CD4C18 CALL INBYTE ;CLEARS THE CONTROLLER
458 ;
459 17F8 3A6618 LDA DBANK ;SET BANK FLAGS
460 17FB B7 ORA A ;ZERO IF DRIVE 0,1 AND NZ IF 2,3
461 17FC 3E67 MVI A,IOPB AND 0FFH ;LOW ADDRESS FOR IOPB
462 17FE 0618 MVI B,IOPB SHR 8 ;HIGH ADDRESS FOR IOPB
463 1800 C20B18 JNZ IODR1 ;DRIVE BANK 1?
464 1803 D379 OUT ILOW ;LOW ADDRESS TO CONTROLLER
465 1805 78 MOV A,B
466 1806 D37A OUT IHIGH ;HIGH ADDRESS
467 1808 C31018 JMP WAIT0 ;TO WAIT FOR COMPLETE
468 ;
469 IODR1: ;DRIVE BANK 1
470 180B D389 OUT ILOW+10H ;88 FOR DRIVE BANK 10
471 180D 78 MOV A,B
472 180E D38A OUT IHIGH+10H
473 ;
474 1810 CD5918 WAIT0: CALL INSTAT ;WAIT FOR COMPLETION
475 1813 E604 ANI IORDY ;READY?
476 1815 CA1018 JZ WAIT0
477 ;
478 ; CHECK IO COMPLETION OK
479 1818 CD3F18 CALL INTYPE ;MUST BE IO COMPLETE (00) UNLINKED
480 ; 00 UNLINKED I/O COMPLETE, 01 LINKED I/O COMPLETE (NOT USED)
481 ; 10 DISK STATUS CHANGED 11 (NOT USED)
482 181B FE02 CPI 10B ;READY STATUS CHANGE?
483 181D CA3218 JZ WREADY
484 ;
485 ; MUST BE 00 IN THE ACCUMULATOR
486 1820 B7 ORA A
487 1821 C23818 JNZ WERROR ;SOME OTHER CONDITION, RETRY
488 ;
489 ; CHECK I/O ERROR BITS
490 1824 CD4C18 CALL INBYTE
491 1827 17 RAL
492 1828 DA3218 JC WREADY ;UNIT NOT READY
493 182B 1F RAR
494 182C E6FE ANI 11111110B ;ANY OTHER ERRORS? (DELETED DATA OK)
495 182E C23818 JNZ WERROR
496 ;
497 ; READ OR WRITE IS OK, ACCUMULATOR CONTAINS ZERO
498 1831 C9 RET
499 ;
500 WREADY: ;NOT READY, TREAT AS ERROR FOR NOW
501 1832 CD4C18 CALL INBYTE ;CLEAR RESULT BYTE
502 1835 C33818 JMP TRYCOUNT
503 ;
504 WERROR: ;RETURN HARDWARE MALFUNCTION (CRC, TRACK, SEEK, ETC.)
505 ; THE MDS CONTROLLER HAS RETURNED A BIT IN EACH POSITION
506 ; OF THE ACCUMULATOR, CORRESPONDING TO THE CONDITIONS:
507 ; 0 - DELETED DATA (ACCEPTED AS OK ABOVE)
508 ; 1 - CRC ERROR
509 ; 2 - SEEK ERROR
510 ; 3 - ADDRESS ERROR (HARDWARE MALFUNCTION)
511 ; 4 - DATA OVER/UNDER FLOW (HARDWARE MALFUNCTION)
512 ; 5 - WRITE PROTECT (TREATED AS NOT READY)
513 ; 6 - WRITE ERROR (HARDWARE MALFUNCTION)
514 ; 7 - NOT READY
515 ; (ACCUMULATOR BITS ARE NUMBERED 7 6 5 4 3 2 1 0)
516 ;
517 ; IT MAY BE USEFUL TO FILTER OUT THE VARIOUS CONDITIONS,
518 ; BUT WE WILL GET A PERMANENT ERROR MESSAGE IF IT IS NOT
519 ; RECOVERABLE. IN ANY CASE, THE NOT READY CONDITION IS
520 ; TREATED AS A SEPARATE CONDITION FOR LATER IMPROVEMENT
521 TRYCOUNT:
522 ; REGISTER C CONTAINS RETRY COUNT, DECREMENT 'TIL ZERO
523 1838 0D DCR C
524 1839 C2F217 JNZ REWAIT ;FOR ANOTHER TRY
525 ;
526 ; CANNOT RECOVER FROM ERROR
527 183C 3E01 MVI A,1 ;ERROR CODE
528 183E C9 RET
529 ;
530 ; INTYPE, INBYTE, INSTAT READ DRIVE BANK 00 OR 10
531 183F 3A6618 INTYPE: LDA DBANK
532 1842 B7 ORA A
533 1843 C24918 JNZ INTYP1 ;SKIP TO BANK 10
534 1846 DB79 IN RTYPE
535 1848 C9 RET
536 1849 DB89 INTYP1: IN RTYPE+10H ;78 FOR 0,1 88 FOR 2,3
537 184B C9 RET
538 ;
539 184C 3A6618 INBYTE: LDA DBANK
540 184F B7 ORA A
541 1850 C25618 JNZ INBYT1
542 1853 DB7B IN RBYTE
543 1855 C9 RET
544 1856 DB8B INBYT1: IN RBYTE+10H
545 1858 C9 RET
546 ;
547 1859 3A6618 INSTAT: LDA DBANK
548 185C B7 ORA A
549 185D C26318 JNZ INSTA1
550 1860 DB78 IN DSTAT
551 1862 C9 RET
552 1863 DB88 INSTA1: IN DSTAT+10H
553 1865 C9 RET
554 ;
555 ;
556 ;
557 ; DATA AREAS (MUST BE IN RAM)
558 1866 00 DBANK: DB 0 ;DISK BANK 00 IF DRIVE 0,1
559 ; 10 IF DRIVE 2,3
560 IOPB: ;IO PARAMETER BLOCK
561 1867 80 DB 80H ;NORMAL I/O OPERATION
562 1868 04 IOF: DB READF ;IO FUNCTION, INITIAL READ
563 1869 01 ION: DB 1 ;NUMBER OF SECTORS TO READ
564 186A 02 IOT: DB OFFSET ;TRACK NUMBER
565 186B 01 IOS: DB 1 ;SECTOR NUMBER
566 186C 8000 IOD: DW BUFF ;IO ADDRESS
567 ;
568 ;
569 ; DEFINE RAM AREAS FOR BDOS OPERATION
570 ENDEF
571 186E+= BEGDAT EQU $
572 186E+ DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER
573 18EE+ ALV0: DS 31
574 190D+ CSV0: DS 16
575 191D+ ALV1: DS 31
576 193C+ CSV1: DS 16
577 194C+ ALV2: DS 31
578 196B+ CSV2: DS 16
579 197B+ ALV3: DS 31
580 199A+ CSV3: DS 16
581 19AA+= ENDDAT EQU $
582 013C+= DATSIZ EQU $-BEGDAT
583 19AA END
ALS1 001F 141#
ALS2 001F 146#
ALS3 001F 151#
ALV0 18EE 87 573#
ALV1 191D 91 575#
ALV2 194C 95 577#
ALV3 197B 99 579#
BASE 0078 180# 181 182 183 185 186
BDOS 0806 29# 287
BEGDAT 186E 571# 582
BIAS 0000 19# 22#
BOOT 16B3 63 207#
BOOTER0 1752 305 310#
BOOTERR 1749 241 302#
BOOTMSG 175B 312 316#
BUFF 0080 34# 209 221 278 566
CDISK 0004 33# 213 296
CI F803 172# 325
CO F809 174# 330
CONIN 1764 66 324#
CONOUT 176A 67 329# 432
CONST 1761 65 320#
CPMB 0000 28# 29 30 226 299
CPML 1600 30# 31
CR 000D 192# 196 205
CSS1 0010 142#
CSS2 0010 147#
CSS3 0010 152#
CSTS F812 177# 322
CSV0 190D 87 574#
CSV1 193C 91 576#
CSV2 196B 95 578#
CSV3 199A 99 580#
DATSIZ 013C 582#
DBANK 1866 361 459 531 539 547 558#
DIRBUF 186E 86 90 94 98 572#
DPB0 1673 86 101# 140 145 150
DPB1 1673 90 140#
DPB2 1673 94 145#
DPB3 1673 98 150#
DPBASE 1633 83# 380
DPE0 1633 84#
DPE1 1643 88#
DPE2 1653 92#
DPE3 1663 96#
DSTAT 0078 181# 550 552
ENDDAT 19AA 581#
FALSE 0000 15# 16
GOCPM 170F 214 265#
HOME 1778 71 349#
ICON 00F3 166# 275
IHIGH 007A 186# 466 472
ILOW 0079 185# 464 470
INBYT1 1856 541 544#
INBYTE 184C 457 490 501 539#
INSTA1 1863 549 552#
INSTAT 1859 474 547#
INTC 00FC 165# 271 273
INTE 007E 167# 272
INTYP1 1849 533 536#
INTYPE 183F 456 479 531#
IOD 186C 242 407 566#
IODR1 180B 463 469#
IOF 1868 369 439 562#
ION 1869 563#
IOPB 1867 461 462 560#
IORDY 0004 191# 475
IOS 186B 248 391 400 447 565#
IOT 186A 252 386 564#
LF 000A 193# 196 196 205
LIST 176D 68 332#
LISTST 1770 78 336#
LO F80F 176# 334
MON80 F800 170# 291
NSECTS 002C 31# 237
OFFSET 0002 32# 100 564
PATCH 1600 25# 27 28
PO F80C 175# 343
PRMSG 17D3 211 313 425# 435
PUNCH 1772 69 341#
RBYTE 007B 183# 542 544
RD1 1705 250 257#
RDSEC 16E1 238# 262
READ 17C1 76 240 410#
READER 1775 70 345#
READF 0004 188# 411 562
RECAL 0003 190#
RETRY 000A 35# 223 453
REVRT 00FD 164# 269
REWAIT 17F2 454# 524
RI F806 173# 347
RMON80 FF0F 171# 314
RTYPE 0079 182# 534 536
SECTRAN 17B1 79 394#
SELDSK 177D 72 229 354#
SETDMA 17BB 75 227 247 279 404#
SETDRIVE 1792 365 367#
SETFUNC 17E0 412 419 437#
SETSEC 17AC 74 233 259 390#
SETTRK 17A7 73 231 255 352 385#
SIGNON 169C 195# 210
TEST 0000 16# 18 21 197 200 289
TRUE FFFF 14# 15
TRYCOUNT 1838 502 521#
VERS 0016 6# 204 204
WAIT0 1810 467 474# 476
WAITIO 17F0 413 420 452#
WBOOT 16C3 64 217#
WBOOT0 16C9 225# 308
WBOOTE 1603 64# 284
WERROR 1838 487 495 504#
WREADY 1832 483 492 500#
WRITE 17CA 77 417#
WRITF 0006 189# 418
XLT0 1682 84 112# 143 148 153
XLT1 1682 88 143#
XLT2 1682 92 148#
XLT3 1682 96 153#
Back to title page
     Next