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,?move,?xmove include version.inc 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 v' defvers db 13,10 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:). ; First time, load the A:CCP.COM file into TPA ?ldccp: 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 bc,2*256 + tpa$bank ; c: src$bnk, b: dst$bnk jr mov_ccp ; just copy in the other direction ?rlccp: ld bc,tpa$bank*256 + 2 ; c: src$bnk, b: dst$bnk mov_ccp: call ?xmove ld hl,0100h ld d,h ld e,l ld bc,ccpsize ; clone 3K, just in case call ?move 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 jr ?ldccp ; and try again 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 db omcr,~M_IOC ;Operation Mode Control Register hwini0_e: db 0 ;stop mark cseg f_cpu dw 0,0 ;detected CPU clock frequency [Hz] end