perm filename SAIWRD.FAI[S,AIL]1 blob
sn#102578 filedate 1974-05-22 generic text, type T, neo UTF8
COMPIL(WRD,<ARRYOUT,WORDOUT,ARRYIN,WORDIN>
,<GETCHN,SAVE,RESTR,GOGTAB,SIMIO,X22,X33,X44,NOTOPN>
,<ARRYIN, ARRYOUT, WORDIN, AND WORDOUT>)
HERE (ARRYOUT)
PUSHJ P,SAVE
MOVE LPSA,[XWD 4,4]
ARO: MOVE CHNL,-3(P)
LOADI7 A,<ARRYOUT>
PUSHJ P,GETCHN
CMU <
SETZM @ENDFL(CDB) ;CLEAR ERROR FLAG
>;CMU
LDB TEMP,[POINT 4,DMODE(CDB),35] ;CHECK MODE
CMU <
MOVEI Z,1 ;ASSUME NOT IMP MODE
CAIN TEMP,3 ;IS THE MODE 3?
TRZA Z,-1 ; YES - CMU 32-BIT IMP MODE.
CAIN TEMP,4 ; (THIS ONE IS CMU-IMAGE MODE)
JRST OUTRAY ; THEN OKAY, NOT DUMP MODE EITHER.
>;CMU
CAIGE TEMP,10 ;MAKE SURE AT LEAST BINARY MODE
ERR <ARRYOUT: mode must be '14,'10, or '17, not >,6
MOVE 0,[XCT IODOUT,SIMIO] ;IN CASE DUMP MODE
CAIL TEMP,15
JRST ARYDMP ;COMMON DUMP MODE ROUTINE
OUTRAY: MOVE A,-2(P) ;STARTING LOC
SKIPGE B,-1(P) ;EXTENT
ERR <ARRYOUT: negative word count, value is>,6
WOUT2: SKIPG E,OCOWNT(CDB) ;# WORDS LEFT IN BUFFER
JRST WOUT5 ;BETTER GET ANOTHER BUFFER
JUMPE B,RESTR ;NOTHING LEFT TO DO
CMU <
CAIN Z,0 ;IMP MODE?
LSH E,-2 ;DIVIDE BY 4 TO GET WORD COUNT
>;CMU
IBP OBP(CDB) ;MAKE SURE PTRS TO FIRST WORD
CMU <
CAIN Z,0 ;IMP MODE?
DPB Z,[POINT 6,OBP(CDB),5]
>;CMU
MOVE C,OBP(CDB) ;"TO" ADDR
HRRZI D,(C) ;FOR BLT TERMINATION CALCULATION
HRLI C,(A) ;"FROM" ADDR
CAIGE B,(E) ;ENUFF IN BUFFER?? (NOTICE THAT CAIGE
JRST WOUT3 ;YES
ADDI D,-1(E) ;FINAL ADDR
BLT C,(D) ;DO IT!
ADDI A,(E) ;UPDATE PTR
SUBI B,(E) ;AND COUNT
SETZM OCOWNT(CDB)
HRRM D,OBP(CDB)
WOUT5: XCT IOOUT,SIMIO ;DO THE OUTPUT
JFCL ;ERRORS HANDLED ALREADY
JRST WOUT2 ;TRY NEXT CHUNK
WOUT3: JUMPLE B,RESTR ;NOTHING TO MOVE
SUBI B,1
ADD D,B ;END OF BLOCK
BLT C,(D) ;MOVE IT
SUBI E,1(B) ;FIX LENGTH
CMU <
CAIN Z,0 ;IMP MODE?
LSH E,2 ;MULTIPLY BY 4 FOR BYTE COUNT
>;CMU
MOVEM E,OCOWNT(CDB) ;
ADDM B,OBP(CDB) ;FIX BYTE POINTER
JRST RESTR ;LEAVE LIKE A TREE AND MAKE
HERE (WORDOUT) ;WRITE ONE WORD
PUSHJ P,SAVE
MOVE LPSA,X33
MOVE CHNL,-2(P)
LOADI7 A,<WORDOUT>
PUSHJ P,GETCHN
CMU <
SETZM @ENDFL(CDB) ;CLEAR ERROR FLAG
>;CMU
LDB A,[POINT 4,DMODE(CDB),35];DATA MODE
CAIL A,15 ;A DUMP MODE?
JRST DMPWO ;WO IS ME, YES
WDO: SOSL OCOWNT(CDB) ;BUFFER FULL?
JRST WOKO ;NO
XCT IOOUT,SIMIO ;YES, WRITE IT
JFCL ; ERRORS HANDLED ELSEWHERE
JRST WDO ;GO BACK AND DO IT RIGHT
WOKO: MOVE TEMP,-1(P) ;THING TO BE WRITTEN
IDPB TEMP,OBP(CDB) ;WRITE IT
JRST RESTR
DMPWO: MOVE LPSA,[XWD 7,7] ;ACCOUNT FOR EVERYTHING
MOVEI TEMP,-1(P) ;PNT TO WORD TO BE WRITTEN
PUSH P,-2(P) ;CHANNEL
PUSH P,TEMP ;ADDR OF WORD
PUSH P,[1] ;COUNT
PUSHJ P,ARO ;JOIN THE ROUTINE (RETAD JUST FOR STACK SYNCH)
HERE (ARRYIN)
PUSHJ P,SAVE
MOVE LPSA,X44
ARI: MOVE CHNL,-3(P)
LOADI7 A,<ARRYIN>
PUSHJ P,GETCHN
SETZM @ENDFL(CDB) ;ASSUME NO END OF FILE
LDB TEMP,[POINT 4,DMODE(CDB),35] ;CHECK DUMP MODE
CMU <
MOVEI Z,1 ;ASSUME NOT IMP MODE
CAIN TEMP,3 ;IS THE MODE 3?
TRZA Z,-1 ; YES - CMU 32-BIT IMP MODE.
CAIN TEMP,4 ;IF ONE OF THE SPECIAL CMU MODES,
JRST INARY ; THEN OKAY, NOT DUMP MODE EITHER
>;CMU
CAIGE TEMP,10
ERR <ARRYIN: mode must be '10 or '14 or '17, not >,6
MOVE 0,[XCT IODIN,SIMIO] ;IN CASE DUMP MODE
CAIL TEMP,15
JRST ARYDMP ;USE COMMON ROUTINE
INARY: MOVE A,-2(P) ;STARTING LOC
SKIPGE B,-1(P) ;EXTENT
ERR <ARRYIN: negative word count, value is >,6
WIN3: JUMPE B,RESTR ;NOTHING LEFT TO DO
SKIPG E,ICOWNT(CDB) ;#LEFT IN BUFFER
JRST WIN5
CMU <
CAIN Z,0 ;IMP MODE?
LSH E,-2 ;DIVIDE BY 4 TO GET WORD COUNT
>;CMU
IBP IBP(CDB) ;MAKE SURE PTS TO NEXT
HRL C,IBP(CDB) ;ADDR OF FIRST WORD TO READ
MOVEI D,(A) ;FOR BLT TERMINATION
HRR C,A ;"TO" ADDRESS
CAIG B,(E) ;ENOUGH HERE?
JRST WIN4 ;YES
ADDI D,-1(E) ;NO, FINISH THIS BUFFER
BLT C,(D)
ADD A,E ;FIX INPUT POINTER
SUB B,E ;FIX INPUT COUNT
WIN5: XCT IOIN,SIMIO ;DO INPUT
JRST WIN3 ;OK, GO AHEAD
JRST WIEOF1 ;EOF OR ERROR, LEAVE
WIN4: ADDI D,-1(B) ;FINISH UP
BLT C,(D)
SUB E,B ;FIX UP COUNT
CMU <
CAIE Z,0 ;IMP MODE?
JRST .+3
LSH E,2 ;MULTIPLY BY 4 FOR BYTE COUNT
DPB Z,[POINT 6,IBP(CDB),5]
>;CMU
SUBI B,1 ;PREPARE TO CORRECT BP
MOVEM E,ICOWNT(CDB) ;UPDATE WORDS LEFT
ADDM B,IBP(CDB) ; POINTER
JRST RESTR ;LEAVE
WIEOF1: MOVE TEMP,-1(P) ;#WORDS WANTED -1
SUBM TEMP,B ;#INPUT IN RH
WIN2: HRRM B,@ENDFL(CDB) ;#INPUT IN RH, ERR OR EOF BITS IN LH
JRST RESTR
HERE (WORDIN) ;READ ONE WORD -- USE ARRYIN
PUSHJ P,SAVE
MOVE LPSA,X22
LOADI7 A,<WORDIN>
MOVE CHNL,-1(P) ;CHANNEL NUMBER
PUSHJ P,GETCHN
LDB TEMP,[POINT 4,DMODE(CDB),35];DATA MODE
CAIL TEMP,15 ;DUMP MODE?
JRST DUMPWI ; YES
SETZM @ENDFL(CDB)
WI: SOSL ICOWNT(CDB)
JRST WOKI ;ALL OK
XCT IOIN,SIMIO
JRST WI ;OK, GO BACK TO KEEP COUNT RIGHT
TDZA A,A ;RETURN 0, WITH ERROR
WOKI: ILDB A,IBP(CDB) ;OK, RETURN NEXT WORD
MOVEM A,RACS+1(USER) ;RESULT
JRST RESTR
DUMPWI: MOVE LPSA,[XWD 6,6]
MOVEI TEMP,RACS+1(USER);RESULT GOES HERE
PUSH P,-1(P) ;CHANNEL
PUSH P,TEMP ;ADDRESS
PUSH P,[1] ;1 WORD TRANSFER
PUSHJ P,ARI ;WON'T RETURN, JUST SYNCH STACK
ARYDMP:
MOVN TEMP,-1(P) ;-WORD COUNT
JUMPGE TEMP,[ERR <DUMP MODE WORD COUNT NOT POSITIVE, VALUE IS >,6]
SOS D,-2(P) ;STARTING ADDR - 1
HRL D,TEMP ;IOWD -COUNT,STARTING ADDR -1
MOVEI D+1,0 ;TERMINATE THE READ
MOVE A,[JRST RESTR] ;IF IT SUCCEEDS
MOVE B,[JRST RESTR] ;IF IT FAILS (EOF OR ERR, ALREADY HANDLED)
JRST 0 ;GO DO DUMP I/O
HERE(WRDSP1)
HERE(WRDSP2)
HERE(WRDSP3)
ERR <DRYROT WRD SPARES>
ENDCOM(WRD)