Trevor Merritt e29ac45c84 scroll down works on CHIP-8 and High-Res modes
scroll left and right work in stdef and hidef
adds octo test roms
adds schip fonts to memory
2024-10-27 11:41:25 -04:00

255 lines
4.7 KiB
Plaintext

###########################################
#
# F8Z: a chip8/Octo tech demo
#
# A/D move gomez left and right.
# Q/E rotate the world around him.
# Runs best at 100 cycles/frame.
#
###########################################
: letter-F 0x07 0x19 0x61 0x81 0x87 0x99 0x81 0x81 0x87 0x9E 0x98 0x90 0x90 0xF0 0xE0
: letter-8 0x0E 0x33 0x41 0x89 0x99 0x93 0x81 0xC1 0x89 0x99 0x91 0x83 0xCE 0x78 0x60
: letter-Z 0x07 0x19 0x61 0x81 0x91 0xE1 0x43 0x86 0x89 0x81 0x81 0x87 0x9E 0xF8 0x60
: cloud1 0x07 0x0F 0x7F 0xFF
: cloud2 0xC0 0xE0 0xFE 0xFF
: cloud3 0x30 0x7E 0xFF
: pillar # (padded to 16 bytes/side)
0x06 0x1B 0x65 0x8F 0xD5 0xBD 0xFB 0x7E 0x83 0xBB 0xBB 0xBB 0x83 0x7F 0xFD 0x00
0x78 0xD6 0xFE 0xFD 0xBF 0xFF 0xFE 0xFF 0x83 0xAB 0xAB 0xBB 0x82 0xFF 0xBF 0x00
0x60 0xB8 0xFE 0xFB 0x7B 0x7F 0xFF 0xDF 0x83 0xBA 0xA3 0xBB 0x83 0x7F 0xFD 0x00
0x16 0xD9 0xA6 0xBB 0xFB 0xFF 0xDF 0xFE 0x82 0xBB 0xAB 0xAB 0x83 0x7F 0xF9 0x00
: floors # (padded to 8 bytes/tile)
0xFE 0xFE 0xFE 0xE0 0xEF 0xEF 0xEF 0x00
0xEF 0xEF 0xEF 0xE0 0xFE 0xFE 0xFE 0x00
0xEF 0xEF 0xEF 0xE0 0xEE 0xEE 0xEE 0x00
0xFE 0xFE 0xFE 0xE0 0xEE 0xEE 0xEE 0x00
: gomez # (padded to 16 bytes/frame)
0x00 0x00 0x60 0xE0 0x7E 0xFF 0xBD 0xF7 0x7E 0x18 0x3C 0x5E 0x3C 0x3C 0x24 0x00 # facing right
0x00 0x60 0x60 0xFE 0xFF 0xBD 0xF7 0x7E 0x18 0x3C 0x5E 0x3C 0x3C 0x48 0x00 0x00
0x00 0x60 0x60 0xFE 0xFF 0xBD 0xF7 0x7E 0x18 0x7E 0x1C 0x3C 0x3C 0x24 0x00 0x00
0x00 0x00 0x60 0xFE 0xFF 0xFF 0xBD 0x76 0x18 0x3C 0x5E 0x3C 0x3C 0x12 0x00 0x00
0x00 0x00 0x06 0x07 0x7E 0xFF 0xBD 0xEF 0x7E 0x18 0x3C 0x7A 0x3C 0x3C 0x24 0x00 # facing left
0x00 0x06 0x06 0x7F 0xFF 0xBD 0xEF 0x7E 0x18 0x3C 0x7A 0x3C 0x3C 0x12 0x00 0x00
0x00 0x06 0x06 0x7F 0xFF 0xBD 0xEF 0x7E 0x18 0x7E 0x38 0x3C 0x3C 0x24 0x00 0x00
0x00 0x00 0x06 0x7F 0xFF 0xFF 0xBD 0x6E 0x18 0x3C 0x7A 0x3C 0x3C 0x48 0x00 0x00
: pillar-pos
46 10 16 46
: cloud-delta
254 255 254 255 2 1 2 1
: sync
v2 := 4
delay := v2
loop
v2 := delay
if v2 != 0 then
again
;
: draw-objects
v0 := 2
v1 := vd
v1 += 8
v2 := 1
i := gomez
i += vc # animation frame
i += v8 # direction facing
sprite va vb 15
# clouds
i := cloud1
sprite vd v0 4
i := cloud2
sprite v1 v0 4
i := cloud3
sprite ve v2 3
# pillar
i := pillar-pos # get x coord
i += v5
load v0
v1 := 9
i := pillar
v2 <<= v5 # add (rotation * 16)
v2 <<= v2
v2 <<= v2
v2 <<= v2
i += v2
sprite v0 v1 15
;
: draw-background
v0 := 0
v1 := 25
loop
i := floors
v2 := random 0b11000
i += v2
sprite v0 v1 7
v0 += 8
if v0 != 64 then
again
;
###########################################
#
# Wipe Effects
#
###########################################
: wipe-common
v1 := 16
buzzer := v1
v1 := 0b11 # wrap rotation modulo 4
v5 &= v1
i := gomez
loop
i += v1
v1 := 1
sprite v0 v1 15
v1 := 16
sprite v0 v1 15
sync
v1 := 1
sprite v0 v1 15
v1 := 16
sprite v0 v1 15
v2 := v0
v0 += v3
v1 := 0b111111
v2 := v0
v2 &= v1
if v2 != 0 then
again
clear
draw-background
;
: wipe-left
# rotate player's position
v0 := va
va := v7
v7 := 64
v7 -= v0
v5 += -1
v0 := 64
v3 := -16
jump wipe-common
: wipe-right
# rotate player's position
v0 := va
va := v7
v7 := 64
v7 += v0
v5 += 1
v0 := 0
v3 := 16
jump wipe-common
###########################################
#
# Movement and Animation
#
###########################################
: walk
v9 += -1 # count down anim timer
vc += 16 # advance frame
v0 := 0b0110000
vc &= v0
if v8 == 0 then va += 1 # move
if v8 != 0 then va += -1
;
: face-left v8 := 64 ;
: move-left if v8 == 0 then jump face-left v9 := 4 ;
: face-right v8 := 0 ;
: move-right if v8 == 64 then jump face-right v9 := 4 ;
: move-player
if v9 != 0 then jump walk
v0 := 7
if v0 key then jump move-left
v0 := 9
if v0 key then jump move-right
v0 := 4
if v0 key then jump wipe-left
v0 := 6
if v0 key then jump wipe-right
;
###########################################
#
# Main Loop
#
###########################################
: main
# title screen
v0 := 15
v1 := 13
i := letter-F
sprite v0 v1 15
v0 += 12
v1 += -5
i := letter-8
sprite v0 v1 15
v0 += 12
v1 += -5
i := letter-Z
sprite v0 v1 15
v0 := 16
loop
sync
v0 += -1
if v0 != 0 then
again
clear
# v0-v3 are used extensively as temporaries
# v4 is still free
v5 := 0 # rotation index
v6 := 0 # real x
v7 := 0 # real y
v8 := 0 # 0 - right, 64 - left
v9 := 0 # moving?
va := 10 # player x position
vb := 10 # player y position
vc := 0 # player anim frame
vd := 10 # big cloud x
ve := 40 # small cloud x
draw-background
draw-objects
loop
draw-objects
move-player
i := cloud-delta
i += v5
i += v5
load v1
vd += v0
ve += v1
draw-objects
sync
again