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).  Thisis 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 controlcircuit employing 5V-DC reed relays connected (with TTL buffering) toVIA 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 sequenceof predefined exposures based upon entries in an exposure time/duration table.This is a 144-byte table - each exposure (36 exposures in all) is definedby 4 bytes.  Three bytes give the U.T. of the shutter opening time.  Onebyte gives the exposure duration quantized in units of 0.01 seconds (theshortest exposure is 0.01 seconds, the longest 2.55 seconds).  The shutteron camera 1 is mechanically operated by a fast-acting (2ms) linear push-typesolenoid, powered at 24VDC.  The solenoid is energized when its 5VDC reed relayis enabled via VIA port B bit 1.  The shutter on camera 1 will open, andremain open as long as the solenoid is engaged.  HW NOTE: This is a 6V solenoidbeing operated at 24VDC (4x over-voltage) to provide sufficient force to tripand hold the camera shutter mechanism.  This solenoid may be run at 4xover-voltage at a 6% or less duty cycle without excess heating.  The filmadvance on camera 1 is operated by a motor drive which will automaticallyadvance the film whenever the shutter closes.Camera 2 (Nikon FM2 - preset at 1/125 second).  Camera 2 will be used torecord limb phenomena at 2nd and 3rd contacts, at a preset exposure timeof 1/125 second.  A sequence of exposures will be taken, at 0.5 secondintervals when a contact closure is made on its motor drive.  This closureis controlled by VIA output port B bit-2.  The sequence of exposures willbegin when bit-2 is asserted (high) and will terminate when bit-2 is broughtlow.  Two sequences (each nominally 18-exposures long) will be taken.  Thefirst sequence will begin at the U.T. of the first exposure in the exposuretime/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 secondsafter 1st contact.  The third contact sequence is started and ended at theU.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 statusupdates 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 thermalprinter 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 MonitorCOLDST 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 $0D00SETVIA 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 shutterDDSET  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 UpdatingMAIN   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 FlagDSPUPD 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 SnapshotMAINUD 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 SecondsSETUPD 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 ProcessorNOUPD  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 startedSHCHK  0AEC A4  LDY 08      ; Get the Exposure Counter (Next to Do)       0AEE A2  LDX #00     ; Compare HH/MM/SS/FF SequentiallyCHKBYT 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 exposureFIRE!  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 overSHOPEN 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 CounterNOTOVR 0B1E 60  RTS****** Subroutine:  FIRE2!  >>>Called by FIRE! at $0B07<<<       Description: Operate CamerasFIRE2! 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 2ENDDR  0B3E 29  AND #01     ; Set camera control word to fire cam 1 & stop cam 2       0B40 85  STA 0B      ; Store the camera control wordSCNTRL 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 HHMMSSdCURTIM 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 DisplayEXDIS2 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 exposureEXDISO 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: APACK2  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 microsecondsT1SEED 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 A005T1ENAB 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-36EX1VAL 0A6A B1  LDA (06),Y ; Get Current Exposure Table Entry       0A6C 20  JSR EA46   ; Display entry as 2-digit ASCIIYPLS24 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: ##:HHMMSSddEX1LIN 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 clobberedEXTABL 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 TableEXTABY 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 TableINCY24 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 byteEXTIN  0AC4 A9  LDA #00     ; Initial Table Pointer to Beginning of TableEXTIN2 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)