{"id":227,"date":"2026-08-28T07:51:51","date_gmt":"2026-08-28T07:51:51","guid":{"rendered":"https:\/\/permacomputer.solarpunk.au\/?p=227"},"modified":"2026-08-28T07:58:39","modified_gmt":"2026-08-28T07:58:39","slug":"microchess-for-the-kim-1","status":"publish","type":"post","link":"https:\/\/permacomputer.solarpunk.au\/?p=227","title":{"rendered":"Microchess for the KIM-1"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/obsolescenceguaranteed.blogspot.com\/2014\/06\/6502-microchess-on-arduino.html\">https:\/\/obsolescenceguaranteed.blogspot.com\/2014\/06\/6502-microchess-on-arduino.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.benlo.com\/microchess\/index.html\">https:\/\/www.benlo.com\/microchess\/index.html<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Game Hex Dump<\/h1>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"950\" src=\"https:\/\/permacomputer.solarpunk.au\/wp-content\/uploads\/2026\/08\/micro-chess-hexdump.gif\" alt=\"\" class=\"wp-image-230\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Assembly Listing<\/h1>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>;***********************************************************************\n;\n;  Kim-1 MicroChess (c) 1976-2005 Peter Jennings, www.benlo.com \n;\n;***********************************************************************\n\n; All rights reserved.\n\n; Redistribution and use in source and binary forms, with or without\n; modification, are permitted provided that the following conditions\n; are met:\n; 1. Redistributions of source code must retain the above copyright\n;    notice, this list of conditions and the following disclaimer.\n; 2. Redistributions in binary form must reproduce the above copyright\n;    notice, this list of conditions and the following disclaimer in the\n;    documentation and\/or other materials provided with the distribution.\n; 3. The name of the author may not be used to endorse or promote products\n;    derived from this software without specific prior written permission.\n\n; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR\n; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n;\n; modified by Daryl Rictor to work over a \n; serial terminal connection, August 2002.\n;\n; Updated with corrections to earlier OCR errors by Bill Forster, August 2005.\n;\n   cpu 65c02\n   page 0,132\n;\n; 6551 I\/O Port Addresses\n;\nACIADat\t= \t$7F70\nACIASta\t=\t$7F71\nACIACmd\t=\t$7F72\nACIACtl\t=\t$7F73\n;\n; page zero variables\n;\nBOARD   =\t$50 \nBK      =\t$60 \nPIECE   =\t$B0 \nSQUARE  =\t$B1 \nSP2     =\t$B2 \nSP1     =\t$B3 \nINCHEK  =\t$B4 \nSTATE   =\t$B5 \nMOVEN   =\t$B6 \nREV\t=       $B7\nOMOVE   =\t$DC \nWCAP0   =\t$DD \nCOUNT   =\t$DE \nBCAP2   =\t$DE \nWCAP2   =\t$DF \nBCAP1   =\t$E0 \nWCAP1   =\t$E1 \nBCAP0   =\t$E2 \nMOB     =\t$E3 \nMAXC    =\t$E4 \nCC      =\t$E5 \nPCAP    =\t$E6 \nBMOB    =\t$E3 \nBMAXC   =\t$E4 \nBMCC    =\t$E5 \t\t; was BCC (TASS doesn't like it as a label)\nBMAXP   =\t$E6 \nXMAXC   =\t$E8 \nWMOB    =\t$EB \nWMAXC   =\t$EC \nWCC     =\t$ED \nWMAXP   =\t$EE \nPMOB    =\t$EF \nPMAXC   =\t$F0 \nPCC     =\t$F1 \nPCP     =\t$F2 \nOLDKY   =\t$F3 \nBESTP   =\t$FB \nBESTV   =\t$FA \nBESTM   =\t$F9 \nDIS1    =\t$FB \nDIS2    =\t$FA \nDIS3    =\t$F9 \ntemp    =       $FC\n;\n;\n;\n\t\t*=$1000\t\t\t; load into RAM @ $1000-$15FF\n\n\t\tLDA     #$00\t\t; REVERSE TOGGLE\n\t\tSTA     REV\n                JSR     Init_6551\nCHESS\t\tCLD\t\t\t; INITIALIZE\n\t\tLDX\t#$FF\t\t; TWO STACKS\n\t\tTXS\t\n\t\tLDX\t#$C8\n\t\tSTX\tSP2\n;\t\t\n;       ROUTINES TO LIGHT LED\n;       DISPLAY AND GET KEY\n;       FROM KEYBOARD\n;\t\t\nOUT\t\tJSR\tpout\t\t; DISPLAY AND\n\t\tJSR\tKIN\t\t; GET INPUT   *** my routine waits for a keypress\n;\t\tCMP\tOLDKY\t\t; KEY IN ACC  *** no need to debounce\n;\t\tBEQ\tOUT\t\t; (DEBOUNCE)\n;\t\tSTA\tOLDKY\n;\t\t\n\t\tCMP\t#$43\t\t; &#91;C]\n\t\tBNE\tNOSET\t\t; SET UP\n\t\tLDX\t#$1F\t\t; BOARD\nWHSET\t\tLDA\tSETW,X\t\t; FROM\n\t\tSTA\tBOARD,X\t\t; SETW\n\t\tDEX\t\n\t\tBPL\tWHSET\n\t\tLDX\t#$1B\t\t; *ADDED\n\t\tSTX\tOMOVE\t\t; INITS TO $FF\n\t\tLDA\t#$CC\t\t; Display CCC\n\t\tBNE\tCLDSP\n;\t\t\nNOSET\t\tCMP\t#$45\t\t; &#91;E]\n\t\tBNE\tNOREV\t\t; REVERSE\n\t\tJSR\tREVERSE        \t; BOARD IS\n\t\tSEC\n\t\tLDA\t#$01\n\t\tSBC\tREV\n\t\tSTA\tREV\t\t; TOGGLE REV FLAG\n\t\tLDA\t#$EE            ; IS\n\t\tBNE\tCLDSP\n;\t\t\nNOREV\t\tCMP\t#$40\t\t\t; &#91;P]\n\t\tBNE\tNOGO           \t; PLAY CHESS\n\t\tJSR\tGO\nCLDSP\t\tSTA\tDIS1          \t; DISPLAY\n\t\tSTA\tDIS2         \t; ACROSS\n\t\tSTA\tDIS3          \t; DISPLAY\n\t\tBNE\tCHESS\n;\t\t\nNOGO\t\tCMP\t#$0D            ; &#91;Enter]\n\t\tBNE\tNOMV          \t; MOVE MAN\n\t\tJSR\tMOVE          \t; AS ENTERED\n\t\tJMP\tDISP\nNOMV\t\tCMP     #$41\t\t; &#91;Q] ***Added to allow game exit***\n\t\tBEQ     DONE\t\t; quit the game, exit back to system.  \n\t\tJMP\tINPUT\t\t; process move\nDONE\t\tJMP     $FF00\t\t; *** MUST set this to YOUR OS starting address\n;\t\t\n;       THE ROUTINE JANUS DIRECTS THE\n;       ANALYSIS BY DETERMINING WHAT\n;       SHOULD OCCUR AFTER EACH MOVE\n;       GENERATED BY GNM\n;\t\t\n;\t\t\n;\nJANUS\t\tLDX\tSTATE\n\t\tBMI\tNOCOUNT\n;\t\t\n;       THIS ROUTINE COUNTS OCCURRENCES\n;       IT DEPENDS UPON STATE TO INDEX\n;       THE CORRECT COUNTERS\n;\t\t\nCOUNTS\t\tLDA\tPIECE\n\t\tBEQ\tOVER           \t; IF STATE=8\n\t\tCPX \t#$08           \t; DO NOT COUNT\n\t\tBNE\tOVER          \t; BLK MAX CAP\n\t\tCMP\tBMAXP        \t; MOVES FOR\n\t\tBEQ\tXRT           \t; WHITE\n; \t\t\nOVER\t\tINC\tMOB,X          \t; MOBILITY\n\t\tCMP \t#$01           \t;  + QUEEN\n\t\tBNE\tNOQ           \t; FOR TWO\n\t\tINC\tMOB,X\n;\t\t\nNOQ\t\tBVC\tNOCAP\n\t\tLDY\t#$0F           \t; CALCULATE\n\t\tLDA\tSQUARE       \t; POINTS\nELOOP\t\tCMP\tBK,Y           \t; CAPTURED\n\t\tBEQ\tFOUN          \t; BY THIS\n\t\tDEY\t\t\t; MOVE\n\t\tBPL\tELOOP\nFOUN\t\tLDA\tPOINTS,Y\n\t\tCMP\tMAXC,X\n\t\tBCC\tLESS          \t; SAVE IF\n\t\tSTY\tPCAP,X         \t; BEST THIS\n\t\tSTA\tMAXC,X         \t; STATE\n;\t\t\nLESS\t\tCLC\t\n\t\tPHP\t\t\t; ADD TO\n\t\tADC\tCC,X           \t; CAPTURE\n\t\tSTA\tCC,X           \t; COUNTS\n\t\tPLP\t\n;\t\t\nNOCAP\t\tCPX\t#$04\n\t\tBEQ\tON4\n\t\tBMI\tTREE          \t;(=00 ONLY)\nXRT\t\tRTS\t\n;\t\t\n;      GENERATE FURTHER MOVES FOR COUNT\n;      AND ANALYSIS\t\n;\t\t\nON4\t\tLDA\tXMAXC        \t; SAVE ACTUAL \n\t\tSTA\tWCAP0         \t; CAPTURE\n\t\tLDA\t#$00           \t; STATE=0\n\t\tSTA\tSTATE\n\t\tJSR\tMOVE          \t; GENERATE\n\t\tJSR\tREVERSE       \t; IMMEDIATE\n\t\tJSR\tGNMZ         \t; REPLY MOVES  \n\t\tJSR\tREVERSE\n;\t\t\n\t\tLDA\t#$08       \t; STATE=8\n\t\tSTA\tSTATE        \t; GENERATE\n\t\tJSR\tGNM          \t; CONTINUATION\n\t\tJSR\tUMOVE         \t; MOVES\n;\t\t\n\t\tJMP\tSTRATGY       \t; FINAL EVALUATION\nNOCOUNT\tCPX\t#$F9\n\t\tBNE\tTREE\n;\t\t\n;      DETERMINE IF THE KING CAN BE\n;      TAKEN, USED BY CHKCHK\n;\t\t\n\t\tLDA\tBK           \t; IS KING\n\t\tCMP\tSQUARE       \t; IN CHECK?\n\t\tBNE\tRETJ          \t; SET INCHEK=0\n\t\tLDA\t#$00           \t; IF IT IS\n\t\tSTA\tINCHEK\nRETJ\t\tRTS\t\n;\t\t\n;      IF A PIECE HAS BEEN CAPTURED BY\n;      A TRIAL MOVE, GENERATE REPLIES &amp;\n;      EVALUATE THE EXCHANGE GAIN\/LOSS\n;\t\t\nTREE\t\tBVC\tRETJ          \t; NO CAP\n\t\tLDY\t#$07           \t; (PIECES)\n\t\tLDA\tSQUARE\nLOOPX\t\tCMP\tBK,Y\n\t\tBEQ\tFOUNX\n\t\tDEY\t\n\t\tBEQ\tRETJ          \t; (KING)\n\t\tBPL\tLOOPX         \t; SAVE\nFOUNX\t\tLDA\tPOINTS,Y       \t; BEST CAP\n\t\tCMP\tBCAP0,X        \t; AT THIS\n\t\tBCC\tNOMAX         \t; LEVEL\n\t\tSTA\tBCAP0,X\nNOMAX\t\tDEC\tSTATE\n\t\tLDA\t#$FB           \t; IF STATE=FB\n\t\tCMP\tSTATE        \t; TIME TO TURN\n\t\tBEQ\tUPTREE        \t; AROUND\n\t\tJSR\tGENRM         \t; GENERATE FURTHER\nUPTREE\t\tINC\tSTATE        \t; CAPTURES\n\t\tRTS\t\n;\t\t\n;      THE PLAYER'S MOVE IS INPUT\n;\t\t\nINPUT\t\tCMP\t#$08           \t; NOT A LEGAL\n\t\tBCS\tERROR      \t; SQUARE #\n\t\tJSR\tDISMV\nDISP\t\tLDX\t#$1F\nSEARCH\t\tLDA\tBOARD,X\n\t\tCMP\tDIS2\n\t\tBEQ\tHERE          \t; DISPLAY\n\t\tDEX\t\t\t; PIECE AT    \n\t\tBPL\tSEARCH        \t; FROM\nHERE\t\tSTX\tDIS1         \t; SQUARE\n\t\tSTX\tPIECE\nERROR\t\tJMP\tCHESS\n;\t\t\n;      GENERATE ALL MOVES FOR ONE\n;      SIDE, CALL JANUS AFTER EACH\n;      ONE FOR NEXT STEP\n;\t\t\n;\nGNMZ\t\tLDX\t#$10            ; CLEAR\nGNMX\t\tLDA\t#$00            ; COUNTERS\nCLEAR\t\tSTA\tCOUNT,X\n\t\tDEX\t\n\t\tBPL\tCLEAR\n;\t\t\nGNM\t\tLDA\t#$10            ; SET UP\n\t\tSTA\tPIECE        \t; PIECE\nNEWP\t\tDEC\tPIECE        \t; NEW PIECE\n\t\tBPL\tNEX           \t; ALL DONE?\n\t\tRTS\t\t\t;    -YES\n;\t\t\nNEX\t\tJSR\tRESET        \t; READY\n\t\tLDY\tPIECE        \t; GET PIECE\n\t\tLDX\t#$08\n\t\tSTX\tMOVEN        \t; COMMON START\n\t\tCPY\t#$08            ; WHAT IS IT?\n\t\tBPL\tPAWN          \t; PAWN\n\t\tCPY\t#$06\n\t\tBPL\tKNIGHT        \t; KNIGHT\n\t\tCPY\t#$04\n\t\tBPL\tBISHOP       \t; BISHOP\n\t\tCPY\t#$01\n\t\tBEQ\tQUEEN         \t; QUEEN\n\t\tBPL\tROOK          \t; ROOK\n;\t\t\nKING\t\tJSR\tSNGMV         \t; MUST BE KING!\n\t\tBNE\tKING          \t; MOVES\n\t\tBEQ\tNEWP          \t; 8 TO 1\nQUEEN\t\tJSR\tLINE\n\t\tBNE\tQUEEN         \t; MOVES\n\t\tBEQ\tNEWP          \t; 8 TO 1\n;\t\t\nROOK\t\tLDX\t#$04\n\t\tSTX\tMOVEN        \t; MOVES\nAGNR\t\tJSR\tLINE          \t; 4 TO 1\n\t\tBNE\tAGNR\n\t\tBEQ\tNEWP\n;\t\t\nBISHOP\t\tJSR\tLINE\n\t\tLDA\tMOVEN        \t; MOVES\n\t\tCMP\t#$04           \t; 8 TO 5\n\t\tBNE\tBISHOP\n\t\tBEQ\tNEWP\n;\t\t\nKNIGHT\t\tLDX\t#$10\n\t\tSTX\tMOVEN        \t; MOVES\nAGNN\t\tJSR\tSNGMV         \t; 16 TO 9\n\t\tLDA\tMOVEN\n\t\tCMP\t#$08\n\t\tBNE\tAGNN\n\t\tBEQ\tNEWP\n;\t\t\nPAWN\t\tLDX\t#$06\n\t\tSTX\tMOVEN\nP1\t\tJSR\tCMOVE         \t; RIGHT CAP?\n\t\tBVC\tP2\n\t\tBMI\tP2\n\t\tJSR\tJANUS         \t; YES\nP2\t\tJSR\tRESET\n\t\tDEC\tMOVEN        \t; LEFT CAP?\n\t\tLDA\tMOVEN\n\t\tCMP\t#$05\n\t\tBEQ\tP1\nP3\t\tJSR\tCMOVE         \t; AHEAD\n\t\tBVS\tNEWP          \t; ILLEGAL\n\t\tBMI\tNEWP\n\t\tJSR\tJANUS\n\t\tLDA\tSQUARE       \t; GETS TO\n\t\tAND\t#$F0           \t; 3RD RANK?\n\t\tCMP\t#$20\n\t\tBEQ\tP3            \t; DO DOUBLE\n\t\tJMP\tNEWP\n;\t\t\n;      CALCULATE SINGLE STEP MOVES\n;      FOR K,N\t\n;\t\t\nSNGMV\t\tJSR\tCMOVE        \t; CALC MOVE\n\t\tBMI\tILL1           \t; -IF LEGAL\n\t\tJSR\tJANUS           ; -EVALUATE\nILL1\t\tJSR\tRESET\n\t\tDEC\tMOVEN\n\t\tRTS\t\n;\t\t\n;     CALCULATE ALL MOVES DOWN A\n;     STRAIGHT LINE FOR Q,B,R\n;\t\t\nLINE\t\tJSR\tCMOVE         \t; CALC MOVE\n\t\tBCC\tOVL            \t; NO CHK\n\t\tBVC\tLINE\t\t; NOCAP       \nOVL\t\tBMI\tILL             ; RETURN\n\t\tPHP\t\n\t\tJSR\tJANUS         \t; EVALUATE POSN\n\t\tPLP\t\n\t\tBVC\tLINE          \t; NOT A CAP\nILL\t\tJSR\tRESET         \t; LINE STOPPED\n\t\tDEC\tMOVEN         \t; NEXT DIR\n\t\tRTS\t\n;\t\t\n;      EXCHANGE SIDES FOR REPLY\n;      ANALYSIS\t\n;\t\t\nREVERSE\t\tLDX\t#$0F\nETC\t\tSEC\t\n\t\tLDY\tBK,X           \t; SUBTRACT\n\t\tLDA \t#$77           \t; POSITION\n\t\tSBC  \tBOARD,X        \t; FROM 77\n\t\tSTA  \tBK,X\n\t\tSTY  \tBOARD,X         ; AND\n\t\tSEC\t\n\t\tLDA\t#$77           \t; EXCHANGE\n\t\tSBC \tBOARD,X        \t; PIECES\n\t\tSTA  \tBOARD,X\n\t\tDEX\t\n\t\tBPL   \tETC\n\t\tRTS\t\n;\t\t\n;        CMOVE CALCULATES THE TO SQUARE\n;        USING SQUARE AND THE MOVE\n;       TABLE,  FLAGS SET AS FOLLOWS:\n;       N - ILLEGAL MOVE\n;       V - CAPTURE (LEGAL UNLESS IN CH)\n;       C - ILLEGAL BECAUSE OF CHECK\n;       &#91;MY THANKS TO JIM BUTTERFIELD\n;        WHO WROTE THIS MORE EFFICIENT\n;        VERSION OF CMOVE]\n;\t\t\nCMOVE\t\tLDA\tSQUARE       \t; GET SQUARE\n\t\tLDX\tMOVEN       \t; MOVE POINTER\n\t\tCLC\t\n\t\tADC\tMOVEX,X        \t; MOVE LIST\n\t\tSTA\tSQUARE       \t; NEW POS'N\n\t\tAND\t#$88\n\t\tBNE\tILLEGAL       \t; OFF BOARD\n\t\tLDA\tSQUARE\n;\t\t\t\n\t\tLDX\t#$20\nLOOP\t\tDEX\t\t\t; IS TO\n\t\tBMI\tNO            \t; SQUARE\n\t\tCMP  \tBOARD,X        \t; OCCUPIED?\n\t\tBNE   \tLOOP\n;\t\t\t\n\t\tCPX\t#$10            ; BY SELF?\n\t\tBMI   \tILLEGAL\n;\t\t\t\n\t\tLDA\t#$7F\t\t; MUST BE CAP!\n\t\tADC\t#$01            ; SET V FLAG\n\t\tBVS   \tSPX \t        ; (JMP)\n;\t\t\t\nNO\t\tCLV\t\t\t; NO CAPTURE\n;\t\t\t\nSPX\t\tLDA  \tSTATE         \t; SHOULD WE\n\t\tBMI   \tRETL           \t; DO THE\n\t\tCMP\t#$08 \t        ; CHECK CHECK?\n\t\tBPL  \tRETL\n;\t\t\t\n;        CHKCHK REVERSES SIDES\n;       AND LOOKS FOR A KING\n;       CAPTURE TO INDICATE\n;       ILLEGAL MOVE BECAUSE OF\n;       CHECK  SINCE THIS IS\n;       TIME CONSUMING, IT IS NOT\n;       ALWAYS DONE\t\n;\t\t\nCHKCHK\t        PHA\t\t\t; STATE\n\t\tPHP\t\n\t\tLDA\t#$F9\n\t\tSTA\tSTATE         \t; GENERATE\n\t\tSTA\tINCHEK        \t; ALL REPLY\n\t\tJSR\tMOVE          \t; MOVES TO\n\t\tJSR\tREVERSE       \t; SEE IF KING\n\t\tJSR\tGNM           \t; IS IN\n\t\tJSR\tRUM           \t; CHECK\n\t\tPLP\t\n\t\tPLA\t\n\t\tSTA\tSTATE\n\t\tLDA\tINCHEK\n\t\tBMI\tRETL           \t; NO - SAFE\n\t\tSEC\t\t\t; YES - IN CHK\n\t\tLDA\t#$FF\n\t\tRTS\t\n;\t\t\nRETL\t\tCLC\t\t\t; LEGAL\n\t\tLDA\t#$00            ; RETURN\n\t\tRTS\t\n;\t\t\nILLEGAL\tLDA\t#$FF\n\t\tCLC\t\t\t; ILLEGAL\n\t\tCLV\t\t\t; RETURN\n\t\tRTS\t\n;\t\t\n;       REPLACE PIECE ON CORRECT SQUARE\n;\t\t\nRESET\t\tLDX\tPIECE      \t; GET LOGAT\n\t\tLDA\tBOARD,X        \t; FOR PIECE\n\t\tSTA\tSQUARE       \t; FROM BOARD\n\t\tRTS\t\n;\t\t\n;\t\t\n;\t\t\nGENRM\t\tJSR\tMOVE          \t; MAKE MOVE\nGENR2\t\tJSR\tREVERSE      \t; REVERSE BOARD\n\t\tJSR\tGNM          \t; GENERATE MOVES\nRUM\t\tJSR\tREVERSE   \t; REVERSE BACK\n;\t\t\n;       ROUTINE TO UNMAKE A MOVE MADE BY\n;\t  MOVE\n;\t\t\nUMOVE\t\tTSX\t\t\t; UNMAKE MOVE\n\t\tSTX\tSP1\n\t\tLDX\tSP2           \t; EXCHANGE\n\t\tTXS\t\t\t; STACKS\n\t\tPLA\t\t\t; MOVEN\n\t\tSTA\tMOVEN\n\t\tPLA\t\t\t; CAPTURED\n\t\tSTA\tPIECE        \t; PIECE\n\t\tTAX\t\n\t\tPLA\t\t\t; FROM SQUARE\n\t\tSTA\tBOARD,X\n\t\tPLA\t\t\t; PIECE\n\t\tTAX\t\n\t\tPLA\t\t\t; TO SOUARE\n\t\tSTA\tSQUARE\n\t\tSTA\tBOARD,X\n\t\tJMP\tSTRV\n;\t\t\n;       THIS ROUTINE MOVES PIECE\n;       TO SQUARE, PARAMETERS\n;       ARE SAVED IN A STACK TO UNMAKE\n;       THE MOVE LATER\n;\t\t\nMOVE\t\tTSX\t\n\t\tSTX\tSP1          \t; SWITCH\n\t\tLDX\tSP2          \t; STACKS\n\t\tTXS\t\n\t\tLDA\tSQUARE\n\t\tPHA\t\t\t; TO SQUARE\n\t\tTAY\t\n\t\tLDX\t#$1F\nCHECK\t\tCMP\tBOARD,X        \t; CHECK FOR\n\t\tBEQ\tTAKE          \t; CAPTURE\n\t\tDEX\t\n\t\tBPL\tCHECK\nTAKE\t\tLDA\t#$CC\n\t\tSTA\tBOARD,X\n\t\tTXA\t\t\t; CAPTURED\n\t\tPHA\t\t\t; PIECE\n\t\tLDX\tPIECE\n\t\tLDA\tBOARD,X\n\t\tSTY\tBOARD,X        \t; FROM\n\t\tPHA\t\t\t; SQUARE\n\t\tTXA\t\n\t\tPHA\t\t\t; PIECE\n\t\tLDA\tMOVEN\n\t\tPHA\t\t\t; MOVEN\nSTRV\t\tTSX\t\n\t\tSTX\tSP2           \t; SWITCH\n\t\tLDX\tSP1           \t; STACKS\n\t\tTXS\t\t\t; BACK\n\t\tRTS\t\n;\t\t\t\n;       CONTINUATION OF SUB STRATGY\n;       -CHECKS FOR CHECK OR CHECKMATE\n;       AND ASSIGNS VALUE TO MOVE\n;\t\t\nCKMATE\t        LDX\tBMAXC         \t; CAN BLK CAP\n\t\tCPX\tPOINTS       \t; MY KING?\n\t\tBNE\tNOCHEK\t\n\t\tLDA\t#$00           \t; GULP!\n\t\tBEQ\tRETV          \t; DUMB MOVE!\n;\t\t\nNOCHEK\tLDX\tBMOB         \t\t; IS BLACK\n\t\tBNE\tRETV          \t; UNABLE TO\n\t\tLDX\tWMAXP        \t; MOVE AND\n\t\tBNE\tRETV          \t; KING IN CH?\n\t\tLDA\t#$FF           \t; YES! MATE\n;\t\t\nRETV\t\tLDX\t#$04            ; RESTORE\n\t\tSTX\tSTATE        \t; STATE=4\n;\t\t\n;       THE VALUE OF THE MOVE (IN ACCU)\n;       IS COMPARED TO THE BEST MOVE AND\n;       REPLACES IT IF IT IS BETTER\n;\t\t\nPUSH\t\tCMP\tBESTV         \t; IS THIS BEST\n\t\tBCC\tRETP          \t; MOVE SO FAR?\n\t\tBEQ\tRETP\n\t\tSTA\tBESTV        \t; YES!\n\t\tLDA\tPIECE        \t; SAVE IT\n\t\tSTA\tBESTP\n\t\tLDA\tSQUARE\n\t\tSTA\tBESTM        \t; FLASH DISPLAY\nRETP\t\tLDA\t#\".\"\t\t; print ... instead of flashing disp\n\t\tJmp\tsyschout\t; print . and return\n;\t\t\n;       MAIN PROGRAM TO PLAY CHESS\n;       PLAY FROM OPENING OR THINK\n;\t\t\nGO\t\tLDX\tOMOVE        \t; OPENING?\n\t\tBMI\tNOOPEN          ; -NO   *ADD CHANGE FROM BPL\n\t\tLDA\tDIS3         \t; -YES WAS\n\t\tCMP\tOPNING,X        ; OPPONENT'S\n\t\tBNE\tEND            \t; MOVE OK?\n\t\tDEX\t\n\t\tLDA\tOPNING,X       \t; GET NEXT\n\t\tSTA\tDIS1         \t; CANNED\n\t\tDEX\t\t\t; OPENING MOVE\n\t\tLDA\tOPNING,X\n\t\tSTA\tDIS3         \t; DISPLAY IT\n\t\tDEX\t\n\t\tSTX\tOMOVE        \t; MOVE IT\n\t\tBNE\tMV2            \t; (JMP)\n;\t\t\t\nEND\t\tLDA     #$FF\t\t; *ADD - STOP CANNED MOVES\n\t\tSTA\tOMOVE        \t; FLAG OPENING\nNOOPEN\tLDX\t#$0C            \t; FINISHED\n\t\tSTX\tSTATE        \t; STATE=C\n\t\tSTX\tBESTV        \t; CLEAR BESTV\n\t\tLDX\t#$14           \t; GENERATE P\n\t\tJSR\tGNMX          \t; MOVES\n;\t\t\n\t\tLDX\t#$04           \t; STATE=4\n\t\tSTX\tSTATE        \t; GENERATE AND\n\t\tJSR\tGNMZ          \t; TEST AVAILABLE\n;\tMOVES\n;\t\t\n\t\tLDX\tBESTV        \t; GET BEST MOVE\n\t\tCPX\t#$0F           \t; IF NONE\n\t\tBCC\tMATE          \t; OH OH!\n;\t\t\nMV2\t\tLDX\tBESTP        \t; MOVE\n\t\tLDA\tBOARD,X         ; THE\n\t\tSTA\tBESTV        \t; BEST\n\t\tSTX\tPIECE        \t; MOVE\n\t\tLDA\tBESTM\n\t\tSTA\tSQUARE       \t; AND DISPLAY\n\t\tJSR\tMOVE           \t; IT\n\t\tJMP\tCHESS\n;\t\t\nMATE\t\tLDA\t#$FF           \t; RESIGN\n\t\tRTS\t\t\t; OR STALEMATE\n;\t\t\n;       SUBROUTINE TO ENTER THE\n;       PLAYER'S MOVE\n;\t\t\nDISMV\t\tLDX\t#$04           \t; ROTATE\nDROL\t\tASL\tDIS3          \t; KEY\n\t\tROL\tDIS2         \t; INTO\n\t\tDEX\t\t\t; DISPLAY\n\t\tBNE\tDROL\t\t;\n\t\tORA\tDIS3\n\t\tSTA\tDIS3\n\t\tSTA\tSQUARE\n\t\tRTS\t\n;\t\t\n;       THE FOLLOWING SUBROUTINE ASSIGNS\n;       A VALUE TO THE MOVE UNDER\n;       CONSIDERATION AND RETURNS IT IN\n;\tTHE ACCUMULATOR\n;\t\t\n\nSTRATGY\tCLC\t\n\t\tLDA\t#$80\n\t\tADC\tWMOB         \t; PARAMETERS\n\t\tADC\tWMAXC        \t; WITH WEIGHT\n\t\tADC\tWCC          \t; OF 0.25\n\t\tADC\tWCAP1\n\t\tADC\tWCAP2\n\t\tSEC\t\n\t\tSBC\tPMAXC\n\t\tSBC\tPCC\n\t\tSBC\tBCAP0\n\t\tSBC\tBCAP1\n\t\tSBC\tBCAP2\n\t\tSBC\tPMOB\n\t\tSBC\tBMOB\n\t\tBCS\tPOS           \t; UNDERFLOW\n\t\tLDA\t#$00           \t; PREVENTION\nPOS\t\tLSR\t\n\t\tCLC\t\t\t; **************\n\t\tADC\t#$40\n\t\tADC\tWMAXC       \t; PARAMETERS\n\t\tADC\tWCC         \t; WITH WEIGHT\n\t\tSEC\t\t\t; OF 0.5\n\t\tSBC\tBMAXC\n\t\tLSR\t\t\t; **************\n\t\tCLC\t\n\t\tADC\t#$90\n\t\tADC\tWCAP0       \t; PARAMETERS\n\t\tADC\tWCAP0       \t; WITH WEIGHT\n\t\tADC\tWCAP0       \t; OF 1.0\n\t\tADC\tWCAP0\n\t\tADC\tWCAP1\n\t\tSEC\t\t\t; &#91;UNDER OR OVER-\n\t\tSBC\tBMAXC        \t; FLOW MAY OCCUR\n\t\tSBC\tBMAXC        \t; FROM THIS\n\t\tSBC\tBMCC          \t; SECTION]\n\t\tSBC\tBMCC\n\t\tSBC\tBCAP1\n\t\tLDX\tSQUARE      \t; ***************\n\t\tCPX\t#$33\n\t\tBEQ\tPOSN         \t; POSITION\n\t\tCPX\t#$34           \t; BONUS FOR\n\t\tBEQ\tPOSN         \t; MOVE TO\n\t\tCPX\t#$22           \t; CENTRE\n\t\tBEQ\tPOSN           \t; OR\n\t\tCPX\t#$25           \t; OUT OF\n\t\tBEQ\tPOSN         \t; BACK RANK\n\t\tLDX\tPIECE\n\t\tBEQ\tNOPOSN\n\t\tLDY\tBOARD,X\n\t\tCPY\t#$10\n\t\tBPL\tNOPOSN\nPOSN\t\tCLC\n\t\tADC\t#$02\nNOPOSN\tJMP\tCKMATE       \t\t; CONTINUE\n\n\n;-----------------------------------------------------------------\n; The following routines were added to allow text-based board\n; display over a standard RS-232 port.\n;\nPOUT        \tjsr \tpout9\t\t; print CRLF\n\t\tjsr     pout13\t\t; print copyright\n\t\tJSR\tPOUT10\t\t; print column labels\n\t\tLDY   \t#$00\t\t; init board location\n\t\tJSR\tPOUT5\t\t; print board horz edge\nPOUT1\t\tlDA   \t#\"|\"\t\t; print vert edge\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - SPACE\n\t\tLDX   \t#$1F\nPOUT2\t\tTYA\t\t\t; scan the pieces for a location match\n            \tCMP\tBOARD,X\t\t; match found?\n            \tBEQ   \tPOUT4\t\t; yes; print the piece's color and type\n            \tDEX\t\t\t; no\n            \tBPL\tPOUT2\t\t; if not the last piece, try again\n\t\ttya\t\t\t; empty square\t\n\t\tand\t#$01\t\t; odd or even column?\t\t\t\t\n\t\tsta   \ttemp\t\t; save it\n\t\ttya  \t\t\t; is the row odd or even\n\t\tlsr\t\t\t; shift column right 4 spaces \n\t\tlsr\t\t\t;\n\t\tlsr\t\t\t;\n\t\tlsr\t\t\t;\n\t\tand   \t#$01\t\t; strip LSB  \n\t\tclc\t\t\t; \n\t\tadc   \ttemp\t\t; combine row &amp; col to determine square color  \n\t\tand   \t#$01\t\t; is board square white or blk?\n\t\tbeq\tpout25 \t\t; white, print space\n\t\tlda   \t#\"*\"\t\t; black, print *\n\t\tdb\t$2c\t\t; used to skip over LDA #$20\nPOUT25\t\tLDA   \t#$20\t\t; ASCII space\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - SPACE\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - SPACE\nPOUT3\t\tINY\t\t\t; \n\t          TYA\t\t\t; get row number\n            \tAND   \t#$08\t\t; have we completed the row?\t \n            \tBEQ   \tPOUT1\t\t; no, do next column\n\t\tLDA   \t#\"|\"\t\t; yes, put the right edge on\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - |             \n\t\tjsr\tpout12\t\t; print row number\n\t\tJSR   \tPOUT9\t\t; print CRLF\n            \tJSR   \tPOUT5\t\t; print bottom edge of board\n\t\tCLC\t\t\t; \n\t\tTYA\t\t\t; \n\t\tADC\t#$08\t\t; point y to beginning of next row\n\t\tTAY\t\t\t;\n\t\tCPY   \t#$80\t\t; was that the last row?\n\t\tBEQ   \tPOUT8\t\t; yes, print the LED values\n\t\tBNE   \tPOUT1\t\t; no, do new row\n\nPOUT4\t\tLDA   \tREV\t\t; print piece's color &amp; type\n\t\tBEQ   \tPOUT41\t\t;\n\t\tLDA\tcpl+16,X\t;\n\t\tBNE\tPOUT42\t\t;\nPOUT41\t\tLDA   \tcpl,x\t\t;\nPOUT42\t\tJSR\tsyschout\t;\n\t\tlda\tcph,x\t\t;\n\t\tjsr   \tsyschout\t; \n\t\tBNE\tPOUT3\t\t; branch always\n\nPOUT5       \tTXA\t\t\t; print \"-----...-----&lt;crlf>\"\n\t\tPHA\n\t\tLDX\t#$19\n\t\tLDA\t#\"-\"\nPOUT6\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - \"-\"\n\t\tDEX\n\t\tBNE\tPOUT6\n\t\tPLA\n\t\tTAX\n\t\tJSR\tPOUT9\n\t\tRTS\t \t\t\n\nPOUT8\t\tjsr\tpout10\t\t; \n\t\tLDA   \t$FB\n\t\tJSR   \tsyshexout\t; PRINT 1 BYTE AS 2 HEX CHRS\t\n        \tLDA   \t#$20\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - SPACE\n        \tLDA   \t$FA\n\t\tJSR   \tsyshexout\t; PRINT 1 BYTE AS 2 HEX CHRS\t\n        \tLDA   \t#$20\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - SPACE\n        \tLDA   \t$F9\n\t\tJSR   \tsyshexout\t; PRINT 1 BYTE AS 2 HEX CHRS\t\n\nPOUT9      \tLDA   \t#$0D\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - CR\n        \tLDA   \t#$0A\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - LF\n                RTS \n\npout10\t\tldx   \t#$00\t\t; print the column labels\nPOUT11\t\tlda\t#$20\t\t; 00 01 02 03 ... 07 &lt;CRLF>\n\t\tjsr   \tsyschout\n\t\ttxa\n\t\tjsr\tsyshexout\n\t\tINX\n\t\tCPX   \t#$08\n\t\tBNE\tPOUT11\n\t\tBEQ\tPOUT9\nPOUT12\t\tTYA\n\t\tand \t#$70\n\t\tJSR \tsyshexout\n\t\trts\n\nPout13\t\tldx   \t#$00\t\t; Print the copyright banner\nPout14\t\tlda   \tbanner,x\n\t\tbeq   \tPOUT15\n\t\tjsr   \tsyschout\n\t\tinx\n\t\tbne   \tPOUT14\nPOUT15\t\trts         \n\nKIN        \tLDA   \t#\"?\"\n\t\tJSR   \tsyschout\t; PRINT ONE ASCII CHR - ?\n\t\tJSR   \tsyskin\t\t; GET A KEYSTROKE FROM SYSTEM\n            \tAND   \t#$4F            ; MASK 0-7, AND ALPHA'S\n            \tRTS\n;\n; 6551 I\/O Support Routines\n;\n;\nInit_6551      lda   #$1F               ; 19.2K\/8\/1\n               sta   ACIActl            ; control reg \n               lda   #$0B               ; N parity\/echo off\/rx int off\/ dtr active low\n               sta   ACIAcmd            ; command reg \n               rts                      ; done\n;\n; input chr from ACIA1 (waiting)\n;\nsyskin         lda   ACIASta            ; Serial port status             \n               and   #$08               ; is recvr full\n               beq   syskin             ; no char to get\n               Lda   ACIAdat            ; get chr\n               RTS                      ;\n;\n; output to OutPut Port\n;\nsyschout       PHA                      ; save registers\nACIA_Out1      lda   ACIASta            ; serial port status\n               and   #$10               ; is tx buffer empty\n               beq   ACIA_Out1          ; no\n               PLA                      ; get chr\n               sta   ACIAdat            ; put character to Port\n               RTS                      ; done\n\nsyshexout      PHA                     ;  prints AA hex digits\n               LSR                     ;  MOVE UPPER NIBBLE TO LOWER\n               LSR                     ;\n               LSR                     ;\n               LSR                     ;\n               JSR   PrintDig          ;\n               PLA                     ;\nPrintDig       AND   #$0F              ;  prints A hex nibble (low 4 bits)\n               PHY\n               TAY                     ;\n               LDA   Hexdigdata,Y      ;\n               PLY\n               jmp   syschout          ;\n\nHexdigdata\tasc\t\"0123456789ABCDEF\"\nbanner\t\tasc\t\"MicroChess (c) 1996-2005 Peter Jennings, www.benlo.com\"\n\t\tdb\t$0d, $0a, $00\ncpl\t\tasc\t\"WWWWWWWWWWWWWWWWBBBBBBBBBBBBBBBBWWWWWWWWWWWWWWWW\"\ncph\t\tasc\t\"KQRRBBNNPPPPPPPPKQRRBBNNPPPPPPPP\"\n\t\tdb\t$00\n;\n; end of added code\n;\n; BLOCK DATA\n\t\t*= $1580\nSETW\t\tdb \t$03, $04, $00, $07, $02, $05, $01, $06\n        \tdb \t$10, $17, $11, $16, $12, $15, $14, $13\n        \tdb \t$73, $74, $70, $77, $72, $75, $71, $76\n\t \tdb\t$60, $67, $61, $66, $62, $65, $64, $63\n\nMOVEX   \tdb \t$00, $F0, $FF, $01, $10, $11, $0F, $EF, $F1\n\t\tdb\t$DF, $E1, $EE, $F2, $12, $0E, $1F, $21\n\nPOINTS  \tdb \t$0B, $0A, $06, $06, $04, $04, $04, $04\n\t\tdb \t$02, $02, $02, $02, $02, $02, $02, $02\n\nOPNING  \tdb \t$99, $25, $0B, $25, $01, $00, $33, $25\n\t\tdb\t$07, $36, $34, $0D, $34, $34, $0E, $52\n        \tdb \t$25, $0D, $45, $35, $04, $55, $22, $06\n\t\tdb\t$43, $33, $0F, $CC\n\n;\n;\n; end of file\n;\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/obsolescenceguaranteed.blogspot.com\/2014\/06\/6502-microchess-on-arduino.html https:\/\/www.benlo.com\/microchess\/index.html Game Hex Dump Assembly Listing<\/p>\n","protected":false},"author":1,"featured_media":231,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[9],"tags":[32,17,15],"class_list":["post-227","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-archeology","tag-kim-1","tag-retrocomputing","tag-retrogaming"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/permacomputer.solarpunk.au\/wp-content\/uploads\/2026\/08\/butterfield.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/posts\/227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=227"}],"version-history":[{"count":5,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/posts\/227\/revisions"}],"predecessor-version":[{"id":234,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/posts\/227\/revisions\/234"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=\/wp\/v2\/media\/231"}],"wp:attachment":[{"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/permacomputer.solarpunk.au\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}