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 2nd contact),
and will terminate at the U.T. of exposure 4 for camera 1, nominally 5 seconds
after 2th 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)