Trailing-Edge
-
PDP-10 Archives
-
decuslib10-12
-
43,50547/tabcdp.mac
There is 1 other file named tabcdp.mac in the archive. Click here to see a list.
TITLE TABCDP - Routines to drive the TAB Products Cardpunch Terminal
SUBTTL Joe Smith, CSM, 29-Jun-83
SEARCH MACTEN,UUOSYM
SALL
ENTRY TABINI ;Initialize punch
ENTRY TABBYT ;Put a 12-bit byte into buffer
ENTRY TABPUN ;Punch the card
ENTRY TABFIN ;Finish up routine
EXTERN TTYIN,TIWAIT,TRMERR ;Input routines in SPROUT
;AC Definitions
;*; TF=0 ;TRUE/FALSE
S1=1 ;Temp
S2=2 ;(not preserved)
T1=3 ;Less temp
T2=4 ;
T3=5 ;
T4=6 ;
;*; J=14 ;Base reg
;*; C=15 ;I/O character
P=17 ;Stack Pointer
; Table of Contents for TAB Products Card Puncher
;
;
; Section Page
;
; 1. Interface to SPROUT - TABINI, TABBYT, TABPUN . . . . . 2
; 2. Definitions for Punch Terminal . . . . . . . . . . . . 2
; 3. SNDPUN - Send buffer to punch . . . . . . . . . . . . 4
; 4. TTYINI - Initialize terminal . . . . . . . . . . . . . 5
; 5. Data area . . . . . . . . . . . . . . . . . . . . . . 6
SUBTTL Interface to SPROUT - TABINI, TABBYT, TABPUN
;Routine to initialize the terminal.
;S1 zero to print as well as punch, RH of S2 has TTY UDX.
TABINI::MOVEM S1,NOPRIN ;Nonzero to not print
HRRZM S2,TTYUDX ;Save terminal number
PUSHJ P,TTYINI ;Set terminal characteristics
PJRST TABCLR ;Clear the bed and return
;Routine to put 12-bit byte into the buffer
;Byte in S1, uses S2
TABBYT::ANDI S1,7777 ;Clear junk
IDIVI S1,100 ;Split 12-bit byte in half
TRO S1,100 ;Make into printing ASCII char
IDPB S1,PUNPNT ;Put in buffer
TRO S2,100 ;Make into ASCII
IDPB S2,PUNPNT ;Put in buffer
POPJ P, ;Return
;Routine to output the buffer
;Uses S1-S2, T1-T4
TABPUN::MOVEI S1,CR ;CR forces punch
IDPB S1,PUNPNT ;Put in buffer
MOVEI S1,0 ;Terminate with
IDPB S1,PUNPNT ; ASCIZ
MOVE S1,[POINT 7,FEEDCR] ;Code to feed a card
PUSHJ P,SNDPUN ;Feed blank card into punching station
MOVE S1,[POINT 7,PUNBUF] ;Point to data
PUSHJ P,SNDPUN ;Send it
MOVE S1,PNTINI ;Reset pointer
MOVEM S1,PUNPNT ; to data area
POPJ P,
;Routine to finish up
TABFIN::PJRST TABCLR ;Clear out any cards
SUBTTL Definitions for Punch Terminal
;Codes to activate the TAB-Products Card Reader/Punch
NUL== 0 ;Select NO-REMOTE mode
SOH== 1 ;Select PUNCH and PRINT same mode
STX== 2 ;Select PUNCH and PRINT different mode (nonbinary)
ENQ== 5 ;Select PUNCH ONLY mode
ACK== 6 ;Positive ACK char from terminal
BEL== 7 ;Format code for ASCII transmission (only 7 rows)
BS== 10 ;Select READ mode, format code for EBCDIC transmission
TAB==11 ;Select READ/PUNCH mode, format code for BINARY data
LF== 12 ;Select KEY ENTRY mode, and sent before each CR
FF== 14 ;Command to PICK a card from main hopper
CR== 15 ;End of command, to/from terminal
SO== 16 ;Command to disable automatic feed
SI== 17 ;Command to enable automatic card feed
DLE==20 ;Command to CLEAR bed
DC1==21 ;Command to pick card from AUX hopper
DC2==22 ;Command for STATUS request
;Command to select program: 0=DC3,1=DC4,2=FS,3=SYN,4=ETB,5=CAN,6=EM,7=SUB,8=ESC
NAK==25 ;Negative ACK, parity error
;NOTE: Because NUL is a command to load binary program data, the Monitor
; must NOT send any extra NULs to the terminal, nor ^Q(DC1) or ^S(DC3).
FCLOAD==NUL ;Format code for loading programs
FCCOMM==ENQ ;Format code for control commands
FCSTAT==STX ;Format code for returned status
FCHOLL==LF ;FC to convert record from ASCII to HOLLERITH (12 rows)
FCASCI==BEL ;FC to process ASCII data with no conversion (7 rows)
FCEBCD==BS ;FC to process EBCDIC data with no conversion (8 rows)
FCBINA==TAB ;FC to process BINARY data, 2 bytes per column (12 rows)
;Data to the card punch always starts with a FORMAT CODE and ends with a CR.
;Data read from cards is sent alway received as 80 ASCII bytes, plus LF and CR.
;A binary data record to the terminal consists of 162 bytes. It starts with a
;TAB (FCBINA), has 80 pairs of (<hi order>+100,<low order>+100), ends with a CR.
CDPCHR==1+^D<80*2>+1+1 ;Number of chars (including null at end)
;Because the terminal is not INITed in Packed Image Mode, the Monitor will
;append an LF to each CR received from the terminal. A positive response is
;<ACK,LF,CR,LF>, a negative response is <NAK,LF,CR,LF>, and a response to
;REQUEST-STATUS (ENQ,DC2,CR) when in PUNCH ONLY mode is <STX,ENQ,LF,CR,LF>.
CLRPUN: BYTE (7) FCCOMM,DLE,CR,0 ;Clear Bed
FEEDCR: BYTE (7) FCCOMM,FF,CR,0 ;Feed Card
SELPM: BYTE (7) FCCOMM,ENQ,CR,0 ;Select Punch Mode (without printing)
SELPRT: BYTE (7) FCCOMM,SOH,CR,0 ;Select Punch and Print mode
SUBTTL SNDPUN - Send buffer to punch
;Routine to send an ASCIZ string to the card punch terminal and
; wait for an ACK, re-transmitting if necessary. S1 has pointer to ASCIZ
SNDPUN: MOVE T4,S1 ;Copy pointer in case of NAK
SNDAGN: MOVE S1,T4 ;Point to string
PUSHJ P,OUTTTY ;Output string to TTY
CAIN S1,ACK ;Did the terminal get it OK?
POPJ P, ;Yes
PUSHJ P,TTYIN## ;Clear input buffer
JUMPN S1,.-1 ;Loop until no more input
MOVE S1,[POINT 7,SELPRT] ;Code to select PUNCH & PRINT mode
SKIPE NOPRIN ;If not NORMAL forms,
MOVE S1,[POINT 7,SELPM] ; punch without printing
PUSHJ P,OUTTTY ;In case terminal lost power
JRST SNDAGN ;Try again
;Routine to send string pointed to by S1.
;On return, S1 has ACK, NAK, or zero if timed out
OUTTTY: MOVX T1,.TOOUS ;OUTSTR function
MOVE T2,TTYUDX ;TRMNO.
HRRZ T3,S1 ;Addr of data
MOVE S1,[3,,T1] ;Point to args
TRMOP. S1, ;Send the string
PUSHJ P,TRMERR## ;Should never happen
;This response time assumes 120 characters per second (1200 baud)
RESPTM==^D<<<CDPCHR+4>*1000>/120> ;4 char response
MOVX S1,HB.RTL+RESPTM ;Delay before calling TIWAIT
HIBER S1,
JFCL
GETACK: PUSHJ P,TIWAIT## ;Get a byte from the TTY
JUMPE S1,CPOPJ ;Return if no response
CAIE S1,ACK ;Positive ACK?
CAIN S1,NAK ;Negative ACK?
SKIPA ;OK
JRST GETACK ;Not one of those two
PUSH P,S1 ;Save response character
PUSHJ P,TTYIN## ;Get the LF from terminal
PUSHJ P,TTYIN## ;Get the CR from terminal
PUSHJ P,TTYIN## ;Get the LF from monitor
POP P,S1 ;Restore response char
CPOPJ: POPJ P,
SUBTTL TTYINI - Initialize terminal
;Data for TRMOP.s
;*HACK* All this will not be needed when PIM works properly (no extra nulls)
TRMTAB: .TOLCT,,0 ;SET TTY LC
.TOSND,,0 ;SET TTY GAG
.TOBLK,,0 ;SET TTY BLANKS
.TOWID,,CDPCHR+8 ;SET TTY WIDTH 171 (include HT char)
.TOFRM,,1 ;SET TTY FORM
.TONFC,,1 ;SET TTY NO CRLF
.TOFLC,,0 ;SET TTY FILL 0
.TOSLV,,1 ;SET TTY SLAVE
.TOLCP,,1 ;SET TTY NO ECHO
TRMSIZ==.-TRMTAB
;Set TTY characteristics, set to PUNCH or PUNCH+PRINT mode
TTYINI: MOVSI S2,-TRMSIZ ;Get number of functions
MOVE T2,TTYUDX ;Get terminal number
TTYIN1: MOVE S1,[3,,T1] ;Point to args
HLRZ T1,TRMTAB(S2) ;Get function code
ADDI T1,.TOSET ;Convert to set function
HRRZ T3,TRMTAB(S2) ;Get data
TRMOP. S1, ;Set the function
PUSHJ P,TRMERR##
AOBJN S2,TTYIN1 ;Loop for all
TTYIN2: MOVX T1,.TOCIB ;Clear input buffer
MOVE S1,[2,,T1] ;Point to args
TRMOP. S1, ;Do it
PUSHJ P,TRMERR##
MOVE S1,[POINT 7,SELPRT] ;Code to select PUNCH & PRINT mode
SKIPE NOPRIN ;If not NORMAL forms,
MOVE S1,[POINT 7,SELPM] ; punch without printing
PJRST SNDPUN ;Tell the terminal and return
;Routine to clear all partially processed cards
TABCLR: MOVE S1,[POINT 7,CLRPUN] ;Code to clear the punch
PUSHJ P,SNDPUN ;Clear all cards out
MOVE S1,[POINT 7,PUNBUF] ;Point to the punch buffer
MOVEI S2,FCBINA ;Code for binary punching
IDPB S2,S1 ;Put code in buffer
MOVEM S1,PNTINI ;Save initial pointer
MOVEM S1,PUNPNT ;Save data pointer
POPJ P,
SUBTTL Data area
CDPSIZ==<CDPCHR+4>/5 ;Number of words
DS:
PUNBUF: BLOCK CDPSIZ ;Buffer
PUNPNT: BLOCK 1 ;Byte pointer to buffer
PNTINI: BLOCK 1 ;Initial value of PUNPNT
TTYUDX: BLOCK 1 ;UDX of terminal
NOPRIN: BLOCK 1 ;Nonzero unless /FORMS:NORMAL
DE:
TABC..==:J$$END##+<DE-DS>
LITS: END