1 title 'general utility routines'
3 ; i/o port init routines
5 public ioiniml,ioini1l ;
9 public ijphl ; vectored CALL point
10 public add_hla ; add a to hl
11 public div32_16,div32_r ; divide 32 bit by 16 bit number (rounded)
15 public ?pmsg ; print message
16 public pr.idx ; print message from table indexed by <A>
17 public pr.inln,pr.crlf ; print message inline, print newline
18 public phex2,phex4 ; print 2 digit hex <A> or 4 digit hex <HL>
19 public pr.dec,pr.decl ; print 16 or 32 bit decimal number
20 public pr.errors ; print BIOS disk error message header
24 extrn ?const,?conin,?cono
25 extrn @adrv,@trk,@sect ; used by disk error message
28 ;-------------------------------------------------------------------------------
37 ;----------------------------------------------------------------------
38 ; output bytes to consecutive portaddresses
40 ; hl: table with following structure:
41 ; db n, port1, val1, val2,... valn
42 ; db m, port1, val1, val2,... valm
44 ; db 0 ; Terminate table
63 ;----------------------------------------------------------------------
64 ; output bytes to ports
66 ; hl: tables of port,value pairs:
67 ; db n, port1,val1, port2,val2,... portn,valn
69 ; db 0 ; Terminate table
75 ld c,(hl) ;port address
90 ;--------------------------------------------------------------------
98 ;--------------------------------------------------------------------
112 ;--------------------------------------------------------------------
113 ; rounded div 32 by 16 bit
118 ; HLDE: Rounded Quotient (q)
125 add hl,bc ;low x + y/2
132 ;--------------------------------------------------------------------
133 ; Divide 32 bit by 16
144 push de ;save alternate registers (de,bc)
155 ex (sp),hl ;hl' = lx, save alternate hl
156 ld de,0 ;de' = lr = 0
157 ex de,hl ;de = x, hl = r
162 ; de: x (de: hx, de': lx)
163 ; bc: y (bc: hy, bc': ly)
194 jr nz,div_lp ;while (--count)
197 ; de: q (de: hq, de': lq)
198 ; hl: r (hl: hr, hl': lr)
201 ex de,hl ;hl = lq, de = lr
210 pop bc ;restore alternate registers
215 ;-------------------------------------------------------------------------------
216 ; print message @<HL> up to a null
237 ;-------------------------------------------------------------------------------
238 ; print message from table @<HL>, indexed by <A>
244 push hl ; put pointer to first message on stack
245 ld e,a ; save message number
258 ; End of List, msg not found.
267 ;-------------------------------------------------------------------------------
268 ; print message inline up to a null
269 ; saves all registers
279 ;-------------------------------------------------------------------------------
281 ; saves all registers
288 ;-------------------------------------------------------------------------------
289 ; print hl as a 4 digit hexadecimal number
290 ; saves all registers
298 ;-------------------------------------------------------------------------------
299 ; print a as a 2 digit hexadecimal number
300 ; saves all registers
332 ;-------------------------------------------------------------------------------
333 ; print decimal 16 bit number from HL
335 ; HL: unsigned binary number to print
336 ; C: minimum print field width
337 ; number is prined right-aligned
338 ; B: pad character, typically ' ' or '0'
347 ;-------------------------------------------------------------------------------
348 ; print decimal 32 bit number from DEHL
350 ; DEHL: unsigned binary number to print
351 ; C: minimum print field width
352 ; number is prined right-aligned
353 ; B: pad character, typically ' ' or '0'
356 push bc ;save width and fillchar
359 ex (sp),hl ;save hl', get width and fill
363 ld d,a ;clear counter
365 push af ; string terminator
371 call div32_16 ; get a digit
373 add a,'0' ; make it printable
385 prd_filloop: ;h=filler, l=field width
395 add hl,sp ;ptr to beginning of number string (hl==0 here)
400 inc sp ;remove string terminator
408 ;-------------------------------------------------------------------------------
412 call ?pmsg ; error header
416 call ?cono ; drive code
418 call ?pmsg ; track header
421 call pr.dec ; track number
423 call ?pmsg ; sector header
425 jp pr.dec ; sector number
427 ; error message components
428 drive$msg: db cr,lf,bell,'BIOS Error on ',0
429 track$msg: db ': T-',0
430 sector$msg: db ', S-',0
433 ;-------------------------------------------------------------------------------
434 ; get console input, echo it, and shift to upper case
444 jr z,u$c1 ; see if any char already struck
446 jr u$c0 ; yes, eat it and try again
459 sub 'a'-'A' ; make upper case
462 ;-------------------------------------------------------------------------------
467 ; suppress error message if BDOS
468 ; is returning errors to application...
473 dec a ;return NZ, if @ermde == 0FFH
481 ; Had permanent error, print message like:
482 ; BIOS Err on d: T-nn, S-mm, <operation> <type>, Retry ?
484 call ?pderr ; print message header
488 jp pr.idx ; last function (read or write)
493 db ' Retry (Y/N) ? ',0
495 call uciecho ; get operator response
497 ret ; return Z-flag for yes
501 db ', Unknown op, ',0