Google
 

Trailing-Edge - PDP-10 Archives - de-10-omona-v-mc9 - cdpser.mac
There are 6 other files named cdpser.mac in the archive. Click here to see a list.
TITLE	CDPSER  CARD PUNCH SERVICE ROUTINE V1066
SUBTTL	T WACHS/TW/CF/GH/JE/DAL  13 JUN 78
	SEARCH	F,S
	$RELOC
	$HIGH

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1973,1974,1975,1976,1977,1978 BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
XP VCDPSR,1066
ENTRY CDPSER
CDPSER:

	$LOW
CDPDDB::	SIXBIT	/CDP/
	XWD	4*HUNGST,	;CODE 4 - HUNG TIME IS 16 SECONDS
CDPIOS:	0
	EXP	CDPDSP
	XWD	DVOUT+DVCDR,14403
	0
CDPBUF:	0
CDPNTR:	0
CDPOAD:	XWD	R,0
CDPSTS:	0
CDPSTA:	XWD	.TYCDP!.SPCDP,0	;SPOOLABLE, PUNCH
CDPXTR:	0
CPPEVM:	0
CPPPSI:	0
CPPESE:	0
CPPHCW:	0
CPPJOB:	0
CDPCTR:	0
CDPCNT::	0
CDPCON:	0
CPFCON:	5100,,0
	$HIGH

INTERN	CDPDDB,CDPDSP,CDPINT

EXTERN	CDPCHN,CDPCHL,CPFSAV,STOIOS,CLRACT,SETIOD,IOSET,ITMCT1,WAIT1
EXTERN	ILLINP,ADVBFE,CKS12,CPOPJ1,OUT,PJOBN,JBTADR,JOB,HNGSTP,PBUFSZ
;CONI/CONO BITS
CO.INI==1B20		;INITIALIZE
CO.RJT==1B21		;REJECT/OFFSET A CARD
CO.EJT==1B23		;EJECT A CARD
CO.PID==1B24		;DISABLE PI INTERRUPTS ON TROUBLE
CO.PIE==1B25		;ENABLE PI INTERRUPTS ON TROUBLE
CO.CLR==1B26		;CLEAR ERROR FLOP
CO.DIE==1B27		;DISABLE EOC INTERRUPTS
CO.EIE==1B28		;ENABLE EOC INTERRUPTS
CO.CEO==1B29		;CLEAR EOC FLOP
CO.PON==1B30		;TURN ON PUNCH MOTOR
CO.CDR==1B31		;CLEAR DATA REQUEST FLOP
CO.SDR==1B32		;SET DATA REQUEST FLOP

CI.OFL==1B18		;OFF LINE
CI.HSC==1B21		;HOPPER/STACKER FULL OR CHAD BOX FULL
CI.PIK==1B22		;PICK FAILURE
CI.EJT==1B23		;EJECT FAILURE
CI.TRB==1B24		;TROUBLE
CI.TIE==1B25		;TROUBLE INTERRUPTS ENABLED
CI.ERR==1B26		;DATA OR TIMING ERROR
CI.CIP==1B27		;CARD IN PUNCH
CI.ECI==1B28		;EOC INTERRUPTS ENABLED
CI.EOC==1B29		;END OF CARD
CI.PON==1B30		;PUNCH IS ON
CI.BSY==1B31		;BUSY
CI.DRQ==1B32		;DATA REQUEST

CDPCTO==:CDPCNT-CDPDDB

CDTRY==3		;NUMBER OF RETRIES BEFORE CALLING IT A HARD ERROR


;BITS IN S
PCHBIT==2000	;RH - ON IF PUNCH AN ASCII CARD (SAW A LINE-FEED)

;LEFT HAND BITS
NOADV==1000	;ON IF MORE IN THE BUFFER TO PUNCH
CLSBIT==2000	;CLOSE HAS HAPPENNED
FILPRT==4000	;CURRENT BUFFER (MONITOR) IS PARTIALLY FULL
CDPTBL==10000	;TROUBLE DETECTED ON INTERRUPT LEVEL
CDPRCV==20000	;RECOVERY FROM TROUBLE IN PROGRESS

;DISPATCH TABLE
	POPJ	P,0		;SPECIAL ERROR STATUS
	JRST	CDPSTL		;DDB SETUP ROUTINE
	JRST	CDPRST		;INITIALIZE
	JRST	CDPHNG		;HUNG DEVICE
CDPDSP:	JRST	CDPRST		;RELEASE
	JRST	CDPCLS		;CLOSE
	JRST	CDPOUT		;OUTPUT
	JRST	ILLINP		;INPUT IS ILLEGAL
;CLOSE UUO
CDPCLS:	TLO	S,CLSBIT	;CLOSE IS HAPPENING
IFN	FTCPTR,<
	TLZ	S,CDPTBL	;CLEAR TROUBLE BIT
>
	MOVEM	S,CDPIOS	;SAVE IN DDB
	PUSHJ	P,OUT		;OUTPUT LAST PARTIAL BUFFER
	PUSHJ	P,WAIT1		;WAIT FOR CARD TO BE PUNCHED
	TLZ	S,NOADV+CLSBIT+FILPRT	;ZERO SOME S BITS
	MOVEI	T1,7417		;SET TO PUNCH AN EOF CARD
	PUSHJ	P,SETFRE
	JRST	CDPON		;PUNCH IT AND RETURN TO USER


;HERE TO RESET DDB
CDPRST:	SETZ	T1,		;GET A WORD OF ZEROES
	DPB	T1,PBUFSZ	;RESET SIZE TO ZERO
IFN	FTCPTR,<
	TLZ	S,37010		;CLEAR ALL BITS IN S
	PUSHJ	P,STOIOS	;AND SAVE IN DDB
>
	MOVSI	T1,DEPADV	;CLEAR DONT-ADVANCE BUFFERS BIT
	ANDCAM	T1,DEVADV(F)	; FROM DDB
	JRST 	CDPOFF		;GO TURN OFF PUNCH


;HERE TO SETUP DDB BUFFERSIZE
CDPSTL:	MOVEI	T1,21		;SET FOR ASCII
	TRNN 	M,10		;SKIP IF NOT ASCII
	POPJ	P,		;EXIT IF ASCII, T1=BUFFER SIZE
	MOVEI	T1,33		;SET FOR BINARY
	TRNN	M,4		;SKIP IF BINARY
	MOVEI	T1,34		;MUST BE IMAGE
	POPJ 	P,		;RETURN WITH T1=BUFFER SIZE

;OUTPUT UUO
CDPOUT:
IFN	FTCPTR,<
	TLZN	S,CDPTBL	;TROUBLE DETECTED ON INTERRUPT LEVEL?
	JRST	CDPOU1		;NO
	MOVEM	S,CDPIOS	;YES, SAVE S (CDPTBL OFF)
>
CDPSTP:	MOVSI	T1,DEPADV	;BIT TO TELL HNGSTP NOT TO DE-ADVANCE BUFFERS
	IORM	T1,CDPSTA	;PUT IN DEVADV (=CDPSTA)
	TLNE	S,IOBEG		;UNLESS VIRGIN BUFFERS
	ANDCAM	T1,CDPSTA	;THEN LET DE-ADVANCE HAPPEN
	PUSHJ	P,HNGSTP	;HALT JOB AND PRINT MESSAGE
	MOVSI	T1,DEPADV
	ANDCAM	T1,CDPSTA	;RESET DEPADV
	TLZ	S,IOSTBL	; AND S
CDPOU1:	TLO	S,IO		;TELL THE WORLD THIS IS OUTPUT
	CONO	CDP,CO.INI	;CLEAR PUNCH
	CONSO	CDP,474000	;CHECK FOR TROUBLE
	JRST	OKAY		;CONTINUE IF READY
	MOVE	J,JOB		;SET UP MSG IF NOT
	JRST	CDPSTP		;GO WAIT FOR "CONT" TO BE TYPED
OKAY:	TLZE	S,CDPRCV	;RECOVERING
	JRST	CDPON		;YES, USE CURRENT BUFFER
	TLZN	S,IOBEG		;VIRGIN DEVICE?
	JRST	CDPSET		;NO
	MOVEI	T1,4242		;YES. SET TO PUNCH A FREE CARD
	TRNE	S,100		;029 CHAR SET?
	MOVEI	T1,5252		;YES.
	TRNN	S,14		;ASCII?
	PUSHJ	P,SETFRE	;YES. PUNCH A FREE CARD
;COME HERE TO SET UP THE MONITOR BUFFER
CDPSET:	MOVEM	S,CDPIOS	;IOSET LOADS S
	PUSHJ	P,IOSET		;SET UP R
	MOVEI	T3,44		;ASSUME BINARY
	TRNN	S,10		;IS IT?
	MOVEI	T3,7		;NO, SET BYTE SIZE FOR ASCII
	MOVEI	U,@CDPOAD	;FIRST WORD OF BUFFER
	AOS	U		;POINT TO WDCNT WORD
	HRRZ	J,(U)		;WORD COUNT
	CAILE	J,33		;26 2/3 WORDS ALLOWED - IMAGE BIN
	MOVEI	J,33
	DPB	J,WDCPTR	;STORE IN WDCNT OF BINARY CARD
	MOVE	T2,T3
	PUSHJ	P,ITMCT1	;NUMBER OF DATA ITEMS
	JUMPE	J,BUFADV	;TRY NEXT BUFFER IF NULL
	LSH	T3,6		;SET SIZE INTO POINTER
	HRLM	T3,U		;POINTER TO DATA
	TLZE	S,FILPRT	;CONTINUE IN SAME BUFFER?
	JRST	NXTCON		;YES. SET POINTER AND CONTINUE
NXTSET:	SETZM	COLCNT		;START AT COLUMN 1
	MOVE	T1,[XWD BUF,BUF+1]
	SETZM	BUF		;ZERO THE BUFFER OF EXTRANEOUS DATA
	BLT	T1,BUF+32
	MOVEI	T3,BUF-1
	HLL	T3,U		;SET UP SIZE FIELD
	TLNE	T3,100		;IF ASCII, SET SIZE TO 14
	HRLI	T3,1400
TEMSET:	ILDB	T1,U		;DATA ITEM FROM USER
	TRNN	S,14		;ASCII?
	PUSHJ	P,ASCONV	;YES. CONVERT TO 12 BITS
	IDPB	T1,T3		;STORE IN MONITOR BUF
	SOJG	J,TEMSET	;LOOP ON COUNT
	TRNN	S,14
	JRST	SETPTR		;NO - IMAGE BIN OR ASCII
	TRNN	S,4
	JRST	TEMS2
	MOVEI	T2,@CDPOAD	;YES. COMPUTE CHKSUM
	PUSHJ	P,CKS12
	MOVSS	T1		;IT COMES BACK IN LH(T1)
	DPB	T1,CKSPTR	;SAVE IN COLUMN 2 LOC
TEMS2:	LDB	T2,WDCPTR	;CONVERT WORDCOUNT TO
	IMULI	T2,3		;NUMBER OF COLS TO PUNCH
	ADDI	T2,2		;COLS 1 AND 2 ARE FREE
	TRNE	S,4
	SKIPA	T1,BINPTR	;OUTPUT POINTER IS BUF-1
SETPTR:	MOVE	T1,[POINT 12,BUF,]	;ASCII POINTER IS BUF
	TDNN	S,[XWD CLSBIT,PCHBIT+10]
	JRST	PRTFUL		;NO. ASCII WITH NO LINE FEED
	MOVEM	T1,CDPNTR	;POINTER TO DATA IN BUF
	MOVEM	T1,CDOPTR	;SAVE FOR ERROR
	CAILE	T2,^D80		;ONLY PUNCH 80 COLUMNS
	MOVEI	T2,^D80
	MOVEM	T2,CDPCTR	;NUMBER OF COLUMNS TO PUNCH
	MOVEM	T2,CDOCTR	;SAVE FOR ERROR RECOVERY
	SETZM	ERRCNT
CDPON:	MOVEI	T1,5110		;DATA OR EOC INTERRUPTS
	SETZM	EOCOK		;INDICATE THAT AN EOC INTERRUPT HERE IS SPURIOUS
	CONO	PI,PI.OFF
	MOVEM	T1,CDPCON	;
;(IF AN EJECT WAS GIVEN FOR THE PREVIOUS CARD, IT MAY STILL BE MOVING
;OUT OF THE PUNCH, AND WHEN IT FINALLY DOES CLEAR, AN END-OF-CARD INTERRUPT
;WILL BE GENERATED)
	CONO	CDP,3340+CDPCHN	;START THE PUNCH, CLEAR ALL FLOPS, ENABLE ALL
	CONO	PI,PI.ON
	TRO	S,IOACT		;SETACT ZEROES IOW, WHICH MIGHT BE ON
	TRZ	S,PCHBIT
	JRST	STOIOS
;HERE TO CONVERT ASCII TO 12 BITS TO PUNCH
ASCONV:	AOS	T2,COLCNT	;PRESENT COLUMN
	JUMPE	T1,NOPUN	;FORGET IT IF A NULL
	CAIN	T1,12		;LINE FEED?
	JRST	PNCHCD		;YES. SET UP TO PUNCH
	CAIE	T1,15		;NO,CAR RET?
	CAIN	T1,14		;OR FORM FEED?
	JRST	NOPUN		;YES. IGNORE CHAR
	CAIN	T1,177		;RUB-OUT?
	JRST	NOPUN		;YES,IGNORE CHAR.
	CAILE	T2,^D80		;OVERFLOW?
	JRST	OVERFL		;YES. LIGHT IOBKTL
	CAIL	T1,40		;REGULAR CHARACTER?
	CAILE	T1,140
	JRST	SPEC		;NO. SPECIAL HANDLING
	SUBI	T1,40		;YES. CONVERT FROM TABLE
ASCNV2:	IDIVI	T1,3		;3 CHARS PER TABLE WORD
	TRNE	S,100		;029 SET?
	ADDI	T2,3		;YES. BUMP TO 029 TABLE
	LDB	T1,CRDPTR(T2)	;GET 12 BITS
	POPJ	P,		;AND RETURN


SPEC:	CAIL	T1,40		;LOWER CASE LETTER?
	CAILE	T1,172
	JRST	SPEC2		;NO. CONTROL CHAR
	TRZ	T1,100		;YES. CONVERT TO UPPER CASE, SUBI 40
	JRST	ASCNV2		;GET TABLE WORD

SPEC2:	CAIN	T1,11		;TAB?
	JRST	TAB		;YES. PUNCH SOME SPACES
	MOVEI	T1,100		;ILLEGAL CHAR - PUNCH "\"
	JRST	ASCNV2

TAB:	SETZ	T1,		;SET TO PUNCH A BLANK
	IDPB	T1,T3		;STORE A BLANK IN BUF
	TRNE	T2,7		;AT A TAB STOP ?
	AOJA	T2,.-2		;NO, SET NEXT COLUMN
	MOVEM	T2,COLCNT	;YES, SAVE UPDATED COLUMN
	JRST	CPOPJ1		;AND CONTINUE
PNCHCD:	TRO	S,PCHBIT	;LIGHT PUNCH-A-CARD BIT
	SOJLE	J,NOPUN		;THROUGH WITH BUFFER IF 0
	ILDB	T1,U		;LOOK AT NEXT CHAR
	JUMPE	T1,.-2		;LOOP IF NULL
	TLO	S,NOADV		;REAL CHAR. - DONT ADVANCE BUFFERS
	MOVEM	U,DATSAV	;SAVE POINTERS TO DATA
	MOVEM	J,ITMSAV
	MOVEI	J,0		;SET TO DROP THROUGH LOOP
NOPUN:	SOSN	T2,COLCNT	;LAST CHAR SEEN IS NOT PUNCHED
	MOVEI	T2,1		;ALWAYS PUNCH 1 COLUMN
	JRST	CPOPJ1		;RETURN

NXTPRT:	MOVE	U,DATSAV	;RESTORE POINTERS TO DATA
	MOVE	J,ITMSAV	;COUNT OF DATA LEFT
	JRSTF	@.+1		;LIGHT BYTE-INCREMENT-SUPPRESSION FLAG
	XWD	24000,NXTSET	;AND GO PUNCH NEXT CARD

PRTFUL:	MOVEM	T3,DATSAV
	TLO	S,FILPRT
	JRST	BUFADV


;CONTINUE IN SAME MONITOR BUFFER
NXTCON:	MOVE	T3,DATSAV	;POINTER TO LAST CHAR STORED
	JRST	TEMSET		;GO FILL REST

;SET UP TO PUNCH A FREE CARD
SETFRE:	MOVEM	T1,FRECRD	;WHAT TO PUNCH
	MOVEI	T1,^D80		;PUNCH 80 COLS.
	MOVEM	T1,FRECNT	;(EJECT ON 81ST DATA REQ)
	POPJ	P,
;INTERRUPT PROCESSING SECTION 
CDPINT:	CONSO	CDP,@CDPCON	;PUNCH INTERRUPT?
	JRST	.		;NO. GO AWAY
IFN FT5UUO,<
	CONI	CDP,CDPSTS	;STORE CONI STATUS IN DDB
>
	CONSZ	CDP,4100	;EOC OR TROUBLE?
	JRST	NOTDAT		;NON-DATA INTERRUPT
	CONSZ	CDP,1000	;NO. PUNCH ERROR?
	JRST	LACE		;YES, LACE REST OF CARD
	SKIPE	FRECRD		;DATA REQUEST. PUNCHING A FREE CARD?
	JRST	FREINT		;YES. PUNCH IT
	MOVEM	T1,CDPTMP	;NO. SAVE T1
	SOSGE	CDPCTR		;ANY DATA TO PUNCH?
	JRST	CRDUN		;NO. THROUGH WITH CARD
	ILDB	T1,CDPNTR	;NEXT BYTE TO PUNCH
	DATAO	CDP,T1		;GIVE IT TO PUNCH
INTXIT:	MOVE	T1,CDPTMP	;RESTORE T1
	SETOM	EOCOK		;ANY EOC INTERRUPT AFTER THIS IS LEGAL
	JEN	@CDPCHL		;AND DISMISS INTERRUPT

;HERE WHEN ALL DATA FOR A CARD IS PUNCHED
CRDUNX:	MOVEM	T1,CDPTMP
CRDUN:	CONO	CDP,10020+CPFCHN	;EJECT A CARD
	HLRS	CPFCON
	SETZM	CDPCON
	JRST	INTXIT


;HERE FOR A DATA REQUEST WHILE PUNCHING A FREE CARD
FREINT:	SOSGE	FRECNT		;PUNCHED 80 COLS.
	JRST	CRDUNX		;YES, EJECT
	DATAO	CDP,FRECRD	;NO, PUNCH A COLUMN
	SETOM	EOCOK		;EOC INTERRUPT IS LEGAL
	JEN	@CDPCHL		;DISMISS THE INTERRUPT

LACE:	SKIPE	CP10D##		;IS THIS A CP10D?
	JRST	NOTDAT		;YES, CARD IS AUTOMATICALLY REJECTED
	DATAO	CDP,SEVENS	;NO, LACE REST OF CARD
	JEN	@CDPCHL
;HERE ON A NON DATA-REQUEST INTERRUPT
NOTDAT:	CONO	PI,PI.OFF	;TURN OFF PI FOR SAFETY'S SAKE
	CONO	CDP,2220+CPFCHN## ;SWITCH CDP TO LOW PI LEVEL
	SETZM	CDPCON		; FOR END-OF-CARD PROCESSING
	HLRS	CPFCON		;ENABLE FOR ALL BUT DATA REQUEST
	CONO	PI,PI.ON	;RESTORE PI SYSTEM
	JEN	@CDPCHL		; AND GO AWAY

;INTERRUPT HERE ON LOWER LEVEL PI REQUEST
CPFINT::CONSO	CDP,@CPFCON	;FOR US?
	JRST	.		;NO
IFN FT5UUO,<
	CONI	CDP,CDPSTS
>
	HLLZS	CPFCON		;YES, WE WONT WANT THIS PI INTRPT AGAIN
	JSR	CPFSAV		;SAVE ACS, SET UP P
	MOVE	S,CDPIOS	;SET S
	MOVEI	F,CDPDDB	;AND F
	LDB	J,PJOBN
	MOVE	R,JBTADR(J)	;RELOCATION
	CONSZ	CDP,CI.TRB	;TROUBLE?
	JRST	TRBL		;YES
	CONSZ	CDP,CI.ERR	;ERROR?
	JRST	ERROR		;YES. TOO BAD


;HERE ON AN END OF CARD INTERRUPT
	SKIPN	EOCOK		;SPURIOUS END-OF-CARD INTERRUPT?
	JRST	CDPON		;YES. CLEAR EOC AND TRY AGAIN
	AOS	CDPCNT		;COUNT THE CARDS
				;AND FALL INTO CRDUN1

;HERE ON EOC INTERRUPT
CRDUN1:	CONSZ	CDP,CI.TRB	;PUNCH ERROR?
	JRST	ERROR		;YES. TOUGH
	CONSZ	CDP,CI.CIP	;CARD IN PUNCH?
	CONO	CDP,10020	;YES, EJECT IT
SEVENS:	SETZ	T1,1414
	EXCH	T1,FRECRD	;DONE WITH A FREE CARD IF T1 NOT 0
	JUMPN	T1,FREDUN
BUFADV:	TLZE	S,NOADV
	JRST	NXTPRT		;PUNCH MORE FROM SAME BUFFER
				;IO WAIT?
	PUSHJ	P,SETIOD	;YES. WAKE IT UP
	PUSHJ	P,ADVBFE	;ADVANCE BUFFERS
	JRST	CDPOFF		;NEXT IS NOT READY
	JRST	CDPSET		;GO PUNCH THIS BUFFER

FREDUN:	SKIPG	CDPCTR		;MORE DATA TO PUNCH?
	JRST	TRNOFF		;NO. SHUT DOWN PUNCH
	CONSZ	CDP,CI.CIP	;CARD STILL IN PUNCH
	JRST	.-1		;YES, WAIT FOR IT TO CLEAR
	JRST	CDPON		;YES. DO NEXT CARD
OVERFL:	POP	P,T1
	TROA	S,IOBKTL	;YES. ERROR
TOOBAD:	TRO	S,IODERR	;DEVICE ERROR
TRNOFF:	PUSHJ	P,SETIOD	;TAKE OUT OF IO WAIT

CDPOFF:	CONO	CDP,CO.INI	;RESET PUNCH
	HLLZS	CDPCON		;DONT LOOK AT INTERRUPTS
	TRZ	S,IOACT	;CLEAR IOACT (ION MAY BE ON)
IFN FTKI10!FTKL10,<
	PUSHJ	P,RTEVMO##
>
	JRST	STOIOS##	;AND RETURN



;HERE ON TROUBLE OR PUNCH ERROR
ERROR:	CONO	CDP,51120	;PUNCH ERROR - EJECT OFFSET
	AOS	T1,ERRCNT	;BUMP RETRY COUNT
	CAIL	T1,CDTRY	;TRIED ENOUGH?
	JRST	TOOBAD		;YES. SHUT DOWN
	MOVE	T1,CDOPTR	;NO. RESET TO TRY AGAIN
	MOVEM	T1,CDPNTR
	MOVE	T1,CDOCTR
	MOVEM	T1,CDPCTR
	JRST	CDPON		;TRY TRY AGAIN
IFN	FTCPTR,<
CDPHNG:	AOS	(P)		;SKIP RETURN SO NO HUNG MESSAGE
TRBL:	TLO	S,CDPTBL+CDPRCV	;YES, SET TROUBLE
	CONSO	CDP,470000	;SKIP IF TROUBLE CONDITION WHICH DOES
				; NOT REQUIRE RESETTING BUFFERS.
	CONSO	CDP,CI.ERR	;SKIP IF ERROR ON
	JRST	CDPHG1		;NO
	MOVE	T1,CDOPTR	;YES, RESET POINTERS FOR NEXT CARD
	MOVEM	T1,CDPNTR
	MOVE	T1,CDOCTR
	MOVEM	T1,CDPCTR
CDPHG1:	PUSHJ	P,CDPOFF	;TURN OFF CDP
	JRST	DEVERR##	;CAUSE UUOCON TO RETRY AT UUO LEVEL
>
IFE	FTCPTR,<
CDPHNG=CDPOFF
TRBL:	PUSHJ	P,CDPOFF
	JRST	DEVERR##
>

CRDPTR:	POINT	12,TBL26(T1),11
	POINT	12,TBL26(T1),23
	POINT	12,TBL26(T1),35
	POINT	12,TBL29(T1),11
	POINT	12,TBL29(T1),23
	POINT	12,TBL29(T1),35

TBL26:	BYTE	(12)	0,4006,1022	;SPACE ! "
	BYTE	(12)	1012,2102,1006	;# $ %
	BYTE	(12)	2006,12,1042	;& ' (
	BYTE	(12)	4042,2042,4000	;) * +
	BYTE	(12)	1102,2000,4102	;, - .
	BYTE	(12)	1400,1000,400	;/ 0 1
	BYTE	(12)	200,100,40	;2 3 4
	BYTE	(12)	20,10,4		;5 6 7
	BYTE	(12)	2,1,3000	;8 9 :
	BYTE	(12) 	1202, 4012, 102	;; < =
	BYTE	(12)	2012,5000,42	;> ? @
	BYTE	(12)	4400,4200,4100	;A B C
	BYTE	(12)	4040,4020,4010	;D E F
	BYTE	(12)	4004,4002,4001	;G H I
	BYTE	(12)	2400,2200,2100	;J K L
	BYTE	(12)	2040,2020,2010	;M N O
	BYTE	(12)	2004,2002,2001	;P Q R
	BYTE	(12)	1200,1100,1040	;S T U
	BYTE	(12)	1020,1010,1004	;V W X
	BYTE	(12)	1002,1001,2022	;Y Z [
	BYTE	(12)	6,4022,22	;\ ] ^
	BYTE	(12)	202,6,0		;_ (100=\)

TBL29:	BYTE	(12)	0,4006,6	;SPACE ! "
	BYTE	(12)	102,2102,1042	;# $ %
	BYTE	(12)	4000,22,4022	;& ' (
	BYTE	(12)	2022,2042,4012	;) * +
	BYTE	(12)	1102,2000,4102	;, - .
	BYTE	(12)	1400,1000,400	;/ 0 1
	BYTE	(12)	200,100,40	;2 3 4
	BYTE	(12)	20,10,4		;5 6 7
	BYTE	(12)	2,1,202		;8 9 :
	BYTE	(12)	2012,4042,12	;; < =
	BYTE	(12)	1012,1006,42	;> ? @
	BYTE	(12)	4400,4200,4100	;A B C
	BYTE	(12)	4040,4020,4010	;D E F
	BYTE	(12)	4004,4002,4001	;G H I
	BYTE	(12)	2400,2200,2100	;J K L
	BYTE	(12)	2040,2020,2010	;M N O
	BYTE	(12)	2004,2002,2001	;P Q R
	BYTE	(12)	1200,1100,1040	;S T U
	BYTE	(12)	1020,1010,1004	;V W X
	BYTE	(12)	1002,1001,4202	;Y Z [
	BYTE	(12)	1202,2202,2006	;\ ] ^
	BYTE	(12)	1022,1202,0	;_ (100=\)
WDCPTR:	POINT	5,BINBUF,17
CKSPTR:	POINT	12,BINBUF,35
BINPTR:	POINT	12,BINBUF,11
	$LOW
CDOCTR:	0
CDOPTR:	0
CDPTMP:	0
ERRCNT:	0
FRECRD:	0
FRECNT:	0
COLCNT:	0
ITMSAV:	0
DATSAV:	0
EOCOK:	0

BINBUF:	EXP	50000
BUF:	BLOCK	33
	$LIT
	END