├── .gitignore ├── Makefile ├── README.md ├── build └── .keep ├── logo ├── pda6502_back logo.ai ├── pda6502_back logo.eps ├── pda6502_back logo.jpg ├── pda6502_back logo.pdf ├── pda6502_back logo.png ├── pda6502_white logo.ai ├── pda6502_white logo.eps ├── pda6502_white logo.jpg ├── pda6502_white logo.pdf └── pda6502_white logo.png ├── memory.conf ├── schematics ├── .gitignore ├── README.md ├── ds1813.lbr ├── pda.lbr ├── pda6502.brd ├── pda6502.sch └── v1 │ ├── pda6502.GBL │ ├── pda6502.GBO │ ├── pda6502.GBS │ ├── pda6502.GML │ ├── pda6502.GTL │ ├── pda6502.GTO │ ├── pda6502.GTS │ └── pda6502.TXT ├── src ├── bignum.s ├── bitwise.s ├── encoding.s ├── fat.s ├── font.s ├── font_data.s ├── ili9340.s ├── kernal.s ├── memory.s ├── sd.s ├── sleep.s ├── spi.s ├── ssd1306.s ├── stack.s └── vectors.s └── tools ├── MEEPROMMERfirmware.ino └── meepromer.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Transient build artifacts. 2 | *.o 3 | 4 | # Final build artifacts. 5 | /build/* 6 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SOURCES=$(wildcard src/*.s) 2 | OBJECTS=$(SOURCES:.s=.o) 3 | 4 | CA = ca65 5 | CAFLAGS = --debug-info 6 | LD = ld65 7 | LDFLAGS = --mapfile build/memory.map --config memory.conf --dbgfile build/debug 8 | 9 | .DUMMY: all 10 | 11 | all: $(OBJECTS) 12 | $(LD) $(LDFLAGS) $^ 13 | 14 | src/%.o: src/%.s 15 | $(CA) $(CAFLAGS) -o $@ $(@:.o=.s) 16 | 17 | clean: 18 | $(RM) $(OBJECTS) build/* 19 | 20 | 21 | .DUMMY: burn burnchar burnkernal 22 | MEEPROMER = ./tools/meepromer.py -c /dev/cu.usbmodem14* 23 | 24 | burn: burnchar burnkernal 25 | burnchar: writechar verifychar 26 | burnkernal: writekernal verifykernal 27 | 28 | writechar: 29 | $(MEEPROMER) -w -a 0x0000 -b 4 -f build/char.rom 30 | 31 | verifychar: 32 | $(MEEPROMER) -v -a 0x0000 -b 4 -f build/char.rom 33 | 34 | writekernal: 35 | $(MEEPROMER) -w -a 0x1000 -b 4 -f build/kernal.rom 36 | 37 | verifykernal: 38 | $(MEEPROMER) -v -a 0x1000 -b 4 -f build/kernal.rom 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | pda6502 2 | ======= 3 | 4 | pda6502 is a home-built computer powered by an 8-bit [6502][6502] CPU 5 | ([WDC 65C02][65C02]), varitions of which powered the venerable Commodore 64, 6 | Apple II, Vic 20, Nintendo and lots more. 7 | 8 | [74HC-series][7400] logic chips map the 64K address space to 32K RAM, 8K ROM, a 9 | [6522 VIA I/O controller][6522], and room for expansion. 10 | 11 | The first output device (beyond flashing LEDs) is a [128x32 pixel OLED][oled], 12 | connected to one of the VIA 6522 parallel ports, with bit-banged serial comms. 13 | 14 | It's currently exclusively running the 6502 assembly code which I've written in 15 | the `src/` directory of this project. As of April 2014, it can bit-bang SPI on 16 | the VIA parallel ports to drive the OLED display, rendering text using the old 17 | Commodore 64 font data. 18 | 19 | The code is assembled with [ca65][ca65], part of the [cc65][cc65] 6502 20 | development package. 21 | 22 | 23 | Notes 24 | ----- 25 | 26 | ILI9340 SPI performance; filling 200x200 square. 27 | baseline: 4.5 seconds. 28 | 29 | 30 | Emulator 31 | -------- 32 | 33 | I've also written [go6502][go6502], an emulator for this system. 34 | 35 | go6502 features a stepping debugger with breakpoints on instruction type, 36 | register values and memory location. This makes it far easier to get code 37 | working correctly before writing it to an actual EEPROM. 38 | 39 | 40 | Address layout 41 | -------------- 42 | 43 | Considerations: 44 | 45 | * 6502 has 16-bit address bus; can address 64K memory. 46 | * Zero-page (0x0000..0x00FF) must be RAM, used as external registers. 47 | * Stack (0x0100..0x00FF) must be RAM. 48 | * PC (program counter) is initialized from 0xFFFC, so must be ROM. 49 | * 6522 VIA (I/O) has 4-bit RS (register select), needs 16 bytes mapped. 50 | * AT28C64 EEPROMs are 8kb. I have some. 51 | * Nice to have: 52 | * Fancy bank-switching (e.g. ROMs overlaying RAM, C64-style). 53 | * Different mapping for read vs. write, e.g. read ROM, write RAM. 54 | 55 | 74HC521/74HC688 can route a specific page (256 bytes, upper 8 bits of address) 56 | to a destination. See http://wilsonminesco.com/6502primer/addr_decoding.html 57 | 58 | So using the highest three pins of the address bus, the memory space 59 | can be divided down to 8K blocks. 60 | 61 | A simple RAM+ROM+IO scheme: 62 | Allows for future extensions e.g. upper 32K RAM, with ROMs and I/O overlaid. 63 | 64 | * 0x0000..0x7FFF: 32K RAM, uninterrupted. Contains zero-page and stack. 65 | * 0x8000..0xBFFF: (reserved) 66 | * 0xC000..0xCFFF: 4K I/O (initially only 16 bytes used by 6522 VIA) 67 | * 0xD000..0xDFFF: (reserved) 68 | * 0xE000..0xFFFF: 8K ROM ("kernal" [sic]) 69 | 70 | Address table for upper 3 bits of address bus: 71 | 72 | NOTE: A15 can directly control RAM's CE/OE. 73 | This means a 74HC138 decoder can run on A12..14 74 | (With A15 as the '138 active-high enable input) 75 | 76 | Address bus 4 KB chunks: 77 | 78 | ``` 79 | High Dec Dec 80 | Seg Bits In Out Base Function 81 | ------------------------------------------------ 82 | 0 0000 0x0000 RAM 83 | 1 0001 0x1000 RAM 84 | 2 0010 0x2000 RAM 85 | 3 0011 0x3000 RAM 86 | 4 0100 0x4000 RAM 87 | 5 0101 0x5000 RAM 88 | 6 0110 0x6000 RAM 89 | 7 0111 0x7000 RAM 90 | 8 1000 000 0 0x8000 91 | 9 1001 100 4 0x9000 IO (VIA) (should be at 0xC000) 92 | A 1010 010 2 0xA000 93 | B 1011 110 6 0xB000 ROM (KERNAL) (should be at 0xE000) 94 | C 1100 001 1 0xC000 95 | D 1101 101 5 0xD000 96 | E 1110 011 3 0xE000 97 | F 1111 111 7 0xF000 ROM (KERNAL) 98 | ``` 99 | 100 | * 74HC138 (3-to-8 decoder) 101 | * G1 (active-high enable) driven by A15 (only active 0x8000 and above) 102 | * G2 (active-low enable) permanently LOW/enabled. 103 | * Inputs A, B, C driven by A12, A13, A14. 104 | * Output Y4 enables VIA. 105 | * Output Y6 & Y7 drive KERNAL ROM via AND gate. 106 | * 74HC08 (Quad 2-input AND gates) 107 | * Input A1, B1 from 74HC138 Y6, Y7, output Y1 to KERNAL ROM CE/OE. 108 | * Input A2, B2 from phase2, A15, output Y2 to RAM CS/OE. 109 | * Three spare AND gates. 110 | * 74HC00 (Quad 2-input NAND gates) 111 | * Input A1, B1 from A15 (as inverter), output Y1 to A2. 112 | * Input A2, B2 from Y1, phase2 clock, output Y2 to RAM CS/OE. 113 | * VIA 6522 114 | * CS1 permanently HIGH/active. 115 | * CS2B to 74HC138 Y4 (LOW/active for `0b1110____`). 116 | * Data 0..7 to data bus D0..7. 117 | * Address 0..3 to address bus A0..3. 118 | * RWB to 6502 RWB. 119 | * PHI2 to system oscillator, same as 6502. 120 | * RESB to reset button, same as 6502. 121 | * ROM AT28C64 122 | * CE and OE both active-low, tied together. 123 | * CE/OE to 74HC08 Y1, (LOW/active for `0b111_____`) 124 | * WE permanently HIGH/inactive. 125 | * I/O 0..7 to data bus D0..7. 126 | * Address 0..12 to address bus A0..12. 127 | * RAM (32Kx8 CMOS SRAM; UM61256AK-12) 128 | * CE and OE both active-low, tied together. 129 | * CE/OE driven by A15+phase2 via 74HC00 (LOW/active for `0b0_______`) 130 | * WE (active low) to 6502 RWB. 131 | * Address 0..14 to address bus A0..14. 132 | 133 | 134 | Zero Page 135 | --------- 136 | 137 | The zero page (`0x0000..0x00FF`) is frequently used as "external registers". 138 | 139 | Note that Some 6502 derivatives dedicate the first few bytes to hardware ports and 140 | control registers, best avoid those? e.g. 6510 in C64 uses at least two. 141 | 142 | 143 | 144 | [6502]: http://en.wikipedia.org/wiki/MOS_Technology_6502 145 | [65C02]: http://en.wikipedia.org/wiki/WDC_65C02 146 | [6522]: http://en.wikipedia.org/wiki/MOS_Technology_6522 147 | [7400]: http://en.wikipedia.org/wiki/List_of_7400_series_integrated_circuits 148 | [oled]: https://www.adafruit.com/products/661 149 | [golang]: http://golang.org/ 150 | [go6502]: https://github.com/pda/go6502 151 | [ca65]: http://cc65.github.io/cc65/doc/ca65.html 152 | [cc65]: http://cc65.github.io/cc65/ 153 | -------------------------------------------------------------------------------- /build/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/build/.keep -------------------------------------------------------------------------------- /logo/pda6502_back logo.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_back logo.ai -------------------------------------------------------------------------------- /logo/pda6502_back logo.eps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_back logo.eps -------------------------------------------------------------------------------- /logo/pda6502_back logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_back logo.jpg -------------------------------------------------------------------------------- /logo/pda6502_back logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_back logo.pdf -------------------------------------------------------------------------------- /logo/pda6502_back logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_back logo.png -------------------------------------------------------------------------------- /logo/pda6502_white logo.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_white logo.ai -------------------------------------------------------------------------------- /logo/pda6502_white logo.eps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_white logo.eps -------------------------------------------------------------------------------- /logo/pda6502_white logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_white logo.jpg -------------------------------------------------------------------------------- /logo/pda6502_white logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_white logo.pdf -------------------------------------------------------------------------------- /logo/pda6502_white logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/logo/pda6502_white logo.png -------------------------------------------------------------------------------- /memory.conf: -------------------------------------------------------------------------------- 1 | # Memory layout and linker configuration for cc65 / ld65. 2 | # See: http://cc65.github.io/cc65/ 3 | # See: http://cc65.github.io/cc65/doc/ld65.html 4 | 5 | MEMORY { 6 | ram: 7 | start = $0, 8 | size = $8000, 9 | file = ""; 10 | 11 | rom_lo: 12 | start = $B000, 13 | size = $1000, 14 | file = "build/char.rom"; 15 | 16 | rom_hi: 17 | start = $F000, 18 | size = $1000, 19 | file = "build/kernal.rom"; 20 | } 21 | 22 | SEGMENTS { 23 | char: 24 | load = rom_lo, 25 | type = ro; 26 | 27 | kernal: 28 | load = rom_hi, 29 | type = ro; 30 | 31 | vectors: 32 | load = rom_hi, 33 | type = ro, 34 | start = $FFFA; 35 | 36 | kernal_bss: 37 | load = ram, 38 | type = bss, 39 | define = yes, 40 | start = $0800; 41 | } 42 | -------------------------------------------------------------------------------- /schematics/.gitignore: -------------------------------------------------------------------------------- 1 | # Eagle auto-save and temporary files. 2 | *.b#* 3 | *.l#* 4 | *.s#* 5 | *~renumsch.scr 6 | *.pro 7 | -------------------------------------------------------------------------------- /schematics/README.md: -------------------------------------------------------------------------------- 1 | pda6502 schematics 2 | ================== 3 | 4 | Schematics for pda6502 hardware builds. 5 | 6 | Disclaimer: I have no idea what I'm doing. 7 | 8 | First iteration is aiming towards a core board for the 6502, 6522, ROM, RAM and 9 | oscillator. It would connect the power, data bus, address bus, reset lines and 10 | clock lines. All other functionality (including memory-mapping logic) would be 11 | external via headers. 12 | 13 | A 2x10 header exposes the 6522 VIA ports A and B and their control lines. 14 | 15 | Notes / TODO 16 | ------------ 17 | 18 | 19 | ERRORS: 20 | 21 | * A,B,C inputs to 74HC138 reversed! 22 | * Moves VIA from $C000 to $9000. 23 | * Moves lower half of kernal ROM from $E000 to $B000. 24 | * 47uF cap footprint too small. 25 | * reset button footprint too small. 26 | * Expansion font too light for silkscreen printing. 27 | 28 | 29 | Micro B USB socket: 30 | Dangerous Prototypes Eagle library. 31 | Device: CONN-USB-MICRO-B 32 | USB micro-b connector SMT 0.65 mm pitch, 1.45mm from center to PCB edge, Based on TE part number 1981568-1 33 | http://www.mouser.com/ProductDetail/TE-Connectivity-AMP/1981568-1/?qs=zxTme0yW/baAfvOKTKC5hw== 34 | 35 | 36 | Memory mapping logic 37 | -------------------- 38 | 39 | * IN: CPU A12 40 | * IN: CPU A13 41 | * IN: CPU A14 42 | * IN: CPU A15 43 | * IN: CPU PHI2 44 | * IN: CPU PHI1O 45 | * IN: CPU RWB 46 | * OUT: RAM OE+CE 47 | * OUT: ROM OE+CE 48 | * OUT: VIA CS2B 49 | 50 | 51 | Logic chips: 52 | 53 | * 74HC00 (quad NAND) acting as inverter, NAND gate, and AND gate. 54 | * 74HC138 (3-bit decoder) to split the upper-half of address space. 55 | 56 | Propagation times: 57 | 58 | * 74HC00 gates: typical 8 ns, max 23 ns. 59 | * 74HC138: typical 15 ns, max 38 ns. 60 | 61 | * RAM: invert (NAND) + NAND = typical 16 ns, max 46 ns. 62 | * VIA: 74HC138 = typical 15 ns, max 38 ns. 63 | * ROM: 74HC138 + (NAND + NAND) = typical 31 ns, max 84 ns. 64 | 65 | * RAM speed: 12 ns 66 | * ROM speed: 250 ns or 120 ns? 150 ns for Atmel AT28C256-15 67 | 68 | 69 | 70 | 71 | Power characteristics 72 | --------------------- 73 | 74 | Designing for maximum of 1A current should be plenty: 75 | 76 | [vreg]: http://www.mouser.com/Search/ProductDetail.aspx?R=MC7805CDTRKGvirtualkey58410000virtualkey863-MC7805CDTRKG 77 | 78 | ``` 79 | 65C02: 12 mA @ 8 MHz; 1.5 mA per MHz supply current (loaded) 80 | 65C22: 4 mA @ 8 MHz; 0.5 mA per MHz supply current (loaded) 81 | 28C64: 30 mA max. 82 | SRAM: 200 mA max; 80 mA typical 83 | ========== 84 | 246 mA max (chips) 85 | ========== 86 | TFT: 100 mA 87 | uSD: 100 mA (max during writes) 88 | xprot: 60 mA 89 | oled: 20 mA 90 | ========== 91 | 526 mA 92 | ========== 93 | ``` 94 | -------------------------------------------------------------------------------- /schematics/ds1813.lbr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pda/pda6502/ff2a63a2f3dc8d8e8f50fc8a790c604c1162dd1c/schematics/ds1813.lbr -------------------------------------------------------------------------------- /schematics/v1/pda6502.GBO: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | M02* 11 | -------------------------------------------------------------------------------- /schematics/v1/pda6502.GML: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.0000*% 11 | D10* 12 | X006206Y003416D02* 13 | X042426Y003416D01* 14 | X041796Y004990D02* 15 | X041798Y005040D01* 16 | X041804Y005090D01* 17 | X041814Y005139D01* 18 | X041828Y005187D01* 19 | X041845Y005234D01* 20 | X041866Y005279D01* 21 | X041891Y005323D01* 22 | X041919Y005364D01* 23 | X041951Y005403D01* 24 | X041985Y005440D01* 25 | X042022Y005474D01* 26 | X042062Y005504D01* 27 | X042104Y005531D01* 28 | X042148Y005555D01* 29 | X042194Y005576D01* 30 | X042241Y005592D01* 31 | X042289Y005605D01* 32 | X042339Y005614D01* 33 | X042388Y005619D01* 34 | X042439Y005620D01* 35 | X042489Y005617D01* 36 | X042538Y005610D01* 37 | X042587Y005599D01* 38 | X042635Y005584D01* 39 | X042681Y005566D01* 40 | X042726Y005544D01* 41 | X042769Y005518D01* 42 | X042810Y005489D01* 43 | X042849Y005457D01* 44 | X042885Y005422D01* 45 | X042917Y005384D01* 46 | X042947Y005344D01* 47 | X042974Y005301D01* 48 | X042997Y005257D01* 49 | X043016Y005211D01* 50 | X043032Y005163D01* 51 | X043044Y005114D01* 52 | X043052Y005065D01* 53 | X043056Y005015D01* 54 | X043056Y004965D01* 55 | X043052Y004915D01* 56 | X043044Y004866D01* 57 | X043032Y004817D01* 58 | X043016Y004769D01* 59 | X042997Y004723D01* 60 | X042974Y004679D01* 61 | X042947Y004636D01* 62 | X042917Y004596D01* 63 | X042885Y004558D01* 64 | X042849Y004523D01* 65 | X042810Y004491D01* 66 | X042769Y004462D01* 67 | X042726Y004436D01* 68 | X042681Y004414D01* 69 | X042635Y004396D01* 70 | X042587Y004381D01* 71 | X042538Y004370D01* 72 | X042489Y004363D01* 73 | X042439Y004360D01* 74 | X042388Y004361D01* 75 | X042339Y004366D01* 76 | X042289Y004375D01* 77 | X042241Y004388D01* 78 | X042194Y004404D01* 79 | X042148Y004425D01* 80 | X042104Y004449D01* 81 | X042062Y004476D01* 82 | X042022Y004506D01* 83 | X041985Y004540D01* 84 | X041951Y004577D01* 85 | X041919Y004616D01* 86 | X041891Y004657D01* 87 | X041866Y004701D01* 88 | X041845Y004746D01* 89 | X041828Y004793D01* 90 | X041814Y004841D01* 91 | X041804Y004890D01* 92 | X041798Y004940D01* 93 | X041796Y004990D01* 94 | X042426Y003415D02* 95 | X042503Y003417D01* 96 | X042580Y003423D01* 97 | X042657Y003432D01* 98 | X042733Y003445D01* 99 | X042809Y003462D01* 100 | X042883Y003483D01* 101 | X042957Y003507D01* 102 | X043029Y003535D01* 103 | X043099Y003566D01* 104 | X043168Y003601D01* 105 | X043236Y003639D01* 106 | X043301Y003680D01* 107 | X043364Y003725D01* 108 | X043425Y003773D01* 109 | X043484Y003823D01* 110 | X043540Y003876D01* 111 | X043593Y003932D01* 112 | X043643Y003991D01* 113 | X043691Y004052D01* 114 | X043736Y004115D01* 115 | X043777Y004180D01* 116 | X043815Y004248D01* 117 | X043850Y004317D01* 118 | X043881Y004387D01* 119 | X043909Y004459D01* 120 | X043933Y004533D01* 121 | X043954Y004607D01* 122 | X043971Y004683D01* 123 | X043984Y004759D01* 124 | X043993Y004836D01* 125 | X043999Y004913D01* 126 | X044001Y004990D01* 127 | X044001Y033337D01* 128 | X041796Y033337D02* 129 | X041798Y033387D01* 130 | X041804Y033437D01* 131 | X041814Y033486D01* 132 | X041828Y033534D01* 133 | X041845Y033581D01* 134 | X041866Y033626D01* 135 | X041891Y033670D01* 136 | X041919Y033711D01* 137 | X041951Y033750D01* 138 | X041985Y033787D01* 139 | X042022Y033821D01* 140 | X042062Y033851D01* 141 | X042104Y033878D01* 142 | X042148Y033902D01* 143 | X042194Y033923D01* 144 | X042241Y033939D01* 145 | X042289Y033952D01* 146 | X042339Y033961D01* 147 | X042388Y033966D01* 148 | X042439Y033967D01* 149 | X042489Y033964D01* 150 | X042538Y033957D01* 151 | X042587Y033946D01* 152 | X042635Y033931D01* 153 | X042681Y033913D01* 154 | X042726Y033891D01* 155 | X042769Y033865D01* 156 | X042810Y033836D01* 157 | X042849Y033804D01* 158 | X042885Y033769D01* 159 | X042917Y033731D01* 160 | X042947Y033691D01* 161 | X042974Y033648D01* 162 | X042997Y033604D01* 163 | X043016Y033558D01* 164 | X043032Y033510D01* 165 | X043044Y033461D01* 166 | X043052Y033412D01* 167 | X043056Y033362D01* 168 | X043056Y033312D01* 169 | X043052Y033262D01* 170 | X043044Y033213D01* 171 | X043032Y033164D01* 172 | X043016Y033116D01* 173 | X042997Y033070D01* 174 | X042974Y033026D01* 175 | X042947Y032983D01* 176 | X042917Y032943D01* 177 | X042885Y032905D01* 178 | X042849Y032870D01* 179 | X042810Y032838D01* 180 | X042769Y032809D01* 181 | X042726Y032783D01* 182 | X042681Y032761D01* 183 | X042635Y032743D01* 184 | X042587Y032728D01* 185 | X042538Y032717D01* 186 | X042489Y032710D01* 187 | X042439Y032707D01* 188 | X042388Y032708D01* 189 | X042339Y032713D01* 190 | X042289Y032722D01* 191 | X042241Y032735D01* 192 | X042194Y032751D01* 193 | X042148Y032772D01* 194 | X042104Y032796D01* 195 | X042062Y032823D01* 196 | X042022Y032853D01* 197 | X041985Y032887D01* 198 | X041951Y032924D01* 199 | X041919Y032963D01* 200 | X041891Y033004D01* 201 | X041866Y033048D01* 202 | X041845Y033093D01* 203 | X041828Y033140D01* 204 | X041814Y033188D01* 205 | X041804Y033237D01* 206 | X041798Y033287D01* 207 | X041796Y033337D01* 208 | X042426Y034912D02* 209 | X042503Y034910D01* 210 | X042580Y034904D01* 211 | X042657Y034895D01* 212 | X042733Y034882D01* 213 | X042809Y034865D01* 214 | X042883Y034844D01* 215 | X042957Y034820D01* 216 | X043029Y034792D01* 217 | X043099Y034761D01* 218 | X043168Y034726D01* 219 | X043236Y034688D01* 220 | X043301Y034647D01* 221 | X043364Y034602D01* 222 | X043425Y034554D01* 223 | X043484Y034504D01* 224 | X043540Y034451D01* 225 | X043593Y034395D01* 226 | X043643Y034336D01* 227 | X043691Y034275D01* 228 | X043736Y034212D01* 229 | X043777Y034147D01* 230 | X043815Y034079D01* 231 | X043850Y034010D01* 232 | X043881Y033940D01* 233 | X043909Y033868D01* 234 | X043933Y033794D01* 235 | X043954Y033720D01* 236 | X043971Y033644D01* 237 | X043984Y033568D01* 238 | X043993Y033491D01* 239 | X043999Y033414D01* 240 | X044001Y033337D01* 241 | X042426Y034912D02* 242 | X006206Y034912D01* 243 | X005576Y033337D02* 244 | X005578Y033387D01* 245 | X005584Y033437D01* 246 | X005594Y033486D01* 247 | X005608Y033534D01* 248 | X005625Y033581D01* 249 | X005646Y033626D01* 250 | X005671Y033670D01* 251 | X005699Y033711D01* 252 | X005731Y033750D01* 253 | X005765Y033787D01* 254 | X005802Y033821D01* 255 | X005842Y033851D01* 256 | X005884Y033878D01* 257 | X005928Y033902D01* 258 | X005974Y033923D01* 259 | X006021Y033939D01* 260 | X006069Y033952D01* 261 | X006119Y033961D01* 262 | X006168Y033966D01* 263 | X006219Y033967D01* 264 | X006269Y033964D01* 265 | X006318Y033957D01* 266 | X006367Y033946D01* 267 | X006415Y033931D01* 268 | X006461Y033913D01* 269 | X006506Y033891D01* 270 | X006549Y033865D01* 271 | X006590Y033836D01* 272 | X006629Y033804D01* 273 | X006665Y033769D01* 274 | X006697Y033731D01* 275 | X006727Y033691D01* 276 | X006754Y033648D01* 277 | X006777Y033604D01* 278 | X006796Y033558D01* 279 | X006812Y033510D01* 280 | X006824Y033461D01* 281 | X006832Y033412D01* 282 | X006836Y033362D01* 283 | X006836Y033312D01* 284 | X006832Y033262D01* 285 | X006824Y033213D01* 286 | X006812Y033164D01* 287 | X006796Y033116D01* 288 | X006777Y033070D01* 289 | X006754Y033026D01* 290 | X006727Y032983D01* 291 | X006697Y032943D01* 292 | X006665Y032905D01* 293 | X006629Y032870D01* 294 | X006590Y032838D01* 295 | X006549Y032809D01* 296 | X006506Y032783D01* 297 | X006461Y032761D01* 298 | X006415Y032743D01* 299 | X006367Y032728D01* 300 | X006318Y032717D01* 301 | X006269Y032710D01* 302 | X006219Y032707D01* 303 | X006168Y032708D01* 304 | X006119Y032713D01* 305 | X006069Y032722D01* 306 | X006021Y032735D01* 307 | X005974Y032751D01* 308 | X005928Y032772D01* 309 | X005884Y032796D01* 310 | X005842Y032823D01* 311 | X005802Y032853D01* 312 | X005765Y032887D01* 313 | X005731Y032924D01* 314 | X005699Y032963D01* 315 | X005671Y033004D01* 316 | X005646Y033048D01* 317 | X005625Y033093D01* 318 | X005608Y033140D01* 319 | X005594Y033188D01* 320 | X005584Y033237D01* 321 | X005578Y033287D01* 322 | X005576Y033337D01* 323 | X004631Y033337D02* 324 | X004633Y033414D01* 325 | X004639Y033491D01* 326 | X004648Y033568D01* 327 | X004661Y033644D01* 328 | X004678Y033720D01* 329 | X004699Y033794D01* 330 | X004723Y033868D01* 331 | X004751Y033940D01* 332 | X004782Y034010D01* 333 | X004817Y034079D01* 334 | X004855Y034147D01* 335 | X004896Y034212D01* 336 | X004941Y034275D01* 337 | X004989Y034336D01* 338 | X005039Y034395D01* 339 | X005092Y034451D01* 340 | X005148Y034504D01* 341 | X005207Y034554D01* 342 | X005268Y034602D01* 343 | X005331Y034647D01* 344 | X005396Y034688D01* 345 | X005464Y034726D01* 346 | X005533Y034761D01* 347 | X005603Y034792D01* 348 | X005675Y034820D01* 349 | X005749Y034844D01* 350 | X005823Y034865D01* 351 | X005899Y034882D01* 352 | X005975Y034895D01* 353 | X006052Y034904D01* 354 | X006129Y034910D01* 355 | X006206Y034912D01* 356 | X004631Y033337D02* 357 | X004631Y004990D01* 358 | X005576Y004990D02* 359 | X005578Y005040D01* 360 | X005584Y005090D01* 361 | X005594Y005139D01* 362 | X005608Y005187D01* 363 | X005625Y005234D01* 364 | X005646Y005279D01* 365 | X005671Y005323D01* 366 | X005699Y005364D01* 367 | X005731Y005403D01* 368 | X005765Y005440D01* 369 | X005802Y005474D01* 370 | X005842Y005504D01* 371 | X005884Y005531D01* 372 | X005928Y005555D01* 373 | X005974Y005576D01* 374 | X006021Y005592D01* 375 | X006069Y005605D01* 376 | X006119Y005614D01* 377 | X006168Y005619D01* 378 | X006219Y005620D01* 379 | X006269Y005617D01* 380 | X006318Y005610D01* 381 | X006367Y005599D01* 382 | X006415Y005584D01* 383 | X006461Y005566D01* 384 | X006506Y005544D01* 385 | X006549Y005518D01* 386 | X006590Y005489D01* 387 | X006629Y005457D01* 388 | X006665Y005422D01* 389 | X006697Y005384D01* 390 | X006727Y005344D01* 391 | X006754Y005301D01* 392 | X006777Y005257D01* 393 | X006796Y005211D01* 394 | X006812Y005163D01* 395 | X006824Y005114D01* 396 | X006832Y005065D01* 397 | X006836Y005015D01* 398 | X006836Y004965D01* 399 | X006832Y004915D01* 400 | X006824Y004866D01* 401 | X006812Y004817D01* 402 | X006796Y004769D01* 403 | X006777Y004723D01* 404 | X006754Y004679D01* 405 | X006727Y004636D01* 406 | X006697Y004596D01* 407 | X006665Y004558D01* 408 | X006629Y004523D01* 409 | X006590Y004491D01* 410 | X006549Y004462D01* 411 | X006506Y004436D01* 412 | X006461Y004414D01* 413 | X006415Y004396D01* 414 | X006367Y004381D01* 415 | X006318Y004370D01* 416 | X006269Y004363D01* 417 | X006219Y004360D01* 418 | X006168Y004361D01* 419 | X006119Y004366D01* 420 | X006069Y004375D01* 421 | X006021Y004388D01* 422 | X005974Y004404D01* 423 | X005928Y004425D01* 424 | X005884Y004449D01* 425 | X005842Y004476D01* 426 | X005802Y004506D01* 427 | X005765Y004540D01* 428 | X005731Y004577D01* 429 | X005699Y004616D01* 430 | X005671Y004657D01* 431 | X005646Y004701D01* 432 | X005625Y004746D01* 433 | X005608Y004793D01* 434 | X005594Y004841D01* 435 | X005584Y004890D01* 436 | X005578Y004940D01* 437 | X005576Y004990D01* 438 | X004631Y004990D02* 439 | X004633Y004913D01* 440 | X004639Y004836D01* 441 | X004648Y004759D01* 442 | X004661Y004683D01* 443 | X004678Y004607D01* 444 | X004699Y004533D01* 445 | X004723Y004459D01* 446 | X004751Y004387D01* 447 | X004782Y004317D01* 448 | X004817Y004248D01* 449 | X004855Y004180D01* 450 | X004896Y004115D01* 451 | X004941Y004052D01* 452 | X004989Y003991D01* 453 | X005039Y003932D01* 454 | X005092Y003876D01* 455 | X005148Y003823D01* 456 | X005207Y003773D01* 457 | X005268Y003725D01* 458 | X005331Y003680D01* 459 | X005396Y003639D01* 460 | X005464Y003601D01* 461 | X005533Y003566D01* 462 | X005603Y003535D01* 463 | X005675Y003507D01* 464 | X005749Y003483D01* 465 | X005823Y003462D01* 466 | X005899Y003445D01* 467 | X005975Y003432D01* 468 | X006052Y003423D01* 469 | X006129Y003417D01* 470 | X006206Y003415D01* 471 | M02* 472 | -------------------------------------------------------------------------------- /schematics/v1/pda6502.GTO: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.0020*% 11 | %ADD11C,0.0050*% 12 | %ADD12C,0.0030*% 13 | %ADD13C,0.0120*% 14 | %ADD14C,0.0040*% 15 | %ADD15C,0.0080*% 16 | %ADD16C,0.0060*% 17 | %ADD17R,0.0079X0.0079*% 18 | D10* 19 | X014076Y006124D02* 20 | X014076Y006404D01* 21 | X014216Y006404D01* 22 | X014263Y006357D01* 23 | X014263Y006264D01* 24 | X014216Y006217D01* 25 | X014076Y006217D01* 26 | X014169Y006217D02* 27 | X014263Y006124D01* 28 | X014352Y006124D02* 29 | X014539Y006124D01* 30 | X014628Y006170D02* 31 | X014675Y006124D01* 32 | X014768Y006124D01* 33 | X014815Y006170D01* 34 | X014815Y006217D01* 35 | X014768Y006264D01* 36 | X014675Y006264D01* 37 | X014628Y006310D01* 38 | X014628Y006357D01* 39 | X014675Y006404D01* 40 | X014768Y006404D01* 41 | X014815Y006357D01* 42 | X014904Y006404D02* 43 | X014904Y006124D01* 44 | X015045Y006124D01* 45 | X015091Y006170D01* 46 | X015091Y006217D01* 47 | X015045Y006264D01* 48 | X014904Y006264D01* 49 | X014904Y006404D02* 50 | X015045Y006404D01* 51 | X015091Y006357D01* 52 | X015091Y006310D01* 53 | X015045Y006264D01* 54 | X015326Y006264D02* 55 | X015513Y006264D01* 56 | X015513Y006310D02* 57 | X015513Y006124D01* 58 | X015602Y006124D02* 59 | X015602Y006170D01* 60 | X015789Y006357D01* 61 | X015789Y006404D01* 62 | X015602Y006404D01* 63 | X015513Y006310D02* 64 | X015419Y006404D01* 65 | X015326Y006310D01* 66 | X015326Y006124D01* 67 | X015326Y006674D02* 68 | X015326Y006860D01* 69 | X015419Y006954D01* 70 | X015513Y006860D01* 71 | X015513Y006674D01* 72 | X015602Y006720D02* 73 | X015602Y006767D01* 74 | X015649Y006814D01* 75 | X015742Y006814D01* 76 | X015789Y006767D01* 77 | X015789Y006720D01* 78 | X015742Y006674D01* 79 | X015649Y006674D01* 80 | X015602Y006720D01* 81 | X015649Y006814D02* 82 | X015602Y006860D01* 83 | X015602Y006907D01* 84 | X015649Y006954D01* 85 | X015742Y006954D01* 86 | X015789Y006907D01* 87 | X015789Y006860D01* 88 | X015742Y006814D01* 89 | X015513Y006814D02* 90 | X015326Y006814D01* 91 | X014815Y006720D02* 92 | X014815Y006907D01* 93 | X014768Y006954D01* 94 | X014628Y006954D01* 95 | X014628Y006674D01* 96 | X014768Y006674D01* 97 | X014815Y006720D01* 98 | X014539Y006674D02* 99 | X014539Y006954D01* 100 | X014352Y006954D02* 101 | X014539Y006674D01* 102 | X014352Y006674D02* 103 | X014352Y006954D01* 104 | X014263Y006907D02* 105 | X014216Y006954D01* 106 | X014122Y006954D01* 107 | X014076Y006907D01* 108 | X014076Y006720D01* 109 | X014122Y006674D01* 110 | X014216Y006674D01* 111 | X014263Y006720D01* 112 | X014263Y006814D01* 113 | X014169Y006814D01* 114 | X014352Y006404D02* 115 | X014352Y006124D01* 116 | X014352Y006264D02* 117 | X014445Y006264D01* 118 | X014539Y006404D02* 119 | X014352Y006404D01* 120 | X016326Y006310D02* 121 | X016419Y006404D01* 122 | X016513Y006310D01* 123 | X016513Y006124D01* 124 | X016602Y006170D02* 125 | X016649Y006124D01* 126 | X016742Y006124D01* 127 | X016789Y006170D01* 128 | X016789Y006217D01* 129 | X016742Y006264D01* 130 | X016602Y006264D01* 131 | X016602Y006170D01* 132 | X016602Y006264D02* 133 | X016695Y006357D01* 134 | X016789Y006404D01* 135 | X016742Y006674D02* 136 | X016789Y006720D01* 137 | X016789Y006907D01* 138 | X016742Y006954D01* 139 | X016649Y006954D01* 140 | X016602Y006907D01* 141 | X016602Y006860D01* 142 | X016649Y006814D01* 143 | X016789Y006814D01* 144 | X016742Y006674D02* 145 | X016649Y006674D01* 146 | X016602Y006720D01* 147 | X016513Y006674D02* 148 | X016513Y006860D01* 149 | X016419Y006954D01* 150 | X016326Y006860D01* 151 | X016326Y006674D01* 152 | X016326Y006814D02* 153 | X016513Y006814D01* 154 | X016326Y006310D02* 155 | X016326Y006124D01* 156 | X016326Y006264D02* 157 | X016513Y006264D01* 158 | X017076Y006674D02* 159 | X017076Y006860D01* 160 | X017169Y006954D01* 161 | X017263Y006860D01* 162 | X017263Y006674D01* 163 | X017352Y006674D02* 164 | X017539Y006674D01* 165 | X017445Y006674D02* 166 | X017445Y006954D01* 167 | X017352Y006860D01* 168 | X017263Y006814D02* 169 | X017076Y006814D01* 170 | X017419Y006404D02* 171 | X017513Y006310D01* 172 | X017513Y006124D01* 173 | X017602Y006170D02* 174 | X017649Y006124D01* 175 | X017742Y006124D01* 176 | X017789Y006170D01* 177 | X017789Y006264D01* 178 | X017742Y006310D01* 179 | X017695Y006310D01* 180 | X017602Y006264D01* 181 | X017602Y006404D01* 182 | X017789Y006404D01* 183 | X017768Y006674D02* 184 | X017675Y006674D01* 185 | X017628Y006720D01* 186 | X017815Y006907D01* 187 | X017815Y006720D01* 188 | X017768Y006674D01* 189 | X017628Y006720D02* 190 | X017628Y006907D01* 191 | X017675Y006954D01* 192 | X017768Y006954D01* 193 | X017815Y006907D01* 194 | X018076Y006860D02* 195 | X018076Y006674D01* 196 | X018076Y006814D02* 197 | X018263Y006814D01* 198 | X018263Y006860D02* 199 | X018263Y006674D01* 200 | X018352Y006674D02* 201 | X018539Y006674D01* 202 | X018628Y006674D02* 203 | X018815Y006674D01* 204 | X018722Y006674D02* 205 | X018722Y006954D01* 206 | X018628Y006860D01* 207 | X018445Y006954D02* 208 | X018445Y006674D01* 209 | X018352Y006860D02* 210 | X018445Y006954D01* 211 | X018263Y006860D02* 212 | X018169Y006954D01* 213 | X018076Y006860D01* 214 | X018419Y006404D02* 215 | X018513Y006310D01* 216 | X018513Y006124D01* 217 | X018513Y006264D02* 218 | X018326Y006264D01* 219 | X018326Y006310D02* 220 | X018419Y006404D01* 221 | X018326Y006310D02* 222 | X018326Y006124D01* 223 | X018602Y006264D02* 224 | X018742Y006404D01* 225 | X018742Y006124D01* 226 | X018789Y006264D02* 227 | X018602Y006264D01* 228 | X019076Y006674D02* 229 | X019076Y006860D01* 230 | X019169Y006954D01* 231 | X019263Y006860D01* 232 | X019263Y006674D01* 233 | X019352Y006674D02* 234 | X019539Y006674D01* 235 | X019628Y006674D02* 236 | X019815Y006860D01* 237 | X019815Y006907D01* 238 | X019768Y006954D01* 239 | X019675Y006954D01* 240 | X019628Y006907D01* 241 | X019445Y006954D02* 242 | X019445Y006674D01* 243 | X019628Y006674D02* 244 | X019815Y006674D01* 245 | X019742Y006404D02* 246 | X019789Y006357D01* 247 | X019789Y006310D01* 248 | X019742Y006264D01* 249 | X019789Y006217D01* 250 | X019789Y006170D01* 251 | X019742Y006124D01* 252 | X019649Y006124D01* 253 | X019602Y006170D01* 254 | X019513Y006124D02* 255 | X019513Y006310D01* 256 | X019419Y006404D01* 257 | X019326Y006310D01* 258 | X019326Y006124D01* 259 | X019326Y006264D02* 260 | X019513Y006264D01* 261 | X019602Y006357D02* 262 | X019649Y006404D01* 263 | X019742Y006404D01* 264 | X019742Y006264D02* 265 | X019695Y006264D01* 266 | X020326Y006264D02* 267 | X020513Y006264D01* 268 | X020513Y006310D02* 269 | X020513Y006124D01* 270 | X020602Y006124D02* 271 | X020789Y006310D01* 272 | X020789Y006357D01* 273 | X020742Y006404D01* 274 | X020649Y006404D01* 275 | X020602Y006357D01* 276 | X020513Y006310D02* 277 | X020419Y006404D01* 278 | X020326Y006310D01* 279 | X020326Y006124D01* 280 | X020602Y006124D02* 281 | X020789Y006124D01* 282 | X021326Y006124D02* 283 | X021326Y006310D01* 284 | X021419Y006404D01* 285 | X021513Y006310D01* 286 | X021513Y006124D01* 287 | X021602Y006124D02* 288 | X021789Y006124D01* 289 | X021695Y006124D02* 290 | X021695Y006404D01* 291 | X021602Y006310D01* 292 | X021513Y006264D02* 293 | X021326Y006264D01* 294 | X021413Y006674D02* 295 | X021413Y006860D01* 296 | X021319Y006954D01* 297 | X021226Y006860D01* 298 | X021226Y006674D01* 299 | X021226Y006814D02* 300 | X021413Y006814D01* 301 | X021502Y006860D02* 302 | X021595Y006954D01* 303 | X021595Y006674D01* 304 | X021502Y006674D02* 305 | X021689Y006674D01* 306 | X021778Y006814D02* 307 | X021965Y006814D01* 308 | X021918Y006674D02* 309 | X021918Y006954D01* 310 | X021778Y006814D01* 311 | X022126Y006814D02* 312 | X022313Y006814D01* 313 | X022313Y006860D02* 314 | X022313Y006674D01* 315 | X022402Y006674D02* 316 | X022589Y006674D01* 317 | X022495Y006674D02* 318 | X022495Y006954D01* 319 | X022402Y006860D01* 320 | X022313Y006860D02* 321 | X022219Y006954D01* 322 | X022126Y006860D01* 323 | X022126Y006674D01* 324 | X022419Y006404D02* 325 | X022513Y006310D01* 326 | X022513Y006124D01* 327 | X022602Y006170D02* 328 | X022789Y006357D01* 329 | X022789Y006170D01* 330 | X022742Y006124D01* 331 | X022649Y006124D01* 332 | X022602Y006170D01* 333 | X022602Y006357D01* 334 | X022649Y006404D01* 335 | X022742Y006404D01* 336 | X022789Y006357D01* 337 | X023076Y006357D02* 338 | X023122Y006404D01* 339 | X023216Y006404D01* 340 | X023263Y006357D01* 341 | X023263Y006264D02* 342 | X023169Y006264D01* 343 | X023263Y006264D02* 344 | X023263Y006170D01* 345 | X023216Y006124D01* 346 | X023122Y006124D01* 347 | X023076Y006170D01* 348 | X023076Y006357D01* 349 | X023352Y006404D02* 350 | X023352Y006124D01* 351 | X023539Y006124D02* 352 | X023352Y006404D01* 353 | X023539Y006404D02* 354 | X023539Y006124D01* 355 | X023628Y006124D02* 356 | X023768Y006124D01* 357 | X023815Y006170D01* 358 | X023815Y006357D01* 359 | X023768Y006404D01* 360 | X023628Y006404D01* 361 | X023628Y006124D01* 362 | X024076Y006124D02* 363 | X024076Y006404D01* 364 | X024216Y006404D01* 365 | X024263Y006357D01* 366 | X024263Y006264D01* 367 | X024216Y006217D01* 368 | X024076Y006217D01* 369 | X024169Y006217D02* 370 | X024263Y006124D01* 371 | X024352Y006124D02* 372 | X024445Y006217D01* 373 | X024539Y006124D01* 374 | X024539Y006404D01* 375 | X024628Y006404D02* 376 | X024768Y006404D01* 377 | X024815Y006357D01* 378 | X024815Y006310D01* 379 | X024768Y006264D01* 380 | X024628Y006264D01* 381 | X024628Y006124D02* 382 | X024628Y006404D01* 383 | X024768Y006264D02* 384 | X024815Y006217D01* 385 | X024815Y006170D01* 386 | X024768Y006124D01* 387 | X024628Y006124D01* 388 | X024352Y006124D02* 389 | X024352Y006404D01* 390 | X024352Y006674D02* 391 | X024352Y006954D01* 392 | X024539Y006674D01* 393 | X024539Y006954D01* 394 | X024628Y006954D02* 395 | X024768Y006954D01* 396 | X024815Y006907D01* 397 | X024815Y006720D01* 398 | X024768Y006674D01* 399 | X024628Y006674D01* 400 | X024628Y006954D01* 401 | X024263Y006907D02* 402 | X024216Y006954D01* 403 | X024122Y006954D01* 404 | X024076Y006907D01* 405 | X024076Y006720D01* 406 | X024122Y006674D01* 407 | X024216Y006674D01* 408 | X024263Y006720D01* 409 | X024263Y006814D01* 410 | X024169Y006814D01* 411 | X023789Y006767D02* 412 | X023695Y006674D01* 413 | X023602Y006767D01* 414 | X023602Y006954D01* 415 | X023513Y006954D02* 416 | X023326Y006954D01* 417 | X023326Y006814D01* 418 | X023419Y006860D01* 419 | X023466Y006860D01* 420 | X023513Y006814D01* 421 | X023513Y006720D01* 422 | X023466Y006674D01* 423 | X023372Y006674D01* 424 | X023326Y006720D01* 425 | X022865Y006720D02* 426 | X022865Y006814D01* 427 | X022818Y006860D01* 428 | X022772Y006860D01* 429 | X022678Y006814D01* 430 | X022678Y006954D01* 431 | X022865Y006954D01* 432 | X022865Y006720D02* 433 | X022818Y006674D01* 434 | X022725Y006674D01* 435 | X022678Y006720D01* 436 | X022419Y006404D02* 437 | X022326Y006310D01* 438 | X022326Y006124D01* 439 | X022326Y006264D02* 440 | X022513Y006264D01* 441 | X023789Y006767D02* 442 | X023789Y006954D01* 443 | X025076Y006404D02* 444 | X025169Y006404D01* 445 | X025122Y006404D02* 446 | X025122Y006124D01* 447 | X025076Y006124D02* 448 | X025169Y006124D01* 449 | X025260Y006124D02* 450 | X025260Y006404D01* 451 | X025400Y006404D01* 452 | X025447Y006357D01* 453 | X025447Y006264D01* 454 | X025400Y006217D01* 455 | X025260Y006217D01* 456 | X025353Y006217D02* 457 | X025447Y006124D01* 458 | X025536Y006170D02* 459 | X025583Y006124D01* 460 | X025676Y006124D01* 461 | X025723Y006170D01* 462 | X025723Y006357D01* 463 | X025676Y006404D01* 464 | X025583Y006404D01* 465 | X025536Y006357D01* 466 | X025536Y006170D01* 467 | X025630Y006217D02* 468 | X025723Y006124D01* 469 | X025812Y006124D02* 470 | X025952Y006124D01* 471 | X025999Y006170D01* 472 | X025999Y006217D01* 473 | X025952Y006264D01* 474 | X025812Y006264D01* 475 | X025812Y006124D02* 476 | X025812Y006404D01* 477 | X025952Y006404D01* 478 | X025999Y006357D01* 479 | X025999Y006310D01* 480 | X025952Y006264D01* 481 | X026176Y006124D02* 482 | X026176Y006404D01* 483 | X026363Y006124D01* 484 | X026363Y006404D01* 485 | X026452Y006404D02* 486 | X026545Y006310D01* 487 | X026639Y006404D01* 488 | X026639Y006124D01* 489 | X026728Y006124D02* 490 | X026822Y006124D01* 491 | X026775Y006124D02* 492 | X026775Y006404D01* 493 | X026728Y006404D02* 494 | X026822Y006404D01* 495 | X026912Y006404D02* 496 | X026912Y006124D01* 497 | X027052Y006124D01* 498 | X027099Y006170D01* 499 | X027099Y006217D01* 500 | X027052Y006264D01* 501 | X026912Y006264D01* 502 | X026912Y006404D02* 503 | X027052Y006404D01* 504 | X027099Y006357D01* 505 | X027099Y006310D01* 506 | X027052Y006264D01* 507 | X026968Y006674D02* 508 | X027015Y006720D01* 509 | X027015Y006907D01* 510 | X026968Y006954D01* 511 | X026828Y006954D01* 512 | X026828Y006674D01* 513 | X026968Y006674D01* 514 | X027176Y006674D02* 515 | X027176Y006954D01* 516 | X027316Y006954D01* 517 | X027363Y006907D01* 518 | X027363Y006814D01* 519 | X027316Y006767D01* 520 | X027176Y006767D01* 521 | X027452Y006814D02* 522 | X027639Y006814D01* 523 | X027639Y006954D02* 524 | X027639Y006674D01* 525 | X027728Y006674D02* 526 | X027822Y006674D01* 527 | X027775Y006674D02* 528 | X027775Y006954D01* 529 | X027728Y006954D02* 530 | X027822Y006954D01* 531 | X027912Y006907D02* 532 | X027959Y006954D01* 533 | X028052Y006954D01* 534 | X028099Y006907D01* 535 | X028099Y006860D01* 536 | X027912Y006674D01* 537 | X028099Y006674D01* 538 | X028326Y006720D02* 539 | X028326Y006907D01* 540 | X028372Y006954D01* 541 | X028466Y006954D01* 542 | X028513Y006907D01* 543 | X028513Y006814D02* 544 | X028419Y006814D01* 545 | X028513Y006814D02* 546 | X028513Y006720D01* 547 | X028466Y006674D01* 548 | X028372Y006674D01* 549 | X028326Y006720D01* 550 | X028602Y006674D02* 551 | X028602Y006954D01* 552 | X028789Y006674D01* 553 | X028789Y006954D01* 554 | X028878Y006954D02* 555 | X029018Y006954D01* 556 | X029065Y006907D01* 557 | X029065Y006720D01* 558 | X029018Y006674D01* 559 | X028878Y006674D01* 560 | X028878Y006954D01* 561 | X029326Y006954D02* 562 | X029326Y006674D01* 563 | X029466Y006674D01* 564 | X029513Y006720D01* 565 | X029513Y006907D01* 566 | X029466Y006954D01* 567 | X029326Y006954D01* 568 | X029602Y006814D02* 569 | X029789Y006814D01* 570 | X029742Y006674D02* 571 | X029742Y006954D01* 572 | X029602Y006814D01* 573 | X029649Y006404D02* 574 | X029742Y006404D01* 575 | X029789Y006357D01* 576 | X029789Y006310D01* 577 | X029742Y006264D01* 578 | X029789Y006217D01* 579 | X029789Y006170D01* 580 | X029742Y006124D01* 581 | X029649Y006124D01* 582 | X029602Y006170D01* 583 | X029513Y006170D02* 584 | X029513Y006357D01* 585 | X029466Y006404D01* 586 | X029326Y006404D01* 587 | X029326Y006124D01* 588 | X029466Y006124D01* 589 | X029513Y006170D01* 590 | X029695Y006264D02* 591 | X029742Y006264D01* 592 | X029602Y006357D02* 593 | X029649Y006404D01* 594 | X030326Y006404D02* 595 | X030326Y006124D01* 596 | X030466Y006124D01* 597 | X030513Y006170D01* 598 | X030513Y006357D01* 599 | X030466Y006404D01* 600 | X030326Y006404D01* 601 | X030326Y006674D02* 602 | X030466Y006674D01* 603 | X030513Y006720D01* 604 | X030513Y006907D01* 605 | X030466Y006954D01* 606 | X030326Y006954D01* 607 | X030326Y006674D01* 608 | X030602Y006720D02* 609 | X030649Y006674D01* 610 | X030742Y006674D01* 611 | X030789Y006720D01* 612 | X030789Y006814D01* 613 | X030742Y006860D01* 614 | X030695Y006860D01* 615 | X030602Y006814D01* 616 | X030602Y006954D01* 617 | X030789Y006954D01* 618 | X031326Y006954D02* 619 | X031326Y006674D01* 620 | X031466Y006674D01* 621 | X031513Y006720D01* 622 | X031513Y006907D01* 623 | X031466Y006954D01* 624 | X031326Y006954D01* 625 | X031602Y006814D02* 626 | X031742Y006814D01* 627 | X031789Y006767D01* 628 | X031789Y006720D01* 629 | X031742Y006674D01* 630 | X031649Y006674D01* 631 | X031602Y006720D01* 632 | X031602Y006814D01* 633 | X031695Y006907D01* 634 | X031789Y006954D01* 635 | X032326Y006954D02* 636 | X032326Y006674D01* 637 | X032466Y006674D01* 638 | X032513Y006720D01* 639 | X032513Y006907D01* 640 | X032466Y006954D01* 641 | X032326Y006954D01* 642 | X032602Y006954D02* 643 | X032789Y006954D01* 644 | X032789Y006907D01* 645 | X032602Y006720D01* 646 | X032602Y006674D01* 647 | X032649Y006404D02* 648 | X032742Y006404D01* 649 | X032789Y006357D01* 650 | X032602Y006170D01* 651 | X032649Y006124D01* 652 | X032742Y006124D01* 653 | X032789Y006170D01* 654 | X032789Y006357D01* 655 | X032649Y006404D02* 656 | X032602Y006357D01* 657 | X032602Y006170D01* 658 | X032513Y006170D02* 659 | X032513Y006357D01* 660 | X032466Y006404D01* 661 | X032326Y006404D01* 662 | X032326Y006124D01* 663 | X032466Y006124D01* 664 | X032513Y006170D01* 665 | X031789Y006124D02* 666 | X031602Y006124D01* 667 | X031695Y006124D02* 668 | X031695Y006404D01* 669 | X031602Y006310D01* 670 | X031513Y006357D02* 671 | X031466Y006404D01* 672 | X031326Y006404D01* 673 | X031326Y006124D01* 674 | X031466Y006124D01* 675 | X031513Y006170D01* 676 | X031513Y006357D01* 677 | X030789Y006357D02* 678 | X030742Y006404D01* 679 | X030649Y006404D01* 680 | X030602Y006357D01* 681 | X030789Y006357D02* 682 | X030789Y006310D01* 683 | X030602Y006124D01* 684 | X030789Y006124D01* 685 | X033076Y006720D02* 686 | X033122Y006674D01* 687 | X033216Y006674D01* 688 | X033263Y006720D01* 689 | X033263Y006814D01* 690 | X033169Y006814D01* 691 | X033076Y006907D02* 692 | X033076Y006720D01* 693 | X033076Y006907D02* 694 | X033122Y006954D01* 695 | X033216Y006954D01* 696 | X033263Y006907D01* 697 | X033352Y006954D02* 698 | X033539Y006674D01* 699 | X033539Y006954D01* 700 | X033628Y006954D02* 701 | X033768Y006954D01* 702 | X033815Y006907D01* 703 | X033815Y006720D01* 704 | X033768Y006674D01* 705 | X033628Y006674D01* 706 | X033628Y006954D01* 707 | X033352Y006954D02* 708 | X033352Y006674D01* 709 | X033326Y006404D02* 710 | X033326Y006264D01* 711 | X033419Y006310D01* 712 | X033466Y006310D01* 713 | X033513Y006264D01* 714 | X033513Y006170D01* 715 | X033466Y006124D01* 716 | X033372Y006124D01* 717 | X033326Y006170D01* 718 | X033326Y006404D02* 719 | X033513Y006404D01* 720 | X033602Y006404D02* 721 | X033602Y006217D01* 722 | X033695Y006124D01* 723 | X033789Y006217D01* 724 | X033789Y006404D01* 725 | X027452Y006674D02* 726 | X027452Y006954D01* 727 | X026739Y006954D02* 728 | X026739Y006674D01* 729 | X026552Y006954D01* 730 | X026552Y006674D01* 731 | X026463Y006720D02* 732 | X026463Y006814D01* 733 | X026369Y006814D01* 734 | X026276Y006907D02* 735 | X026276Y006720D01* 736 | X026322Y006674D01* 737 | X026416Y006674D01* 738 | X026463Y006720D01* 739 | X026463Y006907D02* 740 | X026416Y006954D01* 741 | X026322Y006954D01* 742 | X026276Y006907D01* 743 | X025965Y006907D02* 744 | X025918Y006954D01* 745 | X025778Y006954D01* 746 | X025778Y006674D01* 747 | X025918Y006674D01* 748 | X025965Y006720D01* 749 | X025965Y006907D01* 750 | X025689Y006954D02* 751 | X025689Y006674D01* 752 | X025502Y006954D01* 753 | X025502Y006674D01* 754 | X025413Y006720D02* 755 | X025413Y006814D01* 756 | X025319Y006814D01* 757 | X025226Y006907D02* 758 | X025226Y006720D01* 759 | X025272Y006674D01* 760 | X025366Y006674D01* 761 | X025413Y006720D01* 762 | X025413Y006907D02* 763 | X025366Y006954D01* 764 | X025272Y006954D01* 765 | X025226Y006907D01* 766 | X026452Y006404D02* 767 | X026452Y006124D01* 768 | X021065Y006720D02* 769 | X021018Y006674D01* 770 | X020925Y006674D01* 771 | X020878Y006720D01* 772 | X020789Y006674D02* 773 | X020602Y006674D01* 774 | X020513Y006674D02* 775 | X020513Y006860D01* 776 | X020419Y006954D01* 777 | X020326Y006860D01* 778 | X020326Y006674D01* 779 | X020326Y006814D02* 780 | X020513Y006814D01* 781 | X020602Y006860D02* 782 | X020695Y006954D01* 783 | X020695Y006674D01* 784 | X020878Y006907D02* 785 | X020925Y006954D01* 786 | X021018Y006954D01* 787 | X021065Y006907D01* 788 | X021065Y006860D01* 789 | X021018Y006814D01* 790 | X021065Y006767D01* 791 | X021065Y006720D01* 792 | X021018Y006814D02* 793 | X020972Y006814D01* 794 | X019445Y006954D02* 795 | X019352Y006860D01* 796 | X019263Y006814D02* 797 | X019076Y006814D01* 798 | X017513Y006264D02* 799 | X017326Y006264D01* 800 | X017326Y006310D02* 801 | X017419Y006404D01* 802 | X017326Y006310D02* 803 | X017326Y006124D01* 804 | X025316Y018534D02* 805 | X028816Y018534D01* 806 | X029316Y022784D02* 807 | X025316Y022784D01* 808 | D11* 809 | X029090Y020466D02* 810 | X029165Y020541D01* 811 | X029466Y020241D01* 812 | X029541Y020316D01* 813 | X029541Y020466D01* 814 | X029466Y020541D01* 815 | X029165Y020541D01* 816 | X029090Y020466D02* 817 | X029090Y020316D01* 818 | X029165Y020241D01* 819 | X029466Y020241D01* 820 | X029466Y020080D02* 821 | X029541Y020005D01* 822 | X029541Y019855D01* 823 | X029466Y019780D01* 824 | X029165Y020080D01* 825 | X029466Y020080D01* 826 | X029466Y019780D02* 827 | X029165Y019780D01* 828 | X029090Y019855D01* 829 | X029090Y020005D01* 830 | X029165Y020080D01* 831 | X029165Y019620D02* 832 | X029090Y019545D01* 833 | X029090Y019395D01* 834 | X029165Y019320D01* 835 | X029466Y019320D01* 836 | X029541Y019395D01* 837 | X029541Y019545D01* 838 | X029466Y019620D01* 839 | X029541Y019160D02* 840 | X029090Y019160D01* 841 | X029316Y019160D02* 842 | X029316Y018859D01* 843 | X029316Y018699D02* 844 | X029316Y018399D01* 845 | X029090Y018624D01* 846 | X029541Y018624D01* 847 | X029541Y018859D02* 848 | X029090Y018859D01* 849 | X029090Y018239D02* 850 | X029165Y018239D01* 851 | X029466Y017939D01* 852 | X029541Y017939D01* 853 | X029090Y017939D02* 854 | X029090Y018239D01* 855 | X032841Y018514D02* 856 | X032916Y018439D01* 857 | X033066Y018439D01* 858 | X033141Y018514D01* 859 | X033141Y018589D01* 860 | X033066Y018664D01* 861 | X032841Y018664D01* 862 | X032841Y018514D01* 863 | X032841Y018664D02* 864 | X032991Y018814D01* 865 | X033141Y018889D01* 866 | X033301Y018889D02* 867 | X033301Y018664D01* 868 | X033451Y018739D01* 869 | X033526Y018739D01* 870 | X033601Y018664D01* 871 | X033601Y018514D01* 872 | X033526Y018439D01* 873 | X033376Y018439D01* 874 | X033301Y018514D01* 875 | X033301Y018889D02* 876 | X033601Y018889D01* 877 | X033762Y018814D02* 878 | X033837Y018889D01* 879 | X033987Y018889D01* 880 | X034062Y018814D01* 881 | X034062Y018739D01* 882 | X033762Y018439D01* 883 | X034062Y018439D01* 884 | X034222Y018439D02* 885 | X034522Y018739D01* 886 | X034522Y018814D01* 887 | X034447Y018889D01* 888 | X034297Y018889D01* 889 | X034222Y018814D01* 890 | X034222Y018439D02* 891 | X034522Y018439D01* 892 | X035143Y018589D02* 893 | X035143Y018739D01* 894 | X035293Y018889D01* 895 | X035450Y018889D02* 896 | X035450Y018439D01* 897 | X035600Y018589D01* 898 | X035750Y018439D01* 899 | X035750Y018889D01* 900 | X035910Y018664D02* 901 | X036060Y018814D01* 902 | X036210Y018889D01* 903 | X036370Y018889D02* 904 | X036370Y018664D01* 905 | X036521Y018739D01* 906 | X036596Y018739D01* 907 | X036671Y018664D01* 908 | X036671Y018514D01* 909 | X036596Y018439D01* 910 | X036445Y018439D01* 911 | X036370Y018514D01* 912 | X036210Y018514D02* 913 | X036210Y018589D01* 914 | X036135Y018664D01* 915 | X035910Y018664D01* 916 | X035910Y018514D01* 917 | X035985Y018439D01* 918 | X036135Y018439D01* 919 | X036210Y018514D01* 920 | X036370Y018889D02* 921 | X036671Y018889D01* 922 | X036831Y018814D02* 923 | X036831Y018514D01* 924 | X036906Y018439D01* 925 | X037056Y018439D01* 926 | X037131Y018514D01* 927 | X037291Y018439D02* 928 | X037591Y018739D01* 929 | X037591Y018814D01* 930 | X037516Y018889D01* 931 | X037366Y018889D01* 932 | X037291Y018814D01* 933 | X037131Y018814D02* 934 | X037056Y018889D01* 935 | X036906Y018889D01* 936 | X036831Y018814D01* 937 | X037291Y018439D02* 938 | X037591Y018439D01* 939 | X037752Y018439D02* 940 | X038052Y018739D01* 941 | X038052Y018814D01* 942 | X037977Y018889D01* 943 | X037827Y018889D01* 944 | X037752Y018814D01* 945 | X037752Y018439D02* 946 | X038052Y018439D01* 947 | X038212Y018439D02* 948 | X038362Y018589D01* 949 | X038362Y018739D01* 950 | X038212Y018889D01* 951 | X040960Y018139D02* 952 | X040960Y017689D01* 953 | X040960Y017839D02* 954 | X041185Y017839D01* 955 | X041260Y017914D01* 956 | X041260Y018064D01* 957 | X041185Y018139D01* 958 | X040960Y018139D01* 959 | X041420Y018139D02* 960 | X041420Y017689D01* 961 | X041645Y017689D01* 962 | X041720Y017764D01* 963 | X041720Y017839D01* 964 | X041645Y017914D01* 965 | X041420Y017914D01* 966 | X041420Y018139D02* 967 | X041645Y018139D01* 968 | X041720Y018064D01* 969 | X041720Y017989D01* 970 | X041645Y017914D01* 971 | X041880Y018064D02* 972 | X041955Y018139D01* 973 | X042106Y018139D01* 974 | X042181Y018064D01* 975 | X042181Y017989D01* 976 | X041880Y017689D01* 977 | X042181Y017689D01* 978 | X042106Y017139D02* 979 | X042181Y017064D01* 980 | X042181Y016989D01* 981 | X042106Y016914D01* 982 | X042181Y016839D01* 983 | X042181Y016764D01* 984 | X042106Y016689D01* 985 | X041955Y016689D01* 986 | X041880Y016764D01* 987 | X041720Y016764D02* 988 | X041645Y016689D01* 989 | X041420Y016689D01* 990 | X041420Y017139D01* 991 | X041645Y017139D01* 992 | X041720Y017064D01* 993 | X041720Y016989D01* 994 | X041645Y016914D01* 995 | X041420Y016914D01* 996 | X041260Y016914D02* 997 | X041185Y016839D01* 998 | X040960Y016839D01* 999 | X040960Y016689D02* 1000 | X040960Y017139D01* 1001 | X041185Y017139D01* 1002 | X041260Y017064D01* 1003 | X041260Y016914D01* 1004 | X041645Y016914D02* 1005 | X041720Y016839D01* 1006 | X041720Y016764D01* 1007 | X041880Y017064D02* 1008 | X041955Y017139D01* 1009 | X042106Y017139D01* 1010 | X042106Y016914D02* 1011 | X042030Y016914D01* 1012 | X042106Y016139D02* 1013 | X041880Y015914D01* 1014 | X042181Y015914D01* 1015 | X042106Y015689D02* 1016 | X042106Y016139D01* 1017 | X041720Y016064D02* 1018 | X041720Y015989D01* 1019 | X041645Y015914D01* 1020 | X041420Y015914D01* 1021 | X041260Y015914D02* 1022 | X041185Y015839D01* 1023 | X040960Y015839D01* 1024 | X040960Y015689D02* 1025 | X040960Y016139D01* 1026 | X041185Y016139D01* 1027 | X041260Y016064D01* 1028 | X041260Y015914D01* 1029 | X041420Y015689D02* 1030 | X041420Y016139D01* 1031 | X041645Y016139D01* 1032 | X041720Y016064D01* 1033 | X041645Y015914D02* 1034 | X041720Y015839D01* 1035 | X041720Y015764D01* 1036 | X041645Y015689D01* 1037 | X041420Y015689D01* 1038 | X041420Y015139D02* 1039 | X041645Y015139D01* 1040 | X041720Y015064D01* 1041 | X041720Y014989D01* 1042 | X041645Y014914D01* 1043 | X041420Y014914D01* 1044 | X041260Y014914D02* 1045 | X041185Y014839D01* 1046 | X040960Y014839D01* 1047 | X040960Y014689D02* 1048 | X040960Y015139D01* 1049 | X041185Y015139D01* 1050 | X041260Y015064D01* 1051 | X041260Y014914D01* 1052 | X041420Y014689D02* 1053 | X041420Y015139D01* 1054 | X041645Y014914D02* 1055 | X041720Y014839D01* 1056 | X041720Y014764D01* 1057 | X041645Y014689D01* 1058 | X041420Y014689D01* 1059 | X041880Y014764D02* 1060 | X041955Y014689D01* 1061 | X042106Y014689D01* 1062 | X042181Y014764D01* 1063 | X042181Y014914D01* 1064 | X042106Y014989D01* 1065 | X042030Y014989D01* 1066 | X041880Y014914D01* 1067 | X041880Y015139D01* 1068 | X042181Y015139D01* 1069 | X042181Y014139D02* 1070 | X042030Y014064D01* 1071 | X041880Y013914D01* 1072 | X042106Y013914D01* 1073 | X042181Y013839D01* 1074 | X042181Y013764D01* 1075 | X042106Y013689D01* 1076 | X041955Y013689D01* 1077 | X041880Y013764D01* 1078 | X041880Y013914D01* 1079 | X041720Y013989D02* 1080 | X041645Y013914D01* 1081 | X041420Y013914D01* 1082 | X041260Y013914D02* 1083 | X041185Y013839D01* 1084 | X040960Y013839D01* 1085 | X040960Y013689D02* 1086 | X040960Y014139D01* 1087 | X041185Y014139D01* 1088 | X041260Y014064D01* 1089 | X041260Y013914D01* 1090 | X041420Y014139D02* 1091 | X041645Y014139D01* 1092 | X041720Y014064D01* 1093 | X041720Y013989D01* 1094 | X041645Y013914D02* 1095 | X041720Y013839D01* 1096 | X041720Y013764D01* 1097 | X041645Y013689D01* 1098 | X041420Y013689D01* 1099 | X041420Y014139D01* 1100 | X041420Y013139D02* 1101 | X041645Y013139D01* 1102 | X041720Y013064D01* 1103 | X041720Y012989D01* 1104 | X041645Y012914D01* 1105 | X041420Y012914D01* 1106 | X041260Y012914D02* 1107 | X041185Y012839D01* 1108 | X040960Y012839D01* 1109 | X040960Y012689D02* 1110 | X040960Y013139D01* 1111 | X041185Y013139D01* 1112 | X041260Y013064D01* 1113 | X041260Y012914D01* 1114 | X041420Y012689D02* 1115 | X041420Y013139D01* 1116 | X041645Y012914D02* 1117 | X041720Y012839D01* 1118 | X041720Y012764D01* 1119 | X041645Y012689D01* 1120 | X041420Y012689D01* 1121 | X041880Y012689D02* 1122 | X041880Y012764D01* 1123 | X042181Y013064D01* 1124 | X042181Y013139D01* 1125 | X041880Y013139D01* 1126 | X041955Y012139D02* 1127 | X041880Y012064D01* 1128 | X041880Y011764D01* 1129 | X042181Y012064D01* 1130 | X042181Y011764D01* 1131 | X042106Y011689D01* 1132 | X041955Y011689D01* 1133 | X041880Y011764D01* 1134 | X041720Y011764D02* 1135 | X041645Y011689D01* 1136 | X041420Y011689D01* 1137 | X041420Y012139D01* 1138 | X041645Y012139D01* 1139 | X041720Y012064D01* 1140 | X041720Y011989D01* 1141 | X041645Y011914D01* 1142 | X041420Y011914D01* 1143 | X041260Y011914D02* 1144 | X041185Y011839D01* 1145 | X040960Y011839D01* 1146 | X040960Y011689D02* 1147 | X040960Y012139D01* 1148 | X041185Y012139D01* 1149 | X041260Y012064D01* 1150 | X041260Y011914D01* 1151 | X041645Y011914D02* 1152 | X041720Y011839D01* 1153 | X041720Y011764D01* 1154 | X041955Y012139D02* 1155 | X042106Y012139D01* 1156 | X042181Y012064D01* 1157 | X042106Y011139D02* 1158 | X041955Y011139D01* 1159 | X041880Y011064D01* 1160 | X041720Y011064D02* 1161 | X041720Y010989D01* 1162 | X041645Y010914D01* 1163 | X041420Y010914D01* 1164 | X041260Y011064D02* 1165 | X041185Y011139D01* 1166 | X041035Y011139D01* 1167 | X040960Y011064D01* 1168 | X040960Y010764D01* 1169 | X041035Y010689D01* 1170 | X041185Y010689D01* 1171 | X041260Y010764D01* 1172 | X041420Y010689D02* 1173 | X041645Y010689D01* 1174 | X041720Y010764D01* 1175 | X041720Y010839D01* 1176 | X041645Y010914D01* 1177 | X041720Y011064D02* 1178 | X041645Y011139D01* 1179 | X041420Y011139D01* 1180 | X041420Y010689D01* 1181 | X041880Y010689D02* 1182 | X042181Y010989D01* 1183 | X042181Y011064D01* 1184 | X042106Y011139D01* 1185 | X042181Y010689D02* 1186 | X041880Y010689D01* 1187 | X042030Y010139D02* 1188 | X042030Y009689D01* 1189 | X041880Y009689D02* 1190 | X042181Y009689D01* 1191 | X041880Y009989D02* 1192 | X042030Y010139D01* 1193 | X041720Y010064D02* 1194 | X041720Y009989D01* 1195 | X041645Y009914D01* 1196 | X041420Y009914D01* 1197 | X041260Y010064D02* 1198 | X041185Y010139D01* 1199 | X041035Y010139D01* 1200 | X040960Y010064D01* 1201 | X040960Y009764D01* 1202 | X041035Y009689D01* 1203 | X041185Y009689D01* 1204 | X041260Y009764D01* 1205 | X041420Y009689D02* 1206 | X041645Y009689D01* 1207 | X041720Y009764D01* 1208 | X041720Y009839D01* 1209 | X041645Y009914D01* 1210 | X041720Y010064D02* 1211 | X041645Y010139D01* 1212 | X041420Y010139D01* 1213 | X041420Y009689D01* 1214 | X041420Y009139D02* 1215 | X041645Y009139D01* 1216 | X041720Y009064D01* 1217 | X041720Y008989D01* 1218 | X041645Y008914D01* 1219 | X041420Y008914D01* 1220 | X041260Y008914D02* 1221 | X041185Y008839D01* 1222 | X040960Y008839D01* 1223 | X040960Y008689D02* 1224 | X040960Y009139D01* 1225 | X041185Y009139D01* 1226 | X041260Y009064D01* 1227 | X041260Y008914D01* 1228 | X041420Y008689D02* 1229 | X041420Y009139D01* 1230 | X041645Y008914D02* 1231 | X041720Y008839D01* 1232 | X041720Y008764D01* 1233 | X041645Y008689D01* 1234 | X041420Y008689D01* 1235 | X041880Y008689D02* 1236 | X042181Y008689D01* 1237 | X042030Y008689D02* 1238 | X042030Y009139D01* 1239 | X041880Y008989D01* 1240 | X035507Y015914D02* 1241 | X035509Y015961D01* 1242 | X035515Y016007D01* 1243 | X035525Y016053D01* 1244 | X035538Y016098D01* 1245 | X035555Y016141D01* 1246 | X035576Y016183D01* 1247 | X035600Y016223D01* 1248 | X035628Y016261D01* 1249 | X035659Y016297D01* 1250 | X035692Y016329D01* 1251 | X035728Y016359D01* 1252 | X035766Y016386D01* 1253 | X035807Y016409D01* 1254 | X035849Y016429D01* 1255 | X035893Y016446D01* 1256 | X035938Y016458D01* 1257 | X035984Y016467D01* 1258 | X036031Y016472D01* 1259 | X036078Y016473D01* 1260 | X036124Y016470D01* 1261 | X036171Y016463D01* 1262 | X036216Y016452D01* 1263 | X036261Y016438D01* 1264 | X036304Y016420D01* 1265 | X036345Y016398D01* 1266 | X036385Y016373D01* 1267 | X036422Y016345D01* 1268 | X036457Y016313D01* 1269 | X036489Y016279D01* 1270 | X036518Y016243D01* 1271 | X036544Y016204D01* 1272 | X036567Y016163D01* 1273 | X036586Y016120D01* 1274 | X036601Y016076D01* 1275 | X036613Y016030D01* 1276 | X036621Y015984D01* 1277 | X036625Y015937D01* 1278 | X036625Y015891D01* 1279 | X036621Y015844D01* 1280 | X036613Y015798D01* 1281 | X036601Y015752D01* 1282 | X036586Y015708D01* 1283 | X036567Y015665D01* 1284 | X036544Y015624D01* 1285 | X036518Y015585D01* 1286 | X036489Y015549D01* 1287 | X036457Y015515D01* 1288 | X036422Y015483D01* 1289 | X036385Y015455D01* 1290 | X036346Y015430D01* 1291 | X036304Y015408D01* 1292 | X036261Y015390D01* 1293 | X036216Y015376D01* 1294 | X036171Y015365D01* 1295 | X036124Y015358D01* 1296 | X036078Y015355D01* 1297 | X036031Y015356D01* 1298 | X035984Y015361D01* 1299 | X035938Y015370D01* 1300 | X035893Y015382D01* 1301 | X035849Y015399D01* 1302 | X035807Y015419D01* 1303 | X035766Y015442D01* 1304 | X035728Y015469D01* 1305 | X035692Y015499D01* 1306 | X035659Y015531D01* 1307 | X035628Y015567D01* 1308 | X035600Y015605D01* 1309 | X035576Y015645D01* 1310 | X035555Y015687D01* 1311 | X035538Y015730D01* 1312 | X035525Y015775D01* 1313 | X035515Y015821D01* 1314 | X035509Y015867D01* 1315 | X035507Y015914D01* 1316 | X035293Y018439D02* 1317 | X035143Y018589D01* 1318 | X040960Y019764D02* 1319 | X041035Y019689D01* 1320 | X041185Y019689D01* 1321 | X041260Y019764D01* 1322 | X041260Y019914D01* 1323 | X041110Y019914D01* 1324 | X041260Y020064D02* 1325 | X041185Y020139D01* 1326 | X041035Y020139D01* 1327 | X040960Y020064D01* 1328 | X040960Y019764D01* 1329 | X041420Y019689D02* 1330 | X041420Y020139D01* 1331 | X041720Y019689D01* 1332 | X041720Y020139D01* 1333 | X041880Y020139D02* 1334 | X042106Y020139D01* 1335 | X042181Y020064D01* 1336 | X042181Y019764D01* 1337 | X042106Y019689D01* 1338 | X041880Y019689D01* 1339 | X041880Y020139D01* 1340 | X041762Y020689D02* 1341 | X041762Y021139D01* 1342 | X041987Y021139D01* 1343 | X042062Y021064D01* 1344 | X042062Y020914D01* 1345 | X041987Y020839D01* 1346 | X041762Y020839D01* 1347 | X041912Y020839D02* 1348 | X042062Y020689D01* 1349 | X042372Y020689D02* 1350 | X042372Y021139D01* 1351 | X042222Y021139D02* 1352 | X042522Y021139D01* 1353 | X043143Y021139D02* 1354 | X043143Y020689D01* 1355 | X043368Y020689D01* 1356 | X043443Y020764D01* 1357 | X043443Y020839D01* 1358 | X043368Y020914D01* 1359 | X043143Y020914D01* 1360 | X043368Y020914D02* 1361 | X043443Y020989D01* 1362 | X043443Y021064D01* 1363 | X043368Y021139D01* 1364 | X043143Y021139D01* 1365 | X041601Y021064D02* 1366 | X041601Y020764D01* 1367 | X041526Y020689D01* 1368 | X041376Y020689D01* 1369 | X041301Y020764D01* 1370 | X041301Y021064D01* 1371 | X041376Y021139D01* 1372 | X041526Y021139D01* 1373 | X041601Y021064D01* 1374 | X041141Y021064D02* 1375 | X041141Y020914D01* 1376 | X041066Y020839D01* 1377 | X040841Y020839D01* 1378 | X040841Y020689D02* 1379 | X040841Y021139D01* 1380 | X041066Y021139D01* 1381 | X041141Y021064D01* 1382 | X041420Y019139D02* 1383 | X041420Y018914D01* 1384 | X041570Y018989D01* 1385 | X041645Y018989D01* 1386 | X041720Y018914D01* 1387 | X041720Y018764D01* 1388 | X041645Y018689D01* 1389 | X041495Y018689D01* 1390 | X041420Y018764D01* 1391 | X041420Y019139D02* 1392 | X041720Y019139D01* 1393 | X041880Y019139D02* 1394 | X041880Y018839D01* 1395 | X042030Y018689D01* 1396 | X042181Y018839D01* 1397 | X042181Y019139D01* 1398 | X042916Y023189D02* 1399 | X042841Y023264D01* 1400 | X042916Y023189D02* 1401 | X043066Y023189D01* 1402 | X043141Y023264D01* 1403 | X043141Y023414D01* 1404 | X043066Y023489D01* 1405 | X042991Y023489D01* 1406 | X042841Y023414D01* 1407 | X042841Y023639D01* 1408 | X043141Y023639D01* 1409 | X043301Y023639D02* 1410 | X043301Y023339D01* 1411 | X043451Y023189D01* 1412 | X043601Y023339D01* 1413 | X043601Y023639D01* 1414 | X043601Y024189D02* 1415 | X043301Y024189D01* 1416 | X043601Y024489D01* 1417 | X043601Y024564D01* 1418 | X043526Y024639D01* 1419 | X043376Y024639D01* 1420 | X043301Y024564D01* 1421 | X043141Y024564D02* 1422 | X043066Y024639D01* 1423 | X042916Y024639D01* 1424 | X042841Y024564D01* 1425 | X042841Y024264D01* 1426 | X042916Y024189D01* 1427 | X043066Y024189D01* 1428 | X043141Y024264D01* 1429 | X042841Y025189D02* 1430 | X042841Y025264D01* 1431 | X043141Y025564D01* 1432 | X043141Y025639D01* 1433 | X042841Y025639D01* 1434 | X042916Y026189D02* 1435 | X042841Y026264D01* 1436 | X042916Y026189D02* 1437 | X043066Y026189D01* 1438 | X043141Y026264D01* 1439 | X043141Y026414D01* 1440 | X043066Y026489D01* 1441 | X042991Y026489D01* 1442 | X042841Y026414D01* 1443 | X042841Y026639D01* 1444 | X043141Y026639D01* 1445 | X043066Y027189D02* 1446 | X042916Y027189D01* 1447 | X042841Y027264D01* 1448 | X042991Y027414D02* 1449 | X043066Y027414D01* 1450 | X043141Y027339D01* 1451 | X043141Y027264D01* 1452 | X043066Y027189D01* 1453 | X043066Y027414D02* 1454 | X043141Y027489D01* 1455 | X043141Y027564D01* 1456 | X043066Y027639D01* 1457 | X042916Y027639D01* 1458 | X042841Y027564D01* 1459 | X042841Y028189D02* 1460 | X043141Y028189D01* 1461 | X042991Y028189D02* 1462 | X042991Y028639D01* 1463 | X042841Y028489D01* 1464 | X042916Y029189D02* 1465 | X042841Y029264D01* 1466 | X043141Y029564D01* 1467 | X043141Y029264D01* 1468 | X043066Y029189D01* 1469 | X042916Y029189D01* 1470 | X042841Y029264D02* 1471 | X042841Y029564D01* 1472 | X042916Y029639D01* 1473 | X043066Y029639D01* 1474 | X043141Y029564D01* 1475 | X043301Y029639D02* 1476 | X043301Y029339D01* 1477 | X043451Y029189D01* 1478 | X043601Y029339D01* 1479 | X043601Y029639D01* 1480 | X042943Y030189D02* 1481 | X042943Y030489D01* 1482 | X042793Y030639D01* 1483 | X042643Y030489D01* 1484 | X042643Y030189D01* 1485 | X042643Y030414D02* 1486 | X042943Y030414D01* 1487 | X042022Y030639D02* 1488 | X041722Y030639D01* 1489 | X041872Y030639D02* 1490 | X041872Y030189D01* 1491 | X041562Y030189D02* 1492 | X041412Y030339D01* 1493 | X041487Y030339D02* 1494 | X041262Y030339D01* 1495 | X041262Y030189D02* 1496 | X041262Y030639D01* 1497 | X041487Y030639D01* 1498 | X041562Y030564D01* 1499 | X041562Y030414D01* 1500 | X041487Y030339D01* 1501 | X041101Y030264D02* 1502 | X041101Y030564D01* 1503 | X041026Y030639D01* 1504 | X040876Y030639D01* 1505 | X040801Y030564D01* 1506 | X040801Y030264D01* 1507 | X040876Y030189D01* 1508 | X041026Y030189D01* 1509 | X041101Y030264D01* 1510 | X040641Y030414D02* 1511 | X040566Y030339D01* 1512 | X040341Y030339D01* 1513 | X040341Y030189D02* 1514 | X040341Y030639D01* 1515 | X040566Y030639D01* 1516 | X040641Y030564D01* 1517 | X040641Y030414D01* 1518 | X040181Y029639D02* 1519 | X040181Y029339D01* 1520 | X040030Y029189D01* 1521 | X039880Y029339D01* 1522 | X039880Y029639D01* 1523 | X039720Y029639D02* 1524 | X039420Y029639D01* 1525 | X039420Y029414D01* 1526 | X039570Y029489D01* 1527 | X039645Y029489D01* 1528 | X039720Y029414D01* 1529 | X039720Y029264D01* 1530 | X039645Y029189D01* 1531 | X039495Y029189D01* 1532 | X039420Y029264D01* 1533 | X039955Y028639D02* 1534 | X040106Y028639D01* 1535 | X040181Y028564D01* 1536 | X039880Y028264D01* 1537 | X039955Y028189D01* 1538 | X040106Y028189D01* 1539 | X040181Y028264D01* 1540 | X040181Y028564D01* 1541 | X039955Y028639D02* 1542 | X039880Y028564D01* 1543 | X039880Y028264D01* 1544 | X039955Y027639D02* 1545 | X039880Y027564D01* 1546 | X039955Y027639D02* 1547 | X040106Y027639D01* 1548 | X040181Y027564D01* 1549 | X040181Y027489D01* 1550 | X039880Y027189D01* 1551 | X040181Y027189D01* 1552 | X040106Y026639D02* 1553 | X039880Y026414D01* 1554 | X040181Y026414D01* 1555 | X040106Y026189D02* 1556 | X040106Y026639D01* 1557 | X040181Y025639D02* 1558 | X040030Y025564D01* 1559 | X039880Y025414D01* 1560 | X040106Y025414D01* 1561 | X040181Y025339D01* 1562 | X040181Y025264D01* 1563 | X040106Y025189D01* 1564 | X039955Y025189D01* 1565 | X039880Y025264D01* 1566 | X039880Y025414D01* 1567 | X040030Y024639D02* 1568 | X039880Y024489D01* 1569 | X039720Y024564D02* 1570 | X039645Y024639D01* 1571 | X039495Y024639D01* 1572 | X039420Y024564D01* 1573 | X039420Y024264D01* 1574 | X039495Y024189D01* 1575 | X039645Y024189D01* 1576 | X039720Y024264D01* 1577 | X039880Y024189D02* 1578 | X040181Y024189D01* 1579 | X040030Y024189D02* 1580 | X040030Y024639D01* 1581 | X039880Y023639D02* 1582 | X039880Y023339D01* 1583 | X040030Y023189D01* 1584 | X040181Y023339D01* 1585 | X040181Y023639D01* 1586 | X039720Y023564D02* 1587 | X039420Y023264D01* 1588 | X039495Y023189D01* 1589 | X039645Y023189D01* 1590 | X039720Y023264D01* 1591 | X039720Y023564D01* 1592 | X039645Y023639D01* 1593 | X039495Y023639D01* 1594 | X039420Y023564D01* 1595 | X039420Y023264D01* 1596 | X034066Y023664D02* 1597 | X034068Y023708D01* 1598 | X034074Y023752D01* 1599 | X034084Y023795D01* 1600 | X034097Y023837D01* 1601 | X034114Y023878D01* 1602 | X034135Y023917D01* 1603 | X034159Y023954D01* 1604 | X034186Y023989D01* 1605 | X034216Y024021D01* 1606 | X034249Y024051D01* 1607 | X034285Y024077D01* 1608 | X034322Y024101D01* 1609 | X034362Y024120D01* 1610 | X034403Y024137D01* 1611 | X034446Y024149D01* 1612 | X034489Y024158D01* 1613 | X034533Y024163D01* 1614 | X034577Y024164D01* 1615 | X034621Y024161D01* 1616 | X034665Y024154D01* 1617 | X034708Y024143D01* 1618 | X034750Y024129D01* 1619 | X034790Y024111D01* 1620 | X034829Y024089D01* 1621 | X034865Y024065D01* 1622 | X034899Y024037D01* 1623 | X034931Y024006D01* 1624 | X034960Y023972D01* 1625 | X034986Y023936D01* 1626 | X035008Y023898D01* 1627 | X035027Y023858D01* 1628 | X035042Y023816D01* 1629 | X035054Y023774D01* 1630 | X035062Y023730D01* 1631 | X035066Y023686D01* 1632 | X035066Y023642D01* 1633 | X035062Y023598D01* 1634 | X035054Y023554D01* 1635 | X035042Y023512D01* 1636 | X035027Y023470D01* 1637 | X035008Y023430D01* 1638 | X034986Y023392D01* 1639 | X034960Y023356D01* 1640 | X034931Y023322D01* 1641 | X034899Y023291D01* 1642 | X034865Y023263D01* 1643 | X034829Y023239D01* 1644 | X034790Y023217D01* 1645 | X034750Y023199D01* 1646 | X034708Y023185D01* 1647 | X034665Y023174D01* 1648 | X034621Y023167D01* 1649 | X034577Y023164D01* 1650 | X034533Y023165D01* 1651 | X034489Y023170D01* 1652 | X034446Y023179D01* 1653 | X034403Y023191D01* 1654 | X034362Y023208D01* 1655 | X034322Y023227D01* 1656 | X034285Y023251D01* 1657 | X034249Y023277D01* 1658 | X034216Y023307D01* 1659 | X034186Y023339D01* 1660 | X034159Y023374D01* 1661 | X034135Y023411D01* 1662 | X034114Y023450D01* 1663 | X034097Y023491D01* 1664 | X034084Y023533D01* 1665 | X034074Y023576D01* 1666 | X034068Y023620D01* 1667 | X034066Y023664D01* 1668 | X032832Y026189D02* 1669 | X032832Y026639D01* 1670 | X032682Y026639D02* 1671 | X032983Y026639D01* 1672 | X032522Y026639D02* 1673 | X032222Y026639D01* 1674 | X032222Y026189D01* 1675 | X032522Y026189D01* 1676 | X032372Y026414D02* 1677 | X032222Y026414D01* 1678 | X032062Y026339D02* 1679 | X032062Y026264D01* 1680 | X031987Y026189D01* 1681 | X031837Y026189D01* 1682 | X031762Y026264D01* 1683 | X031837Y026414D02* 1684 | X031987Y026414D01* 1685 | X032062Y026339D01* 1686 | X032062Y026564D02* 1687 | X031987Y026639D01* 1688 | X031837Y026639D01* 1689 | X031762Y026564D01* 1690 | X031762Y026489D01* 1691 | X031837Y026414D01* 1692 | X031601Y026639D02* 1693 | X031301Y026639D01* 1694 | X031301Y026189D01* 1695 | X031601Y026189D01* 1696 | X031451Y026414D02* 1697 | X031301Y026414D01* 1698 | X031141Y026414D02* 1699 | X031066Y026339D01* 1700 | X030841Y026339D01* 1701 | X030991Y026339D02* 1702 | X031141Y026189D01* 1703 | X031141Y026414D02* 1704 | X031141Y026564D01* 1705 | X031066Y026639D01* 1706 | X030841Y026639D01* 1707 | X030841Y026189D01* 1708 | X030541Y026939D02* 1709 | X030090Y026939D01* 1710 | X030316Y026939D02* 1711 | X030316Y027239D01* 1712 | X030541Y027239D02* 1713 | X030090Y027239D01* 1714 | X030090Y027399D02* 1715 | X030090Y027549D01* 1716 | X030090Y027474D02* 1717 | X030541Y027474D01* 1718 | X030541Y027399D02* 1719 | X030541Y027549D01* 1720 | X030541Y028166D02* 1721 | X030090Y028166D01* 1722 | X030541Y028166D02* 1723 | X030541Y028467D01* 1724 | X030466Y028627D02* 1725 | X030165Y028627D01* 1726 | X030090Y028702D01* 1727 | X030090Y028852D01* 1728 | X030165Y028927D01* 1729 | X030466Y028927D01* 1730 | X030541Y028852D01* 1731 | X030541Y028702D01* 1732 | X030466Y028627D01* 1733 | X028541Y028580D02* 1734 | X028240Y028580D01* 1735 | X028090Y028430D01* 1736 | X028240Y028280D01* 1737 | X028541Y028280D01* 1738 | X028316Y028280D02* 1739 | X028316Y028580D01* 1740 | X028240Y028741D02* 1741 | X028090Y028891D01* 1742 | X028541Y028891D01* 1743 | X028541Y028741D02* 1744 | X028541Y029041D01* 1745 | X028466Y029201D02* 1746 | X028541Y029276D01* 1747 | X028541Y029426D01* 1748 | X028466Y029501D01* 1749 | X028391Y029501D01* 1750 | X028316Y029426D01* 1751 | X028316Y029351D01* 1752 | X028316Y029426D02* 1753 | X028240Y029501D01* 1754 | X028165Y029501D01* 1755 | X028090Y029426D01* 1756 | X028090Y029276D01* 1757 | X028165Y029201D01* 1758 | X028090Y030439D02* 1759 | X028090Y030664D01* 1760 | X028165Y030739D01* 1761 | X028316Y030739D01* 1762 | X028391Y030664D01* 1763 | X028391Y030439D01* 1764 | X028541Y030439D02* 1765 | X028090Y030439D01* 1766 | X028391Y030589D02* 1767 | X028541Y030739D01* 1768 | X028466Y030899D02* 1769 | X028165Y030899D01* 1770 | X028090Y030974D01* 1771 | X028090Y031124D01* 1772 | X028165Y031199D01* 1773 | X028466Y031199D01* 1774 | X028541Y031124D01* 1775 | X028541Y030974D01* 1776 | X028466Y030899D01* 1777 | X028541Y031359D02* 1778 | X028090Y031359D01* 1779 | X028240Y031510D01* 1780 | X028090Y031660D01* 1781 | X028541Y031660D01* 1782 | X028541Y032280D02* 1783 | X028240Y032280D01* 1784 | X028090Y032430D01* 1785 | X028240Y032580D01* 1786 | X028541Y032580D01* 1787 | X028541Y032741D02* 1788 | X028541Y033041D01* 1789 | X028541Y032891D02* 1790 | X028090Y032891D01* 1791 | X028240Y032741D01* 1792 | X028316Y032580D02* 1793 | X028316Y032280D01* 1794 | X028316Y033201D02* 1795 | X028316Y033501D01* 1796 | X028541Y033426D02* 1797 | X028090Y033426D01* 1798 | X028316Y033201D01* 1799 | X030090Y032852D02* 1800 | X030165Y032927D01* 1801 | X030466Y032927D01* 1802 | X030541Y032852D01* 1803 | X030541Y032702D01* 1804 | X030466Y032627D01* 1805 | X030165Y032627D01* 1806 | X030090Y032702D01* 1807 | X030090Y032852D01* 1808 | X030541Y032467D02* 1809 | X030541Y032166D01* 1810 | X030090Y032166D01* 1811 | X030090Y031549D02* 1812 | X030090Y031399D01* 1813 | X030090Y031474D02* 1814 | X030541Y031474D01* 1815 | X030541Y031399D02* 1816 | X030541Y031549D01* 1817 | X030541Y031239D02* 1818 | X030090Y031239D01* 1819 | X030316Y031239D02* 1820 | X030316Y030939D01* 1821 | X030541Y030939D02* 1822 | X030090Y030939D01* 1823 | X030841Y033189D02* 1824 | X030841Y033489D01* 1825 | X030916Y033489D01* 1826 | X030991Y033414D01* 1827 | X031066Y033489D01* 1828 | X031141Y033414D01* 1829 | X031141Y033189D01* 1830 | X030991Y033189D02* 1831 | X030991Y033414D01* 1832 | X031301Y033489D02* 1833 | X031376Y033489D01* 1834 | X031376Y033189D01* 1835 | X031301Y033189D02* 1836 | X031451Y033189D01* 1837 | X031608Y033264D02* 1838 | X031683Y033189D01* 1839 | X031908Y033189D01* 1840 | X032068Y033189D02* 1841 | X032068Y033489D01* 1842 | X032068Y033339D02* 1843 | X032219Y033489D01* 1844 | X032294Y033489D01* 1845 | X032452Y033414D02* 1846 | X032452Y033264D01* 1847 | X032527Y033189D01* 1848 | X032677Y033189D01* 1849 | X032752Y033264D01* 1850 | X032752Y033414D01* 1851 | X032677Y033489D01* 1852 | X032527Y033489D01* 1853 | X032452Y033414D01* 1854 | X032913Y033414D02* 1855 | X033213Y033414D01* 1856 | X033373Y033414D02* 1857 | X033598Y033414D01* 1858 | X033673Y033339D01* 1859 | X033673Y033264D01* 1860 | X033598Y033189D01* 1861 | X033373Y033189D01* 1862 | X033373Y033639D01* 1863 | X033598Y033639D01* 1864 | X033673Y033564D01* 1865 | X033673Y033489D01* 1866 | X033598Y033414D01* 1867 | X033293Y033939D02* 1868 | X033143Y034089D01* 1869 | X033143Y034389D01* 1870 | X032983Y034389D02* 1871 | X032682Y034389D01* 1872 | X032682Y034164D01* 1873 | X032832Y034239D01* 1874 | X032908Y034239D01* 1875 | X032983Y034164D01* 1876 | X032983Y034014D01* 1877 | X032908Y033939D01* 1878 | X032757Y033939D01* 1879 | X032682Y034014D01* 1880 | X033293Y033939D02* 1881 | X033443Y034089D01* 1882 | X033443Y034389D01* 1883 | X032062Y034314D02* 1884 | X032062Y034239D01* 1885 | X031987Y034164D01* 1886 | X031762Y034164D01* 1887 | X031601Y034089D02* 1888 | X031601Y034014D01* 1889 | X031526Y033939D01* 1890 | X031376Y033939D01* 1891 | X031301Y034014D01* 1892 | X031141Y034014D02* 1893 | X031141Y034389D01* 1894 | X031301Y034314D02* 1895 | X031301Y034239D01* 1896 | X031376Y034164D01* 1897 | X031526Y034164D01* 1898 | X031601Y034089D01* 1899 | X031762Y033939D02* 1900 | X031762Y034389D01* 1901 | X031987Y034389D01* 1902 | X032062Y034314D01* 1903 | X031987Y034164D02* 1904 | X032062Y034089D01* 1905 | X032062Y034014D01* 1906 | X031987Y033939D01* 1907 | X031762Y033939D01* 1908 | X031601Y034314D02* 1909 | X031526Y034389D01* 1910 | X031376Y034389D01* 1911 | X031301Y034314D01* 1912 | X031141Y034014D02* 1913 | X031066Y033939D01* 1914 | X030916Y033939D01* 1915 | X030841Y034014D01* 1916 | X030841Y034389D01* 1917 | X031376Y033714D02* 1918 | X031376Y033639D01* 1919 | X031608Y033414D02* 1920 | X031608Y033264D01* 1921 | X031608Y033414D02* 1922 | X031683Y033489D01* 1923 | X031908Y033489D01* 1924 | X032710Y031889D02* 1925 | X032935Y031889D01* 1926 | X033010Y031814D01* 1927 | X033010Y031664D01* 1928 | X032935Y031589D01* 1929 | X032710Y031589D01* 1930 | X032710Y031439D02* 1931 | X032710Y031889D01* 1932 | X033170Y031889D02* 1933 | X033170Y031439D01* 1934 | X033320Y031589D01* 1935 | X033470Y031439D01* 1936 | X033470Y031889D01* 1937 | X033630Y031889D02* 1938 | X033856Y031889D01* 1939 | X033931Y031814D01* 1940 | X033931Y031664D01* 1941 | X033856Y031589D01* 1942 | X033630Y031589D01* 1943 | X033630Y031439D02* 1944 | X033630Y031889D01* 1945 | X033780Y031589D02* 1946 | X033931Y031439D01* 1947 | X038091Y031564D02* 1948 | X038091Y031264D01* 1949 | X038166Y031189D01* 1950 | X038316Y031189D01* 1951 | X038391Y031264D01* 1952 | X038391Y031414D01* 1953 | X038241Y031414D01* 1954 | X038391Y031564D02* 1955 | X038316Y031639D01* 1956 | X038166Y031639D01* 1957 | X038091Y031564D01* 1958 | X038551Y031639D02* 1959 | X038851Y031189D01* 1960 | X038851Y031639D01* 1961 | X039012Y031639D02* 1962 | X039237Y031639D01* 1963 | X039312Y031564D01* 1964 | X039312Y031264D01* 1965 | X039237Y031189D01* 1966 | X039012Y031189D01* 1967 | X039012Y031639D01* 1968 | X038551Y031639D02* 1969 | X038551Y031189D01* 1970 | X038701Y034189D02* 1971 | X038851Y034339D01* 1972 | X038851Y034639D01* 1973 | X038551Y034639D02* 1974 | X038551Y034339D01* 1975 | X038701Y034189D01* 1976 | X038391Y034264D02* 1977 | X038316Y034189D01* 1978 | X038166Y034189D01* 1979 | X038091Y034264D01* 1980 | X038091Y034414D02* 1981 | X038241Y034489D01* 1982 | X038316Y034489D01* 1983 | X038391Y034414D01* 1984 | X038391Y034264D01* 1985 | X038091Y034414D02* 1986 | X038091Y034639D01* 1987 | X038391Y034639D01* 1988 | X039841Y034564D02* 1989 | X039841Y034489D01* 1990 | X039916Y034414D01* 1991 | X040066Y034414D01* 1992 | X040141Y034339D01* 1993 | X040141Y034264D01* 1994 | X040066Y034189D01* 1995 | X039916Y034189D01* 1996 | X039841Y034264D01* 1997 | X039841Y034564D02* 1998 | X039916Y034639D01* 1999 | X040066Y034639D01* 2000 | X040141Y034564D01* 2001 | X040301Y034639D02* 2002 | X040301Y034189D01* 2003 | X040451Y034339D01* 2004 | X040601Y034189D01* 2005 | X040601Y034639D01* 2006 | X028541Y027660D02* 2007 | X028090Y027660D01* 2008 | X028240Y027510D01* 2009 | X028090Y027359D01* 2010 | X028541Y027359D01* 2011 | X028466Y027199D02* 2012 | X028165Y027199D01* 2013 | X028090Y027124D01* 2014 | X028090Y026974D01* 2015 | X028165Y026899D01* 2016 | X028466Y026899D01* 2017 | X028541Y026974D01* 2018 | X028541Y027124D01* 2019 | X028466Y027199D01* 2020 | X028541Y026739D02* 2021 | X028391Y026589D01* 2022 | X028391Y026664D02* 2023 | X028391Y026439D01* 2024 | X028541Y026439D02* 2025 | X028090Y026439D01* 2026 | X028090Y026664D01* 2027 | X028165Y026739D01* 2028 | X028316Y026739D01* 2029 | X028391Y026664D01* 2030 | X029665Y025001D02* 2031 | X029740Y025001D01* 2032 | X029816Y024926D01* 2033 | X029816Y024776D01* 2034 | X029740Y024701D01* 2035 | X029665Y024701D01* 2036 | X029590Y024776D01* 2037 | X029590Y024926D01* 2038 | X029665Y025001D01* 2039 | X029816Y024926D02* 2040 | X029891Y025001D01* 2041 | X029966Y025001D01* 2042 | X030041Y024926D01* 2043 | X030041Y024776D01* 2044 | X029966Y024701D01* 2045 | X029891Y024701D01* 2046 | X029816Y024776D01* 2047 | X029891Y024541D02* 2048 | X029966Y024541D01* 2049 | X030041Y024466D01* 2050 | X030041Y024316D01* 2051 | X029966Y024241D01* 2052 | X030041Y024080D02* 2053 | X030041Y023780D01* 2054 | X030041Y023930D02* 2055 | X029590Y023930D01* 2056 | X029740Y023780D01* 2057 | X029665Y023620D02* 2058 | X029590Y023545D01* 2059 | X029590Y023395D01* 2060 | X029665Y023320D01* 2061 | X029966Y023320D01* 2062 | X030041Y023395D01* 2063 | X030041Y023545D01* 2064 | X029966Y023620D01* 2065 | X030041Y023160D02* 2066 | X029590Y023160D01* 2067 | X029816Y023160D02* 2068 | X029816Y022859D01* 2069 | X029816Y022699D02* 2070 | X029816Y022399D01* 2071 | X029590Y022624D01* 2072 | X030041Y022624D01* 2073 | X030041Y022859D02* 2074 | X029590Y022859D01* 2075 | X029590Y022239D02* 2076 | X029665Y022239D01* 2077 | X029966Y021939D01* 2078 | X030041Y021939D01* 2079 | X029590Y021939D02* 2080 | X029590Y022239D01* 2081 | X029665Y024241D02* 2082 | X029590Y024316D01* 2083 | X029590Y024466D01* 2084 | X029665Y024541D01* 2085 | X029740Y024541D01* 2086 | X029816Y024466D01* 2087 | X029891Y024541D01* 2088 | X029816Y024466D02* 2089 | X029816Y024391D01* 2090 | X023007Y032914D02* 2091 | X023009Y032961D01* 2092 | X023015Y033007D01* 2093 | X023025Y033053D01* 2094 | X023038Y033098D01* 2095 | X023055Y033141D01* 2096 | X023076Y033183D01* 2097 | X023100Y033223D01* 2098 | X023128Y033261D01* 2099 | X023159Y033297D01* 2100 | X023192Y033329D01* 2101 | X023228Y033359D01* 2102 | X023266Y033386D01* 2103 | X023307Y033409D01* 2104 | X023349Y033429D01* 2105 | X023393Y033446D01* 2106 | X023438Y033458D01* 2107 | X023484Y033467D01* 2108 | X023531Y033472D01* 2109 | X023578Y033473D01* 2110 | X023624Y033470D01* 2111 | X023671Y033463D01* 2112 | X023716Y033452D01* 2113 | X023761Y033438D01* 2114 | X023804Y033420D01* 2115 | X023845Y033398D01* 2116 | X023885Y033373D01* 2117 | X023922Y033345D01* 2118 | X023957Y033313D01* 2119 | X023989Y033279D01* 2120 | X024018Y033243D01* 2121 | X024044Y033204D01* 2122 | X024067Y033163D01* 2123 | X024086Y033120D01* 2124 | X024101Y033076D01* 2125 | X024113Y033030D01* 2126 | X024121Y032984D01* 2127 | X024125Y032937D01* 2128 | X024125Y032891D01* 2129 | X024121Y032844D01* 2130 | X024113Y032798D01* 2131 | X024101Y032752D01* 2132 | X024086Y032708D01* 2133 | X024067Y032665D01* 2134 | X024044Y032624D01* 2135 | X024018Y032585D01* 2136 | X023989Y032549D01* 2137 | X023957Y032515D01* 2138 | X023922Y032483D01* 2139 | X023885Y032455D01* 2140 | X023846Y032430D01* 2141 | X023804Y032408D01* 2142 | X023761Y032390D01* 2143 | X023716Y032376D01* 2144 | X023671Y032365D01* 2145 | X023624Y032358D01* 2146 | X023578Y032355D01* 2147 | X023531Y032356D01* 2148 | X023484Y032361D01* 2149 | X023438Y032370D01* 2150 | X023393Y032382D01* 2151 | X023349Y032399D01* 2152 | X023307Y032419D01* 2153 | X023266Y032442D01* 2154 | X023228Y032469D01* 2155 | X023192Y032499D01* 2156 | X023159Y032531D01* 2157 | X023128Y032567D01* 2158 | X023100Y032605D01* 2159 | X023076Y032645D01* 2160 | X023055Y032687D01* 2161 | X023038Y032730D01* 2162 | X023025Y032775D01* 2163 | X023015Y032821D01* 2164 | X023009Y032867D01* 2165 | X023007Y032914D01* 2166 | X017535Y020889D02* 2167 | X017234Y020589D01* 2168 | X017309Y020664D02* 2169 | X017535Y020439D01* 2170 | X017234Y020439D02* 2171 | X017234Y020889D01* 2172 | X017074Y020814D02* 2173 | X016999Y020889D01* 2174 | X016849Y020889D01* 2175 | X016774Y020814D01* 2176 | X016614Y020814D02* 2177 | X016614Y020739D01* 2178 | X016539Y020664D01* 2179 | X016614Y020589D01* 2180 | X016614Y020514D01* 2181 | X016539Y020439D01* 2182 | X016389Y020439D01* 2183 | X016313Y020514D01* 2184 | X016153Y020439D02* 2185 | X015853Y020739D01* 2186 | X015693Y020739D02* 2187 | X015618Y020664D01* 2188 | X015468Y020664D01* 2189 | X015393Y020739D01* 2190 | X015393Y020814D01* 2191 | X015468Y020889D01* 2192 | X015618Y020889D01* 2193 | X015693Y020814D01* 2194 | X015693Y020739D01* 2195 | X015618Y020664D02* 2196 | X015693Y020589D01* 2197 | X015693Y020514D01* 2198 | X015618Y020439D01* 2199 | X015468Y020439D01* 2200 | X015393Y020514D01* 2201 | X015393Y020589D01* 2202 | X015468Y020664D01* 2203 | X015853Y020439D02* 2204 | X016153Y020739D01* 2205 | X016313Y020814D02* 2206 | X016389Y020889D01* 2207 | X016539Y020889D01* 2208 | X016614Y020814D01* 2209 | X016539Y020664D02* 2210 | X016464Y020664D01* 2211 | X016774Y020439D02* 2212 | X017074Y020739D01* 2213 | X017074Y020814D01* 2214 | X017074Y020439D02* 2215 | X016774Y020439D01* 2216 | X016787Y018889D02* 2217 | X016712Y018814D01* 2218 | X016712Y018739D01* 2219 | X016787Y018664D01* 2220 | X016937Y018664D01* 2221 | X017012Y018589D01* 2222 | X017012Y018514D01* 2223 | X016937Y018439D01* 2224 | X016787Y018439D01* 2225 | X016712Y018514D01* 2226 | X016552Y018439D02* 2227 | X016252Y018439D01* 2228 | X016552Y018739D01* 2229 | X016552Y018814D01* 2230 | X016477Y018889D01* 2231 | X016327Y018889D01* 2232 | X016252Y018814D01* 2233 | X016091Y018814D02* 2234 | X015791Y018514D01* 2235 | X015866Y018439D01* 2236 | X016016Y018439D01* 2237 | X016091Y018514D01* 2238 | X016091Y018814D01* 2239 | X016016Y018889D01* 2240 | X015866Y018889D01* 2241 | X015791Y018814D01* 2242 | X015791Y018514D01* 2243 | X015631Y018514D02* 2244 | X015556Y018439D01* 2245 | X015406Y018439D01* 2246 | X015331Y018514D01* 2247 | X015331Y018814D01* 2248 | X015406Y018889D01* 2249 | X015556Y018889D01* 2250 | X015631Y018814D01* 2251 | X015171Y018889D02* 2252 | X014870Y018889D01* 2253 | X014870Y018664D01* 2254 | X015021Y018739D01* 2255 | X015096Y018739D01* 2256 | X015171Y018664D01* 2257 | X015171Y018514D01* 2258 | X015096Y018439D01* 2259 | X014945Y018439D01* 2260 | X014870Y018514D01* 2261 | X014710Y018514D02* 2262 | X014710Y018589D01* 2263 | X014635Y018664D01* 2264 | X014410Y018664D01* 2265 | X014410Y018514D01* 2266 | X014485Y018439D01* 2267 | X014635Y018439D01* 2268 | X014710Y018514D01* 2269 | X014560Y018814D02* 2270 | X014410Y018664D01* 2271 | X014560Y018814D02* 2272 | X014710Y018889D01* 2273 | X014250Y018889D02* 2274 | X014250Y018439D01* 2275 | X014100Y018589D01* 2276 | X013950Y018439D01* 2277 | X013950Y018889D01* 2278 | X013793Y018889D02* 2279 | X013643Y018739D01* 2280 | X013643Y018589D01* 2281 | X013793Y018439D01* 2282 | X013022Y018439D02* 2283 | X012722Y018439D01* 2284 | X013022Y018739D01* 2285 | X013022Y018814D01* 2286 | X012947Y018889D01* 2287 | X012797Y018889D01* 2288 | X012722Y018814D01* 2289 | X012562Y018814D02* 2290 | X012262Y018514D01* 2291 | X012337Y018439D01* 2292 | X012487Y018439D01* 2293 | X012562Y018514D01* 2294 | X012562Y018814D01* 2295 | X012487Y018889D01* 2296 | X012337Y018889D01* 2297 | X012262Y018814D01* 2298 | X012262Y018514D01* 2299 | X012101Y018514D02* 2300 | X012026Y018439D01* 2301 | X011876Y018439D01* 2302 | X011801Y018514D01* 2303 | X011801Y018664D02* 2304 | X011951Y018739D01* 2305 | X012026Y018739D01* 2306 | X012101Y018664D01* 2307 | X012101Y018514D01* 2308 | X011801Y018664D02* 2309 | X011801Y018889D01* 2310 | X012101Y018889D01* 2311 | X011641Y018889D02* 2312 | X011491Y018814D01* 2313 | X011341Y018664D01* 2314 | X011566Y018664D01* 2315 | X011641Y018589D01* 2316 | X011641Y018514D01* 2317 | X011566Y018439D01* 2318 | X011416Y018439D01* 2319 | X011341Y018514D01* 2320 | X011341Y018664D01* 2321 | X013166Y020439D02* 2322 | X013091Y020514D01* 2323 | X013166Y020439D02* 2324 | X013316Y020439D01* 2325 | X013391Y020514D01* 2326 | X013391Y020589D01* 2327 | X013316Y020664D01* 2328 | X013166Y020664D01* 2329 | X013091Y020739D01* 2330 | X013091Y020814D01* 2331 | X013166Y020889D01* 2332 | X013316Y020889D01* 2333 | X013391Y020814D01* 2334 | X013551Y020889D02* 2335 | X013776Y020889D01* 2336 | X013851Y020814D01* 2337 | X013851Y020664D01* 2338 | X013776Y020589D01* 2339 | X013551Y020589D01* 2340 | X013701Y020589D02* 2341 | X013851Y020439D01* 2342 | X014012Y020439D02* 2343 | X014012Y020739D01* 2344 | X014162Y020889D01* 2345 | X014312Y020739D01* 2346 | X014312Y020439D01* 2347 | X014472Y020439D02* 2348 | X014472Y020889D01* 2349 | X014622Y020739D01* 2350 | X014772Y020889D01* 2351 | X014772Y020439D01* 2352 | X014312Y020664D02* 2353 | X014012Y020664D01* 2354 | X013551Y020439D02* 2355 | X013551Y020889D01* 2356 | X016787Y018889D02* 2357 | X016937Y018889D01* 2358 | X017012Y018814D01* 2359 | X017172Y018889D02* 2360 | X017323Y018739D01* 2361 | X017323Y018589D01* 2362 | X017172Y018439D01* 2363 | X014007Y015914D02* 2364 | X014009Y015961D01* 2365 | X014015Y016007D01* 2366 | X014025Y016053D01* 2367 | X014038Y016098D01* 2368 | X014055Y016141D01* 2369 | X014076Y016183D01* 2370 | X014100Y016223D01* 2371 | X014128Y016261D01* 2372 | X014159Y016297D01* 2373 | X014192Y016329D01* 2374 | X014228Y016359D01* 2375 | X014266Y016386D01* 2376 | X014307Y016409D01* 2377 | X014349Y016429D01* 2378 | X014393Y016446D01* 2379 | X014438Y016458D01* 2380 | X014484Y016467D01* 2381 | X014531Y016472D01* 2382 | X014578Y016473D01* 2383 | X014624Y016470D01* 2384 | X014671Y016463D01* 2385 | X014716Y016452D01* 2386 | X014761Y016438D01* 2387 | X014804Y016420D01* 2388 | X014845Y016398D01* 2389 | X014885Y016373D01* 2390 | X014922Y016345D01* 2391 | X014957Y016313D01* 2392 | X014989Y016279D01* 2393 | X015018Y016243D01* 2394 | X015044Y016204D01* 2395 | X015067Y016163D01* 2396 | X015086Y016120D01* 2397 | X015101Y016076D01* 2398 | X015113Y016030D01* 2399 | X015121Y015984D01* 2400 | X015125Y015937D01* 2401 | X015125Y015891D01* 2402 | X015121Y015844D01* 2403 | X015113Y015798D01* 2404 | X015101Y015752D01* 2405 | X015086Y015708D01* 2406 | X015067Y015665D01* 2407 | X015044Y015624D01* 2408 | X015018Y015585D01* 2409 | X014989Y015549D01* 2410 | X014957Y015515D01* 2411 | X014922Y015483D01* 2412 | X014885Y015455D01* 2413 | X014846Y015430D01* 2414 | X014804Y015408D01* 2415 | X014761Y015390D01* 2416 | X014716Y015376D01* 2417 | X014671Y015365D01* 2418 | X014624Y015358D01* 2419 | X014578Y015355D01* 2420 | X014531Y015356D01* 2421 | X014484Y015361D01* 2422 | X014438Y015370D01* 2423 | X014393Y015382D01* 2424 | X014349Y015399D01* 2425 | X014307Y015419D01* 2426 | X014266Y015442D01* 2427 | X014228Y015469D01* 2428 | X014192Y015499D01* 2429 | X014159Y015531D01* 2430 | X014128Y015567D01* 2431 | X014100Y015605D01* 2432 | X014076Y015645D01* 2433 | X014055Y015687D01* 2434 | X014038Y015730D01* 2435 | X014025Y015775D01* 2436 | X014015Y015821D01* 2437 | X014009Y015867D01* 2438 | X014007Y015914D01* 2439 | X007291Y025939D02* 2440 | X007291Y026239D01* 2441 | X007291Y026399D02* 2442 | X007291Y026699D01* 2443 | X007291Y026859D02* 2444 | X006840Y026859D01* 2445 | X006840Y027085D01* 2446 | X006915Y027160D01* 2447 | X007066Y027160D01* 2448 | X007141Y027085D01* 2449 | X007141Y026859D01* 2450 | X007066Y026549D02* 2451 | X007066Y026399D01* 2452 | X007291Y026399D02* 2453 | X006840Y026399D01* 2454 | X006840Y026699D01* 2455 | X006840Y027320D02* 2456 | X006840Y027545D01* 2457 | X006915Y027620D01* 2458 | X007066Y027620D01* 2459 | X007141Y027545D01* 2460 | X007141Y027320D01* 2461 | X007291Y027320D02* 2462 | X006840Y027320D01* 2463 | X007141Y027470D02* 2464 | X007291Y027620D01* 2465 | X007216Y027780D02* 2466 | X007291Y027855D01* 2467 | X007291Y028005D01* 2468 | X007216Y028080D01* 2469 | X006915Y028080D01* 2470 | X006840Y028005D01* 2471 | X006840Y027855D01* 2472 | X006915Y027780D01* 2473 | X007216Y027780D01* 2474 | X007291Y028241D02* 2475 | X006840Y028241D01* 2476 | X006990Y028391D01* 2477 | X006840Y028541D01* 2478 | X007291Y028541D01* 2479 | X007291Y029161D02* 2480 | X006990Y029462D01* 2481 | X006915Y029462D01* 2482 | X006840Y029387D01* 2483 | X006840Y029236D01* 2484 | X006915Y029161D01* 2485 | X007291Y029161D02* 2486 | X007291Y029462D01* 2487 | X007216Y029622D02* 2488 | X007141Y029622D01* 2489 | X007066Y029697D01* 2490 | X007066Y029847D01* 2491 | X007141Y029922D01* 2492 | X007216Y029922D01* 2493 | X007291Y029847D01* 2494 | X007291Y029697D01* 2495 | X007216Y029622D01* 2496 | X007066Y029697D02* 2497 | X006990Y029622D01* 2498 | X006915Y029622D01* 2499 | X006840Y029697D01* 2500 | X006840Y029847D01* 2501 | X006915Y029922D01* 2502 | X006990Y029922D01* 2503 | X007066Y029847D01* 2504 | X007216Y030082D02* 2505 | X007291Y030157D01* 2506 | X007291Y030307D01* 2507 | X007216Y030382D01* 2508 | X007291Y030543D02* 2509 | X006990Y030843D01* 2510 | X006915Y030843D01* 2511 | X006840Y030768D01* 2512 | X006840Y030618D01* 2513 | X006915Y030543D01* 2514 | X006915Y030382D02* 2515 | X006840Y030307D01* 2516 | X006840Y030157D01* 2517 | X006915Y030082D01* 2518 | X007216Y030082D01* 2519 | X007291Y030543D02* 2520 | X007291Y030843D01* 2521 | X007216Y031003D02* 2522 | X007291Y031078D01* 2523 | X007291Y031228D01* 2524 | X007216Y031303D01* 2525 | X007066Y031303D01* 2526 | X006990Y031228D01* 2527 | X006990Y031153D01* 2528 | X007066Y031003D01* 2529 | X006840Y031003D01* 2530 | X006840Y031303D01* 2531 | X007066Y031463D02* 2532 | X007066Y031689D01* 2533 | X007141Y031764D01* 2534 | X007216Y031764D01* 2535 | X007291Y031689D01* 2536 | X007291Y031538D01* 2537 | X007216Y031463D01* 2538 | X007066Y031463D01* 2539 | X006915Y031613D01* 2540 | X006840Y031764D01* 2541 | X006840Y026239D02* 2542 | X006840Y025939D01* 2543 | X007291Y025939D01* 2544 | X007066Y025939D02* 2545 | X007066Y026089D01* 2546 | X013741Y004639D02* 2547 | X013741Y004189D01* 2548 | X013591Y004189D02* 2549 | X013891Y004189D01* 2550 | X013591Y004489D02* 2551 | X013741Y004639D01* 2552 | X023316Y003914D02* 2553 | X023316Y003664D01* 2554 | X024816Y003664D01* 2555 | X024816Y003914D01* 2556 | D12* 2557 | X030581Y020879D02* 2558 | X030716Y020879D01* 2559 | X030761Y020924D01* 2560 | X030761Y021104D01* 2561 | X030716Y021149D01* 2562 | X030581Y021149D01* 2563 | X030581Y020879D01* 2564 | X030857Y020924D02* 2565 | X030902Y020879D01* 2566 | X030992Y020879D01* 2567 | X031037Y020924D01* 2568 | X031037Y020969D01* 2569 | X030992Y021014D01* 2570 | X030902Y021014D01* 2571 | X030857Y021059D01* 2572 | X030857Y021104D01* 2573 | X030902Y021149D01* 2574 | X030992Y021149D01* 2575 | X031037Y021104D01* 2576 | X031133Y021059D02* 2577 | X031223Y021149D01* 2578 | X031223Y020879D01* 2579 | X031133Y020879D02* 2580 | X031313Y020879D01* 2581 | X031409Y020924D02* 2582 | X031409Y020969D01* 2583 | X031454Y021014D01* 2584 | X031545Y021014D01* 2585 | X031590Y020969D01* 2586 | X031590Y020924D01* 2587 | X031545Y020879D01* 2588 | X031454Y020879D01* 2589 | X031409Y020924D01* 2590 | X031454Y021014D02* 2591 | X031409Y021059D01* 2592 | X031409Y021104D01* 2593 | X031454Y021149D01* 2594 | X031545Y021149D01* 2595 | X031590Y021104D01* 2596 | X031590Y021059D01* 2597 | X031545Y021014D01* 2598 | X031686Y021059D02* 2599 | X031776Y021149D01* 2600 | X031776Y020879D01* 2601 | X031686Y020879D02* 2602 | X031866Y020879D01* 2603 | X031962Y020924D02* 2604 | X032007Y020879D01* 2605 | X032097Y020879D01* 2606 | X032142Y020924D01* 2607 | X032142Y020969D01* 2608 | X032097Y021014D01* 2609 | X032052Y021014D01* 2610 | X032097Y021014D02* 2611 | X032142Y021059D01* 2612 | X032142Y021104D01* 2613 | X032097Y021149D01* 2614 | X032007Y021149D01* 2615 | X031962Y021104D01* 2616 | D13* 2617 | X013066Y006914D02* 2618 | X013066Y003664D01* 2619 | X013066Y006914D02* 2620 | X013068Y006958D01* 2621 | X013074Y007001D01* 2622 | X013083Y007043D01* 2623 | X013096Y007085D01* 2624 | X013113Y007125D01* 2625 | X013133Y007164D01* 2626 | X013156Y007201D01* 2627 | X013183Y007235D01* 2628 | X013212Y007268D01* 2629 | X013245Y007297D01* 2630 | X013279Y007324D01* 2631 | X013316Y007347D01* 2632 | X013355Y007367D01* 2633 | X013395Y007384D01* 2634 | X013437Y007397D01* 2635 | X013479Y007406D01* 2636 | X013522Y007412D01* 2637 | X013566Y007414D01* 2638 | X034566Y007414D01* 2639 | X034610Y007412D01* 2640 | X034653Y007406D01* 2641 | X034695Y007397D01* 2642 | X034737Y007384D01* 2643 | X034777Y007367D01* 2644 | X034816Y007347D01* 2645 | X034853Y007324D01* 2646 | X034887Y007297D01* 2647 | X034920Y007268D01* 2648 | X034949Y007235D01* 2649 | X034976Y007201D01* 2650 | X034999Y007164D01* 2651 | X035019Y007125D01* 2652 | X035036Y007085D01* 2653 | X035049Y007043D01* 2654 | X035058Y007001D01* 2655 | X035064Y006958D01* 2656 | X035066Y006914D01* 2657 | X035066Y003664D01* 2658 | X040566Y008414D02* 2659 | X040566Y021207D01* 2660 | X040568Y021257D01* 2661 | X040573Y021308D01* 2662 | X040582Y021357D01* 2663 | X040595Y021406D01* 2664 | X040611Y021454D01* 2665 | X040630Y021501D01* 2666 | X040652Y021546D01* 2667 | X040678Y021589D01* 2668 | X040707Y021631D01* 2669 | X040739Y021670D01* 2670 | X040773Y021707D01* 2671 | X040810Y021741D01* 2672 | X040849Y021773D01* 2673 | X040891Y021802D01* 2674 | X040934Y021828D01* 2675 | X040979Y021850D01* 2676 | X041026Y021869D01* 2677 | X041074Y021885D01* 2678 | X041123Y021898D01* 2679 | X041172Y021907D01* 2680 | X041223Y021912D01* 2681 | X041273Y021914D01* 2682 | X043816Y021914D01* 2683 | X043816Y022414D02* 2684 | X039773Y022414D01* 2685 | X039723Y022416D01* 2686 | X039672Y022421D01* 2687 | X039623Y022430D01* 2688 | X039574Y022443D01* 2689 | X039526Y022459D01* 2690 | X039479Y022478D01* 2691 | X039434Y022500D01* 2692 | X039391Y022526D01* 2693 | X039349Y022555D01* 2694 | X039310Y022587D01* 2695 | X039273Y022621D01* 2696 | X039239Y022658D01* 2697 | X039207Y022697D01* 2698 | X039178Y022739D01* 2699 | X039152Y022782D01* 2700 | X039130Y022827D01* 2701 | X039111Y022874D01* 2702 | X039095Y022922D01* 2703 | X039082Y022971D01* 2704 | X039073Y023020D01* 2705 | X039068Y023071D01* 2706 | X039066Y023121D01* 2707 | X039066Y030207D01* 2708 | X039068Y030257D01* 2709 | X039073Y030308D01* 2710 | X039082Y030357D01* 2711 | X039095Y030406D01* 2712 | X039111Y030454D01* 2713 | X039130Y030501D01* 2714 | X039152Y030546D01* 2715 | X039178Y030589D01* 2716 | X039207Y030631D01* 2717 | X039239Y030670D01* 2718 | X039273Y030707D01* 2719 | X039310Y030741D01* 2720 | X039349Y030773D01* 2721 | X039391Y030802D01* 2722 | X039434Y030828D01* 2723 | X039479Y030850D01* 2724 | X039526Y030869D01* 2725 | X039574Y030885D01* 2726 | X039623Y030898D01* 2727 | X039672Y030907D01* 2728 | X039723Y030912D01* 2729 | X039773Y030914D01* 2730 | X043816Y030914D01* 2731 | X040566Y008414D02* 2732 | X040568Y008370D01* 2733 | X040574Y008327D01* 2734 | X040583Y008285D01* 2735 | X040596Y008243D01* 2736 | X040613Y008203D01* 2737 | X040633Y008164D01* 2738 | X040656Y008127D01* 2739 | X040683Y008093D01* 2740 | X040712Y008060D01* 2741 | X040745Y008031D01* 2742 | X040779Y008004D01* 2743 | X040816Y007981D01* 2744 | X040855Y007961D01* 2745 | X040895Y007944D01* 2746 | X040937Y007931D01* 2747 | X040979Y007922D01* 2748 | X041022Y007916D01* 2749 | X041066Y007914D01* 2750 | X043816Y007914D01* 2751 | D14* 2752 | X034796Y006998D02* 2753 | X034435Y006998D01* 2754 | X034435Y006757D02* 2755 | X034796Y006998D01* 2756 | X034796Y006757D02* 2757 | X034435Y006757D01* 2758 | X034495Y006629D02* 2759 | X034435Y006569D01* 2760 | X034435Y006449D01* 2761 | X034495Y006389D01* 2762 | X034736Y006389D01* 2763 | X034796Y006449D01* 2764 | X034796Y006569D01* 2765 | X034736Y006629D01* 2766 | X034495Y006629D01* 2767 | X034435Y006264D02* 2768 | X034435Y006144D01* 2769 | X034435Y006204D02* 2770 | X034796Y006204D01* 2771 | X034796Y006144D02* 2772 | X034796Y006264D01* 2773 | X034736Y006015D02* 2774 | X034796Y005955D01* 2775 | X034796Y005835D01* 2776 | X034736Y005775D01* 2777 | X034616Y005835D02* 2778 | X034616Y005955D01* 2779 | X034676Y006015D01* 2780 | X034736Y006015D01* 2781 | X034616Y005835D02* 2782 | X034556Y005775D01* 2783 | X034495Y005775D01* 2784 | X034435Y005835D01* 2785 | X034435Y005955D01* 2786 | X034495Y006015D01* 2787 | X034435Y005647D02* 2788 | X034796Y005647D01* 2789 | X034435Y005407D01* 2790 | X034796Y005407D01* 2791 | X034796Y005279D02* 2792 | X034556Y005279D01* 2793 | X034435Y005159D01* 2794 | X034556Y005039D01* 2795 | X034796Y005039D01* 2796 | X034616Y005039D02* 2797 | X034616Y005279D01* 2798 | X034616Y004910D02* 2799 | X034676Y004850D01* 2800 | X034676Y004670D01* 2801 | X034796Y004670D02* 2802 | X034435Y004670D01* 2803 | X034435Y004850D01* 2804 | X034495Y004910D01* 2805 | X034616Y004910D01* 2806 | X034796Y004542D02* 2807 | X034435Y004302D01* 2808 | X034435Y004174D02* 2809 | X034435Y003934D01* 2810 | X034796Y003934D01* 2811 | X034796Y004174D01* 2812 | X034796Y004302D02* 2813 | X034435Y004542D01* 2814 | X034616Y004054D02* 2815 | X034616Y003934D01* 2816 | X034731Y028587D02* 2817 | X034239Y028587D01* 2818 | X034239Y029807D01* 2819 | X034672Y030240D01* 2820 | X035459Y030240D02* 2821 | X035893Y029807D01* 2822 | X035893Y028587D01* 2823 | X035400Y028587D01* 2824 | X036239Y028587D02* 2825 | X036239Y029807D01* 2826 | X036672Y030240D01* 2827 | X037459Y030240D02* 2828 | X037893Y029807D01* 2829 | X037893Y028587D01* 2830 | X037400Y028587D01* 2831 | X036731Y028587D02* 2832 | X036239Y028587D01* 2833 | X037401Y028725D02* 2834 | X037449Y028751D01* 2835 | X037496Y028780D01* 2836 | X037541Y028813D01* 2837 | X037583Y028849D01* 2838 | X037622Y028888D01* 2839 | X037659Y028929D01* 2840 | X037692Y028973D01* 2841 | X037723Y029019D01* 2842 | X037749Y029068D01* 2843 | X037772Y029118D01* 2844 | X037792Y029170D01* 2845 | X037808Y029223D01* 2846 | X037820Y029277D01* 2847 | X037828Y029331D01* 2848 | X037832Y029386D01* 2849 | X037832Y029442D01* 2850 | X037828Y029497D01* 2851 | X037820Y029551D01* 2852 | X037808Y029605D01* 2853 | X037792Y029658D01* 2854 | X037772Y029710D01* 2855 | X037749Y029760D01* 2856 | X037723Y029809D01* 2857 | X037692Y029855D01* 2858 | X037659Y029899D01* 2859 | X037622Y029940D01* 2860 | X037583Y029979D01* 2861 | X037541Y030015D01* 2862 | X037496Y030048D01* 2863 | X037449Y030077D01* 2864 | X037401Y030103D01* 2865 | X036731Y030103D02* 2866 | X036683Y030077D01* 2867 | X036636Y030048D01* 2868 | X036591Y030015D01* 2869 | X036549Y029979D01* 2870 | X036510Y029940D01* 2871 | X036473Y029899D01* 2872 | X036440Y029855D01* 2873 | X036409Y029809D01* 2874 | X036383Y029760D01* 2875 | X036360Y029710D01* 2876 | X036340Y029658D01* 2877 | X036324Y029605D01* 2878 | X036312Y029551D01* 2879 | X036304Y029497D01* 2880 | X036300Y029442D01* 2881 | X036300Y029386D01* 2882 | X036304Y029331D01* 2883 | X036312Y029277D01* 2884 | X036324Y029223D01* 2885 | X036340Y029170D01* 2886 | X036360Y029118D01* 2887 | X036383Y029068D01* 2888 | X036409Y029019D01* 2889 | X036440Y028973D01* 2890 | X036473Y028929D01* 2891 | X036510Y028888D01* 2892 | X036549Y028849D01* 2893 | X036591Y028813D01* 2894 | X036636Y028780D01* 2895 | X036683Y028751D01* 2896 | X036731Y028725D01* 2897 | X034731Y028725D02* 2898 | X034683Y028751D01* 2899 | X034636Y028780D01* 2900 | X034591Y028813D01* 2901 | X034549Y028849D01* 2902 | X034510Y028888D01* 2903 | X034473Y028929D01* 2904 | X034440Y028973D01* 2905 | X034409Y029019D01* 2906 | X034383Y029068D01* 2907 | X034360Y029118D01* 2908 | X034340Y029170D01* 2909 | X034324Y029223D01* 2910 | X034312Y029277D01* 2911 | X034304Y029331D01* 2912 | X034300Y029386D01* 2913 | X034300Y029442D01* 2914 | X034304Y029497D01* 2915 | X034312Y029551D01* 2916 | X034324Y029605D01* 2917 | X034340Y029658D01* 2918 | X034360Y029710D01* 2919 | X034383Y029760D01* 2920 | X034409Y029809D01* 2921 | X034440Y029855D01* 2922 | X034473Y029899D01* 2923 | X034510Y029940D01* 2924 | X034549Y029979D01* 2925 | X034591Y030015D01* 2926 | X034636Y030048D01* 2927 | X034683Y030077D01* 2928 | X034731Y030103D01* 2929 | X035401Y030103D02* 2930 | X035449Y030077D01* 2931 | X035496Y030048D01* 2932 | X035541Y030015D01* 2933 | X035583Y029979D01* 2934 | X035622Y029940D01* 2935 | X035659Y029899D01* 2936 | X035692Y029855D01* 2937 | X035723Y029809D01* 2938 | X035749Y029760D01* 2939 | X035772Y029710D01* 2940 | X035792Y029658D01* 2941 | X035808Y029605D01* 2942 | X035820Y029551D01* 2943 | X035828Y029497D01* 2944 | X035832Y029442D01* 2945 | X035832Y029386D01* 2946 | X035828Y029331D01* 2947 | X035820Y029277D01* 2948 | X035808Y029223D01* 2949 | X035792Y029170D01* 2950 | X035772Y029118D01* 2951 | X035749Y029068D01* 2952 | X035723Y029019D01* 2953 | X035692Y028973D01* 2954 | X035659Y028929D01* 2955 | X035622Y028888D01* 2956 | X035583Y028849D01* 2957 | X035541Y028813D01* 2958 | X035496Y028780D01* 2959 | X035449Y028751D01* 2960 | X035401Y028725D01* 2961 | X034345Y035055D02* 2962 | X034346Y035068D01* 2963 | X034351Y035081D01* 2964 | X034358Y035092D01* 2965 | X034367Y035101D01* 2966 | X034378Y035108D01* 2967 | X034391Y035113D01* 2968 | X034404Y035114D01* 2969 | X036727Y035114D01* 2970 | X036786Y035137D02* 2971 | X036785Y035150D01* 2972 | X036780Y035163D01* 2973 | X036773Y035174D01* 2974 | X036764Y035183D01* 2975 | X036753Y035190D01* 2976 | X036740Y035195D01* 2977 | X036727Y035196D01* 2978 | X034404Y035196D01* 2979 | X034391Y035195D01* 2980 | X034378Y035190D01* 2981 | X034367Y035183D01* 2982 | X034358Y035174D01* 2983 | X034351Y035163D01* 2984 | X034346Y035150D01* 2985 | X034345Y035137D01* 2986 | X034345Y035055D01* 2987 | X036727Y035114D02* 2988 | X036740Y035113D01* 2989 | X036753Y035108D01* 2990 | X036764Y035101D01* 2991 | X036773Y035092D01* 2992 | X036780Y035081D01* 2993 | X036785Y035068D01* 2994 | X036786Y035055D01* 2995 | X036786Y035137D01* 2996 | D15* 2997 | X038066Y033664D02* 2998 | X038316Y033914D01* 2999 | X038816Y033914D01* 3000 | X039066Y033664D01* 3001 | X039066Y033164D01* 3002 | X038816Y032914D01* 3003 | X039066Y032664D01* 3004 | X039066Y032164D01* 3005 | X038816Y031914D01* 3006 | X038316Y031914D01* 3007 | X038066Y032164D01* 3008 | X038066Y032664D01* 3009 | X038316Y032914D01* 3010 | X038066Y033164D01* 3011 | X038066Y033664D01* 3012 | X039816Y033664D02* 3013 | X039816Y033164D01* 3014 | X040066Y032914D01* 3015 | X039816Y032664D01* 3016 | X039816Y032164D01* 3017 | X040066Y031914D01* 3018 | X040566Y031914D01* 3019 | X040816Y032164D01* 3020 | X040816Y032664D01* 3021 | X040566Y032914D01* 3022 | X040816Y033164D01* 3023 | X040816Y033664D01* 3024 | X040566Y033914D01* 3025 | X040066Y033914D01* 3026 | X039816Y033664D01* 3027 | X032316Y025414D02* 3028 | X031328Y025414D01* 3029 | X030816Y025020D02* 3030 | X030816Y023807D01* 3031 | X031328Y023414D02* 3032 | X032304Y023414D01* 3033 | X032816Y023807D02* 3034 | X032816Y025020D01* 3035 | X031316Y024414D02* 3036 | X031318Y024458D01* 3037 | X031324Y024502D01* 3038 | X031334Y024545D01* 3039 | X031347Y024587D01* 3040 | X031364Y024628D01* 3041 | X031385Y024667D01* 3042 | X031409Y024704D01* 3043 | X031436Y024739D01* 3044 | X031466Y024771D01* 3045 | X031499Y024801D01* 3046 | X031535Y024827D01* 3047 | X031572Y024851D01* 3048 | X031612Y024870D01* 3049 | X031653Y024887D01* 3050 | X031696Y024899D01* 3051 | X031739Y024908D01* 3052 | X031783Y024913D01* 3053 | X031827Y024914D01* 3054 | X031871Y024911D01* 3055 | X031915Y024904D01* 3056 | X031958Y024893D01* 3057 | X032000Y024879D01* 3058 | X032040Y024861D01* 3059 | X032079Y024839D01* 3060 | X032115Y024815D01* 3061 | X032149Y024787D01* 3062 | X032181Y024756D01* 3063 | X032210Y024722D01* 3064 | X032236Y024686D01* 3065 | X032258Y024648D01* 3066 | X032277Y024608D01* 3067 | X032292Y024566D01* 3068 | X032304Y024524D01* 3069 | X032312Y024480D01* 3070 | X032316Y024436D01* 3071 | X032316Y024392D01* 3072 | X032312Y024348D01* 3073 | X032304Y024304D01* 3074 | X032292Y024262D01* 3075 | X032277Y024220D01* 3076 | X032258Y024180D01* 3077 | X032236Y024142D01* 3078 | X032210Y024106D01* 3079 | X032181Y024072D01* 3080 | X032149Y024041D01* 3081 | X032115Y024013D01* 3082 | X032079Y023989D01* 3083 | X032040Y023967D01* 3084 | X032000Y023949D01* 3085 | X031958Y023935D01* 3086 | X031915Y023924D01* 3087 | X031871Y023917D01* 3088 | X031827Y023914D01* 3089 | X031783Y023915D01* 3090 | X031739Y023920D01* 3091 | X031696Y023929D01* 3092 | X031653Y023941D01* 3093 | X031612Y023958D01* 3094 | X031572Y023977D01* 3095 | X031535Y024001D01* 3096 | X031499Y024027D01* 3097 | X031466Y024057D01* 3098 | X031436Y024089D01* 3099 | X031409Y024124D01* 3100 | X031385Y024161D01* 3101 | X031364Y024200D01* 3102 | X031347Y024241D01* 3103 | X031334Y024283D01* 3104 | X031324Y024326D01* 3105 | X031318Y024370D01* 3106 | X031316Y024414D01* 3107 | X022066Y024114D02* 3108 | X022066Y023414D01* 3109 | X022022Y023412D01* 3110 | X021979Y023406D01* 3111 | X021937Y023397D01* 3112 | X021895Y023384D01* 3113 | X021855Y023367D01* 3114 | X021816Y023347D01* 3115 | X021779Y023324D01* 3116 | X021745Y023297D01* 3117 | X021712Y023268D01* 3118 | X021683Y023235D01* 3119 | X021656Y023201D01* 3120 | X021633Y023164D01* 3121 | X021613Y023125D01* 3122 | X021596Y023085D01* 3123 | X021583Y023043D01* 3124 | X021574Y023001D01* 3125 | X021568Y022958D01* 3126 | X021566Y022914D01* 3127 | X021568Y022870D01* 3128 | X021574Y022827D01* 3129 | X021583Y022785D01* 3130 | X021596Y022743D01* 3131 | X021613Y022703D01* 3132 | X021633Y022664D01* 3133 | X021656Y022627D01* 3134 | X021683Y022593D01* 3135 | X021712Y022560D01* 3136 | X021745Y022531D01* 3137 | X021779Y022504D01* 3138 | X021816Y022481D01* 3139 | X021855Y022461D01* 3140 | X021895Y022444D01* 3141 | X021937Y022431D01* 3142 | X021979Y022422D01* 3143 | X022022Y022416D01* 3144 | X022066Y022414D01* 3145 | X022066Y021714D01* 3146 | X021966Y021714D01* 3147 | X021966Y024114D02* 3148 | X022066Y024114D01* 3149 | X008166Y024114D02* 3150 | X008066Y024114D01* 3151 | X008066Y021714D01* 3152 | X008166Y021714D01* 3153 | X020063Y011924D02* 3154 | X020424Y011924D01* 3155 | X020544Y011804D01* 3156 | X020544Y011564D01* 3157 | X020424Y011444D01* 3158 | X020063Y011444D01* 3159 | X020063Y011204D02* 3160 | X020063Y011924D01* 3161 | X020920Y011684D02* 3162 | X021160Y011684D01* 3163 | X021280Y011564D01* 3164 | X021280Y011204D01* 3165 | X020920Y011204D01* 3166 | X020800Y011324D01* 3167 | X020920Y011444D01* 3168 | X021280Y011444D01* 3169 | X021536Y011324D02* 3170 | X021657Y011204D01* 3171 | X022017Y011204D01* 3172 | X022017Y011684D01* 3173 | X022273Y011924D02* 3174 | X022393Y011924D01* 3175 | X022393Y011204D01* 3176 | X022273Y011204D02* 3177 | X022513Y011204D01* 3178 | X023245Y010724D02* 3179 | X023245Y010004D01* 3180 | X022884Y010004D01* 3181 | X022764Y010124D01* 3182 | X022764Y010364D01* 3183 | X022884Y010484D01* 3184 | X023245Y010484D01* 3185 | X023621Y010484D02* 3186 | X023861Y010484D01* 3187 | X023981Y010364D01* 3188 | X023981Y010004D01* 3189 | X023621Y010004D01* 3190 | X023501Y010124D01* 3191 | X023621Y010244D01* 3192 | X023981Y010244D01* 3193 | X023981Y011204D02* 3194 | X023981Y011684D01* 3195 | X023741Y011924D01* 3196 | X023501Y011684D01* 3197 | X023501Y011204D01* 3198 | X023501Y011564D02* 3199 | X023981Y011564D01* 3200 | X024237Y011684D02* 3201 | X024237Y011204D01* 3202 | X024718Y011204D02* 3203 | X024718Y011564D01* 3204 | X024598Y011684D01* 3205 | X024237Y011684D01* 3206 | X024358Y012404D02* 3207 | X024598Y012404D01* 3208 | X024718Y012524D01* 3209 | X024718Y012644D01* 3210 | X024598Y012764D01* 3211 | X024237Y012764D01* 3212 | X024237Y012524D01* 3213 | X024358Y012404D01* 3214 | X023981Y012404D02* 3215 | X023621Y012404D01* 3216 | X023501Y012524D01* 3217 | X023621Y012644D01* 3218 | X023981Y012644D01* 3219 | X023981Y012764D02* 3220 | X023981Y012404D01* 3221 | X023981Y012764D02* 3222 | X023861Y012884D01* 3223 | X023621Y012884D01* 3224 | X023245Y012884D02* 3225 | X022884Y012884D01* 3226 | X022764Y012764D01* 3227 | X022764Y012524D01* 3228 | X022884Y012404D01* 3229 | X023245Y012404D01* 3230 | X023245Y013124D01* 3231 | X022508Y012764D02* 3232 | X022508Y012524D01* 3233 | X022388Y012404D01* 3234 | X022028Y012404D01* 3235 | X022028Y012163D02* 3236 | X022028Y012884D01* 3237 | X022388Y012884D01* 3238 | X022508Y012764D01* 3239 | X021536Y011684D02* 3240 | X021536Y011324D01* 3241 | X021651Y010724D02* 3242 | X021411Y010724D01* 3243 | X021291Y010604D01* 3244 | X021291Y010124D01* 3245 | X021411Y010004D01* 3246 | X021651Y010004D01* 3247 | X021771Y010124D01* 3248 | X021651Y010244D02* 3249 | X021411Y010244D01* 3250 | X021411Y010484D01* 3251 | X021651Y010484D01* 3252 | X021651Y010244D01* 3253 | X021771Y010364D01* 3254 | X021771Y010604D01* 3255 | X021651Y010724D01* 3256 | X022028Y010484D02* 3257 | X022388Y010484D01* 3258 | X022508Y010364D01* 3259 | X022508Y010124D01* 3260 | X022388Y010004D01* 3261 | X022028Y010004D01* 3262 | X022028Y009763D02* 3263 | X022028Y010484D01* 3264 | X024974Y010604D02* 3265 | X025094Y010724D01* 3266 | X025334Y010724D01* 3267 | X025454Y010604D01* 3268 | X025454Y010484D01* 3269 | X024974Y010004D01* 3270 | X025454Y010004D01* 3271 | X025711Y010124D02* 3272 | X026191Y010604D01* 3273 | X026191Y010124D01* 3274 | X026071Y010004D01* 3275 | X025831Y010004D01* 3276 | X025711Y010124D01* 3277 | X025711Y010604D01* 3278 | X025831Y010724D01* 3279 | X026071Y010724D01* 3280 | X026191Y010604D01* 3281 | X026447Y010484D02* 3282 | X026688Y010724D01* 3283 | X026688Y010004D01* 3284 | X026928Y010004D02* 3285 | X026447Y010004D01* 3286 | X027184Y010364D02* 3287 | X027664Y010364D01* 3288 | X027544Y010004D02* 3289 | X027544Y010724D01* 3290 | X027184Y010364D01* 3291 | X027184Y011204D02* 3292 | X027424Y011204D01* 3293 | X027304Y011204D02* 3294 | X027304Y011924D01* 3295 | X027184Y011924D01* 3296 | X026928Y011684D02* 3297 | X026567Y011684D01* 3298 | X026447Y011564D01* 3299 | X026567Y011444D01* 3300 | X026808Y011444D01* 3301 | X026928Y011324D01* 3302 | X026808Y011204D01* 3303 | X026447Y011204D01* 3304 | X026191Y011444D02* 3305 | X025711Y011444D01* 3306 | X025711Y011564D02* 3307 | X025831Y011684D01* 3308 | X026071Y011684D01* 3309 | X026191Y011564D01* 3310 | X026191Y011444D01* 3311 | X026071Y011204D02* 3312 | X025831Y011204D01* 3313 | X025711Y011324D01* 3314 | X025711Y011564D01* 3315 | X025454Y011564D02* 3316 | X025454Y011204D01* 3317 | X025454Y011564D02* 3318 | X025334Y011684D01* 3319 | X024974Y011684D01* 3320 | X024974Y011204D01* 3321 | X025094Y012404D02* 3322 | X024974Y012524D01* 3323 | X025094Y012404D02* 3324 | X025334Y012404D01* 3325 | X025454Y012524D01* 3326 | X025454Y012764D01* 3327 | X025334Y012884D01* 3328 | X025214Y012884D01* 3329 | X024974Y012764D01* 3330 | X024974Y013124D01* 3331 | X025454Y013124D01* 3332 | X025711Y013004D02* 3333 | X025831Y013124D01* 3334 | X026071Y013124D01* 3335 | X026191Y013004D01* 3336 | X025711Y012524D01* 3337 | X025831Y012404D01* 3338 | X026071Y012404D01* 3339 | X026191Y012524D01* 3340 | X026191Y013004D01* 3341 | X026447Y013004D02* 3342 | X026567Y013124D01* 3343 | X026808Y013124D01* 3344 | X026928Y013004D01* 3345 | X026928Y012884D01* 3346 | X026447Y012404D01* 3347 | X026928Y012404D01* 3348 | X027675Y011564D02* 3349 | X027795Y011684D01* 3350 | X028035Y011684D01* 3351 | X028155Y011564D01* 3352 | X028155Y011444D01* 3353 | X027675Y011444D01* 3354 | X027675Y011324D02* 3355 | X027675Y011564D01* 3356 | X027675Y011324D02* 3357 | X027795Y011204D01* 3358 | X028035Y011204D01* 3359 | X028412Y011324D02* 3360 | X028532Y011204D01* 3361 | X028892Y011204D01* 3362 | X028892Y011084D02* 3363 | X028772Y010963D01* 3364 | X028652Y010963D01* 3365 | X028892Y011084D02* 3366 | X028892Y011684D01* 3367 | X028412Y011684D02* 3368 | X028412Y011324D01* 3369 | X025711Y012524D02* 3370 | X025711Y013004D01* 3371 | X024718Y013124D02* 3372 | X024478Y013004D01* 3373 | X024237Y012764D01* 3374 | D16* 3375 | X025316Y018544D02* 3376 | X025316Y018964D01* 3377 | X025316Y019364D01* 3378 | X025316Y019784D01* 3379 | X025318Y019807D01* 3380 | X025323Y019830D01* 3381 | X025332Y019852D01* 3382 | X025345Y019872D01* 3383 | X025360Y019890D01* 3384 | X025378Y019905D01* 3385 | X025398Y019918D01* 3386 | X025420Y019927D01* 3387 | X025443Y019932D01* 3388 | X025466Y019934D01* 3389 | X025316Y019364D02* 3390 | X025343Y019362D01* 3391 | X025370Y019357D01* 3392 | X025396Y019347D01* 3393 | X025420Y019335D01* 3394 | X025442Y019319D01* 3395 | X025462Y019301D01* 3396 | X025479Y019279D01* 3397 | X025494Y019256D01* 3398 | X025504Y019231D01* 3399 | X025512Y019205D01* 3400 | X025516Y019178D01* 3401 | X025516Y019150D01* 3402 | X025512Y019123D01* 3403 | X025504Y019097D01* 3404 | X025494Y019072D01* 3405 | X025479Y019049D01* 3406 | X025462Y019027D01* 3407 | X025442Y019009D01* 3408 | X025420Y018993D01* 3409 | X025396Y018981D01* 3410 | X025370Y018971D01* 3411 | X025343Y018966D01* 3412 | X025316Y018964D01* 3413 | X025316Y018544D02* 3414 | X025318Y018521D01* 3415 | X025323Y018498D01* 3416 | X025332Y018476D01* 3417 | X025345Y018456D01* 3418 | X025360Y018438D01* 3419 | X025378Y018423D01* 3420 | X025398Y018410D01* 3421 | X025420Y018401D01* 3422 | X025443Y018396D01* 3423 | X025466Y018394D01* 3424 | X028666Y018394D02* 3425 | X028689Y018396D01* 3426 | X028712Y018401D01* 3427 | X028734Y018410D01* 3428 | X028754Y018423D01* 3429 | X028772Y018438D01* 3430 | X028787Y018456D01* 3431 | X028800Y018476D01* 3432 | X028809Y018498D01* 3433 | X028814Y018521D01* 3434 | X028816Y018544D01* 3435 | X028816Y019784D01* 3436 | X028814Y019807D01* 3437 | X028809Y019830D01* 3438 | X028800Y019852D01* 3439 | X028787Y019872D01* 3440 | X028772Y019890D01* 3441 | X028754Y019905D01* 3442 | X028734Y019918D01* 3443 | X028712Y019927D01* 3444 | X028689Y019932D01* 3445 | X028666Y019934D01* 3446 | X029166Y022644D02* 3447 | X029189Y022646D01* 3448 | X029212Y022651D01* 3449 | X029234Y022660D01* 3450 | X029254Y022673D01* 3451 | X029272Y022688D01* 3452 | X029287Y022706D01* 3453 | X029300Y022726D01* 3454 | X029309Y022748D01* 3455 | X029314Y022771D01* 3456 | X029316Y022794D01* 3457 | X029316Y024034D01* 3458 | X029314Y024057D01* 3459 | X029309Y024080D01* 3460 | X029300Y024102D01* 3461 | X029287Y024122D01* 3462 | X029272Y024140D01* 3463 | X029254Y024155D01* 3464 | X029234Y024168D01* 3465 | X029212Y024177D01* 3466 | X029189Y024182D01* 3467 | X029166Y024184D01* 3468 | X025466Y024184D02* 3469 | X025443Y024182D01* 3470 | X025420Y024177D01* 3471 | X025398Y024168D01* 3472 | X025378Y024155D01* 3473 | X025360Y024140D01* 3474 | X025345Y024122D01* 3475 | X025332Y024102D01* 3476 | X025323Y024080D01* 3477 | X025318Y024057D01* 3478 | X025316Y024034D01* 3479 | X025316Y023614D01* 3480 | X025316Y023214D01* 3481 | X025316Y022794D01* 3482 | X025318Y022771D01* 3483 | X025323Y022748D01* 3484 | X025332Y022726D01* 3485 | X025345Y022706D01* 3486 | X025360Y022688D01* 3487 | X025378Y022673D01* 3488 | X025398Y022660D01* 3489 | X025420Y022651D01* 3490 | X025443Y022646D01* 3491 | X025466Y022644D01* 3492 | X025316Y023214D02* 3493 | X025343Y023216D01* 3494 | X025370Y023221D01* 3495 | X025396Y023231D01* 3496 | X025420Y023243D01* 3497 | X025442Y023259D01* 3498 | X025462Y023277D01* 3499 | X025479Y023299D01* 3500 | X025494Y023322D01* 3501 | X025504Y023347D01* 3502 | X025512Y023373D01* 3503 | X025516Y023400D01* 3504 | X025516Y023428D01* 3505 | X025512Y023455D01* 3506 | X025504Y023481D01* 3507 | X025494Y023506D01* 3508 | X025479Y023529D01* 3509 | X025462Y023551D01* 3510 | X025442Y023569D01* 3511 | X025420Y023585D01* 3512 | X025396Y023597D01* 3513 | X025370Y023607D01* 3514 | X025343Y023612D01* 3515 | X025316Y023614D01* 3516 | X034719Y032992D02* 3517 | X034877Y032992D01* 3518 | X034089Y033523D02* 3519 | X034089Y033759D01* 3520 | X034089Y034468D02* 3521 | X034089Y034960D01* 3522 | X034191Y035019D02* 3523 | X034200Y035000D01* 3524 | X034205Y034980D01* 3525 | X034207Y034960D01* 3526 | X034267Y034960D01* 3527 | X034207Y034960D02* 3528 | X034089Y034960D01* 3529 | X033987Y035137D01* 3530 | X034089Y035196D01* 3531 | X034192Y035019D01* 3532 | X034267Y034960D02* 3533 | X034282Y034962D01* 3534 | X034297Y034966D01* 3535 | X034311Y034973D01* 3536 | X034323Y034983D01* 3537 | X034333Y034995D01* 3538 | X034340Y035009D01* 3539 | X034344Y035024D01* 3540 | X034346Y035039D01* 3541 | X034345Y035039D02* 3542 | X034345Y035055D01* 3543 | X036786Y035039D02* 3544 | X036786Y035055D01* 3545 | X036786Y035039D02* 3546 | X036788Y035024D01* 3547 | X036792Y035009D01* 3548 | X036799Y034995D01* 3549 | X036809Y034983D01* 3550 | X036821Y034973D01* 3551 | X036835Y034966D01* 3552 | X036850Y034962D01* 3553 | X036865Y034960D01* 3554 | X036924Y034960D01* 3555 | X037042Y034960D01* 3556 | X037144Y035137D01* 3557 | X037042Y035196D01* 3558 | X036937Y035015D01* 3559 | X036930Y034997D01* 3560 | X036925Y034979D01* 3561 | X036924Y034960D01* 3562 | X037042Y034960D02* 3563 | X037042Y034468D01* 3564 | X037042Y033759D02* 3565 | X037042Y033523D01* 3566 | X036412Y032992D02* 3567 | X036255Y032992D01* 3568 | X040566Y029914D02* 3569 | X040566Y028914D01* 3570 | X041566Y028914D01* 3571 | X041566Y029914D01* 3572 | X042566Y029914D01* 3573 | X042566Y022914D01* 3574 | X040566Y022914D01* 3575 | X040566Y028914D01* 3576 | X040566Y029914D02* 3577 | X041566Y029914D01* 3578 | D17* 3579 | X034776Y031664D03* 3580 | M02* 3581 | -------------------------------------------------------------------------------- /schematics/v1/pda6502.TXT: -------------------------------------------------------------------------------- 1 | % 2 | M48 3 | M72 4 | T01C0.0236 5 | T02C0.0315 6 | T03C0.0320 7 | T04C0.0400 8 | T05C0.1260 9 | % 10 | T01 11 | X10316Y7164 12 | X10066Y7664 13 | X9816Y8164 14 | X11316Y6914 15 | X11816Y6414 16 | X12816Y6164 17 | X13566Y5414 18 | X12066Y4414 19 | X7816Y8914 20 | X7566Y9414 21 | X7816Y9914 22 | X7566Y10414 23 | X7816Y10914 24 | X7566Y11414 25 | X7816Y11914 26 | X7566Y12414 27 | X7816Y12914 28 | X8316Y14164 29 | X8316Y14914 30 | X10566Y17414 31 | X13066Y19414 32 | X16316Y19164 33 | X16066Y22164 34 | X17066Y22414 35 | X18066Y22664 36 | X19066Y22914 37 | X20066Y22914 38 | X20816Y22664 39 | X22566Y23664 40 | X25066Y22164 41 | X26066Y23164 42 | X26566Y23914 43 | X27316Y23414 44 | X28066Y23914 45 | X28816Y23414 46 | X30566Y20164 47 | X33066Y20164 48 | X35816Y22914 49 | X36816Y24664 50 | X38066Y24914 51 | X39066Y25414 52 | X38566Y26414 53 | X39816Y26914 54 | X38816Y27414 55 | X26966Y19664 56 | X24816Y17914 57 | X25316Y15664 58 | X24566Y14414 59 | X22566Y13164 60 | X21816Y14164 61 | X22066Y15164 62 | X19566Y12914 63 | X18566Y11664 64 | X19316Y11164 65 | X18316Y10414 66 | X17316Y9414 67 | X18316Y8914 68 | X20316Y7664 69 | X20566Y8164 70 | X20066Y7164 71 | X22566Y7664 72 | X22816Y7164 73 | X23066Y6664 74 | X25066Y6914 75 | X26066Y6914 76 | X27316Y7414 77 | X28066Y8164 78 | X28566Y8664 79 | X29066Y8164 80 | X29566Y8664 81 | X30566Y9414 82 | X29066Y10664 83 | X29566Y11414 84 | X29566Y12414 85 | X30566Y13664 86 | X30566Y14914 87 | X30066Y15164 88 | X29566Y14914 89 | X29066Y15164 90 | X31566Y15414 91 | X34066Y13414 92 | X34566Y13264 93 | X35066Y12664 94 | X35066Y11914 95 | X36066Y11814 96 | X36066Y12664 97 | X37066Y9164 98 | X38066Y9164 99 | X39316Y8414 100 | X41816Y8414 101 | X36816Y7914 102 | X36316Y8414 103 | X36816Y6914 104 | X28066Y10664 105 | X27316Y8664 106 | X26816Y8914 107 | X26316Y8664 108 | X25816Y8914 109 | X21066Y12164 110 | X13816Y12414 111 | X12066Y12414 112 | X12816Y14664 113 | X23066Y27914 114 | X20066Y31414 115 | X19066Y31164 116 | X18066Y30914 117 | X17066Y30664 118 | X16066Y30414 119 | X15066Y30164 120 | X14066Y29914 121 | X11316Y29164 122 | X10816Y29414 123 | X10316Y29664 124 | X9816Y29914 125 | X9316Y30164 126 | X8816Y30414 127 | X8316Y30664 128 | X8316Y31664 129 | X8816Y32164 130 | X21316Y31664 131 | X22566Y31914 132 | T02 133 | X41066Y23414 134 | X42066Y23414 135 | X42066Y24414 136 | X42066Y25414 137 | X41066Y25414 138 | X41066Y24414 139 | X41066Y26414 140 | X42066Y26414 141 | X42066Y27414 142 | X42066Y28414 143 | X41066Y28414 144 | X41066Y27414 145 | X41066Y29414 146 | X42066Y29414 147 | T03 148 | X38066Y9914 149 | X37066Y9914 150 | X37066Y10914 151 | X38066Y10914 152 | X38066Y11914 153 | X39066Y11914 154 | X39066Y10914 155 | X39066Y12914 156 | X38066Y12914 157 | X38066Y13914 158 | X38066Y14914 159 | X39066Y14914 160 | X39066Y13914 161 | X39066Y15914 162 | X38066Y15914 163 | X37066Y15914 164 | X37066Y16914 165 | X38066Y16914 166 | X36066Y16914 167 | X35066Y16914 168 | X34066Y16914 169 | X33066Y16914 170 | X33066Y15914 171 | X34066Y15914 172 | X35066Y15914 173 | X36066Y15914 174 | X33066Y14914 175 | X32066Y14914 176 | X32066Y13914 177 | X33066Y13914 178 | X33066Y12914 179 | X32066Y12914 180 | X32066Y11914 181 | X33066Y11914 182 | X33066Y10914 183 | X34066Y10914 184 | X35066Y10914 185 | X36066Y10914 186 | X36066Y9914 187 | X35066Y9914 188 | X34066Y9914 189 | X33066Y9914 190 | X32066Y10914 191 | X32066Y15914 192 | X34566Y23664 193 | X37566Y23664 194 | X37566Y26664 195 | X34566Y26664 196 | X21566Y24414 197 | X20566Y24414 198 | X19566Y24414 199 | X18566Y24414 200 | X17566Y24414 201 | X16566Y24414 202 | X15566Y24414 203 | X14566Y24414 204 | X13566Y24414 205 | X12566Y24414 206 | X11566Y24414 207 | X10566Y24414 208 | X9566Y24414 209 | X8566Y24414 210 | X8566Y21414 211 | X9566Y21414 212 | X10566Y21414 213 | X11566Y21414 214 | X12566Y21414 215 | X13566Y21414 216 | X14566Y21414 217 | X15566Y21414 218 | X16566Y21414 219 | X17566Y21414 220 | X18566Y21414 221 | X19566Y21414 222 | X20566Y21414 223 | X21566Y21414 224 | X16566Y16914 225 | X15566Y16914 226 | X14566Y16914 227 | X13566Y16914 228 | X12566Y16914 229 | X11566Y16914 230 | X11566Y15914 231 | X12566Y15914 232 | X13566Y15914 233 | X14566Y15914 234 | X15566Y15914 235 | X16566Y15914 236 | X17566Y15914 237 | X17566Y14914 238 | X17566Y13914 239 | X16566Y13914 240 | X16566Y14914 241 | X16566Y12914 242 | X17566Y12914 243 | X17566Y11914 244 | X17566Y10914 245 | X16566Y10914 246 | X16566Y11914 247 | X15566Y10914 248 | X14566Y10914 249 | X13566Y10914 250 | X12566Y10914 251 | X11566Y10914 252 | X11566Y11914 253 | X10566Y11914 254 | X10566Y10914 255 | X11566Y9914 256 | X12566Y9914 257 | X13566Y9914 258 | X14566Y9914 259 | X15566Y9914 260 | X16566Y9914 261 | X11566Y12914 262 | X10566Y12914 263 | X10566Y13914 264 | X10566Y14914 265 | X11566Y14914 266 | X11566Y13914 267 | X10566Y15914 268 | T04 269 | X14566Y4414 270 | X15566Y4414 271 | X16566Y4414 272 | X16566Y5414 273 | X15566Y5414 274 | X14566Y5414 275 | X17566Y5414 276 | X18566Y5414 277 | X19566Y5414 278 | X20566Y5414 279 | X21566Y5414 280 | X22566Y5414 281 | X23566Y5414 282 | X24566Y5414 283 | X25566Y5414 284 | X26566Y5414 285 | X27566Y5414 286 | X28566Y5414 287 | X29566Y5414 288 | X30566Y5414 289 | X31566Y5414 290 | X32566Y5414 291 | X33566Y5414 292 | X33566Y4414 293 | X32566Y4414 294 | X31566Y4414 295 | X30566Y4414 296 | X29566Y4414 297 | X28566Y4414 298 | X27566Y4414 299 | X26566Y4414 300 | X25566Y4414 301 | X24566Y4414 302 | X23566Y4414 303 | X22566Y4414 304 | X21566Y4414 305 | X20566Y4414 306 | X19566Y4414 307 | X18566Y4414 308 | X17566Y4414 309 | X43066Y8914 310 | X43066Y9914 311 | X43066Y10914 312 | X43066Y11914 313 | X43066Y12914 314 | X43066Y13914 315 | X43066Y14914 316 | X43066Y15914 317 | X43066Y16914 318 | X43066Y17914 319 | X43066Y18914 320 | X43066Y19914 321 | X29316Y26914 322 | X29316Y27914 323 | X29316Y28914 324 | X29316Y30914 325 | X29316Y31914 326 | X29316Y32914 327 | X23566Y32914 328 | X22566Y32914 329 | X21566Y32914 330 | X20566Y32914 331 | X19566Y32914 332 | X18566Y32914 333 | X17566Y32914 334 | X16566Y32914 335 | X15566Y32914 336 | X14566Y32914 337 | X13566Y32914 338 | X12566Y32914 339 | X11566Y32914 340 | X10566Y32914 341 | X10566Y26914 342 | X11566Y26914 343 | X12566Y26914 344 | X13566Y26914 345 | X14566Y26914 346 | X15566Y26914 347 | X16566Y26914 348 | X17566Y26914 349 | X18566Y26914 350 | X19566Y26914 351 | X20566Y26914 352 | X21566Y26914 353 | X22566Y26914 354 | X23566Y26914 355 | X38566Y32414 356 | X38566Y33414 357 | X40316Y33414 358 | X40316Y32414 359 | T05 360 | X6206Y4990 361 | X6206Y33337 362 | X42426Y33337 363 | X42426Y4990 364 | M30 365 | -------------------------------------------------------------------------------- /src/bignum.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | ; Where bignum is anything more than 8-bit. 4 | 5 | .export Uint32Multiply 6 | 7 | .export Uint32Multiplicand 8 | .export Uint32Multiplier 9 | .export Uint32Product 10 | 11 | .segment "kernal_bss" 12 | 13 | Uint32Multiplicand: .dword 0 14 | Uint32Multiplier: .dword 0 15 | Uint32Product: .dword 0 16 | Uint32ProductHighDword: .dword 0 17 | 18 | .segment "kernal" 19 | 20 | ; Multiple uint32*uint32 into uint64 result. 21 | ; Adapted from: 22 | ; http://6502.org/source/integers/32muldiv.htm 23 | .PROC Uint32Multiply 24 | LDA #0 25 | STA Uint32Product+4 ; Clear upper half of 26 | STA Uint32Product+5 ; product 27 | STA Uint32Product+6 28 | STA Uint32Product+7 29 | LDX #32 ; Set binary count to 32 30 | shift_r: LSR Uint32Multiplier+3 ; Shift multiplyer right 31 | ROR Uint32Multiplier+2 32 | ROR Uint32Multiplier+1 33 | ROR Uint32Multiplier 34 | BCC rotate_r ; Go rotate right if c = 0 35 | LDA Uint32Product+4 ; Get upper half of product 36 | CLC ; and add multiplicand to 37 | ADC Uint32Multiplicand ; it 38 | STA Uint32Product+4 39 | LDA Uint32Product+5 40 | ADC Uint32Multiplicand+1 41 | STA Uint32Product+5 42 | LDA Uint32Product+6 43 | ADC Uint32Multiplicand+2 44 | STA Uint32Product+6 45 | LDA Uint32Product+7 46 | ADC Uint32Multiplicand+3 47 | rotate_r: ROR a ; Rotate partial product 48 | STA Uint32Product+7 ; right 49 | ROR Uint32Product+6 50 | ROR Uint32Product+5 51 | ROR Uint32Product+4 52 | ROR Uint32Product+3 53 | ROR Uint32Product+2 54 | ROR Uint32Product+1 55 | ROR Uint32Product 56 | DEX ; Decrement bit count and 57 | BNE shift_r ; loop until 32 bits are 58 | CLC ; done 59 | RTS 60 | .ENDPROC 61 | -------------------------------------------------------------------------------- /src/bitwise.s: -------------------------------------------------------------------------------- 1 | .export ShiftZpXLeftByY 2 | .export ShiftZpXRightByY 3 | 4 | .segment "kernal" 5 | 6 | ; Left shift zp,X by Y bits. 7 | ShiftZpXLeftByY: 8 | TYA 9 | PHA 10 | @loop: 11 | CPY #0 12 | BEQ @done 13 | ASL $00,X 14 | DEY 15 | JMP @loop 16 | @done: 17 | PLA 18 | TAY 19 | RTS 20 | 21 | ; Left shift zp,X by Y bits. 22 | ShiftZpXRightByY: 23 | TYA 24 | PHA 25 | @loop: 26 | CPY #0 27 | BEQ @done 28 | LSR $00,X 29 | DEY 30 | JMP @loop 31 | @done: 32 | PLA 33 | TAY 34 | RTS 35 | -------------------------------------------------------------------------------- /src/encoding.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .segment "kernal" 4 | 5 | .export AsciiToPetscii 6 | 7 | ; Converts an ASCII char to a PETSCII char. 8 | ; Y: ascii (mutates) 9 | ; Already correct: !#$%&*()+-=0123456789;:'<>,./ 10 | ; "@" and A-Z need $3F subtracted. 11 | ; Not correct: |_ 12 | .PROC AsciiToPetscii 13 | ; ASCII $40 to $5A (@, A-Z) map to PETSCII $0 to $something 14 | TYA 15 | SEC 16 | SBC #$40 17 | BCC notAlpha ; if Y < $40: skip 18 | TYA 19 | SEC 20 | SBC #$5A 21 | BCS notAlpha ; if Y > $5A: skip 22 | TYA 23 | SEC 24 | SBC #$40 ; subtract $40 for alpha chars 25 | TAY 26 | JMP end 27 | notAlpha: 28 | TYA 29 | SEC 30 | SBC #$1F 31 | BCS notLow ; if Y >= 32 (or 31?): skip 32 | TYA 33 | CLC 34 | ADC #64 ; Y+=64 for 0..31 35 | TAY 36 | JMP end 37 | notLow: 38 | end: 39 | RTS 40 | .ENDPROC 41 | -------------------------------------------------------------------------------- /src/fat.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | ; subroutines 4 | .export FatInit 5 | .export FatReadFile 6 | 7 | ; vars 8 | .export FatSearchFilename 9 | 10 | .import SdCardRead 11 | .import StackPush 12 | 13 | .import Uint32Multiply 14 | .import Uint32Multiplicand 15 | .import Uint32Multiplier 16 | .import Uint32Product 17 | 18 | sd_buffer = $6000 19 | 20 | .segment "kernal_bss" 21 | 22 | ; Stored parameters 23 | FatSectorSize: .word 0 24 | FatSectorsPerCluster: .byte 0 25 | FatReservedSectors: .word 0 26 | FatFatCount: .byte 0 27 | FatSectorsPerFat: .dword 0 28 | FatRootCluster: .dword 0 29 | 30 | ; Calculated parameters 31 | ; Addresses are relative to the entire device, not the partition. 32 | FatStartAddress: .dword 0 ; first partition according to MBR LBA field. 33 | FatFatOffset: .dword 0 ; location of first FAT 34 | FatFatSize: .dword 0 ; size in bytes of each FAT 35 | FatFatTotalSize: .dword 0 ; total size of FATs (count x size) 36 | FatDataAddress: .dword 0 ; cluster #0 address (but first valid cluster is #2) 37 | FatClusterSize: .word 0 ; size of each cluster in bytes 38 | FatRootAddress: .dword 0 ; location of first cluster of root directory 39 | 40 | ; public API vars 41 | FatSearchFilename: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 42 | 43 | ; internal vars 44 | currentFileSize: .dword 0 45 | currentFileFirstCluster: .dword 0 46 | currentFileAddress: .dword 0 47 | 48 | .segment "kernal" 49 | 50 | ; Read and calculate FAT parameters. 51 | .PROC FatInit 52 | JSR readMbrParameters 53 | JSR readFatParameters 54 | JSR calculateFatParameters 55 | RTS 56 | .ENDPROC 57 | 58 | ; Read file named by FatSearchFilename from the root directory. 59 | ; TODO: look further than the first 256 bytes of dir entry. 60 | ; TODO: read more than the first 512-byte block of data. 61 | ; TODO: read more than the first FAT32 cluster. 62 | ; TODO: some kind of filehandle-style solution for the above? 63 | .PROC FatReadFile 64 | LDA $10 65 | PHA 66 | LDA $11 67 | PHA 68 | ; Read first block of root directory into RAM. 69 | LDA FatRootAddress + 0 70 | JSR StackPush 71 | LDA FatRootAddress + 1 72 | JSR StackPush 73 | LDA FatRootAddress + 2 74 | JSR StackPush 75 | LDA FatRootAddress + 3 76 | JSR StackPush 77 | JSR SdCardRead 78 | 79 | JSR compareFilenames 80 | BCC notFound 81 | found: 82 | 83 | ; Load index of first cluster of file. 84 | LDY #$1A ; low two bytes of first cluster 85 | LDA ($10),Y 86 | STA currentFileFirstCluster 87 | INY 88 | LDA ($10),Y 89 | STA currentFileFirstCluster + 1 90 | LDY #$14 ; high two bytes of first cluster 91 | LDA ($10),Y 92 | STA currentFileFirstCluster + 2 93 | INY 94 | LDA ($10),Y 95 | STA currentFileFirstCluster + 3 96 | 97 | ; Load file size. 98 | LDY #$1C 99 | LDA ($10),Y 100 | STA currentFileSize 101 | INY 102 | LDA ($10),Y 103 | STA currentFileSize + 1 104 | INY 105 | LDA ($10),Y 106 | STA currentFileSize + 2 107 | INY 108 | LDA ($10),Y 109 | STA currentFileSize + 3 110 | 111 | JSR calculateCurrentFileAddress 112 | 113 | JSR readBlockFromCurrentFileAddress 114 | 115 | notFound: 116 | done: 117 | PLA 118 | STA $11 119 | PLA 120 | STA $10 121 | RTS 122 | .ENDPROC 123 | 124 | .PROC calculateCurrentFileAddress 125 | ; calculate address of first cluster of file. 126 | ; Move currentFileFirstCluster into Uint32Multiplicand 127 | LDA currentFileFirstCluster + 0 128 | STA Uint32Multiplicand + 0 129 | LDA currentFileFirstCluster + 1 130 | STA Uint32Multiplicand + 1 131 | LDA currentFileFirstCluster + 2 132 | STA Uint32Multiplicand + 2 133 | LDA currentFileFirstCluster + 3 134 | STA Uint32Multiplicand + 3 135 | ; Multiply by FatClusterSize 136 | LDA FatClusterSize + 0 137 | STA Uint32Multiplier + 0 138 | LDA FatClusterSize + 1 139 | STA Uint32Multiplier + 1 140 | LDA FatClusterSize + 2 141 | STA Uint32Multiplier + 2 142 | LDA FatClusterSize + 3 143 | STA Uint32Multiplier + 3 144 | JSR Uint32Multiply 145 | ; Add FatDataAddress to product, store in currentFileAddress 146 | CLC 147 | LDA Uint32Product + 0 148 | ADC FatDataAddress + 0 149 | STA currentFileAddress + 0 150 | LDA Uint32Product + 1 151 | ADC FatDataAddress + 1 152 | STA currentFileAddress + 1 153 | LDA Uint32Product + 2 154 | ADC FatDataAddress + 2 155 | STA currentFileAddress + 2 156 | LDA Uint32Product + 3 157 | ADC FatDataAddress + 3 158 | STA currentFileAddress + 3 159 | RTS 160 | .ENDPROC 161 | 162 | .PROC readBlockFromCurrentFileAddress 163 | LDA currentFileAddress + 0 164 | JSR StackPush 165 | LDA currentFileAddress + 1 166 | JSR StackPush 167 | LDA currentFileAddress + 2 168 | JSR StackPush 169 | LDA currentFileAddress + 3 170 | JSR StackPush 171 | JSR SdCardRead 172 | RTS 173 | .ENDPROC 174 | 175 | ; TODO: search more than first 256-bytes of directory. 176 | .PROC compareFilenames 177 | LDX #0 ; offset into directory data. 178 | loop: 179 | CLC 180 | TXA ; data offset into sd_buffer 181 | STA $10 ; as low byte of pointer at $10 182 | LDA #.HIBYTE(sd_buffer) ; high byte of sd_buffer 183 | STA $11 ; as high byte of pointer at $11 184 | JSR compareFilename 185 | BCS found ; carry flag indicates a match 186 | TXA 187 | ADC #32 ; size of directory entries 188 | TAX 189 | BCS notFound; carry after ADC indicates we're done here. 190 | JMP loop 191 | found: 192 | SEC 193 | JMP done 194 | notFound: 195 | CLC 196 | done: 197 | RTS 198 | .ENDPROC 199 | 200 | ; called by compareFilenames 201 | ; expect ptr to filename at $10,$11. 202 | .PROC compareFilename 203 | SEC ; carry indicates a match 204 | LDY #0 ; index of filename character to compare 205 | loop: 206 | LDA FatSearchFilename,Y 207 | CMP ($10),Y 208 | BNE mismatch 209 | INY 210 | CPY #11 ; length of 8.3 filename. 211 | BNE loop 212 | JMP done ; match 213 | mismatch: 214 | CLC 215 | done: 216 | RTS 217 | .ENDPROC 218 | 219 | .PROC readFirstBlock 220 | ; push (uint32)0 onto user-stack. 221 | LDA #$00 ; LSB 222 | JSR StackPush 223 | LDA #$00 224 | JSR StackPush 225 | LDA #$00 226 | JSR StackPush 227 | LDA #$00 ; MSB 228 | JSR StackPush 229 | JSR SdCardRead ; 512 byte block from address on user-stack into $6000. 230 | RTS 231 | .ENDPROC 232 | 233 | .PROC readMbrParameters 234 | dir_entry = sd_buffer + $01BE 235 | first_sector = dir_entry + 8 236 | ; Load LBA start address; first sector. 237 | ; Store as start byte address; assume 512-byte sectors. 238 | JSR readFirstBlock 239 | LDA #0 240 | STA FatStartAddress + 0 241 | LDA first_sector + 0 242 | ASL 243 | STA FatStartAddress + 1 244 | LDA first_sector + 1 245 | ROL 246 | STA FatStartAddress + 2 247 | LDA first_sector + 2 248 | ROL 249 | STA FatStartAddress + 3 250 | RTS 251 | .ENDPROC 252 | 253 | .PROC readFatParameters 254 | ; Read first block of FAT partition. 255 | LDA FatStartAddress + 0 256 | JSR StackPush 257 | LDA FatStartAddress + 1 258 | JSR StackPush 259 | LDA FatStartAddress + 2 260 | JSR StackPush 261 | LDA FatStartAddress + 3 262 | JSR StackPush 263 | JSR SdCardRead 264 | 265 | ; FatSectorSize 266 | LDA sd_buffer + $000B 267 | STA FatSectorSize 268 | LDA sd_buffer + $000B + 1 269 | STA FatSectorSize + 1 270 | 271 | ; FatSectorsPerCluster 272 | LDA sd_buffer + $000D 273 | STA FatSectorsPerCluster 274 | 275 | ; FatReservedSectors 276 | LDA sd_buffer + $000E 277 | STA FatReservedSectors 278 | LDA sd_buffer + $000E + 1 279 | STA FatReservedSectors + 1 280 | 281 | ; FatFatCount 282 | LDA sd_buffer + $0010 283 | STA FatFatCount 284 | 285 | ; FatSectorsPerFat (FAT32 version) 286 | LDA sd_buffer + $0024 287 | STA FatSectorsPerFat 288 | LDA sd_buffer + $0024 + 1 289 | STA FatSectorsPerFat + 1 290 | LDA sd_buffer + $0024 + 2 291 | STA FatSectorsPerFat + 2 292 | LDA sd_buffer + $0024 + 3 293 | STA FatSectorsPerFat + 3 294 | 295 | ; FatRootCluster (FAT32) 296 | LDA sd_buffer + $002C 297 | STA FatRootCluster 298 | LDA sd_buffer + $002C + 1 299 | STA FatRootCluster + 1 300 | LDA sd_buffer + $002C + 2 301 | STA FatRootCluster + 2 302 | LDA sd_buffer + $002C + 3 303 | STA FatRootCluster + 3 304 | RTS 305 | .ENDPROC 306 | 307 | .PROC calculateFatParameters 308 | ; calculations are order-sensitive; later ones depend on earlier ones. 309 | JSR calculateFatOffset 310 | JSR calculateFatSize 311 | JSR calculateFatTotalSize 312 | JSR calculateClusterSize 313 | JSR calculateDataAddress 314 | JSR calculateRootAddress 315 | RTS 316 | .ENDPROC 317 | 318 | ; Calculate address of first FAT. 319 | ; Assume sector size is 512. 320 | .PROC calculateFatOffset 321 | ; FatSectorSize [assume 512] * FatReservedSectors 322 | ; FatReservedSectors << 9 323 | ; First left-shift by entire byte. 324 | LDA #0 325 | STA FatFatOffset + 0 ; product[0] <- 0 326 | LDA FatReservedSectors + 0 ; input LSB 327 | ASL ; shift left one more bit to make <<9 328 | STA FatFatOffset + 1 ; product[1] <- input[0]<<1 329 | LDA FatReservedSectors + 1 330 | ROL ; shift left with carry from ASL 331 | STA FatFatOffset + 2 ; product[2] <- input[1]<<1 332 | LDA #0 ; if carry clear 333 | BCC storeHighByte 334 | LDA #1 ; else if carry set 335 | storeHighByte: 336 | STA FatFatOffset + 3 ; product[3] <- carry ? 1 : 0 337 | RTS 338 | .ENDPROC 339 | 340 | ; Calculate size in bytes of each FAT. 341 | ; Assume sector size is 512. 342 | .PROC calculateFatSize 343 | LDA #0 344 | STA FatFatSize + 0 ; product[0] <- 0 345 | LDA FatSectorsPerFat + 0 ; input LSB 346 | ASL ; shift left one more bit to make <<9 347 | STA FatFatSize + 1 ; product[1] <- input[0]<<1 348 | LDA FatSectorsPerFat + 1 349 | ROL ; shift left with carry from ASL 350 | STA FatFatSize + 2 ; product[2] <- input[1]<<1 351 | LDA FatSectorsPerFat + 2 352 | ROL ; shift left with carry from ASL 353 | STA FatFatSize + 3 ; product[3] <- input[2]<<1 354 | RTS 355 | .ENDPROC 356 | 357 | ; Calculate the total size of the FATs. 358 | ; FatFatCount * FatFatSize 359 | .PROC calculateFatTotalSize 360 | LDX FatFatCount 361 | loop: 362 | BEQ loopDone 363 | LDA FatFatSize + 0 364 | ASL 365 | STA FatFatTotalSize + 0 366 | LDA FatFatSize + 1 367 | ROL 368 | STA FatFatTotalSize + 1 369 | LDA FatFatSize + 2 370 | ROL 371 | STA FatFatTotalSize + 2 372 | LDA FatFatSize + 3 373 | ROL 374 | STA FatFatTotalSize + 3 375 | DEX 376 | JMP loop 377 | loopDone: 378 | RTS 379 | .ENDPROC 380 | 381 | ; Calculate the base address for cluster-indexed data. 382 | ; The first valid cluster is #2, being (FatDataAddress + 2*FatClusterSize). 383 | ; So, this base address is actually 2*FatClusterSize before the data region. 384 | ; (uint32)FatStartAddress 385 | ; + (uint32)FatFatOffset 386 | ; + (uint32)FatFatTotalSize 387 | ; - 2*(uint16)FatClusterSize 388 | .PROC calculateDataAddress 389 | CLC 390 | LDA FatFatOffset + 0 391 | ADC FatFatTotalSize + 0 392 | STA FatDataAddress + 0 393 | LDA FatFatOffset + 1 394 | ADC FatFatTotalSize + 1 395 | STA FatDataAddress + 1 396 | LDA FatFatOffset + 2 397 | ADC FatFatTotalSize + 2 398 | STA FatDataAddress + 2 399 | LDA FatFatOffset + 3 400 | ADC FatFatTotalSize + 3 401 | STA FatDataAddress + 3 402 | 403 | ; Add to FatStartAddress (start of filesystem / partition) 404 | LDA FatDataAddress + 0 405 | ADC FatStartAddress + 0 406 | STA FatDataAddress + 0 407 | LDA FatDataAddress + 1 408 | ADC FatStartAddress + 1 409 | STA FatDataAddress + 1 410 | LDA FatDataAddress + 2 411 | ADC FatStartAddress + 2 412 | STA FatDataAddress + 2 413 | LDA FatDataAddress + 3 414 | ADC FatStartAddress + 3 415 | STA FatDataAddress + 3 416 | 417 | ; subtract 16-bit 2*FatClusterSize from 32-bit FatDataAddress 418 | ; Compensates for the two special/reserved clusters which have no data. 419 | LDX #2 420 | subtractClusterSizeLoop: 421 | BEQ subtractClusterSizeDone 422 | SEC 423 | LDA FatDataAddress + 0 424 | SBC FatClusterSize + 0 425 | STA FatDataAddress + 0 426 | LDA FatDataAddress + 1 427 | SBC FatClusterSize + 1 428 | STA FatDataAddress + 1 429 | LDA FatDataAddress + 2 430 | SBC #0 431 | STA FatDataAddress + 2 432 | DEX 433 | JMP subtractClusterSizeLoop 434 | subtractClusterSizeDone: 435 | 436 | RTS 437 | .ENDPROC 438 | 439 | ; Calculate the size of each cluster. 440 | ; (uint8)FatSectorsPerCluster * (uint16)FatSectorSize 441 | ; Assume FatSectorSize == 512 442 | ; FatSectorsPerCluster * 512 443 | ; FatSectorsPerCluster << 9 444 | .PROC calculateClusterSize 445 | LDA #0 446 | STA FatClusterSize + 0 ; product[0] <- 0 447 | LDA FatSectorsPerCluster + 0 ; input LSB 448 | ASL ; shift left one more bit to make <<9 449 | STA FatClusterSize + 1 ; product[1] <- input[0]<<1 450 | RTS 451 | .ENDPROC 452 | 453 | ; Calculate location first cluster of root directory. 454 | ; (uint32)FatDataAddress + (uint32)FatRootCluster * (uint16)FatClusterSize 455 | ; Assume FatRootCluster == 2 for now. 456 | ; (uint32)FatDataAddress + (uint32)FatClusterSize * 2 457 | ; (uint32)FatDataAddress + (uint32)FatClusterSize<<1 458 | .PROC calculateRootAddress 459 | ; Load FatClusterSize<<1 into FatRootAddress 460 | LDA FatClusterSize + 0 461 | ASL 462 | STA FatRootAddress + 0 463 | LDA FatClusterSize + 1 464 | ROL 465 | STA FatRootAddress + 1 466 | LDA FatClusterSize + 2 467 | ROL 468 | STA FatRootAddress + 2 469 | LDA FatClusterSize + 3 470 | ROL 471 | STA FatRootAddress + 3 472 | ; Add FatDataAddress to FatRootAddress 473 | CLC 474 | LDA FatRootAddress + 0 475 | ADC FatDataAddress + 0 476 | STA FatRootAddress + 0 477 | LDA FatRootAddress + 1 478 | ADC FatDataAddress + 1 479 | STA FatRootAddress + 1 480 | LDA FatRootAddress + 2 481 | ADC FatDataAddress + 2 482 | STA FatRootAddress + 2 483 | LDA FatRootAddress + 3 484 | ADC FatDataAddress + 3 485 | STA FatRootAddress + 3 486 | RTS 487 | .ENDPROC 488 | -------------------------------------------------------------------------------- /src/font.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .import FontData 4 | .export FontSelectChar 5 | 6 | .segment "kernal" 7 | 8 | ; X: font_ptr zero-page address (currently must be < 32) 9 | ; Y: char index 10 | FontSelectChar: 11 | TYA 12 | PHA ; save 13 | LDA $10 14 | PHA ; save 15 | LDA $11 16 | PHA ; save 17 | 18 | ; initialize base pointer 19 | LDA #.LOBYTE(FontData) 20 | STA 0,X 21 | LDA #.HIBYTE(FontData) 22 | STA 1,X 23 | 24 | ; char index Y * 8 = $10,11 byte index 25 | TYA 26 | STA $10 ; lo 27 | LDA #0 28 | STA $11 ; hi 29 | CLC 30 | ROL $10 31 | ROL $11 ; x2 32 | ROL $10 33 | ROL $11 ; x4 34 | ROL $10 35 | ROL $11 ; x8 36 | 37 | ; add 16-bit byte-index at $10 to base font pointer at $00,X. 38 | CLC 39 | LDA 0,X 40 | ADC $10 41 | STA 0,X 42 | LDA 1,X 43 | ADC $11 44 | STA 1,X 45 | 46 | PLA 47 | STA $11 ; restore 48 | PLA 49 | STA $10 ; restore 50 | PLA 51 | TAY ; restore 52 | RTS 53 | -------------------------------------------------------------------------------- /src/font_data.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .export FontData 4 | 5 | .segment "char" 6 | 7 | ; Generated with: 8 | ; head -c512 c64.rb/rom/character.rom | \ 9 | ; hexdump -e '".byte " 16/1 "$%02X, " "\n"' 10 | ; .. and then strip trailing commas. 11 | 12 | 13 | ; Each char is eight consecutive bytes: 14 | ; 15 | ; 0: 0x3C: ..####.. 16 | ; 1: 0x66: .##..##. 17 | ; 2: 0x6E: .##.###. 18 | ; 3: 0x6E: .##.###. 19 | ; 4: 0x60: .##..... 20 | ; 5: 0x62: .##...#. 21 | ; 6: 0x3C: ..####.. 22 | ; 7: 0x00: ........ 23 | 24 | FontData: 25 | .byte $3C, $66, $6E, $6E, $60, $62, $3C, $00, $18, $3C, $66, $7E, $66, $66, $66, $00 26 | .byte $7C, $66, $66, $7C, $66, $66, $7C, $00, $3C, $66, $60, $60, $60, $66, $3C, $00 27 | .byte $78, $6C, $66, $66, $66, $6C, $78, $00, $7E, $60, $60, $78, $60, $60, $7E, $00 28 | .byte $7E, $60, $60, $78, $60, $60, $60, $00, $3C, $66, $60, $6E, $66, $66, $3C, $00 29 | .byte $66, $66, $66, $7E, $66, $66, $66, $00, $3C, $18, $18, $18, $18, $18, $3C, $00 30 | .byte $1E, $0C, $0C, $0C, $0C, $6C, $38, $00, $66, $6C, $78, $70, $78, $6C, $66, $00 31 | .byte $60, $60, $60, $60, $60, $60, $7E, $00, $63, $77, $7F, $6B, $63, $63, $63, $00 32 | .byte $66, $76, $7E, $7E, $6E, $66, $66, $00, $3C, $66, $66, $66, $66, $66, $3C, $00 33 | .byte $7C, $66, $66, $7C, $60, $60, $60, $00, $3C, $66, $66, $66, $66, $3C, $0E, $00 34 | .byte $7C, $66, $66, $7C, $78, $6C, $66, $00, $3C, $66, $60, $3C, $06, $66, $3C, $00 35 | .byte $7E, $18, $18, $18, $18, $18, $18, $00, $66, $66, $66, $66, $66, $66, $3C, $00 36 | .byte $66, $66, $66, $66, $66, $3C, $18, $00, $63, $63, $63, $6B, $7F, $77, $63, $00 37 | .byte $66, $66, $3C, $18, $3C, $66, $66, $00, $66, $66, $66, $3C, $18, $18, $18, $00 38 | .byte $7E, $06, $0C, $18, $30, $60, $7E, $00, $3C, $30, $30, $30, $30, $30, $3C, $00 39 | .byte $0C, $12, $30, $7C, $30, $62, $FC, $00, $3C, $0C, $0C, $0C, $0C, $0C, $3C, $00 40 | .byte $00, $18, $3C, $7E, $18, $18, $18, $18, $00, $10, $30, $7F, $7F, $30, $10, $00 41 | .byte $00, $00, $00, $00, $00, $00, $00, $00, $18, $18, $18, $18, $00, $00, $18, $00 42 | .byte $66, $66, $66, $00, $00, $00, $00, $00, $66, $66, $FF, $66, $FF, $66, $66, $00 43 | .byte $18, $3E, $60, $3C, $06, $7C, $18, $00, $62, $66, $0C, $18, $30, $66, $46, $00 44 | .byte $3C, $66, $3C, $38, $67, $66, $3F, $00, $06, $0C, $18, $00, $00, $00, $00, $00 45 | .byte $0C, $18, $30, $30, $30, $18, $0C, $00, $30, $18, $0C, $0C, $0C, $18, $30, $00 46 | .byte $00, $66, $3C, $FF, $3C, $66, $00, $00, $00, $18, $18, $7E, $18, $18, $00, $00 47 | .byte $00, $00, $00, $00, $00, $18, $18, $30, $00, $00, $00, $7E, $00, $00, $00, $00 48 | .byte $00, $00, $00, $00, $00, $18, $18, $00, $00, $03, $06, $0C, $18, $30, $60, $00 49 | .byte $3C, $66, $6E, $76, $66, $66, $3C, $00, $18, $18, $38, $18, $18, $18, $7E, $00 50 | .byte $3C, $66, $06, $0C, $30, $60, $7E, $00, $3C, $66, $06, $1C, $06, $66, $3C, $00 51 | .byte $06, $0E, $1E, $66, $7F, $06, $06, $00, $7E, $60, $7C, $06, $06, $66, $3C, $00 52 | .byte $3C, $66, $60, $7C, $66, $66, $3C, $00, $7E, $66, $0C, $18, $18, $18, $18, $00 53 | .byte $3C, $66, $66, $3C, $66, $66, $3C, $00, $3C, $66, $66, $3E, $06, $66, $3C, $00 54 | .byte $00, $00, $18, $00, $00, $18, $00, $00, $00, $00, $18, $00, $00, $18, $18, $30 55 | .byte $0E, $18, $30, $60, $30, $18, $0E, $00, $00, $00, $7E, $00, $7E, $00, $00, $00 56 | .byte $70, $18, $0C, $06, $0C, $18, $70, $00, $3C, $66, $06, $0C, $18, $00, $18, $00 57 | .byte $00, $00, $00, $FF, $FF, $00, $00, $00, $08, $1C, $3E, $7F, $7F, $1C, $3E, $00 58 | .byte $18, $18, $18, $18, $18, $18, $18, $18, $00, $00, $00, $FF, $FF, $00, $00, $00 59 | .byte $00, $00, $FF, $FF, $00, $00, $00, $00, $00, $FF, $FF, $00, $00, $00, $00, $00 60 | .byte $00, $00, $00, $00, $FF, $FF, $00, $00, $30, $30, $30, $30, $30, $30, $30, $30 61 | .byte $0C, $0C, $0C, $0C, $0C, $0C, $0C, $0C, $00, $00, $00, $E0, $F0, $38, $18, $18 62 | .byte $18, $18, $1C, $0F, $07, $00, $00, $00, $18, $18, $38, $F0, $E0, $00, $00, $00 63 | .byte $C0, $C0, $C0, $C0, $C0, $C0, $FF, $FF, $C0, $E0, $70, $38, $1C, $0E, $07, $03 64 | .byte $03, $07, $0E, $1C, $38, $70, $E0, $C0, $FF, $FF, $C0, $C0, $C0, $C0, $C0, $C0 65 | .byte $FF, $FF, $03, $03, $03, $03, $03, $03, $00, $3C, $7E, $7E, $7E, $7E, $3C, $00 66 | .byte $00, $00, $00, $00, $00, $FF, $FF, $00, $36, $7F, $7F, $7F, $3E, $1C, $08, $00 67 | .byte $60, $60, $60, $60, $60, $60, $60, $60, $00, $00, $00, $07, $0F, $1C, $18, $18 68 | .byte $C3, $E7, $7E, $3C, $3C, $7E, $E7, $C3, $00, $3C, $7E, $66, $66, $7E, $3C, $00 69 | .byte $18, $18, $66, $66, $18, $18, $3C, $00, $06, $06, $06, $06, $06, $06, $06, $06 70 | .byte $08, $1C, $3E, $7F, $3E, $1C, $08, $00, $18, $18, $18, $FF, $FF, $18, $18, $18 71 | .byte $C0, $C0, $30, $30, $C0, $C0, $30, $30, $18, $18, $18, $18, $18, $18, $18, $18 72 | .byte $00, $00, $03, $3E, $76, $36, $36, $00, $FF, $7F, $3F, $1F, $0F, $07, $03, $01 73 | .byte $00, $00, $00, $00, $00, $00, $00, $00, $F0, $F0, $F0, $F0, $F0, $F0, $F0, $F0 74 | .byte $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00 75 | .byte $00, $00, $00, $00, $00, $00, $00, $FF, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0 76 | .byte $CC, $CC, $33, $33, $CC, $CC, $33, $33, $03, $03, $03, $03, $03, $03, $03, $03 77 | .byte $00, $00, $00, $00, $CC, $CC, $33, $33, $FF, $FE, $FC, $F8, $F0, $E0, $C0, $80 78 | .byte $03, $03, $03, $03, $03, $03, $03, $03, $18, $18, $18, $1F, $1F, $18, $18, $18 79 | .byte $00, $00, $00, $00, $0F, $0F, $0F, $0F, $18, $18, $18, $1F, $1F, $00, $00, $00 80 | .byte $00, $00, $00, $F8, $F8, $18, $18, $18, $00, $00, $00, $00, $00, $00, $FF, $FF 81 | .byte $00, $00, $00, $1F, $1F, $18, $18, $18, $18, $18, $18, $FF, $FF, $00, $00, $00 82 | .byte $00, $00, $00, $FF, $FF, $18, $18, $18, $18, $18, $18, $F8, $F8, $18, $18, $18 83 | .byte $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0 84 | .byte $07, $07, $07, $07, $07, $07, $07, $07, $FF, $FF, $00, $00, $00, $00, $00, $00 85 | .byte $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF 86 | .byte $03, $03, $03, $03, $03, $03, $FF, $FF, $00, $00, $00, $00, $F0, $F0, $F0, $F0 87 | .byte $0F, $0F, $0F, $0F, $00, $00, $00, $00, $18, $18, $18, $F8, $F8, $00, $00, $00 88 | .byte $F0, $F0, $F0, $F0, $00, $00, $00, $00, $F0, $F0, $F0, $F0, $0F, $0F, $0F, $0F 89 | .byte $C3, $99, $91, $91, $9F, $99, $C3, $FF, $E7, $C3, $99, $81, $99, $99, $99, $FF 90 | .byte $83, $99, $99, $83, $99, $99, $83, $FF, $C3, $99, $9F, $9F, $9F, $99, $C3, $FF 91 | .byte $87, $93, $99, $99, $99, $93, $87, $FF, $81, $9F, $9F, $87, $9F, $9F, $81, $FF 92 | .byte $81, $9F, $9F, $87, $9F, $9F, $9F, $FF, $C3, $99, $9F, $91, $99, $99, $C3, $FF 93 | .byte $99, $99, $99, $81, $99, $99, $99, $FF, $C3, $E7, $E7, $E7, $E7, $E7, $C3, $FF 94 | .byte $E1, $F3, $F3, $F3, $F3, $93, $C7, $FF, $99, $93, $87, $8F, $87, $93, $99, $FF 95 | .byte $9F, $9F, $9F, $9F, $9F, $9F, $81, $FF, $9C, $88, $80, $94, $9C, $9C, $9C, $FF 96 | .byte $99, $89, $81, $81, $91, $99, $99, $FF, $C3, $99, $99, $99, $99, $99, $C3, $FF 97 | .byte $83, $99, $99, $83, $9F, $9F, $9F, $FF, $C3, $99, $99, $99, $99, $C3, $F1, $FF 98 | .byte $83, $99, $99, $83, $87, $93, $99, $FF, $C3, $99, $9F, $C3, $F9, $99, $C3, $FF 99 | .byte $81, $E7, $E7, $E7, $E7, $E7, $E7, $FF, $99, $99, $99, $99, $99, $99, $C3, $FF 100 | .byte $99, $99, $99, $99, $99, $C3, $E7, $FF, $9C, $9C, $9C, $94, $80, $88, $9C, $FF 101 | .byte $99, $99, $C3, $E7, $C3, $99, $99, $FF, $99, $99, $99, $C3, $E7, $E7, $E7, $FF 102 | .byte $81, $F9, $F3, $E7, $CF, $9F, $81, $FF, $C3, $CF, $CF, $CF, $CF, $CF, $C3, $FF 103 | .byte $F3, $ED, $CF, $83, $CF, $9D, $03, $FF, $C3, $F3, $F3, $F3, $F3, $F3, $C3, $FF 104 | .byte $FF, $E7, $C3, $81, $E7, $E7, $E7, $E7, $FF, $EF, $CF, $80, $80, $CF, $EF, $FF 105 | .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $E7, $E7, $E7, $E7, $FF, $FF, $E7, $FF 106 | .byte $99, $99, $99, $FF, $FF, $FF, $FF, $FF, $99, $99, $00, $99, $00, $99, $99, $FF 107 | .byte $E7, $C1, $9F, $C3, $F9, $83, $E7, $FF, $9D, $99, $F3, $E7, $CF, $99, $B9, $FF 108 | .byte $C3, $99, $C3, $C7, $98, $99, $C0, $FF, $F9, $F3, $E7, $FF, $FF, $FF, $FF, $FF 109 | .byte $F3, $E7, $CF, $CF, $CF, $E7, $F3, $FF, $CF, $E7, $F3, $F3, $F3, $E7, $CF, $FF 110 | .byte $FF, $99, $C3, $00, $C3, $99, $FF, $FF, $FF, $E7, $E7, $81, $E7, $E7, $FF, $FF 111 | .byte $FF, $FF, $FF, $FF, $FF, $E7, $E7, $CF, $FF, $FF, $FF, $81, $FF, $FF, $FF, $FF 112 | .byte $FF, $FF, $FF, $FF, $FF, $E7, $E7, $FF, $FF, $FC, $F9, $F3, $E7, $CF, $9F, $FF 113 | .byte $C3, $99, $91, $89, $99, $99, $C3, $FF, $E7, $E7, $C7, $E7, $E7, $E7, $81, $FF 114 | .byte $C3, $99, $F9, $F3, $CF, $9F, $81, $FF, $C3, $99, $F9, $E3, $F9, $99, $C3, $FF 115 | .byte $F9, $F1, $E1, $99, $80, $F9, $F9, $FF, $81, $9F, $83, $F9, $F9, $99, $C3, $FF 116 | .byte $C3, $99, $9F, $83, $99, $99, $C3, $FF, $81, $99, $F3, $E7, $E7, $E7, $E7, $FF 117 | .byte $C3, $99, $99, $C3, $99, $99, $C3, $FF, $C3, $99, $99, $C1, $F9, $99, $C3, $FF 118 | .byte $FF, $FF, $E7, $FF, $FF, $E7, $FF, $FF, $FF, $FF, $E7, $FF, $FF, $E7, $E7, $CF 119 | .byte $F1, $E7, $CF, $9F, $CF, $E7, $F1, $FF, $FF, $FF, $81, $FF, $81, $FF, $FF, $FF 120 | .byte $8F, $E7, $F3, $F9, $F3, $E7, $8F, $FF, $C3, $99, $F9, $F3, $E7, $FF, $E7, $FF 121 | .byte $FF, $FF, $FF, $00, $00, $FF, $FF, $FF, $F7, $E3, $C1, $80, $80, $E3, $C1, $FF 122 | .byte $E7, $E7, $E7, $E7, $E7, $E7, $E7, $E7, $FF, $FF, $FF, $00, $00, $FF, $FF, $FF 123 | .byte $FF, $FF, $00, $00, $FF, $FF, $FF, $FF, $FF, $00, $00, $FF, $FF, $FF, $FF, $FF 124 | .byte $FF, $FF, $FF, $FF, $00, $00, $FF, $FF, $CF, $CF, $CF, $CF, $CF, $CF, $CF, $CF 125 | .byte $F3, $F3, $F3, $F3, $F3, $F3, $F3, $F3, $FF, $FF, $FF, $1F, $0F, $C7, $E7, $E7 126 | .byte $E7, $E7, $E3, $F0, $F8, $FF, $FF, $FF, $E7, $E7, $C7, $0F, $1F, $FF, $FF, $FF 127 | .byte $3F, $3F, $3F, $3F, $3F, $3F, $00, $00, $3F, $1F, $8F, $C7, $E3, $F1, $F8, $FC 128 | .byte $FC, $F8, $F1, $E3, $C7, $8F, $1F, $3F, $00, $00, $3F, $3F, $3F, $3F, $3F, $3F 129 | .byte $00, $00, $FC, $FC, $FC, $FC, $FC, $FC, $FF, $C3, $81, $81, $81, $81, $C3, $FF 130 | .byte $FF, $FF, $FF, $FF, $FF, $00, $00, $FF, $C9, $80, $80, $80, $C1, $E3, $F7, $FF 131 | .byte $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $FF, $FF, $FF, $F8, $F0, $E3, $E7, $E7 132 | .byte $3C, $18, $81, $C3, $C3, $81, $18, $3C, $FF, $C3, $81, $99, $99, $81, $C3, $FF 133 | .byte $E7, $E7, $99, $99, $E7, $E7, $C3, $FF, $F9, $F9, $F9, $F9, $F9, $F9, $F9, $F9 134 | .byte $F7, $E3, $C1, $80, $C1, $E3, $F7, $FF, $E7, $E7, $E7, $00, $00, $E7, $E7, $E7 135 | .byte $3F, $3F, $CF, $CF, $3F, $3F, $CF, $CF, $E7, $E7, $E7, $E7, $E7, $E7, $E7, $E7 136 | .byte $FF, $FF, $FC, $C1, $89, $C9, $C9, $FF, $00, $80, $C0, $E0, $F0, $F8, $FC, $FE 137 | .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F 138 | .byte $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF 139 | .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $3F, $3F, $3F, $3F, $3F, $3F, $3F, $3F 140 | .byte $33, $33, $CC, $CC, $33, $33, $CC, $CC, $FC, $FC, $FC, $FC, $FC, $FC, $FC, $FC 141 | .byte $FF, $FF, $FF, $FF, $33, $33, $CC, $CC, $00, $01, $03, $07, $0F, $1F, $3F, $7F 142 | .byte $FC, $FC, $FC, $FC, $FC, $FC, $FC, $FC, $E7, $E7, $E7, $E0, $E0, $E7, $E7, $E7 143 | .byte $FF, $FF, $FF, $FF, $F0, $F0, $F0, $F0, $E7, $E7, $E7, $E0, $E0, $FF, $FF, $FF 144 | .byte $FF, $FF, $FF, $07, $07, $E7, $E7, $E7, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00 145 | .byte $FF, $FF, $FF, $E0, $E0, $E7, $E7, $E7, $E7, $E7, $E7, $00, $00, $FF, $FF, $FF 146 | .byte $FF, $FF, $FF, $00, $00, $E7, $E7, $E7, $E7, $E7, $E7, $07, $07, $E7, $E7, $E7 147 | .byte $3F, $3F, $3F, $3F, $3F, $3F, $3F, $3F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F 148 | .byte $F8, $F8, $F8, $F8, $F8, $F8, $F8, $F8, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF 149 | .byte $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00 150 | .byte $FC, $FC, $FC, $FC, $FC, $FC, $00, $00, $FF, $FF, $FF, $FF, $0F, $0F, $0F, $0F 151 | .byte $F0, $F0, $F0, $F0, $FF, $FF, $FF, $FF, $E7, $E7, $E7, $07, $07, $FF, $FF, $FF 152 | .byte $0F, $0F, $0F, $0F, $FF, $FF, $FF, $FF, $0F, $0F, $0F, $0F, $F0, $F0, $F0, $F0 153 | .byte $3C, $66, $6E, $6E, $60, $62, $3C, $00, $00, $00, $3C, $06, $3E, $66, $3E, $00 154 | .byte $00, $60, $60, $7C, $66, $66, $7C, $00, $00, $00, $3C, $60, $60, $60, $3C, $00 155 | .byte $00, $06, $06, $3E, $66, $66, $3E, $00, $00, $00, $3C, $66, $7E, $60, $3C, $00 156 | .byte $00, $0E, $18, $3E, $18, $18, $18, $00, $00, $00, $3E, $66, $66, $3E, $06, $7C 157 | .byte $00, $60, $60, $7C, $66, $66, $66, $00, $00, $18, $00, $38, $18, $18, $3C, $00 158 | .byte $00, $06, $00, $06, $06, $06, $06, $3C, $00, $60, $60, $6C, $78, $6C, $66, $00 159 | .byte $00, $38, $18, $18, $18, $18, $3C, $00, $00, $00, $66, $7F, $7F, $6B, $63, $00 160 | .byte $00, $00, $7C, $66, $66, $66, $66, $00, $00, $00, $3C, $66, $66, $66, $3C, $00 161 | .byte $00, $00, $7C, $66, $66, $7C, $60, $60, $00, $00, $3E, $66, $66, $3E, $06, $06 162 | .byte $00, $00, $7C, $66, $60, $60, $60, $00, $00, $00, $3E, $60, $3C, $06, $7C, $00 163 | .byte $00, $18, $7E, $18, $18, $18, $0E, $00, $00, $00, $66, $66, $66, $66, $3E, $00 164 | .byte $00, $00, $66, $66, $66, $3C, $18, $00, $00, $00, $63, $6B, $7F, $3E, $36, $00 165 | .byte $00, $00, $66, $3C, $18, $3C, $66, $00, $00, $00, $66, $66, $66, $3E, $0C, $78 166 | .byte $00, $00, $7E, $0C, $18, $30, $7E, $00, $3C, $30, $30, $30, $30, $30, $3C, $00 167 | .byte $0C, $12, $30, $7C, $30, $62, $FC, $00, $3C, $0C, $0C, $0C, $0C, $0C, $3C, $00 168 | .byte $00, $18, $3C, $7E, $18, $18, $18, $18, $00, $10, $30, $7F, $7F, $30, $10, $00 169 | .byte $00, $00, $00, $00, $00, $00, $00, $00, $18, $18, $18, $18, $00, $00, $18, $00 170 | .byte $66, $66, $66, $00, $00, $00, $00, $00, $66, $66, $FF, $66, $FF, $66, $66, $00 171 | .byte $18, $3E, $60, $3C, $06, $7C, $18, $00, $62, $66, $0C, $18, $30, $66, $46, $00 172 | .byte $3C, $66, $3C, $38, $67, $66, $3F, $00, $06, $0C, $18, $00, $00, $00, $00, $00 173 | .byte $0C, $18, $30, $30, $30, $18, $0C, $00, $30, $18, $0C, $0C, $0C, $18, $30, $00 174 | .byte $00, $66, $3C, $FF, $3C, $66, $00, $00, $00, $18, $18, $7E, $18, $18, $00, $00 175 | .byte $00, $00, $00, $00, $00, $18, $18, $30, $00, $00, $00, $7E, $00, $00, $00, $00 176 | .byte $00, $00, $00, $00, $00, $18, $18, $00, $00, $03, $06, $0C, $18, $30, $60, $00 177 | .byte $3C, $66, $6E, $76, $66, $66, $3C, $00, $18, $18, $38, $18, $18, $18, $7E, $00 178 | .byte $3C, $66, $06, $0C, $30, $60, $7E, $00, $3C, $66, $06, $1C, $06, $66, $3C, $00 179 | .byte $06, $0E, $1E, $66, $7F, $06, $06, $00, $7E, $60, $7C, $06, $06, $66, $3C, $00 180 | .byte $3C, $66, $60, $7C, $66, $66, $3C, $00, $7E, $66, $0C, $18, $18, $18, $18, $00 181 | .byte $3C, $66, $66, $3C, $66, $66, $3C, $00, $3C, $66, $66, $3E, $06, $66, $3C, $00 182 | .byte $00, $00, $18, $00, $00, $18, $00, $00, $00, $00, $18, $00, $00, $18, $18, $30 183 | .byte $0E, $18, $30, $60, $30, $18, $0E, $00, $00, $00, $7E, $00, $7E, $00, $00, $00 184 | .byte $70, $18, $0C, $06, $0C, $18, $70, $00, $3C, $66, $06, $0C, $18, $00, $18, $00 185 | .byte $00, $00, $00, $FF, $FF, $00, $00, $00, $18, $3C, $66, $7E, $66, $66, $66, $00 186 | .byte $7C, $66, $66, $7C, $66, $66, $7C, $00, $3C, $66, $60, $60, $60, $66, $3C, $00 187 | .byte $78, $6C, $66, $66, $66, $6C, $78, $00, $7E, $60, $60, $78, $60, $60, $7E, $00 188 | .byte $7E, $60, $60, $78, $60, $60, $60, $00, $3C, $66, $60, $6E, $66, $66, $3C, $00 189 | .byte $66, $66, $66, $7E, $66, $66, $66, $00, $3C, $18, $18, $18, $18, $18, $3C, $00 190 | .byte $1E, $0C, $0C, $0C, $0C, $6C, $38, $00, $66, $6C, $78, $70, $78, $6C, $66, $00 191 | .byte $60, $60, $60, $60, $60, $60, $7E, $00, $63, $77, $7F, $6B, $63, $63, $63, $00 192 | .byte $66, $76, $7E, $7E, $6E, $66, $66, $00, $3C, $66, $66, $66, $66, $66, $3C, $00 193 | .byte $7C, $66, $66, $7C, $60, $60, $60, $00, $3C, $66, $66, $66, $66, $3C, $0E, $00 194 | .byte $7C, $66, $66, $7C, $78, $6C, $66, $00, $3C, $66, $60, $3C, $06, $66, $3C, $00 195 | .byte $7E, $18, $18, $18, $18, $18, $18, $00, $66, $66, $66, $66, $66, $66, $3C, $00 196 | .byte $66, $66, $66, $66, $66, $3C, $18, $00, $63, $63, $63, $6B, $7F, $77, $63, $00 197 | .byte $66, $66, $3C, $18, $3C, $66, $66, $00, $66, $66, $66, $3C, $18, $18, $18, $00 198 | .byte $7E, $06, $0C, $18, $30, $60, $7E, $00, $18, $18, $18, $FF, $FF, $18, $18, $18 199 | .byte $C0, $C0, $30, $30, $C0, $C0, $30, $30, $18, $18, $18, $18, $18, $18, $18, $18 200 | .byte $33, $33, $CC, $CC, $33, $33, $CC, $CC, $33, $99, $CC, $66, $33, $99, $CC, $66 201 | .byte $00, $00, $00, $00, $00, $00, $00, $00, $F0, $F0, $F0, $F0, $F0, $F0, $F0, $F0 202 | .byte $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00 203 | .byte $00, $00, $00, $00, $00, $00, $00, $FF, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0 204 | .byte $CC, $CC, $33, $33, $CC, $CC, $33, $33, $03, $03, $03, $03, $03, $03, $03, $03 205 | .byte $00, $00, $00, $00, $CC, $CC, $33, $33, $CC, $99, $33, $66, $CC, $99, $33, $66 206 | .byte $03, $03, $03, $03, $03, $03, $03, $03, $18, $18, $18, $1F, $1F, $18, $18, $18 207 | .byte $00, $00, $00, $00, $0F, $0F, $0F, $0F, $18, $18, $18, $1F, $1F, $00, $00, $00 208 | .byte $00, $00, $00, $F8, $F8, $18, $18, $18, $00, $00, $00, $00, $00, $00, $FF, $FF 209 | .byte $00, $00, $00, $1F, $1F, $18, $18, $18, $18, $18, $18, $FF, $FF, $00, $00, $00 210 | .byte $00, $00, $00, $FF, $FF, $18, $18, $18, $18, $18, $18, $F8, $F8, $18, $18, $18 211 | .byte $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0 212 | .byte $07, $07, $07, $07, $07, $07, $07, $07, $FF, $FF, $00, $00, $00, $00, $00, $00 213 | .byte $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF 214 | .byte $01, $03, $06, $6C, $78, $70, $60, $00, $00, $00, $00, $00, $F0, $F0, $F0, $F0 215 | .byte $0F, $0F, $0F, $0F, $00, $00, $00, $00, $18, $18, $18, $F8, $F8, $00, $00, $00 216 | .byte $F0, $F0, $F0, $F0, $00, $00, $00, $00, $F0, $F0, $F0, $F0, $0F, $0F, $0F, $0F 217 | .byte $C3, $99, $91, $91, $9F, $99, $C3, $FF, $FF, $FF, $C3, $F9, $C1, $99, $C1, $FF 218 | .byte $FF, $9F, $9F, $83, $99, $99, $83, $FF, $FF, $FF, $C3, $9F, $9F, $9F, $C3, $FF 219 | .byte $FF, $F9, $F9, $C1, $99, $99, $C1, $FF, $FF, $FF, $C3, $99, $81, $9F, $C3, $FF 220 | .byte $FF, $F1, $E7, $C1, $E7, $E7, $E7, $FF, $FF, $FF, $C1, $99, $99, $C1, $F9, $83 221 | .byte $FF, $9F, $9F, $83, $99, $99, $99, $FF, $FF, $E7, $FF, $C7, $E7, $E7, $C3, $FF 222 | .byte $FF, $F9, $FF, $F9, $F9, $F9, $F9, $C3, $FF, $9F, $9F, $93, $87, $93, $99, $FF 223 | .byte $FF, $C7, $E7, $E7, $E7, $E7, $C3, $FF, $FF, $FF, $99, $80, $80, $94, $9C, $FF 224 | .byte $FF, $FF, $83, $99, $99, $99, $99, $FF, $FF, $FF, $C3, $99, $99, $99, $C3, $FF 225 | .byte $FF, $FF, $83, $99, $99, $83, $9F, $9F, $FF, $FF, $C1, $99, $99, $C1, $F9, $F9 226 | .byte $FF, $FF, $83, $99, $9F, $9F, $9F, $FF, $FF, $FF, $C1, $9F, $C3, $F9, $83, $FF 227 | .byte $FF, $E7, $81, $E7, $E7, $E7, $F1, $FF, $FF, $FF, $99, $99, $99, $99, $C1, $FF 228 | .byte $FF, $FF, $99, $99, $99, $C3, $E7, $FF, $FF, $FF, $9C, $94, $80, $C1, $C9, $FF 229 | .byte $FF, $FF, $99, $C3, $E7, $C3, $99, $FF, $FF, $FF, $99, $99, $99, $C1, $F3, $87 230 | .byte $FF, $FF, $81, $F3, $E7, $CF, $81, $FF, $C3, $CF, $CF, $CF, $CF, $CF, $C3, $FF 231 | .byte $F3, $ED, $CF, $83, $CF, $9D, $03, $FF, $C3, $F3, $F3, $F3, $F3, $F3, $C3, $FF 232 | .byte $FF, $E7, $C3, $81, $E7, $E7, $E7, $E7, $FF, $EF, $CF, $80, $80, $CF, $EF, $FF 233 | .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $E7, $E7, $E7, $E7, $FF, $FF, $E7, $FF 234 | .byte $99, $99, $99, $FF, $FF, $FF, $FF, $FF, $99, $99, $00, $99, $00, $99, $99, $FF 235 | .byte $E7, $C1, $9F, $C3, $F9, $83, $E7, $FF, $9D, $99, $F3, $E7, $CF, $99, $B9, $FF 236 | .byte $C3, $99, $C3, $C7, $98, $99, $C0, $FF, $F9, $F3, $E7, $FF, $FF, $FF, $FF, $FF 237 | .byte $F3, $E7, $CF, $CF, $CF, $E7, $F3, $FF, $CF, $E7, $F3, $F3, $F3, $E7, $CF, $FF 238 | .byte $FF, $99, $C3, $00, $C3, $99, $FF, $FF, $FF, $E7, $E7, $81, $E7, $E7, $FF, $FF 239 | .byte $FF, $FF, $FF, $FF, $FF, $E7, $E7, $CF, $FF, $FF, $FF, $81, $FF, $FF, $FF, $FF 240 | .byte $FF, $FF, $FF, $FF, $FF, $E7, $E7, $FF, $FF, $FC, $F9, $F3, $E7, $CF, $9F, $FF 241 | .byte $C3, $99, $91, $89, $99, $99, $C3, $FF, $E7, $E7, $C7, $E7, $E7, $E7, $81, $FF 242 | .byte $C3, $99, $F9, $F3, $CF, $9F, $81, $FF, $C3, $99, $F9, $E3, $F9, $99, $C3, $FF 243 | .byte $F9, $F1, $E1, $99, $80, $F9, $F9, $FF, $81, $9F, $83, $F9, $F9, $99, $C3, $FF 244 | .byte $C3, $99, $9F, $83, $99, $99, $C3, $FF, $81, $99, $F3, $E7, $E7, $E7, $E7, $FF 245 | .byte $C3, $99, $99, $C3, $99, $99, $C3, $FF, $C3, $99, $99, $C1, $F9, $99, $C3, $FF 246 | .byte $FF, $FF, $E7, $FF, $FF, $E7, $FF, $FF, $FF, $FF, $E7, $FF, $FF, $E7, $E7, $CF 247 | .byte $F1, $E7, $CF, $9F, $CF, $E7, $F1, $FF, $FF, $FF, $81, $FF, $81, $FF, $FF, $FF 248 | .byte $8F, $E7, $F3, $F9, $F3, $E7, $8F, $FF, $C3, $99, $F9, $F3, $E7, $FF, $E7, $FF 249 | .byte $FF, $FF, $FF, $00, $00, $FF, $FF, $FF, $E7, $C3, $99, $81, $99, $99, $99, $FF 250 | .byte $83, $99, $99, $83, $99, $99, $83, $FF, $C3, $99, $9F, $9F, $9F, $99, $C3, $FF 251 | .byte $87, $93, $99, $99, $99, $93, $87, $FF, $81, $9F, $9F, $87, $9F, $9F, $81, $FF 252 | .byte $81, $9F, $9F, $87, $9F, $9F, $9F, $FF, $C3, $99, $9F, $91, $99, $99, $C3, $FF 253 | .byte $99, $99, $99, $81, $99, $99, $99, $FF, $C3, $E7, $E7, $E7, $E7, $E7, $C3, $FF 254 | .byte $E1, $F3, $F3, $F3, $F3, $93, $C7, $FF, $99, $93, $87, $8F, $87, $93, $99, $FF 255 | .byte $9F, $9F, $9F, $9F, $9F, $9F, $81, $FF, $9C, $88, $80, $94, $9C, $9C, $9C, $FF 256 | .byte $99, $89, $81, $81, $91, $99, $99, $FF, $C3, $99, $99, $99, $99, $99, $C3, $FF 257 | .byte $83, $99, $99, $83, $9F, $9F, $9F, $FF, $C3, $99, $99, $99, $99, $C3, $F1, $FF 258 | .byte $83, $99, $99, $83, $87, $93, $99, $FF, $C3, $99, $9F, $C3, $F9, $99, $C3, $FF 259 | .byte $81, $E7, $E7, $E7, $E7, $E7, $E7, $FF, $99, $99, $99, $99, $99, $99, $C3, $FF 260 | .byte $99, $99, $99, $99, $99, $C3, $E7, $FF, $9C, $9C, $9C, $94, $80, $88, $9C, $FF 261 | .byte $99, $99, $C3, $E7, $C3, $99, $99, $FF, $99, $99, $99, $C3, $E7, $E7, $E7, $FF 262 | .byte $81, $F9, $F3, $E7, $CF, $9F, $81, $FF, $E7, $E7, $E7, $00, $00, $E7, $E7, $E7 263 | .byte $3F, $3F, $CF, $CF, $3F, $3F, $CF, $CF, $E7, $E7, $E7, $E7, $E7, $E7, $E7, $E7 264 | .byte $CC, $CC, $33, $33, $CC, $CC, $33, $33, $CC, $66, $33, $99, $CC, $66, $33, $99 265 | .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F 266 | .byte $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF 267 | .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $3F, $3F, $3F, $3F, $3F, $3F, $3F, $3F 268 | .byte $33, $33, $CC, $CC, $33, $33, $CC, $CC, $FC, $FC, $FC, $FC, $FC, $FC, $FC, $FC 269 | .byte $FF, $FF, $FF, $FF, $33, $33, $CC, $CC, $33, $66, $CC, $99, $33, $66, $CC, $99 270 | .byte $FC, $FC, $FC, $FC, $FC, $FC, $FC, $FC, $E7, $E7, $E7, $E0, $E0, $E7, $E7, $E7 271 | .byte $FF, $FF, $FF, $FF, $F0, $F0, $F0, $F0, $E7, $E7, $E7, $E0, $E0, $FF, $FF, $FF 272 | .byte $FF, $FF, $FF, $07, $07, $E7, $E7, $E7, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00 273 | .byte $FF, $FF, $FF, $E0, $E0, $E7, $E7, $E7, $E7, $E7, $E7, $00, $00, $FF, $FF, $FF 274 | .byte $FF, $FF, $FF, $00, $00, $E7, $E7, $E7, $E7, $E7, $E7, $07, $07, $E7, $E7, $E7 275 | .byte $3F, $3F, $3F, $3F, $3F, $3F, $3F, $3F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F 276 | .byte $F8, $F8, $F8, $F8, $F8, $F8, $F8, $F8, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF 277 | .byte $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00 278 | .byte $FE, $FC, $F9, $93, $87, $8F, $9F, $FF, $FF, $FF, $FF, $FF, $0F, $0F, $0F, $0F 279 | .byte $F0, $F0, $F0, $F0, $FF, $FF, $FF, $FF, $E7, $E7, $E7, $07, $07, $FF, $FF, $FF 280 | .byte $0F, $0F, $0F, $0F, $FF, $FF, $FF, $FF, $0F, $0F, $0F, $0F, $F0, $F0, $F0, $F0 281 | -------------------------------------------------------------------------------- /src/ili9340.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | ; ILI9340 240x320 RGB TFT display, connected to 6522 VIA. 4 | ; http://www.adafruit.com/products/1480 5 | ; Code inspired by / ported from https://github.com/adafruit/Adafruit_ILI9340 6 | 7 | .export Ili9340Init 8 | .export Ili9340Test 9 | 10 | ; BSS vars 11 | .import SpiMaskClock 12 | .import SpiMaskMiso 13 | .import SpiMaskMosi 14 | .import SpiPort 15 | 16 | ; sleep 17 | .import SleepOneMs 18 | .import SleepXMs 19 | 20 | ; spi 21 | .import SpiByte 22 | .import SpiByteReadPortB 23 | 24 | .segment "kernal" 25 | 26 | via_base = $9000 27 | via_port = via_base + $00 ; PB 28 | via_ddr = via_base + $02 ; DDRB 29 | 30 | offset_x = 60 31 | offset_y = 20 32 | width = 200 33 | height = 200 34 | 35 | ; pin masks relative to VIA port 36 | mask_clock = %00000001 37 | mask_dc = %00000100 38 | mask_reset = %00001000 39 | mask_cs = %00100000 40 | mask_mosi = %01000000 41 | mask_miso = %10000000 42 | 43 | ; command constants 44 | ILI9340_NOP = $00 45 | ILI9340_SWRESET = $01 46 | ILI9340_RDDID = $04 47 | ILI9340_RDDST = $09 48 | ILI9340_SLPIN = $10 ; enter sleep 49 | ILI9340_SLPOUT = $11 ; exit sleep 50 | ILI9340_PTLON = $12 51 | ILI9340_NORON = $13 52 | ILI9340_RDMODE = $0A 53 | ILI9340_RDMADCTL = $0B 54 | ILI9340_RDPIXFMT = $0C 55 | ILI9340_RDIMGFMT = $0A 56 | ILI9340_RDSELFDIAG = $0F 57 | ILI9340_INVOFF = $20 58 | ILI9340_INVON = $21 59 | ILI9340_GAMMASET = $26 ; gamma curve selected 60 | ILI9340_DISPOFF = $28 ; display off 61 | ILI9340_DISPON = $29 ; display on 62 | ILI9340_CASET = $2A ; column address set 63 | ILI9340_PASET = $2B ; row address set 64 | ILI9340_RAMWR = $2C ; write to RAM 65 | ILI9340_RAMRD = $2E 66 | ILI9340_PTLAR = $30 67 | ILI9340_MADCTL = $36 ; memory access control 68 | ILI9340_MADCTL_MY = $80 69 | ILI9340_MADCTL_MX = $40 70 | ILI9340_MADCTL_MV = $20 71 | ILI9340_MADCTL_ML = $10 72 | ILI9340_MADCTL_RGB = $00 73 | ILI9340_MADCTL_BGR = $08 74 | ILI9340_MADCTL_MH = $04 75 | ILI9340_PIXFMT = $3A 76 | ILI9340_FRMCTR1 = $B1 77 | ILI9340_FRMCTR2 = $B2 78 | ILI9340_FRMCTR3 = $B3 79 | ILI9340_INVCTR = $B4 80 | ILI9340_DFUNCTR = $B6 ; display function control 81 | ILI9340_PWCTR1 = $C0 ; power control 82 | ILI9340_PWCTR2 = $C1 ; power control 83 | ILI9340_PWCTR3 = $C2 84 | ILI9340_PWCTR4 = $C3 85 | ILI9340_PWCTR5 = $C4 86 | ILI9340_VMCTR1 = $C5 ; VCM control 87 | ILI9340_VMCTR2 = $C7 ; VCM control 88 | ILI9340_RDID1 = $DA 89 | ILI9340_RDID2 = $DB 90 | ILI9340_RDID3 = $DC 91 | ILI9340_RDID4 = $DD 92 | ILI9340_GMCTRP1 = $E0 ; set gamma 93 | ILI9340_GMCTRN1 = $E1 ; set gamma 94 | 95 | ; color constants 96 | C_BLACK = $0000 97 | C_BLUE = $001F 98 | C_RED = $F800 99 | C_GREEN = $07E0 100 | C_CYAN = $07FF 101 | C_MAGENTA = $F81F 102 | C_YELLOW = $FFE0 103 | C_WHITE = $FFFF 104 | 105 | 106 | .PROC Ili9340Init 107 | JSR configureDataDirection 108 | JSR configureSpi 109 | JSR reset 110 | JSR initializationCommands 111 | JSR initializeRotation 112 | RTS 113 | .ENDPROC 114 | 115 | .PROC Ili9340Test 116 | JSR spiSelect 117 | JSR setFullScreen 118 | JSR dataMode 119 | LDA #width 120 | BEQ done 121 | STA $20 122 | LDA #height 123 | BEQ done 124 | STA $21 125 | loop: 126 | LDX $21 127 | JSR SpiByteReadPortB 128 | LDX $20 129 | JSR SpiByteReadPortB 130 | DEC $20 ; go to next column. 131 | BNE loop ; if more columns, loop, 132 | LDA #width ; else reset column counter.. 133 | STA $20 134 | DEC $21 ; .. and go to next row. 135 | BNE loop ; if more rows loop. 136 | done: 137 | JSR spiDeselect 138 | RTS 139 | .ENDPROC 140 | 141 | .PROC configureDataDirection 142 | LDA via_ddr 143 | ORA #(mask_clock | mask_dc | mask_reset | mask_cs | mask_mosi) ; output 144 | AND #<~(mask_miso) ; input 145 | STA via_ddr 146 | RTS 147 | .ENDPROC 148 | 149 | ; Configure SPI driver parameters to use SSD1306 display. 150 | .PROC configureSpi 151 | LDA #mask_clock 152 | STA SpiMaskClock 153 | LDA #mask_mosi 154 | STA SpiMaskMosi 155 | LDA #mask_miso 156 | STA SpiMaskMiso 157 | LDA #.LOBYTE(via_port) 158 | STA SpiPort 159 | LDA #.HIBYTE(via_port) 160 | STA SpiPort + 1 161 | RTS 162 | .ENDPROC 163 | 164 | .PROC reset 165 | LDA via_port 166 | ORA #(mask_cs | mask_reset) ; initialize high 167 | AND #<~(mask_clock | mask_mosi) ; initialize low 168 | STA via_port 169 | JSR SleepOneMs 170 | LDA via_port 171 | AND #<~mask_reset ; assert reset 172 | STA via_port 173 | JSR SleepOneMs ; data sheet says hold at least 10 uS. 174 | LDA via_port 175 | ORA #mask_reset ; release reset 176 | STA via_port 177 | LDX #10 ; data sheet says wait at least 5msec after releasing reset. 178 | JSR SleepXMs 179 | RTS 180 | .ENDPROC 181 | 182 | .PROC initializationCommands 183 | JSR spiSelect 184 | JSR commandMode 185 | LDX #$EF 186 | JSR SpiByte 187 | JSR dataMode 188 | LDX #$03 189 | JSR SpiByte 190 | LDX #$80 191 | JSR SpiByte 192 | LDX #$02 193 | JSR SpiByte 194 | 195 | JSR commandMode 196 | LDX #$CF 197 | JSR SpiByte 198 | JSR dataMode 199 | LDX #$00 200 | JSR SpiByte 201 | LDX #$C1 202 | JSR SpiByte 203 | LDX #$30 204 | JSR SpiByte 205 | 206 | JSR commandMode 207 | LDX #$ED 208 | JSR SpiByte 209 | JSR dataMode 210 | LDX #$64 211 | JSR SpiByte 212 | LDX #$03 213 | JSR SpiByte 214 | LDX #$12 215 | JSR SpiByte 216 | LDX #$81 217 | JSR SpiByte 218 | 219 | JSR commandMode 220 | LDX #$E8 221 | JSR SpiByte 222 | JSR dataMode 223 | LDX #$85 224 | JSR SpiByte 225 | LDX #$00 226 | JSR SpiByte 227 | LDX #$78 228 | JSR SpiByte 229 | 230 | JSR commandMode 231 | LDX #$CB 232 | JSR SpiByte 233 | JSR dataMode 234 | LDX #$39 235 | JSR SpiByte 236 | LDX #$2C 237 | JSR SpiByte 238 | LDX #$00 239 | JSR SpiByte 240 | LDX #$34 241 | JSR SpiByte 242 | LDX #$02 243 | JSR SpiByte 244 | 245 | JSR commandMode 246 | LDX #$F7 247 | JSR SpiByte 248 | JSR dataMode 249 | LDX #$20 250 | JSR SpiByte 251 | 252 | JSR commandMode 253 | LDX #$EA 254 | JSR SpiByte 255 | JSR dataMode 256 | LDX #$00 257 | JSR SpiByte 258 | LDX #$00 259 | JSR SpiByte 260 | 261 | JSR commandMode 262 | LDX #ILI9340_PWCTR1 263 | JSR SpiByte 264 | JSR dataMode 265 | LDX #$23 266 | JSR SpiByte ; VRH[5:0] 267 | 268 | JSR commandMode 269 | LDX #ILI9340_PWCTR2 270 | JSR SpiByte 271 | JSR dataMode 272 | LDX #$10 273 | JSR SpiByte ; SAP[2:0];BT[3:0] 274 | 275 | JSR commandMode 276 | LDX #ILI9340_VMCTR1 277 | JSR SpiByte 278 | JSR dataMode 279 | LDX #$3e 280 | JSR SpiByte 281 | LDX #$28 282 | JSR SpiByte 283 | 284 | JSR commandMode 285 | LDX #ILI9340_VMCTR2 286 | JSR SpiByte 287 | JSR dataMode 288 | LDX #$86 289 | JSR SpiByte 290 | 291 | JSR commandMode 292 | LDX #ILI9340_MADCTL 293 | JSR SpiByte 294 | JSR dataMode 295 | LDX #ILI9340_MADCTL_MX | ILI9340_MADCTL_BGR 296 | JSR SpiByte 297 | 298 | JSR commandMode 299 | LDX #ILI9340_PIXFMT 300 | JSR SpiByte 301 | JSR dataMode 302 | LDX #$55 303 | JSR SpiByte 304 | 305 | JSR commandMode 306 | LDX #ILI9340_FRMCTR1 307 | JSR SpiByte 308 | JSR dataMode 309 | LDX #$00 310 | JSR SpiByte 311 | LDX #$18 312 | JSR SpiByte 313 | 314 | JSR commandMode 315 | LDX #ILI9340_DFUNCTR 316 | JSR SpiByte 317 | JSR dataMode 318 | LDX #$08 319 | JSR SpiByte 320 | LDX #$82 321 | JSR SpiByte 322 | LDX #$27 323 | JSR SpiByte 324 | 325 | JSR commandMode 326 | LDX #$F2 ; 3Gamma Function Disable 327 | JSR SpiByte 328 | JSR dataMode 329 | LDX #$00 330 | JSR SpiByte 331 | 332 | JSR commandMode 333 | LDX #ILI9340_GAMMASET 334 | JSR SpiByte 335 | JSR dataMode 336 | LDX #$01 337 | JSR SpiByte 338 | 339 | JSR commandMode 340 | LDX #ILI9340_GMCTRP1 341 | JSR SpiByte 342 | JSR dataMode 343 | LDX #$0F 344 | JSR SpiByte 345 | LDX #$31 346 | JSR SpiByte 347 | LDX #$2B 348 | JSR SpiByte 349 | LDX #$0C 350 | JSR SpiByte 351 | LDX #$0E 352 | JSR SpiByte 353 | LDX #$08 354 | JSR SpiByte 355 | LDX #$4E 356 | JSR SpiByte 357 | LDX #$F1 358 | JSR SpiByte 359 | LDX #$37 360 | JSR SpiByte 361 | LDX #$07 362 | JSR SpiByte 363 | LDX #$10 364 | JSR SpiByte 365 | LDX #$03 366 | JSR SpiByte 367 | LDX #$0E 368 | JSR SpiByte 369 | LDX #$09 370 | JSR SpiByte 371 | LDX #$00 372 | JSR SpiByte 373 | 374 | JSR commandMode 375 | LDX #ILI9340_GMCTRN1 376 | JSR SpiByte 377 | JSR dataMode 378 | LDX #$00 379 | JSR SpiByte 380 | LDX #$0E 381 | JSR SpiByte 382 | LDX #$14 383 | JSR SpiByte 384 | LDX #$03 385 | JSR SpiByte 386 | LDX #$11 387 | JSR SpiByte 388 | LDX #$07 389 | JSR SpiByte 390 | LDX #$31 391 | JSR SpiByte 392 | LDX #$C1 393 | JSR SpiByte 394 | LDX #$48 395 | JSR SpiByte 396 | LDX #$08 397 | JSR SpiByte 398 | LDX #$0F 399 | JSR SpiByte 400 | LDX #$0C 401 | JSR SpiByte 402 | LDX #$31 403 | JSR SpiByte 404 | LDX #$36 405 | JSR SpiByte 406 | LDX #$0F 407 | JSR SpiByte 408 | 409 | JSR commandMode 410 | LDX #ILI9340_SLPOUT 411 | JSR SpiByte 412 | LDX 120 413 | JSR SleepXMs 414 | LDX #ILI9340_DISPON 415 | JSR SpiByte 416 | 417 | JSR spiDeselect 418 | RTS 419 | .ENDPROC 420 | 421 | .PROC initializeRotation 422 | JSR spiSelect 423 | JSR commandMode 424 | LDX #ILI9340_MADCTL 425 | JSR SpiByte 426 | JSR dataMode 427 | LDX #(ILI9340_MADCTL_MV | ILI9340_MADCTL_BGR) 428 | JSR SpiByte 429 | JSR spiDeselect 430 | RTS 431 | .ENDPROC 432 | 433 | .PROC commandMode 434 | LDA via_port 435 | AND #<~mask_dc ; D/C low: command mode 436 | STA via_port 437 | RTS 438 | .ENDPROC 439 | 440 | .PROC dataMode 441 | LDA via_port 442 | ORA #mask_dc ; D/C high: data mode 443 | STA via_port 444 | RTS 445 | .ENDPROC 446 | 447 | .PROC spiDeselect 448 | LDA via_port 449 | ORA #mask_cs 450 | STA via_port 451 | RTS 452 | .ENDPROC 453 | 454 | .PROC spiSelect 455 | LDA via_port 456 | AND #<~mask_cs 457 | STA via_port 458 | RTS 459 | .ENDPROC 460 | 461 | .PROC setFullScreen 462 | JSR commandMode 463 | ; set column address: 464 | LDX #ILI9340_CASET 465 | JSR SpiByte 466 | JSR dataMode 467 | ; set x0 468 | LDX #.HIBYTE(offset_x) 469 | JSR SpiByte 470 | LDX #.LOBYTE(offset_x) 471 | JSR SpiByte 472 | ; set x1 473 | LDX #.HIBYTE(offset_x + width - 1) 474 | JSR SpiByte 475 | LDX #.LOBYTE(offset_x + width - 1) 476 | JSR SpiByte 477 | JSR commandMode 478 | ; set row address: 479 | LDX #ILI9340_PASET 480 | JSR SpiByte 481 | JSR dataMode 482 | ; set y0 483 | LDX #.HIBYTE(offset_y) 484 | JSR SpiByte 485 | LDX #.LOBYTE(offset_y) 486 | JSR SpiByte 487 | ; set y1 488 | LDX #.HIBYTE(offset_y + height - 1) 489 | JSR SpiByte 490 | LDX #.LOBYTE(offset_y + height - 1) 491 | JSR SpiByte 492 | JSR commandMode 493 | ; set write to RAM 494 | LDX #ILI9340_RAMWR 495 | JSR SpiByte 496 | RTS 497 | .ENDPROC 498 | -------------------------------------------------------------------------------- /src/kernal.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .export Main 4 | 5 | ; timing 6 | .import SleepXSeconds 7 | 8 | ; encoding 9 | .import AsciiToPetscii 10 | 11 | ; ssd1306 12 | .import Ssd1306Init 13 | .import Ssd1306WriteScreen 14 | .import SsdNextSegment 15 | .import Ssd1306WriteCharacter 16 | 17 | ; ili9340 18 | .import Ili9340Init 19 | .import Ili9340Test 20 | 21 | ; fat 22 | .import FatReadFile 23 | .import FatSearchFilename 24 | 25 | ; font 26 | .import FontSelectChar 27 | 28 | ; SD card 29 | .import SdCardInit 30 | .import SdCardRead 31 | .import SdCardReset 32 | 33 | ; FAT filesystem 34 | .import FatInit 35 | 36 | ; user-stack 37 | .import StackPush 38 | 39 | .segment "kernal" 40 | 41 | ssd1306_buffer = $7000 ; page-aligned 512 byte buffer 42 | 43 | ; zero-page globals 44 | ssd1306_ptr = $A0 45 | ssd1306_ptr_hi = $A1 46 | font_ptr = $A2 47 | font_ptr_hi = $A3 48 | 49 | Main: 50 | ;-------- 51 | 52 | ; ; Initialize SSD1306 display. 53 | ; JSR Ssd1306Init 54 | ; 55 | ; JSR loadSplashScreen 56 | ; JSR displayText 57 | ; 58 | ; ; Initialize SD card 59 | ; JSR SdCardInit 60 | ; JSR SdCardReset 61 | ; 62 | ; JSR FatInit 63 | ; 64 | ; LDX #0 65 | ;filenameLoop: 66 | ; LDA SplashFilename,X 67 | ; STA FatSearchFilename,X 68 | ; INX 69 | ; CPX #11 70 | ; BNE filenameLoop 71 | ; JSR FatReadFile 72 | ; 73 | ; JSR displayText 74 | 75 | JSR Ili9340Init 76 | JSR Ili9340Test 77 | 78 | JMP Halt 79 | 80 | 81 | Halt: 82 | ;-------- 83 | NOP 84 | JMP Halt 85 | 86 | ; Copy Message to $6000 for displayText 87 | .PROC loadSplashScreen 88 | LDX #0 89 | loop: 90 | CPX #message_length 91 | BEQ done 92 | LDA Message,X ; A <- ASCII-ish byte from Message. 93 | STA $6000,X ; $6000 <- A 94 | INX 95 | JMP loop 96 | done: 97 | RTS 98 | .ENDPROC 99 | 100 | ; Display the text at $6000 101 | .PROC displayText 102 | ; Initialize pointer to an 8x8 screen segment. 103 | LDA #.LOBYTE(ssd1306_buffer) 104 | STA ssd1306_ptr 105 | LDA #.HIBYTE(ssd1306_buffer) 106 | STA ssd1306_ptr_hi 107 | 108 | LDA #0 109 | STA $10 ; loop counter = 0 110 | loop: 111 | LDX $10 112 | LDY $6000,X ; Y = ASCII-ish byte. 113 | JSR writeAsciiToSsdBuffer 114 | INC $10 115 | LDA $10 116 | CMP #message_length 117 | BNE loop 118 | 119 | LDX #.LOBYTE(ssd1306_buffer) 120 | LDY #.HIBYTE(ssd1306_buffer) 121 | JSR Ssd1306WriteScreen 122 | RTS 123 | .ENDPROC 124 | 125 | ; Y: ASCII-ish char to write. 126 | ; X: destroyed 127 | .PROC writeAsciiToSsdBuffer 128 | JSR AsciiToPetscii ; convert Y to PETSCII font offset. 129 | LDX #font_ptr 130 | JSR FontSelectChar ; select character in font 131 | LDX #font_ptr 132 | LDY #ssd1306_ptr 133 | JSR Ssd1306WriteCharacter ; write character to screen buffer 134 | LDX #ssd1306_ptr 135 | JSR SsdNextSegment ; move to next screen buffer segment 136 | RTS 137 | .ENDPROC 138 | 139 | SplashFilename: .byte "SPLASH TXT" 140 | 141 | message_length = 64 142 | Message: 143 | .byte 21, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 9 144 | .byte 2, "PDA6502 READY ", 2 145 | .byte 2, "RAM:32K ROM:8K", 2 146 | .byte 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 11 147 | -------------------------------------------------------------------------------- /src/memory.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .export CopyPages 4 | 5 | .segment "kernal" 6 | 7 | ; Copy X pages of data from *$10,$11 to *$12,$13. 8 | CopyPages: 9 | ;-------- 10 | PHA 11 | TXA 12 | PHA 13 | TYA 14 | PHA 15 | LDA $11 16 | PHA 17 | LDA $13 18 | PHA 19 | @eachPage: 20 | LDY #$00 ; byte offset within page. 21 | @eachByte: 22 | LDA ($10),Y 23 | STA ($12),Y 24 | INY ; zero for $FF -> $00 wrap. 25 | BNE @eachByte 26 | INC $11 27 | INC $13 28 | DEX 29 | BNE @eachPage 30 | PLA 31 | STA $13 32 | PLA 33 | STA $11 34 | PLA 35 | TAY 36 | PLA 37 | TAX 38 | PLA 39 | RTS 40 | -------------------------------------------------------------------------------- /src/sd.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .segment "kernal" 4 | 5 | .export SdCardInit 6 | .export SdCardRead 7 | .export SdCardReset 8 | 9 | ; Subroutines 10 | .import SpiByte 11 | .import StackPop 12 | .import StackPush 13 | 14 | ; BSS vars 15 | .import SpiMaskClock 16 | .import SpiMaskMiso 17 | .import SpiMaskMosi 18 | .import SpiPort 19 | 20 | ;---------------------------------------- 21 | ; SD card on port A of 6522 VIA at $9000 22 | 23 | via_base = $9000 24 | 25 | sd_mask_clock = %00010000 26 | sd_mask_mosi = %00100000 27 | sd_mask_miso = %01000000 28 | sd_mask_cs = %10000000 29 | sd_port = via_base + $01 ; PA 30 | sd_ddr = via_base + $03 ; DDRA 31 | 32 | ; Initialize the VIA controller for the SD card. 33 | .PROC SdCardInit 34 | ; DDR 35 | LDA sd_ddr 36 | ORA #(sd_mask_cs | sd_mask_clock | sd_mask_mosi) ; output 37 | AND #<~(sd_mask_miso) ; input 38 | STA sd_ddr 39 | JSR csHigh ; deselect 40 | ; clock low 41 | LDA #<~sd_mask_clock 42 | AND sd_port 43 | STA sd_port 44 | RTS 45 | .ENDPROC 46 | 47 | ; SdCardRead reads a block from address zero into into a fixed address. 48 | ; TODO: arguments for block number and destination pointer. 49 | .PROC SdCardRead 50 | TXA 51 | PHA 52 | TYA 53 | PHA 54 | JSR configureSpi 55 | JSR csLow 56 | 57 | LDX #17 ; READ_SINGLE_BLOCK (CMD17) 58 | JSR sdCardCommand ; expect 32-bit address on user stack 59 | ; TODO: check R1 == 0x00 (ready) 60 | 61 | waitForDataBlock: 62 | LDX #$FF ; MOSI high 63 | JSR SpiByte 64 | CPX #$FE 65 | BNE waitForDataBlock 66 | 67 | ; read first 256-byte page of 512-byte block 68 | LDY #0 69 | readLoop: 70 | LDX #$FF ; MOSI high 71 | JSR SpiByte 72 | TXA 73 | STA $6000,Y ; TODO: accept a ptr, store there. 74 | INY 75 | BNE readLoop 76 | 77 | ; read second 256-byte page of 512-byte block 78 | LDY #0 79 | readLoop2: 80 | LDX #$FF ; MOSI high 81 | JSR SpiByte 82 | TXA 83 | STA $6100,Y ; TODO: accept a ptr, store there. 84 | INY 85 | BNE readLoop2 86 | 87 | PLA 88 | TAY 89 | PLA 90 | TAX 91 | RTS 92 | .ENDPROC 93 | 94 | ; Switch to SPI mode, expect R1 response. 95 | .PROC SdCardReset 96 | TXA 97 | PHA 98 | JSR configureSpi 99 | JSR wasteClock 100 | JSR csLow 101 | 102 | LDX #0 ; GO_IDLE_STATE (CMD0); enter SPI mode. 103 | LDA #0 104 | JSR StackPush 105 | JSR StackPush 106 | JSR StackPush 107 | JSR StackPush 108 | JSR sdCardCommand 109 | ; TODO: check R1 == 0x01 110 | 111 | sd_send_op_cond_loop: 112 | LDX #55 ; APP_CMD (CMD55) 113 | LDA #0 114 | JSR StackPush 115 | JSR StackPush 116 | JSR StackPush 117 | JSR StackPush 118 | JSR sdCardCommand 119 | ; TODO: check R1 == 0x01 120 | LDX #41 ; SD_SEND_OP_COND (ACMD41) 121 | LDA #0 122 | JSR StackPush 123 | JSR StackPush 124 | JSR StackPush 125 | JSR StackPush 126 | JSR sdCardCommand 127 | CPX #0 128 | BNE sd_send_op_cond_loop 129 | 130 | JSR csHigh 131 | JSR wasteClock 132 | 133 | PLA 134 | TAX 135 | RTS 136 | .ENDPROC 137 | 138 | ; Configure SPI driver parameters to use SD card. 139 | .PROC configureSpi 140 | LDA #sd_mask_clock 141 | STA SpiMaskClock 142 | LDA #sd_mask_mosi 143 | STA SpiMaskMosi 144 | LDA #sd_mask_miso 145 | STA SpiMaskMiso 146 | LDA #.LOBYTE(sd_port) 147 | STA SpiPort 148 | LDA #.HIBYTE(sd_port) 149 | STA SpiPort + 1 150 | RTS 151 | .ENDPROC 152 | 153 | ; wasteClock sends 80 clock cycles with CS high (disabled). 154 | ; This is necessary at startup (>= 74 SPI clocks), and after 155 | ; receiving a final response (>= NCR clock cycles). 156 | .PROC wasteClock 157 | TYA 158 | PHA 159 | JSR csHigh 160 | LDY #10 ; 10 * 8 = 80 clocks 161 | initDelayLoop: 162 | JSR SpiByte 163 | DEY 164 | BNE initDelayLoop 165 | PLA 166 | TAY 167 | RTS 168 | .ENDPROC 169 | 170 | ; X: preserved 171 | ; Y: preserved 172 | .PROC waitNotBusy 173 | TXA 174 | PHA 175 | TYA 176 | PHA 177 | LDY #8 ; Loop limit. Increase? 178 | loop: 179 | LDX #$FF 180 | JSR SpiByte 181 | CPX #$FF 182 | BEQ done 183 | DEY 184 | BNE loop 185 | timeout: 186 | ; TODO: indicate failure to caller. 187 | done: 188 | PLA 189 | TAY 190 | PLA 191 | TAX 192 | RTS 193 | .ENDPROC 194 | 195 | ; X in: CMD, e.g. 0 for CMD0 196 | ; X out: R1 197 | ; 4 byte argument popped from user stack MSByte first; push LSByte first. 198 | .PROC sdCardCommand 199 | JSR csLow 200 | JSR waitNotBusy 201 | TXA 202 | AND #%00111111 ; 203 | ORA #%01000000 ; command is 01______ 204 | TAX 205 | JSR SpiByte ; CMD 206 | JSR StackPop 207 | TAX 208 | JSR SpiByte ; arg 209 | JSR StackPop 210 | TAX 211 | JSR SpiByte ; arg 212 | JSR StackPop 213 | TAX 214 | JSR SpiByte ; arg 215 | JSR StackPop 216 | TAX 217 | JSR SpiByte ; arg 218 | LDX #$95 ; static CRC + end bit for CMD0; ignored for other CMDs. 219 | JSR SpiByte ; CRC 220 | JSR waitR1 ; X <- R1 221 | RTS 222 | .ENDPROC 223 | 224 | ; X out: R1 response. 225 | .PROC waitR1 226 | loop: 227 | LDX #$FF 228 | JSR SpiByte 229 | TXA 230 | AND #$80 ; busy loop while MSB is high; valid r1 is 0_______. 231 | BNE loop 232 | RTS 233 | .ENDPROC 234 | 235 | ; Read Y bytes of data, plus start-byte and CRC bytes. 236 | ; * First byte: Start Block. 237 | ; * Bytes 2-513 (depends on the data block length): User Data. 238 | ; * Last two bytes: 16-bit CRC. 239 | .PROC readData 240 | TYA 241 | PHA 242 | JSR SpiByte ; read start block (11111110) 243 | loop: 244 | JSR SpiByte ; data byte 245 | ; TODO: store byte somewhere? 246 | DEY 247 | BNE loop 248 | JSR SpiByte ; CRC 249 | JSR SpiByte ; CRC 250 | PLA 251 | TAY 252 | .ENDPROC 253 | 254 | ; R1 response: one-byte MSB-first. High bits indicate: 255 | ; 0: Idle state 256 | ; 1: Erase reset 257 | ; 2: Illegal command 258 | ; 3: Communication CRC error 259 | ; 4: Erase sequence error 260 | ; 5: Address error 261 | ; 6: Parameter error 262 | ; 7: (zero) 263 | ; Note: 264 | ; The host must keep the clock running for at least 265 | ; NCR clock cycles after the card response is received. 266 | .PROC checkR1Response 267 | RTS 268 | .ENDPROC 269 | 270 | .PROC csHigh 271 | LDA sd_port 272 | ORA #sd_mask_cs 273 | STA sd_port 274 | RTS 275 | .ENDPROC 276 | 277 | .PROC csLow 278 | LDA sd_port 279 | AND #<~sd_mask_cs 280 | STA sd_port 281 | RTS 282 | .ENDPROC 283 | -------------------------------------------------------------------------------- /src/sleep.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .export SleepOneMs 4 | .export SleepXMs 5 | .export SleepXSeconds 6 | 7 | .segment "kernal" 8 | 9 | .PROC SleepXSeconds 10 | TXA 11 | PHA 12 | TYA 13 | PHA 14 | TXA ; move loop counter from X .. 15 | TAY ; .. to Y 16 | LDX #250 ; 250ms per SleepXMs 17 | loop: 18 | CPY #0 19 | BEQ done 20 | JSR SleepXMs 21 | JSR SleepXMs 22 | JSR SleepXMs 23 | JSR SleepXMs 24 | DEY 25 | JMP loop 26 | done: 27 | PLA 28 | TAY 29 | PLA 30 | TAX 31 | RTS 32 | .ENDPROC 33 | 34 | ; Sleep for X milliseconds (assuming 1 MHz). 35 | SleepXMs: 36 | TXA 37 | PHA 38 | @loop: 39 | JSR SleepOneMs 40 | DEX 41 | BNE @loop 42 | PLA 43 | TAX 44 | RTS 45 | 46 | ; Sleep for 196*5=1280 (plus about 20) cycles == ~1 ms at 1 MHz 47 | SleepOneMs: 48 | TXA 49 | PHA 50 | LDX #196 51 | @loop: 52 | DEX ; 2 cycles 53 | BNE @loop ; 3 cycles (+2 if branching to new page) 54 | PLA 55 | TAX 56 | RTS 57 | -------------------------------------------------------------------------------- /src/spi.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | ; subroutines 4 | .export SpiByte 5 | .export SpiByteReadPortB 6 | 7 | ; BSS vars 8 | .export SpiMaskClock 9 | .export SpiMaskMiso 10 | .export SpiMaskMosi 11 | .export SpiPort 12 | 13 | .segment "kernal_bss" 14 | 15 | SpiMaskClock: .byte 0 16 | SpiMaskMiso: .byte 0 17 | SpiMaskMosi: .byte 0 18 | SpiPort: .word 0 19 | 20 | .segment "kernal" 21 | 22 | ; SpiByte exchanges an output byte for an input byte via SPI. 23 | ; X: data input and output 24 | ; Y: (preserved) 25 | ; $10: (preserved) loop counter 26 | ; $12,$13: (preserved) SpiPort ptr 27 | .PROC SpiByte 28 | TYA 29 | PHA 30 | LDA $10 31 | PHA 32 | LDA $12 33 | PHA 34 | LDA $13 35 | PHA 36 | 37 | LDA SpiPort 38 | STA $12 39 | LDA SpiPort + 1 40 | STA $13 41 | 42 | LDY #0 ; for ($12),Y (SpiPort ptr) 43 | 44 | LDA #8 45 | STA $10 ; count down 8 bits 46 | eachBit: 47 | ; write MOSI 48 | TXA 49 | AND #(1 << 7) ; MSB 50 | BEQ writeZero 51 | writeOne: 52 | LDA SpiMaskMosi 53 | ORA ($12),Y 54 | JMP write 55 | writeZero: 56 | LDA SpiMaskMosi 57 | EOR #$FF 58 | LDY #0 59 | AND ($12),Y 60 | write: 61 | STA ($12),Y 62 | 63 | TXA 64 | ASL ; push next most significant bit to front. 65 | TAX 66 | 67 | ; clock high 68 | LDA SpiMaskClock 69 | ORA ($12),Y 70 | STA ($12),Y 71 | 72 | ; read MISO 73 | LDA SpiMaskMiso 74 | AND ($12),Y 75 | BEQ readZero 76 | readOne: 77 | TXA 78 | ORA #1 79 | JMP read 80 | readZero: 81 | TXA 82 | AND #<~1 83 | read: 84 | TAX ; new bit set into x[0], which will be shifted left until byte read. 85 | 86 | ; clock low 87 | LDA SpiMaskClock 88 | EOR #$FF 89 | AND ($12),Y 90 | STA ($12),Y 91 | 92 | DEC $10 93 | BNE eachBit 94 | 95 | PLA 96 | STA $13 97 | PLA 98 | STA $12 99 | PLA 100 | STA $10 101 | PLA 102 | TAY 103 | RTS 104 | .ENDPROC ; SpiByte 105 | 106 | ; SpiByteReadPortB writes register X to SPI. Does not read MISO. 107 | ; Fixed pin assignments: clock: 0, mosi: 6 108 | ; Clock must be initialized low. 109 | .PROC SpiByteReadPortB 110 | mask_mosi = %01000000 111 | port = $9000 112 | 113 | LDY #8 ; loop for 8 bits 114 | eachBit: 115 | ; write MOSI 116 | TXA 117 | AND #(1 << 7) ; MSB 118 | BEQ writeZero 119 | writeOne: 120 | LDA port 121 | ORA #mask_mosi 122 | JMP write 123 | writeZero: 124 | LDA port 125 | AND #<~mask_mosi 126 | write: 127 | STA port ; write 128 | 129 | ; clock high 130 | INC port 131 | 132 | TXA 133 | ASL ; push next most significant bit to front. 134 | TAX 135 | 136 | ; clock low 137 | DEC port 138 | 139 | DEY 140 | BNE eachBit 141 | 142 | RTS 143 | .ENDPROC 144 | -------------------------------------------------------------------------------- /src/ssd1306.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | ; SSD1306 OLED display, connected to VIA6522. 4 | 5 | .export Ssd1306Init 6 | .export Ssd1306WriteScreen 7 | .export SsdNextSegment 8 | .export Ssd1306WriteCharacter 9 | 10 | ; BSS vars 11 | .import SpiMaskClock 12 | .import SpiMaskMiso 13 | .import SpiMaskMosi 14 | .import SpiPort 15 | 16 | ; sleep 17 | .import SleepOneMs 18 | .import SleepXMs 19 | 20 | ; spi 21 | .import SpiByte 22 | 23 | ; bitwise 24 | .import ShiftZpXLeftByY 25 | .import ShiftZpXRightByY 26 | 27 | .segment "kernal" 28 | 29 | ; MOS 6522 VIA parameters. 30 | via_base = $9000 31 | via_pcr = via_base + $0C 32 | 33 | ; SSD1306 display parameters & wiring. 34 | ; TODO: make some or all of these dynamic, specified by caller. 35 | ssd1306_lcdwidth = 128 36 | ssd1306_lcdheight = 32 37 | ssd1306_mask_reset = %00001000 38 | ssd1306_mask_dc = %00000100 39 | ssd1306_mask_clock = %00000010 40 | ssd1306_mask_data = %00000001 41 | ssd1306_port = via_base + $01 ; PA 42 | ssd1306_ddr = via_base + $03 ; DDRA 43 | 44 | ; SSD1306 command constants 45 | SSD1306_SETCONTRAST = $81 46 | SSD1306_DISPLAYALLON_RESUME = $A4 47 | SSD1306_DISPLAYALLON = $A5 48 | SSD1306_NORMALDISPLAY = $A6 49 | SSD1306_INVERTDISPLAY = $A7 50 | SSD1306_DISPLAYOFF = $AE 51 | SSD1306_DISPLAYON = $AF 52 | SSD1306_SETDISPLAYOFFSET = $D3 53 | SSD1306_SETCOMPINS = $DA 54 | SSD1306_SETVCOMDETECT = $DB 55 | SSD1306_SETDISPLAYCLOCKDIV = $D5 56 | SSD1306_SETPRECHARGE = $D9 57 | SSD1306_SETMULTIPLEX = $A8 58 | SSD1306_SETLOWCOLUMN = $00 59 | SSD1306_SETHIGHCOLUMN = $10 60 | SSD1306_SETSTARTLINE = $40 61 | SSD1306_MEMORYMODE = $20 62 | SSD1306_COMSCANINC = $C0 63 | SSD1306_COMSCANDEC = $C8 64 | SSD1306_SEGREMAP = $A0 65 | SSD1306_CHARGEPUMP = $8D 66 | SSD1306_EXTERNALVCC = $01 67 | SSD1306_SWITCHCAPVCC = $02 68 | 69 | 70 | ; SSD1306 initialization. 71 | ; Mostly lifted from Adafruit's C++ arduino driver. 72 | ; Preserves A, X, Y. 73 | Ssd1306Init: 74 | PHA 75 | TXA 76 | PHA 77 | TYA 78 | PHA 79 | 80 | JSR configureSpi 81 | 82 | ; Data direction output for all pins. 83 | LDX #$FF 84 | STX ssd1306_ddr 85 | 86 | ; Reset (high, low, high). 87 | LDA #ssd1306_mask_reset 88 | STA ssd1306_port ; reset high (inactive) 89 | JSR SleepOneMs ; 1 ms 90 | LDA #%00000000 91 | STA ssd1306_port ; reset low (active) 92 | LDX #10 93 | JSR SleepXMs ; 10 ms 94 | LDA #ssd1306_mask_reset 95 | STA ssd1306_port ; reset high (inactive) 96 | 97 | LDX #SSD1306_DISPLAYOFF 98 | JSR Ssd1306Command 99 | 100 | LDX #SSD1306_SETDISPLAYCLOCKDIV 101 | JSR Ssd1306Command 102 | LDX #$80 103 | JSR Ssd1306Command 104 | 105 | LDX #SSD1306_SETMULTIPLEX 106 | JSR Ssd1306Command 107 | LDX #$1F 108 | JSR Ssd1306Command 109 | 110 | LDX #SSD1306_SETDISPLAYOFFSET 111 | JSR Ssd1306Command 112 | LDX #$00 113 | JSR Ssd1306Command 114 | 115 | LDX #(SSD1306_SETSTARTLINE | $00) ; line 0 116 | JSR Ssd1306Command 117 | 118 | LDX #SSD1306_CHARGEPUMP 119 | JSR Ssd1306Command 120 | LDX #$14 ; related to SSD1306_SWITCHCAPVCC? 121 | JSR Ssd1306Command 122 | 123 | LDX #SSD1306_MEMORYMODE 124 | JSR Ssd1306Command 125 | LDX #$00 ; "like ks0108"? 126 | JSR Ssd1306Command 127 | 128 | LDX #(SSD1306_SEGREMAP | $01) 129 | JSR Ssd1306Command 130 | 131 | LDX #SSD1306_COMSCANDEC 132 | JSR Ssd1306Command 133 | 134 | LDX #SSD1306_SETCOMPINS 135 | JSR Ssd1306Command 136 | LDX #$02 137 | JSR Ssd1306Command 138 | 139 | LDX #SSD1306_SETCONTRAST 140 | JSR Ssd1306Command 141 | LDX #$8F 142 | JSR Ssd1306Command 143 | 144 | LDX #SSD1306_SETPRECHARGE 145 | JSR Ssd1306Command 146 | LDX #$F1 ; related to SSD1306_SWITCHCAPVCC 147 | JSR Ssd1306Command 148 | 149 | LDX #SSD1306_SETVCOMDETECT 150 | JSR Ssd1306Command 151 | LDX #$40 152 | JSR Ssd1306Command 153 | 154 | LDX #SSD1306_DISPLAYALLON_RESUME 155 | JSR Ssd1306Command 156 | 157 | LDX #SSD1306_NORMALDISPLAY 158 | JSR Ssd1306Command 159 | 160 | LDX #SSD1306_DISPLAYON 161 | JSR Ssd1306Command 162 | 163 | PLA 164 | TAY 165 | PLA 166 | TAX 167 | PLA 168 | 169 | RTS 170 | 171 | 172 | ; Write data to SSD1306 display. 173 | ; X,Y is 16-bit pointer to the data. Both are destroyed. 174 | Ssd1306WriteScreen: 175 | LDA $10 176 | PHA 177 | LDA $11 178 | PHA 179 | 180 | JSR configureSpi 181 | 182 | ; Store data buffer ptr at $10 183 | STX $10 184 | STY $11 185 | 186 | ; Reset some things. 187 | LDX #(SSD1306_SETLOWCOLUMN | $0) ; low col = 0 188 | JSR Ssd1306Command 189 | LDX #(SSD1306_SETHIGHCOLUMN | $0) ; hi col = 0 190 | JSR Ssd1306Command 191 | LDX #(SSD1306_SETSTARTLINE | $0) ; line #0 192 | JSR Ssd1306Command 193 | 194 | ; D/C: high 195 | LDA #ssd1306_mask_dc 196 | ORA ssd1306_port 197 | STA ssd1306_port 198 | 199 | ; Write (ssd1306_lcdwidth * ssd1306_lcdheight / 8) bytes via SPI. 200 | 201 | LDA #2 ; loop for two 256-byte pages 202 | PHA ; store page counter 203 | @eachPage: 204 | LDY #$00 205 | @eachByte: 206 | LDA ($10),Y 207 | TAX 208 | JSR SpiByte 209 | TYA 210 | CMP #$FF ; 256 byte page written 211 | BEQ @donePage 212 | INY 213 | JMP @eachByte 214 | @donePage: 215 | PLA 216 | TAX ; restore page counter 217 | DEX 218 | BEQ @donePages 219 | TXA 220 | PHA ; re-save page counter 221 | INC $11 ; next segment of data 222 | JMP @eachPage 223 | @donePages: 224 | 225 | ; Ghetto writing of more zeros to fill 128x64 pixels. 226 | ; Adafruit code says: "i wonder why we have to do this (check datasheet)" 227 | ; (probably resets data pointer to zero; must be a better way) 228 | LDX #$00 ; data 229 | LDY #$00 ; loop index 230 | SsdWriteZeroLoop2: 231 | JSR SpiByte 232 | INY 233 | BNE SsdWriteZeroLoop2 234 | LDX #$00 ; data 235 | LDY #$00 ; loop index 236 | SsdWriteZeroLoop3: 237 | JSR SpiByte 238 | INY 239 | BNE SsdWriteZeroLoop3 240 | 241 | PLA 242 | STA $11 243 | PLA 244 | STA $10 245 | RTS 246 | 247 | 248 | ; Send a byte to SSD1306 in command mode. 249 | ; Ensures SSD1306's D/C is in command mode. 250 | ; X: command data 251 | Ssd1306Command: 252 | PHA 253 | LDA #ssd1306_mask_dc ; Enable command mode. 254 | EOR #$FF 255 | AND ssd1306_port 256 | STA ssd1306_port 257 | JSR SpiByte ; Send byte in X. 258 | PLA 259 | RTS 260 | 261 | 262 | ; X: zero-page address of pointer 263 | SsdNextSegment: 264 | JSR configureSpi 265 | CLC 266 | LDA 0,X 267 | ADC #8 268 | STA 0,X 269 | BCC @done 270 | INC 1,X 271 | @done: 272 | RTS 273 | 274 | ; Write a character to the screen buffer. 275 | ; X: font_ptr 276 | ; Y: ssd1306_ptr 277 | .PROC Ssd1306WriteCharacter 278 | 279 | font_ptr = $10 280 | font_ptr_hi = $11 281 | ssd1306_ptr = $12 282 | ssd1306_ptr_hi = $13 283 | screen_x = $14 284 | screen_y = $15 285 | tmp_bitmask = $16 286 | 287 | TXA 288 | PHA 289 | TYA 290 | PHA 291 | LDA font_ptr 292 | PHA 293 | LDA font_ptr_hi 294 | PHA 295 | LDA ssd1306_ptr 296 | PHA 297 | LDA ssd1306_ptr_hi 298 | PHA 299 | LDA screen_x 300 | PHA 301 | LDA screen_y 302 | PHA 303 | LDA tmp_bitmask 304 | PHA 305 | 306 | JSR configureSpi 307 | 308 | ; copy pointer to font to $10 309 | LDA 0,X 310 | STA font_ptr 311 | LDA 1,X 312 | STA font_ptr_hi 313 | 314 | ; copy pointer to screen buffer to $12 315 | TYA 316 | TAX 317 | LDA 0,X 318 | STA ssd1306_ptr 319 | LDA 1,X 320 | STA ssd1306_ptr_hi 321 | 322 | LDY #0 ; font y-coordinate (bit index); screen x-coordinate (byte index) 323 | STY screen_x 324 | @eachByte: 325 | LDX #7 ; font x-coordinate (byte index); screen y-coordinate (bit index) 326 | STX screen_y 327 | LDA #0 328 | STA (ssd1306_ptr),Y ; zero the byte 329 | @eachBit: 330 | ; create font bit mask in tmp 331 | LDA #%10000000 332 | STA tmp_bitmask 333 | LDX #tmp_bitmask ; store bitmask address in X 334 | LDY screen_x 335 | JSR ShiftZpXRightByY ; right-shift value at X=tmp_bitmask Y times. 336 | LDA tmp_bitmask ; resulting bitmask in A 337 | LDY screen_y 338 | AND (font_ptr),Y ; AND with font data 339 | BEQ @donePixel ; branch if bit was clear 340 | ; create display bit mask in tmp 341 | LDA #1 342 | STA tmp_bitmask ; store initial bitmask at $0012 343 | LDX #tmp_bitmask ; store ptr to $12 in X 344 | LDY screen_y ; screen-Y (font-X) into Y 345 | JSR ShiftZpXLeftByY ; left-shift value at X=$12 Y times. 346 | LDA tmp_bitmask ; resulting bitmask in A 347 | ; apply to ssd buffer 348 | LDY screen_x 349 | ORA (ssd1306_ptr),Y ; OR with destination data 350 | STA (ssd1306_ptr),Y ; Store in destination data. 351 | @donePixel: 352 | LDX screen_y 353 | DEX 354 | STX screen_y 355 | CPX #$FF 356 | BNE @eachBit 357 | LDY screen_x 358 | INY 359 | STY screen_x 360 | CPY #8 361 | BNE @eachByte 362 | 363 | PLA 364 | STA tmp_bitmask 365 | PLA 366 | STA screen_y 367 | PLA 368 | STA screen_x 369 | PLA 370 | STA ssd1306_ptr_hi 371 | PLA 372 | STA ssd1306_ptr 373 | PLA 374 | STA font_ptr_hi 375 | PLA 376 | STA font_ptr 377 | PLA 378 | TAY 379 | PLA 380 | TAX 381 | RTS 382 | .ENDPROC 383 | 384 | ; Configure SPI driver parameters to use SSD1306 display. 385 | .PROC configureSpi 386 | LDA #ssd1306_mask_clock 387 | STA SpiMaskClock 388 | LDA #ssd1306_mask_data 389 | STA SpiMaskMosi 390 | LDA #ssd1306_mask_data ; (SSD1306 SPI has no MISO) 391 | STA SpiMaskMiso 392 | LDA #.LOBYTE(ssd1306_port) 393 | STA SpiPort 394 | LDA #.HIBYTE(ssd1306_port) 395 | STA SpiPort + 1 396 | RTS 397 | .ENDPROC 398 | -------------------------------------------------------------------------------- /src/stack.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .segment "kernal" 4 | 5 | ;---------------------------------------- 6 | ; User stack, as distinct from the 6502 hardware stack. 7 | ; Starts at stack_base + $FF and grows downwards. 8 | ; Used for arbitrary data without interfering with return address etc. 9 | 10 | .export StackInit 11 | .export StackPush 12 | .export StackPop 13 | 14 | stack_base = $0200 15 | stack_ptr = $FF ; zero-page address of stack pointer 16 | 17 | ; Initialize the user stack. 18 | .PROC StackInit 19 | LDA #$FF 20 | STA stack_ptr 21 | RTS 22 | .ENDPROC 23 | 24 | ; Push A onto the stack. 25 | .PROC StackPush 26 | PHA ; stash A 27 | TXA ; preserve X 28 | PHA 29 | TSX 30 | LDA $0102,X ; fetch A from beneath X 31 | LDX stack_ptr 32 | STA stack_base,X ; stack <- A 33 | DEC stack_ptr ; stack grows downwards, point at next free byte. 34 | PLA ; restore X 35 | TAX 36 | PLA ; balance stack; also happens to restore A. 37 | RTS 38 | .ENDPROC 39 | 40 | ; Pop from stack into A. 41 | .PROC StackPop 42 | PHA ; placeholder for A 43 | TXA ; preserve X 44 | PHA 45 | INC stack_ptr ; stack shrinks upwards 46 | LDX stack_ptr 47 | LDA stack_base,X ; A <- tip of stack 48 | TSX 49 | STA $0102,X ; placeholder <- A 50 | PLA ; restore X 51 | TAX 52 | PLA ; restore A from placeholder 53 | RTS 54 | .ENDPROC 55 | -------------------------------------------------------------------------------- /src/vectors.s: -------------------------------------------------------------------------------- 1 | ; asmsyntax=asmM6502 (http://cc65.github.io/cc65/) 2 | 3 | .import Main 4 | 5 | ;-------------------- 6 | .segment "vectors" 7 | 8 | ; $FFFA: NMIB 9 | .word NonMaskableInterrupt 10 | 11 | ; $FFFC: RESB 12 | .word ColdStart 13 | 14 | ; $FFFE: BRK/IRQB 15 | .word Interrupt 16 | 17 | ;-------------------- 18 | .segment "kernal" 19 | 20 | ColdStart: 21 | ;-------- 22 | SEI ; mask interrupts during start-up 23 | LDX #$FF ; 24 | TXS ; set stack pointer to $ff ($01FF) 25 | CLI ; resume interrupts 26 | CLD ; don't be in crazy decimal mode. 27 | JMP Main 28 | 29 | Interrupt: 30 | ;-------- 31 | RTI 32 | 33 | NonMaskableInterrupt: 34 | ;-------- 35 | RTI 36 | -------------------------------------------------------------------------------- /tools/MEEPROMMERfirmware.ino: -------------------------------------------------------------------------------- 1 | /** 2 | * ** project Arduino EEPROM programmer ** 3 | * 4 | * This sketch can be used to read and write data to a 5 | * AT28C64 or AT28C256 parallel EEPROM 6 | * 7 | * $Author: mario, edited by Zack $ 8 | * $Date: 2013/05/05 11:01:54 $ 9 | * $Revision: 1.3 $ 10 | * 11 | * This software is freeware and can be modified, reused or thrown away without any restrictions. 12 | * 13 | * Use this code at your own risk. I'm not responsible for any bad effect or damages caused by this software!!! 14 | * 15 | **/ 16 | 17 | #define VERSIONSTRING "MEEPROMMER $Revision: 1.3 $ $Date: 12/18/2013 15:56:00 $, CMD:R,r,w,W,V, u" 18 | 19 | // shiftOut part 20 | #define PORTC_DS 0 21 | #define PORTC_LATCH 1 22 | #define PORTC_CLOCK 2 23 | 24 | // eeprom IO lines:D0-D7 = pins2-9 25 | 26 | // IO lines for the eeprom control 27 | #define PORTC_CE 3 28 | #define PORTC_OE 4 29 | #define PORTC_WE 5 30 | 31 | //a buffer for bytes to burn 32 | #define BUFFERSIZE 1024 33 | byte buffer[BUFFERSIZE]; 34 | //command buffer for parsing commands 35 | #define COMMANDSIZE 16 36 | char cmdbuf[COMMANDSIZE]; 37 | 38 | unsigned int startAddress,endAddress; 39 | unsigned int lineLength,dataLength; 40 | 41 | //define COMMANDS 42 | #define NOCOMMAND 0 43 | #define VERSION 1 44 | 45 | #define READ_HEX 10 46 | #define READ_BIN 11 47 | 48 | #define WRITE_PAGE 20 49 | #define WRITE_BIN 21 50 | 51 | #define UNLOCK 30 52 | 53 | /***************************************************************** 54 | * 55 | * CONTROL and DATA functions 56 | * 57 | ****************************************************************/ 58 | 59 | void data_bus_input(){ 60 | DDRD &= 0b00000011; 61 | DDRB &= 0b11111100; 62 | } 63 | 64 | void data_bus_output(){ 65 | DDRD |= 0b11111100; 66 | DDRB |= 0b00000011; 67 | } 68 | 69 | byte read_data_bus(){ 70 | return ((PINB<<6)|(PIND>>2)); 71 | } 72 | 73 | void write_data_bus(byte data){ 74 | PORTB &= 0b11111100; 75 | PORTB |= (data>>6); 76 | PORTD &= 0b00000011; 77 | PORTD |= (data<<2); 78 | } 79 | 80 | //shift out the given address to the 74hc595 registers 81 | void set_address_bus(unsigned int address){ 82 | bitClear(PORTC,PORTC_LATCH); //disable latch line 83 | fastShiftOut(highByte(address)); //shift out highbyte 84 | fastShiftOut(lowByte(address)); //shift out lowbyte 85 | bitSet(PORTC,PORTC_LATCH); //enable latch and set address 86 | } 87 | 88 | void fastShiftOut(byte data){ 89 | for(int i=7; i>=0; i--){//shift MSB first 90 | //clear data pin after shift to prevent bleed through 91 | bitClear(PORTC,PORTC_DS); 92 | bitClear(PORTC,PORTC_CLOCK); 93 | if(bitRead(data,i))bitSet(PORTC,PORTC_DS); 94 | //register shifts bits on rising clock 95 | bitSet(PORTC,PORTC_CLOCK); 96 | } 97 | bitClear(PORTC,PORTC_CLOCK); 98 | } 99 | 100 | byte read_byte(unsigned int address){ 101 | data_bus_input(); //set databus for reading 102 | bitClear(PORTC,PORTC_CE); //enable chip select 103 | bitSet(PORTC,PORTC_WE); //disable write 104 | set_address_bus(address); //set address bus 105 | bitClear(PORTC,PORTC_OE); //enable output 106 | //delay 312.5ns @ 16MHz 107 | __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); 108 | byte data = read_data_bus(); 109 | bitSet(PORTC,PORTC_OE); //disable output 110 | bitSet(PORTC,PORTC_CE); //enable chip select 111 | return data; 112 | } 113 | 114 | void fast_write(unsigned int address, byte data){ 115 | bitSet(PORTC,PORTC_OE); //first disable output 116 | bitSet(PORTC,PORTC_WE); //disable write 117 | set_address_bus(address); //set address bus 118 | data_bus_output(); //set databus to output 119 | write_data_bus(data); //set data bus 120 | bitClear(PORTC,PORTC_CE); //enable chip select 121 | bitClear(PORTC,PORTC_WE); //enable write 122 | __asm__("nop\n\t""nop\n\t"); //delay 125ns @ 16MHz 123 | bitSet(PORTC,PORTC_WE); //disable write 124 | data_bus_input(); 125 | bitClear(PORTC,PORTC_OE); 126 | //delay 312.5ns @ 16MHz 127 | __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); 128 | while(data != read_data_bus()); //poll data 129 | bitSet(PORTC,PORTC_OE); 130 | bitSet(PORTC,PORTC_CE); 131 | } 132 | 133 | void write_block_page(unsigned int address, byte* buffer, int len, int page){ 134 | address &= ~(page-1); //address must not break page boundaries 135 | bitSet(PORTC,PORTC_WE); //disable write 136 | bitClear(PORTC,PORTC_CE); //enable chip 137 | for(int n=0; n= '0' && c <= '9')return c - '0'; 196 | if(c >= 'a' && c <= 'f')return c - 'a' + 10; 197 | if(c >= 'A' && c <= 'F')return c - 'A' + 10; 198 | return 0;// getting here is bad: it means the character was invalid 199 | } 200 | 201 | byte hexByte(char* a){ //ascii byte to value 202 | return ((hexDigit(a[0])<<4) | hexDigit(a[1])); 203 | } 204 | 205 | //ascii word to value 206 | unsigned int hexWord(char* data){ 207 | return ((hexDigit(data[0])<<12)| 208 | (hexDigit(data[1])<<8)| 209 | (hexDigit(data[2])<<4)| 210 | (hexDigit(data[3]))); 211 | } 212 | 213 | 214 | /************************************************ 215 | * 216 | * INPUT / OUTPUT Functions 217 | * 218 | *************************************************/ 219 | 220 | void read_block(unsigned int from, unsigned int to, int linelength){ 221 | int outcount = 0; 222 | //loop from "from address" to "to address" (included) 223 | for(unsigned int address = from; address <= to; address++){ 224 | if(outcount == 0){ 225 | //print out the address at the beginning of the line 226 | Serial.println(); 227 | Serial.print("0x"); 228 | printAddress(address); 229 | Serial.print(" : "); 230 | } 231 | //print data, separated by a space 232 | printByte(read_byte(address)); 233 | Serial.print(" "); 234 | outcount = (++outcount % linelength); 235 | } 236 | Serial.println(); 237 | } 238 | 239 | void read_binblock(unsigned int from, unsigned int to){ 240 | for(unsigned int address = from; address <= to; address++){ 241 | Serial.write(read_byte(address)); 242 | } 243 | Serial.print('\0');//success return code 244 | } 245 | 246 | void write_block(unsigned int address, byte* buffer, int len){ 247 | for(unsigned int i = 0; i < len; i++){ 248 | fast_write(address+i,buffer[i]); 249 | } 250 | } 251 | 252 | void printAddress(unsigned int address){ 253 | if(!(address & 0xfff0)) Serial.print("0"); 254 | if(!(address & 0xff00)) Serial.print("0"); 255 | if(!(address & 0xf000)) Serial.print("0"); 256 | Serial.print(address, HEX); 257 | } 258 | 259 | void printByte(byte data){ 260 | if(!(data & 0xf0)) Serial.print("0"); 261 | Serial.print(data, HEX); 262 | } 263 | 264 | 265 | /************************************************ 266 | * 267 | * MAIN 268 | * 269 | *************************************************/ 270 | void setup(){ 271 | DDRC = 0b00111111; //set EEPROM & shiftOut Pins as output 272 | PORTC = 0b00111000; //set EEPROM Pins high 273 | //Serial.begin(57600); //set speed of serial connection 274 | Serial.begin(115200); 275 | } 276 | 277 | void loop(){ 278 | int bytes = 0; 279 | readCommand(); 280 | switch(parseCommand()){ 281 | case READ_HEX: 282 | if(lineLength==0) lineLength=32; //default 283 | endAddress = startAddress + dataLength -1; 284 | read_block(startAddress,endAddress,lineLength); 285 | Serial.println('%');//success return code 286 | break; 287 | case READ_BIN: 288 | endAddress = startAddress + dataLength -1; 289 | read_binblock(startAddress,endAddress); 290 | break; 291 | case WRITE_PAGE: 292 | if(dataLength > 1024) dataLength = 1024; 293 | while(bytes < dataLength)if(Serial.available())buffer[bytes++] = Serial.read(); 294 | if(lineLength==0) lineLength=32; //page size 295 | write_block_page(startAddress,buffer,dataLength,lineLength); 296 | Serial.println('%'); 297 | break; 298 | case WRITE_BIN: 299 | if(dataLength > 1024) dataLength = 1024; //1024 is max 300 | while(bytes < dataLength)if(Serial.available())buffer[bytes++] = Serial.read(); 301 | write_block(startAddress,buffer,dataLength); 302 | Serial.println('%'); 303 | break; 304 | case VERSION: 305 | Serial.println(VERSIONSTRING); 306 | break; 307 | case UNLOCK: 308 | fast_write(0x5555,0xAA); 309 | fast_write(0x2AAA,0x55); 310 | fast_write(0x5555,0x80); 311 | fast_write(0x5555,0xAA); 312 | fast_write(0x2AAA,0x55); 313 | fast_write(0x5555,0x20); 314 | Serial.print('%');//success return code 315 | break; 316 | } 317 | } 318 | -------------------------------------------------------------------------------- /tools/meepromer.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | #Meeprommer commandline interface 4 | #By Zack Nelson 5 | #Project Home: 6 | #https://github.com/mkeller0815/MEEPROMMER 7 | #http://www.ichbinzustaendig.de/dev/meeprommer-en 8 | 9 | # Some tweaks by @pda 10 | 11 | import serial, sys, argparse 12 | 13 | # Parse command line arguments 14 | parser = argparse.ArgumentParser( 15 | description='Meepromer Command Line Interface', 16 | epilog='Read source for further information') 17 | 18 | task = parser.add_mutually_exclusive_group() 19 | task.add_argument('-V', '--version', dest="cmd", action="store_const", 20 | const="version", help='Request and display device version') 21 | task.add_argument('-w', '--write', dest="cmd", action="store_const", 22 | const="write", help='Write to EEPROM') 23 | task.add_argument('-W', '--write_paged', dest="cmd", action="store_const", 24 | const="write_paged", help='Fast paged write to EEPROM') 25 | task.add_argument('-r', '--read', dest="cmd", action="store_const", 26 | const="read", help='Read from EEPROM as ascii') 27 | task.add_argument('-d', '--dump', dest="cmd", action="store_const", 28 | const="dump", help='Dump EEPROM to binary file') 29 | task.add_argument('-v', '--verify', dest="cmd", action="store_const", 30 | const="verify", help='Compare EEPROM with file') 31 | task.add_argument('-u', '--unlock', dest="cmd", action="store_const", 32 | const="unlock", help='Unlock EEPROM') 33 | task.add_argument('-l', '--list', dest="cmd", action="store_const", 34 | const="list", help='List serial ports') 35 | 36 | parser.add_argument('-a', '--address', action='store', default='0', 37 | help='Starting eeprom address (as hex), default 0') 38 | parser.add_argument('-o', '--offset', action='store', default='0', 39 | help='Input file offset (as hex), default 0') 40 | parser.add_argument('-b', '--bytes', action='store', default='8', 41 | type=int, help='Number of kBytes to r/w, default 8') 42 | parser.add_argument('-p', '--page_size', action='store', default='32', 43 | type=int, help='Number of bytes per EEPROM page e.g.:'+ 44 | 'CAT28C*=32, AT28C*=64, X28C*=64, default 32') 45 | parser.add_argument('-f', '--file', action='store', 46 | help='Name of data file') 47 | parser.add_argument('-c', '--com', action='store', 48 | default='COM5', help='Com port address') 49 | parser.add_argument('-s', '--speed', action='store', 50 | type=int, default='115200', help='Com port baud, default 115200') 51 | 52 | def list_ports(): 53 | from serial.tools import list_ports 54 | for x in list_ports.comports(): 55 | print(x[0], x[1]) 56 | 57 | def dump_file(): 58 | ser.flushInput() 59 | ser.write(bytes("r "+format(args.address,'04x')+" "+ 60 | format(args.address+args.bytes*1024,'04x')+ 61 | " 10\n", 'ascii')) 62 | eeprom = ser.read(args.bytes*1024) 63 | if(ser.read(1) != b'\0'): 64 | print("Error: no Ack") 65 | sys.exit(1) 66 | try: 67 | fo = open(args.file,'wb+') 68 | except OSError: 69 | print("Error: File cannot be opened, verify it is not in use") 70 | sys.exit(1) 71 | fo.write(eeprom) 72 | fo.close() 73 | 74 | def verify(): 75 | print("Verifying...") 76 | ser.flushInput() 77 | ser.write(bytes("r "+format(args.address,'04x')+" "+ 78 | format(args.bytes*1024,'04x')+" 10\n", 'ascii')) 79 | try: 80 | fi = open(args.file,'rb') 81 | except FileNotFoundError: 82 | print("Error: ",args.file," not found, please select a valid file") 83 | sys.exit(1) 84 | except TypeError: 85 | print("Error: No file specified") 86 | sys.exit(1) 87 | 88 | fi.seek(args.offset) 89 | file = fi.read(args.bytes*1024) 90 | eeprom = ser.read(args.bytes*1024) 91 | if ser.read(1) != b'\0': 92 | print("Error: no EOF received") 93 | 94 | if file != eeprom: 95 | print("Not equal") 96 | n = 0 97 | for i in range(args.bytes*1024): 98 | if file[i] != eeprom[i]: 99 | n+=1 100 | print(n,"differences found") 101 | sys.exit(1) 102 | else: 103 | print("Ok") 104 | 105 | def read_eeprom(): 106 | ser.flushInput() 107 | ser.write(bytes("R "+format(args.address,'04x')+" "+ 108 | format(args.address+args.bytes*1024,'04x')+ 109 | " 10\n", 'ascii')) 110 | ser.readline()#remove blank starting line 111 | for i in range(round(args.bytes*1024/16)): 112 | print(ser.readline().decode('ascii').rstrip()) 113 | 114 | def write_eeprom(paged): 115 | import time 116 | 117 | fi = open(args.file,'rb') 118 | fi.seek(args.offset) 119 | now = time.time() #start our stopwatch 120 | for i in range(args.bytes): #write n blocks of 1024 bytes 121 | output = fi.read(1024) 122 | print("Writing from",format(args.address+i*1024,'04x'), 123 | "to",format(args.address+i*1024+1023,'04x')) 124 | if paged: 125 | ser.write(bytes("W "+format(args.address+i*1024,'04x')+ 126 | " 0400 "+format(args.page_size,'02x')+"\n", 'ascii')) 127 | else: 128 | ser.write(bytes("w "+format(args.address+i*1024,'04x')+ 129 | " 0400 00\n", 'ascii')) 130 | 131 | ser.flushInput() 132 | ser.write(output) 133 | if(ser.read(1) != b'%'): 134 | print("Error: no Ack") 135 | sys.exit(1) 136 | print("Wrote",args.bytes*1024,"bytes in","%.2f"%(time.time()-now),"seconds") 137 | 138 | def unlock(): 139 | print("Unlocking...") 140 | ser.flushInput() 141 | ser.write(bytes("u 0000 0000 00\n", 'ascii')) 142 | if ser.read(1) != b'%': 143 | print("Error: no ack") 144 | sys.exit(1) 145 | 146 | def version(): 147 | ser.write(b'V\n') 148 | print(ser.readline().decode('ascii').rstrip()) 149 | 150 | args = parser.parse_args() 151 | #convert our hex strings to ints 152 | args.address = int(args.address,16) 153 | args.offset = int(args.offset,16) 154 | 155 | class DebugSerial(serial.Serial): 156 | def write(self, data): 157 | #print("write: %s" % (data,)) 158 | super().write(data) 159 | 160 | SERIAL_TIMEOUT = 20 #seconds 161 | try: 162 | ser = DebugSerial(args.com, args.speed, timeout=SERIAL_TIMEOUT) 163 | except serial.serialutil.SerialException: 164 | print("Error: Serial port is not valid, please select a valid port") 165 | sys.exit(1) 166 | 167 | # It seems necessary to wait >= ~1.8 seconds for the device to respond. 168 | import time 169 | time.sleep(2) 170 | 171 | if args.cmd == 'version': 172 | version() 173 | elif args.cmd == 'write': 174 | write_eeprom(False) 175 | elif args.cmd == 'write_paged': 176 | write_eeprom(True) 177 | elif args.cmd == 'read': 178 | read_eeprom() 179 | elif args.cmd == 'dump': 180 | dump_file() 181 | elif args.cmd == 'verify': 182 | verify() 183 | elif args.cmd == 'unlock': 184 | unlock(); 185 | elif args.cmd == 'list': 186 | list_ports() 187 | 188 | ser.close() 189 | sys.exit(0) 190 | --------------------------------------------------------------------------------