Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Part 2 serial IO lesson #88

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft

Conversation

quinnyo
Copy link
Contributor

@quinnyo quinnyo commented Apr 27, 2024

This is an early draft PR for the lesson/features discussed in #42. Currently this PR includes only the core serial implementation (sio.asm) and it is not integrated with any other code. There is no included way to build a demo/test here, but you can venture to my gbserial repo where I've been developing/testing this if you like. See comment below for more information on that.

A few questions and things I'm not sure of:

  1. I'm not sure about integrating this with the existing unbricked code. Other than the lack of actual score data, where does it go? How does the score sharing feature get started?
  2. I think using the serial interrupt here would be the first use/mention of interrupts (in reading order). Thoughts?

About the implementation:
Sio (sio.asm) is a kind of multi-byte version of the underlying GB serial API.
Buffers are provided for data in and out. Using SioTransferStart will transfer the whole buffer. Smaller batches are possible but don't have a nice way to start them.
Each byte transfer after the first is started from the serial interrupt.
The clock provider's "catchup delay" is implemented as a simple "sleep" loop executed before every byte transfer. The duration of this can be tuned.
SioTick is to be called regularly -- per-frame. This is most necessary to update the timeout timer for devices using the external clock source. The duration of the timeout is in "ticks" (calls to SioTick).
A simple data integrity test is implemented with the SioPacket functions. This takes the first two bytes of the buffer for a magic number and simple checksum. Sio itself doesn't do anything to handle the result of this test, it's expected that the controlling context (the app-specific protocol) will deal with it.

; :: / `--<[|]= |[ m ]|| ::
; :: \ .______ | ```` || ::
; :: / !| `````| | + oo|| ::
; :: ( ||[ ^u^]| | .. #|| ::
Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I love this!

unbricked/serial-link/sio.asm Outdated Show resolved Hide resolved
@quinnyo
Copy link
Contributor Author

quinnyo commented Jun 28, 2024

The code has been updated a bit. I updated the PR comment to reflect the changes.
I don't think there are any glaring holes in the implementation and it works consistently in my simple test program. (so I need to improve the test!)

I'm not sure how this should be integrated with the unbricked code, or if I need to provide something more significant for testing purposes?

I didn't want to add test code to this repo, so I've been working on the impl in a standalone project (https://github.com/quinnyo/gbserial). sio.asm in this PR should be the same as in that repo at time of writing.
The current program is a simple test where the two devices yell at each other. You first need to press START to toggle clock source on one GB. You get a tick if the checksum of the received packet checks OK, F for uhh, "big Fail" (timed out / incomplete packet). The relevant test bits are in sio_demo.asm.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants