Attribute VB_Name = "Modulo1"
DefInt A-Z
Public Const tcr = &HD3
Public Const tscr = &HD4
Public Const psc = &HD2
Public Const ior = &HC8
Public Const drwr = &HC9
Public Const adr = &HD0
Public Const adcr = &HD1
Public Const wdr = &HD8
Public Const dra = &HC0
Public Const drb = &HC1
Public Const drc = &HC2
Public Const ddra = &HC4
Public Const ddrb = &HC5
Public Const ddrc = &HC6
Public Const ora = &HCC
Public Const orb = &HCD
Public Const orc = &HCE
'Per ST623
Public Const dre = &HFC
Public Const ddre = &HFD
Public Const ore = &HFE
'Per ST628
Public Const ddrd = &HC7
Public Const ord = &HCF
Public Const drd = &HC3

'Registri che cambiano Valore in base al tipo di Micro
Public armc     As Integer
Public arsc0    As Integer
Public arsc1    As Integer
Public arrc     As Integer
Public arcp     As Integer
Public arlr     As Integer
Public drbr     As Integer

'Registri Per 6265
Public oscr     As Integer
Public miscr    As Integer
Public spidsr   As Integer
Public spidiv   As Integer
Public spimod   As Integer
Public eectl    As Integer

'Registri Per 6228
Public ipr      As Integer
Public uartdr   As Integer
Public uartcr   As Integer
Public prpr     As Integer
Public sdsr     As Integer
Public sidr     As Integer

Public NPag     As Integer      'Numero della Pagina  ROM

Public Const Kf = 13 / 12       'Per Calcoli in DecPrescaler

Type Record                     'File HEX
    Brek        As Byte         'Interruzione
    Indir       As Integer      'ndirizzo
    Cod         As String * 6   'Codice
    Label       As String * 8   'Etichetta
    Istr        As String * 6   'Istruzione
    OpCod       As Byte         'Codice(per esegui)
    CP1         As String * 8   'Campo1
    CP2         As String * 8   'Campo2
    CP3         As String * 8   'Campo3
    Tot         As String * 19  'Tutti i campi comprese ","
    Comm        As String       'Commento
End Type
    
Type Lab
    Nome        As String * 8
    Indir       As Integer
    Indice      As Integer
    Pagina      As Integer
End Type

Type DSD
    Nome        As String * 8
    Indir       As Integer
    Def         As Integer
    Cod         As Byte
    Vis         As String * 1
End Type

Type Memoria                  'Memoria
    Nome        As String * 8
    Valore      As Integer
End Type

Type Flag                       'Flag
    Z           As Byte
    C           As Byte
End Type

Type CMD
    Pin         As Byte
    Tipo        As String * 1
    Valore      As Integer
    Tempo       As Single
End Type

Type Reg
    Indir       As Byte
    Nome        As String * 8
    NomeExt     As String
    Descr(7)    As String
End Type

Type CMPin
    Start       As Integer
    Point       As Integer
End Type

Type AD
    Valore      As Integer
    Tempo       As Single
End Type

Type DOu
    Porta       As Byte
    Valore      As Integer
    Tempo       As Long
    Tipo        As String * 1
    Stringa     As String * 8
End Type

Type Tra
    Indice      As Integer
    Tempo       As Single
End Type

Public FlDrwr   As Byte         'Se 1 NON mostra più (è meglio NON scrivere DRWR sotto interrupt)

Public Recente(4) As String     'Stringhe con i percorsi dei progetti simulati di recente
Public NRec      As Integer     'Numero di recenti esistente

Public Trac()    As Tra         'Dati per Trace
Public Regg()    As String
Public Ass()     As Record      'Record di HEX
Public Label()   As Lab         'Dati di *.SYM(etichette)
Public PConf(43) As Byte        'Configurazione Porte(40=TIMER  42=ARTim 43=SPI)
Public Var()     As DSD         'Dati di *.DSD
Public CMDDat()  As CMD         'Dati di *.CMD
Public FLAGS(3)  As Flag        'Flag
Public Stak(6)   As Integer     'Stak
Public DatOut()  As CMD
Public DumDat    As CMD         'Per settare l'ultimo elemento di CMDDAT e DatOut con Dummy
                                'Vedi Form1.load
Public DOut()    As DOu         'COntiene i dati per scrittura File tipo
                                'Complesso in Uscita
Public DOut0()   As DOu

Public Q(7)         As Byte     '2^n
Public Mem(-1 To 257) As Memoria  'Dati di Memoria +Opion Byte
Public EEMem(128)   As Memoria  'Dati di Memoria EEPROM
Public RAMMem(128)  As Memoria  'Dati di Memoria RAM Aggiuntiva
Public PEnab(47)    As Byte     'Se 1 il Piedino non esiste
Public ToMem(1 To 8) As Byte    'Indirizzi(nella riga) da scrivere su EEPROM
Public NumToMem     As Byte     'Indice(nella riga)
Public RToMem       As Byte     'Numero della Riga
Public ADDat(43) As AD          'Contiene il Valore Analogico in Ingresso su
                                'quel Piedino e il Tempo
                                '-1=Piedino disabilitato ad essere ANAlogico

Public P()          As Integer  'CMDDAT Indicizzato Per Porta
Public InCMD(43)    As CMPin    'Inizi e Puntatori Porte in CMDDAT
Public CMDIndex     As Integer  'Puntatore su CMDDAT()

Public InDAT(43)    As Integer  'Inizi Porte in DATOUT

Public MaxTrac  As Integer      'Numero massimo di dati in Trac
Public NumTrac  As Integer      'Ultimo dato per Trace
Public Traccia  As Integer      '1=Trace Abilitato

Public DataOut  As Byte         'Se=1 Scrivere Dati in Uscita du DatOut
Public NumOut   As Integer      'Numero elem in DatOut
Public NumLAB   As Integer      'Numero elem SYM(Etichette)
Public NumDSD   As Integer      'Numero elem DSD
Public DataIn   As Byte         'Se=1 Scrivere Dati in Entrata su CMDDat
Public NumCMD   As Integer      'Numero elem CMD
Public NumASS   As Integer      'Numero elem Assembler
Public NumREG   As Integer      'Numero elem REG
Public FileIn   As String       'Nome del File CMD

Public LIstr    As Integer      'Ultima Istruzione(Codice)
Public ICount   As Integer      'Indice dell'istruzione
Public PCount   As Integer      'Puntatore all'Istruzione
Public FlagLev  As Integer      'Livello di Flag
                                '0=Norm 1=Interr 2=NMI
Public StakLev  As Integer      'Livello di StaK

Public AA       As Integer      'Registri
Public XX       As Integer
Public YY       As Integer

Public Micro    As Integer      'Tipo di Micro

Public Cicli    As Byte         'Cicli ultima Istr.

Public Clock    As Single       'Per Calcoli in DecPrescaler
Public RClock   As Single       ' ""
Public DivPSC   As Integer      'Divisore del Prescaler
Public ARDivPSC As Integer      'Divisore del ARPresc

Public SPIPsc   As Integer      'Contatore di SPI
Public DivSPI   As Integer      'Divisore del SPI
Public SCKAct   As Byte         '1=Clock su PC4 Attivo
Public NBitSPI  As Byte         'Numero di Bit Di Trasmissione
                                '(o ricezione) di SPI
Public NumClk     As Byte       'Numero di "EDGE" SPI
Public PSPIOut    As Byte       'stato attuale del Piedino SPIOUT
Public PSPIClk    As Byte       'stato attuale del Piedino SPICLOK

Public ArTimIn    As Integer    'Numero del Pin ArtimIn
Public ArTimOut   As Integer    'Numero del Pin ArtimOut
Public TimerIO    As Integer    'Numero del Pin Timer 255=Tiemer(piedino 2)

Public IntSPI28Act As Byte      '1=Interrupt SPI Ativo(Micro 6218 e 6228
Public SPI228Act  As Byte       '1=SPI(6218 6228) Attivo

Public UARTPsc    As Integer    'Contatore di UART
Public DivUART    As Integer    'Divisore del UART
Public UARTAct    As Integer    '1=UART Attivo
Public NumClkUA   As Byte       'Numero di "EDGE" UART
Public PUARTOut   As Byte       'Stato attuale del pin UARTOut
Public ParityEn   As Byte       '1=Parita' abilitata

Public UartIn     As Integer    'Numero del Pin UartIn
Public UartOut    As Integer    'Numero del Pin UartOut

Public SPIIn      As Integer    'Numero del Pin SPIIN
Public SPIOut     As Integer    'Numero del Pin SPIOUT
Public SPIClk     As Integer    'Numero del Pin SPIClok

Public IntPA      As Integer    'Numero di interrupt
Public IntPB      As Integer
Public IntPC      As Integer
Public IntPD      As Integer
Public IntPE      As Integer
Public IntNMI     As Integer
Public IntADC     As Integer
Public IntTIM     As Integer
Public IntTim16   As Integer
Public IntARTIM   As Integer
Public IntSPI     As Integer
Public IntUART    As Integer

Public MaxPin     As Byte       'Numero di pin del Micro

Public FlagTimOut   As Byte     'Se PC1 diventa TimOut allora FlagTimOut=1
Public FlagARTimOut As Byte     'Se PB7 diventa TimOut allora FlagARTimOut=1
Public FlagSPIOut   As Byte     'Se PC3 diventa SPIOut allora FlagSPIOut=1
Public FlagSPIClk   As Byte     'Se PC4 diventa SPIClk allora FlagSPIClk=1

Public TimAct       As Byte     '1=Timer Attivo
Public ARTimAct     As Byte     '1=ARTimer Attivo
Public PTim         As Byte     'stato attuale del Piedino del TIMER
Public ARPTimOut    As Byte     'stato attuale del Piedino del ARTIMER (Uscita PB7)
                                
Public ARPsc    As Integer      'PSC di ARTimer
Public EdgDet   As Byte         'Modo di rilevamento di PinIn(PB6)
                                '0=Disabilitato
                                '1=Rising Edge
                                '2=Falling Edge
Public ClkSur   As Byte         'Selezione del Clock di ingresso (su ARTim)
                                '0=Fint
                                '1=Fint/3
                                '2=ARTimIn

Public LMem     As Integer      'Locazione variabile
                                'Modificata dalla
                                'ultima istruzione
Public WDogAct  As Byte         '1=WDog Attivo
Public WdrCount As Single       'Contatore WDR
Public WdrDec   As Single       'Tempo necessario x
                                'decrementare WDR
Public adr1     As Integer      'Dove scrivo il dato del file ANALOG che sara poi caricato su ADR da TimADC
                                'Contiene Dato +256*PIN
Public AdcAct   As Byte         '1=ADC Attivo
Public AdcCount As Integer      'Contatore x ADC
Public AdcTim   As Single       'Tempo necessario alla Conversione

Public StopWaitAct  As Byte     '0=normale 1=Wait 2=Stop

Public IntFlag      As Byte     'Interrupt Attivo
Public AttesaInt    As Integer  'Interrupt in Attesa
                                
Public AnalogDat    As Integer  'Per Inserimento Dati
Public TimIn        As Single   'Da 6218 6228 Porte

Public TimTot   As Single       'TempoTotale(fine Istruzione)
Public TimPrec  As Single       'Tempo Totale(Inizio Istruzione)
Public TimLoc   As Single       'Tempo Istruzione
Public TimAtt   As Single       'Tempo Attuale(anche in mezzo all'Istruzione)
                                'Serve a Esegui SPI ecc.
Public Veloce   As Byte         'Se<>0 gira senza mostrare i movimenti
Public Gira     As Byte         'Flag di esecuzione veloce
Public Gir      As Byte         'contatore di giri prima di stampare i us
Public OldBrek  As Integer      'Linea su cui sie' gia' avuto brek

Public MHzQ     As Single       'Frequenza del Quarzo (in MHz)
Public MHz      As Single       'Frequenza del Micro (in MHz)
Public msC      As Single       'Microsecondi per Ciclo macchina

Public BB       As Byte
Public Numero   As Integer      'uso comune
Public NomePRG  As String       'uso comune
Public NomeHEX  As String       'uso comune
Public Indc     As Integer

Public TopVar   As Integer      'indice della variabile visualizzata sulla prima riga della finestra Variabili

Public Accelera As Byte         'Per Accelerare e rilallentare in case di STOP o WAIT
Public Modalita As Byte
Public T1Inter  As Integer      'Regola Velocita' lenta

Public MaxlenCom As Integer     'Max lunghezza Commento
Public MaxlenHex As Integer     'Max lunghezza ASS().Tot
Public Flaglis   As Byte        'Se=1 esiste file .LIS

Public TIMPull   As Byte        '1= PullUp sul Pin TIM
Public NMIPull   As Byte        '1= PullUp sul Pin NMI
Public WDogHW    As Byte        '1= WDog HardWare
Public PortPull  As Byte        '1= PullUp tutte le porte al Reset
Public UARTFR    As Byte        'Numero di Bit che riceve/trasmette l'UART
Public ADSync    As Byte        '1= La conversione A/D avviene dopo una istruzione WAIT

Public AppPat    As String      'Path del programma
Public NAss      As Integer     'Numero di righe in FAss

'x Editare codice ASM
Public NumAssCod As Integer     'Numero di linee cancellate
Public AssCod() As String       'Dove metto le linee(della finestra Assembler) Cancellate
Public Paged    As Byte         '255 = Non inizializzato
                                ' 0  = Programma NON a Pagine
                                ' 1  =     "     a pagine di 2 k

'  Comandi da passare a WinHelp()
Public HelpPath As String           'Posizione del file di Help

'Per far apparire la finestra sempre in primo piano
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal CX As Long, ByVal CY As Long, ByVal wFlags As Long) As Long
Public Const SWP_NOMOVE = 2
Public Const SWP_NOSIZE = 1
Public Const FLGS = SWP_NOMOVE Or SWP_NOSIZE
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2

Public Sub FassList(i)
'Piazza la stringa Assembler
'i=indice
Comm$ = Ass(i).Comm
Select Case FAss.HScroll1.Value
    Case 0
        Rec$ = Right("000" + Hex$(Ass(i).Indir), 4) + " " + Ass(i).Cod + " " + Ass(i).Label + " " + Ass(i).Istr + Left(Ass(i).Tot + String(20, " "), MaxlenHex)
    Case 1
        Rec$ = Ass(i).Cod + " " + Ass(i).Label + " " + Ass(i).Istr + Left(Ass(i).Tot + String(20, " "), MaxlenHex)
    Case 2
        Rec$ = Ass(i).Label + " " + Ass(i).Istr + Left(Ass(i).Tot + String(20, " "), MaxlenHex)
    Case 3
        Rec$ = Ass(i).Istr + Left(Ass(i).Tot + String(20, " "), MaxlenHex)
    Case 4
        Rec$ = Left(Ass(i).Tot + String(20, " "), MaxlenHex)
    Case 6 To 12
        ss = 30 * (FAss.HScroll1.Value - 5)
        If Len(Comm$) > ss Then
            Comm$ = Right(Comm$, Len(Comm$) - ss)
        Else
            Comm$ = ""
        End If
End Select
FAss.List1.Text = Rec$ + Comm$
End Sub

Public Function NomePin(N) As String
Select Case N
    Case Is < 40    'Porte
        Record$ = "P" + LTrim(Chr(65 + N \ 8)) + Hex(N Mod 8)
    Case 40         'TIMER
        Record$ = "TIM"
    Case 41         'NMI
        Record$ = "NMI"
    Case 42         'RES
        Record$ = "RES"
    Case 43
        Record$ = "TEST"
    Case 44
        Record$ = "OSCIn"
    Case 45
        Record$ = "OSCOut"
    Case 46
        Record$ = "Vdd"
    Case 47
        Record$ = "Vss"
  
End Select
NomePin = Record$
End Function

Public Sub SalvaASM()
A$ = SoloNome(NomePRG)
A$ = Left(A$, Len(A$) - 3) + "TXT"
MDIForm1.CommonDialog1.FileName = ""
MDIForm1.CommonDialog1.Filter = "File TXT(*.txt)|" + A$ + "|"
MDIForm1.CommonDialog1.ShowSave
If MDIForm1.CommonDialog1.FileName <> "" Then
    Open MDIForm1.CommonDialog1.FileName For Output As #1
    For i = 0 To NumASS
        Rec$ = Right("000" + Hex$(Ass(i).Indir), 4) + " " + Ass(i).Cod + " " + Ass(i).Label + " " + Ass(i).Istr + Left(Ass(i).Tot + String(20, " "), MaxlenHex) + Ass(i).Comm
        Print #1, Rec$
    Next
    If NumAssCod Then
        Print #1, "Linee Cancellate"
        For i = 0 To NumAssCod - 1
            Print #1, AssCod(i)
        Next
    End If
    Close
End If

End Sub

Public Sub VelocitaLenta()
'Regolazione Velocita ' Lenta
P0$ = "03041Nuova Velocitá (80-800)"
Do
    Out0$ = LTrim(Str(T1Inter))
    InpBox.ImputBox P0$, P1$, P2$, P3$, Out0$, Out1$, Out2$, Out3$, "Inserimento Periodo", -1, -1
    If Out0$ = "" Then Exit Sub 'Abbandona
    Valore = Val(Out0$)
Loop Until (Valore >= 80) And (Valore <= 800)
T1Inter = Valore

End Sub

Public Sub ELeggiDR(Porta, Valore, Bit)
'Se Bit <>-1 Legge Il Bit e lo mette su Valore
'Altrimenti legge tutti i Bit e li mette su Valore
If Bit = -1 Then
    Iniz = 0: Fine = 7
Else
    Iniz = Bit: Fine = Bit
End If
    
Valore = 0
For NumBit = Iniz To Fine
    Num = NPin(Porta, NumBit)
    Conf = PConf(Num)
    If ValPin(-1, Num, Conf) Then
        Valore = Valore Or Q(NumBit)
    End If
Next
If Bit <> -1 Then
    If Valore Then Valore = 1
End If
End Sub

Public Function ValPin(Prta, NBit, Conf)
'Restituisce su Flag il Valore del Pin (0 o 1)
'Se Porta=-1 -> NumBit e' gia' il valore per Num
'Se esiste TmpAtt! Calcolato cioe' TimPrec>TmpAtt!<TimTot
'Usa TmpAtt! altrimenti usa il tempo Medio
'Tmpo!      =Tempo considerato per la lettura
'TmpAtt!    =Tempo interno per segnali Ciclici
If TimAtt > TimPrec And TimAtt < TimTot Then
    Tmpo! = TimAtt
Else
    Tmpo! = (TimPrec + TimTot) / 2
End If


If Prta <> -1 Then
    Porta = Prta
    Num = NPin(Porta, NBit)
    NumBit = NBit
Else
    Num = NBit
    Porta = Port(Num)
    NumBit = Num Mod 8
End If
If PEnab(Num) = 0 Then  'Se il Pin Non esiste ->0
    ValPin = 0
    Exit Function
End If
If Num = ArTimOut Then      'ARTimer Out
    If FlagARTimOut Then    'Se Out
        ValPin = ARPTimOut
        Exit Function
    End If
    
ElseIf Num = TimerIO Then   ' Timer In/Out
    If FlagTimOut Then      'Se Out
        ValPin = PTim
        Exit Function
    End If

ElseIf Num = SPIOut Then    'SPI Out
    If FlagSPIOut Then      'Se Out
        ValPin = PSPIOut
        Exit Function
    End If

ElseIf Num = SPIClk Then    'SPI Clock Out
    If FlagSPIClk Then      'Se Out
        ValPin = PSPIClk
        Exit Function
    End If
End If

If Conf > 3 Then
    Bit = Mem(Porta).Valore And Q(NumBit)
    If Bit Then Bit = 1
ElseIf Conf < 3 Then
    If Num = 40 Then    'TIM (esclusi 6200 6265)
        Bit = 0         'Predispone
        If TIMPull Then 'Bit 2 di Option Byte
            Bit = 1     'Predispone Alto
        End If
    ElseIf Num = 41 Then    'NMI
        Bit = 0         'Predispone
        If NMIPull Then 'Bit 3 di Option Byte (esclusi 6265)
            Bit = 1     'Predispone Alto
        End If
    ElseIf Num = 42 Then    'RES
        Bit = 1         'Predispone
    Else
        Bit = 1         'Predispone
        If Conf And 1 Then  'La Porta e' Input No PullUp o Analog
            Bit = 0         'Predispone Basso
        End If
    End If
    'Se Trova Dati In CMDDAT Preleva Il valore
    Primo = InCMD(Num).Start
    Ult = InCMD(Num + 1).Start - 1
    If Primo <= Ult Then     'Solo se ci sono Dati
        Do While (CMDDat(P(Primo)).Tipo = "C") And (CMDDat(P(Primo)).Pin = Num)
            If CMDDat(P(Primo)).Tempo <= Tmpo! Then    'Trovato Ciclico che inizia Prima di Tmpo!
                Bit = 0 'Predispone
                Valore = Abs(CMDDat(P(Primo)).Valore)
                Val2& = Valore: Val2& = Val2& * 2
                ValCMD = CMDDat(P(Primo)).Valore
                If (CMDDat(P(Primo + 1)).Valore = 0) And (CMDDat(P(Primo + 1)).Tipo = "C") Then     'Esiste anche la Fine
                    If CMDDat(P(Primo + 1)).Tempo < Tmpo! Then 'Finisce prima di Tmpo!
                        TmpAtt! = CMDDat(P(Primo + 1)).Tempo
                    Else            'E' in mezzo
                        TmpAtt! = Tmpo!
                    End If
                    
                    TmpAtt! = (TmpAtt! - CMDDat(P(Primo)).Tempo) - (Int((TmpAtt! - CMDDat(P(Primo)).Tempo) / Val2&) * Val2&)
                    If TmpAtt! < Valore Then
                        Bit = 1
                    End If
                    Primo = Primo + 2
                Else        'Continua Sempre
                    TmpAtt! = Tmpo!
                    TmpAtt! = (TmpAtt! - CMDDat(P(Primo)).Tempo) - (Int((TmpAtt! - CMDDat(P(Primo)).Tempo) / Val2&) * Val2&)
                    If TmpAtt! < Valore Then
                        Bit = 1
                    End If
                    Primo = Primo + 1
                End If
                If ValCMD < 0 Then
                    Bit = 1 - Bit
                End If
            Else
                Primo = Primo + 1
            End If
            If Primo >= NumCMD Then Exit Do
        Loop
    End If
    For i = Primo + InCMD(Num).Point To Ult
        If i = Ult Then                     'E'l'Ultimo Dato
            If CMDDat(P(i)).Tempo <= Tmpo! Then
                If CMDDat(P(i)).Tipo = "I" Then
                    Bit = CMDDat(P(i)).Valore   'Trovato DIgitale
                Else
                    Bit = 0                     'Trovato Analogico(Restituisce 0)
                End If
                Exit For
            End If
        End If
        If CMDDat(P(i)).Tempo > Tmpo! Then
            InCMD(Num).Point = i - Primo
            If i > Primo Then
                If CMDDat(P(i - 1)).Tipo = "I" Then
                    Bit = CMDDat(P(i - 1)).Valore 'Trovato DIgitale
                Else
                    Bit = 0                     'Trovato Analogico(Restituisce 0)
                End If
            End If
            Exit For
        End If
    Next
End If
ValPin = Bit

End Function


Public Function ELDIP(Porta, Valore, NBit)
'Se NBit<> -1 (RES o SET)
'NBit =Bit Da scrivere
'Valore 0=Res 1=SET
'Porta= Porta su Cui Scrivere
'Se NBit=-1 (LDI LD)
'Valore =Valore Da scrivere sulla Porta
If NBit = -1 Then
    Iniz = 0: Fine = 7
Else
    Iniz = NBit: Fine = NBit
End If

For NumBit = Iniz To Fine
    
    If NBit = -1 Then
        Flag = Valore And Q(NumBit)   'Valore del Bit che si vuole scrivere 0=0 1=>0
    Else
        Flag = Valore
    End If
    Select Case Porta
        Case dra, drb, drc, drd, dre
            Num = NPin(Porta, NumBit)
            
            Conf = PConf(Num)
            conf1 = Conf
            If Flag Then Flag = 1
            If Conf + Flag = 3 Then 'DDR=0 OR=1 DR=0 si vuole scrivere 1
                Errore = True       'o DDR=0 OR=1 DR=1  si vuole scrivere 0
            End If
            Bit = 1
            GoSub Scrivi
            PConf(Num) = Conf
            If (Conf > 3) And (Conf <> conf1) Then
                'Scrive solo se Il Pin e' Libero
                flg = True 'Predispone
                If Num = ArTimOut Then          'ARTimOut
                    If FlagARTimOut Then flg = False   'PWMOE=1
                ElseIf Num = TimerIO Then       'TimerIO
                    If FlagTimOut Then flg = False     'TOUT=1
                ElseIf Num = SPIOut Then        'SPIOUT
                    If FlagSPIOut Then flg = False      'Bit 0=1
                ElseIf Num = SPIClk Then        'SPI Clock
                    If FlagSPIClk Then          'SPI Master per 6265
                        flg = False             'SPCLK=1
                    ElseIf (Micro = 6218) Or (Micro = 6228) Then
                        i = EseguiSPI6228(Flag)     'SPI MAster per 6228
                    End If
                ElseIf Num = UartOut Then       'UARTOUT
                    If UARTAct = 1 Then flg = False     'Uart in Trasmissione
                End If
                
                If flg Then
                    ScriviDat -1, Num, Flag, TimTot, "O" 'Scrive
                End If
            End If
    
        Case ddra, ddrb, ddrc, ddrd, ddre 'Si vuole scrivere su DDR
            Num = NPin(Porta, NumBit)
            Conf = PConf(Num)
            conf1 = Conf
            If Flag Then Flag = 4
            conff = Conf + Flag
            If conff > 5 And conff < 8 Then 'DDR=1 OR=1 si vuole scrivere 0
                Errore = True        'o DDR=0 OR=1 si vuole scrivere 1
            End If
            Bit = 4
            GoSub Scrivi
            PConf(Num) = Conf
            If Abs(Conf - conf1) > 3 Then   'Cambio I/O
                If Conf > 3 Then    'Output
                    Tp$ = "O"
                    'Flag = Mem(Porta - 4).Valore And Q(NumBit)    'Per scriverlo(vedi qua sotto)
                Else
                    Tp$ = "I"
                    'Flag = ValPin(Porta - 4, NumBit, Conf)    'Valore del Piedino
                End If
                Flag = ValPin(-1, Num, Conf)
                ScriviDat -1, Num, Flag, TimTot, Tp$  'Scrive su DatOut
            End If
            
        Case Else   'ora orb orc
            '''''''''''''''''''''''''''''''''''
            'E se il Piedino e' analogico ? cosa devo fare (anche su DR)
            '''''''''''''''''''''''''''''''''''
            '''''''''''''''''''''''''''''''''''
            Num = NPin(Porta, NumBit)
            Conf = PConf(Num)
            Bit = 2
            GoSub Scrivi
            PConf(Num) = Conf
    End Select
    If PConf(Num) = 3 Then              'Se L'Ingresso e' Analogico
        If ADDat(Num).Valore = -1 Then  'Non Puo' essere Analogico
            Riattiva 0
            Tx$ = NomePin(Num)
            MsgBox "Il Piedino " + Tx$ + " Non puo' essere Analogico", 16
        End If
        For i = 0 To 39         'Cerca Altri Eventuali Ingressi Analogici
            If i <> Num Then    'Escluso se stesso
                If PConf(i) = 3 Then    'trovato -> Errore
                    Riattiva 0
                    Tx$ = NomePin(i)
                    MsgBox "Esiste gia' il piedino " + Tx$ + " Analogico", 16
                    Exit For
                End If
            End If
        Next
    
    End If

Next
Select Case Micro           'Sistema FlagSPIOut se si tratta di 6228
    Case 6228               'FlagSPIOUT se Out Open Drain
        FlagSPIOut = 0      'predispone
        If PConf(SPIOut) > 3 Then       'Out
            If PConf(SPIOut) < 6 Then   'opendrain
                FlagSPIOut = 1
            End If
        End If
End Select
                       
ELDIP = Errore
Exit Function
Scrivi:
If Flag Then
    Conf = Conf Or Bit
Else
    Conf = Conf And (255 - Bit)
End If
Return

End Function


Public Sub InAnalog(Num)
'Per inserimento dati da  Porte
'Cerca(se esiste) Valore Precedente
For i = InCMD(Num + 1).Start - 1 To InCMD(Num).Start Step -1 'Se tipo e Pin coincidono
    If CMDDat(P(i)).Tipo = "A" Then
        Valore = CMDDat(i).Valore
        Exit For
    End If
Next
Tx$ = LTrim(Str(Valore))
Do
    P0$ = "03041Dato Analogico 0-255"
    Out0$ = Tx$
    InpBox.ImputBox P0$, P1$, P2$, P3$, Out0$, Out1$, Out2$, Out3$, "Inserimento Analogico", -1, -1
    If Out0$ <> "" Then
        AnalogDat = Val(Out0$)
    Else
        AnalogDat = -1
        Exit Do
    End If
    If AnalogDat < 256 Then
        AnalogDat = AnalogDat + Num * 256
        Exit Do
    Else
        Beep
        i = MsgBox("Il Valore deve essere compreso tra  0 e 255", 16)
    End If
Loop

End Sub

Public Function Esegui()
'Esegue l'Istruzione n° ICount
FAss.List1.Row = ICount         'Serve in diversi posti qui sotto
If Ass(ICount).Brek Then        'se brakpoint blocca
    If OldBrek <> ICount Then
        OldBrek = ICount
        FAss.List1.Col = 0
        Rec$ = FAss.List1.Text
        If Rec$ = " " Then  'Brek messo da esegui rutine
            Ass(ICount).Brek = 0        'lo Toglie
        End If
        FAss.List1.Col = 1
        Riattiva 0
        Exit Function
    Else
        OldBrek = -1                    'Solo la prima volta altrimenti anche al prossimo
    End If                              'passaggio rifermerebbe il flusso del programma
End If

'Rientra in caso di FIne stop o wait nel modo precedente
If Accelera And (StopWaitAct = 0) Then
    Accelera = 0
    If Modalita = 0 Then    'era Passo Passo
        Riattiva 0
        Exit Function
    ElseIf Modalita = 1 Then 'Era Animato
        Riattiva 0
        MDIForm1.Toolbar1.Buttons(7).Enabled = True
        MDIForm1.Toolbar1.Buttons(7).Value = 1
        MDIForm1.Timer1.Interval = T1Inter
        MDIForm1.Timer1.Enabled = True
        Disattiva 0, 7 '3
    End If
End If

If Veloce < 2 Then
    Freccia ICount, 0
    'Rec$ = FAss.List1.Text
    'Mid$(Rec$, 2, 1) = " "              'Toglie">"
    'FAss.List1.Text = Rec$     'Riscrive
    If Veloce = 1 Then Veloce = 2
End If
    
Campo1$ = RTrim(Ass(ICount).CP1)
Campo2$ = RTrim(Ass(ICount).CP2)
Campo3$ = RTrim(Ass(ICount).CP3)
LIstr = Ass(ICount).OpCod
Cicli = 4           'Predispone
Select Case LIstr
    Case 1: EADD Campo2$, 0                     'ADD
    Case 2: EADD Campo2$, 1                     'ADDI
    Case 3: EAND Campo2$, 0                     'AND
    Case 4: EAND Campo2$, 1                     'ANDI
    Case 5: Prox$ = Campo1$: ECALL Prox$        'CALL
    Case 6: ECLR Campo1$                        'CLR
    Case 7: ECOM                                'COM
    Case 8: ESUB Campo2$, 0                     'CP
    Case 9: ESUB Campo2$, 1                     'CPI
    Case 10: EDEC Campo1$, 0                    'DEC
    Case 11: EDEC Campo1$, 1                    'INC
    Case 12: LMem = -1: Prox$ = Campo1$         'JP
    Case 13: Prox$ = Campo1$: EJRC Prox$, 1, 0  'JRC
    Case 14: Prox$ = Campo1$: EJRC Prox$, 0, 0  'JRNC
    Case 15: Prox$ = Campo1$: EJRC Prox$, 1, 1  'JRZ
    Case 16: Prox$ = Campo1$: EJRC Prox$, 0, 1  'JRNZ
    Case 17                                     'JRR
        Prox$ = Campo3$: EJRR Campo1$, Campo2$, Prox$, 0
    Case 18                                     'JRS
        Prox$ = Campo3$: EJRR Campo1$, Campo2$, Prox$, 1
    Case 19: ELD Campo1$, Campo2$               'LD
    Case 20: ELDI Campo1$, Campo2$              'LDI
    Case 21: Cicli = 2: Prox$ = "": LMem = -1   'NOP
    Case 22: ERES Campo1$, Campo2$, 0           'RES
    Case 23: ERES Campo1$, Campo2$, 1           'SET
    Case 24: ERET Prox$                         'RET
    Case 25: ERET Prox$                         'RETI
    Case 26: ESUB Campo2$, 2                    'SUB
    Case 27: ESUB Campo2$, 3                    'SUBI
    Case 28: ERLC                               'RLC
    Case 29: EADD Campo1$, 0                    'SLA
    Case 30, 31: EWAIT                          'Stop Wait
End Select

If LMem > -1 And LMem < &H40 Then   'Azione sulla Memoria Bassa
    If LIstr = 19 Or LIstr = 20 Then    'e scrittura
        WriRamEE
    End If
End If

If (AttesaInt <> 0) And (StopWaitAct <> 0) Then
    StopWaitAct = 0
    Beep
    Riattiva 0
    Txt$ = "STOP": If LIstr = 31 Then Txt$ = "WAIT"
    i = MsgBox("Attenzione Istruzione  " + Txt$ + " con Interrupt in Attesa" + Chr(13) + "                     E' Stata Ignorata", 16)
End If

AggVar LMem
If StopWaitAct = 0 Then
    Indice = ProxIstr(Prox$, 0) 'Non C'e stop o Wait
Else
    If Veloce = 0 Then  'e' Stop o Wait Quindi Non Avanza di una Istruzione
        Freccia ICount, 1
        'FAss.List1.Row = ICount
        'Rec$ = FAss.List1.Text
        'Mid$(Rec$, 2, 1) = ">"
        'FAss.List1.Text = Rec$
        AggAss ICount   'FAss.List1.ListIndex = ICount
    End If
End If

Eventi

If Gir = 1 Then
    MDIForm1.StatusBar1.Panels(6).Text = "µs " + Str(Int(TimTot))
End If

If Traccia Then       'Trace abilitato
    If NumTrac = MaxTrac Then       'se il vettore e' pieno libero l'ultimo posto
        For i = 0 To MaxTrac - 1
            Trac(i) = Trac(i + 1)
        Next
        NumTrac = MaxTrac - 1
    End If
    NumTrac = NumTrac + 1
    Trac(NumTrac).Indice = ICount
    Trac(NumTrac).Tempo = Int(TimTot)
End If
    

End Function
Public Sub Carica()
On Local Error GoTo ErroreC

Unload Test  'scarica per riinizializzare bene
Unload Porte
Unload PreEE
Erase Ass() 'Cosi' libero anche il record n. 0

Nome$ = NomePRG     'MDIForm1.CommonDialog1.FileName
Nom$ = Left$(Nome$, Len(Nome$) - 3)
Nom1$ = Nom$ + "PRG"
Open Nom1$ For Input As #1
Input #1, Micro
Line Input #1, Fr$: MHzQ = Val(Fr$)
Line Input #1, NomeHEX
'I seguenti Micro al momento non sono supportati
'6230, 6231, 6232, 6235, 6240, 6242, 6243, 6244, 6245, 6280, 6285, 6291, 6292, 6293, 6294
ii = FPro.Combo1.ListCount - 1
For i = 0 To ii
    Mic$ = FPro.Combo1.List(i)
    If Mic$ = "ST" + Trim(Str(Micro)) Then Exit For
Next
If i > ii Then
    Beep
    MsgBox "Il Micro ST" + Trim(Str(Micro)) + " NON puo essere simulato con questo Simulatore", 16
    Close
    Exit Sub
End If
'Carica EEMem()
If SiEEPROM And 1 Then
    For i = 0 To 127
        Input #1, EEMem(i).Valore
    Next
End If
Close
DoEvents

'Azzera Option Bytes
Mem(256).Valore = 0
Mem(257).Valore = 0
TIMPull = 0
NMIPull = 0
WDogHW = 0
PortPull = 1
Select Case Micro
    Case 6260, 6265     'Su questi Micro NMI sempre Pull Up
        NMIPull = 1

    Case 6218, 6228     'su questi micro le porte sono come da option Byte
        PortPull = 0
    
    Case Else           '6200-6225
        WDogHW = 1
End Select

NumASS = 0
NumCOS = 0
NumDSD = -1
NumLAB = -1
NumCMD = 0
NumOut = 0
FileIn = ""
Paged = 255
Erase CMDDat
DataIn = 0
Erase P
For i = 0 To 43 'Azzera
    InCMD(i).Start = 0
    InCMD(i).Point = 0
Next
MDIForm1.FileItem(4).Enabled = True
MDIForm1.FileItem(6).Enabled = True
MDIForm1.FileItem(8).Enabled = True
MDIForm1.FileItem(9).Enabled = True
MDIForm1.FileItem(11).Enabled = True
If SiEEPROM Then
    MDIForm1.FileItem(12).Enabled = True
Else
    MDIForm1.FileItem(12).Enabled = False
End If

MDIForm1.FileItem(6).Checked = False
MDIForm1.Toolbar1.Buttons(4).Value = 0
DataOut = 0
MDIForm1.PortItem(1).Checked = False
MDIForm1.Toolbar1.Buttons(5).Value = 0
MDIForm1.Toolbar1.Buttons(17).Enabled = False

MDIForm1.Caption = "SimST6  " + SoloNome(NomePRG)
MDIForm1.StatusBar1.Panels(1).Text = "Attendere Caricamento in Corso"

'Prepara i Piedini Disabilitati
For i = 0 To 43                 'Predispone
    PEnab(i) = 0                'Tutto disabilitato
    ADDat(i).Valore = -1
    ADDat(i).Tempo = 0
Next

'Predispone 255
ArTimIn = 255
ArTimOut = 255
TimerIO = 255

UartIn = 255
UartOut = 255

SPIIn = 255
SPIOut = 255
SPIClk = 255


CaricaPin           'Carica definizioni del Micro

MHz = MHzQ
msC = 13 / MHz      'Microsec Ciclo
WdrDec = 3072 / MHz 'Microsec per decrementare WDR
AdcTim = 560 / MHz  'Tempo necessario alla Conversione

Numero = -1

FlagLev = 3         'Imposta per interrupt NMI
IntFlag = 6
AttesaInt = 0
Nom$ = Left$(NomeHEX, Len(NomeHEX) - 3)
Nom1$ = Nom$ + "DSD"
Open Nom1$ For Input As #1
Do While Not EOF(1)
    NumDSD = NumDSD + 1
    Input #1, Rec$
    ReDim Preserve Var(NumDSD) As DSD
    x = InStr(Rec$, " ")
    Nome$ = Left$(Rec$, x - 1)
    LNo$ = LCase(Nome$)
    'Perche' i Registri non siano Maiuscoli
    If LNo$ = "a" Or LNo$ = "x" Or LNo$ = "y" Or LNo$ = "v" Or LNo$ = "w" Then
        Nome$ = LNo$
    End If
    Var(NumDSD).Nome = Nome$
    Var(NumDSD).Indir = Val("&H" + Mid$(Rec$, x + 1, 2))
    Var(NumDSD).Def = Val("&H" + Mid$(Rec$, x + 4, 2))
    Re$ = Mid(Rec$, x + 7)
    If Len(Re$) Then
        If Mid(Re$, 1, 1) = "R" Then
            Var(NumDSD).Cod = 1
        End If
        If Mid(Re$, 3, 1) = "W" Then
            Var(NumDSD).Cod = Var(NumDSD).Cod + 2
        End If
            
    End If

    'Scrive il Default e Nome in Memoria
    Mem(Var(NumDSD).Indir).Valore = Var(NumDSD).Def
    Mem(Var(NumDSD).Indir).Nome = Var(NumDSD).Nome
    
    If (Right$(Rec$, 1) = "M") And (LNo$ <> "a" And LNo$ <> "x" And LNo$ <> "y" And LNo$ <> "v" And LNo$ <> "w") Then       'Visualizzare
        Var(NumDSD).Vis = "M"
    End If
Loop
Close
FilSym:
Nom1$ = Nom$ + "SYM"
Open Nom1$ For Input As #1
While Not EOF(1)
    Line Input #1, Record$
    Record$ = RTrim(Record$)
    If Right(Record$, 1) = "P" Then
        NumLAB = NumLAB + 1
        ReDim Preserve Label(NumLAB) As Lab
        Label(NumLAB).Nome = Left(Record$, 8)
        Label(NumLAB).Indir = "&H" + Mid$(Record$, 20, 4)
    End If
Wend
Close
FilHex:
Nom1$ = NomeHEX
CaricaHex
PCount = &HFFE
ICount = CercaLabel(&HFFE)
FReg.Show           'Registri
FAss.Show           'Assembler
FVar.Show           'Variabili
FMem.Show           'Memoria
MDIForm1.Finestre.Enabled = True
MDIForm1.DebI.Enabled = True
MDIForm1.Run.Enabled = True
MDIForm1.Porte.Enabled = True
MDIForm1.Variabili.Enabled = True

MDIForm1.Toolbar1.Buttons(2).Value = 0

For i = 1 To 18
    If i <> 17 Then
        MDIForm1.Toolbar1.Buttons(i).Value = 0
        MDIForm1.Toolbar1.Buttons(i).Enabled = True
    End If
Next
MDIForm1.Toolbar1.Buttons(9).Value = 1
MDIForm1.Toolbar1.Buttons(9).Enabled = False

Mem(wdr).Valore = &HFE  'Predispone
Reset 0
MDIForm1.StatusBar1.Panels(2).Text = "ST" + Str(Micro)
MDIForm1.StatusBar1.Panels(3).Text = "MHz " + Str(MHz)
MDIForm1.CommonDialog1.InitDir = NomePRG 'App.Path
esci:
MDIForm1.StatusBar1.Panels(1).Text = ""
Exit Sub
ErroreC:

No$ = UCase(Mid(Nom1$, Len(Nom1$) - 2))
Select Case No$
    
    Case "HEX", "PRG"
        x = MsgBox("Errore nel Caricamento del File" + Chr(13) + Chr(10) + Nom1$, 16, "Carica File")
        x = Err
        Chiudi      'Chiude il prodetto
        Resume esci
    
    Case "DSD"
        nn = 0
        nnn = 0
        Do
            A$ = Regg(nnn)
            Locazione = "&H" + Left(A$, 2)
            Nome$ = LCase(Left(Mid(A$, 4, 6) + "        ", 8))
            If Nome$ <> "ris     " Then
                ReDim Preserve Var(nn) As DSD
                Var(nn).Indir = Locazione
                Var(nn).Nome = Nome$
                If Mid(Nome$, 2, 1) <> " " Then
                    Var(nn).Vis = "M"
                End If
                Mem(Locazione).Nome = Nome$
                nn = nn + 1
            End If
            nnn = nnn + 1
        Loop Until Locazione = 255
        NumDSD = nn - 1
        Resume FilSym
    Case "SYM"
        Resume FilHex
End Select

End Sub



Public Sub FAssIni()

FAss.HScroll1.Visible = False

If Flaglis Then
    FAss.HScroll1.Visible = True
    FAss.HScroll1.Value = 0
End If

If FAss.HScroll1.Visible Then
    FAss.List1.Height = FAss.ScaleHeight - 480    'Altezza
    FAss.List1.Width = FAss.ScaleWidth            'Larghezza
    FAss.HScroll1.Top = FAss.List1.Height + 240
    FAss.HScroll1.Width = FAss.ScaleWidth - 240   'Larghezza
Else
    FAss.List1.Height = FAss.ScaleHeight - 240    'Altezza
    FAss.List1.Width = FAss.ScaleWidth            'Larghezza
End If
Nmax = 5
If MaxlenCom > 40 Then
    Nmax = 4 + MaxlenCom \ 30
    If Nmax > 12 Then Nmax = 12
End If
FAss.HScroll1.Max = Nmax

'Carica Dati
Num = 0
FAss.List1.Rows = NumASS + 1
FAss.List1.Clear


For i = 0 To NumASS
    FAss.List1.Col = 0
    FAss.List1.Row = i
    FAss.List1.CellFontName = "System"
    FAss.List1.CellFontSize = 7
    FAss.List1.CellFontBold = True
    FAss.List1.CellForeColor = QBColor(12)
    FAss.List1.CellBackColor = QBColor(7)
    FAss.List1.CellPictureAlignment = flexAlignRightCenter
    FAss.List1.PictureType = flexPictureColor
    FAss.List1.CellAlignment = flexAlignLeftCenter
    FAss.List1.Text = " "
    FAss.List1.RowHeight(i) = 220
    FAss.List1.Col = 1
    FAss.List1.CellAlignment = 1
Next

If NumASS Then  'Se ci sono dati
    For i = 0 To NumASS
        If Ass(i).Brek = 2 Then
            A$ = "!"
        Else
            A$ = " "
        End If
        FAss.List1.Row = Num
        FAss.List1.Col = 0
        FAss.List1.Text = A$
        FAss.List1.Col = 1
        FassList i

        Num = Num + 1
    Next
    FassLabel   'Scrive l'etichetta
    FAss.List1.Row = ICount
    Freccia ICount, 1
    'Rec$ = FAss.List1.Text
    'Mid$(Rec$, 2, 1) = ">"
    'FAss.List1.Text = Rec$
    FAss.List1.TopRow = NumASS
    NAss = NumASS - FAss.List1.TopRow
    AggAss ICount
End If

End Sub

Public Sub EADD(Campo2$, Flag)
'Flag 0=ADD 1=ADDI

FLAGS(FlagLev).Z = 0
FLAGS(FlagLev).C = 0
If Flag = 0 Then
    Select Case Campo2$
        Case "(x)": Valore = Mem(XX).Valore
        Case "(y)": Valore = Mem(YY).Valore
        Case Else: Valore = CercaVar(Campo2$, Indice)
    End Select
Else
    Valore = Val("&H" + Campo2$)
End If

AA = AA + Valore
If AA = 0 Then FLAGS(FlagLev).Z = 1
If AA > 255 Then
    AA = AA - 256
    FLAGS(FlagLev).C = 1
End If
Mem(255).Valore = AA
LMem = 255
End Sub

Public Sub AggReg()
If Veloce = 0 Then
    FReg.List1.Row = FlagLev
    Rec$ = FReg.List1.Text 'List(FlagLev)  'Flag
    Mid$(Rec$, 14) = LTrim$(Str$(FLAGS(FlagLev).C)) + ":Z=" + LTrim$(Str$(FLAGS(FlagLev).Z))
    FReg.List1.Text = Rec$
    
    FReg.List1.Row = 4
    Rec$ = FReg.List1.Text 'List(4)          'Prog. Count
    Mid$(Rec$, 11) = Right$(" " + Hex$(PCount), 3)
    FReg.List1.Text = Rec$
    
    FReg.List1.Row = 0
    Rec$ = FReg.List1.Text          'Stak Level
    Mid$(Rec$, 13) = Hex$(StakLev)
    FReg.List1.Text = Rec$
End If
End Sub


Public Sub AggVar(Prog)
'Prog=Locazione della variabile
If Prog = -1 Then Exit Sub

AA = Mem(&HFF).Valore
XX = Mem(&H80).Valore
YY = Mem(&H81).Valore

If Veloce = 0 Then
    If (Prog = &HFF) Or (Prog < &H84 And Prog > &H7F) Then 'Registri A X Y V W
        ValReg = Mem(Prog).Valore
        If Prog = &HFF Then Num = 5 Else Num = Prog - 122
        FReg.List1.Row = Num
        Rec$ = FReg.List1.Text
        Regi$ = Right$("0" + Hex$(ValReg), 2)
        Mid$(Rec$, Len(Rec$) - 1) = Regi$
        FReg.List1.Text = Rec$
    End If
    Num = FVar.List1.Rows - 1
    Regi$ = Right("0" + Hex$(Prog), 2)
    For x = 1 To Num
        FVar.List1.Row = x
        Rec$ = FVar.List1.Text
        If Mid$(Rec$, 11, 2) = Regi$ Then
            If FVar.Command1.Caption = "B" Then
                Regi$ = " " + Right$(" 0" + Hex$(Mem(Prog).Valore), 2) + Right$("    " + Str$(Mem(Prog).Valore), 5)
            Else
                GoSub Binario
            End If
            Mid$(Rec$, 14) = Regi$
            FVar.List1.Text = Rec$
            Exit For
        End If
    Next
    'Aggiorma FMem.Grid1
    Riga = (Prog \ 16 + 1)
    Colonna = (Prog Mod 16) + 1
    FMem.Grid1.Col = Colonna
    FMem.Grid1.Row = Riga
    FMem.Grid1.Text = Right$("0" + Hex$(Mem(Prog).Valore), 2)
End If
Exit Sub
Binario:
Regi$ = ""
For i = 0 To 7
    If Mem(Prog).Valore And Q(i) Then
        Regi$ = "1" + Regi$
    Else
        Regi$ = "0" + Regi$
    End If
Next
Return
End Sub

Public Sub EAND(Campo2$, Flag)
'Flag 0=AND 1=ANDI
FLAGS(FlagLev).Z = 0
If Flag = 0 Then
    Select Case Campo2$
        Case "(x)": Valore = Mem(XX).Valore
        Case "(y)": Valore = Mem(YY).Valore
        Case Else: Valore = CercaVar(Campo2$, Indice)
    End Select
Else
    Valore = Val("&H" + Campo2$)
End If

AA = AA And Valore
If AA = 0 Then FLAGS(FlagLev).Z = 1

Mem(255).Valore = AA
LMem = 255
End Sub

Public Sub ECALL(Prox$)
Campo1$ = Prox$         'Salvo
Prox$ = ""
For x = 6 To 2 Step -1  'Shifta i Valori in Stak
    Stak(x) = Stak(x - 1)
Next
Indice = ProxIstr(Prox$, 1)     'Prossima Istruzione
Stak(1) = Ass(Indice).Indir
StakLev = StakLev + 1
Prox$ = Campo1$         'Predispone per Saltare
LMem = -1
End Sub

Public Function ProxIstr(Prox$, Flag)
'Se Flag=1 restituisce solo Il Nuovo Indice

If Prox$ = "" Then  'Prossima Istruzione
    Indice = ICount
    Indice = Indice + 1
Else                'L'Istruzione era un Salto
    Indice = CercaLabel(Prox$)
End If
If Flag = 0 Then
    ICount = Indice
    PCount = Ass(ICount).Indir
    If Veloce = 0 Then
        Freccia ICount, 1
        'FAss.List1.Row = ICount
        'Rec$ = FAss.List1.Text
        'Mid$(Rec$, 2, 1) = ">"
        'FAss.List1.Text = Rec$
        AggAss ICount                 'FAss.List1.ListIndex = ICount
    End If
    AggReg              'Aggiorna Altri Valori
End If
ProxIstr = Indice
End Function



Public Sub ECOM()
FLAGS(FlagLev).Z = 0    'Predispone
FLAGS(FlagLev).C = 0    'C=MSB (prima dell'operazione)

If AA > 127 Then FLAGS(FlagLev).C = 1
BB = AA                 'Lavoro con Byte
BB = Not BB
AA = BB
If BB = 0 Then FLAGS(FlagLev).Z = 1

Mem(255).Valore = AA

LMem = 255
End Sub

Public Sub ESUB(Campo2$, Flag)
'Flag 0=CP 1=CPI 2=SUB 3=SUBI
FLAGS(FlagLev).Z = 0
FLAGS(FlagLev).C = 0

x = AA              'Salvo
If Flag = 0 Or Flag = 2 Then    'CP SUB
    Select Case Campo2$
        Case "(x)": Valore = Mem(XX).Valore
        Case "(y)": Valore = Mem(YY).Valore
        Case Else: Valore = CercaVar(Campo2$, Indice)
    End Select
Else                            'CPI SUBI
    Valore = Val("&H" + Campo2$)
End If

AA = AA - Valore
If AA = 0 Then FLAGS(FlagLev).Z = 1
If AA < 0 Then
    AA = 256 + AA
    FLAGS(FlagLev).C = 1
End If
If Flag > 1 Then  'SUB O SUBI
    Mem(255).Valore = AA
    Indice = 255    'Progressivo e valore di A in File1.list
Else
    AA = x
    Indice = -1
End If
LMem = Indice
End Sub

Public Sub EDEC(Campo1$, Flag)
'Flag 0=DEC 1=INC
FLAGS(FlagLev).Z = 0
If Flag = 0 Then y = -1 Else y = 1

Select Case Campo1$
     Case "(x)"
        Indice = XX
        Valore = Mem(XX).Valore
    Case "(y)"
        Indice = YY
        Valore = Mem(YY).Valore
    Case Else           'Variabile Campo1$=Nome
        Valore = CercaVar(Campo1$, Indice)
End Select

If Indice > &HBF And Indice < &HFF Then 'Scrittura sui Registri
    Riattiva 1
    i = MsgBox("Perche' usare questa Istruzione con i Registri ?", 48, "DEC INC")
End If

Valore = Valore + y
If Valore = 256 Then
    FLAGS(FlagLev).Z = 1
    Valore = 0
ElseIf Valore = 0 Then
    FLAGS(FlagLev).Z = 1
ElseIf Valore = -1 Then
    Valore = 255
End If

Mem(Indice).Valore = Valore
LMem = Indice
End Sub

Public Sub EJRC(Prox$, Flag, TipoF)
'Flag=Valore del Flag
'TipoF 0=Carrj 1=Zero
If TipoF = 0 Then       'Carrj
    If FLAGS(FlagLev).C <> Flag Then Prox$ = ""
Else
    If FLAGS(FlagLev).Z <> Flag Then Prox$ = ""
End If

Cicli = 2
LMem = -1
End Sub

Public Sub Reset(Modo)
'Modo 0 = Reset Power Up
'     1 = altri reset

If Traccia Then             'Se Registratore abilitato
    ReDim Trac(MaxTrac) As Tra
    NumTrac = 0
    nnn = CercaLabel(&HFFE)
    Trac(0).Indice = nnn    'Carica già la posizione attuale
    Trac(0).Tempo = 0
End If

For i = 0 To 39 'Azzera ADDat()
    If ADDat(i).Valore <> -1 Then
        ADDat(i).Valore = 0
        ADDat(i).Tempo = 0
    End If
Next

Erase DatOut        'Cancella Dati in Uscita
NumOut = 0
For i = 0 To 43
    InDAT(i) = 0
    InCMD(i).Start = 0
    InCMD(i).Point = 0
Next

CMDIndex = 0
Erase CMDDat
NumCMD = 0
If MDIForm1.Toolbar1.Buttons(4).Value = 0 Then 'Se il Pulsante e' alto
    FileIn = ""         'NON Carica l'Eventuale FileIn
End If
If FileIn <> "" Then
    CaricaCMD
Else
    ReDim CMDDat(0) As CMD
    ReDim DatOut(0) As CMD
    CMDDat(0) = DumDat
    DatOut(0) = DumDat
End If
AnalogDat = -1
TimTot = 0
TimPrec = 0
RClock = 0
MDIForm1.StatusBar1.Panels(6).Text = "µs " + Str(Int(TimTot))

For x = 0 To 6          'Stak
    Stak(x) = 0
Next
StakLev = 0
AttesaInt = 0
Gir = 1

'Resetta pconf()
For x = 0 To 43
    PConf(x) = 0
Next

'Resetta Flags
fgl = FlagLev
For FlagLev = 1 To 3    'Mette tutto a 0
    FLAGS(FlagLev).C = 0: FLAGS(FlagLev).Z = 0
    AggReg
Next
FlagLev = fgl
FlagLevel 3             'Imposta NMI
IntFlag = 6

SCKAct = 0              'SPI Non Attivo
UARTAct = 0             'UART Non Attivo
AdcAct = 0              'ADC Non Attivo
TimAct = 0              'TIMER NON attivo
ARTimAct = 0            'ARTIMER NON attivo
PTim = 0                'Piedino Timer 0
FlagTimOut = 0
FlagARTimOut = 0
FlagSPIOut = 0
FlagSPIClk = 0
ARPTimOut = 0

PUARTOut = 0
PSPIOut = 0
PSPIClk = 0
EdgDet = 0
ClkSur = 0

NumClk = 0          'Clock SPI
NumClkUA = 0        'CLock UART
IntSPI28Act = 0     'disabilita interrupt

SPI228Act = 0       'Predispone SPI(6218 6228) NON Attiva
Select Case Micro
    Case 6228
        SPI228Act = 1   'Abilita SPI
End Select

Accelera = 0
StopWaitAct = 0

For i = 1 To 8          'ToMem() e NumToMem
    ToMem(i) = 255
Next
NumToMem = 0

FAssIni
NewPCount &HFFE         'PCount

OldBrek = -1            'Inizializza a -1

WDogAct = 0
If WDogHW Then
    WDogAct = 1
End If

'Predispone i registri a 0
For i = &HC0 To &HC8
    Mem(i).Valore = 0
Next
'Questo Registro sarebbe Undefined(ffh) ma preferisco metterlo a zero
Mem(&HCA).Valore = 0: NPag = 0   'PRPR Mette anche pagina 0

Mem(&HCC).Valore = 0
Mem(&HCD).Valore = 0
Mem(&HCE).Valore = 0
Mem(&HCF).Valore = 0
Mem(&HD4).Valore = 0
Mem(&HD5).Valore = 0
Mem(&HD6).Valore = 0
Mem(&HD7).Valore = 0
Mem(&HDA).Valore = 0
Mem(&HDC).Valore = 0
Mem(&HDD).Valore = 0
Mem(&HE0).Valore = 0
Mem(&HE1).Valore = 0
Mem(&HE2).Valore = 0
'Porta E
Mem(&HFC).Valore = 0
Mem(&HFD).Valore = 0
Mem(&HFE).Valore = 0

'Se PortPull=0 predispone TUTTE le Porte Inputt NO PullUP
If PortPull = 0 Then
    Mem(&HC0).Valore = &HFF
    Mem(&HC1).Valore = &HFF
    Mem(&HC2).Valore = &HFF
    Mem(&HC3).Valore = &HFF
    Mem(&HFC).Valore = &HFF
    'Modifica PConf()(solo sulle porte
    For i = 0 To 39
        PConf(i) = 1
    Next

End If

'Predispone quelli a &Hff (undefined)
If Modo = 0 Then
    For i = &H0 To &HBF     'memoria +registri
        Mem(i).Valore = &HFF
    Next
    Mem(&HFF).Valore = &HFF
    Mem(&HC9).Valore = &HFF
    Mem(&HD0).Valore = &HFF
    Mem(&HD8).Valore = &HFF
    Mem(&HD9).Valore = &HFF
    Mem(&HE8).Valore = &HFF
    Mem(&HCB).Valore = &HFF
End If


'Setta i Valori di Reset su questi Registri
Mem(tcr).Valore = &HFF
Mem(psc).Valore = &H7F
Mem(wdr).Valore = &HFE
If WDogAct Then Mem(wdr).Valore = &HFF
Mem(adcr).Valore = &H40

FVarIni
FRegIni
FMemIni
End Sub

Public Sub FlagLevel(Valore)
'Imposta il Nuovo Livello di Flags
FReg.List1.Col = 0
For x = 1 To 3
    FReg.List1.Row = x
    If x = Valore Then
        Set FReg.List1.CellPicture = LoadPicture(AppPat + "Freccia.bmp")
        'Mid$(Rec$, 1, 1) = ">"  'Piazza Nuovo ">"
    Else
        Set FReg.List1.CellPicture = LoadPicture("")
        'Mid$(Rec$, 1, 1) = " "  'Toglie Attuale ">"
    End If
Next
FReg.List1.Col = 1
FlagLev = Valore
End Sub

Public Function NewPCount(Valore)
'SeValore=0 Fa' scegliere

If Valore = 0 Then
'scelta
'
'
'
End If
Freccia ICount, 0
'Indice = ICount
'FAss.List1.Row = Indice
'Rec$ = FAss.List1.Text
'Mid$(Rec$, 2, 1) = " "              'Toglie">"
'FAss.List1.Text = Rec$     'Riscrive

ICount = CercaLabel(Str$(Valore))
Freccia ICount, 1
'FAss.List1.Row = ICount
'Rec$ = FAss.List1.Text
'Mid$(Rec$, 2, 1) = ">"
'FAss.List1.Text = Rec$
PCount = Valore
AggAss ICount
AggReg                 'Aggiorna Altri Valori

End Function

Public Sub EJRR(Campo1$, Campo2$, Prox$, Flag)
'Campo1=Bit Campo2=Variabile Prox=Label dove saltare
'Flag 0=JRR 1=IRS
NumBit = Val(Campo1$)
Bit = LeggiBit(NumBit, Campo2$, IndiceIn)

Select Case IndiceIn
    Case dra To drd, dre      'Legge DR
        ELeggiDR IndiceIn, Bit, NumBit
        
End Select

If Flag = 0 Then        'JRR
    If Bit = 1 Then Prox$ = ""
Else
    If Bit = 0 Then Prox$ = ""
End If
FLAGS(FlagLev).C = Bit

Cicli = 5
LMem = -1

End Sub

Public Sub ELD(Campo1$, Campo2$)
FLAGS(FlagLev).Z = 0
Select Case Campo2$
    Case "(x)": Valore = Mem(XX).Valore
    Case "(y)": Valore = Mem(YY).Valore
    Case Else: Valore = CercaVar(Campo2$, IndiceIn)
End Select

Select Case Campo1$
    Case "(x)": Num = Mem(XX).Valore: IndiceOut = XX
    Case "(y)": Num = Mem(YY).Valore: IndiceOut = YY
    Case Else: Num = CercaVar(Campo1$, IndiceOut)
End Select

Select Case IndiceIn
    Case dra To drd, dre      'Legge DR
        ELeggiDR IndiceIn, Valore, -1

End Select
Select Case IndiceOut
    Case dra To ddrd, ora To ord, dre, ddre, ore  'Scrittura su Porta
        If ELDIP(IndiceOut, Valore, -1) Then  'Errore
            Tx$ = Ass(ICount).Istr + Campo1$ + "," + Campo2$
            Riattiva 1
            i = MsgBox("Istruzione  Errata" + Chr(13) + Tx$ + Chr(13) + "Non segue la sequenza esatta", 48, "LD")
        End If
    
    Case arsc0                      'Flags di ARTim
        EWriArsc0 IndiceOut, Valore, -1
End Select

If Valore = 0 Then FLAGS(FlagLev).Z = 1
Mem(IndiceOut).Valore = Valore

LMem = IndiceOut

End Sub

Public Function CercaVar(Nome$, Indice)
'Restituisce Il  il Valore e l'Indice
'se viene chiamata con lo stesso nome "Indice"
Nome$ = Left$(Nome$ + "        ", 8)
For Indice = 0 To 255
    If Mem(Indice).Nome = Nome$ Then
        Valore = Mem(Indice).Valore
        Exit For
    End If
Next
If Indice > 255 Then        'Se Non Trovato Nome$ e' un
    Indice = Val("&H" + RTrim$(Nome$))  'Indirizzo
    Nome$ = Mem(Indice).Nome
    Valore = Mem(Indice).Valore
End If
CercaVar = Valore
End Function

Public Function LeggiBit(NumBit, Campo1$, Indice)
'Campo1$=Variabile Indice=Indirizzo
'Se Indirizzo cerca con indirizzo altrimenti cerca con
' Variabile Restituisce tutto
If Indice Then
    Valore = Mem(Indice).Valore
    Campo1$ = Mem(Indice).Nome
Else
    Valore = CercaVar(Campo1$, Indice)
End If
If Valore And Q(NumBit) Then
    Bit = 1
Else
    Bit = 0
End If
LeggiBit = Bit
End Function

Public Sub ScriviBit(NumBit, ValBit, Campo1$, Indice)
'Campo1$=Variabile Indice=Indirizzo
'Se Indirizzo cerca con indirizzo altrimenti cerca con
' Variabile Restituisce tutto
'NumBit Numero del Bit
'ValBit Valore del Bit
If Indice Then
    Valore = Mem(Indice).Valore
    Campo1$ = Mem(Indice).Nome
Else
    Valore = CercaVar(Campo1$, Indice)
End If
If ValBit Then
    Valore = Valore Or Q(NumBit)
Else
    Valore = Valore And (255 - Q(NumBit))
End If
Mem(Indice).Valore = Valore
End Sub

Public Function CercaLabel(Prox$)
'Se Valore cerca L'Indirizzo altrimenti cerca
'L'etichetta Prox$
'Prox$=Etichetta
'VAlore=Indirizzo
'Restituisce Indice

If Right(Prox$, 1) = "h" Then
    Valore = Val("&H" + Prox$)
Else
    Valore = Val(Prox$)
End If
If Valore Or (Prox$ = "0h") Or (Prox$ = "0") Then
    If LMem <> drwr Then                    'NON per drwr Data ROM Window Register
        If (NPag > 1) And (Valore < &H800) Then 'Corregge l'Indirizzo per le pagine 2 e superiori
            Valore = Valore + NPag * 2048
        End If
    End If
    For Indice = 0 To NumASS
        If Ass(Indice).Indir = Valore Then
            Exit For
        End If
    Next
    If Indice > NumASS Then     'Non trovato ->Indirizzo in mezzo
        'all'istruzione(puo succedere nelle tabelle perche' tentando
        'di dissasemblare riunisce dati di 2 tabelle)
        'cerca l'indice immediatamente inferiore e lo mette NEGATIVO
        For Indice = NumASS To 0 Step -1
            If Ass(Indice).Indir < Valore Then
                Indice = -Indice
                Exit For
            End If
        Next
    End If
                       
Else
    Prox$ = Left$(Prox$ + "       ", 8)
    For x = 0 To NumLAB
        If Label(x).Nome = Prox$ Then
            Indice = Label(x).Indice
            Exit For
        End If
    Next
End If
CercaLabel = Indice
End Function

Public Sub ELDI(Campo1$, Campo2$)
Num = CercaVar(Campo1$, Indice)
Valore = Val("&H" + Campo2$)

Select Case Indice
    Case dra To ddrd, ora To ord, dre, ddre, ore  'Scrittura su Porta
        If ELDIP(Indice, Valore, -1) Then  'Errore
            Riattiva 1
            Tx$ = Ass(ICount).Istr + Campo1$ + "," + Campo2$
            i = MsgBox("Istruzione Errata" + Chr(13) + Tx$ + Chr(13) + "Non segue la sequenza esatta", 48, "LDI")
        End If
    Case arsc0                      'Flags di ARTim
        EWriArsc0 Indice, Valore, -1
End Select

If Valore = 0 Then FLAGS(FlagLev).Z = 1
Mem(Indice).Valore = Valore

If Indice = &HFF Then       'Solo per A
    FLAGS(FlagLev).Z = 0
    If Valore = 0 Then FLAGS(FlagLev).Z = 1
End If

LMem = Indice

End Sub

Public Sub ECLR(Campo1$)
Valore = CercaVar(Campo1$, Indice)
Mem(Indice).Valore = 0
If Indice = &HFF Then       'Solo per A
    FLAGS(FlagLev).Z = 1
    FLAGS(FlagLev).C = 0
End If
LMem = Indice
End Sub

Public Sub ERES(Campo1$, Campo2$, Flag)
'Flag 0=RES 1=SET
NumBit = Val(Campo1$)
Num = CercaVar(Campo2$, Indice)
Select Case Indice          'Scrittura su Porta
    Case dra To ddrd, ora To ord, ddre, dre, ore
        If ELDIP(Indice, Flag, NumBit) Then 'Errore
            Riattiva 1
            Tx$ = Ass(ICount).Istr + Campo1$ + "," + Campo2$
            x = MsgBox("Istruzione Errata" + Chr(13) + Tx$ + Chr(13) + "Non segue la sequenza esatta", 48, "RES SET")
        End If
    
    Case arsc0                      'Flags di ARTim
        EWriArsc0 Indice, Flag, NumBit
End Select

ScriviBit NumBit, Flag, Campo2$, Indice
LMem = Indice
End Sub

Public Sub ERET(Prox$)
Indice = Stak(1)
If StakLev Then     'Il primo reti non ha niente sullo stak
    For x = 1 To 5  'Shifta i Valori in Stak
        Stak(x) = Stak(x + 1)
    Next
    Stak(6) = 0
    StakLev = StakLev - 1
End If
If Indice = 0 Then  'Se e' 0 Esegue la prossima Istruzione
    Prox$ = ""
Else
    Prox$ = Str$(Indice)
End If

Cicli = 2
LMem = -1
End Sub

Public Sub Eventi()
TimLoc = Cicli * msC
TimTot = TimTot + TimLoc

If LIstr = 25 Then          'Se era RETI
    FineINT
End If

EventiReg

'TIMER
If TimAct And (StopWaitAct < 2) Then   'Se Timer attivo
    TimTIM
End If

'ARTIMER
If ARTimAct And (StopWaitAct < 2) Then 'Se ARTimer attivo
    TimARTIM
End If

'SPI
If SCKAct And (StopWaitAct < 2) Then
    TimSPI
End If

'UART
If UARTAct And (StopWaitAct < 2) Then
    TimUART
End If

'ADC
If AdcAct Then              'se ADC Attivo
    TimADC
End If

'WDR
If WDogAct Then
    TimWDR
End If

If NumCMD Then         'Se esiste File CMD
    Fcmd
End If

'Eventuale Interrupt LES
EventiLES

Cicli = 0

TimPrec = TimTot    'Aggiorna TimPrec
End Sub

Public Sub TimADC()
AdcCount = AdcCount + TimLoc
If AdcCount > AdcTim Then       'Fine conversione
    AdcCount = 0
    AdcAct = 0              'Disattiva
    Mem(adcr).Valore = Mem(adcr).Valore Or 64 'scrive EOC
    AggVar adcr
    
    For i = 0 To 39
        If PConf(i) = 3 Then    'Trova Ingresso Analogico(il Primo che incontra)
            If ADDat(i).Valore <> -1 Then
                Mem(adr).Valore = ADDat(i).Valore
                AggVar adr
                Exit For
            End If
        End If
    Next
    'Mem(adr).Valore = adr1 Mod 256  'Carica Registro ADR
    'AggVar adr
    
    If Mem(ior).Valore And 16 Then          'Se GEN=1
        If Mem(adcr).Valore And 128 Then    'e EAI=1
            Interrupt IntADC
        End If
    End If
End If

End Sub

Public Sub TimTIM()
Clock = Cicli * Kf + RClock
IClock = Int(Clock)
RClock = Clock - IClock
DecPrescaler IClock

End Sub

Public Sub FineINT()
NLev = 1         'Predispone
Select Case IntFlag
    Case 1 To 6     'tutti
        IntFlag = 0
    Case Is > 6     'NMI da interrupt (Int+6)(NMI e' sempre 6)
        IntFlag = IntFlag - 6
        NLev = 2
End Select
If Veloce = 0 Then
    FlagLevel NLev
Else
    FlagLev = NLev
End If

If AttesaInt Then       'Se c'era un Interrupt in attesa lo esegue
    Interrupt AttesaInt
    AttesaInt = 0
End If

End Sub

Public Sub CaricaCMD()
MDIForm1.StatusBar1.Panels(1).Text = "Attendere Caricamento in Corso"
DoEvents
Open FileIn For Input As #1
NumCMD = 0
Do While Not EOF(1)
    Input #1, Record$: Record$ = LTrim$(RTrim$(Record$))
    If Record$ <> "" Then
        If Asc(Left(Record$, 1)) > 54 Then
            ReDim Preserve CMDDat(NumCMD + 1) As CMD
            Rec$ = Left$(Record$, 3)
            If Left$(Rec$, 1) = "P" Then 'Porta
                CMDDat(NumCMD).Pin = Val(Right$(Rec$, 1)) + (Asc(Mid$(Rec$, 2, 1)) - 65) * 8
            ElseIf Rec$ = "NMI" Then: CMDDat(NumCMD).Pin = 41
            ElseIf Rec$ = "TIM" Then: CMDDat(NumCMD).Pin = 40
            ElseIf Rec$ = "RES" Then: CMDDat(NumCMD).Pin = 42
            End If
            CMDDat(NumCMD).Tipo = Mid$(Record$, 5, 1)
            Record$ = LTrim$(Mid$(Record$, 7))
            
            x = InStr(1, Record$, " ")
            y = InStr(x + 1, Record$, " ")
            
            CMDDat(NumCMD).Valore = Val(Left$(Record$, x - 1))
            If y Then
                CMDDat(NumCMD).Tempo = Val(Mid$(Record$, x + 1, y - x))
            Else
                CMDDat(NumCMD).Tempo = Val(Mid$(Record$, x + 1))
            End If
            NumCMD = NumCMD + 1
        End If
    End If
Loop
Close
CMDDat(NumCMD) = DumDat
'Somma i tempi di una stessa porta
For x = NumCMD - 1 To 1 Step -1
    For y = 0 To x - 1
        If CMDDat(y).Pin = CMDDat(x).Pin Then
            CMDDat(x).Tempo = CMDDat(x).Tempo + CMDDat(y).Tempo
        End If
    Next
Next

'Toglie i Valori Uguali
For i = 0 To 43
TipoP$ = ""
    j = 0
    Do
        If CMDDat(j).Pin = i Then
            If CMDDat(j).Tipo = TipoP$ And CMDDat(j).Valore = Valore Then
                For Z = j To NumCMD - 2
                    CMDDat(Z) = CMDDat(Z + 1)
                Next
                j = j - 1
                NumCMD = NumCMD - 1
                CMDDat(NumCMD) = DumDat
                ReDim Preserve CMDDat(NumCMD) As CMD
            Else
                TipoP$ = CMDDat(j).Tipo
                Valore = CMDDat(j).Valore
            End If
        End If
        If j = NumCMD Then
            Exit Do
        Else
            j = j + 1
        End If
    Loop
Next

'Ordina Per Tempo
Dim Dum As CMD
For i = 0 To NumCMD - 1
   iMin = i
   For j = i + 1 To NumCMD - 1
      If CMDDat(j).Tempo < CMDDat(iMin).Tempo Then
         iMin = j
      End If
   Next
   ' Ha trovato un tempo minore di quello corrente;
   ' scambia i due elementi:
   If iMin > i Then
      Dum = CMDDat(i)
      CMDDat(i) = CMDDat(iMin)
      CMDDat(iMin) = Dum
   End If
Next
'Ordina Per Tipo(Mette in Testa il Tipo "C" Ciclic
i = 0
While CMDDat(i).Tipo = "C"
    i = i + 1
Wend
For j = i + 1 To NumCMD - 1
    If CMDDat(j).Tipo = "C" Then
        Dum = CMDDat(j)   'Preleva
        For jj = j To i + 1 Step -1 'Sposta in su
            CMDDat(jj) = CMDDat(jj - 1)
        Next
        CMDDat(i) = Dum
        i = i + 1
    End If
Next
CMDIndex = i
CMDDat(NumCMD) = DumDat
CreaPInCMD  'Crea P() e InCMD()

'Carica anche su DATAOUT (Ordinati Per Porta)
ReDim DatOut(NumCMD) As CMD
For i = 0 To NumCMD - 1
    DatOut(i) = CMDDat(P(i))
Next
NumOut = NumCMD

For i = 0 To 43     'Carica InDAT()
    InDAT(i) = InCMD(i).Start
Next

MDIForm1.Caption = "SimST6  " + SoloNome(NomePRG) + "   " + SoloNome(FileIn)
MDIForm1.StatusBar1.Panels(1).Text = ""
End Sub

Public Sub Fcmd()
'Gestisce gli eventi esterni
Do While CMDDat(i).Tipo = "C"
    If CMDDat(i).Tempo <= TimTot Then
        If CMDDat(i).Valore <> 0 Then  'Trovato Ciclico che inizia Prima Timprec
            Pin = CMDDat(i).Pin
            Conf = PConf(CMDDat(i).Pin)
            Valore = Abs(CMDDat(i).Valore)
            Val2& = Valore: Val2& = Val2& * 2
            EsisteFine = False
            j = i + 1
            Do While CMDDat(j).Tipo = "C"
                If CMDDat(j).Valore = 0 And CMDDat(j).Pin = Pin Then
                    EsisteFine = True   'E' un Ciclico con Fine
                    Exit Do
                End If
                j = j + 1
            Loop
            Bit = 1 'Predispone Valore = 1
            If TimPrec >= CMDDat(i).Tempo Then 'Se Comincia prima di Timprec
                'TimAtt=tempo tra l'ultima salita e TimPrec
                TimAtt = (TimPrec - CMDDat(i).Tempo) - (Int((TimPrec - CMDDat(i).Tempo) / Val2&) * Val2&)
                If TimAtt < Valore Then
                    If TimAtt = 0 Then  'TimAtt=Tempo della prossima Variazione
                        TimAtt = TimPrec
                    Else
                        Bit = 0
                        TimAtt = TimPrec + Valore - TimAtt
                    End If
                Else
                    If TimAtt = Valore Then 'TimAtt=Tempo della prossima Variazione
                        Bit = 0
                        TimAtt = TimPrec
                    Else
                        TimAtt = TimPrec + Val2& - TimAtt  'TimAtt=Tempo della prossima Variazione
                    End If
                
                End If
            Else        'Comincia in mezzo
                TimAtt = CMDDat(i).Tempo
            End If
            If CMDDat(i).Valore < 0 Then
                Bit = 1 - Bit
            End If
            If EsisteFine Then   'Esiste anche la Fine
                If CMDDat(j).Tempo > TimPrec Then   'Agisce in questo Momento
                    While TimTot > TimAtt And CMDDat(j).Tempo >= TimAtt
                        GoSub Azione
                        Bit = 1 - Bit
                        TimAtt = TimAtt + Valore
                    Wend
                End If
                i = i + 1
            Else        'Continua Sempre
                While TimTot > TimAtt
                    GoSub Azione
                    Bit = 1 - Bit
                    TimAtt = TimAtt + Valore
                Wend
                i = i + 1
            End If
        Else
            i = i + 1
        End If
    Else
        Exit Do
    End If
Loop

For i = CMDIndex To NumCMD - 1
    If CMDDat(i).Tempo >= TimPrec Then
        CMDIndex = i
        Do While CMDDat(i).Tempo < TimTot
            Bit = CMDDat(i).Valore
            Pin = CMDDat(i).Pin             'Progressivo
            Conf = PConf(CMDDat(i).Pin)     'Progressivo in PConf
            TimAtt = CMDDat(i).Tempo
            If CMDDat(i).Tipo = "I" Then
                GoSub Azione                'Esegue
                
            Else                        'Analogico
                If ADDat(Pin).Valore = -1 Then 'Errore
                    Riattiva 0
                    Tx$ = NomePin(Pin)
                    MsgBox "Dato in Ingresso Errato" + Chr(13) + "Il Piedino " + Tx$ + " Non puo' Essere Analogico", 16
                Else
                    ADDat(Pin).Valore = CMDDat(i).Valore
                    ADDat(Pin).Tempo = CMDDat(i).Tempo
                End If
                'adr1 = CMDDat(i).Valore + 256 * Pin 'Valore su adr1
            End If
            If i < NumCMD - 1 Then
                i = i + 1
            Else
                Exit Do
            End If
        Loop
        Exit For
    End If
Next

Exit Sub
Azione:
If Pin < 40 Then 'Se Piedino
    If ADDat(Pin).Valore <> -1 Then     'Se c'e' qualche dato Analogico precedente lo azzera
        ADDat(Pin).Valore = 0
        ADDat(Pin).Tempo = 0
    End If
End If

VBit = Bit                  'VBit=Bit
Select Case Pin
    
    Case TimerIO            'TIMER
        If Conf < 3 Then    'Input
            If Mem(tscr).Valore And 8 Then  'Se PSI=1 (Timer Attivo)
                Agito = 1
                If PConf(40) = 0 Then       'Input Clok Mode
                    If VBit = 1 Then         'Se Fronte di Salita
                        DecPrescaler 1      'Decrementa il Prescaler
                    End If
                   
                ElseIf PConf(40) = 2 Then   'Input Gaded
                    If VBit Then             'Attivo
                        TimAct = 1
                    Else
                        TimAct = 0
                    End If
                End If
            End If
        End If

    Case SPIIn, SPIClk    'SpiIn  Input Clock SPI
        If Conf < 3 Then
            Select Case Micro
                Case 6218, 6228
                    If Pin = SPIClk Then
                        Agito = EseguiSPI6228(VBit)
                    End If
                Case Else
                    Agito = FcmdSPI(Pin, VBit, TimAtt)
            End Select
        End If
    
    Case ArTimIn    'ARTIMER In
        If Conf < 3 Then
            Agito = FcmdARTim(VBit, TimAtt)
        End If
        
    Case UartIn     'UART
        If Bit = 0 Then                 'Se falling edge ->Bit start
            If UARTAct = 0 Then         'Se e' libera
                If DivUART = 0 Then DivUART = 6656  'Se non e' stato scritto uartcr
                UARTAct = 2                 'Ingresso
                nb! = TimTot - TimAtt       'Tempo  fino a fine istruzione
                na! = TimTot - TimPrec      'tempo istruzione
                Clc! = Cicli * 13           'Clock istruzione
                IClk! = Clc! * nb! / na!    'Clock tra TimATT TimTot
                'Imposta per il centro del primo bit DATO(questo e il bit start)
                UARTPsc = DivUART \ 2 + IClk! - DivUART
                NumClkUA = 1
                
            End If
        End If
End Select
If Agito = 0 Then
    Select Case Pin
          Case 41                 'NMI
            If VBit = 0 Then     'Se Fronte di Discesa
                If (StopWaitAct = 0) Or (Mem(ior).Valore And 16) Then
                    If IntFlag < 6 Then 'Se c'e' gia' interrupt NMI esce
                        Interrupt IntNMI
                    End If
                End If
            End If
        
        Case 42                 'RES
            If VBit = 0 Then     'Se Fronte di Discesa
                If StopWaitAct Then
                    If Veloce = 0 Then
                        FAss.List1.Row = ICount
                        Rec$ = FAss.List1.Text          'Istruzione Attuale
                        Mid$(Rec$, 2, 1) = " "          'Toglie">"
                        FAss.List1.Text = Rec$          'Riscrive
                    End If
                    Indice = ProxIstr("", 0)
                    StopWaitAct = 0: Accelera = 0
                End If
                Riattiva 0
                Beep
                Prompt$ = "|  Attenzione RESET ESTERNO   |"
                Tasti$ = "Continua|Esegui Reset|"
                ii = MsBx.MsBox(Prompt$, -1, -1, Tasti$, "Reset")
                If ii Then
                    Reset 1
                End If
            End If
                
        
        Case Else               'Porte
            PIntBit Pin, NInt, VBit 'Numero Interrupt ed eventuale inversione di VBit se
                                    'Registro di polarita'(se esiste)=1
            
            If Conf = 2 Then   'Input Interrupt
                If NInt = 6 Then                'Porta PC in 6228
                    If VBit = 0 Then Interrupt NInt 'Fronte
                
                Else
                    If Mem(ior).Valore And 16 Then  'Se GEN=1
                        Select Case NInt            'Numero Interrupt
                            Case 1
                                If (Mem(ior).Valore And 64) = 0 Then 'se LES=0
                                    If VBit = 0 Then Interrupt NInt 'Fronte
                                'Else
                                    'Livello
                                End If
                            
                            Case 2
                                If Mem(ior).Valore And 32 Then 'se ESB=1
                                    If VBit = 1 Then Interrupt NInt 'Fronte
                                Else
                                    If VBit = 0 Then Interrupt NInt 'Fronte
                                End If
                        End Select
                    
                    End If
                End If
            End If
    
    End Select
End If
Return
End Sub

Public Sub PorteS()
Prompt$ = "|  Modalita' di Visualizzazione   |"
Tasti$ = "Grafica|Numerica|"
ii = MsBx.MsBox(Prompt$, -1, -1, Tasti$, "Cronologia Porte")
If ii Then
    PorteN.Apri
    PorteN.Show 1
Else
    Porte.Show 1
End If
End Sub




Public Sub ERLC()
BitC = FLAGS(FlagLev).C 'BitC= Carry
FLAGS(FlagLev).C = 0    'Predispone
FLAGS(FlagLev).Z = 0

If AA And 128 Then FLAGS(FlagLev).C = 1

AA = AA * 2
AA = AA And 255
If BitC Then        'Mette Carry nel Bit 0
    AA = AA Or 1
Else
    AA = AA And 254
End If
If AA = 0 Then      'Se=0 setta Z
    FLAGS(FlagLev).Z = 1
End If
Mem(255).Valore = AA
LMem = 255
End Sub



Public Sub TimWDR()
WdrCount = WdrCount + TimLoc
If WdrCount > WdrDec Then 'Decrementa WDR
    WdrCount = 0
    Valore = Mem(wdr).Valore \ 4    'Valore =i 6 Bit a SX
    Valore1 = 0
    For x = 0 To 5                  'Valore1 =Inverso di Valore
        If Valore And Q(x) Then
            Valore1 = Valore1 + Q(5 - x)
        End If
    Next
    If Valore1 Then
        Valore1 = Valore1 - 1           'Decrementa
    End If
    Valore = 0
    For x = 0 To 5          'Valore =Inverso di Valore1
        If Valore1 And Q(x) Then
            Valore = Valore + Q(5 - x)
        End If
    Next
    
    Valore = Valore * 4 + 3 'Risposta di 2 bit a Sx e Aggiunge "11" S e C
    Mem(wdr).Valore = Valore
    AggVar wdr
    If Valore1 = 0 Then
        'Reset
        If StopWaitAct Then
            If Veloce = 0 Then
                FAss.List1.Row = ICount
                Rec$ = FAss.List1.Text              'Istruzione Attuale
                Mid$(Rec$, 2, 1) = " "              'Toglie">"
                FAss.List1.Text = Rec$              'Riscrive
            End If
            Indice = ProxIstr("", 0)
            StopWaitAct = 0: Accelera = 0
        End If
        
        Riattiva 0
        Beep
        Prompt$ = "|  Attenzione RESET WHATCHDOG   |"
        Tasti$ = "Continua|Esegui Reset|"
        i = MsBx.MsBox(Prompt$, -1, -1, Tasti$, "WHATCHDOG")
        If i Then
            Reset 1
        End If
    End If
End If
End Sub

Public Sub Interrupt(Num)
If StopWaitAct Then
    If Veloce = 0 Then
        Freccia ICount, 0
    End If
    Indice = ProxIstr("", 0)
    StopWaitAct = 0
    If IntFlag > 5 Then Exit Sub
End If

Select Case Num
    Case 1: Prox$ = "FF6"       'sono assegnati a seconda dei valori letti
    Case 2: Prox$ = "FF4"       'sul file defpin.def
    Case 3: Prox$ = "FF2"
    Case 4: Prox$ = "FF0"
    Case 6: Prox$ = "FFC"       'NMI
End Select

If Num = 6 Then    'NMI
    Num = IntFlag + 6
End If

If IntFlag = 0 Or Num > 5 Then
    NLev = 2
    If Num > 5 Then NLev = 3
    IntFlag = Num
    If Veloce = 0 Then
        FlagLevel NLev
        Freccia ICount, 0
    Else
        FlagLev = NLev
    End If
    For x = 6 To 2 Step -1  'Shifta i Valori in Stak
        Stak(x) = Stak(x - 1)
    Next
    Stak(1) = PCount
    StakLev = StakLev + 1
    AggReg
    
    Indice = ProxIstr("&H" + Prox$, 0)
ElseIf AttesaInt = 0 Then
    AttesaInt = Num
End If

End Sub




Public Sub Apri()
MDIForm1.CommonDialog1.FileName = ""
MDIForm1.CommonDialog1.Filter = "File PRG(*.prg)|*.prg|"
MDIForm1.CommonDialog1.ShowOpen
MDIForm1.Toolbar1.Buttons(2).Value = 0
If MDIForm1.CommonDialog1.FileName <> "" Then
    NomePRG = MDIForm1.CommonDialog1.FileName
    For i = 1 To NRec
        If Recente(i) = NomePRG Then    'Se esiste già in recenti NON lo carica
            Esiste = 1
            Exit For
        End If
    Next
    If Esiste = 0 Then      'se non esiste lo carica in recenti
        NRec = NRec + 1
        If NRec = 5 Then NRec = 4
        For i = NRec To 2 Step -1
            Recente(i) = Recente(i - 1)
        Next
        Recente(1) = NomePRG
    
        AggRec

    End If
    
    Carica
End If

End Sub

Public Sub ApriDat()
MDIForm1.CommonDialog1.FileName = ""
MDIForm1.CommonDialog1.Filter = "File CMD(*.cmd)|*.cmd|"
MDIForm1.CommonDialog1.ShowOpen
If MDIForm1.CommonDialog1.FileName <> "" Then
    FileIn = MDIForm1.CommonDialog1.FileName
    CaricaCMD
End If
End Sub

Public Sub PPasso()
'Se si trova su una istruzione CALL la esegue tutta
'Altrimenti esegue fino al prossimo RET o RETI
If Ass(ICount).OpCod = 5 Then   'call
    Ass(ICount + 1).Brek = 1
Else
    For x = ICount To NumASS
        If Ass(x).OpCod = 24 Or Ass(x).OpCod = 25 Then 'se ret o reti
            Ass(x).Brek = 1
            Exit For
        End If
    Next
    If x > NumASS Then       'Non trovato cerco dall'Inizio
        For x = 0 To ICount - 1
            If Ass(x).OpCod = 24 Or Ass(x).OpCod = 25 Then 'RET o RETI
                Ass(x).Brek = 1
                Exit For
            End If
        Next
    End If
End If
End Sub

Public Sub FMemIni()
    'Carica Grid1
For x = 0 To 255
    Riga = (x \ 16 + 1)
    Colonna = (x Mod 16) + 1
    FMem.Grid1.Col = Colonna
    FMem.Grid1.Row = Riga
    FMem.Grid1.Text = Right$("0" + Hex$(Mem(x).Valore), 2)
Next

End Sub

Public Sub FRegIni()
'FReg.List1.Rows = 10
'FReg.List1.Clear

FReg.List1.Col = 0
For i = 0 To 9
    FReg.List1.Row = i
    FReg.List1.CellBackColor = QBColor(7)
    FReg.List1.CellPictureAlignment = flexAlignRightCenter
    FReg.List1.RowHeight(i) = (FReg.List1.Height - 100) \ 10 '220
Next
FReg.List1.Col = 1

FReg.List1.Row = 0
Rec$ = FReg.List1.Text          'Stak Level
Mid$(Rec$, 13) = Hex$(StakLev)
FReg.List1.Text = Rec$

For x = 1 To 3
    FReg.List1.Row = x
    Rec$ = FReg.List1.Text  'Flag
    Mid$(Rec$, 14) = LTrim$(Str$(FLAGS(x).C)) + ":Z=" + LTrim$(Str$(FLAGS(x).Z))
    FReg.List1.Col = 0
    If x = FlagLev Then
        Set FReg.List1.CellPicture = LoadPicture(AppPat + "Freccia.bmP")
        'Mid$(Rec$, 1, 1) = ">"
    Else
        Set FReg.List1.CellPicture = LoadPicture("")
        
        'Mid$(Rec$, 1, 1) = " "
    End If
    FReg.List1.Col = 1
    FReg.List1.Text = Rec$
Next

FReg.List1.Row = 4
Rec$ = FReg.List1.Text 'List(4)          'Prog. Count
Mid$(Rec$, 11) = Right$(" " + Hex$(PCount), 3)
FReg.List1.Text = Rec$

For x = 5 To 9
    FReg.List1.Row = x
    Rec$ = FReg.List1.Text
    If x = 5 Then       'A
        Valore = Mem(255).Valore
    Else
        Valore = Mem(122 + x).Valore
    End If
    Mid$(Rec$, Len(Rec$) - 1) = Right("0" + Hex$(Valore), 2)
    FReg.List1.Text = Rec$
Next

End Sub

Public Sub FVarIni()
'Carica List1
FVar.List1.Row = 0
If FVar.Command1.Caption = "H" Then
    FVar.List1.Text = "  Nome   Ind. Binario"
Else
    FVar.List1.Text = "  Nome   Ind. HEX Dec"
End If

Num = 0
FVar.List1.Rows = 1
For x = 0 To NumDSD
    If Var(x).Vis = "M" Then         'Visualizzare
        No$ = RTrim(Var(x).Nome)
        Add$ = " " + Right("0" + Hex$(Var(x).Indir), 2)
        Valore = Mem(Var(x).Indir).Valore
        Esa$ = "  " + Right(" 0" + Hex$(Valore), 2)
        Dec$ = Right("   " + Str$(Valore), 5)
        If FVar.Command1.Caption = "H" Then
            GoSub Binario
            FVar.List1.AddItem " " + Var(x).Nome + Add$ + Bin$
        Else
            FVar.List1.AddItem " " + Var(x).Nome + Add$ + Esa$ + Dec$
        End If
        Num = Num + 1
        FVar.List1.RowHeight(Num) = 220

    End If
Next
FVar.List1.Sort = 5
Exit Sub
Binario:
Bin$ = ""
For i = 0 To 7
    If Valore And Q(i) Then
        Bin$ = "1" + Bin$
    Else
        Bin$ = "0" + Bin$
    End If
Next
Bin$ = " " + Bin$
Return
End Sub

Public Sub Riattiva(Flag)
'Se Flag=1 Non rimostra ">"
'Riattiva tutti i movimenti e bottoni

MDIForm1.Timer1.Enabled = False

'Indc = 0
MDIForm1.Porte.Enabled = True       'Riattiva
MDIForm1.Finestre.Enabled = True
MDIForm1.Variabili.Enabled = True
MDIForm1.DebI.Enabled = True

For i = 1 To 17      'Abilita File
    If MDIForm1.FileItem(i).Caption <> "-" Or i <> 12 Then
        MDIForm1.FileItem(i).Enabled = True
    End If
Next
If SiEEPROM Then
    MDIForm1.FileItem(12).Enabled = True
Else
    MDIForm1.FileItem(12).Enabled = False
End If


For i = 1 To 10      'Abilita Esegui
    If MDIForm1.RunItem(i).Caption <> "-" Then
        If i = 8 Then
            MDIForm1.RunItem(i).Enabled = flse  'Stop
        Else
            MDIForm1.RunItem(i).Enabled = True
        End If
    End If
Next

For i = 2 To 18
    If i <> 17 Then
        If i > 5 And i <> 15 Then
            MDIForm1.Toolbar1.Buttons(i).Value = 0
        End If
        MDIForm1.Toolbar1.Buttons(i).Enabled = True
    End If
Next
MDIForm1.Toolbar1.Buttons(9).Value = 1      'Stop
MDIForm1.Toolbar1.Buttons(9).Enabled = False

MDIForm1.PortItem(1).Enabled = True
MDIForm1.PortItem(4).Enabled = True
If MDIForm1.Toolbar1.Buttons(4).Value = 1 Or MDIForm1.Toolbar1.Buttons(5).Value = 1 Then
    MDIForm1.Toolbar1.Buttons(17).Enabled = True
    MDIForm1.PortItem(3).Enabled = True
End If
FAss.List1.HighLight = flexHighlightAlways  'si vede il cursore in FAss
If Veloce Then
    Gira = 0
    Gir = 1
    MDIForm1.StatusBar1.Panels(6).Text = "µs " + Str(Int(TimTot))
    Veloce = 0              'Rimette a 0
    FAss.List1.ForeColor = &H80000008
    FMem.Grid1.ForeColor = &H80000008
    FReg.List1.ForeColor = &H80000008
    FVar.List1.ForeColor = &H80000008
    FMemIni
    FRegIni
    FVarIni
    'If FVar.List1.Rows > 1 Then
    '    FVar.List1.TopIndex = TopVar
    'End If
    If Flag = 0 Then
        Freccia ICount, 1
        'FAss.List1.Row = ICount
        'Rec$ = FAss.List1.Text
        'Mid$(Rec$, 2, 1) = ">"
        'FAss.List1.Text = Rec$
    End If
    AggAss ICount     'Fass.List1.ListIndex = ICount
End If
End Sub

Public Sub Disattiva(N, Tasto)
'n=0 disattiva solo tasti
'n=1 disattiva anche le operazioni sulle finestre
'Tasto= Bottone da lasciare premuto
'Disattiva i bottoni escloso stop
For i = 1 To 18
    If i = 9 Then      'Stop
        MDIForm1.Toolbar1.Buttons(i).Enabled = True
        MDIForm1.Toolbar1.Buttons(i).Value = 0
    Else
        MDIForm1.Toolbar1.Buttons(i).Enabled = False
        If i > 5 And i < 14 Then
            MDIForm1.Toolbar1.Buttons(i).Value = 0
            If i = Tasto Then
                MDIForm1.Toolbar1.Buttons(i).Value = 1
            End If
        End If
    End If
Next


MDIForm1.Porte.Enabled = False      'Disabilita
MDIForm1.Finestre.Enabled = False
MDIForm1.Variabili.Enabled = False
MDIForm1.DebI.Enabled = False

For i = 1 To 17         'Abilitato solo "Esci"
    If MDIForm1.FileItem(i).Caption <> "-" Then
        MDIForm1.FileItem(i).Enabled = False
    End If
Next
For i = 1 To 10      'Abilitato solo "Stop"
    If MDIForm1.RunItem(i).Caption <> "-" Then
        If i = 8 Then
            MDIForm1.RunItem(i).Enabled = True  'Stop
        Else
            MDIForm1.RunItem(i).Enabled = False
        End If

    End If
Next

If N Then   'disattiva tutto
    FAss.List1.HighLight = flexHighlightNever   'Non si vede il cursore in FAss
    Gira = Tasto
    FAss.List1.ForeColor = QBColor(8)
    FMem.Grid1.ForeColor = QBColor(8)
    FReg.List1.ForeColor = QBColor(8)
    FVar.List1.ForeColor = QBColor(8)
End If
End Sub




Public Sub CaricaHex()
 MaxlenHex = 0   'Predispone
Flaglis = 0
Open NomeHEX For Input As #1
nomelis$ = Left(NomeHEX, Len(NomeHEX) - 3) + "lis"
If UCase(Dir(nomelis$)) = UCase(SoloNome(nomelis$)) Then
    Flaglis = 1
    Open nomelis$ For Input As #2
End If
Do
    VarSX$ = "": VarCX$ = "": VarDX$ = ""
    Cod$ = ""
    Ist$ = ""
    GoSub LeggiB
    If Uscita Then Exit Do

    Indir = ind
    
    Select Case Dl
        Case 0, 8                   'JRNZ
            Ist$ = "jrnz"
            GoSub Lab5
            VarSX$ = d$

        Case 1                      'CALL
            Ist$ = "call"
            GoSub Lab12
            VarSX$ = d$
            
        Case 2, 10                  'JRNC
            Ist$ = "jrnc"
            GoSub Lab5
            VarSX$ = d$
            
        Case 3                      'JRR JRS
            Ist$ = "jrs"
            If Dh Mod 2 = 0 Then
                Ist$ = "jrr"
            End If
            GoSub BitL
            GoSub LeggiB
            GoSub Variabile
            VarCX$ = d$
            GoSub Lab8
            VarDX$ = d$
        Case 4, 12                  'JRZ
            If d$ = "04" Then
                Ist$ = "nop"
            Else
                Ist$ = "jrz"
                GoSub Lab5
                VarSX$ = d$
            End If
        Case 5                      'VARIE
            VarSX$ = "a"             'Predispone
            GoSub Alto
            
        Case 6, 14                  'JRC
            Ist$ = "jrc"
            GoSub Lab5
            VarSX$ = d$
        Case 7                      'VARIE
            VarSX$ = "a"             'Predispone
            GoSub Alto
            
        Case 9                      'JP
            Ist$ = "jp"
            GoSub Lab12
            VarSX$ = d$
        Case 11                     'RES  SET
            Ist$ = "set"
            If Dh Mod 2 = 0 Then
                Ist$ = "res"
            End If
            GoSub BitL
            GoSub LeggiB
            GoSub Variabile
            VarCX$ = d$
        Case 13                     'VARIE
            VarSX$ = "a"
            GoSub Alto
        Case 15                     'VARIE
            VarSX$ = "a"             'Predispone
            GoSub Alto
            
    End Select
    Reg$ = ""
    If VarSX$ <> "" Then
        Reg$ = VarSX$
    End If
        If VarCX$ <> "" Then
        Reg$ = Reg$ + "," + VarCX$
    End If
    If VarDX$ <> "" Then
        Reg$ = Reg$ + "," + VarDX$
    End If
    
    If Ist$ = "*" Then 'Codice non valido
        Ist$ = "* NON"
        Reg$ = "Valido *"
    End If
    
    
    GoSub Codice    'Codice per esegui
    'Assegna Label
    Labe$ = ""
    For x = 0 To NumLAB
        If Label(x).Indir = Indir Then
            Labe$ = Label(x).Nome
            Label(x).Indice = NumASS
            Exit For
        End If
    Next
    ReDim Preserve Ass(NumASS) As Record
    Ass(NumASS).Indir = Indir
    Ass(NumASS).Cod = Cod$
    Ass(NumASS).Label = Labe$
    Ass(NumASS).Istr = Ist$
    Ass(NumASS).OpCod = OpCod
    Ass(NumASS).CP1 = VarSX$
    Ass(NumASS).CP2 = VarCX$
    Ass(NumASS).CP3 = VarDX$
    Ass(NumASS).Tot = Reg$
    
    ll = Len(Reg$) + 1
    If MaxlenHex < ll Then
        MaxlenHex = ll
    End If
    If Flaglis Then
        GoSub Commento
    End If
    
    NumASS = NumASS + 1
Loop
NumASS = NumASS - 1
Close

Exit Sub
Alto:
Select Case Dh
    Case 0
        Ist$ = "ld"
        Select Case Dl
            Case 5
                Ist$ = "*"
            Case 7
                VarCX$ = "(x)"
            Case 13
                Ist$ = "ldi"
                GoSub LeggiB
                GoSub Variabile
                VarSX$ = d$
                GoSub LeggiB: VarCX$ = d$ + "h"
            Case 15
                VarCX$ = "(y)"
        End Select
       
    Case 1
        Select Case Dl
            Case 5
                Ist$ = "inc": VarSX$ = "x"
            Case 7
                Ist$ = "ldi"
                GoSub LeggiB: VarCX$ = d$ + "h"
            Case 13
                Ist$ = "dec"
                VarSX$ = "x"
            Case 15
                Ist$ = "ld"
                GoSub LeggiB
                GoSub Variabile
                VarCX$ = d$

        End Select
    Case 2
        Ist$ = "cp"
        Select Case Dl
            Case 5
                Ist$ = "*"
            Case 7
                VarCX$ = "(x)"
            Case 13
                Ist$ = "com"
            Case 15
                VarCX$ = "(y)"
        End Select

    Case 3
        Ist$ = "ld"
        Select Case Dl
            Case 5
                VarCX$ = "x"
            Case 7
                Ist$ = "cpi"
                GoSub LeggiB: VarCX$ = d$ + "h"
            Case 13
                VarSX$ = "x"
                VarCX$ = "a"
            Case 15
                Ist$ = "cp"
                GoSub LeggiB
                GoSub Variabile
                VarCX$ = d$
        End Select

    Case 4
        Ist$ = "add"
        Select Case Dl
            Case 5
                Ist$ = "*"
            Case 7
                VarCX$ = "(x)"
            Case 13
                Ist$ = "reti"
                VarSX$ = ""
            Case 15
                VarCX$ = "(y)"
        End Select

    Case 5
        Select Case Dl
            Case 5
                Ist$ = "inc"
                VarSX$ = "y"
            Case 7
                Ist$ = "addi"
                GoSub LeggiB: VarCX$ = d$ + "h"
            Case 13
                Ist$ = "dec"
                VarSX$ = "y"
            Case 15
                Ist$ = "add"
                GoSub LeggiB
                If d$ = "FF" Then
                    Ist$ = "sla"
                Else
                    GoSub Variabile
                    VarCX$ = d$
                End If
        End Select

    Case 6
        Ist$ = "inc"
        Select Case Dl
            Case 5
                Ist$ = "*"
            Case 7
                VarSX$ = "(x)"
            Case 13
                Ist$ = "stop"
                VarSX$ = ""
            Case 15
                VarSX$ = "(y)"
        End Select

    Case 7
        Ist$ = "ld"
        Select Case Dl
            Case 5
                VarCX$ = "y"
            Case 7
            Ist$ = "*"
            Case 13
                VarSX$ = "y"
                VarCX$ = "a"
            Case 15
                Ist$ = "inc"
                GoSub LeggiB
                GoSub Variabile
                VarSX$ = d$
        End Select

    Case 8
        Ist$ = "ld"
        VarCX$ = "a"
        Select Case Dl
            Case 5
                Ist$ = "*"
            Case 7
                VarSX$ = "(x)"
            Case 13
                Ist$ = "*"
            Case 15
                VarSX$ = "(y)"
        End Select

    Case 9
        VarSX$ = "v"
        Select Case Dl
            Case 5
                Ist$ = "inc"
            Case 7
                Ist$ = "*"
            Case 13
                Ist$ = "dec"
            Case 15
                Ist$ = "ld"
                GoSub LeggiB
                GoSub Variabile
                VarSX$ = d$
                VarCX$ = "a"
        End Select

    Case 10
        Ist$ = "and"
        Select Case Dl
            Case 5
                Ist$ = "*"
            Case 7
                VarCX$ = "(x)"
            Case 13
                Ist$ = "rlc"
            Case 15
                VarCX$ = "(y)"
        End Select

    Case 11
        Ist$ = "ld"
        Select Case Dl
            Case 5
                VarCX$ = "v"
            Case 7
                Ist$ = "andi"
                GoSub LeggiB: VarCX$ = d$ + "h"
            Case 13
                VarSX$ = "v"
                VarCX$ = "a"
            Case 15
                Ist$ = "and"
                GoSub LeggiB
                GoSub Variabile
                VarCX$ = d$
        End Select

    Case 12
        Ist$ = "sub"
        Select Case Dl
            Case 5
                Ist$ = "*"
            Case 7
                VarCX$ = "(x)"
            Case 13
                Ist$ = "ret"
                VarSX$ = ""
            Case 15
                VarCX$ = "(y)"
        End Select

    Case 13
        Select Case Dl
            Case 5
                Ist$ = "inc"
                VarSX$ = "w"
            Case 7
                Ist$ = "subi"
                GoSub LeggiB: VarCX$ = d$ + "h"
            Case 13
                Ist$ = "dec"
                VarSX$ = "w"
            Case 15
                Ist$ = "sub"
                GoSub LeggiB
                GoSub Variabile
                If d$ = "a" Then
                    Ist$ = "clr"
                Else
                    VarCX$ = d$
                End If
        End Select

    Case 14
        Ist$ = "dec"
        Select Case Dl
            Case 5
                Ist$ = "*"
            Case 7
                VarSX$ = "(x)"
            Case 13
                Ist$ = "wait"
                VarSX$ = ""
            Case 15
                VarSX$ = "(y)"
        End Select

    Case 15
        Ist$ = "ld"
        Select Case Dl
            Case 5
                VarCX$ = "w"
            Case 7
                Ist$ = "*"
            Case 13
                VarSX$ = "w"
                VarCX$ = "a"
            Case 15
                Ist$ = "dec"
                GoSub LeggiB
                GoSub Variabile
                VarSX$ = d$
        End Select


End Select
Return

LeggiB:
P0 = P0 + 2
If P0 > Lung Then
    GoSub LeggiR
    If Uscita Then Return
    ind = ind - 1
    If Ist$ = "*" Then P0 = P0 - 2: Return 'Non COnsecutivi
End If
ind = ind + 1
d$ = Mid(Record$, P0, 2)         'Dato
Cod$ = Cod$ + d$
Dh = "&H" + Left(d$, 1)         'Hight
Dl = "&H" + Right(d$, 1)        'low
Return
LeggiR:
Line Input #1, Record$
Lung = ("&H" + Mid(Record$, 2, 2)) * 2 + 9
If Lung = 9 Then
    Uscita = True
    Return
End If
Indn = "&H" + Mid(Record$, 4, 4)

If ind > 0 And Indn > ind + 1 Then
    If Ist$ <> "" Then
        Ist$ = "*"            'I Byte NON sono successivi
    End If
End If
ind = Indn
P0 = 10       'Punta al Primo Byte Dati
Return

Variabile:
Valore = "&h" + d$
d$ = d$ + "h"
For x = 0 To NumDSD
    If Var(x).Indir = Valore Then
        d$ = RTrim(Var(x).Nome)
        Exit For
    End If
Next
Return

Lab5:
DD = ("&H" + d$) \ 8
If DD > 15 Then DD = -(32 - DD)
Indirizzo = ind + DD + 1: d$ = Hex$(Indirizzo) + "h"
GoTo Lab
Lab8:
GoSub LeggiB
DD = "&H" + d$
If DD > 128 Then DD = -(256 - DD)
Indirizzo = ind + DD + 1: d$ = Hex$(Indirizzo) + "h"
GoTo Lab
Lab12:
A$ = Left(d$, 1)
GoSub LeggiB
Indirizzo = "&H" + d$ + A$: d$ = Hex$(Indirizzo) + "h"
Lab:
For x = O To NumLAB
    If Label(x).Indir = Indirizzo Then
        d$ = Label(x).Nome
        Exit For
    End If
Next
Return

BitL:
Valore = ("&h" + Left(d$, 1)) \ 2
Select Case Valore
    Case 1, 3: Valore = Valore + 3
    Case 4, 6: Valore = Valore - 3
End Select
VarSX$ = LTrim(Str$(Valore))
Return
Codice:
Select Case Ist$
    Case "add": OpCod = 1
    Case "addi": OpCod = 2
    Case "and": OpCod = 3
    Case "andi": OpCod = 4
    Case "call": OpCod = 5
    Case "clr": OpCod = 6
    Case "com": OpCod = 7
    Case "cp": OpCod = 8
    Case "cpi": OpCod = 9
    Case "dec": OpCod = 10
    Case "inc": OpCod = 11
    Case "jp": OpCod = 12
    Case "jrc": OpCod = 13
    Case "jrnc": OpCod = 14
    Case "jrz": OpCod = 15
    Case "jrnz": OpCod = 16
    Case "jrr": OpCod = 17
    Case "jrs": OpCod = 18
    Case "ld": OpCod = 19
    Case "ldi": OpCod = 20
    Case "nop": OpCod = 21
    Case "res": OpCod = 22
    Case "set": OpCod = 23
    Case "ret": OpCod = 24
    Case "reti": OpCod = 25
    Case "sub": OpCod = 26
    Case "subi": OpCod = 27
    Case "rlc": OpCod = 28
    Case "sla": OpCod = 29
    Case "stop": OpCod = 30
    Case "wait": OpCod = 31
End Select
Return

Commento:
'Legge i commenti(anche nelle righe successive)
RegCom$ = ""
Out = 0 'per non Leggere ";" nelle righe successive
Do
    If Val("&H" + Mid(Comm$, 10, 4)) = Indir Then
rip:    i = InStr(Comm$, ";")
        If i Then
            RegCom$ = RegCom$ + Mid(Comm$, i + Out) + " "
        'End If
        Line Input #2, Comm$
        Pind = Val("&H" + Mid(Comm$, 10, 4))
        If Pind = 0 Or Pind = Indir Then
            Out = 1
            GoTo rip
        End If
        End If
        Exit Do
    ElseIf Not EOF(2) Then
        Line Input #2, Comm$
    End If
Loop While Not EOF(2)
Ass(NumASS).Comm = RegCom$
If MaxlenCom < Len(RegCom$) Then
    MaxlenCom = Len(RegCom$)
End If
Return

End Sub

Public Sub ScriviDat(ByVal Porta, Bit, ByVal Valore, ByVal Tempo As Single, Tipo$)
'Se Porta = -1 Bit Contiene il valore per Pin
Dim Dum As CMD
If Porta <> -1 Then
    If Porta = tscr Then    'NMI
        Pin = 40 + Bit
    Else
        Pin = NPin(Porta, Bit)   'Nome delPin(Posizione 0-42)
    End If
Else
    Pin = Bit
End If
If Pin > 42 Then Exit Sub 'Se il pin Non esiste esce


If Tipo$ = "A" Then 'Vede se deve assegnare il Valore ad adr1
    If Tempo < TimTot Then
        i = 0   'Salta "C"
        While CMDDat(i).Tipo = "C"
            i = i + 1
        Wend
        Assegna = True  'Predispone
        Do While i < NumCMD
            If CMDDat(i).Tempo < TimTot Then
                If CMDDat(i).Tempo > Tempo Then     'C'e' un Dato Posteriore
                    Assegna = False
                    Exit Do
                End If
                i = i + 1
            Else
                Exit Do
            End If
        Loop
        If Assegna Then
            ADDat(Pin).Valore = Valore
            ADDat(Pin).Tempo = Tempo
            'adr1 = Valore + 256 * Pin 'Valore su adr1
        End If
    End If
End If

If Tempo > Int(Tempo) Then Tempo = Int(Tempo + 1)
If Valore And Tipo$ <> "A" Then Valore = 1 'Nel caso sia >1

'Scrive dati su DatOut(se DataOut=1 )
If DataOut Then
    GoSub WriOut
End If

'Se Ingresso ,Tempo uguale o succ. o CMDDat scrive su DatCMD
If Tipo$ <> "O" Then
    If DataIn = 1 Or Tempo >= Int(TimTot) Then
        If DataOut = 0 Then 'Se Ingresso scrive comunque su Datout
            GoSub WriOut
        End If
        GoSub WriIn
    End If
End If


Exit Sub
WriOut:
'Trova  la posizione nel Vettore
TipoP$ = "": TipoS$ = ""
iPrec = -1  'Predispone Non Trovato Precedente
iSucc = -1  'Predispone NON Trovato Successivo
ValoreP = -1
ValoreS = -1
Part = InDAT(Pin)
If (Part < NumOut) And (Part < InDAT(Pin + 1)) Then     'SOlo se esiste
    While DatOut(Part).Tipo = "C"                       'Esclude Tipo "C"
        If Tempo < DatOut(Part).Tempo Then              'Se Tempo all'interno di Ciclic
            Exit Sub    'Abbandona
        End If
        Part = Part + 1
    Wend
End If
If Part > InDAT(Pin) Then
    If DatOut(Part - 1).Valore > 0 Then    'Se Ciclic sempre
        Exit Sub        'Abbandona
    End If
End If

For i = Part To InDAT(Pin + 1) - 1
    If DatOut(i).Tempo <= Tempo Then
        ValoreP = DatOut(i).Valore
        TipoP$ = DatOut(i).Tipo
        iPrec = i
    End If
    If DatOut(i).Tempo > Tempo Then
        ValoreS = DatOut(i).Valore
        TipoS$ = DatOut(i).Tipo
        iSucc = i
        Exit For
    End If
Next

If TipoP$ = TipoS$ Then
    If Tipo$ = TipoP$ Then
        If Valore = ValoreP Then
            'Non fa Nulla
        ElseIf Valore = ValoreS Then
            DatOut(i).Tempo = Tempo
        Else
            GoSub ScriviOut
        End If
    Else
        GoSub ScriviOut
    End If

Else
    If Tipo$ = TipoP$ Then
        If Valore <> ValoreP Then
            GoSub ScriviOut
        End If
    ElseIf Tipo$ = TipoS$ Then
        If Valore = ValoreS Then
            DatOut(i).Tempo = Tempo
        Else
            GoSub ScriviOut
        End If
    Else
        GoSub ScriviOut
    End If
End If
Return
ScriviOut:
ReDim Preserve DatOut(NumOut + 1) As CMD
DatOut(NumOut + 1) = DumDat
If i < NumOut Then      'Va inserito
    For j = NumOut To i + 1 Step -1
        DatOut(j) = DatOut(j - 1)
    Next
End If
NumOut = NumOut + 1
DatOut(i).Pin = Pin
DatOut(i).Tipo = Tipo$
DatOut(i).Valore = Valore
DatOut(i).Tempo = Tempo

For j = Pin + 1 To 43   'Punta 1 piu in su i Puntatori
    InDAT(j) = InDAT(j) + 1
Next
Return


WriIn:
'Trova  la posizione nel Vettore
TipoP$ = "": TipoS$ = ""
iPrec = -1  'Predispone Non Trovato Precedente
iSucc = -1  'Predispone NON Trovato Successivo
ValoreP = -1
ValoreS = -1
Part = 0
While CMDDat(Part).Tipo = "C"
    Part = Part + 1
Wend

Indice = Part   'Predispone
For i = Part To NumCMD - 1
    If CMDDat(i).Tempo <= Tempo Then     'Posizione di Inserimento(Indice)
        Indice = i + 1
    End If
    If CMDDat(i).Pin = Pin Then
        If CMDDat(i).Tempo <= Tempo Then
            ValoreP = CMDDat(i).Valore
            TipoP$ = CMDDat(i).Tipo
            iPrec = i
        End If
        If CMDDat(i).Tempo > Tempo Then
            ValoreS = CMDDat(i).Valore
            TipoS$ = CMDDat(i).Tipo
            iSucc = i
            Exit For
        End If
    End If
Next

If TipoP$ = TipoS$ Then
    If Tipo$ = TipoP$ Then
        If Valore = ValoreP Then
            'Non fa Nulla
        ElseIf Valore = ValoreS Then
            IndiceOld = iSucc
            GoSub SpostaCMD
        Else
            GoSub ScriviCMD
        End If
    Else
        GoSub ScriviCMD
    End If

Else
    If Tipo$ = TipoP$ Then
        If Valore <> ValoreP Then
            GoSub ScriviCMD
        End If
    ElseIf Tipo$ = TipoS$ Then
        If Valore = ValoreS Then
            IndiceOld = iSucc
            GoSub SpostaCMD
        Else
            GoSub ScriviCMD
        End If
    Else
        GoSub ScriviCMD
    End If
End If
Return

ScriviCMD:
ReDim Preserve CMDDat(NumCMD + 1) As CMD
CMDDat(NumCMD + 1) = DumDat
If Indice < NumCMD Then     'Va inserito
    For Z = NumCMD To Indice + 1 Step -1
        CMDDat(Z) = CMDDat(Z - 1)
    Next
End If
NumCMD = NumCMD + 1
CMDDat(Indice).Pin = Pin
CMDDat(Indice).Tipo = Tipo$
CMDDat(Indice).Valore = Valore
CMDDat(Indice).Tempo = Tempo

GoSub ScriviInd

If Tipo$ <> "A" Then                    'Se NON Analogico
If Tempo < TimTot And Pin < 40 Then     'Se tempo Precedente e NON TIM o NMI o RES
    If ADDat(Pin).Valore <> -1 Then     'Dati in ADDat
        If ADDat(Pin).Tempo < Tempo Then  'e Tempo dell Analog Precedente
            ADDat(Pin).Valore = 0       'azzera
            ADDat(Pin).Tempo = 0
        End If
    End If
End If
End If

Return

ScriviInd:
ReDim Preserve P(NumCMD - 1) As Integer
'Scrivi Indice
For i = 0 To NumCMD - 1     'Chi punta sopra Indice Incrementa di 1
    If P(i) >= Indice Then  'Anche l'attuale Puntatore a Indice
        P(i) = P(i) + 1
    End If
Next
Part = InCMD(Pin).Start
While CMDDat(P(Part)).Tipo = "C"
    Part = Part + 1
Wend
If iPrec <> -1 Then     'Esiste Precedente
    If iSucc = -1 Then  'E' Ultimo
        i = InCMD(Pin + 1).Start
    Else                'E' in Mezzo
        For i = Part To InCMD(Pin + 1).Start - 1
            If P(i) = iPrec Then        'Trovato Precedente
                i = i + 1
                Exit For
            End If
        Next
    End If
Else                'E' il primo
    i = Part
End If

For j = NumCMD - 1 To i + 1 Step -1
    P(j) = P(j - 1)     'Sposta in Su
Next
P(i) = Indice           'Piazza il Nuovo
For j = Pin + 1 To 43   'Punta 1 piu in su i Puntatori
    InCMD(j).Start = InCMD(j).Start + 1
Next
Return

SpostaCMD:
'Sposta il record IndiceOld Indietro su Indice
Dum = CMDDat(IndiceOld)    'Salva
For j = IndiceOld To Indice + 1 Step -1
    CMDDat(j) = CMDDat(j - 1)
Next

CMDDat(Indice) = Dum             'Inserisce
CMDDat(Indice).Tempo = Tempo    'Con il Nuovo Tempo
Return

End Sub




Public Sub EventiReg()
If LMem = -1 Then Exit Sub      'Non esiste
Select Case LMem
    Case wdr            'WatchDog
        WdrCount = 0    'Azzera Contatore
        If WDogAct Then comodo = 1  'serve qua sotto
        WDogAct = 0     'Predispone
        If WDogHW Then  'Se WDOg Hardware
            Mem(wdr).Valore = Mem(wdr).Valore Or 1
            AggVar wdr
            WDogAct = 1
        Else
            If Mem(wdr).Valore And 1 Then
                WDogAct = 1
            Else            'WatchDog Diusattivato
                If comodo Then
                    Riattiva 0
                    i = MsgBox("Attenzione il Bit 0 del registro DRWR è ZERO" + Chr(13) + "nella simulazione il WatchDog sarà comunque disattivato", 16)
                End If
            End If
        End If

    Case drwr       'Data Window Register
        If FlDrwr = 0 Then
            If FlagLev > 1 Then     'Non si puo scrivere drwr sotto Interrupt
                Riattiva 0
                Beep
                'x = MsgBox("E' Meglio NON scrivere drwr sotto INTERRUPT", 16)
                RegDRWR.Show 1
            End If
        End If
        For i = &H40 To &H7F     'Predispone tutto FF
            Mem(i).Valore = &HFF
        Next
        ind0 = Mem(drwr).Valore * 64  'Indirizzo(in ROM) primo Byte
        Indice = CercaLabel(Str$(ind0))
        If Indice < 0 Then      'In mezzo all'istruzione(vedi Cercalabel)
            Indice = -Indice
            ind1 = Ass(Indice).Indir
            dif = (ind0 - ind1) * 2 'dif=spostameto del primo byte da leggere
        End If
        'Carica I dati
        Do
            C$ = RTrim(Ass(Indice).Cod)
            If dif Then
                C$ = Right(C$, Len(C$) - dif)
            End If
                
            ind = Ass(Indice).Indir + dif / 2
            If ind - ind0 <= 63 Then
                i = &H40 + ind - ind0
                For j = 1 To Len(C$) Step 2
                    Mem(i).Valore = Val("&h" + Mid$(C$, j, 2))
                    i = i + 1
                    If i = &H80 Then
                        Exit Do
                    End If
                Next
            Else
                Exit Do
            End If
            Indice = Indice + 1
            If Indice > NumASS Then
                Exit Do
            End If
            dif = 0
        Loop
        FMemIni
        If FVar.Command1.Caption = "H" Then
            FVar.Command1.Caption = "B"
        Else
            FVar.Command1.Caption = "H"
        End If
        FVar.Command1_Click
      
    Case tscr       'TIMER
        TimAct = 0                      'Predispone Timer disattivato
        Valore = Mem(tscr).Valore
        PConf(40) = (Valore And 48) \ 8 'PConf(40)= DOUT E TOUT
        If Valore And 8 Then            'se PSI=1 bit 3
            Valore = Valore And 7   'solo PS0 PS1 PS2
            DivPSC = Q(Valore)      'Valore prescaler
            
            If PConf(40) >= 4 Then      'Se TOUT=1
                TimAct = 1              'Attivato
            ElseIf PConf(40) = 2 And TimerIO <> 255 Then 'DOUT=1 TOUT=0 (Gaded Mode)
                If ValPin(-1, TimerIO, 2) Then  'Se Pin Timer=1
                    TimAct = 1          'Attivato
                End If
            End If
            
        Else                            'se PSI=0
            If Mem(psc).Valore <> &H7F Then     'Prescaler (PSC)= 7FH
                Mem(psc).Valore = &H7F
                AggVar psc
            End If
        End If
        
        If TimerIO = 255 Then                           'Se NON esiste Pin TIM
            If (Mem(tscr).Valore And 32) = 0 Then    'Se Bit 5=0 ERRORE
                Riattiva 0
                Beep
                MsgBox "Nei Micro ST" + Trim(Str(Micro)) + " il Bit 5  del registro TSCR DEVE essere  1", 16
            End If
            If (Mem(tscr).Valore And 16) = 0 Then    'Se Bit 4=0 Timer Disabilitato
                TimAct = 0
            End If
            
        Else
            If PConf(40) And 4 Then 'Se TOUT=1
                If FlagTimOut = 0 Then
                    FlagTimOut = 1      'Setta FlagTimOut
                    ScriviDat -1, TimerIO, ValPin(-1, TimerIO, Conf), TimTot, "O"  'Scrive
                End If
            ElseIf FlagTimOut Then  'Se TOUT=0 e FlagTimOut=1 si sta
                FlagTimOut = 0
                Conf = PConf(TimerIO)    'rientrando da situazione in cui PC1 era TimOut
                If Conf > 3 Then Tp$ = "O" Else Tp$ = "I"  ' quindi Ripristino il Piedino
                ScriviDat -1, TimerIO, ValPin(-1, TimerIO, Conf), TimTot, Tp$  ' con il valore del Pin
            End If
        End If
    Case tcr        'TCR
        If Mem(tcr).Valore = 0 Then 'Se 0 TMZ=1
            Mem(tscr).Valore = Mem(tscr).Valore Or 128
            AggVar tscr
        End If

    Case adcr       'ADC
        Valore = Mem(adcr).Valore
        If (Valore And 48) = 48 Then                'se PDS=1 e STA=1
            If (Mem(257).Valore And 16) = 0 Then      'e Bit ADCSYNCRO=0 su Bit 4 di Option Byte MSB
                AdcAct = 1                          'Attivato
                Mem(adcr).Valore = Valore And 159   'EOC=0 STA=0(bit 5 e 6)
            End If
            AggVar adcr
        End If

    'Registri per 6265 e 6228
    Case prpr                       'Numero della Pagina ROM
        NPag = Mem(prpr).Valore
    
    Case drbr, eectl                'Pagine RAM EEPROM
        EvRegEEPROM
        
    Case armc, arsc0, arsc1, arrc, arcp, arlr   'ARTimer
        EvRegARTim
    
    Case miscr, spidsr, spidiv, spimod          'SPI 6265
        EvRegSPI
    
    Case uartdr, uartcr             'UART   6228
        EvRegUART
    
    Case sidr, sdsr                 'SPI 6228
        EvRegSPI228
    
    Case oscr                       'Oscillatore 6265
        EvRegOsc

End Select
End Sub

Public Sub TempiIn(Prompt$)
'Per inserimento dati da 6210 6215 Porte

Tx$ = LTrim(Str(Int(TimTot)))
P0$ = "07081Tempo del Pin " + Prompt$
Out0$ = Tx$
InpBox.ImputBox P0$, P1$, P2$, P3$, Out0$, Out1$, Out2$, Out3$, "Inserimento Tempo", -1, -1
If Out0$ <> "" Then
    TimIn = Val(Out0$)
End If
End Sub

Public Sub DecPrescaler(IClock)
'Decrementa il Prescaler di IClock unita'
VarTCR = False  'Predispone
For i = 1 To IClock
    Mem(psc).Valore = Mem(psc).Valore - 1
    If Mem(psc).Valore = 0 Then Mem(psc).Valore = 128   'Ricarica
    If Mem(psc).Valore Mod DivPSC = 0 Then
        VarTCR = True                                   'Varia
        Mem(tcr).Valore = Mem(tcr).Valore - 1
        If Mem(tcr).Valore < 1 Then
            Mem(tcr).Valore = 255
            
            'Piedino di Uscita TIMER(PC1) e TMZ
            If (Mem(tscr).Valore And 128) = 0 Then      'Se TMZ=0(bit 7)(Verra' Posto ora a 1) per cui si ha una transizione 0-1
                If Mem(tscr).Valore And 32 Then         'e TOUT=1(bit 5)
                    Valo = Mem(tscr).Valore And 16      'DOUT(bit 4)
                    If Valo Then Valo = 1
                    TimAtt = Int(TimPrec + (i - 1) * msC / Kf) 'Tempo Attuale
                    ScriviDat -1, TimerIO, Valo, TimAtt, "O" 'Timer I/O
                    PTim = Valo
                End If
                'scrive TMZ
                Mem(tscr).Valore = Mem(tscr).Valore Or 128
                AggVar tscr
            End If
            
            If Mem(ior).Valore And 16 Then      'Se GEN=1
                If Mem(tscr).Valore And 64 Then 'e ETI=1
                    Interrupt IntTIM
                End If
            End If
        End If
    End If
Next
If VarTCR Then  'Se TCR e' Variato
    AggVar tcr      'Aggiorna
End If

AggVar psc      'Aggiorna

End Sub

Public Sub FileDat(Num)
'Num=1 scrive file Dati OUT
'   =0 scrive dati In
'Open "d:Punta.cmd" For Output As #1
'For i = 0 To NumCMD - 1
'    N = CMDDat(P(i)).Pin
'    GoSub NomePorta
'    Record$ = Record$ + CMDDat(P(i)).Tipo + Str(CMDDat(P(i)).Valore)
'    Print #1, i; P(i); " "; Record$
'Next
'Close
If Num = 1 Then
    If DataOut Then
        A$ = SoloNome(NomePRG)
        A$ = Left(A$, Len(A$) - 3) + "dat"
        MDIForm1.CommonDialog1.FileName = A$
        MDIForm1.CommonDialog1.Filter = "File DAT(*.dat)|*.dat|"
        MDIForm1.CommonDialog1.ShowSave
        If MDIForm1.CommonDialog1.FileName <> "" And NumOut > 0 Then
            Open MDIForm1.CommonDialog1.FileName For Output As #1
            For x = 0 To NumOut - 1
                If DatOut(x).Tipo = "O" Then
                    N = DatOut(x).Pin
                    Record$ = NomePin(N) + " " + DatOut(x).Tipo + " " + LTrim(Str(DatOut(x).Valore))
                    GoSub OutPrec
                    Record$ = Record$ + Str(TimIn) + Str(DatOut(x).Tempo)
                    Print #1, Record$
                End If
            Next
            Close
        End If
    End If

Else
    If DataIn Then
        MDIForm1.CommonDialog1.FileName = FileIn
        MDIForm1.CommonDialog1.Filter = "File CMD(*.cmd)|*.cmd|"
        MDIForm1.CommonDialog1.ShowSave
        If MDIForm1.CommonDialog1.FileName <> "" And NumCMD > 0 Then
            Open MDIForm1.CommonDialog1.FileName For Output As #1
            For x = 0 To NumCMD - 1
                N = CMDDat(x).Pin
                Record$ = NomePin(N) + " " + CMDDat(x).Tipo + " " + LTrim(Str(CMDDat(x).Valore))
                GoSub InPrec
                Record$ = Record$ + Str(TimIn) + Str(CMDDat(x).Tempo)
                Print #1, Record$
            Next
            Close
        End If

    End If
End If
Exit Sub
OutPrec:
'Trova (se esiste) Tempo Precedente
TimIn = 0       'Utilizzo TimIn (Single)
If x Then
    For y = x - 1 To 0 Step -1
        If DatOut(y).Pin = DatOut(x).Pin Then
            TimIn = DatOut(x).Tempo - DatOut(y).Tempo
            Exit For
        End If
    Next
End If
If x = 0 Or y = -1 Then
    TimIn = DatOut(x).Tempo
End If
Return
InPrec:
'Trova (se esiste) Tempo Precedente
TimIn = 0       'Utilizzo TimIn (Single)
If x Then
    For y = x - 1 To 0 Step -1
        If CMDDat(y).Pin = CMDDat(x).Pin Then
            TimIn = CMDDat(x).Tempo - CMDDat(y).Tempo
            Exit For
        End If
    Next
End If
If x = 0 Or y = -1 Then
    TimIn = CMDDat(x).Tempo
End If
Return

End Sub

Public Function SoloNome$(Nome$)
For x = Len(Nome$) To 1 Step -1
    If Mid(Nome$, x, 1) = "\" Then Exit For
Next
If x = 1 Then
    SoloNome$ = Nome$
Else
    SoloNome$ = Mid(Nome$, x + 1)
End If
End Function

Public Sub GiraVeloce()
Veloce = 1
Do While Gira
    Gir = Gir + 1: If Gir = 20 Then Gir = 1
    Esegui
    DoEvents
Loop
End Sub

Public Sub WriRamEE()
'Scrive sulla Ram o EEprom Aggiuntive
Select Case Mem(drbr).Valore
    Case &H10       'Ram Pag. 2
        RAMMem(LMem + 64).Valore = Mem(LMem).Valore
    Case 1, 2       'EEProm
        Strt = (Mem(drbr).Valore - 1) * 64  'Strt Ofset in EEMem 0 o 64
        VEECTL = Mem(eectl).Valore
        
        If VEECTL And 64 Then           'E2OFF(bit 6)=1 l'EEPROM e' Disabilitata
            Riattiva 0
            i = MsgBox("L'EEPROM e' disabilitata E2OFF = 1", 48)
        Else
            If VEECTL And 1 Then        'Se E2ENA(bit 0)=1
                If VEECTL And 4 Then    'Se E2PAR2(bit 2)=1 Modo Parallelo
                    If NumToMem = 0 Then    'Primo inserimento
                        RToMem = LMem \ 8   'Imposta la Riga
                    Else
                        If LMem \ 8 <> RToMem Then  'Si scrive su una riga diversa
                            Riattiva 0
                            i = MsgBox("E' Cambiata la riga di scrittura sulla EEPROM" + Chr(13) + "                 Scrivo solo in Memoria", 48)
                        End If
                    End If
                    If LMem \ 8 = RToMem Then   'Se la riga Combacia
                        NonScritto = True
                        For i = 1 To NumToMem       'Se si riscrive la stessa locazione
                            If ToMem(i) = LMem Then 'Non si incrementera' NumToMem
                                NonScritto = False
                                Exit For
                            End If
                        Next
                        If NonScritto Then          'Scrive l'Indirizzo su ToMem()
                            NumToMem = NumToMem + 1
                            If NumToMem > 8 Then    'La riga e' gia piena
                                Riattiva 0
                                i = MsgBox("La Riga di scrittura sulla EEPROM e' gia' Piena", 48)
                            Else
                                ToMem(NumToMem) = LMem
                            End If
                        End If
                    End If
                    
                Else    'Modo Normale scrive su EEPROM su Banco 1 o 2 (vedi Strt)
                    EEMem(LMem + Strt).Valore = Mem(LMem).Valore
                End If
            
            Else        'Non Si puo scrivere
                Riattiva 0
                i = MsgBox("Non si puo' scrivere l'EEPROM con il Bit E2ENA = 0", 48)
            End If
        End If
End Select

End Sub

Public Sub DecARPresc(IClock, Tmpo As Single)
'Se Tmpo <> -1 ->TimAtt=Tmpo
'Decrementa il Prescaler di IClock unita'

VarARTCR = False  'Predispone
For i = 1 To IClock
    ARPsc = ARPsc + 1
    If ARPsc >= ARDivPSC Then
        ARPsc = 0
        VarARTCR = True                                     'Varia
        If Tmpo <> -1 Then      'Scelta del Tempo
            TimAtt = Tmpo
        Else
            TimAtt = Int(TimPrec + (i - 1) * msC / 13)      'Tempo Attuale
        End If
        Mem(arlr).Valore = Mem(arlr).Valore + 1
        If Mem(arlr).Valore >= 255 Then                     'OverFlow
            If PConf(42) = 0 Then                           'Se Autoreload Mode
                Mem(arlr).Valore = Mem(arrc).Valore
            Else                                            'ALtri Modi
                Mem(arlr).Valore = 0
            End If
            
            If Mem(armc).Valore And 32 Then                 'Se PWMOE (Bit 5) e' Abilitato
                ScriviDat -1, ArTimOut, 1, TimAtt, "O"      'Pin ARTimOut ->1
                ARPTimOut = 1
            End If
            
            Mem(arsc0).Valore = Mem(arsc0).Valore Or 1      'scrive OVF
            AggVar arsc0
            
            If Mem(ior).Valore And 16 Then      'Se GEN=1
                If Mem(armc).Valore And 4 Then  'e OVIE=1
                    Interrupt IntARTIM
                End If
            End If
        
        ElseIf Mem(arlr).Valore = Mem(arcp).Valore Then 'Se e' Uguale a Compare
            If Mem(armc).Valore And 32 Then             'Se PWMOE (Bit 5) e' Abilitato
                ScriviDat -1, ArTimOut, 0, TimAtt, "O"  'Pin ARTimOut ->0
                ARPTimOut = 0
            End If
        
            Mem(arsc0).Valore = Mem(arsc0).Valore Or 2  'scrive CPF
            AggVar arsc0
            
            If Mem(ior).Valore And 16 Then      'Se GEN=1
                If Mem(armc).Valore And 8 Then  'e CPIE=1
                    Interrupt IntARTIM
                End If
            End If
        
        End If
    End If
Next
If VarARTCR Then  'Se ARTCR e' Variato
    AggVar arlr   'Aggiorna
End If

End Sub

Public Sub TimARTIM()
'Cicli * 13 =Perche' ogni ciclo richiede 13 Impulsi di Click
IClock = Cicli * 13
DecARPresc IClock, -1
End Sub

Public Sub EvRegEEPROM()
Select Case LMem
    Case drbr '6265 e 6228  Data RAM EEPROM
        VDRBR = Mem(drbr).Valore
        If LMem = &HE8 Then     '6265 Banchi EEPROM 1 e 2 + Banco RAM 2(vedi Manuale SGS)
            If VDRBR <> 0 And VDRBR <> 1 And VDRBR <> 2 And VDRBR <> 16 Then
                Riattiva 0
                x = MsgBox("        Valore in   DRBR   Errato          ", 16)
                Exit Sub
            End If
        Else
            If VDRBR <> 8 And VDRBR <> 16 Then  '6228 solo 2 banchi RAM
                Riattiva 0
                i = MsgBox("        Valore in   DRBR   Errato          ", 16)
                Exit Sub
            End If
        
        End If
        Select Case VDRBR
            Case 1, 2   'EEPROM Pag.1 e 2
                If Mem(eectl).Valore And 64 Then        'L'EEROM e' disabilitata
                    Riattiva 0
                    i = MsgBox("     Attenzione L'EEPROM e' Disabilitata" + Chr(13) + "E' comunque possibile abilitarla anche successivamente", 48)
                End If
                
                Strt = (VDRBR - 1) * 64   '0 o 64
                
                For i = 0 To 63     'Carica i Dati
                    Mem(i).Valore = EEMem(i + Strt).Valore
                
                    Riga = (i \ 16 + 1) 'e li scrive sulla GRID
                    Colonna = (i Mod 16) + 1
                    FMem.Grid1.Col = Colonna
                    FMem.Grid1.Row = Riga
                    FMem.Grid1.Text = Right$("0" + Hex$(Mem(i).Valore), 2)
                Next
                'Aggiorna Finestra Variabili
                If FVar.Command1.Caption = "H" Then
                    FVar.Command1.Caption = "B"
                Else
                    FVar.Command1.Caption = "H"
                End If
                FVar.Command1_Click
                
            Case 8, 16    'RAM
                Offs = 0: If VDRBR = 16 Then Offs = 64  'Pagina 1 o 2(la 1 solo per 6228)
                For i = 0 To 63     'Carica i Dati
                    Mem(i).Valore = RAMMem(i + Offs).Valore
                
                    Riga = (i \ 16 + 1) 'e li  scrive sulla GRID
                    Colonna = (i Mod 16) + 1
                    FMem.Grid1.Col = Colonna
                    FMem.Grid1.Row = Riga
                    FMem.Grid1.Text = Right$("0" + Hex$(Mem(i).Valore), 2)
                Next
                'Aggiorna Finestra Variabili
                If FVar.Command1.Caption = "H" Then
                    FVar.Command1.Caption = "B"
                Else
                    FVar.Command1.Caption = "H"
                End If
                FVar.Command1_Click

        End Select
        
    Case eectl      'EEPROM Control
        VEECTL = Mem(eectl).Valore
        If VEECTL And 64 Then           'E2OFF(bit 6)=1 l'EEPROM e' Disabilitata
            If VEECTL And 63 Then       'Se Sono Settati E2PAR2 E2PAR2 o E2ENA
                Riattiva 0              'E' Un Controsenso
                i = MsgBox("Si disabilita L'EEPROM con E2PAR2 o E2PAR1 o E2ENA =1", 48)
                For i = 1 To 8           'Resetta
                    ToMem(i) = 255
                Next
                NumToMem = 0
            
            End If
        Else
            If (VEECTL And 4) = 0 And NumToMem Then     'Se E2PAR2(Bit 2)=0 e NumToMem >0
                For i = 1 To 8           'Significa che si Sospende la Scrittura
                    ToMem(i) = 255
                Next
                NumToMem = 0
                Exit Sub
            End If
            If VEECTL And 8 Then        'Si vuole avviara la scrittura Parallela su EEPROM
                If (VEECTL And 13) = 13 Then  'Se E2PAR1=1(Bit 3)=1 e E2PAR2(Bit 2=1) e E2ENA(Bit 0)=1
                
                    Strt = Mem(drbr).Valore And 3   'Banco Selezionato Bit 0 e 1
                    If Strt = 1 Or Strt = 2 Then    'Deve essere 1 o 2
                        Strt = (Strt - 1) * 64      '0 o 64
                        
                        For i = 1 To NumToMem       'Scrive Riga su EEPROM
                            EEMem(ToMem(i) + Strt).Valore = Mem(ToMem(i)).Valore
                        Next
                        Mem(eectl).Valore = 1       'Resetta(Rimane E2ENA=1)
                        AggVar eectl
                        For i = 1 To 8              'Anche ToMem() e NumToMem
                            ToMem(i) = 255
                        Next
                        NumToMem = 0
                    Else
                        Riattiva 0
                        i = MsgBox("NON e' Selezionata L'EEPROM" + Chr(13) + "    La Scrittura e' impossibile", 48)
                    End If
                Else
                    Riattiva 0
                    i = MsgBox("Scrittura Parallela su EEPROM Impossibile" + Chr(13) + "E2PAR2 e E2ENA DEVONO Essere = 1", 48)
                End If
            End If
        End If
End Select
End Sub

Public Sub EvRegARTim()
'Descrizione PConf(42)(ARTIM)
'0=Auto Reload Mode
'1=Capture Mode
'2=Capture con reset di ARtcr e ARpsc
'3=Load on External Edge(PLL)

'EdgDet Modo di rilevamento di PinIn(PB6)
'0=Disabilitato
'1=Rising Edge
'3=Falling Edge

'ClkSur Selezione del Clock di ingresso (su ARTim)
'0=Fint
'1=Fint/3
'2=ARTimIn

Select Case LMem
    Case armc       'ARTimer Mode
        Valore = Mem(armc).Valore
        PConf(42) = Valore And 3    'Bit 0-1
        
        If Valore And 128 Then                  'Se TCLD=1 (Bit 7)
            ARPsc = 0                           'Resetta ARPsc
            Mem(arlr).Valore = Mem(arrc).Valore 'Carica ARTCR
            Mem(armc).Valore = Mem(armc).Valore And 127 'Resetta il Bit 7
            AggVar arlr
            AggVar armc
        End If
        
        ARTimAct = 0                    'Predispone Disattivato
        If Valore And 64 Then           'se TEN=1 bit 6
            If ClkSur = 2 And PConf(42) > 0 Then 'Errore
                Riattiva 0
                i = MsgBox("Errore Solo in Modo 0(AutoReload)e' possibile" + Chr(13) + "L'Ingresso da PB6 per il Timer1", 48)
            Else
                If ClkSur < 2 Then
                    ARTimAct = 1    'Attivato
                End If
            End If
        End If
        
        If Valore And 32 Then       'Se PWMOE=1
            If FlagARTimOut = 0 Then
                FlagARTimOut = 1     'Setta Flag
                ScriviDat -1, ArTimOut, ValPin(-1, ArTimOut, Conf), TimTot, "O" 'Scrive
            End If
        ElseIf FlagARTimOut Then
            FlagARTimOut = False
            Conf = PConf(ArTimOut)        'rientrando da situazione in cui ARTimIn era TimOut
            If Conf > 3 Then Tp$ = "O" Else Tp$ = "I"  'quindi Ripristino il Piedino
            ScriviDat -1, ArTimOut, ValPin(-1, ArTimOut, Conf), TimTot, Tp$  'con il valore di drb
        End If
        
    Case arsc0      'Timer1 Status 0
    
    Case arsc1      'Timer1 Status 1
        VARSC1 = Mem(arsc1).Valore
        ClkSur = VARSC1 And 3               'Bit 0-1 (CC0-CC1)
        If ClkSur < 2 Then                  'Se Clock Interno
            If Mem(armc).Valore And 64 Then 'Se TEN=1
                ARTimAct = 1    'Attivato Nel Caso Non lo fosse stato
            End If              'per esempio se prima era clock da PB6
        End If
        EdgDet = (VARSC1 And 12) \ 4        'Bit 2-3 (SL0-SL1)
        ARDivPSC = Q((VARSC1 And 224) \ 32) 'Bit 5-6-7 (PS0-PS2)
        ARPsc = 0
        If ClkSur = 1 Then
            ARDivPSC = ARDivPSC * 3
        End If
    Case arrc       'Timer1 AutoReload
    
    Case arcp       'Timer1 Compare
    
    Case arlr       'Timer1 Load

End Select
End Sub

Public Function FcmdARTim(Bit, Tmpo As Single)
'Tmpo=Tempo del Segnale
If ClkSur = 2 Then              'Se Clock da SPICLK
    Agito = 1                   'per settare agito in Fcmd
End If

If (Mem(armc).Valore And 64) And (PConf(ArTimIn) < 3) Then   'se TEN=1(bit 6) e Il Piedino e' Input
    Select Case PConf(42)
        Case 0                              'Autoreload Mode
            If ClkSur = 2 Then              'Se Clock da PB6
                Select Case EdgDet
                    Case 1                  'Rising Edge
                        If Bit = 1 Then     'Se Fronte di Salita
                            DecARPresc 1, Tmpo  'Decrementa il Prescaler
                        End If
                    
                    Case 3                  'Falling Edge
                        If Bit = 0 Then     'Se Fronte di Discesa
                            DecARPresc 1, Tmpo   'Decrementa il Prescaler
                        End If
                End Select
            End If
        
        Case 1, 2       'Capture Mode ; Capture con Reset
            'Se     EdgDet=1(Rising Edge) e Bit+1(Salita)
            'Oppure EdgDet=3(Falling Edge) e Bit+0(Discesa)
            If (EdgDet = 1 And Bit = 1) Or (EdgDet = 3 And Bit = 0) Then
                Mem(arrc).Valore = Mem(arlr).Valore 'Cattura
                AggVar arrc
                Mem(arsc0).Valore = Mem(arsc0).Valore Or 4  'scrive EF
                AggVar arsc0
                
                If Mem(ior).Valore And 16 Then      'Se GEN=1
                    If Mem(armc).Valore And 16 Then  'e EIE=1
                        Interrupt IntARTIM
                    End If
                End If
            End If
            If PConf(42) = 2 Then       'Capture con Reset
                Mem(arlr).Valore = 0    'Reset
                AggVar arlr
                ARPsc = 0
            End If
        Case 3                  'Load (PLL)
            'Se     EdgDet=1(Rising Edge) e Bit+1(Salita)
            'Oppure EdgDet=3(Falling Edge) e Bit+0(Discesa)
            If (EdgDet = 1 And Bit = 1) Or (EdgDet = 3 And Bit = 0) Then
                Mem(arlr).Valore = Mem(arrc).Valore 'Carica ARTCR
                AggVar arlr
            End If
    End Select

End If
FcmdARTim = Agito   'per settare Agito in Fcmd

End Function

Public Sub EvRegSPI()
Valore = Mem(LMem).Valore
Select Case LMem
    Case miscr      'Miscellaneos
        If Valore And 1 Then        'Se Bit 0=1
            If FlagSPIOut = 0 Then  'Setta Flag
                FlagSPIOut = 1
                ScriviDat -1, SPIOut, ValPin(-1, SPIOut, Conf), TimTot, "O" 'Scrive
            End If
        ElseIf FlagSPIOut Then
            FlagSPIOut = 0
            Conf = PConf(SPIOut)        'rientrando da situazione in cui era SPIOut
            If Conf > 3 Then Tp$ = "O" Else Tp$ = "I"  'quindi Ripristino il Piedino
            ScriviDat -1, SPIOut, ValPin(-1, SPIOut, Conf), TimTot, Tp$  'con il valore di drc
        End If
    
    Case spidsr     'SPI Data
        If (Mem(spimod).Valore And 32) = 0 Then 'Se CPHA=0
            If FlagSPIOut Then                  'e PC3 Uscita SPI
                Bit = Valore And 128            'Scrive Gia il Bit 7
                If Bit Then Bit = 1
                ScriviDat -1, SPIOut, Bit, TimTot, "O"
                PSPIOut = Bit
            End If
        End If
    Case spidiv     'SPI DIvide
        DivSPI = Q(Valore And 7)        'Bit 0-2
        If DivSPI = 128 Then DivSPI = 256
        
        NBitSPI = (Valore And 120) \ 8  'Bit 6-3
        If NBitSPI > 8 Then             'Max 8 Bit
            Riattiva 0
            i = MsgBox("Attenzione su SPIDIV sono stati impostati" + Str(NBitSPI) + " Bit  (Max 8)", 16)
        End If
    Case spimod     'SPIMode
        If (Valore And 12) = 12 Then    'Se Bit 3=1 e Bit 2=1 SPIN =1 e SPSTRT=1
            Riattiva 0
            i = MsgBox("Attenzione NON e' ammesso settare" + Chr(13) + "SPIN=1 e SPSTRT=1 nel Registro spimod", 16)
        End If
        SCKAct = 0  'Predispone
        If Valore And 16 Then           'Se SPCLK=1 -> Trasmissione
            If PConf(SPIClk) > 5 Then   'e  SPIClock= Out Pusch-Pull
                FlagSPIClk = 1          'Setta Il Flag
                If NumClk = 0 Then      'Se la trasmissione NON e' ancora in atto
                    Bit = Valore And 1      'Bit= CPOL
                    If PSPIClk <> Bit Then
                        ScriviDat -1, SPIClk, Bit, TimTot, "O" 'Predispone le Linea come CPOL
                        PSPIClk = Bit
                    End If
                End If
            Else
                Riattiva 0
                i = MsgBox("Attenzione la Porta PC4" + Chr(13) + "NON e' Impostata Out Push-Pull", 16)
            End If
                
            If Valore And 128 Then      'Se bit 7=1 SPRUN=1
                If NBitSPI = 0 Then     'Non e'Impostato il Numero di Bit
                    Riattiva 0
                    i = MsgBox("Attenzione su SPIDIV NON e' stato impostato il numero di Bit", 16)
                End If
                If (Valore And 4) = 0 Then  'Se Pin 2=0 SPSTRT=0
                    NumClk = 0          'Azzera perche' possa iniziare il conteggio
                    SCKAct = 1          'Attivato
                End If
            End If
            
        ElseIf FlagSPIClk Then
            FlagSPIClk = 0
            'rientrando da situazione in cui PC3 era SPIOut ripristino con il
            ScriviDat -1, SPIClk, ValPin(-1, SPIClk, 6), TimTot, "O"  'valore di drc
        End If
        
End Select
End Sub

Public Function EWriArsc0(Porta, Valore, NBit)
'Se NBit<> -1 (RES o SET)
'NBit =Bit Da scrivere
'Valore 0=Res 1=SET
'Porta= Porta su Cui Scrivere
'Se NBit=-1 (LDI LD)
'Valore =Valore Da scrivere sulla Porta

'Se il Bit da scrivere e' 1 NON Ha Influenza

OldVal = Mem(Porta).Valore  'Vecchio Valore
If NBit = -1 Then
    Valore = Valore And 7   'Solo Bit 0-2
    Iniz = 0: Fine = 2
Else
    If NBit > 2 Then Valore = 0 'Solo Bit 0-2
    Iniz = NBit: Fine = NBit
End If

For NumBit = Iniz To Fine
    If NBit = -1 Then
        Flag = Valore And Q(NumBit)   'Valore del Bit che si vuole scrivere 0=0 1=>0
        If Flag Then    'Se 1 Assume il Valore Attuale
            Flag = OldVal And Q(NumBit)
        End If
    Else
        Flag = Valore
        If Flag Then    'Se 1 Assume il Valore Attuale
            Flag = OldVal And Q(NumBit)
            If Flag Then Flag = 1
        End If
    End If
    NVal = NVal + Flag
            
Next
Valore = NVal
End Function

Public Sub TimSPI()
'Stessa frequenza del "Core"
IClock = Cicli
DecSPIDiv IClock

End Sub

Public Sub DecSPIDiv(IClock)
'Decrementa il Contatore del SPI di IClock unita'
For i = 1 To IClock * 2
    SPIPsc = SPIPsc + 1
    If SPIPsc = DivSPI Then
        SPIPsc = 0
        EseguiSPI i
        Exit For
    End If
Next
End Sub

Public Sub EseguiSPI(i)
'Modo =0 chiamata dal Clock  (Trasmissione)
'     =1 chiamata da FcmdSPI (Ricezione)
'i=Clok trascorsi da TimPrec
'Esegue le Operazioni Del SPI sui Piedini e Sul Clok
CPHA = Mem(spimod).Valore And 32
INSPI = Mem(spimod).Valore And 8: If INSPI Then INSPI = 1
ValDSR = Mem(spidsr).Valore
TimAtt = Int(TimPrec + (i - 1) * msC) 'Tempo Attuale

NumClk = NumClk + 1 'Incrementa gli Edge
If NumClk = 1 And CPHA Then     'Se CPHA=1
    If FlagSPIOut Then          'Se Uscita
        Bit = ValDSR And 128    'Scrive il Bit 7
        If Bit Then Bit = 1
        ScriviDat -1, SPIOut, Bit, TimAtt, "O"
        PSPIOut = Bit
    End If
Else
    Pari = NumClk Mod 2 'Se NumClK e'(2;4;6;8;10) Pari=0
    If CPHA = 0 Then    'Se CPHA=0
        Pari = 1 - Pari 'Inverte
    End If
    If Pari = 0 Then    'Se Pari=0 Esegue Lettura
        Bit = 0 'Predispone
        If INSPI Then   'Se SPIIn e' Collegata
            Conf = PConf(SPIIn)
            If Conf < 3 Then   'e Input
                Bit = ValPin(-1, SPIIn, Conf)
              Else
                Riattiva 0
                i = MsgBox("Attenzione la Porta PC2 collegata a SPI NON e' INPUT", 16)
            End If
        End If
        ValDSR = ValDSR And 127     'Cancella Bit 7
        ValDSR = ValDSR * 2         'Shift a SX
        ValDSR = ValDSR Or Bit      'Aggiunge Bit 0
        PSPIOut = ValDSR And 128    'Carico PSPIOUT
        If PSPIOut Then PSPIOut = 1
        Mem(spidsr).Valore = ValDSR
        AggVar spidsr
    Else                'Altrimenti Scrive Su PinOUT
        If FlagSPIOut Then  'Se SPI Out e' Collegato
            Bit = PSPIOut
            ScriviDat -1, SPIOut, Bit, TimAtt, "O"
        Else
            'Altrimenti sarebbe errore
            '
            '
            
        End If
    End If
End If
'Se Trasmissione scrive su PC4
If FlagSPIClk Then
    PSPIClk = 1 - PSPIClk
    Bit = PSPIClk
    ScriviDat -1, SPIClk, Bit, TimAtt, "O"
End If
If NumClk = NBitSPI * 2 Then    'Fine Trasmissione
    NumClk = 0      'Azzera
    Mem(spimod).Valore = Mem(spimod).Valore And 127 'Azzera SPRUN (Bit 7)
    AggVar spimod
    LMem = spimod
    EvRegSPI
    
    Mem(spidiv).Valore = Mem(spidiv).Valore Or 128  'Setta SPINT (Bit 7)
    AggVar spidiv

    If Mem(ior).Valore And 16 Then          'Se GEN=1
        If Mem(spimod).Valore And 64 Then   'e SPIE=1
            Interrupt IntSPI
        End If
    End If
End If
End Sub

Public Function FcmdSPI(Pin, Bit, Tmpo As Single)
CPHA = Mem(spimod).Valore And 32
CPOL = Mem(spimod).Valore And 1
SPCLK = Mem(spimod).Valore And 16
SPIINP = Mem(spimod).Valore And 8
SPIRUN = Mem(spimod).Valore And 128

Select Case Pin
    Case SPIIn              'SpiIn
        If SPIINP Then
            Agito = 1
        End If

        If Bit = 1 Then     'Se Fronte di Salita
            If SPCLK Then   'Trasmissione
                If (Mem(spimod).Valore And 132) = 132 Then  'e Bit 7=1  e Bit 2=1 SPRUN=1 SPSTRT=1
                    NumClk = 0                          'Azzera perche' possa iniziare il conteggio
                    SCKAct = 1                          'Attivato
                End If
            End If
        End If
    Case SPIClk             'Clock Input
        If SPCLK = 0 Then   'Se ClocK Input
            If PConf(SPIClk) < 3 Then   'e PC4= Input
                If SPIRUN Then
                    Agito = 1
                End If

                If (Mem(spimod).Valore And 140) = 136 Then  'Se Bit 7=1  Bit 3=1 e Bit 2=0 SPRUN=1 SPIN=1 SPSTRT=0
                    If NBitSPI = 0 Then                     'Non e'Impostato il Numero di Bit
                        Riattiva 0
                        i = MsgBox("Attenzione su SPIDIV NON e' stato impostato il numero di Bit", 16)
                    Else
                        i = Int((Tmpo - TimPrec) / msC)
                        If (Bit = 1 - CPOL) And NumClk = 0 Then 'Se Bit Giusto(1-CPOL) e Primo Edge
                            EseguiSPI i
                        ElseIf NumClk > 0 Then                  'Oppure Edge Seguenti
                            EseguiSPI i
                        End If
                    End If
                End If
            Else
                Riattiva 0
                i = MsgBox("Attenzione la Porta " + NomePin(SPIClk) + " NON e' Impostata Input" + Chr(13) + "NON puo' iniziare la ricezione", 16)
            End If
        
        End If
End Select
FcmdSPI = Agito     'per settare Agitu in Fcmd
End Function



Public Sub CreaPInCMD()
'Carica P()
ReDim P(NumCMD)
For i = 0 To NumCMD
    P(i) = i
Next

'Ordina Per Porta P()
For i = 0 To NumCMD - 1
   iMin = i
   For j = i + 1 To NumCMD - 1
      If CMDDat(P(j)).Pin < CMDDat(P(iMin)).Pin Then
         iMin = j
      End If
   Next
   ' Ha trovato un Numero minore di quello corrente;
   ' scambia i due elementi:
   If iMin > i Then
      Pin = CMDDat(P(iMin)).Pin
      For j = i + 1 To NumCMD - 1
        If CMDDat(P(j)).Pin = Pin Then 'Trovato
            comodo = P(j)   'Salva
            For Z = j To i + 1 Step -1  'Sposta in su
                P(Z) = P(Z - 1)
            Next
            P(i) = comodo 'Piazza
            i = i + 1
        End If
      Next
      i = i - 1
   End If
Next

'Trova gli Inizi
For i = 0 To 43 'Azzera
    InCMD(i).Start = 0
    InCMD(i).Point = 0
Next

j = CMDDat(P(0)).Pin
i = -1
Do
    i = i + 1
    Iniz = CMDDat(P(i)).Pin
    If (i = 0 And Iniz = j) Or (Iniz > j) Then 'Trovato Prossimo Pin
        InCMD(Iniz).Start = i 'Assegna il Pin
        
        Do              'Fino all'Ultimo Pin Numero Iniz
        i = i + 1
        If i > NumCMD - 1 Then
            Exit Do
        End If
        Loop While CMDDat(P(i)).Pin = Iniz
        i = i - 1
        For ii = Iniz + 1 To 43 'Piazza li tutti gli altri
            InCMD(ii).Start = i + 1
        Next
        j = Iniz
    End If
Loop While i < NumCMD - 1

End Sub

Public Sub FassLabel()
'Scrive la scritta sopra la finestra FASS
Select Case FAss.HScroll1.Value
    Case 0
        FAss.Label1.Caption = "Ind. Codice  Label    Mnemonico              "
        If FAss.HScroll1.Visible Then
            FAss.Label1.Caption = FAss.Label1.Caption + "Commento"
        End If
    Case 1
        FAss.Label1.Caption = "Codice  Label    Mnemonico                Commento"
    Case 2
        FAss.Label1.Caption = "Label    Mnemonico                Commento"
    Case 3
        FAss.Label1.Caption = "Mnemonico                Commento"
    Case 4
        FAss.Label1.Caption = "Mnemonico          Commento"
    Case Is > 4
        FAss.Label1.Caption = "   Commento"
   
End Select

End Sub

Public Function Path(Nome$) As String
For i = Len(Nome$) To 1 Step -1
    If Mid(Nome$, i, 1) = "\" Then Exit For
Next
Path = Left(Nome$, i)

End Function

Public Function NumPin(Nome$)
'Calcola il Numero della Porta Nome$
While Asc(Mid(Nome$, 1, 1)) < 32
    Nome$ = Right(Nome$, Len(Nome$) - 1)
Wend
Nome$ = Trim(Nome$)
Select Case UCase(Nome$)
    Case "TIM", "TIMER": Num = 40
    Case "NMI": Num = 41
    Case "RES", "RESET": Num = 42
    Case "TEST": Num = 43
    Case "OSCIN": Num = 44
    Case "OSCOUT": Num = 45
    Case "VDD": Num = 46
    Case "VSS": Num = 47
    Case Else           'Porte
        Num = 8 * (Asc(Mid(Nome$, 2, 1)) - 65) + Val(Mid(Nome$, 3, 1))
End Select
NumPin = Num
End Function

Public Function NPin(Porta, NumBit)
'Restituisce il Pin(0-39) partendo dalla
'Porta e numero del Bit(0-7)
Select Case Porta
    Case dra, drb, drc, drd
        Num = (Porta - &HC0) * 8 + NumBit
    Case ddra, ddrb, ddrc, ddrd
        Num = (Porta - &HC4) * 8 + NumBit
    Case ora, orb, orc, ord
        Num = (Porta - &HCC) * 8 + NumBit
    Case dre, ddre, ore
        Num = 32 + NumBit
End Select


NPin = Num
End Function

Public Function SiEEPROM()
'Restituisce    1 se esiste EEPROM
'               2 se esiste ExtraRAM
'               3 se esistono entrambe
'Controlla se Micro ha la EEPROM
Select Case Micro
    Case 6230, 6232, 6240, 6245, 6260, 6263, 6265, 6280
    SiEE = 1
End Select
'e Extra RAM
Select Case Micro
    Case 6218, 6228, 6230, 6232, 6240, 6242, 6245, 6260, 6265, 6280, 6285
    SiRAM = 2
End Select
SiEEPROM = SiEE + SiRAM
End Function

Public Function Port(Num)
'Restituisce la Porta partendo dal PIN(0-39)
If Num > 31 Then
    Port = &HFC
Else
    Port = Num \ 8 + &HC0
End If
End Function

Public Sub CaricaPin()
'Carica le definizioni dei micro(anche non supportati)
Open AppPat + "DefPin.def" For Input As #1
'Cerca il Micro da simulare
Do
    Line Input #1, NomePort$
    of = 1
    For i = 1 To Len(NomePort$)
        If (Mid(NomePort$, i, 1) = ",") Or (Mid(NomePort$, i, 1) = ":") Then
            NMic$ = Mid(NomePort$, of, i - of)
            If NMic$ = "ST" + Trim(Str(Micro)) Then
                trovato = 1
                Exit Do
            End If
            of = i + 2
        End If
    Next
   
Loop
If trovato Then
    'NomePort$ qui contiene la prima riga
    'puo' essere INT: PINS .ADC ARTIMIN TIM UARTIN SPIIN *
    Line Input #1, NomePort$
    Do
        Select Case Left(NomePort$, 1)
            Case "I"            'Interrupt
                Do
                    If Left(NomePort$, 4) = "INT:" Then        'Prima riga
                        NomePort$ = Right(NomePort$, Len(NomePort$) - 5)
                    ElseIf Asc(Left(NomePort$, 1)) <> 9 Then    'le successive iniziano con TAB chr(9)
                        Exit Do
                    End If
                    i0 = 1
                    Do
                        i = InStr(i0, NomePort$, ",")
                        If i Then
                            Porta$ = Mid(NomePort$, i0, i - i0)
                            
                            Dato = Val(Right(Porta$, 1))
                            Porta$ = Trim(Left(Porta$, Len(Porta$) - 2))
                            Select Case Porta$
                                Case "NMI": IntNMI = Dato
                                Case "PORTA": IntPA = Dato
                                Case "PORTB": IntPB = Dato
                                Case "PORTC": IntPC = Dato
                                Case "PORTD": IntPD = Dato
                                Case "PORTE": IntPE = Dato
                                Case "TIMER": IntTIM = Dato
                                Case "TIMER16": IntTim16 = Dato
                                Case "ARTIMER": IntARTIM = Dato
                                Case "ADC": IntADC = Dato
                                Case "SPI": IntSPI = Dato
                                Case "UART": IntUART = Dato
                                
                                
                            End Select
                            i0 = i + 1
                        Else
                            Exit Do
                        End If
                    Loop
                    Line Input #1, NomePort$
                Loop
            
            Case "P"            'Porte
                Do
                    If Left(NomePort$, 4) = "PINS" Then        'Prima riga
                        NomePort$ = Right(NomePort$, Len(NomePort$) - 5)
                    ElseIf Asc(Left(NomePort$, 1)) <> 9 Then    'le successive iniziano con TAB chr(9)
                        Exit Do
                    End If
                    i0 = 1
                    Do
                        i = InStr(i0, NomePort$, ",")
                        If i Then
                            Porta$ = Mid(NomePort$, i0, i - i0)
                            
                            Dato = Val(Right(Porta$, 2))
                            Porta$ = Left(Porta$, Len(Porta$) - 3)
                            PEnab(NumPin(Porta$)) = Dato
                            If Porta$ = "TIMER" Then
                                TimerIO = 40
                            End If
                            i0 = i + 1
                        Else
                            Exit Do
                        End If
                    Loop
                    Line Input #1, NomePort$
                Loop

            Case "."            '.ADC
                Do
                    If Left(NomePort$, 4) = ".ADC" Then        'Prima riga
                        NomePort$ = Right(NomePort$, Len(NomePort$) - 5)
                    ElseIf Asc(Left(NomePort$, 1)) <> 9 Then    'le successive iniziano con TAB chr(9)
                        Exit Do
                    End If
                    i0 = 1
                    Do
                        i = InStr(i0, NomePort$, ",")
                        If i Then
                            ADDat(NumPin(Mid(NomePort$, i0, i - i0))).Valore = 0
                            i0 = i + 1
                        Else
                            Exit Do
                        End If
                    Loop
                    Line Input #1, NomePort$            'Cerca le porte
                Loop

            Case "A"            'ARTIMIN
                ArTimIn = NumPin(Mid(NomePort$, 9, 3))
                ArTimOut = NumPin(Mid(NomePort$, 23, 3))
                Line Input #1, NomePort$
            Case "T"            'TIM
                TimerIO = NumPin(Mid(NomePort$, 5, 3))
                Line Input #1, NomePort$
            Case "U"            'UARTIN
                UartIn = NumPin(Mid(NomePort$, 8, 3))
                UartOut = NumPin(Mid(NomePort$, 20, 3))
                Line Input #1, NomePort$
            Case "S"            'SPIIN
                SPIIn = NumPin(Mid(NomePort$, 7, 3))
                SPIOut = NumPin(Mid(NomePort$, 19, 3))
                SPIClk = NumPin(Mid(NomePort$, 31, 3))
                Line Input #1, NomePort$
            
            Case "*"
                MaxPin = Val(Right(NomePort$, 2))
                Exit Do
        End Select
    Loop
End If
Close

'Inizializza i Registri per questo Micro
'Azzera tutti
'Registri che cambiano Valore in base al tipo di Micro
armc = -1: arsc0 = -1: arsc1 = -1: arrc = -1: arcp = -1: arlr = -1: drbr = -1
'Registri Per 6265
oscr = -1: miscr = -1: spidsr = -1: spidiv = -1: spimod = -1: eectl = -1
'Registri Per 6228
ipr = -1: uartdr = -1: uartcr = -1: prpr = -1: sdsr = -1: sidr = -1

Select Case Micro
    Case 6265, 6260
        armc = &HD5: arsc0 = &HD6: arsc1 = &HD7: arrc = &HD9: arcp = &HDA: arlr = &HDB: drbr = &HE8
        oscr = &HDC: miscr = &HDD: spidsr = &HE0: spidiv = &HE1: spimod = &HE2: eectl = &HEA
    Case 6218, 6228
        armc = &HE5: arsc0 = &HE6: arsc1 = &HE7: arrc = &HE9: arcp = &HEA: arlr = &HEB: drbr = &HCB
        ipr = &HDA: uartdr = &HD6: uartcr = &HD7: prpr = &HCA: sdsr = &HDD: sidr = &HDC
End Select

'carica i Dati REG
Select Case Micro
    Case 6218, 6228
        m$ = "6228"
    Case Is < 6260
        m$ = "622"
    Case Else
        m$ = "626"
End Select
Open AppPat + "ST" + m$ + ".rgs" For Input As #1
Do
    Line Input #1, Record$  'trova Primo Indirizzo (numero)
    If Record$ <> "" Then
        If Asc(Left(Record$, 1)) < 58 Then Exit Do
    End If
Loop

While Not EOF(1)
If Record$ <> "" Then
    N = Asc(Left(Record$, 1))
    If N <> 0 And N <> 32 And N <> 59 Then
        ReDim Preserve Regg(NumREG) As String
        Regg(NumREG) = Record$
        NumREG = NumREG + 1
    End If
End If
Line Input #1, Record$
Wend
Close


End Sub

Public Sub Inizio()
'Inizializza i dati general
Cdr$ = App.Path
If Right(Cdr$, 1) = "\" Then
    Cdr$ = Left(Cdr$, Len(Cdr$) - 1)
End If
HelpPath = Cdr$ + "\ST6Hlp.hlp" + Chr(0)

'Progetti recenti
Open AppPat + "recente.dat" For Input As #1
Input #1, NRec
If NRec Then        'Se ci sono recenti
    For i = 1 To NRec
        Input #1, Recente(i)
    Next
End If
Close
AggRec


OldIndex = 255  'Predispone
T1Inter = 150
'Carica Q()
For i = 0 To 7
    Q(i) = 2 ^ i
Next
'carica DumDat
DumDat.Pin = 255
DumDat.Tipo = "X"
DumDat.Valore = 0
DumDat.Tempo = -1
ReDim CMDDat(0) As CMD
ReDim DatOut(0) As CMD
CMDDat(0) = DumDat
DatOut(0) = DumDat


'Micro supportati
Open AppPat + "DefPin.def" For Input As #1

Do
    Line Input #1, NomePort$
    If Left(NomePort$, 2) = "ST" Then Exit Do       'Primo mome di Micro
    i0 = 1
    Do
        i = InStr(i0, NomePort$, ",")
        If i Then
            Porta$ = Mid(NomePort$, i0, i - i0)
            FPro.Combo1.AddItem "ST" + Trim(Porta$)
            i0 = i + 1
        Else
            Exit Do
        End If
    Loop
Loop
Close

End Sub


Public Sub EvRegOsc()
'oscr       'Oscillator Control
If Mem(oscr).Valore And 4 Then      'Bit 2=1(non Permesso)
    Bit2 = 1
End If
If (Mem(oscr).Valore And 8) = 0 Then    'Bit 3=0(Escluso Basso Consumo)
    Bit3 = 1
End If
If Bit2 Then
    Mem(oscr).Valore = Mem(oscr).Valore And 11  'Bit 7-5=0 Bit 2=0
    Tx$ = "                     Il Bit 2 deve essere 0                     "
    AggVar oscr
End If
If Bit3 Then
    Mem(oscr).Valore = Mem(oscr).Valore Or 8    'Bit 3=1
    Tx$ = Tx$ + Chr(13) + "Il Bit 3 deve essere 1 per ottenere basso consumo"
    AggVar oscr
End If
If Tx$ <> "" Then
    Dummy = MsgBox(Tx$ + Chr(13) + "               Per questa Volta ci penso Io")
End If

Divisore = (Mem(oscr).Valore And 3) + 1 'Bit 0 e 1
If Divisore > 2 Then Divisore = 4
MHz = MHzQ / Divisore
msC = 13 / MHz      'Microsec Ciclo
WdrDec = 3072 / MHz 'Microsec per decrementare WDR
MDIForm1.StatusBar1.Panels(3).Text = "MHz " + Str(MHz)

End Sub


Public Sub EventiLES()
'Cerca eventuali interrupt LES (level sensitive)
'ATTENZIONE PERO' Viene azionato l'interrupt legato alla prima linea
'trovata nelle condizioni previste

If (Mem(ior).Valore And 80) = 80 Then   'Se GEN=1 e LES=1
    If IntFlag = 0 Then                 'Se Non c'e nessun interrupt in atto
        For i = 0 To 39
            Conf = PConf(i)
            If Conf = 2 Then            'Se input interrupt
                VBit = ValPin(-1, i, Conf)
                PIntBit i, NInt, VBit   'Numero Interrupt ed eventuale inversione di VBit se
                                        'Registro di polarita'(se esiste)=1
                If (NInt = 1) And (VBit = 0) Then   'Se Interrupt n. 1 (LES) e VBit=0(tenendo conto
                                                    'di eventule inversione
                    Interrupt 1
                    Exit For
                End If
            End If
        Next
    End If
End If

End Sub

Public Sub PIntBit(Pin, NInt, VBit)
'Pin=Numero del Pin
'VBit Valore del Bit
'Restituisce
'NInt=Il Numero dell'Interrupt associato al Pin
'Se il registro di polarita'(se esiste)=1 -> VBit=1-VBit
If ipr Then     'Se esiste il Registro ipr ( polarita' interrupt)
    ValIpr = Mem(ipr).Valore
End If
Select Case Pin
    Case Is > 31        'PE
        NInt = IntPE
        If ValIpr And 16 Then   'Se bit di polarita interrupt settato
            VBit = 1 - VBit
        End If
    Case Is > 23        'PD
        NInt = IntPD
         If ValIpr And 8 Then   'Se bit di polarita interrupt settato
            VBit = 1 - VBit
        End If
    Case Is > 15        'PC
        NInt = IntPC
         If ValIpr And 4 Then   'Se bit di polarita interrupt settato
            VBit = 1 - VBit
        End If
    Case Is > 7         'PB
        NInt = IntPB
        If ValIpr And 1 Then   'Se bit di polarita interrupt settato
            VBit = 1 - VBit
        End If
     Case Else           'PA
        NInt = IntPB
        If ValIpr And 2 Then   'Se bit di polarita interrupt settato
            VBit = 1 - VBit
        End If
End Select
End Sub



Public Sub OptionB()
LMem = 256
Select Case Micro
    Case 6218, 6228 'questi Micro hanno 2 Option Bytes
        i = MsBx.MsBox("Scelta del Byte", -1, -1, "Basso|Alto|", "Option Byte")
        If i = 1 Then
            LMem = 257
        End If
End Select
EdData.Show 1
Select Case Micro
    Case 6260, 6265
        WDogHW = Mem(256).Valore And 8
    
    Case 6218, 6228
        WDogHW = Mem(256).Valore And 2
        TIMPull = Mem(256).Valore And 4
        NMIPull = Mem(256).Valore And 8
        PortPull = Mem(256).Valore And 32
        ADCSync = Mem(257).Valore And 16

    Case Else   '6200-6225
        WDogHW = 1      'Predisposto Hardware
        If Mem(256).Valore And 2 Then
            WDogHW = 0
        End If
        TIMPull = Mem(256).Valore And 4
        NMIPull = Mem(256).Valore And 8
End Select
If WDogHW Then
    WDogAct = 1  'Se wdogHardware attivo subito WDOG
Else
    If Mem(wdr).Valore And 1 = 0 Then
        WDogAct = 0
    End If
End If
End Sub

Public Sub EWAIT()
If LIstr = 30 Then              'Stop
        StopWaitAct = 2
        If WDogAct Then         'Se Wdog Attivo diventa Wait
            StopWaitAct = 1
        End If
Else                            'Wait
        StopWaitAct = 1
        If (Mem(ior).Valore And 16) = 0 Then
            Riattiva 0
            MsgBox "Attenzione Istruzione Wait Ma l'Interrupt NON è ATTIVO", 16
        End If
        
        If Mem(257).Valore And 16 Then  'Bit ADCSYNC settato in Option Byte MSB
            If (Mem(adcr).Valore And 48) = 48 Then        'STA(bit 5)=1 PDS(Bit 4)=1Conversione attivata
                If (Mem(adcr).Valore And 128) = 0 Then    'EAI(bit 7)=0 (NON con Interrupt)
                    Riattiva 0
                    i = MsgBox("Attenzione l'Istruzione Wait attiverà la conversione A/D" + Chr(13) + "Ma l'Interrupt NON è ATTIVO", 16)
                End If
                AdcAct = 1                          'Attivato
                Mem(adcr).Valore = Mem(adcr).Valore And 159   'EOC=0 STA=0(bit 5 e 6)
                AggVar adcr
            End If
        End If
End If

LMem = -1
Cicli = 2
Accelera = 1
End Sub

Public Sub EvRegSPI228()
Valore = Mem(LMem).Valore
Select Case LMem
    Case sidr           'REgistro di disabilitazione interrupt
        IntSPI28Act = 0 'disabilita interrupt
    
    Case sdsr           'SPI Data
        IntSPI28Act = 1 'Abilita interrupt
        SPI228Act = 1   'attiva SPI
        NumClk = 0      'e Inizializza contatore
        If FlagSPIOut Then                  'e PC3 Uscita SPI
            Bit = Valore And 128            'Scrive Gia il Bit 7
            If Bit Then Bit = 1
            ScriviDat -1, SPIOut, Bit, TimTot, "O"
            PSPIOut = Bit
        End If

End Select

End Sub

Public Sub EvRegUART()
UARTFR = 10         'uartfr=Numero di Bit da trasmettere/ricevere
If Mem(257).Valore And 8 Then
    UARTFR = 11
End If

Valore = Mem(LMem).Valore
Select Case LMem
    Case uartdr         'Registro Dati
        If DivUART = 0 Then DivUART = 6656  'Se non e' stato scritto uartcr

        Conf = PConf(UartOut)
        If Conf > 3 Then        'Se Pin Out
            If ValPin(-1, UartOut, Conf) = 0 Then
                Riattiva 0
                i = MsgBox("Il Pin TX dell'UART dovrebbe essere alto" + Chr(13) + "Affinchè la trasmissione possa essere regolare", 16)
            End If
            UARTPsc = 0         'Inizializza Contatore
            UARTAct = 1         'Attiva
            NumClkUA = 1        'Inizializza a 1 (il Bit Start parte gia adesso)
            Mem(uartcr).Valore = Mem(uartcr).Valore And 191 'Azzere TXMT bit 6
            AggVar uartcr
            'Scrive subito il Bit Start
            ScriviDat -1, UartOut, 0, TimPrec, "O"
            PUARTOut = 0

        End If

    Case uartcr                 'Registro controllo UART
    nn = (Valore And 14) \ 2    'Bit 1-3 portati su bit 0-2
    Select Case nn
        Case 0: DivUART = 6656
        Case 1: DivUART = 3328
        Case 2: DivUART = 1664
        Case 3: DivUART = 832
        Case 4: DivUART = 416
        Case 5: DivUART = 256
        Case 6: DivUART = 208
        Case 7: DivUART = 104
    End Select
    If (Valore And 80) = 80 Then        'se TXIEN=1 e TXMT=1 bit 4 e 6
        If Mem(ior).Valore And 16 Then  'e interrupt abilitati
            Interrupt IntUART           'Si genera interrupt
        End If
    End If
    ParityEn = 0                    'Predispone
    If (UARTFR = 10) And (Valore And 1) Then 'Se 10 bit e PTYEN (bit 0)
        ParityEn = 1                'Parita' abilitata
    End If
End Select
End Sub

Public Sub TimUART()
'Cicli * 13 =Perche' ogni ciclo richiede 13 Impulsi di Click
IClock = Cicli * 13
DecUARTDiv IClock
End Sub

Public Sub DecUARTDiv(IClock)
'Decrementa il Contatore UART di IClock unita'
For i = 1 To IClock
    UARTPsc = UARTPsc + 1
    If UARTPsc = DivUART Then
        UARTPsc = IClock - i
        EseguiUART i
        Exit For
    End If
Next

End Sub

Public Sub EseguiUART(i)
'i=Clok trascorsi da TimPrec
'UARTAct  1=Trasmissione
'         2=Ricezione
Static ParityBit                'Bit di Parita'
Static DatoIn                   'Dato in ricezione

UARTFR = 10                     'uartfr=Numero di Bit da trasmettere/ricevere
If Mem(257).Valore And 8 Then
    UARTFR = 11
End If

TimAtt = Int(TimPrec + (i - 1) / 13 * msC) 'Tempo Attuale
ValDSR = Mem(uartdr).Valore     'Dato
VUARTCR = Mem(uartcr).Valore    'Configurazione

If NumClkUA = 1 Then            'Se il Dato e' ancora intero
DatoIn = 0                      'Inizializza
If UARTAct = 1 Then             'Se trasmissione
    If ParityEn Then            'Se Parita' abilitata
        nn = 0                  'calcola il Bit di Parita'
        For i = 0 To 6          'conta gli 1
            If ValDSR And Q(i) Then
                nn = nn + 1
            End If
        Next
        ParityBit = 0                   'Predispone
        If nn Mod 2 Then ParityBit = 1  'Parita'=0
    End If
End If
End If


NumClkUA = NumClkUA + 1             'Incrementa gli Edge

If UARTAct = 1 Then                 'Uscita
    If NumClkUA = 1 Then            'Bit Start
        Bit = 0
        'Non Puo' essere perche e' gia partito da EvRegUart
    ElseIf NumClkUA = UARTFR Then   'Bit Stop
        Bit = 1
    ElseIf NumClkUA < UARTFR Then   'Dato
        If (NumClkUA = 9) And (ParityEn = 1) Then  'Scrive il Bit di Parita'
            Bit = ParityBit
        ElseIf (NumClkUA = 10) And (UARTFR = 11) Then   'Scrive il nono bit(bit 0 di uartcr)
            Bit = VUARTCR And 1
        Else                                'Scrive il Bit 0
            Bit = ValDSR And 1
            If Bit Then Bit = 1
            Mem(uartdr).Valore = ValDSR \ 2 'Scorre a DX
            AggVar uartdr
        End If
    Else                                    'Fine trasmissione
        UARTAct = 0
        Mem(uartcr).Valore = VUARTCR Or 64  'setta bit 6 TXMT
        AggVar uartcr
        Conf = PConf(UartOut)
        Bit = ValPin(-1, UartOut, Conf)     'Rimette il Pin come era Prima
        If VUARTCR And 16 Then              'Se Bit 4 TXIEN
            If Mem(ior).Valore And 16 Then  'e GEN=1
                Interrupt IntUART           'Interrupt
            End If
        End If
    End If
    ScriviDat -1, UartOut, Bit, TimAtt, "O"
    PUARTOut = Bit

Else                        'Ingresso
    Conf = PConf(UartIn)
    If Conf < 3 Then        'se Input
        Bit = ValPin(-1, UartIn, Conf)
      Else
        Riattiva 0
        i = MsgBox("Attenzione la Porta " + NomePin(UartIn) + " NON e' INPUT", 16)
    End If
    If (NumClkUA = 9) And (ParityEn = 1) Then   'E' bit di Parita'
        DatoIn = DatoIn \ 2                     'Mette i 7 bit al posto giusto
        nn = 0                                  'calcola il Bit di Parita'
        For i = 0 To 6                          'conta gli 1
            If DatoIn And Q(i) Then
                nn = nn + 1
            End If
        Next
        ParityBit = 0                   'Predispone
        If nn Mod 2 Then ParityBit = 1  'Parita'=0
    
        If Bit <> ParityBit Then                    'Se NON combaciano
            Mem(uartcr).Valore = VUARTCR Or 1       'ERRORE->setta PTYEN(bit 0)
        Else
            Mem(uartcr).Valore = VUARTCR And 254    'Esatto ->Resetta PTYEN
        End If
        AggVar uartcr
        
    ElseIf (NumClkUA = 10) And (UARTFR = 11) Then   'E' il nono bit(bit 0 di uartcr)
        If Bit Then
            Mem(uartcr).Valore = VUARTCR Or 1       'setta PTYEN(bit 0)
        Else
            Mem(uartcr).Valore = VUARTCR And 254    'Resetta PTYEN
        End If
        AggVar uartcr
    
    ElseIf NumClkUA < UARTFR Then                   'Dato
        DatoIn = DatoIn \ 2                         'Scorre DatoIn a DX
        If Bit Then                                 'Scrive il Bit 7
            DatoIn = DatoIn Or 128
        End If
    
    Else                                            'Fine Ricezione
        UARTAct = 0
        Mem(uartcr).Valore = VUARTCR Or 128         'setta bit 7 RXRDY
        AggVar uartcr
        Mem(uartdr).Valore = DatoIn         'Scrive il dato su uartdr
        AggVar uartdr
        If VUARTCR And 32 Then              'Se Bit 5 RXIEN
            If Mem(ior).Valore And 16 Then  'e GEN=1
                Interrupt IntUART           'Interrupt
            End If
        End If
    
    End If
    
End If


End Sub



Public Function EseguiSPI6228(VBit)
Conf = PConf(SPIIn)
If (Conf > 3) And (FlagSPIOut = 0) Then 'Se Non Ho collegato Ne ingresso Ne Uscita
    Exit Function                       'Esce
End If
ValDSR = Mem(sdsr).Valore
If SPI228Act Then   'Se SPI Attiva
    If VBit = 0 Then    'e Falling edge
        NumClk = NumClk + 1
        If Conf < 3 Then   'e Input
            Bit = ValPin(-1, SPIIn, Conf)
        Else
            'Riattiva 0
            'i = MsgBox("Attenzione la Porta PD3 collegata a SPI NON e' INPUT", 16)
        End If
        
        ValDSR = ValDSR And 127     'Cancella Bit 7
        ValDSR = ValDSR * 2         'Shift a SX
        ValDSR = ValDSR Or Bit      'Aggiunge Bit 0
        PSPIOut = ValDSR And 128    'Carico PSPIOUT
        If PSPIOut Then PSPIOut = 1
        Mem(sdsr).Valore = ValDSR
        AggVar sdsr
    
    Else                'Rising(fronte di salita )
        If FlagSPIOut Then      'Se pin Out Open Drain
            Bit = PSPIOut       'Scrive il Bit 7
            ScriviDat -1, SPIOut, Bit, TimAtt, "O"
            PSPIOut = Bit
        End If
    End If
    
    If NumClk = 8 Then                  'Fine Trasmissione
        If Mem(ior).Valore And 16 Then  'Se GEN=1
            If IntSPI28Act Then         'Interrupt abilitato
                Interrupt IntSPI
            End If
        End If
        NumClk = 0          'Azzera
        SPI228Act = 0
        IntSPI28Act = 0
    End If



End If
End Function



Public Sub AggAss(Riga)
'VIsualiza la riga con l'istruzione nella Finestra Assembler
Trow = FAss.List1.TopRow
If Riga < Trow Then       'E' sopra
    FAss.List1.TopRow = Riga
Else
    If Riga > Trow + NAss Then    'se è olte il fondo
        FAss.List1.TopRow = Riga - NAss / 2     'mette il cursore a metà
    End If
End If
End Sub


Public Sub Freccia(Dove, Cosa)
'Mette o Toglie >
'Dove = Indirizzo
'Cosa 0 = Toglie Freccia
'     1 = Mette Feccia
FAss.List1.Col = 0
FAss.List1.Row = Dove

If Cosa Then
    Set FAss.List1.CellPicture = LoadPicture(AppPat + "Freccia.bmP")
Else
    Set FAss.List1.CellPicture = LoadPicture("")
End If
FAss.List1.Col = 1
End Sub


Public Sub AggRec()
'Aggiorna File
Open AppPat + "recente.dat" For Output As #1    'Aggiorna
Print #1, NRec
For i = 1 To NRec
    Print #1, Recente(i)
Next
Close


'Aggiorna  Recenti sul menu file

For i = 13 To 17    'Prima cancella tutto
    MDIForm1.FileItem(i).Visible = False
Next
If NRec Then        'Visualizza se ci sono
    MDIForm1.FileItem(13).Visible = True
    For i = 1 To NRec
        Tx$ = Recente(i)
        If Len(Tx$) > 30 Then
            Tx$ = ".." + Right(Tx$, 28)
        End If
        MDIForm1.FileItem(i + 13).Caption = Trim(Str(i)) + " " + Tx$
        MDIForm1.FileItem(i + 13).Visible = True
    Next
End If

End Sub

Public Sub Chiudi()
'Chiude il progetto

'finestre
FVar.Hide
FReg.Hide
FMem.Hide
FAss.Hide

'toolbar
For i = 3 To 18     'disabilita Toolbar
    MDIForm1.Toolbar1.Buttons(i).Enabled = False
Next

'menu
MDIForm1.Finestre.Enabled = False
MDIForm1.DebI.Enabled = False
MDIForm1.Run.Enabled = False
MDIForm1.Porte.Enabled = False
MDIForm1.Variabili.Enabled = False

'status bar
For i = 1 To 6
    MDIForm1.StatusBar1.Panels(i).Text = ""
Next

'menu file
For i = 4 To 12
    If MDIForm1.FileItem(i).Caption <> "-" Then
        MDIForm1.FileItem(i).Enabled = False
    End If
Next

End Sub
