$LIST 5 $BEGIN / / SOLITAIRE FOR THE 7502 / $TEMP R9, R10, R11, R2, R13, R14 $DEF STP = R5, GBASE = R6 $DEF NP = R4, SYM = R3, TEMP = R7 $DEF MARK = R8 STP = #STACK GBASE = #STAT MARK = X'4000' JUMP SOLENT OUT: STP = W(STP) NP = NP-1 TEMP = NP REC TEMP, PC, 1 $MACRO CALL ROUT W(STP+VARP) = STP STP = STP+VARP DUMP NP, PC, 1 JUMP ROUT $END $MACRO ROUTINE NAME $REDEF VARP = 1 NAME: $BEGIN $END $DEF VARP = 1 $MACRO VAR NAME $DEF NAME = W(STP+VARP) $REDEF VARP = VARP+1 $END $DEF GVARP = 0 $MACRO GVAR NAME $DEF NAME = W(GBASE+GVARP) $REDEF GVARP = GVARP+1 $END $DEF WC = 0, FREF = .ZZZ, BREF = .AAA $DEF NESTL = 0 $MACRO FORALL VAR, LOW, INC, UPPER $REDEF WC = WC+1, NESTL = NESTL+1 $REDEF BREF = BREF-1, FREF = FREF+1 VAR = LOW-INC BREF?: JUMP FREF? IF VAR >= UPPER VAR = VAR+INC $END $MACRO REP JUMP BREF? FREF?: $REDEF BREF = BREF+1, FREF = FREF-1 $IF NESTL = 1 $REDEF FREF = .ZZZ+WC, BREF = .AAA-WC $FINISH $REDEF NESTL = NESTL-1 $END GVAR NOLEFT; GVAR X; GVAR Y; GVAR TOT GVAR HUN; GVAR DOWN $DEF BLANK = 2, PEG = 7 $DEF BOARD = X'415E', MIDDLE = 489 ROUTINE MOVE VAR X; VAR Y; VAR Z; VAR JUMPP; VAR TO; VAR BP DOWN=DOWN+1 FORALL X,1,1,7 FORALL Y,1,1,7 BP = (Y<<2+Y)<<5+(X<<1)+X-163 JUMP EMPTY IF BOARD(BP) # PEG FORALL Z,1,1,4 PC = PC+Z JUMP DIR1 JUMP DIR2 JUMP DIR3 JUMP DIR4 DIR1: JUMP CONT IF Y >= 6 JUMPP=BP+160 TO=JUMPP+160 JUMP TESTI DIR2: JUMP CONT IF X >= 6 JUMPP=BP+3 TO=BP+6 JUMP TESTI DIR3: JUMP CONT IF Y <= 2 JUMPP=BP-160 TO=JUMPP-160 JUMP TESTI DIR4: JUMP CONT IF X <= 2 JUMPP=BP-3 TO=JUMPP-3 TESTI: IF BOARD(JUMPP)=PEG AND BOARD(TO)=' ' BOARD(BP)=' ' BOARD(JUMPP)=' ' BOARD(TO)=PEG NOLEFT=NOLEFT-1 W(MARK) = PEG MARK = MARK+1 CALL MOVE IF NOLEFT=1 AND BOARD(MIDDLE)=PEG DOWN=DOWN-1 JUMP OUT FINISH BOARD(BP)=PEG BOARD(JUMPP)=PEG BOARD(TO)=' ' NOLEFT=NOLEFT+1 MARK = MARK-1 W(MARK) = ' ' FINISH CONT: REP EMPTY: REP REP DOWN=DOWN-1 JUMP OUT $END / / SOLENT: FORALL X,1,1,7 FORALL Y,1,1,7 BOARD((Y<<2+Y)<<5+(X<<1)+X-163) = BLANK BOARD((Y<<2+Y)<<5+(X<<1)+X-163) = PEG IF 3 <= X AND X <= 5 BOARD((Y<<2+Y)<<5+(X<<1)+X-163) = PEG IF 3 <= Y AND Y <= 5 REP REP BOARD(MIDDLE)=' ' TEMP = BOARD-80 FORALL X, 0, 1, 18 W(TEMP+X) = '+' REP TEMP = BOARD-81 FORALL X, 0, 1, 14 W(TEMP) = '+'; W(TEMP+20) = '+' TEMP = TEMP+80 REP TEMP = TEMP-79 FORALL X, 0, 1, 18 W(TEMP+X) = '+' REP TOT=0 HUN=0 DOWN=0 NOLEFT=32 TEMP = #MESS WHILE W(TEMP) # 0 SYM = W(TEMP) PRINT SYM TEMP = TEMP+1 REPEAT CALL MOVE HOWL MESS: 'STARTED', 0 STAT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 STACK: $END $END