Skip to content

Commit 5b600ef

Browse files
committed
Add two more UARTs
1 parent cd79501 commit 5b600ef

File tree

5 files changed

+159
-136
lines changed

5 files changed

+159
-136
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ The main CPU code is generated from `src/main.mlog.jinja` using a custom Jinja-b
3030
| `0xf000000c` | `0x4` | R/W | `mtimecmph` |
3131
| `0xf0000010` | `0x20` | R/W | UART0 |
3232
| `0xf0000030` | `0x20` | R/W | UART1 |
33+
| `0xf0000050` | `0x20` | R/W | UART2 |
34+
| `0xf0000070` | `0x20` | R/W | UART3 |
3335
| `0xfffffff0` | `0x4` | W | Syscon |
3436

3537
\* Atomic instructions are only supported in RAM.
@@ -40,7 +42,7 @@ Addresses `0xf0000000` - `0xffffffff` are reserved for system purposes such as M
4042

4143
### UART
4244

43-
Addresses `0xf0000010` and `0xf0000030` contain emulated UART 16550 peripherals based on [this datasheet](https://caro.su/msx/ocm_de1/16550.pdf). The UARTs support the following features:
45+
The processor includes four identical emulated UART 16550 peripherals based on [this datasheet](https://caro.su/msx/ocm_de1/16550.pdf). The UARTs support the following features:
4446

4547
- Configurable FIFO capacity (up to 253 bytes) for TX and RX, stored as a variable in the CONFIG processor.
4648
- Theoretical maximum transfer rate of 121440 bits/sec (253 bytes/tick).

src/debugger.mlog.jinja

Lines changed: 80 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#% endmacro
99

1010
setrate 5000
11+
set MARKER_START_ID 0
1112

1213
set LOOKUP_PROC_SIZE 260
1314
set ROM_BYTE_OFFSET 174
@@ -21,6 +22,9 @@
2122
draw color 255 255 255 255
2223

2324
reset:
25+
sensor enabled switch1 @enabled
26+
jump reset equal enabled false
27+
2428
wait 0.00001
2529

2630
set CPU processor17
@@ -32,6 +36,8 @@ reset:
3236

3337
set UART0 bank1
3438
set UART1 bank2
39+
set UART2 bank3
40+
set UART3 bank4
3541

3642
# wait until everything is properly initialized
3743
jump reset strictEqual CPU null
@@ -40,6 +46,8 @@ reset:
4046
jump reset strictEqual DISPLAY null
4147
jump reset strictEqual UART0 null
4248
jump reset strictEqual UART1 null
49+
jump reset strictEqual UART2 null
50+
jump reset strictEqual UART3 null
4351

4452
set i -1
4553
reset__find_lookup_start:
@@ -99,7 +107,7 @@ loop:
99107
sensor enabled switch1 @enabled
100108
jump reset equal enabled false
101109

102-
set mark_memory_id 0
110+
set mark_memory_id MARKER_START_ID
103111

104112
read MEMORY_X CPU "MEMORY_X"
105113
read MEMORY_Y CPU "MEMORY_Y"
@@ -197,44 +205,6 @@ loop:
197205
read UART_FIFO_MODULO CPU "UART_FIFO_MODULO"
198206
op sub UART_FIFO_CAPACITY UART_FIFO_MODULO 1
199207

200-
read uart0_rx_rptr UART0 254
201-
read uart0_rx_wptr_raw UART0 255
202-
read uart0_tx_rptr UART0 510
203-
read uart0_tx_wptr UART0 511
204-
205-
op and uart0_rx_wptr uart0_rx_wptr_raw 0xff
206-
207-
op sub uart0_rx_fifo_size uart0_rx_wptr uart0_rx_rptr
208-
op add uart0_rx_fifo_size uart0_rx_fifo_size UART_FIFO_MODULO
209-
op mod uart0_rx_fifo_size uart0_rx_fifo_size UART_FIFO_MODULO
210-
211-
op sub uart0_tx_fifo_size uart0_tx_wptr uart0_tx_rptr
212-
op add uart0_tx_fifo_size uart0_tx_fifo_size UART_FIFO_MODULO
213-
op mod uart0_tx_fifo_size uart0_tx_fifo_size UART_FIFO_MODULO
214-
215-
op equal uart0_rx_full uart0_rx_fifo_size UART_FIFO_CAPACITY
216-
op notEqual uart0_rx_overflow_flag uart0_rx_wptr uart0_rx_wptr_raw
217-
op land uart0_rx_overrun uart0_rx_full uart0_rx_overflow_flag
218-
219-
read uart1_rx_rptr UART1 254
220-
read uart1_rx_wptr_raw UART1 255
221-
read uart1_tx_rptr UART1 510
222-
read uart1_tx_wptr UART1 511
223-
224-
op and uart1_rx_wptr uart1_rx_wptr_raw 0xff
225-
226-
op sub uart1_rx_fifo_size uart1_rx_wptr uart1_rx_rptr
227-
op add uart1_rx_fifo_size uart1_rx_fifo_size UART_FIFO_MODULO
228-
op mod uart1_rx_fifo_size uart1_rx_fifo_size UART_FIFO_MODULO
229-
230-
op sub uart1_tx_fifo_size uart1_tx_wptr uart1_tx_rptr
231-
op add uart1_tx_fifo_size uart1_tx_fifo_size UART_FIFO_MODULO
232-
op mod uart1_tx_fifo_size uart1_tx_fifo_size UART_FIFO_MODULO
233-
234-
op equal uart1_rx_full uart1_rx_fifo_size UART_FIFO_CAPACITY
235-
op notEqual uart1_rx_overflow_flag uart1_rx_wptr uart1_rx_wptr_raw
236-
op land uart1_rx_overrun uart1_rx_full uart1_rx_overflow_flag
237-
238208
# markers
239209

240210
print "ROM_START\n{0}"
@@ -394,6 +364,20 @@ loop__no_mark_icache:
394364
op add ret @counter 1
395365
jump format_hex always
396366

367+
print "mtimecmp = {0}\n"
368+
format mtimecmp
369+
370+
print "time = {0}\n"
371+
format time
372+
373+
print "cycle = {0}\n"
374+
format cycle
375+
376+
print "instret = {0}\n\n"
377+
format instret
378+
379+
#{{'\n'}} {{ print(0, 17) }}
380+
397381
print "mscratch = {0}\n"
398382
set n mscratch
399383
op add ret @counter 1
@@ -434,21 +418,7 @@ loop__no_mark_icache:
434418
op add ret @counter 1
435419
jump format_bin always
436420

437-
#{{'\n'}} {{ print(0, 17) }}
438-
439-
print "mtimecmp = {0}\n"
440-
format mtimecmp
441-
442-
print "time = {0}\n"
443-
format time
444-
445-
print "cycle = {0}\n"
446-
format cycle
447-
448-
print "instret = {0}\n\n"
449-
format instret
450-
451-
#{{'\n'}} {{ print(0, 34) }}
421+
#{{'\n'}} {{ print(0, 30) }}
452422

453423
# column 2
454424

@@ -560,33 +530,25 @@ loop__no_mark_icache:
560530
format "machine"
561531
done_privilege_mode:
562532

563-
print "uart0_rx_size = {0} ({1} -> {2})"
564-
jump uart0_rx_fifo_size__no_overrun notEqual uart0_rx_overrun true
565-
print " !!"
566-
uart0_rx_fifo_size__no_overrun:
567-
format uart0_rx_fifo_size
568-
format uart0_rx_rptr
569-
format uart0_rx_wptr
570-
print "\n"
533+
set uart UART0
534+
set uart_index 0
535+
op add ret @counter 1
536+
jump format_uart always
571537

572-
print "uart0_tx_size = {0} ({1} -> {2})\n\n"
573-
format uart0_tx_fifo_size
574-
format uart0_tx_rptr
575-
format uart0_tx_wptr
538+
set uart UART1
539+
set uart_index 1
540+
op add ret @counter 1
541+
jump format_uart always
576542

577-
print "uart1_rx_size = {0} ({1} -> {2})"
578-
jump uart1_rx_fifo_size__no_overrun notEqual uart1_rx_overrun true
579-
print " !!"
580-
uart1_rx_fifo_size__no_overrun:
581-
format uart1_rx_fifo_size
582-
format uart1_rx_rptr
583-
format uart1_rx_wptr
584-
print "\n"
543+
set uart UART2
544+
set uart_index 2
545+
op add ret @counter 1
546+
jump format_uart always
585547

586-
print "uart1_tx_size = {0} ({1} -> {2})\n"
587-
format uart1_tx_fifo_size
588-
format uart1_tx_rptr
589-
format uart1_tx_wptr
548+
set uart UART3
549+
set uart_index 3
550+
op add ret @counter 1
551+
jump format_uart always
590552

591553
#{{'\n'}} {{ print(35, 17) }}
592554

@@ -753,6 +715,45 @@ format_null:
753715
format "null"
754716
set @counter ret
755717

718+
# uart, uart_index ->
719+
format_uart:
720+
read rx_rptr uart 254
721+
read rx_wptr_raw uart 255
722+
read tx_rptr uart 510
723+
read tx_wptr uart 511
724+
725+
op and rx_wptr rx_wptr_raw 0xff
726+
727+
op sub rx_fifo_size rx_wptr rx_rptr
728+
op add rx_fifo_size rx_fifo_size UART_FIFO_MODULO
729+
op mod rx_fifo_size rx_fifo_size UART_FIFO_MODULO
730+
731+
op sub tx_fifo_size tx_wptr tx_rptr
732+
op add tx_fifo_size tx_fifo_size UART_FIFO_MODULO
733+
op mod tx_fifo_size tx_fifo_size UART_FIFO_MODULO
734+
735+
op equal rx_full rx_fifo_size UART_FIFO_CAPACITY
736+
op notEqual rx_overflow_flag rx_wptr rx_wptr_raw
737+
op land rx_overrun rx_full rx_overflow_flag
738+
739+
print "uart{0}_rx_size = {1} ({2} -> {3})"
740+
jump format_uart__rx_fifo_size__no_overrun notEqual rx_overrun true
741+
print " !!"
742+
format_uart__rx_fifo_size__no_overrun:
743+
format uart_index
744+
format rx_fifo_size
745+
format rx_rptr
746+
format rx_wptr
747+
print "\n"
748+
749+
print "uart{0}_tx_size = {1} ({2} -> {3})\n\n"
750+
format uart_index
751+
format tx_fifo_size
752+
format tx_rptr
753+
format tx_wptr
754+
755+
set @counter ret
756+
756757
# creates a marker on the ram proc containing a given address
757758
# the caller should print a format string with a placeholder for the address
758759
# address ->
@@ -796,6 +797,7 @@ mark_memory__found:
796797
setmarker remove mark_memory_id
797798
makemarker shapeText mark_memory_id x y false
798799
op sub layer 120 mark_memory_id
800+
op add layer layer MARKER_START_ID
799801
setmarker drawLayer mark_memory_id layer
800802
setmarker flushText mark_memory_id false
801803

src/init.mlog.jinja

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ reset:
2323
set CPU processor19
2424
set UART0 bank1
2525
set UART1 bank2
26+
set UART2 bank3
27+
set UART3 bank4
2628

2729
op div wait {{LOOKUP_PROC_SIZE}} 120 # micro proc instructions/sec
2830
op ceil wait wait
@@ -115,6 +117,14 @@ init_incr:
115117
write 0 UART1 {{UART_RX_WPTR}}
116118
write 0 UART1 {{UART_TX_RPTR}}
117119
write 0 UART1 {{UART_TX_WPTR}}
120+
write 0 UART2 {{UART_RX_RPTR}}
121+
write 0 UART2 {{UART_RX_WPTR}}
122+
write 0 UART2 {{UART_TX_RPTR}}
123+
write 0 UART2 {{UART_TX_WPTR}}
124+
write 0 UART3 {{UART_RX_RPTR}}
125+
write 0 UART3 {{UART_RX_WPTR}}
126+
write 0 UART3 {{UART_TX_RPTR}}
127+
write 0 UART3 {{UART_TX_WPTR}}
118128

119129
setrate 1
120130
stop

src/main.constants.jinja

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
{#- preprocessor constants for main.mlog.jinja -#}
22

33
{#- linked buildings -#}
4+
{#- IMPORTANT: the buildings must be linked in the order shown here -#}
5+
{#- ie. lookups (not shown), then UART0 to 3, then REGISTERS, etc -#}
6+
7+
{% set UART_START_LINK = 16 %}
8+
49
{% set REGISTERS = 'cell1' %}
510
{% set CSRS = 'processor17' %}
611
{% set INCR = 'processor18' %}
@@ -11,9 +16,6 @@
1116
{% set PAUSE_SWITCH = 'switch2' %}
1217
{% set SINGLE_STEP_SWITCH = 'switch3' %}
1318

14-
{% set UART0 = 'bank1' %}
15-
{% set UART1 = 'bank2' %}
16-
1719
{% set DISPLAY = 'display1' %}
1820

1921
{% set LOOKUP_PROC_SIZE = 260 %} {#- number of variables per lookup proc -#}
@@ -27,10 +29,10 @@
2729
{% set MMIO_START = '0xf0000000' %}
2830
{% set SYSCON = '0xfffffff0' %}
2931

30-
{% set UART_RX_RPTR = 254 %}
31-
{% set UART_RX_WPTR = 255 %}
32+
{% set UART_RX_READ = 254 %}
33+
{% set UART_RX_WRITE = 255 %}
3234
{% set UART_TX_START = 256 %}
33-
{% set UART_TX_RPTR = 510 %}
34-
{% set UART_TX_WPTR = 511 %}
35+
{% set UART_TX_READ = 510 %}
36+
{% set UART_TX_WRITE = 511 %}
3537

3638
{% block contents %}{% endblock %}

0 commit comments

Comments
 (0)