.MCALL .MODULE .MODULE SYSTOP,RELEASE=V01,VERSION=00,COMMENT=,AUDIT=YES ;+ ; 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. ;- ;+ ;SYSCOM AREA DEFINITIONS ;- $USRSP =: 42 ;USER STACK POINTER $USRTO =: 50 ;USER TOP ADDRESS $USRRB =: 53 ;USER ERROR BYTE ;+ ;USER ERROR BYTE BIT DEFINITIONS ;- FATAL$ =: 10 ;FATAL ERROR WARN$ =: 2 ;WARNING ;+ ;FLAG WORD BIT DEFINITIONS ;- FL.TOP =: 100000 ;/T SPECIFIED FL.VBM =: 200 ;/V SPECIFIED ;+ ;LOCAL DEFINITIONS ;- CH =: 0 ;I/O CHANNEL .MCALL .CSISPC,.FETCH,.LOOKUP,.PRINT ;SYSTEM MACROS .MCALL .PURGE,.READW,.WRITW ;... START:: MOV @#$USRSP,SP ;RESET STACK POINTER MOV #BUFF,R1 ;POINT TO BUFFER .CSISPC #OUTSPC,#DEFEXT,#0,R1 ;PARSE CSI COMMAND STRING TSTB @R1 ;EMPTY LINE? BNE 10$ ;IF NE NO .PRINT #IDENT ;PRINT IDENT STRING BR START ;TO NEXT COMMAND 10$: CMPB #<'=>,@R1 ;EQUAL? BEQ 20$ ;IF EQ YES CMPB #<',>,(R1)+ ;COMMA? BNE 40$ 20$: MOV #ESYNT,R3 ;SYNTAX ERROR MESSAGE 30$: BISB #FATAL$,@#$USRRB ;SET FATAL ERROR BIT MOV #EPREF,R1 ;ERROR MESSAGE PREFIX 35$: MOV #BUFF,R0 ;POINT TO MOV #ARGS,R2 ;ARGUMENT BLOCK MOV R3,@R2 ;POINT TO ERROR MESSAGE CALL $EDMSG ;EDIT MESSAGE CLRB @R0 ;MAKE IT ASCIZ .PRINT #BUFF ;PRINT IT BR START 40$: TSTB @R1 ;END OF LINE REACHED? BNE 10$ ;IF NE NO CLR FLAG ;RESET FLAG WORD MOV (SP)+,R1 ;GET OPTION COUNT BEQ 90$ ;IF EQ NO OPTIONS 50$: MOV (SP)+,R0 ;GET OPTION BMI 70$ ;IF MI HAVE VALUE MOV #FL.VBM,R2 ;ASSUME /V SPECIFIED CMPB #'V,R0 ;/V? BEQ 80$ ;IF EQ YES 60$: MOV #EOPTS,R3 ;INVALID OPTION/VALUE BR 30$ ;... 70$: CMPB #'T,R0 ;/T? BNE 60$ ;IF NE NO MOV (SP)+,ADDR ;SAVE TOP ADDRESS MOV #FL.TOP,R2 ;FLAG /T SPECIFIED 80$: BIS R2,FLAG ;UPDATE FLAG WORD DEC R1 ;MORE OPTIONS? BNE 50$ ;IF NE YES 90$: CALL CKTOP ;CHECK TOP ADDRESS BCS 30$ ;IF CS FAILED MOV #FILE,R4 ;POINT TO FILE SPEC TST 2(R4) ;FILE SPECIFIED? BEQ 20$ ;IF EQ NO MOV @#$USRTO,R5 ;GET TOP ADDRESS TST (R5)+ ;DON'T WRITE ON OURSELVES .FETCH R5,R4 ;FETCH HANDLER BCC 110$ ;IF CC OK MOV #ELOAD,R3 ;SET ERROR MESSAGE CLR 2(R4) ;CLEAR FILE NAME 100$: .PURGE #CH ;PURGE CHANNEL IF NEEDED BR 30$ ;TO ERROR PROCESSING 110$: MOV #EOPEN,R3 ;ASSUME LOOKUP FAILED .LOOKUP #AREA,#CH,R4 ;LOOKUP THE FILE BCS 100$ ;IF CS FAILED MOV #EREAD,R3 ;ASSUME READ FAILED .READW #AREA,#CH,#BUFF,#256.,#1 ;READ BLOCK #1 BCS 100$ ;IF CS FAILED MOV #EHALT,R3 ;ASSUME BHALT NOT FOUND CALL FHALT ;FIND BHALT ADDRESS BCS 100$ ;IF CS NOT FOUND TST FLAG ;/T SPECIFIED? BPL 120$ ;IF PL NO CALL STTOP ;SET TOP ADDRESS BCS 100$ ;IF CS FAILED 120$: .PURGE #CH ;PURGE CHANNEL TSTB FLAG ;/V SPECIFIED? BMI 130$ ;IF MI YES JMP START ;TO NEXT COMMAND 130$: MOV #IPREF,R1 ;INFO MESSAGE PREFIX MOV #IHALT,R3 ;BHALT ADDRESS MESSAGE BR 35$ ;TO MESSAGE PROCESSING ;R2 - BHALT IN BUFF ; ; STTOP: MOV ADDR,R1 ;GET TOP ADDRESS CMP #^ROFF,R1 ;/T:OFF? BEQ 10$ ;IF EQ YES CMP #^RSWR,R1 ;/T:SWR? BEQ 20$ ;IF EQ YES MOV #NOP,(R2)+ ;-> NOP MOV #012704,(R2)+ ;-> MOV #ADDR,R4 MOV R1,(R2)+ ; ... BR 40$ ;WRITE BACK 10$: MOV BRCMD,(R2)+ ;BRANCH BR 30$ ;... 20$: MOV #HALT,(R2)+ ;-> HALT 30$: MOV #013704,(R2)+ ;-> MOV @#SWR,R4 MOV #177570,(R2)+ ; ... 40$: .WRITW #AREA,#CH,#BUFF,#256.,#1 ;WRITE BACK RETURN ;RETURN CKTOP: MOV #EADDR,R3 ;ASSUME INVALID TOP ADDRESS MOV #FL.VBM,-(SP) ;ASSUME /T NOT SPECIFIED TST FLAG ;/T SPECIFIED? BPL 10$ ;IF PL NO CLR @SP ;NO NEED TO FORCE /V CMP #^ROFF,ADDR ;/T:OFF? BEQ 10$ ;IF EQ YES CMP #^RSWR,ADDR ;/T:SWR? BEQ 10$ ;IF EQ YES BIT #3777,ADDR ;VALID ADDRESS? BNE 20$ ;IF NE NO CMP #10000,ADDR ;TOO LOW? BHI 20$ ;IF HI YES CMP #160000,ADDR ;TOO HIGH? BLO 20$ ;IF LO YES 10$: TST (PC)+ ;CLEAR CARRY, SKIP SEC 20$: SEC ;SET CARRY BIS (SP)+,FLAG ;UPDATE FLAG WORD IF NEEDED RETURN ;RETURN FHALT:: MOV #BUFF,R1 ;POINT TO BUFFER 10$: CMP #BUFF+660,R1 ;HAVE ENOUGH SPACE FOR CODE? BLE 30$ ;IF LE NO MOV R1,R2 ;COPY ADDRESS CMP #020427,(R1)+ ;CHECK CODE BNE 10$ ;-> CMP R4, CMP #160000,(R1)+ ; #160000 BNE 10$ ;NOPE TSTB (R1)+ ;SKIP OFFSET CMPB #BLO/400,(R1)+ ;-> BLO NXM BNE 10$ ;NOPE CMP #005004,@R1 ;-> CLR R4 BNE 10$ ;NOPE MOV #405,BRCMD ;SET BRANCH COMMAND CMP #3777,-(R2) ;OLD STYLE BHALT? BNE 20$ ;IF NE NO MOV #407,BRCMD ;UPDATE BRANCH COMMAND CMP -(R2),-(R2) ;SKIP BIC COMMAND 20$: CMP -(R2),-(R2) ;COMPUTE ADDRESS OF BHALT MOV R2,BHALT ;SAVE BHALT ADDRESS SUB #,BHALT ;... TST (PC)+ ;CLEAR CARRY, SKIP SEC 30$: SEC ;SET CARRY RETURN ;RETURN ; ;ORDER IS IMPORTANT! ; OUTSPC: .BLKW 2*5-3 ;CSI FILE SPECS FLAG: .BLKW ;FLAG WORD ADDR: .BLKW ;TOP ADDRESS AREA: .BLKW 5 ;EMT AREA ARGS: .BLKW ;ARGUMENT BLOCK FILE: .BLKW 5 ;FILE SPECIFICATION BHALT: .BLKW ;BHALT ADDRESS BRCMD: .BLKW ;BR COMMAND CODE .BLKW 5*4-3 ; BUFF: .BLKW 256. ;I/O BUFFER DEFEXT: .RAD50 /SYSSYSSYSSYS/ ;DEFAULT FILE TYPES IDENT: .NLCSI EPREF: .ASCIZ /?SYSTOP-F-%I/ ESYNT: .ASCIZ /Syntax error/ EOPTS: .ASCIZ /Invalid option or value/ ELOAD: .ASCIZ /Failed to fetch handler - %X/ EOPEN: .ASCIZ /Failed to lookup file - %X/ EREAD: .ASCIZ /Failed to read file - %X/ EWRIT: .ASCIZ /Failed to write file - %X/ EHALT: .ASCIZ /Couldn't fild address of BHALT/ EADDR: .ASCIZ /Invalid top address/ IPREF: .ASCIZ /?SYSTOP-I-%I/ IHALT: .ASCIZ /Found BHALT in file %X at %P/ .END START