version 0.6: logo, bottom stats bar, 5 random levels
authorMischa Poslawsky <nemesis@shiar.org>
Mon, 23 Aug 1999 10:21:32 +0000 (12:21 +0200)
committerMischa Poslawsky <nemesis@shiar.org>
Wed, 18 Mar 2009 01:46:43 +0000 (02:46 +0100)
* play field increased to full screen instead of 3/4
+ bottom eight lines used for score (etc) display
- no more solid levels, enemies are placed at random
+ enemies appear every x turns (depends on level)
# fixed bullets so they don't disappear at 3/4 of the screen
* A LOT of optimizations both in speed and size!!
+ enemy type, frequency, and number specified per level
+ bottom score bar displays score, lives and icons (to be used later)
* smarter enemy handling (so enemies have different sizes)
+ bottom bar divided from playing field by a horizontal line
+ five levels (and five enemies) made
# game vars reset at start and game over
+ NEMESIS LOGO displayed at startup!! (also, program grew 350bytes ):
+ version/credit-string displayed below logo: v0.6.820 by shiar (ICQ#)

nemesis.z80

index cb0f3eb21bea232724637aff9ddf31d64a9177db..35f36c9b9ce7a5c340d44224fa2f91e4f923424a 100644 (file)
@@ -1,6 +1,5 @@
        .include "asm86.h"
        .include "ti86asm.inc"
        .include "asm86.h"
        .include "ti86asm.inc"
-       .include "ti86abs.inc"
 
        .org _asm_exec_ram
 
 
        .org _asm_exec_ram
 
@@ -9,9 +8,8 @@
        .dw $0001
        .dw Title
        .dw spr_ship
        .dw $0001
        .dw Title
        .dw spr_ship
-Title: .db "Nemesis v0.5.725 by Shiar",0
-Start:
-       jr init
+Title: .db "Nemesis v0.6.820 by Shiar",0
+Start: jr init
 
 just_fired     = $c0f9         ;byte
 temp1          = $c100         ;word
 
 just_fired     = $c0f9         ;byte
 temp1          = $c100         ;word
@@ -23,10 +21,33 @@ init:
 
 ;---------------------- main menu ---------------------------------------------
 
 
 ;---------------------- main menu ---------------------------------------------
 
-;---------------------- game setup --------------------------------------------
+LogoPut:
+       ld hl,logo_nemesis      ;from...
+       ld de,$FC00+16          ;...to one line from top
+       ld a,19                 ;19 rows
+LogoLoop:
+       ld bc,16                ;set screen width
+       ldir                    ;display one line
+       dec a                   ;decrease line-counter
+       jr nz,LogoLoop          ;repeat when counter is not yet zero
+
+menutext:
+       ld  hl,$1608            ;just below logo
+       ld  (_penCol),hl
+       ld  hl,txt_about        ;display "by Shiar (ICQ#43840958)"
+       call _vputs
+
+       ld  hl,$0705            ;located one row above bottom
+       ld  (_curRow),hl        ;go there
+       ld  hl,txt_1player      ;display "ONE PLAYER"
+       call _puts
+       ld  hl,$0706            ;below oneplayer text
+       ld  (_curRow),hl
+       ld  hl,txt_2players     ;display "TWO PLAYERS"
+       call _puts
 
 
-play_game:
-       call Next_level
+       call _getkey            ;wait for keypress
+       call New_level          ;prepare level
 
 ;------------------------------------------------------------------------------
 ;---------------------- game loop ---------------------------------------------
 
 ;------------------------------------------------------------------------------
 ;---------------------- game loop ---------------------------------------------
@@ -37,23 +58,24 @@ game_main_loop:
        inc (hl)
 
 Clear_screen:
        inc (hl)
 
 Clear_screen:
-       xor a
-       ld  hl,GRAPH_MEM+(16*12)
-       ld  b,a
+       xor a                   ;empty bitmask
+       ld  hl,GRAPH_MEM        ;screen location (top left)
+       ld  b,$E0               ;loop 0E0h = 224 times = 256-32 for score-bar)
 clearloop:
 clearloop:
+       ld  (hl),a              ;clear four times (total = 224*4 = 896 bytes)
+       inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
-       djnz clearloop
+       djnz clearloop          ;repeat 224x
 
 check_exitkey:
        ld  a,%00111111         ;<exit> pressed?
        out (1),a
 
 check_exitkey:
        ld  a,%00111111         ;<exit> pressed?
        out (1),a
-       nop
-       nop
+       nop \ nop
        in  a,(1)
        bit 6,a
        jr  z,quit              ;yes: quit game
        in  a,(1)
        bit 6,a
        jr  z,quit              ;yes: quit game
@@ -68,7 +90,7 @@ game_stuff:
        call Enemies_hit        ;check for collision with enemies
 
        call Display_Screen     ;display all
        call Enemies_hit        ;check for collision with enemies
 
        call Display_Screen     ;display all
-       halt \ halt \ halt      ;delay
+       halt \ halt             ;delay
        jr   game_main_loop     ;loop
 
 quit:  ret
        jr   game_main_loop     ;loop
 
 quit:  ret
@@ -76,21 +98,17 @@ quit:       ret
 ;---------------------- display -----------------------------------------------
 
 Display_Screen:
 ;---------------------- display -----------------------------------------------
 
 Display_Screen:
-       ld  a,64                ;Display Image
-       ld  hl,GRAPH_MEM+(16*12)
-       ld  de,$fc00
+       ld  hl,GRAPH_MEM        ;from storage (top left)
+       ld  de,$fc00            ;to screen (top left)
+       ld  a,56                ;display height = 64 bytes (minus 8 for bar)
 displayloop:
 displayloop:
-       ld  bc,12
-       ldir
-       inc de
-       inc de
-       inc de
-       inc de
-       dec a
-       jr  nz,displayloop
+       ld  bc,16               ;display width = 16 bytes (16*8bits=256pixels)
+       ldir                    ;16x de >> hl
+       dec a                   ;next line
+       jr  nz,displayloop      ;loop 64x
 
 
-       ld  hl,$1006            ;Display Score
-       ld  (_curRow),hl
+       ld  hl,$3a6b            ;Display Score
+       ld  (_penCol),hl
        ld  hl,(timer)
        ld  h,0
        jp  _D_HL_DECI
        ld  hl,(timer)
        ld  h,0
        jp  _D_HL_DECI
@@ -108,22 +126,23 @@ Handle_Ship:
 
        cp  34                  ;last explosion frame?
        jr  c,exploding_you     ;not yet: display explosion
 
        cp  34                  ;last explosion frame?
        jr  c,exploding_you     ;not yet: display explosion
-       cp  54                  ;delay finished?
+       cp  40                  ;delay finished?
        jp  z,game_over         ;yes = game over
        ret                     ;don't display anything
 
 ok:
        ld  a,%01111110
        out (1),a
        jp  z,game_over         ;yes = game over
        ret                     ;don't display anything
 
 ok:
        ld  a,%01111110
        out (1),a
-       ld  hl,y
+       nop \ nop
        in  a,(1)
        in  a,(1)
+       ld  hl,y
        rra
        ld  b,a
 
        jr  c,no_down
        ld  a,(hl)
        inc a
        rra
        ld  b,a
 
        jr  c,no_down
        ld  a,(hl)
        inc a
-       cp  73                  ;y < 73
+       cp  50                  ;56-6 = bottom of screen
        jr  z,no_down
        ld  (hl),a
 no_down:
        jr  z,no_down
        ld  (hl),a
 no_down:
@@ -131,15 +150,15 @@ no_down:
        rr  b
        jr  c,no_left
        ld  a,(hl)
        rr  b
        jr  c,no_left
        ld  a,(hl)
-       dec a
-       jr  z,no_left           ;x > 0
+       sub 1                   ;<dec 1> doesn't affect c-flag
+       jr  c,no_left           ;-1 = left side
        ld  (hl),a
 no_left:
        rr b   
        jr  c,no_right
        ld  a,(hl)
        inc a
        ld  (hl),a
 no_left:
        rr b   
        jr  c,no_right
        ld  a,(hl)
        inc a
-       cp  89                  ;x < 89
+       cp  122                 ;128-6 = right side
        jr  z,no_right
        ld  (hl),a
 no_right:
        jr  z,no_right
        ld  (hl),a
 no_right:
@@ -148,9 +167,8 @@ no_right:
        rr  b
        jr  c,no_up
        ld  a,(hl)
        rr  b
        jr  c,no_up
        ld  a,(hl)
-       dec a
-       cp  15                  ;y > 15
-       jr  z,no_up
+       sub 1                   ;<dec a> doesn't affect carry-flag
+       jr  c,no_up             ;-1 = top of screen
        ld  (hl),a
 no_up: ld  ix,spr_ship01
 
        ld  (hl),a
 no_up: ld  ix,spr_ship01
 
@@ -253,10 +271,10 @@ scan_bullets:
 bullet_type1:
        ld  a,(hl)              ;d = X
        inc a                   ;move right
 bullet_type1:
        ld  a,(hl)              ;d = X
        inc a                   ;move right
-       cp  $5a                 ;off screen?
+       cp  121                 ;off screen? (x=127-5-1)
        jr  z,remove_bullet
        inc a                   ;move right
        jr  z,remove_bullet
        inc a                   ;move right
-       cp  $5a                 ;off screen?
+       cp  121                 ;off screen?
        jr  z,remove_bullet
        ld  (hl),a              ;save new pos.
        ld  d,a
        jr  z,remove_bullet
        ld  (hl),a              ;save new pos.
        ld  d,a
@@ -304,12 +322,13 @@ hit_enemies:                      ;Hits with normal enemies
        dec hl
        ld  a,(hl)              ;occ
        ld  b,a                 ;push occ
        dec hl
        ld  a,(hl)              ;occ
        ld  b,a                 ;push occ
-       srl a
-       srl a                   ;occ/4 = HP left
-       jr  nz,hpleft
-       ld  (hl),$01            ;set to explode
+       and %11111100           ;occ/4 = HP left        ;<srl a\srl a
+       jr  nz,hpleft           ;not zero -> jump
+       ld  (hl),%01            ;set to explode
        inc hl
        inc hl
+       ld  b,(hl)              ;save enemy type
        ld  (hl),a              ;explosionFrame 0
        ld  (hl),a              ;explosionFrame 0
+
        pop hl
        ret
 
        pop hl
        ret
 
@@ -331,14 +350,27 @@ nohit:    pop hl
 ;--------------------------- level events -------------------------------------
 
 Level_event:
 ;--------------------------- level events -------------------------------------
 
 Level_event:
-       ld  a,(nextevent)
-       dec a
-       ld  (nextevent),a
-       or  a
-       ret nz
+       ld  hl,nextevent        ;time to next event     <ld  a,(nextevent)
+       dec (hl)                ;decrease counter       <dec a
+       ld  a,(hl)              ;look at counter        <ld  (nextevent),a
+       or  a                   ;has it reached zero?
+       ret nz                  ;nope: get outta here!
+
+       ld  a,(eventtime)       ;enemy frequency (lvl)
+       ld  (nextevent),a       ;set time to next event
+       ld  hl,eventleft
+       dec (hl)                ;update enemy-counter
+
+       ld  a,(hl)              ;look at counter
+       or  a                   ;has it reached 0?
+       jp  z,Next_level        ;yes: level finished
+       dec a                   ;has it reached 1?
+       jr  nz,do_event         ;nope: wait for enemies to leave
+       inc hl                  ;nextevent located behind eventleft
+       ld  (hl),109            ;set delay
+       ret                     ;don't place any more enemies
 
 do_event:
 
 do_event:
-       ld  hl,(curevent)
        ld  de,enemies-4
 chk_noenemy:
        inc de
        ld  de,enemies-4
 chk_noenemy:
        inc de
@@ -349,12 +381,11 @@ chk_noenemy:
        or  a                   ;0 = no enemy present
        jr  nz,chk_noenemy
 
        or  a                   ;0 = no enemy present
        jr  nz,chk_noenemy
 
-       ld  a,(hl)              ;type
-       ld  hl,enemy01
+       ld  a,(eventenemy)      ;enemy type to place (lvl)
+       ld  hl,enemy01          ;enemy 1 specs
        ld  c,a
        ld  c,a
-       ld  b,0
-       add hl,bc
-       add hl,bc
+       ld  b,0                 ;bc = enemy nr.
+       add hl,bc               ;add 2*bc
        add hl,bc               ;hl = enemy specs
        ld  a,(hl)              ;load hitpoints+occ of this enemy class
        ld  (de),a              ;occ
        add hl,bc               ;hl = enemy specs
        ld  a,(hl)              ;load hitpoints+occ of this enemy class
        ld  (de),a              ;occ
@@ -362,30 +393,16 @@ chk_noenemy:
        inc hl
        inc de
        ld  a,(hl)              ;load movement+type of this enemy class
        inc hl
        inc de
        ld  a,(hl)              ;load movement+type of this enemy class
-       ld  (de),a              ;type
-
-       inc de
-       ld  a,$5a               ;appear at right edge of screen
-       ld  (de),a              ;x
-       inc de
-
-       ld  hl,(curevent)
-       inc hl
-       ld  a,(hl)
-       ld  (de),a              ;y
-
-       inc hl                  ;@ next event
-       ld  a,(hl)
-       cp  $ff                 ;255 = end marker
-       jp  z,Next_level
-       ld  (nextevent),a       ;else time to next event
-
-       inc hl
-       ld  (curevent),hl       ;update pointer
-
-       or  a                   ;no delay
-       jr  z,do_event
-       ret                     ;no more events for now
+       ld  (de),a              ;enemy type
+
+       inc de                  ;_________
+       ld  a,122               ;appear at right edge of screen (128-6)
+       ld  (de),a              ;= x-position
+       inc de                  ;_________
+       ld  a,51                ;random number <51
+       call Random             ;create!
+       ld  (de),a              ;= y-position
+       ret
 
 ;--------------------------- enemy fires --------------------------------------
 
 
 ;--------------------------- enemy fires --------------------------------------
 
@@ -480,7 +497,7 @@ remove_ebullet:
 
 Handle_enemies:
        ld  hl,enemies
 
 Handle_enemies:
        ld  hl,enemies
-       ld  b,nrenemies         ;loop 20x
+       ld  b,nrenemies         ;handle all enemies
 
 handle_enemy:
        push bc
 
 handle_enemy:
        push bc
@@ -500,15 +517,17 @@ moving_enemy:                     ;occ "moving" 3
 
 normal_enemy:
        inc hl
 
 normal_enemy:
        inc hl
-       ld  a,(hl)              ;type
-       and %11100000           ;move-type
-       add a,b                 ;add move bit from occ
-       ld  b,a                 ;save in b
-       ld  a,(hl)              ;type
-       add a,a
-       add a,a
-       add a,a
-       ld  c,a                 ;type*8 = offset
+       push hl
+
+       ld  e,(hl)              ;e = enemy type
+       ld  d,0                 ;de = e
+       ld  hl,sprites          ;hl = @sprites offset-table
+       add hl,de               ;points to offset of current enemy offset
+       ld  e,(hl)              ;de = @enemy offset
+
+       ld  ix,spr_enemy01      ;first enemy sprite
+       add ix,de               ;add offset for current enemy
+       pop hl
 
        inc hl
        ld  a,(hl)              ;x
 
        inc hl
        ld  a,(hl)              ;x
@@ -548,32 +567,16 @@ movedown:
 ymove_done:
        dec hl                  ;@x
        ld  (hl),d              ;store new x
 ymove_done:
        dec hl                  ;@x
        ld  (hl),d              ;store new x
-       ld  ix,spr_enemy01
-       ld  b,$00
-       add ix,bc
 
 
-;      push hl                 ;save registers
-       push de
-       call drw_spr            ;display
+       push de                 ;save registers
+       call drw_spr            ;display sprite @ix
        pop  de                 ;restore (destroyed by drw_spr)
        pop  de                 ;restore (destroyed by drw_spr)
-;      pop  hl
-
-;      dec hl
-;      ld  b,(hl)              ;type
-;      and %00011111           ;enemy class
-;      ld  hl,enemy01          ;all enemies' specs
-;      inc b                   ;next enemy's specs
-;      ld  c,$00
-;      add hl,bc
-;      add hl,bc
-;      add hl,bc               ;go there
-;      dec hl                  ;last byte of this enemy's specs
-
-       ld  a,$ff               ;fire frequency
+
+       ld   a,$ff              ;fire frequency
        call Random             ;random value < a
        call Random             ;random value < a
-       dec                   ;fire if 1
+       dec  a                  ;fire if 1
        call z,Enemy_fires      ;fires bullet
        call z,Enemy_fires      ;fires bullet
-       jr   next_enemy
+       jr   next_enemy         ;finished
 
 remove_enemy:
        pop hl
 
 remove_enemy:
        pop hl
@@ -615,7 +618,7 @@ check_collision:
        push hl
        ld  a,(hl)
        and %00000010
        push hl
        ld  a,(hl)
        and %00000010
-       jr  z,check_next        ;2/3 = ok
+       jr  z,check_next        ;2 or 3 = ok
 
        inc hl
        inc hl
 
        inc hl
        inc hl
@@ -652,21 +655,86 @@ check_next:
        djnz check_collision
        ret
 
        djnz check_collision
        ret
 
+;--------------------------- game over ----------------------------------------
+
+game_over:
+       call _clrLCD            ;clear screen
+       ld  hl,$0603
+       ld  (_curRow),hl        ;center
+       ld  hl,txt_gameover
+       call _puts              ;display "GAME OVER"
+
+       ld  b,$20
+wait2: halt \ halt
+       djnz wait2              ;delay
+       call _getkey            ;wait for keypress
+
+;--------------------------- new game -----------------------------------------
+
+New_level:
+       xor a                   ;a=0
+       ld  hl,x                ;begin position x=...
+       ld  (hl),a              ;...=a=0=left
+       inc hl                  ;y=...
+       ld  (hl),24             ;...=24=middle
+       ld  (level),a           ;reset level nr
+       ld  (score),a           ;reset score
+       ld  hl,level01-3        ;set level pointer to level#1
+       ld  (levelp),hl         ;reset level pointer
+
 ;--------------------------- next level ---------------------------------------
 
 Next_level:
 ;--------------------------- next level ---------------------------------------
 
 Next_level:
-       ld  hl,Leveldata+1      ;reset level data
-       ld  (curevent),hl
+       ld  hl,level
+       inc (hl)                ;increase level nr.
+       ld  a,80
+       ld  (nextevent),a       ;time to first enemy appearance
+
+       ld  hl,(levelp)         ;level pointer
+       inc hl
+       inc hl
+       inc hl                  ;update to point to next level
+       ld  (levelp),hl         ;save
+
+       ld  a,(hl)              ;load new level-enemy type
+       ld  (eventenemy),a      ;set level-enemy
+       inc hl
+       ld  a,(hl)              ;load new appearance-time
+       ld  (eventtime),a       ;set
+       inc hl
+       ld  a,(hl)              ;load nr of enemies in this level
+       ld  (eventleft),a       ;set nr of events left
 
 
+       xor a
+       ld  (timer),a           ;reset time
+
+;--------------------------- setup game ---------------------------------------
+
+game_setup:
        call _clrLCD            ;clear screen
        call _clrLCD            ;clear screen
+       ld a,%10111011
+       ld  hl,$fc00            ;screen location (top left)
+       ld  b,0                 ;b = 0 (loop 0-1 = 0FFh = 256 times)
+clearloop2:
+       inc a
+       ld  (hl),a              ;clear four times (total = 256*4 = 1024 bytes)
+       inc hl
+       ld  (hl),a
+       inc hl
+       xor $ff
+       ld  (hl),a
+       inc hl
+       ld  (hl),a
+       inc hl
+       xor $ff
+       djnz clearloop2         ;repeat 256x
+
        ld  hl,$0703
        ld  (_curRow),hl        ;center
        ld  hl,txt_level
        call _puts              ;display "LEVEL "
 
        ld  a,(level)
        ld  hl,$0703
        ld  (_curRow),hl        ;center
        ld  hl,txt_level
        call _puts              ;display "LEVEL "
 
        ld  a,(level)
-       inc a                   ;increase level nr.
-       ld  (level),a
        ld  l,a
        ld  h,$00
 
        ld  l,a
        ld  h,$00
 
@@ -677,87 +745,108 @@ Next_level:
        add a,'0'
        call _putc              ;display second digit
        ld  a,b
        add a,'0'
        call _putc              ;display second digit
        ld  a,b
-       call _putc              ;display first digit
+       call _putmap            ;display first digit
+
+       ld  hl,$0904
+       ld  (_curRow),hl        ;display lives left below level nr
+       ld  hl,txt_lives        ;bar text: "Lx0"...
+       ld  a,(lives)           ;lives left
+       add a,'0'               ;make value
+       ld  (txt_lives+3),a     ;add to text
+       call _puts              ;display the string
 
        ld  b,$20
 wait:  halt \ halt
        djnz wait               ;delay
        call _getkey            ;wait for keypress
 
        ld  b,$20
 wait:  halt \ halt
        djnz wait               ;delay
        call _getkey            ;wait for keypress
-       jr  game_setup          ;prepare display and vars
-       ret
 
 
-;--------------------------- game over ----------------------------------------
-
-game_over:
-       ld  hl,Leveldata+1      ;reset level data
-       ld  (curevent),hl
-
-       call _clrLCD            ;clear screen
-       ld  hl,$0603
-       ld  (_curRow),hl        ;center
-       ld  hl,txt_gameover
-       call _puts              ;display "GAME OVER"
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$1802            ;bottom left
+       call drw_spr
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$2002            ;bottom left
+       call drw_spr
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$2802            ;bottom left
+       call drw_spr
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$3002            ;bottom left
+       call drw_spr
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$3802            ;bottom left
+       call drw_spr
 
 
-       ld  b,$20
-wait2: halt \ halt
-       djnz wait2              ;delay
-       call _getkey            ;wait for keypress
-       jr  game_setup          ;prepare display and vars
-       ret
+       ld  hl,GRAPH_MEM        ;from storage (top left)
+       ld  de,$fc00+(56*16)    ;to screen (top left)
+       ld  a,8                 ;display height = 64 bytes (minus 8 for bar)
+displayloop3:
+       ld  bc,16               ;display width = 16 bytes (16*8bits=256pixels)
+       ldir                    ;16x de >> hl
+       dec a                   ;next line
+       jr  nz,displayloop3     ;loop 8x
+
+       ld  hl,$3a00            ;display Lives
+       ld  (_penCol),hl        ;bottom left
+       ld  hl,savestr+2
+       ld  (hl),'L'
+       inc hl
+       ld  (hl),'x'
+       inc hl
 
 
-;---------------------- setup game --------------------------------------------
+       ld  a,(lives)           ;nr of lives in a
+       add a,'0'               ;make digit
+       ld  (hl),a
+       dec hl \ dec hl
+       call _vputs             ;display on screen
 
 
-game_setup:
-       call _clrLCD
-       ld  hl,$1005
-       ld  (_curRow),hl
-       ld  hl,txt_score        ;display "SCORE"
-       call _puts                      ;display texts
+       ld  hl,$fc00+(16*57)    ;56 rows down = eight rows from bottom
+       ld  b,15                ;draw 16x (screen width)
+drawline:
+       ld  a,%11111111         ;horizontal line mask
+       ld  (hl),a              ;draw one piece of the divider-line
+       inc hl                  ;move right (8 pixels = 1 byte)
+       djnz drawline           ;repeat (16bytes * 8pixels =128= screen width)
 
 
-       xor a
-       ld  (timer),a                   ;reset time
-       ld  (level),a                   ;level 1
-       ld  hl,Leveldata+1
-       ld  (curevent),hl               ;reset level
-       ld  hl,(Leveldata)
-       ld  (nextevent),hl
                                        ;ret
                                        ;ret
-;---------------------- exit --------------------------------------------------
+;--------------------------- exit ---------------------------------------------
 
 exit_game:
        ret
 
 ;--------------------------- putsprite ----------------------------------------
 
 exit_game:
        ret
 
 ;--------------------------- putsprite ----------------------------------------
+;--------------------------- de =(X,Y) ----------------------------------------
 
 offsets_table:
 
 offsets_table:
-       .db 128,64,32,16,8,4,2,1
+       .db 128,64,32,16,%1000,%0100,%0010,%0001
 drw_spr:
 drw_spr:
-       ld  a,d
-       and 7
-       ld  hl,offsets_table
-       ld  c,a
-       ld  b,0
-       add hl,bc
-       ld  a,(hl)
+       ld  a,d                 ;a = X
+       and %00000111           ;a = X mod 8 = bit nr. to mask
+       ld  hl,offsets_table    ;pixel mask table
+       ld  c,a                 ;bit nr.
+       ld  b,0                 ;word
+       add hl,bc               ;add to table
+       ld  a,(hl)              ;a = pixel mask
+       ld  (_smc1+1),a         ;alter pixel mask
        ld  (_smc1+1),a
 
        ld  (_smc1+1),a
 
-       ld  (_smc1+1),a
-       ld  hl,GRAPH_MEM
-       ld  a,e
-       add a,a
-       add a,e
-       add a,a
+       ld  hl,GRAPH_MEM        ;save-location
+       ld  a,e                 ;y-coord
+       add a,a                 ;y*2
+       add a,a                 ;y*4
+       add a,a                 ;y*8
+ ;b=0
        rl  b
        rl  b
-       add a,a
+       add a,a                 ;y*16 (width of screen)
        rl  b
        rl  b
-       srl d
-       srl d
-       srl d
-       add a,d
-       jr  nc,_n1
-       inc b
-_n1:   ld  c,a
-       add hl,bc
+       srl d                   ;d/2
+       srl d                   ;d/4
+       srl d                   ;d/8 (8 bits in byte) ** c is set when overflow
+       add a,d                 ;a = (Y*16+X/8) mod 256
+       jr  nc,_n1              ;jump if no carry = no overflow = a<=255
+       inc b                   ;a>255 so increase bc by 256
+_n1:   ld  c,a                 ;c = (Y*16+X/8) mod 256
+       add hl,bc               ;bc = Y*16+X/8
+               ;optimize tip: reverse hl <-> bc (??)
           
        ld  d,(ix)
        ld  b,(ix+1)
           
        ld  d,(ix)
        ld  b,(ix+1)
@@ -773,12 +862,13 @@ _iloop:   sla c                   ;Test leftmost pixel
        or  (hl)
        ld  (hl),a
        ld  a,e
        or  (hl)
        ld  (hl),a
        ld  a,e
-_noplot: rrca
+_noplot:rrca
        jr  nc,_notedge         ;Test if edge of byte reached
        inc hl                  ;Go to next byte
        jr  nc,_notedge         ;Test if edge of byte reached
        inc hl                  ;Go to next byte
-_notedge:djnz _iloop
+_notedge:
+       djnz _iloop
        pop hl                  ;Restore address
        pop hl                  ;Restore address
-       ld  bc,12               ;Go to next line
+       ld  bc,16               ;Go to next line
        add hl,bc
        pop bc                  ;Restore data
        djnz _oloop
        add hl,bc
        pop bc                  ;Restore data
        djnz _oloop
@@ -787,53 +877,47 @@ _notedge:djnz _iloop
 ;---------------------- random ------------------------------------------------
 
 Random:               ; Creates a random number 0 <= x < A
 ;---------------------- random ------------------------------------------------
 
 Random:               ; Creates a random number 0 <= x < A
- push bc
- push de
- push hl
ld b,a
ld a,r
add a,a
ld hl,0
ld d,0
ld e,a
      push bc
      push de
      push hl
      ld   b,a
      ld   a,r
      add  a,a
      ld   hl,0
      ld   d,0
      ld   e,a
 RMul:
 RMul:
add hl,de
- djnz RMul
ld a,h
pop hl
pop de
pop bc
- ret
      add  hl,de
      djnz RMul
      ld   a,h
      pop  hl
      pop  de
      pop  bc
      ret
 
 
-;------------------------
+;---------------------- display 5digit number ---------------------------------
 
 _D_HL_DECI:
 
 _D_HL_DECI:
-         push     bc
-         ld       de,up_data+4
-         ld       b,5
-ldhld:   call     UNPACK_HL
-         add      a,'0'
-         ld       (de),a
-         dec      de
-         djnz     ldhld
-         ld       hl,up_data
-         ld       b,4
-lis:     ld       a,(hl)
-         cp       '0'
-         jr       nz,dis
-         ld       (hl),' '
-         inc      hl
-         djnz     lis
-dis:     ld       hl,up_data
-         call     _puts
-         pop      bc
-         ret
-
-up_data: .db      "PAD98",0
+       push bc                 ;save bc
+       ld   de,savestr+4       ;savenr saves number string
+       ld   b,5                ;five digits
+ldhld: call UNPACK_HL          ;one digit of hl
+       add  a,'0'              ;make number
+       ld   (de),a             ;save into savenr
+       dec  de                 ;point to next digit
+       djnz ldhld              ;repeat for all digits
+dis:   ld   hl,savestr
+       call _vputs
+       pop  bc
+       ret
 
 
+savestr:
+       .db "PAD98",0
 
 
 
 
+;------------------------------------------------------------------------------
 ;------------------------------- sprites --------------------------------------
 ;------------------------------- sprites --------------------------------------
+;------------------------------------------------------------------------------
 
 spr_ship:
        .db 9,1         ;ship icon
 
 spr_ship:
        .db 9,1         ;ship icon
@@ -841,7 +925,7 @@ spr_ship:
        .db %11111000   ; █████
        .db %00111110   ;   █████
        .db %11111001   ; █████  █
        .db %11111000   ; █████
        .db %00111110   ;   █████
        .db %11111001   ; █████  █
-       .db %11111101   ; ██████ █
+       .db %11111001   ; █████  █
        .db %11111001   ; █████  █
        .db %00111110   ;   █████
        .db %11111000   ; █████
        .db %11111001   ; █████  █
        .db %00111110   ;   █████
        .db %11111000   ; █████
@@ -849,13 +933,13 @@ spr_ship:
 
 spr_ship01:
        .db 7,7         ;ship alpha class
 
 spr_ship01:
        .db 7,7         ;ship alpha class
-       .db %01110000   ;  ███
+       .db %01111000   ;  ████
        .db %11100000   ; ███
        .db %11111100   ; ██████
        .db %11110010   ; ████  █
        .db %11111100   ; ██████
        .db %11100000   ; ███
        .db %11100000   ; ███
        .db %11111100   ; ██████
        .db %11110010   ; ████  █
        .db %11111100   ; ██████
        .db %11100000   ; ███
-       .db %01110000   ;  ███
+       .db %01111000   ;  ████
 spr_ship02:
        .db 7,7         ;ship beta class
        .db %11000000   ; ██
 spr_ship02:
        .db 7,7         ;ship beta class
        .db %11000000   ; ██
@@ -868,20 +952,22 @@ spr_ship02:
 
 spr_bullet01:
        .db 5,3         ;your bullets
 
 spr_bullet01:
        .db 5,3         ;your bullets
-       .db %00110000   ;   ░▒▓█�
-       .db %11111000   ; ░▒▓████�
-       .db %00110000   ;   ░▒▓█�
+       .db %00110000   ;   ░▒▓█�
+       .db %11111000   ; ░▒▓████�
+       .db %00110000   ;   ░▒▓█�
 spr_bullet02:
        .db 5,3         ;your bullets
 spr_bullet02:
        .db 5,3         ;your bullets
-       .db %11110000   ; ░▒▓███�
-       .db %11111000   ; ░▒▓████�
-       .db %11110000   ; ░▒▓███�
+       .db %11110000   ; ░▒▓███�
+       .db %11111000   ; ░▒▓████�
+       .db %11110000   ; ░▒▓███�
 
 spr_bullet11:
        .db 3,3         ;enemy bullets
 
 spr_bullet11:
        .db 3,3         ;enemy bullets
-       .db %01000000   ;  █▓▒░
-       .db %11100000   ; ███▓▒░
-       .db %01000000   ;  █▓▒░
+       .db %01000000   ;  ▒▓▒░
+       .db %11100000   ; ▒██▓▒░
+       .db %01000000   ;  ▒▓▒░
+
+;---------------------------------------- explosion -------------------------------------------
 
 spr_explosion:                               
        .db 8,6         ;1
 
 spr_explosion:                               
        .db 8,6         ;1
@@ -948,39 +1034,63 @@ spr_explosion:
        .db %00000010   ;       █▒
        .db %00100100   ;   █▒ █
 
        .db %00000010   ;       █▒
        .db %00100100   ;   █▒ █
 
+;--------------------------------------- bar -----------------------------------
+
+spr_icon00:
+       .db 8,7
+       .db %10101010   ; █ █ █ █
+       .db %11010101   ; ██ █ █ █
+       .db %10101010   ; █ █ █ █
+       .db %11010101   ; ██ █ █ █
+       .db %10101010   ; █ █ █ █
+       .db %11010101   ; ██ █ █ █
+       .db %10101010   ; █ █ █ █
 spr_icon01:
 spr_icon01:
-       .db 5,4
-       .db %00100000   ;   █
-       .db %10101000   ; █ █ █
-       .db %11111000   ; █████
-       .db %01110000   ;  ███
+       .db 8,7
+       .db %10000000   ; █.......
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
 spr_icon02:
 spr_icon02:
-       .db 5,4
-       .db %00000000   ;  ███
-       .db %00000000   ; ██ ██
-       .db %00000000   ; █   █
-       .db %00000000   ;
+       .db 8,7
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
+       .db %10000000   ; █
 
 ;---------------------------- texts -------------------------------------------
 
 
 ;---------------------------- texts -------------------------------------------
 
-txt_title:     .db "* * NEMESIS * *",0
+txt_about:     .db "v0.6.820 ","by Shiar  "
+               .db "(ICQ#43840958)",0
+txt_1player:   .db "1 PLAYER",0
+txt_2players:  .db "2 PLAYERS",0
 txt_level:     .db "LEVEL ",0
 txt_gameover:  .db "GAME OVER!",0
 txt_level:     .db "LEVEL ",0
 txt_gameover:  .db "GAME OVER!",0
-txt_score:     .db "SCORE",0
+txt_lives:     .db "Lx0?",0
 
 ;---------------------------- save data ---------------------------------------
 
 stored_data_start:
 
 
 ;---------------------------- save data ---------------------------------------
 
 stored_data_start:
 
-level          .db $00                 ;level number
 timer          .db $00                 ;frame counter
 timer          .db $00                 ;frame counter
-curevent       .dw Leveldata+1         ;next event
-nextevent      .db (Leveldata)         ;time to next event
+level          .db $00                 ;level number
+levelp         .dw level01             ;pointer to level data
+
+eventenemy     .db $02                 ;enemy type
+eventtime      .db $15                 ;enemy frequency
+eventleft      .db $00                 ;nr. of enemies still to come
+nextevent      .db $50                 ;time to next event
 
 score          .dw $0000
 
 your_occ       .db $00                 ;0=normal 1..16=exploding
 
 score          .dw $0000
 
 your_occ       .db $00                 ;0=normal 1..16=exploding
-;lives         .dw $0003       ;unused
+lives          .dw $0003       ;unused
 x              .db $16                 ;x-pos
 y              .db $46                 ;think about it..
 hp             .db $00                 ;hitpoints left
 x              .db $16                 ;x-pos
 y              .db $46                 ;think about it..
 hp             .db $00                 ;hitpoints left
@@ -988,7 +1098,7 @@ hp         .db $00                 ;hitpoints left
 ybullets       .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0       ;10 x (state,x,y)
 ebullets       .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0       ;10 x (state,x,y)
 
 ybullets       .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0       ;10 x (state,x,y)
 ebullets       .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0       ;10 x (state,x,y)
 
-nrenemies      = 32
+nrenemies      = 20
 enemies                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
 enemies                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
@@ -1000,11 +1110,16 @@ enemies         .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
 
 ; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
 
 ; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
-; %111 (move ptrn) 11111 (ship or explosion frame)  %11111111 (x) %11111111 (y)
-
+; %11111111 (ship type or explosion frame)  %11111111 (x) %11111111 (y)
 
 ;---------------------------- enemy data --------------------------------------
 
 
 ;---------------------------- enemy data --------------------------------------
 
+sprites:
+       .db $00
+       .db spr_enemy02-spr_enemy01
+       .db spr_enemy03-spr_enemy01
+       .db spr_enemy04-spr_enemy01
+
 spr_enemy01:
        .db 6,6         ;enemy type one
        .db %00111100   ;   ████
 spr_enemy01:
        .db 6,6         ;enemy type one
        .db %00111100   ;   ████
@@ -1014,13 +1129,14 @@ spr_enemy01:
        .db %01110000   ;  ███
        .db %00111100   ;   ████
 spr_enemy02:
        .db %01110000   ;  ███
        .db %00111100   ;   ████
 spr_enemy02:
-       .db 6,6         ;enemy type two
-       .db %00111000   ;   ███
-       .db %01100000   ;  ██
+       .db 8,7         ;enemy type two
+       .db %00111111   ;    █████
+       .db %01111000   ;  ████
        .db %11111100   ; ██████
        .db %11111100   ; ██████
+       .db %11111110   ; ███████
        .db %11111100   ; ██████
        .db %11111100   ; ██████
-       .db %01100000   ;  ██
-       .db %00111000   ;   ███
+       .db %01111000   ;  ████
+       .db %00111111   ;    █████
 spr_enemy03:
        .db 6,6         ;enemy type three
        .db %01111100   ;  █████
 spr_enemy03:
        .db 6,6         ;enemy type three
        .db %01111100   ;  █████
@@ -1037,106 +1153,85 @@ spr_enemy04:
        .db %11111000   ; █████
        .db %01111100   ;  █████
        .db %00111000   ;   ███
        .db %11111000   ; █████
        .db %01111100   ;  █████
        .db %00111000   ;   ███
+spr_enemy05:
+       .db 7,6         ;enemy type four
+       .db %00011110   ;    ████
+       .db %01111110   ;  ██████
+       .db %11111100   ; ██████
+       .db %11111100   ; ██████
+       .db %01111110   ;  ██████
+       .db %00011110   ;    ████
 
 enemy01:                               ;HP:1  move:- fire:-
 
 enemy01:                               ;HP:1  move:- fire:-
-       .db %00000010,%00000000,%00000000               ;first two enemy bytes
+       .db %00000010,%00000000                 ;first two enemy bytes
 enemy02:                               ;HP:1  move:1 fire:1.5%
 enemy02:                               ;HP:1  move:1 fire:1.5%
-       .db %00000011,%00100001,%01111111
+       .db %00000010,%00000001
 enemy03:                               ;HP:2  move:- fire:3%
 enemy03:                               ;HP:2  move:- fire:3%
-       .db %00000110,%00000010,%00001111
+       .db %00000110,%00000010
 enemy04:                               ;HP:5  move:- fire:6%
 enemy04:                               ;HP:5  move:- fire:6%
-       .db %00010010,%00000011,%00000011
+       .db %00010010,%00000011
 enemy05:                               ;HP:10 move:- fire:25%
 enemy05:                               ;HP:10 move:- fire:25%
-       .db %00100111,%00000100,%00000011
-
-;---------------------------- level data --------------------------------------
-
-Leveldata:                     ;time,enemyclass,ypos
-       .db $0d,$00,$38                 ;first wave (bottom)
-       .db $00,$00,$40
-       .db $00,$00,$48
-       .db $1e,$00,$10                 ;second wave (top)
-       .db $00,$00,$18
-       .db $00,$00,$20
-       .db $1e,$00,$24                 ;third wave (middle)
-       .db $00,$02,$2c
-       .db $00,$00,$34
-
-       .db $0d,$00,$10                 ;top & bottom
-       .db $00,$00,$4a
-       .db $2a,$01,$2d                 ;middle: moving
-       .db $0c,$02,$2d                 ;        3HP
-       .db $0b,$02,$2d                 ;        3HP
-       .db $09,$00,$27                 ;two 1HP behind him
-       .db $00,$00,$33
-       .db $09,$02,$21                 ;two 3HP behind them
-       .db $00,$02,$39
-       .db $09,$02,$1b                 ;and two 3HP behind them
-       .db $00,$02,$3f
-
-       .db $15,$03,$11                 ;one vertical line of 8HPs
-       .db $00,$03,$19
-       .db $00,$03,$21
-       .db $00,$03,$29
-       .db $00,$03,$31
-       .db $00,$03,$39
-       .db $00,$03,$41
-       .db $00,$03,$49
-
-       .db $0c,$02,$11                 ;one vertical line of 3HPs
-       .db $00,$02,$19
-       .db $00,$02,$21
-       .db $00,$02,$29
-       .db $00,$02,$31
-       .db $00,$02,$39
-       .db $00,$02,$41
-       .db $00,$02,$49
-
-       .db $0c,$00,$11                 ;one vertical line of 1HPs
-       .db $00,$00,$19
-       .db $00,$00,$21
-       .db $00,$00,$29
-       .db $00,$00,$31
-       .db $00,$00,$39
-       .db $00,$00,$41
-       .db $00,$00,$49
-
-
-
-
-
-
-
-       .db $f1,$01,$40
-       .db $10,$00,$30
-       .db $10,$02,$20
-       .db $40,$01,$10
-       .db $01,$00,$44
-       .db $15,$01,$31
-       .db $04,$02,$38
-       .db $05,$00,$40
-       .db $03,$00,$2f
-       .db $04,$00,$3a
-       .db $12,$02,$10
-       .db $10,$03,$18
-       .db $0e,$03,$20
-       .db $0c,$03,$28
-       .db $0a,$02,$30
-       .db $08,$02,$38
-       .db $06,$01,$40
-       .db $04,$00,$48
-       .db $2a,$00,$20
-       .db $ff,$ff,$ff
+       .db %00100111,%00000100
+
+;----------------------------- level info -------------------------------------
+
+level01:
+       .db $00,$15,$30                 ;enemy nr ; enemy frequency ; next lvl
+level02:
+       .db $01,$11,$4c
+level03:
+       .db $02,$19,$40
+level04:
+       .db $03,$0f,$50
+level05:
+       .db $04,$2e,$3e
+
+;----------------------------- logo -------------------------------------------
+
+logo_nemesis:
+.db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111000
+.db %01111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00011011,%11111111,%11111111,%11111111,%11110000
+.db %00111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00111011,%11111111,%11111111,%11111111,%11100000
+.db %00011111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%01111011,%11111111,%11111111,%11111111,%11000000
+.db %00000000,%00000000,%00000001,%00011110,%00010000,%00000000,%10000001,%00011110,%00010000,%000000001,%00000000,%00001000,%01000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00000011,%00011110,%00110000,%00000001,%10000011,%00011110,%00110000,%000000011,%00000000,%00011000,%11000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00000111,%00011110,%01110000,%00000011,%10000111,%00011110,%01110000,%000000111,%00000000,%00111001,%11000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000111,%11010001
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00011011
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010101
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010001
 
 ;----------------------------- end --------------------------------------------
 
        .end
 .end
 
 
 ;----------------------------- end --------------------------------------------
 
        .end
 .end
 
+;----------------------------- NEMESIS'86 by Shiar ----------------------------
 
 
+;Game · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · NEMESIS
+;Version  · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 0.6.820
+;Latest modification  · · · · · · · · · · · · · · · · · · · · · · · · 20.IIX.99
+;Calc · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·  TI-86 only
+;Size · · · · · · · · · · · · · · · · · · · · · · · · · · ·  2077 bytes on calc
 
 
+;Author · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · SHIAR
+;ICQ · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·  #43840958
+;E-mail · · · · · · · · · · · · · · · · · · · · · · · · · ·  shiar@wishmail.net
+;Homepage · · · · · · · · · · · · · · · · · · coming soon (www.wish.net/~shiar)
 
 
-;----------------------------- NEMESIS'86 by Shiar ----------------------------
+;Beta:  yes · ·  still to come: lives, armor, powerups, more levels, enemies...
+;Sound:  no · · · · · · · · · · · · don't know if i'll make sounds... we'll see
+;Fun:   yes · · · · · although not yet finished, the game is playable: 5 levels
+;Bugs:  yes  crashes after death; press <EXIT> at GameOver-screen. Send me more
+;Source: no · · · · · · · ·  not yet, will be released when Nemesis is finished
 
 ;----------------------------- version history --------------------------------
 
 
 ;----------------------------- version history --------------------------------
 
@@ -1171,7 +1266,7 @@ Leveldata:                        ;time,enemyclass,ypos
 ;      + shell-icon added (YAS type)
 ;      * code optimizations, some data "compression"
 ;      * explosion looks better, and some vars removed/smaller
 ;      + shell-icon added (YAS type)
 ;      * code optimizations, some data "compression"
 ;      * explosion looks better, and some vars removed/smaller
-;      # enemies are removed if at left side (instead of becoming invisible)
+;      # enemies are removed when at left side (instead of becoming invisible)
 ;      + displays level number before each level begins
 ;
 ; 0.5.725 -- 25.VII.99 -- size 1778
 ;      + displays level number before each level begins
 ;
 ; 0.5.725 -- 25.VII.99 -- size 1778
@@ -1185,5 +1280,21 @@ Leveldata:                       ;time,enemyclass,ypos
 ;      * game over screen will be displayed just *after* your ship's gone
 ;      + frame counter onscreen
 ;
 ;      * game over screen will be displayed just *after* your ship's gone
 ;      + frame counter onscreen
 ;
+; 0.6.820 -- 20.IIX.99 -- size 2152 (2077 on calc)
+;
+;      * play field increased to full screen instead of 3/4
+;      + bottom eight lines used for score (etc) display
+;      - no more solid levels, enemies are placed at random
+;      + enemies appear every x turns (depends on level)
+;      # fixed bullets so they don't disappear at 3/4 of the screen
+;      * A LOT of optimizations both in speed and size!!
+;      + enemy type, frequency, and number specified per level
+;      + bottom score bar displays score, lives and icons (to be used later)
+;      * smarter enemy handling (so enemies have different sizes)
+;      + bottom bar divided from playing field by a horizontal line
+;      + five levels (and five enemies) made
+;      # game vars reset at start and game over
+;      + NEMESIS LOGO displayed at startup!! (also, program grew 350bytes ):
+;      + version/credits string displayed below logo: v0.6.820 by shiar (ICQ#)
 
 ;       + added        - removed       * changed       # bug fixed
 
 ;       + added        - removed       * changed       # bug fixed