File: PXPB.PA of Tape: Sources/Other/new-14
(Source file text) 

/ PROGRAM TO SPOOL PLOTTER IMAGE FILE TO CHAR FILE
/
/
/
/ CORE LAYOUT :-
/  00000 - 03777	INPUT BUFFER #1
/  04000 - 06400	OUTPUT BUFFER
/  06600 - 07177	INPUT HANDLER
/  07200 - 07577	OUTPUT HANDLER
/  10000 - 11777	USR
/  12000 - 13377	PROGRAM
/  13400 - 13577	LINE BUFFER
/  13600 - 17577	NOT USED
/  20000 - 23777	INPUT BUFFER #2
/
/ TO ASSEMBLE, ETC :-
/  .R PAL8
/  *PXPB/L/9=12000$
/  .SAVE SYS PXPB
/
/***********************************************************************

			ICOMM=7400	/!!!! COMMUNICATION AREA

/ DEFINE FIELDS USED
	PF=1
	IFLD1=00
	IFLD2=20
	PFLD=PF^10
	BFLD=0

/ OS/8 FILE BUFFER
BUFFER=4000

/ DEFINE VARIABLES IN USR AREA
TMP=20
CTR=21
CTR1=21
CTR2=22
CTR3=23
CTR4=24
BLC=25
NLC=26
AIH=27
AOH=30
FCF=31

	FIELD PF
	*2000

START,	DCA I (ICOMM	/NO CHAIN TO PXPA IF RUN
CHST,	CLA CMA
	DCA ERCHK	/ALLOW ONE BAD LOOKUP
	JMS I (7700	/LOCK IN USR
	10
	TAD I (7617
	SZA
	JMP GOTIF	/GOT INPUT-FILE
ERTWO,	TAD (FN
	DCA SB
	IAC		/SET SYS:
	JMS I (200
	2		/LOOKUP
SB,	FN		/SYS:PLOT.IM
MFL,	0
	JMP ER1		/ERROR - NO INPUT FILE
	CLA IAC
	DCA I (7617	/SET SYS:
	TAD SB
	DCA I (7620	/AND START BLOCK
	TAD MFL
	JMP DFIF

ERONE,	ISZ ERCHK	/TRY ONCE MORE ?
	JMP ER2		/WRONG LENGTH INPUT
	JMP ERTWO
ERCHK,	-1

/GOT INPUT FILE
GOTIF,	RTR
	RTR
DFIF,	AND (377
	TAD (7400
	TAD (200	/CHECK FOR 384 BLOCKS (WELL... MOD 256)
	SZA CLA
	JMP ERONE
/DEFAULT OUTPUT :- LPT:
	JMS I (200
	12
	4020		/=LPT:
DDN,	0
	0
	JMP ER3		/NO LPT: !!!
	TAD DDN
	DCA I (7600

/FETCH OUTPUT HANDLER & OPEN OUTPUT
GOTOF,	TAD (7201
	DCA HA
	TAD I (7600
	JMS FH
	TAD HA
	DCA AOH
	JMS OPEN
	 JMP ER6	/ OPEN FAILURE

/FETCH INPUT HANDLER & OPEN INPUT FILE
	TAD (6601
	DCA HA
	TAD I (7617
	JMS FH
	TAD HA
	DCA AIH
	TAD I (7620
	DCA PFNB
	JMP COPYF	/ COPY FILE THROUGH

/ FETCH HANDLER
FH,	0
	JMS I (200
	1
HA,	0
	JMP ER4		/ FAILURE
	JMP I FH
/ ERRORS !!
ER7,	ISZ ERCT
ER6,	ISZ ERCT
ER5,	ISZ ERCT
ER4,	ISZ ERCT
ER3,	ISZ ERCT
ER2,	ISZ ERCT
ER1,	ISZ ERCT
ER0,	CLA
	TAD ERCT
	TAD (ERMT
	DCA TMP		/ POINT TO ADDR OF MESSAGE
	DCA ERCT	/ CLEAR ERROR COUNT
	TAD I TMP
	JMS TXOUT	/ PRINT MESSAGE
MONEXT,	CDF CIF 0
	JMP I (7600	/ & EXIT TO MONITOR

/ STORAGE
ERCT,	0		/ ERROR COUNTER
FN,	FILENAME PLOT.IM
	PAGE
/ NOW THE SPOOLING OF THE DATA
COPYF,	TAD (-30-1	/ 24 LUMPS
	DCA CTR1
	IAC		/ THROW 1 LINE TO ENSURE _ DONE PROPERLY
	DCA BLC
	DCA NLC
	TAD (-14
	DCA CTR3	/DO ONCE FOR EACH PRINT LINE = 12 PLOT LINES

/DO ONCE FOR EACH SEGMENT
NXSEG,	ISZ CTR1	/MORE SEGS ?
	SKP
	JMP I (SEGEND	/NO
	CIF 0
	JMS I AIH
	2000+IFLD1	/GET 8 BLOCKS TO FIELD 0
	0		/0-3777
PFNB,	0		/FROM THIS BLOCK ON
	JMP ER5		/ERROR
	TAD PFNB
	TAD (10
	DCA PFNB2	/MOVE ON
	CIF 0
	JMS I AIH
	2000+IFLD2	/GET 8 BLOCKS TO FIELD 2
	0		/0-3777
PFNB2,	0		/FROM THIS BLOCK ON
	JMP ER5		/ERROR
	TAD PFNB2
	TAD (10
	DCA PFNB	/MOVE ON
	DCA 1		/SET INPUT BUFFER POINTER TO START OF BUFFER
	DCA 2		/ALSO BUFFER #2
	TAD (-100	/64 PLOT LINES PER SEG
	DCA CTR2
/DO ONCE FOR EACH PLOT LINE
NXLN,	TAD (LBUF-1
	DCA 17
	DCA FCF		/ NO FUNNY CHARS YET
	TAD (-10	/128 CHAR LINES (64 WORDS) (2*8 BLOCKS)
	DCA CTR4
GPL0,	TAD (-4		/GET PLOT LINE INTO BUFFER
	DCA GPC
GPL1,	CDF IFLD1
	TAD I 1
	ISZ 1
	CDF PFLD
	DCA TMP
	TAD TMP
	JMS CKFC	/ CHECK FOR FUNNY CHAR & STORE
	TAD TMP
	BSW
	JMS CKFC
	ISZ GPC
	JMP GPL1
	TAD (400-4
	TAD 1
	DCA 1
	ISZ CTR4
	JMP GPL0
	TAD (-4000+4
	TAD 1
	DCA 1
	TAD (-10	/128 CHAR LINES (64 WORDS) (2*8 BLOCKS)
	DCA CTR4
GPL2,	TAD (-4		/GET PLOT LINE INTO BUFFER
	DCA GPC
GPL3,	CDF IFLD2
	TAD I 2
	ISZ 2
	CDF PFLD
	DCA TMP
	TAD TMP
	JMS CKFC	/ CHECK FOR FUNNY CHAR & STORE
	TAD TMP
	BSW
	JMS CKFC
	ISZ GPC
	JMP GPL3
	TAD (400-4
	TAD 2
	DCA 2
	ISZ CTR4
	JMP GPL2
	TAD (-4000+4
	TAD 2
	DCA 2
/DELETE TRAILING @'S
	TAD (-200	/128 CHARS
	DCA CTR4
	TAD 17
	DCA TMP
DELAT,	TAD I TMP
	SZA CLA
	JMP I (NNL	/NOT NULL
	CMA
	TAD TMP
	DCA TMP
	ISZ CTR4
	JMP DELAT

	ISZ NLC		/ONE MORE NULL LINE

CKEPL,	ISZ CTR3	/DONE 12 PLOT LINES?
	JMP SEGCHK
	TAD (-14
	DCA CTR3

/CHECK NULL LINES COUNTER
	TAD NLC
	TAD (-14
	SNA CLA
	JMP SCL

/DUMP NULL LINES
	JMS DNL
	SKP

/JUST SEND CRLF
SCL,	ISZ BLC		/COUNT ONE MORE BLANK LINE
	DCA NLC
SEGCHK,	ISZ CTR2
	JMP NXLN
	JMP NXSEG

GPC,	0
	PAGE
/ CHECK FOR FUNNY CHAR & STORE CHAR AWAY
/ NECESSARY TO OVERCOME PROBLEMS IN PRINTRONIX
CKFC,	0
	AND (77
	TAD (-37
	CLL
	TAD (-2		/ CHECK FOR UNDERLINE OR SPACE
	SNL
	ISZ FCF		/ GOT FUNNY CHAR
	TAD (41		/ RESTORE CHAR CODE
	DCA I 17
	JMP I CKFC

/NON-NULL LINE ; DUMP NULL LINES, THEN CURRENT LINE
NNL,	JMS DNL
	TAD (205
	JMS OUTPUT
	TAD (LBUF-1
	DCA 17
OPNC,	TAD I 17
	TAD (-40
	SPA
	TAD (100
	TAD (240
	JMS OUTPUT
	ISZ CTR4
	JMP OPNC
	JMS CRLF
	JMP I (CKEPL
/ DUMP NULL LINES
DNL,	0
	TAD FCF
	SNA CLA
	JMP DNL2	/ NO FUNNY CHARS
	TAD NLC
	SZA CLA
	JMP DNL2	/ FUNNY CHARS DON'T MATTER
	TAD BLC
	SNA CLA
	JMP I DNL	/ NOTHING TO DO
	TAD (14
	DCA NLC		/ DO 12 PLOT LINES INSTEAD OF LAST BLANK LINE
	CMA

DNL2,	TAD BLC
	CMA
	DCA BLC
	SKP

	JMS CRLF
	ISZ BLC
	JMP .-2

	TAD NLC
	CMA
	DCA NLC
	JMP .+6

	TAD (205
	JMS OUTPUT
	TAD (300
	JMS OUTPUT
	JMS CRLF
	ISZ NLC
	JMP .-6
	JMP I DNL
	PAGE
/ SEND CRLF
CRLF,	0
	TAD (215
	JMS OUTPUT
	TAD (212
	JMS OUTPUT
	JMP I CRLF

/ OUTPUT CHAR TO OS/8 FILE
OUTPUT,	0
	AND (377
	TAD (-232
	SNA
	JMP OUTEND	/ ^Z ; CLOSE FILE
	TAD (232
	JMS PACK	/ PACK CHAR
	JMP I OUTPUT	/ ALL OK
	JMS PUTBUF	/ FILLED BUFFER
	 JMP ER0	/ NO SPACE LEFT
	JMP I OUTPUT

OUTEND,	JMS CLOSE
	 JMP ER7	/ NO SPACE LEFT
	JMP I OUTPUT
/ PACK CHARACTERS INTO OS/8 BUFFER
PACK,	0
	ISZ PACKJ
PACKJ,	JMP .		/ SWITCH FOR CHARS 1, 2, 3 OF TRIO
	JMP PACK1
	JMP PACK2
/ CHAR 3 OF TRIO ; NOW DO WORK
	DCA PACKT
	TAD JMPPJ
	DCA PACKJ	/ RESTORE SWITCH
	TAD PACKT
	CLL RTL
	RTL
	AND (7400
	TAD PACKW1
	CDF BFLD
	DCA I FPTR	/ STORE 1ST WORD
	ISZ FPTR
	TAD PACKT
	CLL RTR
	RTR
	RAR
	AND (7400
	TAD PACKW2
	DCA I FPTR
	ISZ FPTR
	CDF PFLD
	ISZ FCTR
	JMP I PACK	/ RETURN 1 IF SPACE LEFT IN BUFFER
	ISZ PACK
	JMP I PACK	/ RETURN 2 IF BUFFER FULL
/ PACK CHAR 1
PACK1,	DCA PACKW1
	JMP I PACK
/ PACK CHAR 2
PACK2,	DCA PACKW2
	JMP I PACK
PACKW1,	0
PACKW2,	0
PACKT,	0
JMPPJ,	JMP PACKJ

/ FILE POINTER & COUNTER
FPTR,	0
FCTR,	0
/CLOSE OUTPUT FILE
SEGEND,	TAD (214
	JMS OUTPUT
	TAD (232
	JMS OUTPUT

/ WIND UP PROGRAM
	TAD I (ICOMM	/ LOOK AT 'ICOMM'
	TAD (-6000	/ MAGIC VALUE ?
	SZA CLA
	JMP MONEXT	/ JUST EXIT

	TAD (PXPAFN
	DCA FPFN
	CDF 0
	TAD I	(7776	/ ON CCL-DEVICE (SBLOCK)
	CDF 10
	JMS I (200
	2
FPFN,	0		/ LOOKUP CCLDEV:PXPA.SV
	0
	JMP MONEXT	/ NOT THERE ; EXIT
	TAD FPFN
	DCA CHB		/ START BLOCK OF PXPA

	CDF 0
	TAD I	(7756	/ ON CCL-DEVICE (MREAD-1)
	CDF 10
	JMS I (200
	6
CHB,	0		/ START BLOCK OF PXPA
/ PROGRAM TO CHAIN TO
PXPAFN,	FILENAME PXPA.SV

	PAGE
/ OUTPUT BUFFER TO OS/8 FILE
PUTBUF,	0
	TAD FCTR	/ MUST BE MULTIPLE OF 200 AT THIS STAGE
	TAD MAXB	/ FULL BUFFER
	DCA BFW		/ SET FUNCTION WORD
	TAD BFW
	AND (3600
	CLL RTL
	RTL
	RTL
	DCA PBT		/ NO OF BLOCKS TO GO
	TAD PBT
	TAD MNB
	SZL
	JMP FULL
	DCA MNB		/ NEW -VE NO OF BLOCKS
	CIF 0
PB2,	JMS I AOH	/ CALL OUTPUT HANDLER
BFW,	0		/ FUNCTION WORD
ABUF,	BUFFER		/ FROM BUFFER
CBLOK,	0		/ TO THIS BLOCK
	 JMP I PUTBUF	/ ERROR
	TAD PBT
	TAD CBLOK
	DCA CBLOK	/ UPDATE BLOCKS
	TAD PBT
	TAD NBU
	DCA NBU		/ & BLOCKS USED

/ INITIALISE BUFFER
IBUF,	TAD ABUF
	DCA FPTR
	TAD MAXC
	DCA FCTR
	TAD JMPPJ
	DCA PACKJ
	ISZ PUTBUF
	JMP I PUTBUF	/ RETURN 2 IF ALL WELL
/ ALL SPACE FILLED UP
FULL,	SZA CLA
	JMP I PUTBUF	/ ABSOLUTELY NO SPACE
	TAD CLOSE
	SNA CLA
	JMP I PUTBUF	/ NO SPACE FOR ^Z
	JMP PB2		/ OK IF JUST FULL DURING CLOSE
PBT,	0
/ OPEN NEW OUTPUT FILE
OPEN,	0
	DCA CLOSE	/ CLEAR CLOSE INDICATOR
	TAD AFN2
	DCA AFN
	TAD I (7600
	JMS I (200
	3		/ ENTER NEW FILE
AFN,	0
MNB,	0
	 JMP I OPEN	/ OPEN FAIL
	TAD AFN
	DCA CBLOK	/ SET CURRENT BLOCK
	DCA NBU		/ 0 BLOCKS USED
	TAD OPEN	/ TRANSFER RETURN ADDRESS
	DCA PUTBUF
	JMP IBUF	/ INITIALISE BUFFER

/ CLOSE OUTPUT FILE
CLOSE,	0
	TAD (232	/ PACK ^Z, THEN AT LEAST 2 NULLS
	JMS PACK	/ TO FORCE OUT ^Z IF 1ST OR 2ND CHAR IN BLOCK
	JMS PACK	/ IF ANY OF THESE 3 JMS PACK SKIP,
	JMS PACK	/ CONTROL WILL FALL THROUGH TO JMS PUTBUF
	TAD FCTR
	AND (177
	SZA CLA
	JMP .-4		/ PAD OUT BUFFER WITH 0'S
	JMS PUTBUF
	 JMP I CLOSE	/ NO SPACE
	TAD I (7600
	JMS I (200
	4		/ CLOSE
AFN2,	7601
NBU,	0		/ NO OF BLOCKS USED
	SKP
CLOSEX,	ISZ CLOSE
	JMP I CLOSE
MAXB,	5200+BFLD	/ WRITE 12 RECORDS FROM BUFFER FIELD
MAXC,	-1200		/ NO OF TRIOS IN 12 RECORDS

	PAGE
/ NOW THE TEXT HANDLING PART

/ OUTPUT TEXT TO CONSOLE
TXOUT,	0
	DCA TMP
TXO2,	TAD I TMP
	CLL RTR
	RTR
	RTR
	JMS OP6B
	TAD I TMP
	ISZ TMP
	JMS OP6B
	JMP TXO2

/ OUTPUT 6-BIT CHAR
OP6B,	0
	AND (77
	SNA
	JMP TXEND
	TAD (-40
	SPA
	TAD (100
	TAD (240
	JMS TYPE
	JMP I OP6B

/ END OF TEXT STRING ; DO CRLF
TXEND,	TAD (215
	JMS TYPE
	TAD (212
	JMS TYPE
	JMP I TXOUT

/ TYPE CHAR ON CONSOLE
TYPE,	0
	TLS
	TSF
	JMP .-1
	CLA
	JMP I TYPE
/ ERROR MESSAGES
ERMT,	ERM0; ERM1; ERM2; ERM3; ERM4; ERM5; ERM6; ERM7

ERM0,	TEXT "LPT: FEHLER"
ERM1,
ERM2,	TEXT "PLOT.IM NICHT IN ORDNUNG"
ERM3,	TEXT "ES GIBT KEIN LPT: !!"
ERM4,	TEXT "KANN HANDLER NICHT LADEN"
ERM5,	TEXT "LESE-FEHLER BEI PLOT.IM"
ERM6,
ERM7,	TEXT "USR INTERNER FEHLER"

	PAGE
LBUF,	ZBLOCK 200	/ ROOM FOR 128 CHARS

	PAGE
	FIELD 1
	*2000
	$$$$$$$$