gb_test2

annotate test.asm @ 6:6a7eb418caec

even better chessboard
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 12 Jan 2019 00:05:14 +0200
parents be6f719279b6
children
rev   line source
nuclear@0 1 ; vi:ft=rgbasm:
nuclear@4 2 ; -------- build options ----------
nuclear@4 3 BUILD_CHESS equ 1
nuclear@4 4 BUILD_LOGO equ 2
nuclear@4 5
nuclear@4 6 BUILD = BUILD_LOGO
nuclear@4 7 ; ---------------------------------
nuclear@4 8
nuclear@0 9 include "hw.inc"
nuclear@0 10
nuclear@0 11 xoffs_center equ 4
nuclear@0 12 yoffs_center equ 12
nuclear@0 13
nuclear@3 14 frame equ $ff80
nuclear@3 15 bnstate equ $ff81
nuclear@3 16 bnxor equ $ff82
nuclear@3 17 pause equ $ff83
nuclear@3 18
nuclear@3 19 BN_A equ $01
nuclear@3 20 BN_B equ $02
nuclear@3 21 BN_SELECT equ $04
nuclear@3 22 BN_START equ $08
nuclear@3 23 BN_RIGHT equ $10
nuclear@3 24 BN_LEFT equ $20
nuclear@3 25 BN_UP equ $40
nuclear@3 26 BN_DOWN equ $80
nuclear@0 27
nuclear@0 28 section "hdr", ROM0[$100]
nuclear@0 29 nop
nuclear@0 30 jp main
nuclear@0 31
nuclear@0 32 rept $150 - $104
nuclear@0 33 db 0
nuclear@0 34 endr
nuclear@0 35
nuclear@0 36 section "text", ROM0
nuclear@0 37
nuclear@0 38 main:
nuclear@0 39 call init
nuclear@0 40
nuclear@0 41 xor a, a
nuclear@3 42 ldh [frame], a
nuclear@3 43 ldh [bnstate], a
nuclear@3 44 ldh [bnxor], a
nuclear@3 45 ldh [pause], a
nuclear@3 46
nuclear@0 47 .mainloop:
nuclear@0 48 ldh a, [REG_LY]
nuclear@0 49 cp a, 144
nuclear@0 50 jr c, .wait_hsync
nuclear@0 51
nuclear@3 52 ; we're in vsync, increment frame counter, handle input,
nuclear@3 53 ; and wait for the next frame
nuclear@3 54 call read_input
nuclear@3 55
nuclear@3 56 ; swap palette if A is pressed
nuclear@3 57 ldh a, [bnxor]
nuclear@3 58 and a, BN_A
nuclear@3 59 jr z, .skip_akey ; skip if A haven't changed state since last frame
nuclear@3 60 ldh a, [bnstate]
nuclear@3 61 and a, BN_A
nuclear@3 62 jr z, .skip_akey ; skip if A is not pressed
nuclear@3 63 ldh a, [REG_BGP]
nuclear@3 64 cpl
nuclear@3 65 ldh [REG_BGP], a
nuclear@3 66 .skip_akey:
nuclear@3 67 ; toggle pause if start is pressed
nuclear@3 68 ldh a, [bnxor]
nuclear@3 69 and a, BN_START
nuclear@3 70 jr z, .skip_startkey ; skip if start haven't changed state since last frame
nuclear@3 71 ldh a, [bnstate]
nuclear@3 72 and a, BN_START
nuclear@3 73 jr z, .skip_startkey ; skip if start is not pressed
nuclear@3 74 ldh a, [pause]
nuclear@3 75 cpl
nuclear@3 76 ldh [pause], a
nuclear@3 77 .skip_startkey:
nuclear@3 78
nuclear@3 79 ; increment frame if we're not paused
nuclear@3 80 ldh a, [pause]
nuclear@3 81 bit 0, a
nuclear@3 82 jr nz, .skip_frameinc
nuclear@3 83 ldh a, [frame]
nuclear@0 84 inc a
nuclear@3 85 ldh [frame], a
nuclear@3 86 .skip_frameinc:
nuclear@3 87
nuclear@3 88
nuclear@0 89 .wait_newframe:
nuclear@0 90 ldh a, [REG_LY]
nuclear@0 91 cp a, 0
nuclear@0 92 jr nz, .wait_newframe
nuclear@0 93
nuclear@0 94 ; scanline code
nuclear@0 95 .wait_hsync:
nuclear@0 96 ldh a, [REG_STAT]
nuclear@0 97 and a, STAT_MODE_MASK
nuclear@0 98 jr nz, .wait_hsync
nuclear@0 99
nuclear@3 100 ldh a, [frame]
nuclear@0 101 ld d, a
nuclear@0 102
nuclear@0 103 xor a, a
nuclear@0 104 ld b, a
nuclear@1 105
nuclear@0 106 ldh a, [REG_LY]
nuclear@1 107 add a, d ; add frame number
nuclear@0 108 ld c, a
nuclear@0 109
nuclear@0 110 ld hl, sintab
nuclear@1 111 add hl, bc ; hl now points to the sine value
nuclear@0 112
nuclear@1 113 ld a, [hl]
nuclear@1 114
nuclear@1 115 ; add a half-octave sine
nuclear@1 116 ld e, a ; save first sine to e
nuclear@1 117 sla d
nuclear@1 118 ld a, [REG_LY]
nuclear@1 119 sla a
nuclear@1 120 add a, d
nuclear@1 121 ld c, a
nuclear@1 122 srl d
nuclear@1 123
nuclear@1 124 ld hl, sintab
nuclear@1 125 add hl, bc
nuclear@1 126 ld a, [hl]
nuclear@1 127 sra a
nuclear@1 128 add a, e ; add previously saved sine
nuclear@1 129
nuclear@1 130 add a, yoffs_center
nuclear@0 131 ldh [REG_SCY], a
nuclear@0 132
nuclear@1 133 ; do something for SCX too
nuclear@1 134 ld a, d
nuclear@1 135 sla a
nuclear@1 136 ld d, a
nuclear@1 137
nuclear@1 138 ldh a, [REG_LY]
nuclear@1 139 add a, 32
nuclear@1 140 add a, d ; add frame number
nuclear@1 141 ld c, a
nuclear@1 142
nuclear@1 143 ld hl, sintab
nuclear@1 144 add hl, bc
nuclear@1 145
nuclear@1 146 ld a, [hl]
nuclear@1 147 sra a
nuclear@1 148 add a, xoffs_center
nuclear@1 149 ldh [REG_SCX], a
nuclear@1 150
nuclear@0 151 ; done, wait until we're out of hsync
nuclear@0 152 .wait_endhsync:
nuclear@0 153 ldh a, [REG_STAT]
nuclear@0 154 and a, STAT_MODE_MASK
nuclear@0 155 jr z, .wait_endhsync
nuclear@0 156
nuclear@3 157 jp .mainloop
nuclear@0 158
nuclear@0 159
nuclear@0 160 di
nuclear@0 161 .end: halt
nuclear@0 162 nop
nuclear@0 163 jp .end
nuclear@0 164
nuclear@0 165 init:
nuclear@0 166 call wait_vsync
nuclear@0 167 xor a, a
nuclear@0 168 ldh [REG_LCDC], a
nuclear@0 169
nuclear@2 170 ; setup palette
nuclear@0 171 ld a, $1b
nuclear@0 172 ldh [REG_BGP], a
nuclear@0 173
nuclear@0 174 ; copy tiles
nuclear@0 175 ld hl, $8000
nuclear@0 176 ld de, tiles
nuclear@0 177 ld bc, tiles_end - tiles
nuclear@0 178 .copytiles:
nuclear@0 179 ld a, [de]
nuclear@0 180 ld [hl+], a
nuclear@0 181 inc de
nuclear@0 182 dec bc
nuclear@0 183 ld a, b
nuclear@0 184 or c
nuclear@0 185 jp nz, .copytiles
nuclear@0 186
nuclear@4 187 IF BUILD == BUILD_LOGO
nuclear@4 188 ; copy logo tilemap
nuclear@0 189 ld hl, $9800
nuclear@0 190 ld de, tilemap
nuclear@0 191 ld b, 21
nuclear@0 192 .copymap:
nuclear@0 193 ld c, 21
nuclear@0 194 .copymaprow:
nuclear@0 195 ld a, [de]
nuclear@0 196 inc de
nuclear@0 197 ld [hl+], a
nuclear@0 198 dec c
nuclear@0 199 jr nz, .copymaprow
nuclear@0 200
nuclear@0 201 push bc
nuclear@0 202 ld bc, 11
nuclear@0 203 add hl, bc
nuclear@0 204 pop bc
nuclear@0 205
nuclear@0 206 dec b
nuclear@0 207 jr nz, .copymap
nuclear@4 208 ELSE
nuclear@4 209 ; generate chessboard tilemap
nuclear@4 210 ld hl, $9800
nuclear@4 211 ld b, 32
nuclear@4 212 .fillscr:
nuclear@4 213 ld c, 32
nuclear@4 214 .fillrow:
nuclear@4 215 ld a, b
nuclear@6 216 srl a
nuclear@6 217 ld d, a
nuclear@6 218 ld a, c
nuclear@6 219 srl a
nuclear@6 220 add a, d
nuclear@4 221 and a, 1
nuclear@4 222 ld [hl+], a
nuclear@6 223 ld a, d
nuclear@4 224 dec c
nuclear@4 225 jr nz, .fillrow
nuclear@4 226
nuclear@4 227 dec b
nuclear@4 228 jr nz, .fillscr
nuclear@4 229 ENDC
nuclear@0 230
nuclear@0 231 ; center viewport
nuclear@0 232 ld a, yoffs_center
nuclear@0 233 ldh [REG_SCY], a
nuclear@0 234 ld a, xoffs_center
nuclear@0 235 ldh [REG_SCX], a
nuclear@0 236
nuclear@0 237 ; configure LCD
nuclear@0 238 ld a, LCDC_DISPON | LCDC_CHAR_8000 | LCDC_BGON
nuclear@0 239 ldh [REG_LCDC], a
nuclear@0 240 ret
nuclear@0 241
nuclear@0 242 wait_vsync:
nuclear@0 243 ldh a, [REG_LY]
nuclear@0 244 cp a, 144
nuclear@0 245 jr c, wait_vsync
nuclear@0 246 ret
nuclear@0 247
nuclear@3 248 read_input:
nuclear@3 249 ; read D-pad
nuclear@3 250 ld a, P1_DPAD
nuclear@3 251 ld [REG_P1], a
nuclear@3 252 ld a, [REG_P1]
nuclear@3 253 ld a, [REG_P1]
nuclear@3 254 cpl
nuclear@3 255 and a, $0f
nuclear@3 256 swap a
nuclear@3 257 ld b, a
nuclear@3 258 ; read buttons
nuclear@3 259 ld a, P1_BUTTONS
nuclear@3 260 ld [REG_P1], a
nuclear@3 261 ld a, [REG_P1]
nuclear@3 262 ld a, [REG_P1]
nuclear@3 263 ld a, [REG_P1]
nuclear@3 264 ld a, [REG_P1]
nuclear@3 265 ld a, [REG_P1]
nuclear@3 266 ld a, [REG_P1]
nuclear@3 267 cpl
nuclear@3 268 and a, $0f
nuclear@3 269 or a, b
nuclear@3 270 ld b, a
nuclear@3 271 ; reset port
nuclear@3 272 ld a, P1_DPAD | P1_BUTTONS
nuclear@3 273 ldh [REG_P1], a
nuclear@3 274 ; calculate differences and save state variables
nuclear@3 275 ldh a, [bnstate]
nuclear@3 276 xor a, b
nuclear@3 277 ldh [bnxor], a
nuclear@3 278 ld a, b
nuclear@3 279 ldh [bnstate], a
nuclear@3 280 ret
nuclear@3 281
nuclear@0 282 section "data", ROM0, align[8]
nuclear@0 283 sintab:
nuclear@0 284 include "sin.inc"
nuclear@0 285
nuclear@4 286 IF BUILD == BUILD_LOGO
nuclear@0 287 tiles:
nuclear@0 288 incbin "logo.tiles"
nuclear@0 289 tiles_end:
nuclear@0 290 tilemap:
nuclear@0 291 incbin "logo.tilemap"
nuclear@0 292 tilemap_end:
nuclear@4 293
nuclear@4 294 ELSE
nuclear@4 295 ; chessboard tiles
nuclear@4 296 tiles:
nuclear@5 297 db $ff,$00
nuclear@5 298 db $81,$00
nuclear@5 299 db $81,$00
nuclear@5 300 db $81,$00
nuclear@5 301 db $81,$00
nuclear@5 302 db $81,$00
nuclear@5 303 db $81,$00
nuclear@5 304 db $ff,$00
nuclear@4 305
nuclear@5 306 db $00,$ff
nuclear@5 307 db $7e,$ff
nuclear@5 308 db $7e,$ff
nuclear@5 309 db $7e,$ff
nuclear@5 310 db $7e,$ff
nuclear@5 311 db $7e,$ff
nuclear@5 312 db $7e,$ff
nuclear@5 313 db $00,$ff
nuclear@4 314 tiles_end:
nuclear@4 315 ENDC