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 ;-----------------------------
81 resbit = 2 ;and%111110**
83 ScrBuffer = $8820 ;-A7FF (20*FF=1FE0)
84 worm1p = $A800 ;-ABFF (400) %10101O00
85 worm1 = $AC00 ;-AC1D (30d)
86 worm2 = $AC1E ;-AC3B (1E)
87 worm3 = $AC3C ;-AC59 (1E)
88 worm4 = $AC5A ;-AC77 (1E)
89 balls = $AC78 ;-ACFF (3x45d)
90 SinCosTable = $AD00 ;-AE00 (4x40)
91 ;free $AE01 ;-AFFF (1FF)
92 worm2p = $B000 ;-B3FF (400) %10110O00
93 DispBuffer = $B400 ;-B790 (10x57d)
94 ;free $B791 ;-B7FF (6F)
95 worm3p = $B800 ;-BBFF (400) %10111O00
96 ;free $BC00 ;-BFFF (400)
98 ;program $D748 ;-E7FF (106D+4A)
99 ;free $E800 ;-EFFF (800)
100 worm4p = $F000 ;-F3FF (400) %11110O00
101 leveldata = $F400 ;-FA70 (<=671)
105 templevels = $B400 ;(3*levelstr_on_calc)
107 ;-----------------------------
108 ;------- program start -------
109 ;-----------------------------
123 .db "WORM by SHIAR -- pre-beta 89%",0
126 .db %10010110,%01101111
127 .db %10110101,%01001011
128 .db %01110011,%01001001
129 .db %00000011,%10000000
130 .db %00000001,%11100000
131 .db %00111000,%11111000
132 .db %01111110,%00111111
133 .db %11101111,%00001111
134 .db %11000011,%10000000
137 levelhead2 = 89 ;worm levels header = "89"
146 ld hl,$BFFF ;VAT start
149 ld de,(_PTEMP_END+1) ;VAT end
182 ex de,hl ;ld ahl,(hl)
183 cal _AHL_PLUS_2_PG3 ;string id
184 cal _Get_Word_ahl ;ld de,(ahl)
189 jr nz,searchnext ;not worm
207 cal _Get_Word_ahl ;ld de,(ahl++)
212 ld a,e ;set new level
234 jp z,levelloaded ;no ext files
257 cal _load_ram_ahl ;hl=ahl
258 ld b,(hl) ;b=title size
260 cal _putps ;destr=abchl
278 cp K_ENTER-K_EXIT+256
290 ld (leveldataSize),de
299 cal _SET_ABS_SRC_ADDR
302 cal _SET_ABS_DEST_ADDR
306 cal _SET_MM_NUM_BYTES
309 cal _LOAD_ABS_SRC_ADDR ;->ahl
315 res 2,(iy+13) ;appAutoScroll
319 ;-----------------------------
320 ;----- build trig tables -----
321 ;-----------------------------
346 ;-----------------------------
347 ;---------- menu -------------
348 ;-----------------------------
368 cal _puts ;Singleplayer
380 jp LetsGetThisPartyOn ;1/3/4
392 jp nz,LetsGetThisPartyOn
400 ld d,(hl) ;max level for sel.game
441 jr dispnrworms ;jr mainMenu
446 jr c,mainMenu ;type 0/1
460 jr dispcurlevel ;mainMenu
509 cal _puts ;"Enter name player "
595 jr nz,waitnokeypressed
602 .db 0,"xtoje0",0 ;enter..clear
603 .db " wsnid9",0 ;(-)..custom
604 .db "zvrmhc8",0 ;dot..del
605 .db "yuqlgb7#" ;0..xvar
606 .db 0,"-pkfa6'" ;on..alpha
607 .db "54321*",0,0 ;F5..more
611 skiplevel: ;@hl - destr:ab - alter:hl
616 ld b,(hl) ;spritesize
627 inc b ;multiplayer lvl
629 inc b ;skip other 3 worms (9 bytes)
640 ld a,(hl) ;lines/boxes
650 ;-----------------------------
651 ;-------- start game ---------
652 ;-----------------------------
656 ld (CheckExit),a ;set exit state
678 ld de,$FF64 ;virt.infinate
684 cal _ldHLind ;ld hl,(hl)
689 dec d ;levels to skip
729 ;-----------------------------
730 ;--------- game over ---------
731 ;-----------------------------
742 ld (worm1+score+1),hl
743 ;+score2=0 \ +delay=1
744 ld (worm2+score+1),hl
745 ld (worm3+score+1),hl
746 ld (worm4+score+1),hl
750 cal _MOV5B ;9xld(de),(hl)
768 ld (worm1+lives),a ;&&&<*
785 ;show end msg or smtn
787 psh bc ;where to go afterwards
788 inc hl ;location of ending-code
789 jp (hl) ;go there ("call")
811 ld b,0 ;bc=sprite size
812 add hl,bc ;hl=behind sprite
883 ld bc,(worm2-worm1)-5
888 ;-------- draw level ---------
1007 ;-----------------------------
1009 psh hl ; >> levelp new
1023 ld hl,4+(txtposReady*256)
1033 jr z,SwapPos ;no link
1039 SwapPos: ;$18 xx -> $F6 xx
1047 ld a,(worm1+heading)
1049 ld a,(worm2+heading)
1050 ld (worm1+heading),a
1052 ld (worm2+heading),a
1060 ;-----------------------------
1061 ;----------- LOOP ------------
1062 ;-----------------------------
1081 jr nz,screeninvertloop
1094 cal handlethoseneatlittleballs
1107 ;-----------------------------
1108 ;---------- keys -------------
1109 ;-----------------------------
1124 rla ;=$17 (c=EXIT-key)
1132 ld (ix+delay),respawndelay
1151 ret nz ;HandleWorm done
1155 ld a,$A7 ;exit@end of turn
1156 ld (CheckExit),a ;set exit state
1214 ld a,(hl) ;worm+died
1222 cal _ldHLind ;ld hl,(hl)
1223 cal showHL ;worm+score
1229 dnz displayWormStats
1232 or a ;singleplayer (0) only
1233 jr nz,hilevelcheckdone
1239 jr c,hilevelcheckdone
1240 ld (hl),a ;save local
1245 hilvlposhl =$-2 ;save external
1246 cal _writeb_inc_ahl ;ld (ahl),c
1251 jr z,hiscorecheckdone
1253 cal loadhiscoreposinahl
1254 cal _Get_Word_ahl ;de=old_hi
1262 jr c,NotNewHigh ;New<Old
1263 jr nz,newhigh ;New>Old
1267 jr nc,NotNewHigh ;new<old
1271 cal loadhiscoreposinahl
1272 cal _Set_Word_ahl ;de->(ahl)
1275 NotNewHigh: ;de=current hiscore
1293 ;x123456789012345678901
1294 ;1----- GAME OVER -----
1299 ;6Worm#02 @ 05 00120
1305 rst 20h ;_ABS_MOV10TOOP1
1311 cal _SET_ABS_DEST_ADDR
1315 cal _SET_ABS_SRC_ADDR
1316 ld hl,end-_asm_exec_ram
1317 cal _SET_MM_NUM_BYTES
1324 loadhiscoreposinahl:
1327 externalhiscoresavepos:
1336 ;-----------------------------
1337 ;----------- worm ------------
1338 ;-----------------------------
1360 inkeys: ;use jp not call!
1379 ld bc,donediddelydone
1395 jr DoesWormTailEqualsWormHead ;chk4 size=0
1406 DoesWormTailEqualsWormHead:
1408 jr nz,removewormloop
1412 jr nz,safewormsizedone
1425 jr nz,saverespawncounter
1436 ;------- handle worm ---------
1456 ;-------- move worm ----------
1484 notmoveY: ;bc=newpos
1491 pop hl ; << pos (old)
1509 ;--------- worm hit ----------
1518 cal nz,checkhitotherworm
1536 cal DrawPea ;remove pea
1548 jr nz,still_alive_not_dead
1551 jr z,still_alive_not_dead
1554 jp nz,Exit ;stack restored
1565 cal IncScore ;score+(40*level)
1568 pop hl ; << levelp new
1571 ;-----------------------------
1574 .db $dd,$7d ;ld a,lx
1577 ThisIsJustASillyUselessLabel:
1591 jr c,otherwormHIT ;yes
1596 jr nz,nextotherwormbit
1628 still_alive_not_dead:
1630 ;-------- draw worm ----------
1635 cal nz,HuntingTimeScore
1642 cal nz,checkhitlapline
1687 ;-----------------------------
1688 ;---------- ball -------------
1689 ;-----------------------------
1691 handlethoseneatlittleballs:
1742 bit 1,d ;1=up; 0=down
1772 letsmovetheotherway:
1787 ;-----------------------------
1788 ;----------- procs -----------
1789 ;-----------------------------
1828 jr nz,NewPea ;pixel found
1835 ;all ok; empty space
1842 cal PutSprite ;||-ed
1845 ;----------- score -----------
1858 .db $dd,$7d ;ld a,lx
1873 jr z,scorecommon ;hl/1000 not increased
1881 jr c,showstats ;<0=0
2019 ;-----------------------------
2135 ld (ShiftRightCounter),a
2137 ld (ShiftRightChunk),a
2151 ShiftRightCounter = $-1
2173 ld (ShiftLeftCounter),a
2175 ld (ShiftLeftChunk),a
2177 jr nc,ShiftLeftSameByte
2196 ShiftLeftCounter = $-1
2207 jr nz,ShiftRowsRight
2241 ;----------- draw ------------
2255 CheckPixel: ;at bc in d
2262 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2263 ;(b,c) to hl:a; "destroyes" ahl
2265 FindPixel: ;(b,c) to hl:a
2298 PutSprite: ;||@(b,c)
2299 ;by SHIAR only ix saved
2451 drawbox: ;(d,e)-(h,l)
2461 ;-----------------------------
2462 ;----------- link ------------
2463 ;-----------------------------
2579 ;-----------------------------
2580 ;---------- levels -----------
2581 ;-----------------------------
2584 .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2585 .db 0,2,63 ;start d, y, x
2586 .db 128,57 ;field width (128-255), height (57-255)
2587 .db 0,0 ;no additional lines, boxes
2594 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2598 ;-----------------------------
2599 ;---------- data -------------
2600 ;-----------------------------
2602 txtWelcome: .db "Welcome to Worm!! ",
2604 .db "Have fun!",0 ;4th menu item
2605 .db "Level 00",0 ;3rd
2606 .db "Worms: 0",0 ;2nd
2607 txtGame: .db "Singleplayer",0 ;0 (1st)
2608 txtGame2: .db "Peaworm ",0 ;1
2609 .db "Deathmatch",0 ;2
2610 .db "Foodmatch ",0 ;3
2611 .db "LinkMatch",0 ;4 (>options)
2615 .db "Domination",0 ;(>=8)
2616 txtName: .db "Enter name player ",0
2617 txtWaiting: .db "Waiting...",0
2618 txtReceive: .db "Receiving..." ;,0
2621 .db 0, 3, 6, 9, 12, 15, 18, 21
2622 .db 24, 27, 30, 33, 36, 39, 42, 45
2623 .db 48, 51, 54, 57, 59, 62, 65, 67
2624 .db 70, 73, 75, 78, 80, 82, 85, 87
2625 .db 89, 91, 94, 96, 98,100,102,103
2626 .db 105,107,108,110,112,113,114,116
2627 .db 117,118,119,120,121,122,123,123
2628 .db 124,125,125,126,126,126,126,126
2631 txtLevel: .db "Level ",0
2632 txtWorms: .db "Worms: 0",0 ;follows txtLevel
2633 txtDied: .db "Died ",0
2634 txtScore: .db "Score",0 ;follows txtDied
2635 txtLeft: .db " left",0 ;follows txtScore
2636 txthiscore:.db "HiScore:",0
2637 txtReady: .db "Prepare!",0
2639 txtGO: .db "----- GAME OVER -----",0
2643 _datalink = %00000001
2644 _datalivel = %00000010 ;ix+lives=0 limit
2645 _datafoodl = %00000100 ;left=0 limit
2646 _datanextl = %00001000 ;next level if left=0
2647 _datasingl = %00001000 ;singleplayer=1
2648 _datafood = %00010000 ;food present
2649 _datahunt = %00100000
2650 _datalaps = %01000000 ;give lap score
2651 _datascore = %10000000 ;score>=100 limit
2653 datasingle: .db %00011110
2654 datapeas: .db %00011010
2655 datadeathm: .db %00000010
2656 datafoodm: .db %10010000
2657 datalinkm: .db %00000011
2658 datahuntin: .db %10100000
2659 datarace: .db %11000000
2660 datactf: .db %00000000 ;==(8 modes)
2661 ;datadomin: .db %00000000
2662 datalevels: .dw LevelDef, LevelDef
2663 .dw LevelDefM,LevelDefM
2664 .dw LevelDefM,LevelDefM
2665 .dw LevelDefM,LevelDefM
2666 nrlevels: .db 2,2,2,2,2,2,2,2
2668 worm1set: .dw worm1p,worm1p
2669 .db 3,0,%01111110,%10,%100 ;< >
2670 worm1name: .db "worm #01",0
2671 worm2set: .dw worm2p,worm2p
2672 .db 3,0,%00111111,%10000,%1000 ;f1 f2
2673 worm2name: .db "worm #02",0
2674 worm3set: .dw worm3p,worm3p
2675 .db 3,0,%01011111,%10,%100 ;sto ,
2676 worm3name: .db "worm #03",0
2677 worm4set: .dw worm4p,worm4p
2678 .db 3,0,%01111101,%10,%1 ;enter +
2679 worm4name: .db "worm #04",0
2686 peasprite: .db %01100000
2715 ;-----------------------------
2716 ;----------- end -------------
2717 ;-----------------------------