summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTheMas3212 <mas3212@gmail.com>2023-09-25 12:38:37 +1000
committerTheMas3212 <mas3212@gmail.com>2023-09-25 12:38:37 +1000
commitd78b5e9f718b476da74ec67e05def9ceb622270e (patch)
tree1b4ec2789e9763048546607459833110197e5d59 /src
parent16a790a5b27f3d4212f9dd9be49fa33cf97c6b92 (diff)
downloadtasd-js-d78b5e9f718b476da74ec67e05def9ceb622270e.tar.gz
tasd-js-d78b5e9f718b476da74ec67e05def9ceb622270e.zip
Update to match specification as of 2023-09-25
Update TRANSITION Add PORT_OVERREAD Add SNES_LATCH_FILTER Remove SNES_OVERREAD Remove NES_OVERREAD
Diffstat (limited to 'src')
-rw-r--r--src/constants.ts78
-rw-r--r--src/file.ts2
-rw-r--r--src/packets/general.ts30
-rw-r--r--src/packets/index.ts4
-rw-r--r--src/packets/input.ts33
-rw-r--r--src/packets/nes.ts23
-rw-r--r--src/packets/snes.ts28
7 files changed, 108 insertions, 90 deletions
diff --git a/src/constants.ts b/src/constants.ts
index 4ff721a..44c763f 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -1,50 +1,50 @@
export const PACKET_TYPES = {
// General Keys
- 'CONSOLE_TYPE': 1,
- 'CONSOLE_REGION': 2,
- 'GAME_TITLE': 3,
- 'ROM_NAME': 4,
- 'ATTRIBUTION': 5,
- 'CATEGORY': 6,
- 'EMULATOR_NAME': 7,
- 'EMULATOR_VERSION': 8,
- 'EMULATOR_CORE': 9,
- 'TAS_LAST_MODIFIED': 10,
- 'DUMP_CREATED': 11,
- 'DUMP_LAST_MODIFIED': 12,
- 'TOTAL_FRAMES': 13,
- 'RERECORDS': 14,
- 'SOURCE_LINK': 15,
- 'BLANK_FRAMES': 16,
- 'VERIFIED': 17,
- 'MEMORY_INIT': 18,
- 'GAME_IDENTIFIER': 19,
- 'MOVIE_LICENSE': 20,
- 'MOVIE_FILE': 21,
- 'PORT_CONTROLLER': 240,
+ 'CONSOLE_TYPE': 0x0001,
+ 'CONSOLE_REGION': 0x0002,
+ 'GAME_TITLE': 0x0003,
+ 'ROM_NAME': 0x0004,
+ 'ATTRIBUTION': 0x0005,
+ 'CATEGORY': 0x0006,
+ 'EMULATOR_NAME': 0x0007,
+ 'EMULATOR_VERSION': 0x0008,
+ 'EMULATOR_CORE': 0x0009,
+ 'TAS_LAST_MODIFIED': 0x000A,
+ 'DUMP_CREATED': 0x000B,
+ 'DUMP_LAST_MODIFIED': 0x000C,
+ 'TOTAL_FRAMES': 0x000D,
+ 'RERECORDS': 0x000E,
+ 'SOURCE_LINK': 0x000F,
+ 'BLANK_FRAMES': 0x0010,
+ 'VERIFIED': 0x0011,
+ 'MEMORY_INIT': 0x0012,
+ 'GAME_IDENTIFIER': 0x0013,
+ 'MOVIE_LICENSE': 0x0014,
+ 'MOVIE_FILE': 0x0015,
+ 'PORT_CONTROLLER': 0x00F0,
+ 'PORT_OVERREAD': 0x00F1,
// NES Specific Keys
- 'NES_LATCH_FILTER': 257,
- 'NES_CLOCK_FILTER': 258,
- 'NES_OVERREAD': 259,
- 'NES_GAME_GENIE_CODE': 260,
+ 'NES_LATCH_FILTER': 0x0101,
+ 'NES_CLOCK_FILTER': 0x0102,
+ 'NES_GAME_GENIE_CODE': 0x0104,
// SNES Specific Keys
- 'SNES_CLOCK_FILTER': 514,
- 'SNES_OVERREAD': 515,
- 'SNES_GAME_GENIE_CODE': 516,
- 'SNES_LATCH_TRAIN': 517,
+ 'SNES_LATCH_FILTER': 0x0201,
+ 'SNES_CLOCK_FILTER': 0x0202,
+ 'SNES_GAME_GENIE_CODE': 0x0204,
+ 'SNES_LATCH_TRAIN': 0x0205,
// Genesis Specific Keys
- 'GENESIS_GAME_GENIE_CODE': 2052,
+ 'GENESIS_GAME_GENIE_CODE': 0x0804,
// Input Frame/Timing Keys
- 'INPUT_CHUNK': 65025,
- 'INPUT_MOMENT': 65026,
- 'TRANSITION': 65027,
- 'LAG_FRAME_CHUNK': 65028,
- 'MOVIE_TRANSITION': 65029,
+ 'INPUT_CHUNK': 0xFE01,
+ 'INPUT_MOMENT': 0xFE02,
+ 'TRANSITION': 0xFE03,
+ 'LAG_FRAME_CHUNK': 0xFE04,
+ 'MOVIE_TRANSITION': 0xFE05,
// Extraneous Keys
- 'COMMENT': 65281,
- 'EXPERIMENTAL': 65534,
- 'UNSPECIFIED': 65535,
+ 'COMMENT': 0xFF01,
+ 'EXPERIMENTAL': 0xFFFE,
+ 'UNSPECIFIED': 0xFFFF,
} as const;
export function packetName(key: number) {
for (const name of Object.keys(PACKET_TYPES)) {
diff --git a/src/file.ts b/src/file.ts
index 82194c3..78def41 100644
--- a/src/file.ts
+++ b/src/file.ts
@@ -1,4 +1,4 @@
-import { packetName, PACKET_TYPES } from "./constants";
+import { PACKET_TYPES } from "./constants";
import { parse } from "./packets";
import { DumpLastModifiedPacket, PortControllerPacket } from "./packets/general";
import { InputChunkPacket } from "./packets/input";
diff --git a/src/packets/general.ts b/src/packets/general.ts
index 7e0cb1f..cf8d61e 100644
--- a/src/packets/general.ts
+++ b/src/packets/general.ts
@@ -1,5 +1,9 @@
import { PACKET_TYPES } from "../constants";
-import { encodeString, readBoolean, readString, readUint16, readUint32, readUint64, readUint8, writeBoolean, writeString, writeUint16, writeUint32, writeUint64, writeUint8 } from "../utils";
+import {
+ encodeString, readString, writeString, readBoolean, writeBoolean,
+ readUint8, writeUint8, readUint16, writeUint16,
+ readUint32, writeUint32, readUint64, writeUint64
+} from "../utils";
import { TASDPacket, buildBuffer } from "./utils";
export class ConsoleTypePacket implements TASDPacket {
@@ -483,4 +487,26 @@ export class PortControllerPacket implements TASDPacket {
toString() {
return `PortController ${this.port}, 0x${this.type.toString(16).padStart(4, '0')}`;
}
-} \ No newline at end of file
+}
+
+export class PortOverreadPacket implements TASDPacket {
+ constructor(public port: number, public high: boolean) {}
+ get key() {
+ return PACKET_TYPES.PORT_OVERREAD;
+ }
+ get size() {
+ return 2;
+ }
+ static fromBuffer(buffer: Uint8Array) {
+ return new this(readUint8(buffer, 0), readBoolean(buffer, 1));
+ }
+ toBuffer(g_keylen: number): Uint8Array {
+ const payload = new Uint8Array(2);
+ writeUint8(this.port, payload, 0);
+ writeBoolean(this.high, payload, 1);
+ return buildBuffer(g_keylen, this.key, payload);
+ }
+ toString(): string {
+ return `PortOverreadPacket ${this.port}, ${this.high}`;
+ }
+}
diff --git a/src/packets/index.ts b/src/packets/index.ts
index 71ede01..a8ae2bd 100644
--- a/src/packets/index.ts
+++ b/src/packets/index.ts
@@ -40,14 +40,14 @@ export function parse(type: number, buffer: Uint8Array): TASDPacket {
case PACKET_TYPES.MOVIE_LICENSE: return general.MovieLicensePacket.fromBuffer(buffer);
case PACKET_TYPES.MOVIE_FILE: return general.MovieFilePacket.fromBuffer(buffer);
case PACKET_TYPES.PORT_CONTROLLER: return general.PortControllerPacket.fromBuffer(buffer);
+ case PACKET_TYPES.PORT_OVERREAD: return general.PortOverreadPacket.fromBuffer(buffer);
// NES
case PACKET_TYPES.NES_LATCH_FILTER: return nes.NESLatchFilterPacket.fromBuffer(buffer);
case PACKET_TYPES.NES_CLOCK_FILTER: return nes.NESClockFilterPacket.fromBuffer(buffer);
- case PACKET_TYPES.NES_OVERREAD: return nes.NESOverreadPacket.fromBuffer(buffer);
case PACKET_TYPES.NES_GAME_GENIE_CODE: return nes.NESGameGenieCodePacket.fromBuffer(buffer);
// SNES
+ case PACKET_TYPES.SNES_LATCH_FILTER: return snes.SNESLatchFilterPacket.fromBuffer(buffer);
case PACKET_TYPES.SNES_CLOCK_FILTER: return snes.SNESClockFilterPacket.fromBuffer(buffer);
- case PACKET_TYPES.SNES_OVERREAD: return snes.SNESOverreadPacket.fromBuffer(buffer);
case PACKET_TYPES.SNES_GAME_GENIE_CODE: return snes.SNESGameGenieCodePacket.fromBuffer(buffer);
case PACKET_TYPES.SNES_LATCH_TRAIN: return snes.SNESLatchTrainPacket.fromBuffer(buffer);
// Genesis
diff --git a/src/packets/input.ts b/src/packets/input.ts
index 7d02a2e..e2e712d 100644
--- a/src/packets/input.ts
+++ b/src/packets/input.ts
@@ -25,7 +25,12 @@ export class InputChunkPacket implements TASDPacket {
}
export class InputMomentPacket implements TASDPacket {
- constructor(public port: number, public indexType: number, public index: bigint, public inputs: Uint8Array) {}
+ constructor(
+ public port: number,
+ public indexType: number,
+ public index: bigint,
+ public inputs: Uint8Array
+ ) {}
get key() {
return PACKET_TYPES.INPUT_MOMENT;
}
@@ -53,26 +58,34 @@ export class InputMomentPacket implements TASDPacket {
}
export class TransitionPacket implements TASDPacket {
- constructor(public indexType: number, public index: bigint, public type: number, public data: Uint8Array) {}
+ constructor(
+ public indexType: number,
+ public port: number,
+ public index: bigint,
+ public type: number,
+ public data: Uint8Array
+ ) {}
get key() {
return PACKET_TYPES.TRANSITION;
}
get size() {
- return 10 + this.data.length;
+ return 11 + this.data.length;
}
static fromBuffer(buffer: Uint8Array) {
const indexType = readUint8(buffer, 0);
- const index = readUint64(buffer, 1);
- const type = readUint8(buffer, 9);
- const data = buffer.subarray(10);
- return new this(indexType, index, type, data);
+ const port = readUint8(buffer, 1);
+ const index = readUint64(buffer, 2);
+ const type = readUint8(buffer, 10);
+ const data = buffer.subarray(11);
+ return new this(indexType, port, index, type, data);
}
toBuffer(g_keylen: number): Uint8Array {
const payload = new Uint8Array(this.size);
writeUint8(this.indexType, payload, 0);
- writeUint64(this.index, payload, 1);
- writeUint8(this.type, payload, 9);
- payload.set(this.data, 10);
+ writeUint8(this.port, payload, 1);
+ writeUint64(this.index, payload, 2);
+ writeUint8(this.type, payload, 10);
+ payload.set(this.data, 11);
return buildBuffer(g_keylen, this.key, payload);
}
toString(): string {
diff --git a/src/packets/nes.ts b/src/packets/nes.ts
index 30b1418..5c15966 100644
--- a/src/packets/nes.ts
+++ b/src/packets/nes.ts
@@ -1,5 +1,5 @@
import { PACKET_TYPES } from "../constants";
-import { encodeString, readBoolean, readString, readUint16, readUint8, writeBoolean, writeUint16, writeUint8 } from "../utils";
+import { encodeString, readString, readUint16, readUint8, writeUint16, writeUint8 } from "../utils";
import { TASDPacket, buildBuffer } from "./utils";
export class NESLatchFilterPacket implements TASDPacket {
@@ -44,27 +44,6 @@ export class NESClockFilterPacket implements TASDPacket {
}
}
-export class NESOverreadPacket implements TASDPacket {
- constructor(public high: boolean) {}
- get key() {
- return PACKET_TYPES.NES_OVERREAD;
- }
- get size() {
- return 1;
- }
- static fromBuffer(buffer: Uint8Array) {
- return new this(readBoolean(buffer, 0));
- }
- toBuffer(g_keylen: number): Uint8Array {
- const payload = new Uint8Array(1);
- writeBoolean(this.high, payload, 0);
- return buildBuffer(g_keylen, this.key, payload);
- }
- toString(): string {
- return `NESOverread ${this.high}`;
- }
-}
-
export class NESGameGenieCodePacket implements TASDPacket {
constructor(public code: string) {}
get key() {
diff --git a/src/packets/snes.ts b/src/packets/snes.ts
index 07ee91b..5235a79 100644
--- a/src/packets/snes.ts
+++ b/src/packets/snes.ts
@@ -1,46 +1,46 @@
import { PACKET_TYPES } from "../constants";
-import { encodeString, readBoolean, readString, readUint64, readUint8, writeBoolean, writeUint64, writeUint8 } from "../utils";
+import { encodeString, readString, readUint16, readUint64, readUint8, writeUint16, writeUint64, writeUint8 } from "../utils";
import { TASDPacket, buildBuffer } from "./utils";
-export class SNESClockFilterPacket implements TASDPacket {
+export class SNESLatchFilterPacket implements TASDPacket {
constructor(public time: number) {}
get key() {
- return PACKET_TYPES.SNES_CLOCK_FILTER;
+ return PACKET_TYPES.SNES_LATCH_FILTER;
}
get size() {
- return 1;
+ return 2;
}
static fromBuffer(buffer: Uint8Array) {
- return new this(readUint8(buffer, 0));
+ return new this(readUint16(buffer, 0));
}
toBuffer(g_keylen: number): Uint8Array {
- const payload = new Uint8Array(1);
- writeUint8(this.time, payload, 0);
+ const payload = new Uint8Array(2);
+ writeUint16(this.time, payload, 0);
return buildBuffer(g_keylen, this.key, payload);
}
toString(): string {
- return `SNESClockFilter ${this.time}`;
+ return `SNESLatchFilter ${this.time}`;
}
}
-export class SNESOverreadPacket implements TASDPacket {
- constructor(public high: boolean) {}
+export class SNESClockFilterPacket implements TASDPacket {
+ constructor(public time: number) {}
get key() {
- return PACKET_TYPES.SNES_OVERREAD;
+ return PACKET_TYPES.SNES_CLOCK_FILTER;
}
get size() {
return 1;
}
static fromBuffer(buffer: Uint8Array) {
- return new this(readBoolean(buffer, 0));
+ return new this(readUint8(buffer, 0));
}
toBuffer(g_keylen: number): Uint8Array {
const payload = new Uint8Array(1);
- writeBoolean(this.high, payload, 0);
+ writeUint8(this.time, payload, 0);
return buildBuffer(g_keylen, this.key, payload);
}
toString(): string {
- return `SNESOverread ${this.high}`;
+ return `SNESClockFilter ${this.time}`;
}
}