A ver, creo que ta respondí, usando la tabla de conversión deberías poder crear tu rutina (NOTA: la tabla está mal nombrada en realidad es la conversión de ASCII a EBCDIC y no al revés como la he nombrado).
Corríjeme si me equivoco... el tipo de dato comp-3 está codificado en BCD.
Si es así implica que los números del 0 al 9 están en binario, esto es usando paquetes de 4 bits por cada dígito más otro paquete para el signo del nº. Entonces 000=0 ; 0001=1 .. 1001=9 en cuanto al signo creo recordar que se usa 1100 para positivo y 1101 para el negativo, aunque esto a veces podía variar el signo es siempre el paquete de la 'derecha' es decir el menos significativo... si la cifra no tiene signo se usa 1111 para indicarlo.
Luego no indicas si los valores son sólo packed o zoned, asumo que a falta de una indicaciónmás precisa son packed, entonces resolvemos los valores:
si tu número es entero puete tener entre 1 y 16 bytes
para valores aritméticos pueden tener entre 1 y 31 bytes
cada byte contiene 2 dígitos decimales (en BCD como se explicaba antes) excepto el byte de signo (que siempre es el de menor peso), en dicho caso el signo está a la derecha del todo.
a la izquierda podrás colocar los 'ceros' que necesites...
ejemplo:
decimal (en decimales) - comp3 (en hexadecimal) - comp3 en binario
- 4782 04 78 2D 0000.0100 0111.1000 0010.1101
traducción: 4 7 8 2 signo
un posible código podría ser algo como esto:
Public BCD(0 To 12) As String ' 10 dígitos más los '3' signos, positivo negatvo y sin signo
' asignamos la matriz BCD de una vez ...para sucesivos usos
Private Sub Form_Load()
Call AsignarMatriz_BitBCD
End Sub
' se invoca en el load del formulario...
' se toman como valores decimales de '0' ó '1'
Public Sub AsignarMatriz_BitBCD()
BCD = Split("0000\0001\0010\0011\0100\0101\0110\0111\1000\1001\1100\1101\1111", "\") ' 0-9, +, -
' ahora añadimos la parte alta de cada valor mirar tabla de conversión, valores 30-39 ASCII corresponden a valores F0-F9 en EBCDIC:
for k= 0 to 11
BCD(k)="1111" & BCD(k)
next
' NOTA: también puedes desactivar este bucle y probar ...
End Sub
' los datos tomados de fichero y convertidos a cadena
' la cadena debe recibirse en este formato : "+xxxxx..." ó "-xxxxx..." cuando tiene signo y "xxxx..." si es sin signo, es decir, si es preciso ' debe filtrarse por otra rutina para añadirse el '+' a las cadenas que lo requieran
Public Function Convertir_DecimalaComp3(cadena As String, optional CerosAañadir as integer =0) As String
' si la cadena es sin signo, añadimos ahora el signo * delante sólo para tratar la cadena en el paso posterior
dim digno as string
signo= Left$(cadena, 1)
If signo <> "-" and signo <>"+" Then cadena = "*" & cadena
' llamamos a la conversión
cadena = ConvertirDecBin_ASCIIaEBCDIC(cadena)
' si necesitamos añadir 'ceros' a la izquierda es el momento de hacerlo'
for k =0 to CerosaAñadir
cadena= BCD(0) & cadena
next
' y lo devolvemos
Convertir_DecimalaComp3 =cadena
End Function
' trabajamos desde números decimales a binario como srting, tanto de entrada como salida
Private Function ConvertirDecBin_ASCIIaEBCDIC(cadena As String) As String
' las cadenas ya en esta rutina se deben recibir con el siguiente formato:
' "+xxxxx..." ó "-xxxxx..." "*xxxx..." es decir con el signo '+' '-' o sin signo '*' que hemos colocado a discreción, si es preciso ' debe filtrarse por otra rutina para añadirse tras ser tomado de fichero a las cadenas que lo requieran
Dim salida As String
' anulado pasamos directamente a binario ' Const menos = "D": Const mas = "C" ' ó "F"
Dim x As Byte
For k = 2 To Len(cadena) ' empezamos por el 2 carácter... el signo lo dejamos para el final
x = Int(Mid&(cadena, k, 1))
salida = salida & BCD(x)
Next
' añadimos el signo a la parte correspondiente
dim signo as string
signo= Left$(cadena, 1)
if signo="+" then
x=10
elseif signo="-" then
x=11
else
x=12
end if
salida = salida & BCD(x))
' ya tenemos convertido la cifra en formato binario pero como valor de string.
ConvertirDecHex_ASCIIaEBCDIC = salida
End Function
Posiblemente no te funcione tal cual y debas hacer modificaciones, yo no tengo aquí nada con que probarlo y hacer correciones, para ello necesitarás probarlo con el mainframe... Si no consigues resolverlo a pesar de todo, en un foro de Cobol seguramente te podrán prestar algo más de ayuda.
...ya nos contarás como te fue...
p.d. se me olvidaba... fíjate que la conversión BCD del 0 al 9 están localizados en la tabla ASCII desde el 30h (48 en decimal es el dígito para el 0) hasta el 39h (57 en decimal=9 en ASCII) siendo los valores para EBCDIC = F0 hasta el F9 , por lo que he añadido una nota en la asignación de la matriz BCD por si quieres intentar desactivando el bucle, comentándolo... para limitar esta situación.