diff --git a/mode7/starfield_demo.s b/mode7/starfield_demo.s index 0d5f7b37..7d5e97eb 100644 --- a/mode7/starfield_demo.s +++ b/mode7/starfield_demo.s @@ -31,12 +31,11 @@ NUMSTARS EQU 16 sta RANDOM_POINTER ; 3 sta STATE - lda #5 - sta SPEED - ; always multiply with low byte as zero sta NUM2L ; 3 + lda #5 + sta SPEED ldy #(NUMSTARS-1) ; 2 init_stars: diff --git a/mode7_demo/Makefile b/mode7_demo/Makefile index 653769dc..953da49e 100644 --- a/mode7_demo/Makefile +++ b/mode7_demo/Makefile @@ -27,7 +27,7 @@ mode7_demo.o: mode7_demo.s mode7_demo_backgrounds.inc sprites.inc \ ../asm_routines/gr_fade.s \ ../asm_routines/gr_copy.s \ ../asm_routines/gr_scroll.s \ - mode7.s starfield_demo.s + mode7.s rasterbars.s starfield_demo.s ca65 -o mode7_demo.o mode7_demo.s -l mode7_demo.lst diff --git a/mode7_demo/mode7_demo.s b/mode7_demo/mode7_demo.s index d00e9e4c..84cb84c6 100644 --- a/mode7_demo/mode7_demo.s +++ b/mode7_demo/mode7_demo.s @@ -22,6 +22,7 @@ main_loop: jsr checkerboard_demo jsr island_demo jsr star_demo + jsr star_credits jmp main_loop @@ -107,11 +108,28 @@ island_demo: star_demo: ; initialize + lda #48 + sta y_limit_smc+1 + jsr starfield_demo rts + ;=========================== + ; Star Credits + ;=========================== +star_credits: + ; initialize + + lda #40 + sta y_limit_smc+1 + + jsr starfield_credits + + rts + + ;=========================== ; Title routine ;=========================== diff --git a/mode7_demo/rasterbars.s b/mode7_demo/rasterbars.s new file mode 100644 index 00000000..7be74eb2 --- /dev/null +++ b/mode7_demo/rasterbars.s @@ -0,0 +1,331 @@ +; Not quite a raster-bar, but why not + +.include "zp.inc" + +;=========== +; CONSTANTS +;=========== + +ELEMENTS EQU 64 + + + ;===================== + ; Rasterbars + ;===================== + + ;================================ + ; Clear screen and setup graphics + ;================================ + + jsr clear_screens ; clear top/bottom of page 0/1 + jsr set_gr_page0 + + + ;=============== + ; Init Variables + ;=============== + lda #0 ; 2 + sta DRAW_PAGE ; 3 + sta SCREEN_Y + + ;=========================== + ;=========================== + ; Main Loop + ;=========================== + ;=========================== +raster_loop: + ; clear rows + + ldy #19 ; 2 + lda #0 +init_rows: + sta row_color,Y + dey + bpl init_rows + + jsr clear_top + + ;================ + ; set colors + + lda #COLOR_BOTH_AQUA ; aqua + sta COLOR + ldy SCREEN_Y + jsr set_row_color + + lda #COLOR_BOTH_MEDIUMBLUE ; medium blue + sta COLOR + iny + jsr set_row_color + + lda #COLOR_BOTH_LIGHTGREEN ; light green + sta COLOR + iny + jsr set_row_color + + lda #COLOR_BOTH_DARKGREEN ; green + sta COLOR + iny + jsr set_row_color + + lda #COLOR_BOTH_YELLOW ; yellow + sta COLOR + iny + jsr set_row_color + + lda #COLOR_BOTH_ORANGE ; orange + sta COLOR + iny + jsr set_row_color + + lda #COLOR_BOTH_PINK ; pink + sta COLOR + iny + jsr set_row_color + + lda #COLOR_BOTH_RED ; red + sta COLOR + iny + jsr set_row_color + + ;================= + ; draw rows + + ldy #19 +draw_rows_loop: + lda row_color,Y + sta COLOR + + tya + pha + asl + + ldy #39 ; 2 + sty V2 ; 3 + ldy #0 ; 2 + jsr hlin_double ; hlin y,V2 at A ; 63+(X*16) + pla ; 4 + tay + dey + bpl draw_rows_loop + + + ;================== + ; flip pages + ;================== + + jsr page_flip ; 6 + + + ;================== + ; delay? + ;================== + + + ;================== + ; update y pointer + ;================== + ldy SCREEN_Y + iny + cpy #ELEMENTS + bne not_there + ldy #0 +not_there: + sty SCREEN_Y + + + ;================== + ; loop forever + ;================== + + jmp raster_loop ; 3 + + + ;=================== + ; set_row_color + ;=================== + ; color in COLOR + ; Y=offset + ; Y preserved? +set_row_color: + + tya ; wrap y offset + and #(ELEMENTS-1) + tax + + lda fine_sine,X ; lookup sign value + cpx #33 ; check if > pi and + bpl sin_negative ; need to make negative + +sin_positive: + clc ; shift right by 4, zero-extend + ror + clc + ror + clc + ror + clc + ror + clc + adc #18 ; add in 18 to center on screen +; lsr ; shift once more + + jmp sin_no_more + + ; FIXME: precalculate as we shift same each time +sin_negative: + + sec + ror + sec + ror + sec + ror + sec + ror + clc + + adc #18 +; lsr + +sin_no_more: + pha + lsr + tax + pla + pha + + jsr put_color + + pla + tax + + cpy 32 + beq no_inc + bmi yes_inc + + dex + dex +yes_inc: + inx +no_inc: + txa ; horrific + pha + lsr + tax + pla + jsr put_color + + rts + +put_color: + and #$1 ; see if even or odd + beq even_line + + lda COLOR + and #$f0 + sta COLOR2 + + lda row_color,X + and #$0f + + jmp done_line +even_line: + lda COLOR + and #$0f + sta COLOR2 + + lda row_color,X + and #$f0 + +done_line: + ora COLOR2 + sta row_color,X + + rts + +;=============================================== +; External modules +;=============================================== + +.include "../asm_routines/pageflip.s" +.include "../asm_routines/gr_setpage.s" +;.include "../asm_routines/keypress.s" +.include "../asm_routines/gr_offsets.s" +.include "../asm_routines/gr_fast_clear.s" +.include "../asm_routines/gr_hlin.s" + +;====================== +; some arrays +;====================== + +row_color: +.byte $00,$00,$00,$00,$00, $00,$00,$00,$00,$00 +.byte $00,$00,$00,$00,$00, $00,$00,$00,$00,$00 + +fine_sine: +.byte $00 ; 0.000000 +.byte $19 ; 0.098017 +.byte $31 ; 0.195090 +.byte $4A ; 0.290285 +.byte $61 ; 0.382683 +.byte $78 ; 0.471397 +.byte $8E ; 0.555570 +.byte $A2 ; 0.634393 +.byte $B5 ; 0.707107 +.byte $C5 ; 0.773010 +.byte $D4 ; 0.831470 +.byte $E1 ; 0.881921 +.byte $EC ; 0.923880 +.byte $F4 ; 0.956940 +.byte $FB ; 0.980785 +.byte $FE ; 0.995185 +.byte $FF ; 1.000000 +.byte $FE ; 0.995185 +.byte $FB ; 0.980785 +.byte $F4 ; 0.956940 +.byte $EC ; 0.923880 +.byte $E1 ; 0.881921 +.byte $D4 ; 0.831470 +.byte $C5 ; 0.773010 +.byte $B5 ; 0.707107 +.byte $A2 ; 0.634393 +.byte $8E ; 0.555570 +.byte $78 ; 0.471397 +.byte $61 ; 0.382683 +.byte $4A ; 0.290285 +.byte $31 ; 0.195090 +.byte $19 ; 0.098017 +.byte $00 ; 0.000000 +.byte $E7 ; -0.098017 +.byte $CF ; -0.195090 +.byte $B6 ; -0.290285 +.byte $9F ; -0.382683 +.byte $88 ; -0.471397 +.byte $72 ; -0.555570 +.byte $5E ; -0.634393 +.byte $4B ; -0.707107 +.byte $3B ; -0.773010 +.byte $2C ; -0.831470 +.byte $1F ; -0.881921 +.byte $14 ; -0.923880 +.byte $0C ; -0.956940 +.byte $05 ; -0.980785 +.byte $02 ; -0.995185 +.byte $00 ; -1.000000 +.byte $02 ; -0.995185 +.byte $05 ; -0.980785 +.byte $0C ; -0.956940 +.byte $14 ; -0.923880 +.byte $1F ; -0.881921 +.byte $2C ; -0.831470 +.byte $3B ; -0.773010 +.byte $4B ; -0.707107 +.byte $5E ; -0.634393 +.byte $72 ; -0.555570 +.byte $88 ; -0.471397 +.byte $9F ; -0.382683 +.byte $B6 ; -0.290285 +.byte $CF ; -0.195090 +.byte $E7 ; -0.098017 + diff --git a/mode7_demo/starfield_demo.s b/mode7_demo/starfield_demo.s index e8e6b89d..e30d8366 100644 --- a/mode7_demo/starfield_demo.s +++ b/mode7_demo/starfield_demo.s @@ -5,8 +5,21 @@ NUMSTARS EQU 16 + +; Plan: +; Ship at rest 0 - 4 +; Flash 5 +; Ship at warp 25 +; Crazy background +; Ship moves off +; Back to stars +; Rasterbars+credits +; Done + + + ;===================== - ; Starfield + ; Starfield Demo ;===================== starfield_demo: @@ -14,8 +27,9 @@ starfield_demo: ; Clear screen and setup graphics ;================================ - jsr clear_screens ; clear top/bottom of page 0/1 + jsr clear_screens_notext ; clear top/bottom of page 0/1 jsr set_gr_page0 + bit FULLGR ;=============== ; Init Variables @@ -25,7 +39,7 @@ starfield_demo: sta RANDOM_POINTER ; 3 ; always multiply with low byte as zero sta NUM2L ; 3 - + sta FRAME_COUNT ldy #(NUMSTARS-1) ; 2 init_stars: @@ -44,17 +58,142 @@ starfield_loop: ;=============== ; clear screen ;=============== - jsr clear_top ; 6+ + jsr clear_all ; 6+ ; 6047 + ;=============== + ; draw the stars + ;=============== + jsr draw_stars + + ;================ + ; draw the ship + ;================ + + lda #>ship_forward + sta INH + lda # 40 then done ; 2nt/3 @@ -180,9 +319,7 @@ plot_star_continue: dex ; 2 bmi move_stars ; 2nt/3 - bpl draw_stars ; 2nt/3 -; jmp draw_stars - + bpl draw_stars_loop ; 2nt/3 ;============================= ; Move stars @@ -203,46 +340,15 @@ move_loop_skip: dey ; 2 bpl move_stars_loop ; 2nt/3 + rts -starfield_keyboard: - -; jsr get_key ; get keypress ; 6 - -; lda LASTKEY ; 3 - -; beq starfield_keyboard - -; cmp #('Q') ; if quit, then return -; bne skipskip -; rts - -skipskip: - lda #>ship_forward - sta INH - lda #