-;----------------------------------------------------------------------------
-;-------------------------------- 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
- .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!!)
-
+ ;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")
-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
+#ifdef shiscore
hiscorepos = storepos ; +0 ;entering hiscore name
+#endif
x = storepos+1 ; +1 ;your ship's position
y = x+1 ; +2 ;your y-pos
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
-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
-starx1 = ceilingpos+16 ; +44 ;20
+starx1 = groundpos+16 ; +27 ;20
nrstars2 = 10
-starx2 = starx1+(nrstars1*2) ; +64 ;20
+starx2 = starx1+(nrstars1*2) ; +47 ;20
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
+#ifdef TI86
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
-lvlenemies = ebullets+(nrebuls*3) ;-1032
+lvlenemies = ebullets+(nrebuls*3) ;-957
;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 v0.99.99 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
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
- 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
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...
- 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
+#else
+ ld b,scrwidth
+#endif
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
- 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
+#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!!
- 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
- 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
- cal _puts
+ rcl _puts
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
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)
- cal _putc
+ rcl _putc
cal getsomekeys ;read keys (z if enter/2nd pressed)
ld hl,menuitem
start_tha_freakin_game:
ld a,(hl) ;(menuitem)
dec a ;new game=0; so that gives -1 = NZ
- cal nz,New_game ;NEW GAME
+ jp nz,New_game ;NEW GAME
jp samelevel ;CONTINUE: game_main_loop
menuexit:
pop hl
ret
+#ifdef invertable
mode_invert:
ld hl,invertmode ;change invert mode (will be stored)
ld a,$98
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
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
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 Level_event ;insert enemies
cal Display_Screen ;display all
+#ifdef TI86
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 -------
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
- 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)
+#ifdef TI83
+ srl a ;and again if 83 (smaller screen)
+#endif
ld c,a ;psh a
srl a ;/2
srl a ;/4
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
- 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!
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 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)
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 hl,dispbuffer+(56*16)-1 ;screen position
+ ld hl,dispbuffer+(56*scrwidth)-1 ;screen position
psh hl
groundloopright:
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 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)
ld a,(timer)
rra
ld a,(stars1)
- ret c
+ ret c ;once every other turn...
rlca
ld (stars1),a
ret nc
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:
- ld (ix),l
+ ld (ix),l ;save star's new position (ix)=hl
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
- 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"
- 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
+#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:
+#endif
ld hl,CONTRAST ;contrast setting (0-31)
ld b,(hl) ;load contrast into b
cp K_UP ;+ key changes contrast up
cal releasekeys
jr pause ;and loop
-;--------------------------- teacher ----------------------------------------
+;--------------------------- teacher -----------------------------------------
#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
- cal _clrWindow ;top left
+ rcl _clrWindow ;top left
ld hl,txt_teacher
- cal _puts ;display message
+ rcl _puts ;display message
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?
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
- cal _puts ;display
+ rcl _puts ;display
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
+ 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),a
+ ld (hl),a ;set to 0 (zero, nothing, nada, empty..)
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
-;--------------------------- display ----------------------------------------
+;--------------------------- display -----------------------------------------
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)
_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
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
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)
+ pop hl ;restore stack (cuzzof call)
jp z,You_die ;yes = game over
- ret ;don't display anything
;----move----
ok: ;we are
exploding_you:
srl a ;half the framerate
- srl a ;half that framerate
- srl a ;and half again that framerate
+ srl a ;and half that framerate
ld hl,x-1
ld ix,spr_yexplosion ;base sprite
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
dnz place_multiples ;repeat
ret
-;------------------------- select upgrade -----------------------------------
+;------------------------- select upgrade ------------------------------------
inc_armor:
ld a,(your_armor) ;load current armor
dec a ;is it 1?
ret m ;return if it's 0 (no pickups)
- jr nz,selectlaser ;no, carry on
- ld (hl),a ;reset pickups
+ ld (hl),0 ;reset pickups
+ jr nz,selectlaser ;no, carry on again
+selectbeam:
ld a,(de) ;(your_weapon)
inc a ;next
cp maxweapon
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?
- ld (hl),0 ;reset pickups
- jr nz,selectextra ;no, carry on again
+ jr nz,selectextra ;no, carry on
ld (your_extra),a ;no extra beams (tailbeam/up-double)
ld a,(de) ;(your_weapon)
cp maxweapon ;upgrade from bullet?
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 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
-;--------------------------- show icon --------------------------------------
+;--------------------------- show icon ---------------------------------------
disp_icons: ;destroyes: abcdehlix
+#ifdef TI86 ;-------86
+
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 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
displivesdone:
cal disp_armor ;display bar
- ld ix,spr_icon00
+ ld ix,spr_icon00 ;emptyIcon
ld a,(your_weapon) ;ur weapon
- cp maxweapon ;laser?
+ cp maxweapon ;bullets?
psh af ;a=(your_weapon); cf=bullets
jr nc,no_bullets ;=laser
ld hl,$3945 ;position to display bullet-type digit
- pop af ;digit=(your_weapon)
- psh af
inc a ;1 = weapon #1 (=0)
ld (_penCol),hl ;set location
add a,'0' ;make digit
- cal _vputmap ;display char
- ld ix,spr_icon03 ;bulletIcon
+ rcl _vputmap ;display char
+ ld ix,spr_icon04 ;bulletIcon
no_bullets:
- ld de,$3939 ;icon #1
- cal putwidesprite ;display icon (beamweap)
+ ld de,$3939 ;icon #2
+ cal putwidesprite ;(beamweap)
- ld ix,spr_icon00 ;emptyIcon
- pop af ;ld a,(your_weapon)
- ld b,a
+ ld ix,spr_icon00
+ pop af ;ld a,(your_weapon) \ cp maxweapon
jr c,no_laser ;popped carry
- ld hl,$3955 ;position to display bullet-type digit
+ ld hl,$3955 ;position to display laser-type digit
ld (_penCol),hl ;set location
- ld a,b ;(your_weapon) ;load = faster than push
- sub maxweapon-1 ;1 = laser #1 (=maxweapon)
+ sub maxweapon-1 ;1 = laser #1 (=maxweapon)
add a,'0' ;make digit
- cal _vputmap ;display char
- ld ix,spr_icon04 ;laserIcon
+ rcl _vputmap ;display char
+ ld ix,spr_icon03 ;laserIcon
no_laser:
- ld de,$4939 ;icon #2
- cal putwidesprite ;(laser)
+ ld de,$4939 ;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, check for beam extras
+ jr z,no_multiples ;none (empty)
ld ix,spr_icon05 ;multiples-icon
- jr no_tail ;display
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 (PutWhere),a ;set sprite-position to normal screen
jp disp_charge ;display weapon charge bar
+#else ;-------------83
-disp_armor:
- ld de,16 ;line size
- ld hl,(58*16)+VIDEO_MEM+6
- ld c,5 ;5 lines down
-armorbarclrY:
- ld b,4 ;four bytes right
- psh hl
-armorbarclrX:
- ld (hl),0 ;clear
- dec hl ;next byte
- dnz armorbarclrX ;4x
- pop hl ;old position
- add hl,de ;one pixel down
- dec c ;5x
- jr nz,armorbarclrY ;loop
+ 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)
+ dnz drawline ;repeat (16bytes * 8pixels =128= screen width)
+ ret
- ld hl,VIDEO_MEM+(58*16)+6
+
+disp_armor:
+ 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
dnz armorbarbyte ;loop it b times
lastarmorbit:
ld (hl),c ;draw the last byte
+ dec hl
+ ld (hl),0 ;empty byte before to remove any remainders
pop hl ;recall first byte
add hl,de ;one down
pop bc ;recall yloop-counter
dnz armorbarloop1 ;display again
- ret
-
-drawline:
- ld (hl),a ;draw one piece of the divider-line
- inc hl ;move right (8 pixels = 1 byte)
- dnz drawline ;repeat (16bytes * 8pixels =128= screen width)
+#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
+ cal drawbarrow ;display "grey" mask
+ add hl,de
+ add hl,de
+ add hl,de
+ cal drawbarrow
+drawbarrow: ;ORs an entire row with A
+ add hl,de ;one down
+ ld b,4 ;four bytes right
+ psh hl
+armorbarX:
+ dec hl ;next byte
+ psh af
+ or (hl)
+ ld (hl),a ;clear
+ pop af
+ dnz armorbarX ;4x
+ pop hl ;old position
ret
-;------------------------- fire bullet --------------------------------------
+;------------------------- fire bullet ---------------------------------------
fire_multiple:
psh af
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 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)
- 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)
_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)
+ jr z,handle_laser ;if size=0=256x (right edge) then skip display
ld b,a
drawlaser:
ld (hl),%11111111
add a,(ix+1) ;add enemy height (according to sprite @ix)
jp m,nolashit ;a-e>0 = hit
enemy_lashit:
+ psh hl ;pointer to enemy destroyed by putsprite
+ psh bc ;safe enemy counter
+ psh de ; and Ur position (used for further compares)
+ dec e ;adjust y-position
+ dec e
+ dec e ;hit sprite centered at e (height=6)
+ dec hl ;@x
+ ld d,(hl) ;x-position of hit (enemy's x-pos)
+ ld ix,spr_lashit ;laserHit sprite
+ cal putsprite ;display this frame only unlike bullethit ani
+ pop de ;restore regs
+ pop bc
+ pop hl
ld a,(curweapdamage) ;damage
- cal enemy_hit ;hl=enemy+y
+ cal enemy_hit ;inflict (hl=enemy+y)
nolashit:
pop hl ;enemy+1
ld a,b ;psh bc
ld c,a ;c=0
ret
-;------------------------ handle bullets ------------------------------------
+;------------------------ handle bullets -------------------------------------
Handle_bullets:
ld hl,ybullets
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
- cal _shracc ;%11100000->1110
+#ifdef TI86
+ rcl _shracc ;%11100000->1110
;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
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
ld hl,1 ;increase score by one
jp scoreInc ;+ret
-;--------------------------- level events -----------------------------------
+;--------------------------- level events ------------------------------------
Level_event:
ld a,0 ;time to next event
dnz chk_enemyleft ;loop for all enemies
ld hl,nextevent ;time 'til next event
ld (hl),157 ;next time to check is in 157 turns/frames
- inc a ;no enemies left: place upgrade pickup
+ ld a,(your_weapon)
+ cp maxweapon ;you have bullets?
+ jr nc,placebigupgrade ;if not just place the big upgrade
+ ld a,(level)
+ rra ;if level&1=0 (even levels)
+ ret nc ;then dont place a pickup (=50%)
+placebigupgrade
+ ld a,1 ;no enemies left: place upgrade pickup
jr place_enemy ;place enemy #1(=a) = big pickup
enemyleft:
ld hl,eventleft
dec hl ;points to leveldata\boss\enemynr
ld a,(hl) ;load enemy# of boss
-place_enemy: ;places enemy #=a
+place_enemy: ;places enemy #=a (out:achl=?;b=0;de=@enemy+11)
psh af
ld hl,enemies+1-enemysize
ld bc,enemysize
dec de ;goto hp64 (before occ)
ldi ;set hp64
ldi ;set hitpoints+occ of enemy class
- ld a,(hl)
- .db $DD,$6F ;ld hx,a
+ ld c,(hl)
ldi ;set sprite
- ld a,(hl)
- .db $DD,$67 ;ld lx,a
+ ld b,(hl) ;bc=@enemy_sprite
+ inc bc ;@sprite-height
+ ld a,(bc)
+ ld b,a ;b = sprite-height
ldi ;set sprite + 1
ldi ;set x-position
ld a,(hl) ;load placeInfo
inc hl
- dec a ;is it 1?
+ inc a ;is it -1?
jr z,random_enemy ;yes: create random value <51 in a
- dec a ;is it 2?
+ inc a ;is it -2?
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?
-halflure_enemy: ;yes (of course it is): pick one (50% lure)
+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.
+ 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 ypos_OK
random_enemy:
ld a,64-8 ;=57=screen height (8 is scorebar)
- sub (ix+1) ;minus sprite height=bottom
- ld c,b ;range=0 to...
+ sub b ;minus sprite height=bottom
+ ld c,0 ;range=0 to...
ld b,a ;...57-y
cal Random ;random value on screen
ypos_OK: ;random value successfully created
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
sub 6
jp c,bulletok ;type #0-5 = done (normal/diag)
or a
- jr z,bulletaiming ;type #6 = aiming = type#2..5
+ jp z,bulletaiming ;type #6 = aiming = type#2..5
dec a
jr z,bullettriple ;type #7 = triple
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,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
+ cal Random
+ ld e,a
+ cal random14
+ ld c,a
+ cal bulletok ;find and fire bullet
+
+ ld a,boss2enemy ;otherwise place enemy #[boss2enemy]
+ jp place_enemy
firesenemies: ;type #12 = mine / Dquad
ld a,(timer)
rra ;if odd turn (50% chance)
jr c,bulletdquad ;then fire 6x
- ld a,bossenemy ;otherwise place enemy #[bossenemy]
+ ld a,boss1enemy ;otherwise place enemy #[boss1enemy]
jp place_enemy
-bulletran:
- ld c,1
- ld b,4
- cal Random
- ld (hl),a
+bulletran: ;type #11 = fires bullets 1-5 at random
+ cal random14
+ ld (hl),a ;set type a=1..5
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
- 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
- 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
-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
- 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
- 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
+ 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
cal enemy_fires_again
inc hl
ld c,5 ;type #5 = up 50%
- jr enemy_fires_again
+ jr _enemy_fires_again
bulletaiming: ;type #6 = aiming = type#2..5
ld a,(y)
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
-;----------------------------- enemy bullets --------------------------------
+;----------------------------- enemy bullets ---------------------------------
Enemy_bullets:
ld hl,ebullets ;hl=bullet pointer
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),0 ;bullet > unused
ret
-;--------------------------- handle enemies ---------------------------------
+;--------------------------- handle enemies ----------------------------------
Handle_enemies:
ld hl,enemies+1
cal explosion_stuff ;display explosion
jr next_enemy
-;--------------------------- moving enemies ---------------------------------
+;--------------------------- moving enemies ----------------------------------
moving_enemy:
dec d ;move left once
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_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
- jr z,movetype_vfast ;6 = (2 <)
+ jr z,movetype_xfast ;8 = (3 <)
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
- jr z,movetype_lure ;8 = (0) move y towards you
+ jr z,movetype_lure ;10 = (0) move y towards you
dec b
- jr z,movetype_slowlure ;9 = (0) lure 1/2 speed
+ jr z,movetype_slowlure ;11 = (0) lure 1/2 speed
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
- jr z,movetype_right ;11 = (.5>)
+ jr z,movetype_right ;13 = (.5>)
dec b
- jr z,movetype_fright ;12 = (1>)
+ jr z,movetype_fright ;14 = (1>)
+ dec b
+ 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
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_xfast:
+ dec d ;woowoo, now that's fast!
+ dec d ;move left trice!
+ ret
movetype_updown:
inc hl ;@movecount
inc e ;otherwise save new position
ret ;and return
-;--------------------------- check collision --------------------------------
+;--------------------------- check collision ---------------------------------
Enemies_hit:
ld hl,(x) ;e = X, d = Y
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
- cal _clrLCD ;clear screen
+ rcl _clrLCD ;clear screen
pop hl
ld a,(hl)
ld (curline),a ;begin line for special effect
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 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
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
-
-;--------------------------- SFX --------------------------------------------
-
-DoSFX: ;in:(curline)=beginLine;b=nrOfLines
-SFXloop:
- psh bc
+DoSFX: psh bc ;in:(curline)=beginLine;b=nrOfLines
ld a,0 ;get line number
curline =$-1
ld hl,dispbuffer ;source of original
add hl,bc ;hl->source
-SFXdisp: ;display this frame on screen
+sfxlaserdisp: ;display this frame on screen
ld bc,16 ;one line (=16 bytes, you'd know by now)
ldir ;display (copy actually)
ld bc,-16 ;go up one line (not on screen)
add hl,bc ;so the same line will be displayed
dec a ;counter
- jr nz,SFXdisp ;repeat until whole screen is displayed
+ jr nz,sfxlaserdisp ;repeat until whole screen is displayed
- ld b,8
-SFXdelay:
+ ld b,11 ;11x 1/200sec = ~20 frames/s
+sfxlaserdelay:
halt ;delay
- dnz SFXdelay ;8x
+ dnz sfxlaserdelay ;8x
pop bc ;counter
- dnz SFXloop
+ dnz DoSFX
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
+ ld b,4
+; cal Random
Random: ;a=c<random<b+c; destr:none
psh hl
ld hl,rancount ;amount to increase with (0-255)
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
+ add a,a
+ add a,a
ld h,0
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
+#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)
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
+#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
- cal GET_KEY ;input keys
+ rcl GET_KEY ;input keys
or a
jr z,getsomekeys ;wait if none
cp K_SECOND ;2nd pressed?
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
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+)
- cal _SET_ABS_SRC_ADDR ;set as source (ahl)
+ rcl _SET_ABS_SRC_ADDR ;set as source (ahl)
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
+#endif
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
- 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
-
+#ifdef shiscore
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
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
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
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
- 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
-
+#endif
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
- cal _dispahl ;display it (a=0)
+ rcl _dispahl ;display it (a=0)
+#ifdef TI86
ld hl,$314b ;bottom-1 right before score ^^
+#else
+ ld hl,$312b
+#endif
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
- cal _dispahl ;display
+ rcl _dispahl ;display
+#ifdef TI86
ld hl,$3946 ;bottom right before hiscore ^^
+#else
+ ld hl,$3926
+#endif
ld (_penCol),hl ;set
ld hl,txt_hiscore ;"Hiscore"
- cal _vputs ;display (small)
+ rcl _vputs ;display (small)
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
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
- ld b,$B0 ;12 lines down
+ ld b,12*scrwidth ;12 lines down
invshiploop:
ld a,(hl)
cpl ;invert byte
pop af
ret
-New_game: ;stack must be +1 (so change the jp in cal :)
- cal _clrLCD
+New_game: ;start a new game (SP=+0)
+ rcl _clrLCD
+#ifdef TI86
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
psh bc ;counter
psh de ;position
ld h,e
+#ifdef TI86
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
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
+#else
+ ld a,70
+#endif
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
- ld hl,txt_tailbeam ;tailbeam for ships 0
+ ld hl,txt_shplaser ;tailbeam for ships 0
dispsbeam:
- cal _vputs ;display special beam type
+ rcl _vputs ;display special beam type
pop ix
pop de
psh de ;peek de
selectship:
psh bc
cal invship
-selectshiploop:
+#ifdef TI83
+ cal fastCopy
+#endif
cal getsomekeys
pop bc
jr z,startthenewgame ;enter/2nd
+ cp K_EXIT
+ jp z,menuexit ;go game over when exit was pressed
psh bc
- cal invship
+ cal invship ;display selection bar on current ship
pop bc
- cp K_DOWN
+ cp K_DOWN ;down pressed?
jr nz,selnotdown
inc b ;move selection down
selnotdown:
- cp K_UP
+ cp K_UP ;up pressed?
jr nz,selnotup
dec b ;move selection up
selnotup:
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
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 (pickuptimer),a ;next pickup after 4 enemies destroyed
You_die: ;stack must be +1
- pop hl ;restore stack
ld a,24
ld (your_armor),a ;24 HPs/shields
ld a,(your_lives) ;load lives left
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
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
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
+#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
+#endif
ld a,(hl) ;number of (different) enemies in this level
inc hl
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
cal loadweapon ;load (your_weapon)
+ xor a
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
+#ifdef TI86 ;on '86 everything's located here
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
- cal _puts ;display "LEVEL "
+ rcl _puts ;display "LEVEL "
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
- cal UNPACK_HL ;second digit
+ rcl UNPACK_HL ;second digit
add a,'0' ;0-9
- cal _putc ;display second digit
+ rcl _putc ;display second digit
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
- cal _puts
+ rcl _puts
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 _vputs
+ rcl _vputs
res 3,(iy+5) ;set white on black
cal getsomekeys ;wait for keypress
+#ifdef shiscore
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
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 (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=?
+#ifdef TI86
putsprite:
ld c,(ix) ;save width
_putsprite: ;putsprite with custom width
pop bc ;rows counter
dnz CSyloop
CSdone: ret
+#endif
+
+#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 -----------------------------------
+;--------------------------- putbigsprite -----------------------------------=
putwidesprite:
;destr: abcdehl+ix (ix=behind sprite; hl:a=right below sprite; b=0; d=width)
pop de
ret
-;------------------------------- findpixel ----------------------------------
+;------------------------------- findpixel -----------------------------------
;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
FPbit =$+1
set 0,a
ret
+#endif
-;----------------------------------------------------------------------------
-;------------------------------- sprites ------------------------------------
-;----------------------------------------------------------------------------
+#ifdef TI83
+findpixel:
+ psh bc
+ psh de
+ ld a,d
+ cal ionGetPixel
+ pop de
+ pop bc
+ ret
+#endif
+
+;-----------------------------------------------------------------------------
+;------------------------------- sprites -------------------------------------
+;-----------------------------------------------------------------------------
spr_ship01: ;(normal; up double)
.db 7,7 ;ship alpha class (vic viper)
.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 %11111100 ; ██████
.db %11110000 ; ████
.db %11000000 ; ██
-spr_ship03i:
+;spr_ship03i:
.db 8,7
.db %11111100 ; ██████
.db %11110010 ; ████ █
.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)
.db %01111100 ; █████
.db %00111000 ; ███
spr_multiple2:
+spr_lashit:
.db 7,7 ;multiples
.db %00111000 ; ███
.db %01111100 ; █████
.db %01111100 ; █████
.db %00111000 ; ███
-;-------------------------------- explosions --------------------------------
+;-------------------------------- explosions ---------------------------------
+
+;spr_lashit: ;the same as spr_multiple2
+; .db 7,7
+; .db %00111000 ; ███
+; .db %01111100 ; █████
+; .db %11111110 ; ███████
+; .db %11111110 ;▒▒▒███████
+; .db %11111110 ; ███████
+; .db %01111100 ; █████
+; .db %00111000 ; ███
spr_hit:
hitsprites = 5 ;btw: sprites stored backwards
.db %00000000
.db 8,5 ;2
+ .db %00000000
+ .db %00010100 ; █ █
+ .db %00111010 ; ███ █
+ .db %01110110 ; ███ ██
+ .db %00011000 ; ██
+ .db %00000000
+
+ .db 8,5 ;3
+ .db %00000000
+ .db %00101100 ; █ ██
+ .db %01100110 ; ██ ██
+ .db %01001011 ; █ █ ██
+ .db %00111100 ; ████
+ .db %00000000
+
+ .db 8,5 ;4
.db %00111000 ; ███
.db %01011100 ; █ ███
.db %10010111 ;█ █ ███
.db %00111000 ; ███
.db %00000000
- .db 8,6 ;3
+ .db 8,6 ;5
.db %00111100 ; ████
.db %01001111 ; █ ████
.db %10100011 ;█ █ ██
.db %01110101 ; ███ █ █
.db %00111000 ; ███
- .db 8,6 ;4
+ .db 8,6 ;6
+ .db %00101110 ; █ ███
+ .db %10000011 ;█ ██
+ .db %01000101 ; █ █ █
+ .db %10100011 ;█ █ ██
+ .db %01000110 ; █ ██
+ .db %00110000 ; ██
+
+ .db 8,6 ;7
.db %00110110 ; ██ ██
.db %00000101 ; █ █
- .db %11000001 ;██ █
+ .db %10001001 ;█ █ █
.db %01100001 ; ██ █
.db %11000010 ;██ █
.db %01010001 ; █ █ █
-;--------------------------------- bullets ----------------------------------
+ .db 8,6 ;8
+ .db %00000110 ; ██
+ .db %00100001 ; █ █
+ .db %10000000 ;█
+ .db %01000010 ; █ █
+ .db %01000000 ; █
+ .db %00010100 ; █ █
+
+;--------------------------------- bullets -----------------------------------
bullettable:
.db (spr_bullet01-spr_bullet01) ;0
; 111=laser (speed=duration 00010-00000)
weapondata: ;max = 9x6; 15x5; 21x4; 27x3
- .db 2,1,%00110010,3,%00000000,0,%00000000,0 ;1 single
- .db 3,1,%00110011,3,%00000000,0,%00000000,0 ;2 fast
- .db 2,1,%00110010,0,%00110010,6,%00000000,0 ;3 double
- .db 2,1,%01110010,2,%10010010,2,%00110010,2 ;4 triple
- .db 3,2,%00110011,2,%10010010,2,%01110010,2 ;5
- .db 4,2,%01110011,2,%10010011,2,%00110011,2 ;6
- .db 5,3,%01110100,2,%10010100,2,%00110100,2 ;7
- .db 7,4,%01110101,2,%10010101,2,%00110101,2 ;8
- .db 9,6,%01110110,2,%10010110,2,%00110110,2 ;9
+ .db 2,1,%00110010,3,%00000000,0,%00000000,0 ;1 single (1x2+1) 2
+ .db 3,1,%00110011,3,%00000000,0,%00000000,0 ;2 fast (1x3+1) 3
+ .db 2,1,%00110010,0,%00110010,6,%00000000,0 ;3 double (2x2+1) 4
+ .db 2,1,%01110010,2,%10010010,2,%00110010,2 ;4 triple (3x2+1) 6
+ .db 3,2,%00110011,2,%10010010,2,%01110010,2 ;5 (3x3+2) 9
+ .db 4,2,%01110011,2,%10010011,2,%00110011,2 ;6 (3x4+2) 12
+ .db 5,3,%01110100,2,%10010100,2,%00110100,2 ;7 (3x5+3) 15
+ .db 7,4,%01110101,2,%10010101,2,%00110101,2 ;8 (3x7+4) 21
+ .db 9,6,%01110110,2,%10010110,2,%00110110,2 ;9 (3x9+6) 27
maxweapon = 9
- .db 1,1,%11100100,3,%00000000,0,%00000000,0 ;1 single (1x1x3)
- .db 2,3,%11100011,3,%00000000,0,%00000000,0 ;2 short (2x1x2)
- .db 1,2,%11100100,3,%11100000,4,%00000000,0 ;3 fat (1x2x3)
- .db 1,2,%11100101,0,%11100000,6,%00000000,0 ;4 double (1x2x4)
- .db 4,4,%11100011,3,%00000000,0,%00000000,0 ;5 short (4x1x2)
- .db 1,2,%11100100,3,%11100000,6,%11100000,0 ;6 triple (1x3x3)
- .db 1,3,%11101000,3,%11100000,6,%11100000,0 ;7 triple long (1x3x7)
- .db 2,5,%11100101,2,%11100000,4,%00000000,0 ;8 double (2x2x4)
- .db 1,8,%11101011,3,%11100000,2,%11100000,4 ;9 big fat long (1x3x10)
+ .db 1,1,%11100100,3,%00000000,0,%00000000,0 ;1 single (1x1x3) 3
+ .db 2,3,%11100011,3,%00000000,0,%00000000,0 ;2 short (2x1x2) 4
+ .db 1,2,%11100100,3,%11100000,4,%00000000,0 ;3 fat (1x2x3) 6
+ .db 1,2,%11100101,0,%11100000,6,%00000000,0 ;4 double (1x2x4) 8
+ .db 4,4,%11100011,3,%00000000,0,%00000000,0 ;5 short (4x1x2) 8
+ .db 1,2,%11100100,3,%11100000,6,%11100000,0 ;6 triple (1x3x3) 9
+ .db 1,3,%11101000,3,%11100000,6,%11100000,0 ;7 triple long(1x3x7) 21
+ .db 2,5,%11100101,2,%11100000,4,%00000000,0 ;8 double (2x2x4) 32
+ .db 1,9,%11101100,3,%11100000,2,%11100000,4 ;9 big fat lng(1x3xB) 33
maxlaser = 18
tailbeam = %00101101 ;180 degrees
doublebeam = %01010010 ;45 degrees
extrabulletpos:
.db 3 ;tail/double yposition
-;------------------------------------ bar -----------------------------------
+;------------------------------------ bar ------------------------------------
+
+#ifdef TI86
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:
.db %00000001
.db %11111111
spr_icon00:
- .db 16,7 ;unused .......:.......:
- .db %10101010 ;█ █ █ █ █ █ █ █
- .db %11010101 ;██ █ █ █ █ █ █ █
- .db %10101010 ;█ █ █ █ █ █ █ █
- .db %11010101 ;██ █ █ █ █ █ █ █
+ .db 15,7 ;unused .......:.......:
+ .db %10000000 ;█
+ .db %10111111 ;█ █████████████
.db %10101010 ;█ █ █ █ █ █ █ █
- .db %11010101 ;██ █ █ █ █ █ █ █
+ .db %10110101 ;█ ██ █ █ █ █ ██
.db %10101010 ;█ █ █ █ █ █ █ █
- .db 7
- .db %10101010
- .db %01010101
- .db %10101010
- .db %01010101
+ .db %10111111 ;█ █████████████
+ .db %10000000 ;█
+ .db 6
+ .db %00000000
+ .db %11111110
.db %10101010
- .db %01010101
+ .db %01010110
.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
+ .db %11111110
+;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
-spr_icon02a:
- .db 16,7 ;tailbeam.......:.......:
- .db %10000000 ;█ ▒
- .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_icon02b:
+;spr_icon02a:
+; .db 16,6 ;tailbeam.......:.......:
+; .db %10000000 ;█ ▒
+; .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 %00000000
.db %00011110
spr_icon03:
+ .db 16,7 ;laser .......:.......:
+ .db %10000000 ;█ ▒
+ .db %10001010 ;█ █ █ ▒▒▒ ▒
+ .db %11101100 ;███ ██ ▒▒▒ ▒
+ .db %11110111 ;████ ███████▒▒▒█▒
+ .db %11101100 ;███ ██ ▒▒▒ ▒
+ .db %10001010 ;█ █ █ ▒▒▒ ▒
+ .db %10000000 ;█ ▒
+ .db 4
+ .db %00000000
+ .db %00000000
+ .db %00000000
+ .db %11111111
+spr_icon04:
.db 11,7 ;bullets .......:.......:
.db %10000000 ;█ ██ ▒
.db %10000011 ;█ █████ ▒▒▒ ▒
.db %11000000
.db %11100000
.db %11000000
-spr_icon04:
- .db 16,7 ;laser .......:.......:
- .db %10000000 ;█ ▒
- .db %10001010 ;█ █ █ ▒▒▒ ▒
- .db %11101100 ;███ ██ ▒▒▒ ▒
- .db %11110111 ;████ ███████▒▒▒█▒
- .db %11101100 ;███ ██ ▒▒▒ ▒
- .db %10001010 ;█ █ █ ▒▒▒ ▒
- .db %10000000 ;█ ▒
- .db 4
- .db %00000000
- .db %00000000
- .db %00000000
- .db %11111111
spr_icon05:
.db 16,7 ;multiple.......:.......:
.db %10000011 ;█ ███ ▒
.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
-;---------------------------- 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_about: .db "v0.99.99 ",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
+#endif
+
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_teacherans: .db Lneg,"14.6549373495",0
#endif
-;---------------------------- save data -------------------------------------
-
-storehi_start:
-hiscore .dw 0 ;default hiscore
-hiname .db "shiar.99",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 17 ;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]
-; [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!
+#ifdef story
.db 0 ;storyline ID
levelstart: ;[y-pos] [x-pos] [text,0] [SFX lines; 0=more text] [-1=end]
- .db 25,33,"Imperial ships have",0,0
- .db 31,9,"been sent to intercept you",0,31-25+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 %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 %00,0,1,1
+ .db %0,0,1,1
- .db 32
+ .db 42
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
- .db %00,0,1,1
-
+ .db %0,0,1,1
+#ifdef story
.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 %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 %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 %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
- .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
- .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 %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
-;------------------------------ enemies -------------------------------------
+;------------------------------ enemies --------------------------------------
;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
+#ifdef TI86
+;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 ,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,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
- .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;28
-;29=final boss' enemy
- .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,3,01, 0, 0,1 ;lure
-bossenemy = 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 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:
.db %01111110 ; ██████
.db %00011110 ; ████
spr_enemyS4:
- .db 8,6 ;cheap intercept
+ .db 8,6 ;fast interceptor
.db %00011011 ; ██ ██
.db %01110110 ; ███ ██
.db %10111100 ; █ ████
.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 ; ████
.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.....:
.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 %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 %11010000
.db %01110000
.db %01010000
-spr_boss08:
+spr_boss09:
.db 14,14 ;.......:......7:
.db %01100111 ; ██ ████ ██
.db %11001011 ;██ █ ██ █ ██
.db %00110100
.db %01001100
.db %10011000
-spr_boss09:
+spr_boss10:
.db 16,19 ;.......:.......:
.db %01111011 ; ████ ███
.db %10000110 ;█ ██ █████
.db %10100000
.db %11111000
.db %10000000
+;spr_bossA2: ;in asm code
-;----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
;----------------------------- logo ------------------------------------------
-;----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
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 %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
-;----------------------------------------------------------------------------
-;----------------------------------------------------------------------------
-;----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
+;-----------------------------------------------------------------------------
-; 0.98.77 -- 7.VII.00 -- size 6707
-;
-; # bullets do damage in all levels
-; * more armor at armor-upgrade and extra armor at end of a level
-; - internal levels again (no need 4 external, safer/smaller)
-; # some registers not correctly pushed/popped
-; * several optimizations (init.procs some bytes smaller)
-; # enemies hit with hitpoints left disappeared (one pop too much...)
-; + bullets "charge up" (more damage) when not firing
-; - removed contrast changes
-; + more powerful bullets have different sprites (larger=more damage)
-; # multiples appear at your position (begin level/just selected)
-; # when invulnerable multiples acted weird
-; # no more error at activation after APD off after running Nemesis
-; # saves correctly if own name ain't "nemesis" + some bytes smaller
-; # screen wasn't always entirely cleared after quit
-; * waits until all keys have been released after death
-; + different bullets sizes will miss if they're too small
-; + at level start "press F1 to save"-text will be displayed
-; * w3.shiar.org displayed at title screen, black bar behind version nr
-; # score to 0 when exit pressed at main menu
-; # no residual story-text in first frame of game
-; # game doesn't continue again after death (stack messed up)
-; # game over when lives<0 (didn't work in v0.96+)
-; * using some self-modifiing code (so it's smaller)
-; # new random procedure: stars don't appear on one line anymore
-; * weapons appear centered at multiples
-; * laser properties can be changed (damage, charge)
-; + weapon can be combination of bullets/lasers (max. of 3 per weapon)
-; * bullet-icon is removed when laser is selected
-; * enemy sprite table integrated in enemy specs (-1 byte/enemy)
-; + random enemy is chosen from any number of enemies per level
-; * time to first enemy fire defined per enemy, not per level
-; + CLIPPED sprites!! no more in/out popping enemies! wow...
-; * bullets/enemies removed when _entirely_ off screen
-; # enemies would sometimes be hit by bullets going right below them
-; # size of the second bullet was too big (invisible hit)
-; * the frequency an enemy fires bullets is defined per enemy
-; + wide clipped sprites implemented (width 1-16 pixels)
-; # bosses first move left until x=100, otherwise they'd be off-screen
-; * at status bar left below ships are displayed for lives left
-; * armor bar is two pixels high (better visible)
-; # bullet overflow fixed again (>63 bullets fired)
-; # correct weapon loaded when continuing a saved game
-; # game freezed when generating a random value <=1
-; * you explode in a different way than the enemies
-; + screen inverts for a brief time when you are hit!
-; # stats-bar was messed up when ya got 0 lives left
-; * two new (big) bosses modeled after a common MSX Nemesis2-boss
-; * score increased once every 32 frames (instead of every 256)
-; # ground fixed for new random routine (smaller routine; incs -2 to 2)
-; + laser will upgrade as well when you reselect it
-; * 2nd can be used in main menu (wow!)
-; # altered variable storage space because of Nemesis grew beyond 6kb
-; # fixed armor bar display when at maximum
-; + a few new enemies (asteroids) and remade 1st 4 levels; new pickup
-; - torpedo since it was kinda useless
-; + second icon now selects TAIL BEAM: bullet going backwards
-; # armor increase at the end of a level doesn't overflow armorbar
-; + you can choose your own ship out of four vessel after NEW GAME!
-; + enemies can appear at any x-position and move both left and right
-; + move patterns given per enemy, not per level
-; * new (faster) enemy-move system; 10 basic moves (x2 left+right)
-; # enemies can _never_ move above or below visible screen
-; * "randomY"-enemies are placed entirely on screen (height calced)
-; # the major TI-OS crash bug WAS afterall caused by sprites drawn
-; (partially) outside screen memory. temporarily fixed by setting
-; virtual screen buffer to $8200 (enough mem there)
-; + upto 29 cool enemy sprites and redone first five levels
-; * improved enemy-move routine; smooth luring, five speeds+backwards
-; # after pause weapon will not be fired
-; # teacher key fixed (waits for GRAPH to be release before&after)
-;
; 0.99.99 -- 9.IX.00 -- size 6936
;
; + you can have upto FOUR multiples! (~20 pixels apart)
; * the armor bar is now 5 pixels in height; very visible
; # if selecting upgrade or starting level, charge bar wasn't displayed
;
-; 1.00.99 -- 9.IX.00 -- size 6936
+; 1.00.C21 -- 21.XII.00 -- size 6797
;
-; + ...
+; * armor-bar background, empty upgrades sprites changed
+; + shows sprite when laser hits an enemy (his "shield"?)
+; + exit-key also quits out of ship selection screen
+; # fixed direct-quit on death bug (bug since recent optimization)
+; * 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
+; + 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