2 title 'general utility routines'
4 ; i/o port init routines
6 public ioiniml,ioini1l ;
10 public ijphl ; vectored CALL point
11 public add_hla ; add a to hl
12 public div32_16,div32_r ; divide 32 bit by 16 bit number (rounded)
16 public ?pmsg ; print message
17 public pr.idx ; print message from table indexed by <A>
18 public pr.inln,pr.crlf ; print message inline, print newline
19 public phex2,phex4 ; print 2 digit hex <A> or 4 digit hex <HL>
20 public pr.dec,pr.decl ; print 16 or 32 bit decimal number
21 public pr.errors ; print BIOS disk error message header
25 extrn ?const,?conin,?cono
26 extrn @adrv,@trk,@sect ; used by disk error message
29 ;-------------------------------------------------------------------------------
38 ;----------------------------------------------------------------------
39 ; output bytes to consecutive portaddresses
41 ; hl: table with following structure:
42 ; db n, port1, val1, val2,... valn
43 ; db m, port1, val1, val2,... valm
45 ; db 0 ; Terminate table
64 ;----------------------------------------------------------------------
65 ; output bytes to ports
67 ; hl: tables of port,value pairs:
68 ; db n, port1,val1, port2,val2,... portn,valn
70 ; db 0 ; Terminate table
76 ld c,(hl) ;port address
88 ;--------------------------------------------------------------------
94 ;--------------------------------------------------------------------
108 ;--------------------------------------------------------------------
109 ; rounded div 32 by 16 bit
114 ; HLDE: Rounded Quotient (q)
121 add hl,bc ;low x + y/2
128 ;--------------------------------------------------------------------
129 ; Divide 32 bit by 16
140 push de ;save alternate registers (de,bc)
151 ex (sp),hl ;hl' = lx, save alternate hl
152 ld de,0 ;de' = lr = 0
153 ex de,hl ;de = x, hl = r
158 ; de: x (de: hx, de': lx)
159 ; bc: y (bc: hy, bc': ly)
190 jr nz,div_lp ;while (--count)
193 ; de: q (de: hq, de': lq)
194 ; hl: r (hl: hr, hl': lr)
197 ex de,hl ;hl = lq, de = lr
206 pop bc ;restore alternate registers
211 ;-------------------------------------------------------------------------------
212 ; print message @<HL> up to a null
233 ;-------------------------------------------------------------------------------
234 ; print message from table @<HL>, indexed by <A>
240 push hl ; put pointer to first message on stack
241 ld e,a ; save message number
254 ; End of List, msg not found.
263 ;-------------------------------------------------------------------------------
264 ; print message inline up to a null
265 ; saves all registers
275 ;-------------------------------------------------------------------------------
277 ; saves all registers
284 ;-------------------------------------------------------------------------------
285 ; print hl as a 4 digit hexadecimal number
286 ; saves all registers
294 ;-------------------------------------------------------------------------------
295 ; print a as a 2 digit hexadecimal number
296 ; saves all registers
328 ;-------------------------------------------------------------------------------
329 ; print decimal 16 bit number from HL
331 ; HL: unsigned binary number to print
332 ; C: minimum print field width
333 ; number is prined right-aligned
334 ; B: pad character, typically ' ' or '0'
343 ;-------------------------------------------------------------------------------
344 ; print decimal 32 bit number from DEHL
346 ; DEHL: unsigned binary number to print
347 ; C: minimum print field width
348 ; number is prined right-aligned
349 ; B: pad character, typically ' ' or '0'
352 push bc ;save width and fillchar
355 ex (sp),hl ;save hl', get width and fill
359 ld d,a ;clear counter
361 push af ; string terminator
367 call div32_16 ; get a digit
369 add a,'0' ; make it printable
381 prd_filloop: ;h=filler, l=field width
391 add hl,sp ;ptr to beginning of number string (hl==0 here)
396 inc sp ;remove string terminator
404 ;-------------------------------------------------------------------------------
408 call ?pmsg ; error header
412 call ?cono ; drive code
414 call ?pmsg ; track header
417 call pr.dec ; track number
419 call ?pmsg ; sector header
421 jp pr.dec ; sector number
423 ; error message components
424 drive$msg: db cr,lf,bell,'BIOS Error on ',0
425 track$msg: db ': T-',0
426 sector$msg: db ', S-',0
429 ;-------------------------------------------------------------------------------
430 ; get console input, echo it, and shift to upper case
440 jr z,u$c1 ; see if any char already struck
442 jr u$c0 ; yes, eat it and try again
455 sub 'a'-'A' ; make upper case
458 ;-------------------------------------------------------------------------------
463 ; suppress error message if BDOS
464 ; is returning errors to application...
469 dec a ;return NZ, if @ermde == 0FFH
477 ; Had permanent error, print message like:
478 ; BIOS Err on d: T-nn, S-mm, <operation> <type>, Retry ?
480 call ?pderr ; print message header
484 jp pr.idx ; last function (read or write)
489 db ' Retry (Y/N) ? ',0
491 call uciecho ; get operator response
493 ret ; return Z-flag for yes
497 db ', Unknown op, ',0