home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / hd64180a.lbr / CSUBS.AZM / CSUBS.ASM
Assembly Source File  |  1991-08-04  |  20KB  |  933 lines

  1.     title    'CORE Board Subroutines'
  2. ;
  3. ;----------------------------------------------------------------
  4. ;         ---- CORE SUBROUTINES Module ----
  5. ;
  6. ; This is a library of subroutines for CORE BOARD that must
  7. ; do simple functions like arithmetic, caps, delay etc.
  8. ;
  9. ;    Written     By Richard Holmes    04-02-86
  10. ;    Last Update by Richard Holmes    29-06-86
  11. ;
  12. ;----------------------------------------------------------------
  13. ;
  14.     public    phacc,prhex,phexl,crlf        ; ptxt
  15.     public    caps,delay,bell
  16.     public    nibasc,hexbcd,pdde,phde,pdacc
  17.     public    pdhl,get$yn,get$yns,makasc
  18.     public    space,space2,space3,lz$pdde,lz$pdacc
  19.     public    slash,colon,comma,idhl,ihhl,get$txt
  20.     public    inline,phhl,ptxt
  21. ;
  22.     public    rnd$ini,rnd$8,rnd$16
  23. ;
  24.     extrn    clr$wdt,cie,coe,cst
  25. ;
  26.     maclib    core
  27.     maclib    z80
  28. ;
  29. ;----------------------------------------------------------------
  30. ; Print the message at the return address till a '$' or
  31. ; a null.
  32. ; Return to the program at the address just after the null
  33. ; or '$'.
  34. ;----------------------------------------------------------------
  35. ;
  36. inline:    
  37.     xthl                ; get address of string (ret address)
  38.     push    psw
  39. inline2:
  40.     mov    a,m
  41.     inx    h            ; point to next character
  42.     cpi    '$'
  43.     jrz    inline3
  44.     ora    a
  45.     jrz    inline3
  46.     call    coe
  47.     jr    inline2
  48. inline3:
  49.     pop    psw
  50.     xthl                ; load return address after the '$'
  51.     ret                ; back to code immediately after string
  52. ;
  53. ;
  54. ;================================================================
  55. ; The following two entry points read ascii from the KEYBOARD
  56. ; and convert to a number into the HL register pair.
  57. ;
  58. ; 1) IDHL    Read a DECIMAL number into HL. Note that the result 
  59. ;        is HEX still so that it can be used as a counter 
  60. ;        ie. 100 input returns HL = 64.
  61. ; 2) IHHL    Read a HEX number into HL
  62. ;
  63. ; Both routines return zero in A if the last character read was a legal
  64. ; digit else A will contain the error character.
  65. ;================================================================
  66. ;
  67. idhl:
  68.     call    get$buf            ; load the buffer from console
  69.     lxi    h,0
  70.     lda    bufsiz
  71.     ora    a
  72.     rz                ; quit if nothing read
  73. ; Now read the buffer, condition, put into HL.
  74.     push    b            ; save
  75.     push    d
  76.     mov    b,a            ; use as a counter
  77. idhl2:
  78.     call    get$chr            ; Get a character
  79. ; Convert to a binary value now of 0..9
  80.     sui    '0'            
  81.     jrc    inp$err         ; Error since a non number
  82.     cpi    9 + 1            ; Check if greater than 9
  83.     jrnc    inp$err
  84. ; Now shift the result to the right by multiplying by 10 then add in this digit
  85.     mov    d,h            ; copy HL -> DE
  86.     mov    e,l
  87.     dad    h            ; * 2
  88.     dad    h            ; * 4
  89.     dad    d            ; * 5
  90.     dad    h            ; * 10 total now
  91. ; Now add in the digit from the buffer
  92.     mov    e,a
  93.     mvi    d,00
  94.     dad    d            ; all done now
  95. ; Loop on till all characters done
  96.     djnz    idhl2            ; do next character from buffer
  97.     jr    inp$end            ; all done
  98. ;
  99. ;
  100. ;----------------------------------------------------------------
  101. ; Read a HEX number into HL from the keyboard.
  102. ;----------------------------------------------------------------
  103. ;
  104. ihhl:
  105.     call    get$buf
  106.     lxi    h,00
  107.     lda    bufsiz
  108.     ora    a
  109.     rz                ; return if no character read
  110. ;
  111.     push    b
  112.     push    d            ; save
  113.     mov    b,a
  114. ;
  115. ihhl2:
  116.     call    get$chr            ; get a character
  117. ; Now convert the nibble to a hex digit 0..F
  118.     sui    '0'
  119.     cpi    9 + 1
  120.     jrc    ihhl3            ; mask in then
  121.     sui    'A'-'0'-10
  122.     cpi    16
  123.     jrnc    inp$err
  124. ;
  125. ; Shift the result left 4 bits and MASK in the digit in A
  126. ihhl3:
  127.     dad    h
  128.     dad    h
  129.     dad    h
  130.     dad    h            ; shifted right 4 now
  131.     ora    l            ; mask in the digit
  132.     mov    l,a            ; put back
  133.     djnz    ihhl2            ; keep on till all digits done
  134. ;
  135. inp$end:
  136.     xra    a            ; Zero is a goo exit
  137. inp$end2:
  138.     pop    d
  139.     pop    b
  140.     ret
  141. ;
  142. inp$err:    ; Here when a non digit is encountered
  143.     lda    buftmp
  144.     jr    inp$end2
  145. ;
  146. ; Subroutines for shared code etc....
  147. ;
  148. get$buf:    ; Load the buffer from the screen via CBUFF.
  149.     push    d
  150.     mvi    a,6
  151.     sta    buffer            ; Set up ready for user
  152.     xra    a
  153.     sta    buffer+1        ; clear buffer original value
  154.     lxi    d,buffer
  155.     call    get$txt            ; Get a text buffer full
  156.     pop    d
  157.     lxi    h,buftxt        ; point to the start of text
  158.     shld    bufadr            ; set up a pointer
  159.     lxi    h,00            ; clear the result register
  160.     ret
  161. ;
  162. ; Get a character from the buffer, capitalize it on the way
  163. ;
  164. get$chr:
  165.     push    h
  166.     lhld    bufadr
  167.     mov    a,m            ; get the character
  168.     sta    buftmp            ; save the character
  169.     inx    h            ; point to next character
  170.     shld    bufadr
  171.     pop    h            ; restore
  172. ; Now capitalize it
  173.     jmp    caps
  174. ;
  175. ;================================================================
  176. ;    ---- Read a text string ----
  177. ;
  178. ; This routine reads a line of input from the console and puts it into
  179. ; a standard CP/M console buffer pointed to by DE on entry. This is
  180. ; a little nicer that CP/M as it allows buffers to be pre-initialized 
  181. ; so that it is printed when the buffer is input so that defaults can
  182. ; be loaded before entry of data.
  183. ;
  184. ; On Entry
  185. ;    DE -> console buffer max size byte
  186. ;
  187. ; On Exit
  188. ;    buffer filled from console to max size limit
  189. ;    All registers preserved
  190. ;
  191. ;================================================================
  192. ;
  193. get$txt:
  194.     push    psw
  195.     ldax    d            ; get buffer size in bytes
  196.     ora    a
  197.     jz    cbuff$end
  198.     push    h
  199.     push    b
  200.     push    d
  201.     xchg                ; put string address into HL
  202.     mov    c,a            ; Now C = buffer maximum size
  203. init:
  204.     mvi    b,00            ; characters read = 0
  205.     inx    h            ; hl -> size of character read now
  206. ;
  207. ; Here we detect if there is some data in the buffer to be pre printed
  208. ; and if there is the we print it.
  209. ;
  210.     mov    a,m            ; get number of chars. in the buffer
  211.     inx    h            ; point to string space now.
  212.     ora    a
  213.     jrz    rdloop
  214. ; Print the initialized character string, save the size for later
  215.     mov    b,a
  216.     push    b            ; save
  217. init2:
  218.     mov    a,m            ; get the character
  219.     inx    h            ; point to next string space byte
  220.     call    dspchr            ; print it, maybe control character
  221.     djnz    init2            ; print all characters
  222.     pop    b            ; restore # of characters
  223. ;
  224. ;
  225. ; On entry here HL-> string space, next free byte, B = number of characters
  226. ; in the string. C = number of bytes in the buffer.
  227. ;
  228. rdloop:
  229.     call    cie            ; Fetch a character
  230.     cpi    0dh            ; end if carriage return
  231.     jrz    exitrd            ; exit
  232.     cpi    0ah
  233.     jrz    exitrd
  234.     cpi    08            ; backspace ??
  235.     jrnz    rdlp1            ; if not then continue
  236.     call    backsp            ; else backspace
  237.     jr    rdloop            ; keep on backspacing
  238. rdlp1:
  239.     cpi    018h            ; delete line ?
  240.     jrnz    rdlp2
  241. del1:
  242.     call    backsp            ; delete a character
  243.     jrnz    del1            ; keep on till all character deaded
  244.     jr    rdloop            ; start again ebonettes
  245. ;
  246. ; If here we check if the buffer is full. If so we ring the bell
  247. rdlp2:
  248.     mov    e,a            ; save the character
  249.     mov    a,b            ; load byte count
  250.     cmp    c            ; is it equal to the maximum ?
  251.     jrc    strch            ; store the character if not full
  252.     call    bell            ; else ring the bell
  253.     jr    rdloop            ; get more characters
  254. ;
  255. ; Buffer not full so save the character
  256. strch:
  257.     mov    a,e            ; get character
  258.     mov    m,a            ; save it
  259.     inx    h            ; point to next buffer byte
  260.     inr    b            ; increment byte count
  261.     call    dspchr            ; display the (maybe control) character
  262.     jr    rdloop            ; do again, more characters
  263. ;
  264. ; Display a control character by preceeding it with a  '^'
  265. ;
  266. dspchr:
  267.     cpi    020h            ; was it a space ?
  268.     jnc     coe             ; if not then print & return
  269.     mov    e,a            ; else save character
  270.     mvi    a,'^'            ; indicate a control character
  271.     call    coe
  272.     mov    a,e            ; restore character
  273.     adi    040h            ; make printable
  274.     jmp     coe
  275. ;
  276. ; Send a backspace and detect if at the start of the line.
  277. ;
  278. backsp:
  279.     mov    a,b            ; get character count
  280.     ora    a
  281.     rz                ; return if line empty
  282.     dcx    h            ; decrement byte pointer
  283.     mov    a,m            ; get the character
  284.     cpi    020h            ; is it a control character ?
  285.     jrnc    bsp1            ; if not then delete 1 char only
  286.     call    bsp            ; send a backspace
  287. bsp1:
  288.     call    bsp            ; backspace 1
  289.     dcr    b            ; one less string byte
  290.     ret
  291. ;
  292. ; Send the backspace
  293. bsp:
  294.     mvi    a,08
  295.     call    coe            ; Go back a char not req-r for cp/m
  296.     mvi    a,' '            ; erase the character
  297.     call    coe
  298.     mvi    a,08
  299.     jmp    coe            ; send and return
  300. ;
  301. ; Set the number of bytes read into the buffer byte at DE + 1.
  302. ;
  303. exitrd:
  304.     pop    d            ; restore all registers (buffer addr)
  305.     mov    a,b            ; get # of characters
  306.     inx    d
  307.     stax    d            ; save in characters read byte
  308.     dcx    d            ; restore de
  309. ;
  310.     pop    b
  311.     pop    h
  312. cbuff$end:
  313.     pop    psw
  314.     ora    a            ; Clear carry
  315.     ret
  316. ;
  317. ;================================================================
  318. ;           
  319. ;            Conversion routines
  320. ;
  321. ;================================================================
  322. ;
  323. ;     ---- Convert low nibble of A to ascii ----
  324. ;
  325. ;================================================================
  326. ;
  327. nibasc:
  328.     ani    0fh
  329.     adi    090h
  330.     daa
  331.     aci    040h
  332.     daa
  333.     ret
  334. ;
  335. ;================================================================
  336. ;
  337. ;     Convert the hex number in DE into DECIMAL in HL
  338. ;
  339. ;================================================================
  340. ;
  341. hexbcd:
  342.     sded    ?binnum            ; save the number to convert
  343.     push    b
  344.     push    h
  345. ; Do the conversion
  346.     mvi    b,3            ; 3 bytes to clear
  347. hexbcd1:
  348.     mvi    m,00
  349.     inx    h
  350.     djnz    hexbcd1            ; clear 3 bytes
  351. ;
  352.     mvi    b,16            ; 16 bits to convert
  353. cloop:
  354.     lxi    h,?binnum
  355.     mvi    c,2            ; bytes in the binary number
  356.     xra    a            ; clear carry
  357. rloop:
  358.     mov    a,m
  359.     ral
  360.     mov    m,a
  361.     inx    h
  362.     dcr    c
  363.     jnz    rloop            ; keep rotating till C = 0
  364. ;
  365.     pop    h
  366.     push    h            ; restore the result address
  367.     mvi    c,3            ; 3 byte result = 6 digits
  368. ;
  369. bloop:
  370.     mov    a,m
  371.     adc    m
  372.     daa
  373.     mov    m,a            ; save
  374.     inx    h
  375.     dcr    c
  376.     jnz    bloop
  377. ;
  378.     djnz    cloop            ; do for all bits requited.
  379. ;
  380.     pop    h
  381.     pop    b            ; clear stack
  382.     ret                ; trick code here boys
  383. ;
  384. ;================================================================
  385. ;             Print HL as decimals
  386. ;================================================================
  387. ;
  388. pdhl:
  389.     push    d
  390.     push    h
  391.     xchg                ; DE = value
  392.     call    pdde            ; Print it
  393.     pop    h
  394.     pop    d
  395.     ret
  396. ;
  397. ;================================================================
  398. ;
  399. ;         ---- Print DE as decimal ----
  400. ;
  401. ;================================================================
  402. ;
  403. pdde:
  404.     push    h
  405.     push    d
  406.     lxi    h,?result
  407.     call    hexbcd            ; convert to ascii in internal buffer
  408. ; Now print the 5 digit number
  409.     lda    ?result+2        ; get the MSDigit
  410.     ora    a            ; A null ? - Suppress it if so
  411.     jrz    pdde1
  412.     call    nibasc            ; convert lower nibble
  413.     call    coe            ; Print it
  414. ; Now do other 4 digits
  415. pdde1:
  416.     lda    ?result+1
  417.     call    prhex            ; Print it high 2
  418.     lda    ?result
  419.     call    prhex            ;          low 2
  420.     pop    d
  421.     pop    h
  422.     ret
  423. ;
  424. ;================================================================
  425. ;
  426. ;     ---- Leading Zero Print of DE in decimal ----
  427. ;
  428. ;================================================================
  429. ;
  430. lz$pdde:
  431.     push    h
  432.     push    d
  433.     push    b
  434.     lxi    h,?result
  435.     call    hexbcd            ; convert to ascii in internal buffer
  436. ; Now print the 5 digit number. Suppress leading digits.
  437.     mvi    c,0
  438.     lda    ?result+2        ; Get the MSDigit
  439.     ani    0fh
  440.     call    ccoe            ; Conditional output
  441. ;
  442.     lda    ?result + 1
  443.     push    psw
  444.     rar
  445.     rar
  446.     rar
  447.     rar
  448.     call    ccoe
  449. ;
  450.     pop    psw
  451.     call    ccoe
  452. ;
  453.     lda    ?result            ; Least significant 2 digits
  454.     push    psw
  455.     rar
  456.     rar
  457.     rar
  458.     rar
  459.     call    ccoe
  460. ;
  461.     pop    psw
  462.     call    nibasc            ; Always print last digit
  463.     call    coe
  464.     pop    b
  465.     pop    d
  466.     pop    h
  467.     ret
  468. ;
  469. ;----------------------------------------------------------------
  470. ; Conditional print of A. This is part of the leading zero 
  471. ; printing routine. It prints a '0' if register C is > 0.
  472. ; If the number in A is > 0, register C is set to 80 so
  473. ; that all following numbers are forced out.
  474. ;
  475. ;----------------------------------------------------------------
  476. ;
  477. ccoe:
  478.     ani    0000$1111b        ; Eliminate top 4 bits
  479.     ora    a            ; Low nibble > 0 ?
  480.     jrz    ccoe1
  481.     setb    7,c            ; Set top bit.
  482. ;
  483. ccoe1:
  484.     bit    7,c            ; Forcing number out ?
  485.     rz                ; If not, exit.
  486.     call    nibasc            ; Else convert A to ascii
  487.     jmp    coe            ; And print it.
  488. ;
  489. ;================================================================
  490. ;       ---- Print HL as 4 hex digits ----
  491. ;================================================================
  492. ;
  493. phhl:
  494.     xchg
  495.     call    phde
  496.     xchg
  497.     ret
  498. ;
  499. ;================================================================
  500. ;
  501. ;    ---- Print DE as 4 hex digits ----
  502. ;
  503. ;================================================================
  504. ;
  505. phde:
  506.     push    psw
  507.     push    d
  508.     mov    a,d
  509.     call    prhex
  510.     mov    a,e
  511.     call    prhex
  512.     pop    d
  513.     pop    psw
  514.     ret
  515. ;
  516. ;================================================================
  517. ;
  518. ;     ---- Print decimal accumulator ----
  519. ; Note that if A > 99 the top digit is also printed, not if < 99
  520. ;
  521. ;================================================================
  522. ;
  523. pdacc:
  524.     push    d
  525.     push    h
  526.     push    psw
  527.     mov    e,a
  528.     mvi    d,0
  529.     lxi    h,?result
  530.     call    hexbcd
  531.     pop    psw
  532.     push    psw
  533.     cpi    99
  534.     jrc    pdacc1            ; < 99, skip it
  535.     lda    ?result + 1        ; Top digit
  536.     call    nibasc
  537.     call    coe            ; Print top digit 1 or 2
  538. pdacc1:
  539.     lda    ?result + 0
  540.     call    prhex            ; Print low 2 digits
  541.     pop    psw
  542.     pop    h
  543.     pop    d
  544.     ret
  545. ;
  546. ;================================================================
  547. ;
  548. ;    ---- Leading zero print the accumulator in decimal ----
  549. ;
  550. ;================================================================
  551. ;
  552. lz$pdacc:
  553.     push    h
  554.     push    b
  555.     push    d
  556.     push    psw
  557.     mov    e,a
  558.     mvi    d,0
  559.     lxi    h,?result
  560.     call    hexbcd
  561.     lda    ?result + 1
  562.     mvi    c,0            ; LZB status register clear
  563.     call    ccoe            ; Print hundreds digit
  564. ; Second top
  565.     lda    ?result
  566.     push    psw
  567.     rar
  568.     rar
  569.     rar
  570.     rar
  571.     call    ccoe            ; Print tens digit
  572. ;
  573.     pop    psw
  574.     call    nibasc
  575.     call    coe            ; print units
  576. ;
  577.     pop    psw
  578.     pop    d
  579.     pop    b
  580.     pop    h
  581.     ret
  582. ;
  583. ;================================================================
  584. ;
  585. ;         Delay the number of milliseconds in DE
  586. ;
  587. ;================================================================
  588. ;
  589. delay:
  590.     mov    a,e
  591.     ora    d
  592.     rz
  593. ;
  594.     push    d            ; save it
  595. delay2:
  596.     call    clr$wdt
  597.     call    delay3
  598.     dcx    d            ; one less millisecond less overhead
  599.     mov    a,d
  600.     ora    e
  601.     jrnz    delay2            ; keep on till DE = 0
  602.     pop    d            ; restore users initial value
  603.     ret                ; back to user
  604. ;
  605. ; Delay 1 millisecond less the overhead involved in the above code.
  606. ;
  607. ; This routine must delay 3957 t-states
  608. ;
  609. delay3:
  610.     push    b            ; 11
  611.     mvi    b,224            ;  7
  612. delay4:    ; This loop does (4 + 13) * 230 - 5 = 3905 t
  613.     nop                ; 4
  614.     djnz    delay4            ; 13
  615. ; Fudge 14 machine cycles
  616.     lxi    b,0            ; 10
  617.     nop                ;  4
  618.     pop    b            ; 10
  619. ;
  620.     ret
  621. ;
  622. ;================================================================
  623. ;
  624. ;     ---- Capitalize the accumulator ----
  625. ;
  626. ;================================================================
  627. ;
  628. caps:
  629.     cpi    'a'            ; Convert lower case to upper
  630.     rc
  631.     cpi    'z'+1
  632.     rnc
  633.     ani    5fh
  634.     cpi    03
  635.     jz    0h            ; Exit if control C
  636.     ret
  637. ;
  638. ;================================================================
  639. ;
  640. ;             ---- Ring the console bell ----
  641. ;
  642. ;================================================================
  643. ;
  644. bell:
  645.     push    psw
  646.     mvi    a,7
  647.     call    coe
  648.     pop    psw
  649.     ret
  650. ;
  651. ;================================================================
  652. ;
  653. ;         ---- Print a cr/lf pair ----
  654. ;
  655. ;================================================================
  656. ;
  657. crlf:
  658.     push    psw
  659.     mvi    a,cr
  660.     call    coe
  661.     mvi    a,lf
  662.     call    coe
  663.     pop    psw
  664.     ret
  665. ;
  666. ;================================================================
  667. ;
  668. ;    Print text at DE till a 00 or a '$'
  669. ;
  670. ;================================================================
  671. ;
  672. ptxt:
  673.     ldax    d
  674.     ora    a
  675.     rz
  676.     cpi    '$'
  677.     rz
  678.     call    coe
  679.     inx    d
  680.     jr    ptxt
  681. ;
  682. ;================================================================
  683. ;    ---- Get a Y or an N from console ----
  684. ;
  685. ;================================================================
  686. ;
  687. get$yn:
  688.     call    cie
  689.     cpi    cr
  690.     jrz    get$yn
  691.     cpi    lf
  692.     jrz    get$yn
  693. ;
  694.     cpi    esc
  695.     rz
  696.     call    caps
  697.     call    coe
  698.     cpi    'Y'
  699.     rz
  700.     cpi    'N'
  701.     rz
  702. ; Not valid then
  703.     call    bell            ; Ding a ling
  704.     call    bsp            ; Backspace
  705.     jr    get$yn            ; Wait for a N or Y
  706. ;
  707. ;================================================================
  708. ;    ---- Get a Y, an N or an S from console ----
  709. ;
  710. ;================================================================
  711. ;
  712. get$yns:
  713.     call    cie
  714.     cpi    cr
  715.     jrz    get$yns
  716.     cpi    lf
  717.     jrz    get$yns
  718. ;
  719.     cpi    esc
  720.     rz
  721.     call    caps
  722.     call    coe
  723.     cpi    'Y'
  724.     rz
  725.     cpi    'N'
  726.     rz
  727.     cpi    'S'
  728.     rz
  729. ; Not valid then
  730.     call    bell
  731.     call    bsp
  732.     jr    get$yn            ; Wait for a N or Y
  733. ;
  734. ;================================================================
  735. ; Here the character in A is converted into ascii or is given 
  736. ; a '.' if hex. The result is put into A for easy access via coe.
  737. ;================================================================
  738. ;
  739. makasc:
  740.     ani    07fh            ; Make in the range
  741.     cpi    020h            ; Lower than a space is illegal
  742.     jrc    noasc            ; Not ascii
  743.     cpi    07bh            ; Higher than upper case is illegal too
  744.     rc                ; return with ascii character in C
  745. noasc:    mvi    A,02eh            ; Replace with a '.'
  746.     ret
  747. ;
  748. ;================================================================
  749. ;
  750. ;       ---- Space printing on the console ----
  751. ;
  752. ;================================================================
  753. ;
  754. space3:
  755.     call    space
  756. space2:
  757.     call    space
  758. space:
  759.     mvi    a,' '
  760.     jmp    coe
  761. ;
  762. ;================================================================
  763. ;
  764. ;    ---- Print a comma ----
  765. ;
  766. ;================================================================
  767. ;
  768. comma:
  769.     push    psw
  770.     mvi    a,','
  771.     call    coe
  772.     pop    psw
  773.     ret
  774. ;
  775. ;
  776. ;================================================================
  777. ;
  778. ;    ---- Print a slash ----
  779. ;
  780. ;================================================================
  781. ;
  782. slash:
  783.     push    psw
  784.     mvi    a,'/'
  785.     call    coe
  786.     pop    psw
  787.     ret
  788. ;
  789. ;================================================================
  790. ;
  791. ;    ---- Print a colon ----
  792. ;
  793. ;================================================================
  794. ;
  795. colon:
  796.     push    psw
  797.     mvi    a,':'
  798.     call    coe
  799.     pop    psw
  800.     ret
  801. ;
  802. ;================================================================
  803. ;
  804. ;        ---- Print the hex digits in A ----
  805. ;
  806. ;================================================================
  807. ;
  808. phacc:
  809. prhex:    push    psw
  810.     rrc
  811.     rrc
  812.     rrc
  813.     rrc
  814.     call    phexl
  815.     pop    psw
  816. phexl:    ani    0fh
  817.     adi    90h
  818.     daa
  819.     aci    40h
  820.     daa
  821.     jmp    coe
  822. ;
  823. ;----------------------------------------------------------------
  824. ; Random number generator. This is used for testing the UCP
  825. ;----------------------------------------------------------------
  826. ;
  827. ;----------------------------------------------------------------
  828. ; Initialize random generator.
  829. ;
  830. ; On entry
  831. ;  DE -> string to randomize, length at front
  832. ;----------------------------------------------------------------
  833. ;
  834. rnd$ini:
  835.     ldax    d
  836.     cpi    5
  837.     rc            ; Error if less than 5 elements in the array
  838.     push    d
  839.     push    b
  840.     mov    b,a        ; Load counter
  841.     xchg
  842.     inx    h        ; Now HL -> first seed byte
  843.     ldar            ; Get refresh register value
  844.     dcr    b        ; Do one less than the required
  845. initloop:
  846.     add    m
  847.     rrc
  848.     mov    m,a
  849.     inr    m
  850.     mov    a,m
  851.     inx    h
  852.     djnz    initloop
  853. ; Restore and exit gracefully
  854.     xchg            ; Restore HL
  855.     pop    b
  856.     pop    d        ; Restore other registers
  857.     ret
  858. ;
  859. ;----------------------------------------------------------------
  860. ; Return 16 bit random in HL.
  861. ;
  862. ; On entry
  863. ;  DE -> random string
  864. ;----------------------------------------------------------------
  865. ;
  866. rnd$16:
  867.     call    rnd$8
  868.     mov    h,a        ; msb byte
  869.     call    rnd$8
  870.     mov    l,a        ; lsb byte
  871.     ret
  872. ;
  873. ;----------------------------------------------------------------
  874. ; Return an 8 bit random number in A
  875. ;
  876. ; On entry
  877. ;  DE -> random string
  878. ;----------------------------------------------------------------
  879. ;
  880. rnd$8:    
  881.     ldax    d        ; A = number of seeds
  882.     cpi    5        ; Check if less than 5 seed values
  883.     rc            ; Return with a carry to indicate an error
  884. ; Here we load the number of cells into B then decrtement so as to skip
  885. ; these which are operated on later.
  886.     push    b
  887.     push    d        ; Saver address of seed array
  888.     mov    b,a
  889.     dcr    b
  890.     dcr    b
  891.     inx    d        ; DE -> first seed in the array
  892.     xchg            ; Put memory pointer into HL
  893. ;
  894. ;Loop for N-2 times.
  895. loop:    inr    m        ;INCREMENT SEED VALUE.
  896.     mov    a,m
  897.     inx    h        ;HL POINTS TO NEXT SEED VALUE IN ARRAY.
  898.     add    m
  899.     rrc            ;ROTATE RIGHT CIRCULAR ACCUMULATOR.
  900.     mov    m,a
  901.     djnz    loop
  902. ;
  903. ; Last iteration to compute random byte in register a.
  904.     inx    h         ; HL -> last byte in the array
  905.     add    m
  906.     cma            ; complement the accumulator
  907.     rrc            ; rotate it right
  908.     mov    m,a
  909.     xra    a        ; Clear carry
  910.     mov    a,m        ; Re-load value, carry not set.
  911. ;
  912. ; Restore the registers and return with the value in A
  913. ERROR:    
  914.     xchg            ; Restore HL
  915.     pop    d
  916.     pop    b
  917.     ret
  918. ;
  919.     dseg
  920. ;
  921. ?binnum    ds    10
  922. ?result    ds    10
  923. buftmp    db    00            ; A temporary character store
  924. bufadr:    db    00,00
  925. buffer:    db    6            ; maximum characters
  926. bufsiz:    db    00            ; characters read
  927. buftxt:    db    00,00,00,00,00,00    ; text buffer
  928. ;
  929.     end
  930. ;
  931. ;