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.
 
 
 
 
 
 

278 lines
6.9 KiB

;
;==================================================================================================
; LOADER
;==================================================================================================
;
; BOOT LOADER
; CAN BE COMPILED IN DIFFERENT MODES:
; - LOAD FROM ROM
; - LOAD FROM IMAGE IN RAM
; - LOAD FROM COM APPLICATION
;
#INCLUDE "std.asm"
#INCLUDE "hbios.exp"
;
LM_ROM .EQU 1 ; LOAD FROM ROM PAGE
LM_IMG .EQU 2 ; LOAD FROM IMAGE
LM_COM .EQU 3 ; LOAD FROM COM APP
;
P2LOC .EQU $F000 ; PHASE 2 RUN LOCATION
;
LDRMODE .EQU MODE ; DEFINE MODE ON COMMAND LINE
;
#IF (LDRMODE == LM_ROM)
CURBNK .EQU BID_BOOT
#ELSE
CURBNK .EQU BID_USR
#ENDIF
#IF (LDRMODE == LM_COM)
.ORG $100
#ELSE
.ORG 0
;
;==================================================================================================
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE
;==================================================================================================
;
.FILL (000H - $),0FFH ; RST 0
JP START ; JUMP TO BOOT CODE
.FILL (004H - $),0FFH ; FILL TO START OF SIG PTR
.DW ROM_SIG
.FILL (008H - $),0FFH ; RST 8
RET
.FILL (010H - $),0FFH ; RST 10
RET
.FILL (018H - $),0FFH ; RST 18
RET
.FILL (020H - $),0FFH ; RST 20
RET
.FILL (028H - $),0FFH ; RST 28
RET
.FILL (030H - $),0FFH ; RST 30
RET
.FILL (038H - $),0FFH ; INT
RETI
.FILL (066H - $),0FFH ; NMI
RETN
;
.FILL (070H - $),0FFH ; SIG STARTS AT $80
;
ROM_SIG:
.DB $76, $B5 ; 2 SIGNATURE BYTES
.DB 1 ; STRUCTURE VERSION NUMBER
.DB 7 ; ROM SIZE (IN MULTIPLES OF 4KB, MINUS ONE)
.DW NAME ; POINTER TO HUMAN-READABLE ROM NAME
.DW AUTH ; POINTER TO AUTHOR INITIALS
.DW DESC ; POINTER TO LONGER DESCRIPTION OF ROM
.DB 0, 0, 0, 0, 0, 0 ; RESERVED FOR FUTURE USE; MUST BE ZERO
;
;NAME .DB "ROMWBW v", BIOSVER, ", ", BIOSBLD, ", ", TIMESTAMP, 0
NAME .DB "ROMWBW v", BIOSVER, ", ", TIMESTAMP, 0
AUTH .DB "WBW",0
DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2014, Wayne Warthen, GNU GPL v3", 0
;
.FILL ($100 - $),$FF ; PAD REMAINDER OF PAGE ZERO
#ENDIF
;
;==================================================================================================
; COLD START
;==================================================================================================
;
START:
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY
;
; HARDWARE BOOTSTRAP FOR Z180
; FOR N8, ACR & RMAP ARE ASSUMED TO BE ALREADY SET OR THIS CODE
; WOULD NOT BE EXECUTING
;
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
; SET BASE FOR CPU IO REGISTERS
LD A,CPU_BASE
OUT0 (CPU_ICR),A
; DISABLE REFRESH
XOR A
OUT0 (CPU_RCR),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
; MMU SETUP
LD A,$80
OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
#IF (LDRMODE == LM_ROM)
XOR A
OUT0 (CPU_BBR),A ; BANK BASE = 0
#ENDIF
LD A,(RAMSIZE + RAMBIAS - 64) >> 2
OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
#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
#ENDIF
;
; HARDWARE BOOTSTRAP FOR ZETA 2
;
#IF (PLATFORM == PLT_ZETA2)
; SET PAGING REGISTERS
#IF (LDRMODE == LM_ROM)
XOR A
OUT (MPGSEL_0),A
INC A
OUT (MPGSEL_1),A
#ENDIF
LD A,62
OUT (MPGSEL_2),A
INC A
OUT (MPGSEL_3),A
; ENABLE PAGING
LD A,1
OUT (MPGENA),A
#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,P2LOC ; TO HIMEM RUN LOCATION
LD BC,LDR_END ; COPY FULL IMAGE
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 $ + P2LOC ; WE ARE NOW EXECUTING IN UPPER MEMORY
;
PHASE2:
CALL XIO_DOT ; MARK PROGRESS
;
; INSTALL HBIOS PROXY IN UPPER MEMORY
;
#IF (LDRMODE == LM_ROM)
LD A,BID_BIOSIMG ; HBIOS IMAGE ROM BANK
CALL BNKSEL ; SELECT IT
#ENDIF
LD HL,HBX_IMG ; HL := SOURCE OF HBIOS PROXY IMAGE
#IF (LDRMODE != LM_ROM)
LD BC,LDR_END ; SIZE OF LOADER
ADD HL,BC ; OFFSET SOURCE ADDRESS
#ENDIF
LD DE,HBX_LOC ; DE := DESTINATION TO INSTALL IT
LD BC,HBX_SIZ ; SIZE
LDIR ; DO THE COPY
LD A,CURBNK ; BOOT/SETUP BANK
LD (HB_CURBNK),A ; INIT CURRENT BANK
#IF (LDRMODE == LM_ROM)
CALL BNKSEL ; SELECT IT
#ENDIF
CALL XIO_DOT ; MARK PROGRESS
;
; INSTALL HBIOS CODE BANK
;
#IF (LDRMODE == LM_ROM)
LD A,BID_BIOSIMG ; SOURCE BANK
#ELSE
LD A,(HB_CURBNK) ; SOURCE BANK
#ENDIF
LD (HB_SRCBNK),A ; SET IT
LD A,BID_BIOS ; DESTINATION BANK
LD (HB_DSTBNK),A ; SET IT
LD HL,0 ; SOURCE ADDRESS IS ZERO
#IF (LDRMODE != LM_ROM)
LD BC,LDR_END ; SIZE OF LOADER
ADD HL,BC ; OFFSET SOURCE ADDRESS
#ENDIF
LD DE,0 ; TARGET ADDRESS IS ZERO
LD BC,HB_END ; COPY ALL OF HBIOS IMAGE
CALL HB_BNKCPY ; DO IT
CALL XIO_DOT ; MARK PROGRESS
;; HACK TO FLUSH THE OUTPUT FIFO
;XOR A
;CALL XIO_OUTC
;CALL XIO_OUTC
;CALL XIO_OUTC
;CALL XIO_OUTC
;
; INITIALIZE HBIOS
;
LD A,BID_BIOS ; HBIOS BANK
LD HL,0 ; ADDRESS 0 IS HBIOS INIT ENTRY ADDRESS
CALL HB_BNKCALL ; DO IT
;
; CHAIN TO OS LOADER
;
#IF (LDRMODE == LM_ROM)
; PERFORM BANK CALL TO OS IMAGES BANK
LD A,BID_OSIMG ; CHAIN TO OS IMAGES BANK
LD HL,0 ; ENTER AT ADDRESS 0
CALL HB_BNKCALL ; GO THERE
HALT ; WE SHOULD NEVER COME BACK!
#ELSE
; SLIDE OS IMAGES BLOB DOWN TO $0000
LD HL,LDR_END ; SOURCE IS LOADER END
LD BC,HB_END ; PLUS HBIOS IMAGE SIZE
ADD HL,BC ; FINAL SOURCE ADDRESS
LD DE,0 ; TARGET ADDRESS IS ZERO
LD BC,BNKTOP ; MAX SIZE OF OS IMAGES
LDIR ; DO IT
; JUMP TO START
JP 0 ; AND CHAIN
#ENDIF
;
;==================================================================================================
; MEMORY MANAGER
;==================================================================================================
;
#IF (LDRMODE == LM_ROM)
#INCLUDE "memmgr.asm"
#ENDIF
;
;==================================================================================================
; CLEAN UP
;==================================================================================================
;
.ORG $ - P2LOC ; BANK TO IMAGE-BASED ADDRESSING
LDR_END .EXPORT LDR_END ; EXPORT ENDING ADDRESS
.END