title 'Boot loader module for CP/M 3.0' public hwinit,?init,?ldccp,?rlccp public f_cpu extrn boot,?conin extrn pr.inln,pr.crlf,pr.dec,pr.decl extrn ioini1l,msginit,mmuinit,intinit,cpu_frq extrn prt0ini,gs_rtc extrn @civec,@covec,@aivec,@aovec,@lovec extrn @cbnk,?bnksl include config.inc include z180reg.inc ccpsize equ 0c80h ; CP/M BDOS Function Interfaces resetdsk equ 13 open equ 15 read equ 20 setdma equ 26 setmulti equ 44 bdos equ 5 if banked tpa$bank equ 1 else tpa$bank equ 0 endif dseg ; init done from banked memory hwinit: ld a,(INIDONE) cp INIDONEVAL jr z,hwini_skip ld hl,hwini_tab call ioini1l ld a,0c3h ld hl,boot ld (0),a ld (1),hl hwini_skip: call msginit call cpu_frq ld (f_cpu),hl ld (f_cpu+2),de ret ?init: ; ld hl,1000000000000000b ; assign console to AVRCON: ld hl,0100000000000000b ; assign console to ASCI0: ld (@civec),hl ld (@covec),hl ld hl,0000000000000000b ; assign printer to nothing: ld (@lovec),hl ld hl,0100000000000000b ; assign AUX to ASCI0: ld (@aivec),hl ld (@aovec),hl call intinit ; setup interrupts and vectors call prt0ini ; init timer ei ld c,2 call gs_rtc ; get time and date xor a ld (@cbnk),a ; right now in bank 0 call pr.inln ; print signon message db 13,10,13,10,'CP/M Version 3.0, Z180-Stamp BIOS',13,10,0 call pr.inln db 'Estimated CPU clock [Hz]: ',0 ld hl,(f_cpu) ld de,(f_cpu+2) call pr.decl call pr.crlf ret cseg ; boot loading must be done from resident memory ; This version of the boot loader loads the CCP from a file ; called CCP.COM on the system drive (A:). ?ldccp: ; First time, load the A:CCP.COM file into TPA ld c,resetdsk call bdos xor a ld (ccp$fcb+15),a ; zero extent ld hl,0 ld (fcb$nr),hl ; start at beginning of file ld de,ccp$fcb ld c,open ; open file containing CCP call bdos inc a jp z,no$ccp ; error if no file... ld de,0100h ld c,setdma ; start of TPA call bdos ld de,128 ld c,setmulti ; allow up to 16k bytes call bdos ld de,ccp$fcb ld c,read ; load the thing call bdos ; read records ; now, ; copy CCP to bank 0 for reloading ld hl,0100h ld bc,ccpsize ; clone 3K, just in case ld a,(@cbnk) push af ; save current bank ld$1: ld a,tpa$bank call ?bnksl ; select TPA ld a,(hl) push af ; get a byte ld a,2 call ?bnksl ; select extra bank pop af ld (hl),a ; save the byte cpi ; bump pointer, drop count jp pe,ld$1 pop af call ?bnksl ; restore original bank ret no$ccp: ; here if we couldn't find the file call pr.inln ; report this... db 13,10,'BIOS Err on A: No CCP.COM file',0 call ?conin ; get a response jp ?ldccp ; and try again ?rlccp: ld hl,0100h ld bc,ccpsize ; clone 3K rl$1: ld a,2 call ?bnksl ; select extra bank ld a,(hl) ; get a byte ex af,af' ld a,tpa$bank call ?bnksl ; select TPA ex af,af' ld (hl),a ; save the byte cpi ; bump pointer, drop count jp pe,rl$1 ret ccp$fcb:db 1,'CCP ','COM',0,0,0,0 ds 16 fcb$nr: db 0,0,0 dseg hwini_tab: db (hwini0_e-$)/2 ;count db rcr,CREFSH ;configure DRAM refresh db dcntl,CWAITIO ;wait states db ccr,M_NCD ;No Clock Divide db cmr,PHI_X2 ;X2 Clock Multiplier ;TODO: db omr, ;Operation Mode Control Register hwini0_e: db 0 ;stop mark cseg f_cpu dw 0,0 ;detected CPU clock frequency [Hz] end