.TITLE RTL V02 RT/RSX BOOTSTRAP 9-SEP-77 ; ; 'RTL' IS THE RSX BOOT TASK REQUIRED TO BOOT A RT/RSX EMULATOR ; SYSTEM FROM A FOREIGN-MOUNTED RT11 DEVICE. IT REQUIRES THE FILE ; 'RSXLOG.SYS' TO BE RESIDENT ON THE FOREIGN DEVICE. THE FOREIGN ; DEVICE MUST BE MOUNTED IN THE DRIVE AND UNIT NUMBER CORRESPONDING ; TO THE ASSIGNMENT MADE TO LUN 1 IN THE BUILD FILE, 'RTLBLD.CMD'. ; ; IT IS SUGGESTED THAT THIS ASSIGNMENT BE TO UNIT 1 OF MULTI-DRIVE ; DEVICES SO THAT THE RT/RSX 'DX' DRIVER CAN STILL BE USED TO ; ACCESS FILES ON UNIT 0, ASSUMING THAT UNIT 0 IS ALSO FOREIGN. ; ; ALTERNATIVELY, FOR DUAL-RK SYSTEMS, DRIVE 0 WILL BE THE RSX SYSTEM ; DEVICE. THE 'DX' DRIVER MAY STILL BE USED FOR ACCESSING OTHER FOREIGN ; MOUNTED RT-11 DEVICES BY MODIFIYING THE BUILD COMMAND FILE SO THAT ; LUN 5 IS ASSIGNED TO THIS OTHER FOREIGN DEVICE AND STILL REFERING ; TO THE DEVICE FROM RT AS 'DX'. RUN-TIME ASSIGNMENTS CAN ALSO BE MADE ; FROM PRIVILEGED RSX TERMINALS IF IT DESIRED TO USE DIFFERENT FOREIGN ; DEVICES AT DIFFERENT TIMES. ; ; NOTE THAT ONLY A 16K SYSTEM IS SUPPLIED. TO BUILD A 24K SYSTEM, FOLLOW ; ESSENTIALLY THE SAME STEPS AS OUTLINED IN THE 'NOTES' DOCUMENT ; FOR THE VIRTUAL SYSTEM. STUDYING THE DIFFERENCES BETWEEN 'RTV.MAC' ; AND 'RTV24K.MAC' (E.G. WITH AN RSX 'CMP') WILL PROVE HELPFUL. ; ; ; BY: G.BERNSTEIN ; BIOMEDICAL ENGINEERING UNIT ; MCGILL UNIVERSITY ; ; 9-SEP-77 ; ; .SBTTL MACROS, GLOBALS ; .SBTTL RSX MACROS ;### .MCALL SVTK$S,QIO$,WTSE$,DIR$,MRKT$,ASTX$S,WTSE$S ;### .MCALL CLEF$S ;;;GB009 .MCALL CLOSE$,EXIT$S ;;;GB003 .MCALL QIO$S,WTSE$S ;;;GB002 .MCALL DSAR$S,ENAR$S,SETF$,FDBDF$,FDRC$A,FDBK$A,FDOP$A ;### .MCALL OPEN$M ;### .MCALL FSRSZ$ ;;;GB004 .SBTTL RT-11 MACROS FOR ASS'Y UNDER RSX ;### .MACRO .EXIT ;### EMT ^O350 ;### .ENDM ;### .MACRO .LOOKUP .AREA,.CHAN,.DEVBLK ;### .IF NB <.CHAN> ;### MOV .CHAN,%0 ;### .ENDC ;<.CHAN> ;### EMT ^O<20+.AREA> ;### .ENDM ;### .MACRO .PRINT .ADD ;### .IF NB <.ADD> ;### MOV .ADD,%0 ;### .ENDC ;<.ADD> ;### EMT ^O351 ;### .ENDM ;### .MACRO .SAVESTAT .AREA,.CHAN,.CBLK ;### .IF NB <.CHAN> ;### MOV .CHAN,%0 ;### .ENDC ;<.CHAN> ;### EMT ^O<120+.AREA> ;### .ENDM ;### .SBTTL GLOBALS FOR RSX TSK COMMCTN W/MON. ;### .GLOBL IDPB,SISTAT,WDPB,TTSTAT,TTDPB,TTBUF,KBDPB,BASE ;### .GLOBL DXDPB ;;;GB007 .GLOBL RSXIT ;;;GB003 .GLOBL KBSTAT,KBBUF,ASTNPND,TSTANP,TTEXIT,DSABL,ENABL ;### .GLOBL $DSW,DPBBAS,RSTTDN,LKCS,LPDPB,TICHK,TTIEX6 ;### ; DEFINITIONS ;### BOOTSZ=2 ;### ; DEFINITIONS FOR RELOCATION LIST ;### BASE=21000 ;### USRLOC=BASE+16352 ;LOCATION OF USR NOW ;### $USRLC=BASE+16266 ;ADDRESS OF 'NORMAL' USR ;### QCOMP=BASE+16270 ;QUEUE COMPLETION ;### $KMLOC=BASE+20370 ;ADDRESS OF KMON ;### TTIBUF=BASE+21414 ;TTY RING BUFFER--INPUT ;### TTOBUF=BASE+21426 ;TTY RING BUFFER--OUTPUT ;### SYSLOW=BASE+16366 ;LOWEST USED LOCATION ;### CORPTR=BASE+16560 ;FREE CORE LIST ;### $INPTR=BASE+24250 ;POINTER TO $INTEN IN RESIDENT HANDLER ;### SYNCH=BASE+16324 ;SYNCHRONIZATION ADDRESS ;### TRAPLC=BASE+17354 ;### TRAPER=BASE+17434 ;LOCS FOR TRAPS TO 4/10 ;### FPPADD=BASE+17462 ;### FPPIGN=BASE+17512 ;FPP SERVICE FOR MONITOR ;### MONLOC=BASE+23102 ;WHERE USR WILL SIT ;### I.CSW=BASE+16676 ;SINGLE USER STUFF HERE ;### AVAIL=BASE+23340 ;MONITOR FREE Q POINTER ;### ; ; DEFINITIONS FOR OTHER GLOBALS NEEDED FOR COMM'TN W/MONITR ;### ; RTSIZE=25000 ;### FILLER=32 ;### MAXSYH=660 ;### RTLEN=12400 ;### SWAPSZ=17 ;### KMONSZ=6 ;### BSTRNG=300 ;### MAPOFF=326 ;### SYENTO=5310 ;### SYINDO=364 ;### $PNAMO=177704 ;### RKSIZE=164 ;### $SLOT=16 ;### DKASSG=424 ;### HWDSP$=4 ;### HWFPU$=100 ;### KW11L$=100000 ;### RT11SZ=25 ;### SYASSG=426 ;### USRSZ=10 ;### $MONBL=BASE+22754 ;### $ENTRY=BASE+16564 ;### $DVREC=BASE+16620 ;### $PNAME=BASE+16470 ;### KMLOC=BASE+20430 ;### KMON=BASE+0 ;### RKINT=BASE+24206 ;### $SWPBL=BASE+20360 ;### TRAP4=BASE+17402 ;### TRAP10=BASE+17402 ;### EMTPRO=BASE+16700 ;### $RMON=BASE+16000 ;### TTIINT=BASE+20564 ;### TTOINT=BASE+21770 ;### FPPINT=BASE+17470 ;### $TIME=BASE+16320 ;### ; ; RSX TYPE DEFINITIONS ; SY.LUN=1 ;### SY.EFN=1 ;### TT.LUN=2 ;### TT.EFN=2 ;### KB.LUN=3 ;### KB.EFN=3 ;### LP.LUN=4 ;### LP.EFN=4 ;### DX.LUN=5 ;;;GB007 DX.EFN=6 ;;;GB007 CK.EFN=5 ;### H.BUFA=0 ;### H.BUFS=2 ;### H.LBN=6 ;### ;************************************************** ; CONDITIONAL ASSEMBLY OF BOOT FOR SINGLE USER OR BF SYSTEM .IIF NDF BF BF=0 ;DEFAULT TO SINGLE USER ; GLOBAL REFERENCES TO MONITOR: .GLOBL $DVREC, $ENTRY, $INPTR, $KMLOC, $MONBL, $PNAME, $SLOT .GLOBL $SWPBL, $USRLC, $PNAMO .GLOBL BSTRNG, CORPTR, DKASSG, FILLER, HWFPU$, HWDSP$, KMLOC .GLOBL KMON, KMONSZ, KW11L$, MAPOFF, QCOMP, RT11SZ .GLOBL RTLEN, RTSIZE, SWAPSZ, SYENTO, SYINDO, SYNCH, SYASSG .GLOBL SYSLOW, TTIBUF, TTOBUF, USRLOC, USRSZ, MAXSYH .GLOBL RELLST ; FOLLOWING ARE GLOBALS FOR EITHER BF OR SU SYSTEM, BUT NOT BOTH .IF NE BF .GLOBL BCNTXT, BKGND1, BKGND2, BKGND3, CNTXT, FUDGE1, FUDGE2 .GLOBL MSGENT, RMONSP, SWIPTR, SWOPTR, TTIUSR, TTOUSR, .$CRTN .IFF .GLOBL AVAIL, I.CSW, FPPADD, FPPIGN, MONLOC, TRAPLC, TRAPER .ENDC PERM = 2000 ;STATUS WORD FOR PERMANENT FILE ENDBLK = 4000 ;STATUS OF END OF SEGMENT MARK JSW = 44 ;ADDRESS OF JOB STATUS SR = 177570 ;CONSOLE SWITCH REGISTER ; REGISTER DEFINITIONS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; MONITOR OFFSET CONSTANTS CONFIG = 300 ;HARDWARE CONFIGURATION WORD SYUNIT = 274 ;SYSTEM UNIT # ; ; PUT ALL BOOT TASK CODE ABOVE 16K, SO WE CAN ;### ; HAVE A 16K RT SYSTEM IN THE LOW PART OF A 20K PARTITION ;### ; .BLKW 40000 ;### ; FOLLOWING ARE THE BOOTSTRAP I/O DRIVERS FOR EACH VALID ; SYSTEM DEVICE. ; CALLING SEQUENCE: ; R0 = PHYSICAL BLOCK TO READ/WRITE ; R1 = WORD COUNT ; R2 = BUFFER ADDRESS ; R3,R4,R5 ARE AVAILABLE AND MAY BE DESTROYED BY THE DRIVER ; THE DRIVER MUST GO TO BIOERR IF A FATAL I/O ERROR OCCURS. ; IT MUST ALSO INVOKE THE MACRO SYSDEV .MACRO SYSDEV NAME,VECTOR .GLOBL NAME'INT, NAME'SIZE ;DEFINE SYSTEM DEVICE INTERRUPT & SIZE SYNAME = 0 .IRPC X, SYNAME = *50 .ENDR SYVEC = VECTOR ;IT VECTORS TO THIS LOCATION SYBITO = VECTOR / 20 ;OFFSET INTO BIT MAP FOR PROTECTION SYBITS = ^B11000000 ;COMPUTE ACTUAL BITS .REPT / 4 ;VECTOR IS A MULTIPLE OF 4 SYBITS = SYBITS / 4 ;SHIFT RIGHT 2 MORE BITS .ENDR .ENDM SYSDEV .SBTTL READ ROUTINE FOR RSX BOOT TASK ;### SYSDEV RK,220 ;MUST DEFINE STUFF ;### READ: MOV #IO.RLB,IDPB+Q.IOFN ;FUNCTION TO QIO DPB ;### MOV R0,IDPB+Q.IOPL+H.LBN+2 ;BLK # TO QIO DPB ;### ; INC IDPB+Q.IOPL+H.LBN+2 ;MAP LOG. TO VIRT. BLK ;### MOV R2,IDPB+Q.IOPL+H.BUFA ;BUFR ADDR TO QIO DPB ;### ASL R1 ;MAKE IT A BYTE COUNT ;### MOV R1,IDPB+Q.IOPL+H.BUFS ;BUFR SIZE TO QIO DPB ;### MOV $DSW,-(SP) ;PRESERVE DSW ACRS DIRECT. ;### DIR$ #IDPB ;START I/O ;### MOV (SP)+,$DSW ;RESTORE DSW ;### BCC DIROK ;BR IF ACCEPTED ;### DIRRJ: JSR R0,REPORT ;### .ASCIZ <15><12>\?B-DIR REJECTED\<12> ;### .EVEN ;### DIROK: MOV Q.IOEF+IDPB,WDPB+W.TSEF ;SET EVENT FLAG # ;### MOV $DSW,-(SP) ;PRESEVVE DSW ;### DIR$ #WDPB ;ISSUE WAIT ;### MOV (SP)+,$DSW ;RESTORE DSW ;### BCS DIRRJ ;IF REJECTED-REPORT ;### TSTB @Q.IOSB+IDPB ;TRANSFER ERROR? ;### BMI BIOERR ;IF MI-ERROR ;### RTS PC ;NO ERROR ;### BIOERR: JSR R0,REPORT ;SAY THAT WE GOT ERROR .ASCIZ <15><12>\?B-I/O ERROR\<12> .EVEN .SBTTL BOOTSTRAP CORE DETERMINATION .SBTTL ERROR REPORTING FOR RSX ;### REPORT: MOVB (R0)+,TTBUF ;CHAR TO BUFR ;### BEQ 3$ ;IF EQ-DONE ;### MOV $DSW,-(SP) ;SAVE DSW ;### DIR$ #TTDPB ;WRITE CHAR ;### BCC 1$ ;IF NO ERROR-BR ;### HALT ;DIR REJECTED ;### 1$: MOV (SP)+,$DSW ;REST. DSW ;### MOV Q.IOEF+TTDPB,WDPB+W.TSEF ;EVENT FLAG TO WAIT ON ;### MOV $DSW,-(SP) ;SAVE DSW ;### DIR$ #WDPB ;ISSUE WAIT ;### MOV (SP)+,$DSW ;RESTORE DSW ;### BCC 2$ ;IF NO ERROR-BR ;### HALT ;DIR. REJECTED ;### 2$: TSTB @Q.IOSB+TTDPB ;TRANSFER ERROR? ;### BPL REPORT ;IF PL-NO-LOOP ;### 3$: HALT ;TRANSFER ERR OR DONE ;### BOOT: MOV #10000,SP ;SET STACK POINTER MOV $DSW,-(SP) ;SAVE DSW ;### SVTK$S #SSTAB,#8. ;SPECIFY SST VECT. TABLE FOR TASK ;### BCC .+4 ;BR IF NO ERR ;### HALT ;### DIR$ #KBDPB ;ATTACH WITH IO.ATA ;;;GB009 WTSE$S #KB.EFN ;;;GB009 MOV (SP)+,$DSW ;RESTORE DSW ;### MOV #4,R3 ;POINT TO TRAP LOCATIONS MOV @R3,R5 ;SAVE TRAP LOC MOV #NXM,(R3)+ ;SET TRAP FOR NON EXISTENT MEMORY CLR @R3 NXM: MOV #100000,R2 ;16K SYS FOR RSX PROTOTYPE ;### MOV R5,(R3)+ ;RESTORE TRAP MOV #340,(R3)+ ;TRAP TO 4 IS PR7, CARRY OFF MOV R5,(R3)+ ;RESTORE 10 MOV #341,(R3)+ ;TRAP TO 10 IS PR7, CARRY ON SUB #RTSIZE,R2 ;R2 NOW POINTS TO WHERE WE WANT THE KMON ADD #FILLER,R2 ;ABUT IT AGAINST THE TOP OF CORE SUB #RKSIZE,R2 ;RECOVER UNUSED CORE FROM SY: ;### ADD #MAXSYH,R2 ;THIS WAY BECAUSE NO GLOBAL ARITH. CMP R2,#10000 ;IS IT JUST TOO TINY ? BLO TOOSML ;YES MOV R2,-(SP) ;PUT LOAD ADDRESS ON STACK MOV #1,R0 ;NOW READ FIRST DIRECTORY BLOCK DFND: ASL R0 ADD #4,R0 ;DIRECTORY STARTS AT 6 MOV #1000,R1 MOV #BUFFB,R2 JSR PC,READ ;READ THE SEGMENT MOV #BUFFB+10,R1 ;POINT TO START BLOCK WORD MOV (R1)+,R0 MONF: MOV R1,R2 ;SAVE ADDRESS OF STATUS WORD BIT #PERM,(R1)+ ;IS IT A PERMANENT FILE? BEQ 1$ ;NO. WE ARE TRYING TO FIND THE SUB (PC)+,(R1)+ ;FILE MONITR.SYS, AS THAT IS .RAD50 /RSX/ ;BOOT UP TO 'RSXMON.SYS' ;### SUB (PC)+,(R1)+ ;### .RAD50 /LOG/ ;### SUB (PC)+,(R1) .RAD50 /SYS/ BNE 1$ ;LAST WAS NOT .SYS EXTENSION BIS -(R1),-(R1) ;BOTH MUST BE 0 BEQ MONFND ;FOUND THE MONITOR 1$: BIT #ENDBLK,(R2) ;IS THIS ALL IN SEGMENT? BNE 2$ ;YES. READ NEXT, IF ANY. ADD 10(R2),R0 ;INCREASE START BLOCK ADD #16,R2 ;GET TO NEXT ENTRY ADD BUFFB+6,R2 MOV R2,R1 ;POINT R1 TO NEXT BR MONF 2$: MOV BUFFB+2,R0 ;SEE IF NEXT IS AVAILABLE BNE DFND ;YES. CONTINUE JSR R0,REPORT ;HE AIN'T GOT A MONITOR .ASCIZ <15><12>\?B-NO MONITR.SYS\<12> .EVEN TOOSML: JSR R0,REPORT ;HE IS IN A TINY MACHINE .ASCIZ <15><12>\?B-NOT ENOUGH CORE\<12> .EVEN .SBTTL READ MONITOR, LOOKUP HANDLERS MONFND: CLR R2 ;SET TO LOAD BLOCK 0 OF BOOT ;### MOV #400,R1 ;WORD COUNT ;### JSR PC,READ ;READ IT IN ;### MOV @SP,R2 ;RECALL LOAD LOCATION ADD #BOOTSZ,R0 ;BUMP R0 OVER BOOT RECORDS MOV R0,-(SP) ;SAVE SWAP BLOCK POINTER MOV #MAXSYH,R1 ;DO GLOBAL ARITHMETIC HERE SUB #RKSIZE,R1 ;R1=MAXSYH-SYSIZE(BYTES)(SY=RK) ;### ADD #FILLER,R1 ;ADD AMOUNT OF EXTRA STUFF ASR R1 ;(WORDS) NEG R1 ;(TO SUBTRACT) ADD #RTLEN,R1 ;LENGTH TO LOAD (WORDS) ADD #SWAPSZ,R0 ;POINT TO BLOCK WITH KMON JSR PC,READ ;READ THE MONITOR INTO PLACE .REPT 0 ;### CLR R0 ;CLEAR OUT LOW CORE ;### 33$: CLR (R0)+ ;### CMP R0,#402 ;DONE? ;### BNE 33$ ;IF NE-NO ;### MOV #ASLST,R0 ;NOW SET UP ASECTS ;### 34$: MOV (R0)+,R1 ;ADDR TO R1 ;### MOV (R0)+,(R1) ;MOVE IN CONTENTS ;### CMP (R0),#-1 ;END? ;### BNE 34$ ;IF NE-NO ;### .ENDR ;### MOV #RELLST,R0 ;POINT TO LIST OF THINGS TO RELOCATE MOV (SP)+,R1 ;R1 = SWAP BLOCK NUMBER MOV (SP)+,R4 ;R4 -> KMON IN CORE SUB #KMON,R4 ;SUBTRACT LOCATION KMON WAS LINKED TO MOV R1,$SWPBL(R4) ;R4 = BIAS. SET UP SWAP BLOCK # ADD #SWAPSZ,R1 ADD #KMONSZ,R1 MOV R1,$MONBL(R4) ;SET USR BLOCK # 1$: ADD R4,@(R0)+ ;RELOCATE A POINTER IN THE ASECT CMP R0,#RELST2 ;DONE YET ? BLO 1$ ;NO MOV (R0)+,R5 ;GET POINTER TO THING IN MONITOR 2$: ADD R4,R5 ;BIAS THE POINTER ADD R4,@R5 ;NOW RELOCATE THE WORD MOV (R0)+,R5 ;GET NEXT POINTER BNE 2$ MOV @#54,R0 ;POINT TO MONITOR .ENABL LSB BIS BCNFG,CONFIG(R0) ;SET HARDWARE CONFIGURATION CLR R3 ;COUNT DEVICE SLOTS MOV #$ENTRY,R1 ;POINT TO $ENTRY TABLE IN RMON ADD R4,R1 4$: TST (R1)+ ;RESIDENT DEVICE ? BEQ 5$ ;NO, SKIP IT ADD R4,-(R1) ;YES, FIX HANDLER POINTER CMP $PNAMO(R1),#SYNAME ;IS THIS THE SYSTEM DEVICE? BNE 45$ ;NO MOV R3,SYINDO(R0) ;SET SYSTEM INDEX NUMBER ADD R3,SYINDO(R0) ;(DOUBLED) MOV @R1,SYENTO(R0) ;AND SET UP SYSTEM ENTRY POINTER 45$: TST (R1)+ 5$: INC R3 ;ANY MORE ? CMP #$SLOT,R3 BNE 4$ ADD #SYBITO,R0 ;ADD IN OFFSET TO SYSTEM VECTOR IN MAP BISB #SYBITS,MAPOFF(R0) ;AND PROTECT IT MOV #$PNAME,R1 ;POINT TO PERM NAME TABLE ADD R4,R1 ADD #$DVREC,R4 ;POINT R4 TO $DVREC IN RMON MOV #$SLOT,R3 ;NUMBER TO LOOK UP 6$: MOV (R1)+,FNAME ;FILL IN NAME IN LOOKUP ADD HANDLX,FNAME ;***LOOKUP SY:HHX.SYS*** ;### .LOOKUP 0,#BLOOK ;LOOKUP SY:HH.SYS BCC 7$ ;GO IF THERE CLR (R4)+ ;CLEAR RECORD NUMBER BR 8$ 7$: .SAVEST 0,#CBLOK ;SAVE STATUS OF THING MOV CBLOK+2,@R4 ;SET STARTING RECORD INC (R4)+ ;FIX IT 8$: DEC R3 BNE 6$ MOV #100000,@#JSW ;NOTHING TO SWAP MOV #TTAST,TTDPB+Q.IOAE ;SET AST SRVC ROUTINE FOR TT OUTPUT ;### .PRINT #BSTRNG ;PRINT BOOT HEADER CLR R0 MOV $DSW,-(SP) ;SAVE DSW ;### DIR$ #CKDPB ;START CLOCK ;### MOV (SP)+,$DSW ;RESTORE DSW ;### BCC .+4 ;BR IF NO ERROR ;### HALT ;DIR. REJECTED ;### 10$: CLR R0 .EXIT .DSABL LSB BCLR: CLR @R1 ;TRAP MEANS THIS CONFIGURATION NYET RTI ;UNTRAP .SBTTL RELOCATION LIST RELLST: 4 ;ILLEGAL MEM AND INST. TRAPS 10 30 ;EMT 54 ;ADDRESS OF RMON 60 ;TTY VECTORS 64 100 ;CLOCK VECTOR SYVEC ;SYSTEM DEVICE VECTOR 244 ;LOCATION OF FPU TRAP CKAST+6 ;$TIME REF IN BOOT TASK ;### CKAST+12 ;DITTO ;### TICHK+4 ;TTIBUF REF IN BOOT TASK ;### RELST2: USRLOC ;LOCATION OF USR NOW $USRLC ;ADDRESS OF 'NORMAL' USR QCOMP ;QUEUE COMPLETION $KMLOC ;ADDRESS OF KMON TTIBUF ;TTY RING BUFFER--INPUT TTIBUF+2 TTIBUF+6 TTIBUF+10 TTOBUF ;TTY RING BUFFER--OUTPUT TTOBUF+4 TTOBUF+6 SYSLOW ;LOWEST USED LOCATION CORPTR+2 ;FREE CORE LIST $INPTR ;POINTER TO $INTEN IN RESIDENT HANDLER SYNCH ;SYNCHRONIZATION ADDRESS .IF NE BF MSGENT ;RELOCATE BF STUFF HERE TTIUSR TTOUSR FUDGE1 FUDGE2 BKGND1 BKGND2 BKGND3 CNTXT BCNTXT RMONSP SWIPTR SWOPTR .$CRTN .IFF TRAPLC TRAPER ;LOCS FOR TRAPS TO 4/10 FPPADD FPPIGN ;FPP SERVICE FOR MONITOR MONLOC ;WHERE USR WILL SIT I.CSW ;SINGLE USER STUFF HERE AVAIL ;MONITOR FREE Q POINTER .ENDC 0 ;END OF LIST BCNFG: .WORD KW11L$ ;HAVE CLOCK ;### TSLIST: .WORD KW11L$,HWDSP$,HWFPU$ ;BITS IN CONFIG WORD HANDLX: .RAD50 / X/ ;SO WE LOOKUP HHX.SYS FOR RSX ;### ; BLOOK IS THE ARGUMENT AREA FOR AN RT-11 LOOKUP. BLOOK: .RAD50 /SY / FNAME: .WORD 0,0 ;FILENAME GOES HERE .RAD50 /SYS/ CBLOK: .BLKW 5 ;SAVESTATUS GOES HERE ;+ ;;;GB003 ;CLEAN EXIT BACK TO RSX ; .=READ+1700 RSXIT: EXIT$S ;- ;;;GB003 .=READ+2000 ;PUT THIS IN A PLACE IT WON'T ;### ;MOVE MUCH ;### DPBBAS: ;### .SBTTL QIO DPB'S FOR RSX I/O ;### IDPB: QIO$ ,SY.LUN,SY.EFN,,SISTAT,,<0,0,0,0,0> ;### .=READ+2040 ;### TTDPB: QIO$ IO.WAL,TT.LUN,TT.EFN,,TTSTAT,, ;### .=READ+2100 ;### KBDPB: QIO$ IO.ATA,KB.LUN,KB.EFN,,KBSTAT,, ;;;GB009 .=READ+2130 ;### LPDPB: QIO$ IO.WLB,LP.LUN,LP.EFN,,LPSTAT,LPAST,<0,0,0> ;### .=READ+2160 ;### KSEF: SETF$ KB.EFN ;### CKDPB: MRKT$ CK.EFN,2,2,CKAST ;### .=READ+2200 ;### TIDPB: QIO$ IO.WLB,TT.LUN,LP.EFN,,LPSTAT,LPAST,<0,0,0> ;;;GB010 ; ; NOTE KKDPB REMOVED ;;;GB009 ; THIS AREA AVAILABLE FOR CODE IF NEEDED ;;;GB009 ; .=READ+2240 DXDPB: QIO$ IO.WLB,DX.LUN,DX.EFN,,DXSTAT,,<0,0,0,0,0> ;;;GB007 .=READ+2400 ;### TTSTAT: .BLKW 2 ;TT OUTPUT STATUS ;### TTBUF: .WORD 0 ;TT OUTPUT BUFFER ;### SISTAT: .BLKW 2 ;SYSTEM DEV I/O STATUS ;### WDPB: WTSE$ 0 ;FOR WAIT I/O ;### KBSTAT: .BLKW 2 ;KB INPUT STATUS ;### KBBUF: .WORD 0 ;KB INPUT BUFFER ;### LPSTAT: .BLKW 2 ;LP STATUS ;### DXSTAT: .BLKW 2 ;;;GB007 .=READ+2440 ;### ; ; DISABLE AST'S ;### ; DSABL: MOV $DSW,-(SP) ;SAVE DSW ;### DSAR$S ;DISABLE AST'S ;### MOV (SP)+,$DSW ;RESTORE DSW ;### BCC .+4 ;IF CC-NO ERROR ;### HALT ;ERROR ;### RTS PC ;RETURN ;### .=READ+2500 ;### ; ; ENABLE AST'S ;### ; ENABL: MOV $DSW,-(SP) ;SAVE DSW ;### ENAR$S ;ENABLE AST'S ;### MOV (SP)+,$DSW ;RESTORE DSW ;### BCC .+4 ;IF CC-NO ERROR ;### HALT ;ERROR ;### RTS PC ;RETURN ;### .=READ+2540 ;### ; ; TTIEX6--JUMPED TO WHEN TT AST SERVICE IS DONE ;### ; STARTS NEXT KBD READ AND EXITS FROM AST ;### ; TTIEX6: ASTX$S ;EXIT FROM AST ;### HALT ;### .=READ+2600 ;### ; ;RSTTDN--CALLED WHEN TT OUTPUT DONE IN RMON-RE-ENABLES ;### ;KBD READING ;### RSTTDN: BIS SP,ASTNPND ;SET NO AST PENDING ;### 240 ;REQ'D TO MAINTAIN ;;;GB009 240 ;ADDR RESOLUTION WITH ;;;GB009 240 ;RSXMON BECAUSE OF ;;;GB009 240 ;REMOVAL OF CODE ;;;GB009 240 ;;;GB009 240 ;;;GB009 240 ;;;GB009 240 ;;;GB009 240 ;;;GB009 CLR -(R5) ;(COPY OF S/J CODE) ;### XAST: MOV (SP)+,R4 ;RESTORE REGS ;### MOV (SP)+,R5 ;### XAST1: TST (SP)+ ;POP STATUS OF STACK ;### ASTX$S ;EXIT FROM AST SERVICE ROUTINE ;### HALT ;(IN CASE DIRECTIVE REJECTED) ;### .=READ+2700 ;### ; ;NULOUT AND R4OUT ARE CALLED FROM RSXMON.SYS TO OUTPUT ;### ;CHARACTERS TO TTY. NULOUT SIMULATES A TT OUT INTERRUPT TO GET ;### ;OUTPUT STARTED, AND R4OUT OUTPUTS THE CHAR. POINTED TO ;### ;BY R4. BOTH ROUTINES KILL ANY PENDING KEYBOARD READ ;### ; NULOUT: JSR PC,@64 ;GO SIMULATE TT INTERRUPT ;### RTS PC ;THIS GETS TT OUTPUT STARTED ;### R4OUT: MOV (R4),TTBUF ;CHAR TO BUFFER ;### TOUT: MOV $DSW,-(SP) ;SAVE DSW AROUND DIRECTIVE ;### DIR$ #TTDPB ;WRITE CHAR W/AST ;### BCC .+4 ;### HALT ;### MOV (SP)+,$DSW ;RESTORE DSW ;### RTS PC ;RETURN ;### .=READ+3000 ;### ; ; SST VECTOR TABLE FOR TASK-HANDLES EMT'S, TRAPS,... ;### ; SSTAB: ODDADR ;### MEMPRT ;### BPTR ;### IOTR ;### RSRVD ;### EMTR ;### TRAPR ;### FPXCPT ;### RSRVD: JMP @10 ;### ODDADR: JMP @4 ;### BPTR: JMP @14 ;### IOTR: JMP @20 ;### MEMPRT: ADD #6,SP ;POP JUNK OFF STACK ;### JMP @250 ;### EMTR: TST (SP)+ ;POP STUFF OFF STACK ;### JMP @30 ;### TRAPR: TST (SP)+ ;POP STUFF OFF STACK ;### JMP @34 ;### FPXCPT: JMP @244 ;### .=READ+3100 ;### ; ; AST SERVICE ROUTINES FOR KBD AND TT. AST COMES HERE ;### ; WHERE WE DO SOME INITIAL PROCESSING, AND THEN TRANSFER ;### ; VIA THE APPROPRIATE VECTOR TO THE RT INTERRUPT HANDLER ;### ; FOR THE DEVICE. ;### ; ; ; ESCAPE CHARACTER TO RETURN TO MCR ; AST ROUTINE WILL NOT PASS THIS CHARACTER TO RT11 ; ESCHAR = 32 ; ;;;GB009 ; KBAST: MOV (SP)+,KBBUF ;POP CHAR FROM STACK ;;;GB009 CMPB KBBUF,#ESCHAR ;ESCAPE TO RXS? ;;;GB009 BNE 1$ ;NO ;;;GB009 JMP RSXIT ;YES,EXIT TO RSX ;;;GB009 1$: MOVB @(SP),(PC)+ ;SAVE STATUS OF LAST RD ;;;GB009 KBST: .WORD 0 ;STATUS OF READ ;### BPL .+4 ;IF PL-NO ERROR ;### BR KBERR ;GO SEE IF ITS IE.ABO ;### TTINT: MOV $DSW,-(SP) ;SAVE DSW ;### DIR$ #KSEF ;SET KBD EVENT FLAG ;### MOV (SP)+,$DSW ;RESTORE DSW ;### BCC .+4 ;IF CC-NO ERROR ;### HALT ;ERROR ;### ;BY RSX OR RT-11 JMP @60 ;GO TO RT KB INTRPT HNDLR ;### TTAST: MOVB @(SP),(PC)+ ;GET STATUS OF LAST TT WRITE ;### TOSTAT: .WORD 0 ;LAST TT WRITE STATUS ;### BPL .+4 ;IF PL-NO ERROR-DO LIKE TT INTERRPT ;### HALT ;HALT ON TT OUTPUT ERROR ;###??? JMP @64 ;GO TO RT TT INTRPT HNDLR ;### KBERR: CMPB KBST,#IE.ABO ;ABORTED? ;### BEQ .+4 ;IF EQ-YES ;### HALT ;### TST KBSTAT+2 ;IS BYTE CNT NON 0? ;### BNE TTINT ;IF NE-YES ;### ASTX$S ;NO-JUST EXIT FROM AST ;### .=READ+3240 ;### ; ; PSEUDO LKCS--USED ONLY FOR CLEANNESS ;### ; LKCS: .WORD 0 ;PSEUDO LKCS-NEVER REALLY USED ;### ; ; CLOCK AST SERVICE ROUTINE ;### ; WE DO AN RSW MARK TIME FOR SOME CHUNK OF TIME, AND WHEN ;### ; THAT CHUNK EXPIRES, WE COME HERE AND 'TICK' THE RT-11 CLOCK ;### ; BY THE NUMBER OF CLOCK TICKS IN THE MARK TIME WE ISSUED ;### ; CKAST: TST (SP)+ ;CLR JUNK OFF ;### ADD #120.,$TIME+2 ;2 SECONDS PAST=120. TICKS ;### ADC $TIME ;### MOV $DSW,-(SP) ;### DIR$ #CKDPB ;ISSUE MARK TIME ;### MOV (SP)+,$DSW ;REST DSW ;### BCC .+4 ;### HALT ;### ASTX$S ;EXIT CLOCK AST ;### HALT ;### .=READ+3340 ;### ; ; LP AST SERVICE ROUTINE ;### ; ALL WE DO HERE IS SAVE LP STATUS AND JUMP THROUGH THE ;### ; LP INTERRUPT VECTOR TO THE LP HANDLER FOR QUEUE CLEANUP ;### ; LPAST: MOVB @(SP),(PC)+ ;SAVE STATUS ;### LPST: .WORD 0 ;### BPL .+4 ;### HALT ;### JMP @200 ;TRANSFER THROUGH LP VECTOR ;### .=READ+3400 ;### ; ;ROUTINE TO ISSUE RSX WAIT IF NO CHARS AVAIL FROM KBD ;### ; TICHK: BEQ 1$ TST TTIBUF+4 ;### BR 2$ ;### 1$: TSTB (R5) ;### 2$: BEQ NOINPT ;### ADD #2,(SP) ;### RTS PC ;### NOINPT: MOV $DSW,-(SP) ;### WTSE$S #KB.EFN ;### BPL .+4 ;### HALT ;### CLEF$S #KB.EFN ;CLEAR EVENT FLAG ;;;GB009 MOV (SP)+,$DSW ;RESTORE STATUS ;;;GB009 RTS PC ;### .=READ+3500 ;### ; ; TEST IF AST IS PENDING ;### ; TSTANP: JSR PC,DSABL ;DISABLE AST'S ;### TST ASTNPND ;IS AST NOT PENDING? ;### BEQ 1$ ;IF EQ-AST IS PENDING ;### JSR PC,NULOUT ;NO AST PENDING-GET TT OUTPUT ;### ;STARTED ;### CLR ASTNPND ;CLR FLAG-AST PENDING NOW ;### 1$: JSR PC,ENABL ;RE-ENABLE AST'S ;### RTS PC ;RETURN ;### .=READ+3540 ;### ASTNPND: .WORD 1 ;FLAG NOT 0 IF NO AST PENDING ;### ;IF NOT 0 MUST SIMULATE A TT OUT;### ;INTERRUPT TO GET OUTPUT STARTED;### ; ; END OF RT-11 TT OUTPUT PROCESSING ;### ; TTEXIT: TST ASTNPND ;IS AST PENDING? ;### BNE 1$ ;IF EQ-CAME FROM AST SRVC ;### JMP XAST1 ;ROUTINE-SO EXIT VIA ASTX$S ;### 1$: CLR ASTNPND ;IF NE-CAME FROM PSEUDO TT ;### ;OUTPUT INTERRUPT-SO EXIT VIA ;### ;RTS PC ;### RTS PC ;BACK TO NULOUT ;### ; ; FSRSZ$ 0 ;;;GB004 ; ; BKDA: .BLKW 256. ;### BUFFB = . .BLKW 1000 ;### .END BOOT