;+ ; Copyright (c) 2014 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. ; ; $PDP11: etm.mac,v 1.1 2014/06/09 10:05:26 form Exp $ ;- .TITLE ETM -- TIME OVER ETHERNET .IDENT /V03.00/ $USRTO == 50 ;USER TOP ADDRESS $USRRB == 53 ;USER ERROR BYTE WARN$ == 2 ;WARNING STATUS FATAL$ == 10 ;FATAL ERROR BIT $SYSVE == 276 ;RT-11 VERSION NUMBER OFFSET $TSXVE == -32. ;TSX-PLUS VERSION NUMBER OFFSET $CNFG1 == 300 ;SYSTEM CONFIG WORD OFSET CLK50$ == 40 ;50-CYCLE CLOCK BIT $CNFG2 == 370 ;EXTENSION CONFIG WORD OFFSET BUS$M == 20100 ;MASK FOR BUS BITS BUS$U == 0 ;VALUE FOR UNIBUS BUS$Q == 100 ;VALUE FOR Q-BUS BUS$C == 20000 ;VALUE FOR CTI BUS BUS$X == 20100 ;VALUE FOR OTHER BUS OR BUSLESS $SYSGE == 372 ;SYSGEN FEATURE WORD OFFSET TSXP$ == 100000 ;TSX-PLUS SYSTEM BIT RTEM$ == 10 ;RTEM-11 SYSTEM BIT $MONAM == 406 ;MONITOR FILE NAME OFFSET SF.NAL == 200 ;ALLOCATE/DEALLOCATE UNIT FUNCTION SF.NPR == 202 ;ENABLE/DISABLE PROTOCOL FUNCTION SF.NWR == 204 ;TRANSMIT FRAME FUNCTION SF.NRD == 205 ;RECEIVE FRAME FUNCTION CH.NET = 0 ;CHANNEL FOR NETWORK I/O CH.MON = 1 ;CHANNEL FOR MONITOR FILE I/O CR = 15 ;CARRIAGE RETURN LF = 12 ;LINE FEED EOL = 200 ;END OF LINE (NO CRLF) .MCALL .ABTIO,.CMKT,.EXIT,.FETCH .MCALL .GVAL,.GTLIN,.LOOKUP,.MRKT .MCALL .PRINT,.PURGE,.QSET,.READW .MCALL .SDTTM,.SERR,.SPFUN .PSECT CODE,GBL,I,RO START:: .GVAL #AREA,#$SYSGE ;GET SYSGEN FEATURE WORD MOV R0,R5 ;SAVE IT BMI 20$ ;IF MI, TSX-PLUS SYSTEM .GVAL #AREA,#$SYSVE ;GET MONITOR VERSION CMPB #5,R0 ;RT-11 V5 OR NEWER? BLOS 40$ ;YES, OK .PRINT #EVERS ;NO, PRINT ERROR MESSAGE 10$: BISB #FATAL$,@#$USRRB ;SET FATAL ERROR STATUS .EXIT ;EXIT 20$: JSR R0,30$ ;READ JOB PRIVILEGES .BYTE 1,150 ;FUNCTION CODE .BYTE 0,0 ;SUBFUNCTION CODE .WORD AREA ;BUFFER ADDRESS .WORD 0 ; 30$: TST (SP)+ ;RESTORE STACK EMT 375 ;CALL TSX-PLUS RORB AREA+1 ;CHECK OPER PRIVILEGE BCS 35$ ;IF CS, OK .PRINT #EPRIV ;PRINT ERROR MESSAGE BR 10$ ;EXIT WITH ERROR STATUS 35$: .GVAL #AREA,#$TSXVE ;GET TSX-PLUS VERSION MOV R0,R1 ; CLR R0 ; DIV #100.,R0 ; MOV #AREA+4,R2 ; MOV R1,-(R2) ; MOV R0,-(R2) ; MOV #IDENT,R0 ;PUT IDENT STRING MOV #TSXID,R1 ; CALL $EDMSG 40$: MOV #BUFF,R3 ;POINT TO BUFFER .GTLIN R3,#PROMP ;READ PROGRAM OPTIONS MOV R3,R1 ;COPY COMMAND LINE ADDRESS 50$: TSTB @R1 ;END OF LINE BEQ 70$ ;IF EQ, YES BICB #^C177,@R1 ;CLEAR PARITY BIT CMPB #<' >,@R1 ;SPACE? BEQ 60$ ;YES, SYNTAX ERROR CMPB #'A+40,@R1 ;LOWERCASE? BHI 55$ ;NO CMPB #'Z+40,@R1 ; BLO 55$ ;NO BICB #40,@R1 ;CONVERT TO UPPERCASE 55$: INC R1 ;GO FOR NEXT BR 50$ ; 60$: .PRINT #ESYNT ;PRINT ERROR MESSAGE BR 10$ ;EXIT WITH ERROR STATUS 70$: TSTB @R3 ;END OF LINE? BEQ 90$ ;IF EQ, YES CMPB #'/,(R3)+ ;SLASH? BNE 75$ ;NO CALL CMPOP ;COMPARE OPTION BCS 80$ ;IF CS, INVALID OPTION BIS R1,FLAGS ;SET OPTION BR 70$ ;GO FOR NEXT 75$: DEC R3 ;POINT TO LAST CHAR CMP R3,#BUFF ;OPTION PROCESSED? BEQ 60$ ;NO, SYNTAX ERROR 80$: .PRINT #EOPTN ;INVALID OPTION MESSAGE 85$: BR 10$ ;EXIT WITH ERROR STATUS 90$: BIT #,FLAGS ;SHOW OR SET SPECIFIED? BNE 100$ ;YES BIS #FL.SHO,FLAGS ;SET SHOW BY DEFAULT 100$: BIT #RTEM$,R5 ;RTEM-11 SYSTEM? BEQ 130$ ;IF EQ, NO, CONTINUE BIT #FL.SIL,FLAGS ;SILENT MODE? BNE 120$ ;IF NE, YES .PRINT #WRTEM ;PRINT WARNING MESSAGE 120$: BISB #WARN$,@#$USRRB ;SET WARNING STATUS .EXIT ;EXIT 130$: .GVAL #AREA,#$CNFG2 ;READ EXTENSION CONFIG WORD BIC #^CBUS$M,R0 ;RELEVANT MASK MOV #<^R Q >,R1 ;ASSUME Q-BUS MACHINE CMP #BUS$Q,R0 ;Q-BUS? BEQ 150$ ;YES MOV #<^R U >,R1 ;ASSUME UNIBUS MACHINE CMP #BUS$U,R0 ;UNIBUS? BEQ 150$ ;YES MOV #<^RNC >,R1 ;ASSUME CTI BUS MACHINE CMP #BUS$C,R0 ;CTI BUS? BNE 140$ ;NO TST R5 ;TSX-PLUS SYSTEM? BPL 160$ ;NO 140$: .PRINT #EHARD ;UNSUPPORTED HARDWARE MESSAGE BR 85$ ;EXIT WITH ERROR STATUS 150$: .SERR ;DISABLE ?MON-F ABORTS MOV R1,R0 ;TRY EQ/EU HANDLER FIRST ADD #<^RE >,R0 ; CALL FETCH ; BCC 180$ ;IF CC, HANDLER LOADED TST R5 ;TSX-PLUS SYSTEM? BMI 170$ ;IF MI, YES ADD #<^RN >,R1 ;TRY NQ/NU/NC HANDLER 160$: MOV R1,R0 ; CALL FETCH ; BCC 180$ ;IF CC O 170$: .PRINT #ENDEV ;DEVICE NOT AVAILABLE MESSAGE BR 85$ ;EXIT WITH ERROR STATUS 180$: MOV #<^R 0>,R2 ;INITIAIZE UNIT NUMBER MOV #8.,R3 ;SET UNIT COUNT 185$: MOV R1,DBLK ;SET DEVICE NAME ADD R2,DBLK ; .LOOKUP #AREA,#CH.NET,#DBLK ;LOOKUP DEVICE BCS 190$ ;IF CS, ERROR .SPFUN #AREA,#CH.NET,#SF.NAL,#BUFF,#0,#1 ;ALLOCATE UNIT BCC 200$ ;IF CC, OK 190$: .PURGE #CH.NET ;PURGE CHANNEL INC R2 ;INCREASE UNIT NUMBER DEC R3 ;MORE UNITS? BNE 185$ ;YES, GO FOR NEXT .PRINT #EUNIT ;NO UNITS AVAILABLE MESSAGE BR 85$ ;EXIT WITH ERROR STATUS 200$: MOV #^RTIM,BUFF+12 ;SET PROTOCOL TYPE .SPFUN #AREA,#CH.NET,#SF.NPR,#BUFF+10,#0,#1 ;ENABLE PROTOCOL BCC 210$ ;IF CC, OK CALL DEALU ;DEALLOCATE UNIT BR 190$ ;TRY NEXT UNIT 210$: MOV #BUFF+2,R0 ;COPY STATION ADDRESS MOV #SRCA,R1 ; MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; TST R5 ;TSX-PLUS SYSTEM? BMI 245$ ;YES, SKIP MONITOR FILE READING MOV #<^RSY >,DBLK ;SET SYSTEM DEVICE NAME .GVAL #AREA,#$MONAM ;SET MONITOR FILE NAME MOV R0,DBLK+2 ; .GVAL #AREA,#$MONAM+2 ; MOV R0,DBLK+4 ; MOV #^RSYS,DBLK+6 ;SET MONITOR FILE EXTENSION .LOOKUP #AREA,#CH.MON,#DBLK ;LOOKUP MONITOR FILE BCS 220$ ;IF CS, ERROR .READW #AREA,#CH.MON,#BUFF,#256.,#4 ;READ MONITOR FILE BCC 230$ ;IF CC, OK 220$: BISB #WARN$,@#$USRRB ;SET WARNING STATUS BIT #FL.SIL,FLAGS ;SILENT MODE? BNE 240$ ;IF NE, YES .PRINT #WMONF ;PRINT WARNING MESSAGE 230$: MOV #BUFF+742,R0 ;COPY MONITOR IDENT STRING MOV #IDENT,R1 ; 235$: MOV (R0)+,(R1)+ ; CMP R0,#BUFF+774 ; BNE 235$ ; 240$: .PURGE #CH.MON ;PURGE MONITOR FILE CHANNEL 245$: .GVAL #AREA,#$CNFG1 ;READ SYSTEM CONFIG WORD BIT #CLK50$,R0 ;50-CYCLE SYSTEM CLOCK? BEQ 250$ ;IF EQ, NO MOV #50.,HZ ;UPDATE HZ 250$: .QSET #QELM,#1 ;ADD QUEUE ELEMENT FOR MRKT CLR DBLK ;SET TIME INTERVAL TO 4 SECONDS MOV HZ,DBLK+2 ; ASL DBLK+2 ; ASL DBLK+2 ; .SPFUN #AREA,#CH.NET,#SF.NWR,#DATA,#WCNT,#0 ;TRANSMIT FRAME BCC 270$ ;IF CC, OK 260$: .PRINT #ENTIO ;PRINT NETWORK I/O ERROR MESSAGE BISB #FATAL$,@#$USRRB ;SET FATAL ERROR STATUS 265$: CALL DEALU ;DEALLOCATE UNIT .PURGE #CH.NET ;PURHE NETWORK CHANNEL .EXIT ;EXIT 270$: .MRKT #AREA,#DBLK,#CRTN,#. ;MARK TIME .SPFUN #AREA,#CH.NET,#SF.NRD,#DATA,#WCNT,#0 ;RECEIVE FRAME ROL R1 ;SAVE CARRY .CMKT #AREA,#0 ;CANCEL MARK TIME REQUEST ROR R1 ;RESTORE CARRY BCS 260$ ;IF CS I/O ERROR CMP #*2,DATA+2 ;CHECK FRAME SIZE BEQ 300$ ;IF EQ, OK 280$: BIT #FL.SIL,FLAGS ;SILENT MODE? BNE 290$ ;IF NE, YES .PRINT #WANSW ;PRINT INVALID ANSWER MESSAGE 290$: BISB #WARN$,@#$USRRB ;SET WARING STATE 295$: BR 265$ ;EXIT WITH STATUS 300$: CMP #<^RANS>,CODE ;CHECK FUNCTION CODE BNE 290$ ;IF NE, ERROR BIT #FL.OLD,FLAGS ;FIX DATE FOR OLD SYSTEM? BEQ 305$ ;IF EQ, NO CALL FIXDT ;FIX DATE 305$: BIT #FL.SET,FLAGS ;SET TIME? BEQ 310$ ;IF EQ, NO .SDTTM #AREA,#DATE ;SET DATE AND TIME 310$: BIT #FL.SHO,FLAGS ;SHOW TIME? BEQ 265$ ;IF EQ, NO MOV #BUFF,R3 ;POINT TO OUTPUT BUFFER MOV R3,R0 ;SET BUFFER ADDRESS MOV #IDTTM,R1 ;SET FORMAT STRIG MOV #RSXD,R2 ;SET ARGUMENT BLOCK ADD #1900.,@R2 ;ENABLE 4 DIGIT YEAR CALL $EDMSG ;EDIT MESSAGE CLRB @R0 ;MAKE STRING ASCIZ .PRINT R3 ;PRINT STRING MOV R3,R0 ;SET BUFFER ADDRESS MOV #ISYAD,R1 ;SET FORMAT STRING CALL $EDMSG ;EDIT MESSAGE MOV #SRCA,R5 ;POINT TO SOURCE ADDRESS MOV #6,R4 ;SET BYTE COUNT 320$: MOVB (R5)+,R1 ;GET BYTE SWAB R1 ;CONVERT TO HEX BYTE STRING CALL HEXBY ; DEC R4 ;MORE WORDS? BEQ 330$ ;NO MOVB #'-,(R0)+ ; BR 320$ ;GO FOR NEXT 330$: TSTB IDENT ;IDENT RECEIVED? BEQ 340$ ;NO MOV #ISYID,R1 ;SET FORMAT STRING MOV #AREA,R2 ;SET ARGUMENT BLOCK MOV #IDENT,@R2 ;SET ARGUMENT CALL $EDMSG ;EDIT MESSAGE 340$: CLRB @R0 ;MAKE STRING ASCIZ .PRINT R3 ;PRINT MESSAGE BR 295$ ;EXIT CRTN:: .ABTIO #CH.NET ;ABORT I/O BIT #FL.SIL,FLAGS ;SILENT MODE? BNE 10$ ;IF NE, YES .PRINT #WTIMO ;PRINT TIMEOUT MESSAGE 10$: BISB #WARN$,@#$USRRB ;SET ERROR STATUS CALL DEALU ;DEALLOCATE UNIT .PURGE #CH.NET ;PURGE NETWORK CHANNEL .EXIT ;EXIT ;+ ;FIXDT -- FIX DATE FOR OLD SYSTEMS ; ;INPUT: ; NONE ; ;OUTPUT: ; NONE ;- FIXDT:: MOV RSXD,R0 ;GET YEAR CMP #<2000.-1900.>,R0 ;NEED TO FIX? BHI 30$ ;NO 10$: CMP #<2000.-1900.>,R0 ;FIX YEAR BHI 20$ ; SUB #28.,R0 ; BR 10$ ; 20$: MOV R0,RSXD ;UPDATE YEAR SUB #72.,R0 ; BIC #140037,DATE ; BIS R0,DATE ; 30$: RETURN ;RETURN ;+ ;HEXBY -- BYTE TO HEX STRING ; ;- HEXBY:: CALL @PC ;DO IT TWICE CLR R2 ;GET DIGIT ASL R1 ; ROL R2 ; ASL R1 ; ROL R2 ; ASL R1 ; ROL R2 ; ASL R1 ; ROL R2 ; MOVB HEXDGT(R2),(R0)+ ;CONVERT TO ASCII RETURN ;RETURN ;+ ;DEALU -- DEALLOCATE UNIT ;- DEALU:: .SPFUN #AREA,#CH.NET,#SF.NAL,#BUFF,#0,#0 ;DEALLOCATE UNIT RETURN ;RETURN ;+ ;FETCH -- CHECK IF HANDLER IS INSTALLED AND LOADED ; ;INPUT: ; R0 - DEVICE NAME (RADIX-50) ; ;OUTPUT: ; CARRY - 0=OK, 1=ERROR ; R1 - HANDLER NAME (IF C=0) ;- FETCH:: MOV R0,DBLK ;SET HANDLER NAME MOV R1,-(SP) ;SAVE R1 MOV @#$USRTO,R1 ;GET USER TOP ADDRESS TST (R1)+ ; .FETCH R1,#DBLK ;FETCH HANDLER BCS 10$ ;IF CS, ERROR MOV DBLK,@SP ;SET DEVICE NAME 10$: MOV (SP)+,R1 ;RESTORE R1 RETURN ;RETURN ;+ ;CMPOP -- COMPARE OPTION ; ;INPUT: ; R3 - COMMAND LINE POINTER ; ;OUTPUT: ; CARRY - 0=OK, 1=NO OPTION FOUND ; R1 - OPTION MASK ; R3 - POINTS TO NEXT CHARACTER ;- CMPOP:: CALL $SAVAL ;SAVE REGISTERS MOV #OPTS,R2 ;POINT TO OPTIONS TABLE 10$: MOV R3,-(SP) ;SAVE STRING POSITION MOV (R2)+,R1 ;GET OPTION BIT BEQ 50$ ;IF EQ NO MORE OPTIONS CLR R5 ;INITIALIZE LENGTH MOV (R2)+,R0 ;GET OPTION STRING MOVB (R0)+,R4 ;GET MINIMAL LENGTH 20$: CMPB (R0)+,(R3)+ ;COMPARE BNE 40$ ;IF NE NOT EQUAL INC R5 ;INCREASE LENGTH TSTB @R0 ;END OF OPTION STRING? BNE 20$ ;NO, GO FOR NEXT 30$: TST (SP)+ ;RESTORE STACK MOV R1,4(SP) ;UPDATE R1 FOR PROGRAM MOV R3,10(SP) ;UPDATE R3 FOR PROGRAM RETURN ;RETURN (C IS CLEAR) 40$: DEC R3 ;POINT TO LAST CHAR CMPB R5,R4 ;MINIMAL LENGTH REACHED? BHIS 30$ ;YES, RETURN MOV (SP)+,R3 ;RESTORE STRING POINTER BR 10$ ;TRY NEXT OPTION 50$: TST (SP)+ ;RESTORE STACK SEC ;SET CARRY RETURN ;RETURN .PSECT DATA,GBL,D,RW DBLK:: .BLKW 4 ;DEVICE NAME BLOCK AREA:: .BLKW 6 ;EMT AREA BUFF:: .BLKW 256. ;I/O BUFFER QELM:: .BLKW 10. ;QUEUE ELEMENT FOR MRKT DATA: .BLKW 2 ;ETHERNET FRAME BUFFER DSTA:: .WORD -1,-1,-1 ;DESTINATION ADDRESS SRCA:: .BLKW 3 ;SOURCE ADDRESS .RAD50 /TIM/ ;ETHERNET PROTOCOL CODE: .RAD50 /REQ/ ;PROTOCOL CODE HZ:: .WORD 60. ;CLOCK FREQUENCY DATE:: .BLKW ;RT-11 DATE TIME:: .BLKW 2 ;RT-11 TIME RSXD:: .BLKW 8. ;RSX-11 DATE AND TIME IDENT:: .BLKB 256. ;SYSTEM IDENT WCNT = <.-DATA>/2 ;ETHERNET PACKET WORD COUNT FLAGS:: .WORD 0 ;PROGRAM OPTIONS FL.SHO == 1 ;SHOW FL.SET == 2 ;SET FL.SIL == 4 ;SILENT FL.OLD == 10 ;OLD .PSECT RODATA,GBL,D,RO OPTS: .WORD FL.OLD,OPOL ;OPTIONS TABLE .WORD FL.SIL,OPQU ; .WORD FL.SHO,OPSH ; .WORD FL.SET,OPSE ; .WORD FL.SIL,OPSI ; .WORD 0 ;END OF TABLE OPOL: .ASCIZ <1>/OLD/ OPQU: .ASCIZ <1>/QUIET/ OPSH: .ASCIZ <2>/SHOW/ OPSE: .ASCIZ <2>/SET/ OPSI: .ASCIZ <2>/SILENT/ HEXDGT: .ASCII /0123456789ABCDEF/ PROMP:: .ASCII /Options? / TSXID:: .ASCIZ /TSX-Plus Version %M.%M/ EVERS:: .ASCIZ /?ETM-F-Wrong version of RT-11/ EPRIV:: .ASCIZ /?ETM-F-Privilege violation/ ESYNT:: .ASCIZ /?ETM-F-Syntax error/ EOPTN:: .ASCIZ /?ETM-F-Invalid or ambiguous option/ EHARD:: .ASCIZ /?ETM-F-Unsupported hardware/ ENDEV:: .ASCIZ /?ETM-F-Device not available or handler not loaded/ EUNIT:: .ASCIZ /?ETM-F-No device units available/ ENTIO:: .ASCIZ \?ETM-F-Network I/O error\ WRTEM:: .ASCIZ /?ETM-W-Nothing to do in RTEM-11/ WMONF:: .ASCIZ /?ETM-W-Couldn't read monitor file/ WANSW:: .ASCIZ /?ETM-W-Invalid answer received/ WTIMO:: .ASCIZ /?ETM-W-Receive timeout/ IDTTM:: .ASCIZ /?ETM-I-Date & time - %Y %3Z/ ISYAD:: .ASCIZ /?ETM-I-Time server - / ISYID:: .ASCIZ /, %I/ .END START