CP/M MACRO ASSEM 2.0 #001 *** Disk Jockey Model B Firmware *** ***************************************************************** * * * FIRMWARE FOR DISK JOCKEY MODEL B. * * * ***************************************************************** TITLE '*** Disk Jockey Model B Firmware ***' F800 = ORIGIN EQU 0F800H F800 ORG ORIGIN FC00 = RAM EQU ORIGIN+400H FBF8 = IO EQU ORIGIN+3F8H FBF8 = UDATA EQU IO FBF9 = DREG EQU IO+1 FBF9 = USTAT EQU IO+1 FBFA = DCMD EQU IO+2 FBFA = DSTAT EQU IO+2 FBFB = CSTALL EQU IO+3 FBFC = CMDREG EQU IO+4 FBFC = CSTAT EQU IO+4 FBFD = TRKREG EQU IO+5 FBFE = SECREG EQU IO+6 FBFF = 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 0080 = RDCMD EQU 200Q 00A0 = WRCMD EQU 240Q 00C0 = STBITS EQU 300Q 00C4 = RACMD EQU 304Q 00D0 = CLRCMD EQU 320Q F800 C369F8 DBOOT JMP BOOT F803 C3E9F8 TERMIN JMP CIN CP/M MACRO ASSEM 2.0 #002 *** Disk Jockey Model B Firmware *** F806 C3DAF8 TRMOUT JMP COUT F809 C35AF9 TKZERO JMP HOME F80C C38BF9 TRKSET JMP SEEK F80F C381F9 SETSEC JMP SECSET F812 C343F9 SETDMA JMP DMA F815 C3DDF9 DREAD JMP READ F818 C3BCF9 DWRITE JMP WRITE F81B C33CF9 SELDRV JMP DRIVE F81E C3F8F8 TPANIC JMP CPAN F821 C303F9 TSTAT JMP TMSTAT F824 C334F9 DMAST JMP DMSTAT F827 C309F9 STATUS JMP DISKST F82A C3C5F8 DSKERR JMP LERROR F82D C3B3FB SETDEN JMP DENFIX F830 C3E5FB SETSID JMP SIDEFX F833 DS 66Q F869 31FAFF BOOT LXI SP,TRACK+1 ;INITIALIZE SP F86C CDD2FB CALL TIMOUT ;POC/RESET TIMEOUT F86F 210100 LXI H,1 F872 E5 PUSH H ;TRACK 0, SECTOR 1 F873 2E09 MVI L,DCRINT ;SET UP THE F875 E5 PUSH H ; SIDE SELECT F876 26FF MVI H,377Q ; AND INITIAL F878 E5 PUSH H ; DRIVE F879 E5 PUSH H ; PARAMETERS F87A E5 PUSH H F87B E5 PUSH H F87C 210800 LXI H,10Q ;INITIALIZE F87F E5 PUSH H ; TZFLAG & CDISK F880 2E7E MVI L,176Q ;INITIALIZE F882 E5 PUSH H ; DISK & DRVSEL F883 2E08 MVI L,10Q ;INITIALIZE F885 E5 PUSH H ; HDFLAG & DSFLAG F886 2618 MVI H,30Q ;INITIALIZE F888 E5 PUSH H ; TIMER CONSTANT F889 3E7F MVI A,177Q ;START 1791 F88B 32F9FB STA DREG F88E 3ED0 MVI A,CLRCMD ;1791 RESET F890 32FCFB STA CMDREG LDHEAD F893 AF XRA A ;LOAD THE HEAD F894 CD1BFB CALL HDCHK ; AND TEST FOR F897 D2A5F8 JNC DOOROK ; DRIVE READY F89A 3E01 MVI A,LIGHT ;TURN ON THE F89C 32F6FF STA DCREG ; ERROR LED F89F CDD2FB CALL TIMOUT ;TIMEOUT TO F8A2 C393F8 JMP LDHEAD ; CLOSE DRIVE DOOR DOOROK F8A5 3E09 MVI A,NOLITE ;TURN OFF THE F8A7 32F6FF STA DCREG ; ERROR LED F8AA CD96FB CALL MEASUR ;HEAD LOAD TIME F8AD C1 POP B ;ADJUST THE STACK F8AE 0100FF LXI B,RAM+300H ;DMA ADDR CP/M MACRO ASSEM 2.0 #003 *** Disk Jockey Model B Firmware *** F8B1 C5 PUSH B ;INITIALIZE F8B2 D5 PUSH D ; DMAADR & TIMER F8B3 210000 LXI H,0 ;INITIALIZE F8B6 E5 PUSH H ; INTRFG & RAMINS F8B7 00 NOP ;DEBUG INSTRUCTION F8B8 C5 PUSH B ;BOOT ADDRESS F8B9 060C MVI B,12 ;NUMBER OF RETRYS LDLOOP F8BB C5 PUSH B ;SAVE THE RETRY NO. F8BC CDDDF9 CALL READ ;READ BOOT SECTOR F8BF C1 POP B ;RESTOR RETRY NO. F8C0 D0 RNC ;SUCCESSFUL READ? F8C1 05 DCR B ;NO - COUNT DOWN F8C2 C2BBF8 JNZ LDLOOP ; AND TRY AGAIN LERROR F8C5 0E09 MVI C,11Q F8C7 11C3A2 LXI D,0A2C3H LELOOP F8CA 1B DCX D F8CB 7A MOV A,D F8CC B3 ORA E F8CD C2CAF8 JNZ LELOOP F8D0 3E08 MVI A,10Q ;BLINK F8D2 A9 XRA C ; THE LED AT F8D3 4F MOV C,A ; TOP OF THE F8D4 32FAFB STA DCMD ; CIRCUIT BOARD F8D7 C3C7F8 JMP LERROR+2 COUT F8DA 3AF9FB LDA USTAT ;GET UART STATUS F8DD E608 ANI OSTAT ;OUTPUT READY MASK F8DF C2DAF8 JNZ COUT ;TEST BUFFER EMPTY F8E2 79 MOV A,C ;CHARACTER DATA F8E3 2F CMA ;NEGATIVE LOGIC BUS F8E4 32F8FB STA UDATA ;SEND DATA TO UART F8E7 2F CMA ;MAKE POSITIVE F8E8 C9 RET CIN F8E9 3AF9FB LDA USTAT ;GET UART STATUS F8EC E604 ANI ISTAT ;INPUT READY MASK F8EE C2E9F8 JNZ CIN ;WAIT FOR INPUT F8F1 3AF8FB LDA UDATA ;GET THE CHARACTER F8F4 2F CMA ;ADJUST FOR NEGATIVE BUS F8F5 E67F ANI 177Q ;TRIM TO 7 BITS F8F7 C9 RET CPAN F8F8 3AF9FB LDA USTAT ;GET UART STATUS F8FB E604 ANI ISTAT ;INPUT READY MASK F8FD C0 RNZ ;TEST FOR DATA F8FE CDE9F8 CALL CIN ;GET CHARACTER F901 B9 CMP C ;TEST FOR PANIC CHTR F902 C9 RET TMSTAT F903 3AF9FB LDA USTAT ;GET UART STATUS CP/M MACRO ASSEM 2.0 #004 *** Disk Jockey Model B Firmware *** F906 E604 ANI ISTAT ;INPUT READY MASK F908 C9 RET DISKST F909 21FDFB LXI H,TRKREG ;MOST RECENT F90C 4E MOV C,M ; TRACK TO C F90D 23 INX H ;MOST RECENT F90E 46 MOV B,M ; SECTOR TO B F90F 3AF6FF LDA DCREG ;GET CURRENT F912 2F CMA ; DENSITY IN F913 E601 ANI 1 ; THE MSB F915 0F RRC ; POSITION F916 57 MOV D,A ;SAVE IN D F917 3AF7FF LDA SIDE ;PUT THE F91A 07 RLC ; MOST RECENT F91B 07 RLC ; SIDE SELECT F91C 07 RLC ; IN BIT POSITIN F91D B2 ORA D ; 6 AND MERGE F91E 57 MOV D,A ;SAVE IN D F91F 3AE8FF LDA DSFLAG ;GET THE F922 EE08 XRI DSIDE ; MOST RECENT F924 17 RAL ; DOUBLE SIDED F925 17 RAL ; STATUS AND PLACE F926 82 ADD D ; IN BIT POSITION F927 57 MOV D,A ; 5 AND MERGE F928 3AFDFF LDA SECLEN ;GET THE F92B 17 RAL ; SECTOR LENGTH F92C 17 RAL ; CODE BITS IN F92D B2 ORA D ; POSITIONS 2 & 3 F92E 57 MOV D,A ; AND MERGE F92F 3AECFF LDA CDISK ;GET THE CURRENT F932 82 ADD D ; DISK NO. IN BIT F933 C9 RET ; POSITIONS 0 & 1 DMSTAT F934 E5 PUSH H ;SAVE THE HL PAIR F935 2AE6FF LHLD DMAADR ;MOVE THE F938 44 MOV B,H ; DMA ADDRESS TO F939 4D MOV C,L ; THE BC PAIR F93A E1 POP H ;RECOVER HL F93B C9 RET DRIVE F93C 79 MOV A,C ;DRIVE SELECT F93D E603 ANI 3 ; VALUES MUST BE F93F 32EBFF STA DISK ; BETWEEN ZERO F942 C9 RET ; AND THREE DMA F943 210004 LXI H,-RAM ;TEST THE F946 09 DAD B ; DMA ADDRESS F947 DA54F9 JC DMASET ; FOR CONFLICT F94A 210808 LXI H,8-ORIGIN F94D 09 DAD B ; WITH THE I/O F94E D254F9 JNC DMASET ; ON THE DJ/2D F951 3E10 MVI A,20Q ; CONTROLLER CP/M MACRO ASSEM 2.0 #005 *** Disk Jockey Model B Firmware *** F953 C9 RET DMASET F954 60 MOV H,B ;STORE THE F955 69 MOV L,C ; BC PAIR F956 22E6FF SHLD DMAADR F959 C9 RET HOME F95A CDE3FA CALL HDLOAD ;LOAD THE HEAD F95D D8 RC ;NOT READY ERROR F95E CD70F9 CALL HENTRY ;MOVE THE HEAD F961 F5 PUSH PSW ;SAVE STATUS F962 9F SBB A ;UPDATE THE F963 32F9FF STA TRACK ; TRACK F966 32FDFB STA TRKREG ; REGISTERS F969 AF XRA A ;SET THE NOT F96A 32EDFF STA TZFLAG ; VERIFIED FLAG F96D C323FA JMP LEAVE+1 ;UNLOAD THE HEAD HENTRY F970 AF XRA A ;SET THE FORCE F971 32E9FF STA HDFLAG ; VERIFY FLAG F974 210000 LXI H,0 ;TIMEOUT CONSTANT F977 3E09 MVI A,HCMD ;MOVE THE HEAD F979 CD62FB CALL CENTRY ;TO TRACK 0 F97C E604 ANI TZERO ;TRACK ZERO BIT F97E C0 RNZ F97F 37 STC ;ERROR FLAG F980 C9 RET SECSET F981 AF XRA A ;TEST FOR F982 B1 ORA C ; ZERO VALUE F983 37 STC ;ERROR FLAG F984 C8 RZ ;ERROR RETURN F985 E61F ANI 37Q ;TRIM & CLEAR CRY F987 32F8FF STA SECTOR F98A C9 RET SEEK F98B 79 MOV A,C ;TEST FOR F98C FE4D CPI 77 ; TRACK F98E 3F CMC ; TOO LARGE F98F D8 RC F990 32F9FF STA TRACK F993 C9 RET F994 32E3FF ISSUE STA ECOUNT+1 ;UPDATE COUNT F997 CD96FB CALL MEASUR ;FIND INDEX F99A 0E01 MVI C,1 ;START WITH SECTOR 1 ISLOOP F99C 79 MOV A,C ;INITILIZE THE F99D 32FEFB STA SECREG ; SECTOR REGISTER F9A0 3AF8FF LDA SECTOR ;TEST FOR F9A3 B9 CMP C ; TARGET SECTOR F9A4 C8 RZ F9A5 3E80 MVI A,RDCMD ;DO A FAKE CP/M MACRO ASSEM 2.0 #006 *** Disk Jockey Model B Firmware *** F9A7 CD5DFB CALL COMAND ; READ COMMAND F9AA DA20FA JC PLEAVE ;ABORT ON ERROR F9AD 0C INR C ;INCREMENT SECTOR NUMBER F9AE C39CF9 JMP ISLOOP F9B1 32FCFB COMNDP STA CMDREG ;START OPERATION F9B4 48 MOV C,B ;INITILIZE BLOCK COUNT F9B5 11FFFB LXI D,DATREG ;DATA REGISTER F9B8 2AE6FF LHLD DMAADR ;TRANSFER ADDRESS F9BB C9 RET WRITE F9BC CD33FA CALL PREP ;PREPARE FOR WRITE F9BF DA22FA JC LEAVE ;ABORT OPERATION WRENTRY F9C2 3EA0 MVI A,WRCMD ;WRITE SECTOR CMD F9C4 CDB1F9 CALL COMNDP WRLOOP F9C7 7E MOV A,M ;LOAD 1ST BYTE OF DATA F9C8 23 INX H F9C9 12 STAX D ;WRITE 1ST BYTE OF DATA F9CA 7E MOV A,M ;LOAD 2ND BYTE OF DATA F9CB 23 INX H F9CC 12 STAX D ;WRITE 2ND BYTE OF DATA F9CD 7E MOV A,M ;LOAD 3RD BYTE OF DATA F9CE 23 INX H F9CF 12 STAX D ;WRITE 3RD BYTE OF DATA F9D0 0D DCR C ;REDUCE BLOCK COUNT F9D1 7E MOV A,M F9D2 23 INX H F9D3 12 STAX D F9D4 C2C7F9 JNZ WRLOOP ;WRITE NEXT 4 BYTES F9D7 21C2F9 LXI H,WRENTRY F9DA C3FBF9 JMP CBUSY READ F9DD CD33FA CALL PREP ;PREPARE FOR READ F9E0 DA22FA JC LEAVE ;ABORT OPERATION RDENTRY F9E3 3E80 MVI A,RDCMD F9E5 CDB1F9 CALL COMNDP RDLOOP F9E8 1A LDAX D ;READ 1ST BYTE F9E9 77 MOV M,A ;STORE 1ST BYTE F9EA 23 INX H F9EB 1A LDAX D ;READ 2ND BYTE F9EC 77 MOV M,A ;STORE 2ND BYTE F9ED 23 INX H F9EE 1A LDAX D ;READ 3RD BYTE F9EF 77 MOV M,A ;STORE 3RD BYTE F9F0 23 INX H F9F1 0D DCR C ;REDUCE BLOCK COUNT F9F2 1A LDAX D ;READ 4TH BYTE F9F3 77 MOV M,A ;STORE 4TH BYTE F9F4 23 INX H F9F5 C2E8F9 JNZ RDLOOP ;READ NEXT 4 BYTES CP/M MACRO ASSEM 2.0 #007 *** Disk Jockey Model B Firmware *** F9F8 21E3F9 LXI H,RDENTRY CBUSY F9FB E5 PUSH H ;SAVE RETURN F9FC 21FCFB LXI H,CSTAT ;WAIT FOR 1791 F9FF CD6CFB CALL BUSY ; TO FINISH COMMAND FA02 E65F ANI 137Q ;ERROR MASK FA04 CA21FA JZ LEAVE-1 ;NO ERROR FA07 FE10 CPI 20Q ;PREMATURE INTERUPT FA09 C220FA JNZ PLEAVE ;OTHER TYPE OF ERROR FA0C 3AE2FF LDA ECOUNT ;DECREMENT ERROR COUNT FA0F 3D DCR A ; BY ONE FA10 FA17FA JM STEST ;HARD INTERUPT ERROR FA13 32E2FF STA ECOUNT ;UPDATE COUNT FA16 C9 RET STEST FA17 3AE3FF LDA ECOUNT+1 ;DECREMENT ERROR FA1A 3D DCR A FA1B F294F9 JP ISSUE FA1E 3E10 MVI A,20Q PLEAVE FA20 37 STC ;ERROR FLAG FA21 E1 POP H LEAVE FA22 F5 PUSH PSW ;SAVE THE STATUS FA23 3AF6FF LDA DCREG ;CONTROL BITS FA26 EE04 XRI LOAD ;TOGGLE THE FA28 32FAFB STA DCMD ; HEAD LOAD BIT FA2B 3AEAFF LDA DRVSEL ;ENABLE ACCESS TO FA2E 32F9FB STA DREG ; THE DATA REGISTER FA31 F1 POP PSW ;RECOVER THE STATUS FA32 C9 RET PREP FA33 CDE3FA CALL HDLOAD ;LOAD THE HEAD FA36 D8 RC ;TEST FOR DRIVE READY FA37 3AFDFB LDA TRKREG ;GET OLD TRACK FA3A 3C INR A ;TEST FOR HEAD FA3B CC70F9 CZ HENTRY ; NOT CALIBRATED FA3E D8 RC ;SEEK ERROR? FA3F 21FDFB LXI H,TRKREG ;OLD TRACK FA42 3AF9FF LDA TRACK ;NEW TRACK FA45 BE CMP M ;TEST FOR HEAD MOTION FA46 23 INX H ;ADVANCE TO THE FA47 23 INX H ; DATA REGISTER FA48 77 MOV M,A ;SAVE NEW TRACK FA49 79 MOV A,C ;TURN OFF DATA REG FA4A 32F9FB STA DREG ; ACCESS CONTROL BIT FA4D CA6AFA JZ TVERFY ;TEST FOR SEEK FA50 AF XRA A ;FORCE A READ FA51 32E9FF STA HDFLAG ; HEADER OPERATION FA54 3AFAFB LDA DSTAT ;GET THE DOUBLE FA57 E608 ANI DSIDE ; SIDED FLAG FA59 32E8FF STA DSFLAG ;SAVE FOR STATUS FA5C 1F RAR ;SHIFT FOR CP/M MACRO ASSEM 2.0 #008 *** Disk Jockey Model B Firmware *** FA5D 1F RAR ; 3/6 MS STEP FA5E 1F RAR ; RATE CONSTANT FA5F C618 ADI SKCMD ;DO A FA61 210000 LXI H,0 ; SEEK FA64 CD62FB CALL CENTRY ; OPERATION FA67 DA8EFA JC SERROR ;SEEK ERROR? TVERFY FA6A 3AE9FF LDA HDFLAG ;GET THE FORCE FA6D B7 ORA A ; VERIFY HDR FLAG FA6E C2B9FA JNZ CHKSEC ;NO SEEK & HEAD OK FA71 0602 MVI B,2 ;VERIFY RETRY COUNT SLOOP FA73 3E1D MVI A,SVCMD ;DO A VERIFY FA75 CD5DFB CALL COMAND ; COMMAND FA78 E699 ANI 231Q ;ERROR BIT MASK FA7A 57 MOV D,A ;SAVE FA7B CA95FA JZ RDHDR ;NO ERROR FA7E 3AF6FF LDA DCREG ;DENISTY CONTROL FA81 EE01 XRI DENSITY ;FLIP THE DENSITY FA83 32F6FF STA DCREG ;UPDATE AND FA86 32FAFB STA DCMD ; CHANGE DENSITY FA89 05 DCR B ;DECREMENT RETRY FA8A C273FA JNZ SLOOP ; COUNT & TEST FA8D 7A MOV A,D SERROR FA8E 37 STC FA8F F5 PUSH PSW FA90 CD70F9 CALL HENTRY FA93 F1 POP PSW FA94 C9 RET RDHDR FA95 060A MVI B,12Q ;NUMBER OF RETRYS RHLOOP FA97 11FFFB LXI D,DATREG ;DATA REGISTER FA9A 21FAFF LXI H,TRACK+1 ;DATA POINTER FA9D 3EC4 MVI A,RACMD ;START READ HEADER COMMAND FA9F 32FCFB STA CMDREG RHL1 FAA2 1A LDAX D ;GET DISK DATA 0 FAA3 77 MOV M,A ;STORE IN MEM FAA4 2C INR L ;ADVANCE POINTER FAA5 C2A2FA JNZ RHL1 ;TEST END OF PAGE FAA8 21FCFB LXI H,CSTAT ;WAIT FOR 1791 FAAB CD6CFB CALL BUSY ; TO FINISH CMD FAAE B7 ORA A ;TEST FOR ERRORS FAAF CAB9FA JZ CHKSEC ;TRANSFER OK? FAB2 05 DCR B ;NO - TEST FOR FAB3 C297FA JNZ RHLOOP ; HARD ERROR FAB6 C38EFA JMP SERROR ;RECALIBRATE CHKSEC FAB9 3AFDFF LDA SECLEN ;GET THE SECTOR FABC 4F MOV C,A ; SIZE AND SETUP FABD 0600 MVI B,0 ; THE TABLE OFFSET FABF 21DFFA LXI H,STABLE ;SECTOR TABLE FAC2 09 DAD B ;SECTOR SIZE PNTR FAC3 3AF8FF LDA SECTOR ;GET THE SECTOR CP/M MACRO ASSEM 2.0 #009 *** Disk Jockey Model B Firmware *** FAC6 47 MOV B,A ; AND SAVE IN B FAC7 86 ADD M ;COMPARE W/TABLE FAC8 3E10 MVI A,20Q ;ERROR FLAG FACA D8 RC ;ERROR RETURN FACB 78 MOV A,B ;INITIALIZE 1791 FACC 32FEFB STA SECREG ; SECTOR REGISTER FACF 3E20 MVI A,40Q ;128 BYTE SECTOR FAD1 210505 LXI H,505H FAD4 22E2FF SHLD ECOUNT SZLOOP FAD7 0D DCR C ;REDUCE SIZE COUNT FAD8 47 MOV B,A ;SECTOR SIZE TO B FAD9 F8 RM ;RETURN ON MINUS FADA 17 RAL ;DOUBLE THE COUNT FADB B7 ORA A ;CLEAR THE CARRY FADC C3D7FA JMP SZLOOP STABLE FADF E5 DB 345Q ;26 SECTOR DISKETTES FAE0 E5 DB 345Q ;26 SECTOR DISKETTES FAE1 F0 DB 360Q ;15 SECTOR DISKETTES FAE2 F7 DB 367Q ;8 SECTOR DISKETTES HDLOAD FAE3 21EBFF LXI H,DISK ;NEW DRV PTR FAE6 4E MOV C,M ;SAVE NEW DRV IN C FAE7 23 INX H ;CURRENT DRV PTR FAE8 5E MOV E,M ;SAVE OLD DRV IN E FAE9 71 MOV M,C ;UPDATE CURRENT DRV FAEA 23 INX H ;HOME CMD FLAG FAEB 7B MOV A,E ;TEST FOR FAEC B9 CMP C ; DRIVE CHANGE FAED 7E MOV A,M ;HEAD LOAD MASK FAEE 3601 MVI M,HEAD ;UPDATE THE MASK FAF0 CA1BFB JZ HDCHK ;NO DRIVE CHANGE? FAF3 23 INX H ;ADDR OF DRIVE TABLE FAF4 E5 PUSH H ;SAVE TABLE ADDR FAF5 1600 MVI D,0 ;SET UP THE FAF7 42 MOV B,D ; OFFSET ADDRESS FAF8 19 DAD D ;CALCULATE THE FAF9 19 DAD D ; PARAMETER ADDR FAFA 3AF6FF LDA DCREG ;SAVE THE FAFD 77 MOV M,A ;DENSITY STATUS FAFE 23 INX H ;TRACK POINTER FAFF 11FDFB LXI D,TRKREG ;1791 TRK REG FB02 1A LDAX D ;GET CURRENT TRACK FB03 77 MOV M,A ;SAVE IN THE TABLE FB04 E1 POP H ;BEGINNING OF TABLE FB05 09 DAD B ;NEW DRIVE FB06 09 DAD B ; TABLE POINTER FB07 7E MOV A,M ;GET DENSITY STATUS FB08 32F6FF STA DCREG ;UPDATE DCREG FB0B 23 INX H ;GET THE OLD FB0C 7E MOV A,M ; TRACK NUMBER FB0D 12 STAX D ; AND UPDATE 1791 FB0E 3E7F MVI A,177Q ;DRIVE SELECT BITS DSROT CP/M MACRO ASSEM 2.0 #010 *** Disk Jockey Model B Firmware *** FB10 07 RLC ;ROTATE TO FB11 0D DCR C ; SELECT THE FB12 F210FB JP DSROT ; PROPER DRIVE FB15 E67F ANI 177Q ;SET THE RUN BIT FB17 32EAFF STA DRVSEL ;SAVE IN DRV REG FB1A AF XRA A ;FORCE A HEAD LOAD HDCHK FB1B 21FAFB LXI H,DSTAT ;TEST FOR FB1E A6 ANA M ; HEAD LOADED FB1F 32E9FF STA HDFLAG ;SAVE THE HEAD FB22 F5 PUSH PSW ; LOADED STATUS FB23 3AEAFF LDA DRVSEL ;GET CURRENT DRIVE FB26 4F MOV C,A ;SAVE FB27 3AF7FF LDA SIDE ;GET CURRENT SIDE FB2A 2F CMA ; AND MERGE FB2B A1 ANA C ; WITH DRIVE SELECT FB2C 32F9FB STA DREG ;SELECT DRIVE & SIDE FB2F EE40 XRI ACCESS ;TOGGLE ACCESS BIT FB31 4F MOV C,A ;SAVE FOR PREP ROUTINE FB32 3AF6FF LDA DCREG ;DEN & HEAD CNTL BITS FB35 47 MOV B,A ;SAVE FB36 3AF9FF LDA TRACK ;GET THE NEW TRACK FB39 D601 SUI 1 ;FORCE SINGLE FB3B 9F SBB A ; DENSITY FB3C 3D DCR A ; IF TRACK = 0 FB3D 2F CMA ;COMPLIMENT FB3E B0 ORA B ;MERGE W/CONTROL BITS FB3F 77 MOV M,A ;LOAD HEAD & SET DENSITY FB40 F1 POP PSW ;HEAD LOAD STATUS FB41 C24FFB JNZ RDYCHK ;CONDITIONALLY FB44 E5 PUSH H ; WAIT FOR HEAD FB45 2AE4FF LHLD TIMER ; LOAD TIME OUT TLOOP FB48 2B DCX H ;COUNT DOWN FB49 7C MOV A,H ; 40 MS FOR FB4A B5 ORA L ; HEAD LOAD FB4B C248FB JNZ TLOOP ; TIME OUT FB4E E1 POP H RDYCHK FB4F 7E MOV A,M ;TEST FOR FB50 E680 ANI READY ; DRIVE READY FB52 C0 RNZ UNLOAD FB53 3AF6FF LDA DCREG ;FORCE A FB56 F606 ORI ULOAD ; HEAD FB58 77 MOV M,A ; UNLOAD FB59 3E80 MVI A,READY ;SET DRIVE FB5B 37 STC ; NOT READY FB5C C9 RET ; ERROR FLAG COMAND FB5D 2AE4FF LHLD TIMER ;GET INDEX COUNT FB60 29 DAD H ; AND MULTIPLY FB61 29 DAD H ; BY FOUR CENTRY FB62 EB XCHG ;SAVE IN D-E PAIR CP/M MACRO ASSEM 2.0 #011 *** Disk Jockey Model B Firmware *** FB63 21FCFB LXI H,CSTAT ;ISSUE COMMAND FB66 77 MOV M,A ; TO THE 1791 NBUSY FB67 7E MOV A,M ;WAIT FB68 1F RAR ; FOR THE FB69 D267FB JNC NBUSY ; BUSY FLAG BUSY FB6C 7E MOV A,M ;TEST FOR FB6D 1F RAR ; DEVICE BUSY FB6E 7E MOV A,M ;RESTORE STATUS FB6F D0 RNC ;RETURN IF NOT BUSY FB70 C376FB JMP PATCH+3 ;JUMP AROUND PATCH PATCH FB73 C3E3FA JMP HDLOAD ;PATCH FOR OLD ATE FB76 1B DCX D ;TEST FOR FB77 7A MOV A,D ; TWO DISK FB78 B3 ORA E ; REVOLUTIONS FB79 C26CFB JNZ BUSY ;47 MACHINE CYCLES FB7C 5E MOV E,M ;GET ERROR CODE FB7D E5 PUSH H ;SAVE CMD ADDRESS FB7E 23 INX H ;TRACK REGISTER FB7F 56 MOV D,M ;SAVE PRESENT TRACK FB80 3AEAFF LDA DRVSEL ;CONTROL BITS FB83 EE80 XRI RSTBIT ;RESET THE 1791 FB85 32F9FB STA DREG ; CONTROLLER TO FB88 EEC0 XRI STBITS ; CLEAR THE FB8A E3 XTHL ; COMMAND BUSY FB8B 32F9FB STA DREG ; FAULT CONDITION FB8E 36D0 MVI M,CLRCMD ;FORCE INTERRUPT FB90 E3 XTHL ;RESTORE THE FB91 72 MOV M,D ; THE TRACK REG FB92 E1 POP H ;RESTORE THE STACK FB93 7B MOV A,E ;ERROR CODE TO A FB94 37 STC ; ERROR FLAG FB95 C9 RET MEASUR FB96 110000 LXI D,0 ;INITIALIZE COUNT FB99 21FAFB LXI H,DSTAT ;STATUS PORT FB9C 0E10 MVI C,INDEX ;INDEX BIT FLAG INDXLO FB9E 7E MOV A,M ;WAIT FOR FB9F A1 ANA C ; INDEX FBA0 CA9EFB JZ INDXLO ; PULSE HIGH INDXHI FBA3 7E MOV A,M ;WAIT FOR FBA4 A1 ANA C ; INDEX FBA5 C2A3FB JNZ INDXHI ; PULSE LOW INDXCT FBA8 13 INX D ;ADVANCE COUNT FBA9 E3 XTHL ;FOUR DUMMY FBAA E3 XTHL ; INSTRUCTIONS FBAB E3 XTHL ; TO LENGTHEN FBAC E3 XTHL ; THE DELAY FBAD 7E MOV A,M ;WAIT FOR CP/M MACRO ASSEM 2.0 #012 *** Disk Jockey Model B Firmware *** FBAE A1 ANA C ; THE INDEX FBAF CAA8FB JZ INDXCT ; TO GO HIGH FBB2 C9 RET ;98 MACHINE CYCLES DENFIX FBB3 79 MOV A,C ;TRIM THE FBB4 E601 ANI 1 ; EXCESS BITS FBB6 2F CMA ;COMPLIMENT AND FBB7 47 MOV B,A ; SAVE IN B FBB8 21EBFF LXI H,DISK ;NEW DISK PTR FBBB 5E MOV E,M ;GET DISK NO. FBBC 1600 MVI D,0 ;OFFSET ADDR FBBE 23 INX H ;CURRENT DISK PTR FBBF 7E MOV A,M ;MOVE TO ACC FBC0 AB XRA E ;CMPR OLD W/NEW FBC1 F5 PUSH PSW ;SAVE STATUS FBC2 23 INX H ;DISK TABLE FBC3 23 INX H ; ADDRESS FBC4 19 DAD D ;ADD THE FBC5 19 DAD D ; OFFSET FBC6 7E MOV A,M ;GET PARAMETERS FBC7 F601 ORI 1 ;MASK OFF DENSITY FBC9 A0 ANA B ;SET NEW DENSITY FBCA 77 MOV M,A ;UPDATE PARAMETERS FBCB F1 POP PSW ;TEST NEW=OLD? FBCC C0 RNZ FBCD 7E MOV A,M ;UPDATA CDISK FBCE 32F6FF STA DCREG ; ALSO FBD1 C9 RET TIMOUT FBD2 210000 LXI H,0 ;TIME-OUT DELAY TILOOP FBD5 2B DCX H ;DECREMENT COUNT FBD6 7C MOV A,H ;TEST FOR DELAY FBD7 B5 ORA L ; COUNT EQUAL ZERO FBD8 E3 XTHL ;LONG NOP FBD9 E3 XTHL ; INSTRUCTION FBDA C2D5FB JNZ TILOOP FBDD C9 RET FBDE E5 SBEGIN PUSH H FBDF 21E2FB LXI H,DSTALL FBE2 E9 DSTALL PCHL FBE3 E1 POP H FBE4 C9 RET SIDEFX FBE5 79 MOV A,C ;GET THE SIDE BIT FBE6 E601 ANI 1 ;TRIM THE EXCESS FBE8 17 RAL ;MOVE THE BIT FBE9 17 RAL ; TO THE SIDE FBEA 17 RAL ; SELECT BIT FBEB 17 RAL ; POSITION FBEC 32F7FF STA SIDE ;SAVE SIDE BIT FBEF C9 RET CP/M MACRO ASSEM 2.0 #013 *** Disk Jockey Model B Firmware *** PWRJMP FBF0 00 NOP ;POWER-ON FBF1 00 NOP ; JUMP FBF2 00 NOP ; SEQUENCE FBF3 00 NOP ; WITH NOP FBF4 00 NOP ; PADDING FBF5 C300F8 JMP DBOOT FBF8 DS 10Q ;I/O LOCATIONS FFC9 ORG RAM+3C9H FFC9 STACK DS 31Q FFE2 0000 ECOUNT DW 0 FFE4 0018 TIMER DW 1800H ;HEAD LOAD TIME OUT FFE6 00FF DMAADR DW RAM+300H ;DMA ADDRESS FFE8 08 DSFLAG DB 10Q FFE9 00 HDFLAG DB 0 ;READ HEADER FLAG FFEA 7E DRVSEL DB 176Q ;DRIVE SELECT CONSTANT FFEB 00 DISK DB 0 ;NEW DRIVE FFEC 08 CDISK DB 10Q ;CURRENT DISK FFED 00 TZFLAG DB 0 ;HOME CMD INDICATOR FFEE 09 DOPRAM DB 11Q ;DRIVE 0 PARAMETERS FFEF FF DOTRK DB 377Q ;DRIVE 0 TRACK NO FFF0 09 D1PRAM DB 11Q ;DRIVE 1 PARAMETERS FFF1 FF D1TRK DB 377Q ;DRIVE 1 TRACK NO FFF2 09 D2PRAM DB 11Q ;DRIVE 2 PARAMETERS FFF3 FF D2TRK DB 377Q ;DRIVE 2 TRACK NO FFF4 09 D3PRAM DB 11Q ;DRIVE 3 PARAMETERS FFF5 FF D3TRK DB 377Q ;DRIVE 3 TRACK NO FFF6 09 DCREG DB 11Q ;CURRENT PARAMETERS FFF7 00 SIDE DB 0 ;NEW SIDE FFF8 01 SECTOR DB 1 ;NEW SECTOR FFF9 00 TRACK DB 0 ;NEW TRACK FFFA 00 TRKNO DB 0 ;DISK FFFB 00 SIDENO DB 0 ; SECTOR FFFC 00 SECTNO DB 0 ; HEADER FFFD 00 SECLEN DB 0 ; DATA FFFE 00 CRCLO DB 0 ; BUFFER FFFF 00 CRCHI DB 0