aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--asm/bootstrap.atk1669
-rw-r--r--asm/text_mode.atk1617
-rw-r--r--digital/atk16.dig371
-rw-r--r--digital/atk16_graphics_mode.dig311
-rw-r--r--digital/atk16_mem.dig6
-rw-r--r--digital/atk16_ppu.dig253
-rw-r--r--src/asm_ops.py4
-rw-r--r--src/asm_pass3.py19
8 files changed, 872 insertions, 178 deletions
diff --git a/asm/bootstrap.atk16 b/asm/bootstrap.atk16
index 813ebb5..2aa5d88 100644
--- a/asm/bootstrap.atk16
+++ b/asm/bootstrap.atk16
@@ -1,42 +1,65 @@
-@let stack_segment 0x8000
-@let vector_table 0x10
-@let mmio_segment 0xE000
-@let terminal_addr 0xE000
-@let keyboard_addr 0xE001
-@let sprite_mem 0xE800
+; vector table fields
+@let vector_table 0x10
+@let vt_ISRO 0x10 ; ISR0
+@let vt_ISR1 0x11 ; ISR1
+@let vt_ISR2 0x12 ; ISR2
+@let vt_ISR3 0x13 ; ISR3
+@let vt_stack_addr 0x14 ; Stack address
+@let vt_term_pp_addr 0x15 ; Terminal peripheral address
+@let vt_kb_pp_addr 0x16 ; Keyboard peripheral address
+@let vt_gr_mode_addr 0x17 ; Graphics mode setting address
+
+; memory segments
+@let stack_segment 0x8000
+@let mmio_segment 0xE000
+@let terminal_addr 0xE000
+@let keyboard_addr 0xE001
+@let gr_mode_addr 0xE002
+@let sprite_mem 0xE800
+
+; graphics mode settings
+@let gr_disabled_mode 0b00
+@let gr_text_mode 0b01
+@let gr_sprite_mode 0b10
@address vector_table
- keyboard_isr ; 0x10 ISR0
- hlt_isr ; 0x11 ISR1
- hlt_isr ; 0x12 ISR2
- hlt_isr ; 0x13 ISR3
- stack_segment ; 0x14 Stack address
- 0x0 ; 0x15 <unused>
- terminal_addr ; 0x16 Terminal peripheral address
- keyboard_addr ; 0x17 Keyboard peripheral address
+ keyboard_isr ; 0x10
+ hlt_isr ; 0x11
+ hlt_isr ; 0x12
+ hlt_isr ; 0x13
+ stack_segment ; 0x14
+ terminal_addr ; 0x15
+ keyboard_addr ; 0x16
+ gr_mode_addr ; 0x17
@label hlt_isr
ldi 0x55 RE
hlt
@label keyboard_isr
- spu RA ; use RA, RB
+ spu RA ; use RA, RB
spu RB
- ldi 0x17 RA ; RA := 0x17 Keyboard peripheral address pointer
- ldr RA RA ; RA := 0xE001 Keyboard peripheral address deref
- ldr RA RA ; RA := <16-bit keyboard character code> from MMIO register
- ldi 0x16 RB ; RB := 0x16 Terminal peripheral address pointer
- ldr RB RB ; RB := 0xE000 Terminal peripheral address deref
- str RA RB ; terminal <- character code
- spo RB ; restore RA, RB
+ ldi vt_kb_pp_addr RA ; RA := 0x17 Keyboard peripheral address pointer
+ ldr RA RA ; RA := 0xE001 Keyboard peripheral address deref
+ ldr RA RA ; RA := <16-bit keyboard character code> from MMIO register
+ ldi vt_term_pp_addr RB ; RB := 0x16 Terminal peripheral address pointer
+ ldr RB RB ; RB := 0xE000 Terminal peripheral address deref
+ str RA RB ; terminal <- character code
+ spo RB ; restore RA, RB
spo RA
rti
@label program_segment
@address 0x0
; set up stack pointer to point to beginning of stack segment
- ldi 0x14 RA
+ ldi vt_stack_addr RA
ldr RA RF
+; set graphics mode to disabled
+ ldi vt_gr_mode_addr RA
+ ldr RA RA
+ ldi gr_disabled_mode RB
+ str RB RA
+; jump to main (user defined)
jpi main
@address program_segment
diff --git a/asm/text_mode.atk16 b/asm/text_mode.atk16
new file mode 100644
index 0000000..05b4fd3
--- /dev/null
+++ b/asm/text_mode.atk16
@@ -0,0 +1,17 @@
+@opt stack_pointer RF
+@opt csr_scratch RH
+@use ext_std:*
+
+; bootstrap code (must be called to setup mandatory data)
+; will jump to label main
+@include bootstrap
+
+@label main
+ ; set graphics mode to gr_text_mode
+ ldi vt_gr_mode_addr RA
+ ldr RA RA
+ ldi gr_text_mode RB
+ str RB RA
+
+@label loop
+ jpi loop
diff --git a/digital/atk16.dig b/digital/atk16.dig
index 1b9dcc5..323ef10 100644
--- a/digital/atk16.dig
+++ b/digital/atk16.dig
@@ -1224,11 +1224,6 @@
<pos x="760" y="200"/>
</visualElement>
<visualElement>
- <elementName>Break</elementName>
- <elementAttributes/>
- <pos x="860" y="260"/>
- </visualElement>
- <visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
@@ -1268,11 +1263,6 @@
<pos x="640" y="220"/>
</visualElement>
<visualElement>
- <elementName>atk16_ppu.dig</elementName>
- <elementAttributes/>
- <pos x="700" y="320"/>
- </visualElement>
- <visualElement>
<elementName>Tunnel</elementName>
<elementAttributes>
<entry>
@@ -1404,10 +1394,120 @@
</entry>
<entry>
<string>NetName</string>
+ <string>MMIO_IE</string>
+ </entry>
+ </elementAttributes>
+ <pos x="920" y="-40"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation reference="../../../../visualElement[26]/elementAttributes/entry/rotation"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
<string>CLK</string>
</entry>
</elementAttributes>
- <pos x="700" y="340"/>
+ <pos x="940" y="-20"/>
+ </visualElement>
+ <visualElement>
+ <elementName>atk16_graphics_mode.dig</elementName>
+ <elementAttributes/>
+ <pos x="960" y="-100"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>MMIO_S</string>
+ </entry>
+ </elementAttributes>
+ <pos x="940" y="-80"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>NetName</string>
+ <string>PCLK</string>
+ </entry>
+ </elementAttributes>
+ <pos x="700" y="280"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Probe</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>GRAPHICS MODE</string>
+ </entry>
+ </elementAttributes>
+ <pos x="1080" y="-100"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>NetName</string>
+ <string>GRMODE</string>
+ </entry>
+ </elementAttributes>
+ <pos x="1120" y="-60"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Multiplexer</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Selector Bits</string>
+ <int>2</int>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>8</int>
+ </entry>
+ </elementAttributes>
+ <pos x="980" y="460"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>GRMODE</string>
+ </entry>
+ </elementAttributes>
+ <pos x="980" y="580"/>
+ </visualElement>
+ <visualElement>
+ <elementName>atk16_ppu.dig</elementName>
+ <elementAttributes/>
+ <pos x="680" y="500"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>CLK</string>
+ </entry>
+ </elementAttributes>
+ <pos x="680" y="520"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -1421,7 +1521,7 @@
<string>MMIO_IE</string>
</entry>
</elementAttributes>
- <pos x="680" y="360"/>
+ <pos x="660" y="540"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -1435,7 +1535,7 @@
<string>MMIO_S</string>
</entry>
</elementAttributes>
- <pos x="680" y="420"/>
+ <pos x="660" y="600"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -1449,7 +1549,7 @@
<string>MMIO_OE</string>
</entry>
</elementAttributes>
- <pos x="680" y="380"/>
+ <pos x="660" y="560"/>
</visualElement>
<visualElement>
<elementName>Tunnel</elementName>
@@ -1463,7 +1563,78 @@
<string>DBUS</string>
</entry>
</elementAttributes>
- <pos x="680" y="400"/>
+ <pos x="660" y="580"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Splitter</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Input Splitting</string>
+ <string>2,2,2,1,1</string>
+ </entry>
+ </elementAttributes>
+ <pos x="840" y="500"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>PCLK</string>
+ </entry>
+ </elementAttributes>
+ <pos x="660" y="500"/>
+ </visualElement>
+ <visualElement>
+ <elementName>VGA</elementName>
+ <elementAttributes/>
+ <pos x="1100" y="500"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>PCLK</string>
+ </entry>
+ </elementAttributes>
+ <pos x="1080" y="600"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Splitter</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Input Splitting</string>
+ <string>8</string>
+ </entry>
+ <entry>
+ <string>Output Splitting</string>
+ <string>2,2,2,1,1</string>
+ </entry>
+ </elementAttributes>
+ <pos x="1060" y="500"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Const</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Value</string>
+ <long>0</long>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>8</int>
+ </entry>
+ </elementAttributes>
+ <pos x="940" y="460"/>
</visualElement>
</visualElements>
<wires>
@@ -1500,10 +1671,6 @@
<p2 x="-160" y="320"/>
</wire>
<wire>
- <p1 x="680" y="320"/>
- <p2 x="700" y="320"/>
- </wire>
- <wire>
<p1 x="260" y="320"/>
<p2 x="280" y="320"/>
</wire>
@@ -1528,14 +1695,26 @@
<p2 x="80" y="260"/>
</wire>
<wire>
- <p1 x="840" y="260"/>
- <p2 x="860" y="260"/>
- </wire>
- <wire>
<p1 x="260" y="260"/>
<p2 x="280" y="260"/>
</wire>
<wire>
+ <p1 x="980" y="580"/>
+ <p2 x="1000" y="580"/>
+ </wire>
+ <wire>
+ <p1 x="660" y="580"/>
+ <p2 x="680" y="580"/>
+ </wire>
+ <wire>
+ <p1 x="820" y="580"/>
+ <p2 x="840" y="580"/>
+ </wire>
+ <wire>
+ <p1 x="1080" y="580"/>
+ <p2 x="1100" y="580"/>
+ </wire>
+ <wire>
<p1 x="380" y="-200"/>
<p2 x="400" y="-200"/>
</wire>
@@ -1560,6 +1739,18 @@
<p2 x="440" y="520"/>
</wire>
<wire>
+ <p1 x="820" y="520"/>
+ <p2 x="840" y="520"/>
+ </wire>
+ <wire>
+ <p1 x="1080" y="520"/>
+ <p2 x="1100" y="520"/>
+ </wire>
+ <wire>
+ <p1 x="960" y="520"/>
+ <p2 x="980" y="520"/>
+ </wire>
+ <wire>
<p1 x="-160" y="200"/>
<p2 x="-140" y="200"/>
</wire>
@@ -1616,6 +1807,14 @@
<p2 x="440" y="460"/>
</wire>
<wire>
+ <p1 x="940" y="460"/>
+ <p2 x="960" y="460"/>
+ </wire>
+ <wire>
+ <p1 x="960" y="460"/>
+ <p2 x="980" y="460"/>
+ </wire>
+ <wire>
<p1 x="-420" y="-80"/>
<p2 x="-280" y="-80"/>
</wire>
@@ -1648,6 +1847,10 @@
<p2 x="-460" y="-80"/>
</wire>
<wire>
+ <p1 x="940" y="-80"/>
+ <p2 x="960" y="-80"/>
+ </wire>
+ <wire>
<p1 x="-280" y="-80"/>
<p2 x="-260" y="-80"/>
</wire>
@@ -1660,10 +1863,6 @@
<p2 x="-160" y="400"/>
</wire>
<wire>
- <p1 x="680" y="400"/>
- <p2 x="700" y="400"/>
- </wire>
- <wire>
<p1 x="-140" y="80"/>
<p2 x="200" y="80"/>
</wire>
@@ -1688,6 +1887,10 @@
<p2 x="700" y="-20"/>
</wire>
<wire>
+ <p1 x="940" y="-20"/>
+ <p2 x="960" y="-20"/>
+ </wire>
+ <wire>
<p1 x="320" y="-20"/>
<p2 x="360" y="-20"/>
</wire>
@@ -1732,6 +1935,18 @@
<p2 x="360" y="280"/>
</wire>
<wire>
+ <p1 x="680" y="280"/>
+ <p2 x="700" y="280"/>
+ </wire>
+ <wire>
+ <p1 x="660" y="600"/>
+ <p2 x="680" y="600"/>
+ </wire>
+ <wire>
+ <p1 x="1080" y="600"/>
+ <p2 x="1100" y="600"/>
+ </wire>
+ <wire>
<p1 x="-240" y="-220"/>
<p2 x="-220" y="-220"/>
</wire>
@@ -1764,6 +1979,18 @@
<p2 x="440" y="540"/>
</wire>
<wire>
+ <p1 x="660" y="540"/>
+ <p2 x="680" y="540"/>
+ </wire>
+ <wire>
+ <p1 x="820" y="540"/>
+ <p2 x="840" y="540"/>
+ </wire>
+ <wire>
+ <p1 x="1080" y="540"/>
+ <p2 x="1100" y="540"/>
+ </wire>
+ <wire>
<p1 x="-160" y="220"/>
<p2 x="-140" y="220"/>
</wire>
@@ -1785,10 +2012,6 @@
</wire>
<wire>
<p1 x="820" y="220"/>
- <p2 x="840" y="220"/>
- </wire>
- <wire>
- <p1 x="840" y="220"/>
<p2 x="860" y="220"/>
</wire>
<wire>
@@ -1808,6 +2031,10 @@
<p2 x="440" y="480"/>
</wire>
<wire>
+ <p1 x="960" y="480"/>
+ <p2 x="980" y="480"/>
+ </wire>
+ <wire>
<p1 x="20" y="-100"/>
<p2 x="60" y="-100"/>
</wire>
@@ -1844,6 +2071,10 @@
<p2 x="220" y="-100"/>
</wire>
<wire>
+ <p1 x="680" y="-100"/>
+ <p2 x="960" y="-100"/>
+ </wire>
+ <wire>
<p1 x="420" y="420"/>
<p2 x="440" y="420"/>
</wire>
@@ -1852,10 +2083,6 @@
<p2 x="-160" y="420"/>
</wire>
<wire>
- <p1 x="680" y="420"/>
- <p2 x="700" y="420"/>
- </wire>
- <wire>
<p1 x="40" y="-40"/>
<p2 x="60" y="-40"/>
</wire>
@@ -1880,6 +2107,10 @@
<p2 x="680" y="-40"/>
</wire>
<wire>
+ <p1 x="920" y="-40"/>
+ <p2 x="960" y="-40"/>
+ </wire>
+ <wire>
<p1 x="420" y="360"/>
<p2 x="440" y="360"/>
</wire>
@@ -1888,10 +2119,6 @@
<p2 x="-160" y="360"/>
</wire>
<wire>
- <p1 x="680" y="360"/>
- <p2 x="700" y="360"/>
- </wire>
- <wire>
<p1 x="420" y="300"/>
<p2 x="440" y="300"/>
</wire>
@@ -1936,6 +2163,18 @@
<p2 x="400" y="560"/>
</wire>
<wire>
+ <p1 x="660" y="560"/>
+ <p2 x="680" y="560"/>
+ </wire>
+ <wire>
+ <p1 x="820" y="560"/>
+ <p2 x="840" y="560"/>
+ </wire>
+ <wire>
+ <p1 x="1080" y="560"/>
+ <p2 x="1100" y="560"/>
+ </wire>
+ <wire>
<p1 x="-60" y="240"/>
<p2 x="-20" y="240"/>
</wire>
@@ -1996,6 +2235,26 @@
<p2 x="440" y="500"/>
</wire>
<wire>
+ <p1 x="660" y="500"/>
+ <p2 x="680" y="500"/>
+ </wire>
+ <wire>
+ <p1 x="820" y="500"/>
+ <p2 x="840" y="500"/>
+ </wire>
+ <wire>
+ <p1 x="1080" y="500"/>
+ <p2 x="1100" y="500"/>
+ </wire>
+ <wire>
+ <p1 x="1020" y="500"/>
+ <p2 x="1060" y="500"/>
+ </wire>
+ <wire>
+ <p1 x="860" y="500"/>
+ <p2 x="980" y="500"/>
+ </wire>
+ <wire>
<p1 x="220" y="-440"/>
<p2 x="240" y="-440"/>
</wire>
@@ -2016,6 +2275,14 @@
<p2 x="-420" y="-60"/>
</wire>
<wire>
+ <p1 x="1060" y="-60"/>
+ <p2 x="1080" y="-60"/>
+ </wire>
+ <wire>
+ <p1 x="1080" y="-60"/>
+ <p2 x="1120" y="-60"/>
+ </wire>
+ <wire>
<p1 x="-100" y="-60"/>
<p2 x="60" y="-60"/>
</wire>
@@ -2040,10 +2307,6 @@
<p2 x="-160" y="380"/>
</wire>
<wire>
- <p1 x="680" y="380"/>
- <p2 x="700" y="380"/>
- </wire>
- <wire>
<p1 x="180" y="-320"/>
<p2 x="240" y="-320"/>
</wire>
@@ -2060,6 +2323,14 @@
<p2 x="0" y="320"/>
</wire>
<wire>
+ <p1 x="960" y="460"/>
+ <p2 x="960" y="480"/>
+ </wire>
+ <wire>
+ <p1 x="960" y="480"/>
+ <p2 x="960" y="520"/>
+ </wire>
+ <wire>
<p1 x="-580" y="-140"/>
<p2 x="-580" y="-100"/>
</wire>
@@ -2076,10 +2347,6 @@
<p2 x="200" y="80"/>
</wire>
<wire>
- <p1 x="840" y="220"/>
- <p2 x="840" y="260"/>
- </wire>
- <wire>
<p1 x="-140" y="-40"/>
<p2 x="-140" y="80"/>
</wire>
@@ -2173,13 +2440,17 @@
</wire>
<wire>
<p1 x="680" y="220"/>
- <p2 x="680" y="320"/>
+ <p2 x="680" y="280"/>
</wire>
<wire>
<p1 x="360" y="280"/>
<p2 x="360" y="560"/>
</wire>
<wire>
+ <p1 x="1000" y="540"/>
+ <p2 x="1000" y="580"/>
+ </wire>
+ <wire>
<p1 x="300" y="-240"/>
<p2 x="300" y="-140"/>
</wire>
@@ -2204,6 +2475,10 @@
<p2 x="180" y="-240"/>
</wire>
<wire>
+ <p1 x="1080" y="-100"/>
+ <p2 x="1080" y="-60"/>
+ </wire>
+ <wire>
<p1 x="-60" y="180"/>
<p2 x="-60" y="240"/>
</wire>
diff --git a/digital/atk16_graphics_mode.dig b/digital/atk16_graphics_mode.dig
new file mode 100644
index 0000000..2d05dd6
--- /dev/null
+++ b/digital/atk16_graphics_mode.dig
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="utf-8"?>
+<circuit>
+ <version>2</version>
+ <attributes>
+ <entry>
+ <string>romContent</string>
+ <romList>
+ <roms/>
+ </romList>
+ </entry>
+ <entry>
+ <string>Width</string>
+ <int>5</int>
+ </entry>
+ </attributes>
+ <visualElements>
+ <visualElement>
+ <elementName>In</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>DBUS</string>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>16</int>
+ </entry>
+ </elementAttributes>
+ <pos x="220" y="160"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Out</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Description</string>
+ <string>00 disabled
+01 text mode
+10 sprite mode
+11 undefined</string>
+ </entry>
+ <entry>
+ <string>Label</string>
+ <string>MODE</string>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>2</int>
+ </entry>
+ </elementAttributes>
+ <pos x="700" y="160"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Register</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>GRAPHICS MODE</string>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>2</int>
+ </entry>
+ </elementAttributes>
+ <pos x="480" y="160"/>
+ </visualElement>
+ <visualElement>
+ <elementName>And</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Inputs</string>
+ <int>13</int>
+ </entry>
+ </elementAttributes>
+ <pos x="440" y="260"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Splitter</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Input Splitting</string>
+ <string>13</string>
+ </entry>
+ <entry>
+ <string>Output Splitting</string>
+ <string>1*13</string>
+ </entry>
+ </elementAttributes>
+ <pos x="400" y="260"/>
+ </visualElement>
+ <visualElement>
+ <elementName>And</elementName>
+ <elementAttributes/>
+ <pos x="560" y="380"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Splitter</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Input Splitting</string>
+ <string>16</string>
+ </entry>
+ <entry>
+ <string>Output Splitting</string>
+ <string>2,14</string>
+ </entry>
+ </elementAttributes>
+ <pos x="360" y="160"/>
+ </visualElement>
+ <visualElement>
+ <elementName>In</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>MMIO_S</string>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>13</int>
+ </entry>
+ </elementAttributes>
+ <pos x="220" y="280"/>
+ </visualElement>
+ <visualElement>
+ <elementName>In</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>MMIO_IE</string>
+ </entry>
+ </elementAttributes>
+ <pos x="220" y="560"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Const</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Value</string>
+ <long>2</long>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>13</int>
+ </entry>
+ </elementAttributes>
+ <pos x="260" y="320"/>
+ </visualElement>
+ <visualElement>
+ <elementName>XNOr</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Bits</string>
+ <int>13</int>
+ </entry>
+ </elementAttributes>
+ <pos x="280" y="280"/>
+ </visualElement>
+ <visualElement>
+ <elementName>In</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>CLK</string>
+ </entry>
+ </elementAttributes>
+ <pos x="220" y="220"/>
+ </visualElement>
+ </visualElements>
+ <wires>
+ <wire>
+ <p1 x="380" y="160"/>
+ <p2 x="480" y="160"/>
+ </wire>
+ <wire>
+ <p1 x="220" y="160"/>
+ <p2 x="360" y="160"/>
+ </wire>
+ <wire>
+ <p1 x="620" y="160"/>
+ <p2 x="700" y="160"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="320"/>
+ <p2 x="440" y="320"/>
+ </wire>
+ <wire>
+ <p1 x="260" y="320"/>
+ <p2 x="280" y="320"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="480"/>
+ <p2 x="440" y="480"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="260"/>
+ <p2 x="440" y="260"/>
+ </wire>
+ <wire>
+ <p1 x="460" y="260"/>
+ <p2 x="640" y="260"/>
+ </wire>
+ <wire>
+ <p1 x="380" y="260"/>
+ <p2 x="400" y="260"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="420"/>
+ <p2 x="440" y="420"/>
+ </wire>
+ <wire>
+ <p1 x="540" y="420"/>
+ <p2 x="560" y="420"/>
+ </wire>
+ <wire>
+ <p1 x="460" y="200"/>
+ <p2 x="480" y="200"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="360"/>
+ <p2 x="440" y="360"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="460"/>
+ <p2 x="440" y="460"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="300"/>
+ <p2 x="440" y="300"/>
+ </wire>
+ <wire>
+ <p1 x="360" y="300"/>
+ <p2 x="380" y="300"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="400"/>
+ <p2 x="440" y="400"/>
+ </wire>
+ <wire>
+ <p1 x="620" y="400"/>
+ <p2 x="640" y="400"/>
+ </wire>
+ <wire>
+ <p1 x="220" y="560"/>
+ <p2 x="540" y="560"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="500"/>
+ <p2 x="440" y="500"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="340"/>
+ <p2 x="440" y="340"/>
+ </wire>
+ <wire>
+ <p1 x="540" y="180"/>
+ <p2 x="620" y="180"/>
+ </wire>
+ <wire>
+ <p1 x="440" y="180"/>
+ <p2 x="480" y="180"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="440"/>
+ <p2 x="440" y="440"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="280"/>
+ <p2 x="440" y="280"/>
+ </wire>
+ <wire>
+ <p1 x="220" y="280"/>
+ <p2 x="280" y="280"/>
+ </wire>
+ <wire>
+ <p1 x="420" y="380"/>
+ <p2 x="440" y="380"/>
+ </wire>
+ <wire>
+ <p1 x="500" y="380"/>
+ <p2 x="560" y="380"/>
+ </wire>
+ <wire>
+ <p1 x="220" y="220"/>
+ <p2 x="440" y="220"/>
+ </wire>
+ <wire>
+ <p1 x="640" y="260"/>
+ <p2 x="640" y="400"/>
+ </wire>
+ <wire>
+ <p1 x="440" y="180"/>
+ <p2 x="440" y="220"/>
+ </wire>
+ <wire>
+ <p1 x="460" y="200"/>
+ <p2 x="460" y="260"/>
+ </wire>
+ <wire>
+ <p1 x="380" y="260"/>
+ <p2 x="380" y="300"/>
+ </wire>
+ <wire>
+ <p1 x="620" y="160"/>
+ <p2 x="620" y="180"/>
+ </wire>
+ <wire>
+ <p1 x="540" y="420"/>
+ <p2 x="540" y="560"/>
+ </wire>
+ </wires>
+ <measurementOrdering/>
+</circuit> \ No newline at end of file
diff --git a/digital/atk16_mem.dig b/digital/atk16_mem.dig
index a3d8b5e..4c1db35 100644
--- a/digital/atk16_mem.dig
+++ b/digital/atk16_mem.dig
@@ -35,9 +35,9 @@
</entry>
<entry>
<string>Data</string>
- <data>4014,2a00,6026,13*8000,1a,18,18,18,8000,0,e000,e001,4855,f000
-,3140,1b48,3148,1b48,4017,2000,2000,4216,2240,3040,1b49,2340,1b49
-,2140,e000,61ff</data>
+ <data>4014,2a00,4017,2000,4200,3008,6022,9*8000,1a,18,18,18,8000,e000
+,e001,e002,4855,f000,3140,1b48,3148,1b48,4016,2000,2000,4215,2240
+,3040,1b49,2340,1b49,2140,e000,4017,2000,4201,3008,61ff</data>
</entry>
</elementAttributes>
<pos x="740" y="100"/>
diff --git a/digital/atk16_ppu.dig b/digital/atk16_ppu.dig
index d9064dd..c2cbdba 100644
--- a/digital/atk16_ppu.dig
+++ b/digital/atk16_ppu.dig
@@ -554,95 +554,6 @@ sprite mem, starting from 0x0800</string>
<pos x="640" y="340"/>
</visualElement>
<visualElement>
- <elementName>VGA</elementName>
- <elementAttributes/>
- <pos x="-100" y="540"/>
- </visualElement>
- <visualElement>
- <elementName>Tunnel</elementName>
- <elementAttributes>
- <entry>
- <string>rotation</string>
- <rotation rotation="2"/>
- </entry>
- <entry>
- <string>NetName</string>
- <string>PCLK</string>
- </entry>
- </elementAttributes>
- <pos x="-120" y="640"/>
- </visualElement>
- <visualElement>
- <elementName>Tunnel</elementName>
- <elementAttributes>
- <entry>
- <string>rotation</string>
- <rotation rotation="2"/>
- </entry>
- <entry>
- <string>NetName</string>
- <string>HSYNC</string>
- </entry>
- </elementAttributes>
- <pos x="-100" y="600"/>
- </visualElement>
- <visualElement>
- <elementName>Tunnel</elementName>
- <elementAttributes>
- <entry>
- <string>rotation</string>
- <rotation rotation="2"/>
- </entry>
- <entry>
- <string>NetName</string>
- <string>VSYNC</string>
- </entry>
- </elementAttributes>
- <pos x="-100" y="620"/>
- </visualElement>
- <visualElement>
- <elementName>Tunnel</elementName>
- <elementAttributes>
- <entry>
- <string>rotation</string>
- <rotation rotation="2"/>
- </entry>
- <entry>
- <string>NetName</string>
- <string>PR</string>
- </entry>
- </elementAttributes>
- <pos x="-120" y="540"/>
- </visualElement>
- <visualElement>
- <elementName>Tunnel</elementName>
- <elementAttributes>
- <entry>
- <string>rotation</string>
- <rotation rotation="2"/>
- </entry>
- <entry>
- <string>NetName</string>
- <string>PG</string>
- </entry>
- </elementAttributes>
- <pos x="-120" y="560"/>
- </visualElement>
- <visualElement>
- <elementName>Tunnel</elementName>
- <elementAttributes>
- <entry>
- <string>rotation</string>
- <rotation rotation="2"/>
- </entry>
- <entry>
- <string>NetName</string>
- <string>PB</string>
- </entry>
- </elementAttributes>
- <pos x="-120" y="580"/>
- </visualElement>
- <visualElement>
<elementName>Const</elementName>
<elementAttributes>
<entry>
@@ -991,6 +902,142 @@ sprite mem, starting from 0x0800</string>
</elementAttributes>
<pos x="160" y="-40"/>
</visualElement>
+ <visualElement>
+ <elementName>Out</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>PR</string>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>2</int>
+ </entry>
+ </elementAttributes>
+ <pos x="600" y="-260"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Out</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>PG</string>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>2</int>
+ </entry>
+ </elementAttributes>
+ <pos x="600" y="-220"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Out</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>PB</string>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>2</int>
+ </entry>
+ </elementAttributes>
+ <pos x="600" y="-180"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Out</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>HSYNC</string>
+ </entry>
+ </elementAttributes>
+ <pos x="600" y="-140"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Out</elementName>
+ <elementAttributes>
+ <entry>
+ <string>Label</string>
+ <string>VSYNC</string>
+ </entry>
+ <entry>
+ <string>Bits</string>
+ <int>2</int>
+ </entry>
+ </elementAttributes>
+ <pos x="600" y="-100"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>PB</string>
+ </entry>
+ </elementAttributes>
+ <pos x="580" y="-180"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>PR</string>
+ </entry>
+ </elementAttributes>
+ <pos x="580" y="-260"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>PG</string>
+ </entry>
+ </elementAttributes>
+ <pos x="580" y="-220"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>HSYNC</string>
+ </entry>
+ </elementAttributes>
+ <pos x="580" y="-140"/>
+ </visualElement>
+ <visualElement>
+ <elementName>Tunnel</elementName>
+ <elementAttributes>
+ <entry>
+ <string>rotation</string>
+ <rotation rotation="2"/>
+ </entry>
+ <entry>
+ <string>NetName</string>
+ <string>VSYNC</string>
+ </entry>
+ </elementAttributes>
+ <pos x="580" y="-100"/>
+ </visualElement>
</visualElements>
<wires>
<wire>
@@ -1026,12 +1073,8 @@ sprite mem, starting from 0x0800</string>
<p2 x="540" y="320"/>
</wire>
<wire>
- <p1 x="-120" y="640"/>
- <p2 x="-100" y="640"/>
- </wire>
- <wire>
- <p1 x="-120" y="580"/>
- <p2 x="-100" y="580"/>
+ <p1 x="580" y="-260"/>
+ <p2 x="600" y="-260"/>
</wire>
<wire>
<p1 x="200" y="-200"/>
@@ -1058,6 +1101,10 @@ sprite mem, starting from 0x0800</string>
<p2 x="80" y="-140"/>
</wire>
<wire>
+ <p1 x="580" y="-140"/>
+ <p2 x="600" y="-140"/>
+ </wire>
+ <wire>
<p1 x="160" y="-140"/>
<p2 x="180" y="-140"/>
</wire>
@@ -1134,8 +1181,8 @@ sprite mem, starting from 0x0800</string>
<p2 x="420" y="280"/>
</wire>
<wire>
- <p1 x="-120" y="540"/>
- <p2 x="-100" y="540"/>
+ <p1 x="580" y="-220"/>
+ <p2 x="600" y="-220"/>
</wire>
<wire>
<p1 x="200" y="-160"/>
@@ -1178,6 +1225,10 @@ sprite mem, starting from 0x0800</string>
<p2 x="-60" y="-100"/>
</wire>
<wire>
+ <p1 x="580" y="-100"/>
+ <p2 x="600" y="-100"/>
+ </wire>
+ <wire>
<p1 x="600" y="100"/>
<p2 x="620" y="100"/>
</wire>
@@ -1242,10 +1293,6 @@ sprite mem, starting from 0x0800</string>
<p2 x="340" y="300"/>
</wire>
<wire>
- <p1 x="-120" y="560"/>
- <p2 x="-100" y="560"/>
- </wire>
- <wire>
<p1 x="60" y="-180"/>
<p2 x="80" y="-180"/>
</wire>
@@ -1254,6 +1301,10 @@ sprite mem, starting from 0x0800</string>
<p2 x="260" y="-180"/>
</wire>
<wire>
+ <p1 x="580" y="-180"/>
+ <p2 x="600" y="-180"/>
+ </wire>
+ <wire>
<p1 x="520" y="180"/>
<p2 x="540" y="180"/>
</wire>
diff --git a/src/asm_ops.py b/src/asm_ops.py
index 78ec356..a2631e3 100644
--- a/src/asm_ops.py
+++ b/src/asm_ops.py
@@ -76,8 +76,8 @@ def make_jpi(meta: Meta, symbols: Symbols, imm: str) -> int:
imm_e = eval_expr(symbols, imm, bits=9)
imm_e = imm_e - meta.address - 1
imm_e = imm_e & (0b111111111)
- print("symbols:", symbols)
- print(meta, imm, f"0x{imm_e:>0x}")
+ #print("symbols:", symbols)
+ #print(meta, imm, f"0x{imm_e:>0x}")
word = (0b0110 << 12) + \
imm_e
return word
diff --git a/src/asm_pass3.py b/src/asm_pass3.py
index 5221f6d..edfd79f 100644
--- a/src/asm_pass3.py
+++ b/src/asm_pass3.py
@@ -50,7 +50,7 @@ def pass_3(result2: Result2) -> Result3:
rows_with_same_addr = list(filter(lambda l: l.address == result_line.address, result_lines))
n = len(rows_with_same_addr)
if n > 1:
- formatted = "\n".join(map(lambda l: " ".join(l.parts), rows_with_same_addr))
+ formatted = format_overlapping_rows(rows_with_same_addr)
raise Exception(f"Overlapping segments: address 0x{result_line.address:>04x} has conflicting definitions:\n{formatted}")
return Result3(
operations=result2.operations,
@@ -58,3 +58,20 @@ def pass_3(result2: Result2) -> Result3:
lines=result_lines,
symbols=symbols,
)
+
+def format_overlapping_rows(rows: list[Result3Line]) -> str:
+ longest_val = 0
+ for row in rows:
+ joined = " ".join(row.parts)
+ if len(joined) > longest_val:
+ longest_val = len(joined)
+
+ first_col_width = longest_val + 4
+
+ results: list[str] = []
+ for row in rows:
+ joined = " ".join(row.parts)
+ result = joined + (first_col_width - len(joined)) * " " + f" ({row.src_file}:{row.line_num})"
+ results.append(result)
+
+ return "\n".join(results)