version 0.93 (public): (hi)score, better pickup/multiple movement
authorMischa Poslawsky <nemesis@shiar.org>
Sat, 11 Sep 1999 10:07:40 +0000 (12:07 +0200)
committerMischa Poslawsky <nemesis@shiar.org>
Wed, 18 Mar 2009 02:16:59 +0000 (03:16 +0100)
# torpedo-upgrade was cleared when firing torpedo at the end of level
* pickups move half the speed of enemies (one pixel every 2 turns)
# fixed a bug causing some calcs to crash on quit
# contrast was not restored after game over (remained one step darker)
* fire key changed from F1 to 2ND, select key changed from F2 to ALPHA
* improved key-checking procedureS (much faster, smaller, better, yea)
* changed title screen, displays version white on black and my e-mail
+ score count!! simple system: one point for an enemy destroyed, two
  for collision, and 1 point every 256 frames. plus level clear bonus
+ saves HISCORE!!! At game-over screen your and hi-score are displayed
* Game over screen will be displayed before quit after pressing <exit>
+ screen is cleared and cursor moved to top-left on quit
* multiples move only when YOU move, just like the original MSXNemesis
* multiple is placed at your position when selected/at start of level
* minor changes in iconbar (3rd icon is empty, line between 5th/score)

nemesis.txt
nemesis.z80

index 1dfba3cf84ada00ff3710a94c0925af493470ba8..d7b2e48f0a162996800927c687ae38dc4437f1e6 100644 (file)
@@ -1,20 +1,20 @@
              ╔═══════════════════╗
-             ║   N E M E S I S   ║██     Game: Nemesis  version 0.9.94 BETA!!
+             ║   N E M E S I S   ║██     Game: Nemesis  version 0.93.911 BETA!!
              ║───────────────────║██     By:   SHIAR  shiar0@hotmail.com
-             ║ 0.9 BETA by SHIAR ║██                  ICQ #43840958
-             ╚═══════════════════╝██     Size: 2693 on calc
+             ║ 0.93BETA by SHIAR ║██                  ICQ #43840958
+             ╚═══════════════════╝██                  http://come.to/shiar
                █████████████████████     Calc: TI-86 only, for now..
+                                         Size: 3098 bytes on calc
+                           Description: Arcade-game based on an old MSX-game.
+
 
 
 >>>>>>> INTRO TO NEMESIS ------------------------------------------------------
 
   Nemesis is an old arcade-game for the MSX. It was a really good game,
-that's why Konami made three Nemesis games, named Nemesis, Nemesis ][ and
-Nemesis III. This game has got some things in common with each game:
+that's why Konami made three Nemesis games, named Nemesis (1986), Nemesis ][
+(1987) and Nemesis III ('88).
 
-* Nemesis' bad graphics, and worse. But what do you expect of a simple TI86.
-* Nemesis ][ variety of ship-upgrades and cheats (not yet finished: beta v)
-* The BAD storyline of Nemesis 3 (not yet finished: beta version)
 
 >>>>>>> CONTROLS --------------------------------------------------------------
 
@@ -22,41 +22,61 @@ Nemesis III. This game has got some things in common with each game:
 blast 'n evade your way through a lot of enemies. Some enemies leave pickups
 which you can collect in order to power-up your ship. Keys are:
 
-Arrow keys: stupid question, but ok: self-destruct your ship (no, really)
-F1: fire your weapon (bullets are blastalot-class and infinate)
-F2: enable the currently selected upgrade
+Arrow keys: stupid question, self-destructs your ship of course
+2nd: fire your weapon (disruptor as default, upgradable to laserbeam)
+ALPHA: enable the currently selected upgrade
+MORE: pause, press Enter to continue
 EXIT: resets your calc and clears your ROM memory
 
-  No pause key yet. But the game does halt when you press the Down and Left-
-keys simoultaniously. No it's not a bug, I did that on purpose. Just kidding,
-can anybody help me? I also noticed the same problem in Galaxian for the 86.
 
->>>>>>> SCORE-BAR -------------------------------------------------------------
+>>>>>>> PICKUPS AND SO --------------------------------------------------------
+
+  Collect the pickups enemies leave after they're destroyed to upgrade your
+ship. The highlighted icon in the score bar (bottom) can be activated by
+pressing ALPHA. The number in the first icon shows your shield-points left.
+This icon can be chosen more than once, to increase your shield-points.
+
+  Other upgrades: ┌───────┬─────────┬───────┬───────┬───────────┐
+                  │ ARMOR │ TORPEDO │ EMPTY │ LASER │ MULTIPLES │
+                  └───────┴─────────┴───────┴───────┴───────────┘
 
-  The first icon shows your shield-points left (press F2 when you picked one
-pickup to increase shield-points) and the second icon shows whether you have
-torpedoes on your ship (needs two pickups to activate).
+  All upgrades and pickups will be lost when your ship is destroyed!
 
-  I'll make more options later, but as you may or may not know: this is still a
-beta version.
 
 >>>>>>> BETA STUFF ------------------------------------------------------------
 
-  There are just seven levels for now, don't try to get to level eight.
+  There are just eight levels for now, don't try to get to level nine.
 Things to come:
 
-* more levels more enemies more pickups
+* more LEVELS!! more enemies more pickups
 * maybe obstacles?
 * storyline
-* pause- and teacher-key
+* teacher-key or save game
+* save names with hi-score
+* source code release
 
   Send me any IDEAS and BUGS found!! Or send me you like this program, or even
-send me something if you don't. Again: shiar0@hotmail.com, or, even better:
-ICQ #43840958! PLEASE!
+send me something if you don't. Again: shiar0@hotmail.com, or ICQ #43840958!
+PLEASE!
+
+  Tested on TI86es (and emulators) with ROM 1.4 and 1.6 using YAS, Rascall and
+Asm(.
+
 
->>>>>>> DISCLAIMER AND END ---------------------------------------------------
+>>>>>>> CREDITS ---------------------------------------------------------------
+
+  SHIAR                programming and everything else. SHIAR0@HOTMAIL.COM
+  KONAMI           for writing the original Nemesises and more great games
+  FRAGGIE            beta tester #1 and being very positive about the game
+  FREE BIRD             beta tester #2, will help me writing the storyline
+  ELEANOR GILES     for sending me mail / reporting a bug / making my day!
+  JAMES RUBINGH                          sent me an ICQ message, thank you
+
+
+>>>>>>> DISCLAIMER AND END ----------------------------------------------------
 
   Take any program and read the disclaimer. The same thing applies here. Now go
 and play Nemesis and SEND ME SOMETHING!
 
+
 ----------------------------------------------------------------------- <<<<<<<
\ No newline at end of file
index 6fd51d94a616b260ae6d21ca27a1a3d4a8ae6692..1400114e922b272dc283accebccc81c0859cafae 100644 (file)
@@ -1,11 +1,13 @@
        .include "asm86.h"
        .include "ti86asm.inc"
        .include "ram86.inc"
+       .include "ti86abs.inc"
 
        .org _asm_exec_ram
 
 TEXT_MEM = _textShadow
 DELC_LEN = _undelBufLen                ;$64 bytes long
+_dispahl = $4a33
 
         nop
         jp init
@@ -13,7 +15,7 @@ DELC_LEN = _undelBufLen               ;$64 bytes long
        .dw Title               ;pointer to description
        .dw spr_ship            ;pointer to YAS icon
 
-Title: .db "Nemesis v0.92.98 by Shiar",0
+Title: .db "Nemesis v0.93.911 by Shiar",0
 
 just_fired     = TEXT_MEM      ;byte
 temp1          = TEXT_MEM+1    ;word
@@ -66,20 +68,25 @@ LogoLoop:
        dec a                   ;decrease line-counter
        jr nz,LogoLoop          ;repeat when counter is not yet zero
 
-menutext:
-       ld  hl,$1608            ;just below logo
+       ld  hl,VIDEO_MEM+(16*$39)+4     ;$39 rows down, 4 cols right (4*8=$20)
+       ld  b,$8                ;draw 8x one byte = 8*8 = 64 pixels wide
+       ld  a,%11111111         ;horizontal line mask
+underline:
+       ld  (hl),a              ;draw one piece of the divider-line
+       inc hl                  ;move right (8 pixels = 1 byte)
+       djnz underline          ;repeat (16bytes * 8pixels =128= screen width)
+
+       set 3,(iy+5)
+       ld  hl,$3320            ;near the bottom of the screen
        ld  (_penCol),hl
-       ld  hl,txt_about        ;display "by Shiar (ICQ#43840958)"
+       ld  hl,txt_about        ;display version and author (yes, that's me!)
        call _vputs
+       res 3,(iy+5)
 
-       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
+       ld  hl,$3a1e            ;below previous stuff
+       ld  (_penCol),hl
+       ld  hl,txt_email        ;hey, my e-mail address so SEND ME SOMETHING!!
+       call _vputs             ;VERY important, so display in small font ?:}
 
        call _getkey            ;wait for keypress
        call New_game           ;prepare level
@@ -88,14 +95,19 @@ menutext:
 ;---------------------- game loop ---------------------------------------------
 ;------------------------------------------------------------------------------
 
-game_main_loop:
+game_main_loop:                        ;REPEATS FROM HERE EVERY FRAME
        ld  hl,timer            ;update time
        inc (hl)                ;increase by 1
-       ld  b,(hl)              ;new time
+       ld  b,(hl)              ;new time, save for rand# upd. (no flag change)
+       jr  nz,updaterandom     ;continue when new time <> 0
+       ld  hl,1                ;once every 256 frames, increase score by 1
+       call scoreInc           ;do it
 
+updaterandom:
        ld  hl,RanPos           ;random counter
        ld  a,(hl)              ;random value
        add a,b                 ;even more random by adding timer
+.db    $80+7                   ;<add a,r>
        ld  (hl),a              ;save even more random value back
 
 Clear_screen:
@@ -105,33 +117,55 @@ Clear_screen:
        ld  bc,896              ;loop 896 times = (128/8) * (64-8 for scorebar)
        ldir                    ;clear!
 
+check_keys:
+       ld  a,%00111111         ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5)
+       out (1),a               ;ask for them
+       nop \ nop               ;delay 8 clocks
+       in  a,(1)               ;get zem!
+
 check_exitkey:
-       call GET_KEY
-       cp  K_EXIT
-       jr  z,quit
-       cp  K_MORE
-       call z,Pause
-;      ld  a,%00111111         ;<exit> pressed?
-;      out (1),a
-;      nop \ nop
-;      in  a,(1)
-;      bit 6,a                 ;test bit 6 = <EXIT>
-;      jr  z,quit              ;yes: quit game
+       bit 6,a                 ;test bit 6 = exit-key = EXIT
+       jp  z,game_over_nopop   ;<exit> pressed, so be it
+check_morekey:
+       bit 7,a                 ;test bit 7 = more-key = PAUSE
+       call z,Pause            ;yes, go to pause
+
+check_firekey:
+       bit 5,a                 ;test bit 5 = 2nd-key = FIRE
+       ld  hl,game_stuff       ;where to continue after executing Fire_bullet
+       push hl                 ;push hl on stack (instead of call Fire_bullet)
+       jp  z,Fire_bullet       ;fire smtn (bulletstorplasersmultiples+stuff..)
+       pop hl                  ;no call to Fire_bullet made, so pop stack
+       ld  hl,just_fired       ;no:
+       ld  (hl),0              ;reset just_fired
 
 game_stuff:
        call Level_event        ;insert enemies
        call Handle_Ship        ;move you
        call Handle_enemies     ;move enemies
 
-       call Fire_bullet        ;check for fire
+       ld  a,(your_occ)        ;are you 100% OK?
+       or  a                   ;a=0??
+       jr  nz,activesdone      ;then don't check for movements/fires/...
+
+       ld  a,%01011111         ;look at first column of keys (ALPHA to STO)
+       out (1),a               ;gimme gimme
+       nop \ nop               ;what's taking you so long
+       in  a,(1)               ;at last... our precious keyzzz...
+                               ;old: <bit 7,a \ call z,select> now see this:
+       rla                     ;test bit 7 so we know f ALPHA has been pressed
+       call nc,select          ;yeppy, select the currently selected upgrade
+       call Enemies_hit        ;check for collision with enemies
+
+activesdone:
        call Handle_bullets     ;move your bullets
        call Handle_torp        ;move your torpedo
        call Enemy_bullets      ;move enemy bullets
-       call Enemies_hit        ;check for collision with enemies
 
        call Display_Screen     ;display all
-       halt \ halt             ;delay
-       jr   game_main_loop     ;loop
+       halt                    ;delay
+
+       jr   game_main_loop     ;LOOP
 
 ;--------------------------- pause --------------------------------------------
 
@@ -149,9 +183,11 @@ pause:
 ;--------------------------- exit ---------------------------------------------
 
 quit:
+       call _clrLCD            ;clears screen
+       call _homeup            ;set cursor to top-left
        ld  a,(CONTRAST)        ;load original contrast level
        out (2),a               ;and set it back
-       ld  (iy+13),6
+       ld  (iy+13),6           ;restore system-flags
        ret                     ;quit Nemesis :(
 
 ;--------------------------- display ------------------------------------------
@@ -168,8 +204,7 @@ displayloop:
 
        ld  hl,$396b            ;Display Score
        ld  (_penCol),hl        ;bottom right of screen
-       ld  hl,(timer)
-       ld  h,0
+       ld  hl,(score)
 
 _D_HL_DECI:            ;------- display 5-digit value -------
        ld   de,savestr+4       ;savenr saves number string
@@ -185,7 +220,7 @@ ldhld:      call UNPACK_HL          ;one digit of hl
        ret
 
 savestr:
-       .db "SHIAR",0
+       .db "00000",0
 
 ;------------------------- handle ship ----------------------------------------
 
@@ -208,6 +243,19 @@ ok:
        out (1),a
        ld  hl,y                ;instead of nop\nop do something usefull
        in  a,(1)
+
+       ld  b,a                 ;push a (keys)
+       xor %11111111           ;inverted a = 0 if arrow-key has been pressed
+       ld  a,(your_multiples)
+       jr  z,no_adv            ;if so, leave the multiples where they are
+       or  %100                ;set move bit
+       jr  adv_ok
+no_adv:
+       and %11111011           ;reset move bit
+adv_ok:
+       ld  (your_multiples),a
+       ld  a,b                 ;pop a (keys)
+
        rra                     ;rotate right (put last bit in c)
        ld  b,a                 ;we need a
 
@@ -269,16 +317,22 @@ handle_multiples:
        call putsprite          ;display your ship
 
        ld  a,(your_multiples)  ;do you have multiples
-       or  a                   ;no?
+       ld  b,a                 ;save a for 2nd check
+       and %11                 ;no? (last two bits = nr of multiples)
        ret z                   ;then don't handle them either
 
+       ld  hl,y
+       ld  a,b                 ;restore a (your_multiples)
+       and %100                ;move the multiples???
+       jr  z,mult_adv          ;nope, just let them (saves (y) in y, (x) in x)
+
        ld  hl,your_locpos      ;location to save this position
        ld  a,(hl)              ;load a
        inc a                   ;a=a+1
        and %00001111           ;if a>15 then a=a-16
        ld  (hl),a              ;save new a
        add a,a                 ;a=a*2
-       ld  c,a                 ;de=a
+       ld  c,a                 ;bc=2a
        ld  b,0
 
        ld  hl,your_prevpos     ;previous positions
@@ -294,6 +348,8 @@ handle_multiples:
        ld  a,(x)               ;load new x-pos
        ld  (hl),a              ;save that too
 
+mult_adv:
+ ld de,(mx)
        ld  ix,spr_multiple     ;sprite of the multiple
        jp  putsprite           ;display it + <ret>
 
@@ -333,23 +389,21 @@ no_armor:
        ld  (your_occ),a        ;set to explode
        ret
 
-;------------------------- fire bullet ----------------------------------------
+;------------------------- place multiples ------------------------------------
 
-Fire_bullet:
-       ld  a,(your_occ)        ;are you 100% OK?
-       or  a                   ;a=0??
-       ret nz                  ;return if not normal stat
+Place_multiples
+       ld  (mx),de             ;set last multiple-position
+       ld  hl,your_prevpos     ;place all previous positions
+       ld  b,16                ;all 16 of them
+place_multiples:
+       ld  (hl),d              ;set prev-x to d
+       inc hl                  ;next
+       ld  (hl),e              ;set prev-y to e
+       inc hl                  ;next
+       djnz place_multiples    ;repeat
+       ret
 
-       ld  a,%00111111         ;function keys (F1-F5)
-       out (1),a               ;ask for them
-       nop \ nop               ;delay 8 clocks
-       in  a,(1)               ;get zem!
-       bit 4,a                 ;test bit 4 = F1-key
-       jr  z,fire              ;fire pressed?
-       ld  hl,just_fired
-       ld  (hl),0              ;no: reset just_fired
-       bit 3,a                 ;test bit 3 = F2-key
-       ret nz                  ;return if not
+;------------------------- select upgrade -------------------------------------
 
 select:
        ld  hl,your_pickup      ;select pickups
@@ -385,12 +439,17 @@ select5:
        ld  (hl),a              ;reset pickups
        inc a
        ld  (your_multiples),a
+       ld  de,(x)
+       call Place_multiples
        jp  disp_icons          ;display, return
 select6:
        ld  (hl),0              ;reset pickups
        jp  disp_icons          ;display/return
 
-fire:  ld  hl,RanPos           ;random
+;------------------------- fire bullet ----------------------------------------
+
+Fire_bullet:
+       ld  hl,RanPos           ;random
        inc (hl)                ;update random counter
 
        ld  hl,just_fired
@@ -407,8 +466,8 @@ fireOK:
        ld  hl,(x)              ;yes: first fire from ship position (x)
        ld  (firex),hl          ;set firepos
        ld  a,(your_multiples)  ;any multiples?
-       dec a                   ;nope?
-       jr  nz,fireany          ;then just fire somethin'
+       and %11                 ;nope?
+       jr  z,fireany           ;then just fire somethin'
        call fireany            ;and blast
        ld  hl,(my)             ;then, fire from multiple position (mx)
        ld  a,(mx)              ;<ex h,l>
@@ -635,6 +694,9 @@ pickupdone:
        ld  (pickuptimer),a     ;save new enemiescounter value
        inc hl
        ld  (hl),$00            ;explosionFrame 0
+
+       ld  hl,1                ;increase score by one
+       call scoreInc
        jp  (ix)
 
 hpleft:
@@ -930,12 +992,17 @@ normal_enemy:                     ;occ "normal" 2 or "moving" 3
 
        dec hl                  ;@x
        ld  (hl),d              ;store new x
-
-check_enemyfire:
        ld  a,c                 ;a = enemy type
        or  a                   ;type 0? (pickup)
-       jr  z,firing_done       ;pickups don't fire
+       jr  nz,check_enemyfire  ;no, a normal enemy; let em fire
+       ld  a,(timer)           ;load time
+       and %1                  ;move left once every 2 turns
+       jr  z,firing_done       ;don't move now
+       inc d                   ;increase x-position (don't move this turn)
+       inc (hl)                ;and save it
+       jr  firing_done         ;continue
 
+check_enemyfire:
        ld  bc,add2enemy+1-2    ;offset of <xtra enemy info: fire>
        add hl,bc               ;go there (@hl)
        dec (hl)                ;decrease counter till next blast
@@ -1016,10 +1083,6 @@ movedown:
 ;--------------------------- check collision ----------------------------------
 
 Enemies_hit:
-       ld  a,(your_occ)
-       or  a                   ;0 = you're normal
-       ret nz
-
        ld  de,(x)              ;e = X, d = Y
        ld  hl,enemies
        ld  b,nrenemies         ;check all 20 enemies
@@ -1064,6 +1127,12 @@ collide_enemy:
 
 take_pickup:
        ld  a,(hl)              ;load enemy type
+
+       push hl                 ;we need hl
+       ld   hl,2               ;increase score by 2
+       call scoreInc
+       pop  hl                 ;we're done
+
        or  a
        jr  nz,collide          ;enemy when <>0
 
@@ -1101,13 +1170,23 @@ check_next:
        djnz check_collision
        ret
 
+;--------------------------- update score -------------------------------------
+
+scoreInc:
+       push bc
+       ld  bc,(score)
+       add hl,bc
+       ld  (score),hl
+       pop bc
+       ret
+
 ;--------------------------- show icon ----------------------------------------
 
 disp_icons:
        ld  hl,VIDEO_MEM+(16*57);57 rows down = seven rows from bottom
        ld  b,16*7              ;draw 16x (screen width) 7x (height)
+       xor a                   ;blank line mask
 cleanline:
-       ld  a,%00000000         ;blank line mask
        ld  (hl),a              ;draw one piece of the divider-line
        inc hl                  ;move right (8 pixels = 1 byte)
        djnz cleanline          ;repeat (16bytes * 7rows * 8pixels)
@@ -1118,7 +1197,7 @@ cleanline:
        call disp_lives
 
        ld  ix,spr_icon01       ;armorIcon
-       ld  de,$1a01            ;icon #1
+       ld  de,$1901            ;icon #1
        call putwidesprite      ;display icon
        call disp_armor         ;display value
 
@@ -1128,11 +1207,11 @@ cleanline:
        jr  z,no_torp
        ld  ix,spr_icon02       ;torpedoIcon
 no_torp:
-       ld  de,$2a01            ;icon #2
+       ld  de,$2901            ;icon #2
        call putwidesprite      ;display
 
-       ld  ix,spr_icon00       ;
-       ld  de,$3a01            ;icon #3
+       ld  ix,spr_icon03       ;emptyIcon
+       ld  de,$3901            ;icon #3
        call putwidesprite
 
        ld  ix,spr_icon00       ;emptyIcon
@@ -1141,16 +1220,20 @@ no_torp:
        jr  z,no_laser
        ld  ix,spr_icon04       ;laserIcon
 no_laser:
-       ld  de,$4a01            ;icon #4
+       ld  de,$4901            ;icon #4
        call putwidesprite
 
        ld  ix,spr_icon00       ;emptyIcon
        ld  a,(your_multiples)
-       or  a
+       and %11
        jr  z,no_multiples
        ld  ix,spr_icon05
 no_multiples:
-       ld  de,$5a01            ;icon #5
+       ld  de,$5901            ;icon #5
+       call putwidesprite
+
+       ld  ix,spr_icon03
+       ld  de,$6901
        call putwidesprite
 
        ld  a,(your_pickup)     ;pickups taken
@@ -1159,8 +1242,8 @@ no_multiples:
        add a,a                 ;picks*4
        add a,a                 ;picks*8
        add a,a                 ;picks*$10
-       add a,$0a               ;add 0ah
-       ld  d,a                 ;y-pos = picks * $10 + $0a (1a,2a,3a,4a,5a)
+       add a,$09               ;add 0ah
+       ld  d,a                 ;y-pos = picks * $10 + $0a (19,29,39,49,59)
        ld  e,$01               ;x-pos = bottom (1a01,2a01,3a01,4a01,5a01)
 
        ld  ix,spr_icon
@@ -1168,7 +1251,7 @@ no_multiples:
        ret
 
 disp_armor:
-       ld  hl,$3926            ;Display Armor left
+       ld  hl,$3925            ;Display Armor left
        ld  (_penCol),hl        ;place @ armorIcon
        ld  a,(your_armor)      ;load armor left
        add a,'0'               ;make digit
@@ -1192,25 +1275,80 @@ disp_lives:
        ret
 
 ;--------------------------- game over / new game / death ---------------------
+own_name:
+       .db $12,7,"nemesis"
+
+save_hi:
+       ld   hl,own_name        ; Find own variable
+       xor  a
+       call _ABS_MOV10TOOP1
+       call _FINDSYM
+       ret  c                  ; If not found, give up
+
+        ld  a,b                        ; Save the stored section
+        ld  h,d
+        ld  l,e
+        ld  b,0
+        ld  de,4+stored_data_start-_asm_exec_ram
+        add hl,de
+        adc a,b
+        call _SET_ABS_DEST_ADDR
+        ld   a,0
+        ld   hl,stored_data_start
+        call _SET_ABS_SRC_ADDR
+        ld   hl,stored_data_end-stored_data_start
+        call _SET_MM_NUM_BYTES
+        call _mm_ldir
+
+       ret
 
 game_over:
+       pop hl                  ;=ret (game_over was called from a procedure)
+game_over_nopop:
        call _clrLCD            ;clear screen
        ld  hl,$0603
        ld  (_curRow),hl        ;center
        ld  hl,txt_gameover
        call _puts              ;display "GAME OVER"
 
+       xor  a                  ;clear a (AHL will be displayed)
+       ld   hl,$1006           ;bottom-1 right
+       ld   (_curRow),hl       ;set
+       ld   hl,(score)         ;your score
+       call _dispahl           ;display it (a=0)
+       ld  hl,$314b            ;bottom-1 right before score ^^
+       ld  (_penCol),hl        ;set
+       ld  hl,txt_score        ;"Score"
+       call _vputs             ;display (small)
+
+       ld   hl,$1007           ;bottom right
+       ld   (_curRow),hl       ;set
+       ld   hl,(hiscore)       ;hi-score
+       call _dispahl           ;display
+       ld  hl,$3946            ;bottom right before hiscore ^^
+       ld  (_penCol),hl        ;set
+       ld  hl,txt_hiscore      ;"Hiscore"
+       call _vputs             ;display (small)
+
+       ld  de,(score)
+       ld  hl,(hiscore)
+       call CP_HL_DE
+       jr  nc,no_hiscore
+       ld  (hiscore),de
+
+no_hiscore:
+       call save_hi
+
        ld  b,$20
 wait2: halt \ halt
        djnz wait2              ;delay
        call _getkey            ;wait for keypress
-
-       pop hl                  ;=ret (game_over was called from a procedure)
-       ret                     ;quit to TI-OS or shell
+       jp  quit                ;restore some things and return to TI-OS/shell
 
 New_game:
        xor a                   ;score 0
        ld  (score),a           ;reset score
+       ld  (score+1),a         ;reset score
        inc a                   ;level #1
        ld  (level),a           ;reset level nr
        ld  hl,level01          ;set level pointer to level#1
@@ -1237,13 +1375,22 @@ You_die:
 
 Next_level:
        ld  hl,level            ;level number
-       inc (hl)                ;increase it
+       ld  a,(hl)
+       inc a
+       ld  (hl),a
+
        ld  hl,(levelp)         ;level pointer
        inc hl
        inc hl
        inc hl                  ;update to point to next level
        ld  (levelp),hl         ;save
 
+       ld  h,0                 ;increase score....
+       ld  l,a                 ;by level number
+       ld  bc,20
+       add hl,bc               ;plus 20
+       call scoreInc           ;update score
+
 nonext_level:
        ld  a,80
        ld  (nextevent),a       ;time to first enemy appearance
@@ -1270,18 +1417,13 @@ nonext_level:
        ld  (hl),24             ;...=24=middle
 
        ld  a,(torp_occ)
-       and %00000001           ;remove torpedoes
-       ld  (torp_occ),a
+       or  a                   ;no torpedoes?
+       jr  z,torpsclear        ;then just continue (=0)
+       ld  a,1                 ;if so, set to "ready to fire" (=1)
+torpsclear:
 
-       xor a                   ;reset previous positions
-       ld  hl,your_prevpos     ;place all previous positions
-       ld  b,16                ;all 16 of them
-place_multiples:
-       ld  (hl),a              ;set prev-x to 0
-       inc hl                  ;next
-       ld  (hl),24             ;set prev-y to 24
-       inc hl                  ;next
-       djnz place_multiples    ;repeat
+       ld  de,$0018            ;x=0, y=24 (like you..)
+       call Place_multiples    ;place all multiple-positions at (0,24)
 
        ld  hl,ybullets         ;clear your/enemy bullets
        ld  (hl),a              ;clear first byte
@@ -1352,8 +1494,8 @@ wait:     halt \ halt
 
        ld  hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom
        ld  b,16                ;draw 16x (screen width)
-drawline:
        ld  a,%11111111         ;horizontal line mask
+drawline:
        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)
@@ -1642,7 +1784,7 @@ spr_explosion:
 ;--------------------------------------- bar -----------------------------------
 
 spr_icon:
-       .db 16,7        ;unused   .......:.......:
+       .db 16,7        ;selected .......:.......:
        .db %11111111,%11111111 ; ████████████████
        .db %11000000,%00000001 ; ██             █
        .db %11000000,%00000001 ; ██             █
@@ -1678,14 +1820,14 @@ spr_icon02:
        .db %10011000,%11110101 ; █  ██   ████ █ █
        .db %11100110,%00110010 ; ███  ██   ██  █
 spr_icon03:
-       .db 16,7        ;         .......:.......:
-       .db %10000000,%01010100 ; █
-       .db %10011110,%00101010 ; █
-       .db %10111000,%00010101 ; █
-       .db %10111111,%10101010 ; █
-       .db %10111111,%00010101 ; █
-       .db %10111000,%00101010 ; █
-       .db %10011110,%01010100 ; █
+       .db 16,7        ;empty    .......:.......:
+       .db %10000000,%00000000 ; █
+       .db %10000000,%00000000 ; █
+       .db %10000000,%00000000 ; █
+       .db %10000000,%00000000 ; █
+       .db %10000000,%00000000 ; █
+       .db %10000000,%00000000 ; █
+       .db %10000000,%00000000 ; █
 spr_icon04:
        .db 16,7        ;laser    .......:.......:
        .db %10000000,%00000000 ; █
@@ -1697,29 +1839,27 @@ spr_icon04:
        .db %10000000,%00000000 ; █
 spr_icon05:
        .db 16,7        ;multiple .......:.......:
-       .db %10000011,%10000000 ; █     ███
-       .db %10000001,%11100111 ; █      ████  ███
-       .db %10000001,%11100000 ; █      ████
-       .db %10000011,%10000000 ; █     ███
-       .db %10011000,%00000000 ; █  ██
-       .db %10111100,%01110000 ; █ ████   ███
-       .db %10011000,%00000000 ; █  ██
+       .db %10000011,%10000000 ; █     ███      
+       .db %10000001,%11100110 ; █      ████  ██ 
+       .db %10000001,%11100000 ; █      ████    
+       .db %10000011,%10000000 ; █     ███      
+       .db %10011000,%00000000 ; █  ██          
+       .db %10111100,%11000011 ; █ ████  ██    ██
+       .db %10011000,%00000000 ; █  ██          
 
 ;---------------------------- texts -------------------------------------------
 
-txt_about:     .db "v0.92.98 ","by Shiar  "
-               .db "(ICQ#43840958)",0
-txt_1player:   .db "1 PLAYER",0
-txt_2players:  .db "2 PLAYERS",0
+txt_about:     .db " v0.93.911",127,"by Shiar",0
+txt_email:     .db "shiar0@hotmail.com",0
 txt_level:     .db "LEVEL ",0
 txt_gameover:  .db "GAME OVER!",0
+txt_score:     .db "Score",0
+txt_hiscore:   .db "Hiscore",0
 txt_lives:     .db "Lx0?",0
 txt_pressenter:        .db "Enter to continue",0
 
 ;---------------------------- save data ---------------------------------------
 
-stored_data_start:
-
 PutWhere       .dw GRAPH_MEM           ;where to put the wide sprites
 
 timer          .db $00                 ;frame counter
@@ -1730,9 +1870,12 @@ 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
-pickuptimer    .db $4
+pickuptimer    .db $04
 
 score          .dw $0000
+stored_data_start:
+hiscore                .dw $0000
+stored_data_end:
 
 your_pickup    .db $00
 your_occ       .db $00                 ;0=normal 1..16=exploding
@@ -1763,9 +1906,9 @@ sprites:
 spr_enemy00:
        .db 7,5         ;pickup
        .db %11111110   ; ███████
-       .db %10011010   ; █  ██ █
        .db %11111110   ; ███████
-       .db %10011010   ; █  ██ █
+       .db %11000110   ; ██   ██
+       .db %11111110   ; ███████
        .db %11111110   ; ███████
 spr_enemy01:
        .db 6,6         ;enemy type one
@@ -1835,10 +1978,10 @@ enemy04:                        ;#4     HP:2    app:lure
        .db %00000110,4,2,0
 enemy05:                       ;#5     HP:2    app:random      moving
        .db %00000111,5,1,0
-enemy06:                       ;#6     HP:2    app:lure        moving
-       .db %00000111,6,2,0
-enemy07:                       ;#7     HP:4    app:halflure    moving
-       .db %00001111,7,3,0
+enemy06:                       ;#6     HP:3    app:lure        moving
+       .db %00001011,6,2,0
+enemy07:                       ;#7     HP:6    app:halflure    moving
+       .db %00010111,7,3,0
 
 ;----------------------------- level info -------------------------------------
 
@@ -1847,15 +1990,15 @@ level01:
 level02:                               ;frequency must be odd if halfluring!
        .db $02,$11,$4b
 level03:
-       .db $03,$1d,$3f
+       .db $03,$1f,$3f
 level04:
        .db $04,$0d,$4f
 level05:
-       .db $05,$25,$3d
+       .db $05,$23,$3d
 level06:
-       .db $06,$23,$39
+       .db $06,$1f,$39
 level07:
-       .db $07,$1f,$f9
+       .db $07,$1d,$f9
 
 ;----------------------------- logo -------------------------------------------
 
@@ -1888,19 +2031,19 @@ logo_nemesis:
 ;----------------------------- NEMESIS'86 by Shiar ----------------------------
 
 ;Game · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · NEMESIS
-;Version  · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 0.92.98
-;Latest modification  · · · · · · · · · · · · · · · · · · · · · · · · · 7.IX.99
+;Version  · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·  0.93.911
+;Latest modification  · · · · · · · · · · · · · · · · · · · · · · · ·  11.IX.99
 ;Calc · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·  TI-86 only
-;Size · · · · · · · · · · · · · · · · · · · · · · · · · · ·  2935 bytes on calc
+;Size · · · · · · · · · · · · · · · · · · · · · · · · · · ·  3098 bytes on calc
 
 ;Author · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · SHIAR
-;ICQ · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·  #43840958
+;ICQ  · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · #43840958
 ;E-mail · · · · · · · · · · · · · · · · · · · · · · · · · ·  shiar0@hotmail.com
-;Homepage · · · · · · · · · · · · · · · · · · coming soon (www.wish.net/~shiar)
+;Homepage · · · · · · · · · · · · · · · · · · · · · · · · · · · · come.to/shiar
 
 ;Notes:
 ;  <*> This game is not yet finished (BETA) and there may still be some bugs.
-;  <*> Source will be released when the game has been finished.
+;  <*> I'll probably release the source when the game has been finished.
 ;  <*> Have fun, and have even more fun with the completed version of NEMESIS!
 
 ;----------------------------- version history --------------------------------
@@ -1951,7 +2094,7 @@ logo_nemesis:
 ;      * game over screen will be displayed just *after* your ship's gone
 ;      + frame counter onscreen
 ;
-; 0.6.820 -- 20.IIX.99 -- size 2077
+; 0.6.820 -- 20.IIX.99 -- size 2077 -- MAJOR UPGRADE first release (not on web)
 ;
 ;      * play field increased to full screen instead of 3/4
 ;      + bottom eight lines used for score (etc) display
@@ -1968,14 +2111,14 @@ logo_nemesis:
 ;      + NEMESIS LOGO displayed at startup!! (also, program grew 350bytes ):
 ;      + version/credits string displayed below logo: v0.6.820 by shiar (ICQ#)
 ;
-; 0.6.825 -- 25.IIX.99 -- size 2085
+;0.61.825 -- 25.IIX.99 -- size 2085 -- small changes to v0.6
 ;
 ;      # pointer to fifth ship corrected (ships in level 5 weren't displayed)
 ;      # calc doesn't crash anymore when game is continued after game over!!
 ;      + lives are decreased when ship is destroyed
 ;      # last eight pixels of divider line are shown correctly now
 ;
-;  0.7.92 -- 02.IX .99 -- size 2303
+;  0.7.92 -- 02.IX .99 -- size 2303 -- optimizations and pickups
 ;
 ;      + contrast is increased one level at startup (and restored on exit)
 ;      + invulnerable for a sec when you enter the game (inv-pickup later)
@@ -1990,7 +2133,7 @@ logo_nemesis:
 ;      # code optimization caused some bullets to reappear as "fake" bullets
 ;      * pickups can't be destroyed by bullets (they pass right through it)
 ;
-;  0.8.93 -- 03.IX .99 -- size 2433
+;  0.8.93 -- 03.IX .99 -- size 2433 -- small improvements and bugfixes
 ;
 ;      + enemies move individually, not all at the same time!! Looks very nice
 ;      # titlescreen background is cleared (looked weird in Rascall and TI-OS)
@@ -2000,7 +2143,7 @@ logo_nemesis:
 ;      # xtraInfo data wasn't reset when a moving enemy entered the game
 ;      * longer delay when level is completed (NextLevel screen came too soon)
 ;
-;  0.9.94 -- 04.IX .99 -- size 2693
+;  0.9.94 -- 04.IX .99 -- size 2693 -- FIRST MAJOR (BETA) RELEASE; on websites
 ;
 ;      # pickups no longer fire bullets like normal enemies
 ;      + <halt>s added so the game runs slower and looks better
@@ -2017,7 +2160,7 @@ logo_nemesis:
 ;      * of course optimizations and a few tiny bug fixes (not important)
 ;      * increased the size of the enemy bullets so they're better to see
 ;
-; 0.91.95 -- 05.IX .99 -- size 2797
+; 0.91.95 -- 05.IX .99 -- size 2797 -- good improvements (upgrades); beta rel.
 ;
 ;      + LASERS!!!!! four pickups and you fire laserbeams instead of bullets
 ;      * multiple enemies can be hit at once, very usefull when firing lasers
@@ -2027,16 +2170,33 @@ logo_nemesis:
 ;        instead of in program, saving A LOT of bytes in program-size
 ;      - at release of 0.91 bullets didn't work, laser is used instead
 ;
-; 0.92.98 -- 08.IX .99 -- size 2831
+; 0.92.98 -- 08.IX .99 -- size 2831 -- beta released to testers
 ;
 ;      + all bullets and enemies are removed at the start of a level
 ;      # you can fire bullets again (no more laser at startup)
-;      * game delay is increased (one halt more) so it runs slower
 ;      * pickups aren't given at random, but appear every x enemies destroyed
 ;      # solved a minor bug in invulnerability flashing display
 ;      * clearScreen procedure improved (faster and smaller)
 ;      # fifth icon couldn't be selected (so no multiples selectable). fixed
 ;      * laserbeam lasts 5 turns (laser wasnt good enough compared to bullets)
+;
+;0.93.911 -- 11.IX .99 -- size 3098
+;
+;      # torpedo-upgrade was cleared when firing torpedo at the end of a level
+;      * pickups move away half the speed of enemies (one pixel every 2 turns)
+;      # fixed a bug causing some calcs to crash on quit
+;      # contrast was not restored after game over (remained one step darker)
+;      * fire key changed from F1 to 2ND, select key changed from F2 to ALPHA
+;      * improved key-checking procedureS (much faster, smaller, better, yea)
+;      * changed title screen, displays version white on black and my e-mail
+;      + score count!! simple system: one point for an enemy destroyed, two
+;        for collision, and one point every 256 frames. plus level clear bonus
+;      + saves HISCORE!!! At game-over screen your- and hi-score are displayed
+;      * Game over screen will be displayed before quit after pressing <exit>
+;      + screen is cleared and cursor moved to top-left on quit
+;      * multiples move only when YOU move, just like the original MSX-Nemesis
+;      * multiple is placed at your position when selected/at start of level
+;      * minor changes in iconbar (3rd icon is empty, line between 5th/score)
 
 
 ;       + added        - removed       * changed       # bug fixed