X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/47e88f6ce5c59c64ca65c9f0114f88905e987780..05b2b45114015912ccf5db24096b386eace99029:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index e76ab01..a2c919b 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -40,7 +40,8 @@ ;----------------------------- #define buffer ;use display buffer (otherwise write directly to screen) -#define readymask ;"grays" out the field before starting a level +#define readymask ;"greys" out the field before starting a level +;#define hlines ;horizontal-line routine for more speed drawing boxes ;#define readytext ;displays "prepare" before level starts ;#define invincible ;worms cannot die =) @@ -81,6 +82,7 @@ _load_ram_ahl = $462F ;ahl->page+hl _writeb_inc_ahl = $5567 ;ld (ahl),c _jforce = $409C ;TI-OS stack restored _EXLP = $4493 ;swap (hl),(de) b times +_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl ;----------------------------- ;------- data storage ------- @@ -134,7 +136,7 @@ start: .dw WormIcon WormTxt: - .db "WORMY by SHIAR -- alpha 93%",0 + .db "WORMY by SHIAR -- beta 93%",0 WormIcon: .db 9,2 .db %10010110,%01101111 @@ -187,7 +189,7 @@ Start: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start - ld bc,templevels + ld ix,templevels searchloop: ld de,(_PTEMP_END+1) ;VAT end or a ;nc @@ -199,20 +201,17 @@ searchloop: cp $0C ;string jr z,stringfound searchnext: - cal _RAM_PAGE_7 pop hl dec hl ;5x dec hl dec hl dec hl dec hl - psh bc ld b,(hl) ;name size inc b skipname: dec hl dnz skipname - pop bc jr searchloop stringfound: @@ -225,23 +224,23 @@ stringfound: ex de,hl ;ld ahl,(hl) cal _AHL_PLUS_2_PG3 ;string id cal _Get_Word_ahl ;ld de,(ahl) - cal _RAM_PAGE_1 - ld (bc),a + ld (ix),a ld a,levelhead cp e - jr nz,searchnext ;not worm + jr nz,_searchnext ;not worm ld a,levelhead2 cp d - jr nz,searchnext - - inc bc - ld a,h - ld (bc),a - inc bc - ld a,l - ld (bc),a - inc bc - jr searchnext + jr nz,_searchnext + inc ix ;save level's ahl + ld a,h + ld (ix),a + inc ix + ld a,l + ld (ix),a + inc ix +_searchnext: + cal _RAM_PAGE_7 + jr searchnext loadgametype: psh de @@ -266,70 +265,115 @@ defaultlevels: ret searchcomplete: - cal _RAM_PAGE_1 ld a,255 - ld (bc),a ;end mark + ld (ix),a ;end mark + + cal _clrWindow ld hl,templevels-3 -dispnextlevel: - cal _RAM_PAGE_1 psh hl - cal _clrWindow - ld a,2 - ld (_curRow),a + ld hl,$0020 + ld (_penCol),hl ld hl,txtLevsel - cal _puts ;"< Select levels: >" - ld hl,$0004 - ld (_curRow),hl + cal _vputs ;"< Select levels: >" + ld hl,$0601 ;x=1 + ld (_penCol),hl pop hl +dispnextlevel: ld a,(hl) - cp 255 ;&& - jr nz,displevel - ld hl,templevels-3 - ld a,(hl) + inc a ;cp 255 + jr z,_levselect + ld a,(hl) ;ade=(hl) displevel: inc hl ld d,(hl) inc hl ld e,(hl) - inc hl ;ade=(hl) - psh hl ;HL - ld c,a - ld h,d - ld l,e ;cde=ahl=(hl) + inc hl + psh hl + ex de,hl ;ahl=ade=(hl) cal _load_ram_ahl ;hl=ahl ld b,(hl) ;b=title size - psh bc - cal _putps ;destr=abchl - pop bc ;cde=hl - pop hl ;HL + cal _vputs + ld hl,_penCol + ld (hl),$01 ;x=1 + inc hl + ld a,(hl) + add a,6 + ld (hl),a ;y+6 + ld hl,availevels + inc (hl) + pop hl + jr dispnextlevel + +levup: + cal menupos + dec b ;up + ld a,b + cp -4 + jr nz,levselected + inc b ;undo + jr levselected +levdown: + cal menupos + inc b ;down + ld a,b + cp -3 +availevels =$-1 + jr nz,levselected + dec b ;back up +levselected: + jp menupos + +_levselect: + ld b,-3 ;level selected + cal menupos levselect: - halt - psh hl - psh de + halt \ halt psh bc cal GET_KEY - pop bc - pop de - pop hl - cp K_RIGHT - jr z,dispnextlevel - sub K_SECOND + pop bc ;GET_KEY destr. b + cp K_UP + cal z,levup + dec a ;K_DOWN + cal z,levdown + cp K_SECOND-1 jr z,loadlevel - dec a ;K_EXIT + cp K_EXIT-1 ret z - cp K_ENTER-K_EXIT+256 + cp K_ENTER-1 jr nz,levselect +; jr z,loadlevel loadlevel: - ld a,c + ld a,b + add a,3 ;sellev+3 (#0==-3) + ld e,a + add a,a ;*2 + add a,e ;*3 + ld e,a + ld d,0 ;de=sellev*3 + ld hl,templevels-3 + add hl,de + ld a,(hl) ;ade=(hl) or a ;levelfile on page 0 (=internal) jr z,levelloaded - ex de,hl ;ahl=cde - inc b ;b=titlesize+1 + inc hl + ld d,(hl) + inc hl + ld e,(hl) + ex de,hl ;ahl=ade skiptitle: - cal _INC_PTR_AHL - dnz skiptitle + ld b,a ;psh ahl + psh hl + cal _GETB_AHL ;ld a,(ahl) + pop hl + or a + ld a,b ;pop ahl + psh af + cal _INC_PTR_AHL ;ahl++ + pop af ;cp 0 + jr nz,skiptitle ;goto #0-terminator cal _Get_Word_ahl ld (leveldataSize),de @@ -366,6 +410,16 @@ levelloaded: ld a,r ld (Seed),a + ld hl,datasingle+3 + ld b,8 +setdeflevels: + ld (hl),1 ;def=level#1 + inc hl + inc hl + inc hl + inc hl + dnz setdeflevels + ;----------------------------- ;----- build trig tables ----- ;----------------------------- @@ -417,7 +471,7 @@ dispmenuloop: dnz dispmenuloop ld b,0 ;b=menu# - jr setgame ;> dispmenusets > mainMenu + jr _dispmenusets ;mainMenu ;--- menu loop --- @@ -467,7 +521,7 @@ changecurworm: inc a changedcurworm: ld (curworm),a - jp dispmenusets ;mainMenu + jr _dispmenusets ;mainMenu selleft: ld a,b @@ -499,6 +553,7 @@ changenrworms: jr nc,mainMenu ;may not be >4 changednrworms: ld (hl),a +_dispmenusets: jr dispmenusets ;mainMenu bchangenrworms: ;hl=nrworms @@ -515,9 +570,6 @@ Gametype =$-1 changedgame: and 7 ;mod 8 ld (Gametype),a -setgame: - ld a,1 - ld (curlevel),a ;reset level# jr dispmenusets ;mainMenu bchangegame: ld a,(Gametype) @@ -548,22 +600,24 @@ changelivesInit: jr _mainMenu ;singleplayer (no limit) changelevel: + inc hl ;hl=loadgamecar+2 + psh hl + ld a,(hl) ;(curlevel) ld hl,Gametype ld d,0 ld e,(hl) ld hl,nrlevels add hl,de - ld d,(hl) ;max level for sel.game -curlevel =$+1 - ld a,1 - cp d + cp (hl) ;max level for sel.game + pop hl jr z,_mainMenu inc a changedlevel: - ld (curlevel),a + ld (hl),a jr dispmenusets ;mainMenu bchangelevel: - ld a,(curlevel) + inc hl + ld a,(hl) ;(curlevel) dec a jr nz,changedlevel jr _mainMenu @@ -623,11 +677,6 @@ clroldsetsloop: ld (CURtxtGame),hl ;save for g/o cal _vputs ;Singleplayer - ld hl,$1E3E ;level - ld (_penCol),hl - ld a,(curlevel) - cal cshowA - cal loadgamecar psh hl ld hl,$243E @@ -647,10 +696,18 @@ limitok: ld (_penCol),hl pop hl ;cal loadgamecar inc hl + psh hl ld a,(hl) add a,'0' cal _vputmap + ld hl,$1E3E ;level + ld (_penCol),hl + pop hl ;loadgamecar; hl++ + inc hl + ld a,(hl) ;(curlevel) + cal cshowA + ld hl,$3032 ld (_penCol),hl ld a,1 @@ -889,9 +946,8 @@ loadgamecar: ;destr: acdehl ld hl,datasingle ld a,(Gametype) - ld e,a add a,a - add a,e + add a,a ld e,a ld d,0 add hl,de @@ -922,7 +978,9 @@ LetsGetThisPartyOn: ld (scorelimit),hl ;set limit cal loadgamecar ;nc - ld a,(Gametype) ;3bytes -> 2bytes + psh hl + ld a,(Gametype) ;4bytes -> 3bytes + add a,a ;3->2bytes add a,24+1 ;go to datalevels ld e,a ;=de sbc hl,de ;datalevels @@ -935,7 +993,9 @@ LetsGetThisPartyOn: scorelimitset: cal _ldHLind ;ld hl,(hl) - ld a,(curlevel) + pop de ;de=loadgamecar + inc de \ inc de + ld a,(de) ;(curlevel) ld (Level),a ld d,a ;begin level skiplevelloop: @@ -1021,6 +1081,8 @@ StartLevel: inc a ;=255? jp nz,nextlevel + ld hl,Level + dec (hl) ;curlevel-- (not beyond last lvl) psh hl cal releasekeys cal _clrWindow @@ -1114,13 +1176,21 @@ worminit: ld a,(de) inc de sub 128 + jr nc,setfieldx + xor a ;fieldx<128 +setfieldx: ld (FieldWidth),a ld a,(de) inc de + ld l,a sub 57 + jr nc,setfieldy + xor a ;fieldy<57 +setfieldy: ld (FieldHeight),a - add a,57-5 psh de ; >> levelp + ld a,l ;pop + sub 5 ld l,a ld h,0 add hl,hl @@ -1372,7 +1442,21 @@ handledworm =$-2 ret nz ;HandleWorm done ld a,(gameCar) and _datalivel - ret z + ret z ;don't end game + ld a,(Gametype) + cp gametron + jr nz,anyworm ;if not Tron, quit at any worm's death + ld a,(nrworms) + ld b,a ;# of worms + ld hl,worm1+lives-(worm2-worm1) + ld de,worm2-worm1 + xor a ;check for 0 lives +checklives: + add hl,de ;next worm + cp (hl) ;lives==0? + ret nz ;any >0: don't exit + dnz checklives +anyworm: ld a,$A7 ;exit@end of turn ld (CheckExit),a ;set exit state ret ;finish turn @@ -1469,7 +1553,7 @@ checkhilevel: ld a,(Level) cp (hl) jr c,hilevelcheckdone - ld (hl),a ;save local + ld (hl),a ;save local ld c,a ld a,0 hilvlposa =$-1 @@ -1714,6 +1798,12 @@ inlink: ;------- handle worm --------- HandleWorm: + ld a,(gameCar) + cpl + and _datalivel + add a,(ix+lives) + or a + ret z ;dead ld a,(ix+delay) dec a jp nz,respawncheck @@ -2760,7 +2850,13 @@ drawstuff: dec a ;3 = box cal z,drawbox dec a ;4 = circle - cal z,circle + cal z,drawcircle + dec a ;5 = hline +#ifdef hlines + cal z,drawhline +#else + cal z,drawline +#endif pop hl inc hl @@ -2768,6 +2864,36 @@ drawstuff: drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y +#ifdef hlines +boxloop: + cal drawhline + inc e + dnz boxloop + ret +drawhline: ;(d,e)-(h,e) + psh bc + ld b,d + ld c,e + psh hl + cal FindPixel + ld c,a ;starting mask + ld a,h + sub b + ld b,a + inc b ;1+x2-x1 +hlineloop: + ld a,(hl) + or c + ld (hl),a + rrc c ;mask >> + jr nc,hlinenext + inc hl ;next byte +hlinenext: + dnz hlineloop + pop hl + pop bc + ret +#else ld l,e boxloop: cal drawline @@ -2775,6 +2901,7 @@ boxloop: inc e dnz boxloop ret +#endif drawfatline: cal drawline @@ -2791,8 +2918,8 @@ drawfatline: ;LINE (d,e)-(h,l) ;destroyes a -drawline: - psh bc +drawline: ;(d,e)-(h,l) + psh bc ;destr: a psh hl psh de ld a,d @@ -2892,10 +3019,7 @@ line4sm: dnz LineLoopSteep jr DoneLine -;CIRCLE (d,e),h -;destroyes ? - -circle: ;de=x,y; h=z +drawcircle: ;(d,e),h ;de=x,y; h=z ld c,h ;c=yy=z ld a,h neg @@ -2969,6 +3093,10 @@ circledraw: ;destr:de ;every other link game out there. However, these are commented :) losses: .dw 0 Csend: + ld b,32 +csendwait: + nop + dnz csendwait cal Qsend jr c,Csend ret @@ -2978,7 +3106,7 @@ send: ;outputs: b=8-number of bits sent, both wires high, goes to game over on certain conditions ;destroys: af,bc,de in a,(7) - and %00000011 + and %11 jr z,killlink ;if both lines low, get out of here (game over signal) ld b,8 ;sending 8 bits sendloop: @@ -3027,7 +3155,7 @@ receiveloop: waitreceive: call linktimer in a,(7) - and %00000011 + and %11 cp 3 ;if bits 0 and 1 set, both wires are high jr z,waitreceive ;wait for one of the wires to go low rra ;check red wire status @@ -3041,7 +3169,7 @@ selected2: waitreceive2: call linktimer in a,(7) - and %00000011 + and %11 jr z,waitreceive2 ;wait for the wire we didn't lower to go high again (the other will remain low) ld a,%11000000 ;$c0 out (7),a ;raise both wires since the other calc will have given the ok sign @@ -3246,22 +3374,22 @@ LevelDefC: ;ctf wdPicture = 16 wtPicture: -.db %01001010,%00101001,%00000111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00000000,%00000000,%00000000,%01000000,%00000000 -.db %10001010,%10101000,%10001111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01111000,%00000000,%00000000,%00000000,%10100100,%01000000 -.db %10101010,%10101010,%10011100,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00011100,%00001110,%00000000,%00000000,%10101010,%10100000 -.db %01010001,%01000101,%00011000,%00011111,%00000000,%01111111,%11000000,%00111100,%00011110,%01111000,%00001100,%00011111,%00000000,%00000000,%11001001,%10100000 -.db %00000000,%00000000,%00111000,%00111111,%10000000,%11111111,%11100000,%11111110,%00111111,%11111100,%00001100,%00111011,%10000000,%00000011,%10001000,%00100000 -.db %01101010,%10010011,%00110000,%01110001,%11000001,%11000000,%01110001,%11100110,%01110011,%11001110,%00001100,%00110001,%10000000,%00000000,%10010000,%00100000 -.db %10001010,%00101010,%10110000,%01100000,%11000001,%10000000,%00111001,%10000000,%01100111,%11100110,%00001110,%01110001,%10000000,%00000000,%01100000,%01000000 -.db %11101110,%10111011,%00110000,%01100000,%11000001,%10110000,%00011011,%10000000,%11101110,%01110111,%00001110,%01110001,%10000011,%11100000,%00000011,%10000000 -.db %00101010,%10101010,%10110000,%01110001,%11000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000111,%11100001,%10001100,%00011000,%00010000,%00000000 -.db %11001010,%10101010,%10110000,%00110001,%10000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000011,%11000011,%10010000,%00000100,%00100011,%00001100 -.db %00000000,%00000000,%00111000,%00111011,%10000011,%10110000,%00011011,%00000000,%11001110,%01110011,%00000000,%00000011,%00010011,%00000100,%00100100,%10010010 -.db %00111001,%11000111,%00011000,%00011111,%00000011,%00110000,%00011011,%00000000,%11000111,%11100011,%10000000,%00000011,%00001100,%10000100,%00101000,%10010100 -.db %01100101,%00101000,%00011100,%00001110,%00000111,%00111000,%00111011,%10000000,%11000011,%11000001,%10000000,%00000111,%00000000,%01001110,%00101000,%10011000 -.db %01001101,%11001011,%00001110,%00111111,%10001110,%00011100,%01110001,%10000000,%11100000,%00000001,%11100000,%00001110,%00000000,%01010101,%00101000,%10011000 -.db %00111001,%01100111,%00000111,%11111011,%11111100,%00001111,%11100001,%11000000,%01100000,%00000000,%11111111,%11111100,%00000000,%10010101,%00100110,%00010100 -.db %00000000,%00000000,%00000011,%11100000,%11111000,%00000111,%11000000,%11000000,%01100000,%00000000,%00111111,%11111000,%11111111,%00001000,%11000001,%11100011 +.db %00000000,%00000000,%00000111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00000000,%00000000,%00000000,%00000000,%00000000 +.db %00000000,%00000000,%00001111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01111000,%00000000,%00000000,%00000110,%01111011,%00100000 +.db %00000000,%00000000,%00011100,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00011100,%00001110,%00000000,%00001001,%00010011,%01000000 +.db %00000000,%00000000,%00011000,%00011111,%00000000,%01111111,%11000000,%00111100,%00011110,%01111000,%00001100,%00011111,%00000000,%10100111,%00110000,%10000000 +.db %00000000,%00000000,%00111000,%00111111,%10000000,%11111111,%11100000,%11111110,%00111111,%11111100,%00001100,%00111011,%00000000,%10100001,%00001001,%01100000 +.db %00000000,%00000000,%00110000,%01110001,%11000001,%11000000,%01110001,%11100110,%01110011,%11001110,%00001100,%00110001,%10000000,%01001110,%01110010,%01100000 +.db %00000000,%00000000,%00110000,%01100000,%11000001,%10000000,%00111001,%10000000,%01100111,%11100110,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000 +.db %00000000,%00000000,%00110000,%01100000,%11000001,%10110000,%00011011,%10000000,%11101110,%01110111,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000 +.db %00000000,%00000000,%00110000,%01110001,%11000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000111,%11100001,%10000000,%00000000,%00000000,%00000000 +.db %00000000,%00000000,%00110000,%00110001,%10000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000011,%11000011,%10000000,%00000000,%00000000,%00000000 +.db %00000000,%00000000,%00111000,%00111011,%10000011,%10110000,%00011011,%00000000,%11001110,%01110011,%00000000,%00000011,%00110101,%01001001,%10000000,%00000000 +.db %00000000,%00000000,%00011000,%00011111,%00000011,%00110000,%00011011,%00000000,%11000111,%11100011,%10000000,%00000011,%01000101,%00010101,%01000011,%01100011 +.db %00000000,%00000000,%00011100,%00001110,%00000111,%00111000,%00111011,%10000000,%11000011,%11000001,%10000000,%00000111,%01100101,%01010101,%01000101,%01010100 +.db %00000000,%00000000,%00001110,%00111111,%10001110,%00011100,%01110001,%10000000,%11100000,%00000001,%11100000,%00001110,%00110111,%01011101,%10010101,%01100101 +.db %00000000,%00000000,%00000111,%11111011,%11111100,%00001111,%11100001,%11000000,%01100000,%00000000,%11111111,%11111100,%00010101,%01010101,%01000101,%01010101 +.db %00000000,%00000000,%00000011,%11100000,%11111000,%00000111,%11000000,%11000000,%01100000,%00000000,%00111111,%11111000,%01100101,%01010101,%01000110,%01010011 txtMenu: .db "Mode",0 ;1st menu item .db "Level",0 ;2nd @@ -3328,7 +3456,7 @@ _datascore = %10000000 ;score>=100 limit _datamultpeas = %00100000 _datasp = %01011110 -datalevels: .dw LevelDef, LevelDefT +datalevels: .dw LevelDef, LevelDefM .dw LevelDefT,LevelDefM .dw LevelDefM,LevelDefM .dw LevelDefM,LevelDefC @@ -3337,36 +3465,36 @@ nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults savestart: gamesingle = 0 -datasingle: .db %01011110,3,1 ;3 lives (