|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 17314 (0x43a2)
Notes: pts_type(SC)
Names: »DRCR01.SC«
└─⟦110b7ed5e⟧ Bits:30009664 Philips computer tape "600106"
└─⟦this⟧ »TOSSWORK/DRCR01.SC«
IDENT DRCR01 REL 9.2 79-11-16 870105040920
=1, INTERFACE UNKNOWN HANG-UP
REL 9.1 79-05-23
*
*
************************************************************
*
* PHILIPS TERMINAL SYSTEM PTS
*
* DRCR01 = DRIVER CARD READER
*
*
*
*
*
************************************************************
*
*
* THIS DRIVER HANDLES ONE CARD READER PTS 6885 CONNECTED
* TO CPU VIA CHCD ON PROGRAMMED OR MULTIPLEX CHANNEL
*
*
************************************************************
EJECT DRCR01
*****************
* ENTRIES *
*****************
ENTRY CRADR ADDRESS TABLE
ENTRY ACCR ACTIVATION PART
ENTRY CRON RECOVERY ROUTINE
ENTRY IHCR INTERRUPT HANDLER
ENTRY DWCR01 DWT FOR CARD READER
**************************************
* EXTERNAL TOSS MODULE ENTRIES *
**************************************
EXTRN TDISP DISPATCHER
EXTRN SAVE8 SAVE 8 REGISTERS ON A15-STACK
EXTRN RETUR8 LOAD 8 REGISTErS FROM A15-STACK
EXTRN TENDIO END I/O
EXTRN DISIOE REQUEST ERROR
EXTRN INTSAV SAVE AREA, LAST INTERRUPT
EXTRN DWTST STATUS
EXTRN DWTECB ECB ADDRESS
EXTRN DWTA2 SAVE AREA A2
EXTRN DWTA4 SAVE AREA A4
EXTRN DWTA5 SAVE AREA A5
*******************
* CONSTANTS *
*******************
DEVICE EQU /0D
MUX EQU DEVICE+DEVICE
REQLEN EQU 4
BUFFER EQU 2
EFFLEN EQU 6
EJECT DRCR01
*
**************************
* CONDITIONAL ASSEMBLY *
**************************
* PROGRAMMED CHANNEL MAY BE USED INSTEAD
* OF MULTIPLEX CHANNEL BY SETTING X:A=1
*
X:A EQU 0
CHAN EQU X:A
*
*
* MMU BUFFER SIZE
*
X:B EQU 40
DVBLEN EQU X:B
*
*
* MMU DEVICE INDEX
*
DEVIND EQU 2 CARD READER DEVICE INDEX
*
*
* A PROGRAM VERSION USING TOSS MMU PAGING
* IS OBTAINED BY SETTING MMUPAG EQU 1.
*
MMUPAG EQU 0
*
*
* A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
* SET IS OBTAINED BY SETTING CPU852 EQU 0.
*
CPU852 EQU 1
*
EJECT DRCR01 DRCR01
STATUS
********************
-HARDWARE:
BIT 10: INPUT HOPPER EMPTY OR OUTPUT
STACKER FULL
14: THROUGHPUT ERROR
15: NOT OPERABLE
-SOFTWARE:
BIT 0: REQUEST ERROR
3: :EOF DETECTED
12: INCORRECT LENGTH
13: DATA FAULT
ORDER
********************
/02 STANDARD READ
-THE CARDS ARE READ IN HOLLERITH CODE, ON 12 BITS,
CONVERTED INTO ASCII CODE ON 8 BITS, AND STORED
UNTIL REQUESTED LENGTH IS REACHED
EJECT DRCR01
***********************
*NORMAL REGISTER USAGE*
***********************
A1=RETURN CODE
A2=WORK REGISTER
A3=WORK REGISTER
A4=BUFFER ADDRESS
A5=STACK BASE
A6=DWT-ADDRESS
A7=ORDER
A8=ECB-ADDRESS
*****************************************************
* NOTE! IN COMMENTS, THE FOLLOWING NOTATION IS USED *
* CARD COLUMNES: 1,2,3,4.......80 *
* CARD ROWS : 12,11,0,1,2,3.....9 *
*****************************************************
* ADDRESS TABLE
* *************
DATA DVBLEN+DVBLEN MMU BUFFER LENGTH
DATA DEVIND MMU DEVICE INDEX
CRADR DATA ACCR
DATA 0 ABORT ROUTINE ADDRESS
IFT CHAN=0
*
**********
* BUFFER *
**********
MUXBUF EQU *
RES 80
XIF
EJECT DRCR01
*************************
* *
* ACTIVATION PART *
* *
*************************
ACCR EQU *
SUK A7,2 ORDER 2?
RF(Z) ORDER2 YES!
ABL DISIOE NO! REQEST ERROR
ORDER2 LD A3,REQLEN,A8
CWK A3,80
RF(NG) AC.1
LDK A1,8 REQ. LENGTH IS TOO LONG!
RF ENDIO SET "INCORRECT LENGTH" BIT 12
AC.1 EQU *
CM STATUS,A6
CM FLAG RESET RECOVERY INDICATOR
CF A5,READ READ ONE CARD
ANKL A1,/FFF7 RESET "INCORRECT LENGTH" BIT 12
OR A1,STATUS,A6
ENDIO CF A15,TENDIO END REQUEST
EXIT ABL TDISP
EJECT DRCR01
******************************
* SUBROUTIN TO READ ONE CARD *
******************************
READ EQU *
ST A5,DWTA5,A6 SAVE A5
LD A4,BUFFER,A8
SUK A4,1
ST A4,DWTA4,A6 SAVE BUFFER ADDRESS - 1
LDK A2,1
ST A2,DWTA2,A6 SAVE "COLUMN TO BE EXAMINED"
IFT CHAN=0
LDKL A4,/8050 DEFINE CONDITIONS
WER A4,MUX
LDKL A4,MUXBUF DEFINE BUFFER ADDRESS
WER A4,MUX+1
XIF
CIO A3,1,DEVICE CIO START
RB(Z) EXIT ACCEPTED =1
LDK A1,1 ERROR
RB ENDIO
********************
* RECOVERY ROUTINE *
********************
CRON EQU *
IFT CPU852=1
CF A15,SAVE8 SAVE A1-A8 ON STACK
XIF
*
IFT CPU852=0
MSR 8,A15 SAVE A1-A8 ON STACK
XIF
*
LDKL A6,DWCR01 DWT ADDRESS
LD A3,DWTST,A6 REQUEST ON?
RB(N) EXIT NO!
LDK A1,2 SET "THROUGHPUT ERROR" BIT 14
IFT CHAN=0
IM FLAG INDICATE RECOVERY
XIF
RB ENDIO
EJECT DRCR01
*********************
* INTERRUPT HANDLER *
*********************
IHCR EQU *
ST P,INTSAVE SAVE LAST INTERRUPT
IFT CPU852=1
CF A15,SAVE8 SAVE A1-A8 ON STACK
XIF
*
IFT CPU852=0
MSR 8,A15 SAVE A1-A8 ON STACK
XIF
*
LDKL A6,DWCR01 DWT ADDRESS
LD A2,DWTA2,A6 CARD-COLUMN
LD A8,DWTECB,A6 ECB ADDRESS
IFT CHAN=1
INR A3,0,DEVICE LD A3 WITH CHARACTER FROM CARD READER
RF(A) CONV
XIF
IFT CHAN=0
LDKL A5,MUXBUF GET BUFFERADDRESS AND START CONVERSION
ENB
IHCR10 EQU *
LDR* A3,A5 GET WORD FROM BUFFER
ADK A5,2
RF CONV CONVERT
IHCR20 EQU *
* READY *
XIF
SST A1,DEVICE NOT ACCEPTED
LD A5,DWTA5,A6
RTN A5
EJECT DRCR01
*******************
* CODE CONVERSION *
*******************
A3=RECIEVED CHARACTER IN HOLERITH-CODE
A2=COLUMN TO BE EXAMINED
A4=BUFFER ADDRESS - 1
CONV LDK A1,0
SLL A3,4 SKIP INSIGNIFICANT BITS
RF(N) FIRST
RF(P) SCAN1
LDK A3,/20 CHARACTER IS A SPACE
CW A2,REQLEN,A8 BUFFER FILLED?
ABL(NG) PUTCHA NO!
ABL TEST
*
HOLE1 DATA 0
HOLE2 DATA 0
EJECT DRCR01
*=======================================================================
0NE HOLE
SCAN1 ADK A1,1 SCAN FOR THE FIRST HOLE
SLL A3,1
RB(P) SCAN1
FIRST CW A2,REQLEN,A8 BUFFER FILLED?
RF(NG) IH.1 NO!
LDK A3,8 YES! SET "INCORRECT LENGTH" BIT 12
ORS A3,STATUS,A6
ABL READY
IH.1 ST A2,EFFLEN,A8 STORE EFFECTIV LENGTH
ANKL A3,/7FFF
RF(NZ) SCAN2 THE ONLY HOLE IN THIS COLUMN?
SUK A1,1 YES!
CONVERSION IS MADE DIRECTLY
***************************
RF(P) *+12
RF(Z) *+6
LDK A3,/26 & (ROW 12)
RF PUTCHA
LDK A3,/2D - (ROW 11)
RF PUTCHA
LDR A3,A1
ADK A3,/2F DIGIT 0 - 9 (ROW 0 - 9)
RF PUTCHA
ONE HOLE
*=======================================================================
TWO HOLES
EJECT DRCR01
SCAN2 ST A1,HOLE1 SAVE FIRST HOLE POSITION
ADK A1,1 SCAN FOR SECOND HOLE
SLL A3,1
RB(P) *-4
ST A1,HOLE2 2:ND HOLE FOUND! SAVE POSITION
ANKL A3,/7FFF LAST HOLE IN THIS COLUMN?
RF(P) SCAN3 NO!
LD A1,HOLE1 YES!
CWK A1,3
RF(NL) SPEC SPECIAL CHARACTER?
ADR A1,A1 NO! LETTER OR /
LD A1,TABLE1,A1 CHOOSE TABLE
LD A3,HOLE2
SUK A3,3
RF(N) FAULT DATA FAULT?
ADR A1,A3 NO!
LCR A3,A1 CHOOSE LETTER IN TABLE
RF PUTCHA
EJECT DRCR01
* CONVERSION TABLE 1 ASCII /41 - 5A, 2F
*************************************
TABLE1 DATA TAB.1
DATA TAB.2
DATA TAB.3
ROWS ON CARD
------------
TAB.1 DATA 'ABCDEFGHI ' 12,1 - 12,9
TAB.2 DATA 'JKLMNOPQR ' 11,1 - 11,9
TAB.3 DATA '/STUVWXYZ ' 0,1 - 0,9
*************************************
EJECT DRCR01
SPEC RF(E) FAULT DATA FAULT?
-THE FIRST HOLE MUST NOT BE IN ROW 1!
SUK A1,4 NO!
CWK A1,5 A1=FIRST HOLE
RF(G) FAULT DATA FAULT?
-THE FIRST HOLE MUST NOT BE IN ROW 8!
LD A3,HOLE2
SUK A3,10
RF(NZ) FAULT DATA FAULT?
-THE SECOND HOLE MUST BE IN ROW 8!
LC A3,TABLE2,A1 CHOOSE CHARACTER IN TABLE2
RF PUTCHA
CONVERSION TABLE 2
*************************************
ROWS ON CARD
------------
TABLE2 DATA ':#' 2,8 3,8
DATA /4027 4,8 5,8
DATA '="' 6,8 7,8
*************************************
TWO HOLES
*=======================================================================
THREE HOLES
EJECT DRCR01
*
SCAN3 LD A1,HOLE1
SUK A1,2
RF(P) FAULT DATA FAULT?
-THE FIRST HOLE MUST BE WITHIN THE FIRST
THREE ROWS (12, 11, 0)
LD A1,HOLE2
SUK A1,4
RF(N) FAULT DATA FAULT?
SUK A1,5
RF(P) FAULT
-THE 2:ND HOLE MUST BE WITHIN ROW 2 TO 7!
ADK A1,9
ADK A1,1 SCAN FOR THE 3:RD HOLE
SLL A3,1
RB(P) *-4
SUK A1,10 3:RD HOLE FOUND!
RF(NZ) FAULT DATA FAULT?
-THE 3:RD HOLE MUST BE IN ROW 8
SLL A3,1
RF(NZ) FAULT DATA FAULT?
-NO MORE THEN 3 HOLES!
LD A3,HOLE1
ADR A3,A3
LD A3,TABLE3,A3 CHOOSE TABLE
AD A3,HOLE2
SUK A3,4
LCR A1,A3
LDR A3,A1
RF PUTCHA
EJECT DRCR01
*
*
CONVERSION TABLE 3
*************************************
TABLE3 DATA TAB.4
DATA TAB.5
DATA TAB.6
ROWS ON CARD
-------------------
TAB.4 DATA '[.' 12,2,8 12,3,8
DATA '<(' 12,4,8 12,5,8
DATA /2B5E 12,6,8 12,7,8
TAB.5 DATA '!$' 11,2,8 11,3,8
DATA '*)' 11,4,8 11,5,8
DATA ';]' 11,6,8 11,7,8
TAB.6 DATA /5C2C 0,2,8 0,3,8
DATA /255F 0,4,8 0,5,8
DATA '>?' 0,6,8 0,7,8
*************************************
THREE HOLES
*=======================================================================
EJECT DRCR01
SET DATA FAULT
**************
FAULT EQU *
LDK A1,4 SET DATA FAULT,BIT 13, IN STATUS
ST A1,STATUS,A6
LDK A3,/3F REPLACE CHARACTER BY "?"
PUT CHARACTER (ASCII) IN USER BUFFER
************************************
PUTCHA EQU *
IFT CHAN=0
LD A4,FLAG
RF(NZ) NEXT10 RECOVERY HAS BEEN PERFORMED!
XIF
LD A4,DWTA4,A6 A2=COLUMN TO BE EXAMINED
ADR A4,A2 A3=ASCII CHARACTER
SCR A3,A4 A4=BUFFER ADDRESS - 1
TEST CWK A2,80 THE WHOLE CARD SCANNED?
RF(L) NEXT NO!
IFT CHAN=1
READY CIO A3,0,DEVICE CIO HALT
XIF
IFT CHAN=0
READY EQU *
XIF
LDK A2,4 CHECK IF :EOF
CW A2,EFFLEN,A8
RF(NE) NEXT00 EFF.LENGTH #4
LD A4,DWTA4,A6 GET BUFFER-ADDRESS
ADK A4,1
LDR* A2,A4 GET FIRST WORD IN BUFFER
CWK A2,':E' A2 = :E ?
RF(NE) NEXT00 NO!
LD A2,2,A4 YES, GET NEXT WORD
CWK A2,'OF' A2 = OF ?
RF(NE) NEXT00 NO!
LDKL A2,/1000 YES! :EOF DETECTED
ORS A2,STATUS,A6 SET BIT 3 IN R.C.
EJECT DRCR01
NEXT00 EQU *
IFT CHAN=1
NEXT ADK A2,1
ST A2,DWTA2,A6 SAVE A2
XIF
IFT CHAN=0
ABL IHCR20 READY
NEXT EQU *
ADK A2,1
ST A2,DWTA2,A6
ABL IHCR10 TAKE NEXT CHARACTER
NEXT10 EQU *
XIF
ABL RETUR8 LOAD A1 - A8 AND RETURN A15
EJECT DRCR01
*************************************
* DEVICE WORK TABLE FOR CARD READER *
*************************************
DWCR01 EQU *
DATA 0 CHANNEL PARAMETER
DATA /8000 STATUS
DATA 0 ECB ADDRESS
DATA 0 LAST OUTPUT, ORDER
DATA CRADR POINTER TO DEVICE DRIVER
DATA 0 POINTER TO TTAB
DATA 0 WAIT/ACTIVATE INDICATOR
DATA 0 TERMINAL QUEUE
IFT MMUPAG=1
DATA 0 SAVE AREA USER ECB ADDRESS
DATA DEVECB MMU ECB ADDRESS
XIF
DATA 0 OUTPUT QUEUE LINK
DATA 0 SAVEAREA FOR A2
DATA 0 SAVEAREA FOR A4
DATA 0 SAVEAREA FOR A5
RES 4 DWT STACK
STATUS EQU *-DWCR01
DATA 0 SOFTWARE STATUS SAVEAREA
FLAG DATA 0 RECOVERY INDICATOR
*
IFT MMUPAG=1
DEVECB EQU *
DATA 0
DATA CR:BUF
DATA 0,0,0,0
CR:BUF RES DVBLEN+1
XIF
*
END