;========================================================
;=========       Starship Commander v 1.2       =========
;=========           by Andreas Doktar          =========
;=========               02-08-1999             =========
;=========       Ion Port by John Wyrwas        ========= 
;=========      Mirage Port by John Wyrwas      =========
;========================================================
;Do NOT make any changes to this code and distribute it !
;But feel free to send comments, ideas and fixes to
; andoktar@pp.qnet.fi

#include	"ti83plus.inc"			;Standard TI-83 Plus include file
#include        "mirage.inc"			;Mirage include file
	.org $9d93				;Origin
	.db $BB,$6D				;Compiled AsmPrgm token
	ret						;Header Byte 1 -- So TIOS wont run
	.db	1					;Header Byte 2 -- Identifies as MirageOS prog
button:						;Button - should be a 15x15 graphic
        .db     %00000000,%00000000
        .db     %00111110,%00111110
        .db     %01100000,%01000000
        .db     %01000000,%10000000
        .db     %00100000,%10000000
        .db     %00011000,%10000000
        .db     %00000100,%10000000
        .db     %00000100,%10000000
        .db     %00001100,%11000000
        .db     %11110000,%01111110
        .db     %00000011,%00000000
        .db     %00000000,%11110000
        .db     %00001011,%11011000
        .db     %00000000,%11110000
        .db     %00000011,%00000000
desc:						;Description - zero terminated
        .db "Starship Commander",0

progstart:					;Program code starts here


prog_start:
        bcall(_IndicatorOff)      ;_runIndicOff
        bcall(_cleargbuf)      ;_GRBUFCLR
	bcall(_clrLCDFULL)
        ld hl,title 
        ld de,plotsscreen
        ld bc,274          ;bytes to paint  (Y*X)/8
        ldir
        call subTRANS2
lblSTART:
	ld a,10
	ld (varX2),a
	ld a,16
	ld (varX5),a
	xor a
	ld (varLEVEL),a
	ld (varTEMP),a
	
lblSTARTLOOP:
        
        ld hl,title
        ld de,plotsscreen
        ld bc,274          ;bytes to paint  (Y*X)/8
        ldir
	ld de,0
for1:
	ld hl,1500
	or a
	sbc hl,de
	jr z,next1
	inc de
	jr for1
next1:
	ld a,(varX2)	; x-axis of own ship
	ld c,a
	push bc
	inc a
	ld (varX2),a	; move ship right to next time
	ld c,48		; y-axis
	push bc
	ld hl,lblSHIP
	push hl
	call subSPRITEXOR
	
	ld a,(varX5)	; x-axis fire
	ld c,a
	push bc
	add a,2		; move
	ld (varX5),a
	ld c,48		; y-axis
	push bc
	ld hl,lblFIRE
	push hl
	call subSPRITEXOR
	ld c,68
	push bc
	ld c,48
	push bc
	ld hl,lblALIEN
	push hl
	call subSPRITEXOR
	ld a,(varX5)
	cp 72
	jr nz,else1
	jr lblENDINTRO
else1:
	call subTRANS1
        bcall(_cleargbuf)      ;_GRBUFCLR
	jr lblSTARTLOOP
lblENDINTRO:
	call lblTEXT
waitforkey:
	call lblINPUT
	ld a,(varTEMP)
	cp 251
	jr nz,waitforkey
	jp lblQUIT

lblGAMESTART:
	xor a
	ld (varSCORE),a
	ld a,3
	ld (varLIVES),a
lblLEVEL1START:
	ld a,1
	ld (varLEVEL),a
	ld hl,700
	ld (varALIENSPEED),hl
	ld a,90
	ld (varX1),a
	ld a,5
	ld (varY1),a
	ld (varX2),a
	ld a,28
	ld (varY2),a
	ld (varY3),a	
	ld a,60
	ld (varX3),a
	ld a,20
	ld (varX4),a
	ld a,40
	ld (varY4),a
	ld a,43
	ld (varY5),a
	ld a,70
	ld (varX5),a
	call lblLEVELCHANGE
lblLOOP:
        bcall(_cleargbuf)      ;_GRBUFCLR
	ld a,(varX1)
	ld c,a
	push bc
	ld a,(varY1)
	ld c,a
	push bc
	ld hl,lblALIEN
	push hl
	call subSPRITEXOR
	ld a,(varX3)
	ld c,a
	push bc
	ld a,(varY3)
	ld c,a
	push bc
	ld hl,lblALIEN
	push hl
	call subSPRITEXOR
	ld a,(varX4)
	ld c,a
	push bc
	ld a,(varY4)
	ld c,a
	push bc
	ld hl,lblALIEN
	push hl
	call subSPRITEXOR
	ld a,(varX5)
	ld c,a
	push bc
	ld a,(varY5)
	ld c,a
	push bc
	ld hl,lblDIAMOND
	push hl
	call subSPRITEXOR
	ld a,(varX2)
	ld c,a
	push bc
	ld a,(varY2)
	ld c,a
	push bc
	ld hl,lblSHIP
	push hl
	call subSPRITEXOR
	call subTRANS1
	call lblINPUT
	ld a,(varTEMP)
	cp 251
	jp z,lblQUIT
	ld a,(varTEMP)
	cp 250
	jr nz,else4
	call lblPAUSE
	call lblVIEWSCORE
else4:
	ld a,(varX1)
	sub 2
	ld (varX1),a
	ld a,(varX3)
	sub 2
	ld (varX3),a
	ld a,(varX4)
	sub 2
	ld (varX4),a
	ld a,(varX5)
	dec a
	ld (varX5),a
	ld a,(varX1)
	cp 2
	jr nc,else5
	ld a,90
	ld (varX1),a
	call lblRANDOM
	ld a,(varTEMP)
	ld (varY1),a
else5:
	ld a,(varX3)
	cp 2
	jr nc,else6
	ld a,90
	ld (varX3),a
	call lblRANDOM
	ld a,(varTEMP)
	ld (varY3),a
else6:
	ld a,(varX4)
	cp 2
	jr nc,else7
	ld a,90
	ld (varX4),a
	call lblRANDOM
	ld a,(varTEMP)
	ld (varY4),a
else7:
	ld a,(varX5)
	cp 2
	jr nc,else8
	ld a,90
	ld (varX5),a
	call lblRANDOM
	ld a,(varTEMP)
	ld (varY5),a
else8:
	ld a,(varY1)
	add a,4
	ld (varTEMP),a
	ld a,(varX2)
	add a,4
	ld (varTEMP2),a
	ld a,(varY1)
	ld b,a
	ld a,(varY2)
	add a,4
	ld (varTEMP3),a
	cp b
	jr c,else9
	jr z,else9
	ld a,(varTEMP)
	ld b,a
	ld a,(varY2)
	cp b
	jr nc,else10
	ld a,(varX1)
	ld b,a
	ld a,(varTEMP2)
	cp b
	jr c,else11
	jr z,else11
	jp lblSLUT
else11:
else10:
else9:
	ld a,(varY3)
	add a,7
	ld (varTEMP),a
	ld a,(varY3)
	ld b,a
	ld a,(varTEMP3)
	cp b
	jr c,else12
	jr z,else12
	ld a,(varTEMP)
	ld b,a
	ld a,(varY2)
	cp b
	jr nc,else13
	ld a,(varX3)
	ld b,a
	ld a,(varTEMP2)
	cp b
	jr c,else14
	jr z,else14
	jp lblSLUT
else14:
else13:
else12:
	ld a,(varY4)
	add a,7
	ld (varTEMP),a
	ld a,(varY4)
	ld b,a
	ld a,(varTEMP3)
	cp b
	jr c,else15
	jr z,else15
	ld a,(varTEMP)
	ld b,a
	ld a,(varY2)
	cp b
	jr nc,else16
	ld a,(varX4)
	ld b,a
	ld a,(varTEMP2)
	cp b
	jr c,else17
	jr z,else17
	jp lblSLUT
else17:
else16:
else15:
	ld a,(varY5)
	add a,7
	ld (varTEMP),a
	ld a,(varY5)
	ld b,a
	ld a,(varTEMP3)
	cp b
	jp c,else18
	jp z,else18
	ld a,(varTEMP)
	ld b,a
	ld a,(varY2)
	cp b
	jp nc,else19
	ld a,(varX5)
	ld b,a
	ld a,(varTEMP2)
	cp b
	jr c,else20
	jp z,else20
	ld a,90
	ld (varX5),a
	ld a,(varY1)
	ld (varY5),a
	ld a,(varSCORE)
	inc a
	ld (varSCORE),a
	cp 7
	jr nz,else21
	ld hl,150
	ld (varALIENSPEED),hl
else21:
	cp 14
	jr nz,else22
	ld hl,30
	ld (varALIENSPEED),hl
else22:
	cp 20
	jr nz,else23
	ld hl,50
	ld (varALIENSPEED),hl
	jp lblLEVEL2START
else23:
else20:
else19:
else18:
	ld de,0
for2:
	ld hl,(varALIENSPEED)
	or a
	sbc hl,de
	jp z,lblLOOP
	inc de
	jr for2

lblLEVEL2START:
	ld a,2
	ld (varLEVEL),a
	call lblLEVELCHANGE
	ld a,88
	ld (varX1),a
	ld a,28
	ld (varY2),a
	ld a,24
	ld (varY3),a
lblLEVEL2:
        bcall(_cleargbuf)      ;_GRBUFCLR
	xor a
	ld (varY1),a
	ld (varTEMP),a
for3:
	ld a,(varX1)
	ld c,a
	push bc
	ld a,(varY1)
	ld c,a
	push bc
	ld hl,lblBRICK
	push hl
	call subSPRITEXOR
	ld a,(varY1)
	add a,8
	ld (varY1),a
	ld a,(varTEMP)
	cp 7
	jr z,next3
	inc a
	ld (varTEMP),a
	jr for3
next3:
	ld a,(varY3)
	ld (varY1),a
	xor a
	ld (varTEMP), a
for4:
	ld a,(varX1)
	ld c,a
	push bc
	ld a,(varY1)
	ld c,a
	push bc
	ld hl,lblBRICK
	push hl
	call subSPRITEXOR
	ld a,(varY1)
	add a,8
	ld (varY1),a
	ld a,(varTEMP)
	cp 1
	jr z,next4
	inc a
	ld (varTEMP),a
	jr for4
next4:
	ld a,(varX2)
	ld c,a
	push bc
	ld a,(varY2)
	ld c,a
	push bc
	ld hl,lblSHIP
	push hl
	call subSPRITEXOR
	call subTRANS1
	call lblINPUT
	ld a,(varTEMP)
	cp 251
	jr nz,else24
	jp lblQUIT
else24:
	ld a,(varTEMP)
	cp 250
	jr nz,else25
	call lblPAUSE
	call lblVIEWSCORE
else25:
	ld a,(varX1)
	sub 2
	ld (varX1),a
	ld a,(varX1)
	and a
	jr nz,else26
	ld a,(varSCORE)
	inc a
	ld (varSCORE),a
	ld a,90
	ld (varX1),a
	call lblRANDOM
	ld a,(varTEMP)
	ld c,a
	push bc
	ld c,8
	push bc
	call subBYTEDIV
	ld a,(RESULT)
	ld (varY3),a
	ld c,a
	push bc
	ld a,8
	ld c,a
	push bc
	call subMUL
	ld bc,(RESULT)
	ld a,c
	ld (varY3),a
	ld a,(varY3)
	and a
	jr nz,else27
	ld a,8
	ld (varY3),a
else27:
	ld a,(varSCORE)
	cp 30
	jr nz,else28
	ld hl,0
	ld (varALIENSPEED),hl
else28:
	ld a,(varSCORE)
	cp 40
	jr nz,else29
	jp lblLEVEL3START
else29:
else26:
	ld a,(varY1)
	sub 17
	ld (varTEMP),a
	ld a,(varY1)
	sub 8
	ld (varTEMP2),a
	ld a,(varX1)
	cp 10
	jr nc,else30
	ld a,(varTEMP)
	ld b,a
	ld a,(varY2)
	cp b
	jr nc,else31
	jp lblSLUT
else31:
	ld a,(varTEMP2)
	ld b,a
	ld a,(varY2)
	cp b
	jr c,else32
	jr z,else32
	jp lblSLUT
else32:
else30:
	ld de,0
for5:
	ld hl,(varALIENSPEED)
	or a
	sbc hl,de
	jp z,lblLEVEL2
	inc de
	jr for5
 
lblLEVEL3START:
	ld a,3
	ld (varLEVEL),a
	call lblLEVELCHANGE
	ld hl,500
	ld (varALIENSPEED),hl
	ld a,28
	ld (varY2),a
	ld a,13
	ld (varX5),a
	ld a,24
	ld (varY1),a
	ld a,88
	ld (varX1),a
	ld (varTEMP3),a
lblLEVEL3:
        bcall(_cleargbuf)
	ld hl,0
	ld (varDELAY), hl
for6:
	ld hl,(varALIENSPEED)
	ld de,(varDELAY)
	or a
	sbc hl,de
	jr z,next6
	inc de
	ld (varDELAY),de
	jr for6
next6:
	ld a,(varX2)
	ld c,a
	push bc
	ld a,(varY2)
	ld c,a
	push bc
	ld hl,lblSHIP
	push hl
	call subSPRITEXOR
	ld a,(varX1)
	ld c,a
	push bc
	ld a,(varY1)
	ld c,a
	push bc
	ld hl,lblMETOR
	push hl
	call subSPRITEXOR
	ld a,(varTEMP3)
	and a
	jr nz,else33
	ld a,(varX5)
	ld c,a
	push bc
	inc a
	ld (varX5),a
	ld a,(varY5)
	ld c,a
	push bc
	ld hl,lblFIRE
	push hl
	call subSPRITEXOR
else33:
	call subTRANS1
	call lblINPUT
	ld a,(varTEMP)
	cp 251
	jr nz,else34
	jp lblQUIT
else34:
	ld a,(varTEMP)
	cp 250
	jr nz,else35
	call lblPAUSE
	call lblVIEWSCORE
else35:
	ld a,(varX5)
	cp 88
	jr nz,else37
	ld c,a
	push bc
	ld a,(varY5)
	ld c,a
	push bc
	ld hl,lblFIRE
	push hl
	call subSPRITEXOR
	ld a,13
	ld (varTEMP3),a
	ld (varX5),a
else37:
	ld a,(varY1)
	sub 4
	ld (varY1),a
	add a,8
	ld (varTEMP),a
	ld a,(varX1)
	ld b,a
	ld a,(varX5)
	cp b
	jr c,else38
	jr z,else38
	ld a,(varY1)
	ld b,a
	ld a,(varY5)
	cp b
	jr c,else39
	jr z,else39
	ld a,(varTEMP)
	ld b,a
	ld a,(varY5)
	cp b
	jr nc,else40
	ld a,90
	ld (varX1),a
	call lblRANDOM
	ld a,(varTEMP)
	ld (varY1),a
	ld a,(varSCORE)
	inc a
	ld (varSCORE),a
else40:
else39:
else38:
	ld a,(varY1)
	add a,4
	ld (varY1),a
	ld a,(varTEMP2)
	cp 1
	jr z,else41
	ld a,(varX1)
	dec a
	ld (varX1),a
	ld a,(varX1)
	and a
	jr nz,else42
	jp lblSLUT
else42:
else41:
	ld a,(varY1)
	add a,4
	ld (varTEMP),a
	ld a,(varY2)
	add a,4
	ld (varTEMP2),a
	ld a,(varY1)
	ld b,a
	ld a,(varTEMP2)
	cp b
	jr c,else43
	jr z,else43
	ld a,(varTEMP)
	ld b,a
	ld a,(varY2)
	cp b
	jr nc,else44
	ld a,(varX1)
	cp 14
	jr nc,else45
	jp lblSLUT
else45:
else44:
else43:
	ld a,(varSCORE)
	cp 50
	jr nz,else46
	ld hl,20
	ld (varALIENSPEED),hl
else46:
	ld a,(varSCORE)
	cp 60
	jp nz,lblLEVEL3
	call lblSUCCESS
	call lblVIEWSCORE
	jp lblSTART
lblINPUT:
        ld a,0ffh       ;reset keyport
        out (1),a
        ld a,0fdh       ;pick key group
        out (1),a
        in a,(1)
	ld (varKEY),a
	ld a,(varKEY)
	cp 191
	jr nz,else48
	ld a,251
	ld (varTEMP),a
else48:
	ld a,(varLEVEL)
	and a
	jr z,else49
        ld a,0ffh       ;reset keyport
        out (1),a
        ld a,0feh       ;pick key group
        out (1),a
        in a,(1)
	ld (varKEY),a
	ld a,(varKEY)
	cp 254
	jr nz,else50
	ld a,(varY2)
	cp 56
	jr nc,else51
	add a,2
	ld (varY2),a
else51:
else50:
	ld a,(varKEY)
	cp 247
	jr nz,else52
	ld a,(varY2)
	and a
	jr c,else53
	jr z,else53
	sub 2
	ld (varY2),a
else53:
else52:
        ld a,0ffh       ;reset keyport
        out (1),a
        ld a,0bfh       ;pick key group
        out (1),a
        in a,(1)
	ld (varKEY),a
	ld a,(varKEY)
	cp 191
	jr nz,else54
	ld a,250
	ld (varTEMP),a
else54:
else49:
        ld a,0ffh       ;reset keyport
        out (1),a
        ld a,0bfh       ;pick key group
        out (1),a
        in a,(1)
	ld (varKEY),a
	ld a,(varKEY)
	cp 223
	jr nz,else55
	ld a,(varLEVEL)
	cp 3
	jr nz,else56
	xor a
	ld (varTEMP3),a
	ld a,(varY2)
	ld (varY5),a
	ld a,13
	ld (varX5),a
else56:
	ld a,(varLEVEL)
	and a
	jr nz,else57
	jp lblGAMESTART
else57:
else55:
	ret
lblRANDOM:
        ld      b,56    ; alienarna kan komma mellan 0 -> 56 
rand:	push	hl
	push	de
	ld	hl,(varTEMP)
	ld	a,r
	ld	d,a
	ld	e,(hl)
	add	hl,de
	add	a,l
	xor	h
	ld	(varTEMP),hl
	ld	hl,0
	ld	e,a
	ld	d,h
randl:	add	hl,de
	djnz	randl
	ld	a,h
	pop	de
	pop	hl
        ld      (varTEMP),a
	ret
lblBALLE:
            ld    hl,001Eh
            ld    (PENCOL),hl
            ld    hl,0017h
            ld    (PENROW),hl
            ld    a,(varLIVES)
            and	  a
            jr    nz,died
	    ld    hl,strgameover	    
            jr    print_ut
died:
            ld    hl,stryoudied            
print_ut:
            bcall(_vputs)
	ret
lblSUCCESS:
            ld    hl,001Eh
            ld    (PENCOL),hl
            ld    hl,0017h
            ld    (PENROW),hl
            ld    hl,strsuccess
            bcall(_vputs)
strsuccess:
            .db "Success",0

	ret
lblLEVELCHANGE:
        bcall(_clrLCDFULL)
            ld    hl,0020h
            ld    (PENCOL),hl
            ld    hl,0019h
            ld    (PENROW),hl
            ld    hl,strlevelchange
            bcall(_vputs)
            ld    a,(varLEVEL)
            bcall(_setxxop1)
            ld    a,2
            bcall(_dispop1a)
strlevelchange:
            .db "Level",0

	ld de,0
for7:
	ld hl,65000
	or a
	sbc hl,de
	jr z,next7
	inc de
	jr for7
next7:
	ret
lblPAUSE:
            ld    hl,0022h
            ld    (PENCOL),hl
            ld    hl,0017h
            ld    (PENROW),hl
            ld    hl,strpause
            bcall(_vputs)
strpause:
            .db "Paused",0

	ret
lblVIEWSCORE:
            ld    hl,0020h
            ld    (PENCOL),hl
            ld    hl,001Dh
            ld    (PENROW),hl
            ld    hl,strscore
            bcall(_vputs)
            ld    a,(varSCORE)
            bcall(_setxxop1)
            ld    a,2
            bcall(_dispop1a)
            ld    hl,0022h
            ld    (PENCOL),hl
            ld    hl,0023h
            ld    (PENROW),hl
            ld    hl,strlives
            bcall(_vputs)
            ld    a,(varLIVES)
            bcall(_setxxop1)
            ld    a,1
            bcall(_dispop1a)
strscore:
            .db "Score:",0
strlives:
            .db "Lives:",0

	ld de,0
for8:
	ld hl,65000
	or a
	sbc hl,de
	jr z,next8
	inc de
	jr for8
next8:
        bcall(_getkey)
	ld (varKEY),a
	ret
lblSLUT:
    ld     a,(varLIVES)
    dec    a
    ld    (varLIVES),a
	call lblBALLE
	call lblVIEWSCORE
        ld a,(varLIVES)
        and a
        jp z,lblSTART
        ld a,(varLEVEL)
        cp 1
        jp z,lblLEVEL1START
        cp 2
        jp z,lblLEVEL2START
        cp 3
        jp z,lblLEVEL3START

lblQUIT:
        bcall(_cleargbuf)
	call subTRANS1
	ret
lblTEXT:
            ld    hl,23
            ld    (PENCOL),hl
            ld    hl,25
            ld    (PENROW),hl
            ld    hl,strad
            bcall(_vputs)
            ld    hl,10
            ld    (PENCOL),hl
            ld    hl,32
            ld    (PENROW),hl
            ld    hl,stradweb
            bcall(_vputs)

            ld    hl,9
            ld    (PENCOL),hl
            ld    hl,39
            ld    (PENROW),hl
            ld    hl,strport
            bcall(_vputs)

            ld    hl,33
            ld    (PENCOL),hl
            ld    hl,57
            ld    (PENROW),hl
            ld    hl,strpress
            bcall(_vputs)
            ld    hl,80
            ld    (PENCOL),hl
            ld    hl,1
            ld    (PENROW),hl
            ld    hl,strver
            bcall(_vputs)
	ret
lblALIEN:
    .db 20,63,120,206,120,63,20,0
lblSHIP:
    .db 128,200,236,127,127,236,200,128
lblSHIP2:
    .db 1,19,55,254,254,55,19,1
lblDIAMOND:
    .db 0,24,60,102,102,60,24,0
lblBRICK:
    .db 253,253,253,0,223,223,223,0
lblFIRE:
    .db 0,0,48,24,24,48,0,0
lblMETOR:
    .db 32,123,254,244,249,254,121,32

title:
   .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127
   .db 0,0,1,0,0,0,0,0,0,0,0,65,0,0,1,4
   .db 0,0,0,0,0,0,0,65,64,0,1,0,0,0,0,0
   .db 0,0,0,64,247,222,249,244,124,0,0,0,0,0,0,127
   .db 112,82,137,148,68,0,0,0,0,0,0,7,71,208,129,148
   .db 68,0,0,0,0,0,0,7,70,88,249,150,68,0,0,0
   .db 0,0,0,71,70,88,25,150,68,0,0,0,0,0,0,71
   .db 70,88,153,150,68,0,0,0,0,0,0,127,119,216,249,150
   .db 124,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0
   .db 0,0,0,0,0,0,0,0,96,0,0,0,0,1,254,0
  .db 0,0,0,0,104,0,0,0,0,1,14,0,0,0,0,0
   .db 104,0,0,0,0,1,14,0,0,0,0,0,8,0,0,0
   .db 0,1,14,252,255,63,223,125,251,247,128,0,0,1,0,132
   .db 137,34,65,69,139,20,128,0,0,1,2,132,137,34,95,69
   .db 139,20,0,0,0,1,2,132,201,50,89,101,139,246,0,0
   .db 0,1,2,132,201,50,89,101,139,6,0,0,0,1,2,132
   .db 201,50,89,101,139,22,0,0,0,1,254,252,201,50,95,101
   .db 251,246
stryoudied:
            .db "You died",0
strgameover:
            .db "Game Over",0
strad:
            .db " ",0
stradweb:
            .db " ",0
strport:
		.db "         by John Wyrwas",0
strpress:
            .db "Press 2nd",0
strver:
            .db "v1.2",0
Description:
            .db "Starship Commander 1.2",0
	ret
subTRANS1:
    LD HL,plotsscreen
    LD A,7
    CALL Trans1_LCDBusy
    OUT ($10),A     ; Send 00000111 to LCD : select row number
    LD A,128        ; Goto the top
Trans1_LineLoop:
    LD D,A          ; Save currect row
    CALL Trans1_LCDBusy
    OUT ($10),A
    LD A,32         ; Goto left
    CALL Trans1_LCDBusy
    OUT ($10),A
    LD BC,$0C11         ;B = 12, C = 17
Trans1_WriteLoop:       ;768 bytes to port 17    
    NEG
    NEG
    NEG
    NEG
    OUTI
    JR NZ,Trans1_WriteLoop
    LD A,D
    INC A
    CP 192
    JR NZ,Trans1_LineLoop
    RET
Trans1_LCDBusy:
    PUSH    AF   ;This is the TI made procedure
    INC     HL   ;it makes a small pause before
    DEC     HL   ;writing to the LCD
    POP     AF
    RET
subTRANS2:
    LD B,0         ; Frame # (0 out of 63)
Trans2_ScreenLoop:
    LD HL,plotsscreen
    LD A,7
    CALL Trans2_LCDBusy
    OUT ($10),A     ; Send 00000111 to LCD : select row number
    LD A,191        ; Calculate start row
    SUB B    
    PUSH BC         ; Save frame #
Trans2_LineLoop:
    LD D,A          ; Save currect row
    CALL Trans2_LCDBusy
    OUT ($10),A
    LD A,32         ; Goto left
    CALL Trans2_LCDBusy
    OUT ($10),A
    LD BC,$0C11         ;B = 12, C = 17
Trans2_WriteLoop:       ;768 bytes to port 17    
    NEG
    NEG
    NEG
    NEG
    OUTI
    JR NZ,Trans2_WriteLoop
    LD A,D
    INC A
    CP 192
    JR NZ,Trans2_LineLoop

    LD HL,0     ; Create a delay
    LD DE,0
    LD BC,2000
    LDIR
    
    POP BC
    INC B
    LD A,B
    CP 64
    JR NZ,Trans2_ScreenLoop
    RET
Trans2_LCDBusy:
    PUSH    AF   ;This is the TI made procedure
    INC     HL   ;it makes a small pause before
    DEC     HL   ;writing to the LCD
    POP     AF
    RET
subMUL:
        pop de          ;take code pointer off stack
        pop hl          ;put arg2 in l
        pop bc          ;put arg1 in c
        push de         ;return code pointer to stack
        ld e,l          ;copy l to e
        ld d,0
        ld hl,0         ;zero hl
        ld b,c          ;copy c to b
        xor a           ;zero accumulator
        cp b
        jp z,mul_done
mul_loop:        
        add hl,de       ;add arg1 to hl
        djnz mul_loop   ;loop b times
mul_done:
        ld (RESULT),hl  ;store result        
        ret
subBYTEDIV:
        pop de          ;take code pointer off stack
        pop bc          ;put arg2 in c
        pop hl          ;put arg1 in l
        push de         ;return code pointer to stack
        ld a,l          ;copy l to a
        ld b,255
div_loop:
        inc b
        sub c           ;subtract arg2 from a
        jp nc,div_loop  ;loop while a > 0
        ld a,b          ;copy b to a
        ld (RESULT),a   ;store result
        ret
subSPRITEXOR:
        pop ix          ;take code pointer off stack
        pop bc          ;put arg3 in bc
        pop de          ;put arg2 in e
        pop hl          ;put arg1 in l
        ld a,l          ;copy l to a
        push ix         ;return code pointer to stack
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ÛÛÛÛÛ Z80 ÛÛÛÛÛÛ³    Sprite83    ³ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ³ movax ³ÛÛÛÛÛÛÛÛÛÛÛÛ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÙ

; Sprite xor routine v1.0
; Coded by Hannes Edfeldt in 1997

; This routine uses xor to draw the sprite, therefore you can erase the sprite
; by just drawing it again at the same x and y coordinates. See xordemo.z80
; for an example of how to use this routine.

; Feel free to use this routine in your own productions as long as you give me
; some credit.
; This file should of course be viewed in a DOS texteditor ;)
; Hannes Edfeldt -+- movax@algonet.se -+- http://www.algonet.se/~movax

;ÜÛÛÛÛÛÛÛÛÛÛÛÛß SPRXOR ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Xor 8x8 sprite þ a=x, e=y, bc=sprite address                               ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
        push    bc              ; Save sprite address

;ÛÛÛÛ   Calculate the address in graphbuf   ÛÛÛÛ

        ld      hl,0            ; Do y*12
        ld      d,0
        add     hl,de
        add     hl,de
        add     hl,de
        add     hl,hl
        add     hl,hl

        ld      d,0             ; Do x/8
        ld      e,a
        srl     e
        srl     e
        srl     e
        add     hl,de

        ld      de,plotsscreen
        add     hl,de           ; Add address to graphbuf

        ld      b,00000111b     ; Get the remainder of x/8
        and     b
        cp      0               ; Is this sprite aligned to 8*n,y?
        jp      z,ALIGN


;ÛÛÛÛ   Non aligned sprite blit starts here   ÛÛÛÛ

        pop     ix              ; ix->sprite
        ld      d,a             ; d=how many bits to shift each line

        ld      e,8             ; Line loop
LILOP:  ld      b,(ix+0)        ; Get sprite data

        ld      c,0             ; Shift loop
        push    de
SHLOP:  srl     b
        rr      c
        dec     d
        jp      nz,SHLOP
        pop     de

        ld      a,b             ; Write line to graphbuf
        xor     (hl)
        ld      (hl),a
        inc     hl
        ld      a,c
        xor     (hl)
        ld      (hl),a

        ld      bc,11           ; Calculate next line address
        add     hl,bc
        inc     ix              ; Inc spritepointer

        dec     e
        jp      nz,LILOP        ; Next line

        jp      DONE1

;ÛÛÛÛ   Aligned sprite blit starts here   ÛÛÛÛ

ALIGN:                          ; Blit an aligned sprite to graphbuf
        pop     de              ; de->sprite
        ld      b,8
ALOP1:  ld      a,(de)
        xor     (hl)
        ld      (hl),a
        inc     de
        push    bc
        ld      bc,12
        add     hl,bc
        pop     bc
        djnz    ALOP1

DONE1:
        ret
;ÜÛÛÛÛÛÛÛÛÛÛÛÛÜ SPRXOR ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ÛÛÛÛÛ Z80 ÛÛÛÛÛÛ³    Sprite83    ³ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ³ movax ³ÛÛÛÛÛÛÛÛÛÛÛÛ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÙ
varDELAY:
	.db 0,0

varKEY:
	.db 0

varX1:
	.db 0

varY1:
	.db 0

varX2:
	.db 0

varY2:
	.db 0

varX3:
	.db 0

varY3:
	.db 0

varX4:
	.db 0

varY4:
	.db 0

varX5:
	.db 0

varY5:
	.db 0

varTEMP:
	.db 0

varTEMP2:
	.db 0

varTEMP3:
	.db 0

varALIENSPEED:
	.db 0,0

varSCORE:
	.db 0

varLEVEL:
	.db 0

varLIVES:
	.db 0

RESULT:	.db 0,0
.end
END
