;**************************************************************** ; 68705P3 Clock * ;**************************************************************** ; A simple 24-hour clock using some 7-Segment displays * ; and LEDs controlled by the 68705P3. A 74HC238 and UDN2981 * ; are required to assist the microcontroller. (See schematic) * ; * ; The time set operation operates as follows: * ; *Switches 0-3 choose the (binary) number to enter * ; *Switches 5-6 select the digit to modify- * ; 56 * ; 00-Minutes, Ones * ; 10-Minutes, Tens * ; 01-Hours, Ones * ; 11-Hours, Tens * ; *Switch 7 enters the digit (leave it down to change * ; things on the fly). * ; * ; Written by: Osman Celimli * ;**************************************************************** PROCESSOR 68705 INCDIR "C:\MC68705" INCLUDE "68705P3.asm" ORG HARDWARE_BASE ; Padding for programmer dc.b $FF ; format restrictions (2048x8) ;**************************************************************** ; RAM Layout * ;**************************************************************** ORG RAM_START Display_7Segs ds.b 4 Display_Colon ds.b 1 Display_LEDs ds.b 3 Display_Current ds.b 1 FrameCounter ds.b 1 DownCount_Lo ds.b 1 ; DownCount_Hi ds.b 1 ; 625->0 Down Counter Time_Set ds.b 1 Set_Switches ds.b 1 Set_Value ds.b 1 Temp_Digit ds.b 1 Temp_TOffset ds.b 1 Temp_Ones ds.b 1 Temp_Tens ds.b 1 Time_Seconds ds.b 1 Time_Minutes ds.b 1 Time_Hours ds.b 1 GLO_Temp ds.b 1 ECHO "RAM Left: ",(RAM_END-*) ;**************************************************************** ; ZeroPage EPROM * ; * ; * ;**************************************************************** ORG EPROM_ZEROPAGE ;**************************************************************** ; 7-Segment Digit Table * ;**************************************************************** DigitTable dc.b $81,$CF,$92,$86,$CC,$A4,$A0,$8F,$80,$84 ;**************************************************************** ; Timer IRQ * ;**************************************************************** ;*************** ; Seconds Tick * ;*************** DoSecondsTick SUBROUTINE DEC Time_Seconds beq .MinutesTick rts .MinutesTick LDA #60 STA Time_Seconds LDA Time_Minutes INC STA Time_Minutes CMP #60 beq .HoursTick rts .HoursTick clr Time_Minutes LDA Time_Hours CMP #23 bne .TickDone LDA #$FF .TickDone INC STA Time_Hours rts ;******************** ; Animation Updates * ;******************** DoAnimationUpdates SUBROUTINE LDX FrameCounter LDA Anim_Sand_Hi,X STA Display_LEDs + 2 LDA Anim_Sand_Mi,X STA Display_LEDs + 1 LDA Anim_Sand_Lo,X STA Display_LEDs INX CPX #244 bne .AnimDone LDX #0 .AnimDone STX FrameCounter rts ;************************** ; Main Display Update IRQ * ;************************** ; Note- Frequency is obtained by a ; ((4Mhz Source Clock / 4 Pre-Prescaler) / 64 Prescaler) / 25 Down Count ; ~625Hz IRQ For Display Muxing. ; /625 for second accum. Timer_IRQ SUBROUTINE LDA #%00000110 STA Timer_Control ; Clear IRQ LDA #25 STA Timer_Data ; Reset down counter LDX Display_Current LDA Display_7Segs,X STX PortC_Data ; Swap LED Mux STA PortB_Data ; Update LED Data DEX bpl .WriteDisplOff LDX #7 .WriteDisplOff STX Display_Current DEC DownCount_Lo ; Update /625 Divisor bne .IRQBail LDA DownCount_Hi beq .DoUpdates DEC STA DownCount_Hi .IRQBail rti .DoUpdates ; We've ticked down 1 sec, LDA #>625 ; Reset /625 divisor, STA DownCount_Hi ; accumulate hours, minutes, etc. LDA #<625 ; and then update the seconds animation STA DownCount_Lo LDA Time_Set ; Do updates if we're not in time set mode beq .tick rti .tick jsr DoSecondsTick jsr DoAnimationUpdates rti ECHO "Zero Page ROM Left: ",(EPROM_USER-*) ;**************************************************************** ; Main User EPROM * ; * ; * ;**************************************************************** ORG EPROM_USER ;**************************************************************** ; Start * ;**************************************************************** Start SUBROUTINE jsr BinTo7Seg jsr TimeSetMode bra Start ;**************************************************************** ; Startup Initialization * ;**************************************************************** MC68705_Init SUBROUTINE sei RSP ; First, Zero all of RAM. LDX #(RAM_END-RAM_START) .RAMClear clr RAM_START,X DEX bpl .RAMClear ; Now initialize the ports... LDA #0 STA PortA_DataDirection ; Port A is input (Switches) LDA #$FF STA PortB_DataDirection ; Both Port B (LED Control) and STA PortC_DataDirection ; and Port C (LED Mux, Debug LED) are output LDA #00 STA PortB_Data STA PortC_Data ; and are init'd to zero. LDA #12 STA Time_Hours ; 12:00PM Start LDA #60 STA Time_Seconds LDA #>625 STA DownCount_Hi LDA #<625 STA DownCount_Lo ; Initialize /625 Divisor LDA #25 STA Timer_Data ; Set down counter LDA #%00001110 STA Timer_Control ; Unmask IRQ, Reset Prescale, Start Timer. cli jmp Start ;**************************************************************** ; Divide by 10 Routine * ;**************************************************************** Div10AX SUBROUTINE ; Divide the value in A by 10. ; Remainder in A, Result in X LDX #0 .acc CMP #10 bmi .finished SUB #10 INX bra .acc .finished rts ;**************************************************************** ; Binary -> 7 Segment Conversion Routine * ;**************************************************************** BinTo7Seg SUBROUTINE LDA Time_Minutes jsr Div10AX STA GLO_Temp LDA DigitTable,X STA Display_7Segs + 2 ; Store Minutes Tens LDX GLO_Temp LDA DigitTable,X STA Display_7Segs + 3 ; Store Minutes Ones LDA Time_Hours jsr Div10AX STA GLO_Temp LDA DigitTable,X STA Display_7Segs + 0 ; Store Hours Tens LDX GLO_Temp LDA DigitTable,X STA Display_7Segs + 1 ; Store Hours Ones rts ;**************************************************************** ; Time Set * ;**************************************************************** TimeSetMode SUBROUTINE ; Switch Layout- ; ; 7 6 5 4 3 2 1 0 ; SET SL1 SL0 VL4 VL3 VL2 VL1 VL0 ; ; All switches are active (on) low. ; ; SET- Enable time set mode ; SL- Select digit for modification ; VL- Value to modify the digit to. LDA PortA_Data STA Set_Switches bpl .DoSetTime clr Display_Colon clr Time_Set rts .DoSetTime LDA #$FF STA Display_Colon STA Time_Set LDA Set_Switches COM STA Set_Switches LSR LSR LSR LSR LSR COM AND #3 TAX LDA Display_7Segs,X AND #$7F STA Display_7Segs,X TXA EOR #3 STA Temp_Digit ; Store Digit Selection LSR STA Temp_TOffset ;Note- ; *Temp_Digit ; -00 Minutes-Ones ; -01 Minutes-Tens ; -10 Hours-Ones ; -11 Hours-Tens ; ; *Temp_TOffset ; -0 Minutes ; -1 Hours TAX LDA Time_Minutes,X jsr Div10AX STA Temp_Ones LDA TimeSet_TenTable,X STA Temp_Tens LDA Set_Switches ; Get the switch configuration from Port A AND #$0F CMP #9 bmi .SwitchesInRange LDA #9 .SwitchesInRange STA Set_Value LDA Temp_Digit ; Are we checking tens or ones? AND #1 bne .ProcessTens .ProcessOnes LDX Temp_TOffset LDA Time_Minutes,X SUB Temp_Ones ADD Set_Value STA Time_Minutes,X bra .EnsureTimeCaps .ProcessTens LDX Set_Value LDA TimeSet_TenTable,X STA Set_Value LDX Temp_TOffset LDA Time_Minutes,X SUB Temp_Tens ADD Set_Value STA Time_Minutes,X .EnsureTimeCaps LDA Time_Minutes,X CMP TimeSet_CapTable,X bmi .CapsOK LDA TimeSet_CapSetTable,X .CapsOK STA Time_Minutes,X rts ;********************** ; Tables for Time Set * ;********************** TimeSet_TenTable dc.b 0,10,20,30,40,50,60,70,80,90 TimeSet_CapTable dc.b 60,24 TimeSet_CapSetTable dc.b 59,23 ;**************************************************************** ; Seconds Animation Table * ;**************************************************************** ; May as well just use a nice, (lazy) easy table to use up all that EPROM. ; You can replace this pattern with anything you like, really. ; ; This is kind of like a falling sand sort of thing. ;************* ; Segs 19-16 * ;************* Anim_Sand_Hi dc.b %11111111,%11110111,%11111011,%11111101 dc.b %11111110,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11110111,%11111011,%11111101 dc.b %11111110,%11111111,%11111111,%11111111 ; 32 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11110111,%11111011,%11111101,%11111110 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11110111,%11111011 ; 64 dc.b %11111101,%11111110,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11110111 dc.b %11111011,%11111101,%11111110,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11110111 ; 96 dc.b %11111011,%11111101,%11111110,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11110111,%11111011 dc.b %11111101,%11111110,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11110111,%11111011,%11111101,%11111110 ; 128 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11110111,%11111011,%11111101 dc.b %11111110,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11110111,%11111011,%11111101 dc.b %11111110,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 ; 160 dc.b %11110111,%11111011,%11111101,%11111110 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11110111,%11111011 dc.b %11111101,%11111110,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11110111 dc.b %11111011,%11111101,%11111110,%11111111 dc.b %11111111,%11111111,%11111111,%11110111 dc.b %11111011,%11111101,%11111110,%11111111 ; 192 dc.b %11111111,%11111111,%11110111,%11111011 dc.b %11111101,%11111110,%11111111,%11111111 dc.b %11110111,%11111011,%11111101,%11111110 dc.b %11111111,%11110111,%11111011,%11111101 dc.b %11111110,%11110110,%11111010,%11111100 dc.b %11110100,%11111000,%11110000,%11110000 dc.b %11110000,%11110000,%11110000,%11110000 dc.b %11110000,%11110000,%11110000,%11110000 ; 224 dc.b %11111000,%11111100,%11111110,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 ; 244 ;************* ; Segs 15-08 * ;************* Anim_Sand_Mi dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%01111111,%10111111,%11011111 dc.b %11101111,%11110111,%11111011,%11111101 dc.b %11111110,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%01111111,%10111111,%11011111 ; 32 dc.b %11101111,%11110111,%11111011,%11111101 dc.b %11111110,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %01111111,%10111111,%11011111,%11101111 dc.b %11110111,%11111011,%11111101,%11111110 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 ; 64 dc.b %11111111,%11111111,%01111111,%10111111 dc.b %11011111,%11101111,%11110111,%11111011 dc.b %11111101,%11111110,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%01111111 dc.b %10111111,%11011111,%11101111,%11110111 dc.b %11111011,%11111101,%11111110,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 ; 96 dc.b %11111111,%11111111,%11111111,%01111111 dc.b %10111111,%11011111,%11101111,%11110111 dc.b %11111011,%11111101,%11111110,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%01111111,%10111111 dc.b %11011111,%11101111,%11110111,%11111011 dc.b %11111101,%11111110,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 ; 128 dc.b %01111111,%10111111,%11011111,%11101111 dc.b %11110111,%11111011,%11111101,%11111110 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%01111111,%10111111,%11011111 dc.b %11101111,%11110111,%11111011,%11111101 dc.b %11111110,%11111110,%11111110,%11111110 dc.b %11111110,%01111110,%10111110,%11011110 dc.b %11101110,%11110110,%11111010,%11111100 ; 160 dc.b %11111100,%11111100,%11111100,%11111100 dc.b %01111100,%10111100,%11011100,%11101100 dc.b %11110100,%11111000,%11111000,%11111000 dc.b %11111000,%11111000,%01111000,%10111000 dc.b %11011000,%11101000,%11110000,%11110000 dc.b %11110000,%11110000,%11110000,%01110000 dc.b %10110000,%11010000,%11100000,%11100000 dc.b %11100000,%11100000,%11100000,%01100000 ; 192 dc.b %10100000,%11000000,%11000000,%11000000 dc.b %11000000,%11000000,%01000000,%10000000 dc.b %10000000,%10000000,%10000000,%10000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 ; 224 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %10000000,%11000000,%11100000,%11110000 dc.b %11111000,%11111100,%11111110,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 ; 244 ;************* ; Segs 07-00 * ;************* Anim_Sand_Lo dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%11111111,%11111111,%11111111 dc.b %11111111,%01111111,%10111111,%11011111 dc.b %11101111,%11110111,%11111011,%11111101 dc.b %11111110,%11111110,%11111110,%11111110 dc.b %11111110,%11111110,%11111110,%11111110 dc.b %11111110,%11111110,%11111110,%11111110 ; 32 dc.b %11111110,%11111110,%11111110,%11111110 dc.b %11111110,%01111110,%10111110,%11011110 dc.b %11101110,%11110110,%11111010,%11111100 dc.b %11111100,%11111100,%11111100,%11111100 dc.b %11111100,%11111100,%11111100,%11111100 dc.b %11111100,%11111100,%11111100,%11111100 dc.b %01111100,%10111100,%11011100,%11101100 dc.b %11110100,%11111000,%11111000,%11111000 ; 64 dc.b %11111000,%11111000,%11111000,%11111000 dc.b %11111000,%11111000,%11111000,%11111000 dc.b %11111000,%11111000,%01111000,%10111000 dc.b %11011000,%11101000,%11110000,%11110000 dc.b %11110000,%11110000,%11110000,%11110000 dc.b %11110000,%11110000,%11110000,%11110000 dc.b %11110000,%11110000,%11110000,%01110000 dc.b %10110000,%11010000,%11100000,%11100000 ; 96 dc.b %11100000,%11100000,%11100000,%11100000 dc.b %11100000,%11100000,%11100000,%11100000 dc.b %11100000,%11100000,%11100000,%01100000 dc.b %10100000,%11000000,%11000000,%11000000 dc.b %11000000,%11000000,%11000000,%11000000 dc.b %11000000,%11000000,%11000000,%11000000 dc.b %11000000,%11000000,%01000000,%10000000 dc.b %10000000,%10000000,%10000000,%10000000 ; 128 dc.b %10000000,%10000000,%10000000,%10000000 dc.b %10000000,%10000000,%10000000,%10000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 ; 160 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 ; 192 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 ; 224 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %00000000,%00000000,%00000000,%00000000 dc.b %10000000,%11000000,%11100000,%11110000 dc.b %11111000,%11111100,%11111110,%11111111 ; 244 ;**************************************************************** ; Dummy IRQ * ;**************************************************************** Dummy_IRQ SUBROUTINE rti ECHO "User EROM Left: ",(EPROM_MASKREG-*) ;**************************************************************** ; Mask Option Regs * ;**************************************************************** ORG EPROM_MASKREG ; Crystal Clock, Software Timer ; Internal Clock Timer Source, External Timer Disable ; and Prescale setting of /64. MaskReg_Setting dc.b %00000110 ;**************************************************************** ; IRQ Vectors * ;**************************************************************** ORG EPROM_IRQVecs TimerIRQVec dc.w Timer_IRQ ExtIRQVec dc.w Dummy_IRQ SWIRQVec dc.w Timer_IRQ ResetVec dc.w MC68705_Init