File PRTC12-F

Directory of image this file is from
This file as a plain text file

*20
/
/Q AND A HANDLER FOR TC12-F
/TAPE CONVERTER PROGRAM
/
/
*15
/
/
DIVCNT, 0
        0
        0
	LDF 1
	JMP QAINIT
	TXTINTRO&3777   /10 BIT ADDRESS PLUS DATA FIELD BIT;
	3777		/JUST A SAFE ADDRESS;
	JMP QARFSH
        		/LINE-FEED DURING INTRO
	        	/RETURNS PROGRAM TO HERE
/
/
/
/
	LDF 3
QAREAD, JMP QAINIT
	TXTRDE&3777     /10 BIT ADDRESS PLUS DATA FIELD BIT;
	ANSWR1&3777
	JMP QARFSH
/
/
/
/
/
/
/
UNREAD, SET I 17	/ROUTINE TO GET NUMBER
	ANSWR1&3777	/OF BLOCKS TO BE TRANSFERRED
	SET I 16
M4,     -4		/4 NUM ANS
	SET I 15
	NUMBRS-1	/ANS ADD -1
	SET I 13
	JMP QAREAD	/RETURN JMP
	JMP GET		/GET ANSWER;
	AZE I		/IS RDENUM=0?
	JMP QAREAD	/YES;
	APO		/NOT ZERO;NEGATIVE?
	JMP QAREAD	/YES; TRY AGAIN
	ADA I 14	/ADD -2000
	APO I		/TOO MANY?
	JMP QAREAD	/YES TRY AGAIN
	ADA I 14	/ADD +2000
	STC RDENUM	/NUM OF BLOCKS
/
/
	SET I 17	/ROUTINE TO GET TAPE UNIT NO.
	ANSWR1&3777+4003
	SET I 16
	-1		/1 NUM ANS
	SET I 15
	NUMBRS-1	/ANS ADD -1
	JMP GET		/GET ANS
	STC RDEFU	/UNIT
/
/
	SET I 17	/ROUTINE TO GET STARTING BLOCK
	ANSWR1&3777+4004
	SET I 16
	-4		/4 WORD ANS
	SET I 15
	NUMBRS-1	/ANS ADD-1
	JMP GET		/GET ANS
	STC RDEBN	/BLOCK NUM
/
/
	SET I 17	/GET READ FORMAT
	3777&ANSWR1+4002
	SET I 16
	-1		/1 NUM ANS
	SET I 15
	CHARS-1		/ANS ADD-1
	JMP GET		/GET ANS
	MUL I		/CONVERT TO MODOP ADDRESS
	3
	ADA I		/CHANGE RANGE
M3,	-3		/FROM 3,6,9 TO
	STC MODOP	/0,3,6
	JMP QAWRIT	/GET NEXT FRAME
/
/
NUMBRS,	-57		/NUMBER  LIMITS
	+57
	-67
	+67
	-2000
	+2000
CHARS,	0		/CHAR LIMITS
	0
	-3
	+3
/
/
QAWRIT,	JMP QAINIT	/WRITE FRAME
	TXTWRI&3777	/10 BIT ADDRESS PLUS DATA FIELD BIT
	ANSWR2&3777
	JMP QARFSH
/
/
UNWRIT,	SET I 17	/GET UNIT TO WRITE ON;
	ANSWR2&3777+1
	SET I 16	/1 NUM ANS
	-1
	SET I 15
	NUMBRS-1
	SET I 13
	JMP QAWRIT	/RETURN ADD
	JMP GET		/GET ANS
	STC WRIFU	/UNIT
/
/
	SET I 17	/GET STARTING BLOCK FOR WRITE;
	ANSWR2&3777+2
	SET I 16
	-4		/4 NUM ANS
	SET I 15
	NUMBRS-1	/ADDRESS-1
	JMP GET		/GET ANS
	STC WRIBN	/BLOCK
/
/
	SET I 17
	ANSWR2&3777	/ANS ADD
	SET I 16
	-1		/1 NUM ANS
	SET I 15
	CHARS-1		/CHECK ADD
	JMP GET		/GET ANS
	ADM I
MODOP,  0		/FORMAT
	ADA I		/GENERATE JMP STA
	JMP 0+SETUP
	STC SETUP
	CLR     	/CLEAR THE LINK BIT
	LDF 3
QPAR,	JMP QAINIT	/PARITY FRAME
	TXTPAR&3777
	ANSWR3&3777
	JMP QARFSH
UNPAR,	LDA		/CHECK PAR ANSWER
	ANSWR3&3777
	ROR 1
	APO		/NO CHECK
	JMP .+4		/YES
	LDA I
	NOP		/REPLACE JMPRDEAGN WITH NOP
	JMP .+3
	LDA I
	JMP RDEAGN
	STA
	PARERR!2000
	CLR
/
/
/
SETUP,  JMP		/MODES OF OPERATION
	JMP MODOP1
	JMP MODOP2
	JMP MODOP3
	JMP MODOP4
	JMP MODOP5
	JMP MODOP6
	JMP MODOP7
	JMP MODOP8
	JMP MODOP9
/
/
/
/
GET,    SET 1		/SAVE RETURN JMP
	0
	CLR
	STC HOLD
NEXT,	LDH I 17	/THIS ROUTINE GETS THE ANSWERS
	SAE I
	00
	SKP
	JMP HOLD-3
	SET 14
	15
	ADA I 14	/SUBTRACT LOWER LIMIT
	APO		/
	JMP 13
	ADA I 14	/ADD LOWER LIMIT BACK
	ADA I 14	/SUBTRACT UPPER LIMIT
	APO I		/
	JMP 13
	ADA I 14	/ADD UPPER LIMIT BACK
	BCL I		/JUST TO BE SURE
	7770
	ROR 3
	ADD HOLD
	ROL 3
	STC HOLD
	XSK I 16
	JMP NEXT
	LDA I
HOLD,	0
	JMP 1
/
/
/
/
MODOP1, ADD P8FMT1      /PDP-8 TO PDP-8
	STC RDELNG
	ADD P8FMT2	/129 WORD TRANSFER
	STC WRILNG
	ADD RDENUM	/NUM OF BLOCKS TO READ
	STC WRINUM	/AND WRITE
	ADD M16		/DO 16 AT A TIME
	STA
	RDLTAN!2000
	STA
	WDLTAN!2000
	LDA I		/TOTAL WORDS PER BLOCK		
	-201
	STA 
	RDEKEY!2000
	LDA I
	-202
	STA 
	WRIKEY!2000
	JMP GO		/DO THE JOB !
/
/
/
/
MODOP2, ADD P8FMT1       /PDP-8 TO PDP-12
	STA		/WRITE 129 WORDS
	ADDINC!2000	/IN A 400 WORD BLOCK
	STC RDELNG	/READ 129 WORDS
	ADD RDENUM
	STC WRINUM	/1:1 BLOCK TRANSFER
	LDA I
M16,    -16
	STA 
	RDLTAN!2000
	STA
	WDLTAN!2000
	LDA I
	-201
	STA
	RDEKEY!2000
	CLR
	COM
	STA
	WRIKEY!2000
	JMP GO
/
/
/
/
MODOP3, ADD P8FMT0	/PDP-8 TO PDP-N
	STC RDELNG
	ADD P10FM1
	STC WRILNG
	LDA I
	-3
	STC DIVISR
	JMP DIVIDE
	CLR
	ADD DIVCNT
	STC WRINUM
	LDA I
M14,    -14
	STA
	RDLTAN!2000
	LDA I
	-4
	STA
	WDLTAN!2000
	LDA I
	-201
	STA
	RDEKEY!2000
	LDA I
M601,	-601
	STA 
	WRIKEY!2000
	JMP GO
/
/
/
/
MODOP4, ADD P8FMT1      /PDP-12 TO PDP-8
	STC WRILNG	/READ 400 WORDS
	ADD RDENUM	/WRITE 200 WORDS
	ROL 1		/1:2 BLOCK TRANSFER
	STC WRINUM
	LDA I
K400,	400
	STA
	ADDINC!2000
	LDA I
M7,	-7
	STA
	RDLTAN!2000
	LDA I
	-16
	STA
	WDLTAN!2000
	CLR
	COM
	STA
	RDEKEY!2000
	LDA I
	-202
	STA
	WRIKEY!2000
	JMP GO
/
/
/
/
MODOP5, ADD RDENUM      /PDP-12 TO PDP-12
	STC WRINUM
	ADD M7
	STA
	RDLTAN!2000
	STA
	WDLTAN!2000
	CLR
	ADD K400
	STA
	ADDINC!2000
	CLR
	COM
	STA
	RDEKEY!2000
	STA
	WRIKEY!2000
	JMP GO
/
/
/
/
MODOP6, ADD P10FM1   /PDP12 TO PDP-N
	STC WRILNG
	ADD M3
	STC DIVISR
	JMP DIVIDE
	ADA I   	/ACC =-2 INDICATES REMAINDER WAS 1; I.E., RDENUM =1,4,7, ETC.;
K1,     1
	SAE I   	/ADDING 1 WOULD MAKE ACC=7776=-1;
	7776
	JMP .+3		/NO;ACC NOT = -1
	STC EXTRA	/YES; NOW PUT IN EXTRA TO SUBTRACT 1 
	JMP MULT2	/AFTER MULTIPLYING DIVCNT BY 2;
	CLR		/ACC NOT = -1;
	STC EXTRA	/CLEAR EXTRA;
MULT2,	ADD DIVCNT	/GET RESULTS OF DIVISION;
	ROL 1		/MULTIPLY BY 2;
	ADA I
EXTRA,	0		/ADD EXTRA;
	STC WRINUM
	ADD K400
	STA
	ADDINC!2000
	LDA I
M6,     -6
	STA
	RDLTAN!2000
	LDA I
	-4
	STA
	WDLTAN!2000
	CLR
	COM
	STA
	RDEKEY!2000
	LDA I
	-601
	STA
	WRIKEY!2000
	JMP GO
/
/
/
/
MODOP7, ADD P10FMT      /PDP-N TO PDP-8
	STC RDELNG
	ADD P8FMT1
	STC WRILNG
	ADD RDENUM
	MUL I
	3
	STC WRINUM
	ADD M4
	STA
	RDLTAN!2000
	LDA I
	-14
	STA
	WDLTAN!2000
	LDA I
M600,	-600
	STA
	RDEKEY!2000
	LDA I
	-202
	STA
	WRIKEY!2000
	JMP GO
/
/
/
/
MODOP8, ADD P10FMT      /PDP-N TO PDP-12
	STC RDELNG      /WRIFMT IS OK FOR 12 TAPE
	ADD RDENUM
	STA
	WRINUM
        ROR I 1
 	LAM    		/ADD AGAIN TO MAKE 1.5 X RDENUM;
	WRINUM		/LINK BIT GIVES US EXTRA BLK IF RDENUM WAS AN ODD NUMBER
	STC WRINUM
	ADD M4
	STA
	RDLTAN!2000
	CLR
	ADD M6
	STA
	WDLTAN!2000
	LDA I
	400
	STA
	ADDINC!2000
	CLR
	COM
	STA
	WRIKEY!2000
	CLR
	ADD M600
	STA
	RDEKEY!2000
	JMP GO
/
/
/
/
MODOP9, ADD P10FMT      /PDP-N TO PDP-N
	STC RDELNG
	ADD P10FM1
	STC WRILNG
	ADD RDENUM
	STC WRINUM
	ADD M4
	STA
	RDLTAN!2000
	STA
	WDLTAN!2000
	CLR
	ADD M601
	STA
	WRIKEY!2000
	CLR
	ADD M600
	STA 
	RDEKEY!2000
/
/
/
/
GO,     PDP
PMODE
JOB1,   JMS I READPT
LMODE
RDEFU,  0000
RDELOC, 0000    	/ALWAYS LEFT AS 0000
RDELNG, 0000
RDEBN,  0000
RDENUM, 0000
/
PMODE
JOB2,   JMS I WRITPT
LMODE
WRIFU,  0000
WRILOC, 0000
WRILNG, 0000
WRIBN,  0000
WRINUM, 0000
PMODE
WRIEXIT,LINC
LMODE
	LDF 3
	LDA
	NBLOCK!2000	/GET REMAINING BLOCKS
	BSE I 
	6000
	AZE I		/ARE WE FINISHED?
	JMP DONE	/YES
	PDP		/HELL NO
	PMODE
	JMP JOB1	/OK; GO READ MORE
	HLT
	HLT		/TRY AGAIN;
/
READPT, READ!6000
WRITPT, WRITE!6000
LMODE
P8FMT0,	0200	/WORDS PER BLOCK
P8FMT1,	0201
P8FMT2,	0202
P10FMT, 0600
P10FM1, 0601
/
/
/
/
DIVIDE, SET 1		/SET UP RETURN JUMP;
	0
	CLR		/CLEAR DIVIDEND
	STC DIVCNT
	ADD RDENUM
	XSK I DIVCNT	/INCREMENT DIVIDEND;
	ADA I
DIVISR, 0		/SUBTRACT DIVISOR;
	APO I		/HAS ACC GONE NEGATIVE YET?
	JMP.-4		/NO;
	JMP 1		/YES; RETURN;
/
/
DONE,   JMP 20		/DISPLAY FRAME 1
/
////
	LMODE
	SEGMNT 2
/QANDA SUBROUTINE FOR THE
/PDP-12
/REMOVE *1000 BELOW IF
/INSERTING SOURCE DIRECTLY
/INTO YOUR PROGRAM SOURCE
*1113 /REMOVE,IF DESIRED
/
/TO HERE TO INITIALIZE THE ROUTINE
/
	NOLIST
/
QAINIT,	LDA I		/SAVE JMP RETURN
	2
	ADD 0
	STA I
QAB,	0		/JMP 	+3
	ADD QAL+3
	STC 1		/PTR TO FIRST PARAM
	LDA 1		/GET FIRST PARAM
	ADD QAQ+1	/PTR TO HALFWORD-1
	STC QAG-3
	LDA I 1
	STC QARFSH-1
	STC 6		/XR6 USED AS A SWITCH. =0 IF NO ANSWER FIELD, =1777 IF YES
QACA,	SET 3		/XR3 TO PTR TO ANSWERS
	QARFSH-1
	SET 4		/XR4 TO PTR TO QUESTIONS
	QAG-3
			/TO HERE IF FIRST TIME THROUGH OR FOLLOWING A CR
	SET 1
	4
	JMP QAT
	NOP		/F
	LDH I 4		/H. BUMP PTR IF H OR F
QAD,	JMP QAO
	JMP .+6		/74
	JMP QAE		/34
	SAE I		/CR?
	43
	JMP QAD		/NO
	JMP QACA+4 	/EXAMINE NEXT CHAR
			/INITIALIZE ANSWER BUFR
	STH 3		/74 TO ANSWERS
	LDH I 4		/NEXT HALFWORD
	ADA I
	-60
	COM
	STC 6
	STH I 3		/0 IN AC
	XSK I 6
	JMP .-2
	LDH I 3		/BUMP PTR TO ANSWERS
	JMP QAD
			/ANSWER BUFR IS INITIATED
QAE,	STH 3
	SET I 4		/XR4 TO PTR TO LAST TYPED CHAR IN ANSWER BUFR
	0
			/----RE-ENTER HERE TO REFRESH----
QARFSH,	LDA I		/INITIAL Y POSITION
	277
	STC QAH-1
	SET I 3		/XR3 TO PTR TO HALFWORD QUESTIONS-1
	0
	SET 5		/XR5 TO PTR TO LAST DISPLAYED CHAR IN ANSWER BUFR
	QARFSH-1
QAG,	SET 1
	3
	JMP QAT
	JMP .+7		/F
	LDH I 3		/H. BUMP PTR
	LDA I		/NEITHER. ASSUME HALF SIZE
	BCL I
	STC QAM+2	/SET INSTR TO CLEAR FF FOR HALF SIZE
	ADD QAW		/NOP IN AC
	JMP QAM
	LDH I 3		/BUMP PTR
	LDA I
	BSE I
	STC QAM+2	/SET INSTR TO SET FF FOR FULL SIZE
	ADD QAW+1	/ADD 9U IN AC
QAM,	STC QAP+3
	MSC I 4		/EAD CONTROL REGISTER
	BSE I		/THIS INSTR CHANGES. EITHER BSE & OR BCL &
	200
	MSC 4		/AC TO CONTROL REGISTER
	SET I 1		/XR1 TO INITIAL X POSITION
	100
	LDA I		/Y COORDINATE MULTIPLE
	-40
	ADM I		/Y COORDINATE
	0
QAH,	LDH I 3
	JMP QAO+1
	JMP QAZ		/74 BUMP PTR TO NEXT CHAR, PUT 40 IN AC
	JMP QAJ		/34
	SHD I		/NEITHER
	4300
	JMP QAG		/CR. MOVE X AND Y COORDINATE
	JMP QAP		/ISPLAY CHAR
	JMP QAH		/PICK UP NEXT CHAR
	JMP QAP		/TO HERE IF DISPLAYING ANSWER BUFR
	SRO I		/SWITCH TO DISPLAY CURSOR. EITHER 0000 OR 7777
	0		/IFXR4=XR5, THEN SWITCH=7777
	JMP QAF
			/QUESTION MODE
QAI,	LDH I 5
	JMP QAO+1
	JMP QAH		/74
	JMP QAH		/34
	JMP QAI-4	/NEITHER. DISPLAY IT
QAJ,	JMP GETKBD	/TO HERE IF DISPLAYED BUFFER
	AZE I
	JMP QAB		/NOTHING TYPED . EXIT
	SET I 2
	QAY
	SHD 2		/LF?
	JMP QAK+4	/YES. EXIT
	SHD I 2		/CR?
	JMP QAN
	XSK 6		/IS THERE AN ANSWER FIELD?
	JMP QARFSH
	SHD I 2		/<?
	JMP QAL
	SHD I 2		/>?
	JMP QAK
	SHD I 2		/ALT?
	JMP QACA 	/REINITIALIZE
	SHD I 2		/BACK SLASH?
	JMP QARFSH	/IGNORE
	SHD I 2		/RUBOUT?
	JMP QAL		/IGNORE
	SHD I 2		/TAB?$
JMP QARFSH	/IGNORE
	STC .+5		/ACCEPTABLE CHAR
	JMP QAO		/TEST NEXT CHAR
	JMP QAQ		/74 BACK PTR UP BY 1
	JMP QAQ		/34 ^
	LDA I		/OK. STORE IT
	0
	STH 4
	JMP QARFSH	/REDISPLAY
QAL,	LDH 4		/TO HERE IF RUBBOUT OR <
	JMP QAO+1
	JMP QARFSH	/74 IGNORE
	-6002
	LDH 2		/TEST THE CHAR
	SAE I		/RUBOUT?
	37
	JMP QAQ		/NO. BACK PTR UP BY 1
	SET 5
	4
	SET 3
	4
	JMP .+2
	LDH I 5		/BUMP PTR
	LDH I 3		/GET NEXT CHAR
	JMP QAO+1
	NOP		/IF 74 OR 34, REPLACE CURRENT CHAR WITH 0
	CLR
	STH 5
	AZE		/WAS IT 74 OR 34?
	JMP .-7		/NO. CONTINUE
	JMP QAQ		/BACK PTR UP BY 1
			/TO HERE IF CR
QAN,	XSK 6	
	JMP QAK+4	/EXIT ROUTINE IF NO ANSWER FIELD
	JMP QAO
	JMP QARFSH	/74 MOVE PTR TO NEXT QUESTION FIELD
	JMP QAE+1	/34 END OF BUFR. MOVE PTR TO FIRST QUESTION FIELD
	JMP QAN+2
	
QAO,	LDH I 4		/S\R
	SHD I		/	+1 74 BEGIN FIELD
	7400		/	+2 34 END BUFR
	JMP 0		/	+3 NEITHER 74 NOR 34
	SAE I
	34
	XSK I 0
	XSK I 0
	JMP 0
			/S\R TO DISP LINC CHAR IN AC
QAP,	ROL 1		/MULT BY 2 FOR INDEX TO ADDRESS OF TABLE
	ADD QAX+4
	STC 2		/ADDRESS OF CHAR TO DISP IN XR2
	ADD QAU		/THIS INSTR CHANGES. EITHER OP OR ADD 9U
	ADD QAU
	ADD 1		/ADD 4 TO XR1 TO SPACE CHAR
	STC 1
	ADD 5		/GET ADDRESS OF ANSWER BUFR
	COM
	ADD 4
	AZE
	CLR
	STC QAI-2	/SWITCH=0 OR 7777
	ADD QAH-1	/Y COORDINATE IN AC
	DSC 2
	DSC I 2		/DISPLAY CHAR
	JMP 0
QAQ,	LDA I		/BACK UP PTR BY 1
	-4000
	ADM
	4
	JMP QARFSH	/REDISPLAY
			/
QAT,	LDH I 1		/S\R
	SHD I		/	+1 F
	0600		/	+2 H
	JMP 0		/	+3 NEITHER
	SAE I
	10
	XSK I 0
	XSK I 0
	JMP 0
			/
QAZ,	LDH I 3
	LDA I
	40
	JMP QAI-4
			/TO HERE IF >
QAK,	LDH I 4
	AZE I		/IS CURRENT CHAR BLANK?
	JMP QAQ		/YES. IGNORE
	JMP QAX		/MOVE DOT FORWARD
			/TO HERE TO EXIT WITH SKIP
	LDA I
	1
	ADM
	QAB
	JMP QAB
			/CHARACTER PATTERNS
QAV,	0101		/KBD 0, ILLEGAL. USED AS MARKER
	0101
	4477		/1:A
	7744
	5177		/2:B
	2651
	4136		/3:C
	2241
	4177		/4:D
	3641
	4577		/5:E
	4145
	4477		/6:F
	4044
	4136		/7:G
	2645
	1077		/10:H
	7710
	7741		/11:I
	0041
	4142		/12:J
	4076
	1077		/13:K
	4324
	0177		/14:L
	0301
	3077		/15:M
	7730	
	3077		/16:N
	7706	
	4177		/17:O
	7741
	4477		/20:P
	3044
	4276		/21:Q
	0376
	4477		/22:R
	3146
	5121		/23:S
	4651
	4040		/24:T
	4077
	0177		/25:U
	7701	
	0176		/26:V
	7402
	0677		/27:W
	7701
	1463		/30:X
	6314
	0770		/31:Y
	7007
	4543		/32:Z
	6151
	4177		/33:/
	0000
			/34:BACKSLASH IGNORED ON INPUT
	0		/NOT USED
	0		/NOT USED
	0000		/35:]
	7741
			/CODES 36:ALT, 37:RUBOUT NOT DISPLAYED
QAY,	4543		/LF,CR
	7476		/<,>
	3634		/ALT, BACKSLASH
	3747		/RUBOUT, TAB
	0000		/40:SPACE
	0000
	7500		/41:X!
	0000
	7000		/42:"
	0070
			/CODES 43:, 44:, 45:LF NOT DISPLAYED
QAX,	JMP QAO+1
	JMP QAQ
	JMP QAQ
	JMP QARFSH
	QAV
	0		/NOT USED
	5166		/46: &
	0526
			/CODE 47:TAB NOT DISPLAYED
	0		/NOT USED
	0		/NOT USED
	3600		/50:(
	0041
	4100		/51:)
	0036
	2050		/52:*
	0050
	0404		/53:+
	0437
	0500		/54:,
	0006
	0404		/55:-
	0404
	0001		/56:.
	0000
	0601		/57:\
	4030
	4536		/60:0
	3651
	2101		/61:1
	0177
	4523		/62:2
	2151
	4122		/63:3
	2651
	2414		/64:4
	0477
	5172		/65:5
	0651
	1506		/66:6
	4225
	4443		/67:7
	6050
	5126		/70:8
	2651
	5122		/71:9
	3651
	2200		/72::
	0000
	4601		/73:;
	0000
			/CODE 74:<NOT DISPLAYED
QAU,	2		/CONSTANT
	0		/NOT USED
	1212		/75:=
	1212
			/CODE 76:> NOT DISPLAYED
QAW,	NOP
	ADD QAU
	4020		/77:?
	2055
/
QAF,	DSC I
	6000
	JMP QAI
/
			/END Q+A
/
/
/
/
/KEYBOARD INPUT ROUTINE
/
QAKRB=6036	/PDP-8 IOT KBD
QATSF=6041	/TSF
QATLS=6046	/TLS
/
GETKBD,	LDA
	0
	STC QAEXIT+6	/SAVE RETURN
	ADD 1		/SAVE XRS 1 AND 2
	STC QAEXIT+3
	ADD 2
	STC QAEXIT+5
	STC QAEXIT+1
	KST		/WAS SOMETHING TYPED?
	JMP 0		/NO: EXIT
	IOB
	QAKRB		/GET TTY CHAR, CLEAR FLAG
	STA I		/SAVE IT
QATY,	0
	ADA I
	-237
	APO		/BETWEEN 200 AND 237?
	JMP QACNTR	/CONTROL CHAR. CHECK FOR CR,LF,TAB
/
	SET I 1		/NO
	QACHAR-1
	SET I 2
	-7
	LDA
	QATY
	SAE I 1
	JMP .+2
	JMP QAEXIT	/ILLEGAL CHAR. DONT ECHO
	XSK I 2		/CHECKED THEM ALL?
	JMP .-4
/
	ADA I
	-337
	APO		/BETWEEN 240 AND 337?
	JMP QALEGL	/YES. LEGAL CHAR
/
	SAE I 1		/NO. CHECK FURTHER.
	JMP .+7
	LDA I		/RUBOUT
	334
	JMP QATPE	/ECHO BACKSLASH
	LDA I
	37
	JMP QAEXIT+2	/LEGAL EXIT
/
	SAE I 1
	JMP QAEXIT	/ILLEGAL
			/ALT
	JMP QAEXIT+2	/EXIT, DONT ECHO
/
QALEGL,	LDA
	QATY
	JMP QATPE	/ECHO CHAR
	ADD QATY
	BCL I		/STRIP IT TO 6-BIT
	7700
	JMP QAEXIT+2
/TO HERE IF CONTROL CHAR
QACNTR,	SAE I
	7755
	JMP QACKLF
	LDA I		/CR
	43
	STC QAEXIT+1
	LDA I
	215
	JMP QATPE
	LDA I
	212
	JMP QATPE
	JMP QAEXIT
/
QACKLF,	SAE I
	7752
	JMP .+4
	LDA I		/LF
	45
	JMP QACNTR+5
	SAE I
	7751
	JMP QAEXIT	/ILLEGAL
	LDA I
	47
	JMP QAEXIT+2	/EXIT, DONT ECHO
/
QAEXIT,	LDA I	/GET 6-BIT ASCII
	0
	SET I 1		/RESTORE XRS
	0
	SET I 2
	0
	JMP		/EXIR S\R GETKBD
/S\R TO PRINT C(AC)
QATPE,	IOB
	QATLS	/PDP-8 IOT TLS
	LDA
	0
	STC .+4	/SAVE RETURN
	IOB
	QATSF	/WAIT FOR FLAG
	JMP .-2
	JMP 	/EXIT
/
QACHAR,	243	/HASH
	244	/DOLLAR SIGN
	245	/PER CENT
	247		/APOSTROPHE
	300		/AT SIGN
	336		/UP ARROW
	337		/BACK ARROW
	40		/RUBOUT
/
/
/
///////////////////////////////////
/
/
/
	LIST
/
/
/			DECTAPE ROUTINE FOR THE PDP - 12
/		
/
/
/
/
/
/
/
/
/
/
/
LMODE
/
	SEGMNT	3
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
	SBM=414			/SKIP ON BLOCK MARK FLAG
	SWD=457			/SKIP ON WORD IN TAC.
/
/
/
/
/
/
/
	*1
/
/
/
TASK,	HLT
BEST,	0
WCOUNT,	0
BETAR,	0
SKIP,	0
SKIP2,	0
DATAWD,	0
COUNT0,	0
COUNT1,	0
NBLOCK,	0
POINT1,	0
POINT2,	0
IBLOCK, 0
SWITCH, 0
/
/
/
/
/
/
/
/
/
/
/
	*20
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
EXIT,	PDP		/COMES HERE AFTER READS & WRITES
	PMODE
	CLA CLL CML RAR
	6152
	CLA
	JMP I	READ
/
/
/
/
/
/
/
/
/
/
LMODE
/
/
/
/
/
/ITS IMPORTANT THAT "WRITE" LOCATION HAVE A 10 BIT ADDRESS;
/
/
/
WRITE,	0			/GENERALWRITE ROUTINE
PMODE
				/CALLED IN 8 MODE
	LINC			/GET INTO LINC MODE
	LMODE
	LDA
	WRITE			/GET THE CALLING ADDRESS
	STC	READ		/AND PLACE IN THE READ ADDRESS
	SET I	TASK		/SET THE OPERATION TO DO A WRITE
	JMP	DOUTIT		/JMP TO WRITE ROUTINE
	SET I	BEST		/SET THE BEST CASE TO SKIP
	-3			/3 WORDS. THE WRITTERS NEED SOME ROOM
	SET I IBLOCK
WDLTAN, 0			/NUMBER OF BLOCKS WRITTEN AT A TIME
	SET I SWITCH
WRIKEY, 0			/TOTAL NUM WORDS WRITTEN
	LDA I
	0706		/LINC WRITE
	STC INST
	LDA I
	WRIBN!2000		/SET-UP WRITE
	STC BNSET
	LDA I
	WRINUM!2000		/DITTO
	STC NUMSET
	LDA I
	APO 
	STC WRIOK		/CHECK THE WRITE SWITCH
	JMP COMMON		/GO TO THE COMMON READ-WRITE
/
/
/
READ,	0			/GENERAL READ ENTRY
	PMODE			/WE RE IN 8 MODE WHEN CALLED
	LINC			/GET OVER INTO LINC MODE
	LMODE
	SET I	TASK			/SET THE TASK TO READ
	JMP	DINIT
	SET I	BEST		/SET THE BEST CASE TO SKIP
	-4			/ 5 WORDS
	SET I IBLOCK
RDLTAN, 0			/NUM BLKS READ AT A TIME
	SET I SWITCH
RDEKEY, 0			/TOTAL WORDS PER BLK
	LDA I
	0702			/LINC READ
	STC INST
	LDA I
	RDEBN!2000
	STC BNSET		/SET-UP FOR READ
	LDA I
	RDENUM!2000		/NUM BLKS
	STC NUMSET
	LDA I
	NOP
	STC WRIOK		/DONT CHECK WRITE SW
/
/
COMMON,	PDP			/GET OVER INTO 8 MODE TO GET THE ARGUMENYTS
	PMODE
	JMS	AGET		/GET THE ARGUMENTS
	DCA	ARG1
	JMS	AGET
	DCA	ARG2
	JMS	AGET
	DCA	ARG3
	JMS	AGET
	DCA	ARG4
	JMS	AGET
	DCA	ARG5
	JMP	PASTS		/SKIP PAST SUBROUTINE
/
/
AGET,	0
	TAD I	READ
	ISZ	READ
	JMP I	AGET
/
/
/
/
/
/
	LMODE
/
/
/
/
/
/
ARG1,	0		/READ & WRITE ARGS
ARG2,	0
ARG3,	0
ARG4,	0
ARG5,	0
SIZE,	0
TEMP,	0
FBLOCK=ARG4
/
/
/
/
/
/
/
/
/
/
/
	PMODE
/
/
PASTS,	LINC			/GET INTO LINC MODE
	LMODE
	ADD	ARG1		/GET THE FIRST ARGUMENT
	ROL	5		/ROTATE TO GOOD IOB PLACE
	BCL I			/JUST GET BIT 6
	-40
	STC UNITL1		/SAVE UNITS 0 & 1;
	ADD	ARG1		/GET IT AGAIN
	ROR	1		/SHIFT OVER
	BCL I
	-3
	STC	LAXO		/AND STASH AWAY
	ADD	ARG1		/GET THECRAP AGAIN
	ROR	1
	BCL I
	-34
	BSE I
	LDF	0
	STC SDATAF
	ADD	ARG2		/GET THE ADDRESS
	STA
	COREL1			/STORE IN FIRST CORE LOC
	STC COREL2
	/ALSO IN SECOND LOC.
	ADD	ARG3		/GET THE NUMBER OF WORDS TO TDUE
	COM			/NEGATE IT
	STC	SIZE		/AND STASH AWAY
	ADD	ARG5		/GET THE NUMBER OF BLOCKS
	AZE I
	JMP	EXIT		/NO BLOCKS TO DO.
	COM
	STC	NBLOCK		/AND STASH AWAY.
XSK SWITCH
	SKP
JMP LINC			/IF SWITCH=7777
/
/
/
/
/
/
/
WAITL,	LDA I			/THIS WAITS TILL DRIVE IS READY.
	5000
	IOB
	6151			/GET INTO MAINTENANCE MODE
	LDA I
	40
	ADD	LAXO		/ADD ON CORRECT UNITS
	AXO
	LDA
	UNITL1
	ADA I
	206
	IOB
	6152		/SELECT,SET MTN
	LDA I
	100
	IOB
	6152		/SET BACKWARD
	CLR
	IOB
	6154		/READ TRANSPORT STATUS
	ROR I	2
	LZE I
	JMP	WAITL		/UNIT NOT READY YET.
WRIOK,	NOP		/THIS INST. IS REPLACED DURING THE READ/WRITE SUBROUTINE
			/READ=NOP WRITE=APO
	JMP   .+6
	LDA I		/WRITE SWITCH NOT ON;
	4000		/STOP TAPE
	IOB
	6152         	/LTM PRESET
	JMP  WAITL
/
/
/
	CLR		/CLEAR OUT THE MAINTENANCE MODE
	IOB
	6151
	LDA I
LAXO,	0
	AXO
	JMP BACKWARD
/
/
FORWARD,SET DATAWD	/DATA WORDS PER BLOCK
	SIZE
	SET WCOUNT	/TOTAL WORDS PER BLOCK
	SWITCH
	LDA I
	226
	ADA I
UNITL1,	0
	IOB
	6152		/SEL,SET FWD
	SET SKIP
	BEST		/NUM CONTROL WORDS
	SBM		/WAIT FOR BM
	JMP .-1
	TAC		/BN TO AC
	NOP
	SWD		/SKIP FIRST SHORT WORD
	JMP .-1
	JMP INIT	/SHUFFLE
	APO		/ARE WE OUT OF END ZONE?
	JMP FORWARD	/NO
	SAE		/YES
	FBLOCK		/RIGHT BLOCK?
	SKP		/NO
	JMP TASK	/YES; NOW DO IT!
	COM
	ADD FBLOCK
	APO I		/GOING RIGHT DIRECTION??
	JMP FORWARD	/YES, KEEP GOIN
/
/
/
/
/
/
/
/
/
/
BACKWARD,LDA I
	306
	ADA 
	UNITL1
	IOB
	6152		/GO BACKWARD
	LDA
	FBLOCK
	ADA I
	7774
	APO		/IS BLOCK <4?
	JMP DEEP	/YES
	SBM		/WAIT FOR BM
	JMP .-1
	TAC		/BN TO AC
	JMP INIT	/SHUFFLE
	ADA I		/GO 3 BLOCKS PAST DESIRED BLK
	3
	COM
	ADD FBLOCK
	AZE I		/RIGHT BLOCK?
	JMP FORWARD	/YES
	APO		/NO,
	JMP BACKWARD
	JMP FORWARD
/
/
/
/
/
/
/
/
/
/
DEEP,	SBM		/COMES HERE IF BLOCK < 4
	JMP .-1
	TAC		/BN TO AC
	JMP INIT	/SHUFFLE IT
	AZE		/BLOCK 0?
	JMP BACKWARD	/NOT YET!
	SET I COUNT1	/THIS DELAY ALLOWS US TO FIND THE BLK GOING FWD
	-10
	STC COUNT0
	XSK I COUNT0
	JMP .-1
	XSK I COUNT1
	JMP .-3
	JMP FORWARD
/
/
/
/
COREL1,0
/
/
/
/
/
DINIT,	SET SKIP2	/READ ROUTINE
	SKIP
	CLR
	STC LPB
	JMP SDATAF	/JUST SET DF
	XSK I SKIP2	/SKIP 3 CONTROL WORDS
	SKP
	JMP IGETCK	/GET REV CS
	SWD		/SKIP ON WD FLAG
	
	JMP .-1
	SWD
	JMP DINIT+2	/REPEAT
	JMP .-2
/
/
IGETCK,	SWD		/WAIT FOR REV CS
	JMP .-1
	TAC		/GET IT
	JMP INIT	/PUT IN LPB & SHUFFLE
/
/
/
/
IGETIT,	SWD		/WAIT FOR WORD
	JMP .-1
	TAC		/TAPE AC TO AC
	JMP INIT	/COMP PARITY &SHUFFLE
	PDP
	PMODE
	DCA I COREL1	/STORE DATA
	ISZ  COREL1	/INCR ADD
	NOP
	LINC
	LMODE
	XSK I WCOUNT	/FINISHED?
	SKP		/NO
	JMP IGETLP	/YES,GET CS
	XSK I DATAWD	/GOT ALL DATA?
	JMP IGETIT	/NO,GO TO IT
	JMP LASTWD	/GET LAST WORD
IGETLP, SWD              /WAIT FOR LPB
	JMP  .-1
        TAC              /LPB TO AC
	BCL I		/CS IS ONLY 6 BITS
	1463		/CLEAR LEFT HALF
	JMP INIT	/COMP PARITY
	CLR
	ADD LPB		/GET PARITY BUF
	JMP LPB+5	/SHUFFLE IT
	STA
	LPB
	ROL 6		/XOR L&R
	BCO
	LPB
	ROR 6
	AZE     	/GOOD CHK SUM?
PARERR,	JMP RDEAGN	/NO!TRY AGAIN
/
/
/
/
/
RDEDUN, LDA I
	1
	ADM
	FBLOCK		/INCR BLOCK
	XSK I NBLOCK	/ALL DONE?
	SKP  		/NOT DONE YET
	JMP EXIT  	/YES DONE
	XSK I IBLOCK  	/FINISHED DBN?
	JMP FORWARD 	 /NO
	LDF 2
	STA		/SET UP FOR NEXT READ
	RDEBN!2000
	CLR
	ADD NBLOCK
	COM
	STA
	RDENUM!2000
	JMP EXIT
/
/
LASTWD,	SWD		/THIS WORD IS INCLUDED IN THE CS
	JMP .-1
	TAC
	JMP INIT	/PUT IN LPB 
	JMP IGETLP	/GET THE CS
/
/
RDEAGN,	CLR		/PARITY ERROR
	ADD SIZE	/DECR  ADDRESS
	ADA I   	/BY 1 BLOCK
	1
	LAM
	COREL1
	CLR	 	/CLR LINK
	LDA
	FBLOCK
	ADA I 
	-3
	APO I
	JMP BACKWARD
	JMP FORWARD
/
/
DOUTIT,	CLR		/WRITE ROUTINE
	STC LPB
	SET SKIP2
	SKIP
	JMP SDATAF	/SET DF
	LDA I
	27
	XSK I SKIP2	/SKIP 2 CONTROL WORDS
	SKP
	JMP OGETIT	/PREPARE TO WRITE
	SWD		/SKIP ON WORD FLAG
	JMP .-1
	SWD		/WAIT FOR FLAG TO GO DOWN
	JMP DOUTIT+7	/DO IT AGAIN
	JMP	.-2
/
/
/
/
/
/
/
/
OGETIT,	IOB
	6152		  /SET WRITE
	LDA I		  /SET RTN  JMP
	JMP GOWRI
	STC OUTRTN
GOWRI,	SWD		/WAIT FOR WORD FLAG
	JMP	.-1
	IOB
	6154		/AC TO TB	
	XSK I WCOUNT	/FINISHED?
	SKP		/NOT YET
	JMP OGETLP	/GET CS
	XSK I DATAWD	/WRITTEN ALL DATA?
	SKP		/NOO
	JMP WRILAST	/WRITE 7777
	PDP 
	PMODE
	CLA CLL
	TAD I COREL2	/GET DATA 
	ISZ   COREL2	/INCR ADDRESS
	LINC
	LMODE
	COM		/COMPUTE PARITY
	STC TEMP0
	ADD LPB
	BCO I
TEMP0,	0
	STC LPB
	ADD TEMP0
	COM
	JMP OUTIT	/ SHUFFLE DATA &WRITE IT
COREL2,	0
WRILAST,CLR		/WRITE 7777 WHEN THE LAST WORD IS JUNK
	SWD		/WAIT FOR FLAG TO GO DOWN JUST IN CASE
	SKP
	JMP  .-2
	JMP  GOWRI	/WRITE 7777
OGETLP,	LDA I		/SET RTN JMP TO
	JMP WRILPB	/WRITE PARITY
	STC OUTRTN
	LDA		/GET PARITY WOR
	LPB
	ROR 6		/ITS 6 BITS
	BCO		/XOR IT	
	LPB
	JMP OUTIT	/SHUFFLE IT GOOD
WRILPB,	SWD		/WRITE CS
	JMP .-1
	IOB
	6154		/CS TO TB
WRIOFF,	SWD			/NOW WAIT TILL LAS IS OPT AND WELL
	SKP
	JMP	.-2
	SWD			/NEXT WORD ALL SET???
	JMP	.-1		/NOPE. WAIT
	SWD			/NEXT WORD THERE. WAIT TILL IT PASSES.
	SKP
	JMP	.-2		/ITS PAST. LAST WORD IS NOW OUT COMPLETEL
	LDA I			/YEP. TURN OFF THE WRITTERS.
	226
	IOB
	6152
WRIDUN, LDA I		/PREPARE TO WRITE NEXT BLK	
	0001
	ADM
	FBLOCK
	XSK I NBLOCK	/ALL DONE?
	SKP		/NOT YET
	JMP EXIT	/THATS IT!
	SET WCOUNT	/INIT WCOUNT
	WRIKEY
	XSK I IBLOCK	/FINISHED GROUP?
	JMP FORWARD	/GO DO IT!
	LDF 2
	STA
	WRIBN!2000	/NEXT BLOCK
	CLR
	ADD NBLOCK
	COM
	STA
	WRINUM!2000	/REMAINING BLKS
	JMP EXIT	/READ SOME MORE
/
/
/
/
/
/
/
/
/
/
SDATAF=.
DATAF, HLT		/OPTION FOR EXT MEM
	JMP	0
/
/
/
/
INIT,  STC TEMP1	/COMPUTE PARITY
	ADA I
LPB,	0
	BCO I
TEMP1,	0
	STC LPB
	ADD TEMP1	/READ SHUFFLE
	COM
	STA
	TEMP1
	BCL I
	-77
	ADA I
	ADD TABLE1
	STC ADDIN1
	LDH		/GET LEFT HALF
	TEMP1&3777	/OF TEMP1
	ADA I
	ADD TABLE1
	STC ADDIN2
	CLR
ADDIN2,	ADD 0
	ROL I	5
ADDIN1,	ADD 0
	JMP 0
/
/
/
/
/
/
/
/
/
/
OUTIT,	STA I		/WRITE SHUFFLE
TEMP2,	0
	BCL I		/LOOK AT RIGHT HALF
	-77
	ADA I
	ADD TABLE2
	STC ADOUT1
	LDH		/GET LEFT HALF
	TEMP2&3777
	ADA I
	ADD  TABLE2
	STC  .+1
ADOUT2,	0
	ROL	2
ADOUT1,	0
	COM
OUTRTN,	0		/WRITE IT
/
/
/
/
LINC,   LDA     	/LINC TAPE HANDLER
	ARG1		/GET UNIT
	ROR I 1
	BCL I
	7774
	STC EXUN
	ROL I 4		/GET LINK BIT BACK
	ADM
	INST		/ADD UNIT ONE BIT IF ITS THERE
	BSE I
	0007
	STC CHECK
	LDA I
	0020    	/EXTENDED ADDRESS FORMAT, BANK 0
	ADA I
EXUN,   0
	AXO		/SET EX UNIT
	LDA
	ARG4		/GET BLOCK NUMBER
	STA 
	BN
	STC CHECK+1
	STC ADDR
	LDF 0		/CLR DF
	LDA I
ADDR,   0
	TMA     	/AC>TMA SETUP
INST,   0
BN,     0
	LDA I
ADDINC,	0000		/WORDS PER BLOCK
	ADM
	ADDR
	LDA I
	1
	ADM
	BN		/INCR BLOCK NUM
	XSK I NBLOCK
	SKP
	JMP CHECK	/TRANSFER COMPLETE
	XSK I IBLOCK
	JMP ADDR-2	/DO NEXT BLOCK
/
/
/
/
CHECK,	CHK
	0000		/BLOCK NUMBER
	AZE
	HLT
	LDA I
	1
	ADM
	CHECK+1
	SAE		/FINISHED?
	BN
	JMP CHECK	/NO
	XSK NBLOCK	/ALL DONE?
	SKP
	JMP EXIT	/ALL DONE
/
/
	LDF 2
	STA
BNSET,	RDEBN!2000	/OR WRIBN!2000
	CLR
	ADD NBLOCK
	COM
	STA
NUMSET,	RDENUM!2000	/OR WRINUM!2000
	JMP EXIT
/
/
/
/
/			INPUT CONVERSION TABLES.
/
	LMODE
/
TABLE1,  0
         4
         40
         44
         400
         404
         440
         444
         4000
         4004
         4040
         4044
         4400
         4404
         4440
         4444
         2
         6
         42
         46
         402
         406
         442
         446
         4002
         4006
         4042
         4046
         4402
         4406
         4442
         4446
         20
         24
         60
         64
         420
         424
         460
         464
         4020
         4024
         4060
         4064
         4420
         4424
         4460
         4464
         22
         26
         62
         66
         422
         426
         462
         466
         4022
         4026
         4062
         4066
         4422
         4426
         4462
         4466
/
/
/
/
/
/
/
/
 
 
 
        EJECT
 
 
 
 
 
/               OUTPUT CONVERSION TABLE
 
 
 
 
 
TABLE2,  0
         400
         20
         420
         1
         401
         21
         421
         1000
         1400
         1020
         1420
         1001
         1401
         1021
         1421
         40
         440
         60
         460
         41
         441
         61
         461
         1040
         1440
         1060
         1460
         1041
         1441
         1061
         1461
         2
         402
         22
         422
         3
         403
         23
         423
         1002
         1402
         1022
         1422
         1003
         1403
         1023
         1423
         42
         442
         62
         462
         43
         443
         63
         463
         1042
         1442
         1062
         1462
         1043
         1443
         1063
         1463
////
/
/
////
	PMODE
/
	*3500
TXTINTRO,TEXT ZF     "TC12-F"
H
H   LINCTAPE/DECTAPE CONVERSION PROGRAM
F
H   THIS PROGRAM WILL RUN SUCCESSFULLY
 ONLY ON A PDP-12 COMPUTER EQUIPPED WITH THE
 TC12-F HARDWARE OPTION.  IT WILL READ AND
 WRITE FROM TAPE UNITS 0-7 IN ANY TAPE
 FORMAT; YOU MUST SPECIFY THE CORRECT FORMAT.
F
F
HTYPE LINEFEED TO CONTINUE\Z
/
/
	*7220
TXTPAR,	TEXT ZF CHECK PARITY<1
	
F	0 SPECIFIES NO
	 
F	1 SPECIFIES YES
	 
	TYPE LINE FEED TO CONTINUE\Z
/
TXTRDE, TEXT ZF  READ<4 BLOCKS
F
        TAPE FORMAT<1 FROM UNIT<1
F
          STARTING WITH BLOCK<4
F
HFORMAT A.....PDP-8  (201 WORDS/BLOCK)
H
H       B.....PDP-12 (400 WORDS/BLOCK)
H
H       C.....OTHER  (PDP-9,10,15 WITH
H                     600 12-BIT WORDS/BLK)
 \Z
/
/
/
/
TXTWRI, TEXT ZF  WRITE THE RESULT
F
         IN TAPE FORMAT<1 ON UNIT<1
	
           STARTING AT BLOCK<4
F
HFORMAT A.....PDP-8  (201 WORDS/BLOCK)
H
H       B.....PDP-12 (400 WORDS/BLOCK)
H
H       C.....OTHER  (PDP-9,10,15 WITH
H                     600 WORDS/BLOCK)
 \Z
/
/
ANSWR1,	7400		/NUMBER OF BLOCKS
	0000		/TO BE READ IN 
	0074		/4 OCTAL DIGITS
	0074		/FORMAT CHAR;
	0074		/UNIT NUMBER;
	0000		/STARTING BLOCK
	0000		/NUMBER;
	3400		/THATS ALL!!
ANSWR2,	7400		/WRITE FORMAT;
	7400		/UNIT NUMBER;
	7400		/STARTING BLOCK
	0000		/NUMBER;
	0034		/THATS ALL!!
ANSWR3,	7400		/PARITY
	34		/THATS IT!!
/				       /
/				       /
/				       
/       18 MARCH 1970



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search