Skip to content

Instantly share code, notes, and snippets.

@JettMonstersGoBoom
Last active July 3, 2019 22:47
Show Gist options
  • Save JettMonstersGoBoom/82f4d299758d2780be4162b281118b0a to your computer and use it in GitHub Desktop.
Save JettMonstersGoBoom/82f4d299758d2780be4162b281118b0a to your computer and use it in GitHub Desktop.
Pacman Millfork sample
//java -jar ..\..\millfork.jar pacman.mfk -s -g -o pacman -t pacman_machine
import random
byte watchdog @$50C0
word stack_address @$4fee
byte irqen @$5000
const pointer vidram = $4000
const word colram = $4400
const pointer sprtbase = $4ff0
const pointer spritecoords= $5060
const byte sprtIndex = 0
const byte sprtColor = 1
const byte spriteX = $00
const byte spriteY = $01
const byte sprite0 = 0
const byte sprite1 = 2
const byte sprite2 = 4
const byte sprite3 = 6
const byte sprite4 = 8
const byte sprite5 = 10
byte timer
array playerX[8]
array playerY[8]
array playerDX[8]
array playerDY[8]
array playerFR[8]
macro asm void disable_irq() {
DI
ld sp,$4ff0
ld a, $ff
out (0), a //// set interrupt vector
}
macro asm void enable_irq() {
im 1
ld a, $01
ld (irqen), a // enable hardware interrupts
EI
}
void __start()@0{
main()
}
interrupt void _irq()@$38 {
asm {
di
}
irqen=0
timer+=1
watchdog=0
irqen=1
asm {
ei
}
}
interrupt void _nmi()@$66 {
}
void main() {
byte row
byte page
pointer p
disable_irq()
watchdog=0
init_rand_seed()
p = vidram+64
for row,0,until,255 {
p[row] = (row+timer)&$3f
}
for row,0,until,8 {
playerX[row] = rand()
playerY[row] = rand()
playerDX[row]=1
playerDY[row]=1
playerFR[row]=rand()
}
timer = 3
enable_irq()
putstrz(0,2,"HELLO PAC"z,1)
putstrz(0,3,"NEXT LINE"z,3)
putstrz(0,10,"MONSTERS GO BOOM"z,5)
putchr(0,1,'A',7)
while true {
p = colram+64
page = ((timer>>3)&%11111110)+1
for row,0,until,255 {
p[row] = page + (row<<1)
}
for row,0,until,8 {
page = row+row
spritecoords[page + spriteX]=playerX[row]
spritecoords[page + spriteY]=playerY[row]
sprtbase[page + sprtIndex]=playerFR[row]
sprtbase[page + sprtColor]=1
if timer&$1==0{
playerX[row]+=playerDX[row]
playerY[row]+=playerDY[row]
if playerX[row]>250 {
playerDX[row]=$ff
}
if playerX[row]<6 {
playerDX[row]=1
}
if playerY[row]>250 {
playerDY[row]=$ff
}
if playerY[row]<6 {
playerDY[row]=1
}
}
if timer&$f==0{
playerFR[row]+=1
}
}
#if 0
spritecoords[sprite0 + spriteX]=timer
spritecoords[sprite0 + spriteY]=timer
sprtbase[sprite0 + sprtIndex]=timer
sprtbase[sprite0 + sprtColor]=25-timer
#endif
}
}
void putchr(byte x,byte y,byte ch,byte color){
pointer scr
pointer col
byte v
scr = $3A0
scr -= x*32
col = colram + scr
scr += vidram
scr[y]=ch
col[y]=color
}
void putstrz(byte x,byte y,pointer str,byte color) {
pointer scr
pointer col
byte v
scr = $3A0
scr -= x*32
scr += y
col = colram + scr
scr += vidram
byte index
index = 0
while str[index] != 0 {
v=str[index]
if v!=$20 {
scr[0]=str[index]
col[0]=color
}
scr-=32
col-=32
index += 1
}
}
; pacman hardware
[compilation]
arch=z80
encoding=ascii
screen_encoding=ascii
modules=default_panic
[allocation]
segments=default
default_code_segment=default
segment_default_start=$0000
segment_default_codeend=$fff
segment_default_datastart=$4c00
segment_default_end=$4ff0
[define]
PACMAN=1
WIDESCREEN=0
KEYBOARD=0
; TODO: ?
JOYSTICKS=1
HAS_BITMAP_MODE=1
[output]
style=single
format=$0000:$0fff
extension=6e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment