Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-06 - decus/20-153/getsrc.mac
There is 1 other file named getsrc.mac in the archive. Click here to see a list.
	TITLE	GETSRC FOR RPGII 1A(1)
	SUBTTL	JUNE 24, 1975  17:02:12		BOB CURRIER

	TWOSEG
	RELOC	400000

	ENTRY	GETSRC			; GET ONE CHAR FROM SOURCE
	ENTRY	PUTCPY			; PUT A CHARACTER INTO COPY FILE
	ENTRY	GETDEC			; GET A DECIMAL NUMBER FROM SOURCE FILE
	ENTRY	GTCHAR			; GET A CHARACTER, PLACE IN CARD BUFFER
	ENTRY	GETCRD			; PICK UP A CARD IMAGE, DOING SOME INTERPRETATION
	ENTRY	GETDCB			; GET A DECIMAL NUMBER OUT OF CRDBUF
	ENTRY	CRDSIX			; GET SIXBIT CHARACTERS
	ENTRY	PUTEOL			; APPEND AN E-O-L CHAR TO CPYFIL
;GET A CHARACTER FROM A SOURCE FILE

GETSRC:	TSWF	FEOF;			; END OF FILE?
	JRST	GTBLNK			; YES - GIVE HIM A LINE-FEED

	TSWFZ	FREGCH;			; REGET CHARACTER?
	JRST	REGETS			; YUP -

	SOSG	SRCBH+2			; BUFFER FULL?
	JRST	GETSR3			; YES - WELL GO EMPTY IT DUMMY

GETSR0:	ILDB	CH,SRCBH+1		; STUFF THAT CHAR

GETSL:	CAIGE	CH,40			; A CONTROL CHARACTER?
	JRST	GETSR2			; YES - TREAT IT CAREFULLY
	CAIL	CH,"a"			; [270] a lower case a?
	CAILE	CH,"z"			; [270] thru a lower case z?
	  JRST	PUTCPY			; [270] no - all ok
	SUBI	CH,40			; [270] yes - convert to upper case
	JRST	PUTCPY

;REGET PREVIOUS CHARACTER

REGETS:	LDB	CH,SRCBH+1		; LOAD THAT BYTE
	POPJ	PP,

;RETURN A LINE-FEED

GTBLNK:	MOVEI	CH,12
	JRST	PUTCPY
;PROCESS SPECIAL CHARACTERS
;(I.E. LESS THAN 40 OCTAL)

GETSR2:	JUMPE	CH,GETSRC		; IGNORE NULLS
	CAIE	CH,15			;    AND CARRIAGE RETURNS
	CAIN	CH,32			;    AND END FILES
	JRST	GETSRC

	CAIE	CH,11			; TAB?
	JRST	GTSR2B			; NO -

	MOVEI	CH," "			; YES - REPLACE WITH A SPACE
	DPB	CH,SRCBH+1		; STORE FOR POSSIBLE REGET
	PUSH	PP,CH			; STORE CHAR
	MOVEI	CH,11			; PUT A TAB IN CPYFIL
	PUSHJ	PP,PUTCPY
	POP	PP,CH			; RESTORE CHARACTER
	POPJ	PP,			; EXIT

GTSR2B:	CAIE	CH,12			; LINE-FEED?
	CAIN	CH,14			; FORM FEED?
	POPJ	PP,			; YES - LET IT GO

	CAIG	CH,24			; OTHER CARRIAGE CONTROL (13,20-24)
	CAIGE	CH,20
	CAIN	CH,13
	JRST	GTSRC2			; YES - 

	PUSH	PP,CH			; NO - STORE CHARACTER
	MOVEI	CH,"^"			; (UP YOURS, CPYFIL)
	PUSHJ	PP,PUTCPY
	MOVE	CH,(PP)
	ADDI	CH,100			; CONVERT FROM CONTROL
	PUSHJ	PP,PUTCPY
	POP	PP,CH
	POPJ	PP,

GTSRC2:	MOVEI	CH,12			; FORCE A LINE-FEED
	DPB	CH,SRCBH+1
	POPJ	PP,
;NEW BUFFER REQUIRED

GETSR3:	IN	SRC,			; FILL A BUFFER
	JRST	GETSR0

	GETSTS	SRC,CH			; ERROR?
	TRNE	CH,$ERAS
	JRST	GETSR4			; NOT AN END OF FILE ERROR

	RELEASE	SRC,			; RELEASE SOURCE DEVICE

	TSWF	FNOCPY;			; ARE WE IN CALFIL?
	JRST	GTSR3A			; YES - ONLY ONE CALFIL

	PUSHJ	PP,STINFL		; SET UP NEXT SOURCE
	SKIPE	SRCDEV			; WAS THERE ANY?
	JRST	GETSR3			; YES -

;NO MORE SOURCE

GTSR3A:	SWON	FEOF;			; SET "END OF FILE" FLAG
	SKIPE	CREFSW
	CLOSE	CRF,
	MOVEI	CH,12
	POPJ	PP,

;ERROR ON SOURCE DEVICE

GETSR4:	MOVEI	CH,SRCDEV
	JRST	DEVDED
;PUT A CHARACTER INTO CPYFIL

PUTCPY:	TSWF	FNOCPY;			; ARE WE COPYING?
	POPJ	PP,			; NO -
	SOSG	CPYBHO+2		; BUFFER FULL?
	JRST	PTC003			; TRY GENTLE PHILLIP'S MILK OF MAGNESIA

PTC004:	IDPB	CH,CPYBHO+1
	POPJ	PP,

PTC003:	OUT	CPY,			; OUTPUT A BUFFER FULL
	JRST	PTC004			; ALL'S WELL WITH THE WORLD

	MOVE	CH,CPYDEV		; WE BLEW IT
	JRST	DEVDED
;PUT A END OF LINE CHARACTER INTO CPYFIL.
;IN ADDITION TO THIS TASK IT ALSO INSERTS A LINE NUMBER
;INTO THE SAME WORD.
;

PUTEOL:	PUSH	PP,CH			; SAVE CH
	MOVE	CH,CPYBHO+1		; GET CURRENT WORD
	TLNN	CH,760000		; IS IT FINISHED?
	JRST	PUTEL2			; YES -

	MOVEI	CH,0			; NO - PAD WITH A NULL
	PUSHJ	PP,PUTCPY		; STASH IN CPYFIL
	JRST	PUTEOL+1		; LOOP

PUTEL2:	POP	PP,CH			; RESTORE CH

PUTFEL:	PUSHJ	PP,PUTCPY		; PUT OUT EOL CHARACTER
	LDB	CH,[POINT 7,SAVELN,28]	; GET FIRST 7 BITS OF LINE NUMBER
	PUSHJ	PP,PUTCPY		; STUFF INTO CPYFIL
	MOVE	CH,SAVELN		; PUT OUT REST OF NUMBER
	PUSHJ	PP,PUTCPY		; INTO CPYFIL
	MOVEI	CH,1			; SET "THIS IS A CONTROL WORD" BIT
	IORM	CH,@CPYBHO+1		; STORE IT
	AOS	SAVELN			; INCREMENT LINE COUNTER
	MOVE	TB,SAVELN		; CHECK FOR LINE NUMBER OVERFLOW
	CAIG	TB,17774		; DID WE OVERFLOW?
	POPJ	PP,			; NOPE

	OUTSTR	[ASCIZ "SOURCE PROGRAM TOO LONG
"]
	SWON	FEOF!FFATAL		; SET SOME FLAGS
	POPJ	PP,			; EXIT
	SUBTTL	PICK UP A CARD IMAGE

;GETCRD		VERSION 2
;
;VERSION 2 REPRESENTS A TOTAL CHANGE IN PHILOSOPHY AND A SPEED INCREASE
;OF ABOUT 30-40 TIMES. THIS ROUTINE SETS UP THE FOLLOWING REGISTERS
;ONLY:
;
;	CRDBUF		80 PACKED ASCII CHARACTERS, MAKING UP ONE CARD IMAGE
;	FRMTYP		CHARACTER FROM COLUMN 6
;	COMMNT		CHARACTER FROM COLUMN 7
;

GETCRD:	MOVEI	TB,^D80			; 80 COLUMN CARDS
	MOVE	TC,[POINT 7,CRDBUF]	; PLACE TO PUT THEM

GETCD1:	PUSHJ	PP,GTCHAR		; GET A CHARACTER
	IDPB	CH,TC			; STASH CHARACTER
	SOJN	TB,GETCD1		; LOOP UNTIL DONE

	PUSHJ	PP,GETSRC		; GET A CHARACTER
	CAIE	CH,12			; LINE FEED?
	JRST	.-2			; NO - LOOP UNTIL IT IS

	TSWT	FNOCPY;			; ARE WE COPYING?
	PUSHJ	PP,PUTEOL		; YES - OUTPUT EOL CHARACTER

	LDB	CH,[BPNT 6,]		; GET COLUMN 6
	MOVEM	CH,FRMTYP##		; STORE

	LDB	CH,[BPNT 7,]		; GET COLUMN 7
	MOVEM	CH,COMMNT##		; STORE

	SWOFF	FREGCH;			; MAKE SURE IT'S OFF
	POPJ	PP,			; AND EXIT
	SUBTTL	PICK UP A DECIMAL DIGIT

;DIGIT COUNT IN TB, NUMBER IS RETURNED IN TC

GETDEC:	MOVEI	TC,0			; ZERO OUT OUR SUM
	PUSHJ	PP,GTCHAR		; GET A CHARACTER
	CAIN	CH," "			; IS IT A SPACE?
	JRST	GETDC4			; YES - IGNORE IT

GETDC1:	CAIG	CH,"9"
	CAIGE	CH,"0"
	JRST	GETDC2			; BAD CHARACTER

	IMULI	TC,^D10			; OH...WE DO IT IN BASE TEN
	ADDI	TC,-"0"(CH)		; ADD IN NEW DIGIT
	SOJE	TB,GETDC3		; WE USED UP ALL OUR DIGITS?
	PUSHJ	PP,GTCHAR		; GET ANOTHER CHARATCER
	JRST	GETDC1			; NO - GET ANOTHER DISH

GETDC3:	POPJ	PP,			; ALL DONE...

GETDC4:	SOJE	TB,GETDC3		; DEDUCT ONE FOR THE SPACE
	JRST	GETDEC+1		; LOOP ON BACK, SUGAH

GETDC2:	CAIE	CH," "			; IS INVALID CHAR A SPACE?
	POPJ	PP,			; ALAS, 'TIS NOT

	MOVEI	CH,"0"			; YES - KLUDGE TO BE A ZERO
	JRST	GETDC1+3		; ADD IT ON IN
	SUBTTL GET A CHARACTER

GTCHAR:	PUSHJ	PP,GETSRC		; GET A CHARACTER FROM A SOURCE FILE
	CAIN	CH,12			; DID WE BYTE THE DUST?
	JRST	GTCHR3			; YES - IT'S A SPECIAL CASE

	POPJ	PP,			; NO -

GTCHR3:	MOVEI	CH," "
	SWON	FREGCH;
	POPJ	PP,
SUBTTL GET A DECIMAL NUMBER FROM CRDBUF
;DIGIT COUNT IN TB; NUMBER LEFT IN TC

GETDCB:	MOVEI	TC,0			; ZERO OUT SUM
	ILDB	CH,TA			; GET A CHARACTER
	CAIN	CH," "			; LEADING SPACE?
	JRST	GETDB4

GETDB1:	CAIG	CH,"9"			; CHECK FOR VALID DECIMAL NUMBER
	CAIGE	CH,"0"
	JRST	GETDB2			; NO VALID -

	IMULI	TC,^D10			; TIMES TEN
	ADDI	TC,-"0"(CH)
	SOJE	TB,GETDB3

	ILDB	CH,TA
	JRST	GETDB1

GETDB3:	POPJ	PP,

GETDB4:	SOJE	TB,GETDB3
	JRST	GETDCB+1

GETDB2:	CAIE	CH," "
	POPJ	PP,

	MOVEI	CH,"0"
	JRST	GETDB1+3
	SUBTTL GET SOME SIXBIT CHARACTERS
;
;ENTER WITH POINTER TO SOURCE IN TA, POINTER TO
;DESTINATION IN TB, AND COUNT IN TC.
;

CRDSIX:	HRRZ	CH,TA			; GET THE BYTE POINTER
	CAIN	CH,NAMWRD##		; PUTTING IT IN NAMWRD?
	JRST	CRDSX1			; YES - GO CLEAR IT FIRST

CRDSX2:	ILDB	CH,TA			; GET A CHARACTER
	SUBI	CH,40			; CONVERT TO SIXBIT
	IDPB	CH,TB			; STUFF IT
	SOJN	TC,CRDSX2		; DECREMENT COUNTER AND LOOP
	POPJ	PP,			; EXIT -


CRDSX1:	SETZM	NAMWRD			; ZAP FIRST WORD
	MOVE	CH,[XWD NAMWRD,NAMWRD+1]; SET UP FOR BLIT
	BLT	CH,NAMWRD+4		; AND BLIT AWAY!
	JRST	CRDSX2			; BACK TO MAINSTREAM
EXTERNAL DEVDED,SRCBH,STINFL,SRCDEV,CREFSW,CPYDEV,CPYBHO
EXTERNAL CRDBUF,SAVELN
EXTERNAL RESTRT

	END