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