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 ?pchar,?pmsg ; print char <A>, print message (<HL>)
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 from table @<HL>, indexed by <A>
221 push hl ; put pointer to first message on stack
222 ld b,a ; save message number
231 jr z,pdc_done ; End of List, msg not found. Print first msg.
233 ex (sp),hl ; Remove first msg from stack
235 pop hl ; Get msg. to print
239 ;-------------------------------------------------------------------------------
240 ; print message @<HL> up to a null
255 ;-------------------------------------------------------------------------------
256 ; print message inline up to a null
257 ; saves <BC>, <DE>, <HL>
265 ;-------------------------------------------------------------------------------
267 ; saves <BC>, <DE>, <HL>
274 ;-------------------------------------------------------------------------------
275 ; print hl as a 4 digit hexadecimal number
276 ; saves all registers
284 ;-------------------------------------------------------------------------------
285 ; print a as a 2 digit hexadecimal number
286 ; saves all registers
303 ;-------------------------------------------------------------------------------
304 ; print character in a
305 ; saves <BC>, <DE>, <HL>
318 ;-------------------------------------------------------------------------------
319 ; print decimal 16 bit number from HL
321 ; HL: unsigned binary number to print
322 ; C: minimum print field width
323 ; number is printed right-aligned
324 ; B: pad character, typically ' ' or '0'
333 ;-------------------------------------------------------------------------------
334 ; print decimal 32 bit number from DEHL
336 ; DEHL: unsigned binary number to print
337 ; C: minimum print field width
338 ; number is printed right-aligned
339 ; B: pad character, typically ' ' or '0'
342 push bc ;save width and fillchar
345 ex (sp),hl ;save hl', get width and fill
349 ld d,a ;clear counter
351 push af ; string terminator
357 call div32_16 ; get a digit
359 add a,'0' ; make it printable
371 prd_filloop: ;h=filler, l=field width
381 add hl,sp ;ptr to beginning of number string (hl==0 here)
386 inc sp ;remove string terminator
394 ;-------------------------------------------------------------------------------
400 call pr.inln ; error header
401 db cr,lf,bell,'BIOS Error on '
407 call pr.dec ; track number
408 call pr.inln ; sector header
411 jp pr.dec ; sector number
413 ;-------------------------------------------------------------------------------
414 ; get console input, echo it, and shift to upper case
424 jr z,u$c1 ; see if any char already struck
426 jr u$c0 ; yes, eat it and try again
439 sub 'a'-'A' ; make upper case
442 ;-------------------------------------------------------------------------------
447 ; suppress error message if BDOS
448 ; is returning errors to application...
453 dec a ;return NZ, if @ermde == 0FFH
461 ; Had permanent error, print message like:
462 ; BIOS Err on d: T-nn, S-mm, <operation> <type>, Retry ?
464 call ?pderr ; print message header
468 jp pr.idx ; last function (read or write)
475 call uciecho ; get operator response
477 ret ; return Z-flag for yes