; IL2PCC v8.9 - 00..99, two multiplexed seven-segment digits
; Input: DI4 OR simulated BoolVar Start; both may start the counter.
; Output mapping follows pondeli.pcc (DO9 is digit select).
; THREAD Tick: pulse duration is in Tick cycles; adjust timing for 1 second.
THREAD Tick

SHEET Main {
    CALL 8xDI DI
    CALL BoolVar Start TOGGLE 0 1
    CALL OR StartOr
    CALL PulseGen CountClock
    CALL Counter OnesCount
    CALL Counter TensCount
    CALL Comparator OnesOverflow
    CALL Comparator TensOverflow
    CALL ISwitch OnesTable
    CALL ISwitch TensTable
    CALL PulseGen ScanClock
    CALL ISwitch DigitMux
    CALL Int2Bits SegBits
    CALL 8xDO Display
    CALL Value CountMonitor
    CALL Int2Bits OnesBits
    CALL Int2Bits TensBits
    CALL Segment OnesVirtual
    CALL Segment TensVirtual

    ; Input enable: physical DI4 or simulated Start.
    Start.Y StartOr.X0
    DI.DI4 StartOr.X1
    StartOr.Y CountClock.Act

    ; Repeated pulses while StartOr is ON. Set TOn + TOff to the number of Tick cycles per second.
    ; Example below assumes Tick = 10 ms (100 cycles per second).
    SET CountClock.TOn 1
    SET CountClock.TOff 10

    ; Two BCD decade counters. Overflow after 9 resets each decade.
    ; Ones overflow drives the tens counter trigger.
    CountClock.Out OnesCount.Tr
    SET OnesCount.St 1
    SET TensCount.St 1
    OnesCount.Y OnesOverflow.A
    SET OnesOverflow.B 9
    OnesOverflow.AGtB OnesCount.Rst
    OnesOverflow.AGtB TensCount.Tr
    TensCount.Y TensOverflow.A
    SET TensOverflow.B 9
    TensOverflow.AGtB TensCount.Rst
    OnesCount.Y OnesTable.IN1
    TensCount.Y TensTable.IN1
    OnesCount.Y CountMonitor.X

    ; Standard active-high seven-segment codes: bit0=a ... bit6=g.
    ; Verify electrical polarity and actual segment wiring on your board.
    SET OnesTable.INPUT_COUNT 10
    SET TensTable.INPUT_COUNT 10
    SET OnesTable.IN2 63
    SET OnesTable.IN3 6
    SET OnesTable.IN4 91
    SET OnesTable.IN5 79
    SET OnesTable.IN6 102
    SET OnesTable.IN7 109
    SET OnesTable.IN8 125
    SET OnesTable.IN9 7
    SET OnesTable.IN10 127
    SET OnesTable.IN11 111
    SET TensTable.IN2 63
    SET TensTable.IN3 6
    SET TensTable.IN4 91
    SET TensTable.IN5 79
    SET TensTable.IN6 102
    SET TensTable.IN7 109
    SET TensTable.IN8 125
    SET TensTable.IN9 7
    SET TensTable.IN10 127
    SET TensTable.IN11 111

    ; Virtual 7-segment displays for simulation (independent of multiplex).
    OnesTable.Y OnesBits.X
    TensTable.Y TensBits.X
    OnesBits.OUT0 OnesVirtual.IN1
    OnesBits.OUT1 OnesVirtual.IN2
    OnesBits.OUT2 OnesVirtual.IN3
    OnesBits.OUT3 OnesVirtual.IN4
    OnesBits.OUT4 OnesVirtual.IN5
    OnesBits.OUT5 OnesVirtual.IN6
    OnesBits.OUT6 OnesVirtual.IN7
    TensBits.OUT0 TensVirtual.IN1
    TensBits.OUT1 TensVirtual.IN2
    TensBits.OUT2 TensVirtual.IN3
    TensBits.OUT3 TensVirtual.IN4
    TensBits.OUT4 TensVirtual.IN5
    TensBits.OUT5 TensVirtual.IN6
    TensBits.OUT6 TensVirtual.IN7

    ; Physical multiplex runs in Tick context.
    ; Retained for compatibility; virtual segments are the intended display.
    SET ScanClock.Act 1
    SET ScanClock.TOn 1
    SET ScanClock.TOff 1
    SET DigitMux.INPUT_COUNT 2
    ScanClock.Out DigitMux.IN1
    OnesTable.Y DigitMux.IN2
    TensTable.Y DigitMux.IN3
    DigitMux.Y SegBits.IN0

    ; The actual 8xDO wiring is copied from pondeli.pcc:
    ; 7 segment bits and DO9 digit select.
    SET Display.ALL_PINS 1
    SET Display.IN0 1
    SegBits.OUT3 Display.IN3
    SegBits.OUT4 Display.IN4
    SegBits.OUT5 Display.IN8
    SegBits.OUT6 Display.IN9
    ScanClock.Out Display.IN10
    SegBits.OUT0 Display.IN12
    SegBits.OUT1 Display.IN13
    SegBits.OUT2 Display.IN14
}