|
|
DataMuseum.dkPresents historical artifacts from the history of: Christian Rovsing CR7, CR8 & CR16 CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Christian Rovsing CR7, CR8 & CR16 CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 21888 (0x5580)
Types: TextFile
Names: »SECBOOT.ASM«
└─⟦be0857eee⟧ Bits:30004395 CP/M-86 files - CR8 Dual floppy
└─⟦this⟧ »SECBOOT.ASM«
TITLE 'CR8 - SECONDARY BOOT PROGRAM - DATE: 840117'
PAGE 43
$*MACRO
;*****************************************************************************
;
; WILL EXECUTE DIRECTLY IF BOOTED FROM THE SYSTEM TRACKS BY THE CR8
; PROM BOOTLOADER. THIS IS MADE POSSIBLE BY LETTING THE PROGRAM USE
; THE CR8 PROM I/O ROUTINES DIRECTLY AS THEY ARE PLACED IN RAM BY THE
; BOOTLOADER.
;
;*****************************************************************************
LDADDR EQU 0D000H ;LOAD ADDRESS FOR SYSTEM DISK SOFTWARE
BOOTLEN EQU 01E00H ;LENGTH OF BOOT LOAD FROM SYSTEM DISK MINI
BASE EQU 0D000H ;BASE ADDR FOR THIS MODULE
;DEFINE MEMORY BASED I/O MODULE ENTRY POINTS
;
$-PRINT
;
MODBASE EQU 0F800H ;SET JUMP TABLE STARTING ADDRESS
;
INITSER EQU MODBASE+00 ;INITIALIZE MP-SQUARE HARDWARE
; ;(NO PARAMETERS)
SETCBAUD EQU MODBASE+03 ;SET CONSOLE I/O BAUD RATE FACTOR
; ;(HL) = COUNTER TIMER PARAMETER VALUE
SETLBAUD EQU MODBASE+06 ;SET LINE PRINTER I/O BAUD RATE FACTOR
; ;(HL) = COUNTER TIMER VALUE
SETLRMSK EQU MODBASE+09 ;SET LINE PRINTER SIO RECEIVER MASK VALUE
; ;(A) = LINE PRINTER SIO MASK BYTE
SETLRVAL EQU MODBASE+012 ;SET LINE PRINTER SIO RECEIVER POLL VALUE
; ;(A) = LINE PRINTER POLL VALUE
SETLTMSK EQU MODBASE+015 ;SET LINE PRINTER SIO TRANSMITTER MASK VALUE
; ;(A) = LINE PRINTER SIO MASK BYTE
SETLTVAL EQU MODBASE+018 ;SET LINE PRINTER SIO TRANSMITTER POLL VALUE
; ;(A) = LINE PRINTER SIO POLL VALUE BYTE
CONSTAT EQU MODBASE+021 ;GET CONSOLE STATUS
; ;RETURN (A)=00 FOR NOT READY INPUT
; ; (A)=FF FOR READY INPUT
CONIN EQU MODBASE+024 ;GO GET CONSOLE INPUT CHARACTER
; ;(A)=INPUT CONSOLE CHARACTER
CONOUT EQU MODBASE+027 ;PUT OUT CONSOLE CHAR
; ;(C)=CHARACTER TO OUTPUT
LPTSTAT EQU MODBASE+030 ;GET LINE PRINTER STATUS
; ;RETURN (A)=00 FOR NOT NEXT OUTPUT
; ; (A)=FF FOR READY OUTPUT
LPTIN EQU MODBASE+033 ;GO GET LINE PRINTER INPUT CHARACTER
; ;(A)=INPUT LPT SERIAL PORT CHARACTER
LPTOUT EQU MODBASE+036 ;PUT OUT LINE PRINTER CHARACTER
; ;(C)=LPT SERIAL OUTPUT CHARACTER
HUNIT EQU MODBASE+039 ;SELECT HARD DISK UNIT NUMBER
; ;(C)=UNIT NUMBER ON MSC 9205 CONTROLLER
HPLAT EQU MODBASE+042 ;SELECT HARD DISK PLATTER (HEAD) NUMBER
; ;(C)=HEAD SELECT NUMBER
HSURF EQU MODBASE+045 ;SELECT HARD DISK SURFACE(HEAD 2^2) NUMBER
; ;(C)=MSB OF HEAD NUMBER
HCYL EQU MODBASE+048 ;SELECT HARD DISK CYLINDER NUMBER
; ;(BC)=CYLINDER NUMBER
HREC EQU MODBASE+051 ;SELECT HARD DISK RECORD NUMBER
; ;(C)=RECORD NUMBER
HCNT EQU MODBASE+054 ;SELECT HARD DISK SECTOR COUNT
; ;(C)=RECORD COUNT
HBADDR EQU MODBASE+057 ;SET 9205 CONTROLLER DMA ADDRESS
; ;(BC)=16 BIT DATA BUFFER ADDRESS
HREST EQU MODBASE+060 ;RESTORE SELECTED HARD DISK UNIT
; ;(A) RETURNS ERROR CODE
HREAD EQU MODBASE+063 ;READ SELECTED SECTOR(S)
; ;(A) RETURNS ERROR CODE
HVERF EQU MODBASE+066 ;VERIFY SELECTED SECTOR(S)
; ;(A) RETURNS ERROR CODE
HWRIT EQU MODBASE+069 ;WRITE SELECTED SECTOR(S)
; ;(A) RETURNS ERROR CODE
HEXEC EQU MODBASE+072 ;EXECUTE SPECIAL COMMAND OF MSC 9205
; ;(C) ENTRY WITH MSC 9205 COMMAND
; ;(A) RETURNS ERROR CODE
HRESET EQU MODBASE+075 ;RESET HARD DISK CONTROLLER MSC 9205
; ;NO PARAMETERS
MUNIT EQU MODBASE+078 ;SELECT MINI FLOPPY UNIT NUMBER
; ;(C)=FLOPPY PHYSICAL UNIT NUMBER
MSURF EQU MODBASE+081 ;SELECT MINI FLOPPY SURFACE(HEAD) NUMBER
; ;(C)=FLOPPY SIDE NUMBER
MCYL EQU MODBASE+084 ;SELECT MINI FLOPPY CYLINDER(TRACK) NUMBER
; ;(C)=FLOPPY TRACK NUMBER
MREC EQU MODBASE+087 ;SELECT MINI FLOPPY RECORD NUMBER
; ;(C)=FLOPPY SECTOR NUMBER
MCNT EQU MODBASE+090 ;SELECT MINI FLOPPY PHYSICAL SECTOR COUNT
; ;(C)=MINI FLOPPY SECTOR COUNT
MSIZE EQU MODBASE+093 ;SELECT FLOPPY SECTOR SIZE (00)=256 BYTES
; ;(C)=MINI FLOPPY TRACK NUMBER
MBADDR EQU MODBASE+096 ;SET FLOPPY DISK DATA BUFFER ADDRESS
; ;(BC)=FLOPPY BUFFER ADDRESS
MREST EQU MODBASE+099 ;RESTORE SELECTED MINI FLOPPY UNIT
; ;(A)=RETURNS ERROR STATUS
MVERF EQU MODBASE+102 ;VERIFY (READ) SELECTED SECTOR
; ;(A)=RETURNS STATUS
MWRIT EQU MODBASE+105 ;WRITE SELECTED SECTOR
; ;(A)=RETURNED STATUS
MREAD EQU MODBASE+108 ;READ SELECTED SECTOR
; ;(A)=RETURNED STATUS
MWTRK EQU MODBASE+111 ;WRITE SELECTED FLOPPY TRACK
; ;(A)=RETURNED STATUS
MMODE EQU MODBASE+114 ;SET FLOPPY OPERATION MODE
; ;(C)=STANDARD MODE DEFINITION
MINST EQU MODBASE+117 ;FETCH CURRENT INSTRUCTION CODE
; ;(A)=RETURNED INSTRUCTION PATTERN
MMOFF EQU MODBASE+120 ;CHECK MINI FLOPPY MOTOR ON COUNT
; ;OUT TIMER
$+PRINT
MACLIB CR8PORTS
MACLIB Z80
;
;MACROS
;DISPLAY TEXT STRING
;
DISPLAY MACRO @MSGPTR
LXI H,@MSGPTR ! CALL CRTMSG
ENDM
;SAVE (PUSH)REGISTERS EXCEPT PSW
;
SAVER MACRO
PUSH H ! PUSH D ! PUSH B
ENDM
;RESTORE REGISTERS AS SAVED BY "SAVER" AND RETURN
;
RESTRET MACRO
POP B ! POP D ! POP H ! RET
ENDM
;
;*****************************************************************************
;BOOTLOADER INFORMATION FOR MINI FLOPPY SYSTEM TRACKS
;
ORG LDADDR - 200H
DW LDADDR ;BOOT LOAD START ADDRESS IN RAM
DW BOOTLEN ;LENGTH OF BOOT LOAD FROM MINI FLOPPY
DW 0008H ;CONSOLE_0 BAUDRATE FACTOR (DEFAULT IS 9600 BAUD)
DW 0008H ;LINE PRINTER_0 - - - - - -
DB 24H,24H ; - - TX MASK/READY VAL
DB 01H,01H ; - - RX - - -
DW BASE ;START ADDRESS (TO BE USED AFTER BOOT LOAD COMPLETION):
;I.E. START OF SYSDISK PROGRAM
;*****************************************************************************
; S T A R T A D D R E S S
;
ORG BASE
ENTRY EQU $
JMP START
;-----------------------------------------------------------------------------
PAGE
;*****************************************************************************
; CHARACTER EQUATES
;
ETX EQU 003H
TAB EQU 009H
EOF EQU 01AH
SPC EQU 020H
CTRLC EQU ETX
; FCB EQUATES
;
FCBEXT EQU 12 ;FCB EXTENT OFFSET
FCBS2 EQU 14 ; - S2 BYTE
FCBCR EQU 32 ; - CURRENT RECORD
FCBLEN EQU 36 ; - LENGTH
; MISC. EQUATES
;
RESTART EQU 0 ;
;
CNFLOC EQU 0A000H ;START ADDR. OF CONFIG TABLE
TMPLOC EQU 00100H ;START ADDR. OF TEMPORARY FILE
SCILOC EQU 02000H ;REAL START ADDR. OF SCIFILE
TABOFF EQU 040H ;BLOCK OFFSET IN CONFIG TABLE
PG8088 EQU CNFLOC+TABOFF ;ADDR. OF 8088 BLOCK
PGZ80 EQU CNFLOC+(TABOFF*02H);ADDR. OF Z80 BLOCK
FIADOF EQU 030H ;OFFSET TO FILE ADDR.
SMADOF EQU 032H ;OFFSET TO SEMAPHORE ADDR.
SEMZ80 EQU PGZ80+SMADOF ;ADDR OF Z80 SEMAPHORE ADDR
;
BIOSENT EQU 0E600H ;
BIOSBO EQU BIOSENT+01H ;ADDR OF BIOS JUMP TABLE( JMP BOOT )
BIOSWB EQU BIOSENT+04H ; " " " " " ( JMP WBOOT )
BIOSCB EQU BIOSENT+33H ; " " " " " ( JMP CBCPMIN )
;CONSOLE INPUT ROUTINE (RETURNS CHARACTER IN A REGISTER)
;(ALL OTHER REGISTERS UNCHANGED)
;
CI: SAVER
CALL CONIN
RESTRET
;CONSOLE OUTPUT ROUTINE (OUTPUT CHARACTER FROM C REG)
;DESTROYS: PSW (ALL OTHER REGISTERS UNCHANGED)
;
CO: SAVER
CALL CONOUT
RESTRET
;CONSOLE TERMINAL STATUS ROUTINE
; RETURNS A=00 IF NO CHARACTER PRESENT
; RETURNS A=FF IF CHARACTER PRESENT
;(ALL OTHER REGISTERS UNCHANGED)
;
CSTS: SAVER
CALL CONSTAT
RESTRET
PAGE
;*****************************************************************************
;ROUTINE TO DISPLAY A MESSAGE ON THE CRT. REGISTERS (HL) POINT TO THE
;MESSAGE. END OF MESSAGE IS INDICATED BY 0 (ZERO VALUE, I.E. 'NULL' CHAR).
;DESTR: PSW, HL
;
CRTMSG: PUSH B
CRTMS1: MOV A,M ;REPEAT
ANA A ; IF CHAR=0
JRZ CRTMSX ; THEN EXIT
MOV C,A ; ELSE
CALL CO ; WRITE CHAR
INX H ; POINT TO NEXT
JR CRTMS1 ;END
CRTMSX: POP B
RET
;*****************************************************************************
;ROUTINE TO PRINT A CR/LF FOLLOWED BY A FULL LINE OF THE CHAR IN (A)
;DESTROYS: PSW
;
WRLINE: PUSH B
CALL CRLF
MVI B,80 ;SET NUMBER OF CHARS
CALL MULTCH
POP B
RET
;*****************************************************************************
;ROUTINE TO PRINT A CHARACTER A SPECIFIED NUMBER OF TIMES
; (A)=CHAR, (B)=COUNT
;DESTROYS: PSW, BC
;
MULTCH: MOV C,A ;GET CHAR
MULTC1: CALL CO
DJNZ MULTC1
RET
;*****************************************************************************
;SEND CR/LF TO CONSOLE
;DESTROYS: NOTHING
;
CRLFLF: CALL CRLF
CRLF: PUSH PSW
PUSH B
MVI C,CR
CALL CO
MVI C,LF
CALL CO
POP B
POP PSW
RET
;*****************************************************************************
;CLEAR SCREEN (ASSUMING 'ESC Æ2J' WILL DO THE JOB)
;DESTROYS: PSW
;
CLRSCR: PUSH H
DISPLAY CSMSG
POP H
RET
CSMSG: DB CR,ESC,'Æ2J',ESC,'ÆH',0 ;CLEAR SCREEN
;*****************************************************************************
;ERASE CURRENT LINE AND POSITION CURSOR IN BEGINNING OF LINE
;DESTROYS: NOTHING
;
ERALIN: PUSH PSW
PUSH H
DISPLAY ERALMS
POP H
POP PSW
RET
ERALMS: DB ESC,'ÆM',CR,0 ;ERASE CURRENT LINE AND PUT CURSOR IN BEGINNING
PAGE
;*****************************************************************************
; X B D O S I N T E R F A C E
;
BDOSENT EQU 0D806H ;XBDOS ENTRY POINT IN THIS CONFIG
RESDS EQU 13 ; - RESET DISK SYSTEM (AND SELECT A)
SELDS EQU 14 ; - SELECT DISK FCT (DISK IN REG E)
OPENF EQU 15 ; - OPEN FILE
CLOSEF EQU 16 ; - CLOSE -
DELETEF EQU 19 ; - DELETE -
READSEQ EQU 20 ; - READ SEQUENTIAL
WRITSEQ EQU 21 ; - WRITE -
MAKEF EQU 22 ; - MAKE FILE
SDMA EQU 26 ; - SET DMA ADDR
;MACRO TO INVOKE XBDOS FUNCTIONS.
;
INVOKE MACRO @INVFCT
MVI C,@INVFCT ! CALL BDOSENT
ENDM
;
RESDSK: SAVER
INVOKE RESDS
JR BDOSEX
;
SELDSK: SAVER
INVOKE SELDS ;SELECT DISK IN (E) (0=A,...)
JR BDOSEX
;
OPEN: SAVER
PUSH D
POPIX ;IX POINTS TO FCB
XRA A
STX A, FCBEXT ;RESET 'EXT' FIELD
STX A, FCBCR ; - 'CR' -
INVOKE OPENF
JR BDOSEX
;
CLOSE: SAVER
INVOKE CLOSEF
JR BDOSEX
;
DELETE: SAVER
INVOKE DELETEF
JR BDOSEX
;
READ: SAVER
INVOKE READSEQ
JR BDOSEX
;
WRITE: SAVER
INVOKE WRITSEQ
JR BDOSEX
;
MAKE: SAVER
PUSH D
POPIX ;IX POINTS TO FCB
XRA A
STX A, FCBEXT ;RESET 'EXT' FIELD
STX A, FCBCR ; - 'CR' -
INVOKE MAKEF
JR BDOSEX
;
SETDMA: SAVER
INVOKE SDMA
JR BDOSEX
;
BDOSEX: RESTRET ;RESTORE REGISTERS AND RETURN FROM XBDOS FCT
;*****************************************************************************
;PROCEDURE TO GET A FILE INTO A GIVEN LOAD ADDRESS
;NOTE: THE MAX SIZE OF THE FILE TO BE LOADED IS 7F00H (A BIT LESS THAN 32K).
;ENTRY: HL = LOAD ADDRESS
; DE = PTR TO FCB
;RETURNS: HL = ADDR OF FIRST BYTE AFTER LOADED BLOCK
; A = STATUS CODE (0=OK, 1=FILE NOT FOUND, 2=LOAD ERROR)
;DESTROYS: PSW
;
MAXBFP EQU 0D7H ;LAST LEGAL PAGE FOR LOAD
;
GETFILE:
PUSH B
CALL OPEN
INR A ;TEST OPEN STATUS
JRZ BADOPN ;BAD: GO EXIT (A=0)
MVI A, MAXBFP
SUB H ;TEST LOCATION OF LOAD
JRC GETBAD ;QUIT IF...
JRZ GETBAD ;...TOO HIGH
CPI 80H ;IS THIS MAX AT ALL POSSIBLE
JRC GFADJ
MVI B, 0FFH ;NO: USE ABSOLUTE MAX AS 128 BYTE BLOCK COUNT
JR GFRDY
GFADJ: RLC ;YES: ADJUST FOR REAL MAX COUNT
MOV B,A ;USE FOR NUMBER OF READS
GFRDY: XRA A
PUSH D
POPIX ;IX POINTS TO FCB
STX A, FCBEXT ;RESET 'EXT' FIELD
STX A, FCBCR ; - 'CR' -
GETINP: XCHG ;(DE)=BUFFER
CALL SETDMA
XCHG ;(DE)=FCB
CALL READ
ORA A
JRNZ ENDGET ;GOT EOF. END OF READ
MOV A,B ;TEMP SAVE OF COUNT
LXI B,128
DAD B ;UPDATE LOAD ADDR
MOV B,A
DJNZ GETINP ;LOOP IF FILE NOT TOO LARGE
;EXIT FROM LOOP IF LOAD NOT TERMINATED BEFORE "MAX COUNTER" COUNTED DOWN TO 0
;
GETBAD: MVI A, 1 ;ENTER HERE FOR A TO BECOME 2
BADOPN: INR A ; - - WITH A=0 (BECOMES 1)
JR GETFEX ;GO RETURN 1 0R 2
ENDGET: XRA A ;RETURN 0 FOR OK STATUS
GETFEX: POP B
RET
;*****************************************************************************
;PROCEDURE TO TEST IF SCI BOARD IS READY.(HANDSHAKE)
;ENTRY: HL = PTR TO SCI PAGE
;RETURNS: A = STATUS ERROR/SCIOK
;
SCIREQ EQU 06FFEH ;BOOT REQUEST BYTE ADDRESS
SCIRDY EQU 080H ;
SCIOK EQU 000H ;
SCIERR EQU 0FFH ;
;
REQFLG: DB 0H ;
ACKFLG: DB 0H ;
;
SCITST: PUSH B ;
PUSH D ;
PUSH H ;SAVE REG
IN P$RAMCTL ;
ORI 10H ;ENABLE BUS TIME OUT
OUT P$RAMCTL ;
MOV A,M ;GET SCI MAP REG VALUE (FROM Z80 TO SCI)
LXI H,REQFLG ;SOURCE
LXI D,SCIREQ ;DESTINATION
LXI B,02H ;NUMBER OF BYTES TO MOVE
CALL DMAMOV ;SET (SCIREQ)=0 AND (SCIACK)=0
MVI B,08H ;LOOP COUNT
SCIWAI: PUSH B ;
MVI A,0FFH ;
CALL SDLY ;TIME DELAY (A REG)*1MSEC
POP B ;
POP H ;
PUSH H ;
PUSH B ;
MOV A,M ;GET SCI MAP REG VALUE (FROM Z80 TO SCI)
RLC ;
RLC ;
RLC ;
RLC ;A=SCI MAP REG (FROM SCI TO Z80)
LXI H,SCIREQ ;SOURCE
LXI D,REQFLG ;DESTINATON
LXI B,01H ;NUMBERS OF BYTES TO MOVE
CALL DMAMOV ;GET (SCIREQ)
LXI H,REQFLG ;
MOV A,M ;
CPI SCIRDY ;
JZ RDTOLD ;SCI BOARD IS READY TO LOAD
POP B ;GET LOOP COUNT
DJNZ SCIWAI ;IF LOOP COUNT =0 THEN
MVI A,SCIERR ;
JMP TSTEND ;
;
RDTOLD: MVI A,SCIOK ;
POP B ;
TSTEND: LXI H,REQFLG ;RESET REQFLG
MVI M,0H ;
PUSH PSW ;
IN P$RAM$CTL ;
ANI 0EFH ;DISABLE BUS TIME OUT
OUT P$RAM$CTL ;
POP PSW ;
POP H ;RESTORE REGISTER
POP D ;
POP B ;
RET ;
;
PAGE
;*****************************************************************************
; M A I N P R O G R A M
;
START:
LXI SP,PGMSTK ;INIT STACKPOINTER
LXI H,MHFLG ;MINIHARD FLAG (00=FLOOPY BOOT)
MOV M,B ; (FF=WINCHESTERBOOT)
LXI H,BTUNIT ;BOOTUNIT (00/01 IF FLOPPYBOOT)
MOV M,C ; (00/03 IF WINCHESTERBOOT)
INR C ;
LXI H,CNFFCB ;SET DRIVE NO IN CONFIG TABLE FCB
MOV M,C ;
SDED DATBF ;DATBF (POINTER TO PARAMETER SECTOR
; BUFFER)
;
START1: CALL CLRSCR ;
MVI A,00H ;
STA 0004H ;CURRENT DEFAULT DRIVE NUMBER (0=A)
LXI H,DUMMY ;
SHLD BIOSBO ;CHANGE IN BIOS JUMP TABLE
SHLD BIOSWB ;
MVI A, 0C3H ;
STA 0000H ;
STA 0005H ;
LXI H, ENTRY ;
SHLD 0001H ;PUT 'JUMP RESTART' INTO ADDR 0
LXI H, BDOSENT ;
SHLD 0006H ;PUT 'JUMP BDOS ENTRY' AT ADDR 5
CALL RESDSK ;
LXI H,BTUNIT ;
MOV E,M ;(A=0....)
CALL SELDSK ;
DISPLAY CRASMS ;'CRAS' MESSAGE
MVI A,'*'
CALL WRLINE ;LINE OF '*'
START2: DISPLAY CNFMSG ;LOADING CONFIGURATION TABLE
LXI D,CNFFCB
LXI H,CNFLOC
CALL GETFILE
ORA A ;
JNZ ERRCNF ;LOADING ERROR
;
LDSCI:
LXI H,PGZ80 ;PTR TO Z80 PAGE
LDNSCI: LXI D,TABOFF ;
DAD DE ;PTR TO SCI PAGE (MAP REG VALUE)
MOV A,M ;
ORA A ;CHECK IF SCI PAGE <> 0
JZ LD8088 ;
IN P$SWITCH$2 ;GET STATUS OF SWITCH 2
ANI 02H ; IF BIT1=1 <=> SCI BOARD NOT AVAILABLE
; BIT1=0 <=> " " IS "
JZ LD0 ;
DISPLAY NOSW ;
JMP LD8088 ;
LD0: PUSH H ;SAVE SCI PAGE
CALL SCITST ;TEST IF SCI BOARD IS READY
CPI SCIOK ;
JNZ ERFSCI ;
CALL CRLF ;
DISPLAY MSGSCI ;LOADING SCI FILE
POP D ;GET PTR TO SCI PAGE
INX D ;
LD1: PUSH D ;SAVE PTR TO FCB
LXI H,TMPLOC ;GET DESTINATION ADDR.
CALL GETFILE ;MOVE SCI FILE TO TEMPORARY DESTINATION
ORA A ;
JNZ ERRSCI ;
LXI D,SCILOC ;
ANA A ;RESET CARRY
DSBC DE ;FIND LENGTH OF FILE
MOV B,H
MOV C,L ;LENGTH OF FILE
POP H ;GET PTR TO SCI FCB
PUSH H ;
DCX H ;PTR TO SCI PAGE
MOV A,M ;
LXI D,FIADOF ;OFFSET TO FILE ADDR
DAD DE ;
MOV E,M ;
INX H ;
MOV D,M ;DE=ADDR OF SCI FILE
LXI H,SCILOC ;SOURCE ADDR.
CALL DMAMOV ;
POP H ;
DCX H ;PTR TO PRESENT SCI PAGE
JMP LDNSCI ;
;
LD8088: LXI H,PG8088 ;PTR TO 8088 MAP REG VALUE
MOV A,M ;
ORA A ;
JZ LDZ80 ;IF MAP REG VALUE<>0 THEN DO
CALL CRLF ;
DISPLAY MSG88 ;LOADING 8088 FILE
LXI D,PG8088 ;PTR TO 8088 MAP REG VALUE
INX D ;PTR TO 8088 FCB
LXI H,TMPLOC ;
CALL GETFILE ;MOVE 8088 FILE TO TEMP. DESTINATION
ORA A ;
JNZ ERR88 ;
LXI D,TMPLOC ;
ANA A ;
DSBC DE ;FIND FILE LENGTH
PUSH H ;SAVE FILE LENGTH
LXI H,PG8088 ;PTR TO 8088 PAGE
MOV A,M ;
LXI D,FIADOF ;OFFSET TO FILE ADDR
DAD DE ;HL=PTR TO 8088 FILE ADDR
MOV E,M ;
INX H ;
MOV D,M ;DE=FILE ADDR
LXI H,TMPLOC ;SOURCE ADDR
POP B ;GET FILE LENGTH
CALL DMAMOV ;
LDZ80: CALL CRLF ;
DISPLAY MSGZ80 ;LOADING Z80 FILE
LXI D,FIADOF ;
LXI H,PGZ80 ;
DAD DE ;HL=PTR TO Z80 FILE ADDR
MOV E,M ;
INX H ;
MOV D,M ;
XCHG ;HL=Z80 FILE ADDR
LXI D,PGZ80 ;
INX D ;DE=PTR TO Z80 FCB
CALL GETFILE ;
ORA A ;
JNZ ERRZ80 ;
;
STASCI: CALL CRLF ;
DISPLAY STASEM ;LOADING START SEMAPHORES
LXI H,PGZ80 ;
STNSCI: IN P$SWITCH$2 ;GET STATUS OF SWITCH 2
ANI 02H ; IF BIT1=1 <=> SCI NOT AVAILABLE
; BIT1=0 <=> " IS "
JNZ STA88 ;
LXI D,TABOFF ;
DAD DE ;PTR TO SCI PAGE
MOV A,M ;
ORA A ;CHECK IF ANY SCI PAGE ( PAGE <> 0 )
JZ STA88 ;
PUSH H ;SAVE PTR TO SCI PAGE
CALL SCITST ;TEST IF SCI BOARD IS READY
CPI SCIOK ;
JNZ ERSSCI ;
LXI B,0001H ;NUMBERS OF BYTES TO MOVE
LXI D,SMADOF ;OFFSET TO SEMAPHORE ADDR.
POP H ;GET PTR TO SCI PAGE
PUSH H ;
MOV A,M ;
DAD DE ;
MOV E,M ;
INX H ;
MOV D,M ;DE=DESTINATION ADDR.
INX H ;HL=SOURCE ADDR(PTR TO SEMAPHORE VALUE)
CALL DMAMOV ;MOVE START SEMAPHORE TO SCI
POP H ;GET PTR TO SCI PAGE
JMP STNSCI ;
STA88: LXI H,PG8088 ;PTR TO 8088 MAP REG VALUE
MOV A,M ;
ORA A ;
JZ STAZ80 ;
LXI B,0004H ;NUMBERS OF BYTE TO TRANSFER
LXI D,SMADOF ;OFFSET TO SEMAPHORE ADDR
LXI H,PG8088 ;PTR TO 8088 PAGE
MVI A,10H ;
DAD DE ;PTR TO 8088 SEMAPHORE ADDR.
MOV E,M ;
INX H ;
MOV D,M ;DE=8088 DESTINATION ADDR.
INX H ;HL=SOURCE ADDR.
CALL DMAMOV ;MOVE PART OF START SEMAPHORE TO 8088
;
STAZ80: CALL CLRSCR ;CLEAR SCREEN
LXI H,MHFLG ;
MOV B,M ;REG B = MINIHARD FLAG
LXI H,BTUNIT ;
MOV C,M ;REG C = BOOT UNIT
LDED DATBF ;REG DE = PTR TO PARAMETER SECTOR
LHLD SEMZ80 ;HL=START SEMAPHORE ADDR
PCHL ;JUMP TO START OF Z80 FILE
;
DUMMY: RET ;DUMMY ROUTINE
;
ERRCNF: CALL CRLF ;CAN NOT FIND CONFIG TABLE ON
CALL SELECT ;DEFAULT DRIVE
LXI H,CNFFCB ;
MOV M,A ;CHANGE DRIVE NO
JMP START2 ;
;
ERRSCI: CALL SELECT ;CAN NOT FIND SCI FILE ON DEFAULT DRIVE
POP H ;GET PTR TO SCI FCB
MOV M,A ;CHANGE DRIVE NO
XCHG ;
JMP LD1 ;
;
ERR88: CALL SELECT ;CAN NOT FIND 8088 FILE ON
LXI H,PG8088 ;DEFAULT DRIVE
INX H ;PTR TO 8088 FCB
MOV M,A ;CHANGE DRIVE NO
JMP LD8088 ;
;
ERRZ80: CALL SELECT ;CAN NOT FIND Z80-FILE
LXI H,PGZ80 ;ON DEFAULT DRIVE
INX H ;
MOV M,A ;CHANGE DRIVE NO
JMP LDZ80 ;
;
SELECT: DISPLAY NOFILE ;
SELOOP: CALL CSTS ;TEST IF ANY INPUT FROM CONSOLE
ORA A ;
JZ SELOOP ;
CALL CI ;GET INPUT FROM CONSOLE
MOV C,A ;
CALL CO ;ECCO CHAR.
CPI '0' ;TEST INPUT CHAR.
JRC ERRSEL ; '0' =< X < '2'
CPI '2' ;
JRNC ERRSEL ;
ANI 1 ;
INR A ;
RET ;
;
ERRSEL: ANI 5FH ;
CPI 'Q' ;TEST IF CHAR = 'Q'
JZ REBOOT ;
DISPLAY WRSEL ;ILLEGAL CHAR FROM CONSOLE
JMP SELECT ;
;
ERFSCI: ;
CALL CRLF ;FOR LOADING FILE
DISPLAY NOSCI ;SCI BOARD NOT READY
POP H ;GET PTR TO SCI PAGE
JMP LDNSCI ;
;
ERSSCI: POP H ;SCI BOARD NOT READY FOR START
JMP STNSCI ;SEMAPHORE
;
REBOOT: XRA A ;
OUT P$MAP3 ;
IN P$RAMCTL ;
ORI M$RAMMAP ;
OUT P$RAMCTL ;
JMP 0000H ;
DMAMOV:
OUT P$BANK$DMA ;SET MAP REGISTERS
OUT P$DMA$TOGGLE ;RESET BYTE POINTER FLIP-FLOP IN DMA
DCX B ;DMA HAS A FUNNY WAY TO COUNT BYTES
MOV A,C ;GET LSB OF BYTE COUNT
OUT P$DMA$CNT0 ;OUT TO SOURCE CH.
MOV A,B ;GET MSB
OUT P$DMA$CNT0 ;
OUT P$DMA$TOGGLE ;MAKE SURE IT IS CORRECT STATE
MOV A,C ;GET LSB OF BYTE COUNT
OUT P$DMA$CNT1 ;OUT TO DESTINATION CH.
MOV A,B ;GET MSB
OUT P$DMA$CNT1 ;
OUT P$DMA$TOGGLE ;IT'S THE SAME PROBLEM AGAIN
MOV A,L ;GET LSB OF SOURCE BUFFER ADDRESS
OUT P$DMA$ADR0 ;OUT TO SOURCE CH.
MOV A,H ;GET MSB
OUT P$DMA$ADR0 ;
OUT P$DMA$TOGGLE ;ONCE AGAIN
MOV A,E ;GET LSB OF DESTINATION BUFFER ADDRESS
OUT P$DMA$ADR1 ;OUT TO DESTINATION CH.
MOV A,D ;GET MSB
OUT P$DMA$ADR1 ;
IN P$DMA$STAT ;MIGHT BE SOME GARBAGE IN THERE
MVI A,04H ;VALUE TO SEND SOFTWARE DMA REQUEST TO
OUT P$DMA$REQ ;CHANNEL 0
DMAWAIT:
IN P$DMA$STAT ;GET CONTROLLER STATUS
ANI 02H ;TEST IF FUNCTION COMPLETE
JZ DMAWAIT ;MUST FINISH UP SOME TIME
RET ;
SDLY:
MVI L,070H
DCR L
JNZ $-1
DCR A
JNZ SDLY
RET
PAGE
;************************************************************************
NOFILE: DB CR,LF,'File not found.',CR,LF
DB CR,LF,' FLOPPY DISK: A:=0 B:=1',CR,LF
DB CR,LF,'Select alternate source'
DB CR,LF,' or type Q to quit --> ',0
;
CRASMS: DB 'CHRISTIAN ROVSING A/S - CR8 SECONDARY BOOT LOADER - '
DB ' VERS 2.2 - DATE 840117',0
;
CNFMSG: DB CR,LF,'Loading configuration table.',0
;
NOSCI: DB 'SCI board not ready.',0
;
MSGSCI: DB 'Loading SCI-FILE.',0
;
MSG88: DB 'Loading 8088-FILE.',0
;
MSGZ80: DB 'Loading Z80-FILE.',0
;
STASEM: DB 'Loading start semaphores.',0
;
WRSEL: DB CR,LF,'False select character.',CR,LF,0
;
NOSW: DB CR,LF,'Switch indicates that no SCI board is available',0
;
;************************************************************************
MHFLG: DB 0H ;MINIHARD FLAG
BTUNIT: DB 0H ;BOOTUNIT
DATBF: DW 0000H ;POINTER TO PARAMETER SECTOR BUFFER
;
;FCB FOR LOADING CONFIG.SYS
;
CNFFCB: DB 0
DB 'CONFIG',SPC,SPC ;8 CHAR NAME
DB 'SYS' ;3 - TYPE
ORG CNFFCB+FCBLEN ;ADJUST FOR TOTAL LENGTH
;
;
;PROGRAM STACK
STACK: DS 40 ;
PGMSTK EQU $ ;PROGRAM STACK BOTTOM
;
;END OF FILE
«eof»