Commit Graph

281 Commits

Author SHA1 Message Date
Ian Flanigan
3048ec52e1
Interruptable spawn (#132)
* Add `spawn` as a way of calling promise-returning blocks

This change adds `spawn` which takes a no-argument, promise-returning
function, calls it, and returns `void`.  This makes it easy to call
async blocks from `useEffect` and other places that don't take async
functions, but also makes such calls explicit.

* Adds interruptability to `spawn`

Now, the task function passed to `spawn` can take an `Interrupted`
argument, which is merely a method that returns `true` if the task
should stop doing work. Likewise, `spawn` returns an `Interrupt`
function that causes the `Interrupted` function to return `true`.

* Change to using `AbortController` and `AbortSignal`

Before, `spawn` used functions to interrupt and determine interruption
state.  Now, based on feedback from @whscullin, it uses
`AbortController` and `AbortSignal`.

Tests now show how the controller can be used to abort long-running
tasks and API calls in the `spawn`.  The also show how signals can be
chained using `addEventListener`.

* Fix `Apple2.tsx`

Forgot to change it to use `AbortController` and `AbortSignal`.

Co-authored-by: Will Scullin <scullin@scullin.com>
2022-06-12 09:06:58 -07:00
Ian Flanigan
d7cb6997d1
Add spawn as a way of calling promise-returning blocks (#131)
This change adds `spawn` which takes a no-argument, promise-returning
function, calls it, and returns `void`.  This makes it easy to call
async blocks from `useEffect` and other places that don't take async
functions, but also makes such calls explicit.
2022-06-12 09:05:01 -07:00
Will Scullin
6f804758f1
Fix preact apple keys 2022-06-10 19:53:40 -07:00
Will Scullin
9686eda3a8
Preact printer (#129) 2022-06-09 12:22:59 -07:00
Ian Flanigan
c9b7987c4c
Fix 2mg header parsing and add tests (#127)
Before, the offset for `FLAGS` in `2mg.ts` was `0x0A`, which is
incorrect according to the spec at:

https://apple2.org.za/gswv/a2zine/Docs/DiskImage_2MG_Info.txt

Now, all of the fields in the 2mg header are described, including
their lengths and any constraints.  These constraints are enforced by
`read2MGHeader` and tested by new tests.
2022-06-06 18:10:06 -07:00
Will Scullin
66f3e04d8e
Preact mass storage (#125)
The major impetus for rewriting in UI, at least. Still some ironing to do, but much nicer than my attempt to do this using the old UI "framework".
2022-06-05 10:57:04 -07:00
Will Scullin
15b7f1e123
Fix mouse mode cursor 2022-06-04 18:39:04 -07:00
Will Scullin
dd10d490f0
Fix some buttons 2022-06-04 14:31:57 -07:00
Will Scullin
72cfbe9062
Fix reset button size 2022-06-04 12:04:47 -07:00
Will Scullin
9628b437b1
Fix drive light state 2022-06-04 11:38:59 -07:00
Will Scullin
451b2f1c31
Push some pixels 2022-06-04 11:07:40 -07:00
Will Scullin
cb615ce995
Fix file name display 2022-06-04 11:06:38 -07:00
Will Scullin
303838f63d
Use CSS modules (#123)
* Use CSS modules

* Fix tests

* Feedback
2022-06-03 15:30:39 -07:00
Ian Flanigan
203d89b8d9
Implement FileSystemFileHandle for file input (#124)
This removes the `FileSystemFileHandleLike` interface in preference to
just implementing the correct interface. The advantage of the
`FileSystemFileHandle` interface is that it can be passed to the
worker directly to load the file.
2022-06-03 10:12:30 -07:00
Will Scullin
3bbc77049d
Type touchups (#122)
* Type touchups

* Fix some type handling
2022-06-01 06:28:05 -07:00
Will Scullin
ef404735cd
Preact error dialog (#120)
Add error dialog, fix dynamic hash updates.
2022-05-31 17:41:24 -07:00
Ian Flanigan
04ae0327c2
Add the recommended eslint plugins for TypeScript (#121)
This adds both the recommended TypeScript checks, plus the recommended
TypeScript checks that require type checking.  This latter addition
means that eslint essentially has to compile all of the TypeScript in
the project, causing it to be slower. This isn't much of a problem in
VS Code because there's a lot of caching being done, but it's clearly
slower when run on the commandline.

All of the errors are either fixed or suppressed.  Some errors are
suppressed because fixing them would be too laborious for the little
value gained.

The eslint config is also slightly refactored to separate the strictly
TypeScript checks from the JavaScript checks.
2022-05-31 08:38:40 -07:00
Will Scullin
e525e12c3c
React linters (#117)
* React hook linter

* React linting

* Simplify config
2022-05-29 13:48:51 -07:00
Ian Flanigan
52a1c65fe4
Create a FileChooser component using showOpenFilePicker (#116)
* Create a FileChooser component using showOpenFilePicker

Before, `FileModal` always used a file input control for selecting
local files. This allowed the emulator to read from the file, but
precluded writing back to the file.

With this change, the `FileModal` delegates to the new `FileChooser`
component. The `FileChooser` will use `showOpenFilePicker` if it is
available and a regular file input if it's not.

Using `showOpenFilePicker` has the advantage of allowing the emulator
to write back to the file (if the user grants permission). While the
emulator does not yet take advantage of this write capability, that
will come.

* Addressed comments

*   useState() instead of direct DOM manipulation
*   backed out eslint changes in favor of suppressing the warning
2022-05-28 10:52:48 -07:00
Will Scullin
2bd7fa59b7
Enforce strict equality (#115) 2022-05-18 08:19:45 -07:00
Will Scullin
41015864f2
Prohibit any 2022-05-17 19:08:28 -07:00
Will Scullin
9a940935af
Refactor some controls (#114)
* Refactor some controls

* Feedback
2022-05-15 14:57:21 -07:00
Will Scullin
c648735b8a
Add touch screen handling (#113)
* Add touch screen handling

* Feedback
2022-05-13 06:55:03 -07:00
Will Scullin
26796900a3
Add slinky and clock (#112) 2022-05-12 07:59:12 -07:00
Will Scullin
7e0901cfc2
Preact mouse support (#111) 2022-05-11 17:21:21 -07:00
Will Scullin
d44cae76a7
Turn on exactOptionalPropertyTypes (#110)
Turn on exactOptionalPropertyTypes
2022-05-11 17:20:49 -07:00
Will Scullin
a46b0df970
Apply semi rule to interfaces (#109) 2022-05-10 08:04:20 -07:00
Will Scullin
4a188a9a5c
Preact UI (#106)
First pass at a Preact UI, still short some major features but full proof of concept.
2022-05-10 06:52:06 -07:00
Will Scullin
702089224f
Clear whole screen during refresh (#108) 2022-05-09 11:51:12 -07:00
Will Scullin
a9885dbfbd
Very crude mouse support. (#95) 2021-12-29 15:00:44 -08:00
Will Scullin
2c02567309
lint fixes 2021-12-25 13:35:12 -08:00
Will Scullin
7ceacec28e
Full page improvements (#96)
* Full page improvements

* Update fullscreen api calls, save fullpage state
2021-12-25 07:24:59 -08:00
Will Scullin
cc70bebc50
Better Smartport support 2021-12-22 20:47:36 -08:00
Will Scullin
ba203498f4
TypeScript remnants (#94)
* Clean up remaining Javascript
* ProDOS to TypeScript.
* NSC to TypeScript
2021-12-22 10:37:21 -08:00
Will Scullin
c24c01539d
No Opcode left behind (#92)
* Better 65C02 support
* NMOS illegal opcodes
2021-12-22 10:37:05 -08:00
Will Scullin
70ec626dd0
Clean up copyright notices (#93) 2021-12-21 12:35:26 -08:00
Will Scullin
2978b72fec Update eslint, fix issues 2021-11-28 16:20:25 -08:00
Will Scullin
badc2fdb74
Support Tom Harte test suite (#88)
A test data set was published at https://github.com/TomHarte/ProcessorTests which contain cycle traces of instructions for various versions of the 6502.

This adds a test harness that reads those data files, and adjusts the CPU6502 behavior to match the behavior of the vanilla and WDC 65C02 test data.

Also converts the existing CPU tests to Typescript, and fixes any inconsistencies that came up from the new behaviors.
2021-10-13 09:15:29 -07:00
Will Scullin
8ab5faee8e
Consistenly use hup to read hash 2021-10-03 11:08:46 -07:00
Will Scullin
2daef8040f
Keep track of disk sides (#87)
Disk side information was being dropped and thus not displayable in the UI. This plumbs the value through various formats and adds some light testing.

Also fixes an issue where URL encoded hashes were not properly interpreted.
2021-10-02 11:45:09 -07:00
Will Scullin
198cf74c75
No smooth scaling 2021-09-27 14:38:04 -07:00
Will Scullin
5cd19cb521
Extended debugging ROM 2021-07-17 16:23:49 -07:00
Will Scullin
f4b0100c98
touchups 2021-07-11 15:18:18 -07:00
Will Scullin
45681d8e89
Better smartport behaviors 2021-07-10 11:44:10 -07:00
Will Scullin
d70425461c
fix drive label 2021-07-09 18:08:26 -07:00
Will Scullin
044e28e050
Woz to TypeScript (#84)
Woz to TypeScript, with tests added before conversion.
2021-07-09 17:54:27 -07:00
Will Scullin
ce3631f3a2
Refactor disk parsing into webworker (#83)
* Refactor disk handling to allow disk processing to happen in a worker
* Type cleanup
* Convert format handlers to TypeScript
* Convert CFFA to TypeScript
2021-07-06 17:04:02 -07:00
Will Scullin
3abd168627
Fix accelarated default 2021-07-05 09:27:12 -07:00
Will Scullin
389cd857e0
fix acceleration 2021-07-04 19:15:02 -07:00
Will Scullin
b4c13d7620
Use AudioWorklet where available (#82)
Use AudioWorklet where available
2021-06-25 15:38:35 -07:00
Will Scullin
8087294456
Lazy load ROMs (#81)
* Switch modules to `esnext` to allow `webpack` to see import statements
* Pass rom names into Apple2 class
* Move ROMs into `system` and `character` directories to allow webpack bundle appropriate ROMs.
* Wait for ROMs to load before completing initialization.
2021-06-13 17:06:16 -07:00
Will Scullin
af57378852
Videomode refactor 2 (#80)
Remove globals from video implementations to allow further refactoring. Experiment with testing video modes.
2021-05-25 12:08:10 -07:00
Will Scullin
47fe12539f
Clean up //e behaviors (#79) 2021-05-09 13:21:15 -07:00
Will Scullin
37cd62dad6
Don't mix tape/audio out 2021-04-25 12:48:27 -07:00
Will Scullin
6c4844cb87
Audio context this binding 2021-04-25 12:09:30 -07:00
Will Scullin
66d8fdc2c2
Allow address input (#78)
Allow address input
2021-04-25 09:37:55 -07:00
Will Scullin
8061caaaff
Typescript mains (#77) 2021-04-24 15:55:21 -07:00
Will Scullin
6af6ddd4a4
Clean up bleed 2021-04-20 19:40:26 -07:00
Will Scullin
bf67d9dca4
Guard against videomode DOS 2021-04-20 18:24:47 -07:00
Will Scullin
90fc5fb7fc
fix gl default 2021-04-20 18:03:18 -07:00
Will Scullin
09c6d6fbb1
Options modal (#75)
Refactor Options modal, webgl scanline, restore `Apple2.apple2`, other minor fixes.
2021-04-20 17:42:32 -07:00
Will Scullin
5c7e335aad
VideoModes refactor part 1 (#60)
* Unify behaviors

* remove vestigial overdrawing

* handle bank 1 lores writes better

* carry over last bit when shifted

* Cleanup.
2021-04-18 19:54:15 -07:00
Will Scullin
f53e50117e
remove sather misreading 2021-04-17 11:43:53 -07:00
Ian Flanigan
207bed3d27
Typescriptify ui/apple2.js (#74)
This is mostly a mechanical change; there are still lots of things
about `ui/apple2` that could be improved.  The change also converts a
few dependencies of `ui/apple2`, like `applesoft/compiler`.

Besides the straight conversions, some other packages have changes to
make all of the typing work out.

Lastly, `@types/micromodal` has been added as a development
dependency.
2021-03-30 17:27:44 -07:00
Will Scullin
e3bbd2d640
lint 2021-03-28 16:56:06 -07:00
Will Scullin
a7aa5ab902
Oh, Safari 2021-03-28 16:49:09 -07:00
Ian Flanigan
4d7068208a
Typescriptify all of the UI peripherals (#73)
* Typescriptify all of the UI peripherals

This converts the audio, gamepad, keyboard, printer, and tape
peripherals into Typescript. This is a pretty mechanical change.

It does fix issue #72, though.

* Add  and  that were missing
2021-03-28 16:39:18 -07:00
Ian Flanigan
54eddb178c
Update webpack-dev-server to 4.0.0-beta1 (#71)
When using the old webpack-dev-server with webpack 5+, we get bitten
by webpack/webpack-dev-server#2692. This upgrades to 4.0.0-beta1 which
also (unhelpfully) changes the config options.  The `watchContentBase`
and `watchOptions` don't seem to have analogs in the new versions, but
I left them commented out for future reference.

Also, this does not update `package-lock.json` because even just
updating locally gave different output since I'm on a different
version of node, I'm guessing.
2021-03-26 13:21:45 -07:00
Ian Flanigan
6395a9009e
Converts ui/drive_lights.js to Typescript (#70)
This change also exposes the `Callbacks` and `DriveNumber` types from
`disk2.ts`.
2021-03-26 07:45:51 -07:00
Ian Flanigan
f230c58bbf
Add green screen support for the GL renderer (#68)
* Add green screen support for the GL renderer

This adds a configuration that is equivalent to a Monitor II monitor
(at least according to the Open Emulator Project) to GL renderer.
This does not need a restart to take effect.

* Update `package.json` to latest `apple2shader` version
2021-03-23 13:02:31 -07:00
Ian Flanigan
a94fdaa065
Fix issue #64 (#66)
During the typescriptification of `disk2.js`
(9d0ec5489c), `drive`, a parameter
reference, was changed into `this.drive`, the current active disk, by
mistake. This change fixes that error.
2021-03-21 09:10:55 -07:00
Will Scullin
db36ca4553
type vidoemodes 2021-03-16 19:16:17 -07:00
Will Scullin
4a4d2a2004
lint 2021-03-16 06:33:32 -07:00
Will Scullin
e0ab1f9891
Avoid startup hiccup 2021-03-15 21:08:33 -07:00
Will Scullin
ecef3010fd
stop nibble stream when drive off 2021-03-15 19:27:55 -07:00
Will Scullin
ab3e97e8d1
Convert more cards to typescript (#63)
Convert more cards to typescript
2021-03-15 12:51:40 -07:00
Will Scullin
027b113cd4
reset flag less agressively 2021-03-14 15:15:54 -07:00
Will Scullin
afa33a4710
fix test 2021-03-13 16:54:09 -08:00
Will Scullin
e83fdd999e
Make breakpoints behave better 2021-03-13 16:08:24 -08:00
Will Scullin
b4d6e95ec2
Unenhanded default to non-smartport 2021-03-13 16:07:29 -08:00
Will Scullin
71814744eb
minor cleanup 2021-03-13 13:22:45 -08:00
Will Scullin
a3c7dd136b
Port language card and smartport to TypeScript (#62)
Port language card and smartport to TypeScript.
2021-03-13 13:18:32 -08:00
Will Scullin
bf483e1178
bind this for debugger api 2021-03-13 12:36:19 -08:00
Will Scullin
bb09a1ec33
Improve debug performance, abstract debugger. (#61)
Stop stringifying opcodes during runtime and only do so upon inspection. Moves all the debugging logic to a common place to allow building an interface.
2021-03-11 22:03:05 -08:00
Will Scullin
5f0d07623d
Revert slot 3 rom change 2021-03-09 06:37:34 -08:00
Will Scullin
63e49696b8
Goose slot detection code 2021-03-08 19:28:52 -08:00
Will Scullin
b9bd03b958
correctly report page2 status 2021-03-07 10:48:09 -08:00
Will Scullin
017e152476
fix double cycle when in debug 2021-03-07 10:35:02 -08:00
Will Scullin
2958fe53c1
Fix strobe pass-through 2021-03-07 04:56:41 -08:00
Will Scullin
b687dd9ac3
tweak video7 behaviors 2021-03-06 18:35:55 -08:00
Will Scullin
87b60d4eb4
Type restructuring 2021-03-06 15:07:06 -08:00
Will Scullin
3c5ded7058
Clean up, restructure MMU switches 2021-03-04 06:31:56 -08:00
Will Scullin
774dcf8089
Fix bank 1 bleed-through 2021-03-01 20:47:15 -08:00
Will Scullin
afc5280ac2
Flesh out some state stuff (#59)
Get save and restore state limping along to nearly as well as before I refactored and broke everything.
2021-02-27 19:17:36 -08:00
Will Scullin
3004aa99f2
Fix some edge cases 2021-02-21 21:26:07 -08:00
Will Scullin
be35aa9315
NTSC shader (#58)
Incorporate a real NTSC shader.
2021-02-21 18:38:21 -08:00
Will Scullin
1923d7a71c
Fix gamepad support
Thanks @JasonWoof
2021-02-15 17:55:46 -08:00
Will Scullin
3f966ad608
Basic binary file support. (#56) 2021-02-07 21:58:19 -08:00
Ian Flanigan
910238bf63
Convert cards/disk2.js to Typescript (#54)
* Convert `cards/disk2.js` to Typescript

This is mostly a straightforward conversion of `cards/disk2.js` to
Typescript, with the following exceptions:

*   `setState()` did not restore the drive light state correctly
    because the callback was called with the old `on` value.

*   `setPhase()` did not work for WOZ images.

*   `getBinary()` did not work for `nib` files.

*   `getBase64()` did not work for `nib` files and maybe didn't work
    right at all.

Even with these fixes, local storage still doesn't work correctly.

I have also added several TODOs where methods don't support WOZ disks.

* Convert most uses of `memory` to `Uint8Array`

There are many places in the existing code where we use `Uint8Array`
directly. This change merely makes the `memory` type equivalent to
`Uint8Array`.

This change also changes most ROM data to be read-only in Typescript
to ensure that it is not modified by mistake. This can't be done just
by applying `as const` to the declaration because `Uint8Array`s are
can not be expressed as literals. Instead, we create a new type,
`ReadonlyUint8Array` that drops the mutation methods and makes indexed
access read-only.

See
https://www.growingwiththeweb.com/2020/10/typescript-readonly-typed-arrays.html
for details.

* Tighten types and document `disk2.ts`

While trying to understand the Disk ][ emulation, I tighted the types
and documented the parts that I could, including references to other
sources, like _Understanding the Apple //e_ by Jim Sather.

The one functional change is the addition of the P6 ROM of DOS 3.2 and
earlier. This is automatically selected if the card is initialized for
13 sector disks.
2021-02-07 20:50:50 -08:00
Ian Flanigan
dc13b6a59a
DOS 13-sector tests and fixes (#53)
Like the DOS 3.3 and ProDOS sector order issues, this change fixes the
physical order of the sectors on 13-sector disks when nibblized.

This change also adds tests for the 13-sector format to verify the
sector order.

One of the crazy things is that _Beneath Apple DOS_ failed me in this
instance because it doesn't discuss what happens to the last byte in
"5 and 3" encoding anywhere (AFAICT). I went back to the DOS 3.1
source released by the Computer History Museum here:

    https://computerhistory.org/blog/apple-ii-dos-source-code/

The code is in `appdos31.lst` in the `POSTNIB` routine on line 4777.
2021-01-03 15:01:30 -08:00