.TITLE DR11-W (RT11) GENERAL TEST ; ; THIS IS A TEST PROGRAM FOR THE 'SPFUN'/'READ'/'WRITE' REQUESTS TO THE CD ; DR11-W HANDLER. ----- ---- ----- ; ; .MCALL .LOOKUP,.READW,.WRITW,.FETCH,.SPFUN .MCALL .EXIT,.PRINT,.HRESET ; ERRBYT = 52 ; ; ; OFFSETS INTO THE READ/WRITE REQUEST'S CONTROL ; AND STATUS AREA ; B$PTC = 0 ;OFFSET TO PACKET TYPE CODE (PTC) B$MSGN = 2 ;OFFSET TO MESSAGE BLOCK NUMBER B$ERR = 4 ;OFFSET TO ERROR CODE RETURNED BY ; ; THE DRIVER ; ; ERROR REPORTING ; ; (1) IMMEDIATE ERROR RESPONCE IN BYTE 52 E52PTC = 11 ;INVALID PTC E52CHN = 2 ;CHANNEL IS NOT OPEN E52MNS = 3 ;MAXIMUM NUMBER OF OPEN SESSIONS EXCEEDED E52SPF = 4 ;NO SESSION OPEN FOR THIS PTC ; ; (ON FUNC.=376) E52SES = 5 ;NO SESSION OPEN FOR THIS PTC E52BLK = 6 ;INVALID BLOCK ADDRESS GIVEN E52WCN = 7 ;WORD COUNT IS 0 E52ISF = 10 ;INVALID SPFUN CODE ; ; (2) FINAL ERROR RESPONCE IN B$ERR EFNSUC = 1 ;SUCCESSFUL - MESSAGE RECEIVED EFNDTR = -10 ;DATA RECEIVED/XMITTED WAS TRUNCATED EFNPTC = -20 ;PTC REJECTED - RECEIVER HAS NO OPEN SESSION ; ; FOR THIS PTC EFNTIO = -30 ;READ/WRITE REQUEST TIMEOUT (OPTIONAL) EFNHER = -40 ;HARDWARE ERRORS EFNTMX = -50 ;TIMEOUT DURING MESSAGE XFER EFNWRR = -60 ;WRITE REQUEST REJECTED - THE OTHER PARTY ; ; HAS NO READ FOR THIS PTC EFNABO = -70 ;I/O KILLED (BY THE OTHER PARTY) ; ; WHILE IN PROCESS EFNABY = -100 ;I/O KILLED (BY YOURSELF) ; ; WHILE IN PROCESS ; ; .PAGE ; ; SPECIAL FUNCTION DEFINITIONS: ; SFOPNR = 377 ;OPEN 'READ' SESSION SFCLSR = 376 ;CLOSE 'READ' SESSION SFDFRT = 375 ;SET NEW DEFAULT REQUEST TIMEOUT ; ; ; ; TEST DEFINITIONS (A OR B): ; ATEST = 1 ;BTEST = 1 ; ; LOOP =1 ; .PAGE ; ; LOCAL MACRO'S ; ; .MACRO NO$ASC NASCII,?L1,?L2,?L3,?L4 ; ; THIS MACRO CONVERTS AN OCTAL 15-BIT NUMBER INTO A ; 5-DIGIT ASCII DECIMAL NUMBER. ; ; INPUT: REGISTER R0 ; OUTPUT: 5-BYTE AREA STARTING WITH ADDRESS IN 'NASCII' ; (MUST BE PROVIDED BY THE USERS) ; ; BR L1 .WORD 10000. ; .WORD 1000. ; .WORD 100. ; .WORD 10. ; .WORD 1. ; ; L1: MOV R1,-(SP) ;SAVE MOV R2,-(SP) ; REG- MOV R3,-(SP) ; IST- MOV R4,-(SP) ; ERS MOV #5,R3 ;ITERATION COUNTER MOV NASCII,R4 ;ASCII AREA ADDR MOV #L1-12,R2 ;DIVIDER'S ADDR MOV R0,R1 ;GET DIVIDEND ; L2: CLR R0 ;GET 'HI' DIVIDEND DIV (R2)+,R0 ;DIVIDE ADD #60,R0 ;CONVERT QUATIENT TO ASCII MOVB R0,(R4)+ ;GET QUATIENT SOB R3,L2 ;CONTINUE ; MOV #4,R3 ;ITERATION COUNTER MOV NASCII,R4 ;ASCII AREA ADDR ; L3: CMPB #60,(R4) ;IS IT ZERO? BNE L4 ;IF NE NO MOVB #40,(R4)+ ;MAKE IT ' ' (ASCII SPACE) SOB R3,L3 ;CONTINUE ; L4: MOV (SP)+,R4 ;RESTORE MOV (SP)+,R3 ; REG- MOV (SP)+,R2 ; IST- MOV (SP)+,R1 ; ERS ; .ENDM NO$ASC ; .PAGE ; START:: .FETCH #HSPACE,#CDNAME ;GET CD HANDLER BCC 10$ ;CD OK JMP FERR ;CD NOT AVAILABLE 10$: CLR R3 ;CHAN. 0 .LOOKUP #AREA,R3,#CDNAME ;OPEN CHANNEL 0 BCC 20$ ;LOOKUP OK JMP LKERR ;ERR. IN LOOKUP 20$: ; ; OPEN 'READ' SESSION ; MOV #SFOPNR,R5 ;SPFUN=OPEN 'READ' SESSION MOV #5,R2 ;NUMBER OF ITERATIONS MOV #1,R4 ;START WITH PTC=1 CHKSPF: MOV R4,PTC ;GET PTC .SPFUN #AREA,R3,R5,,,PTC ;OPEN 'READ' SESSION BCC 210$ ;NO ERR. IN SPFUN JSR PC,REQERR ;ERR. IN SPFUN 210$: INC R4 ;GET NEXT PTC SOB R2,CHKSPF ;CONTINUE ; ; PERFORM READ/WRITE REQUESTS ; CHKRW: MOV REPCNT,R1 ;GET REPEAT COUNT MOV WCOUNT,R2 ;GET WORD COUNT MOV MASK,R4 ;GET MASK .IIF DF BTEST COM R4 ;1'S COMPLEMENT MOV #BUFRD,R5 ;GET 'READ' BUFFER ADDR .IF NDF LOOP SUB R2,R5 ;ADJUST FOR WORD COUNT .ENDC 10$: BIT #1,R4 ;IS IT 'READ' REQUEST? BEQ 100$ ;IF EQ YES ; .IF NDF LOOP INCB BB .ENDC JSR PC,CDWRTE ;PERFORM 'WRITE' BR 200$ ;CONTINUE 100$: .IF NDF LOOP ADD R2,R5 ;GET NEXT FREE BUFFER .ENDC JSR PC,CDREAD ;PERFORM 'WRITE' 200$: BCC 220$ ;NO ERR. IF C CLEAR JSR PC,REQERR ;ERR. IN THE REQUEST 220$: MOV BLK+4,-(SP) ;GET FINAL ERROR CODE CMP #0,(SP) ;IS IT POSITIVE? BLT 240$ ;IF LT YES NEG (SP) ;GET ASR (SP) ; ERROR ASR (SP) ; CODE ASR (SP) ; IN TENS ADD #60,(SP) ;CONVERT TO ASCII MOVB (SP)+,ERFCDE+1 ;PREPARE FINAL ERROR MSG MOVB #55,ERFCDE ;ASCII '-' BR 250$ 230$: BR 10$ ;SEE CONTINUE (1) 240$: .IF DF LOOP ; BR 270$ ; .IFF ADD #60,(SP) ;CONVERT TO ASCII MOVB (SP)+,ERFCDE+1 ;PREPARE FINAL ERROR MSG MOVB #40,ERFCDE ;ASCII ' ' (SPACE) BR 270$ .IFTF 250$: .PRINT #ERFMSG ;SHOW FINAL ERROR MSG ; BIT #1,R4 ;IS IT 'READ' REQUEST? BEQ 260$ ;IF EQ YES ; .PRINT #P$WRTE ;SHOW .IFF .PRINT #BUFF ; MESSAGE SENT .IFTF BR 270$ 260$: .PRINT #P$READ ;SHOW .IFF .PRINT R5 ; MESSAGE RECEIVED .IFTF 270$: ; .PRINT #ERFMSG ;SHOW FINAL ERROR MSG ; ; .IFT ; ****** MOV (R5),R2 ;GET WORD COUNT MOV REPCNT,-(SP) ;GET REPEAT COUNT SUB R1,(SP) ;GET CURRENT VALUE MOV (SP),R0 ;PREPARE FOR PRINT MOV R0,REPEAT ;SAVE IT BIC #^C<1777>,(SP) ;IS IT CMP #0,(SP)+ ; READY FOR PRINT? BNE 300$ ;IF NE NO JSR PC,CDPRNT ;PRINT IT 300$: ; ****** .ENDC ; ROR R4 ;GET NEXT REQUEST ; ****** MOV R1,-(SP) ;IS BIC #^C<17>,(SP) ; MASK CMP #0,(SP)+ ; TO BE UPDATED? BNE 20$ ;IF NE NO MOV MASK,R4 ;GET MASK .IIF DF BTEST COM R4 ;1'S COMPLEMENT 20$: ; ****** SOB R1,230$ ;CONTINUE (1) ; .PRINT #TST$OK ;TEST IS OK .HRESET .EXIT ; CDWRTE: .IF NDF LOOP .WRITW #AREA,R3,#BUFF,R2,#BLK ;SEND A MSG OVER DR11-W .IFF .WRITW #AREA,R3,R5,R2,#BLK ;SEND A MSG OVER DR11-W .ENDC RTS PC CDREAD: .READW #AREA,R3,R5,R2,#BLK ;RECEIVE A MSG ON DR11-W RTS PC CDPRNT: NO$ASC #B$P ;CONVERT COUNT TO ASCII .PRINT #B$P ;SHOW COUNT RTS PC ; REQERR: MOVB @#ERRBYT,-(SP) ;GET IMMEDIATE ERROR RESPONCE ADD #60,(SP) ;CONVERT TO ASCII MOVB (SP)+,ERCODE ;PREPARE ERROR MESSAGE .PRINT #ERMSG ;SHOW ERROR MESSAGE RTS PC ; FERR: .PRINT #FMSG ;SHOW 'FETCH ERROR' .EXIT LKERR: .PRINT #LMSG ;SHOW 'LOOKUP ERROR' .EXIT ; ; DATA STRUCTURES ; CDNAME: .RAD50 /CD / .WORD 0,0,0,0 ; AREA: .BLKW 10 ; .PAGE ; SPFUN/READ/WRITE REQUEST DATA ; PTC: .WORD 0 ;CURRENT PTC REQUESTED ; BLK: .WORD 1,1,0,0 ;PTC, BLOCK #, CD ERROR RESP. MASK: .IF NDF LOOP .WORD 0 .IFF .WORD 125252 REPCNT: .IFT .WORD 20 .IFF .WORD 077777 ;REPEAT COUNT WCOUNT: .IFT .WORD 10. .IFF .WORD 4000. .ENDC REPEAT: .WORD 0 BUFF: .ASCII /HI. DR11W MESSAGE / BB: .BYTE 60,0,0,0,0,0 ; B$P: .ASCIZ /00000/ ; ; ERROR MESSAGES ; FMSG: .ASCIZ /NO DEVICE?/ LMSG: .ASCIZ /LOOKUP ERROR?/ SFMSG: .ASCIZ /SPFUN ERROR?/ ; ERMSG: .ASCII /IMMEDIATE ERROR: CODE = / ERCODE: .BYTE 0,0,0 ERFMSG: .ASCII /FINAL ERROR: CODE = / ERFCDE: .BYTE 0,0,0,0 P$WRTE: .ASCII /WRITE: / .BYTE 200,0 P$READ: .ASCII /READ: / .BYTE 200,0 .EVEN ; TST$OK: .ASCIZ /TEST OK: SPFUN-READ-WRITE/ ; .EVEN BUFRD: .WORD 4000. .BLKW 3999. TEND:: .WORD 0 ; ; START OF CD HANDLER ; HSPACE = 40000 ; .END START