It doesn't functionally matter since I'm not using any conditional
opcodes in the fast path anyway, but STA removes these side-effects.
Earlier I had mistakenly thought that STA absolute did a
read-before-write on 6502, but this is not the case
(verified with visual6502.org)
DHGR playback modes. Actually the only difference is whether to
initialize (D)HGR display since everything else is steered by the video
stream. 6 of these bytes are currently unused, but it is convenient
to pad to the same length as the TICK opcode so that it does not
complicate the ACK stream framing.
Move towards the convention of using upper-case labels for system use
(soft switches etc) and lower-case for program use.
- Use a safe ZP address instead of $00
- Use dec instead of hex for IP address bytes
- Remove some unused Uthernet/W5100 defines
Optimize the socket buffer management
- Since we're guaranteeing 2K frame padding, the low byte is always 0
- Remove some vestiges of the Uthernet TCP demo code - AFAICT there
isn't a need to compare high and low bytes of the S0RXRSR, this
was just being used as a (slightly risky) check that they were both
not equal (presumably to 0)
- (h/t Oliver Schmidt <ol.sc@web.de>) it turns out that the W5100
automatically wraps the address pointer at the end of the 8k RX/TX
buffer space, so since we're using 8k buffers we don't need any of the
pointer/mask arithmetic to make sure we don't stray outside this range
- Instead, we can just save the W5100 address pointer before we start
doing the stream buffer management and restore it when we're ready
to read from the stream again.
- Moreover, since we know the low-byte is 0 we don't even need to
save it.
This gives us enough free cycles to implement a keypress check. For
now any key will pause the video and any other key resume it.
We still have a whole 16 cycles left over while maintaining the 36/37
cycle tick cadence.
We've saved 73 cycles of "dead time" though, i.e. the
op_ack + CHECKRECV + op_nop "slow path" now takes 2*73 rather than 3*73
cycles. This should result in better audio quality.
- Every time we process an ACK opcode, toggle page 1/page 2 soft
switches to steer subsequent writes between MAIN and AUX memory
- while I'm here, squeeze out some unnecessary operations from the
buffer management
On the player side, this is implemented by maintaining two screen
memory maps, and alternating between opcode streams for each of them.
This is using entirely the wrong colour model for errors, but
surprisingly it already works pretty well in practise (and the frame
rate is acceptable on test videos)
DHGR/HGR could be made runtime selectable by adding a header byte that
determines whether to set the DHGR soft switches before initiating
the decode loop.
While I'm in here, fix op_terminate to clear keyboard strobe before
waiting.