3 ; Release Date : june 2000
4 ; Filename : wormy.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 Wormy)
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 ;-----------------------------
138 .db "WORMY by SHIAR -- alpha 92%",0
141 .db %10010110,%01101111
142 .db %10110101,%01001011
143 .db %01110011,%01001001
144 .db %00000011,%10000000
145 .db %00000001,%11100000
146 .db %00111000,%11111000
147 .db %01111110,%00111111
148 .db %11101111,%00001111
149 .db %11000011,%10000000
152 levelhead2 = 92 ;wormy levels header = "92"
183 ld bc,int_end-int_handler
190 ld hl,$BFFF ;VAT start
193 ld de,(_PTEMP_END+1) ;VAT end
226 ex de,hl ;ld ahl,(hl)
227 cal _AHL_PLUS_2_PG3 ;string id
228 cal _Get_Word_ahl ;ld de,(ahl)
233 jr nz,searchnext ;not worm
251 cal _Get_Word_ahl ;ld de,(ahl++)
256 ld a,e ;set new level
281 cal _puts ;"< Select levels: >"
300 cal _load_ram_ahl ;hl=ahl
301 ld b,(hl) ;b=title size
303 cal _putps ;destr=abchl
321 cp K_ENTER-K_EXIT+256
326 or a ;levelfile on page 0 (=internal)
336 ld (leveldataSize),de
345 cal _SET_ABS_SRC_ADDR ;levelsstart
348 cal _SET_ABS_DEST_ADDR ;store in mem.
351 cal _SET_MM_NUM_BYTES
354 cal _LOAD_ABS_SRC_ADDR ;->ahl
361 ldi ;(de),(hl)\inc hl
366 res 2,(iy+13) ;appAutoScroll
370 ;-----------------------------
371 ;----- build trig tables -----
372 ;-----------------------------
397 ;-----------------------------
398 ;---------- menu -------------
399 ;-----------------------------
427 cal _puts ;Level <00>
430 cal _puts ;Limit <00>
437 cal _puts ;Singleplayer
452 jp LetsGetThisPartyOn ;1/3/4
476 ld d,(hl) ;max level for sel.game
489 jp displives ;mainMenu
532 jr dispnrworms ;mainMenu
537 jr c,_mainMenu ;type 0/1
547 ld a,(hl) ;hl=nrworms
554 jr _dispcurlevel ;mainMenu
575 cal showA ;liveslimit
593 cal loadgamecar ;c=(gameCar)
594 ;a=(hl)=(Gametype+1)=(wormbeglives)
599 pop hl ;restore stack
602 ;--- handle menukeys ---
654 cal _puts ;"Enter name player "
743 .db 0,".<>!",0,0,0,0 ;down,L,R,up
744 .db 0,"XTOJE0",0 ;enter..clear
745 .db " WSNID9",0 ;(-)..custom
746 .db "ZVRMHC8",0 ;dot..del
747 .db "YUQLGB7#" ;0..xvar
748 .db $D9,"-PKFA6'" ;on..alpha
749 .db "54321*",0,$D0 ;F5..more
753 skiplevel: ;@hl - destr:ab - alter:hl
758 ld b,(hl) ;spritesize
769 inc b ;multiplayer lvl
771 inc b ;skip other 3 worms (9 bytes)
805 ;build: c=(gameCar)=(hl-1)
806 ; a=(wormbeglives)=(hl)
822 ;-----------------------------
823 ;-------- start game ---------
824 ;-----------------------------
828 ld (CheckExit),a ;set exit state
833 cal _HLTIMES10 ;hl=10*(hl)
834 ld (scorelimit),hl ;set limit
838 sbc hl,de ;datalevels
849 dec a ;ld a,$FF ;=no_limit
853 cal _ldHLind ;ld hl,(hl)
858 dec d ;levels to skip
902 ;-----------------------------
903 ;--------- game over ---------
904 ;-----------------------------
910 ld a,4 ;4x (all worms)
926 ex de,hl ;de=wormX+head
930 jr nz,createwormsloop
932 pop hl ;begin of current level
944 ;show end msg or smtn
946 psh bc ;where to go afterwards
947 inc hl ;location of ending-code
948 jp (hl) ;go there ("call")
970 ld b,0 ;bc=sprite size
971 add hl,bc ;hl=behind sprite
978 setsprite: ;de=@sprite ;a=sprsize
1011 ld a,SinCosTable/256
1023 ld bc,(worm2-worm1)-5
1028 ;-------- draw level ---------
1114 ;-----------------------------
1116 psh hl ; >> levelp new
1151 ld hl,4+(txtposReady*256)
1162 jr z,initfinished ;no link
1165 ld (worm2+input),a ;worm 2 via link
1167 ld (Speed),a ;max.speed
1168 SwapPos: ;$18 xx -> $F6 xx
1172 ld (worm2+left),a ;1
1175 ld b,4 ;+heading +pos
1176 cal _EXLP ;swap positions
1181 cal _EXLP ;swap positions
1190 ;-----------------------------
1191 ;----------- LOOP ------------
1192 ;-----------------------------
1211 jr nz,screeninvertloop
1227 cal nz,handlethoseneatlittleballs
1240 ;-----------------------------
1241 ;---------- keys -------------
1242 ;-----------------------------
1257 rla ;=$17 (c=EXIT-key)
1268 ld (ix+delay),respawndelay
1287 ret nz ;HandleWorm done
1291 ld a,$A7 ;exit@end of turn
1292 ld (CheckExit),a ;set exit state
1328 cp (hl) ;input=0 = link
1353 ld a,(hl) ;worm+died
1361 cal _ldHLind ;ld hl,(hl)
1362 cal showHL ;worm+score
1368 dnz displayWormStats
1371 or a ;singleplayer (0) only
1372 jr nz,hilevelcheckdone
1377 jr c,hilevelcheckdone
1378 ld (hl),a ;save local
1383 hilvlposhl =$-2 ;save external
1384 cal _writeb_inc_ahl ;ld (ahl),c
1390 jr z,hiscorecheckdone
1392 cal loadhiscoreposinahl
1393 cal _Get_Word_ahl ;de=old_hi
1401 jr c,NotNewHigh ;New<Old
1402 jr nz,newhigh ;New>Old
1406 jr nc,NotNewHigh ;new<old
1410 cal loadhiscoreposinahl
1411 cal _Set_Word_ahl ;de->(ahl)
1414 NotNewHigh: ;de=current hiscore
1435 ;x123456789012345678901
1436 ;1----- GAME OVER -----
1441 ;6Worm#02 @ 05 00120
1447 rst 20h ;_ABS_MOV10TOOP1
1449 ld hl,savestart-_asm_exec_ram+4
1453 cal _SET_ABS_DEST_ADDR
1457 cal _SET_ABS_SRC_ADDR
1458 ld hl,saveend-savestart
1459 cal _SET_MM_NUM_BYTES
1468 loadhiscoreposinahl:
1473 ld a,(nrlevels+1) ;# peaworm lvls
1480 dec a ;z=(Gametype)=2
1492 hiscrposa =$-1 ;ahl=saveloc
1498 dnz addlevelposition
1501 ;-----------------------------
1502 ;----------- worm ------------
1503 ;-----------------------------
1508 cal saverespawncounter
1514 jr DoesWormTailEqualsWormHead ;chk4 size=0
1525 DoesWormTailEqualsWormHead:
1527 jr nz,removewormloop
1531 jr nz,safewormsizedone
1539 ld (ix+tail),e ;head=tail/size=0
1545 jr nz,saverespawncounter
1563 inkeys: ;use jp not call!
1610 ;------- handle worm ---------
1649 ;-------- move worm ----------
1677 notmoveY: ;bc=newpos
1684 pop hl ; << pos (old)
1702 ;--------- worm hit ----------
1708 cal z,checkhitotherworm
1710 and _datamultpeas ;&&bit
1714 jp z,WormDead ;no food
1721 cal DrawPea ;remove pea
1733 jp nz,Drawworm ;continue
1739 jp nz,Exit ;stack restored
1750 cal IncScore ;score+(40*level)
1754 pop hl ; << levelp new
1758 chkpeahit: ;hl=peapos
1787 ld hl,(peaspos) ;1st pea
1793 ld hl,(peaspos+2) ;2nd pea
1796 pop hl ;(peapos) 1st pea
1797 jp c,stopworm ;own pea hit
1799 ld a,e ;peek a (that x86 asm for pop\push ;)
1802 ld hl,(peaspos+2) ;2nd pea
1815 cal DrawPea ;restore own flag
1816 jr sillylabel ;inv both\die
1818 hitflag: ;correct pea hit
1836 ret ;Z=yes: no flag taken
1838 ;-----------------------------
1857 jr nz,nextotherwormbit
1882 .db $dd,$7d ;ld a,lx
1885 jr nz,chkworm2 ; ret nz
1910 ;-------- draw worm ----------
1919 cal z,checkhitlapline
1925 ret z ;keep tail in "Tron"
1968 ;-----------------------------
1969 ;---------- ball -------------
1970 ;-----------------------------
1972 handlethoseneatlittleballs:
2018 bit 1,d ;1=up; 0=down
2048 letsmovetheotherway:
2063 ;-----------------------------
2064 ;----------- procs -----------
2065 ;-----------------------------
2069 ld a,%10000000 ;all key-masks
2072 inc a ;cp %11111111 (no keys pressed)
2073 jr nz,releasekeys ;keep waitin
2074 cal GET_KEY ;clear buffer
2120 jr nz,NewPea ;pixel found
2127 ;all ok; empty space
2136 ;----------- score -----------
2156 jr z,scorecommon ;hl/1000 not increased
2164 jr c,showstats ;<0=0
2171 jr z,showstats ;de=$FF??=no limit
2309 ;-----------------------------
2427 ld (ShiftRightCounter),a
2429 ld (ShiftRightChunk),a
2443 ShiftRightCounter = $-1
2465 ld (ShiftLeftCounter),a
2467 ld (ShiftLeftChunk),a
2469 jr nc,ShiftLeftSameByte
2488 ShiftLeftCounter = $-1
2499 jr nz,ShiftRowsRight
2533 ;----------- draw ------------
2547 CheckPixel: ;at bc in d
2554 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2555 ;(b,c) to hl:a; "destroyes" ahl
2557 FindPixel: ;(b,c) to hl:a
2590 PutSprite: ;||@(b,c)
2591 ;by SHIAR only ix saved
2658 drawbox: ;(d,e)-(h,l)
2784 ;-----------------------------
2785 ;----------- link ------------
2786 ;-----------------------------
2816 Csend: ;--- send 8 bits in A --- destr:abcdehl ---
2822 out (7),a ;both high
2823 jr Csendloop ;CF = error
2825 Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcdehl ---
2831 ld b,8 ;bits to send
2834 rl c ;bit to send in cf
2835 ld a,D0LD1H ;0: lower white
2837 ld a,D0HD1L ;1: lower red
2839 out (7),a ;lower one (send bit)
2841 cal checklink ;other calc must lower other wire
2843 ld a,D0HD1H ;raise one, ok to raise other
2847 cp %11 ;both raised (by other calc)
2850 dnz sendloop ;repeat for all bits
2858 Crecv: ;--- receive 8 bits into A/C --- destr:abcdehl ---
2860 ret nc ;return if all went ok
2862 out (7),a ;raise both on error
2863 jr Crecv ;and try again
2865 Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abcdehl ---
2868 jp z,Exit ;both low = error, quit
2871 ret z ;both high = nothing yet, wait
2872 ld b,8 ;bits to receive
2878 jr z,recvwait ;both high = nothing sent (yet)
2879 rra ;received bit in cf
2881 jr c,received ;lower white wire as well
2882 ld a,D0HD1L ;lower red
2885 out (7),a ;both wires low
2888 jr z,recvwaitack ;same wire will be raised again by other calc
2890 out (7),a ;raise both
2892 dnz recvloop ;repeat for all bits
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 ;-----------------------------