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 ;-----------------------------
23 ; 2% * make linkplay available for all gametypes (not just deathmatch)
25 ; 1% * ctf: take enemy flag (right-bottom) and return to your flag (left-top)
26 ; 1% * domination?: take control points by running over them and hold them
27 ; * complete readme (+custom level info)
28 ; 2% * ... (pollish, &&&)
32 ;100% = bugs fixed + levels done
34 ;-----------------------------
35 ;-----------------------------
36 ;--------- W O R M ---------
37 ;-----------------------------
38 ;-----------------------------
45 #include "ti86asm.inc"
49 _divHLby10 = $4044 ;hl=hl/10
50 _divAby10 = $4DAF ;a=a/10
51 _HLTIMES10 = $41BF ;hl=hl*10
53 _clrWindow = $4A86 ;clear screen
54 _asapvar = $D6FC ;own name (worm)
55 _MOV4B = $429B ;4x ld (de),(hl)
56 _MOV5B = $4297 ;5x ld (de),(hl)
57 _mov9b = $4283 ;9x ld (de),(hl)
58 _ldHLind = $4010 ;ld hl,(hl)
59 _swapt_ = $45F3 ;ex_ahl_bde
60 _Get_Word_ahl = $521D ;ld de,(ahl)
61 _Set_Word_ahl = $5221 ;ld (ahl),de
62 _INC_PTR_AHL = $4637 ;ahl=ahl+1
63 _AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2
64 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl
65 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
66 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
67 _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
68 _mm_ldir = $52ED ;24bit ldir
69 _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
72 _load_ram_ahl = $462F ;ahl->page+hl
73 _writeb_inc_ahl = $5567 ;ld (ahl),c
75 ;-----------------------------
76 ;------- data storage -------
77 ;-----------------------------
79 leveldata = $EA00 ;size< $400
80 ScrBuffer = $8100 ;size=$2000 (32x256)
82 templevels = $BC00 ;size= 3*$10
83 DispBuffer = $BC00 ;size= $390 (16x57)
84 SinCosTable = $B500 ;size= $100 (4x64)
92 resbit = 2 ;and%11111011
93 worm1p = $B000 ;%10110000 -$B3FF
94 worm2p = $B800 ;%10111000 -$BBFF
95 worm3p = $F000 ;%11110000 -$F3FF
96 worm4p = $A800 ;$E800=%11101000 ;$D748+$1000+
100 ;-----------------------------
101 ;------- program start -------
102 ;-----------------------------
114 .db "WORM by SHIAR -- pre-beta 89%",0
117 .db %10010110,%01101111
118 .db %10110101,%01001011
119 .db %01110011,%01001001
120 .db %00000011,%10000000
121 .db %00000001,%11100000
122 .db %00111000,%11111000
123 .db %01111110,%00111111
124 .db %11101111,%00001111
125 .db %11000011,%10000000
128 levelhead2 = '9' ;worm levels header = "89"
137 ld hl,$BFFF ;VAT start
172 ex de,hl ;ld ahl,(hl)
173 cal _AHL_PLUS_2_PG3 ;string id
174 cal _Get_Word_ahl ;ld de,(ahl)
179 jr nz,searchnext ;not worm
198 cal _Get_Word_ahl ;ld de,(ahl++)
203 ld a,e ;set new level
225 jp z,levelloaded ;no ext files
248 cal _load_ram_ahl ;hl=ahl
249 ld b,(hl) ;b=title size
251 cal _putps ;destr=abchl
269 cp K_ENTER-K_EXIT+256
281 ld (leveldataSize),de
290 cal _SET_ABS_SRC_ADDR
293 cal _SET_ABS_DEST_ADDR
297 cal _SET_MM_NUM_BYTES
300 cal _LOAD_ABS_SRC_ADDR ;->ahl
306 res 2,(iy+13) ;appAutoScroll
310 ;-----------------------------
311 ;----- build trig tables -----
312 ;-----------------------------
337 ;-----------------------------
338 ;---------- menu -------------
339 ;-----------------------------
359 cal _puts ;Singleplayer
371 jp LetsGetThisPartyOn ;1/3/4
383 jp nz,LetsGetThisPartyOn
391 ld d,(hl) ;max level for sel.game
432 jr dispnrworms ;jr mainMenu
437 jr c,mainMenu ;type 0/1
451 jr dispcurlevel ;mainMenu
578 jr nz,waitnokeypressed
585 .db 0,"xtoje0",0 ;enter..clear
586 .db " wsnid9",0 ;(-)..custom
587 .db "zvrmhc8",0 ;dot..del
588 .db "yuqlgb7*" ;0..xvar
589 .db 0,"-pkfa6'" ;on..alpha
590 .db "54321.",0,0 ;F5..more
594 skiplevel: ;@hl - destr:ab - alter:hl
599 ld b,(hl) ;spritesize
610 inc b ;multiplayer lvl
612 inc b ;skip other 3 worms (9 bytes)
623 ld a,(hl) ;lines/boxes
633 ;-----------------------------
634 ;-------- start game ---------
635 ;-----------------------------
639 ld (CheckExit),a ;set exit state
661 ld de,$FF64 ;virt.infinate
667 cal _ldHLind ;ld hl,(hl)
672 dec d ;levels to skip
712 ;-----------------------------
713 ;--------- game over ---------
714 ;-----------------------------
725 ld (worm1+score+1),hl
726 ;+score2=0 \ +delay=1
727 ld (worm2+score+1),hl
728 ld (worm3+score+1),hl
729 ld (worm4+score+1),hl
733 cal _MOV5B ;9xld(de),(hl)
751 ld (worm1+lives),a ;&&&<*
768 ;show end msg or smtn
770 psh bc ;where to go afterwards
771 inc hl ;location of ending-code
772 jp (hl) ;go there ("call")
794 ld b,0 ;bc=sprite size
795 add hl,bc ;hl=behind sprite
866 ld bc,(worm2-worm1)-5
871 ;-------- draw level ---------
990 ;-----------------------------
992 psh hl ; >> levelp new
1006 ld hl,4+(txtposReady*256)
1016 jr z,SwapPos ;no link
1022 SwapPos: ;$18 xx -> $F6 xx
1030 ld a,(worm1+heading)
1032 ld a,(worm2+heading)
1033 ld (worm1+heading),a
1035 ld (worm2+heading),a
1043 ;-----------------------------
1044 ;----------- LOOP ------------
1045 ;-----------------------------
1064 jr nz,screeninvertloop
1077 cal handlethoseneatlittleballs
1090 ;-----------------------------
1091 ;---------- keys -------------
1092 ;-----------------------------
1107 rla ;=$17 (c=EXIT-key)
1135 ret nz ;HandleWorm done
1139 ld a,$A7 ;exit@end of turn
1140 ld (CheckExit),a ;set exit state
1198 ld a,(hl) ;worm+died
1206 cal _ldHLind ;ld hl,(hl)
1207 cal showHL ;worm+score
1213 dnz displayWormStats
1216 or a ;singleplayer (0) only
1217 jr nz,hilevelcheckdone
1223 jr c,hilevelcheckdone
1224 ld (hl),a ;save local
1229 hilvlposhl =$-2 ;save external
1230 cal _writeb_inc_ahl ;ld (ahl),c
1235 jr z,hiscorecheckdone
1237 cal loadhiscoreposinahl
1238 cal _Get_Word_ahl ;de=old_hi
1246 jr c,NotNewHigh ;New<Old
1247 jr nz,newhigh ;New>Old
1251 jr nc,NotNewHigh ;new<old
1255 cal loadhiscoreposinahl
1256 cal _Set_Word_ahl ;de->(ahl)
1259 NotNewHigh: ;de=current hiscore
1277 ;x123456789012345678901
1278 ;1----- GAME OVER -----
1283 ;6Worm#02 @ 05 00120
1289 rst 20h ;_ABS_MOV10TOOP1
1295 cal _SET_ABS_DEST_ADDR
1299 cal _SET_ABS_SRC_ADDR
1300 ld hl,end-_asm_exec_ram
1301 cal _SET_MM_NUM_BYTES
1308 loadhiscoreposinahl:
1311 externalhiscoresavepos:
1320 ;-----------------------------
1321 ;----------- worm ------------
1322 ;-----------------------------
1344 inkeys: ;use jp not call!
1363 ld bc,donediddelydone
1379 jr DoesWormTailEqualsWormHead ;chk4 size=0
1390 DoesWormTailEqualsWormHead:
1392 jr nz,removewormloop
1396 jr nz,safewormsizedone
1409 jr nz,saverespawncounter
1420 ;------- handle worm ---------
1440 ;-------- move worm ----------
1468 notmoveY: ;bc=newpos
1475 pop hl ; << pos (old)
1493 ;--------- worm hit ----------
1502 cal nz,checkhitotherworm
1520 cal DrawPea ;remove pea
1532 jr nz,still_alive_not_dead
1535 jr z,still_alive_not_dead
1538 jp nz,Exit ;stack restored
1549 cal IncScore ;score+(40*level)
1552 pop hl ; << levelp new
1555 ;-----------------------------
1558 .db $dd,$7d ;ld a,lx
1561 ThisIsJustASillyUselessLabel:
1575 jr c,otherwormHIT ;yes
1580 jr nz,nextotherwormbit
1612 still_alive_not_dead:
1614 ;-------- draw worm ----------
1619 cal nz,HuntingTimeScore
1626 cal nz,checkhitlapline
1671 ;-----------------------------
1672 ;---------- ball -------------
1673 ;-----------------------------
1675 handlethoseneatlittleballs:
1726 bit 1,d ;1=up; 0=down
1756 letsmovetheotherway:
1771 ;-----------------------------
1772 ;----------- procs -----------
1773 ;-----------------------------
1812 jr nz,NewPea ;pixel found
1819 ;all ok; empty space
1826 cal PutSprite ;||-ed
1829 ;----------- score -----------
1842 .db $dd,$7d ;ld a,lx
1857 jr z,scorecommon ;hl/1000 not increased
1865 jr c,showstats ;<0=0
2003 ;-----------------------------
2119 ld (ShiftRightCounter),a
2121 ld (ShiftRightChunk),a
2135 ShiftRightCounter = $-1
2157 ld (ShiftLeftCounter),a
2159 ld (ShiftLeftChunk),a
2161 jr nc,ShiftLeftSameByte
2180 ShiftLeftCounter = $-1
2191 jr nz,ShiftRowsRight
2225 ;----------- draw ------------
2239 CheckPixel: ;at bc in d
2246 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2247 ;(b,c) to hl:a; "destroyes" ahl
2249 FindPixel: ;(b,c) to hl:a
2282 PutSprite: ;||@(b,c)
2283 ;by SHIAR only ix saved
2435 drawbox: ;(d,e)-(h,l)
2445 ;-----------------------------
2446 ;----------- link ------------
2447 ;-----------------------------
2563 ;-----------------------------
2564 ;---------- levels -----------
2565 ;-----------------------------
2568 .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2569 .db 0,2,63 ;start d, y, x
2570 .db 128,57 ;field width (128-255), height (57-255)
2571 .db 0,0 ;no additional lines, boxes
2578 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2582 ;-----------------------------
2583 ;---------- data -------------
2584 ;-----------------------------
2587 .db 0, 3, 6, 9, 12, 15, 18, 21
2588 .db 24, 27, 30, 33, 36, 39, 42, 45
2589 .db 48, 51, 54, 57, 59, 62, 65, 67
2590 .db 70, 73, 75, 78, 80, 82, 85, 87
2591 .db 89, 91, 94, 96, 98,100,102,103
2592 .db 105,107,108,110,112,113,114,116
2593 .db 117,118,119,120,121,122,123,123
2594 .db 124,125,125,126,126,126,126,126
2597 txtWelcome: .db "Welcome to Worm!! ",
2599 .db "Have fun!",0 ;4th menu item
2600 .db "Level 00",0 ;3rd
2601 .db "Worms: 0",0 ;2nd
2602 txtGame: .db "Singleplayer",0 ;0 (1st)
2603 txtGame2: .db "Peaworm ",0 ;1
2604 .db "Deathmatch",0 ;2
2605 .db "Foodmatch ",0 ;3
2606 .db "LinkMatch",0 ;4 (>options)
2610 .db "Domination",0 ;(>=8)
2611 txtWaiting: .db "Waiting...",0
2612 txtReceive: .db "Receiving...",0
2614 txtLevel: .db "Level ",0
2615 txtWorms: .db "Worms: 0",0 ;follows txtLevel
2616 txtDied: .db "Died ",0
2617 txtScore: .db "Score",0 ;follows txtDied
2618 txtLeft: .db " left",0 ;follows txtScore
2619 txthiscore:.db "HiScore:",0
2620 txtReady: .db "Prepare!",0
2622 txtGO: .db "----- GAME OVER -----",0
2626 _datalink = %00000001
2627 _datalivel = %00000010 ;ix+lives=0 limit
2628 _datafoodl = %00000100 ;left=0 limit
2629 _datanextl = %00001000 ;next level if left=0
2630 _datasingl = %00001000 ;singleplayer=1
2631 _datafood = %00010000 ;food present
2632 _datahunt = %00100000
2633 _datalaps = %01000000 ;give lap score
2634 _datascore = %10000000 ;score>=100 limit
2636 datasingle: .db %00011110
2637 datapeas: .db %00011010
2638 datadeathm: .db %00000010
2639 datafoodm: .db %10010000
2640 datalinkm: .db %00000011
2641 datahuntin: .db %10100000
2642 datarace: .db %11000000
2643 datactf: .db %00000000 ;==(8 modes)
2644 ;datadomin: .db %00000000
2645 datalevels: .dw LevelDef, LevelDef
2646 .dw LevelDefM,LevelDefM
2647 .dw LevelDefM,LevelDefM
2648 .dw LevelDefM,LevelDefM
2649 nrlevels: .db 1,1,1,1,1,1,1,1
2651 worm1set: .dw worm1p,worm1p
2652 .db 3,0,%01111110,%10,%100 ;< >
2653 worm1name: .db "Left ",0
2654 worm2set: .dw worm2p,worm2p
2655 .db 3,0,%00111111,%10000,%1000 ;f1 f2
2656 worm2name: .db "Right ",0
2657 worm3set: .dw worm3p,worm3p
2658 .db 3,0,%01011111,%10,%100 ;sto ,
2659 worm3name: .db "Top ",0
2660 worm4set: .dw worm4p,worm4p
2661 .db 3,0,%01111101,%10,%1 ;enter +
2662 worm4name: .db "Bottom ",0
2669 peasprite: .db %01100000
2698 ;-----------------------------
2699 ;----------- end -------------
2700 ;-----------------------------