.NOLIST #include "ti83.inc" #DEFINE ProgExecut 1 #DEFINE newDispF 8 #DEFINE progObj 5 #DEFINE direc saferam1 #DEFINE nbrPoints saferam1+2 #DEFINE currentPnt saferam1+4 #DEFINE appleX saferam1+6 #DEFINE appleY saferam1+10 #DEFINE speed saferam1+12 #DEFINE direc2 saferam1+14 #DEFINE nbrPoints2 saferam1+16 #DEFINE currentPnt2 saferam1+18 #DEFINE coordX2 saferam1+20 #DEFINE coordY2 saferam1+22 #DEFINE TwoPlayers saferam1+24 #DEFINE ifApple saferam1+26 #DEFINE nbrApples saferam1+28 .org $9327 .LIST start: ld hl,score ld de,OP1 ld bc,8 ldir call _Chkfindsym ld hl,score ld de,2 call c,CreateList call _clrlcdfull call _runIndicOff ld hl,$1524 ld (PENCOL),hl ld hl,mainMenu call _vputs ld hl,$3702 ld (PENCOL),hl ld hl,version call _vputs call _getkey MenuStart: ; MENU PRINCIPAL call _clrlcdfull call _Grbufclr ld hl,$0301 ld (currow),hl ld hl,MenuTitle call _puts call MenuOnePlayerInvers call MenuTwoPlayersInvers call MenuSpeedInvers call MenuQuitInvers ld b,1 MenuLoop: set textInverse, (iy+textflags) ld a,b cp 1 call z,MenuOnePlayerInvers cp 2 call z,MenuTwoPlayersInvers cp 3 call z,MenuSpeedInvers cp 4 call z,MenuQuitInvers res textInverse, (iy+textflags) call _getkey cp 3 jr z,MenuUp cp 4 jr z,MenuDown cp 5 jr z,traitement cp 9 jp z,_clrlcdfull jr MenuLoop ; FIN DU MENU PRINCIPAL MenuDown: ld a,b cp 4 jr z,MenuLoop call MenuOnePlayerInvers call MenuTwoPlayersInvers call MenuSpeedInvers inc b jr MenuLoop MenuUp: ld a,b cp 1 jr z,MenuLoop call MenuTwoPlayersInvers call MenuQuitInvers call MenuSpeedInvers dec b jr MenuLoop traitement: ld a,b ld bc,0 ld (TwoPlayers),bc cp 2 call z,TwoPlayersInGame cp 3 jr z,ChangeSpeed cp 4 jp z,_clrlcdfull jp PlaySnake ChangeSpeed: call _clrlcdfull ld hl,$0501 ld (currow),hl ld hl,Speed call _puts ld hl,(speed) ld de,0 call _cphlde call m,SpeedOverflow ld de,100 dec hl call _cphlde inc hl call p,SpeedOverflow ld a,100 sub l ld l,a SpeedLoop: push hl ld de,$0304 ld (currow),de call _dispHL ld de,$0604 ld hl,Percentage call _puts ld (currow),de call _getkey pop hl cp 1 jr z,SpeedPlus cp 2 jr z,SpeedLess cp 3 jr z,SpeedPlus cp 4 jr z,SpeedLess cp 9 jp z,MenuStart cp 5 jr nz,SpeedLoop ld a,100 sub l ld l,a ld (speed),hl jp MenuStart SpeedPlus: ld a,l cp 100 jr z,SpeedLoop inc hl jr SpeedLoop SpeedLess: ld a,l or a jr z,SpeedLoop dec hl jr SpeedLoop PlaySnake: ld a,8 ld (nbrPoints),a ; On crée les listes call LevelZero ld a,0 ld (nbrApples),a call NewPoint mainloop: ld hl,(currentPnt) ld h,0 ld de,(nbrPoints) inc hl ld a,l cp e call z,inMax ld (currentPnt),hl ld hl,(appleY) ld de,(appleX) ld h,e ld d,c ld e,b call _cphlde ld a,0 call z,NewPoint ld a,0ffh out (1),a ld a,0feh out (1),a in a,(1) cp 253 jr z,ToLeft cp 251 jr z,ToRight cp 254 jr z,ToDown cp 247 jr z,ToUp ld a,0ffh out (1),a ld a,0fdh out (1),a in a,(1) cp 191 jp z,_clrlcdfull cp 254 call z,_getkey ld a,(direc) cp 1 jr z,ToUp cp 2 jr z,ToRight cp 3 jr z,ToDown cp 4 jr z,ToLeft ToDown: ld de,(direc) ld a,e cp 1 jr z,ToUp ld a,3 ld (direc),a dec c jr draw ToRight: ld de,(direc) ld a,e cp 4 jr z,ToLeft ld a,2 ld (direc),a inc b jr draw ToUp: ld de,(direc) ld a,e cp 3 jr z,ToDown ld a,1 ld (direc),a inc c jr draw ToLeft: ld de,(direc) ld a,e cp 2 jr z,ToRight ld a,4 ld (direc),a dec b jr draw draw: ld a,c cp 63 call z,overFlowUp cp 1 call z,overFlowDown ld a,b cp 75 call z,overFlowRight or a call z,overFlowLeft push bc ld d,3 call _IPOINT pop bc jp nz,lost continue: ld d,1 call _IPOINT call clearLastPixel ld hl,(currentPnt) ld d,l ld e,b ld hl,coordQueueX call StoreElementOfList ld hl,(currentPnt) ld d,l ld e,c ld hl,coordQueueY call StoreElementOfList ld hl,(TwoPlayers) ld a,l or a jp z,loopPauseStart mainloopSecPlayer: push bc ld hl,(currentPnt2) ld h,0 ld de,(nbrPoints2) inc hl ld a,l cp e call z,inMax ld (currentPnt2),hl ld hl,(appleX) ld de,(appleY) ld h,e ld de,(coordX2) ld d,e ld bc,(coordY2) ld e,c call _cphlde ld a,1 call z,NewPoint ld a,0ffh out (1),a ld a,0fbh out (1),a in a,(1) cp 251 jr z,ToRight2 ld a,0ffh out (1),a ld a,0efh out (1),a in a,(1) cp 251 jr z,ToLeft2 ld a,0ffh out (1),a ld a,0f7h out (1),a in a,(1) cp 253 jr z,ToDown2 cp 247 jr z,ToUp2 ld a,(direc2) cp 1 jr z,ToUp2 cp 2 jr z,ToRight2 cp 4 jr z,ToLeft2 ToDown2: ld de,(direc2) ld a,e cp 1 jr z,ToUp2 ld a,3 ld (direc2),a ld bc,(coordY2) dec bc ld (coordY2),bc ld a,c cp 1 call z,overFlowDown2 jr draw2 ToRight2: ld de,(direc2) ld a,e cp 4 jr z,ToLeft2 ld a,2 ld (direc2),a ld bc,(coordX2) inc bc ld (coordX2),bc ld a,c cp 75 call z,overFlowRight2 jr draw2 ToUp2: ld de,(direc2) ld a,e cp 3 jr z,ToDown2 ld a,1 ld (direc2),a ld bc,(coordY2) inc bc ld (coordY2),bc ld a,c cp 63 call z,overFlowUp2 jr draw2 ToLeft2: ld de,(direc2) ld a,e cp 2 jr z,ToRight2 ld a,4 ld (direc2),a ld bc,(coordX2) dec bc ld (coordX2),bc ld a,c or a call z,overFlowLeft2 draw2: ld bc,(coordY2) ld de,(coordX2) ld b,e ld d,3 call _IPOINT pop bc jp nz,lost continue2: push bc ld bc,(coordY2) ld de,(coordX2) ld b,e ld d,1 call _IPOINT ld a,1 call clearLastPixel2 ld hl,(currentPnt2) ld d,l ld hl,(coordX2) ld e,l ld hl,coordQueueX2 call StoreElementOfList ld hl,(currentPnt2) ld d,l ld hl,(coordY2) ld e,l ld hl,coordQueueY2 call StoreElementOfList pop bc loopPauseStart: ld hl,(speed) push bc ld a,l add a,1 ld b,a loopPause: ld hl,texte call _vputs djnz loopPause pop bc jp mainloop lost: ld hl,(appleX) ld de,(appleY) ld h,e ld d,b ld e,c call _cphlde jp z,continue push bc ld hl,(appleX) ld de,(appleY) ld h,e ld de,(coordX2) ld d,e ld bc,(coordY2) ld e,c call _cphlde pop bc jp z,continue2 ld d,1 ld hl,score call GetElementOfList ld de,(nbrPoints) ld a,e sub 9 ld e,a cp l call p,newRecord ld b,50 LittlePause: ld hl,$1820 ld (PENCOL),hl ld hl,Lost call _vputs djnz LittlePause call _getkey ld hl,coordQueueX call delvar ld hl,coordQueueY call delvar ld hl,coordQueueX2 call delvar ld hl,coordQueueY2 call delvar jp MenuStart delvar: ld de,OP1 ld bc,8 ldir call _Chkfindsym call nc,_DELVAR ret newRecord: ld d,1 ld e,a ld hl,score call StoreElementOfList ret SpeedOverflow: ld hl,50 ret inMax: ld l,1 ret overFlowDown: ld c,62 ret overFlowUp: ld c,2 ret overFlowLeft: ld b,74 ret overFlowRight: ld b,1 ret overFlowDown2: ld bc,62 ld (coordY2),bc ret overFlowUp2: ld bc,2 ld (coordY2),bc ret overFlowLeft2: ld bc,74 ld (coordX2),bc ret overFlowRight2: ld bc,1 ld (coordX2),bc ret MenuOnePlayerInvers: ld hl,$1615 ld (PENCOL),hl ld hl,MenuOnePlayer call _vputs ret MenuTwoPlayersInvers: ld hl,$2015 ld (PENCOL),hl ld hl,MenuTwoPlayers call _vputs ret MenuSpeedInvers: ld hl,$2B15 ld (PENCOL),hl ld hl,MenuSpeed call _vputs ret MenuQuitInvers: ld hl,$3615 ld (PENCOL),hl ld hl,MenuQuit call _vputs ret clearLastPixel: push bc ld bc,(currentPnt) ld d,c ld hl,coordQueueX call GetElementOfList push hl ld bc,(currentPnt) ld d,c ld hl,coordQueueY call GetElementOfList ld c,l pop hl ld b,l ld d,0 call _IPOINT pop bc ret clearLastPixel2: push bc ld bc,(currentPnt2) ld d,c ld hl,coordQueueX2 call GetElementOfList push hl ld bc,(currentPnt2) ld d,c ld hl,coordQueueY2 call GetElementOfList ld c,l pop hl ld b,l ld d,0 call _IPOINT pop bc ret NewPoint: or a jr z,varNP ld hl,coordQueueY2 ld de,coordQueueX2 varNPNext: push af push de call IncDimList pop de ex de,hl call IncDimList pop af or a jr z,varNP2 ld de,(nbrPoints2) inc de ld (nbrPoints2),de varNPNext2: ld de,(nbrApples) inc de ld (nbrApples),de dec de ld a,e push de cp 10 call z,LevelOne cp 20 call z,LevelTwo cp 30 call z,LevelThree cp 40 call z,LevelFour pop de ld a,e dec de push bc call _SETXXOP1 ld a,6 ld hl,$1050 ld (PENCOL),hl call _DISPOP1A jr NewApple varNP: ld hl,coordQueueY ld de,coordQueueX jr varNPNext varNP2: ld de,(nbrPoints) inc de ld (nbrPoints),de jr varNPNext2 NewApple: call _Random srl a srl a add a,5 cp 5 jp m,NewApple ld (appleY),a call _Random srl a srl a add a,10 ld (appleX),a ld c,a ld de,(appleY) ld b,e ld d,3 call _IPOINT jr nz,NewApple ld hl,(appleX) ld de,(appleY) ld b,e ld c,l ld d,1 call _IPOINT pop bc ret LevelOne: call LevelZero Lev1: push bc ld b,38 ld c,62 ld d,b ld e,0 call _DARKLINE dec b dec d call _DARKLINE pop bc ret LevelTwo: call LevelZero Lev2: push bc ld b,0 ld c,32 ld d,74 ld e,c call _DARKLINE dec c dec e call _DARKLINE pop bc ret LevelThree: call LevelZero call Lev1 call Lev2 ret LevelFour: ; Pas encore créé ret LevelZero: ld hl,coordQueueX ld de,(nbrPoints) call CreateList ld hl,coordQueueY ld de,(nbrPoints) call CreateList call _clrlcdfull call _Grbufclr ld hl,$0550 ld (PENCOL),hl ld hl,applesAte call _vputs ld hl,$2050 ld (PENCOL),hl ld hl,BestScore call _vputs ld d,1 ld hl,score call GetElementOfList ld a,l call _SETXXOP1 ld a,6 ld hl,$2A50 ld (PENCOL),hl call _DISPOP1A ; On trace le terrain ld b,0 ld c,b ld d,b ld e,63 call _DARKLINE ld b,75 ld d,b call _DARKLINE ld d,b ld b,c ld c,1 ld e,c call _DARKLINE ld c,63 ld e,c call _DARKLINE call declarations ld a,1 ld (direc),a ld (currentPnt),a ld bc,$0B22 ld d,1 ld e,b ld hl,coordQueueX call StoreElementOfList ld d,1 ld e,c ld hl,coordQueueY call StoreElementOfList ret TwoPlayersInGame: ld bc,1 ld (TwoPlayers),bc ld a,8 ld (nbrPoints2),a declarations: ld hl,coordQueueX2 ld de,(nbrPoints2) call CreateList ld hl,coordQueueY2 ld de,(nbrPoints2) call CreateList ld a,3 ld (direc2),a ld a,1 ld (currentPnt2),a ld hl,65 ld (coordX2),hl ld hl,25 ld (coordY2),hl ret GetElementOfList: push bc ld b,0 ld c,d push bc ld de,OP1 ld bc,8 ldir call _Chkfindsym ; look up list jp c,_ERRUNDEFINED ; error if not found ld h,d ld l,e call _ldHLind ; hl -> list length ld b,h ld c,l pop hl ; hl -> element number call _Getltoop1 ; get element to op1 call _Convop1 ex de,hl pop bc ret StoreElementOfList: push bc ld b,0 ld c,d push bc ld c,e push bc ld de,OP1 ; where to copy name to ld bc,8 ; length of name ldir ; all set, copy it call _Chkfindsym ; look up list jp c,_ERRUNDEFINED ; error if not found pop hl ld a,l call _SETXXOP1 pop hl ; # of element (1-999) call _PUTTOL ; store it pop bc ret CreateList: push bc push de ld de,OP1 ld bc,8 ldir call _Chkfindsym ; look up list call nc,_DELVAR ; if it is there delete it pop de ex de,hl call _CREATERLIST ; create list pop bc ret IncDimList: push bc ld de,OP1 ld bc,8 ldir call _Chkfindsym jp c,_ERRUNDEFINED call _INCLSTSIZE pop bc ret mainMenu: .db "Snake",0 version: .db "Ver : 2.1",0 BestScore: .db "Rec",0 Lost: .db " Lost ! ",0 MenuTitle: .db "Main Menu",0 MenuOnePlayer: .db " --1 Player--",0 MenuTwoPlayers: .db " --2 Player--",0 MenuSpeed: .db " ---Speed---",0 MenuQuit: .db " ----Quit----",0 Speed: .db "Speed",0 Percentage: .db "% " texte: .db " ",0 applesAte: .db "Eat :", 0 coordQueueX: .db $01,$5D,"Y",0 coordQueueY: .db $01,$5D,"X",0 coordQueueX2: .db $01,$5D,"I",0 coordQueueY2: .db $01,$5D,"J",0 score: .db $01,$5D,"ZSC",0 .end