home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Transactor
/
Transactor_23_1988_Transactor_Publishing.d64
/
source.ez
< prev
next >
Wrap
Text File
|
2023-02-26
|
5KB
|
160 lines
*****************************
* *
* THIS ROUTINE IS ADDED *
* TO THE NORMAL IRQ *
* TO RESET THE SYSTEM *
* CLOCK (TI AND TI$) TO *
* THE TIME-OF-DAY CLOCK *
* IN CIA #1. *
* *
* THE TI/TI$ CLOCK IS *
* SUBJECT TO ACCUMULATED *
* ERRORS, ESPECIALLY *
* DURING DISK AND TAPE *
* ACCESS. THE TOD CLOCK *
* ACCURACY IS MAINTAINED *
* BY THE POWER LINE *
* FREQUENCY. *
* *
* THIS ROUTINE SETS THE *
* TI/TI$ CLOCK = TO THE *
* TOD CLOCK ON THE TOD *
* HOUR (MINUTES AND *
* SECONDS ALL = ZERO). *
* *
* NOEL NYMAN 8/87 *
* *
*****************************
TI = $A0 ;FIRST BYTE OF TI
TEMP1 = $FB ;TEMPORARY STORAGE, ORIGINAL VALUE UNCHANGED
TEMP2 = $FC ;TEMPORARY STORAGE, ORIGINAL VALUE UNCHANGED
IRQVEC = $0314 ;ADDRESS OF IRQ VECTOR
HOURS = $DC0B ;CIA #1 HOURS REGISTER
MINUTES = $DC0A ;CIA #1 MINUTES REGISTER
SECONDS = $DC09 ;CIA #1 SECONDS REGISTER
TENTHS = $DC08 ;CIA #1 TENTHS SEC REGISTER
; ROUTINE CAN BE PLACED AT ANY CONVENIENT
; LOCATION.
ORG $C000
; GET THE CURRENT IRQ VECTOR AND STORE IT IN
; 'HOLDIRQ.' PLACE THE VECTOR TO THE ADDED
; CODE AT THE IRQ VECTOR ADDRESS.
START SEI
LDA IRQVEC
STA HOLDIRQ
LDA IRQVEC+1
STA HOLDIRQ+1
LDA #<NEWIRQ
STA IRQVEC
LDA #>NEWIRQ
STA IRQVEC+1
CLI
RTS
HOLDIRQ HEX 00,00
;CODE ADDED TO IRQ ROUTINE
;STARTS HERE
NEWIRQ LDA TEMP1 ;STORE CURRENT VALUES OF
PHA ;TEMP1 AND TEMP2 ON STACK
LDA TEMP2 ;SO WE CAN RESTORE THEM IN CASE
PHA ;THE INTERRUPTED APPLICATION USES THEM
LDA HOURS ;READING THE HOURS REGISTER
STA TEMP1 ;HALTS THE CLOCK, WE STORE
;THE VALUE IN TEMP1, JUST
;IN CASE IT'S TIME TO
;USE IT
LDA MINUTES ;CHECK FOR MINUTES = ZERO
BNE EXIT ;IF NOT ZERO, NOT TIME TO UPDATE
LDA SECONDS ;CHECK FOR ZERO SECONDS
BNE EXIT ;AND SKIP UPDATE IF NOT ZERO
LDA TENTHS ;CHECK FOR ZERO TENTHS OF A SECOND
BNE EXIT ;AND SKIP UPDATE OF NOT ZERO
; THE UPDATE ROUTINE CONVERTS THE
; VALUE IN THE HOURS REGISTER
; FROM BCD/AM-PM FORMAT INTO
; A BINARY NUMBER IN THE RANGE
; 0-25, WHERE 0 OR 12 EQUALS 12AM,
; 1=1AM, 13=1PM, AND 25=NOON.
; THE CONVERTED NUMBER IS USED AS AN
; INDEX TO A TABLE TO STORE THE
; PROPER VALUES IN THE THREE BYTES
; OF TI.
LDA TEMP1 ;HOURS REGISTER VALUE
AND #$0F ;MASK OUT UPPER BCD DIGIT, AM-PM
STA TEMP2 ;STORE LOWER HOURS DIGIT
LDA TEMP1 ;GET HOURS VALUE AGAIN
AND #$10 ;MASK OUT ALL BUT THE UPPER
;BCD DIGIT. THIS CAN ONLY BE
;ZERO OR ONE.
BEQ SKIPTEN ;IF ZERO, DON'T ADD 10 TO TEMP2
CLC
LDA #$0A ;IF HIGH HOURS DIGIT WAS ONE,
ADC TEMP2 ;ADD 10 TO TEMP2
STA TEMP2
SKIPTEN LDA TEMP1 ;GET HOURS VALUE AGAIN
BPL SKIPAP ;IF HIGH BIT CLEAR
;TIME IS AM, SKIP THE ROUTINE
;THAT ADDS 12 FOR PM TIMES
CLC
LDA #$0C ;ADD 12 TO TEMP2
ADC TEMP2 ;IF TIME IS PM
STA TEMP2
SKIPAP LDY TEMP2 ;PUT INDEX TO TABLE IN Y
LDA TABLE1,Y ;GET VALUES FROM
STA TI ;THREE TABLES
LDA TABLE2,Y ;AND STORE IN THE
STA TI+1 ;THREE BYTES
LDA TABLE3,Y ;OF TI
STA TI+2
; RESTART DISPLAY,
; RESTORE THE PREVIOUS VALUES IN
; TEMP1 AND TEMP2, AND JUMP
; THROUGH THE STORED IRQ VECTOR TO
; COMPLETE THE IRQ ROUTINE.
EXIT LDA TENTHS ;READ TENTHS TO RESTART DISPLAY
PLA
STA TEMP2
PLA
STA TEMP1
JMP (HOLDIRQ)
; THE FOLLOWING THREE TABLES HOLD THE VALUES NORMALLY
; FOUND IN THE THREE BYTES OF TI AT THE 'TOP' OF EACH HOUR.
TABLE1 HEX 00,03,06,09,0D,10,13,17,1A,1D,20,24
HEX 00,2A,2E,31,34,38,3B,3E,41,45,48,4B,27
TABLE2 HEX 00,4B,97,E3,2F,7A,C6,12,5E,A9,F5,41
HEX 00,D8,24,70,BC,07,53,9F,EB,36,82,CE,8D
TABLE3 HEX 00,C0,80,40,00,C0,80,40,00,C0,80,40
HEX 00,C0,80,40,00,C0,80,40,00,C0,80,40,00