home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol202 / vid7.mac < prev    next >
Encoding:
Text File  |  1984-12-19  |  4.6 KB  |  283 lines

  1. ;
  2. ; VLIB Module Name:  VID7
  3. ; Author:  Richard Conn
  4. ; VLIB  Version Number:  1.0
  5. ; Module Version Number:  1.0
  6. ; Module Entry Points:
  7. ;    GOTOXY
  8. ; Module External References:
  9. ;    VIDPTR    VIDSKP    VIDELAY    COUT
  10. ;
  11.     ext    vidptr,vidskp,videlay,cout
  12. ;
  13. ; GOTO XY
  14. ;    HL = Row/Col, with Home=1/1
  15. ;    Return with A=0 and Zero Flag Set if not done
  16. ;
  17. gotoxy::
  18.     push    b    ;save regs
  19.     push    d
  20.     push    h
  21.     lhld    vidptr    ;pt to environment
  22.     mov    a,m    ;no terminal?
  23.     cpi    ' '+1
  24.     jc    err
  25.     lxi    d,15h    ;pt to CM delay
  26.     dad    d
  27.     mov    a,m    ;get it
  28.     sta    cmdelay    ;save it
  29.     inx    h    ;pt to CL string
  30.     inx    h
  31.     call    vidskp    ;skip CL string
  32.     mov    a,m    ;get first char of CM string
  33.     ora    a    ;if no string, error
  34.     jz    err
  35.     xchg        ;DE=address of CM string
  36.     pop    h    ;get coordinates in HL
  37.     push    h
  38.     call    gxy    ;output xy string with delay
  39.     lda    cmdelay    ;pause
  40.     call    videlay
  41.     pop    h    ;done
  42.     pop    d
  43.     pop    b
  44.     xra    a    ;return NZ
  45.     dcr    a
  46.     ret
  47. err:
  48.     pop    h    ;done
  49.     pop    d
  50.     pop    b
  51.     xra    a    ;return Z
  52.     ret
  53.  
  54. ;
  55. ; GOTOXY
  56. ;   On input, H=Row and L=Column to Position To (1,1 is Home)
  57. ;   On input, DE=address of CM string
  58. ;
  59. gxy:
  60.     dcr    h    ;adjust to 0,0 for home
  61.     dcr    l
  62.     xra    a    ;set row/column
  63.     sta    rcorder    ;row before column
  64.     sta    rcbase    ;add 0 to base
  65. ;
  66. ; Cycle thru string
  67. ;
  68. gxyloop:
  69.     ldax    d    ;get next char
  70.     inx    d    ;pt to next
  71.     ora    a    ;done?
  72.     rz
  73.     cpi    '%'    ;command?
  74.     jz    gxycmd
  75.     cpi    '\'    ;escape?
  76.     jz    gxyesc
  77.     call    cout    ;send char
  78.     jmp    gxyloop
  79.  
  80. ;
  81. ; Escape - output following byte literally
  82. ;
  83. gxyesc:
  84.     ldax    d    ;get next char
  85.     call    cout    ;output literally
  86.     inx    d    ;pt to next
  87.     jmp    gxyloop
  88. ;
  89. ; Interpret next character as a command character
  90. ;
  91. gxycmd:
  92.     ldax    d    ;get command char
  93.     inx    d    ;pt to next
  94.     cpi    'd'    ;%d
  95.     jz    gxyout1
  96.     cpi    '2'    ;%2
  97.     jz    gxyout2
  98.     cpi    '3'    ;%3
  99.     jz    gxyout3
  100.     cpi    '.'    ;%.
  101.     jz    gxyout4
  102.     cpi    '+'    ;%+v
  103.     jz    gxyout5
  104.     cpi    '>'    ;%>xy
  105.     jz    gxygt
  106.     cpi    'r'    ;%r
  107.     jz    gxyrev
  108.     cpi    'i'    ;%i
  109.     jz    gxyinc
  110.     call    cout    ;output char if nothing else
  111.     jmp    gxyloop
  112. ;
  113. ; Set row/col home to 1,1 rather than 0,0
  114. ;
  115. gxyinc:
  116.     mvi    a,1    ;set rcbase to 1
  117.     sta    rcbase
  118.     jmp    gxyloop
  119. ;
  120. ; Reverse order of output to column then row (default is row then column)
  121. ;
  122. gxyrev:
  123.     mvi    a,1    ;set column and row order
  124.     sta    rcorder
  125.     jmp    gxyloop
  126. ;
  127. ; Command: >xy
  128. ;   If value of row/col is greater than x, add y to it
  129. ;
  130. gxygt:
  131.     call    getval    ;get value
  132.     mov    c,a    ;save value
  133.     ldax    d    ;get value to test
  134.     inx    d    ;pt to next
  135.     cmp    c    ;if carry, value>x
  136.     jnc    gxygt1
  137.     ldax    d    ;get value to add
  138.     add    c
  139.     call    putval    ;put value back
  140. gxygt1:
  141.     inx    d    ;pt to next
  142.     jmp    gxyloop    ;resume
  143. ;
  144. ; Command: +n
  145. ;   Add n to next value and output
  146. ;
  147. gxyout5:
  148.     ldax    d    ;get value to add
  149.     inx    d    ;pt to next
  150.     mov    b,a    ;save in B
  151.     call    getval    ;get value
  152.     add    b    ;add in B
  153.     call    cout    ;output value
  154. rcmark:
  155.     lda    rcorder    ;mark output
  156.     ori    80h
  157.     sta    rcorder
  158.     jmp    gxyloop
  159. ;
  160. ; Command: .
  161. ;   Output next value
  162. ;
  163. gxyout4:
  164.     call    getval    ;get value
  165.     call    cout    ;output value
  166.     jmp    rcmark
  167. ;
  168. ; Command: 3
  169. ;   Output next value as 3 decimal digits
  170. ;
  171. gxyout3:
  172.     call    getval    ;get value
  173.     mvi    b,100    ;output 100's
  174.     mvi    c,1    ;leading zeroes
  175.     call    digout
  176. gxyot3:
  177.     mvi    b,10    ;output 10's
  178.     mvi    c,1    ;leading zeroes
  179. gxyot2:
  180.     call    digout
  181.     adi    '0'    ;output 1's
  182.     call    cout
  183.     jmp    rcmark
  184. ;
  185. ; Command: 2
  186. ;   Output next value as 2 decimal digits
  187. ;
  188. gxyout2:
  189.     call    getval    ;get value
  190.     jmp    gxyot3
  191. ;
  192. ; Command: d
  193. ;   Output next value as n decimal digits with no leading zeroes
  194. ;
  195. gxyout1:
  196.     call    getval    ;get value
  197.     mvi    b,100    ;output 100's
  198.     mvi    c,0    ;no leading zeroes
  199.     call    digout
  200.     mvi    b,10    ;output 10's
  201.     mvi    c,0    ;no leading zeroes
  202.     jmp    gxyot2
  203. ;
  204. ; Return next value in A
  205. ;
  206. getval:
  207.     lda    rcorder    ;get order flag
  208.     ora    a    ;already output the first value?
  209.     jm    getval2
  210.     ani    1    ;look at lsb
  211.     jz    getvalr    ;if 0, row first
  212. getvalc:
  213.     lda    rcbase    ;get base offset
  214.     add    l    ;get column
  215.     ret
  216. getvalr:
  217.     lda    rcbase    ;get base offset
  218.     add    h    ;get row
  219.     ret
  220. getval2:
  221.     ani    1    ;look at lsb
  222.     jz    getvalc
  223.     jmp    getvalr
  224. ;
  225. ; Store A as next value
  226. ;
  227. putval:
  228.     mov    c,a    ;save value
  229.     lda    rcorder    ;get order flag
  230.     ora    a    ;already output the first value?
  231.     jm    putval2
  232.     ani    1    ;look at lsb
  233.     jz    putvalr    ;if 0, row first
  234. putvalc:
  235.     mov    l,c    ;set column
  236.     ret
  237. putvalr:
  238.     mov    h,c    ;set row
  239.     ret
  240. putval2:
  241.     ani    1    ;look at lsb
  242.     jz    putvalc
  243.     jmp    putvalr
  244. ;
  245. ; Output A as decimal digit char
  246. ;   B=Quantity to Subtract from A, C=0 if no leading zero
  247. ;
  248. digout:
  249.     push    d    ;save DE
  250.     mvi    d,'0'    ;char
  251. decot1:
  252.     sub    b    ;subtract
  253.     jc    decot2
  254.     inr    d    ;increment char
  255.     jmp    decot1
  256. decot2:
  257.     add    b    ;add back in
  258.     push    psw    ;save result
  259.     mov    a,d    ;get digit
  260.     cpi    '0'    ;zero?
  261.     jnz    decot3
  262.     mov    a,c    ;get zero flag
  263.     ora    a    ;0=no zero
  264.     jz    decot4
  265. decot3:
  266.     mov    a,d    ;get digit
  267.     call    cout    ;print it
  268. decot4:
  269.     pop    psw    ;get A
  270.     pop    d    ;restore DE
  271.     ret
  272. ;
  273. ; GXY Buffers
  274. ;
  275. rcorder:
  276.     ds    1    ;0=row/col, else col/row
  277. rcbase:
  278.     ds    1    ;0=org is 0,0, else org is 1,1
  279. cmdelay:
  280.     ds    1    ;number of milliseconds to delay for CM
  281.  
  282.     end
  283.