Trailing-Edge
-
PDP-10 Archives
-
BB-F493Z-DD_1986
-
10,7/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 V105
SUBTTL T WACHS/TW/CF/GH/JE/DAL 10 SEP 85
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.
;
.CPYRT<1973,1986>
;COPYRIGHT (C) 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986
;BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
;ALL RIGHTS RESERVED.
; DATE LOAD EDIT #
; ---- ---- ------
;
;
;
;
XP VCDPSR,105
ENTRY CDPSER
CDPSER::
;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##-CP0DDB##
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
JRST CDPONL ;SEE IF NOW ON LINE
JRST ECOD2## ;SPECIAL ERROR STATUS
JRST CDPSTL ;DDB SETUP ROUTINE
JRST CDPINI ;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
TLZ S,CDPTBL ;CLEAR TROUBLE BIT
MOVEM S,DEVIOS(F) ;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 INITIALIZE
CDPINI:
IFN FTMP,<
MOVE T1,CDPTMP##(F) ;INTERLOCK COMES OUT ON 'DATA CHAN'
ADDM T1,DEVCPU##(F) ;SWITCH IT TO FLAGS CHAN
>
;HERE TO RESET DDB
CDPRST: SETZ T1, ;GET A WORD OF ZEROES
DPB T1,PBUFSZ## ;RESET SIZE TO ZERO
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
;SEE IF THE CDP IS ON-LINE
CDPONL: MOVEI U,CO.INI ;CLEAR PUNCH
XCT CDPCNO##(F)
XCT CDPOAT##(F) ;CHECK FOR TROUBLE
JRST CPOPJ1## ;CONTINUE IF READY
MOVE J,.CPJOB## ;SET FOR MSG IF NOT
POPJ P, ;OFF-LINE
;OUTPUT UUO
CDPOUT:
TLZN S,CDPTBL ;TROUBLE DETECTED ON INTERRUPT LEVEL?
JRST CDPOU1 ;NO
MOVEM S,DEVIOS(F) ;YES, SAVE S (CDPTBL OFF)
CDPSTP: MOVSI T1,DEPADV ;BIT TO TELL HNGSTP NOT TO DE-ADVANCE BUFFERS
IORM T1,DEVADV(F) ;PUT IN DEVADV (=DEVADV(F))
TLNE S,IOBEG ;UNLESS VIRGIN BUFFERS
ANDCAM T1,DEVADV(F) ;THEN LET DE-ADVANCE HAPPEN
MOVSI T1,DVOFLN
IORM T1,DEVCHR(F)
PUSHJ P,HNGSTP## ;HALT JOB AND PRINT MESSAGE
MOVSI T1,DEPADV
ANDCAM T1,DEVADV(F) ;RESET DEPADV
TLZ S,IOSTBL ; AND S
CDPOU1: TLO S,IO ;TELL THE WORLD THIS IS OUTPUT
PUSHJ P,CDPONL ;ON LINE?
JRST CDPSTP ;GO WAIT FOR "CONT" TO BE TYPED
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,DEVIOS(F) ;IOSET LOADS S
PUSHJ P,IOSET## ;SET UP J, S
MOVEI T3,44 ;ASSUME BINARY
TRNN S,10 ;IS IT?
MOVEI T3,7 ;NO, SET BYTE SIZE FOR ASCII
MOVEI U,@DEVOAD(F) ;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 CDPCCT##(F) ;START AT COLUMN 1
MOVSI T1,CDPBUF##(F)
HRRI T1,CDPBUF##+1(F)
SETZM CDPBUF##(F) ;ZERO THE BUFFER OF EXTRANEOUS DATA
BLT T1,CDPBUF##+32(F)
MOVEI T3,CDPBUF##-1(F)
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
HRRZ T2,DEVOAD(F) ;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,CDPBUF##(F),] ;ASCII POINTER IS BUF
TDNN S,[XWD CLSBIT,PCHBIT+10]
JRST PRTFUL ;NO. ASCII WITH NO LINE FEED
MOVEM T1,CDPNTR##(F) ;POINTER TO DATA IN BUF
MOVEM T1,CDPOPT##(F) ;SAVE FOR ERROR
CAILE T2,^D80 ;ONLY PUNCH 80 COLUMNS
MOVEI T2,^D80
MOVEM T2,CDPCTR##(F) ;NUMBER OF COLUMNS TO PUNCH
MOVEM T2,CDPOCT##(F) ;SAVE FOR ERROR RECOVERY
SETZM CDPECT##(F)
CDPON: MOVEI T1,5110 ;DATA OR EOC INTERRUPTS
SETZM CDPEOC##(F) ;INDICATE THAT AN EOC INTERRUPT HERE IS SPURIOUS
CONO PI,PI.OFF
HRRM T1,CDPCON##(F) ;
;(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)
MOVEI U,3340 ;START THE PUNCH, CLEAR ALL FLOPS
ADD U,CDPCH##(F) ; ENABLE ALL, SET PIA
XCT CDPCNO##(F)
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,CDPCCT##(F) ;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,CDPCCT##(F) ;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,CDPSVT##(F) ;SAVE POINTERS TO DATA
MOVEM J,CDPSVJ##(F)
MOVEI J,0 ;SET TO DROP THROUGH LOOP
NOPUN: SOSN T2,CDPCCT##(F) ;LAST CHAR SEEN IS NOT PUNCHED
MOVEI T2,1 ;ALWAYS PUNCH 1 COLUMN
JRST CPOPJ1## ;RETURN
NXTPRT: MOVE U,CDPSVT##(F) ;RESTORE POINTERS TO DATA
MOVE J,CDPSVJ##(F) ;COUNT OF DATA LEFT
JRSTF @.+1 ;LIGHT BYTE-INCREMENT-SUPPRESSION FLAG
XWD 24000,NXTSET ;AND GO PUNCH NEXT CARD
PRTFUL: MOVEM T3,CDPSVT##(F)
TLO S,FILPRT
JRST BUFADV
;CONTINUE IN SAME MONITOR BUFFER
NXTCON: MOVE T3,CDPSVT##(F) ;POINTER TO LAST CHAR STORED
JRST TEMSET ;GO FILL REST
;SET UP TO PUNCH A FREE CARD
SETFRE: MOVEM T1,CDPFCD##(F) ;WHAT TO PUNCH
MOVEI T1,^D80 ;PUNCH 80 COLS.
MOVEM T1,CDPFCT##(F) ;(EJECT ON 81ST DATA REQ)
POPJ P,
;INTERRUPT PROCESSING SECTION
CDPINT::
XCT CDPXST##(F) ;STORE CONI STATUS IN DDB
MOVEM U,CDPTMP##(F) ;SAVE U
XCT CDPZTE##(F) ;EOC OR TROUBLE?
JRST NOTDAT ;NON-DATA INTERRUPT
XCT CDPZPE##(F) ;NO, PUNCH ERROR?
JRST LACE ;YES, LACE REST OF CARD
SKIPE CDPFCD##(F) ;DATA REQUEST. PUNCHING A FREE CARD?
JRST FREINT ;YES. PUNCH IT
SOSGE CDPCTR##(F) ;ANY DATA TO PUNCH?
JRST CRDUN ;NO. THROUGH WITH CARD
ILDB U,CDPNTR##(F) ;NEXT BYTE TO PUNCH
XCT CDPDOU##(F) ;GIVE IT TO PUNCH
INTXIT: SETOM CDPEOC##(F) ;ANY EOC INTERRUPT AFTER THIS IS LEGAL
INTXI1: MOVE U,CDPTMP##(F) ;RESTORE U
JRST CDPEX1##(F) ;AND DISMISS INTERRUPT
;HERE WHEN ALL DATA FOR A CARD IS PUNCHED
CRDUN: MOVEI U,10020 ;EJECT A CARD
SETOM CDPEOC##(F) ;ANY EOC INTERRUPT AFTER THIS IS LEGAL
JRST CRDUNX
;HERE FOR A DATA REQUEST WHILE PUNCHING A FREE CARD
FREINT: SOSGE CDPFCT##(F) ;PUNCHED 80 COLS.
JRST CRDUN ;YES, EJECT
XCT CDPDFC##(F) ;NO, PUNCH A COLUMN
JRST INTXIT ;EOC INTERRUPT IS LEGAL, DISMISS THE INTERRUPT
LACE: SKIPE CDP10D##(F) ;IS THIS A CP10D?
JRST NOTDAT ;YES, CARD IS AUTOMATICALLY REJECTED
XCT CDPDSV##(F) ;NO, LACE REST OF CARD
JRST CDPEX1##(F)
;HERE ON A NON DATA-REQUEST INTERRUPT
NOTDAT: CONO PI,PI.OFF ;TURN OFF PI FOR SAFETY'S SAKE
MOVEI U,2220 ;SWITCH CDP TO LOW PI LEVEL
CRDUNX: ADD U,CPFCH##(F) ;PIA
XCT CDPCNO##(F)
HLLZS CDPCON##(F) ;FOR END-OF-CARD PROCESSING
MOVEI U,5100 ;ENABLE FOR ALL BUT DATA REQUEST
HRRM U,CPFCON##(F)
CONO PI,PI.ON ;RESTORE PI SYSTEM
JRST INTXI1 ; AND GO AWAY
;INTERRUPT HERE ON LOWER LEVEL PI REQUEST
CPFINT::
XCT CDPXST##(F)
HLLZS CPFCON##(F) ;YES, WE WONT WANT THIS PI INTRPT AGAIN
MOVE S,DEVIOS(F) ;SET S
LDB J,PJOBN##
XCT CDPZTB##(F) ;TROUBLE?
JRST TRBL ;YES
XCT CDPZER##(F) ;ERROR?
JRST ERROR ;YES. TOO BAD
;HERE ON AN END OF CARD INTERRUPT
SKIPN CDPEOC##(F) ;SPURIOUS END-OF-CARD INTERRUPT?
JRST CDPON ;YES. CLEAR EOC AND TRY AGAIN
AOS CDPCNT##(F) ;COUNT THE CARDS
;AND FALL INTO CRDUN1
;HERE ON EOC INTERRUPT
XCT CDPZTB##(F) ;PUNCH ERROR?
JRST ERROR ;YES. TOUGH
MOVEI U,10020
XCT CDPZCP##(F) ;CARD IN PUNCH?
XCT CDPCNO##(F) ;YES, EJECT IT
SEVENS::SETZ T1,1414
EXCH T1,CDPFCD##(F) ;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##(F) ;MORE DATA TO PUNCH?
JRST TRNOFF ;NO. SHUT DOWN PUNCH
XCT CDPZCP##(F) ;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: MOVEI U,CO.INI ;RESET PUNCH
XCT CDPCNO##(F)
HLLZS CDPCON##(F) ;DONT LOOK AT INTERRUPTS
TRZ S,IOACT ;CLEAR IOACT (ION MAY BE ON)
PUSHJ P,RTEVMO##
JRST STOIOS## ;AND RETURN
;HERE ON TROUBLE OR PUNCH ERROR
ERROR: MOVEI U,51120 ;PUNCH ERROR - EJECT OFFSET
XCT CDPCNO##(F)
AOS T1,CDPECT##(F) ;BUMP RETRY COUNT
CAIL T1,CDTRY ;TRIED ENOUGH?
JRST TOOBAD ;YES. SHUT DOWN
MOVE T1,CDPOPT##(F) ;NO. RESET TO TRY AGAIN
MOVEM T1,CDPNTR##(F)
MOVE T1,CDPOCT##(F)
MOVEM T1,CDPCTR##(F)
JRST CDPON ;TRY TRY AGAIN
CDPHNG: AOS (P) ;SKIP RETURN SO NO HUNG MESSAGE
TRBL: TLO S,CDPTBL+CDPRCV ;YES, SET TROUBLE
XCT CDPOTN##(F) ;SKIP IF TROUBLE CONDITION WHICH DOES
; NOT REQUIRE RESETTING BUFFERS.
XCT CDPOER##(F) ;SKIP IF ERROR ON
JRST CDPHG1 ;NO
MOVE T1,CDPOPT##(F) ;YES, RESET POINTERS FOR NEXT CARD
MOVEM T1,CDPNTR##(F)
MOVE T1,CDPOCT##(F)
MOVEM T1,CDPCTR##(F)
CDPHG1: PUSHJ P,CDPOFF ;TURN OFF CDP
JRST DEVERR## ;CAUSE UUOCON TO RETRY AT UUO LEVEL
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,CDPBNB##(F),17
CKSPTR: POINT 12,CDPBNB##(F),35
BINPTR: POINT 12,CDPBNB##(F),11
$LIT
END