diff options
| author | TheMas3212 <mas3212@gmail.com> | 2023-09-25 12:38:37 +1000 |
|---|---|---|
| committer | TheMas3212 <mas3212@gmail.com> | 2023-09-25 12:38:37 +1000 |
| commit | d78b5e9f718b476da74ec67e05def9ceb622270e (patch) | |
| tree | 1b4ec2789e9763048546607459833110197e5d59 /src | |
| parent | 16a790a5b27f3d4212f9dd9be49fa33cf97c6b92 (diff) | |
| download | tasd-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.ts | 78 | ||||
| -rw-r--r-- | src/file.ts | 2 | ||||
| -rw-r--r-- | src/packets/general.ts | 30 | ||||
| -rw-r--r-- | src/packets/index.ts | 4 | ||||
| -rw-r--r-- | src/packets/input.ts | 33 | ||||
| -rw-r--r-- | src/packets/nes.ts | 23 | ||||
| -rw-r--r-- | src/packets/snes.ts | 28 |
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}`; } } |
