|
|
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: 17258 (0x436a)
Notes: pts_type(SC)
Names: »DRTW01.SC«
└─⟦5c22ed822⟧ Bits:30009675 Philips computer tape "600209"
└─⟦this⟧ »M:DENJ/DRTW01.SC«
└─⟦bf903a231⟧ Bits:30009665 Philips computer tape "600109"
└─⟦this⟧ »M:DENJ/DRTW01.SC«
IDENT DRTW01 REL 10.0 80-03-14 870105041000 ************************************************** * * PHILIPS TERMINAL SYSTE PTS * * DRTW01 = DRIVER TYPEWRITER PTS 6862 * * * * * * ************************************************** * * THIS DRIVER HANDLES INPUT AND OUTPUT TO TYPEWRITERS * PTS 6862 * * EJECT * * *********** * ENTRIES * *********** * ENTRY TWAD ADDRESS BLOCK ENTRY IHTW ENTRY TWON ENTRY DWTW01 * ************* * EXTERNALS * ************* * EXTRN DISIOE REQUEST ERROR EXTRN TDISP DISPATCH EXTRN DISEND DISPATCH AND ENDIO EXTRN SETIME SET TIME BEFORE TIME-OUT EXTRN SAVE8 SAVE REGISTERS A1-A8 ON STACK EXTRN DWTST STATUS EXTRN DWTBC BYTE COUNTER EXTRN DWTECB ECB ADDRESS EXTRN DWTOR DWT INDEX AND ORDER EXTRN DWTA3 SAVE AREA A3 EXTRN DWTA4 SAVE AREA A4 EXTRN DWTA5 SAVE AREA A5 EXTRN DWTSB1 STACK BASE 1 IN DWT EXTRN DWTSB2 STACK BASE 2 IN DWT EXTRN DWTTP TIMER POINTER EXTRN INTSAV SAVE AREA LAST INTRRUPT EXTRN PFPOST PWF POST PROCESSING FLAG EJECT * * ******************** * I/O-INSTRUCTIONS ******************** * * TWSTRT EQU /42C0 CIO-START TWHLT EQU /4280 CIO-HALT TWINR EQU /4A00 INPUT TWOTR EQU /4200 OUTPUT TWSST EQU /4AC0 SENSE STATUS * * EJECT * * ************* * CONSTANTS * ************* * * CR EQU /0D CARRIAGE RETURN LF EQU /0A LINE FEED LNGERR EQU /8 INCORRECT LENGTH TPERR EQU /2 THROUGHPUT ERROR TIME EQU 300 TIME BEFORE TIME-OUT * * ************************ * CONDITIONAL ASSEMBLY* ************************ * * X:A EQU 0 X:B EQU 0 X:C EQU 60 X:D EQU 10 X:E EQU 6 TIMOUT EQU X:A POWUP EQU X:B DVBLEN EQU X:C DVBKTB EQU X:D DEVIND EQU X:E CREDIT EQU 1 * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 1 * * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 0 * EJECT * * ********************* * 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 * DWTHP EQU START+/18 TWCLR EQU START+/15 TWEOF EQU START+/16 TWBSP EQU START+/14 DWTA2 EQU START+/1A DATA DVBKTB+DVBKTB MMU KEY TABLE SIZE DATA DVBLEN+DVBLEN MMU BUFFER SIZE DATA DEVIND DEVICE INDEX TWAD EQU * DATA TWA ACTIVATION PART DATA 0 ABORT ROUTINE ADDRESS EJECT * * * ACTIVATION PART: CHECK VALIDITY OF ORDERS * * TWA EQU * LDK A3,0 LD A2,4,A8 GET REQUESTED LENGTH ABL(Z) IHTW50 REQUESTED LENGTH =0 * * LDR A2,A7 COPY ORDER RF(NP) TWAERR REQUEST ERROR SUK A2,4 RF(Z) TWAERR REQUEST ERROR RF(N) TWAIN INPUT REQUEST SUK A2,2 RF(NP) TWAOUT OUTPUT REQUEST * * TWAERR ABL DISIOE REQUEST ERROR EJECT * * TWAIN EQU * IFT TIMOUT=1 LD A2,DWTTP,A6 GET TIMER POINTER RF(Z) TWA010 NO TIMING ON THIS DEVICE LDR A1,A6 SAVE DWT-ADDRESS CF A15,SETIME DATA TWTUT,TIME ST A4,DWTTP,A6 SAVE TIMER BLOCK-ADDRESS XIF TWA010 EQU * IFT POWUP=1 LD A2,DWTST,A6 GET DWT-STATUS ANKL A2,/200 RF(Z) TWA020 NOT FIRST READ AFTER POEWR UP XRS A2,DWTST,A6 RESET POINTER LDKL A2,-2 ST A2,10,A8 INDICATE POWER UP ABL IHTW35 PERFORM ENDIO XIF TWA020 LDK A2,/21 * * READ CF A5,STRTIO EXECUTE CIO-START RF RED030 RED020 CF A5,STREG SAVE REGISTERS EJECT * * RETURN AFTER INTERRUPT * * RED030 EQU * IFT TIMOUT=1 LDR A1,A1 RF(NZ) RED037 XIF SUK A7,1 RF(P) RED050 ORDERS 02/03 * * RED035 CF A5,STORE STORE CHARACTER IN BUFFER CW A3,4,A8 RB(L) RED020 GET NEXT CHARACTER LDR A7,A7 RF(Z) RED040 BASIC READ * * LDK A1,LNGERR OVERFLOW RED037 ORS A1,8,A8 SET RETURN CODE * * EJECT RED040 EQU * IFT TIMOUT=1 LD A7,DWTOR,A6 GET ORDER ANK A7,/FF MASK ORDER CWK A7,4 RF(G) RED045 WRITE ORDER LD A4,DWTTP,A6 TIMER POINTER RF(Z) RED045 NO TIMIMG ON THIS DEVICE CM* DWTTP,A6 RESET TIMER XIF RED045 EQU * CF A5,HLTIO EXECUTE CIO-HALT ABL IHTW40 PERFORM TENDIO EJECT * * * * ORDERS 02,03 * * RED050 EQU * LD A1,10,A8 GET CONTROL WORD RF(Z) RED080 NO KEYTABLE LCR A4,A1 GET NUMBER OF KEYS ANK A4,/FF ADR A1,A4 ADDRESS TO LAST KEY ADK A1,1 RED060 SUK A4,1 RF(N) RED080 KEY NOT IN KEYTABLE SUK A1,1 DECREMENT ADDRESS CCR A2,A1 CHECK IF IN KEYTABLE RB(NE) RED060 NOT IN KEYTABLE ADR A4,A4 DOUBLE INDEX ST A4,10,A8 STORE INDEX IN CONTROL WORD RED070 CF A5,STORE STORE KEY IN KEYTABLE RB RED040 EXECUTE CIO-HALT RED080 CC A2,TWEOF,A6 RB(E) RED070 STANDARD EOR-KEY CC A2,TWBSP,A6 RF(E) RED110 BACKSPACE CC A2,TWCLR,A6 RF(E) RED110 CLEAR EJECT * * * CHARACTER NOT FOUND IN KEYTABLE * * * RED090 LDR A4,A2 COPY CHARACTER ANK A4,/FF MASK LDR A1,A7 SUK A1,1 RF(Z) RED100 ORDER 02 SUK A4,/30 ORDER 03 RF(N) CODERR LESS THAN /30 SUK A4,/9 RF(P) CODERR GREATER THAN /39 RF RED110 * * RED100 SUK A4,/20 RF(N) CODERR LESS THAN /20 SUK A4,/3F RF(NP) RED110 CORRECT CHARACTER * * CODERR LDK A1,4 CODE CHECK ERROR ORS A1,8,A8 CF A5,STORE STORE CHARACTER IN ECB-BUFFER RB RED040 EXECUTE CIO-HALT * * EJECT * * * RED110 CC A2,TWBSP,A6 RF(E) RED120 BACKSPACE CC A2,TWCLR,A6 RB(NE) RED035 * * LDK A3,0 CLEAR ECB-BUFFER RB RED020 GET NEXT CHARACTER * * RED120 SUK A3,1 BACKSPACE RB(NN) RED020 GET NEXT CHARACTER ADK A3,1 RB RED020 GET NEXT CHARACTER * * * EJECT * * * W R I T E * * ORDERS 05 AND 06: BASIC AND STANDARD WRITE * * WRITE EQU * TWAOUT EQU * INH LDK A4,0 LDK A2,0 CF A5,STRTIO EXECUTE CIO-START * * CWK A7,5 RF(Z) WRT050 ORDER 05 * * LD A3,2,A8 GET BUFFER ADDRESS LC A3,1,A3 CONTROL CHARACTER ANK A3,/FF SUK A3,/2B RF(Z) WRT030 NO CR OR LF * * ST A4,DWTHP,A6 HEAD POSITION INDICATOR LDK A4,2 LDK A2,CR SEND CARRIAGE RETURN EJECT * * * WRT010 CF A5,OTR SEND CHARACTER * * SUK A4,1 RF(NP) WRT020 WRT015 LDK A2,LF SEND LF RB WRT010 * WRT020 SUK A3,5 RB(Z) WRT015 SEND SECOND LF SUK A3,1 RF(NZ) WRT030 LDK A2,/0C SEND FORM FEED RB WRT010 WRT030 LDK A3,2 BUFFER POINTER RF WRT050 GET CHARACTER * * * WRT040 EQU * CF A5,OTR SEND CHARACTER IM DWTST,A6 INCREMENT BYTE COUNTER EJECT * * * WRT050 CF A5,GETCHR GET CHARACTER FROM ECB-BUFFER LDR A1,A1 RB(Z) RED040 LAST CHARACTER CWK A7,5 RB(Z) WRT040 BASIC WRITE * * LDR A1,A2 ORDER 06: STANDARD WRITE ANK A1,/FF SUK A1,/07 RB(Z) WRT040 BELL * SUK A1,/A RF(E) WRTTAB TABULATION * SUK A1,/F RF(L) ERRCOD LESS THAN /20 SUK A1,/3F RB(NP) WRT040 BETWEEN /20-/5F SUK A1,/20 RF(NP) WRT060 BETWEEN /60-/7F * * ERRCOD LDK A1,4 ORS A1,8,A8 RB WRT050 GET NEXT CHARACTER * * WRT060 SUK A2,/20 RB WRT040 * * EJECT * * * T A B U L A T I O N * * WRTTAB EQU * CF A5,GETCHR GET FIRST TAB.POSITION CHARACTER LDR A4,A2 COPY CF A5,GETCHR GET SECOND TAB. POSITION CHARACTER ANK A2,/F ANK A4,/F RF(Z) TAB020 TAB010 ADK A2,/A SUK A4,1 RB(NZ) TAB010 * TAB020 SU A2,DWTHP,A6 LC A4,DWTBC,A6 GET NUMBER OF OUTPUT CHARACTERS SUR A2,A4 NUMBER OF SPACES TO BE SENT RB(NP) WRT050 NO SPACES SHOULD BE SENT LDR A4,A2 TAB030 LDK A2,/20 SEND BALNKS TAB040 CF A5,OTR SEND CHARACTER IM DWTST,A6 INCREMENT BYTE COUNTER SUK A4,1 RB(NZ) TAB030 SEND ANOTHER SPACE LDR A3,A3 RB(NZ) WRT050 NOT RECOVERY SC A4,DWTBC,A6 RESET BYTE COUNTER LDK A3,2 PRESET BUFFER INDEX RB WRT050 GET NEXT CHARACTER EJECT * * * RECOVERY ROUTINE * * * TWON 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,DWTW01 GET DWT-ADDRESS IFT POWUP=1 LDKL A1,/200 ORS A1,DWTST,A6 INDICATE POWER UP XIF LD A1,DWTST,A6 RF(N) EXIT DEVICE NOT BUSY TWON10 LD A3,DWTA3,A6 LD A7,DWTOR,A6 GET ORDER ANK A7,/FF LD A8,DWTECB,A6 ECB-ADDRESS LDKL A5,DWTSB2 ADR A5,A6 GET STACK BASE SUK A7,4 ABL(N) TWA010 ORDERS 01,02,03 SUK A7,1 RF(Z) TWON20 ORDER 05 INH LDK A2,0 CF A5,STRTIO EXECUTE CIO-START LDK A2,CR LDK A3,0 LD A4,DWTHP,A6 ADK A4,1 RB TAB040 REPRINT LAST REQUEST * TWON20 LDK A1,TPERR ORDER 05 ABL DISEND * * EJECT * * * I H T W * * INTERRUPT HANDLER: PROCESS OF INTERRUPT * * IHTW EQU * ST P,INTSAV 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,DWTW01 LDREG EQU * LD A3,DWTST,A6 RF(N) SKIP DEVICE NOT BUSY IHTW10 LDR* A2,A6 GET DEVICE ADDRESS ORKL A2,TWSST EXR A2 EXECUTE SST RF(A) IHTW30 ENDIO LD A7,DWTOR,A6 GET ORDER ANK A7,/FF SUK A7,4 RF(P) IHTW30 LDR* A2,A6 GET DEVICE ADDRESS ORKL A2,TWINR EXR A2 EXECUTE INR ANK A2,/7F MASK INPUT-CHARACTER EJECT * IFT TIMOUT=1 LD A1,DWTTP,A6 GET TIMER POINTER RF(Z) IHTW30 NO TIMING ON THIS DEVICE LDKL A1,-TIME ST* A1,DWTTP,A6 XIF * * IHTW30 LDK A1,0 RF LDREGE RESTORE REGISTERS IHTW35 EQU * IFT POWUP+TIMOUT=2 LD A1,DWTTP,A6 TIMER POINTER RF(Z) IHTW40 NO TIMING ON THIS DEVICE CM* DWTTP,A6 RESET TIMER XIF EJECT * * IHTW40 EQU * * * IHTW50 ST A3,6,A8 SAVE EFFECTIVE LENGTH IHTW55 SUK A7,4 RF(NP) IHTW60 READ ORDER * * LC A3,DWTBC,A6 GET BYTE COUNTER ADS A3,DWTHP,A6 UPDATE HEAD POSITION LDK A3,0 SC A3,DWTBC,A6 CLEAR BYTE COUNTER * IHTW60 EQU * IFT CREDIT=1 LD A1,10,A8 CONVERT INDEX ADK A1,2 SRL A1,1 ST A1,10,A8 XIF LDK A1,0 ABL DISEND PERFORM TENDIO * * SKIP LDR* A2,A6 ORKL A2,TWSST EXR A2 SST RF(A) EXIT LDR* A2,A6 ORKL A2,TWHLT EXR A2 CIO HALT RF EXIT EJECT * * * * I/O COMMANDS * * STRTIO LDKL A1,TWSTRT EXECUTE CIO-START RF EXECIO HLTIO LDKL A1,TWHLT CIO-HALT RF EXECIO OTR LDKL A1,TWOTR OTR * * EXECIO LD A7,PFPOST RF(NZ) STREG PFINIT PENDING ORR* A1,A6 GET I/O-COMMAND EXR A1 EXECUTE COMMAND RF(NA) HALT STREG EQU * LDKL A1,/100 ORS A1,DWTST,A6 INDICATE INTERRUPTS ALLOWED ST A3,DWTA3,A6 SAVE REGISTER A3 ST A4,DWTA4,A6 A4 ST A5,DWTA5,A6 A5 EXIT ABL TDISP HALT ST A2,DWTA2,A6 CF A5,HLTIO EXECUTE CIO-HALT LD A2,DWTA2,A6 RB STRTIO RESTART REQUEST * * EJECT * * * * STORE CHARACTER IN ECB-BUFFER * * STORE LD A4,2,A8 GET BUFFER ADDRESS ADR A4,A3 GET CHARACTER ADDRESS SCR A2,A4 STORE CHARACTER ADK A3,1 INCREMENT BUFFER INDEX RTN A5 * * * IFT TIMOUT=1 * * * TIMOUT ROUTINE * * TWTUT EQU * LDR A6,A1 GET DWT-ADDRESS LDK A1,/40 TIME OUT RETURN CODE XIF * * EJECT * * * L D R E G E * * RESTORE A3-A5 FROM DWT AND RETURN TO USER VIA A5 * * LDREGE EQU * LD A3,DWTA3,A6 RELOAD REGISTER A3 LD A4,DWTA4,A6 A4 LD A5,DWTA5,A6 A5 LD A7,DWTOR,A6 ANK A7,/FF LD A8,DWTECB,A6 RTN A5 RETURN VIA A5-STACK EJECT * * * G E T C H R * * SUBROUTINE TO GET ONE CHARACTER FROM ECB-BUFFER * * ON ENTRY: * * A3 = BUFFER INDEX * A8 = ECB-ADDRESS * * ON EXIT: * * A2 = CHARACTER * A1 = 0 IF LAST CHARACTER ELSE # 0 * * IF LAST CHARACTER IS REACHED A3 IS STORED IN ECB EFFECTIVE LENGTH * * GETCHR EQU * LD A1,4,A8 REQUESTED LENGTH SUR A1,A3 RF(NP) GCH010 LAST CHARACTER REACHED LD A1,2,A8 GET BUFFER ADDRESS ADR A1,A3 LCR A2,A1 CHAR. TO A2 ANK A2,/FF ADK A3,1 INCREMENT BUFFER INDEX RTN A5 GCH010 ST A3,6,A8 STORE EFFECTIVE LENGTH RTN A5 EJECT * * DEVICE WORK TABLE FOR TYPEWRITER * * DWTW01 EQU * TABLE ENTRY DATA /0010 CHANNEL PARAMETER DATA /8000 STATUS./8000 MEANS DEVICE READY DATA 0 ECB ADDRESS DATA 0 ORDER DATA TWAD POINTER TO ADDRESS BLOCK DATA 0 TTAB-ADDRESS 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 SAVE AREA FOR A3 DATA 0 SAVE AREA FOR A4 DATA 0 SAVE AREA FOR A5 RES 4 STACK BASE DATA 1 TIMER POINTER DATA 0 ECHO DEVICE DATA /5F5E LEFT BYTE BACKSPACE KEY RIGHT BYTE CANCEL KEY DATA /0D00 LEFT BYTE STANDARD EOR RIGHT BYTE DOUBLE ZERO DATA 0 HEAD POSITION POINETR DATA 0 SAVE AREA FOR A2 * EJECT DRTW01 * * IFT MMUPAG=1 DEVECB EQU * DATA 0 DATA TW:BUF DATA 0,0,0,0 RES DVBKTB+1 TW:BUF RES DVBLEN+1 XIF * * * END