.TITLE LDX TASK IMAGE TO LDA REFORMATTER .ENABL AMA .IDENT /V03.1A/ ; ; AUTHORS: J.S.GOINGS & W.D.PEET ; 15-JUNE-76 ; ; MODIFICATIONS: R.G.ROCHELEAU ; 27-OCT-77 ; 07-NOV-77 ; 29-AUG-79 ; ; LDX CONVERTS A TASK IMAGE TO A SUITABLE FORM FOR FLX ; TO CREATE A ABSOLUTE BINARY LOAD MODULE. ; ; THE COMMAND STRING IS THE STANDARD RSX11-D FORM: ; ; DEV:[UFD]FILENAME.TYPE;VER=DEV:[UFD]FILENAME.TYPE;VER/SW... ; ; GENERALLY THE INPUT FILE TYPE IS 'TSK'. ; ; IN THE CASE WHERE A .ASECT SECTION IS LOCATED WITHIN ; THE STACK AREA, SWITCH OPTIONS MAY BE SPECIFIED TO INCLUDE ; THIS AREA OF THE STACK IN THE OUTPUT. ; ; ; *** OPTIONAL SWITCH DEFINITIONS ; ; /LO:XXX XXX IS AN OCTAL ADDRESS OF THE START ; OF THE .ASECT SECTION TO BE INCLUDED ; IN THE OUTPUT FILE. ; IF HI IS DEFINED, DEFAULT XXX=0. ; ; /HI:YYY YYY IS AN OCTAL ADDRESS OF THE END OF THE ; .ASECT SECTION. ; IF LO IS DEFINED, DEFAULT YYY=TOP OF STACK ADDRESS ; ; ;************************************************************************* ; ; MODIFICATIONS: 27-OCT-77 ; ; RGR01 -- ADD DEFAULT FILE SPEC TO INFDB: & OUTFDB: ; ; RGR02 -- CHANGE GCLBLK TO PROMPT IF NO COMMAND RECIEVED ; ; RGR03 -- ADD HDRSZ+2 ; HDRSZ: HEADER SIZE TO TASK CODE IN WORDS (MINUS EVEN BLOCKS) ; HDRSZ+2: HEADER SIZE TO STACK IN WORDS ;**************************************************************************** ; ; MODIFICATIONS: 07-NOV-77 ; ; RGR04 -- CHANGE EXIT$S TO EXST$S ; EXIT WITH STATUS ;*************************************************************************** ; ; MODIFICATIONS: 29-AUG-79 ; ; RGR05 -- CHANGE TASK HEADER OFFSETS ; TO BE NAMED OFFSETS .PAGE .SBTTL MACRO CALLS & ERROR MESSAGES .MCALL MOUT$S .MCALL MOUT$,FDBDF$,FDRC$A,FDBK$A,FDOP$A,FDAT$A,FDBF$A,FSRSZ$ .MCALL FINIT$,FDBF$A,NMBLK$ ;**RGR01 .MCALL GCMLB$,CSI$,GCML$,CSI$1,CSI$2,CCML$ .MCALL OPEN$W,OPEN$R,READ$,PUT$,CLOSE$,EXST$S,WAIT$,DELET$ ;**RGR04 .MCALL CSI$SW,CSI$SV,CSI$ND .MCALL HDRSY$ ;**RGR05 ;ERROR MESSAGE MACRO DEFINE .MACRO ERMESG S .NCHR T$MP, .WORD T$MP,.+2 .ASCIZ /S/ .EVEN .ENDM ERMESG ; ERROR MESSAGES BDCMD: ERMESG OFAI: ERMESG OFAO: ERMESG BDIN: ERMESG .MOLUN::.BLKW 1 ;LUN FOR MESSAGE OUTPUT ;DIRECT ASSIGNMENTS HDRSY$ MSZ32= H.PD5 ;OFFSET TO MOD. SIZE IN 32 WD BLOCKS ;**RGR05 HDRBLK= 212 ;OFFSET TO HEADER BLOCK HSZ32= H.HSZ ;OFFSET TO HEADER SIZE IN 32 WD BLOCKS ;**RGR05 STKSZ= H.ISP ;OFFSET TO INITIAL SP ;**RGR05 XFRAD= H.IPC ;OFFSET TO INITIAL PC ;**RGR05 INLUN= 2 OUTLUN= 3 .PAGE .SBTTL FILE AND CONSOLE BLOCKS FSRSZ$ 3 ;SET UP FILE STORAGE REGION ;INPUT FILE DESCRIPTOR BLOCK INFDB: FDBDF$ FDRC$A FD.RWM ;USING BLOCK TRANSFER MODE FDBK$A INBUF,512.,,,INST ;BUFFER SPEC FDOP$A INLUN,ICSIBK+C.DSDS,INDFD ;FILE OPEN SPEC ;**RGR01 INDFD: NMBLK$ ,TSK,,SY,0 ;DEFAULT INPUT FILE ;**RGR01 ;OUTPUT FILE DESCRIPTOR OUTFDB: FDBDF$ FDAT$A R.VAR,,202 ;USING PUT$ FOR OUTPUT FDOP$A OUTLUN,ICSIBK+C.DSDS,OUTDFD ;FILE OPEN SPEC ;**RGR01 FDRC$A ,OUTBUF,202 ;BUFFER SPEC FDBF$A ,,1 ;SINGLE BUFFER OUTDFD: NMBLK$ LDXOUTPUT,LDA,,SY,0 ;OUTPUT DEFAULT FILE ;**RGR01 ;CONSOLE CONTROL BLOCK GCLBLK: GCMLB$ 2,LDX ;**RGR02 CSI$ ;DEFINE CONSTANTS ICSIBK: .BLKB C.SIZE ;COMMAND BUFFER .EVEN SWTBL: CSI$SW LO,1,,,,VTBL1 ;SWITCH TABLE CSI$SW HI,2,,,,VTBL2 CSI$ND VTBL1: CSI$SV OCTAL,LOVL,2 VTBL2: CSI$SV OCTAL,HIVL,2 CSI$ND ;BUFFERS INBUF: .BLKB 512. OUTBUF: .BLKB 202 ;STATUS BLOCK INST: .BLKW 2 ;BLOCK POINTER VBNR: .BLKW 2 ;VARIOUS STORAGE LOCATIONS EREXIT: .WORD EX$SUC ;STORAGE FOR ERROR EXIT INFRO ;**RGR04 SIZE: .WORD 0 ;PROGRAM SIZE IN WORDS XFR: .WORD 0 ;TRANSFER ADDRESS LOWAD: .WORD 0 ;LOW ADDRESS OF PROGRAM HDRSZ: .WORD 0,0 ;HEADER SIZE IN WORDS (TASK,STACK) ;**RGR03 LOVL: .WORD 0 ;LOW VALUE ABS SECT. HIVL: .WORD 0 ;HI VALUE ABS SECT. VBNRX: 0,0 .PAGE .SBTTL INITIALIZATION & CONTROL START: FINIT$ ;INIT FSR START1: GCML$ #GCLBLK ;REQUEST COMMAND LINE BCC 4$ CMPB GCLBLK+G.ERR,#GE.EOF ;END OF TI: FILE ? BEQ 3$ 1$: MOUT$S #BDCMD ;PRINT ERROR 2$: CCML$ #GCLBLK ;CLOSE COMMAND FILE BR START1 3$: CCML$ #GCLBLK EXST$S EREXIT ;EXIT WITH ERRORS ;**RGR04 4$: CSI$1 #ICSIBK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD ;COMPRESS & SYNTAX BCS 1$ ;SOME KIND OF SYNTAX ERROR CSI$2 #ICSIBK,OUTPUT,#SWTBL ;GET OUTPUT FILESPEC BCS 1$ OPEN$W #OUTFDB ;OPEN OUTPUT FILE BCC 5$ MOUT$S #OFAO MOV #EX$SEV,EREXIT ;FATAL ERROR BAD OUTPUT FILE ;**RGR04 JMP 2$ 5$: CSI$2 #ICSIBK,INPUT ;GET INPUT FILESPEC BCC 7$ 6$: DELET$ #OUTFDB ;ERROR,UNDO DAMAGE BR 1$ 7$: OPEN$R #INFDB ;OPEN INPUT FILE BCC 8$ MOUT$S #OFAI ;OPEN FAIL ERROR MOV #EX$SEV,EREXIT ;FATAL ERROR BAD INPUT FILE ;**RGR04 DELET$ #OUTFDB JMP 2$ 8$: READ$ #INFDB,,,,,#INST ;READ BLOCK 1 BCC 10$ 9$: MOUT$S #BDIN ;SOMETHING WRONG WITH INPUT MOV #EX$SEV,EREXIT ;FATAL ERROR BAD INPUT FILE (EMPTY) ;**RGR04 CLOSE$ #INFDB DELET$ #OUTFDB JMP 2$ 10$: WAIT$ #INFDB ;SYNC UP WITH I/O MOV INBUF+HDRBLK,VBNR+2 ;GET INFO FM BLK 1: START OF HDR MOV INBUF+MSZ32,R1 ;AND MODULE SIZE ASH #5,R1 ;*32 TO GET WORDS MOV R1,SIZE ;SAVE SIZE READ$ #INFDB,,,#VBNR,,#INST ;READ HEADER BLOCK BCS 9$ ;ERROR IN TASK IMAGE READ WAIT$ #INFDB MOV INBUF+STKSZ,LOWAD ;GET BOTTOM OF PROGRAM MOV LOWAD,R1 ASR R1 ;SUBTRACT STACK FM PROG SIZE IN WORDS BIC #100000,R1 SUB R1,SIZE MOV INBUF+XFRAD,XFR ;SAVE XFR ADDRESS MOV INBUF+HSZ32,R1 ;GET HEADER SIZE MOV R1,R0 ;SUBTRACT HEADER FM PROG SIZE ASH #5,R0 ;IN WORDS SUB R0,SIZE CLR R0 ;IN BLOCKS DIV #16.,R0 ADD R0,VBNR+2 MOV VBNR,VBNRX ;SAVE BLK # FOR SWITCHES MOV VBNR+2,VBNRX+2 ASH #6,R1 ;GET REMAINDER IN BYTES MOV R1,HDRSZ+2 ;SAVE OFFSET TO STACK ;**RGR03 ADD LOWAD,R1 ;AND ADD TO STACK SIZE CLR R0 DIV #1000,R0 ;ADJUST BLOCK POINTER ADD R0,VBNR+2 MOV R1,HDRSZ ;NOW HAVE INDEX TO 1ST WORD IN TASK CODE READ$ #INFDB,,,#VBNR,,#INST BCS 11$ ;**RGR03 WAIT$ #INFDB MOV LOWAD,R1 ;PICK UP LOAD ADDRESS MOV HDRSZ,R2 ;INDEX TO START OF DATA MOV SIZE,R5 ;PROGRAM SIZE IN WORDS JSR 7,LOOP BCC 12$ 11$: JMP 9$ ;**RGR03 12$: BIT #3,ICSIBK+C.MKW1;SWITCHES ? BNE 13$ JMP 18$ 13$: BIT #1,ICSIBK+C.MKW1 BNE 14$ CLR LOVL ;DEFAULT LOVL=0 14$: BIT #2,ICSIBK+C.MKW1 BNE 16$ CMP LOWAD,LOVL ;MAKE SURE LOVL