mirror of https://github.com/wwarthen/RomWBW.git
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
4.5 KiB
177 lines
4.5 KiB
;___BOOTROM____________________________________________________________________________________________________________
|
|
;
|
|
; ROM BOOT MANAGER
|
|
;
|
|
; HARDWARE COLD START WILL JUMP HERE FOR INITIALIZATION
|
|
;______________________________________________________________________________________________________________________
|
|
;
|
|
;
|
|
#INCLUDE "std.asm"
|
|
;
|
|
.ORG $100
|
|
;
|
|
DI ; NO INTERRUPTS
|
|
IM 1 ; INTERRUPT MODE 1
|
|
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 RESULTINT 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
|
|
|
|
; MMU SETUP
|
|
LD A,$80
|
|
OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
|
|
XOR A
|
|
OUT0 (CPU_BBR),A ; BANK BASE = 0
|
|
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
|
|
;
|
|
; COPY OURSELVES AND LOADER TO HI RAM FOR PHASE 2
|
|
;
|
|
LD HL,0 ; COPY FROM START OF ROM IMAGE
|
|
LD DE,$8000 ; TO HIMEM $8000
|
|
LD BC,$1000 ; COPY 4K
|
|
LDIR
|
|
;
|
|
CALL XIO_DOT ; MARK PROGRESS
|
|
;
|
|
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
|
|
;
|
|
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
|
|
;
|
|
PHASE2:
|
|
CALL XIO_DOT ; MARK PROGRESS
|
|
;
|
|
#IF (PLATFORM == PLT_UNA)
|
|
; SWITCH TO EXEC PAGE IN BANKED MEMORY
|
|
LD BC,$01FB ; SET BANK
|
|
LD DE,$800E ; EXEC_PAGE (SEE PAGES.INC)
|
|
CALL $FFFD ; DO IT
|
|
;
|
|
; MARK PROGRESS VIA UNA CHAR OUTPUT
|
|
LD BC,$0012 ; UNA UNIT = 0, FUNC WRITE CHAR
|
|
LD E,'.' ; DOT
|
|
CALL $FFFD ; CALL UNA ENTRY DIRECTLY, RST 08 NOT SETUP YET
|
|
;
|
|
; INSTALL UNA INVOCATION VECTOR FOR RST 08
|
|
LD A,$C3 ; JP INSTRUCTION
|
|
LD (8),A ; STORE AT 0x0008
|
|
LD HL,($FFFE) ; UNA ENTRY VECTOR
|
|
LD (9),HL ; STORE AT 0x0009
|
|
;
|
|
LD BC,$0012 ; UNA UNIT = 0, FUNC = WRITE CHAR
|
|
LD E,'.' ; DOT
|
|
RST 08 ; RST 08 IS NOW POSSIBLE
|
|
|
|
; IF RUNNING UNDER UNA, WE ARE DONE, PROCEED TO LOADER
|
|
JP $8400 ; JUMP TO LOADER
|
|
|
|
#ELSE
|
|
|
|
;
|
|
; COPY HBIOS IMAGE FROM ROM TO RAM
|
|
;
|
|
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_HBIMG ; ROM PAGE WITH 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 $80 WHEN WE ARE DONE
|
|
JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK
|
|
;
|
|
LD A,BID_BOOT ; ROM PAGE WITH BOOT IMAGE
|
|
CALL PGSEL ; SELECT IT
|
|
CALL XIO_DOT ; MARK PROGRESS
|
|
;
|
|
; INITIALIZE HBIOS AND JUMP TO LOADER
|
|
;
|
|
; 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
|
|
;
|
|
JP $8400 ; JUMP TO LOADER
|
|
;______________________________________________________________________________________________________________________
|
|
;
|
|
; 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
|
|
|