# emu8910
This repository contains a Typescript implementation of General Instrument's [`AY8910`](https://en.wikipedia.org/wiki/General_Instrument_AY-3-8910) PSG (programmable sound generator).
It implements most of the PSG's original registers.
A datasheet can be found [`here`](http://map.grauw.nl/resources/sound/generalinstrument_ay-3-8910.pdf).
**Listen to it in action!**
* [`AYSir`](https://drsnuggles.github.io/AYSir/?engine=lunar)
Sound output is achieved in the browser through an `AudioContext()` hook.
This emulator also adds interrupt support (with variable frequency) for updating the PSG's registers.
FIR filter data generated using:
[`https://www.arc.id.au/FilterDesign.html`](https://www.arc.id.au/FilterDesign.html)
Compile with `tsc emu8910.ts`.
To use simply create a PSG49 object as follows:
```
var emu8910 = new PSG49(YM_CLOCK_ZX, 50);
```
Which sets the default clock speed and interrupt frequency (50 Hz).
This exposes a a PSG register file in the `emu8910.register` object:
```
emu8910.register.A_FINE
emu8910.register.A_COARSE
emu8910.register.B_FINE
emu8910.register.B_COARSE
emu8910.register.C_FINE
emu8910.register.C_COARSE
emu8910.register.NOISE_PERIOD
emu8910.register.MIXER
emu8910.register.A_VOL
emu8910.register.B_VOL
emu8910.register.C_VOL
emu8910.register.ENV_FINE
emu8910.register.ENV_COARSE
emu8910.register.ENV_SHAPE
```
The register file is then used to control the PSG or extract state information.
To play a FYM module:
```
song = new FYMReader();
emu8910.interrupt.routine =
emu8910.clock.frequency = song.getClockRate()
emu8910.interrupt.frequency = song.getFrameRate()
```
This sets the ISR (Interrupt Service Routine) function, clock and interrupt frequency for a specific song.
To stop playback:
```
emu8910.driver.device.suspend()
emu8910.interrupt.frequency = 0
```
To resume:
```
emu8910.driver.device.resume()
emu8910.interrupt.frequency = song.getFrameRate()
```
Note: You can access the emulator's internal register file with `emu8910.register`.
These registers need to be updated at the frequency of the ISR.
Files:
* `src/emu8910.ts` - core emulator implementation
* `fym.js` - FYM (Fast YM) format parser
* `parser.js` - register parser
* `index.html` - HTML boilerplate
To run demo start web server: `python -m http.server 8000` and navigate to `index.html`.
Then click anywhere on the page to start audio output.