mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-21 23:30:58 +00:00
AY38910_Audio
This commit is contained in:
parent
0f26d3cc35
commit
5851394f40
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -10,3 +10,6 @@
|
||||
[submodule "octokat.js"]
|
||||
path = octokat.js
|
||||
url = ./octokat.js
|
||||
[submodule "tss"]
|
||||
path = tss
|
||||
url = ./tss
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "8bitworkshop",
|
||||
"version": "0.0.2",
|
||||
"version": "1.0.0",
|
||||
"author": "Steven Hugg",
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
|
36
src/emu.js
36
src/emu.js
@ -337,6 +337,39 @@ function cpuStateToLongString_6502(c) {
|
||||
+ " Y " + hex(c.Y) + " " + "SP " + hex(c.SP) + "\n";
|
||||
}
|
||||
|
||||
var MasterAudio = function() {
|
||||
this.master = new MasterChannel();
|
||||
this.looper = new AudioLooper(512);
|
||||
this.start = function() {
|
||||
this.looper.setChannel(this.master);
|
||||
this.looper.activate();
|
||||
}
|
||||
this.stop = function() {
|
||||
this.looper.setChannel(null);
|
||||
}
|
||||
}
|
||||
|
||||
var AY38910_Audio = function(master) {
|
||||
this.psg = new PsgDeviceChannel();
|
||||
this.psg.setMode(PsgDeviceChannel.MODE_SIGNED);
|
||||
this.psg.setDevice(PsgDeviceChannel.DEVICE_AY_3_8910);
|
||||
master.master.addChannel(this.psg);
|
||||
var curreg = 0;
|
||||
|
||||
this.reset = function() {
|
||||
for (var i=15; i>=0; i--) {
|
||||
this.selectRegister(i);
|
||||
this.setData(0);
|
||||
}
|
||||
}
|
||||
this.selectRegister = function(val) {
|
||||
curreg = val & 0xf;
|
||||
}
|
||||
this.setData = function(val) {
|
||||
this.psg.writeRegisterAY(curreg, val & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
////// 6502
|
||||
|
||||
var Base6502Platform = function() {
|
||||
@ -823,6 +856,9 @@ function makeKeycodeMap(table) {
|
||||
}
|
||||
|
||||
function padBytes(data, len) {
|
||||
if (data.length > len) {
|
||||
throw Error("Data too long, " + data.length + " > " + len);
|
||||
}
|
||||
var r = new RAM(len);
|
||||
r.mem.set(data);
|
||||
return r.mem;
|
||||
|
@ -163,7 +163,10 @@ var GalaxianPlatform = function(mainElement) {
|
||||
[0x4000, 0x47ff, 0x3ff, function(a,v) { ram.mem[a] = v; }],
|
||||
[0x5000, 0x57ff, 0x3ff, function(a,v) { vram.mem[a] = v; }],
|
||||
[0x5800, 0x5fff, 0xff, function(a,v) { oram.mem[a] = v; }],
|
||||
[0x6000, 0x67ff, 0x7, function(a,v) { outlatches.mem[a] = v; }],
|
||||
[0x6004, 0x6007, 0x3, function(a,v) { }], // lfo freq
|
||||
[0x6800, 0x6807, 0x7, function(a,v) { }], // sound
|
||||
[0x7800, 0x7800, 0x7, function(a,v) { }], // pitch
|
||||
[0x6000, 0x6003, 0x3, function(a,v) { outlatches.mem[a] = v; }],
|
||||
[0x7001, 0x7001, 0, function(a,v) { interruptEnabled = v; }],
|
||||
[0x7004, 0x7004, 0, function(a,v) { starsEnabled = v; }],
|
||||
]),
|
||||
@ -184,7 +187,7 @@ var GalaxianPlatform = function(mainElement) {
|
||||
ioBus: iobus
|
||||
});
|
||||
video = new RasterVideo(mainElement,264,264,{rotate:90});
|
||||
audio = new SampleAudio(cpuFrequency);
|
||||
audio = new MasterAudio();
|
||||
video.create();
|
||||
var idata = video.getFrameData();
|
||||
setKeyboardFromMap(video, inputs, GALAXIAN_KEYCODE_MAP);
|
||||
@ -227,7 +230,7 @@ var GalaxianPlatform = function(mainElement) {
|
||||
];
|
||||
|
||||
this.loadROM = function(title, data) {
|
||||
rom = padBytes(data, 0x3820);
|
||||
rom = padBytes(data, 0x4000);
|
||||
// palette is at 0x3800-0x381f
|
||||
palette = new Uint32Array(new ArrayBuffer(32*4));
|
||||
for (var i=0; i<32; i++) {
|
||||
@ -285,6 +288,7 @@ var GalaxianPlatform = function(mainElement) {
|
||||
}
|
||||
this.reset = function() {
|
||||
cpu.reset();
|
||||
//audio.reset();
|
||||
if (!this.getDebugCallback()) cpu.setTstates(0); // TODO?
|
||||
watchdog_counter = INITIAL_WATCHDOG;
|
||||
}
|
||||
|
@ -43,6 +43,7 @@ var VCSPlatform = function() {
|
||||
|
||||
this.start = function() {
|
||||
Javatari.start();
|
||||
$("#booklink_vcs").show();
|
||||
}
|
||||
|
||||
this.loadROM = function(title, data) {
|
||||
|
@ -12,7 +12,7 @@ var VicDualPlatform = function(mainElement) {
|
||||
this.__proto__ = new BaseZ80Platform();
|
||||
|
||||
var cpu, ram, membus, iobus, rom;
|
||||
var video, audio, timer, pixels;
|
||||
var video, audio, psg, timer, pixels;
|
||||
var inputs = [0xff, 0xff, 0xff, 0xff]; // most things active low
|
||||
var palbank = 0;
|
||||
|
||||
@ -58,9 +58,9 @@ var VicDualPlatform = function(mainElement) {
|
||||
var vramofs = (sl>>3)<<5; // offset in VRAM
|
||||
var yy = sl & 7; // y offset within tile
|
||||
for (var xx=0; xx<32; xx++) {
|
||||
var attrib = ram.mem[vramofs+xx];
|
||||
var data = ram.mem[0x800 + (attrib<<3) + yy];
|
||||
var col = (attrib>>5) + (palbank<<4);
|
||||
var code = ram.mem[vramofs+xx];
|
||||
var data = ram.mem[0x800 + (code<<3) + yy];
|
||||
var col = (code>>5) + (palbank<<4);
|
||||
var color1 = palette[colorprom[col]];
|
||||
var color2 = palette[colorprom[col+8]];
|
||||
for (var i=0; i<8; i++) {
|
||||
@ -99,8 +99,8 @@ var VicDualPlatform = function(mainElement) {
|
||||
iobus = {
|
||||
read: function(addr) { return inputs[addr&3]; },
|
||||
write: function(addr, val) {
|
||||
if (addr & 0x1) { }; // audio 1
|
||||
if (addr & 0x2) { }; // audio 2
|
||||
if (addr & 0x1) { psg.selectRegister(val); }; // audio 1
|
||||
if (addr & 0x2) { psg.setData(val); }; // audio 2
|
||||
if (addr & 0x8) { }; // coin status
|
||||
if (addr & 0x40) { palbank = val & 3; }; // palette
|
||||
}
|
||||
@ -111,7 +111,8 @@ var VicDualPlatform = function(mainElement) {
|
||||
ioBus: iobus
|
||||
});
|
||||
video = new RasterVideo(mainElement,256,224,{rotate:-90});
|
||||
audio = new SampleAudio(cpuFrequency);
|
||||
audio = new MasterAudio();
|
||||
psg = new AY38910_Audio(audio);
|
||||
video.create();
|
||||
var idata = video.getFrameData();
|
||||
setKeyboardFromMap(video, inputs, CARNIVAL_KEYCODE_MAP, function(o) {
|
||||
@ -185,6 +186,7 @@ var VicDualPlatform = function(mainElement) {
|
||||
}
|
||||
this.reset = function() {
|
||||
cpu.reset();
|
||||
psg.reset();
|
||||
if (!this.getDebugCallback()) cpu.setTstates(0); // TODO?
|
||||
}
|
||||
this.readAddress = function(addr) {
|
||||
|
@ -246,14 +246,11 @@ function _shareFile(e) {
|
||||
alert("Please fix errors before sharing.");
|
||||
return true;
|
||||
}
|
||||
if (!current_preset_id.startsWith("local/")) {
|
||||
alert("Can only share files created with New File.");
|
||||
return true;
|
||||
}
|
||||
var github = new Octokat();
|
||||
var files = {};
|
||||
var text = editor.getValue();
|
||||
files[current_preset_id.slice(6)] = {"content": text};
|
||||
var toks = current_preset_id.split("/");
|
||||
files[toks[toks.length-1]] = {"content": text};
|
||||
var gistdata = {
|
||||
"description": '8bitworkshop.com {"platform":"' + platform_id + '"}',
|
||||
"public": true,
|
||||
@ -966,6 +963,7 @@ function startUI(loadplatform) {
|
||||
} else {
|
||||
// reset file?
|
||||
if (qs['file'] && qs['reset']) {
|
||||
initPlatform();
|
||||
store.deleteFile(qs['file']);
|
||||
qs['reset'] = '';
|
||||
gotoNewLocation();
|
||||
|
@ -50,7 +50,8 @@ for ch in range(lochar,hichar+1):
|
||||
rot2output.append(0)
|
||||
for x in range(0,height):
|
||||
for y in range(0,height):
|
||||
rotoutput[-7+x] |= (((output[-1-y]>>x)&1)<<y)
|
||||
#rotoutput[-7+x] |= (((output[-1-y]>>x)&1)<<y)
|
||||
rotoutput[-1-x] |= (((output[-1-y]>>x)&1)<<y)
|
||||
rot2output[-1-x] |= (((output[-7+y]>>x)&1)<<y)
|
||||
|
||||
def tohex(v):
|
||||
|
1
tss
Submodule
1
tss
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit d630ddcb29d74a178cde043d74188fac35d6a21f
|
Loading…
Reference in New Issue
Block a user