home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C128CPM / SGTOOL16.ARC / LIBC128.ARC / VDCBMIPX.AS < prev    next >
Encoding:
Text File  |  1994-02-27  |  3.3 KB  |  147 lines

  1. ;SG C Tools 1.6
  2.  
  3. ;(C) 1993 Steve Goldsmith
  4. ;All Rights Reserved
  5.  
  6. ;Assembled with HI-TECH C 3.09 (CP/M-80) ZAS.
  7.  
  8. ;set pixel in 640 x 480 bit map mode.  math and local vdc i/o optimized
  9. ;for speed.
  10.  
  11. psect   text
  12. global  _setpixivdc
  13.  
  14. _setpixivdc:
  15.  
  16. psect   data
  17.  
  18. ;fast pixel look up using x mod 8 as index into bit table
  19.  
  20. BitTable:
  21.  
  22. defb    -128
  23. defb    64
  24. defb    32
  25. defb    16
  26. defb    8
  27. defb    4
  28. defb    2
  29. defb    1
  30.  
  31. psect   text
  32. global  _vdcDispMem
  33.  
  34.         pop     hl              ;return address
  35.         pop     bc              ;x
  36.         pop     de              ;y
  37.         push    de
  38.         push    bc
  39.         push    hl
  40.  
  41.         ld      a,l             ;save y low byte for odd/even test
  42.  
  43.         srl     d               ;y = y/2
  44.         rr      e
  45.                                 ;calc (y * 80) + (x / 8) + bit map start
  46.         ld      l,e             ;hl = y
  47.         ld      h,d
  48.  
  49.         add     hl,hl           ;hl = y * 64;
  50.         add     hl,hl
  51.         add     hl,hl
  52.         add     hl,hl
  53.         add     hl,hl
  54.         add     hl,hl
  55.  
  56.         ex      de,hl           ;de = y * 64; hl = y
  57.  
  58.         add     hl,hl           ;hl = y * 16
  59.         add     hl,hl
  60.         add     hl,hl
  61.         add     hl,hl
  62.  
  63.         add     hl,de           ;hl = (y * 64)+(y * 16)
  64.  
  65.         ld      e,c             ;de = x
  66.         ld      d,b
  67.  
  68.         srl     d               ;de = x / 8
  69.         rr      e
  70.         srl     d
  71.         rr      e
  72.         srl     d
  73.         rr      e
  74.  
  75.         add     hl,de           ;hl = (y * 80) + (x / 8)
  76.         ld      de,(_vdcDispMem)
  77.         add     hl,de           ;hl = (y * 80) + (x / 8) + bit map offset
  78.  
  79.         and     01h             ;test bit 0 to determine odd/even
  80.         jr      nz,3f           ;if y odd then
  81.         ld      de,05370h       ; de = odd field offset of 21360 bytes
  82.         add     hl,de           ; hl = hl+21360
  83. 3:
  84.         ld      a,c             ;a = x low byte
  85.         and     07h             ;a = x mod 8
  86.         ld      d,0             ;de = x mod 8
  87.         ld      e,a
  88.         push    ix
  89.         ld      ix,BitTable     ;get address of bit table
  90.         add     ix,de           ;ix = table addr + (x mod 8)
  91.         ld      a,(ix+0)        ;a = bit to set from bit table
  92.         pop     ix
  93.  
  94.         ld      d,18            ;set vdc update addr
  95.         ld      e,h
  96.         call    vdcset
  97.  
  98.         ld      d,19
  99.         ld      e,l
  100.         call    vdcset
  101.  
  102.         ld      d,31            ;get current byte
  103.         call    vdcget
  104.  
  105.         or      e               ;a = current byte or bit table bit
  106.  
  107.         ld      d,18            ;set vdc update addr
  108.         ld      e,h
  109.         call    vdcset
  110.  
  111.         ld      d,19
  112.         ld      e,l
  113.         call    vdcset
  114.  
  115.         ld      d,31            ;set pixel
  116.         ld      e,a
  117.         call    vdcset
  118.  
  119.         ret
  120.  
  121. ;set vdc reg, d = reg, e = val
  122.  
  123. vdcset:
  124.         ld      bc,0d600h
  125.         out     (c),d
  126. 1:
  127.         in      d,(c)
  128.         bit     7,d
  129.         jr      z,1b
  130.         inc     bc
  131.         out     (c),e
  132.         ret
  133.  
  134. ;get vdc reg, d = reg, e = val
  135.  
  136. vdcget:
  137.  
  138.         ld      bc,0d600h
  139.         out     (c),d
  140. 2:
  141.         in      d,(c)
  142.         bit     7,d
  143.         jr      z,2b
  144.         inc     bc
  145.         in      e,(c)
  146.         ret
  147.