CP/M MACRO ASSEM 2.0 #001 *** Cold Boot Loader for CP/M Ver. 2.2 *** ***************************************************************** * * * CP/M VERS 2.2 COLD START LOADER FOR DISK JOCKEY 2D (ALL REVS).* * * * WRITTEN BY BOBBY DALE GIFFORD. * * 11/21/79 * * * * THE COLD BOOT LOADER (SECTOR 1, TRACK 0) IS LOADED * * INTO THE RAM OF THE CONTROLLER BY THE COLD BOOT ROUTINE OF * * THE FIRMWARE. THE FIRST THING THE BOOT DOES IS TO LOAD INTO * * THE CONTROLLER RAM, A VERSION OF THE DISK JOCKEY 2D FIRMWARE. * * FROM THEN ON, ALL CALLS TO THE FIRMWARE WILL ACTUALLY BE * * DIRECTED TO THE DISK JOCKEY RAM. THE NEXT PROCESS IS TO LOAD * * IN A BOOT ROUTINE WHICH CAN LOAD IN ALL OF CP/M. THIS IS * * DONE BY DETERMINING THE SIZE OF THE SECTORS ON TRACK 1, AND * * USING THIS INFORMATION TO LOAD IN THE PROPER BOOT INTO 80H. * * * * THE FOLLOWING TABLES EXPLAIN THE ORDER OF SECTOR LOADING FOR * * EACH OF THE DIFFERENT SECTOR SIZES. AN ENTRY OF ------ * * REPRESENTS A WRAP BACK AROUND (NEGATIVE DMA ADJUSTMENT). * * * * ALL SECTOR SIZES: * * TRACK 0 SECTOR 1 E700 * * 0 8 3200H * * 0 10 3300H * * 0 12 3400H * * 0 14 3500H * * 0 16 3600H * * 0 18 2D80H * * 0 20 2E80H * * 0 22 2F80H * * 0 24 3080H * * 0 26 3180H * * 0 9 3280H * * 0 11 3380H * * 0 13 3480H * * 0 15 3580H * * 0 17 2D00H * * 0 19 2E00H * * 0 21 2F00H * * 0 23 3000H * * 0 25 3100H * * * * THE FOLLOWING DEPEND ON THE SECTOR SIZE, ALL SECTORS ARE FROM * * TRACK 1. * * * * 256 512 1024 * * SEC ADDRESS SEC ADDRESS SEC ADDRESS * * 1 3200H 1 3200H 1 3200H * * 3 3400H 3 3600H 3 3A00H * * 5 3600H 5 3A00H 5 4200H * * 7 3800H 7 3E00H ------------- * * 9 3A00H 9 4200H 2 3600H * * 11 3C00H 11 4600H 4 3E00H * * 13 3E00H ------------- 6 4600H * * 15 4000H 2 3400H * CP/M MACRO ASSEM 2.0 #002 *** Cold Boot Loader for CP/M Ver. 2.2 *** * 17 4200H 4 3800H * * 19 4400H 6 3C00H * * 21 4600H 8 4000H * * 23 4800H 10 4400H * * ----------- 12 4800H * * 2 3300H * * 4 3500H * * 6 3700H * * 8 3900H * * 10 3B00H * * 12 3D00H * * 14 3F00H * * 16 4100H * * 18 4300H * * 20 4500H * * 22 4700H * * 24 4900H * * * ***************************************************************** TITLE '*** Cold Boot Loader for CP/M Ver. 2.2 ***' ***************************************************************** * * * COLD BOOT LOADER COMMON TO ALL SECTOR SIZES. * * THIS SECTOR IS LOADED INTO MEMORY AT E700H IN A STANDARD * * CONFIGURATION. IT IS RESPONSIBLE FOR READING MOST OF TRACK 0 * * INTO MEMORY ON COLD BOOTS. * * * ***************************************************************** E000 = ORIGIN EQU 0E000H E02D = PUTDEN EQU ORIGIN+02DH ;SET DENSITY ROUTINE ON DISK JOCKEY 2D E012 = PUTDMA EQU ORIGIN+12H ;DISK JOCKEY 2D SET DMA ADDRESS ROUTINE E027 = GETSTAT EQU ORIGIN+27H ;DISK STATUS ROUTINE ON DISK JOCKEY 2D E00F = PUTSEC EQU ORIGIN+0FH ;DISK JOCKEY 2D SET SECTOR ROUTINE E00C = PUTTRK EQU ORIGIN+0CH ;DISK JOCKEY 2D SET TRACK ROUTINE E009 = PUTHOM EQU ORIGIN+9H ;DISK JOCKEY 2D TRACK 0 SEEK E015 = DOREAD EQU ORIGIN+15H ;DISK JOCKEY 2D READ ROUTINE E02A = BOTERR EQU ORIGIN+2AH ;DISK JOCKEY 2D FLASH ERROR LIGHT ROUTINE E000 ORG ORIGIN ;DISK JOCKEY 2D RAM 0018 = MSIZE EQU 24 ;MEMORY SIZE OF TARGET CP/M 1000 = BIAS EQU (MSIZE-20)*1024 ;MEMORY OFFSET FROM 20K SYSTEM 3D00 = CCP EQU 2D00H+BIAS ;CONSOLE COMMAND PROCESSOR 5300 = BIOS EQU CCP+1600H ;CBIOS ADDRESS 000A = RETRIES EQU 10 ;MAXIMUM # OF RETIRES 0700 # DIFF SET ORIGIN+700H-$ ;OFFSET TO BOOT LOADER ADDRESS E000 3180E7 LXI SP,STAC+DIFF E003 3E06 FIRMLOD MVI A,6 ;PREVIOUS SECTOR # E004 = NEWSEC EQU $-1 E005 3C INR A ;UPDATE SECTOR # E006 3C INR A CP/M MACRO ASSEM 2.0 #003 *** Cold Boot Loader for CP/M Ver. 2.2 *** E007 FE1B CPI 27 ;TEST IF ALL DONE E009 CA0042 JZ CCP+500H E00C DA11E7 JC NOWRAP+DIFF ;TEST IF WRAP AROUND E00F D613 SUI 19 E011 3204E7 NOWRAP STA NEWSEC+DIFF ;SAVE THE UPDATED SECTOR # E014 4F MOV C,A E015 CD0FE0 CALL PUTSEC ;SET UP THE SECTOR E018 210041 LXI H,CCP+400H ;PREVIOUS DMA ADDRESS E019 = NEWDMA EQU $-2 E01B 110001 LXI D,100H ;UPDATE DMA ADDRESS E01E 19 DAD D E01F 7C MOV A,H E020 FE46 CPI (CCP+980H)/100H E022 DA32E7 JC NOWRP+DIFF E025 C22EE7 JNZ WRP+DIFF E028 7D MOV A,L E029 FE80 CPI (CCP+980H) MOD 100H E02B DA32E7 JC NOWRP+DIFF E02E 1180F6 WRP LXI D,-980H E031 19 DAD D E032 2219E7 NOWRP SHLD NEWDMA+DIFF ;SAVE THE UPDATED DMA ADDRESS E035 44 MOV B,H E036 4D MOV C,L E037 CD12E0 CALL PUTDMA ;SET UP THE NEW DMA ADDRESS E03A 01000A LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS E03D C5 FREAD PUSH B E03E CD0CE0 CALL PUTTRK ;SET UP THE PROPER TRACK E041 CD15E0 CALL DOREAD ;READ THE SECTOR E044 C1 POP B E045 D203E7 JNC FIRMLOD+DIFF ;CONTINUE IF NO ERROR E048 05 DCR B E049 C23DE7 JNZ FREAD+DIFF ;KEEP TRYING IF ERROR E04C C32AE0 JMP BOTERR ;TO MANY ERRORS, FLASH THE LIGHT E04F DS 80H-($ MOD 80H) E080 = STAC EQU $ ***************************************************************** * * * THE FOLLOWING EQUATES RELATE TO THE THINKER TOYS 2D CONTROLLER* * IF THE CONTROLLER IS NON STANDARD (0E000H) ONLY THE ORIGIN * * EQUATE NEED BE CHANGED. THIS VERSION OF THE CBIOS WILL WORK * * WITH 2D CONTROLLER BOARDS REV 0, 1, 3, 3.1, 4. * * * ***************************************************************** E400 = DJRAM EQU ORIGIN+400H ;DISK JOCKEY 2D RAM ADDRESS E400 = DJBOOT EQU DJRAM ;DISK JOCKEY 2D BOOT ROUTINE E403 = DJCIN EQU DJRAM+3H ;DISK JOCKEY 2D CHARACTER INPUT ROUTINE E406 = DJCOUT EQU DJRAM+6H ;DISK JOCKEY 2D CHARACTER OUTPUT ROUTINE E409 = DJHOME EQU DJRAM+9H ;DISK JOCKEY 2D TRACK ZERO SEEK E40C = DJTRK EQU DJRAM+0CH ;DISK JOCKEY 2D TRACK SEEK ROUTINE E40F = DJSEC EQU DJRAM+0FH ;DISK JOCKEY 2D SET SECTOR ROUTINE E412 = DJDMA EQU DJRAM+012H ;DISK JOCKEY 2D SET DMA ADDRESS E415 = DJREAD EQU DJRAM+15H ;DISK JOCKEY 2D READ ROUTINE E418 = DJWRITE EQU DJRAM+18H ;DISK JOCKEY 2D WRITE ROUTINE 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 *** E424 = DJDMAST EQU DJRAM+24H ;DISK JOCKEY 2D DMA STATUS E427 = DJSTAT EQU DJRAM+27H ;DISK JOCKEY 2D STATUS ROUTINE E42A = DJERR EQU DJRAM+2AH ;DISK JOCKEY 2D ERROR, BLINK LED E42D = DJDEN EQU DJRAM+2DH ;DISK JOCKEY 2D SET DENSITY ROUTINE E421 = DJTSTAT EQU DJRAM+21H ;DISK JOCKEY 2D TERMINAL STATUS ROUTINE E430 = DJSIDE EQU DJRAM+30H ;DISK JOCKEY 2D SET SIDE ROUTINE ***************************************************************** * * * THE FOLLOWING THREE SECTORS OF CODE RESIDE AT 80H. THERE IS * * ONE SECTOR FOR EACH OF THE POSSIBLE SECTOR SIZES (256,512, * * 1024). EACH SECTOR IS RESPONSIBLE FOR PERFORMING A COLD BOOT * * FOR THE SPECIFIED SECTOR SIZE. * * * ***************************************************************** 2000 # DIFF SET 80H-$ E080 310001 LXI SP,CSTK256+DIFF ;SET UP STACK AT END OF THIS SECTOR E083 010118 LXI B,24*100H+1 ;B = SECTOR COUNT, C = SECTOR # E086 C5 CLOD256 PUSH B ;SAVE SECTOR AND COUNT E087 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ E08A 210040 LXI H,CCP+300H ;GET DMA ADDRESS (SELF MODIFYING) E08B = CDMA256 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS E08D 110002 LXI D,200H ;OFFSET TO NEW DMA ADDRESS E090 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS E091 228B00 SHLD CDMA256+DIFF ;SAVE NEW DMA ADDRESS E094 44 MOV B,H ;PUT DMA ADDRESS INTO BC E095 4D MOV C,L E096 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS E099 CDB600 CALL CRD256+DIFF ;ATTEMPT A READ E09C C1 POP B ;RECOVER SECTOR NUMBER AND COUNT ; B = COUNT, C = NUMBER E09D 05 DCR B ;UPDATE SECTOR COUNT E09E CA0053 JZ BIOS ;ALL DONE ? E0A1 3E02 MVI A,2 ;SECTOR UPDATE E0A3 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR E0A4 4F MOV C,A ;PUT NEW SECTOR BACK INTO C E0A5 FE19 CPI 25 ;PAST THE END OF THE TRACK ? E0A7 DA8600 JC CLOD256+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK E0AA D617 SUI 23 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT E0AC 4F MOV C,A ;PUT NEW SECTOR IN C E0AD 210041 LXI H,CCP+400H ;NEGATIVE DMA ADJUSTMENT E0B0 228B00 SHLD CDMA256+DIFF ;SAVE THE NEW DMA ADDRESS E0B3 C38600 JMP CLOD256+DIFF ;CONTINUE READING ***************************************************************** * * * CRD256 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * * * ***************************************************************** E0B6 01010A CRD256 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS E0B9 C5 CR256 PUSH B ;SAVE ERROR COUNT E0BA CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK CP/M MACRO ASSEM 2.0 #005 *** Cold Boot Loader for CP/M Ver. 2.2 *** E0BD CD15E4 CALL DJREAD ;ATTEMPT THE READ E0C0 C1 POP B ;RESTORE THE ERROR COUNT E0C1 D0 RNC ;RETURN IF NO ERROR E0C2 05 DCR B ;UPDATE ERROR COUNT E0C3 C2B900 JNZ CR256+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS E0C6 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER E0C9 DS 80H-($ MOD 80H) E100 = CSTK256 EQU $ ***************************************************************** * * * THE NEXT LOADS CP/M FROM A 512 BYTE SECTOR DISKETTE. * * * ***************************************************************** 1F80 # DIFF SET 80H-$ E100 310001 LXI SP,CSTK512+DIFF ;SET UP STACK AT END OF THIS SECTOR E103 01010C LXI B,12*100H+1 ;B = SECTOR COUNT, C = SECTOR # E106 C5 CLOD512 PUSH B ;SAVE SECTOR AND COUNT E107 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ E10A 21003E LXI H,CCP+100H ;GET DMA ADDRESS (SELF MODIFYING) E10B = CDMA512 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS E10D 110004 LXI D,400H ;OFFSET TO NEW DMA ADDRESS E110 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS E111 228B00 SHLD CDMA512+DIFF ;SAVE NEW DMA ADDRESS E114 44 MOV B,H ;PUT DMA ADDRESS INTO BC E115 4D MOV C,L E116 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS E119 CDB600 CALL CRD512+DIFF ;ATTEMPT A READ E11C C1 POP B ;RECOVER SECTOR NUMBER AND COUNT ; B = COUNT, C = NUMBER E11D 05 DCR B ;UPDATE SECTOR COUNT E11E CA0053 JZ BIOS ;ALL DONE ? E121 3E02 MVI A,2 ;SECTOR UPDATE E123 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR E124 4F MOV C,A ;PUT NEW SECTOR BACK INTO C E125 FE0D CPI 13 ;PAST THE END OF THE TRACK ? E127 DA8600 JC CLOD512+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK E12A D60B SUI 11 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT E12C 4F MOV C,A ;PUT NEW SECTOR IN C E12D 210040 LXI H,CCP+300H ;NEGATIVE DMA ADJUSTMENT E130 228B00 SHLD CDMA512+DIFF ;SAVE THE NEW DMA ADDRESS E133 C38600 JMP CLOD512+DIFF ;CONTINUE READING ***************************************************************** * * * CRD512 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * * * ***************************************************************** E136 01010A CRD512 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS E139 C5 CR512 PUSH B ;SAVE ERROR COUNT E13A CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK CP/M MACRO ASSEM 2.0 #006 *** Cold Boot Loader for CP/M Ver. 2.2 *** E13D CD15E4 CALL DJREAD ;ATTEMPT THE READ E140 C1 POP B ;RESTORE THE ERROR COUNT E141 D0 RNC ;RETURN IF NO ERROR E142 05 DCR B ;UPDATE ERROR COUNT E143 C2B900 JNZ CR512+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS E146 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER E149 DS 80H-($ MOD 80H) E180 = CSTK512 EQU $ ***************************************************************** * * * THE NEXT SECTOR LOADS CP/M FROM A 1024 BYTE SECTOR DISKETTE. * * * ***************************************************************** 1F00 # DIFF SET 80H-$ E180 310001 LXI SP,CSTK124+DIFF ;SET UP STACK AT END OF THIS SECTOR E183 010106 LXI B,6*100H+1 ;B = SECTOR COUNT, C = SECTOR # E186 C5 CLOD124 PUSH B ;SAVE SECTOR AND COUNT E187 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ E18A 21003A LXI H,CCP-300H ;GET DMA ADDRESS (SELF MODIFYING) E18B = CDMA124 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS E18D 110008 LXI D,800H ;OFFSET TO NEW DMA ADDRESS E190 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS E191 228B00 SHLD CDMA124+DIFF ;SAVE NEW DMA ADDRESS E194 44 MOV B,H ;PUT DMA ADDRESS INTO BC E195 4D MOV C,L E196 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS E199 CDB600 CALL CRD124+DIFF ;ATTEMPT A READ E19C C1 POP B ;RECOVER SECTOR NUMBER AND COUNT ; B = COUNT, C = NUMBER E19D 05 DCR B ;UPDATE SECTOR COUNT E19E CA0053 JZ BIOS ;ALL DONE ? E1A1 3E02 MVI A,2 ;SECTOR UPDATE E1A3 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR E1A4 4F MOV C,A ;PUT NEW SECTOR BACK INTO C E1A5 FE07 CPI 7 ;PAST THE END OF THE TRACK ? E1A7 DA8600 JC CLOD124+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK E1AA D605 SUI 5 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT E1AC 4F MOV C,A ;PUT NEW SECTOR IN C E1AD 21003E LXI H,CCP+100H ;NEGATIVE DMA ADJUSTMENT E1B0 228B00 SHLD CDMA124+DIFF ;SAVE THE NEW DMA ADDRESS E1B3 C38600 JMP CLOD124+DIFF ;CONTINUE READING ***************************************************************** * * * RD124 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * * * ***************************************************************** E1B6 01010A CRD124 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS E1B9 C5 CR124 PUSH B ;SAVE ERROR COUNT E1BA CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK CP/M MACRO ASSEM 2.0 #007 *** Cold Boot Loader for CP/M Ver. 2.2 *** E1BD CD15E4 CALL DJREAD ;ATTEMPT THE READ E1C0 C1 POP B ;RESTORE THE ERROR COUNT E1C1 D0 RNC ;RETURN IF NO ERROR E1C2 05 DCR B ;UPDATE ERROR COUNT E1C3 C2B900 JNZ CR124+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS E1C6 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER E1C9 DS 80H-($ MOD 80H) E200 = CSTK124 EQU $ ***************************************************************** * * * THE NEXT THREE SECTORS OF CODE ALSO RESIDE AT 80H. THERE IS * * ONE SECTOR FOR EACH OF THE POSSIBLE SECTOR SIZES (256,512, * * 1024). EACH SECTOR IS RESPONSIBLE FOR PERFORMING A WARM BOOT * * FOR THE SPECIFIED SECTOR SIZE. * * * * THE FOLLOWING TABLE SHOWS HOW SECTORS ARE READ IN, SKEWING * * OF THE SECTORS IS NECESSARY BECAUSE SEQUENTIAL SECTORS CAN * * NOT BE READ WITHOUT WAITING ONE COMPLETE REVOLUTION BETWEEN * * EACH ONE. ENTRIES OF ---- REPRESENT A WRAP AROUND (NEGATIVE * * DMA ADJUSTMENT). AN ENTRY FLAGGED WITH ** REPRESENTS ONLY A * * PARTIAL LOAD FROM THAT SECTOR. * * * * 256 512 1024 * * SEC ADDRESS SEC ADDRESS SEC ADDRESS * * 1 3200H 1 3200H 1 3200H * * 3 3400H 3 3600H 3 3A00H * * 5 3600H 5 3A00H ** 5 4200H * * 7 3800H 7 3E00H ------------- * * 9 3A00H ** 9 4200H 2 3600H * * 11 3C00H ------------- 4 3E00H * * 13 3E00H 2 3400H * * 15 4000H 4 3800H * * 17 4200H 6 3C00H * * ----------- 8 4000H * * 2 3300H * * 4 3500H * * 6 3700H * * 8 3900H * * 10 3B00H * * 12 3D00H * * 14 3F00H * * 16 4100H * * * ***************************************************************** 1E80 # DIFF SET 80H-$ E200 310001 LXI SP,WSTK256+DIFF ;SET UP STACK AT END OF THIS SECTOR E203 010111 LXI B,17*100H+1 ;B = SECTOR COUNT, C = SECTOR # E206 C5 WLOD256 PUSH B ;SAVE SECTOR AND COUNT E207 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ E20A 210040 LXI H,CCP+300H ;GET DMA ADDRESS (SELF MODIFYING) E20B = WDMA256 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS 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 *** E210 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS E211 228B00 SHLD WDMA256+DIFF ;SAVE NEW DMA ADDRESS E214 44 MOV B,H ;PUT DMA ADDRESS INTO BC E215 4D MOV C,L E216 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS E219 CDB600 CALL WRD256+DIFF ;ATTEMPT A READ E21C C1 POP B ;RECOVER SECTOR NUMBER AND COUNT ; B = COUNT, C = NUMBER E21D 05 DCR B ;UPDATE THE SECTOR COUNT E21E CA0353 JZ BIOS+3 ;ALL DONE ? E221 3E02 MVI A,2 ;SECTOR UPDATE E223 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR E224 4F MOV C,A ;PUT NEW SECTOR BACK INTO C E225 FE13 CPI 19 ;PAST THE END OF THE TRACK ? E227 DA8600 JC WLOD256+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK E22A D611 SUI 17 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT E22C 4F MOV C,A ;PUT NEW SECTOR IN C E22D 210041 LXI H,CCP+400H ;NEGATIVE DMA ADJUSTMENT E230 228B00 SHLD WDMA256+DIFF ;SAVE THE NEW DMA ADDRESS E233 C38600 JMP WLOD256+DIFF ;CONTINUE READING ***************************************************************** * * * WRD256 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * * * ***************************************************************** E236 01010A WRD256 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS E239 C5 WR256 PUSH B ;SAVE ERROR COUNT E23A CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK E23D CD15E4 CALL DJREAD ;ATTEMPT THE READ E240 C1 POP B ;RESTORE THE ERROR COUNT E241 D0 RNC ;RETURN IF NO ERROR E242 05 DCR B ;UPDATE ERROR COUNT E243 C2B900 JNZ WR256+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS E246 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER E249 DS 80H-($ MOD 80H) E280 = WSTK256 EQU $ ***************************************************************** * * * DISK JOCKEY 2D CP/M FROM A 512 BYTE SECTOR DISKETTE. * * * ***************************************************************** 1E00 # DIFF SET 80H-$ E280 310001 LXI SP,WSTK512+DIFF ;SET UP STACK AT END OF THIS SECTOR E283 010901 LXI B,1*100H+9 ;B = SECTOR COUNT, C = SECTOR # E286 CDA800 CALL WLOD512+DIFF ;LOAD SECTOR 9 INTO CCP E289 210052 LXI H,CCP+1500H ;DESTINATION OF MOVE E28C 110042 LXI D,CCP+500H ;SOURCE OF MOVE E28F 0E00 MVI C,0 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 *** E292 77 MOV M,A ;MOVE IT E293 23 INX H ;BUMP DESTINATION E294 13 INX D ;BUMP SOURCE E295 0D DCR C ;ALL DONE WITH THIS PAGE ? E296 C29100 JNZ MOV512+DIFF E299 210040 LXI H,CCP+300H ;INITIAL DMA ADDRESS E29C 22AD00 SHLD WDMA512+DIFF E29F 010208 LXI B,8*100H+2 ;B = SECTOR COUNT, C = SECTOR # E2A2 CDA800 CALL WLOD512+DIFF E2A5 C30353 JMP BIOS+3 E2A8 C5 WLOD512 PUSH B ;SAVE SECTOR AND COUNT E2A9 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ E2AC 21003E LXI H,CCP+100H ;GET DMA ADDRESS (SELF MODIFYING) E2AD = WDMA512 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS E2AF 110004 LXI D,400H ;OFFSET TO NEW DMA ADDRESS E2B2 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS E2B3 22AD00 SHLD WDMA512+DIFF ;SAVE NEW DMA ADDRESS E2B6 44 MOV B,H ;PUT DMA ADDRESS INTO BC E2B7 4D MOV C,L E2B8 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS E2BB CDD600 CALL WRD512+DIFF ;ATTEMPT A READ E2BE C1 POP B ;RECOVER SECTOR NUMBER AND COUNT ; B = COUNT, C = NUMBER E2BF 05 DCR B ;UPDATE SECTOR COUNT E2C0 C8 RZ ;ALL DONE ? E2C1 3E02 MVI A,2 ;SECTOR UPDATE E2C3 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR E2C4 4F MOV C,A ;PUT NEW SECTOR BACK INTO C E2C5 FE0A CPI 10 ;PAST THE END OF THE TRACK ? E2C7 DAA800 JC WLOD512+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK E2CA D609 SUI 9 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT E2CC 4F MOV C,A ;PUT NEW SECTOR IN C E2CD 21003E LXI H,CCP+100H ;NEGATIVE DMA ADJUSTMENT E2D0 22AD00 SHLD WDMA512+DIFF ;SAVE THE NEW DMA ADDRESS E2D3 C3A800 JMP WLOD512+DIFF ;CONTINUE READING ***************************************************************** * * * WRD512 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * * * ***************************************************************** E2D6 01010A WRD512 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS E2D9 C5 WR512 PUSH B ;SAVE ERROR COUNT E2DA CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK E2DD CD15E4 CALL DJREAD ;ATTEMPT THE READ E2E0 C1 POP B ;RESTORE THE ERROR COUNT E2E1 D0 RNC ;RETURN IF NO ERROR E2E2 05 DCR B ;UPDATE ERROR COUNT E2E3 C2D900 JNZ WR512+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS E2E6 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER E2E9 DS 80H-($ MOD 80H) E300 = WSTK512 EQU $ CP/M MACRO ASSEM 2.0 #010 *** Cold Boot Loader for CP/M Ver. 2.2 *** ***************************************************************** * * * THE NEXT SECTOR LOADS CP/M FROM A 1024 BYTE SECTOR DISKETTE. * * * ***************************************************************** 1D80 # DIFF SET 80H-$ E300 310001 LXI SP,WSTK124+DIFF ;SET UP STACK AT END OF THIS SECTOR E303 010501 LXI B,1*100H+5 ;B = SECTOR COUNT, C = SECTOR # E306 CDA800 CALL WLOD124+DIFF ;LOAD SECTOR 6 INTO CCP E309 210052 LXI H,CCP+1500H ;DESTINATION OF MOVE E30C 110042 LXI D,CCP+500H ;SOURCE OF MOVE E30F 0E00 MVI C,0 E311 1A MOV124 LDAX D ;GET A BYTE OF SOURCE E312 77 MOV M,A ;MOVE IT E313 23 INX H ;BUMP DESTINATION E314 13 INX D ;BUMP SOURCE E315 0D DCR C ;ALL DONE WITH THIS PAGE ? E316 C29100 JNZ MOV124+DIFF E319 21003E LXI H,CCP+100H ;INITIAL DMA ADDRESS E31C 22AD00 SHLD WDMA124+DIFF E31F 010204 LXI B,4*100H+2 ;B = SECTOR COUNT, C = SECTOR # E322 CDA800 CALL WLOD124+DIFF E325 C30353 JMP BIOS+3 E328 C5 WLOD124 PUSH B ;SAVE SECTOR AND COUNT E329 CD0FE4 CALL DJSEC ;SET THE NEXT SECTOR TO READ E32C 21003A LXI H,CCP-300H ;GET DMA ADDRESS (SELF MODIFYING) E32D = WDMA124 EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS E32F 110008 LXI D,800H ;OFFSET TO NEW DMA ADDRESS E332 19 DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS E333 22AD00 SHLD WDMA124+DIFF ;SAVE NEW DMA ADDRESS E336 44 MOV B,H ;PUT DMA ADDRESS INTO BC E337 4D MOV C,L E338 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS E33B CDD600 CALL WRD124+DIFF ;ATTEMPT A READ E33E C1 POP B ;RECOVER SECTOR NUMBER AND COUNT ; B = COUNT, C = NUMBER E33F 05 DCR B ;UPDATE SECTOR COUNT E340 C8 RZ ;ALL DONE ? E341 3E02 MVI A,2 ;SECTOR UPDATE E343 81 ADD C ;ADD IN THE SECTOR SKEW FACTOR E344 4F MOV C,A ;PUT NEW SECTOR BACK INTO C E345 FE06 CPI 6 ;PAST THE END OF THE TRACK ? E347 DAA800 JC WLOD124+DIFF ;TAKE JUMP IF NOT PAST END OF TRACK E34A D605 SUI 5 ;PERFORM A NEGATIVE SECTOR ADJUSTMENT E34C 4F MOV C,A ;PUT NEW SECTOR IN C E34D 21003A LXI H,CCP-300H ;NEGATIVE DMA ADJUSTMENT E350 22AD00 SHLD WDMA124+DIFF ;SAVE THE NEW DMA ADDRESS E353 C3A800 JMP WLOD124+DIFF ;CONTINUE READING ***************************************************************** * * * WR124 DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * * * CP/M MACRO ASSEM 2.0 #011 *** Cold Boot Loader for CP/M Ver. 2.2 *** ***************************************************************** E356 01010A WRD124 LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS E359 C5 WR124 PUSH B ;SAVE ERROR COUNT E35A CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK E35D CD15E4 CALL DJREAD ;ATTEMPT THE READ E360 C1 POP B ;RESTORE THE ERROR COUNT E361 D0 RNC ;RETURN IF NO ERROR E362 05 DCR B ;UPDATE ERROR COUNT E363 C2D900 JNZ WR124+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS E366 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER E369 DS 80H-($ MOD 80H) E380 = WSTK124 EQU $ ***************************************************************** * * * THE NEXT SECTOR OF CODE RESIDES AT CCP+500H. IT'S TASK IS TO * * MOVE THE FIRMWARE CODE INTO THE DISK JOCKEY RAM, THEN * * LOADING A SECTOR INTO 80H WHICH WILL LOAD THE REST OF CP/M. * * THE SECTOR LOADED AT 80H IS DEPENDENT ON THE SECTOR SIZE * * OF THE DISKETTE BEING BOOTED FROM. * * * ***************************************************************** 5E80 # DIFF SET CCP+500H-$ ;USED TO RELOCATE THIS SECTOR OF CODE E380 C30642 JMP DOCOLD+DIFF ;JUMP TO COLD BOOT PORTION E383 C32442 JMP DOWARM+DIFF ;JUMP TO WARM BOOT PORTION E386 318042 DOCOLD LXI SP,STK+DIFF ;SET UP INITIAL STACK AT END OF THIS SECTOR E389 2100E4 LXI H,DJRAM ;DESTINATION POINTER E38C 118042 LXI D,STK+DIFF ;SOURCE POINTER E38F 010003 LXI B,300H ;LENGTH OF TRANSFER E392 1A MLOOP LDAX D ;GET ONE BYTE OF SOURCE E393 77 MOV M,A ;PUT AT DESTINATION E394 23 INX H ;BUMP DESTINATION E395 13 INX D ;BUMP SOURCE E396 0B DCX B ;UPDATE COUNT OF BYTES TO MOVE E397 78 MOV A,B ;TEST IF ALL DONE E398 B1 ORA C E399 C21242 JNZ MLOOP+DIFF ;CONTINUE MOVING NEW FIRMWARE E39C CD00E4 CALL DJBOOT ;INITIALIZE THE NEW FIRMWARE E39F 3E01 MVI A,1 E3A1 324642 STA BOTBIAS+DIFF ;SET UP FOR PROPER SECTOR SELECT E3A4 318042 DOWARM LXI SP,STK+DIFF E3A7 0E01 MVI C,1 ;SET THE DENSITY TO DOUBLE E3A9 CD2DE4 CALL DJDEN E3AC 0E01 MVI C,1 ;SET UP TO READ SECTOR 1 ON TRACK 1 E3AE 79 MOV A,C E3AF 326442 STA TRKNUM+DIFF ;SET TRACK E3B2 CD0FE4 CALL DJSEC ;SET SECTOR E3B5 018042 LXI B,STK+DIFF ;SET THE DMA ADDRESS E3B8 CD12E4 CALL DJDMA CP/M MACRO ASSEM 2.0 #012 *** Cold Boot Loader for CP/M Ver. 2.2 *** E3BB CD6342 CALL REED+DIFF ;READ THE SECTOR INTO MEMORY AT ; END OF THIS SECTOR E3BE CD27E4 CALL DJSTAT ;DETERMINE THE SECTOR SIZE E3C1 E60C ANI 0CH ;STRIP OFF UNWANTED BITS E3C3 1F RAR ;FORM THE DESIRED SECTOR FOR COLD BOOT E3C4 1F RAR ; BASED ON THE LENGTH OF THE E3C5 C604 ADI 4 ; SECTORS ON THIS DISKETTE E3C6 = BOTBIAS EQU $-1 E3C7 4F MOV C,A ;PREPARE TO READ THE COLD BOOT E3C8 CD0FE4 CALL DJSEC ;SET UP THE SECTOR E3CB AF XRA A ;TRACK 0 E3CC 326442 STA TRKNUM+DIFF E3CF 018000 LXI B,80H ;COLD BOOT LOADS AT 80H E3D2 C5 PUSH B ;USED AS JUMP ADDRESS TO COLD BOOT-- E3D3 CD12E4 CALL DJDMA ; | E3D6 0E00 MVI C,0 ;DENSITY ON TRACK 0 IS SINGLE | E3D8 CD2DE4 CALL DJDEN ; | E3DB CD6342 CALL REED+DIFF ;READ IN THE COLD BOOT | E3DE 0E01 MVI C,1 ;SET THE DENSITY BACK TO DOUBLE | E3E0 C32DE4 JMP DJDEN ; | ;GO TO THE COLD BOOT <-------------- ***************************************************************** * * * REED DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA * * ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. * * * ***************************************************************** E3E3 01000A REED LXI B,RETRIES*100H+0 ;MAXIMUM # OF ATTEMPTS E3E4 = TRKNUM EQU $-2 ;STORAGE FOR TRACK NUMBER E3E6 C5 REED1 PUSH B ;SAVE ERROR COUNT E3E7 CD0CE4 CALL DJTRK ;INITIALIZE THE TRACK E3EA CD15E4 CALL DJREAD ;ATTEMPT THE READ E3ED C1 POP B ;RESTORE THE ERROR COUNT E3EE D0 RNC ;RETURN IF NO ERROR E3EF 05 DCR B ;UPDATE ERROR COUNT E3F0 C26642 JNZ REED1+DIFF ;TRY AGAIN IF NOT TO MANY ERRORS E3F3 C32AE4 JMP DJERR ;GO AND FLASH THE LIGHT ON CONTROLLER E3F6 DS 80H-($ MOD 80H) E400 = STK EQU $ ***************************************************************** * * * DISK JOCKEY 2D FIRMWARE REVISION 3.1 AND 4.0 * * BY GEORGE MORROW * * * * THE FOLLOWING FIRMWARE IS LOADED INTO MEMORY AND THEN MOVED * * INTO THE CONTROLLER RAM. * * * ***************************************************************** E000 = ROM EQU ORIGIN E400 = RAM EQU ORIGIN+400H CP/M MACRO ASSEM 2.0 #013 *** Cold Boot Loader for CP/M Ver. 2.2 *** E3F8 = IO EQU ROM+3F8H E3F8 = UDATA EQU IO E3F9 = DCMD EQU IO+1 E3F9 = DSTAT EQU DCMD E3FA = DREG EQU IO+2 E3FA = USTAT EQU DREG E3FC = CMDREG EQU IO+4 E3FC = CSTAT EQU CMDREG E3FD = TRKREG EQU IO+5 E3FE = SECREG EQU IO+6 E3FF = DATREG EQU IO+7 * * 0080 = RCMD EQU 200Q 00A0 = WCMD EQU 240Q 0004 = HEAD EQU 4 0010 = LOAD EQU 20Q 0001 = DENSTY EQU 1 0018 = ULOAD EQU 30Q 0004 = RSTBIT EQU 4 0002 = ACCESS EQU 2 0020 = READY EQU 40Q 0010 = INDEX EQU 20Q 00C4 = RACMD EQU 304Q 00D0 = CLRCMD EQU 320Q 001D = SVCMD EQU 35Q 0018 = SKCMD EQU 30Q 0009 = HCMD EQU 11Q 0004 = ISTAT EQU 4 0008 = OSTAT EQU 10Q 0008 = DSIDE EQU 10Q 0004 = TZERO EQU 4 0003 = MDINT EQU 3 001E = LIGHT EQU 36Q 003E = NOLITE EQU 76Q * * E400 C333E4 DBOOT JMP BOOT E403 C3A1E4 TERMIN JMP CIN E406 C392E4 TRMOUT JMP COUT E409 C311E5 TKZERO JMP HOME E40C C345E5 TRKSET JMP SEEK E40F C338E5 SETSEC JMP SECSET E412 C3F8E4 SETDMA JMP DMA E415 C397E5 DREAD JMP READ E418 C376E5 DWRITE JMP WRITE E41B C3EDE4 SELDRV JMP DRIVE E41E C3B0E4 TPANIC JMP CPAN E421 C3BBE4 TSTAT JMP TMSTAT E424 C3E5E4 DMAST JMP DMSTAT E427 C3C1E4 STATUS JMP DISKST E42A C32AE0 DSKERR JMP ROM+52Q E42D C3CAE7 SETDEN JMP DENFIX E430 C392E6 SETSID JMP SIDEFX * * CP/M MACRO ASSEM 2.0 #014 *** Cold Boot Loader for CP/M Ver. 2.2 *** E433 3AF4E3 BOOT LDA IO-4 ;TEST FOR MODEL A OR B E436 FEC9 CPI (RET) E438 CA4CE4 JZ MODELA E43B 1100E0 LXI D,ORIGIN E43E 2100E4 LXI H,RAM E441 0E33 MVI C,BOOT-DBOOT ;COPY PROM JUMP TABLE INTO RAM E443 1A MODELM LDAX D E444 77 MOV M,A E445 13 INX D E446 23 INX H E447 0D DCR C E448 C243E4 JNZ MODELM E44B C9 RET E44C 0E00 MODELA MVI C,0 ;COPY LAST PAGE OF RAM E44E CD43E4 CALL MODELM E451 2A07E0 LHLD ROM+7 ;FIND THE 2ND E454 23 INX H ; BYTE OF INPUT ROUTINE E455 110400 LXI D,4 ;OFFSET E458 7E MOV A,M ;GET ADDR OF USTAT E459 21EAE7 LXI H,SDSEL+1 ;I/O ROUTINES E45C 77 MOV M,A ;STORE USTAT ADDR E45D 19 DAD D ;INCREMENT MEM ADDR E45E 77 MOV M,A ;STORE USTAT ADDR E45F 19 DAD D ;INCREMENT MEM ADDR E460 EE03 XRI 3 ;SWITCH THE ADDR E462 77 MOV M,A ;STORE DSTAT ADDR E463 19 DAD D ;INCREMENT MEM ADDR E464 77 MOV M,A ;STORE DATAT ADDR E465 19 DAD D ;INCREMENT MEM ADDR E466 77 MOV M,A ;STORE DSTAT ADDR DSETUP E467 3E03 MVI A,MDINT ;INITIALIZE 1791 E469 CDF1E7 CALL SCBITS ; CONTROL BITS E46C 3ED0 MVI A,CLRCMD ;1791 RESET E46E 32FCE3 STA CMDREG ; COMMAND LDHEAD E471 AF XRA A ;LOAD THE HEAD E472 CD36E7 CALL HDCHK ; AND TEST FOR E475 D283E4 JNC DOOROK ; DRIVE READY E478 3E1E MVI A,LIGHT ;TURN ON THE E47A 32EAE6 STA DRVSEL ; ERROR LED E47D CD9DE6 CALL TIMOUT ;TIME OUT TO E480 C371E4 JMP LDHEAD ; CLOSE DRIVE DOOR DOOROK E483 3E3E MVI A,NOLITE ;TURN OFF THE E485 32EAE6 STA DRVSEL ; ERROR LED E488 3603 MVI M,MDINT ;OPEN DATA REG E48A CDADE7 CALL MEASUR ;HEAD LOAD TIME E48D EB XCHG ; NEW TIMER VALUE E48E 22E5E6 SHLD TIMER E491 C9 RET * * COUT E492 CDEDE7 CALL LUSTAT ;GET UART STATUS E495 E608 ANI OSTAT ;OUTPUT READY BIT CP/M MACRO ASSEM 2.0 #015 *** Cold Boot Loader for CP/M Ver. 2.2 *** E497 C292E4 JNZ COUT ;TEST OUTPUT READY E49A 79 MOV A,C ;CHARACTER DATA E49B 2F CMA E49C 32F8E3 STA UDATA ;SEND TO UART E49F 2F CMA E4A0 C9 RET * * CIN E4A1 CDEDE7 CALL LUSTAT ;GET UART STATUS E4A4 E604 ANI ISTAT ;INPUT READY BIT E4A6 C2A1E4 JNZ CIN ;TEST INPUT READY E4A9 3AF8E3 LDA UDATA ;GET THE CHARACTER E4AC 2F CMA E4AD E67F ANI 177Q E4AF C9 RET * * CPAN E4B0 CDEDE7 CALL LUSTAT ;GET UART STATUS E4B3 E604 ANI ISTAT ;INPUT READY BIT E4B5 C0 RNZ ;TEST FOR CHARACTER E4B6 CDA1E4 CALL CIN ;GET CHARACTER E4B9 B9 CMP C ;TEST FOR PANIC E4BA C9 RET * * TMSTAT E4BB CDEDE7 CALL LUSTAT ;GET UART STATUS E4BE E604 ANI ISTAT ;INPUT READY BIT E4C0 C9 RET * * DISKST E4C1 3AFEE3 LDA SECREG ;GET CURRENT E4C4 47 MOV B,A ; SECTOR NO IN B E4C5 3AFDE3 LDA TRKREG ;GET CURRENT E4C8 4F MOV C,A ; TRACK NO IN C E4C9 3AF6E6 LDA DCREG ;GET CURRENT E4CC 2F CMA ; DENSITY IN E4CD E601 ANI 1 ; THE MSB E4CF 0F RRC ;POSITION E4D0 57 MOV D,A ;SAVE IN D E4D1 3AF7E6 LDA SIDE ;PUT THE E4D4 07 RLC ; SIDE E4D5 07 RLC ; SELECT E4D6 07 RLC ; FLAG E4D7 82 ADD D ; IN BIT E4D8 57 MOV D,A ; POSITION 6 E4D9 3AFDE6 LDA SECLEN ;PUT THE E4DC 07 RLC ; SECTOR LENGTH E4DD 07 RLC ; CODE P BITS E4DE 82 ADD D ; 2 & 3 E4DF 57 MOV D,A E4E0 3AECE6 LDA CDISK ;PUT THE CURRENT E4E3 82 ADD D ; DISK NO IN BITS CP/M MACRO ASSEM 2.0 #016 *** Cold Boot Loader for CP/M Ver. 2.2 *** E4E4 C9 RET ; 0 & 1 * * DMSTAT E4E5 E5 PUSH H ;SAVE THE H-L PAIR E4E6 2AE7E6 LHLD DMAADR ;H-L PAIN E4E9 44 MOV B,H ;MOVE THE DMA E4EA 4D MOV C,L ;ADDR TO B-C E4EB E1 POP H ;RECOVER H-L E4EC C9 RET * * DRIVE E4ED 3EFC MVI A,374Q ;TEST FOR THE E4EF 81 ADD C ; NEW DRIVE NUMBER E4F0 3E10 MVI A,20Q ;LESS THAN 4 E4F2 D8 RC E4F3 79 MOV A,C ;STORE THE NEW E4F4 32EBE6 STA DISK ;DRIVE IN DISK E4F7 C9 RET * * DMA E4F8 210820 LXI H,8-ROM ;TEST THE E4FB 09 DAD B ; DMA ADDRESS E4FC D20AE5 JNC DMASET ; FOR CONFLICT E4FF 21001C LXI H,-RAM ; WITH THE I/O E502 09 DAD B ; ON THE DJ/2D E503 DA0AE5 JC DMASET ;CONTROLLER E506 37 STC E507 3E10 MVI A,20Q E509 C9 RET DMASET E50A 60 MOV H,B ;GET THE DMA ADDR E50B 69 MOV L,C ;TO THE H-L PAR E50C 22E7E6 SHLD DMAADR ;STORE E50F AF XRA A ;CLEAR THE ERROR E510 C9 RET ; FLAG AND RETURN * * HOME E511 CD00E7 CALL HDLOAD ;LOAD THE HEAD E514 D8 RC ;NOT READY ERROR E515 CD27E5 CALL HENTRY ;MOVE THE HEAD E518 F5 PUSH PSW ;SAVE THE FLAGS E519 9F SBB A ;UPDATE THE E51A 32F9E6 STA TRACK ; TRACK E51D 32FDE3 STA TRKREG ; REGISTERS E520 AF XRA A ;SET THE NOT E521 32EDE6 STA TZFLAG ; VERIFIED FLAG E524 C3DDE5 JMP LEAVE+1 ;UNLOAD THE HEAD HENTRY E527 AF XRA A ;UPDATE E528 32E9E6 STA HDFLAG ; FLAGS E52B 210000 LXI H,0 ;TIME OUT CONSTANT E52E 3E09 MVI A,HCMD ;DO THE HOME CP/M MACRO ASSEM 2.0 #017 *** Cold Boot Loader for CP/M Ver. 2.2 *** E530 CD7DE7 CALL CENTRY ; COMMAND E533 E604 ANI TZERO ;TRACK ZERO BIT E535 C0 RNZ E536 37 STC ;ERROR FLAG E537 C9 RET * * SECSET E538 AF XRA A ;TEST FOR E539 B1 ORA C ; SECTOR ZERO E53A 37 STC ;ERROR FLAG E53B C8 RZ E53C 79 MOV A,C ;TEST FOR E53D FE1B CPI 27 ; SECTOR E53F 3F CMC ;TOO LARGE E540 D8 RC E541 32F8E6 STA SECTOR ;SAVE E544 C9 RET * * SEEK E545 79 MOV A,C ;TEST FOR E546 FE4D CPI 77 ; TRACK E548 3F CMC ; TOO LARGE E549 D8 RC E54A 32F9E6 STA TRACK ;SAVE E54D C9 RET * * ISSUE E54E 32E4E6 STA ECOUNT+1 ;UPDATE COUNT E551 CDADE7 CALL MEASUR ;FIND THE INDEX E554 0E01 MVI C,1 ;START W/SECTOR 1 ISLOOP E556 79 MOV A,C ;INITIALIZE THE E557 32FEE3 STA SECREG ; SECTOR REGISTER E55A 3AF8E6 LDA SECTOR ;TEST FOR E55D B9 CMP C ; TARGET SECTOR E55E C8 RZ E55F 3E80 MVI A,RCMD ;DO A FAKE E561 CD78E7 CALL COMAND ; READ COMMAND E564 DADAE5 JC PLEAVE ;ABORT ON ERROR E567 0C INR C ;INCREMENT SECTOR NO. E568 C356E5 JMP ISLOOP COMNDP E56B 32FCE3 STA CMDREG ;DO THE COMMAND E56E 48 MOV C,B ;INITIALIZE BLOCK COUNT E56F 11FFE3 LXI D,DATREG ;DATA REGISTER E572 2AE7E6 LHLD DMAADR ;TRANSFER ADDRESS E575 C9 RET WRITE E576 CDE7E5 CALL PREP ;PREPARE FOR WRITE E579 DADCE5 JC LEAVE ;ABORT OPERATION WRENTRY CP/M MACRO ASSEM 2.0 #018 *** Cold Boot Loader for CP/M Ver. 2.2 *** E57C 3EA0 MVI A,WCMD ;START A WRITE E57E CD6BE5 CALL COMNDP ; SECTOR OPERATION WRLOOP E581 7E MOV A,M ;LOAD 1ST BYTE OF DATA E582 23 INX H ;ADVANCE POINTER E583 12 STAX D ;WRITE 1ST BYTE OF DATA E584 7E MOV A,M ;LOAD 2ND BYTE OF DATA E585 23 INX H ;ADVANCE POINTER E586 12 STAX D ;WRITE 2ND BYTE OF DATA E587 7E MOV A,M ;LOAD 3RD BYTE OF DATA E588 23 INX H ;ADVANCE POINTER E589 12 STAX D ;WRITE 3RD BYTE OF DATA E58A 0D DCR C ;REDUCE BLOCK COUNT E58B 7E MOV A,M ;LOAD 4TH BYTE OF DATA E58C 23 INX H ;ADVANCE POINTER E58D 12 STAX D ;WRITE 4TH BYTE OF DATA E58E C281E5 JNZ WRLOOP ;WRITE NEXT 4 BYTES E591 217CE5 LXI H,WRENTRY ;RETURN ENTRY ADDRESS E594 C3B5E5 JMP CBUSY READ E597 CDE7E5 CALL PREP ;PREPARE FOR READ E59A DADCE5 JC LEAVE ;ABORT OPERATION RDENTRY E59D 3E80 MVI A,RCMD ;START A READ E59F CD6BE5 CALL COMNDP ; SECTOR OPERATION RDLOOP E5A2 1A LDAX D ;READ 1ST BYTE E5A3 77 MOV M,A ;STORE 1ST BYTE E5A4 23 INX H ;ADVANCE POINTER E5A5 1A LDAX D ;READ 2ND BYTE E5A6 77 MOV M,A ;STORE 2ND BYTE E5A7 23 INX H ;ADVANCE POINTER E5A8 1A LDAX D ;READ 3RD BYTE E5A9 77 MOV M,A ;STORE 3RD BYTE E5AA 23 INX H ;ADVANCE POINTER E5AB 0D DCR C ;REDUCE BLOCK COUNT E5AC 1A LDAX D ;READ 4TH BYTE E5AD 77 MOV M,A ;STORE 4TH BYTE E5AE 23 INX H ;ADVANCE POINTER E5AF C2A2E5 JNZ RDLOOP ;READ NEXT 4 BYTES E5B2 219DE5 LXI H,RDENTRY ;RETURN ENTRY ADDRESS CBUSY E5B5 E5 PUSH H ;SAVE RETURN ADDRESS E5B6 21FCE3 LXI H,CSTAT ;WAIT FOR THE 1791 E5B9 CD87E7 CALL BUSY ; TO FINISH COMMAND E5BC E65F ANI 137Q ;ERROR BIT MASK E5BE CADBE5 JZ LEAVE-1 ; TEST E5C1 FE10 CPI 10H ;PREMATURE INTERRUPT E5C3 C2DAE5 JNZ PLEAVE ;OTHER ERROR TYPE E5C6 3AE3E6 LDA ECOUNT ;DECREMENT ERROR E5C9 3D DCR A ; COUNT NUMBER 1 E5CA FAD1E5 JM STEST ;HARD INTERRUPT ERROR E5CD 32E3E6 STA ECOUNT ;UPDATE COUNT E5D0 C9 RET ;DO OPERATION OVER STEST CP/M MACRO ASSEM 2.0 #019 *** Cold Boot Loader for CP/M Ver. 2.2 *** E5D1 3AE4E6 LDA ECOUNT+1 ;DECREMENT ERROR E5D4 3D DCR A ; COUNT NUMBER 2 E5D5 F24EE5 JP ISSUE ;ISSUE A COMMAND E5D8 3E10 MVI A,10H ;IRRECOVERABLE ERROR PLEAVE E5DA 37 STC ;ERROR FLAG E5DB E1 POP H ;ADJUST THE STACK LEAVE E5DC F5 PUSH PSW ;SAVE THE FLAGS E5DD 3AF6E6 LDA DCREG ;1791 CONTROL BITS E5E0 EE10 XRI LOAD ;TOGGLE THE E5E2 CDF1E7 CALL SCBITS ; HEAD LOAD BITS E5E5 F1 POP PSW ;RECOVER THE FLAGS E5E6 C9 RET * * PREP E5E7 CD00E7 CALL HDLOAD ;LOAD THE HEAD E5EA D8 RC ;DISK NOT READY? E5EB 3AFDE3 LDA TRKREG ;GET THE OLD TRK E5EE 3C INR A ;TEST FOR HEAD E5EF CC27E5 CZ HENTRY ; NOT CALIBRATED E5F2 D8 RC ;SEEK ERROR? E5F3 21FDE3 LXI H,TRKREG ;PRESENT TRK E5F6 3AF9E6 LDA TRACK ;THE NEW TRACK E5F9 BE CMP M ;TEST FOR HEAD MOTION E5FA 23 INX H ;ADVANCE TO THE E5FB 23 INX H ; DATA REGISTER E5FC 77 MOV M,A ;SAVE THE NEW TRK E5FD 79 MOV A,C ;TURN OFF DATA E5FE CDF1E7 CALL SCBITS ; ACCESS CONTROL BIT E601 CA1BE6 JZ TVERFY ;TEST FOR SEEJ E604 AF XRA A ;FORCE A READ E605 32E9E6 STA HDFLAG ; HEADER OPERATION E608 CDF5E7 CALL LDSTAT ;GET THE E60B E608 ANI DSIDE ; DOUBLE E60D 1F RAR ; E60E 1F RAR ; FLAG E60F 1F RAR ; TO DO 3 MS E610 C618 ADI SKCMD ; STEP OPERATION E612 210000 LXI H,0 ;DO A SEEK E615 CD7DE7 CALL CENTRY ; COMMAND E618 DA41E6 JC SERROR ;SEEK ERROR? TVERFY E61B 3AE9E6 LDA HDFLAG ;GET THE FORCE E61E B7 ORA A ; VERIFY TRACK FLAG E61F C26CE6 JNZ CHKSEC ;NO SEEK & HEAD OK E622 0602 MVI B,2 ;VERIFY RETRY NO SLOOP E624 3E1D MVI A,SVCMD ;DO A VERIFY E626 CD78E7 CALL COMAND ; COMMAND E629 E699 ANI 231Q ;ERROR BIT MASK E62B 57 MOV D,A ;SAVE E62C CA48E6 JZ RDHDR ;NO ERROR E62F 3AF6E6 LDA DCREG ;1791 CONTROL REG E632 EE01 XRI DENSTY ;FLIP THE DENSITY BIT CP/M MACRO ASSEM 2.0 #020 *** Cold Boot Loader for CP/M Ver. 2.2 *** E634 32F6E6 STA DCREG ;UPDATE E637 EE02 XRI ACCESS E639 CDF1E7 CALL SCBITS ;CHANGE DENSITY E63C 05 DCR B ;DEC RETRY COUNT E63D C224E6 JNZ SLOOP ; AND TRY AGAIN E640 7A MOV A,D ;RESTORE ERROR BITS SERROR E641 37 STC ;ERROR FLAG E642 F5 PUSH PSW ;SAVE THE STATUS E643 CD27E5 CALL HENTRY ;SEEK TO TRACK 0 E646 F1 POP PSW ;RECOVER ERRORS E647 C9 RET RDHDR E648 060A MVI B,12Q ;NUMBER OF RETRYS RHLOOP E64A 11FFE3 LXI D,DATREG ;DATA REGISTER E64D 21FAE6 LXI H,TRACK+1 ;STORAGE AREA E650 3EC4 MVI A,RACMD ;DO THE READ E652 32FCE3 STA CMDREG ; HEADER COMMAND RHL1 E655 1A LDAX D ;GET A DATA BYTE E656 77 MOV M,A ;STORE IN MEMORY E657 2C INR L ;INC MEM POINTER E658 C255E6 JNZ RHL1 ;TEST FOR MORE DATA E65B 21FCE3 LXI H,CSTAT ;WAIT FOR 1791 E65E CD87E7 CALL BUSY ;TO FINISH CMD E661 B7 ORA A ;TEST FOR ERRORS E662 CA6CE6 JZ CHKSEC ;TRANSFER OK? E665 05 DCR B ;DEC RETRY COUNT E666 C24AE6 JNZ RHLOOP ;TEST FOR E669 C341E6 JMP SERROR ; HARD ERROR CHKSEC E66C 3AFDE6 LDA SECLEN ;GET THE SECTOR E66F 4F MOV C,A ; SIZE AND SETUP E670 0600 MVI B,0 ; THE OFFSET E672 21DFE6 LXI H,STABLE ;SEC SIZE TBL E675 09 DAD B ;ADD THE OFFSET E676 3AF8E6 LDA SECTOR ;GET THE SECTOR E679 47 MOV B,A ;SAVE IN B E67A 86 ADD M ;COMPARE W/TABLE ENTRY E67B 3E10 MVI A,20Q ;ERROR FLAG E67D D8 RC ;ERROR RETURN E67E 78 MOV A,B ;SAVE THE SECTOR E67F 32FEE3 STA SECREG ; IN SECTOR REG E682 3E20 MVI A,40Q ;128 BYTE SECTOR E684 210505 LXI H,505H ;INITIALIZE E687 22E3E6 SHLD ECOUNT ; ERROR COUNTS SZLOOP E68A 0D DCR C ;REDUCE SIZE COUNT E68B 47 MOV B,A ;SECTOR SIZE TO B E68C F8 RM ;RETURN ON MINUS E68D 17 RAL ;DOUBLE THE COUNT E68E B7 ORA A ;CLEAR THE CARRY E68F C38AE6 JMP SZLOOP * * CP/M MACRO ASSEM 2.0 #021 *** Cold Boot Loader for CP/M Ver. 2.2 *** SIDEFX E692 79 MOV A,C ;GET THE SIDE BIT E693 E601 ANI 1 ;TRIM EXCESS BITS E695 17 RAL ;MOVE THE BIT E696 17 RAL ; TO THE SIDE E697 17 RAL ; SELECT BIT E698 17 RAL ; POSITION E699 32F7E6 STA SIDE ;SAVE E69C C9 RET * * TIMOUT E69D 210000 LXI H,0 ;TIME OUT DELAY TILOOP E6A0 2B DCX H ;DECREMENT E6A1 7C MOV A,H ;TEST FOR E6A2 B5 ORA L ; COUNT ZERO E6A3 E3 XTHL ;LONG E6A4 E3 XTHL ; NOP E6A5 C2A0E6 JNZ TILOOP E6A8 C9 RET TOEND * * E6A9 DS 300H-TOEND+DBOOT-66Q E6CA DS 25Q * * STACK * * STABLE E6DF E5 DB 345Q E6E0 E5 DB 345Q E6E1 F0 DB 360Q E6E2 F7 DB 367Q * * E6E3 0000 ECOUNT DW 0 ;ERROR COUNT CELLS E6E5 0030 TIMER DW 3000H ;HEAD LOAD TIME E6E7 8000 DMAADR DW 200Q ;DMA ADDRESS E6E9 00 HDFLAG DB 0 ;READ HEADER FLAG E6EA FE DRVSEL DB 376Q ;DRIVE SELECT CONSTANT E6EB 00 DISK DB 0 ;NEW DRIVE E6EC 08 CDISK DB 10Q ;CURRENT DRIVE E6ED 00 TZFLAG DB 0 ;TRACK ZERO INDICATOR E6EE 03 D0PRAM DB 3 ;DRIVE 0 PARAMETERS E6EF FF D0TRK DB 377Q ;DRIVE 0 TRACK NO E6F0 03 D1PRAM DB 3 ;DRIVE 1 PARAMETERS E6F1 FF D1TRK DB 377Q ;DRIVE 1 TRACK NO E6F2 03 D2PRAM DB 3 ;DRIVE 2 PARAMETERS E6F3 FF D2TRK DB 377Q ;DRIVE 2 TRACK NO E6F4 03 D3PRAM DB 3 ;DRIVE 3 PARAMETERS E6F5 FF D3TRK DB 377Q ;DRIVE 3 TRACK NO E6F6 03 DCREG DB 3 ;CURRENT PARAMETERS E6F7 00 SIDE DB 0 ;NEW SIDE SELECT CP/M MACRO ASSEM 2.0 #022 *** Cold Boot Loader for CP/M Ver. 2.2 *** E6F8 03 SECTOR DB 3 ;NEW SECTOR E6F9 00 TRACK DB 0 ;NEW TRACK E6FA 00 TRKNO DB 0 ;DISK E6FB 00 SIDENO DB 0 ; SECTOR E6FC 00 SECTNO DB 0 ; HEADER E6FD 00 SECLEN DB 0 ; DATA E6FE 00 CRCLO DB 0 ; BUFFER E6FF 00 CRCHI DB 0 * * HDLOAD E700 21EBE6 LXI H,DISK E703 4E MOV C,M ;NEW DISK NO TO C E704 23 INX H E705 5E MOV E,M ;CURRENT DISK TO E E706 71 MOV M,C ;UPDATE CURRENT DISK E707 23 INX H ;ADDR OF DISK TABLE E708 7B MOV A,E ;TEST FOR E709 B9 CMP C ; DISK CHANGE E70A 7E MOV A,M ;HEAD LOAD FLAG E70B 3604 MVI M,HEAD ;UPDATE HEAD LOAD E70D 23 INX H ;ADDR OF DISK TABLE E70E CA36E7 JZ HDCHK ;NO DISK CHANGE? E711 E5 PUSH H ;SAVE TABLE ADDRESS E712 1600 MVI D,0 ;SET UP THE E714 42 MOV B,D ; OFFSET ADDRESS E715 19 DAD D ;GET THE CURRENT E716 19 DAD D ; DISK PARAMETERS E717 3AF6E6 LDA DCREG ;SAVE THE E71A 77 MOV M,A ;DENSITY INFO E71B 23 INX H ;CURRENT TRACK E71C 11FDE3 LXI D,TRKREG E71F 1A LDAX D ;GET CURRENT TRK E720 77 MOV M,A ;SAVE E721 E1 POP H ;RECOVER TBL ADDR E722 09 DAD B ;ADD THE E723 09 DAD B ; OFFSET E724 7E MOV A,M ;GET CONTROL BITS E725 32F6E6 STA DCREG ;UPDATE DCREG E728 23 INX H ;GET THE OLD E729 7E MOV A,M ;TRACK NUMBER E72A 12 STAX D ;AND UPDATE 1791 E72B 3E7F MVI A,177Q ;DISK SELECT BITS DSROT E72D 07 RLC ;ROTATE TO E72E 0D DCR C ; SELECT THE E72F F22DE7 JP DSROT ; PROPER DRIVE E732 32EAE6 STA DRVSEL ;SAVE E735 AF XRA A ;FORCE HEAD LOAD HDCHK E736 CDF9E7 CALL LOADS ;TEST FOR E739 A6 ANA M ; HEAD LOADED E73A 32E9E6 STA HDFLAG ;SAVE THE HEAD E73D F5 PUSH PSW ; LOADED STATUS E73E 3AEAE6 LDA DRVSEL ;GET CURRENT DRIVE E741 4F MOV C,A ;SAVE CP/M MACRO ASSEM 2.0 #023 *** Cold Boot Loader for CP/M Ver. 2.2 *** E742 3AF7E6 LDA SIDE ;GET CURRENT SIDE E745 2F CMA ;AND MERGE E746 A1 ANA C ; WITH DRIVE SELECT E747 CDE9E7 CALL SDSEL ;SELECT DRIVE & SIDE E74A 3AF6E6 LDA DCREG ;1791 CONTROL BITS E74D 4F MOV C,A ;SAVE E74E 3AF9E6 LDA TRACK ;GET THE NEW TRK E751 D601 SUI 1 ;FORCE SINGLE E753 9F SBB A ; DENSITY E754 3D DCR A ; IF TRACK = 0 E755 2F CMA ;COMPLIMENT E756 B1 ORA C ;MERGE W/CONTROL BITS E757 77 MOV M,A ;SET 1791 CONTROL E758 EE02 XRI ACCESS ;TOGGEL ACCESS BIT E75A 4F MOV C,A ;SAVE PREP ROUTINE E75B F1 POP PSW ;HEAD LOAD STATUS E75C C26AE7 JNZ RDYCHK ;CONDITIONALLY E75F E5 PUSH H ; WAIT FOR HEAD E760 2AE5E6 LHLD TIMER ; LOAD TIME OUT TLOOP E763 2B DCX H ;COUNT DOWN E764 7C MOV A,H ; 40 MS FOR E765 B5 ORA L ; HEAD LOAD E766 C263E7 JNZ TLOOP ; TIME OUT E769 E1 POP H ;DISK STATUS ADDR RDYCHK E76A 7E MOV A,M ;TEST FOR E76B E620 ANI READY ; DISK READY E76D C8 RZ UNLOAD E76E 3AF6E6 LDA DCREG ;FORCE A E771 F618 ORI ULOAD ; HEAD E773 77 MOV M,A ; UNLOAD E774 3E80 MVI A,200Q ;SET DISK E776 37 STC ; NOT READY E777 C9 RET ; ERROR FLAG * * COMAND E778 2AE5E6 LHLD TIMER ;GET INDEX COUNT E77B 29 DAD H ; AND MULTIPLY E77C 29 DAD H ; BY FOUR CENTRY E77D EB XCHG ;SAVE IN D-E PAIR E77E 21FCE3 LXI H,CSTAT ;ISSUE COMMAND E781 77 MOV M,A ;TO THE 1791 NBUSY E782 7E MOV A,M ;WAIT E783 1F RAR ; FOR THE E784 D282E7 JNC NBUSY ; BUSY FLAG BUSY E787 7E MOV A,M ;TEST FOR E788 1F RAR ; DEVICE BUSY E789 7E MOV A,M ;RESTORE STATUS E78A D0 RNC ;RETURN IF NOT BUSY E78B 1B DCX D ;TEST FOR CP/M MACRO ASSEM 2.0 #024 *** Cold Boot Loader for CP/M Ver. 2.2 *** E78C 7A MOV A,D ; TWO DISK E78D B3 ORA E ; REVOLUTIONS E78E C287E7 JNZ BUSY ;47 MACHINE CYCLES E791 5E MOV E,M ;SAVE ERROR CODE E792 E5 PUSH H ;SAVE CMD ADDRESS E793 23 INX H ;TRACK REGISTER E794 56 MOV D,M ;SAVE PRESENT TRACK E795 E3 XTHL ;RECOVER CMD REG. E796 D5 PUSH D ;SAVE STATUS E797 EB XCHG ;ADJUST REGISTERS E798 CDF9E7 CALL LOADS ;GET CONTROL REG E79B 3AF6E6 LDA DCREG ;1791 CONTROL BITS E79E EE04 XRI RSTBIT ;RESET THE 1791 E7A0 77 MOV M,A ; CONTROLLER TO E7A1 EE04 XRI RSTBIT ; CLEAR FAULT E7A3 EB XCHG ;ADJUST REGISTERS E7A4 12 STAX D ;START CONTROLLER E7A5 36D0 MVI M,CLRCMD ;FORCE AN INTERRUPT E7A7 D1 POP D ;RECOVER STATUS E7A8 E1 POP H ;RECOVER TRACK REG E7A9 72 MOV M,D ;RESTORE TRACK E7AA 7B MOV A,E ;RESTORE ERROR CODE E7AB 37 STC ; ERROR FLAG E7AC C9 RET * * MEASUR E7AD 110000 LXI D,0 ;INITIALIZE COUNT E7B0 CDF9E7 CALL LOADS ;STATUS PORT E7B3 0E10 MVI C,INDEX ;INDEX BIT FLAG INDXHI E7B5 7E MOV A,M ;WAIT FOR E7B6 A1 ANA C ; INDEX E7B7 C2B5E7 JNZ INDXHI ; PULSE LOW INDXLO E7BA 7E MOV A,M ;WAIT FOR E7BB A1 ANA C ; INDEX E7BC CABAE7 JZ INDXLO ; PULSE HIGH INDXCT E7BF 13 INX D ;ADVANCE COUNT E7C0 E3 XTHL ;FOUR E7C1 E3 XTHL ; DUMMY E7C2 E3 XTHL ; INSTRUCTIONS E7C3 E3 XTHL ; FOR DELAY E7C4 7E MOV A,M ;WAIT E7C5 A1 ANA C ; FOR NEXT E7C6 C2BFE7 JNZ INDXCT ; LOW INDEX E7C9 C9 RET ;98 MACHINE CYCLES * * DENFIX E7CA 79 MOV A,C ;TRIM EXCESS E7CB E601 ANI 1 ; BITS, E7CD 2F CMA ; COMPLIMENT E7CE 47 MOV B,A ; B AND SAVE E7CF 21EBE6 LXI H,DISK ;NEW DISK CP/M MACRO ASSEM 2.0 #025 *** Cold Boot Loader for CP/M Ver. 2.2 *** E7D2 5E MOV E,M ;GET DISK NO E7D3 1600 MVI D,0 ;OFFSET ADDR E7D5 23 INX H ;CURRENT DISK E7D6 7E MOV A,M ;MOVE TO ACC E7D7 AB XRA E ;COMPARE W/NEW E7D8 F5 PUSH PSW ;SAVE STATUS E7D9 23 INX H ;DISK TABLE E7DA 23 INX H ; ADDRESS E7DB 19 DAD D ;ADD THE E7DC 19 DAD D ;OFFSET E7DD 7E MOV A,M ;GET PARAMETERS E7DE F601 ORI 1 ;MASK OFF DENSITY E7E0 A0 ANA B ;SET NEW DENSITY E7E1 77 MOV M,A ;UPDATE E7E2 F1 POP PSW ;CHECK FOR ND=CD E7E3 C0 RNZ ;NEW DISK NOT OLD E7E4 7E MOV A,M ;UPDATE CDISK E7E5 32F6E6 STA DCREG ; ALSO E7E8 C9 RET * * SDSEL E7E9 32FAE3 STA DREG ;DRIVE SELECT REG E7EC C9 RET LUSTAT E7ED 3AFAE3 LDA USTAT ;UART STATUS REG E7F0 C9 RET SCBITS E7F1 32F9E3 STA DCMD ;1791 CONTROL REG E7F4 C9 RET LDSTAT E7F5 3AF9E3 LDA DSTAT ;DRIVE STATUS REG E7F8 C9 RET LOADS E7F9 21F9E3 LXI H,DSTAT ;DRIVE STATUS REG E7FC C9 RET E7FD END