3 ; Release Date : june 2000
4 ; Filename : worm.86p (5kb)
6 ; Email Address : shiar0@hotmail.com
8 ; Web Page : www.shiar.org
9 ; Description : ruling Nibbles-like game 1-4 players
10 ; Where to get this game : www.shiar.org (home of Worm)
11 ; Other games by author(s) : Nemesis beta
12 ; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98)
13 ; Jonah Cohen (helped writing worm)
15 ;-----------------------------
16 ;----------- TO-DO -----------
17 ;-----------------------------
23 ; * check levels/gametype
24 ; * enough hiscore saves!
26 ; 2% * misc (pollish, bugs, &&&)
28 ; 2% * fix deaths linkplay and transmit game/level data
29 ; 2% * make linkplay available for all gametypes (not just deathmatch)
31 ; 1% * fix pea XOR problem in ctf (+dom?)
33 ; 1% * domination?: take control points by running over them and hold them
35 ;100% = bugs fixed + levels done
37 ;-----------------------------
38 ;-----------------------------
39 ;--------- W O R M ---------
40 ;-----------------------------
41 ;-----------------------------
43 #define buffer ;use display buffer (otherwise write directly to screen)
44 #define readymask ;"grays" out the field before starting a level
46 ;#define readytext ;displays "prepare" before level starts
47 ;#define invincible ;worms cannot die =)
54 #include "ti86asm.inc"
58 _divHLby10 = $4044 ;hl=hl/10
59 _divAby10 = $4DAF ;a=a/10
60 _HLTIMES10 = $41BF ;hl=hl*10
62 _clrWindow = $4A86 ;clear screen
63 _asapvar = $D6FC ;own name (worm)
64 _MOV4B = $429B ;4x ld (de),(hl)
65 _MOV5B = $4297 ;5x ld (de),(hl)
66 _mov9b = $4283 ;9x ld (de),(hl)
67 _ldHLind = $4010 ;ld hl,(hl)
68 _swapt_ = $45F3 ;ex_ahl_bde
69 _Get_Word_ahl = $521D ;ld de,(ahl)
70 _Set_Word_ahl = $5221 ;ld (ahl),de
71 _INC_PTR_AHL = $4637 ;ahl=ahl+1
72 _AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2
73 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl
74 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
75 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
76 _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
77 _mm_ldir = $52ED ;24bit ldir
78 _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
80 _PTEMP_END = $D29A ;end of VAT
81 _load_ram_ahl = $462F ;ahl->page+hl
82 _writeb_inc_ahl = $5567 ;ld (ahl),c
83 _jforce = $409C ;TI-OS stack restored
84 _EXLP = $4493 ;swap (hl),(de) b times
86 ;-----------------------------
87 ;------- data storage -------
88 ;-----------------------------
92 ScrBuffer = $8820 ;-A7FF (20*FF=1FE0)
93 worm2p = $A800 ;-ABFF (400) %10101O00
94 worm1 = $AC00 ;-AC1D (31d)
95 worm2 = $AC1F ;-AC3B (1F)
96 worm3 = $AC3E ;-AC59 (1F)
97 worm4 = $AC5D ;-AC77 (1F)
98 balls = $AC7C ;-ACFF (3x43d)
99 SinCosTable = $AD00 ;-AE00 (4x40)
100 ;free $AE01 ;-AFFF (1FF)
101 worm1p = $B000 ;-B7FF (800) %1011O000
102 worm3p = $B800 ;-BBFF (400) %10111O00
103 ;free $BF91 ;-BFFF (6F)
105 ;program $D748 ;-E7FF (106D+4A)
106 ;free $E800 ;-EFFF (800)
107 worm4p = $F000 ;-F3FF (400) %11110O00
108 leveldata = $F400 ;-FA70 (<=671)
114 namelength = $BC00 ;(1) @menu
116 DispBuffer = $BC00 ;(10x57d) @game
121 ;-----------------------------
122 ;------- program start -------
123 ;-----------------------------
137 .db "WORM by SHIAR -- alpha 92%",0
140 .db %10010110,%01101111
141 .db %10110101,%01001011
142 .db %01110011,%01001001
143 .db %00000011,%10000000
144 .db %00000001,%11100000
145 .db %00111000,%11111000
146 .db %01111110,%00111111
147 .db %11101111,%00001111
148 .db %11000011,%10000000
151 levelhead2 = 92 ;worm levels header = "92"
182 ld bc,int_end-int_handler
189 ld hl,$BFFF ;VAT start
192 ld de,(_PTEMP_END+1) ;VAT end
225 ex de,hl ;ld ahl,(hl)
226 cal _AHL_PLUS_2_PG3 ;string id
227 cal _Get_Word_ahl ;ld de,(ahl)
232 jr nz,searchnext ;not worm
250 cal _Get_Word_ahl ;ld de,(ahl++)
255 ld a,e ;set new level
280 cal _puts ;"< Select levels: >"
299 cal _load_ram_ahl ;hl=ahl
300 ld b,(hl) ;b=title size
302 cal _putps ;destr=abchl
320 cp K_ENTER-K_EXIT+256
325 or a ;levelfile on page 0 (=internal)
335 ld (leveldataSize),de
344 cal _SET_ABS_SRC_ADDR ;levelsstart
347 cal _SET_ABS_DEST_ADDR ;store in mem.
350 cal _SET_MM_NUM_BYTES
353 cal _LOAD_ABS_SRC_ADDR ;->ahl
360 ldi ;(de),(hl)\inc hl
365 res 2,(iy+13) ;appAutoScroll
369 ;-----------------------------
370 ;----- build trig tables -----
371 ;-----------------------------
396 ;-----------------------------
397 ;---------- menu -------------
398 ;-----------------------------
426 cal _puts ;Level <00>
429 cal _puts ;Limit <00>
436 cal _puts ;Singleplayer
451 jp LetsGetThisPartyOn ;1/3/4
475 ld d,(hl) ;max level for sel.game
488 jp displives ;mainMenu
531 jr dispnrworms ;mainMenu
536 jr c,_mainMenu ;type 0/1
546 ld a,(hl) ;hl=nrworms
553 jr _dispcurlevel ;mainMenu
574 cal showA ;liveslimit
592 cal loadgamecar ;c=(gameCar)
593 ;a=(hl)=(Gametype+1)=(wormbeglives)
598 pop hl ;restore stack
601 ;--- handle menukeys ---
653 cal _puts ;"Enter name player "
742 .db 0,".<>!",0,0,0,0 ;down,L,R,up
743 .db 0,"XTOJE0",0 ;enter..clear
744 .db " WSNID9",0 ;(-)..custom
745 .db "ZVRMHC8",0 ;dot..del
746 .db "YUQLGB7#" ;0..xvar
747 .db $D9,"-PKFA6'" ;on..alpha
748 .db "54321*",0,$D0 ;F5..more
752 skiplevel: ;@hl - destr:ab - alter:hl
757 ld b,(hl) ;spritesize
768 inc b ;multiplayer lvl
770 inc b ;skip other 3 worms (9 bytes)
804 ;build: c=(gameCar)=(hl-1)
805 ; a=(wormbeglives)=(hl)
821 ;-----------------------------
822 ;-------- start game ---------
823 ;-----------------------------
827 ld (CheckExit),a ;set exit state
832 cal _HLTIMES10 ;hl=10*(hl)
833 ld (scorelimit),hl ;set limit
837 sbc hl,de ;datalevels
848 dec a ;ld a,$FF ;=no_limit
852 cal _ldHLind ;ld hl,(hl)
857 dec d ;levels to skip
904 ;-----------------------------
905 ;--------- game over ---------
906 ;-----------------------------
912 ld a,4 ;4x (all worms)
928 ex de,hl ;de=wormX+head
932 jr nz,createwormsloop
934 pop hl ;begin of current level
946 ;show end msg or smtn
948 psh bc ;where to go afterwards
949 inc hl ;location of ending-code
950 jp (hl) ;go there ("call")
972 ld b,0 ;bc=sprite size
973 add hl,bc ;hl=behind sprite
980 setsprite: ;de=@sprite ;a=sprsize
1013 ld a,SinCosTable/256
1025 ld bc,(worm2-worm1)-5
1030 ;-------- draw level ---------
1116 ;-----------------------------
1118 psh hl ; >> levelp new
1153 ld hl,4+(txtposReady*256)
1164 jr z,initfinished ;no link
1167 ld (worm2+input),a ;worm 2 via link
1169 ld (Speed),a ;max.speed
1170 SwapPos: ;$18 xx -> $F6 xx
1174 ld (worm2+left),a ;1
1177 ld b,4 ;+heading +pos
1178 cal _EXLP ;swap positions
1183 cal _EXLP ;swap positions
1192 ;-----------------------------
1193 ;----------- LOOP ------------
1194 ;-----------------------------
1213 jr nz,screeninvertloop
1229 cal nz,handlethoseneatlittleballs
1242 ;-----------------------------
1243 ;---------- keys -------------
1244 ;-----------------------------
1259 rla ;=$17 (c=EXIT-key)
1270 ld (ix+delay),respawndelay
1289 ret nz ;HandleWorm done
1293 ld a,$A7 ;exit@end of turn
1294 ld (CheckExit),a ;set exit state
1330 cp (hl) ;input=0 = link
1355 ld a,(hl) ;worm+died
1363 cal _ldHLind ;ld hl,(hl)
1364 cal showHL ;worm+score
1370 dnz displayWormStats
1373 or a ;singleplayer (0) only
1374 jr nz,hilevelcheckdone
1379 jr c,hilevelcheckdone
1380 ld (hl),a ;save local
1385 hilvlposhl =$-2 ;save external
1386 cal _writeb_inc_ahl ;ld (ahl),c
1392 jr z,hiscorecheckdone
1394 cal loadhiscoreposinahl
1395 cal _Get_Word_ahl ;de=old_hi
1403 jr c,NotNewHigh ;New<Old
1404 jr nz,newhigh ;New>Old
1408 jr nc,NotNewHigh ;new<old
1412 cal loadhiscoreposinahl
1413 cal _Set_Word_ahl ;de->(ahl)
1416 NotNewHigh: ;de=current hiscore
1437 ;x123456789012345678901
1438 ;1----- GAME OVER -----
1443 ;6Worm#02 @ 05 00120
1449 rst 20h ;_ABS_MOV10TOOP1
1451 ld hl,savestart-_asm_exec_ram+4
1455 cal _SET_ABS_DEST_ADDR
1459 cal _SET_ABS_SRC_ADDR
1460 ld hl,saveend-savestart
1461 cal _SET_MM_NUM_BYTES
1470 loadhiscoreposinahl:
1475 ld a,(nrlevels+1) ;# peaworm lvls
1482 dec a ;z=(Gametype)=2
1494 hiscrposa =$-1 ;ahl=saveloc
1500 dnz addlevelposition
1503 ;-----------------------------
1504 ;----------- worm ------------
1505 ;-----------------------------
1510 cal saverespawncounter
1516 jr DoesWormTailEqualsWormHead ;chk4 size=0
1527 DoesWormTailEqualsWormHead:
1529 jr nz,removewormloop
1533 jr nz,safewormsizedone
1541 ld (ix+tail),e ;head=tail/size=0
1547 jr nz,saverespawncounter
1565 inkeys: ;use jp not call!
1616 ;------- handle worm ---------
1655 ;-------- move worm ----------
1683 notmoveY: ;bc=newpos
1690 pop hl ; << pos (old)
1708 ;--------- worm hit ----------
1714 cal z,checkhitotherworm
1716 and _datamultpeas ;&&bit
1720 jp z,WormDead ;no food
1727 cal DrawPea ;remove pea
1739 jp nz,Drawworm ;continue
1745 jp nz,Exit ;stack restored
1756 cal IncScore ;score+(40*level)
1760 pop hl ; << levelp new
1764 chkpeahit: ;hl=peapos
1793 ld hl,(peaspos) ;1st pea
1799 ld hl,(peaspos+2) ;2nd pea
1802 pop hl ;(peapos) 1st pea
1803 jp c,stopworm ;own pea hit
1805 ld a,e ;peek a (that x86 asm for pop\push ;)
1808 ld hl,(peaspos+2) ;2nd pea
1821 cal DrawPea ;restore own flag
1822 jr sillylabel ;inv both\die
1824 hitflag: ;correct pea hit
1842 ret ;Z=yes: no flag taken
1844 ;-----------------------------
1863 jr nz,nextotherwormbit
1888 .db $dd,$7d ;ld a,lx
1891 jr nz,chkworm2 ; ret nz
1916 ;-------- draw worm ----------
1925 cal z,checkhitlapline
1931 ret z ;keep tail in "Tron"
1974 ;-----------------------------
1975 ;---------- ball -------------
1976 ;-----------------------------
1978 handlethoseneatlittleballs:
2024 bit 1,d ;1=up; 0=down
2054 letsmovetheotherway:
2069 ;-----------------------------
2070 ;----------- procs -----------
2071 ;-----------------------------
2075 ld a,%10000000 ;all key-masks
2078 inc a ;cp %11111111 (no keys pressed)
2079 jr nz,releasekeys ;keep waitin
2080 cal GET_KEY ;clear buffer
2126 jr nz,NewPea ;pixel found
2133 ;all ok; empty space
2142 ;----------- score -----------
2162 jr z,scorecommon ;hl/1000 not increased
2170 jr c,showstats ;<0=0
2177 jr z,showstats ;de=$FF??=no limit
2315 ;-----------------------------
2433 ld (ShiftRightCounter),a
2435 ld (ShiftRightChunk),a
2449 ShiftRightCounter = $-1
2471 ld (ShiftLeftCounter),a
2473 ld (ShiftLeftChunk),a
2475 jr nc,ShiftLeftSameByte
2494 ShiftLeftCounter = $-1
2505 jr nz,ShiftRowsRight
2539 ;----------- draw ------------
2553 CheckPixel: ;at bc in d
2560 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2561 ;(b,c) to hl:a; "destroyes" ahl
2563 FindPixel: ;(b,c) to hl:a
2596 PutSprite: ;||@(b,c)
2597 ;by SHIAR only ix saved
2664 drawbox: ;(d,e)-(h,l)
2790 ;-----------------------------
2791 ;----------- link ------------
2792 ;-----------------------------
2820 ;---- SEND ---- 8 bits in a
2821 ;-------------- destr:bcdehl
2830 ld b,8+1 ;bits to send
2833 rr c ;bit to send (in cf)
2834 ld a,D0LD1H ;0: lower white
2836 ld a,D0HD1L ;1: lower red
2838 out (7),a ;lower one (send bit)
2841 cal checklink ;other calc must lower other whire
2844 ld a,D0HD1H ;raise one, ok to raise other
2849 cp %11 ;both raised (by other calc)
2851 dnz sendloop ;repeat for all bits
2855 ;---- RECV ---- 8 bits to a
2856 ;-------------- destr:bcdehl
2863 ld b,8 ;bits to receive
2869 ret z ;both low = error
2871 jr z,WaitRecBit ;both on = nothing sent
2873 rra ;received bit in cf
2876 jr c,savebit ;lower white as well
2878 ld d,D0HD1L ;lower red
2883 out (7),a ;lower other (both low)
2885 waitackrecv: ;same will be raised again by other calc
2891 out (7),a ;raise both
2892 dnz receiveloop ;repeat for all bits
2894 ld a,c ;a=byte received
2897 ;-----------------------------
2898 ;---------- levels -----------
2899 ;-----------------------------
2902 .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2903 .db 0,2,63 ;start d, y, x
2904 .db 128,57 ;field width (128-255), height (57-255)
2905 .db 0 ;no additional lines, boxes
2912 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2917 .db %1110000,%10001000,%10001000,%10001000,%1110000,0
2918 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2924 .db %1110000,%10001000,%10001000,%10001000,%1110000,0
2925 .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
2929 ;-----------------------------
2930 ;---------- data -------------
2931 ;-----------------------------
2934 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2935 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2936 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2937 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000
2938 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000
2939 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000
2940 .db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000
2941 .db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100
2942 .db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2943 .db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2944 .db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100
2945 .db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100
2946 .db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100
2947 .db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100
2948 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000
2949 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000
2951 txtMenu: .db "by Shiar",0
2952 .db "Level 00",0 ;4th menu item
2953 .db "Limit 00 ",0 ;3rd
2954 .db "Worms 0",0 ;2nd
2955 txtGame: .db "Singleplayer",0 ;0 (1st)
2956 txtGame2: .db "Peaworm ",0 ;1 (next 1st)
2958 .db "Deathmatch",0 ;3
2959 .db "Foodmatch ",0 ;4
2960 .db "LinkMatch",0 ;5
2963 ; .db "Domination",0 ;8
2964 txtLevsel: .db $CF," Select levels: ",5,0
2965 txtName: .db "Enter name player ",0
2966 txtWaiting: .db "Waiting...",0
2967 txtReceive: .db "Receiving..." ;,0
2970 .db 0, 3, 6, 9, 12, 15, 18, 21
2971 .db 24, 27, 30, 33, 36, 39, 42, 45
2972 .db 48, 51, 54, 57, 59, 62, 65, 67
2973 .db 70, 73, 75, 78, 80, 82, 85, 87
2974 .db 89, 91, 94, 96, 98,100,102,103
2975 .db 105,107,108,110,112,113,114,116
2976 .db 117,118,119,120,121,122,123,123
2977 .db 124,125,125,126,126,126,126,126
2980 txtLevel: .db "Level ",0
2981 txtWorms: .db "Worms: 0",0 ;follows txtLevel
2982 txtDied: .db "Died ",0
2983 txtScore: .db "Score",0 ;follows txtDied
2984 txtLeft: .db " left",0 ;follows txtScore
2985 txthiscore:.db "HiScore:",0
2986 txtReady: .db "Prepare!",0
2988 txtGO: .db "----- GAME OVER -----",0
2990 _datalink = %00000001 ;linkplay
2991 _datalivel = %00000010 ;lives=0 limit
2992 _datafoodl = %00000100 ;left=0 limit
2993 _datanextl = %00001000 ;next level if left=0
2994 _datasingl = %00001000 ;singleplayer=1
2995 ;1=hiscore+keep_length
2996 _datafood = %00010000 ;food present
2997 _datadie = %01000000 ;worm dies on impact
2998 _datascore = %10000000 ;score>=100 limit
2999 _datamultpeas = %00100000
3002 datalevels: .dw LevelDef, LevelDefM
3003 .dw LevelDefT,LevelDefM
3004 .dw LevelDefM,LevelDefM
3005 .dw LevelDefM,LevelDefM
3006 nrlevels: .db 1,2,2,2,2,2,2,1 ;=defaults
3011 datasingle: .db %01011110,3 ;3 lives (<must b unique)
3013 datapeas: .db %01011010,1 ;1 "
3015 datatron: .db %01000010,1
3017 datadeathm: .db %01000010,3
3019 datafoodm: .db %11010000,10 ;10 score limit (=100)
3021 datalinkm: .db %01000011,3
3023 datarace: .db %10000000,10
3025 datactf: .db %11100000,9
3027 ;datadomin: .db %01100000,3 ;==(8 modes)
3029 worm1set: .dw worm1p,worm1p
3030 .db %11110111,%00,%01111110,%10,%100 ;< >
3031 worm1name: .db "worm #01",0
3032 worm2set: .dw worm2p,worm2p
3033 .db %11111011,%11,%00111111,%10000,%1000 ;f1 f2
3034 worm2name: .db "worm #02",0
3035 worm3set: .dw worm3p,worm3p
3036 .db %11111011,0,%01011111,%10,%100 ;sto ,
3037 worm3name: .db "worm #03",0
3038 worm4set: .dw worm4p,worm4p
3039 .db %11111011,0,%01111101,%10,%1 ;enter +
3040 worm4name: .db "worm #04",0
3057 head = 13 ;4B (head=tail)
3058 tail = 15 ;also@next level
3073 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3074 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3075 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3076 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3077 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3078 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3079 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3080 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3081 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3082 .db " shiar0@hotmail.com",0
3085 defspriteimg: .db %01100000
3091 .db 15,"Internal Levels"
3093 .db 0,deflevels/256,deflevels&255
3096 ;-----------------------------
3097 ;----------- end -------------
3098 ;-----------------------------