**************************************************************************** * 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)