3 ; Release Date : april 2000???
4 ; Filename : worm.86p (4kb)
6 ; Email Address : shiar@mailroom.com
8 ; Web Page : www.games3.net/shiar
9 ; Description : ruling multiplayer game for 86 (most like Nibbles)
10 ; Where to get this game : games3.net/shiar (home of Worm)
11 ; Other games by author(s) : Shiar: Nemesis beta
12 ; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98)
13 ; Jonah Cohen (wrote some parts of worm)
15 ;-----------------------------
16 ;----------- TO-DO -----------
17 ;-----------------------------
21 ; 1% * levelfile select
24 ; 2% * make linkplay available for all gametypes (not just deathmatch)
25 ; 1% * two worms collide with heads -> both should die
27 ; 1% * ctf: take enemy flag (right-bottom) and return to your flag (left-top)
28 ; 1% * domination?: take control points by running over them and hold them
29 ; 1% * name change + other options
30 ; * complete readme (+custom level info)
31 ; 2% * ... (pollish, &&&)
35 ;100% = bugs fixed + levels done
37 ;-----------------------------
38 ;-----------------------------
39 ;--------- W O R M ---------
40 ;-----------------------------
41 ;-----------------------------
48 #include "ti86asm.inc"
55 _clrWindow = $4A86 ;clear screen
56 _asapvar = $D6FC ;own name (worm)
57 _MOV4B = $429B ;4x ld (de),(hl)
58 _MOV5B = $4297 ;5x ld (de),(hl)
59 _mov9b = $4283 ;9x ld (de),(hl)
60 _ldHLind = $4010 ;ld hl,(hl)
61 _swapt_ = $45F3 ;ex_ahl_bde
62 _Get_Word_ahl = $521D ;ld de,(ahl)
63 _Set_Word_ahl = $5221 ;ld (ahl),de
64 _AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2
65 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl
66 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
67 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
68 _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
69 _mm_ldir = $52ED ;24bit ldir
70 _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
72 ;-----------------------------
73 ;------- data storage -------
74 ;-----------------------------
76 leveldata = $EA00 ;size< $400
77 ScrBuffer = $8100 ;size=$2000 (32x256)
79 DispBuffer = $BC00 ;size= $390 (16x57)
80 SinCosTable = $B500 ;size= $100 (4x64)
87 resbit = 2 ;and%11111011
88 worm1p = $B000 ;%10110000 -$B3FF
89 worm2p = $B800 ;%10111000 -$BBFF
90 worm3p = $F000 ;%11110000 -$F3FF
91 worm4p = $A800 ;$E800=%11101000 ;$D748+$1000+
95 ;-----------------------------
96 ;------- program start -------
97 ;-----------------------------
109 .db "WORM by SHIAR -- pre-beta 86%",0
112 .db %10010110,%01101111
113 .db %10110101,%01001011
114 .db %01110011,%01001001
115 .db %00000011,%10000000
116 .db %00000001,%11100000
117 .db %00111000,%11111000
118 .db %01111110,%00111111
119 .db %11101111,%00001111
120 .db %11000011,%10000000
133 rst 20h ;_ABS_MOV10TOOP1
137 ld a,b ;cal _ex_ahl_bde
144 ret nz ;not worm level
147 ld (leveldataSize),de
155 cal _Get_Word_ahl ;ld de,(ahl++)
160 ld a,e ;set new level
172 cal _SET_ABS_SRC_ADDR
175 cal _SET_ABS_DEST_ADDR
179 cal _SET_MM_NUM_BYTES
182 cal _LOAD_ABS_SRC_ADDR ;->ahl
187 res 2,(iy+13) ;appAutoScroll
191 ;-----------------------------
192 ;----- build trig tables -----
193 ;-----------------------------
218 ;-----------------------------
219 ;---------- menu -------------
220 ;-----------------------------
231 cal _puts ;txtOptions
245 jp LetsGetThisPartyOn
351 ;-----------------------------
352 ;-------- start game ---------
353 ;-----------------------------
376 ld de,$FF64 ;virt.infinate
382 cal _ldHLind ;ld hl,(hl)
417 ;-----------------------------
418 ;--------- game over ---------
419 ;-----------------------------
430 ld (worm1+score+1),hl
431 ;+score2=0 \ +delay=1
432 ld (worm2+score+1),hl
433 ld (worm3+score+1),hl
434 ld (worm4+score+1),hl
440 cal _MOV5B ;9xld(de),(hl)
458 ld (worm1+lives),a ;&&&<*
475 ;show end msg or smtn
477 psh bc ;where to go afterwards
478 inc hl ;location of ending-code
479 jp (hl) ;go there ("call")
502 ld b,0 ;bc=sprite size
503 add hl,bc ;hl=behind sprite
568 ld bc,(worm2-worm1)-5
573 ;-------- draw level ---------
692 ;-----------------------------
694 psh hl ; >> levelp new
708 ld hl,4+(txtposReady*256)
718 jr z,SwapPos ;no link
724 SwapPos: ;$18 xx -> $F6 xx
745 ;-----------------------------
746 ;----------- LOOP ------------
747 ;-----------------------------
766 jr nz,screeninvertloop
779 cal handlethatneatlittleball
792 ;-----------------------------
793 ;---------- keys -------------
794 ;-----------------------------
821 jr DoesWormTailEqualsWormHead ;chk4 size=0
832 DoesWormTailEqualsWormHead:
838 jr nz,safewormsizedone
867 ret nz ;HandleWorm done
935 cal _ldHLind ;ld hl,(hl)
936 cal showHL ;worm+score
946 jr z,hiscorecheckdone
948 cal loadhiscoreposinahl
949 cal _Get_Word_ahl ;de=old_hi
957 jr c,NotNewHigh ;New<Old
958 jr nz,newhigh ;New>Old
962 jr nc,NotNewHigh ;new<old
966 cal loadhiscoreposinahl
967 cal _Set_Word_ahl ;de->(ahl)
970 NotNewHigh: ;de=current hiscore
988 ;x123456789012345678901
989 ;1----- GAME OVER -----
1000 rst 20h ;_ABS_MOV10TOOP1
1006 cal _SET_ABS_DEST_ADDR
1010 cal _SET_ABS_SRC_ADDR
1011 ld hl,end-_asm_exec_ram
1012 cal _SET_MM_NUM_BYTES
1019 loadhiscoreposinahl:
1022 jr nz,externalhiscoresavepos
1026 externalhiscoresavepos:
1033 ;-----------------------------
1034 ;----------- worm ------------
1035 ;-----------------------------
1057 inkeys: ;use jp not call!
1076 ld bc,donediddelydone
1087 jr nz,saverespawncounter
1098 ;------- handle worm ---------
1118 ;-------- move worm ----------
1146 notmoveY: ;bc=newpos
1153 pop hl ; << pos (old)
1171 ;--------- worm hit ----------
1180 cal nz,checkhitotherworm
1198 cal DrawPea ;remove pea
1210 jr nz,still_alive_not_dead
1213 jr z,still_alive_not_dead
1219 pop hl ; << levelp new
1225 ;-----------------------------
1228 .db $dd,$7d ;ld a,lx
1231 ThisIsJustASillyUselessLabel:
1245 jr c,otherwormHIT ;yes
1250 jr nz,nextotherwormbit
1282 still_alive_not_dead:
1284 ;-------- draw worm ----------
1289 cal nz,HuntingTimeScore
1296 cal nz,checkhitlapline
1341 ;-----------------------------
1342 ;---------- ball -------------
1343 ;-----------------------------
1345 handlethatneatlittleball:
1356 inc b ;=%000100 dec=%000101
1361 cal letsmovetheotherway
1365 inc c ;=%001100 dec=%001101
1370 cal letsmovetheotherway
1387 letsmovetheotherway:
1400 ;-----------------------------
1401 ;----------- procs -----------
1402 ;-----------------------------
1441 jr nz,NewPea ;pixel found
1448 ;all ok; empty space
1455 cal PutSprite ;||-ed
1458 ;----------- score -----------
1461 .db $dd,$7d ;ld a,lx
1616 ;-----------------------------
1732 ld (ShiftRightCounter),a
1734 ld (ShiftRightChunk),a
1748 ShiftRightCounter = $-1
1770 ld (ShiftLeftCounter),a
1772 ld (ShiftLeftChunk),a
1774 jr nc,ShiftLeftSameByte
1793 ShiftLeftCounter = $-1
1804 jr nz,ShiftRowsRight
1838 ;----------- draw ------------
1852 CheckPixel: ;at bc in d
1859 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
1860 ;(b,c) to hl:a; "destroyes" ahl
1862 FindPixel: ;(b,c) to hl:a
1895 PutSprite: ;||@(b,c)
1896 ;by SHIAR only ix saved
2048 drawbox: ;(d,e)-(h,l)
2058 ;-----------------------------
2059 ;----------- link ------------
2060 ;-----------------------------
2176 ;-----------------------------
2177 ;---------- levels -----------
2178 ;-----------------------------
2181 .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2182 .db 0,2,63 ;start d, y, x
2183 .db 128,57 ;field width (128-255), height (57-255)
2184 .db 0,0 ;no additional lines, boxes
2191 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2195 ;-----------------------------
2196 ;---------- data -------------
2197 ;-----------------------------
2200 .db 0, 3, 6, 9, 12, 15, 18, 21
2201 .db 24, 27, 30, 33, 36, 39, 42, 45
2202 .db 48, 51, 54, 57, 59, 62, 65, 67
2203 .db 70, 73, 75, 78, 80, 82, 85, 87
2204 .db 89, 91, 94, 96, 98,100,102,103
2205 .db 105,107,108,110,112,113,114,116
2206 .db 117,118,119,120,121,122,123,123
2207 .db 124,125,125,126,126,126,126,126
2210 txtWelcome: .db "Welcome to Worm!! ",
2212 txtOptions: .db "Options",0
2213 txtGame: .db "Singleplayer",0 ;0
2214 txtGame2: .db "Peaworm ",0 ;1
2215 .db "Deathmatch",0 ;2
2216 .db "Foodmatch ",0 ;3
2217 .db "LinkMatch",0 ;4 (>options)
2221 .db "Domination",0 ;(>=8)
2222 txtWaiting: .db "Waiting...",0
2223 txtReceive: .db "Receiving...",0
2225 txtLevel: .db "Level ",0
2226 txtWorms: .db "Worms: 0",0 ;follows txtLevel
2227 txtDied: .db "Died ",0
2228 txtScore: .db "Score",0 ;follows txtDied
2229 txtLeft: .db " left",0 ;follows txtScore
2230 txthiscore:.db "HiScore:",0
2231 txtReady: .db "Prepare!",0
2233 txtGO: .db "----- GAME OVER -----",0
2237 _datalink = %00000001
2238 _datalivel = %00000010 ;ix+lives=0 limit
2239 _datafoodl = %00000100 ;left=0 limit
2240 _datanextl = %00001000 ;next level if left=0
2241 _datasingl = %00001000 ;singleplayer=1
2242 _datafood = %00010000 ;food present
2243 _datahunt = %00100000
2244 _datalaps = %01000000 ;give lap score
2245 _datascore = %10000000 ;score>=100 limit
2247 datasingle: .db %00011110
2248 datapeas: .db %00011010
2249 datadeathm: .db %00000010
2250 datafoodm: .db %10010000
2251 datalinkm: .db %00000011
2252 datahuntin: .db %10100000
2253 datarace: .db %11000000
2254 datactf: .db %00000000 ;==(8 modes)
2255 ;datadomin: .db %00000000
2256 datalevels: .dw LevelDef, LevelDef
2257 .dw LevelDefM,LevelDefM
2258 .dw LevelDefM,LevelDefM
2259 .dw LevelDefM,LevelDefM
2261 worm1set: .dw worm1p,worm1p
2262 .db 3,0,%01111110,%10,%100 ;< >
2263 worm1name: .db "Worm #1 ",0
2264 worm2set: .dw worm2p,worm2p
2265 .db 3,0,%00111111,%10000,%1000 ;f1 f2
2266 worm2name: .db "Worm #2 ",0
2267 worm3set: .dw worm3p,worm3p
2268 .db 3,0,%01011111,%10,%100 ;sto ,
2269 worm3name: .db "Worm #3 ",0
2270 worm4set: .dw worm4p,worm4p
2271 .db 3,0,%01111101,%10,%1 ;enter +
2272 worm4name: .db "Worm #4 ",0
2278 ;peasprite: .db %00111000
2287 peasprite: .db %01110000
2313 ;-----------------------------
2314 ;----------- end -------------
2315 ;-----------------------------