diff --git a/demos/xmas_2023/Makefile b/demos/xmas_2023/Makefile index 27d1e1f9..1bf5fc8e 100644 --- a/demos/xmas_2023/Makefile +++ b/demos/xmas_2023/Makefile @@ -123,7 +123,7 @@ music.o: music.s zp.inc \ XMAS: xmas.o ld65 -o XMAS xmas.o -C $(LINKER_SCRIPTS)/apple2_8000.inc -xmas.o: xmas.s \ +xmas.o: xmas.s plasma_tree.s fireplace.s \ zp.inc hardware.inc qload.inc \ graphics/tree01.gr.zx02 ca65 -o xmas.o xmas.s -l xmas.lst diff --git a/demos/xmas_2023/fireplace.s b/demos/xmas_2023/fireplace.s new file mode 100644 index 00000000..6eb360b0 --- /dev/null +++ b/demos/xmas_2023/fireplace.s @@ -0,0 +1,706 @@ +fireplace: + + lda #fireplace_data + sta INH + + jsr draw_scene + + rts + +fireplace_data: + +.byte SET_COLOR | YELLOW +.byte BOX, 0,39,0,29 ; wall +.byte SET_COLOR | BROWN +.byte BOX,0,39,30,39 ; monitor back +.byte BOX,1,9,0,20 ; window +.byte SET_COLOR | BLACK +.byte BOX,2,8,0,9 ; upper +.byte SET_COLOR | WHITE +.byte BOX,2,8,12,18 ; bottom snow +.byte SET_COLOR | RED +.byte 27,39,12,30 ; fireplace +.byte SET_COLOR | BLACK +.byte 30,39,17,30 ; hearth +.byte SET_COLOR | BROWN +.byte 32,38,27,29 ; wood +.byte SET_COLOR | WHITE +.byte 26,39,10,11 ; mantle +.byte SET_COLOR | GREEN +.byte 15,17,0,39 ; tree center +.byte 13,19,5,39 ; tree middle +.byte 12,20,15,39 ; tree wider +.byte 10,22,23,39 ; tree wide +.byte SET_COLOR | LIGHT_BLUE +.byte 13,16,11,12 ; garland top +.byte 17,19,13,14 ; garland top +.byte 12,15,23,24 ; garland middle +.byte 16,19,25,26 ; garland middle +.byte 20,22,27,28 ; garland middle +.byte 10,14,36,37 ; garland bottom +.byte 15,18,38,39 ; garland bottom +.byte SET_COLOR | WHITE +.byte 14,15,7,9 ; ball1 +.byte 18,19,17,19 ; ball2 +.byte 11,12,31,33 ; ball3 +.byte 20,21,34,36 ; ball4 +.byte SET_COLOR | YELLOW +.byte 34,36,22,26 ; fire +.byte SET_COLOR | ORANGE +.byte 35,35,24,26 ; fire +.byte SET_COLOR | BLACK +.byte 34,35,22,22 ; flicker +.byte SET_COLOR | YELLOW +.byte BOX,34,35,22,22 ; flicker + + + + + + +;========================== +; draw box scene +;========================== +; data in INL/INH + +SET_COLOR = $C0 ; special case, color 0..15 in bottom nybble + +END = $80 ; 0 : +CLEAR = $81 ; 0 : clear screen to black (0) +BOX = $82 ; 4 : x1,y1 to x2,y2 +HLIN = $83 ; 3 : x1,x2 at y1 +VLIN = $84 ; 3 : at x1 from y1 to y2 +PLOT = $85 ; 2 : x1,y1 +HLIN_ADD= $86 ; 2 : x1,x2 at prev_y1+1 +HLIN_ADD_LSAME= $87 ; 1 : prev_x1,x2 at prev_y1+1 +HLIN_ADD_RSAME= $88 ; 1 : x1,prev_x2 at prev_y1+1 +BOX_ADD= $89 ; 3 : x1,prev_y1+1, x2, y2 +BOX_ADD_LSAME= $8A ; 2 : prev_x1,prev_y1+1, x2, y2 +BOX_ADD_RSAME= $8B ; 2 : x1,prev_y1+1, prev_x2, y2 +VLIN_ADD= $8C ; 2 : at prev_x1+1 from y1 to y2 + +BLACK = $00 +RED = $01 +DARK_BLUE = $02 +MAGENTA = $03 +GREEN = $04 +GREY1 = $05 +MEDIUM_BLUE = $06 +LIGHT_BLUE = $07 +BROWN = $08 +ORANGE = $09 +GREY2 = $0A +PINK = $0B +LIGHT_GREEN = $0C +YELLOW = $0D +AQUA = $0E +WHITE = $0f + +; top bit not set, command +; top bit set, repeat last command + + +; ??xx xxxx + +; 00 = co-ord +; 10 = new command +; 11 = new-color + + +draw_scene: + + lda #0 ; always clear to black +; sta COLOR + sta clear_all_color+1 + jsr clear_all + +draw_scene_loop: + ldy #0 + lda (INL),Y ; load next byte + + bpl repeat_last ; if top bit 0, repeat last + ; command + + asl ; clear top bit + bmi set_color ; if negative, color + lsr ; shift back down + + sta LAST_TYPE ; store last type + + jsr inc_inl ; 16 bit increment + +repeat_last: + lda LAST_TYPE + + beq done_scene ; if 0, END + + + ; use jump table for rest + and #$3f + tax + dex ; types start at 1 + lda draw_table_h,X + sta table_jsr_smc+2 +; pha + lda draw_table_l,X +; pha + sta table_jsr_smc+1 + +table_jsr_smc: + jsr $FFFF + + ;======================================== + ; adds A to input pointer and continues +update_pointer: + ldx LAST_TYPE + lda bytes_used,X + +update_pointer_already_in_a: + clc + adc INL + sta INL + lda #0 + adc INH + sta INH + bcc draw_scene_loop ; bra (would only be set if wrap $FFFF) + + + ;============================ + ; done scene + ;============================ + ; return +done_scene: + rts + + + ;============================ + ; set color + ;============================ + ; color is A*2h + +set_color: + ; make top and bottom byte the same + + lsr ; shift back down + and #$f + sta COLOR + asl + asl + asl + asl + adc COLOR + sta COLOR + + ; special case as we are encoded differently from + ; the actions + + lda #1 ; we were one byte long + bne update_pointer_already_in_a ; bra + +bytes_used: + .byte 0,0,4,3 ; END, CLEAR, BOX, HLIN + .byte 3,2,2,1 ; VLIN, PLOT, HLIN_ADD, HLIN_ADD_LSAME + .byte 1,3,2,2 ; HLIN_ADD_RSAME, BOX_ADD, BOX_ADD_LSAME + .byte 2,2 ; BOX_ADD_RSAME, VLIN_ADD + +draw_table_l: + .byte <(clear_screen),<(draw_box),<(draw_hlin),<(draw_vlin) + .byte <(draw_plot) + .byte <(draw_hlin_add),<(draw_hlin_add_lsame),<(draw_hlin_add_rsame) + .byte <(draw_box_add),<(draw_box_add_lsame),<(draw_box_add_rsame) + .byte <(draw_vlin_add) +draw_table_h: + .byte >(clear_screen),>(draw_box),>(draw_hlin),>(draw_vlin) + .byte >(draw_plot) + .byte >(draw_hlin_add),>(draw_hlin_add_lsame),>(draw_hlin_add_rsame) + .byte >(draw_box_add),>(draw_box_add_lsame),>(draw_box_add_rsame) + .byte >(draw_vlin_add) + + ;================================= + ;================================= + ; clear screen + ;================================= + ;================================= +clear_screen: + lda COLOR + sta clear_all_color+1 + jmp clear_all ; tail call + + ;================================= + ;================================= + ; draw box + ;================================= + ;================================= + + ; blurgh. Cases + ; Y1=EVEN, Y2=ODD -> loop Y1/2 to Y2/2, inclusive + ; Y1=ODD, Y2=ODD -> HLIN, loop (Y1/2)+1 to Y2/2 inclusive + ; Y1=EVEN, Y2=EVEN-> loop Y1/2 to (Y2/2)-1, HLIN + ; Y1=ODD, Y2=EVEN -> HLIN, loop (Y1/2)+1 to (Y2/2)-1, HLIN + ; 2/3 case, 1 to 1 + ; 3/5 case, (>1) 2 to 2 + ; 2/4 case, 1 to 1 (<2) + ; 3/4 case, 2 to 1 (!) + ; 3/6 case, 2 to 2 +draw_box: + lda (INL),Y + sta X1 + iny + lda (INL),Y + sta Y1 + iny + +draw_box_common_x2: + + lda (INL),Y + sta X2 + + ;================================== + ; draw box common + ;================================== + +draw_box_common: + iny + lda (INL),Y + sta Y2 ; keep even though not necessary + + lsr + ; if even, go to one less + ; else, fine + bcs odd_bottom_draw_box +even_bottom_draw_box: + sec + sbc #1 + +odd_bottom_draw_box: + + sta draw_box_yend_smc+1 + + ; see if we start at multiple of two + + lda Y1 + lsr + tay + bcc even_draw_box_start + + ; we're odd, need to call HLIN + + jsr hlin_mask_odd + iny + + +even_draw_box_start: + +draw_box_yloop: + +draw_box_yend_smc: + cpy #0 + bcc bbbb + beq bbbb + jmp done_draw_box_yloop ; bge + +bbbb: + lda gr_offsets_l,Y + sta draw_box_xloop_smc+1 + + lda gr_offsets_h,Y + clc + adc DRAW_PAGE + sta draw_box_xloop_smc+2 + + lda COLOR + ldx X2 +draw_box_xloop: +draw_box_xloop_smc: + sta $400,X + dex + cpx X1 + bcs draw_box_xloop ; bge + + iny + + jmp draw_box_yloop + +done_draw_box_yloop: + ; done + + ; if Y2 was even we need to fixup and draw one more line + + lda Y2 + lsr + bcs definitely_odd_bottom + + jsr hlin_mask_even + +definitely_odd_bottom: + ; done + + rts + + + ;================================= + ;================================= + ; draw hlin + ;================================= + ;================================= +draw_hlin: + + lda (INL),Y + sta X1 + iny + lda (INL),Y + sta X2 + iny + lda (INL),Y + + sta Y1 ; needed for HLIN_ADD + + + ;=================================== + ;=================================== + ; hlin common code + ;=================================== + ;=================================== + ; X1, X2 set up + ; Y-coord is in A + ; Y is A/2 + +hlin_common: + + lsr + tay + bcc hlin_mask_even + +hlin_mask_odd: + lda #$0F + .byte $2C ; bit trick +hlin_mask_even: + lda #$F0 + sta MASK + eor #$FF + and COLOR + sta COLOR2 + + lda gr_offsets_l,Y + sta draw_hlin_l_xloop_smc+1 + sta draw_hlin_s_xloop_smc+1 + + lda gr_offsets_h,Y + clc + adc DRAW_PAGE + sta draw_hlin_l_xloop_smc+2 + sta draw_hlin_s_xloop_smc+2 + + ldx X2 +draw_hlin_xloop: +draw_hlin_l_xloop_smc: + lda $400,X + and MASK + ora COLOR2 +draw_hlin_s_xloop_smc: + sta $400,X + dex + cpx X1 + bpl draw_hlin_xloop ; bge + + rts + + + + ;================================= + ;================================= + ; draw hlin add + ;================================= + ;================================= + ; increment Y1 +draw_hlin_add: + + lda (INL),Y + sta X1 + iny + +draw_hlin_add_lsame: + lda (INL),Y + sta X2 + +hlin_inc_y1: + inc Y1 + lda Y1 + + jmp hlin_common + + + ;================================= + ;================================= + ; draw hlin add_lsame + ;================================= + ;================================= + ; increment Y1 + ; use old left value +;draw_hlin_add_lsame: + +; lda (INL),Y +; sta X2 + +; jmp hlin_inc_y1 + + + ;================================= + ;================================= + ; draw hlin add_rsame + ;================================= + ;================================= + ; increment Y1 + ; use old right value +draw_hlin_add_rsame: + + lda (INL),Y + sta X1 + + jmp hlin_inc_y1 + + + ;================================= + ;================================= + ; draw box add + ;================================= + ;================================= + ; increment Y2, put into Y1 +draw_box_add: + lda Y2 + sta Y1 + inc Y1 + + lda (INL),Y + sta X1 + iny + + jmp draw_box_common_x2 + + + ;================================= + ;================================= + ; draw box add_lsame + ;================================= + ;================================= + ; increment Y2, store in Y1 + ; use old X1 value +draw_box_add_lsame: + + lda Y2 + sta Y1 + inc Y1 + + jmp draw_box_common_x2 + + + ;================================= + ;================================= + ; draw box add_rsame + ;================================= + ;================================= + ; increment Y2, put in Y1 + ; use old right value X2 +draw_box_add_rsame: + + lda Y2 + sta Y1 + inc Y1 + + lda (INL),Y + sta X1 + + jmp draw_box_common + + + ;================================= + ;================================= + ; draw vlin add + ;================================= + ;================================= +draw_vlin_add: + inc X1 ; X1 is prev_X1+1 + + bne draw_vlin_skip_x1 ; bra + + + ;================================= + ;================================= + ; draw vlin + ;================================= + ;================================= +draw_vlin: + lda (INL),Y + sta X1 + iny +draw_vlin_skip_x1: + lda (INL),Y + sta Y1 + iny + lda (INL),Y + sta Y2 + + ;================================ +draw_vlin_common: + lda Y2 + lsr + ; if even, go to one less + ; else, fine + bcs odd_bottom_vlin +even_bottom_vlin: + sec + sbc #1 + +odd_bottom_vlin: + + sta vlin_yend_smc+1 + + ; handle top + ; see if we start at multiple of two + + lda Y1 + lsr + tay ; needed! Sets Y for vlin_yloop + bcc even_vlin_start + +odd_vlin_start: + ; we're odd, need to call PLOT + lda Y1 + jsr plot_common + + iny ; update Y for vlin_yloop + + +even_vlin_start: + +vlin_yloop: +vlin_yend_smc: + cpy #0 + bcc cccc + beq cccc + jmp done_vlin_yloop ; + +cccc: + + lda gr_offsets_l,Y + sta vlin_xloop_smc+1 + + lda gr_offsets_h,Y + clc + adc DRAW_PAGE + sta vlin_xloop_smc+2 + + lda COLOR + ldx X1 + +vlin_xloop_smc: + sta $400,X + + iny + + jmp vlin_yloop + + ; done +done_vlin_yloop: + + ; if Y2 was even we need to fixup and draw one more line + + lda Y2 + lsr + bcs definitely_odd_vlin + + lda Y2 + jmp plot_common ; plot_mask_even (tail call) + +definitely_odd_vlin: + ; done + + rts + + + + + ;================================= + ;================================= + ; draw plot + ;================================= + ;================================= +draw_plot: + lda (INL),Y + sta X1 + + iny + lda (INL),Y + sta Y1 ; needed for HLIN_ADD + + + ; fallthrough + + + ;=================================== + ;=================================== + ; plot common code + ;=================================== + ;=================================== + ; X-coord in X1 + ; Y-coord in A + ; Y is Y-coord/2 at end +plot_common: + + lsr ; need Y-coord/2 because 2 rows per byte + tay + bcc plot_mask_even +plot_mask_odd: + lda #$0F + .byte $2C ; bit trick +plot_mask_even: + lda #$F0 + sta MASK + eor #$FF + and COLOR + sta COLOR2 + + lda gr_offsets_l,Y + sta plot_l_smc+1 + sta plot_s_smc+1 + + lda gr_offsets_h,Y + clc + adc DRAW_PAGE + sta plot_l_smc+2 + sta plot_s_smc+2 + + ldx X1 +plot_l_smc: + lda $400,X + and MASK + ora COLOR2 +plot_s_smc: + sta $400,X + + rts + + ;=========================== + ; 16-bit increment of INL + ; inline this? +inc_inl: + inc INL + bne done_inc_inl + inc INH +done_inc_inl: + rts + +;.include "gr_fast_clear.s" + +gr_offsets_l: + .byte <$400,<$480,<$500,<$580,<$600,<$680,<$700,<$780 + .byte <$428,<$4a8,<$528,<$5a8,<$628,<$6a8,<$728,<$7a8 + .byte <$450,<$4d0,<$550,<$5d0,<$650,<$6d0,<$750,<$7d0 + +gr_offsets_h: + .byte >$400,>$480,>$500,>$580,>$600,>$680,>$700,>$780 + .byte >$428,>$4a8,>$528,>$5a8,>$628,>$6a8,>$728,>$7a8 + .byte >$450,>$4d0,>$550,>$5d0,>$650,>$6d0,>$750,>$7d0 + diff --git a/demos/xmas_2023/plasma_tree.s b/demos/xmas_2023/plasma_tree.s new file mode 100644 index 00000000..303ba333 --- /dev/null +++ b/demos/xmas_2023/plasma_tree.s @@ -0,0 +1,526 @@ +; PLASMA TREE + +; based on original PLASMAGORIA code by French Touch + +; ============================================================================= +; ROUTINE MAIN +; ============================================================================= + +plasma_tree: + + lda #$00 + sta DRAW_PAGE + sta clear_all_color+1 + + lda #$04 + sta DRAW_PAGE + jsr clear_all + + + bit PAGE2 ; set page 2 +; bit SET_TEXT ; set text + bit LORES ; set lo-res + + lda #0 + sta FRAME + + ; load image offscreen $6000 + + lda #mask1_data + sta zx_src_h+1 + lda #$60 + jsr zx02_full_decomp + + ; load image offscreen $6400 + + lda #mask2_data + sta zx_src_h+1 + lda #$64 + jsr zx02_full_decomp + + ; load image offscreen $6800 + + lda #mask3_data + sta zx_src_h+1 + lda #$68 + jsr zx02_full_decomp + + ; load image offscreen $6C00 + + lda #mask4_data + sta zx_src_h+1 + lda #$6C + jsr zx02_full_decomp + + ; load image offscreen $7000 + + lda #mask5_data + sta zx_src_h+1 + lda #$70 + jsr zx02_full_decomp + + ; load image offscreen $7400 + + lda #mask6_data + sta zx_src_h+1 + lda #$74 + jsr zx02_full_decomp + + ; load image offscreen $7800 + + lda #mask7_data + sta zx_src_h+1 + lda #$78 + jsr zx02_full_decomp + + ; load image offscreen $7C00 + + lda #mask8_data + sta zx_src_h+1 + lda #$7C + jsr zx02_full_decomp + + + + + ; remap the masks + ; $00->$00 + ; $11->$40 + ; $22->$80 + ; $44->$C0 + + + ldy #0 + sty OUTL + lda #$60 + sta OUTH +remap_mask: + lda (OUTL),Y + and #$7 + tax + lda remap_table,X + sta (OUTL),Y + dey + bne remap_mask + + inc OUTH + lda OUTH + cmp #$80 + bne remap_mask + + +step3: + + ; init + + lda #02 + sta COMPT2 + sta PARAM1 + sta PARAM2 + sta PARAM3 + sta PARAM4 + +bp3: + jsr precalc ; pre-calc + jsr display_normal ; display normal + jsr VBLANK + + lda #60 + jsr wait_for_pattern + bcc keep_making_plasma + + jmp done_plasmacube + + +keep_making_plasma: + + + inc COMPT1 + bne bp3 + dec COMPT2 + bne bp3 + + jmp step3 + + +; ============================================================================ +; Precalculate some values +; ROUTINES PRE CALCUL +; ============================================================================ +precalc: + lda PARAM1 ; self modify various parts + sta pc_off1+1 + lda PARAM2 + sta pc_off2+1 + lda PARAM3 + sta pc_off3+1 + lda PARAM4 + sta pc_off4+1 + + ; Table1(X) = sin1(PARAM1+X)+sin2(PARAM1+X) + ; Table2(X) = sin3(PARAM3+X)+sin1(PARAM4+X) + + ldx #$28 ; 40 +pc_b1: +pc_off1: + lda sin1 +pc_off2: + adc sin2 + sta Table1,X +pc_off3: + lda sin3 +pc_off4: + adc sin1 + sta Table2,X + + inc pc_off1+1 + inc pc_off2+1 + inc pc_off3+1 + inc pc_off4+1 + + dex + bpl pc_b1 + + inc PARAM1 + inc PARAM1 + dec PARAM2 + inc PARAM3 + dec PARAM4 + + rts + +; ============================================================================ +; Display Routines +; ROUTINES AFFICHAGES +; ============================================================================ + +; Display "Normal" +; AFFICHAGE "NORMAL" + +display_normal: + bit SET_GR ; gfx (lores) why needed? + + ldx #23 ; lines 0-23 lignes 0-23 + +display_line_loop: + lda gr_lookup_low,X ; setup pointers for line + sta GRLINE + lda gr_lookup_high,X + sta GRLINE+1 + + lda gr_lookup_low,X ; setup pointers for mask + sta INL + lda gr_lookup_high,X + clc +mask_src_smc: + adc #($70-$8) + sta INH + + + ldy #39 ; col 0-39 + + lda Table2,X ; setup base sine value for row + sta display_row_sin_smc+1 +display_col_loop: + lda Table1,Y ; load in column sine value +display_row_sin_smc: + adc #00 ; add in row value + + and #$3f + ora (INL),Y + + sta display_lookup_smc+1 ; patch in low byte of lookup +display_lookup_smc: + lda lores_colors_rgb ; attention: must be aligned + + sta (GRLINE),Y + dey + bpl display_col_loop + dex + bpl display_line_loop + + rts + + +VBLANK: + inc FRAME + + lda FRAME + lsr + lsr + lsr + lsr + and #$f + tax + lda mask_src_table,X + sta mask_src_smc+1 + + rts + +done_plasmacube: + + rts + +;.align 256 + +gr_lookup_low: + .byte $00,$80,$00,$80,$00,$80,$00,$80 + .byte $28,$A8,$28,$A8,$28,$A8,$28,$A8 + .byte $50,$D0,$50,$D0,$50,$D0,$50,$D0 + +gr_lookup_high: + .byte $08,$08,$09,$09,$0A,$0A,$0B,$0B + .byte $08,$08,$09,$09,$0A,$0A,$0B,$0B + .byte $08,$08,$09,$09,$0A,$0A,$0B,$0B + + + +.align 256 + + +; This appears to be roughly 47+32*sin(x)+16*sin(2x) +sin1: ; 256 +.byte $2E,$30,$32,$34,$35,$36,$38,$3A,$3C,$3C,$3E,$40,$41,$42,$44,$45,$47,$47,$49,$4A,$4B,$4C,$4D,$4E,$4F,$50,$51,$52,$53,$53,$54,$54 +.byte $55,$55,$56,$57,$57,$58,$58,$57,$58,$58,$58,$58,$58,$58,$58,$58,$58,$57,$57,$57,$56,$56,$55,$54,$55,$54,$53,$52,$52,$51,$50,$4F +.byte $4E,$4E,$4D,$4C,$4B,$4B,$4A,$49,$48,$47,$46,$45,$45,$44,$42,$42,$41,$41,$3F,$3F,$3D,$3D,$3C,$3B,$3B,$39,$39,$39,$38,$38,$37,$36 +.byte $36,$35,$35,$34,$34,$33,$32,$32,$32,$31,$31,$31,$30,$31,$30,$30,$30,$30,$2F,$2F,$30,$2F,$2F,$2F,$2F,$2F,$2F,$2F,$2E,$2F,$2F,$2F +.byte $2E,$2F,$2F,$2F,$2F,$2E,$2F,$2F,$2F,$2E,$2F,$2F,$2E,$2E,$2F,$2E,$2E,$2D,$2E,$2D,$2D,$2D,$2C,$2C,$2C,$2B,$2B,$2B,$2A,$2A,$29,$28 +.byte $28,$27,$27,$26,$26,$25,$25,$23,$23,$22,$21,$21,$20,$1F,$1F,$1D,$1D,$1C,$1B,$1A,$19,$19,$17,$16,$16,$15,$14,$13,$13,$12,$11,$10 +.byte $0F,$0F,$0E,$0D,$0C,$0C,$0B,$0A,$09,$09,$08,$08,$08,$07,$06,$07,$06,$06,$06,$06,$05,$06,$05,$05,$06,$05,$06,$06,$07,$07,$08,$08 +.byte $09,$09,$0A,$0B,$0B,$0C,$0C,$0D,$0F,$0F,$10,$12,$12,$14,$15,$16,$17,$19,$1A,$1B,$1D,$1E,$20,$21,$22,$24,$26,$27,$28,$2A,$2C,$2E + +; This appears to be roughly 47+32*sin(4x)+16*sin(3x) +sin2: ; 256 +.byte $2E,$33,$38,$3C,$40,$43,$47,$4B,$4E,$51,$54,$56,$59,$5A,$5C,$5D,$5D,$5E,$5E,$5D,$5C,$5A,$59,$57,$55,$53,$4F,$4C,$49,$46,$42,$3E +.byte $3A,$36,$32,$2E,$2A,$26,$23,$1F,$1C,$18,$15,$12,$10,$0E,$0C,$0A,$09,$08,$07,$07,$07,$07,$09,$0A,$0B,$0D,$0F,$11,$13,$16,$19,$1C +.byte $1F,$22,$26,$29,$2C,$2F,$32,$36,$38,$3B,$3E,$3F,$42,$44,$46,$47,$48,$49,$4B,$4B,$4B,$4A,$4A,$49,$49,$48,$46,$44,$43,$41,$3F,$3C +.byte $3A,$38,$35,$33,$30,$2E,$2C,$2A,$28,$26,$24,$22,$21,$20,$1F,$1F,$1E,$1E,$1D,$1D,$1E,$1E,$1F,$20,$21,$22,$24,$25,$27,$29,$2B,$2D +.byte $2E,$30,$33,$35,$37,$38,$3A,$3C,$3D,$3E,$3F,$3F,$40,$40,$41,$40,$40,$3F,$3F,$3E,$3D,$3B,$3A,$38,$36,$34,$31,$2F,$2D,$2B,$29,$25 +.byte $23,$21,$1F,$1D,$1B,$19,$18,$16,$15,$14,$14,$13,$13,$13,$13,$14,$16,$17,$18,$1A,$1C,$1D,$20,$23,$26,$28,$2C,$2E,$32,$35,$38,$3B +.byte $3E,$41,$45,$48,$4B,$4C,$4F,$51,$53,$54,$55,$55,$57,$57,$57,$56,$55,$53,$52,$50,$4E,$4B,$49,$45,$42,$3F,$3B,$37,$34,$30,$2C,$27 +.byte $23,$1F,$1C,$18,$14,$11,$0E,$0B,$09,$07,$05,$03,$02,$01,$00,$00,$01,$01,$02,$03,$05,$07,$0A,$0D,$10,$13,$17,$1A,$1E,$22,$26,$2A + +; This appears to be roughly 38+24*sin(3x)+16*sin(8x) +sin3: ; 256 +.byte $26,$2C,$31,$35,$39,$3D,$40,$42,$44,$45,$45,$46,$45,$43,$42,$40,$3C,$3A,$38,$36,$33,$31,$30,$2F,$2F,$2E,$2F,$2F,$30,$33,$33,$36 +.byte $37,$3A,$3C,$3C,$3E,$3E,$3D,$3D,$3B,$39,$36,$34,$30,$2B,$28,$23,$1D,$19,$14,$11,$0C,$09,$07,$04,$03,$03,$03,$03,$04,$07,$09,$0C +.byte $0F,$13,$16,$18,$1B,$1E,$20,$22,$22,$23,$24,$24,$23,$22,$21,$20,$1D,$1C,$1B,$1A,$19,$19,$19,$1A,$1C,$1E,$20,$23,$27,$2B,$2F,$33 +.byte $37,$3D,$40,$44,$47,$4A,$4C,$4D,$4E,$4E,$4D,$4C,$4A,$47,$45,$41,$3C,$39,$35,$32,$2E,$2B,$28,$26,$25,$23,$23,$22,$22,$24,$24,$25 +.byte $26,$29,$2A,$2A,$2B,$2C,$2B,$2B,$29,$28,$25,$23,$20,$1C,$19,$15,$10,$0D,$09,$07,$04,$02,$01,$00,$00,$00,$02,$03,$06,$0A,$0D,$11 +.byte $15,$1B,$1F,$23,$27,$2B,$2D,$30,$32,$33,$34,$35,$35,$33,$33,$32,$30,$2E,$2D,$2C,$2B,$2A,$2A,$2A,$2B,$2C,$2E,$30,$32,$36,$38,$3B +.byte $3E,$42,$45,$47,$49,$4B,$4B,$4B,$4A,$49,$47,$45,$42,$3D,$3A,$35,$30,$2B,$26,$22,$1E,$1A,$17,$14,$13,$11,$10,$10,$10,$12,$12,$14 +.byte $15,$18,$1A,$1B,$1D,$1E,$1F,$1F,$1F,$1F,$1E,$1D,$1B,$18,$16,$14,$10,$0E,$0C,$0B,$09,$08,$08,$09,$0A,$0C,$0E,$11,$14,$19,$1D,$22 + + +; Lookup table for colors +; Note the sine tables point roughly to the middle and go to the edges + + + +lores_colors_rgb: ; 256 + +; black +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00,$00,$00,$00 + + +; red gradient +; $00, $11, $33, $BB, $FF, $BB, $33, $11 + +.byte $11,$11,$11,$11,$11,$11,$11,$11 +.byte $11,$11,$33,$33,$33,$33,$33,$33 +.byte $33,$33,$33,$33,$bb,$bb,$bb,$bb +.byte $bb,$bb,$bb,$bb,$bb,$bb,$ff,$ff +.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff +.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb +.byte $bb,$bb,$33,$33,$33,$33,$33,$33 +.byte $33,$33,$33,$33,$11,$11,$11,$11 + +; red +.if 0 +.byte $11,$11,$11,$11,$11,$33,$33,$33 +.byte $33,$33,$bb,$bb,$bb,$bb,$bb,$ff +.byte $ff,$ff,$ff,$ff,$ff,$bb,$bb,$bb +.byte $bb,$bb,$33,$33,$33,$33,$33,$11 +.byte $11,$11,$11,$11,$33,$33,$33,$33 +.byte $bb,$bb,$bb,$bb,$bb,$ff,$ff,$ff +.byte $ff,$ff,$ff,$bb,$bb,$bb,$bb,$bb +.byte $33,$33,$33,$33,$33,$33,$11,$11 +.endif + +; $00, $22, $66, $77, $FF, $77, $66, $22 + +; 22 66 77 ff 77 66 + +; blue + + +.byte $22,$22,$22,$22,$22,$22,$22,$22 +.byte $22,$22,$22,$66,$66,$66,$66,$66 +.byte $66,$66,$66,$66,$66,$66,$77,$77 +.byte $77,$77,$77,$77,$77,$77,$77,$77 +.byte $77,$ff,$ff,$ff,$ff,$ff,$ff,$ff +.byte $ff,$ff,$ff,$ff,$77,$77,$77,$77 +.byte $77,$77,$77,$77,$77,$77,$77,$66 +.byte $66,$66,$66,$66,$66,$66,$66,$66 + + +.if 0 +.byte $22,$22,$22,$22,$22,$66,$66,$66 +.byte $66,$66,$77,$77,$77,$77,$77,$ff +.byte $ff,$ff,$ff,$ff,$ff,$77,$77,$77 +.byte $77,$77,$66,$66,$66,$66,$66,$22 +.byte $22,$22,$22,$22,$66,$66,$66,$66 +.byte $77,$77,$77,$77,$77,$ff,$ff,$ff +.byte $ff,$ff,$ff,$77,$77,$77,$77,$77 +.byte $66,$66,$66,$66,$66,$66,$22,$22 +.endif + + + +; $00, $44, $CC, $DD, $FF, $DD, $CC, $44 + +; green +.byte $44,$44,$44,$44,$44,$cc,$cc,$cc +.byte $cc,$cc,$dd,$dd,$dd,$dd,$dd,$ff +.byte $ff,$ff,$ff,$ff,$ff,$dd,$dd,$dd +.byte $dd,$dd,$cc,$cc,$cc,$cc,$cc,$44 +.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc +.byte $dd,$dd,$dd,$dd,$dd,$ff,$ff,$ff +.byte $ff,$ff,$ff,$dd,$dd,$dd,$dd,$dd +.byte $cc,$cc,$cc,$cc,$cc,$cc,$44,$44 +.if 0 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $44,$44,$44,$44,$44,$44,$44,$44 +.byte $CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC +.byte $DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD +.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff +.byte $DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD +.byte $CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC +.byte $44,$44,$44,$44,$44,$44,$44,$44 +.endif + +; This table has relatively fine color bands +.if 0 +lores_colors_fine: ; 256 +.byte $00,$00,$00,$00,$88,$88,$88,$88 +.byte $55,$55,$55,$55,$99,$99,$99,$99 +.byte $ff,$ff,$ff,$ff,$bb,$bb,$bb,$bb +.byte $33,$33,$33,$33,$22,$22,$22,$22 +.byte $66,$66,$66,$66,$77,$77,$77,$77 +.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc +.byte $ee,$ee,$ee,$ee,$dd,$dd,$dd,$dd +.byte $99,$99,$99,$99,$11,$11,$11,$11 + +.byte $00,$00,$00,$00,$88,$88,$88,$88 +.byte $55,$55,$55,$55,$99,$99,$99,$99 +.byte $ff,$ff,$ff,$ff,$bb,$bb,$bb,$bb +.byte $33,$33,$33,$33,$22,$22,$22,$22 +.byte $66,$66,$66,$66,$77,$77,$77,$77 +.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc +.byte $ee,$ee,$ee,$ee,$dd,$dd,$dd,$dd +.byte $99,$99,$99,$99,$11,$11,$11,$11 + +.byte $00,$00,$00,$00,$88,$88,$88,$88 +.byte $55,$55,$55,$55,$99,$99,$99,$99 +.byte $ff,$ff,$ff,$ff,$bb,$bb,$bb,$bb +.byte $33,$33,$33,$33,$22,$22,$22,$22 +.byte $66,$66,$66,$66,$77,$77,$77,$77 +.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc +.byte $ee,$ee,$ee,$ee,$dd,$dd,$dd,$dd +.byte $99,$99,$99,$99,$11,$11,$11,$11 + +.byte $00,$00,$00,$00,$88,$88,$88,$88 +.byte $55,$55,$55,$55,$99,$99,$99,$99 +.byte $ff,$ff,$ff,$ff,$bb,$bb,$bb,$bb +.byte $33,$33,$33,$33,$22,$22,$22,$22 +.byte $66,$66,$66,$66,$77,$77,$77,$77 +.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc +.byte $ee,$ee,$ee,$ee,$dd,$dd,$dd,$dd +.byte $99,$99,$99,$99,$11,$11,$11,$11 +.else +; This table has relatively wide color bands +lores_colors_wide: ; 256 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00,$00,$00,$00 +.byte $88,$88,$88,$88,$88,$88,$88,$88 +.byte $88,$88,$88,$88,$88,$88,$88,$88 +.byte $55,$55,$55,$55,$55,$55,$55,$55 +.byte $55,$55,$55,$55,$55,$55,$55,$55 +.byte $22,$22,$22,$22,$22,$22,$22,$22 +.byte $22,$22,$22,$22,$22,$22,$22,$22 +.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff +.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff +.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb +.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb +.byte $33,$33,$33,$33,$33,$33,$33,$33 +.byte $33,$33,$33,$33,$33,$33,$33,$33 +.byte $22,$22,$22,$22,$22,$22,$22,$22 +.byte $22,$22,$22,$22,$22,$22,$22,$22 +.byte $66,$66,$66,$66,$66,$66,$66,$66 +.byte $66,$66,$66,$66,$66,$66,$66,$66 +.byte $77,$77,$77,$77,$77,$77,$77,$77 +.byte $77,$77,$77,$77,$77,$77,$77,$77 +.byte $44,$44,$44,$44,$44,$44,$44,$44 +.byte $44,$44,$44,$44,$44,$44,$44,$44 +.byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc +.byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc +.byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee +.byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee +.byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd +.byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd +.byte $99,$99,$99,$99,$99,$99,$99,$99 +.byte $99,$99,$99,$99,$99,$99,$99,$99 +.byte $11,$11,$11,$11,$11,$11,$11,$11 +.byte $11,$11,$11,$11,$11,$11,$11,$11 +.endif + +Table1 = $5000 +Table2 = $5000+64 + +remap_table: + .byte $00,$40,$80,$00,$C0 + +mask_src_table: + .byte $60-8,$64-8,$68-8,$6C-8,$70-8,$74-8,$78-8,$7C-8 + .byte $7C-8,$78-8,$74-8,$70-8,$6C-8,$68-8,$64-8,$60-8 + + +mask1_data: +.incbin "graphics/tree01.gr.zx02" +mask2_data: +.incbin "graphics/tree03.gr.zx02" +mask3_data: +.incbin "graphics/tree05.gr.zx02" +mask4_data: +.incbin "graphics/tree07.gr.zx02" +mask5_data: +.incbin "graphics/tree09.gr.zx02" +mask6_data: +.incbin "graphics/tree11.gr.zx02" +mask7_data: +.incbin "graphics/tree13.gr.zx02" +mask8_data: +.incbin "graphics/tree15.gr.zx02" diff --git a/demos/xmas_2023/xmas.s b/demos/xmas_2023/xmas.s index 60c8bdfa..ba88b336 100644 --- a/demos/xmas_2023/xmas.s +++ b/demos/xmas_2023/xmas.s @@ -1,19 +1,16 @@ -; XMAS - -; PLASMAGORIA - -; based on original code by French Touch +; XMAS 2023 .include "hardware.inc" .include "zp.inc" .include "qload.inc" .include "music.inc" -; ============================================================================= -; ROUTINE MAIN -; ============================================================================= -plasma_main: +xmas_main: + + ;====================================== + ; init + ;====================================== lda #$00 sta DRAW_PAGE @@ -23,513 +20,25 @@ plasma_main: sta DRAW_PAGE jsr clear_all + ;====================================== + ; draw opening scene + ;====================================== - bit PAGE2 ; set page 2 -; bit SET_TEXT ; set text - bit LORES ; set lo-res + jsr fireplace - lda #0 - sta FRAME + ;====================================== + ; plasma tree + ;====================================== - ; load image offscreen $6000 + jsr plasma_tree - lda #mask1_data - sta zx_src_h+1 - lda #$60 - jsr zx02_full_decomp - ; load image offscreen $6400 +finished: + jmp finished - lda #mask2_data - sta zx_src_h+1 - lda #$64 - jsr zx02_full_decomp - - ; load image offscreen $6800 - - lda #mask3_data - sta zx_src_h+1 - lda #$68 - jsr zx02_full_decomp - - ; load image offscreen $6C00 - - lda #mask4_data - sta zx_src_h+1 - lda #$6C - jsr zx02_full_decomp - - ; load image offscreen $7000 - - lda #mask5_data - sta zx_src_h+1 - lda #$70 - jsr zx02_full_decomp - - ; load image offscreen $7400 - - lda #mask6_data - sta zx_src_h+1 - lda #$74 - jsr zx02_full_decomp - - ; load image offscreen $7800 - - lda #mask7_data - sta zx_src_h+1 - lda #$78 - jsr zx02_full_decomp - - ; load image offscreen $7C00 - - lda #mask8_data - sta zx_src_h+1 - lda #$7C - jsr zx02_full_decomp - - - - - ; remap the masks - ; $00->$00 - ; $11->$40 - ; $22->$80 - ; $44->$C0 - - - ldy #0 - sty OUTL - lda #$60 - sta OUTH -remap_mask: - lda (OUTL),Y - and #$7 - tax - lda remap_table,X - sta (OUTL),Y - dey - bne remap_mask - - inc OUTH - lda OUTH - cmp #$80 - bne remap_mask - - -step3: - - ; init - - lda #02 - sta COMPT2 - sta PARAM1 - sta PARAM2 - sta PARAM3 - sta PARAM4 - -bp3: - jsr precalc ; pre-calc - jsr display_normal ; display normal - jsr VBLANK - - lda #60 - jsr wait_for_pattern - bcc keep_making_plasma - - jmp done_plasmacube - - -keep_making_plasma: - - - inc COMPT1 - bne bp3 - dec COMPT2 - bne bp3 - - jmp step3 - - -; ============================================================================ -; Precalculate some values -; ROUTINES PRE CALCUL -; ============================================================================ -precalc: - lda PARAM1 ; self modify various parts - sta pc_off1+1 - lda PARAM2 - sta pc_off2+1 - lda PARAM3 - sta pc_off3+1 - lda PARAM4 - sta pc_off4+1 - - ; Table1(X) = sin1(PARAM1+X)+sin2(PARAM1+X) - ; Table2(X) = sin3(PARAM3+X)+sin1(PARAM4+X) - - ldx #$28 ; 40 -pc_b1: -pc_off1: - lda sin1 -pc_off2: - adc sin2 - sta Table1,X -pc_off3: - lda sin3 -pc_off4: - adc sin1 - sta Table2,X - - inc pc_off1+1 - inc pc_off2+1 - inc pc_off3+1 - inc pc_off4+1 - - dex - bpl pc_b1 - - inc PARAM1 - inc PARAM1 - dec PARAM2 - inc PARAM3 - dec PARAM4 - - rts - -; ============================================================================ -; Display Routines -; ROUTINES AFFICHAGES -; ============================================================================ - -; Display "Normal" -; AFFICHAGE "NORMAL" - -display_normal: - bit SET_GR ; gfx (lores) why needed? - - ldx #23 ; lines 0-23 lignes 0-23 - -display_line_loop: - lda gr_lookup_low,X ; setup pointers for line - sta GRLINE - lda gr_lookup_high,X - sta GRLINE+1 - - lda gr_lookup_low,X ; setup pointers for mask - sta INL - lda gr_lookup_high,X - clc -mask_src_smc: - adc #($70-$8) - sta INH - - - ldy #39 ; col 0-39 - - lda Table2,X ; setup base sine value for row - sta display_row_sin_smc+1 -display_col_loop: - lda Table1,Y ; load in column sine value -display_row_sin_smc: - adc #00 ; add in row value - - and #$3f - ora (INL),Y - - sta display_lookup_smc+1 ; patch in low byte of lookup -display_lookup_smc: - lda lores_colors_rgb ; attention: must be aligned - - sta (GRLINE),Y - dey - bpl display_col_loop - dex - bpl display_line_loop - - rts - - -VBLANK: - inc FRAME - - lda FRAME - lsr - lsr - lsr - lsr - and #$f - tax - lda mask_src_table,X - sta mask_src_smc+1 - - rts - -done_plasmacube: - - rts - -;.align 256 - -gr_lookup_low: - .byte $00,$80,$00,$80,$00,$80,$00,$80 - .byte $28,$A8,$28,$A8,$28,$A8,$28,$A8 - .byte $50,$D0,$50,$D0,$50,$D0,$50,$D0 - -gr_lookup_high: - .byte $08,$08,$09,$09,$0A,$0A,$0B,$0B - .byte $08,$08,$09,$09,$0A,$0A,$0B,$0B - .byte $08,$08,$09,$09,$0A,$0A,$0B,$0B - - - -.align 256 - - -; This appears to be roughly 47+32*sin(x)+16*sin(2x) -sin1: ; 256 -.byte $2E,$30,$32,$34,$35,$36,$38,$3A,$3C,$3C,$3E,$40,$41,$42,$44,$45,$47,$47,$49,$4A,$4B,$4C,$4D,$4E,$4F,$50,$51,$52,$53,$53,$54,$54 -.byte $55,$55,$56,$57,$57,$58,$58,$57,$58,$58,$58,$58,$58,$58,$58,$58,$58,$57,$57,$57,$56,$56,$55,$54,$55,$54,$53,$52,$52,$51,$50,$4F -.byte $4E,$4E,$4D,$4C,$4B,$4B,$4A,$49,$48,$47,$46,$45,$45,$44,$42,$42,$41,$41,$3F,$3F,$3D,$3D,$3C,$3B,$3B,$39,$39,$39,$38,$38,$37,$36 -.byte $36,$35,$35,$34,$34,$33,$32,$32,$32,$31,$31,$31,$30,$31,$30,$30,$30,$30,$2F,$2F,$30,$2F,$2F,$2F,$2F,$2F,$2F,$2F,$2E,$2F,$2F,$2F -.byte $2E,$2F,$2F,$2F,$2F,$2E,$2F,$2F,$2F,$2E,$2F,$2F,$2E,$2E,$2F,$2E,$2E,$2D,$2E,$2D,$2D,$2D,$2C,$2C,$2C,$2B,$2B,$2B,$2A,$2A,$29,$28 -.byte $28,$27,$27,$26,$26,$25,$25,$23,$23,$22,$21,$21,$20,$1F,$1F,$1D,$1D,$1C,$1B,$1A,$19,$19,$17,$16,$16,$15,$14,$13,$13,$12,$11,$10 -.byte $0F,$0F,$0E,$0D,$0C,$0C,$0B,$0A,$09,$09,$08,$08,$08,$07,$06,$07,$06,$06,$06,$06,$05,$06,$05,$05,$06,$05,$06,$06,$07,$07,$08,$08 -.byte $09,$09,$0A,$0B,$0B,$0C,$0C,$0D,$0F,$0F,$10,$12,$12,$14,$15,$16,$17,$19,$1A,$1B,$1D,$1E,$20,$21,$22,$24,$26,$27,$28,$2A,$2C,$2E - -; This appears to be roughly 47+32*sin(4x)+16*sin(3x) -sin2: ; 256 -.byte $2E,$33,$38,$3C,$40,$43,$47,$4B,$4E,$51,$54,$56,$59,$5A,$5C,$5D,$5D,$5E,$5E,$5D,$5C,$5A,$59,$57,$55,$53,$4F,$4C,$49,$46,$42,$3E -.byte $3A,$36,$32,$2E,$2A,$26,$23,$1F,$1C,$18,$15,$12,$10,$0E,$0C,$0A,$09,$08,$07,$07,$07,$07,$09,$0A,$0B,$0D,$0F,$11,$13,$16,$19,$1C -.byte $1F,$22,$26,$29,$2C,$2F,$32,$36,$38,$3B,$3E,$3F,$42,$44,$46,$47,$48,$49,$4B,$4B,$4B,$4A,$4A,$49,$49,$48,$46,$44,$43,$41,$3F,$3C -.byte $3A,$38,$35,$33,$30,$2E,$2C,$2A,$28,$26,$24,$22,$21,$20,$1F,$1F,$1E,$1E,$1D,$1D,$1E,$1E,$1F,$20,$21,$22,$24,$25,$27,$29,$2B,$2D -.byte $2E,$30,$33,$35,$37,$38,$3A,$3C,$3D,$3E,$3F,$3F,$40,$40,$41,$40,$40,$3F,$3F,$3E,$3D,$3B,$3A,$38,$36,$34,$31,$2F,$2D,$2B,$29,$25 -.byte $23,$21,$1F,$1D,$1B,$19,$18,$16,$15,$14,$14,$13,$13,$13,$13,$14,$16,$17,$18,$1A,$1C,$1D,$20,$23,$26,$28,$2C,$2E,$32,$35,$38,$3B -.byte $3E,$41,$45,$48,$4B,$4C,$4F,$51,$53,$54,$55,$55,$57,$57,$57,$56,$55,$53,$52,$50,$4E,$4B,$49,$45,$42,$3F,$3B,$37,$34,$30,$2C,$27 -.byte $23,$1F,$1C,$18,$14,$11,$0E,$0B,$09,$07,$05,$03,$02,$01,$00,$00,$01,$01,$02,$03,$05,$07,$0A,$0D,$10,$13,$17,$1A,$1E,$22,$26,$2A - -; This appears to be roughly 38+24*sin(3x)+16*sin(8x) -sin3: ; 256 -.byte $26,$2C,$31,$35,$39,$3D,$40,$42,$44,$45,$45,$46,$45,$43,$42,$40,$3C,$3A,$38,$36,$33,$31,$30,$2F,$2F,$2E,$2F,$2F,$30,$33,$33,$36 -.byte $37,$3A,$3C,$3C,$3E,$3E,$3D,$3D,$3B,$39,$36,$34,$30,$2B,$28,$23,$1D,$19,$14,$11,$0C,$09,$07,$04,$03,$03,$03,$03,$04,$07,$09,$0C -.byte $0F,$13,$16,$18,$1B,$1E,$20,$22,$22,$23,$24,$24,$23,$22,$21,$20,$1D,$1C,$1B,$1A,$19,$19,$19,$1A,$1C,$1E,$20,$23,$27,$2B,$2F,$33 -.byte $37,$3D,$40,$44,$47,$4A,$4C,$4D,$4E,$4E,$4D,$4C,$4A,$47,$45,$41,$3C,$39,$35,$32,$2E,$2B,$28,$26,$25,$23,$23,$22,$22,$24,$24,$25 -.byte $26,$29,$2A,$2A,$2B,$2C,$2B,$2B,$29,$28,$25,$23,$20,$1C,$19,$15,$10,$0D,$09,$07,$04,$02,$01,$00,$00,$00,$02,$03,$06,$0A,$0D,$11 -.byte $15,$1B,$1F,$23,$27,$2B,$2D,$30,$32,$33,$34,$35,$35,$33,$33,$32,$30,$2E,$2D,$2C,$2B,$2A,$2A,$2A,$2B,$2C,$2E,$30,$32,$36,$38,$3B -.byte $3E,$42,$45,$47,$49,$4B,$4B,$4B,$4A,$49,$47,$45,$42,$3D,$3A,$35,$30,$2B,$26,$22,$1E,$1A,$17,$14,$13,$11,$10,$10,$10,$12,$12,$14 -.byte $15,$18,$1A,$1B,$1D,$1E,$1F,$1F,$1F,$1F,$1E,$1D,$1B,$18,$16,$14,$10,$0E,$0C,$0B,$09,$08,$08,$09,$0A,$0C,$0E,$11,$14,$19,$1D,$22 - - -; Lookup table for colors -; Note the sine tables point roughly to the middle and go to the edges - - - -lores_colors_rgb: ; 256 - -; black -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $00,$00,$00,$00,$00,$00,$00,$00 - - -; red gradient -; $00, $11, $33, $BB, $FF, $BB, $33, $11 - -.byte $11,$11,$11,$11,$11,$11,$11,$11 -.byte $11,$11,$33,$33,$33,$33,$33,$33 -.byte $33,$33,$33,$33,$bb,$bb,$bb,$bb -.byte $bb,$bb,$bb,$bb,$bb,$bb,$ff,$ff -.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff -.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb -.byte $bb,$bb,$33,$33,$33,$33,$33,$33 -.byte $33,$33,$33,$33,$11,$11,$11,$11 - -; red -.if 0 -.byte $11,$11,$11,$11,$11,$33,$33,$33 -.byte $33,$33,$bb,$bb,$bb,$bb,$bb,$ff -.byte $ff,$ff,$ff,$ff,$ff,$bb,$bb,$bb -.byte $bb,$bb,$33,$33,$33,$33,$33,$11 -.byte $11,$11,$11,$11,$33,$33,$33,$33 -.byte $bb,$bb,$bb,$bb,$bb,$ff,$ff,$ff -.byte $ff,$ff,$ff,$bb,$bb,$bb,$bb,$bb -.byte $33,$33,$33,$33,$33,$33,$11,$11 -.endif - -; $00, $22, $66, $77, $FF, $77, $66, $22 - -; 22 66 77 ff 77 66 - -; blue - - -.byte $22,$22,$22,$22,$22,$22,$22,$22 -.byte $22,$22,$22,$66,$66,$66,$66,$66 -.byte $66,$66,$66,$66,$66,$66,$77,$77 -.byte $77,$77,$77,$77,$77,$77,$77,$77 -.byte $77,$ff,$ff,$ff,$ff,$ff,$ff,$ff -.byte $ff,$ff,$ff,$ff,$77,$77,$77,$77 -.byte $77,$77,$77,$77,$77,$77,$77,$66 -.byte $66,$66,$66,$66,$66,$66,$66,$66 - - -.if 0 -.byte $22,$22,$22,$22,$22,$66,$66,$66 -.byte $66,$66,$77,$77,$77,$77,$77,$ff -.byte $ff,$ff,$ff,$ff,$ff,$77,$77,$77 -.byte $77,$77,$66,$66,$66,$66,$66,$22 -.byte $22,$22,$22,$22,$66,$66,$66,$66 -.byte $77,$77,$77,$77,$77,$ff,$ff,$ff -.byte $ff,$ff,$ff,$77,$77,$77,$77,$77 -.byte $66,$66,$66,$66,$66,$66,$22,$22 -.endif - - - -; $00, $44, $CC, $DD, $FF, $DD, $CC, $44 - -; green -.byte $44,$44,$44,$44,$44,$cc,$cc,$cc -.byte $cc,$cc,$dd,$dd,$dd,$dd,$dd,$ff -.byte $ff,$ff,$ff,$ff,$ff,$dd,$dd,$dd -.byte $dd,$dd,$cc,$cc,$cc,$cc,$cc,$44 -.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc -.byte $dd,$dd,$dd,$dd,$dd,$ff,$ff,$ff -.byte $ff,$ff,$ff,$dd,$dd,$dd,$dd,$dd -.byte $cc,$cc,$cc,$cc,$cc,$cc,$44,$44 -.if 0 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $44,$44,$44,$44,$44,$44,$44,$44 -.byte $CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC -.byte $DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD -.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff -.byte $DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD -.byte $CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC -.byte $44,$44,$44,$44,$44,$44,$44,$44 -.endif - -; This table has relatively fine color bands -.if 0 -lores_colors_fine: ; 256 -.byte $00,$00,$00,$00,$88,$88,$88,$88 -.byte $55,$55,$55,$55,$99,$99,$99,$99 -.byte $ff,$ff,$ff,$ff,$bb,$bb,$bb,$bb -.byte $33,$33,$33,$33,$22,$22,$22,$22 -.byte $66,$66,$66,$66,$77,$77,$77,$77 -.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc -.byte $ee,$ee,$ee,$ee,$dd,$dd,$dd,$dd -.byte $99,$99,$99,$99,$11,$11,$11,$11 - -.byte $00,$00,$00,$00,$88,$88,$88,$88 -.byte $55,$55,$55,$55,$99,$99,$99,$99 -.byte $ff,$ff,$ff,$ff,$bb,$bb,$bb,$bb -.byte $33,$33,$33,$33,$22,$22,$22,$22 -.byte $66,$66,$66,$66,$77,$77,$77,$77 -.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc -.byte $ee,$ee,$ee,$ee,$dd,$dd,$dd,$dd -.byte $99,$99,$99,$99,$11,$11,$11,$11 - -.byte $00,$00,$00,$00,$88,$88,$88,$88 -.byte $55,$55,$55,$55,$99,$99,$99,$99 -.byte $ff,$ff,$ff,$ff,$bb,$bb,$bb,$bb -.byte $33,$33,$33,$33,$22,$22,$22,$22 -.byte $66,$66,$66,$66,$77,$77,$77,$77 -.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc -.byte $ee,$ee,$ee,$ee,$dd,$dd,$dd,$dd -.byte $99,$99,$99,$99,$11,$11,$11,$11 - -.byte $00,$00,$00,$00,$88,$88,$88,$88 -.byte $55,$55,$55,$55,$99,$99,$99,$99 -.byte $ff,$ff,$ff,$ff,$bb,$bb,$bb,$bb -.byte $33,$33,$33,$33,$22,$22,$22,$22 -.byte $66,$66,$66,$66,$77,$77,$77,$77 -.byte $44,$44,$44,$44,$cc,$cc,$cc,$cc -.byte $ee,$ee,$ee,$ee,$dd,$dd,$dd,$dd -.byte $99,$99,$99,$99,$11,$11,$11,$11 -.else -; This table has relatively wide color bands -lores_colors_wide: ; 256 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $00,$00,$00,$00,$00,$00,$00,$00 -.byte $88,$88,$88,$88,$88,$88,$88,$88 -.byte $88,$88,$88,$88,$88,$88,$88,$88 -.byte $55,$55,$55,$55,$55,$55,$55,$55 -.byte $55,$55,$55,$55,$55,$55,$55,$55 -.byte $22,$22,$22,$22,$22,$22,$22,$22 -.byte $22,$22,$22,$22,$22,$22,$22,$22 -.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff -.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff -.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb -.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb -.byte $33,$33,$33,$33,$33,$33,$33,$33 -.byte $33,$33,$33,$33,$33,$33,$33,$33 -.byte $22,$22,$22,$22,$22,$22,$22,$22 -.byte $22,$22,$22,$22,$22,$22,$22,$22 -.byte $66,$66,$66,$66,$66,$66,$66,$66 -.byte $66,$66,$66,$66,$66,$66,$66,$66 -.byte $77,$77,$77,$77,$77,$77,$77,$77 -.byte $77,$77,$77,$77,$77,$77,$77,$77 -.byte $44,$44,$44,$44,$44,$44,$44,$44 -.byte $44,$44,$44,$44,$44,$44,$44,$44 -.byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc -.byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc -.byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee -.byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee -.byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd -.byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd -.byte $99,$99,$99,$99,$99,$99,$99,$99 -.byte $99,$99,$99,$99,$99,$99,$99,$99 -.byte $11,$11,$11,$11,$11,$11,$11,$11 -.byte $11,$11,$11,$11,$11,$11,$11,$11 -.endif - -Table1 = $5000 -Table2 = $5000+64 - -remap_table: - .byte $00,$40,$80,$00,$C0 - -mask_src_table: - .byte $60-8,$64-8,$68-8,$6C-8,$70-8,$74-8,$78-8,$7C-8 - .byte $7C-8,$78-8,$74-8,$70-8,$6C-8,$68-8,$64-8,$60-8 .include "wait_keypress.s" .include "irq_wait.s" -mask1_data: -.incbin "graphics/tree01.gr.zx02" -mask2_data: -.incbin "graphics/tree03.gr.zx02" -mask3_data: -.incbin "graphics/tree05.gr.zx02" -mask4_data: -.incbin "graphics/tree07.gr.zx02" -mask5_data: -.incbin "graphics/tree09.gr.zx02" -mask6_data: -.incbin "graphics/tree11.gr.zx02" -mask7_data: -.incbin "graphics/tree13.gr.zx02" -mask8_data: -.incbin "graphics/tree15.gr.zx02" +.include "plasma_tree.s" +.include "fireplace.s" diff --git a/utils/gr-sim/twister/Makefile b/utils/gr-sim/twister/Makefile index c9649307..7b68b9a0 100644 --- a/utils/gr-sim/twister/Makefile +++ b/utils/gr-sim/twister/Makefile @@ -6,7 +6,7 @@ SDL_LIBS= `sdl-config --libs` SDL_INCLUDE= `sdl-config --cflags` all: generate_sines \ - twist_6502 + twist_6502 twist_dump ### @@ -24,9 +24,17 @@ twist_6502: twist_6502.o ../gr-sim.a twist_6502.o: twist_6502.c $(CC) $(CFLAGS) $(SDL_INCLUDE) -c twist_6502.c +### + +twist_dump: twist_dump.o ../gr-sim.a + $(CC) -o twist_dump twist_dump.o ../gr-sim.a $(LFLAGS) $(SDL_LIBS) + +twist_dump.o: twist_dump.c + $(CC) $(CFLAGS) $(SDL_INCLUDE) -c twist_dump.c + ### clean: - rm -f *~ *.o dots dots_dump dots_play dots_minimal dots_6502 dots_play2 + rm -f *~ *.o twist_6502 twist_dump diff --git a/utils/gr-sim/twister/twist_dump.c b/utils/gr-sim/twister/twist_dump.c new file mode 100644 index 00000000..95f0d9cd --- /dev/null +++ b/utils/gr-sim/twister/twist_dump.c @@ -0,0 +1,114 @@ +#include +#include +#include +#include +#include +#include + +//#include "../gr-sim.h" +//#include "../tfv_zp.h" + +unsigned char ram[40][48]; + + +int hlin(int color,int x1, int x2, int y) { + + int j; + + for(j=x1;j