perm filename ASCIZE[KL,SYS] blob
sn#213639 filedate 1976-05-05 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00010 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE ASCIZE
C00007 00003 DEFINITIONS
C00008 00004 INITIALIZE
C00011 00005 ERRORS
C00012 00006 GETNAM, GETSIX
C00016 00007 TYSIX, TYFILE, GETCHR
C00017 00008 INIDEV
C00019 00009 BEGIN C2DMP CONVERT A10 TO DMP
C00028 00010 BEGIN C2A10 CONVERT DMP TO A10
C00037 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.
RAM FILES:
Z line: (must be present, must be first line)
Z wc,addr,chksum ;Zero C RAM. If wc=0, don't zero anything.
C wc,addr,d5,d4,d3,d2,d1,spec,....,chksum ;Load C-RAM wc is a multiple of 6
if wc is zero, next line will be a D line.
D wc,addr,.....???
Wc=0 ends file.
Octal patches: COwc,addr,d1,d2,d3,d4,d5,spec,.... no checksum.
The format of the data in a CO line is the same as KLDCP's C-RAM typeout
format (EBUS format). CO format reverses the dn fields from the "C "
format.
$
; 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