Code-VERBUM.PAL

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
$
%d bloggers like this: