Commit Graph

429 Commits

Author SHA1 Message Date
Ian Flanigan 4688cae5b2
Refactor key handling to use `event.key` (#152)
Before, keyboard input used key codes to map events to Apple II keys.
This worked reasonably well, but `event.keyCode` was deprecated and
slated to be removed.

The refactored code now uses `event.key` which returns the localized,
keyboard-mapped key that the user pressed, which may be a letter or a
"symbolic" key.  This is then transformed into an Apple II key.

One side effect of the refactoring is that the keys now light up as
you type and that combinations of mouse clicks on modifiers and plain
keys will take the modifiers into account.
2022-08-24 18:23:22 -07:00
Ian Flanigan e1e8eec218
Make errors in the disk and audio workers not block the emulator (#150)
Before, if there was an error in the audio worker or in the disk
worker, the emulator would not start. This could happen, for example,
if the page is loaded directly from disk in Chrome instead of through
a server.

Now, even if there is an error, the emulator will start.
2022-08-21 12:41:19 -07:00
Ian Flanigan 62568d19f4
Prevent the default action when the Apple keyboard handles a key (#151)
Before, if the browser window wasn't tall enough to show the whole
keyboard, using the arrow keys in the window would cause the page
to move as well.  Now all key events that are sent to the keyboard
have `preventDefault()` called on them.
2022-08-21 12:37:03 -07:00
Will Scullin 89cf6aa17b
Add blank test disks 2022-08-20 08:33:09 -07:00
Will Scullin fec0e14465
Fix sector wrap issue, validate sector 2022-08-20 08:31:34 -07:00
Will Scullin 04ef236601
Double Hires preview 2022-08-05 20:32:55 -07:00
Will Scullin 22c651265e
Fix numbers 2022-07-26 18:46:39 -07:00
Will Scullin a5256ae134
More file modal fixes 2022-07-26 18:05:33 -07:00
Will Scullin ac336b3cce
Really relative this time 2022-07-25 19:41:03 -07:00
Will Scullin 52af193caa
Use fetch for relative path 2022-07-25 19:27:55 -07:00
Will Scullin a45eaeb193
Fix charset 2022-07-25 19:24:16 -07:00
Will Scullin c7f36596e3
lazy load file index 2022-07-24 13:53:06 -07:00
Will Scullin 468fad9385
Fix deleted file handling 2022-07-24 08:00:02 -07:00
Will Scullin ed9370fd21
More hires preview tweaks 2022-07-23 16:09:33 -07:00
Will Scullin c7e9598cc5
relax upper hires preview bound 2022-07-23 16:04:20 -07:00
Will Scullin bf789eb2fd
Add hires preview (#146) 2022-07-23 15:51:12 -07:00
Will Scullin 5170738ddc
Debugger off by default 2022-07-23 12:32:40 -07:00
Will Scullin e414f8d105
Debugger disk info groundwork (#145) 2022-07-23 12:00:38 -07:00
dependabot[bot] 9dcc741305
Bump terser from 5.6.1 to 5.14.2 (#144)
Bumps [terser](https://github.com/terser/terser) from 5.6.1 to 5.14.2.
- [Release notes](https://github.com/terser/terser/releases)
- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/terser/terser/commits)

---
updated-dependencies:
- dependency-name: terser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-19 18:31:03 -07:00
Will Scullin 087dbd3602
Fix copy paste outside of screen (#143) 2022-07-16 20:50:15 -07:00
Will Scullin c0ff1e8129
More debugger panels (#141) 2022-07-13 20:34:50 -07:00
Will Scullin fd5217158e
Add language card 2022-07-10 07:58:29 -07:00
Will Scullin e367d56bc3
Add copy/paste 2022-07-06 14:00:18 -07:00
Will Scullin 7774a2a14a
Fix http json loading 2022-07-04 15:49:52 -07:00
Will Scullin c2b78951a7
Add load binary file (#140)
* Add load binary file

* Add some validity indicators

* cleanup
2022-07-04 13:10:47 -07:00
Will Scullin c5faad2f9f
Add stylelint (#139) 2022-06-25 17:40:47 -07:00
Will Scullin fe955fba41
New linter fixes 2022-06-25 08:26:46 -07:00
Ian Flanigan d67f3d8086
Applesoft compiler fixes (#98)
* Add tests for Applesoft compiler in preparation for refactoring

While refactoring the compiler, I found several small bugs:

*   Lower-case letters in strings and REM statements were converted
    to upper-case.
*   Lines are stored in the order received, not sorted by line number.
*   Does not prefer `ATN` to `AT`.
*   Does not prefer `TO` to `AT`.
*   `DATA` statements don't preserve spaces.
*   `DATA` statements don't preserve lowercase.

These will be fixed in the upcoming refactoring.

* Refactor the Applesoft Compiler

Before, the compiler had a few bugs that were not trivial to solve
because the implementation was in one heavily-nested function.

In this refactoring of the compiler, things like tokenization have
been split into separate methods which makes them a bit easier to
understand.

This refactoring also passes all of the tests.

* Set `PRGEND` when compiling to memory

Before, `PRGEND` was not adjusted which made round-tripping from
the Applesoft compiler to the decompiler not work.  This change
now updates `PRGEND` with the end-of-program + 2 bytes which seems
to be the most frequent value that I have observed.

* Fix two compiler bugs

In debugging the decompiler, I noticed two bugs in the compiler:
*   The first character after a line number was skipped.
*   `?` was not accepted as a shortcut for `PRINT`.

This change fixes these two problems and adds tests.

* Ignore spaces more aggressively

It turns out that Applesoft happily accepts 'T H E N' for `THEN`
but the parser did not. This change fixes that and adds tests for
some odd cases.

Interestingly, this means that there are some valid statements
that Applesoft can never parse correctly because it is greedy
and ignores (most) spaces. For example, `NOT RACE` will always
parse as `NOTRACE` even though `NOT RACE` is a valid expression.

* Move tokens into a separate file

Because the token lists are just maps in opposite directions, put
them in the same file. In the future, maybe we can build one
automatically.

* Fix `apple2.ts`

I had neglected to actually update `apple2.ts` to use the new
compiler and decompiler. They now do.

Also, the decompiler can be created from `Memory`. It assumes,
though, that the zero page pointers to the start and end of the
program are correct.

* Address comments

*   No more `as const` for tokens.
*   Extracted zero page constants to their own file.

Co-authored-by: Will Scullin <scullin@scullin.com>
2022-06-23 20:41:45 -07:00
Ian Flanigan 7e41c69366
Add a basic write test for WOZ images (#138)
* Add a basic write test for WOZ images

The new test just tries to change some random nibbles at the beginning
of the image and then verifies that the change has been recorded.
This exposed a bug where `q7` was never set to `true` when write mode
was toggled on.

Also, the assumptions and limitations of `moveHead` are more clearly
documented.

* Address comments

* Improved `moveHead` documentation a bit more.
* Removed redundant variable in `readNibble`.
* Refactored `findSector` and commented out the chatty log line.

All tests pass. No lint warnings.
2022-06-23 06:38:36 -07:00
Will Scullin f283dae7e1
2IMG Download support. (#137)
* 2IMG Download support.

* Use string encoder/decoder
2022-06-21 20:34:19 -07:00
Ian Flanigan 99ba052597
Add tests for WOZ disks (#136)
* Add a test for the dirty callback on writes

This new test just checks that a clean disk becomes dirty after a
write _and_ that the dirty callback is fired.

* Add tests for WOZ disks

The new tests verify the basic read behavior of the state sequencer on
well-behaved disks, including sync bytes and so on.  Write tests are
still to come.

There's also a change to the Woz format to return the info chunk data
as well.
2022-06-19 19:52:06 -07:00
Will Scullin 466a7eed78
Cheap and cheerful debugger (#135)
* Cheap and cheerful debugger

* Try to manage focus
2022-06-19 19:42:34 -07:00
Will Scullin c7a7bcd19b
Simple Preact download (#134)
* Simple Preact download
2022-06-19 09:01:44 -07:00
Ian Flanigan 5b5655b70e
Add tests for the Disk II card (#133)
* Add tests for the DiskII card

This change adds basic read tests for nibble-based disks for the
DiskII card and fixes a few minor errors.

These tests are in preparation for refactoring.

* Add write tests

These are some basic tests of writing to nibble disks.  In the process,
one minor bug was found, fixed and documented.

* Fix the write tests

I misinterpreted something from Sather and thought that the high bit
had to be set on the data for writing to happen at all.  This is not
true.  Instead, there is a flux transition every time the high bit is
set as the data is left-shifted out of the data register.  The
erroneous test has been removed.

At the same time, I finally understand what `skip` does and documented
that.

* Add tests for saving and restoring Disk II state

These are not exhaustive tests, but they ensure that some basic state
is saved and restored.
2022-06-18 16:54:33 -07:00
Will Scullin efe8594845
Preact Videoterm 2022-06-15 18:44:58 -07:00
Will Scullin 375b4bb1d5
Fix app icon 2022-06-15 09:43:08 -07:00
Will Scullin 0f66e66c0e
Fix apple2shader types 2022-06-15 09:42:07 -07:00
Will Scullin f3f470ffc1
Fix iOS Safari iCloud 2022-06-13 19:58:21 -07:00
Will Scullin cc025447dc
Fix write error status 2022-06-12 19:39:03 -07:00
Will Scullin cc46d040ca
Add drag and drop for disks (#130)
* Add drag and drop for disks

* Simplify storage state

* Switch to spawn, add abort signal to loads
2022-06-12 09:42:01 -07:00
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