CHESS ZOOMROTATOR

MAD TEAM ALGORITHM • ATARI 7800 MARIA 160B • 6502 / MADS
SIN_TABLE / COS_TABLE — 16-bit Fixed Point LUT [0..255]
sin_table (zx)
cos_table (zy)
zoom envelope
Code — Mad Team Algorithm
; ========================================== ; Chess Zoomrotator - inner loop ; Atari 7800 / MADS assembler ; 160B bitmap mode, 16-bit fixed point ; ========================================== ; Zero page variables (16-bit) fx = $40 ; 2 bytes - texture X fy = $42 ; 2 bytes - texture Y fx_ = $44 ; 2 bytes - row start X fy_ = $46 ; 2 bytes - row start Y zx = $48 ; 2 bytes - sin_table val zy = $4A ; 2 bytes - cos_table val tmp = $4C ; work byte pixbuf = $4D ; 4-pixel accumulator col_x = $4E ; pixel counter row_y = $4F ; scanline counter ; ---- Load zx, zy from LUT ---- ldx angle lda sin_table_lo,x sta zx lda sin_table_hi,x sta zx+1 lda cos_table_lo,x sta zy lda cos_table_hi,x sta zy+1 ; ---- Centering: fx_ = $10000-(W/2)*(zx+zy) ; fy_ = $10000-(H/2)*(zx-zy) ; (precalc or unrolled multiply) ---- jsr calc_center ; ---- Outer loop: scanlines ---- lda #0 sta row_y @yloop ; fx = fx_; fy = fy_ lda fx_ sta fx lda fx_+1 sta fx+1 lda fy_ sta fy lda fy_+1 sta fy+1 lda #0 sta col_x ; ---- Inner loop: pixels ---- @xloop ; THE KEY: checker = (fx XOR fy) hi byte lda fx+1 ; high byte of fx eor fy+1 ; XOR with high byte fy and #$10 ; test checker bit beq @color_a ; Color B: pixel value %10 in 160B @color_b lda pixbuf ora mask_b,x ; OR in %10 at position sta pixbuf jmp @advance ; Color A: pixel value %01 in 160B @color_a lda pixbuf ora mask_a,x ; OR in %01 at position sta pixbuf ; ---- Advance fx += zx ---- @advance clc lda fx adc zx sta fx lda fx+1 adc zx+1 sta fx+1 ; ---- Advance fy -= zy ---- sec lda fy sbc zy sta fy lda fy+1 sbc zy+1 sta fy+1 ; ---- Every 4 pixels: write byte ---- inc col_x lda col_x and #$03 bne @xloop lda pixbuf ; write 4 packed pixels sta (fb_ptr),y ; to framebuffer iny lda #0 sta pixbuf ; reset accumulator lda col_x cmp #WIDTH bne @xloop ; ---- Row done: fx_ += zy, fy_ += zx ---- clc lda fx_ adc zy sta fx_ lda fx_+1 adc zy+1 sta fx_+1 clc lda fy_ adc zx sta fy_ lda fy_+1 adc zx+1 sta fy_+1 inc row_y lda row_y cmp #HEIGHT bne @yloop rts ; ---- Pixel bit masks for 160B packing ---- ; 4 pixels per byte: bits 76,54,32,10 ; color A = %01, color B = %10 mask_a .byte %01000000,%00010000,%00000100,%00000001 mask_b .byte %10000000,%00100000,%00001000,%00000010
Controls
2 $10 5 128
160B Palettes — 12 unique colors + background
16 Unique 2×2 Blocks per Frame (active = used this frame)
Mad Team insight: ANY chess frame = mosaic of max 16 block types.
On 7800 Maria: precompute 16 tile patterns, select per DL entry.
Runtime