File: IMAGE.PA of Tape: Various/Decus/decus-1
(Source file text) 


/IMAGE-TO-BINARY CONVERSION

/LOAD WITH OPTIONS /8/9=2000$

*2000
IMAGE,	CLA CLL
	CIF 10
	JMS I (7700
	 10		/USR IN
	CIF 10
	JMS I (200
	 5		/COMMAND DECODER
	 2326		/.SV
	TAD (INDEV+1	/ALLOW 2-PAGE HANDLER.
	DCA INHNDL
	CDF 10
	TAD I (7617	/INPUT DEVICE.
	AND (17
	CDF
	CIF 10
	JMS I (200
	 1		/FETCH HANDLER
INHNDL,	 INDEV+1
	 HLT

	CDF 10
	TAD I (7604
	SNA		/SKIP IF EXTENSION SUPPLIED.
	TAD (0216	/.BN
	DCA I (7604
	TAD I (7620	/INPUT BLOCK.
	CDF
	DCA INBLOK
	JMS I INHNDL
	 200
	 HEADER
INBLOK,	 0
	 HLT
	IAC
	TAD INBLOK
	DCA INBLK1
	TAD I (HEADER
	DCA SEGCNTR	/COUNTS SEGMENTS
	TAD (HEADER+3
	DCA SEGPNTR	/SETUP POINTER TO 1ST PAIR OF WORDS.
	JMS LEADER

SEGLOOP,ISZ SEGPNT
	TAD I SEGPNT	/ADDRESS
	DCA INBLOK	/SAVE TEMPORARILY.
	ISZ SEGPNT
	TAD I SEGPNT	/FIELDS AND PAGES.
	AND (70		/NOW JUST FIELDS.
	TAD (300
	CIF 10
	JMS I (OPUTC	/FIELD CHANGE IS NOT CHECKSUMMED.
	TAD INBLOK	/ADDRESS AGAIN.
	STL		/LINK(1)=SET-ORIGIN.
	JMS SEND
	TAD I SEGPNT
	AND (3700	/PAGES.
	RAL CLL
	CIA
	DCA WC
NXTBLK,	TAD (-400
	DCA BLWC
	TAD (INBUFF
	DCA CA
	JMS I INHNDL
	 200
	 INBUFF
INBLK1,	 0
	 HLT
	ISZ INBLK1
NXTWRD,	TAD I CA
	ISZ CA
	CLL
	JMS SEND	/LINK MUST BE CLEAR HERE
	ISZ WC		/SKIP WHEN LOCATIONS ALL SENT
	SKP
	JMP SEGDONE
	ISZ BLWC	/SKIP WHEN BLOCK EXHAUSTED.
	JMP NXTWRD
	JMP NXTBLK
SEGDONE,ISZ SEGCNT	/SKIP WHEN SEGMENTS COMPLETE
	JMP SEGLOOP
	TAD CHKSUM
	JMS SEND
	JMS LEADER
	TAD (232
	CIF 10
	JMS I (OPUTC	/^Z CLOSES FILE.
	CIF 10
	JMS I (200
	 11		/USR OUT
	CDF 10
	TAD I (7642
	CDF
	SMA CLA		/SKIP IF ALTMODE TERMINATOR.
	JMP IMAGE
	JMP I K7600	/BACK TO KEYMON.



/VARIABLES

CA,	0	/CURRENT-ADDRESS POINTER
WC,	0	/WORD-COUNTER
BLWC,	0	/BLOCK WORD-COUNTER.



SEGCNT,	0	/COUNTS SEGMENTS OF	SAVED FILE.
SEGPNT,	0	/POINTS TO SEGMENT TABLE IN DIRECTORY.

K7600,	-200	/ALSO 7600.
PAGE
	EJECT
/LEADER SUBROUTINE PUTS OUT 200 CODES.

LEADER,	0
	CDF 10
	CLA IAC
	AND I (7643	/IS /L OPTION SET?
	SZA CLA		/NO - SKIP NEXT LINE.
	TAD (7600	/YES - PUT OUT 200 CODES.
	TAD (-20
	CDF
	DCA LCNTR
	TAD (200
	CIF 10
	JMS I (OPUTC
	ISZ LCNTR
	JMP .-4
	DCA CHKSUM
	JMP I LEADER
/SEND ROUTINE TRANSMITTS A 12-BIT WORD IN 'BINARY' FORMAT,
/IF LINK(1), THEN BIT 5 IS SENT ON 1ST FRAME.

SEND,	0
	DCA STMP
	TAD STMP
	RTR;RTR;RTR
	AND (177
	JMS STUFF
	TAD STMP
	AND (77
	JMS STUFF
	JMP I SEND

LCNTR,
STMP,	0
STMP1,	0
CHKSUM,	0	/CHECKSUM, MODULO 4096.

STUFF,	0
	DCA STMP1
	TAD STMP1
	CIF 10
	JMS I (OPUTC
	TAD STMP1
	TAD CHKSUM
	DCA CHKSUM
	JMP I STUFF
PAGE
/ASCII I/O FOR PS-8

/DEFINITIONS REQUIRED FOR CHARACTER I/O ROUTINES.

INBUFF=.+1400
OUTBUFF=6600	/IN FIELD 1.
INDEV=.
OUTDEV=.+400
HEADER=.+1000
ERROR1=HLT
IOAREA=7200
O2PAGE=1

FIELD 1
*IOAREA
/USED BY OUTPUT ROUTINES.
/COME HERE IN CASE OUTPUT CANNOT BE OPENED ON FIRST TRY.
OFAIL,	TAD I I7600
	AND (7760
	SNA CLA		/SKIP IF NOT INDEFINITE REQUEST.
	ERROR1		/OUTPUT FILE PROBABLY TOO LARGE.
	TAD I I7600
	AND (17
	DCA I I7600
	JMP I (OUENTR	/TRY INDEFINITE.
I7600,	7600
PAGE
/DELIVERS A CHARACTER TO THE OUTPUT FILE. OUTPUT FILE NAME
/MUST HAVE BEEN DEFINED PREVIOUSLY!!
/^Z WILL CLOSE OUTPUT FILE.
/CALLED BY:
/	TAD CHAR
/	IOF		/SEE NOTE AT IGETC ABOVE.
/	CDF
/	CIF 10
/	JMS I (OPUTC
/	RETURN (ACC=0)


OPUTC,	0
	DCA LAST
	RDF
	TAD CDFCIF
	DCA ODONE
	CDF CIF 10
	TAD LAST
OL02,	DCA I OPNTR
	TAD OUTINH
	SNA CLA		/SKIP IF OUTPUT ENTERED.
	JMP OOPEN
OL01,	ISZ OPNTR
	TAD I OPNTR
	SMA		/SKIP WHEN 3 CHARACTERS SAVED.
	JMP OEXIT
	DCA OPNTR	/RESTORE POINTER.
	TAD OCHAR3
	CLL RTL;RTL
	AND O7400
	TAD OCHAR1
	DCA I OCA
	ISZ OCA
	TAD OCHAR3
	CLL RTR;RTR;RAR	/LEFT-SHIFT 8.
	AND O7400
	TAD OCHAR2
	DCA I OCA
	ISZ OCA
O7400,	7400		/IN CASE OCA PASSES THRU 0.
	ISZ OWC		/SKIP IF BUFFER FULL.
	JMP OEXIT

	ISZ OBLWC	/SKIP IF OUTPUT FILE TOO LARGE!
	SKP
	ERROR1
	CIF
	JMS I OUHAND
	 4210
OUTP,	 OUTBUFF
OUTBLK,	 0		/MUST BE FILLED BY 'OOPEN'.
	ERROR1
	ISZ OUTBLK
	JMS ORESET
O7600,
OEXIT,	7600
	TAD LAST
	TAD (-232
	SZA CLA		/SKIP IF ^Z RECIEVED.
	JMP ODONE

/CLOSE THE OUTPUT FILE.

CLOSE,	TAD OPUTC
	DCA RETURN
	TAD OUTBLK
	CIA
	DCA OUBLK	/SAVE -BLOCK.
	JMS OPUTC	/PACK WITH 0'S.
	TAD OUTBLK
	TAD OUBLK
	SNA CLA		/SKIP WHEN LAST ONE WRITTEN.
	JMP .-4
	TAD OULENGTH
	CIA		/NOW HAVE +LENGTH.
	TAD OBLWC	/GET -LENGTH+N
	DCA OBLWC
	TAD I O7600
	JMS I (200
	 4		/CLOSE
OU7601,	 7601
OBLWC,	 0		/COUNTS BLOCKS AVAILABLE.
	ERROR1
	DCA OUTINH	/MARK OUTPUT FILE CLOSED.
CDFCIF,	CDF CIF
	JMP I RETURN	/TO CALL+1.
ODONE,	CIF CDF
	JMP I OPUTC

	IFNDEF O2PAGE <O2PAGE=0>
OOPEN,	TAD OU7601
	DCA OUBLK
	TAD (11
OL03,	IAC
	DCA OUHAND-1
	TAD (OUTDEV+O2PAGE
	DCA OUHAND
	TAD I O7600
	SNA		/SKIP IF OUTPUT POSSIBLE.
	ERROR1
	JMS I (200
	 12		/CHECK HANDLER, OR FETCH IT.
OUHAND,	 OUTDEV+O2PAGE
	ERROR1		/HUH?
	TAD .-2
	SNA CLA		/SKIP IF NOW IN CORE.
	JMP OL03	/TRY TO LOAD IT.
OUENTR,	TAD I O7600
	JMS I (200
	 3		/ENTER OUTPUT FILE.
OUBLK,	 7601
OULENG,	 0
	JMP I (OFAIL	/CAN'T ENTER IT.
	TAD OUBLK
	DCA OUTBLK
	TAD OULENGTH
	DCA OBLWC
	JMS ORESET
	ISZ OUTINH
	JMP OL01

/RESET POINTERS.

ORESET,	0
	TAD OCHAR
	DCA OPNTR
	TAD O7600
	DCA OWC
	TAD OUTP
	DCA OCA
	JMP I ORESET

OPNTR,	.+1
OCHAR1,	0		/SIMILAR TO ICHAR1 ETC.
OCHAR2,	0
OCHAR3,	0
OCHAR,	OCHAR1		/SEE ICHAR3+1 FOR WARNING!

LAST,	0		/CONTAINS LAST CHAR RECIEVED.
OWC,	-200		/"
OCA,	OUTBUFF		/"
RETURN,	0		/RETURN ADDRESS FOR RECURSIVE OPUTC.
OUTINH,	0		/0 WHEN NO OUTPUT FILE IN PROGRESS.

XLIST ////////////////
$$$$$$$$$$$$