B.4 Il programma dsk2bin
 

CLS

   PRINT TAB(5); "******************************************************************"
   PRINT TAB(5); "** Questo programma crea un file binario da inserire  direttamente                     **"
   PRINT TAB(5); "** nella eprom.                                                                                                      **"
   PRINT TAB(5); "*****************************************************************"
   PRINT
   PRINT

    DIM loc$(3)
    DIM loca$(3)

    INPUT "Nome del file di input: "; mm$
    OPEN mm$ FOR INPUT AS #2

'*********creazione file per la eprom********************

    INPUT "Nome del file di output:  "; nn$
    OPEN nn$ FOR BINARY AS #1
    PRINT ""

    INPUT "Locazione iniziale di memoria in hex:  ", a$
    PRINT ""
    memo = 0
    FOR p = 1 TO 6
    B$ = MID$(a$, p, 1)
     GOSUB conv
    memo = memo + (16 ^ (5 - p + 1)) * B
    NEXT p

'*********indirizzo iniziale di memoria da inserire nell’header********************

    loca = 0
    FOR k = 1 TO 3
      l = k - 1
      j = 2 * l + 1
      loc$(k) = MID$(a$, j, 2)
    NEXT k
      FOR k = 1 TO 3
        FOR l = 1 TO 2
          B$ = MID$(loc$(k), l, 1)
          GOSUB conv
          loca = loca + (16 ^ (1 - l + 1)) * B
        NEXT l
        loca(k) = loca
        loca = 0
      NEXT k

;**************************************************

    add = memo - 1   'locazione di memoria iniziale in dec.-1
    elab = 1
    ctn = 0
    jj = 0
 

'***********inizio header********************************

5     IF ctn = 1 THEN
      aa$ = LTRIM$(CHR$(8)) 'Memory width = 8 bits
      jj = jj + 1
      PUT #1, jj, aa$
      aa$ = LTRIM$(CHR$(0))
      jj = jj + 1
      PUT #1, jj, aa$
      aa$ = LTRIM$(CHR$(0))
      jj = jj + 1
      PUT #1, jj, aa$
      aa$ = LTRIM$(CHR$(0))
      jj = jj + 1
      PUT #1, jj, aa$

      aa$ = LTRIM$(CHR$(248))
      jj = jj + 1
      PUT #1, jj, aa$   'Memory type = SWW = 11 , WCNT = 7
      aa$ = LTRIM$(CHR$(16))
      jj = jj + 1
      PUT #1, jj, aa$
      aa$ = LTRIM$(CHR$(0))
      jj = jj + 1
      PUT #1, jj, aa$
      aa$ = LTRIM$(CHR$(0))
      jj = jj + 1
      PUT #1, jj, aa$

      nn = n      'lunghezza del programma in decimali
      n = n / 4
      n$ = HEX$(n)
      size = LEN(n$)
      zero$ = STRING$(8 - size, "0")
      rec1$ = zero$ + n$
      GOSUB hexbyte

      aa$ = LTRIM$(CHR$(loca(3)))      'Program load starting address
      jj = jj + 1
      PUT #1, jj, aa$
      aa$ = LTRIM$(CHR$(loca(2)))
      jj = jj + 1
      PUT #1, jj, aa$
      aa$ = LTRIM$(CHR$(loca(1)))
      jj = jj + 1
      PUT #1, jj, aa$
      aa$ = LTRIM$(CHR$(0))
      jj = jj + 1
      PUT #1, jj, aa$
       END IF

'********************************************************
    DO WHILE NOT EOF(2)
        LINE INPUT #2, rec$  'Legge le voci contenute nel file.
        IF LEFT$(rec$, 1) <> "0" THEN GOTO 10
        IF RIGHT$(LEFT$(rec$, 12), 1) <> "0" THEN GOTO 10
        IF elab = 1 THEN PRINT "elaborazione in corso..."
        elab = 0
        old = add    'indirizzo precedente
        add$ = RIGHT$(LEFT$(rec$, 10), 8)        ' address.

'********conversione dell'indirizzo in decimale**********
add = 0
FOR k = 0 TO 7
B$ = RIGHT$(LEFT$(add$, k + 1), 1)
GOSUB conv
add = add + B * 16 ^ (7 - k)
NEXT k

'*************controllo sulla continuità degli indirizzi******

         new = add
         diff = new - old - 1
         IF diff <> 0 THEN
            FOR l = 1 TO 4 * diff
            VECT$ = LTRIM$(CHR$(0))    'riempimento delle locazioni di memoria prive di istruzioni
         IF ctn = 1 THEN
         jj = jj + 1
         PUT #1, jj, VECT$
         END IF
            n = n + 1
           NEXT l
           END IF
'*************************************************************

        rec1$ = RIGHT$(LEFT$(rec$, 21), 8)       'opcode

'************disposizione in byte*****************************
      GOSUB hexbyte
'********************************************************

10    LOOP

      CLOSE #1
      CLOSE #2
      IF ctn = 0 THEN
        ctn = 1
        add = memo - 1    'locazione di memoria iniziale in dec.-1
        OPEN mm$ FOR INPUT AS #2
        OPEN nn$ FOR BINARY AS #1
        GOTO 5
      END IF
      PRINT ""
      PRINT "Sono stati traslati"; nn + 16; "byte"
      PRINT "Le righe totali di programma sono"; (nn + 16) / 4;
      PRINT ""
      PRINT "Il file è stato prodotto"
      END

'**************inizio subroutines*********************

hexbyte:
        func$ = RIGHT$(rec1$, 2)         'subroutine per la suddivisione in byte
        GOSUB byte
        func$ = LEFT$(RIGHT$(rec1$, 4), 2)
        GOSUB byte
        func$ = RIGHT$(LEFT$(rec1$, 4), 2)
        GOSUB byte
        func$ = LEFT$(rec1$, 2)
        GOSUB byte
        RETURN

byte:
        B$ = RIGHT$(func$, 1)           'subroutine per la trasformazione dei byte esadecimali in decimali
        GOSUB conv
        NUM = B
        B$ = LEFT$(func$, 1)
        GOSUB conv
        NUM = NUM + B * 16
        NUM$ = LTRIM$(CHR$(NUM))
        IF ctn = 1 THEN
        jj = jj + 1
        PUT #1, jj, NUM$
        END IF
        n = n + 1
        RETURN
 

conv:
IF B$ = "0" THEN B = 0       'subroutine di conversione di un numero esadecimale in decimale
IF B$ = "1" THEN B = 1
IF B$ = "2" THEN B = 2
IF B$ = "3" THEN B = 3
IF B$ = "4" THEN B = 4
IF B$ = "5" THEN B = 5
IF B$ = "6" THEN B = 6
IF B$ = "7" THEN B = 7
IF B$ = "8" THEN B = 8
IF B$ = "9" THEN B = 9
IF B$ = "a" OR B$ = "A" THEN B = 10
IF B$ = "b" OR B$ = "B" THEN B = 11
IF B$ = "c" OR B$ = "C" THEN B = 12
IF B$ = "d" OR B$ = "D" THEN B = 13
IF B$ = "e" OR B$ = "E" THEN B = 14
IF B$ = "f" OR B$ = "F" THEN B = 15
RETURN


Home | Precedente | Successivo