X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/4cd9d9817858107c42aaebd868942f882a6dcd6a..e8a98308cd28da296993a9085df28dc5957de86d:/cbios/utils.180?ds=sidebyside diff --git a/cbios/utils.180 b/cbios/utils.180 index bbe5ac3..4b74750 100644 --- a/cbios/utils.180 +++ b/cbios/utils.180 @@ -6,21 +6,24 @@ ; math + public ijphl ; vectored CALL point public add_hla ; add a to hl public div32_16,div32_r ; divide 32 bit by 16 bit number (rounded) ; print utils - public ?pmsg ; print message + public ?pchar,?pmsg ; print char , print message () + public pr.idx ; print message from table indexed by public pr.inln,pr.crlf ; print message inline, print newline - public phex2,phex4 ; print 2 digit hex (A) or 4 digit hex (HL) + public phex2,phex4 ; print 2 digit hex or 4 digit hex public pr.dec,pr.decl ; print 16 or 32 bit decimal number - public ?pderr ; print BIOS disk error message header + public pr.errors ; print BIOS disk error message header - extrn ?cono + extrn ?const,?conin,?cono extrn @adrv,@trk,@sect ; used by disk error message + extrn @op,@ermde ;------------------------------------------------------------------------------- @@ -82,6 +85,16 @@ io1_nxt: pop bc ret + cseg + +;-------------------------------------------------------------------- +; vectored CALL point + +ijphl: + jp (hl) + + dseg + ;-------------------------------------------------------------------- ; add a to hl ; @@ -199,47 +212,63 @@ div_no_restore: ; exx ;high ret +;------------------------------------------------------------------------------- +; print message from table @, indexed by +; saves & + +pr.idx: + push bc + push hl ; put pointer to first message on stack + ld b,a ; save message number + or a + jr z,pdc_done + xor a +pdc_skip: + bit 7,(hl) + inc hl + jr z,pdc_skip + cp (hl) + jr z,pdc_done ; End of List, msg not found. Print first msg. + djnz pdc_skip + ex (sp),hl ; Remove first msg from stack +pdc_done: + pop hl ; Get msg. to print + pop bc + ;fall thru + ;------------------------------------------------------------------------------- ; print message @ up to a null ; saves & ?pmsg: - push bc - push de -pmsg$loop: ld a,(hl) inc hl - or a - jr z,pmsg$exit - ld c,a - push hl - call ?cono - pop hl - jr pmsg$loop -pmsg$exit: - pop de - pop bc + and 07fh + ret z + call ?pchar + dec hl + bit 7,(hl) + inc hl + jr z,?pmsg ret ;------------------------------------------------------------------------------- ; print message inline up to a null -; saves all registers +; saves , , pr.inln: ex (sp),hl - push af call ?pmsg - pop af ex (sp),hl ret ;------------------------------------------------------------------------------- ; print -; saves all registers +; saves , , pr.crlf: call pr.inln - db cr,lf,0 + dc cr,lf ret ;------------------------------------------------------------------------------- @@ -266,32 +295,32 @@ phex2: pop af print.digit: - push hl - push de - push bc - push af - and 00fh - cp 10 - jr c,prd_1 - add a,007h -prd_1: - add a,'0' + daa + add a,0a0h + adc a,040h + ;fall thru +;------------------------------------------------------------------------------- +; print character in a +; saves , , + +?pchar: + push bc + push de + push hl ld c,a call ?cono - pop af - pop bc - pop de pop hl + pop de + pop bc ret - ;------------------------------------------------------------------------------- ; print decimal 16 bit number from HL ; ; HL: unsigned binary number to print ; C: minimum print field width -; number is prined right-aligned +; number is printed right-aligned ; B: pad character, typically ' ' or '0' pr.dec: @@ -306,7 +335,7 @@ pr.dec: ; ; DEHL: unsigned binary number to print ; C: minimum print field width -; number is prined right-aligned +; number is printed right-aligned ; B: pad character, typically ' ' or '0' pr.decl: @@ -365,24 +394,93 @@ prd_out: ;------------------------------------------------------------------------------- ?pderr: - ld hl,drive$msg - call ?pmsg ; error header ld a,(@adrv) add a,'A' - ld c,a - call ?cono ; drive code - ld hl,track$msg - call ?pmsg ; track header + ld (msg_drv),a + call pr.inln ; error header + db cr,lf,bell,'BIOS Error on ' +msg_drv: + db 'A' + dc ': T-' ld c,0 ld hl,(@trk) call pr.dec ; track number - ld hl,sector$msg - call ?pmsg ; sector header + call pr.inln ; sector header + dc ', S-' ld hl,(@sect) - call pr.dec ; sector number + jp pr.dec ; sector number + +;------------------------------------------------------------------------------- +; get console input, echo it, and shift to upper case +; save hl,de,bc + +uciecho: + push hl + push de + push bc +u$c0: + call ?const + or a + jr z,u$c1 ; see if any char already struck + call ?conin + jr u$c0 ; yes, eat it and try again +u$c1: + call ?conin + push af + ld c,a + cp ' '-1 + call nc,?cono + pop af + pop bc + pop de + pop hl + cp 'a' + ret c + sub 'a'-'A' ; make upper case + ret + +;------------------------------------------------------------------------------- +; + +pr.errors: + + ; suppress error message if BDOS + ; is returning errors to application... + + ld a,(@ermde) + inc a + jr nz,pre1 + dec a ;return NZ, if @ermde == 0FFH ret +pre1: + push hl + ld hl,pre2 + ex (sp),hl + push hl + + ; Had permanent error, print message like: + ; BIOS Err on d: T-nn, S-mm, , Retry ? + + call ?pderr ; print message header + + ld hl,op$msg + ld a,(@op) + jp pr.idx ; last function (read or write) + +pre2: + ; prompt for retry + call pr.inln + dc ' Retry (Y/N) ? ' + + call uciecho ; get operator response + cp 'Y' + ret ; return Z-flag for yes + + +op$msg: + dc ', Unknown op, ' + dc ', Read, ' + dc ', Write, ' + db 0 - ; error message components -drive$msg: db cr,lf,bell,'BIOS Error on ',0 -track$msg: db ': T-',0 -sector$msg: db ', S-',0 + end