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
1016 ld hl,4+(txtposReady*256)
1026 jr z,SwapPos ;no link
1032 SwapPos: ;$18 xx -> $F6 xx
1040 ld a,(worm1+heading)
1042 ld a,(worm2+heading)
1043 ld (worm1+heading),a
1045 ld (worm2+heading),a
1053 ;-----------------------------
1054 ;----------- LOOP ------------
1055 ;-----------------------------
1074 jr nz,screeninvertloop
1090 cal nz,handlethoseneatlittleballs
1103 ;-----------------------------
1104 ;---------- keys -------------
1105 ;-----------------------------
1120 rla ;=$17 (c=EXIT-key)
1128 ld (ix+delay),respawndelay
1147 ret nz ;HandleWorm done
1151 ld a,$A7 ;exit@end of turn
1152 ld (CheckExit),a ;set exit state
1210 ld a,(hl) ;worm+died
1218 cal _ldHLind ;ld hl,(hl)
1219 cal showHL ;worm+score
1225 dnz displayWormStats
1228 or a ;singleplayer (0) only
1229 jr nz,hilevelcheckdone
1235 jr c,hilevelcheckdone
1236 ld (hl),a ;save local
1241 hilvlposhl =$-2 ;save external
1242 cal _writeb_inc_ahl ;ld (ahl),c
1247 jr z,hiscorecheckdone
1249 cal loadhiscoreposinahl
1250 cal _Get_Word_ahl ;de=old_hi
1258 jr c,NotNewHigh ;New<Old
1259 jr nz,newhigh ;New>Old
1263 jr nc,NotNewHigh ;new<old
1267 cal loadhiscoreposinahl
1268 cal _Set_Word_ahl ;de->(ahl)
1271 NotNewHigh: ;de=current hiscore
1289 ;x123456789012345678901
1290 ;1----- GAME OVER -----
1295 ;6Worm#02 @ 05 00120
1301 rst 20h ;_ABS_MOV10TOOP1
1307 cal _SET_ABS_DEST_ADDR
1311 cal _SET_ABS_SRC_ADDR
1312 ld hl,end-_asm_exec_ram
1313 cal _SET_MM_NUM_BYTES
1320 loadhiscoreposinahl:
1325 externalhiscoresavepos:
1333 dnz addlevelposition
1336 ;-----------------------------
1337 ;----------- worm ------------
1338 ;-----------------------------
1360 inkeys: ;use jp not call!
1379 ld bc,donediddelydone
1390 cal saverespawncounter
1396 jr DoesWormTailEqualsWormHead ;chk4 size=0
1407 DoesWormTailEqualsWormHead:
1409 jr nz,removewormloop
1413 jr nz,safewormsizedone
1421 ld (ix+tail),e ;head=tail/size=0
1427 jr nz,saverespawncounter
1438 ;------- handle worm ---------
1470 ;-------- move worm ----------
1498 notmoveY: ;bc=newpos
1505 pop hl ; << pos (old)
1523 ;--------- worm hit ----------
1529 cal z,checkhitotherworm
1531 and _datamultpeas ;&&bit
1535 jp z,WormDead ;no food
1553 cal DrawPea ;remove pea
1565 jp nz,still_alive_not_dead
1568 jp z,still_alive_not_dead
1571 jp nz,Exit ;stack restored
1582 cal IncScore ;score+(40*level)
1586 pop hl ; << levelp new
1607 ;-----------------------------
1626 jr nz,nextotherwormbit
1651 .db $dd,$7d ;ld a,lx
1654 jr nz,chkworm2 ; ret nz
1677 still_alive_not_dead:
1679 ;-------- draw worm ----------
1687 cal z,checkhitlapline
1732 ;-----------------------------
1733 ;---------- ball -------------
1734 ;-----------------------------
1736 handlethoseneatlittleballs:
1782 bit 1,d ;1=up; 0=down
1812 letsmovetheotherway:
1827 ;-----------------------------
1828 ;----------- procs -----------
1829 ;-----------------------------
1874 jr nz,NewPea ;pixel found
1881 ;all ok; empty space
1888 cal PutSprite ;||-ed
1891 ;----------- score -----------
1911 jr z,scorecommon ;hl/1000 not increased
1919 jr c,showstats ;<0=0
2057 ;-----------------------------
2175 ld (ShiftRightCounter),a
2177 ld (ShiftRightChunk),a
2191 ShiftRightCounter = $-1
2213 ld (ShiftLeftCounter),a
2215 ld (ShiftLeftChunk),a
2217 jr nc,ShiftLeftSameByte
2236 ShiftLeftCounter = $-1
2247 jr nz,ShiftRowsRight
2281 ;----------- draw ------------
2295 CheckPixel: ;at bc in d
2302 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2303 ;(b,c) to hl:a; "destroyes" ahl
2305 FindPixel: ;(b,c) to hl:a
2338 PutSprite: ;||@(b,c)
2339 ;by SHIAR only ix saved
2491 drawbox: ;(d,e)-(h,l)
2501 ;-----------------------------
2502 ;----------- link ------------
2503 ;-----------------------------
2619 ;-----------------------------
2620 ;---------- levels -----------
2621 ;-----------------------------
2624 .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2625 .db 0,2,63 ;start d, y, x
2626 .db 128,57 ;field width (128-255), height (57-255)
2627 .db 0,0 ;no additional lines, boxes
2634 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2638 ;-----------------------------
2639 ;---------- data -------------
2640 ;-----------------------------
2643 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2644 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2645 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2646 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000
2647 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000
2648 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000
2649 .db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000
2650 .db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100
2651 .db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2652 .db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2653 .db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100
2654 .db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100
2655 .db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100
2656 .db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100
2657 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000
2658 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000
2660 txtMenu: .db "by Shiar",0
2661 .db "Have fun!",0 ;4th menu item
2662 .db "Level 00",0 ;3rd
2663 .db "Worms: 0",0 ;2nd
2664 txtGame: .db "Singleplayer",0 ;0 (1st)
2665 txtGame2: .db "Peaworm ",0 ;1 (next 1st)
2666 .db "Deathmatch",0 ;2
2667 .db "Foodmatch ",0 ;3
2668 .db "LinkMatch",0 ;4
2671 .db "Domination",0 ;7
2672 txtLevsel: .db $CF," Select levels: ",5,0
2673 txtName: .db "Enter name player ",0
2674 txtWaiting: .db "Waiting...",0
2675 txtReceive: .db "Receiving..." ;,0
2678 .db 0, 3, 6, 9, 12, 15, 18, 21
2679 .db 24, 27, 30, 33, 36, 39, 42, 45
2680 .db 48, 51, 54, 57, 59, 62, 65, 67
2681 .db 70, 73, 75, 78, 80, 82, 85, 87
2682 .db 89, 91, 94, 96, 98,100,102,103
2683 .db 105,107,108,110,112,113,114,116
2684 .db 117,118,119,120,121,122,123,123
2685 .db 124,125,125,126,126,126,126,126
2688 txtLevel: .db "Level ",0
2689 txtWorms: .db "Worms: 0",0 ;follows txtLevel
2690 txtDied: .db "Died ",0
2691 txtScore: .db "Score",0 ;follows txtDied
2692 txtLeft: .db " left",0 ;follows txtScore
2693 txthiscore:.db "HiScore:",0
2694 txtReady: .db "Prepare!",0
2696 txtGO: .db "----- GAME OVER -----",0
2700 _datalink = %00000001 ;linkplay
2701 _datalivel = %00000010 ;lives=0 limit
2702 _datafoodl = %00000100 ;left=0 limit
2703 _datanextl = %00001000 ;next level if left=0
2704 _datasingl = %00001000 ;singleplayer=1
2705 _datafood = %00010000 ;food present
2706 _________ = %00100000 ;
2707 _datadie = %01000000 ;worm dies on impact
2708 _datascore = %10000000 ;score>=100 limit
2712 datasingle: .db %01011110
2714 datapeas: .db %01011010
2716 datadeathm: .db %01000010
2718 datafoodm: .db %11010000
2720 datalinkm: .db %01000011
2722 datarace: .db %10000000
2724 datactf: .db %01000000
2726 datadomin: .db %01000000 ;==(8 modes)
2728 datalevels: .dw LevelDef, LevelDef
2729 .dw LevelDefM,LevelDefM
2730 .dw LevelDefM,LevelDefM
2731 .dw LevelDefM,LevelDefM
2732 nrlevels: .db 2,2,2,2,2,2,2,2
2734 worm1set: .dw worm1p,worm1p
2735 .db %11110111,3,0,%01111110,%10,%100 ;< >
2736 worm1name: .db "worm #01",0
2737 worm2set: .dw worm2p,worm2p
2738 .db %11111011,3,0,%00111111,%10000,%1000 ;f1 f2
2739 worm2name: .db "worm #02",0
2740 worm3set: .dw worm3p,worm3p
2741 .db %11111011,3,0,%01011111,%10,%100 ;sto ,
2742 worm3name: .db "worm #03",0
2743 worm4set: .dw worm4p,worm4p
2744 .db %11111011,3,0,%01111101,%10,%1 ;enter +
2745 worm4name: .db "worm #04",0
2752 peasprite: .db %01100000
2766 head = 12 ;4B (head=tail)
2767 tail = 14 ;also@next level
2782 ;-----------------------------
2783 ;----------- end -------------
2784 ;-----------------------------