|
|
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: 17460 (0x4434)
Notes: pts_type(SC)
Names: »DROD01.SC«
└─⟦efe3a1cfc⟧ Bits:30009667 Philips computer tape "600113"
└─⟦this⟧ »TOSSWORK/DROD01.SC«
IDENT DROD01 REL 8.2 78-09-15 870106340821
*
*******************************************
*
* PHILIPS TERMINAL SYSTEM PTS
*
* DROR01 = DRIVER OPTICAL CHARACTER READER
*
*
*
*
*
*
*******************************************
*
*
* THIS DRIVER HANDLES INPUT FROM OCR
* CONNECTED TO CPU VIA CHLT OR CHRT.
*
* ONLY INPUT DATA FROM OCR
* ARE HANDLED BY THE DRIVER.
*
*
* THE DRIVER CONSISTS OF FOLLOWING PARTS:
*
* A C O D : ACTIVATION PART
*
* I H O D : INTERRUPT HANDLER
*
* R C O D : RECOVERY ROUTINE
*
EJECT
*
*
* THE FOLLOWING ORDERS ARE THREATED:
*
* ORDER 02: READ DOCUMENT
* ORDER 04: RESET INPUT BUFFER
*
*
* NORMAL REGISTER USAGE :
*
* REGISTER A1 : RETURN CODE
* A2 : INPUT CHARACTER
* A3 : BUFFER INDEX
* A4 : WORK REGISTER
* A5 : STACK BASE
* A6 : DWT-ADDRESS
* A7 : ORDER
* A8 : ECB-ADDRESS
*
*
*
* SYSTEM ADAPTATION
*
* THE LENGTH OF THE CIRCULAR INPUT BUFFER IS
* DEFINED IN DWT. STANDARD VALUE IS 80 CHARACTERS
* NOTE !!! THAT LENGTH MUST BE THE SAME FOR ALL
* DWT:S IN SYSTEM
*
* IF TIMING IS WANTED, TIMER POINTER
* IN DWT MUST BE SET UNEQUAL TO ZERO.
* STANDARD VALUE FOR TIME-OUT IS 30 SECONDS
* SINCE LAST CHARACTER. IF ANOTHER VALUE
* IS WANTED FOR A SYSTEM, INDICATOR
* IN DRIVER MUST BE CHANGED.
*
EJECT
*
* BY MEANS OF CONDITIONAL ASSEMBLY IT IS POSSIBLE
* TO EXCLUDE FROM THE DRIVER FOLLOWING FUNCTIONS:
*
* -----POWER ON INDICATION
* -----TIME-OUT-FUNCTION
*
* ENTRIES
*
*
ENTRY ODAD ADDRESS-BLOCK
*
*
*
* EXTERNAL TOSS MODULE ENTRIES
*
*
*
EXTRN DISIOE I/O REQUEST ERROR
EXTRN DISEND END I/O AND GO TO DISPATCHER
EXTRN TENDIO END I/O
EXTRN TDISP DISPATCHER ENTRY
EXTRN LDREG LOAD REGISTERS A2-A8 AND RETURN
EXTRN STREG STORE REGISTERS AND GO TO DISPATCER
EXTRN LDREGE RETURN FROM ECHOE HANDLING
EXTRN LDREGF PANIK EXTERN
EXTRN SETIME SET TIME
EXTRN SETIMP SET TIME
EXTRN SAVE8 SAVE 8 REGISTERS
EXTRN ECHRTN RETURN FROM ECHO
EXTRN ECHO ECHO ROUTINE
EXTRN ECHEND END OF ECHOING
*
*
EJECT
*
* DWT PARAMETERS
*
*
*
EXTRN DWTCHP CHANEL PARAMETER
EXTRN DWTST STATUS
EXTRN DWTADR ADDRESS TO ADDRESS-BLOCK
EXTRN DWTWAT SAVE INPUT DWT
EJECT
*
*
*
* CONSTANTS
*
*
*
OVMASK EQU /2 OVERFLOW IN INPUT BUFFER
*
X:B EQU 80 LENGTH OF CIRCULAR INPUT BUFFER
DWTLNG EQU X:B NUMBER OF BYTES IN DECIMAL FORM
ETX EQU /03 END CHARACTER
*
* TIME BEFORE TIME-OUT
*
TIME EQU 300 TIME OUT CONSTANT
*
*
*
*
EJECT
*
*
* DWT-DISPLACEMENT
*
*
*
DWTBC EQU /3
DWTCON EQU /10 CONVERSION TABLE
DWTA3 EQU /12 SAVE AREA FOR A3
DWTA4 EQU /14 SAVE AREA FOR A4
DWTA5 EQU /16 SAVE AREA FOR A5
DWTSB2 EQU /1E STACK BASE
DWTTP EQU /20 TIMER POINTER
DWTECH EQU /22 ECHO DEVICE
DWTLRC EQU /26 LRC-ACKUMULATOR
DWTINQ EQU /28 POINTER TO FIRST PLACE IN QUEUE
DWTUTQ EQU /2A POINTER TO LAST PLACE IN QUEUE
DWTSQ EQU /2C START TO QUEUE
DWTEQ EQU DWTSQ+DWTLNG END OF QUEUE
*
*
EJECT
*
********************
* ECB-DISPLACEMENT *
********************
*
ECBBA EQU 2 BUFFER ADDRESS
ECBRL EQU 4 REQUESTED LENGTH
ECBEL EQU 6 EFFECTIVE LENGTH
ECBRC EQU 8 RETURN CODE
ECBCW EQU 10 CONTROL WORD
EJECT
*
*
****************************************
* CONDITIONAL ASSEMBLY *
****************************************
*
*
* BY SETTING X:A = 1 THE FOLOWING POWER OFF FUNCTION
* IS INCLUDED IN THE DRIVER.
* IF THERE IS A READ REQUEST THIS IS COMPLETED WITH
* -2 IN THE CONTROL WORD OF ECB.
* IF THERE IS NO READ REQUEST , THE FIRST READ REQUEST
* AFTER POWER ON IS COMPLETED WITH -2 IN CONTROL WORD
* OF ECB
*
*
X:A EQU 0
POWOFF EQU X:A
*
*
* TIME OUT FUNCTION MAY BE EXCLUDED BY
* SETTING X:A = 0.
*
X:C EQU 1
CTIMUT EQU X:C
*
*
* THIS DRIVER CAN BE MADE TO HANDLE CREDIT ORDERS
* BY SETTING CREDIT = 1
* ORDER /04 IS THEN REPLACED BY ORDER /31
* CONTROL WORD OF ECB IS SET TO ZERO INSTEAD OF-2
* ORDER /04 IS THEN REPLACED BY ORDER /31
CREDIT EQU 0
*
*
EJECT
**************
* TABLES *
**************
*
ODAD EQU *
DATA ACOD ACTIVATION DRIVER
DATA IHOD INTERRUPT HANDLER
*
IFF POWOFF=1
*
DATA 0 NO RECOVERY
*
XIF
*
*
IFT POWOFF=1
*
DATA RCOD RECOVERY ROUTINE
EJECT
*
*
* R C O D
*
* THIS IS THE RECOVERY ROUTINE FOR OCR
* ENTERED FROM CHLT/CHRT DRIVER
*
RCOD EQU *
INH
CF A15,SAVE8
LDKL A1,/200
ORS A1,DWTST,A6 INDICATE POWER OFF OCCURED
LD A3,DWTST,A6 I/O-REQUEST
RF(N) RCOD05 NO
LD A4,DWTTP,A6 TIME EQUAL 0
RF(Z) RCOD05 YES
CM* DWTTP,A6 RESET TIME
CM DWTTP,A6 RESET TIMER
RCOD05 EQU *
LDK A1,1
ORS A1,DWTST,A6 RECOVERY FLAG
RCOD10 EQU *
LDK A4,DWTTP
ADR A4,A6
LDR A1,A6
CF A15,SETIMP
DATA RCTUT,/A
ST A4,DWTTP,A6
RF RCTDIS DISPATCH
RCTUT EQU *
INH
IFT POWOFF=1
LDR A6,A1
RCTUT5 EQU *
CM DWTTP,A6
GET DWT-ADDRESS
LD A8,4,A6 GET ECB-ADDRESS
RF(Z) RCTUT6 SYSTEM START SKIP BUFFER
INH
XIF
IFT CREDIT-POWOFF=-1
LDKL A1,-2 INDICATE POWER ON
ST A1,ECBCW,A8
XIF
IFT CREDIT+POWOFF=2
CM 10,A8 INDICATE POWER ON
XIF
IFT POWOFF=1
RCTUT6 EQU *
ENB
ENB
LDKL A1,/FFFE RESET RECOVERY
ANS A1,DWTST,A6
LDK A1,0
LD A2,DWTINQ,A6
SCR A1,A2
ST A2,DWTUTQ,A6
LD A3,DWTST,A6
RF(NN) RCEND
RCTDIS EQU *
ABL TDISP
RCEND EQU *
LDKL A4,/FDFF
ANS A4,DWTST,A6 RESET POWER OFF
ABL DISEND
XIF
*
EJECT
*
*
* A C O D
*
* ACTIVATION PART:
*
* CHECKS VALIDITY OF ORDERS AND EXAMINES
* INPUT BUFFER TO SEE IF SOME QUEUED
* TO THREAT.
*
*
ACOD EQU *
LDK A1,0
LDK A3,0 START BUFFER INDEX
ST A3,DWTLRC,A6 CLEAR LRC-ACKUMULATOR
LDR A4,A7
SUK A4,4
IFT CREDIT=1
SUK A4,/2D
RF(Z) CRE:10 SKIP INPUT BUFFER
ADK A4,/2D
CRE:10 EQU *
XIF
RF(Z) AOD110 ORDER 4
RF(N) AOD200 ORDER 2
AOD100 ORKL A1,/8000 I/O REQUEST ERROR
AOD105 EQU *
ABL ENDI10
EJECT
*
*
* ORDER 4 RESET INPUT BUFFER
*
AOD110 LD A2,DWTINQ,A6 ORDER 4
SCR A1,A2 RESET OVERFLOW IF OCCURED
ST A2,DWTUTQ,A6 RESET OUTPUT QUEUE
ABL ENDIO END I/O
EJECT
*
*
*
*
AOD200 EQU *
*
IFT POWOFF=1
*
LD A2,DWTST,A6
ANKL A2,/200 POWER OFF ?
RF(E) AOD205
XRS A2,DWTST,A6 RESET BIT
XIF
AOD202 EQU *
IFT CREDIT-POWOFF=-1
LDKL A1,-2 INDICATE POWER ON
ST A1,ECBCW,A8
XIF
IFT CREDIT+POWOFF=2
CM 10,A8 INDICATE POWER ON
XIF
IFT POWOFF=1
ABL AOD380
*
XIF
*
AOD205 EQU *
*
IFT CTIMUT=1
*
LDR* A1,A6
ANK A1,/40 TIMING ?
RF(E) AOD210 NO TIMING FOR THIS DEVICE
LD A4,DWTTP,A6
RF(E) AODTIM
RF AOD210
AODTIM EQU *
LDK A4,DWTTP TIMER POINTER
ADR A4,A6 ADD DWT-ADDRESS
LDR A1,A6
CF A15,SETIMP SET TIME
DATA AODTUT,TIME TIME OUT ROUTINE AND TIME
ST A4,DWTTP,A6 STORE TIMER ADDRESS IN DWT
*
XIF
*
EJECT
*
*
AOD210 EQU *
LD A2,ECBRL,A8 REQUESTED LENGTH=0
AOD220 RF(E) AOD380
LDR A3,A3 FIRTST RIME?
RF(NE) AOD240 N0!
LD A1,ECBBA,A8 BUFFER ADDRESS
SUK A1,1
ADR A1,A2
AOD230 SCR A3,A1 CLEAR ECB BUFFER
SUK A1,1
SUK A2,1
RB(NE) AOD230
AOD240 EQU *
LD A1,DWTUTQ,A6
LCR A2,A1
LDR A4,A2
XRK A4,/FF OVERFLOW?
RF(NE) AOD250 N0!
SCR A4,A1 YES!
LDK A1,OVMASK OVERFLOW SET
RF ENDIO END I/O
AOD250 CW A1,DWTINQ,A6 SOMETHING IN QUEUE?
RF(NE) AOD260
CF A5,STREG NOTHING IN QUEUE
IFT CTIMUT=1
LDR A1,A1 CHECK TIME OUT RETURN CODE
RF(Z) AOD270 NO TIME-OUT
RF ENDI05 END I/O AT TIME OUT
XIF
IFT CTIMUT=0
RF AOD270
XIF
AOD260 CF A15,EOQUEU NEXT OUT POINTER
ST A1,DWTUTQ,A6 STORE NEW POINTER
AOD270 EQU *
LDR A4,A7
SUK A4,2
RF(NN) AOD310 ORDER 2
RB AOD100 I/O REQUEST ERROR
EJECT
*
*
*
* ORDER 2 READ DOCUMENT
*
*
*
*
*
AOD310 EQU *
LDR A3,A3 FIRST CHARACTER
RF(N) AOD400 NO:LRC-CHARACTER
AOD320 EQU *
LDK A4,/40
TM A4,A2 CHECK IF END CHARACTER
RF(Z) AOD330 NO
ST A3,ECBEL,A8 STORE EFFECTIVE LENGTH IN ECB
NGR A3,A3 NEGATE REGISTER
RF AOD340
AOD330 EQU *
CWK A2,/3F REJECTED CHARACTER
RF(NE) AOD331 NO
LDKL A1,/1000 INDICATE REJECTED CHARACTER
ORS A1,ECBRC,A8 STORE IN ECB-RETURN CODE
AOD331 EQU *
CWK A2,/21 DIRECTION REJECTED
RF(NE) AOD332 NO
LDK A1,/10 INDICATE DIRECTION ERROR
RF ENDIO
AOD332 EQU *
CWK A2,/1C QUADRATURE REJECTED?
RF(NE) AOD333 NO
LDKL A1,/800 INDICATE QUADRATURE ERROR
RF ENDIO
AOD333 EQU *
CW A3,ECBRL,A8 REQ.LENGTH=EFF.LENGTH
RF(NL) AOD360 YES
LD A1,ECBCW,A8 KEY TABLE ADDRESS
RF(Z) AOD340 NO KEYTABLE
LCR A4,A1 TABLE LENGTH IN A4
ANK A4,/FF
ADR A1,A4 LAST PLACE IN KEY TABLE
ADK A1,1
AOD335 EQU *
SUK A4,1
RF(N) AOD340 KEY NOT FOUND
SUK A1,1 NEXT KEY
CCR A2,A1 FOUND?
RB(NE) AOD335
XRS A2,DWTLRC,A6 UPDATE LRC ACKUMULATOR
RB AOD240
AOD340 EQU *
XRS A2,DWTLRC,A6 UPDATE LRC-ACKUMULATOR
CF A15,CDCHK CODE CHECK IF LESS /1F SET BIT 7
LDR A3,A3
RF(N) AOD345
CF A15,STORE STORE IN ECB-BUFFER
AOD345 EQU *
RB AOD240
AOD400 EQU *
ANK A2,/3F DELETE LRC-BIT
XR A2,DWTLRC,A6 CHECK LRC-SUM
ANK A2,/F
RF(E) AOD380 CORRECT END I/O
LDK A1,4 INDICATE LRC RERROR
RF ENDIO
AOD360 EQU *
CF A15,CDCHK CODE CHECK
LDK A1,8 LENGTH OVERFLOW
RF ENDIO
AOD380 LDK A1,0 RETURN CODE
EJECT
*
*
* THIS IS A COMMON END OF THE DRIVER
*
* SET EFFECTIVE LENGTH AND PERFORM END I/O
*
*
ENDIO EQU *
IFT CTIMUT=1
INH
LD A4,DWTTP,A6
RF(E) ENDI05 NO TIMING ON THIS DEVICE
CM* DWTTP,A6 RESET TIMER
CM DWTTP,A6
XIF
*
***
*
ENDI05 EQU *
LDR A3,A3
RF(N) ENDI10
ST A3,ECBEL,A8 STORE EFFECTIVE LENGTH
ENDI10 EQU *
*
ABL DISEND
*
EJECT
*
*
*
* IHOD
*
*
* THIS IS THE INTERRUPT HANDLER ENTERED FROM CHLT/CHRT DRIVER
*
*
*
IHOD EQU *
ANK A2,/FF
IFT POWOFF=1
LD A4,DWTST,A6 I/O-REQUEST
ANK A4,1 RECOVERY?
RF(NZ) EXIT2 YES
XIF
LD A3,DWTST,A6 I/O REQUEST?
RF(N) IHOD10 NO
SLL A3,7 INTERRUPTS ALLOWED?
RF(NN) IHOD10 NO,STORE CHARACTER IN DWT-BUFFER
*
IFT CTIMUT=1
*
LD A3,DWTTP,A6
RF(E) IHOD05 NO TIMING ON THIS DEVICE
LDKL A3,-TIME RESTART TIME
ST* A3,DWTTP,A6
*
XIF
*
IHOD05 EQU *
ABL LDREG RETURN TO READ ROUTINE
IHOD10 EQU *
LD A1,DWTINQ,A6
LCR A4,A1
XRK A4,/FF ALREADY OVERFLOW?
RF(E) EXIT YES
LDR A3,A1
CF A15,EOQUEU GET NEXT OUTQUEUE POINTER ADDRESS
CW A1,DWTUTQ,A6 OVERFLOW?
RF(NE) IHOD20
ORK A2,/FF SET OVERFLOWBIT IN INPUT BUFFER
RF IHOD30
IHOD20 ST A1,DWTINQ,A6 STORE INQUEUE POINTER
IHOD30 SCR A2,A3
EXIT ABL TDISP
EJECT
IFT POWOFF=1
EXIT2 EQU *
LD A3,DWTA3,A6
RF(N) EXIT4
LD A4,DWTTP,A6 TIMER CLEARED
RF(Z) EXIT3 YES
LDKL A3,-100
ST* A3,DWTTP,A6 RESTART TIMER
LDK A3,1
EXIT3 EQU *
ADK A3,1
LDK A4,/40
TM A4,A2 ETX CHARACTER
RF(Z) EXIT5 NO
NGR A3,A3
EXIT5 EQU *
ST A3,DWTA3,A6
RB EXIT DISPATCH
EXIT4 EQU *
CM* DWTTP,A6 CLEAR TIMER
LDK A3,0
ABL RCTUT5
XIF
EJECT
*
*
* A O D T U T
*
* THIS IS THE TIME-OUT ROUTINE
*
*
IFT CTIMUT=1
*
AODTUT EQU *
LDR A6,A1 GET DWT-ADDRESS
LD A1,DWTST,A6
RB(N) EXIT
LDK A1,/40 SET RETURN CODE
CM DWTTP,A6
RB IHOD05 RESTORE REGISTERS AND END I/O
*
XIF
*
EJECT
*
* STORE = SUBROUTINE TO STORE A CHARACTER IN
* ECB-BUFFER AND INCREMENT BUFFER INDEX
*
* ON ENTRY:
*
* A2 = CHARACTER TO STORE
* A3 = BUFFER INDEX
*
*
STORE EQU *
LD A4,ECBBA,A8 BUFFER ADDRESS
ADR A4,A3 ADD BUFFER INDEX
SCR A2,A4 STORE CHARACTER IN BUFFER
ADK A3,1 INCREMENT BUFFER INDEX
ANK A2,/7F
STORTN ADKL A15,2
LDR* P,A15
EJECT
*
*
* EOQUEU = SUBROUTINE TO GET NEXT QUEUE POINTER
*
* ON ENTRY:
*
* A1 = QUEUE POINTER
* A6 = DWT-ADDRESS
*
* ON EXIT:
*
* A1 = NEW QUEUE POINTER
EOQUEU EQU *
ADK A1,1
SUR A1,A6
CWK A1,DWTEQ END OF QUEUE?
RF(NE) EOQU10
LDK A1,DWTSQ SET QUEUE START ADDRESS
EOQU10 ADR A1,A6
RB STORTN
EJECT
*
*
* CODE CHECK
*
*
* AT ENTRY A2= 6-BIT OCTAL CHARACTER
*
* AT EXIT A2= 7-BIT ASCII CHARACTER
CDCHK EQU *
LDR A4,A2 SAVE REGISTER
SUK A4,/1F LESS THEN /1F CONVERT TO ASCII
RF(NN) CDC05 NO
ORK A2,/40 SET BIT 7
CDC05 EQU *
RB STORTN
END