;Insane Game v1.3 for AShell/83 ;original by Martin Hock ;TI-83 version by Bill Nagel ;DO NOT MAKE ANY MODIFICATIONS OF THIS PROGRAM ;FOR OTHER REASONS THAN PERSONAL USE .NOLIST #DEFINE TEXT_MEM 8265h #DEFINE TEXT_MEM2 8500h #DEFINE VIDEO_MEM 8E29h #DEFINE GameField TEXT_MEM+0 ;Actual game field #DEFINE ComputeField TEXT_MEM2+0 ;Game field used to compute adjacent tiles #DEFINE CursorStatus TEXT_MEM+128 ;Cursor status #DEFINE ;NumTiles TEXT_MEM+128 ;Number of tiles destroyed [REMOVED] #DEFINE Score TEXT_MEM+129 ;Score (2 bytes for up to 65k points) #DEFINE XCoord TEXT_MEM+131 ;General X Coordinate #DEFINE YCoord TEXT_MEM+132 ;General Y Coordinate #DEFINE XCCoord TEXT_MEM+133 ;Cursor X Coordinate #DEFINE YCCoord TEXT_MEM+134 ;Cursor Y Coordinate #DEFINE XTCoord TEXT_MEM+135 ;Temporary X Coordinate #DEFINE YTCoord TEXT_MEM+136 ;Temporary Y Coordinate #DEFINE TempNT TEXT_MEM+137 ;Number of tiles destroyed this round #DEFINE randvar TEXT_MEM+138 ;Random number (9 bit) #DEFINE YouWon TEXT_MEM+140 ;Set to 1 if all pieces gone, 2 if game over #DEFINE GameMode TEXT_MEM+141 ;Game Mode: 0 = Puzzle, 1 = Action, 2 = Versus, 3 = Handshake waiting for connect #DEFINE DelayCounter TEXT_MEM+142 ;Delay counter #DEFINE GetCounter TEXT_MEM+143 ;Delay counter for port #DEFINE StuffPlace TEXT_MEM+145 ;The shoved pieces #DEFINE KeyBuffer TEXT_MEM+146 ;Key buffer to save keypress #DEFINE DelayMaker TEXT_MEM+147 ;Delay before more pieces #DEFINE DelayFaker TEXT_MEM+148 ;Counter used to create piece delay #DEFINE PusNum TEXT_MEM+150 ;Number used to return with #define equ .equ #define EQU .equ #define end .end #include "ti83asm.inc" #include "tokens.inc" .LIST .org 9327h nop jr prog_start .dw $0000 .dw Description .dw Icon .dw $0000 prog_start: call _runIndicOff ld hl,8265h ld bc,768 clearloop: ld a,0 ld (hl),0 inc hl dec bc ld a,b or c jr nz,clearloop pop hl push hl ld (PusNum),hl call TitlePut call _GRBUFCPY_V ld b,0 ld c,55 ld d,94 ld e,55 ld h,1 call _ILine ld hl,9*256+1 ld (PENCOL),hl ld hl,credits call _vputs StartSpot: call DispHS call GetTitleAddr set textInverse,(iy+textflags) ld hl,$0305 call TextPut res textInverse,(iy+textflags) SuperKL: call _getk call _op2toop1 call _convop1 ld a,e inc b ;for random variable cp 34 jr z,DecGame cp 25 jr z,IncGame cp 21 jr z,Gateway cp 105 jr z,Gateway jr SuperKL Gateway: ld a,r ld (randvar),a ld a,b ld (randvar+1),a ld a,(GameMode) call BigRand ld a,0 ld (XCoord),a ld (YCoord),a ld a,75 ld (DelayMaker),a RestoreGate: call DrawBoard call _GRBUFCPY_V jp SelectPiece ret IncGame: ld a,(GameMode) cp 1 jr nz,IGInc ld a,255 IGInc: inc a ld (GameMode),a jp StartSpot DecGame: ld a,(GameMode) cp 0 jr nz,DGDec ld a,2 DGDec: dec a ld (GameMode),a jp StartSpot GetTitleAddr: ;Finds the text to describe the game mode ld hl,0 ld a,(GameMode) ld l,a add hl,hl add hl,hl ld d,h ld e,l add hl,de add hl,de ld de,IGTitle add hl,de ld d,h ld e,l ret TitlePut: call _CLRLCDFULL call _homeup call _GRBUFCLR ld hl,TitleBitmap ld de,VIDEO_MEM ld bc,12 ld a,8 TPutLoop: ldir dec a ret z ld bc,12 jr TPutLoop BigRand: ld bc,96 ;USED TO BE 128!!!!!! BRLoop: ld hl,GameField add hl,bc dec hl push bc push hl call RandConvert pop hl pop bc ld (hl),a dec c ld a,c cp 0 ret z cp 48 ;USED TO BE 64!!!!! jr nz,BRLoop ld a,(GameMode) cp 0 jr z,BRLoop ret RandConvert: ld hl,randvar call rand srl a srl a and $03 ld d,a inc hl call rand ld e,a bit 0,d jr z,EndFonk set 7,e EndFonk: res 1,d inc de ld a,1 ld hl,0 RCLoop: inc a cp 6 jr nz,RCMore ld a,1 RCMore: dec de call _cphlde jr nz,RCLoop ret rand: ;By Chris Busch ld a,(hl) ;;must be defined in text area ld b,a ld a,0 add a,b sla b sla b add a,b sla b sla b add a,b inc a ld (hl),a srl a ret DrawBoard: ld bc,96 ld de,VIDEO_MEM+684 ld a,12 DBLoop: dec c dec de dec a cp 255 jr nz,MoLoop or a ld h,d ld l,e ld de,84 ;112 sbc hl,de ld d,h ld e,l ld a,11 ;15 MoLoop: push af push bc push de push de ld hl,GameField add hl,bc ld d,0 ld e,(hl) ld hl,Token0 sla e sla e sla e add hl,de ld d,h ld e,l pop hl ;Popping de into hl. call TinyPut pop de pop bc pop af ld h,a ld a,c cp 0 ld a,h ;Doesn't change flags. jr nz,DBLoop ld a,(CursorStatus) cp 1 call Z,FlipToken ret CounterAdd: ;b = add value ld a,(GameMode) cp 0 ret z ld a,(DelayMaker) ld c,a ld a,(DelayCounter) add a,b cp c jr nc,CounterOF ld (DelayCounter),a ret CounterOF: sub c inc a ld (DelayCounter),a call ShoveIt ld a,(DelayFaker) inc a ld (DelayFaker),a cp 6 ret nz ld a,0 ld (DelayFaker),a ld a,(DelayMaker) dec a ld (DelayMaker),a cp 1 ret nz inc a ld (DelayMaker),a ret TextPut: ;input: hl = screen location, de = location of string to place ld (CURROW),hl ld h,d ld l,e call _puts ret KeyLoop: ;output: a=key pressed call _getk call _op2toop1 call _convop1 ld a,e or a jr z, KeyLoop ret FlashKeyLoop: call FlipToken ld a,1 ld (CursorStatus),a ld bc,0 FKLLoop: inc c ld a,c cp 255 jr z,FlashIt FlashRet: push bc call _getk call _op2toop1 call _convop1 pop bc ld a,e or a jr z,FKLLoop ld (KeyBuffer),a push af call FlipToken ld a,0 ld (CursorStatus),a pop af ret FlashIt: push bc ld b,30 call CounterAdd pop bc inc b ld a,b cp 50 jr nz,FlashRet ReallyFlash: ld b,0 jr FlashRet ConvertXY: ld de,0 ld hl,0 ld a,(YCoord) ld l,a ld h,12 call _htimesl ld a,(XCoord) ld e,a add hl,de ret GetScreenAddr: ld bc,0 ld hl,0 ld a,(YCoord) ld l,a ld h,96 push de call _htimesl pop de ld a,(XCoord) ld c,a add hl,bc ld bc,VIDEO_MEM add hl,bc ret PutToken: call ConvertXY ld de,GameField add hl,de ld de,0 ld e,(hl) ld hl,Token0 sla e sla e sla e add hl,de ld d,h ld e,l call GetScreenAddr TinyPut: ;input: de=top of token address, hl=top of screen address ld b,8 TPLoop: ld a, (de) ; Load byte contained at DE location into A ld (hl), a ; Put it onto the screen!!! inc de ;Make token address go more one byte. ld a,b ;Temporarily store value of b in a so bc can be used. ld bc,12 add hl,bc ;Make screen go more one ROW. ld b,a ;Restore value of b. djnz TPLoop ;Decrement B, if 0 then get outta there ; call _GRBUFCPY_V ret FlipToken: call GetScreenAddr TinyFlip: ;input: hl = address of top-left of screen chunk ld b,8 TFlipLoop: ld a,(hl) cpl ;NOT the a register ld (hl),a ld a,b ld bc,12 add hl,bc ld b,a djnz TFlipLoop call _GRBUFCPY_V ret SelectPiece: call FlashKeyLoop ld b,10 push af call CounterAdd pop af cp 25 jr z,MoveUp cp 34 jr z,MoveDown cp 24 jr z,MoveLeft cp 26 jr z,MoveRight cp 21 jr z,ChooseIt cp 22 jp Z,ScoreGet jr SelectPiece MoveUp: call PutToken ld hl, YCoord ld a,(hl) cp 0 jr nz,MUDec ld a,8 ;actually 7 after dec MUDec: dec a ld (hl),a jr SelectPiece MoveDown: call PutToken ld hl, YCoord ld a,(hl) cp 7 jr nz,MDInc ld a,255 ;actually 0 after inc MDInc: inc a ld (hl),a jr SelectPiece MoveLeft: call PutToken ld hl, XCoord ld a,(hl) cp 0 jr nz,MLDec ld a,12 ;actually 11 after dec MLDec: dec a ld (hl),a jr SelectPiece MoveRight: call PutToken ld hl,XCoord ld a,(hl) cp 11 jr nz,MRInc ld a,255 ;actually 0 after inc MRInc: inc a ld (hl),a jp SelectPiece ChooseIt: ld b,5 CALL CounterAdd CALL ConvertXY ld bc,GameField add hl,bc ld a,(hl) cp 0 jp Z,SelectPiece ld e,a ;e = the token push de ld bc,96 ;IT USED TO BE 128!!!!!! ClearCLoop: ld hl,ComputeField add hl,bc dec hl ld (hl),0 dec c jr nz,ClearCLoop FindSame: call ConvertXY ld bc,ComputeField add hl,bc ld (hl),1 ld a,0 ld (TempNT),a UltraLoop: OneScan: ld bc,96 ;USED TO BE 128!!!!!!!!! ld hl,XTCoord ld (hl),12 ;USED TO BE 16 inc hl ld (hl),7 OSLoop: ld a,(XTCoord) cp 0 call Z,DecRow dec a ld (XTCoord),a ld hl,ComputeField add hl,bc dec hl ld a,(hl) cp 1 jr z,FoundOne dec c jr nz,OSLoop DoneScanning: pop de ld a,(TempNT) cp 1 jp Z,SelectPiece ZeroTrans: ld bc,96 ;USED TO 128!!!!!! ZTLoop: ld hl,ComputeField add hl,bc dec hl ld a,(hl) cp 2 call Z,BustAZero dec c jr nz,ZTLoop call ScoreIt call DownGrav call LeftGrav ld a,(GameMode) cp 0 jr nz,SkipEndGame ld a,(GameField+84) ;USED TO BE 112!!! cp 0 jp Z,WinPlace SkipEndGame: ld a,(GameMode) cp 0 jp Z,GameOverScan GameOverRet: call DrawBoard jp SelectPiece BustAZero: ld de,TEXT_MEM2-TEXT_MEM or a sbc hl,de ld (hl),0 add hl,de ret DecRow: ld a,(YTCoord) dec a ld (YTCoord),a ld a,12 ;USED TO BE 16!!! ret FoundOne: ld a,(TempNT) inc a ld (TempNT),a ld (hl),2 ld bc,TEXT_MEM2-TEXT_MEM or a sbc hl,bc pop de push de RightScan: inc hl ld a,(XTCoord) cp 11 ;USED TO BE 15!!!! jr z,LeftScan ld a,(hl) cp e call Z,Mirror LeftScan: dec hl ld a,(XTCoord) cp 0 jr z,UpScan dec hl ld a,(hl) cp e call Z,Mirror inc hl UpScan: ld bc,12 ;USED TO BE 16 or a sbc hl,bc ld a,(YTCoord) cp 0 jr z,DownScan ld a,(hl) cp e call Z,Mirror DownScan: ld bc,24 ;USED TO BE 32 add hl,bc ld a,(YTCoord) cp 7 jr z,EndScan ld a,(hl) cp e call Z,Mirror EndScan: jp UltraLoop Mirror: push hl ld bc,TEXT_MEM2-TEXT_MEM add hl,bc ld a,(hl) cp 0 jr nz,MirrorPass ld (hl),1 MirrorPass: pop hl ret LeftGrav: ld bc,12 ;USED TO BE 16 SuperLoop: push bc ld bc,11 ;USED TO BE 15 LGLoop: ld hl,GameField+84 ;USED TO BE 112 add hl,bc dec hl ld a,(hl) push bc cp 0 call Z,LeftShift pop bc dec c jr nz,LGLoop pop bc dec c ret z jr SuperLoop LeftShift: ld de,84 ;USED TO BE 112 or a sbc hl,de ld d,h ld e,l inc de ld bc,8 ;HMMMMMMMMM LSLoop: ld a,(de) ld (hl),a ld a,0 ld (de),a ld b,12 ;USED TO BE 16 IncHLDE16: inc hl inc de djnz IncHLDE16 dec c jr nz,LSLoop ret DownGrav: ld bc,3 ;THREE??????? MegaLoop: push bc ld bc,84 ;USED TO BE 112 ; 128-16 of first row ld hl,XTCoord ld (hl),12 ;USED TO BE 16 inc hl ld (hl),7 DGLoop: ld a,(XTCoord) cp 0 call Z,DecRow dec a ld (XTCoord),a ld hl,GameField+12 ;USED TO BE 16 add hl,bc dec hl ld a,(hl) push bc cp 0 call Z,CopyDown pop bc dec c jr nz,DGLoop pop bc dec c ret z jr MegaLoop CopyDown: ;A sort of LDDR with 16 byte dec. push hl ld de,12 ;USED TO BE 16 or a sbc hl,de ld d,h ld e,l ;Load DE with source pop hl ;Reload HL with destination ld a,(YTCoord) ld c,a CDLoop: ld a,(de) ld (hl),a ld b,12 ;USED TO BE 16 DecHLDE16: dec hl dec de djnz DecHLDE16 dec c jr nz,CDLoop ld (hl),0 ret GameOverScan: ld bc,96 ;USED TO BE 128 ld hl,XTCoord ld (hl),12 ;USED TO BE 16 inc hl ld (hl),7 ;I THINK THIS # IS RIGHT GOLoop: ld a,(XTCoord) cp 0 call Z,DecRow dec a ld (XTCoord),a ld hl,GameField add hl,bc dec hl ld e,(hl) ld d,c ld a,e cp 0 jr z,EndGOScan LeftGOScan: ld a,(XTCoord) cp 0 jr z,UpGOScan dec hl ld a,(hl) cp e jp Z,GameOverRet inc hl UpGOScan: ld bc,12 ;USED TO BE 16 or a sbc hl,bc ld a,(YTCoord) cp 0 jr z,EndGOScan ld a,(hl) cp e jp Z,GameOverRet EndGOScan: ld c,d dec c jr nz,GOLoop jp LosePlace DecRowFunk: ld a,(YTCoord) dec a ld (YTCoord),a ld a,c sub 24 ;USED TO BE 32 ld c,a ld a,255 ret ShoveIt: ld bc,83 ;USED TO BE 111 ld hl,XTCoord ld (hl),255 inc hl ;YTCoord ld (hl),7 SILoop: ld a,(XTCoord) cp 11 ;USED TO BE 15 call Z,DecRowFunk inc a inc c ld (XTCoord),a ld hl,GameField add hl,bc ld e,(hl) ld a,e cp 0 jr z,Insertion ld a,c cp 11 ;USED TO BE 15 jr nz,SILoop OverFlow: jp LosePlace Insertion: push hl CALL RandConvert pop hl ld (hl),a ld hl,(XCoord) ld (XCCoord),hl ld hl,(XTCoord) ld (XCoord),hl call PutToken call _GRBUFCPY_V ld hl,(XCCoord) ld (XCoord),hl ld de,(XTCoord) call _cphlde ret nz ld a,(CursorStatus) cp 1 ret nz CALL FlipToken ret ScoreIt: ld a,(TempNT) dec a ld b,0 ld c,a ld hl,0 ScoreLoop: cp 0 jr z,AddIt dec a add hl,bc jr ScoreLoop AddIt: ld d,h ld e,l ld hl,(Score) add hl,de ld (Score),hl ret ScoreGet: call ScoreDisp ScoreLoop2: call KeyLoop cp 23 jp Z,LosePlace cp 22 jr nz,ScoreLoop2 call DrawBoard jp SelectPiece WinPlace: ld a,1 ld (YouWon),a ld a,(GameMode) cp 0 jr nz,ScoreDisp ld hl,(Score) add hl,hl add hl,hl ld (Score),hl jr ScoreDisp LosePlace: GoodBye: ld a,2 ld (YouWon),a jr ScoreDisp WonDisp: ld hl,$0001 ld de,IGWin call TextPut ret LoseDisp: ld hl,$0001 ld de,IGGameOver call TextPut ret ScoreDisp: DispScore: call TitlePut call _GRBUFCPY_V ld a,(YouWon) cp 1 call Z,WonDisp cp 2 call Z,LoseDisp ld hl,$0702 ld (CURROW),hl ld hl,(Score) call _dispHL ld hl,$0002 ld de,IGScore call TextPut CALL DispHS ld a,(YouWon) cp 0 ret z jp HSCheck ScoreLoop3: call KeyLoop cp 21 jr z,ScoreLoop3 exit: PusDrain: pop de ld hl,(PusNum) call _cphlde jr nz,PusDrain push de call _clrlcdfull res plotdisp,(iy+plotflags) ret DispHS: ld hl,$0703 ld (CURROW),hl call gethigh ld e,(hl) inc hl ld d,(hl) ex de,hl call _dispHL ld hl,$0003 ld de,IGHS call TextPut call gethigh ld hl,$0D03 call TextPut ret gethigh: ld a,(GameMode) add a,a ld h,a add a,a add a,h ld h,0 ld l,a ld de,IGHSDat add hl,de push hl pop de inc de inc de ret HSCheck: call gethigh ld e,(hl) inc hl ld d,(hl) ld hl,(Score) inc de or a sbc hl,de jp c,ScoreLoop3 ld hl,$0005 ld de,IGHSText call TextPut call gethigh ld de,(Score) ld (hl),e inc hl ld (hl),d ld hl,$0006 ld de,IGInitials call TextPut ld hl,$0007 ld (CURROW),hl call gethigh ex de,hl ld c,65 ld b,0 putletter: ld a,b ld (CURCOL),a ld a,c call _putc getloop: push bc push hl call _getk call _op2toop1 call _convop1 pop hl pop bc ld a,e cp 25 jr Z,upini cp 34 jr Z,downini cp 105 jr nz,getloop ld a,c ld (hl),a inc hl inc b ld a,b cp 3 jp Z,exit jr putletter upini: inc c ld a,c cp 91 jr nz,putletter ld c,65 jr putletter downini: dec c ld a,c cp 64 jr nz,putletter ld c,90 jr putletter ;Data Token0: ; blank space .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 Token1: ; triangle .db %00010000 .db %00111000 .db %00111000 .db %01101100 .db %01110100 .db %11110110 .db %11111110 .db %00000000 Token2: ; cross .db %00111000 .db %00111000 .db %11100110 .db %11110110 .db %11111110 .db %00111000 .db %00111000 .db %00000000 Token3: ; square .db %11111110 .db %11000110 .db %11110110 .db %11110110 .db %11111110 .db %11111110 .db %11111110 .db %00000000 Token4: ; circle .db %00111000 .db %01101100 .db %11110110 .db %11111110 .db %11111110 .db %01111100 .db %00111000 .db %00000000 Icon: Token5: ; diamond .db %00010000 .db %00111000 .db %01101100 .db %11111110 .db %01111100 .db %00111000 .db %00010000 .db %00000000 Description: .db "Insane Game 83 v1.3",0 TitleBitmap: .db %00110011,%00111011,%11100011,%10000110,%01110111,%11100000,%11111000,%11100001,%11001110,%11111100,%00000010,%00011110 .db %01110111,%10110110,%01100011,%10001111,%01101110,%00000001,%10011000,%11100011,%11011101,%11000000,%00000110,%00000001 .db %01100111,%10110111,%10000111,%10001111,%01101111,%11000011,%00000001,%11100011,%11011101,%11111001,%00010010,%00000001 .db %01100111,%10110011,%11101101,%11001111,%01101111,%10000011,%01111011,%01110011,%11111101,%11110000,%10100010,%00000110 .db %01101110,%11100100,%11101111,%11011101,%11011100,%00000111,%00010011,%11110110,%11101111,%10000000,%10100010,%00000001 .db %11001100,%11101100,%11011111,%11011001,%11011111,%10000111,%01110111,%11110110,%11011011,%11110000,%10100010,%00000001 .db %11001100,%11101111,%10111001,%11011001,%11011111,%10000011,%11101110,%01110110,%11011011,%11110000,%01000111,%01011110 .db %00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000 IGHS: .db "Hi" IGScore: .db "Score:",0 IGWin: .db "You Won!",0 IGGameOver: .db "Game Over!",0 credits: .db "AShell Version by Bill Nagel",0 IGHSText: .db "New High Score!",0 IGInitials: .db "Enter initials:",0 IGTitle: .db "Puzzle Mode",0 .db "Action Mode",0 IGHSDat: .db $00,$00 IGInitDat: .db "WCN",0 IGHSDat2: .db $01,$00 IGInitDat2: .db "OXY",0 .end