#include "ti83plus.inc"
#include "mirage.inc"
.org $9D93
#define shields appbackupscreen
#define photons shields+1
#define phasers photons+1
#define score phasers+1
#define enemyx score+2
#define enemyy enemyx+1
#define counter enemyy+1
#define currentenemy counter+1
#define enemyshields currentenemy+1
	.db $BB,$6D
	ret
	.db 1
button:
	.db %10000000, %00000000
	.db %00000000, %00010010
	.db %00100001, %00000000
	.db %00000000, %00001000
	.db %00000000, %00000000
	.db %00010010, %00000000
	.db %00000000, %01001000
	.db %00000000, %00000000
	.db %01001000, %00000000
	.db %00000000, %00100000
	.db %00000000, %00000000
	.db %00000001, %00000000
	.db %00000000, %00000010
	.db %00010000, %00000000
	.db %00000001, %00100000
desc:
	.db "Starship Commando",0
	set fullscrndraw,(iy+apiflg4)
	set textwrite,(iy+sgrflags)
	set textInverse,(iy+textflags)
	bcall(_clrlcdfull)
	bcall(_grbufclr)
	ld hl,0
	ld (score),hl
	ld a,1
	ld (currentenemy),a
	ld a,100
	ld (shields),a
	ld (phasers),a
	ld a,20
	ld (photons),a
	ld hl,plotsscreen+(46*12)
	ld b,192+12+12
	ld a,$ff
fillrect:
	ld (hl),a
	inc hl
	djnz fillrect
	ld a,95
	ld e,46
	call pixeloff
	xor a
	ld e,46
	call pixeloff
Starfield:
	ld b,70
rndstarloop:
	push bc
	ld b,46
	call irandom
	ld e,a
	ld b,96
	call irandom
	call setpixel
	pop bc
	djnz rndstarloop
	call UpdateConsole
	call RedisplayEnemy
GameLoop:
	ld a,$ff
	out (1),a
	ld a,$bf
	out (1),a
	in a,(1)
	cp 191	;Mode
	ret z
	cp 223	;2nd
	call z,FirePhasers
	ld a,$ff
	out (1),a
	ld a,$df
	out (1),a
	in a,(1)
	cp 127	;Alpha
	call z,FirePhotons
	jr GameLoop
	ret
FirePhotons:
	ret
FirePhasers:
	ld a,(phasers)
	cp 100
	jr nc,phasersgone
	ld b,10
	call irandom
	ld b,a
	ld a,(phasers)
	sub b
	ld (phasers),a
	ld a,(enemyshields)
	sub b
	ld (enemyshields),a
	cp 0	;Needed carry flags
	jr nc,enemystillthere
	ld a,(currentenemy)
	ld b,a
getnewenemyloop:
	push bc
	ld b,1
	call irandom
	inc a
	pop bc
	cp b
	jr z,getnewenemyloop
	ld (currentenemy),a
	ld a,100
	ld (enemyshields),a
	call RedisplayEnemy
enemystillthere:
	ld hl,48*256+40
	ld (pencol),hl
	ld a,(phasers)
	ld h,0
	ld l,a
	bcall(_setxxxxop2)
	bcall(_op2toop1)
	bcall(_dispop1a)
	jp ifastcopy
phasersgone:
	xor a
	ld (phasers),a
	jr enemystillthere
RedisplayEnemy:
	ld a,(currentenemy)
	dec a
	jr z,DispShip1
DispShip1:
	ld b,94-40
	call irandom
	ld (enemyx),a
	ld b,45-24
	call irandom
	ld (enemyy),a
	ld h,a
	add a,23
	ld d,a
	ld a,(enemyx)
	ld l,a
	add a,40
	ld e,a
	bcall(_clearrect)
	ld a,(enemyy)
	ld l,a
	ld a,(enemyx)
	ld c,5
	ld b,24
	ld ix,ship1
	call ilsprite
	jp ifastcopy
UpdateConsole:
	ld ix,YourShip
	ld b,10
	ld a,47
	ld l,a
	ld a,2
	call isprite
	ld hl,57*256+1
	ld (pencol),hl
	ld a,(shields)
	ld h,0
	ld l,a
	bcall(_setxxxxop2)
	bcall(_op2toop1)
	bcall(_dispop1a)
	ld hl,48*256+23
	ld (pencol),hl
	ld hl,phaserslabel
	bcall(_vputs)
	ld a,(phasers)
	ld h,0
	ld l,a
	bcall(_setxxxxop2)
	bcall(_op2toop1)
	bcall(_dispop1a)
	ld hl,55*256+23
	ld (pencol),hl
	ld hl,photonslabel
	bcall(_vputs)
	ld a,(photons)
	ld h,0
	ld l,a
	bcall(_setxxxxop2)
	bcall(_op2toop1)
	bcall(_dispop1a)
	ret
YourShip:
	.db %00011000
	.db %00111100
	.db %01111110
	.db %01111110
	.db %00111100
	.db %00011000
	.db %01111110
	.db %01000010
	.db %01000010
	.db %01000010
phaserslabel:
	.db "Phasers: ",0
photonslabel:
	.db "Photons: ",0
ship1:
	.db %00000000,%00000000,%00000011,%10000000,%00000000
	.db %00000000,%00000000,%00001111,%11000000,%00000000
	.db %00000000,%00001110,%00011111,%10100000,%00000000
	.db %00000000,%00011110,%00111111,%01100000,%00000000
	.db %00000000,%00111100,%01111110,%10100000,%00000000
	.db %00000000,%01111000,%11111101,%01000000,%00000000
	.db %00000000,%11110001,%11111010,%11000000,%00000000
	.db %00000001,%11101011,%11110101,%10000000,%00000000
	.db %00000011,%11000111,%11101011,%00000000,%00000000
	.db %00000111,%10001111,%11010110,%00000000,%01110000
	.db %00001111,%00011111,%10101100,%00000000,%11110000
	.db %00011110,%00111111,%01011111,%11111111,%11100000
	.db %00111101,%01111110,%10110000,%00000011,%11000000
	.db %01111000,%11111101,%01100000,%00000111,%10000000
	.db %11110001,%11111010,%11000000,%00001111,%00000000
	.db %00000011,%11110101,%11111111,%11111110,%00000000
	.db %00000111,%11101011,%00000000,%00111100,%00000000
	.db %00001111,%11010110,%00000000,%01111000,%00000000
	.db %00001111,%10101100,%00000000,%11110000,%00000000
	.db %00011111,%11011000,%00000001,%11100000,%00000000
	.db %00011111,%10110000,%00000011,%11000000,%00000000
	.db %00011111,%11100000,%00000111,%10000000,%00000000
	.db %00011111,%11000000,%00000000,%00000000,%00000000
	.db %00001111,%00000000,%00000000,%00000000,%00000000
.end

