Here’s the code for the Banner Puncher (updated 20 June 2016):
/ ************************************************************ / / VERBUM.PAL PUNCHES READABLE TEXT ON PAPER TAPE / RESURRECTED FOR PDP-8 USING ERIC L SMITH'S VERBUM.C AS A MODEL / COPYRIGHT 2016, WILLIAM C. WUTTKE JR. / 17 JUN 2016 - REV 1.0 / - ADDED CONTROL-C CHECKING / - ADDED CHARACTER BOUNDS CHECKING / - ADDED BASIC EDITING (RUBOUT - BACKSPACE BUFFER) / ************************************************************ / MAIN / ************************************************************ *200 CLA CLL TAD MSGPTR / PRINT MSG: "ENTER TEXT FOLLOWED BY CARRIAGE RETURN" JMS PRMSG JMS INSTR / GET INPUT TEXT INTO BUFFER TAD (-74) / SIX INCHES OF LEADER JMS PCHZ / PUNCH LEADER TAD BUFF / PUNCH BANNER TEXT JMS PCHSTR TAD (-74) / SIX INCHES OF LEADER JMS PCHZ / PUNCH TRAILER JMP I (7600) / END PROGRAM: BACK TO MONITOR / ************************************************************ / PRINT WELCOME MESSAGE - ACC HOLDS POINTER TO STRING / ************************************************************ PRMSG, 0 DCA BUFFPT / STORE MSG POINTER CLA CLL TLS / TLS TO SET PRINTER FLAG JMS CRLF / RETURN CARRIAGE CHRTYP, TAD I BUFFPT / GET A CHARACTER SNA / IS IT ALL ZEROS? JMP I PRMSG / YES: RETURN JMS TYPE / NO: TYPE OUT THE CHARACTER ISZ BUFFPT / INCREMENT THE BUFFER POINTER JMP CHRTYP / TYPE ANOTHER CHARACTER / ************************************************************ / TYPE A CARRIAGE RETURN AND LINE FEED / ************************************************************ CRLF, 0 / CARRIAGE RETURN AND LINE FEED TAD (215) / TYPE CR FIRST JMS TYPE TAD (212) / TYPE LINE FEED JMS TYPE JMP I CRLF / ************************************************************ / TYPE A CHARACTER - ACC HOLDS CHAR / ************************************************************ TYPE, 0 TSF / PRINTER READY YET? JMP .-1 / NO: CHECK AGAIN TLS / TYPE IT CLA / CLEAR ACCUMULATOR JMP I TYPE / ************************************************************ / INPUT STRING INTO BUFFER / CONTROL-C QUITS / RUBOUT "ERASES" LAST CHAR FROM BUFFER, QUITS IF PAST START OF BUFFER / *******COULD BE USED AS A GENERIC LINE INPUT ROUTINE******** / ************************************************************ INSTR, 0 CLA CLL TAD BUFF / SET UP BUFFER SPACE DCA BUFFPT / STORE POINTER LISN, KSF / KEYBOARD STRUCK YET? JMP .-1 / NO, CHECK AGAIN KRB / YES, READ CHARACTER DCA I BUFFPT / STORE CHARACTER TAD I BUFFPT / RECALL CHARACTER TAD MCTRLC / CHECK FOR CONTROL-C SNA JMP I (7600) / YES, EXIT CLA CLL / NO, CONTINUE TAD I BUFFPT / RECALL CHARACTER TAD MRUB / CHECK FOR RUBOUT SNA JMP RUBOUT / YES, PROCESS RUBOUT CLA CLL / NO, CONTINUE TAD I BUFFPT / RECALL CHARACTER TAD MCR / CHECK FOR CR SNA JMP DONE / YES, CHARACTER IS A CR CLA CLL / NO, CONTINUE TAD I BUFFPT / RECALL CHARACTER TAD (-237) / CHECK FOR < 240 SPA JMP LISN / YES, CHARACTER < 240, GET ANOTHER CLA CLL / NO, CONTINUE TAD I BUFFPT / RECALL CHARACTER TAD (-340) / CHECK FOR > 337 SMA JMP LISN / YES, CHARACTER > 337, GET ANOTHER CLA CLL / NO, CONTINUE TAD I BUFFPT / RECALL CHARACTER JMS TYPE / PRINT IT CLA CLL DCA RUBFLG / RESET RUBOUT FLAG ISZ BUFFPT / POINT TO NEXT BUFFER LOCATION JMP LISN / GET ANOTHER CHARACTER DONE, CLA CLL / STORE 0 IN LAST LOCATION DCA I BUFFPT / OVERWRITES CR JMP I INSTR / RETURN RUBOUT, CLL CLA TAD RUBFLG / IS RUBOUT FLAG SET? SNA JMP RUB1 / NO, PRINT '\' AND LAST CHAR JMP RUB2 / YES, PRINT LAST CHAR RUB1, CLA CLL TAD (334) / TYPE '\' JMS TYPE CLA CLL IAC DCA RUBFLG / SET RUBOUT FLAG RUB2, CLA CLL CMA TAD BUFFPT / DECREMENT BUFFER POINTER TO BEFORE RUBOUT DCA BUFFPT TAD I BUFFPT / GET LAST CHAR JMS TYPE / PRINT IT CLA CLL TAD BUFFPT / ARE WE BACKED UP BEYOND START OF BUFFER? TAD MBUFF SMA JMP LISN / NO, GET ANOTHER CHARACTER JMP I (7600) / YES, QUIT BUFF, 2000 MBUFF, -2000 RUBFLG, 0 MCR, 7563 MCTRLC, 7575 MRUB, 7401 / ************************************************************ / PUNCH COLUMN / ************************************************************ PCHC=TYPE / SAME ROUTINE TO PUNCH OR TYPE / ************************************************************ / PUNCH ZEROS - ACC HOLDS (-) COUNT / CONTROL-C QUITS / ************************************************************ PCHZ, 0 DCA COUNT / STORE COUNT, 0 IN ACC JMS PCHC / PUNCH IT KRB / CHECK FOR CONTROL-C TAD MCTRLC SNA JMP I (7600) / YES, QUIT CLA CLL / NO, CONTINUE ISZ COUNT / ARE WE DONE? JMP .-7 / IF NOT, PUNCH AGAIN JMP I PCHZ / ELSE RETURN PAGE / ************************************************************ / PUNCH CHARACTER - ACC HOLDS CHARACTER / ************************************************************ PCHCHR, 0 TAD (-240) / GET OFFSET OF CHARACTER FROM START OF TABLE DCA CHAR / TEMP STORE CHAR CLA CLL TAD CHAR / GET IT BACK CLL RAL / TIMES 2 - LINK MUST BE CLEARED CLL RAL / TIMES 4 - LINK MUST BE CLEARED TAD CHAR / MAKES TIMES 5 = OFFSET INTO CHARACTERS TABLE TAD CHTBLP / ADD OFFSET TO START OF CHARS TABLE DCA COLP / STORE IT IN COLUMN POINTER TAD (-5) / 5 COLUMNS DCA COUNT / STORE COUNT PCHCOL, TAD I COLP / GET CURRENT COLUMN JMS PCHC / PUNCH IT ISZ COUNT / LAST COLUMN? JMP NXTCOL / IF NOT GET NEXT COLUMN CLA CLL / CLEAR ACC & LINK TAD (-2) JMS PCHZ / PUNCH 2 BLANK COLUMNS CLA CLL / CLEAR ACC & LINK JMP I PCHCHR / AND RETURN - WE'RE FINISHED NXTCOL, ISZ COLP / INCREMENT COLUMN POINTER NOP JMP PCHCOL / PUNCH IT / ************************************************************ / PUNCH STRING - ACC HOLDS POINTER TO STRING / CONTROL-C QUITS / ************************************************************ PCHSTR, 0 DCA BUFFPT / STORE MSG POINTER CLA CLL TLS / TLS TO SET PRINTER FLAG CHRPCH, TAD I BUFFPT / GET A CHARACTER SNA / IS IT ALL ZEROS? JMP I PCHSTR / YES: RETURN JMS PCHCHR / NO: PUNCH THE CHARACTER KRB / CHECK FOR CONTROL-C TAD MCTRLC SNA JMP I (7600) / YES, QUIT CLA CLL / NO, CONTINUE ISZ BUFFPT / INCREMENT THE BUFFER POINTER JMP CHRPCH / PUNCH ANOTHER CHARACTER JMP I PCHSTR COLP, 0 / COLUMN POINTER CHAR, 0 / CHARACTER POINTER COUNT, 0 / GENERAL PURPOSE COUNTER STORAGE *100 BUFFPT, 0 / BUFFER POINTER IN PAGE 0 / ************************************************************ / PAPER TAPE PUNCH READABLE CHARACTERS TABLE / ************************************************************ *600 CHTBL, 000;000;000;000;000 / SPACE (240) 000;000;175;000;000 / BANG 000;140;000;140;000 / DOUBLE QUOTE 024;177;024;177;024 / OCTOTHORPE 022;052;177;052;044 / DOLLAR SIGN 142;144;010;023;043 / PERCENT SIGN 066;111;065;002;005 / AMPERSAND 000;000;160;000;000 / SINGLE QUOTE 000;034;042;101;000 / LEFT PARENTHESIS 000;101;042;034;000 / RIGHT PARENTHESIS 042;024;177;024;042 / SPLAT 010;010;076;010;010 / PLUS 000;001;006;000;000 / COMMA 010;010;010;010;010 / HYPHEN 000;000;001;000;000 / PERIOD 002;004;010;020;040 / SLASH 076;105;111;121;076 / 0 000;041;177;001;000 / 1 043;105;111;111;061 / 2 102;101;111;131;146 / 3 014;024;044;177;004 / 4 162;121;121;121;116 / 5 036;051;111;111;106 / 6 100;107;110;120;140 / 7 066;111;111;111;066 / 8 061;111;111;112;074 / 9 000;000;024;000;000 / COLON 000;001;026;000;000 / SEMICOLON 010;024;042;101;000 / LESS THAN 024;024;024;024;024 / EQUALS 000;101;042;024;010 / GREATER THAN 040;100;115;120;040 / QUESTION MARK 076;101;135;115;071 / AT SIGN 037;044;104;044;037 / A 177;111;111;111;066 / B 076;101;101;101;042 / C 177;101;101;101;076 / D 177;111;111;111;101 / E 177;110;110;110;100 / F 076;101;101;111;157 / G 177;010;010;010;177 / H 000;101;177;101;000 / I 002;001;001;001;176 / J 177;010;024;042;101 / K 177;001;001;001;001 / L 177;040;030;040;177 / M 177;020;010;004;177 / N 076;101;101;101;076 / O 177;110;110;110;060 / P 076;101;105;102;075 / Q 177;110;114;112;061 / R 062;111;111;111;046 / S 100;100;177;100;100 / T 176;001;001;001;176 / U 174;002;001;002;174 / V 177;002;014;002;177 / W 143;024;010;024;143 / X 140;020;017;020;140 / Y 103;105;111;121;141 / Z 177;177;101;101;101 / LEFT BRACKET 040;020;010;004;002 / BACKSLASH 101;101;101;177;177 / RIGHT BRACKET 004;010;020;010;004 / CARET 001;001;001;001;001 / UNDERSCORE (337) MSG, "E;"N;"T;"E;"R;" ;"T;"E;"X;"T;" ;"F;"O;"L;"L;"O;"W;"E;"D;" ;"B;"Y; " ;"C;"A;"R;"R;"I;"A;"G;"E;" ;"R;"E;"T;"U;"R;"N;":;215;212;0 MSGPTR, MSG / MESSAGE POINTER CHTBLP, CHTBL / CHARACTER TABLE POINTER $