#include "ti-82.h" COUNT = TEXT_MEM ;; just a dummy var, used to draw grid, count turns BKX = TEXT_MEM2+1 ;;BKX and BKY are sprite coords BKY = TEXT_MEM2+3 TURN = TEXT_MEM+5 ;; whose turn, x or o? .org 0 .db "xox{-Tic Tac Toe-}xox",0 ld a,%10001100 ;Needed for FIND_PIXEL ($4116) out (2),a LD A,%00000000 ;Speeds up game OUT (4),A CALL_(ERASESCREEN) ;Erase screen ld a,18 ld (COUNT),a ld b,7 ;loop 7 times REDRAWHZ: ;draw horizontal lines push bc ld a,(COUNT) ld (BKX),a ld a,17 ld (BKY),a ld hl,HORIZONTAL CALL_(drawit) ld a,(COUNT) ld (BKX),a ld a,37 ld (BKY),a ld hl,HORIZONTAL CALL_(drawit) ld a,(COUNT) add a,8 ld (COUNT),a pop bc djnz REDRAWHZ ld a,5 ld (COUNT),a ld b,7 ;loop 7 times REDRAWVT: ;draw vertical lines push bc ld a,31 ld (BKX),a ld a,(COUNT) ld (BKY),a ld hl,VERTICAL CALL_(drawit) ld a,51 ld (BKX),a ld a,(COUNT) ld (BKY),a ld hl,VERTICAL CALL_(drawit) ld a,(COUNT) add a,8 ld (COUNT),a pop bc djnz REDRAWVT ld a,0 ld (COUNT),a CALL_(CENTERSTART) ;; puts the square on the screen GAMELOOP: ld a,(COUNT) ;; have all the spots been filled? cp 9 ;; JUMP_Z(END) ;; yup, so jump to end ROM_CALL(_GETKEY) cp 6 JUMP_Z(EXIT) ;; Clear Key cp 5 CALL_Z(PLACETILE) ;; Enter Key cp 3 CALL_Z(MOVEUP) ;; Up Key cp 4 CALL_Z(MOVEDOWN) ;; Down Key cp 2 CALL_Z(MOVELEFT) ;; Left key cp 1 CALL_Z(MOVERIGHT) ;; Right key cp 241 ;; was a tile placed? CALL_Z(CENTERPLACE) ;; yes, re-center square jr GAMELOOP MOVEUP: ld a,(BKY) ;; Too far up? cp 7 RET Z ;; yup, Return..no movement ld hl,PLACER ;;erase square CALL_(drawit) ;;with old coords ld a,(BKY) sub 20 ld (BKY),a ld hl,PLACER CALL_(drawit) ;;draw new square, new coords RET ;; Note--i didn't comment the other movements, ;; there're all the same pretty much MOVELEFT: ld a,(BKX) cp 21 RET Z ld hl,PLACER CALL_(drawit) ld a,(BKX) sub 20 ld (BKX),a ld hl,PLACER CALL_(drawit) RET CENTERPLACE: ld hl,PLACER CALL_(drawit) CENTERSTART: ;; just for init ld a,41 ld (BKX),a ld a,27 ld (BKY),a ld hl,PLACER CALL_(drawit) ;; recenters square RET MOVEDOWN: ld a,(BKY) cp 47 RET Z ld hl,PLACER CALL_(drawit) ld a,(BKY) add a,20 ld (BKY),a ld hl,PLACER CALL_(drawit) RET MOVERIGHT: ld a,(BKX) cp 61 RET Z ld hl,PLACER CALL_(drawit) ld a,(BKX) add a,20 ld (BKX),a ld hl,PLACER CALL_(drawit) RET PLACETILE: ld a,(BKX) ;;use the BKX and BKY coords to check add a,5 ;;if a tile has been placed ld b,a ld a,(BKY) cp 47 jr z,(UP) ;; use getpixel to check bottom row cp 7 ;; use getpixel to check top row jr z,(DOWN) add a,6 ;; use getpixel to check mid row jr CONT UP: add a,30 jr CONT DOWN: sub 18 CONT: ld c,a CALL_(GetPixel) ;;getpixel -- z=pixel is off nz=pixel on cp 0 RET NZ ld a,(COUNT) ;; the turn was succesfully made inc a ;; so add 1 to turn counter ld (COUNT),a ld a,(TURN) ;;this checks which to put..x or o cp 1 ;; 1=O 0=X jr z,PUTO PUTX: ld hl,XXXX CALL_(drawit) ld a,1 ld (TURN),a ld a,241 RET PUTO: ld hl,OOOO CALL_(drawit) ld a,0 ld (TURN),a ld a,241 RET END: ld hl,PLACER CALL_(drawit) CALL_(INVERT) ;;Invert screen ROM_CALL(_GETKEY) CALL_(INVERT) ;; do it again, looks better w/text jr EXIT ;; go to ending text ERASESCREEN: ld hl,$88B8 ;; a routine to erase the graph screen ld de,$88B9 ld bc,$2FF xor a ld (hl),a ldir ROM_CALL(_GRBUFCPY_V) RET INVERT: ;;inverts screen ld bc,768 ld hl,$88B8 invloop: ld a,(hl) cpl ld (hl),a inc hl dec bc ld a,b or c jr NZ,invloop ROM_CALL(_GRBUFCPY_V) RET EXIT: ;;display all that ending text ld hl,$0711 ld ($8215), hl ld hl,tictactoe ld de,(PROGRAM_ADDR) add hl,de ROM_CALL(D_ZM_STR) ROM_CALL(_GRBUFCPY_V) ld hl,$1911 ld ($8215), hl ld hl,byalex ld de,(PROGRAM_ADDR) add hl,de ROM_CALL(D_ZM_STR) ROM_CALL(_GRBUFCPY_V) ld hl,$2004 ld ($8215), hl ld hl,moonbeem ld de,(PROGRAM_ADDR) add hl,de ROM_CALL(D_ZM_STR) ROM_CALL(_GRBUFCPY_V) ld hl,$2E06 ld ($8215), hl ld hl,foramber ld de,(PROGRAM_ADDR) add hl,de ROM_CALL(D_ZM_STR) ROM_CALL(_GRBUFCPY_V) ROM_CALL(_GETKEY) CALL_(ERASESCREEN) LD A,%00000110 ;;sets the calc back to normal speed OUT (4),A RET GetPixel: call $4166 ld de, $88B8 add hl,de and (hl) RET drawit: ;;sprite routine LD DE,(PROGRAM_ADDR) ADD HL,DE ld a,(BKY) ld e,a ; Load the y-coordinate in e ld a,(BKX) ; Load the x-coordinate in a DRWSPR2: push hl ; Save sprite address ;лллл Calculate the address in graphbuf лллл ld hl,0 ; Do y*12 ld d,0 add hl,de add hl,de add hl,de add hl,hl add hl,hl ld d,0 ; Do x/8 ld e,a srl e srl e srl e add hl,de ld de,$88B8 add hl,de ; Add address to graphbuf ld b,00000111b ; Get the remainder of x/8 and b cp 0 ; Is this sprite aligned to 8*n,y? jr z,ALIGN2 ;лллл Non aligned sprite blit starts here лллл pop ix ; ix->sprite ld d,a ; d=how many bits to shift each line ld e,8 ; Line loop LILOP2: ld b,(ix+0) ; Get sprite data ld c,0 ; Shift loop push de SHLOP2: srl b rr c dec d jr nz,SHLOP2 pop de ld a,b ; Write line to graphbuf xor (hl) ld (hl),a inc hl ld a,c xor (hl) ld (hl),a ld bc,11 ; Calculate next line address add hl,bc inc ix ; Inc spritepointer dec e jr nz,LILOP2 ; Next line jr DONE2 ;лллл Aligned sprite blit starts here лллл ALIGN2: ; Blit an aligned sprite to graphbuf pop de ; de->sprite ld b,8 ALOP2: ld a,(de) xor (hl) ld (hl),a inc de push bc ld bc,12 add hl,bc pop bc djnz ALOP2 DONE2: ld c,a ld a,e add a,1 ld e,a ld a,c add a,1 ROM_CALL(_GRBUFCPY_V) RET tictactoe: .db "oX..Tic Tac Toe..Xo",0 byalex: .db "By Alex Highsmith",0 moonbeem: .db "moonbeem@ix.netcom.com",0 foramber: .db "For Anberu-chan, always",0 HORIZONTAL: .db %00000000 .db %00000000 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %00000000 .db %00000000 VERTICAL: .db %00111100 .db %00111100 .db %00111100 .db %00111100 .db %00111100 .db %00111100 .db %00111100 .db %00111100 XXXX: .db %00000000 .db %11000011 .db %01100110 .db %00111100 .db %00011000 .db %00111100 .db %01100110 .db %11000011 OOOO: .db %00111100 .db %01000010 .db %10001001 .db %10000101 .db %10000001 .db %10000001 .db %01000010 .db %00111100 PLACER: .db %11111111 .db %10000001 .db %10000001 .db %10000001 .db %10000001 .db %10000001 .db %10000001 .db %11111111 .end END