X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/fb53f987bcd8b3a1abf600eee973cb673552d1c3..c6abf522cd97c69c3426beb92769ce358063148f:/worm.z80 diff --git a/worm.z80 b/worm.z80 index d8f61e0..d50545f 100644 --- a/worm.z80 +++ b/worm.z80 @@ -31,7 +31,24 @@ ;1) Working on a new pickup-system allowing more than one "food" and different pickup-handling -#include "TI86.inc" +#include "asm86.h" +#include "ti86asm.inc" +#include "ti86abs.inc" + +_SHRACC = $4383 +_SHLACC = $438B +_divHLby10 = $4044 +_divAby10 = $4DAF +_cphlde = $403C +_clrWindow = $4A86 +_asapvar = $D6FC +_MOV4B = $429B ;4x ld (de),(hl) +_MOV5B = $4297 ;5x ld (de),(hl) +_mov9b = $4283 ;9x ld (de),(hl) +_ldHLind = $4010 ;ld hl,(hl) +_swapt_ = $45F3 ;ex_ahl_bde + +leveldata = $EA00 ;size<$400 ;----------------------------- ;------- program start ------- @@ -57,13 +74,50 @@ WormIcon: .db %11101111,%00001111 .db %11000011,%10000000 +levelfile: + .db 7,"wormlvl" + Start: ld (SpSave),sp - call _runIndicOff - call _flushAllMenus + call _runindicoff + call _flushallmenus call _clrLCD - res 2,(iy+13) ;appAutoScroll + ld hl,levelfile-1 + rst 20h ;_ABS_MOV10TOOP1 + rst 10h ;_FINDSYM + ret c ;not found + ex de,hl + ld a,b ;call _ex_ahl_bde + call _SET_ABS_SRC_ADDR + + xor a + ld hl,leveldata ;datalevels + call _SET_ABS_DEST_ADDR + xor a + ld hl,2 + call _SET_MM_NUM_BYTES + call _mm_ldir + + xor a + ld hl,datalevels + call _SET_ABS_DEST_ADDR + xor a + ld hl,16 + call _SET_MM_NUM_BYTES + call _mm_ldir + + xor a + ld hl,leveldata + call _SET_ABS_DEST_ADDR + xor a + ld hl,400 + call _SET_MM_NUM_BYTES + call _mm_ldir + + call _RAM_PAGE_1 + + res 2,(iy+13) ;appAutoScroll ld a,r ld (Seed),a @@ -210,7 +264,7 @@ menucall: ld b,a menukeys: halt \ halt - call _getcsc + call GET_KEY or a jr z,menukeys cp K_UP @@ -234,25 +288,31 @@ notup: ;----------------------------- LetsGetThisPartyOn: - ld hl,Gametype - ld a,(hl) - add a,a - add a,(hl) + ld hl,gamesdata + ld a,(Gametype) ld e,a ld d,0 - ld hl,gamesdata add hl,de - ld a,(hl) - push af + ld (gameCar),a + + add hl,de + ld e,8 ;=de + add hl,de + + ld d,a ;push af and _datasingl jr z,notsingle ld a,1 ld (nrworms),a + ld a,d + and _datafoodl + jr nz,notsingle + ld a,1 + ld (worm1+lives),a notsingle: - pop af - ld (gameCar),a - push af + ld a,d + push af ;&&&b? and _datascore ld de,$FF64 ;virt.infinate @@ -261,8 +321,7 @@ notsingle: setscorelimit: ld (scorelimit),de - inc hl - call _ldHLind + call _ldHLind ;ld hl,(hl) pop af push hl and _datalink @@ -270,38 +329,32 @@ setscorelimit: linkmatch: call _clrWindow - - -; in a,(7) -; and %11 -; cp %11 ld a,WormVersion -; jr nz,host call send - jr c,host - -client: - ld hl,txtReceive - call _puts - call receive - cp WormVersion - ret nz - jr multiplayer + jr c,client ;2nd host: ld hl,txtWaiting call _puts call receive cp WormVersion - ret nz + jp nz,LinkBreak call send + ld hl,SwapPos ld (hl),$f6 + jr multiplayer + +client: + ld hl,txtReceive + call _puts + call receive + cp WormVersion + jp nz,LinkBreak multiplayer: ld a,2 ld (nrworms),a - ld de,LevelsDM ;----------------------------- ;--------- game over --------- @@ -339,10 +392,9 @@ GameOver: ld de,worm4+lives call _MOV5B call _mov9b - pop de + pop hl StartLevel: - ex de,hl ld de,Left ldi ld de,Speed @@ -399,22 +451,14 @@ nohunter: ld b,4 worminit: push bc ; >> 1 - ld a,(de) - ld (hl),a ;d - inc de - inc hl + ex de,hl + ldi ;d ld a,SinCosTable/256 - ld (hl),a - inc hl - - ld a,(de) - ld (hl),a ;y - inc de - inc hl - ld a,(de) - ld (hl),a ;x + ld (de),a inc de - inc hl + ldi ;y + ldi ;x + ex de,hl xor a ld (hl),a ;y2 @@ -805,26 +849,28 @@ checkhiscore: ld de,(worm1+score) HiScore =$+1 ld hl,0 - ld a,e - cp l - jr c,NotNewHigh ld a,d cp h jr c,NotNewHigh + ld a,e + cp l + jr c,NotNewHigh ld (HiScore),de ex de,hl ;disp.new hiscore NotNewHigh: - ex de,hl + ex de,hl ;push + ld hl,$0807 + ld (_curRow),hl ld hl,txthiscore call _puts - ex de,hl + ex de,hl ;pop call showHL hiscorecheckdone: waitkey: halt halt - call _getcsc + call GET_KEY cp K_ENTER jp z,DisplayMenu ; cp K_EXIT @@ -855,7 +901,7 @@ ExitNoStats: call _SET_ABS_SRC_ADDR ld hl,end-start call _SET_MM_NUM_BYTES - call _MM_LDIR + call _mm_ldir ; xor a ; ld (_asapvar+1),a @@ -1024,7 +1070,7 @@ PeaX =$-1 inc (hl) pop hl ; << call pop hl ; << call - pop de ; << levelp new + pop hl ; << levelp new cp NUM_LEVELS jp z,Exit ld a,(gameCar) @@ -1298,21 +1344,20 @@ CheckPixel: ;at bc in d dec d ret -;CLEM's FIND_PIXEL (131 cycles; 28 bytes) -; (b,c) to hl:a; destroyes: -) +;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes) +; (b,c) to hl:a; destroyes: -) FindPixel: - ld h,ScrBuffer/$800 - ld a,c - add a,a - add a,a - ld l,a ;hl=4*y + offset/8 - ld a,b + ld h,0 + ld l,c ;hl=y + add hl,hl + add hl,hl + ld a,b ;a=x rra add hl,hl rra add hl,hl - add hl,hl ;hl=32*y + offset + add hl,hl ;hl=32*y rra ;a=x/8 or l ld l,a @@ -1326,6 +1371,11 @@ FindPixel: xor a FP_Bit =$+1 set 0,a + + push de + ld de,ScrBuffer + add hl,de + pop de ret ;----------- score ----------- @@ -1850,380 +1900,138 @@ boxloopx: ;----------------------------- ;----------- link ------------ ;----------------------------- -#ifdef 0 -TIMEOUT = $1200 -send: - push af ;ld b,a - call _getcsc - cp K_EXIT - jp z,Exit - pop af ;ld a,b - call SendByte -; jr c,send - ret - -linkfail: - jp Exit - -LinkPrep: - ex (sp),hl - push bc - push de - set 2,(iy+$12) ;cursorblink - ld b,8 - jp (hl) +TIMEOUT = $1000 receive: - call checklink - jr z,linkfail + call GET_KEY + cp K_EXIT + jp z,LinkBreak + in a,(7) + and %11 cp %11 jr z,receive -ReceiveByteCont: - call LinkPrep + call Qreceive + jr c,receive + ret + +Qreceive: + ld b,8 jr ReceiveCont -ReceiveByte: - call LinkPrep -ReceiveBits: - ld de,TIMEOUT +receiveloop: + ld de,TIMEOUT WaitRecBit: - call checklink + call CheckLink jr z,LinkFailed cp %11 jr z,WaitRecBit ReceiveCont: - sub %10 - ld a,%10 - ld d,D0lD1h - jr c,ReceiveLow - rra - ld d,D0hD1l + sub 2 + ld a,2 + ld d,D0LD1H + jr c,ReceiveLow + rra + ld d,D0HD1L ReceiveLow: - rr c - ld (AckBit),a - ld a,d - out (7),a - ld de,TIMEOUT + rr c + ld (AckBit),a + ld a,d + out (7),a + ld de,TIMEOUT WaitAckRec: - call checklink - cp 0 + call CheckLink + cp 0 AckBit =$-1 - jr nz,WaitAckRec - ld a,D0hD1h - out (7),a - ld d,4 + jr nz,WaitAckRec + ld a,D0HD1H + out (7),a + ld d,4 WaitReadyRec: - dec d - jr z,ReadyRec - in a,(7) - cp %11 - jr nz,WaitReadyRec + dec d + jr z,ReadyRec + in a,(7) + cp %11 + jr nz,WaitReadyRec ReadyRec: - djnz ReceiveBits - jr LinkSuccess + djnz receiveloop + jr LinkSuccess -SendByte: - call LinkPrep +send: + ld b,9 ld c,a - inc b jr SendAcked SendBits: rr c - -sendbit: - ld a,D0lD1h - jr nc,sendselected - ld a,D0hD1l -sendselected: + ld a,D0LD1H + jr nc,SendLow + ld a,D0HD1L +SendLow: out (7),a - ld de,TIMEOUT -waitacknowledge: - call checklink - jr nz,waitacknowledge + ld de,TIMEOUT +WaitAckSend: + call CheckLink + jr nz,WaitAckSend SendAcked: - ld a,D0hD1h + ld a,D0HD1H out (7),a - ld de,TIMEOUT -waitsendready: - call checklink + ld de,TIMEOUT +WaitReadySend: + call CheckLink cp %11 - jr nz,waitsendready - + jr nz,WaitReadySend djnz SendBits -LinkSuccess: ;nc - .db $f6 ;first byte of "or n" -LinkFailed: ;c - scf - ld a,c - res 2,(iy+$12) ;noblink - pop de - pop bc - pop hl +LinkSuccess: + ld a,c ;pop a ret -linkerror: +LinkFailed: + scf + ld a,c + ret +LinkBreak: + ld a,D0HD1H + out (7),a jp Exit -checklink: - pop hl - dec de - ld a,d - or e - jr z,LinkFailed - ld a,$BF ;key - call _readkeypad - bit 6,a - jr z,linkerror - - in a,(7) - and %11 - jp (hl) - ret +CheckLink: + pop hl + dec de + ld a,d + or e + jr z,LinkFailed -_readkeypad: + ld a,$BF out (1),a + nop \ nop in a,(1) push af ld a,%11111111 out (1),a pop af - ret -#endif - -send: -SendByte: - in a,(7) - and %11 - jr z,nolink - ld b,8 -sendloop: - ld de,$8000 - rl c - ld a,%11010100 - jr nc,sendbit - ld a,%11101000 -sendbit: - out (7),a -sendwait1: - call checklink - in a,(7) - and %11 - jr nz,sendwait1 - ld a,%11000000 - out (7),a -sendwait2: - call checklink - in a,(7) - and %11 - cp %11 - jr nz,sendwait2 - djnz sendloop - xor a - ret -timeout: - scf - ret - + bit 6,a -receive: - in a,(7) - and %11 - jr z,nolink - cp %11 - jr z,receive - ld b,8 -receiveloop: - ld de,$8000 -receivewait1: - call checklink in a,(7) and %11 - cp %11 - jr z,receivewait1 - rra - rl c - rra - ld a,%11010100 - jr nc,receivebit - ld a,%11101000 -receivebit: - out (7),a -receivewait2: - call checklink - in a,(7) - and %11 - jr z,receivewait2 - ld a,%11000000 - out (7),a - djnz receiveloop - xor a - ret + jp (hl) -checklink: - dec de - ld a,d - or e - jr z,timeout - ld a,$BF ;key - call _readkeypad - bit 6,a - jr z,timeout - ret -_readkeypad: - out (1),a - in a,(1) - push af - ld a,%11111111 - out (1),a - pop af - ret -nolink: - jp Exit ;----------------------------- ;---------- levels ----------- ;----------------------------- -LevelsDM: - .db 8,5,15,0 - .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 - .db 128,57 - .db 0,0 - -LevelsDM2: - .db 8,5,31,0 - .db $40,28,2,$C0,28,125, $00,2,63,$80,54,63 - .db 128,57 - .db 0 - .db 4 ;4 boxes - .db 4,19,16,14 ;xsize,ysize,xpos,ypos - .db 4,19,80,14 - .db 4,19,16,34 - .db 4,19,80,34 - -LevelsR: - .db 8,5,24,0 - .db $40,3,2,$40,6,2, $40,9,2,$40,12,2 - .db 128,57 - .db 0 - .db 1 - .db 8,29,32,20 - -LevelsH: - .db 8,7,17,0 -#ifdef 0 -huntersize = 31 -#endif - .db $40,28,2,$C0,28,125, $00,2,63,$80,54,63 - .db 128,57 - .db 0 - .db 4 - .db 4,19,16,14 - .db 4,19,80,14 - .db 4,19,16,34 - .db 4,19,80,34 - -NUM_LEVELS = 10 - -LevelsS: - - .db 4,5,10,1 \ .dw $20F - .db 0,2,63 - .db 128,57 - .db 2 - .db 28,14,100,41 - .db 28,41,100,14 - .db 0 +NUM_LEVELS = 1 +LevelDef: .db 5,4,15,0 ;peas,speed,begin_size,balls - .db 0,2,63 ;d,y,x - .db 128,57 ;field width, height - .db 0 ;no additional lines - .db 0 ;no boxes - - .db 8,4,15,0 - .db $40,14,2 - .db 128,57 - .db 1 - .db 28,28,100,28 ;line coords: x1,y1,x2,y2 - .db 0 + .db 0,2,63 ;start d, y, x + .db 128,57 ;field width (128-255), height (57-255) + .db 0,0 ;no additional lines, boxes - .db 9,4,15,0 - .db $40,8,2 +LevelDefM: + .db 8,0,15,0 + .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 .db 128,57 - .db 2 - .db 28,14,100,14 - .db 28,41,100,41 - .db 0 - - .db 9,3,15,0 - .db $40,8,2 - .db 128,80 - .db 2 - .db 64,14,64,66 - .db 20,40,108,40 - .db 0 - - .db 10,3,15,0 - .db 2,8,$40 - .db 128,90 - .db 3 - .db 18,20,18,70 - .db 110,20,110,70 - .db 18,45,110,45 - .db 0 - - .db 7,3,15,0 - .db 64,4,0 - .db 128,86 - .db 6 - .db 34,13,56,35 - .db 34,71,56,49 - .db 72,35,94,13 - .db 72,49,94,71 - .db 16,20,16,64 - .db 110,20,110,64 - .db 0 - - .db 9,2,15,0 - .db 4,10,$40 - .db 128,82 - .db 3 - .db 0,20,74,20 - .db 54,40,128,40 - .db 0,60,74,60 - .db 0 - - .db 12,2,15,0 - .db 64,4,0 - .db 128,90 - .db 6 - .db 20,16,54,16 - .db 74,16,110,16 - .db 20,16,20,72 - .db 110,16,110,72 - .db 20,72,54,72 - .db 74,72,110,72 - .db 0 - - .db 8,2,15,0 - .db 72,52,$c0 - .db 128,128 - .db 13 - .db 34,56,56,34 - .db 34,72,56,94 - .db 72,34,94,56 - .db 72,94,94,72 - .db 46,64,80,64 - .db 22,11,22,33 - .db 11,22,33,22 - .db 22,95,22,117 - .db 11,106,33,106 - .db 103,11,103,33 - .db 91,22,115,22 - .db 103,95,103,117 - .db 91,106,115,106 - .db 0 + .db 0,0 ;----------------------------- @@ -2271,36 +2079,29 @@ txtGO: .db "----- GAME OVER -----",0 gamesdata: _datalink = %00000001 -_datasingl = %00001000 ;singleplayer=1 _datalivel = %00000010 ;ix+lives=0 limit _datafoodl = %00000100 ;left=0 limit _datanextl = %00001000 ;next level if left=0 +_datasingl = %00001000 ;singleplayer=1 _datafood = %00010000 ;food present _datahunt = %00100000 _datalaps = %01000000 ;give lap score _datascore = %10000000 ;score>=100 limit datasingle: .db %00011110 - .dw LevelsS datapeas: .db %00011010 - .dw LevelsS datadeathm: .db %00000010 - .dw LevelsDM2 datafoodm: .db %10010000 - .dw LevelsDM datalinkm: .db %00000011 - .dw LevelsDM datahuntin: .db %10100000 - .dw LevelsH datarace: .db %11000000 - .dw LevelsR -datactf: .db %00000000 - .dw LevelsDM -datadomin: .db %00000000 - .dw LevelsDM - +datactf: .db %00000000 ;==(8 modes) +;datadomin: .db %00000000 +datalevels: .dw LevelDef, LevelDef + .dw LevelDefM,LevelDefM + .dw LevelDefM,LevelDefM + .dw LevelDefM,LevelDefM -setdata = 18 resbit = 2 ;and%11111011 worm1set: .dw $B000,$B000 ;%10110000 .db 3,0,%01111110,%10,%100 ;< > @@ -2308,16 +2109,16 @@ worm1set: .dw $B000,$B000 ;%10110000 worm2set: .dw $B800,$B800 ;%10111000 .db 3,0,%00111111,%10000,%1000 ;f1 f2 .db "Worm #2",0 -worm3set: .dw $E800,$E800 ;%11101000 ;$D748+$1000+ +worm3set: .dw $F000,$F000 ;$E800=%11101000 ;$D748+$1000+ .db 3,0,%01011111,%10,%100 ;sto , .db "Worm #3",0 -worm4set: .dw $F000,$F000 ;%11110000 +worm4set: .dw $A800,$A800 ;$F000=%11110000 .db 3,0,%01111101,%10,%1 ;enter + .db "Worm #4",0 worm1 = $B400 -worm2 = $B430 -worm3 = $B460 -worm4 = $B490 +worm2 = $B42A +worm3 = $B454 +worm4 = $B47E ;-A8 end: ;set: heading = 0 ;level* @@ -2342,11 +2143,13 @@ name = 21 ;game Level =$+1 DispBuffer =$+2 ;912 bytes -ScrBuffer = $8000 ;-$A1FF (32x256) -SinCosTable = $A200 ;-$A300 (4x64) +ScrBuffer = $8100 ;-$A2FF (32x256) mod$800=0 +SinCosTable = $B500 ;size=$100 (4x64) ;----------------------------- ;----------- end ------------- ;----------------------------- + .end + .end \ No newline at end of file