perm filename SPASS[1,VDS] blob
sn#334103 filedate 1978-02-16 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE SPASS
C00005 00003 SCAN FOR START OF DATA BLOCK AND THEN FILL TTY BUFFER
C00008 00004 PROCEDURES: GETNME,GET6BT,GETCHR
C00010 00005 PROCEDURES: PACK,PACKDN
C00013 00006 LOCAL STORAGE AREA
C00014 ENDMK
C⊗;
TITLE SPASS
;SPASS CAN BE USED TO TRANSFER SOURCE FILES FROM THE PDP10
;OVER A TTY PHONE LINE. THE FILE IS SENT ONE CHARACTER AT A TIME.
;DEFINITIONS
P←17 ;PUSH STACK POINTER
FILE←1 ;DISK FILE CHANNEL
COUNT←4 ;NUMBER OF BYTES LEFT IN BLOCK
OLDB←5 ;OLD TTY BUFFER
NEWB←6 ;NEW TTY BUFFER
TTYB←7 ;TTY BUFFER BYTE POINTER
CHKSUM←10 ;CHECK SUM
DMES←11 ;DONE MESSAGE
;INITIALIZE PROGRAM AND INPUT DISK FILE
SPASS: RESET
MOVE P,[XWD -50,PDL-1] ;INITIALIZE PUSH STACK
OUTSTR [ASCIZ /
SOURCE FILE PASSER PROGRAM
/]
INIT FILE,0 ;INITIALIZE DISK CHANNEL
SIXBIT /DSK/
IBUF
HALT .
INBUF FILE,4 ;SET UP BUFFER RING
ASKNME: OUTSTR [ASCIZ /FILE NAME = /]
PUSHJ P,GETNME ;DECODE NAME TO SIXBIT
SETZM INAME+3 ;USE THIS JOB'S PPN
LOOKUP FILE,INAME ;OPEN FILE FOR READING
JRST [ OUTSTR [ASCIZ /***LOOK UP FAILED, TRY AGAIN**
/]
JRST ASKNME ]
OUTSTR [ASCIZ /SKIP TITLE PAGE (Y,N) = /]
INCHRW ;GET A CHARACTER
CAIN 131
JRST SKIPPG
CAIE 171
JRST NOSKIP
SKIPPG: PUSHJ P,GETCHR ;SKIP TO FIRST FORM FEED
JRST [ OUTSTR [ASCIZ /
FILE ONLY 1 PAGE LONG/]
JRST EXXIT ]
CAIE 14 ;FORM FEED?
JRST SKIPPG ;NOPE
;CHANGE TTY CHARACTERISTICS
NOSKIP: CLRBFI
OUTSTR [ASCIZ /
TYPE (CNTRL)G, STATE NEW FILE NAME AND TRANSFER WILL START./]
SETOM TTYBIT ;SAVE AND CHANGE TTY BITS TO
GETLIN TTYBIT ; PASS EACH CHARACTER AS IS
MOVE TTYBIT
TLZ 110010 ;NO ARROW,NO FILL,TAB
TLO 26 ;FULL, NO ECHO
SETLIN
MOVE [-1,,[026000,,1]] ;DONT CONVERT TO STANDARD ASCII
TTYSET
;SCAN FOR START OF DATA BLOCK AND THEN FILL TTY BUFFER
MOVEI NEWB,OBUF1 ;SET UP TTY BUFFER PTRS
MOVEI OLDB,OBUF2
MOVEI DMES,[ASCIZ /
[FATAL] CATCHER TERMINATED TRANSFER BEFORE END OF FILE
/]
MOVE TTYB,[POINT 7,0];FORM BYTE PTR
HRRI TTYB,(NEWB)
MOVEI 1,177 ;MARK START WITH BS CHAR
IDPB 1,TTYB
MOVEI COUNT,=513 ;NUMBER OF CHARS TO PUT INTO BUFFER
SETZ CHKSUM, ;RESTART CHECKSUM
SCAN: PUSHJ P,GETCHR ;GET A CHARACTER
JRST EOF
;MAP CHARACTERS
MAP: CAIN 0 ;IGNOR NULLS
JRST SCAN
CAIG 37 ;CONTROL CHAR?
JRST [ CAIN 14 ;FORM FEED?
JRST [ MOVEI 3
JRST FPACK]
CAIN 11 ;TAB?
JRST [ MOVEI 4
JRST FPACK]
CAIL 12 ;ELSE 12 TO 15 MAP STRAIGHT THRU
JRST [ CAIG 15
JRST FPACK
JRST CNTRL]
CNTRL: CAIN 30 ; 30 → 137
JRST [ MOVEI 137
JRST FPACK]
CAIN 31 ; → → =
JRST [ MOVEI 75
JRST FPACK]
CAIN 32 ; 32 → 176
JRST [ MOVEI 176
JRST FPACK]
CAIN 33 ; ≠ → /=
JRST [ MOVEI 57
PUSHJ P,PACK
MOVEI 75
JRST FPACK]
CAIN 34 ; ≤ → <=
JRST [ MOVEI 74
PUSHJ P,PACK
MOVEI 75
JRST FPACK]
CAIN 35 ; ≥ → =>
JRST [ MOVEI 75
PUSHJ P,PACK
MOVEI 76
JRST FPACK]
CAIN 36 ; ≡ → =
JRST [ MOVEI 75
JRST FPACK]
MOVE 3,0 ;ALL OTHERS ARE ↑
MOVEI 136
PUSHJ P,PACK
MOVE 3
ADDI 100
JRST FPACK ]
CAIN 175
MOVEI 33
CAIN 176
MOVEI 175
FPACK: PUSHJ P,PACK
JRST SCAN ;SUCCESS RETURN
JRST PASSDN
EOF: PUSHJ P,PACKDN
;EXIT CLEANLY
PASSDN: RELEAS FILE, ;CLOSE DISK FILE
SETLIN TTYBIT ;RESET TTY BITS TO AS BEFORE
EXXIT: EXIT
;PROCEDURES: GETNME,GET6BT,GETCHR
GETNME: MOVE 1,[POINT 6,INAME] ;PACK 6 BIT NAME
SETZM INAME
SPACES: PUSHJ P,GET6BT ;IGNOR LEADING SPACES
JRST SAVCHR
JUMPE SPACES
JRST GETNDN
SAVCHR: IDPB 1 ;SAVE A CHARACTER OF THE NAME
PUSHJ P,GET6BT ;NEXT SIXBIT CHAR
JRST SAVCHR ;LEGAL CHAR
SETZM INAME+1 ;PACK EXTENSION IN HERE
MOVE 1,[POINT 6,INAME+1]
CAIN 16 ;"." SEPARATES NAME AND EXT
JRST CHKEXT
JRST GETNDN
SAVEXT: IDPB 1 ;SAVE EXTENSION CHAR
CHKEXT: PUSHJ P,GET6BT
JRST SAVEXT
GETNDN: CLRBFI
POPJ P,
GET6BT: INCHWL ;GET A CHARACTER
TRZ 40 ;CONVERT ASCII TO SIXBIT
TRZE 100
TRO 40
CAIGE 20 ;SKIP RETURN IF NOT 0 TO Z
AOS (P)
CAILE 72
AOS (P)
POPJ P, ;RETURN
GETCHR: SOSG IBUF+2 ;NEED A NEW BUFFER?
IN FILE, ;YES, TRY READING SOME MORE
JRST CANGET
STATZ FILE,20000 ;IN FAILED, EOF?
POPJ P, ;YES
OUTSTR [ASCIZ /
[FATAL] DISK INPUT ERROR/]
POPJ P,
CANGET: ILDB IBUF+1 ;GET A CHARACTER
AOS (P) ;TAKE SUCCESS RETURN
POPJ P,
;PROCEDURES: PACK,PACKDN
PACKDN: MOVEI 2 ;MARK END OF FILE
PUSHJ P,PACK
SETZ COUNT, ;SEND OUT PARTIAL BUFFER
PUSHJ P,PACK
MOVEI DMES,[ASCIZ /
FILE TRANSFER COMPLETED/]
INCHRW 1
JRST FINCMD
PACK: SOJG COUNT,PACK3 ;ANY ROOM LEFT IN BUFFER?
MOVEI 1,(CHKSUM) ;NO, SEND OFF BUFFER
ASH 1,-=10 ;FINISH OFF WITH CHECKSUM
TRZ 1,777740
ADDI 1,100
IDPB 1,TTYB
MOVEI 1,(CHKSUM)
ASH 1,-5
TRZ 1,777740
ADDI 1,100
IDPB 1,TTYB
MOVEI 1,(CHKSUM)
TRZ 1,777740
ADDI 1,100
IDPB 1,TTYB
SETZ 1, ;MARK END OF TTY BUFFER
IDPB 1,TTYB
ASKCMD: INCHRW 1 ;WHAT DO WE DO NOW?
CAIN 1,"G" ;G → TYPE NEW TTY BUFFER
JRST [ OUTSTR (NEWB)
JRST PACK2 ]
FINCMD: CAIN 1,"C" ;C → CHECK SUM ERROR, TYPE OLD BUFFER AGAIN
JRST [ OUTSTR (OLDB)
JRST ASKCMD ]
CAIN 1,"D" ;D → END OF TRANSFER
JRST [ OUTSTR (DMES)
JRST PACKER ]
CAIE 1,"F" ;F → FATAL ERROR, TERMINATE
JRST [ OUTSTR [ASCIZ /
[FATAL ERROR] UNEXPECTED RESPONSE FROM TTY/]
JRST PACKER ]
JRST PACKER
PACK2: EXCH NEWB,OLDB ;START FILLING NEW TTY BUFFER
MOVE TTYB,[POINT 7,0];FORM BYTE PTR
HRRI TTYB,(NEWB)
MOVEI 1,177 ;MARK START WITH BS CHAR
IDPB 1,TTYB
MOVEI COUNT,=512 ;NUMBER OF CHARS TO PUT INTO BUFFER
SETZ CHKSUM, ;RESTART CHECKSUM
PACK3: ADD CHKSUM,0
IDPB TTYB
POPJ P, ;SUCCESS RETURN
PACKER: AOS (P) ;ERROR RETURN
POPJ P,
;LOCAL STORAGE AREA
IBUF: BLOCK 3 ;INPUT BUFFER POINTER
TTYBIT: 0 ;INITIAL TTY STATUS BITS
INAME: BLOCK 4 ;FILE NAME,EXTENSION,0,PPN
OBUF1: BLOCK =200 ;TTY OUTPUT BUFFERS
OBUF2: BLOCK =200
PDL: BLOCK 50 ;PUSH STACK
END SPASS