;___BOOTROM____________________________________________________________________________________________________________ ; ; ROM BOOT MANAGER ; ; HARDWARE COLD START WILL JUMP HERE FOR INITIALIZATION ; REFER TO BANKEDBIOS.TXT FOR MORE INFORMATION. ;______________________________________________________________________________________________________________________ ; ; #INCLUDE "std.asm" ; .ORG $100 ; DI ; NO INTERRUPTS IM 1 ; INTERRUPT MODE 1 LD SP,$FF00 ; START WITH SP BELOW HBIOS PROXY LOCATION ; ; 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,$80 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 ; ; 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 ENTIRE CONTENTS OF ROM BANK 0 TO HI RAM ; THIS INCLUDES OURSELVES AND THE LOADER CODE ; - HBIOS PROXY AT $FF00 IS OVERLAID, BUT WE DON'T CARE ; BECAUSE IT WILL BE REFRESHED DURING HBIOS ; INIT LATER. ; ; NOTE: STACK IS WIPED OUT, STACK IS ASSUMED TO BE EMPTY HERE!!!! ; LD HL,$0000 ; COPY MEMORY FROM LOMEM (0000H) LD DE,$8000 ; TO HIMEM (8000H) LD BC,$8000 ; COPY ENTIRE BANK, 8000H BYTES LDIR ; CALL XIO_DOT ; MARK PROGRESS ; JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY ; STR_BOOT .DB "Boot$" ; ; 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 ; ; COPY ROMPG1 TO RAMPG1 ; 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,1 ; SELECT PAGE 1 CALL ROMPG ; 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 $80 ; HIGH BYTE WILL BE $80 WHEN WE ARE DONE JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK ; CALL XIO_DOT ; MARK PROGRESS ; ; INITIALIZE HBIOS AND JUMP TO LOADER ; ; CALL HBIOS HARDWARE INITIALIZATION CALL $1000 ; CALL HBIOS INITIALIZATION ; ; CALL HBIOS PROXY INITIALIZATION CALL RAMPGZ ; MAKE SURE RAM PAGE ZERO IS MAPPED TO LOWER 32K CALL $FF20 ; CALL HBIOS PROXY INITIALIZATION ; JP $8400 ; 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 $200 - $,$FF ; PAD OUT REMAINDER OF PAGE ; .END