You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

177 lines
5.2 KiB

;:::::::::::::::::::::::::::::::::::::::************************************
; Warm Boot Routine *** Machine Dependant for Moves ***
; - D-X Designs Pty Ltd P112 - *** and custom load formatting ***
; ************************************
; 1.0 - 12 Jun 96 - Initial Release for P112 from YASBEC. HFB
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
CSEG
WBOOT:
IF BANKED
LD A,(TPABNK) ; Get TPA Bank # in case currently in Bank
CALL SELMEM ; ..and make current
LD SP,USP ; Set stack in high memory
ELSE
LD SP,80H ; Use space below default buffer
ENDIF
IF FASTWB
; Restore command processor from
; cache in (SYSBNK):100H. We assume that the
; command processor lives in high memory.
LD A,(SYSBNK) ; Source bank is SYSBNK
LD C,A ; Put it in C
LD A,(TPABNK) ; Destination bank is TPABNK
LD B,A ; Put it in B
CALL HBX_XCOPY ; Set banks for extended copy
LD HL,100H ; Copy from start of cache in SYS
LD DE,(CPADR) ; .. to location of command processor in TPA
LD BC,(CPLEN) ; Length of command processor
CALL HBX_COPY ; Do it
WBOOTV:
XOR A ; Indicate "A" logged as Host Disk
LD (HSTDSK),A ; ..by showing Host Disk already logged
ELSE
IF BANKED
LD SP,USP ; If banked, use stack in high common memory
CALL GOSYSB ; Disk routines are in banked memory
ELSE
LD SP,EXTSTK+32 ; Place default stack up high
ENDIF
LD A,0FFH ; Insure the default drive is logged
LD (HSTDSK),A ; ..by unlogging the Host Disk
LD A,(SYSDRV)
LD C,A ; Select system disk
LD E,0 ; Declare new mount
CALL SELDSK ; We're going to use the system disk
LD BC,0
CALL SETTRK ; Set track 0
LD BC,10H*256+1 ; B sectors remaining, C first sector
LD DE,0 ; DE beginning track
; Note that we begin by reading track 0, sector 1 since sector 0
; contains the cold start loader, which is skipped in a warm start
LD HL,CPR ; Base of CP/M (initial load point)
LOAD1: PUSH DE ; Load a Sector, Save Current Track
PUSH BC ; Save sectors remaining and next sector
PUSH HL ; Save DMA address
LD (DMAADR),HL ; ..in deblocker
LD HL,(SEKDPH)
LD E,(HL)
INC HL
LD D,(HL) ; Get sector XLATE address
CALL SECTRN ; Skew sector as needed
LD (SEKSEC),HL ; Save Sector # directly in deblocker
; Drive = 0, track set, sector set, DMA address set
CALL READ
OR A ; Any errors?
JR NZ,WBOOT ; Retry the entire boot if an error occurs
; No error, move to next sector
POP HL ; Recall DMA address
LD DE,128 ; DMA=DMA+128
ADD HL,DE ; New DMA address is in H,L
POP BC ; Recall NSECTS and current sector
POP DE ; Recall current track
DEC B ; Sectors=sectors-1
JR Z,GOZSYS ; Go to Z-System if all have been loaded
; More sectors remain to load, check for track change
INC C ; Increment sector count
LD A,(CPMSPT) ; Max sector +1
CP C ; Have we reached the end?
JR NZ,LOAD1 ; If not
; End of current track, go to next track
INC DE ; Track=track+1
LD C,0 ; First sector on next track
; Save register state, and set new track
LD (SEKTRK),DE ; Save track directly
JR LOAD1 ; For another sector
ENDIF ;fastwb
; End load operation, set parameters & go to Z-System
GOZSYS: LD BC,80H ; Default DMA address is 80H
CALL SETDMA
LD A,0C3H ; C3 is a JMP instruction
LD (0),A ; For JMP to WBOOT
LD (5),A ; For JMP to BDOS
LD HL,BIOSJT+3 ; Wboot entry point
LD (1),HL ; Set address field for JMP at 0
LD HL,(ENVADR) ; Get the pointer to the ENV
LD DE,43H ; Offset to high byte of Dos Start
ADD HL,DE
LD D,(HL) ; Load Dos start
DEC HL
LD E,(HL)
EX DE,HL ; Put Dos in HL
LD BC,6 ; .offset to Entry
ADD HL,BC
LD (6),HL ; ..and set Address field of jump at 5 to BDOS
EX DE,HL
DEC HL ; Back down to CCP entry
DEC HL
LD D,(HL) ; Get the vector
DEC HL
LD E,(HL)
PUSH DE ; Save CCP entry address
IF BANKED
; Copy vectors from TPA page zero to SYS page zero
LD BC,(TPABNK) ; C := TPABNK, B := SYSBNK
CALL XMOVE ; Set source/dest banks for copy
LD HL,0 ; Source address is zero
LD DE,0 ; Destination address is zero
LD BC,40H ; Copy 40H bytes
CALL MOVE ; Do it
LD A,(TPABNK) ; Set all Bank regs to TPA
LD (DMABNK),A
CALL SELMEM ; Insure TPA in context (also set USRBNK)
XOR A
LD (BIOSTK),A ; Init bank switcher
ENDIF
LD A,(4) ; Get current disk number
LD C,A ; Send to the CCP
; EI ; Enable the interrupt system
; EX DE,HL ; ..put destination in HL
POP HL ; Restore CCP entry address
JP (HL) ; Go to Z-System for further processing
IF [Z3 AND HAVIOP]
; Aux Jump Table so IOP's can find routines. After Cold Boot, the
; address of this table is placed in BIOSJT+1.
IOPRET: JP CONST
JP CONIN
JP CONOUT
JP LIST
JP AUXOUT
JP AUXIN
JP LISTST
ENDIF
DSEG ; Put the following areas in Data Segment
; Command processor address and length used when saving
; and restoring cached copy.
IF FASTWB
CPADR DEFS 2 ; Command processor address
CPLEN DEFS 2 ; Command processor length
ENDIF ;fastwb
;========================= End of WBOOT ============================