version 1.0: weapon updates, start ti-83 version master
authorMischa Poslawsky <nemesis@shiar.org>
Thu, 21 Dec 2000 21:37:36 +0000 (22:37 +0100)
committerMischa Poslawsky <nemesis@shiar.org>
Wed, 18 Mar 2009 04:27:50 +0000 (05:27 +0100)
+ does NOT display Done after running in TI-OS! (anti-teacher ;)
* storyline completed (probably the crappiest story ever!)
# only first byte of ship's sprite altered; now loads whole word
- tail beam removed (up double only); odd ships now contain laser
# fixed laserbeam display when firing at right edge
# star relocation altered to work correctly w/ new screen location
# halfluring wasn't 50% (more like 75%) since random enemy spawning
* restored multiples for bullets (since it's unlikely you'll select 1)
# fixed mem overlapping causing "weird stuff" when moving multiples
# bullets fired below screen bottom are moved up onto screen
+ SOURCE ALSO TI-83 COMPATIBLE (still few bugs like hiscore, bullets)
# upgrading beam weapon removed multiples
# clipping at left side wrong in TI-83 version fixed

nemesis.txt
nemesis.z80

index e7ff9a06a74dd330d10848c52c7fb6eb954878ff..b6426d60c9828c3c07d458edbf8cf537cdf201b9 100644 (file)
 ------------------------------------------------------------------------------
 
  Title                         : Nemesis
 ------------------------------------------------------------------------------
 
  Title                         : Nemesis
- Version                       : 1.0.A23 Beta
- Release Date                  : 23.X.00
- Filename                      : nemesis.86p (size 7212)
+ Version                       : 1.0.111 Beta
+ Release Date                  : 11.I.01
+ Filename                      : nemesis.86p (size 6785)
  Author                        : Shiar
  Email Address                 : shiar0@hotmail.com
  Web Page                      : http://www.shiar.org
  Description                   : cool arcade-shoot-em-up-game
  Where to get this game        : www.shiar.org | ticalc.org
  Author                        : Shiar
  Email Address                 : shiar0@hotmail.com
  Web Page                      : http://www.shiar.org
  Description                   : cool arcade-shoot-em-up-game
  Where to get this game        : www.shiar.org | ticalc.org
- Other games by author         : Worm
-
+ Other games by author         : Wormy
 
 >>>>>>> NOTE ON V.99 ---------------------------------------------------------
 
 
 >>>>>>> NOTE ON V.99 ---------------------------------------------------------
 
@@ -33,7 +32,6 @@ to me. Thanks, and have fun!
 
   (No comments on levels, storyline and difficulty plz, working on that)
 
 
   (No comments on levels, storyline and difficulty plz, working on that)
 
-
 >>>>>>> INTRO TO NEMESIS -----------------------------------------------------
 
   Nemesis is an old arcade-game for many platforms, originally for arcades.
 >>>>>>> INTRO TO NEMESIS -----------------------------------------------------
 
   Nemesis is an old arcade-game for many platforms, originally for arcades.
@@ -41,15 +39,12 @@ I first played Nemesis III for the MSX (1988), but Konami made at least
 41 Nemesis-games - named Nemesis=Gradius, LifeForce=Salamander, Parodius -
 for systems including the C64, Game Boy, (S)NES and PlayStation(2).
 
 41 Nemesis-games - named Nemesis=Gradius, LifeForce=Salamander, Parodius -
 for systems including the C64, Game Boy, (S)NES and PlayStation(2).
 
-
 >>>>>>> THA GAME -------------------------------------------------------------
 
   After selecting NEW GAME, you have to choose your ship to fly with. Note
 the last two are HARDCORE-ships, which have a lot less armor than the others.
 >>>>>>> THA GAME -------------------------------------------------------------
 
   After selecting NEW GAME, you have to choose your ship to fly with. Note
 the last two are HARDCORE-ships, which have a lot less armor than the others.
-
   Before a level starts, you can press [F1] to save the game. If you choose
 CONTINUE GAME later, you'll start at that level.
   Before a level starts, you can press [F1] to save the game. If you choose
 CONTINUE GAME later, you'll start at that level.
-
   In the game itself you just have to keep yourself from getting destroyed.
 The following keys might come in handy:
 
   In the game itself you just have to keep yourself from getting destroyed.
 The following keys might come in handy:
 
@@ -63,63 +58,54 @@ The following keys might come in handy:
   At the bottom you can see the current power of your weapon, your lives left,
 armor left, your upgrades and score.
 
   At the bottom you can see the current power of your weapon, your lives left,
 armor left, your upgrades and score.
 
-
 >>>>>>> UPGRADES -------------------------------------------------------------
 
   Flying over a small pickup will increase your armor and activate the shield
 for a short time. The shield will reduce any damage, and completely absorb
 enemy bullets in normal mode.
 >>>>>>> UPGRADES -------------------------------------------------------------
 
   Flying over a small pickup will increase your armor and activate the shield
 for a short time. The shield will reduce any damage, and completely absorb
 enemy bullets in normal mode.
-
   After defeating a boss, a larger pickup will appear, which you can use to
 upgrade your ship. These upgrades are:
 
   1 - BEAM: The standard weapon all vessels are equipped with. Selecting this
 icon will upgrade your weapon to a more powerful one. This can only be done
 nine times.
   After defeating a boss, a larger pickup will appear, which you can use to
 upgrade your ship. These upgrades are:
 
   1 - BEAM: The standard weapon all vessels are equipped with. Selecting this
 icon will upgrade your weapon to a more powerful one. This can only be done
 nine times.
-
   2 - LASER: A direct weapon which replaces the beam-weapon. Can also be
 upgraded upto nine times.
   2 - LASER: A direct weapon which replaces the beam-weapon. Can also be
 upgraded upto nine times.
-
-  3 - TAILBEAM / UP DOUBLE: Depending on the vessel you fly with, this
-activates either a tail beam (a bullet going backwards) or up double (bullet
-going up 45 degrees). This extra weapon is only available when your ship is
-equipped with a beam weapon.
-
-    - MULTIPLES: or "options". Will be selected if you've got lasers. These
-will follow your ship and fire when you do, effectively doubling your damage.
-You can have four of them.
-
+  3 - MULTIPLES: or "options". These will follow your ship and fire when you
+do, effectively doubling your damage. You can have as much as four of them.
   4 - SCORE: If you collect four pickups, your score will be increased by 250
 points. This is for the real hardcore shmuppers who don't need no skinkin'
 upgrades.
 
   4 - SCORE: If you collect four pickups, your score will be increased by 250
 points. This is for the real hardcore shmuppers who don't need no skinkin'
 upgrades.
 
-
 >>>>>>> BETA STUFF -----------------------------------------------------------
 
   Continue to send me any IDEAS and BUGS found!! Or send me you like this
 >>>>>>> BETA STUFF -----------------------------------------------------------
 
   Continue to send me any IDEAS and BUGS found!! Or send me you like this
-program, or even send me something if you don't. Again: shiar@mailroom.com,
+program, or even send me something if you don't. Again: shiar0@hotmail.com,
 PLEASE!
 
 PLEASE!
 
-  Tested on TI86es and emulators with ROM 1.2, 1.4 and 1.6 using YAS,
-Rascall and Asm(. Nemesis will NOT run correctly under RASCALL with the
-memory LOCKED! Besides that there shouldn't be any bugs.
+  Tested on TI86es and emulators with ROM 1.2, 1.4 and 1.6 using Asm(,
+YAS (recommended), Rascall, ASE and iShell.  TI83 with ROM 1.10 and Ion 1.6.
+- Nemesis will NOT run correctly under RASCALL with the memory LOCKED!
+- There could be problems with ASE (ase crashing after running). I don't know
+   for sure yet, still working on it.
+- The TI-83 version will crash about every five seconds. Still in development.
+Besides that there shouldn't be any bugs.
 
   Version 1.0 will probably have 13 levels, NO bugs (depending on how good
 you betatest-guys do your job :P) and the source will be included. It will
 
   Version 1.0 will probably have 13 levels, NO bugs (depending on how good
 you betatest-guys do your job :P) and the source will be included. It will
-NOT feature multiplayer or greyscale graphics.
-
+NOT (never) feature multiplayer or greyscale graphics.
 
 >>>>>>> CREDITS --------------------------------------------------------------
 
   Programming/levels/gfx     - SHIAR
   Official betatesters       - DAVE -- BLACKBELT -- MATTHEW DALE
 
 >>>>>>> CREDITS --------------------------------------------------------------
 
   Programming/levels/gfx     - SHIAR
   Official betatesters       - DAVE -- BLACKBELT -- MATTHEW DALE
+                               ALLEN -- DAISUKE NUNOME -- JASON TAN
   Support (advise/ideas/etc) - JONAH -- SCABBY -- BRIAN KOROPOFF
   Original engine (Galaxian) - PATRICK DAVIDSON
   Original Nemesises         - KONAMI
 
 Also alot of thanks to EVERYBODY WHO SENT ME SOMETHING and everybody I forgot.
 
   Support (advise/ideas/etc) - JONAH -- SCABBY -- BRIAN KOROPOFF
   Original engine (Galaxian) - PATRICK DAVIDSON
   Original Nemesises         - KONAMI
 
 Also alot of thanks to EVERYBODY WHO SENT ME SOMETHING and everybody I forgot.
 
-
 >>>>>>> RULEZ AND REGULATIONS ------------------------------------------------
 
 * Thou shalt not hold me responsible for damage to your calc or anything else
 >>>>>>> RULEZ AND REGULATIONS ------------------------------------------------
 
 * Thou shalt not hold me responsible for damage to your calc or anything else
@@ -128,5 +114,4 @@ Also alot of thanks to EVERYBODY WHO SENT ME SOMETHING and everybody I forgot.
 * Thou shalt not ask money for this program
 * Thou shalt eat plenty of vegetables every day
 
 * Thou shalt not ask money for this program
 * Thou shalt eat plenty of vegetables every day
 
-
 ---------------------------------------------------------------------- <<<<<<<
\ No newline at end of file
 ---------------------------------------------------------------------- <<<<<<<
\ No newline at end of file
index 495d581bc5298180ca76eaab912e02fd8c311ebd..f0a5bb193c3fe2166a774d961dfecdea8dc08c40 100644 (file)
-;----------------------------------------------------------------------------
-;-------------------------------- NEMESIS -----------------------------------
-;----------------------------------------------- cool arcade-shoot-em-up-game
+;-----------------------------------------------------------------------------
+;----------------------------  N E M E S I S  --------------------------------
+;------------------------------------------------ cool arcade-shoot-em-up-game
+
+; ---------  Version                   -                  1.01.314  ---------
+; ---------  Release Date              -             2002 March 14  ---------
+; ---------  Author(s)                 -                     Shiar  ---------
+; ---------  Email Address             -         nemesis@shiar.org  ---------
+; ---------  Web Page                  -             www.shiar.org  ---------
+; ---------  Description               -   cool shoot-em-up arcade  ---------
+; ---------  Where to get this game    -                 shiar.org  ---------
+; ---------  Other games by author(s)  -                     Wormy  ---------
+
+;   ----------------------------------------------------------------------
+;   --- This source should only be used for learning practises, do not ---
+;   --- alter it, and certainly never  distribute an altered version!! ---
+;   ----------------------------------------------------------------------
+
+;---------------------- nemesis.z80 start ------------------------------------
+
+ #define       TI86 ;TI83
+
+ #define       cal     call    ;just to make it harder for you to understand
+ #define       rcl     call    ;RemoteCaLl / RomCalL
+ #define       rjp     jp      ;RomJumP
+ #define       dnz     djnz    ;Dec&Jump while NonZero becomes Do w.Non-Zero
+ #define       psh     push    ; >:->
+
+#ifdef TI83 ;-----------------------------------------------------------------
+#include       "ion.inc"       ;standard TI-83 ROMcalls (Ion shell)
+
+ #define       halt    or a
+
+scrwidth       = 12
+
+#define        teacherkey      ;compiled with teacher key: 92 bytes extra
+
+VIDEO_MEM      = plotsscreen
+dispbuffer     = VIDEO_MEM     ;virtual screen (MUST be mod$400=0!!)
+
+BUSY_OFF       = _indicatorOff
+_curRow        = currow
+_curCol        = curcol
+_penCol        = pencol
+;_clrLCD       = _clrlcdf      ;clears screen
+_clrScrn       = _clrscrf      ;also clears TEXT_MEM
+_clrWindow     = _clrscrf
+GET_KEY         = $4014        ;_getcsc
+CONTRAST       = contrast
+_dispahl       = _disphl
+UNPACK_HL       = $4008        ;_divhlby10
+CP_HL_DE       = _cphlde
+Lpi            = $C4
+Lneg           = $1A
+K_DOWN         = 1
+K_LEFT         = 2
+K_RIGHT        = 3
+K_UP           = 4
+K_ENTER        = 9
+K_DEL          = $20
+K_ALPHA        = $30 ;48
+K_F1           = $35 ;Y=
+K_SECOND       = $36 ;54
+K_EXIT         = $37 ;Mode
+kEnter         = 5
+kGrMenu        = 44
+
+storepos       = saferam2      ;<1024 bytes needed to store things
+
+       .org progstart
+
+        ret
+        jr nc,init
+Title: .db "Nemesis 83 TEST by SHIAR",0
+#endif ;----------------------------------------------------------------------
+
+
+#ifdef TI85 ;-----------------------------------------------------------------
+#include       "usgard.h"      ;usgard shell
+
+scrwidth       = 16
+
+;#define       clearbuffer     ;clears the display buffer after usage
+;#define       fixkeys         ;fixes left+down bug: 47 bytes extra size
+;#define       teacherkey      ;compiled with teacher key: 92 bytes extra
+;#define       story           ;storyline shown (w/ neat effect): 871 bytes
+;#define       shiscore        ;save hiscore/savegame
+;#define       invertable
 
 
-;------- by SHIAR | shiar0@hotmail.com | icq#43840958 | www.shiar.org -------
+dispbuffer     = $8400 ;$C9FA  ;virtual screen (MUST be mod$400=0!!)
+                       ;8100-8C00
+;_clrWindow    = $4a86         ;_clrLCD and _clrScrn
+;_ex_ahl_bde   = $45f3         ;exchange values between AHL and BDE
+;_shracc               = $4383         ;like _shlacc but just the opposite :P
+;_dispahl      = $4a33         ;display value in ahl <100000 (cheap TI)
+;_asapvar      = $d6fc         ;our own variable name (likely "nemesis")
 
 
-;!!! This source should only be used for learning practises, do not !!!
-;!!! alter it, and certainly never  distribute an altered version!! !!!
+storepos       = TEXT_MEM      ;<1024 bytes needed to store things
+saferam1       = DELC_MEM
 
 
-;TO DO:  levels 12 and 13 | draw bosses 12 and 13 (41/42)
+       .org 0
+Title: .db "Nemesis 85 Alpha"  ;Usgard description
+;      .db " - 4 Nunome",0     ;present
+       .db " by SHIAR",0       ;author
+#endif ;----------------------------------------------------------------------
 
 
-;---------------------- nemesis.z80 start -----------------------------------
 
 
+#ifdef TI86 ;-----------------------------------------------------------------
 #include       "asm86.h"
 #include       "ti86asm.inc"   ;standard ti86 romcalls
 #include       "ti86abs.inc"   ;used to save hiscores and stuff
 
 #include       "asm86.h"
 #include       "ti86asm.inc"   ;standard ti86 romcalls
 #include       "ti86abs.inc"   ;used to save hiscores and stuff
 
-       .org _asm_exec_ram
-
-#define                  cal   call    ;just to make it harder for you to understand
-#define                  psh   push    ; ^:D
-#define                  dnz   djnz    ;Dec&Jump while NonZero becomes Do w.Non-Zero
+scrwidth       = 16
 
 
-#define          teacherkey    ;compiled with teacher key: 88 bytes extra
+;#define       clearbuffer     ;clears the display buffer after usage
+#define        fixkeys         ;fixes left+down bug: 47 bytes extra size
+#define        teacherkey      ;compiled with teacher key: 92 bytes extra
+;#define       story           ;storyline shown (w/ neat effect): 871 bytes
+#define        shiscore        ;save hiscore/savegame
+#define        invertable
 
 dispbuffer     = $8400 ;$C9FA  ;virtual screen (MUST be mod$400=0!!)
 
 dispbuffer     = $8400 ;$C9FA  ;virtual screen (MUST be mod$400=0!!)
-
+                       ;8100-8C00
 _clrWindow     = $4a86         ;_clrLCD and _clrScrn
 _ex_ahl_bde    = $45f3         ;exchange values between AHL and BDE
 _shracc                = $4383         ;like _shlacc but just the opposite :P
 _dispahl       = $4a33         ;display value in ahl <100000 (cheap TI)
 _asapvar       = $d6fc         ;our own variable name (likely "nemesis")
 
 _clrWindow     = $4a86         ;_clrLCD and _clrScrn
 _ex_ahl_bde    = $45f3         ;exchange values between AHL and BDE
 _shracc                = $4383         ;like _shlacc but just the opposite :P
 _dispahl       = $4a33         ;display value in ahl <100000 (cheap TI)
 _asapvar       = $d6fc         ;our own variable name (likely "nemesis")
 
-storepos       = _asm_exec_ram+7000    ;1024 bytes needed to store things
+storepos       = _asm_exec_ram+7800    ;<1024 bytes needed to store things
+                                       ;$F5C0..F9C0 (safe mem D748..FA6F)
+
+       .org _asm_exec_ram
+
+        nop                    ;hello yas/ase/rascall/whathever
+        jp init                ;here's the program, but first: a description
+       .dw $0001               ;description type 2 (description + YASicon)
+       .dw Title               ;pointer to description (all shells)
+       .dw Icon                ;pointer to YAS icon
+
+Title: .db "Nemesis v1.0.C21"  ;Ashell/Rascall/YAS/any shell description
+;      .db " - 4 Nunome",0     ;present
+       .db " by SHIAR",0       ;author
+
+Icon:  .db 8,1                 ;icon for YAS: width = 1byte; height = 7bytes
+       .db %11100000           ; ███
+       .db %01111000           ;  ████
+       .db %00111110           ;   █████
+       .db %01111001           ;  ████  █
+       .db %00111110           ;   █████
+       .db %01111000           ;  ████
+       .db %11100000           ; ███             ;recommend 80x50 screen mode
+       .db 0                   ;YAS 0.92 compatibility
+#endif ;----------------------------------------------------------------------
 
 
-;---------------------- in-game vars ----------------------------------------
+;---------------------- in-game vars -----------------------------------------
 
 just_fired     = storepos              ;  +0   ;counts how long a blast lasts
 
 just_fired     = storepos              ;  +0   ;counts how long a blast lasts
+#ifdef shiscore
 hiscorepos     = storepos              ;  +0   ;entering hiscore name
 hiscorepos     = storepos              ;  +0   ;entering hiscore name
+#endif
 
 x              = storepos+1            ;  +1   ;your ship's position
 y              = x+1                   ;  +2   ;your y-pos
 
 x              = storepos+1            ;  +1   ;your ship's position
 y              = x+1                   ;  +2   ;your y-pos
@@ -45,59 +167,72 @@ firey              = firex+1               ;  +4   ;(1 byte)
 
 eventleft      = firey+1               ;  +5   ;nr. of enemies still to come
 level_enemy    = eventleft+1           ;  +6   ;enemy type
 
 eventleft      = firey+1               ;  +5   ;nr. of enemies still to come
 level_enemy    = eventleft+1           ;  +6   ;enemy type
-level_info     = level_enemy+1         ;  +7   ;ceiling/ground (%00) present
+level_info     = level_enemy+1         ;  +7   ;ground (%0) present
 spacespace     = level_info+1          ;  +8
 spacespace     = level_info+1          ;  +8
-groundinfo     = spacespace+1          ;  +9
-stars1         = groundinfo+1          ; +10   ;slow stars byte  (<< %1)
-stars2         = stars1+1              ; +11   ;fast stars byte (<<< %1)
-groundpos      = stars2+1              ; +12   $10
-ceilingpos     = groundpos+16          ; +28   $10
+stars1         = spacespace+1          ;  +9   ;slow stars byte  (<< %1)
+stars2         = stars1+1              ; +10   ;fast stars byte (<<< %1)
+groundpos      = stars2+1              ; +11   $10
 nrstars1       = 10
 nrstars1       = 10
-starx1         = ceilingpos+16         ; +44   ;20
+starx1         = groundpos+16          ; +27   ;20
 nrstars2       = 10
 nrstars2       = 10
-starx2         = starx1+(nrstars1*2)   ; +64   ;20
+starx2         = starx1+(nrstars1*2)   ; +47   ;20
 
 mm             = 4                             ;max. number of multiples
 
 mm             = 4                             ;max. number of multiples
-your_prevpos   = starx2+(nrstars2*2)   ; +84   ;14*mm+2 ;previous positions
+your_prevpos   = starx2+(nrstars2*2)   ; +67   ;14*mm+2 ;previous positions
 
 
 
 
-enemies                = storepos+200          ;+200   ;info about each enemy
+enemies                = your_prevpos+(mm*14+4);+125   ;info about each enemy
 enemysize      = 11                            ;infobytes per enemy
 nrenemies      = 16                            ;max. nr of enemies
 
 enemysize      = 11                            ;infobytes per enemy
 nrenemies      = 16                            ;max. nr of enemies
 
+#ifdef TI86
 ybullets       = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,damg,x,y)
 ybullets       = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,damg,x,y)
-nrybuls                = 128                   ;+376\
-ebullets       = ybullets+(nrybuls*4)  ;+888   ;30 bytes = 10(state,x,y)
+#else
+ybullets       = saferam1
+#endif
+nrybuls                = 128                   ;+301
+ebullets       = ybullets+(nrybuls*4)  ;+813   ;30 bytes = 10(state,x,y)
 nrebuls                = 48
 nrebuls                = 48
-lvlenemies     = ebullets+(nrebuls*3)  ;-1032
+lvlenemies     = ebullets+(nrebuls*3)  ;-957
 
 ;enemies:
 ;      [HP64] [000000:HP left 00:(00=no enemy 01=exploding 1X=normal)]
 
 ;enemies:
 ;      [HP64] [000000:HP left 00:(00=no enemy 01=exploding 1X=normal)]
-;      [ship sprite (DW!) or explosion frame] [x] [y] [movetype] [movecounter]
-;      [firecounter] [firefreq] [firetype]
+;      [ship sprite (DW!) or explosion frame] [x] [y] [movetype]
+;      [movecounter] [firecounter] [firefreq] [firetype]
 
 
-;---------------------- introduction ----------------------------------------
+;---------------------------- save data --------------------------------------
 
 
-        nop                    ;hello yas/ase/rascall/whathever
-        jp init                ;here's the program, but first: a description
-       .dw $0001               ;description type 2 (description + YASicon)
-       .dw Title               ;pointer to description (all shells)
-       .dw Icon                ;pointer to YAS icon
+;#ifdef shiscore
+storehi_start:
+hiscore                .dw 0                   ;default hiscore
+hiname         .db "by shiar",0,0      ;   "       "    name
+storehi_end:
+;#endif
 
 
-Title: .db "Nemesis v1.0.A23 by SHIAR",0
+invertmode:     cpl ;/or a             ;saves B<>W mode setting        cpl
 
 
-Icon:  .db 8,1                 ;icon for YAS: width = 1byte; height = 7bytes
-       .db %11100000           ; ███
-       .db %01111000           ;  ████
-       .db %00111110           ;   █████
-       .db %01111001           ;  ████  █
-       .db %00111110           ;   █████
-       .db %01111000           ;  ████
-       .db %11100000           ; ███             ;recommend 80x50 screen mode
-       .db 0                   ;YAS 0.92 compatibility
+storesave_start:                       ;--SAVED GAME--                 defs:
+your_ship      .dw spr_ship03          ;your sprite (^invertmode^)     sprs1
+level          .db  4                  ;level number                   1
+levelp         .dw level05             ;pointer to level data          lev00
+pickuptimer    .db  4                  ;counts when to place a pickup  4
+your_score     .dw  0                  ;current score                  0
+your_pickup    .db  3                  ;pickups already picked up      0
+your_occ       .db  0                  ;0=normal 1..16=exploding       0
+your_shield    .db  0                  ;invincibility left             0
+your_armor     .db 24                  ;HP left                        24
+your_lives     .db  3                  ;lives left                     3
+your_weapon    .db 3                   ;current weapon upgrade         0
+your_multiples .db  0                  ;multiples present              0
+your_extra     .db  0                  ;extra beam present             0
+hardcore       .db  0                  ;hardcore mode if non-0         0
+storesave_end:
 
 
-;---------------------- init ------------------------------------------------
+time2invert:   .db 0                   ;time until b<>w switch (0 at startup)
+;45+31=76
+;---------------------- init -------------------------------------------------
 
 
+#ifdef fixkeys
 int_handler:                   ;new interrupt proc
        ex  af,af'              ;just af only (no need for exx)
        in  a,($03)             ;read bit 3 port 3
 int_handler:                   ;new interrupt proc
        ex  af,af'              ;just af only (no need for exx)
        in  a,($03)             ;read bit 3 port 3
@@ -106,14 +241,32 @@ int_handler:                      ;new interrupt proc
        res 0,a                 ;yes: then we have a problem (freeze), so...
        out ($03),a             ;...mask the ON key interrupts!
        jp  $0039               ;all done, return
        res 0,a                 ;yes: then we have a problem (freeze), so...
        out ($03),a             ;...mask the ON key interrupts!
        jp  $0039               ;all done, return
-int_end:
+int_end:                       ;(size 15 bytes)
+#endif
 
 
-init:  cal BUSY_OFF            ;turns the run-indicator off, obviously
-       cal _clrScrn            ;clean the screen
-       xor a                   ;ld a,0
+init:  rcl BUSY_OFF            ;turns the run-indicator off, obviously
+#ifdef TI83
+       ld  (iy+13),0
+       res 6,(iy+9)            ;TI-83 uses statmem
+       set textwrite,(iy+20)   ;write text to gbuf
+       rcl _clrLCD
+#endif
+#ifdef TI86
        res 2,(iy+13)           ;don't scroll the screen
        res 2,(iy+13)           ;don't scroll the screen
-       cal _flushallmenus      ;remove TI menus
+       rcl _flushallmenus      ;remove TI-86 menus
+       rcl _clrScrn            ;clean the screen
+       ld  hl,$8200
+       ld  c,10
+_clrmem:
+       ld  b,0
+clrmem:        ld  (hl),-1
+       inc hl
+       djnz clrmem
+       dec c
+       jr  nz,_clrmem
+#endif
 
 
+#ifdef fixkeys
 FixKeys:                       ;fixes some key problems like left+down bug
        im  1
        ld  a,$D4
 FixKeys:                       ;fixes some key problems like left+down bug
        im  1
        ld  a,$D4
@@ -133,49 +286,57 @@ FixKeys:                  ;fixes some key problems like left+down bug
        inc a                   ;ld a,$D4
        ld  i,a
        im  2
        inc a                   ;ld a,$D4
        ld  i,a
        im  2
+#endif
 
 
-;---------------------- main menu -------------------------------------------
+;---------------------- main menu --------------------------------------------
 
 LogoPut:
        xor a                   ;white bitmask (a=0)
        ld  hl,logo_nemesis     ;from...
 
 LogoPut:
        xor a                   ;white bitmask (a=0)
        ld  hl,logo_nemesis     ;from...
-       ld  de,VIDEO_MEM+16     ;...to one line from top
+       ld  de,VIDEO_MEM+scrwidth;...to one line from top
+#ifdef TI86
        ld  b,e                 ;ld b,16: one line
        ld  b,e                 ;ld b,16: one line
+#else
+       ld  b,scrwidth
+#endif
 AboveLogo:
        ld  (de),a              ;clear/n byte
        inc de                  ;next
        dnz AboveLogo           ;repeat for the first line
 AboveLogo:
        ld  (de),a              ;clear/n byte
        inc de                  ;next
        dnz AboveLogo           ;repeat for the first line
-       ld  bc,16*19            ;logo size
+       ld  bc,scrwidth*19      ;logo size
        ldir                    ;display one line of logo
 
        ldir                    ;display one line of logo
 
-       ld  hl,16*$33+VIDEO_MEM ;$33 rows down
-       ld  b,16*7              ;draw black 7 lines
+       ld  hl,scrwidth*$33+VIDEO_MEM   ;$33 rows down
+       ld  b,scrwidth*7        ;draw black 7 lines
        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)
        dnz underline           ;repeat
        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)
        dnz underline           ;repeat
+#ifdef TI83
+       cal fastCopy            ;draw buffer on screen
+#endif
 
        ld  hl,_txt_email       ;at the very bottom of tha screen
        ld  (_penCol),hl
        ld  hl,txt_email        ;hey, my e-mail address so SEND ME SOMETHING!!
 
        ld  hl,_txt_email       ;at the very bottom of tha screen
        ld  (_penCol),hl
        ld  hl,txt_email        ;hey, my e-mail address so SEND ME SOMETHING!!
-       cal _vputs              ;VERY important, so display in small font ?:}
+       rcl _vputs              ;VERY important, so display in small font ?:}
 
        set 3,(iy+5)            ;set white on black
        ld  de,_txt_about       ;near the bottom of the screen
        ld  (_penCol),de        ;hl=txt_email++=txt_about
 
        set 3,(iy+5)            ;set white on black
        ld  de,_txt_about       ;near the bottom of the screen
        ld  (_penCol),de        ;hl=txt_email++=txt_about
-       cal _vputs              ;display version + me
+       rcl _vputs              ;display version + me
        res 3,(iy+5)            ;return to default black on white
 
 dispmenu:
        ld  de,$0304
        ld  (_curRow),de
        ld  hl,txt_menu1        ;NEW GAME
        res 3,(iy+5)            ;return to default black on white
 
 dispmenu:
        ld  de,$0304
        ld  (_curRow),de
        ld  hl,txt_menu1        ;NEW GAME
-       cal _puts
+       rcl _puts
        ld  de,$0305
        ld  (_curRow),de
        ld  hl,txt_menu2        ;CONTINUE GAME
        ld  de,$0305
        ld  (_curRow),de
        ld  hl,txt_menu2        ;CONTINUE GAME
-       cal _puts
+       rcl _puts
 
 menuloop:
        ld  a,0                 ;current menu item (0 or 1); 0 by default
 
 menuloop:
        ld  a,0                 ;current menu item (0 or 1); 0 by default
@@ -185,13 +346,13 @@ menuitem =$-1
        ld  l,a                 ;y-coord. = sel menu item + 4 = 4/5
        ld  (_curRow),hl        ;set position
        ld  a,5                 ;'*'
        ld  l,a                 ;y-coord. = sel menu item + 4 = 4/5
        ld  (_curRow),hl        ;set position
        ld  a,5                 ;'*'
-       cal _putmap             ;mark selected menu item
+       rcl _putmap             ;mark selected menu item
 
        ld  a,l                 ;y-pos 4/5
        xor 1                   ;invert (4=5; 5=4)
        ld  (_curRow),a         ;set new row position
        ld  a,32                ;' ' (empty, just remove any * present)
 
        ld  a,l                 ;y-pos 4/5
        xor 1                   ;invert (4=5; 5=4)
        ld  (_curRow),a         ;set new row position
        ld  a,32                ;' ' (empty, just remove any * present)
-       cal _putc
+       rcl _putc
 
        cal getsomekeys         ;read keys (z if enter/2nd pressed)
        ld  hl,menuitem
 
        cal getsomekeys         ;read keys (z if enter/2nd pressed)
        ld  hl,menuitem
@@ -230,6 +391,7 @@ do_invert:                  ;invert screen (b<>w)
        pop hl
        ret
 
        pop hl
        ret
 
+#ifdef invertable
 mode_invert:
        ld  hl,invertmode       ;change invert mode (will be stored)
        ld  a,$98
 mode_invert:
        ld  hl,invertmode       ;change invert mode (will be stored)
        ld  a,$98
@@ -241,10 +403,11 @@ mode_invert:
        ld  hl,4+invertmode-_asm_exec_ram
        psh hl                  ;src
        jp  storesmtn
        ld  hl,4+invertmode-_asm_exec_ram
        psh hl                  ;src
        jp  storesmtn
+#endif
 
 
-;----------------------------------------------------------------------------
-;---------------------- game loop -------------------------------------------
-;----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
+;---------------------- game loop --------------------------------------------
+;-----------------------------------------------------------------------------
 
 game_main_loop:                        ;REPEATS FROM HERE EVERY FRAME
        ld  hl,timer            ;update time
 
 game_main_loop:                        ;REPEATS FROM HERE EVERY FRAME
        ld  hl,timer            ;update time
@@ -254,7 +417,7 @@ Clear_screen:
        ld  hl,dispbuffer       ;move from (hl) = top left
        ld  (hl),0              ;first pixel will be copied all over the screen
        ld  de,dispbuffer+1     ;(de) = next pixel, thus clearing whole screen
        ld  hl,dispbuffer       ;move from (hl) = top left
        ld  (hl),0              ;first pixel will be copied all over the screen
        ld  de,dispbuffer+1     ;(de) = next pixel, thus clearing whole screen
-       ld  bc,16*56-1          ;loop 896 times = (128/8) * (64-8 for scorebar)
+       ld  bc,scrwidth*56-1    ;loop 896 times = (128/8) * (64-8 for scorebar)
        ldir                    ;all clear!
 
        ld  a,0                 ;current frame/turn 0-255
        ldir                    ;all clear!
 
        ld  a,0                 ;current frame/turn 0-255
@@ -275,9 +438,7 @@ movestarsdone:
 
        ld  a,(level_info)      ;level info
        rra                     ;ground present? (%1)
 
        ld  a,(level_info)      ;level info
        rra                     ;ground present? (%1)
-       jr  nc,game_stuff       ;no, so both non-present
-       rra                     ;bit representing the presence of any ceiling
-       cal nz,Handle_ceiling   ;scroll the ceiling (if any) +check4collision
+       jr  nc,game_stuff       ;no, continue game
        cal Handle_ground       ;scroll the ground and check if we're dead
 
 game_stuff:
        cal Handle_ground       ;scroll the ground and check if we're dead
 
 game_stuff:
@@ -336,9 +497,18 @@ _gamestuff1:
        cal Level_event         ;insert enemies
        cal Display_Screen      ;display all
 
        cal Level_event         ;insert enemies
        cal Display_Screen      ;display all
 
+#ifdef TI86
 delay:
        halt                    ;delay and preserve batteries :)
 delay:
        halt                    ;delay and preserve batteries :)
-       jp  game_main_loop      ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+#else                          ;halt doesn't work on TI-83
+       ld  b,0
+delay:
+       xor 1
+       and 1
+       jr  z,delay
+       dnz delay       
+#endif
+       jp  game_main_loop      ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 ;------- weapon -------
 
 
 ;------- weapon -------
 
@@ -368,16 +538,24 @@ weapdamage =$-1
 
 
 disp_charge:                   ;display charge bar
 
 
 disp_charge:                   ;display charge bar
-       ld  hl,(58*16)+VIDEO_MEM+3
-       ld  b,3
+#ifdef TI86
+       ld  hl,(58*scrwidth)+VIDEO_MEM+3
+       ld  b,3                 ;bar width 3
+#else
+       ld  hl,(58*scrwidth)+VIDEO_MEM+2
+       ld  b,2                 ;bar width 1.5
+#endif
 chargebarclr:
        dec hl
 chargebarclr:
        dec hl
-       ld  (hl),0
+       ld  (hl),0              ;clear (previous) bar
        dnz chargebarclr
 
        ld  a,(weapincs)        ;load bar size (0-80)
        srl a                   ;half the size (0-40)
        srl a                   ;again half that size (0-20 pixels)
        dnz chargebarclr
 
        ld  a,(weapincs)        ;load bar size (0-80)
        srl a                   ;half the size (0-40)
        srl a                   ;again half that size (0-20 pixels)
+#ifdef TI83
+       srl a                   ;and again if 83 (smaller screen)
+#endif
        ld  c,a                 ;psh a
        srl a                   ;/2
        srl a                   ;/4
        ld  c,a                 ;psh a
        srl a                   ;/2
        srl a                   ;/4
@@ -402,13 +580,16 @@ chargebarready:                   ;               (an if B=3 then a=%11100000)
        ld  (hl),a              ;draw this last byte
        ret
 
        ld  (hl),a              ;draw this last byte
        ret
 
-;--------------------------- ground -----------------------------------------
+spr_bossA2:                    ;the following 51 bytes also function as the
+       .db 8,51                ; sprite for boss A2 (the fullscreen asteroid)
+
+;--------------------------- ground ------------------------------------------
 
 Handle_ground:
        ld  a,(timer)
        and %111                ;once every 8 frames
        jr  nz,Display_ground   ;otherwise skip the scroll
 
 Handle_ground:
        ld  a,(timer)
        and %111                ;once every 8 frames
        jr  nz,Display_ground   ;otherwise skip the scroll
-       ld  bc,15               ;scroll all 16 bytes minus one (teh new byte)
+       ld  bc,scrwidth-1       ;scroll all 16 bytes minus one (teh new byte)
        ld  hl,groundpos+1      ;from..
        ld  de,groundpos        ;to (one byte to the left)
        ldir                    ;LoaDIncreaseRepeat = scroll!
        ld  hl,groundpos+1      ;from..
        ld  de,groundpos        ;to (one byte to the left)
        ldir                    ;LoaDIncreaseRepeat = scroll!
@@ -422,9 +603,10 @@ Handle_ground:
        dec a                   ;a=-2..2
        ld  b,a
        add a,(hl)              ;substract to spacesize
        dec a                   ;a=-2..2
        ld  b,a
        add a,(hl)              ;substract to spacesize
-       cp  57
-       jr  nc,newground        ;if nothing left then don't change
+       cp  128
+       jr  c,newground         ;if nothing left then don't change
        ld  c,a
        ld  c,a
+       ld  a,d                 ;current grond height
        add a,b                 ;add offset (2 higher/lower) => new position
        or  a                   ;=0?
        jr  z,newground         ;may not be 0 (=256)
        add a,b                 ;add offset (2 higher/lower) => new position
        or  a                   ;=0?
        jr  z,newground         ;may not be 0 (=256)
@@ -437,10 +619,10 @@ newground:
        ld  (groundpos+15),a    ;save new byte on the right
 
 Display_ground:
        ld  (groundpos+15),a    ;save new byte on the right
 
 Display_ground:
-       ld  b,16                ;screen width
+       ld  b,scrwidth          ;screen width
        ld  de,groundpos-1      ;height of current byte (previous actually)
        psh de                  ;use later
        ld  de,groundpos-1      ;height of current byte (previous actually)
        psh de                  ;use later
-       ld  hl,dispbuffer+(56*16)-1 ;screen position
+       ld  hl,dispbuffer+(56*scrwidth)-1 ;screen position
        psh hl
 
 groundloopright:
        psh hl
 
 groundloopright:
@@ -451,7 +633,7 @@ groundloopright:
        ld  a,(de)              ;height of current byte
        ld  b,a                 ;save in b
 
        ld  a,(de)              ;height of current byte
        ld  b,a                 ;save in b
 
-       ld  de,-16              ;to substract to go one line up
+       ld  de,-scrwidth        ;to substract to go one line up
        ld  a,%11111111         ;bitmask black
 groundloopup:
        ld  (hl),a              ;display black byte
        ld  a,%11111111         ;bitmask black
 groundloopup:
        ld  (hl),a              ;display black byte
@@ -480,90 +662,7 @@ CheckGround:                       ;check for collision with the ground
        ld  b,auch_ground
        jp  damage_you
 
        ld  b,auch_ground
        jp  damage_you
 
-;--------------------------- ceiling ----------------------------------------
-
-Handle_ceiling:
-       ld  a,(timer)
-       and %111                ;once every 8 frames
-       jr  nz,Display_ceiling  ;otherwise skip the scroll
-       ld  bc,15               ;scroll all 15 bytes (16th is new position)
-       ld  hl,ceilingpos+1     ;from..
-       ld  de,ceilingpos       ;to (one byte to the left)
-       ldir                    ;LoaDIncreaseRepeat = scroll!
-
-       ld  a,(ceilingpos+14)
-       ld  d,a                 ;d=new ceiling
-       ld  hl,spacespace
-
-       ld  bc,$201             ;range=1..3
-       cal Random              ;a=1-3
-       dec a
-       jr  z,newceiling        ;1:same
-       dec a
-       jr  z,ctunnelup         ;2:up
-ctunneldown:                   ;3:down
-       ld  a,(hl)
-       or  a                   ;(spacespace)=0:
-       jr  z,newceiling+2      ;keep same ceiling
-       inc (hl)
-       inc d
-       jr  newceiling
-ctunnelup:
-       ld  a,1
-       cp  d                   ;if size=1 then don't
-       jr  z,newceiling
-       dec d
-       dec (hl)
-newceiling:
-       ld  a,d
-       ld  (ceilingpos+15),a   ;save the new byte
-
-Display_ceiling:
-       ld  b,16                ;screen width
-       ld  de,ceilingpos-1     ;height of current byte
-       psh de                  ;use later
-       ld  hl,dispbuffer-17    ;screen position
-       psh hl
-
-ceilingloopright:
-       ld  c,b                 ;push b for ceilingloopdown
-       pop hl \ inc hl         ;get screen position and go one right
-       pop de \ inc de         ;get height info and set to the next byte
-       psh de \ psh hl         ;save these for the next time
-       ld  a,(de)              ;height of current byte
-       ld  b,a                 ;save in b
-
-       ld  de,16               ;to substract to go one line up
-       ld  a,%11111111         ;bitmask black
-       or  a
-ceilingloopdown:
-       ld  (hl),a              ;display black byte
-       add hl,de               ;go down
-       dnz ceilingloopdown     ;and loop >ceilingpos< times
-
-       ld  b,c                 ;pop b used by ceilingloopdown
-       dnz ceilingloopright    ;loop right for entire screen (16x)
-       pop hl \ pop hl         ;restore stack
-
-CheckCeiling:                  ;check for collision with the ceiling
-       ld  a,(x)               ;your x
-       srl a                   ;x/2
-       srl a                   ;x/4
-       srl a                   ;x/8 (current ceiling-byte)
-       inc a                   ;correction
-
-       ld  l,a                 ;hl = a
-       ld  h,0                 ;"
-       ld  de,ceilingpos       ;first ceiling-byte
-       add hl,de               ;current ceiling-byte
-       ld  a,(y)               ;your y-pos
-       inc a
-       cp  (hl)                ;compare with ceiling
-       ret nc                  ;carry if ceiling is above you
-       ld  b,auch_ground
-       jp  damage_you          ;otherwise you don't wanna be in that ship
-
-;--------------------------- move stars -------------------------------------
+;--------------------------- move stars --------------------------------------
 
 DisplayStars:                  ;inputs: hl=starx# a=stars# b=nrstars#
        ld  e,(hl)
 
 DisplayStars:                  ;inputs: hl=starx# a=stars# b=nrstars#
        ld  e,(hl)
@@ -588,7 +687,7 @@ movestars1:
        ld  a,(timer)
        rra
        ld  a,(stars1)
        ld  a,(timer)
        rra
        ld  a,(stars1)
-       ret c
+       ret c                   ;once every other turn...
        rlca
        ld  (stars1),a
        ret nc
        rlca
        ld  (stars1),a
        ret nc
@@ -596,41 +695,42 @@ movestars1:
 
 movestars_loop:
        ld  h,(ix+1)
 
 movestars_loop:
        ld  h,(ix+1)
-       ld  l,(ix)
-       dec hl
+       ld  l,(ix)              ;star (ix) pos in hl
+       dec hl                  ;one byte left (hl--)
 
 
-       ld  a,l
-       and %00001111
-       cp  (dispbuffer&15)-1   ;$C9FAand15-- = 9
-       jr  nz,newstarok
-       cal RandomY
+       ld  a,dispbuffer/256-1  ;screen high byte minus one (it may be equal)
+       cp  h                   ;compare w/ star high byte
+       jr  c,newstarok         ;screen<star: still on screen
+       cal RandomY             ;otherwise create new position hl
 
 newstarok:
 
 newstarok:
-       ld  (ix),l
+       ld  (ix),l              ;save star's new position (ix)=hl
        ld  (ix+1),h
        ld  (ix+1),h
-       inc ix \ inc ix
-       dnz movestars_loop
-       ret                     ;for stupid people, here's another comment...
+       inc ix \ inc ix         ;next star (2 bytes/star)
+       dnz movestars_loop      ;repeat for each star
+       ret                     ;...here's another comment... :P
 
 
-;--------------------------- pause ------------------------------------------
+;--------------------------- pause -------------------------------------------
 
 Pause:
        ld  hl,_txt_pause
        ld  (_penCol),hl
        ld  hl,txt_pause
 
 Pause:
        ld  hl,_txt_pause
        ld  (_penCol),hl
        ld  hl,txt_pause
-       cal _vputs              ;display small font
+       rcl _vputs              ;display small font
        ld  hl,_txt_pressenter  ;top centered
        ld  (_curRow),hl
        ld  hl,txt_pressenter   ;"Enter to continue"
        ld  hl,_txt_pressenter  ;top centered
        ld  (_curRow),hl
        ld  hl,txt_pressenter   ;"Enter to continue"
-       cal _puts               ;display message
+       rcl _puts               ;display message
 pause:
        cal getsomekeys         ;GET_KEY w/ halts and checks for enter
        ret z                   ;enter/second pressed: continue game
 pause:
        cal getsomekeys         ;GET_KEY w/ halts and checks for enter
        ret z                   ;enter/second pressed: continue game
+#ifdef invertable
        cp  K_F1                ;F1 pressed?
        jr  nz,notinvert
        cal do_invert           ;if so then change invert screen (AF saved)
        cal mode_invert         ;and screen mode (will be saved)
 notinvert:
        cp  K_F1                ;F1 pressed?
        jr  nz,notinvert
        cal do_invert           ;if so then change invert screen (AF saved)
        cal mode_invert         ;and screen mode (will be saved)
 notinvert:
+#endif
        ld  hl,CONTRAST         ;contrast setting (0-31)
        ld  b,(hl)              ;load contrast into b
        cp  K_UP                ;+ key changes contrast up
        ld  hl,CONTRAST         ;contrast setting (0-31)
        ld  b,(hl)              ;load contrast into b
        cp  K_UP                ;+ key changes contrast up
@@ -648,19 +748,18 @@ setcontrast:
        cal releasekeys
        jr  pause               ;and loop
 
        cal releasekeys
        jr  pause               ;and loop
 
-;--------------------------- teacher ----------------------------------------
+;--------------------------- teacher -----------------------------------------
 
 #ifdef teacherkey              ;can be disabled to save space if not needed
 
 #ifdef teacherkey              ;can be disabled to save space if not needed
-                       ;DO NOT RELEASE NEMESIS COMPILED W/O TEACHERKEY!!!!!
 Teacher:
        ld  (iy+12),5           ;enable flashing cursor
 Teacher:
        ld  (iy+12),5           ;enable flashing cursor
-       cal _clrWindow          ;top left
+       rcl _clrWindow          ;top left
        ld  hl,txt_teacher
        ld  hl,txt_teacher
-       cal _puts               ;display message
+       rcl _puts               ;display message
        cal releasekeys
 
 teacherloop:
        cal releasekeys
 
 teacherloop:
-       cal _getkey             ;enter low-power mode and wait for key
+       rcl _getkey             ;enter low-power mode and wait for key
        cp  kEnter              ;enter pressed?
        jr  z,teacherans
        cp  kGrMenu             ;keypressed = graph?
        cp  kEnter              ;enter pressed?
        jr  z,teacherans
        cp  kGrMenu             ;keypressed = graph?
@@ -672,32 +771,72 @@ teacherloop:
 
 teacherans:                    ;enter displays the answer
        ld  a,' '               ;the cursor could still be displayed (█)
 
 teacherans:                    ;enter displays the answer
        ld  a,' '               ;the cursor could still be displayed (█)
-       cal _putc               ;so remove it by displaying a ' ' over it
+       rcl _putc               ;so remove it by displaying a ' ' over it
 
        ld  hl,$0701
        ld  (_curRow),hl        ;below the equation, aligned right
        ld  hl,txt_teacherans   ;the answer text
 
        ld  hl,$0701
        ld  (_curRow),hl        ;below the equation, aligned right
        ld  hl,txt_teacherans   ;the answer text
-       cal _puts               ;display
+       rcl _puts               ;display
        jr  teacherloop         ;and continue loop
 #endif
 
        jr  teacherloop         ;and continue loop
 #endif
 
-;--------------------------- exit -------------------------------------------
+;--------------------------- exit --------------------------------------------
 
 
-quit:  im  1                   ;release keyfix procedure
-       set 2,(iy+13)           ;set back screen scrolling
+quit:
+#ifdef fixkeys
+       im  1                   ;release keyfix procedure
+#endif
+#ifdef TI86
        xor a
        ld (_asapvar+1),a       ;next Asm( run will reload the program
        xor a
        ld (_asapvar+1),a       ;next Asm( run will reload the program
+       res 5,(iy)              ;don't display "Done" in TI-OS :P
+       set 2,(iy+13)           ;set back screen scrolling again
+#endif
+#ifdef TI83
+       res 7,(iy+20)           ;_vputs will now write directly to LCD again
+       set 6,(iy+9)            ;finished with statmem
+#endif
+#ifdef clearbuffer             ;should we clear the display buffer?
        ld  hl,dispbuffer       ;graph-screen location
        ld  de,dispbuffer+1
        ld  hl,dispbuffer       ;graph-screen location
        ld  de,dispbuffer+1
-       ld  (hl),a
+       ld  (hl),a              ;set to 0 (zero, nothing, nada, empty..)
        ld  bc,1024-1           ;do it 1024 times = entire screen
        ld  bc,1024-1           ;do it 1024 times = entire screen
-       ldir
+       ldir                    ;load that first 0 into the entire area
+#endif
        jp  _clrWindow          ;as _clrLCD but also clears TEXT_MEM (like the
                                ;_clrScrn) AND also executes _homeup and ret
 
        jp  _clrWindow          ;as _clrLCD but also clears TEXT_MEM (like the
                                ;_clrScrn) AND also executes _homeup and ret
 
-;--------------------------- display ----------------------------------------
+;--------------------------- display -----------------------------------------
 
 Display_Screen:
 
 Display_Screen:
+#ifdef TI83
+fastCopy:
+       jp  ionFastCopy
+        ld      a,$80           ; 7
+        out     ($10),a         ; 11
+        ld      hl,dispbuffer+2-16-(-(16*64)+1)    ; 10
+        ld      a,$20           ; 7
+        ld      c,a             ; 4     ; 43
+fastCopyAgain:
+        ld      b,64            ; 7
+        inc     c               ; 4
+        ld      de,-(16*64)+1   ; 10
+        out     ($10),a         ; 11
+        add     hl,de           ; 11
+        ld      de,15           ; 10
+fastCopyLoop:
+        add     hl,de           ; 11
+        inc     hl              ; 6
+        ret     c               ; 5
+        ld      a,(hl)          ; 7
+        out     ($11),a         ; 11
+        dnz     fastCopyLoop    ; 13/8  ; 3392
+        ld      a,c             ; 4
+        cp      $2B+1           ; 7
+        jr      nz,fastCopyAgain; 12/7
+        ret     ; 11    ; 18
+
+#endif
        ld  hl,dispbuffer       ;from buffer (top left)
        ld  de,VIDEO_MEM        ;to real screen (top left)
        ld  c,56                ;display height = 64 bytes (minus 8 for bar)
        ld  hl,dispbuffer       ;from buffer (top left)
        ld  de,VIDEO_MEM        ;to real screen (top left)
        ld  c,56                ;display height = 64 bytes (minus 8 for bar)
@@ -729,7 +868,7 @@ noinvert:
 _D_HL_DECI:                    ;------- display 5-digit value -------
        ld  de,savestr+4        ;savenr saves number string
        ld  b,5                 ;five digits
 _D_HL_DECI:                    ;------- display 5-digit value -------
        ld  de,savestr+4        ;savenr saves number string
        ld  b,5                 ;five digits
-ldhld: cal UNPACK_HL           ;one digit of hl
+ldhld: rcl UNPACK_HL           ;one digit of hl
        add a,'0'               ;make number
        ld  (de),a              ;save into savenr
        dec de                  ;point to next digit
        add a,'0'               ;make number
        ld  (de),a              ;save into savenr
        dec de                  ;point to next digit
@@ -741,7 +880,7 @@ ldhld:      cal UNPACK_HL           ;one digit of hl
 savestr:                       ;@here the score will be stored
        .db "00000",0           ;don't worry, it's just temporary
 
 savestr:                       ;@here the score will be stored
        .db "00000",0           ;don't worry, it's just temporary
 
-;------------------------- handle ship --------------------------------------
+;------------------------- handle ship ---------------------------------------
 
 Handle_Ship:
        ld  a,(your_occ)        ;are
 
 Handle_Ship:
        ld  a,(your_occ)        ;are
@@ -751,7 +890,7 @@ Handle_Ship:
        inc a                   ;no! next (explosion)frame
        ld  (your_occ),a        ;save
 
        inc a                   ;no! next (explosion)frame
        ld  (your_occ),a        ;save
 
-       cp  64+1                ;last explosion frame? (1-16=1st;49-64=4th)
+       cp  63+1                ;last explosion frame?
        jp  c,exploding_you     ;not yet: display explosion
        cp  64+16               ;delay finished?
        ret nz                  ;no, don't display anything (&return)
        jp  c,exploding_you     ;not yet: display explosion
        cp  64+16               ;delay finished?
        ret nz                  ;no, don't display anything (&return)
@@ -936,7 +1075,7 @@ newarmor:
        ld  (hl),a              ;save decreased hp
        jp  disp_armor          ;and display new value
 
        ld  (hl),a              ;save decreased hp
        jp  disp_armor          ;and display new value
 
-;------------------------- place multiples ----------------------------------
+;------------------------- place multiples -----------------------------------
 
 Place_multiples:
        ld  hl,your_prevpos     ;place all previous positions
 
 Place_multiples:
        ld  hl,your_prevpos     ;place all previous positions
@@ -949,7 +1088,7 @@ place_multiples:
        dnz place_multiples     ;repeat
        ret
 
        dnz place_multiples     ;repeat
        ret
 
-;------------------------- select upgrade -----------------------------------
+;------------------------- select upgrade ------------------------------------
 
 inc_armor:
        ld  a,(your_armor)      ;load current armor
 
 inc_armor:
        ld  a,(your_armor)      ;load current armor
@@ -980,8 +1119,6 @@ selectbeam:
 selectedbeam:
        ld  (de),a              ;set new weapon
         cal loadweapon         ;load it (damage and stuff)
 selectedbeam:
        ld  (de),a              ;set new weapon
         cal loadweapon         ;load it (damage and stuff)
-       xor a
-       ld  (your_multiples),a  ;no multiples with beam
        jr  disp_icons          ;display n return
 selectlaser:
        dec a                   ;is it 2?
        jr  disp_icons          ;display n return
 selectlaser:
        dec a                   ;is it 2?
@@ -999,9 +1136,9 @@ upgradelaser:
        cal loadweapon
        jr  disp_icons          ;display + return
 selectextra:
        cal loadweapon
        jr  disp_icons          ;display + return
 selectextra:
-       ld  a,(de)              ;(your_weapon)
-       cp  maxweapon+1         ;laser or beams?
-       jr  c,selectXbeam       ;if beamweap then no multiples but extra beam
+;      ld  a,(de)              ;(your_weapon)
+;      cp  maxweapon+1         ;laser or beams?
+;      jr  c,selectXbeam       ;if beamweap then no multiples but extra beam
        ld  hl,your_multiples
        ld  a,(hl)              ;multiples you already got
        and %1111               ;reset movebit so (your_multiples)=real value
        ld  hl,your_multiples
        ld  a,(hl)              ;multiples you already got
        and %1111               ;reset movebit so (your_multiples)=real value
@@ -1013,23 +1150,25 @@ enoughmultiples:
        ld  de,(x)
        dec a                   ;if this is your first multiple then...
        cal z,Place_multiples   ;reset multiples positions
        ld  de,(x)
        dec a                   ;if this is your first multiple then...
        cal z,Place_multiples   ;reset multiples positions
-       jr  disp_icons          ;display, return
-selectXbeam:
-       ld  a,(your_extramode)  ;indicates whether this is tailbeam/double
-       ld  (your_extra),a      ;ready extra beam
+;      jr  disp_icons          ;display, return
+;selectXbeam:
+;      ld  a,1                 ;updouble
+;      ld  (your_extra),a      ;ready extra beam
 ;      jr  disp_icons          ;display 'n return
 
 ;      jr  disp_icons          ;display 'n return
 
-;--------------------------- show icon --------------------------------------
+;--------------------------- show icon ---------------------------------------
 
 disp_icons:                    ;destroyes: abcdehlix
 
 disp_icons:                    ;destroyes: abcdehlix
+#ifdef TI86 ;-------86
+
        ld  a,VIDEO_MEM/$400    ;directly on screen
        ld  (PutWhere),a        ;place icons at normal screen
        ld  a,VIDEO_MEM/$400    ;directly on screen
        ld  (PutWhere),a        ;place icons at normal screen
-       ld  hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom
-       ld  b,16                ;draw 16x (screen width)
+       ld  hl,VIDEO_MEM+(scrwidth*56);56 rows down = eight rows from bottom
+       ld  b,scrwidth          ;draw 16x (screen width)
        ld  a,%11111111         ;horizontal line mask
        cal drawline            ;draw divider-line
 
        ld  a,%11111111         ;horizontal line mask
        cal drawline            ;draw divider-line
 
-       ld  b,16*7              ;draw 16x (screen width) 7x (height)
+       ld  b,scrwidth*7        ;draw 16x (screen width) 7x (height)
        xor a                   ;blank line mask
        cal drawline            ;clear scorebar
 
        xor a                   ;blank line mask
        cal drawline            ;clear scorebar
 
@@ -1060,7 +1199,7 @@ displivesdone:
        inc a                   ;1 = weapon #1 (=0)
        ld  (_penCol),hl        ;set location
        add a,'0'               ;make digit
        inc a                   ;1 = weapon #1 (=0)
        ld  (_penCol),hl        ;set location
        add a,'0'               ;make digit
-       cal _vputmap            ;display char
+       rcl _vputmap            ;display char
        ld  ix,spr_icon04       ;bulletIcon
 no_bullets:
        ld  de,$3939            ;icon #2
        ld  ix,spr_icon04       ;bulletIcon
 no_bullets:
        ld  de,$3939            ;icon #2
@@ -1073,7 +1212,7 @@ no_bullets:
        ld  (_penCol),hl        ;set location
        sub maxweapon-1         ;1 = laser #1 (=maxweapon)
        add a,'0'               ;make digit
        ld  (_penCol),hl        ;set location
        sub maxweapon-1         ;1 = laser #1 (=maxweapon)
        add a,'0'               ;make digit
-       cal _vputmap            ;display char
+       rcl _vputmap            ;display char
        ld  ix,spr_icon03       ;laserIcon
 no_laser:
        ld  de,$4939            ;icon #1
        ld  ix,spr_icon03       ;laserIcon
 no_laser:
        ld  de,$4939            ;icon #1
@@ -1082,18 +1221,9 @@ no_laser:
        ld  ix,spr_icon00       ;emptyIcon
        ld  a,(your_multiples)  ;number of multiples
        and %111                ;<8
        ld  ix,spr_icon00       ;emptyIcon
        ld  a,(your_multiples)  ;number of multiples
        and %111                ;<8
-       jr  z,no_multiples      ;none, check for beam extras
+       jr  z,no_multiples      ;none (empty)
        ld  ix,spr_icon05       ;multiples-icon
        ld  ix,spr_icon05       ;multiples-icon
-       jr  no_tail             ;display
 no_multiples:                  ;no multiples
 no_multiples:                  ;no multiples
-       ld  a,(your_extra)      ;extra weapon
-       or  a                   ;0?
-       jr  z,no_tail           ;nothing
-       ld  ix,spr_icon02a      ;tailbeamIcon
-       dec a
-       jr  z,no_tail           ;(your_extra)=1 = tailbeam
-       ld  ix,spr_icon02b      ;updoubleIcon
-no_tail:                       ;display
        ld  de,$5939            ;icon #3
        cal putwidesprite
 
        ld  de,$5939            ;icon #3
        cal putwidesprite
 
@@ -1118,6 +1248,94 @@ iconsdone:
        ld  (PutWhere),a        ;set sprite-position to normal screen
        jp  disp_charge         ;display weapon charge bar
 
        ld  (PutWhere),a        ;set sprite-position to normal screen
        jp  disp_charge         ;display weapon charge bar
 
+#else ;-------------83
+
+       ld  hl,VIDEO_MEM+(scrwidth*56);56 rows down = eight rows from bottom
+       ld  b,scrwidth          ;draw 12x (screen width)
+       ld  a,%11111111         ;horizontal line mask
+       cal drawline            ;draw divider-line
+
+       ld  b,scrwidth*7        ;draw 12x (screen width) 7x (height)
+       xor a                   ;blank line mask
+       cal drawline            ;clear scorebar
+
+disp_lives:
+       ld  de,$003C            ;(0,4)
+       ld  a,(your_lives)      ;nr of lives
+       or  a
+       jr  z,displivesdone     ;no lives
+       ld  b,a
+displivesloop:
+       psh bc
+       ld  ix,spr_lship
+       cal safeputsprite       ;put li'l ship
+       ld  a,lshipsize+1
+       add a,d
+       ld  d,a                 ;x=x+5
+       pop bc
+       dnz displivesloop       ;one ship per life
+displivesdone:
+       cal disp_armor          ;display bar
+
+       ld  ix,spr_icon00       ;emptyIcon
+       ld  a,(your_weapon)     ;ur weapon
+       cp  maxweapon           ;bullets?
+       psh af                  ;a=(your_weapon); cf=bullets
+       jr  nc,no_bullets       ;=laser
+       ld  hl,$3935            ;position to display bullet-type digit
+       inc a                   ;1 = weapon #1 (=0)
+       ld  (_penCol),hl        ;set location
+       add a,'0'               ;make digit
+       rcl _vputmap            ;display char
+       ld  ix,spr_icon04       ;bulletIcon
+no_bullets:
+       ld  de,$2F39            ;icon #2
+       cal putwidesprite       ;(beamweap)
+
+       ld  ix,spr_icon00
+       pop af                  ;ld a,(your_weapon) \ cp maxweapon
+       jr  c,no_laser          ;popped carry
+       ld  hl,$393F            ;position to display laser-type digit
+       ld  (_penCol),hl        ;set location
+       sub maxweapon-1         ;1 = laser #1 (=maxweapon)
+       add a,'0'               ;make digit
+       rcl _vputmap            ;display char
+       ld  ix,spr_icon03       ;laserIcon
+no_laser:
+       ld  de,$3939            ;icon #1
+       cal putwidesprite       ;display icon (laser)
+
+       ld  ix,spr_icon00       ;emptyIcon
+       ld  a,(your_multiples)  ;number of multiples
+       and %111                ;<8
+       jr  z,no_multiples      ;none (empty)
+       ld  ix,spr_icon05       ;multiples-icon
+no_multiples:                  ;no multiples
+       ld  de,$4339            ;icon #3
+       cal putwidesprite
+
+       ld  ix,spr_dividerline
+       ld  de,$4D39
+       cal putwidesprite
+
+       ld  a,(your_pickup)     ;pickups taken
+       add a,a                 ;picks*2 (sets z-flag)
+       ld  e,a                 ;save 2*picks
+       jr  z,iconsdone         ;return if no pickups
+       add a,a                 ;picks*4
+       add a,a                 ;picks*8
+       add a,e                 ;picks*10 (8+2=10)
+       add a,$26               ;add 26h
+       ld  d,a                 ;y-pos = picks * 10 + $29 (3a,45,4e)
+       ld  e,$39               ;x-pos = bottom (3a39,4539,4e39)
+
+       ld  ix,spr_icon
+       cal putwidesprite
+iconsdone:
+       jp  disp_charge         ;display weapon charge bar
+
+#endif ;------------^^
+
 drawline:
        ld  (hl),a              ;draw one piece of the divider-line
        inc hl                  ;move right (8 pixels = 1 byte)
 drawline:
        ld  (hl),a              ;draw one piece of the divider-line
        inc hl                  ;move right (8 pixels = 1 byte)
@@ -1126,8 +1344,12 @@ drawline:
 
 
 disp_armor:
 
 
 disp_armor:
-       ld  de,16               ;line size
-       ld  hl,VIDEO_MEM+(58*16)+6
+       ld  de,scrwidth         ;line size
+#ifdef TI86
+       ld  hl,VIDEO_MEM+(58*scrwidth)+6
+#else
+       ld  hl,VIDEO_MEM+(58*scrwidth)+5
+#endif
        ld  a,(your_armor)      ;load your armor (<maxarmor)
        srl a                   ;divide by 2 (barsize halved)
        psh af
        ld  a,(your_armor)      ;load your armor (<maxarmor)
        srl a                   ;divide by 2 (barsize halved)
        psh af
@@ -1167,8 +1389,11 @@ lastarmorbit:
        pop bc                  ;recall yloop-counter
        dnz armorbarloop1       ;display again
 
        pop bc                  ;recall yloop-counter
        dnz armorbarloop1       ;display again
 
-
-       ld  hl,(56*16)+VIDEO_MEM+7
+#ifdef TI86
+       ld  hl,(56*scrwidth)+VIDEO_MEM+7
+#else
+       ld  hl,(56*scrwidth)+VIDEO_MEM+6
+#endif
        ld  a,%01010101
 armorbarY:
        cal drawbarrow          ;display "grey" mask
        ld  a,%01010101
 armorbarY:
        cal drawbarrow          ;display "grey" mask
@@ -1191,7 +1416,7 @@ armorbarX:
        pop hl                  ;old position
        ret
 
        pop hl                  ;old position
        ret
 
-;------------------------- fire bullet --------------------------------------
+;------------------------- fire bullet ---------------------------------------
 
 fire_multiple:
        psh af
 
 fire_multiple:
        psh af
@@ -1264,9 +1489,9 @@ fire_tail:
        ld  a,(hl)
        or  a
        ret z
        ld  a,(hl)
        or  a
        ret z
-       ld  c,tailbeam          ;tailbeam weapon data
-       dec a                   ;(your_extra)=1
-       jr  z,fire_ybullet      ;=tail
+;      ld  c,tailbeam          ;tailbeam weapon data
+;      dec a                   ;(your_extra)=1
+;      jr  z,fire_ybullet      ;=tail
        ld  c,doublebeam        ;up double data
                                ;(your_extra)=2 =double
 ;-----fire BULLETs-----
        ld  c,doublebeam        ;up double data
                                ;(your_extra)=2 =double
 ;-----fire BULLETs-----
@@ -1315,10 +1540,14 @@ fire_laser:
        ld  e,a                 ;save laser-y in e
        psh de                  ;save unmodified (x,y)
        add a,a                 ;y*2
        ld  e,a                 ;save laser-y in e
        psh de                  ;save unmodified (x,y)
        add a,a                 ;y*2
-       add a,a                 ;y*4
-       add a,a                 ;y*8
+#ifdef TI86
+       add a,a                 ;y*4 (86)
+#else
+       add a,e                 ;y*3 (83)
+#endif
+       add a,a                 ;y*8 (86) | y*6 (83)
        rl  b                   ;b (=0) =b*2+overflow (if y>32 then bc=bc+256)
        rl  b                   ;b (=0) =b*2+overflow (if y>32 then bc=bc+256)
-       add a,a                 ;y*16 (width of screen)
+       add a,a                 ;width of screen (y*16 (86) | y*12 (83))
        rl  b                   ;b=b*2+overflow (if y>64 then bc=bc+512)
        inc a                   ;8 pixels to right (a=even so no overflow)
 
        rl  b                   ;b=b*2+overflow (if y>64 then bc=bc+512)
        inc a                   ;8 pixels to right (a=even so no overflow)
 
@@ -1332,8 +1561,9 @@ fire_laser:
 _nolc: ld  c,a                 ;c = (Y*16+X/8) mod 256
        ld  hl,dispbuffer       ;save-location
        add hl,bc               ;bc = Y*16+X/8: hl=screen address
 _nolc: ld  c,a                 ;c = (Y*16+X/8) mod 256
        ld  hl,dispbuffer       ;save-location
        add hl,bc               ;bc = Y*16+X/8: hl=screen address
-       ld  a,15                ;128/8=16=screen width ** minus one (inc a ^^)
+       ld  a,scrwidth-1        ;128/8=16=screen width ** minus one (inc a ^^)
        sub d                   ;minus x-start (d=X/8)
        sub d                   ;minus x-start (d=X/8)
+       jr  z,handle_laser      ;if size=0=256x (right edge) then skip display
        ld  b,a
 drawlaser:
        ld  (hl),%11111111
        ld  b,a
 drawlaser:
        ld  (hl),%11111111
@@ -1396,7 +1626,7 @@ nolashit:
        ld  c,a                 ;c=0
        ret
 
        ld  c,a                 ;c=0
        ret
 
-;------------------------ handle bullets ------------------------------------
+;------------------------ handle bullets -------------------------------------
 
 Handle_bullets:
        ld  hl,ybullets
 
 Handle_bullets:
        ld  hl,ybullets
@@ -1421,15 +1651,19 @@ scan_bullets:
        add a,(hl)              ;a = X + (hl) to the right
        sub 16                  ;and 16 to the left (so -16..+15)
        jr  c,remove_bullet     ;remove if x<0
        add a,(hl)              ;a = X + (hl) to the right
        sub 16                  ;and 16 to the left (so -16..+15)
        jr  c,remove_bullet     ;remove if x<0
-       cp  128
+       cp  8*scrwidth
        jr  nc,remove_bullet    ;or x>=128
        ld  (hl),a              ;save new pos.
        ld  d,a                 ;d = X
 
        inc hl                  ;@y-pos
        ld  a,c
        jr  nc,remove_bullet    ;or x>=128
        ld  (hl),a              ;save new pos.
        ld  d,a                 ;d = X
 
        inc hl                  ;@y-pos
        ld  a,c
-       cal _shracc             ;%11100000->1110
+#ifdef TI86
+       rcl _shracc             ;%11100000->1110
 ;Note: a _shracc procedure inside Nemesis itself would be 27 cycles faster
 ;Note: a _shracc procedure inside Nemesis itself would be 27 cycles faster
+#else
+       srl a \ srl a \ srl a \ srl a   ;83 doesn't have a shracc call
+#endif
        srl a                   ;%1110->111
        dec a
        jr  z,bullet_noymove    ;1=straight forward
        srl a                   ;%1110->111
        dec a
        jr  z,bullet_noymove    ;1=straight forward
@@ -1520,7 +1754,7 @@ bullethitbullet:          ;"bullet" just displaying a bullet hit
        cal putsprite           ;display hit-sprite
        jr  next_ybullet        ;handle the other bullets
 
        cal putsprite           ;display hit-sprite
        jr  next_ybullet        ;handle the other bullets
 
-;--------------------------- check bullethits -------------------------------
+;--------------------------- check bullethits --------------------------------
 
 check_bullethits:              ;INPUT: de=X,Y; (temp1)=bullet
        ld  b,nrenemies
 
 check_bullethits:              ;INPUT: de=X,Y; (temp1)=bullet
        ld  b,nrenemies
@@ -1614,7 +1848,7 @@ pickupdone:
        ld  hl,1                ;increase score by one
        jp  scoreInc            ;+ret
 
        ld  hl,1                ;increase score by one
        jp  scoreInc            ;+ret
 
-;--------------------------- level events -----------------------------------
+;--------------------------- level events ------------------------------------
 
 Level_event:
        ld  a,0                 ;time to next event
 
 Level_event:
        ld  a,0                 ;time to next event
@@ -1721,13 +1955,22 @@ chk_noenemy:                    ;find an unused (no) enemy
        jr  z,lure_enemy        ;yes: create a 100% luring enemy
        inc a                   ;is it -3?
        jr  z,lure_enemy        ;yes: pick one (50% lure)
        jr  z,lure_enemy        ;yes: create a 100% luring enemy
        inc a                   ;is it -3?
        jr  z,lure_enemy        ;yes: pick one (50% lure)
+       inc a                   ;is it -4?
+       jr  z,ground_enemy      ;yes: place @ current ground position
                                ;otherwise?
 yset_enemy:                    ;set 0+3..$FC+3 as y-position
        ld  (de),a
        jr  ypos_OK
                                ;otherwise?
 yset_enemy:                    ;set 0+3..$FC+3 as y-position
        ld  (de),a
        jr  ypos_OK
+ground_enemy:
+       ld  a,(groundpos+15)    ;ground height
+       neg                     ;negative (high ground, low y-pos)
+       add a,50                ;at the bottom
+       ld  (de),a              ;is turret's position
+       jr  ypos_OK
 halflure_enemy:
        ld  a,(timer)           ;look at frame-number
        rra                     ;make random if odd frame nr.
 halflure_enemy:
        ld  a,(timer)           ;look at frame-number
        rra                     ;make random if odd frame nr.
+       rra                     ;...well make that frame/2
        jr  nc,random_enemy     ;1st possibility: random enemy
 lure_enemy:                    ;2nd possibility: luring enemy
        ld  a,(y)               ;place at same y-pos as YOUR ship
        jr  nc,random_enemy     ;1st possibility: random enemy
 lure_enemy:                    ;2nd possibility: luring enemy
        ld  a,(y)               ;place at same y-pos as YOUR ship
@@ -1750,7 +1993,7 @@ ypos_OK:                  ;random value successfully created
        ldi                     ; "  firetype
        ret                     ;return
 
        ldi                     ; "  firetype
        ret                     ;return
 
-;--------------------------- enemy fires ------------------------------------
+;--------------------------- enemy fires -------------------------------------
 
 Enemy_fires:                   ;de = x,y; c = type; ix = enemy_sprite
        ld  hl,ebullets         ;first bullet to check
 
 Enemy_fires:                   ;de = x,y; c = type; ix = enemy_sprite
        ld  hl,ebullets         ;first bullet to check
@@ -1784,13 +2027,29 @@ found_ebullet:
        dec a
        jr  z,bulletdouble      ;type #8 = double
        dec a
        dec a
        jr  z,bulletdouble      ;type #8 = double
        dec a
-       jr  z,bulletquad        ;type #9 = quad
+       jr  z,bulletwide5       ;type #9 = wide 5x
        dec a
        jr  z,bulletdquad       ;type #10 = double-quad
        dec a
        jr  z,bulletran         ;type #11 = random
        dec a
        jr  z,firesenemies      ;type #12 = mine + Dquad
        dec a
        jr  z,bulletdquad       ;type #10 = double-quad
        dec a
        jr  z,bulletran         ;type #11 = random
        dec a
        jr  z,firesenemies      ;type #12 = mine + Dquad
+       dec a
+       jr  z,basefiresenemies  ;type #13 = enemies + 10
+       dec a
+       jr  z,randomfire        ;type #14 = random @full height
+       dec a
+       jr  z,bulletwide3       ;type #15 = wide triple
+       dec a
+       jr  z,bulletfullfire    ;type #16 = straight 5x
+
+randomfire:
+       ld  c,0
+       ld  b,62
+       cal Random              ;a=0..62
+       ld  e,a
+       ld  (hl),1
+       jp  _bulletok
 
 basefiresenemies:              ;type #13 = base
        ld  bc,$3A00
 
 basefiresenemies:              ;type #13 = base
        ld  bc,$3A00
@@ -1810,45 +2069,59 @@ firesenemies:                   ;type #12 = mine / Dquad
        ld  a,boss1enemy        ;otherwise place enemy #[boss1enemy]
        jp  place_enemy
 
        ld  a,boss1enemy        ;otherwise place enemy #[boss1enemy]
        jp  place_enemy
 
-bulletran:
+bulletran:                     ;type #11 = fires bullets 1-5 at random
        cal random14
        cal random14
-       ld  (hl),a
+       ld  (hl),a              ;set type a=1..5
        jr  _bulletok
 
 bulletdquad:                   ;type #10 = double-quad
        jr  _bulletok
 
 bulletdquad:                   ;type #10 = double-quad
-       cal bulletquad          ;fire type #1 to 5
+       cal bulletwide5         ;fire type #1 to 5
+addedgebullets:
        inc hl
        ld  a,e
        inc hl
        ld  a,e
-       sub 5
-       ld  e,a                 ;offset 5 up
+       sub 7
+       ld  e,a                 ;offset 7 up
        ld  c,1                 ;type #1 = normal
        cal enemy_fires_again
        inc hl
        ld  a,e
        ld  c,1                 ;type #1 = normal
        cal enemy_fires_again
        inc hl
        ld  a,e
-       add a,10
-       ld  e,a                 ;offset 10 down (5 total)
+       add a,14
+       ld  e,a                 ;offset 14 down (7 total)
 _enemy_fires_again:
        jr  enemy_fires_again
 
 _enemy_fires_again:
        jr  enemy_fires_again
 
-bulletquad:                    ;type #9 = quad
+bulletwide5:                   ;type #9 = wide 5x (fires 4 dirs + 1 straight)
        cal bullettriple        ;fire type #1, 4 and 5
        inc hl                  ;next bullet
        ld  c,2                 ;type #2 = down
        cal enemy_fires_again
        inc hl
        ld  c,3                 ;type #3 = up
        cal bullettriple        ;fire type #1, 4 and 5
        inc hl                  ;next bullet
        ld  c,2                 ;type #2 = down
        cal enemy_fires_again
        inc hl
        ld  c,3                 ;type #3 = up
-       jr  enemy_fires_again
+       jr  _enemy_fires_again
+
+bulletfullfire:                ;type #16 = straight 5 bullets
+       cal bullettriple        ;fire 3 bullets at center (offset -2,+0,+2)
+       inc e \ inc e           ;restore base (Y)position
+       jr  addedgebullets      ;fire 2 more bullets (at offsets -7 and +7)
+
+bullettriple:                  ;type #7 = triple
+       cal bulletdouble+1      ;fire double weapon (offset +0,+2)
+       dec e \ dec e           ;two px back up
+       dec e \ dec e           ;and another two up (offset -2)
+       inc hl                  ;next bullet position
+       ld  c,1                 ;type #1 = normal
+       jr  _enemy_fires_again  ;find and fire another bullet
 
 bulletdouble:                  ;type #8 = double
 
 bulletdouble:                  ;type #8 = double
-       dec e                   ;one up
-       ld  c,1                 ;type #1
+       dec e                   ;one up (1st bullet not centered:offset -1,+1)
+       ld  c,1                 ;type #1 = straight
        cal bulletok            ;fire bullet
        inc hl                  ;next bullet position
        inc e
        inc e                   ;two px down
        jr  _enemy_fires_again  ;find and fire another bullet
 
        cal bulletok            ;fire bullet
        inc hl                  ;next bullet position
        inc e
        inc e                   ;two px down
        jr  _enemy_fires_again  ;find and fire another bullet
 
-bullettriple:                  ;type #7 = triple
+bulletwide3:                   ;type #15 = spread (3 bullets)
        ld  (hl),1              ;type #1 = normal
        cal _bulletok           ;fire
        inc hl                  ;next bullet
        ld  (hl),1              ;type #1 = normal
        cal _bulletok           ;fire
        inc hl                  ;next bullet
@@ -1883,10 +2156,15 @@ _bulletok:
        inc hl
        ld  (hl),d              ;set x-pos
        inc hl
        inc hl
        ld  (hl),d              ;set x-pos
        inc hl
+       ld  a,58-5              ;bottom
+       cp  e                   ;bullet-y...
+       jr  nc,bulletonscreen   ;<bottom (=on screen) is ok (skip next part)
+       ld  e,a                 ;otherwise set y-pos to bottom of screen
+bulletonscreen:
        ld  (hl),e              ;set y-pos
        ret
 
        ld  (hl),e              ;set y-pos
        ret
 
-;----------------------------- enemy bullets --------------------------------
+;----------------------------- enemy bullets ---------------------------------
 
 Enemy_bullets:
        ld  hl,ebullets         ;hl=bullet pointer
 
 Enemy_bullets:
        ld  hl,ebullets         ;hl=bullet pointer
@@ -1937,8 +2215,8 @@ ebullet_up:
 ebullet_down:
        inc e                   ;move down
        ld  a,e                 ;a=y too
 ebullet_down:
        inc e                   ;move down
        ld  a,e                 ;a=y too
-       cp  58-3                ;y>bottom?
-       jr  z,ebullet_common    ;then keep it there
+       cp  58-4                ;y>=bottom?
+       jr  nc,ebullet_common   ;then keep it there
        ld  (hl),e              ;otherwise save new y
 
 ebullet_common:
        ld  (hl),e              ;otherwise save new y
 
 ebullet_common:
@@ -1976,7 +2254,7 @@ remove_ebullet:
        ld  (hl),0              ;bullet > unused
        ret
 
        ld  (hl),0              ;bullet > unused
        ret
 
-;--------------------------- handle enemies ---------------------------------
+;--------------------------- handle enemies ----------------------------------
 
 Handle_enemies:
        ld  hl,enemies+1
 
 Handle_enemies:
        ld  hl,enemies+1
@@ -2075,7 +2353,7 @@ keep_enemy:
        cal explosion_stuff     ;display explosion
        jr  next_enemy
 
        cal explosion_stuff     ;display explosion
        jr  next_enemy
 
-;--------------------------- moving enemies ---------------------------------
+;--------------------------- moving enemies ----------------------------------
 
 moving_enemy:
        dec d                   ;move left once
 
 moving_enemy:
        dec d                   ;move left once
@@ -2085,7 +2363,7 @@ moving_enemy:
        ld  b,a
        ld  a,(timer)
        dec b
        ld  b,a
        ld  a,(timer)
        dec b
-       jr  z,movetype_updown   ;1 = (1<) up / down
+       jp  z,movetype_updown   ;1 = (1<) up / down
        dec b
        jr  z,movetype_vslow    ;2 = (.25<)
        dec b
        dec b
        jr  z,movetype_vslow    ;2 = (.25<)
        dec b
@@ -2093,25 +2371,39 @@ moving_enemy:
        dec b
        jr  z,movetype_lslow    ;4 = (.75<)
        dec b
        dec b
        jr  z,movetype_lslow    ;4 = (.75<)
        dec b
-       jr  z,movetype_fast     ;5 = (1.5<)
+       jr  z,movetype_mfast    ;5 = (1.25<)
+       dec b
+       jr  z,movetype_fast     ;6 = (1.5<)
+       dec b
+       jr  z,movetype_vfast    ;7 = (2  <)
        dec b
        dec b
-       jr  z,movetype_vfast    ;6 = (2  <)
+       jr  z,movetype_xfast    ;8 = (3  <)
        dec b
        dec b
-       jr  z,movetype_slowlure ;7 = (1<) move y towards you 50%
+       jr  z,movetype_slowlure ;9 = (1<) move y towards you 50%
 
        inc d                   ;speed 0
        dec b
 
        inc d                   ;speed 0
        dec b
-       jr  z,movetype_lure     ;8 = (0) move y towards you
+       jr  z,movetype_lure     ;10 = (0) move y towards you
        dec b
        dec b
-       jr  z,movetype_slowlure ;9 = (0) lure 1/2 speed
+       jr  z,movetype_slowlure ;11 = (0) lure 1/2 speed
        dec b
        dec b
-       jr  z,movetype_fulllure ;10 = x+y towards you 1/2 speed
+       jr  z,movetype_fulllure ;12 = x+y towards you 1/2 speed
        dec b
        dec b
-       jr  z,movetype_right    ;11 = (.5>)
+       jr  z,movetype_right    ;13 = (.5>)
        dec b
        dec b
-       jr  z,movetype_fright   ;12 = (1>)
+       jr  z,movetype_fright   ;14 = (1>)
        dec b
        dec b
-       ret z                   ;13 = (0)
+       jr  z,movetype_right    ;15 = (0)
+       dec b
+       ret z                   ;16 =
+
+movetype_lboss:
+       ld  a,104
+       cp  d
+       jr  c,dothemovethingy
+       inc d                   ;x<110: move right
+dothemovethingy:
+       jr  movetype_updown     ;move up and down and up and down and...
 
 movetype_right:
        rra
 
 movetype_right:
        rra
@@ -2178,12 +2470,19 @@ movetype_vslow:
        inc d                   ;don't move 75%
        ret
 
        inc d                   ;don't move 75%
        ret
 
+movetype_mfast:
+       rra
+       ret c                   ;50% chance (makes it 25% total)
 movetype_fast:
        rra
        ret c                   ;once every other turn
 movetype_vfast:
        dec d                   ;move left twice
        ret
 movetype_fast:
        rra
        ret c                   ;once every other turn
 movetype_vfast:
        dec d                   ;move left twice
        ret
+movetype_xfast:
+       dec d                   ;woowoo, now that's fast!
+       dec d                   ;move left trice!
+       ret
 
 movetype_updown:
        inc hl                  ;@movecount
 
 movetype_updown:
        inc hl                  ;@movecount
@@ -2206,7 +2505,7 @@ movedown:
        inc e                   ;otherwise save new position
        ret                     ;and return
 
        inc e                   ;otherwise save new position
        ret                     ;and return
 
-;--------------------------- check collision --------------------------------
+;--------------------------- check collision ---------------------------------
 
 Enemies_hit:
        ld  hl,(x)              ;e = X, d = Y
 
 Enemies_hit:
        ld  hl,(x)              ;e = X, d = Y
@@ -2300,11 +2599,22 @@ check_next:
        dnz check_collision     ;loop for all enemies
        ret
 
        dnz check_collision     ;loop for all enemies
        ret
 
-;--------------------------- story ------------------------------------------
+;--------------------------- story -------------------------------------------
+
+dostory:
+#ifdef story
+       cal storyPage           ;do some story
+       ld  a,(hl)              ;load next byte in a
+       inc a                   ;set z-flag if a = $ff
+       jr  nz,dostory          ;otherwise loop
+       inc hl
+       inc hl                  ;set hl to beginning of the level
+       ld  (levelp),hl         ;set the level-pointer
+       ret                     ;and return
 
 storyPage:
        psh hl                  ;hl will be destroyed by _clrLCD
 
 storyPage:
        psh hl                  ;hl will be destroyed by _clrLCD
-       cal _clrLCD             ;clear screen
+       rcl _clrLCD             ;clear screen
        pop hl
        ld  a,(hl)
        ld  (curline),a         ;begin line for special effect
        pop hl
        ld  a,(hl)
        ld  (curline),a         ;begin line for special effect
@@ -2314,7 +2624,7 @@ storyLine:
        ld  e,(hl)              ;horizontal text-position
        ld  (_penCol),de        ;set position
        inc hl
        ld  e,(hl)              ;horizontal text-position
        ld  (_penCol),de        ;set position
        inc hl
-       cal _vputs              ;display text
+       rcl _vputs              ;display text
 
        ld  a,(hl)              ;load next byte
        inc hl
 
        ld  a,(hl)              ;load next byte
        inc hl
@@ -2327,7 +2637,7 @@ storyLine:
        ld  de,dispbuffer       ;to GRAPH_MEM
        ld  bc,1024             ;entire screen
        ldir
        ld  de,dispbuffer       ;to GRAPH_MEM
        ld  bc,1024             ;entire screen
        ldir
-       cal _clrLCD             ;clear VIDEO_MEM
+       rcl _clrLCD             ;clear VIDEO_MEM
        pop hl
        pop bc                  ;last byte (<>0) is lines to SFX
        psh hl
        pop hl
        pop bc                  ;last byte (<>0) is lines to SFX
        psh hl
@@ -2336,42 +2646,7 @@ storyLine:
        pop hl
        ret
 
        pop hl
        ret
 
-dostory:
-       cal storyPage           ;do some story
-       ld  a,(hl)              ;load next byte in a
-       inc a                   ;set z-flag if a = $ff
-       jr  nz,dostory          ;otherwise loop
-       inc hl
-       inc hl                  ;set hl to beginning of the level
-       ld  (levelp),hl         ;set the level-pointer
-       ret                     ;and return
-
-
-DoSFX:                         ;in:(curline)=beginLine;b=nrOfLines
- jr sfxlaser
-       ld  hl,dispbuffer
-       ld  b,64
-sfxscrollloop:
-       psh bc
-       psh hl
-       ld  de,VIDEO_MEM
-       ld  hl,VIDEO_MEM+16
-       ld  bc,63*16
-       ldir
-       pop hl
-       ld  bc,16
-       ldir
-       ld  b,16
-sfxscrolldelay:
-       halt                    ;delay
-       dnz sfxscrolldelay      ;8x
-       pop bc
-       dnz sfxscrollloop
-       ret
-
-
-sfxlaser:
-       psh bc
+DoSFX: psh bc                  ;in:(curline)=beginLine;b=nrOfLines
 
        ld  a,0                 ;get line number
 curline =$-1
 
        ld  a,0                 ;get line number
 curline =$-1
@@ -2402,16 +2677,24 @@ sfxlaserdisp:                   ;display this frame on screen
        dec a                   ;counter
        jr  nz,sfxlaserdisp     ;repeat until whole screen is displayed
 
        dec a                   ;counter
        jr  nz,sfxlaserdisp     ;repeat until whole screen is displayed
 
-       ld  b,8
+       ld  b,11                ;11x 1/200sec = ~20 frames/s
 sfxlaserdelay:
        halt                    ;delay
        dnz sfxlaserdelay       ;8x
 
        pop bc                  ;counter
 sfxlaserdelay:
        halt                    ;delay
        dnz sfxlaserdelay       ;8x
 
        pop bc                  ;counter
-       dnz sfxlaser
+       dnz DoSFX
        ret
        ret
+#else
+       rcl _clrWindow
+       ld  hl,welldone
+       rcl _puts
+       jp  getsomekeys         ;wait for a key
+welldone:
+       .db "-CONGRATULATIONS!-",0
+#endif
 
 
-;--------------------------- proc -------------------------------------------
+;--------------------------- proc --------------------------------------------
 
 random14:                      ;random 1..1+4
        ld  c,1
 
 random14:                      ;random 1..1+4
        ld  c,1
@@ -2437,20 +2720,38 @@ ranseed =$-1                    ;SMC :P
 rancount: .db 0
 
 RandomY:                       ;HL = random Y 0..50 right side ((1..51)*16-1)
 rancount: .db 0
 
 RandomY:                       ;HL = random Y 0..50 right side ((1..51)*16-1)
+#ifdef TI86
        psh bc
        ld  bc,50*256+1         ;range=1..51
        cal Random              ;a = 1..51
        psh bc
        ld  bc,50*256+1         ;range=1..51
        cal Random              ;a = 1..51
-       ld  h,0
+       add a,a
+       add a,a
+       ld  h,0
        ld  l,a                 ;hl = 1..51
        add hl,hl
        ld  l,a                 ;hl = 1..51
        add hl,hl
-       add hl,hl
-       add hl,hl
        add hl,hl               ;hl = 1..51 * 16 (left side at random y)
        dec hl                  ;hl = 0..50 * 16 (" at right side of screen)
        ld  de,dispbuffer
        add hl,de               ;position on screen
        pop bc
        ret
        add hl,hl               ;hl = 1..51 * 16 (left side at random y)
        dec hl                  ;hl = 0..50 * 16 (" at right side of screen)
        ld  de,dispbuffer
        add hl,de               ;position on screen
        pop bc
        ret
+#else
+       psh bc
+       ld  bc,50*256+1         ;range=1..51
+       cal Random              ;a = 1..51
+       ld  d,a                 ;*1
+       add a,a                 ;*2
+       add a,d                 ;*3
+       ld  h,0
+       ld  l,a                 ;hl = 1..51 * 3
+       add hl,hl
+       add hl,hl               ;hl = 1..51 * 12 (left side at random y)
+       dec hl                  ;hl = 0..50 * 12 (" at right side of screen)
+       ld  de,dispbuffer
+       add hl,de               ;position on screen
+       pop bc
+       ret
+#endif
 
 scoreInc:                      ;increase score by HL
        psh bc                  ;don't destroy bc (or any registers Xcept hl)
 
 scoreInc:                      ;increase score by HL
        psh bc                  ;don't destroy bc (or any registers Xcept hl)
@@ -2479,15 +2780,18 @@ BLACKLCD:
        ld  hl,VIDEO_MEM        ;screen location (top left)
        ld  de,VIDEO_MEM+1
        ld  (hl),%11111111
        ld  hl,VIDEO_MEM        ;screen location (top left)
        ld  de,VIDEO_MEM+1
        ld  (hl),%11111111
-       ld  bc,1024-1           ;do it 1024 times = entire screen
+       ld  bc,scrwidth*64-1    ;do it 1024 times = entire screen
        ldir
        ldir
+#ifdef TI83
+       cal fastCopy
+#endif
        set 3,(iy+5)            ;set white on black
        ret
 
 getsomekeys:
        halt                    ;wait a li'l while and save batteries :P
        halt
        set 3,(iy+5)            ;set white on black
        ret
 
 getsomekeys:
        halt                    ;wait a li'l while and save batteries :P
        halt
-       cal GET_KEY             ;input keys
+       rcl GET_KEY             ;input keys
        or  a
        jr  z,getsomekeys       ;wait if none
        cp  K_SECOND            ;2nd pressed?
        or  a
        jr  z,getsomekeys       ;wait if none
        cp  K_SECOND            ;2nd pressed?
@@ -2515,8 +2819,9 @@ findenemyspecs:                   ;enemy #a specs in (hl); in:b=0; out:ac=?
        add hl,bc               ;hl = enm#0 + type*10
        ret                     ;hl = enemy specs
 
        add hl,bc               ;hl = enm#0 + type*10
        ret                     ;hl = enemy specs
 
-;--------------------------- game over / new game / death -------------------
+;--------------------------- game over / new game / death --------------------
 
 
+#ifdef shiscore
 chartable:                     ;use chartable-1 and add GET_KEY scancode
        .db ".<>!",0,0,0,0      ;down,L,R,up
        .db 0,"xtoje0",0        ;enter..clear
 chartable:                     ;use chartable-1 and add GET_KEY scancode
        .db ".<>!",0,0,0,0      ;down,L,R,up
        .db 0,"xtoje0",0        ;enter..clear
@@ -2552,29 +2857,34 @@ storesmtn:              ;stores data [stack=src; stack+1=dest; stack+2=size]
        pop hl                  ;data offset
        add hl,de               ;hl=pointer to data in real prog
        adc a,b                 ;if hl overflow also increase a
        pop hl                  ;data offset
        add hl,de               ;hl=pointer to data in real prog
        adc a,b                 ;if hl overflow also increase a
-        cal _SET_ABS_DEST_ADDR ;destination = real program = ahl
+        rcl _SET_ABS_DEST_ADDR ;destination = real program = ahl
         xor a                  ;RAM page #0
        pop hl                  ;data position in normal program ($D748+)
         xor a                  ;RAM page #0
        pop hl                  ;data position in normal program ($D748+)
-        cal _SET_ABS_SRC_ADDR  ;set as source (ahl)
+        rcl _SET_ABS_SRC_ADDR  ;set as source (ahl)
        pop hl                  ;size
        pop hl                  ;size
-        cal _SET_MM_NUM_BYTES  ;set
-        cal _mm_ldir           ;copy data to real program
+        rcl _SET_MM_NUM_BYTES  ;set
+        rcl _mm_ldir           ;copy data to real program
        jp  _RAM_PAGE_1         ;and finally: reset ram page
        jp  _RAM_PAGE_1         ;and finally: reset ram page
+#endif
 
 game_over:                     ;stack=+0
        cal BLACKLCD            ;clear screen
 
 game_over:                     ;stack=+0
        cal BLACKLCD            ;clear screen
-       ld  hl,$0603
+#ifdef TI86
+       ld  hl,$0603            ;centered on 86
+#else
+       ld  hl,$0403            ;centered on 83 (smaller screen)
+#endif
        ld  (_curRow),hl        ;center
        ld  hl,txt_gameover
        ld  (_curRow),hl        ;center
        ld  hl,txt_gameover
-       cal _puts               ;display "GAME OVER"
+       rcl _puts               ;display "GAME OVER"
        cal releasekeys         ;wait for all keys to be released
 
        ld  hl,$0007
        ld  (_curRow),hl
        cal releasekeys         ;wait for all keys to be released
 
        ld  hl,$0007
        ld  (_curRow),hl
-
+#ifdef shiscore
        ld  de,(your_score)     ;current score
        ld  hl,(hiscore)        ;hiscore
        ld  de,(your_score)     ;current score
        ld  hl,(hiscore)        ;hiscore
-       cal CP_HL_DE            ;de<=hl means no hiscore (or same)
+       rcl CP_HL_DE            ;de<=hl means no hiscore (or same)
        jr  nc,no_hiscore       ;skip the new hiscore part
        ld  (hiscore),de        ;otherwise save current score as new hiscore
 
        jr  nc,no_hiscore       ;skip the new hiscore part
        ld  (hiscore),de        ;otherwise save current score as new hiscore
 
@@ -2584,7 +2894,7 @@ ask_hiname:                       ;and ask for new hiscore name
        ld  (hiscorepos),a      ;current char (counts backwards 9-1)
 enter_name_loop:
        ld  a,'_'               ;cursor appearance
        ld  (hiscorepos),a      ;current char (counts backwards 9-1)
 enter_name_loop:
        ld  a,'_'               ;cursor appearance
-       cal _putmap             ;display (do not advance cursorpos)
+       rcl _putmap             ;display (do not advance cursorpos)
 nokeypressed:
        cal getsomekeys         ;wait for any key
        jr  z,nomore            ;if [enter] or [2nd] pressed we're all done
 nokeypressed:
        cal getsomekeys         ;wait for any key
        jr  z,nomore            ;if [enter] or [2nd] pressed we're all done
@@ -2609,7 +2919,7 @@ nokeypressed:
        jr  z,nokeypressed       ;don't add anything afterall
 
        ld  (ix),a              ;save new char
        jr  z,nokeypressed       ;don't add anything afterall
 
        ld  (ix),a              ;save new char
-       cal _putc               ;and also display on screen
+       rcl _putc               ;and also display on screen
        inc ix                  ;goto next char
        cal releasekeys         ;wait for the key to be released
        jr  enter_name_loop     ;and continue the loop
        inc ix                  ;goto next char
        cal releasekeys         ;wait for the key to be released
        jr  enter_name_loop     ;and continue the loop
@@ -2622,46 +2932,55 @@ backup:                         ;backspace
 
        dec ix                  ;and string to previous char as well
        ld  a,32                ;remove cursor
 
        dec ix                  ;and string to previous char as well
        ld  a,32                ;remove cursor
-       cal _putmap             ;by replacing it by ' '
+       rcl _putmap             ;by replacing it by ' '
        ld  hl,_curCol
        dec (hl)                ;cursor one back
        jr  enter_name_loop     ;continue name loop
 
 nomore:                                ;name's done
        ld  a,' '               ;remove cursor
        ld  hl,_curCol
        dec (hl)                ;cursor one back
        jr  enter_name_loop     ;continue name loop
 
 nomore:                                ;name's done
        ld  a,' '               ;remove cursor
-       cal _putc               ;(or actually replace with ' ')
+       rcl _putc               ;(or actually replace with ' ')
        ld  (ix),0              ;end of string marker (zero-terminated)
        cal save_hi             ;store hiscore with name in real program
        jr  hiscoredone         ;continue with game over screen
        ld  (ix),0              ;end of string marker (zero-terminated)
        cal save_hi             ;store hiscore with name in real program
        jr  hiscoredone         ;continue with game over screen
-
+#endif
 no_hiscore:                    ;no new hiscore
        ld  hl,hiname           ;just display old name
 no_hiscore:                    ;no new hiscore
        ld  hl,hiname           ;just display old name
-       cal _puts
+       rcl _puts
+
 hiscoredone:
        xor a                   ;clear a (Ahl will be displayed)
        ld  hl,$1006            ;bottom-1 right
        ld  (_curRow),hl        ;set
        ld  hl,(your_score)     ;your score
 hiscoredone:
        xor a                   ;clear a (Ahl will be displayed)
        ld  hl,$1006            ;bottom-1 right
        ld  (_curRow),hl        ;set
        ld  hl,(your_score)     ;your score
-       cal _dispahl            ;display it (a=0)
+       rcl _dispahl            ;display it (a=0)
 
 
+#ifdef TI86
        ld  hl,$314b            ;bottom-1 right before score ^^
        ld  hl,$314b            ;bottom-1 right before score ^^
+#else
+       ld  hl,$312b
+#endif
        ld  (_penCol),hl        ;set
        ld  hl,txt_score        ;"Score"
        ld  (_penCol),hl        ;set
        ld  hl,txt_score        ;"Score"
-       cal _vputs              ;display (small)
+       rcl _vputs              ;display (small)
 
        ld  hl,$1007            ;bottom right
        ld  (_curRow),hl        ;set
        ld  hl,(hiscore)        ;hi-score
 
        ld  hl,$1007            ;bottom right
        ld  (_curRow),hl        ;set
        ld  hl,(hiscore)        ;hi-score
-       cal _dispahl            ;display
+       rcl _dispahl            ;display
+#ifdef TI86
        ld  hl,$3946            ;bottom right before hiscore ^^
        ld  hl,$3946            ;bottom right before hiscore ^^
+#else
+       ld  hl,$3926
+#endif
        ld  (_penCol),hl        ;set
        ld  hl,txt_hiscore      ;"Hiscore"
        ld  (_penCol),hl        ;set
        ld  hl,txt_hiscore      ;"Hiscore"
-       cal _vputs              ;display (small)
+       rcl _vputs              ;display (small)
        res 3,(iy+5)
 
        res 3,(iy+5)
 
-       ld  b,16
-       ld  de,16
-       ld  hl,VIDEO_MEM+(49*16)-1
+       ld  b,scrwidth
+       ld  de,scrwidth
+       ld  hl,VIDEO_MEM+(49*scrwidth)-1
 restore_line:
        set 1,(hl)
        add hl,de
 restore_line:
        set 1,(hl)
        add hl,de
@@ -2673,12 +2992,12 @@ restore_line:
 invship:                       ;procedure used in New_game
        psh af
        inc b
 invship:                       ;procedure used in New_game
        psh af
        inc b
-       ld  de,$C0
-       ld  hl,VIDEO_MEM+$30-$C0;begin pos
+       ld  de,12*scrwidth
+       ld  hl,scrwidth*(3-12)+VIDEO_MEM;begin pos
 invshipinit:
        add hl,de
        dnz invshipinit
 invshipinit:
        add hl,de
        dnz invshipinit
-       ld  b,$B0               ;12 lines down
+       ld  b,12*scrwidth       ;12 lines down
 invshiploop:
        ld  a,(hl)
        cpl                     ;invert byte
 invshiploop:
        ld  a,(hl)
        cpl                     ;invert byte
@@ -2689,9 +3008,11 @@ invshiploop:
        ret
 
 New_game:                      ;start a new game (SP=+0)
        ret
 
 New_game:                      ;start a new game (SP=+0)
-       cal _clrLCD
+       rcl _clrLCD
+#ifdef TI86
        ld  a,VIDEO_MEM/$400
        ld  (PutWhere),a        ;will be reset after displaying iconbar
        ld  a,VIDEO_MEM/$400
        ld  (PutWhere),a        ;will be reset after displaying iconbar
+#endif
        ld  ix,spr_ship01       ;first ship: sprite
        ld  de,$0105            ;position
        ld  b,4                 ;number of ships to display
        ld  ix,spr_ship01       ;first ship: sprite
        ld  de,$0105            ;position
        ld  b,4                 ;number of ships to display
@@ -2699,7 +3020,11 @@ dispshipsloop:
        psh bc                  ;counter
        psh de                  ;position
        ld  h,e
        psh bc                  ;counter
        psh de                  ;position
        ld  h,e
+#ifdef TI86
        ld  l,40                ;x=40
        ld  l,40                ;x=40
+#else
+       ld  l,30
+#endif
        ld  (_penCol),hl        ;small cursor position
        psh ix                  ;ix destroyed by _vputmap
        ld  hl,txt_difhardcore  ;hardcore ships text
        ld  (_penCol),hl        ;small cursor position
        psh ix                  ;ix destroyed by _vputmap
        ld  hl,txt_difhardcore  ;hardcore ships text
@@ -2710,16 +3035,20 @@ dispshipsloop:
        jr  z,dispdifficulty    ;0 indicates hardcore difficulty ship
        ld  hl,txt_difnormal    ;normal difficulty ships text
 dispdifficulty:
        jr  z,dispdifficulty    ;0 indicates hardcore difficulty ship
        ld  hl,txt_difnormal    ;normal difficulty ships text
 dispdifficulty:
-       cal _vputs              ;display difficulty
+       rcl _vputs              ;display difficulty
+#ifdef TI86
        ld  a,95
        ld  a,95
+#else
+       ld  a,70
+#endif
        ld  (_penCol),a         ;set x=95
        pop af                  ;ship nr (backwards 3..0)
        ld  (_penCol),a         ;set x=95
        pop af                  ;ship nr (backwards 3..0)
-       ld  hl,txt_updouble     ;updouble for ships 1
+       ld  hl,txt_shpbeam      ;updouble for ships 1
        and %1                  ;gives 0,1,0,1 (for ships 0,1,0,1)
        jr  nz,dispsbeam
        and %1                  ;gives 0,1,0,1 (for ships 0,1,0,1)
        jr  nz,dispsbeam
-       ld  hl,txt_tailbeam     ;tailbeam for ships 0
+       ld  hl,txt_shplaser     ;tailbeam for ships 0
 dispsbeam:
 dispsbeam:
-       cal _vputs              ;display special beam type
+       rcl _vputs              ;display special beam type
        pop ix
        pop de
        psh de                  ;peek de
        pop ix
        pop de
        psh de                  ;peek de
@@ -2738,6 +3067,9 @@ dispsbeam:
 selectship:
        psh bc
        cal invship
 selectship:
        psh bc
        cal invship
+#ifdef TI83
+       cal fastCopy
+#endif
        cal getsomekeys
        pop bc
        jr  z,startthenewgame   ;enter/2nd
        cal getsomekeys
        pop bc
        jr  z,startthenewgame   ;enter/2nd
@@ -2770,8 +3102,11 @@ searchyourship:
        dnz searchyourship
        ld  (your_ship),hl
        and 1                   ;gives: 1,0,1,0 for the ships
        dnz searchyourship
        ld  (your_ship),hl
        and 1                   ;gives: 1,0,1,0 for the ships
-       inc a                   ;ships now give 1,2,1,2
-       ld  (your_extramode),a  ;sets tail beam or up double (1 or 2)
+       xor 1                   ;well, make it 0,1,0,1 :)
+       jr  z,whichship         ;ships 0 have bullets
+       ld  a,maxweapon         ;ships 1 have lasers (0,8,0,8)
+whichship:
+       ld  (your_weapon),a     ;set bullet#1 or laser#1 depending on ship
        pop af                  ;ship# 0..3
        and %10                 ;ships give 0,0,1,1
        ld  (hardcore),a        ;hardcore mode set for ships 3 and 4
        pop af                  ;ship# 0..3
        and %10                 ;ships give 0,0,1,1
        ld  (hardcore),a        ;hardcore mode set for ships 3 and 4
@@ -2779,7 +3114,6 @@ searchyourship:
        ld  (your_score),a      ;reset score
        ld  (your_score+1),a    ;reset score (0)
        ld  (your_extra),a      ;no extra beam
        ld  (your_score),a      ;reset score
        ld  (your_score+1),a    ;reset score (0)
        ld  (your_extra),a      ;no extra beam
-       ld  (your_weapon),a     ;no laser
        ld  (your_pickup),a     ;reset pickups
        ld  (your_multiples),a  ;no multiples
        inc a                   ;ld a,1
        ld  (your_pickup),a     ;reset pickups
        ld  (your_multiples),a  ;no multiples
        inc a                   ;ld a,1
@@ -2800,13 +3134,7 @@ You_die:                 ;stack must be +1
        jp  z,game_over         ;and game's over
        jr  samelevel
 
        jp  z,game_over         ;and game's over
        jr  samelevel
 
-gamedone:
-       cal dostory             ;display end (hl=(levelp))
-       ld  hl,250
-       cal scoreInc            ;game complete bonus: 250
-       jp  game_over           ;game over (+hiscore)
-
-;--------------------------- next level -------------------------------------
+;--------------------------- next level --------------------------------------
 
 Next_level:                    ;stack must be +1
        pop hl
 
 Next_level:                    ;stack must be +1
        pop hl
@@ -2824,7 +3152,13 @@ Next_level:                      ;stack must be +1
        ld  a,(level)           ;level number
        inc a                   ;next level #
        cp  endlevel+1          ;last level done?
        ld  a,(level)           ;level number
        inc a                   ;next level #
        cp  endlevel+1          ;last level done?
-       jr  nc,gamedone         ;yes: display end story and quit
+       jr  c,gamenotdone       ;no: continue game
+gamedone:                      ;yes:
+       cal dostory             ;display end (hl=(levelp))
+       ld  hl,500
+       cal scoreInc            ;game complete bonus: 500
+       jp  game_over           ;game over (+hiscore)
+gamenotdone:
        ld  (level),a
 
        add a,a
        ld  (level),a
 
        add a,a
@@ -2841,16 +3175,19 @@ samelevel:
        ldi                     ;ld (_invert),(invertmode)
        ld  de,your_shipspr     ;sets your ship's sprite
        ldi                     ;ld (your_shipspr),(your_ship)
        ldi                     ;ld (_invert),(invertmode)
        ld  de,your_shipspr     ;sets your ship's sprite
        ldi                     ;ld (your_shipspr),(your_ship)
+       ldi                     ;and second byte (heh it's a word)
 
        ld  a,80
        ld  (nextevent),a       ;time to first enemy appearance
 
        ld  hl,(levelp)         ;level pointer
 
        ld  a,80
        ld  (nextevent),a       ;time to first enemy appearance
 
        ld  hl,(levelp)         ;level pointer
+#ifdef story
        dec hl                  ;byte before level (boss byte)
        xor a                   ;if it's zero it means here's a story
        cp  (hl)
        inc hl                  ;begin of level
        cal z,dostory           ;do the story and set (levelp) to real level
        dec hl                  ;byte before level (boss byte)
        xor a                   ;if it's zero it means here's a story
        cp  (hl)
        inc hl                  ;begin of level
        cal z,dostory           ;do the story and set (levelp) to real level
+#endif
 
        ld  a,(hl)              ;number of (different) enemies in this level
        inc hl
 
        ld  a,(hl)              ;number of (different) enemies in this level
        inc hl
@@ -2872,7 +3209,7 @@ samelevel:
        ld  c,4                 ;5xLDI:  loads (level_info) (spacespace)
        ldir                    ;              (stars1) (stars2)
        ld  a,1
        ld  c,4                 ;5xLDI:  loads (level_info) (spacespace)
        ldir                    ;              (stars1) (stars2)
        ld  a,1
-       ld  b,32                ;fill (groundpos) and (ceilingpos)
+       ld  b,16                ;fill (groundpos)
 fillground:
        ld  (de),a
        inc de
 fillground:
        ld  (de),a
        inc de
@@ -2897,53 +3234,65 @@ fillground:
 
        cal loadweapon          ;load (your_weapon)
 
 
        cal loadweapon          ;load (your_weapon)
 
+       xor a
        ld  hl,enemies          ;remove all enemies and bullets
        ld  hl,enemies          ;remove all enemies and bullets
-       ld  (hl),0              ;clear first byte
+       ld  (hl),a              ;clear first byte
        ld  de,enemies+1        ;copy this to the next byte
        ld  de,enemies+1        ;copy this to the next byte
+#ifdef TI86                    ;on '86 everything's located here
        ld  bc,(nrenemies*enemysize)+(nrybuls*4)+(nrebuls*3)-1
        ld  bc,(nrenemies*enemysize)+(nrybuls*4)+(nrebuls*3)-1
-       ldir                    ;clear enemies + bullets (y/e)
+#else                          ;on '83 it's a little harder...
+       ld  bc,(nrenemies*enemysize)-1
+       ldir                    ;just clear the enemies
+       ld  hl,ybullets         ;now remove all the bullets (different loc.)
+       ld  (hl),a              ;clear 1st byte
+       ld  de,ybullets+1       ;copy2next
+       ld  bc,(nrybuls*4)+(nrebuls*3)-1
+#endif
+       ldir                    ;clear enemies + ybullets + ebullets
 
 
-;--------------------------- setup game -------------------------------------
+;--------------------------- setup game --------------------------------------
 
 game_setup:
        cal BLACKLCD            ;white on black
        ld  hl,txt_level
        ld  de,$0703
        ld  (_curRow),de        ;center
 
 game_setup:
        cal BLACKLCD            ;white on black
        ld  hl,txt_level
        ld  de,$0703
        ld  (_curRow),de        ;center
-       cal _puts               ;display "LEVEL "
+       rcl _puts               ;display "LEVEL "
 
        ld  a,(level)           ;current level
        ld  l,a
        ld  h,0                 ;in hl
 
        ld  a,(level)           ;current level
        ld  l,a
        ld  h,0                 ;in hl
-       cal UNPACK_HL           ;create first digit
+       rcl UNPACK_HL           ;create first digit
        add a,'0'               ;0-9
        ld  b,a                 ;into b
        add a,'0'               ;0-9
        ld  b,a                 ;into b
-       cal UNPACK_HL           ;second digit
+       rcl UNPACK_HL           ;second digit
        add a,'0'               ;0-9
        add a,'0'               ;0-9
-       cal _putc               ;display second digit
+       rcl _putc               ;display second digit
        ld  a,b
        ld  a,b
-       cal _putmap             ;display first digit
+       rcl _putmap             ;display first digit
 
        ld  hl,txt_lives        ;bar text: "Lx0"...
        ld  de,$0904
        ld  (_curRow),de        ;display lives left below level nr
 
        ld  hl,txt_lives        ;bar text: "Lx0"...
        ld  de,$0904
        ld  (_curRow),de        ;display lives left below level nr
-       cal _puts
+       rcl _puts
        ld  a,(your_lives)      ;lives left
        add a,'0'               ;make value 0='0'
        ld  a,(your_lives)      ;lives left
        add a,'0'               ;make value 0='0'
-       cal _putc
+       rcl _putc
 
        cal releasekeys         ;wait for user to release all keys
        ld  hl,txt_savekey      ;"Press [F1] to save"
        ld  de,$3A46            ;bottom-right
        ld  (_penCol),de
 
        cal releasekeys         ;wait for user to release all keys
        ld  hl,txt_savekey      ;"Press [F1] to save"
        ld  de,$3A46            ;bottom-right
        ld  (_penCol),de
-       cal _vputs
+       rcl _vputs
 
        res 3,(iy+5)            ;set white on black
        cal getsomekeys         ;wait for keypress
 
        res 3,(iy+5)            ;set white on black
        cal getsomekeys         ;wait for keypress
+#ifdef shiscore
        cp  K_F1
        cal z,save_lvl
        cp  K_F1
        cal z,save_lvl
+#endif
 
 
-       cal _clrLCD             ;clear screen
+       rcl _clrLCD             ;clear screen
        cal disp_icons          ;display bottom icons +ret
        jp  game_main_loop
 
        cal disp_icons          ;display bottom icons +ret
        jp  game_main_loop
 
@@ -2954,7 +3303,7 @@ placestars:
        ld  d,0
        ld  e,a                 ;de = a = 2-14
        or  a
        ld  d,0
        ld  e,a                 ;de = a = 2-14
        or  a
-       sbc hl,de               ;substract from random y => random pos anywhere
+       sbc hl,de               ;substract from rand y => random pos anywhere
 
        ld  (ix),l              ;save x-pos (l)
        ld  (ix+1),h            ;save y-pos (h)
 
        ld  (ix),l              ;save x-pos (l)
        ld  (ix+1),h            ;save y-pos (h)
@@ -2982,12 +3331,25 @@ loadweapon:
        ld  (laserdur),a
        ret
 
        ld  (laserdur),a
        ret
 
-;----------------------------------------------------------------------------
-;--------------------------- putsprite --------------------------------------
-;----------------------------------------------------------------------------
+;--misc--
+#ifdef TI83
+_clrLCD:
+       rcl _clrlcdf
+       ld  hl,dispbuffer       ;move from (hl) = top left
+       ld  (hl),0              ;first pixel will be copied all over the screen
+       ld  de,dispbuffer+1     ;(de) = next pixel, thus clearing whole screen
+       ld  bc,scrwidth*64-1    ;loop 896 times = (128/8) * (64-8 for scorebar)
+       ldir                    ;all clear!
+       ret
+#endif
+
+;-----------------------------------------------------------------------------
+;--------------------------- putsprite ---------------------------------------
+;-----------------------------------------------------------------------------
 ;in:  de=(x,y); ix=sprite
 ;out: ix=behind sprite; hl:a=right below sprite; b=0; d=width; ce=?
 
 ;in:  de=(x,y); ix=sprite
 ;out: ix=behind sprite; hl:a=right below sprite; b=0; d=width; ce=?
 
+#ifdef TI86
 putsprite:
        ld  c,(ix)              ;save width
 _putsprite:                    ;putsprite with custom width
 putsprite:
        ld  c,(ix)              ;save width
 _putsprite:                    ;putsprite with custom width
@@ -3067,8 +3429,97 @@ CSbitdrawn:
        pop bc                  ;rows counter
        dnz CSyloop
 CSdone:        ret
        pop bc                  ;rows counter
        dnz CSyloop
 CSdone:        ret
+#endif
 
 
-;--------------------------- putbigsprite -----------------------------------
+#ifdef TI83
+putsprite:
+       ld  c,(ix)              ;save width
+_putsprite:                    ;putsprite with custom width
+       ld  a,d                 ;a=X
+       bit 7,d                 ;check sign bit of X
+       jr  z,CSpositive        ;X>=0
+
+       neg                     ;a=|X|
+       cp  (ix)                ;off screen?
+       ret nc                  ;X<=-width: don't draw at all
+       ld  b,a                 ;b=|X|mod 8=1..7=bits to draw
+       psh bc
+       ld  a,%11111111         ;all bits set (draw everything)
+CSclipleft:
+       srl a                   ;remove first bit in a for each b
+       dnz CSclipleft          ;b=1: a=%01111111
+                               ;b=2: a=%00111111
+                               ;b=3: a=%00011111
+                               ;b=4: a=%00001111
+                               ;b=5: a=%00000111
+                               ;b=6: a=%00000011
+                               ;b=7: a=%00000001
+       pop bc
+       psh af
+       ld  a,96
+       sub b
+       ld  d,a
+       pop af
+       dec e                   ;Y--
+       jr  CSdisplay           ;done clipping
+
+CSpositive:
+       sub 97-8                ;minus (screen width - byte width)
+       ld  b,a
+       ld  a,%11111111         ;clipmask
+       jr  c,CSdisplay         ;x+width<128 then entire sprite is on screen
+       inc b                   ;b = number of pixels off screen
+CSclipright:
+       add a,a                 ;remove last bit in a for each b
+       dnz CSclipright         ;b=1: a=%11111110
+                               ;b=2: a=%11111100
+                               ;b=3: a=%11111000
+                               ;b=4: a=%11110000
+                               ;b=5: a=%11100000
+                               ;b=6: a=%11000000
+                               ;b=7: a=%10000000
+                               ;b>7: a=%00000000 = off screen
+
+CSdisplay:                     ;display the sprite ix at (d,e) masked
+       ld  (CSclipmask),a      ;set mask
+       cal findpixel           ;convert de to screen location hl:a
+       ld  (CSbitmask),a
+
+       ld  d,c                 ;width
+       ld  b,(ix+1)            ;height
+CSyloop:
+       psh bc                  ;save rows to go
+       psh hl                  ;screen
+       ld  b,d                 ;width
+       ld  a,(ix+2)            ;load image line
+       and 255                 ;mask
+CSclipmask =$-1
+       ld  c,a                 ;c=image
+       inc ix                  ;next
+CSbitmask =$+1
+       ld  a,1                 ;saved bitmask
+CSxloop:
+       sla c                   ;test leftmost pixel
+       jr  nc,CSnodraw         ;don't draw if it's 0
+       ld  e,a                 ;psh af: save bitmask
+       or  (hl)
+       ld  (hl),a              ;OR pixel with screen
+       ld  a,e                 ;pop af
+CSnodraw:
+       rrca                    ;next bit
+       jr  nc,CSbitdrawn       ;carry set if bit "jumped"
+       inc hl                  ;next byte
+CSbitdrawn:
+       dnz CSxloop
+       pop hl                  ;screen at x-offset=0
+       ld  bc,12
+       add hl,bc               ;next line
+       pop bc                  ;rows counter
+       dnz CSyloop
+CSdone:        ret
+#endif
+
+;--------------------------- putbigsprite -----------------------------------=
 
 putwidesprite:
 ;destr: abcdehl+ix (ix=behind sprite; hl:a=right below sprite; b=0; d=width)
 
 putwidesprite:
 ;destr: abcdehl+ix (ix=behind sprite; hl:a=right below sprite; b=0; d=width)
@@ -3097,9 +3548,10 @@ safeputsprite:                   ;cal putsprite with de intact
        pop de
        ret
 
        pop de
        ret
 
-;------------------------------- findpixel ----------------------------------
+;------------------------------- findpixel -----------------------------------
 ;based upon CLEM's fp | 131 cycles | 28 bytes | in:(d,e); out:hla; destr:de
 
 ;based upon CLEM's fp | 131 cycles | 28 bytes | in:(d,e); out:hla; destr:de
 
+#ifdef TI86
 findpixel:
        ld  a,e                 ;a=e=Y
        add a,a
 findpixel:
        ld  a,e                 ;a=e=Y
        add a,a
@@ -3126,10 +3578,22 @@ PutWhere =$-1                   ;screen base position/$400 (where x+y=0)
 FPbit =$+1
        set 0,a
        ret
 FPbit =$+1
        set 0,a
        ret
+#endif
+
+#ifdef TI83
+findpixel:
+       psh bc
+       psh de
+       ld  a,d
+       cal ionGetPixel
+       pop de
+       pop bc
+       ret
+#endif
 
 
-;----------------------------------------------------------------------------
-;------------------------------- sprites ------------------------------------
-;----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
+;------------------------------- sprites -------------------------------------
+;-----------------------------------------------------------------------------
 
 spr_ship01:            ;(normal; up double)
        .db 7,7         ;ship alpha class (vic viper)
 
 spr_ship01:            ;(normal; up double)
        .db 7,7         ;ship alpha class (vic viper)
@@ -3170,6 +3634,24 @@ spr_ship02i:
        .db %11111010   ;█████ █
 
 spr_ship03:            ;(hardcore; up double)
        .db %11111010   ;█████ █
 
 spr_ship03:            ;(hardcore; up double)
+       .db 7,7         ;ship gamma class
+       .db %11111000   ;█████
+       .db %01100000   ; ██
+       .db %11111100   ;██████
+       .db %11100110   ;███  ██
+       .db %11111100   ;██████
+       .db %01100000   ; ██
+       .db %11111000   ;█████
+spr_ship03i:
+       .db 8,7
+       .db %11111010   ;█████ █
+       .db %01100001   ; ██    █
+       .db %11111101   ;██████ █
+       .db %11100111   ;███  ███
+       .db %11111101   ;██████ █
+       .db %01100001   ; ██    █
+       .db %11111010   ;█████ █
+
        .db 7,7         ;ship delta class (lord british)
        .db %11000000   ; ██
        .db %11110000   ; ████
        .db 7,7         ;ship delta class (lord british)
        .db %11000000   ; ██
        .db %11110000   ; ████
@@ -3178,7 +3660,7 @@ spr_ship03:               ;(hardcore; up double)
        .db %11111100   ; ██████
        .db %11110000   ; ████
        .db %11000000   ; ██
        .db %11111100   ; ██████
        .db %11110000   ; ████
        .db %11000000   ; ██
-spr_ship03i:
+;spr_ship03i:
        .db 8,7
        .db %11111100   ; ██████
        .db %11110010   ; ████  █
        .db 8,7
        .db %11111100   ; ██████
        .db %11110010   ; ████  █
@@ -3208,7 +3690,7 @@ spr_ship04i:
        .db %11110000   ;████
 
 auch_bullet  = 1       ;damage to you when hit by an enemy bullet
        .db %11110000   ;████
 
 auch_bullet  = 1       ;damage to you when hit by an enemy bullet
-auch_ground  = 5       ;the same when you hit the ground/ceiling
+auch_ground  = 5       ;the same but when you hit the ground
 auch_collide = 4       ;when you hit an enemy
 auch_ecollide = 2*4    ;damage to the enemy that hit you (skip bit 0/1)
 
 auch_collide = 4       ;when you hit an enemy
 auch_ecollide = 2*4    ;damage to the enemy that hit you (skip bit 0/1)
 
@@ -3231,7 +3713,7 @@ spr_lashit:
        .db %01111100   ; █████
        .db %00111000   ;  ███
 
        .db %01111100   ; █████
        .db %00111000   ;  ███
 
-;-------------------------------- explosions --------------------------------
+;-------------------------------- explosions ---------------------------------
 
 ;spr_lashit:           ;the same as spr_multiple2
 ;      .db 7,7
 
 ;spr_lashit:           ;the same as spr_multiple2
 ;      .db 7,7
@@ -3405,7 +3887,7 @@ spr_yexplosion:
        .db %01000000   ; █
        .db %00010100   ;   █ █
 
        .db %01000000   ; █
        .db %00010100   ;   █ █
 
-;--------------------------------- bullets ----------------------------------
+;--------------------------------- bullets -----------------------------------
 
 bullettable:
        .db (spr_bullet01-spr_bullet01) ;0
 
 bullettable:
        .db (spr_bullet01-spr_bullet01) ;0
@@ -3537,13 +4019,15 @@ doublebeam = %01010010  ;45 degrees
 extrabulletpos:
        .db  3 ;tail/double yposition
 
 extrabulletpos:
        .db  3 ;tail/double yposition
 
-;------------------------------------ bar -----------------------------------
+;------------------------------------ bar ------------------------------------
+
+#ifdef TI86
 
 spr_lship:
        .db 5,3                 ;li'l ship indicating lives left
 
 spr_lship:
        .db 5,3                 ;li'l ship indicating lives left
-       .db %11100000           ;███
-       .db %01111000           ; ████
-       .db %11100000           ;███
+       .db %11100000           ;███   ▒▒▒
+       .db %01111000           ; ████  ▒▒▒▒
+       .db %11100000           ;███   ▒▒▒
 lshipsize = 5                  ;space between two ship icons
 
 spr_icon:
 lshipsize = 5                  ;space between two ship icons
 
 spr_icon:
@@ -3579,58 +4063,40 @@ spr_icon00:
        .db %01010110
        .db %10101010
        .db %11111110
        .db %01010110
        .db %10101010
        .db %11111110
-;      .db %00000000
-spr_icon00_:
-       .db 16,7        ;unused  .......:.......:
-       .db %10101010           ;█ █ █ █ █ █ █ █
-       .db %11010101           ;██ █ █ █ █ █ █ █
-       .db %10101010           ;█ █ █ █ █ █ █ █
-       .db %11010101           ;██ █ █ █ █ █ █ █
-       .db %10101010           ;█ █ █ █ █ █ █ █
-       .db %11010101           ;██ █ █ █ █ █ █ █
-       .db %10101010           ;█ █ █ █ █ █ █ █
-       .db 7
-       .db %10101010
-       .db %01010101
-       .db %10101010
-       .db %01010101
-       .db %10101010
-       .db %01010101
-       .db %10101010
-spr_icon01:
-       .db 16,7        ;shield  .......:.......:
-       .db %10001111           ;█   ███████  █  ▒
-       .db %10011001           ;█  ██  █████  █ ▒
-       .db %10111100           ;█ ████   ████ █ ▒
-       .db %10111000           ;█ ███   █  ██ █ ▒
-       .db %10111100           ;█ ████   ████ █ ▒
-       .db %10011001           ;█  ██  █████  █ ▒
-       .db %10001111           ;█   ███████  █  ▒
-       .db 7
-       .db %11100100
-       .db %11110010
-       .db %01111010
-       .db %10011010
-       .db %01111010
-       .db %11110010
-       .db %11100100
+;spr_icon01:
+;      .db 16,7        ;shield  .......:.......:
+;      .db %10001111           ;█   ███████  █  ▒
+;      .db %10011001           ;█  ██  █████  █ ▒
+;      .db %10111100           ;█ ████   ████ █ ▒
+;      .db %10111000           ;█ ███   █  ██ █ ▒
+;      .db %10111100           ;█ ████   ████ █ ▒
+;      .db %10011001           ;█  ██  █████  █ ▒
+;      .db %10001111           ;█   ███████  █  ▒
+;      .db 7
+;      .db %11100100
+;      .db %11110010
+;      .db %01111010
+;      .db %10011010
+;      .db %01111010
+;      .db %11110010
+;      .db %11100100
 maxarmor = 63                          ;maximum HPs you can get
 maxarmor = 63                          ;maximum HPs you can get
-spr_icon02a:
-       .db 16,6        ;tailbeam.......:.......:
-       .db %10000000           ;█               ▒
-       .db %10000011           ;█     ██        ▒
-       .db %10000001           ;█      ███      ▒
-       .db %10111011           ;█ ███ ███ ██  ██▒
-       .db %10000001           ;█      ███      ▒
-       .db %10000011           ;█     ██        ▒
+;spr_icon02a:
+;      .db 16,6        ;tailbeam.......:.......:
 ;      .db %10000000           ;█               ▒
 ;      .db %10000000           ;█               ▒
-       .db 5
-       .db %00000000
-       .db %00000000
-       .db %11000000
-       .db %10110011
-       .db %11000000
-spr_icon02b:
+;      .db %10000011           ;█     ██        ▒
+;      .db %10000001           ;█      ███      ▒
+;      .db %10111011           ;█ ███ ███ ██  ██▒
+;      .db %10000001           ;█      ███      ▒
+;      .db %10000011           ;█     ██        ▒
+;      .db %10000000           ;█               ▒
+;      .db 5
+;      .db %00000000
+;      .db %00000000
+;      .db %11000000
+;      .db %10110011
+;      .db %11000000
+spr_icon02:
        .db 16,7        ;updouble.......:.......:
        .db %10000000           ;█          ██   ▒
        .db %10000000           ;█         ██    ▒
        .db 16,7        ;updouble.......:.......:
        .db %10000000           ;█          ██   ▒
        .db %10000000           ;█         ██    ▒
@@ -3692,24 +4158,108 @@ spr_icon05:
        .db %10000000
        .db %00000000
        .db %11000011
        .db %10000000
        .db %00000000
        .db %11000011
+
+#endif
+#ifdef TI83
+
+spr_lship:
+       .db 3,3                 ;li'l ship indicating lives left
+       .db %11000000           ;██  ▒▒
+       .db %01100000           ; ██  ▒▒
+       .db %11000000           ;██  ▒▒
+lshipsize = 3                  ;space between two ship icons
+
+spr_icon:
+       .db 10,7        ;selected.......:.......:
+       .db %11111111           ;███████████
+       .db %11000000           ;██        █
+       .db %11000000           ;██        █
+       .db %11000000           ;██        █
+       .db %11000000           ;██        █
+       .db %11000000           ;██        █
+       .db %11111111           ;███████████
+       .db 7
+       .db %11100000
+       .db %00100000
+       .db %00100000
+       .db %00100000
+       .db %00100000
+       .db %00100000
+       .db %11100000
+spr_icon00:
+       .db 9,7         ;unused  .......:.......:
+       .db %10000000           ;█
+       .db %10111111           ;█ ███████
+       .db %10101010           ;█ █ █ █ █
+       .db %10110101           ;█ ██ █ ██
+       .db %10101010           ;█ █ █ █ █
+       .db %10111111           ;█ ███████
+       .db %10000000           ;█
+       .db 6
+       .db %00000000
+       .db %10000000
+       .db %10000000
+       .db %10000000
+       .db %10000000
+       .db %10000000
+maxarmor = 63                          ;maximum HPs you can get
+spr_icon03:
+       .db 5,7         ;laser   .......:.......:
+       .db %10000000           ;█         ▒
+       .db %10100000           ;█ █   ▒▒▒ ▒
+       .db %10100000           ;█ █   ▒▒▒ ▒
+       .db %10100000           ;█ █   ▒▒▒ ▒
+       .db %10100000           ;█ █   ▒▒▒ ▒
+       .db %10111000           ;█ ███ ▒▒▒ ▒
+       .db %10000000           ;█         ▒
+spr_icon04:
+       .db 5,7         ;bullets .......:.......:
+       .db %10000000           ;█         ▒
+       .db %10110000           ;█ ██  ▒▒▒ ▒
+       .db %10101000           ;█ █ █ ▒▒▒ ▒
+       .db %10110000           ;█ ██  ▒▒▒ ▒
+       .db %10101000           ;█ █ █ ▒▒▒ ▒
+       .db %10110000           ;█ ██  ▒▒▒ ▒
+       .db %10000000           ;█         ▒
+spr_icon05:
+       .db 7,7         ;multiple.......:.......:
+       .db %10000000           ;█          ▒
+       .db %10100010           ;█ █   █    ▒
+       .db %10110110           ;█ ██ ██    ▒
+       .db %10101010           ;█ █ █ █    ▒
+       .db %10100010           ;█ █   █    ▒
+       .db %10100010           ;█ █   █    ▒
+       .db %10000000           ;█          ▒
+
+#endif
+
 spr_dividerline:
        .db 8,7
        .db 128,128,128,128,128,128,128 ;128 = %10000000
 
 spr_dividerline:
        .db 8,7
        .db 128,128,128,128,128,128,128 ;128 = %10000000
 
-;---------------------------- texts -----------------------------------------
+;---------------------------- texts ------------------------------------------
 
 
+#ifdef TI83
+txt_email:     .db 127," www.shiar.org ",127,0 ;title screen
+_txt_email       = $3A20
+txt_about:     .db "v1.0.C21 ",127," by Shiar",0 ;right behind txt_email
+_txt_about       = $3311
+#endif
+#ifdef TI86
 txt_email:     .db "www.shiar.org ",127 ;title screen
                .db " shiar0@hotmail.com",0
 _txt_email       = $3A01 ;$3A1E=just email
 txt_email:     .db "www.shiar.org ",127 ;title screen
                .db " shiar0@hotmail.com",0
 _txt_email       = $3A01 ;$3A1E=just email
-txt_about:     .db "v1.0.A23 ",127," by Shiar",0 ;right behind txt_email
+txt_about:     .db "v1.0.C21 ",127," by Shiar",0 ;right behind txt_email
 _txt_about       = $3321
 _txt_about       = $3321
+#endif
+
 txt_menu1:     .db "NEW GAME",0
 txt_menu2:     .db "CONTINUE",0
 
 txt_difhardcore:.db "Hardcore!",0
 txt_difnormal: .db "Normal",0
 txt_menu1:     .db "NEW GAME",0
 txt_menu2:     .db "CONTINUE",0
 
 txt_difhardcore:.db "Hardcore!",0
 txt_difnormal: .db "Normal",0
-txt_updouble:  .db "Up Double",0
-txt_tailbeam:  .db "Tail Beam",0
+txt_shpbeam:   .db "Beam",0
+txt_shplaser:  .db "Laser",0
 
 txt_level:     .db "LEVEL ",0 ;new level screen
 txt_lives:     .db   "Lx0",0
 
 txt_level:     .db "LEVEL ",0 ;new level screen
 txt_lives:     .db   "Lx0",0
@@ -3729,199 +4279,317 @@ txt_teacher:  .db "(2",Lpi,"*.98)/sin 13",0 ;teacher
 txt_teacherans:        .db Lneg,"14.6549373495",0
 #endif
 
 txt_teacherans:        .db Lneg,"14.6549373495",0
 #endif
 
-;---------------------------- save data -------------------------------------
-
-storehi_start:
-hiscore                .dw 0                   ;default hiscore
-hiname         .db "by shiar",0        ;   "       "    name
-storehi_end:
-
-invertmode:     cpl ;/or a             ;saves B<>W mode setting        cpl
-
-storesave_start:                       ;--SAVED GAME--                 defs:
-your_ship      .dw spr_ship01          ;your sprite (^invertmode^)     sprs1
-level          .db  1                  ;level number                   1
-levelp         .dw level00             ;pointer to level data          lev00
-pickuptimer    .db  4                  ;counts when to place a pickup  4
-your_extramode .db  1                  ;you have tail or double        1
-your_score     .dw  0                  ;current score                  0
-your_pickup    .db  0                  ;pickups already picked up      0
-your_occ       .db  0                  ;0=normal 1..16=exploding       0
-your_shield    .db  0                  ;invincibility left             0
-your_armor     .db 24                  ;HP left                        24
-your_lives     .db  3                  ;lives left                     3
-your_weapon    .db  9                  ;current weapon upgrade         0
-your_multiples .db  0                  ;multiples present              0
-your_extra     .db  0                  ;extra beam present             0
-hardcore       .db  0                  ;hardcore mode if non-0         0
-storesave_end:
-
-time2invert:   .db 0                   ;time until b<>w switch (0 at startup)
-
-;------------------------------ levels data ---------------------------------
+;------------------------------ levels data ----------------------------------
 
 ;format:boss: [moveType] [enemyType]
 ;      @level: [nr.dif.enemies]x [enemy nr]
 ;      [min. enemy frequency] [enemy frequency max.inc]
 
 ;format:boss: [moveType] [enemyType]
 ;      @level: [nr.dif.enemies]x [enemy nr]
 ;      [min. enemy frequency] [enemy frequency max.inc]
-;      [next lvl (=nrenemies+4)] [level_info: 000000 1:ceiling 1:ground]
+;      [next lvl (=nrenemies+4)] [level_info: 0000000 1:ground]
 ;      [tunnel size] [groundtype] [stars1] [stars2]
 ;efrequency must be odd if halfluring!
 
 ;      [tunnel size] [groundtype] [stars1] [stars2]
 ;efrequency must be odd if halfluring!
 
+#ifdef story
        .db 0   ;storyline ID
 levelstart:    ;[y-pos] [x-pos] [text,0] [SFX lines; 0=more text] [-1=end]
        .db 0   ;storyline ID
 levelstart:    ;[y-pos] [x-pos] [text,0] [SFX lines; 0=more text] [-1=end]
-       .db 1,33,"Imperial ships have",0,0
-       .db 7,9,"been sent to intercept you",0,0 ;,7-1+6,-1
-       .db 41,33,"Note STORYLINE and LEVELS",0,0
-       .db 48,38,"---- AINT DONE YET! ----",0,48-1+6,-1
-
-       .db 30
-level00:.db 5,3,5,3,2,2
+       .db 28,35,"COSMIC YEAR 6718",0,28-28+6
+       .db 10,8,"INTELLIGENCE REPORTS ",
+       .db     "BACTERION",0,0
+       .db 17,7,"FORCES ARE BUILDING A ",
+       .db     "NEW VESSEL",0,0
+       .db 33,32,"A POWERFUL VESSEL",0,0
+       .db 40,15,"THAT COULD EASILY DESTROY",
+       .db     " US",0,0
+       .db 47,36,"ONCE COMPLETED",0,47-10+6
+
+       .db 22,1,"YOU HAVE TO GO INTO THE ",
+       .db     "HEART OF THEIR",0,0
+       .db 28,1,"SPACE AND DESTROY THE VESSEL",
+       .db     " BEFORE",0,0
+       .db 34,22,"IT BECOMES OPERATIONAL.",0,34-22+6
+       .db 25,56,"GOOD",0,0
+       .db 32,56,"LUCK",0,32-25+6
+       .db -1
+#endif
+       .db 40
+#ifndef story
+levelstart:
+#endif
+level00: ;intro
+       .db 5,3,5,3,2,2
        .db 28,73,13
        .db 28,73,13
-       .db %00,0,1,1
+       .db %0,0,1,1
 
 
-       .db 31 ;boss for level01
-level01:.db 2,3,5 ;enemies
+       .db 41
+level01:.db 2,3,5
        .db 26,70,20
        .db 26,70,20
-       .db %00,0,1,1
+       .db %0,0,1,1
 
 
-       .db 32
+       .db 42
 level02:.db 3,3,4,5
        .db 20,60,60
 level02:.db 3,3,4,5
        .db 20,60,60
-       .db %00,0,1,1
+       .db %0,0,1,1
 
 
-       .db 33
+       .db 43
 level03:.db 4,4,5,6,7
        .db 17,40,75
 level03:.db 4,4,5,6,7
        .db 17,40,75
-       .db %00,0,1,1
-
+       .db %0,0,1,1
+#ifdef story
        .db 0
        .db 0
-       .db 1,1,"Long-Range scanners are ",
-       .db     "showing",0,0
-       .db 8,1,"lots of enemy vessels ",
-       .db     "advancing fast.",0,8-1+6
-       .db 24,1,"I'm changing course to a",
-       .db     " nearby ",0,0
-       .db 31,1,"asteroid belt and try to",0,0
-       .db 38,1,"lose them inthere.",0,38-24+6,-1
-
-;---- approaching asteroid belt
-       .db 34
-level04:.db 5,8,8,9,11,12
+       .db 25,2,"LONG-RANGE SCANNERS ARE ",
+       .db     "SHOWING",0,0
+       .db 32,2,"LOTS OF ENEMY VESSELS ",
+       .db     "APPROACHING",0,32-25+6
+       .db 22,9,"I'M CHANGING COURSE TO A",
+       .db     " NEARBY",0,0
+       .db 28,4,"ASTEROID BELT AND TRY TO ",
+       .db     "LOSE THEM",0,0
+       .db 34,48,"INTHERE...",0,34-22+6
+       .db -1
+#endif
+       .db 44
+level04: ;approaching asteroid belt
+       .db 5,8,8,9,11,12
        .db 17,27,70
        .db 17,27,70
-       .db %00,0,1,1
+       .db %0,0,1,1
 
 
-;---- inside
-       .db 35
-level05:.db 7,10,11,9,11,12,12,14
+       .db 45
+level05: ;inside belt
+       .db 7,10,11,9,11,12,12,14
        .db 12,24,80
        .db 12,24,80
-       .db %00,0,1,1
+       .db %0,0,1,1
 
 
-       .db 36
-level06:.db 10,10,11,12,12,14,13,13,14,15,15
+       .db 46
+level06: ;(deep inside)
+       .db 10,10,11,12,12,14,13,13,14,15,15
        .db 7,18,180
        .db 7,18,180
-       .db %00,0,1,1
-
-;out
-       .db 37
+       .db %0,0,1,1
+#ifdef story
+       .db 0
+       .db 28,6,"APPROACHING BACTERION ",
+       .db     "TERRATORY",0,6
+       .db 25,10,"READING LOTS OF ENEMY ",
+       .db     "VESSELS",0,0
+       .db 32,24,"ON AN INTERCEPT COURSE",0,32-25+6
+       .db -1
+#endif
+       .db 47
 level07:.db 4,16,17,18,6
        .db 22,29,62
 level07:.db 4,16,17,18,6
        .db 22,29,62
-       .db %00,0,1,1 ;-1=%11111111=line
+       .db %0,0,1,1 ;-1=%11111111=line
 
 
-       .db 38
+       .db 48
 level08:.db 5,16,17,18,19,19
        .db 20,38,57
 level08:.db 5,16,17,18,19,19
        .db 20,38,57
-       .db %00,0,1,1
+       .db %0,0,1,1
 
 
-       .db 39
-level09:.db 3,19,20,21
+       .db 49
+level09: ;lot of triples
+       .db 3,19,20,21
        .db 19,63,57
        .db 19,63,57
-       .db %00,0,1,1
-
-       .db 40
-level10:.db 7,22,23,24,24,24,25,26
-       .db 20,22,63
-       .db %00,0,1,1
-
-;endlevel
-       .db 41
-level11:.db 1,26
-       .db 20,20,80
-       .db %00,0,1,1
-
-       .db 0,1,1,"That`s all folks...",0,0
-       .db 20,50,"for now...",0,20-0+6,-1
-
-endlevel = 12
+       .db %0,0,1,1
+
+       .db 50
+level10: ;likely no pickups here (hard)
+       .db 7,22,23,24,24,24,25,26
+       .db 22,26,51
+       .db %0,0,1,1
+#ifdef story
+       .db 0
+       .db 24,18,"REACHED THEIR HOMEPLANET",0,0
+       .db 33,18,"SCANNING FOR THE VESSEL...",0,33-24+6
+       .db -1
+#endif
+       .db 50
+level11: ;planet level
+       .db 8,27,27,28,28,29,29,29,30
+       .db 6,8,108
+       .db %1,-7,-1,-1
+
+       .db 50
+level12: ;planet level 2
+       .db 4,39,30,31,31
+       .db 16,8,49
+       .db %1,-10,1,1
+#ifdef story
+       .db 0
+       .db 18,11,"ENEMY VESSEL STRAIGHT "
+       .db     "AHEAD...",0,0
+       .db 25,16,"IT SEEMS TO BE "
+       .db     "OPERATIONAL!!",0,0
+       .db 33,19,"WELL YOU'VE COME THIS "
+       .db     "FAR;",0,0
+       .db 39,8,"TRY TO DESTROY IT, OR DIE "
+       .db     "TRYING....",0,39-18+6
+       .db -1
+#endif
+       .db 51
+level13: ;endlevel
+       .db 1,26
+       .db 5,20,18
+       .db %0,0,1,1
+#ifdef story
+       .db 0
+       .db 1,1,"Thats all folks...",0,0
+       .db 20,50,"for now...",0,20-1+6
+       .db -1
+#endif
+endlevel = 13+1
 
 pickupfreq = 19
 
 
 pickupfreq = 19
 
-;------------------------------ enemies -------------------------------------
+;------------------------------ enemies --------------------------------------
 
 ;format:       [HP64] [000000:HP 00:occ] [sprite] [xpos] [appearance(ypos)]
 ;              [movetype] [time2fire] [firefreq] [firetype]
 
 ;format:       [HP64] [000000:HP 00:occ] [sprite] [xpos] [appearance(ypos)]
 ;              [movetype] [time2fire] [firefreq] [firetype]
-;occ:          00=no enemy; 01=exploding (sprite=frame); 10=pickup; 11=enemy
-;appearances:  1=random; 2=lure; 3=halflure
-;movetypes:    1=updown; 2=1/4x; 3=1/2x; 4=3/4x; 5=3/2x; 6=2x; 7=ylure50%;
-;              8=ylure; 9=ylure50%; 10=x+y-lure 50%; 11=-1/2x; 12=-1x
-;firetypes:    1=normal; 6=aiming; 7=triple; 8=double; 9=quad; 10=dquad; 11=ran
+;occ:          %00=no enemy; 01=exploding (sprite=frame); 10=pickup; 11=enemy
+;appearances:  0+=ypos; -1=random; -2=lure; -3=halflure
+;movetypes:    0=1x; 1=updown; 2=0.25x; 3=0.5x; 4=0.75x; 5=1.25x; 6=1.5x;
+;              7=2x; 8=3x; 9=ylure50%; 10=ylure; 11=ylure50%; 12=x+y-lure 50%;
+;              13=-1/2x; 14=-1x; 16=boss; 17=right+1
+;firetypes:    1=normal; 2=down; 3=up; 4=1/2down; 5=1/2up; 6=aiming(2-5);
+;              7=triple; 8=double; 9=wide5; 10=wide7; 11=ran; 12=10+enemies
+;              13=base; 14=ranY; 15=wide3; 16=5x
 
 enemyspecs:  ;10 bytes/enemy | max.enemies <64 | sprites use <768 bytes
 
 enemyspecs:  ;10 bytes/enemy | max.enemies <64 | sprites use <768 bytes
+#ifdef TI86
 ;0-1=pickups
 ;0-1=pickups
-       .db 0,%00000010,spr_enemyP1&255,spr_enemyP1/256,128,-2,03, 0, 0,1 ;pickup
-       .db 0,%00000110,spr_enemyP2&255,spr_enemyP2/256,128,-2,03, 0, 0,1 ;bigpickup
-;2-7=basic enemies     ,               ,               ,   , ,  ,  ,  ,
-       .db 0,%00001011,spr_enemyE0&255,spr_enemyE0/256,128,-1,00,12, 0,1 ;intro
-       .db 0,%00100011,spr_enemyE1&255,spr_enemyE1/256,128,-1,00,10, 0,1 ;weak
-       .db 0,%01100011,spr_enemyE4&255,spr_enemyE4/256,128,-1,03, 6,50,1 ;slow
-       .db 0,%01001011,spr_enemyE2&255,spr_enemyE2/256,128,-1,00, 1, 0,1
-       .db 0,%01011011,spr_enemyE3&255,spr_enemyE3/256,128,-3,00,19,39,8 ;heavy
-       .db 0,%01010011,spr_enemyE5&255,spr_enemyE5/256,128,-3,05, 1, 0,1 ;fast
-;8-10=backwards enemies,               ,               ,   ,  ,  ,  ,  ,
-       .db 0,%00111011,spr_enemyB1&255,spr_enemyB1/256,000,-3,11,19,92,1
-       .db 0,%01011011,spr_enemyB2&255,spr_enemyB2/256,000,-1,12,11,45,1
-       .db 0,%01101011,spr_enemyB3&255,spr_enemyB3/256,000,-1,11,10,41,8 ;small
-;11-15=asteroid        ,               ,               ,   ,  ,  ,  ,  ,
-       .db 0,%01001011,spr_enemyA1&255,spr_enemyA1/256,128,-1,04, 0, 0,1
-       .db 0,%01111011,spr_enemyA2&255,spr_enemyA2/256,128,-1,00, 0, 0,1
-       .db 0,%10110011,spr_enemyA3&255,spr_enemyA3/256,128,-1,05, 0, 0,1
-       .db 1,%00010011,spr_enemyA4&255,spr_enemyA4/256,128,-1,03, 0, 0,1 ;slow+hard
-       .db 0,%01111011,spr_enemyA4&255,spr_enemyA4/256,128,-1,06, 0, 0,1
-;16-21=improved enemies,               ,               ,   ,  ,  ,  ,  ,
-       .db 0,%10010011,spr_enemyG1&255,spr_enemyG1/256,128,-3,00, 3,40,1
-       .db 0,%10111011,spr_enemyG2&255,spr_enemyG2/256,128,-3,00, 1,36,1
-       .db 0,%01100011,spr_enemyG5&255,spr_enemyG5/256,128,-1,01, 9,52,1 ;updown
-       .db 0,%11110011,spr_enemyG3&255,spr_enemyG3/256,128,-3,04, 7,99,7 ;3x
-       .db 1,%01101011,spr_enemyG4&255,spr_enemyG4/256,128,-2,01,17, 0,7 ;updown3x
-       .db 1,%00010011,spr_enemyG6&255,spr_enemyG6/256,128,-2,07,62,60,8 ;lure
-;22-26=hi-speed        ,               ,               ,   ,  ,  ,  ,  ,
-       .db 1,%00010011,spr_enemyS2&255,spr_enemyS2/256,128,-2,05, 3,32,8 ;fast
-       .db 0,%11111011,spr_enemyS1&255,spr_enemyS1/256,128,-3,07, 2,28,1 ;lure
-       .db 1,%00101011,spr_enemyS4&255,spr_enemyS4/256,128,-3,06, 0, 0,1 ;vfast+nofire
-       .db 1,%01110011,spr_enemyS3&255,spr_enemyS3/256,128,-1,07, 1,20,8 ;lure
-       .db 0,%11011011,spr_enemyS2&255,spr_enemyS2/256,128,-2,01, 3,7,11 ;updown+ran
-;27-28=unused,         ,               ,               ,   ,  ,  ,  ,  ,
-       .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,-2,03, 0, 0,1 ;27
-;29=final boss' enemy
-       .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,-3,01, 0, 0,1 ;moving
-       .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,23,09, 0, 0,1 ;mid+lure
-boss1enemy = 28
-boss2enemy = 29
-;30-34=first bosses    ,               ,               ,   ,  ,  ,  ,  ,
-       .db 2,%01000111,spr_boss01 &255,spr_boss01 /256,127,-1,09,35,50,7 ;triple
-       .db 2,%01010011,spr_boss02 &255,spr_boss02 /256,127,-1,09,20,12,1 ;small
-       .db 2,%01111011,spr_boss03 &255,spr_boss03 /256,127,-1,09,15,11,8 ;normal
-       .db 2,%10011111,spr_boss04 &255,spr_boss04 /256,127,-3,10,10,11,1 ;moving
-       .db 1,%11111011,spr_boss05 &255,spr_boss05 /256,127,-2,10, 1, 4,1 ;weak+rapidfire
-;35-36=asteroid bosses ,               ,               ,   ,  ,  ,  ,  ,
-       .db 4,%00010111,spr_bossA1 &255,spr_bossA1 /256,127,-1,10,36,14,6
-       .db 4,%01101111,spr_bossA1 &255,spr_bossA1 /256,127,-2,10,28,12,6
-;37-41=big bosses      ,               ,               ,   ,  ,  ,  ,  ,
-       .db 4,%00010111,spr_boss07 &255,spr_boss07 /256,127,-3,08,31, 8,7
-       .db 5,%00101011,spr_boss06 &255,spr_boss06 /256,127,-3,08,13, 7,7
-       .db 6,%10001111,spr_boss08 &255,spr_boss08 /256,127,-1,08,18, 8,9  ;quad
-       .db 7,%00101011,spr_boss09 &255,spr_boss09 /256,127,-1,08,21, 9,10 ;6x
-       .db 9,%11011011,spr_boss09 &255,spr_boss09 /256,127,-1,08,12,11,12 ;enemies
-       .db 9,%11011011,spr_boss0E &255,spr_boss0E /256,119,00,13,12,13,13
+       .db  0,%00000010,spr_enemyP1&255,spr_enemyP1/256,128,-2,03, 0, 0,1 ;pickup
+       .db  0,%00000110,spr_enemyP2&255,spr_enemyP2/256,128,-2,03, 0, 0,1 ;bigpickup
+;2-7=basic enemies      ,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db  0,%00001011,spr_enemyE0&255,spr_enemyE0/256,128,-1,00,12, 0,1 ;intro
+       .db  0,%00100011,spr_enemyE1&255,spr_enemyE1/256,128,-1,00,10, 0,1 ;weak
+       .db  0,%01100011,spr_enemyE4&255,spr_enemyE4/256,128,-1,03, 6,50,1 ;slow
+       .db  0,%01001011,spr_enemyE2&255,spr_enemyE2/256,128,-1,00, 1, 0,1
+       .db  0,%01011011,spr_enemyE3&255,spr_enemyE3/256,128,-3,00,19,39,8 ;heavy
+       .db  0,%01010011,spr_enemyE5&255,spr_enemyE5/256,128,-3,05, 1, 0,1 ;fast
+;8-10=backwards enemies ,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db  0,%00111011,spr_enemyB1&255,spr_enemyB1/256,000,-3,13,19,92,1
+       .db  0,%01011011,spr_enemyB2&255,spr_enemyB2/256,000,-1,14,11,45,1
+       .db  0,%01101011,spr_enemyB3&255,spr_enemyB3/256,000,-1,13,10,41,8 ;small
+;11-15=asteroid         ,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db  0,%01001011,spr_enemyA1&255,spr_enemyA1/256,128,-1,04, 0, 0,1
+       .db  0,%01111011,spr_enemyA2&255,spr_enemyA2/256,128,-1,00, 0, 0,1
+       .db  0,%10110011,spr_enemyA3&255,spr_enemyA3/256,128,-1,06, 0, 0,1
+       .db  1,%00010011,spr_enemyA4&255,spr_enemyA4/256,128,-1,03, 0, 0,1 ;slow+hard
+       .db  0,%01111011,spr_enemyA4&255,spr_enemyA4/256,128,-1,07, 0, 0,1
+;16-21=improved enemies ,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db  0,%10010011,spr_enemyG1&255,spr_enemyG1/256,128,-3,00, 3,40,1
+       .db  0,%10111011,spr_enemyG2&255,spr_enemyG2/256,128,-3,00, 1,36,1
+       .db  0,%01100011,spr_enemyG5&255,spr_enemyG5/256,128,-1,01, 9,52,1 ;updown
+       .db  0,%11110011,spr_enemyG3&255,spr_enemyG3/256,128,-3,04, 7,99,15 ;3x
+       .db  1,%01101011,spr_enemyG4&255,spr_enemyG4/256,128,-2,01,17, 0,15 ;updown3x
+       .db  1,%00010011,spr_enemyG6&255,spr_enemyG6/256,128,-2,09,62,60,8 ;lure
+;22-26=hi-speed         ,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db  1,%00010011,spr_enemyS2&255,spr_enemyS2/256,128,-2,06, 3,32,8 ;fast
+       .db  0,%11111011,spr_enemyS1&255,spr_enemyS1/256,128,-3,09, 2,28,1 ;lure
+       .db  1,%00101011,spr_enemyS4&255,spr_enemyS4/256,128,-3,07, 0, 0,1 ;vfast+nofire
+       .db  1,%01110011,spr_enemyS3&255,spr_enemyS3/256,128,-1,09, 1,20,8 ;lure+
+       .db  0,%11011011,spr_enemyS2&255,spr_enemyS2/256,128,-2,01, 3,7,11 ;updown+ran
+;27-29=hyper  ,%        ,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db  1,%00001011,spr_enemyN1&255,spr_enemyN1/256,128,-1,07, 0, 0,1
+       .db  1,%00010111,spr_enemyN2&255,spr_enemyN2/256,128,-2,07, 0, 0,1
+       .db  1,%00001111,spr_enemyN3&255,spr_enemyN3/256,128,-1,08, 0, 0,1 ;xfast
+;30-31=turrets,%        ,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db  1,%10001111,spr_enemyT1&255,spr_enemyT1/256,128,-4,00, 1,15,3 ;turret L
+       .db  1,%11011011,spr_enemyT1&255,spr_enemyT1/256,128,-4,00, 1,16,5 ;turret l
+
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0
+;37-38=final boss' enemy,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db  0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,-3,01, 0, 0,1 ;moving
+       .db  0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,23,11, 0, 0,1 ;mid+lure
+;39=misc      ,%        ,spr_enemy  &255,spr_enemy  /256,  X, Y, d,WT,WF,W
+       .db -1,%11111111,spr_enemyM2&255,spr_enemyM2/256,128,-2,08, 0, 0,1 ;bullet
+boss1enemy = 37
+boss2enemy = 38
+;40-44=first bosses     ,spr_      &255,spr_       /256,  X, Y, d,WT,WF,W
+       .db  2,%01000111,spr_boss01&255,spr_boss01 /256,127,-1,11,35,48,15 ;triple
+       .db  2,%01010011,spr_boss02&255,spr_boss02 /256,127,-1,11,20,12,1  ;single
+       .db  2,%11011011,spr_boss03&255,spr_boss03 /256,127,-1,10,15, 8,8  ;double
+       .db  3,%00111111,spr_boss04&255,spr_boss04 /256,127,-3,12,10,11,1  ;Flure
+       .db  4,%01011011,spr_boss05&255,spr_boss05 /256,000,-2,17, 1,3,11  ;ranfire
+;45-46=asteroid bosses  ,spr_      &255,spr_       /256,  X, Y,  ,  ,  ,
+       .db  5,%01101111,spr_bossA1&255,spr_bossA1 /256,127,-2,12,28,14,7  ;Flure
+       .db 20,%00011111,spr_bossA2&255,spr_bossA2 /256,119,00,16,31, 3,14 ;fullscreen
+;47-51=big bosses       ,spr_      &255,spr_       /256,  X, Y,  ,  ,  ,
+       .db  4,%00010111,spr_boss07&255,spr_boss07 /256,127,-3,10,31, 8,16 ;5x
+       .db  6,%10001111,spr_boss08&255,spr_boss08 /256,127,-1,10,18, 8,9  ;quad
+       .db  3,%10111011,spr_boss06&255,spr_boss06 /256,127,-2,12, 1, 4,1  ;weak+rapidfire
+       .db  7,%11101011,spr_boss09&255,spr_boss09 /256,127,-1,10,21, 9,10 ;6x
+       .db  9,%11011011,spr_boss10&255,spr_boss10 /256,127,-1,10,12,11,12 ;enemies
+#else
+;0-1=pickups
+       .db  0,%00000010,spr_enemyP1&255,spr_enemyP1/256,96,-2,03, 0, 0,1 ;pickup
+       .db  0,%00000110,spr_enemyP2&255,spr_enemyP2/256,96,-2,03, 0, 0,1 ;bigpickup
+;2-7=basic enemies      ,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db  0,%00001011,spr_enemyE0&255,spr_enemyE0/256,96,-1,00,12, 0,1 ;intro
+       .db  0,%00100011,spr_enemyE1&255,spr_enemyE1/256,96,-1,00,10, 0,1 ;weak
+       .db  0,%01100011,spr_enemyE4&255,spr_enemyE4/256,96,-1,03, 6,50,1 ;slow
+       .db  0,%01001011,spr_enemyE2&255,spr_enemyE2/256,96,-1,00, 1, 0,1
+       .db  0,%01011011,spr_enemyE3&255,spr_enemyE3/256,96,-3,00,19,39,8 ;heavy
+       .db  0,%01010011,spr_enemyE5&255,spr_enemyE5/256,96,-3,05, 1, 0,1 ;fast
+;8-10=backwards enemies ,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db  0,%00111011,spr_enemyB1&255,spr_enemyB1/256,00,-3,13,19,92,1
+       .db  0,%01011011,spr_enemyB2&255,spr_enemyB2/256,00,-1,14,11,45,1
+       .db  0,%01101011,spr_enemyB3&255,spr_enemyB3/256,00,-1,13,10,41,8 ;small
+;11-15=asteroid         ,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db  0,%01001011,spr_enemyA1&255,spr_enemyA1/256,96,-1,04, 0, 0,1
+       .db  0,%01111011,spr_enemyA2&255,spr_enemyA2/256,96,-1,00, 0, 0,1
+       .db  0,%10110011,spr_enemyA3&255,spr_enemyA3/256,96,-1,06, 0, 0,1
+       .db  1,%00010011,spr_enemyA4&255,spr_enemyA4/256,96,-1,03, 0, 0,1 ;slow+hard
+       .db  0,%01111011,spr_enemyA4&255,spr_enemyA4/256,96,-1,07, 0, 0,1
+;16-21=improved enemies ,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db  0,%10010011,spr_enemyG1&255,spr_enemyG1/256,96,-3,00, 3,40,1
+       .db  0,%10111011,spr_enemyG2&255,spr_enemyG2/256,96,-3,00, 1,36,1
+       .db  0,%01100011,spr_enemyG5&255,spr_enemyG5/256,96,-1,01, 9,52,1 ;updown
+       .db  0,%11110011,spr_enemyG3&255,spr_enemyG3/256,96,-3,04, 7,99,15 ;3x
+       .db  1,%01101011,spr_enemyG4&255,spr_enemyG4/256,96,-2,01,17, 0,15 ;updown3x
+       .db  1,%00010011,spr_enemyG6&255,spr_enemyG6/256,96,-2,09,62,60,8 ;lure
+;22-26=hi-speed         ,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db  1,%00010011,spr_enemyS2&255,spr_enemyS2/256,96,-2,06, 3,32,8 ;fast
+       .db  0,%11111011,spr_enemyS1&255,spr_enemyS1/256,96,-3,09, 2,28,1 ;lure
+       .db  1,%00101011,spr_enemyS4&255,spr_enemyS4/256,96,-3,07, 0, 0,1 ;vfast+nofire
+       .db  1,%01110011,spr_enemyS3&255,spr_enemyS3/256,96,-1,09, 1,20,8 ;lure+
+       .db  0,%11011011,spr_enemyS2&255,spr_enemyS2/256,96,-2,01, 3,7,11 ;updown+ran
+;27-29=hyper  ,%        ,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db  1,%00001011,spr_enemyN1&255,spr_enemyN1/256,96,-1,07, 0, 0,1
+       .db  1,%00010111,spr_enemyN2&255,spr_enemyN2/256,96,-2,07, 0, 0,1
+       .db  1,%00001111,spr_enemyN3&255,spr_enemyN3/256,96,-1,08, 0, 0,1 ;xfast
+;30-31=turrets,%        ,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db  1,%10001111,spr_enemyT1&255,spr_enemyT1/256,96,-4,00, 1,15,3 ;turret L
+       .db  1,%11011011,spr_enemyT1&255,spr_enemyT1/256,96,-4,00, 1,16,5 ;turret l
+
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0
+       .db  0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0
+;37-38=final boss' enemy,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db  0,%11110011,spr_enemyM1&255,spr_enemyM1/256,96,-3,01, 0, 0,1 ;moving
+       .db  0,%11110011,spr_enemyM1&255,spr_enemyM1/256,96,23,11, 0, 0,1 ;mid+lure
+;39=misc      ,%        ,spr_enemy  &255,spr_enemy  /256, X, Y, d,WT,WF,W
+       .db -1,%11111111,spr_enemyM2&255,spr_enemyM2/256,96,-2,08, 0, 0,1 ;bullet
+boss1enemy = 37
+boss2enemy = 38
+;40-44=first bosses     ,spr_      &255,spr_       /256, X, Y, d,WT,WF,W
+       .db  2,%01000111,spr_boss01&255,spr_boss01 /256,95,-1,11,35,48,15 ;triple
+       .db  2,%01010011,spr_boss02&255,spr_boss02 /256,95,-1,11,20,12,1  ;single
+       .db  2,%11011011,spr_boss03&255,spr_boss03 /256,95,-1,10,15, 8,8  ;double
+       .db  3,%00111111,spr_boss04&255,spr_boss04 /256,95,-3,12,10,11,1  ;Flure
+       .db  4,%01011011,spr_boss05&255,spr_boss05 /256,00,-2,17, 1,3,11  ;ranfire
+;45-46=asteroid bosses  ,spr_      &255,spr_       /256, X, Y,  ,  ,  ,
+       .db  5,%01101111,spr_bossA1&255,spr_bossA1 /256,95,-2,12,28,14,7  ;Flure
+       .db 20,%00011111,spr_bossA2&255,spr_bossA2 /256,87,00,16,31, 3,14 ;fullscreen
+;47-51=big bosses       ,spr_      &255,spr_       /256, X, Y,  ,  ,  ,
+       .db  4,%00010111,spr_boss07&255,spr_boss07 /256,95,-3,10,31, 8,16 ;5x
+       .db  6,%10001111,spr_boss08&255,spr_boss08 /256,95,-1,10,18, 8,9  ;quad
+       .db  3,%10111011,spr_boss06&255,spr_boss06 /256,95,-2,12, 1, 4,1  ;weak+rapidfire
+       .db  7,%11101011,spr_boss09&255,spr_boss09 /256,95,-1,10,21, 9,10 ;6x
+       .db  9,%11011011,spr_boss10&255,spr_boss10 /256,95,-1,10,12,11,12 ;enemies
+#endif
 
 spr_enemy00:
 spr_enemyP1:
 
 spr_enemy00:
 spr_enemyP1:
@@ -4152,7 +4820,7 @@ spr_enemyS3:
        .db %01111110                   ;  ██████
        .db %00011110                   ;    ████
 spr_enemyS4:
        .db %01111110                   ;  ██████
        .db %00011110                   ;    ████
 spr_enemyS4:
-       .db 8,6                         ;cheap intercept
+       .db 8,6                         ;fast interceptor
        .db %00011011                   ;    ██ ██
        .db %01110110                   ;  ███ ██
        .db %10111100                   ; █ ████
        .db %00011011                   ;    ██ ██
        .db %01110110                   ;  ███ ██
        .db %10111100                   ; █ ████
@@ -4208,6 +4876,25 @@ spr_enemyN5:
        .db %01010010                   ; █ █  █
        .db %01111100                   ;  ████
 
        .db %01010010                   ; █ █  █
        .db %01111100                   ;  ████
 
+spr_enemyT1:
+       .db 8,7                         ;turret left
+       .db %11000000                   ;██
+       .db %01100000                   ; ██
+       .db %00110000                   ;  ██
+       .db %01011100                   ; █ ███
+       .db %10110110                   ;█ ██ ██
+       .db %01011010                   ; █ ██ █
+       .db %11111111                   ;████████
+spr_enemyT2:
+       .db 8,7                         ;turret right
+       .db %00000011                   ;      ██
+       .db %00000110                   ;     ██
+       .db %00001100                   ;    ██
+       .db %00111010                   ;  ███ █
+       .db %01101101                   ; ██ ██ █
+       .db %01011010                   ; █ ██ █
+       .db %11111111                   ;████████
+
 spr_enemyM1:
        .db 8,7                         ;mine
        .db %00111100                   ;  ████
 spr_enemyM1:
        .db 8,7                         ;mine
        .db %00111100                   ;  ████
@@ -4217,6 +4904,14 @@ spr_enemyM1:
        .db %11111111                   ;████████
        .db %01011010                   ; █ ██ █
        .db %00111100                   ;  ████
        .db %11111111                   ;████████
        .db %01011010                   ; █ ██ █
        .db %00111100                   ;  ████
+spr_enemyM2:
+       .db 7,6                         ;giant bullet
+       .db %00011000                   ;   ██▒
+       .db %01111110                   ; ██████▒
+       .db %11111000                   ;█████▒
+       .db %11111100                   ;██████▒
+       .db %01111110                   ; ██████▒
+       .db %00111000                   ;  ███▒
 
 spr_boss01:
        .db 9,12                        ;.......:.2.....:
 
 spr_boss01:
        .db 9,12                        ;.......:.2.....:
@@ -4364,7 +5059,30 @@ spr_bossA1:
        .db %11110000
        .db %11110000
        .db %11000000
        .db %11110000
        .db %11110000
        .db %11000000
-spr_boss06:                            ;modelled after a Nemesis][MSX boss
+spr_boss06:
+       .db 16,10                       ;.......:.......:
+       .db %10111110                   ;█ █████   ███
+       .db %00000011                   ;      ███   ████
+       .db %01110101                   ; ███ █ ████ ██ █
+       .db %11111101                   ;██████ █ ███  █
+       .db %00000110                   ;     ██ █ █ ██ █
+       .db %00000110                   ;     ██ █ █ ██ █
+       .db %11111101                   ;██████ █ ███  █
+       .db %01110101                   ; ███ █ ████ ██ █
+       .db %00000011                   ;      ███   ████
+       .db %10111110                   ;█ █████   ███
+       .db 10
+       .db %00111000
+       .db %10001111
+       .db %11101101
+       .db %01110010
+       .db %10101101
+       .db %10101101
+       .db %01110010
+       .db %11101101
+       .db %10001111
+       .db %00111000
+spr_boss07:                            ;modelled after a Nemesis][MSX boss
        .db 16,15                       ;.......:.......:
        .db %00001111                   ;    █████
        .db %00111110                   ;  █████ █████
        .db 16,15                       ;.......:.......:
        .db %00001111                   ;    █████
        .db %00111110                   ;  █████ █████
@@ -4397,7 +5115,7 @@ spr_boss06:                               ;modelled after a Nemesis][MSX boss
        .db %01111111
        .db %11111000
        .db %10000000
        .db %01111111
        .db %11111000
        .db %10000000
-spr_boss07:                            ;modelled after a Nemesis][MSX boss
+spr_boss08:                            ;modelled after a Nemesis][MSX boss
        .db 16,18                       ;.......:.......:
        .db %00000000                   ;         █ █
        .db %00000111                   ;     ███ ███
        .db 16,18                       ;.......:.......:
        .db %00000000                   ;         █ █
        .db %00000111                   ;     ███ ███
@@ -4437,7 +5155,7 @@ spr_boss07:                               ;modelled after a Nemesis][MSX boss
        .db %11010000
        .db %01110000
        .db %01010000
        .db %11010000
        .db %01110000
        .db %01010000
-spr_boss08:
+spr_boss09:
        .db 14,14                       ;.......:......7:
        .db %01100111                   ; ██  ████  ██
        .db %11001011                   ;██  █ ██ █  ██
        .db 14,14                       ;.......:......7:
        .db %01100111                   ; ██  ████  ██
        .db %11001011                   ;██  █ ██ █  ██
@@ -4468,7 +5186,7 @@ spr_boss08:
        .db %00110100
        .db %01001100
        .db %10011000
        .db %00110100
        .db %01001100
        .db %10011000
-spr_boss09:
+spr_boss10:
        .db 16,19                       ;.......:.......:
        .db %01111011                   ; ████ ███
        .db %10000110                   ;█    ██ █████
        .db 16,19                       ;.......:.......:
        .db %01111011                   ; ████ ███
        .db %10000110                   ;█    ██ █████
@@ -4509,65 +5227,35 @@ spr_boss09:
        .db %10100000
        .db %11111000
        .db %10000000
        .db %10100000
        .db %11111000
        .db %10000000
-spr_boss0E:
-       .db 8,51                        ;.......:.......:
-       .db %00111011                   ; ████ ██
-       .db %01100110                   ;█    ██
-       .db %01110011                   ;      ██
-       .db %00111011                   ;  ███ ██
-       .db %01000111                   ;     ███
-       .db %10101100                   ;    ██
-       .db %01110111                   ;  ██ ███
-       .db %00111011                   ; ████ ██
-       .db %01100100                   ;███  █
-       .db %01000001                   ;    ████
-       .db %01100100                   ;███  █
-       .db %01111011                   ; ████ ██
-       .db %01110111                   ;  ██ ███
-       .db %01001100                   ;    ██
-       .db %00100111                   ;     ███
-       .db %00111011                   ;  ███ ██
-       .db %01000011                   ;      ██
-       .db %10010110                   ;█    ██
-       .db %01111011                   ; ████ ██
-       .db %00110101                   ;       █
-       .db %00001011                   ;      ██
-       .db %00000000                   ;
-       .db %00000000                   ;
-       .db %00000000                   ;
-       .db %00000000                   ;
-       .db %00000000                   ;
-       .db %00000000                   ;
-       .db %00000000                   ;
-       .db %00000000                   ;
-       .db %00000011                   ;      ██
-       .db %00001101                   ;       █
-       .db %01111011                   ; ████ ██
-       .db %11000110                   ;█    ██
-       .db %01000011                   ;      ██
-       .db %01111011                   ;  ███ ██
-       .db %00100111                   ;     ███
-       .db %01011100                   ;    ██
-       .db %00110111                   ;  ██ ███
-       .db %01111011                   ; ████ ██
-       .db %11100100                   ;███  █
-       .db %00000001                   ;    ████
-       .db %11100100                   ;███  █
-       .db %01111011                   ; ████ ██
-       .db %00110111                   ;  ██ ███
-       .db %00101100                   ;    ██
-       .db %01000111                   ;     ███
-       .db %00111011                   ;  ███ ██
-       .db %01001011                   ;      ██
-       .db %10000110                   ;█    ██
-       .db %01111011                   ; ████ ██
-       .db %00001101                   ;    ████
+;spr_bossA2: ;in asm code
 
 
-;----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
 ;----------------------------- logo ------------------------------------------
 ;----------------------------- logo ------------------------------------------
-;----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
 
 logo_nemesis:
 
 logo_nemesis:
+#ifdef TI83
+.db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011
+.db %01111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00011011
+.db %00111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00111011
+.db %00011111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%01111011
+.db %00000000,%00000000,%00000001,%00011110,%00010000,%00000000,%10000001,%00011110,%00010000,%000000001,%00000000,%00001000
+.db %00000000,%00000000,%00000011,%00011110,%00110000,%00000001,%10000011,%00011110,%00110000,%000000011,%00000000,%00011000
+.db %00000000,%00000000,%00000111,%00011110,%01110000,%00000011,%10000111,%00011110,%01110000,%000000111,%00000000,%00111001
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011
+#endif
+#ifdef TI86
 .db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111110
 .db %01111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00011011,%11111111,%11111111,%11111111,%11111100
 .db %00111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00111011,%11111111,%11111111,%11111111,%11111000
 .db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111110
 .db %01111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00011011,%11111111,%11111111,%11111111,%11111100
 .db %00111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00111011,%11111111,%11111111,%11111111,%11111000
@@ -4587,16 +5275,17 @@ logo_nemesis:
 .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
 .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
+#endif
 
 
-;----------------------------- end ------------------------------------------
+;----------------------------- end -------------------------------------------
 
        .end
 .end
 
 
 
        .end
 .end
 
 
-;----------------------------------------------------------------------------
-;----------------------------------------------------------------------------
-;----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
 
 ; 0.99.99 -- 9.IX.00 -- size 6936
 ;
 
 ; 0.99.99 -- 9.IX.00 -- size 6936
 ;
@@ -4667,7 +5356,7 @@ logo_nemesis:
 ;      * the armor bar is now 5 pixels in height; very visible
 ;      # if selecting upgrade or starting level, charge bar wasn't displayed
 ;
 ;      * the armor bar is now 5 pixels in height; very visible
 ;      # if selecting upgrade or starting level, charge bar wasn't displayed
 ;
-; 1.00.A23 -- 23.X.00 -- size 7212
+; 1.00.C21 -- 21.XII.00 -- size 6797
 ;
 ;      * armor-bar background, empty upgrades sprites changed
 ;      + shows sprite when laser hits an enemy (his "shield"?)
 ;
 ;      * armor-bar background, empty upgrades sprites changed
 ;      + shows sprite when laser hits an enemy (his "shield"?)
@@ -4676,10 +5365,22 @@ logo_nemesis:
 ;      * armor-bar background changed (more elegant and smaller code)
 ;      # "flash" when end-boss spawns mine fixed
 ;      + enemy's y start position can be specified per enemy
 ;      * armor-bar background changed (more elegant and smaller code)
 ;      # "flash" when end-boss spawns mine fixed
 ;      + enemy's y start position can be specified per enemy
-;      * first icon is now laser, second one's bullets
 ;      + when bullets selected, upgrade icons won't appear half the time
 ;      # remainder pixels in armor bar (appeared after heavy damage) removed
 ;      + your ship's explosion is now also 8 frames (half enemy expl. speed)
 ;      + when bullets selected, upgrade icons won't appear half the time
 ;      # remainder pixels in armor bar (appeared after heavy damage) removed
 ;      + your ship's explosion is now also 8 frames (half enemy expl. speed)
+;      + does NOT display Done after running in TI-OS! (anti-teacher ;)
+;      * storyline completed (probably the crappiest story ever!)
+;      # only first byte of ship's sprite altered; now loads whole word
+;      - tail beam removed (up double only); odd ships now contain laser
+;      # fixed laserbeam display when firing at right edge
+;      # star relocation altered to work correctly w/ new screen location
+;      # halfluring wasn't 50% (more like 75%) since random enemy spawning
+;      * restored multiples for bullets (since it's unlikely you'll select 1)
+;      # fixed mem overlapping causing "weird stuff" when moving multiples
+;      # bullets fired below screen bottom are moved up onto screen
+;      + SOURCE ALSO TI-83 COMPATIBLE (still few bugs like hiscore, bullets)
+;      # upgrading beam weapon removed multiples
+;      # clipping at left side wrong in TI-83 version fixed
 ;
 ;
 ;       + added        - removed       * changed       # bug fixed
 ;
 ;
 ;       + added        - removed       * changed       # bug fixed