vertical wave
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 5 Jul 2020 09:38:32 +0000 (12:38 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 5 Jul 2020 09:38:32 +0000 (12:38 +0300)
.gitignore
Makefile
hwregs.inc
sintab.inc [new file with mode: 0644]
sintab/Makefile [new file with mode: 0644]
sintab/sintab.c [new file with mode: 0644]
test.asm

index c8f7c7a..6b22305 100644 (file)
@@ -5,4 +5,5 @@
 data.inc
 *.sfc
 img2snes/img2snes
 data.inc
 *.sfc
 img2snes/img2snes
+sintab/sintab
 link.map
 link.map
index ebe9b8a..3474e41 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,17 +1,23 @@
 test.sfc: test.o
        ld65 -o $@ -m link.map -C snes.ld $<
 
 test.sfc: test.o
        ld65 -o $@ -m link.map -C snes.ld $<
 
-test.o: test.asm hwregs.inc data.inc
+test.o: test.asm hwregs.inc data.inc sintab.inc
 
 %.o: %.asm
        ca65 -o $@ --cpu 65816 $<
 
 data.inc: logo4bpp.png img2snes/img2snes
 
 %.o: %.asm
        ca65 -o $@ --cpu 65816 $<
 
 data.inc: logo4bpp.png img2snes/img2snes
-       img2snes/img2snes -o data.inc logo4bpp.png
+       img2snes/img2snes -o $@ logo4bpp.png
+
+sintab.inc: sintab/sintab
+       sintab/sintab >$@
 
 img2snes/img2snes:
        $(MAKE) -C img2snes
 
 
 img2snes/img2snes:
        $(MAKE) -C img2snes
 
+sintab/sintab:
+       $(MAKE) -C sintab
+
 .PHONY: clean
 clean:
        rm -f test.sfc test.o
 .PHONY: clean
 clean:
        rm -f test.sfc test.o
index 672aedf..5fd9f2c 100644 (file)
@@ -82,6 +82,8 @@
        REG_MDMAEN      = $420b
        REG_HDMAEN      = $420c
 
        REG_MDMAEN      = $420b
        REG_HDMAEN      = $420c
 
+       REG_HVBJOY      = $4212
+
        REG_DMAP_BASE   = $4300
        REG_BBAD_BASE   = $4301
        REG_A1TL_BASE   = $4302
        REG_DMAP_BASE   = $4300
        REG_BBAD_BASE   = $4301
        REG_A1TL_BASE   = $4302
        setreg REG_CGDATA, (g >> 3 | b << 2)
        .endmacro
 
        setreg REG_CGDATA, (g >> 3 | b << 2)
        .endmacro
 
+       .macro wait_vblank
+@wait_vblank_loop:
+       lda REG_HVBJOY
+       and #$80
+       beq @wait_vblank_loop
+       .endmacro
+
+       ; vi:ft=asm_ca65:
diff --git a/sintab.inc b/sintab.inc
new file mode 100644 (file)
index 0000000..64f9d5c
--- /dev/null
@@ -0,0 +1,257 @@
+sintab:
+       .byte 127
+       .byte 130
+       .byte 133
+       .byte 136
+       .byte 139
+       .byte 143
+       .byte 146
+       .byte 149
+       .byte 152
+       .byte 155
+       .byte 158
+       .byte 161
+       .byte 164
+       .byte 167
+       .byte 170
+       .byte 173
+       .byte 176
+       .byte 179
+       .byte 182
+       .byte 184
+       .byte 187
+       .byte 190
+       .byte 193
+       .byte 195
+       .byte 198
+       .byte 200
+       .byte 203
+       .byte 205
+       .byte 208
+       .byte 210
+       .byte 213
+       .byte 215
+       .byte 217
+       .byte 219
+       .byte 221
+       .byte 224
+       .byte 226
+       .byte 228
+       .byte 229
+       .byte 231
+       .byte 233
+       .byte 235
+       .byte 236
+       .byte 238
+       .byte 239
+       .byte 241
+       .byte 242
+       .byte 244
+       .byte 245
+       .byte 246
+       .byte 247
+       .byte 248
+       .byte 249
+       .byte 250
+       .byte 251
+       .byte 251
+       .byte 252
+       .byte 253
+       .byte 253
+       .byte 254
+       .byte 254
+       .byte 254
+       .byte 254
+       .byte 254
+       .byte 255
+       .byte 254
+       .byte 254
+       .byte 254
+       .byte 254
+       .byte 254
+       .byte 253
+       .byte 253
+       .byte 252
+       .byte 251
+       .byte 251
+       .byte 250
+       .byte 249
+       .byte 248
+       .byte 247
+       .byte 246
+       .byte 245
+       .byte 244
+       .byte 242
+       .byte 241
+       .byte 239
+       .byte 238
+       .byte 236
+       .byte 235
+       .byte 233
+       .byte 231
+       .byte 229
+       .byte 228
+       .byte 226
+       .byte 224
+       .byte 221
+       .byte 219
+       .byte 217
+       .byte 215
+       .byte 213
+       .byte 210
+       .byte 208
+       .byte 205
+       .byte 203
+       .byte 200
+       .byte 198
+       .byte 195
+       .byte 193
+       .byte 190
+       .byte 187
+       .byte 184
+       .byte 182
+       .byte 179
+       .byte 176
+       .byte 173
+       .byte 170
+       .byte 167
+       .byte 164
+       .byte 161
+       .byte 158
+       .byte 155
+       .byte 152
+       .byte 149
+       .byte 146
+       .byte 143
+       .byte 139
+       .byte 136
+       .byte 133
+       .byte 130
+       .byte 127
+       .byte 124
+       .byte 121
+       .byte 118
+       .byte 115
+       .byte 111
+       .byte 108
+       .byte 105
+       .byte 102
+       .byte 99
+       .byte 96
+       .byte 93
+       .byte 90
+       .byte 87
+       .byte 84
+       .byte 81
+       .byte 78
+       .byte 75
+       .byte 72
+       .byte 70
+       .byte 67
+       .byte 64
+       .byte 61
+       .byte 59
+       .byte 56
+       .byte 54
+       .byte 51
+       .byte 49
+       .byte 46
+       .byte 44
+       .byte 41
+       .byte 39
+       .byte 37
+       .byte 35
+       .byte 33
+       .byte 30
+       .byte 28
+       .byte 26
+       .byte 25
+       .byte 23
+       .byte 21
+       .byte 19
+       .byte 18
+       .byte 16
+       .byte 15
+       .byte 13
+       .byte 12
+       .byte 10
+       .byte 9
+       .byte 8
+       .byte 7
+       .byte 6
+       .byte 5
+       .byte 4
+       .byte 3
+       .byte 3
+       .byte 2
+       .byte 1
+       .byte 1
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 0
+       .byte 1
+       .byte 1
+       .byte 2
+       .byte 3
+       .byte 3
+       .byte 4
+       .byte 5
+       .byte 6
+       .byte 7
+       .byte 8
+       .byte 9
+       .byte 10
+       .byte 12
+       .byte 13
+       .byte 15
+       .byte 16
+       .byte 18
+       .byte 19
+       .byte 21
+       .byte 23
+       .byte 25
+       .byte 26
+       .byte 28
+       .byte 30
+       .byte 33
+       .byte 35
+       .byte 37
+       .byte 39
+       .byte 41
+       .byte 44
+       .byte 46
+       .byte 49
+       .byte 51
+       .byte 54
+       .byte 56
+       .byte 59
+       .byte 61
+       .byte 64
+       .byte 67
+       .byte 70
+       .byte 72
+       .byte 75
+       .byte 78
+       .byte 81
+       .byte 84
+       .byte 87
+       .byte 90
+       .byte 93
+       .byte 96
+       .byte 99
+       .byte 102
+       .byte 105
+       .byte 108
+       .byte 111
+       .byte 115
+       .byte 118
+       .byte 121
+       .byte 124
diff --git a/sintab/Makefile b/sintab/Makefile
new file mode 100644 (file)
index 0000000..f78c3c9
--- /dev/null
@@ -0,0 +1,4 @@
+LDFLAGS = -lm
+
+sintab: sintab.o
+       $(CC) -o $@ $< $(LDFLAGS)
diff --git a/sintab/sintab.c b/sintab/sintab.c
new file mode 100644 (file)
index 0000000..150a32d
--- /dev/null
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <math.h>
+
+int main(void)
+{
+       int i;
+
+       printf("sintab:\n");
+       for(i=0; i<256; i++) {
+               float s = sin(i * 2.0 * M_PI / 256.0) * 0.5 + 0.5;
+               printf("\t.byte %d\n", (int)(s * 255.0));
+       }
+}
index e3a31e8..eff673c 100644 (file)
--- a/test.asm
+++ b/test.asm
@@ -3,16 +3,26 @@
 
        .segment "rodata"
        .include "data.inc"
 
        .segment "rodata"
        .include "data.inc"
+       .include "sintab.inc"
 
        .segment "code"
 
 
        .segment "code"
 
+       .macro A16
+       rep #$20
+       .a16
+       .endmacro
+       .macro A8
+       sep #$20
+       .a8
+       .endmacro
+
        ; VMEM map
        ; 0000: tilemap for BG1 (32x32 4bpp: 512b)
        ; 2048: BG3-base (h/v offsets)
        ; 8192: tile data (16k)
        ; VMEM map
        ; 0000: tilemap for BG1 (32x32 4bpp: 512b)
        ; 2048: BG3-base (h/v offsets)
        ; 8192: tile data (16k)
-
        vmem_tiles_offs = 4096  ; 4k words
        vmem_tiles_offs = 4096  ; 4k words
-       hoffs_offs = 1024       ; 2k words
+       vmem_hoffs_offs = 1024  ; 2k words
+       vmem_voffs_offs = vmem_hoffs_offs + 32
 
        sei
        clc
 
        sei
        clc
        .i8
 
        jsr snes_init
        .i8
 
        jsr snes_init
+       setreg REG_SETINI, $4   ; 239 lines
        setreg REG_BGMODE, $02  ; mode 2, 8x8 tiles
        setreg REG_BG12NBA, $1  ; tiles at offs 8kb
        setreg REG_TM, $1       ; main screen: BG1
        setreg REG_BGMODE, $02  ; mode 2, 8x8 tiles
        setreg REG_BG12NBA, $1  ; tiles at offs 8kb
        setreg REG_TM, $1       ; main screen: BG1
+       setreg REG_BG3SC, (vmem_hoffs_offs / 1024) << 2
 
        ldx #0
 cmap_loop:
 
        ldx #0
 cmap_loop:
@@ -48,30 +60,79 @@ cmap_loop:
        pea logo4bpp_tiles
        pea vmem_tiles_offs
        jsr copy_vmem
        pea logo4bpp_tiles
        pea vmem_tiles_offs
        jsr copy_vmem
-       rep #$20
-       .a16
+       A16
        pla
        pla
        pla
        pla
        pla
        pla
-       sep #$20
-       .a8
+       A8
 
        pea logo4bpp_tilemap_rows * logo4bpp_tilemap_cols * 2
        pea logo4bpp_tilemap
        pea 0
        jsr copy_vmem
 
        pea logo4bpp_tilemap_rows * logo4bpp_tilemap_cols * 2
        pea logo4bpp_tilemap
        pea 0
        jsr copy_vmem
-       rep #$20
-       .a16
+       A16
        pla
        pla
        pla
        pla
        pla
        pla
-       sep #$20
-       .a8
+       A8
 
        fblank 0
 
 
        fblank 0
 
-halt:
-       jmp halt
+       ; main loop
+       nframe = 0
+       ncol = 2
+       anim = 4
+
+       A16
+       stz nframe
+       A8
+mainloop:
+       wait_vblank
+
+       A16
+       lda nframe
+       lsr
+       lsr
+       sta anim
+       inc nframe
+       A8
+
+       lda #(vmem_voffs_offs & $ff)
+       sta REG_VMADDL
+       lda #(vmem_voffs_offs >> 8)
+       sta REG_VMADDH
+
+       stz ncol
+@cloop:
+       lda anim
+       clc
+       adc ncol
+       asl
+       tax
+       lda sintab,x
+       lsr
+       lsr
+       lsr
+
+       ldx ncol
+       bne @per_tile_offs
+       ; global scroll for the first column
+       sta REG_BG1VOFFS
+       stz REG_BG1VOFFS
+       bra @end
+
+@per_tile_offs:
+       sta REG_VMDATAL
+       lda #$20        ; enable for BG1
+       sta REG_VMDATAH
+@end:
+
+       inc ncol
+       lda ncol
+       and #$1f
+       bne @cloop
+
+       bra mainloop
 
        ; copy_vmem(vmem_offset, src, num_words)
 copy_vmem:
 
        ; copy_vmem(vmem_offset, src, num_words)
 copy_vmem: