;+ ;Copyright (c) 2016 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 HD,VERSION=1,COMMENT=,AUDIT=YES SF.SIZ =: 373 ;DEVICE SIZE FUNCTION .MCALL DIR$,GLUN$,QIO$,QIOSY$ ;RSX-11 MACRO CALLS .MCALL .ASSUME,.DRDEF ;RT-11 MACRO CALLS QIOSY$ ;DEFINE QIO FUNCTION CODES .DRDEF HD,362,FILST$!SPFUN$!VARSZ$,0,0,0 ;DEFINE DRIVER PARAMETERS .DRPTR FETCH=HDLOA,LOAD=HDLOA ;DEFINE SERVICE ROUTINES .ASSUME RTE$M NE 0,MESSAGE=<;Unsupported configuration> .DRINS HD NOP ;INSTALLATION ROUTINE CMP #RTE$ID,@#$RTEID ;CHECK RTEM ID BEQ 10$ ;EQ=OK SEC ;FLAG ERROR 10$: RETURN ;RETURN .ASSUME . LE 400,MESSAGE=<;Installation code overflow> .DRBEG HD .ENABL LSB MOV HDCQE,R5 ;GET QUEUE ELEMENT MOV (R5)+,R1 ;GET BLOCK NUMBER MOVB (R5)+,R3 ;GET OVER FUNCTION CODE MOVB (R5)+,R0 ;GET DEVICE UNIT BIC #^C7,R0 ;MASK IRRELEVANT BITS ADD #^RHD0,R0 ;CONVERT TO DEVICE NAME MOV @#$RTELK,R2 ;POINT TO LINK AREA CALL @.$FNDL(R2) ;FIND LUN BCS HDERR ;CS = NOT FOUND TSTB R3 ;SPFUN REQUEST? BMI HDSPF ;MI = YES JSR R1,10$ ;QUEUE I/O HDQIO:: QIO$ ,,,,HDISB-HDQIO,HDINT-HDQIO-4 ;QIO DPB HDLBF:: .BLKW 4 ;LUN INFO BUFFER HDISB:: .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 HDERR ;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,@.$WSIG(R2) ;PREPARE FOR CALLING QIO .WORD 0 ;DO NOT USE STATUS BLOCK HERE DIR$ R1 ;EXECUTE DIRECTIVE CALL @(SP)+ ;CALL WSIG COROUTINE BCS HDERR ;CS = ERROR RETURN ;RETURN .DSABL LSB HDERR:: MOV HDCQE,R4 ;GET QUEUE ELEMENT BIS #HDERR$,@-(R4) ;SET HARD ERROR STATUS HDFIN:: .DRFIN HD ;FINISH I/O .ENABL LSB HDSPF:: CMPB #SF.SIZ,R3 ;SIZE FUNCTION? BNE HDERR ;NE = NO JSR R0,10$ ;GET LUN INFO HDGLN:: GLUN$ ,HDLBF-HDQIO ;GLUN DPB 10$: MOVB (SP)+,G.LULU(R0) ;SET LUN MOV @#$DSW,-(SP) ;SAVE @#46 DIR$ R0 ;EXECUTE RSX DIRECTIVE MOV (SP)+,@#$DSW ;RESTORE DSW BCS HDERR ;CS = ERROR MOV #65535.,R1 ;ASSUME HD32 DISK TST HDLBF+G.LUCW+2 ;REALLY? BNE 20$ ;IF NE YES MOV HDLBF+G.LUCW+4,R1 ;GET DEVICE SIZE 20$: MOV R1,@(R5)+ ;PUT INTO BUFFER BR HDFIN ;FINISH I/O .DSABL LSB CMP (SP)+,(PC)+ ;POP STATUS, SKIP RETURN .DRAST HD,4 ;ENTER INTERRUPT STATE TSTB HDISB ;CHECK I/O STATUS BMI HDERR ;MI = ERROR BR HDFIN ;FINISH I/O .DRBOT HD,BOOT1,READ .=HDBOOT+40 BOOT1: JMP @#BOOT-HDBOOT .=HDBOOT+254 READ: MOV R0,R3 ;SAVE BLOCK NUMBER MOV HDBOOT+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 @HDBOOT+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 HDBOOT+550 .=HDBOOT+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 HDBOOT+570 .DREND HD .PSECT SETOVR HDLOA:: MOV @R5,R5 ;GET ADDRESS OF ... ADD #HDQIO-HDLQE,R5 ;...QIO DPB ADD R5,Q.IOAE(R5) ;SET ADDRESS OF AST ROUTINE ADD R5,Q.IOSB(R5) ;SET ADDRESS OF STATUS BLOCK ADD R5,HDGLN-HDQIO+G.LUBA(R5) ;SET ADDRESS OF GLUN BUFFER RETURN ;RETURN .END