ProDOS8/MLI.SRC/CCLOCK.S

138 lines
5.8 KiB
ArmAsm

***********************************************************
*
* ProDOS 8 CORTLAND CLOCK DRIVER
*
* COPYRIGHT APPLE COMPUTER, INC., 1986
*
* ALL RIGHTS RESERVED
*
* Written by Kerry Laidlaw, 2/12/86
* Modified by Mike Askins, 9/6/86
* Modified by Fern Bachman, 9/7/86
*
***********************************************************
*
* This is the ProDOS8 Cortland built-in clock driver.
* Its sole function in life is to fetch the time from the Cortland
* clock via the Read Hex Time misc. tool call, and transfer this
* time into the ProDOS global page time format.
*
* This routine will IGNORE any errors passed back to it from the
* Read Hex Time call. This was done since existing ProDOS8 programs
* cannot deal with some new time error code.
* Thus the only way that a user can tell if his Cortland clock is
* broken, is by noticing that the date and time fields are zeroed.
*
* Note: There are some interesting facts to know regarding the
* slot clock driver for ProDOS8 and the built-in
* Cortland clock. The year value returned from the Cortland clock
* is an offset from the year 1900. Thus Cortland is capable of
* reporting the year correctly until 1900+255=2155. Only 7 bits
* are used for the year in the ProDOS8 global page, so theoretically
* 1900+127=2027 is the last year that ProDOS could represent on a
* Cortland. But this is only if the ProDOS8 year value is interpreted
* as being an offset from 1900.
*
* Historically, the year value has been interpreted as the binary
* representation of the last two digits of the year 19xx.
* So this means that programs that display the year as a concatenation
* of 19 and the ascii equivalent of the year value will work until 1999.
* And programs that just display the last two digits of the year will
* still work correctly until (20)27 if they convert the year value
* correctly, but ignore any hundredths place digit.
*
* Apple //e's that use slot clocks that utilize the slot clock
* driver have further restrictions of the year value. The slot
* clock driver calculates the year given the position of the day
* of the week in the month. This algorithm then uses a year look
* up table that has seven possible values. Leap years are repeated
* in the table. Since 1988 is a leap year, then the updated slot
* clock driver (file TCLOCK) will yield the six year offset values
* rather then seven.
* So before 1992, if ProDOS8 still exists, the slot clock driver
* routine must be updated again!
*
* So, we now have the following definition:
* The value placed in the year field is defined as the
* number of years past the year 1900.
* Numerically speaking: Current Year = 1900 + year value.
MX %11
ORG ClockBegin
* This mod will force read/write main memory for the tool
* call by resetting the read/write auxillary memory bits
* in the state register (statereg).
MX %11
IIgsClock EQU *
SEP #$30 ;Make sure we're in 8 bit mode
LDA STATEREG ;Get the state reg
STA SaveState ;Keep for restore after tool call
AND #%11001111 ;Clear the Read/Write aux memory bits
STA STATEREG ;Make it real
* First off, lets get into native mode with 16 bit m & x.
MX %00
CLC ;Set e = 0, to set native mode
XCE
REP #$30 ;Zero m & x for 16-bit mode
LDA #$0000 ;Zero out result space
PHA ; Push 4 words for hex time result...
PHA
PHA
PHA
_ReadTimeHex
* Note that no error condition is checked for, so the date will
* be zeroed by default if an error indeed happened.
*
* Back to 8 bit m to access results on stack...
MX %10
SEP #$20
LDA SaveState ;Restore the state register
STA STATEREG
* Now let's pull the time off the stack and stick it in the global page.
PLA ;Pull off Seconds, and ignore
PLA ;Pull off Minutes
STA TimeLo ;Store in global page
PLA ;Pull off Hours
STA TimeLo+1 ;Store in global page
PLA ;Pull off Year value
:loop1 CMP #100 ;Adjust for
BCC :1
SBC #100 ; year 2000
BRA :loop1
:1 STA DateLo+1 ; (year)
PLA ;Pull off Day
INC ;Increment day value for ProDOS8 format
STA DateLo ;Store in global page
PLA ;Pull off Month
INC ;Incr month value for ProDOS8 format
ASL ;Shift month as it sits in between
ASL ; the year and day values
ASL
ASL
ASL
ORA DateLo ;Put all but the top bit of month value
STA DateLo ; in the day byte
ROL DateLo+1 ;Put hi bit of mo. in lo bit of yr byte
PLA ;Pull off unused byte
PLA ;Pull off Day of Week. Stack now clean
SEC ;Now go back to emulation mode
XCE ; to continue with ProDOS8
RTS ;That's all
SaveState DB $00 ;Keep the state of state register
ASC 'JIMJAYKERRY&MIKE'
ClockEnd EQU *
DS 125-ClockEnd+ClockBegin,0; Zero rest of 125 bytes
Size EQU *-ClockBegin ;MUST be $7D (125) bytes in length!
DS $80-Size,0