From e1af8ee582f9a52831f2460b2c7098d4ab629324 Mon Sep 17 00:00:00 2001 From: Mischa Poslawsky Date: Sat, 17 Jul 1999 00:00:00 +0200 Subject: [PATCH] version 0.01: sidescrolling galaxian + used "Galaxian"-game engine (drawings, movement, enemy-routines) + movement of ship over 3/4 screen (96 pixels; 32 pixels for score) + enemies moving from right to left appearing right at specified times --- nemesis.z80 | 599 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 599 insertions(+) create mode 100644 nemesis.z80 diff --git a/nemesis.z80 b/nemesis.z80 new file mode 100644 index 0000000..259db9b --- /dev/null +++ b/nemesis.z80 @@ -0,0 +1,599 @@ + .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 + + + + -- 2.30.0