File PALIB.PA (PAL assembler source file)

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

/NETWORK SUBROUTINE LIBRARY
/VERSION 3.1
/
/
/              N   N  EEEEE  TTTTT  W   W  OOOOO  RRRR   K   K
/              NN  N  E        T    W   W  O   O  R   R  K  K
/              N N N  E        T    W   W  O   O  R   R  K K
/              N  NN  EEE      T    W   W  O   O  RRRR   KK
/              N   N  E        T    W W W  O   O  R R    K K
/              N   N  E        T    WW WW  O   O  R  R   K  K
/              N   N  EEEEE    T    W   W  OOOOO  R   R  K   K
/
/
/              L       III   BBBB   RRRR    AAA   RRRR   Y   Y
/              L        I    B   B  R   R  A   A  R   R  Y   Y
/              L        I    B   B  R   R  A   A  R   R   Y Y
/              L        I    BBBB   RRRR   AAAAA  RRRR     Y
/              L        I    B   B  R R    A   A  R R      Y
/              L        I    B   B  R  R   A   A  R  R     Y
/              LLLLL   III   BBBB   R   R  A   A  R   R    Y
/
/THE COMPUTER SCIENCE RESEARCH LAB
/NORTHWESTERN UNIVERSITY
/
/AUTHORS AND CONTRIBUTORS:
/	MIKE KELLY 		(NUCSRL)
/	RICHARD BARTLEIN	(UWM)
/	MARVIN SHUGERMAN	(NUCSRL)
/	RICHARD KARHUSE		(NUCSRL)
/	ROGER POLSLEY		(NUCSRL)
/	RONALD SHOULTS		(NUCSRL)
/	WILLIAM NOWCKI		(NUCSRL)
/
/LAST UPDATE: MAY 20, 1977
/
/NOTE: SEVERAL ROUTINES ARE STILL NOT WORKING !!!
/
/USE AT YOUR OWN RISK - REPORT ANY BUGS TO THE N.U.C.S.R.L.

/ /+RDBUF (READ A BUFFER) / /SUBROUTINE TO READ A LINE FROM THE TERMINAL AND BUFFER IT. /RESPONDS TO "CTRL/U" AND RUBOUT. /THE DELETED CHARACTERS ARE ECHOED, FOR CONVENIENCE OF USER. /TYPING A CARRIAGE RETURN ENDS ROUTINE AND SENDS CONTROL BACK /TO THE CALLING MODULE (SEE CALLING SEQUENCE BELOW). /THERE ARE TWO SUPPLEMENTARY ROUTINES WHICH CAN BE USED IN /PROCESSING YOUR BUFFER: FNDNB (FIND THE NEXT NON-BLANK CHAR) /AND KNUM (CREATE OCTAL EQUIVALENT OF DECIMAL NUMBER). / /THE USER NEEDS TO INITIALIZE TWO VARIABLES: / / "IKBUF"---ADDRESS TO START OF BUFFER AREA /FAILURE TO INITIALIZE THIS VARIABLE WILL WIPE OUT PAGE ZERO. / / "KBUFL"---BUFFER LENGTH, A POSITIVE OCTAL VALUE /FAILURE TO INITIALIZE WILL DEFAULT BUFFER LENGTH TO 10000 (OCTAL). /THIS, TOO, WOULD PROBABLY BE CATASTROPHIC FOR THE USER. / /&CALLING SEQUENCE: / RDBUF /RDBUF= JMS I XRDBUF / JMP AGN /LINE DELETE "OR" BUFFER OVERFLOW - RETYPE INTRO / JMP NUL /ONLY <CR> TYPED / ... /NORMAL EXIT, XR1 POINTS TO BEGINNING OF BUFFER, / /i.e. XR1 POINTS TO FIRST NON-BLANK CHAR IN BUFFER. / /COUNT= # OF CHARACTERS READ. / /EXAMPLE: READ, RDBUF /READ STRING FROM TTY / JMP READ /USER KILLED LINE, OR HAS OVERFLOWN / /BUFFER, ALLOW RE-ENTRY / JMP READ /USER ENTERED ONLY <CR>, ALLOW / /ENTRY OF ANOTHER LINE. / ... /PROCESS THE ENTERED LINE / /NORMALLY, BEFORE RETURNING TO ALLOW THE USER TO /ENTER ANOTHER LINE, YOU MIGHT WANT TO DEFAULT SOME MESSAGES /TO LET USER KNOW WHAT HAS HAPPENED, SO THAT MAYBE IT WILL /NOT BE REPEATED. / /*GLOBAL VARIABLES: CHAR COUNT IKBUF KBUFL XPONT /$LOCATIONS USED: 90 / /#ROUTINES USED: MSG CRLF TYPE FNDNB / /:CODE: RDBUF, 0 TAD IKBUF /SET POINTER DCA XPONT /STORE POINTER TAD KBUFL /GET BUFFER LENGTH CIA /MAKE NEGATIVE DCA COUNT /STORE AS COUNTER RDLP, CLA CLL KSF JMP .-1 KRB AND (177 /A DEC STANDARD: FORCE TAD (200 /PARITY BIT ON. DCA CHAR TAD CHAR JMS TYPE /ECHO THE CHARACTER TAD CHAR TAD (-215 SNA /CARRIAGE RETURN? JMP RDEND /YES TAD (-10 SNA /NO:CTRL/U? JMP RDAGN /YES TAD (-152 SNA CLA /NO:RUBOUT? JMP RDRUB /YES TAD CHAR /LOOKS LIKE ORDINARY CHAR TO ME.. DCA I XPONT /STORE IN BUFFER, ISZ XPONT ISZ COUNT /BUMP BUFFER COUNTER, JMP RDLP /AND GET NEXT CHAR /THIS GUY IS TALKATIVE...HE'S OVERFLOWN THE BUFFER. /LET HIM KNOW AND RESTART / CLA JMS CRLF JMS MSG /TYPE COMPLAINT XRDMSG JMS CRLF /AND A CRLF JMP I RDBUF / & ASK AGAIN / /GOT A RUBOUT - BACK UP THE POINTER. RDRUB, TAD COUNT /BACK UP THE COUNTER TAD KBUFL SNA CLA JMP I RDBUF /NOTHING TO RUB OUT CLA CMA TAD COUNT DCA COUNT CLA CMA /BACK UP XR1 NEXT TAD XPONT DCA XPONT TAD I XPONT /ECHO THE RUBBED OUT CHAR TLS JMP RDLP /THEN CONTINUE / /FOUND A CARRIAGE RETURN - SET UP FOR SCAN RDEND, CLA CLL TAD COUNT /TEST FOR ONLY <CR> TYPED SNA JMP RDNUL /TAKE APPROPRIATE RETURN CLA CLL DCA I XPONT /SET END OF BUFFER POINT ISZ COUNT /REGISTER THIS LAST ENTRY JMS CRLF TAD COUNT /GET # OF CHARS ENTERED TAD KBUFL DCA COUNT CLA CLL CMA TAD IKBUF /INIT. BUF POINTER DCA XPONT JMS FNDNB /GET FIRST NON-BLANK JMP RDNUL /ALL SPACES - RETURN ISZ RDBUF /NOW ADJUST THE RETURN RDNUL, ISZ RDBUF / ADDRESS JMP I RDBUF RDAGN, JMS MSG /TYPE "^U" XCTLU JMP I RDBUF /THEN RETURN / /LET'S DEFAULT SOME BUFFERS. / XCTLU, TEXT /^U/ XRDMSG, TEXT /BUFFER OVERFLOWN/ / /THUS, IF USER IS TO TAKE AN ERROR RETURN, SOME "LIKENESS" OF /ERROR MESSAGES WILL BE DEFAULTED FOR THE PROGRAMMER. /THIS WILL ALLOW PROGRAMMING SUCH AS THE ABOVE EXAMPLE, /WHERE THE PROGRAMMER DOES NOT PRINT ANY ERROR MESSAGES, /BUT SIMPLY LOOPS TO READ IN NEXT BUFFER. / / /-RDBUF /
/ /+CONMSG (PRINT A CONDITIONAL MESSAGE) / /THIS ROUTINE WILL MATCH A VALUE IN THE "AC" /AGAINST A TABLE GIVING POSSIBLE VALUES AND /THEIR CORRESPONDING MESSAGE POINTERS. /IF THE VALUE IS NOT FOUND IN THE LIST, /THE MESSAGE POINTED TO BY "WHAT" IS PRINTED. /IT IS UP TO THE USER TO SUPPLY THIS MESSAGE. /IF NOT SUPPLIED, IT IS DEFAULTED TO BE "ERROR". /THIS ROUTINE IS VERY USEFUL FOR ERROR MESSAGE /PRINTOUT, OR OTHER HELPFUL MESSAGES. / /NOTE: NO CARRIAGE RETURN - LINE FEED IS PRINTED. / / /&CALLING SEQUENCE: TAD VALUE TO BE SEARCHED / JMS TEST / TABLE /ADDRESS OF TABLE / ... /RETURNS HERE / /=TABLE, -V1; MSG1 /IF AC=V1, PRINT MSG1 / -V2; MSG2 /IF AC=V2, PRINT MSG2 / ... / ETC. / 0; MSGN /END OF LIST / /USE ".-1" FOR MSGN FOR NO ZERO MESSAGE / /$LOCATIONS USED: 50 /#ROUTINES USED: MSG /:CODE: CONMSG, 0 DCA XCON /STORE VALUE TAD I CONMSG /GET THE LIST ADDRESS DCA PNT /RESET POINTER ISZ CONMSG /FIX RETURN ADDRES TLP, TAD I PNT /LOOP ISZ PNT /FIX POINTER SNA /ZERO MEANS END JMP TWHA /END OF LIST TAD XCON /DOES IT MATCH ? SNA CLA JMP TDONE /YES - GREAT ! ISZ PNT JMP TLP /NO - TRY NEXT ONE / TWHA, CLA TAD XCON /IS IT ZERO ? SNA CLA JMP TDONE /YES-PRINT MESSAGE FOR ZERO / /THE CODE WAS NOT FOUND IN THE TABLE JMS MSG WHAT /PRINT NASTY MESSAGE JMP I CONMSG /RETURN ANYWAY / TDONE, CLA TAD I PNT /DONE - USE AS POINTER DCA TMSG /FOR MESSAGE JMS MSG /PRINT IT ! TMSG, HLT JMP I CONMSG /RETURN ! / /@LOCAL VARIABLES: XCON, 0 PNT, 0 / /THESE STRANGE CONDITIONAL ASEMBLIES ARE NEEDED TO /INSURE THAT THE SYMBOL "WHAT" IS DEFAULTED CORRECTLY. / IFDEF WHAT < IFZERO WHAT-. <WHAT, TEXT "ERROR">> IFNDEF WHAT <WHAT, TEXT "ERROR"> /-CONMSG /
/ /+KNUM (GET A NUMBER) /GETS A DECIMAL NUMBER FROM THE INPUT BUFFER. /ASSUMES THAT "RDBUF" OR SOME SIMILAR ROUTINE /WAS CALLED BEFORE COMING HERE. ALL BUFFER /POINTERS AND COUNTERS MUST BE SETUP IN "RDBUF" FASHION. "XR1" /SHOULD BE A PAGE ZERO POINTER TO THE BEGINNING OF THE /BUFFER, I.E. IT SHOULD POINT TO THE FIRST NUMBER IN THE SEQUENCE. /THE VARIABLE "NUM" IS SET TO THE NUMBER, /AND "CHAR" IS SET TO THE FINAL CHARACTER CHECKED. /IF "CHAR=0" THEN THERE WERE NO ILLEGAL CHARACTERS, I.E. THE /END OF THE BUFFER WAS FOUND FOLLOWING THE NUMBER. / /&CALLING SEQUENCE: JMS KNUM /KNUM CALLED / ... /NUMBER IN AC / /NO ERROR RETURN / /STOPS ON FIRST NON-NUMERIC CHAR / /*GLOBAL VARIABLES: NUM CHAR XPONT /$LOCATIONS USED: 32 /:CODE: KNUM, 0 CLA KN2, DCA NUM /STORE SUM SO FAR TAD I XPONT /GET NEXT DIGIT DCA CHAR TAD CHAR SNA /ZERO? (SIGNALS END OF BUFFER) JMP KRET /YES: THAT'S ALL, FOLKS. TAD (-272 /TEST VALIDITY SMA CLA JMP KRET TAD CHAR TAD (-260 SPA CLA JMP KRET /BAD CHAR ISZ XPONT /IT WAS A NUMBER "REMOVE" IT FROM BUFFER TAD NUM CLL RTL /MPY BY 4 TAD NUM /MAKE IT *5 CLL RAL /DOUBLE TO GET * 10 TAD CHAR /ADD THIS DIGIT TAD (-260 JMP KN2 / KRET, CLA TAD NUM /GET NUMBER IN AC JMP I KNUM /RETURN / / /-KNUM
/ /+KTST (TEST THE KEYBOARD) / /THIS ROUTINE WILL CHECK FOR A POSSIBLE /RESPONSE FROM KEYBOARD. /THE COMMON APPLICATION OF THIS ROUTINE IS /TO PERIODICALLY CHECK FOR INTERRUPT CHARACTERS, /LIKE CONTROL "C". /IF NO CHARACTER HAS BEEN TYPED, THE ROUTINE /EXITS NORMALLY. /IF ANYTHING HAS BEEN TYPED, HOWEVER, THE CHARACTER IS /READ, WHICH CLEARS THE FLAG, AND CHECKED AGAINST THE TABLE. /TABLE FORMAT IS OUTLINED IN DOCUMENTATION OF "TEST" / /&CALLING SEQUENCE: KTST / TABLE /POINTER TO TABLE / ... /RETURNS HERE ON NO RESPONSE / /#ROUTINES USED: TEST /$LOCATIONS USED: 10 /:CODE: KTST, 0 KSF /ANYTHING TYPED ? JMP KTST2 TAD I KTST /GET THE ARG DCA KTSAD KRB /YES - SKIP IT JMS TEST KTSAD, HLT /PLUGGED KTST2, ISZ KTST /FIX RETURN JMP I KTST /FORGET IT ! /-KTST /
/ /+MSGC (PRINT A MESSAGE FOLLOWED BY CR-LF) / /TYPE THE STRING OF SIX BIT /PACKED CHARACTERS POINTED TO BY THE PARAMETER /AND FOLLOW IT WITH A CARRIAGE RETURN/LINE FEED. /USES THE SAME FORMAT FOR MESSAGES AS "MSG" /(THE "PAL8" "TEXT" PSEUDO-OP). / /&CALLING SEQUENCE: MSGC / POINTER TO STRING / RETURNS HERE WITH THE AC CLEARED / /#ROUTINES USED: MSG CRLF /$LOCATIONS USED: 9 /:CODE: MSGC, 0 CLA TAD I MSGC /GET THE FWA OF THE STRING DCA MSGCA /PUT IT WHERE "MSG" CAN GET AT IT JMS MSG /PRINT THE STRING WITHOUT ANY CR/LF MSGCA, HLT JMS CRLF /NOW PRINT THE CRLF ISZ MSGC /BUMP TO GET AROUND THE ARG. JMP I MSGC /-MSGC /
/ /+MSG (PRINT A STRING) / /PRINT A PACKED "ASCII" STRING. /MESSAGES CAN BE PRODUCED USING THE /TEXT PSEUDO-OP OF "PAL8". /MESSAGES CAN BE ANYWHERE IN THE SAME FIELD, /AND MAY EVEN CROSS PAGE BOUNDRIES. /SEE THE DOCUMENTATION OF "CRACK" FOR MORE INFORMATION /ON THE CODING METHOD. / /&CALLING SEQUENCE: MSG / POINTER TO STRING / ... /Return here with AC cleared / / /POINTER, SIX BIT PACKED ASCII CHARACTERS / . . . / 0000 OR XX00 AS END OF LIST / / (Usually produced by doing the following:) /POINTER, TEXT "'THIS IS PRINTED'" / /#ROUTINES USED: CRACK TYPE /$LOCATIONS USED: 11 /:CODE: MSG, 0 CLA CLL TAD I MSG /POINTER DCA MSG3 ISZ MSG /BUMP TO RETURN MSG2, TAD I MSG3 /GET TWO CHARACTERS JMS CRACK /CRACK AND PRINT THE SIX BITS JMP I MSG /RETURN IF END OF MESSAGE ISZ MSG3 /OTHERWISE MOVE TO NEXT PAIR OF CHAR. JMP MSG2 /GO BACK UP AND PRINT THEM /@LOCAL VARIABLES: MSG3, 0 /STRING POINTER /-MSG /
/ /+CLEAR (CLEAR THE SCREEN OF A CRT) / /THIS SUBROUTINE OUTPUTS THE COMMON CHARACTERS /NEEDED TO CLEAR THE SCREENS OF MOST CRT TERMINALS. /CONTROL "L" AND CONTROL "Z" ARE TYPED /WITH A DELAY AFTER THEM TO ALLOW THE SCREEN TO CLEAR /ON SOME TERMINALS. / /&CALLING SEQUENCE: CLEAR /=JMS CLEAR / ... /RETURN HERE,AC CLEARED / /AFTER CLEARING SCREEN. / /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 20 /:CODE: CLEAR, 0 CLA TAD ("L-100 /CLEAR THE SCREEN JMS TYPE JMS TYPE /SEND A NULL FOR GOOD MEASURE TAD ("Z-100 /TRY AGAIN JMS TYPE /FOR THE LSI TERMINAL ISZ CLRC JMP .-1 /WASTE SOME TIME TAD ("L-100 /AND AGAIN (FOR THE ANN ARBOR) JMS TYPE JMP I CLEAR /RETURN CLRC, 0 /-CLEAR /
/ /+CRACK (PRINT TWO CHARS) / /CRACK AND PRINT THE TWO SIX BIT CHARACTERS IN THE "AC". /THIS ROUTINE IS USEFUL TO PRINT /PACKED SIX-BIT "ASCII", AS WELL AS PRINTING /SOME TYPES OF FILE NAMES. / /THE METHOD OF CONVERSION IS: /= 0 = DONE (I.E. 0000 OR XX00) / 1 - 37 = ADD 300 / 40 - 77 = ADD 200 / /&CALLING SEQUENCE: / TAD WORD TO CRACK / CRACK / ... /RETURN HERE IF A ZERO WAS FOUND (XX00 OR 0000) / ... /NORMAL RETURN, TWO CHARACTERS PRINTED. / / /IF USER DOES NOT WANT TO DISCRIMINATE BETWEEN FINDING A ZERO /(IE END OF STRING TO BE PRINTED) THE CALL COULD BE SET UP AS /THE FOLLOWING: / TAD WORD TO CRACK / CRACK / NOP /DO NOTHING IF A ZERO IS FOUND / ... /CONTINUE ON YOUR WAY /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 31 /:CODE: CRACK, 0 DCA CRACK4 /TEMP. STORE WORD TO BE CRACKED CLA CMA DCA CRACK5 /SWITCH TAD CRACK4 /GET THE WORD BACK AND (7700 /LEFT CHAR SNA JMP I CRACK /RETURN IF WORD IS 00XX CLL RTR RTR /(COULD BE "BSW" ON A "PDP-8/E" RTR CRACK2, TAD (-40 /FIND BREAKPOINT FOR RESTORATION SPA TAD (100 CRACK3, TAD (240 JMS TYPE /ACUTUALLY PRINT IT OUT ISZ CRACK5 /SKIP IF HAVE RIGHT CHAR TO DO JMP I CRACK /OTHERWISE RETURN TAD CRACK4 /GET BACK WORD AND (77 /GET RIGHT CHAR SNA JMP I CRACK /RETURN IF WORD XX00 ISZ CRACK /INCREMENT POINTER FOR RETURN JMP CRACK2 /GO BACK AND PRINT IT OUT / /@LOCAL VARIABLES: CRACK4, 0 /TEMP STORAGE FOR WORD CRACK5, 0 /SWITCH /-CRACK /
/ /+CRLF (TYPE CARRIGE RETURN/LINE FEED AT TERMINAL) / /ROUTINE TO TYPE /A CARRIAGE RETURN CHARACTER (OCTAL 215), /AND A LINE-FEED CHARACTER (OCTAL 212). / /&CALLING SEQUENCE: CRLF /=JMS CRLF / ... /RETURN HERE, AC CLEARED / /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 9 /:CODE: CRLF, 0 CLA CLL TAD (215 JMS TYPE TAD (212 JMS TYPE JMP I CRLF /THEN RETURN /-CRLF /
/ /+O2D (OCTAL TO DECIMAL CONVERSION) / /THIS ROUTINE WILL PRINT THE DECIMAL EQUIVALENT OF /THE "AC". THE ROUTINE ALLOWS THE USER TO PASS A FLAG /INDICATING IF HE WANTS THE CONTENTS OF THE "AC" PRINTED /AS A SIGNED OR UNSIGNED NUMBER. /IF THE FLAG IS GREATER THAN OR EQUAL TO ZERO (CONVENTIONALLY ZERO) /THEN THE VALUE IS PRINTED AS A 12 BIT POSITIVE NUMBER. /IF THE FLAG IS LESS THAN ZERO (CONVENTIONALLY -1) THEN THE VALUE /IS PRINTED AS A 12 BIT SIGNED NUMBER. / /&"EXAMPLE": TAD NUM / O2D / 0 /FLAG FOR UNSIGNED NUM / /IF NUM FOR EXAMPLE =7777 THEN 4095 / /WOULD BE PRINTED. / / "EXAMPLE": TAD NUM / O2D / -1 /FLAG FOR SIGNED NUM / /IF NUM FOR EXAMPLE =7777 THEN -0001 / /WOULD BE PRINTED. / /&CALLING SEQUENCE: / TAD NUM /WHERE NUM IS VALUE TO BE CONVERTED / O2D /CONVERT OCTAL TO DECIMAL. / SIGNNUM /THIS IS A FLAG TO TELL IF YOU / /WANT THE NUMBER TO BE PRINTED / /AS A SIGNED OR UNSIGNED NUMBER. / . . . /RETURNS HERE WITH "AC" CLEARED. / /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 50 /:CODE: O2D, 0 DCA OCVAL /STORE VALUE TO BE CONVERTED TAD I O2D /GET CONVERSION "FLAG" ISZ O2D /POINT TO RETURN SMA CLA JMP O2DST /PRINT NUMBER AS IS TAD OCVAL /PRINT NUMBER AS SIGN VALUE SMA JMP O2DST /NUMBER > 0 DO NOTHING CIA DCA OCVAL /CREATE A "POSITIVE VALUE" TAD (255 /PRINT A MINUS SIGN JMS TYPE O2DST, TAD (-4 /SET UP DIGIT COUNTER DCA O2DIG /FOR 4 DIGITS TAD O2DPT /INITIALIZE DIVISOR TO DCA O2DIV /TABLE OF DECIMAL DIVISORS. O2D1, DCA O2DCNT /CLEAR COUNTER O2D1A, CLL TAD I O2DIV /GET COMPLEMENTED DIVISOR TAD OCVAL /ADD IN OCTAL VALUE TO CONVERT SNL /LINK=0 WHEN DIVISION DONE. JMP O2D2 /DONE WITH THIS DIGIT. PRINT IT. DCA OCVAL /LOAD NEW DIVIDEND ISZ O2DCNT /BUMP UP COUNTER JMP O2D1A /AND GO AGAIN. O2D2, CLA CLL TAD O2DCNT /GET QUOTIENT TAD (260 /CONVERT TO ASCII JMS TYPE /TYPE IT ISZ O2DIV /BUMP POINTER TO NEXT DIVISOR ISZ O2DIG /FOUR DIGITS TYPED YET? JMP O2D1 /NO: PROCESS NEXT DIGIT. CLA CLL /YES: CLEAR OUT AC JMP I O2D /AND RETURN /@LOCAL VARIABLES O2DIG, 0 /COUNTER OF DIGITS TYPED. O2DPT, O2DTAB /POINTER INTO DIVISOR TABLE O2DACC, 0 /ACCUMULATOR OF QUOTIENT OCVAL, 0 /OCTAL VALUE TO CONVERT GOES HERE O2DIV, 0 /CURRENT DIVISOR GOES HERE O2DCNT, 0 /TABLE: THE FOLLOWING TABLE CONTAINS THE DIVISORS. DECIMAL O2DTAB, -1000 -100 -10 -1 OCTAL /-O2D /
/ /+QOP (QUICK OCTAL PRINT) / /SUBROUTINE TO TYPE A 4-DIGIT OCTAL NUMBER. /PRINTS THE 4 OCTAL DIGITS HELD IN THE "AC" AT TIME OF CALL /RETURNS WITH CLEARED "AC". / /&CALLING SEQUENCE: / TAD WORD TO PRINT / QOP / ... /RETURN AC = 0 / /#ROUTINES USED: TYPE /$LOCATIONS USED: 25 /:CODE: QOP, 0 CLL RAL DCA QOP1 /SAVE THE NUMBER TAD (-4 /NUMBER OF DIGITS TO TYPE DCA CINDX /SET THE CHAR COUNT QOPLP, TAD QOP1 RTL; RAL /GET THE HIGH 3 BITS DCA QOP1 TAD QOP1 AND (7 TAD (260 /CONVERT IT TO ASCII JMS TYPE / & TYPE IT ISZ CINDX JMP QOPLP /CONTINUE JMP I QOP /ALL DONE - RETURN / /@LOCAL VARIABLES: QOP1, 0 CINDX, 0 /TEMPORARIES / /-QOP / /
/ /+SPACE (PRINT THE NUMBER OF SPACES CARRIED IN THE AC) / /THIS IS A SIMPLE SUBROUTINE TO /PRINT THE NUMBER OF SPACES CARRIED IN THE "AC". /USED FOR FORMATTING OUTPUT, PUTTING TEXT /IN COLUMNS, ETC. / /&CALLING SEQUENCE: / TAD NUMBER SPACES / SPACE / ... /RETURNS WITH AC=0 / /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 10 /:CODE: SPACE, 0 CIA DCA SPACE1 SPATY, TAD (240 JMS TYPE /TYPE THE SPACE ISZ SPACE1 JMP SPATY /SIMPLE LOOP JMP I SPACE / /@LOCAL VARIABLES: SPACE1, 0 /-SPACE /
/ /+TREAD (READ A NON-LEADER/TRAILER CHARACTER FROM THE TELETYPE) / /READ A NONZERO, NONLEADER/TRAILER CHARACTER FROM THE TELETYPE /CALLED BY "JMS TREAD". /UPON RETURN, THE "AC" CONTAINS THE CHARACTER READ. /LOWER CASE IS CONVERTED TO UPPER CASE. / /&CALLING SEQUENCE: TREAD / ... /RETURN HERE AC=CHAR / /#ROUTINES CALLED: TYPE /*GLOBAL VARIABLES: CHAR /$LOCATIONS USED: 48 /:CODE: TREAD, 0 TREAD2, CLA KSF /WAIT FOR CHAR JMP .-1 KRB /CHAR INTO AC AND (177 /DON'T WORRY ABOUT PARITY BIT SNA JMP TREAD2 /IGNORE THE NOTHINGS TAD (-141 SPA /SKIP IF COULD BE A SMALL LETTER JMP TREAD3 TAD (141-173 SPA /SKIP IF NOT A SMALL LETTER TAD (-40 TAD (173-141 TREAD3, TAD (341 /CONVERT TO DEC CAPTIAL LETTER DCA CHAR /STORE IT TAD CHAR TAD (-240 SMA CLA JMP ECHO2 TAD CHAR TAD (-216 /IS CHAR CONTROL N THRU Z? SMA CLA JMP ECHO1 /YES IT IS GO TYPE IT OUT. TAD CHAR TAD (-210 /IS IT CONTROL J THRU M? SMA CLA JMP ECHO2 /YES IT IS ECHO THE PAPER CONTROL. ECHO1, TAD (336 JMS TYPE /TYPE IT TAD (100 ECHO2, TAD CHAR JMS TYPE /TYPE IT TAD CHAR /GET CHARACTER BACK JMP I TREAD /-TREAD /
/ /+FIND (13 BIT COMPARISON OF TEST VALUE AND CONTENTS OF AC) / / /A ROUTINE TO COMPARE TWO 12 BIT NUMBERS, AND TO BRANCH ON SUCCESS. /THERE ARE FOUR POSSIBLE COMPARISONS, "EQ", "LE", "NE" ,AND "GT". / /&CALLING SEQUENCE: TAD VALUE TO COMPARE / FIND / TEST INSTRUCTION (I.E. GT...);TEST NUMBER;SUCCESS ADDRESS; / 0 (A ZERO DENOTES END OF TEST "TABLE") / /THIS CALL PERFORMS: / IF VALUE TO COMPARE MEETS REQUIREMENTS OF TEST INSTRUCTION / WHEN MATCHED AGAINST THE TEST NUMBER THEN BRANCH TO / THE SUCCESS ADDRESS, ELSE MOVE TO NEXT COMPARISON. / / /ANY NUMBER OF SUCH ENTRIES IN THE TABLE MAY FOLLOW CALL. /IF VALUE FAILS ALL COMPARISONS, RETURN TO LOCATION FOLLOWING TEST /TABLE. UPON EXIT, CONTENTS OF AC=0 / /AN EXAMPLE TABLE AND USE OF THIS ROUTINE: / / FIND / EQ;"A;FOUNDA / EQ;203;7600 /FOUND "^C", RETURN TO MONITOR / 0 /END OF TABLE / /$LOCATIONS USED: 19 /:CODE: /TEST DEFINITIONS IFNDEF EQ <EQ=SZA> IFNDEF LE <LE=SNL CLA> IFNDEF GT <GT=SZL CLA> IFNDEF NE <NE=SNA CLA> / FIND, 0 /ENTRY DCA FNDTMP /STORE (TEST VALUE) SKP FNDLOP, ISZ FIND /POINT TO NEXT TEST INSTRUCTION TAD I FIND /GET NEXT INSTRUCTION (GE...) ISZ FIND /POINT TO TEST # SNA /IS THIS END OF TABLE? JMP I FIND /YES, RETURN TO MAIN DCA FNDSKP /NO, STORE TEST INSTRUCTION TAD FNDTMP CLL CMA IAC TAD I FIND /ADD TO AC TEST # ISZ FIND /POINT TO ADDRESS OF DESTINATION FNDSKP, HLT /SKIP IF VALUE OF LINK & AC IS RIGHT JMP FNDLOP /GET NEXT TEST TABLE ENTRY AND CONTINUE TAD I FIND /GET DESTINATION DCA FIND /SET POINTER TO DESTINATION JMP I FIND /RETURN /@LOCAL VARIABLES: FNDTMP, 0 /-FIND /
/ /+FNDNB (NEXT NON-BLANK CHARACTER) / /ROUTINE TO SEARCH A BUFFER POINTED TO BY "XR1" FOR THE NEXT NON-BLANK /CHARACTER. "XR1" IS SET UP AS A PAGE ZERO POINTER AND MUST /BE ASSIGNED A VALUE. /THIS IS CALLED ONLY AFTER THE BUFFER IS FILLED UP, /USUALLY BY "RDBUF". / /&CALLING SEQUENCE: / FNDNB / JMP EOI /END-OF-IMAGE RETURN, AC IS CLEARED / ... /NORMAL - AC = CHAR / /*GLOBAL VARIABLES: CHAR COUNT XPONT /$LOCATIONS USED: 17 /:CODE: FNDNB, 0 FNDNB1, ISZ XPONT /REMOVE BLANK FROM BUFFER FNDNB2, CLA CLL TAD I XPONT /GET NEXT CHAR DCA CHAR TAD CHAR SNA /IS IT END OF BUFFER JMP I FNDNB /YES RETURN TAD (-240 SNA CLA /SPACE? JMP FNDNB1 /YES - CONTINUE SEARCH ISZ FNDNB /FIX RETURN ADDRESS TAD CHAR /GET BACK CHAR JMP I FNDNB / & RETURN W/AC = CHAR / /// /-FNDNB /
/ /+OCTP (GENERAL OCTAL PRINT) / /THIS ROUTINE IS VERY "FORMAT" ORIENTED, AND IF USER /JUST WANTS TO TYPE OUT AN OCTAL VALUE, USER MIGHT WANT /TO CHECK OUT THE QUICK OCTAL ROUTINE. / /&CALLING SEQUENCE: / TAD VALUE /GET THE NUMBER USER WISHES TO OUTPUT / OCTP /=JMS OCTP / N /N=NUMBER OF SPACES TO BE OUTPUT BY ROUTINE / ... /RETURN HERE AFTER PERFORMING REQUESTED FORMAT. / /IF N>0 THEN ROUTINE PRINTS NUMBER AS IS / /IF N<0 THEN ROUTINE PRINTS NUMBER AS A SIGNED / /VALUE / / / "EXAMPLE": IF N<0 THEN 7777 IS PRINTED AS -1 / IF N>4 THEN 7777 IS PRINTED AS 7777 / / /NOTE: IF USER SPECIFIES THAT ONLY ONE SPACE IS TO BE USED /AND ALSO SPECIFIES THAT THE MINUS SIGN MODE IS ON /(REMEMBER, THIS IS DONE BY N<0 ), THEN IF THE NUMBER TO /PRINTED IS LESS THAN ZERO, WE HAVE AN INDEFINITE FORM /(IE SHOULD THE MINUS SIGN BE PRINTED, OR JUST ONE DIGIT). /THE SITUATION IS RECTIFIED BY PRINTING AN I FOR INDEFINITE. / /NOTE: IF ABS(N) IS GREATER THAN 4, THEN ABS(N)-4 BLANKS / ARE PRINTED BEFORE THE NUMBER ITSELF IS PRINTED. / ALSO, ALL LEADING ZEROS ARE CHANGED TO BLANKS. / /$LOCATIONS USED: 95 /#ROUTINES CALLED: TYPE /:CODE: OCTP, 0 DCA OCTP4 DCA OCTP7 /LET'S CLEAR THE MINUS FLAG TAD I OCTP /GO PICK UP THE VALUE OF "N" ISZ OCTP /POINT TO "ERROR" RETURN SNA /DOES USER WANT ANYTHING PRINTED? JMP I OCTP /NO, WHO CALLED LIKE THIS ANYWAY SPA /PRINT VALUE WITH A SIGN, OR ABSOLUTE? JMP .+4 /N<0, SO PRINT IT SIGNED CIA /N>0, SO NEGATE IT FOR COUNTER DCA OCTP5 /STORE COUNTER, AND CONTINUE JMP OCTP1A DCA OCTP5 /STORE COUNTER "N" TAD OCTP4 SMA /IS NUMBER <0 JMP OCTP1A /NO, SO CONTINUE CIA /YES, SO NEGATE IT DCA OCTP4 /STORE ABS(NUMBER) CLA CMA /SEND -1 TO MINUS FLAG DCA OCTP7 ISZ OCTP5 /SAVE A SPACE FOR THE MINUS SIGN JMP OCTP1A /IF ONLY 1 SPACE WAS GIVEN, IT IS GONE TAD (311 /GET VALUE OF AN "I" JMS TYPE /PRINT AN "I" FOR INDEFINITE OPERATION JMP I OCTP /SO RETURN (WHO MADE THAT FORMAT) OCTP1A, CLA /LETS MAKE SURE ALL IS OKAY TAD OCTP5 /GET THE COUNT "N" TAD (4 SNA /IS N=4 JMP OCTP2 /YES, GO PRINT THE NUMBER OUT SPA /IS N<4 JMP OCTPB /NO, GO PRINT SOME BLANKS CIA /ROTATE LOW "N" DIGITS TO HIGH "N" DCA OCTP6 /SET UP COUNTER TO DO THIS TAD OCTP4 /GET THE VALUE TO BE PRINTED OCTP1, RAL; RTL ISZ OCTP6 /ARE WE DONE JMP OCTP1 /NO, CONTINUE DCA OCTP4 /YES STORE THE NEW "VALUE" OCTP2, TAD OCTP4 /SET UP FOR PRINTING RAL /GET FIRST BIT TO LINK DCA OCTP4 DCA OCTP6 /CLEAR ZERO TO BLANK FLAG ISZ OCTP7 /HAS MINUS FLAG BEEN SET JMP OCTP3 /NO, START PRINTING NUMBER TAD (255 /YES, PRINT MINUS SIGN JMS TYPE OCTP3, TAD OCTP4 /ROTATE NEXT DIGIT TO LOW END RAL; RTL DCA OCTP4 /STORE THIS ROTATED VALUE TAD OCTP4 AND (7 /PEEL OFF DIGIT TO BE PRINTED SZA /IS IT A ZERO JMP OCTP3A /NO GO PRINT IT OUT TAD OCTP5 /GET NUMBER SPACES LEFT TO TYPE IAC SNA CLA /IS THERE JUST ONE SPACE LEFT JMP OCTP3A /YES, PRINT OUT A ZERO TAD OCTP6 /ARE WE STILL IN LEADING ZEROS SZA CLA /IF AC = 0 THEN YES TAD (20 /NO TYPE OUT A ZERO TAD (240 /TYPE A BLANK JMS TYPE ISZ OCTP5 /INCREMENT NO. OF SPACES TYPED JMP OCTP3 /LOOP BACK TO GET NEXT DIGIT OCTP3A, TAD (260 /CONVERT DIGIT TO ASCII JMS TYPE /PRINT IT OUT ISZ OCTP6 /SET LEADING ZERO FILL FLAG ISZ OCTP5 /ARE WE DONE? JMP OCTP3 /NOPE! LOOP BACK AGAIN JMP I OCTP /RETURN OCTPB, DCA OCTP6 /STORE NO. OF BLANKS TO BE PRINTED TAD (240 /PRINT OUT A BLANK JMS TYPE ISZ OCTP6 /ARE WE DONE? JMP .-3 /NO GO PRINT ANOTHER BLANK TAD (-4 /SET UP COUNTER FOR NO. OF DIGITS DCA OCTP5 /STORE IT JMP OCTP2 /GO PRINT OUT DIGITS /@LOCAL VARIABLES: OCTP4, 0 /VAL TO BE PRINTED OUT OCTP5, 0 /PARAMETER "N" OCTP6, 0 /ASSORTED LOOP COUNTERS OCTP7, 0 /MINUS SIGN FLAG /-OCTP /
/ /+RCHAR (READ A CHAR FROM THE KEYBOARD) / /WAITS FOR USER TO STRIKE A KEY ON THE KEYBOARD, /THEN RETURNS THE "ASCII" CODE IN THE ACCUMULATOR. / /&CALLING SEQUENCE: JMS RCHAR / ... /RETURN HERE, AC=CHAR READ / /$LOCATIONS USED: 6 /:CODE: RCHAR, 0 CLA / IGNORE GARBAGE KSF JMP .-1 KRB JMP I RCHAR /-RCHAR /
/ /+TEST (TRANSFER TO ADDRESS BY CHARACTER) / /GIVEN AN ADDRESS OF A TABLE, /CHECKS IF THE CONTENTS OF "AC" IS /IN THE TABLE, AND IF SO, TRANSFERS /TO THE CORRECT ADDRESS. /THIS ROUTINE IS MOST USEFUL TO SIMULATE /A TYPE OF THE "CASE" STATEMENT. / /&CALLING SEQUENCE: / TAD CHAR /GET TEST CHARACTER IN AC / TEST /TEST IT ! / TBLAD /ADDRESS OF TABLE / ... /CHARACTER NOT IN TABLE / /AC CLEARED UPON ANY RETURN / /=TBLAD, -CHAR1; ADDR1 / -CHAR2; ADDR2 / ...; ... / 0 /END OF LIST (ZERO) / /$LOCATIONS USED: 19 /:CODE: TEST, 0 DCA OPCHR /SAVE THE CHARACTER TAD I TEST /GET THE TABLE ADDRESS DCA XROP4 /STORE TABLE ADDRESS ISZ TEST /FIX RETURN ADDRESS SKP OPLP, ISZ XROP4 /TEST FAILED POINT TO NEXT CHAR TAD I XROP4 ISZ XROP4 SNA /END OF LIST ? JMP I TEST /END OF LIST-BAD TAD OPCHR SZA CLA JMP OPLP /GO GET NEXT TEST CHAR TAD I XROP4 /GET RETURN ADDRESS DCA TEST /STORE IT JMP I TEST /RETURN / /@LOCAL VARIABLES: XROP4, 0 OPCHR, 0 /SEARCH CHARACTER /-TEST / / /
/ /+TYPE (TYPE ONE CHARACTER ON THE TTY) / /PRINT THE CONTENTS OF "AC" ON THE TELETYPE. /CLEAR THE ACCUMULATOR BUT LEAVE THE LINK ALONE. /THE LINK MAY BE USED BY PROGRAMS LIKE THE SIMPLE /OCTAL PRINTING ROUTINE. /THIS ROUTINE DOES THE "TLS" FIRST, AND WAITS ON /THE FLAG, WHICH MAY BE SLIGHTLY SLOWER THAN THE METHOD /OF USING ONE "TLS" AT THE BEGINING OF THE PROGRAM, /AND THEN WAITING FOR THE PREVIOUS CHARACTER TO PRINT. /TO BE SURE THAT THE FIRST CHARACTER IS NOT LOST, /THE SEQUENCE "CMA;TYPE" COULD BE INSERTED AT THE BEGINING /OF A PROGRAM TO INITIALIZE THINGS. / /&CALLING SEQUENCE: TAD CHAR /LOAD AC WITH CHAR TO PRINT / JMS TYPE /PRINT IT. / . . . . /RETURN HERE WITH AC CLEAR / /$LOCATIONS USED: 6 /:CODE: TYPE, 0 TLS /PUNCH IT TYLP, TSF /WAIT FOR IT TO PUNCH JMP TYLP /WE'RE IN NO HURRY CLA JMP I TYPE /-TYPE /



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