Fix starfield scroll speed and keyboard inputs

This commit is contained in:
jimmystones
2022-01-29 15:48:20 +00:00
parent 1af036dbb4
commit b05f4ef9cd
10 changed files with 2130 additions and 1853 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -177,7 +177,25 @@ always @(posedge clk_24) begin
if(system_menu_cs && !cpu_wr_n) menu_trigger <= 1'b0;
end
reg [25:0] frame_timer;
reg vblank_last;
always @(posedge clk_24) begin
vblank_last <= VGA_VB;
if(!VGA_VB && vblank_last)
begin
//$display("VB ended - %d", frame_timer);
frame_timer <= 26'b0;
end
else
if(VGA_VB && !vblank_last)
begin
//$display("VB started - %d", frame_timer);
frame_timer <= 26'b0;
end
else
begin
frame_timer <= frame_timer + 26'b1;
end
//if(pgrom_cs) $display("%x pgrom o %x", cpu_addr, pgrom_data_out);
//if(wkram_cs) $display("%x wkram i %x o %x w %b", cpu_addr, cpu_dout, wkram_data_out, wkram_wr);
//if(chram_cs) $display("%x chram i %x o %x w %b", cpu_addr, cpu_dout, chram_data_out, chram_wr);
@@ -191,13 +209,14 @@ always @(posedge clk_24) begin
// if(starfield1_cs) $display("starfield1 %b %b", cpu_addr, cpu_dout);
// if(starfield2_cs) $display("starfield2 %b %b", cpu_addr, cpu_dout);
// if(starfield3_cs) $display("starfield3 %b %b", cpu_addr, cpu_dout);
if(timer_cs) $display("timer: %b %x %x", timer_cs, cpu_addr, cpu_dout);
//if(!cpu_wr_n) $display("cpu_write %x %b",cpu_addr, cpu_dout);
//if(spritecollisionram_cs && !cpu_wr_n) $display("spritecollisionram %b %b %b", cpu_wr_n, cpu_addr, cpu_dout);
//if(spriteram_cs && !cpu_wr_n) $display("spriteram_cs %x %b", cpu_addr[SPRITE_RAM_WIDTH-1:0], cpu_dout);
//if(sound_cs && !cpu_wr_n) $display("sound_cs %b %b", cpu_addr, cpu_dout);
//if(music_cs && !cpu_wr_n) $display("music_cs %b %b", cpu_addr, cpu_dout);
//if(tilemapcontrol_cs) $display("tilemapcontrol_cs addr=%x dout=%x din=%x wr=%b", cpu_addr, cpu_dout, tilemapcontrol_data_out, cpu_wr_n);
//if(tilemapram_cs && !cpu_wr_n) $display("tilemapram_cs addr=%x dout=%x", cpu_addr, cpu_dout);
//if(timer_cs) $display("timer_cs wr=%b timer=%d frame_time=%d hcnt=%d vcnt=%d", ~cpu_wr_n, timer, frame_timer, hcnt, vcnt);
end
// ROM data available to CPU
@@ -438,11 +457,9 @@ localparam SD_WAIT = 0;
localparam SD_CLEAR_BEGIN = 1;
localparam SD_CLEAR = 2;
reg [2:0] sd_state;
reg vblank_last;
reg [15:0] vblank_start;
always @(posedge clk_24)
begin
vblank_last <= VGA_VB;
case(sd_state)
SD_WAIT:
begin
@@ -577,9 +594,15 @@ assign VGA_G = spr_a ? spr_g : charmap_a ? charmap_g : sf_on ? sf_star_colour :
assign VGA_B = spritedebugram_data_out_a > 8'b0 ? spritedebugram_data_out_a : spr_a ? spr_b : charmap_a ? charmap_b : sf_on ? sf_star_colour : 8'b0;
`endif
`ifndef DEBUG_SPRITE_COLLISION
`ifdef SPRITE_LAYER_HIGH
assign VGA_R = spr_a ? spr_r : charmap_a ? charmap_r : tilemap_a ? tilemap_r : sf_on ? sf_star_colour : 8'b0;
assign VGA_G = spr_a ? spr_g : charmap_a ? charmap_g : tilemap_a ? tilemap_g : sf_on ? sf_star_colour : 8'b0;
assign VGA_B = spr_a ? spr_b : charmap_a ? charmap_b : tilemap_a ? tilemap_b : sf_on ? sf_star_colour : 8'b0;
`else
assign VGA_R = charmap_a ? charmap_r : spr_a ? spr_r : tilemap_a ? tilemap_r : sf_on ? sf_star_colour : 8'b0;
assign VGA_G = charmap_a ? charmap_g : spr_a ? spr_g : tilemap_a ? tilemap_g : sf_on ? sf_star_colour : 8'b0;
assign VGA_B = charmap_a ? charmap_b : spr_a ? spr_b : tilemap_a ? tilemap_b : sf_on ? sf_star_colour : 8'b0;
`endif
`endif
// Music player

View File

@@ -335,6 +335,7 @@ void handle_codes()
{
pushhistory(6);
}
// Check for SNEK code
if (history[0] == 1 && history[1] == 1 && history[2] == 2 && history[3] == 2 && history[4] == 3 && history[5] == 4 && history[6] == 5)
{
@@ -729,6 +730,7 @@ void btntest_select()
{
if (HBLANK_RISING)
{
// If any of 1st 8 buttons is pressed
if (joystick[0] != 0)
{

396
src/inputtest/rom.asm Normal file
View File

@@ -0,0 +1,396 @@
;--------------------------------------------------------
; File Created by SDCC : free open source ANSI-C Compiler
; Version 4.0.0 #11528 (Linux)
;--------------------------------------------------------
.module os
.optsdcc -mz80
;--------------------------------------------------------
; Public variables in this module
;--------------------------------------------------------
.globl _main
.globl _app_main
.globl _app_credits
.globl _fadein
.globl _fadeout
.globl _snek_attract
.globl _snek_gameplay
.globl _start_snek_gameplay
.globl _start_snek_attract
.globl _app_zorblaxx
.globl _menu
.globl _start_menu
.globl _btntest
.globl _inputtester_advanced
.globl _inputtester_analog
.globl _inputtester_digital
.globl _start_btntest
.globl _start_inputtester_advanced
.globl _start_inputtester_analog
.globl _start_inputtester_digital
.globl _loader
.globl _musicram
.globl _sndram
.globl _tilemapram
.globl _tilemapctl
.globl _spritecollisionram
.globl _spriteram
.globl _bgcolram
.globl _fgcolram
.globl _chram
.globl _system_menu
.globl _system_pause
.globl _starfield3
.globl _starfield2
.globl _starfield1
.globl _timer
.globl _timestamp
.globl _ps2_mouse
.globl _ps2_key
.globl _spinner
.globl _paddle
.globl _analog_r
.globl _analog_l
.globl _joystick
.globl _input0
;--------------------------------------------------------
; special function registers
;--------------------------------------------------------
;--------------------------------------------------------
; ram data
;--------------------------------------------------------
.area _DATA
_input0 = 0x8000
_joystick = 0x8100
_analog_l = 0x8200
_analog_r = 0x8300
_paddle = 0x8400
_spinner = 0x8500
_ps2_key = 0x8600
_ps2_mouse = 0x8700
_timestamp = 0x8800
_timer = 0x8900
_starfield1 = 0x8a00
_starfield2 = 0x8a10
_starfield3 = 0x8a20
_system_pause = 0x8a30
_system_menu = 0x8a31
_chram = 0x9800
_fgcolram = 0xa000
_bgcolram = 0xa800
_spriteram = 0xb000
_spritecollisionram = 0xb400
_tilemapctl = 0x8c00
_tilemapram = 0x8c10
_sndram = 0x8b00
_musicram = 0x8b10
;--------------------------------------------------------
; ram data
;--------------------------------------------------------
.area _INITIALIZED
;--------------------------------------------------------
; absolute external ram data
;--------------------------------------------------------
.area _DABS (ABS)
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
.area _HOME
.area _GSINIT
.area _GSFINAL
.area _GSINIT
;--------------------------------------------------------
; Home
;--------------------------------------------------------
.area _HOME
.area _HOME
;--------------------------------------------------------
; code
;--------------------------------------------------------
.area _CODE
;os.c:38: void app_main()
; ---------------------------------
; Function app_main
; ---------------------------------
_app_main::
;os.c:40: chram_size = chram_cols * chram_rows;
ld hl,#_chram_rows + 0
ld e, (hl)
ld hl,#_chram_cols + 0
ld h, (hl)
ld l, #0x00
ld d, l
ld b, #0x08
00221$:
add hl, hl
jr NC,00222$
add hl, de
00222$:
djnz 00221$
ld (_chram_size), hl
;os.c:41: while (1)
00122$:
;os.c:43: hsync = input0 & 0x80;
ld iy, #_input0
ld a, 0 (iy)
rlc a
and a, #0x01
ld (_hsync+0), a
;os.c:44: vsync = input0 & 0x40;
ld a, 0 (iy)
and a, #0x40
ld c,a
or a,#0x00
add a, #0xff
ld a, #0x00
rla
ld (_vsync+0), a
;os.c:45: hblank = input0 & 0x20;
ld a, 0 (iy)
and a, #0x20
ld c, a
ld b, #0x00
ld a, b
or a, c
add a, #0xff
ld a, #0x00
rla
ld (_hblank+0), a
;os.c:46: vblank = CHECK_BIT(input0, INPUT_VBLANK);
ld a, 0 (iy)
and a, #0x10
ld c, a
xor a, a
cp a, c
rla
ld (_vblank+0), a
;os.c:47: switch (state)
ld iy, #_state
ld a, 0 (iy)
dec a
jp Z,00101$
ld a, 0 (iy)
sub a, #0x02
jp Z,00102$
ld a, 0 (iy)
sub a, #0x03
jp Z,00103$
ld a, 0 (iy)
sub a, #0x04
jp Z,00104$
ld a, 0 (iy)
sub a, #0x05
jp Z,00105$
ld a, 0 (iy)
sub a, #0x06
jp Z,00106$
ld a, 0 (iy)
sub a, #0x07
jr Z,00107$
ld a, 0 (iy)
sub a, #0x08
jr Z,00108$
ld a, 0 (iy)
sub a, #0x09
jr Z,00109$
ld a, 0 (iy)
sub a, #0x0a
jr Z,00110$
ld a, 0 (iy)
sub a, #0x14
jr Z,00111$
ld a, 0 (iy)
sub a, #0x16
jr Z,00112$
ld a, 0 (iy)
sub a, #0x1e
jr Z,00113$
ld a, 0 (iy)
sub a, #0x1f
jr Z,00114$
ld a, 0 (iy)
sub a, #0x28
jr Z,00116$
ld a, 0 (iy)
sub a, #0x29
jr Z,00117$
ld a, 0 (iy)
sub a, #0x2a
jr Z,00115$
ld a, 0 (iy)
sub a, #0x2b
jr Z,00118$
jp 00119$
;os.c:49: case STATE_START_INPUTTESTER:
00101$:
;os.c:50: start_inputtester_digital();
call _start_inputtester_digital
;os.c:51: break;
jp 00120$
;os.c:52: case STATE_INPUTTESTER:
00102$:
;os.c:53: inputtester_digital();
call _inputtester_digital
;os.c:54: break;
jp 00120$
;os.c:56: case STATE_START_INPUTTESTERADVANCED:
00103$:
;os.c:57: start_inputtester_advanced();
call _start_inputtester_advanced
;os.c:58: break;
jp 00120$
;os.c:59: case STATE_INPUTTESTERADVANCED:
00104$:
;os.c:60: inputtester_advanced();
call _inputtester_advanced
;os.c:61: break;
jr 00120$
;os.c:63: case STATE_START_INPUTTESTERANALOG:
00105$:
;os.c:64: start_inputtester_analog();
call _start_inputtester_analog
;os.c:65: break;
jr 00120$
;os.c:66: case STATE_INPUTTESTERANALOG:
00106$:
;os.c:67: inputtester_analog();
call _inputtester_analog
;os.c:68: break;
jr 00120$
;os.c:70: case STATE_START_BTNTEST:
00107$:
;os.c:71: start_btntest();
call _start_btntest
;os.c:72: break;
jr 00120$
;os.c:73: case STATE_BTNTEST:
00108$:
;os.c:74: btntest();
call _btntest
;os.c:75: break;
jr 00120$
;os.c:77: case STATE_START_MENU:
00109$:
;os.c:78: start_menu();
call _start_menu
;os.c:79: break;
jr 00120$
;os.c:80: case STATE_MENU:
00110$:
;os.c:81: menu();
call _menu
;os.c:82: break;
jr 00120$
;os.c:84: case STATE_FADEOUT:
00111$:
;os.c:85: fadeout();
call _fadeout
;os.c:86: break;
jr 00120$
;os.c:87: case STATE_FADEIN:
00112$:
;os.c:88: fadein();
call _fadein
;os.c:89: break;
jr 00120$
;os.c:91: case STATE_START_ATTRACT:
00113$:
;os.c:92: state = 0;
ld hl,#_state + 0
ld (hl), #0x00
;os.c:93: loader("SNEK.AZN");
ld hl, #___str_0
push hl
call _loader
pop af
;os.c:94: start_snek_attract();
call _start_snek_attract
;os.c:95: break;
jr 00120$
;os.c:96: case STATE_ATTRACT:
00114$:
;os.c:97: snek_attract();
call _snek_attract
;os.c:98: break;
jr 00120$
;os.c:99: case STATE_START_CREDITS:
00115$:
;os.c:100: app_credits();
call _app_credits
;os.c:101: break;
jr 00120$
;os.c:103: case STATE_START_GAME_SNEK:
00116$:
;os.c:104: start_snek_gameplay();
call _start_snek_gameplay
;os.c:105: break;
jr 00120$
;os.c:106: case STATE_GAME_SNEK:
00117$:
;os.c:107: snek_gameplay();
call _snek_gameplay
;os.c:108: break;
jr 00120$
;os.c:109: case STATE_START_ZORBLAXX:
00118$:
;os.c:110: state = 0;
ld hl,#_state + 0
ld (hl), #0x00
;os.c:111: loader("ZORBLAXX.AZN");
ld hl, #___str_1
push hl
call _loader
pop af
;os.c:112: app_zorblaxx();
call _app_zorblaxx
;os.c:113: break;
jr 00120$
;os.c:115: default:
00119$:
;os.c:119: loader("INPUTTESTER.AZN");
ld hl, #___str_2
push hl
call _loader
pop af
;os.c:120: start_inputtester_digital();
call _start_inputtester_digital
;os.c:125: }
00120$:
;os.c:127: hsync_last = hsync;
ld a,(#_hsync + 0)
ld iy, #_hsync_last
ld 0 (iy), a
;os.c:128: vsync_last = vsync;
ld a,(#_vsync + 0)
ld iy, #_vsync_last
ld 0 (iy), a
;os.c:129: hblank_last = hblank;
ld a,(#_hblank + 0)
ld iy, #_hblank_last
ld 0 (iy), a
;os.c:130: vblank_last = vblank;
ld a,(#_vblank + 0)
ld iy, #_vblank_last
ld 0 (iy), a
;os.c:132: }
jp 00122$
___str_0:
.ascii "SNEK.AZN"
.db 0x00
___str_1:
.ascii "ZORBLAXX.AZN"
.db 0x00
___str_2:
.ascii "INPUTTESTER.AZN"
.db 0x00
;os.c:135: void main()
; ---------------------------------
; Function main
; ---------------------------------
_main::
;os.c:137: app_main();
;os.c:138: }
jp _app_main
.area _CODE
.area _INITIALIZER
.area _CABS (ABS)

View File

@@ -164,7 +164,7 @@ void intro_loop()
// Setup starfield layer speeds
enable_starfield();
set_starfield_speed_x(0);
set_starfield_speed_y(-0.5f);
set_starfield_speed_y(-64);
// Setup title sprites
unsigned char title_sprite = 16;
@@ -329,7 +329,7 @@ void game_loop()
if (scroll_speed != scroll_speed_last)
{
scroll_speed_last = scroll_speed;
set_starfield_speed_y(scroll_speed * -0.02f);
set_starfield_speed_y(-scroll_speed * 4);
}
// Track player button press

View File

@@ -30,6 +30,7 @@ $(OUTPUT).bin: build/$(OUTPUT).ihx
srec_cat $< -intel -o $@ -binary
rm build/$(OUTPUT).ihx
mv $(OUTPUT).bin bin/$(OUTPUT).bin
mv build/$(OUTPUT).asm $(OUTPUT).asm
rm -f build/$(OUTPUT).*
clean:

View File

@@ -33,10 +33,10 @@ void disable_starfield()
starfield3[0] = 0;
}
void set_starfield_speed_x(float speed)
void set_starfield_speed_x(signed short speed)
{
unsigned char dir = (speed < 0) << 7;
unsigned short mag = (unsigned short)abs(speed * 256);
unsigned short mag = (unsigned short)abs(speed);
starfield3[1] = dir | mag >> 8;
starfield3[2] = (unsigned char)mag;
mag = mag << 1;
@@ -47,10 +47,10 @@ void set_starfield_speed_x(float speed)
starfield1[2] = (unsigned char)mag;
}
void set_starfield_speed_y(float speed)
void set_starfield_speed_y(signed short speed)
{
unsigned char dir = (speed < 0) << 7;
unsigned short mag = (unsigned short)abs(speed * 256);
unsigned short mag = (unsigned short)abs(speed);
starfield3[3] = dir | mag >> 8;
starfield3[4] = (unsigned char)mag;
mag = mag << 1;

View File

@@ -25,8 +25,8 @@ extern void enable_starfield();
extern void disable_starfield();
extern void set_starfield_speed_x(float speed);
extern void set_starfield_speed_x(signed short speed);
extern void set_starfield_speed_y(float speed);
extern void set_starfield_speed_y(signed short speed);
#endif

View File

@@ -584,7 +584,7 @@ void SimInput::Read() {
if (m_keyboardState_last[k] != m_keyboardState[k]) {
unsigned int ext = ev2ps2[k] & EXT;
//fprintf(stderr, "ev2ps2[k] = %x ext = %x temp = %x\n", ev2ps2[k], ext, EXT | 0x6b);
SimInput_PS2KeyEvent evt = SimInput_PS2KeyEvent(k, m_keyboardState[k], ext);
SimInput_PS2KeyEvent evt = SimInput_PS2KeyEvent(k, m_keyboardState[k], ext, ev2ps2[k]);
keyEvents.push(evt);
}
m_keyboardState_last[k] = m_keyboardState[k];
@@ -631,10 +631,11 @@ void SimInput::BeforeEval()
if (keyEvents.size() > 0) {
// Get chunk from queue
SimInput_PS2KeyEvent evt = keyEvents.front();
//fprintf(stderr, "evt = %x ext = %d \n", evt.code, evt.extended);
keyEvents.pop();
ps2_key_temp = ev2ps2[evt.code];
//ps2_key_temp = ev2ps2[evt.code];
ps2_key_temp = evt.mapped;
/*fprintf(stderr, "evt = %x ext = %d key = %d \n", evt.code, evt.extended, evt.mapped);*/
if (evt.extended) { ps2_key_temp |= (1UL << 8); }
if (evt.pressed) { ps2_key_temp |= (1UL << 9); }

View File

@@ -15,11 +15,13 @@ public:
char code;
bool pressed;
bool extended;
unsigned int mapped;
SimInput_PS2KeyEvent(char code, bool pressed, bool extended) {
SimInput_PS2KeyEvent(char code, bool pressed, bool extended, unsigned int mapped) {
this->code = code;
this->pressed = pressed;
this->extended = extended;
this->mapped = mapped;
}
};