uCsim, Copyright (C)  Daniel Drotos.
uCsim comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
#dump 0x5000 0x501d

# Ports are set to input on reset so if we zero the pins then set
# the ODR both pins and IDR should remain zero.
set mem pa_pins 0x00
0x0      pa_pin:                   
         pa_pins:                   0b00000000 0x00 '.'   0
set mem PA_ODR 0xff
0x05000      PA_ODR:                    0b11111111 0xff '.' 255 ( -1)
dump pa_pins PA_IDR
0x0      pa_pin:                   
         pa_pins:                   0b00000000 0x00 '.'   0
0x05001      PA_IDR:                    0b00000000 0x00 '.'   0

# Now set all the pins then set every other bit of the data direction register.
set mem pa_pins 0xff
0x0      pa_pin:                   
         pa_pins:                   0b11111111 0xff '.' 255 ( -1)
set mem PA_DDR 0b10101010
0x05002      PA_DDR:                    0b10101010 0xaa '.' 170 (-86)

# For the pins set to output the pins and IDR bits shadow the ODR data...
dump pa_pins PA_IDR
0x0      pa_pin:                   
         pa_pins:                   0b11111111 0xff '.' 255 ( -1)
0x05001      PA_IDR:                    0b11111111 0xff '.' 255 ( -1)
set mem pa_pins 0x00
0x0      pa_pin:                   
         pa_pins:                   0b10101010 0xaa '.' 170 (-86)
dump pa_pins PA_IDR
0x0      pa_pin:                   
         pa_pins:                   0b10101010 0xaa '.' 170 (-86)
0x05001      PA_IDR:                    0b10101010 0xaa '.' 170 (-86)

# ...and cannot be changed via the IDR...
set mem PA_IDR 0x00
0x05001      PA_IDR:                    0b10101010 0xaa '.' 170 (-86)

# ...but can be via the ODR.
set mem PA_ODR 0x00
0x05000      PA_ODR:                    0b00000000 0x00 '.'   0
dump pa_pins
0x0      pa_pin:                   
         pa_pins:                   0b00000000 0x00 '.'   0

# Reset back to defaults. Note that only the pa_pins output are affected.
reset
dump pa_pins PA_ODR PA_IDR PA_DDR PA_CR1 PA_CR2
0x0      pa_pin:                   
         pa_pins:                   0b00000000 0x00 '.'   0
0x05000      PA_ODR:                    0b00000000 0x00 '.'   0
0x05001      PA_IDR:                    0b00000000 0x00 '.'   0
0x05002      PA_DDR:                    0b00000000 0x00 '.'   0
0x05003      PA_CR1:                    0b00000000 0x00 '.'   0
0x05004      PA_CR2:                    0b00000000 0x00 '.'   0


# Adjust the clock to a suitable speed
set mem CLK_CKDIVR 0b00000001
0x050c6 CLK_CKDIVR:           0b00000001 0x01 '.'   1
        CLK_CKDIVR_HSIDIV:    0b---00--- 0x00 '.'   0
        CLK_CKDIVR_CPUDIV:    0b-----001 0x01 '.'   1

# Our test VCD provides input on pc_pins.2 and pc_pins.5
# (these should already be inputs after reset, of course)
set mem pc_pins.2 0
0x2.2                               0b-----0-- 0x00 '.'   0
set mem pc_pins.5 0
0x2.5                               0b--0----- 0x00 '.'   0

# For which we'll take interrupts on either edge initially
set mem EXTI_CR1[5:4] 0b11
0x050a0[5:4]                            0b--11---- 0x03 '.'   3
set mem PC_CR2.2 1
0x0500e.2                               0b-----1-- 0x01 '.'   1
set mem PC_CR2.5 1
0x0500e.5                               0b--1----- 0x01 '.'   1

# So this is our state now
dump pc_pins PC_ODR PC_IDR PC_DDR PC_CR1 PC_CR2 EXTI_CR1 EXTI_CR2 rom[0x50a3][7:0]
0x2      pc_pin:                   
         pc_pins:                   0b00011001 0x19 '.'  25
0x0500a      PC_ODR:                    0b00000000 0x00 '.'   0
0x0500b      PC_IDR:                    0b00011001 0x19 '.'  25
0x0500c      PC_DDR:                    0b00000000 0x00 '.'   0
0x0500d      PC_CR1:                    0b00000000 0x00 '.'   0
0x0500e      PC_CR2:                    0b00100100 0x24 '$'  36
0x050a0      EXTI_CR1:                  0b00110000 0x30 '0'  48
0x050a1      EXTI_CR2:                  0b00000000 0x00 '.'   0
0x050a3                                 0b00000000 0x00 '.'   0

# Start the vcd (we set the input file via the Makefile) and
# have it stop execution each time an event occurs.
set hw vcd[0] start
set hw vcd[0] break
Break on events enabled

# The VCD data starts at time 0 which will, by default, align
# with the current simulator time. We can adjust that by setting
# starttime. This can be done before or after starting the vcd,
# even part way through. Here we push the vcd 50 µs into the
# future.
set hw vcd[0] starttime 50000 ns

# Set up a vcd to monitor what happens
set hw vcd new 1
set hw vcd[1] output "out/test.vcd"
set hw vcd[1] add PC_IDR.5
set hw vcd[1] add PC_IDR.2
set hw vcd[1] add 0x0000
set hw vcd[1] add rom[0x50a3].2
set hw vcd[1] add EXTI_CR1[5:4]
set hw vcd[1] start

# Firstly either edge
run
Simulation started, PC=0x008000

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x008021: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500

0x08021    <.EXTI2>:
0x08021    72 5c 00 00    inc    0x0000[0K
F 0x008021
cont
Simulation started, PC=0x008021

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c

# Then on the rising edge
set mem EXTI_CR1[5:4] 0b01
0x050a0[5:4]                            0b--01---- 0x01 '.'   1
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00802c: (104) Breakpoint
V-IHINZC  Flags= 0x22  34 "  A= 0x00   0 .
0-100010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17ff [SP+1]= 00   0 .  Limit= 0x1500

0x0802c    <.loop$0>:
0x0802c    cc 80 2c       jp     0x802c <.loop$0>[0K
F 0x00802c
cont
Simulation started, PC=0x00802c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x008021: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500

0x08021    <.EXTI2>:
0x08021    72 5c 00 00    inc    0x0000[0K
F 0x008021

# Then on the falling edge
set mem EXTI_CR1[5:4] 0b10
0x050a0[5:4]                            0b--10---- 0x02 '.'   2
cont
Simulation started, PC=0x008021

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00802c: (104) Breakpoint
V-IHINZC  Flags= 0x22  34 "  A= 0x00   0 .
0-100010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17ff [SP+1]= 00   0 .  Limit= 0x1500

0x0802c    <.loop$0>:
0x0802c    cc 80 2c       jp     0x802c <.loop$0>[0K
F 0x00802c
cont
Simulation started, PC=0x00802c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00802c: (104) Breakpoint
V-IHINZC  Flags= 0x22  34 "  A= 0x00   0 .
0-100010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17ff [SP+1]= 00   0 .  Limit= 0x1500

0x0802c    <.loop$0>:
0x0802c    cc 80 2c       jp     0x802c <.loop$0>[0K
F 0x00802c
cont
Simulation started, PC=0x00802c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c

# The rest as level (0) triggered
set mem EXTI_CR1[5:4] 0b00
0x050a0[5:4]                            0b--00---- 0x00 '.'   0
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x008021: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500

0x08021    <.EXTI2>:
0x08021    72 5c 00 00    inc    0x0000[0K
F 0x008021
cont
Simulation started, PC=0x008021

Stop at 0x008025: (104) Breakpoint
V-IHINZC  Flags= 0x28  40 (  A= 0x00   0 .
0-101000  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x08025    80             iret[0K
F 0x008025
cont
Simulation started, PC=0x008025

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x008021: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500

0x08021    <.EXTI2>:
0x08021    72 5c 00 00    inc    0x0000[0K
F 0x008021
cont
Simulation started, PC=0x008021

Stop at 0x008021: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500

0x08021    <.EXTI2>:
0x08021    72 5c 00 00    inc    0x0000[0K
F 0x008021
cont
Simulation started, PC=0x008021

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x00801c: (104) Breakpoint
V-IHINZC  Flags= 0x2a  42 *  A= 0x00   0 .
0-101010  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x0801c    82 00 80 21    int    #0x008021 <.EXTI2>[0K
F 0x00801c
cont
Simulation started, PC=0x00801c

Stop at 0x008025: (104) Breakpoint
V-IHINZC  Flags= 0x28  40 (  A= 0x00   0 .
0-101000  X= 0x0000   0 .    Y= 0x0000   0 .
SP= 0x17f6 [SP+1]= 22  34 "  Limit= 0x1500
0x08025    80             iret[0K
F 0x008025
