CP/M Operating System Manual
Appendix G - Blocking and Deblocking Algorithms
Appendix G
Blocking and Deblocking Algorithms
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 ;*****************************************************
2 ;* *
3 ;* SECTOR DEBLOCKING ALGORITHMS FOR CP/M 2.0 *
4 ;* *
5 ;*****************************************************
6 ;
7 ; UTILITY MACRO TO COMPUTE SECTOR MASK
8 SMASK MACRO HBLK
9 ;; COMPUTE LOG2(HBLK), RETURN @X AS RESULT
10 ;; (2 ** @X = HBLK ON RETURN)
11 @Y SET HBLK
12 @X SET 0
13 ;; COUNT RIGHT SHIFTS OF @Y UNTIL = 1
14 REPT 8
15 IF @Y = 1
16 EXITM
17 ENDIF
18 ;; @Y IS NOT 1, SHIFT RIGHT ONE POSITION
19 @Y SET @Y SHR 1
20 @X SET @X + 1
21 ENDM
22 ENDM
23 ;
24 ;*****************************************************
25 ;* *
26 ;* CP/M TO HOST DISK CONSTANTS *
27 ;* *
28 ;*****************************************************
29 0800 = BLKSIZ EQU 2048 ;CP/M ALLOCATION SIZE
30 0200 = HSTSIZ EQU 512 ;HOST DISK SECTOR SIZE
31 0014 = HSTSPT EQU 20 ;HOST DISK SECTORS/TRK
32 0004 = HSTBLK EQU HSTSIZ/128 ;CP/M SECTS/HOST BUFF
33 0050 = CPMSPT EQU HSTBLK * HSTSPT ;CP/M SECTORS/TRACK
34 0003 = SECMSK EQU HSTBLK-1 ;SECTOR MASK
35 SMASK HSTBLK ;COMPUTE SECTOR MASK
36 0002 = SECSHF EQU @X ;LOG2(HSTBLK)
37 ;
38 ;*****************************************************
39 ;* *
40 ;* BDOS CONSTANTS ON ENTRY TO WRITE *
41 ;* *
42 ;*****************************************************
43 0000 = WRALL EQU 0 ;WRITE TO ALLOCATED
44 0001 = WRDIR EQU 1 ;WRITE TO DIRECTORY
45 0002 = WRUAL EQU 2 ;WRITE TO UNALLOCATED
46 ;
47 ;*****************************************************
48 ;* *
49 ;* THE BDOS ENTRY POINTS GIVEN BELOW SHOW THE *
50 ;* CODE WHICH IS RELEVANT TO DEBLOCKING ONLY. *
51 ;* *
52 ;*****************************************************
53 ;
54 ; DISKDEF MACRO, OR HAND CODED TABLES GO HERE
55 0000 = DPBASE EQU $ ;DISK PARAM BLOCK BASE
56 ;
65 HOME:
66 ;HOME THE SELECTED DISK
67 HOME:
68 0008 3A6B01 LDA HSTWRT ;CHECK FOR PENDING WRITE
69 000B B7 ORA A
70 000C C21200 JNZ HOMED
71 000F 326A01 STA HSTACT ;CLEAR HOST ACTIVE FLAG
72 HOMED:
73 0012 C9 RET
74 ;
75 SELDSK:
76 ;SELECT DISK
77 0013 79 MOV A,C ;SELECTED DISK NUMBER
78 0014 326101 STA SEKDSK ;SEEK DISK NUMBER
79 0017 6F MOV L,A ;DISK NUMBER TO HL
80 0018 2600 MVI H,0
81 REPT 4 ;MULTIPLY BY 16
82 DAD H
83 ENDM
84 001A+29 DAD H
85 001B+29 DAD H
86 001C+29 DAD H
87 001D+29 DAD H
88 001E 110000 LXI D,DPBASE ;BASE OF PARM BLOCK
89 0021 19 DAD D ;HL=.DPB(CURDSK)
90 0022 C9 RET
91 ;
92 SETTRK:
93 ;SET TRACK GIVEN BY REGISTERS BC
94 0023 60 MOV H,B
95 0024 69 MOV L,C
96 0025 226201 SHLD SEKTRK ;TRACK TO SEEK
97 0028 C9 RET
98 ;
99 SETSEC:
100 ;SET SECTOR GIVEN BY REGISTER C
101 0029 79 MOV A,C
102 002A 326401 STA SEKSEC ;SECTOR TO SEEK
103 002D C9 RET
104 ;
105 SETDMA:
106 ;SET DMA ADDRESS GIVEN BY BC
107 002E 60 MOV H,B
108 002F 69 MOV L,C
109 0030 227501 SHLD DMAADR
110 0033 C9 RET
111 ;
112 SECTRAN:
113 ;TRANSLATE SECTOR NUMBER BC
114 0034 60 MOV H,B
115 0035 69 MOV L,C
116 0036 C9 RET
117 ;
118 ;*****************************************************
119 ;* *
120 ;* THE READ ENTRY POINT TAKES THE PLACE OF *
121 ;* THE PREVIOUS BIOS DEFINTION FOR READ. *
122 ;* *
123 ;*****************************************************
124 READ:
125 ;READ THE SELECTED CP/M SECTOR
126 0037 AF XRA A
127 0038 326C01 STA UNACNT
128 003B 3E01 MVI A,1
129 003D 327301 STA READOP ;READ OPERATION
130 0040 327201 STA RSFLAG ;MUST READ DATA
131 0043 3E02 MVI A,WRUAL
132 0045 327401 STA WRTYPE ;TREAT AS UNALLOC
133 0048 C3B600 JMP RWOPER ;TO PERFORM THE READ
134 ;
135 ;*****************************************************
136 ;* *
137 ;* THE WRITE ENTRY POINT TAKES THE PLACE OF *
138 ;* THE PREVIOUS BIOS DEFINTION FOR WRITE. *
139 ;* *
140 ;*****************************************************
141 WRITE:
142 ;WRITE THE SELECTED CP/M SECTOR
143 004B AF XRA A ;0 TO ACCUMULATOR
144 004C 327301 STA READOP ;NOT A READ OPERATION
145 004F 79 MOV A,C ;WRITE TYPE IN C
146 0050 327401 STA WRTYPE
147 0053 FE02 CPI WRUAL ;WRITE UNALLOCATED?
148 0055 C26F00 JNZ CHKUNA ;CHECK FOR UNALLOC
149 ;
150 ; WRITE TO UNALLOCATED, SET PARAMETERS
151 0058 3E10 MVI A,BLKSIZ/128 ;NEXT UNALLOC RECS
152 005A 326C01 STA UNACNT
153 005D 3A6101 LDA SEKDSK ;DISK TO SEEK
154 0060 326D01 STA UNADSK ;UNADSK = SEKDSK
155 0063 2A6201 LHLD SEKTRK
156 0066 226E01 SHLD UNATRK ;UNATRK = SECTRK
157 0069 3A6401 LDA SEKSEC
158 006C 327001 STA UNASEC ;UNASEC = SEKSEC
159 ;
160 CHKUNA:
161 ;CHECK FOR WRITE TO UNALLOCATED SECTOR
162 006F 3A6C01 LDA UNACNT ;ANY UNALLOC REMAIN?
163 0072 B7 ORA A
164 0073 CAAE00 JZ ALLOC ;SKIP IF NOT
165 ;
166 ; MORE UNALLOCATED RECORDS REMAIN
167 0076 3D DCR A ;UNACNT = UNACNT-1
168 0077 326C01 STA UNACNT
169 007A 3A6101 LDA SEKDSK ;SAME DISK?
170 007D 216D01 LXI H,UNADSK
171 0080 BE CMP M ;SEKDSK = UNADSK?
172 0081 C2AE00 JNZ ALLOC ;SKIP IF NOT
173 ;
174 ; DISKS ARE THE SAME
175 0084 216E01 LXI H,UNATRK
176 0087 CD5301 CALL SEKTRKCMP ;SEKTRK = UNATRK?
177 008A C2AE00 JNZ ALLOC ;SKIP IF NOT
178 ;
179 ; TRACKS ARE THE SAME
180 008D 3A6401 LDA SEKSEC ;SAME SECTOR?
181 0090 217001 LXI H,UNASEC
182 0093 BE CMP M ;SEKSEC = UNASEC?
183 0094 C2AE00 JNZ ALLOC ;SKIP IF NOT
184 ;
185 ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF
186 0097 34 INR M ;UNASEC = UNASEC+1
187 0098 7E MOV A,M ;END OF TRACK?
188 0099 FE50 CPI CPMSPT ;COUNT CP/M SECTORS
189 009B DAA700 JC NOOVF ;SKIP IF NO OVERFLOW
190 ;
191 ; OVERFLOW TO NEXT TRACK
192 009E 3600 MVI M,0 ;UNASEC = 0
193 00A0 2A6E01 LHLD UNATRK
194 00A3 23 INX H
195 00A4 226E01 SHLD UNATRK ;UNATRK = UNATRK+1
196 ;
197 NOOVF:
198 ;MATCH FOUND, MARK AS UNNECESSARY READ
199 00A7 AF XRA A ;0 TO ACCUMULATOR
200 00A8 327201 STA RSFLAG ;RSFLAG = 0
201 00AB C3B600 JMP RWOPER ;TO PERFORM THE WRITE
202 ;
203 ALLOC:
204 ;NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ
205 00AE AF XRA A ;0 TO ACCUM
206 00AF 326C01 STA UNACNT ;UNACNT = 0
207 00B2 3C INR A ;1 TO ACCUM
208 00B3 327201 STA RSFLAG ;RSFLAG = 1
209 ;
210 ;*****************************************************
211 ;* *
212 ;* COMMON CODE FOR READ AND WRITE FOLLOWS *
213 ;* *
214 ;*****************************************************
215 RWOPER:
216 ;ENTER HERE TO PERFORM THE READ/WRITE
217 00B6 AF XRA A ;ZERO TO ACCUM
218 00B7 327101 STA ERFLAG ;NO ERRORS (YET)
219 00BA 3A6401 LDA SEKSEC ;COMPUTE HOST SECTOR
220 REPT SECSHF
221 ORA A ;CARRY = 0
222 RAR ;SHIFT RIGHT
223 ENDM
224 00BD+B7 ORA A ;CARRY = 0
225 00BE+1F RAR ;SHIFT RIGHT
226 00BF+B7 ORA A ;CARRY = 0
227 00C0+1F RAR ;SHIFT RIGHT
228 00C1 326901 STA SEKHST ;HOST SECTOR TO SEEK
229 ;
230 ; ACTIVE HOST SECTOR?
231 00C4 216A01 LXI H,HSTACT ;HOST ACTIVE FLAG
232 00C7 7E MOV A,M
233 00C8 3601 MVI M,1 ;ALWAYS BECOMES 1
234 00CA B7 ORA A ;WAS IT ALREADY?
235 00CB CAF200 JZ FILHST ;FILL HOST IF NOT
236 ;
237 ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER?
238 00CE 3A6101 LDA SEKDSK
239 00D1 216501 LXI H,HSTDSK ;SAME DISK?
240 00D4 BE CMP M ;SEKDSK = HSTDSK?
241 00D5 C2EB00 JNZ NOMATCH
242 ;
243 ; SAME DISK, SAME TRACK?
244 00D8 216601 LXI H,HSTTRK
245 00DB CD5301 CALL SEKTRKCMP ;SEKTRK = HSTTRK?
246 00DE C2EB00 JNZ NOMATCH
247 ;
248 ; SAME DISK, SAME TRACK, SAME BUFFER?
249 00E1 3A6901 LDA SEKHST
250 00E4 216801 LXI H,HSTSEC ;SEKHST = HSTSEC?
251 00E7 BE CMP M
252 00E8 CA0F01 JZ MATCH ;SKIP IF MATCH
253 ;
254 NOMATCH:
255 ;PROPER DISK, BUT NOT CORRECT SECTOR
256 00EB 3A6B01 LDA HSTWRT ;HOST WRITTEN?
257 00EE B7 ORA A
258 00EF C45F01 CNZ WRITEHST ;CLEAR HOST BUFF
259 ;
260 FILHST:
261 ;MAY HAVE TO FILL THE HOST BUFFER
262 00F2 3A6101 LDA SEKDSK
263 00F5 326501 STA HSTDSK
264 00F8 2A6201 LHLD SEKTRK
265 00FB 226601 SHLD HSTTRK
266 00FE 3A6901 LDA SEKHST
267 0101 326801 STA HSTSEC
268 0104 3A7201 LDA RSFLAG ;NEED TO READ?
269 0107 B7 ORA A
270 0108 C46001 CNZ READHST ;YES, IF 1
271 010B AF XRA A ;0 TO ACCUM
272 010C 326B01 STA HSTWRT ;NO PENDING WRITE
273 ;
274 MATCH:
275 ;COPY DATA TO OR FROM BUFFER
276 010F 3A6401 LDA SEKSEC ;MASK BUFFER NUMBER
277 0112 E603 ANI SECMSK ;LEAST SIGNIF BITS
278 0114 6F MOV L,A ;READY TO SHIFT
279 0115 2600 MVI H,0 ;DOUBLE COUNT
280 REPT 7 ;SHIFT LEFT 7
281 DAD H
282 ENDM
283 0117+29 DAD H
284 0118+29 DAD H
285 0119+29 DAD H
286 011A+29 DAD H
287 011B+29 DAD H
288 011C+29 DAD H
289 011D+29 DAD H
290 ; HL HAS RELATIVE HOST BUFFER ADDRESS
291 011E 117701 LXI D,HSTBUF
292 0121 19 DAD D ;HL = HOST ADDRESS
293 0122 EB XCHG ;NOW IN DE
294 0123 2A7501 LHLD DMAADR ;GET/PUT CP/M DATA
295 0126 0E80 MVI C,128 ;LENGTH OF MOVE
296 0128 3A7301 LDA READOP ;WHICH WAY?
297 012B B7 ORA A
298 012C C23501 JNZ RWMOVE ;SKIP IF READ
299 ;
300 ; WRITE OPERATION, MARK AND SWITCH DIRECTION
301 012F 3E01 MVI A,1
302 0131 326B01 STA HSTWRT ;HSTWRT = 1
303 0134 EB XCHG ;SOURCE/DEST SWAP
304 ;
305 RWMOVE:
306 ;C INITIALLY 128, DE IS SOURCE, HL IS DEST
307 0135 1A LDAX D ;SOURCE CHARACTER
308 0136 13 INX D
309 0137 77 MOV M,A ;TO DEST
310 0138 23 INX H
311 0139 0D DCR C ;LOOP 128 TIMES
312 013A C23501 JNZ RWMOVE
313 ;
314 ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER
315 013D 3A7401 LDA WRTYPE ;WRITE TYPE
316 0140 FE01 CPI WRDIR ;TO DIRECTORY?
317 0142 3A7101 LDA ERFLAG ;IN CASE OF ERRORS
318 0145 C0 RNZ ;NO FURTHER PROCESSING
319 ;
320 ; CLEAR HOST BUFFER FOR DIRECTORY WRITE
321 0146 B7 ORA A ;ERRORS?
322 0147 C0 RNZ ;SKIP IF SO
323 0148 AF XRA A ;0 TO ACCUM
324 0149 326B01 STA HSTWRT ;BUFFER WRITTEN
325 014C CD5F01 CALL WRITEHST
326 014F 3A7101 LDA ERFLAG
327 0152 C9 RET
328 ;
329 ;*****************************************************
330 ;* *
331 ;* UTILITY SUBROUTINE FOR 16-BIT COMPARE *
332 ;* *
333 ;*****************************************************
334 SEKTRKCMP:
335 ;HL = .UNATRK OR .HSTTRK, COMPARE WITH SEKTRK
336 0153 EB XCHG
337 0154 216201 LXI H,SEKTRK
338 0157 1A LDAX D ;LOW BYTE COMPARE
339 0158 BE CMP M ;SAME?
340 0159 C0 RNZ ;RETURN IF NOT
341 ; LOW BYTES EQUAL, TEST HIGH 1S
342 015A 13 INX D
343 015B 23 INX H
344 015C 1A LDAX D
345 015D BE CMP M ;SETS FLAGS
346 015E C9 RET
347 ;
348 ;*****************************************************
349 ;* *
350 ;* WRITEHST PERFORMS THE PHYSICAL WRITE TO *
351 ;* THE HOST DISK, READHST READS THE PHYSICAL *
352 ;* DISK. *
353 ;* *
354 ;*****************************************************
355 WRITEHST:
356 ;HSTDSK = HOST DISK #, HSTTRK = HOST TRACK #,
357 ;HSTSEC = HOST SECT #. WRITE "HSTSIZ" BYTES
358 ;FROM HSTBUF AND RETURN ERROR FLAG IN ERFLAG.
359 ;RETURN ERFLAG NON-ZERO IF ERROR
360 015F C9 RET
361 ;
362 READHST:
363 ;HSTDSK = HOST DISK #, HSTTRK = HOST TRACK #,
364 ;HSTSEC = HOST SECT #. READ "HSTSIZ" BYTES
365 ;INTO HSTBUF AND RETURN ERROR FLAG IN ERFLAG.
366 0160 C9 RET
367 ;
368 ;*****************************************************
369 ;* *
370 ;* UNITIALIZED RAM DATA AREAS *
371 ;* *
372 ;*****************************************************
373 ;
374 0161 SEKDSK: DS 1 ;SEEK DISK NUMBER
375 0162 SEKTRK: DS 2 ;SEEK TRACK NUMBER
376 0164 SEKSEC: DS 1 ;SEEK SECTOR NUMBER
377 ;
378 0165 HSTDSK: DS 1 ;HOST DISK NUMBER
379 0166 HSTTRK: DS 2 ;HOST TRACK NUMBER
380 0168 HSTSEC: DS 1 ;HOST SECTOR NUMBER
381 ;
382 0169 SEKHST: DS 1 ;SEEK SHR SECSHF
383 016A HSTACT: DS 1 ;HOST ACTIVE FLAG
384 016B HSTWRT: DS 1 ;HOST WRITTEN FLAG
385 ;
386 016C UNACNT: DS 1 ;UNALLOC REC CNT
387 016D UNADSK: DS 1 ;LAST UNALLOC DISK
388 016E UNATRK: DS 2 ;LAST UNALLOC TRACK
389 0170 UNASEC: DS 1 ;LAST UNALLOC SECTOR
390 ;
391 0171 ERFLAG: DS 1 ;ERROR REPORTING
392 0172 RSFLAG: DS 1 ;READ SECTOR FLAG
393 0173 READOP: DS 1 ;1 IF READ OPERATION
394 0174 WRTYPE: DS 1 ;WRITE OPERATION TYPE
395 0175 DMAADR: DS 2 ;LAST DMA ADDRESS
396 0177 HSTBUF: DS HSTSIZ ;HOST BUFFER
397 ;
398 ;*****************************************************
399 ;* *
400 ;* THE ENDEF MACRO INVOCATION GOES HERE *
401 ;* *
402 ;*****************************************************
403 0377 END
ALLOC 00AE 164 172 177 183 203#
BLKSIZ 0800 29# 151
BOOT 0000 57#
CHKUNA 006F 148 160#
CPMSPT 0050 33# 188
DMAADR 0175 109 294 395#
DPBASE 0000 55# 88
ERFLAG 0171 218 317 326 391#
FILHST 00F2 235 260#
HOME 0008 65# 67#
HOMED 0012 70 72#
HSTACT 016A 61 71 231 383#
HSTBLK 0004 32# 33 34 35
HSTBUF 0177 291 396#
HSTDSK 0165 239 263 378#
HSTSEC 0168 250 267 380#
HSTSIZ 0200 30# 32 396
HSTSPT 0014 31# 33
HSTTRK 0166 244 265 379#
HSTWRT 016B 68 256 272 302 324 384#
MATCH 010F 252 274#
NOMATCH 00EB 241 246 254#
NOOVF 00A7 189 197#
READ 0037 124#
READHST 0160 270 362#
READOP 0173 129 144 296 393#
RSFLAG 0172 130 200 208 268 392#
RWMOVE 0135 298 305# 312
RWOPER 00B6 133 201 215#
SECMSK 0003 34# 277
SECSHF 0002 36# 220
SECTRAN 0034 112#
SEKDSK 0161 78 153 169 238 262 374#
SEKHST 0169 228 249 266 382#
SEKSEC 0164 102 157 180 219 276 376#
SEKTRK 0162 96 155 264 337 375#
SEKTRKCMP 0153 176 245 334#
SELDSK 0013 75#
SETDMA 002E 105#
SETSEC 0029 99#
SETTRK 0023 92#
UNACNT 016C 62 127 152 162 168 206 386#
UNADSK 016D 154 170 387#
UNASEC 0170 158 181 389#
UNATRK 016E 156 175 193 195 388#
WBOOT 0000 58#
WRALL 0000 43#
WRDIR 0001 44# 316
WRITE 004B 141#
WRITEHST 015F 258 325 355#
WRTYPE 0174 132 146 315 394#
WRUAL 0002 45# 131 147
Back to title page
     Next