mirror of
https://github.com/MiSTer-devel/InputTest_MiSTer.git
synced 2026-05-17 03:03:52 +00:00
Merge branch 'JimmyStones:main' into main
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -51,3 +51,4 @@ src/os.map
|
||||
src/os.noi
|
||||
src/os.sym
|
||||
.vscode/settings.json
|
||||
verilator/imgui.ini
|
||||
|
||||
32
InputTest.sv
32
InputTest.sv
@@ -1,7 +1,23 @@
|
||||
//============================================================================
|
||||
// InputTest_MiSTer
|
||||
// Copyright (c) 2021 jimmystones
|
||||
//============================================================================
|
||||
/*============================================================================
|
||||
MiSTer test harness - emu module
|
||||
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
module emu
|
||||
(
|
||||
@@ -194,7 +210,7 @@ localparam CONF_STR = {
|
||||
"-;",
|
||||
"F0,BIN,Load BIOS",
|
||||
"-;",
|
||||
"J1,A,B,C,X,Y,Z,L,R,Select,Start;",
|
||||
"J1,A,B,X,Y,L,R,Select,Start,C,Z;",
|
||||
"V,v",`BUILD_DATE
|
||||
};
|
||||
|
||||
@@ -204,13 +220,10 @@ wire forced_scandoubler;
|
||||
wire direct_video;
|
||||
|
||||
wire ioctl_download;
|
||||
wire ioctl_upload;
|
||||
wire ioctl_wr;
|
||||
wire [24:0] ioctl_addr;
|
||||
wire [7:0] ioctl_dout;
|
||||
wire [7:0] ioctl_din;
|
||||
wire [7:0] ioctl_index;
|
||||
wire ioctl_wait;
|
||||
|
||||
wire [31:0] joystick_0;
|
||||
wire [31:0] joystick_1;
|
||||
@@ -255,13 +268,10 @@ hps_io #(.CONF_STR(CONF_STR)) hps_io
|
||||
.direct_video(direct_video),
|
||||
|
||||
.ioctl_download(ioctl_download),
|
||||
.ioctl_upload(ioctl_upload),
|
||||
.ioctl_wr(ioctl_wr),
|
||||
.ioctl_addr(ioctl_addr),
|
||||
.ioctl_dout(ioctl_dout),
|
||||
.ioctl_din(ioctl_din),
|
||||
.ioctl_index(ioctl_index),
|
||||
.ioctl_wait(ioctl_wait),
|
||||
|
||||
.joystick_0(joystick_0),
|
||||
.joystick_1(joystick_1),
|
||||
|
||||
35
README.MD
35
README.MD
@@ -1,4 +1,4 @@
|
||||
# InputTest_MiSTer
|
||||
# MiSTer test harness
|
||||
|
||||
## Overview
|
||||
|
||||
@@ -6,36 +6,38 @@ A custom mini-system running an input test utility. Shows all standard HPS sour
|
||||
|
||||
## Hardware
|
||||
|
||||
A simple bespoke (i.e. I made it up with no real plan) 8-bit system with a 40x30 character display, each character can be set to one of 256 colours. No sound capabilities.
|
||||
A simple bespoke (i.e. I made it up with no real plan) 8-bit system with a 40x30 character display, each character can be set to one of 256 colours. No sound capabilities. All relevant MiSTer inputs are mapped into memory regions.
|
||||
|
||||
### Components
|
||||
- Z80 CPU (tv80 by Guy Hutchison, based on VHDL T80 core by Daniel Wallner)
|
||||
- jtframe_vtimer for VGA timing (from JTFRAME by Jotego)
|
||||
- jtframe_vtimer for VGA timing (from JTFRAME (https://github.com/jotego/jtframe) by Jotego)
|
||||
- jtframe_cen24 for clock enables (from JTFRAME (https://github.com/jotego/jtframe) by Jotego)
|
||||
- 16Kb program ROM (port 1 cpu, port 2 download)
|
||||
- 16Kb work RAM (port 1 cpu)
|
||||
- 2Kb character ROM (port 1 cpu, port 2 download)
|
||||
- 2Kb character RAM (port 1 cpu, port 2 graphics)
|
||||
- 2Kb colour RAM (port 1 cpu, port 2 graphics)
|
||||
- 5 Memory-mapped IO regions (all read-only). _Yes I know about MREQ but SFRs turned out to be annoying in sdcc so :)_
|
||||
- 7 Memory-mapped IO regions (all read-only). _Yes I know about MREQ but SFRs turned out to be annoying in sdcc so :)_
|
||||
- Hardware state (H/V Sync, H/V Blank etc) (8 bytes)
|
||||
- joystick_5->0 from HPS (192 bytes)
|
||||
- joystick_analog_5->0 from HPS (96 bytes)
|
||||
- paddle_5->0 from HPS (48 bytes)
|
||||
- spinner_5->0 from HPS (96 bytes)
|
||||
- ps2_key from HPS (11 bytes)
|
||||
- ps2_mouse from HPS (48 bytes, combination of ps2_mouse and ps2_mouseext with some padding to align bytes)
|
||||
|
||||
### Memory Map
|
||||
Start|End|Length|Name
|
||||
---|---|---|---
|
||||
0x0000|0x3FFF|0x4000|Program ROM
|
||||
0x4000|0x47FF|0x0800|Char ROM
|
||||
0x6000|0x6000|0x0001|System inputs (video timings etc)
|
||||
0x6000|0x6000|0x0001|System inputs (video signals)
|
||||
0x7000|0x70BF|0x00C0|Joystick inputs
|
||||
0x7100|0x715F|0x0060|Analog inputs
|
||||
0x7200|0x722F|0x0030|Paddle inputs
|
||||
0x7300|0x735F|0x0060|Spinner inputs
|
||||
0x7400|0x740B|0x000C|PS2 key
|
||||
0x7500|0x7530|0x0031|PS2 mouse
|
||||
|
||||
0x7400|0x740B|0x000C|PS2 keyboard input
|
||||
0x7500|0x752F|0x0030|PS2 mouse input
|
||||
0x8000|0x87FF|0x0800|Char RAM
|
||||
0x8800|0x8FFF|0x0800|Colour RAM
|
||||
0xC000|0xFFFF|0x4000|Work RAM
|
||||
@@ -44,15 +46,16 @@ Start|End|Length|Name
|
||||
|
||||
/src contains a C program compiled to Z80 assembly using sdcc. It reads and displays all available input values once every vblank, and also does some other things ;)
|
||||
|
||||
### C source files
|
||||
File|Description
|
||||
---|---
|
||||
/src/sys.c|Memory maps and global declarations
|
||||
/src/ui.c|Character map drawing functions
|
||||
/src/os.c|Main program
|
||||
All required ROMs (compiled program and default MiSTer font) are built into this core. It also supports hot loading of binary OS ROM files for easier development.
|
||||
|
||||
### ROMS
|
||||
All required ROMs (compiled program and default MiSTer font) are built into this core.
|
||||
### Building the OS
|
||||
|
||||
#### Required packages
|
||||
- `sdcc`
|
||||
- `srecord`
|
||||
#### Build steps
|
||||
- Run `make` in `/src/Makefile` to create binary ROM
|
||||
- Run `od -An -t x1 -v src/os.bin > rtl/rom.hex` to create hex version of ROM for Quartus build
|
||||
|
||||
## License
|
||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
BIN
release/InputTest_20210629.rbf
Normal file
BIN
release/InputTest_20210629.rbf
Normal file
Binary file not shown.
34
rtl/dpram.v
34
rtl/dpram.v
@@ -1,3 +1,24 @@
|
||||
/*============================================================================
|
||||
Generic dual-port RAM module
|
||||
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
module dpram #(
|
||||
parameter address_width = 10,
|
||||
parameter data_width = 8,
|
||||
@@ -19,7 +40,7 @@ module dpram #(
|
||||
initial begin
|
||||
if (init_file>0)
|
||||
begin
|
||||
$display("Loading rom:");
|
||||
$display("Loading dpram from file:");
|
||||
$display(init_file);
|
||||
$readmemh(init_file, mem);
|
||||
end
|
||||
@@ -28,17 +49,6 @@ end
|
||||
localparam ramLength = (2**address_width);
|
||||
reg [data_width-1:0] mem [ramLength-1:0];
|
||||
|
||||
// `ifdef SIMULATION
|
||||
// integer j;
|
||||
// initial
|
||||
// begin
|
||||
// for (j = 0; j < ramLength; j = j + 1)
|
||||
// begin
|
||||
// mem[j] = 0;
|
||||
// end
|
||||
// end
|
||||
// `endif
|
||||
|
||||
always @(posedge clock_a) begin
|
||||
q_a <= mem[address_a];
|
||||
if(wren_a) begin
|
||||
|
||||
32
rtl/spram.v
32
rtl/spram.v
@@ -1,3 +1,24 @@
|
||||
/*============================================================================
|
||||
Generic single-port RAM module
|
||||
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
module spram #(
|
||||
parameter address_width = 10,
|
||||
parameter data_width = 8
|
||||
@@ -12,17 +33,6 @@ module spram #(
|
||||
localparam ramLength = (2**address_width);
|
||||
reg [data_width-1:0] mem [ramLength-1:0];
|
||||
|
||||
// `ifdef SIMULATION
|
||||
// integer j;
|
||||
// initial
|
||||
// begin
|
||||
// for (j = 0; j < ramLength; j = j + 1)
|
||||
// begin
|
||||
// mem[j] = 0;
|
||||
// end
|
||||
// end
|
||||
// `endif
|
||||
|
||||
always @(posedge clock) begin
|
||||
q <= mem[address];
|
||||
if(wren) begin
|
||||
|
||||
21
rtl/system.v
21
rtl/system.v
@@ -1,4 +1,25 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*============================================================================
|
||||
MiSTer test harness - System module
|
||||
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
module system (
|
||||
input clk_sys,
|
||||
input ce_pix,
|
||||
|
||||
246
src/os.c
246
src/os.c
@@ -1,3 +1,24 @@
|
||||
/*============================================================================
|
||||
MiSTer test harness OS - Main application
|
||||
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
@@ -5,16 +26,19 @@
|
||||
#include "ui.c"
|
||||
#include "ps2.c"
|
||||
|
||||
unsigned char hsync;
|
||||
unsigned char hsync_last;
|
||||
unsigned char vsync;
|
||||
unsigned char vsync_last;
|
||||
bool hsync;
|
||||
bool hsync_last;
|
||||
bool vsync;
|
||||
bool vsync_last;
|
||||
|
||||
// Draw static elements for input test page
|
||||
void page_inputs()
|
||||
{
|
||||
clear_chars(0);
|
||||
page_border(0b00000111);
|
||||
write_string("RLDUABCXYZLRsS", 0xFF, 7, 3);
|
||||
|
||||
write_string("- MiSTer Input Tester -", 0b11100011, 8, 1);
|
||||
write_string("RLDUABXYLRsSCZ", 0xFF, 7, 3);
|
||||
write_string("AX", 0xFF, 26, 3);
|
||||
write_string("AY", 0xFF, 31, 3);
|
||||
|
||||
@@ -33,14 +57,11 @@ void page_inputs()
|
||||
|
||||
// write_string("EXT PRS SHF SCN ASC CHR", 0xFF, 6, 18);
|
||||
write_string("CON", 0xFF, 2, 18);
|
||||
|
||||
}
|
||||
|
||||
char color = 0xAB;
|
||||
|
||||
// Application state
|
||||
char state = 0;
|
||||
char nextstate = 0;
|
||||
|
||||
// state = 0 - inputtester
|
||||
// state = 1 - fadeout
|
||||
// state = 2 - fadein
|
||||
@@ -50,35 +71,62 @@ char nextstate = 0;
|
||||
// state = 7 - startattract
|
||||
// state = 8 - attract
|
||||
|
||||
char movefreqinit = 14;
|
||||
|
||||
char movefreqdecfreq = 200;
|
||||
char movefreqdectimer = 0;
|
||||
|
||||
char movefreq = 0;
|
||||
char movetimer = 0;
|
||||
|
||||
// SNEK variables
|
||||
unsigned char movefreqinit = 14;
|
||||
unsigned char movefreqdecfreq = 200;
|
||||
unsigned char movefreqdectimer = 0;
|
||||
unsigned char movefreq = 0;
|
||||
unsigned char movetimer = 0;
|
||||
signed int x = 20;
|
||||
signed int y = 15;
|
||||
|
||||
signed char xd = 0;
|
||||
signed char yd = 1;
|
||||
|
||||
signed char nxd = 0;
|
||||
signed char nyd = 1;
|
||||
unsigned int length = 0;
|
||||
unsigned char playerchar = 83;
|
||||
|
||||
char playerchar = 83;
|
||||
char fade = 0;
|
||||
char fadetimer = 0;
|
||||
char fadefreq = 4;
|
||||
// Fade in/out variables
|
||||
unsigned char fade = 0;
|
||||
unsigned char fadetimer = 0;
|
||||
unsigned char fadefreq = 4;
|
||||
|
||||
// Attract mode variables
|
||||
unsigned char attractstate = 0;
|
||||
|
||||
// Input tester variables
|
||||
unsigned char inputindex = 0;
|
||||
unsigned char con_x; // Console cursor X position
|
||||
unsigned char con_y; // Console cursor X position
|
||||
unsigned char con_l = 2; // Console left edge X
|
||||
unsigned char con_t = 20; // Console top edge Y
|
||||
unsigned char con_r = 37; // Console right edge X
|
||||
unsigned char con_b = 37; // Console bottom edge Y
|
||||
bool con_cursor;
|
||||
unsigned char con_cursortimer = 1;
|
||||
unsigned char con_cursorfreq = 30;
|
||||
|
||||
// DPAD tracker
|
||||
bool bdown_left = 0;
|
||||
bool bdown_left_last = 0;
|
||||
bool bdown_right = 0;
|
||||
bool bdown_right_last = 0;
|
||||
bool bdown_up = 0;
|
||||
bool bdown_up_last = 0;
|
||||
bool bdown_down = 0;
|
||||
bool bdown_down_last = 0;
|
||||
char history[4];
|
||||
|
||||
// Initialise inputtester state and draw static elements
|
||||
void start_inputtester()
|
||||
{
|
||||
page_inputs();
|
||||
state = 1;
|
||||
con_x = con_l;
|
||||
con_y = con_t;
|
||||
}
|
||||
|
||||
// Initialise fadeout state
|
||||
void start_fadeout()
|
||||
{
|
||||
state = 2;
|
||||
@@ -86,6 +134,7 @@ void start_fadeout()
|
||||
fade = 0;
|
||||
}
|
||||
|
||||
// Initialise fadein state
|
||||
void start_fadein()
|
||||
{
|
||||
state = 3;
|
||||
@@ -93,8 +142,7 @@ void start_fadein()
|
||||
fade = 15;
|
||||
}
|
||||
|
||||
char attractstate = 0;
|
||||
|
||||
// Initialise attract state and draw static elements
|
||||
void start_attract()
|
||||
{
|
||||
state = 7;
|
||||
@@ -106,6 +154,7 @@ void start_attract()
|
||||
movetimer = 1;
|
||||
}
|
||||
|
||||
// Initialise attract state and draw static elements
|
||||
void start_gameplay()
|
||||
{
|
||||
state = 5;
|
||||
@@ -126,6 +175,7 @@ void start_gameplay()
|
||||
movetimer = movefreq;
|
||||
}
|
||||
|
||||
// Fade out state
|
||||
void fadeout()
|
||||
{
|
||||
if (vsync && !vsync_last)
|
||||
@@ -144,6 +194,7 @@ void fadeout()
|
||||
}
|
||||
}
|
||||
|
||||
// Fade in state
|
||||
void fadein()
|
||||
{
|
||||
if (vsync && !vsync_last)
|
||||
@@ -162,17 +213,7 @@ void fadein()
|
||||
}
|
||||
}
|
||||
|
||||
char bdown_left = 0;
|
||||
char bdown_left_last = 0;
|
||||
char bdown_right = 0;
|
||||
char bdown_right_last = 0;
|
||||
char bdown_up = 0;
|
||||
char bdown_up_last = 0;
|
||||
char bdown_down = 0;
|
||||
char bdown_down_last = 0;
|
||||
|
||||
char history[4];
|
||||
|
||||
// Rotate DPAD direction history and push new entry
|
||||
void pushhistory(char new)
|
||||
{
|
||||
for (char h = 1; h < 4; h++)
|
||||
@@ -182,36 +223,24 @@ void pushhistory(char new)
|
||||
history[3] = new;
|
||||
}
|
||||
|
||||
char lastbufferlen = 0;
|
||||
char inputindex = 0;
|
||||
char fps;
|
||||
char con_x; // Console cursor X position
|
||||
char con_y; // Console cursor X position
|
||||
char con_l = 2; // Console left edge X
|
||||
char con_t = 21; // Console top edge Y
|
||||
char con_r = 37; // Console right edge X
|
||||
char con_b = 37; // Console bottom edge Y
|
||||
|
||||
// Input tester state
|
||||
void inputtester()
|
||||
{
|
||||
hsync = input0 & 0x80;
|
||||
vsync = input0 & 0x40;
|
||||
|
||||
// Handle PS/2 inputs whenever possible to improve latency
|
||||
handle_ps2();
|
||||
|
||||
if (hsync && !hsync_last)
|
||||
{
|
||||
|
||||
// Track input history of P1 DPAD for secret codes!
|
||||
bdown_up_last = bdown_up;
|
||||
bdown_down_last = bdown_down;
|
||||
bdown_left_last = bdown_left;
|
||||
bdown_right_last = bdown_right;
|
||||
|
||||
bdown_up = joystick[0] & 0b00001000;
|
||||
bdown_down = joystick[0] & 0b00000100;
|
||||
bdown_left = joystick[0] & 0b00000010;
|
||||
bdown_right = joystick[0] & 0b00000001;
|
||||
|
||||
bdown_up = CHECK_BIT(joystick[0], 3);
|
||||
bdown_down = CHECK_BIT(joystick[0], 2);
|
||||
bdown_left = CHECK_BIT(joystick[0], 1);
|
||||
bdown_right = CHECK_BIT(joystick[0], 0);
|
||||
if (!bdown_up && bdown_up_last)
|
||||
{
|
||||
pushhistory(1);
|
||||
@@ -232,18 +261,14 @@ void inputtester()
|
||||
|
||||
if (vsync && !vsync_last)
|
||||
{
|
||||
// Rotate index of inputs to show this loop
|
||||
inputindex++;
|
||||
if (inputindex == 6)
|
||||
{
|
||||
inputindex = 0;
|
||||
}
|
||||
color++;
|
||||
fps++;
|
||||
write_string("- MiSTer Input Tester -", color, 8, 1);
|
||||
write_stringf("%d", 0xbb, 0, 1, fps);
|
||||
|
||||
// char hstr[10];
|
||||
// sprintf(hstr, "%d %d %d %d", history[0], history[1], history[2], history[3]);
|
||||
// Check for SNEK code
|
||||
if (history[0] == 4 && history[1] == 2 && history[2] == 3 && history[3] == 1)
|
||||
{
|
||||
nextstate = 6;
|
||||
@@ -251,9 +276,9 @@ void inputtester()
|
||||
start_fadeout();
|
||||
return;
|
||||
}
|
||||
// write_string(hstr, 0xFF, 6, 2);
|
||||
|
||||
char x = 7;
|
||||
// Draw joystick inputs
|
||||
char x = 6;
|
||||
char y = 4 + inputindex;
|
||||
char inputoffset = (inputindex * 32);
|
||||
for (char b = 0; b < 2; b++)
|
||||
@@ -261,92 +286,107 @@ void inputtester()
|
||||
char m = 0b00000001;
|
||||
for (char i = 0; i < 8; i++)
|
||||
{
|
||||
//(b * 8);
|
||||
x++;
|
||||
// for (inputindex = 0; inputindex < 6; inputindex++)
|
||||
// {
|
||||
write_char((joystick[(b * 8) + inputoffset] & m) ? asc_1 : asc_0, 0xFF, x, y);
|
||||
// }
|
||||
m <<= 1;
|
||||
}
|
||||
}
|
||||
|
||||
y = 4;
|
||||
// ANALOG
|
||||
// Draw analog inputs
|
||||
char m = 0b00000001;
|
||||
char stra[10];
|
||||
// for (inputindex = 0; inputindex < 6; inputindex++)
|
||||
// {
|
||||
signed char jx = analog[(inputindex * 16)];
|
||||
signed char jy = analog[(inputindex * 16) + 8];
|
||||
|
||||
sprintf(stra, "%4d %4d", jx, jy);
|
||||
write_string(stra, 0xFF, 24, y + inputindex);
|
||||
m <<= 1;
|
||||
// }
|
||||
|
||||
// PADDLE
|
||||
// Draw paddle inputs
|
||||
y = 11;
|
||||
m = 0b00000001;
|
||||
char strp[3];
|
||||
// for (inputindex = 0; inputindex < 6; inputindex++)
|
||||
// {
|
||||
char px = paddle[(inputindex * 8)];
|
||||
sprintf(strp, "%4d", px);
|
||||
write_string(strp, 0xFF, 6, y + inputindex);
|
||||
m <<= 1;
|
||||
// }
|
||||
|
||||
// SPINNER
|
||||
// Draw spinner inputs
|
||||
y = 11;
|
||||
m = 0b00000001;
|
||||
// for (j = 0; j < 6; j++)
|
||||
// {
|
||||
signed char sx = spinner[(inputindex * 16)];
|
||||
write_stringf("%4d", 0xFF, 17, y + inputindex, sx);
|
||||
m <<= 1;
|
||||
// }
|
||||
|
||||
// KEYBOARD
|
||||
// write_stringf("%3d", 0xFF, 6, 19, kbd_extend);
|
||||
// write_stringf("%3d", 0xFF, 10, 19, kbd_pressed);
|
||||
// write_stringf("%3d", 0xFF, 14, 19, kbd_shift);
|
||||
// write_stringf("%3d", 0xFF, 18, 19, kbd_lastscan);
|
||||
// write_stringf("%3d", 0xFF, 22, 19, kbd_lastascii);
|
||||
// write_char(kbd_lastascii, 0xFF, 26, 19);
|
||||
|
||||
// Keyboard test console
|
||||
if (kbd_buffer_len > 0)
|
||||
{
|
||||
// Clear existing cursor if visible
|
||||
if (con_cursor)
|
||||
{
|
||||
write_char(' ', 0xFF, con_x, con_y);
|
||||
}
|
||||
// Write characters in buffer
|
||||
for (char k = 0; k < kbd_buffer_len; k++)
|
||||
{
|
||||
write_char(kbd_buffer[k], 0xFF, con_x, con_y);
|
||||
con_x++;
|
||||
if (con_x > con_r)
|
||||
if (kbd_buffer[k] == '\n')
|
||||
{
|
||||
// New line
|
||||
con_x = con_l;
|
||||
con_y++;
|
||||
if (con_y > con_b)
|
||||
{
|
||||
// Wrap to top
|
||||
con_y = con_t;
|
||||
}
|
||||
}
|
||||
else if (kbd_buffer[k] == '\b')
|
||||
{
|
||||
// Backspace - only if not at beginning of line
|
||||
if (con_x > con_l)
|
||||
{
|
||||
con_x--;
|
||||
// Clear existing character
|
||||
write_char(' ', 0xFF, con_x, con_y);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Write character
|
||||
write_char(kbd_buffer[k], 0xFF, con_x, con_y);
|
||||
// Move cursor right
|
||||
con_x++;
|
||||
if (con_x > con_r)
|
||||
{
|
||||
// New line
|
||||
con_x = con_l;
|
||||
con_y++;
|
||||
if (con_y > con_b)
|
||||
{
|
||||
// Wrap to top
|
||||
con_y = con_t;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Clear buffer and enable cursor
|
||||
kbd_buffer_len = 0;
|
||||
con_cursor = 0;
|
||||
con_cursortimer = 1;
|
||||
}
|
||||
|
||||
// MOUSE
|
||||
// write_stringf("%3d", 0xFF, 6, 23, mse_a1);
|
||||
// write_stringf("%3d", 0xFF, 10, 23, mse_a2);
|
||||
// write_stringf("%3d", 0xFF, 14, 23, mse_a3);
|
||||
|
||||
// write_bits(ps2_mouse, 8, 0, 3, 0xFF, 6, 25);
|
||||
// write_bits(ps2_mouse, 8, 3, 3, 0xFF, 6, 27);
|
||||
// Cursor blink timer
|
||||
con_cursortimer--;
|
||||
if (con_cursortimer <= 0)
|
||||
{
|
||||
con_cursor = !con_cursor;
|
||||
con_cursortimer = con_cursorfreq;
|
||||
write_char(con_cursor ? '|' : ' ', 0xFF, con_x, con_y);
|
||||
}
|
||||
}
|
||||
|
||||
hsync_last = hsync;
|
||||
vsync_last = vsync;
|
||||
}
|
||||
|
||||
// SNEK - gameplay state
|
||||
void gameplay()
|
||||
{
|
||||
|
||||
@@ -420,6 +460,7 @@ void gameplay()
|
||||
}
|
||||
}
|
||||
|
||||
// SNEK - attract state
|
||||
void attract()
|
||||
{
|
||||
|
||||
@@ -443,11 +484,10 @@ void attract()
|
||||
}
|
||||
}
|
||||
|
||||
// Main entry and state machine
|
||||
void main()
|
||||
{
|
||||
chram_size = chram_cols * chram_rows;
|
||||
con_x = con_l;
|
||||
con_y = con_t;
|
||||
|
||||
while (1)
|
||||
{
|
||||
|
||||
30
src/ps2.c
30
src/ps2.c
@@ -1,3 +1,24 @@
|
||||
/*============================================================================
|
||||
MiSTer test harness OS - PS/2 interface functions
|
||||
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
#include "sys.c"
|
||||
|
||||
// COMMAND KEYS
|
||||
@@ -148,12 +169,19 @@ char kbd_UK[256] =
|
||||
0, 0, // 0x57
|
||||
'+', '=', // 0x58
|
||||
0, 0, // 0x59 (RSHIFT)
|
||||
0, 0, // 0x5a (ENTER)
|
||||
'\n', '\n',// 0x5a (ENTER)
|
||||
'}', ']', // 0x5b
|
||||
0, 0, // 0x5c
|
||||
'|', '\\', // 0x5d
|
||||
0, 0, // 0x5e
|
||||
0, 0, // 0x5f
|
||||
0, 0, // 0x60
|
||||
0, 0, // 0x61
|
||||
0, 0, // 0x62
|
||||
0, 0, // 0x63
|
||||
0, 0, // 0x64
|
||||
0, 0, // 0x65
|
||||
'\b', '\b',// 0x66
|
||||
0, 0};
|
||||
|
||||
char kbd_in[2];
|
||||
|
||||
21
src/sys.c
21
src/sys.c
@@ -1,3 +1,24 @@
|
||||
/*============================================================================
|
||||
MiSTer test harness OS - System interface functions
|
||||
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
21
src/ui.c
21
src/ui.c
@@ -1,3 +1,24 @@
|
||||
/*============================================================================
|
||||
MiSTer test harness OS - User interface functions
|
||||
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
#pragma once
|
||||
#include "sys.c"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ V = verilator
|
||||
#V = /usr/local/src/verilator-3.876/bin/verilator
|
||||
COSIM = n
|
||||
|
||||
TOP = --top-module top
|
||||
TOP = --top-module emu
|
||||
RTL = ../rtl
|
||||
V_INC = +incdir+$(RTL)
|
||||
|
||||
|
||||
@@ -44,8 +44,8 @@ Size=553,169
|
||||
Collapsed=0
|
||||
|
||||
[Window][WKRAM Editor]
|
||||
Pos=5,626
|
||||
Size=540,370
|
||||
Pos=5,624
|
||||
Size=549,372
|
||||
Collapsed=0
|
||||
|
||||
[Window][CHRAM Editor]
|
||||
|
||||
@@ -1,9 +1,29 @@
|
||||
`timescale 1ns / 1ps
|
||||
/*============================================================================
|
||||
MiSTer test harness - Verilator emu module
|
||||
|
||||
module top(
|
||||
Author: Jim Gregory - https://github.com/JimmyStones/
|
||||
Version: 0.1
|
||||
Date: 2021-06-29
|
||||
|
||||
input clk_sys/*verilator public_flat*/,
|
||||
input reset/*verilator public_flat*/,
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
===========================================================================*/
|
||||
|
||||
module emu (
|
||||
|
||||
input clk_sys,
|
||||
input reset,
|
||||
|
||||
input [31:0] joystick_0,
|
||||
input [31:0] joystick_1,
|
||||
@@ -41,9 +61,9 @@ module top(
|
||||
input [24:0] ps2_mouse,
|
||||
input [15:0] ps2_mouse_ext, // 15:8 - reserved(additional buttons), 7:0 - wheel movements
|
||||
|
||||
output [7:0] VGA_R/*verilator public_flat*/,
|
||||
output [7:0] VGA_G/*verilator public_flat*/,
|
||||
output [7:0] VGA_B/*verilator public_flat*/,
|
||||
output [7:0] VGA_R,
|
||||
output [7:0] VGA_G,
|
||||
output [7:0] VGA_B,
|
||||
|
||||
output VGA_HS,
|
||||
output VGA_VS,
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#verilator -cc -exe --public --compiler msvc --converge-limit 2000 -Wno-WIDTH -Wno-IMPLICIT -Wno-MODDUP -Wno-UNSIGNED -Wno-CASEINCOMPLETE -Wno-CASEX -Wno-SYMRSVDWORD -Wno-COMBDLY -Wno-INITIALDLY -Wno-BLKANDNBLK -Wno-UNOPTFLAT -Wno-SELRANGE -Wno-CMPCONST -Wno-CASEOVERLAP -Wno-PINMISSING --top-module top sim.v \
|
||||
verilator -cc -exe --public --compiler msvc +define+SIMULATION=1 --converge-limit 2000 --top-module top sim.v \
|
||||
verilator -cc -exe --public --compiler msvc +define+SIMULATION=1 --converge-limit 2000 --top-module emu sim.v \
|
||||
../rtl/dpram.v \
|
||||
../rtl/spram.v \
|
||||
../rtl/JTFRAME/jtframe_vtimer.v \
|
||||
|
||||
Reference in New Issue
Block a user