Cyan
2019-01-02 04:35:25 UTC
Hello
I'm looking for information on the way the HP48 handle its screen,
and though I have found some by collecting documentation on the topic,
it's still relatively fuzzy.
Do you know if a doc could help ?
Here is below a copy/paste from the question list (in markdown format) :
Questions on HP48
================
Screen
---------
Questions related to grey level support
#### What's the exact refresh rate of HP48 screen ?
All docs seem to mention 64 Hz,
but that sounds too "round".
Could it be 64.1 , or 63.9 ?
Where does the refresh rate is controlled ?
Is refresh rate tied to cpu speed ?
#### What is the exact refresh policy ?
Are there 64 refreshes per second, meaning the whole screen is refreshed in a single scan ?
Or is there one refresh per line, meaning there are actually 64x64=4096 refresh events ?
#### _What_ is pushing pixel data onto screen ?
Is it the cpu directly ? or another component accessing RAM ?
If cpu : I assume there is some kind of "interrupt", and the cpu capability is "reserved" during the refresh. But in such case, it's supposed to send data to some kind of bus, with some kind of address ? What would be this address ?
If dedicated component : I assume the RAM access is likely reserved by the component during the refresh, blocking the CPU. But could the CPU still work using its own registers during that period ?
#### Pixel latency
My own tests let me believe that interleaving up to 3 screens is fine.
I've read people saying that the cycle can be more lengthy, but I wasn't convinced by the results.
Is there any study on pixel fading latency ?
#### Contrast control
It's relatively straightforward to change the contrast of the screen, through a shared value in RAM.
Is it a good idea to play with this setting to generate more nuanced grey levels ? Or is there a crippling latency involved ?
Interrupts
--------------
All docs I could find provide a list of interrupts like below which does not include anything regarding screen :
- Character received by the UART
- Character placed in the UART transmit holding register
- Keyboard button down/repeat
- Timer expiry
- Low battery condition
- IR emission/receipt
- ON-key press
- VLBI (very low battery interrupt)
Now, I understand that it's possible to know which line has been (or will be) drawn thanks to RAM value stored at `LINECOUNT` address, but checking that requires some "busy loop", which is bad for battery consumption, and does not allow doing something else in between.
Is there a way to catch the `$LINECOUNT == 0` event as an interrupt ? or something equivalent ?
I suspect this topic has been solved by arcade games using 3-grey shade graphics.
I'm looking for information on the way the HP48 handle its screen,
and though I have found some by collecting documentation on the topic,
it's still relatively fuzzy.
Do you know if a doc could help ?
Here is below a copy/paste from the question list (in markdown format) :
Questions on HP48
================
Screen
---------
Questions related to grey level support
#### What's the exact refresh rate of HP48 screen ?
All docs seem to mention 64 Hz,
but that sounds too "round".
Could it be 64.1 , or 63.9 ?
Where does the refresh rate is controlled ?
Is refresh rate tied to cpu speed ?
#### What is the exact refresh policy ?
Are there 64 refreshes per second, meaning the whole screen is refreshed in a single scan ?
Or is there one refresh per line, meaning there are actually 64x64=4096 refresh events ?
#### _What_ is pushing pixel data onto screen ?
Is it the cpu directly ? or another component accessing RAM ?
If cpu : I assume there is some kind of "interrupt", and the cpu capability is "reserved" during the refresh. But in such case, it's supposed to send data to some kind of bus, with some kind of address ? What would be this address ?
If dedicated component : I assume the RAM access is likely reserved by the component during the refresh, blocking the CPU. But could the CPU still work using its own registers during that period ?
#### Pixel latency
My own tests let me believe that interleaving up to 3 screens is fine.
I've read people saying that the cycle can be more lengthy, but I wasn't convinced by the results.
Is there any study on pixel fading latency ?
#### Contrast control
It's relatively straightforward to change the contrast of the screen, through a shared value in RAM.
Is it a good idea to play with this setting to generate more nuanced grey levels ? Or is there a crippling latency involved ?
Interrupts
--------------
All docs I could find provide a list of interrupts like below which does not include anything regarding screen :
- Character received by the UART
- Character placed in the UART transmit holding register
- Keyboard button down/repeat
- Timer expiry
- Low battery condition
- IR emission/receipt
- ON-key press
- VLBI (very low battery interrupt)
Now, I understand that it's possible to know which line has been (or will be) drawn thanks to RAM value stored at `LINECOUNT` address, but checking that requires some "busy loop", which is bad for battery consumption, and does not allow doing something else in between.
Is there a way to catch the `$LINECOUNT == 0` event as an interrupt ? or something equivalent ?
I suspect this topic has been solved by arcade games using 3-grey shade graphics.