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.
119 lines
3.4 KiB
119 lines
3.4 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 0100H
|
|
;
|
|
DI ; NO INTERRUPTS
|
|
IM 1 ; INTERRUPT MODE 1
|
|
|
|
;
|
|
; PERFORM MINIMAL Z180 SPECIFIC INITIALIZATION
|
|
;
|
|
#IF (PLATFORM == PLT_N8)
|
|
; SET BASE FOR CPU IO REGISTERS
|
|
LD A,CPU_IOBASE
|
|
OUT0 (CPU_ICR),A
|
|
|
|
; SET CPU CLOCK DIV
|
|
LD A,Z180_CLKDIV << 7
|
|
OUT0 (CPU_CCR),A
|
|
|
|
; SET WAIT STATES
|
|
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
|
|
OUT0 (CPU_DCNTL),A
|
|
|
|
; MMU SETUP
|
|
LD A,80H
|
|
OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
|
|
XOR A
|
|
OUT0 (CPU_BBR),A ; BANK BASE = 0
|
|
LD A,(RAMSIZE - 64) >> 2
|
|
OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
|
|
#ENDIF
|
|
|
|
;
|
|
; RELOCATE MONITOR/OS CODE FROM 8000H TO C000H
|
|
; - HBIOS PROXY AT $FF00 IS OVERLAID, BUT WE DON'T CARE
|
|
; ABOUT IT ANYMORE, IT WILL BE REFRESHED DURING HBIOS
|
|
; INIT LATER.
|
|
;
|
|
LD HL,8000H ; COPY MEMORY FROM 8000
|
|
LD DE,0C000H ; TO C000
|
|
LD BC,4000H ; COPY 16K
|
|
LDIR
|
|
;
|
|
; COPY FIRST $1000 BYTES TO $8000 (UPPER, NON-BANKED MEMORY)
|
|
; THIS INCLUDES OURSELVES AND THE LOADER CODE
|
|
;
|
|
;
|
|
; RELOCATE BOOT PHASE 2 AND LOADER CODE FROM 0000H TO 8000H
|
|
;
|
|
LD HL,0000H ; COPY MEMORY FROM 0000
|
|
LD DE,8000H ; TO 8000H
|
|
LD BC,1000H ; COPY 1000H BYTES
|
|
LDIR
|
|
;
|
|
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
|
|
;
|
|
;______________________________________________________________________________________________________________________
|
|
;
|
|
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
|
|
;
|
|
.ORG $ + $8000 ; WE ARE NOW EXECUTING IN UPPER MEMORY
|
|
;
|
|
PHASE2:
|
|
LD SP,9000H ; INIT BOOT STACK
|
|
;
|
|
; COPY RAMPG0 TO RAMPG1
|
|
;
|
|
LD HL,0000H ; HL = LOCATION IN LOMEM TO COPY FROM/TO
|
|
LOOP:
|
|
LD DE,09000H ; DE = BUFFER ADDRESS
|
|
LD BC,1000H ; BYTES TO COPY (4K CHUNKS)
|
|
PUSH BC ; SAVE COPY SIZE
|
|
PUSH DE ; SAVE COPY DEST
|
|
PUSH HL ; SAVE COPY SOURCE
|
|
LD A,0 ; SELECT PAGE 1
|
|
CALL RAMPG ; OF ROM FOR COPY
|
|
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,1 ; SELECT PAGE 1
|
|
CALL RAMPG ; OF RAM FOR COPY
|
|
LDIR ; COPY BUFFER -> RAM
|
|
EX DE,HL ; GET LOMEM POINTER BACK TO HL
|
|
LD A,H ; HIGH BYTE OF POINTER TO A
|
|
CP 80H ; HIGH BYTE WILL BE 80H WHEN WE ARE DONE
|
|
JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK
|
|
;
|
|
; INITIALIZE HBIOS AND JUMP TO LOADER
|
|
;
|
|
LD A,1 ; SETUP TO SELECT PAGE 1
|
|
CALL RAMPG ; SELECT RAM PAGE 1 (WHICH IS NOW LOADED WITH BNK1 CODE)
|
|
CALL 1000H ; CALL HBIOS INITIALIZATION
|
|
CALL RAMPGZ ; MAKE SURE RAM PAGE ZERO IS MAPPED TO LOWER 32K
|
|
CALL 0FF00H ; CALL HBIOS PROXY INITIALIZATION
|
|
;
|
|
JP 8400H ; JUMP TO LOADER
|
|
;______________________________________________________________________________________________________________________
|
|
;
|
|
; NOTE THAT MEMORY MANAGER CODE IS IN UPPER MEMORY!
|
|
;
|
|
#INCLUDE "memmgr.asm"
|
|
;______________________________________________________________________________________________________________________
|
|
;
|
|
; PAD OUT REMAINDER OF PAGE
|
|
;
|
|
.ORG $ - $8000 ; ORG BACK TO LOWER MEMORY
|
|
.FILL $0200 - $,$FF ; PAD OUT REMAINDER OF PAGE
|
|
;
|
|
.END
|
|
|