per-scanline modes Actual Apple II TEXT/GR and HGR video address patterns are in Understanding the Apple II Not for DHGR or 80-col but they're probably just same address twice alternating banks tracking clock and reporting video memory contents clock one tick of ~1MHz clock maps to one tick of address counter so is 7 HGR bits or one GR/TEXT horizontal cell "most 6502 cycles are 978 nS long [14 14mhz clocks], but every 65th cycle is 1117 nS long [16 14mhz clocks]." source clock is 14.31818MHz unsigned long would overflow after 20 minutes Could modulo byteclock by 14318180 at iterate() and not overflow as long as it doesn't take longer than 20 minutes between calls to APPLE2Einterface::iterate than 20 minutes...) Could have clk be in 14MHz ticks. unsigned long long will last 40853 years (could be slow on embedded systems) Keep track of phase at clk delta time, and add 14 usually but 16 every 65th Then wall clock is just always ticks / 14318180.0 phase_hpe initially 0 add_cpu_cycles(elapsed_cpu) { clock_cpu += elapsed_cpu clock_14mhz = elapsed_cpu * 14 + (elapsed_cpu + phase_hpe) / 65 * 16 phase_hpe = (phase_hpe + elapsed_cpu) % 65 } clock_14mhz is 14mhz ticks clock_cpu is CPU clocks, averaging 1.023MHz phase_hpe is clock_cpu within horizontal line Current CPU clk (in 1MHz CPU cycles) is used for which audio sample (at libAO sample rate) in the audio waveform we should fill OK - should work with higher fixed rate mark after how many cycles the open apple key should be raised OK - should work with higher fixed rate mark paddle timer OK - should work with higher fixed rate incrementing CPU instruction cycles OK - call add_cpu_cycles() address generator honor softswitches convert clock_cpu to address read empty memory address on bus no longer fails but instead generate address, get byte from RAM and return it recording softswitch mode changes store vector of switch or mode change and byteclock instead of setting before APPLE2Einterface::iterate, pass into iterate honoring softswitch change in APPLE2Einterface initialize scanline mode array to text receive vector of tuple of byteclock and modes fill scanline mode array from passed in vector draw framebuffer by scanline final release: help screen gamepad calibration screen (for desktop GLFW anyway) need to handle asynchronous gamepad arrival (a la HTML5) screenshots for README.md link to emscripten version emscripten: safari misses 'V' for some reason why is it running slow in Chrome? runs fast in Safari and Firefox. :-/ upgrade to 1.37, see if -O2 issue is fixed audio paste somehow store paste event contents into a variable, copy that in GLFW clipboard routines? floppies IDBFS, local storage initialized from DOS 3.3 floppy and other floppies copy into IDBFS from other web pages drag and drop from IDBFS into floppy icons make rasterization less ugly retina canvas? limit to integer-zoomed pixels? GLFW - gamepad using HTML5 gamepad interface note that it doesn't show up until initially used cleanup: deglobalize where possible lower and underscores throughout exceptions? tableize 6502? Run this software, purge fake6502: ProDOS LodeRunner ChopLifter Digitizer Plasmania Christmas Carols Data Capture //e Contiki no network Idiom Translator Pascal - Brad's Disk ...? apple2e -diskII diskII.c600.c67f.bin ~/Downloads/LodeRunner.dsk none apple2e.rom < /dev/null Actual ROM files that are in our Apple IIe, and run Brad's sound digitizer: wget http://www.applelogic.org/files/3420135A.BIN wget http://www.applelogic.org/files/3420134A.bin cat 3420135A.BIN 3420134A.bin > apple2e_a.rom (dd if=/dev/zero bs=16384 count=1 ; cat 3420135A.BIN 3420134A.bin) > apple2e_a.rom apple2e -diskII diskII.c600.c67f.bin ~/packages/Disk\ Images/Brad\'s\ Handwriting/Sound\ Digitizer\ Original\ 1.2.dsk none apple2e_a.rom