.nolist
#include "asm.inc"
#include "ion.inc"
.list
.org $9D93
#define lampstate saferam1
#define carx saferam1+2
#define tunnelx saferam1+4
#define tunnely saferam1+5
#define cary saferam1+6
#define tunnelcount saferam1+8
	.db $BB,$6D
	ret
	jr nc,start
	.db "Speed Extreme",0
start:
	bcall(_clrscrnfull)
	bcall(_grbufclr)
	ld hl,background
	ld de,plotsscreen
	ld bc,768
	ldir
	call ionFastCopy
	ld a,1
	ld (lampstate),a
	ld a,40
	ld (carx),a
	call lamps1
	call XorCar
MainLoop:
	ld hl,$8000
	ld de,$8000
	ld bc,250
	ldir
	ld a,$ff
	out (1),a
	ld a,Group7
	out (1),a
	in a,(1)
	cp kMode
	ret z
	ld a,(lampstate)
	cp 7
	jr nc,skipmoveonground
	ld a,$ff
	out (1),a
	ld a,Group1
	out (1),a
	in a,(1)
	cp kLeft
	call z,MoveCarLeftOnGround
	cp kRight
	call z,MoveCarRightOnGround
skipmoveonground:
	ld a,$ff
	out (1),a
	ld a,Group7
	out (1),a
	in a,(1)
	cp k2nd
	jp z,BeginFlying
	ld a,(lampstate)
	inc a
	ld (lampstate),a
	cp $80
	jr z,swaplight1with2
	or a
	jr z,swaplight2with1
	jr MainLoop
swaplight1with2:
	call lamps1
	call lamps2
	jp MainLoop
swaplight2with1:
	call lamps2
	call lamps1
	jp MainLoop
MoveCarLeftOnGround:
	ld a,(carx)
	cp 21
	ret c
	call XorCar
	ld a,(carx)
	dec a
	ld (carx),a
	jp XorCar
MoveCarRightOnGround:
	ld a,(carx)
	cp 58
	ret nc
	call XorCar
	ld a,(carx)
	inc a
	ld (carx),a
	jp XorCar
lamps1:
	ld b,17
	ld l,54-17
	ld a,14
	ld ix,lightposttall
	call ionPutSprite
	ld ix,lightposttall
	ld a,23
	ld l,45-8
	ld b,8
	call ionPutSprite
	ld ix,lightpostshort
	ld a,31
	ld l,39-8
	ld b,8
	call ionPutSprite
	ld a,48
	ld l,36
	ld b,27
	ld ix,RoadStripe
	call ionPutSprite
	jp ionFastCopy
lamps2:
	ld b,17
	ld l,61-17
	ld a,7
	ld ix,lightposttall
	call ionPutSprite
	ld a,22
	ld l,48-8
	ld b,8
	call ionPutSprite
	ld a,48
	ld l,33
	ld b,27
	ld ix,RoadStripe
	call ionPutSprite
	jp ionFastCopy
XorCar:
	ld ix,Car
	ld a,(carx)
	ld l,62-8
	ld b,8
	ld c,2
	jp ionLargeSprite
XorCarFly:
	ld ix,Car
	ld a,(cary)
	ld l,a
	ld a,(carx)
	ld b,8
	ld c,2
	jp ionLargeSprite
BeginFlying:
	ld hl,flyingbground
	ld de,plotsscreen
	ld bc,768
	ldir
	ld a,23
	ld (tunnelx),a
	ld a,6
	ld (tunnely),a
	ld a,27
	ld (carx),a
	ld a,10
	ld (cary),a
	ld hl,1
	ld (tunnelcount),hl
	call XorTunnel
	call XorCarFly
	call flystripe1
	call ionFastCopy
Flyloop:
	ld hl,$8000
	ld de,$8000
	ld bc,3000
	ldir
	ld a,$ff
	out (1),a
	ld a,Group7
	out (1),a
	in a,(1)
	cp kMode
	ret z
	ld a,$ff
	out (1),a
	ld a,Group1
	out (1),a
	in a,(1)
	cp kLeft
	call z,MoveCarLeftInAir
	cp kRight
	call z,MoveCarRightInAir
	cp kUp
	call z,MoveCarUpInAir
	cp kDown
	call z,MoveCarDownInAir
	ld b,5
	call ionRandom
	cp 4
	call z,MoveTunnelDown
	cp 3
	call z,MoveTunnelUp
	cp 2
	call z,MoveTunnelLeft
	cp 1
	call z,MoveTunnelRight
	ld a,(carx)
	ld b,a
	ld a,(tunnelx)
	cp b
	jr z,flyover
	add a,16
	cp b
	jr z,flyover
	ld a,(cary)
	ld b,a
	ld a,(tunnely)
	cp b
	jr z,flyover
	add a,12
	cp b
	jr z,flyover
	ld hl,(tunnelcount)
	inc hl
	ld (tunnelcount),hl
	ld a,h
	cp $03
	jp z,SpaceStart
	ld a,l
	sra a
	jr c,SwapFlyStripes
	jr nc,SwapFlyStripes2
flyover:
	ret
SwapFlyStripes:
	call flystripe1
	call flystripe2
	jp Flyloop
SwapFlyStripes2:
	call flystripe2
	call flystripe1
	jp Flyloop
flystripe1:
	ld ix,FlyStripe
	ld a,44
	ld l,44
	ld b,18
	jp ionPutSprite
flystripe2:
	ld ix,FlyStripe
	ld a,44
	ld l,46
	ld b,18
	jp ionPutSprite
MoveCarLeftInAir:
	ld a,(carx)
	call XorCarFly
	ld a,(carx)
	dec a
	ld (carx),a
	ld b,a
	ld a,(tunnelx)
	cp b
	jr z,carhittunnel
	call XorCarFly
	jp ionFastCopy
MoveCarRightInAir:
	ld a,(carx)
	call XorCarFly
	ld a,(carx)
	inc a
	ld (carx),a
	ld b,a
	ld a,(tunnelx)
	add a,16
	cp b
	jr z,carhittunnel
	call XorCarFly
	jp ionFastCopy
MoveCarUpInAir:
	ld a,(cary)
	call XorCarFly
	ld a,(cary)
	dec a
	ld (cary),a
	ld b,a
	ld a,(tunnely)
	cp b
	jr z,carhittunnel
	call XorCarFly
	jp ionFastCopy
MoveCarDownInAir:
	ld a,(cary)
	call XorCarFly
	ld a,(cary)
	inc a
	ld (cary),a
	ld b,a
	ld a,(tunnely)
	add a,12
	cp b
	jr z,carhittunnel
	call XorCarFly
	jp ionFastCopy
carhittunnel:
	pop hl
	ret
MoveTunnelDown:
	ld a,(tunnely)
	cp 6
	ret nc
	call XorTunnel
	ld a,(tunnely)
	inc a
	ld (tunnely),a
	jr XorTunnel
MoveTunnelUp:
	ld a,(tunnely)
	cp 1
	ret c
	call XorTunnel
	ld a,(tunnely)
	dec a
	ld (tunnely),a
	jr XorTunnel
MoveTunnelLeft:
	ld a,(tunnelx)
	cp 17
	ret c
	call XorTunnel
	ld a,(tunnelx)
	dec a
	ld (tunnelx),a
	jr XorTunnel
MoveTunnelRight:
	ld a,(tunnelx)
	cp 73-32
	ret nc
	call XorTunnel
	ld a,(tunnelx)
	inc a
	ld (tunnelx),a
	jr XorTunnel
XorTunnel:
	ld c,4
	ld b,20
	ld ix,Tunnel
	ld a,(tunnely)
	ld l,a
	ld a,(tunnelx)
	call ionLargeSprite
	jp ionFastCopy
SpaceStart:
	ld hl,plotsscreen
	ld bc,768
fillloop:
	ld (hl),$ff
	dec bc
	ld a,b
	or c
	jr nz,fillloop
	ret
lightposttall:
	.db %01111000
	.db %10001000
	.db %10011100
	.db %10001000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
lightpostshort:
	.db %01110000
	.db %10010000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
	.db %10000000
RoadStripe:
	.db %11000000
	.db %11000000
	.db %11000000
	.db %00000000
	.db %00000000
	.db %00000000
	.db %11000000
	.db %11000000
	.db %11000000
	.db %00000000
	.db %00000000
	.db %00000000
	.db %11000000
	.db %11000000
	.db %11000000
	.db %00000000
	.db %00000000
	.db %00000000
	.db %11000000
	.db %11000000
	.db %11000000
	.db %00000000
	.db %00000000
	.db %00000000
	.db %11000000
	.db %11000000
	.db %11000000
FlyStripe:
	.db %10000000
	.db %10000000
	.db %00000000
	.db %00000000
	.db %10000000
	.db %10000000
	.db %00000000
	.db %00000000
	.db %10000000
	.db %10000000
	.db %00000000
	.db %00000000
	.db %10000000
	.db %10000000
	.db %00000000
	.db %00000000
	.db %10000000
	.db %10000000
tunnel:
	.db %01111111,%11111111,%111111111,%11111110
	.db %11111111,%11111111,%111111111,%11111111
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11000000,%00000000,%000000000,%00000011
	.db %11111111,%11111111,%111111111,%11111111
	.db %01111111,%11111111,%111111111,%11111110
Car:
	.db %00000111,%11100000
	.db %00011000,%00011000
	.db %01100111,%11100110
	.db %10000000,%00000001
	.db %10111111,%11111101
	.db %01000000,%00000011
	.db %00100011,%11000100
	.db %00011100,%00111000


flyingbground:
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$40,$00
 .db $00,$0A,$00,$00,$00,$00,$00,$00,$00,$0A,$A8,$00
 .db $15,$55,$00,$00,$00,$00,$00,$00,$00,$15,$55,$00
 .db $2A,$AA,$00,$00,$00,$00,$00,$00,$00,$00,$28,$00
 .db $15,$50,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $02,$A0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
 .db $00,$00,$00,$00,$01,$00,$40,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$01,$00,$40,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$01,$00,$40,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$01,$00,$40,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$01,$00,$20,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$02,$00,$20,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$02,$00,$20,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$02,$00,$20,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$02,$00,$20,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$02,$00,$20,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$02,$00,$10,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$04,$00,$10,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$04,$00,$10,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$04,$00,$10,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$04,$00,$10,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$04,$00,$10,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$0C,$00,$08,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$08,$00,$08,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$08,$00,$08,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$08,$00,$08,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$08,$00,$08,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$08,$00,$0C,$00,$00,$00,$00,$00
 .db $00,$00,$00,$00,$10,$00,$04,$00,$00,$00,$00,$00
background:
 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$10,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$28,$00,$00,$00,$00,$00,$00,$00,$00
 .db $00,$00,$00,$44,$00,$00,$00,$00,$00,$00,$2A,$00
 .db $00,$00,$00,$82,$00,$00,$00,$00,$00,$15,$55,$40
 .db $00,$00,$01,$FF,$00,$00,$00,$00,$00,$02,$A2,$00
 .db $00,$08,$01,$55,$10,$00,$3F,$00,$00,$00,$00,$00
 .db $00,$14,$01,$FF,$28,$00,$2D,$00,$00,$00,$00,$00
 .db $00,$AA,$01,$55,$44,$00,$3F,$00,$00,$00,$00,$00
 .db $01,$55,$41,$FF,$82,$00,$2D,$00,$00,$00,$00,$00
 .db $0A,$AA,$81,$55,$FF,$00,$3F,$00,$00,$FF,$80,$00
 .db $00,$00,$09,$FF,$55,$00,$2D,$FF,$00,$AA,$80,$00
 .db $00,$00,$15,$55,$FF,$00,$3F,$55,$02,$FF,$83,$FE
 .db $00,$00,$23,$FF,$55,$00,$2D,$FF,$05,$AA,$83,$FE
 .db $00,$00,$7F,$55,$FF,$1F,$FF,$55,$0F,$FF,$82,$AA
 .db $00,$00,$55,$FF,$FF,$15,$6D,$FF,$0A,$AA,$FF,$FE
 .db $00,$00,$7F,$55,$55,$1A,$BF,$55,$FD,$FF,$AA,$AA
 .db $7F,$00,$55,$FF,$FF,$15,$6D,$FF,$5A,$AA,$AB,$FE
 .db $55,$00,$7F,$55,$55,$FA,$BF,$55,$AD,$FF,$FE,$AA
 .db $6B,$0F,$D5,$FF,$FF,$55,$6D,$FF,$5A,$AA,$AB,$FE
 .db $55,$0A,$FF,$55,$55,$FA,$BF,$55,$AD,$FF,$FE,$AA
 .db $6B,$0D,$55,$FF,$FF,$55,$6D,$FF,$5A,$AA,$AB,$FE
 .db $55,$FA,$FF,$55,$55,$FA,$BF,$55,$AD,$FF,$FE,$AA
 .db $6B,$5D,$55,$FF,$FF,$55,$6D,$FF,$5A,$AA,$AB,$FE
 .db $55,$FA,$FF,$55,$55,$FA,$BF,$55,$AD,$FF,$FE,$AA
 .db $6B,$5D,$55,$FF,$FF,$55,$6D,$FF,$5A,$AA,$AB,$FE
 .db $55,$FA,$FF,$55,$55,$FA,$BF,$55,$AD,$FF,$FE,$AA
 .db $6B,$5D,$55,$FF,$FF,$55,$6D,$FF,$5A,$AA,$AB,$FE
 .db $55,$FA,$FF,$55,$55,$FA,$BF,$55,$AD,$FF,$FE,$AA
 .db $6B,$5D,$55,$FF,$FF,$55,$6D,$FF,$5A,$AA,$AB,$FE
 .db $55,$FA,$FF,$55,$55,$FA,$BF,$55,$AD,$FF,$FE,$AA
 .db $6B,$5D,$55,$FF,$FF,$55,$6D,$FF,$5A,$AA,$AB,$FE
 .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
 .db $00,$00,$00,$00,$00,$80,$00,$80,$00,$00,$00,$00
 .db $00,$00,$00,$00,$01,$00,$00,$40,$00,$00,$00,$00
 .db $00,$00,$00,$00,$02,$00,$00,$20,$00,$00,$00,$00
 .db $00,$00,$00,$00,$04,$00,$00,$10,$00,$00,$00,$00
 .db $00,$00,$00,$00,$08,$00,$00,$08,$00,$00,$00,$00
 .db $00,$00,$00,$00,$10,$00,$00,$04,$00,$00,$00,$00
 .db $00,$00,$00,$00,$20,$00,$00,$02,$00,$00,$00,$00
 .db $00,$00,$00,$00,$40,$00,$00,$01,$00,$00,$00,$00
 .db $00,$00,$00,$00,$80,$00,$00,$00,$80,$00,$00,$00
 .db $00,$00,$00,$01,$00,$00,$00,$00,$40,$00,$00,$00
 .db $00,$00,$00,$02,$00,$00,$00,$00,$20,$00,$00,$00
 .db $00,$00,$00,$04,$00,$00,$00,$00,$10,$00,$00,$00
 .db $00,$00,$00,$08,$00,$00,$00,$00,$08,$00,$00,$00
 .db $00,$00,$00,$10,$00,$00,$00,$00,$04,$00,$00,$00
 .db $00,$00,$00,$20,$00,$00,$00,$00,$02,$00,$00,$00
 .db $00,$00,$00,$40,$00,$00,$00,$00,$01,$00,$00,$00
 .db $00,$00,$00,$80,$00,$00,$00,$00,$00,$80,$00,$00
 .db $00,$00,$01,$00,$00,$00,$00,$00,$00,$40,$00,$00
 .db $00,$00,$02,$00,$00,$00,$00,$00,$00,$20,$00,$00
 .db $00,$00,$04,$00,$00,$00,$00,$00,$00,$10,$00,$00
 .db $00,$00,$08,$00,$00,$00,$00,$00,$00,$08,$00,$00
 .db $00,$00,$10,$00,$00,$00,$00,$00,$00,$04,$00,$00
 .db $00,$00,$20,$00,$00,$00,$00,$00,$00,$02,$00,$00
 .db $00,$00,$40,$00,$00,$00,$00,$00,$00,$01,$00,$00
 .db $00,$00,$80,$00,$00,$00,$00,$00,$00,$00,$80,$00
 .db $00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$40,$00
 .db $00,$02,$00,$00,$00,$00,$00,$00,$00,$00,$20,$00
 .db $00,$04,$00,$00,$00,$00,$00,$00,$00,$00,$10,$00
 .db $00,$08,$00,$00,$00,$00,$00,$00,$00,$00,$08,$00
 .db $00,$10,$00,$00,$00,$00,$00,$00,$00,$00,$04,$00
 .db $00,$20,$00,$00,$00,$00,$00,$00,$00,$00,$02,$00
.end

