home *** CD-ROM | disk | FTP | other *** search
- ;
- ; TITLE COLD BOOT LOADER FOR NATIONAL SEMICONDUCTIOR 8221
- ; FILENAME NSBOOT.ASM
- ; AUTHOR Robert A. Van Valzah 2/24/79
- ;
- ;
- ;
- ; CONDITIONAL ASSEMBLY EQUATES
- ;
- FALSE EQU 0
- TRUE EQU NOT FALSE
- ;
- REL EQU FALSE ;TRUE TO GENERATE RELOCATABLE CODE
- ;
- MSIZE EQU 32 ;MEMORY AND CPM SYSTEM SIZE
- ;
- ; COMPUTE BASE OF CCP (START OF LOAD)
- ;
- IF REL
- BIAS EQU 0 ;RELOCATOR ASSUMES CCP STARTS AT ZERO
- ENDIF
- ;
- IF NOT REL
- BIAS EQU (MSIZE-16)*1024+2900H
- ENDIF
- ;
- ; COMPUTE OTHER CPM ENTEY POINTS
- ;
- CPMB EQU BIAS ;START OF CCP
- CBOOT EQU BIAS+1500H ;COLD BOOT ENTRY OF CBIOS (BASE OF CBIOS)
- DOSEND EQU BIAS+1700H ;FIRST BYTE PAST END OF CBIOS
- ;
- ; CONTROLLER PORT EQUATES
- ;
- BASE EQU 70H
- ;
- ; OUTPUT PORTS
- ;
- ILOW EQU BASE+1
- IHIGH EQU BASE+2
- ;
- ; INPUT PORTS
- ;
- READY EQU BASE+1
- ERRBITS EQU BASE
- ;
- ; STATUS MASKS
- ;
- BUSY EQU 1000$0000B ;CONTROLLER BUSY FLAG
- ;
- ; DISK COMMANDS
- ;
- READCMD EQU 8 ;READ A SECTOR COMMAND
- ;
- MON80 EQU 0F800H ;MON 80 ENTRY
- ;
- ORG 3000H ;LOADED HERE BY BOOT ROM AND GIVEN CONTROL
- ;
- LXI SP,80H ;SETUP TEMP STACK IN LOW MEM
- ;
- ; SEND ADDRESS OF FIRST IOPB TO CONTROLLER
- ;
-
- MVI B,2 ;NUMBER OF IOPBS TO SEND
- LXI H,BTIOPB1
- SENDADR:
- MOV A,L
- OUT ILOW
- MOV A,H
- OUT IHIGH
- BTWAIT: ;WAIT FOR CONTROLLER TO FINISH
- IN READY
- ANI BUSY
- JNZ BTWAIT
- IN ERRBITS ;GET ERROR BITS FROM CONTROLLER
- ORA A ;ANY ERRORS?
- JNZ MON80 ;NO - BACK TO MON80
- DCR B ;DONE WITH BOTH IOPB'S?
- JZ CBOOT ;YES - ENTER CBIOS TO BRING UP SYSTEM
- LXI H,BTIOPB2 ;NO - SEND SECOND IOPB
- JMP SENDADR
- ;
- ; FIRST BOOT IOPB, READS TRACK 0 STARTING WITH SECTOR 2 INTO CPMB
- ;
- BTIOPB1:
- DB READCMD ;READ WITH NO INTERRUPTS
- DB 26-1 ;READ ALL OF TRACK 0 BUT SECTOR 1 (WHICH HOLDS BOOT)
- DB 0 ;TRACK 0
- DB 2 ;STARTING WITH SECTOR 2
- DW CPMB ;START LOADING AT CPMB
- DB 1 ;SECTOR LENGTH = 128 BYTES
- DB 0FFH ;NORMAL DATA MARK, 3 RETRYS, IBM FORMAT
- ;AND 128 BYTE TRANSFER
- DB 0 ;IGNORE BLOCK TAG
- DB 100B ;SIDE 0, UNBUFFERED, SINGLE DENSITY, LAST IOPB
- DW 0 ;NO NEXT IOPB
- ;
- ; SECOND BOOT IOPB, READ REMAINDER OF DOS FROM TRACK 1 INTO FOLLOWING
- ; MEMORY ADDRESSES
- ;
- BTIOPB2:
- DB READCMD ;READ WITH NO INTERRUPTS
- DB (DOSEND-CPMB)/128-(26-1) ;NUMBER OF SECTORS ON TRACK 1
- DB 1 ;TRACK 1
- DB 1 ;STARTING WITH SECTOR 1
- DW CPMB+(26-1)*128 ;ADDRESS FOLLOWING READ OF FIRST IOPB
- DB 1 ;SECTOR LENGTH = 128 BYTES
- DB 0FFH ;NORMAL DATA MARK, 3 RETRYS, IBM FORMAT,
- ;AND 128 BYTE TRANSFER
- DB 0 ;IGNORE BLOCK TAG
- DB 100B ;SIDE 0, UNBUFFERED, SINGLE DENSITY, LAST IOPB
- DW 0 ;NO NEXT IOPB ADDRESS
- ;
- END
-