diff --git a/mode7_demo/Makefile b/mode7_demo/Makefile index 8682938d..281f37c8 100644 --- a/mode7_demo/Makefile +++ b/mode7_demo/Makefile @@ -10,14 +10,14 @@ $(DOS33): cd ../dos33fs-utils && make mode7_demo.dsk: $(DOS33) MODE7_DEMO - $(DOS33) -y mode7_demo.dsk BSAVE -a 0x1000 MODE7_DEMO + $(DOS33) -y mode7_demo.dsk BSAVE -a 0x2000 MODE7_DEMO ### MODE7_DEMO: mode7_demo.o - ld65 -o MODE7_DEMO mode7_demo.o -C ./apple2_1000.inc + ld65 -o MODE7_DEMO mode7_demo.o -C ./apple2_2000.inc mode7_demo.o: mode7_demo.s mode7_demo_backgrounds.inc \ a2.scrolltext deater.scrolltext \ @@ -26,7 +26,8 @@ mode7_demo.o: mode7_demo.s mode7_demo_backgrounds.inc \ ../asm_routines/gr_setpage.s \ ../asm_routines/gr_fade.s \ ../asm_routines/gr_copy.s \ - ../asm_routines/gr_scroll.s + ../asm_routines/gr_scroll.s \ + mode7.s ca65 -o mode7_demo.o mode7_demo.s -l mode7_demo.lst diff --git a/mode7_demo/apple2_1000.inc b/mode7_demo/apple2_2000.inc similarity index 81% rename from mode7_demo/apple2_1000.inc rename to mode7_demo/apple2_2000.inc index e22976de..45689b1b 100644 --- a/mode7_demo/apple2_1000.inc +++ b/mode7_demo/apple2_2000.inc @@ -1,6 +1,6 @@ MEMORY { ZP: start = $00, size = $1A, type = rw; - RAM: start = $1000, size = $8E00, file = %O; + RAM: start = $2000, size = $7E00, file = %O; } SEGMENTS { diff --git a/mode7_demo/island_map.inc b/mode7_demo/island_map.inc new file mode 100644 index 00000000..3a42dcf2 --- /dev/null +++ b/mode7_demo/island_map.inc @@ -0,0 +1,16 @@ +flying_map: + .byte $22,$ff,$ff,$ff, $ff,$ff,$ff,$22 + .byte $dd,$cc,$cc,$88, $44,$44,$00,$dd + .byte $dd,$cc,$cc,$cc, $88,$44,$44,$dd + .byte $dd,$cc,$cc,$88, $44,$44,$44,$dd + .byte $dd,$cc,$99,$99, $88,$44,$44,$dd + .byte $dd,$cc,$99,$88, $44,$44,$44,$dd + .byte $dd,$cc,$99,$99, $11,$44,$44,$dd + .byte $22,$dd,$dd,$dd, $dd,$dd,$dd,$22 + + +water_map: + .byte $22,$22,$22,$22, $22,$22,$22,$22 + .byte $ee,$22,$22,$22, $22,$22,$22,$22 + .byte $22,$22,$22,$22, $22,$22,$22,$22 + .byte $22,$22,$22,$22, $ee,$22,$22,$22 diff --git a/mode7_demo/mode7.s b/mode7_demo/mode7.s new file mode 100644 index 00000000..ecbe74bd --- /dev/null +++ b/mode7_demo/mode7.s @@ -0,0 +1,1101 @@ +;.include "zp.inc" + +;=========== +; CONSTANTS +;=========== +CONST_SHIPX EQU 15 +CONST_TILE_W EQU 64 +CONST_TILE_H EQU 64 +CONST_MAP_MASK_X EQU (CONST_TILE_W - 1) +CONST_MAP_MASK_Y EQU (CONST_TILE_H - 1) +CONST_LOWRES_W EQU 40 +CONST_LOWRES_H EQU 40 +CONST_BETA_I EQU $ff +CONST_BETA_F EQU $80 +CONST_SCALE_I EQU $14 +CONST_SCALE_F EQU $00 +CONST_LOWRES_HALF_I EQU $ec ; -(LOWRES_W/2) +CONST_LOWRES_HALF_F EQU $00 + + ; pre-programmed directions + +flying_directions: + .byte $20,$00, $1,'Z', $10,'D', $1,' ', $40,$00, $1,'Q' + + ;===================== + ; Flying + ;===================== + +mode7_flying: + + ;================================ + ; Clear screen and setup graphics + ;================================ + + jsr clear_screens ; clear top/bottom of page 0/1 + jsr set_gr_page0 + + ;=============== + ; Init Variables + ;=============== + lda #20 + sta SHIPY + lda #0 + sta TURNING + sta ANGLE + sta SPACEX_I + sta SPACEY_I + sta CX_I + sta CX_F + sta CY_I + sta CY_F + sta DRAW_SPLASH + sta SPEED + sta SPLASH_COUNT + sta DISP_PAGE + sta KEY_COUNT + sta KEY_OFFSET + + lda #1 ; slightly off North for better view of island + sta ANGLE + + lda #2 ; initialize sky both pages + sta DRAW_SKY + + lda #4 ; starts out at 4.5 altitude + sta SPACEZ_I + lda #$80 + sta SPACEZ_F + + jsr update_z_factor + +flying_loop: + + lda SPLASH_COUNT ; 3 + beq flying_keyboard ; 2nt/3 + dec SPLASH_COUNT ; decrement splash count ; 5 + +flying_keyboard: + +; jsr get_key ; get keypress ; 6 + + lda KEY_COUNT + bne done_key + + ldy KEY_OFFSET + lda flying_directions,Y + sta KEY_COUNT + iny + lda flying_directions,Y + sta LASTKEY + inc KEY_OFFSET + inc KEY_OFFSET + +done_key: + dec KEY_COUNT + lda LASTKEY ; 3 + + cmp #('Q') ; 2 + bne check_up ; 3/2nt + + ; done + rts + +check_up: + cmp #('W') ; 2 + bne check_down ; 3/2nt + + ;=========== + ; UP PRESSED + ;=========== + + lda SHIPY + cmp #17 + bcc check_down ; bgt, if shipy>16 + dec SHIPY + dec SHIPY ; move ship up + inc SPACEZ_I ; incement height + jsr update_z_factor + lda #0 + sta SPLASH_COUNT + +check_down: + cmp #('S') + bne check_left + + ;============= + ; DOWN PRESSED + ;============= + + lda SHIPY + cmp #28 + bcs splashy ; ble, if shipy < 28 + inc SHIPY + inc SHIPY ; move ship down + dec SPACEZ_I ; decrement height + jsr update_z_factor + bcc check_left + +splashy: + lda #10 + sta SPLASH_COUNT + +check_left: + cmp #('A') + bne check_right + + ;============= + ; LEFT PRESSED + ;============= + + lda TURNING + bmi turn_left + beq turn_left + + lda #$0 + sta TURNING + clv + bvc check_right + +turn_left: + lda #253 ; -3 + sta TURNING + + dec ANGLE + +check_right: + cmp #('D') + bne check_speedup + + ;============== + ; RIGHT PRESSED + ;============== + + lda TURNING ;; FIXME: optimize me + bpl turn_right + lda #0 + sta TURNING + clv + bvc check_speedup + +turn_right: + lda #3 + sta TURNING + + inc ANGLE + +check_speedup: + cmp #('Z') + bne check_speeddown + + ;========= + ; SPEED UP + ;========= + lda #$8 + cmp SPEED + beq check_speeddown + inc SPEED + +check_speeddown: + cmp #('X') + bne check_brake + + ;=========== + ; SPEED DOWN + ;=========== + + lda SPEED + beq check_brake + dec SPEED + +check_brake: + cmp #(' '+128) + bne check_land + + ;============ + ; BRAKE + ;============ + lda #$0 + sta SPEED + +check_land: + cmp #13 + bne check_help + +check_help: + cmp #('H') + bne check_done + +check_done: + + ;================ + ; Wrap the Angle + ;================ + ; FIXME: only do this in right/left routine? + lda ANGLE ; 3 + and #$f ; 2 + sta ANGLE ; 3 + + ;================ + ; Handle Movement + ;================ + +speed_move: + ldx SPEED ; 3 + beq draw_background ; 2nt/3 + ;============= + lda ANGLE ; dx.i=fixed_sin[(angle+4)&0xf].i; // cos() ; 3 + clc ; 2 + adc #4 ; 2 + and #$f ; 2 + asl ; 2 + tay ; 2 + lda fixed_sin_scale,Y ; 4 + sta DX_I ; 3 + iny ; dx.f=fixed_sin[(angle+4)&0xf].f; // cos() ; 2 + lda fixed_sin_scale,Y ; 4 + sta DX_F ; 3 + + lda ANGLE ; dy.i=fixed_sin[angle&0xf].i; // sin() ; 3 + and #$f ; 2 + asl ; 2 + tay ; 2 + lda fixed_sin_scale,Y ; 4 + sta DY_I ; 3 + iny ; dx.f=fixed_sin[angle&0xf].f; // sin() ; 2 + lda fixed_sin_scale,Y ; 4 + sta DY_F ; 3 + ;============ + ; 54 +speed_loop: + + clc ; fixed_add(&cx,&dx,&cx); ; 2 + lda CX_F ; 3 + adc DX_F ; 3 + sta CX_F ; 3 + lda CX_I ; 3 + adc DX_I ; 3 + sta CX_I ; 3 + + clc ; fixed_add(&cy,&dy,&cy); ; 2 + lda CY_F ; 3 + adc DY_F ; 3 + sta CY_F ; 3 + lda CY_I ; 3 + adc DY_I ; 3 + sta CY_I ; 3 + + dex ; 2 + bne speed_loop ; 2nt/3 + ;============ + ; 45 + + ;==================== + ; Draw the background + ;==================== +draw_background: + jsr draw_background_mode7 ; 6 + +check_over_water: + ; See if we are over water + lda CX_I ; 3 + sta SPACEX_I ; 3 + lda CY_I ; 3 + sta SPACEY_I ; 3 + + jsr lookup_map ; 6 + + sec ; 2 + sbc #COLOR_BOTH_DARKBLUE ; 2 + sta OVER_LAND ; 3 + ;=========== + ; 31 + + ; Calculate whether to draw the splash + + lda #0 ; set splash drawing to 0 ; 2 + sta DRAW_SPLASH ; 3 + + lda SPEED ; if speed==0, no splash ; 3 + beq no_splash ; 2nt/3 + + lda TURNING ; 3 + beq no_turning_splash ; 2nt/3 + + lda SHIPY ; 3 + cmp #27 ; 2 + bcc no_turning_splash ; blt if shipy<25 skip ; 2nt/3 + + lda #1 ; 2 + sta SPLASH_COUNT ; 3 + +no_turning_splash: + lda OVER_LAND ; no splash if over land ; 3 + bne no_splash ; 2nt/3 + + lda SPLASH_COUNT ; no splash if splash_count expired ; 3 + beq no_splash ; 2nt/3 + + lda #1 ; 2 + sta DRAW_SPLASH ; 3 + +no_splash: + + ;============== + ; Draw the ship + ;============== + + clv ; 2 + lda TURNING ; 3 + beq draw_ship_forward ; 2nt/3 + bpl draw_ship_right ; 2nt/3 + bmi draw_ship_left ;; FIXME: optimize order ; 2nt/3 + +draw_ship_forward: + lda DRAW_SPLASH ; 2 + beq no_forward_splash ; 2nt/3 + + ; Draw Splash + lda #>splash_forward ; 2 + sta INH ; 3 + lda #shadow_forward ; 2 + sta INH ; 3 + lda #ship_forward ; 2 + sta INH ; 3 + lda #splash_right ; 2 + sta INH ; 3 + lda #shadow_right ; 2 + sta INH ; 3 + lda #ship_right ; 2 + sta INH ; 3 + lda #splash_left ; 2 + sta INH ; 3 + lda #shadow_left ; 2 + sta INH ; 3 + lda #ship_left ; 2 + sta INH ; 3 + lda #sky_background + sta INH + lda #demo_rle @@ -24,8 +84,6 @@ jsr load_rle_gr -demo_loop: - ;========== ; Fade in ;========== @@ -68,8 +126,7 @@ demo_loop: ;============= jsr fade_out - - jmp demo_loop + rts ;=============================================== @@ -84,6 +141,8 @@ demo_loop: .include "../asm_routines/gr_copy.s" .include "../asm_routines/gr_scroll.s" +.include "mode7.s" + .include "mode7_demo_backgrounds.inc" diff --git a/mode7_demo/sprites.inc b/mode7_demo/sprites.inc new file mode 100644 index 00000000..c9262033 --- /dev/null +++ b/mode7_demo/sprites.inc @@ -0,0 +1,59 @@ +;================ +; Ship Sprites +;================ + +splash_forward: + .byte $7,$2 + .byte $00,$ee,$00,$00,$00,$ee,$00 + .byte $ee,$00,$00,$00,$00,$00,$ee + +splash_right: + .byte $7,$2 + .byte $00,$00,$00,$00,$00,$ee,$00 + .byte $00,$00,$00,$00,$00,$00,$ee + + +splash_left: + .byte $7,$2 + .byte $00,$ee,$00,$00,$00,$00,$00 + .byte $ee,$00,$00,$00,$00,$00,$00 + +shadow_forward: + .byte $3,$2 + .byte $00,$aa,$00 + .byte $a0,$aa,$a0 + +shadow_right: + .byte $3,$2 + .byte $a0,$00,$aa + .byte $00,$0a,$a0 + +shadow_left: + .byte $3,$2 + .byte $aa,$00,$a0 + .byte $a0,$0a,$00 + +ship_forward: + .byte $9,$5 + .byte $00,$00,$00,$00,$ff,$00,$00,$00,$00 + .byte $00,$00,$00,$66,$ff,$66,$00,$00,$00 + .byte $00,$00,$70,$2f,$12,$2f,$70,$00,$00 + .byte $f0,$f7,$f7,$f2,$d9,$f2,$f7,$f7,$f0 + .byte $00,$00,$00,$00,$0d,$00,$00,$00,$00 + +ship_right: + .byte $9,$5 + .byte $00,$00,$00,$00,$00,$60,$60,$f0,$00 + .byte $00,$f0,$70,$70,$f6,$f6,$6f,$66,$00 + .byte $00,$07,$ff,$2f,$12,$27,$f6,$00,$00 + .byte $00,$00,$00,$dd,$d9,$f2,$77,$00,$00 + .byte $00,$00,$00,$00,$00,$0f,$ff,$70,$00 + +ship_left: + .byte $9,$5 + .byte $00,$f0,$60,$60,$00,$00,$00,$00,$00 + .byte $00,$66,$6f,$f6,$f6,$70,$70,$f0,$00 + .byte $00,$00,$f6,$27,$12,$2f,$ff,$07,$00 + .byte $00,$00,$77,$f2,$d9,$dd,$00,$00,$00 + .byte $00,$70,$ff,$0f,$00,$00,$00,$00,$00 + diff --git a/mode7_demo/starry_sky.scroll b/mode7_demo/starry_sky.scroll new file mode 100644 index 00000000..60d7fbab --- /dev/null +++ b/mode7_demo/starry_sky.scroll @@ -0,0 +1,10 @@ +; Original size = 1020 bytes +sky_background: +; scroll_length: +.byte 255 + .byte $A9,$00,$D0,$A9,$00,$50,$F5,$50,$AB,$00,$0F,$A7,$00,$0D,$DD,$D0,$A7,$00,$F0,$A5,$00,$11,$A7,$00,$A4,$70,$D0,$D0,$A7,$00,$70,$A9,$00,$05,$A0,$11,$00,$0F,$A0,$11,$00,$D0,$A0,$12,$00,$50,$A0,$2F,$00,$D0,$A9,$00,$50,$F5,$50,$AB,$00,$0F,$A0,$28,$00 + .byte $A5,$00,$0F,$A6,$00,$F0,$A4,$00,$0F,$00,$00,$05,$A9,$00,$0F,$A4,$00,$05,$A7,$00,$DD,$A7,$00,$0F,$00,$F0,$00,$F0,$A8,$00,$07,$70,$A4,$75,$FF,$FF,$F0,$A0,$11,$00,$F0,$A5,$00,$05,$A5,$00,$07,$A0,$11,$00,$50,$A0,$1D,$00,$0F,$A0,$18,$00,$05,$AB,$00,$0F,$A6,$00,$F0,$A4,$00,$0F,$00,$00,$05,$A9,$00,$0F,$A4,$00,$05,$A0,$26,$00 + .byte $00,$00,$F0,$AA,$00,$F0,$00,$00,$F0,$A7,$00,$07,$A4,$00,$70,$AB,$00,$D0,$DD,$0D,$A5,$00,$D0,$A5,$00,$0F,$A8,$00,$07,$70,$05,$75,$75,$D5,$DF,$0F,$A5,$00,$F0,$A5,$00,$50,$A0,$19,$00,$50,$A4,$00,$0D,$AE,$00,$0F,$A5,$00,$07,$A8,$00,$D0,$AB,$00,$07,$AB,$00,$0F,$AF,$00,$F0,$AA,$00,$F0,$00,$00,$F0,$A7,$00,$07,$A4,$00,$70,$A0,$2C,$00 + .byte $A0,$40,$00,$07,$A0,$BF,$00 + .byte $A1 +; Compressed size = 231 bytes diff --git a/mode7_demo/zp.inc b/mode7_demo/zp.inc index 095b624c..d82038e4 100644 --- a/mode7_demo/zp.inc +++ b/mode7_demo/zp.inc @@ -95,6 +95,8 @@ LAST_SPACEY_I EQU $88 LAST_MAP_COLOR EQU $89 DRAW_SKY EQU $8A COLOR_MASK EQU $8B +KEY_COUNT EQU $8C +KEY_OFFSET EQU $8D SHIPY EQU $E4