mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-21 23:30:58 +00:00
local storage editor
This commit is contained in:
parent
48baf73ecb
commit
298ea62476
65
editstorage.html
Normal file
65
editstorage.html
Normal file
@ -0,0 +1,65 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>8bitworkshop</title>
|
||||
<link rel="stylesheet" href="css/ui.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h3>8bitworkshop Local Storage Editor</h3>
|
||||
<p>
|
||||
<select id="storageitems" size="20">
|
||||
</select>
|
||||
</p><p>
|
||||
<button id="deleteitem">Delete Selected Item</button>
|
||||
</p>
|
||||
|
||||
<script src="jquery/jquery-2.2.3.min.js"></script>
|
||||
|
||||
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
|
||||
<script src="bootstrap/js/bootstrap.min.js"></script>
|
||||
<link rel="stylesheet" href="bootstrap/css/bootstrap-tour.min.css">
|
||||
<script src="bootstrap/js/bootstrap-tour.min.js"></script>
|
||||
|
||||
<script src="codemirror/lib/codemirror.js"></script>
|
||||
|
||||
<script src="src/util.js"></script>
|
||||
<script src="src/ui.js"></script>
|
||||
<!-- <script src="src/audio/votrax.js"></script> -->
|
||||
|
||||
<script>
|
||||
|
||||
var storagelist = $("#storageitems");
|
||||
var items = getBiggestItems(localStorage);
|
||||
for (var i=items.length-1; i>=0; i--) {
|
||||
var item = items[i];
|
||||
var option = new Option(item[1] + " (" + item[0] + " bytes )", item[1]);
|
||||
storagelist.append(option);
|
||||
}
|
||||
|
||||
$("#deleteitem").click(function(e) {
|
||||
var key = storagelist.find(":selected").val();
|
||||
console.log(key);
|
||||
if (key) {
|
||||
if (confirm("Delete " + key + " from local storage (make sure you have any edits backed up!)")) {
|
||||
localStorage.removeItem(key);
|
||||
window.location = location;
|
||||
}
|
||||
} else {
|
||||
alert("Please select an item first");
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', 'UA-54497476-9', 'auto');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
</html>
|
53
presets/verilog/ball_slip_counter.v
Normal file
53
presets/verilog/ball_slip_counter.v
Normal file
@ -0,0 +1,53 @@
|
||||
`include "hvsync_generator.v"
|
||||
|
||||
module ball_paddle_top(clk, reset, hsync, vsync, rgb);
|
||||
|
||||
input clk;
|
||||
input reset;
|
||||
output hsync, vsync;
|
||||
output [2:0] rgb;
|
||||
wire display_on;
|
||||
wire [8:0] hpos;
|
||||
wire [8:0] vpos;
|
||||
|
||||
reg [7:0] ball_htimer;
|
||||
reg [7:0] ball_vtimer;
|
||||
|
||||
reg [3:0] ball_horiz_vel;
|
||||
reg [3:0] ball_vert_vel;
|
||||
|
||||
hvsync_generator hvsync_gen(
|
||||
.clk(clk),
|
||||
.hsync(hsync),
|
||||
.vsync(vsync),
|
||||
.display_on(display_on),
|
||||
.hpos(hpos),
|
||||
.vpos(vpos)
|
||||
);
|
||||
|
||||
always @(posedge clk)
|
||||
begin
|
||||
if (hpos == 0 && vpos == 0)
|
||||
ball_htimer <= ball_htimer + 8'(ball_horiz_vel) - 4;
|
||||
else if (display_on)
|
||||
ball_htimer <= ball_htimer + 1;
|
||||
end;
|
||||
|
||||
always @(posedge hsync)
|
||||
begin
|
||||
if (vpos > 9'(ball_vert_vel))
|
||||
ball_vtimer <= ball_vtimer + 1;
|
||||
end;
|
||||
|
||||
wire ball_hgfx = ball_htimer < 8;
|
||||
wire ball_vgfx = ball_vtimer < 8;
|
||||
wire ball_gfx = ball_hgfx & ball_vgfx;
|
||||
|
||||
wire grid_gfx = (((hpos&7)==0) || ((vpos&7)==0));
|
||||
|
||||
wire r = display_on && (grid_gfx | ball_gfx);
|
||||
wire g = display_on && ball_gfx;
|
||||
wire b = display_on && ball_gfx;
|
||||
assign rgb = {b,g,r};
|
||||
|
||||
endmodule
|
88
presets/verilog/sprite_bitmap.v
Normal file
88
presets/verilog/sprite_bitmap.v
Normal file
@ -0,0 +1,88 @@
|
||||
`include "hvsync_generator.v"
|
||||
|
||||
module car_bitmap(yofs, bits);
|
||||
|
||||
input [3:0] yofs;
|
||||
output [7:0] bits;
|
||||
|
||||
reg [7:0] bitarray[16];
|
||||
|
||||
assign bits = bitarray[yofs];
|
||||
|
||||
initial begin/*{w:8,h:16}*/
|
||||
bitarray[0] = 8'b0;
|
||||
bitarray[1] = 8'b101110;
|
||||
bitarray[2] = 8'b11101110;
|
||||
bitarray[3] = 8'b11111110;
|
||||
bitarray[4] = 8'b11101110;
|
||||
bitarray[5] = 8'b1101110;
|
||||
bitarray[6] = 8'b110000;
|
||||
bitarray[7] = 8'b110000;
|
||||
bitarray[8] = 8'b110000;
|
||||
bitarray[9] = 8'b1110000;
|
||||
bitarray[10] = 8'b1100000;
|
||||
bitarray[11] = 8'b11100000;
|
||||
bitarray[12] = 8'b11101100;
|
||||
bitarray[13] = 8'b11111100;
|
||||
bitarray[14] = 8'b11001100;
|
||||
bitarray[15] = 8'b1100;
|
||||
end
|
||||
endmodule
|
||||
|
||||
module test_top(clk, hsync, vsync, rgb, hpaddle, vpaddle);
|
||||
|
||||
input clk;
|
||||
input hpaddle, vpaddle;
|
||||
output hsync, vsync;
|
||||
output [2:0] rgb;
|
||||
wire display_on;
|
||||
wire [8:0] hpos;
|
||||
wire [8:0] vpos;
|
||||
|
||||
reg sprite_active;
|
||||
reg [3:0] car_sprite_xofs;
|
||||
reg [3:0] car_sprite_yofs;
|
||||
wire [7:0] car_sprite_bits;
|
||||
|
||||
reg [7:0] player_x = 128;
|
||||
reg [7:0] player_y = 128;
|
||||
|
||||
hvsync_generator hvsync_gen(
|
||||
.clk(clk),
|
||||
.hsync(hsync),
|
||||
.vsync(vsync),
|
||||
.display_on(display_on),
|
||||
.hpos(hpos),
|
||||
.vpos(vpos)
|
||||
);
|
||||
|
||||
car_bitmap car(
|
||||
.yofs(car_sprite_yofs),
|
||||
.bits(car_sprite_bits));
|
||||
|
||||
always @(posedge hsync)
|
||||
// start sprite?
|
||||
if (vpos == {1'0,player_y})
|
||||
car_sprite_yofs <= 15;
|
||||
else if (car_sprite_yofs != 0)
|
||||
car_sprite_yofs <= car_sprite_yofs - 1;
|
||||
|
||||
always @(posedge clk)
|
||||
if (display_on) begin
|
||||
if (hpos == {1'0,player_x})
|
||||
car_sprite_xofs <= 15;
|
||||
else if (car_sprite_xofs != 0)
|
||||
car_sprite_xofs <= car_sprite_xofs - 1;
|
||||
end
|
||||
|
||||
// mirror sprite in X direction
|
||||
wire car_gfx = car_sprite_bits[car_sprite_xofs>=8 ?
|
||||
15-car_sprite_xofs:
|
||||
car_sprite_xofs];
|
||||
|
||||
wire r = display_on && car_gfx;
|
||||
wire g = display_on && car_gfx;
|
||||
wire b = display_on && car_gfx;
|
||||
assign rgb = {b,g,r};
|
||||
|
||||
endmodule
|
106
presets/verilog/sprite_multiple.v
Normal file
106
presets/verilog/sprite_multiple.v
Normal file
@ -0,0 +1,106 @@
|
||||
`include "hvsync_generator.v"
|
||||
`include "sprite_renderer.v"
|
||||
|
||||
module sprite_multiple_top(clk, hsync, vsync, rgb, hpaddle, vpaddle);
|
||||
|
||||
input clk;
|
||||
input hpaddle, vpaddle;
|
||||
output hsync, vsync;
|
||||
output [2:0] rgb;
|
||||
wire display_on;
|
||||
wire [8:0] hpos;
|
||||
wire [8:0] vpos;
|
||||
|
||||
reg [7:0] player_x;
|
||||
reg [7:0] player_y;
|
||||
reg [7:0] paddle_x;
|
||||
reg [7:0] paddle_y;
|
||||
reg [7:0] enemy_x = 128;
|
||||
reg [7:0] enemy_y = 128;
|
||||
|
||||
reg [15:0] track_pos = 0;
|
||||
reg [7:0] speed = 31;
|
||||
|
||||
hvsync_generator hvsync_gen(
|
||||
.clk(clk),
|
||||
.hsync(hsync),
|
||||
.vsync(vsync),
|
||||
.display_on(display_on),
|
||||
.hpos(hpos),
|
||||
.vpos(vpos)
|
||||
);
|
||||
|
||||
wire [3:0] car_sprite_yofs;
|
||||
wire [7:0] car_sprite_bits;
|
||||
|
||||
car_bitmap car(
|
||||
.yofs(car_sprite_yofs),
|
||||
.bits(car_sprite_bits));
|
||||
|
||||
wire player_vstart = {1'0,player_y} == vpos;
|
||||
wire player_hstart = {1'0,player_x} == hpos;
|
||||
wire player_gfx;
|
||||
wire player_is_drawing;
|
||||
|
||||
wire enemy_vstart = {1'0,enemy_y} == vpos;
|
||||
wire enemy_hstart = {1'0,enemy_x} == hpos;
|
||||
wire enemy_gfx;
|
||||
wire enemy_is_drawing;
|
||||
|
||||
sprite_renderer player_renderer(
|
||||
.clk(clk),
|
||||
.vstart(player_vstart),
|
||||
.load(hpos == 256),
|
||||
.hstart(player_hstart),
|
||||
.rom_yofs(car_sprite_yofs),
|
||||
.rom_bits(car_sprite_bits),
|
||||
.gfx(player_gfx),
|
||||
.in_progress(player_is_drawing));
|
||||
|
||||
sprite_renderer enemy_renderer(
|
||||
.clk(clk),
|
||||
.vstart(enemy_vstart),
|
||||
.load(hpos == 257),
|
||||
.hstart(enemy_hstart),
|
||||
.rom_yofs(car_sprite_yofs),
|
||||
.rom_bits(car_sprite_bits),
|
||||
.gfx(enemy_gfx),
|
||||
.in_progress(player_is_drawing));
|
||||
|
||||
always @(posedge hsync)
|
||||
begin
|
||||
if (!hpaddle) paddle_x <= vpos[7:0];
|
||||
if (!vpaddle) paddle_y <= vpos[7:0];
|
||||
end
|
||||
|
||||
always @(posedge vsync)
|
||||
begin
|
||||
player_x <= paddle_x;
|
||||
player_y <= 180;
|
||||
track_pos <= track_pos + {11'b0,speed[7:4]};
|
||||
enemy_y <= enemy_y + {3'b0, speed[7:4]};
|
||||
// collision check?
|
||||
if (frame_collision)
|
||||
speed <= 16;
|
||||
else if (speed < 255)
|
||||
speed <= speed + 1;
|
||||
end
|
||||
|
||||
reg frame_collision;
|
||||
|
||||
always @(posedge clk)
|
||||
if (player_gfx && (enemy_gfx || track_gfx))
|
||||
frame_collision <= 1;
|
||||
else if (vsync)
|
||||
frame_collision <= 0;
|
||||
|
||||
wire track_offside = (hpos[7:5]==0) || (hpos[7:5]==7);
|
||||
wire track_shoulder = (hpos[7:3]==3) || (hpos[7:3]==28);
|
||||
wire track_gfx = (vpos[5:1]!=track_pos[5:1]) && track_offside;
|
||||
|
||||
wire r = display_on && (player_gfx || enemy_gfx || track_shoulder);
|
||||
wire g = display_on && (player_gfx || track_gfx);
|
||||
wire b = display_on && (enemy_gfx || track_shoulder);
|
||||
assign rgb = {b,g,r};
|
||||
|
||||
endmodule
|
151
presets/verilog/sprite_renderer.v
Normal file
151
presets/verilog/sprite_renderer.v
Normal file
@ -0,0 +1,151 @@
|
||||
`include "hvsync_generator.v"
|
||||
|
||||
module car_bitmap(yofs, bits);
|
||||
|
||||
input [3:0] yofs;
|
||||
output [7:0] bits;
|
||||
|
||||
reg [7:0] bitarray[16];
|
||||
|
||||
assign bits = bitarray[yofs];
|
||||
|
||||
initial begin/*{w:8,h:16}*/
|
||||
bitarray[0] = 8'b110000;
|
||||
bitarray[1] = 8'b1110111;
|
||||
bitarray[2] = 8'b11100110;
|
||||
bitarray[3] = 8'b11111111;
|
||||
bitarray[4] = 8'b11100110;
|
||||
bitarray[5] = 8'b1100111;
|
||||
bitarray[6] = 8'b110000;
|
||||
bitarray[7] = 8'b110000;
|
||||
bitarray[8] = 8'b110000;
|
||||
bitarray[9] = 8'b1110000;
|
||||
bitarray[10] = 8'b1100000;
|
||||
bitarray[11] = 8'b11100000;
|
||||
bitarray[12] = 8'b11101100;
|
||||
bitarray[13] = 8'b11111100;
|
||||
bitarray[14] = 8'b11001100;
|
||||
bitarray[15] = 8'b1100;
|
||||
end
|
||||
endmodule
|
||||
|
||||
module sprite_renderer(clk, vstart, load, hstart, rom_yofs, rom_bits,
|
||||
gfx, in_progress);
|
||||
|
||||
input clk, vstart, load, hstart;
|
||||
output [3:0] rom_yofs;
|
||||
input [7:0] rom_bits;
|
||||
output gfx;
|
||||
output in_progress = yactive;
|
||||
|
||||
reg [3:0] ycount;
|
||||
reg [3:0] xcount;
|
||||
reg yactive;
|
||||
reg xactive;
|
||||
reg loading;
|
||||
|
||||
reg [7:0] outbits;
|
||||
|
||||
always @(posedge clk)
|
||||
begin
|
||||
// set a default value (blank) for pixel output
|
||||
// note: multiple non-blocking assignments are vendor-specific
|
||||
gfx <= 0;
|
||||
// load next line? set ROM address
|
||||
if (yactive && load) begin
|
||||
rom_yofs <= ~ycount;
|
||||
loading <= 1;
|
||||
// ROM address was set, now latch bits from bus
|
||||
end else if (loading) begin
|
||||
outbits <= rom_bits;
|
||||
loading <= 0;
|
||||
ycount <= ycount + 1;
|
||||
// start sprite at this vertical scanline
|
||||
end else if (vstart) begin
|
||||
yactive <= 1;
|
||||
//ycount <= 0;
|
||||
// start sprite at this horizontal clock
|
||||
end else if (hstart && yactive) begin
|
||||
xactive <= 1;
|
||||
//xcount <= 0;
|
||||
// both X & Y active, set pixel output
|
||||
end else if (xactive && yactive)
|
||||
begin
|
||||
// mirror graphics left/right
|
||||
gfx <= outbits[xcount[3]?~xcount[2:0]:xcount[2:0]];
|
||||
xcount <= xcount + 1;
|
||||
if (xcount == 15) begin // pre-increment value
|
||||
xactive <= 0; // done drawing this scanline
|
||||
if (ycount == 0) // post-increment value
|
||||
yactive <= 0; // done drawing sprite
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
module test_top(clk, hsync, vsync, rgb, hpaddle, vpaddle);
|
||||
|
||||
input clk;
|
||||
input hpaddle, vpaddle;
|
||||
output hsync, vsync;
|
||||
output [2:0] rgb;
|
||||
wire display_on;
|
||||
wire [8:0] hpos;
|
||||
wire [8:0] vpos;
|
||||
|
||||
reg [7:0] player_x;
|
||||
reg [7:0] player_y;
|
||||
|
||||
reg [7:0] paddle_x;
|
||||
reg [7:0] paddle_y;
|
||||
|
||||
hvsync_generator hvsync_gen(
|
||||
.clk(clk),
|
||||
.hsync(hsync),
|
||||
.vsync(vsync),
|
||||
.display_on(display_on),
|
||||
.hpos(hpos),
|
||||
.vpos(vpos)
|
||||
);
|
||||
|
||||
wire [3:0] car_sprite_yofs;
|
||||
wire [7:0] car_sprite_bits;
|
||||
|
||||
car_bitmap car(
|
||||
.yofs(car_sprite_yofs),
|
||||
.bits(car_sprite_bits));
|
||||
|
||||
wire vstart = {1'0,player_y} == vpos;
|
||||
wire hstart = {1'0,player_x} == hpos;
|
||||
wire car_gfx;
|
||||
wire unused;
|
||||
|
||||
sprite_renderer renderer(
|
||||
.clk(clk),
|
||||
.vstart(vstart),
|
||||
.load(hsync),
|
||||
.hstart(hstart),
|
||||
.rom_yofs(car_sprite_yofs),
|
||||
.rom_bits(car_sprite_bits),
|
||||
.gfx(car_gfx),
|
||||
.in_progress(unused));
|
||||
|
||||
always @(posedge hsync)
|
||||
begin
|
||||
if (!hpaddle) paddle_x <= vpos[7:0];
|
||||
if (!vpaddle) paddle_y <= vpos[7:0];
|
||||
end
|
||||
|
||||
always @(posedge vsync)
|
||||
begin
|
||||
player_x <= paddle_x;
|
||||
player_y <= paddle_y;
|
||||
end
|
||||
|
||||
wire r = display_on && car_gfx;
|
||||
wire g = display_on && car_gfx;
|
||||
wire b = display_on && car_gfx;
|
||||
assign rgb = {b,g,r};
|
||||
|
||||
endmodule
|
@ -8,7 +8,9 @@ var VERILOG_PRESETS = [
|
||||
{id:'digits10.v', name:'Digits'},
|
||||
{id:'ball_slip_counter.v', name:'Ball Motion (slipping counter)'},
|
||||
{id:'ball_paddle.v', name:'Brick Smash Game'},
|
||||
//{id:'pong.v', name:'Pong'},
|
||||
{id:'sprite_bitmap.v', name:'Sprite Bitmaps'},
|
||||
{id:'sprite_renderer.v', name:'Sprite Rendering'},
|
||||
{id:'sprite_multiple.v', name:'Multiple Sprites'},
|
||||
];
|
||||
|
||||
var VERILOG_KEYCODE_MAP = makeKeycodeMap([
|
||||
|
19
src/ui.js
19
src/ui.js
@ -28,7 +28,7 @@ function gotoNewLocation() {
|
||||
}
|
||||
|
||||
// make sure VCS doesn't start
|
||||
Javatari.AUTO_START = false;
|
||||
if (window.Javatari) Javatari.AUTO_START = false;
|
||||
|
||||
// 8bitworkshop IDE user interface
|
||||
|
||||
@ -44,15 +44,20 @@ function getBiggestItems(storage) {
|
||||
var items = [];
|
||||
for (var i = 0; i < storage.length; i++) {
|
||||
var key = storage.key(i);
|
||||
items.push([lpad(storage.getItem(key).length+"", 12), key]);
|
||||
var len = storage.getItem(key).length;
|
||||
if (len>=100)
|
||||
items.push([lpad(len+"", 12), key]);
|
||||
}
|
||||
items.sort();
|
||||
return items;
|
||||
}
|
||||
/*
|
||||
var s = "";
|
||||
for (var i=items.length-5; i<items.length; i++) {
|
||||
s += items[i] + "\n";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}*/
|
||||
|
||||
var FileStore = function(storage, prefix) {
|
||||
var self = this;
|
||||
@ -62,8 +67,10 @@ var FileStore = function(storage, prefix) {
|
||||
} catch (e) {
|
||||
if (e.name == 'NS_ERROR_DOM_QUOTA_REACHED') {
|
||||
console.log(e);
|
||||
alert("Sorry, you've reached your local storage quota for this browser.\n\nHere are the biggest items:\n\n" +
|
||||
getBiggestItems(storage));
|
||||
if (confirm("Sorry, you've reached your local storage quota for this browser.\n\nGo to local storage editor?")) {
|
||||
window.location = 'editstorage.html';
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
@ -1094,7 +1101,7 @@ function toggleProfileWindow() {
|
||||
}
|
||||
|
||||
function handleWindowMessage(e) {
|
||||
console.log("window message", e.data);
|
||||
//console.log("window message", e.data);
|
||||
if (e.data.bytes) {
|
||||
editor.replaceSelection(e.data.bytestr);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user