+ .include "asm86.h"
+ .include "ti86asm.inc"
+ .include "ti86abs.inc"
+ .org _asm_exec_ram
+ nop
+ jp Start
+ .dw $0000
+ .dw Title
+Title: .db "Nemesis v0.01 by Shiar",0
+Start: call _runindicoff
+
+TEXT_MEM = $c0f9
+temp1 = $c120
+StringPlace = $c180
+jpf1 = $c200
+
+
+;-------------------- init ----------------------------------------------------
+
+init:
+ set 0,(iy+3)
+ ld (iy+13),0
+
+;-------------------- main menu -----------------------------------------------
+
+ jp play_game
+
+;-------------------- exit ----------------------------------------------------
+
+exit_game:
+ ret
+
+;----------------------- game setup -------------------------------------------
+
+play_game:
+ ld hl,stored_data_start
+ ld bc,variables_end-stored_data_start-1
+
+;---------------------- display setup ----------------------------------------
+
+set_up_display:
+ call _clrLCD
+
+ ld hl,in_game_text
+ ld b,3
+l11: ld a,(hl)
+ ld (_curCol),a
+ inc hl
+ ld a,(hl)
+ ld (_curRow),a
+ inc hl
+ call _puts
+ djnz l11
+
+;------------------------ in-game texts ---------------------------------------
+
+in_game_text:
+ .db 16,0,"LIVES",0
+ .db 16,3,"LEVEL",0
+ .db 16,6,"SCORE",0
+
+str_question:
+ .db "-----",0
+
+;-------------------------- game loop -----------------------------------------
+
+game_main_loop:
+ ld hl,timer
+ inc (hl)
+
+ xor a
+ ld hl,GRAPH_MEM+(16*12)
+ ld b,a
+csl: ld (hl),a
+ inc hl
+ ld (hl),a
+ inc hl
+ ld (hl),a
+ inc hl
+ djnz csl
+
+ call Level_event
+ call Handle_Ship
+ call Handle_enemies
+ call Display_Screen
+ call Misc_Keys
+ jr game_main_loop
+
+;---------------------- display -----------------------------------------------
+
+Display_Screen:
+ ld a,64 ;Display Image
+ ld hl,GRAPH_MEM+(16*12)
+ ld de,$fc00
+dsl: ld bc,12
+ ldir
+ inc de
+ inc de
+ inc de
+ inc de
+ dec a
+ jr nz,dsl
+
+ ld hl,$1007 ;Display Score
+ ld (_curRow),hl
+ ld hl,(score)
+; jp _D_HL_DECI
+ ret
+
+;------------------------- handle ship ----------------------------------------
+
+Handle_Ship:
+ ld a,(your_status)
+ bit 4,a
+ jr nz,you_not_normal
+ or a
+ jr z,ok
+ dec a
+ ld (your_status),a
+ ld hl,(lives)
+ ld a,l
+ or h
+ jr nz,ok
+ pop af
+ ret
+ok:
+ ld a,%01111110
+ out (1),a
+ ld hl,y
+ in a,(1)
+ rra
+ ld b,a
+
+ jr c,no_down
+ ld a,(hl)
+ inc a
+ cp 73 ;y < 73
+ jr z,no_down
+ ld (hl),a
+no_down: dec hl
+ rr b
+ jr c,no_left
+ ld a,(hl)
+ dec a
+ jr z,no_left ;x > 0
+ ld (hl),a
+no_left: rr b
+ jr c,no_right
+ ld a,(hl)
+ inc a
+ cp 89 ;x < 89
+ jr z,no_right
+ ld (hl),a
+no_right:ld d,(hl)
+ inc hl
+ rr b
+ jr c,no_up
+ ld a,(hl)
+ dec a
+ cp 15 ;y > 15
+ jr z,no_up
+ ld (hl),a
+no_up:
+ ld ix,spr_ship
+
+display_common:
+ ld e,(hl)
+ jp drw_spr
+
+you_not_normal:
+
+ ld hl,(score)
+ ld de,-6
+ add hl,de
+ ld a,255
+ cp h
+ jr nz,_ok_
+ ld hl,0
+_ok_: ld (score),hl
+ ld a,(your_status)
+ dec a
+ ld (your_status),a
+ inc a
+ and 14
+ xor 14
+ ld hl,x-1
+
+explosion_stuff:
+ rra
+ add a,a
+ add a,a
+ add a,a
+ ld c,a
+ ld b,0
+ ld ix,spr_explosion
+ add ix,bc
+ inc hl
+ ld d,(hl)
+ inc hl
+ jr display_common
+
+;---------------------------- handle keys -------------------------------------
+
+Misc_Keys:
+ ld a,$BF
+ out (1),a
+ nop
+ nop
+ in a,(1)
+ rla
+ rla
+ jr nc,e_exit
+
+ ld a,$FD
+ out (1),a
+ nop
+ nop
+ in a,(1)
+ rra
+ bit 5,a
+ ret nz
+e_exit: pop af
+ ret
+
+;--------------------------- level events -------------------------------------
+
+Level_event:
+ ld a,(nextevent)
+ dec a
+ ld (nextevent),a
+ or a
+ ret nz
+
+do_event:
+ ld hl,(curevent)
+ inc hl
+
+ ld de,enemies
+ dec de
+ dec de
+search_noenemy:
+ inc de
+ inc de
+ ld a,(de)
+ cp $ff
+ jr nz,search_noenemy
+
+ ld a,$5a
+ ld (de),a
+ inc de
+ ld a,(hl)
+ ld (de),a
+
+ inc hl
+ ld (curevent),hl
+ ld a,(hl)
+ ld (nextevent),a
+ ret
+
+;--------------------------- handle enemies -----------------------------------
+
+Handle_enemies:
+ ld hl,enemies
+
+handle_enemy:
+ push hl
+ ld d,(hl)
+ inc hl
+ ld e,(hl)
+
+ ld a,d
+ or a
+ jr z,next_enemy
+ dec a
+ ld d,a
+ jr z,remove_enemy
+
+ ld (hl),e
+ dec hl
+ ld (hl),d
+ ld ix,spr_enemy01
+ call drw_spr
+ jr next_enemy
+
+remove_enemy:
+ dec hl
+ ld (hl),$0000
+
+next_enemy:
+ pop hl
+ inc hl
+ inc hl
+ ld a,(hl)
+ cp $ff
+ jr nz,handle_enemy
+
+ ret
+
+;--------------------------- putsprite ----------------------------------------
+
+offsets_table:
+ .db 128,64,32,16,8,4,2,1
+drw_spr: ld a,d
+ and 7
+ ld hl,offsets_table
+ ld c,a
+ ld b,0
+ add hl,bc
+ ld a,(hl)
+ ld (_smc1+1),a
+
+ ld (_smc1+1),a
+ ld hl,GRAPH_MEM
+ ld a,e
+ add a,a
+ add a,e
+ add a,a
+ rl b
+ add a,a
+ rl b
+ srl d
+ srl d
+ srl d
+ add a,d
+ jr nc,_n1
+ inc b
+_n1: ld c,a
+ add hl,bc
+
+ ld d,(ix)
+ ld b,(ix+1)
+_oloop: push bc ;Save # of rows
+ push hl ;Save screen address
+ ld b,d ;Load width
+ ld c,(ix+2) ;Load one line of image
+ inc ix
+_smc1 ld a,1 ;Load pixel mask
+_iloop: sla c ;Test leftmost pixel
+ jr nc,_noplot ;See if a plot is needed
+ ld e,a ;OR pixel with screen
+ or (hl)
+ ld (hl),a
+ ld a,e
+_noplot: rrca
+ jr nc,_notedge ;Test if edge of byte reached
+ inc hl ;Go to next byte
+_notedge:djnz _iloop
+ pop hl ;Restore address
+ ld bc,12 ;Go to next line
+ add hl,bc
+ pop bc ;Restore data
+ djnz _oloop
+ ret
+
+;drw_sprw:
+ ld a,d
+ and 7
+ ld hl,offsets_table
+ ld c,a
+ ld b,0
+ add hl,bc
+ ld a,(hl)
+
+ ld (wsmc1+1),a
+ ld (wsmc2+1),a
+ ld hl,GRAPH_MEM
+
+ ld a,e
+ add a,a
+ add a,e
+ add a,a
+ rl b
+ add a,a
+ rl b
+ srl d
+ srl d
+ srl d
+ add a,d
+ jr nc,n1
+ inc b
+n1: ld c,a
+ add hl,bc
+
+ ld d,(ix)
+ ld b,(ix+1)
+woloop: push bc ;Save # of rows
+ push hl ;Save screen address
+ ld b,d ;Load width
+ ld c,(ix+2) ;Load one line of image
+ inc ix
+wsmc1 ld a,1 ;Load pixel mask
+wiloop: sla c ;Test leftmost pixel
+ jr nc,wnoplot ;See if a plot is needed
+ ld e,a ;OR pixel with screen
+ or (hl)
+ ld (hl),a
+ ld a,e
+wnoplot: rrca
+ jr nc,wnotedge ;Test if edge of byte reached
+ inc hl ;Go to next byte
+wnotedge
+wsmc2: cp 1
+ jr z,wover_1
+
+ djnz wiloop
+ pop hl ;Restore address
+ ld bc,12 ;Go to next line
+ add hl,bc
+ pop bc ;Restore data
+ djnz woloop
+ ret
+wover_1: ld c,(ix+2)
+ inc ix
+ djnz wiloop
+ dec ix
+ pop hl
+ ld bc,12
+ add hl,bc
+ pop bc
+ djnz woloop
+ ret
+
+
+HL_Decimal:
+ ld (_penCol),de ;set display position
+ ld de,StringPlace+4 ;end of location to store string
+ ld b,5 ;digits
+ConvLoop:
+ call UNPACK_HL ;value to string
+ add a,'0'
+ ld (de),a ;store char
+ dec de
+ djnz ConvLoop ;loop
+ ld hl,StringPlace ;display stored chars
+ call _vputs
+ ret
+
+
+
+
+;------------------------------- sprites --------------------------------------
+
+spr_ship:
+ .db 7,7
+ .db %11111000
+ .db %11000000
+ .db %11111100
+ .db %11111110
+ .db %11111100
+ .db %11000000
+ .db %11111000
+
+spr_bullet01:
+ .db 3,5
+ .db %01000000
+ .db %11100000
+ .db %11100000
+ .db %11100000
+ .db %11100000
+
+spr_bullet02:
+ .db 3,3
+ .db %01000000
+ .db %11100000
+ .db %01000000
+
+spr_enemy01:
+ .db 6,6
+ .db %00111100
+ .db %01110000
+ .db %11110000
+ .db %11110000
+ .db %01110000
+ .db %00111100
+
+spr_explosion:
+ .db 8,6
+ .db %00000000
+ .db %00011100
+ .DB %00111110
+ .DB %01010110
+ .DB %00111000
+ .DB %00000000
+ .db 8,6
+ .db %00110000
+ .db %01001110
+ .DB %10111110
+ .DB %01001111
+ .DB %00111000
+ .DB %00011010
+ .db 8,6
+ .db %11110011
+ .db %01001110
+ .DB %10110101
+ .DB %01000101
+ .DB %00111110
+ .DB %11011010
+ .db 8,6
+ .db %11110011
+ .db %01001110
+ .DB %10110101
+ .DB %01000101
+ .DB %00111110
+ .DB %11011010
+ .db 8,6
+ .db %01000001
+ .db %00100110
+ .DB %00010101
+ .DB %01000100
+ .DB %00010010
+ .DB %10011010
+ .db 8,6
+ .db %01000010
+ .db %00100000
+ .DB %00000001
+ .DB %01000100
+ .DB %00100010
+ .DB %10001010
+ .db 8,6
+ .db %00001000
+ .db %11000010
+ .DB %00000000
+ .db %00100000
+ .db %00000001
+ .db %00110000
+ .db 8,6
+ .db %00000100
+ .DB %00000000
+ .DB %01000000
+ .DB %00000000
+ .db %00000001
+ .db %00100100
+
+;---------------------------- level data -------------------------------------
+Leveldata:
+ .db $90,$40
+ .db $90,$30
+ .db $90,$20
+ .db $90,$10
+ .db $00,$00
+
+;---------------------------- texts ------------------------------------------
+
+title_message:
+ .db "G A L A X I A N",0
+
+;---------------------------- save data --------------------------------------
+
+stored_data_start:
+
+curevent .dw Leveldata ;next event
+nextevent .db (Leveldata) ;time to next event
+score .dw $0000
+lives .dw $0003
+level .dw $0003
+x .db $46
+y .db $46
+lasers .db $03
+ybullets .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ebuls .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+enemies .dw $3335,$2323,$4040,$ffff,$ffff
+ .dw $ffff,$ffff,$ffff,$ffff,$ffff
+ .dw 0,0,0,0,0
+ .dw 0,0,0,0,0
+ .dw 0,0,0,0,0,0,0,0,0,0
+ .dw 0,0,0,0,0,0,0,0,0,$ffff
+
+boss_status .db 00
+boss_pwr .db 00
+boss_x .db 00
+boss_y .db 00
+boss_2bytes .dw 0000
+
+timer .dw $0000
+your_status .db $00
+ .db $00
+warped_status .db $00
+
+variables_end:
+
+stored_data_end:
+
+
+ .end
+
+
+
+
+;NEMESIS'86 by Shiar
+
+
+;0.01.717 -- 17.VII.99 -- size 984
+;
+; + movement of ship over whole screen
+; + enemies moving from right to left, appearing right at specified times
+
+
+
+