perm filename ASCIZE[KL,SYS]1 blob sn#210158 filedate 1976-04-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	ASCIZE
C00006 00003		DEFINITIONS
C00007 00004		INITIALIZE
C00010 00005	ERRORS
C00011 00006	GETNAM, GETSIX
C00015 00007	TYSIX, TYFILE, GETCHR
C00016 00008	INIDEV
C00018 00009	BEGIN C2DMP	CONVERT A10 TO DMP 
C00027 00010	BEGIN C2A10	CONVERT DMP TO A10
C00036 ENDMK
C⊗;
	TITLE	ASCIZE

;Convert DMP files to A10 files, and vice-versa.

COMMENT $

[The PDP-11 code that implements the following can be found in DTA11]

Ascii-ized file format for the -11:

Each byte of the file is an ascii character in the range 75-174.  In
addition there are some formatting bytes (comma,carriage return, and
line feed).

Six-bit data bytes are "ascii-ized" by adding 100 to bytes in the range
0-74 and by leaving bytes in the range 75-77 alone. [Resulting range is 75-174].
Fields in the ascii-ized file are reassmbled using a modified radix 100
assembler; thus, a modified "decimal printout routine" is appropriate
for generating these fields.  A field that has value zero may be represented
by the null string (but the commas that separate fields must be present).

An A10 (ascii-ized PDP-10 load module) has the following format.  

Zero lines:

Z wc,adr,count,....cksum<crlf>
[Note: the "Z ", the commas, and crlf are literal, i.e., present in the file.]

wc	is the count of adr,count pairs (max of 4 pairs per Z line)
adr	is the 16-bit PDP-10 address at which to start zeroing
	if an 18-bit PDP-10 address is needed, encode the two high
	order bits into the high byte of the 16-bit wc.
count	is the number of zeros to make (64K max)
cksum	is the negative of the 16-bit sum of wc,addr,count,....fields.


Ten-code line:

T wc,adr,wd1-byte1,wd1-byte2,wd1-byte3,wd2-byte1,wd2-byte2,wd2-byte3,....cksum<crlf>

wc	is the number of PDP-10 words to load times 3.
	Maximum of 10 PDP-10 words per T-line.
adr	is the 16-bit PDP-10 address at which to begin loading.
	If an 18 bit PDP-10 address is desired, encode the high-order
	address bits into the high byte of the 16-bit wc.
byte1	bits 21-35 of the pdp-10 word
byte2	bits  4-20 of the pdp-10 word
byte3	bits  0- 3 of the pdp-10 word

Ten start address line:

T ,adr,cksum<crlf>

A zero (i.e., empty) wc field denotes a starting address.

Comment lines:
Lines that begin with a semicolon are comments.  All text thru the crlf is
ignored.  Often the first line will be a comment containing the file
name and date.

Octal patch lines
ZO or TO signify octal patches.  The data for ZO and TO lines correspond to
to the data for Z and T lines, respectively.  Two differences arise.  First,
instead of reading fields as asciized data, fields are read as octal.  Second,
no checksum field should be present in a patch line.

$
;	DEFINITIONS

↓FL←0
↓A←1
↓B←2
↓C←3
↓D←4
↓W←5
↓X←6
↓Y←7
↓Z←10
↓S←15
↓R←16
↓P←17

EXTERN	JOBFF,JOBREL,JOBSA,JOBDDT,JOBSYM

PDLEN←←40

PDLIST:	BLOCK	PDLEN
INNAM:	BLOCK	5		;INPUT DEVICE,FILE,EXT,0,PPN
OUTNAM:	BLOCK	5		;OUTPUT DEVICE,FILE,EXT,0,PPN
CRLF:	BYTE(7)15,12
LSTCHR:	0
IBUF:	BLOCK	3
OBUF:	BLOCK	3
IWRD:	0
OWRD:	0
INWC:	0
INPRO:	0
INDATE:	0

↓ICHN←←0
↓OCHN←←1

FILDEV←←0			;INDEX TO INNAM,OUTNAM
FILNAM←←1
FILEXT←←2
FILPPN←←4

TODMP←←1			;FLAGS. FL RIGHT /TODMP OR /FRMA10
TOA10←←2			;		 /TOA10 OR /FRMDMP
QUOTE←←200000
BLNKSN←←400000
;	INITIALIZE

START:	RESET
	MOVE	P,[IOWD PDLEN,PDLIST]
	OUTSTR	CRLF
CMD:	OUTCHR	["*"]
	MOVEI	FL,0			;FLAGS
	MOVEI	R,OUTNAM
	PUSHJ	P,GETNAM
	JRST	CMDERR
	CAIE	A,"←"
	JRST	ERR05
	MOVEI	R,INNAM
	PUSHJ	P,GETNAM
	JRST	CMDERR
	TRNE	FL,TOA10!TODMP		;WAS CONVERSION SPECIFIED BY COMMAND?
	JRST	CMDA			;YES.
	HLRZ	A,OUTNAM+FILEXT		;GET OUTPUT FILE EXTENSIOON
	MOVSI	B,-NNEXT1
CMD0:	MOVS	C,EXTBL1(B)
	CAIE	A,(C)
	AOBJN	B,CMD0
	JUMPL	B,CMD2			;IMPLIED BY OUTPUT NAME
	HLRZ	A,INNAM+FILEXT		;GET INPUT FILE EXTENSIOON
	MOVSI	B,-NNEXT2
CMD1:	MOVS	C,EXTBL2(B)
	CAIE	A,(C)
	AOBJN	B,CMD1
	JUMPGE	B,ERR00			;NOTHING IMPLIED.
CMD2:	MOVS	C,C
	TRO	FL,(C)
CMDA:	TRC	FL,TOA10!TODMP
	TRCN	FL,TOA10!TODMP		;SKIP UNLESS BOTH SWITCHES WERE SET
	JRST	ERR01
	MOVSI	A,'DMP'			;DEFAULT INPUT EXT FOR /TOA10
	MOVSI	B,'A10'			;DEFAULT OUTPUT EXT FOR /TOA10
	TRNN	FL,TOA10		;SKIP IF /TOA10
	EXCH	A,B			;MUST BE /TODMP
	SKIPN	INNAM+FILEXT
	MOVEM	A,INNAM+FILEXT
	SKIPN	OUTNAM+FILEXT
	MOVEM	B,OUTNAM+FILEXT

	MOVEI	R,INNAM
	JSP	S,INIDEV
	MOVEI	A,10			;0
	MOVEI	C,IBUF			;1
	OPEN	ICHN,A			;2
	LOOKUP	ICHN,A			;3
	JRST	CMDERR			;4 ERROR RETURN
	SETZM	IWRD			;5 RETURN HERE IF OK.
	MOVS	D,D
	MOVNM	D,INWC			;SAVE INPUT WC
	HRRZM	B,INDATE
	MOVEM	C,INPRO
	MOVEI	R,OUTNAM
	JSP	S,INIDEV
	MOVEI	A,10			;0
	MOVSI	C,OBUF			;1
	OPEN	OCHN,A			;2
	ENTER	OCHN,A			;3
	JRST	CMDERR			;4 ERROR RETURN
	SETZM	OWRD			;5 RETURN HERE IF OK.
	MOVSI	B,-DISPL
CMDB:	MOVE	C,DISPTB(B)
	TRNN	FL,(C)
	AOBJN	B,CMDB
	MOVS	C,C
	PUSHJ	P,(C)
	JRST	CMD

DISPTB:	C2DMP,,TODMP
	C2A10,,TOA10
DISPL←←.-DISPTB
	ERR02,,0


EXTBL1:	'DMP',,TODMP			;OUTPUT EXTENSION IMPLIES CONVERSION
	'A10',,TOA10
NNEXT1←←.-EXTBL1


EXTBL2:	'DMP',,TOA10			;INPUT EXTENSION IMPLIES CONVERSION
	'A10',,TODMP
NNEXT2←←.-EXTBL2


;ERRORS
ERR00:	OUTSTR	[ASCIZ\Must specify conversion by /TOA10 or /TODMP
\]
CMDERR:	PUSHJ	P,TTYFLU
	JRST	CMD

ERR01:	OUTSTR	[ASCIZ\Can't have both /TOA10 and /TODMP
\]
	JRST	CMDERR

ERR02:	OUTSTR	[ASCIZ/Internal error.
/]
TTYFLU:	MOVE	A,LSTCHR
	CAIE	A,12
	CAIN	A,175
	POPJ	P,
TTYFL1:	INCHRS	A
	POPJ	P,
	MOVEM	A,LSTCHR
	JRST	TTYFLU


ERR03:	OUTSTR	[ASCIZ/Error in file extension.
/]
	POPJ	P,

ERR04:	OUTSTR	[ASCIZ/Error in PPN
/]
	POPJ	P,

ERR05:	OUTSTR	[ASCIZ/Error at end of a term.
/]
	POPJ	P,

ERR06:	OUTSTR	[ASCIZ/Error in term
/]
	POPJ	P,
;GETNAM, GETSIX

GETNAM:	SETZM	(R)
	MOVSI	A,(R)
	HRRI	A,1(R)
	BLT	A,FILPPN(R)
	MOVSI	A,'DSK'
	MOVEM	A,FILDEV(R)
	PUSHJ	P,GETSIX
	POPJ	P,			;ERROR OF SOME KIND
	CAIE	A,":"			;IS THIS A DEVICE NAME?
	JRST	GETNM1			;NO.  MUST BE A FILE NAME
	MOVEM	B,FILDEV(R)		;STORE DEVICE NAME
	PUSHJ	P,GETSIX		;GET FILE NAME
	POPJ	P,			;ERROR
GETNM1:	MOVEM	B,FILNAM(R)
	CAIE	A,"."			;EXTENSION NEXT?
	JRST	GETNM2			;NO.  CHECK FOR PPN.
	PUSHJ	P,GETSIX
	POPJ	P,
	TRNE	B,-1			;ONLY 3 LETTERS ALLOWED IN EXTENSION.
	JRST	ERR03
	HLLOM	B,FILEXT(R)		;STORE EXT.  FLAG AS EXPLICIT EXT.
GETNM2:	CAIE	A,"["
	JRST	GETNM7			;NO PPN.
	PUSHJ	P,GETSIX		;GET PROG NAME.
	POPJ	P,
	TRNE	B,-1
	JRST	ERR04
	JUMPE	B,ERR04
	CAIE	A,","
	JRST	ERR04
	TRNE	B,-1
	JRST	ERR04
	JUMPE	B,ERR04
GETNM3:	TLNE	B,77
	JRST	GETNM4
	LSH	B,-6
	JRST	GETNM3

GETNM4:	HLLZM	B,FILPPN(R)
	PUSHJ	P,GETSIX
	POPJ	P,
	TRNE	B,-1
	JRST	ERR04
	JUMPE	B,ERR04
GETNM5:	TLNE	B,77
	JRST	GETNM6
	LSH	B,-6
	JRST	GETNM5
GETNM6:	HLRM	B,FILPPN(R)
	CAIE	A,"]"
	JRST	GETNM7
	PUSHJ	P,GETSIX
	POPJ	P,
	JUMPN	B,ERR05			;NOT NULL FOLLOWING ]
GETNM7:	CAIE	A,12
	CAIN	A,"←"
	JRST	CPOPJ1
	CAIE	A,"/"
	JRST	ERR05
	PUSHJ	P,GETSIX		;GET ANOTHER SIXBIT TERM - A SWITCH NAME
	POPJ	P,			;ERROR
	MOVSI	C,-SWTLEN
SWSET1:	CAMN	B,SWTAB(C)
	JRST	SWSET2
	AOBJN	C,SWSET1
	OUTSTR	[ASCIZ/Unknown switch /]
	PUSHJ	P,TYSIX
	OUTSTR	CRLF
	POPJ	P,

SWSET2:	TDO	FL,SWTAB2(C)
	JRST	GETNM7			;LOOP ON SWITCHES

SWTAB:	'TODMP '
	'TOA10 '
SWTLEN←←.-SWTAB
SWTAB2:	TODMP
	TOA10

GETSIX:	MOVE	C,[POINT 6,B]
	MOVEI	B,0
	TRZ	FL,QUOTE!BLNKSN
GETSX1:	PUSHJ	P,GETCHR
	CAIN	A,"↓"
	JRST	[TRC	FL,QUOTE	;COMPLEMENT QUOTE
		JRST	GETSX1]
	CAIL	A,"A"+40
	CAILE	A,"Z"+40
	JRST	.+2
	SUBI	A,40			;ALWAYS CONVERT TO UPPER CASE.
	TRNE	FL,QUOTE		;IN QUOTE MODE?
	JRST	GETSX2			;YES.  SKIP VALIDITY TESTS
	CAIN	A,15
	JRST	GETSX1			;FLUSH CR.
	CAIN	A," "
	JRST	[JUMPE B,GETSX1		;FLUSH LEADING BLANKS
		TRO FL,BLNKSN		;AFTER A BLANK, MUST SEE VALID DELIMITER
		JRST GETSX1]
	CAIL	A,"A"
	CAILE	A,"Z"
	JRST	.+2
	JRST	GETSX2			;ACCEPT CHARACTER
	CAIL	A,"0"
	CAILE	A,"9"
	JRST	.+2
	JRST	GETSX2
	CAIE	A,"$"
	JRST	CPOPJ1			;THIS IS A DELIMITER!
GETSX2:	SUBI	A,40
	TRNE	FL,BLNKSN
	JRST	ERR06
	JUMPL	A,ERR06			;ILLEGAL
	TLNE	C,770000		;SKIP IF "B" IS FULL ALREADY
	IDPB	A,C			;STUFF ANOTHER BYTE IN B
	JRST	GETSX1			;LOOP


CPOPJ1:	AOS	(P)
CPOPJ:	POPJ	P,

;TYSIX, TYFILE, GETCHR


TYSIX:	JUMPE	B,CPOPJ
	MOVEI	A,0
	LSHC	A,6
	ADDI	A,40
	OUTCHR	A
	JRST	TYSIX

TYFILE:	MOVE	B,FILDEV(R)
	CAMN	B,['DSK   ']
	JRST	TYFIL1
	PUSHJ	P,TYSIX
	OUTCHR	[":"]
TYFIL1:	SKIPN	B,FILNAM(R)
	POPJ	P,
	PUSHJ	P,TYSIX
	HLLZ	B,FILEXT(R)
	JUMPE	B,TYFIL2
	OUTCHR	["."]
	PUSHJ	P,TYSIX
TYFIL2:	SKIPN	B,FILPPN(R)
	POPJ	P,
	OUTCHR	["["]
	HLLZ	B,B
	PUSHJ	P,TYSIX
	OUTCHR	[","]
	HRLZ	B,FILPPN(R)
	PUSHJ	P,TYSIX
	OUTCHR	["]"]
	POPJ	P,

GETCHR:	INCHWL	A
	MOVEM	A,LSTCHR
	POPJ	P,

DECOUT:	IDIVI	A,12
	HRLM	B,(P)
	SKIPE	A
	PUSHJ	P,DECOUT
	HLRZ	A,(P)
	ADDI	A,"0"
	OUTCHR	A
	POPJ	P,
;INIDEV


INIDEV:	MOVEI	A,4(S)		;SETUP RETURN ADDRESS
	PUSH	P,A
	XCT	0(S)		;MOVEI A,<MODE>
	MOVE	B,FILDEV(R)
	XCT	1(S)		;MOVE C,[OBUFH,,IBUFH]
	XCT	2(S)		;OPEN CHANNEL,A
	JRST	NODEV		;ERROR
	MOVSI	D,FILNAM(R)	;SOURCE
	HRRI	D,A		;SOURCE,,DEST
	BLT	D,D		;LOAD FILE NAME
	XCT	3(S)
	JRST	NOLKET		;LOOKUP OR ENTER FAILED
	JRST	CPOPJ1

NODEV:	OUTSTR	[ASCIZ/Device /]
	MOVE	B,FILDEV(R)
	PUSHJ	P,TYSIX
	OUTSTR	[ASCIZ/: is unavailable
/]
	POPJ	P,

NOLKET:	MOVE	C,3(S)		;GET LOOKUP OR ENTER INSTR.
	AND	C,[777000,,0]
	CAMN	C,[LOOKUP]
	OUTSTR	[ASCIZ/LOOKUP failed.  /]
	CAMN	C,[ENTER]
	OUTSTR	[ASCIZ/ENTER failed.  /]
	PUSHJ	P,TYFILE
	OUTSTR	CRLF
	POPJ	P,
BEGIN C2DMP	;CONVERT A10 TO DMP 

BRKCHR:	0
OCTALF:	0
ZEROF:	0
HILOAD:	0
ZWC:	0
ZADR:	0
ZCNT:	0
TWC:	0
TADR:	0
TENWRD:	0
CHKSUM:	0
HIADDR:	0
SORG:	0

↑C2DMP:	MOVSI	A,000700
	MOVEM	A,IBUF+1		;CHANGE BYTE SIZE OF INPUT TO 7.
	INBUF	ICHN,2
	SETSTS	OCHN,17			;OUTPUT WILL BE DUMP MODE.
	MOVE	A,JOBFF
	IORI	A,1777
	MOVEM	A,HILOAD		;HIGHEST ADDRESS LOADED.
	ADDI	A,1			;THE "RELOCATION" OF SIMULATED CORE IMAGE
	MOVEM	A,SORG
C2DML:	PUSHJ	P,RDCHR			;PROCESS A LINE. GET A CHARACTER.
	JRST	A10EOF
	SETZM	OCTALF			;INITIALLY, NEITHER OCTAL NOR ZERO FORMAT.
	SETZM	ZEROF
	CAIN	A,"T"
	JRST	C2DMLT			;LOAD TEN CODE COMMAND
	CAIN	A,"Z"
	JRST	C2DMLZ			;A ZERO COMMAND
	CAIE	A,";"
	OUTSTR	[ASCIZ/Illegal line in A10 input.
/]
C2DMCL:	OUTCHR	A
	CAIN	A,12
	JRST	C2DML			;GET NEXT LINE
	PUSHJ	P,RDCHRX
	JRST	C2DMCL

ERBLNK:	OUTSTR	[ASCIZ/Illegal A10 format.  Need a blank or an "O" in second column.
/]
	JRST	C2DMCL

ERMUL3:	OUTSTR	[ASCIZ/Illegal A10 format.  WC in T line must be a multiple of 3.
/]
	JRST	C2DMCL

ILLCHR:	OUTSTR	[ASCIZ/Illegal A10 format.  Illegal character.
/]
	JRST	C2DMCL

C2DMLZ:	SETOM	ZEROF			;FLAG Z COMMAND
C2DMLT:	PUSHJ	P,RDCHRX		;EOF ISN'T LEGAL
	CAIN	A,"O"
	JRST	[SETOM OCTALF
		JRST CDMLX]
	CAIE	A," "
	JRST	ERBLNK			;ERROR NEEDED A BLANK.
CDMLX:	PUSHJ	P,GETWC			;ZERO CHECKSUM, GET WC INTO C, HIADDR IN B
	SKIPE	ZEROF			;Z OR T COMMAND?
	JRST	ZCMD			;Z COMMAND
	MOVE	B,C			;MAKE SURE WC IS A MULTIPLE OF 3
	IDIVI	B,3
	JUMPN	C,ERMUL3		;ERROR IF REMAINDER IS NON-ZERO
	MOVEM	B,TWC			;TLOAD WORD COUNT.
	PUSHJ	P,GETADR
	MOVEM	B,TADR			;SAVE TLOAD ADDRESS
	SKIPG	TWC
	JRST	TSTART			;LOAD TEN STARTING ADDRESS
TLOOP:	PUSHJ	P,RDTWRD		;READ TEN-WORD (3 BYTES).  RESULT IN A.
	MOVE	B,TADR			;ADDRESS TO LOAD
	PUSHJ	P,STORE			;STORE WORD
	  MOVEM	A,(B)	
	AOS	TADR			;INCREMENT ADDRESS
	SOSLE	TWC			;DECREMENT COUNT OF WORDS ON THIS LINE
	JRST	TLOOP			;LOAD ANOTHER WORD.
TDONE:	PUSHJ	P,DOCHEK		;CHECK THE CHECKSUM
	JRST	C2DML			;AND DO ANOTHER LINE

TSTART:	MOVEI	B,JOBSA
	HRRZ	A,TADR
	PUSHJ	P,STORE
	  HRRM	A,(B)
	JRST	TDONE

ZCMD:	MOVEM	C,ZWC
ZLOOP:	PUSHJ	P,GETADR		;GET ADDRESS TO ZERO INTO B
	MOVEM	B,ZADR
	PUSHJ	P,RDTERM		;GET THE COUNT OF WORDS TO ZERO
	ADDM	B,CHKSUM
	MOVEM	B,ZCNT
ZLOOP1:	MOVEI	A,0			;DATA
	MOVE	B,ZADR			;ADDRESS
	PUSHJ	P,STORE			;STORE IN MEMORY
	  MOVEM	A,(B)
	AOS	ZADR			;INCREMENT ADDRESS
	SOSLE	ZCNT			;DECREMENT COUNT
	JRST	ZLOOP1			;LOOP STORING ZEROS
	SOSLE	ZWC			;DECREMENT NUMBER OF ADDRESS/COUNT PAIRS
	JRST	ZLOOP			;GET ANOTHER ADDRESS/COUNT
	JRST	TDONE


DOCHEK:	MOVE	A,BRKCHR
	SKIPE	OCTALF			;OCTAL LINE?
	JRST	SKPCHK			;YES.  THERE'S NO CHECKSUM
	MOVN	A,CHKSUM		;GET - CHECKSUM
	ANDI	A,177777		;TRUNCATE TO 16 BITS
	MOVEM	A,CHKSUM		;STORE IT
	PUSHJ	P,RDTERM
	CAME	B,CHKSUM
CHKFAI:	OUTSTR	[ASCIZ/Checksum failure (CHKFAI)
/]
SKPCHK:	CAIN	A,12
	POPJ	P,
	OUTSTR	[ASCIZ/Not at end of line. (CHKLIN)
/]
CHKLIN:	OUTCHR	A
	CAIN	A,12
	POPJ	P,
	PUSHJ	P,RDCHRX
	JRST	CHKLIN

GETADR:	PUSHJ	P,RDTERM
	ADDM	B,CHKSUM
	IOR	B,HIADDR
	POPJ	P,


GETWC:	SETZM	CHKSUM			;INITIALIZE CHECKSUM
	PUSHJ	P,RDTERM		;READ A WC WORD.
	ADDM	B,CHKSUM
	IDIVI	B,200			;B←HIGH ADDRESS, C←NUMBER OF ZERO ADR/COUNTS
	LSH	B,20			;SHIFT B PART OF ADDRESS
	MOVEM	B,HIADDR
	POPJ	P,

RDTERM:	MOVEI	B,0			;READ AN ASCIIZED NUMBER
RDTER1:	PUSHJ	P,RDCHRX
	CAIN	A,15
	JRST	RDTER1			;FLUSH CR
	CAIE	A,12			;BREAK ON LF OR COMMA
	CAIN	A,","
	POPJ	P,
	CAIL	A,75
	CAILE	A,174
	JRST	RDTER2	
	TRZ	A,100
	LSH	B,6
	ADDI	B,(A)
	JRST	RDTER1

RDTER2:	CAIL	A,"0"
	CAILE	A,"7"
	JRST	ILLCHR			;ERROR.  ILLEGAL CHARACTER
	SKIPN	OCTALF
	JRST	ILLCHR
	LSH	B,3
	ADDI	B,-"0"(A)
	JRST	RDTER1

RDTWRD:	PUSHJ	P,RDTERM
	ADDM	B,CHKSUM
	ANDI	B,177777
	MOVEM	B,TENWRD
	PUSHJ	P,RDTERM
	ADDM	B,CHKSUM
	ANDI	B,177777
	LSH	B,20
	IORM	B,TENWRD
	PUSHJ	P,RDTERM
	ADDM	B,CHKSUM
	ANDI	B,17
	LSH	B,40
	IORB	B,TENWRD
	MOVE	A,B
	POPJ	P,

A10EOF:	OUTSTR	[ASCIZ/End of file on A10 input
/]
	CLOSE	ICHN,
	RELEAS	ICHN,
	MOVE	C,SORG
	ADDI	C,74			;ORIGIN OF DUMP FILE.
	MOVE	B,HILOAD		;LAST WORD LOADED
	SUBI	B,-1(C)			;-<ORIGIN-1> = NUMBER OF WORDS IN DUMP FILE.
	JUMPL	B,NULFIL		;JUMP IF THERE'S NOTHING TO WRITE
	MOVN	B,B			;-WC
	MOVSI	B,(B)			;-WC,,
	HRRI	B,-1(C)			;-WC,,ADDR
	MOVEI	C,0
	OUTPUT	OCHN,B
	CLOSE	OCHN,
AEOF1:	RELEAS	OCHN,
	POPJ	P,

NULFIL:	OUTSTR	[ASCIZ/Nothing in core to write.
/]
	JRST	AEOF1

RDCHRX:	PUSHJ	P,RDCHR
	JRST	.+2
	POPJ	P,
	OUTSTR	[ASCIZ/Unexpected end of file
/]
	MOVEI	A,12
	POPJ	P,

RDCHR:	SOSLE	IBUF+2
	JRST	RDCHR1
	INPUT	ICHN,
	STATZ	ICHN,20000
	POPJ	P,			;END OF FILE
RDCHR1:	ILDB	A,IBUF+1
	JUMPE	A,RDCHR
	MOVEM	A,BRKCHR
	JRST	CPOPJ1

STORE:	ADD	B,SORG			;ABSOLUTE ADDRESS FOR STORE
	CAMG	B,JOBREL		;TOO BIG?
	JRST	STOROK			;NO.
	PUSH	P,B
	CORE	B,
	JRST	NOCORE
	MOVE	B,HILOAD
	ADDI	B,1
	SETZM	(B)
	HRLI	B,1(B)
	MOVS	B,B
	BLT	B,@JOBREL		;ZERO NEW CORE
	POP	P,B
STOROK:	XCT	@0(P)
	CAMLE	B,HILOAD
	MOVEM	B,HILOAD		;HIGHEST ADDRESS LOADED.
	JRST	CPOPJ1

NOCORE:	POP	P,B
	TRNE	B,1777
	ADDI	B,2000
	LSH	B,-12
	LSH	B,1
	MOVE	A,B
	PUSHJ	P,DECOUT
	OUTSTR	[ASCIZ/ pages of core needed.
/]
	HALT	.

BEND C2DMP
BEGIN C2A10	;CONVERT DMP TO A10

OUTSTA:	0
OUTREL:	0
OUTSYM:	0
FINFLG:	0
TWC:	0
TADR:	0
ZADR:	0
ZCNT:	0
CHKSUM:	0
TENWRD:	0
INADR:	0
EOFFLG:	0

BUFR:	BLOCK	12
BUFRC:	0
BUFRA:	0

MONTAB:	ASCIZ	/Jan-/
	ASCIZ	/Feb-/
	ASCIZ	/Mar-/
	ASCIZ	/Apr-/
	ASCIZ	/May-/
	ASCIZ	/Jun-/
	ASCIZ	/Jul-/
	ASCIZ	/Aug-/
	ASCIZ	/Sep-/
	ASCIZ	/Oct-/
	ASCIZ	/Nov-/
	ASCIZ	/Dec-/


↑C2A10:	MOVSI	A,000700
	MOVEM	A,OBUF+1		;CHANGE BYTE SIZE OF OUTPUT TO 7.
	OUTBUF	OCHN,2
;FILE.EXT   DATE CRLF
	MOVEI	A,";"
	PUSHJ	P,PNTCHR
	MOVE	B,OUTNAM+FILNAM
	PUSHJ	P,PNTSIX
	HLLZ	B,OUTNAM+FILEXT
	JUMPE	B,CAL1
	MOVEI	A,"."
	PUSHJ	P,PNTCHR
	PUSHJ	P,PNTSIX
CAL1:	MOVEI	B,[ASCIZ/     /]
	PUSHJ	P,PNTSTR
	DATE	C,
	IDIVI	C,=31		;DAYS IN D,
	MOVEI	A,1(D)		;DAY OF MONTH IN A
	PUSHJ	P,PNTDEC
	MOVEI	A,"-"
	PUSHJ	P,PNTCHR
	IDIVI	C,=12		;YEARS IN C, MONTH IN D
	MOVEI	B,MONTAB(D)
	PUSHJ	P,PNTSTR
	MOVEI	A,100(C)
	PUSHJ	P,PNTDEC
	MOVEI	B,CRLF
	PUSHJ	P,PNTSTR

;NOW, THE ZERO LINES:

	MOVEI	C,1000		;FIRST ADDDRESS TO ZERO
	MOVE	D,INWC		;GET INPUT WORD COUNT
	ADDI	D,74		;PLUS OFFSET = LAST ADDRESS LOADED+1
	SUBI	D,1000		;MINUS FIRST ADDRESS TO ZERO=NUMBER OF LOCS TO ZERO
	HRRZ	D,D
	MOVEM	D,OUTREL	;SAVE JOBREL+1 OF OUTPUT FILE
	SOS	OUTREL
	SETZM	OUTSTA		;OUTPUT START ADDRESS
	SETZM	OUTSYM		;OUTPUT SYMBOLS
ZLOOP:	MOVEI	A,(D)		;A←COUNT OF THE NUMBER OF ZEROS
	CAILE	A,200000	;SKIP UNLESS A GREATER THAN 64K.
	MOVEI	A,200000	;SORRY.  ONLY 64K PER COMMAND
	SUBI	D,(A)		;DECREMENT D.
	MOVEM	A,ZCNT		;ZERO COUNT
	MOVEM	C,ZADR		;ZERO ADDRESS
	ADDI	C,(A)		;INCREMENT ADDRESS FOR NEXT ZERO.
	PUSH	P,C		;SAVE NEXT ADDRESS
	PUSH	P,D		;SAVE REMAINING COUNT
	MOVEI	B,[ASCIZ/Z /]
	PUSHJ	P,PNTSTR
	SETZM	CHKSUM		;INITIALIZE CHECKSUM
	LDB	A,[POINT 2,ZADR,19]	;HIGH TWO ADDRESS BITS
	LSH	A,8
	ADDI	A,1		;LOW-ORDER WORD COUNT.
	PUSHJ	P,PNTBYT	;SEND A BYTE
	LDB	A,[POINT 16,ZADR,35]
	PUSHJ	P,PNTBYT	;ADDRESS
	LDB	A,[POINT 16,ZCNT,35]
	PUSHJ	P,PNTBYT	;COUNT (0=64K)
	MOVN	A,CHKSUM
	ANDI	A,177777
	PUSHJ	P,PNTBY1	;SEND CHECKSUM
	MOVEI	B,CRLF
	PUSHJ	P,PNTSTR	;CRLF
	POP	P,D
	POP	P,C
	JUMPN	D,ZLOOP

;NOW, THE T-LINES
	MOVEI	A,73		;ADDRESS LAST READ
	MOVEM	A,INADR
	SETZM	EOFFLG
	SETZM	FINFLG
BUFIL:	MOVSI	D,-12
	SETZM	BUFR
	MOVE	A,[BUFR,,BUFR+1]
	BLT	A,BUFR+11
	SKIPE	EOFFLG		;BUFFER FILLER.
	JRST	FINOUT		;EOF SEEN.  FINISH OUTPUT
	MOVE	A,INADR
	ADDI	A,1
	MOVEM	A,BUFRA		;BUFFER ADDRESS
BUFIL1:	PUSHJ	P,INWRD		;READ A WORD
	JRST	BUFIL2		;END OF FILE ON DMP FILE
	AOS	B,INADR		;B←WORD ADDRESS OF THIS WORD IN THE FILE
	CAIL	B,140		;LOOK AT SPECIALS
	JRST	BUFI1A
	CAIN	B,JOBSYM
	MOVEM	A,OUTSYM
	CAIN	B,JOBSA
	HRRZM	A,OUTSTA
BUFI1A:	MOVEM	A,BUFR(D)
	AOBJN	D,BUFIL1
	JRST	BUFIL3

BUFIL2:	SETOM	EOFFLG		;NO MORE INPUT
BUFIL3:	MOVSI	D,-12
	SKIPN	BUFR(D)
	AOBJN	D,.-1
	JUMPG	D,BUFIL		;SKIP A ZERO BUFFER
	MOVEI	A,(D)		;A←NUMBER OF WORDS TO SKIP AT BEGINNING OF BUFR
	ADDM	A,BUFRA		;CHANGE BUFFER ADDRESS ACCORDINGLY.
	MOVEI	A,11
BUFIL4:	SKIPE	BUFR(A)
	JRST	BUFIL5		;A NON-ZERO WORD AT END OF BUFFER
	ADD	D,[1,,0]	;DECREMENT D'S COUNT FOR A ZERO AT END.
	SOJA	A,BUFIL4	;LOOP FLUSHING TRAILING ZEROS.
;NOW: D=AOBJN POINTER TO BUFR.  BUFR=ADDRESS TO LOAD IN PDP10
BUFIL5:	HLRO	C,D		;-WC
	MOVM	C,C		;+WC OF THIS T LINE.
	IMULI	C,3		;TIMES THREE BYTES/WORD
	LDB	A,[POINT 2,BUFRA,19]	;HIGH 2 ADDRESS BITS
	LSH	A,8
	ADDI	A,(C)
	MOVEM	A,TWC		;WC FOR LINE
	LDB	A,[POINT 16,BUFRA,35]
	MOVEM	A,TADR		;ADDR FOR LINE
	PUSH	P,D		;SAVE MAIN POINTER
	SETZM	CHKSUM
	MOVEI	B,[ASCIZ/T /]
	PUSHJ	P,PNTSTR
	MOVE	A,TWC
	PUSHJ	P,PNTBYT
	MOVE	A,TADR
	PUSHJ	P,PNTBYT
	MOVE	D,(P)
BUFIL6:	MOVE	A,BUFR(D)
	PUSHJ	P,PNTWRD
	MOVE	D,[1,,1]
	ADDB	D,(P)
	JUMPL	D,BUFIL6
	SUB	P,[1,,1]
	MOVN	A,CHKSUM
	ANDI	A,177777
	PUSHJ	P,PNTBY1
	MOVEI	B,CRLF
	PUSHJ	P,PNTSTR
	JRST	BUFIL

FINOUT:	SKIPE	FINFLG
	JRST	FINSTR
	MOVEI	A,36
	MOVEM	A,BUFRA
	MOVE	A,OUTSYM
	MOVEM	A,BUFR
	MOVE	A,OUTREL
	MOVEM	A,BUFR+1
	SETOM	FINFLG
	JRST	BUFIL3			;TRANSMIT 36,37

FINSTR:	SKIPN	OUTSTA
	JRST	FINST1
	LDB	A,[POINT 2,OUTSTA,19]	;HIGH 2 ADDRESS BITS OF START ADDRESS
	LSH	A,8
	MOVEM	A,TWC			;WC FOR LINE (ZERO LOW BYTE)
	LDB	A,[POINT 16,OUTSTA,35]
	MOVEM	A,TADR			;START ADDR.
	SETZM	CHKSUM
	MOVEI	B,[ASCIZ/T /]
	PUSHJ	P,PNTSTR
	MOVE	A,TWC
	PUSHJ	P,PNTBYT
	MOVE	A,TADR
	PUSHJ	P,PNTBYT
	MOVN	A,CHKSUM
	ANDI	A,177777
	PUSHJ	P,PNTBY1
	MOVEI	B,CRLF
	PUSHJ	P,PNTSTR
FINST1:	MOVEI	B,[ASCIZ/;NO STARTING ADDRESS
/]
	SKIPN	OUTSTA
	PUSHJ	P,PNTSTR
	MOVEI	B,[ASCIZ/;EOF
/]
	PUSHJ	P,PNTSTR
	CLOSE	OCHN,
	RELEAS	OCHN,
	CLOSE	ICHN,
	RELEAS	ICHN,
	POPJ	P,



PNTWRD:	MOVEM	A,TENWRD		;PDP-10 TO OUTPUT FILE.  SAVE WORD.
	LDB	A,[POINT 16,TENWRD,35]
	PUSHJ	P,PNTBYT
	LDB	A,[POINT 16,TENWRD,19]
	PUSHJ	P,PNTBYT
	LDB	A,[POINT 4,TENWRD,3]
PNTBYT:	ADDM	A,CHKSUM		;INCLUDE BYTE IN THE CHECKSUM
	PUSHJ	P,PNTBY1
	MOVEI	A,","
	JRST	PNTCHR

PNTBY1:	JUMPE	A,CPOPJ			;NULL IS OK FOR ZERO.
	IDIVI	A,100
	HRLM	B,(P)
	SKIPE	A
	PUSHJ	P,PNTBY1
	HLRZ	A,(P)
	CAIGE	A,75
	ADDI	A,100
	JRST	PNTCHR

PNTSIX:	JUMPE	B,CPOPJ		;SIXBIT TO ASCII TO OUTPUT FILE
	MOVEI	A,0
	LSHC	A,6
	ADDI	A," "
	PUSHJ	P,PNTCHR
	JRST	PNTSIX

PNTCHR:	SOSG	OBUF+2		;CHARACTER TO OUTPUT FILE
	OUTPUT	OCHN,
	IDPB	A,OBUF+1
	POPJ	P,

PNTSTR:	HRLI	B,440700	;STRING (RH OF B) TO OUTPUT FILE
PNTST1:	ILDB	A,B
	JUMPE	A,CPOPJ
	PUSHJ	P,PNTCHR
	JRST	PNTST1

PNTDEC:	IDIVI	A,=10
	HRLM	B,(P)
	SKIPE	A
	PUSHJ	P,PNTDEC
	HLRZ	A,(P)
	ADDI	A,"0"
	JRST	PNTCHR

INWRD:	SOSLE	IBUF+2
	JRST	INWRD1
	INPUT	ICHN,
	STATZ	ICHN,20000
	POPJ	P,			;END OF FILE
INWRD1:	ILDB	A,IBUF+1
	JRST	CPOPJ1

BEND C2A10

	END	START