Advertisement
Guest User

Untitled

a guest
Sep 15th, 2013
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. drawLine:
  2.     ; de = x0, bc = y0, hl = x1, ix = y1, iy = colour
  3.     ;
  4.     di
  5.     exx
  6.     ld bc,(1*256)+1             ; x/y inc
  7.     exx
  8.     push de                 ; de = x0, hl = x1
  9.     exx
  10.     pop hl
  11.     exx
  12.     ld a,h
  13.     xor $80
  14.     ld h,a
  15.     ld a,d
  16.     xor $80
  17.     ld d,a
  18.     or a
  19.     sbc hl,de
  20.     ld e,l
  21.     ld d,h                  ; de = (x1 - x0)
  22.     jr nc,$+12
  23.     exx
  24.     ld c,-1                 ; x inc
  25.     exx
  26.     xor a
  27.     sub e
  28.     ld e,a
  29.     sbc a,a
  30.     sub d
  31.     ld d,a                  ; de = -(x1 - x0)
  32.     push bc                 ; bc = y0, ix = y1
  33.     exx
  34.     pop de
  35.     exx
  36.     push ix
  37.     pop hl
  38.     ld a,h
  39.     xor $80
  40.     ld h,a
  41.     ld a,b
  42.     xor $80
  43.     ld b,a
  44.     or a
  45.     sbc hl,bc
  46.     ld c,l
  47.     ld b,h                  ; bc = (y1 - y0)
  48.     jr nc,$+12
  49.     exx
  50.     ld b,-1                 ; y inc
  51.     exx
  52.     xor a
  53.     sub c
  54.     ld c,a
  55.     sbc a,a
  56.     sub b
  57.     ld b,a                  ; bc = -(y1 - y0)
  58.     ld l,e
  59.     ld h,d
  60.     push bc
  61.     ld a,h
  62.     xor $80
  63.     ld h,a
  64.     ld a,b
  65.     xor $80
  66.     ld b,a
  67.     or a
  68.     sbc hl,bc
  69.     pop bc
  70.     ld hl,0                 ; error
  71.     jp c,drawLine_y
  72. drawLine_x:
  73.     push de
  74.     pop ix
  75.     inc ix
  76. drawLineLoop_x:
  77.     exx
  78.     call drawPixel
  79.     push bc
  80.     ld a,c
  81.     rlca
  82.     sbc a,a
  83.     ld b,a
  84.     add hl,bc
  85.     pop bc
  86.     exx
  87.     add hl,bc
  88.     or a
  89.     sbc hl,de
  90.     add hl,de
  91.     jr c,$+17
  92.     or a
  93.     sbc hl,de
  94.     exx
  95.     push bc
  96.     ld a,b
  97.     ld c,a
  98.     rlca
  99.     sbc a,a
  100.     ld b,a
  101.     ex de,hl
  102.     add hl,bc
  103.     ex de,hl
  104.     pop bc
  105.     exx
  106.     dec ix
  107.     ld a,ixl
  108.     or ixh
  109.     jr nz,drawLineLoop_x
  110.     ret
  111. drawLine_y:
  112.     push de
  113.     ld e,c
  114.     ld d,b
  115.     pop bc
  116.     push de
  117.     pop ix
  118.     inc ix
  119. drawLineLoop_y:
  120.     exx
  121.     call drawPixel
  122.     push bc
  123.     ld a,b
  124.     ld c,a
  125.     rlca
  126.     sbc a,a
  127.     ld b,a
  128.     ex de,hl
  129.     add hl,bc
  130.     ex de,hl
  131.     pop bc
  132.     exx
  133.     add hl,bc
  134.     or a
  135.     sbc hl,de
  136.     add hl,de
  137.     jr c,$+14
  138.     or a
  139.     sbc hl,de
  140.     exx
  141.     push bc
  142.     ld a,c
  143.     rlca
  144.     sbc a,a
  145.     ld b,a
  146.     add hl,bc
  147.     pop bc
  148.     exx
  149.     dec ix
  150.     ld a,ixl
  151.     or ixh
  152.     jr nz,drawLineLoop_y
  153.     ret
  154.  
  155. drawPixel:
  156.     ; hl = x, de = y, iy = colour
  157.     ; needs re-writing
  158.     ;
  159.     bit 7,h
  160.     ret nz                                  ; return if negative
  161.     bit 7,d
  162.     ret nz                                  ; return if negative
  163.     push bc
  164.     ld bc,320
  165.     or a
  166.     sbc hl,bc
  167.     add hl,bc
  168.     pop bc
  169.     ret nc                                  ; return if offscreen
  170.     ex de,hl
  171.     push bc
  172.     ld bc,240
  173.     or a
  174.     sbc hl,bc
  175.     add hl,bc
  176.     pop bc
  177.     ex de,hl
  178.     ret nc                                  ; return if offscreen
  179.     push de
  180.     push hl
  181.     ld a,$52
  182.     call setLCDRegister                         ; v-addr-start (x-start)
  183.     ld a,$21
  184.     call setLCDRegister                         ; x pos
  185.     ld a,$53
  186.     call setLCDRegister                         ; v-addr-end (x-end)
  187.     ex de,hl
  188.     ld a,$50
  189.     call setLCDRegister                         ; h-addr-start (y-start)
  190.     ld a,$20
  191.     call setLCDRegister                         ; y pos
  192.     inc hl
  193.     ld a,$51
  194.     call setLCDRegister                         ; h-addr-end (y-end)
  195.     ld a,$22
  196.     out ($10),a \ out ($10),a                       ; write data to GRAM
  197.     ld a,iyh \ out ($11),a
  198.     ld a,iyl \ out ($11),a
  199.     pop hl
  200.     pop de
  201.     ret
  202.  
  203. setLCDRegister:
  204.     ; a = register
  205.     ; hl = value
  206.     out ($10),a \ out ($10),a
  207.     ld a,h \ out ($11),a
  208.     ld a,l \ out ($11),a
  209.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement