JOB BINOXXO V 1.1 ROLFFSON 04714 CTL 6611 * ******************************************************** * * BINOXXO SOLVER FOR IBM 1401 * PUT THE FIELD DEF IN MAKRED AREA BELOW AS DC STRINGS * ******************************************************** ORG 400 * MUST BE MULT 100 ARR DA 1X100 * FIELD WORK AREA * * FIELD DEFAULT 10X10, ONLY X/O/SPACE ORG 500 DCW @ OX @ * ONLY FIRST WITH WM DC @ OO O XX@ * REST W/O WM DC @O O OX @ DC @ XO X O@ DC @ X X @ DC @ X O OO@ DC @OX O @ DC @O O X @ DC @ XX X X@ DEFARR DC @X O O @ * ******************************************************** * ROLFFSON.DE 2023-10 ******************************************************** * * ITS A 10X10 FIELD, SO FOR AN ADRESS OFFSET THE UNIT POS * REPRESENT THE COLUMN AND THE 10 POS REP THE ROW. * EG OFFSET X1 = 36 IS 4TH COLUMN 7TH ROW * THE PROGRAM RELIES ON USING ONLY SPACE/O/X * LABEL PREFIXES: * TR - TWIN ROW CHECK -XX- * TC - TWIN COLUMN CHECK -XX- * GR - GAP ROW CHECK X-X * GC - GAP COLUMN CHECK X-X * CR - COUNT ROW CHECK XXXXXOOOOO * CC - COUNT COLUMN CHECK XXXXXOOOOO * PRT - PRINT * ******************************************************** * ORG 87 X1 DSA 0 * INDEX REGISTER 1 ORG 92 X2 DSA 0 * INDEX REGISTER 2 ORG 97 X3 DSA 0 * INDEX REGISTER 3 * ZERO EQU 0 RBUF EQU 001 * CARD READ BUFFER START PBUF EQU 201 * PRINT BUFFER START * * SOME TEXTS ORG ENDEND+200 * MOVE TEXT BEHIND PROG & ADR CONST HELLO DCW @- IBM 1401 - BINOXXO - ROLFFSON 2023 V1.1 -@ HELLO1 DCW @-------------------------------------------@ TXTHL2 DCW @SWITCH F OFF: USE INTERNAL DEMO FIELD@ TXTHL3 DCW @ F ON : READ FIELD FROM CARD READER@ TXTHL4 DCW @SWITCH D OFF: DETAILED LIST WITH EACH CHANGE@ TXTHL5 DCW @ D ON : NO LIST, ONLY FIELD@ TXTHL6 DCW @SWITCH C OFF: PRINT FIELD AFTER EACH MAIN STEP@ TXTHL7 DCW @ C ON : ONLY PRINT START & RESULT FIELD@ TXTHL8 DCW @PRESS START TO CONTINUE@ BYE DCW @***** END OF PROGRAM RUN *****@ TXTRST DCW @PRESS START TO RUN PROGRAM AGAIN@ DCW @***** ERROR, FIELD COULD NOT BE@ ERRTXT DC @ SOLVED, NEAR COL/ROW:@ *55 TXTRDC DCW @READING 10 CARDS FROM 1402 CARD READER 10 COL X/O@ TXTRDE DCW @***** FORMAT ERROR IN CARD - ONLY USE X/O/SPACE@ TXTINF DCW @INFO: PRINTED COORDINATES ARE 0..9 BASED@ TXTTWR DCW @DO TWIN SEARCH _XX_ HORIZONTALLY@ TXTTWC DCW @DO TWIN SEARCH _XX_ VERTICALLY@ TXTGWR DCW @DO GAP SEARCH X_X HORIZONTALLY@ TXTGWC DCW @DO GAP SEARCH X_X VERTICALLY@ TXTCWR DCW @DO COUNT 5+5 SEARCH HORIZONTALLY@ TXTCWC DCW @DO COUNT 5+5 SEARCH VERTICALLY@ TXTNCH DCW @- NOTHING FOUND, NO CHANGE@ TXTNMC DCW @NO MORE CHANGES, LAST STATE WAS FINAL STATE:@ TRCHKT DCW @- SURROUND HORIZONTAL TWIN AT ??? - ?@ * 32/36 TCCHKT DCW @- SURROUND VERTICAL TWIN AT ??? - ?@ * 30/34 GRCHKT DCW @- FILL HORIZONTAL GAP RIGHT OF ??? - ?@ * 33/37 GCCHKT DCW @- FILL VERTICAL GAP BELOW ??? - ?@ * 28/32 CRCHKT DCW @- FILL HORIZONTAL 5+5 IN ROW ??? - ?@ * 31/35 CCCHKT DCW @- FILL VERTICAL 5+5 IN COL ??? - ?@ * 29/33 * ******************************************************** * START OF MAIN PROG ORG DEFARR+101 * STARTS AFTER WORK AREA * * CONSTANTS FOR FIELD HANDLING (YES, BELOW 1000 W/O INDEX DSA=DCW) DX1 DSA 001 * INCEREMENT ONE FIELD DX2 DSA 002 * INCREMENT AT LOOP END DX3 DSA 003 * INCREMENT AT LOOP END DY DSA 010 * INCREMENT PER ROW * STD INDEX CONSTANTS X000 DSA 000 * 000 CONSTANT XDEC DSA 15999 * DECREMENT ONE XINC DSA 001 * INCREMENT ONE * COUNTER FOR 5+5, LATER USE MA COMMAND TO AVOID SIGN SHENANIGANS COUNTX DSA 000 * ABUSE AS COUNTER COUNTO DSA 000 * ABUSE AS COUNTER * DIRTY FLAG DIRTY DCW @?@ TRUE DCW @T@ FALSE DCW @F@ * X AND O SYMBOLS CX DCW @X@ * THE X CO DCW @O@ * THE O * COMP / ANTI USED IN SEARCH LOOPS: ANTI DCW @?@ * BUFFER FOR MCW MODIFICATION COMP DCW @?@ * BUFFER FOR COMPARE * PRWHAT DSA 000 * ******************************************************** * * MAIN START * ******************************************************** DRTYT DCW @?@ * DIRTY FLAG OVERALL START NOP CS ARR+99 * CLEAR FIELD WORK AREA MCW DEFARR,ARR+99 * INSERT DEFAULT FIELD MCW +HELLO1,X1 * PRINT HELLO B PRTMSG MCW +HELLO,X1 * PRINT HELLO B PRTMSG MCW +HELLO1,X1 * PRINT HELLO B PRTMSG B PRTBLL * BLANK LINE MCW +TXTINF,X1 * PRINT COORDINATE INFO B PRTMSG * PRINT INFO ABOUT SWITCHES B PRTBLL * BLANK LINE MCW +TXTHL2,X1 * PRINT INFO TEXTS B PRTMSG * TELL USER TO SET SWITCHES MCW +TXTHL3,X1 * AND PRESS START B PRTMSG MCW +TXTHL4,X1 B PRTMSG MCW +TXTHL5,X1 B PRTMSG MCW +TXTHL6,X1 B PRTMSG MCW +TXTHL7,X1 B PRTMSG B PRTBLL * BLANK LINE MCW +TXTHL8,X1 B PRTMSG H 000,111 * WAIT FOR USER TO PRESS START * ******************************************************** * READ FIELD FROM CARDS * BSS STARDC,F * READ FIELD FROM CARDS ? B START1 * NO, USE INTERNAL DEMO FIELD STARDC MCW +TXTRDC,X1 * MESSAGE NOW READING CARDS B PRTMSG CS ARR+99 * CLEAR FIELD WORK AREA CS RBUF+79 * CLEAR CARD BUFFER SW RBUF * SET WM FOR MOVE CMD MCW X000,X2 * INIT STARDL R * READ CARD * * CHECK CARD DATA FORMAT IN CURRENT LINE MCW X000,X3 STARDK BCE STAROK,RBUF+X3,X * IS X ? BCE STAROK,RBUF+X3,O * IS O ? BCE STAROK,RBUF+X3, * IS SPACE ? B STARDE * NO X/O/SPACE, ERR STAROK BCE STARD4,X3,9 * WAS LAST ? DONE WITH LINE MA DX1,X3 * INC PTR B STARDK * CHECK NEXT CHAR * * OK, GO ON WITH CARD STARD4 MCW RBUF+9,ARR+9+X2 * COPY TO FIELD WORK AREA BCE START1,X2-1,9 * LAST ROW ? DONE MA DY,X2 * INC POINTER BY 10 B STARDL * NEXT CARD / ROW * * PRINT CARD ERROR MSG STARDE MCW +TXTRDE,X1 * FORMAT ERROR MSG B PRTMSG MCW +RBUF+9,X1 * PRINT WRONG CARD DATA B PRTMSG B PRTBLL * BLANK LINE B START * RESTART OVER * ******************************************************** * HERE COMES THE MAIN LOOP * START1 B PRTFLD * PRINT START FIELD * LOOPTR MCW FALSE,DRTYT * MAIN LOOP START * * DO CHECKS FOR TWIN/GAP/COUNT ROW/COL MCW +TXTTWR,PRWHAT * PRINT INFO - TWIN ROW MCW +TRCHK,LOPCK1+3 * SET CHECK ROUTINE B LOPCHK MCW +TXTTWC,PRWHAT * PRINT INFO - TWIN COL MCW +TCCHK,LOPCK1+3 * SET CHECK ROUTINE B LOPCHK MCW +TXTGWR,PRWHAT * PRINT INFO - GAP ROW MCW +GRCHK,LOPCK1+3 * SET CHECK ROUTINE B LOPCHK MCW +TXTGWC,PRWHAT * PRINT INFO - GAP COL MCW +GCCHK,LOPCK1+3 * SET CHECK ROUTINE B LOPCHK MCW +TXTCWR,PRWHAT * PRINT INFO - COUNT ROW MCW +CRCHK,LOPCK1+3 * SET CHECK ROUTINE B LOPCHK MCW +TXTCWC,PRWHAT * PRINT INFO - COUNT COL MCW +CCCHK,LOPCK1+3 * SET CHECK ROUTINE B LOPCHK * * ANYTHING FOUND? BCE LOOPTR,DRTYT,T * ANYTHING FOUND? TRY AGAIN * ******************************************************** * ALL DONE, PRINT LAST STATE AND END B PRTBLL MCW +TXTNMC,X1 * PRINT FINISHED INFO B PRTMSG B PRTFLD MCW +BYE,X1 * PRINT GOOD BYE B PRTMSG MCW +TXTRST,X1 * PRINT RESTART MSG B PRTMSG B PRTBLL H 000,888 * PROGRAM HALT B START * RESTART PRG FROM BEGINNING * ******************************************************** * SUB DO ONE CHECK LOPCHK SBR LOPCKR+3 BSS LOPCK1,D * SENSE SWITCH, NO INFO PRINT MCW PRWHAT,X1 * PRINT INFO B PRTMSG LOPCK1 B 000 * DO THE CHECK B LOPCKR,DIRTY,F * NO CHANGE, NO PRINT MCW TRUE,DRTYT * SET TOTAL-DIRTY BSS LOPCKR,C * SENSE SWITCH, NO FIELD PRINT BSS LOPCK2,D * IF NO INFO, AT LEAST LAST ONE B LOPCK3 LOPCK2 MCW PRWHAT,X1 * PRINT INFO B PRTMSG LOPCK3 B PRTFLD * PRINT FIELD LOPCKR B 000 * ******************************************************** ******************************************************** * * TWIN ROW CHECK - CHECK FOR _XX_ OR _OO_ * CHECKING TWO BOXES, SO COLUMN LOOP INDEX 0..8 * GOES COLUMN PAIR BY COLUMN PAIR 0..8, THEN NEXT ROW 0..9 * ******************************************************** TRCHK SBR TRENDR+3 MCW FALSE,DIRTY * CLEAR DIRTY FLAG B PRTCLR * PREPARE ACTION MESSAGE MCW +TRCHKT,X1 B PRTMSA MCW X000,X1 * INIT INDEX * * LOOP THROUGH LINE TRLOOP BCE TRNXT,ARR+X1, * EMPTY? NEXT MCW ARR+X1,COMP * COPY TO GET 1 CHAR WITH WM C ARR+1+X1,COMP * COMPARE TWO ADJACENT BOXES BU TRNXT * NOT EQUAL, NEXT * TWO ARE EQUAL, NOW SET BOXES LEFT AND RIGHT. * FIRST FIGURE OUT ANTI CHAR MCW ARR+X1,COMP * GET FOR CHECKS BELOW MCW CO,ANTI * IS ANTI CHAR AN O? BCE TRLT,COMP,X * SEARCH CHAR IS X, SO YES MCW CX,ANTI * NO, SO ANTI CHAR IS X * * HANDLE BOX LEFT OF XX IF NOT OUTSIDE OF FIELD TRLT BCE TRRT,X1,0 * INDEX FIRST LEFT? SKIP BOX C ARR-1+X1,COMP * ALREADY X/O? BE ERR * YES, NOT ALLOWED C ARR-1+X1,ANTI * ALREADY ANTI? BE TRRT * YES, DONT SET DIRTY MCW ANTI,ARR-1+X1 * SET TO ANTI MCW TRUE,DIRTY * SET DIRTY FLAG * * HANDLE BOX RIGHT OF XX IF NOT OUTSIDE OF FIELD TRRT BCE TRNXT,X1,8 * INDEX LAST RIGHT? SKIP BOX C ARR+2+X1,COMP * ALREADY X/O? BE ERR * YES, NOT ALLOWED C ARR+2+X1,ANTI * ALREADY ANTI? BE TRNXT * YES, DONT SET DIRTY MCW ANTI,ARR+2+X1 * SET TO ANTI MCW TRUE,DIRTY * SET DIRTY FLAG BSS TRNXT,D * SWITCH D ? SKIP PRINT MCW X1,PBUF+32 * PRINT INFO MCW ANTI,PBUF+36 W * * CHECK DONE FOR ONE PAIR, NOW ADVANCE ONE POS * MUST TEST COL AGAIN BC MAY COME HERE FROM FIRST XX/OO TEST TRNXT BCE TRNXTR,X1,8 * ALREADY LAST RIGHT? NXT ROW MA DX1,X1 * INC INDEX, NEXT BOX PAIR B TRLOOP * IN NEXT COLUMN * * WE WERE AT RIGHT END, NOW GO TO NEXT ROW TRNXTR BCE TREND,X1-1,9 * WAS THIS THE LAST ROW? MA DX2,X1 * NO, INDEX += 2 FOR NEXT ROW B TRLOOP * DO NEXT ROW * * DONE, RETURN TO CALLER TREND BSS TRENDR,D * SWITCH D ? SKIP PRINT BCE TRENDR,DIRTY,T * SOMETHING CHANGED? MCW +TXTNCH,X1 * INFO, NOTHING FOUND B PRTMSG TRENDR B 000 * RETURN * ******************************************************** * * TWIN COLUMN CHECK - CHECK FOR _XX_ OR _OO_ * CHECKING TWO BOXES, SO ROW LOOP INDEX 0..9 * GOES COLUMN PAIR BY COLUMN PAIR 0..9, THEN NEXT ROW 0..8 * ******************************************************** TCCHK SBR TCENDR+3 MCW FALSE,DIRTY * CLEAR DIRTY FLAG B PRTCLR * PREPARE ACTION MESSAGE MCW +TCCHKT,X1 B PRTMSA MCW X000,X1 * INIT INDEX * * LOOP THROUGH LINE TCLOOP BCE TCNXT,ARR+X1, * EMPTY? NEXT MCW ARR+X1,COMP * COPY TO GET 1 CHAR WITH WM C ARR+10+X1,COMP * COMPARE TWO ADJACENT BOXES BU TCNXT * NOT EQUAL, NEXT * TWO ARE EQUAL, NOW SET BOXES LEFT AND RIGHT: MCW ARR+X1,COMP * GET FOR CHECKS BELOW MCW CO,ANTI * IS ANTI CHAR AN O? BCE TCLT,COMP,X * SEARCH CHAR IS X, SO YES MCW CX,ANTI * NO, SO ANTI CHAR IS X * * HANDLE BOX ABOVE XX IF NOT OUTSIDE OF FIELD TCLT BCE TCRT,X1-1,0 * INDEX FIRST TOP? SKIP BOX C ARR-10+X1,COMP * ALREADY X/O? BE ERR * YES, NOT ALLOWED C ARR-10+X1,ANTI * ALREADY ANTI? BE TCRT * YES, DONT SET DIRTY MCW ANTI,ARR-10+X1 * SET TO ANTI MCW TRUE,DIRTY * SET DIRTY FLAG * * HANDLE BOX BELOW XX IF NOT OUTSIDE OF FIELD TCRT BCE TCNXT,X1-1,8 * INDEX LAST BOTTOM? SKIP BOX C ARR+20+X1,COMP * ALREADY X/O? BE ERR * YES, NOT ALLOWED C ARR+20+X1,ANTI * ALREADY ANTI? BE TCNXT * YES, DONT SET DIRTY MCW ANTI,ARR+20+X1 * SET TO ANTI MCW TRUE,DIRTY * SET DIRTY FLAG BSS TCNXT,D * SWITCH D ? SKIP PRINT MCW X1,PBUF+30 * PRINT INFO MCW ANTI,PBUF+34 W * * CHECK DONE FOR ONE PAIR, NOW ADVANCE ONE POS * MUST TEST COL AGAIN BC MAY COME HERE FROM FIRST XX/OO TEST TCNXT BCE TCNXTR,X1,9 * ALREADY LAST RIGHT? NXT ROW MA DX1,X1 * INC INDEX, NEXT BOX PAIR B TCLOOP * IN NEXT COLUMN * * WE WERE AT RIGHT END, NOW GO TO NEXT ROW TCNXTR BCE TCEND,X1-1,8 * WAS THIS THE LAST ROW? MA DX1,X1 * NO, INDEX += 1 FOR NEXT ROW B TCLOOP * DO NEXT ROW * * DONE, RETURN TO CALLER TCEND BSS TCENDR,D * SWITCH D ? SKIP PRINT BCE TCENDR,DIRTY,T * SOMETHING CHANGED? MCW +TXTNCH,X1 * INFO, NOTHING FOUND B PRTMSG TCENDR B 000 * RETURN * ******************************************************** * * GAP ROWS - CHECK FOR X_X OR O_O HORIZONTALLY * CHECKING THREE BOXES, SO COLUMN LOOP INDEX 0..7 * DO COLUMNS 0..7, THEN NEXT ROW 0..9 * ******************************************************** GRCHK SBR GRENDR+3 MCW FALSE,DIRTY * CLEAR DIRTY FLAG B PRTCLR * PREPARE ACTION MESSAGE MCW +GRCHKT,X1 B PRTMSA MCW X000,X1 * INIT INDEX * * LOOP THROUGH LINE GRLOOP BCE GRNXT,ARR+X1, * EMPTY? NEXT MCW ARR+X1,COMP * COPY TO GET 1 CHAR WITH WM C ARR+2+X1,COMP * COMPARE TWO BOXES TO RIGHT BU GRNXT * NOT EQUAL, NEXT * * THE TWO ARE EQUAL, NOW SET BOX IN THE MIDDLE: * FIRST FIGURE OUT ANTI CHAR MCW ARR+X1,COMP * GET FOR CHECKS BELOW MCW CO,ANTI * IS ANTI CHAR AN O? BCE GRLT,COMP,X * SEARCH CHAR IS X, SO YES MCW CX,ANTI * NO, SO ANTI CHAR IS X * * HANDLE BOX IN MIDDLE OF X_X GRLT C ARR+1+X1,COMP * ALREADY X/O? BE ERR * YES, NOT ALLOWED C ARR+1+X1,ANTI * ALREADY ANTI? BE GRNXT * YES, DONT SET DIRTY MCW ANTI,ARR+1+X1 * SET TO ANTI MCW TRUE,DIRTY * SET DIRTY FLAG BSS GRNXT,D * SWITCH D ? SKIP PRINT MCW X1,PBUF+33 * PRINT INFO MCW ANTI,PBUF+37 W * * CHECK DONE, NOW ADVANCE ONE POS GRNXT BCE GRNXTR,X1,7 * ALREADY LAST RIGHT? NXT ROW MA DX1,X1 * INC INDEX, NEXT BOX PAIR B GRLOOP * * WE WERE AT RIGHT END, NOW GO TO NEXT ROW GRNXTR BCE GREND,X1-1,9 * WAS THIS THE LAST ROW? MA DX3,X1 * NO, INDEX += 3 FOR NEXT ROW B GRLOOP * DO NEXT ROW * * DONE, RETURN TO CALLER GREND BSS GRENDR,D * SWITCH D ? SKIP PRINT BCE GRENDR,DIRTY,T * SOMETHING CHANGED? MCW +TXTNCH,X1 * INFO, NOTHING FOUND B PRTMSG GRENDR B 000 * RETURN * ******************************************************** * * GAP COLS - CHECK FOR X_X OR O_O VERTICALLY * CHECKING THREE BOXES, SO ROW LOOP INDEX 0..7 * DO COLUMNS 0..9, THEN NEXT ROW 0..7 * ******************************************************** GCCHK SBR GCENDR+3 MCW FALSE,DIRTY * CLEAR DIRTY FLAG B PRTCLR * PREPARE ACTION MESSAGE MCW +GCCHKT,X1 B PRTMSA MCW X000,X1 * INIT INDEX * * LOOP THROUGH LINE GCLOOP BCE GCNXT,ARR+X1, * EMPTY? NEXT MCW ARR+X1,COMP * COPY TO GET 1 CHAR WITH WM C ARR+20+X1,COMP * COMPARE TWO BOXES BELOW BU GCNXT * NOT EQUAL, NEXT * * THE TWO ARE EQUAL, NOW SET BOX IN THE MIDDLE: * FIRST FIGURE OUT ANTI CHAR MCW ARR+X1,COMP * GET FOR CHECKS BELOW MCW CO,ANTI * IS ANTI CHAR AN O? BCE GCLT,COMP,X * SEARCH CHAR IS X, SO YES MCW CX,ANTI * NO, SO ANTI CHAR IS X * * HANDLE BOX IN MIDDLE OF X_X GCLT C ARR+10+X1,COMP * ALREADY X/O? BE ERR * YES, NOT ALLOWED C ARR+10+X1,ANTI * ALREADY ANTI? BE GCNXT * YES, DONT SET DIRTY MCW ANTI,ARR+10+X1 * SET TO ANTI MCW TRUE,DIRTY * SET DIRTY FLAG BSS TRNXT,D * SWITCH D ? SKIP PRINT MCW X1,PBUF+28 * PRINT INFO MCW ANTI,PBUF+32 W * * CHECK DONE, NOW ADVANCE ONE POS GCNXT BCE GCNXTR,X1,9 * ALREADY LAST RIGHT? NXT ROW MA DX1,X1 * INC INDEX, NEXT BOX PAIR B GCLOOP * * WE WERE AT RIGHT END, NOW GO TO NEXT ROW GCNXTR BCE GCEND,X1-1,7 * WAS THIS THE LAST ROW? MA DX1,X1 * NO, INDEX += 1 FOR NEXT ROW B GCLOOP * DO NEXT ROW * * DONE, RETURN TO CALLER GCEND BSS GCENDR,D * SWITCH D ? SKIP PRINT BCE GCENDR,DIRTY,T * SOMETHING CHANGED? MCW +TXTNCH,X1 * INFO, NOTHING FOUND B PRTMSG GCENDR B 000 * RETURN * ******************************************************** * * COUNT ROW - CHECK FOR 5+5 HORIZONTALLY * CHECKING ALL BOXES, SO COL LOOP INDEX 0..9 * DO COLUMNS 0..9, THEN NEXT ROW 0..9 * ******************************************************** CRCHK SBR CRENDR+3 MCW FALSE,DIRTY * CLEAR DIRTY FLAG B PRTCLR * PREPARE ACTION MESSAGE MCW +CRCHKT,X1 B PRTMSA MCW X000,X1 * INIT INDEX, FIRST BOX MCW X1,X2 * MEMORIZE ROW START IN X2 * * RESET COUNTER CRLOPZ MCW X000,COUNTX * EACH ROW STARTS WITH ZEROS MCW X000,COUNTO * * LOOP THROUGH LINE AND COUNT X+O CRLOOP BCE CRNCNT,ARR+X1, * EMPTY? NO COUNT BCE CRINCX,ARR+X1,X * IS X? MA DX1,COUNTO * NO, MUST BE O, COUNT O B CRNCNT CRINCX MA DX1,COUNTX * YES IS X, COUNT X CRNCNT MA DX1,X1 * NEXT BOX IN ROW BCE CRCROW,X1,0 * X1 UNIT ZERO? ROW CNT FINISHED B CRLOOP * HANDLE NEXT BOX TO RIGHT * * CHECK IF 5 OF ANY SYMBOL, THEN JUMP TO FILL ROUTINE CRCROW BCE CRROWX,COUNTX,5 * FOUND 5 X ? BCE CRROWO,COUNTO,5 * FOUND 5 O ? * * LAST BOX INCREMENT ALREADY PUSHED X1 TO NEXT ROW CRNXTR BCE CREND,X1-1,0 * ROW OVERFLOW TO 100 ? END MCW X1,X2 * MEMORIZE ROW START IN X2 B CRLOPZ * PROCESS NEXT ROW * * FOUND 5 X, NOW FILL SPACES WITH O CRROWX BCE CRNXTR,COUNTO,5 * ALSO 5 O ? ROW ALREADY FULL MCW CX,COMP MCW CO,ANTI B CRRWXF * * FOUND 5 O, NOW FILL SPACES WITH X CRROWO BCE CRNXTR,COUNTX,5 * ALSO 5 X ? ROW ALREADY FULL MCW CO,COMP MCW CX,ANTI * * FILL SPACES, X2 IS AT ROW LEFT CRRWXF BSS CRRWXL,D * SWITCH D ? SKIP PRINT MCW X2,PBUF+31 * PRINT INFO MCW ANTI,PBUF+35 W CRRWXL BCE CRRWXS,ARR+X2, * SPACE FOUND? B CRORWN * NO, NEXT BOX CRRWXS MCW ANTI,ARR+X2 * SET SPACE TO ANTI MCW TRUE,DIRTY * THERE WAS A CHANGE CRORWN MA DX1,X2 * INCREMENT TO NEXT BOX BCE CRNXTR,X2,0 * FINISHED ROW? NEXT ROW B CRRWXL * CHECK/FILL NEXT BOX * * DONE, RETURN TO CALLER CREND BSS CRENDR,D * SWITCH D ? SKIP PRINT BCE CRENDR,DIRTY,T * SOMETHING CHANGED? MCW +TXTNCH,X1 * INFO, NOTHING FOUND B PRTMSG CRENDR B 000 * RETURN * ******************************************************** * * COUNT COLUMN - CHECK FOR 5+5 VERTICALLY * CHECKING ALL BOXES, SO ROW LOOP INDEX 0..9 * DO ROWS 0..9, THEN NEXT COLUMN 0..9 * ******************************************************** CCCHK SBR CCENDR+3 MCW FALSE,DIRTY * CLEAR DIRTY FLAG B PRTCLR * PREPARE ACTION MESSAGE MCW +CCCHKT,X1 B PRTMSA MCW X000,X1 * INIT INDEX, FIRST BOX MCW X1,X2 * MEMORIZE ROW START IN X2 * * RESET COUNTER CCLOPZ MCW X000,COUNTX * EACH COL STARTS WITH ZEROS MCW X000,COUNTO * * LOOP THROUGH COL AND COUNT X+O CCLOOP BCE CCNCNT,ARR+X1, * EMPTY? NO COUNT BCE CCINCX,ARR+X1,X * IS X? MA DX1,COUNTO * NO, MUST BE O, COUNT O B CCNCNT CCINCX MA DX1,COUNTX * YES IS X, COUNT X CCNCNT MA DY,X1 * +10, NEXT BOX IN COL BCE CCCROW,X1-1,0 * X1 10TH ZERO? COL CNT FINISHED B CCLOOP * HANDLE NEXT BOX BELOW * * CHECK IF 5 OF ANY SYMBOL, THEN JUMP TO FILL ROUTINE CCCROW BCE CCROWX,COUNTX,5 * FOUND 5 X ? BCE CCROWO,COUNTO,5 * FOUND 5 O ? * * LAST BOX INCREMENT PUSHED X1 TO 100+COL CCNXTC MCW X000,X1-1 * CLEAR UPPER 2 DIGITS OF X1 MA DX1,X1 * INCREMENT COL BCE CCEND,X1,0 * COL OVERFLOW? END MCW X1,X2 * MEMORIZE ROW START IN X2 B CCLOPZ * PROCESS NEXT COL * * FOUND 5 X, NOW FILL SPACES WITH O CCROWX BCE CCNXTC,COUNTO,5 * ALSO 5 O ? ROW ALREADY FULL MCW CX,COMP MCW CO,ANTI B CCRWXF * * FOUND 5 O, NOW FILL SPACES WITH X CCROWO BCE CCNXTC,COUNTX,5 * ALSO 5 X ? ROW ALREADY FULL MCW CO,COMP MCW CX,ANTI * * FILL SPACES, X2 IS AT COL TOP CCRWXF BSS CCRWXL,D * SWITCH D ? SKIP PRINT MCW X2,PBUF+29 * PRINT INFO MCW ANTI,PBUF+33 W CCRWXL BCE CCRWXS,ARR+X2, * SPACE FOUND? B CCORWN * NO, NEXT BOX CCRWXS MCW ANTI,ARR+X2 * SET SPACE TO ANTI MCW TRUE,DIRTY * THERE WAS A CHANGE CCORWN MA DY,X2 * INCREMENT TO NEXT BOX BELOW BCE CCNXTC,X2-1,0 * FINISHED ROW? NEXT COL B CCRWXL * CHECK/FILL NEXT BOX * * DONE, RETURN TO CALLER CCEND BSS CCENDR,D * SWITCH D ? SKIP PRINT BCE CCENDR,DIRTY,T * SOMETHING CHANGED? MCW +TXTNCH,X1 * INFO, NOTHING FOUND B PRTMSG CCENDR B 000 * RETURN * ******************************************************** ******************************************************** * * PRINT FIELD * CHANGES X3 * ******************************************************** PRTFLC DCW @ 0123456789@ PRTFLD SBR PRTFLR+3 B PRTBLL * BLANK LINE MCW +PRTFLC,X1 * 0123456789 B PRTMSG B PRTCLR * CLEAR BUFFER SW PBUF * SET WM FOR COPY SW PBUF+2 * SET WM FOR COPY MCW X000,X3 * INIT INDEX PRTFLL MCW ARR+9+X3,PBUF+11 * COPY ONE LINE MCW X3-1,PBUF * COPY ONE INDEX DIGIT W * PRINT IT BCE PRTFLE,X3-1,9 * WAS THIS THE LAST ROW? MA DY,X3 * NO, NEXT ROW B PRTFLL * LOOP PRTFLE B PRTBLL * BLANK LINE PRTFLR B 000 * RETURN * ******************************************************** * * PRINT ERROR MESSAGE - FIELD CANNOT BE SOLVED * INCLUDING TWO DIGITS OF X1 AS COORDINATES * PARAMETER: COORDINATES STILL IN X1 * ERR SBR ERRFRM+3 * JUST AS DEBUG INFO B PRTFLD * PRINT CURRENT STATUS CS PBUF+98 * CLEAR BUFFER B PRTBLL * BLANK LINE MCW ERRTXT,PBUF+52 * ERROR TEXT SW PBUF+54 * WM FOR X1 MCW X1,PBUF+55 * COPY 2 DIGITS W * PRINT MCW +BYE,X1 B PRTMSG MCW +TXTRST,X1 * PRINT RESTART MSG B PRTMSG B PRTBLL H 000,888 B START * RESTART PRG FROM BEGINNING ERRFRM B 000 * CAME FROM THERE * ******************************************************** * * ROLFFSONS MESSAGE PRINTING LIBRARY * PRTMSG - PRINT MESSAGE LEFT ADJUSTED TO 201 * PRTBLL - PRINT BLANK LINE * PRTCLR - CLEAR PRINT BUF * PRTMSA - APPEND MESSAGE BEHIND LAST CHAR OR 201 * PRTMSP - APPEND + PRINT + CLEAR * PRTDFF - DO FORM FEED (ADJUST CHANNEL!) * PARAMETER: MESSAGE RIGHTMOST ADDRESS IN X1 * PRTOFF DCW @000@ * OFFSET * SIMPLY PRINT LEFT ADJUSTED PRTMSG SBR PRTMGR+3 * ENTRY: PRINT MSG LEFT CS PBUF+98 * CLEAR BUFFER CS PBUF+131 * CLEAR BUFFER MCW X1,PRTWM1+3 * SET SRC ADR OF PRINT MCW MCW +PBUF,PRTOFF * OFFSET IS ZERO B PRTLP * DO ADJUSTMENT W * PRINT PRTMGR B 000 * * CLEAR PRINT BUF PRTCLR SBR PRTCRR+3 * ENTRY CS PBUF+98 * CLEAR BUFFER CS PBUF+131 * CLEAR BUFFER PRTCRR B 000 * * PRINT BLANK LINE * EITHER ACTIVATE CC OR CS+W! PRTBLL SBR PRTMBR+3 * ENTRY * CC J * FORMS CONTROL 1 SPACE CS PBUF+98 * CLEAR BUFFER CS PBUF+131 * CLEAR BUFFER W * PRINT PRTMBR B 000 * * APPEND & PRINT & CLEAR PRTMSP SBR PRTRET+3 * ENTRY B PRTMSA * APPEND W * PRINT CS PBUF+98 * CLEAR BUFFER CS PBUF+131 * CLEAR BUFFER PRTMSR B 000 * * APPEND PRTMSA SBR PRTRET+3 * ENTRY: APPEND MSG MCW X1,PRTWM1+3 * SET SRC ADR OF PRINT MCW MCW +PBUF+132,PRTOFF * START AT RIGHT OF PBUF PRTMSS MA XDEC,PRTOFF * DEC DEST PTR C PRTOFF,+PBUF * LEFT MIN? BE PRTLP1 * YES, STOP SEARCH MCW PRTOFF,PRTMSC+6 * SET ADDRESS FOR BCE CMD PRTMSC BCE PRTMSS,000, * STILL SPACE? NEXT DEC MA XINC,PRTOFF * NO SPACE, RE-ADD ONE B PRTLP1 * SKIP NEXT SBR * * DO LEFT ADJUST AT PRTOFF OFFSET PRTLP SBR PRTRET+3 * ENTRY: APPEND MSG PRTLP1 BW PRTWM,ZERO+X1 * WM IN SRC FOUND? MA XDEC,X1 * NO, DEC SRC PTR MA XINC,PRTOFF * INC DEST PTR C PRTOFF,@332@ * OVERFLOW? BU PRTLP1 * NO, CHECK NEXT H 000,999 * PANIC HALT B *-10 PRTWM MCW PRTOFF,PRTWM1+6 * SET ADDRESS FOR MCW CMD PRTWM1 MCW 000,000 * COPY TEXT TO PRINTBUF PRTRET B 000 * * FORM FEED * ADJUST CHANNEL # OR DEACTIVATE! PRTDFF SBR PRTRET+3 * ENTRY: FORM FEED CC 9 * FEED TO CHANNEL # PRTDFR B 000 * ******************************************************** ENDEND NOP * TEXTS GOES HERE + 200 END START