|
|
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: 36096 (0x8d00)
Notes: pts_type(SC)
Names: »DRTN01.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/DRTN01.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/DRTN01.SC«
IDENT DRTN01 REL 11.0 81-03-18 870105041100 * =1 SUPPORT BOTH TND2.05 AND TND6.01 =2,NO MOVE OF USER BUF. WHEN OPN AND MMU =2,REL 11.0 81-01-28 * REL 11.0 81-01-26 ************************************************************ * * PHILIPS TERMINAL SYSTEM PTS * * DRTN01 = DRIVER TELLER NOTE DISPENSER * ************************************************************ * * * THIS DRIVER HANDLES THE MICROCOMPUTER IN THE NOTE * DISPENSER (ND). * (VERSION 2.05 AND 6.01) =1 * THE ND IS INTENDED FOR USE IN PTS6000 BANKING SYSTEMS. * * THE INTENTION WITH THE NOTE DISPENSER IS TO DISPENSE * BANK NOTES FROM CASSETTES TO THE TERMINAL OPERATOR * OR THE CUSTOMER.UP TO 100 NOTES CAN BE ORDERED IN * ONE COMMAND FROM A NUMBER OF CASSETTES CONTAINING * VARIOUS DENOMINATIONS. * * * THE DRIVER CONSISTS OF FOLLOWING PARTS: * * ACTN: ACTIVATION PART,ORDER PROCESSOR * RCTN: RECOVERY ROUTINE * * * THE FOLLOWING ORDERS ARE TREATED: * * /21 OPEN * /22 CLOSE * /2C READ DEVICE STATUS * /2A READ CONTROL * /2D READ DIAGNOSTIC * (SPLIT=0) * /2B DISPENSE AND DELIVER * (SPLIT=1) * /2B DISPENSE * /38 DELIVER * /31 DUMP * THE FOLLOWING RETURN CODES ARE USED: * * BIT 0 REQUEST ERROR = 8000 * 1 NO CASSETTE = 4000 * 2 NOTES IN DELIVERY UNIT = 2000 * 3 BAD NOTES = 1000 * 4 REJECT CASSETTE FULL = 0800 * 5 CASSETTE LOW = 0400 * 6 CASSETTE EMPTY = 0200 * 7 JAMMED NOTES = 0100 * 8 POWER FAILURE = 0080 * 9 TIME-OUT = 0040 * 10 REJECTED NOTES = 0020 * 11 SEQUENCE ERROR = 0010 * 12 COMMUNICATION ERROR = 0008 * 13 FIRMWARE ERROR = 0004 * 14 HARDWARE ERROR = 0002 * 15 NOT OPERABLE = 0001 * * NORMAL USE OF REGISTERS: * * A1 RETURN CODE * A2 INPUT/OUTPUT CHARACTER * A3 * A4 BUFFER INDEX OR BUFFER POINTER * A5 STACK BASE POINTER * A6 DWT ADDRESS * A7 ORDER * A8 ECB ADDRESS EJECT * *********** * ENTRIES * *********** * ENTRY TNAD ADDRESS BLOCK EJECT * ******************************** * EXTERNAL TOSS MODULE ENTRIES * ******************************** * EXTRN INPUT INPUT ONE CHARACTER EXTRN STABLK START OF BLOCK EXTRN OUTPUT OUTPUT ONE CHARACTER EXTRN ENDBLK END OF BLOCK EXTRN LENDER DISPATCH, END I/0 ,REQUEST ERROR EXTRN LENDIS END I/O AND DISPATCH EXTRN LDISP DISPATCH EXTRN SETIME SET TIME EJECT * ************************************** * DEVICE INDEX VALUES ************************************** * EXTRN PC:DIX PROGRAMMED CHANNEL DEVICE INDEX * * * ******************** * ECB-DISPLACEMENTS * ******************** * EXTRN ECBBA BUFFER ADDRESS EXTRN ECBRL REQUESTED LENGTH EXTRN ECBEL EFFECTIVE LENGTH EXTRN ECBRC RETURN CODE EXTRN ECBCW CONTROL WORD * * ***************************** * DWT PARAMETERS ****************************** * * EXTRN DWTOR ORDER EXTRN DWTECB ECB-ADDRESS EXTRN DWTSB2 STACK BASE * EXTRN DWTDEV DEVICE DRIVER DEPENDANT (FIRST FIELD) * * EJECT * * FORM STATEMENTS * BYTE FORM 8,8 QUART FORM 4,4,4,4 EJECT * ************************ * CONDITIONAL ASSEMBLY * ************************ * X:A EQU 0 ORDER 'DIPENSE AND DELIVER' * IS SPLIT (OR NOT) * INTO ORDERS 'DISPENSE', 'DELIVER', 'DUMP'. SPLIT EQU X:A * * X:B EQU 40 MMU BUFFER SIZE (STANDARD) DVBLEN EQU X:B * * EJECT * * ************************************** * DWT-DISPLACEMENTS RELATIVE DWTDEV * *************************************** * DWTTP EQU 2 TIMER POINTER DWTLR EQU DWTTP+2 BITS 0-7: INDICATOR LEFT OR RIGHT TELLER DWTLRC EQU DWTLR BITS 8-15: LRC-ACKUMULATOR DWTBFR EQU DWTLRC+2 DELAY-BUFFER (LAST HW-MESSAGE FROM ND) DWTSTA EQU DWTBFR+2 NOTE DISPENSER STATUS DWTTAB EQU DWTSTA+2 STORE-CHECK TABLE POINTER DWTNCR EQU DWTTAB+2 NUMBER OF CHARACTERS RECEIVED DWTCNB EQU DWTNCR+2 OLD CASSETTE NUMBER DWTTP1 EQU DWTCNB+2 TIMER POINTER DEVICE BUSY DWTRDS EQU DWTTP1+2 LOGGAREA: OUTPUT HW-ORDER, RECIEVED STAT DWTBUF EQU DWTRDS+4 INTERN BUFFER * EJECT * ************* * CONSTANTS * ************* * BIT0 EQU /8000 BIT1 EQU /4000 BIT2 EQU /2000 BIT3 EQU /1000 BIT4 EQU /0800 BIT5 EQU /0400 BIT6 EQU /0200 BIT7 EQU /0100 BIT8 EQU /0080 BIT9 EQU /0040 BIT10 EQU /0020 BIT11 EQU /0010 BIT12 EQU /0008 BIT13 EQU /0004 BIT14 EQU /0002 BIT15 EQU /0001 * * TIME2M EQU 1200 TIME CONSTANT=2 MINUTES TIME1M EQU 600 TIME CONSTANT=1 MINUTE TIME9S EQU 90 TIME CONSTANT=9 SECONDS TIME1S EQU 10 TIME CONSTANT=1 SECOND BUFLEN EQU 36 DWT BUFFER LENGTH BLKSIZ EQU 30 BLOCK-SIZE OUTPUT TO LINE DRIVER EJECT * **************** * RETURN CODES * **************** * REQERR EQU BIT0 REQUEST ERROR NOCASS EQU BIT1 NO CASSETTE NOTDEL EQU BIT2 NOTES IN DELIVERY UNIT BADNOT EQU BIT3 BAD NOTES REJFUL EQU BIT4 REJECT CASSETTE FULL CASLOW EQU BIT5 CASSETTE LOW CASEMP EQU BIT6 CASSETTE EMPTY JAMNOT EQU BIT7 JAMMED NOTES PWFAIL EQU BIT8 POWER FAILURE TIMOUT EQU BIT9 TIME-OUT REJNOT EQU BIT10 REJECTED NOTES SEQERR EQU BIT11 SEQUENCE ERROR COMERR EQU BIT12 COMMUNICATION ERROR FMERR EQU BIT13 FIRMWARE ERROR IN TND HWERR EQU BIT14 HARDWARE ERROR NOTOPE EQU BIT15 NOT OPERABLE REJNF EQU REJNOT+REJFUL REJECTED NOTES+REJECT CASSETTE FULL EJECT ******************* * STATUS BITS IN DWTDEV * ******************* * OPNBIT EQU BIT15 OPEN/CLOSE BIT (1/0) RESDON EQU BIT14 RESET DONE BIT (0) DISDON EQU BIT13 DISPENSE DONE (1) EJECT * *************** * ORDER CODES * *************** * OPEN EQU /21 OPEN CLOSE EQU /22 CLOSE DISDEL EQU /2B DISPENSE AND DELIVER READCO EQU /2A READ CONTROL READDI EQU /2D READ DIAGNOSTIC READDS EQU /2C READ DEVICE STATUS DUMP EQU /31 DUMP NOTES DELIVE EQU /38 DELIVER EJECT * ********************* * HARDWARE COMMANDS * ********************* * RESET EQU /30 RESET DISDLV EQU /31 DISPENSE AND DELIVER DISPNS EQU /32 DISPENSE DELIVR EQU /33 DELIVER REJECT EQU /34 REJECT NOTES CASNBR EQU /35 GET CASSETTE NUMBERS STADIS EQU /36 GET STATUS FROM LAST DISPENSE LIFTDW EQU /37 LIFTS DOWN LIFTUP EQU /38 LIFTS UP RTRACE EQU /39 GET REJECT TRACE AREA CHKDEL EQU /3A CHECK DELIVER UNIT ENDCH EQU /0D END OF MESSAGE EJECT * ********** * TABLES * ********** * * * DATA DVBLEN MMU BUFFER LENGTH DATA PC:DIX PROGRAMMED CHANNEL DEVICE INDEX TNAD EQU * DATA ACTN ACTIVATION DRIVER DATA 0 ABORT ROUTINE DATA 0 INTERRUPT HANDLER DATA RCTN RECOVERY ROUTINE * * TNTAB EQU * ORDER TABLE BYTE OPEN,CLOSE BYTE DISDEL,READCO BYTE READDI,READDS IFT SPLIT=1 BYTE DUMP,DELIVE XIF TNLEN EQU *-TNTAB-1 * * TNFUN EQU * NOTE DISPENSER FUNCTION DATA OPENTN,CLOSTN,DISPEN DATA RDCONT,RDDIAG,RDDEVS IFT SPLIT=1 DATA DUMPA,DELIV XIF EJECT * * TABLE OF NO-STORE BYTE-NUMBERS OF MESSAGE AFTER HW-COMMAND /30 (RESET) * DATA RESEND-RESTAB RESTAB EQU * BYTE 2,3 MESSAGEBYTES WITH NBR/STATUS OF HOPPER 0 BYTE 7,8 DITO HOPPER 1 BYTE 14,15 DITO HOPPER 2 BYTE 21,22 DITO HOPPER 3 BYTE 28,29 DITO HOPPER 4 BYTE 35,36 DITO HOPPER 5 BYTE 42,43 DITO HOPPER 6 RESEND EQU *-1 * * * * TABLE OF NO-STORE BYTE-NUMBERS OF MESSAGE AFTER HW-COMMAND /35 * (GET CASSETTE NUMBERS) * DATA CTABEN-CNBTAB CNBTAB EQU * BYTE 2,3 MESSAGEBYTES WITH NBR/STATUS OF HOPPER 0 BYTE 9,10 DITO HOPPER 1 BYTE 16,17 DITO HOPPER 2 BYTE 23,24 DITO HOPPER 3 BYTE 30,31 DITO HOPPER 4 BYTE 37,38 DITO HOPPER 5 BYTE 44,45 DITO HOPPER 6 CTABEN EQU *-1 EJECT * * BIT IN RETURN CODE HW-STATUS * CASTAT EQU * QUART 5,6,15,10 31,32,33,34 QUART 15,15,12,11 35,36,37,38 QUART 7,1,7,3 39,3A,3B,3C QUART 7,15,15,15 3D,3E,3F,40 QUART 15,0,15,4 41,42,43,44 QUART 15,14,14,14 45,46,47,49 QUART 15,14,2,2 4A,4B,4C,4D QUART 12,14,15,15 4E,4F,50,51 =1 EJECT * * * ACTN * * * ACTIVATION PART: CHECKS VALIDITY OF ORDERS * AND STARTS PROCESSING * * * ACTN EQU * CF A5,CLDATA CLEAR DATA IN DWT LDK A3,TNLEN ACTN10 CC A7,TNTAB,A3 FIND OUT IF LEGAL ORDER RF(E) ACTN20 VALID ORDER SUK A3,1 DECREMENT INDEX RB(NN) ACTN10 TRY NEXT * * ABL LENDER DISPATCH, END I/O ,REQUEST ERROR * * EJECT ACTN20 EQU * * * * ADR A3,A3 GET INDEX ABI TNFUN,A3 BRANCH TO VALID FUNCTION MODULE EJECT * * THIS IS THE TIME OUT ROUTINE * ACTNTO EQU * LDR A6,A1 GET DWT ADDRESS LDK A1,TIMOUT SET RETURN CODE CM DWTDEV+DWTTP,A6 RESET TIMER POINTER CM DWTDEV+DWTSTA,A6 RF OPCLEN END I/O EJECT * * THIS IS THE DEVICE-BUSY-TIMEOUT ROUTINE * BSYTUT EQU * LDR A6,A1 DWT ADDRESS LDKL A5,DWTSB2 ADR A5,A6 STACK BASE CM DWTDEV+DWTTP1,A6 RESET TIMER POINTER DEVICE BUSY CM DWTDEV+DWTSTA,A6 RESET RETURN CODE ACCUMULATOR LD A8,DWTECB,A6 ECB ADDRESS LD A7,DWTOR,A6 ANK A7,/FF ORDER CODE RB ACTN DEVICE FREE. TRY ORDER AGAIN EJECT * * THIS IS THE ROUTINE TO OPEN AND CLOSE THE NOTE DISPENSER * * * LIFTS UP * OPENTN EQU * LDKL A7,TIME1M CF A15,TIMER LDK A2,LIFTUP LIFTS UP COMMAND CF A5,SENCOM SEND COMMAND CF A5,RECMES RECEIVE MESSAGE RF(NZ) OPCLEN END BECAUSE OF ERROR IN MESSAGE * * DUMMY-COMMAND (SEND CASSETTE NUMBERS) ONLY TO CLEAR, * IN TND-MICROPROCESSOR, THE FLAG INDICATING 'LIFTS HAVE BEEN DOWN' * LDK A2,CASNBR COMMAND: GET CASSETTE NUMBERS CF A5,SENCOM SEND COMMAND OPE090 EQU * CF A5,RECMES RECIEVE MESSAGE RF(P) OPCLEN END BECAUSE OF ERROR IN MESSAGE RB(NZ) OPE090 NEXT CHAR CM DWTDEV+DWTSTA,A6 CLEAR STATUS AFTER DUMMY COMMAND EJECT * * RESET NOTE DISPENSER * LDKL A2,RESTAB TABLE TO KNOW WHICH MESSAGE BYTES * NOT TO STORE INTO USER BUFFER ST A2,DWTDEV+DWTTAB,A6 LDK A4,0 USER BUFFER DISPLACEMENT LDK A3,/30 CF A5,STORE DUMMY IN USER BUFFER CF A5,STORE DUMMY IN USER BUFFER LDK A2,RESET OPE100 EQU * LDK A3,'0' ST A3,DWTDEV+DWTCNB,A6 INDICATE OLD CASSETTE = 0 CF A5,SENCOM SEND COMMAND OPE110 EQU * CF A5,RECMES RECEIVE MESSAGE RF(Z) OPE120 END OF MESSAGE RF(P) OPCLEN END BECAUSE OF ERROR IN MESSAGE CF A5,STORE BUILD USER BUFFER RB OPE110 EJECT OPE120 EQU * LD A2,DWTDEV,A6 ANK A2,RESDON RF(Z) OPE130 RESET DONE C1R A2,A2 ANS A2,DWTDEV,A6 INDICATE RESET DONE LDKL A2,CNBTAB TABLE TO KNOW WHICH MESSAGE BYTES * NOT TO STORE INTO USER BUFFER ST A2,DWTDEV+DWTTAB,A6 STORE CONTROL TABLE LDK A2,2 ST A2,DWTDEV+DWTNCR,A6 NUMBER OF CHARACTERS RECEIVED LDK A4,5 USER BUFFER DISPLACEMENT LDK A2,CASNBR GET CASSETTE NUMBER RB OPE100 OPE130 EQU * LDK A7,OPNBIT+RESDON ORS A7,DWTDEV,A6 INDICATE ND OPEN AND RESET NOT DONE LDK A7,2 READ ORDER =2 SC A7,DWTOR+1,A6 INDICATE MOVE BUF. TO USER =2 EJECT * * COMMON END * ENDIOC EQU * CM DWTDEV+DWTBUF+2,A6 RESET READ CONTROL BUFFER LENGTH ENDIOL EQU * LD A8,DWTECB,A6 RESTORE (REAL) ECB-ADDRESS ST A4,ECBEL,A8 UPDATE EFFECTIVE LENGTH ENDIO EQU * OR A1,DWTDEV+DWTSTA,A6 SET RETURN CODE LD A4,DWTDEV+DWTTP,A6 LOAD TIMER POINTER RF(Z) ENDI10 NO TIMING CMR A4 RESET TIMER CM DWTDEV+DWTTP,A6 RESET TIMER POINTER ENDI10 EQU * LD A4,DWTDEV+DWTTP1,A6 TIMER POINTER DEVICE BUSY RF(Z) ENDI20 NO TIMER CMR A4 RESET TIMER CM DWTDEV+DWTTP1,A6 RESET TIMER POINTER DEVICE BUSY ENDI20 EQU * ABL LENDIS END I/O AND DISPATCH EJECT * * CLOSE NOTE DISPENSER * * * LIFTS DOWN * CLOSTN EQU * LDK A7,TIME9S CF A15,TIMER LDK A2,LIFTDW CF A5,SENCOM SEND COMMAND CF A5,RECMES RECEIVE MESSAGE LDKL A4,-OPNBIT-1 ANS A4,DWTDEV,A6 INDICATE NOTE DISPENSER CLOSED OPCLEN EQU * LDK A7,RESDON ORS A7,DWTDEV,A6 INDICATE RESET NOT DONE ENDIOZ EQU * LDK A4,0 RB ENDIOC EJECT * * DISPENSE AND DELIVER /2B * DISPEN EQU * LDKL A7,TIME2M CF A15,TIMER LD A2,DWTDEV,A6 ANK A2,OPNBIT RF(Z) SEQER ND NOT OPEN, INDICATE SEQUENCE ERROR CF A5,DSRQTS TEST IF REQUEST ERROR LDK A2,BLKSIZ BLOCK-SIZE CF A5,STABLK DEFINE START OF BLOCK ABL(NZ) LINERR LINE ERROR STATUS IFT SPLIT=0 LDK A2,DISDLV DISPENSE AND DELIVER XIF IFT SPLIT=1 LDK A2,DISPNS DISPENSE XIF XRS A2,DWTDEV+DWTLRC,A6 UPDATE LRC ACKUMULATOR SC A2,DWTDEV+DWTRDS,A6 SAVE HW-ORDER CF A5,OUTPUT SEND COMMAND DISPENSE AND DELIVER ABL(NZ) LINERR LINE ERROR STATUS LC A2,DWTDEV+DWTLR,A6 LEFT OR RIGHT TELLER ADK A2,/30 MAKE ASCII XRS A2,DWTDEV+DWTLRC,A6 UPDATE LRC ACKUMULATOR CF A5,OUTPUT SEND LEFT OR RIGHT TELLER ABL(NZ) LINERR LINE ERROR STATUS LD A4,ECBBA,A8 USER BUFFER ADDRESS LDK A3,/31 CASSETTE 1 EJECT * * SEND CASSETTE DATA * DIS100 EQU * CF A5,SENCAS SEND CASSETTE DATA RB(NZ) DIS100 NOT LAST CASSETTE CF A5,LRCEOM SEND LRC AND END OF MESSAGE DIS110 EQU * LDK A4,0 BUFFER DISPLACEMENT LDK A2,BUFLEN DWT BUFFER LENGTH ST A2,DWTDEV+DWTBUF+2,A6 LDR A2,A6 ADKL A2,DWTDEV+DWTBUF+4 A2:=DWT BUFFER POINTER ST A2,DWTDEV+DWTBUF,A6 EJECT * * RECEIVE MESSAGE * DIS120 EQU * CF A5,RECMES RECEIVE MESSAGE RB(P) ENDIOZ ERROR IN MESSAGE RF(Z) DADEND END OF MESSAGE LD A8,DWTDEV+DWTBUF,A6 SUKL A8,6 VIRTUAL ECB POINTER CF A5,STORE STORE CHARACTER INTO DWT-INTERN BUFFER RB DIS120 DADEND EQU * IFT SPLIT=1 LD A7,DWTOR,A6 GET ORDER ANK A7,/FF MASK CWK A7,DISDEL RF(E) DIS125 DISPENSE ORDER LDR A1,A1 RETURN CODE WITHOUT WARNINGS RF(NZ) DIS130 COMMAND NOT OK LDKL A3,-DISDON-1 ANS A3,DWTDEV,A6 INDICATE DISPENSE NOT DONE RF DIS130 DIS125 EQU * LDR A1,A1 RETURN CODE WITHOUT WARNINGS RF(NZ) DIS130 COMMAND NOT OK LDK A2,DISDON ORS A2,DWTDEV,A6 INDICATE DISPENSE DONE DIS130 EQU * XIF ST A4,DWTDEV+DWTBUF+2,A6 SAVE BUFFER LENGTH RB ENDIO * * SEQUENCE ERROR * SEQER EQU * LDK A1,SEQERR RB ENDIOZ EJECT * * READ CONTROL * RDCONT EQU * LDK A4,'0' ST A4,DWTDEV+DWTCNB,A6 INDICATE OLD CASSETTE = 0 LDK A4,0 USER BUFFER DISPLACMENT C2 DWTDEV+DWTBUF+2,A6 NEGATE DWT BUFFER LENGTH RF(Z) RDC120 NOTHING IN BUFFER RDC100 EQU * LC* A3,DWTDEV+DWTBUF,A6 GET CASSETTE NUMBER CF A5,RESCAS RESET CASSETTES NOT IN SEQUENCE IM DWTDEV+DWTBUF,A6 NEXT CHARCATER IN DWT BUFFER IM DWTDEV+DWTBUF+2,A6 NUMBER OF CHARACTERS LDK A3,/30 CF A5,STORE LDK A1,3 GET 4 BYTES FROM DWT BUFFER RDC110 EQU * LC* A3,DWTDEV+DWTBUF,A6 GET CHARACTER CF A5,STORE IM DWTDEV+DWTBUF,A6 UPDATE BUFFER POINTER IM DWTDEV+DWTBUF+2,A6 RF(Z) RDC120 WHOLE BUFFER MOVED SUK A1,1 RB(NN) RDC110 NEXT FOR THIS CASSETTE RB RDC100 RDC120 EQU * LDR A1,A6 ADKL A1,DWTDEV+DWTBUF+4 A1:=DWT BUFFER POINTER ST A1,DWTDEV+DWTBUF,A6 LDK A1,0 RETURN CODE ENIOL1 EQU * ABL ENDIOL EJECT * * READ DIAGNOSTIC * RDDIAG EQU * LDK A7,TIME1S CF A15,TIMER LDK A2,RTRACE GET REJECT TRACE AREA CF A5,SENCOM SEND COMMAND LDK A4,0 USER BUFFER DISPLACEMENT RDD100 EQU * CF A5,RECMES RECEIVE MESSAGE RF(NN) RDD110 END OF MESSAGE OR ERROR IN MESSAGE CF A5,STORE SAVE CHARACTER (A3) IN USER BUFFER RB RDD100 NEXT CHARACTER RDD110 EQU * RB ENIOL1 EJECT * * READ DEVICE STATUS * RDDEVS EQU * LDKL A2,DWTDEV+DWTRDS ADR A2,A6 DATA POINTER LDK A4,0 BUFFER INDEX RDS100 EQU * LCR A3,A2 ANK A3,/FF RF(Z) RDS110 END OF BUFFER CF A5,STCHAR STORE CHARACTER IN USER BUFFER ADK A2,1 UPDATE POINTER CWK A4,4 RB(L) RDS100 NEXT CHARACTER RDS110 EQU * LDK A1,0 RETURN CODE RB ENIOL1 IFT SPLIT=1 EJECT * * DELIVER NOTES /38 * DELIV EQU * * * CHECK IF NOTES IN DELIVERY UNIT * LDK A7,TIME9S CF A15,TIMER LDK A2,CHKDEL CF A5,SENCOM SEND COMMAND DEL100 EQU * CF A5,RECMES RECEIVE MESSAGE ABL(P) ENDIO COMMUNICATION ERROR LD A1,DWTDEV+DWTSTA,A6 RETURN CODE ABL(NZ) ENDIO NOTES IN DELIVERY UNIT LD A2,DWTDEV,A6 ANK A2,DISDON RB(Z) SEQER DISPENSE NOT DONE,SEQUENCE ERROR LDK A2,DELIVR RF DUM100 EJECT * * DUMP NOTES /31 * DUMPA EQU * LDK A7,TIME9S CF A15,TIMER LDK A2,REJECT DUM100 EQU * CF A5,SENCOM SEND COMMAND ABL DIS110 RECEIVE MESSAGE XIF EJECT * * * RCTN * * RECOVERY AT POWER ON * * RCTN EQU * LDKL A1,-OPNBIT-1 ANS A1,DWTDEV,A6 INDICATE ND NOT OPEN LDK A1,RESDON ORS A1,DWTDEV,A6 INDICATE RESET NOT DONE LDR A8,A8 ANY ECB ADDRESS ? ABL(Z) LDISP NO. DEVICE NOT BUSY LDK A1,PWFAIL SET POWER FAILURE BIT CWK A7,READCO ABL(E) ENDIO READ CONTROL ORDER ABL ENDIOZ OTHER ORDERS THAN READ CONTROL EJECT * * * SUBROUTINES * * * * * SET TIMER * A7=TIME VALUE * TIMER EQU * LD A1,DWTDEV+DWTTP,A6 TIMER POINTER RF(NZ) TIM100 TIMER ALREADY SET LDR A1,A6 SAVE DWT ADDRESS IF TIMEOUT CF A15,SETIME SET TIME DATA ACTNTO,TIME1S TIME1S OUT ROUTINE AND TIME1S ST A4,DWTDEV+DWTTP,A6 STORE TIMER ADDRESS IN DWT NGR A7,A7 STR A7,A4 NEW TIME VALUE TIM100 EQU * RTN A15 EJECT CLDATA EQU * CM DWTDEV+DWTLRC,A6 RESET LRC BUFFER LC A1,DWTOR,A6 INDEX ANK A1,1 SC A1,DWTDEV+DWTLR,A6 LEFT OR RIGHT TELLER CM DWTDEV+DWTBFR,A6 CLEAR DELAY BUFFER CM DWTDEV+DWTSTA,A6 CLEAR NOTE DISPENSER STATUS CM DWTDEV+DWTTAB,A6 CLEAR STORE-TABLE POINTER CM DWTDEV+DWTNCR,A6 CLEAR NUMBER OF CHARACTERS RECEIVED CWK A7,READDS RF(E) CLD100 ORDER READ DEVICE STATUS CM DWTDEV+DWTRDS,A6 CM DWTDEV+DWTRDS+2,A6 CLD100 EQU * RTN A5 EJECT * * SUBROUTINE TO GET RETURN CODE FROM H.W. STATUS * * ENTRY: A2 = H.W. STATUS * * EXIT: * A1,A2 = IRRELEVANT * RETURN CODE IN DWTSTA * STATUS EQU * LDK A1,0 CWK A2,/33 RF(E) STA150 DEVICE BUSY BECAUSE LIFTS ARE DOWN CWK A2,/30 RF(E) STA160 DEVICE OK LC A1,DWTDEV+DWTRDS+1,A6 OLD STATUS ANK A1,/FF RF(NZ) STA080 BYTE ALREADY OCCUPIED SC A2,DWTDEV+DWTRDS+1,A6 SAVE HW STATUS RF STA090 STA080 EQU * SC A2,DWTDEV+DWTRDS+3,A6 SAVE HW STATUS STA090 EQU * SUK A2,/30 CHECK LOWER LIMIT RF(N) STA180 WRONG HW-STATUS SUK A2,/21 CHECK UPPER LIMIT =1 RF(P) STA180 WRONG HW-STATUS ADK A2,/20 ADJUST BACK, AND DECR WITH /31. =1 EJECT CWK A2,/17 RF(E) STA140 STATUS /48,HIGH PRESSURE = WARNING RF(L) STA100 DON'T SKIP /48 SUK A2,1 SKIP /48 STA100 EQU * SRC A2,1 RF(N) STA110 ODD QUART LC A2,CASTAT,A2 SRL A2,4 A2:=BIT NUMBER IN RETURN CODE RF STA120 STA110 EQU * ANK A2,/FF LC A2,CASTAT,A2 ANK A2,/F A2:=BIT NUMBER IN RETURN CODE STA120 EQU * LDK A1,1 SET BIT 15 STA130 EQU * SRC A1,1 SUK A2,1 RB(NN) STA130 BIT NOT IN CORRECT POSITION STA140 EQU * ORS A1,DWTDEV+DWTSTA,A6 SET RETURN CODE LDK A1,0 RTN A5 EJECT STA150 EQU * SUK A1,1 INDICATE DEVICE BUSY (LIFTS ARE DOWN) STA160 EQU * LD A2,DWTDEV+DWTRDS+2,A6 HW ORDER AND STATUS 2 RF(NZ) STA170 BOTH STATUS WORDS OCCUPIED CM DWTDEV+DWTRDS,A6 STA170 EQU * CM DWTDEV+DWTRDS+2,A6 RB STA140 STA180 EQU * LDK A1,FMERR FIRMWARE-ERROR IN TND RB STA140 EJECT * * * * THIS SUBROUTINE IS ENTERED * WHEN LINE DRIVER ERROR STATUS IS DETECTED * * LINERR EQU * LDK A1,NOTOPE RETURN CODE FOR ECB: NOT OPERABLE ORS A1,DWTDEV+DWTSTA,A6 SET RETURN CODE INTO ECB ABL OPCLEN INDICATE RESET NOT DONE ETC. EJECT * * THIS SUBROUTINE SENDS A ONE BYTE LONG COMMAND * AND CALCULATES LRC,SENDS IT AND SENDS END OF MESSAGE * * ENTRY: A2 = COMMAND TO SEND * * EXIT: A1,A2,A3 = IRRELEVANT * SENCOM EQU * LDR A3,A2 SAVE THE COMMAND LDK A2,BLKSIZ GET BLOCKSIZE CF A5,STABLK DEFINE START OF BLOCK RB(NZ) LINERR LINE ERROR STATUS LDR A2,A3 RESTORE THE COMMAND SC A2,DWTDEV+DWTLRC+1,A6 SAVE LRC SUM LD A1,DWTDEV+DWTRDS,A6 FIRST WORD IN LOGG AREA RF(NZ) SEN100 ONE LOGG ALREADY DONE SC A2,DWTDEV+DWTRDS,A6 SAVE HW ORDER RF SEN200 SEN100 EQU * SC A2,DWTDEV+DWTRDS+2,A6 SAVE HW ORDER SEN200 EQU * CF A5,OUTPUT SEND BYTE RB(NZ) LINERR LINE ERROR STATUS * * SEND LRC AND END OF MESSAGE * LRCEOM EQU * LC A3,DWTDEV+DWTLRC+1,A6 GET LRC SUM ANK A3,/FF LDR A2,A3 SRL A2,4 ANK A3,/F ADK A2,/30 CMSD ADK A3,/30 CLSD CF A5,OUTPUT SEND BYTE RB(NZ) LINERR LINE ERROR STATUS LDR A2,A3 CLSD CF A5,OUTPUT SEND BYTE RB(NZ) LINERR LINE ERROR STATUS LDK A2,ENDCH END CHARACTER CF A5,OUTPUT SEND BYTE RB(NZ) LINERR LINE ERROR STATUS LDK A2,0 SC A2,DWTDEV+DWTLRC+1,A6 RESET LRC ACKUMULATOR CF A5,ENDBLK DEFINE END OF BLOCK RB(NZ) LINERR LINE ERROR STATUS RTN A5 EJECT * * SUBROUTINE TO SEND DATA TO EACH CASSETTE * * ENTRY: A4 = USER BUFFER POINTER * A3 = CASSETTE NUMBER * * EXIT: A4 = A4 + 5 * A3 = A3 + 1 * A1,A2 = IRRELEVANT * SENCAS EQU * ST A3,DWTDEV+DWTBUF,A6 SAVE A3 XRS A3,DWTDEV+DWTLRC,A6 UPDATE LRC LDR A2,A3 CF A5,OUTPUT RB(NZ) LINERR LINE ERROR STATUS ADK A4,2 LDK A3,2 SCA100 EQU * LCR A2,A4 XRS A2,DWTDEV+DWTLRC,A6 UPDATE LRC CF A5,OUTPUT RB(NZ) LINERR LINE ERROR STATUS ADK A4,1 UPDATE BUFFER POINTER SUK A3,1 RB(NN) SCA100 DATA FOR THIS CASSETTE NOT FINISHED LD A3,DWTDEV+DWTBUF,A6 SAVED REGISTER=CASSETTE NBR ADK A3,1 NEXT CASSETTE ADK A5,4 ADJUST STACK LD A2,ECBBA,A8 AD A2,ECBRL,A8 CWR A4,A2 SET CR ABR* A5 RETURN EJECT * THIS ROUTINE RECEIVES A MESSAGE FROM NOTE DISPENSER * IF DWTBFR IS ZERO,IT RECEIVES STATUS+3 BYTES * IF THE LAST BYTE IS EOM,IT CHECKS LRC AND THEN RETURNS * IF DWTBFR IS NOT ZERO,IT RECEIVES ONE BYTE * * ENTRY: NOTHING * EXIT: A3 = RECEIVED CHARACTER * A2 = IRRELEVANT * A1 = RETURN CODE * CR = O MEANS EOM AND LRC OK * 1 MEANS EOM AND LRC BAD * 2 MEANS NOT EOM RECMES EQU * LD A2,DWTDEV+DWTBFR,A6 RF(NZ) REC100 NOT FIRST TIME CF A5,INPUT GET STATUS XRS A2,DWTDEV+DWTLRC,A6 UPDATE LRC CF A5,STATUS TEST STATUS AND SET RETURN CODE CF A5,INPUT GET NEXT BYTE SC A2,DWTDEV+DWTBFR,A6 SAVE CHARACTER CF A5,INPUT GET NEXT BYTE SC A2,DWTDEV+DWTBFR+1,A6 SAVE CHARACTER REC100 EQU * CF A5,INPUT GET CHARACTER ADK A5,4 UPDATE STACK POINTER CCK A2,/0D0D RF(E) REC120 END OF MESSAGE LD A3,DWTDEV+DWTBFR,A6 GET TWO LAST CHARACTERS SC A3,DWTDEV+DWTBFR,A6 UPDATE DELAY BUFFER SRL A3,8 XRS A3,DWTDEV+DWTLRC,A6 UPDATE LRC ACK. SC A2,DWTDEV+DWTBFR+1,A6 UPDATE DELAY BUFFER LDKL A1,-1 SET CR REC110 EQU * ABR* A5 EJECT * * CHECK LRC * REC120 EQU * LD A3,DWTDEV+DWTBFR,A6 DELAY BUFFER WITH CMSD,CLSD LDR A2,A3 ANK A2,/FF SUK A2,/30 SRL A3,8 SUK A3,/30 SLL A3,4 ORR A3,A2 LRC VALUE LC A2,DWTDEV+DWTLRC+1,A6 DRIVER LRC VALUE CM DWTDEV+DWTBFR,A6 RESET INTERN BUFFER LD A1,DWTDEV+DWTSTA,A6 RETURN CODE CWK A1,-1 RF(E) REC130 HW DEVICE BUSY BECAUSE LIFTS ARE DOWN ANKL A1,-CASLOW-REJNF-1 MASK WARNINGS CWR A3,A2 RB(E) REC110 EOM AND LRC OK LDKL A1,COMERR SET CR AND RETURN CODE RB REC110 EJECT * * HW DEVICE BUSY BECAUSE LIFTS ARE DOWN * (DELAY AND TRY ORDER AGAIN) * REC130 EQU * LDR A1,A6 SAVE DWT ADDRESS CF A15,SETIME DATA BSYTUT,TIME1S ST A4,DWTDEV+DWTTP1,A6 SAVE TIMER POINTER ABL LDISP DISPATCH EJECT * * STORE = SUBROUTINE TO STORE CHARACTER * IN ECB-BUFFER AND INCREMENT BUFFER-INDEX * * ENTRY : DWTTAB = CONTROL TABLE (=0 MEANS NO CONTROL ) * A3 = CHARACTER TO STORE * A4 = USER BUFFER INDEX * DWTNCR = NUMBER OF CHARCTERS RECEIVED * DWTCNB = OLD CASSETTE NUMBER * * EXIT : DWTTAB = NOT CHANGED * A3 = CHANGED IF CASSETTE NUMBER TO '0' * A4 = A4 + 1 IF CHARACTER NOT FILTERED WITH CONTROL TABLE * DWTNCR = DWTNCR + 1 * DWTCNB = NEW CASSETTE NUMBER * STORE EQU * LD A7,DWTDEV+DWTTAB,A6 RF(Z) STO105 NO TABLE AD A7,-2,A7 POINTER TO END OF TABLE LD A2,DWTDEV+DWTNCR,A6 NUMBER OF CHARACTERS RECEIVED STO100 EQU * CCR A2,A7 RF(E) STO110 CHARACTER FOUND IN TABLE,DON'T STORE IT SUK A7,1 UPDATE TABLE POINTER CW A7,DWTDEV+DWTTAB,A6 RB(NL) STO100 NOT END OF TABLE * * STORE IT IN USER BUFFER AND INCREMENT A4 * STO105 EQU * CF A5,STCHAR STORE CHARACTER IN USER BUFFER RF STO140 EJECT * * CHECK IF SOME CASSETTE IS MISSING * STO110 EQU * LC A2,DWTOR+1,A6 ORDER CODE SUK A2,OPEN RF(NZ) STO140 NOT OPEN ORDER ANK A7,1 EVEN ADDRESS ? (=ADDRESS TO BYTE NUMBER * OF MESSAGE BYTE CONTAINING CASS NBR) RF(NZ) STO140 NO. NOT CASSETTE NUMBER BUT CASS STAT * * RESET CASSETTES NOT IN SEQUENCE * CASSETTE NUMBER IN A3 * RESCAS EQU * LD A2,DWTDEV+DWTCNB,A6 OLD CASSETTE NUMBER ST A3,DWTDEV+DWTCNB,A6 NEW CASSETTE NUMBER SUR A3,A2 LDK A2,0 SUK A3,1 RF(NP) STO140 CASSETTES IN SEQUENCE STO120 EQU * ADK A2,5 SUK A3,1 RB(P) STO120 MORE CASSETTES TO RESET LDK A3,'0' STO130 EQU * CF A5,STCHAR STORE CHARACTER SUK A2,1 RB(P) STO130 RESET NOT FINISHED STO140 EQU * IM DWTDEV+DWTNCR,A6 NUMBER OF CHARACTERS RECEIVED RTN A5 EJECT * *STORE CHARACTER IN USER BUFFER * * ENTRY : A4 = INDEX IN USER BUFFER * A3 = CHARACTER TO STORE * * EXIT : A4 = A4 + 1 * A3 = NOT CHANGED * A7 = IRRELEVANT * STCHAR EQU * CW A4,ECBRL,A8 RF(NL) STC110 TOO SMALL USER BUFFER LD A7,ECBBA,A8 BUFFER ADDRESS ADR A7,A4 ADD BUFFER INDEX SCR A3,A7 STORE CHARACTER STC100 EQU * ADK A4,1 RTN A5 * * USER BUFFER TOO SMALL * STC110 EQU * LDKL A7,REQERR REQUEST ERROR ORS A7,DWTDEV+DWTSTA,A6 SET RETURN CODE RB STC100 EJECT * * SUBROUTINE TO TEST DISPENSE REQUEST ERROR * * ENTRY: A8 = ECB-ADDRESS * * EXIT: A1,A2,A3 = IRRELEVANT IF REQUEST ERROR * A1=/8000 AND JUMP TO ENDIO * DSRQTS EQU * LD A7,ECBBA,A8 BUFFER ADDRES LD A3,ECBRL,A8 REQUESTED LENGTH DSR100 EQU * CF A5,CASTST TEST CASSETTE DATA SUK A3,5 RB(P) DSR100 NEXT CASSETTE RF(N) CST110 REQUEST ERROR RTN A5 EJECT * * SUBROUTINE TO TEST CASSETTE DATA * * ENTRY: A7 = BUFFER POINTER * * EXIT: A7 = A7 + 5 * A2 = IRRELEVANT * A1 = IRRELEVANT OR /8000 AND JUMP TO ENDIO * CASTST EQU * ADK A7,2 LDK A1,2 INTERN INDEX CST100 EQU * LCR A2,A7 ANK A2,/FF CHARACTER TO TEST SUK A2,/30 RF(N) CST110 REQUEST ERROR SUK A2,9 RF(P) CST110 REQUEST ERROR ADK A7,1 SUK A1,1 RB(NN) CST100 NEXT CHARACTER RTN A5 * * REQUEST ERROR * CST110 EQU * ABL LENDER END