.MCALL .MODULE .MODULE SK,VERSION=02,COMMENT=,AUDIT=YES .SBTTL PREAMBLE SECTION .MCALL .QELDF, .DRBEG, .DRAST, .DRFIN, .DREND, .FORK ; SYSGEN DEFAULT DEFINITIONS: .IIF NDF MMG$T, MMG$T = 0 .IIF NDF ERL$G, ERL$G = 0 .IIF NDF TIM$IT, TIM$IT = 0 ; DEVICE UNIBUS ADDRESSES: .IIF NDF SK$VEC, SK$VEC = 200 ;SK VECTOR .IIF NDF SK$CSR, SK$CSR = 177514 ;SK CONTROL STATUS REGISTER SKBR = SK$CSR+2 ;SK BUFFER REGISTER HDERR = 1 ;HARD ERROR ON CHANNEL ; DEVICE STATUS INFORMATION: SKDSIZ = 0 ;DEVICE BLOCK SIZE SKSTS = 20003 ;DEVICE STATUS WORD ; DEFINITION OF Q ELEMENT SYMBOLICS: .QELDF WCNT = Q.WCNT - Q.BLKN BUFF = Q.BUFF - Q.BLKN .SBTTL SET OPTIONS .ASECT . = 400 NOP .RAD50 /RANDOM/ .WORD /2+100000 .WORD 0 ;END OF LIST O.RNDM: MOV (PC)+,R3 ;GET NEW INSTRUCTION TO STORE MOVB SP,R0 ;CHANGE INST FOR SET OPTION MOV R3,SKOPT ;STORE IT IN HANDLER BODY RTS PC ;DONE WITH SET OPTION CHANGE .SBTTL HEADER SECTION .DRBEG SK,SK$VEC,SKDSIZ,SKSTS ; ENTRY POINT FORM QUEUE MANAGER MOV SKCQE,R4 ;R4 -> CURRENT QUEUE ELEMENT ASL WCNT(R4) ;MAKE WORD COUNT A BYTE COUNT BCC SKERR ;A READ REQUEST IS ILLEGAL BEQ SKDONE ;A SEEK COMPLETES IMMEDIATELY RET: BIS #100,@#SK$CSR ;ENABLE INTERRUPTS RTS PC ;EXIT AND WAIT FOR ONE .SBTTL INTERRUPT TRAP PROCESSING .DRAST SK,4,SKDONE ; INTERRUPT SERVICE: .IF EQ MMG$T .IFTF MOV SKCQE,R4 ;;;R4 -> CURRENT QUEUE ELEMENT TST @#SK$CSR ;;;ERROR? BMI RET ;;;YES IF MI, HANG UNTIL CORRECT TSTB @#SK$CSR ;;;IS DEVICE READY? BPL RET ;;;NO IF PL, EXIT AND WAIT CLR @#SK$CSR ;;;YES, DISABLE INTERRUPTS ; PROCESS REMAINING CODE AT FORK LEVEL .FORK SKFBLK ;REQUEST FORK PROCESS SKNEXT: TSTB @#SK$CSR ;READY FOR ANOTHR CHARACTER? BPL RET ;BR IF NOT READY TST WCNT(R4) ;ANY LEFT TO PRINT? BEQ SKDONE ;NO IF EQ, XFER IS DONE .IFT MOVB @BUFF(R4),R5 ;GET A CHARACTER INC BUFF(R4) ;BUMP BUFFER POINTER .IFF JSR PC,@$GTBYT ;GET A CHARACTER MOV (SP)+,R5 ; INTO R5 .IFTF INC WCNT(R4) ;BUMP CHARACTER COUNT MOV #177770,R5 ;7 BIT ASCII SKOPT: NOP ;RANDOM OPTION BY SET COMMAND MOVB R5,@#SKBR ;PUT IT OUT TO DEVICE BR SKNEXT ;TRY FOR ANOTHER .ENDC .SBTTL I/O COMPLETION SECTION SKERR: BIS #HDERR,@Q.CSW-Q.BLKN(R4) ;SET ERROR BIT IN CHANNEL SKDONE: BIC #100,@#SK$CSR ;DISABLE INTERRUPTS .DRFIN SK ;GO TO I/O COMPLETION SKFBLK: .WORD 0,0,0,0 ;FORK QUEUE ELEMENT .DREND SK .END