.TITLE CONVERT EBCDIC DATA WITH EMBEDDED BINARY DATA .IDENT /V1.0/ ; ; THIS MACRO PROGRAM CONVERTS EBCDIC RECORDS WITH EMBEDDED BINARY DATA ; TO ASCII RECORDS WITHOUT CHANGING THE BINARY DATA. ; THE PROGRAM MUST BE EDITED FOR EACH FILE TO BE CONVERTED, ; SEE CODE FOR DETAILS. ; .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,FDBF$A,OPEN$M,GET$R,PUT$R .MCALL FSRSZ$,ALUN$C,EXIT$S,CLOSE$ ; DRLUN = 1 ; FILE LUN DRDEV = 1 ; DEVICE NUMBER ; ; SET RECORD TYPE AND LENGTH HERE ; RECLEN = 94. ; RECORD LENGTH ; ; SET DEVICE HERE ; REMD: .ASCII /DR1:/ ; DEVICE REML1= . - REMD ; ; SET UFD HERE ; REMU: .ASCII /[250,2]/ ; DIRECTORY REML2= . - REMU ; ; SET FILENAME HERE ; REMN: .ASCII /PLAN.DAT/ ; FILENAME REML3= . - REMN ; ; FILE FDB ; .EVEN ; FSRSZ$ 1 ; INIT RECORD I/O FOR ONE FILFDB: FDBDF$ ; ALLOCATE FDB FOR FILE FDAT$A R.FIX,FD.CR,RECLEN,256.,256. ; INIT FILE ATTRIBUTES ; FIXED LENGTH RECORDS ; CR/LF FOR UNIT RECORD DEVICES ; "RECLEN" BYTES PER RECORD ; 256 BLOCKS INITIAL ALLOC. ; 256 EXTENSION ALLOC. FDRC$A FD.RAN ; INIT RECORD ACCESS ; RANDOM ACCESS ; MOVE MODE FDOP$A DRLUN,REMADS,,,FA.ENB!FA.DLK ; INIT FILE OPEN ; DISK LUN ; DATASET DESCRIPTOR CASEDS ; DISABLE LOCK ON ABORT FDBF$A ; INIT BLOCK BUFFER FOR RECORD ACCESS ; REMADS: .WORD REML1,REMD ; DATASET DESCRIPTOR .WORD REML2,REMU ; .WORD REML3,REMN ; ; RECNUM: .WORD 0 ; RECORD NUMBER LOW WORD .WORD 0 ; HIGH WORD ; ; THIS TABLE CONTAINS THE OFFSETS AND LENGTHS OF THE FIELDS TO BE CONVERTED, ; ONE WORD FOR OFFSET AND ONE WORD FOR LENGTH. E.G. ; ; .WORD OFFSET TO FIELD FROM BEGINNING OF RECORD ; .WORD LENGTH OF FIELD ; ; THE LAST ENTRY IN THIS TABLE CONTAINS A -1. ; ; TABLE FOR MASTER RECORD ; MASTBL: .WORD 0 ;RECORD TYPE .WORD 1 .WORD 1 ;CITY .WORD 2 .WORD 3 ;RANGE .WORD 2 .WORD 5 ;TOWNSHIP .WORD 2 .WORD 7 ;SECTION .WORD 2 .WORD 15. ;NUMBER OF SUBUNITS .WORD 2 .WORD 17. ;TRAFFIC ZONE .WORD 4 ; ; REST OF RECORD FOR RECORD TYPE "M" ; .WORD 21. ;OWNERS NAME .WORD 26. .WORD 47. ;HOMG .WORD 1 .WORD 48. ;AGRICULTURE .WORD 1 .WORD 83. ;PREVIOUS LAND USE .WORD 5 .WORD 88. ;NUMERATION DISTRICT .WORD 5 .WORD 93. ;FILLER .WORD 1 .WORD -1 ;END OF TABLE ; ; TABLE FOR DETAIL RECORD ; DETTBL: .WORD 0 ;RECORD TYPE .WORD 1 .WORD 1 ;CITY .WORD 2 .WORD 3 ;RANGE .WORD 2 .WORD 5 ;TOWNSHIP .WORD 2 .WORD 7 ;SECTION .WORD 2 .WORD 15. ;NUMBER OF SUBUNITS .WORD 2 .WORD 17. ;TRAFFIC ZONE .WORD 4 ; ; REST OF RECORD FOR RECORD TYPE "D" ; .WORD 21. ;STREET NAME .WORD 26. .WORD 47. ;STREET NUMBER .WORD 5 .WORD 52. ;SECTOR .WORD 2 .WORD 54. ;STREET CLASS .WORD 5 .WORD 59. ;ATLAS PAGE .WORD 4 .WORD 63. ;ZONE CODE .WORD 3 .WORD 66. ;ZIP CODE .WORD 5 .WORD 71. ;FILLER .WORD 7 .WORD 83. ;LAND USE .WORD 5 .WORD 88. ;FILLER .WORD 6 .WORD -1 ;END OF TABLE ; ; EBCDIC TO ASCII CONVERSION TABLE ; EBTBL: .ASCII <0><1><2><3>/ /<11>/ /<177>/ /<13><14><15><16><17> .ASCII <20><21><22><23>/ /<10>/ /<30><31>/ / .ASCII / /<34>/ /<12><23><33>/ /<5><6><7> .ASCII / /<26>/ /<36>/ /<4>/ /<23><25>/ /<32> .ASCII / c.<(+|/ .ASCII /& !$*);^/ .ASCII .-/ ,%_>?. .ASCII / :#@'="/ .ASCII / abcdefghi / .ASCII / jklmnopqr / .ASCII / ~stuvwxyz / .ASCII / / .ASCII /{ABCDEFGHI / .ASCII /}JKLMNOPQR / .ASCII /\ STUVWXYZ / .ASCII /0123456789 / ; RECBUF: .BLKB RECLEN ;RECORD BUFFER ; START: ALUN$C DRLUN,DR,DRDEV ;ASSIGN LUN FOR DISK MOV #1,RECNUM ;INIT RECORD NUMBER CLR RECNUM+2 ; ; ; OPEN FILE ; OPEN$M #FILFDB ;OPEN FILE BCS 2$ ;OK? ; ; GET EACH RECORD ; 1$: GET$R #FILFDB,#RECBUF,#RECLEN,RECNUM,RECNUM+2 ;GET RECORD BCC 21$ ;OK? CMPB F.ERR(R0),#IE.EOF ;END OF FILE? BNE 2$ ;NO CLOSE$ #FILFDB ;CLOSE FILE EXIT$S ;EXIT 2$: MOVB F.ERR(R0),R0 ;GET ERROR CODE IOT ;TRAP ; ; GO THROUGH TABLE OF EBCDIC FIELDS ; 21$: MOV #MASTBL,R2 ;ASSUME MASTER RECORD MOVB RECBUF,R5 ;GET RECORD TYPE BIC #177400,R5 ;CONVERT TO ASCII MOVB EBTBL(R5),R5 ;REPLACE WITH ASCII EQUIV CMPB R5,#'D ;RECORD TYPE "D"? BNE 3$ ;NO MOV #DETTBL,R2 ;DETAIL RECORD 3$: MOV (R2)+,R3 ;GET OFFSET BLT 5$ ;END OF TABLE? BRANCH MOV (R2)+,R4 ;GET LENGTH ; ; CONVERT EBCDIC CODE TO ASCII ; 4$: MOVB RECBUF(R3),R5 ;GET CHARACTER BIC #177400,R5 ;CLEAR UPPER BITS MOVB EBTBL(R5),RECBUF(R3) ;REPLACE WITH ASCII EQUIV INC R3 ; SOB R4,4$ ;NEXT CHAR BR 3$ ;NEXT ENTRY ; 5$: PUT$R #FILFDB,#RECBUF,#RECLEN,RECNUM,RECNUM+2 ;OUTPUT RECORD ADD #1,RECNUM ;INC RECORD NUMBER ADC RECNUM+2 ; JMP 1$ ;GET NEXT RECORD .END START