;___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 JP $8400 ; JUMP TO LOADER #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 ; 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