92: 4BB5 PARAMS:
93: 0000 IF WINCH
99: ENDIF
100: 4BB5 AF XOR A ;SET SECTOR# TO ZERO TO INDICATE
101: 4BB6 3253FD LD (HSTSEC),A ; EXPLORATORY READ OPERATION
102: 4BB9 3E01 PARM1: LD A,SIDSEL+OFF
103: 4BBB D3C8 OUT (PORT0),A ;MAKE SURE SIDE #0 OF DISK IS SELECTED
104: 4BBD 3A50FD LD A,(DISK)
105: 4BC0 3256FD LD (HSTDSK),A ;STORE UNIT# IN CASE OF ERROR
106: 4BC3 4F LD C,A
107: 4BC4 CD1BF0 CALL MONITR+27 ;SELECT NEW DISK DRIVE
108: 4BC7 JR NZ,PARM2
V Value error
109: 4BC7 3A4EFD LD A,(TRACK)
110: 4BCA 3254FD LD (HSTTRK),A ;STORE TRACK# IN CASE OF ERROR
111: 4BCD 4F LD C,A
112: 4BCE CD21F0 CALL MONITR+33 ;SEEK SPECIFIED TEST TRACK
113: 4BD1 JR NZ,PARM2
V Value error
114: 4BD1 2168FD LD HL,IDBUFF
115: 4BD4 CD2AF0 CALL MONITR+42 ;READ AN ID MARK FROM TEST TRACK
116: 4BD7 JR Z,PARM3
V Value error
117:
118: 4BD7 CDB6EE PARM2: CALL REPORT ;DISPLAY ERROR AND ALLOW RECOVERY
119: 4BDA JR Z,PARM1 ;TRY AGAIN IF NOT ABORTED
V Value error
120: 4BDA 210000 LD HL,0
121: 4BDD C9 RET ;ELSE RETURN PERM SELECT ERROR
122: ;
123: ; ARRIVE HERE AFTER SUCCESSFULLY READING AN ID RECORD
124: ;
125: 4BDE 21C6EC PARM3: LD HL,SDSTUFF
126: 4BE1 2266FD LD (PRMPTR),HL ;FIRST SELECT SINGLE DENSITY PARAMETERS
127: 4BE4 3A6EFD LD A,(IDBUFF+6)
128: 4BE7 CB47 BIT 0,A ;TEST DENSITY BYTE RETURNED BY READID
129: 4BE9 CA73EC JP Z,PARM10 ;JUMP IF SINGLE DENSITY
130:
131: 4BEC 21FDEC LD HL,DDSTUFF
132: 4BEF 2266FD LD (PRMPTR),HL ;USE DUAL DENSITY DISK PARAMETERS
133: 4BF2 212500 LD HL,NTRAKS-RESERV
134: 4BF5 E5 PUSH HL ;PUT TRACKS-PER-DISK PARAM ONTO STACK
135: 0001 IF DOUBLE
136: 4BF6 3E09 LD A,SIDSEL+ON
137: 4BF8 D3C8 OUT (PORT0),A ;SELECT TOP SIDE OF DISK
138: 4BFA 2170FD LD HL,IDTOP
139: 4BFD CD2AF0 CALL MONITR+42 ;ELSE READ AN ID MARK FROM TOP SIDE
140: 4C00 JR NZ,PARM3A ;JUMP IF NOT FORMATTED ON SECOND SIDE
V Value error
141: 4C00 2168FD LD HL,IDBUFF
142: 4C03 1170FD LD DE,IDTOP ;ELSE COMPARE ID FIELDS TO EACH OTHER
143: 4C06 CDC1EC CALL EXOR1
144: 4C09 JR NZ,PARM3A ;JUMP IF TRACK NUMBERS NOT IDENTICAL
V Value error
145: 4C09 CDC1EC CALL EXOR1
146: 4C0C FE01 CP 1
147: 4C0E JR NZ,PARM3A ;JUMP IF SIDE NUMBERS NOT COMPLIMENTARY
V Value error
148: 4C0E CDBFEC CALL EXOR2
149: 4C11 JR NZ,PARM3A ;JUMP IF SECTOR LENGTHS NOT IDENTICAL
V Value error
150: 4C11 CDBDEC CALL EXOR3
151: 4C14 JR NZ,PARM3A ;JUMP IF DENSITIES NOT IDENTICAL
V Value error
152:
153: 4C14 214D00 LD HL,2*NTRAKS-RESERV
154: 4C17 E3 EX (SP),HL ;REPLACE DOUBLE SIDED #TRACKS ON STACK
155: 4C18 3E01 PARM3A: LD A,SIDSEL+OFF
156: 4C1A D3C8 OUT (PORT0),A ;SWITCH BACK TO REGULAR SIDE OF DISK
157: ENDIF
158: 4C1C 3A6BFD LD A,(IDBUFF+3) ;GET SECTOR LENGTH BYTE FROM ID RECORD
159: 4C1F E603 AND 00000011B
160: 4C21 320EED LD (DDSTUFF+17),A ;STORE AS DEBLOCK MASK IN 'DDSTUFF'
161: 4C24 2600 LD H,0
162: 4C26 6F LD L,A
163: 4C27 29 ADD HL,HL
164: 4C28 29 ADD HL,HL ;MULTIPLY LENGTH CODE BY 4 FOR INDEXING
165: 4C29 01EDEC LD BC,FRMTAB
166: 4C2C 09 ADD HL,BC ;ADD BASE ADDRESS OF FORMAT POOP TABLE
167: 4C2D 110FED LD DE,DDSTUFF+18
168: 4C30 010300 LD BC,3
169: 4C33 EDB0 LDIR ;STORE FORMAT PARAMS IN 'DDSTUFF'
170:
171: 4C35 3C INC A
172: 4C36 47 LD B,A ;B=SECTOR LENGTH CODE+1 (RANGE 1..4)
173: 4C37 3A69FD LD A,(IDBUFF+1) ;GET SIDE# BYTE FROM ID RECORD
174: 4C3A CB3F SRL A ;SHIFT OUT SIDE# BIT IN LSB
175: 4C3C JR NZ,PARM5 ;JUMP IF UPPER 7 BITS ARE NON-ZERO
V Value error
176: 4C3C 7E LD A,(HL) ;ELSE USE STANDARD VALUE FOR 'SPT'
177: 4C3D JR PARM6 ; FOUND IN PARAMETER TABLE
V Value error
178: ;
179: 4C3D 87 PARM4: ADD A,A ;MULTIPLY PHYSICAL SPT BY 2,4 OR 8 TO
180: 4C3E PARM5: DJNZ PARM4 ; TO GET EQUIVALENT 128 BYTE SECTORS
V Value error
181: 4C3E 32FFEC PARM6: LD (DDSTUFF+2),A ;STORE LOGICAL SPT CONST IN 'DDSTUFF'
182:
183: 4C41 D1 POP DE ;POP TRACKS-PER-DISK PARAM OFF STACK
184: 4C42 210000 LD HL,0
185: 4C45 47 LD B,A ;PREPARE TO COMPUTE 'DRM' VALUE FOR DPB
186: 4C46 19 PARM7: ADD HL,DE
187: 4C47 DJNZ PARM7 ;GET PRODUCT OF SPT*(NTRAKS-RESERV)
V Value error
188: 4C47 3A01ED LD A,(DDSTUFF+4)
189: 4C4A 47 LD B,A
190: 4C4B CB3C PARM8: SRL H ;DIVIDE TOTAL SECTORS BY 'BSH' TO GET
191: 4C4D CB1D RR L ; NUMBER OF BLOCKS ON DISK
192: 4C4F DJNZ PARM8
V Value error
193: 4C4F 2B DEC HL ;RESULT LESS 1 IS 'DSM' VALUE FOR DPB
194: 4C50 2204ED LD (DDSTUFF+7),HL
195:
196: 4C53 3A02ED LD A,(DDSTUFF+5) ;GET BLOCK MASK FROM DPB
197: 4C56 CB3F SRL A
198: 4C58 CB3F SRL A
199: 4C5A CB3F SRL A ;SHIFT RIGHT 3 TIMES GIVES EXTENT MASK
200: 4C5C 24 INC H
201: 4C5D 25 DEC H ;TEST IF 'DSM' IS > 255
202: 4C5E JR Z,PARM9
V Value error
203: 4C5E CB3F SRL A
204: 4C60 3203ED PARM9: LD (DDSTUFF+6),A ;STORE VALUE FOR 'EXM'
205:
206: 4C63 2A66FD PARM10: LD HL,(PRMPTR)
207: 4C66 ED5B64FD LD DE,(DPHPTR)
208: 4C6A D5 PUSH DE
209: 4C6B D5 PUSH DE
210: 4C6C D5 PUSH DE ;SAVE 3 COPIES OF POINTER TO DISK POOP
211: 4C6D 010200 LD BC,2
212: 4C70 EDB0 LDIR ;COPY 'XLT' ADDRESS TO START OF DPH
213: 4C72 EB EX DE,HL
214: 4C73 010E00 LD BC,14
215: 4C76 09 ADD HL,BC ;POINT TO REST OF DPB STUFF NOW
216: 4C77 EB EX DE,HL
217: 4C78 011300 LD BC,15+4
218: 4C7B EDB0 LDIR ;COPY DPB AND DEBLOCK PARAMETERS
219: 4C7D DDE1 POP IX ;POINT IX TO BASE OF DISK STORAGE AREAS
220: 4C7F 2180F8 LD HL,DIRBUF ;GET ADDRESS OF DIRECTORY BUFFER
221: 4C82 DD7508 LD (IX+8),L
222: 4C85 DD7409 LD (IX+9),H ;STORE IN 'DIR' POINTER SLOT
223: 4C88 E1 POP HL
224: 4C89 111000 LD DE,16
225: 4C8C 19 ADD HL,DE ;COMPUTE ADDRESS OF DISK PARM BLOCK
226: 4C8D DD750A LD (IX+10),L
227: 4C90 DD740B LD (IX+11),H ;STORE IN 'DPB' POINTER SLOT
228: 4C93 111400 LD DE,15+4+1
229: 4C96 19 ADD HL,DE ;COMPUTE ADDRESS OF CHECK VECTOR
230: 4C97 DD750C LD (IX+12),L
231: 4C9A DD740D LD (IX+13),H ;STORE IN 'CKV' POINTER SLOT
232: 4C9D DD5E1B LD E,(IX+16+11)
233: 4CA0 DD561C LD D,(IX+16+12) ;LOAD DE WITH CHECK VECTOR LENGTH
234: 4CA3 19 ADD HL,DE ;COMPUTE ADDRESS OF ALLOCATION VECTOR
235: 4CA4 DD750E LD (IX+14),L
236: 4CA7 DD740F LD (IX+15),H ;STORE IN 'ALV' POINTER SLOT
237: 4CAA E1 POP HL
238: 4CAB AF XOR A ;A=0 TO INDICATE PARAMS FOUND OK
239: 4CAC C9 RET ;RETURN WITH DPH POINTER IN HL
240: ;
241: ;
242: ;
243: 4CAD 23 EXOR3: INC HL
244: 4CAE 13 INC DE
245: 4CAF 23 EXOR2: INC HL
246: 4CB0 13 INC DE
247: 4CB1 1A EXOR1: LD A,(DE)
248: 4CB2 AE XOR (HL) ;COMPARE ID FIELD BYTES @HL AND @DE
249: 4CB3 23 INC HL
250: 4CB4 13 INC DE
251: 4CB5 C9 RET
252: ;
254: ;
255: 0000 IF EIGHT
308: ENDIF
309: ;
310: ;
311: 0001 IF FIVE
312: ;
313: ; DISK PARAMS FOR STANDARD SINGLE DENSITY FORMAT
314: ; 18 SECTORS / 128 BYTES
315: ;
316: 4CB6 SDSTUFF:
317: 4CB6 DBEC DEFW XLTAB ;1-IN-5 SECTOR SKEW TABLE
318:
319: 4CB8 1200 DEFW NSECTS ;SECTORS PER TRACK
320: 4CBA 03 DEFB 3 ;BLOCK SHIFT
321: 4CBB 07 DEFB 00000111B ;BLOCK MASK
322: 4CBC 00 DEFB 00000000B ;EXTENT MASK
323: 4CBD 5100 DEFW 81 ;MAX BLOCK#
324: 4CBF 1F00 DEFW 31 ;MAX DIRECTORY ENTRY#
325: 4CC1 80 DEFB 10000000B ;ALLOCATION MASK MSB
326: 4CC2 00 DEFB 00000000B ;' ' LSB
327: 4CC3 0800 DEFW 8 ;CHECK SIZE
328: 4CC5 0300 DEFW RESERV ;RESERVED TRACKS
329:
330: 4CC7 00 DEFB 0 ;DEBLOCK SHIFT COUNT
331: 4CC8 00 DEFB 00000000B ;DEBLOCK MASK
332: 4CC9 8000 DEFW 128 ;BYTES PER SECTOR
333: ;
334: ;
335: ; 5 INCH SECTOR TRANSLATE TABLE (SAME AS XEROX/CROMEMCO/OSBORNE)
336: ;
337: 4CCB XLTAB:
338: 4CCB 01060B10 DEFB 01,06,11,16
339: 4CCF 03080D12 DEFB 03,08,13,18
340: 4CD3 050A0F DEFB 05,10,15
341: 4CD6 02070C11 DEFB 02,07,12,17
342: 4CDA 04090E DEFB 04,09,14
343: ;
344: ;
345: ; SECTOR DEBLOCK PARAMS FOR 5 INCH DOUBLE DENSITY DISKS
346: ;
347: 4CDD FRMTAB:
348: 4CDD 00 DEFB 00000000B ;DEBLOCK MASK
349: 4CDE 8000 DEFW 128 ;PHYSICAL SECTOR LENGTH
350: 4CE0 1C DEFB 28 ;LOGICAL SECTORS PER TRACK
351:
352: 4CE1 01 DEFB 00000001B
353: 4CE2 0001 DEFW 256
354: 4CE4 24 DEFB 18*2
355:
356: 4CE5 03 DEFB 00000011B
357: 4CE6 0002 DEFW 512
358: 4CE8 24 DEFB 9*4
359:
360: 4CE9 07 DEFB 00000111B
361: 4CEA 0004 DEFW 1024
362: 4CEC 28 DEFB 5*8
363:
364: ENDIF
365: ;
366: ;
367: ; BASIC DISK PARAMS FOR DOUBLE DENSITY FORMATS
368: ;
369: 4CED DPBGEN BLS,DIRSIZ ;GENERATE BSH/BLM/DIRMSK CONSTS
369: 4CED .xlist ; directory size (in directory entries)
M Mult. def. error
369: 4CED rept 16
F Syntax error
M Mult. def. error
370: ;
371: 4CED DDSTUFF:
372: 4CED 0000 DEFW 0 ;NO SECTOR SKEW TABLE
373:
374: 4CEF 0000 DEFW 0 ;SECTORS PER TRACK (DUMMY)
375: 4CF1 01 DEFB BSHFT ;BLOCK SHIFT
376: 4CF2 01 DEFB BMASK ;BLOCK MASK
377: 4CF3 00 DEFB 0 ;EXTENT MASK (DUMMY)
378: 4CF4 0000 DEFW 0 ;MAX BLOCK# (DUMMY)
379: 4CF6 3F00 DEFW DIRSIZ-1 ;MAX DIRECTORY ENTRY#
380: 4CF8 80 DEFB HIGH DIRMSK ;ALLOCATION MASK MSB
381: 4CF9 00 DEFB LOW DIRMSK ;ALLOCATION MASK LSB
382: 4CFA 1000 DEFW DIRSIZ/4 ;CHECK VECTOR SIZE
383: 4CFC 0300 DEFW RESERV ;RESERVED TRACKS
384:
385: 4CFE 00 DEFB 0 ;DEBLOCK SHIFT COUNT (DUMMY)
386: 4CFF 00 DEFB 0 ;DEBLOCK MASK (DUMMY)
387: 4D00 0000 DEFW 0 ;BYTES PER SECTOR (DUMMY)