Het artikel beschrijft de technische uitbreiding van het project 'Quicktake for Apple II'. De auteur heeft, gebaseerd op de broncode van libgphoto2, ondersteuning toegevoegd voor de zogenaamde 'Sierra-klasse' camera's.
Belangrijkste punten uit het artikel:
- Technische beperkingen: Vanwege CPU- en geheugenbeperkingen is de JPEG-decoder beperkt tot afbeeldingen van 640×480 pixels.
- Driver-architectuur: Er is een modulair systeem ontwikkeld waardoor drivers alleen in het geheugen worden geladen wanneer dat nodig is, wat essentieel is voor de beperkte opslagcapaciteit van diskettes.
- Hardwarematige uitdagingen: Door timingproblemen met de ACIA 6551-chip van de Apple II is de seriële communicatiesnelheid beperkt tot 19200bps, terwijl PC's 115200bps ondersteunen.
- Ondersteunde modellen: Geteste modellen zoals de Sanyo VPC-G1 en VPC-G200 werken, en er is een lijst met andere waarschijnlijk compatibele camera's (o.a. van Agfa, Epson en Olympus).
- Optimalisatie: Om ruimte te besparen op de diskette is gebruikgemaakt van
zx02-compressie voor binaries en een aangepaste LOADER.SYSTEM.
- Toekomst: De volgende stap is de implementatie van een driver voor de complexere Canon PowerShot 350.
Sierra digitale camera's op de Apple II
Op basis van de broncode van libgphoto2 heb ik besloten om nader te kijken naar wat ik (en zij) de "Sierra-klasse" camera's noemen. Er zijn veel camera's die hetzelfde protocol delen; er worden meer dan 80 modellen vermeld. Niet alle camera's zullen bruikbaar zijn op de Apple II, aangezien mijn JPEG-decoder hardcoded is ingesteld op afbeeldingen van 640×480 pixels. Het zou mogelijk zijn om dit aan te passen, maar dat is kostbaar in termen van geheugen en CPU-kracht. Bovendien is het proces al traag genoeg, waardoor ik (voorlopig) niet wil proberen om afbeeldingen van 800×600 of 1024×768 te decoderen en te schalen. Zelfs beperkt tot camera's met 640×480, opent dit een aantal mogelijkheden.
Ik heb een paar zeer goedkope Sanyo-camera's gekocht op eBay (een VPC-G1 uit 1995, ook verkocht als Epson PhotoPC PCDC001 en Sierra Imaging SD640, en een VPC-G200 uit 1997) en ben tijdens mijn zomervakantie in 2026 begonnen met het implementeren van mijn driver. Tijdens de vorige releasecyclus, die leidde tot de Kodak DC50-ondersteuning, heb ik mijn code herschreven zodat cameradrivers nu modules zijn met een gedefinieerde interface. Hierdoor kan mijn programma alleen de relevante driver in het geheugen laden, waardoor Quicktake voor Apple II uitbreidbaar is met een willekeurig aantal drivers, zolang ze maar op de diskette passen.
De Driver Structuur
Hieronder volgt mijn "skeleton" driver die niets anders doet dan de boilerplate-code. In essentie definieert het een bitveld van ondersteunde functies en 16 "API-methoden", waarvan de meeste optioneel zijn. De enige vereiste endpoints zijn wakeup, setspeed, getinformation en get_picture.
#define sierra_features 0b0000000011011111
// ||||||||_ SET_CAMERA_NAME
// |||||||__ SET_CAMERA_TIME
// ||||||___ SET_QUALITY,
// |||||____ SET_FLASH,
// ||||_____ TAKE_PICTURE,
// |||______ GET_THUMBNAIL,
// ||_______ DELETE_PICTURES,
// |________ RESERVED,
/* Camera callbacks */
void *sierra_callbacks[] = {
/* FEATURES */ (void *)sierra_features,
/* WAKEUP */ sierra_wakeup,
/* SET_SPEED */ sierra_set_speed,
/* SET_CAMERA_NAME */ sierra_set_camera_name,
/* SET_CAMERA_TIME */ sierra_set_camera_time,
/* GET_INFORMATION */ sierra_get_information,
/* SET_QUALITY */ sierra_set_quality,
/* SET_FLASH */ sierra_set_flash,
/* TAKE_PICTURE */ sierra_take_picture,
/* GET_PICTURE */ sierra_get_picture,
/* GET_THUMBNAIL */ NULL,
/* DELETE_PICTURES */ sierra_delete_pictures,
/* GET_FILENAME */ sierra_get_filename,
/* THUMB_HISTOGRAM */ NULL,
/* THUMB_LOAD_DATA */ NULL,
/* GET_QUALITY_STR */ sierra_get_quality_str,
/* GET_FLASH_STR */ sierra_get_flash_str,
};
Uiteindelijk implementeert mijn Sierra-driver bijna alles wat mijn programma ondersteunt: alle informatievelden (cameranaam, cameratijd, kwaliteitsmodus, flitsmodus, aantal gemaakte foto's, resterende foto's, batterijstatus) zijn leesbaar, de flits- en kwaliteitsmodi kunnen worden ingesteld, we kunnen een foto maken, enzovoort.
De Sierra-driver van libgphoto2 heeft het proces zeer eenvoudig gemaakt, omdat deze functioneel en gemakkelijk te begrijpen is. Er staan hier en daar enkele "magic numbers" in, maar deze waren eenvoudig te verklaren en te definiëren met #define.
De enige functie die niet beschikbaar is, is sierragetthumbnail. Deze is technisch gezien wel geïmplementeerd, omdat het eenvoudig is om een thumbnail van de camera op te halen: het is dezelfde procedure als bij het ophalen van een foto, maar met gebruik van twee verschillende camerapregisters. Echter, het is niet gekoppeld aan de gebruikersinterface (UI), omdat de thumbnails JPEGs zijn. Er is geen ruimte om de JPEG-decoder te laden in het UI-programma waar de thumbnails worden weergegeven, dus heb ik dit weggelaten.
Seriële Communicatie en Hardwarebeperkingen
Een andere kleine irritatie bij de Sierra-camera's (althans bij de twee Sanyo's die ik heb) is dat er blijkbaar is bespaard op de seriële chip. Op een PC kan ik met ze communiceren op 115200bps, maar niet op de Apple II. Sigrok-opnames van de signalen laten zien dat de startbits te vroeg beginnen na de stopbits, wat de ACIA 6551 van de Apple II in verwarring brengt en framing-fouten veroorzaakt. Hierdoor is de snelheid beperkt tot 19200bps – zelfs op de IIgs.
Ondersteunde Camera's
Op basis van de camera's die ik heb getest, is er nu ondersteuning voor:
- Sanyo VPC-G1
- Epson PhotoPC PCDC001
- Sierra Imaging SD640
- Sanyo VPC-G200
Ik vermoed sterk dat de volgende camera's direct ("out-of-the-box") zullen werken, maar dit is nog niet getest:
- Agfa ePhoto 307
- Agfa ePhoto 780
- Epson PhotoPC 500
- Epson PhotoPC 550
- Olympus C-400
- Olympus C-400L / D-200L
- Olympus C-410L
- Olympus C-420L / D-220L
- Polaroid PDC-640
- Sanyo VPC-G210
- Sanyo VPC-G250
Refactoring en Volgende Stappen
Nu de Sierra-driver is geschreven, hield ik slechts 6kB over op de diskette van het programma, zelfs terwijl de cameradrivers zelf gecomprimeerd (met zx02) op de diskette staan. Dit is niet echt genoeg om iets belangrijks toe te voegen, en ik ben van plan om meer cameradrivers toe te voegen.
Daarom ben ik verder gegaan met het comprimeren van zaken, inclusief de binaries van de UI en de image decoders zelf. Ik had ze zelf-decomprimerend kunnen maken, maar dat had betekend dat er meerdere kopieën van de decompressor nodig waren (één per binary). In plaats daarvan heb ik de LOADER.SYSTEM van Oliver Schmidt uitgebreid om zx02-gecomprimeerde binaries te kunnen verwerken.
De volgende stap is het vinden van een nieuwe cameradriver om te implementeren. Dat wordt de Canon PowerShot 350, een camera uit 1998 (18 jaar jonger dan de Apple II), die blijkbaar een zeer complex protocol heeft.
Ik vraag me af of ik het project "Quicktake for Apple II" moet hernoemen om te weerspiegelen dat het steeds meer camera's ondersteunt. Maar ik hou van de huidige naam en ik heb geen beter idee.
Sierra digitale camera's op de Apple II
Op basis van de broncode van libgphoto2 heb ik besloten om nader te kijken naar wat ik (en zij) de "Sierra-klasse" camera's noemen. Er zijn veel camera's die hetzelfde protocol delen; er worden meer dan 80 modellen vermeld. Niet alle camera's zullen bruikbaar zijn op de Apple II, aangezien mijn JPEG-decoder hardcoded is ingesteld op afbeeldingen van 640×480 pixels. Het zou mogelijk zijn om dit aan te passen, maar dat is kostbaar in termen van geheugen en CPU-kracht. Bovendien is het proces al traag genoeg, waardoor ik (voorlopig) niet wil proberen om afbeeldingen van 800×600 of 1024×768 te decoderen en te schalen. Zelfs beperkt tot camera's met 640×480, opent dit een aantal mogelijkheden.
Ik heb een paar zeer goedkope Sanyo-camera's gekocht op eBay (een VPC-G1 uit 1995, ook verkocht als Epson PhotoPC PCDC001 en Sierra Imaging SD640, en een VPC-G200 uit 1997) en ben tijdens mijn zomervakantie in 2026 begonnen met het implementeren van mijn driver. Tijdens de vorige releasecyclus, die leidde tot de Kodak DC50-ondersteuning, heb ik mijn code herschreven zodat cameradrivers nu modules zijn met een gedefinieerde interface. Hierdoor kan mijn programma alleen de relevante driver in het geheugen laden, waardoor Quicktake voor Apple II uitbreidbaar is met een willekeurig aantal drivers, zolang ze maar op de diskette passen.
De Driver Structuur
Hieronder volgt mijn "skeleton" driver die niets anders doet dan de boilerplate-code. In essentie definieert het een bitveld van ondersteunde functies en 16 "API-methoden", waarvan de meeste optioneel zijn. De enige vereiste endpoints zijn wakeup, setspeed, getinformation en get_picture.
#define sierra_features 0b0000000011011111
// ||||||||_ SET_CAMERA_NAME
// |||||||__ SET_CAMERA_TIME
// ||||||___ SET_QUALITY,
// |||||____ SET_FLASH,
// ||||_____ TAKE_PICTURE,
// |||______ GET_THUMBNAIL,
// ||_______ DELETE_PICTURES,
// |________ RESERVED,
/* Camera callbacks */
void *sierra_callbacks[] = {
/* FEATURES */ (void *)sierra_features,
/* WAKEUP */ sierra_wakeup,
/* SET_SPEED */ sierra_set_speed,
/* SET_CAMERA_NAME */ sierra_set_camera_name,
/* SET_CAMERA_TIME */ sierra_set_camera_time,
/* GET_INFORMATION */ sierra_get_information,
/* SET_QUALITY */ sierra_set_quality,
/* SET_FLASH */ sierra_set_flash,
/* TAKE_PICTURE */ sierra_take_picture,
/* GET_PICTURE */ sierra_get_picture,
/* GET_THUMBNAIL */ NULL,
/* DELETE_PICTURES */ sierra_delete_pictures,
/* GET_FILENAME */ sierra_get_filename,
/* THUMB_HISTOGRAM */ NULL,
/* THUMB_LOAD_DATA */ NULL,
/* GET_QUALITY_STR */ sierra_get_quality_str,
/* GET_FLASH_STR */ sierra_get_flash_str,
};
Uiteindelijk implementeert mijn Sierra-driver bijna alles wat mijn programma ondersteunt: alle informatievelden (cameranaam, cameratijd, kwaliteitsmodus, flitsmodus, aantal gemaakte foto's, resterende foto's, batterijstatus) zijn leesbaar, de flits- en kwaliteitsmodi kunnen worden ingesteld, we kunnen een foto maken, enzovoort.
De Sierra-driver van libgphoto2 heeft het proces zeer eenvoudig gemaakt, omdat deze functioneel en gemakkelijk te begrijpen is. Er staan hier en daar enkele "magic numbers" in, maar deze waren eenvoudig te verklaren en te definiëren met #define.
De enige functie die niet beschikbaar is, is sierragetthumbnail. Deze is technisch gezien wel geïmplementeerd, omdat het eenvoudig is om een thumbnail van de camera op te halen: het is dezelfde procedure als bij het ophalen van een foto, maar met gebruik van twee verschillende camerapregisters. Echter, het is niet gekoppeld aan de gebruikersinterface (UI), omdat de thumbnails JPEGs zijn. Er is geen ruimte om de JPEG-decoder te laden in het UI-programma waar de thumbnails worden weergegeven, dus heb ik dit weggelaten.
Seriële Communicatie en Hardwarebeperkingen
Een andere kleine irritatie bij de Sierra-camera's (althans bij de twee Sanyo's die ik heb) is dat er blijkbaar is bespaard op de seriële chip. Op een PC kan ik met ze communiceren op 115200bps, maar niet op de Apple II. Sigrok-opnames van de signalen laten zien dat de startbits te vroeg beginnen na de stopbits, wat de ACIA 6551 van de Apple II in verwarring brengt en framing-fouten veroorzaakt. Hierdoor is de snelheid beperkt tot 19200bps – zelfs op de IIgs.
Ondersteunde Camera's
Op basis van de camera's die ik heb getest, is er nu ondersteuning voor:
- Sanyo VPC-G1
- Epson PhotoPC PCDC001
- Sierra Imaging SD640
- Sanyo VPC-G200
Ik vermoed sterk dat de volgende camera's direct ("out-of-the-box") zullen werken, maar dit is nog niet getest:
- Agfa ePhoto 307
- Agfa ePhoto 780
- Epson PhotoPC 500
- Epson PhotoPC 550
- Olympus C-400
- Olympus C-400L / D-200L
- Olympus C-410L
- Olympus C-420L / D-220L
- Polaroid PDC-640
- Sanyo VPC-G210
- Sanyo VPC-G250
Refactoring en Volgende Stappen
Nu de Sierra-driver is geschreven, hield ik slechts 6kB over op de diskette van het programma, zelfs terwijl de cameradrivers zelf gecomprimeerd (met zx02) op de diskette staan. Dit is niet echt genoeg om iets belangrijks toe te voegen, en ik ben van plan om meer cameradrivers toe te voegen.
Daarom ben ik verder gegaan met het comprimeren van zaken, inclusief de binaries van de UI en de image decoders zelf. Ik had ze zelf-decomprimerend kunnen maken, maar dat had betekend dat er meerdere kopieën van de decompressor nodig waren (één per binary). In plaats daarvan heb ik de LOADER.SYSTEM van Oliver Schmidt uitgebreid om zx02-gecomprimeerde binaries te kunnen verwerken.
De volgende stap is het vinden van een nieuwe cameradriver om te implementeren. Dat wordt de Canon PowerShot 350, een camera uit 1998 (18 jaar jonger dan de Apple II), die blijkbaar een zeer complex protocol heeft.
Ik vraag me af of ik het project "Quicktake for Apple II" moet hernoemen om te weerspiegelen dat het steeds meer camera's ondersteunt. Maar ik hou van de huidige naam en ik heb geen beter idee.