Professional Documents
Culture Documents
; LAYOUT G H J
; K L M
; N P Q
; Declare variables at 17 memory locations
; Set port B as output and initialize it. and set port A part input & output.
BEGIN BSF STATUS,5 ; set bank 1
MOVLW 0x00 ; w = 00000000 binary
TRIS PORTB ; port B ctrl register Port B is output
MOVLW 0x18 ; 00011000 binary
TRIS PORTA ; port A ctrl register Port A,
; bits 0,1,2 are outputs,
; bit 3 and bit 4 are inputs.
BCF STATUS,5 ; set bank 0 again
MOVLW 0xFF
MOVWF PORTB
BSF PORTA,0
CLRF G ; clear all variables
CLRF H
CLRF J
CLRF K
CLRF L
CLRF M
CLRF N
CLRF P
CLRF Q
CLRF R
CLRF X
CLRF Y
; Routine to generate random number 1-9, works by counting 1-9 in waiting time
BTFSC Y,0
GOTO Q4
BTFSC PORTA,4 ;Test for Oscar's first turn
GOTO Q4
BSF PORTA,0
BCF PORTA,2
BCF PORTA,1
BSF Y,0
MOVF X,0
XORLW 0x01
BTFSC STATUS,2
GOTO GX
MOVF X,0
XORLW 0x02
BTFSC STATUS,2
GOTO HX
MOVF X,0
XORLW 0x03
BTFSC STATUS,2
GOTO JX
MOVF X,0
XORLW 0x04
BTFSC STATUS,2
GOTO KX
MOVF X,0
XORLW 0x05
BTFSC STATUS,2
GOTO LX
MOVF X,0
XORLW 0x06
BTFSC STATUS,2
GOTO MX
MOVF X,0
XORLW 0x07
BTFSC STATUS,2
GOTO NX
MOVF X,0
XORLW 0x08
BTFSC STATUS,2
GOTO NX
MOVF X,0
XORLW 0x00
BTFSC STATUS,2
GOTO QX
Q4 CALL DISPLAY
CALL DELAY
MOVF G,0 ;this routine checks to see if
player
ADDWF H,0 ;has 3 in a row.
ADDWF J,0 ;If player does, then game stops,
and
XORLW 0x03 ;winning line is displayed flashing
BTFSC STATUS,2
GOTO WIN1
MOVF K,0
ADDWF L,0
ADDWF M,0
XORLW 0x03
BTFSC STATUS,2
GOTO WIN2
MOVF N,0
ADDWF P,0
ADDWF Q,0
XORLW 0x03
BTFSC STATUS,2
GOTO WIN3
MOVF G,0
ADDWF K,0
ADDWF N,0
XORLW 0x03
BTFSC STATUS,2
GOTO WIN4
MOVF H,0
ADDWF L,0
ADDWF P,0
XORLW 0x03
BTFSC STATUS,2
GOTO WIN5
MOVF J,0
ADDWF M,0
ADDWF Q,0
XORLW 0x03
BTFSC STATUS,2
GOTO WIN6
MOVF G,0
ADDWF L,0
ADDWF Q,0
XORLW 0x03
BTFSC STATUS,2
GOTO WIN7
MOVF N,0
ADDWF L,0
ADDWF J,0
XORLW 0x03
BTFSC STATUS,2
GOTO WIN8 ;end of routine checking for player win.
; L O G I C S T A G E O N E & T W O ,
BCF R,0 ; R flags key press
MOVLW 0x08 ; when R = 8, looking for 2 reds
MOVWF V
GOTO WINTEST
LOSETEST MOVLW 0x02 ; when R = 2, looking for 2 greens
MOVWF V
WINTEST MOVLW 0x00 ; see if first square is blank
XORWF G,0
BTFSS STATUS,2
GOTO HD ; if not blank goto next square
MOVF H,0 ; check to see if squares H and J
are both red
ADDWF J,0
XORWF V,0
BTFSC STATUS,2
GOTO GX ; then exit this test and declare
win
MOVF L,0 ; try next combo L + Q
ADDWF Q,0
XORWF V,0
BTFSC STATUS,2
GOTO GX
MOVF K,0 ;try K + N
ADDWF N,0
XORWF V,0
BTFSC STATUS,2
GOTO GX
HD MOVLW 0x00
XORWF H,0
BTFSS STATUS,2
GOTO JD
MOVF L,0
ADDWF P,0
XORWF V,0
BTFSC STATUS,2
GOTO HX
MOVF G,0
ADDWF J,0
XORWF V,0
BTFSC STATUS,2
GOTO HX
JD MOVLW 0x00
XORWF J,0
BTFSS STATUS,2
GOTO KD
MOVF G,0
ADDWF H,0
XORWF V,0
BTFSC STATUS,2
GOTO JX
MOVF N,0
ADDWF L,0
XORWF V,0
BTFSC STATUS,2
GOTO JX
MOVF M,0
ADDWF Q,0
XORWF V,0
BTFSC STATUS,2
GOTO JX
KD MOVLW 0x00
XORWF K,0
BTFSS STATUS,2
GOTO LD
MOVF G,0
ADDWF N,0
XORWF V,0
BTFSC STATUS,2
GOTO KX
MOVF L,0
ADDWF M,0
XORWF V,0
BTFSC STATUS,2
GOTO KX
LD MOVLW 0x00
XORWF L,0
BTFSS STATUS,2
GOTO MD
MOVF G,0
ADDWF Q,0
XORWF V,0
BTFSC STATUS,2
GOTO LX
MOVF H,0
ADDWF P,0
XORWF V,0
BTFSC STATUS,2
GOTO LX
MOVF N,0
ADDWF J,0
XORLW V
BTFSC STATUS,2
GOTO LX
MOVF K,0
ADDWF M,0
XORWF V,0
BTFSC STATUS,2
GOTO LX
MD MOVLW 0x00
XORWF M,0
BTFSS STATUS,2
GOTO ND
MOVF K,0
ADDWF L,0
XORWF V,0
BTFSC STATUS,2
GOTO MX
MOVF J,0
ADDWF Q,0
XORWF V,0
BTFSC STATUS,2
GOTO MX
ND MOVLW 0x00
XORWF N,0
BTFSS STATUS,2
GOTO PD
MOVF G,0
ADDWF K,0
XORWF V,0
BTFSC STATUS,2
GOTO NX
MOVF J,0
ADDWF L,0
XORWF V,0
BTFSC STATUS,2
GOTO NX
MOVF P,0
ADDWF Q,0
XORWF V,0
BTFSC STATUS,2
GOTO NX
PD MOVLW 0x00
XORWF P,0
BTFSS STATUS,2
GOTO QD
MOVF H,0
ADDWF L,0
XORWF V,0
BTFSC STATUS,2
GOTO PX
MOVF N,0
ADDWF Q,0
XORWF V,0
BTFSC STATUS,2
GOTO PX
QD MOVLW 0x00
XORWF Q,0
BTFSS STATUS,2
GOTO ZD
MOVF N,0
ADDWF P,0
XORWF V,0
BTFSC STATUS,2
GOTO QX
MOVF G,0
ADDWF L,0
XORWF V,0
BTFSC STATUS,2
GOTO QX
MOVF J,0
ADDWF M,0
XORWF V,0
BTFSC STATUS,2
GOTO QX
CALL DELAY
ZD MOVF V,0
XORLW 0x08
BTFSC STATUS,2
GOTO LOSETEST
; L O G I C S T A G E T H R E E , ** T A C T I C S **
GTAC MOVLW 0x00
XORWF G,0
BTFSS STATUS,2
GOTO HTAC
MOVF H,0
ADDWF M,0
XORLW 0x02
BTFSC STATUS,2
GOTO GX
MOVF H,0
ADDWF N,0
XORLW 0x02
BTFSC STATUS,2
GOTO GX
MOVF J,0
ADDWF K,0
XORLW 0x02
BTFSC STATUS,2
GOTO GX
MOVF N,0
ADDWF L,0
XORLW 0x02
BTFSC STATUS,2
GOTO GX
MOVF X,0
ANDLW 0x03
XORLW 0x00
BTFSS STATUS,2
GOTO HTAC
MOVF L,0
XORLW 0x01
BTFSC STATUS,2
GOTO GX
CALL DELAY
; L O G I C S T A G E F O U R ** R A N D O M **
GX BSF G,2
GOTO G0
HX BSF H,2
GOTO G0
JX BSF J,2
GOTO G0
KX BSF K,2
GOTO G0
LX BSF L,2
GOTO G0
MX BSF M,2
GOTO G0
NX BSF N,2
GOTO G0
PX BSF P,2
GOTO G0
QX BSF Q,2
GOTO G0
; This routine wastes time to appear to be thinking, it keeps LEDs cycling but
; does not look at keys or do any calculating.
; It is also the routine to display winning line flashing.
; 'Think' is similar to 'Display' but does no actions'
; variable U is incremented each loop, by testing the 5th bit each loop
; 50% of the time it will be a 1, and 50% of the time it will be zero
; this is used to flash the winning Red LEDs
THINK INCF U,1 ;increment U
BCF R,0 ;reset R the flag
MOVLW 0xFF
MOVWF PORTB
BSF PORTA,0 ;clear ports
BCF PORTA,2 ;clear ports
BCF PORTA,1 ;clear ports
BTFSS G,2 ;check the flag for RED
GOTO GD1 ;not set so jump
BTFSC G,7 ;check for winning line, No
jump next instruction
BTFSS U,5 ;Is winning, check Red, on or
off, jump if off
BSF PORTA,1 ;turn red on
BCF PORTB,0 ;square 1
GOTO GD2 ;don't check green (it was red)
GD1 BTFSS G,0 ;check the flag for GREEN
GOTO GD2 ;not Green so jump
BTFSC G,7
BTFSS U,5
BSF PORTB,0
BCF PORTA,2
BCF PORTA,1
BTFSS H,2
GOTO HD1
BTFSC H,7
BTFSS U,5
BSF PORTA,1 ;red
BCF PORTB,1 ;square 2
GOTO HD2
HD1 BTFSS H,0
GOTO HD2
BTFSC H,7
BTFSS U,5
BSF PORTA,2 ;green
BCF PORTB,1 ;square 2
HD2 CALL DISPLAY
BSF PORTB,1
BCF PORTA,2
BCF PORTA,1
BTFSS J,2
GOTO JD1
BTFSC J,7
BTFSS U,5
BSF PORTA,1 ;red
BCF PORTB,2 ;square 3
GOTO JD2
JD1 BTFSS J,0
GOTO JD2
BTFSC J,7
BTFSS U,5
BSF PORTA,2
BCF PORTB,2
JD2 CALL DISPLAY
BSF PORTB,2
BCF PORTA,2
BCF PORTA,1
BTFSS K,2
GOTO KD1
BTFSC K,7
BTFSS U,5
BSF PORTA,1 ;red
BCF PORTB,3 ;square 4
GOTO KD2
KD1 BTFSS K,0
GOTO KD2
BTFSC K,7
BTFSS U,5
BSF PORTA,2
BCF PORTB,3
KD2 CALL DISPLAY
BSF PORTB,3
BCF PORTA,2
BCF PORTA,1
BTFSS L,2
GOTO LD1
BTFSC L,7
BTFSS U,5
BSF PORTA,1 ;red
BCF PORTB,4 ;square 5
GOTO LD2
LD1 BTFSS L,0
GOTO LD2
BTFSC L,7
BTFSS U,5
BSF PORTA,2
BCF PORTB,4
LD2 CALL DISPLAY
BSF PORTB,4
BCF PORTA,2
BCF PORTA,1
BTFSS M,2
GOTO MD1
BTFSC M,7
BTFSS U,5
BSF PORTA,1 ;red
BCF PORTB,5 ;square 6
GOTO MD2
MD1 BTFSS M,0
GOTO MD2
BTFSC M,7
BTFSS U,5
BSF PORTA,2
BCF PORTB,5
MD2 CALL DISPLAY
BSF PORTB,5
BCF PORTA,2
BCF PORTA,1
BTFSS N,2
GOTO ND1
BTFSC N,7
BTFSS U,5
BSF PORTA,1 ;red
BCF PORTB,6 ;square 7
GOTO ND2
ND1 BTFSS N,0
GOTO ND2
BTFSC N,7
BTFSS U,5
BSF PORTA,2
BCF PORTB,6
ND2 CALL DISPLAY
BSF PORTB,6
BCF PORTA,2
BCF PORTA,1
BTFSS P,2
GOTO PD1
BTFSC P,7
BTFSS U,5
BSF PORTA,1 ;red
BCF PORTB,7 ;square 8
GOTO PD2
PD1 BTFSS P,0
GOTO PD2
BTFSC P,7
BTFSS U,5
BSF PORTA,2
BCF PORTB,7
PD2 CALL DISPLAY
BSF PORTB,7
BCF PORTA,2
BCF PORTA,1
BTFSS Q,2
GOTO QD1
BTFSC Q,7
BTFSS U,5
BSF PORTA,1 ;red
BCF PORTA,0 ;square 9
GOTO QD2
QD1 BTFSS Q,0
GOTO QD2
BTFSC Q,7
BTFSS U,5
BSF PORTA,2
BCF PORTA,0
QD2 CALL DISPLAY
RETURN