;+ ;Copyright (c) 2015-2016, 2022 Oleg Safiullin ; ;Permission to use, copy, modify, and distribute this software for any ;purpose with or without fee is hereby granted, provided that the above ;copyright notice and this permission notice appear in all copies. ; ;THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ;WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ;MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ;ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ;WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ;ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ;OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;- .MCALL .MODULE .MODULE RK,VERSION=1,COMMENT=,AUDIT=YES .MCALL ALUN$S,DIR$,DRERR$,QIO$ ;RSX-11 MACRO CALLS .MCALL QIOSY$ ; .MCALL .ASSUME,.DRDEF ;RT-11 MACRO CALLS QIOSY$ ;DEFINE QIO FUNCTION CODES DRERR$ ;DEFINE DIRECTIVE ERROR CODES .DRDEF RK,0,FILST$,4800.,0,220 ;DEFINE DRIVER PARAMETERS .DRPTR FETCH=RKLOA,LOAD=RKLOA ;DEFINE SERVICE ROUTINES .ASSUME RTE$M NE 0,MESSAGE=<;Unsupported configuration> .DRINS RK TST (PC)+ ;DATA HANDLER INSTALL ENTRY SEC ;SYSTEM HANDLER INSTALL ENTRY ROL R5 ;SAVE SYSTEM/DATA FLAG CMP #RTE$ID,@#$RTEID ;CHECK IF WE RUNNING UNDER RTEM SEC ;ASSUME NON-RTEM SYSTEM BNE 40$ ;BRANCH IF SO BIT #1,R5 ;SYSTEM HANDLER INSTALLATION? BNE 10$ ;BRANCH IF SO CALL 50$ ;CHECK HOST SYSTEM DEVICE BCS 40$ ;BRANCH IF NOT FOUND 10$: CLR R1 ;START FROM UNIT 0 20$: MOV R1,R0 ;R0=UNIT INC R1 ;BUMP CMP #7,R0 ;HIGHEST UNIT NUMBER REACHED? BLO 30$ ;BRANCH IF SO ADD #^RRK0,R0 ;CONVERT TO RADIX-50 NAME MOV @#$RTELK,-(SP) ;SEARCH FOR A LUN ATTACHED TO DEVICE ADD #.$FNDL,@SP ; MOV @(SP)+,-(SP) ; CALL @(SP)+ ; BCS 20$ ;BRANCH IF NOT FOUND ROL R5 ;CLEAR CARRY FOR RETURN 30$: ROR R5 ;RESTORY CARRY 40$: RETURN ;RETURN .ASSUME . LE 400,MESSAGE=<;Installation code area overflow> .=402 50$: MOV R5,-(SP) ;SAVE R5 MOV @#$DSW,-(SP) ;SAVE $DSW/$UFLOA CLR R5 ;START FROM UNIT 0 60$: CLR R0 ;R0=DEVICE NAME (NONE) CLR R1 ;R1=JOB NUMBER (B) MOV @#$RTELK,-(SP) ;ALLOCATE A LUN ADD #.$ALCL,@SP ; MOV @(SP)+,-(SP) ; CALL @(SP)+ ; BCS 80$ ;BRANCH IF FAILED ALUN$S R0,#"DK,R5 ;ASSIGN LUN TO HOST DEVICE (DK:) MOV @#$DSW,-(SP) ;SAVE $DSW MOV @#$RTELK,-(SP) ;DEALLOCATE LUN ADD #.$DACL,@SP ; MOV @(SP)+,-(SP) ; CALL @(SP)+ ; CMP (SP)+,#IE.IDU ;INVALID DEVICE OR UNIT? BNE 70$ ;BRANCH IF NOT CMP #7,R5 ;HIGHEST UNIT NUMBER REACHED? BLO 80$ ;BRANCH IF SO INC R5 ;BUMP BR 60$ ; 70$: TST (PC)+ ;SUCCESS 80$: SEC ;FAILURE MOV (SP)+,@#$DSW ;RESTORE $DSW MOV (SP)+,R5 ;RESTORE R5 RETURN ; .DRBEG RK .ENABL LSB MOV RKCQE,R5 ;GET QUEUE ELEMENT MOV (R5)+,R1 ;GET BLOCK NUMBER TSTB (R5)+ ;SKIP OVER FUNCTION CODE MOVB (R5)+,R0 ;GET DEVICE UNIT BIC #^C7,R0 ;MASK IRRELEVANT BITS ADD #^RRK0,R0 ;CONVERT TO DEVICE NAME MOV @#$RTELK,R2 ;POINT TO LINK AREA CALL @.$FNDL(R2) ;FIND LUN BCS RKERR ;CS = NOT FOUND JSR R1,10$ ;QUEUE I/O RKQIO:: QIO$ ,,,,RKISB-RKQIO,RKINT-RKQIO-4 ;QIO DPB RKISB:: .BLKW 2 ;I/O STATUS BLOCK 10$: MOVB R0,Q.IOLU(R1) ;SET LUN MOVB R0,Q.IOEF(R1) ;SET EFN MOV (SP)+,Q.IOPL+10(R1) ;SET BLOCK NUMBER MOV (R5)+,Q.IOPL(R1) ;SET BUFFER ADDRESS MOV #IO.RLB,R3 ;ASSUME READ FUNCTION MOV (R5)+,R4 ;GET WORD COUNT BPL 20$ ;PL = READ TST R0 ;IS LUN READ ONLY? BMI RKERR ;MI = YES NEG R4 ;UPDATE WORD COUNT ASR R3 ;UPDATE FUNCTION CODE 20$: ASL R4 ;CONVERT WORD COUNT TO BYTES MOV R3,Q.IOFN(R1) ;SET FUNCTION CODE MOV R4,Q.IOPL+2(R1) ;SET BYTE COUNT JSR R5,@.$XDIR(R2) ;PREPARE FOR CALLING QIO .WORD 0 ;DO NOT USE STATUS BLOCK HERE DIR$ R1 ;EXECUTE DIRECTIVE CALL @(SP)+ ;CALL WSIG COROUTINE BCS RKERR ;CS = ERROR RETURN ;RETURN .DSABL LSB RKERR:: MOV RKCQE,R4 ;GET QUEUE ELEMENT BIS #HDERR$,@-(R4) ;SET HARD ERROR STATUS RKFIN:: .DRFIN RK ;FINISH I/O CMP (SP)+,(PC)+ ;POP STATUS, SKIP RETURN .DRAST RK,4 ;ENTER INTERRUPT STATE TSTB RKISB ;CHECK I/O STATUS BMI RKERR ;MI = ERROR BR RKFIN ;FINISH I/O .DRBOT RK,BOOT1,READ .=RKBOOT+40 BOOT1: JMP @#BOOT-RKBOOT .=RKBOOT+254 READ: MOV R0,R3 ;SAVE BLOCK NUMBER MOV RKBOOT+772,R0 ;GET ADDRESS OF QIOW DPB MOV R2,Q.IOPL(R0) ;SET BUFFER ADDRESS ASL R1 ;CONVERT WORD COUNT TO BYTES MOV R1,Q.IOPL+2(R0) ;SET BYTE COUNT MOV R3,Q.IOPL+10(R0) ;SET BLOCK NUMBER JMP @RKBOOT+774 ;PERFORM I/O BOOT: JSR R0,BPRINT ;PRINT ERROR MESSAGE AND HALT .ASCII <0><0> .ASCII /?BOOT-U-Cannot boot RTEM standalone/<200> .ASSUME . LE RKBOOT+550 .=RKBOOT+550 BPRINT: TSTB @#TPS ;TERMINAL PRINTER READY? BPL BPRINT ;PL = NO MOVB (R0)+,@#TPB ;PRINT CHARACTER BPL BPRINT ;PL = MORE TO PRINT 10$: HALT ;HALT PROCESSOR BR 10$ ; .ASSUME . LE RKBOOT+570 .DREND RK .PSECT SETOVR RKLOA:: MOV @R5,R5 ;GET ADDRESS OF ... ADD #RKQIO-RKLQE,R5 ;...QIO DPB ADD R5,Q.IOAE(R5) ;SET ADDRESS OF AST ROUTINE ADD R5,Q.IOSB(R5) ;SET ADDRESS OF STATUS BLOCK RETURN ;RETURN .END