File MARKOS.12

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

/MARK PROGRAM FOR PDP-12
/BY R.J.CLAYTON
/5-30-69
/COPYRIGHT 1969, DIGITAL EQUIPMENT CORP,
/MAYNARD MASS.

/MODS BY D.E. WREGE  12-12-73,6-25-74
/ALLOWS MARKING OF OS/8 128 WORD.
/STANDARD AND NON-STANDARD...  857 OS/8 BLOCKS
/WILL FIT ON MOST TAPES...  MUST BE ASSEMBLED WITH
/PAL12 FROM WEST VIRGINIA UNIVERSITY!! A GROOVY ASSEMBLER.

 
/VERSION MARK12-2,1970
 
 
	PMODE		/ALLOW STARTING FROM 200
	*200
	LINC
	LMODE
	LDA I		/START WITH TAPE PRESET
	 40
	AXO		/TAPE MAINT MODE
	LDA I		/FOR TAPE PRESET
	 4000
	IOB		/ISSUE TAPE PRESET
	6152		/RIGHT NOW
	CLR
	AXO		/AND CLEAR OUT TAPE XO.
	LDF 3		/JUST IN CASE
	LIF 2		/THAT'S WHERE WE ARE GOING
	JMP DSP1	/START UP IN LINC MODE


	SEGMNT 2

	BETA2=4002
	BETA3=4003
	*16
	STDIAL=.
STPS8,	PDP
	PMODE
	SKP		/OVER START 20
	LMODE
	JMP DSP1	/LINC START 20
	PMODE
	CDF CIF 0
	JMP I .+1
	 7600
	LMODE
 
 
DT=2000		/THIS IS A CONSTANT USED 
		/FOR REFERENCING CHAR TABLES
		/IN THE DATA FIELD

/THIS IS THE STARTING POINT OF /THE MARK PROGRAM. DSP1 IS THE /FIRST DISPLAY WHERE THE USER /PICKS THE TYPE OF TAPE TO /FORMAT DSP1, LDF 3 /JUST IN CASE LDA I /RESTORE STANDARD VALUES 3040 /FOR RESTART STC PTAPE1 /AFTER MARKING LDA I 3000 STC PTAPE2 JMP QAINIT /GO TO Q AND A SUBROUT. DT DS1 /FIRST FRAME ANS /LOCATION FOR ANS. JMP REFRESH /COME HERE TO REFRESH LDA /HERE AFTER LINE FEED ANS SHD I /"N"=NON-STANDARD 1600 JMP NONSTAND /GOOD SELECTION SHD I /"S"=STANDARD 2300 JMP PTAPE /ALSO GOOD SELECTION SHD I 1400 /"L"=LTAPE JMP LTAPE /ANOTHER GOOD SELECTION SHD I 0200 JMP BIGTAP /ALSO GOOD SELECTION JMP DSP1 /GO BACK FOR A GOOD /SELECTION.
/PROGRAM TO WRITE A /STANDARD LINC FORMAT TAPE LTAPE, PDP PMODE JMS ONMARK /GET MARK TURNED ON JMS I KWRTAP /GO WRITE THE TAPE 2000 /BEGINING EM 7777 /BEGINING IM 0400 /256 WORDS PER BLOCK -10 /FIRST FWD BLK NUMB -10 /FIRST BKWD BLK NUMB 1024 /TOTAL NUMBER OF BLOCKS /INCLUDES A FEW AT FRONT /AND BACK FOR TURN AROUND 0005 /NO OF IM BETWEEN BLOCKS 0010 /NUMBER OF FINAL IM CODES 4000 /NUMBER OF FINAL EM CODES LINC /TO LINC MODE LMODE LDA I 1000 /NO OF BLOCKS TO CHECK JMP CHECK /CHECK WILL FINISH /THE JOB /PROGRAM TO WRITE 129 WORD /LINC FORMAT TAPE FOR TCO1 /SIMULATION PTAPE, PDP PMODE JMS ONMARK JMS I KWRTAP 2000 7777 0200 -20 -15 /THE OFFSET HELPS SEARCH /ON TAPE WITH SHORT BLOCKS PTAPE1, 3040 005 1777 2000 LINC LMODE LDA I PTAPE2, 3000 /NUMBER OF DATA BLOCKS JMP CHECK / /PROGRAM TO WRITE 1600 STD BLKS /IS LOCATED AT BIGTAP / PMODE KWRTAP, WRTAP /CROSS PAGE REF.
/SUBROUTINE TO TEST TAPE TRANSPORTS /AND MARK SWITCH TO DETERMINE THAT /IT IS OK TO MARK TAPE. /MUST HAVE UNIT 1 SELECTED /MUST HAVE UNIT 1 WRITE ENABLED /MUST THEN PRESS MARK SWITCH /SUBROUTINE WILL PREVENT BASHING /TAPE ON UNIT 0 PMODE ONMARK, 0000 LINC LMODE DSP2, JMP QAINIT /USE Q AND A ROUTINE DT DS2A /AS A DISPLAY ROUTINE /THIS WILL BE THE FIRST /HALF OF THE DISPLAY, IT /IS DONE WITH THE TAPE /GOING BACKWARD. ANS NOP LDA I 0144 /SET UP FOR UNIT 1 AND /FORWARD MOTION IOB 6152 JMP QAINIT /DO SECOND HALF OF THIS DT DS2B /DISPLAY ANS NOP SET I 4 /THIS LOOP EQUALIZES -100 XSK I 4 /THE FWD AND BKWD JMP .-1 /MOTION TIMES LDA I 5000 /SELECT MAINT REG TO IOB /LOOK AT UNITS AND MTN 6151 CLR IOB 6154 /SHOULD HAVE UNIT 1, SAE I /WRITE ENABLED, AND 5777 /FWD MOTION JMP .+2 /NOT YET JMP MARKSW OMKST, LDA I 0024 /START BACKWARD MOTION IOB 6152 JMP DSP2 /GO BACK AND TRY AGAIN MARKSW, LDA I 0200 AXO /TRY TO SET MARK FLOP CLR MSC I 1 /READ IT BACK ROL I 5 LZE I JMP OMKST /NOT YET PRESSED RET2, PDP /TO PDP8 MODE /MARK FLIP FLOP IS ON /AND TAPE IS FWD MTN. PMODE CLA 6151 /SET TAPE MAINT REG. /SO IOT 6154 WILL /TRANSFER AC TO TB JMP I ONMARK PAGE
/DSP3 /THIS ROUTINE IS USED AFTER CHECKING /A TAPE THAT THIS PROGRAM MARKED /FROM HERE THE USER CALLS DIAL OR /MARKS ANOTHER TAPE LMODE DSP3, JMP QAINIT /TO DISPLAY ROUTINE DT DS3 /CHECKING ROUTINE SETS /THIS LOCATION FOR FRAME /3 OR FRAME 4 ANS JMP DSP3R /REFRESH RETURN LDA /RETURN FROM LINE FEED ANS SHD I /NOW TEST THE ANSWER 6100 JMP DSP1 SHD I 6200 JMP STDIAL JMP DSP3 DSP3R, LDA /REJECT WRONG ANSWERS ANS SHD I 6100 JMP REFRESH SHD I 6200 JMP REFRESH SHD I 0000 JMP REFRESH JMP DSP3 /A BAD ANSWER WAS GIVEN
PMODE /SUBROUTINE TO WRITE TAPE /CALLING SEQUENCE: /JMS WRTAP /NO OF BEGINING END MARKS /NO OF BEGINING IM /NUMBER OF WORDS OF DATA /FIRST FWD BLOCK NUMBER /FIRST BKWD BLOCK NUMBER /NUMBER OF BLOCKS /NO OF IM BETWEEN BLOCKS /NO OF FINAL IM /NO OF FINAL EM /RETURN 10TH WORD AFTER JMS WRTAP, 0000 CLA TAD I WRTAP ISZ WRTAP DCA KIEM /SAVE NO OF END MARKS TAD I WRTAP ISZ WRTAP DCA KIIM TAD I WRTAP ISZ WRTAP DCA WRLOOP+2 /SET UP NO OF WRDS. TAD I WRTAP ISZ WRTAP DCA FBLK /SET FWD BLOCK NO. TAD I WRTAP ISZ WRTAP DCA WRLOOP+3 /SET BKWD BLOCK NO. TAD I WRTAP ISZ WRTAP CMA DCA BLKCNT TAD KHERE /GO SYNC WITH TAPE WORD DCA I KWAIT1 TAD K0200 /CLEAR TAPE WORD FLAG 6152 /IOT TO CLEAR LINC 6000 FRSTGO /THIS IS LINC JMP INST. /RETURN WILL BE IN 8 MODE HERE, TAD KIEM /NOW WRITE FIRST END MKS. JMS I KWMKD /ACTUALLY GO WRITE IT 0000 /CODE FOR EM TAD KIIM /NOW WRITE THE BEGINING JMS I KWMKD /IM MARKS 0017 /CODE FOR IM WRLOOP, TAD FBLK JMS I KBLOCK /GO WRITE IT 0000 /NUMBER OF WORDS 0000 /BKWD BLOCK NUMBER TAD I WRTAP JMS I KWMKD 0017 /WRITE IM BETWEEN BLOCKS ISZ FBLK /INCREMENT BLOCK NUMB. NOP ISZ WRLOOP+3 NOP ISZ BLKCNT /DONE ALL BLOCKS YET? JMP WRLOOP /NO ISZ WRTAP JMS I KWAIT1 /WRITE FIRST OF THE 0017 /THE FINAL IM, CALLED THIS /WAY TO CUT DOWN ON TIME, /THINGS ARE A BIT PRESSED /AT THIS POINT CLA CMA TAD I WRTAP ISZ WRTAP JMS I KWMKD 0017 /WRITE FINAL IM MARKS TAD I WRTAP ISZ WRTAP JMS I KWMKD 0000 /WRITE FINAL END MARKS LINC LMODE CLR AXO /CLEAR MARK FLOP SET I 4 -50 /DELAY A WHILE AND LDA I /BACK UP THE TAPE ON 0024 /UNIT 1 SO THAT CHECK IOB /PROGRAM CAN TEST THE 6152 /TAPE XSK I 5 JMP .-5 XSK I 4 JMP .-7 PDP PMODE CLA JMP I WRTAP /ALL DONE GO BACK FBLK, 0000 /VARIABLES BLKCNT, 0000 KIEM, 0000 KIIM, 000 KWAIT1, WAIT KHERE, HERE-1 /WILL BE INCREMENTED K0200, 0200 KBLOCK, BLOCK /CROSS PAGE REF. KWMKD, WMKWD PAGE
/SUBROUTINE TO WRITE A BLOCK /OF TAPE /CALLING SEQUENCES: /JMS BLOCK WITH FWD BLOCK NO IN /THE AC. /FIRST LOCATION AFTER JMS CONTAINS /NUMBER OF DATA WRDS IN BLOCK /SECOND LOCATION AFTER JMS CONTAINS /BACKWARD BLOCK NUMBER / THIS ROUTINE WILL WRITE: / BM (FWD) / GM / DM (MIN. 14, MAX. 4096) / FM / CM (THREE WORDS) / GM / BN (BKWD) / BLOCK, 0000 CMA /USED IN COMP. FORM JMS I KWAIT /WRITE FWD BM 0016 /BLOCK NO CODE WORD TAD I BLOCK /GET NO OF DATA WORDS CMA CLL TAD K0016 SZL /LESS THAN 14 WORDS HLT SNA HLT /SPECIFIED 14 WORDS DCA COUNTA /SAVE NUMBER OF WORDS ISZ BLOCK /MOVE POINTER TAD I BLOCK /GET BKWD BLOCK NO DCA BKBNS /SAVE IT DCA BKBNA /CLEAR BKWRD BLK /ASSEMBLY REGISTER JMS I KWAIT /WRITE GUARD WORD 0002 /GUARD MARK CODE TAD K7764 DCA COUNTB /COUNT OF 12 TAD KB1TAB /SET UP BIT TABLE POINTER DCA TEMPA BLKLP1, TAD K5252 /WRITE 1ST 12 JMS I KWAIT /WORDS AND FORM 0011 /BKWRD BLK NO FOR TAD BKBNS /WRITING ON TAPE RAL DCA BKBNS SZL TAD I TEMPA /GET A BIT TAD BKBNA /COMBINE WITH OTHER DCA BKBNA /BITS AND SAVE THEM ISZ TEMPA /MOVE POINTER ISZ COUNTB /DONE 12 YET JMP BLKLP1 /NO BLKLP2, TAD K5252 /WRITE REST OF DATA WORDS JMS I KWAIT /WRITE DATA WORD 0011 /DATA MARK CODE ISZ COUNTA /DONE YET JMP BLKLP2 /NO TAD K5252 JMS I KWAIT /WRITE FINAL MARK 0013 /FINAL MARK CODE CLA IAC STL RAL /WRITE 3 CHECK WORDS JMS I KWMKWD 0001 /CHECKMARK CODE JMS I KWAIT /WRITE GUARD MARK 0002 /GUARD MARK CODE TAD BKBNA JMS I KWAIT /WRITE BKWD BLOCK NO. 0007 /BACKWARD BLK NO CODE ISZ BLOCK /INCREMENT RETURN JMP I BLOCK /OR BACK COUNTA, 0 /COUNTER NO OF DATA WRDS COUNTB, 0 /COUNTER 1ST 12 WORDS TEMPA, 0 /RANDOM USAGE BKBNS, 0000 /SAVE BKWD BN AS CALLED BKBNA, 0000 /FORM BKBWD BN THAT /WILL BE WRITTEN ON TAPE B1TAB, 0400 /TABLE USED TO FORM 1000 /BACKWARD BLOCK NO. 2000 4000 0020 0040 0100 0200 0001 0002 0004 0010 K0016, 0016 /CONSTANTS K7764, 7764 KB1TAB, B1TAB KWAIT, WAIT KWMKWD, WMKWD K5252, 5252 / /WRITES 1600 STD BLKS /SEE LTAPE FOR COMMENTS / LMODE BIGTAP, PDP PMODE JMS I PONMARK JMS I PWRTAP 1000 7777 0400 -10 -10 1624 5 10 0400 LINC LMODE LDA I 1600 JMP CHECK PMODE PONMARK, ONMARK PWRTAP, WRTAP
LMODE NONSTA, CLR JMP QAINIT DT DS5 ANS JMP REFRESH PDP PMODE CLA TAD (ANS-1&1777+4000 DCA I (BETA3 JMS I (GETNUM CLL RAL /2-BLOCKS PER OS/8 BLOCK DCA I (PTAPE2 TAD I (PTAPE2 TAD (40 DCA I (PTAPE1 LINC LMODE JMP PTAPE PMODE PAGE
/SUBROUTINE TO WAIT FOR COMPLETION /OF CURRENT TAPE WORD /AND THEN TRANSFER DATA TO TAPE /CONTROL FOR THE NEXT WORD /(4 LINES) /CALLING SEQUENCE: /JMS WAIT FOLLOWED BY MARK CODE /TO BE GENERATED. THE AC /CONTAINS THE DATA WORD TO /BE WRITTEN WITH THE ABOVE /MARK CODE. /PROGRAM MUST RETURN WITH THE /NEXT WORD TO BE WRITTEN WITHIN /42 MICROSECONDS /THIS SUBROUTINE TAKES UP TO /52 MICROSECONDS IF SYSTEM CYCLE /TIME WERE TO GET AS SLOW AS /1.9 MICROSEC. PMODE WAIT, 0000 6154 /PUT DATA WORD IN TB THE ACTUAL WORD /WRITTEN ON THE TAPE WILL BE THE COMP OF THE NO. JUST /PLACED IN THE TB REG CLA CLL TAD I WAIT /GET MARK CODE LINC /GO TO LINC MODE LMODE SXL I 17 /TEST TO SEE IF TAPE HLT /WORD FF IS UP, IF SO /THEN WE HAVE DELAYED /AND ALL IS LOST. FRSTGO, SXL 17 /NOW WAIT FOR TAPE WORD JMP .-1 /FLIP FLOP LDA I 0200 PDP /TO PDP 8 MODE PMODE 6152 /CLEAR TAPE FLAG ISZ WAIT /INCREMENT RETURN CLA JMP I WAIT /GO BACK /SUBROUTINE TO WRITE A NUMBER /WORDS OF A GIVEN MARK CODE /CALLING SEQUENCE: / IS JMS MKWRD FOLLOWED BY CODE WORD. / AC CONTAINS NO OF WORDS TO BE WRITTEN /THIS SUBROUTINE ADDS 17 CYCLES TO THE /WAIT ROUTINE AND MUST BE CALLED WITHIN /20 MICROSEC.OF THE LAST WAIT EXIT. /THIS ADDS 10 MICROSEC. TO THE WAIT /EXIT TIME WMKWD, 0000 CMA IAC DCA WMCNT /SET UP NO OF WRDS. TAD I WMKWD /PICK UP MARK CODE DCA WMCODE JMS WAIT /GO WRITE A WORD WMCODE, 0000 /HOLDS MARK CODE ISZ WMCNT /DONE ALL WORDS YET JMP .-3 /NO CLA /YES GO BACK ISZ WMKWD /INCREMENT RETURN JMP I WMKWD WMCNT, 0000 /SUBROUTINE TO CHECK THE TAPE THAT HAS /JUST BEEN WRITTEN. ENTER CHECK WITH THE /TOTAL NUMBER OF POSITIVE DATA BLOCKS /IN THE AC.THE SUBROUTINE WILL WRITE /A PATTERN OF 11+11+11 ETC. IN EACH BLOCK /THEN BACKWARD BLOCK NUMBERS ARE CHECKED /THEN ALL BLOCKS ARE READ INTO CORE AND /THEIR CHECKSUMS VERIFIED. THEN THE LAST /DATA BLOCK IS CHECKED TO BE SURE ALL /DATA IS CORRECT. /EXIT IS TO DSP3 ROUTINE WHICH TELLS /THE USER IF THE TAPE IS GOOD OR BAD /AND ALLOWS MORE MARKING OR RETURN TO /DIAL LMODE CHECK, STC CFBLK /SAVE NUMBER OF BLOCKS LDF 0 SET I 1 /GENERATE TEST PATTERN 3777 LDA I 11 STA I 1 ADD .-2 XSK 1 JMP .-3 /NOT DONE YET CLR STC WBLKNO LDA I 0020 /SET UP EXTENDED ADDRESS AXO /FORMAT FOR TAPE WLOOP, LDA I 0000 TMA /LOAD TMA SETUP REG. WRI I U /WRITE ON TAPE WBLKNO, 0000 LDA I 1 ADM WBLKNO SAE I /WRITTEN LAST BLK YET CFBLK, 0000 /HOLDS FINAL BLOCK NO JMP WLOOP MTB I U /NOW TEST BKWD BLK NO. 0000 MTB I U 0000 ADA I 0001 STA I BTEST, 0000 MTB I U 0000 SAE BTEST JMP RERROR /BKWN BN WRONG AZE JMP BTEST-3 /NOT DONE YET LDA I /NOW CHECK WRITTEN TAPE 0020 AXO /EX ADD FORMAT CLR STC RBLKNO RLOOP, LDA I 0000 TMA RDE I U RBLKNO, 0000 SAE I 7777 /CHECKSUM OK JMP RERROR /NO LDA I /YES 0001 ADM RBLKNO SAE CFBLK JMP RLOOP SET I 1 /DONE NOW CHECK LAST 3777 /BLOCK LDA I /THIS IS DATA TEST 0011 DLOOP, SAE I 1 JMP RERROR ADD .-3 XSK 1 JMP DLOOP LDA I DT DS3 /SET UP FOR GOOD TAPE /DISPLAY FRAME JMP .+3 RERROR, LDA I /COME HERE ON CHECKING DT DS4 /ERROR, SET UP FOR ERROR /DISPLAY FRAME STC DSP3+1 LDF 3 CLR AXO /CLEAR EXTENDED ADD. /FORMAT AND HEAD THE MTB I U /TAPE FOR THE FRONT 0000 /END MTB I U 0000 JMP DSP3 ANS, 0000 /LOCATION FOR ANSWERS 0000 /FROM Q AND A 0000 0000
/QANDA SUBROUTINE FOR THE /PDP-12 /REMOVE *1000 BELOW IF /INSERTING SOURCE DIRECTLY /INTO YOUR PROGRAM SOURCE *1000 /REMOVE,IF DESIRED / /TO HERE TO INITIALIZE THE ROUTINE / 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 377 /NOTE VERT IS SET HIGH 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 QACKCC /ILLEGAL OR ^C LDA I 47 JMP QAEXIT+2 /EXIT, DONT ECHO QACKCC, SAE I 7743 /^C CHECK JMP QAEXIT /ILLEGAL JMP STPS8 /^C=GO TO OS/8 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 36 /ALT /END OF S\R GETKBD REFRESH=QAINIT+53
PMODE /SUBROUTINE TO GET A NUMBER FROM A QUANDA ANSWER /BUFFER. A HALF-WORD POINTER INTO THE BUFFER /MUST BE INITIALIZED IN "BETA3", POINTING TO THE /"74" HALFWORD, ON ENTRY. MUST BE ASSEMBLED WITH PAL12 IF2 < IFNDEF BETA3 < PRINTX BETA3 NOT DEFINED BETA3=.&6000+3 > IFN .-BETA3&6000 < PRINTX BETA3 IN BAD LINC FIELD >> GETNUM, 0 DCA RESULT /CLEAR RESULT JMS GETSIX /GET A CHAR JMP I GETNUM /WAS A 34=END OF FIELD JMP .+3 /A 74=START OF FIELD JMP .-3 /WAIT FOR 74 JMP .-4 /IGNORE ALPHAS JMS GETSIX /WAIT FOR FIRST NEUMERIC JMP I GETNUM /DONE=EXIT JMP I GETNUM /DONE ALSO JMP .-3 /PROBABLY LEADING SPACES JMP GETNM2 /FIRST NEUMERIC GETNML, JMS GETSIX JMP GETNME /DONE=EXIT JMP GETNME /DONE ALSO JMP GETNME /AN ALPHA GETNM2, DCA GETNMT /SAVE IN TEMP TAD RESULT /MULTIPLY PREVIOUS BY 10(10) CLL RTL /*4 TAD RESULT /*5 RAL /*10 TAD GETNMT /ADD THIS DIGIT DCA RESULT /AND UPDATE RESULT JMP GETNML /KEEP GOING GETNME, TAD RESULT JMP I GETNUM /EXIT WITH RESULT IN AC GETNMT, 0 RESULT, 0 /SUBROUTINE TO GET A 6/BIT NUMBER /AND RETURN ON A BUNCH OF CONDITIONS. /"BETA3" MUST BE PRESET. /CALL: JMS GETSIX / RETRN34 / RETRN74 / RETRNOTHER / RETRNNEUMERIC /AC=NUMBER LBETA3=BETA3&17 GETSIX, 0 CLA CLL LINC LMODE LDH I LBETA3 /GET NEXT HALF-WORD PDP PMODE /BACK TO 8-MODE TAD (-34 /CHECK FOR 34 SNA /SKIP IF NOT JMP I GETSIX /TAKE FIRST RETURN ISZ GETSIX /NEXT RETURN TAD (34-74 /CHECK FOR 74 SNA /SKIP IF NOT 74 JMP I GETSIX /TAKE SECOND RETURN ISZ GETSIX TAD (74-72 /IF RESULT POS IS NOT NUMB SMA /MINUS IS GOOD JMP GETSXE /EXIT=3RD TAD (72-60 /NEG=ALPHA SMA /SKIP IF NOT NUMB ISZ GETSIX /TAKE 4TH SMA JMP I GETSIX /RETURN TAD (60-72 /FIX GETSXE, TAD (72 /BACK TO INPUT CHAR JMP I GETSIX
LMODE SEGMNT3 *0001 DS1, TEXT /F MARK OS#H/ TEXT /#H THIS PROGRAM WILL FORMAT AND CHECK/ TEXT /#H OS-8 LINC TAPES#/ TEXT /H#H SELECT OPTION AND PRESS LINE FEED/ TEXT /#FSELECT <1#/ TEXT /F#H S STD OS-8 FORMAT#/ TEXT /H N OS8 NON-STD#/ TEXT /H L STD LINC (256 WD)#/ TEXT /H B 896 LINC (256 WD)#\/ DS2A, TEXT /#F MOUNT TAPE TO BE#/ TEXT /F MARKED ON THE RIGHT#/ TEXT /F REEL OF UNIT 1.#/ TEXT /F#F PLACE UNIT 1 IN#\/ DS2B, TEXT /######F REMOTE WITH#/ TEXT /F WRITE ENABLED, THEN#/ TEXT /F#F PRESS THE MARK SWITCH#\/ DS3, TEXT /F#F GOOD TAPE#F#/ TEXT /H ALLOW MARKED TAPE TO REWIND#/ TEXT /H THEN SELECT OPTION AND TYPE#/ TEXT /H LINE FEED ON THE TELETYPE#F#/ TEXT /FSELECT <1#/ TEXT /F#F 1 MARK ANOTHER TAPE#F#/ TEXT /F 2 RESTART PS8#\/ DS4, TEXT /F#F TAPE CHECK FAILED#F#F#F#/ TEXT /FSELECT <1#F#F 1 MARK ANOTHER TAPE/ TEXT /#F#F 2 RESTART PS8#F#\/ DS5, TEXT /#F#F MARK <3 BLOCKS#/ TEXT /F#F#F 737 STANDARD\/
$$$$$$



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