Page 3
Here is the program for TIC TAC TOE. Take it slowly and concentrate on one sub-routine at a time.
The layout of the program is as follows:
SetUp - sets up the ports, disables the comparators and clears the files.
Tables - tables of values for the attract mode
Att - Attract Mode. Produces the patterns on the display when the project is first turned on.
Raster - Puts anything on the 3x3 display - depending on the values you provide in a Table. 3-values are needed to produce a “cell.” In our case, Raster produces a “dot” moving around the display and uses Table 4.
The .asm and .hex files for Tic Tac Toe
;TicTacToe.asm ;Project: TIC TAC TOE ; use internal 4MHz oscillator LIST P=16F628 ;f=inhx8m #include "P16F628.inc" __CONFIG _CP_OFF &_BODEN_OFF &_PWRTE_OFF &_WDT_OFF &_LVP_OFF &_MCLRE_OFF &_INTRC_OSC_NOCLKOUT ORG 0 ;This is the start of memory for the program. SetUp MOVLW 07 ;Disable the comparators MOVWF 1Fh ;File 1F is the CMCON file BSF 03,5 ;Go to Bank 1 CLRF 06 ;Make all port B output MOVLW 18h ;Load W with 0001 1000 MOVWF 05 ;Make RA0,1,2,6,7 output and RA3, RA4 input BCF 03,5 ;Go to Bank 0 - the program memory area. CLRF 2F ;Clear the button-press file CLRF 05 ;Clear the output lines of PortA CLRF 06 ;Blank the output GOTO Att Table1 ADDWF 02,1 RETLW 31h RETLW 32h RETLW 33h RETLW 34h RETLW 35h RETLW 36h RETLW 37h RETLW 38h RETLW 39h RETLW 31h RETLW 34h RETLW 37h RETLW 32h RETLW 35h RETLW 38h RETLW 33h RETLW 36h RETLW 39h RETLW 31h RETLW 35h RETLW 39h RETLW 37h RETLW 35h RETLW 33h RETLW 31h RETLW 32h RETLW 33h RETLW 0FFh Table2 ADDWF 02,1 RETLW 31h RETLW 31h RETLW 33h RETLW 37h RETLW 39h RETLW 31h RETLW 33h RETLW 37h RETLW 39h Table3 ADDWF 02,1 RETLW 32h RETLW 32h RETLW 34h RETLW 36h RETLW 38h RETLW 32h RETLW 34h RETLW 36h RETLW 38h RETLW 32h RETLW 32h RETLW 34h RETLW 36h RETLW 38h RETLW 32h RETLW 34h RETLW 36h RETLW 38h Table4 ADDWF 02,1 RETLW 20h RETLW 00h RETLW 00h RETLW 08h RETLW 00h RETLW 00h RETLW 02h RETLW 00h RETLW 00h RETLW 00h RETLW 02h RETLW 00h RETLW 00h RETLW 00h RETLW 02h RETLW 00h RETLW 00h RETLW 08h RETLW 00h RETLW 00h RETLW 20h RETLW 00h RETLW 20h RETLW 00h RETLW 25h RETLW 15h RETLW 15h RETLW 19h RETLW 15h RETLW 15h RETLW 16h RETLW 15h RETLW 15h RETLW 15h RETLW 16h RETLW 15h RETLW 15h RETLW 15h RETLW 16h RETLW 15h RETLW 15h RETLW 19h RETLW 15h RETLW 15h RETLW 25h RETLW 15h RETLW 25h RETLW 15h RETLW 0FFh RETLW 0FFh Table5 ADDWF 02,1 RETLW 31h RETLW 33h RETLW 37h RETLW 39h RETLW 31h RETLW 33h RETLW 37h RETLW 39h RETLW 31h RETLW 32h RETLW 33h RETLW 34h RETLW 36h RETLW 37h RETLW 38h RETLW 39h RETLW 0FFh ;ATTRACT mode comes ON when the project is ; switched on. ;Push either button to get to TIC TAC TOE mode. Att MOVLW 10h MOVWF 22h ;File to be decremented Att1 MOVLW 15 MOVWF 06 MOVLW 20h MOVWF 23h Att2 BSF 05,0 CALL Del2 BCF 05,0 BSF 05,2 CALL Del2 BCF 05,2 BSF 05,1 CALL Del2 BCF 05,1 DECFSZ 23h,1 GOTO Att2 MOVLW 0FFh MOVWF 06 MOVLW 20h MOVWF 23h Att3 BSF 05,0 CALL Del2 BCF 05,0 BSF 05,2 CALL Del2 BCF 05,2 BSF 05,1 CALL Del2 BCF 05,1 DECFSZ 23h,1 GOTO Att3 MOVLW 2A MOVWF 06 MOVLW 20h MOVWF 23h Att4 BSF 05,0 CALL Del2 BCF 05,0 BSF 05,2 CALL Del2 BCF 05,2 BSF 05,1 CALL Del2 BCF 05,1 DECFSZ 23h,1 GOTO Att4 DECFSZ 22h,1 GOTO Att1 MOVLW 04 ;Create 4 cycles of green-to-red-to-green MOVWF 22h CLRF 20h CLRF 21h Att5 INCF 21h,1 MOVLW 08h MOVWF 27h Att6 MOVLW 04 MOVWF 06 BSF 05,2 MOVF 20h,0 MOVWF 25h Att7 DECFSZ 25h,1 GOTO Att7 MOVLW 08 MOVWF 06 BSF 05,2 MOVF 21h,0 MOVWF 26h Att8 DECFSZ 26h,1 GOTO Att8 DECFSZ 27h GOTO Att6 BTFSS 05,3 ;Test for ButtonA GOTO Preload BTFSS 05,4 ;Test for ButtonB GOTO Preload DECFSZ 20h,1 GOTO Att5 CLRF 20h CLRF 21h Att9 INCF 20h,1 MOVLW 08h MOVWF 27h Att10 MOVLW 04 MOVWF 06 BSF 05,2 MOVF 20h,0 MOVWF 25h Att11 DECFSZ 25h,1 GOTO Att11 MOVLW 08 MOVWF 06 BSF 05,2 MOVF 21h,0 MOVWF 26h Att12 DECFSZ 26h,1 GOTO Att12 DECFSZ 27h GOTO Att10 BTFSS 05,3 ;Test for ButtonA GOTO Preload BTFSS 05,4 ;Test for ButtonB GOTO Preload DECFSZ 21h,1 GOTO Att9 DECFSZ 22h GOTO Att5 GOTO Raster ;Not needed but tells you where micro is going ;Raster is a scanning program for the display ;Raster displays each row in turn and scans down the rows. It has a display time of 250mS ;Values on the display are taken from Table4 - 3 bytes are needed. ;Raster puts anything you want, on the display Raster CLRF 22h ;Jump value for table4 CLRF 05 Rast1 MOVLW 0Ch ;Number of scans for each increment of the display MOVWF 26h Rast2 MOVF 22h,0 ;Copy jump value into W CALL Table4 XORLW 0FFh ;See if end of table reached BTFSC 03,2 ;Test zero flag GOTO Raster ;Start again MOVF 22h,0 ;Copy jump value into W CALL Table4 ;Call Table4 again as value was lost via XORLW MOVWF 06 ;Move table value to display BSF 05,0 ;Turn on top row CALL Del2 ;Show top row BCF 05,0 ;Turn off top row INCF 22h,1 ;Increment the table pointer MOVF 22h,0 ;Copy jump value into W CALL Table4 ;Call Table4 MOVWF 06 ;Move table value to display BSF 05,2 ;Turn on middle row CALL Del2 ;Show middle row BCF 05,2 ;Turn off top row INCF 22h,1 ;Increment the table pointer MOVF 22h,0 ;Copy jump value into W CALL Table4 ;Call Table4 MOVWF 06 ;Move table value to display BSF 05,1 ;Turn on bottom row CALL Del2 ;Show bottom row BCF 05,1 ;Turn off bottom row DECF 22h,1 ;Decrement the table pointer DECF 22h,1 DECFSZ 26h,1 GOTO Rast2 INCF 22h,1 INCF 22h,1 INCF 22h,1 GOTO Rast1 ButtonA BSF 2F,0 ;Set button-press flag BTFSS 2F,3 ;Is Win-LED/stalemate bit=1? GOTO ButAA BCF 2F,3 BCF 05,6 BCF 05,7 MOVLW 05 ;Put cursor into "ready" file MOVWF 30h CLRF 31h CLRF 32h CLRF 33h CLRF 34h CLRF 35h CLRF 36h CLRF 37h CLRF 38h CLRF 39h CLRF 3Ah RETURN ButAA MOVLW 30h ;Start of "board" MOVWF 04 ;Start FSR at file 30h ButA1 BTFSC 00,3 ;Look for "8" GOTO ButA3 ;Found cursor BTFSS 00,0 GOTO ButA2 ;Cursor not found BTFSS 00,2 GOTO ButA2 GOTO ButA3 ;Found cursor ButA2 INCF 04 GOTO ButA1 ButA3 MOVLW 3Ah ;Has cursor reached end of "board?" XORWF 04,0 BTFSS 03,2 ;Test the zero flag GOTO ButA4 ;not at end of board CLRF 3Ah ;reached end of board MOVLW 05 MOVWF 30h ;Return cursor to start RETURN ButA4 CLRF 00 ;Clear the cursor ButA5 INCF 04,1 MOVLW 3A XORWF 04,0 ;If cursor has reached end of board, BTFSS 03,2 ; return it to file 30h GOTO ButA6 MOVLW 30h MOVWF 04 ;Return cursor to start ButA6 MOVLW 00 XORWF 00,0 ;Is board location empty? BTFSS 03,2 ;Test zero flag GOTO ButA5 ;Not empty MOVLW 05 ;Empty location MOVWF 00 ;Show cursor in new location RETURN ;ButtonB converts a flashing cursor into a red LED =01 ButtonB BSF 2F,1 ;Set button-press flag MOVLW 09 MOVWF 23h ;Decrementing file MOVLW 31h ;Start of "board" MOVWF 04 ;FSR starts at file 31h ButB1 MOVLW 05 XORWF 00,0 ;Is the file looked at by FSR=5? BTFSC 03,2 ;Test zero flag GOTO ButB2 ;Found MOVLW 08 ;Not found try "08" = flashing cursor XORWF 00,0 ;Is the file looked at by FSR=8? BTFSS 03,2 GOTO ButB3 ;Not found ButB2 MOVLW 01 ;Cursor found MOVWF 00 ;Make file = 1 = red MOVLW 05 MOVWF 30h ;Put cursor into "hide" file GOTO PWin ButB3 INCF 04,1 ;Increment the pointer DECFSZ 23h GOTO ButB1 GOTO PWin ;ButtonB pushed for computer goes first Del1 NOP ;Create delay DECFSZ 20h,1 GOTO Del1 RETURN Del2 NOP ;Create delay NOP NOP NOP NOP NOP NOP NOP DECFSZ 20h,1 GOTO Del2 BTFSS 05,3 ;Test for ButtonA GOTO Preload BTFSS 05,4 ;Test for ButtonB GOTO Preload RETURN ;Player WINS ;Check all possibilities for PLAYER WIN ;Looking for a HIGH in bit0 = 01 in three files ;This routine is in "Linear Programming Mode" PWin BTFSS 31h,0 GOTO PWin1 BTFSS 32h,0 GOTO PWin1 BTFSC 33h,0 GOTO PWin21 PWin1 BTFSS 34h,0 GOTO PWin2 BTFSS 35h,0 GOTO PWin2 BTFSC 36h,0 GOTO PWin21 PWin2 BTFSS 37h,0 GOTO PWin3 BTFSS 38h,0 GOTO PWin3 BTFSC 39h,0 GOTO PWin21 PWin3 BTFSS 31h,0 GOTO PWin4 BTFSS 34h,0 GOTO PWin4 BTFSC 37h,0 GOTO PWin21 PWin4 BTFSS 32h,0 GOTO PWin5 BTFSS 35h,0 GOTO PWin5 BTFSC 38h,0 GOTO PWin21 PWin5 BTFSS 33h,0 GOTO PWin6 BTFSS 36h,0 GOTO PWin6 BTFSC 39h,0 GOTO PWin21 PWin6 BTFSS 31h,0 GOTO PWin7 BTFSS 35h,0 GOTO PWin7 BTFSC 39h,0 GOTO PWin21 PWin7 BTFSS 33h,0 GOTO PWin8 BTFSS 35h,0 GOTO PWin8 BTFSC 37h,0 GOTO PWin21 PWin8 CALL Stale BTFSS 2F,3 GOTO CWin RETURN PWin21 BSF 05,6 ;Player WINS! BSF 2F,3 ;Set the Win-LED/stalemate bit RETURN ;Computer WINS ;Check all possibilities for "COMPUTER WINS" ;Looking for a HIGH in bit2 = 04 in 2 files ;This routine is in "Algorithm Mode" CWin MOVLW 0FFh ;The value will be incremented to 00! MOVWF 25h ;Table jump file CWin1 CLRF 27h ;Clear the Computer counter MOVLW 03 MOVWF 26h ;Fetch 3 table values in a loop. CWin2 INCF 25h,1 ;Increment the table-jump file MOVF 25h,0 ;Copy jump file into W CALL Table1 ;Get first table value XORLW 0FFh ;Look for end-of-table BTFSC 03,2 ;Test zero flag GOTO Stop ;End of table found - no result obtained MOVF 25h,0 ;Copy jump file into W again CALL Table1 ;Call table again as previous value was lost via XORLW MOVWF 04 ;Move table value into FSR BTFSC 00,0 ;Look for unwanted player piece DECF 27h,1 ;Dec. computer counter so count cannot be recognised BTFSC 00,2 ;Look at bit2 of file 31h (first table value) INCF 27h,1 ;Increment the Computer counter CWin3 DECFSZ 26h,1 ;Decrement the 3 table-values counter GOTO CWin2 ;Loop for next piece MOVLW 02 ;See if 2 computer pieces are found XORWF 27h,0 BTFSS 03,2 GOTO CWin1 ;2 computer pieces not found CWin4 MOVF 25h,0 ;2 Computer pieces found. Put 25h into W CALL Table1 ;Locate table value MOVWF 04 ;Put W into FSR MOVF 00,1 ;Move value in file in and out to see if it is zero BTFSS 03,2 ;Test zero flag GOTO CWin5 ;Not zero MOVLW 04 ;Square is zero. Load computer piece MOVWF 00 BSF 05,7 ;Computer WINS! BSF 2F,3 ;Set the Win-LED/stalemate bit RETURN CWin5 DECF 25h,1 GOTO CWin4 ;Look for a "stopper" ;Any row or diagonal containing a "2" must be stopped ; i.e: two files in a row or diag with 01 Stop MOVLW 0FFh ;The value will be incremented to 00! MOVWF 25h ;Table jump file Stop1 CLRF 27h ;Clear the "player" counter MOVLW 04 ;This will be decremented to 3! MOVWF 26h ;Fetch 3 table-values in a loop. Stop2 DECFSZ 26h,1 GOTO Stop2A GOTO Stop4 ;3 values have been processed Stop2A INCF 25h,1 ;Increment the table-jump file MOVF 25h,0 ;Copy jump file into W CALL Table1 ;Get first table value MOVWF 04 ;Move table value into FSR BTFSC 00,7 ;Look for end-of-table GOTO Corner ;End of table found - no result obtained BTFSC 00,2 ;Look at bit2 of file 31h for computer piece GOTO Stop3 ;Computer piece found BTFSC 00,0 ;Look at bit0 of file 31h (first table value) INCF 27h,1 ;Increment the "player" counter GOTO Stop2 Stop3 BSF 27h,7 ;Set bit 7 of "player" counter GOTO Stop2 Stop4 BTFSC 27h,7 ;Is computer in the row? GOTO Stop1 BTFSS 27h,1 ;Is counter=2? GOTO Stop1 DECF 25h,1 ;Two player files found! Go back to start of the 3 files. DECF 25h,1 ;Take table-jump value up-table Stop5 MOVF 25h,0 ;Start of the three files. Move Jump value into W CALL Table1 ;Look at value of first of three files. MOVWF 04 ;Put jump value into FSR BTFSC 00,0 ;Test for player GOTO Stop6 ;Not empty MOVLW 04 ;Empty so put 04 into file looked at by FSR MOVWF 00 RETURN Stop6 INCF 25h,1 ;Increment the pointer GOTO Stop5 ;Random Corner if first move. ;Look to see if all locations are empty. ;Place Computer value in a corner. Corner MOVLW 09 MOVWF 25h ;The loop file MOVLW 30h ;This will be incremented before starting routine MOVWF 04 ;The pointer file Corner1 INCF 04,1 ;Look at first board location MOVLW 00 ;Put 00 into W XORWF 00,0 ;Is location empty? BTFSS 03,2 ;Test the zero flag GOTO Center ;Location is not empty DECFSZ 25h,1 ;File is zero. Decrement the loop file GOTO Corner1 ;Loop again MOVLW 07 ;Board is empty. Put masking value (7) into W ANDWF 28h,1 ;AND 07 with random number file. Result in 28h INCF 28h,1 ;File will be 1 to 8 MOVF 28h,0 ;Put value in file 28 into W CALL Table2 ;Fetch random corner from table MOVWF 04 ;Put random corner into FSR MOVLW 04 MOVWF 00 ;Put computer piece onto board RETURN ;If board is not empty, place computer in center square Center MOVF 35h,1 ;Move 35h in and out of file to see if it is zero BTFSS 03,2 ;Test zero flag GOTO Fork MOVLW 04 MOVWF 35h ;Put computer into center square RETURN ;This is a "trick" situation where the player is ; forming a "fork." If two player and one ; computer piece is found, and computer is in ; middle, computer plays a side square Fork BTFSS 35h,2 ;Is computer in centre square? GOTO Look4 ;Not computer piece BTFSS 31h,0 ;Computer in centre. Is player in first square? GOTO ForkA ;Player not in first square BTFSC 39h,0 ;Player in first square. Is player in last square? GOTO ForkB ;Player in last square ForkA BTFSS 33h,0 GOTO Divide BTFSS 37h,0 GOTO Divide ForkB MOVLW 07 ;Get a random value. Put masking value (7) into W ANDWF 28h,1 ;AND 07 with random number file. Result in file INCF 28h,1 ;File will be 1 to 8 MOVF 28h,0 ;Put value in file 28 into W CALL Table3 ;Fetch random side from table MOVWF 04 ;Put random side into FSR MOVF 00,1 ;Move side value in and out of file to see if it is zero BTFSS 03,2 GOTO ForkB ;Side not empty MOVLW 04 MOVWF 00 ;Put computer piece onto board RETURN ;Divide is another "trick" situation. ;If computer in centre and player on two adjoining sides ; computer must go between player pieces. Divide BTFSC 31h,0 ;Test for player in first square GOTO Look4 BTFSC 31h,2 ;Test for computer in first square GOTO Look4 BTFSC 32h,0 ;Test for player in second square GOTO Look4 BTFSC 32h,2 ;Test for computer in second square GOTO Look4 BTFSC 33h,0 ;Test for player in third square GOTO Look4 BTFSC 33h,2 ;Test for computer in third square GOTO Look4 BTFSC 34h,0 ;Test for player in fourth square GOTO Look4 BTFSC 34h,2 ;Test for computer in fourth square GOTO Look4 BTFSS 35h,2 ;Look for computer in centre square GOTO Look4 BTFSS 36h,0 ;Test for player in sixth square GOTO Look4 BTFSC 37h,0 ;Test for player in seventh square GOTO Look4 BTFSC 37h,2 ;Test for computer in seventh square GOTO Look4 BTFSS 38h,0 ;Test for player in eighth square GOTO Look4 BTFSC 39h,0 ;Test for player in ninth square GOTO Look4 BTFSC 39h,2 ;Look for computer in last location GOTO Look4 MOVLW 04 MOVWF 39h ;Put computer piece into last location RETURN ;Look for a row containing just a computer piece (04) ;and add another computer piece. If not, add a random ; computer piece. Look4 MOVLW 0FFh ;The value will be incremented to 00! MOVWF 25h ;Table jump file Look4A CLRF 27h ;Clear the Look counter MOVLW 03 MOVWF 26h ;Fetch 3 table values in a loop. Look4B INCF 25h,1 ;Increment the table-jump file MOVF 25h,0 ;Copy jump file into W CALL Table1 ;Get first table value MOVWF 04 ;Move table value into FSR BTFSC 00,7 ;Look for end-of-table GOTO Random ;End of table found - no result obtained BTFSC 00,2 ;Look for computer GOTO Look4L BTFSS 00,0 ;Look for player GOTO Look4C INCF 27h,1 ;Prevent row being accessed Look4L INCF 27h,1 ;Increment the Look counter (If=1, Computer only once) Look4C DECFSZ 26h,1 ;Decrement the 3 table-values counter GOTO Look4B MOVLW 01 XORWF 27h,1 BTFSS 03,2 GOTO Look4A ;Computer nil or more than once DECF 25h,1 ;Computer only once. Find start of row DECF 25h,1 Look4G MOVF 25h,0 ;Move 25h into W CALL Table1 MOVWF 04 ;Move table value into pointer MOVF 00,1 ;Move file in and out to see it is zero BTFSS 03,2 ;Test zero flag GOTO Look4H MOVLW 04 ;Square is empty MOVWF 00 ;Put computer piece into empty square RETURN Look4H INCF 25h,1 INCF 25h,1 ;Place computer piece only in corner! GOTO Look4G ;Insert a random computer piece ;corners are first selected Random MOVLW 03 ;Put masking value (3) into W ANDWF 28h,1 ;AND 03 with random number file. Result in file Random1 INCF 28h,1 ;File will be 1 to 4 on first pass. MOVF 28h,0 ;Put value into W CALL Table5 ;Fetch random location from table MOVWF 04 ;Put random location into FSR BTFSC 00,7 ;Test for end-of-table RETURN MOVF 00,1 ;Move value in and out of file to see if it is zero BTFSS 03,2 ;Test the zero-bit GOTO Random1 ;location not empty MOVLW 04 MOVWF 00 ;Put computer piece onto board RETURN ;STALEMATE ;Board is checked to see if any square is empty ;If all full, both LEDs are illuminated Stale BTFSC 05,6 ;Check Player-WINS! bit RETURN MOVLW 09 MOVWF 25h ;Decrementing file MOVLW 31h MOVWF 04 ;Start of files into FSR Stale1 MOVLW 05 XORWF 00,0 BTFSC 03,2 RETURN ;Square has cursor BTFSC 00,3 ;Test for "hidden" cursor RETURN MOVLW 00 XORWF 00,0 ;Test zero flag BTFSC 03,2 ;Square is empty RETURN ;Square is full. Increment the pointer INCF 04,1 DECFSZ 25h,1 GOTO Stale1 BSF 05,6 BSF 05,7 ;Set the Win-LED/stalemate bit BSF 2F,3 RETURN Preload MOVLW 05 ;Put cursor into "ready" file MOVWF 30h CLRF 31h CLRF 32h CLRF 33h CLRF 34h CLRF 35h CLRF 36h CLRF 37h CLRF 38h CLRF 39h CLRF 3Ah BTFSS 05,3 ;Make sure button "A" is released GOTO Preload BTFSS 05,4 ;Make sure button "B" is released GOTO Preload GOTO Main ;Go to Main ;Player Value = 01 = red ;Computer Value = 04 = green ;Cursor = 05 Main MOVLW 20h ;Loops of Main for flashing cursor MOVWF 22h ;File to decrement MainA BTFSC 2F,0 ;ButtonA pressed first time? GOTO MainB BTFSS 05,3 ;Test for ButtonA CALL ButtonA MainB BTFSC 2F,1 ;ButtonB pressed first time? GOTO MainC BTFSS 05,4 ;Test for ButtonB CALL ButtonB MainC BTFSS 31h,0 GOTO Main1 BSF 06,5 Main1 BTFSS 31h,2 GOTO Main2 BSF 06,4 Main2 BTFSS 32h,0 GOTO Main3 BSF 06,3 Main3 BTFSS 32h,2 GOTO Main4 BSF 06,2 Main4 BTFSS 33h,0 GOTO Main5 BSF 06,1 Main5 BTFSS 33h,2 GOTO Main6 BSF 06,0 Main6 BSF 05,0 CALL Del1 BCF 05,0 CLRF 06 CALL Del1 BTFSS 34h,0 GOTO Main7 BSF 06,5 Main7 BTFSS 34h,2 GOTO Main8 BSF 06,4 Main8 BTFSS 35h,0 GOTO Main9 BSF 06,3 Main9 BTFSS 35h,2 GOTO Main10 BSF 06,2 Main10 BTFSS 36h,0 GOTO Main11 BSF 06,1 Main11 BTFSS 36h,2 GOTO Main12 BSF 06,0 Main12 BSF 05,2 CALL Del1 BCF 05,2 CLRF 06 CALL Del1 BTFSS 37h,0 GOTO Main13 BSF 06,5 Main13 BTFSS 37h,2 GOTO Main14 BSF 06,4 Main14 BTFSS 38h,0 GOTO Main15 BSF 06,3 Main15 BTFSS 38h,2 GOTO Main16 BSF 06,2 Main16 BTFSS 39h,0 GOTO Main17 BSF 06,1 Main17 BTFSS 39h,2 GOTO Main18 BSF 06,0 Main18 BSF 05,1 CALL Del1 BCF 05,1 CLRF 06 BTFSC 05,3 ;Skip if ButtonA is still pressed BCF 2F,0 ;Clear button-press flag BTFSC 05,4 ;Skip if ButtonB is still pressed BCF 2F,1 ;Clear button-press flag DECFSZ 22h,1 GOTO MainA ;The following section hides and shows cursor ;If cursor is showing, it hides cursor ;If cursor is hidden, it shows cursor ;Cursor changes from 05 to 08 to 05 etc MOVLW 0A ;Ten loops of routine MOVWF 23h ;Loop file MOVLW 30h ;Start of files for board MOVWF 04 ;Load start into FSR Main19 BTFSS 00,0 ;Test bit0 of INDF GOTO Main20 BTFSS 00,2 ;Is bit2 = HIGH? GOTO Main20 MOVLW 08 ;File contains cursor. Put 08 into file to "hide" MOVWF 00 ;08 will be put into a file 30h to 39h GOTO Main ;Cursor has been hidden Main20 INCF 04,1 ;Increment pointer DECFSZ 23h,1 ;Decrement loop file GOTO Main19 MOVLW 30h ;Start of files for board MOVWF 04 ;Load start into FSR Main21 BTFSC 00,3 ;Look for "8" in a file GOTO Main22 INCF 04,1 ;Increment the pointer GOTO Main21 Main22 MOVLW 05 ;Put 5 in file looked at by FSR MOVWF 00h INCF 28h ;Increment the RANDOM NUMBER file INCF 28h CALL Stale GOTO Main END ;Tells assembler end of program
Quick Links
Legal Stuff
Social Media