For those who dwell in the late '70's early '80's.  Here is the source code for ROSE (the Reprogrammable Observer for Solar Eclipses, dubbed ASEC).  This is the great-grandmother of UMBRAPHILE.  I though enquiring minds might want to know...


****************************************************************************
* Automated Solar Eclipse Camera - Control Program       6502 Source Code *
* Version 1.8.0  March 22, 1991                           Glenn Schneider *
* Annotated Listing Last Verified April 21,1991      (FILE=ROSE8 on tape) * 
***************************************************************************

This program (ASEC) executes on an AIM-65 and requires 4K of onboard RAM.
Two cameras are controlled by ASEC, interfaced through a simple H/W control
circuit employing 5V-DC reed relays connected (with TTL buffering) to
VIA output port B.

Camera 1 (Nikon EM, in "manual" operating mode): Bit 1 of VIA Output port B 
controls the shutter of camera 1.  Camera 1 will take a sequence
of predefined exposures based upon entries in an exposure time/duration table.
This is a 144-byte table - each exposure (36 exposures in all) is defined
by 4 bytes.  Three bytes give the U.T. of the shutter opening time.  One
byte gives the exposure duration quantized in units of 0.01 seconds (the
shortest exposure is 0.01 seconds, the longest 2.55 seconds).  The shutter
on camera 1 is mechanically operated by a fast-acting (2ms) linear push-type
solenoid, powered at 24VDC.  The solenoid is energized when its 5VDC reed relay
is enabled via VIA port B bit 1.  The shutter on camera 1 will open, and
remain open as long as the solenoid is engaged.  HW NOTE: This is a 6V solenoid
being operated at 24VDC (4x over-voltage) to provide sufficient force to trip
and hold the camera shutter mechanism.  This solenoid may be run at 4x
over-voltage at a 6% or less duty cycle without excess heating.  The film
advance on camera 1 is operated by a motor drive which will automatically
advance the film whenever the shutter closes.

Camera 2 (Nikon FM2 - preset at 1/125 second).  Camera 2 will be used to
record limb phenomena at 2nd and 3rd contacts, at a preset exposure time
of 1/125 second.  A sequence of exposures will be taken, at 0.5 second
intervals when a contact closure is made on its motor drive.  This closure
is controlled by VIA output port B bit-2.  The sequence of exposures will
begin when bit-2 is asserted (high) and will terminate when bit-2 is brought
low.  Two sequences (each nominally 18-exposures long) will be taken.  The
first sequence will begin at the U.T. of the first exposure in the exposure
time/duration table set up for camera 1 (nominally, 4 seconds before second),
and will terminate at the U.T. of exposure 4 for camera 1, nominally 5 seconds
after 1st contact.  The third contact sequence is started and ended at the
U.T's of exposures 33 and 36 in the exposure time/duration table (nominally,
contact-III, -5 and +4 seconds, respectively).

ASEC will use the AIM-65 20-character LED display to provide continual status
updates in the following format:  
HHMMSSd HHMMSSd DDNN
|       |       | |-Number of next exposure (1-36)
|       |       |---Exposure Duration of next exposure in 0.01 seconds - HEX
|       |-----------U.T. of next exposure
|-------------------Current U.T. (Updates every 0.1 seconds)

ASEC will also print a snapshot of the time/exposure data on the AIM-65 thermal
printer as each exposure on camera 1 completes.

To alter the exposure time/duration table execute EXTIM (at location 0AC4)
before staring up ASEC (*=0AC4 /G. from AIM monitor).

To start up ASEC execute MAIN (at location 0300): *=0300 /G. from AIM monitor.


Page 0 Usage
$0000 = UT Clock (current) Hours as Packed Decimal
$0001 = UT Clock (current) Minutes as Packed Decimal
$0002 = UT Clock (current) Seconds as Packed Decimal
$0003 = UT Clock (current) Tenths/Hundreths (Frac) of a Second as Packed Decimal
$0004 = Display Update Flag (LED display must be updated when set)
$0006 = Base Address of Exposure Table LSB (Value = 00)
$0007 = Base Address of Exposure Table MSB (Value = 06)
$0008 = Current Exposure Number (0-35 decimal, 0 - $23 hex)
$0009 = Exposure Hold Down Flag (1= Exposure in Progress)
$000A = Exposure Interrupt Counter (Count Down)
$000B = Camera Control Word (to be loaded into VIA Output)
$000C = Exposure Termination Flag (Set when exposure is over)
$000D = Main Display Flag (Set when Display Update called from MAIN) 


PROGRAM CODE ADDRESSES
$0300 = COLDST: Cold Start Initialization (Enter from AIM-65 Monitor)
$0305 = ZERO:   Zero out contents of page-0
$030A = SETVIA: Setup VIA and interactively initialize/Synchronize U.T. clock

$0326 = MAIN:   Main Loop
$032C = DSPUPD: Display UT, Exposure Data, then Zero the Update Required Flag
$0336 = EXPCHK: Determine if New Exposure Has Started
$0359 = MAINUP: Print/Display Previous Exposure Snapshot
$033C = EXSNAP: Print New Exposure Data 

$0D00 = IRQSRV: Interrupt Service Routine
$0D05 = INCFRA: Increment UT Frac by 0.01 Seconds (T1 Interrupt Period)
$0D11 = INCSEC: Increment UT Second (FRAC has rolled over)
$0D20 = INCMIN: Increment UT Minute (Seconds have rolled over)
$0D2F = INCHR:  Increment UT Hour (Minutes have rolled over)
$0D3E = SETUPD: Set Display Update Flag Every 0.1 Seconds
$0D49 = NOUPD:  No Update - Invoke the Shutter Control Processor

$0800 = CURTIM: Display Current Time in format HHMMSSd
$0821 = EXDISP: Clear Display, Indent, Display Exp UT, Duration, Exp #
$0829 = EXDISO: Display Exp UT, Duration, Previous Exp #

$0A1F = PACK2:  Keyboard 2-Digit Decimal Inpout -> Packed Decimal in A-Register
$0A32 = TIMSET: Keyboard UT Clock set by user input HHMM
$0A51 = T1SEED: Setup 10000-microsec interrupts for T1 timer
$0A5B = T1ENAB: Enable Generation of T1 clock interrupts
$0A6A = EX1VAL: Display Current Exposure UT Table Entry
$0A75 = EX1LIN: Display One Exposure Line Definition
$0A9C = EXTABL: Print and Display Exposure Table (Printer Control Toggled Here)
$0AB7 = EX1STR: Read Keyboard, Store Byte to Exposure Table
$0AC4 = EXTIN:  Interactive Entry of Exposure Table (Enter from AIM-65 Monitor)

$0AE6 = SHUTR:  Shutter Control Subroutine (called by IRQSRV)
$0AEC = SHCHK:  Check UT Time table to see if an exposure must be started
$0AFE = FIRE!:  Prepare to start new exposure
$0B0B = SHOPEN: Continue holding solenoid down - camera #1 exposure is not over
$0B20 = FIRE2!: Operate Camera #2 (Check for Diamong Ring sequences)
$0B37 = BEGDR:  Start sequence of diamond ring exposures on camera 2
$0B3E = ENDDR:  End sequence of diamond ring exposures on camera 2
$0B42 = SCNTRL: Write camera control word to VIA Output register
*******PROGRAM INITIALIZATION ROUTINE ($0300)*******

       ; Entry and Startup point from AIM-65 Monitor
COLDST 0300 78  SEI        ; Disable Interrupts on Bus
       0301 D8  CLD        ; Clear Decimal Flag (Hex Mode Arithmatic)

       ; Zero Out Page 0
       0302 A9  LDA #00    ; 
       0304 AA  TAX 
ZERO   0305 95  STA 00,X   ; 
       0307 E8  INX
       0308 DO  BNE 0305   ; (ZERO)
  
       ; Establish Address of Interrupt Service Routine as $0D00
SETVIA 030A A9  LDA #00    ; Low Byte of Address
       030C 8D  STA A400   ; IRQ Vector Low  
       030F A9  LDA #0D    ; High Byte of Address
       0311 8D  STA A400   ; IRQ Vector Hi

       0314 20  JSR 0A32   ; (TIMESET) Go set UT Clock

       ; Set up VIA Output Ports - All Bits, Both Ports as Outputs
       ; Port B Data Register Bit 1 will control camera 1 shutter solenoid
       ; Port B Data Register Bit 2 will control camera 2 shutter
DDSET  0317 A9  LDA #FF    ; Set All Bits to OUTPUTS 
       0319 8D  STA A002   ; Data Direction Register B
       031C A9  LDA #FF    ; Set All Bits to OUTPUTS
       031E 85  STA A003   ; Data Direction Register A

       ; Establish Base Address of Exposure Table as $0600
       0321 A9  LDA #06    ; High Byte of Address (Low Byte Already 0)
       0323 8D  STA 07     ; <$07> = Exposure Address Table Base

       0325 58  CLI        ; Enable Interrupt Processing
*******MAIN LOOP (Asynchronous, Check/handle update & interrupt requests)*******

       ; Determine if the Output Display Needs Updating
MAIN   0326 A5  LDA 04     ; Get the DISPLAY UPDATE Flag
       0328 C9  CMP #01    ; Is the DISPLAY UPDATE Flag Set?
       032A D0  BNE 0336   ; (EXPCHK) - NO: Check the Take Exposure Flag

       ; Display UT, Exposure Data, then Zero the Update Required Flag
DSPUPD 032C 20  JSR 0800   ; (CURTIM) - Display Current Time
       032F 20  JSR 0824   ; (EXDIS2) - Display Exposure Data
       0332 A9  LDA #00    ; Zero the DISPLAY UPDATE Flag
       0334 85  STA 04   

       ; Determine if New Exposure Has Started 
EXPCHK 0336 A5  LDA 0C     ; Get EXPOSURE TERMINATION Flag (Set in SHUTER)
       0338 C9  BEQ 0326   ; (MAIN) - If clear (zero) Go Back to MAIN Loop
       033A C6  DEC 0C     ; Exposure has terminated - reset termination flag
 
       ; Print New Exposure Data 
EXSNAP 033C 20  JSR EA13   ; (CRLOW) - Clear Display
       033F AD  LDA A411   ; [PTCTRL] - Get Printer Control Word
       0342 48  PHA        ; Save Printer Control Word on Stack
       0343 A9  LDA #80    ; Mask Bit to Toggle Printer ON
       0345 8D  STA A411   ; [PTCTRL] - Turn Printer ON
       0348 20  JSR 0359   ; (MAINUD) - Print/Display Previous Exposure Snap 
       034B 20  JSR EA13   ; (CRLOW) - CR/LF on Display and Printer
       034E 68  PLA        ; Get Printer Control Word Off Stack
       034F 8D  STA A411   ; [PTCTRL] - Restore Printer Control Word
       0352 A9  LDA #00    ; Clear TAKE EXPOSURE Flag
       0354 85  STA 09     
       0356 4C  JMP 0326   ; ------> MAIN

       ; Print/Display Previous Exposure Snapshot
MAINUD 0359 20  JSR E83E   ; (BLANK) - Display 1 Blank Space
       035C A4  LDY 08     ; Get Exposure Counter ($00-$24)
       035E 88  DEY        ; Point to previous exposure
       035F E6  INC 0D     ; Set Main Display Flag
       0361 20  JSR 0829   ; (EXDISO) - Go To Exposure Display Output
       0364 88  DEC 0D     ; Clear Main Display Flag
       0366 60  RTS
    
*****INTERRUPT SERVICE ROUTINE (Set display/update flags, control cameras)*****

IRQSRV 0D00 48  PHA        ; Save A, X, Y registers
       0D01 98  TYA
       0D02 48  PHA
       0D03 8A  TXA
       0D04 48  PHA
      
       ; Increment UT Frac by 0.01 Seconds (T1 Interrupt Period)
INCFRA 0D05 F8  SED        ; Set Decimal Arithmatic Mode
       0D06 A5  LDA 03     ; Get the 0.01 second counter
       0D08 18  CLC        ; Clear Carry Bit
       0D09 69  ADC #01    ; Add 0.01 Seconds
       0D0B 85  STA 03     ; Update 0.01 second counter
       0D0D 69  CMP #00    ; Has it rolled over? (a full second has passed)
       0D0F D0  BNE 0D3E   ; (SETUPD) 

       ; Increment UT Second (FRAC has rolled over)
INCSEC 0D11 A5  LDA 02     ; Get the Seconds counter
       0D13 18  CLC        ; Clear Carry Bit
       0D14 69  ADC #01    ; Add 1 second
       0D16 85  STA 02     ; Update the Seconds Counter
       0D18 C9  CMP #60    ; Has a full minute passed? (Rollover @ Decimal 60)
       0D1A D0  BNE 0D3E   ; (SETUPD)
       0D1C A5  LDA #00    ; Seconds counter has rolled over
       0D1E 85  STA 02     ; Set Seconds Counter to 0

       ; Increment UT Minute (Seconds have rolled over)
INCMIN 0D20 A5  LDA 01     ; Get the Minutes counter
       0D22 18  CLC        ; Clear Carry Bit
       0D23 69  ADC #01    ; Add 1 Minute
       0D25 85  STA 01     ; Update the Minutes Counter
       0D27 C9  CMP #60    ; Has a full Hour passed? (Rollover @ Decimal 60)
       0D29 D0  BNE 0D3E   ; (SETUPD)
       0D2B A5  LDA #00    ; Minutes counter has rolled over
       0D2D 85  STA 01     ; Set Minutes Counter to 0
 
       ; Increment UT Hour (Minutes have rolled over)
INCHR  0D2F A5  LDA 00     ; Get the Hours counter
       0D31 18  CLC        ; Clear Carry Bit
       0D32 69  ADC #01    ; Add 1 Hour
       0D34 85  STA 00     ; Update the Hours Counter
       0D36 C9  CMP #24    ; Has a full Day passed? (Rollover @ Decimal 24)
       0D38 D0  0D3E       ; (SETUPD)
       0D3A A5  LDA #00    ; Hours counter has rolled over
       0D3C 85  STA 00     ; Set Hours Counter to 0

       ; Set Display Update Flag Every 0.1 Seconds
SETUPD 0D3E D8  CLD        ; Clear Decimal Arithmatic Mode
       0D3F A5  LDA 03     ; Get the 0.01 seconds counter
       0D41 29  AND #0F    ; Look at Hundredths Only
       0D43 D0  BNE 0D49   ; (NOUPD) - Only Set Update Flag if Hundredths = 0
       0D45 A5  LDA #01
       0D47 85  STA 04     ; Set Display Update Flag

       ; No Update - Invoke the Shutter Control Processor
NOUPD  0D49 EA  JSR 0AE6   ; (SHUTER) - Shutter Control Processor
       0D4C EA  NOP        ; 
       0D4D EA  NOP

       ; Clear the Interrupt Flag Register
       0D4E AD  LDA A00D   ; [Interrupt Flag Register] - Clear by reading
       0D51 8D  STA A00D   ; ...and writing
 
       ; Restore Registers and Exit Interrupt Service Routine      
       0D54 68  PLA        ; Restore X, Y, A Registers
       0D55 AA  TAX
       0D56 68  PLA
       0D57 A8  TAY
       0D68 68  PLA
       0D59 40  RTI        ; Return From Interrupt


****** Subroutine:  SHUTER  >>>Called by IRQSRV at $0D49<<<
       Description: Check and Control Shutter
       Page Zero:   Inputs - $09 = Shutter Hold Down Flag
                             $08 = Current Exposure Number (0-35)
                             $0A = Hold Down Interrupt Counter
       Peripheral Outputs:   $A000 = Shutter Control Word (Port B Data Reg)
                             $A001 = Exposure Time Code (Port A Data Reg)

SHUTER 0AE6 A5  LDA 0A      ; Is Shutter Hold Down Flag Set?
       0AE8 C9  CMP #00     ; If it is (NOT 0) then hold shutter open
       0AEA D0  BNE 0B0B    ; (SHOPEN) - Branch to SHOPEN if Flag is Set

       ; Check UT Time table to see if an exposure must be started
SHCHK  0AEC A4  LDY 08      ; Get the Exposure Counter (Next to Do)
       0AEE A2  LDX #00     ; Compare HH/MM/SS/FF Sequentially
CHKBYT 0AF0 B1  LDA (06),Y  ; Get One Byte of Stored Shutter Fire Time
       0AF2 D5  CMP 00,X    ; Compare With Same Byte of UT Time
       0AF4 B0  BNE 0B1E    ; (NOTOVR) - If not same then not exposure start
       0AF6 20  JSR 0A6F    ; (YPLS24) - Next Sequential Byte of Time Table
       0AF9 E8  INX         ; Check All 4 Bytes of UT vs Fire Time
       0AFA E0  CPX #04     ; Have all 4 Bytes of Time Been Checked?
       0AFC D0  BNE 0AF0    ; (CHKBYT) - If not then Check Next Byte

       ; Prepare to start new exposure
FIRE!  0AFE A6  LDX 08      ; Get the Exposure Counter (Next to Do)
       0B00 BD  LDA 0690,X  ; Get Shutter Hold Down Interrupt Counter Seed
       0B03 85  STA 09      ; Set TAKE EXPOSURE Flag (Non-Zero/Zero) 
       0B05 85  STA 0A      ; Seed Hold Down Counter
       0B07 A9  JSR 0B20    ; (FIRE2!) - Camera Operation Patch
       0B0B 60  RTS         ;

       ; Continue holding solenoid down on camera 1 - exposure is not over
SHOPEN 0B0B C6  DEC 0A      ; Decrement Hold Down Counter
       0B0D A5  LDA 0A      ; Get the Hold Down Counter
       0B0F C9  CMP #00     ; Check to see if Hold Down is cleared
       0B11 D0  BNE 0B1E    ; (NOTOVR) - Hold Down Not Over, Exit
       0B13 E6  INC 0C      ; Set EXPOSURE TERMINATION FLAG (checked in EXPCHK)

       ; Exposure duration has been reached (end solenoid hold down on camera 1)
       0B15 A5  LDA 0B      ; Get the camera control word 
       0B17 29  AND #02     ; Camera 1 unchanged bit, camera 2 clear bit      
       0B19 A9  STA A000    ; Write camera control word to VIA Output register
       0B1C E6  INC 08      ; Increment Exposure Counter
NOTOVR 0B1E 60  RTS


****** Subroutine:  FIRE2!  >>>Called by FIRE! at $0B07<<<
       Description: Operate Cameras

FIRE2! 0B20 A5  LDA 0B      ; Get the camera control word
       0B22 E0  CPX #00     ; Is this the first exposure on camera 1?
       0B24 F0  BEQ 0B37    ; (BEGDR) - Begin Diamond Ring sequence on camera 2
       0B26 E0  CPX #03     ; Is this the fourth exposure on camera 1?
       0B28 F0  BEQ 0B3E    ; (ENDDR) - End Diamond Ring sequence on camera 2?
       0B2A E0  CPX #19     ; Is this the 33rd exposure on camera 1?
       0B2C F0  BEQ 0B37    ; (BEGDR) - Begin Diamond Ring sequence on camera 2
       0B2E E0  CPX #23     ; Is this the 36th exposure on camera 1?
       0B30 F0  BEQ 0B3E    ; (ENDDR) - End Diamond Ring sequence on camera 2?

       ; Not a diamond ring start or stop exposure
       0B32 09  ORA #01     ; Set control bit for camera 1 to start an exposure
       0B34 4C  JMP 0B42    ; (SCNTRL) - Go load the camera control word

       ; Start sequence of diamond ring exposures on camera 2         
BEGDR  0B37 09  ORA #03     ; Set camera control word to fire cameras 1 & 2
       0B39 85  STA 0B      ; Store the camera control word
       0B3B 4C  JMP 0B42    ; (SCNTRL) - Go load the camera control register
             
       ; End sequence of diamond ring exposures on camera 2
ENDDR  0B3E 29  AND #01     ; Set camera control word to fire cam 1 & stop cam 2
       0B40 85  STA 0B      ; Store the camera control word

SCNTRL 0B42 8D  STA A000    ; Write camera control word to VIA Output register
       0B45 60  RTS




****** Subroutine:  CURTIM
       Description: Display Current Time in format HHMMSSd

       ; Display UT Time as HHMMSSd
CURTIM 0800 20  JSR EA13   ; (CRLOW) - Clear Display
       0803 A5  LDA 00     ; Get UT Hour
       0805 20  JSR EA46   ; (NUMA) - Display Hour
       0808 A5  LDA 01     ; Get UT Minute
       080A 20  JSR EA46   ; (NUMA) - Display Minute
       080D A5  LDA 02     ; Get UT Second
       080F 20  JSR EA46   ; (NUMA) - Display Second
       0812 A5  LDA 03     ; GET UT Frac (Tenths/Hundredths)
DSPLSD 0814 29  AND #F0    ; Mask Out Hundredths
       0816 4A  LSR .A     ; Shift Tenths to LSD of A Register
       0817 4A  LSR .A 
       0818 4A  LSR .A 
       0819 4A  LSR .A 
       081A 18  CLC        ; Convert Numeric Value to ASCII
       081B 69  ADC #30
       081D 20  JSR E97A   ; (OUTPUT) - Display Tenth of Second
       0820 60  RTS




****** Subroutine:  EXDISP
       Description: Display Next Exposure Data, Format:HHMMSSd CC##
     
       ; Clear Display, Indent, Display UT of Exposure, Exp Duration, Exp #
EXDISP 0821 20  JSR EA13   ; (CRLOW) - Clear Display
EXDIS2 0824 20  JSR E83E   ; (BLANK) - Display 1 Blank Space
       0827 A4  LDY 08     ; Get Exposure Counter ($00-$24)

       ; Entry from MAINUD (Y=Y-1) to display previous exposure
EXDISO 0829 B1  LDA (06),Y ; Get Next FIRE! Time Hour
       082B 20  JSR EA46   ; (NUMA) - Display 2-digit ASCII FIRE! Hour
       082E 20  JSR 0A6F   ; (YPLS24) - Point to Minute (Y+$24)
       0831 B1  LDA (06),Y ; Get Next FIRE! Time Minute
       0833 20  JSR EA46   ; (NUMA) - Display 2-digit ASCII FIRE! Minute
       0836 20  JSR 0A6F   ; (YPLS24) - Point to Second (Y+$24)
       0839 B1  LDA (06),Y ; Get Next FIRE! Time Second
       083B 20  JSR EA46   ; (NUMA) - Display 2-digit ASCII FIRE! Second
       083E 20  JSR 0A6F   ; (YPLS24) - Point to Frac (Y+$24)
       0841 20  LDA (06),Y ; Get Next FIRE! Time Frac
       0843 20  JSR 0814   ; (DSPLSD) - Display Frac
       0846 20  JSR E83E   ; (BLANK) - Display 1 Blank Space
       0849 20  JSR 0A6F   ; (YPLS24) - Point to FIRE! Exposure Duration
       084C B1  LDA (06),Y ; Get Next FIRE! Exposure Duration
       084E 20  JSR EA46   ; (NUMA) - Display Exposure Duration Code
       ;
       0851 A4  LDY 08     ; Get Exposure Counter ($00-$24)
       0853 EA  LDA 0D     ; Get Main Display Flag (MDF)
       0855 D0  BNE 0858   ; (EXDISN) - If MDF set display previous exposure #
       0857 C8  INY        ;               ELSE Increment exposure # pointer
       ;
EXDISN 0858 B9  LDA 0F9B,Y ; Convert Exposure # from Hex to Decimal
       085B 20  JSR EA46   ; (NUMA) - Display Exposure Number
       085E 60  RTS




****** Subroutine:  PACK2
       Description: Get 2 Digit Decimal From Keyboard
                    Put Packed Decimal in A-Register
       Registers:   Output: A

PACK2  0A1F 20  JSR E93C   ; (READ) - Get first digit from KB
       0A22 20  JSR E97A   ; (OUTPUT) - Display first digit
       0A25 20  JSR EA84   ; (PACK) - Store HEX in MSB of A
       0A28 20  JSR E93C   ; (READ) - Get second digit from KB
       0A2B 20  JSR EA7A   ; (OUTPUT) - Display second digit
       0A2E 20  JSR EA84   ; (PACK) - Store Hex in LSB of A
       0A31 60  RTS



****** Subroutine:  TIMSET
       Description: Set U.T. Clock by user input of HHMM:
                    Set up 6522 T1 interrupts every 10000 milliseconds
       Page Zero:   Output: $00 - $03 (Hour, Min, Second, Frac) 

TIMSET 0A32 20  JSR EA13   ; (CRLO) - Clear the display
       0A35 20  JSR 0A00   ; (PNDM) - Print/Display Inline Message
       0A38    .'HHMM:'    ; Data: 48 48 4D 4D 3A 00
       0A3E 20  JSR 0A1F   ; (PACK) - Get UT Hour (2 digits)
       0A41 85  STA 00     ; Store UT Hour
       0A43 20  JSR 0A1F   ; (PACK) - Get UT Minutes (2 digits)
       0A46 85  STA 01     ; Store UT Minute
       0A48 A9  STA #00    ; Set UT Second and Fraction to 0
       0A4A 85  STA 02     ; Store UT Second
       0A4C 85  STA 03     ; Store UT Fraction
       0A4E 20  JSR E93C   ; (READ) - Read keyboad, await key closure

       ; Set VIA (6522) Timer 1 to Generate Interrupts Every 10000 microseconds
T1SEED 0A51 A9  LDA #0C    ; Set T1 timer for timeout after 10000 microsec
       0A53 8D  STA A004   ; note: 9996 decimal = $270C
       0A56 A9  LDA #27    
       0A58 8D  STA A005
T1ENAB 0A5B A9  LDA #C0    ; Enable Generation of T1 clock interrupts
       0A5D 8D  STA A00B   ; [Auxilliary Control Register]
       0A60 8D  STA A00E   ; [Interrupt Enable Register]
       0A63 AD  LDA A00D   ; [Interrupt Flag Register] - Clear by reading
       0A66 8D  STA A00D   ; [Interrupt Flag Register]
       0A69 60  RTS




****** Subroutine:  EX1VAL
       Description: Display Current Exposure UT Table Entry
       Page Zero:   Input: ($06,$07) - Base Address of exposure Table
       Registers:   Input:  Y - Index pointer into UT exposure table
                    Output: Y(output) = Y(input) + $24
                            A - clobbered
       Other Entry: YPLS24
       Description: Add $24 (decimal 36) to Y register (A clobbered)
       Note: Exposure Table UT Table is set up as folloes:
             .All data values in table are decimal
             .First  36 (decimal) bytes are UT Hours for exposures 1-36
             .Second 36 (decimal) bytes are UT Mins  for exposures 1-36
             .Third  36 (decimal) bytes are UT Secs  for exposures 1-36
             .Fourth 36 (decimal) bytes are UT Frac  for exposures 1-36

EX1VAL 0A6A B1  LDA (06),Y ; Get Current Exposure Table Entry
       0A6C 20  JSR EA46   ; Display entry as 2-digit ASCII
YPLS24 0A6F 98  TYA        ; Increment Value in Y-register by $24 (dec 36)
       0A70 18  CLC
       0A71 69  ADC #24    
       0A73 A8  TAY
       0A74 A8  RTS
 


****** Subroutine:  EX1LIN
       Description: Display One Exposure Line Definition
       Page Zero:   Input:  ($06,$07) - Base Address of exposure Table
       Registers:   Input:  Y - Exposure Index ($0 - $23) 
                    Output: A - clobbered
       Note: Display format is: ##:HHMMSSdd

EX1LIN 0A75 20  JSR EA13   ; (CRLOW) - Clear Display
       0A78 98  TYA        ; Get Exposure Index from Y
       0A79 48  PHA        ; Save Y register
       0A7A C8  INY        ; Exposure Number is Exposure Index + 1 (1-36 dec)
       0A7B B9  LDA 0F9B,Y ; [DECTBL] - Look up decimal value
       0A7E 88  DEY        ; Exposure Index = Exposure Number - 1
       0A7F 20  JSR EA46   ; (NUMA) - Display Exposure Number as 2-digits
       0A82 A9  LDA #3A    ; ASCII data value for ':'
       0A84 20  JSR E9BC   ; (OUTALL) - Display data value in A (Y clobbered)
       0A87 68  PLA        ; Get Exposure Index Saved on Stack
       0A88 48  PHA        ; Pop Exposure Index BAck On Stack
       0A89 A8  TAY        ; Exposure Index now in Y register
       0A8A 20  JSR 0A6A   ; (EX1VAL) - Display HOUR {hh}
       0A8D 20  JSR 0A6A   ; (EX1VAL) - Display MINUTE {mm}
       0A90 20  JSR 0A6A   ; (EX1VAL) - Display SECOND {ss}
       0A93 20  JSR 0A6A   ; (EX1VAL) - Display FRAC {dd}
       0A96 68  PLA        ; Get Exposure Index off the Stack
       0A97 A8  TAY        ; Restore Y with Exposure Index
       0A98 60  RTS        
       
       0A9A EA  NOP
       0A9B EA  NOP
       0A9C EA  NOP




****** Subroutine:  EXTABL
       Description: Print and Display Exposure Table
       Registers:   Output: A and Y clobbered

EXTABL 0A9C AD  LDA A411   ; [PTCTRL] - Get Printer Control Word
       0A9F 48  PHA        ; Save Printer Control Word on Stack
       0AA0 A9  LDA #80    ; Mask Bit to Toggle Printer ON
       0AA2 8D  STA A411   ; [PTCTRL] - Turn Printer ON
       0AA5 A0  LDY #00    ; Point to First Entry in Exposure Table
EXTABY 0AA7 20  JSR 0A75   ; (EX1LIN) - Print/Display Yth Exposure Line
       0AAA C8  INY        ; Point to Next Word In Table
       0AAB C0  CPY #25    ; Have all $24 Entries Been Printed/Displayed?
       0AAD D0  BNE 0AA7   ; (EXTABY) - If Not Then Do the Next Line
       0AAF 6F  PLA        ; Get the Printer Control Word Off the Stack
       0AB3 60  RTS



****** Subroutine:  EX1STR
       Description: Read KB, Store Byte to Exposure Table
       Page Zero:   Input:  ($06,$07) - Base Address of exposure Table
       Registers:   Input:  Y - Exposure Index ($0 - $23)
                    Output: Y - Y(out) = Y(in) + $24
                            A - Packed Decimal Input from KB
 
EX1STR 0AB7 20  JSR 0A1F   ; (PACK2) - Get 2-digit decimal from KB
       0ABA C9  CMP #20    ; Space Bar?
       0ABC F0  BEQ 0AC    ; (INCY24) - If Space Bar Then DO NOT Store
       0ABE 91  STA (06),Y ; Store Packed Decimal in Exposure Table
INCY24 0AC0 20  JSR 0A6F   ; (YPLS24) - Increment Y by $24
       0AC3 60  RTS 



****** PROGRAM:  EXTIN
       Description: Interactive Entry of Exposure Table
       Page Zero:   Input:  ($06,$07) - Base Address of exposure Table
       Note: <SPACE><SPACE> will not alter byte

EXTIN  0AC4 A9  LDA #00     ; Initial Table Pointer to Beginning of Table
EXTIN2 0AC6 48  PHA         ; Save Table Pointer on Stack
       0AC7 A8  TAY         ; Transfer Table Pointer to Y Register
       0AC8 20  JSR 0A75    ; (EX1LIN) - Display Current Exposure Definition
       0ACB 20  JSR E83E    ; (SPACE) - Display 1 Blank Space
       0ACE 20  JSR 0AB7    ; (EX1STR) - Get and Save New HH from KB
       0AD1 20  JSR 0AB7    ; (EX1STR) - Get and Save New MM from KB
       0AD4 20  JSR 0AB7    ; (EX1STR) - Get and Save New SS from KB
       0AD7 20  JSR 0AB7    ; (EX1STR) - Get and Save New dd from KB
       0ADA 68  PLA         ; Get Table Pointer from Stack
       0ADB 18  CLC         ; Increment Table Pointer by 1 (Next Entry)
       0ADC 69  ADC #01    
       0ADE C9  CMP #24     ; Have all 24 Exposure Entries Been Done?
       0AE0 D0  BNE 0AC6    ; (EXTIN2) - If Not Then Do Next Exposure Definition
       0AE2 00  BRK         ; EXIT TO AIM-65 MONITOR




****** Data Definition:  DECTBL
       Data Description: Decimal Value Lookup Table 
       Memory Locations: $0F9B - $0FFE
       Number of Bytes:  100 decimal
       HEX Data Contents: 00,01,02,03,04,05,06,07,08,09,10,11,12 ... 98,99




****** Data Definition:  EXPTBL
       Data Description: Exposure Fire Time and Duration Table 
       Memory Locations: $0600-$06B3
       Number of Bytes:  144 decimal
       Data Contents: 
        $0600-$0623 UT Hours (Decimal) of exposures 1-36
        $0624-$0647 UT Minutes (Decimal) of exposures 1-36
        $0648-$066B UT Seconds (Decimal) of exposures 1-36
        $0670-$068F UT Fraction (Decimal) of exposures 1-36
        $0690-$06B3 Exposure Time in 0.01 seconds (hex)