.TITLE ROM -- START BOOT/DIAG ROM .IDENT /V01.00/ ;+ ;Copyright (c) 2017 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. ;- $JSX =: 4 ;EXTENDED JOB STATUS WORD NOVBG$ =: 100 ;DISABLE VBGEXE BIT $USRRB =: 53 ;USER ERROR BYTE FATAL$ =: 10 ;FATAL ERROR BIT $SYPTR =: 54 ;POINTER TO RMON $CNFG1 =: 300 ;SYSTEM CONFIGURATION WORD OFFSET FJOB$ =: 200 ;FOREGROUND LOADED BIT $SYSGE =: 372 ;SYSGEN FEATURE WORD TSXP$ =: 100000 ;TSX-PLUS SYSTEM BIT RTEM$ =: 10 ;RTEM-11 SYSTEM BIT MR =: 177750 ;KDJ11 MAINTENANCE REGISTER CSR =: 177520 ;KDJ11-B/E CONTROL/STATUS REGISTER PCR =: 177522 ;KDJ11-B/E PAGE CONTROL REGISTER .MCALL .EXIT,.GTLIN,.GVAL ;SYSTEM MACROS .MCALL .PRINT,.TRPSET ; .MCALL ISTAT$,STATE$,TRAN$ ;TABLE DRIVEN PARSER MACROS .ASECT .=$JSX .WORD NOVBG$ ;DISABLE VBGEXE .PSECT CODE,I,RO START:: MOV #BUFF,R3 ;POINT TO COMMAND LINE MOV R3,R4 ;COPY .GTLIN R3,#PROMPT ;GET COMMAND LINE 10$: TSTB (R3)+ ;COMPUTE LENGTH BNE 10$ ; DEC R3 ;R4 -> ADDRESS OF COMMAND LINE SUB R4,R3 ;R3 -> COMMAND LINE LENGTH MOV #1*400,R1 ;MINIMUM CHARS TO MATCH OPTION MOV #KEYTB,R2 ;KEY TABLE MOV #P.OPTS,R5 ;TRANSLATION RULES CALL .TPARS ;PARSE OPTIONS BCC 30$ ;IF CC OK MOV ERRM,R0 ;ERROR MESSAGE 20$: .PRINT ;PRINT MESSAGE BISB #FATAL$,@#$USRRB ;FATAL ERROR .EXIT ;EXIT 30$: MOV OPTS,R0 ;GET OPTIONS BIC #^C3,R0 ;MASK IRRELEVANT BITS CMP #3,R0 ;BOTH /KDJ11 AND /NOKDJ11 SPECIFIED? BNE 40$ ;IF NE NO MOV #ECOPT,R0 ;ERROR MESSAGE BR 20$ ;TO ERROR PROCESSING 40$: MOV @#$SYPTR,R4 ;RMON BASE ADDRESS BIT #TSXP$!RTEM$,$SYSGE(R4) ;CHECK FOR RTEM AND TSX-PLUS BEQ 60$ ;IF EQ NO 50$: MOV #ERTEM,R0 ;ERROR MESSAGE BR 20$ ;TO ERROR PROCESSING 60$: .GVAL #AREA,#-4 ;OLD TSX SYSTEM? BCC 50$ ;IF CC YES MOV OPTS,R5 ;GET OPTIONS BMI 70$ ;IF MI /YES SPECIFIED TSTB $CNFG1(R4) ;FOREGROUND LOADED? BPL 70$ ;IF PL NO .GTLIN #BUFF,#FJSURE ;ARE YOU SURE? CMPB #'Y,BUFF ;Y? BEQ 70$ ;IF EQ YES CMPB #'Y+40,BUFF ;LOWERCASE Y? BEQ 70$ ;IF EQ YES .EXIT ;EXIT 70$: CALL TRSET ;CATCH TRAPS THRU 4/10 BIT #OP.KDJ!OP.NKJ,R5 ;/KDJ11 OR /NOKDJ11 SPECIFIED? BEQ 110$ ;IF EQ NO MFPT ;MOVE FROM PROCESSOR TYPE WORD BCC 90$ ;IF CC OK 80$: MOV #ENDEV,R0 ;ERROR MESSAGE BR 20$ ;TO ERROR PROCESSING 90$: CMP #5,R0 ;DCJ11 PROCESSOR? BNE 80$ ;IF NE NO MOV @#MR,R0 ;READ MAINTENANCE REGISTER BCS 80$ ;IF CS NO MAINTENANCE REGISTER BIC #^C360,R0 ;MASK IRRELEVANT BITS CMP #^B00100000,R0 ;KDJ11-B BOARD? BEQ 100$ ;IF EQ YES CMP #^B01010000,R0 ;KDJ11-E BOARD? BNE 80$ ;IF NE NO 100$: BIC #300,@#CSR ;MAP 165000 AND 173000 ROMS BCS 80$ ;IF CS NO CSR CLR @#PCR ;MAP PAGE 0 THRU 165000 AND 173000 BCS 80$ ;IF CS NO PCR BIT #OP.NKJ,R5 ;/NOKDJ SPECIFIED? BEQ 110$ ;IF EQ NO BIS #300,@#CSR ;UNMAP 165000 AND 173000 ROMS 110$: MOV ADDR,R4 ;GET STARTING ADDRESS BNE 130$ ;IF NE ADDRESS SPECIFIED MOV #165000,R4 ;CHECK FOR 165000 TST @R4 ;TIMED OUT? BCC 120$ ;IF CC NO MOV #173000,R4 ;USE 173000 BR 130$ ;TRY TO START 120$: CMP R4,@R4 ;CHECK FOR 11/03, 11/34 ROM BNE 130$ ;IF NE NO ADD #20,R4 ;UPDATE STARTING ADDRESS 130$: TST @R4 ;ADDRESS TIMED OUT? BCC 140$ ;IF CC ON MOV #ENROM,R0 ;ERROR MESSAGE BR 20$ ;TO ERROR PROCESSING 140$: BIT #OP.QUE,R5 ;/QUIET SPECIFIED? BNE 170$ ;IF NE YES BIT #OP.KDJ,R5 ;/KDJ11 SPECIFIED? BEQ 150$ ;IF EQ NO .PRINT #IKDJE ;KDJ11 ROM ENABLED 150$: BIT #OP.NKJ,R5 ;/NOKDJ11 SPECIFIED? BEQ 160$ ;IF EQ NO .PRINT #IKDJD ;KDJ11 ROM DISABLED 160$: MOV #BUFF,R0 ;BUFFER ADDRESS MOV #ADDR,R2 ;AGRUMENT BLOCK MOV R4,@R2 ;UPDATE START ADDRESS MOV #IADDR,R1 ;FORMAT STRING CALL $EDMSG ;EDIT MESSAGE CLRB @R0 ;MAKE IT ASCIZ .PRINT #BUFF ;PRINT 170$: BIT #OP.GO,R5 ;/START SPECIFIRD? BNE 180$ ;IF NE YES .EXIT ;EXIT 180$: BIT #OP.QUE,R5 ;QUIET MODE? BNE 200$ ;IF NE YES CLR R0 ;WAIT FOR TERMINAL I/O COMPLETION 190$: DEC R0 ; BNE 190$ ; 200$: MOV #210$,@#14 ;SWITCH TO KERNEL MODE MOV #340,@#16 ; BPT ; 210$: RESET ;INIT JMP @R4 ;START ROM TRINT:: CALL TRSET ;CATCH TRAPS AGAIN BIS #1,2(SP) ;SET JOB'S CARRY RTI ;RETURN FROM INTERRUPT TRSET:: .TRPSET #AREA,#TRINT ;CATCH TRAPS THRU 4/10 RETURN ;RETURN OPADR:: MOV .PNUMB,R0 ;GET STARTING ADDRESS BIT #1,R0 ;ODD ADDRESS? BNE ADERR ;IF NE YES CMP #160000,R0 ;AT I/O PAGE? BHI ADERR ;IF HI NO MOV R0,ADDR ;SET STARTING ADDRESS RETURN ;RETURN .ENABL LSB OPERR:: MOV #EIOPT,ERRM ;SET ERROR MESSAGE BR 10$ ;REJECT TRANSITION ADERR:: MOV #EADDR,ERRM ;SET ERROR MESSAGE 10$: ADD #2,@SP ;REJECT TRANSITION RETURN ;RETURN .DSABL LSB ; ;COMMAND LINE PARSE RULES ; ISTAT$ ISTAT,KEYTB STATE$ P.OPTS TRAN$ $EOS,$EXIT TRAN$ '/ STATE$ TRAN$ "KDJ11",P.OPTS,,OP.KDJ,OPTS TRAN$ "NOKDJ11",P.OPTS,,OP.NKJ,OPTS TRAN$ "QUIET",P.OPTS,,OP.QUE,OPTS TRAN$ "START",P.STRT,,OP.GO,OPTS TRAN$ "YES",P.OPTS,,OP.YES,OPTS TRAN$ $LAMDA,,OPERR STATE$ P.STRT TRAN$ ':,P.ADDR TRAN$ $LAMDA,P.OPTS STATE$ P.ADDR TRAN$ $NUMBR,P.OPTS,OPADR TRAN$ $LAMDA,,ADERR STATE$ .PSECT DATA,D,RW OPTS: .WORD 0 ;OPTIONS SPECIFIED ADDR: .WORD 0 ;STARTING ADDRESS AREA: .BLKW 2 ;EMT AREA BUFF: .BLKB 82. ;COMMAND/MESSAGE BUFFER ERRM: .WORD ESYNT ;TRANSLATION ERROR MESSAGE OP.KDJ =: 1 ;/KDJ11 OP.NKJ =: 2 ;/NOKDJ11 OP.QUE =: 4 ;/QUIET OP.GO =: 200 ;/START:XXXXXX OP.YES =: 100000 ;/YES .PSECT RODATA,D,RO PROMPT: .ASCII "Options? "<200> FJSURE: .ASCII "Foreground loaded; Are you sure? "<200> ESYNT: .ASCIZ "?ROM-F-Syntax error" EIOPT: .ASCIZ "?ROM-F-Invalid option" ECOPT: .ASCIZ "?ROM-F-Conflicting options" EADDR: .ASCIZ "?ROM-F-Invalid address" ENDEV: .ASCIZ "?ROM-F-Device not available" ENROM: .ASCIZ "?ROM-F-ROM not found" ERTEM: .ASCIZ "?ROM-F-Can't stop RTEM or TSX-Plus system" IKDJE: .ASCIZ "?ROM-I-KDJ11 ROM enabled" IKDJD: .ASCIZ "?ROM-I-KDJ11 ROM disabled" IADDR: .ASCIZ "?ROM-I-Start sddress %P" .END START