\r
; memory control\r
\r
- public @cbnk ; current bank\r
- extrn ?xmove,?move ; select move bank, and block move\r
- extrn ?bank ; select CPU bank\r
+ public @cbnk ; current bank\r
+ extrn ?xmove,?move ; select move bank, and block move\r
+ extrn ?bank ; select CPU bank\r
\r
; clock support\r
\r
- extrn ?time ; signal time operation\r
+ extrn ?time ; signal time operation\r
\r
; general utility routines\r
\r
- public ?pmsg,?pdec ; print message, print number from 0 to 65535\r
- public ?pderr ; print BIOS disk error message header\r
- public pmsg.in ; print message inline\r
- public phex4,phex2 ; print 4 digit hex (HL), or 2 digit hex (A)\r
+ public ?pmsg ; print message\r
+ public pr.dec,pr.decl ; print 16 or 32 bit decimal number\r
+ public ?pderr ; print BIOS disk error message header\r
+ public pr.inln,pr.crlf ; print message inline\r
+ public phex4,phex2 ; print 4 digit hex (HL), or 2 digit hex (A)\r
\r
- include modebaud.inc ; define mode bits\r
+ extrn div32_16 ; divide 32 bit by 16 bit number\r
+\r
+ include modebaud.inc ; define mode bits\r
\r
\r
; External names for BIOS entry points\r
\r
call hwinit ; first time hardware initialisation\r
\r
- ld c,15 ; initialize all 16 character devices\r
+ ld bc,16*256 + 0 ; initialize all 16 character devices\r
c$init$loop:\r
push bc\r
call ?cinit\r
pop bc\r
- dec c\r
- jp p,c$init$loop\r
+ inc c\r
+ djnz c$init$loop\r
\r
call ?init ; perform any additional system initialization\r
; and print signon message\r
; print message inline up to a null\r
; saves all registers\r
\r
-pmsg.in:\r
+pr.inln:\r
ex (sp),hl\r
push af\r
call ?pmsg\r
ex (sp),hl\r
ret\r
\r
+;-------------------------------------------------------------------------------\r
+; print <CR><LF>\r
+; saves all registers\r
+\r
+pr.crlf:\r
+ call pr.inln\r
+ db 13,10,0\r
+ ret\r
+\r
;-------------------------------------------------------------------------------\r
; print hl as a 4 digit hexadecimal number\r
; saves all registers\r
pop hl\r
ret\r
\r
+\r
+ if 0\r
+\r
;-------------------------------------------------------------------------------\r
+; print 16 bit number from HL\r
+;\r
\r
-?pdec: ; print binary number 0-65535 from <HL>\r
- ld bc,table10\r
- ld de,-10000\r
-next:\r
- ld a,'0'-1\r
-pdecl:\r
- push hl\r
- inc a\r
- add hl,de\r
- jp nc,stoploop\r
+pr.dec:\r
+ ex de,hl\r
+ ld hl,0\r
+ ;fall thru\r
+\r
+pr.decl:\r
+ push ix\r
+ ld ix,1 ; count chars on stack\r
+ push bc\r
+ exx\r
+ ex (sp),hl\r
+; push de\r
+; push bc\r
+ exx\r
+\r
+ xor a\r
+ push af ; string terminator\r
inc sp\r
+prd_divloop:\r
+ ld bc,10\r
+ call div32_16 ; get a digit\r
+ ld a,c\r
+ add a,'0' ; make it printable\r
+ push af\r
inc sp\r
- jp pdecl\r
-stoploop:\r
- push de\r
- push bc\r
- ld c,a\r
- call ?cono\r
- pop bc\r
+ inc ix\r
+\r
+ ld a,h\r
+ or l\r
+ or d\r
+ or e\r
+ jr nz,prd_divloop\r
+ exx\r
+ push hl\r
+ exx\r
+ pop bc ;b=filler, c=field width\r
+ inc c\r
+ push ix\r
pop de\r
-nextdigit:\r
+prd_filloop:\r
+ ld a,e\r
+ cp c\r
+ jr nc,prd_out\r
+ push bc\r
+ inc sp\r
+ inc de\r
+ jr prd_filloop\r
+prd_out:\r
+ ld hl,0\r
+ add hl,sp ;ptr to beginning of number string (hl==0 here)\r
+ call ?pmsg\r
+ ex de,hl\r
+ add hl,sp\r
+ ld sp,hl\r
+ exx\r
pop hl\r
- ld a,(bc)\r
+ exx\r
+ pop ix\r
+ ret\r
+\r
+ endif\r
+\r
+;-------------------------------------------------------------------------------\r
+; print 16 bit number from HL\r
+;\r
+\r
+pr.dec:\r
+ ex de,hl\r
+ ld hl,0\r
+ ;fall thru\r
+\r
+pr.decl:\r
+ push bc ;save width and fillchar\r
+ push bc\r
+ exx\r
+ ex (sp),hl ;save hl', get width and fill\r
+ push de ;save de'\r
+\r
+ xor a\r
+ ld d,a ;clear counter\r
ld e,a\r
- inc bc\r
- ld a,(bc)\r
- ld d,a\r
- inc bc\r
+ push af ; string terminator\r
+ inc sp\r
+\r
+prd_divloop: ;do\r
+ exx ; (main)\r
+ ld bc,10 ;\r
+ call div32_16 ; get a digit\r
+ ld a,c ;\r
+ add a,'0' ; make it printable\r
+ push af ;\r
+\r
+ ld a,h ;\r
+ or l ;\r
+ or d ;\r
+ or e ;\r
+ exx ; (alt)\r
+ inc sp ;\r
+ inc de ;\r
+ jr nz,prd_divloop ;\r
+\r
+prd_filloop: ;h=filler, l=field width\r
ld a,e\r
- or d\r
- jp nz,next\r
+ cp l\r
+ jr nc,prd_out\r
+ push hl\r
+ inc sp\r
+ inc de\r
+ jr prd_filloop\r
+prd_out:\r
+ ld hl,0\r
+ add hl,sp ;ptr to beginning of number string (hl==0 here)\r
+ call ?pmsg\r
+ ex de,hl\r
+ add hl,sp\r
+ ld sp,hl\r
+ inc sp ;remove string terminator\r
+ pop de\r
+ pop hl\r
+ exx ;(main)\r
+ pop bc\r
ret\r
\r
-table10:\r
- dw -1000,-100,-10,-1,0\r
\r
+;-------------------------------------------------------------------------------\r
+;\r
?pderr:\r
ld hl,drive$msg\r
call ?pmsg ; error header\r
call ?cono ; drive code\r
ld hl,track$msg\r
call ?pmsg ; track header\r
+ ld c,0\r
ld hl,(@trk)\r
- call ?pdec ; track number\r
+ call pr.dec ; track number\r
ld hl,sector$msg\r
call ?pmsg ; sector header\r
ld hl,(@sect)\r
- call ?pdec ; sector number\r
+ call pr.dec ; sector number\r
ret\r
\r
\r
\r
public f_cpu\r
\r
- extrn ?boot,?pmsg,?conin\r
+ extrn ?boot,?conin\r
+ extrn pr.inln,pr.crlf,pr.dec,pr.decl\r
extrn ioini1l,msginit,mmuinit,intinit,cpu_frq\r
extrn @civec,@covec,@aivec,@aovec,@lovec\r
extrn @cbnk,?bnksl\r
ld (@aovec),hl\r
\r
\r
- call intinit ; setup interrupts and vectors\r
+ call intinit ; setup interrupts and vectors\r
\r
xor a\r
- ld (@cbnk),a ; right now in bank 0\r
+ ld (@cbnk),a ; right now in bank 0\r
\r
- ld hl,signon$msg\r
- call ?pmsg ; print signon message\r
+ call pr.inln ; print signon message\r
+ db 13,10,13,10,'CP/M Version 3.0, Z180-Stamp BIOS',13,10,0\r
+\r
+ call pr.inln\r
+ db 'CPU clock [Hz]: ',0\r
+\r
+ ld de,(f_cpu)\r
+ ld hl,(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
?ldccp:\r
; First time, load the A:CCP.COM file into TPA\r
+ call resetdsk\r
xor a\r
ld (ccp$fcb+15),a ; zero extent\r
ld hl,0\r
ret\r
\r
no$ccp: ; here if we couldn't find the file\r
- ld hl,ccp$msg\r
- call ?pmsg ; report this...\r
+ call pr.inln ; report this...\r
+ db 13,10,'BIOS Err on A: No CCP.COM file',0\r
+\r
call ?conin ; get a response\r
jp ?ldccp ; and try again\r
\r
\r
; CP/M BDOS Function Interfaces\r
\r
+resetdsk:\r
+ ld c,13\r
+ jp bdos ; reset disk system\r
+\r
open:\r
ld c,15\r
jp bdos ; open file control block\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
-\r
\r
ccp$fcb:db 1,'CCP ','COM',0,0,0,0\r
ds 16\r
ret
;--------------------------------------------------------------------
-; HLDE: Divident (x)
-; BC: Divisor (y)
+; Divide 32 bit by 16
;
-; divide x/y
-; x: hl
-; y: de
-; return:
-; x/y: hl
-; rem: de
+; HLDE: Divident (x)
+; BC: Divisor (y)
+;
+; return:
+; HLDE: Quotient
+; BC: Reminder
cseg ; common area
div32_16:
ex de,hl ;de = x, hl = r
exx ;high
ld a,32 ;count
+;
+; divide x/y
+; x: hl
+; y: de
+; result:
+; x/y: hl
+; rem: de
div_lp: ;do
exx ; low
ex de,hl ; x
exx ; high
adc hl,bc ;
-div_no_restore:
-
- dec a
+div_no_restore: ;
+ dec a ;
jr nz,div_lp ;while (--count)
ex de,hl ; q
; Utility routines in standard BIOS\r
\r
extrn ?wboot ; warm boot vector\r
- extrn ?pmsg ; print message @<HL> up to 00, saves <BC> & <DE>\r
- extrn ?pdec ; print binary number in <A> from 0 to 99.\r
+ extrn ?pmsg,pr.inln ; print message @<HL>, print inline message\r
+ extrn pr.crlf ; print <cr><lf>\r
extrn ?pderr ; print BIOS disk error header\r
extrn ?conin,?cono ; con in and out\r
extrn ?const ; get console status\r
dw sd$write\r
dw sd$read\r
dw sd$login\r
- dw sd$init0\r
+ dw sd$init2\r
db 2,0 ; relative drive zero\r
sd2: dph 0,dpbsimhd512\r
\r
dw sd$write\r
dw sd$read\r
dw sd$login\r
- dw sd$init1\r
+ dw sd$init3\r
db 3,0 ; relative drive one\r
sd3: dph 0,dpbsimhd512\r
\r
tst 080h\r
jr z,prompt ; no fatfs error\r
\r
- ld hl,fsmsg\r
- call ?pmsg\r
+ call pr.inln\r
+ db 'FatFs: ',0\r
\r
ld hl,fr$msg0 ; point at first FatFs message\r
ld c,fr$msg$count\r
call pdecoded\r
\r
prompt:\r
- ld hl,error$msg\r
- call ?pmsg ; print "<BEL>, Retry (Y/N) ? "\r
+ call pr.inln\r
+ db ' Retry (Y/N) ? ',0\r
+\r
call u$conin$echo ; get operator response\r
cp 'Y'\r
jr z,retry ; Yes, then retry 10 more times\r
drvmsg_size equ $ - drvmsg0\r
drvmsg_count equ 3\r
\r
-fsmsg: db 'FatFs: ',0\r
\r
; table of pointers to error message strings\r
\r
fr$msg$size equ $ - fr$msg0\r
fr$msg$count equ 20\r
\r
-error$msg:\r
- db ' Retry (Y/N) ? ',0\r
-\r
-\r
end\r