CP/M RMAC ASSEM 1.1 #001 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 1 ***************************************************************** 2 * * 3 * NEW Firmware for Disk Jockey Model B. * 4 * * 5 ***************************************************************** 6 7 TITLE '*** NEW Disk Jockey Model B Firmware ***' 8 9 F800 = ORIGIN EQU 0F800H 10 11 F800 ORG ORIGIN 12 13 FC00 = RAM EQU ORIGIN+400h 14 FBF8 = IO EQU ORIGIN+3f8h 15 FBF8 = UDATA EQU IO 16 FBF9 = DREG EQU IO+1 17 FBF9 = USTAT EQU IO+1 18 FBFA = DCMD EQU IO+2 19 FBFA = DSTAT EQU IO+2 20 FBFB = CSTALL EQU IO+3 21 FBFC = CMDREG EQU IO+4 22 FBFC = CSTAT EQU IO+4 23 FBFD = TRKREG EQU IO+5 24 FBFE = SECREG EQU IO+6 25 FBFF = DATREG EQU IO+7 26 27 0001 = LIGHT EQU 1 28 0001 = HEAD EQU 1 29 0001 = DENSITY EQU 1 30 0004 = INTRQ EQU 4 31 0004 = ISTAT EQU 4 32 0004 = TZERO EQU 4 33 0004 = LOAD EQU 4 34 0006 = ULOAD EQU 6 35 0008 = OSTAT EQU 10Q 36 0008 = DSIDE EQU 10Q 37 0009 = NOLITE EQU 11Q 38 0009 = DCRINT EQU 11Q 39 0009 = HCMD EQU 11Q 40 0010 = INDEX EQU 20Q 41 0012 = WINDXD EQU 22Q 42 0018 = SKCMD EQU 30Q 43 001A = RINDXD EQU 32Q 44 001D = SVCMD EQU 35Q 45 0040 = WPROT EQU 100Q 46 0040 = ACCESS EQU 100Q 47 0080 = RSTBIT EQU 200Q 48 0080 = READY EQU 200Q 49 0088 = RDCMD EQU 210Q ;WAS 200Q 50 00A8 = WRCMD EQU 250Q ;WAS 240Q 51 00C0 = STBITS EQU 300Q 52 00C4 = RACMD EQU 304Q 53 00D0 = CLRCMD EQU 320Q 54 55 F800 C369F8 DBOOT JMP BOOT 56 F803 C3E9F8 TERMIN JMP CIN CP/M RMAC ASSEM 1.1 #002 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 57 F806 C3DAF8 TRMOUT JMP COUT 58 F809 C35AF9 TKZERO JMP HOME 59 F80C C38BF9 TRKSET JMP SEEK 60 F80F C381F9 SETSEC JMP SECSET 61 F812 C343F9 SETDMA JMP DMA 62 F815 C3DDF9 DREAD JMP READ 63 F818 C3BCF9 DWRITE JMP WRITE 64 F81B C33CF9 SELDRV JMP DRIVE 65 F81E C3F8F8 TPANIC JMP CPAN 66 F821 C303F9 TSTAT JMP TMSTAT 67 F824 C334F9 DMAST JMP DMSTAT 68 F827 C309F9 STATUS JMP DISKST 69 F82A C3C5F8 DSKERR JMP LERROR 70 F82D C3B3FB SETDEN JMP DENFIX 71 F830 C3E5FB SETSID JMP SIDEFX 72 73 74 F833 DS 66Q 75 76 F869 31FAFF BOOT LXI SP,TRACK+1 ;initialize SP 77 F86C CDD2FB CALL TIMOUT ;poc/reset timeout 78 F86F 210100 LXI H,1 79 F872 E5 PUSH H ;track 0, sector 1 80 F873 2E09 MVI L,DCRINT ;set up the 81 F875 E5 PUSH H ; side select 82 F876 26FF MVI H,377Q ; and initial 83 F878 E5 PUSH H ; drive 84 F879 E5 PUSH H ; parameters 85 F87A E5 PUSH H 86 F87B E5 PUSH H 87 F87C 210800 LXI H,10Q ;initialize 88 F87F E5 PUSH H ; tzflag & cdisk 89 F880 2E7E MVI L,176Q ;initialize 90 F882 E5 PUSH H ; disk & drvsel 91 F883 2E08 MVI L,10Q ;initialize 92 F885 E5 PUSH H ; hdflag & dsflag 93 F886 2618 MVI H,30Q ;initialize 94 F888 E5 PUSH H ; timer constant 95 F889 3E7F MVI A,177Q ;start 1791 96 F88B 32F9FB STA DREG 97 F88E 3ED0 MVI A,CLRCMD ;1791 reset 98 F890 32FCFB STA CMDREG 99 LDHEAD 100 F893 AF XRA A ;load the head 101 F894 CD1BFB CALL HDCHK ; and test for 102 F897 D2A5F8 JNC DOOROK ; drive ready 103 F89A 3E01 MVI A,LIGHT ;turn on the 104 F89C 32F6FF STA DCREG ; error LED 105 F89F CDD2FB CALL TIMOUT ;timeout to 106 F8A2 C393F8 JMP LDHEAD ; close drive door 107 DOOROK 108 F8A5 3E09 MVI A,NOLITE ;turn off the 109 F8A7 32F6FF STA DCREG ; error LED 110 F8AA CD96FB CALL MEASUR ;head load time 111 F8AD C1 POP B ;adjust the stack 112 F8AE 0100FF LXI B,RAM+300H ;DMA addr CP/M RMAC ASSEM 1.1 #003 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 113 F8B1 C5 PUSH B ;initialize 114 F8B2 D5 PUSH D ; dmaadr & timer 115 F8B3 210000 LXI H,0 ;initialize 116 F8B6 E5 PUSH H ; intrfg & ramins 117 F8B7 00 NOP ;debug instruction 118 F8B8 C5 PUSH B ;boot address 119 F8B9 060C MVI B,12 ;number of retrys 120 LDLOOP 121 F8BB C5 PUSH B ;save the retry no. 122 F8BC CDDDF9 CALL READ ;read boot sector 123 F8BF C1 POP B ;restor retry no. 124 F8C0 D0 RNC ;successful read? 125 F8C1 05 DCR B ;no - count down 126 F8C2 C2BBF8 JNZ LDLOOP ; and try again 127 LERROR 128 F8C5 0E09 MVI C,11Q 129 F8C7 11C3A2 LXI D,0a2c3h 130 LELOOP 131 F8CA 1B DCX D 132 F8CB 7A MOV A,D 133 F8CC B3 ORA E 134 F8CD C2CAF8 JNZ LELOOP 135 F8D0 3E08 MVI A,10Q ;blink 136 F8D2 A9 XRA C ; the LED at 137 F8D3 4F MOV C,A ; top of the 138 F8D4 32FAFB STA DCMD ; circuit board 139 F8D7 C3C7F8 JMP LERROR+2 140 141 COUT 142 F8DA 3AF9FB LDA USTAT ;get UART status 143 F8DD E608 ANI OSTAT ;output ready mask 144 F8DF C2DAF8 JNZ COUT ;test buffer empty 145 F8E2 79 MOV A,C ;character data 146 F8E3 2F CMA ;negative logic bus 147 F8E4 32F8FB STA UDATA ;send data to UART 148 F8E7 2F CMA ;make positive 149 F8E8 C9 RET 150 151 CIN 152 F8E9 3AF9FB LDA USTAT ;get UART status 153 F8EC E604 ANI ISTAT ;input ready mask 154 F8EE C2E9F8 JNZ CIN ;wait for input 155 F8F1 3AF8FB LDA UDATA ;get the character 156 F8F4 2F CMA ;adjust for negative bus 157 F8F5 E67F ANI 177Q ;trim to 7 bits 158 F8F7 C9 RET 159 160 CPAN 161 F8F8 3AF9FB LDA USTAT ;get UART status 162 F8FB E604 ANI ISTAT ;input ready mask 163 F8FD C0 RNZ ;test for data 164 F8FE CDE9F8 CALL CIN ;get character 165 F901 B9 CMP C ;test for panic chtr 166 F902 C9 RET 167 TMSTAT 168 F903 3AF9FB LDA USTAT ;get UART status CP/M RMAC ASSEM 1.1 #004 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 169 F906 E604 ANI ISTAT ;input ready mask 170 F908 C9 RET 171 172 DISKST 173 F909 21FDFB LXI H,TRKREG ;most recent 174 F90C 4E MOV C,M ; track to C 175 F90D 23 INX H ;most recent 176 F90E 46 MOV B,M ; sector to B 177 F90F 3AF6FF LDA DCREG ;get current 178 F912 2F CMA ; density in 179 F913 E601 ANI 1 ; the msb 180 F915 0F RRC ; position 181 F916 57 MOV D,A ;save in D 182 F917 3AF7FF LDA SIDE ;put the 183 F91A 07 RLC ; most recent 184 F91B 07 RLC ; side select 185 F91C 07 RLC ; in bit positin 186 F91D B2 ORA D ; 6 and merge 187 F91E 57 MOV D,A ;save in D 188 F91F 3AE8FF LDA DSFLAG ;get the 189 F922 EE08 XRI DSIDE ; most recent 190 F924 17 RAL ; double sided 191 F925 17 RAL ; status and place 192 F926 82 ADD D ; in bit position 193 F927 57 MOV D,A ; 5 and merge 194 F928 3AFDFF LDA SECLEN ;get the 195 F92B 17 RAL ; sector length 196 F92C 17 RAL ; code bits in 197 F92D B2 ORA D ; positions 2 & 3 198 F92E 57 MOV D,A ; and merge 199 F92F 3AECFF LDA CDISK ;get the current 200 F932 82 ADD D ; disk no. in bit 201 F933 C9 RET ; positions 0 & 1 202 203 DMSTAT 204 F934 E5 PUSH H ;save the HL pair 205 F935 2AE6FF LHLD DMAADR ;move the 206 F938 44 MOV B,H ; DMA address to 207 F939 4D MOV C,L ; the BC pair 208 F93A E1 POP H ;recover HL 209 F93B C9 RET 210 211 DRIVE 212 F93C 79 MOV A,C ;drive select 213 F93D E603 ANI 3 ; values must be 214 F93F 32EBFF STA DISK ; between zero 215 F942 C9 RET ; and three 216 217 DMA 218 F943 210004 LXI H,-RAM ;test the 219 F946 09 DAD B ; DMA address 220 F947 DA54F9 JC DMASET ; for conflict 221 F94A 210808 LXI H,8-ORIGIN 222 F94D 09 DAD B ; with the I/O 223 F94E D254F9 JNC DMASET ; on the DJ/2D 224 F951 3E10 MVI A,20Q ; controller CP/M RMAC ASSEM 1.1 #005 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 225 F953 C9 RET 226 DMASET 227 F954 60 MOV H,B ;store the 228 F955 69 MOV L,C ; BC pair 229 F956 22E6FF SHLD DMAADR 230 F959 C9 RET 231 232 HOME 233 F95A CDE3FA CALL HDLOAD ;load the head 234 F95D D8 RC ;not ready error 235 F95E CD70F9 CALL HENTRY ;move the head 236 F961 F5 PUSH PSW ;save status 237 F962 9F SBB A ;update the 238 F963 32F9FF STA TRACK ; track 239 F966 32FDFB STA TRKREG ; registers 240 F969 AF XRA A ;set the not 241 F96A 32EDFF STA TZFLAG ; verified flag 242 F96D C323FA JMP LEAVE+1 ;unload the head 243 HENTRY 244 F970 AF XRA A ;set the force 245 F971 32E9FF STA HDFLAG ; verify flag 246 F974 210000 LXI H,0 ;timeout constant 247 F977 3E09 MVI A,HCMD ;move the head 248 F979 CD62FB CALL CENTRY ;to track 0 249 F97C E604 ANI TZERO ;track zero bit 250 F97E C0 RNZ 251 F97F 37 STC ;error flag 252 F980 C9 RET 253 254 SECSET 255 F981 AF XRA A ;test for 256 F982 B1 ORA C ; zero value 257 F983 37 STC ;error flag 258 F984 C8 RZ ;error return 259 F985 E61F ANI 37Q ;trim & clear cry 260 F987 32F8FF STA SECTOR 261 F98A C9 RET 262 263 SEEK 264 F98B 79 MOV A,C ;test for 265 F98C FE4D CPI 77 ; track 266 F98E 3F CMC ; too large 267 F98F D8 RC 268 F990 32F9FF STA TRACK 269 F993 C9 RET 270 271 F994 32E3FF ISSUE STA ECOUNT+1 ;UPDATE COUNT 272 F997 CD96FB CALL MEASUR ;FIND INDEX 273 F99A 0E01 MVI C,1 ;START WITH SECTOR 1 274 ISLOOP 275 F99C 79 MOV A,C ;INITIALIZE THE 276 F99D 32FEFB STA SECREG ; SECTOR REGISTER 277 F9A0 3AF8FF LDA SECTOR ;TEST FOR 278 F9A3 B9 CMP C ; TARGET SECTOR 279 F9A4 C8 RZ 280 F9A5 3E88 MVI A,RDCMD ;DO A FAKE CP/M RMAC ASSEM 1.1 #006 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 281 F9A7 CD5DFB CALL COMAND ; READ COMMAND 282 F9AA DA20FA JC PLEAVE ;ABORT ON ERROR 283 F9AD 0C INR C ;INCREMENT SECTOR NUMBER 284 F9AE C39CF9 JMP ISLOOP 285 286 F9B1 32FCFB COMNDP STA CMDREG ;START OPERATION 287 F9B4 48 MOV C,B ;INITIALIZE BLOCK COUNT 288 F9B5 11FFFB LXI D,DATREG ;DATA REGISTER 289 F9B8 2AE6FF LHLD DMAADR ;TRANSFER ADDRESS 290 F9BB C9 RET 291 292 WRITE 293 F9BC CD33FA CALL PREP ;prepare for write 294 F9BF DA22FA JC LEAVE ;abort operation 295 WRENTRY 296 F9C2 3EA8 MVI A,WRCMD ;WRITE A SECTOR CMD 297 F9C4 CDB1F9 CALL COMNDP 298 WRLOOP 299 F9C7 7E MOV A,M ;load 1st byte of data 300 F9C8 23 INX H 301 F9C9 12 STAX D ;write 1st byte of data 302 F9CA 7E MOV A,M ;load 2nd byte of data 303 F9CB 23 INX H 304 F9CC 12 STAX D ;write 2nd byte of data 305 F9CD 7E MOV A,M ;load 3rd byte of data 306 F9CE 23 INX H 307 F9CF 12 STAX D ;write 3rd byte of data 308 F9D0 0D DCR C ;reduce block count 309 F9D1 7E MOV A,M ;load 4th byte of data 310 F9D2 23 INX H 311 F9D3 12 STAX D ;write 4th byte of data 312 F9D4 C2C7F9 JNZ WRLOOP ;write next 4 bytes 313 F9D7 21C2F9 LXI H,WRENTRY 314 F9DA C3FBF9 JMP CBUSY 315 316 READ 317 F9DD CD33FA CALL PREP ;prepare for read 318 F9E0 DA22FA JC LEAVE ;abort operation 319 RDENTRY 320 F9E3 3E88 MVI A,RDCMD ;read sector cmd 321 F9E5 CDB1F9 CALL COMNDP 322 RDLOOP 323 F9E8 1A LDAX D ;read 1st byte 324 F9E9 77 MOV M,A ;store 1st byte 325 F9EA 23 INX H ;advance pointer 326 F9EB 1A LDAX D ;read 2nd byte 327 F9EC 77 MOV M,A ;store 2nd byte 328 F9ED 23 INX H ;advance pointer 329 F9EE 1A LDAX D ;read 3rd byte 330 F9EF 77 MOV M,A ;store 3rd byte 331 F9F0 23 INX H ;advance pointer 332 F9F1 0D DCR C ;reduce block count 333 F9F2 1A LDAX D ;read 4th byte 334 F9F3 77 MOV M,A ;store 4th byte 335 F9F4 23 INX H ;advance pointer 336 F9F5 C2E8F9 JNZ RDLOOP ;read next 4 bytes CP/M RMAC ASSEM 1.1 #007 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 337 F9F8 21E3F9 LXI H,RDENTRY 338 339 CBUSY 340 F9FB E5 PUSH H 341 F9FC 21FCFB LXI H,CSTAT ;WAIT FOR 1791 342 F9FF CD6CFB CALL BUSY ; TO FINISH COMMAND 343 FA02 E65F ANI 137Q ;ERROR MASK 344 FA04 CA21FA JZ LEAVE-1 ;NO ERROR 345 FA07 FE10 CPI 20Q ;PREMATURE INTERRUPT 346 FA09 C220FA JNZ PLEAVE ;OTHER TYPE OF ERROR 347 FA0C 3AE2FF LDA ECOUNT ;DECREMENT ERROR COUNT 348 FA0F 3D DCR A ; BY ONE 349 FA10 FA17FA JM STEST ;HARD INTERRUPT ERROR 350 FA13 32E2FF STA ECOUNT ;UPDATE COUNT 351 FA16 C9 RET 352 353 STEST 354 FA17 3AE3FF LDA ECOUNT+1 ;DECREMENT ERROR 355 FA1A 3D DCR A 356 FA1B F294F9 JP ISSUE 357 FA1E 3E10 MVI A,20Q 358 PLEAVE 359 FA20 37 STC ;error flag 360 FA21 E1 POP H 361 LEAVE 362 FA22 F5 PUSH PSW ;save the status 363 FA23 3AF6FF LDA DCREG ;control bits 364 FA26 EE04 XRI LOAD ;toggle the 365 FA28 32FAFB STA DCMD ; head load bit 366 FA2B 3AEAFF LDA DRVSEL ;enable access to 367 FA2E 32F9FB STA DREG ; the data register 368 FA31 F1 POP PSW ;recover the status 369 FA32 C9 RET 370 371 PREP 372 FA33 CDE3FA CALL HDLOAD ;load the head 373 FA36 D8 RC ;test for drive ready 374 FA37 3AFDFB LDA TRKREG ;get old track 375 FA3A 3C INR A ;test for head 376 FA3B CC70F9 CZ HENTRY ; not calibrated 377 FA3E D8 RC ;seek error? 378 FA3F 21FDFB LXI H,TRKREG ;old track 379 FA42 3AF9FF LDA TRACK ;new track 380 FA45 BE CMP M ;test for head motion 381 FA46 23 INX H ;advance to the 382 FA47 23 INX H ; data register 383 FA48 77 MOV M,A ;save new track 384 FA49 79 MOV A,C ;turn off data reg 385 FA4A 32F9FB STA DREG ; access control bit 386 FA4D CA6AFA JZ TVERFY ;test for seek 387 FA50 AF XRA A ;force a read 388 FA51 32E9FF STA HDFLAG ; header operation 389 FA54 3AFAFB LDA DSTAT ;get the double 390 FA57 E608 ANI DSIDE ; sided flag 391 FA59 32E8FF STA DSFLAG ;save for status 392 FA5C 1F RAR ;shift for CP/M RMAC ASSEM 1.1 #008 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 393 FA5D 1F RAR ; 3/6 ms step 394 FA5E 1F RAR ; rate constant 395 FA5F C618 ADI SKCMD ;do a 396 FA61 210000 LXI H,0 ; seek 397 FA64 CD62FB CALL CENTRY ; operation 398 FA67 DA8EFA JC SERROR ;seek error? 399 TVERFY 400 FA6A 3AE9FF LDA HDFLAG ;get the force 401 FA6D B7 ORA A ; verify hdr flag 402 FA6E C2B9FA JNZ CHKSEC ;no seek & head OK 403 FA71 0602 MVI B,2 ;verify retry count 404 SLOOP 405 FA73 3E1D MVI A,SVCMD ;do a verify 406 FA75 CD5DFB CALL COMAND ; command 407 FA78 E699 ANI 231Q ;error bit mask 408 FA7A 57 MOV D,A ;save 409 FA7B CA95FA JZ RDHDR ;no error 410 FA7E 3AF6FF LDA DCREG ;denisty control 411 FA81 EE01 XRI DENSITY ;flip the density 412 FA83 32F6FF STA DCREG ;update and 413 FA86 32FAFB STA DCMD ; change density 414 FA89 05 DCR B ;decrement retry 415 FA8A C273FA JNZ SLOOP ; count & test 416 FA8D 7A MOV A,D 417 SERROR 418 FA8E 37 STC 419 FA8F F5 PUSH PSW 420 FA90 CD70F9 CALL HENTRY 421 FA93 F1 POP PSW 422 FA94 C9 RET 423 RDHDR 424 FA95 060A MVI B,12Q ;number of retrys 425 RHLOOP 426 FA97 11FFFB LXI D,DATREG ;DATA REGISTER 427 FA9A 21FAFF LXI H,TRACK+1 ;DATA POINTER 428 FA9D 3EC4 MVI A,RACMD ;START READ HEADER CMD 429 FA9F 32FCFB STA CMDREG 430 RHL1 431 FAA2 1A LDAX D ;get disk data 0 432 FAA3 77 MOV M,A ;store in mem 433 FAA4 2C INR L ;advance pointer 434 FAA5 C2A2FA JNZ RHL1 ;test end of page 435 FAA8 21FCFB LXI H,CSTAT ;wait for 1791 436 FAAB CD6CFB CALL BUSY ; to finish cmd 437 FAAE B7 ORA A ;test for errors 438 FAAF CAB9FA JZ CHKSEC ;transfer OK? 439 FAB2 05 DCR B ;no - test for 440 FAB3 C297FA JNZ RHLOOP ; hard error 441 FAB6 C38EFA JMP SERROR ;recalibrate 442 CHKSEC 443 FAB9 3AFDFF LDA SECLEN ;get the sector 444 FABC 4F MOV C,A ; size and setup 445 FABD 0600 MVI B,0 ; the table offset 446 FABF 21DFFA LXI H,STABLE ;sector table 447 FAC2 09 DAD B ;sector size pntr 448 FAC3 3AF8FF LDA SECTOR ;get the sector CP/M RMAC ASSEM 1.1 #009 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 449 FAC6 47 MOV B,A ; and save in B 450 FAC7 86 ADD M ;compare w/table 451 FAC8 3E10 MVI A,20Q ;error flag 452 FACA D8 RC ;error return 453 FACB 78 MOV A,B ;initialize 1791 454 FACC 32FEFB STA SECREG ; sector register 455 FACF 3E20 MVI A,40Q ;128 byte sector 456 FAD1 210505 LXI H,505H 457 FAD4 22E2FF SHLD ECOUNT 458 SZLOOP 459 FAD7 0D DCR C ;reduce size count 460 FAD8 47 MOV B,A ;sector size to B 461 FAD9 F8 RM ;return on minus 462 FADA 17 RAL ;double the count 463 FADB B7 ORA A ;clear the carry 464 FADC C3D7FA JMP SZLOOP 465 466 STABLE 467 FADF E5 DB 345Q ;26 sector diskettes 468 FAE0 E5 DB 345Q ;26 sector diskettes 469 FAE1 F0 DB 360Q ;15 sector diskettes 470 FAE2 F7 DB 367Q ;8 sector diskettes 471 HDLOAD 472 FAE3 21EBFF LXI H,DISK ;new drv ptr 473 FAE6 4E MOV C,M ;save new drv in C 474 FAE7 23 INX H ;current drv ptr 475 FAE8 5E MOV E,M ;save old drv in E 476 FAE9 71 MOV M,C ;update current drv 477 FAEA 23 INX H ;home cmd flag 478 FAEB 7B MOV A,E ;test for 479 FAEC B9 CMP C ; drive change 480 FAED 7E MOV A,M ;head load mask 481 FAEE 3601 MVI M,HEAD ;update the mask 482 FAF0 CA1BFB JZ HDCHK ;no drive change? 483 FAF3 23 INX H ;addr of drive table 484 FAF4 E5 PUSH H ;save table addr 485 FAF5 1600 MVI D,0 ;set up the 486 FAF7 42 MOV B,D ; offset address 487 FAF8 19 DAD D ;calculate the 488 FAF9 19 DAD D ; parameter addr 489 FAFA 3AF6FF LDA DCREG ;save the 490 FAFD 77 MOV M,A ;density status 491 FAFE 23 INX H ;track pointer 492 FAFF 11FDFB LXI D,TRKREG ;1791 trk reg 493 FB02 1A LDAX D ;get current track 494 FB03 77 MOV M,A ;save in the table 495 FB04 E1 POP H ;beginning of table 496 FB05 09 DAD B ;new drive 497 FB06 09 DAD B ; table pointer 498 FB07 7E MOV A,M ;get density status 499 FB08 32F6FF STA DCREG ;update DCREG 500 FB0B 23 INX H ;get the old 501 FB0C 7E MOV A,M ; track number 502 FB0D 12 STAX D ; and update 1791 503 FB0E 3E7F MVI A,177Q ;drive select bits 504 DSROT CP/M RMAC ASSEM 1.1 #010 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 505 FB10 07 RLC ;rotate to 506 FB11 0D DCR C ; select the 507 FB12 F210FB JP DSROT ; proper drive 508 FB15 E67F ANI 177Q ;set the run bit 509 FB17 32EAFF STA DRVSEL ;save in drv reg 510 FB1A AF XRA A ;force a head load 511 HDCHK 512 FB1B 21FAFB LXI H,DSTAT ;test for 513 FB1E A6 ANA M ; head loaded 514 FB1F 32E9FF STA HDFLAG ;save the head 515 FB22 F5 PUSH PSW ; loaded status 516 FB23 3AEAFF LDA DRVSEL ;get current drive 517 FB26 4F MOV C,A ;save 518 FB27 3AF7FF LDA SIDE ;get current side 519 FB2A 2F CMA ; and merge 520 FB2B A1 ANA C ; with drive select 521 FB2C 32F9FB STA DREG ;select drive & side 522 FB2F EE40 XRI ACCESS ;toggle access bit 523 FB31 4F MOV C,A ;save for PREP routine 524 FB32 3AF6FF LDA DCREG ;den & head cntl bits 525 FB35 47 MOV B,A ;save 526 FB36 3AF9FF LDA TRACK ;get the new track 527 FB39 D601 SUI 1 ;force single 528 FB3B 9F SBB A ; density 529 FB3C 3D DCR A ; if track = 0 530 FB3D 2F CMA ;compliment 531 FB3E B0 ORA B ;merge w/control bits 532 FB3F 77 MOV M,A ;load head & set density 533 FB40 F1 POP PSW ;head load status 534 FB41 C24FFB JNZ RDYCHK ;conditionally 535 FB44 E5 PUSH H ; wait for head 536 FB45 2AE4FF LHLD TIMER ; load time out 537 TLOOP 538 FB48 2B DCX H ;count down 539 FB49 7C MOV A,H ; 40 ms for 540 FB4A B5 ORA L ; head load 541 FB4B C248FB JNZ TLOOP ; time out 542 FB4E E1 POP H 543 RDYCHK 544 FB4F 7E MOV A,M ;test for 545 FB50 E680 ANI READY ; drive ready 546 FB52 C0 RNZ 547 UNLOAD 548 FB53 3AF6FF LDA DCREG ;force a 549 FB56 F606 ORI ULOAD ; head 550 FB58 77 MOV M,A ; unload 551 FB59 3E80 MVI A,READY ;set drive 552 FB5B 37 STC ; not ready 553 FB5C C9 RET ; error flag 554 555 COMAND 556 FB5D 2AE4FF LHLD TIMER ;get index count 557 FB60 29 DAD H ; and multiply 558 FB61 29 DAD H ; by four 559 CENTRY 560 FB62 EB XCHG ;save in D-E pair CP/M RMAC ASSEM 1.1 #011 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 561 FB63 21FCFB LXI H,CSTAT ;issue command 562 FB66 77 MOV M,A ; to the 1791 563 NBUSY 564 FB67 7E MOV A,M ;wait 565 FB68 1F RAR ; for the 566 FB69 D267FB JNC NBUSY ; busy flag 567 BUSY 568 FB6C 7E MOV A,M ;test for 569 FB6D 1F RAR ; device busy 570 FB6E 7E MOV A,M ;restore status 571 FB6F D0 RNC ;return if not busy 572 FB70 C376FB JMP PATCH+3 ;JUMP AROUND PATCH 573 PATCH 574 FB73 C3E3FA JMP HDLOAD ;PATCH FOR OLD ATE 575 576 FB76 1B DCX D ;test for 577 FB77 7A MOV A,D ; two disk 578 FB78 B3 ORA E ; revolutions 579 FB79 C26CFB JNZ BUSY ;47 machine cycles 580 FB7C 5E MOV E,M ;get error code 581 FB7D E5 PUSH H ;save cmd address 582 FB7E 23 INX H ;track register 583 FB7F 56 MOV D,M ;save present track 584 FB80 3AEAFF LDA DRVSEL ;control bits 585 FB83 EE80 XRI RSTBIT ;reset the 1791 586 FB85 32F9FB STA DREG ; controller to 587 FB88 EEC0 XRI STBITS ; clear the 588 FB8A E3 XTHL ; command busy 589 FB8B 32F9FB STA DREG ; fault condition 590 FB8E 36D0 MVI M,CLRCMD ;force interrupt 591 FB90 E3 XTHL ;restore the 592 FB91 72 MOV M,D ; the track reg 593 FB92 E1 POP H ;restore the stack 594 FB93 7B MOV A,E ;error code to A 595 FB94 37 STC ; error flag 596 FB95 C9 RET 597 598 MEASUR 599 FB96 110000 LXI D,0 ;initialize count 600 FB99 21FAFB LXI H,DSTAT ;status port 601 FB9C 0E10 MVI C,INDEX ;index bit flag 602 INDXLO 603 FB9E 7E MOV A,M ;wait for 604 FB9F A1 ANA C ; index 605 FBA0 CA9EFB JZ INDXLO ; pulse high 606 INDXHI 607 FBA3 7E MOV A,M ;wait for 608 FBA4 A1 ANA C ; index 609 FBA5 C2A3FB JNZ INDXHI ; pulse low 610 INDXCT 611 FBA8 13 INX D ;advance count 612 FBA9 E3 XTHL ;four dummy 613 FBAA E3 XTHL ; instructions 614 FBAB E3 XTHL ; to lengthen 615 FBAC E3 XTHL ; the delay 616 FBAD 7E MOV A,M ;wait for CP/M RMAC ASSEM 1.1 #012 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 617 FBAE A1 ANA C ; the index 618 FBAF CAA8FB JZ INDXCT ; to go high 619 FBB2 C9 RET ;98 machine cycles 620 621 DENFIX 622 FBB3 79 MOV A,C ;trim the 623 FBB4 E601 ANI 1 ; excess bits 624 FBB6 2F CMA ;compliment and 625 FBB7 47 MOV B,A ; save in B 626 FBB8 21EBFF LXI H,DISK ;new disk ptr 627 FBBB 5E MOV E,M ;get disk no. 628 FBBC 1600 MVI D,0 ;offset addr 629 FBBE 23 INX H ;current disk ptr 630 FBBF 7E MOV A,M ;move to ACC 631 FBC0 AB XRA E ;cmpr old w/new 632 FBC1 F5 PUSH PSW ;save status 633 FBC2 23 INX H ;disk table 634 FBC3 23 INX H ; address 635 FBC4 19 DAD D ;add the 636 FBC5 19 DAD D ; offset 637 FBC6 7E MOV A,M ;get parameters 638 FBC7 F601 ORI 1 ;mask off density 639 FBC9 A0 ANA B ;set new density 640 FBCA 77 MOV M,A ;update parameters 641 FBCB F1 POP PSW ;test new=old? 642 FBCC C0 RNZ 643 FBCD 7E MOV A,M ;updata CDISK 644 FBCE 32F6FF STA DCREG ; also 645 FBD1 C9 RET 646 647 TIMOUT 648 FBD2 210000 LXI H,0 ;time-out delay 649 TILOOP 650 FBD5 2B DCX H ;decrement count 651 FBD6 7C MOV A,H ;test for delay 652 FBD7 B5 ORA L ; count equal zero 653 FBD8 E3 XTHL ;long NOP 654 FBD9 E3 XTHL ; instruction 655 FBDA C2D5FB JNZ TILOOP 656 FBDD C9 RET 657 658 SBEGIN 659 FBDE E5 PUSH H ;save the pointer 660 FBDF 21E2FB LXI H,DSTALL ;setup jump 661 DSTALL 662 FBE2 E9 PCHL ;dynamic stall 663 FBE3 E1 POP H ;restore pointer 664 FBE4 C9 RET ;return 665 666 SIDEFX 667 FBE5 79 MOV A,C ;get the side bit 668 FBE6 E601 ANI 1 ;trim the excess 669 FBE8 17 RAL ;move the bit 670 FBE9 17 RAL ; to the side 671 FBEA 17 RAL ; select bit 672 FBEB 17 RAL ; position CP/M RMAC ASSEM 1.1 #013 *** NEW DISK JOCKEY MODEL B FIRMWARE *** 673 FBEC 32F7FF STA SIDE ;save side bit 674 FBEF C9 RET 675 676 PWRJMP 677 FBF0 00 NOP ;power-on 678 FBF1 00 NOP ; jump 679 FBF2 00 NOP ; sequence 680 FBF3 00 NOP ; with NOP 681 FBF4 00 NOP ; padding 682 FBF5 C300F8 JMP DBOOT 683 684 FBF8 DS 10Q ;I/O locations 685 686 FFC9 org ram+3c9h 687 688 FFC9 STACK DS 31Q 689 690 FFE2 0000 ECOUNT DW 0 691 FFE4 0018 TIMER DW 1800h ;head load time out 692 FFE6 00FF DMAADR DW RAM+300H ;dma address 693 FFE8 08 DSFLAG DB 10Q 694 FFE9 00 HDFLAG DB 0 ;read header flag 695 FFEA 7E DRVSEL DB 176Q ;drive select constant 696 FFEB 00 DISK DB 0 ;new drive 697 FFEC 08 CDISK DB 10Q ;current disk 698 FFED 00 TZFLAG DB 0 ;home cmd indicator 699 FFEE 09 DOPRAM DB 11Q ;drive 0 parameters 700 FFEF FF DOTRK DB 377Q ;drive 0 track no 701 FFF0 09 D1PRAM DB 11Q ;drive 1 parameters 702 FFF1 FF D1TRK DB 377Q ;drive 1 track no 703 FFF2 09 D2PRAM DB 11Q ;drive 2 parameters 704 FFF3 FF D2TRK DB 377Q ;drive 2 track no 705 FFF4 09 D3PRAM DB 11Q ;drive 3 parameters 706 FFF5 FF D3TRK DB 377Q ;drive 3 track no 707 FFF6 09 DCREG DB 11Q ;current parameters 708 FFF7 00 SIDE DB 0 ;new side 709 FFF8 01 SECTOR DB 1 ;new sector 710 FFF9 00 TRACK DB 0 ;new track 711 FFFA 00 TRKNO DB 0 ;disk 712 FFFB 00 SIDENO DB 0 ; sector 713 FFFC 00 SECTNO DB 0 ; header 714 FFFD 00 SECLEN DB 0 ; data 715 FFFE 00 CRCLO DB 0 ; buffer 716 FFFF 00 CRCHI DB 0 CP/M RMAC ASSEM 1.1 #014 *** NEW DISK JOCKEY MODEL B FIRMWARE *** ACCESS 0040 46# 522 BOOT F869 55 76# BUSY FB6C 342 436 567# 579 CBUSY F9FB 314 339# CDISK FFEC 199 697# CENTRY FB62 248 397 559# CHKSEC FAB9 402 438 442# CIN F8E9 56 151# 154 164 CLRCMD 00D0 53# 97 590 CMDREG FBFC 21# 98 286 429 COMAND FB5D 281 406 555# COMNDP F9B1 286# 297 321 COUT F8DA 57 141# 144 CPAN F8F8 65 160# CRCHI FFFF 716# CRCLO FFFE 715# CSTALL FBFB 20# CSTAT FBFC 22# 341 435 561 D1PRAM FFF0 701# D1TRK FFF1 702# D2PRAM FFF2 703# D2TRK FFF3 704# D3PRAM FFF4 705# D3TRK FFF5 706# DATREG FBFF 25# 288 426 DBOOT F800 55# 682 DCMD FBFA 18# 138 365 413 DCREG FFF6 104 109 177 363 410 412 489 499 524 548 644 707# DCRINT 0009 38# 80 DENFIX FBB3 70 621# DENSITY 0001 29# 411 DISK FFEB 3 214 472 626 696# DISKST F909 68 172# DMA F943 61 217# DMAADR FFE6 205 229 289 692# DMASET F954 220 223 226# DMAST F824 67# DMSTAT F934 67 203# DOOROK F8A5 102 107# DOPRAM FFEE 699# DOTRK FFEF 700# DREAD F815 62# DREG FBF9 16# 96 367 385 521 586 589 DRIVE F93C 64 211# DRVSEL FFEA 366 509 516 584 695# DSFLAG FFE8 188 391 693# DSIDE 0008 36# 189 390 DSKERR F82A 69# DSROT FB10 504# 507 DSTALL FBE2 660 661# DSTAT FBFA 19# 389 512 600 DWRITE F818 63# ECOUNT FFE2 271 347 350 354 457 690# HCMD 0009 39# 247 HDCHK FB1B 101 482 511# CP/M RMAC ASSEM 1.1 #015 *** NEW DISK JOCKEY MODEL B FIRMWARE *** HDFLAG FFE9 245 388 400 514 694# HDLOAD FAE3 233 372 471# 574 HEAD 0001 28# 481 HENTRY F970 235 243# 376 420 HOME F95A 58 232# INDEX 0010 40# 601 INDXCT FBA8 610# 618 INDXHI FBA3 606# 609 INDXLO FB9E 602# 605 INTRQ 0004 30# IO FBF8 14# 15 16 17 18 19 20 21 22 23 24 25 ISLOOP F99C 274# 284 ISSUE F994 271# 356 ISTAT 0004 31# 153 162 169 LDHEAD F893 99# 106 LDLOOP F8BB 120# 126 LEAVE FA22 242 294 318 344 361# LELOOP F8CA 130# 134 LERROR F8C5 69 127# 139 LIGHT 0001 27# 103 LOAD 0004 33# 364 MEASUR FB96 110 272 598# NBUSY FB67 563# 566 NOLITE 0009 37# 108 ORIGIN F800 9# 11 13 14 221 OSTAT 0008 35# 143 PATCH FB73 572 573# PLEAVE FA20 282 346 358# PREP FA33 293 317 371# PWRJMP FBF0 676# RACMD 00C4 52# 428 RAM FC00 13# 112 218 686 692 RDCMD 0088 49# 280 320 RDENTRY F9E3 319# 337 RDHDR FA95 409 423# RDLOOP F9E8 322# 336 RDYCHK FB4F 534 543# READ F9DD 62 122 316# READY 0080 48# 545 551 RHL1 FAA2 430# 434 RHLOOP FA97 425# 440 RINDXD 001A 43# RSTBIT 0080 47# 585 SBEGIN FBDE 658# SECLEN FFFD 194 443 714# SECREG FBFE 24# 276 454 SECSET F981 60 254# SECTNO FFFC 713# SECTOR FFF8 260 277 448 709# SEEK F98B 59 263# SELDRV F81B 64# SERROR FA8E 398 417# 441 SETDEN F82D 70# SETDMA F812 61# SETSEC F80F 60# CP/M RMAC ASSEM 1.1 #016 *** NEW DISK JOCKEY MODEL B FIRMWARE *** SETSID F830 71# SIDE FFF7 182 518 673 708# SIDEFX FBE5 71 666# SIDENO FFFB 712# SKCMD 0018 42# 395 SLOOP FA73 404# 415 STABLE FADF 446 466# STACK FFC9 688# STATUS F827 68# STBITS 00C0 51# 587 STEST FA17 349 353# SVCMD 001D 44# 405 SZLOOP FAD7 458# 464 TERMIN F803 56# TILOOP FBD5 649# 655 TIMER FFE4 536 556 691# TIMOUT FBD2 77 105 647# TKZERO F809 58# TLOOP FB48 537# 541 TMSTAT F903 66 167# TPANIC F81E 65# TRACK FFF9 76 238 268 379 427 526 710# TRKNO FFFA 711# TRKREG FBFD 23# 173 239 374 378 492 TRKSET F80C 59# TRMOUT F806 57# TSTAT F821 66# TVERFY FA6A 386 399# TZERO 0004 32# 249 TZFLAG FFED 241 698# UDATA FBF8 15# 147 155 ULOAD 0006 34# 549 UNLOAD FB53 547# USTAT FBF9 17# 142 152 161 168 WINDXD 0012 41# WPROT 0040 45# WRCMD 00A8 50# 296 WRENTRY F9C2 295# 313 WRITE F9BC 63 292# WRLOOP F9C7 298# 312