;:poke56,56:clr:printfre(9)"free
;:sys49161:sys36864:.opt oo
	*= $c000
	jmp init
	jmp scfetch
	jmp scsave
	jmp irqoff
	jmp goto
	jmp setspeed
	jmp turn
	jmp edit
	jmp scspeich
	jmp sclade
	jmp mainstart
	jmp stellen
charmem	=$3800
getx	=$b7f1
konf	=1
tmp	=166
vic	=$d000
tmp2	=tmp+2
tmp3	=tmp2+2
screens	=$4000
sperre	=$291
illquan	=$b248
vid	=$288
farbram	=$d800
col	=$286
sprmem	=$2c0
pointer	=$7f8
irqvec	=$314
oirq	=$ea31
offx	=24
offy	=50
calcx	=$e9f0
bild	=$d1
b	=$d020
entgl	=247
joystick	=$dc00
shift	=$28d
key	=$cb
komma	=$aefd
getpar	=$e1d4
sa	=$b9
save	=$ffd8
load	=$ffd5
screens2	=$5000
vicinit	=$ff81
calcfarb	=$ea24
farb	=$f3
maxy	=19
nmbkey	=198
sid	=$d400
satz	=*
	.byt 112,0,0,$f,$12,$2a,$27,$3c,$24
	.byt 109,$24,$3c,$27,$2a,$12,$f,0,$0
	.byt 125,$24,$3c,$e4,$54,$48,$f0,0,0
	.byt 110,0,0,$f0,$48,$54,$e4,$3c,$24
	.byt 66,$24,$3c,$24,$3c,$24,$3c,$24,$3c
	.byt 67,0,0,-1,$55,$55,-1,0,0
	.byt 91,$24,$24,-1,$25,$25,-1,$24,$3c
	.byt 113,0,$18,$18,$3c,$3c,$7e,$7e,0
	.byt 114,0,$7e,$7e,$3c,$3c,$18,$18,0
	.byt 107,0,0,-1,$45,$45,$e7,$24,$3c
	.byt 0
kugel	.byt $3c,$7e,-1,-1,-1,-1,$7e,$3c
x	.byt 0
y	.byt 0
spx	.word 0
spy	.byt 0
gleise	.byt 66,67,112,109,125,110,91,107,0
command	.word updwn,lftrgt,krv1,krv2,krv3,krv4,immerok,weiche
zuweis	.byt 2,1,1,3,0,2,0
richt	.byt 0
bereit	.byt 0
speed	.byt 1
temp	.byt 0
flag	.byt 0
dir	.byt 0
darf	.byt 0
ldir	.byt 0
ox	.byt 0
oy	.byt 0
rfg	.byt 0
temp2	.byt 0
colch	.byt 0
rotz	.byt 0,11,205
sneuf	.byt 0
snief	.byt 0
dauer	.byt 3,2,4
weg	.byt 0
lkey	.byt 0
charset	lda #51
	sei
	sta konf
	ldy #<vic
	sty tmp
	lda #>vic
	sta tmp+1
	sty tmp2
	lda #>charmem
	sta tmp2+1
	ldx #7
copichar	lda (tmp),y
	sta (tmp2),y
	iny
	bne copichar
	inc tmp+1
	inc tmp2+1
	dex
	bpl copichar
	lda #55
	sta konf
	cli
	lda #31
	sta vic+24
	lda #<satz
	ldy #>satz
	sta tmp
	sty tmp+1
holchar	ldy #0
	lda (tmp),y
	beq cfinish
	sta tmp2
	lda #0
	sta tmp2+1
	ldx #3
mal8lp	asl tmp2
	rol tmp2+1
	dex
	bne mal8lp
	lda tmp2+1
	clc
	adc #>charmem
	sta tmp2+1
	clc
	adc #4
	sta tmp3+1
	lda tmp2
	sta tmp3
holdata	iny
	cpy #9
	bcs finish1
	lda (tmp),y
	dey
	sta (tmp2),y
	eor #-1
	sta (tmp3),y
	iny
	bne holdata
finish1	lda #9
	clc
	adc tmp
	sta tmp
	lda #0
	adc tmp+1
	sta tmp+1
	bne holchar
cfinish	lda #$80
	sta sperre
	rts
clrscrs	ldx #15
	ldy #0
	sty tmp
	lda #>screens
	sta tmp+1
	lda #32
clrscrslp	sta (tmp),y
	iny
	bne clrscrslp
	inc tmp+1
	dex
	bpl clrscrslp
	rts
getsc	jsr getx
	cpx #4
	bcc scnrok
	jmp illquan
scnrok	txa
	asl
	asl
	clc
	adc #>screens
	sta tmp+1
	ldy #0
	sty tmp
	sty tmp2
	lda vid
	sta tmp2+1
	ldx #3
	rts
scsave	jsr getsc
sclp2	lda (tmp2),y
	sta (tmp),y
	iny
	bne sclp2
	inc tmp2+1
	inc tmp+1
	dex
	bpl sclp2
	rts
scfetch	jsr getsc
sclp1	lda (tmp),y
	sta (tmp2),y
	iny
	bne sclp1
	inc tmp2+1
	inc tmp+1
	dex
	bpl sclp1
farb2	lda #>farbram
	sta tmp+1
	ldx #2
	lda col
fillcol	sta (tmp),y
	iny
	bne fillcol
	inc tmp+1
	dex
	bpl fillcol
	ldy #31
fillcnt	sta (tmp),y
	dey
	bpl fillcnt
	rts
fillfarb	ldy #0
	sty tmp
	beq farb2
setsprite	lda #0
	ldx #63
clrsprite	sta sprmem,x
	dex
	bpl clrsprite
	ldx #7
	ldy #7*3
setkugel	lda kugel,x
	sta sprmem,y
	dey
	dey
	dey
	dex
	bpl setkugel
	lda #11
	sta pointer
	rts
setirq	sei
	sta irqvec
	sty irqvec+1
	cli
	rts
irqon	lda #<irq
	ldy #>irq
	bne setirq
irqon2	lda #<edirq
	ldy #>edirq
	bne setirq
irqoff	sei
	lda #0
	sta sid+24
	lda #<oirq
	ldy #>oirq
	bne setirq
home	lda #0
	sta x
	sta y
	sta richt
	lda #offx
	sta spx
	lda #0
	sta spx+1
	lda #offy
	sta spy
	rts
calc	lda x
	asl
	asl
	asl
	php
	clc
	adc #offx
	sta spx
	lda #0
	adc #0
	plp
	adc #0
	sta spx+1
	lda y
	asl
	asl
	asl
	clc
	adc #offy
	sta spy
	rts
irq	lda speed
	sta temp
zugloop	jsr movesprit
	lda bereit
	bne schon
	dec temp
	bne zugloop
	beq back
schon	lda entgl
	bne back
	jsr exec
	lda entgl
	bne back
	jsr fahr
	jsr rausch
back	jmp oirq
movesprit	lda #-1
	sta bereit
	lda vic+1
	cmp spy
	beq yok
	lda #0
	sta bereit
	bcc kly
	dec vic+1
	clc
	bcc yok
kly	inc vic+1
yok	lda vic+16
	and #1
	cmp spx+1
	bcc erhoe
	bne ernied
	lda vic
	cmp spx
	bcc erhoe
	beq xok
ernied	lda #0
	sta bereit
	dec vic
	ldx vic
	inx
	bne xok
	lda vic+16
	and #$fe
	sta vic+16
	jmp xok
erhoe	lda #0
	sta bereit
	inc vic
	bne xok
	lda vic+16
	ora #1
	sta vic+16
xok	rts
exec	jsr getchar
	ldx #0
	sty temp
suchakt	lda gleise,x
	beq entgleis
	cmp temp
	beq found
	inx
	bne suchakt
entgleis	lda #-1
	sta entgl
	lda #0
	sta sid+24
	rts
found	txa
	asl
	tax
	lda command,x
	sta jump+1
	lda command+1,x
	sta jump+2
jump	jsr 0
	rts
getchar	lda bild
	pha
	lda bild+1
	pha
	ldx y
	jsr calcx
	ldy x
	jsr effect
ef2	lda (bild),y
	tay
	pla
	sta bild+1
	pla
	sta bild
	rts
getchar2	lda bild
	pha
	lda bild+1
	pha
	ldx y
	jsr calcx
	ldy x
	jmp ef2
setspeed	jsr getx
	stx speed
	rts
goto	jsr getx
	stx x
	jsr getx
	stx y
	jsr calc
	jmp gleisauf
turn	lda richt
	eor #1
	sta richt
	rts
fahrpl	ldx richt
	beq richt0
	dex
	beq richt1
	dex
	beq richt2
	inc y
	rts
richt2	dec y
	rts
richt1	dec x
	rts
richt0	inc x
	rts
fahr	jsr fahrpl
	jmp calc
effect	lda colch
	beq nixeff
	lda farb
	pha
	lda farb+1
	pha
	jsr calcfarb
	lda colch
	cmp #2
	bcs eff2
	lda (farb),y
	clc
	adc #1
	sta (farb),y
endeff	pla
	sta farb+1
	pla
	sta farb
nixeff	rts
eff2	lda (farb),y
	and #$f
	beq wei
	lda #0
	.byt $2c
wei	lda #1
	sta (farb),y
	jmp endeff
gleisauf	jsr getchar
	ldx #0
	sty temp
suchakt2	lda gleise,x
	beq fehl
	cmp temp
	beq found2
	inx
	bne suchakt2
fehl	jmp entgleis
found2	lda zuweis,x
	sta richt
	lda #0
	sta entgl
	rts
setsp	jsr calc
	ldx #0
	ldy #20
pause	dex
	bne pause
	dey
	bne pause
waitfert	lda bereit
	beq waitfert
	rts
krv1	lda #2
	.byt $2c
krv2	lda #3
	ldx #1
	bne kurve
krv3	lda #3
	.byt $2c
krv4	lda #2
	ldx #0
kurve	sta tmp
	stx tmp+1
	lda richt
	cmp tmp
	beq ja1
	cmp tmp+1
	beq ja2
wr	jmp entgleis
ja1	lda tmp+1
	.byt $2c
ja2	lda tmp
	eor #1
	sta richt
immerok	rts
weiche	ldx richt
	bne weichn0
	lda weg
	beq immerok
	bne krv4
weichn0	dex
	bne weichn1
	rts
weichn1	dex
	beq krv4
	jmp entgleis
updwn	lda richt
	and #2
	beq wr
	rts
lftrgt	lda richt
	and #2
	bne wr
	inc y
	jsr getchar2
	dec y
	tya
	sec
	sbc #113
	sta weg
	rts
init	jsr vicinit
	jsr home
	jsr charset
	jsr clrscrs
	jsr setsprite
	lda #1
	sta speed
	lda #0
	sta vic+32
	sta vic+33
	jmp irqoff
mainstart	jsr getx
	stx colch
	lda #1
	sta vic+21
	sta vic+39
	sta sneuf
	lda #0
	sta richt
	sta entgl
	sta vic+27
	jsr irqon
	jmp schnaufi
edit	jsr irqon2
	lda #0
	sta flag
	sta dir
	sta ldir
	sta darf
	sta rfg
	lda #12
	sta y
	sta oy
	lda #20
	sta x
	sta ox
	lda #1
	sta vic+27
	sta vic+21
	lda #2
	sta speed
	jsr setsp
	jsr fillfarb
	dec speed
edloop	lda darf
	bne darfnot
	lda joystick
	and #16
	bne noturn
	lda flag
	eor #-1
	sta flag
	lda #7
	sta darf
	jmp noturn
darfnot	dec darf
noturn	lda flag
	beq tonix
	lda shift
	beq setz
	lda #32
	jsr set0
tonix	jmp nixakt
setz	ldx dir
	beq dir0
	dex
	beq dir1
	dex
	beq dir2
	bne dir3
dir0	lda ldir
	beq stra1
	cmp #1
	beq dummy
	cmp #2
	bne no02
	lda #112
	bne out
no02	lda #109
	bne out
dir1	lda ldir
	beq dummy
	cmp #1
	beq stra1
	cmp #2
	bne no12
	lda #110
	bne out
no12	lda #125
	bne out
dir2	lda ldir
	bne no20
	lda #125
	bne out
no20	cmp #2
	beq stra2
	cmp #3
	beq dummy
	lda #109
	bne out
dir3	lda ldir
	bne no30
	lda #110
	bne out
no30	cmp #2
	beq dummy
	cmp #3
	beq stra2
	lda #112
out	jsr set1
	lda #1
	sta rfg
	lda dir
	sta ldir
	jsr setz
	jmp dummy
stra1	lda #67
	.byt $2c
stra2	lda #66
	jsr set0
	lda rfg
	beq dummy
	lda #0
	sta rfg
	rts
dummy	nop
nixakt	lda key
	cmp #63
	bne wow2
	lda joystick
	and #31
	cmp #31
	bne wow2
	lda #0
	sta nmbkey
	rts
wow2	jsr tasten
	lda x
	sta ox
	lda y
	sta oy
	lda dir
	sta ldir
	lda y
	beq noup
	lda joystick
	and #1
	bne noup
	dec y
	lda #2
	sta dir
noup	lda y
	cmp #maxy
	bcs nodown
	lda joystick
	and #2
	bne nodown
	inc y
	lda #3
	sta dir
nodown	lda x
	beq noleft
	lda joystick
	and #4
	bne noleft
	dec x
	lda #1
	sta dir
noleft	lda x
	cmp #38
	bcs noright
	lda joystick
	and #8
	bne noright
	inc x
	lda #0
	sta dir
noright	jsr setsp
	jmp edloop
set0	sta temp2
	ldx y
	jsr calcx
	ldy x
	lda temp2
	cmp #67
	beq tes
	cmp #66
	bne setnr
tes	lda (bild),y
	cmp temp2
	beq setnr
	cmp #66
	beq setkr
	cmp #67
	beq setkr
	cmp #91
	bne setand
setkr	lda #91
	sta temp2
setnr	lda temp2
	sta (bild),y
	rts
setand	cmp #32
	beq setnr
	cmp #96
	beq setnr
	rts
set1	pha
	ldx oy
	jsr calcx
	ldy ox
	pla
	sta (bild),y
	rts
edirq	lda speed
	sta temp
zugloop2	jsr movesprit
	lda bereit
	bne schon2
	dec temp
	bne zugloop2
schon2	lda flag
	beq brwn
	lda #12
	.byt $2c
brwn	lda #9
	sta vic+39
	jmp oirq
sclade	jsr irqoff
	jsr komma
	jsr getpar
	lda #0
	sta sa
	ldx #<screens
	ldy #>screens
	jmp load
scspeich	jsr irqoff
	jsr komma
	jsr getpar
	ldx #<screens2
	ldy #>screens2
	lda #>screens
	stx tmp
	sta tmp+1
	lda #tmp
	sta sa
	jmp save
rausch	lda #15
	sta sid+24
	dec sneuf
	bne nosneuf
	inc snief
	ldx snief
	cpx #3
	bcc hatschi
	ldx #0
	stx snief
hatschi	lda rotz,x
	sta sid+1
	lda dauer,x
	sta sneuf
nosneuf	rts
schnaufi	lda #0
	ldx #24
clrsnau	sta sid,x
	dex
	bpl clrsnau
	lda #128
	sta sid+6
	lda #132
	sta sid+5
	lda #129
	sta sid+4
	rts
tasten	cmp #56
	bne not1
	lda #1
xs	sta speed
	rts
not1	cmp #59
	bne not2
	lda #2
	bne xs
not2	cmp #9
	bne notw
	ldx y
	cpx #maxy
	bcs notw
	jsr calcx
	ldy x
	lda #67
	sta (bild),y
	iny
	lda #107
	sta (bild),y
	tya
	clc
	adc #39
	tay
	lda #113
	sta (bild),y
notw	rts
stellen	lda vid
	sta tmp+1
	ldy #0
	sty tmp
	ldx #4
	stx lkey
stel1	lda (tmp),y
	cmp #114
	beq stel2
	cmp #113
	beq stel2
	inc tmp
	bne stel1
	inc tmp+1
	dex
	bne stel1
	rts
stel2	lda #1
	jsr tmpfarb
stel3	lda key
	cmp lkey
	beq stel3
	sta lkey
	cmp #63
	bne stel4
	lda farbram
	bne tmpfarb
stel4	cmp #60
	bne stel5
	lda farbram
	jsr tmpfarb
stel6	inc tmp
	bne stel7
	inc tmp+1
	dex
	bne stel7
	lda vid
	sta tmp+1
	ldx #4
stel7	lda (tmp),y
	cmp #113
	beq stel9
	cmp #114
	bne stel6
stel9	lda #1
	jsr tmpfarb
	bne stel3
stel5	cmp #40
	bne stel8
	lda #113
	sta (tmp),y
	bne stel3
stel8	cmp #43
	bne stel3
	lda #114
	sta (tmp),y
	bne stel3
tmpfarb	pha
	lda tmp
	sta farb
	lda tmp+1
	and #3
	ora #>farbram
	sta farb+1
	pla
	sta (farb),y
	rts
