CP/M MACRO ASSEM 2.0 #001 *** NEW Disk Jockey Model B Firmware *** ***************************************************************** * * * NEW FIRMWARE FOR DISK JOCKEY MODEL B. * * * ***************************************************************** TITLE '*** NEW Disk Jockey Model B Firmware ***' E000 = ORIGIN EQU 0E000H ; CHANGED ORIGIN FROM 0F800H E000 ORG ORIGIN E400 = RAM EQU ORIGIN+400H E3F8 = IO EQU ORIGIN+3F8H E3F8 = UDATA EQU IO E3F9 = DREG EQU IO+1 E3F9 = USTAT EQU IO+1 E3FA = DCMD EQU IO+2 E3FA = DSTAT EQU IO+2 E3FB = CSTALL EQU IO+3 E3FC = CMDREG EQU IO+4 E3FC = CSTAT EQU IO+4 E3FD = TRKREG EQU IO+5 E3FE = SECREG EQU IO+6 E3FF = DATREG EQU IO+7 0001 = LIGHT EQU 1 0001 = HEAD EQU 1 0001 = DENSITY EQU 1 0004 = INTRQ EQU 4 0004 = ISTAT EQU 4 0004 = TZERO EQU 4 0004 = LOAD EQU 4 0006 = ULOAD EQU 6 0008 = OSTAT EQU 10Q 0008 = DSIDE EQU 10Q 0009 = NOLITE EQU 11Q 0009 = DCRINT EQU 11Q 0009 = HCMD EQU 11Q 0010 = INDEX EQU 20Q 0012 = WINDXD EQU 22Q 0018 = SKCMD EQU 30Q 001A = RINDXD EQU 32Q 001D = SVCMD EQU 35Q 0040 = WPROT EQU 100Q 0040 = ACCESS EQU 100Q 0080 = RSTBIT EQU 200Q 0080 = READY EQU 200Q 0088 = RDCMD EQU 210Q ;WAS 200Q 00A8 = WRCMD EQU 250Q ;WAS 240Q 00C0 = STBITS EQU 300Q 00C4 = RACMD EQU 304Q 00D0 = CLRCMD EQU 320Q E000 C369E0 DBOOT JMP BOOT E003 C3E9E0 TERMIN JMP CIN CP/M MACRO ASSEM 2.0 #002 *** NEW Disk Jockey Model B Firmware *** E006 C3DAE0 TRMOUT JMP COUT E009 C35AE1 TKZERO JMP HOME E00C C38BE1 TRKSET JMP SEEK E00F C381E1 SETSEC JMP SECSET E012 C343E1 SETDMA JMP DMA E015 C3D3E1 DREAD JMP READ E018 C3B2E1 DWRITE JMP WRITE E01B C33CE1 SELDRV JMP DRIVE E01E C3F8E0 TPANIC JMP CPAN E021 C303E1 TSTAT JMP TMSTAT E024 C334E1 DMAST JMP DMSTAT E027 C309E1 STATUS JMP DISKST E02A C3C5E0 DSKERR JMP LERROR E02D C3A3E3 SETDEN JMP DENFIX E030 C3D5E3 SETSID JMP SIDEFX E033 DS 66Q E069 31FAE7 BOOT LXI SP,TRACK+1 ;INITIALIZE SP E06C CDC2E3 CALL TIMOUT ;POC/RESET TIMEOUT E06F 210100 LXI H,1 E072 E5 PUSH H ;TRACK 0, SECTOR 1 E073 2E09 MVI L,DCRINT ;SET UP THE E075 E5 PUSH H ; SIDE SELECT E076 26FF MVI H,377Q ; AND INITIAL E078 E5 PUSH H ; DRIVE E079 E5 PUSH H ; PARAMETERS E07A E5 PUSH H E07B E5 PUSH H E07C 210800 LXI H,10Q ;INITIALIZE E07F E5 PUSH H ; TZFLAG & CDISK E080 2E7E MVI L,176Q ;INITIALIZE E082 E5 PUSH H ; DISK & DRVSEL E083 2E08 MVI L,10Q ;INITIALIZE E085 E5 PUSH H ; HDFLAG & DSFLAG E086 2618 MVI H,30Q ;INITIALIZE E088 E5 PUSH H ; TIMER CONSTANT E089 3E7F MVI A,177Q ;START 1791 E08B 32F9E3 STA DREG E08E 3ED0 MVI A,CLRCMD ;1791 RESET E090 32FCE3 STA CMDREG LDHEAD E093 AF XRA A ;LOAD THE HEAD E094 CD0BE3 CALL HDCHK ; AND TEST FOR E097 D2A5E0 JNC DOOROK ; DRIVE READY E09A 3E01 MVI A,LIGHT ;TURN ON THE E09C 32F6E7 STA DCREG ; ERROR LED E09F CDC2E3 CALL TIMOUT ;TIMEOUT TO E0A2 C393E0 JMP LDHEAD ; CLOSE DRIVE DOOR DOOROK E0A5 3E09 MVI A,NOLITE ;TURN OFF THE E0A7 32F6E7 STA DCREG ; ERROR LED E0AA CD86E3 CALL MEASUR ;HEAD LOAD TIME E0AD C1 POP B ;ADJUST THE STACK E0AE 0100E7 LXI B,RAM+300H ;DMA ADDR CP/M MACRO ASSEM 2.0 #003 *** NEW Disk Jockey Model B Firmware *** E0B1 C5 PUSH B ;INITIALIZE E0B2 D5 PUSH D ; DMAADR & TIMER E0B3 210000 LXI H,0 ;INITIALIZE E0B6 E5 PUSH H ; INTRFG & RAMINS E0B7 00 NOP ;DEBUG INSTRUCTION E0B8 C5 PUSH B ;BOOT ADDRESS E0B9 060C MVI B,12 ;NUMBER OF RETRYS LDLOOP E0BB C5 PUSH B ;SAVE THE RETRY NO. E0BC CDD3E1 CALL READ ;READ BOOT SECTOR E0BF C1 POP B ;RESTOR RETRY NO. E0C0 D0 RNC ;SUCCESSFUL READ? E0C1 05 DCR B ;NO - COUNT DOWN E0C2 C2BBE0 JNZ LDLOOP ; AND TRY AGAIN LERROR E0C5 0E09 MVI C,11Q E0C7 11C3A2 LXI D,0A2C3H LELOOP E0CA 1B DCX D E0CB 7A MOV A,D E0CC B3 ORA E E0CD C2CAE0 JNZ LELOOP E0D0 3E08 MVI A,10Q ;BLINK E0D2 A9 XRA C ; THE LED AT E0D3 4F MOV C,A ; TOP OF THE E0D4 32FAE3 STA DCMD ; CIRCUIT BOARD E0D7 C3C7E0 JMP LERROR+2 COUT E0DA 3AF9E3 LDA USTAT ;GET UART STATUS E0DD E608 ANI OSTAT ;OUTPUT READY MASK E0DF C2DAE0 JNZ COUT ;TEST BUFFER EMPTY E0E2 79 MOV A,C ;CHARACTER DATA E0E3 2F CMA ;NEGATIVE LOGIC BUS E0E4 32F8E3 STA UDATA ;SEND DATA TO UART E0E7 2F CMA ;MAKE POSITIVE E0E8 C9 RET CIN E0E9 3AF9E3 LDA USTAT ;GET UART STATUS E0EC E604 ANI ISTAT ;INPUT READY MASK E0EE C2E9E0 JNZ CIN ;WAIT FOR INPUT E0F1 3AF8E3 LDA UDATA ;GET THE CHARACTER E0F4 2F CMA ;ADJUST FOR NEGATIVE BUS E0F5 E67F ANI 177Q ;TRIM TO 7 BITS E0F7 C9 RET CPAN E0F8 3AF9E3 LDA USTAT ;GET UART STATUS E0FB E604 ANI ISTAT ;INPUT READY MASK E0FD C0 RNZ ;TEST FOR DATA E0FE CDE9E0 CALL CIN ;GET CHARACTER E101 B9 CMP C ;TEST FOR PANIC CHTR E102 C9 RET TMSTAT E103 3AF9E3 LDA USTAT ;GET UART STATUS CP/M MACRO ASSEM 2.0 #004 *** NEW Disk Jockey Model B Firmware *** E106 E604 ANI ISTAT ;INPUT READY MASK E108 C9 RET DISKST E109 21FDE3 LXI H,TRKREG ;MOST RECENT E10C 4E MOV C,M ; TRACK TO C E10D 23 INX H ;MOST RECENT E10E 46 MOV B,M ; SECTOR TO B E10F 3AF6E7 LDA DCREG ;GET CURRENT E112 2F CMA ; DENSITY IN E113 E601 ANI 1 ; THE MSB E115 0F RRC ; POSITION E116 57 MOV D,A ;SAVE IN D E117 3AF7E7 LDA SIDE ;PUT THE E11A 07 RLC ; MOST RECENT E11B 07 RLC ; SIDE SELECT E11C 07 RLC ; IN BIT POSITIN E11D B2 ORA D ; 6 AND MERGE E11E 57 MOV D,A ;SAVE IN D E11F 3AE8E7 LDA DSFLAG ;GET THE E122 EE08 XRI DSIDE ; MOST RECENT E124 17 RAL ; DOUBLE SIDED E125 17 RAL ; STATUS AND PLACE E126 82 ADD D ; IN BIT POSITION E127 57 MOV D,A ; 5 AND MERGE E128 3AFDE7 LDA SECLEN ;GET THE E12B 17 RAL ; SECTOR LENGTH E12C 17 RAL ; CODE BITS IN E12D B2 ORA D ; POSITIONS 2 & 3 E12E 57 MOV D,A ; AND MERGE E12F 3AECE7 LDA CDISK ;GET THE CURRENT E132 82 ADD D ; DISK NO. IN BIT E133 C9 RET ; POSITIONS 0 & 1 DMSTAT E134 E5 PUSH H ;SAVE THE HL PAIR E135 2AE6E7 LHLD DMAADR ;MOVE THE E138 44 MOV B,H ; DMA ADDRESS TO E139 4D MOV C,L ; THE BC PAIR E13A E1 POP H ;RECOVER HL E13B C9 RET DRIVE E13C 79 MOV A,C ;DRIVE SELECT E13D E603 ANI 3 ; VALUES MUST BE E13F 32EBE7 STA DISK ; BETWEEN ZERO E142 C9 RET ; AND THREE DMA E143 21001C LXI H,-RAM ;TEST THE E146 09 DAD B ; DMA ADDRESS E147 DA54E1 JC DMASET ; FOR CONFLICT E14A 210820 LXI H,8-ORIGIN E14D 09 DAD B ; WITH THE I/O E14E D254E1 JNC DMASET ; ON THE DJ/2D E151 3E10 MVI A,20Q ; CONTROLLER CP/M MACRO ASSEM 2.0 #005 *** NEW Disk Jockey Model B Firmware *** E153 C9 RET DMASET E154 60 MOV H,B ;STORE THE E155 69 MOV L,C ; BC PAIR E156 22E6E7 SHLD DMAADR E159 C9 RET HOME E15A CDD3E2 CALL HDLOAD ;LOAD THE HEAD E15D D8 RC ;NOT READY ERROR E15E CD70E1 CALL HENTRY ;MOVE THE HEAD E161 F5 PUSH PSW ;SAVE STATUS E162 9F SBB A ;UPDATE THE E163 32F9E7 STA TRACK ; TRACK E166 32FDE3 STA TRKREG ; REGISTERS E169 AF XRA A ;SET THE NOT E16A 32EDE7 STA TZFLAG ; VERIFIED FLAG E16D C313E2 JMP LEAVE+1 ;UNLOAD THE HEAD HENTRY E170 AF XRA A ;SET THE FORCE E171 32E9E7 STA HDFLAG ; VERIFY FLAG E174 210000 LXI H,0 ;TIMEOUT CONSTANT E177 3E09 MVI A,HCMD ;MOVE THE HEAD E179 CD52E3 CALL CENTRY ;TO TRACK 0 E17C E604 ANI TZERO ;TRACK ZERO BIT E17E C0 RNZ E17F 37 STC ;ERROR FLAG E180 C9 RET SECSET E181 AF XRA A ;TEST FOR E182 B1 ORA C ; ZERO VALUE E183 37 STC ;ERROR FLAG E184 C8 RZ ;ERROR RETURN E185 E61F ANI 37Q ;TRIM & CLEAR CRY E187 32F8E7 STA SECTOR E18A C9 RET SEEK E18B 79 MOV A,C ;TEST FOR E18C FE4D CPI 77 ; TRACK E18E 3F CMC ; TOO LARGE E18F D8 RC E190 32F9E7 STA TRACK E193 C9 RET E194 32E3E7 ISSUE STA ECOUNT+1 ;UPDATE COUNT E197 CD86E3 CALL MEASUR ;FIND INDEX E19A 0E01 MVI C,1 ;START WITH SECTOR 1 ISLOOP E19C 79 MOV A,C ;INITIALIZE THE E19D 32FEE3 STA SECREG ; SECTOR REGISTER E1A0 3AF8E7 LDA SECTOR ;TEST FOR E1A3 B9 CMP C ; TARGET SECTOR E1A4 C8 RZ E1A5 3E88 MVI A,RDCMD ;DO A FAKE CP/M MACRO ASSEM 2.0 #006 *** NEW Disk Jockey Model B Firmware *** E1A7 CD4DE3 CALL COMAND ; READ COMMAND E1AA DA10E2 JC PLEAVE ;ABORT ON ERROR E1AD 0C INR C E1AE 2AE6E7 LHLD DMAADR ;TRANSFER ADDRESS E1B1 C9 RET WRITE E1B2 CD23E2 CALL PREP ;PREPARE FOR WRITE E1B5 DA12E2 JC LEAVE ;ABORT OPERATION WRENTRY E1B8 3EA8 MVI A,WRCMD ;WRITE A SECTOR CMD E1BA CDFCE3 CALL CMDREG WRLOOP E1BD 7E MOV A,M ;LOAD 1ST BYTE OF DATA E1BE 23 INX H E1BF 12 STAX D ;WRITE 1ST BYTE OF DATA E1C0 7E MOV A,M ;LOAD 2ND BYTE OF DATA E1C1 23 INX H E1C2 12 STAX D ;WRITE 2ND BYTE OF DATA E1C3 7E MOV A,M ;LOAD 3RD BYTE OF DATA E1C4 23 INX H E1C5 12 STAX D ;WRITE 3RD BYTE OF DATA E1C6 0D DCR C ;REDUCE BLOCK COUNT E1C7 7E MOV A,M ;LOAD 4TH BYTE OF DATA E1C8 23 INX H E1C9 12 STAX D ;WRITE 4TH BYTE OF DATA E1CA C2BDE1 JNZ WRLOOP ;WRITE NEXT 4 BYTES E1CD 21B8E1 LXI H,WRENTRY E1D0 C3EBE1 JMP CBUSY READ E1D3 CD23E2 CALL PREP ;PREPARE FOR READ E1D6 DA12E2 JC LEAVE ;ABORT OPERATION RDENTRY E1D9 3E88 MVI A,RDCMD ;READ SECTOR CMD E1DB CDFCE3 CALL CMDREG RDLOOP E1DE 1A LDAX D ;READ 1ST BYTE E1DF 77 MOV M,A ;STORE 3RD BYTE E1E0 23 INX H ;ADVANCE POINTER E1E1 0D DCR C ;REDUCE BLOCK COUNT E1E2 1A LDAX D ;READ 4TH BYTE E1E3 77 MOV M,A ;STORE 4TH BYTE E1E4 23 INX H ;ADVANCE POINTER E1E5 C2DEE1 JNZ RDLOOP ;READ NEXT 4 BYTES E1E8 21D9E1 LXI H,RDENTRY CBUSY E1EB E5 PUSH H E1EC 21FCE3 LXI H,CSTAT ;WAIT FOR 1791 E1EF CD5CE3 CALL BUSY ; TO FINISH COMMAND E1F2 E65F ANI 137Q ;ERROR MASK E1F4 CA11E2 JZ LEAVE-1 ;NO ERROR E1F7 FE10 CPI 20Q ;PREMATURE INTERRUPT E1F9 C210E2 JNZ PLEAVE ;OTHER TYPE OF ERROR E1FC 3AE2E7 LDA ECOUNT ;DECREMENT ERROR COUNT CP/M MACRO ASSEM 2.0 #007 *** NEW Disk Jockey Model B Firmware *** E1FF 3D DCR A ; BY ONE E200 FA07E2 JM STEST ;HARD INTERRUPT ERROR E203 32E2E7 STA ECOUNT ;UPDATE COUNT E206 C9 RET STEST E207 3AE3E7 LDA ECOUNT+1 ;DECREMENT ERROR E20A 3D DCR A E20B F294E1 JP ISSUE E20E 3E10 MVI A,20Q PLEAVE E210 37 STC ;ERROR FLAG E211 E1 POP H LEAVE E212 F5 PUSH PSW ;SAVE THE STATUS E213 3AF6E7 LDA DCREG ;CONTROL BITS E216 EE04 XRI LOAD ;TOGGLE THE E218 32FAE3 STA DCMD ; HEAD LOAD BIT E21B 3AEAE7 LDA DRVSEL ;ENABLE ACCESS TO E21E 32F9E3 STA DREG ; THE DATA REGISTER E221 F1 POP PSW ;RECOVER THE STATUS E222 C9 RET PREP E223 CDD3E2 CALL HDLOAD ;LOAD THE HEAD E226 D8 RC ;TEST FOR DRIVE READY E227 3AFDE3 LDA TRKREG ;GET OLD TRACK E22A 3C INR A ;TEST FOR HEAD E22B CC70E1 CZ HENTRY ; NOT CALIBRATED E22E D8 RC ;SEEK ERROR? E22F 21FDE3 LXI H,TRKREG ;OLD TRACK E232 3AF9E7 LDA TRACK ;NEW TRACK E235 BE CMP M ;TEST FOR HEAD MOTION E236 23 INX H ;ADVANCE TO THE E237 23 INX H ; DATA REGISTER E238 77 MOV M,A ;SAVE NEW TRACK E239 79 MOV A,C ;TURN OFF DATA REG E23A 32F9E3 STA DREG ; ACCESS CONTROL BIT E23D CA5AE2 JZ TVERFY ;TEST FOR SEEK E240 AF XRA A ;FORCE A READ E241 32E9E7 STA HDFLAG ; HEADER OPERATION E244 3AFAE3 LDA DSTAT ;GET THE DOUBLE E247 E608 ANI DSIDE ; SIDED FLAG E249 32E8E7 STA DSFLAG ;SAVE FOR STATUS E24C 1F RAR ;SHIFT FOR E24D 1F RAR ; 3/6 MS STEP E24E 1F RAR ; RATE CONSTANT E24F C618 ADI SKCMD ;DO A E251 210000 LXI H,0 ; SEEK E254 CD52E3 CALL CENTRY ; OPERATION E257 DA7EE2 JC SERROR ;SEEK ERROR? TVERFY E25A 3AE9E7 LDA HDFLAG ;GET THE FORCE E25D B7 ORA A ; VERIFY HDR FLAG E25E C2A9E2 JNZ CHKSEC ;NO SEEK & HEAD OK E261 0602 MVI B,2 ;VERIFY RETRY COUNT CP/M MACRO ASSEM 2.0 #008 *** NEW Disk Jockey Model B Firmware *** SLOOP E263 3E1D MVI A,SVCMD ;DO A VERIFY E265 CD4DE3 CALL COMAND ; COMMAND E268 E699 ANI 231Q ;ERROR BIT MASK E26A 57 MOV D,A ;SAVE E26B CA85E2 JZ RDHDR ;NO ERROR E26E 3AF6E7 LDA DCREG ;DENISTY CONTROL E271 EE01 XRI DENSITY ;FLIP THE DENSITY E273 32F6E7 STA DCREG ;UPDATE AND E276 32FAE3 STA DCMD ; CHANGE DENSITY E279 05 DCR B ;DECREMENT RETRY E27A C263E2 JNZ SLOOP ; COUNT & TEST E27D 7A MOV A,D SERROR E27E 37 STC E27F F5 PUSH PSW E280 CD70E1 CALL HENTRY E283 F1 POP PSW E284 C9 RET RDHDR E285 060A MVI B,12Q ;NUMBER OF RETRYS RHLOOP E287 11FFE3 LXI D,DATREG ;DATA REGISTER E28A 21FAE7 LXI H,TRACK+1 ;DATA POINTER E28D 3EC4 MVI A,RACMD ;START READ HEADER CMD E28F 32FCE3 STA CMDREG RHL1 E292 1A LDAX D ;GET DISK DATA 0 E293 77 MOV M,A ;STORE IN MEM E294 2C INR L ;ADVANCE POINTER E295 C292E2 JNZ RHL1 ;TEST END OF PAGE E298 21FCE3 LXI H,CSTAT ;WAIT FOR 1791 E29B CD5CE3 CALL BUSY ; TO FINISH CMD E29E B7 ORA A ;TEST FOR ERRORS E29F CAA9E2 JZ CHKSEC ;TRANSFER OK? E2A2 05 DCR B ;NO - TEST FOR E2A3 C287E2 JNZ RHLOOP ; HARD ERROR E2A6 C37EE2 JMP SERROR ;RECALIBRATE CHKSEC E2A9 3AFDE7 LDA SECLEN ;GET THE SECTOR E2AC 4F MOV C,A ; SIZE AND SETUP E2AD 0600 MVI B,0 ; THE TABLE OFFSET E2AF 21CFE2 LXI H,STABLE ;SECTOR TABLE E2B2 09 DAD B ;SECTOR SIZE PNTR E2B3 3AF8E7 LDA SECTOR ;GET THE SECTOR E2B6 47 MOV B,A ; AND SAVE IN B E2B7 86 ADD M ;COMPARE W/TABLE E2B8 3E10 MVI A,20Q ;ERROR FLAG E2BA D8 RC ;ERROR RETURN E2BB 78 MOV A,B ;INITIALIZE 1791 E2BC 32FEE3 STA SECREG ; SECTOR REGISTER E2BF 3E20 MVI A,40Q ;128 BYTE SECTOR E2C1 210505 LXI H,505H E2C4 22E2E7 SHLD ECOUNT SZLOOP E2C7 0D DCR C ;REDUCE SIZE COUNT CP/M MACRO ASSEM 2.0 #009 *** NEW Disk Jockey Model B Firmware *** E2C8 47 MOV B,A ;SECTOR SIZE TO B E2C9 F8 RM ;RETURN ON MINUS E2CA 17 RAL ;DOUBLE THE COUNT E2CB B7 ORA A ;CLEAR THE CARRY E2CC C3C7E2 JMP SZLOOP STABLE E2CF E5 DB 345Q ;26 SECTOR DISKETTES E2D0 E5 DB 345Q ;26 SECTOR DISKETTES E2D1 F0 DB 360Q ;15 SECTOR DISKETTES E2D2 F7 DB 367Q ;8 SECTOR DISKETTES HDLOAD E2D3 21EBE7 LXI H,DISK ;NEW DRV PTR E2D6 4E MOV C,M ;SAVE NEW DRV IN C E2D7 23 INX H ;CURRENT DRV PTR E2D8 5E MOV E,M ;SAVE OLD DRV IN E E2D9 71 MOV M,C ;UPDATE CURRENT DRV E2DA 23 INX H ;HOME CMD FLAG E2DB 7B MOV A,E ;TEST FOR E2DC B9 CMP C ; DRIVE CHANGE E2DD 7E MOV A,M ;HEAD LOAD MASK E2DE 3601 MVI M,HEAD ;UPDATE THE MASK E2E0 CA0BE3 JZ HDCHK ;NO DRIVE CHANGE? E2E3 23 INX H ;ADDR OF DRIVE TABLE E2E4 E5 PUSH H ;SAVE TABLE ADDR E2E5 1600 MVI D,0 ;SET UP THE E2E7 42 MOV B,D ; OFFSET ADDRESS E2E8 19 DAD D ;CALCULATE THE E2E9 19 DAD D ; PARAMETER ADDR E2EA 3AF6E7 LDA DCREG ;SAVE THE E2ED 77 MOV M,A ;DENSITY STATUS E2EE 23 INX H ;TRACK POINTER E2EF 11FDE3 LXI D,TRKREG ;1791 TRK REG E2F2 1A LDAX D ;GET CURRENT TRACK E2F3 77 MOV M,A ;SAVE IN THE TABLE E2F4 E1 POP H ;BEGINNING OF TABLE E2F5 09 DAD B ;NEW DRIVE E2F6 09 DAD B ; TABLE POINTER E2F7 7E MOV A,M ;GET DENSITY STATUS E2F8 32F6E7 STA DCREG ;UPDATE DCREG E2FB 23 INX H ;GET THE OLD E2FC 7E MOV A,M ; TRACK NUMBER E2FD 12 STAX D ; AND UPDATE 1791 E2FE 3E7F MVI A,177Q ;DRIVE SELECT BITS DSROT E300 07 RLC ;ROTATE TO E301 0D DCR C ; SELECT THE E302 F200E3 JP DSROT ; PROPER DRIVE E305 E67F ANI 177Q ;SET THE RUN BIT E307 32EAE7 STA DRVSEL ;SAVE IN DRV REG E30A AF XRA A ;FORCE A HEAD LOAD HDCHK E30B 21FAE3 LXI H,DSTAT ;TEST FOR E30E A6 ANA M ; HEAD LOADED E30F 32E9E7 STA HDFLAG ;SAVE THE HEAD E312 F5 PUSH PSW ; LOADED STATUS CP/M MACRO ASSEM 2.0 #010 *** NEW Disk Jockey Model B Firmware *** E313 3AEAE7 LDA DRVSEL ;GET CURRENT DRIVE E316 4F MOV C,A ;SAVE E317 3AF7E7 LDA SIDE ;GET CURRENT SIDE E31A 2F CMA ; AND MERGE E31B A1 ANA C ; WITH DRIVE SELECT E31C 32F9E3 STA DREG ;SELECT DRIVE & SIDE E31F EE40 XRI ACCESS ;TOGGLE ACCESS BIT E321 4F MOV C,A ;SAVE FOR PREP ROUTINE E322 3AF6E7 LDA DCREG ;DEN & HEAD CNTL BITS E325 47 MOV B,A ;SAVE E326 3AF9E7 LDA TRACK ;GET THE NEW TRACK E329 D601 SUI 1 ;FORCE SINGLE E32B 9F SBB A ; DENSITY E32C 3D DCR A ; IF TRACK = 0 E32D 2F CMA ;COMPLIMENT E32E B0 ORA B ;MERGE W/CONTROL BITS E32F 77 MOV M,A ;LOAD HEAD & SET DENSITY E330 F1 POP PSW ;HEAD LOAD STATUS E331 C23FE3 JNZ RDYCHK ;CONDITIONALLY E334 E5 PUSH H ; WAIT FOR HEAD E335 2AE4E7 LHLD TIMER ; LOAD TIME OUT TLOOP E338 2B DCX H ;COUNT DOWN E339 7C MOV A,H ; 40 MS FOR E33A B5 ORA L ; HEAD LOAD E33B C238E3 JNZ TLOOP ; TIME OUT E33E E1 POP H RDYCHK E33F 7E MOV A,M ;TEST FOR E340 E680 ANI READY ; DRIVE READY E342 C0 RNZ UNLOAD E343 3AF6E7 LDA DCREG ;FORCE A E346 F606 ORI ULOAD ; HEAD E348 77 MOV M,A ; UNLOAD E349 3E80 MVI A,READY ;SET DRIVE E34B 37 STC ; NOT READY E34C C9 RET ; ERROR FLAG COMAND E34D 2AE4E7 LHLD TIMER ;GET INDEX COUNT E350 29 DAD H ; AND MULTIPLY E351 29 DAD H ; BY FOUR CENTRY E352 EB XCHG ;SAVE IN D-E PAIR E353 21FCE3 LXI H,CSTAT ;ISSUE COMMAND E356 77 MOV M,A ; TO THE 1791 NBUSY E357 7E MOV A,M ;WAIT E358 1F RAR ; FOR THE E359 D257E3 JNC NBUSY ; BUSY FLAG BUSY E35C 7E MOV A,M ;TEST FOR E35D 1F RAR ; DEVICE BUSY E35E 7E MOV A,M ;RESTORE STATUS E35F D0 RNC ;RETURN IF NOT BUSY CP/M MACRO ASSEM 2.0 #011 *** NEW Disk Jockey Model B Firmware *** E360 C366E3 JMP PATCH+3 ;JUMP AROUND PATCH PATCH E363 C3D3E2 JMP HDLOAD ;PATCH FOR OLD ATE E366 1B DCX D ;TEST FOR E367 7A MOV A,D ; TWO DISK E368 B3 ORA E ; REVOLUTIONS E369 C25CE3 JNZ BUSY ;47 MACHINE CYCLES E36C 5E MOV E,M ;GET ERROR CODE E36D E5 PUSH H ;SAVE CMD ADDRESS E36E 23 INX H ;TRACK REGISTER E36F 56 MOV D,M ;SAVE PRESENT TRACK E370 3AEAE7 LDA DRVSEL ;CONTROL BITS E373 EE80 XRI RSTBIT ;RESET THE 1791 E375 32F9E3 STA DREG ; CONTROLLER TO E378 EEC0 XRI STBITS ; CLEAR THE E37A E3 XTHL ; COMMAND BUSY E37B 32F9E3 STA DREG ; FAULT CONDITION E37E 36D0 MVI M,CLRCMD ;FORCE INTERRUPT E380 E3 XTHL ;RESTORE THE E381 72 MOV M,D ; THE TRACK REG E382 E1 POP H ;RESTORE THE STACK E383 7B MOV A,E ;ERROR CODE TO A E384 37 STC ; ERROR FLAG E385 C9 RET MEASUR E386 110000 LXI D,0 ;INITIALIZE COUNT E389 21FAE3 LXI H,DSTAT ;STATUS PORT E38C 0E10 MVI C,INDEX ;INDEX BIT FLAG INDXLO E38E 7E MOV A,M ;WAIT FOR E38F A1 ANA C ; INDEX E390 CA8EE3 JZ INDXLO ; PULSE HIGH INDXHI E393 7E MOV A,M ;WAIT FOR E394 A1 ANA C ; INDEX E395 C293E3 JNZ INDXHI ; PULSE LOW INDXCT E398 13 INX D ;ADVANCE COUNT E399 E3 XTHL ;FOUR DUMMY E39A E3 XTHL ; INSTRUCTIONS E39B E3 XTHL ; TO LENGTHEN E39C E3 XTHL ; THE DELAY E39D 7E MOV A,M ;WAIT FOR E39E A1 ANA C ; THE INDEX E39F CA98E3 JZ INDXCT ; TO GO HIGH E3A2 C9 RET ;98 MACHINE CYCLES DENFIX E3A3 79 MOV A,C ;TRIM THE E3A4 E601 ANI 1 ; EXCESS BITS E3A6 2F CMA ;COMPLIMENT AND E3A7 47 MOV B,A ; SAVE IN B E3A8 21EBE7 LXI H,DISK ;NEW DISK PTR E3AB 5E MOV E,M ;GET DISK NO. CP/M MACRO ASSEM 2.0 #012 *** NEW Disk Jockey Model B Firmware *** E3AC 1600 MVI D,0 ;OFFSET ADDR E3AE 23 INX H ;CURRENT DISK PTR E3AF 7E MOV A,M ;MOVE TO ACC E3B0 AB XRA E ;CMPR OLD W/NEW E3B1 F5 PUSH PSW ;SAVE STATUS E3B2 23 INX H ;DISK TABLE E3B3 23 INX H ; ADDRESS E3B4 19 DAD D ;ADD THE E3B5 19 DAD D ; OFFSET E3B6 7E MOV A,M ;GET PARAMETERS E3B7 F601 ORI 1 ;MASK OFF DENSITY E3B9 A0 ANA B ;SET NEW DENSITY E3BA 77 MOV M,A ;UPDATE PARAMETERS E3BB F1 POP PSW ;TEST NEW=OLD? E3BC C0 RNZ E3BD 7E MOV A,M ;UPDATA CDISK E3BE 32F6E7 STA DCREG ; ALSO E3C1 C9 RET TIMOUT E3C2 210000 LXI H,0 ;TIME-OUT DELAY TILOOP E3C5 2B DCX H ;DECREMENT COUNT E3C6 7C MOV A,H ;TEST FOR DELAY E3C7 B5 ORA L ; COUNT EQUAL ZERO E3C8 E3 XTHL ;LONG NOP E3C9 E3 XTHL ; INSTRUCTION E3CA C2C5E3 JNZ TILOOP E3CD C9 RET SBEGIN E3CE E5 PUSH H ;SAVE THE POINTER E3CF 21D2E3 LXI H,DSTALL ;SETUP JUMP DSTALL E3D2 E9 PCHL ;DYNAMIC STALL E3D3 E1 POP H ;RESTORE POINTER E3D4 C9 RET ;RETURN SIDEFX E3D5 79 MOV A,C ;GET THE SIDE BIT E3D6 E601 ANI 1 ;TRIM THE EXCESS E3D8 17 RAL ;MOVE THE BIT E3D9 17 RAL ; TO THE SIDE E3DA 17 RAL ; SELECT BIT E3DB 17 RAL ; POSITION E3DC 32F7E7 STA SIDE ;SAVE SIDE BIT E3DF C9 RET PWRJMP E3E0 00 NOP ;POWER-ON E3E1 00 NOP ; JUMP E3E2 00 NOP ; SEQUENCE E3E3 00 NOP ; WITH NOP E3E4 00 NOP ; PADDING E3E5 C300E0 JMP DBOOT CP/M MACRO ASSEM 2.0 #013 *** NEW Disk Jockey Model B Firmware *** E3E8 DS 10Q ;I/O LOCATIONS E7C9 ORG RAM+3C9H E7C9 STACK DS 31Q E7E2 0000 ECOUNT DW 0 E7E4 0018 TIMER DW 1800H ;HEAD LOAD TIME OUT E7E6 00E7 DMAADR DW RAM+300H ;DMA ADDRESS E7E8 08 DSFLAG DB 10Q E7E9 00 HDFLAG DB 0 ;READ HEADER FLAG E7EA 7E DRVSEL DB 176Q ;DRIVE SELECT CONSTANT E7EB 00 DISK DB 0 ;NEW DRIVE E7EC 08 CDISK DB 10Q ;CURRENT DISK E7ED 00 TZFLAG DB 0 ;HOME CMD INDICATOR E7EE 09 DOPRAM DB 11Q ;DRIVE 0 PARAMETERS E7EF FF DOTRK DB 377Q ;DRIVE 0 TRACK NO E7F0 09 D1PRAM DB 11Q ;DRIVE 1 PARAMETERS E7F1 FF D1TRK DB 377Q ;DRIVE 1 TRACK NO E7F2 09 D2PRAM DB 11Q ;DRIVE 2 PARAMETERS E7F3 FF D2TRK DB 377Q ;DRIVE 2 TRACK NO E7F4 09 D3PRAM DB 11Q ;DRIVE 3 PARAMETERS E7F5 FF D3TRK DB 377Q ;DRIVE 3 TRACK NO E7F6 09 DCREG DB 11Q ;CURRENT PARAMETERS E7F7 00 SIDE DB 0 ;NEW SIDE E7F8 01 SECTOR DB 1 ;NEW SECTOR E7F9 00 TRACK DB 0 ;NEW TRACK E7FA 00 TRKNO DB 0 ;DISK E7FB 00 SIDENO DB 0 ; SECTOR E7FC 00 SECTNO DB 0 ; HEADER E7FD 00 SECLEN DB 0 ; DATA E7FE 00 CRCLO DB 0 ; BUFFER E7FF 00 CRCHI DB 0