Hi Rick,
A while ago I found someone else's cylon program (thanks Mark) and modified it to check for ^C as a typed character rather than trying to hook into some tty driver interrupt handler. Here's the full program (my part's just a few lines, using variable named "K03" for ^C).
I paste the program text into the PiDP8 using this set of commands:
.R PIP
*
MARKB2.PL<TTY:
<PASTE> (this line is where you paste the assembler text)
^Z
*^C
.
.PAL
MARKB2.PL.LOAD/G MARKB2
Here's the PAL program text:
/YET ANOTHER BLICKEN LIGHTS PROGRAM. THIS VERSION IS BASED ON
/ONE FOR THE IMSAI 8080, BUT USING THE PDP-8'S EAE
/MULTIPLIER QUOTIENT TO SIMPLY DISPLAY THE FRONT PANEL LIGHT
/PANEL PATTERNS (WHEREAS THE IMSAI USED ITS PROGRAMMED OUTPUT
/DISPLAY).
/
/I HAVE COMMENTED OUT THE RANDOM FEATURE AS I'VE SEEM TO HAVE
/RUN INTO A LIMIT IN PAL & MAC ASSEMBLING CODE THIS LARGE.
/
/ SW 0: 0 - DOT | 1 - DASH
/ SW 1: 0 - RIGHT | 1 - LEFT
/ SW 2: 0 - NORMAL | 1 - BOUNCE
/ SW 3: 0 - NORMAL | 1 - RANDOM (IGNORE OTHERS)
/ SW ALL 1 OR KEYBOARD ^C = TERMINATE AND RETURN TO MONITOR PROGRAM
/
/CREATED JUNE 2022 BY MARK LAWLER
/TERMINATE WITH ^C ADDED BY ALEN SHAPIRO
MUY=7405
MQA=7501
MQL=7421
CAM=7621
IR1=10 /DELAY INNER REGISTER
IR2=11 /DELAY OUTER REGISTER
*200
START, CLA CLL /CLEAR ACCUMULATOR AND LINK
JMS INSTR /DISPLAY INSTRUCTIONS TO USER ON CONSOLE
LOOP, CLA CLL /CLEAR ACCUMULATOR AND LINK
JMS GCMD /GET COMMAND FROM SWITCHES
TAD DSPBTS /LOAD UP AND LIGHT UP
MQL / MQ WITH DISPLAY BITS
JMS DELAY /TAKE A REST SO MQ ISN'T A BLUR
JMS CDSP /COMPUTE NEXT DISPLAY PATTERN
JMS GETCC /EXIT TO MONITOR IF CHAR TYPED (CHANGE TO IF ^C TYPED)
JMP LOOP /LET'S GO DO THIS AGAIN
GCMD, . /ROUTINE TO READ SWITCHES FOR COMMANDS
CLA CLL /CLEAR ACCUMULATOR AND LINK
OSR /READ IN THE SWITCH VALUES
DCA CURSW /STORE AWAY FOR LATER RECALL
TAD CURSW /HAVE THE SWITCH SETTINGS EVEN CHANGED?
CIA / MAKE THE NUMBER NEGATIVE
TAD LASTSW / AND ADD THE LAST TO IT. IF == 0 NO CHANGE
SZA /HAVE SWITCHES CHANGED SINCE LAST TIME?
JMP GCMD0 / YES: LET'S GO DO SOMETHING USEFUL
JMP GCMDE / NO: LET'S GET OUT OF HERE
GCMD0, /SWITCHES CHANGED -- GRAB AND EXECUTE COMMAND
CLA CLL
TAD CURSW /WHAT WERE THOSE SWITCH SETTINGS AGAIN?
DCA LASTSW /STORE THAT THEY'VE CHANGED
TAD CURSW /WHAT WERE THOSE SWITCH SETTINGS AGAIN?
CMA /TEST FOR 7777?
SNA / NO: EXAMINE SWITCH SETTINGS MORE
JMP I [7600 / YES: EXIT TO MONITOR PROGRAM
CMA /WHAT WERE THOSE SWITCH SETTINGS AGAIN?
AND (0001 /DISPLAY A DOT OR A DASH?
SNA / IT WAS THE DASH
JMP GCMD1 / IT WAS THE DOT
CLA CLL
TAD DASH /LOAD THE DASH
DCA DSPBTS / STORE IT
JMP GCMD2 / AND TEST NEXT SWITCH
GCMD1, TAD DOT /LOAD THE DOT
DCA DSPBTS / STORE IT
GCMD2, TAD LASTSW /ARE WE GOING TO THE LEFT OR TO THE RIGHT?
AND (0002
DCA DIR /STORE OUR DIRECTION
GCMD3, TAD LASTSW /DO WE WANT TO BOUNCE IN KITT MODE?
AND (0004
DCA BOUNCE /STORE IF WE BOUNCE OR NOT
GCMD4, TAD LASTSW /DO WE WANT RANDOM BITS?
AND (0010
DCA RANDOM /STORE IF WE WANT RANDMOM BITS OR NOT
GCMDE, JMP I GCMD /RETURN TO CALLER
CDSP, . /ROUTINE TO COMPUTE NEXT DISPLAY PATTERN
CLA CLL /CLEAR AC AND LINK
TAD RANDOM /CHECK FOR RANDOM BITS
SNA /ARE WE RANDOMIZING?
JMP CDSP1 / NO: CALC OUR NEXT ROTATION
JMS GETRND / YES: TEE UP THE NEXT RANDOM NUMBER
DCA DSPBTS /STORE IT FOR DISPLAY
JMP I CDSP /AND RETURN TO CALLER
CDSP1, JMS ROT /TIME TO ROTATE SINCE NOT RANDOM
JMP I CDSP /AND RETURN TO CALLER
GETRND, 0 /ROUTINE GENERATES A RANDOM NUMBER
CLA CLL /CLEAR AC & AL; RN RETURNED IN AC
TAD LRNDMQ /LOAD THE LAST RANDOM MQ VALUE
MQL /STORE THAT IN THE MQ AS NEXT SEED
TAD LSTRND /GET THE LAST RANDOM VALUE
MUY 5545 /MULTIPLY BY 2917 BASE 10
TAD RNDADD /SUM IN RANDOM NUMBER ADDEND
DCA LSTRND /SAVE RANDOM NUMBER FOR NEXT TIME
CLA CLL
MQA /STORE WHAT IS IN MQ
DCA LRNDMQ /LATER AS OUR NEXT SEED VALUE
TAD LSTRND /CALLER EXPECTS RND VAL IN AC
JMP I GETRND /RETURN TO CALLER
ROT, . /MOVE THE DOT/DASH TO LEFT OR RIGHT
CLA CLL /CLEAR AC AND LINK
TAD DSPLNK /WAS THE LINK SET IN PREVIOUS ROTATE?
SZA / NO: SKIP NEXT INSTRUCTION
CML / YES: SET THE LINK BEFORE WE DO NEXT ROTATE
CLA /CLEAR THE AC
TAD DIR /LOAD THE DIRECTION WE ARE SUPPOSED TO ROTATE
SNA / !=0 SO GOING RIGHT
JMP ROTL / ==0 SO GOING LEFT
ROTR, CLA
TAD DSPBTS
RAR /SHIFT RIGHT ONE BIT
JMP ROTE /GO SAVE THE RESULTS
ROTL, CLA
TAD DSPBTS
RAL /SHIFT LEFT ONE BIT
ROTE, DCA DSPBTS /SAVE THE RESULTS
SZL /IS THE LINK SET?
JMP ROTE1 / YES: GO TO STORING LINK IS NOW SET
CLA / NO: STORE THAT THE LINK
DCA DSPLNK / IS NOW CLEAR
JMP I ROT /RETURN TO CALLER
ROTE1, CLA /STORE THAT THE LINK
IAC / HAD BEEN SET WITH THAT
DCA DSPLNK / LAST ROTATE
TAD BOUNCE /SINCE WE HIT END, DO WE CHANGE DIRECTIONS?
SNA / YES: WE'LL NEED TO CHANGE DIRECTIONS
JMP I ROT / NO: RETURN TO CALLER
CLA
TAD DIR /WHAT DIRECTION WERE WE GOING?
SZA / YES: WERE GOING LEFT
JMP ROTE2 / NO: WERE GOING RIGHT
CLA /NOW START GOING RIGHT
IAC
JMP ROTE3
ROTE2, CLA /NOW START GOING LEFT
ROTE3, DCA DIR /STORE OUR NEW DIRECTION,IGNORING DIR SWITCH
JMP I ROT /RETURN TO CALLER
DSPBTS, 0 /BIT PATTERN WE ARE DISPLAYING IN MQ
DSPLNK, 0 /DISPLAY VALUE OF LINK
DOT, 1 /WHAT A DOT SHOULD LOOK LIKE
DASH, 7 /WHAT A DASH SHOULD LOOK LIKE
CURSW, 0 /CURRENT SWITCH SETTINGS
LASTSW, -1 /LAST SWITCH SETTINGS
DIR, 0 /DIRECTION: 0=LEFT; !0=RIGHT (CALL ME LAZY)
BOUNCE, 0 /KITT MODE: 0=OFF; !0=ON
RANDOM, 0 /RANDOM BITS: 0=OFF; !0=ON
LSTRND, 0 /LAST RANDOM NUMBER
LRNDMQ, 541 /LAST RANDOM MQ
RNDADD, 541 /353 BASE 10
DELAYV, -50 /OUTLOOP DELAY
PAGE
DELAY, . /DELAY ROUTINE SO WE CAN SEE WHAT IS GOING ON
CLA CLL /CLEAR AC AND LINK
TAD DELAYV /LOAD OUTER LOOP COUNT
DCA IR2 / AND STORE IT
DELAYO, ISZ IR2 /OUTER DELAY LOOP. DONE?
JMP DELAYI / NO: DO THE INNER LOOP
JMP I DELAY / YES: RETURN TO CALLER
DELAYI, ISZ IR1 /INNER DELAY LOOP. DONE?
JMP DELAYI / NO: DO NEXT INNER LOOP
JMP DELAYO / YES: DO NEXT OUTER LOOP
INSTR, . /ROUTINE TO DISPLAY INSTRUCTIONS ON CONSOLE
TSF /IS THE CONSOLE READY TO RECEIVE OUTPUT?
SKP / NO: WAIT THEN INITIALIZE IT
JMP INSTR1 / YES: OUTPUT OUR INSTRUCTIONS
DELAY /GIVE IT SOME TIME TO COME AROUND
CLA /THEN SEND IT A <NUL> TO
TLS /INITIALIZE FURTHER
INSTR1, JMS WRMSG
TEXT @-MARKBITS PROGRAM-@
JMS WRMSG
TEXT @SW 0: 0 - DOT : 1 - DASH@
JMS WRMSG
TEXT @SW 1: 0 - RIGHT : 1 - LEFT@
JMS WRMSG
TEXT @SW 2: 0 - NORMAL : 1 - BOUNCE@
JMS WRMSG
TEXT @SW 3: 0 - NORMAL : 1 - RANDOM (IGNORE OTHERS)@
JMS WRMSG
TEXT @SW ALL 1 OR KEYBOARD ^C = QUIT@
JMP I INSTR / RETURN MAIN PROGRAM
PAGE
/ WRITE MESSAGE TO CONSOLE
/ CALLING SEQUENCE
/ ... AC MUST BE ZERO
/ JMS WRMSG
/ TEXTZ @MESSAGE@
/ ... NORMAL RETURN, AC == 0
/
WRMSG, .
WRLP,
TAD I WRMSG / MESSAGE TEXT FOLLOWS CALL
MQL / SAVE NEXT MESSAGE WORD IN MQ
ISZ WRMSG / BUMP RETURN ADDRESS
CLA MQA / EMIT HI 6B OF WORD
BSW / SWAP BYTES IN THE AC -- PIP8/E CMD
JMS WRHF
CLA MQA / EMIT LO 6B OF WORD
JMS WRHF
JMP WRLP
WRHF, . / ROUTINE WRITE HI 6B OF WORD
AND K77 / EXTRACT 6B PAL CHAR
SNA / ZERO MARKS END OF MESSAGE
JMP WREX
TAD K40 / CONVERT 6B PAL TO 7B ASCII
AND K77
TAD K40
JMS WRCHR
JMP I WRHF
WREX, TAD K15 / OUTOUT A CR/LF COMBINATION STARTING WITH CR
JMS WRCHR
TAD K12 / FOLLOWED BY LF
JMS WRCHR
JMP I WRMSG
K177, 177
K77, 77
K40, 40
K15, 15
K12, 12
K03, 3 /^C
TMP, 0
/ WRITE CHARACTER TO CONSOLE
/ CALLING SEQUENCE
/ ... AC MUST CONTAIN 7B ASCII CHAR
/ JMS WRCHR
/ ... NORMAL RETURN, AC == 0
/
WRCHR, 0
TSF /TEST IF READY FOR NEXT
JMP .-1 /WAIT UNTIL READY
TLS /SEND THE CHARACTER
CLA /SOME CONSOLES DO NOT CLEAR AC
JMP I WRCHR /RETURN TO CALLER
GETCC, 0
KSF /SKIP IF CHAR READY
JMP I GETCC /RETURN TO CALLER (NOTHING THERE)
KRB /READ CHARACTER INTO AC
AND K177 /JUST 7 BITS OF CHAR
/ECHO CHAR AND RESTORE IT FOR EXIT TEST
DCA TMP /SAVE CHAR
TAD TMP /RESTORE AC
JMS WRCHR /ECHO CHAR
TAD TMP /RESTORE AC AS WRCH CLEARS AC
/TEST IF KB CHAR WAS ^C
CMA IAC /AC = -AC
TAD K03 /AC += K03 (AC = -AC + K03)
SZA /ZERO IF CHAR == ^C, EXIT TO MONITOR
JMP I GETCC /RETURN TO CALLER (NOT ^C)
JMP I [7600 /EXIT TO MONITOR PROGRAM
$