|
|
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: 52716 (0xcdec)
Notes: pts_type(SC)
Names: »TOSSIO.SC«
└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
└─⟦this⟧ »M:DE10/TOSSIO.SC«
└─⟦this⟧ »M:TU10/TOSSIO.SC«
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
└─⟦this⟧ »M:DE10/TOSSIO.SC«
└─⟦this⟧ »M:TU10/TOSSIO.SC«
IDENT TOSSIO REL 10.0 80-04-30 870105041000 REL 10.0 80-03-15 POHO =1,RELEASE DC-BUFFER UPDATED * * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * TOSSIO = TOSS I/O LKM PROCESSOR * * * ************************************************** * * * THIS IS THE TOSS I/O LKM PROCESSOR. * IT CONTAINS THE FOLLOWING MONITOR SUBROUTINES: * * -TIO INITIALIZE I/O * * -TENDIO END I/O * * -ATTACH ATTACH DEVICE * * -DETACH DETACH DEVICE * * -DC:MIN DATA COMMUNICATION MOVE ROUTINE (READ) * * -DC:MOT DATA COMMUNICATION MOVE ROUTINE (WRITE) * * SPECIAL ROUTINES ARE CARRIED OUT IN SYSTEMS * WITH MEMORY MANAGEMENT UNIT (MMU). * * THIS MODULE ALSO CONTAINS STANDARD DISPLACEMENT * VALUES FOR ECB, DWT AND DAB AREAS. * EJECT TOSSIO * * *********** * ENTRIES * *********** * * ENTRY TIO I/O PROCESSOR ENTRY TIO:FM ENTRY USED BY FILE MANAGEMENT ENTRY TIOERR ERROR: QUEUE TASK AND DISPATCH ENTRY TENDIO END I/O ENTRY QUEDEV QUEUE REQUEST IN DEVICE QUEUE ENTRY QUEFIL QUEUE FILE REQUEST IN DEVICE QUEUE ENTRY DC:MIN MOVE ROUTINE FOR DATACOM, INPUT ENTRY DC:MOT MOVE ROUTINE FOR DATACOM, OUTPUT ENTRY MONMMU MONITOR (SYSTEM) MMU TABLE * ENTRY ECBFC FILE CODE ENTRY ECBBA BUFFER ADDRESS ENTRY ECBRL REQUESTED LENGTH ENTRY ECBEL EFFECTIVE LENGTH ENTRY ECBRC RETURN CODE ENTRY ECBCW CONTROL WORD ENTRY ECBCW1 CONTROL WORD 1 ENTRY ECBCW2 CONTROL WORD 2 * ENTRY DC:DIX DEVICE INDEX DATA COMMUNICATION ENTRY DM:DIX DEVICE INDEX DATA MANAGEMENT ENTRY PC:DIX DEVICE INDEX PROGRAMMED CHANNEL ENTRY MX:DIX DEVICE INDEX MULTIPLEX CHANNEL ENTRY KB:DIX DEVICE INDEX KEYBOARD/CTW ENTRY IT:DIX DEVICE INDEX INTERTASK COMMUNICATION ENTRY DK:DIX DEVICE INDEX DISC * ENTRY BUFLEN MMU BUFFER LENGTH * EJECT TOSSIO * * ENTRY ACTADR ACTIVATION ADDRESS ENTRY ABTADR ABORT ADDRESS ENTRY INTADR INTERRUPT ADDRESS ENTRY POLADR BUFFER POOL ADDRESS (DC DRIVERS) ENTRY HDRLEN BUFFER HEADER LENGTH (DC DRIVERS) ENTRY RECADR RECOVERY ADDRESS ENTRY ECHADR ECHO ADDRESS ENTRY DWTCHP CHANNEL PARAMETERS ENTRY DWTST STATUS ENTRY DWTBC BYTE COUNTER ENTRY DWTECB ECB ADDRESS ENTRY DWTOPT ORDER OPTION ENTRY DWTOR INDEX AND ORDER ENTRY DWTOCH LAST OUTPUT CHARACTER ENTRY DWTADR DRIVER ADDRESS BLOCK ENTRY DWTTAB TTAB ADDRESS ENTRY DWTWAT WAIT/ACTIVATE INDICATOR ENTRY DWTTQ TERMINAL QUEUE ENTRY DWTOTQ OUTPUT QUEUE LINK ENTRY DWTUEC USER ECB ADDRESS ENTRY DWTMEC MMU ECB ADDRESS ENTRY DWTA2 SAVE AREA A2 ENTRY DWTA3 SAVE AREA A3 ENTRY DWTA4 SAVE AREA A4 ENTRY DWTA5 SAVE AREA A5 ENTRY DWTSB1 STACK BASE 1 IN DWT ENTRY DWTSB2 STACK BASE 2 IN DWT ENTRY DWTTP TIMER POINTER ENTRY DWTECH ECHO DEVICE DWT ENTRY DWTSQ START OF QUEUE ENTRY DWTORD SAVE AREA INDEX AND ORDER ENTRY DWTNVL NEW VOLUME LOADED FLAGS ENTRY DWTVOL DISC VOLUME NAME * EJECT TOSSIO * * ************* * EXTERNALS * ************* * * EXTRN SAVE8 SAVE 8 REGISTERS EXTRN IHRET8 RESTORE 8 REGISTERS AND RETURN EXTRN IHRTN RETURN WITHOUT ENABLING INTERRUPTS EXTRN ACTOTP ACTIVATE TERMINAL (LIFO) EXTRN FNDDWT SEARCH DWT EXTRN QTJOB QUEUE TASK FOR DISPATCHING EXTRN TDISP DISPATCHER EXTRN DISEND BRANCH TO DISPATCHER VIA TENDIO EXTRN LKMQDI QUEUE TASK AND DISPATCH EXTRN GETBLK PUT BLOCK IN PENDING QUEUE EXTRN FREBLK RELEASE BLOCK FROM PENDING QUEUE EXTRN SETIMP SET TIMER EXTRN TTB:ID TASK IDENTIFICATION EXTRN TTB:ST TASK STATUS AND LEVEL EXTRN TTB:PW PROGRAM STATUS WORD EXTRN TTB:SA SAVE AREA EXTRN TTB:MT MMUTAB * EJECT TOSSIO * * ***************************************** * * CONDITIONAL ASSEMBLY * ***************************************** * * 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 * * * A PROGRAM VERSION INCLUDING ATTACH/DETACH * IS OBTAINED BY SETTING ATTDET EQU 1. * X:A EQU 0 ATTDET EQU 1 * * * A PROGRAM VERSION SPECIALIZED FOR THE 857 CPU * IS OBTAINED BY SETTING CPU857 EQU 1. * X:B EQU 0 CPU857 EQU X:B * EJECT TOSSIO * * ******************* * FORM STATEMENTS * ******************* * * BYTES FORM 8,8 * EJECT TOSSIO * * ********************* * DWT DISPLACEMENTS * ********************* * * DEVICE WORK TABLE DISPLACEMENTS: FIXED PART * DWTCHP EQU /00 CHANNEL PARAMETERS DWTST EQU /02 STATUS DWTBC EQU /03 BYTE COUNTER DWTECB EQU /04 ECB ADDRESS DWTOPT EQU /06 ORDER OPTION DWTOR EQU /06 INDEX AND ORDER DWTOCH EQU /06 LAST OUTPUT CHARACTER DWTADR EQU /08 DRIVER ADDRESS BLOCK DWTTAB EQU /0A TTAB ADDRESS DWTWAT EQU /0C WAIT/ACTIVATE INDICATOR DWTTQ EQU /0E TERMINAL QUEUE DWTUEC EQU /10 USER ECB ADDRESS DWTMEC EQU /12 MMU ECB ADDRESS * IFT MMUPAG=0 DWTDRD EQU DWTTQ+2 START OF DRIVER DEFINED PART XIF * IFT MMUPAG=1 DWTDRD EQU DWTMEC+2 START OF DRIVER DEFINED PART XIF * EJECT TOSSIO * * DWT DISPLACEMENTS: DRIVER DEFINED PART * DWTOTQ EQU DWTDRD+/00 OUTPUT QUEUE LINK DWTA2 EQU DWTDRD+/02 SAVE AREA A2 DWTA3 EQU DWTDRD+/02 SAVE AREA A3 DWTA4 EQU DWTDRD+/04 SAVE AREA A4 DWTA5 EQU DWTDRD+/06 SAVE AREA A5 DWTSB1 EQU DWTDRD+/0A STACK BASE 1 IN DWT DWTSB2 EQU DWTDRD+/0E STACK BASE 2 IN DWT DWTTP EQU DWTDRD+/10 TIMER POINTER DWTORD EQU DWTDRD+/10 SAVE AREA INDEX AND ORDER DWTNVL EQU DWTDRD+/12 NEW VOLUME LOADED FLAGS DWTECH EQU DWTDRD+/12 ECHO DEVICE DWT DWTVOL EQU DWTDRD+/1A DISC VOLUME NAME DWTSQ EQU DWTDRD+/1C START OF QUEUE * EJECT TOSSIO * * ********************* * DAB DISPLACEMENTS * ********************* * * DRIVER ADDRESS BLOCK DISPLACEMENTS * KEYLEN EQU -6 DWT KEYTABLE LENGTH BUFLEN EQU -4 DWT BUFFER LENGTH DEVIND EQU -2 DEVICE INDEX ACTADR EQU 0 ACTIVATION ADDRESS ABTADR EQU 2 ABORT ADDRESS INTADR EQU 4 INTERRUPT ADDRESS POLADR EQU 4 BUFFER POOL ADDRESS (DC DRIVERS) HDRLEN EQU 6 BUFFER HEADER LENGTH (DC DRIVERS) RECADR EQU 6 RECOVERY ADDRESS ECHADR EQU 8 ECHO ADDRESS * * *********************** * DEVICE INDEX VALUES * *********************** * * * THE VALUES ARE USED IN MMU SYSTEMS FOR SELECTING A SPECIAL ROUTINE * FROM ADDRESS TABLES TIOTAB AND TENTAB AT READ/WRITE REQUESTS. * DC:DIX EQU -2 DATA COMMUNICATION DM:DIX EQU 0 DATA MANAGEMENT PC:DIX EQU 2 PROGRAMMED CHANNEL MX:DIX EQU 4 MULTIPLEX CHANNEL KB:DIX EQU 6 KEYBOARD/CTW IT:DIX EQU 8 INTERTASK COMMUNICATION DK:DIX EQU 10 DISC * EJECT TOSSIO * * ********************* * ECB DISPLACEMENTS * ********************* * * EVENT CONTROL BLOCK DISPLACEMENTS * ECBFC EQU /01 FILE CODE ECBBA EQU /02 BUFFER ADDRESS ECBRL EQU /04 REQUESTED LENGTH ECBEL EQU /06 EFFECTIVE LENGTH ECBRC EQU /08 RETURN CODE ECBCW EQU /0A CONTROL WORD ECBCW1 EQU /0A CONTROL WORD 1 ECBCW2 EQU /0C CONTROL WORD 2 * EJECT TOSSIO * * IFT MMUPAG=1 * * ********** * TIOTAB * ********** * * TIOTAB CONTAINS ADDRESSES TO ROUTINES ENTERED FROM TIO * TIOTAB EQU * DEVICE TYPE/ROUTINE ADDRESS TABLE DATA TIO:DM DATA MANAGEMENT, INPUT/OUTPUT DATA TIOPCI PROGRAMMED CHANNEL, INPUT DATA TIOMXI MUX, INPUT DATA TIOKBI KEYBOARD/CTW, INPUT DATA TIOITI INTERTASK COMMUNICATION, INPUT * TINDEX EQU *-TIOTAB DATA TIODKI DISC, INPUT DATA TIOPCO PROGRAMMED CHANNEL, OUTPUT DATA TIOMXO MUX, OUTPUT DATA TIOKBO KEYBOARD/CTW, OUTPUT DATA TIOITO INTERTASK COMMUNICATION, OUTPUT DATA TIODKO DISC, OUTPUT * EJECT TOSSIO * * ********** * TENTAB * ********** * * TENTAB CONTAINS ADDRESSES TO ROUTINES ENTERED FROM TENDIO * TENTAB EQU * DEVICE TYPE/ROUTINE ADDRESS TABLE DATA TEN:DM DATA MANAGEMENT, INPUT/OUTPUT DATA TENPCI PROGRAMMED CHANNEL, INPUT DATA TENMXI MUX, INPUT DATA TENKBI KEYBOARD/CTW, INPUT DATA TENITI INTERTASK COMMUNICATION, INPUT DATA TENDKI DISC, INPUT DATA TENPCO PROGRAMMED CHANNEL, OUTPUT DATA TENMXO MUX, OUTPUT DATA TENKBO KEYBOARD/CTW, OUTPUT DATA TENITO INTERTASK COMMUNICATION, OUTPUT DATA TENDKO DISC, OUTPUT XIF * EJECT TOSSIO * * ********** * MONMMU * ********** * * MONITOR (SYSTEM) MMU TABLE * MONMMU EQU * IFT MMUPAG=1 DATA /0000,/0400,/0800,/0C00 DATA /1000,/1400,/1800,/1C00 DATA /2000,/2400,/2800,/2C00 DATA /3000,/3400,/3800,/3C00 XIF * EJECT TOSSIO * * IFT ATTDET=1 * * SUBROUTINES BELOW ARE USED BY ATTACH/DETACH * * T I M O U T * * INPUT: A1 = DWT ADDRESS * A2 = ADDRESS TO 2ND TIMER BLOCK * * OUTPUT: A4 = BLOCK ADDRESS * A5 = TTAB ADDRESS * A6 = DWT ADDRESS * A1-A3 ARE DESTROYED * TIMOUT LDR A6,A1 LDR* A2,A2 TIMER POINTER ADDRESS LD A5,2,A2 TTAB ADDRESS CF A15,FNDBLK LDR* A1,A4 STR A1,A2 REMOVE FROM ATT:CH CF A15,FREBLK * EJECT TOSSIO * * REMOVE TTAB FROM DEVICE QUEUE * LDR A1,A6 ADK A1,DWTTQ QUEUE ANCHOR ADDRESS * TIM:10 LDR A2,A1 SAVE LDR* A1,A1 NEXT IN QUEUE RF(Z) TIM:20 END OF QUEUE CWR A1,A5 RB(NE) TIM:10 NOT FOUND * EJECT TOSSIO * * TTAB FOUND - REMOVE FROM QUEUE * LDR* A1,A1 STR A1,A2 * TIM:20 EQU * LDK A3,4 ADS A3,TTB:SA,A5 UPDATE DISPATCH ADDRESS LD A8,TTB:SA+16,A5 ECB ADDRESS FROM A8 SAVE AREA LDK A3,/40 SET TIMEOUT BIT * IFT MMUPAG=0 ST A3,ECBRC,A8 INDICATE ERROR IN ECB XIF * IFT ATTDET=1 IFT MMUPAG=1 TL TTB:MT,A5 LOAD MMU REGISTERS FROM TTAB ES A3,ECBRC,A8 INDICATE ERROR IN ECB TL MONMMU LOAD MONITOR (SYSTEM) MMU TABLE XIF * IFT ATTDET=1 RF TIORTN QUEUE TASK AND DISPATCH * EJECT TOSSIO * * F N D B L K * * SUBROUTINE TO FIND BLOCK IN ATT:CH * * INPUT: A5 = TTAB ADDRESS * * OUTPUT: A2 = ADDRESS TO PRECEDING BLOCK IN CHAIN * A4 = BLOCK ADDRESS IF FOUND, ELSE 0 * FNDBLK LDKL A4,ATT:CH ANCHOR ADDRESS * FND:10 LDR A2,A4 SAVE A4 LDR* A4,A4 RF(Z) FND:20 END OF ATT:CH CW A5,4,A4 RB(NE) FND:10 NOT FOUND * FND:20 EQU * IFT CPU852=1 ABL IHRTN RETURN XIF * IFT ATTDET=1 IFT CPU852=0 RTN A15 RETURN XIF * IFT ATTDET=1 ATT:CH DATA 0 ATTACH CHAIN ANCHOR * EJECT TOSSIO * * ********** * ATTACH * ********** * * * THIS MODULE IS CALLED FROM TIO WITH * THE FOLLOWING PARAMETERS: * * A3 /8000 (REQUEST ERROR BIT) * A4 I/O AND ACTIVATE INDICATOR * A5 TTAB ADDRESS * A6 DWT ADDRESS * A7 ORDER CODE * A8 ECB ADDRESS * A10 /0800 (ATTACH BIT) * A12 ADDRESS TO DRIVER ADDRESS BLOCK * A13 DWT STATUS * ATTACH EQU * ENTRY ADK A4,0 SET CR RF(NZ) TIOERR I/O AND ACTIVATE ERROR * IFT MMUPAG=0 CM ECBRC,A8 RESET RETURN CODE XIF * IFT ATTDET=1 IFT MMUPAG=1 ES A4,ECBRC,A8 RESET RETURN CODE XIF * EJECT TOSSIO * * IFT ATTDET=1 TM A10,A13 RF(NZ) ATT:40 DEVICE ALREADY ATTACHED LDR A13,A13 RF(NN) ATT:50 DEVICE BUSY * * ATTACH REQUESTING TASK * ORS A10,DWTST,A6 ATTACH ST A5,DWTTAB,A6 PUT TTAB ADDRESS IN DWT CF A15,FNDBLK ANY TIMERS ACTIVE ADK A4,0 SET CR RF(Z) ATTRTN NO! * EJECT TOSSIO * * FREE BLOCK AND TIMER IN ATT:CH * CM* 2,A4 FREE TIMER LDR* A3,A4 REMOVE FROM ATT:CH STR A3,A2 CF A15,FREBLK RELEASE BLOCK RF ATTRTN END REQUEST * ATT:40 CW A5,DWTTAB,A6 RF(E) TIOERR ATTACHED TO REQUESTING TASK * ATT:50 CF A15,FNDBLK ADK A4,0 SET CR RF(NZ) ATT:70 IS TIMER ACTIVE * * SET TIMER * IFT MMUPAG=0 LD A1,ECBCW,A8 TIME XIF * EJECT TOSSIO * * IFT ATTDET=1 IFT MMUPAG=1 EL A1,ECBCW,A8 TIME XIF * IFT ATTDET=1 RF(N) TIOERR NEGATIVE TIME RF(Z) ATT:80 END REQUEST * ATT:60 ST A1,ATTIM LDR A1,A5 TTAB ADDRESS LD A3,ATT:CH ANCHOR CF A15,GETBLK BLOCK ST A4,ATT:CH UPDATE ANCHOR ADK A4,2 TIMER POINTER ADDRESS LDR A1,A6 DWT ADDRESS CF A15,SETIMP SET TIMER DATA TIMOUT * ATTIM DATA 0 * ATT:70 LDK A4,0 NOT ACTIVATION PARAMETER RF TIOQ20 * ATT:80 LDK A3,/40 SET TIME OUT BIT RF TIOERR RETURN * EJECT TOSSIO * * ********** * DETACH * ********** * * THIS MODULE IS CALLED FROM TIO WITH * THE SAME PARAMETERS AS ATTACH. * DETACH EQU * ADK A4,0 SET CR RF(NZ) TIOERR I/O AND ACTIVATE ERROR TM A10,A13 RF(Z) TIOERR NOT ATTACHED CW A5,DWTTAB,A6 RF(NE) TIOERR ATTACHED TO OTHER TASK XRS A10,DWTST,A6 DETACH LDR A3,A5 SAVE TTAB ADDRESS LD A5,DWTTQ,A6 QUEUE ANCHOR RF(Z) DET:10 QUEUE EMPTY LDR* A2,A5 UPDATE QUEUE ANCHOR ST A2,DWTTQ,A6 CF A15,QTJOB QUEUE TASK * DET:10 EQU * LDR A5,A3 RESTORE TTAB ADDRESS * ATTRTN EQU * COMMON ATTACH/DETACH NORMAL EXIT DETRTN LDK A3,0 RETURN CODE XIF * EJECT TOSSIO * * ********** * TIOERR * ********** * * ERROR: FILE CODE UNKNOWN * TIOERR IS ALSO USED AS COMMON EXIT * FOR MODULES 'ATTACH' AND 'DETACH'. * TIOERR EQU * IFT MMUPAG=0 ST A3,ECBRC,A8 SET RETURN CODE IN ECB CM ECBEL,A8 RESET EFFECTIVE LENGTH XIF * IFT MMUPAG=1 ES A3,ECBRC,A8 SET RETURN CODE IN ECB LDK A3,0 ES A3,ECBEL,A8 RESET EFFECTIVE LENGTH XIF * TIORTN EQU * ABL LKMQDI QUEUE TASK AND DISPATCH * EJECT TOSSIO * * **************** * QUEUE DEVICE * **************** * * * THIS IS THE ROUTINE FOR QUEUEING DEVICE REQUESTS. * THE ROUTINE IS ENTERED AT DIFFERENT LABELS DEPENDING ON * WHETHER THE DEVICE IS AN ECHO DEVICE OR NOT, AND DEPENDING * ON WHETHER THE DEVICE IS ATTACHED OR NOT, AND WHEN * ATTACHED, WHETHER THE DEVICE IS ATTACHED TO THE TASK OR NOT. * * QUEUE ECHO DEVICE FIRST * TIOQ00 LDR A6,A2 * * QUEUE DEVICE FIRST * TIOQ05 ADK A6,DWTTQ QUEUE ANCHOR LDR A2,A6 LDR* A6,A6 RF TIOQ40 INSERT FIRST IN QUEUE * TIOQ10 LDR A6,A2 QUEUE ECHO DEVICE * QUEDEV EQU * ENTRY USED BY FILE MANAGEMENT TIOQ20 ADK A6,DWTTQ QUEUE ANCHOR * QUEFIL EQU * ENTRY USED BY FILE MANAGEMENT LD A1,TTB:ST+1,A5 LEVEL * EJECT TOSSIO * * SEARCH QUEUE FOR PLACE OF INSERTION * TIOQ30 LDR A2,A6 LDR* A6,A6 FOLLOW QUEUE TO END RF(Z) TIOQ40 END FOUND CC A1,TTB:ST+1,A6 COMPARE LEVELS RB(NL) TIOQ30 TRY NEXT * * INSERT IN QUEUE AND UPDATE PROGRAM COUNTER * TIOQ40 LDKL A3,-4 STR A6,A5 INSERT IN QUEUE STR A5,A2 ADK A4,0 SET CR RF(Z) TIOQ50 NO ACTIVATION SUK A3,2 ACTIVATION * TIOQ50 ADS A3,TTB:SA,A5 UPDATE PC TO REPEAT LKM * TIOQ60 EQU * ABL TDISP GO TO DISPATCHER * EJECT TOSSIO * * ******* * TIO * ******* * * * THIS MODULE IS ENTERED WHEN TERMINAL I/O * IS REQUIRED. IF A REQUEST CANNOT BE SERVICED * DUE TO E.G. BUSY DEVICE, THE REQUEST IS QUEUED * AND THE TERMINAL PROGRAM SET IN WAIT STATE. * * WHEN RUNNING WITH MMU OPTION SPECIAL DEVICE * DEPENDENT SUBROUTINES ARE PERFORMED. * * THIS MODULE IS CALLED BY THE LKM HANDLING MODULE * WITH THE FOLLOWING PARAMETERS:- * * A1 = PARAMETER WHEN I/O AND ACTIVATION * * A4 = ZERO, NORMAL I/O REQUEST * NOT ZERO, I/O AND ACTIVATION * * A5 = TTAB ADDRESS * * A7 = ORDER CODE * * A8 = ECB ADDRESS * EJECT TOSSIO * * * THE 'TIO'-ROUTINE EXITS TO REQUESTED ACTIVATION DRIVER * WITH THE FOLLOWING REGISTER VAULES:- * * A5 = STACK BASE 2 IN DWT * * A6 = DWT ADDRESS * * A7 = ORDER CODE * * A8 = ECB ADDRESS * * A12 = ADDRESS TO DRIVER ADDRESS BLOCK * * A13 = 0, IF REQUEST ISSUED IN SYSTEM MODE * = 1, " " " " USER MODE * * * THE FOLLOWING DWT FIELDS ARE UPDATED:- * * -DWTOR DWT INDEX AND ORDER * -DWTECB ECB ADDRESS * -DWTST READY AND ECHO FIELDS * -DWTTAB TTAB ADDRESS * -DWTWAT WAIT/ACTIVATE INDICATOR * -DWTUEC USER ECB ADDRESS (MMU SYSTEMS) * * * THE FOLLOWING ECB FIELDS ARE RESET:- * * -BIT 0 IN THE FIRST WORD * -ECBEL EFFECTIVE LENGTH * -ECBRC RETURN CODE * EJECT TOSSIO * * DWT ADDRESS AND CHECK IF REQUEST IS BUSY * TIO CF A15,FNDDWT SEARCH DWT ADDRESS * TIO:FM EQU * ENTRY USED BY FILE MANAGEMENT CF A15,SWITCH SWITCH LEVEL INH LDKL A3,/8000 ADK A6,0 SET CR RB(Z) TIOERR FILE CODE UNKNOWN LD A12,DWTADR,A6 ADDRESS TO DRIVER ADDRESS BLOCK LD A13,DWTST,A6 DWT STATUS * EJECT TOSSIO * * CHECK IF ATTACH/DETACH ORDER OR IF DEVICE IS BUSY/ATTACHED * IFT ATTDET=1 LDKL A10,/0800 ATTACH BIT CCK A7,/BB00 RB(E) ATTACH ATTACH ORDER CCK A7,/BC00 RB(E) DETACH DETACH ORDER TM A10,A13 RF(Z) TIO020 NOT ATTACHED CW A5,DWTTAB,A6 RB(NE) TIOQ20 ATTACHED TO OTHER TASK TM A3,A13 RF(NZ) TIO030 DEVICE NOT BUSY RB TIOQ05 BUSY, QUEUE DEVICE XIF * TIO020 EQU * TM A3,A13 RB(Z) TIOQ20 DEVICE BUSY * EJECT TOSSIO * * CHECK IF ECHO, AND WHEN TRUE CHECK IF ECHO DEVICE IS BUSY/ATTACHED * TIO030 SC A2,DWTOR,A6 STORE DWT INDEX LDK A2,/40 CHECK IF ECHO ANR A2,A7 RF(Z) TIO070 NOT ECHO * LD A2,DEVIND,A12 DEVICE INDEX SUK A2,KB:DIX CHECK IF KEYBOARD RF(NZ) TIO070 ECHO NOT ALLOWED IF NOT KEYBOARD LD A2,DWTECH,A6 ECHO DEVICE DWT ADDRESS RF(Z) TIO070 NO ECHO DEVICE LD A14,DWTST,A2 ECHO DWT STATUS * IFT ATTDET=1 TM A10,A14 RF(Z) TIO050 ECHO DEVICE NOT ATTACHED CW A5,DWTTAB,A2 RB(NE) TIOQ10 ECHO DEVICE ATTACHED TO OTHER TASK TM A3,A14 RF(NZ) TIO060 ECHO DEVICE NOT BUSY RB TIOQ00 BUSY, QUEUE ECHO DEVICE XIF * EJECT TOSSIO * * TIO050 TM A3,A14 RB(Z) TIOQ10 ECHO DEVICE BUSY * TIO060 LDKL A3,/A000 XRS A3,DWTST,A2 UPDATE BUSY & ECHO BITS IN DWT STATUS * * UPDATE ECB AND DWT FIELDS * TIO070 XRS A3,DWTST,A6 UPDATE BUSY & ECHO BITS IN DWT STATUS * IFT MMUPAG=1 LD A13,TTB:PW,A5 PSW ANKL A13,1 SYSTEM/USER MODE BIT RF(NZ) TIO100 JUMP IF USER MODE LDKL A2,/7FFF ANRS A2,A8 RESET BIT 0 IN ECB FILE CODE ST A8,DWTECB,A6 SET ACTUAL ECB ADDRESS CM ECBEL,A8 RESET EFFECTIVE LENGTH CM ECBRC,A8 RESET RETURN CODE RF TIO110 * EJECT TOSSIO * * MOVE USER ECB TO DWT ECB * TIO100 EQU * LDKL A2,/4FFF ELR A3,A8 LOAD FIRST WORD OF USER ECB ANR A3,A2 RESET BITS 0,2,3 IN ECB FILE CODE ESR A3,A8 LD A2,DWTMEC,A6 DWT MMU ECB ADDRESS ST A2,DWTECB,A6 SET ACTUAL ECB ADDRESS STR A3,A2 ST A8,DWTUEC,A6 SAVE USER ECB ADDRESS LDR A9,A8 LDK A3,0 ES A3,ECBEL,A8 RESET EFFECTIVE LENGTH ES A3,ECBRC,A8 RESET RETURN CODE * LDR A10,A1 SAVE PARAMETER LDR A1,A8 ADK A1,ECBRL LDR A8,A2 SET A8 TO DWT ECB ADDRESS ADK A2,ECBRL LDK A3,8 MVUS A3 MOVE PART OF USER ECB TO DWT ECB LDR A1,A10 RESTORE PARAMETER XIF * IFT MMUPAG=0 LDKL A3,/7FFF ANRS A3,A8 RESET BIT 0 IN ECB FILE CODE CM ECBEL,A8 RESET EFFECTIVE LENGTH CM ECBRC,A8 RESET RETURN CODE XIF * EJECT TOSSIO * * TIO110 EQU * ECR A3,A7 ANK A3,/FF ORDER OPTION RF(Z) TIO120 NO SPECIAL OPTION IF ZERO SC A3,DWTOPT,A6 STORE OPTION IN DWT * TIO120 EQU * LDR A3,A7 ANK A7,/3F SC A7,DWTOR+1,A6 STORE ORDER IN DWT ST A5,DWTTAB,A6 SAVE TTAB ADDRESS IN DWTTAB * TIO130 EQU * IFT MMUPAG=0 ST A8,DWTECB,A6 SET ECB ADDRESS XIF * EJECT TOSSIO * * UPDATE DWTWAT (WAIT/ACTIVATE INDICATOR) * LDR A2,A4 CHECK PARAMETER RF(NZ) TIO210 I/O AND ACTIVATION ANK A3,/80 NORMAL I/O. CHECK IF WAIT REQUESTED RF(Z) TIO220 NOT WAIT LDK A4,1 INDICATE WAIT RF TIO230 * TIO210 CF A15,GETBLK SAVE PARAMETER AND DISPATCH ADDRESS * TIO220 CF A15,QTJOB QUEUE TASK FOR DISPATCHING * TIO230 ST A4,DWTWAT,A6 STORE WAIT/ACTIVATE INDICATOR * EJECT TOSSIO * * IFT MMUPAG=1 LDR A13,A13 CHECK IF SYSTEM/USER MODE RF(Z) TIO250 JUMP IF SYSTEM MODE LD A3,DEVIND,A12 DEVICE INDEX RF(N) TIO250 NO SPECIAL ACTION REQUIRED RF(Z) TIO240 DATA MANAGEMENT CWK A3,DK:DIX CHECK IF DISC RF(NE) TIO235 NOT DISC CF A15,TIOCW2 MOVE 2ND CONTROL WORD * * PERFORM CHECK ON ORDER CODE * TIO235 EQU * LDR A4,A7 ORDER CODE CF A15,RD:WR2 CHECK IF ORDER IS READ/WRITE RF(Z) TIO250 JUMP IF NO READ/WRITE ORDER * TIO240 EQU * ENB CFI A15,TIOTAB,A3 BRANCH TO RELEVANT READ/WRITE ROUTINE XIF * TIO250 ENB GIVE OTHER TASKS A CHANCE * TIO260 LDK A5,DWTSB2 LOAD STACK BASE 2 ADR A5,A6 INH ABR* A12 GO TO DRIVER ACTIVATION * EJECT TOSSIO * * ********** * SWITCH * ********** * * SWITCH PRIORITY LEVEL: * * IF CPU851, THEN SWITCH TO LEVEL 12 * IF CPU852, " " " " 16 * IF CPU857, " " " " 16 * * A3 IS DESTROYED, AND SO IS CR * SWITCH EQU * SWITCH LEVEL ON STACK IFT CPU852+CPU857=0 LDK A3,/30 CPU851: LEVEL 12 XIF * IFF CPU852+CPU857=0 LDK A3,/40 CPU852/CPU857: LEVEL 16 XIF * SC A3,2,A15 SET NEW LEVEL ON STACK RTN A15 RETURN WITH NEW LEVEL * EJECT TOSSIO * * IFT MMUPAG=1 * * R D : W R * * THIS MODULE IS CALLED BY 'TIO' AND 'TENDIO' FOR SELECTING * THE APPROPRIATE ROUTINE AT READ/WRITE REQUESTS, DEPENDING * ON THE DEVICE CONNECTION (PROGRAMMED CHANNEL, MUX ETX). * IF NO READ/WRITE REQUEST, CONDITION REGISTER ON STACK IS * SET TO ZERO, ELSE NOT EQUAL TO ZERO. * * INPUT: A3 = DEVICE INDEX * A6 = DWT ADDRESS * * OUTPUT: A3 = INDEX FOR USE IN THE INDEXED BRANCHING * CR = 0 IF NO READ/WRITE REQUEST * CR <> 0 IF READ/WRITE REQUEST * A4 IS DESTROYED * RD:WR LD A4,DWTOR,A6 ORDER CODE FROM DWT ANK A4,/3F * RD:WR2 ADKL A15,4 ADJUST STACKPOINTER LC A4,ORDTAB,A4 ORDER INDEX ANK A4,/FF ABR(Z)* A15 RETURN IF NO READ/WRITE ORDER SUK A4,1 ADR A3,A4 ADD READ/WRITE INDEX ABR* A15 RETURN WITHOUT CHANGING CR * EJECT TOSSIO * * ********** * ORDTAB * ********** * * ORDTAB CONTAINS ORDER CONSTANTS AS FOLLOWS: * * =0: NO READ/WRITE ORDER * =1: READ ORDER * =TINDEX+1: WRITE ORDER * ORDTAB EQU * ORDER CONSTANTS BYTES 0,1 /00, /01 BYTES 1,1 /02, /03 BYTES 0,TINDEX+1 /04, /05 BYTES TINDEX+1,TINDEX+1 /06, /07 BYTES TINDEX+1,0 /08, /09 BYTES 1,TINDEX+1 /0A, /0B BYTES 0,0 /0C, /0D BYTES 0,0 /0E, /0F BYTES 0,1 /10, /11 BYTES 0,0 /12, /13 BYTES 0,TINDEX+1 /14, /15 BYTES 0,0 /16, /17 BYTES 0,0 /18, /19 BYTES 0,0 /1A, /1B BYTES 0,0 /1C, /1D BYTES 0,0 /1E, /1F BYTES 0,TINDEX+1 /20, /21 BYTES TINDEX+1,0 /22, /23 BYTES TINDEX+1,0 /24, /25 BYTES 0,TINDEX+1 /26, /27 BYTES 0,0 /28, /29 BYTES 0,0 /2A, /2B BYTES 0,1 /2C, /2D BYTES 1,TINDEX+1 /2E, /2F BYTES 0,0 /30, /31 BYTES 0,0 /32, /33 BYTES 0,0 /34, /35 BYTES 0,0 /36, /37 BYTES 0,0 /38, /39 BYTES 0,0 /3A, /3B BYTES 0,0 /3C, /3D BYTES 0,0 /3E, /3F * EJECT TOSSIO * * T I O : D M * * THIS MODULE IS CALLED BY 'TIO' WHEN A REQUEST * FOR DATA MANAGEMENT HAS BEEN ISSUED. * THE CORRESPONDING MODULE CALLED BY 'TENDIO' AT * COMPLETION OF THE REQUEST IS 'TEN:DM'. * * INPUT: A8 = DWT ECB ADDRESS * A9 = USER ECB ADDRESS * * OUTPUT: A2 IS DESTROYED * TIO:DM EQU * DATA MANAGEMENT, INPUT/OUTPUT EL A2,ECBBA,A9 USER BUFFER ADDRESS ST A2,ECBBA,A8 * TIOCW2 EQU * EL A2,ECBCW2,A9 SECOND CONTROL WORD ST A2,ECBCW2,A8 * A15RTN EQU * RTN A15 * EJECT TOSSIO * * T I O P C I * * THIS MODULE IS CALLED BY 'TIO' WHEN A READ REQUEST HAS BEEN * ISSUED AND THE DEVICE IS RUNNING ON PROGRAMMED CHANNEL. * TIOPCI CHECKS USER AND DWT BUFFER ADDRESSES SO THAT BOTH ARE * EVEN OR UNEVEN, DEPENDING ON THE USER BUFFER ADDRESS. * THE CORRESPONDING MODULE CALLED BY 'TENDIO' AT * COMPLETION OF THE REQUEST IS 'TENPCI'. * NOTICE THAT ENTRY TIPI05 IS USED BY 'TIOKBI'. * * INPUT: A8 = DWT ECB ADDRESS * A9 = USER ECB ADDRESS * A12 = ADDRESS TO DRIVER ADDRESS BLOCK * * OUTPUT: A1 IS DESTROYED * TIOPCI EQU * PROGRAMMED CHANNEL, INPUT LD A1,ECBRL,A8 REQUESTED LENGTH CW A1,BUFLEN,A12 COMPARE WITH DWT BUFFER SIZE RF(G) IO:ERR REQ. LENGTH EXCEEDS DWT BUFFER SIZE * TIPI05 EQU * ENTRY POINT USED BY 'TIOKBI' EL A1,ECBBA,A9 USER BUFFER ADDRESS ANK A1,1 RF(Z) TIPI10 USER BUFFER ADDRESS EVEN ORS A1,ECBBA,A8 RTN A15 * TIPI10 SUK A1,2 MAKE DWT BUFFER ADDRESS EVEN ANS A1,ECBBA,A8 RTN A15 * EJECT TOSSIO * * T I O M X I * * THIS MODULE IS CALLED BY 'TIO' WHEN A READ REQUEST HAS BEEN * ISSUED AND THE DEVICE IS RUNNING ON MULTIPLEXOR CHANNEL. * TIOMXI ASSEMBLES THE FULL 18 BIT BUFFER ADDRESS WHICH IS * TRANSFERRED TO THE MUX BY THE DRIVER. * THE CORRESPONDING MODULE CALLED BY 'TENDIO' AT * COMPLETION OF THE REQUEST IS 'TENMXI'. * NOTICE THAT MODULES 'TIOMXO', 'TIODKI' AND 'TIODKO' ARE EQUAL TO TIOMXI. * * INPUT: A5 = TTAB ADDRESS * A8 = DWT ECB ADDRESS * A9 = USER ECB ADDRESS * * OUTPUT: A1-A2 ARE DESTROYED * 18 BIT USER BUFFER ADDRESS IS TRANSFERRED TO DWT ECB * TIOMXI EQU * MUX, INPUT EL A1,ECBBA,A9 USER BUFFER ADDRESS ECR A2,A1 ANKL A1,/FFF SKIP 4 LEFTMOST BITS SRL A2,3 ANK A2,/1E MMUTAB INDEX (5 BITS) ADR A2,A5 ADD TTAB ADDRESS LC A2,TTB:MT,A2 PHYSICAL PAGE ADDRESS SRL A2,2 ANK A2,/3F SCR A2,A8 STORE BITS 16-17 IN DWT ECB 1ST WORD ANK A2,/0F SRC A2,4 ORR A1,A2 ST A1,ECBBA,A8 STORE MODIFIED BUFFER ADDRESS RTN A15 * EJECT TOSSIO * * T I O K B I * * THIS MODULE IS CALLED BY 'TIO' WHEN A READ REQUEST HAS BEEN * ISSUED AND THE DEVICE IS KEYBOARD/CTW. TIOKBI WILL SET BUFFER ADDRESSES * AND MOVE KEYTABLE (IF ANY) BY USING ENTRY TIPI05 * IN 'TIOPCI' AND ENTRY TIPO05 IN 'TIOPCO'. * THE CORRESPONDING MODULE CALLED BY 'TENDIO' AT * COMPLETION OF THE REQUEST IS 'TENKBI'. * * INPUT: A6 = DWT ADDRESS * A7 = ORDER CODE * A8 = DWT ECB ADDRESS * A9 = USER ECB ADDRESS * A12 = ADDRESS TO DRIVER ADDRESS BLOCK * * OUTPUT: A1-A4 ARE DESTROYED * TIOKBI EQU * KEYBOARD/CTW LD A1,ECBRL,A8 REQUESTED LENGTH CW A1,BUFLEN,A12 COMPARE WITH DWT BUFFER SIZE RF(G) IO:ERR REQ. LENGTH EXCEEDS DWT BUFFER SIZE CF A15,TIPI05 CHECK AND CORRECT BUFFER ADDRESSES CWK A7,1 CHECK ORDER CODE RF(E) TIKB20 NO KEYTABLE IF BASIC READ LD A4,ECBCW,A8 USER KEYTABLE ADDRESS RF(Z) TIKB20 NO KEYTABLE * EJECT TOSSIO * * LDR A1,A9 ADK A1,8 ADKL A8,12 ST A8,-2,A8 SET DWT KEYTABLE ADDRESS SUKL A8,4 ELR A3,A4 FIRST WORD OF USER KEYTABLE ANK A4,1 RF(NZ) TIKB10 KEYTABLE ADDRESS UNEVEN ECR A3,A3 NO, PUT LENGTH IN RIGHT BYTE * TIKB10 ANK A3,/FF SKIP LEFT CHARACTER ADK A3,1 CW A3,KEYLEN,A12 CHECK KEYTABLE BUFFER SIZE RF(G) IO:ERR TOO SMALL CF A15,TIPO05 SUKL A8,8 ADJUST DWT ECB ADDRESS * TIKB20 EQU * RTN A15 * EJECT TOSSIO * * T I O I T I * TIOITI EQU A15RTN INTERTASK COMMUNICATION, INPUT * * T I O D K I * TIODKI EQU TIOMXI DISC, INPUT * EJECT TOSSIO * * T I O P C O * * THIS MODULE IS CALLED BY 'TIO' WHEN A WRITE REQUEST HAS BEEN * ISSUED AND THE DEVICE IS RUNNING ON PROGRAMMED CHANNEL. * TIOPCO CHECKS THAT REQUESTED LENGTH DOES NOT EXCEED THE DWT * BUFFER LENGTH, AND PERFORMS A MOVE OF THE CONTENTS OF THE USER * BUFFER TO THE DWT BUFFER. * THE CORRESPONDING MODULE CALLED BY 'TENDIO' AT * COMPLETION OF THE REQUEST IS 'TENPCO'. * NOTICE THAT MODULE 'TIOKBO' IS EQUAL TO TIOPCO. * NOTICE ALSO THAT ENTRY TIPO05 IS USED BY 'TIOKBI' AND 'TENITO'. * TIOPCO IS ALSO USED BY 'DC:MOT'. * * INPUT: A6 = DWT ADDRESS * A8 = DWT ECB ADDRESS * * OUTPUT: A1-A4 ARE DESTROYED * TIOPCO EQU * PROGRAMMED CHANNEL, OUTPUT LD A2,DWTADR,A6 ADDRESS TO DRIVER ADDRESS BLOCK LD A3,ECBRL,A8 REQUESTED LENGTH RF(NP) TIPO20 REQUESTED LENGTH <= 0 CW A3,BUFLEN,A2 COMPARE WITH DWT BUFFER SIZE RF(G) IO:ERR REQ. LENGTH EXCEEDS DWT BUFFER SIZE LD A1,DWTUEC,A6 USER ECB ADDRESS * EJECT TOSSIO * * TIPO05 EQU * ENTRY POINT USED BY 'TIOKBI' AND 'TENITO' ADK A3,1 ANKL A3,/FFFE MAKE REQUESTED LENGTH EVEN EL A1,ECBBA,A1 USER BUFFER ADDRESS LD A2,ECBBA,A8 DWT BUFFER ADDRESS ANKL A2,/FFFE MAKE DWT BUFFER ADDRESS EVEN LDR A4,A1 ANK A4,1 RF(NZ) TIPO30 USER BUFFER ADDRESS UNEVEN ST A2,ECBBA,A8 * TIPO10 MVUS A3 MOVE (USER BUFFER) TO SYSTEM BUFFER * TIPO20 RTN A15 * TIPO30 EQU * USER BUFFER ADDRESS WAS UNEVEN ORS A4,ECBBA,A8 MAKE DWT BUFFER ADDRESS UNEVEN ELR A4,A1 FIRST CHARACTER FROM USER BUFFER STR A4,A2 STORE FIRST CHARACTER IN DWT BUFFER ADK A1,1 UPDATE USER BUFFER POINTER ADK A2,2 UPDATE DWT BUFFER POINTER RB TIPO10 MOVE REMAINING CHARACTERS * EJECT TOSSIO * * I O : E R R * * DRIVER (DWT) MMU BUFFER IS TOO SMALL. * SET RETURN CODE /8008 (REQUEST ERROR AND INCORRECT LENGTH). * BRANCH TO DISPATCHER VIA TENDIO. * IO:ERR EQU * REQUEST ERROR EXIT FOR MMU ROUTINES INH ADKL A15,4 ADJUST STACKPOINTER LD A1,DWTST,A6 DWT STATUS SLL A1,2 CHECK ECHO BIT RF(NN) IO:E10 NOT ECHO LDR A1,A6 SAVE DWT ADDRESS LD A6,DWTECH,A6 ECHO DWT ADDRESS CF A15,TENDIO LDR A6,A1 RESTORE DWT ADDRESS * IO:E10 EQU * LDKL A1,/8008 SET RETURN CODE ABL DISEND BRANCH TO DISPATCHER VIA TENDIO * EJECT TOSSIO * * T I O M X O * TIOMXO EQU TIOMXI MUX, OUTPUT * * T I O K B O * TIOKBO EQU TIOPCO KEYBOARD/CTW, OUTPUT * * T I O I T O * TIOITO EQU A15RTN INTERTASK COMMUNICATION, OUTPUT * * T I O D K O * TIODKO EQU TIODKI DISC, OUTPUT * EJECT TOSSIO * * T E N : D M * * THIS MODULE IS CALLED BY 'TENDIO' WHEN A REQUEST * FOR DATA MANAGEMENT HAS BEEN COMPLETED. * NOTICE THAT MODULES 'TENDKI' AND 'TENDKO' ARE EQUAL TO TEN:DM. * * INPUT: A6 = DWT ADDRESS * A8 = USER ECB ADDRESS * * OUTPUT: A1 IS DESTROYED * TEN:DM EQU * DATA MANAGEMENT, INPUT/OUTPUT LD A1,DWTMEC,A6 MMU ECB ADDRESS LD A1,ECBCW2,A1 SECOND CONTROL WORD ES A1,ECBCW2,A8 RTN A15 * EJECT TOSSIO * * T E N P C I * * THIS MODULE IS CALLED BY 'TENDIO' WHEN A READ REQUEST HAS BEEN * COMPLETED AND THE DEVICE IS RUNNING ON PROGRAMMED CHANNEL. * TENPCI PERFORMS A MOVE OF THE CONTENTS OF THE DWT BUFFER * TO THE USER BUFFER. * NOTICE THAT MODULES 'TENKBI' AND 'TENITI' ARE EQUAL TO TENPCI. * NOTICE ALSO THAT ENTRY TEN:DC IS USED BY 'DC:MIN'. * * INPUT: A6 = DWT ADDRESS * A8 = USER ECB ADDRESS * * OUTPUT: A1-A4, A8 ARE DESTROYED * TENPCI EQU * PROGRAMMED CHANNEL, INPUT LD A2,DWTECB,A6 DWT ECB ADDRESS LD A4,ECBEL,A2 EFFECTIVE LENGTH RF(NP) TEPI30 NO MOVE IF ZERO LD A1,ECBBA,A2 DWT BUFFER ADDRESS * TEN:DC EQU * ENTRY POINT USED BY 'DC:MIN' EL A2,ECBBA,A8 USER BUFFER ADDRESS LDK A3,1 CHECK BUFFER ADDRESSES TM A3,A1 RF(Z) TEPI20 DWT BUFFER ADDRESS EVEN TM A3,A2 NO, CHECK USER BUFFER ADDRESS RF(Z) TEPI60 USER BUFFER ADDRESS EVEN * EJECT TOSSIO * * TEPI10 EQU * BOTH BUFFER ADDRESSES WERE UNEVEN LDR* A3,A1 FIRST CHARACTER FROM DWT BUFFER ELR A8,A2 * TEPI15 ANK A3,/FF SKIP LEFT CHARACTER ANKL A8,/FF00 SKIP RIGHT CHARACTER ORR A8,A3 ESR A8,A2 STORE CHARACTER IN USER BUFFER ADK A1,1 UPDATE BUFFER POINTERS ADK A2,1 SUK A4,1 RF(P) TEPI25 MORE CHARACTERS TO MOVE RTN A15 NO, RETURN * TEPI20 TM A3,A2 RF(Z) TEPI25 USER BUFFER ADDRESS EVEN LDR A3,A1 DWT BUFFER ADDRESS ADR A3,A4 ADD EFFECTIVE LENGTH * TEPI23 LC A8,-1,A3 ONE CHARACTER SCR A8,A3 MOVE THIS CHAR. ONE BYTE TO THE RIGHT SUK A3,1 POINT TO NEXT CHARACTER CWR A3,A1 COMPARE WITH START ADDRESS OF BUFFER RB(NE) TEPI23 MORE CHARACTERS TO MOVE ADK A1,1 NO, MAKE DWT BUFFER ADDRESS UNEVEN RB TEPI10 * EJECT TOSSIO * * TEPI25 LDR A3,A4 CHECK REQUESTED LENGTH ANK A3,1 RF(NZ) TEPI40 EFFECTIVE LENGTH UNEVEN MVSU A4 MOVE (SYSTEM BUFFER) TO USER BUFFER * TEPI30 RTN A15 * TEPI40 EQU * EFFECTIVE LENGTH WAS UNEVEN SUK A4,1 MAKE EFFECTIVE LENGTH EVEN RF(Z) TEPI50 ONLY ONE CHARACTER TO MOVE LDR A8,A4 NO, SAVE A4 MVSU A4 MOVE (SYSTEM BUFFER) TO USER BUFFER ADR A1,A8 UPDATE BUFFER POINTERS ADR A2,A8 * TEPI50 EQU * LDR* A8,A1 LAST CHARACTER FROM DWT BUFFER ELR A3,A2 RB TEPI15 * TEPI60 EQU * DWT BUFFER ADDRESS WAS UNEVEN LDR A3,A1 DWT BUFFER ADDRESS ADR A1,A4 ADD EFFECTIVE LENGTH * TEPI70 LCR A8,A3 ONE CHARACTER SC A8,-1,A3 MOVE THIS CHAR. ONE BYTE TO THE LEFT ADK A3,1 POINT TO NEXT CHARACTER CWR A3,A1 COMPARE WITH ENDING ADDRESS RB(NE) TEPI70 MORE CHARACTERS TO MOVE SUR A1,A4 NO, RESTORE DWT BUFFER ADDRESS SUK A1,1 MAKE DWT BUFFER ADDRESS EVEN RB TEPI25 * EJECT TOSSIO * * T E N M X I * TENMXI EQU A15RTN MUX, INPUT * * T E N K B I * TENKBI EQU TENPCI KEYBOARD, INPUT * * T E N I T I * TENITI EQU TENPCI INTERTASK COMMUNICATION, INPUT * * T E N D K I * TENDKI EQU TEN:DM DISC, INPUT * EJECT TOSSIO * * T E N P C O * TENPCO EQU A15RTN PROGRAMMED CHANNEL, OUTPUT * * T E N M X O * TENMXO EQU A15RTN MUX, OUTPUT * * T E N K B O * TENKBO EQU A15RTN KEYBOARD/CTW, OUTPUT * * T E N D K O * TENDKO EQU TEN:DM DISC, OUTPUT * EJECT TOSSIO * * T E N I T O * * THIS MODULE IS CALLED BY 'TENDIO' WHEN A WRITE REQUEST HAS BEEN * COMPLETED FOR INTERTASK COMMUNICATION, IN PURPOSE TO MOVE THE CONTENTS * OF THE USER BUFFER TO THE DRIVER BUFFER. THE ENTRY TIPO05 IN MODULE * 'TIOPCO' IS USED FOR MOVING THE DATA. * * INPUT: A6 = DWT ADDRESS * * OUTPUT: A1-A4, A8 ARE DESTROYED * TENITO EQU * INTERTASK COMMUNICATION, OUTPUT LD A8,DWTECB,A6 DWT ECB ADDRESS LD A3,ECBEL,A8 EFFECTIVE LENGTH RF(NP) TEIO10 NO MOVE LD A1,DWTUEC,A6 USER ECB ADDRESS CF A15,TIPO05 MOVE BUFFER CONTENTS * TEIO10 RTN A15 * EJECT TOSSIO * * D C : M O T * * THIS MODULE IS CALLED BY THE DATA COMMUNICATION DRIVER * IN PURPOSE TO MOVE THE CONTENTS OF THE USER BUFFER TO * THE DRIVER BUFFER. THE MOVE ROUTINE IN MODULE 'TIOPCO' * IS USED FOR MOVING THE DATA. * * INPUT: A6 = DWT ADDRESS * * OUTPUT: NO REGISTERS ARE DESTROYED * DC:MOT EQU * DATA COMMUNICATION, OUTPUT MSR 8,A15 SAVE A1-A8 ON STACK SUKL A15,32 ADJUST STACKPOINTER TS 2,A15 SAVE MMU REGISTERS ON STACK LD A5,DWTTAB,A6 TTAB ADDRESS TL TTB:MT,A5 LOAD MMU REGISTERS LD A8,DWTMEC,A6 DWT ECB ADDRESS ENB CF A15,TIOPCO MOVE BUFFER CONTENTS * DC:RTN EQU * RETURN TO DC DRIVER TL 2,A15 RESTORE MMU REGISTERS FROM STACK ADKL A15,32 ADJUST STACKPOINTER MLR 8,A15 RESTORE A1-A8 FROM STACK... RTN A15 ...AND RETURN XIF * EJECT TOSSIO * * D C : M I N * * THIS MODULE IS CALLED BY THE DATA COMMUNICATION DRIVER * IN PURPOSE TO MOVE THE CONTENTS OF THE DRIVER BUFFER TO THE USER BUFFER. * * INPUT: A1 = RETURN CODE * A4 = DRIVER BUFFER ADDRESS * A6 = DWT ADDRESS * * OUTPUT: NO REGISTERS ARE DESTROYED * DC:MIN EQU * IFT MMUPAG=0 IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK * IFT MMUPAG=1 SUKL A15,32 ADJUST STACKPOINTER TS 2,A15 SAVE MMU REGISTERS ON STACK LD A5,DWTTAB,A6 TTAB ADDRESS TL TTB:MT,A5 LOAD MMU REGISTERS XIF * EJECT TOSSIO * * M I N M O V * * INPUT: A1 = RETURN CODE * A4 = DRIVER BUFFER ADDRESS * A6 = DWT ADDRESS * MINMOV EQU * DC:MIN MOVE ENTRY ENB LD A3,DWTECB,A6 ECB ADDRESS LDR A7,A4 SAVE DRIVER BUFFER ADDRESS LD A2,ECBEL,A3 EFFECTIVE LENGTH RF(NP) MIN:40 NOTHING TO MOVE CW A2,ECBRL,A3 CHECK IF USER BUFFER IS LARGE ENOUGH RF(G) MIN:70 NO, REQUEST ERROR * IFT MMUPAG=0 LD A5,ECBBA,A3 USER BUFFER ADDRESS LDR A3,A5 ANK A3,1 CHECK USER BUFFER ADDRESS RF(NZ) MIN:30 USER BUFFER ADDRESS UNEVEN SUK A2,2 RF(N) MIN:30 ONLY ONE CHARACTER TO MOVE * EJECT TOSSIO * * WORD MOVE * MIN:10 EQU * LDR* A3,A7 MOVE ONE WORD STR A3,A5 ADK A7,2 INCREMENT BUFFER POINTERS ADK A5,2 SUK A2,2 DECREMENT LOOP COUNTER RB(NN) MIN:10 AT LEAST ONE MORE WORD TO MOVE * MIN:20 EQU * ADK A2,1 RF(N) MIN:40 MOVE FINISHED * * CHARACTER MOVE * MIN:30 EQU * LCR A3,A7 MOVE ONE CHARACTER SCR A3,A5 ADK A7,1 INCREMENT BUFFER POINTERS ADK A5,1 SUK A2,1 DECREMENT LOOP COUNTER RB(P) MIN:30 AT LEAST ONE MORE CHARACTER TO MOVE XIF * IFT MMUPAG=1 ST A1,ECBRC,A3 SET RETURN CODE IN ECB LDR A1,A4 DRIVER BUFFER ADDRESS LDR A4,A2 EFFECTIVE LENGTH LD A8,DWTUEC,A6 USER ECB ADDRESS CF A15,TEN:DC MOVE BUFFER CONTENTS LDR A4,A7 RESTORE BUFFER ADDRESS LDK A1,0 XIF * EJECT TOSSIO * * MIN:40 EQU * INH CF A15,TENDIO PERFORM TENDIO * * RELEASE BUFFER * LD A1,DWTADR,A6 DRIVER ADDRESS BLOCK SU A4,HDRLEN,A1 REAL BUFFER ADDRESS =1 LD A1,POLADR,A1 BUFFER POOL ADDRESS RF(Z) MIN:60 NO RELEASE OF BUFFER * MIN:50 EQU * LDR A2,A1 SAVE BUFFER ADDRESS LDR* A1,A2 NEXT BUFFER ADDRESS RB(NZ) MIN:50 NOT LAST BUFFER IN CHAIN * * INSERT BUFFER AT END OF CHAIN * STR A4,A2 UPDATE QUEUE LINKS CMR A4 * MIN:60 EQU * IFT CPU852=1 ABL IHRET8 RESTORE A1-A8 AND RETURN XIF * EJECT TOSSIO * * IFT MMUPAG=0 IFT CPU852=0 MLR 8,A15 RESTORE A1-A8 FROM STACK... * DC:MOT RTN A15 ...AND RETURN XIF * IFT MMUPAG=1 RB DC:RTN RETURN TO DC DRIVER XIF * * ERROR EXIT * MIN:70 EQU * DC:MIN ERROR EXIT LDKL A1,/8008 REQUEST ERROR/INCORRECT LENGTH RB MIN:40 RETURN VIA TENDIO ETC * EJECT TOSSIO * * IFT MMUPAG=0 IFT CPU852=1 DC:MOT EQU * ABL IHRTN RETURN WITHOUT ENABLING INTERRUPTS XIF * EJECT TOSSIO * * ********** * TENDIO * ********** * * * THIS MODULE IS CALLED WHEN COMPLETION OF * I/O OCCURS. * * - IF I/O AND ACTIVATION REQUEST:- * * ACTOTP IS CALLED TO START THE TASK * * -IF NORMAL I/O WITH WAIT:- * * QTJOB IS CALLED TO QUEUE THE TASK * FOR DISPATCHING WITH THE FOLLOWING PARAMETERS:- * * A5 = TTAB ADDRESS * * -IF NORMAL I/O WITH NO WAIT:- * * NO ACTION REQUIRED * * IF AN EVENT WAS QUEUED FOR THIS DEVICE (DWTTQ NOT ZERO) * THAT TASK IS PUT IN DISPATCHER QUEUE TO REPEAT THE LKM INSTRUCTION. * EJECT TOSSIO * * * ENTRY PARAMETERS TO THIS SUBROUTINE ARE:- * * A1 = RETURN CODE * * A6 = DWT ADDRESS * * NO REGISTERS ARE DESTROYED * * WHEN RUNNING WITH MMU OPTION SPECIAL DEVICE * DEPENDENT SUBROUTINES ARE PERFORMED. * EJECT TOSSIO * * END I/O ENTRY * TENDIO EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 INH MSR 8,A15 SAVE A1-A8 ON STACK XIF * TEN090 EQU * ENB LDR A4,A6 DWT ADDRESS ADK A4,DWTST POINT TO DWT STATUS INH LD A5,DWTTQ,A6 TERMINAL QUEUE LINK RF(Z) TEN110 NO TASK QUEUED LDKL A2,/800 ATTACH BIT ANR* A2,A4 RF(Z) TEN100 DEVICE NOT ATTACHED CW A5,DWTTAB,A6 ATTACHED TO OTHER TASK RF(NE) TEN110 YES, DON'T QUEUE TASK * EJECT TOSSIO * * TEN100 EQU * LDR* A3,A5 UPDATE QUEUE ANCHOR ADDRESS ST A3,DWTTQ,A6 CF A15,QTJOB QUEUE TASK TO REPEAT REQUEST * * UPDATE ECB AND DWT * TEN110 LD A5,DWTTAB,A6 TTAB ADDRESS FROM DWT * TEN120 LDKL A2,/8000 ORRS A2,A4 INDICATE DEVICE READY IN DWT LDKL A3,/DBFF ANRS A3,A4 RESET ECHO BIT AND BIT 5 LD A3,DWTECB,A6 ECB ADDRESS RF(Z) TEN260 BRANCH IF ENTERED FROM ECHO OR RECOVERY * EJECT TOSSIO * * ORRS A2,A3 SET EVENT COMPLETED IN ECB ORS A1,ECBRC,A3 SET RETURN CODE IN ECB * IFT MMUPAG=1 LD A4,TTB:PW,A5 PSW ANK A4,1 SYSTEM/USER MODE BIT RF(Z) TEN200 SYSTEM MODE * * LOAD MMU REGISTERS * TEN130 EQU * SUKL A15,32 ADJUST STACKPOINTER TS 2,A15 SAVE MMU REGISTERS ON STACK TL TTB:MT,A5 LOAD MMU REGISTERS FROM TTAB * EJECT TOSSIO * * MOVE DWT ECB TO USER ECB * LD A8,DWTUEC,A6 USER ECB ADDRESS ELR A4,A8 ORR A4,A2 SET EVENT COMPLETED IN ECB ESR A4,A8 LDR A1,A3 ADK A1,ECBEL LDR A2,A8 ADK A2,ECBEL LDK A4,6 MVSU A4 MOVE EFF. LENGTH, RTN CODE & CNTRL WORD * LD A3,DWTADR,A6 ADDRESS TO DRIVER ADDRESS BLOCK LD A3,DEVIND,A3 DEVICE INDEX RF(N) TEN160 NO SPECIAL ACTION REQUIRED RF(Z) TEN140 DATA MANAGEMENT CWK A3,DK:DIX CHECK IF DISC RF(E) TEN140 DISC * * PERFORM CHECK ON ORDER CODE * CF A15,RD:WR CHECK IF IT WAS READ/WRITE RF(Z) TEN160 JUMP IF NO READ/WRITE ORDER * TEN140 EQU * ENB CFI A15,TENTAB,A3 BRANCH TO RELEVANT READ/WRITE ROUTINE * EJECT TOSSIO * * RESTORE MMU REGISTERS * TEN150 EQU * INH * TEN160 EQU * TL 2,A15 RESTORE MMU REGISTERS FROM STACK ADKL A15,32 ADJUST STACKPOINTER XIF * EJECT TOSSIO * * CHECK IF NO WAIT, WAIT, MULTIPLE WAIT OR ACTIVATION * TEN200 EQU * LD A4,DWTWAT,A6 WAIT/ACTIVATE INDICATOR RF(Z) TEN250 NOT WAIT OR ACTIVATION SUK A4,1 RF(Z) TEN240 WAIT ADK A4,1 LDR A3,A4 ANK A3,1 RF(Z) TEN230 ACTIVATION LD A8,DWTECB,A6 ECB ADDRESS * IFT MMUPAG=1 AN A3,TTB:PW,A5 SYSTEM/USER MODE BIT RF(Z) TEN210 SYSTEM MODE LD A8,DWTUEC,A6 NO, GET USER ECB ADDRESS XIF * TEN210 EQU * ST A8,TTB:SA+16,A5 SET TO A8 IN TTAB SAVE AREA * TEN220 ADK A4,DWTWAT POINT TO WAIT/ACTIVATE INDICATOR LDR* A3,A4 NEXT DWT ADDRESS RF(Z) TEN240 NO MORE DWT:S CMR A4 SET TO NO WAIT AGAIN LDR A4,A3 RB TEN220 * EJECT TOSSIO * * TEN230 EQU * CF A15,FREBLK ACTIVATE: GET PARAMETER AND DISP ADDR CF A15,ACTOTP ACTIVATE TASK ON LIFO BASIS RF TEN250 * TEN240 EQU * CF A15,QTJOB WAIT: QUEUE TASK FOR DISPATCHING * TEN250 EQU * CM DWTECB,A6 RESET ECB ADDRESS * TEN260 EQU * IFT CPU852=1 ABL IHRET8 XIF * IFT CPU852=0 MLR 8,A15 RESTORE A1-A8 FROM STACK... RTN A15 ...AND RETURN XIF * * * END