.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