Advertisement
Kitomas

new easy6502 blit routine

Jan 26th, 2024 (edited)
863
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. define r16al  $f0
  2. define r16ah  $f1
  3. define r16bl  $f2
  4. define r16bh  $f3
  5. define r16cl  $f4
  6. define r16ch  $f5
  7. define arg0   $f6
  8. define arg1   $f7
  9.  
  10. define tmp0   $fc
  11. define tmp1   $fd
  12.  
  13. define random $fe
  14. define key    $ff
  15.  
  16.  
  17. init:
  18.   lda #$00
  19.   ldx #<amoog
  20.   ldy #>amoog
  21.   sta pos
  22. loop:
  23.   lda random
  24.   jsr blit
  25.   jmp loop
  26.  
  27.  
  28. amoog:
  29.   dcb  0,10,10,10
  30.   dcb 10,10, 3, 3
  31.   dcb 10,10,10,10
  32.   dcb  0,10, 0,10
  33.  
  34.  
  35.  
  36. ;(automatically loads pos into A)
  37. pos: dcb 0
  38. pos_loadInc:
  39.   lda pos
  40.   sta tmp0
  41.   inc pos
  42.   lda pos
  43.   and #%00001000
  44.   beq pos_loadInc_noYInc
  45.  
  46.   lda pos
  47.   and #%01110111
  48.   clc
  49.   adc #16
  50.   sta pos
  51.  
  52.   pos_loadInc_noYInc:
  53.   lda tmp0
  54.   rts
  55.  
  56.  
  57.  
  58. ;blits a 4x4 color tile
  59.  ;(restores A,X,Y)
  60. ;A = position (as #$YX)
  61. ;X = color (0 -> 15)
  62. blit_color:
  63.   ;(X is read-only here; storing is unnecessary)
  64.   sta arg0 ;store arguments
  65.   sty arg1  ;^^
  66.   jsr blit_load_dst ;load dst addr to r16a
  67.  
  68.   ;completely unrolled loop
  69.   ldy #0        ;init index to 0
  70.   txa           ;pixel 0
  71.   sta (r16al),y  ;^^
  72.   iny            ;^^
  73.   sta (r16al),y ;pixel 1
  74.   iny            ;^^
  75.   sta (r16al),y ;pixel 2
  76.   iny            ;^^
  77.   sta (r16al),y ;pixel 3
  78.   tya            ;^^
  79.   clc            ;^^
  80.   adc #29        ;^^
  81.   tay            ;^^
  82.   txa           ;pixel 4
  83.   sta (r16al),y  ;^^
  84.   iny            ;^^
  85.   sta (r16al),y ;pixel 5
  86.   iny            ;^^
  87.   sta (r16al),y ;pixel 6
  88.   iny            ;^^
  89.   sta (r16al),y ;pixel 7
  90.   tya            ;^^
  91.   clc            ;^^
  92.   adc #29        ;^^
  93.   tay            ;^^
  94.   txa           ;pixel 8
  95.   sta (r16al),y  ;^^
  96.   iny            ;^^
  97.   sta (r16al),y ;pixel 9
  98.   iny            ;^^
  99.   sta (r16al),y ;pixel 10
  100.   iny            ;^^
  101.   sta (r16al),y ;pixel 11
  102.   tya            ;^^
  103.   clc            ;^^
  104.   adc #29        ;^^
  105.   tay            ;^^
  106.   txa           ;pixel 12
  107.   sta (r16al),y  ;^^
  108.   iny            ;^^
  109.   sta (r16al),y ;pixel 13
  110.   iny            ;^^
  111.   sta (r16al),y ;pixel 14
  112.   iny            ;^^
  113.   sta (r16al),y ;pixel 15
  114.  
  115.   lda arg0 ;restore registers
  116.   ldy arg1  ;^^
  117.   rts
  118.  
  119.  
  120. ;blits a 4x4 bitmap tile
  121.  ;(restores A,X,Y)
  122. ;A = position (as #$YX)
  123. ;X = bitmap addr lo byte
  124. ;Y = bitmap addr hi byte
  125. blit:
  126.   sta arg0          ;store arguments
  127.   stx r16bl          ;^^
  128.   sty r16bh          ;^^
  129.   jsr blit_load_dst ;load dst addr to r16a
  130.  
  131.   ;completely unrolled loop
  132.   ldy #0        ;pixel 0,0 (0,0)
  133.   lda (r16bl),y  ;^^
  134.   sta (r16al),y  ;^^
  135.   iny            ;^^
  136.   lda (r16bl),y ;pixel 1,0 (1,1)
  137.   sta (r16al),y  ;^^
  138.   iny            ;^^
  139.   lda (r16bl),y ;pixel 2,0 (2,2)
  140.   sta (r16al),y  ;^^
  141.   iny            ;^^
  142.   lda (r16bl),y ;pixel 3,0 (3,3)
  143.   sta (r16al),y  ;^^
  144.   iny            ;^^
  145.   sty tmp0       ;^^
  146.   tya            ;^^
  147.   clc            ;^^
  148.   adc #28        ;^^
  149.   sta tmp1       ;^^
  150.  
  151.   lda (r16bl),y ;pixel 0,1 (4,32)
  152.   ldy tmp1       ;^^
  153.   sta (r16al),y  ;^^
  154.   inc tmp0       ;^^
  155.   iny            ;^^
  156.   sty tmp1       ;^^
  157.   ldy tmp0      ;pixel 1,1 (5,33)
  158.   lda (r16bl),y  ;^^
  159.   ldy tmp1       ;^^
  160.   sta (r16al),y  ;^^
  161.   inc tmp0       ;^^
  162.   iny            ;^^
  163.   sty tmp1       ;^^
  164.   ldy tmp0      ;pixel 2,1 (6,34)
  165.   lda (r16bl),y  ;^^
  166.   ldy tmp1       ;^^
  167.   sta (r16al),y  ;^^
  168.   inc tmp0       ;^^
  169.   iny            ;^^
  170.   sty tmp1       ;^^
  171.   ldy tmp0      ;pixel 3,1 (7,35)
  172.   lda (r16bl),y  ;^^
  173.   ldy tmp1       ;^^
  174.   sta (r16al),y  ;^^
  175.   inc tmp0       ;^^
  176.   tya            ;^^
  177.   clc            ;^^
  178.   adc #29        ;^^
  179.   sta tmp1       ;^^
  180.  
  181.   ldy tmp0      ;pixel 0,2 (4,64)
  182.   lda (r16bl),y  ;^^
  183.   ldy tmp1       ;^^
  184.   sta (r16al),y  ;^^
  185.   inc tmp0       ;^^
  186.   iny            ;^^
  187.   sty tmp1       ;^^
  188.   ldy tmp0      ;pixel 1,2 (5,65)
  189.   lda (r16bl),y  ;^^
  190.   ldy tmp1       ;^^
  191.   sta (r16al),y  ;^^
  192.   inc tmp0       ;^^
  193.   iny            ;^^
  194.   sty tmp1       ;^^
  195.   ldy tmp0      ;pixel 2,2 (6,66)
  196.   lda (r16bl),y  ;^^
  197.   ldy tmp1       ;^^
  198.   sta (r16al),y  ;^^
  199.   inc tmp0       ;^^
  200.   iny            ;^^
  201.   sty tmp1       ;^^
  202.   ldy tmp0      ;pixel 3,2 (7,67)
  203.   lda (r16bl),y  ;^^
  204.   ldy tmp1       ;^^
  205.   sta (r16al),y  ;^^
  206.   inc tmp0       ;^^
  207.   tya            ;^^
  208.   clc            ;^^
  209.   adc #29        ;^^
  210.   sta tmp1       ;^^
  211.  
  212.   ldy tmp0      ;pixel 0,3 (4,96)
  213.   lda (r16bl),y  ;^^
  214.   ldy tmp1       ;^^
  215.   sta (r16al),y  ;^^
  216.   inc tmp0       ;^^
  217.   iny            ;^^
  218.   sty tmp1       ;^^
  219.   ldy tmp0      ;pixel 1,3 (5,97)
  220.   lda (r16bl),y  ;^^
  221.   ldy tmp1       ;^^
  222.   sta (r16al),y  ;^^
  223.   inc tmp0       ;^^
  224.   iny            ;^^
  225.   sty tmp1       ;^^
  226.   ldy tmp0      ;pixel 2,3 (6,98)
  227.   lda (r16bl),y  ;^^
  228.   ldy tmp1       ;^^
  229.   sta (r16al),y  ;^^
  230.   inc tmp0       ;^^
  231.   iny            ;^^
  232.   sty tmp1       ;^^
  233.   ldy tmp0      ;pixel 3,3 (7,99)
  234.   lda (r16bl),y  ;^^
  235.   ldy tmp1       ;^^
  236.   sta (r16al),y  ;^^
  237.  
  238.   lda arg0  ;restore registers
  239.   ldx r16bl  ;^^
  240.   ldy r16bh  ;^^
  241.   rts
  242.  
  243.  
  244. ;private routine that loads tile's
  245.  ;destination address into r16a
  246. blit_load_dst:
  247.   tay               ;lookup table offset into Y
  248.   and #%00000111     ;^^
  249.   sta tmp0           ;^^
  250.   tya                ;^^
  251.   lsr                ;^^
  252.   and #%00111000     ;^^
  253.   ora tmp0           ;^^
  254.   asl                ;^^
  255.   tay                ;^^
  256.   lda #<blit_lookup ;lookup table addr. into r16c
  257.   sta r16cl          ;^^
  258.   lda #>blit_lookup  ;^^
  259.   sta r16ch          ;^^
  260.   lda (r16cl),y     ;destination addr. into r16a
  261.   sta r16al          ;^^
  262.   iny                ;^^
  263.   lda (r16cl),y      ;^^
  264.   sta r16ah          ;^^
  265.   rts
  266.  
  267.  
  268. blit_lookup:
  269. dcb $00,$02,$04,$02,$08,$02,$0c,$02,$10,$02,$14,$02,$18,$02,$1c,$02
  270. dcb $80,$02,$84,$02,$88,$02,$8c,$02,$90,$02,$94,$02,$98,$02,$9c,$02
  271. dcb $00,$03,$04,$03,$08,$03,$0c,$03,$10,$03,$14,$03,$18,$03,$1c,$03
  272. dcb $80,$03,$84,$03,$88,$03,$8c,$03,$90,$03,$94,$03,$98,$03,$9c,$03
  273. dcb $00,$04,$04,$04,$08,$04,$0c,$04,$10,$04,$14,$04,$18,$04,$1c,$04
  274. dcb $80,$04,$84,$04,$88,$04,$8c,$04,$90,$04,$94,$04,$98,$04,$9c,$04
  275. dcb $00,$05,$04,$05,$08,$05,$0c,$05,$10,$05,$14,$05,$18,$05,$1c,$05
  276. dcb $80,$05,$84,$05,$88,$05,$8c,$05,$90,$05,$94,$05,$98,$05,$9c,$05
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement