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.
 
 
 
 
 
 

180 lines
4.8 KiB

;___BOOTAPP____________________________________________________________________________________________________________
;
; APPLICATION BOOT MANAGER
;
; USED TO LOAD AN APPLICATION IMAGE BASED COPY OF THE SYSTEM
; REFER TO BANKEDBIOS.TXT FOR MORE INFORMATION.
;______________________________________________________________________________________________________________________
;
;
#INCLUDE "std.asm"
;
.ORG $100
;
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
;LD SP,STACK ; SP IN RAM
LD SP,HBX_LOC ; SP IN RAM
;
; PERFORM MINIMAL Z180 SPECIFIC INITIALIZATION
;
#IFNDEF UNALOAD
;
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
; SET BASE FOR CPU IO REGISTERS
LD A,CPU_BASE
OUT0 (CPU_ICR),A
; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2)
XOR A
OUT0 (CPU_CCR),A
OUT0 (CPU_CMR),A
; SET DEFAULT WAIT STATES
LD A,$F0
OUT0 (CPU_DCNTL),A
#IF (Z180_CLKDIV >= 1)
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED
LD A,$80
OUT0 (CPU_CCR),A
#ENDIF
#IF (Z180_CLKDIV >= 2)
; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED
LD A,$80
OUT0 (CPU_CMR),A
#ENDIF
; SET DESIRED WAIT STATES
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
OUT0 (CPU_DCNTL),A
; CANNOT CHANGE MMU SETUP DURING AN APP BASED BOOT
;; MMU SETUP
;LD A,$80
;OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
;LD A,RAMBIAS >> 2
;OUT0 (CPU_BBR),A ; BANK BASE SET TO START OF RAM
;LD A,(RAMSIZE + RAMBIAS - 64) >> 2
;OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
#ENDIF
;
#ENDIF
;
; EMIT FIRST SIGN OF LIFE TO SERIAL PORT
;
CALL XIO_INIT ; INIT SERIAL PORT
LD HL,STR_BOOT ; POINT TO MESSAGE
CALL XIO_OUTS ; SAY HELLO
;
; RELOCATE MONITOR/OS CODE FROM 8000H TO C000H
; THIS INCLUDES OURSELVES (FOR PHASE 2) AND THE LOADER CODE
; CAREFUL, WORKING STACK AREA IS WIPED OUT!!!
;
LD HL,$8000 ; COPY MEMORY FROM $8000
LD DE,$C000 ; TO $C000
LD BC,$4000 - $400 ; ALL BUT TOP 1K TO AVOID OVERLAYING PROXY
LDIR
;
CALL XIO_DOT ; MARK PROGRESS
;
; COPY FIRST $1000 BYTES TO $8000 (UPPER, NON-BANKED MEMORY)
; THIS INCLUDES OURSELVES AND THE LOADER CODE
; STACK AREA IS WIPED OUT!!!
;
LD HL,$0000 ; COPY MEMORY FROM 0000
LD DE,$8000 ; TO 8000H
LD BC,$1000 ; COPY 1000H BYTES
LDIR
;
CALL XIO_DOT ; MARK PROGRESS
;
#IF (PLATFORM == PLT_UNA)
; IF RUNNING UNDER UNA, WE ARE DONE, PROCEED TO LOADER
LD DE,$0100 ; *** FIX *** ASSUME WE WANT DEFAULT DRIVE TO BE ROM
JP CPM_ENT ; JUMP TO OS
#ELSE
; NON-UNA REQUIRES PHASE 2
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
#ENDIF
;
STR_BOOT .DB "RomWBW$"
;
; IMBED DIRECT SERIAL I/O ROUTINES
;
#INCLUDE "xio.asm"
;
;______________________________________________________________________________________________________________________
;
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
;
.ORG $ + $8000 ; WE ARE NOW EXECUTING IN UPPER MEMORY
#IF (PLATFORM != PLT_UNA)
;
PHASE2:
LD SP,HBX_LOC ; MOVE SP TO HIMEM JUST BELOW HBIOS
;
CALL XIO_DOT ; MARK PROGRESS
;
; COPY NEW HBIOS IMAGE INTO TARGET RAM PAGE
;
LD HL,0 ; HL = LOCATION IN LOMEM TO COPY FROM/TO
LOOP:
LD DE,$9000 ; DE = BUFFER ADDRESS
LD BC,$1000 ; BYTES TO COPY (4K CHUNKS)
PUSH BC ; SAVE COPY SIZE
PUSH DE ; SAVE COPY DEST
PUSH HL ; SAVE COPY SOURCE
LD A,BID_USR ; RAM PAGE WITH NEW HBIOS IMAGE
CALL PGSEL ; SELECT IT
LDIR ; COPY ROM -> BUFFER
POP DE ; RESTORE SOURCE AS NEW DESTINATION
POP HL ; RESTORE DESTINATION AS NEW SOURCE
POP BC ; RESTORE COPY SIZE
LD A,BID_HB ; HBIOS RAM PAGE
CALL PGSEL ; SELECT IT
LDIR ; COPY BUFFER -> RAM
EX DE,HL ; GET LOMEM POINTER BACK TO HL
LD A,H ; HIGH BYTE OF POINTER TO A
CP $80 ; HIGH BYTE WILL BE 80H WHEN WE ARE DONE
JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK
;
LD A,BID_USR ; RAM PAGE WITH NEW HBIOS IMAGE
CALL PGSEL ; SELECT IT
CALL XIO_DOT ; MARK PROGRESS
;
; INITIALIZE HBIOS AND JUMP TO LOADER
;
; CALL HBIOS HARDWARE INITIALIZATION
; CALL HBIOS HARDWARE INITIALIZATION
LD A,BID_HB ; HBIOS RAM PAGE
CALL PGSEL ; SELECT IT
CALL $1000 ; CALL HBIOS INITIALIZATION
;
; CALL HBIOS PROXY INITIALIZATION
LD A,BID_USR ; USER RAM PAGE
CALL PGSEL ; SELECT IT
CALL HBX_LOC ; CALL HBIOS PROXY INITIALIZATION
;
LD DE,$0000 ; ASSUME WE WANT DEFAULT DRIVE TO BE ROM
JP CPM_ENT ; JUMP TO OS
;______________________________________________________________________________________________________________________
;
; NOTE THAT MEMORY MANAGER CODE IS IN UPPER MEMORY!
;
#INCLUDE "memmgr.asm"
;
#ENDIF
;______________________________________________________________________________________________________________________
;
; PAD OUT REMAINDER OF PAGE
;
.FILL $8200 - $,$FF ; PAD OUT REMAINDER OF PAGE
;
STACK .EQU $ ; STACK IN HIMEM SLACK SPACE
;
.END