mirror of
https://github.com/irmen/prog8.git
synced 2025-02-16 22:30:46 +00:00
added c64 starfield example
This commit is contained in:
parent
78d3d9d27d
commit
d8e18df3a1
@ -70,6 +70,7 @@ class TestCompilerOnExamplesC64: FunSpec({
|
|||||||
"cube3d-sprites",
|
"cube3d-sprites",
|
||||||
"plasma",
|
"plasma",
|
||||||
"sprites",
|
"sprites",
|
||||||
|
"starfield",
|
||||||
"turtle-gfx",
|
"turtle-gfx",
|
||||||
"wizzine",
|
"wizzine",
|
||||||
),
|
),
|
||||||
|
@ -3,6 +3,18 @@ TODO
|
|||||||
|
|
||||||
For next release
|
For next release
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
|
- fix operator precedence: if rasterCount ^ $80 >= 230 EOR should precede >=
|
||||||
|
- @(ptr) |= 3 -> asm peephole optimize remove the second ldy if the instruction before doesn't modify y
|
||||||
|
ldy #0
|
||||||
|
lda (starfieldPtr2),y
|
||||||
|
ora #3
|
||||||
|
ldy #0
|
||||||
|
sta (starfieldPtr2),y
|
||||||
|
- vm: intermediate code: don't flatten everything. Instead, as a new intermediary step,
|
||||||
|
convert the new Ast into *structured* intermediary code.
|
||||||
|
Basically keep the blocks and subroutines structure, including full subroutine signature information,
|
||||||
|
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
|
163
examples/starfield.p8
Normal file
163
examples/starfield.p8
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
; Galencia starfield ported to Prog8. Original: https://github.com/JasonAldred/C64-Starfield
|
||||||
|
; This is for the C64 only.
|
||||||
|
|
||||||
|
%option no_sysinit
|
||||||
|
|
||||||
|
main {
|
||||||
|
const uword starScreenChar = $0400 ; Screen address
|
||||||
|
const uword StarScreenCols = $d800 ; Character attribute address
|
||||||
|
|
||||||
|
const uword charBase = $3000 ; Address of our character set
|
||||||
|
const uword star1Init = charBase+$1d0 ; Init address for each star
|
||||||
|
const uword star2Init = charBase+$298
|
||||||
|
const uword star3Init = charBase+$240
|
||||||
|
const uword star4Init = charBase+$2e0
|
||||||
|
|
||||||
|
const uword star1Limit = charBase+$298 ; Limit for each star
|
||||||
|
const uword star2Limit = charBase+$360 ; Once limit is reached, they are reset
|
||||||
|
const uword star3Limit = charBase+$298
|
||||||
|
const uword star4Limit = charBase+$360
|
||||||
|
const uword star1Reset = charBase+$1d0 ; Reset address for each star
|
||||||
|
const uword star2Reset = charBase+$298
|
||||||
|
const uword star3Reset = charBase+$1d0
|
||||||
|
const uword star4Reset = charBase+$298
|
||||||
|
const uword staticStar1 = charBase+$250 ; 2 Locations for blinking static stars
|
||||||
|
const uword staticStar2 = charBase+$1e0
|
||||||
|
|
||||||
|
const ubyte starColourLimit = 20 ; use values 1 to 20
|
||||||
|
; Galencia uses these values
|
||||||
|
; 1 = mono
|
||||||
|
; 2 = duo
|
||||||
|
; 20 = full colour
|
||||||
|
|
||||||
|
; 4 x pointers for moving stars
|
||||||
|
uword @zp starfieldPtr1
|
||||||
|
uword @zp starfieldPtr2
|
||||||
|
uword @zp starfieldPtr3
|
||||||
|
uword @zp starfieldPtr4
|
||||||
|
|
||||||
|
ubyte rasterCount ; Counter that increments each frame
|
||||||
|
|
||||||
|
sub start () {
|
||||||
|
sys.set_irqd()
|
||||||
|
sys.memset(charBase, 8*256, 0) ; clear charset data
|
||||||
|
c64.EXTCOL = 0
|
||||||
|
c64.BGCOL0 = 0
|
||||||
|
c64.VMCSB = (charBase/1024) | %00010000 ; Characters at $3000
|
||||||
|
initStarfield()
|
||||||
|
createStarScreen()
|
||||||
|
|
||||||
|
repeat {
|
||||||
|
sys.waitvsync()
|
||||||
|
rasterCount ++
|
||||||
|
doStarfield()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub doStarfield() {
|
||||||
|
; This routine does 3 things:
|
||||||
|
; 1) Erases stars
|
||||||
|
; 2) Moves stars
|
||||||
|
; 3) Draws stars in new position
|
||||||
|
|
||||||
|
@(starfieldPtr1) = 0
|
||||||
|
@(starfieldPtr2) = 0
|
||||||
|
@(starfieldPtr3) = 0
|
||||||
|
@(starfieldPtr4) = 0
|
||||||
|
|
||||||
|
if rasterCount & 1 {
|
||||||
|
starfieldPtr1++
|
||||||
|
if starfieldPtr1==star1Limit
|
||||||
|
starfieldPtr1=star1Reset
|
||||||
|
}
|
||||||
|
starfieldPtr2++
|
||||||
|
if starfieldPtr2==star2Limit
|
||||||
|
starfieldPtr2=star2Reset
|
||||||
|
if rasterCount & 3 == 0 {
|
||||||
|
starfieldPtr3++
|
||||||
|
if starfieldPtr3==star3Limit
|
||||||
|
starfieldPtr3=star3Reset
|
||||||
|
}
|
||||||
|
starfieldPtr4 += 2
|
||||||
|
if starfieldPtr4==star4Limit
|
||||||
|
starfieldPtr4=star4Reset
|
||||||
|
|
||||||
|
; 2 static stars that flicker
|
||||||
|
if rasterCount >= 230
|
||||||
|
@(staticStar1) = 0
|
||||||
|
else
|
||||||
|
@(staticStar1) = 192
|
||||||
|
if (rasterCount ^ $80) >= 230
|
||||||
|
@(staticStar2) = 0
|
||||||
|
else
|
||||||
|
@(staticStar2) = 192
|
||||||
|
|
||||||
|
; Plot new stars
|
||||||
|
@(starfieldPtr1) |= 3
|
||||||
|
@(starfieldPtr2) |= 3
|
||||||
|
@(starfieldPtr3) |= 12
|
||||||
|
@(starfieldPtr4) |= 48
|
||||||
|
}
|
||||||
|
|
||||||
|
sub initStarfield() {
|
||||||
|
starfieldPtr1 = star1Init
|
||||||
|
starfieldPtr2 = star2Init
|
||||||
|
starfieldPtr3 = star3Init
|
||||||
|
starfieldPtr4 = star4Init
|
||||||
|
}
|
||||||
|
|
||||||
|
sub createStarScreen() {
|
||||||
|
; Creates the starfield charmap and colour charmap
|
||||||
|
; This routine paints vertical stripes of colour into the colourmap
|
||||||
|
; so the stars are different colours
|
||||||
|
; It also plots the correct characters to the screen, wrapping them around
|
||||||
|
; at the correct char count to give to the starfield effect.
|
||||||
|
|
||||||
|
uword @zp ptr
|
||||||
|
ubyte x
|
||||||
|
for x in 0 to 39 {
|
||||||
|
ubyte limit
|
||||||
|
ubyte char = starfieldRow[x]
|
||||||
|
if char >= 58+25
|
||||||
|
limit = 58+50
|
||||||
|
else
|
||||||
|
limit = 58+25
|
||||||
|
ubyte start = limit - 25
|
||||||
|
ptr = starScreenChar
|
||||||
|
repeat 25 {
|
||||||
|
ptr[x] = char
|
||||||
|
ptr += 40
|
||||||
|
char ++
|
||||||
|
if char == limit
|
||||||
|
char = start
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
; Fill colour map with vertical stripes of colour for starfield
|
||||||
|
ptr = StarScreenCols
|
||||||
|
ubyte ci = 0
|
||||||
|
repeat 25 {
|
||||||
|
for x in 0 to 39 {
|
||||||
|
ptr[x] = starfieldCols[ci]
|
||||||
|
ci ++
|
||||||
|
if ci==starColourLimit
|
||||||
|
ci=0
|
||||||
|
}
|
||||||
|
ptr += 40
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
; Dark starfield so it doesnt distract from bullets and text
|
||||||
|
ubyte[20] starfieldCols = [
|
||||||
|
14,10,12,15,14,13,12,11,10,14,
|
||||||
|
14,10,14,15,14,13,12,11,10,12
|
||||||
|
]
|
||||||
|
|
||||||
|
; Star positions, 40 X positions, range 58-107
|
||||||
|
ubyte[40] starfieldRow = [
|
||||||
|
058,092,073,064,091,062,093,081,066,094,
|
||||||
|
086,059,079,087,080,071,076,067,082,095,
|
||||||
|
100,078,099,060,075,063,084,065,083,096,
|
||||||
|
068,088,074,061,090,098,085,101,097,077
|
||||||
|
]
|
||||||
|
}
|
@ -4,4 +4,4 @@ org.gradle.parallel=true
|
|||||||
org.gradle.daemon=true
|
org.gradle.daemon=true
|
||||||
kotlin.code.style=official
|
kotlin.code.style=official
|
||||||
javaVersion=11
|
javaVersion=11
|
||||||
kotlinVersion=1.7.0
|
kotlinVersion=1.7.10
|
Loading…
x
Reference in New Issue
Block a user