mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2025-03-27 00:30:06 +00:00
Deploying to gh-pages from @ sehugg/8bitworkshop@a5a8b94991 🚀
This commit is contained in:
parent
81248f399a
commit
9c4d310620
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,2 +1,2 @@
|
||||
import{a as d}from"./chunk-3XE5YOCV.js";import{o as c}from"./chunk-OT2JLXSB.js";import"./chunk-PP6TWFIY.js";import"./chunk-5SHCNQ2O.js";import"./chunk-GM6JRJFL.js";import{I as m,o as u,t as h}from"./chunk-YLYWUMYM.js";import{$ as i,B as o,J as l,m as n}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.js";var s=31,a=class extends u{constructor(){super();this.cpuFrequency=1e6;this.defaultROMSize=32768;this.cpu=new h;this.ram=new Uint8Array(16384);this.read=i([[0,16383,16383,e=>this.ram[e]],[16384,16384,65535,e=>this.serial.byteAvailable()?128:0],[16385,16385,65535,e=>this.serial.recvByte()],[16386,16386,65535,e=>this.serial.clearToSend()?128:0],[32768,65535,32767,e=>this.rom&&this.rom[e]]]);this.write=i([[0,16383,16383,(e,t)=>{this.ram[e]=t}],[16387,16387,65535,(e,t)=>this.serial.sendByte(t)],[16399,16399,65535,(e,t)=>{this.inputs[s]=1}]]);this.connectCPUMemoryBus(this)}connectSerialIO(e){this.serial=e}readConst(e){return this.read(e)}advanceFrame(e){for(var t=0;t<this.cpuFrequency/60&&!(e&&e());)t+=this.advanceCPU();return t}advanceCPU(){if(this.isHalted())return 1;var e=super.advanceCPU();return this.serial&&this.serial.advance(e),e}reset(){this.inputs[s]=0,super.reset(),this.serial&&this.serial.reset()}isHalted(){return this.inputs[s]!=0}};var S=[{id:"hello.dasm",name:"Hello World (ASM)"}],f=class{constructor(e){e.style.overflowY="auto";var t=$('<div id="gameport"/>').appendTo(e);$('<p class="transcript-header">Serial Output</p>').appendTo(t);var y=$('<div id="windowport" class="transcript"/>').appendTo(t);this.div=y[0]}start(){this.tty=new d(this.div,!1)}reset(){this.tty.clear()}saveState(){return this.tty.saveState()}loadState(e){this.tty.loadState(e)}};function p(r){return r==10?"":r<32?String.fromCharCode(r+9216):String.fromCharCode(r)}var v=class{constructor(){this.bufferedRead=!0;this.cyclesPerByte=1e6/(57600/8);this.maxOutputBytes=4096}clearToSend(){return this.outputBytes.length<this.maxOutputBytes}sendByte(e){this.clearToSend()&&(this.outputBytes.push(e),this.viewer.tty.addtext(p(e),2|32),e==10&&this.viewer.tty.newline(),this.clearToSend()||(this.viewer.tty.newline(),this.viewer.tty.addtext("\u26A0\uFE0F OUTPUT BUFFER FULL \u26A0\uFE0F",4)))}byteAvailable(){return this.readIndex()>this.inputIndex}recvByte(){var e=this.readIndex();this.inputIndex=e;var t=(this.inputBytes&&this.inputBytes[e])|0;return this.viewer.tty.addtext(p(t),2|16),t==10&&this.viewer.tty.newline(),t}readIndex(){return this.bufferedRead?this.inputIndex+1:Math.floor(this.clk/this.cyclesPerByte)}reset(){this.inputIndex=-1,this.clk=0,this.outputBytes=[],this.bufin=""}advance(e){this.clk+=e}saveState(){return{clk:this.clk,idx:this.inputIndex,out:this.outputBytes.slice()}}loadState(e){this.clk=e.clk,this.inputIndex=e.idx,this.outputBytes=e.out.slice()}},x=class extends m{constructor(e){super(e);this.getMemoryMap=function(){return{main:[{name:"RAM",start:0,size:16384,type:"ram"},{name:"ROM",start:32768,size:32768,type:"rom"}]}};this.serview=new f(e)}async start(){super.start(),this.serial=new v,this.serial.viewer=this.serview,this.serview.start(),this.machine.connectSerialIO(this.serial)}reset(){this.serial.inputBytes=o(this.internalFiles["serialin.dat"]),super.reset(),this.serview.reset()}isBlocked(){return this.machine.isHalted()}advance(e){return this.isBlocked()?(this.internalFiles["serialout.dat"]=n(this.serial.outputBytes),c(),0):super.advance(e)}saveState(){var e=super.saveState();return e.serial=this.serial.saveState(),e.serview=this.serview.saveState(),e}loadState(e){super.loadState(e),this.serial.loadState(e.serial),this.serview.loadState(e.serview)}newMachine(){return new a}getPresets(){return S}getDefaultExtension(){return".dasm"}readAddress(e){return this.machine.readConst(e)}};l["devel-6502"]=x;export{v as SerialTestHarness};
|
||||
//# sourceMappingURL=devel-JEYCOEFC.js.map
|
||||
import{a as d}from"./chunk-3XE5YOCV.js";import{o as c}from"./chunk-7GXJICC2.js";import"./chunk-PP6TWFIY.js";import"./chunk-5SHCNQ2O.js";import"./chunk-FYLLZUOK.js";import{I as m,o as u,t as h}from"./chunk-YLYWUMYM.js";import{$ as i,B as o,J as l,m as n}from"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.js";var s=31,a=class extends u{constructor(){super();this.cpuFrequency=1e6;this.defaultROMSize=32768;this.cpu=new h;this.ram=new Uint8Array(16384);this.read=i([[0,16383,16383,e=>this.ram[e]],[16384,16384,65535,e=>this.serial.byteAvailable()?128:0],[16385,16385,65535,e=>this.serial.recvByte()],[16386,16386,65535,e=>this.serial.clearToSend()?128:0],[32768,65535,32767,e=>this.rom&&this.rom[e]]]);this.write=i([[0,16383,16383,(e,t)=>{this.ram[e]=t}],[16387,16387,65535,(e,t)=>this.serial.sendByte(t)],[16399,16399,65535,(e,t)=>{this.inputs[s]=1}]]);this.connectCPUMemoryBus(this)}connectSerialIO(e){this.serial=e}readConst(e){return this.read(e)}advanceFrame(e){for(var t=0;t<this.cpuFrequency/60&&!(e&&e());)t+=this.advanceCPU();return t}advanceCPU(){if(this.isHalted())return 1;var e=super.advanceCPU();return this.serial&&this.serial.advance(e),e}reset(){this.inputs[s]=0,super.reset(),this.serial&&this.serial.reset()}isHalted(){return this.inputs[s]!=0}};var S=[{id:"hello.dasm",name:"Hello World (ASM)"}],f=class{constructor(e){e.style.overflowY="auto";var t=$('<div id="gameport"/>').appendTo(e);$('<p class="transcript-header">Serial Output</p>').appendTo(t);var y=$('<div id="windowport" class="transcript"/>').appendTo(t);this.div=y[0]}start(){this.tty=new d(this.div,!1)}reset(){this.tty.clear()}saveState(){return this.tty.saveState()}loadState(e){this.tty.loadState(e)}};function p(r){return r==10?"":r<32?String.fromCharCode(r+9216):String.fromCharCode(r)}var v=class{constructor(){this.bufferedRead=!0;this.cyclesPerByte=1e6/(57600/8);this.maxOutputBytes=4096}clearToSend(){return this.outputBytes.length<this.maxOutputBytes}sendByte(e){this.clearToSend()&&(this.outputBytes.push(e),this.viewer.tty.addtext(p(e),2|32),e==10&&this.viewer.tty.newline(),this.clearToSend()||(this.viewer.tty.newline(),this.viewer.tty.addtext("\u26A0\uFE0F OUTPUT BUFFER FULL \u26A0\uFE0F",4)))}byteAvailable(){return this.readIndex()>this.inputIndex}recvByte(){var e=this.readIndex();this.inputIndex=e;var t=(this.inputBytes&&this.inputBytes[e])|0;return this.viewer.tty.addtext(p(t),2|16),t==10&&this.viewer.tty.newline(),t}readIndex(){return this.bufferedRead?this.inputIndex+1:Math.floor(this.clk/this.cyclesPerByte)}reset(){this.inputIndex=-1,this.clk=0,this.outputBytes=[],this.bufin=""}advance(e){this.clk+=e}saveState(){return{clk:this.clk,idx:this.inputIndex,out:this.outputBytes.slice()}}loadState(e){this.clk=e.clk,this.inputIndex=e.idx,this.outputBytes=e.out.slice()}},x=class extends m{constructor(e){super(e);this.getMemoryMap=function(){return{main:[{name:"RAM",start:0,size:16384,type:"ram"},{name:"ROM",start:32768,size:32768,type:"rom"}]}};this.serview=new f(e)}async start(){super.start(),this.serial=new v,this.serial.viewer=this.serview,this.serview.start(),this.machine.connectSerialIO(this.serial)}reset(){this.serial.inputBytes=o(this.internalFiles["serialin.dat"]),super.reset(),this.serview.reset()}isBlocked(){return this.machine.isHalted()}advance(e){return this.isBlocked()?(this.internalFiles["serialout.dat"]=n(this.serial.outputBytes),c(),0):super.advance(e)}saveState(){var e=super.saveState();return e.serial=this.serial.saveState(),e.serview=this.serview.saveState(),e}loadState(e){super.loadState(e),this.serial.loadState(e.serial),this.serview.loadState(e.serview)}newMachine(){return new a}getPresets(){return S}getDefaultExtension(){return".dasm"}readAddress(e){return this.machine.readConst(e)}};l["devel-6502"]=x;export{v as SerialTestHarness};
|
||||
//# sourceMappingURL=devel-7E326DBZ.js.map
|
@ -1,2 +1,2 @@
|
||||
import{b as w,c as x}from"./chunk-GM6JRJFL.js";import{D as v,J as c,k as m,l as u,x as g,z as p}from"./chunk-ATS7PSQG.js";import{e as I}from"./chunk-5XVCUSSZ.js";var h=I(x()),i,a,l,y=function(e){if(!e||e.length==0)return{};for(var r={},t=0;t<e.length;++t){var o=e[t].split("=",2);o.length==1?r[o[0]]="":r[o[0]]=decodeURIComponent(o[1].replace(/\+/g," "))}return r}(window.location.search.substr(1).split("&"));function P(){typeof window.onerror=="object"&&(window.onerror=function(e,r,t,o,n){var s=e+" "+r+" "+t+":"+o+", "+n;$.get("/error?msg="+encodeURIComponent(s),"text")})}function M(){var e=!1;document.addEventListener("visibilitychange",function(r){document.visibilityState=="hidden"&&a.isRunning()?(a.pause(),e=!0):document.visibilityState=="visible"&&e&&(a.resume(),e=!1)}),$(window).on("focus",function(){e&&(a.resume(),e=!1)}),$(window).on("blur",function(){a.isRunning()&&(a.pause(),e=!0)})}async function k(e,r){if(!r){alert("No ROM found.");return}console.log(r.length+" bytes"),await a.loadROM(e,r),a.resume()}function R(){return $("#emulator").find("canvas")}function E(e,r,t){v("gif.js/dist/gif.js").then(()=>{var o=R()[0];if(!o){alert("Could not find canvas element to record video!");return}var n=0;o.style&&o.style.transform&&(o.style.transform.indexOf("rotate(-90deg)")>=0?n=-1:o.style.transform.indexOf("rotate(90deg)")>=0&&(n=1));var s=new GIF({workerScript:"gif.js/dist/gif.worker.js",workers:4,quality:10,rotate:n});s.on("finished",function(C){console.log("finished encoding GIF"),t(C)}),e=e||100+(Math.random()*256&3),r=r||100+(Math.random()*256&15);var f=0;console.log("Recording video",o);var d=()=>{f++>r?(console.log("Rendering video"),s.render()):(s.addFrame(o,{delay:e,copy:!0}),setTimeout(d,e))};d()})}async function S(e){if(!c[i])throw Error("Invalid platform '"+i+"'.");a=new c[i]($("#emuscreen")[0]),await a.start(),e.rec&&R().on("focus",()=>{a.resume()});var r=e.n||"Game",t,o=e.url,n=e.r;if(o)return console.log(o),g(o,f=>{k(r,f)},"arraybuffer"),!0;if(n){var s=u(atob(n));t=new m().decode(s)}return M(),k(r,t),!0}async function b(e){if(e.data&&(e=e.data),i=e.p,!i)throw new Error("No platform variable!");try{var r=await w(p(i));console.log("starting platform",i),await S(e)}catch(t){console.log(t),alert('Platform "'+i+'" not supported.')}}function F(){P(),y.p&&b(y)}window.addEventListener("message",O,!1);function O(e){if(e.data){var r=e.data.cmd;if(r=="start"&&!a)b(e);else if(r=="reset")a.reset(),l.reset();else if(r=="getReplay"){var t={frameCount:l.frameCount,checkpoints:l.checkpoints,framerecs:l.framerecs,checkpointInterval:l.checkpointInterval,maxCheckpoints:l.maxCheckpoints};e.source.postMessage({ack:r,replay:t},e.origin)}else if(r=="watchState"){var o=new Function("platform","state",e.data.fn);l.callbackNewCheckpoint=n=>{e.source.postMessage({ack:r,state:o(a,n)},e.origin)}}else r=="recordVideo"?E(e.data.intervalMsec,e.data.maxFrames,function(n){e.data.filename&&(0,h.saveAs)(n,e.data.filename),e.source.postMessage({ack:r,gif:n},e.origin)}):console.log("Unknown data.cmd: "+r)}}self===top&&(document.body.style.backgroundColor="#555");F();export{a as platform,i as platform_id,F as startEmbed,l as stateRecorder};
|
||||
import{b as w,c as x}from"./chunk-FYLLZUOK.js";import{D as v,J as c,k as m,l as u,x as g,z as p}from"./chunk-ATS7PSQG.js";import{e as I}from"./chunk-5XVCUSSZ.js";var h=I(x()),i,a,l,y=function(e){if(!e||e.length==0)return{};for(var r={},t=0;t<e.length;++t){var o=e[t].split("=",2);o.length==1?r[o[0]]="":r[o[0]]=decodeURIComponent(o[1].replace(/\+/g," "))}return r}(window.location.search.substr(1).split("&"));function P(){typeof window.onerror=="object"&&(window.onerror=function(e,r,t,o,n){var s=e+" "+r+" "+t+":"+o+", "+n;$.get("/error?msg="+encodeURIComponent(s),"text")})}function M(){var e=!1;document.addEventListener("visibilitychange",function(r){document.visibilityState=="hidden"&&a.isRunning()?(a.pause(),e=!0):document.visibilityState=="visible"&&e&&(a.resume(),e=!1)}),$(window).on("focus",function(){e&&(a.resume(),e=!1)}),$(window).on("blur",function(){a.isRunning()&&(a.pause(),e=!0)})}async function k(e,r){if(!r){alert("No ROM found.");return}console.log(r.length+" bytes"),await a.loadROM(e,r),a.resume()}function R(){return $("#emulator").find("canvas")}function E(e,r,t){v("gif.js/dist/gif.js").then(()=>{var o=R()[0];if(!o){alert("Could not find canvas element to record video!");return}var n=0;o.style&&o.style.transform&&(o.style.transform.indexOf("rotate(-90deg)")>=0?n=-1:o.style.transform.indexOf("rotate(90deg)")>=0&&(n=1));var s=new GIF({workerScript:"gif.js/dist/gif.worker.js",workers:4,quality:10,rotate:n});s.on("finished",function(C){console.log("finished encoding GIF"),t(C)}),e=e||100+(Math.random()*256&3),r=r||100+(Math.random()*256&15);var f=0;console.log("Recording video",o);var d=()=>{f++>r?(console.log("Rendering video"),s.render()):(s.addFrame(o,{delay:e,copy:!0}),setTimeout(d,e))};d()})}async function S(e){if(!c[i])throw Error("Invalid platform '"+i+"'.");a=new c[i]($("#emuscreen")[0]),await a.start(),e.rec&&R().on("focus",()=>{a.resume()});var r=e.n||"Game",t,o=e.url,n=e.r;if(o)return console.log(o),g(o,f=>{k(r,f)},"arraybuffer"),!0;if(n){var s=u(atob(n));t=new m().decode(s)}return M(),k(r,t),!0}async function b(e){if(e.data&&(e=e.data),i=e.p,!i)throw new Error("No platform variable!");try{var r=await w(p(i));console.log("starting platform",i),await S(e)}catch(t){console.log(t),alert('Platform "'+i+'" not supported.')}}function F(){P(),y.p&&b(y)}window.addEventListener("message",O,!1);function O(e){if(e.data){var r=e.data.cmd;if(r=="start"&&!a)b(e);else if(r=="reset")a.reset(),l.reset();else if(r=="getReplay"){var t={frameCount:l.frameCount,checkpoints:l.checkpoints,framerecs:l.framerecs,checkpointInterval:l.checkpointInterval,maxCheckpoints:l.maxCheckpoints};e.source.postMessage({ack:r,replay:t},e.origin)}else if(r=="watchState"){var o=new Function("platform","state",e.data.fn);l.callbackNewCheckpoint=n=>{e.source.postMessage({ack:r,state:o(a,n)},e.origin)}}else r=="recordVideo"?E(e.data.intervalMsec,e.data.maxFrames,function(n){e.data.filename&&(0,h.saveAs)(n,e.data.filename),e.source.postMessage({ack:r,gif:n},e.origin)}):console.log("Unknown data.cmd: "+r)}}self===top&&(document.body.style.backgroundColor="#555");F();export{a as platform,i as platform_id,F as startEmbed,l as stateRecorder};
|
||||
//# sourceMappingURL=embedui.js.map
|
||||
|
@ -399,6 +399,9 @@ class Atari800 extends devices_1.BasicScanlineMachine {
|
||||
this.loadXEX(this.xexdata);
|
||||
}
|
||||
}
|
||||
setPaddleInput(controller, value) {
|
||||
this.irq_pokey.pot_inputs[controller] = 255 - value;
|
||||
}
|
||||
}
|
||||
exports.Atari800 = Atari800;
|
||||
class Atari5200 extends Atari800 {
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,2 +1,2 @@
|
||||
import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,q as p,r as q,s as r,t as s,u as t,v as u,w as v,x as w}from"./chunk-OT2JLXSB.js";import"./chunk-PP6TWFIY.js";import"./chunk-5SHCNQ2O.js";import"./chunk-GM6JRJFL.js";import"./chunk-YLYWUMYM.js";import"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.js";export{l as clearBreakpoint,h as compparams,f as current_project,u as emulationHalted,p as getPlatformAndRepo,t as getSaveState,s as getTestOutput,n as haltEmulation,w as highlightSearch,i as lastDebugState,e as platform,b as platform_id,g as projectWindows,a as qs,v as reloadWorkspaceFile,d as repo_id,k as runToPC,m as setFrameRateUI,r as setTestInput,j as setupBreakpoint,o as setupSplits,q as startUI,c as store_id};
|
||||
import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,q as p,r as q,s as r,t as s,u as t,v as u,w as v,x as w}from"./chunk-7GXJICC2.js";import"./chunk-PP6TWFIY.js";import"./chunk-5SHCNQ2O.js";import"./chunk-FYLLZUOK.js";import"./chunk-YLYWUMYM.js";import"./chunk-ATS7PSQG.js";import"./chunk-5XVCUSSZ.js";export{l as clearBreakpoint,h as compparams,f as current_project,u as emulationHalted,p as getPlatformAndRepo,t as getSaveState,s as getTestOutput,n as haltEmulation,w as highlightSearch,i as lastDebugState,e as platform,b as platform_id,g as projectWindows,a as qs,v as reloadWorkspaceFile,d as repo_id,k as runToPC,m as setFrameRateUI,r as setTestInput,j as setupBreakpoint,o as setupSplits,q as startUI,c as store_id};
|
||||
//# sourceMappingURL=ui.js.map
|
||||
|
281
presets/c64/scrolling2.c
Normal file
281
presets/c64/scrolling2.c
Normal file
@ -0,0 +1,281 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "scrolling.h"
|
||||
|
||||
#define VICBANK 0x8000
|
||||
#define BUFFER_A (byte*) 0x8000
|
||||
#define BUFFER_B (byte*) 0x8400
|
||||
|
||||
sbyte scroll_fine_x;
|
||||
sbyte scroll_fine_y;
|
||||
byte origin_x;
|
||||
byte origin_y;
|
||||
byte* hidbuf;
|
||||
byte* visbuf;
|
||||
byte colorbuf[COLS*ROWS];
|
||||
int pixofs_x;
|
||||
int pixofs_y;
|
||||
sbyte fine_correct_x;
|
||||
sbyte fine_correct_y;
|
||||
|
||||
byte scroll_dir;
|
||||
byte scroll_seq;
|
||||
|
||||
//
|
||||
|
||||
static void wait_offscreen(void) {
|
||||
while (VIC.rasterline < 250 && VIC.rasterline > 40) ;
|
||||
}
|
||||
|
||||
void scroll_swap(void) {
|
||||
byte* tmp;
|
||||
// swap hidden and visible buffers
|
||||
tmp = hidbuf;
|
||||
hidbuf = visbuf;
|
||||
visbuf = tmp;
|
||||
// set VIC bank address
|
||||
wait_offscreen();
|
||||
VIC.addr = (VIC.addr & 0xf) | (((word)visbuf >> 8) << 2);
|
||||
}
|
||||
|
||||
void copy_color_ram_slow() {
|
||||
memcpy(COLOR_RAM, colorbuf, COLS*ROWS);
|
||||
}
|
||||
|
||||
void copy_color_ram_fast() {
|
||||
// fast copy loop for upper 1/2 of color ram
|
||||
asm("ldy #0");
|
||||
asm("@loop:");
|
||||
asm("lda %v,y", colorbuf);
|
||||
asm("sta $d800,y");
|
||||
asm("lda %v + $100,y", colorbuf);
|
||||
asm("sta $d900,y");
|
||||
asm("iny");
|
||||
asm("bne @loop");
|
||||
// second loop for lower 1/2 of color ram
|
||||
asm("@loop2:");
|
||||
asm("lda %v + $200,y", colorbuf);
|
||||
asm("sta $da00,y");
|
||||
asm("lda %v + $300,y", colorbuf);
|
||||
asm("sta $db00,y");
|
||||
asm("@skip: iny");
|
||||
asm("bne @loop2");
|
||||
}
|
||||
|
||||
void copy_to_hidden_buffer_slow() {
|
||||
memcpy(hidbuf, visbuf, COLS*ROWS);
|
||||
}
|
||||
|
||||
void copy_to_hidden_buffer_fast() {
|
||||
// self-modifying code
|
||||
asm("ldy %v+1", visbuf);
|
||||
asm("sty @loop+2+6*0");
|
||||
asm("iny");
|
||||
asm("sty @loop+2+6*1");
|
||||
asm("iny");
|
||||
asm("sty @loop+2+6*2");
|
||||
asm("iny");
|
||||
asm("sty @skip-1-3");
|
||||
asm("ldy %v+1", hidbuf);
|
||||
asm("sty @loop+5+6*0");
|
||||
asm("iny");
|
||||
asm("sty @loop+5+6*1");
|
||||
asm("iny");
|
||||
asm("sty @loop+5+6*2");
|
||||
asm("iny");
|
||||
asm("sty @skip-1");
|
||||
// fast copy loop
|
||||
asm("ldy #0");
|
||||
asm("@loop:");
|
||||
asm("lda $8000,y");
|
||||
asm("sta $8000,y");
|
||||
asm("lda $8100,y");
|
||||
asm("sta $8100,y");
|
||||
asm("lda $8200,y");
|
||||
asm("sta $8200,y");
|
||||
asm("cpy #$e8");
|
||||
asm("bcs @skip");
|
||||
asm("lda $8300,y");
|
||||
asm("sta $8300,y");
|
||||
asm("@skip: iny");
|
||||
asm("bne @loop");
|
||||
}
|
||||
|
||||
void scroll_start(byte dir) {
|
||||
if (scroll_seq == 0 && dir) {
|
||||
scroll_dir = dir;
|
||||
scroll_seq = 8;
|
||||
// correct sprites b/c our fine offset is one pixel
|
||||
// off depending on last scroll direction
|
||||
if (dir & SCROLL_LEFT) fine_correct_x = 1;
|
||||
else if (dir & SCROLL_RIGHT) fine_correct_x = 0;
|
||||
if (dir & SCROLL_UP) fine_correct_y = 1;
|
||||
else if (dir & SCROLL_DOWN) fine_correct_y = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void scroll_step_move_buffer(char* src, char* dst) {
|
||||
word size = COLS*ROWS;
|
||||
if (scroll_dir & SCROLL_LEFT) {
|
||||
++src;
|
||||
--size;
|
||||
}
|
||||
if (scroll_dir & SCROLL_RIGHT) {
|
||||
++dst;
|
||||
--size;
|
||||
}
|
||||
if (scroll_dir & SCROLL_UP) {
|
||||
src += COLS;
|
||||
size -= COLS;
|
||||
}
|
||||
if (scroll_dir & SCROLL_DOWN) {
|
||||
dst += COLS;
|
||||
size -= COLS;
|
||||
}
|
||||
memmove(dst, src, size);
|
||||
}
|
||||
|
||||
void scroll_step_draw_cells() {
|
||||
if (scroll_dir & SCROLL_UP) ++origin_y;
|
||||
if (scroll_dir & SCROLL_DOWN) --origin_y;
|
||||
if (scroll_dir & SCROLL_LEFT) {
|
||||
++origin_x;
|
||||
scroll_draw_column(COLS-1);
|
||||
}
|
||||
if (scroll_dir & SCROLL_RIGHT) {
|
||||
--origin_x;
|
||||
scroll_draw_column(0);
|
||||
}
|
||||
if (scroll_dir & SCROLL_UP) {
|
||||
scroll_draw_row(ROWS-1);
|
||||
}
|
||||
if (scroll_dir & SCROLL_DOWN) {
|
||||
scroll_draw_row(0);
|
||||
}
|
||||
}
|
||||
|
||||
void scroll_step_move_sprites() {
|
||||
// copy sprites from visible to hidden buffer
|
||||
memcpy(hidbuf + 0x3f8, visbuf + 0x3f8, 8);
|
||||
}
|
||||
|
||||
void scroll_update_pixofs() {
|
||||
// fine scroll starts at 8-5 = 32107 or 12-8 = 45670
|
||||
if (scroll_dir & SCROLL_LEFT) {
|
||||
pixofs_x -= 1;
|
||||
scroll_fine_x = (scroll_seq - 5) & 7;
|
||||
}
|
||||
if (scroll_dir & SCROLL_RIGHT) {
|
||||
pixofs_x += 1;
|
||||
scroll_fine_x = (12 - scroll_seq) & 7;
|
||||
}
|
||||
if (scroll_dir & SCROLL_UP) {
|
||||
pixofs_y -= 1;
|
||||
scroll_fine_y = (scroll_seq - 5) & 7;
|
||||
}
|
||||
if (scroll_dir & SCROLL_DOWN) {
|
||||
pixofs_y += 1;
|
||||
scroll_fine_y = (12 - scroll_seq) & 7;
|
||||
}
|
||||
}
|
||||
|
||||
void scroll_offset_sprites(byte delta) {
|
||||
byte dx = 0;
|
||||
byte dy = 0;
|
||||
// fine scroll starts at 8-5 = 32107 or 12-8 = 45670
|
||||
if (scroll_dir & SCROLL_LEFT) {
|
||||
dx = -delta;
|
||||
}
|
||||
if (scroll_dir & SCROLL_RIGHT) {
|
||||
dx = delta;
|
||||
}
|
||||
if (scroll_dir & SCROLL_UP) {
|
||||
dy = -delta;
|
||||
}
|
||||
if (scroll_dir & SCROLL_DOWN) {
|
||||
dy = delta;
|
||||
}
|
||||
VIC.spr_pos[0].x += dx;
|
||||
VIC.spr_pos[1].x += dx;
|
||||
VIC.spr_pos[0].y += dy;
|
||||
VIC.spr_pos[1].y += dy;
|
||||
}
|
||||
|
||||
void scroll_update_scroll_regs() {
|
||||
wait_offscreen();
|
||||
VIC.ctrl1 = (VIC.ctrl1 & 0xf8) | scroll_fine_y;
|
||||
VIC.ctrl2 = (VIC.ctrl2 & 0xf8) | scroll_fine_x;
|
||||
}
|
||||
|
||||
void scroll_next_step(void) {
|
||||
switch (--scroll_seq) {
|
||||
case 7:
|
||||
scroll_step_move_buffer(visbuf, hidbuf);
|
||||
break;
|
||||
case 6:
|
||||
scroll_step_move_buffer(colorbuf, colorbuf);
|
||||
break;
|
||||
case 5:
|
||||
scroll_step_draw_cells();
|
||||
break;
|
||||
case 4:
|
||||
scroll_step_move_sprites();
|
||||
break;
|
||||
case 3:
|
||||
scroll_swap();
|
||||
copy_color_ram_fast();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void scroll_update(void) {
|
||||
if (scroll_seq) {
|
||||
scroll_update_pixofs();
|
||||
scroll_update_scroll_regs();
|
||||
scroll_offset_sprites(1);
|
||||
scroll_next_step();
|
||||
}
|
||||
}
|
||||
|
||||
void scroll_finish(void) {
|
||||
while (scroll_seq) {
|
||||
scroll_update_pixofs();
|
||||
if (scroll_seq == 4) { scroll_offset_sprites(8); }
|
||||
scroll_next_step();
|
||||
}
|
||||
}
|
||||
|
||||
void scroll_setup(void) {
|
||||
origin_x = origin_y = 0;
|
||||
pixofs_x = pixofs_y = 0;
|
||||
scroll_fine_x = scroll_fine_y = 3;
|
||||
scroll_dir = 0;
|
||||
scroll_seq = 0;
|
||||
|
||||
// setup screen buffer addresses
|
||||
hidbuf = BUFFER_A;
|
||||
visbuf = BUFFER_B;
|
||||
|
||||
memset(BUFFER_A, 0, 0x800);
|
||||
memset(colorbuf, 0, sizeof(colorbuf));
|
||||
|
||||
SET_VIC_BANK(VICBANK);
|
||||
|
||||
// set up 24 line / 38 column mode to hide edges
|
||||
VIC.ctrl1 &= ~0x08; // 24 lines
|
||||
VIC.ctrl2 &= ~0x08; // 38 columns
|
||||
}
|
||||
|
||||
void scroll_refresh(void) {
|
||||
byte i;
|
||||
for (i=0; i<25; i++) {
|
||||
scroll_draw_row(i);
|
||||
}
|
||||
scroll_swap();
|
||||
copy_color_ram_fast();
|
||||
copy_to_hidden_buffer_fast();
|
||||
scroll_dir = 0;
|
||||
scroll_seq = 0;
|
||||
scroll_fine_x = scroll_fine_y = 3;
|
||||
}
|
@ -40,7 +40,7 @@ var ATARI8_KEYCODE_MAP = makeKeycodeMap([
|
||||
]);
|
||||
|
||||
|
||||
export class Atari800 extends BasicScanlineMachine {
|
||||
export class Atari800 extends BasicScanlineMachine implements AcceptsPaddleInput {
|
||||
|
||||
// http://www.ataripreservation.org/websites/freddy.offenga/megazine/ISSUE5-PALNTSC.html
|
||||
cpuFrequency = 1789773;
|
||||
@ -93,7 +93,6 @@ export class Atari800 extends BasicScanlineMachine {
|
||||
this.handler = newKeyboardHandler(
|
||||
this.inputs, ATARI8_KEYCODE_MAP, this.getKeyboardFunction(), true);
|
||||
}
|
||||
|
||||
newBus() {
|
||||
return {
|
||||
read: newAddressDecoder([
|
||||
@ -407,6 +406,10 @@ export class Atari800 extends BasicScanlineMachine {
|
||||
}
|
||||
}
|
||||
|
||||
setPaddleInput(controller: number, value: number): void {
|
||||
this.irq_pokey.pot_inputs[controller] = 255 - value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export class Atari5200 extends Atari800 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user