3 ; Release Date : may 2000
4 ; Filename : worm.86p (5kb)
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 ; 2% * fix deaths linkplay and transmit game/level data
22 ; 2% * make linkplay available for all gametypes (not just deathmatch)
23 ; 1% * fix pea XOR problem in ctf (+dom?)
25 ; 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 ;-----------------------------
40 #define buffer ;use display buffer (otherwise write directly to screen)
41 #define readymask ;"grays" out the field before starting a level
43 ;#define readytext ;displays "prepare" before level starts
44 ;#define invincible ;worms cannot die =)
51 #include "ti86asm.inc"
55 _divHLby10 = $4044 ;hl=hl/10
56 _divAby10 = $4DAF ;a=a/10
57 _HLTIMES10 = $41BF ;hl=hl*10
59 _clrWindow = $4A86 ;clear screen
60 _asapvar = $D6FC ;own name (worm)
61 _MOV4B = $429B ;4x ld (de),(hl)
62 _MOV5B = $4297 ;5x ld (de),(hl)
63 _mov9b = $4283 ;9x ld (de),(hl)
64 _ldHLind = $4010 ;ld hl,(hl)
65 _swapt_ = $45F3 ;ex_ahl_bde
66 _Get_Word_ahl = $521D ;ld de,(ahl)
67 _Set_Word_ahl = $5221 ;ld (ahl),de
68 _INC_PTR_AHL = $4637 ;ahl=ahl+1
69 _AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2
70 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl
71 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
72 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
73 _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
74 _mm_ldir = $52ED ;24bit ldir
75 _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
77 _PTEMP_END = $D29A ;end of VAT
78 _load_ram_ahl = $462F ;ahl->page+hl
79 _writeb_inc_ahl = $5567 ;ld (ahl),c
80 _jforce = $409C ;TI-OS stack restored
81 _EXLP = $4493 ;swap (hl),(de) b times
83 ;-----------------------------
84 ;------- data storage -------
85 ;-----------------------------
89 ScrBuffer = $8820 ;-A7FF (20*FF=1FE0)
90 worm2p = $A800 ;-ABFF (400) %10101O00
91 worm1 = $AC00 ;-AC1D (31d)
92 worm2 = $AC1F ;-AC3B (1F)
93 worm3 = $AC3E ;-AC59 (1F)
94 worm4 = $AC5D ;-AC77 (1F)
95 balls = $AC7C ;-ACFF (3x43d)
96 SinCosTable = $AD00 ;-AE00 (4x40)
97 ;free $AE01 ;-AFFF (1FF)
98 worm1p = $B000 ;-B7FF (800) %1011O000
99 worm3p = $B800 ;-BBFF (400) %10111O00
100 ;free $BF91 ;-BFFF (6F)
102 ;program $D748 ;-E7FF (106D+4A)
103 ;free $E800 ;-EFFF (800)
104 worm4p = $F000 ;-F3FF (400) %11110O00
105 leveldata = $F400 ;-FA70 (<=671)
111 templevels = $BC00 ;(3*strings) @init
112 namelength = $BC00 ;(1) @menu
114 DispBuffer = $BC00 ;(10x57d) @game
119 ;-----------------------------
120 ;------- program start -------
121 ;-----------------------------
135 .db "WORM by SHIAR -- pre-beta 91%",0
138 .db %10010110,%01101111
139 .db %10110101,%01001011
140 .db %01110011,%01001001
141 .db %00000011,%10000000
142 .db %00000001,%11100000
143 .db %00111000,%11111000
144 .db %01111110,%00111111
145 .db %11101111,%00001111
146 .db %11000011,%10000000
149 levelhead2 = 91 ;worm levels header = "91"
157 ld hl,$BFFF ;VAT start
160 ld de,(_PTEMP_END+1) ;VAT end
193 ex de,hl ;ld ahl,(hl)
194 cal _AHL_PLUS_2_PG3 ;string id
195 cal _Get_Word_ahl ;ld de,(ahl)
200 jr nz,searchnext ;not worm
218 cal _Get_Word_ahl ;ld de,(ahl++)
223 ld a,e ;set new level
245 jp z,_clrWindow ;no ext files: exit
253 cal _puts ;"< Select levels: >"
272 cal _load_ram_ahl ;hl=ahl
273 ld b,(hl) ;b=title size
275 cal _putps ;destr=abchl
293 cp K_ENTER-K_EXIT+256
305 ld (leveldataSize),de
314 cal _SET_ABS_SRC_ADDR
317 cal _SET_ABS_DEST_ADDR
321 cal _SET_MM_NUM_BYTES
324 cal _LOAD_ABS_SRC_ADDR ;->ahl
330 res 2,(iy+13) ;appAutoScroll
334 ;-----------------------------
335 ;----- build trig tables -----
336 ;-----------------------------
361 ;-----------------------------
362 ;---------- menu -------------
363 ;-----------------------------
391 cal _puts ;Level <00>
398 cal _puts ;Singleplayer
410 jp LetsGetThisPartyOn ;1/3/4
424 jp nz,LetsGetThisPartyOn
432 ld d,(hl) ;max level for sel.game
486 jr dispnrworms ;mainMenu
491 jr c,_mainMenu ;type 0/1
500 ld a,(hl) ;hl=nrworms
507 jr _dispcurlevel ;mainMenu
564 cal _puts ;"Enter name player "
655 jr nz,waitnokeypressed
659 .db 0,".<>!",0,0,0,0 ;down,L,R,up
660 .db 0,"XTOJE0",0 ;enter..clear
661 .db " WSNID9",0 ;(-)..custom
662 .db "ZVRMHC8",0 ;dot..del
663 .db "YUQLGB7#" ;0..xvar
664 .db $D9,"-PKFA6'" ;on..alpha
665 .db "54321*",0,$D0 ;F5..more
669 skiplevel: ;@hl - destr:ab - alter:hl
674 ld b,(hl) ;spritesize
685 inc b ;multiplayer lvl
687 inc b ;skip other 3 worms (9 bytes)
709 ld a,(hl) ;lines/boxes
720 ;-----------------------------
721 ;-------- start game ---------
722 ;-----------------------------
726 ld (CheckExit),a ;set exit state
748 ld de,$FF64 ;virt.infinate
754 cal _ldHLind ;ld hl,(hl)
759 dec d ;levels to skip
838 ;-----------------------------
839 ;--------- game over ---------
840 ;-----------------------------
846 ld a,4 ;4x (all worms)
859 ex de,hl ;de=wormX+head
863 jr nz,createwormsloop
870 pop hl ;begin of current level
882 ;show end msg or smtn
884 psh bc ;where to go afterwards
885 inc hl ;location of ending-code
886 jp (hl) ;go there ("call")
908 ld b,0 ;bc=sprite size
909 add hl,bc ;hl=behind sprite
959 ld bc,(worm2-worm1)-5
964 ;-------- draw level ---------
1095 ;-----------------------------
1097 psh hl ; >> levelp new
1132 ld hl,4+(txtposReady*256)
1143 jr z,initfinished ;no link
1146 ld (worm2+input),a ;worm 2 via link
1148 ld (Speed),a ;max.speed
1149 SwapPos: ;$18 xx -> $F6 xx
1153 ld (worm2+left),a ;1
1156 ld b,4 ;+heading +pos
1157 cal _EXLP ;swap positions
1162 cal _EXLP ;swap positions
1171 ;-----------------------------
1172 ;----------- LOOP ------------
1173 ;-----------------------------
1192 jr nz,screeninvertloop
1208 cal nz,handlethoseneatlittleballs
1221 ;-----------------------------
1222 ;---------- keys -------------
1223 ;-----------------------------
1238 rla ;=$17 (c=EXIT-key)
1249 ld (ix+delay),respawndelay
1268 ret nz ;HandleWorm done
1272 ld a,$A7 ;exit@end of turn
1273 ld (CheckExit),a ;set exit state
1307 cp (hl) ;input=0 = link
1332 ld a,(hl) ;worm+died
1340 cal _ldHLind ;ld hl,(hl)
1341 cal showHL ;worm+score
1347 dnz displayWormStats
1350 or a ;singleplayer (0) only
1351 jr nz,hilevelcheckdone
1356 jr c,hilevelcheckdone
1357 ld (hl),a ;save local
1362 hilvlposhl =$-2 ;save external
1363 cal _writeb_inc_ahl ;ld (ahl),c
1368 jr z,hiscorecheckdone
1370 cal loadhiscoreposinahl
1371 cal _Get_Word_ahl ;de=old_hi
1379 jr c,NotNewHigh ;New<Old
1380 jr nz,newhigh ;New>Old
1384 jr nc,NotNewHigh ;new<old
1388 cal loadhiscoreposinahl
1389 cal _Set_Word_ahl ;de->(ahl)
1392 NotNewHigh: ;de=current hiscore
1413 ;x123456789012345678901
1414 ;1----- GAME OVER -----
1419 ;6Worm#02 @ 05 00120
1425 rst 20h ;_ABS_MOV10TOOP1
1431 cal _SET_ABS_DEST_ADDR
1435 cal _SET_ABS_SRC_ADDR
1436 ld hl,end-_asm_exec_ram
1437 cal _SET_MM_NUM_BYTES
1445 loadhiscoreposinahl:
1450 externalhiscoresavepos:
1458 dnz addlevelposition
1461 ;-----------------------------
1462 ;----------- worm ------------
1463 ;-----------------------------
1468 cal saverespawncounter
1474 jr DoesWormTailEqualsWormHead ;chk4 size=0
1485 DoesWormTailEqualsWormHead:
1487 jr nz,removewormloop
1491 jr nz,safewormsizedone
1499 ld (ix+tail),e ;head=tail/size=0
1505 jr nz,saverespawncounter
1523 inkeys: ;use jp not call!
1570 ;------- handle worm ---------
1602 ;-------- move worm ----------
1630 notmoveY: ;bc=newpos
1637 pop hl ; << pos (old)
1655 ;--------- worm hit ----------
1661 cal z,checkhitotherworm
1663 and _datamultpeas ;&&bit
1667 jp z,WormDead ;no food
1674 cal DrawPea ;remove pea
1686 jp nz,Drawworm ;continue
1692 jp nz,Exit ;stack restored
1703 cal IncScore ;score+(40*level)
1707 pop hl ; << levelp new
1711 chkpeahit: ;hl=peapos
1740 ld hl,(peaspos) ;1st pea
1746 ld hl,(peaspos+2) ;2nd pea
1749 pop hl ;(peapos) 1st pea
1750 jp c,stopworm ;own pea hit
1752 ld a,e ;peek a (that x86 asm for pop\push ;)
1755 ld hl,(peaspos+2) ;2nd pea
1768 cal DrawPea ;restore own flag
1769 jr sillylabel ;inv both\die
1771 hitflag: ;correct pea hit
1789 ret ;Z=yes: no flag taken
1791 ;-----------------------------
1810 jr nz,nextotherwormbit
1835 .db $dd,$7d ;ld a,lx
1838 jr nz,chkworm2 ; ret nz
1863 ;-------- draw worm ----------
1871 cal z,checkhitlapline
1916 ;-----------------------------
1917 ;---------- ball -------------
1918 ;-----------------------------
1920 handlethoseneatlittleballs:
1966 bit 1,d ;1=up; 0=down
1996 letsmovetheotherway:
2011 ;-----------------------------
2012 ;----------- procs -----------
2013 ;-----------------------------
2017 ld a,%10000000 ;all key-masks
2020 inc a ;cp %11111111 (no keys pressed)
2021 jr nz,releasekeys ;keep waitin
2022 cal GET_KEY ;clear buffer
2068 jr nz,NewPea ;pixel found
2075 ;all ok; empty space
2084 ;----------- score -----------
2104 jr z,scorecommon ;hl/1000 not increased
2112 jr c,showstats ;<0=0
2250 ;-----------------------------
2368 ld (ShiftRightCounter),a
2370 ld (ShiftRightChunk),a
2384 ShiftRightCounter = $-1
2406 ld (ShiftLeftCounter),a
2408 ld (ShiftLeftChunk),a
2410 jr nc,ShiftLeftSameByte
2429 ShiftLeftCounter = $-1
2440 jr nz,ShiftRowsRight
2474 ;----------- draw ------------
2488 CheckPixel: ;at bc in d
2495 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2496 ;(b,c) to hl:a; "destroyes" ahl
2498 FindPixel: ;(b,c) to hl:a
2531 PutSprite: ;||@(b,c)
2532 ;by SHIAR only ix saved
2684 drawbox: ;(d,e)-(h,l)
2694 ;-----------------------------
2695 ;----------- link ------------
2696 ;-----------------------------
2788 .db $F6 ;or NN (skip scf)
2816 ;-----------------------------
2817 ;---------- levels -----------
2818 ;-----------------------------
2821 .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2822 .db 0,2,63 ;start d, y, x
2823 .db 128,57 ;field width (128-255), height (57-255)
2824 .db 0,0 ;no additional lines, boxes
2831 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2835 ;-----------------------------
2836 ;---------- data -------------
2837 ;-----------------------------
2840 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2841 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2842 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2843 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000
2844 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000
2845 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000
2846 .db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000
2847 .db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100
2848 .db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2849 .db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2850 .db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100
2851 .db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100
2852 .db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100
2853 .db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100
2854 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000
2855 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000
2857 txtMenu: .db "by Shiar",0
2858 .db "Have fun!",0 ;4th menu item
2859 .db "Level ",$CF,"??",5,0 ;3rd
2860 .db "Worms ",$CF,"?",5,0 ;2nd
2861 txtGame: .db "Singleplayer",0 ;0 (1st)
2862 txtGame2: .db "Peaworm ",0 ;1 (next 1st)
2863 .db "Deathmatch",0 ;2
2864 .db "Foodmatch ",0 ;3
2865 .db "LinkMatch",0 ;4
2868 .db "Domination",0 ;7
2869 txtLevsel: .db $CF," Select levels: ",5,0
2870 txtName: .db "Enter name player ",0
2871 txtWaiting: .db "Waiting...",0
2872 txtReceive: .db "Receiving..." ;,0
2875 .db 0, 3, 6, 9, 12, 15, 18, 21
2876 .db 24, 27, 30, 33, 36, 39, 42, 45
2877 .db 48, 51, 54, 57, 59, 62, 65, 67
2878 .db 70, 73, 75, 78, 80, 82, 85, 87
2879 .db 89, 91, 94, 96, 98,100,102,103
2880 .db 105,107,108,110,112,113,114,116
2881 .db 117,118,119,120,121,122,123,123
2882 .db 124,125,125,126,126,126,126,126
2885 txtLevel: .db "Level ",0
2886 txtWorms: .db "Worms: 0",0 ;follows txtLevel
2887 txtDied: .db "Died ",0
2888 txtScore: .db "Score",0 ;follows txtDied
2889 txtLeft: .db " left",0 ;follows txtScore
2890 txthiscore:.db "HiScore:",0
2891 txtReady: .db "Prepare!",0
2893 txtGO: .db "----- GAME OVER -----",0
2897 _datalink = %00000001 ;linkplay
2898 _datalivel = %00000010 ;lives=0 limit
2899 _datafoodl = %00000100 ;left=0 limit
2900 _datanextl = %00001000 ;next level if left=0
2901 _datasingl = %00001000 ;singleplayer=1
2902 _datafood = %00010000 ;food present
2903 _________ = %00100000 ;
2904 _datadie = %01000000 ;worm dies on impact
2905 _datascore = %10000000 ;score>=100 limit
2906 _datamultpeas = %00100000
2909 datasingle: .db %01011110
2911 datapeas: .db %01011010
2913 datadeathm: .db %01000010
2915 datafoodm: .db %11010000
2917 datalinkm: .db %01000011
2919 datarace: .db %10000000
2921 datactf: .db %11100000
2923 datadomin: .db %01000000 ;==(8 modes)
2925 datalevels: .dw LevelDef, LevelDef
2926 .dw LevelDefM,LevelDefM
2927 .dw LevelDefM,LevelDefM
2928 .dw LevelDefM,LevelDefM
2929 nrlevels: .db 2,2,2,2,2,2,2,2
2931 worm1set: .dw worm1p,worm1p
2932 .db %11110111,3,%00,%01111110,%10,%100 ;< >
2933 worm1name: .db "worm #01",0
2934 worm2set: .dw worm2p,worm2p
2935 .db %11111011,3,%11,%00111111,%10000,%1000 ;f1 f2
2936 worm2name: .db "worm #02",0
2937 worm3set: .dw worm3p,worm3p
2938 .db %11111011,3,0,%01011111,%10,%100 ;sto ,
2939 worm3name: .db "worm #03",0
2940 worm4set: .dw worm4p,worm4p
2941 .db %11111011,3,0,%01111101,%10,%1 ;enter +
2942 worm4name: .db "worm #04",0
2948 peasprite: .db %01100000
2962 head = 12 ;4B (head=tail)
2963 tail = 14 ;also@next level
2979 ;-----------------------------
2980 ;----------- end -------------
2981 ;-----------------------------