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 ;-----------------------------
22 ; 2% * make linkplay available for all gametypes (not just deathmatch)
24 ; 1% * ctf: take enemy flag (right-bottom) and return to your flag (left-top)
25 ; 1% * domination?: take control points by running over them and hold them
26 ; * complete readme (+custom level info)
27 ; 2% * ... (pollish, &&&)
31 ;100% = bugs fixed + levels done
33 ;-----------------------------
34 ;-----------------------------
35 ;--------- W O R M ---------
36 ;-----------------------------
37 ;-----------------------------
39 #define buffer ;use display buffer (otherwise write directly to screen)
46 #include "ti86asm.inc"
50 _divHLby10 = $4044 ;hl=hl/10
51 _divAby10 = $4DAF ;a=a/10
52 _HLTIMES10 = $41BF ;hl=hl*10
54 _clrWindow = $4A86 ;clear screen
55 _asapvar = $D6FC ;own name (worm)
56 _MOV4B = $429B ;4x ld (de),(hl)
57 _MOV5B = $4297 ;5x ld (de),(hl)
58 _mov9b = $4283 ;9x ld (de),(hl)
59 _ldHLind = $4010 ;ld hl,(hl)
60 _swapt_ = $45F3 ;ex_ahl_bde
61 _Get_Word_ahl = $521D ;ld de,(ahl)
62 _Set_Word_ahl = $5221 ;ld (ahl),de
63 _INC_PTR_AHL = $4637 ;ahl=ahl+1
64 _AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2
65 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl
66 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
67 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
68 _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
69 _mm_ldir = $52ED ;24bit ldir
70 _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
72 _PTEMP_END = $D29A ;end of VAT
73 _load_ram_ahl = $462F ;ahl->page+hl
74 _writeb_inc_ahl = $5567 ;ld (ahl),c
76 ;-----------------------------
77 ;------- data storage -------
78 ;-----------------------------
82 ScrBuffer = $8820 ;-A7FF (20*FF=1FE0)
83 worm2p = $A800 ;-ABFF (400) %10101O00
84 worm1 = $AC00 ;-AC1D (31d)
85 worm2 = $AC1F ;-AC3B (1F)
86 worm3 = $AC3E ;-AC59 (1F)
87 worm4 = $AC5D ;-AC77 (1F)
88 balls = $AC7C ;-ACFF (3x43d)
89 SinCosTable = $AD00 ;-AE00 (4x40)
90 ;free $AE01 ;-AFFF (1FF)
91 worm1p = $B000 ;-B7FF (800) %1011O000
92 worm3p = $B800 ;-BBFF (400) %10111O00
93 ;free $BF91 ;-BFFF (6F)
95 ;program $D748 ;-E7FF (106D+4A)
96 ;free $E800 ;-EFFF (800)
97 worm4p = $F000 ;-F3FF (400) %11110O00
98 leveldata = $F400 ;-FA70 (<=671)
104 templevels = $BC00 ;(3*strings) @init
105 namelength = $BC00 ;(1) @menu
107 DispBuffer = $BC00 ;(10x57d) @game
112 ;-----------------------------
113 ;------- program start -------
114 ;-----------------------------
128 .db "WORM by SHIAR -- pre-beta 90%",0
131 .db %10010110,%01101111
132 .db %10110101,%01001011
133 .db %01110011,%01001001
134 .db %00000011,%10000000
135 .db %00000001,%11100000
136 .db %00111000,%11111000
137 .db %01111110,%00111111
138 .db %11101111,%00001111
139 .db %11000011,%10000000
142 levelhead2 = 90 ;worm levels header = "90"
150 ld hl,$BFFF ;VAT start
153 ld de,(_PTEMP_END+1) ;VAT end
186 ex de,hl ;ld ahl,(hl)
187 cal _AHL_PLUS_2_PG3 ;string id
188 cal _Get_Word_ahl ;ld de,(ahl)
193 jr nz,searchnext ;not worm
211 cal _Get_Word_ahl ;ld de,(ahl++)
216 ld a,e ;set new level
238 jp z,_clrWindow ;no ext files: exit
246 cal _puts ;"< Select levels: >"
265 cal _load_ram_ahl ;hl=ahl
266 ld b,(hl) ;b=title size
268 cal _putps ;destr=abchl
286 cp K_ENTER-K_EXIT+256
298 ld (leveldataSize),de
307 cal _SET_ABS_SRC_ADDR
310 cal _SET_ABS_DEST_ADDR
314 cal _SET_MM_NUM_BYTES
317 cal _LOAD_ABS_SRC_ADDR ;->ahl
323 res 2,(iy+13) ;appAutoScroll
327 ;-----------------------------
328 ;----- build trig tables -----
329 ;-----------------------------
354 ;-----------------------------
355 ;---------- menu -------------
356 ;-----------------------------
391 cal _puts ;Singleplayer
403 jp LetsGetThisPartyOn ;1/3/4
415 jp nz,LetsGetThisPartyOn
423 ld d,(hl) ;max level for sel.game
464 jr dispnrworms ;jr mainMenu
469 jr c,mainMenu ;type 0/1
483 jr dispcurlevel ;mainMenu
532 cal _puts ;"Enter name player "
618 jr nz,waitnokeypressed
622 .db 0,".<>!",0,0,0,0 ;down,L,R,up
623 .db 0,"xtoje0",0 ;enter..clear
624 .db " wsnid9",0 ;(-)..custom
625 .db "zvrmhc8",0 ;dot..del
626 .db "yuqlgb7#" ;0..xvar
627 .db 0,"-pkfa6'" ;on..alpha
628 .db "54321*",0,0 ;F5..more
632 skiplevel: ;@hl - destr:ab - alter:hl
637 ld b,(hl) ;spritesize
648 inc b ;multiplayer lvl
650 inc b ;skip other 3 worms (9 bytes)
661 ld a,(hl) ;lines/boxes
671 ;-----------------------------
672 ;-------- start game ---------
673 ;-----------------------------
677 ld (CheckExit),a ;set exit state
699 ld de,$FF64 ;virt.infinate
705 cal _ldHLind ;ld hl,(hl)
710 dec d ;levels to skip
750 ;-----------------------------
751 ;--------- game over ---------
752 ;-----------------------------
763 ld (worm1+score+1),hl
764 ;+score2=0 \ +delay=1
765 ld (worm2+score+1),hl
766 ld (worm3+score+1),hl
767 ld (worm4+score+1),hl
770 ld a,4 ;4x (all worms)
777 ex de,hl ;de=wormX+head
779 jr nz,createwormsloop
786 pop hl ;begin of current level
801 ;show end msg or smtn
803 psh bc ;where to go afterwards
804 inc hl ;location of ending-code
805 jp (hl) ;go there ("call")
827 ld b,0 ;bc=sprite size
828 add hl,bc ;hl=behind sprite
876 ld bc,(worm2-worm1)-5
881 ;-------- draw level ---------
1000 ;-----------------------------
1002 psh hl ; >> levelp new
1026 ld hl,4+(txtposReady*256)
1036 jr z,SwapPos ;no link
1042 SwapPos: ;$18 xx -> $F6 xx
1050 ld a,(worm1+heading)
1052 ld a,(worm2+heading)
1053 ld (worm1+heading),a
1055 ld (worm2+heading),a
1063 ;-----------------------------
1064 ;----------- LOOP ------------
1065 ;-----------------------------
1084 jr nz,screeninvertloop
1100 cal nz,handlethoseneatlittleballs
1113 ;-----------------------------
1114 ;---------- keys -------------
1115 ;-----------------------------
1130 rla ;=$17 (c=EXIT-key)
1138 ld (ix+delay),respawndelay
1157 ret nz ;HandleWorm done
1161 ld a,$A7 ;exit@end of turn
1162 ld (CheckExit),a ;set exit state
1220 ld a,(hl) ;worm+died
1228 cal _ldHLind ;ld hl,(hl)
1229 cal showHL ;worm+score
1235 dnz displayWormStats
1238 or a ;singleplayer (0) only
1239 jr nz,hilevelcheckdone
1245 jr c,hilevelcheckdone
1246 ld (hl),a ;save local
1251 hilvlposhl =$-2 ;save external
1252 cal _writeb_inc_ahl ;ld (ahl),c
1257 jr z,hiscorecheckdone
1259 cal loadhiscoreposinahl
1260 cal _Get_Word_ahl ;de=old_hi
1268 jr c,NotNewHigh ;New<Old
1269 jr nz,newhigh ;New>Old
1273 jr nc,NotNewHigh ;new<old
1277 cal loadhiscoreposinahl
1278 cal _Set_Word_ahl ;de->(ahl)
1281 NotNewHigh: ;de=current hiscore
1299 ;x123456789012345678901
1300 ;1----- GAME OVER -----
1305 ;6Worm#02 @ 05 00120
1311 rst 20h ;_ABS_MOV10TOOP1
1317 cal _SET_ABS_DEST_ADDR
1321 cal _SET_ABS_SRC_ADDR
1322 ld hl,end-_asm_exec_ram
1323 cal _SET_MM_NUM_BYTES
1330 loadhiscoreposinahl:
1335 externalhiscoresavepos:
1343 dnz addlevelposition
1346 ;-----------------------------
1347 ;----------- worm ------------
1348 ;-----------------------------
1370 inkeys: ;use jp not call!
1389 ld bc,donediddelydone
1400 cal saverespawncounter
1406 jr DoesWormTailEqualsWormHead ;chk4 size=0
1417 DoesWormTailEqualsWormHead:
1419 jr nz,removewormloop
1423 jr nz,safewormsizedone
1431 ld (ix+tail),e ;head=tail/size=0
1437 jr nz,saverespawncounter
1448 ;------- handle worm ---------
1480 ;-------- move worm ----------
1508 notmoveY: ;bc=newpos
1515 pop hl ; << pos (old)
1533 ;--------- worm hit ----------
1539 cal z,checkhitotherworm
1541 and _datamultpeas ;&&bit
1545 jp z,WormDead ;no food
1552 cal DrawPea ;remove pea
1564 jp nz,Drawworm ;continue
1570 jp nz,Exit ;stack restored
1581 cal IncScore ;score+(40*level)
1585 pop hl ; << levelp new
1588 chkpeahit: ;hl=peapos
1640 ;-----------------------------
1659 jr nz,nextotherwormbit
1684 .db $dd,$7d ;ld a,lx
1687 jr nz,chkworm2 ; ret nz
1711 ;-------- draw worm ----------
1719 cal z,checkhitlapline
1764 ;-----------------------------
1765 ;---------- ball -------------
1766 ;-----------------------------
1768 handlethoseneatlittleballs:
1814 bit 1,d ;1=up; 0=down
1844 letsmovetheotherway:
1859 ;-----------------------------
1860 ;----------- procs -----------
1861 ;-----------------------------
1906 jr nz,NewPea ;pixel found
1913 ;all ok; empty space
1922 ;----------- score -----------
1942 jr z,scorecommon ;hl/1000 not increased
1950 jr c,showstats ;<0=0
2088 ;-----------------------------
2206 ld (ShiftRightCounter),a
2208 ld (ShiftRightChunk),a
2222 ShiftRightCounter = $-1
2244 ld (ShiftLeftCounter),a
2246 ld (ShiftLeftChunk),a
2248 jr nc,ShiftLeftSameByte
2267 ShiftLeftCounter = $-1
2278 jr nz,ShiftRowsRight
2312 ;----------- draw ------------
2326 CheckPixel: ;at bc in d
2333 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2334 ;(b,c) to hl:a; "destroyes" ahl
2336 FindPixel: ;(b,c) to hl:a
2369 PutSprite: ;||@(b,c)
2370 ;by SHIAR only ix saved
2522 drawbox: ;(d,e)-(h,l)
2532 ;-----------------------------
2533 ;----------- link ------------
2534 ;-----------------------------
2650 ;-----------------------------
2651 ;---------- levels -----------
2652 ;-----------------------------
2655 .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2656 .db 0,2,63 ;start d, y, x
2657 .db 128,57 ;field width (128-255), height (57-255)
2658 .db 0,0 ;no additional lines, boxes
2665 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2669 ;-----------------------------
2670 ;---------- data -------------
2671 ;-----------------------------
2674 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2675 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2676 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2677 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000
2678 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000
2679 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000
2680 .db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000
2681 .db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100
2682 .db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2683 .db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2684 .db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100
2685 .db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100
2686 .db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100
2687 .db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100
2688 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000
2689 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000
2691 txtMenu: .db "by Shiar",0
2692 .db "Have fun!",0 ;4th menu item
2693 .db "Level 00",0 ;3rd
2694 .db "Worms: 0",0 ;2nd
2695 txtGame: .db "Singleplayer",0 ;0 (1st)
2696 txtGame2: .db "Peaworm ",0 ;1 (next 1st)
2697 .db "Deathmatch",0 ;2
2698 .db "Foodmatch ",0 ;3
2699 .db "LinkMatch",0 ;4
2702 .db "Domination",0 ;7
2703 txtLevsel: .db $CF," Select levels: ",5,0
2704 txtName: .db "Enter name player ",0
2705 txtWaiting: .db "Waiting...",0
2706 txtReceive: .db "Receiving..." ;,0
2709 .db 0, 3, 6, 9, 12, 15, 18, 21
2710 .db 24, 27, 30, 33, 36, 39, 42, 45
2711 .db 48, 51, 54, 57, 59, 62, 65, 67
2712 .db 70, 73, 75, 78, 80, 82, 85, 87
2713 .db 89, 91, 94, 96, 98,100,102,103
2714 .db 105,107,108,110,112,113,114,116
2715 .db 117,118,119,120,121,122,123,123
2716 .db 124,125,125,126,126,126,126,126
2719 txtLevel: .db "Level ",0
2720 txtWorms: .db "Worms: 0",0 ;follows txtLevel
2721 txtDied: .db "Died ",0
2722 txtScore: .db "Score",0 ;follows txtDied
2723 txtLeft: .db " left",0 ;follows txtScore
2724 txthiscore:.db "HiScore:",0
2725 txtReady: .db "Prepare!",0
2727 txtGO: .db "----- GAME OVER -----",0
2731 _datalink = %00000001 ;linkplay
2732 _datalivel = %00000010 ;lives=0 limit
2733 _datafoodl = %00000100 ;left=0 limit
2734 _datanextl = %00001000 ;next level if left=0
2735 _datasingl = %00001000 ;singleplayer=1
2736 _datafood = %00010000 ;food present
2737 _________ = %00100000 ;
2738 _datadie = %01000000 ;worm dies on impact
2739 _datascore = %10000000 ;score>=100 limit
2740 _datamultpeas = %00100000
2743 datasingle: .db %01011110
2745 datapeas: .db %01011010
2747 datadeathm: .db %01000010
2749 datafoodm: .db %11010000
2751 datalinkm: .db %01000011
2753 datarace: .db %10000000
2755 datactf: .db %11100000
2757 datadomin: .db %01000000 ;==(8 modes)
2759 datalevels: .dw LevelDef, LevelDef
2760 .dw LevelDefM,LevelDefM
2761 .dw LevelDefM,LevelDefM
2762 .dw LevelDefM,LevelDefM
2763 nrlevels: .db 2,2,2,2,2,2,2,2
2765 worm1set: .dw worm1p,worm1p
2766 .db %11110111,3,%00,%01111110,%10,%100 ;< >
2767 worm1name: .db "worm #01",0
2768 worm2set: .dw worm2p,worm2p
2769 .db %11111011,3,%11,%00111111,%10000,%1000 ;f1 f2
2770 worm2name: .db "worm #02",0
2771 worm3set: .dw worm3p,worm3p
2772 .db %11111011,3,0,%01011111,%10,%100 ;sto ,
2773 worm3name: .db "worm #03",0
2774 worm4set: .dw worm4p,worm4p
2775 .db %11111011,3,0,%01111101,%10,%1 ;enter +
2776 worm4name: .db "worm #04",0
2783 peasprite: .db %01100000
2797 head = 12 ;4B (head=tail)
2798 tail = 14 ;also@next level
2813 ;-----------------------------
2814 ;----------- end -------------
2815 ;-----------------------------