[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: PRODOS file date query
Thunderclock driver:
TCLOCK_P1 PROC ORG $D742
; This EdAsm/Asm816 source code file was converted to AsmIIGS
; by EdAsmCVTIIGS version 1.0D3 on 1/24/89 at 10:39:28 AM
* Converted and reformatted by Monte Benaresh -- February 1989
MACHINE M6502
longa off
longi off
***********************************************************
* *
* PRODOS 8 CLOCK DRIVER INTERFACE ROUTINE *
* *
* COPYRIGHT APPLE COMPUTER, INC., 1983-86 *
* *
* ALL RIGHTS RESERVED *
* *
***********************************************************
PRODOS EQU 0
EDNET EQU 1
OS EQU PRODOS
***************************************
* CLOCK - PRODOS INTERFACE ROUTINE
* BY JAMES R. HUSTON
* WARNING: HARD CODED FOR SLOT 1
***************************************
TENS EQU $3A ;NO CONFLICT SINCE MONTH IS LAST PROCESSED.
MONTH EQU $3A
WKDAY EQU $3B
DAY EQU $3C
HOUR EQU $3D
MINUTE EQU $3E
WTTCP EQU $C10B
RDTCP EQU $C108 ;CLOCK READ ENTRY POINTS.
CLKMODE EQU $538 ;(+$CN=$5F8+N)
DATE EQU $BF90 ;PRODOS DATE
TIME EQU $BF92 ;PRODOS TIME.
INBUF EQU $200 ;INPUT BUFFER.
READCLK LDX CLKSLT ;PRESERVE CURRENT MODE FOR THUNDERCLOCK
LDA CLKMODE,X
PHA
LDA #$A3 ;SEND NUMERIC MODE BYTE TO THUNDERCLOCK
JSR WTTCP
CLKSLT EQU *+2
JSR RDTCP ;READ MONTH, DAY OF WEEK, DAY OF MONTH, AND TIME
CLC ;INTO INPUT BUFFER.
LDX #4 ;INDEX FOR 5 VALUES
LDY #$C ;READ MINUTES FIRST, MONTH LAST.
CONVRT LDA INBUF,Y ;CONVERT VALUES TO BINARY.
AND #$7 ;NO VALUE > 5 DECIMAL.
STA TENS ;MULTIPLY 'TENS' PLACE VALUE.
ASL A
ASL A
ADC TENS ;NOW IT'S TIMES 5.
ASL A ;NOW IT IS TIMES 10!
ADC INBUF+1,Y ;ADD TO ASCII 'ONES' PLACE
SEC ;AND SUBTRACT OUT THE ASCII...
SBC #$B0
CNVRT2 STA MONTH,X ;SAVE CONVERTED VALUE.
DEY ;INDEX TO NEXT LOWER VALUE.
DEY
DEY
DEX ;ARE THERE MORE VALUES?
BPL CONVRT ;BRANCH IF THERE ARE.
TAY ;ACC STILL CONTAINS MONTH, SAVE IN Y FOR NOW.
LSR A
ROR A
ROR A
ROR A ;(HI BIT OF MONTH HELD IN CARRY)
ORA DAY
STA DATE ;SAVE LOW VALUE OF DATE.
PHP ;SAVE HI BIT OF MONTH FOR NOW.
AND #$1F ;ISOLATE DAY AGAIN.
;(WHEN MONTH >7 CARRY SET ACCOUNTED FOR IN FOLLOWING ADD)
ADC TDAYS-1,Y ;REMEMBER THAT Y=MONTH.
BCC CNVRT3 ;BRANCH NOT SEPT 13 THRU 30.
ADC #3 ;ADJUST FOR MOD 7 WHEN DAY > 256.
CNVRT3 SEC
CNVRT4 SBC #7
BCS CNVRT4 ;LOOP UNTIL LESS THAN 0.
ADC #7 ;NOW MAKE IT IN THE RANGE OF 0-6.
SBC WKDAY ;THE DELTA PROVIDES YEARS OFFSET.
BCS CNVRT5 ;BRANCH IF POSITIVE.
ADC #7 ;ELSE MAKE IT POSITIVE AGAIN.
CNVRT5 TAY ;LOOK UP YEAR!
LDA YRADJ,Y
PLP ;LASTLY, COMBINE WITH HI BIT OF MONTH.
ROL A
STA DATE+1 ;AND SAVE IT.
LDA HOUR
STA TIME+1 ;MOVE HOUR AND MINUTE TO PRODOS GLOBALS.
LDA MINUTE
STA TIME
PLA
LDX CLKSLT ;RESTORE PREVIOUS MODE.
STA CLKMODE,X
RTS ;ALL DONE...
; This table contains entries for the cumulative number of days in a
year,
; one entry for each month. The values are modulo 256.
;
; For example, at the beginning of January, 0 days of the year have
elapsed.
; On July 1st, 181 days have elapsed.
TDAYS DC.B 0 ;January
dc.b 31 ;February
dc.b 59 ;March
dc.b 90 ;April
DC.B 120 ;May
dc.b 151 ;June
dc.b 181 ;July
dc.b 211 ;August
DC.B 242 ;September
dc.b 20 ;October (remember, MOD 256)
dc.b 51 ;November
dc.b 81 ;December
; The following table is used to look up the current year, based on
the current
; month, day, and day of week. The first entry in the table
corresponds to the
; year in which January 1st falls on a Monday. The second entry is
the year which
; has January 1st on a Sunday, and so on backwards through the days of
the week.
;
; To refresh the table (because time goes on...), start with the
current year, look
; at your calendar and found out what day January 1st was on. Fill in
the appropriate
; entry in the table, then continue on for the next five years.
;
; While filling in new entries for the table, there should be one
blank entry right
; next to a leap year entry. In this case, copy the leap year entry
into the blank
; entry. (Keep in mind that the year 2000 is NOT a leap year!)
;
YRADJ DC.B 96 ;Monday
dc.b 95 ;Sunday
dc.b 94 ;Saturday
dc.b 93 ;Friday
DC.B 98 ;Thursday
dc.b 97 ;Wednesday
dc.b 96 ;Tuesday
END