version 0.01: sidescrolling galaxian
authorMischa Poslawsky <nemesis@shiar.org>
Fri, 16 Jul 1999 22:00:00 +0000 (00:00 +0200)
committerMischa Poslawsky <nemesis@shiar.org>
Wed, 18 Mar 2009 00:05:24 +0000 (01:05 +0100)
+ 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 [new file with mode: 0644]

diff --git a/nemesis.z80 b/nemesis.z80
new file mode 100644 (file)
index 0000000..259db9b
--- /dev/null
@@ -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
+
+
+
+