|
|
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: 17372 (0x43dc)
Notes: pts_type(SC)
Names: »DROD01.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/DROD01.SC«
IDENT DROD01 REL 11.0 81-01-26 870105041100 =1,NO SPECIAL ORDER CODES FOR CREDIT APPLICATIONS PRR 11.1 80-01-23$$ * ******************************************* * * 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 DROD01 * * * 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 DROD01 * * 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 LENDER END REQUEST AND DISPATCH EXTRN INPUT READ A CHARACTER EXTRN TENDIO END I/O EXTRN LDISP DISPATCHER ENTRY EXTRN SETIME SET TIME EXTRN NDGET8 LOAD REGISTERS * * EXTRN DWTCHP CHANEL PARAMETER EXTRN DWTST STATUS EXTRN DWTBC BYTE COUNTER EXTRN DWTADR DRIVER ADDRESS BLOCK EXTRN DWTA3 SAVE AREA A3 EXTRN DWTA4 SAVE AREA A4 EXTRN DWTA5 SAVE AREA A5 EXTRN DWTSB2 STACK BASE 2 IN DWT EXTRN DWTWAT SAVE INPUT DWT EXTRN DWTDEV DEVICE STATUS EXTRN ECBBA ECB BUFFER ADDRESS EXTRN ECBRL ECB REQUESTED LENGTH EXTRN ECBEL ECB EFFECTIVE LENGTH EXTRN ECBRC ECB RETURN CODE EXTRN ECBCW ECB CONTROL WORD EJECT DROD01 * * * * 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 DROD01 * * **************************************** * 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 1 * * * TIME OUT FUNCTION MAY BE EXCLUDED BY * SETTING X:A = 0. * X:F EQU 1 CTIMUT EQU X:F * * * MMU BUFFER SIZE * X:C EQU 80 DVBLEN EQU X:C * * * MMU KEY TABLE SIZE * X:D EQU 10 DVBKTB EQU X:D * * * 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 DROD01 * * ********************* * DWT DISPLACEMENTS * ********************* * * DWTDRD EQU /10 START OF DRIVER DEFINED PART * IFT MMUPAG=0 START EQU DWTDRD XIF * IFT MMUPAG=1 START EQU DWTDRD+4 XIF * DWTCON EQU /8 CONVERSION TABLE DWTTP EQU /A TIMER POINTER DWTLRC EQU /E LRC - ACKUMULATOR DWTINQ EQU /10 POINTER TO FIRST PLACE IN QUEUE DWTUTQ EQU /12 POINTER TO LAST PLACE IN QUEUE DWTSQ EQU /14 END OF QUEUE DWTEQ EQU DWTSQ+DWTLNG END OF QUEUE * EJECT DROD01 * * ************** * TABLES * ************** * * DATA DVBKTB MMU KEY TABLE SIZE DATA DVBLEN MMU BUFFER SIZE DATA 6 DEVICE INDEX ODAD EQU * DATA ACOD ACTIVATION DRIVER DATA 0 ABORT ROUTINE ADDRESS DATA IHOD INTERRUPT HANDLER * IFF POWOFF=1 DATA 0 NO RECOVERY XIF * IFT POWOFF=1 * DATA RCOD RECOVERY ROUTINE EJECT DROD01 * * * R C O D * * THIS IS THE RECOVERY ROUTINE FOR OCR * ENTERED FROM CHLT/CHRT DRIVER * RCOD EQU * INH * IFT POWOFF=1 LDKL A1,/800 ORS A1,DWTDEV,A6 INDICATE POWER OFF OCCURED LD A3,DWTST,A6 I/O-REQUEST RF(N) RCOD05 NO LD A4,DWTDEV+DWTTP,A6 TIME EQUAL 0 RF(Z) RCOD05 YES CM* DWTDEV+DWTTP,A6 RESET TIME CM DWTDEV+DWTTP,A6 RESET TIMER RCOD05 EQU * LDK A1,1 ORS A1,DWTST,A6 RECOVERY FLAG RCOD10 EQU * LDR A1,A6 GET DWT - ADRESS CF A15,SETIME SET TIME DATA RCTUT,/A ST A4,DWTDEV+DWTTP,A6 RF RCTDIS DISPATCH RCTUT EQU * INH IFT POWOFF=1 LDR A6,A1 RCTUT5 EQU * CM DWTDEV+DWTTP,A6 GET DWT-ADDRESS LD A8,4,A6 GET ECB-ADDRESS RF(Z) RCTUT6 SYSTEM START SKIP BUFFER INH XIF CM 10,A8 INDICATE POWER ON IFT POWOFF=1 RCTUT6 EQU * ENB ENB LDKL A1,/FFFE RESET RECOVERY ANS A1,DWTST,A6 LDK A1,0 LD A2,DWTDEV+DWTINQ,A6 SCR A1,A2 ST A2,DWTDEV+DWTUTQ,A6 LD A3,DWTST,A6 RF(NN) RCEND RCTDIS EQU * ABL LDISP DISPATCH RCEND EQU * LDKL A4,/FDFF ANS A4,DWTST,A6 RESET POWER OFF ABL LDISP DISPATCH XIF * EJECT DROD01 * * * 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,DWTDEV+DWTLRC,A6 CLEAR LRC-ACKUMULATOR LDR A4,A7 SUK A4,4 SUK A4,/2D RF(Z) CRE:10 SKIP INPUT BUFFER ADK A4,/2D CRE:10 EQU * RF(N) AOD200 ORDER 2 AOD100 ORKL A1,/8000 I/O REQUEST ERROR AOD105 EQU * ABL LENDER COMPLETE REQUEST EJECT DROD01 * * * ORDER 4 RESET INPUT BUFFER * AOD110 LD A2,DWTDEV+DWTINQ,A6 ORDER 4 SCR A1,A2 RESET OVERFLOW IF OCCURED ST A2,DWTDEV+DWTUTQ,A6 RESET OUTPUT QUEUE ABL ENDIO END I/O EJECT DROD01 * * * * AOD200 EQU * * IFT POWOFF=1 * LD A2,DWTDEV,A6 ANKL A2,/800 POWER OFF ? RF(E) AOD205 XRS A2,DWTDEV,A6 RESET BIT XIF AOD202 EQU * CM 10,A8 INDICATE POWER ON IFT POWOFF=1 ABL AOD380 * XIF * AOD205 EQU * * IFT CTIMUT=1 * LD A1,DWTDEV,A6 TIMING ON THIS DEVICE RF(NN) AOD210 NO TIMING ON THIS DEVICE RF(E) AOD210 NO TIMING FOR THIS DEVICE LD A4,DWTDEV+DWTTP,A6 RF(E) AODTIM RF AOD210 AODTIM EQU * LDR A1,A6 GET DWT ADRESS CF A15,SETIME SET TIME DATA AODTUT,TIME TIME OUT ROUTINE AND TIME ST A4,DWTDEV+DWTTP,A6 STORE TIMER ADDRESS IN DWT * XIF * EJECT DROD01 * * AOD210 EQU * LD A2,ECBRL,A8 REQUESTED LENGTH=0 AOD220 RF(E) AOD380 LDR A3,A3 FIRST TIME? 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,DWTDEV+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,DWTDEV+DWTINQ,A6 SOMETHING IN QUEUE? RF(NE) AOD260 CF A5,INPUT READ A CHARACTER 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,DWTDEV+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 DROD01 * * * * 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,DWTDEV+DWTLRC,A6 UPDATE LRC ACKUMULATOR RB AOD240 AOD340 EQU * XRS A2,DWTDEV+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,DWTDEV+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 DROD01 * * * THIS IS A COMMON END OF THE DRIVER * * SET EFFECTIVE LENGTH AND PERFORM END I/O * * ENDIO EQU * IFT CTIMUT=1 INH LD A4,DWTDEV+DWTTP,A6 RF(E) ENDI05 NO TIMING ON THIS DEVICE CM* DWTDEV+DWTTP,A6 RESET TIMER CM DWTDEV+DWTTP,A6 XIF * *** * ENDI05 EQU * LDR A3,A3 RF(N) ENDI10 ST A3,ECBEL,A8 STORE EFFECTIVE LENGTH ENDI10 EQU * * CF A15,TENDIO END REQUEST ABL LDISP DISPATCH * EJECT DROD01 * * * * IHOD * * * THIS IS THE INTERRUPT HANDLER ENTERED FROM CHLT/CHRT DRIVER * * * IHOD EQU * * IFT CTIMUT=1 * LD A3,DWTDEV+DWTTP,A6 RF(E) IHOD05 NO TIMING ON THIS DEVICE LDKL A3,-TIME RESTART TIME ST* A3,DWTDEV+DWTTP,A6 * XIF * IHOD05 EQU * IHOD10 EQU * LD A1,DWTDEV+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,DWTDEV+DWTUTQ,A6 OVERFLOW? RF(NE) IHOD20 ORK A2,/FF SET OVERFLOWBIT IN INPUT BUFFER RF IHOD30 IHOD20 ST A1,DWTDEV+DWTINQ,A6 STORE INQUEUE POINTER IHOD30 SCR A2,A3 EXIT EQU * ABL LDISP DISPATCH EJECT DROD01 IFT POWOFF=1 EXIT2 EQU * LD A3,DWTA3,A6 RF(N) EXIT4 LD A4,DWTDEV+DWTTP,A6 TIMER CLEARED RF(Z) EXIT3 YES LDKL A3,-100 ST* A3,DWTDEV+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* DWTDEV+DWTTP,A6 CLEAR TIMER LDK A3,0 ABL RCTUT5 XIF EJECT DROD01 * * * 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 DWTDEV+DWTTP,A6 RB IHOD05 RESTORE REGISTERS AND END I/O * XIF * EJECT DROD01 * * 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 DROD01 * * * 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 LDKL A1,DWTSQ SET QUEUE START ADRESS EOQU10 ADR A1,A6 RB STORTN EJECT DROD01 * * * 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