From bad3b601ccfaae20102f57c1a127fce559969cb5 Mon Sep 17 00:00:00 2001 From: lawrie Date: Sat, 31 Mar 2018 10:14:15 +0100 Subject: [PATCH 01/15] Added support for Blackice II --- boards/blackice2/README.md | 21 +++++ boards/blackice2/images/upduino_v1.jpg | Bin 0 -> 29152 bytes boards/blackice2/images/upduino_v2.jpg | Bin 0 -> 14490 bytes boards/blackice2/yosys/Makefile | 71 ++++++++++++++ boards/blackice2/yosys/blackice2.pcf | 38 ++++++++ rtl/boards/blackice2/apple1_hx8k.v | 126 +++++++++++++++++++++++++ 6 files changed, 256 insertions(+) create mode 100644 boards/blackice2/README.md create mode 100644 boards/blackice2/images/upduino_v1.jpg create mode 100644 boards/blackice2/images/upduino_v2.jpg create mode 100644 boards/blackice2/yosys/Makefile create mode 100644 boards/blackice2/yosys/blackice2.pcf create mode 100644 rtl/boards/blackice2/apple1_hx8k.v diff --git a/boards/blackice2/README.md b/boards/blackice2/README.md new file mode 100644 index 0000000..55b76a2 --- /dev/null +++ b/boards/blackice2/README.md @@ -0,0 +1,21 @@ +# Blackice II with Digilent Pmods support + +This adds support for building the apple one design for [mystorm Blackice II](https://github.com/mystorm-org/BlackIce-II) with attached Digilent Pmods for vga and ps2 + +## Peripheral support + +VGA port is working through a Digilent VGA Pmod on Pmod 7/8/9/10 + +PS/2 keyboard uses a Digilent PS/2 Pmod on Pmod 12 + +## Building +Install a recent IceStorm toolchain, and: + +``` +$ cd yosys +$ make +``` + +## Use + +To load BASIC type "E000R" with CAPS LOCK on. diff --git a/boards/blackice2/images/upduino_v1.jpg b/boards/blackice2/images/upduino_v1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4fa0dcc6a916430e0b273debab1e0830e9aa0d45 GIT binary patch literal 29152 zcmbTdWl$VJ7dEwNr=RYgsbll__i+tCqN=E(2tY#v05YBm;Bg(0pa22e0RZai z04@Lk@C<;3Mh3um;?SN70F4%a^Ru3 zME~X4|I3ohFeJ<;18On%!f?MHqTYl&b^%DA0rJtTG0OdoNuYrQfR2WNfsToRh4r7upannO2Vjz7k+BHMW0QZd#ChTI zTqr!{`!m)zHQf~2lL$6pE6)gAJW48R8d~<39IrUJL`22JB_yTZzEeaY<=e`On(A`i91) z=9bo;-oE~U!J*-isp*;7Ir!iCh4qcit?ixNe|!7L)3fu7%PZ9N&3|w`t>^!Q^;G{) zWd9Fbq))ieF)=YPasGn~4c+fQz)3N&SOl@jm3V-(eP0IJ0Zd_JjZ3Kmt z=Oi8_o5(sl@;}i2i|qd$u!#R($o>zo|BGu8@D_l9j{cwPi7=lotY`n(7A!m*9PDQV zcmxFac=-5)L}Vm{M5ILc_#~7hq~y;jC@2Vssi-NRQee_2pYyyA51JF)JZB1 z*t(QBQrpCB;HN-^L7d*Jm>MsNUi7&Wz`kmCkw}$clx~_muZ8tU#>@oQU9>HpEVT_R zGJbc=4!)&m$j4m@#dM{fH3C_ERiMW^$@e3|3IQ8EOs#ND2ZdsdCI0?w)GwFOIHIv* zy0&#O(WH9MG7Wpn^vRonN}F;N?C0egu^}SI=`nEVLqk2$;nXHRj5PA0(5H@7@tJ)D zd|li8JAM0(^72S@M(hutN2WU#<&{__vTcFAp@*oLo}NjAyHA#HKcHcvho2gR*h*3I=yS`-IL@Z|tB^U`iBCcJ>rBt~KWFA^lJ#5>my@WXN7|Ctuu2S; zPQhTMT>aKRXQEV3wfvE<*6chdX>6$Ie3Ks zu35`A&?Ffo_H2BQi2{qtdlcjjZV@ z@8J}uK9wnK@sAinlX_p`ToPLP2(U?x zZ;eTor7~XJKLcipO*uE@&;V?XwF03Y7f^G7^&8ZCZm1eL2V3>=yjBHXa(dqdyfzkJ z+VTa4^kSHdYOs!KQQhmIt8ZrXHQA&K6v@V(W$@T7ORrFlG zq5Cs)4z@tYx{;57flNkjb&UfpXW&{xi#ZD>5Ft_!u3Q}WOrr5BUwN3{4 zcFj$tOVzqd$NP7WfchWtZB^o`4dmv$Mb9+QEU-gzy-Yj9?ra|cxaJ>4aQi91VBi24&pcBvH6DQbM-A5vc{s+L4Fc)s*RVQ(N2xKxhTB5-ok{7PC?dbTB&T%pA~WlPP@96CHBWhwTpW>#+jY`KF%i
    8n} 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 literal 0 HcmV?d00001 diff --git a/boards/blackice2/images/upduino_v2.jpg b/boards/blackice2/images/upduino_v2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0ba6b6ba981aaacb44c147c716a42817f369da2 GIT binary patch literal 14490 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 literal 0 HcmV?d00001 diff --git a/boards/blackice2/yosys/Makefile b/boards/blackice2/yosys/Makefile new file mode 100644 index 0000000..5065932 --- /dev/null +++ b/boards/blackice2/yosys/Makefile @@ -0,0 +1,71 @@ +DEVICE = hx8k +PIN_DEF=blackice2.pcf + +SOURCEDIR = ../../../rtl +BUILDDIR = build + +all: apple1 prog + +info: + @echo " To build: make apple1" + @echo " To program: make prog" + @echo "To build report: make report" + @echo " To clean up: make clean" + +dir: + mkdir -p $(BUILDDIR) + +# ------ TEMPLATES ------ +$(BUILDDIR)/%.blif: $(SOURCEDIR)/%.v + yosys -q -p "chparam -list; hierarchy -top apple1_top; synth_ice40 -blif $@" $^ + +$(BUILDDIR)/%.asc: $(PIN_DEF) $(BUILDDIR)/%.blif + arachne-pnr -d 8k -P tq144:4k -o $@ -p $^ + +$(BUILDDIR)/%.bin: $(BUILDDIR)/%.asc + icepack $^ $@ + +%.rpt: $(BUILDDIR)/%.asc + icetime -d $(DEVICE) -P $(PACKAGE) -c $(FREQ_PLL) -mtr $@ $< + +%_tb.vvp: %_tb.v %.v + iverilog -o $@ $^ + +%_tb.vcd: %_tb.vvp + vvp -N $< +vcd=$@ + +# ------ APPLE 1 ------ +apple1: dir $(BUILDDIR)/apple1.bin +report: dir apple1.rpt + +$(BUILDDIR)/apple1.bin: $(BUILDDIR)/apple1.asc +$(BUILDDIR)/apple1.asc: $(BUILDDIR)/apple1.blif +$(BUILDDIR)/apple1.blif: $(SOURCEDIR)/apple1.v \ + $(SOURCEDIR)/clock.v \ + $(SOURCEDIR)/pwr_reset.v \ + $(SOURCEDIR)/ram.v \ + $(SOURCEDIR)/rom_wozmon.v \ + $(SOURCEDIR)/rom_basic.v \ + $(SOURCEDIR)/cpu/arlet_6502.v \ + $(SOURCEDIR)/cpu/arlet/ALU.v \ + $(SOURCEDIR)/cpu/arlet/cpu.v \ + $(SOURCEDIR)/uart/uart.v \ + $(SOURCEDIR)/uart/async_tx_rx.v \ + $(SOURCEDIR)/vga/vga.v \ + $(SOURCEDIR)/vga/vram.v \ + $(SOURCEDIR)/vga/font_rom.v \ + $(SOURCEDIR)/ps2keyboard/debounce.v \ + $(SOURCEDIR)/ps2keyboard/ps2keyboard.v \ + $(SOURCEDIR)/boards/blackice2/apple1_hx8k.v + +apple1.rpt: $(BUILDDIR)/apple1.asc + +prog: dir $(BUILDDIR)/apple1.bin + cat $(filter-out $<,$^) >/dev/ttyACM0 + +# ------ HELPERS ------ +clean: + rm -rf build apple1.rpt + +.SECONDARY: +.PHONY: all info clean prog iceprog diff --git a/boards/blackice2/yosys/blackice2.pcf b/boards/blackice2/yosys/blackice2.pcf new file mode 100644 index 0000000..407ffae --- /dev/null +++ b/boards/blackice2/yosys/blackice2.pcf @@ -0,0 +1,38 @@ +# For the Blackice II board + +### UART +set_io uart_rx 88 +set_io uart_tx 85 +set_io uart_cts 94 + +### LEDs +set_io led[0] 71 +set_io led[1] 67 +set_io led[2] 68 +set_io led[3] 70 + +### VGA Display +set_io vga_h_sync 8 +set_io vga_v_sync 7 +set_io vga_r[3] 15 +set_io vga_r[2] 16 +set_io vga_r[1] 19 +set_io vga_r[0] 20 +set_io vga_g[3] 1 +set_io vga_g[2] 2 +set_io vga_g[1] 9 +set_io vga_g[0] 10 +set_io vga_b[3] 11 +set_io vga_b[2] 12 +set_io vga_b[1] 17 +set_io vga_b[0] 18 + +set_io clk 129 + +set_io ps2_din 32 +set_io ps2_clk 26 + +### Buttons +set_io button[0] 63 +set_io button[1] 64 + diff --git a/rtl/boards/blackice2/apple1_hx8k.v b/rtl/boards/blackice2/apple1_hx8k.v new file mode 100644 index 0000000..22e6094 --- /dev/null +++ b/rtl/boards/blackice2/apple1_hx8k.v @@ -0,0 +1,126 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +// Description: Apple 1 implementation for the Blackeice II ICE40HX8K + +// +// Author.....: Lawrie Griffiths and Alan Garfield +// Date.......: 31-3-2018 +// + +module apple1_top #( + parameter BASIC_FILENAME = "../../../roms/basic.hex", + parameter FONT_ROM_FILENAME = "../../../roms/vga_font_bitreversed.hex", + parameter RAM_FILENAME = "../../../roms/ram.hex", + parameter VRAM_FILENAME = "../../../roms/vga_vram.bin", + parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex" +) ( + input clk, // 100 MHz board clock + + // I/O interface to computer + input uart_rx, // asynchronous serial data input from computer + output uart_tx, // asynchronous serial data output to computer + output uart_cts, // clear to send flag to computer - not used + + // I/O interface to keyboard + input ps2_clk, // PS/2 keyboard serial clock input + input ps2_din, // PS/2 keyboard serial data input + + // Outputs to VGA display + output vga_h_sync, // hozizontal VGA sync pulse + output vga_v_sync, // vertical VGA sync pulse + + output [3:0] vga_r, // red VGA signal + output [3:0] vga_g, // green VGA signal + output [3:0] vga_b, // blue VGA signal + + // Debugging ports + output [3:0] led, + input [1:0] button // 2 buttons on board +); + + assign led[0] = 1; + assign led[1] = reset_n; + assign led[2] = clr_screen_n; + assign led[3] = 0; + + wire clk25; + + // =============================================================== + // System Clock generation (25MHz) + // =============================================================== + + reg [1:0] clkpre = 2'b00; // prescaler, from 100MHz to 25MHz + + always @(posedge clk) + begin + clkpre <= clkpre + 1; + end + wire clk25 = clkpre[1]; + + wire vga_bit; + + // set the monochrome base colour here.. + assign vga_r[3:0] = vga_bit ? 4'b1000 : 4'b0000; + assign vga_g[3:0] = vga_bit ? 4'b1111 : 4'b0000; + assign vga_b[3:0] = vga_bit ? 4'b1000 : 4'b0000; + + // debounce reset button + wire reset_n; + debounce reset_button ( + .clk25(clk25), + .rst(1'b0), + .sig_in(button[0]), + .sig_out(reset_n) + ); + + // debounce clear screen button + wire clr_screen_n; + debounce clr_button ( + .clk25(clk25), + .rst(~reset_n), + .sig_in(button[1]), + .sig_out(clr_screen_n) + ); + + // apple one main system + apple1 #( + .BASIC_FILENAME (BASIC_FILENAME), + .FONT_ROM_FILENAME (FONT_ROM_FILENAME), + .RAM_FILENAME (RAM_FILENAME), + .VRAM_FILENAME (VRAM_FILENAME), + .WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME) + ) my_apple1( + .clk25(clk25), + .rst_n(reset_n), + + .uart_rx(uart_rx), + .uart_tx(uart_tx), + .uart_cts(uart_cts), + + .ps2_clk(ps2_clk), + .ps2_din(ps2_din), + .ps2_select(1'b1), // PS/2 enabled, UART TX disabled + //.ps2_select(1'b0), // PS/2 disabled, UART TX enabled + + .vga_h_sync(vga_h_sync), + .vga_v_sync(vga_v_sync), + .vga_red(vga_bit), + //.vga_grn(vga_bit), + //.vga_blu(vga_bit), + .vga_cls(~clr_screen_n), + ); +endmodule From 08c147cb73db087da5a1c130fc1d884c5bf2e3af Mon Sep 17 00:00:00 2001 From: lawrie Date: Sat, 31 Mar 2018 10:19:49 +0100 Subject: [PATCH 02/15] removed wrong images --- boards/blackice2/images/upduino_v1.jpg | Bin 29152 -> 0 bytes boards/blackice2/images/upduino_v2.jpg | Bin 14490 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 boards/blackice2/images/upduino_v1.jpg delete mode 100644 boards/blackice2/images/upduino_v2.jpg diff --git a/boards/blackice2/images/upduino_v1.jpg b/boards/blackice2/images/upduino_v1.jpg deleted file mode 100644 index 4fa0dcc6a916430e0b273debab1e0830e9aa0d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29152 zcmbTdWl$VJ7dEwNr=RYgsbll__i+tCqN=E(2tY#v05YBm;Bg(0pa22e0RZai z04@Lk@C<;3Mh3um;?SN70F4%a^Ru3 zME~X4|I3ohFeJ<;18On%!f?MHqTYl&b^%DA0rJtTG0OdoNuYrQfR2WNfsToRh4r7upannO2Vjz7k+BHMW0QZd#ChTI zTqr!{`!m)zHQf~2lL$6pE6)gAJW48R8d~<39IrUJL`22JB_yTZzEeaY<=e`On(A`i91) z=9bo;-oE~U!J*-isp*;7Ir!iCh4qcit?ixNe|!7L)3fu7%PZ9N&3|w`t>^!Q^;G{) zWd9Fbq))ieF)=YPasGn~4c+fQz)3N&SOl@jm3V-(eP0IJ0Zd_JjZ3Kmt z=Oi8_o5(sl@;}i2i|qd$u!#R($o>zo|BGu8@D_l9j{cwPi7=lotY`n(7A!m*9PDQV zcmxFac=-5)L}Vm{M5ILc_#~7hq~y;jC@2Vssi-NRQee_2pYyyA51JF)JZB1 z*t(QBQrpCB;HN-^L7d*Jm>MsNUi7&Wz`kmCkw}$clx~_muZ8tU#>@oQU9>HpEVT_R zGJbc=4!)&m$j4m@#dM{fH3C_ERiMW^$@e3|3IQ8EOs#ND2ZdsdCI0?w)GwFOIHIv* zy0&#O(WH9MG7Wpn^vRonN}F;N?C0egu^}SI=`nEVLqk2$;nXHRj5PA0(5H@7@tJ)D zd|li8JAM0(^72S@M(hutN2WU#<&{__vTcFAp@*oLo}NjAyHA#HKcHcvho2gR*h*3I=yS`-IL@Z|tB^U`iBCcJ>rBt~KWFA^lJ#5>my@WXN7|Ctuu2S; zPQhTMT>aKRXQEV3wfvE<*6chdX>6$Ie3Ks zu35`A&?Ffo_H2BQi2{qtdlcjjZV@ z@8J}uK9wnK@sAinlX_p`ToPLP2(U?x zZ;eTor7~XJKLcipO*uE@&;V?XwF03Y7f^G7^&8ZCZm1eL2V3>=yjBHXa(dqdyfzkJ z+VTa4^kSHdYOs!KQQhmIt8ZrXHQA&K6v@V(W$@T7ORrFlG zq5Cs)4z@tYx{;57flNkjb&UfpXW&{xi#ZD>5Ft_!u3Q}WOrr5BUwN3{4 zcFj$tOVzqd$NP7WfchWtZB^o`4dmv$Mb9+QEU-gzy-Yj9?ra|cxaJ>4aQi91VBi24&pcBvH6DQbM-A5vc{s+L4Fc)s*RVQ(N2xKxhTB5-ok{7PC?dbTB&T%pA~WlPP@96CHBWhwTpW>#+jY`KF%i
      8n} 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 diff --git a/boards/blackice2/images/upduino_v2.jpg b/boards/blackice2/images/upduino_v2.jpg deleted file mode 100644 index c0ba6b6ba981aaacb44c147c716a42817f369da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14490 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 From 86b75a0f2c0e85b7337dd901064ae3e7dc160373 Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Tue, 3 Apr 2018 22:14:47 +1000 Subject: [PATCH 03/15] Fixed new line and nul characters outside of WozMon --- rtl/vga/vga.v | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtl/vga/vga.v b/rtl/vga/vga.v index 3ba6cf8..5c28a3e 100644 --- a/rtl/vga/vga.v +++ b/rtl/vga/vga.v @@ -267,12 +267,15 @@ module vga #( char_seen <= 1; case(din) + 8'h0D, 8'h8D: begin // handle carriage return h_cursor <= 0; v_cursor <= v_cursor + 'd1; end + 8'h00, + 8'h0A, 8'h9B, 8'h7F: begin // ignore the escape key From f7f108478a3f739de9ea7a5fce8e8cc801bd6384 Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Tue, 3 Apr 2018 22:15:24 +1000 Subject: [PATCH 04/15] Added a bunch of Apple1 programs --- software/apple30th.txt | 2 +- software/hello-world.txt | 3 + software/lunar.txt | 55 ++++++++ software/matrix.txt | 25 ++++ software/memory-test.txt | 40 ++++++ software/microchess.txt | 289 +++++++++++++++++++++++++++++++++++++++ software/pasart.txt | 37 +++++ 7 files changed, 450 insertions(+), 1 deletion(-) create mode 100644 software/hello-world.txt create mode 100644 software/lunar.txt create mode 100644 software/matrix.txt create mode 100644 software/memory-test.txt create mode 100644 software/microchess.txt create mode 100644 software/pasart.txt diff --git a/software/apple30th.txt b/software/apple30th.txt index 5372afd..1dafb6f 100644 --- a/software/apple30th.txt +++ b/software/apple30th.txt @@ -430,4 +430,4 @@ : 80 8F 00 13 54 48 45 20 : 4E 45 58 54 20 54 48 49 : 52 54 59 2E 2E 2E 20 00 -: +280R diff --git a/software/hello-world.txt b/software/hello-world.txt new file mode 100644 index 0000000..4e604d0 --- /dev/null +++ b/software/hello-world.txt @@ -0,0 +1,3 @@ +280: A2 C BD 8B 2 20 EF FF CA D0 F7 60 8D C4 CC D2 CF D7 A0 CF CC CC C5 C8 +280R + diff --git a/software/lunar.txt b/software/lunar.txt new file mode 100644 index 0000000..9a8254e --- /dev/null +++ b/software/lunar.txt @@ -0,0 +1,55 @@ +0300: 20 00 04 20 00 04 20 71 06 20 00 04 A9 00 85 00 85 01 85 05 85 08 85 09 A9 05 85 02 A9 50 85 04 +: A9 20 85 06 A9 01 85 07 20 00 04 20 72 07 20 00 04 20 12 06 24 08 10 10 24 05 30 12 20 00 04 20 +: 31 08 A9 00 85 0A F0 06 20 00 05 20 2E 05 20 58 05 A5 04 D0 04 A9 00 85 09 20 B7 05 20 F7 05 A5 +: 02 F0 03 4C 2E 03 A5 01 F0 03 4C 2E 03 20 00 04 20 35 04 20 00 04 20 12 06 20 00 04 20 00 04 A5 +: 04 F0 14 C9 03 90 10 C9 07 90 06 20 06 09 4C 9A 03 20 A9 08 4C 9A 03 20 71 08 20 00 04 20 00 04 +: 20 43 09 20 15 04 C9 59 F0 0C 20 00 04 20 00 04 20 9A 09 4C 1F FF 4C 09 03 A9 0D 20 EF FF A9 0A +: 20 EF FF 60 A9 20 20 EF FF 60 AD AD 12 D0 10 FB AD 10 D0 29 7F 20 EF FF 60 49 30 C9 0A 10 06 4C +: E8 03 FA 90 03 29 0F 60 A9 FF 60 00 10 38 88 03 00 00 08 01 80 08 20 00 00 00 00 00 00 1C C4 00 +: 48 A9 0D 20 EF FF A9 0A 20 EF FF 68 60 48 A9 20 20 EF FF 68 60 AD 11 D0 10 FB AD 10 D0 29 7F 20 +: EF FF 60 49 30 C9 0A 30 06 4C 32 04 FA 90 03 29 0F 60 A9 99 60 20 00 04 20 53 08 20 00 04 60 A5 +: 06 85 0A A9 FF 85 08 60 05 00 AA AE 01 00 00 00 A9 8D A2 18 20 EF FF CA D0 FA 60 00 60 FF FF FF +: 97 90 CD 2B FF FF FF FF 8D D2 E6 D3 FF FF FF FF A5 4C 85 4D A9 00 85 4E 85 4F CE 4F 00 D0 FB CE +: 4E 00 D0 F6 CE 4D 00 D0 F1 60 78 B7 FF FF FF FF 4B 50 FE FF FF FF F7 FF 36 BA CF FB FF FF 7F FF +: B8 11 8A A7 FF FF FF FF B0 56 3E F7 FF FF F3 FF B5 55 35 72 FF FF FF FF A3 36 8D 27 FF FF F7 FD +: 57 6E B2 A7 FF FF F7 FF 08 2C 9A 13 FF FF FF FF C5 B3 3E BD FF FF FF FF BD F1 CF 6B FF FF FF FF +: 00 56 45 4D 45 4E 54 0D 0A 0A 4D 41 58 49 4D 55 4D 98 33 37 FF FF FF FF F8 F4 FE AD FF FF BE FF +: 20 15 04 20 23 04 85 0B 20 15 04 C9 0D F0 1A 20 23 04 85 0C A5 0B 0A 0A 0A 0A 05 0C C9 31 B0 03 +: 85 0A 60 20 67 09 4C 00 05 A5 0B 4C 1C 05 F8 38 A5 06 E5 0A 85 0B A5 07 E9 00 85 0C A5 07 C9 01 +: F0 0C A5 06 C5 0A F0 02 B0 04 20 3F 04 EA A5 0B 85 06 A5 0C 85 07 60 40 F8 38 24 09 10 18 A5 04 +: E9 05 85 0B C5 04 90 14 38 A9 00 E5 0B 85 04 A9 00 85 09 4C 7E 05 F8 18 A5 04 69 05 85 04 24 09 +: 10 09 18 A5 04 65 0A 85 04 D8 60 38 A5 04 E5 0A 85 0B A5 0A C9 00 F0 19 A5 0B C5 04 F0 02 90 0D +: 38 A9 00 E5 0B 85 04 A9 FF 85 09 D8 60 85 04 D8 60 A5 0B 85 04 D8 60 F8 38 24 09 30 25 A5 01 E5 +: 04 85 0B A5 02 F0 0B E9 00 85 02 4C F1 05 A5 0B F0 06 A5 01 C5 0B B0 04 A9 00 F0 02 A5 0B 85 01 +: D8 60 18 A5 01 65 04 85 01 A5 02 69 00 85 02 D8 60 A5 0B 85 01 D8 60 F8 18 A5 00 69 01 85 00 D8 +: 60 A0 00 B9 AD 09 20 EF FF C0 0A F0 04 C8 4C 03 06 60 20 0D 04 20 0D 04 A5 00 20 DC FF A0 04 20 +: 0D 04 88 D0 FA A5 02 20 DC FF A5 01 20 DC FF A0 05 20 0D 04 88 D0 FA 24 09 30 07 A9 2D 20 EF FF +: D0 05 A9 2B 20 EF FF A5 04 20 DC FF 24 08 10 01 60 A0 06 20 0D 04 88 D0 FA A5 07 20 DC FF A5 06 +: 20 DC FF A0 05 20 0D 04 88 D0 FA A9 3F 20 EF FF 60 A9 84 8D 04 06 A9 06 8D 05 06 A9 ED 8D 0A 06 +: 20 01 06 60 4C 55 4E 41 52 20 4C 41 4E 44 45 52 0D 0D 0A 4D 49 4E 55 53 20 56 45 4C 4F 43 49 54 +: 59 20 28 2D 29 20 4D 45 41 4E 53 20 44 4F 57 4E 57 41 52 44 0D 4D 4F 56 45 4D 45 4E 54 0D 0D 50 +: 4C 55 53 20 20 56 45 4C 4F 43 49 54 59 20 28 2B 29 20 4D 45 41 4E 53 20 55 50 57 41 52 44 20 4D +: 4F 56 45 4D 45 4E 54 0D 0A 0A 4D 41 58 49 4D 55 4D 20 42 55 52 4E 20 49 53 20 33 30 20 55 4E 49 +: 54 53 2F 53 45 43 2E 20 20 28 42 55 52 4E 20 4D 41 59 20 42 45 20 41 4E 59 20 49 4E 54 45 47 45 +: 52 20 46 52 4F 4D 20 30 20 54 4F 20 33 30 29 0D 0D 41 20 42 55 52 4E 20 4F 46 20 35 20 55 4E 49 +: 54 53 2F 53 45 43 20 49 53 20 52 45 51 55 49 52 45 44 20 54 4F 0D 43 41 4E 43 45 4C 20 47 52 41 +: 56 49 54 59 2E 0D 0D 0A 47 4F 4F 44 20 4C 55 43 4B 21 A9 85 8D 04 06 A9 07 8D 05 06 A9 80 8D 0A +: 06 20 01 06 60 43 4F 4E 54 52 4F 4C 20 54 4F 20 4C 55 4E 41 52 20 4D 4F 44 55 4C 45 3A 0D 0A 42 +: 45 47 49 4E 20 4C 41 4E 44 49 4E 47 20 50 52 4F 43 45 44 55 52 45 0D 0D 0D 0A 20 54 49 4D 45 20 +: 20 48 45 49 47 48 54 20 56 45 4C 4F 43 49 54 59 20 46 55 45 4C 20 55 4E 49 54 53 20 20 42 55 52 +: 4E 0D 0A 28 53 45 43 53 29 20 28 46 45 45 54 29 20 28 46 54 2F 53 45 43 29 20 20 52 45 4D 41 49 +: 4E 49 4E 47 0D 0A 00 00 00 00 00 20 28 46 45 45 54 29 00 00 00 00 20 20 28 46 54 2F 53 45 43 29 +: 00 00 00 00 00 00 00 20 52 45 4D 41 49 4E 49 4E 47 A9 48 8D 04 06 A9 08 8D 05 06 A9 0A 8D 0A 06 +: 20 01 06 A9 FF 85 05 60 4F 55 54 20 4F 46 20 46 55 45 4C A9 66 8D 04 06 A9 08 8D 05 06 A9 0A 8D +: 0A 06 20 01 06 60 4F 4E 20 54 48 45 20 4D 4F 4F 4E A9 84 8D 04 06 A9 08 8D 05 06 A9 24 8D 0A 06 +: 20 01 06 60 50 45 52 46 45 43 54 20 4C 41 4E 44 49 4E 47 21 07 07 07 07 0D 0A 43 4F 4E 47 52 41 +: 54 55 4C 41 54 49 4F 4E 53 A9 BC 8D 04 06 A9 08 8D 05 06 A9 49 8D 0A 06 20 01 06 60 57 45 4C 4C +: 2C 20 59 4F 55 20 47 4F 54 20 44 4F 57 4E 20 41 4C 49 56 45 2C 20 42 55 54 20 44 41 4D 41 47 45 +: 20 54 4F 20 59 4F 55 52 20 43 52 41 46 54 20 0A 48 41 53 20 53 54 52 41 4E 44 45 44 20 59 4F 55 +: 20 48 45 52 45 21 A9 19 8D 04 06 A9 09 8D 05 06 A9 28 8D 0A 06 20 01 06 60 59 4F 55 20 4A 55 53 +: 54 20 43 52 45 41 4D 45 44 20 41 20 32 39 20 4D 45 47 41 42 55 43 4B 20 4C 41 4E 44 45 52 21 07 +: 07 07 07 A9 56 8D 04 06 A9 09 8D 05 06 A9 10 8D 0A 06 20 01 06 60 54 52 59 20 41 47 41 49 4E 3F +: 20 20 28 59 2F 4E 29 20 00 04 A9 7D 8D 04 06 A9 09 8D 05 06 A9 1C 8D 0A 06 20 01 06 60 42 55 52 +: 4E 20 4F 55 54 20 4F 46 20 52 41 4E 47 45 2E 20 20 20 20 20 42 55 52 4E 20 3F A9 AD 8D 04 06 A9 +: 09 8D 05 06 A9 0A 8D 0A 06 20 01 06 60 43 4F 4E 54 52 4F 4C 20 4F 55 54 FF +300R diff --git a/software/matrix.txt b/software/matrix.txt new file mode 100644 index 0000000..b4b7501 --- /dev/null +++ b/software/matrix.txt @@ -0,0 +1,25 @@ +E000R + +10 DIM A$(64) +20 A$="!@#$%^&*()+{}|:<>?/.,';][\=-1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ" +30 GOSUB 1000 +40 TAB 3:GOSUB 1000 +50 TAB 5:GOSUB 1000 +60 TAB 7:GOSUB 1000 +70 TAB 10:GOSUB 1000 +80 TAB 13:GOSUB 1000 +90 TAB 15:GOSUB 1000 +100 TAB 17:GOSUB 1000 +110 TAB 20:GOSUB 1000 +110 TAB 23:GOSUB 1000 +120 TAB 25:GOSUB 1000 +130 TAB 27:GOSUB 1000 +140 TAB 30:GOSUB 1000 +150 TAB 33:GOSUB 1000 +160 TAB 35:GOSUB 1000 +170 TAB 38:GOSUB 1000 +180 PRINT:GOTO 30 +1000 A=RND(64)+1:PRINT A$(A,A);:RETURN +1010 END +RUN + diff --git a/software/memory-test.txt b/software/memory-test.txt new file mode 100644 index 0000000..e53cadf --- /dev/null +++ b/software/memory-test.txt @@ -0,0 +1,40 @@ +0: 00 05 00 10 00 00 00 00 +8: 00 00 00 00 00 00 00 00 +280: A9 00 85 07 A9 00 A8 AA +288: 85 06 A5 00 85 04 A5 01 +290: 85 05 C0 04 D0 04 A5 04 +298: 85 06 C0 05 D0 04 A5 05 +2A0: 85 06 A5 06 81 04 A1 04 +2A8: C5 06 D0 2E E6 04 D0 02 +2B0: E6 05 A5 02 C5 04 D0 04 +2B8: A5 03 C5 05 D0 D4 A5 00 +2C0: 85 04 A5 01 85 05 C0 04 +2C8: D0 04 A5 04 85 06 C0 05 +2D0: D0 04 A5 05 85 06 A1 04 +2D8: C5 06 D0 69 E6 04 D0 02 +2E0: E6 05 A5 02 C5 04 D0 04 +2E8: A5 03 C5 05 D0 D8 C0 00 +2F0: D0 08 A9 FF 85 06 C8 4C +2F8: 8A 02 C0 01 D0 04 A9 01 +300: D0 F2 C0 02 D0 08 06 06 +308: 90 ED A9 7F D0 E6 C0 03 +310: D0 08 38 66 06 B0 E0 C8 +318: D0 DD C0 04 F0 F9 A9 50 +320: 20 6C 03 A9 41 20 6C 03 +328: A9 53 20 6C 03 A9 53 20 +330: 6C 03 20 9C 03 E6 07 A5 +338: 07 20 70 03 20 91 03 EA +340: EA EA 4C 84 02 48 98 20 +348: 70 03 20 9C 03 A5 05 20 +350: 70 03 A5 04 20 70 03 20 +358: 9C 03 A5 06 20 70 03 20 +360: 9C 03 68 20 70 03 20 91 +368: 03 4C 00 FF 20 EF FF 60 +370: 48 4A 4A 4A 4A 29 0F 09 +378: 30 C9 3A 90 02 69 06 20 +380: 6C 03 68 29 0F 09 30 C9 +388: 3A 90 02 69 06 20 6C 03 +390: 60 A9 0D 20 6C 03 A9 0A +398: 20 6C 03 60 A9 20 20 6C +3A0: 03 60 +280R diff --git a/software/microchess.txt b/software/microchess.txt new file mode 100644 index 0000000..2aa297e --- /dev/null +++ b/software/microchess.txt @@ -0,0 +1,289 @@ +1000: 20 9B 15 20 B3 16 20 22 +1008: 10 D8 A2 FF 9A A2 C8 86 +1010: B2 20 F1 14 A9 3F 85 FC +1018: 20 CE 14 20 C3 14 C9 43 +1020: D0 16 A2 1F BD 5E 18 95 +1028: 50 CA 10 F8 A9 00 85 FD +1030: A2 1B 86 DC A9 CC D0 22 +1038: C9 45 D0 0D 20 FE 12 A5 +1040: FD 49 01 85 FD A9 EE D0 +1048: 11 C9 44 D0 03 4C 09 10 +1050: C9 50 D0 0E 20 BE 14 20 +1058: F6 13 85 FB 85 FA 85 F9 +1060: D0 A7 C9 0D D0 09 20 98 +1068: 13 20 37 12 4C 09 10 C9 +1070: 51 F0 03 4C 27 12 4C 1F +1078: FF 99 22 06 45 32 0C 72 +1080: 14 01 63 63 05 64 43 0F +1088: 63 41 05 52 25 07 44 34 +1090: 0E 53 33 0F CC 99 22 07 +1098: 55 32 0D 45 06 00 63 14 +10A0: 01 14 13 06 34 14 04 36 +10A8: 25 06 52 33 0E 43 24 0F +10B0: 44 99 25 0B 25 01 00 33 +10B8: 25 07 36 34 0D 34 34 0E +10C0: 52 25 0D 45 35 04 55 22 +10C8: 06 43 33 0F CC 99 52 04 +10D0: 52 52 06 75 44 06 52 41 +10D8: 04 43 43 0F 43 25 06 52 +10E0: 32 04 42 22 07 55 34 0F +10E8: 44 99 25 07 66 43 0E 55 +10F0: 55 04 54 13 01 63 34 0E +10F8: 33 01 00 52 46 04 55 22 +1100: 06 43 33 0F CC 99 06 00 +1108: 52 11 06 34 22 0B 22 23 +1110: 06 64 14 04 43 44 06 75 +1118: 25 06 31 22 07 55 34 0F +1120: 44 99 25 01 25 15 01 33 +1128: 25 07 72 01 00 63 11 04 +1130: 66 21 0A 56 22 06 53 35 +1138: 0D 52 34 0E CC 99 35 0C +1140: 52 52 06 62 44 06 52 06 +1148: 00 75 14 04 66 11 05 56 +1150: 21 0B 55 24 0F 42 25 06 +1158: 43 99 03 02 63 25 0B 25 +1160: 41 05 54 24 0E 72 01 00 +1168: 36 46 04 52 25 07 55 22 +1170: 06 43 33 0F CC 99 03 07 +1178: 74 14 01 52 52 04 36 23 +1180: 0E 53 06 00 75 41 04 31 +1188: 25 06 52 22 07 55 34 0F +1190: 44 A6 B5 30 5C A5 B0 F0 +1198: 08 E0 08 D0 04 C5 E6 F0 +11A0: 2E F6 E3 C9 01 D0 02 F6 +11A8: E3 50 1E A0 0F A5 B1 D9 +11B0: 60 00 F0 03 88 10 F8 B9 +11B8: 8F 18 D5 E4 90 04 94 E6 +11C0: 95 E4 18 08 75 E5 95 E5 +11C8: 28 E0 04 F0 03 30 31 60 +11D0: A5 E8 85 DD A9 00 85 B5 +11D8: 20 98 13 20 FE 12 20 4C +11E0: 12 20 FE 12 A9 08 85 B5 +11E8: 20 55 12 20 7E 13 4C 53 +11F0: 14 E0 F9 D0 0B A5 60 C5 +11F8: B1 D0 04 A9 00 85 B4 60 +1200: 50 FD A0 07 A5 B1 D9 60 +1208: 00 F0 05 88 F0 F1 10 F6 +1210: B9 8F 18 D5 E2 90 02 95 +1218: E2 C6 B5 A9 FB C5 B5 F0 +1220: 03 20 72 13 E6 B5 60 38 +1228: E9 30 C9 08 B0 06 20 43 +1230: 14 20 3A 12 4C 18 10 A5 +1238: F9 2C A5 FA A2 1F D5 50 +1240: F0 05 CA 10 F9 A2 BB 86 +1248: FB 86 B0 60 A2 10 A9 00 +1250: 95 DE CA 10 FB A9 10 85 +1258: B0 C6 B0 10 01 60 20 6B +1260: 13 A4 B0 A2 08 86 B6 C0 +1268: 08 10 41 C0 06 10 2E C0 +1270: 04 10 1F C0 01 F0 09 10 +1278: 0E 20 DA 12 D0 FB F0 D9 +1280: 20 E8 12 D0 FB F0 D2 A2 +1288: 04 86 B6 20 E8 12 D0 FB +1290: F0 C7 20 E8 12 A5 B6 C9 +1298: 04 D0 F7 F0 BC A2 10 86 +12A0: B6 20 DA 12 A5 B6 C9 08 +12A8: D0 F7 F0 AD A2 06 86 B6 +12B0: 20 16 13 50 05 30 03 20 +12B8: 91 11 20 6B 13 C6 B6 A5 +12C0: B6 C9 05 F0 EB 20 16 13 +12C8: 70 8F 30 8D 20 91 11 A5 +12D0: B1 29 F0 C9 20 F0 EE 4C +12D8: 59 12 20 16 13 30 03 20 +12E0: 91 11 20 6B 13 C6 B6 60 +12E8: 20 16 13 90 02 50 F9 30 +12F0: 07 08 20 91 11 28 50 F0 +12F8: 20 6B 13 C6 B6 60 A2 0F +1300: 38 B4 60 A9 77 F5 50 95 +1308: 60 94 50 38 A9 77 F5 50 +1310: 95 50 CA 10 EB 60 A5 B1 +1318: A6 B6 18 7D 7E 18 85 B1 +1320: 29 88 D0 42 A5 B1 A2 20 +1328: CA 30 0E D5 50 D0 F9 E0 +1330: 10 30 33 A9 7F 69 01 70 +1338: 01 B8 A5 B5 30 24 C9 08 +1340: 10 20 48 08 A9 F9 85 B5 +1348: 85 B4 20 98 13 20 FE 12 +1350: 20 55 12 20 7B 13 28 68 +1358: 85 B5 A5 B4 30 04 38 A9 +1360: FF 60 18 A9 00 60 A9 FF +1368: 18 B8 60 A6 B0 B5 50 85 +1370: B1 60 20 98 13 20 FE 12 +1378: 20 55 12 20 FE 12 BA 86 +1380: B3 A6 B2 9A 68 85 B6 68 +1388: 85 B0 AA 68 95 50 68 AA +1390: 68 85 B1 95 50 4C BD 13 +1398: BA 86 B3 A6 B2 9A A5 B1 +13A0: 48 A8 A2 1F D5 50 F0 03 +13A8: CA 10 F9 A9 CC 95 50 8A +13B0: 48 A6 B0 B5 50 94 50 48 +13B8: 8A 48 A5 B6 48 BA 86 B2 +13C0: A6 B3 9A 60 A4 E4 EC 8F +13C8: 18 D0 04 A9 00 F0 0A A6 +13D0: E3 D0 06 A6 EE D0 02 A9 +13D8: FF A2 04 86 B5 C5 FA 90 +13E0: 0C F0 0A 85 FA A5 B0 85 +13E8: FB A5 B1 85 F9 A5 FC 49 +13F0: 1F 85 FC 4C EC 14 A4 DC +13F8: 30 19 A5 F9 D1 43 D0 0F +1400: 88 B1 43 85 FB 88 B1 43 +1408: 85 F9 88 84 DC D0 1C A9 +1410: FF 85 DC A2 0C 86 B5 86 +1418: FA A2 14 20 4E 12 A2 04 +1420: 86 B5 20 4C 12 A6 FA E0 +1428: 0F 90 15 A6 FB B5 50 85 +1430: FA 86 B0 A5 F9 85 B1 20 +1438: 98 13 20 37 12 4C 09 10 +1440: A9 FF 60 A2 04 06 F9 26 +1448: FA CA D0 F9 05 F9 85 F9 +1450: 85 B1 60 18 A9 80 65 EB +1458: 65 EC 65 ED 65 E1 65 DF +1460: 38 E5 F0 E5 F1 E5 E2 E5 +1468: E0 E5 DE E5 EF E5 E3 B0 +1470: 02 A9 00 4A 18 69 40 65 +1478: EC 65 ED 38 E5 E4 4A 18 +1480: 69 90 65 DD 65 DD 65 DD +1488: 65 DD 65 E1 38 E5 E4 E5 +1490: E4 E5 E5 E5 E5 E5 E0 A6 +1498: B1 E0 33 F0 16 E0 34 F0 +14A0: 12 E0 22 F0 0E E0 25 F0 +14A8: 0A A6 B0 F0 09 B4 50 C0 +14B0: 10 10 03 18 69 02 4C C4 +14B8: 13 A9 20 4C EF FF A9 0D +14C0: 4C EF FF AD 11 D0 10 FB +14C8: AD 10 D0 29 7F 60 20 BE +14D0: 14 A5 FC 20 EF FF 20 B9 +14D8: 14 20 AF 15 20 B9 14 A5 +14E0: FA 20 AA 15 20 B9 14 A5 +14E8: F9 4C AA 15 A9 2E 4C EF +14F0: FF 20 BE 14 20 84 15 20 +14F8: 5F 15 A0 00 20 A9 15 A9 +1500: 21 20 EF FF A2 1F 98 D5 +1508: 50 F0 35 CA 10 F9 98 0A +1510: 0A 0A 0A 98 69 00 4A A9 +1518: 20 B0 02 A9 23 20 EF FF +1520: 20 EF FF C8 98 29 08 F0 +1528: D6 A9 21 20 EF FF 20 A9 +1530: 15 20 BE 14 20 5F 15 98 +1538: 18 69 08 30 47 A8 10 BC +1540: A9 57 E0 10 24 FD F0 04 +1548: 2A 49 01 6A 90 02 A9 42 +1550: 20 EF FF 8A 29 0F AA BD +1558: 4E 18 20 EF FF D0 C4 20 +1560: B9 14 20 B9 14 8A 48 A2 +1568: 08 A9 2B 20 EF FF A9 2D +1570: 20 EF FF 20 EF FF CA D0 +1578: F0 A9 2B 20 EF FF 68 AA +1580: 20 BE 14 60 20 B9 14 20 +1588: EF FF A2 00 20 B9 14 8A +1590: 20 DC FF E8 E0 08 D0 F4 +1598: 4C BE 14 A2 00 BD D5 17 +15A0: 30 06 20 EF FF E8 D0 F5 +15A8: 60 98 29 77 4C DC FF A5 +15B0: FB 30 13 29 0F 0A 0A 0A +15B8: AA A0 08 BD 39 17 20 EF +15C0: FF E8 88 D0 F6 60 C9 CC +15C8: D0 04 A2 80 D0 EB C9 EE +15D0: D0 04 A2 88 D0 E3 C9 FF +15D8: D0 04 A2 90 D0 DB A2 94 +15E0: D0 D7 53 45 4C 45 43 54 +15E8: 20 4C 45 56 45 4C 3A 00 +15F0: 00 30 29 20 53 55 50 45 +15F8: 52 42 4C 49 54 5A 00 31 +1600: 29 20 42 4C 49 54 5A 00 +1608: 32 29 20 4E 4F 52 4D 41 +1610: 4C 00 FF 00 53 45 4C 45 +1618: 43 54 20 4F 50 45 4E 49 +1620: 4E 47 3A 20 43 4F 4D 50 +1628: 20 50 4C 41 59 53 00 00 +1630: 46 52 45 4E 43 48 20 44 +1638: 45 46 45 4E 43 45 3A 20 +1640: 30 29 20 57 20 31 29 20 +1648: 42 00 47 49 55 4F 43 4F +1650: 20 50 49 41 4E 4F 3A 20 +1658: 20 20 32 29 20 57 20 33 +1660: 29 20 42 00 52 55 59 20 +1668: 4C 4F 50 45 5A 3A 20 20 +1670: 20 20 20 20 34 29 20 57 +1678: 20 35 29 20 42 00 51 55 +1680: 45 45 4E 27 53 20 49 4E +1688: 44 49 41 4E 3A 20 36 29 +1690: 20 57 20 37 29 20 42 00 +1698: 46 4F 55 52 20 4B 4E 49 +16A0: 47 48 54 53 3A 20 20 20 +16A8: 38 29 20 57 20 39 29 20 +16B0: 42 00 FF A9 E2 85 41 A9 +16B8: 15 85 42 20 1C 17 20 C3 +16C0: 14 20 EF FF 38 E9 30 AA +16C8: D0 09 8E 3F 13 CA 8E 1C +16D0: 12 D0 1A CA D0 0A 8E 3F +16D8: 13 A2 FB 8E 1C 12 D0 0D +16E0: CA D0 D0 A2 08 8E 3F 13 +16E8: A2 FB 8E 1C 12 A9 13 85 +16F0: 41 A9 16 85 42 20 1C 17 +16F8: 20 C3 14 20 EF FF 38 E9 +1700: 30 C5 40 B0 E8 AA E8 A9 +1708: 10 85 44 A9 79 CA F0 09 +1710: 18 69 1C 90 F8 E6 44 D0 +1718: F4 85 43 60 20 BE 14 A0 +1720: FF C8 B1 41 D0 06 20 BE +1728: 14 4C 21 17 C9 FF F0 06 +1730: 20 EF FF 4C 21 17 84 40 +1738: 60 4B 49 4E 47 20 20 20 +1740: 20 51 55 45 45 4E 20 20 +1748: 20 4B 20 52 4F 4F 4B 20 +1750: 20 51 20 52 4F 4F 4B 20 +1758: 20 4B 20 42 49 53 48 4F +1760: 50 51 20 42 49 53 48 4F +1768: 50 4B 20 4B 4E 49 47 48 +1770: 54 51 20 4B 4E 49 47 48 +1778: 54 4B 20 52 20 50 41 57 +1780: 4E 51 20 52 20 50 41 57 +1788: 4E 4B 20 4E 20 50 41 57 +1790: 4E 51 20 4E 20 50 41 57 +1798: 4E 4B 20 42 20 50 41 57 +17A0: 4E 51 20 42 20 50 41 57 +17A8: 4E 51 20 50 41 57 4E 20 +17B0: 20 4B 20 50 41 57 4E 20 +17B8: 20 52 45 53 45 54 20 20 +17C0: 20 45 58 43 48 41 4E 47 +17C8: 45 4D 41 54 45 20 20 20 +17D0: 20 20 20 20 20 0D 2B 2D +17D8: 2D 2D 2D 2D 2D 2D 2D 2D +17E0: 2D 2D 2D 2D 2D 2D 2D 2D +17E8: 2D 2D 2D 2B 0D 00 21 20 +17F0: 20 20 20 20 4D 49 43 52 +17F8: 4F 43 48 45 53 53 20 20 +1800: 20 20 20 21 0D 00 21 20 +1808: 28 43 29 20 50 45 54 45 +1810: 52 20 4A 45 4E 4E 49 4E +1818: 47 53 20 21 0D 00 21 20 +1820: 20 50 45 54 45 52 4A 40 +1828: 42 45 4E 4C 4F 2E 43 4F +1830: 4D 20 20 21 0D 00 2B 2D +1838: 2D 2D 2D 2D 2D 2D 2D 2D +1840: 2D 2D 2D 2D 2D 2D 2D 2D +1848: 2D 2D 2D 2B 0D FF 4B 51 +1850: 52 52 42 42 4E 4E 50 50 +1858: 50 50 50 50 50 50 03 04 +1860: 00 07 02 05 01 06 10 17 +1868: 11 16 12 15 14 13 73 74 +1870: 70 77 72 75 71 76 60 67 +1878: 61 66 62 65 64 63 00 F0 +1880: FF 01 10 11 0F EF F1 DF +1888: E1 EE F2 12 0E 1F 21 0B +1890: 0A 06 06 04 04 04 04 02 +1898: 02 02 02 02 02 02 02 90 +18A0: A2 49 00 3A F0 A0 59 04 +18A8: AC 22 2E 56 2A E0 51 70 +18B0: CF 3D F5 A8 3B 2D 81 31 +18B8: DC DF 0A 49 05 F0 D0 08 +18C0: 1F 85 57 A2 8F EB 51 34 +18C8: AD 15 66 A8 82 33 EE 89 +18D0: 0D 14 47 10 20 19 1C E1 +18D8: CB CE C7 3D 30 05 4D D3 +18E0: E2 8D 93 47 51 10 A1 35 +18E8: 94 66 3E 43 70 49 2A 17 +18F0: 5C C3 C4 0D 51 24 6C 96 +18F8: 75 25 00 40 8E 4A 38 0F +1000R diff --git a/software/pasart.txt b/software/pasart.txt new file mode 100644 index 0000000..f8504b5 --- /dev/null +++ b/software/pasart.txt @@ -0,0 +1,37 @@ +0300: 20 26 05 A9 00 85 00 A9 10 85 01 20 42 03 20 D3 +0310: 03 20 83 04 20 2B 05 C9 1B D0 E5 60 20 3F 53 57 +0320: 4F 52 20 3F 53 4E 4D 55 4C 4F 43 20 3F 4F 4C 55 +0330: 44 4F 4D 20 3F 29 33 2C 32 2C 31 28 20 45 4C 59 +0340: 54 53 A2 06 BD 1B 03 20 EF FF CA D0 F7 A5 02 20 +0350: A7 03 C9 03 30 EC 85 02 85 0B A2 09 BD 21 03 20 +0360: EF FF CA D0 F7 A5 03 20 A7 03 C9 03 30 EC C9 28 +0370: 10 E8 85 03 85 0C A2 08 BD 2A 03 20 EF FF CA D0 +0380: F7 A5 05 20 A7 03 F0 EE 85 05 A2 0F BD 32 03 20 +0390: EF FF CA D0 F7 E6 04 A5 04 20 A7 03 F0 EC C9 04 +03A0: 10 E8 85 04 C6 04 60 85 0D A2 00 86 06 86 07 86 +03B0: 08 20 2B 05 C9 1B D0 05 68 68 68 68 60 20 EF FF +03C0: C9 0D F0 05 95 06 E8 D0 E8 8A F0 04 20 F5 04 60 +03D0: A5 0D 60 A2 01 A5 04 F0 16 C9 01 D0 04 C6 0B D0 +03E0: 0E A5 02 4A 69 00 85 0B A5 03 4A 69 00 85 0C A0 +03F0: 01 A9 00 86 09 84 0A CA 20 A4 04 85 08 E8 88 20 +0400: A4 04 C8 18 65 08 20 62 04 48 20 CF 04 68 A2 00 +0410: 81 06 A6 04 F0 3D CA F0 22 48 A6 09 20 79 04 20 +0420: CF 04 68 48 A2 00 81 06 A6 09 A4 0A 20 6F 04 20 +0430: CF 04 68 48 A2 00 81 06 38 B0 08 48 A5 02 38 E5 +0440: 09 85 0C A6 09 20 6F 04 20 79 04 20 CF 04 68 A2 +0450: 00 81 06 A6 09 A4 0A C8 C4 0C D0 95 E8 E4 0B D0 +0460: 8E 60 38 E5 05 F0 07 C5 05 10 F7 18 65 05 60 48 +0470: A5 02 38 E5 09 AA CA 68 60 48 A5 03 38 E5 0A A8 +0480: 88 68 60 A2 00 A0 00 20 26 05 20 A4 04 0A D0 04 +0490: A9 20 D0 02 A9 2A 20 EF FF C8 C4 03 D0 EC E8 E4 +04A0: 02 D0 E2 60 8A F0 25 98 F0 22 A5 04 F0 10 8A 38 +04B0: E5 02 C9 FF F0 16 98 38 E5 03 C9 FF F0 0E 20 CF +04C0: 04 86 0D A2 00 A1 06 A6 0D 18 90 02 A9 01 60 8A +04D0: 48 A5 01 85 07 A5 00 85 06 E0 00 F0 0C 18 65 03 +04E0: 85 06 90 02 E6 07 CA D0 F5 98 65 06 85 06 90 02 +04F0: E6 07 68 AA 60 A5 06 20 18 05 C9 FF F0 20 48 A5 +0500: 07 20 18 05 C9 FF D0 02 68 60 85 0D 68 85 08 0A +0510: 0A 18 65 08 0A 65 0D 60 49 30 C9 0A 90 02 A9 FF +0520: 60 A9 20 4C EF FF A9 0D 4C EF FF AD 11 D0 10 FB +0530: AD 10 D0 29 7F 60 +300R From 986fdc13941b55a916e8795cce2c2b93d6ca81cd Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Tue, 3 Apr 2018 22:44:33 +1000 Subject: [PATCH 05/15] updated main readme:ew --- README.md | 78 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 3756066..9a80057 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,23 @@ ![Apple One](media/apple-logo.png) This is a basic implementation of the original Apple 1 in Verilog. It can run the Apple 1 WozMon and Integer Basic via the serial or VGA 640x480 video with PS/2 keyboard standalone. This makes this a very compact little set up. So far fully tested and supported boards are: -- iCE40HX8K-B-EVN breakout -- Terasic DE0 +- [iCE40HX8K-B-EVN breakout](http://www.latticesemi.com/Products/DevelopmentBoardsAndKits/iCE40HX8KBreakoutBoard.aspx) +- [Terasic DE0](http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=364) +- [Digilent Spartan-3E Starter Board](https://store.digilentinc.com/spartan-3e-starter-board-limited-time/) + +Contributor supported boards (YMMV): +- [Blackice II](https://www.tindie.com/products/Folknology/blackice-ii/) +- [Olimex iCE40HX8K with ICE40-IO](https://www.olimex.com/Products/FPGA/iCE40/iCE40HX1K-EVB/open-source-hardware) +- [TinyFPGA B2](http://tinyfpga.com/) +- [Upduino](http://gnarlygrey.atspace.cc/development-platform.html)

      Apple One Running

      -This project borrows heavily from the *awesome* work of Andrew Holme and his ["Pool"](http://www.aholme.co.uk/6502/Main.htm) project where he built a 6502 CPU core in Verilog using the netlist from the Visual 6502 project. Amazing stuff, and so far seems to work perfectly. Also many special thanks to ["sbprojects.com"](https://www.sbprojects.com/projects/apple1/index.php) for the wealth of information I gleaned from there. +This project borrows heavily from the *awesome* work of Andrew Holme and his ["Pool"](http://www.aholme.co.uk/6502/Main.htm) project and [Arlet Otten's](https://github.com/Arlet/verilog-6502) tiny 6502 core. Also many special thanks to ["sbprojects.com"](https://www.sbprojects.com/projects/apple1/index.php) for the wealth of information I gleaned from there. - ## Memory Map +## Memory Map The memory map is currently set up to have: @@ -19,11 +26,15 @@ The memory map is currently set up to have: 0x0000 | 0x1FFF | 8KB of block RAM for system 0xE000 | 0xEFFF | 4KB of block RAM for basic ROM 0xFF00 | 0xFFFF | 512B of block RAM for WozMon ROM + +You can swap out the Basic ROM to get more RAM if you need the space, this can be achieved easily with only minor modifications to the top file. - ## Building +## Building Each supported board has a directory in `boards`. This directory has a structure where each board can have multiple build environments (eg. yosys, icecube2, quartus etc). +Each board has specific instructions that will explain further the requirements of each board and how to build for it, but basically all should support the following. + To build for your board you just need to open the project or use the `Makefile` that's compatible with your board. eg. @@ -32,14 +43,59 @@ $ cd boards/ice40hx8k-b-evn/yosys/ $ make ``` - ## Serial Setup +- [iCE40HX8K-B-EVN breakout](boards/ice40hx8k-b-evn/README.md) +- [Terasic DE0](boards/terasic_de0/README.md) +- [Digilent Spartan-3E Starter Board](boards/spartan3e_starterkit/README.md) +- [Blackice II](boards/blackice2/README.md) +- [Olimex iCE40HX8K with ICE40-IO](boards/olimex_ice40hx8k_evb_ice40-io/README.md) +- [TinyFPGA B2](boards/tinyfpga_b2/README.md) +- [Upduino](boards/upduino/README.md) + +## The BACKSPACE key and how to delete typos + +The Apple 1 didn't have a typical "backspace" key as we are use to today, due to the way the video display worked it couldn't move the cursor backward to erase characters. So instead it used a "rubout" character, which is the underscore character (__). This character signifies that the input buffer has been moved backwards one character (eg. "PRN__INT" would be received by the Apple 1 as "PRINT"). + +It takes a little getting used to but you'll soon get the hang of it. + +## Serial Setup - To communicate with the Apple 1 you need to use the second channel serial interface for the iCE40HX8K-B-EVN board. This should appear as a COM port on you PC. This project is configured to use the 12MHz onboard clock to generate the baud rate, and as such I've selected 19200 baud (8/N/1). +Depending on the baords you can use serial to communicate with the Apple1, some boards require a toggle to be set to select between PS/2 input and UART input. The UART by default will be set to 115200 (8/N/1). - A very very basic hardware flow control is implemented too. You should turn on CTS support as this will allow you to cut and paste code into the Woz Mon without the Apple 1 missing any bytes. +A very basic hardware flow control is implemented. You should turn on CTS support as this will allow you to cut and paste code into the Woz Mon without the Apple 1 missing any bytes. + - ## Helping +## VGA / PS/2 Setup - All PRs and suggestions happily accepted! Please any support us most welcome, and it would be good to have this as feature complete as possible with the real Apple1. I'd like to implement the cassette interface next with the basic electronics to talk to the headphone/mic jack of a mobile phone to upload and download recordings as a means to save programs. +Most boards support PS/2 input and VGA output. This is the most support method, however all output is replicated to the UART (if available) and the PS/2 keyboard input can be replaced with the UART out if the "toggle" mode buttons is selected. + +Unlike the original Apple 1 this implementation can (depending on board you are using and it's support) change the foreground and bbackground colours of the VGA output, as well as differnet scanline modes for the font. +These controls are mapped to memory locations you can tweak using WozMon and are reset back to defaults when the system is reset. + + Register | Function | Description + -------- | -------- | ----------- + 0xC000 | Font | 00 - Default + | | 01 - Vertical scanlines + | | 02 - Horizontal scanlines + | | 03 - Dot mode + 0xC001 | Foreground | 00 - Black + | | 01 - Blue + | | 02 - Green + | | 03 - Cyan + | | 04 - Red + | | 05 - Magenta + | | 06 - Yellow + | | 06 - White + 0xC002 | Background | 00 - Black + | | 01 - Blue + | | 02 - Green + | | 03 - Cyan + | | 04 - Red + | | 05 - Magenta + | | 06 - Yellow + | | 06 - White - But yes, help happily accepted! +## Helping + +All PRs and suggestions happily accepted! Please any support us most welcome, and it would be good to have this as feature complete as possible with the real Apple1. I'd like to implement the cassette interface next with the basic electronics to talk to the headphone/mic jack of a mobile phone to upload and download recordings as a means to save programs. + +But yes, help happily accepted! From 0d6de9353ef6957a0d34ff997538f2a21ec92add Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Tue, 3 Apr 2018 22:49:18 +1000 Subject: [PATCH 06/15] Added bit about capslock to main readme --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a80057..974174e 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,16 @@ $ make ## The BACKSPACE key and how to delete typos -The Apple 1 didn't have a typical "backspace" key as we are use to today, due to the way the video display worked it couldn't move the cursor backward to erase characters. So instead it used a "rubout" character, which is the underscore character (__). This character signifies that the input buffer has been moved backwards one character (eg. "PRN__INT" would be received by the Apple 1 as "PRINT"). +The Apple 1 didn't have a typical "backspace" key as we are use to today, due to the way the video display worked it couldn't move the cursor backward to erase characters. So instead it used a "rubout" character, which is the underscore character (_). This character signifies that the input buffer has been moved backwards one character (eg. `PRN_INT` would be received by the Apple 1 as `PRINT`). It takes a little getting used to but you'll soon get the hang of it. +## The Apple 1 only understands UPPERCASE characters + +If you're using the PS/2 input you don't need to be worried about this, as we automatically UPPERCASE all typed characters so WozMon can understand what you are typing. + +However if you are using the UART and a serial terminal you will need to remember to turn on your CAPSLOCK, otherwise nothing will respond as you might expect. + ## Serial Setup Depending on the baords you can use serial to communicate with the Apple1, some boards require a toggle to be set to select between PS/2 input and UART input. The UART by default will be set to 115200 (8/N/1). From a04037244b3f958a2f80d7896fead7efccc5e9ff Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Tue, 3 Apr 2018 23:06:11 +1000 Subject: [PATCH 07/15] Fix readme colour table --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 974174e..8408cdf 100644 --- a/README.md +++ b/README.md @@ -77,28 +77,28 @@ Most boards support PS/2 input and VGA output. This is the most support method, Unlike the original Apple 1 this implementation can (depending on board you are using and it's support) change the foreground and bbackground colours of the VGA output, as well as differnet scanline modes for the font. These controls are mapped to memory locations you can tweak using WozMon and are reset back to defaults when the system is reset. - Register | Function | Description - -------- | -------- | ----------- - 0xC000 | Font | 00 - Default - | | 01 - Vertical scanlines - | | 02 - Horizontal scanlines - | | 03 - Dot mode - 0xC001 | Foreground | 00 - Black - | | 01 - Blue - | | 02 - Green - | | 03 - Cyan - | | 04 - Red - | | 05 - Magenta - | | 06 - Yellow - | | 06 - White - 0xC002 | Background | 00 - Black - | | 01 - Blue - | | 02 - Green - | | 03 - Cyan - | | 04 - Red - | | 05 - Magenta - | | 06 - Yellow - | | 06 - White + | Register | Function | Value | Description | + | --- | --- | --- | --- | + | 0xC000 | Font | 00 | Default + | | Font | 01 | Vertical scanlines + | | Font | 02 | Horizontal scanlines + | | Font |03 | Dot mode + | 0xC001 | Foreground | 00 | Black + | | Foreground | 01 | Blue + | | Foreground | 02 | Green + | | Foreground | 03 | Cyan + | | Foreground | 04 | Red + | | Foreground | 05 | Magenta + | | Foreground | 06 | Yellow + | | Foreground | 06 | White + | 0xC002 | Background | 00 | Black + | | Background | 01 | Blue + | | Background | 02 | Green + | | Background | 03 | Cyan + | | Background | 04 | Red + | | Background | 05 | Magenta + | | Background | 06 | Yellow + | | Background | 06 | White ## Helping From 6af075977438b965aba91fecdb79f0b72de343bd Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Tue, 3 Apr 2018 23:07:39 +1000 Subject: [PATCH 08/15] Fix readme some more --- README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 8408cdf..4186c88 100644 --- a/README.md +++ b/README.md @@ -80,25 +80,25 @@ These controls are mapped to memory locations you can tweak using WozMon and are | Register | Function | Value | Description | | --- | --- | --- | --- | | 0xC000 | Font | 00 | Default - | | Font | 01 | Vertical scanlines - | | Font | 02 | Horizontal scanlines - | | Font |03 | Dot mode + | | | 01 | Vertical scanlines + | | | 02 | Horizontal scanlines + | | | 03 | Dot mode | 0xC001 | Foreground | 00 | Black - | | Foreground | 01 | Blue - | | Foreground | 02 | Green - | | Foreground | 03 | Cyan - | | Foreground | 04 | Red - | | Foreground | 05 | Magenta - | | Foreground | 06 | Yellow - | | Foreground | 06 | White + | | | 01 | Blue + | | | 02 | Green + | | | 03 | Cyan + | | | 04 | Red + | | | 05 | Magenta + | | | 06 | Yellow + | | | 06 | White | 0xC002 | Background | 00 | Black - | | Background | 01 | Blue - | | Background | 02 | Green - | | Background | 03 | Cyan - | | Background | 04 | Red - | | Background | 05 | Magenta - | | Background | 06 | Yellow - | | Background | 06 | White + | | | 01 | Blue + | | | 02 | Green + | | | 03 | Cyan + | | | 04 | Red + | | | 05 | Magenta + | | | 06 | Yellow + | | | 06 | White ## Helping From 13d7f412f6b4d43923b8e1bed63466ed46afa5fd Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Wed, 4 Apr 2018 11:15:15 +1000 Subject: [PATCH 09/15] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4186c88..cabd599 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ This is a basic implementation of the original Apple 1 in Verilog. It can run th Contributor supported boards (YMMV): - [Blackice II](https://www.tindie.com/products/Folknology/blackice-ii/) -- [Olimex iCE40HX8K with ICE40-IO](https://www.olimex.com/Products/FPGA/iCE40/iCE40HX1K-EVB/open-source-hardware) +- [Olimex iCE40HX8K with ICE40-IO](https://www.olimex.com/Products/FPGA/iCE40/iCE40HX8K-EVB/open-source-hardware) - [TinyFPGA B2](http://tinyfpga.com/) - [Upduino](http://gnarlygrey.atspace.cc/development-platform.html) @@ -90,7 +90,7 @@ These controls are mapped to memory locations you can tweak using WozMon and are | | | 04 | Red | | | 05 | Magenta | | | 06 | Yellow - | | | 06 | White + | | | 07 | White | 0xC002 | Background | 00 | Black | | | 01 | Blue | | | 02 | Green @@ -98,7 +98,7 @@ These controls are mapped to memory locations you can tweak using WozMon and are | | | 04 | Red | | | 05 | Magenta | | | 06 | Yellow - | | | 06 | White + | | | 07 | White ## Helping From 88b81a562f8091f5a12642162f0296b7abda47e4 Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Wed, 4 Apr 2018 11:17:25 +1000 Subject: [PATCH 10/15] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cabd599..8786cd4 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ $ cd boards/ice40hx8k-b-evn/yosys/ $ make ``` +### Board READMEs - [iCE40HX8K-B-EVN breakout](boards/ice40hx8k-b-evn/README.md) - [Terasic DE0](boards/terasic_de0/README.md) - [Digilent Spartan-3E Starter Board](boards/spartan3e_starterkit/README.md) @@ -65,7 +66,7 @@ However if you are using the UART and a serial terminal you will need to remembe ## Serial Setup -Depending on the baords you can use serial to communicate with the Apple1, some boards require a toggle to be set to select between PS/2 input and UART input. The UART by default will be set to 115200 (8/N/1). +Depending on the board you can use serial to communicate with the Apple 1, some boards require a toggle to be set to select between PS/2 input and UART input. The UART by default will be set to 115200 (8/N/1). A very basic hardware flow control is implemented. You should turn on CTS support as this will allow you to cut and paste code into the Woz Mon without the Apple 1 missing any bytes. @@ -74,7 +75,7 @@ A very basic hardware flow control is implemented. You should turn on CTS suppor Most boards support PS/2 input and VGA output. This is the most support method, however all output is replicated to the UART (if available) and the PS/2 keyboard input can be replaced with the UART out if the "toggle" mode buttons is selected. -Unlike the original Apple 1 this implementation can (depending on board you are using and it's support) change the foreground and bbackground colours of the VGA output, as well as differnet scanline modes for the font. +Unlike the original Apple 1 this implementation can (depending on board you are using and it's support) change the foreground and background colours of the VGA output, as well as differnet scanline modes for the font. These controls are mapped to memory locations you can tweak using WozMon and are reset back to defaults when the system is reset. | Register | Function | Value | Description | From 196372464202f4b749638f04c8a982aa02645e26 Mon Sep 17 00:00:00 2001 From: Jack Zielke Date: Wed, 11 Apr 2018 10:20:29 -0400 Subject: [PATCH 11/15] Fix duplicate line in matrix.txt --- software/matrix.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/software/matrix.txt b/software/matrix.txt index b4b7501..2d0c844 100644 --- a/software/matrix.txt +++ b/software/matrix.txt @@ -10,7 +10,7 @@ E000R 80 TAB 13:GOSUB 1000 90 TAB 15:GOSUB 1000 100 TAB 17:GOSUB 1000 -110 TAB 20:GOSUB 1000 +105 TAB 20:GOSUB 1000 110 TAB 23:GOSUB 1000 120 TAB 25:GOSUB 1000 130 TAB 27:GOSUB 1000 From ddbbae966f271f4616b3ec33b2bc2ff2abac2a3b Mon Sep 17 00:00:00 2001 From: Alan Garfield Date: Thu, 12 Apr 2018 22:46:36 +1000 Subject: [PATCH 12/15] Fixed olimex makefile path error --- boards/olimex_ice40hx8k_evb_ice40-io/yosys/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/olimex_ice40hx8k_evb_ice40-io/yosys/Makefile b/boards/olimex_ice40hx8k_evb_ice40-io/yosys/Makefile index 65119cf..ceb056b 100644 --- a/boards/olimex_ice40hx8k_evb_ice40-io/yosys/Makefile +++ b/boards/olimex_ice40hx8k_evb_ice40-io/yosys/Makefile @@ -1,7 +1,7 @@ DEVICE = hx8k PIN_DEF=ice40hx8k.pcf -SOURCEDIR = ../../rtl +SOURCEDIR = ../../../rtl BUILDDIR = build all: apple1 prog From 33a21554845997fdf9598ef7e9574ca14f2efa1f Mon Sep 17 00:00:00 2001 From: Rangel Ivanov Date: Sat, 5 May 2018 18:11:38 +0300 Subject: [PATCH 13/15] Fix clear screen button for olimex board Assign all the color components of the vga, so we can change colors on olimex fpga --- rtl/boards/olimex_ice40hx8k/apple1_hx8k.v | 36 ++++++++++++++++------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/rtl/boards/olimex_ice40hx8k/apple1_hx8k.v b/rtl/boards/olimex_ice40hx8k/apple1_hx8k.v index ed6e8cb..761ea38 100644 --- a/rtl/boards/olimex_ice40hx8k/apple1_hx8k.v +++ b/rtl/boards/olimex_ice40hx8k/apple1_hx8k.v @@ -47,7 +47,6 @@ module apple1_top #( output [2:0] vga_g, // green VGA signal output [2:0] vga_b, // blue VGA signal - // Debugging ports input [1:0] button // 2 buttons on board ); @@ -59,12 +58,28 @@ module apple1_top #( .clock_out(clk25), ); - wire vga_bit; + wire vga_red, vga_green, vga_blue; + assign vga_r[2:0] = {vga_red, vga_red, vga_red}; + assign vga_g[2:0] = {vga_green, vga_green, vga_green}; + assign vga_b[2:0] = {vga_blue, vga_blue, vga_blue}; - // set the monochrome base colour here.. - assign vga_r[2:0] = vga_bit ? 3'b100 : 3'b000; - assign vga_g[2:0] = vga_bit ? 3'b111 : 3'b000; - assign vga_b[2:0] = vga_bit ? 3'b100 : 3'b000; + // debounce reset button + wire reset_n; + debounce reset_button ( + .clk25(clk25), + .rst(1'b0), + .sig_in(button[0]), + .sig_out(reset_n) + ); + + // debounce clear screen button + wire clr_screen_n; + debounce clr_button ( + .clk25(clk25), + .rst(~reset_n), + .sig_in(button[1]), + .sig_out(clr_screen_n) + ); // apple one main system apple1 #( @@ -75,7 +90,7 @@ module apple1_top #( .WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME) ) my_apple1( .clk25(clk25), - .rst_n(button[0]), + .rst_n(reset_n), .uart_rx(uart_rx), .uart_tx(uart_tx), @@ -88,8 +103,9 @@ module apple1_top #( .vga_h_sync(vga_h_sync), .vga_v_sync(vga_v_sync), - .vga_red(vga_bit), - //.vga_grn(vga_bit), - //.vga_blu(vga_bit), + .vga_red(vga_red), + .vga_grn(vga_green), + .vga_blu(vga_blue), + .vga_cls(~clr_screen_n), ); endmodule From 59bbb91a8d29898a5c11fe16798a92f604fb20f4 Mon Sep 17 00:00:00 2001 From: Steve White Date: Sat, 5 May 2018 12:59:16 -0700 Subject: [PATCH 14/15] Fix syntax error on apple1 declaration by adding missing closing parentheses yosys -q -p "chparam -list; hierarchy -top apple1_top; synth_ice40 -blif build/apple1.blif" ../../../rtl/apple1.v build/pll.sv ../../../rtl/clock.v ../../../rtl/pwr_reset.v ../../../rtl/ram.v ../../../rtl/rom_wozmon.v ../../../rtl/rom_basic.v ../../../rtl/cpu/arlet_6502.v ../../../rtl/cpu/arlet/ALU.v ../../../rtl/cpu/arlet/cpu.v ../../../rtl/uart/uart.v ../../../rtl/uart/async_tx_rx.v ../../../rtl/vga/vga.v ../../../rtl/vga/vram.v ../../../rtl/vga/font_rom.v ../../../rtl/ps2keyboard/debounce.v ../../../rtl/ps2keyboard/ps2keyboard.v ../../../rtl/boards/upduino/apple1_up5k.v Warning: Replacing memory \AXYS with list of registers. See ../../../rtl/cpu/arlet/cpu.v:541 ERROR: Parser error in line ../../../rtl/boards/upduino/apple1_up5k.v:76: syntax error, unexpected TOK_ID, expecting ',' or ')' Makefile:26: recipe for target 'build/apple1.blif' failed make: *** [build/apple1.blif] Error 1 --- rtl/boards/upduino/apple1_up5k.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/boards/upduino/apple1_up5k.v b/rtl/boards/upduino/apple1_up5k.v index 3652574..d0a0313 100644 --- a/rtl/boards/upduino/apple1_up5k.v +++ b/rtl/boards/upduino/apple1_up5k.v @@ -73,7 +73,7 @@ module apple1_top #( .RAM_FILENAME (RAM_FILENAME), .VRAM_FILENAME (VRAM_FILENAME), .WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME) - my_apple1( + ) my_apple1( .clk25(clk25), .rst_n(1'b1), .uart_rx(uart_rx), From f4a450f022b268b73b0957b052895f79bd22264e Mon Sep 17 00:00:00 2001 From: Steve White Date: Sat, 5 May 2018 12:59:52 -0700 Subject: [PATCH 15/15] Remove invalid port clr_screen_btn (as I don't see any other references to it in the repo) yosys -q -p "chparam -list; hierarchy -top apple1_top; synth_ice40 -blif build/apple1.blif" ../../../rtl/apple1.v build/pll.sv ../../../rtl/clock.v ../../../rtl/pwr_reset.v ../../../rtl/ram.v ../../../rtl/rom_wozmon.v ../../../rtl/rom_basic.v ../../../rtl/cpu/arlet_6502.v ../../../rtl/cpu/arlet/ALU.v ../../../rtl/cpu/arlet/cpu.v ../../../rtl/uart/uart.v ../../../rtl/uart/async_tx_rx.v ../../../rtl/vga/vga.v ../../../rtl/vga/vram.v ../../../rtl/vga/font_rom.v ../../../rtl/ps2keyboard/debounce.v ../../../rtl/ps2keyboard/ps2keyboard.v ../../../rtl/boards/upduino/apple1_up5k.v Warning: Replacing memory \AXYS with list of registers. See ../../../rtl/cpu/arlet/cpu.v:541 ERROR: Module `$paramod$e7b6f8008bbd43376eeb102f607da77667371076\apple1' referenced in module `apple1_top' in cell `my_apple1' does not have a port named 'clr_screen_btn'. Makefile:26: recipe for target 'build/apple1.blif' failed make: *** [build/apple1.blif] Error 1 --- rtl/boards/upduino/apple1_up5k.v | 1 - 1 file changed, 1 deletion(-) diff --git a/rtl/boards/upduino/apple1_up5k.v b/rtl/boards/upduino/apple1_up5k.v index d0a0313..5a96b9c 100644 --- a/rtl/boards/upduino/apple1_up5k.v +++ b/rtl/boards/upduino/apple1_up5k.v @@ -79,7 +79,6 @@ module apple1_top #( .uart_rx(uart_rx), .uart_tx(uart_tx), .uart_cts(uart_cts), - .clr_screen_btn(1'b0), .vga_h_sync(vga_h_sync), .vga_v_sync(vga_v_sync), .vga_red(vga_red),