CP/M MACRO ASSEM 2.0 #001 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 1 ***************************************************************** 2 * * 3 * CP/M VERS 2.2 COLD START LOADER FOR DISK JOCKEY 2D (ALL REVS).* 4 * * 5 * WRITTEN BY BOBBY DALE GIFFORD. * 6 * 11/21/79 * 7 * * 8 * THE COLD BOOT LOADER (SECTOR 1, TRACK 0) IS LOADED * 9 * INTO THE RAM OF THE CONTROLLER BY THE COLD BOOT ROUTINE OF * 10 * THE FIRMWARE. THE FIRST THING THE BOOT DOES IS TO LOAD INTO * 11 * THE CONTROLLER RAM, A VERSION OF THE DISK JOCKEY 2D FIRMWARE. * 12 * FROM THEN ON, ALL CALLS TO THE FIRMWARE WILL ACTUALLY BE * 13 * DIRECTED TO THE DISK JOCKEY RAM. THE NEXT PROCESS IS TO LOAD * 14 * IN A BOOT ROUTINE WHICH CAN LOAD IN ALL OF CP/M. THIS IS * 15 * DONE BY DETERMINING THE SIZE OF THE SECTORS ON TRACK 1, AND * 16 * USING THIS INFORMATION TO LOAD IN THE PROPER BOOT INTO 80H. * 17 * * 18 * THE FOLLOWING TABLES EXPLAIN THE ORDER OF SECTOR LOADING FOR * 19 * EACH OF THE DIFFERENT SECTOR SIZES. AN ENTRY OF ------ * 20 * REPRESENTS A WRAP BACK AROUND (NEGATIVE DMA ADJUSTMENT). * 21 * * 22 * ALL SECTOR SIZES: * 23 * TRACK 0 SECTOR 1 E700 * 24 * 0 8 3200H * 25 * 0 10 3300H * 26 * 0 12 3400H * 27 * 0 14 3500H * 28 * 0 16 3600H * 29 * 0 18 2D80H * 30 * 0 20 2E80H * 31 * 0 22 2F80H * 32 * 0 24 3080H * 33 * 0 26 3180H * 34 * 0 9 3280H * 35 * 0 11 3380H * 36 * 0 13 3480H * 37 * 0 15 3580H * 38 * 0 17 2D00H * 39 * 0 19 2E00H * 40 * 0 21 2F00H * 41 * 0 23 3000H * 42 * 0 25 3100H * 43 * * 44 * THE FOLLOWING DEPEND ON THE SECTOR SIZE, ALL SECTORS ARE FROM * 45 * TRACK 1. * 46 * * 47 * 256 512 1024 * 48 * SEC ADDRESS SEC ADDRESS SEC ADDRESS * 49 * 1 3200H 1 3200H 1 3200H * 50 * 3 3400H 3 3600H 3 3A00H * 51 * 5 3600H 5 3A00H 5 4200H * 52 * 7 3800H 7 3E00H ------------- * 53 * 9 3A00H 9 4200H 2 3600H * 54 * 11 3C00H 11 4600H 4 3E00H * 55 * 13 3E00H ------------- 6 4600H * 56 * 15 4000H 2 3400H * CP/M MACRO ASSEM 2.0 #002 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 57 * 17 4200H 4 3800H * 58 * 19 4400H 6 3C00H * 59 * 21 4600H 8 4000H * 60 * 23 4800H 10 4400H * 61 * ----------- 12 4800H * 62 * 2 3300H * 63 * 4 3500H * 64 * 6 3700H * 65 * 8 3900H * 66 * 10 3B00H * 67 * 12 3D00H * 68 * 14 3F00H * 69 * 16 4100H * 70 * 18 4300H * 71 * 20 4500H * 72 * 22 4700H * 73 * 24 4900H * 74 * * 75 ***************************************************************** 76 77 TITLE '*** COLD BOOT LOADER FOR CP/M VER. 2.2 ***' 78 79 ***************************************************************** 80 * * 81 * COLD BOOT LOADER COMMON TO ALL SECTOR SIZES. * 82 * THIS SECTOR IS LOADED INTO MEMORY AT E700H IN A STANDARD * 83 * CONFIGURATION. IT IS RESPONSIBLE FOR READING MOST OF TRACK 0 * 84 * INTO MEMORY ON COLD BOOTS. * 85 * * 86 ***************************************************************** 87 88 E000 = ORIGIN EQU 0E000H 89 E02D = PUTDEN EQU ORIGIN+02DH ;SET DENSITY ROUTINE ON DISK JOCKEY 2D 90 E012 = PUTDMA EQU ORIGIN+12H ;DISK JOCKEY 2D SET DMA ADDRESS ROUTINE 91 E027 = GETSTAT EQU ORIGIN+27H ;DISK STATUS ROUTINE ON DISK JOCKEY 2D 92 E00F = PUTSEC EQU ORIGIN+0FH ;DISK JOCKEY 2D SET SECTOR ROUTINE 93 E00C = PUTTRK EQU ORIGIN+0CH ;DISK JOCKEY 2D SET TRACK ROUTINE 94 E009 = PUTHOM EQU ORIGIN+9H ;DISK JOCKEY 2D TRACK 0 SEEK 95 E015 = DOREAD EQU ORIGIN+15H ;DISK JOCKEY 2D READ ROUTINE 96 E02A = BOTERR EQU ORIGIN+2AH ;DISK JOCKEY 2D FLASH ERROR LIGHT ROUTINE 97 98 E000 ORG ORIGIN ;DISK JOCKEY 2D RAM 99 100 0018 = MSIZE EQU 24 ;MEMORY SIZE OF TARGET CP/M 101 1000 = BIAS EQU (MSIZE-20)*1024 ;MEMORY OFFSET FROM 20K SYSTEM 102 3D00 = CCP EQU 2D00H+BIAS ;CONSOLE COMMAND PROCESSOR 103 5300 = BIOS EQU CCP+1600H ;CBIOS ADDRESS 104 000A = RETRIES EQU 10 ;MAXIMUM # OF RETIRES 105 106 0700 # DIFF SET ORIGIN+700H-$ ;OFFSET TO BOOT LOADER ADDRESS 107 108 E000 3180E7 LXI SP,STAC+DIFF 109 E003 3E06 FIRMLOD MVI A,6 ;PREVIOUS SECTOR # 110 E004 = NEWSEC EQU $-1 111 E005 3C INR A ;UPDATE SECTOR # 112 E006 3C INR A CP/M MACRO ASSEM 2.0 #003 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 113 E007 FE1B CPI 27 ;TEST IF ALL DONE 114 E009 CA0042 JZ CCP+500H 115 E00C DA11E7 JC NOWRAP+DIFF ;TEST IF WRAP AROUND 116 E00F D613 SUI 19 117 E011 3204E7 NOWRAP STA NEWSEC+DIFF ;SAVE THE UPDATED SECTOR # 118 E014 4F MOV C,A 119 E015 CD0FE0 CALL PUTSEC ;SET UP THE SECTOR 120 E018 210041 LXI H,CCP+400H ;PREVIOUS DMA ADDRESS 121 E019 = NEWDMA EQU $-2 122 E01B 110001 LXI D,100H ;UPDATE DMA ADDRESS 123 E01E 19 DAD D 124 E01F 7C MOV A,H 125 E020 FE46 CPI (CCP+980H)/100H 126 E022 DA32E7 JC NOWRP+DIFF 127 E025 C22EE7 JNZ WRP+DIFF 128 E028 7D MOV A,L 129 E029 FE80 CPI (CCP+980H) MOD 100H 130 E02B DA32E7 JC NOWRP+DIFF 131 E02E 1180F6 WRP LXI D,-980H 132 E031 19 DAD D 133 E032 2219E7 NOWRP SHLD NEWDMA+DIFF ;SAVE THE UPDATED DMA ADDRESS 134 E035 44 MOV B,H 135 E036 4D MOV C,L 136 E037 CD12E0 CALL PUTDMA ;SET UP THE NEW DMA ADDRESS 137 E03A 01000A LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS 138 E03D C5 FREAD PUSH B 139 E03E CD0CE0 CALL PUTTRK ;SET UP THE PROPER TRACK 140 E041 CD15E0 CALL DOREAD ;READ THE SECTOR 141 E044 C1 POP B 142 E045 D203E7 JNC FIRMLOD+DIFF ;CONTINUE IF NO ERROR 143 E048 05 DCR B 144 E049 C23DE7 JNZ FREAD+DIFF ;KEEP TRYING IF ERROR 145 E04C C32AE0 JMP BOTERR ;TO MANY ERRORS, FLASH THE LIGHT 146 E04F DS 80H-($ MOD 80H) 147 E080 = STAC EQU $ 148 149 ***************************************************************** 150 * * 151 * THE FOLLOWING EQUATES RELATE TO THE THINKER TOYS 2D CONTROLLER* 152 * IF THE CONTROLLER IS NON STANDARD (0E000H) ONLY THE ORIGIN * 153 * EQUATE NEED BE CHANGED. THIS VERSION OF THE CBIOS WILL WORK * 154 * WITH 2D CONTROLLER BOARDS REV 0, 1, 3, 3.1, 4. * 155 * * 156 ***************************************************************** 157 158 E400 = DJRAM EQU ORIGIN+400H ;DISK JOCKEY 2D RAM ADDRESS 159 E400 = DJBOOT EQU DJRAM ;DISK JOCKEY 2D BOOT ROUTINE 160 E403 = DJCIN EQU DJRAM+3H ;DISK JOCKEY 2D CHARACTER INPUT ROUTINE 161 E406 = DJCOUT EQU DJRAM+6H ;DISK JOCKEY 2D CHARACTER OUTPUT ROUTINE 162 E409 = DJHOME EQU DJRAM+9H ;DISK JOCKEY 2D TRACK ZERO SEEK 163 E40C = DJTRK EQU DJRAM+0CH ;DISK JOCKEY 2D TRACK SEEK ROUTINE 164 E40F = DJSEC EQU DJRAM+0FH ;DISK JOCKEY 2D SET SECTOR ROUTINE 165 E412 = DJDMA EQU DJRAM+012H ;DISK JOCKEY 2D SET DMA ADDRESS 166 E415 = DJREAD EQU DJRAM+15H ;DISK JOCKEY 2D READ ROUTINE 167 E418 = DJWRITE EQU DJRAM+18H ;DISK JOCKEY 2D WRITE ROUTINE 168 E41B = DJSEL EQU DJRAM+1BH ;DISK JOCKEY 2D SELECT DRIVE ROUTINE CP/M MACRO ASSEM 2.0 #004 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 169 E424 = DJDMAST EQU DJRAM+24H ;DISK JOCKEY 2D DMA STATUS 170 E427 = DJSTAT EQU DJRAM+27H ;DISK JOCKEY 2D STATUS ROUTINE 171 E42A = DJERR EQU DJRAM+2AH ;DISK JOCKEY 2D ERROR, BLINK LED 172 E42D = DJDEN EQU DJRAM+2DH ;DISK JOCKEY 2D SET DENSITY ROUTINE 173 E421 = DJTSTAT EQU DJRAM+21H ;DISK JOCKEY 2D TERMINAL STATUS ROUTINE 174 E430 = DJSIDE EQU DJRAM+30H ;DISK JOCKEY 2D SET SIDE ROUTINE 175 176 ***************************************************************** 177 * * 178 * THE FOLLOWING THREE SECTORS OF CODE RESIDE AT 80H. THERE IS * 179 * ONE SECTOR FOR EACH OF THE POSSIBLE SECTOR SIZES (256,512, * 180 * 1024). EACH SECTOR IS RESPONSIBLE FOR PERFORMING A COLD BOOT * 181 * FOR THE SPECIFIED SECTOR SIZE. * 182 * * 183 ***************************************************************** 184 185 2000 # DIFF SET 80H-$ 186 187 E080 310001 LXI SP,CSTK256+DIFF ;SET UP STACK AT END OF THIS SECTOR 188 E083 010118 LXI B,24*100H+1 ;B = SECTOR COUNT, C = SECTOR # 189 E086 C5 CLOD256 PUSH B ;SAVE SECTOR AND COUNT 190 E087 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ 191 E08A 210040 LXI H,CCP+300H ;GET DMA ADDRESS (SELF MODIFYING) 192 E08B = CDMA256 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS 193 E08D 110002 LXI D,200H ;OFFSET TO NEW DMA ADDRESS 194 E090 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS 195 E091 228B00 SHLD CDMA256+DIFF ;SAVE NEW DMA ADDRESS 196 E094 44 MOV B,H ;PUT DMA ADDRESS INTO BC 197 E095 4D MOV C,L 198 E096 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS 199 E099 CDB600 CALL CRD256+DIFF ;ATTEMPT A READ 200 E09C C1 POP B ;RECOVER SECTOR NUMBER AND COUNT 201 ; B = COUNT, C = NUMBER 202 E09D 05 DCR B ;UPDATE SECTOR COUNT 203 E09E CA0053 JZ BIOS ;ALL DONE ? 204 E0A1 3E02 MVI A,2 ;SECTOR UPDATE 205 E0A3 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR 206 E0A4 4F MOV C,A ;PUT NEW SECTOR BACK INTO C 207 E0A5 FE19 CPI 25 ;PAST THE END OF THE TRACK ? 208 E0A7 DA8600 JC CLOD256+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK 209 E0AA D617 SUI 23 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT 210 E0AC 4F MOV C,A ;PUT NEW SECTOR IN C 211 E0AD 210041 LXI H,CCP+400H ;NEGATIVE DMA ADJUSTMENT 212 E0B0 228B00 SHLD CDMA256+DIFF ;SAVE THE NEW DMA ADDRESS 213 E0B3 C38600 JMP CLOD256+DIFF ;CONTINUE READING 214 215 ***************************************************************** 216 * * 217 * CRD256 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * 218 * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * 219 * * 220 ***************************************************************** 221 222 E0B6 01010A CRD256 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS 223 E0B9 C5 CR256 PUSH B ;SAVE ERROR COUNT 224 E0BA CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK CP/M MACRO ASSEM 2.0 #005 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 225 E0BD CD15E4 CALL DJREAD ;ATTEMPT THE READ 226 E0C0 C1 POP B ;RESTORE THE ERROR COUNT 227 E0C1 D0 RNC ;RETURN IF NO ERROR 228 E0C2 05 DCR B ;UPDATE ERROR COUNT 229 E0C3 C2B900 JNZ CR256+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS 230 E0C6 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER 231 232 E0C9 DS 80H-($ MOD 80H) 233 E100 = CSTK256 EQU $ 234 235 ***************************************************************** 236 * * 237 * THE NEXT LOADS CP/M FROM A 512 BYTE SECTOR DISKETTE. * 238 * * 239 ***************************************************************** 240 241 1F80 # DIFF SET 80H-$ 242 243 E100 310001 LXI SP,CSTK512+DIFF ;SET UP STACK AT END OF THIS SECTOR 244 E103 01010C LXI B,12*100H+1 ;B = SECTOR COUNT, C = SECTOR # 245 E106 C5 CLOD512 PUSH B ;SAVE SECTOR AND COUNT 246 E107 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ 247 E10A 21003E LXI H,CCP+100H ;GET DMA ADDRESS (SELF MODIFYING) 248 E10B = CDMA512 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS 249 E10D 110004 LXI D,400H ;OFFSET TO NEW DMA ADDRESS 250 E110 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS 251 E111 228B00 SHLD CDMA512+DIFF ;SAVE NEW DMA ADDRESS 252 E114 44 MOV B,H ;PUT DMA ADDRESS INTO BC 253 E115 4D MOV C,L 254 E116 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS 255 E119 CDB600 CALL CRD512+DIFF ;ATTEMPT A READ 256 E11C C1 POP B ;RECOVER SECTOR NUMBER AND COUNT 257 ; B = COUNT, C = NUMBER 258 E11D 05 DCR B ;UPDATE SECTOR COUNT 259 E11E CA0053 JZ BIOS ;ALL DONE ? 260 E121 3E02 MVI A,2 ;SECTOR UPDATE 261 E123 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR 262 E124 4F MOV C,A ;PUT NEW SECTOR BACK INTO C 263 E125 FE0D CPI 13 ;PAST THE END OF THE TRACK ? 264 E127 DA8600 JC CLOD512+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK 265 E12A D60B SUI 11 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT 266 E12C 4F MOV C,A ;PUT NEW SECTOR IN C 267 E12D 210040 LXI H,CCP+300H ;NEGATIVE DMA ADJUSTMENT 268 E130 228B00 SHLD CDMA512+DIFF ;SAVE THE NEW DMA ADDRESS 269 E133 C38600 JMP CLOD512+DIFF ;CONTINUE READING 270 271 ***************************************************************** 272 * * 273 * CRD512 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * 274 * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * 275 * * 276 ***************************************************************** 277 278 E136 01010A CRD512 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS 279 E139 C5 CR512 PUSH B ;SAVE ERROR COUNT 280 E13A CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK CP/M MACRO ASSEM 2.0 #006 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 281 E13D CD15E4 CALL DJREAD ;ATTEMPT THE READ 282 E140 C1 POP B ;RESTORE THE ERROR COUNT 283 E141 D0 RNC ;RETURN IF NO ERROR 284 E142 05 DCR B ;UPDATE ERROR COUNT 285 E143 C2B900 JNZ CR512+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS 286 E146 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER 287 288 E149 DS 80H-($ MOD 80H) 289 E180 = CSTK512 EQU $ 290 291 ***************************************************************** 292 * * 293 * THE NEXT SECTOR LOADS CP/M FROM A 1024 BYTE SECTOR DISKETTE. * 294 * * 295 ***************************************************************** 296 297 1F00 # DIFF SET 80H-$ 298 299 E180 310001 LXI SP,CSTK124+DIFF ;SET UP STACK AT END OF THIS SECTOR 300 E183 010106 LXI B,6*100H+1 ;B = SECTOR COUNT, C = SECTOR # 301 E186 C5 CLOD124 PUSH B ;SAVE SECTOR AND COUNT 302 E187 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ 303 E18A 21003A LXI H,CCP-300H ;GET DMA ADDRESS (SELF MODIFYING) 304 E18B = CDMA124 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS 305 E18D 110008 LXI D,800H ;OFFSET TO NEW DMA ADDRESS 306 E190 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS 307 E191 228B00 SHLD CDMA124+DIFF ;SAVE NEW DMA ADDRESS 308 E194 44 MOV B,H ;PUT DMA ADDRESS INTO BC 309 E195 4D MOV C,L 310 E196 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS 311 E199 CDB600 CALL CRD124+DIFF ;ATTEMPT A READ 312 E19C C1 POP B ;RECOVER SECTOR NUMBER AND COUNT 313 ; B = COUNT, C = NUMBER 314 E19D 05 DCR B ;UPDATE SECTOR COUNT 315 E19E CA0053 JZ BIOS ;ALL DONE ? 316 E1A1 3E02 MVI A,2 ;SECTOR UPDATE 317 E1A3 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR 318 E1A4 4F MOV C,A ;PUT NEW SECTOR BACK INTO C 319 E1A5 FE07 CPI 7 ;PAST THE END OF THE TRACK ? 320 E1A7 DA8600 JC CLOD124+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK 321 E1AA D605 SUI 5 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT 322 E1AC 4F MOV C,A ;PUT NEW SECTOR IN C 323 E1AD 21003E LXI H,CCP+100H ;NEGATIVE DMA ADJUSTMENT 324 E1B0 228B00 SHLD CDMA124+DIFF ;SAVE THE NEW DMA ADDRESS 325 E1B3 C38600 JMP CLOD124+DIFF ;CONTINUE READING 326 327 ***************************************************************** 328 * * 329 * RD124 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * 330 * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * 331 * * 332 ***************************************************************** 333 334 E1B6 01010A CRD124 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS 335 E1B9 C5 CR124 PUSH B ;SAVE ERROR COUNT 336 E1BA CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK CP/M MACRO ASSEM 2.0 #007 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 337 E1BD CD15E4 CALL DJREAD ;ATTEMPT THE READ 338 E1C0 C1 POP B ;RESTORE THE ERROR COUNT 339 E1C1 D0 RNC ;RETURN IF NO ERROR 340 E1C2 05 DCR B ;UPDATE ERROR COUNT 341 E1C3 C2B900 JNZ CR124+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS 342 E1C6 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER 343 344 E1C9 DS 80H-($ MOD 80H) 345 E200 = CSTK124 EQU $ 346 347 ***************************************************************** 348 * * 349 * THE NEXT THREE SECTORS OF CODE ALSO RESIDE AT 80H. THERE IS * 350 * ONE SECTOR FOR EACH OF THE POSSIBLE SECTOR SIZES (256,512, * 351 * 1024). EACH SECTOR IS RESPONSIBLE FOR PERFORMING A WARM BOOT * 352 * FOR THE SPECIFIED SECTOR SIZE. * 353 * * 354 * THE FOLLOWING TABLE SHOWS HOW SECTORS ARE READ IN, SKEWING * 355 * OF THE SECTORS IS NECESSARY BECAUSE SEQUENTIAL SECTORS CAN * 356 * NOT BE READ WITHOUT WAITING ONE COMPLETE REVOLUTION BETWEEN * 357 * EACH ONE. ENTRIES OF ---- REPRESENT A WRAP AROUND (NEGATIVE * 358 * DMA ADJUSTMENT). AN ENTRY FLAGGED WITH ** REPRESENTS ONLY A * 359 * PARTIAL LOAD FROM THAT SECTOR. * 360 * * 361 * 256 512 1024 * 362 * SEC ADDRESS SEC ADDRESS SEC ADDRESS * 363 * 1 3200H 1 3200H 1 3200H * 364 * 3 3400H 3 3600H 3 3A00H * 365 * 5 3600H 5 3A00H ** 5 4200H * 366 * 7 3800H 7 3E00H ------------- * 367 * 9 3A00H ** 9 4200H 2 3600H * 368 * 11 3C00H ------------- 4 3E00H * 369 * 13 3E00H 2 3400H * 370 * 15 4000H 4 3800H * 371 * 17 4200H 6 3C00H * 372 * ----------- 8 4000H * 373 * 2 3300H * 374 * 4 3500H * 375 * 6 3700H * 376 * 8 3900H * 377 * 10 3B00H * 378 * 12 3D00H * 379 * 14 3F00H * 380 * 16 4100H * 381 * * 382 ***************************************************************** 383 384 1E80 # DIFF SET 80H-$ 385 386 E200 310001 LXI SP,WSTK256+DIFF ;SET UP STACK AT END OF THIS SECTOR 387 E203 010111 LXI B,17*100H+1 ;B = SECTOR COUNT, C = SECTOR # 388 E206 C5 WLOD256 PUSH B ;SAVE SECTOR AND COUNT 389 E207 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ 390 E20A 210040 LXI H,CCP+300H ;GET DMA ADDRESS (SELF MODIFYING) 391 E20B = WDMA256 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS 392 E20D 110002 LXI D,200H ;OFFSET TO NEW DMA ADDRESS CP/M MACRO ASSEM 2.0 #008 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 393 E210 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS 394 E211 228B00 SHLD WDMA256+DIFF ;SAVE NEW DMA ADDRESS 395 E214 44 MOV B,H ;PUT DMA ADDRESS INTO BC 396 E215 4D MOV C,L 397 E216 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS 398 E219 CDB600 CALL WRD256+DIFF ;ATTEMPT A READ 399 E21C C1 POP B ;RECOVER SECTOR NUMBER AND COUNT 400 ; B = COUNT, C = NUMBER 401 E21D 05 DCR B ;UPDATE THE SECTOR COUNT 402 E21E CA0353 JZ BIOS+3 ;ALL DONE ? 403 E221 3E02 MVI A,2 ;SECTOR UPDATE 404 E223 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR 405 E224 4F MOV C,A ;PUT NEW SECTOR BACK INTO C 406 E225 FE13 CPI 19 ;PAST THE END OF THE TRACK ? 407 E227 DA8600 JC WLOD256+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK 408 E22A D611 SUI 17 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT 409 E22C 4F MOV C,A ;PUT NEW SECTOR IN C 410 E22D 210041 LXI H,CCP+400H ;NEGATIVE DMA ADJUSTMENT 411 E230 228B00 SHLD WDMA256+DIFF ;SAVE THE NEW DMA ADDRESS 412 E233 C38600 JMP WLOD256+DIFF ;CONTINUE READING 413 414 ***************************************************************** 415 * * 416 * WRD256 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * 417 * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * 418 * * 419 ***************************************************************** 420 421 E236 01010A WRD256 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS 422 E239 C5 WR256 PUSH B ;SAVE ERROR COUNT 423 E23A CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK 424 E23D CD15E4 CALL DJREAD ;ATTEMPT THE READ 425 E240 C1 POP B ;RESTORE THE ERROR COUNT 426 E241 D0 RNC ;RETURN IF NO ERROR 427 E242 05 DCR B ;UPDATE ERROR COUNT 428 E243 C2B900 JNZ WR256+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS 429 E246 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER 430 431 E249 DS 80H-($ MOD 80H) 432 E280 = WSTK256 EQU $ 433 434 ***************************************************************** 435 * * 436 * DISK JOCKEY 2D CP/M FROM A 512 BYTE SECTOR DISKETTE. * 437 * * 438 ***************************************************************** 439 440 1E00 # DIFF SET 80H-$ 441 442 E280 310001 LXI SP,WSTK512+DIFF ;SET UP STACK AT END OF THIS SECTOR 443 E283 010901 LXI B,1*100H+9 ;B = SECTOR COUNT, C = SECTOR # 444 E286 CDA800 CALL WLOD512+DIFF ;LOAD SECTOR 9 INTO CCP 445 E289 210052 LXI H,CCP+1500H ;DESTINATION OF MOVE 446 E28C 110042 LXI D,CCP+500H ;SOURCE OF MOVE 447 E28F 0E00 MVI C,0 448 E291 1A MOV512 LDAX D ;GET A BYTE OF SOURCE CP/M MACRO ASSEM 2.0 #009 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 449 E292 77 MOV M,A ;MOVE IT 450 E293 23 INX H ;BUMP DESTINATION 451 E294 13 INX D ;BUMP SOURCE 452 E295 0D DCR C ;ALL DONE WITH THIS PAGE ? 453 E296 C29100 JNZ MOV512+DIFF 454 E299 210040 LXI H,CCP+300H ;INITIAL DMA ADDRESS 455 E29C 22AD00 SHLD WDMA512+DIFF 456 E29F 010208 LXI B,8*100H+2 ;B = SECTOR COUNT, C = SECTOR # 457 E2A2 CDA800 CALL WLOD512+DIFF 458 E2A5 C30353 JMP BIOS+3 459 E2A8 C5 WLOD512 PUSH B ;SAVE SECTOR AND COUNT 460 E2A9 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ 461 E2AC 21003E LXI H,CCP+100H ;GET DMA ADDRESS (SELF MODIFYING) 462 E2AD = WDMA512 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS 463 E2AF 110004 LXI D,400H ;OFFSET TO NEW DMA ADDRESS 464 E2B2 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS 465 E2B3 22AD00 SHLD WDMA512+DIFF ;SAVE NEW DMA ADDRESS 466 E2B6 44 MOV B,H ;PUT DMA ADDRESS INTO BC 467 E2B7 4D MOV C,L 468 E2B8 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS 469 E2BB CDD600 CALL WRD512+DIFF ;ATTEMPT A READ 470 E2BE C1 POP B ;RECOVER SECTOR NUMBER AND COUNT 471 ; B = COUNT, C = NUMBER 472 E2BF 05 DCR B ;UPDATE SECTOR COUNT 473 E2C0 C8 RZ ;ALL DONE ? 474 E2C1 3E02 MVI A,2 ;SECTOR UPDATE 475 E2C3 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR 476 E2C4 4F MOV C,A ;PUT NEW SECTOR BACK INTO C 477 E2C5 FE0A CPI 10 ;PAST THE END OF THE TRACK ? 478 E2C7 DAA800 JC WLOD512+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK 479 E2CA D609 SUI 9 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT 480 E2CC 4F MOV C,A ;PUT NEW SECTOR IN C 481 E2CD 21003E LXI H,CCP+100H ;NEGATIVE DMA ADJUSTMENT 482 E2D0 22AD00 SHLD WDMA512+DIFF ;SAVE THE NEW DMA ADDRESS 483 E2D3 C3A800 JMP WLOD512+DIFF ;CONTINUE READING 484 485 ***************************************************************** 486 * * 487 * WRD512 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * 488 * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * 489 * * 490 ***************************************************************** 491 492 E2D6 01010A WRD512 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS 493 E2D9 C5 WR512 PUSH B ;SAVE ERROR COUNT 494 E2DA CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK 495 E2DD CD15E4 CALL DJREAD ;ATTEMPT THE READ 496 E2E0 C1 POP B ;RESTORE THE ERROR COUNT 497 E2E1 D0 RNC ;RETURN IF NO ERROR 498 E2E2 05 DCR B ;UPDATE ERROR COUNT 499 E2E3 C2D900 JNZ WR512+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS 500 E2E6 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER 501 502 E2E9 DS 80H-($ MOD 80H) 503 E300 = WSTK512 EQU $ 504 CP/M MACRO ASSEM 2.0 #010 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 505 ***************************************************************** 506 * * 507 * THE NEXT SECTOR LOADS CP/M FROM A 1024 BYTE SECTOR DISKETTE. * 508 * * 509 ***************************************************************** 510 511 1D80 # DIFF SET 80H-$ 512 513 E300 310001 LXI SP,WSTK124+DIFF ;SET UP STACK AT END OF THIS SECTOR 514 E303 010501 LXI B,1*100H+5 ;B = SECTOR COUNT, C = SECTOR # 515 E306 CDA800 CALL WLOD124+DIFF ;LOAD SECTOR 6 INTO CCP 516 E309 210052 LXI H,CCP+1500H ;DESTINATION OF MOVE 517 E30C 110042 LXI D,CCP+500H ;SOURCE OF MOVE 518 E30F 0E00 MVI C,0 519 E311 1A MOV124 LDAX D ;GET A BYTE OF SOURCE 520 E312 77 MOV M,A ;MOVE IT 521 E313 23 INX H ;BUMP DESTINATION 522 E314 13 INX D ;BUMP SOURCE 523 E315 0D DCR C ;ALL DONE WITH THIS PAGE ? 524 E316 C29100 JNZ MOV124+DIFF 525 E319 21003E LXI H,CCP+100H ;INITIAL DMA ADDRESS 526 E31C 22AD00 SHLD WDMA124+DIFF 527 E31F 010204 LXI B,4*100H+2 ;B = SECTOR COUNT, C = SECTOR # 528 E322 CDA800 CALL WLOD124+DIFF 529 E325 C30353 JMP BIOS+3 530 E328 C5 WLOD124 PUSH B ;SAVE SECTOR AND COUNT 531 E329 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ 532 E32C 21003A LXI H,CCP-300H ;GET DMA ADDRESS (SELF MODIFYING) 533 E32D = WDMA124 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS 534 E32F 110008 LXI D,800H ;OFFSET TO NEW DMA ADDRESS 535 E332 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS 536 E333 22AD00 SHLD WDMA124+DIFF ;SAVE NEW DMA ADDRESS 537 E336 44 MOV B,H ;PUT DMA ADDRESS INTO BC 538 E337 4D MOV C,L 539 E338 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS 540 E33B CDD600 CALL WRD124+DIFF ;ATTEMPT A READ 541 E33E C1 POP B ;RECOVER SECTOR NUMBER AND COUNT 542 ; B = COUNT, C = NUMBER 543 E33F 05 DCR B ;UPDATE SECTOR COUNT 544 E340 C8 RZ ;ALL DONE ? 545 E341 3E02 MVI A,2 ;SECTOR UPDATE 546 E343 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR 547 E344 4F MOV C,A ;PUT NEW SECTOR BACK INTO C 548 E345 FE06 CPI 6 ;PAST THE END OF THE TRACK ? 549 E347 DAA800 JC WLOD124+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK 550 E34A D605 SUI 5 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT 551 E34C 4F MOV C,A ;PUT NEW SECTOR IN C 552 E34D 21003A LXI H,CCP-300H ;NEGATIVE DMA ADJUSTMENT 553 E350 22AD00 SHLD WDMA124+DIFF ;SAVE THE NEW DMA ADDRESS 554 E353 C3A800 JMP WLOD124+DIFF ;CONTINUE READING 555 556 ***************************************************************** 557 * * 558 * WR124 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * 559 * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * 560 * * CP/M MACRO ASSEM 2.0 #011 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 561 ***************************************************************** 562 563 E356 01010A WRD124 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS 564 E359 C5 WR124 PUSH B ;SAVE ERROR COUNT 565 E35A CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK 566 E35D CD15E4 CALL DJREAD ;ATTEMPT THE READ 567 E360 C1 POP B ;RESTORE THE ERROR COUNT 568 E361 D0 RNC ;RETURN IF NO ERROR 569 E362 05 DCR B ;UPDATE ERROR COUNT 570 E363 C2D900 JNZ WR124+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS 571 E366 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER 572 573 E369 DS 80H-($ MOD 80H) 574 E380 = WSTK124 EQU $ 575 576 ***************************************************************** 577 * * 578 * THE NEXT SECTOR OF CODE RESIDES AT CCP+500H. IT'S TASK IS TO * 579 * MOVE THE FIRMWARE CODE INTO THE DISK JOCKEY RAM, THEN * 580 * LOADING A SECTOR INTO 80H WHICH WILL LOAD THE REST OF CP/M. * 581 * THE SECTOR LOADED AT 80H IS DEPENDENT ON THE SECTOR SIZE * 582 * OF THE DISKETTE BEING BOOTED FROM. * 583 * * 584 ***************************************************************** 585 586 587 5E80 # DIFF SET CCP+500H-$ ;USED TO RELOCATE THIS SECTOR OF CODE 588 589 E380 C30642 JMP DOCOLD+DIFF ;JUMP TO COLD BOOT PORTION 590 E383 C32442 JMP DOWARM+DIFF ;JUMP TO WARM BOOT PORTION 591 592 E386 318042 DOCOLD LXI SP,STK+DIFF ;SET UP INITIAL STACK AT END OF THIS SECTOR 593 E389 2100E4 LXI H,DJRAM ;DESTINATION POINTER 594 E38C 118042 LXI D,STK+DIFF ;SOURCE POINTER 595 E38F 010003 LXI B,300H ;LENGTH OF TRANSFER 596 E392 1A MLOOP LDAX D ;GET ONE BYTE OF SOURCE 597 E393 77 MOV M,A ;PUT AT DESTINATION 598 E394 23 INX H ;BUMP DESTINATION 599 E395 13 INX D ;BUMP SOURCE 600 E396 0B DCX B ;UPDATE COUNT OF BYTES TO MOVE 601 E397 78 MOV A,B ;TEST IF ALL DONE 602 E398 B1 ORA C 603 E399 C21242 JNZ MLOOP+DIFF ;CONTINUE MOVING NEW FIRMWARE 604 E39C CD00E4 CALL DJBOOT ;INITIALIZE THE NEW FIRMWARE 605 E39F 3E01 MVI A,1 606 E3A1 324642 STA BOTBIAS+DIFF ;SET UP FOR PROPER SECTOR SELECT 607 608 E3A4 318042 DOWARM LXI SP,STK+DIFF 609 E3A7 0E01 MVI C,1 ;SET THE DENSITY TO DOUBLE 610 E3A9 CD2DE4 CALL DJDEN 611 E3AC 0E01 MVI C,1 ;SET UP TO READ SECTOR 1 ON TRACK 1 612 E3AE 79 MOV A,C 613 E3AF 326442 STA TRKNUM+DIFF ;SET TRACK 614 E3B2 CD0FE4 CALL DJSEC ;SET SECTOR 615 E3B5 018042 LXI B,STK+DIFF ;SET THE DMA ADDRESS 616 E3B8 CD12E4 CALL DJDMA CP/M MACRO ASSEM 2.0 #012 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 617 E3BB CD6342 CALL REED+DIFF ;READ THE SECTOR INTO MEMORY AT 618 ; END OF THIS SECTOR 619 E3BE CD27E4 CALL DJSTAT ;DETERMINE THE SECTOR SIZE 620 E3C1 E60C ANI 0CH ;STRIP OFF UNWANTED BITS 621 E3C3 1F RAR ;FORM THE DESIRED SECTOR FOR COLD BOOT 622 E3C4 1F RAR ; BASED ON THE LENGTH OF THE 623 E3C5 C604 ADI 4 ; SECTORS ON THIS DISKETTE 624 E3C6 = BOTBIAS EQU $-1 625 E3C7 4F MOV C,A ;PREPARE TO READ THE COLD BOOT 626 E3C8 CD0FE4 CALL DJSEC ;SET UP THE SECTOR 627 E3CB AF XRA A ;TRACK 0 628 E3CC 326442 STA TRKNUM+DIFF 629 E3CF 018000 LXI B,80H ;COLD BOOT LOADS AT 80H 630 E3D2 C5 PUSH B ;USED AS JUMP ADDRESS TO COLD BOOT-- 631 E3D3 CD12E4 CALL DJDMA ; | 632 E3D6 0E00 MVI C,0 ;DENSITY ON TRACK 0 IS SINGLE | 633 E3D8 CD2DE4 CALL DJDEN ; | 634 E3DB CD6342 CALL REED+DIFF ;READ IN THE COLD BOOT | 635 E3DE 0E01 MVI C,1 ;SET THE DENSITY BACK TO DOUBLE | 636 E3E0 C32DE4 JMP DJDEN ; | 637 ;GO TO THE COLD BOOT <-------------- 638 639 ***************************************************************** 640 * * 641 * REED DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * 642 * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * 643 * * 644 ***************************************************************** 645 646 E3E3 01000A REED LXI B,RETRIES*100H+0 ;MAXIMUM # OF ATTEMPTS 647 E3E4 = TRKNUM EQU $-2 ;STORAGE FOR TRACK NUMBER 648 E3E6 C5 REED1 PUSH B ;SAVE ERROR COUNT 649 E3E7 CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK 650 E3EA CD15E4 CALL DJREAD ;ATTEMPT THE READ 651 E3ED C1 POP B ;RESTORE THE ERROR COUNT 652 E3EE D0 RNC ;RETURN IF NO ERROR 653 E3EF 05 DCR B ;UPDATE ERROR COUNT 654 E3F0 C26642 JNZ REED1+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS 655 E3F3 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER 656 657 E3F6 DS 80H-($ MOD 80H) 658 E400 = STK EQU $ 659 660 ***************************************************************** 661 * * 662 * DISK JOCKEY 2D FIRMWARE REVISION 3.1 AND 4.0 * 663 * BY GEORGE MORROW * 664 * * 665 * THE FOLLOWING FIRMWARE IS LOADED INTO MEMORY AND THEN MOVED * 666 * INTO THE CONTROLLER RAM. * 667 * * 668 ***************************************************************** 669 670 E000 = ROM EQU ORIGIN 671 E400 = RAM EQU ORIGIN+400H 672 CP/M MACRO ASSEM 2.0 #013 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 673 E3F8 = IO EQU ROM+3F8H 674 E3F8 = UDATA EQU IO 675 E3F9 = DCMD EQU IO+1 676 E3F9 = DSTAT EQU DCMD 677 E3FA = DREG EQU IO+2 678 E3FA = USTAT EQU DREG 679 E3FC = CMDREG EQU IO+4 680 E3FC = CSTAT EQU CMDREG 681 E3FD = TRKREG EQU IO+5 682 E3FE = SECREG EQU IO+6 683 E3FF = DATREG EQU IO+7 684 * 685 * 686 0080 = RCMD EQU 200Q 687 00A0 = WCMD EQU 240Q 688 0004 = HEAD EQU 4 689 0010 = LOAD EQU 20Q 690 0001 = DENSTY EQU 1 691 0018 = ULOAD EQU 30Q 692 0004 = RSTBIT EQU 4 693 0002 = ACCESS EQU 2 694 0020 = READY EQU 40Q 695 0010 = INDEX EQU 20Q 696 00C4 = RACMD EQU 304Q 697 00D0 = CLRCMD EQU 320Q 698 001D = SVCMD EQU 35Q 699 0018 = SKCMD EQU 30Q 700 0009 = HCMD EQU 11Q 701 0004 = ISTAT EQU 4 702 0008 = OSTAT EQU 10Q 703 0008 = DSIDE EQU 10Q 704 0004 = TZERO EQU 4 705 0003 = MDINT EQU 3 706 001E = LIGHT EQU 36Q 707 003E = NOLITE EQU 76Q 708 * 709 * 710 E400 C333E4 DBOOT JMP BOOT 711 E403 C3A1E4 TERMIN JMP CIN 712 E406 C392E4 TRMOUT JMP COUT 713 E409 C311E5 TKZERO JMP HOME 714 E40C C345E5 TRKSET JMP SEEK 715 E40F C338E5 SETSEC JMP SECSET 716 E412 C3F8E4 SETDMA JMP DMA 717 E415 C397E5 DREAD JMP READ 718 E418 C376E5 DWRITE JMP WRITE 719 E41B C3EDE4 SELDRV JMP DRIVE 720 E41E C3B0E4 TPANIC JMP CPAN 721 E421 C3BBE4 TSTAT JMP TMSTAT 722 E424 C3E5E4 DMAST JMP DMSTAT 723 E427 C3C1E4 STATUS JMP DISKST 724 E42A C32AE0 DSKERR JMP ROM+52Q 725 E42D C3CAE7 SETDEN JMP DENFIX 726 E430 C392E6 SETSID JMP SIDEFX 727 * 728 * CP/M MACRO ASSEM 2.0 #014 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 729 E433 3AF4E3 BOOT LDA IO-4 ;TEST FOR MODEL A OR B 730 E436 FEC9 CPI (RET) 731 E438 CA4CE4 JZ MODELA 732 E43B 1100E0 LXI D,ORIGIN 733 E43E 2100E4 LXI H,RAM 734 E441 0E33 MVI C,BOOT-DBOOT ;COPY PROM JUMP TABLE INTO RAM 735 E443 1A MODELM LDAX D 736 E444 77 MOV M,A 737 E445 13 INX D 738 E446 23 INX H 739 E447 0D DCR C 740 E448 C243E4 JNZ MODELM 741 E44B C9 RET 742 E44C 0E00 MODELA MVI C,0 ;COPY LAST PAGE OF RAM 743 E44E CD43E4 CALL MODELM 744 E451 2A07E0 LHLD ROM+7 ;FIND THE 2ND 745 E454 23 INX H ; BYTE OF INPUT ROUTINE 746 E455 110400 LXI D,4 ;OFFSET 747 E458 7E MOV A,M ;GET ADDR OF USTAT 748 E459 21EAE7 LXI H,SDSEL+1 ;I/O ROUTINES 749 E45C 77 MOV M,A ;STORE USTAT ADDR 750 E45D 19 DAD D ;INCREMENT MEM ADDR 751 E45E 77 MOV M,A ;STORE USTAT ADDR 752 E45F 19 DAD D ;INCREMENT MEM ADDR 753 E460 EE03 XRI 3 ;SWITCH THE ADDR 754 E462 77 MOV M,A ;STORE DSTAT ADDR 755 E463 19 DAD D ;INCREMENT MEM ADDR 756 E464 77 MOV M,A ;STORE DATAT ADDR 757 E465 19 DAD D ;INCREMENT MEM ADDR 758 E466 77 MOV M,A ;STORE DSTAT ADDR 759 DSETUP 760 E467 3E03 MVI A,MDINT ;INITIALIZE 1791 761 E469 CDF1E7 CALL SCBITS ; CONTROL BITS 762 E46C 3ED0 MVI A,CLRCMD ;1791 RESET 763 E46E 32FCE3 STA CMDREG ; COMMAND 764 LDHEAD 765 E471 AF XRA A ;LOAD THE HEAD 766 E472 CD36E7 CALL HDCHK ; AND TEST FOR 767 E475 D283E4 JNC DOOROK ; DRIVE READY 768 E478 3E1E MVI A,LIGHT ;TURN ON THE 769 E47A 32EAE6 STA DRVSEL ; ERROR LED 770 E47D CD9DE6 CALL TIMOUT ;TIME OUT TO 771 E480 C371E4 JMP LDHEAD ; CLOSE DRIVE DOOR 772 DOOROK 773 E483 3E3E MVI A,NOLITE ;TURN OFF THE 774 E485 32EAE6 STA DRVSEL ; ERROR LED 775 E488 3603 MVI M,MDINT ;OPEN DATA REG 776 E48A CDADE7 CALL MEASUR ;HEAD LOAD TIME 777 E48D EB XCHG ; NEW TIMER VALUE 778 E48E 22E5E6 SHLD TIMER 779 E491 C9 RET 780 * 781 * 782 COUT 783 E492 CDEDE7 CALL LUSTAT ;GET UART STATUS 784 E495 E608 ANI OSTAT ;OUTPUT READY BIT CP/M MACRO ASSEM 2.0 #015 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 785 E497 C292E4 JNZ COUT ;TEST OUTPUT READY 786 E49A 79 MOV A,C ;CHARACTER DATA 787 E49B 2F CMA 788 E49C 32F8E3 STA UDATA ;SEND TO UART 789 E49F 2F CMA 790 E4A0 C9 RET 791 * 792 * 793 CIN 794 E4A1 CDEDE7 CALL LUSTAT ;GET UART STATUS 795 E4A4 E604 ANI ISTAT ;INPUT READY BIT 796 E4A6 C2A1E4 JNZ CIN ;TEST INPUT READY 797 E4A9 3AF8E3 LDA UDATA ;GET THE CHARACTER 798 E4AC 2F CMA 799 E4AD E67F ANI 177Q 800 E4AF C9 RET 801 * 802 * 803 CPAN 804 E4B0 CDEDE7 CALL LUSTAT ;GET UART STATUS 805 E4B3 E604 ANI ISTAT ;INPUT READY BIT 806 E4B5 C0 RNZ ;TEST FOR CHARACTER 807 E4B6 CDA1E4 CALL CIN ;GET CHARACTER 808 E4B9 B9 CMP C ;TEST FOR PANIC 809 E4BA C9 RET 810 * 811 * 812 TMSTAT 813 E4BB CDEDE7 CALL LUSTAT ;GET UART STATUS 814 E4BE E604 ANI ISTAT ;INPUT READY BIT 815 E4C0 C9 RET 816 * 817 * 818 DISKST 819 E4C1 3AFEE3 LDA SECREG ;GET CURRENT 820 E4C4 47 MOV B,A ; SECTOR NO IN B 821 E4C5 3AFDE3 LDA TRKREG ;GET CURRENT 822 E4C8 4F MOV C,A ; TRACK NO IN C 823 E4C9 3AF6E6 LDA DCREG ;GET CURRENT 824 E4CC 2F CMA ; DENSITY IN 825 E4CD E601 ANI 1 ; THE MSB 826 E4CF 0F RRC ;POSITION 827 E4D0 57 MOV D,A ;SAVE IN D 828 E4D1 3AF7E6 LDA SIDE ;PUT THE 829 E4D4 07 RLC ; SIDE 830 E4D5 07 RLC ; SELECT 831 E4D6 07 RLC ; FLAG 832 E4D7 82 ADD D ; IN BIT 833 E4D8 57 MOV D,A ; POSITION 6 834 E4D9 3AFDE6 LDA SECLEN ;PUT THE 835 E4DC 07 RLC ; SECTOR LENGTH 836 E4DD 07 RLC ; CODE P BITS 837 E4DE 82 ADD D ; 2 & 3 838 E4DF 57 MOV D,A 839 E4E0 3AECE6 LDA CDISK ;PUT THE CURRENT 840 E4E3 82 ADD D ; DISK NO IN BITS CP/M MACRO ASSEM 2.0 #016 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 841 E4E4 C9 RET ; 0 & 1 842 * 843 * 844 DMSTAT 845 E4E5 E5 PUSH H ;SAVE THE H-L PAIR 846 E4E6 2AE7E6 LHLD DMAADR ;H-L PAIN 847 E4E9 44 MOV B,H ;MOVE THE DMA 848 E4EA 4D MOV C,L ;ADDR TO B-C 849 E4EB E1 POP H ;RECOVER H-L 850 E4EC C9 RET 851 * 852 * 853 DRIVE 854 E4ED 3EFC MVI A,374Q ;TEST FOR THE 855 E4EF 81 ADD C ; NEW DRIVE NUMBER 856 E4F0 3E10 MVI A,20Q ;LESS THAN 4 857 E4F2 D8 RC 858 E4F3 79 MOV A,C ;STORE THE NEW 859 E4F4 32EBE6 STA DISK ;DRIVE IN DISK 860 E4F7 C9 RET 861 * 862 * 863 DMA 864 E4F8 210820 LXI H,8-ROM ;TEST THE 865 E4FB 09 DAD B ; DMA ADDRESS 866 E4FC D20AE5 JNC DMASET ; FOR CONFLICT 867 E4FF 21001C LXI H,-RAM ; WITH THE I/O 868 E502 09 DAD B ; ON THE DJ/2D 869 E503 DA0AE5 JC DMASET ;CONTROLLER 870 E506 37 STC 871 E507 3E10 MVI A,20Q 872 E509 C9 RET 873 DMASET 874 E50A 60 MOV H,B ;GET THE DMA ADDR 875 E50B 69 MOV L,C ;TO THE H-L PAR 876 E50C 22E7E6 SHLD DMAADR ;STORE 877 E50F AF XRA A ;CLEAR THE ERROR 878 E510 C9 RET ; FLAG AND RETURN 879 * 880 * 881 HOME 882 E511 CD00E7 CALL HDLOAD ;LOAD THE HEAD 883 E514 D8 RC ;NOT READY ERROR 884 E515 CD27E5 CALL HENTRY ;MOVE THE HEAD 885 E518 F5 PUSH PSW ;SAVE THE FLAGS 886 E519 9F SBB A ;UPDATE THE 887 E51A 32F9E6 STA TRACK ; TRACK 888 E51D 32FDE3 STA TRKREG ; REGISTERS 889 E520 AF XRA A ;SET THE NOT 890 E521 32EDE6 STA TZFLAG ; VERIFIED FLAG 891 E524 C3DDE5 JMP LEAVE+1 ;UNLOAD THE HEAD 892 HENTRY 893 E527 AF XRA A ;UPDATE 894 E528 32E9E6 STA HDFLAG ; FLAGS 895 E52B 210000 LXI H,0 ;TIME OUT CONSTANT 896 E52E 3E09 MVI A,HCMD ;DO THE HOME CP/M MACRO ASSEM 2.0 #017 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 897 E530 CD7DE7 CALL CENTRY ; COMMAND 898 E533 E604 ANI TZERO ;TRACK ZERO BIT 899 E535 C0 RNZ 900 E536 37 STC ;ERROR FLAG 901 E537 C9 RET 902 * 903 * 904 SECSET 905 E538 AF XRA A ;TEST FOR 906 E539 B1 ORA C ; SECTOR ZERO 907 E53A 37 STC ;ERROR FLAG 908 E53B C8 RZ 909 E53C 79 MOV A,C ;TEST FOR 910 E53D FE1B CPI 27 ; SECTOR 911 E53F 3F CMC ;TOO LARGE 912 E540 D8 RC 913 E541 32F8E6 STA SECTOR ;SAVE 914 E544 C9 RET 915 * 916 * 917 SEEK 918 E545 79 MOV A,C ;TEST FOR 919 E546 FE4D CPI 77 ; TRACK 920 E548 3F CMC ; TOO LARGE 921 E549 D8 RC 922 E54A 32F9E6 STA TRACK ;SAVE 923 E54D C9 RET 924 * 925 * 926 ISSUE 927 E54E 32E4E6 STA ECOUNT+1 ;UPDATE COUNT 928 E551 CDADE7 CALL MEASUR ;FIND THE INDEX 929 E554 0E01 MVI C,1 ;START W/SECTOR 1 930 ISLOOP 931 E556 79 MOV A,C ;INITIALIZE THE 932 E557 32FEE3 STA SECREG ; SECTOR REGISTER 933 E55A 3AF8E6 LDA SECTOR ;TEST FOR 934 E55D B9 CMP C ; TARGET SECTOR 935 E55E C8 RZ 936 E55F 3E80 MVI A,RCMD ;DO A FAKE 937 E561 CD78E7 CALL COMAND ; READ COMMAND 938 E564 DADAE5 JC PLEAVE ;ABORT ON ERROR 939 E567 0C INR C ;INCREMENT SECTOR NO. 940 E568 C356E5 JMP ISLOOP 941 942 COMNDP 943 E56B 32FCE3 STA CMDREG ;DO THE COMMAND 944 E56E 48 MOV C,B ;INITIALIZE BLOCK COUNT 945 E56F 11FFE3 LXI D,DATREG ;DATA REGISTER 946 E572 2AE7E6 LHLD DMAADR ;TRANSFER ADDRESS 947 E575 C9 RET 948 949 WRITE 950 E576 CDE7E5 CALL PREP ;PREPARE FOR WRITE 951 E579 DADCE5 JC LEAVE ;ABORT OPERATION 952 WRENTRY CP/M MACRO ASSEM 2.0 #018 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 953 E57C 3EA0 MVI A,WCMD ;START A WRITE 954 E57E CD6BE5 CALL COMNDP ; SECTOR OPERATION 955 WRLOOP 956 E581 7E MOV A,M ;LOAD 1ST BYTE OF DATA 957 E582 23 INX H ;ADVANCE POINTER 958 E583 12 STAX D ;WRITE 1ST BYTE OF DATA 959 E584 7E MOV A,M ;LOAD 2ND BYTE OF DATA 960 E585 23 INX H ;ADVANCE POINTER 961 E586 12 STAX D ;WRITE 2ND BYTE OF DATA 962 E587 7E MOV A,M ;LOAD 3RD BYTE OF DATA 963 E588 23 INX H ;ADVANCE POINTER 964 E589 12 STAX D ;WRITE 3RD BYTE OF DATA 965 E58A 0D DCR C ;REDUCE BLOCK COUNT 966 E58B 7E MOV A,M ;LOAD 4TH BYTE OF DATA 967 E58C 23 INX H ;ADVANCE POINTER 968 E58D 12 STAX D ;WRITE 4TH BYTE OF DATA 969 E58E C281E5 JNZ WRLOOP ;WRITE NEXT 4 BYTES 970 E591 217CE5 LXI H,WRENTRY ;RETURN ENTRY ADDRESS 971 E594 C3B5E5 JMP CBUSY 972 973 READ 974 E597 CDE7E5 CALL PREP ;PREPARE FOR READ 975 E59A DADCE5 JC LEAVE ;ABORT OPERATION 976 RDENTRY 977 E59D 3E80 MVI A,RCMD ;START A READ 978 E59F CD6BE5 CALL COMNDP ; SECTOR OPERATION 979 RDLOOP 980 E5A2 1A LDAX D ;READ 1ST BYTE 981 E5A3 77 MOV M,A ;STORE 1ST BYTE 982 E5A4 23 INX H ;ADVANCE POINTER 983 E5A5 1A LDAX D ;READ 2ND BYTE 984 E5A6 77 MOV M,A ;STORE 2ND BYTE 985 E5A7 23 INX H ;ADVANCE POINTER 986 E5A8 1A LDAX D ;READ 3RD BYTE 987 E5A9 77 MOV M,A ;STORE 3RD BYTE 988 E5AA 23 INX H ;ADVANCE POINTER 989 E5AB 0D DCR C ;REDUCE BLOCK COUNT 990 E5AC 1A LDAX D ;READ 4TH BYTE 991 E5AD 77 MOV M,A ;STORE 4TH BYTE 992 E5AE 23 INX H ;ADVANCE POINTER 993 E5AF C2A2E5 JNZ RDLOOP ;READ NEXT 4 BYTES 994 E5B2 219DE5 LXI H,RDENTRY ;RETURN ENTRY ADDRESS 995 CBUSY 996 E5B5 E5 PUSH H ;SAVE RETURN ADDRESS 997 E5B6 21FCE3 LXI H,CSTAT ;WAIT FOR THE 1791 998 E5B9 CD87E7 CALL BUSY ; TO FINISH COMMAND 999 E5BC E65F ANI 137Q ;ERROR BIT MASK 1000 E5BE CADBE5 JZ LEAVE-1 ; TEST 1001 E5C1 FE10 CPI 10H ;PREMATURE INTERRUPT 1002 E5C3 C2DAE5 JNZ PLEAVE ;OTHER ERROR TYPE 1003 E5C6 3AE3E6 LDA ECOUNT ;DECREMENT ERROR 1004 E5C9 3D DCR A ; COUNT NUMBER 1 1005 E5CA FAD1E5 JM STEST ;HARD INTERRUPT ERROR 1006 E5CD 32E3E6 STA ECOUNT ;UPDATE COUNT 1007 E5D0 C9 RET ;DO OPERATION OVER 1008 STEST CP/M MACRO ASSEM 2.0 #019 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 1009 E5D1 3AE4E6 LDA ECOUNT+1 ;DECREMENT ERROR 1010 E5D4 3D DCR A ; COUNT NUMBER 2 1011 E5D5 F24EE5 JP ISSUE ;ISSUE A COMMAND 1012 E5D8 3E10 MVI A,10H ;IRRECOVERABLE ERROR 1013 PLEAVE 1014 E5DA 37 STC ;ERROR FLAG 1015 E5DB E1 POP H ;ADJUST THE STACK 1016 LEAVE 1017 E5DC F5 PUSH PSW ;SAVE THE FLAGS 1018 E5DD 3AF6E6 LDA DCREG ;1791 CONTROL BITS 1019 E5E0 EE10 XRI LOAD ;TOGGLE THE 1020 E5E2 CDF1E7 CALL SCBITS ; HEAD LOAD BITS 1021 E5E5 F1 POP PSW ;RECOVER THE FLAGS 1022 E5E6 C9 RET 1023 * 1024 * 1025 PREP 1026 E5E7 CD00E7 CALL HDLOAD ;LOAD THE HEAD 1027 E5EA D8 RC ;DISK NOT READY? 1028 E5EB 3AFDE3 LDA TRKREG ;GET THE OLD TRK 1029 E5EE 3C INR A ;TEST FOR HEAD 1030 E5EF CC27E5 CZ HENTRY ; NOT CALIBRATED 1031 E5F2 D8 RC ;SEEK ERROR? 1032 E5F3 21FDE3 LXI H,TRKREG ;PRESENT TRK 1033 E5F6 3AF9E6 LDA TRACK ;THE NEW TRACK 1034 E5F9 BE CMP M ;TEST FOR HEAD MOTION 1035 E5FA 23 INX H ;ADVANCE TO THE 1036 E5FB 23 INX H ; DATA REGISTER 1037 E5FC 77 MOV M,A ;SAVE THE NEW TRK 1038 E5FD 79 MOV A,C ;TURN OFF DATA 1039 E5FE CDF1E7 CALL SCBITS ; ACCESS CONTROL BIT 1040 E601 CA1BE6 JZ TVERFY ;TEST FOR SEEJ 1041 E604 AF XRA A ;FORCE A READ 1042 E605 32E9E6 STA HDFLAG ; HEADER OPERATION 1043 E608 CDF5E7 CALL LDSTAT ;GET THE 1044 E60B E608 ANI DSIDE ; DOUBLE 1045 E60D 1F RAR ; 1046 E60E 1F RAR ; FLAG 1047 E60F 1F RAR ; TO DO 3 MS 1048 E610 C618 ADI SKCMD ; STEP OPERATION 1049 E612 210000 LXI H,0 ;DO A SEEK 1050 E615 CD7DE7 CALL CENTRY ; COMMAND 1051 E618 DA41E6 JC SERROR ;SEEK ERROR? 1052 TVERFY 1053 E61B 3AE9E6 LDA HDFLAG ;GET THE FORCE 1054 E61E B7 ORA A ; VERIFY TRACK FLAG 1055 E61F C26CE6 JNZ CHKSEC ;NO SEEK & HEAD OK 1056 E622 0602 MVI B,2 ;VERIFY RETRY NO 1057 SLOOP 1058 E624 3E1D MVI A,SVCMD ;DO A VERIFY 1059 E626 CD78E7 CALL COMAND ; COMMAND 1060 E629 E699 ANI 231Q ;ERROR BIT MASK 1061 E62B 57 MOV D,A ;SAVE 1062 E62C CA48E6 JZ RDHDR ;NO ERROR 1063 E62F 3AF6E6 LDA DCREG ;1791 CONTROL REG 1064 E632 EE01 XRI DENSTY ;FLIP THE DENSITY BIT CP/M MACRO ASSEM 2.0 #020 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 1065 E634 32F6E6 STA DCREG ;UPDATE 1066 E637 EE02 XRI ACCESS 1067 E639 CDF1E7 CALL SCBITS ;CHANGE DENSITY 1068 E63C 05 DCR B ;DEC RETRY COUNT 1069 E63D C224E6 JNZ SLOOP ; AND TRY AGAIN 1070 E640 7A MOV A,D ;RESTORE ERROR BITS 1071 SERROR 1072 E641 37 STC ;ERROR FLAG 1073 E642 F5 PUSH PSW ;SAVE THE STATUS 1074 E643 CD27E5 CALL HENTRY ;SEEK TO TRACK 0 1075 E646 F1 POP PSW ;RECOVER ERRORS 1076 E647 C9 RET 1077 RDHDR 1078 E648 060A MVI B,12Q ;NUMBER OF RETRYS 1079 RHLOOP 1080 E64A 11FFE3 LXI D,DATREG ;DATA REGISTER 1081 E64D 21FAE6 LXI H,TRACK+1 ;STORAGE AREA 1082 E650 3EC4 MVI A,RACMD ;DO THE READ 1083 E652 32FCE3 STA CMDREG ; HEADER COMMAND 1084 RHL1 1085 E655 1A LDAX D ;GET A DATA BYTE 1086 E656 77 MOV M,A ;STORE IN MEMORY 1087 E657 2C INR L ;INC MEM POINTER 1088 E658 C255E6 JNZ RHL1 ;TEST FOR MORE DATA 1089 E65B 21FCE3 LXI H,CSTAT ;WAIT FOR 1791 1090 E65E CD87E7 CALL BUSY ;TO FINISH CMD 1091 E661 B7 ORA A ;TEST FOR ERRORS 1092 E662 CA6CE6 JZ CHKSEC ;TRANSFER OK? 1093 E665 05 DCR B ;DEC RETRY COUNT 1094 E666 C24AE6 JNZ RHLOOP ;TEST FOR 1095 E669 C341E6 JMP SERROR ; HARD ERROR 1096 CHKSEC 1097 E66C 3AFDE6 LDA SECLEN ;GET THE SECTOR 1098 E66F 4F MOV C,A ; SIZE AND SETUP 1099 E670 0600 MVI B,0 ; THE OFFSET 1100 E672 21DFE6 LXI H,STABLE ;SEC SIZE TBL 1101 E675 09 DAD B ;ADD THE OFFSET 1102 E676 3AF8E6 LDA SECTOR ;GET THE SECTOR 1103 E679 47 MOV B,A ;SAVE IN B 1104 E67A 86 ADD M ;COMPARE W/TABLE ENTRY 1105 E67B 3E10 MVI A,20Q ;ERROR FLAG 1106 E67D D8 RC ;ERROR RETURN 1107 E67E 78 MOV A,B ;SAVE THE SECTOR 1108 E67F 32FEE3 STA SECREG ; IN SECTOR REG 1109 E682 3E20 MVI A,40Q ;128 BYTE SECTOR 1110 E684 210505 LXI H,505H ;INITIALIZE 1111 E687 22E3E6 SHLD ECOUNT ; ERROR COUNTS 1112 SZLOOP 1113 E68A 0D DCR C ;REDUCE SIZE COUNT 1114 E68B 47 MOV B,A ;SECTOR SIZE TO B 1115 E68C F8 RM ;RETURN ON MINUS 1116 E68D 17 RAL ;DOUBLE THE COUNT 1117 E68E B7 ORA A ;CLEAR THE CARRY 1118 E68F C38AE6 JMP SZLOOP 1119 * 1120 * CP/M MACRO ASSEM 2.0 #021 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 1121 SIDEFX 1122 E692 79 MOV A,C ;GET THE SIDE BIT 1123 E693 E601 ANI 1 ;TRIM EXCESS BITS 1124 E695 17 RAL ;MOVE THE BIT 1125 E696 17 RAL ; TO THE SIDE 1126 E697 17 RAL ; SELECT BIT 1127 E698 17 RAL ; POSITION 1128 E699 32F7E6 STA SIDE ;SAVE 1129 E69C C9 RET 1130 * 1131 * 1132 TIMOUT 1133 E69D 210000 LXI H,0 ;TIME OUT DELAY 1134 TILOOP 1135 E6A0 2B DCX H ;DECREMENT 1136 E6A1 7C MOV A,H ;TEST FOR 1137 E6A2 B5 ORA L ; COUNT ZERO 1138 E6A3 E3 XTHL ;LONG 1139 E6A4 E3 XTHL ; NOP 1140 E6A5 C2A0E6 JNZ TILOOP 1141 E6A8 C9 RET 1142 TOEND 1143 * 1144 * 1145 E6A9 DS 300H-TOEND+DBOOT-66Q 1146 E6CA DS 25Q 1147 * 1148 * 1149 STACK 1150 * 1151 * 1152 STABLE 1153 E6DF E5 DB 345Q 1154 E6E0 E5 DB 345Q 1155 E6E1 F0 DB 360Q 1156 E6E2 F7 DB 367Q 1157 * 1158 * 1159 E6E3 0000 ECOUNT DW 0 ;ERROR COUNT CELLS 1160 E6E5 0030 TIMER DW 3000H ;HEAD LOAD TIME 1161 E6E7 8000 DMAADR DW 200Q ;DMA ADDRESS 1162 E6E9 00 HDFLAG DB 0 ;READ HEADER FLAG 1163 E6EA FE DRVSEL DB 376Q ;DRIVE SELECT CONSTANT 1164 E6EB 00 DISK DB 0 ;NEW DRIVE 1165 E6EC 08 CDISK DB 10Q ;CURRENT DRIVE 1166 E6ED 00 TZFLAG DB 0 ;TRACK ZERO INDICATOR 1167 E6EE 03 D0PRAM DB 3 ;DRIVE 0 PARAMETERS 1168 E6EF FF D0TRK DB 377Q ;DRIVE 0 TRACK NO 1169 E6F0 03 D1PRAM DB 3 ;DRIVE 1 PARAMETERS 1170 E6F1 FF D1TRK DB 377Q ;DRIVE 1 TRACK NO 1171 E6F2 03 D2PRAM DB 3 ;DRIVE 2 PARAMETERS 1172 E6F3 FF D2TRK DB 377Q ;DRIVE 2 TRACK NO 1173 E6F4 03 D3PRAM DB 3 ;DRIVE 3 PARAMETERS 1174 E6F5 FF D3TRK DB 377Q ;DRIVE 3 TRACK NO 1175 E6F6 03 DCREG DB 3 ;CURRENT PARAMETERS 1176 E6F7 00 SIDE DB 0 ;NEW SIDE SELECT CP/M MACRO ASSEM 2.0 #022 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 1177 E6F8 03 SECTOR DB 3 ;NEW SECTOR 1178 E6F9 00 TRACK DB 0 ;NEW TRACK 1179 E6FA 00 TRKNO DB 0 ;DISK 1180 E6FB 00 SIDENO DB 0 ; SECTOR 1181 E6FC 00 SECTNO DB 0 ; HEADER 1182 E6FD 00 SECLEN DB 0 ; DATA 1183 E6FE 00 CRCLO DB 0 ; BUFFER 1184 E6FF 00 CRCHI DB 0 1185 * 1186 * 1187 HDLOAD 1188 E700 21EBE6 LXI H,DISK 1189 E703 4E MOV C,M ;NEW DISK NO TO C 1190 E704 23 INX H 1191 E705 5E MOV E,M ;CURRENT DISK TO E 1192 E706 71 MOV M,C ;UPDATE CURRENT DISK 1193 E707 23 INX H ;ADDR OF DISK TABLE 1194 E708 7B MOV A,E ;TEST FOR 1195 E709 B9 CMP C ; DISK CHANGE 1196 E70A 7E MOV A,M ;HEAD LOAD FLAG 1197 E70B 3604 MVI M,HEAD ;UPDATE HEAD LOAD 1198 E70D 23 INX H ;ADDR OF DISK TABLE 1199 E70E CA36E7 JZ HDCHK ;NO DISK CHANGE? 1200 E711 E5 PUSH H ;SAVE TABLE ADDRESS 1201 E712 1600 MVI D,0 ;SET UP THE 1202 E714 42 MOV B,D ; OFFSET ADDRESS 1203 E715 19 DAD D ;GET THE CURRENT 1204 E716 19 DAD D ; DISK PARAMETERS 1205 E717 3AF6E6 LDA DCREG ;SAVE THE 1206 E71A 77 MOV M,A ;DENSITY INFO 1207 E71B 23 INX H ;CURRENT TRACK 1208 E71C 11FDE3 LXI D,TRKREG 1209 E71F 1A LDAX D ;GET CURRENT TRK 1210 E720 77 MOV M,A ;SAVE 1211 E721 E1 POP H ;RECOVER TBL ADDR 1212 E722 09 DAD B ;ADD THE 1213 E723 09 DAD B ; OFFSET 1214 E724 7E MOV A,M ;GET CONTROL BITS 1215 E725 32F6E6 STA DCREG ;UPDATE DCREG 1216 E728 23 INX H ;GET THE OLD 1217 E729 7E MOV A,M ;TRACK NUMBER 1218 E72A 12 STAX D ;AND UPDATE 1791 1219 E72B 3E7F MVI A,177Q ;DISK SELECT BITS 1220 DSROT 1221 E72D 07 RLC ;ROTATE TO 1222 E72E 0D DCR C ; SELECT THE 1223 E72F F22DE7 JP DSROT ; PROPER DRIVE 1224 E732 32EAE6 STA DRVSEL ;SAVE 1225 E735 AF XRA A ;FORCE HEAD LOAD 1226 HDCHK 1227 E736 CDF9E7 CALL LOADS ;TEST FOR 1228 E739 A6 ANA M ; HEAD LOADED 1229 E73A 32E9E6 STA HDFLAG ;SAVE THE HEAD 1230 E73D F5 PUSH PSW ; LOADED STATUS 1231 E73E 3AEAE6 LDA DRVSEL ;GET CURRENT DRIVE 1232 E741 4F MOV C,A ;SAVE CP/M MACRO ASSEM 2.0 #023 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 1233 E742 3AF7E6 LDA SIDE ;GET CURRENT SIDE 1234 E745 2F CMA ;AND MERGE 1235 E746 A1 ANA C ; WITH DRIVE SELECT 1236 E747 CDE9E7 CALL SDSEL ;SELECT DRIVE & SIDE 1237 E74A 3AF6E6 LDA DCREG ;1791 CONTROL BITS 1238 E74D 4F MOV C,A ;SAVE 1239 E74E 3AF9E6 LDA TRACK ;GET THE NEW TRK 1240 E751 D601 SUI 1 ;FORCE SINGLE 1241 E753 9F SBB A ; DENSITY 1242 E754 3D DCR A ; IF TRACK = 0 1243 E755 2F CMA ;COMPLIMENT 1244 E756 B1 ORA C ;MERGE W/CONTROL BITS 1245 E757 77 MOV M,A ;SET 1791 CONTROL 1246 E758 EE02 XRI ACCESS ;TOGGEL ACCESS BIT 1247 E75A 4F MOV C,A ;SAVE PREP ROUTINE 1248 E75B F1 POP PSW ;HEAD LOAD STATUS 1249 E75C C26AE7 JNZ RDYCHK ;CONDITIONALLY 1250 E75F E5 PUSH H ; WAIT FOR HEAD 1251 E760 2AE5E6 LHLD TIMER ; LOAD TIME OUT 1252 TLOOP 1253 E763 2B DCX H ;COUNT DOWN 1254 E764 7C MOV A,H ; 40 MS FOR 1255 E765 B5 ORA L ; HEAD LOAD 1256 E766 C263E7 JNZ TLOOP ; TIME OUT 1257 E769 E1 POP H ;DISK STATUS ADDR 1258 RDYCHK 1259 E76A 7E MOV A,M ;TEST FOR 1260 E76B E620 ANI READY ; DISK READY 1261 E76D C8 RZ 1262 UNLOAD 1263 E76E 3AF6E6 LDA DCREG ;FORCE A 1264 E771 F618 ORI ULOAD ; HEAD 1265 E773 77 MOV M,A ; UNLOAD 1266 E774 3E80 MVI A,200Q ;SET DISK 1267 E776 37 STC ; NOT READY 1268 E777 C9 RET ; ERROR FLAG 1269 * 1270 * 1271 COMAND 1272 E778 2AE5E6 LHLD TIMER ;GET INDEX COUNT 1273 E77B 29 DAD H ; AND MULTIPLY 1274 E77C 29 DAD H ; BY FOUR 1275 CENTRY 1276 E77D EB XCHG ;SAVE IN D-E PAIR 1277 E77E 21FCE3 LXI H,CSTAT ;ISSUE COMMAND 1278 E781 77 MOV M,A ;TO THE 1791 1279 NBUSY 1280 E782 7E MOV A,M ;WAIT 1281 E783 1F RAR ; FOR THE 1282 E784 D282E7 JNC NBUSY ; BUSY FLAG 1283 BUSY 1284 E787 7E MOV A,M ;TEST FOR 1285 E788 1F RAR ; DEVICE BUSY 1286 E789 7E MOV A,M ;RESTORE STATUS 1287 E78A D0 RNC ;RETURN IF NOT BUSY 1288 E78B 1B DCX D ;TEST FOR CP/M MACRO ASSEM 2.0 #024 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 1289 E78C 7A MOV A,D ; TWO DISK 1290 E78D B3 ORA E ; REVOLUTIONS 1291 E78E C287E7 JNZ BUSY ;47 MACHINE CYCLES 1292 E791 5E MOV E,M ;SAVE ERROR CODE 1293 E792 E5 PUSH H ;SAVE CMD ADDRESS 1294 E793 23 INX H ;TRACK REGISTER 1295 E794 56 MOV D,M ;SAVE PRESENT TRACK 1296 E795 E3 XTHL ;RECOVER CMD REG. 1297 E796 D5 PUSH D ;SAVE STATUS 1298 E797 EB XCHG ;ADJUST REGISTERS 1299 E798 CDF9E7 CALL LOADS ;GET CONTROL REG 1300 E79B 3AF6E6 LDA DCREG ;1791 CONTROL BITS 1301 E79E EE04 XRI RSTBIT ;RESET THE 1791 1302 E7A0 77 MOV M,A ; CONTROLLER TO 1303 E7A1 EE04 XRI RSTBIT ; CLEAR FAULT 1304 E7A3 EB XCHG ;ADJUST REGISTERS 1305 E7A4 12 STAX D ;START CONTROLLER 1306 E7A5 36D0 MVI M,CLRCMD ;FORCE AN INTERRUPT 1307 E7A7 D1 POP D ;RECOVER STATUS 1308 E7A8 E1 POP H ;RECOVER TRACK REG 1309 E7A9 72 MOV M,D ;RESTORE TRACK 1310 E7AA 7B MOV A,E ;RESTORE ERROR CODE 1311 E7AB 37 STC ; ERROR FLAG 1312 E7AC C9 RET 1313 * 1314 * 1315 MEASUR 1316 E7AD 110000 LXI D,0 ;INITIALIZE COUNT 1317 E7B0 CDF9E7 CALL LOADS ;STATUS PORT 1318 E7B3 0E10 MVI C,INDEX ;INDEX BIT FLAG 1319 INDXHI 1320 E7B5 7E MOV A,M ;WAIT FOR 1321 E7B6 A1 ANA C ; INDEX 1322 E7B7 C2B5E7 JNZ INDXHI ; PULSE LOW 1323 INDXLO 1324 E7BA 7E MOV A,M ;WAIT FOR 1325 E7BB A1 ANA C ; INDEX 1326 E7BC CABAE7 JZ INDXLO ; PULSE HIGH 1327 INDXCT 1328 E7BF 13 INX D ;ADVANCE COUNT 1329 E7C0 E3 XTHL ;FOUR 1330 E7C1 E3 XTHL ; DUMMY 1331 E7C2 E3 XTHL ; INSTRUCTIONS 1332 E7C3 E3 XTHL ; FOR DELAY 1333 E7C4 7E MOV A,M ;WAIT 1334 E7C5 A1 ANA C ; FOR NEXT 1335 E7C6 C2BFE7 JNZ INDXCT ; LOW INDEX 1336 E7C9 C9 RET ;98 MACHINE CYCLES 1337 * 1338 * 1339 DENFIX 1340 E7CA 79 MOV A,C ;TRIM EXCESS 1341 E7CB E601 ANI 1 ; BITS, 1342 E7CD 2F CMA ; COMPLIMENT 1343 E7CE 47 MOV B,A ; B AND SAVE 1344 E7CF 21EBE6 LXI H,DISK ;NEW DISK CP/M MACRO ASSEM 2.0 #025 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** 1345 E7D2 5E MOV E,M ;GET DISK NO 1346 E7D3 1600 MVI D,0 ;OFFSET ADDR 1347 E7D5 23 INX H ;CURRENT DISK 1348 E7D6 7E MOV A,M ;MOVE TO ACC 1349 E7D7 AB XRA E ;COMPARE W/NEW 1350 E7D8 F5 PUSH PSW ;SAVE STATUS 1351 E7D9 23 INX H ;DISK TABLE 1352 E7DA 23 INX H ; ADDRESS 1353 E7DB 19 DAD D ;ADD THE 1354 E7DC 19 DAD D ;OFFSET 1355 E7DD 7E MOV A,M ;GET PARAMETERS 1356 E7DE F601 ORI 1 ;MASK OFF DENSITY 1357 E7E0 A0 ANA B ;SET NEW DENSITY 1358 E7E1 77 MOV M,A ;UPDATE 1359 E7E2 F1 POP PSW ;CHECK FOR ND=CD 1360 E7E3 C0 RNZ ;NEW DISK NOT OLD 1361 E7E4 7E MOV A,M ;UPDATE CDISK 1362 E7E5 32F6E6 STA DCREG ; ALSO 1363 E7E8 C9 RET 1364 * 1365 * 1366 SDSEL 1367 E7E9 32FAE3 STA DREG ;DRIVE SELECT REG 1368 E7EC C9 RET 1369 LUSTAT 1370 E7ED 3AFAE3 LDA USTAT ;UART STATUS REG 1371 E7F0 C9 RET 1372 SCBITS 1373 E7F1 32F9E3 STA DCMD ;1791 CONTROL REG 1374 E7F4 C9 RET 1375 LDSTAT 1376 E7F5 3AF9E3 LDA DSTAT ;DRIVE STATUS REG 1377 E7F8 C9 RET 1378 LOADS 1379 E7F9 21F9E3 LXI H,DSTAT ;DRIVE STATUS REG 1380 E7FC C9 RET 1381 1382 E7FD END CP/M MACRO ASSEM 2.0 #026 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** ACCESS 0002 693# 1066 1246 BIAS 1000 101# 102 BIOS 5300 103# 203 259 315 402 458 529 BOOT E433 8 9 10 14 16 81 180 351 710 729# 734 BOTBIAS E3C6 606 624# BOTERR E02A 96# 145 BUSY E787 998 1090 1283# 1291 CBUSY E5B5 971 995# CCP 3D00 102# 103 114 120 125 129 191 211 247 267 303 323 390 410 445 446 454 461 481 516 517 525 532 552 578 587 CDISK E6EC 839 1165# CDMA124 E18B 304# 307 324 CDMA256 E08B 192# 195 212 CDMA512 E10B 248# 251 268 CENTRY E77D 897 1050 1275# CHKSEC E66C 1055 1092 1096# CIN E4A1 711 793# 796 807 CLOD124 E186 301# 320 325 CLOD256 E086 189# 208 213 CLOD512 E106 245# 264 269 CLRCMD 00D0 697# 762 1306 CMDREG E3FC 679# 680 763 943 1083 COMAND E778 937 1059 1271# COMNDP E56B 942# 954 978 COUT E492 712 782# 785 CPAN E4B0 720 803# CR124 E1B9 335# 341 CR256 E0B9 223# 229 CR512 E139 279# 285 CRCHI E6FF 1184# CRCLO E6FE 1183# CRD124 E1B6 311 334# CRD256 E0B6 199 217# 222# CRD512 E136 255 273# 278# CSTAT E3FC 680# 997 1089 1277 CSTK124 E200 299 345# CSTK256 E100 187 233# CSTK512 E180 243 289# D0PRAM E6EE 1167# D0TRK E6EF 1168# D1PRAM E6F0 1169# D1TRK E6F1 1170# D2PRAM E6F2 1171# D2TRK E6F3 1172# D3PRAM E6F4 1173# D3TRK E6F5 1174# DATREG E3FF 683# 945 1080 DBOOT E400 710# 734 1145 DCMD E3F9 675# 676 1373 DCREG E6F6 823 1018 1063 1065 1175# 1205 1215 1237 1263 1300 1362 DENFIX E7CA 725 1339# DENSTY 0001 690# 1064 DISK E6EB 3 11 13 436# 579 662# 859 1164# 1188 1344 CP/M MACRO ASSEM 2.0 #027 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** DISKST E4C1 723 818# DJBOOT E400 159# 604 DJCIN E403 160# DJCOUT E406 161# DJDEN E42D 172# 610 633 636 DJDMA E412 165# 198 254 310 397 468 539 616 631 DJDMAST E424 169# DJERR E42A 171# 230 286 342 429 500 571 655 DJHOME E409 162# DJRAM E400 158# 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 593 DJREAD E415 166# 225 281 337 424 495 566 650 DJSEC E40F 164# 190 246 302 389 460 531 614 626 DJSEL E41B 168# DJSIDE E430 174# DJSTAT E427 170# 619 DJTRK E40C 163# 224 280 336 423 494 565 649 DJTSTAT E421 173# DJWRITE E418 167# DMA E4F8 20 217 273 329 358# 416 487 558 641 716 863# DMAADR E6E7 846 876 946 1161# DMASET E50A 866 869 873# DMAST E424 722# DMSTAT E4E5 722 844# DOCOLD E386 589 592# DOOROK E483 767 772# DOREAD E015 95# 140 DOWARM E3A4 590 608# DREAD E415 717# DREG E3FA 677# 678 1367 DRIVE E4ED 719 853# DRVSEL E6EA 769 774 1163# 1224 1231 DSETUP E467 759# DSIDE 0008 703# 1044 DSKERR E42A 724# DSROT E72D 1220# 1223 DSTAT E3F9 676# 1376 1379 DWRITE E418 718# ECOUNT E6E3 927 1003 1006 1009 1111 1159# FIRMLOD E003 109# 142 FREAD E03D 138# 144 GETSTAT E027 91# HCMD 0009 700# 896 HDCHK E736 766 1199 1226# HDFLAG E6E9 894 1042 1053 1162# 1229 HDLOAD E700 882 1026 1187# HEAD 0004 688# 1197 HENTRY E527 884 892# 1030 1074 HOME E511 713 881# INDEX 0010 695# 1318 INDXCT E7BF 1327# 1335 INDXHI E7B5 1319# 1322 INDXLO E7BA 1323# 1326 IO E3F8 673# 674 675 677 679 681 682 683 729 ISLOOP E556 930# 940 CP/M MACRO ASSEM 2.0 #028 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** ISSUE E54E 926# 1011 ISTAT 0004 701# 795 805 814 LDHEAD E471 764# 771 LDSTAT E7F5 1043 1375# LEAVE E5DC 891 951 975 1000 1016# LIGHT 001E 706# 768 LOAD 0010 10 13 14 16 359 580 689# 1019 LOADS E7F9 237 293 507 1227 1299 1317 1378# LUSTAT E7ED 783 794 804 813 1369# MDINT 0003 705# 760 775 MEASUR E7AD 776 928 1315# MLOOP E392 596# 603 MODELA E44C 731 742# MODELM E443 735# 740 743 MOV124 E311 519# 524 MOV512 E291 448# 453 MSIZE 0018 100# 101 NBUSY E782 1279# 1282 NEWDMA E019 121# 133 NEWSEC E004 110# 117 NOLITE 003E 707# 773 NOWRAP E011 115 117# NOWRP E032 126 130 133# ORIGIN E000 88# 89 90 91 92 93 94 95 96 98 106 152 158 670 671 732 OSTAT 0008 702# 784 PLEAVE E5DA 938 1002 1013# PREP E5E7 950 974 1025# PUTDEN E02D 89# PUTDMA E012 90# 136 PUTHOM E009 94# PUTSEC E00F 92# 119 PUTTRK E00C 93# 139 RACMD 00C4 696# 1082 RAM E400 9 11 13 579 666 671# 733 867 RCMD 0080 686# 936 977 RDENTRY E59D 976# 994 RDHDR E648 1062 1077# RDLOOP E5A2 979# 993 RDYCHK E76A 1249 1258# READ E597 217 273 329 354 356 416 487 558 641 717 973# READY 0020 694# 1260 REED E3E3 617 634 641# 646# REED1 E3E6 648# 654 RETRIES 000A 104# 137 222 278 334 421 492 563 646 RHL1 E655 1084# 1088 RHLOOP E64A 1079# 1094 ROM E000 670# 673 724 744 864 RSTBIT 0004 692# 1301 1303 SCBITS E7F1 761 1020 1039 1067 1372# SDSEL E7E9 748 1236 1366# SECLEN E6FD 834 1097 1182# SECREG E3FE 682# 819 932 1108 SECSET E538 715 904# SECTNO E6FC 1181# CP/M MACRO ASSEM 2.0 #029 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** SECTOR E6F8 8 18 19 22 23 44 81 82 179 179 180 181 218 237 274 293 293 330 350 350 351 352 359 417 436 488 507 507 559 578 580 581 581 642 913 933 1102 1177# SEEK E545 714 917# SELDRV E41B 719# SERROR E641 1051 1071# 1095 SETDEN E42D 725# SETDMA E412 716# SETSEC E40F 715# SETSID E430 726# SIDE E6F7 828 1128 1176# 1233 SIDEFX E692 726 1121# SIDENO E6FB 1180# SKCMD 0018 699# 1048 SLOOP E624 1057# 1069 STABLE E6DF 1100 1152# STAC E080 108 147# STACK E6DF 1149# STATUS E427 723# STEST E5D1 1005 1008# STK E400 592 594 608 615 658# SVCMD 001D 698# 1058 SZLOOP E68A 1112# 1118 TERMIN E403 711# TILOOP E6A0 1134# 1140 TIMER E6E5 778 1160# 1251 1272 TIMOUT E69D 770 1132# TKZERO E409 713# TLOOP E763 1252# 1256 TMSTAT E4BB 721 812# TOEND E6A9 1142# 1145 TPANIC E41E 720# TRACK E6F9 8 15 23# 45# 83 887 922 1033 1081 1178# 1239 TRKNO E6FA 1179# TRKNUM E3E4 613 628 647# TRKREG E3FD 681# 821 888 1028 1032 1208 TRKSET E40C 714# TRMOUT E406 712# TSTAT E421 721# TVERFY E61B 1040 1052# TZERO 0004 704# 898 TZFLAG E6ED 890 1166# UDATA E3F8 674# 788 797 ULOAD 0018 691# 1264 UNLOAD E76E 1262# USTAT E3FA 678# 1370 WCMD 00A0 687# 953 WDMA124 E32D 526 533# 536 553 WDMA256 E20B 391# 394 411 WDMA512 E2AD 455 462# 465 482 WLOD124 E328 515 528 530# 549 554 WLOD256 E206 388# 407 412 WLOD512 E2A8 444 457 459# 478 483 WR124 E359 558# 564# 570 CP/M MACRO ASSEM 2.0 #030 *** COLD BOOT LOADER FOR CP/M VER. 2.2 *** WR256 E239 422# 428 WR512 E2D9 493# 499 WRD124 E356 540 563# WRD256 E236 398 416# 421# WRD512 E2D6 469 487# 492# WRENTRY E57C 952# 970 WRITE E576 718 949# WRLOOP E581 955# 969 WRP E02E 127 131# WSTK124 E380 513 574# WSTK256 E280 386 432# WSTK512 E300 442 503#