diff --git a/pcf857x/example_test.go b/pcf857x/example_test.go new file mode 100644 index 0000000..5685f59 --- /dev/null +++ b/pcf857x/example_test.go @@ -0,0 +1,48 @@ +// Copyright 2025 The Periph Authors. All rights reserved. +// Use of this source code is governed under the Apache License, Version 2.0 +// that can be found in the LICENSE file. + +package pcf857x_test + +import ( + "fmt" + "log" + + "periph.io/x/conn/v3/gpio" + "periph.io/x/conn/v3/i2c/i2creg" + "periph.io/x/devices/v3/pcf857x" + "periph.io/x/host/v3" +) + +func Example() { + // Make sure periph is initialized. + if _, err := host.Init(); err != nil { + log.Fatal(err) + } + + // Open default I²C bus. + bus, err := i2creg.Open("") + if err != nil { + log.Fatalf("failed to open I²C: %v", err) + } + defer bus.Close() + + // Create a new I2C IO extender + extender, err := pcf857x.New(bus, pcf857x.DefaultAddress, pcf857x.PCF8574) + if err != nil { + log.Fatalln(err) + } + + for _, pin := range extender.Pins { + err = pin.In(gpio.Float, gpio.NoEdge) + if err != nil { + log.Fatalln(err) + } + level := pin.Read() + fmt.Printf("%s\t%s\n", pin.Name(), level.String()) + } + + if err != nil { + log.Fatalln(err) + } +} diff --git a/pcf857x/pcf857x.go b/pcf857x/pcf857x.go new file mode 100644 index 0000000..1f43b9b --- /dev/null +++ b/pcf857x/pcf857x.go @@ -0,0 +1,320 @@ +// Copyright 2025 The Periph Authors. All rights reserved. +// Use of this source code is governed under the Apache License, Version 2.0 +// that can be found in the LICENSE file. + +// This package provides a driver for the TI/NXP PCF857X I2C I/O Expander. These +// devices provide 8 pins (PCF8574) or 16 pins (PCF8575) of +// "quasi-bidirectional" input/output. This device is commonly used in LCD +// backpacks, particularly those sold as LCD2004, LCD1602. +// +// The PCF8575 is a 16-pin device that is functionally identical to the PCF8574. +// When communicating with the PCF8575 reads and writes are 2 bytes wide, while +// they're one byte wide with the PCF85754 +// +// # Datasheet +// +// https://www.ti.com/lit/ds/symlink/pcf8574.pdf +// +// A good description of the I2C LCD backpack usage can be found here: +// +// https://www.handsontec.com/dataspecs/I2C_2004_LCD.pdf +// +// Adafruit also sells a breakout board with these chips. See here: +// +// https://www.adafruit.com/product/5611 +// +// # Notes +// +// This device is very simple and doesn't have functionality that similar +// devices do. Specifically, GPIO Read() consists of writing a High out a pin, +// and then reading it to see if it is still high, or if it has transitioned to +// low. +// +// Setting a pin to Low activates an Open Drain to ground. +// +// You cannot detect edge change on a specific pin. There is an interrupt pin +// that can be used to detect a change on the GPIO pins, but it doesn't tell you +// which pin changed. +// +// This chip doesn't implement normal i2c register architectures. You write 8 or +// 16 bits out, and that sets the corresponding pins, or you read 8/16 bits and +// get the state of the pins. +package pcf857x + +import ( + "errors" + "fmt" + "sync" + "time" + + "periph.io/x/conn/v3/gpio" + "periph.io/x/conn/v3/gpio/gpioreg" + "periph.io/x/conn/v3/i2c" + "periph.io/x/conn/v3/pin" +) + +// Variant represents the actual chip model. +type Variant string + +const ( + PCF8574 Variant = "PCF8574" + PCF8575 Variant = "PCF8575" + + DefaultAddress uint16 = 0x20 +) + +var ( + ErrNotImplmented error = errors.New("pcf857x: not implemented") +) + +// Dev is representation of a PCF857x device. +type Dev struct { + // The pins exposed by the device. For PCF8574, this will be 8 pins, and + // 16 pins for the PCF8575 + Pins []gpio.PinIO + mask gpio.GPIOValue + width int + chipType Variant + + mu sync.Mutex + d *i2c.Dev + value gpio.GPIOValue + groups []Group +} + +type Group struct { + pins []pcfPin + dev *Dev +} + +// New creates a new PCF857x io expander and returns it. chip should be one of +// the Variant constants above. +func New(bus i2c.Bus, address uint16, chip Variant) (*Dev, error) { + dev := &Dev{d: &i2c.Dev{Bus: bus, Addr: address}, + chipType: chip} + if chip == PCF8574 { + dev.width = 8 + } else { + dev.width = 16 + } + dev.mask = gpio.GPIOValue((1 << dev.width) - 1) + dev.Pins = make([]gpio.PinIO, dev.width) + sDev := dev.String() + for ix := range dev.width { + name := fmt.Sprintf("%s_GPIO%d", sDev, ix) + dev.Pins[ix] = &pcfPin{dev: dev, number: ix, name: name} + _ = gpioreg.Register(dev.Pins[ix]) + } + return dev, nil +} + +// Group returns a GPIO Group comprised of the specified pin numbers. A +// gpio.Group allows you to perform writes to multiple pins in one operation. +func (dev *Dev) Group(pinNumbers ...int) (gpio.Group, error) { + dev.mu.Lock() + defer dev.mu.Unlock() + gr := Group{dev: dev, pins: make([]pcfPin, len(pinNumbers))} + for ix, pinNumber := range pinNumbers { + if p, ok := dev.Pins[pinNumber].(*pcfPin); ok { + gr.pins[ix] = *p + } + } + dev.groups = append(dev.groups, gr) + return &gr, nil +} + +// Halt shuts down the device, and frees any pin groups. +func (dev *Dev) Halt() error { + dev.mu.Lock() + defer dev.mu.Unlock() + for _, gr := range dev.groups { + _ = gr.Halt() + } + dev.groups = make([]Group, 0) + dev.Pins = make([]gpio.PinIO, 0) + return nil +} + +// read performs the low level i2c read operation from the device. +func (dev *Dev) read(mask gpio.GPIOValue) (gpio.GPIOValue, error) { + + // Before you can read a pin, you must have set it to high. If nothing + // pulls that down, then it's high. If it's pulled down, it's low. + err := dev.write(mask, mask) + if err != nil { + return 0, fmt.Errorf("pcf857x: %w", err) + } + + dev.mu.Lock() + defer dev.mu.Unlock() + byteCount := 1 + if dev.width > 8 { + byteCount += 1 + } + + r := make([]byte, byteCount) + err = dev.d.Tx(nil, r) + if err != nil { + return 0, fmt.Errorf("pcf857x: %w", err) + } + result := gpio.GPIOValue(r[0]) + if byteCount > 1 { + result |= gpio.GPIOValue(r[1]) << 8 + + } + // turn off the bits we just read so that the next time through, we force + // the write high on them. + dev.value = result + result &= mask + + return result, nil +} + +// write performs the low-level write to the device. If the resulting value of +// the device is unchanged, the write is skipped. +func (dev *Dev) write(value, mask gpio.GPIOValue) error { + dev.mu.Lock() + defer dev.mu.Unlock() + wrValue := dev.value & (dev.mask ^ mask) + wrValue |= (value & mask) + if dev.value == wrValue { + return nil + } + byteCount := 1 + if dev.width > 8 { + byteCount += 1 + } + w := make([]byte, byteCount) + for ix := range byteCount { + w[ix] = byte(wrValue >> (ix * 8)) + } + err := dev.d.Tx(w, nil) + if err == nil { + dev.value = wrValue + } else { + err = fmt.Errorf("pcf857x: %w", err) + } + return err +} + +func (dev *Dev) String() string { + return fmt.Sprintf("%s_%x", dev.chipType, dev.d.Addr) +} + +// Pins returns the set of pins that make up this group. +func (gr *Group) Pins() []pin.Pin { + pins := make([]pin.Pin, len(gr.pins)) + for ix := range len(gr.pins) { + pins[ix] = &gr.pins[ix] + } + return pins +} + +// This converts a mask for a group operation into a mask suitable for writing +// to the device. +func (gr *Group) groupMaskToDevMask(mask gpio.GPIOValue) gpio.GPIOValue { + m := gpio.GPIOValue(0) + for ix := range len(gr.pins) { + currentBit := gpio.GPIOValue(1 << ix) + if (mask & currentBit) == currentBit { + pinBit := gpio.GPIOValue(1) << gr.pins[ix].number + m |= pinBit + } + } + return m +} + +// Return the GPIO pin by offset within the group. +func (gr *Group) ByOffset(offset int) pin.Pin { + return &gr.pins[offset] +} + +// Return the GPIO pin by name. +func (gr *Group) ByName(name string) pin.Pin { + for ix := range len(gr.pins) { + if gr.pins[ix].name == name { + return &gr.pins[ix] + } + } + return nil +} + +// Return the GPIO pin by it's pin number on the device. +func (gr *Group) ByNumber(number int) pin.Pin { + for ix := range len(gr.pins) { + if gr.pins[ix].number == number { + return &gr.pins[ix] + } + } + return nil +} + +// Out writes the specified value to the device. Only pins identified by mask +// are modified. +func (gr *Group) Out(value, mask gpio.GPIOValue) error { + if mask == 0 { + mask = (1 << len(gr.pins)) - 1 + } + wrMask := gr.groupMaskToDevMask(mask) + wr := gpio.GPIOValue(0) + for ix, pin := range gr.pins { + if (value & gpio.GPIOValue(1< 0 { + wr |= 1 << pin.number + } + } + return gr.dev.write(wr, wrMask) +} + +// Read returns the current values of the pins within the group identified by +// mask. +func (gr *Group) Read(mask gpio.GPIOValue) (gpio.GPIOValue, error) { + if mask == 0 { + mask = (1 << len(gr.pins)) - 1 + } + devMask := gr.groupMaskToDevMask(mask) + + v, err := gr.dev.read(devMask) + if err != nil { + return 0, fmt.Errorf("pcf857x: %w", err) + } + + // Now, convert it back to a group value. + result := gpio.GPIOValue(0) + for ix, pin := range gr.pins { + currentBit := gpio.GPIOValue(1 << ix) + if (mask & currentBit) == currentBit { + if (v & gpio.GPIOValue(1< 0 { + result |= currentBit + } + } + } + + return result, nil +} + +// This chip does not support waiting for edge on either a pin or a group. There +// is an interrupt pin, but you can't set a mask of pins that will trigger it. To +// do that, you connect a GPIO pin from the host device that supports WaitForEdge +// to monitor the INTR pin. +func (gr *Group) WaitForEdge(timeout time.Duration) (number int, edge gpio.Edge, err error) { + // TODO: Implement wait for edge in the same way that it is for mcp23008 + return 0, gpio.NoEdge, ErrNotImplmented +} + +// Halt stops the pin group. It cannot be used after this call. +func (gr *Group) Halt() error { + gr.pins = make([]pcfPin, 0) + gr.dev = nil + return nil +} + +func (gr *Group) String() string { + s := gr.dev.String() + "[ " + for ix := range len(gr.pins) { + s += fmt.Sprintf("%d ", gr.pins[ix].Number()) + } + s += "]" + return s +} + +var _ gpio.Group = &Group{} diff --git a/pcf857x/pcf857x_test.go b/pcf857x/pcf857x_test.go new file mode 100644 index 0000000..c2f9c0d --- /dev/null +++ b/pcf857x/pcf857x_test.go @@ -0,0 +1,216 @@ +// Copyright 2025 The Periph Authors. All rights reserved. +// Use of this source code is governed under the Apache License, Version 2.0 +// that can be found in the LICENSE file. +// +// This test assumes you have a PCF8575 and that the data pins are jumpered +// +// 0 => 8 +// 1 => 9 +// ... +// 7 => 15 + +package pcf857x + +import ( + "errors" + "strings" + "testing" + + "periph.io/x/conn/v3/gpio" + "periph.io/x/conn/v3/gpio/gpioreg" + "periph.io/x/conn/v3/i2c/i2ctest" +) + +func getDev(recordingName string, t *testing.T) (*Dev, error) { + // Create a new I2C IO extender + bus := i2ctest.Playback{Ops: recordingData[recordingName]} + extender, err := New(&bus, DefaultAddress, PCF8575) + if err != nil { + t.Error(err) + } + return extender, err +} + +// Test basic dev and pin functions. +func TestBasic(t *testing.T) { + dev, err := getDev(t.Name(), t) + if err != nil { + return + } + t.Logf("dev=%#v", dev) + pin := dev.Pins[1] + t.Logf("pin=%#v", pin) + + s := dev.String() + if len(s) == 0 { + t.Error("String() failure") + } // + + if len(dev.Pins) != 16 { + t.Errorf("expected 16 GPIO pins. Found %d", len(dev.Pins)) + } + + e := pin.PWM(10, 10) + if !errors.Is(e, ErrNotImplmented) { + t.Errorf("PWM() expected ErrNotImplemented. Received %#v", e) + } + if pin.Halt() != nil { + t.Error("expected nil on pin.Halt()") + } + + if pin.Name() != pin.String() { + t.Error("pin.Name()!=pin.String()") + } + + if !strings.HasPrefix(pin.Name(), dev.String()) { + t.Errorf("Expected pin.Name()=%s to start with dev.String()=%s", pin.Name(), dev.String()) + } + + err = dev.Halt() + if err != nil { + t.Error(err) + } +} + +// Test that the pins are registered in gpioreg as expected. +func TestGPIOReg(t *testing.T) { + dev, err := getDev(t.Name(), t) + if err != nil { + return + } + + for ix := range dev.width { + p := dev.Pins[ix] + if p.Number() != ix { + t.Errorf("pin.Number() does not match ordinal position %d! Found %d", ix, p.Number()) + } + pReg := gpioreg.ByName(p.Name()) + if pReg == nil { + t.Errorf("pin %s not found in gpioreg", p.Name()) + } + } +} + +// This test goes through the pins from 0-7, and writes to them and then reads +// the value on pin+8 and verifies it's correct. Then, it reverses direction and +// writes to pin[8] and reads from pin[0]. +func TestPinsSequentially(t *testing.T) { + dev, err := getDev(t.Name(), t) + if err != nil { + return + } + limit := dev.width >> 1 + for ixOuter := range limit { + // Iterate over the lower 8 pins + for ixInner := range limit { + // Sequentially, set each pin to High if it's not the value of ix + p := dev.Pins[ixInner] + pRead := dev.Pins[ixInner+limit] + for direction := range 2 { + writeLevel := gpio.Level(ixInner != ixOuter) + err = p.Out(writeLevel) + if err != nil { + t.Error(err) + } + readVal := pRead.Read() + if readVal != writeLevel { + t.Errorf("wrote %t to pin[%d]. Expected same on pin[%d], found %t", + writeLevel, + p.Number(), + pRead.Number(), + readVal) + } + if direction == 0 { + // swap the direction so we're now going pin[8] => pin[0] and stay in + // the loop to repeat the test. + x := pRead + pRead = p + p = x + } + } + } + } +} + +// This tests the group functionality. +func TestGroup(t *testing.T) { + dev, err := getDev(t.Name(), t) + + if err != nil { + return + } + defer func() { _ = dev.Halt() }() + + set1 := make([]int, dev.width>>1) + set2 := make([]int, dev.width>>1) + for ix := range len(set1) { + set1[ix] = ix + set2[ix] = ix + len(set1) + } + gr1, err := dev.Group(set1...) + if err != nil { + return + } + gr2, err := dev.Group(set2...) + if err != nil { + return + } + // Test the basic group functionality. Note that for group1, pinOffset==pin.Number, but + // for group2, pinOffset!=pin.Number + grTest := gr1 + for range 2 { + for pinNumber, pin := range grTest.Pins() { + x := grTest.ByNumber(pin.Number()) + if x == nil { + t.Errorf("group.ByNumber() returned nil for pin %d", pin.Number()) + } + x = grTest.ByOffset(pinNumber) + if x == nil { + t.Errorf("group.ByOffset returned nil for pin number %d", pinNumber) + } else { + if x.Number() != pin.Number() { + t.Errorf("group.ByOffset() didn't return the expected pin. Expected %d, found %d", pin.Number(), x.Number()) + } + } + x = grTest.ByName(pin.Name()) + if x == nil || x.Name() != pin.Name() { + t.Error("group.ByName() didn't find a pin or returned the wrong pin!") + } + } + grTest = gr2 + } + if len(gr1.String()) == 0 { + t.Error("group.String() didn't return a value") + } + // Test the read/write functionality. + limit := (1 << len(set1)) + var read gpio.GPIOValue + for groupNumber := range 2 { + for val := range limit { + err = gr1.Out(gpio.GPIOValue(val), 0) + if err != nil { + t.Error(err) + } + read, err = gr2.Read(0) + if err != nil { + t.Error(err) + } + if read != gpio.GPIOValue(val) { + t.Errorf("Error writing/reading groups. Wrote %d on write group %s, read %d on read group%s", val, gr1, read, gr2) + } + } + if groupNumber == 0 { + x := gr1 + gr1 = gr2 + gr2 = x + } + } + err = gr1.Halt() + if err != nil { + t.Error(err) + } + err = gr2.Halt() + if err != nil { + t.Error(err) + } +} diff --git a/pcf857x/pcf857xbustestrecording_test.go b/pcf857x/pcf857xbustestrecording_test.go new file mode 100644 index 0000000..5a68548 --- /dev/null +++ b/pcf857x/pcf857xbustestrecording_test.go @@ -0,0 +1,1722 @@ +// Copyright 2025 The Periph Authors. All rights reserved. +// Use of this source code is governed under the Apache License, Version 2.0 +// that can be found in the LICENSE file. + +package pcf857x + +import ( + "periph.io/x/conn/v3/i2c/i2ctest" +) + +// Auto-Generated by i2ctest.BusTest + +var recordingData = map[string][]i2ctest.IO{ + "TestPinsSequentially": { + {Addr: 0x20, W: []uint8{0x0, 0x1}}, + {Addr: 0x20, R: []uint8{0x0, 0x0}}, + {Addr: 0x20, W: []uint8{0x1, 0x0}}, + {Addr: 0x20, R: []uint8{0x0, 0x0}}, + {Addr: 0x20, W: []uint8{0x2, 0x0}}, + {Addr: 0x20, W: []uint8{0x2, 0x2}}, + {Addr: 0x20, R: []uint8{0x2, 0x2}}, + {Addr: 0x20, R: []uint8{0x2, 0x2}}, + {Addr: 0x20, W: []uint8{0x6, 0x2}}, + {Addr: 0x20, W: []uint8{0x6, 0x6}}, + {Addr: 0x20, R: []uint8{0x6, 0x6}}, + {Addr: 0x20, R: []uint8{0x6, 0x6}}, + {Addr: 0x20, W: []uint8{0xe, 0x6}}, + {Addr: 0x20, W: []uint8{0xe, 0xe}}, + {Addr: 0x20, R: []uint8{0xe, 0xe}}, + {Addr: 0x20, R: []uint8{0xe, 0xe}}, + {Addr: 0x20, W: []uint8{0x1e, 0xe}}, + {Addr: 0x20, W: []uint8{0x1e, 0x1e}}, + {Addr: 0x20, R: []uint8{0x1e, 0x1e}}, + {Addr: 0x20, R: []uint8{0x1e, 0x1e}}, + {Addr: 0x20, W: []uint8{0x3e, 0x1e}}, + {Addr: 0x20, W: []uint8{0x3e, 0x3e}}, + {Addr: 0x20, R: []uint8{0x3e, 0x3e}}, + {Addr: 0x20, R: []uint8{0x3e, 0x3e}}, + {Addr: 0x20, W: []uint8{0x7e, 0x3e}}, + {Addr: 0x20, W: []uint8{0x7e, 0x7e}}, + {Addr: 0x20, R: []uint8{0x7e, 0x7e}}, + {Addr: 0x20, R: []uint8{0x7e, 0x7e}}, + {Addr: 0x20, W: []uint8{0xfe, 0x7e}}, + {Addr: 0x20, W: []uint8{0xfe, 0xfe}}, + {Addr: 0x20, R: []uint8{0xfe, 0xfe}}, + {Addr: 0x20, R: []uint8{0xfe, 0xfe}}, + {Addr: 0x20, W: []uint8{0xff, 0xfe}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, W: []uint8{0xfd, 0xff}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, W: []uint8{0xff, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, W: []uint8{0xff, 0xfd}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, W: []uint8{0xfb, 0xff}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, W: []uint8{0xff, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, W: []uint8{0xff, 0xfb}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, W: []uint8{0xf7, 0xff}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, W: []uint8{0xff, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, W: []uint8{0xff, 0xf7}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, W: []uint8{0xef, 0xff}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, W: []uint8{0xff, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, W: []uint8{0xff, 0xef}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, W: []uint8{0xdf, 0xff}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, W: []uint8{0xff, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, W: []uint8{0xff, 0xdf}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, W: []uint8{0xbf, 0xff}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, W: []uint8{0xff, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, W: []uint8{0xff, 0xbf}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, W: []uint8{0x7f, 0xff}}, + {Addr: 0x20, R: []uint8{0x7f, 0x7f}}, + {Addr: 0x20, W: []uint8{0xff, 0x7f}}, + {Addr: 0x20, R: []uint8{0x7f, 0x7f}}}, + "TestGroup": { + {Addr: 0x20, W: []uint8{0x0, 0xff}}, + {Addr: 0x20, R: []uint8{0x0, 0x0}}, + {Addr: 0x20, W: []uint8{0x1, 0x0}}, + {Addr: 0x20, W: []uint8{0x1, 0xff}}, + {Addr: 0x20, R: []uint8{0x1, 0x1}}, + {Addr: 0x20, W: []uint8{0x2, 0x1}}, + {Addr: 0x20, W: []uint8{0x2, 0xff}}, + {Addr: 0x20, R: []uint8{0x2, 0x2}}, + {Addr: 0x20, W: []uint8{0x3, 0x2}}, + {Addr: 0x20, W: []uint8{0x3, 0xff}}, + {Addr: 0x20, R: []uint8{0x3, 0x3}}, + {Addr: 0x20, W: []uint8{0x4, 0x3}}, + {Addr: 0x20, W: []uint8{0x4, 0xff}}, + {Addr: 0x20, R: []uint8{0x4, 0x4}}, + {Addr: 0x20, W: []uint8{0x5, 0x4}}, + {Addr: 0x20, W: []uint8{0x5, 0xff}}, + {Addr: 0x20, R: []uint8{0x5, 0x5}}, + {Addr: 0x20, W: []uint8{0x6, 0x5}}, + {Addr: 0x20, W: []uint8{0x6, 0xff}}, + {Addr: 0x20, R: []uint8{0x6, 0x6}}, + {Addr: 0x20, W: []uint8{0x7, 0x6}}, + {Addr: 0x20, W: []uint8{0x7, 0xff}}, + {Addr: 0x20, R: []uint8{0x7, 0x7}}, + {Addr: 0x20, W: []uint8{0x8, 0x7}}, + {Addr: 0x20, W: []uint8{0x8, 0xff}}, + {Addr: 0x20, R: []uint8{0x8, 0x8}}, + {Addr: 0x20, W: []uint8{0x9, 0x8}}, + {Addr: 0x20, W: []uint8{0x9, 0xff}}, + {Addr: 0x20, R: []uint8{0x9, 0x9}}, + {Addr: 0x20, W: []uint8{0xa, 0x9}}, + {Addr: 0x20, W: []uint8{0xa, 0xff}}, + {Addr: 0x20, R: []uint8{0xa, 0xa}}, + {Addr: 0x20, W: []uint8{0xb, 0xa}}, + {Addr: 0x20, W: []uint8{0xb, 0xff}}, + {Addr: 0x20, R: []uint8{0xb, 0xb}}, + {Addr: 0x20, W: []uint8{0xc, 0xb}}, + {Addr: 0x20, W: []uint8{0xc, 0xff}}, + {Addr: 0x20, R: []uint8{0xc, 0xc}}, + {Addr: 0x20, W: []uint8{0xd, 0xc}}, + {Addr: 0x20, W: []uint8{0xd, 0xff}}, + {Addr: 0x20, R: []uint8{0xd, 0xd}}, + {Addr: 0x20, W: []uint8{0xe, 0xd}}, + {Addr: 0x20, W: []uint8{0xe, 0xff}}, + {Addr: 0x20, R: []uint8{0xe, 0xe}}, + {Addr: 0x20, W: []uint8{0xf, 0xe}}, + {Addr: 0x20, W: []uint8{0xf, 0xff}}, + {Addr: 0x20, R: []uint8{0xf, 0xf}}, + {Addr: 0x20, W: []uint8{0x10, 0xf}}, + {Addr: 0x20, W: []uint8{0x10, 0xff}}, + {Addr: 0x20, R: []uint8{0x10, 0x10}}, + {Addr: 0x20, W: []uint8{0x11, 0x10}}, + {Addr: 0x20, W: []uint8{0x11, 0xff}}, + {Addr: 0x20, R: []uint8{0x11, 0x11}}, + {Addr: 0x20, W: []uint8{0x12, 0x11}}, + {Addr: 0x20, W: []uint8{0x12, 0xff}}, + {Addr: 0x20, R: []uint8{0x12, 0x12}}, + {Addr: 0x20, W: []uint8{0x13, 0x12}}, + {Addr: 0x20, W: []uint8{0x13, 0xff}}, + {Addr: 0x20, R: []uint8{0x13, 0x13}}, + {Addr: 0x20, W: []uint8{0x14, 0x13}}, + {Addr: 0x20, W: []uint8{0x14, 0xff}}, + {Addr: 0x20, R: []uint8{0x14, 0x14}}, + {Addr: 0x20, W: []uint8{0x15, 0x14}}, + {Addr: 0x20, W: []uint8{0x15, 0xff}}, + {Addr: 0x20, R: []uint8{0x15, 0x15}}, + {Addr: 0x20, W: []uint8{0x16, 0x15}}, + {Addr: 0x20, W: []uint8{0x16, 0xff}}, + {Addr: 0x20, R: []uint8{0x16, 0x16}}, + {Addr: 0x20, W: []uint8{0x17, 0x16}}, + {Addr: 0x20, W: []uint8{0x17, 0xff}}, + {Addr: 0x20, R: []uint8{0x17, 0x17}}, + {Addr: 0x20, W: []uint8{0x18, 0x17}}, + {Addr: 0x20, W: []uint8{0x18, 0xff}}, + {Addr: 0x20, R: []uint8{0x18, 0x18}}, + {Addr: 0x20, W: []uint8{0x19, 0x18}}, + {Addr: 0x20, W: []uint8{0x19, 0xff}}, + {Addr: 0x20, R: []uint8{0x19, 0x19}}, + {Addr: 0x20, W: []uint8{0x1a, 0x19}}, + {Addr: 0x20, W: []uint8{0x1a, 0xff}}, + {Addr: 0x20, R: []uint8{0x1a, 0x1a}}, + {Addr: 0x20, W: []uint8{0x1b, 0x1a}}, + {Addr: 0x20, W: []uint8{0x1b, 0xff}}, + {Addr: 0x20, R: []uint8{0x1b, 0x1b}}, + {Addr: 0x20, W: []uint8{0x1c, 0x1b}}, + {Addr: 0x20, W: []uint8{0x1c, 0xff}}, + {Addr: 0x20, R: []uint8{0x1c, 0x1c}}, + {Addr: 0x20, W: []uint8{0x1d, 0x1c}}, + {Addr: 0x20, W: []uint8{0x1d, 0xff}}, + {Addr: 0x20, R: []uint8{0x1d, 0x1d}}, + {Addr: 0x20, W: []uint8{0x1e, 0x1d}}, + {Addr: 0x20, W: []uint8{0x1e, 0xff}}, + {Addr: 0x20, R: []uint8{0x1e, 0x1e}}, + {Addr: 0x20, W: []uint8{0x1f, 0x1e}}, + {Addr: 0x20, W: []uint8{0x1f, 0xff}}, + {Addr: 0x20, R: []uint8{0x1f, 0x1f}}, + {Addr: 0x20, W: []uint8{0x20, 0x1f}}, + {Addr: 0x20, W: []uint8{0x20, 0xff}}, + {Addr: 0x20, R: []uint8{0x20, 0x20}}, + {Addr: 0x20, W: []uint8{0x21, 0x20}}, + {Addr: 0x20, W: []uint8{0x21, 0xff}}, + {Addr: 0x20, R: []uint8{0x21, 0x21}}, + {Addr: 0x20, W: []uint8{0x22, 0x21}}, + {Addr: 0x20, W: []uint8{0x22, 0xff}}, + {Addr: 0x20, R: []uint8{0x22, 0x22}}, + {Addr: 0x20, W: []uint8{0x23, 0x22}}, + {Addr: 0x20, W: []uint8{0x23, 0xff}}, + {Addr: 0x20, R: []uint8{0x23, 0x23}}, + {Addr: 0x20, W: []uint8{0x24, 0x23}}, + {Addr: 0x20, W: []uint8{0x24, 0xff}}, + {Addr: 0x20, R: []uint8{0x24, 0x24}}, + {Addr: 0x20, W: []uint8{0x25, 0x24}}, + {Addr: 0x20, W: []uint8{0x25, 0xff}}, + {Addr: 0x20, R: []uint8{0x25, 0x25}}, + {Addr: 0x20, W: []uint8{0x26, 0x25}}, + {Addr: 0x20, W: []uint8{0x26, 0xff}}, + {Addr: 0x20, R: []uint8{0x26, 0x26}}, + {Addr: 0x20, W: []uint8{0x27, 0x26}}, + {Addr: 0x20, W: []uint8{0x27, 0xff}}, + {Addr: 0x20, R: []uint8{0x27, 0x27}}, + {Addr: 0x20, W: []uint8{0x28, 0x27}}, + {Addr: 0x20, W: []uint8{0x28, 0xff}}, + {Addr: 0x20, R: []uint8{0x28, 0x28}}, + {Addr: 0x20, W: []uint8{0x29, 0x28}}, + {Addr: 0x20, W: []uint8{0x29, 0xff}}, + {Addr: 0x20, R: []uint8{0x29, 0x29}}, + {Addr: 0x20, W: []uint8{0x2a, 0x29}}, + {Addr: 0x20, W: []uint8{0x2a, 0xff}}, + {Addr: 0x20, R: []uint8{0x2a, 0x2a}}, + {Addr: 0x20, W: []uint8{0x2b, 0x2a}}, + {Addr: 0x20, W: []uint8{0x2b, 0xff}}, + {Addr: 0x20, R: []uint8{0x2b, 0x2b}}, + {Addr: 0x20, W: []uint8{0x2c, 0x2b}}, + {Addr: 0x20, W: []uint8{0x2c, 0xff}}, + {Addr: 0x20, R: []uint8{0x2c, 0x2c}}, + {Addr: 0x20, W: []uint8{0x2d, 0x2c}}, + {Addr: 0x20, W: []uint8{0x2d, 0xff}}, + {Addr: 0x20, R: []uint8{0x2d, 0x2d}}, + {Addr: 0x20, W: []uint8{0x2e, 0x2d}}, + {Addr: 0x20, W: []uint8{0x2e, 0xff}}, + {Addr: 0x20, R: []uint8{0x2e, 0x2e}}, + {Addr: 0x20, W: []uint8{0x2f, 0x2e}}, + {Addr: 0x20, W: []uint8{0x2f, 0xff}}, + {Addr: 0x20, R: []uint8{0x2f, 0x2f}}, + {Addr: 0x20, W: []uint8{0x30, 0x2f}}, + {Addr: 0x20, W: []uint8{0x30, 0xff}}, + {Addr: 0x20, R: []uint8{0x30, 0x30}}, + {Addr: 0x20, W: []uint8{0x31, 0x30}}, + {Addr: 0x20, W: []uint8{0x31, 0xff}}, + {Addr: 0x20, R: []uint8{0x31, 0x31}}, + {Addr: 0x20, W: []uint8{0x32, 0x31}}, + {Addr: 0x20, W: []uint8{0x32, 0xff}}, + {Addr: 0x20, R: []uint8{0x32, 0x32}}, + {Addr: 0x20, W: []uint8{0x33, 0x32}}, + {Addr: 0x20, W: []uint8{0x33, 0xff}}, + {Addr: 0x20, R: []uint8{0x33, 0x33}}, + {Addr: 0x20, W: []uint8{0x34, 0x33}}, + {Addr: 0x20, W: []uint8{0x34, 0xff}}, + {Addr: 0x20, R: []uint8{0x34, 0x34}}, + {Addr: 0x20, W: []uint8{0x35, 0x34}}, + {Addr: 0x20, W: []uint8{0x35, 0xff}}, + {Addr: 0x20, R: []uint8{0x35, 0x35}}, + {Addr: 0x20, W: []uint8{0x36, 0x35}}, + {Addr: 0x20, W: []uint8{0x36, 0xff}}, + {Addr: 0x20, R: []uint8{0x36, 0x36}}, + {Addr: 0x20, W: []uint8{0x37, 0x36}}, + {Addr: 0x20, W: []uint8{0x37, 0xff}}, + {Addr: 0x20, R: []uint8{0x37, 0x37}}, + {Addr: 0x20, W: []uint8{0x38, 0x37}}, + {Addr: 0x20, W: []uint8{0x38, 0xff}}, + {Addr: 0x20, R: []uint8{0x38, 0x38}}, + {Addr: 0x20, W: []uint8{0x39, 0x38}}, + {Addr: 0x20, W: []uint8{0x39, 0xff}}, + {Addr: 0x20, R: []uint8{0x39, 0x39}}, + {Addr: 0x20, W: []uint8{0x3a, 0x39}}, + {Addr: 0x20, W: []uint8{0x3a, 0xff}}, + {Addr: 0x20, R: []uint8{0x3a, 0x3a}}, + {Addr: 0x20, W: []uint8{0x3b, 0x3a}}, + {Addr: 0x20, W: []uint8{0x3b, 0xff}}, + {Addr: 0x20, R: []uint8{0x3b, 0x3b}}, + {Addr: 0x20, W: []uint8{0x3c, 0x3b}}, + {Addr: 0x20, W: []uint8{0x3c, 0xff}}, + {Addr: 0x20, R: []uint8{0x3c, 0x3c}}, + {Addr: 0x20, W: []uint8{0x3d, 0x3c}}, + {Addr: 0x20, W: []uint8{0x3d, 0xff}}, + {Addr: 0x20, R: []uint8{0x3d, 0x3d}}, + {Addr: 0x20, W: []uint8{0x3e, 0x3d}}, + {Addr: 0x20, W: []uint8{0x3e, 0xff}}, + {Addr: 0x20, R: []uint8{0x3e, 0x3e}}, + {Addr: 0x20, W: []uint8{0x3f, 0x3e}}, + {Addr: 0x20, W: []uint8{0x3f, 0xff}}, + {Addr: 0x20, R: []uint8{0x3f, 0x3f}}, + {Addr: 0x20, W: []uint8{0x40, 0x3f}}, + {Addr: 0x20, W: []uint8{0x40, 0xff}}, + {Addr: 0x20, R: []uint8{0x40, 0x40}}, + {Addr: 0x20, W: []uint8{0x41, 0x40}}, + {Addr: 0x20, W: []uint8{0x41, 0xff}}, + {Addr: 0x20, R: []uint8{0x41, 0x41}}, + {Addr: 0x20, W: []uint8{0x42, 0x41}}, + {Addr: 0x20, W: []uint8{0x42, 0xff}}, + {Addr: 0x20, R: []uint8{0x42, 0x42}}, + {Addr: 0x20, W: []uint8{0x43, 0x42}}, + {Addr: 0x20, W: []uint8{0x43, 0xff}}, + {Addr: 0x20, R: []uint8{0x43, 0x43}}, + {Addr: 0x20, W: []uint8{0x44, 0x43}}, + {Addr: 0x20, W: []uint8{0x44, 0xff}}, + {Addr: 0x20, R: []uint8{0x44, 0x44}}, + {Addr: 0x20, W: []uint8{0x45, 0x44}}, + {Addr: 0x20, W: []uint8{0x45, 0xff}}, + {Addr: 0x20, R: []uint8{0x45, 0x45}}, + {Addr: 0x20, W: []uint8{0x46, 0x45}}, + {Addr: 0x20, W: []uint8{0x46, 0xff}}, + {Addr: 0x20, R: []uint8{0x46, 0x46}}, + {Addr: 0x20, W: []uint8{0x47, 0x46}}, + {Addr: 0x20, W: []uint8{0x47, 0xff}}, + {Addr: 0x20, R: []uint8{0x47, 0x47}}, + {Addr: 0x20, W: []uint8{0x48, 0x47}}, + {Addr: 0x20, W: []uint8{0x48, 0xff}}, + {Addr: 0x20, R: []uint8{0x48, 0x48}}, + {Addr: 0x20, W: []uint8{0x49, 0x48}}, + {Addr: 0x20, W: []uint8{0x49, 0xff}}, + {Addr: 0x20, R: []uint8{0x49, 0x49}}, + {Addr: 0x20, W: []uint8{0x4a, 0x49}}, + {Addr: 0x20, W: []uint8{0x4a, 0xff}}, + {Addr: 0x20, R: []uint8{0x4a, 0x4a}}, + {Addr: 0x20, W: []uint8{0x4b, 0x4a}}, + {Addr: 0x20, W: []uint8{0x4b, 0xff}}, + {Addr: 0x20, R: []uint8{0x4b, 0x4b}}, + {Addr: 0x20, W: []uint8{0x4c, 0x4b}}, + {Addr: 0x20, W: []uint8{0x4c, 0xff}}, + {Addr: 0x20, R: []uint8{0x4c, 0x4c}}, + {Addr: 0x20, W: []uint8{0x4d, 0x4c}}, + {Addr: 0x20, W: []uint8{0x4d, 0xff}}, + {Addr: 0x20, R: []uint8{0x4d, 0x4d}}, + {Addr: 0x20, W: []uint8{0x4e, 0x4d}}, + {Addr: 0x20, W: []uint8{0x4e, 0xff}}, + {Addr: 0x20, R: []uint8{0x4e, 0x4e}}, + {Addr: 0x20, W: []uint8{0x4f, 0x4e}}, + {Addr: 0x20, W: []uint8{0x4f, 0xff}}, + {Addr: 0x20, R: []uint8{0x4f, 0x4f}}, + {Addr: 0x20, W: []uint8{0x50, 0x4f}}, + {Addr: 0x20, W: []uint8{0x50, 0xff}}, + {Addr: 0x20, R: []uint8{0x50, 0x50}}, + {Addr: 0x20, W: []uint8{0x51, 0x50}}, + {Addr: 0x20, W: []uint8{0x51, 0xff}}, + {Addr: 0x20, R: []uint8{0x51, 0x51}}, + {Addr: 0x20, W: []uint8{0x52, 0x51}}, + {Addr: 0x20, W: []uint8{0x52, 0xff}}, + {Addr: 0x20, R: []uint8{0x52, 0x52}}, + {Addr: 0x20, W: []uint8{0x53, 0x52}}, + {Addr: 0x20, W: []uint8{0x53, 0xff}}, + {Addr: 0x20, R: []uint8{0x53, 0x53}}, + {Addr: 0x20, W: []uint8{0x54, 0x53}}, + {Addr: 0x20, W: []uint8{0x54, 0xff}}, + {Addr: 0x20, R: []uint8{0x54, 0x54}}, + {Addr: 0x20, W: []uint8{0x55, 0x54}}, + {Addr: 0x20, W: []uint8{0x55, 0xff}}, + {Addr: 0x20, R: []uint8{0x55, 0x55}}, + {Addr: 0x20, W: []uint8{0x56, 0x55}}, + {Addr: 0x20, W: []uint8{0x56, 0xff}}, + {Addr: 0x20, R: []uint8{0x56, 0x56}}, + {Addr: 0x20, W: []uint8{0x57, 0x56}}, + {Addr: 0x20, W: []uint8{0x57, 0xff}}, + {Addr: 0x20, R: []uint8{0x57, 0x57}}, + {Addr: 0x20, W: []uint8{0x58, 0x57}}, + {Addr: 0x20, W: []uint8{0x58, 0xff}}, + {Addr: 0x20, R: []uint8{0x58, 0x58}}, + {Addr: 0x20, W: []uint8{0x59, 0x58}}, + {Addr: 0x20, W: []uint8{0x59, 0xff}}, + {Addr: 0x20, R: []uint8{0x59, 0x59}}, + {Addr: 0x20, W: []uint8{0x5a, 0x59}}, + {Addr: 0x20, W: []uint8{0x5a, 0xff}}, + {Addr: 0x20, R: []uint8{0x5a, 0x5a}}, + {Addr: 0x20, W: []uint8{0x5b, 0x5a}}, + {Addr: 0x20, W: []uint8{0x5b, 0xff}}, + {Addr: 0x20, R: []uint8{0x5b, 0x5b}}, + {Addr: 0x20, W: []uint8{0x5c, 0x5b}}, + {Addr: 0x20, W: []uint8{0x5c, 0xff}}, + {Addr: 0x20, R: []uint8{0x5c, 0x5c}}, + {Addr: 0x20, W: []uint8{0x5d, 0x5c}}, + {Addr: 0x20, W: []uint8{0x5d, 0xff}}, + {Addr: 0x20, R: []uint8{0x5d, 0x5d}}, + {Addr: 0x20, W: []uint8{0x5e, 0x5d}}, + {Addr: 0x20, W: []uint8{0x5e, 0xff}}, + {Addr: 0x20, R: []uint8{0x5e, 0x5e}}, + {Addr: 0x20, W: []uint8{0x5f, 0x5e}}, + {Addr: 0x20, W: []uint8{0x5f, 0xff}}, + {Addr: 0x20, R: []uint8{0x5f, 0x5f}}, + {Addr: 0x20, W: []uint8{0x60, 0x5f}}, + {Addr: 0x20, W: []uint8{0x60, 0xff}}, + {Addr: 0x20, R: []uint8{0x60, 0x60}}, + {Addr: 0x20, W: []uint8{0x61, 0x60}}, + {Addr: 0x20, W: []uint8{0x61, 0xff}}, + {Addr: 0x20, R: []uint8{0x61, 0x61}}, + {Addr: 0x20, W: []uint8{0x62, 0x61}}, + {Addr: 0x20, W: []uint8{0x62, 0xff}}, + {Addr: 0x20, R: []uint8{0x62, 0x62}}, + {Addr: 0x20, W: []uint8{0x63, 0x62}}, + {Addr: 0x20, W: []uint8{0x63, 0xff}}, + {Addr: 0x20, R: []uint8{0x63, 0x63}}, + {Addr: 0x20, W: []uint8{0x64, 0x63}}, + {Addr: 0x20, W: []uint8{0x64, 0xff}}, + {Addr: 0x20, R: []uint8{0x64, 0x64}}, + {Addr: 0x20, W: []uint8{0x65, 0x64}}, + {Addr: 0x20, W: []uint8{0x65, 0xff}}, + {Addr: 0x20, R: []uint8{0x65, 0x65}}, + {Addr: 0x20, W: []uint8{0x66, 0x65}}, + {Addr: 0x20, W: []uint8{0x66, 0xff}}, + {Addr: 0x20, R: []uint8{0x66, 0x66}}, + {Addr: 0x20, W: []uint8{0x67, 0x66}}, + {Addr: 0x20, W: []uint8{0x67, 0xff}}, + {Addr: 0x20, R: []uint8{0x67, 0x67}}, + {Addr: 0x20, W: []uint8{0x68, 0x67}}, + {Addr: 0x20, W: []uint8{0x68, 0xff}}, + {Addr: 0x20, R: []uint8{0x68, 0x68}}, + {Addr: 0x20, W: []uint8{0x69, 0x68}}, + {Addr: 0x20, W: []uint8{0x69, 0xff}}, + {Addr: 0x20, R: []uint8{0x69, 0x69}}, + {Addr: 0x20, W: []uint8{0x6a, 0x69}}, + {Addr: 0x20, W: []uint8{0x6a, 0xff}}, + {Addr: 0x20, R: []uint8{0x6a, 0x6a}}, + {Addr: 0x20, W: []uint8{0x6b, 0x6a}}, + {Addr: 0x20, W: []uint8{0x6b, 0xff}}, + {Addr: 0x20, R: []uint8{0x6b, 0x6b}}, + {Addr: 0x20, W: []uint8{0x6c, 0x6b}}, + {Addr: 0x20, W: []uint8{0x6c, 0xff}}, + {Addr: 0x20, R: []uint8{0x6c, 0x6c}}, + {Addr: 0x20, W: []uint8{0x6d, 0x6c}}, + {Addr: 0x20, W: []uint8{0x6d, 0xff}}, + {Addr: 0x20, R: []uint8{0x6d, 0x6d}}, + {Addr: 0x20, W: []uint8{0x6e, 0x6d}}, + {Addr: 0x20, W: []uint8{0x6e, 0xff}}, + {Addr: 0x20, R: []uint8{0x6e, 0x6e}}, + {Addr: 0x20, W: []uint8{0x6f, 0x6e}}, + {Addr: 0x20, W: []uint8{0x6f, 0xff}}, + {Addr: 0x20, R: []uint8{0x6f, 0x6f}}, + {Addr: 0x20, W: []uint8{0x70, 0x6f}}, + {Addr: 0x20, W: []uint8{0x70, 0xff}}, + {Addr: 0x20, R: []uint8{0x70, 0x70}}, + {Addr: 0x20, W: []uint8{0x71, 0x70}}, + {Addr: 0x20, W: []uint8{0x71, 0xff}}, + {Addr: 0x20, R: []uint8{0x71, 0x71}}, + {Addr: 0x20, W: []uint8{0x72, 0x71}}, + {Addr: 0x20, W: []uint8{0x72, 0xff}}, + {Addr: 0x20, R: []uint8{0x72, 0x72}}, + {Addr: 0x20, W: []uint8{0x73, 0x72}}, + {Addr: 0x20, W: []uint8{0x73, 0xff}}, + {Addr: 0x20, R: []uint8{0x73, 0x73}}, + {Addr: 0x20, W: []uint8{0x74, 0x73}}, + {Addr: 0x20, W: []uint8{0x74, 0xff}}, + {Addr: 0x20, R: []uint8{0x74, 0x74}}, + {Addr: 0x20, W: []uint8{0x75, 0x74}}, + {Addr: 0x20, W: []uint8{0x75, 0xff}}, + {Addr: 0x20, R: []uint8{0x75, 0x75}}, + {Addr: 0x20, W: []uint8{0x76, 0x75}}, + {Addr: 0x20, W: []uint8{0x76, 0xff}}, + {Addr: 0x20, R: []uint8{0x76, 0x76}}, + {Addr: 0x20, W: []uint8{0x77, 0x76}}, + {Addr: 0x20, W: []uint8{0x77, 0xff}}, + {Addr: 0x20, R: []uint8{0x77, 0x77}}, + {Addr: 0x20, W: []uint8{0x78, 0x77}}, + {Addr: 0x20, W: []uint8{0x78, 0xff}}, + {Addr: 0x20, R: []uint8{0x78, 0x78}}, + {Addr: 0x20, W: []uint8{0x79, 0x78}}, + {Addr: 0x20, W: []uint8{0x79, 0xff}}, + {Addr: 0x20, R: []uint8{0x79, 0x79}}, + {Addr: 0x20, W: []uint8{0x7a, 0x79}}, + {Addr: 0x20, W: []uint8{0x7a, 0xff}}, + {Addr: 0x20, R: []uint8{0x7a, 0x7a}}, + {Addr: 0x20, W: []uint8{0x7b, 0x7a}}, + {Addr: 0x20, W: []uint8{0x7b, 0xff}}, + {Addr: 0x20, R: []uint8{0x7b, 0x7b}}, + {Addr: 0x20, W: []uint8{0x7c, 0x7b}}, + {Addr: 0x20, W: []uint8{0x7c, 0xff}}, + {Addr: 0x20, R: []uint8{0x7c, 0x7c}}, + {Addr: 0x20, W: []uint8{0x7d, 0x7c}}, + {Addr: 0x20, W: []uint8{0x7d, 0xff}}, + {Addr: 0x20, R: []uint8{0x7d, 0x7d}}, + {Addr: 0x20, W: []uint8{0x7e, 0x7d}}, + {Addr: 0x20, W: []uint8{0x7e, 0xff}}, + {Addr: 0x20, R: []uint8{0x7e, 0x7e}}, + {Addr: 0x20, W: []uint8{0x7f, 0x7e}}, + {Addr: 0x20, W: []uint8{0x7f, 0xff}}, + {Addr: 0x20, R: []uint8{0x7f, 0x7f}}, + {Addr: 0x20, W: []uint8{0x80, 0x7f}}, + {Addr: 0x20, W: []uint8{0x80, 0xff}}, + {Addr: 0x20, R: []uint8{0x80, 0x80}}, + {Addr: 0x20, W: []uint8{0x81, 0x80}}, + {Addr: 0x20, W: []uint8{0x81, 0xff}}, + {Addr: 0x20, R: []uint8{0x81, 0x81}}, + {Addr: 0x20, W: []uint8{0x82, 0x81}}, + {Addr: 0x20, W: []uint8{0x82, 0xff}}, + {Addr: 0x20, R: []uint8{0x82, 0x82}}, + {Addr: 0x20, W: []uint8{0x83, 0x82}}, + {Addr: 0x20, W: []uint8{0x83, 0xff}}, + {Addr: 0x20, R: []uint8{0x83, 0x83}}, + {Addr: 0x20, W: []uint8{0x84, 0x83}}, + {Addr: 0x20, W: []uint8{0x84, 0xff}}, + {Addr: 0x20, R: []uint8{0x84, 0x84}}, + {Addr: 0x20, W: []uint8{0x85, 0x84}}, + {Addr: 0x20, W: []uint8{0x85, 0xff}}, + {Addr: 0x20, R: []uint8{0x85, 0x85}}, + {Addr: 0x20, W: []uint8{0x86, 0x85}}, + {Addr: 0x20, W: []uint8{0x86, 0xff}}, + {Addr: 0x20, R: []uint8{0x86, 0x86}}, + {Addr: 0x20, W: []uint8{0x87, 0x86}}, + {Addr: 0x20, W: []uint8{0x87, 0xff}}, + {Addr: 0x20, R: []uint8{0x87, 0x87}}, + {Addr: 0x20, W: []uint8{0x88, 0x87}}, + {Addr: 0x20, W: []uint8{0x88, 0xff}}, + {Addr: 0x20, R: []uint8{0x88, 0x88}}, + {Addr: 0x20, W: []uint8{0x89, 0x88}}, + {Addr: 0x20, W: []uint8{0x89, 0xff}}, + {Addr: 0x20, R: []uint8{0x89, 0x89}}, + {Addr: 0x20, W: []uint8{0x8a, 0x89}}, + {Addr: 0x20, W: []uint8{0x8a, 0xff}}, + {Addr: 0x20, R: []uint8{0x8a, 0x8a}}, + {Addr: 0x20, W: []uint8{0x8b, 0x8a}}, + {Addr: 0x20, W: []uint8{0x8b, 0xff}}, + {Addr: 0x20, R: []uint8{0x8b, 0x8b}}, + {Addr: 0x20, W: []uint8{0x8c, 0x8b}}, + {Addr: 0x20, W: []uint8{0x8c, 0xff}}, + {Addr: 0x20, R: []uint8{0x8c, 0x8c}}, + {Addr: 0x20, W: []uint8{0x8d, 0x8c}}, + {Addr: 0x20, W: []uint8{0x8d, 0xff}}, + {Addr: 0x20, R: []uint8{0x8d, 0x8d}}, + {Addr: 0x20, W: []uint8{0x8e, 0x8d}}, + {Addr: 0x20, W: []uint8{0x8e, 0xff}}, + {Addr: 0x20, R: []uint8{0x8e, 0x8e}}, + {Addr: 0x20, W: []uint8{0x8f, 0x8e}}, + {Addr: 0x20, W: []uint8{0x8f, 0xff}}, + {Addr: 0x20, R: []uint8{0x8f, 0x8f}}, + {Addr: 0x20, W: []uint8{0x90, 0x8f}}, + {Addr: 0x20, W: []uint8{0x90, 0xff}}, + {Addr: 0x20, R: []uint8{0x90, 0x90}}, + {Addr: 0x20, W: []uint8{0x91, 0x90}}, + {Addr: 0x20, W: []uint8{0x91, 0xff}}, + {Addr: 0x20, R: []uint8{0x91, 0x91}}, + {Addr: 0x20, W: []uint8{0x92, 0x91}}, + {Addr: 0x20, W: []uint8{0x92, 0xff}}, + {Addr: 0x20, R: []uint8{0x92, 0x92}}, + {Addr: 0x20, W: []uint8{0x93, 0x92}}, + {Addr: 0x20, W: []uint8{0x93, 0xff}}, + {Addr: 0x20, R: []uint8{0x93, 0x93}}, + {Addr: 0x20, W: []uint8{0x94, 0x93}}, + {Addr: 0x20, W: []uint8{0x94, 0xff}}, + {Addr: 0x20, R: []uint8{0x94, 0x94}}, + {Addr: 0x20, W: []uint8{0x95, 0x94}}, + {Addr: 0x20, W: []uint8{0x95, 0xff}}, + {Addr: 0x20, R: []uint8{0x95, 0x95}}, + {Addr: 0x20, W: []uint8{0x96, 0x95}}, + {Addr: 0x20, W: []uint8{0x96, 0xff}}, + {Addr: 0x20, R: []uint8{0x96, 0x96}}, + {Addr: 0x20, W: []uint8{0x97, 0x96}}, + {Addr: 0x20, W: []uint8{0x97, 0xff}}, + {Addr: 0x20, R: []uint8{0x97, 0x97}}, + {Addr: 0x20, W: []uint8{0x98, 0x97}}, + {Addr: 0x20, W: []uint8{0x98, 0xff}}, + {Addr: 0x20, R: []uint8{0x98, 0x98}}, + {Addr: 0x20, W: []uint8{0x99, 0x98}}, + {Addr: 0x20, W: []uint8{0x99, 0xff}}, + {Addr: 0x20, R: []uint8{0x99, 0x99}}, + {Addr: 0x20, W: []uint8{0x9a, 0x99}}, + {Addr: 0x20, W: []uint8{0x9a, 0xff}}, + {Addr: 0x20, R: []uint8{0x9a, 0x9a}}, + {Addr: 0x20, W: []uint8{0x9b, 0x9a}}, + {Addr: 0x20, W: []uint8{0x9b, 0xff}}, + {Addr: 0x20, R: []uint8{0x9b, 0x9b}}, + {Addr: 0x20, W: []uint8{0x9c, 0x9b}}, + {Addr: 0x20, W: []uint8{0x9c, 0xff}}, + {Addr: 0x20, R: []uint8{0x9c, 0x9c}}, + {Addr: 0x20, W: []uint8{0x9d, 0x9c}}, + {Addr: 0x20, W: []uint8{0x9d, 0xff}}, + {Addr: 0x20, R: []uint8{0x9d, 0x9d}}, + {Addr: 0x20, W: []uint8{0x9e, 0x9d}}, + {Addr: 0x20, W: []uint8{0x9e, 0xff}}, + {Addr: 0x20, R: []uint8{0x9e, 0x9e}}, + {Addr: 0x20, W: []uint8{0x9f, 0x9e}}, + {Addr: 0x20, W: []uint8{0x9f, 0xff}}, + {Addr: 0x20, R: []uint8{0x9f, 0x9f}}, + {Addr: 0x20, W: []uint8{0xa0, 0x9f}}, + {Addr: 0x20, W: []uint8{0xa0, 0xff}}, + {Addr: 0x20, R: []uint8{0xa0, 0xa0}}, + {Addr: 0x20, W: []uint8{0xa1, 0xa0}}, + {Addr: 0x20, W: []uint8{0xa1, 0xff}}, + {Addr: 0x20, R: []uint8{0xa1, 0xa1}}, + {Addr: 0x20, W: []uint8{0xa2, 0xa1}}, + {Addr: 0x20, W: []uint8{0xa2, 0xff}}, + {Addr: 0x20, R: []uint8{0xa2, 0xa2}}, + {Addr: 0x20, W: []uint8{0xa3, 0xa2}}, + {Addr: 0x20, W: []uint8{0xa3, 0xff}}, + {Addr: 0x20, R: []uint8{0xa3, 0xa3}}, + {Addr: 0x20, W: []uint8{0xa4, 0xa3}}, + {Addr: 0x20, W: []uint8{0xa4, 0xff}}, + {Addr: 0x20, R: []uint8{0xa4, 0xa4}}, + {Addr: 0x20, W: []uint8{0xa5, 0xa4}}, + {Addr: 0x20, W: []uint8{0xa5, 0xff}}, + {Addr: 0x20, R: []uint8{0xa5, 0xa5}}, + {Addr: 0x20, W: []uint8{0xa6, 0xa5}}, + {Addr: 0x20, W: []uint8{0xa6, 0xff}}, + {Addr: 0x20, R: []uint8{0xa6, 0xa6}}, + {Addr: 0x20, W: []uint8{0xa7, 0xa6}}, + {Addr: 0x20, W: []uint8{0xa7, 0xff}}, + {Addr: 0x20, R: []uint8{0xa7, 0xa7}}, + {Addr: 0x20, W: []uint8{0xa8, 0xa7}}, + {Addr: 0x20, W: []uint8{0xa8, 0xff}}, + {Addr: 0x20, R: []uint8{0xa8, 0xa8}}, + {Addr: 0x20, W: []uint8{0xa9, 0xa8}}, + {Addr: 0x20, W: []uint8{0xa9, 0xff}}, + {Addr: 0x20, R: []uint8{0xa9, 0xa9}}, + {Addr: 0x20, W: []uint8{0xaa, 0xa9}}, + {Addr: 0x20, W: []uint8{0xaa, 0xff}}, + {Addr: 0x20, R: []uint8{0xaa, 0xaa}}, + {Addr: 0x20, W: []uint8{0xab, 0xaa}}, + {Addr: 0x20, W: []uint8{0xab, 0xff}}, + {Addr: 0x20, R: []uint8{0xab, 0xab}}, + {Addr: 0x20, W: []uint8{0xac, 0xab}}, + {Addr: 0x20, W: []uint8{0xac, 0xff}}, + {Addr: 0x20, R: []uint8{0xac, 0xac}}, + {Addr: 0x20, W: []uint8{0xad, 0xac}}, + {Addr: 0x20, W: []uint8{0xad, 0xff}}, + {Addr: 0x20, R: []uint8{0xad, 0xad}}, + {Addr: 0x20, W: []uint8{0xae, 0xad}}, + {Addr: 0x20, W: []uint8{0xae, 0xff}}, + {Addr: 0x20, R: []uint8{0xae, 0xae}}, + {Addr: 0x20, W: []uint8{0xaf, 0xae}}, + {Addr: 0x20, W: []uint8{0xaf, 0xff}}, + {Addr: 0x20, R: []uint8{0xaf, 0xaf}}, + {Addr: 0x20, W: []uint8{0xb0, 0xaf}}, + {Addr: 0x20, W: []uint8{0xb0, 0xff}}, + {Addr: 0x20, R: []uint8{0xb0, 0xb0}}, + {Addr: 0x20, W: []uint8{0xb1, 0xb0}}, + {Addr: 0x20, W: []uint8{0xb1, 0xff}}, + {Addr: 0x20, R: []uint8{0xb1, 0xb1}}, + {Addr: 0x20, W: []uint8{0xb2, 0xb1}}, + {Addr: 0x20, W: []uint8{0xb2, 0xff}}, + {Addr: 0x20, R: []uint8{0xb2, 0xb2}}, + {Addr: 0x20, W: []uint8{0xb3, 0xb2}}, + {Addr: 0x20, W: []uint8{0xb3, 0xff}}, + {Addr: 0x20, R: []uint8{0xb3, 0xb3}}, + {Addr: 0x20, W: []uint8{0xb4, 0xb3}}, + {Addr: 0x20, W: []uint8{0xb4, 0xff}}, + {Addr: 0x20, R: []uint8{0xb4, 0xb4}}, + {Addr: 0x20, W: []uint8{0xb5, 0xb4}}, + {Addr: 0x20, W: []uint8{0xb5, 0xff}}, + {Addr: 0x20, R: []uint8{0xb5, 0xb5}}, + {Addr: 0x20, W: []uint8{0xb6, 0xb5}}, + {Addr: 0x20, W: []uint8{0xb6, 0xff}}, + {Addr: 0x20, R: []uint8{0xb6, 0xb6}}, + {Addr: 0x20, W: []uint8{0xb7, 0xb6}}, + {Addr: 0x20, W: []uint8{0xb7, 0xff}}, + {Addr: 0x20, R: []uint8{0xb7, 0xb7}}, + {Addr: 0x20, W: []uint8{0xb8, 0xb7}}, + {Addr: 0x20, W: []uint8{0xb8, 0xff}}, + {Addr: 0x20, R: []uint8{0xb8, 0xb8}}, + {Addr: 0x20, W: []uint8{0xb9, 0xb8}}, + {Addr: 0x20, W: []uint8{0xb9, 0xff}}, + {Addr: 0x20, R: []uint8{0xb9, 0xb9}}, + {Addr: 0x20, W: []uint8{0xba, 0xb9}}, + {Addr: 0x20, W: []uint8{0xba, 0xff}}, + {Addr: 0x20, R: []uint8{0xba, 0xba}}, + {Addr: 0x20, W: []uint8{0xbb, 0xba}}, + {Addr: 0x20, W: []uint8{0xbb, 0xff}}, + {Addr: 0x20, R: []uint8{0xbb, 0xbb}}, + {Addr: 0x20, W: []uint8{0xbc, 0xbb}}, + {Addr: 0x20, W: []uint8{0xbc, 0xff}}, + {Addr: 0x20, R: []uint8{0xbc, 0xbc}}, + {Addr: 0x20, W: []uint8{0xbd, 0xbc}}, + {Addr: 0x20, W: []uint8{0xbd, 0xff}}, + {Addr: 0x20, R: []uint8{0xbd, 0xbd}}, + {Addr: 0x20, W: []uint8{0xbe, 0xbd}}, + {Addr: 0x20, W: []uint8{0xbe, 0xff}}, + {Addr: 0x20, R: []uint8{0xbe, 0xbe}}, + {Addr: 0x20, W: []uint8{0xbf, 0xbe}}, + {Addr: 0x20, W: []uint8{0xbf, 0xff}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, W: []uint8{0xc0, 0xbf}}, + {Addr: 0x20, W: []uint8{0xc0, 0xff}}, + {Addr: 0x20, R: []uint8{0xc0, 0xc0}}, + {Addr: 0x20, W: []uint8{0xc1, 0xc0}}, + {Addr: 0x20, W: []uint8{0xc1, 0xff}}, + {Addr: 0x20, R: []uint8{0xc1, 0xc1}}, + {Addr: 0x20, W: []uint8{0xc2, 0xc1}}, + {Addr: 0x20, W: []uint8{0xc2, 0xff}}, + {Addr: 0x20, R: []uint8{0xc2, 0xc2}}, + {Addr: 0x20, W: []uint8{0xc3, 0xc2}}, + {Addr: 0x20, W: []uint8{0xc3, 0xff}}, + {Addr: 0x20, R: []uint8{0xc3, 0xc3}}, + {Addr: 0x20, W: []uint8{0xc4, 0xc3}}, + {Addr: 0x20, W: []uint8{0xc4, 0xff}}, + {Addr: 0x20, R: []uint8{0xc4, 0xc4}}, + {Addr: 0x20, W: []uint8{0xc5, 0xc4}}, + {Addr: 0x20, W: []uint8{0xc5, 0xff}}, + {Addr: 0x20, R: []uint8{0xc5, 0xc5}}, + {Addr: 0x20, W: []uint8{0xc6, 0xc5}}, + {Addr: 0x20, W: []uint8{0xc6, 0xff}}, + {Addr: 0x20, R: []uint8{0xc6, 0xc6}}, + {Addr: 0x20, W: []uint8{0xc7, 0xc6}}, + {Addr: 0x20, W: []uint8{0xc7, 0xff}}, + {Addr: 0x20, R: []uint8{0xc7, 0xc7}}, + {Addr: 0x20, W: []uint8{0xc8, 0xc7}}, + {Addr: 0x20, W: []uint8{0xc8, 0xff}}, + {Addr: 0x20, R: []uint8{0xc8, 0xc8}}, + {Addr: 0x20, W: []uint8{0xc9, 0xc8}}, + {Addr: 0x20, W: []uint8{0xc9, 0xff}}, + {Addr: 0x20, R: []uint8{0xc9, 0xc9}}, + {Addr: 0x20, W: []uint8{0xca, 0xc9}}, + {Addr: 0x20, W: []uint8{0xca, 0xff}}, + {Addr: 0x20, R: []uint8{0xca, 0xca}}, + {Addr: 0x20, W: []uint8{0xcb, 0xca}}, + {Addr: 0x20, W: []uint8{0xcb, 0xff}}, + {Addr: 0x20, R: []uint8{0xcb, 0xcb}}, + {Addr: 0x20, W: []uint8{0xcc, 0xcb}}, + {Addr: 0x20, W: []uint8{0xcc, 0xff}}, + {Addr: 0x20, R: []uint8{0xcc, 0xcc}}, + {Addr: 0x20, W: []uint8{0xcd, 0xcc}}, + {Addr: 0x20, W: []uint8{0xcd, 0xff}}, + {Addr: 0x20, R: []uint8{0xcd, 0xcd}}, + {Addr: 0x20, W: []uint8{0xce, 0xcd}}, + {Addr: 0x20, W: []uint8{0xce, 0xff}}, + {Addr: 0x20, R: []uint8{0xce, 0xce}}, + {Addr: 0x20, W: []uint8{0xcf, 0xce}}, + {Addr: 0x20, W: []uint8{0xcf, 0xff}}, + {Addr: 0x20, R: []uint8{0xcf, 0xcf}}, + {Addr: 0x20, W: []uint8{0xd0, 0xcf}}, + {Addr: 0x20, W: []uint8{0xd0, 0xff}}, + {Addr: 0x20, R: []uint8{0xd0, 0xd0}}, + {Addr: 0x20, W: []uint8{0xd1, 0xd0}}, + {Addr: 0x20, W: []uint8{0xd1, 0xff}}, + {Addr: 0x20, R: []uint8{0xd1, 0xd1}}, + {Addr: 0x20, W: []uint8{0xd2, 0xd1}}, + {Addr: 0x20, W: []uint8{0xd2, 0xff}}, + {Addr: 0x20, R: []uint8{0xd2, 0xd2}}, + {Addr: 0x20, W: []uint8{0xd3, 0xd2}}, + {Addr: 0x20, W: []uint8{0xd3, 0xff}}, + {Addr: 0x20, R: []uint8{0xd3, 0xd3}}, + {Addr: 0x20, W: []uint8{0xd4, 0xd3}}, + {Addr: 0x20, W: []uint8{0xd4, 0xff}}, + {Addr: 0x20, R: []uint8{0xd4, 0xd4}}, + {Addr: 0x20, W: []uint8{0xd5, 0xd4}}, + {Addr: 0x20, W: []uint8{0xd5, 0xff}}, + {Addr: 0x20, R: []uint8{0xd5, 0xd5}}, + {Addr: 0x20, W: []uint8{0xd6, 0xd5}}, + {Addr: 0x20, W: []uint8{0xd6, 0xff}}, + {Addr: 0x20, R: []uint8{0xd6, 0xd6}}, + {Addr: 0x20, W: []uint8{0xd7, 0xd6}}, + {Addr: 0x20, W: []uint8{0xd7, 0xff}}, + {Addr: 0x20, R: []uint8{0xd7, 0xd7}}, + {Addr: 0x20, W: []uint8{0xd8, 0xd7}}, + {Addr: 0x20, W: []uint8{0xd8, 0xff}}, + {Addr: 0x20, R: []uint8{0xd8, 0xd8}}, + {Addr: 0x20, W: []uint8{0xd9, 0xd8}}, + {Addr: 0x20, W: []uint8{0xd9, 0xff}}, + {Addr: 0x20, R: []uint8{0xd9, 0xd9}}, + {Addr: 0x20, W: []uint8{0xda, 0xd9}}, + {Addr: 0x20, W: []uint8{0xda, 0xff}}, + {Addr: 0x20, R: []uint8{0xda, 0xda}}, + {Addr: 0x20, W: []uint8{0xdb, 0xda}}, + {Addr: 0x20, W: []uint8{0xdb, 0xff}}, + {Addr: 0x20, R: []uint8{0xdb, 0xdb}}, + {Addr: 0x20, W: []uint8{0xdc, 0xdb}}, + {Addr: 0x20, W: []uint8{0xdc, 0xff}}, + {Addr: 0x20, R: []uint8{0xdc, 0xdc}}, + {Addr: 0x20, W: []uint8{0xdd, 0xdc}}, + {Addr: 0x20, W: []uint8{0xdd, 0xff}}, + {Addr: 0x20, R: []uint8{0xdd, 0xdd}}, + {Addr: 0x20, W: []uint8{0xde, 0xdd}}, + {Addr: 0x20, W: []uint8{0xde, 0xff}}, + {Addr: 0x20, R: []uint8{0xde, 0xde}}, + {Addr: 0x20, W: []uint8{0xdf, 0xde}}, + {Addr: 0x20, W: []uint8{0xdf, 0xff}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, W: []uint8{0xe0, 0xdf}}, + {Addr: 0x20, W: []uint8{0xe0, 0xff}}, + {Addr: 0x20, R: []uint8{0xe0, 0xe0}}, + {Addr: 0x20, W: []uint8{0xe1, 0xe0}}, + {Addr: 0x20, W: []uint8{0xe1, 0xff}}, + {Addr: 0x20, R: []uint8{0xe1, 0xe1}}, + {Addr: 0x20, W: []uint8{0xe2, 0xe1}}, + {Addr: 0x20, W: []uint8{0xe2, 0xff}}, + {Addr: 0x20, R: []uint8{0xe2, 0xe2}}, + {Addr: 0x20, W: []uint8{0xe3, 0xe2}}, + {Addr: 0x20, W: []uint8{0xe3, 0xff}}, + {Addr: 0x20, R: []uint8{0xe3, 0xe3}}, + {Addr: 0x20, W: []uint8{0xe4, 0xe3}}, + {Addr: 0x20, W: []uint8{0xe4, 0xff}}, + {Addr: 0x20, R: []uint8{0xe4, 0xe4}}, + {Addr: 0x20, W: []uint8{0xe5, 0xe4}}, + {Addr: 0x20, W: []uint8{0xe5, 0xff}}, + {Addr: 0x20, R: []uint8{0xe5, 0xe5}}, + {Addr: 0x20, W: []uint8{0xe6, 0xe5}}, + {Addr: 0x20, W: []uint8{0xe6, 0xff}}, + {Addr: 0x20, R: []uint8{0xe6, 0xe6}}, + {Addr: 0x20, W: []uint8{0xe7, 0xe6}}, + {Addr: 0x20, W: []uint8{0xe7, 0xff}}, + {Addr: 0x20, R: []uint8{0xe7, 0xe7}}, + {Addr: 0x20, W: []uint8{0xe8, 0xe7}}, + {Addr: 0x20, W: []uint8{0xe8, 0xff}}, + {Addr: 0x20, R: []uint8{0xe8, 0xe8}}, + {Addr: 0x20, W: []uint8{0xe9, 0xe8}}, + {Addr: 0x20, W: []uint8{0xe9, 0xff}}, + {Addr: 0x20, R: []uint8{0xe9, 0xe9}}, + {Addr: 0x20, W: []uint8{0xea, 0xe9}}, + {Addr: 0x20, W: []uint8{0xea, 0xff}}, + {Addr: 0x20, R: []uint8{0xea, 0xea}}, + {Addr: 0x20, W: []uint8{0xeb, 0xea}}, + {Addr: 0x20, W: []uint8{0xeb, 0xff}}, + {Addr: 0x20, R: []uint8{0xeb, 0xeb}}, + {Addr: 0x20, W: []uint8{0xec, 0xeb}}, + {Addr: 0x20, W: []uint8{0xec, 0xff}}, + {Addr: 0x20, R: []uint8{0xec, 0xec}}, + {Addr: 0x20, W: []uint8{0xed, 0xec}}, + {Addr: 0x20, W: []uint8{0xed, 0xff}}, + {Addr: 0x20, R: []uint8{0xed, 0xed}}, + {Addr: 0x20, W: []uint8{0xee, 0xed}}, + {Addr: 0x20, W: []uint8{0xee, 0xff}}, + {Addr: 0x20, R: []uint8{0xee, 0xee}}, + {Addr: 0x20, W: []uint8{0xef, 0xee}}, + {Addr: 0x20, W: []uint8{0xef, 0xff}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, W: []uint8{0xf0, 0xef}}, + {Addr: 0x20, W: []uint8{0xf0, 0xff}}, + {Addr: 0x20, R: []uint8{0xf0, 0xf0}}, + {Addr: 0x20, W: []uint8{0xf1, 0xf0}}, + {Addr: 0x20, W: []uint8{0xf1, 0xff}}, + {Addr: 0x20, R: []uint8{0xf1, 0xf1}}, + {Addr: 0x20, W: []uint8{0xf2, 0xf1}}, + {Addr: 0x20, W: []uint8{0xf2, 0xff}}, + {Addr: 0x20, R: []uint8{0xf2, 0xf2}}, + {Addr: 0x20, W: []uint8{0xf3, 0xf2}}, + {Addr: 0x20, W: []uint8{0xf3, 0xff}}, + {Addr: 0x20, R: []uint8{0xf3, 0xf3}}, + {Addr: 0x20, W: []uint8{0xf4, 0xf3}}, + {Addr: 0x20, W: []uint8{0xf4, 0xff}}, + {Addr: 0x20, R: []uint8{0xf4, 0xf4}}, + {Addr: 0x20, W: []uint8{0xf5, 0xf4}}, + {Addr: 0x20, W: []uint8{0xf5, 0xff}}, + {Addr: 0x20, R: []uint8{0xf5, 0xf5}}, + {Addr: 0x20, W: []uint8{0xf6, 0xf5}}, + {Addr: 0x20, W: []uint8{0xf6, 0xff}}, + {Addr: 0x20, R: []uint8{0xf6, 0xf6}}, + {Addr: 0x20, W: []uint8{0xf7, 0xf6}}, + {Addr: 0x20, W: []uint8{0xf7, 0xff}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, W: []uint8{0xf8, 0xf7}}, + {Addr: 0x20, W: []uint8{0xf8, 0xff}}, + {Addr: 0x20, R: []uint8{0xf8, 0xf8}}, + {Addr: 0x20, W: []uint8{0xf9, 0xf8}}, + {Addr: 0x20, W: []uint8{0xf9, 0xff}}, + {Addr: 0x20, R: []uint8{0xf9, 0xf9}}, + {Addr: 0x20, W: []uint8{0xfa, 0xf9}}, + {Addr: 0x20, W: []uint8{0xfa, 0xff}}, + {Addr: 0x20, R: []uint8{0xfa, 0xfa}}, + {Addr: 0x20, W: []uint8{0xfb, 0xfa}}, + {Addr: 0x20, W: []uint8{0xfb, 0xff}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, W: []uint8{0xfc, 0xfb}}, + {Addr: 0x20, W: []uint8{0xfc, 0xff}}, + {Addr: 0x20, R: []uint8{0xfc, 0xfc}}, + {Addr: 0x20, W: []uint8{0xfd, 0xfc}}, + {Addr: 0x20, W: []uint8{0xfd, 0xff}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, W: []uint8{0xfe, 0xfd}}, + {Addr: 0x20, W: []uint8{0xfe, 0xff}}, + {Addr: 0x20, R: []uint8{0xfe, 0xfe}}, + {Addr: 0x20, W: []uint8{0xff, 0xfe}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}, + {Addr: 0x20, W: []uint8{0xff, 0x0}}, + {Addr: 0x20, R: []uint8{0x0, 0x0}}, + {Addr: 0x20, W: []uint8{0x0, 0x1}}, + {Addr: 0x20, W: []uint8{0xff, 0x1}}, + {Addr: 0x20, R: []uint8{0x1, 0x1}}, + {Addr: 0x20, W: []uint8{0x1, 0x2}}, + {Addr: 0x20, W: []uint8{0xff, 0x2}}, + {Addr: 0x20, R: []uint8{0x2, 0x2}}, + {Addr: 0x20, W: []uint8{0x2, 0x3}}, + {Addr: 0x20, W: []uint8{0xff, 0x3}}, + {Addr: 0x20, R: []uint8{0x3, 0x3}}, + {Addr: 0x20, W: []uint8{0x3, 0x4}}, + {Addr: 0x20, W: []uint8{0xff, 0x4}}, + {Addr: 0x20, R: []uint8{0x4, 0x4}}, + {Addr: 0x20, W: []uint8{0x4, 0x5}}, + {Addr: 0x20, W: []uint8{0xff, 0x5}}, + {Addr: 0x20, R: []uint8{0x5, 0x5}}, + {Addr: 0x20, W: []uint8{0x5, 0x6}}, + {Addr: 0x20, W: []uint8{0xff, 0x6}}, + {Addr: 0x20, R: []uint8{0x6, 0x6}}, + {Addr: 0x20, W: []uint8{0x6, 0x7}}, + {Addr: 0x20, W: []uint8{0xff, 0x7}}, + {Addr: 0x20, R: []uint8{0x7, 0x7}}, + {Addr: 0x20, W: []uint8{0x7, 0x8}}, + {Addr: 0x20, W: []uint8{0xff, 0x8}}, + {Addr: 0x20, R: []uint8{0x8, 0x8}}, + {Addr: 0x20, W: []uint8{0x8, 0x9}}, + {Addr: 0x20, W: []uint8{0xff, 0x9}}, + {Addr: 0x20, R: []uint8{0x9, 0x9}}, + {Addr: 0x20, W: []uint8{0x9, 0xa}}, + {Addr: 0x20, W: []uint8{0xff, 0xa}}, + {Addr: 0x20, R: []uint8{0xa, 0xa}}, + {Addr: 0x20, W: []uint8{0xa, 0xb}}, + {Addr: 0x20, W: []uint8{0xff, 0xb}}, + {Addr: 0x20, R: []uint8{0xb, 0xb}}, + {Addr: 0x20, W: []uint8{0xb, 0xc}}, + {Addr: 0x20, W: []uint8{0xff, 0xc}}, + {Addr: 0x20, R: []uint8{0xc, 0xc}}, + {Addr: 0x20, W: []uint8{0xc, 0xd}}, + {Addr: 0x20, W: []uint8{0xff, 0xd}}, + {Addr: 0x20, R: []uint8{0xd, 0xd}}, + {Addr: 0x20, W: []uint8{0xd, 0xe}}, + {Addr: 0x20, W: []uint8{0xff, 0xe}}, + {Addr: 0x20, R: []uint8{0xe, 0xe}}, + {Addr: 0x20, W: []uint8{0xe, 0xf}}, + {Addr: 0x20, W: []uint8{0xff, 0xf}}, + {Addr: 0x20, R: []uint8{0xf, 0xf}}, + {Addr: 0x20, W: []uint8{0xf, 0x10}}, + {Addr: 0x20, W: []uint8{0xff, 0x10}}, + {Addr: 0x20, R: []uint8{0x10, 0x10}}, + {Addr: 0x20, W: []uint8{0x10, 0x11}}, + {Addr: 0x20, W: []uint8{0xff, 0x11}}, + {Addr: 0x20, R: []uint8{0x11, 0x11}}, + {Addr: 0x20, W: []uint8{0x11, 0x12}}, + {Addr: 0x20, W: []uint8{0xff, 0x12}}, + {Addr: 0x20, R: []uint8{0x12, 0x12}}, + {Addr: 0x20, W: []uint8{0x12, 0x13}}, + {Addr: 0x20, W: []uint8{0xff, 0x13}}, + {Addr: 0x20, R: []uint8{0x13, 0x13}}, + {Addr: 0x20, W: []uint8{0x13, 0x14}}, + {Addr: 0x20, W: []uint8{0xff, 0x14}}, + {Addr: 0x20, R: []uint8{0x14, 0x14}}, + {Addr: 0x20, W: []uint8{0x14, 0x15}}, + {Addr: 0x20, W: []uint8{0xff, 0x15}}, + {Addr: 0x20, R: []uint8{0x15, 0x15}}, + {Addr: 0x20, W: []uint8{0x15, 0x16}}, + {Addr: 0x20, W: []uint8{0xff, 0x16}}, + {Addr: 0x20, R: []uint8{0x16, 0x16}}, + {Addr: 0x20, W: []uint8{0x16, 0x17}}, + {Addr: 0x20, W: []uint8{0xff, 0x17}}, + {Addr: 0x20, R: []uint8{0x17, 0x17}}, + {Addr: 0x20, W: []uint8{0x17, 0x18}}, + {Addr: 0x20, W: []uint8{0xff, 0x18}}, + {Addr: 0x20, R: []uint8{0x18, 0x18}}, + {Addr: 0x20, W: []uint8{0x18, 0x19}}, + {Addr: 0x20, W: []uint8{0xff, 0x19}}, + {Addr: 0x20, R: []uint8{0x19, 0x19}}, + {Addr: 0x20, W: []uint8{0x19, 0x1a}}, + {Addr: 0x20, W: []uint8{0xff, 0x1a}}, + {Addr: 0x20, R: []uint8{0x1a, 0x1a}}, + {Addr: 0x20, W: []uint8{0x1a, 0x1b}}, + {Addr: 0x20, W: []uint8{0xff, 0x1b}}, + {Addr: 0x20, R: []uint8{0x1b, 0x1b}}, + {Addr: 0x20, W: []uint8{0x1b, 0x1c}}, + {Addr: 0x20, W: []uint8{0xff, 0x1c}}, + {Addr: 0x20, R: []uint8{0x1c, 0x1c}}, + {Addr: 0x20, W: []uint8{0x1c, 0x1d}}, + {Addr: 0x20, W: []uint8{0xff, 0x1d}}, + {Addr: 0x20, R: []uint8{0x1d, 0x1d}}, + {Addr: 0x20, W: []uint8{0x1d, 0x1e}}, + {Addr: 0x20, W: []uint8{0xff, 0x1e}}, + {Addr: 0x20, R: []uint8{0x1e, 0x1e}}, + {Addr: 0x20, W: []uint8{0x1e, 0x1f}}, + {Addr: 0x20, W: []uint8{0xff, 0x1f}}, + {Addr: 0x20, R: []uint8{0x1f, 0x1f}}, + {Addr: 0x20, W: []uint8{0x1f, 0x20}}, + {Addr: 0x20, W: []uint8{0xff, 0x20}}, + {Addr: 0x20, R: []uint8{0x20, 0x20}}, + {Addr: 0x20, W: []uint8{0x20, 0x21}}, + {Addr: 0x20, W: []uint8{0xff, 0x21}}, + {Addr: 0x20, R: []uint8{0x21, 0x21}}, + {Addr: 0x20, W: []uint8{0x21, 0x22}}, + {Addr: 0x20, W: []uint8{0xff, 0x22}}, + {Addr: 0x20, R: []uint8{0x22, 0x22}}, + {Addr: 0x20, W: []uint8{0x22, 0x23}}, + {Addr: 0x20, W: []uint8{0xff, 0x23}}, + {Addr: 0x20, R: []uint8{0x23, 0x23}}, + {Addr: 0x20, W: []uint8{0x23, 0x24}}, + {Addr: 0x20, W: []uint8{0xff, 0x24}}, + {Addr: 0x20, R: []uint8{0x24, 0x24}}, + {Addr: 0x20, W: []uint8{0x24, 0x25}}, + {Addr: 0x20, W: []uint8{0xff, 0x25}}, + {Addr: 0x20, R: []uint8{0x25, 0x25}}, + {Addr: 0x20, W: []uint8{0x25, 0x26}}, + {Addr: 0x20, W: []uint8{0xff, 0x26}}, + {Addr: 0x20, R: []uint8{0x26, 0x26}}, + {Addr: 0x20, W: []uint8{0x26, 0x27}}, + {Addr: 0x20, W: []uint8{0xff, 0x27}}, + {Addr: 0x20, R: []uint8{0x27, 0x27}}, + {Addr: 0x20, W: []uint8{0x27, 0x28}}, + {Addr: 0x20, W: []uint8{0xff, 0x28}}, + {Addr: 0x20, R: []uint8{0x28, 0x28}}, + {Addr: 0x20, W: []uint8{0x28, 0x29}}, + {Addr: 0x20, W: []uint8{0xff, 0x29}}, + {Addr: 0x20, R: []uint8{0x29, 0x29}}, + {Addr: 0x20, W: []uint8{0x29, 0x2a}}, + {Addr: 0x20, W: []uint8{0xff, 0x2a}}, + {Addr: 0x20, R: []uint8{0x2a, 0x2a}}, + {Addr: 0x20, W: []uint8{0x2a, 0x2b}}, + {Addr: 0x20, W: []uint8{0xff, 0x2b}}, + {Addr: 0x20, R: []uint8{0x2b, 0x2b}}, + {Addr: 0x20, W: []uint8{0x2b, 0x2c}}, + {Addr: 0x20, W: []uint8{0xff, 0x2c}}, + {Addr: 0x20, R: []uint8{0x2c, 0x2c}}, + {Addr: 0x20, W: []uint8{0x2c, 0x2d}}, + {Addr: 0x20, W: []uint8{0xff, 0x2d}}, + {Addr: 0x20, R: []uint8{0x2d, 0x2d}}, + {Addr: 0x20, W: []uint8{0x2d, 0x2e}}, + {Addr: 0x20, W: []uint8{0xff, 0x2e}}, + {Addr: 0x20, R: []uint8{0x2e, 0x2e}}, + {Addr: 0x20, W: []uint8{0x2e, 0x2f}}, + {Addr: 0x20, W: []uint8{0xff, 0x2f}}, + {Addr: 0x20, R: []uint8{0x2f, 0x2f}}, + {Addr: 0x20, W: []uint8{0x2f, 0x30}}, + {Addr: 0x20, W: []uint8{0xff, 0x30}}, + {Addr: 0x20, R: []uint8{0x30, 0x30}}, + {Addr: 0x20, W: []uint8{0x30, 0x31}}, + {Addr: 0x20, W: []uint8{0xff, 0x31}}, + {Addr: 0x20, R: []uint8{0x31, 0x31}}, + {Addr: 0x20, W: []uint8{0x31, 0x32}}, + {Addr: 0x20, W: []uint8{0xff, 0x32}}, + {Addr: 0x20, R: []uint8{0x32, 0x32}}, + {Addr: 0x20, W: []uint8{0x32, 0x33}}, + {Addr: 0x20, W: []uint8{0xff, 0x33}}, + {Addr: 0x20, R: []uint8{0x33, 0x33}}, + {Addr: 0x20, W: []uint8{0x33, 0x34}}, + {Addr: 0x20, W: []uint8{0xff, 0x34}}, + {Addr: 0x20, R: []uint8{0x34, 0x34}}, + {Addr: 0x20, W: []uint8{0x34, 0x35}}, + {Addr: 0x20, W: []uint8{0xff, 0x35}}, + {Addr: 0x20, R: []uint8{0x35, 0x35}}, + {Addr: 0x20, W: []uint8{0x35, 0x36}}, + {Addr: 0x20, W: []uint8{0xff, 0x36}}, + {Addr: 0x20, R: []uint8{0x36, 0x36}}, + {Addr: 0x20, W: []uint8{0x36, 0x37}}, + {Addr: 0x20, W: []uint8{0xff, 0x37}}, + {Addr: 0x20, R: []uint8{0x37, 0x37}}, + {Addr: 0x20, W: []uint8{0x37, 0x38}}, + {Addr: 0x20, W: []uint8{0xff, 0x38}}, + {Addr: 0x20, R: []uint8{0x38, 0x38}}, + {Addr: 0x20, W: []uint8{0x38, 0x39}}, + {Addr: 0x20, W: []uint8{0xff, 0x39}}, + {Addr: 0x20, R: []uint8{0x39, 0x39}}, + {Addr: 0x20, W: []uint8{0x39, 0x3a}}, + {Addr: 0x20, W: []uint8{0xff, 0x3a}}, + {Addr: 0x20, R: []uint8{0x3a, 0x3a}}, + {Addr: 0x20, W: []uint8{0x3a, 0x3b}}, + {Addr: 0x20, W: []uint8{0xff, 0x3b}}, + {Addr: 0x20, R: []uint8{0x3b, 0x3b}}, + {Addr: 0x20, W: []uint8{0x3b, 0x3c}}, + {Addr: 0x20, W: []uint8{0xff, 0x3c}}, + {Addr: 0x20, R: []uint8{0x3c, 0x3c}}, + {Addr: 0x20, W: []uint8{0x3c, 0x3d}}, + {Addr: 0x20, W: []uint8{0xff, 0x3d}}, + {Addr: 0x20, R: []uint8{0x3d, 0x3d}}, + {Addr: 0x20, W: []uint8{0x3d, 0x3e}}, + {Addr: 0x20, W: []uint8{0xff, 0x3e}}, + {Addr: 0x20, R: []uint8{0x3e, 0x3e}}, + {Addr: 0x20, W: []uint8{0x3e, 0x3f}}, + {Addr: 0x20, W: []uint8{0xff, 0x3f}}, + {Addr: 0x20, R: []uint8{0x3f, 0x3f}}, + {Addr: 0x20, W: []uint8{0x3f, 0x40}}, + {Addr: 0x20, W: []uint8{0xff, 0x40}}, + {Addr: 0x20, R: []uint8{0x40, 0x40}}, + {Addr: 0x20, W: []uint8{0x40, 0x41}}, + {Addr: 0x20, W: []uint8{0xff, 0x41}}, + {Addr: 0x20, R: []uint8{0x41, 0x41}}, + {Addr: 0x20, W: []uint8{0x41, 0x42}}, + {Addr: 0x20, W: []uint8{0xff, 0x42}}, + {Addr: 0x20, R: []uint8{0x42, 0x42}}, + {Addr: 0x20, W: []uint8{0x42, 0x43}}, + {Addr: 0x20, W: []uint8{0xff, 0x43}}, + {Addr: 0x20, R: []uint8{0x43, 0x43}}, + {Addr: 0x20, W: []uint8{0x43, 0x44}}, + {Addr: 0x20, W: []uint8{0xff, 0x44}}, + {Addr: 0x20, R: []uint8{0x44, 0x44}}, + {Addr: 0x20, W: []uint8{0x44, 0x45}}, + {Addr: 0x20, W: []uint8{0xff, 0x45}}, + {Addr: 0x20, R: []uint8{0x45, 0x45}}, + {Addr: 0x20, W: []uint8{0x45, 0x46}}, + {Addr: 0x20, W: []uint8{0xff, 0x46}}, + {Addr: 0x20, R: []uint8{0x46, 0x46}}, + {Addr: 0x20, W: []uint8{0x46, 0x47}}, + {Addr: 0x20, W: []uint8{0xff, 0x47}}, + {Addr: 0x20, R: []uint8{0x47, 0x47}}, + {Addr: 0x20, W: []uint8{0x47, 0x48}}, + {Addr: 0x20, W: []uint8{0xff, 0x48}}, + {Addr: 0x20, R: []uint8{0x48, 0x48}}, + {Addr: 0x20, W: []uint8{0x48, 0x49}}, + {Addr: 0x20, W: []uint8{0xff, 0x49}}, + {Addr: 0x20, R: []uint8{0x49, 0x49}}, + {Addr: 0x20, W: []uint8{0x49, 0x4a}}, + {Addr: 0x20, W: []uint8{0xff, 0x4a}}, + {Addr: 0x20, R: []uint8{0x4a, 0x4a}}, + {Addr: 0x20, W: []uint8{0x4a, 0x4b}}, + {Addr: 0x20, W: []uint8{0xff, 0x4b}}, + {Addr: 0x20, R: []uint8{0x4b, 0x4b}}, + {Addr: 0x20, W: []uint8{0x4b, 0x4c}}, + {Addr: 0x20, W: []uint8{0xff, 0x4c}}, + {Addr: 0x20, R: []uint8{0x4c, 0x4c}}, + {Addr: 0x20, W: []uint8{0x4c, 0x4d}}, + {Addr: 0x20, W: []uint8{0xff, 0x4d}}, + {Addr: 0x20, R: []uint8{0x4d, 0x4d}}, + {Addr: 0x20, W: []uint8{0x4d, 0x4e}}, + {Addr: 0x20, W: []uint8{0xff, 0x4e}}, + {Addr: 0x20, R: []uint8{0x4e, 0x4e}}, + {Addr: 0x20, W: []uint8{0x4e, 0x4f}}, + {Addr: 0x20, W: []uint8{0xff, 0x4f}}, + {Addr: 0x20, R: []uint8{0x4f, 0x4f}}, + {Addr: 0x20, W: []uint8{0x4f, 0x50}}, + {Addr: 0x20, W: []uint8{0xff, 0x50}}, + {Addr: 0x20, R: []uint8{0x50, 0x50}}, + {Addr: 0x20, W: []uint8{0x50, 0x51}}, + {Addr: 0x20, W: []uint8{0xff, 0x51}}, + {Addr: 0x20, R: []uint8{0x51, 0x51}}, + {Addr: 0x20, W: []uint8{0x51, 0x52}}, + {Addr: 0x20, W: []uint8{0xff, 0x52}}, + {Addr: 0x20, R: []uint8{0x52, 0x52}}, + {Addr: 0x20, W: []uint8{0x52, 0x53}}, + {Addr: 0x20, W: []uint8{0xff, 0x53}}, + {Addr: 0x20, R: []uint8{0x53, 0x53}}, + {Addr: 0x20, W: []uint8{0x53, 0x54}}, + {Addr: 0x20, W: []uint8{0xff, 0x54}}, + {Addr: 0x20, R: []uint8{0x54, 0x54}}, + {Addr: 0x20, W: []uint8{0x54, 0x55}}, + {Addr: 0x20, W: []uint8{0xff, 0x55}}, + {Addr: 0x20, R: []uint8{0x55, 0x55}}, + {Addr: 0x20, W: []uint8{0x55, 0x56}}, + {Addr: 0x20, W: []uint8{0xff, 0x56}}, + {Addr: 0x20, R: []uint8{0x56, 0x56}}, + {Addr: 0x20, W: []uint8{0x56, 0x57}}, + {Addr: 0x20, W: []uint8{0xff, 0x57}}, + {Addr: 0x20, R: []uint8{0x57, 0x57}}, + {Addr: 0x20, W: []uint8{0x57, 0x58}}, + {Addr: 0x20, W: []uint8{0xff, 0x58}}, + {Addr: 0x20, R: []uint8{0x58, 0x58}}, + {Addr: 0x20, W: []uint8{0x58, 0x59}}, + {Addr: 0x20, W: []uint8{0xff, 0x59}}, + {Addr: 0x20, R: []uint8{0x59, 0x59}}, + {Addr: 0x20, W: []uint8{0x59, 0x5a}}, + {Addr: 0x20, W: []uint8{0xff, 0x5a}}, + {Addr: 0x20, R: []uint8{0x5a, 0x5a}}, + {Addr: 0x20, W: []uint8{0x5a, 0x5b}}, + {Addr: 0x20, W: []uint8{0xff, 0x5b}}, + {Addr: 0x20, R: []uint8{0x5b, 0x5b}}, + {Addr: 0x20, W: []uint8{0x5b, 0x5c}}, + {Addr: 0x20, W: []uint8{0xff, 0x5c}}, + {Addr: 0x20, R: []uint8{0x5c, 0x5c}}, + {Addr: 0x20, W: []uint8{0x5c, 0x5d}}, + {Addr: 0x20, W: []uint8{0xff, 0x5d}}, + {Addr: 0x20, R: []uint8{0x5d, 0x5d}}, + {Addr: 0x20, W: []uint8{0x5d, 0x5e}}, + {Addr: 0x20, W: []uint8{0xff, 0x5e}}, + {Addr: 0x20, R: []uint8{0x5e, 0x5e}}, + {Addr: 0x20, W: []uint8{0x5e, 0x5f}}, + {Addr: 0x20, W: []uint8{0xff, 0x5f}}, + {Addr: 0x20, R: []uint8{0x5f, 0x5f}}, + {Addr: 0x20, W: []uint8{0x5f, 0x60}}, + {Addr: 0x20, W: []uint8{0xff, 0x60}}, + {Addr: 0x20, R: []uint8{0x60, 0x60}}, + {Addr: 0x20, W: []uint8{0x60, 0x61}}, + {Addr: 0x20, W: []uint8{0xff, 0x61}}, + {Addr: 0x20, R: []uint8{0x61, 0x61}}, + {Addr: 0x20, W: []uint8{0x61, 0x62}}, + {Addr: 0x20, W: []uint8{0xff, 0x62}}, + {Addr: 0x20, R: []uint8{0x62, 0x62}}, + {Addr: 0x20, W: []uint8{0x62, 0x63}}, + {Addr: 0x20, W: []uint8{0xff, 0x63}}, + {Addr: 0x20, R: []uint8{0x63, 0x63}}, + {Addr: 0x20, W: []uint8{0x63, 0x64}}, + {Addr: 0x20, W: []uint8{0xff, 0x64}}, + {Addr: 0x20, R: []uint8{0x64, 0x64}}, + {Addr: 0x20, W: []uint8{0x64, 0x65}}, + {Addr: 0x20, W: []uint8{0xff, 0x65}}, + {Addr: 0x20, R: []uint8{0x65, 0x65}}, + {Addr: 0x20, W: []uint8{0x65, 0x66}}, + {Addr: 0x20, W: []uint8{0xff, 0x66}}, + {Addr: 0x20, R: []uint8{0x66, 0x66}}, + {Addr: 0x20, W: []uint8{0x66, 0x67}}, + {Addr: 0x20, W: []uint8{0xff, 0x67}}, + {Addr: 0x20, R: []uint8{0x67, 0x67}}, + {Addr: 0x20, W: []uint8{0x67, 0x68}}, + {Addr: 0x20, W: []uint8{0xff, 0x68}}, + {Addr: 0x20, R: []uint8{0x68, 0x68}}, + {Addr: 0x20, W: []uint8{0x68, 0x69}}, + {Addr: 0x20, W: []uint8{0xff, 0x69}}, + {Addr: 0x20, R: []uint8{0x69, 0x69}}, + {Addr: 0x20, W: []uint8{0x69, 0x6a}}, + {Addr: 0x20, W: []uint8{0xff, 0x6a}}, + {Addr: 0x20, R: []uint8{0x6a, 0x6a}}, + {Addr: 0x20, W: []uint8{0x6a, 0x6b}}, + {Addr: 0x20, W: []uint8{0xff, 0x6b}}, + {Addr: 0x20, R: []uint8{0x6b, 0x6b}}, + {Addr: 0x20, W: []uint8{0x6b, 0x6c}}, + {Addr: 0x20, W: []uint8{0xff, 0x6c}}, + {Addr: 0x20, R: []uint8{0x6c, 0x6c}}, + {Addr: 0x20, W: []uint8{0x6c, 0x6d}}, + {Addr: 0x20, W: []uint8{0xff, 0x6d}}, + {Addr: 0x20, R: []uint8{0x6d, 0x6d}}, + {Addr: 0x20, W: []uint8{0x6d, 0x6e}}, + {Addr: 0x20, W: []uint8{0xff, 0x6e}}, + {Addr: 0x20, R: []uint8{0x6e, 0x6e}}, + {Addr: 0x20, W: []uint8{0x6e, 0x6f}}, + {Addr: 0x20, W: []uint8{0xff, 0x6f}}, + {Addr: 0x20, R: []uint8{0x6f, 0x6f}}, + {Addr: 0x20, W: []uint8{0x6f, 0x70}}, + {Addr: 0x20, W: []uint8{0xff, 0x70}}, + {Addr: 0x20, R: []uint8{0x70, 0x70}}, + {Addr: 0x20, W: []uint8{0x70, 0x71}}, + {Addr: 0x20, W: []uint8{0xff, 0x71}}, + {Addr: 0x20, R: []uint8{0x71, 0x71}}, + {Addr: 0x20, W: []uint8{0x71, 0x72}}, + {Addr: 0x20, W: []uint8{0xff, 0x72}}, + {Addr: 0x20, R: []uint8{0x72, 0x72}}, + {Addr: 0x20, W: []uint8{0x72, 0x73}}, + {Addr: 0x20, W: []uint8{0xff, 0x73}}, + {Addr: 0x20, R: []uint8{0x73, 0x73}}, + {Addr: 0x20, W: []uint8{0x73, 0x74}}, + {Addr: 0x20, W: []uint8{0xff, 0x74}}, + {Addr: 0x20, R: []uint8{0x74, 0x74}}, + {Addr: 0x20, W: []uint8{0x74, 0x75}}, + {Addr: 0x20, W: []uint8{0xff, 0x75}}, + {Addr: 0x20, R: []uint8{0x75, 0x75}}, + {Addr: 0x20, W: []uint8{0x75, 0x76}}, + {Addr: 0x20, W: []uint8{0xff, 0x76}}, + {Addr: 0x20, R: []uint8{0x76, 0x76}}, + {Addr: 0x20, W: []uint8{0x76, 0x77}}, + {Addr: 0x20, W: []uint8{0xff, 0x77}}, + {Addr: 0x20, R: []uint8{0x77, 0x77}}, + {Addr: 0x20, W: []uint8{0x77, 0x78}}, + {Addr: 0x20, W: []uint8{0xff, 0x78}}, + {Addr: 0x20, R: []uint8{0x78, 0x78}}, + {Addr: 0x20, W: []uint8{0x78, 0x79}}, + {Addr: 0x20, W: []uint8{0xff, 0x79}}, + {Addr: 0x20, R: []uint8{0x79, 0x79}}, + {Addr: 0x20, W: []uint8{0x79, 0x7a}}, + {Addr: 0x20, W: []uint8{0xff, 0x7a}}, + {Addr: 0x20, R: []uint8{0x7a, 0x7a}}, + {Addr: 0x20, W: []uint8{0x7a, 0x7b}}, + {Addr: 0x20, W: []uint8{0xff, 0x7b}}, + {Addr: 0x20, R: []uint8{0x7b, 0x7b}}, + {Addr: 0x20, W: []uint8{0x7b, 0x7c}}, + {Addr: 0x20, W: []uint8{0xff, 0x7c}}, + {Addr: 0x20, R: []uint8{0x7c, 0x7c}}, + {Addr: 0x20, W: []uint8{0x7c, 0x7d}}, + {Addr: 0x20, W: []uint8{0xff, 0x7d}}, + {Addr: 0x20, R: []uint8{0x7d, 0x7d}}, + {Addr: 0x20, W: []uint8{0x7d, 0x7e}}, + {Addr: 0x20, W: []uint8{0xff, 0x7e}}, + {Addr: 0x20, R: []uint8{0x7e, 0x7e}}, + {Addr: 0x20, W: []uint8{0x7e, 0x7f}}, + {Addr: 0x20, W: []uint8{0xff, 0x7f}}, + {Addr: 0x20, R: []uint8{0x7f, 0x7f}}, + {Addr: 0x20, W: []uint8{0x7f, 0x80}}, + {Addr: 0x20, W: []uint8{0xff, 0x80}}, + {Addr: 0x20, R: []uint8{0x80, 0x80}}, + {Addr: 0x20, W: []uint8{0x80, 0x81}}, + {Addr: 0x20, W: []uint8{0xff, 0x81}}, + {Addr: 0x20, R: []uint8{0x81, 0x81}}, + {Addr: 0x20, W: []uint8{0x81, 0x82}}, + {Addr: 0x20, W: []uint8{0xff, 0x82}}, + {Addr: 0x20, R: []uint8{0x82, 0x82}}, + {Addr: 0x20, W: []uint8{0x82, 0x83}}, + {Addr: 0x20, W: []uint8{0xff, 0x83}}, + {Addr: 0x20, R: []uint8{0x83, 0x83}}, + {Addr: 0x20, W: []uint8{0x83, 0x84}}, + {Addr: 0x20, W: []uint8{0xff, 0x84}}, + {Addr: 0x20, R: []uint8{0x84, 0x84}}, + {Addr: 0x20, W: []uint8{0x84, 0x85}}, + {Addr: 0x20, W: []uint8{0xff, 0x85}}, + {Addr: 0x20, R: []uint8{0x85, 0x85}}, + {Addr: 0x20, W: []uint8{0x85, 0x86}}, + {Addr: 0x20, W: []uint8{0xff, 0x86}}, + {Addr: 0x20, R: []uint8{0x86, 0x86}}, + {Addr: 0x20, W: []uint8{0x86, 0x87}}, + {Addr: 0x20, W: []uint8{0xff, 0x87}}, + {Addr: 0x20, R: []uint8{0x87, 0x87}}, + {Addr: 0x20, W: []uint8{0x87, 0x88}}, + {Addr: 0x20, W: []uint8{0xff, 0x88}}, + {Addr: 0x20, R: []uint8{0x88, 0x88}}, + {Addr: 0x20, W: []uint8{0x88, 0x89}}, + {Addr: 0x20, W: []uint8{0xff, 0x89}}, + {Addr: 0x20, R: []uint8{0x89, 0x89}}, + {Addr: 0x20, W: []uint8{0x89, 0x8a}}, + {Addr: 0x20, W: []uint8{0xff, 0x8a}}, + {Addr: 0x20, R: []uint8{0x8a, 0x8a}}, + {Addr: 0x20, W: []uint8{0x8a, 0x8b}}, + {Addr: 0x20, W: []uint8{0xff, 0x8b}}, + {Addr: 0x20, R: []uint8{0x8b, 0x8b}}, + {Addr: 0x20, W: []uint8{0x8b, 0x8c}}, + {Addr: 0x20, W: []uint8{0xff, 0x8c}}, + {Addr: 0x20, R: []uint8{0x8c, 0x8c}}, + {Addr: 0x20, W: []uint8{0x8c, 0x8d}}, + {Addr: 0x20, W: []uint8{0xff, 0x8d}}, + {Addr: 0x20, R: []uint8{0x8d, 0x8d}}, + {Addr: 0x20, W: []uint8{0x8d, 0x8e}}, + {Addr: 0x20, W: []uint8{0xff, 0x8e}}, + {Addr: 0x20, R: []uint8{0x8e, 0x8e}}, + {Addr: 0x20, W: []uint8{0x8e, 0x8f}}, + {Addr: 0x20, W: []uint8{0xff, 0x8f}}, + {Addr: 0x20, R: []uint8{0x8f, 0x8f}}, + {Addr: 0x20, W: []uint8{0x8f, 0x90}}, + {Addr: 0x20, W: []uint8{0xff, 0x90}}, + {Addr: 0x20, R: []uint8{0x90, 0x90}}, + {Addr: 0x20, W: []uint8{0x90, 0x91}}, + {Addr: 0x20, W: []uint8{0xff, 0x91}}, + {Addr: 0x20, R: []uint8{0x91, 0x91}}, + {Addr: 0x20, W: []uint8{0x91, 0x92}}, + {Addr: 0x20, W: []uint8{0xff, 0x92}}, + {Addr: 0x20, R: []uint8{0x92, 0x92}}, + {Addr: 0x20, W: []uint8{0x92, 0x93}}, + {Addr: 0x20, W: []uint8{0xff, 0x93}}, + {Addr: 0x20, R: []uint8{0x93, 0x93}}, + {Addr: 0x20, W: []uint8{0x93, 0x94}}, + {Addr: 0x20, W: []uint8{0xff, 0x94}}, + {Addr: 0x20, R: []uint8{0x94, 0x94}}, + {Addr: 0x20, W: []uint8{0x94, 0x95}}, + {Addr: 0x20, W: []uint8{0xff, 0x95}}, + {Addr: 0x20, R: []uint8{0x95, 0x95}}, + {Addr: 0x20, W: []uint8{0x95, 0x96}}, + {Addr: 0x20, W: []uint8{0xff, 0x96}}, + {Addr: 0x20, R: []uint8{0x96, 0x96}}, + {Addr: 0x20, W: []uint8{0x96, 0x97}}, + {Addr: 0x20, W: []uint8{0xff, 0x97}}, + {Addr: 0x20, R: []uint8{0x97, 0x97}}, + {Addr: 0x20, W: []uint8{0x97, 0x98}}, + {Addr: 0x20, W: []uint8{0xff, 0x98}}, + {Addr: 0x20, R: []uint8{0x98, 0x98}}, + {Addr: 0x20, W: []uint8{0x98, 0x99}}, + {Addr: 0x20, W: []uint8{0xff, 0x99}}, + {Addr: 0x20, R: []uint8{0x99, 0x99}}, + {Addr: 0x20, W: []uint8{0x99, 0x9a}}, + {Addr: 0x20, W: []uint8{0xff, 0x9a}}, + {Addr: 0x20, R: []uint8{0x9a, 0x9a}}, + {Addr: 0x20, W: []uint8{0x9a, 0x9b}}, + {Addr: 0x20, W: []uint8{0xff, 0x9b}}, + {Addr: 0x20, R: []uint8{0x9b, 0x9b}}, + {Addr: 0x20, W: []uint8{0x9b, 0x9c}}, + {Addr: 0x20, W: []uint8{0xff, 0x9c}}, + {Addr: 0x20, R: []uint8{0x9c, 0x9c}}, + {Addr: 0x20, W: []uint8{0x9c, 0x9d}}, + {Addr: 0x20, W: []uint8{0xff, 0x9d}}, + {Addr: 0x20, R: []uint8{0x9d, 0x9d}}, + {Addr: 0x20, W: []uint8{0x9d, 0x9e}}, + {Addr: 0x20, W: []uint8{0xff, 0x9e}}, + {Addr: 0x20, R: []uint8{0x9e, 0x9e}}, + {Addr: 0x20, W: []uint8{0x9e, 0x9f}}, + {Addr: 0x20, W: []uint8{0xff, 0x9f}}, + {Addr: 0x20, R: []uint8{0x9f, 0x9f}}, + {Addr: 0x20, W: []uint8{0x9f, 0xa0}}, + {Addr: 0x20, W: []uint8{0xff, 0xa0}}, + {Addr: 0x20, R: []uint8{0xa0, 0xa0}}, + {Addr: 0x20, W: []uint8{0xa0, 0xa1}}, + {Addr: 0x20, W: []uint8{0xff, 0xa1}}, + {Addr: 0x20, R: []uint8{0xa1, 0xa1}}, + {Addr: 0x20, W: []uint8{0xa1, 0xa2}}, + {Addr: 0x20, W: []uint8{0xff, 0xa2}}, + {Addr: 0x20, R: []uint8{0xa2, 0xa2}}, + {Addr: 0x20, W: []uint8{0xa2, 0xa3}}, + {Addr: 0x20, W: []uint8{0xff, 0xa3}}, + {Addr: 0x20, R: []uint8{0xa3, 0xa3}}, + {Addr: 0x20, W: []uint8{0xa3, 0xa4}}, + {Addr: 0x20, W: []uint8{0xff, 0xa4}}, + {Addr: 0x20, R: []uint8{0xa4, 0xa4}}, + {Addr: 0x20, W: []uint8{0xa4, 0xa5}}, + {Addr: 0x20, W: []uint8{0xff, 0xa5}}, + {Addr: 0x20, R: []uint8{0xa5, 0xa5}}, + {Addr: 0x20, W: []uint8{0xa5, 0xa6}}, + {Addr: 0x20, W: []uint8{0xff, 0xa6}}, + {Addr: 0x20, R: []uint8{0xa6, 0xa6}}, + {Addr: 0x20, W: []uint8{0xa6, 0xa7}}, + {Addr: 0x20, W: []uint8{0xff, 0xa7}}, + {Addr: 0x20, R: []uint8{0xa7, 0xa7}}, + {Addr: 0x20, W: []uint8{0xa7, 0xa8}}, + {Addr: 0x20, W: []uint8{0xff, 0xa8}}, + {Addr: 0x20, R: []uint8{0xa8, 0xa8}}, + {Addr: 0x20, W: []uint8{0xa8, 0xa9}}, + {Addr: 0x20, W: []uint8{0xff, 0xa9}}, + {Addr: 0x20, R: []uint8{0xa9, 0xa9}}, + {Addr: 0x20, W: []uint8{0xa9, 0xaa}}, + {Addr: 0x20, W: []uint8{0xff, 0xaa}}, + {Addr: 0x20, R: []uint8{0xaa, 0xaa}}, + {Addr: 0x20, W: []uint8{0xaa, 0xab}}, + {Addr: 0x20, W: []uint8{0xff, 0xab}}, + {Addr: 0x20, R: []uint8{0xab, 0xab}}, + {Addr: 0x20, W: []uint8{0xab, 0xac}}, + {Addr: 0x20, W: []uint8{0xff, 0xac}}, + {Addr: 0x20, R: []uint8{0xac, 0xac}}, + {Addr: 0x20, W: []uint8{0xac, 0xad}}, + {Addr: 0x20, W: []uint8{0xff, 0xad}}, + {Addr: 0x20, R: []uint8{0xad, 0xad}}, + {Addr: 0x20, W: []uint8{0xad, 0xae}}, + {Addr: 0x20, W: []uint8{0xff, 0xae}}, + {Addr: 0x20, R: []uint8{0xae, 0xae}}, + {Addr: 0x20, W: []uint8{0xae, 0xaf}}, + {Addr: 0x20, W: []uint8{0xff, 0xaf}}, + {Addr: 0x20, R: []uint8{0xaf, 0xaf}}, + {Addr: 0x20, W: []uint8{0xaf, 0xb0}}, + {Addr: 0x20, W: []uint8{0xff, 0xb0}}, + {Addr: 0x20, R: []uint8{0xb0, 0xb0}}, + {Addr: 0x20, W: []uint8{0xb0, 0xb1}}, + {Addr: 0x20, W: []uint8{0xff, 0xb1}}, + {Addr: 0x20, R: []uint8{0xb1, 0xb1}}, + {Addr: 0x20, W: []uint8{0xb1, 0xb2}}, + {Addr: 0x20, W: []uint8{0xff, 0xb2}}, + {Addr: 0x20, R: []uint8{0xb2, 0xb2}}, + {Addr: 0x20, W: []uint8{0xb2, 0xb3}}, + {Addr: 0x20, W: []uint8{0xff, 0xb3}}, + {Addr: 0x20, R: []uint8{0xb3, 0xb3}}, + {Addr: 0x20, W: []uint8{0xb3, 0xb4}}, + {Addr: 0x20, W: []uint8{0xff, 0xb4}}, + {Addr: 0x20, R: []uint8{0xb4, 0xb4}}, + {Addr: 0x20, W: []uint8{0xb4, 0xb5}}, + {Addr: 0x20, W: []uint8{0xff, 0xb5}}, + {Addr: 0x20, R: []uint8{0xb5, 0xb5}}, + {Addr: 0x20, W: []uint8{0xb5, 0xb6}}, + {Addr: 0x20, W: []uint8{0xff, 0xb6}}, + {Addr: 0x20, R: []uint8{0xb6, 0xb6}}, + {Addr: 0x20, W: []uint8{0xb6, 0xb7}}, + {Addr: 0x20, W: []uint8{0xff, 0xb7}}, + {Addr: 0x20, R: []uint8{0xb7, 0xb7}}, + {Addr: 0x20, W: []uint8{0xb7, 0xb8}}, + {Addr: 0x20, W: []uint8{0xff, 0xb8}}, + {Addr: 0x20, R: []uint8{0xb8, 0xb8}}, + {Addr: 0x20, W: []uint8{0xb8, 0xb9}}, + {Addr: 0x20, W: []uint8{0xff, 0xb9}}, + {Addr: 0x20, R: []uint8{0xb9, 0xb9}}, + {Addr: 0x20, W: []uint8{0xb9, 0xba}}, + {Addr: 0x20, W: []uint8{0xff, 0xba}}, + {Addr: 0x20, R: []uint8{0xba, 0xba}}, + {Addr: 0x20, W: []uint8{0xba, 0xbb}}, + {Addr: 0x20, W: []uint8{0xff, 0xbb}}, + {Addr: 0x20, R: []uint8{0xbb, 0xbb}}, + {Addr: 0x20, W: []uint8{0xbb, 0xbc}}, + {Addr: 0x20, W: []uint8{0xff, 0xbc}}, + {Addr: 0x20, R: []uint8{0xbc, 0xbc}}, + {Addr: 0x20, W: []uint8{0xbc, 0xbd}}, + {Addr: 0x20, W: []uint8{0xff, 0xbd}}, + {Addr: 0x20, R: []uint8{0xbd, 0xbd}}, + {Addr: 0x20, W: []uint8{0xbd, 0xbe}}, + {Addr: 0x20, W: []uint8{0xff, 0xbe}}, + {Addr: 0x20, R: []uint8{0xbe, 0xbe}}, + {Addr: 0x20, W: []uint8{0xbe, 0xbf}}, + {Addr: 0x20, W: []uint8{0xff, 0xbf}}, + {Addr: 0x20, R: []uint8{0xbf, 0xbf}}, + {Addr: 0x20, W: []uint8{0xbf, 0xc0}}, + {Addr: 0x20, W: []uint8{0xff, 0xc0}}, + {Addr: 0x20, R: []uint8{0xc0, 0xc0}}, + {Addr: 0x20, W: []uint8{0xc0, 0xc1}}, + {Addr: 0x20, W: []uint8{0xff, 0xc1}}, + {Addr: 0x20, R: []uint8{0xc1, 0xc1}}, + {Addr: 0x20, W: []uint8{0xc1, 0xc2}}, + {Addr: 0x20, W: []uint8{0xff, 0xc2}}, + {Addr: 0x20, R: []uint8{0xc2, 0xc2}}, + {Addr: 0x20, W: []uint8{0xc2, 0xc3}}, + {Addr: 0x20, W: []uint8{0xff, 0xc3}}, + {Addr: 0x20, R: []uint8{0xc3, 0xc3}}, + {Addr: 0x20, W: []uint8{0xc3, 0xc4}}, + {Addr: 0x20, W: []uint8{0xff, 0xc4}}, + {Addr: 0x20, R: []uint8{0xc4, 0xc4}}, + {Addr: 0x20, W: []uint8{0xc4, 0xc5}}, + {Addr: 0x20, W: []uint8{0xff, 0xc5}}, + {Addr: 0x20, R: []uint8{0xc5, 0xc5}}, + {Addr: 0x20, W: []uint8{0xc5, 0xc6}}, + {Addr: 0x20, W: []uint8{0xff, 0xc6}}, + {Addr: 0x20, R: []uint8{0xc6, 0xc6}}, + {Addr: 0x20, W: []uint8{0xc6, 0xc7}}, + {Addr: 0x20, W: []uint8{0xff, 0xc7}}, + {Addr: 0x20, R: []uint8{0xc7, 0xc7}}, + {Addr: 0x20, W: []uint8{0xc7, 0xc8}}, + {Addr: 0x20, W: []uint8{0xff, 0xc8}}, + {Addr: 0x20, R: []uint8{0xc8, 0xc8}}, + {Addr: 0x20, W: []uint8{0xc8, 0xc9}}, + {Addr: 0x20, W: []uint8{0xff, 0xc9}}, + {Addr: 0x20, R: []uint8{0xc9, 0xc9}}, + {Addr: 0x20, W: []uint8{0xc9, 0xca}}, + {Addr: 0x20, W: []uint8{0xff, 0xca}}, + {Addr: 0x20, R: []uint8{0xca, 0xca}}, + {Addr: 0x20, W: []uint8{0xca, 0xcb}}, + {Addr: 0x20, W: []uint8{0xff, 0xcb}}, + {Addr: 0x20, R: []uint8{0xcb, 0xcb}}, + {Addr: 0x20, W: []uint8{0xcb, 0xcc}}, + {Addr: 0x20, W: []uint8{0xff, 0xcc}}, + {Addr: 0x20, R: []uint8{0xcc, 0xcc}}, + {Addr: 0x20, W: []uint8{0xcc, 0xcd}}, + {Addr: 0x20, W: []uint8{0xff, 0xcd}}, + {Addr: 0x20, R: []uint8{0xcd, 0xcd}}, + {Addr: 0x20, W: []uint8{0xcd, 0xce}}, + {Addr: 0x20, W: []uint8{0xff, 0xce}}, + {Addr: 0x20, R: []uint8{0xce, 0xce}}, + {Addr: 0x20, W: []uint8{0xce, 0xcf}}, + {Addr: 0x20, W: []uint8{0xff, 0xcf}}, + {Addr: 0x20, R: []uint8{0xcf, 0xcf}}, + {Addr: 0x20, W: []uint8{0xcf, 0xd0}}, + {Addr: 0x20, W: []uint8{0xff, 0xd0}}, + {Addr: 0x20, R: []uint8{0xd0, 0xd0}}, + {Addr: 0x20, W: []uint8{0xd0, 0xd1}}, + {Addr: 0x20, W: []uint8{0xff, 0xd1}}, + {Addr: 0x20, R: []uint8{0xd1, 0xd1}}, + {Addr: 0x20, W: []uint8{0xd1, 0xd2}}, + {Addr: 0x20, W: []uint8{0xff, 0xd2}}, + {Addr: 0x20, R: []uint8{0xd2, 0xd2}}, + {Addr: 0x20, W: []uint8{0xd2, 0xd3}}, + {Addr: 0x20, W: []uint8{0xff, 0xd3}}, + {Addr: 0x20, R: []uint8{0xd3, 0xd3}}, + {Addr: 0x20, W: []uint8{0xd3, 0xd4}}, + {Addr: 0x20, W: []uint8{0xff, 0xd4}}, + {Addr: 0x20, R: []uint8{0xd4, 0xd4}}, + {Addr: 0x20, W: []uint8{0xd4, 0xd5}}, + {Addr: 0x20, W: []uint8{0xff, 0xd5}}, + {Addr: 0x20, R: []uint8{0xd5, 0xd5}}, + {Addr: 0x20, W: []uint8{0xd5, 0xd6}}, + {Addr: 0x20, W: []uint8{0xff, 0xd6}}, + {Addr: 0x20, R: []uint8{0xd6, 0xd6}}, + {Addr: 0x20, W: []uint8{0xd6, 0xd7}}, + {Addr: 0x20, W: []uint8{0xff, 0xd7}}, + {Addr: 0x20, R: []uint8{0xd7, 0xd7}}, + {Addr: 0x20, W: []uint8{0xd7, 0xd8}}, + {Addr: 0x20, W: []uint8{0xff, 0xd8}}, + {Addr: 0x20, R: []uint8{0xd8, 0xd8}}, + {Addr: 0x20, W: []uint8{0xd8, 0xd9}}, + {Addr: 0x20, W: []uint8{0xff, 0xd9}}, + {Addr: 0x20, R: []uint8{0xd9, 0xd9}}, + {Addr: 0x20, W: []uint8{0xd9, 0xda}}, + {Addr: 0x20, W: []uint8{0xff, 0xda}}, + {Addr: 0x20, R: []uint8{0xda, 0xda}}, + {Addr: 0x20, W: []uint8{0xda, 0xdb}}, + {Addr: 0x20, W: []uint8{0xff, 0xdb}}, + {Addr: 0x20, R: []uint8{0xdb, 0xdb}}, + {Addr: 0x20, W: []uint8{0xdb, 0xdc}}, + {Addr: 0x20, W: []uint8{0xff, 0xdc}}, + {Addr: 0x20, R: []uint8{0xdc, 0xdc}}, + {Addr: 0x20, W: []uint8{0xdc, 0xdd}}, + {Addr: 0x20, W: []uint8{0xff, 0xdd}}, + {Addr: 0x20, R: []uint8{0xdd, 0xdd}}, + {Addr: 0x20, W: []uint8{0xdd, 0xde}}, + {Addr: 0x20, W: []uint8{0xff, 0xde}}, + {Addr: 0x20, R: []uint8{0xde, 0xde}}, + {Addr: 0x20, W: []uint8{0xde, 0xdf}}, + {Addr: 0x20, W: []uint8{0xff, 0xdf}}, + {Addr: 0x20, R: []uint8{0xdf, 0xdf}}, + {Addr: 0x20, W: []uint8{0xdf, 0xe0}}, + {Addr: 0x20, W: []uint8{0xff, 0xe0}}, + {Addr: 0x20, R: []uint8{0xe0, 0xe0}}, + {Addr: 0x20, W: []uint8{0xe0, 0xe1}}, + {Addr: 0x20, W: []uint8{0xff, 0xe1}}, + {Addr: 0x20, R: []uint8{0xe1, 0xe1}}, + {Addr: 0x20, W: []uint8{0xe1, 0xe2}}, + {Addr: 0x20, W: []uint8{0xff, 0xe2}}, + {Addr: 0x20, R: []uint8{0xe2, 0xe2}}, + {Addr: 0x20, W: []uint8{0xe2, 0xe3}}, + {Addr: 0x20, W: []uint8{0xff, 0xe3}}, + {Addr: 0x20, R: []uint8{0xe3, 0xe3}}, + {Addr: 0x20, W: []uint8{0xe3, 0xe4}}, + {Addr: 0x20, W: []uint8{0xff, 0xe4}}, + {Addr: 0x20, R: []uint8{0xe4, 0xe4}}, + {Addr: 0x20, W: []uint8{0xe4, 0xe5}}, + {Addr: 0x20, W: []uint8{0xff, 0xe5}}, + {Addr: 0x20, R: []uint8{0xe5, 0xe5}}, + {Addr: 0x20, W: []uint8{0xe5, 0xe6}}, + {Addr: 0x20, W: []uint8{0xff, 0xe6}}, + {Addr: 0x20, R: []uint8{0xe6, 0xe6}}, + {Addr: 0x20, W: []uint8{0xe6, 0xe7}}, + {Addr: 0x20, W: []uint8{0xff, 0xe7}}, + {Addr: 0x20, R: []uint8{0xe7, 0xe7}}, + {Addr: 0x20, W: []uint8{0xe7, 0xe8}}, + {Addr: 0x20, W: []uint8{0xff, 0xe8}}, + {Addr: 0x20, R: []uint8{0xe8, 0xe8}}, + {Addr: 0x20, W: []uint8{0xe8, 0xe9}}, + {Addr: 0x20, W: []uint8{0xff, 0xe9}}, + {Addr: 0x20, R: []uint8{0xe9, 0xe9}}, + {Addr: 0x20, W: []uint8{0xe9, 0xea}}, + {Addr: 0x20, W: []uint8{0xff, 0xea}}, + {Addr: 0x20, R: []uint8{0xea, 0xea}}, + {Addr: 0x20, W: []uint8{0xea, 0xeb}}, + {Addr: 0x20, W: []uint8{0xff, 0xeb}}, + {Addr: 0x20, R: []uint8{0xeb, 0xeb}}, + {Addr: 0x20, W: []uint8{0xeb, 0xec}}, + {Addr: 0x20, W: []uint8{0xff, 0xec}}, + {Addr: 0x20, R: []uint8{0xec, 0xec}}, + {Addr: 0x20, W: []uint8{0xec, 0xed}}, + {Addr: 0x20, W: []uint8{0xff, 0xed}}, + {Addr: 0x20, R: []uint8{0xed, 0xed}}, + {Addr: 0x20, W: []uint8{0xed, 0xee}}, + {Addr: 0x20, W: []uint8{0xff, 0xee}}, + {Addr: 0x20, R: []uint8{0xee, 0xee}}, + {Addr: 0x20, W: []uint8{0xee, 0xef}}, + {Addr: 0x20, W: []uint8{0xff, 0xef}}, + {Addr: 0x20, R: []uint8{0xef, 0xef}}, + {Addr: 0x20, W: []uint8{0xef, 0xf0}}, + {Addr: 0x20, W: []uint8{0xff, 0xf0}}, + {Addr: 0x20, R: []uint8{0xf0, 0xf0}}, + {Addr: 0x20, W: []uint8{0xf0, 0xf1}}, + {Addr: 0x20, W: []uint8{0xff, 0xf1}}, + {Addr: 0x20, R: []uint8{0xf1, 0xf1}}, + {Addr: 0x20, W: []uint8{0xf1, 0xf2}}, + {Addr: 0x20, W: []uint8{0xff, 0xf2}}, + {Addr: 0x20, R: []uint8{0xf2, 0xf2}}, + {Addr: 0x20, W: []uint8{0xf2, 0xf3}}, + {Addr: 0x20, W: []uint8{0xff, 0xf3}}, + {Addr: 0x20, R: []uint8{0xf3, 0xf3}}, + {Addr: 0x20, W: []uint8{0xf3, 0xf4}}, + {Addr: 0x20, W: []uint8{0xff, 0xf4}}, + {Addr: 0x20, R: []uint8{0xf4, 0xf4}}, + {Addr: 0x20, W: []uint8{0xf4, 0xf5}}, + {Addr: 0x20, W: []uint8{0xff, 0xf5}}, + {Addr: 0x20, R: []uint8{0xf5, 0xf5}}, + {Addr: 0x20, W: []uint8{0xf5, 0xf6}}, + {Addr: 0x20, W: []uint8{0xff, 0xf6}}, + {Addr: 0x20, R: []uint8{0xf6, 0xf6}}, + {Addr: 0x20, W: []uint8{0xf6, 0xf7}}, + {Addr: 0x20, W: []uint8{0xff, 0xf7}}, + {Addr: 0x20, R: []uint8{0xf7, 0xf7}}, + {Addr: 0x20, W: []uint8{0xf7, 0xf8}}, + {Addr: 0x20, W: []uint8{0xff, 0xf8}}, + {Addr: 0x20, R: []uint8{0xf8, 0xf8}}, + {Addr: 0x20, W: []uint8{0xf8, 0xf9}}, + {Addr: 0x20, W: []uint8{0xff, 0xf9}}, + {Addr: 0x20, R: []uint8{0xf9, 0xf9}}, + {Addr: 0x20, W: []uint8{0xf9, 0xfa}}, + {Addr: 0x20, W: []uint8{0xff, 0xfa}}, + {Addr: 0x20, R: []uint8{0xfa, 0xfa}}, + {Addr: 0x20, W: []uint8{0xfa, 0xfb}}, + {Addr: 0x20, W: []uint8{0xff, 0xfb}}, + {Addr: 0x20, R: []uint8{0xfb, 0xfb}}, + {Addr: 0x20, W: []uint8{0xfb, 0xfc}}, + {Addr: 0x20, W: []uint8{0xff, 0xfc}}, + {Addr: 0x20, R: []uint8{0xfc, 0xfc}}, + {Addr: 0x20, W: []uint8{0xfc, 0xfd}}, + {Addr: 0x20, W: []uint8{0xff, 0xfd}}, + {Addr: 0x20, R: []uint8{0xfd, 0xfd}}, + {Addr: 0x20, W: []uint8{0xfd, 0xfe}}, + {Addr: 0x20, W: []uint8{0xff, 0xfe}}, + {Addr: 0x20, R: []uint8{0xfe, 0xfe}}, + {Addr: 0x20, W: []uint8{0xfe, 0xff}}, + {Addr: 0x20, W: []uint8{0xff, 0xff}}, + {Addr: 0x20, R: []uint8{0xff, 0xff}}}, +} diff --git a/pcf857x/pins.go b/pcf857x/pins.go new file mode 100644 index 0000000..461639a --- /dev/null +++ b/pcf857x/pins.go @@ -0,0 +1,92 @@ +// Copyright 2025 The Periph Authors. All rights reserved. +// Use of this source code is governed under the Apache License, Version 2.0 +// that can be found in the LICENSE file. + +package pcf857x + +import ( + "log" + "time" + + "periph.io/x/conn/v3/gpio" + "periph.io/x/conn/v3/physic" +) + +type pcfPin struct { + dev *Dev + number int + name string +} + +func (pin *pcfPin) DefaultPull() gpio.Pull { + return gpio.Float +} + +func (pin *pcfPin) Function() string { + return "Out" +} + +func (pcf *pcfPin) Halt() error { + return nil +} + +func (pin *pcfPin) In(pull gpio.Pull, edge gpio.Edge) error { + // To use a pin for input, you must write a High to that pin, and then + // perform the read. The chip doesn't natively support pullup/pulldown. + // + // Refer to the datasheet for more information. + v := gpio.GPIOValue(1 << pin.number) + return pin.dev.write(v, v) +} + +func (pin *pcfPin) Name() string { + return pin.name +} + +func (pin *pcfPin) Number() int { + return pin.number +} + +func (pin *pcfPin) Out(l gpio.Level) error { + value := gpio.GPIOValue(0) + mask := gpio.GPIOValue(1 << pin.number) + if l { + value = mask + } + return pin.dev.write(value, mask) +} + +func (pin *pcfPin) Pull() gpio.Pull { + return gpio.Float +} + +func (pin *pcfPin) Read() gpio.Level { + + result := gpio.Low + mask := gpio.GPIOValue(1 << pin.number) + + value, err := pin.dev.read(mask) + if err == nil { + result = (value & mask) == mask + } else { + log.Println(err) + } + + return result +} + +func (pin *pcfPin) PWM(duty gpio.Duty, f physic.Frequency) error { + return ErrNotImplmented +} + +func (pin *pcfPin) String() string { + return pin.name +} + +// This device has an interrupt pin that can detect a change on the GPIO lines, +// however it doesn't let you detect a change on a specific pin. +func (pin *pcfPin) WaitForEdge(timeout time.Duration) bool { + return false +} + +var _ gpio.PinIO = &pcfPin{}