home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / LIST / EP-SRC.ARK / DRAW.MAC < prev    next >
Text File  |  1988-05-21  |  4KB  |  292 lines

  1.  
  2.     include BDS.LIB
  3.     include EPDATA
  4.  
  5. ;jumped to when cseq finds draw command
  6. ;causes a break
  7. ;purpose is to skip up page and draw all lines
  8. draw::
  9.     push    b
  10. ;check there was no page break
  11.     lhld    vposition
  12.     xchg
  13.     lhld    tm
  14.     inx    h
  15.     call    albu
  16.     jc    .drX
  17. ;now save current v. position to return to when done drawing
  18.     lhld    skdots
  19.     dad    d
  20.     push    h
  21. ;search lines to find how far back up the page we have to go
  22.     lxi    h,lilist-6
  23.     mvi    a,NUMLINES
  24.     push    psw
  25.     lxi    b,0FFFFH
  26. .dr1:    pop    psw
  27.     dcr    a
  28.     jm    .dr3
  29.     push    psw
  30.  
  31.     lxi    d,6
  32.     dad    d
  33.     mov    e,m
  34.     inx    h
  35.     mov    d,m
  36.     inx    h
  37.     mov    a,d
  38.     ora    e
  39.     jz    .dr1
  40.     push    h
  41.     mov    h,b
  42.     mov    l,c
  43.     call    albu
  44.     jnc    $+5
  45.     mov    b,d
  46.     mov    c,e
  47.     pop    h
  48.     jmp    .dr1
  49. .dr3:
  50. ;BC is min v. pos in list, or FFFF if none
  51.     mov    d,b
  52.     mov    e,c
  53.     inx    d
  54.     mov    a,d
  55.     ora    e
  56.     jz    .drRET
  57.     dcx    d
  58.     lhld    vposition
  59.     call    cmh
  60.     dad    d
  61. ;HL now neg. skips we have to do
  62.     shld    skdots
  63.  
  64. ;Ready to start drawing at v. position after next paperup
  65. ; (a) For each pass: clear buffer, draw 8 dots for each line, sendit
  66. ; (b) skip down for next row, and if not past old v. position, go to (a)
  67. .drLOOP:
  68.     call    drrow
  69.     call    drrow
  70.     call    drrow
  71.  
  72.     lhld    skdots
  73.     lxi    d,PICA-3
  74.     dad    d
  75.     shld    skdots
  76.     xchg
  77.     lhld    vposition
  78.     dad    d
  79.  
  80. ;cf old v. position on stack
  81.     pop    d
  82.     push    d
  83.     call    albu
  84.     jnc    .drLOOP
  85.  
  86. .drRET:
  87. ;return down to v. position when got the draw command
  88.     lhld    vposition
  89.     call    cmh
  90.     pop    d
  91.     dad    d
  92.     shld    skdots
  93.  
  94. ;last thing to do is zero out the lines to show that they have been drawn
  95. .drX:
  96.     lxi    d,NUMLINES*8
  97.     lxi    h,lilist
  98. .drXL:    mvi    m,0
  99.     inx    h
  100.     dcx    d
  101.     mov    a,d
  102.     ora    e
  103.     jnz    .drXL
  104.     pop    b
  105.     ret
  106.  
  107. ;clear buffer, draw 8 dots for each line, sendit
  108. drrow:
  109.     call    clrgbuf##
  110.     mvi    a,NUMLINES
  111.     lxi    h,lilist
  112. .drrLOOP:
  113.     push    psw
  114.     push    h
  115. ;no draw if no line
  116.     mov    a,m
  117.     inx    h
  118.     ora    m
  119.     dcx    h
  120.     cnz    dr8
  121.     lxi    d,8
  122.     pop    h
  123.     dad    d
  124.     pop    psw
  125.     dcr    a
  126.     jnz    .drrLOOP
  127.     call    bumpgpt##
  128.     jmp    sendit##
  129.  
  130. ;draw 8 dots for the line at HL
  131. dr8:    lxi    d,v0
  132.     mvi    b,8
  133. .dr8.1:
  134.     mov    a,m
  135.     stax    d
  136.     inx    h
  137.     inx    d
  138.     dcr    b
  139.     jnz    .dr8.1
  140.  
  141. ;y-coordinate
  142.     lhld    vposition
  143.     xchg
  144.     lhld    skdots
  145.     dad    d
  146. ;the first dot
  147.     mvi    a,80H
  148. .dr8LOOP:
  149.     push    psw
  150.     push    h
  151.     call    dr1
  152.     pop    h
  153.     inx    h
  154.     inx    h
  155.     inx    h
  156.     pop    psw
  157.     ora    a
  158.     rar
  159.     jnc    .dr8LOOP
  160.     ret
  161.  
  162. ;draw one dot in Acc at y=HL
  163. dr1:    mov    c,a    ;to be passed to vdotset
  164.     xchg
  165. ;DE = y
  166.     lhld    v1
  167.     call    albu    ;passed where line starts?
  168.     rnc
  169.     lhld    v0
  170.     call    cmh
  171.     dad    d
  172.     mov    a,h    ;not yet to where line starts?
  173.     ora    a
  174.     rm
  175.  
  176. ;no preadjust yet
  177.     xra    a
  178.     sta    _preadj
  179.     call    adjfact
  180.  
  181. ;v - v0
  182.     push    h
  183.  
  184.     lhld    c1draw
  185.     xchg
  186.     lhld    c0draw
  187.     push    h
  188.  
  189.     call    albu
  190.     mvi    a,0
  191.     jnc    $+5
  192.     xchg
  193.     inr    a
  194.  
  195.     sta    _nslflag
  196.  
  197. ;HL is min(c0,c1)
  198.  
  199.     call    cmh
  200.     dad    d
  201. ;save to figure num of dots
  202.     shld    _hdiff
  203.     call    adjfact
  204. ;HL is |c1 - c0|
  205.     xchg
  206.     pop    h
  207.     xthl
  208. ;HL is v - v0 and c0 put back on stack
  209.     call    usmul    
  210. ;HL is |c1 - c0|*(v - v0)
  211.     push    h
  212.  
  213.     lhld    v1
  214.     xchg
  215.     lhld    v0
  216.     call    cmh
  217.     dad    d
  218. ;HL is v1 - v0
  219.  
  220. ;pause to figure delta-h
  221.     push    h
  222.     xchg
  223.     lhld    _hdiff
  224.     xchg
  225.     call    usdiv
  226.     shld    _hdiff
  227.     pop    d
  228.  
  229.     pop    h
  230. ;add den.-1 to numerator
  231.     dcx    d
  232.  
  233. ;(check not div by 0)
  234.     mov    a,d
  235.     ora    a
  236.     jp    $+5
  237.     pop    d    ;clean stack and abort
  238.     ret
  239.  
  240.     dad    d
  241.     inx    d
  242. ;HL/DE
  243.     xchg    
  244.     call    usdiv
  245. ;HL is ( |c1 - c0|*(v - v0) )/(v1 - v0)
  246.  
  247. ;adjust by lost factor
  248.     lda    _preadj
  249.     mov    e,a
  250.     call    shllbe
  251.  
  252.     lda    _nslflag
  253.     ora    a
  254.     jz    $+6
  255.     call    cmh
  256.  
  257.     pop    d    ;(now stack clean)
  258.     dad    d
  259. ;add min(c0,c1)
  260.  
  261. ;(check bounds; OR in byte; set maxgpt up if less)
  262.     xchg
  263.     lda    _hdiff
  264.     jmp    vvdotset##
  265.  
  266.  
  267. adjfact:
  268.     mov    a,h
  269.     ora    a
  270.     rz
  271.     push    h
  272.     lxi    h,_preadj
  273.     inr    m
  274.     pop    h
  275.     inx    h    ;?
  276.     mvi    e,1
  277.     call    shlrbe
  278.     jmp    adjfact
  279.  
  280.  
  281.  
  282. v0:    dw    0
  283. c0draw:    dw    0
  284. v1:    dw    0
  285. c1draw:    dw    0
  286.  
  287. _nslflag:    db    0
  288. _preadj:    db    0
  289. _hdiff:        dw    0
  290.  
  291.     end
  292.