CP/M MACRO ASSEM 2.0 #001 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs ;********************************************************************** TITLE 'Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs' ;********************************************************************** ; ;THE FOLLOWING COLD BOOT LOADER PROGRAMS ARE INCLUDED IN THIS MODULE ;------------------------------------------------------------------- ; DJDMA DISK JOCKEY DMA CONTROLLER WITH 8" DRIVES ; DJDMA DISK JOCKEY DMA CONTROLLER WITH 5 1/4" DRIVES ; DJ2DB DISK JOCKEY 2D REV_B (8" FLOPPY) CONTROLLER ; HDDMA HARD DISK DMA CONTROLLER ; HDC3 HARD DISK CONTROLLER REV_3 ; ;NOTE: ;----- ; PROVISIONS HAVE BEEN MADE FOR A MICRONIX BOOT LOADER FOR USE WITH ; THE DJDMA CONTROLLER. THIS LOADER ALWAYS GETS LOADED TO 0100H. ; ;SYSTEM MEMROY MAPS ;================== ; 1) THE FOLLOWING TABLE GIVES A GENERAL IDEA AS TO WHERE THE ; VARIOUS PARTS OF OF THE OPERATING SYSTEM ARE IN MEMORY. ; 2) THE AMOUNT OF CODE AND TABLE SPACE THAT CAN ACTUALLY BE ; LOADED FROM THE DISK IS FIXED BY THE AMOUNT OF SPACE AVAILABLE ; ON THE SYSTEM TRACKS. ; 3) OUR MOST RESTRICTIVE (SMALLEST) DRIVE IS THE 5 1/4 INCH ; 'MINNIE FLOPPY'. THIS DRIVE HAS 20 512 BYTE SECTORS FOR ; A TOTAL OF 10K BYTES ON THE SYSTEM TRACKS. THE 8 INCH ; FLOPPY DISK DRIVE IS ALSO VERY CLOSE TO BEING FILLED UP. ; 4) SINCE 512 BYTES ARE RESERVED FOR THE COLD BOOT LOADER WE ; HAVE A TOTAL OF 9.5K BYTES FOR THE OPERATING SYSTEM. OUT ; OF THIS 5.5K BYTES ARE USED BY THE (CCP + BDOS) LEAVING ; US WITH A TOTAL OF 4K BYTES OF LOADED CODE AND DATA SPACE ; TO PLAY WITH. RIGHT NOW WE ARE USING ALL OF THIS SPACE ; SO ANY MAJOR ADDITIONS WILL HAVE TO RESULT IN A LITTLE ; (LOT?) OF CODE SHUFFELING OR IN THE CREATION OF A CBIOS ; THAT SIMPLY WILL NOT FIT ON A SMALL DISK DRIVE. ; 5) THE BIOS CAN TAKE UP AS MUCH AS 6.4K BYTES OF SPACE; HOWEVER, ; ONLY 4K BYTES ARE ACTUALLY ON THE DISK. THE REMAINING SPACE IS ; USED FOR UNINITIALIZED STORAGE. ; ; SYSGEN 48K 56K 60K 62K 64K ; IMAGE CP/M CP/M CP/M CP/M CP/M ; ; 900 ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ LOADER ; B00 9100 B100 C100 C900 D100 CCP ; 1300 9900 B900 C900 D100 D900 BDOS ; 2100 A700 C700 D700 EF00 E700 CBIOS ; 3100 B700 D700 E700 FF00 F700 TABLES (APPROX.) ; 35FF BFFF DFFF EFFF F7FF FFFF END OF MEMORY ; ; ~~~~ 8900 A900 B900 C100 C900 DDT PAGE CP/M MACRO ASSEM 2.0 #002 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs ;***************************** ;BEGIN USER CONFIGURATION AREA ;***************************** ; ;DEFINE TRUE AND FALSE ;--------------------- ; 0001 = TRUE EQU 1 0000 = FALSE EQU 0 ;SET THE MEMORY SIZE ;------------------- ; 0030 = MSIZE EQU 48 ;MEMORY SIZE OF TARGET CP/M ;BOOT CONTROLLER SELECTION ;------------------------- ; ONLY ONE OF THE FOLLOWING EQUATES SHOULD BE SET TO TRUE. THE ; OTHERS SOULD BE SET TO FALSE. THESE EQUATES DEFINE THE BOOT LOADER ; THAT IS TO BE USED. ; 0001 = DMORDER EQU TRUE ;SET TO BOOT A DJDMA CONTROLLER 8" DRIVES) 0000 = MFORDER EQU FALSE ;SET TO BOOT A DJDMA CONTROLLER (5 1/4" DRIVES) 0000 = FDORDER EQU FALSE ;SET TO BOOT A DJ2D/B CONTROLLER 0000 = MWORDER EQU FALSE ;SET TO BOOT A HDDMA CONTROLLER 0000 = HDORDER EQU FALSE ;SET TO BOOT AN HDC3 CONTROLLER ;MISC EQUATES ;------------ ; 0000 = MICRON EQU FALSE ;SET FOR MICRONIX BOOT LOADER (ONLY DJDMA) 0001 = ABSASM EQU TRUE ;SET FOR MAC 000A = RETRIES EQU 10 ;MAXIMUM # OF DISK RETRIES PAGE CP/M MACRO ASSEM 2.0 #003 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs ;***************************** ;BEGIN INTERNAL SYSTEM EQUATES ;***************************** ; ;SIZES ;----- ; 0014 = BIOSLN EQU 14H ;BIOS LENGTH IN PAGES 0800 = CCPLN EQU 800H ;LENGTH OF THE CCP 0E00 = BDOSLN EQU 0E00H ;LENGTH OF THE BDOS C000 = SIZE EQU (MSIZE*1024) ;MEMORY SIZE IN KILO-BYTES ;STARTING ADDRESSES ;------------------ ; 9600 = CCP EQU SIZE-(BIOSLN*100H+CCPLN+BDOSLN) 9E00 = BDOS EQU CCP+CCPLN AC00 = BIOS EQU CCP+CCPLN+BDOSLN IF NOT ABSASM ASEG ENDIF 0800 = CCPLN EQU 800H 0E00 = BDOSLN EQU 0E00H AC00 = BIOS EQU CCP+CCPLN+BDOSLN C000 = SIZE EQU MSIZE*1024 000A = RETRIES EQU 10 0100 = LOAD1 EQU 100H ;READ OFFSET#1 FOR MOVCPM ;LOAD AND EXECUTION ADDRESSES ;---------------------------- ; 1) IF THIS PROGRAM IS BEING USED TO BOOT MICRONIX, AND THE LOAD ; ADDRESS IS MOVED FORWARD FROM 0100H, THEN THE STARTING EXTENDED ; ADDRESS FOR THE DJDMA BOOT LOADER SHOULD BE ADJUSTED. ; IF MICRON EQ FALSE 9600 = LOADDR EQU CCP ;LOAD ADDRESS FOR FLOPPY AC00 = CBOOT EQU BIOS ;COLD BOOT ADDRESS FOR CP/M ELSE ;MICRONIX BOOT LOADER LOADDR EQU 0100H CBOOT EQU 0100H ;COLD BOOT ADDRESS FOR THE LOADER ENDIF PAGE CP/M MACRO ASSEM 2.0 #004 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs IF (DMORDER EQ 1) ;****************************************************************** ;COLD BOOT LOADER FOR THE DISK JOCKEY DMA CONTROLLER USING 8" DISKS ;****************************************************************** ; ;DISK MAP OF THE BOOT SECTORS ;============================ ; 1) THE LOADING IS IDENTICAL TO THAT OF OF THE DJ2DB EXCEPT ; THAT THE LOADER ITSELF IS LOADED AT 80H ; 2) THIS PROGRAM MAKES USE OF THE FACT THAT THE DJDMA HAS A LOAD TRACK ; COMMAND. ; 3) TRACK 1 IS RECORDED IN DOUBLE DENSITY FORMAT. THERE ARE ; 1024 BYTES PER SECTOR. ; 4) THE WARM BOOT STARTS FROM TRACK 0 SECTOR 1 AND CONTINUES ; THROUGH TO TRACK 1 SECTOR 1. ; 5) THE LOAD ADDRESS ASSUMES THAT YOU'RE USING A 48K SYSTEM ; ; TRACK SECTOR SYSGEN LOAD NAME ; ; 0 1 900 FF00 BOOT LOADER ; 0 2 980 UNUSED ; 0 3 A00 ; 0 4 A80 ; 0 5 B00 9100 CCP ; 0 6 B80 9180 ; 0 7 C00 9200 ; 0 8 C80 9280 ; 0 9 D00 9300 ; 0 10 D80 9380 ; 0 11 E00 9400 ; 0 12 E80 9480 ; 0 13 F00 9500 ; 0 14 F80 9580 ; 0 15 1000 9600 ; 0 16 1080 9680 ; 0 17 1100 9700 ; 0 18 1180 9780 ; 0 19 1200 9800 ; 0 20 1280 9880 ; 0 21 1300 9900 BDOS ; 0 22 1380 9980 ; 0 23 1400 9A00 ; 0 24 1480 9A80 ; 0 25 1500 9B00 ; 0 26 1580 9B80 ; ; 1 1 1600 9C00 ; 1 2 1A00 A000 ; 1 3 1E00 A400 CBIOS (@ A700H) ; 1 4 2200 A800 ; 1 5 2600 AC00 ; 1 6 2A00 B000 ; 1 7 2E00 B400 ; 1 8 3200 B800 UNUSED CP/M MACRO ASSEM 2.0 #005 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs PAGE CP/M MACRO ASSEM 2.0 #006 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs ;8" DJDMA EQUATES ;================ ; ;DEFINE BOOT ADDRESS FOR DJDMA 0080 = BOOT EQU 80H 0080 ORG BOOT 00EF = DJKICK EQU 0EFH ;I/O PORT TO START DJDMA CONTROLLER ACTIVITY 0050 = CHANNL EQU 50H ;DEFAULT CHANNEL ADDRESS 0B00 = TRKOFF EQU 22*128 ;NUMBER OF BYTES LOADED FROM TRACK 0 0023 = SETDMA EQU 23H ;SET DMA ADDRESS 0025 = DJHALT EQU 25H ;HALT CONTROLLER 0026 = DJBRAN EQU 26H ;BRANCH CONTROLLER COMMAND 0029 = REDTRK EQU 29H ;READ TRACK COMMAND 0100 = LOAD2 EQU 100H ;READ OFFSET#2 FOR MOVCPM 0880 = OFFSET EQU 900H-BOOT ;READ OFFSET FOR DDT PAGE CP/M MACRO ASSEM 2.0 #007 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs ;BEGIN 8" DJDMA EXECUTABLE CODE ;============================== ; 0080 3E26 MVI A,DJBRAN ;LOAD BRANCH CHANNEL COMMAND 0082 325000 STA CHANNL 0085 21BE00 LXI H,COMMND ;LOAD NEW COMMAND CHANNEL ADDRESS 0088 225100 SHLD CHANNL+1 008B AF XRA A 008C 325300 STA CHANNL+3 008F D3EF DJSTRT: OUT DJKICK ;START CONTROLLER 0091 3AD700 DJWAIT: LDA DJDONE ;GET FINAL STATUS 0094 B7 ORA A ;0 = STILL BUSY 0095 CA9100 JZ DJWAIT ;LOOP IF BUSY 0098 21DD00 LXI H,SECTB0 ;CHECK FOR BAD LOAD 009B 01FF40 LXI B,40FFH ;B = OK, C = LOADED 009E 112200 LXI D,ENDTBL-SECTB0 ;ERROR COUNT + # OF SECTORS 00A1 7E DJLOOP: MOV A,M ;LOAD SECTOR CODE 00A2 B9 CMP C ;CHECK FOR 0FFH (ALREADY LOADED) 00A3 CAAD00 JZ DJCONT ;SKIP IF LOAD WAS 'OK' 00A6 71 MOV M,C ;LOAD 'LOADED' FLAG 00A7 B8 CMP B ;CHECK FOR 'OK' STATUS 00A8 CAAD00 JZ DJCONT ;SKIP IF LOAD OK 00AB 34 INR M ;MAKE FLAG = 0 00AC 14 INR D ;BUMP ERROR COUNTER 00AD 1D DJCONT: DCR E ;BUMP SECTOR COUNT 00AE 23 INX H ;BUMP TABLE POINTER 00AF C2A100 JNZ DJLOOP 00B2 7A MOV A,D ;CHECK OUT ERROR COUNTER 00B3 B7 ORA A 00B4 CA00AC JZ CBOOT ;START CP/M IF NO ERRORS 00B7 35 DCR M ;DROP RETRY COUNTER 00B8 C28F00 JNZ DJSTRT ;RETRY LOAD OPERATION 00BB C3BB00 JMP $ ;DYNAMIC ERROR HALT ;DJDMA COMMAND STRINGS ;--------------------- ; ;SET THE DMA ADDRESS 00BE 23 COMMND: DB SETDMA 00BF 0094 DW LOADDR-512 ;START AT CCP IF MICRON EQ FALSE 00C1 00 DB 0 ;EXTENDED ADDRESS FOR CP/M ELSE DB 0FFH ;WRAP AROUND FROM FFFF00 TO 000100 ENDIF ;READ A TRACK 00C2 29 DB REDTRK 00C3 00 DB 0 ;TRACK 0 00C4 00 DB 0 ;SIDE 0 00C5 00 DB 0 ;DRIVE 0 00C6 DD00 DW SECTB0 ;SECTOR TABLE 0 CP/M MACRO ASSEM 2.0 #008 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs 00C8 00 DB 0 ;EXTENDED ADDRESS 00C9 00 DB 0 ;RETURNED STATUS ;SET THE DMA ADDRESS 00CA 23 DB SETDMA 00CB 00A1 DW LOADDR+TRKOFF ;LOAD ADDRESS FOR TRACK 1 00CD 00 DB 0 ;EXTENDED ADDRESS ;READ A TRACK 00CE 29 DB REDTRK 00CF 01 DB 1 ;TRACK 1 00D0 00 DB 0 ;SIDE 0 00D1 00 DB 0 ;DRIVE 0 00D2 F700 DW SECTB1 ;SECTOR TABLE 1 00D4 00 DB 0 ;EXTENDED ADDRESS 00D5 00 DB 0 ;RETURNED STATUS ;HALT COMMAND 00D6 25 DB DJHALT 00D7 00 DJDONE: DB 0 ;RETURNED STATUS ;SECTOR TABLES FOR READ TRACK COMMAND ;------------------------------------ ; 1) BOOT + 5CH CONTAINS 'CONFIGURATION BYTE' FOR 5" SYSTEMS ; 00DD ORG BOOT+5DH 00DD FFFFFFFF SECTB0: DW 0FFFFH, 0FFFFH ;DO NOT LOAD BOOT LOADER 00E1 0000000000 DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;22 SECTORS TO BE LOADED 00F7 0000000000SECTB1: DW 0, 0, 0, 0FF00H ;FIRST SEVEN SECTORS ;OTHER STORAGE ;------------- ; 00FF 0A DB RETRIES ;RETRY COUNTER 00FF = ENDTBL EQU $-1 ;END OF TABLE MARKER ENDIF ;END OF 8" DJDMA COLD BOOT LOADER PAGE CP/M MACRO ASSEM 2.0 #009 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs IF (MFORDER EQ 1) ;********************************************************************** ;COLD BOOT LOADER FOR THE DISK JOCKEY DMA CONTROLLER USING 5 1/4" DISKS ;********************************************************************** ; ;DJDMA DISK CONTROLLER (5 1/4" DISKS) ;==================================== ; 1) THE WARM BOOT STARTS FROM TRACK 0 SECTOR 1 AND CONTINUES ; THROUGH TO TRACK 1 SECTOR 1. ; 2) THE COLD BOOT LOADER (TRACK 0, SECTOR 0) IS LOADED INTO ; RAM AT 80H. THIS LOADER WILL START LOADING FROM TRACK 0, ; SECTOR 1 AND STOPS AT TRACK 1, SECTOR 9. THE LOAD ; SEQUENCE IS AS FOLLOWS: ; ; TRACK SECTOR SYSGEN LOAD ORDER NAME ; 0 0 900 80 0 COLD BOOT ; 0 1 B00 9500 1 CCP ; 0 2 D00 9700 2 ; 0 3 F00 9900 3 ; 0 4 1100 9B00 4 ; 0 5 1300 9D00 5 BDOS ; 0 6 1500 9F00 6 ; 0 7 1700 A100 7 ; 0 8 1900 A300 8 ; 0 9 1B00 A500 9 ; ; 1 0 1D00 A700 10 ; 1 1 1F00 A900 11 ; 1 2 2100 AB00 12 CBIOS ; 1 3 2300 AD00 13 ; 1 4 2500 AF00 14 ; 1 5 2700 B100 15 ; 1 6 2900 B300 16 ; 1 7 2B00 B500 17 ; 1 8 2D00 B700 18 ; 1 9 2F00 B900 19 PAGE ;5 1/4" DJDMA EQUATES ;==================== ; ;DEFINE BOOT ADDRESS FOR DJDMA BOOT EQU 80H ORG BOOT DJKICK EQU 0EFH ;I/O PORT TO START DJDMA CONTROLLER ACTIVITY CHANNL EQU 50H ;DEFAULT CHANNEL ADDRESS TRKOFF EQU 9*512 ;NUMBER OF BYTES LOADED FROM TRACK 0 SETDMA EQU 23H ;SET DMA ADDRESS DJHALT EQU 25H ;HALT CONTROLLER DJBRAN EQU 26H ;BRANCH CONTROLLER COMMAND REDTRK EQU 29H ;READ TRACK COMMAND CP/M MACRO ASSEM 2.0 #010 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs LOAD2 EQU 100H ;READ OFFSET#2 FOR MOVCPM OFFSET EQU 900H-BOOT ;READ OFFSET FOR DDT PAGE ;BEGIN 5 1/4" DJDMA EXECUTABLE CODE ;================================== ; MVI A,DJBRAN ;LOAD BRANCH CHANNEL COMMAND STA CHANNL LXI H,COMMND ;LOAD NEW COMMAND CHANNEL ADDRESS SHLD CHANNL+1 XRA A STA CHANNL+3 DJSTRT: OUT DJKICK ;START CONTROLLER DJWAIT: LDA DJDONE ;GET FINAL STATUS ORA A ;0 = STILL BUSY JZ DJWAIT ;LOOP IF BUSY LXI H,SECTB0 ;CHECK FOR BAD LOAD LXI B,40FFH ;B = OK, C = LOADED LXI D,ENDTBL-SECTB0 ;ERROR COUNT + # OF SECTORS DJLOOP: MOV A,M ;LOAD SECTOR CODE CMP C ;CHECK FOR 0FFH (ALREADY LOADED) JZ DJCONT ;SKIP IF LOAD WAS 'OK' MOV M,C ;LOAD 'LOADED' FLAG CMP B ;CHECK FOR 'OK' STATUS JZ DJCONT ;SKIP IF LOAD OK INR M ;MAKE FLAG = 0 INR D ;BUMP ERROR COUNTER DJCONT: DCR E ;BUMP SECTOR COUNT INX H ;BUMP TABLE POINTER JNZ DJLOOP MOV A,D ;CHECK OUT ERROR COUNTER ORA A JZ CBOOT ;START CP/M IF NO ERRORS DCR M ;DROP RETRY COUNTER JNZ DJSTRT ;RETRY LOAD OPERATION JMP $ ;DYNAMIC ERROR HALT ;DJDMA COMMAND STRINGS ;--------------------- ; ;SET THE DMA ADDRESS COMMND: DB SETDMA DW LOADDR-512 ;START AT CCP IF MICRON EQ 0 DB 0 ;EXTENDED ADDRESS FOR CP/M ELSE DB 0FFH ;WRAP AROUND FROM FFFF00 TO 000100 ENDIF ;READ A TRACK DB REDTRK DB 0 ;TRACK 0 CP/M MACRO ASSEM 2.0 #011 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs DB 0 ;SIDE 0 DB 0 ;DRIVE 0 DW SECTB0 ;SECTOR TABLE 0 DB 0 ;EXTENDED ADDRESS DB 0 ;RETURNED STATUS ;SET THE DMA ADDRESS DB SETDMA DW LOADDR+TRKOFF ;LOAD ADDRESS FOR TRACK 1 DB 0 ;EXTENDED ADDRESS ;READ A TRACK DB REDTRK DB 1 ;TRACK 1 DB 0 ;SIDE 0 DB 0 ;DRIVE 0 DW SECTB1 ;SECTOR TABLE 1 DB 0 ;EXTENDED ADDRESS DB 0 ;RETURNED STATUS ;HALT COMMAND DB DJHALT ;HALT CONTROLLER DJDONE: DB 0 ;RETURNED STATUS ;SECTOR TABLES FOR READ TRACK COMMAND ;------------------------------------ ; 1) BOOT + 5CH CONTAINS 'CONFIGURATION BYTE' FOR 5" DRIVES ORG BOOT+5DH SECTB0: DW 0FFH, 0, 0, 0, 0 ;DO NOT LOAD BOOT LOADER SECTB1: DW 0, 0, 0, 0, 0 ;LOAD TEN SECTORS ;OTHER STORAGE ;------------- ; DB RETRIES ;RETRY COUNTER ENDTBL EQU $-1 ;END OF TABLE MARKER ENDIF ;END OF 5 1/4" DJDMA COLD BOOT LOADER PAGE CP/M MACRO ASSEM 2.0 #012 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs IF (FDORDER EQ 1) ;************************************************************* ;COLD BOOT LOADER FOR THE DISK JOCKEY 2D REVISION B CONTROLLER ;************************************************************* ; ;DISK MAP OF THE BOOT SECTORS ;============================ ; 1) THE 'ORDER' COLUMN IS THE INTERLEAVE SEQUENCE USED BY THE ; LOADER DURING THE LOAD. ; 2) THREE SPARE SECTORS (TRACK 0, SECTORS 2 TO 4) HAVE BEEN ; PROVIDED FOR A MORE ADVANCED BOOT LOADER AT A LATER DATE. ; 3) THE WARM BOOT LOADER STARTS ON TRACK 0, SECTOR 5 AND ; CONTINUES THROUGH TO TRACK 1 SECTOR 3. ONLY THE FIRST ; 3/4 K BYTES OF TRACK 1, SECTOR 3 IS LOADED SINCE CP/M ; REQUIRES THAT THE WARM BOOT LOADER LOAD UP TO THE START ; OF (BUT NOT PAST) THE CBIOS JUMP TABLE. ; ; TRACK SECTOR SYSGEN LOAD ORDER NAME ; ; 0 1 900 FF00 0 BOOT LOADER ; 0 2 980 UNUSED ; 0 3 A00 ; 0 4 A80 ; 0 5 B00 9100 1 CCP ; 0 6 B80 9180 12 ; 0 7 C00 9200 2 ; 0 8 C80 9280 13 ; 0 9 D00 9300 3 ; 0 10 D80 9380 14 ; 0 11 E00 9400 4 ; 0 12 E80 9480 15 ; 0 13 F00 9500 5 ; 0 14 F80 9580 16 ; 0 15 1000 9600 6 ; 0 16 1080 9680 17 ; 0 17 1100 9700 7 ; 0 18 1180 9780 18 ; 0 19 1200 9800 8 ; 0 20 1280 9880 19 ; 0 21 1300 9900 9 BDOS ; 0 22 1380 9980 20 ; 0 23 1400 9A00 10 ; 0 24 1480 9A80 21 ; 0 25 1500 9B00 11 ; 0 26 1580 9B80 22 ; ;TRACK 1 IS RECORDED IN DOUBLE DENSITY FORMAT. THERE ARE ;1024 BYTES PER SECTOR. ; ; 1 1 1600 9C00 4 ; 1 2 1A00 A000 1 ; 1 3 1E00 A400 5 CBIOS (@ A700H) ; 1 4 2200 A800 2 ; 1 5 2600 AC00 6 CP/M MACRO ASSEM 2.0 #013 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs ; 1 6 2A00 B000 3 ; 1 7 2E00 B400 7 ; 1 8 3200 B800 UNUSED PAGE ;DJ2DB EQUATES ;============= ; ;DEFINE BOOT ADDRESS FOR DJ2DB BOOT EQU DJRAM+300H ;UPPER 3/4 OF ON BOARD FLOPPY RAM ORG BOOT ORIGIN EQU 0F800H ;ORGIN OF DJ 2D MOD B PROM DJRAM EQU ORIGIN+400H ;DISK JOCKEY 2D MOD B ROUTINES TKZERO EQU ORIGIN+9H ;TRACK 0 SEEK TRKSET EQU ORIGIN+0CH ;SET TRACK SETSEC EQU ORIGIN+0FH ;SET SECTOR SETDMA EQU ORIGIN+12H ;SET DMA ADDRESS DREAD EQU ORIGIN+15H ;READ SECTOR DMAST EQU ORIGIN+24H ;GET DMA ADDRESS STATUS EQU ORIGIN+27H ;DISK STATUS DSKERR EQU ORIGIN+2AH ;FLASH ERROR LIGHT SETDEN EQU ORIGIN+2DH ;SET DENSITY LOAD2 EQU 100H ;READ OFFSET#2 FOR MOVCPM OFFSET EQU 900H-BOOT ;READ OFFSET FOR DDT PAGE ;BEGIN DJ2DB EXECUTABLE CODE ;=========================== T0BOOT: MVI A,5-2 ;FIRST SECTOR - 2 NEWSEC EQU $-1 INR A ;UPDATE SECTOR # INR A CPI 27 ;SIZE OF TRACK IN SECTORS + 1 TRKSIZ EQU $-1 JC NOWRAP ;SKIP IF NOT AT END OF TRACK JNZ T1BOOT ;DONE WITH THIS TRACK EXIT EQU $-2 SUI 27-6 ;BACK UP TO SECTOR 6 BACKUP EQU $-1 LXI H,LOADDR-80H ;MEMORY ADDRESS OF SECTOR - 100H NXTDMA EQU $-2 SHLD NEWDMA NOWRAP: STA NEWSEC ;SAVE THE UPDATED SECTOR # MOV C,A CALL SETSEC ;SET UP THE SECTOR CP/M MACRO ASSEM 2.0 #014 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs LXI H,LOADDR-100H ;MEMORY ADDRESS OF SECTOR - 100H NEWDMA EQU $-2 LXI D,100H ;UPDATE DMA ADDRESS SECSIZ EQU $-2 DAD D NOWRP: SHLD NEWDMA ;SAVE THE UPDATED DMA ADDRESS MOV B,H MOV C,L CALL SETDMA ;SET UP THE NEW DMA ADDRESS LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS, TRACK # NXTRTY EQU $-2 FREAD: PUSH B CALL TRKSET ;SET UP THE PROPER TRACK CALL DREAD ;READ THE SECTOR POP B JNC T0BOOT ;CONTINUE IF NO ERROR DCR B JNZ FREAD ;KEEP TRYING IF ERROR JMP DSKERR ;TOO MANY ERRORS, FLASH THE LIGHT T1BOOT: LXI H,CBOOT ;WE JUMP TO CBOOT NEXT TIME SHLD EXIT MVI C,1 ;SELECT DOUBLE DENSITY CALL SETDEN XRA A ;FIRST SECTOR - 2 STA NEWSEC MVI A,8 ;SIZE OF (LOGICAL) TRACK + 1 STA TRKSIZ DCR A ;NUMBER OF SECTORS TO BACK UP STA BACKUP LXI H,LOADDR+0700H ;DMA START ADDRESS FOR FIRST REVOLUTION - 2048 SHLD NEWDMA LXI H,LOADDR+0300H ;DMA START ADDRESS FOR SECOND REVOLUTION - 2048 SHLD NXTDMA LXI H,2048 ;DIFFERENCE BETWEEN DMA ADDRESSES SHLD SECSIZ LXI H,RETRIES*100H+1;MAXIMUM # OF ERRORS, TRACK # SHLD NXTRTY JMP T0BOOT ;GO LOAD IN TRACK 1 ENDIF ;END OF DJ2DB COLD BOOT LOADER PAGE CP/M MACRO ASSEM 2.0 #015 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs IF (MWORDER EQ 1) ;***************************************** ;COLD BOOT LOADER FOR THE HDDMA CONTROLLER ;***************************************** ; ;DISK MAP OF THE BOOT SECTORS (SHUGART SA1000 DISK INTERFACE) ;============================================================ ; 1) SINCE 1K BYTE SECTORS WERE IMPLEMENTED ON THIS DISK ; TRACK 0, SECTOR 1 CONTAINS BOTH THE COLD BOOT LOADER AND ; PART OF THE CCP. THE COLD BOOT LOADER RELOCATES THIS ; PIECE OF THE CCP TO IT PROPER RESTING PLACE AS PART OF ; THE BOOT PROCESS. ; ; TRACK SECTOR SYSGEN LOAD ORDER NAME ; 0 1 900 100 0 COLD BOOT + CCP ; 0 2 D00 9300 1 ; 0 3 1100 9700 2 ; 0 4 1500 9B00 3 BDOS (@ 9D00) ; 0 5 1900 9F00 4 ; 0 6 1D00 A300 5 ; 0 7 2100 A700 6 CBIOS ; 0 8 2500 AB00 7 ; 0 9 2900 AF00 8 ; ; 1 10 2D00 B300 9 PAGE ;HDDMA EQUATES ;============= ; ;DEFINE BOOT ADDRESS FOR HDDMA BOOT EQU 100H ORG BOOT CYL EQU 153 ;SPECIFICATIONS FOR A SEAGATE TECHNOLOGY 506 HEADS EQU 4 ;NUMBER OF HEADS PER CYLINDER SPT EQU 9 ;SECTORS PER TRACK PRECOMP EQU 64 ;CYLINDER TO START WRITE PRECOMENSATION LOWCURR EQU 128 ;CYLINDER TO START LOW CURRENT STEPDLY EQU 30 ;STEP DELAY (0-12.7 MILLISECONDS) HEADDLY EQU 20 ;SETTLE DELAY (0-255 MILLISECONDS) SECTSIZ EQU 7 ;SECTOR SIZE CODE (MUST BE 7 FOR THIS CBIOS) ;0 = 128 BYTE SECTORS ;1 = 256 BYTE SECTORS ;3 = 512 BYTE SECTORS (DEFAULT FOR MICRONIX) ;7 = 1024 BYTE SECTORS (DEFAULT FOR CP/M) ;F = 2048 BYTE SECTORS ;DEFINE CONTROLLER COMMANDS DMAREAD EQU 0 ;READ SECTOR DMAWRIT EQU 1 ;WRITE SECTOR DMARHED EQU 2 ;FIND A SECTOR DMAWHED EQU 3 ;WRITE HEADERS (FORMAT A TRACK) DMALCON EQU 4 ;LOAD DISK PARAMETERS CP/M MACRO ASSEM 2.0 #016 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs DMASSTA EQU 5 ;SENSE DISK DRIVE STATUS DMANOOP EQU 6 ;NULL CONTROLLER OPERATION RESET EQU 54H ;RESET CONTROLLER ATTN EQU 55H ;SEND A CONTROLLER ATTENTION CHAN EQU 50H ;DEFAULT CHANNEL ADDRESS STEPOUT EQU 10H ;STEP DIRECTION OUT STEPIN EQU 0 ;STEP DIRECTION IN BAND1 EQU 40H ;NO PRECOMP, HIGH CURRENT BAND2 EQU 0C0H ;PRECOMP, HIGH CURRENT BAND3 EQU 80H ;PRECOMP, LOW CURRENT TRACK0 EQU 1 ;TRACK ZERO STATUS WFAULT EQU 2 ;WRITE FAULT FROM DRIVE DREADY EQU 4 ;DRIVE READY LOAD2 EQU 100H ;READ OFFSET#2 FOR MOVCPM OFFSET EQU 900H-BOOT ;READ OFFSET FOR DDT PAGE ;BEGIN HDDMA EXECUTABLE CODE ;=========================== ; LXI SP,CSTKHD ;SET UP STACK AT END OF THIS SECTOR LXI H,BOOT+200H ;COPY PART OF CCP UP LXI D,LOADDR LXI B,200H MOVLOP: MOV A,M ;GET A BYTE STAX D ;SAVE IT INX H ;BUMP POINTERS INX D DCX B ;BUMP COUNTER MOV A,B ;TEST FOR END ORA C JNZ MOVLOP LXI B,10*100H+2 ;B = SECTOR COUNT, C = SECTOR # CALL CLODHD JMP CBOOT ;GO TO CP/M CLODHD: PUSH B ;SAVE SECTOR AND COUNT MOV A,C ;LOAD SECTOR STA HDSEC LXI H,LOADDR-200H ;GET DMA ADDRESS (SELF MODIFYING) CDMAHD EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS LXI D,400H DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS SHLD CDMAHD ;SAVE NEW DMA ADDRESS CALL CRDHD ;ATTEMPT A READ POP B ;RECOVER SECTOR NUMBER AND COUNT ; B = COUNT, C = NUMBER DCR B ;UPDATE SECTOR COUNT RZ ;ALL DONE ? INR C ;BUMP SECTOR NUMBER CP/M MACRO ASSEM 2.0 #017 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs JMP CLODHD ;CONTINUE READING PAGE ;LOW LEVEL HDDMA DRIVERS ;------------------------ ; CRDHD DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA ; ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. ; CRDHD: CALL HDSETUP ;SET UP PARAMETERS LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS CRHD: PUSH B ;SAVE ERROR COUNT CALL HDISSUE ;ATTEMPT THE READ POP B ;RESTORE THE ERROR COUNT RNC ;RETURN IF NO ERROR DCR B ;UPDATE ERROR COUNT JNZ CRHD ;TRY AGAIN IF NOT TOO MANY ERRORS ERROR: JMP $ ;DYNAMIC ERROR HALT HDSETUP:SHLD DMADMA ;SET UP DMA ADDRESS CALL HDRESET ;RESET CONTROLLER LDA HDSEC ;SET LOGICAL SECTOR NUMBER DCR A ;RANGE IS ACTAULLY 0-16 CALL DIVSPT ;FIGURE OUT HEAD NUMBER -> (C) ADI SPT ;MAKE REAL SECTOR NUMBER STA DMARG3 MOV A,C STA DMARG2 ;SAVE HEAD NUMBER CMA ;NEGATIVE LOGIC FOR THE CONTROLLER ANI 7 ;3 BITS OF HEAD SELECT RLC ;SHOVE OVER TO BITS 2 - 4 RLC STA DMASEL1 ;SAVE IN COMMAND CHANNEL HEAD SELECT RET DIVSPT: MVI C,0 ;CLEAR HEAD COUNTER DIVSPTX:SUI SPT ;SUBTRACT A TRACKS WORTH OF SECTORS RC ;RETURN IF ALL DONE INR C ;BUMP TO NEXT HEAD JMP DIVSPTX HDRESET:MVI A,(RET) ;ONE TIME CODE STA HDRESET OUT RESET ;SEND RESET PULSE TO CONTROLLER LXI H,DMACHAN ;ADDRESS OF COMMAND CHANNEL SHLD CHAN ;DEFAULT CHANNEL ADDRESS XRA A STA CHAN+2 ;CLEAR EXTENDED ADDRESS BYTE XTHL ;WAIT FOR RESET (AROUND 10 USEC'S) XTHL CALL HDISSUE ;DO LOAD CONSTANTS JC ERROR ;CONTROLLER NOT PRESENT MVI A,DMASSTA ;SENSE STATUS COMMAND STA DMAOP RDYCHEK:CALL HDISSUE ANI DREADY ;CHECK FOR DRIVE READY JNZ RDYCHEK ;LOOP IF NOT READY CP/M MACRO ASSEM 2.0 #018 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs LXI H,0FFFFH SHLD DMASTEP ;DO RECALIBRATE CALL HDISSUE LXI H,0 SHLD DMASTEP ;CLEAR STEP COUNTER SHLD DMARG0 ;CLEAR CYLINDER # SHLD DMARG3 ;CLEAR SECTOR # + READ DISK COMMAND RET HDISSUE:LXI H,DMASTAT ;STATUS BYTE MVI M,0 OUT ATTN ;START CONTROLLER LXI D,0 ;TIME OUT COUNTER MOV B,E ;CONTROLLER BUSY STATUS HDILOOP:MOV A,M ;GET STATUS ORA A ;SET UP CPU FLAGS RM ;RETURN NO ERROR (CARRY RESET) STC RNZ ;RETURN ERROR STATUS XTHL ;WASTE SOME TIME XTHL XTHL XTHL DCX D ;BUMP TIMEOUT COUNTER MOV A,D ORA E JNZ HDILOOP ;LOOP IF STILL BUSY STC ;SET ERROR FLAG RET HDSEC: DB 0 ;CURRENTLY SELECTED SECTOR DMACHAN EQU $ ;COMMAND CHANNEL AREA DMASEL0:DB 10H ;DRIVE SELECT (STEP OUT, DRIVE 0) DMASTEP:DW 0 ;RELATIVE STEP COUNTER DMASEL1:DB 0 ;HEAD SELECT DMADMA: DW 0 ;DMA ADDRESS DB 0 ;EXTENDED ADDRESS DMARG0: DB 0 ;FIRST ARGUMENT DMARG1: DB STEPDLY ;SECOND ARGUMENT (STEPPING TIME) DMARG2: DB HEADDLY ;THIRD ARGUMENT (SETTLE TIME) DMARG3: DB SECTSIZ ;FOURTH ARGUMENT (SECTOR SIZE) DMAOP: DB DMALCON ;OPERATION CODE DMASTAT:DB 0 ;CONTROLLER STATUS BYTE DMALNK: DW DMACHAN ;LINK ADDRESS TO NEXT COMMAND CHANNEL DB 0 ;EXTENDED ADDRESS ORG BOOT+200H CSTKHD EQU $ ;STACK AREA AT END OF SECTOR ENDIF ;END OF HDDMA COLD BOOT LOADER PAGE CP/M MACRO ASSEM 2.0 #019 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs IF (HDORDER EQ 1) ;************************************ ;COLD BOOT LOADER FOR HDC3 CONTROLLER ;************************************ ; ;DISK MAP OF THE BOOT SECTORS (SHUGART SA4000 DISK INTERFACE) ;============================================================ ; 1) THE COLD BOOT LOADER (TRACK 0, SECTOR 1) IS LOADED INTO ; RAM IN THE VERY LAST PART OF THE CBIOS. THIS AREA IS ; USED FOR UNINITIALIZED TABLES AND THUS IS A SAFE PLACE ; FOR THE LOADER. THIS COLD BOOT LOADER WILL START LOADING ; THE CCP FROM TRACK 0, SECTOR 2 AND WILL FINISH UP WITH ; THE LAST PART OF THE CBIOS ON TRACK 0, SECTOR 20. ; 2) THE WARM BOOT LOAD SEQUENCE STARTS AT TRACK 0, SECTOR 2 ; AND GOES STRAIGHT THROUGH TO SECTOR 12. THERE IS STILL ; PLENTY OF ROOM LEFT IN THIS LOADER FOR MORE ADVANCED ; THINGS LIKE SECTOR INTERLEAVING ALTHOUGH THIS IS HARDLY ; NECESSARY ON A HARD DISK. ; ; TRACK SECTOR SYSGEN LOAD ORDER NAME ; 0 1 900 FC00 1 COLD BOOT ; 0 2 B00 9500 2 CCP ; 0 3 D00 9700 3 ; 0 4 F00 9900 4 ; 0 5 1100 9B00 5 ; 0 6 1300 9D00 6 BDOS ; 0 7 1500 9F00 7 ; 0 8 1700 A100 8 ; 0 9 1900 A300 9 ; 0 10 1B00 A500 10 ; 0 11 1D00 A700 11 ; 0 12 1F00 A900 12 ; 0 13 2100 AB00 13 CBIOS ; 0 14 2300 AD00 14 ; 0 15 2500 AF00 15 ; 0 16 2700 B100 16 ; 0 17 2900 B300 17 ; 0 18 2B00 B500 18 ; 0 19 2D00 B700 19 ; 0 20 2F00 B900 20 ; 0 21 3100 UNUSED PAGE ;HDC3 EQUATES ;============ ; ;DEFINE BOOT ADDRESS FOR HDC3 BOOT EQU SIZE-512 ;VERY LAST PART OF CP/M SYSTEM ORG BOOT HDORG EQU 50H ;HARD DISK CONTROLLER HDSTAT EQU HDORG ;HARD DISK STATUS HDCNTL EQU HDORG ;HARD DISK CONTROL HDDATA EQU HDORG+3 ;HARD DISK DATA CP/M MACRO ASSEM 2.0 #020 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs HDFUNC EQU HDORG+2 ;HARD DISK FUNCTION HDCMND EQU HDORG+1 ;HARD DISK COMMAND HDRESLT EQU HDORG+1 ;HARD DISK RESULT RETRY EQU 2 ;RETRY BIT OF RESULT TKZ EQU 1 ;TRACK ZERO BIT OF STATUS OPDONE EQU 2 ;OPERACTION DONE BIT OF STATUS COMPLT EQU 4 ;COMPLETE BIT OF STATUS TMOUT EQU 8 ;TIME OUT BIT OF STATUS WFAULT EQU 10H ;WRITE FAULT BIT OF STATUS DRVRDY EQU 20H ;DRIVE READY BIT OF STATUS INDX EQU 40H ;INDEX BIT OF STATUS PSTEP EQU 4 ;STEP BIT OF FUNCTION NSTEP EQU 0FBH ;STEP BIT MASK OF FUNCTION HDRLEN EQU 4 ;SECTOR HEADER LENGTH SECLN EQU 512 ;SECTOR DATA LENGTH WENABL EQU 0FH ;WRITE ENABLE WRESET EQU 0BH ;WRITE RESET OF FUNCTION SCENBL EQU 5 ;CONTROLLER CONTROL DSKCLK EQU 7 ;DISK CLOCK FOR CONTROL MDIR EQU 0F7H ;DIRECTION MASK FOR FUNCTION NULL EQU 0FCH ;NULL COMMAND IDBUFF EQU 0 ;INITIALIZE DATA COMMAND ISBUFF EQU 8 ;INITIALIZE HEADER COMMAND RSECT EQU 1 ;READ SECTOR COMMAND WSECT EQU 5 ;WRITE SECTOR COMMAND LOAD2 EQU 0H ;READ OFFSET#2 FOR MOVCPM OFFSET EQU 900H-BOOT ;READ OFFSET FOR DDT PAGE ;BEGIN HDC3 EXECUTABLE CODE ;========================== ; LXI SP,CSTKHD ;SET UP STACK AT END OF THIS SECTOR LXI B,19*100H+2 ;B = SECTOR COUNT, C = SECTOR # CALL CLODHD JMP CBOOT ;GO TO CP/M CLODHD: PUSH B ;SAVE SECTOR AND COUNT MOV A,C ;LOAD SECTOR STA HDSEC LXI H,LOADDR-200H ;GET DMA ADDRESS (SELF MODIFYING) CDMAHD EQU $-2 ;STORAGE FOR PREVIOUS DMA ADDRESS LXI D,200H ;OFFSET TO NEW DMA ADDRESS DAD D ;ADD IN OFFSET, HL = NEW DMA ADDRESS SHLD CDMAHD ;SAVE NEW DMA ADDRESS CALL CRDHD ;ATTEMPT A READ POP B ;RECOVER SECTOR NUMBER AND COUNT ; B = COUNT, C = NUMBER DCR B ;UPDATE SECTOR COUNT RZ ;ALL DONE ? INR C ;BUMP SECTOR NUMBER JMP CLODHD ;CONTINUE READING CP/M MACRO ASSEM 2.0 #021 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs PAGE ;LOW LEVEL HDC3 DRIVERS ;---------------------- ; CRDHD DOES THE ACTUAL READ FROM THE CONTROLLER, THE DMA ; ADDRESS AND SECTOR # HAVE ALREADY BEEN SET UP. ; CRDHD: LXI B,RETRIES*100H+1 ;MAXIMUM # OF ATTEMPTS CRHD: PUSH B ;SAVE ERROR COUNT CALL HDREAD ;ATTEMPT THE READ POP B ;RESTORE THE ERROR COUNT RNC ;RETURN IF NO ERROR DCR B ;UPDATE ERROR COUNT JNZ CRHD ;TRY AGAIN IF NOT TOO MANY ERRORS JMP $ ;DYNAMIC ERROR HALT HDREAD: CALL HDPREP ;PREPARE THE SECTOR HEADER IMAGE RC ;ERROR EXIT MVI A,RSECT ;READ SECTOR COMMAND OUT HDCMND CALL PROCESS ;PROCESS THE READ RC ;ERROR EXIT XRA A ;POINTER TO DATA BUFFER OUT HDCMND MVI B,SECLN/4 ;NUMBER OF BYTES TO READ LHLD CDMAHD ;GET DESTINATION OF DATA IN HDDATA ;TWO DUMMY DATA BYTES IN HDDATA RTLOOP: IN HDDATA ;MOVE FOUR BYTES MOV M,A ;BYTE ONE INX H IN HDDATA ;BYTE TWO MOV M,A INX H IN HDDATA ;BYTE THREE MOV M,A INX H IN HDDATA ;BYTE FOUR MOV M,A INX H DCR B ;UPDATE BYTE COUNT JNZ RTLOOP RET PROCESS:IN HDSTAT ;WAIT FOR COMMAND TO FINISH MOV B,A ANI OPDONE JZ PROCESS MVI A,DSKCLK ;TURN ON DISK CLOCK OUT HDCNTL IN HDSTAT ANI TMOUT ;TIMED OUT ? STC RNZ IN HDRESLT ANI RETRY ;ANY RETRIES ? CP/M MACRO ASSEM 2.0 #022 Cold Boot Loader Rev_E4 27_Jan_83 Copyright_1983 Morrow Designs STC RNZ XRA A ;NO ERROR EXIT RET HDPREP: IN HDSTAT ;IS DRIVE READY ? ANI DRVRDY STC RNZ MVI A,ISBUFF ;INITIALIZE POINTER TO HEADER BUFFER OUT HDCMND MVI A,NULL OUT HDFUNC ;SELECT DRIVE A XRA A OUT HDDATA ;FORM HEAD BYTE OUT HDDATA ;FORM TRACK BYTE MVI A,0 ;FORM SECTOR BYTE HDSEC EQU $-1 OUT HDDATA MVI A,80H ;FORM KEY OUT HDDATA MVI A,DSKCLK ;TURN ON DISK CLOCK OUT HDCNTL MVI A,WENABL ;WRITE ENABLE ON OUT HDCNTL RET ORG BOOT+200H-2 ;LAST WORD ON SECTOR IS LOAD ADDRESS CSTKHD EQU $ DW BOOT ENDIF ;END OF HDC3 COLD BOOT LOADER 0100 END