; FILE NAME : F L C V R T . M A C ; DATE : JUNE 7, 1977 ; VERSION : 02.01 ; AUTHOR : JAMES STANFILL ; SWEDISH HOSPITAL MEDICAL CENTER ; ; .TITLE FLCVRT .IDENT /02.01/ .MCALL DIR$,ALUN$,FINIT$,OPEN$R,OPEN$W .MCALL READ$,WRITE$,CLOSE$,WAIT$,LBLDF$ .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,FDBF$A,FDBK$A .MCALL PUT$,HDRDF$,FSRSZ$,NMBLK$,EXIT$S .MCALL GCML$,CSI$1,CSI$2,GCMLB$,GCMLD$,CSI$ ;[02.01] ; ; .SBTTL M O D I F I C A T I O N S ; ; 02.01 1-NOV-77 J. STANFILL ; ADDED CSI TO PARSE INPUT/OUTPUT FILE SPECIFICATIONS ; .SBTTL I N T R O D U C T I O N ; ; ; THE PURPOSE OF THIS TASK IS TO CONVERT A TASK IMAGE INTO ; ABSOLUTE LOADER FORMAT, PRESUMABLY TO BE USED ON A DIFFERENT ; SYSTEM. THE FOLLOWING TKB SWITCHES AND OPTIONS SHOULD BE ; CONSIDERED WHEN BUILDING A TASK FOR A DIFFERENT SYSTEM : ; ; /-MM IF TARGET SYSTEM HAS NO ; MEMORY MANAGEMENT UNIT ; ; /-HD IF NO HEADER IS DESIRED ; ; PAR=[NAME]:[BASE]:[SIZE] ; ; STACK=[SIZE] ; ; THE OUTPUT OF THIS TASK IS A VARIABLE LENGTH RECORD FILE, WHERE ; EACH RECORD IS A FORMATTED BINARY BLOCK. THE FORMATTED BINARY ; BLOCK CONSISTS OF THE FOLLOWING INFORMATION : ; ; ; ***************************************** ; * * ; * BYTE 0 = 1 * ; * BYTE 1 = 0 * ; * BYTE 2 = LOW ORDER BYTE COUNT * ; * BYTE 3 = HIGH ORDER BYTE COUNT * ; * BYTE 4 = LOW ORDER LOAD ADDR * ; * BYTE 5 = HIGH ORDER LOAD ADDR * ; * BYTE 6 = DATA * ; * . * ; * . STORED * ; * . * ; * BYTE N = HERE * ; * BYTE N+1 = CHECKSUM BYTE * ; * * ; ***************************************** ; ; NOTE : IF THE BYTE COUNT = 6, BYTE 3 AND 4 IS THE X-FER ADDR ; ; NOTE : THE CHECKSUM BYTE IS THE LOW ORDER BYTE ; OF THE NEGATION OF ALL PREVIOUS BYTES IN THE ; BLOCK. ; .SBTTL A S S E M B L Y & B U I L D I N S T R U C T I O N S ; ; ASSEMBLY INSTRUCTION : ; ; MCR>MAC ; MAC>FLCVRT=[1,1]EXEMC/ML,[31,31]FLCVRT ; ; ; TASK BUILD INSTRUCTIONS : ; ; MCR>TKB ; TKB>FLCVRT=FLCVRT,TTIO,DSKERR ; TKB>/ ; ENTER OPTIONS : ; TKB>STACK=100 ; TKB>ACTFIL=2 ; TKB>// ; .SBTTL C O N S T A N T S ; TILUN=2 ;LUN FOR TERMINAL DKLUN1=1 ;LUN FOR [FILENAME].TSK DKLUN2=3 ;LUN FOR [FILENAME].LDA TIEFN=2 ;EVENT FLAG FOR TERMINAL DKEFN1=1 ;EVENT FLAG FOR [FILENAME].TSK DKEFN2=3 ;EVENT FLAG FOR [FILENAME].LDA CR=15 ;CARRIAGE RETURN LF=12 ;LINE FEED M.CNT=16. ;MAX WORD COUNT - DATA SECTION F/B BLOCK FB.BC=2 ;OFFSET - BYTE COUNT F/B BLOCK FB.AD=4 ;OFFSET - LOAD ADDR F/B BLOCK FB.DA=6 ;OFFSET - START OF TASK CODE F/B BLOCK ; .SBTTL O P E R A T I N G I N S T R U C T I O N S ; ; MCR>RUN FLCVRT ; FCVRT>DEV:[GRP,USR]FILENAME.EXT;VER=DEV:[GRP,USR]FILENAM.EXT;VER ; ; NOTE: DEFAULT EXTENSIONS FOR THE OUTPUT AND INPUT FILE SPECIFICATIONS ; ARE .LDA AND .TSK, RESPECTIVELY. .SBTTL M A I N P R O G R A M .SBTTL .....I N I T I A L I Z A T I O N ; START: DIR$ #ASGTI ;ASSIGN LUNS DIR$ #ASGDK1 DIR$ #ASGDK2 FINIT$ ;INITIALIZE FSR ; .SBTTL .....C O M M A N D L I N E P R O C E S S I N G [02.01] ; GCML: GCML$ #GCLBLK,#ADPR,#LNPR ;PROMPT USER BITB #GE.EOF, ; TYPED ? BEQ 1$ ;NO--CONTINUE JMP 30$ ;YES--EXIT 1$: TST ;ANYTHING TYPED ? BEQ GCML ;NO--RE-PROMPT CSI$1 #CSIBLK,, ;ANALYZE SYNTAX BCC 2$ ;ERROR ? JMP SYNERR ;YES 2$: BITB #CS.EQU, ;NO--BOTH INPUT AND OUTPUT SPECS ? BCC 3$ ;YES--CONTINUE JMP SYNERR ;NO 3$: CSI$2 #CSIBLK,OUTPUT ;PARSE OUTPUT FILE SPEC BCC 4$ ;ERROR ? JMP PRSERR ;YES 4$: OPEN$W #FDB2 ;NO--CREATE OUTPUT FILE BCC 5$ ;ERROR ? MOV #ERRARG,R5 ;YES--INFORM CALL DSKOPN ;USER AND JMP 30$ ;EXIT 5$: CSI$2 #CSIBLK,INPUT ;PARSE INPUT FILE SPEC BCC 6$ ;ERROR ? JMP PRSERR ;YES 6$: OPEN$R #FDB1 ;NO--ACCESS INPUT FILE BCC 10$ ;ERROR ? MOV #ERRARG,R5 ;YES--INFORM CALL DSKOPN ;USER AND JMP 30$ ;EXIT ; .SBTTL .....G E T T A S K I N F O R M A T I O N ; 10$: MOV #1, CALL DKRED ;READ LABEL BLOCK BCC 11$ ;ERROR ? JMP 30$ ;YES--EXIT 11$: MOV L$BSA(R0),R4 ;GET TASK BASE ADDR MOV L$BXFR(R0),TADDR ;GET TASK X-FER ADDR MOV L$BMXV(R0),HADDR ;GET TASK TOP ADDR MOV L$BFLG(R0),-(SP) ;SAVE TASK FLAG WORD MOV #3, CALL DKRED ;READ VIR BLK 3 BCC 12$ ;ERROR ? JMP 30$ ;YES--EXIT 12$: BIT #TS$NHD,(SP)+ ;TASK HAVE HEADER ? BNE 20$ ;NO -- CONTINUE MOV H.HDLN(R0),R2 ;YES--GET SIZE ADD R2,R0 SUB R2,R1 ;AND ADJUST PTR AND CTR .SBTTL .....C R E A T E F O R M A T T E D B I N A R Y ; ; ; THIS SECTION X-FORMS THE TASK IMAGE INTO FORMATTED BINARY ; BLOCKS CONSISTING OF A 4 BYTE HEADER, DATA BYTES, AND A ; TRAILING CHECKSUM. ; ; REGISTER USAGE : ; ; R0 = BLKBUF PTR (TASK IMAGE) ; R1 = BLKBUF CTR, 0 < OR = R1 < OR = 256 ; R2 = WORD CTR, DATA PORTION - 2 ; R3 = FB PTR (FORMATTED BINARY BLOCK) ; R4 = LOAD ADDRESS ; R5 = SCRATCH ; 20$: CALL FBINIT ;INITIALIZE F/B BLOCK 21$: MOV (R0)+,(R3)+ ;X-FER A WORD ADD #2,R4 ;BUMP LOAD ADDRESS CMP HADDR,R4 ;DONE ? BLOS 23$ ;YES DEC R1 ;NO--NEED TO READ MORE DATA BGT 22$ ;NO CALL DKRED ;YES--GO READ BCC 22$ ;ERROR ? JMP 30$ ;YES--EXIT 22$: SOB R2,21$ ;F/B FULL ? 23$: MOV #M.CNT,R5 ;YES--FIND OUT # WORDS TST R2 ;DONE ? BEQ 24$ ;NO--PROCEED NORMALLY DEC R2 ;YES--ADJUST COUNTER 24$: SUB R2,R5 ;WRITTEN AND ASL R5 ;CONVERT TO BYTES ADD #6,R5 ;ADD HEADER BYTES, BYTE COUNT, ADDR MOV R5, ;AND INSERT INTO F/B BLOCK CALL CHKSUM ;COMPUTE CHECKSUM CALL DKWRT ;WRITE F/B BLOCK BCC 25$ ;ERROR ? JMP 30$ ;YES--EXIT 25$: CMP HADDR,R4 ;NO--MORE BLOCKS TO WRITE ? BLOS 26$ ;NO--WE'RE DONE JMP 20$ ;YES 26$: CALL FBINIT ;STRUCTURE LAST BLOCK MOV #6, ;INDICATES LAST BLOCK MOV TADDR, ;INSERT X-FER ADDR CALL CHKSUM ;COMPUTE CHECKSUM CALL DKWRT ;WRITE LAST F/B BLOCK ; .SBTTL .....E X I T ; 30$: CLOSE$ #FDB1 ;CLOSE THE FILES CLOSE$ #FDB2 MOV #FIN,R5 CALL TTIO ;PRINT [EXIT] EXIT$S ;AND EXIT .SBTTL E R R O R P R O C E S S I N G ; SYNERR: MOV #ERR1, ;SYNTAX ERROR OCCURRED ! MOV #SZE1,ERRSZE BR CON PRSERR: MOV #ERR2, ;PARSE ERROR OCCURRED ! MOV #SZE2,ERRSZE CON: MOV #ERR,R5 ;OUTPUT ERROR CALL TTIO ;MESSAGE AND JMP GCML ;RE-PROMPT .SBTTL S U B R O U T I N E S ; ; SUBROUTINE TO READ A BLOCK OF DATA FROM THE TASK BUILDER FILE ; DKRED: READ$ #FDB1,#BLKBUF ;READ A BLOCK BCC 1$ ;ERROR ? MOV #ERRARG,R5 ;YES--INFORM USER CALL DSKRED ;AND RETURN SEC BR 2$ 1$: WAIT$ #FDB1 ;NO--WAIT FOR COMPLETION MOV #BLKBUF,R0 ;SET POINTER AND MOV #256.,R1 ;COUNTER 2$: RETURN ; ; SUBROUTINE TO WRITE A FORMATTED BINARY BLOCK TO .LDA FILE ; DKWRT: MOV R0,-(SP) ;SAVE REGISTER FCS USES MOV ,R5 ;GET F/B BLOCK COUNT INC R5 ;AND ADD 1 FOR C/S PUT$ #FDB2,#FB,R5 ;WRITE THE BLOCK BCC 1$ ;ERROR ? MOV #ERRARG,R5 ;YES--INFORM USER CALL DSKWRT SEC 1$: MOV (SP)+,R0 ;RESTORE REGISTER USED RETURN ; ; SUBROUTINE TO INITIALIZE FORMATTED BINARY BLOCK ; AND TO SET POINTER AND COUNTERS ; FBINIT: MOV #FB,R2 ;SET PTR AND MOV #FBSZE,R3 ;COUNTER ASR R3 ;CONVERT TO # OF BYTES 1$: CLR (R2)+ ;CLEAR BUFFER SOB R3,1$ MOV #FB,R3 ;RE-SET PTR TO START MOV #1,(R3) ; .BYTE 1,0 MOV R4,FB.AD(R3) ;INSERT LOAD ADDRESS ADD #FB.DA,R3 ;BUMP PTR TO DATA SECTION MOV #M.CNT,R2 ;MAX # OF WORDS OF DATA RETURN ; ; ; SUBROUTINE TO COMPUTE CHECKSUM ; CHKSUM: MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) MOV R4,-(SP) CLR R4 ;INITIALIZE C/S MOV #FB,R0 ;GET ADDR OF F/B BLOCK MOV FB.BC(R0),R1 ;SET BYTE COUNT 1$: MOVB (R0)+,R2 ;GET A CHARACTER ADD R2,R4 ;ADD TO TOTAL SOB R1,1$ ;MORE CHARACTERS ? BIC #177400,R4 ;NO--CLEAR UPPER BYTE NEG R4 ;C/S = VALUE TO MAKE MOVB R4,(R0) ;TOTAL ZERO. MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; ; ; .SBTTL D A T A S T O R A G E .SBTTL .....C O M M A N D L I N E P R O C E S S I N G [02.01] ; GCLBLK: GCMLB$ ,,BUFADR,TILUN GCMLD$ ;DEFINE GCML CONTROL BLK OFFSETS & BIT VALUES CSI$ ; " CSI " " " " " .EVEN CSIBLK: .BLKB C.SIZE ;ALLOCATE STORAGE BUFADR: .BLKW 41. ;BUFFER FOR COMMAND LINE ADPR: .BYTE CR,LF .ASCII %FCVRT>% ;PROMPT LNPR=.-ADPR .EVEN ; ; .SBTTL .....L O C A L D A T A ; TADDR: .BLKW 1 ;X-FER ADDR HADDR: .BLKW 1 ;TOP ADDR ; .SBTTL .....F O R M A T T E D B I N A R Y B L O C K ; ; FB: .BLKB <<*2>+2> FBSZE=.-FB ; .SBTTL .....F I L E D E S C R I P T O R I N F O R M A T I O N LBLDF$ ;INVOKE LABEL BLOCK HDRDF$ ;AND HEADER BLOCK DEFINITIONS FSRSZ$ 1 ;1 RECORD CONTROLLED FILE ; ; FILE DESCRIPTOR BLOCK FOR [FILENAME].TSK ; FDB1: FDBDF$ FDAT$A R.FIX,,512. FDRC$A FD.RWM FDBK$A BLKBUF,512.,,DKEFN1,BKST1 FDOP$A DKLUN1,,DFFNB1,FO.RD FDBF$A DKEFN1 DFFNB1: NMBLK$ ,TSK,,SY,0 ; ; FILE DESCRIPTOR BLOCK FOR [FILENAME].LDA ; FDB2: FDBDF$ FDAT$A R.VAR,FD.BLK FDRC$A ,FB,FBSZE FDOP$A DKLUN2,,DFFNB2 FDBF$A DKEFN2 DFFNB2: NMBLK$ ,LDA,,SY,0 ; BKST1: .BLKW 2 BKST2: .BLKW 2 .SBTTL .....S U B R O U T I N E A R G U M E N T L I S T S ; ; ARGUMENT LISTS FOR TERMINAL I/O (TTIO) ; ERR: .BYTE 6,0 WRITE LUN EVFLG ERR1 ERRSZE IERR WRITE: .WORD 2 LUN: .WORD TILUN EVFLG: .WORD TIEFN IERR: .WORD 0 ERRSZE: .WORD SZE1 .NLIST BIN ERR1: .BYTE CR,LF .ASCII %*** SYNTAX ERROR ***% .BYTE CR,LF SZE1=.-ERR1 .EVEN ; ERR2: .BYTE CR,LF .ASCII %*** PARSE ERROR ***% .BYTE CR,LF SZE2=.-ERR2 .EVEN .LIST BIN ; FIN: .BYTE 6,0 WRITE LUN EVFLG FINBUF FSIZE IERR FSIZE: .WORD FINSZE ; .NLIST BIN FINBUF: .BYTE CR,LF .ASCII /[EXIT]/ FINSZE=.-FINBUF .EVEN .LIST BIN ; ; ARGUMENT LIST FOR DISK ERRORS (DKSERR) ; ERRARG: .BYTE 2,0 LUN EVFLG ; ; BLOCK BUFFER ; BLKBUF: .BLKW 256. ; ; ; ASSIGN LUNS DPB'S ; ASGTI: ALUN$ TILUN,TI,0 ASGDK1: ALUN$ DKLUN1,SY,0 ASGDK2: ALUN$ DKLUN2,SY,0 ; ; .END START