Code: Select all
'GET FLASHY CLOCK TIME TO SET OS TIME
LIBRARY "gemaes","gemvdi","bios","gemdos","xbios"
'R8k is double the stack size 4096bytes 4k
'500k doesnt work, 600 does but odd crashes.. so try 620
'$option k350,E+,N-,O-,X+,V+' ,M8,R8
'$option g,y+,u+,#,[,]
'$option fE:\CLOCK\TIMESET.PRG
DEFINT a-z
DIM SEL,RTC_ADDRESS,RTC_DATA_ADDRESS
DIM SHARED TC$,tmp&
RTC_ADDRESS& = 16746992 'FF89F0
RTC_DATA_ADDRESS& = 16746994 'FF89F2
'WINDOW OPEN 1,"TEMP",0,0,200,200,1
CALL GETRTCTIMEDATE
'WINDOW CLOSE 1
END
'********************
'BUSY WAIT LOOP
'*********************
'MAKE SURE WE DONT READ OR WRITE DURING A INTERNAL UPDATE TO THE REGISTERS
DEF BUSYWAIT
SHARED RTC_ADDRESS&,RTC_DATA_ADDRESS&
STATIC TMP%,T$,N&,junk
'WAIT FOR BIT TO GO LOW
N&=0 ' should really use timer ticks for this as boosters may upset the count
DO
POKEW (RTC_ADDRESS&),&B1111111100001010 ' CONTROL REGISTER 0AH
TMP% = PEEKW (RTC_DATA_ADDRESS&)
T$=BIN$(TMP%)
N& = N& +1: if N&>10000 THEN PRINT "RTC TIME OUT":MOUSE 0 :BUSYWAIT = 1:EXIT DEF
LOOP UNTIL MID$(T$,9,1)="0" ' 1111111100000000
BUSYWAIT = 0 ' no error
END DEF
'********************************************************
'GET RTC TIME DATE - EPIC EFFORT ROUTINE
'********************************************************
SUB GETRTCTIMEDATE
SHARED RTC_ADDRESS&,RTC_DATA_ADDRESS&
STATIC TMP%,H%,M%,S%,DY%,DATE%,MTH%,YR%,E%,DATA$,Z
E% = 0 ' ERRORS 0
'******************************
'START OF HOURS,MINS,SECS READ
'******************************
Z = BUSYWAIT' if rtc timeout then z will be 1, otherwise 0 for no error
'if we timed out here then assume everything is fucked
IF Z = 1 THEN PRINT "RTC TIME OUT!":EXIT SUB
'GET SECONDS REGISTRES
POKEW (RTC_ADDRESS&),&B1111111100000000
TMP% = PEEKW (RTC_DATA_ADDRESS&)
S% = (TMP% + 256)' 256 CLEARS THE HIGH BYTE 11111111
Z= BUSYWAIT 'MAKE SURE RTC NOT BUSY
'GET MINUTES REGISTRES
POKEW (RTC_ADDRESS&),&B1111111100000010
TMP% = PEEKW (RTC_DATA_ADDRESS&)
M% = TMP% + 256
Z= BUSYWAIT 'FORMAT C:
'GET HOURS REGISTRES
POKEW (RTC_ADDRESS&),&B1111111100000100
TMP% = PEEKW (RTC_DATA_ADDRESS&)
TMP%=TMP% + 256
IF TMP% > 32767 THEN TMP%=TMP% - 32768 ' IF THE PM BIT IS SET THEN WE NEED TO ZERO IT
H% = TMP%
'WITHOUT RTC RESET WE GET BACK 40,51,137 SO NEED TO ERROR CHECK
IF H% >24 OR M%>60 OR S%>60 THEN
INCR E%
PRINT "RTC TIME IS CORRUPTED"
END IF
'*************************
'START OF DATE STUFF
'************************
'GET WEEK DAY ( NOT USED - or is it ;) )
'SUNDAY = 1
POKEW (RTC_ADDRESS&),&B1111111100000110 ' SET ADDRESS 06H
DY% = PEEKW (RTC_DATA_ADDRESS&) - &B1111111100000000 ' READ REGISTER
'GET DAY 1-30
POKEW (RTC_ADDRESS&),&B1111111100000111 ' SET ADDRESS 07H
DATE% = PEEKW (RTC_DATA_ADDRESS&) - &B1111111100000000 ' READ REGISTER
'GET MONTH 1-12
POKEW (RTC_ADDRESS&),&B1111111100001000 ' SET ADDRESS 08H
MTH% = PEEKW (RTC_DATA_ADDRESS&) - &B1111111100000000 ' READ REGISTER
'GET YEAR
POKEW (RTC_ADDRESS&),&B1111111100001001 ' SET ADDRESS 09H
YR% = PEEKW (RTC_DATA_ADDRESS&) - &B1111111100000000 ' READ REGISTER
IF DY% >7 OR DATE%>32 OR MTH%>12 THEN
INCR E%
PRINT "RTC TIME IS CORRUPTED"
END IF
'**************************************************************************
'WE ALSO NEED TO CHECK BINARY OR OCT MODE (RTC DEFAULTS TO OCT I THINK?)
'**************************************************************************
'LOOK AT 0BH DM
'12345678 9 10 11 12 13 14 15 16
' SET,PIE,AIE,UIE,SQWE,DM,24/12,DSE
POKEW (RTC_ADDRESS&),&B1111111100001011 ' SET ADDRESS 0BH
TMP% = PEEKW (RTC_DATA_ADDRESS&) ' READ REGISTER into tmp&
IF MID$(STR$(TMP%),14,1) = "0" THEN
INCR E%
PRINT "RTC TIME IS CORRUPTED"
END IF
'IF E%>0 THEN WE HAVE RTC ERRORS SO QUIT THIS ROUTINE
IF E% > 0 THEN EXIT SUB
'IF WE ARE HERE THEN WE NEED TO SET THE RTC MENU NUMBERS
'A BIT SHITTY AS WE HAVE TO CONVERT NUMBER TO STRING THEN REMOVE THE FIRST SPACE
PRINT MID$(STR$(H%),2,LEN(STR$(H%))-1) ' HOURS
PRINT MID$(STR$(M%),2,LEN(STR$(M%))-1) 'MINS
PRINT MID$(STR$(S%),2,LEN(STR$(S%))-1) 'SECONDS
PRINT MID$(STR$(DATE%),2,LEN(STR$(DATE%))-1) ' DAY
PRINT MID$(STR$(MTH%),2,LEN(STR$(MTH%))-1) 'MONTH
PRINT MID$(STR$(YR%),2,LEN(STR$(YR%))-1) 'YEAR
'TRANSLATE WEEK DAY TO TEXT
'IF DY%=1 THEN Setob_Text WEEKDAY%,"SUNDAY"
'IF DY%=2 THEN Setob_Text WEEKDAY%,"MONDAY"
'IF DY%=3 THEN Setob_Text WEEKDAY%,"TUESDAY"
'IF DY%=4 THEN Setob_Text WEEKDAY%,"WEDNESDAY"
'IF DY%=5 THEN Setob_Text WEEKDAY%,"THURSDAY"
'IF DY%=6 THEN Setob_Text WEEKDAY%,"FRIDAY"
'IF DY%=7 THEN Setob_Text WEEKDAY%,"SATURDAY"
'IF DY%>7 THEN Setob_Text WEEKDAY%,"EXXOSDAY"
'NEED TO GET THE DLS 24H FIGURES FROM THE RTC AND SET THE TICK BOXES
'12345678 9 10 11 12 13 14 15 16
' SET,PIE,AIE,UIE,SQWE,DM,24/12,DSE
Z= BUSYWAIT 'MAKE SURE RTC NOT BUSY
POKEW (RTC_ADDRESS&),&B1111111100001011 ' CONTROL REGISTER 0BH
DATA$ = BIN$(PEEKW (RTC_DATA_ADDRESS&))
'IF MID$(DATA$,16,1) = "1" THEN Setob_state DLSRADIO%,mask_checked ELSE Setob_state DLSRADIO%,mask_normal
'IF MID$(DATA$,15,1) = "1" THEN Setob_state RADIO24%,mask_checked ELSE Setob_state RADIO24%,mask_normal
END SUBGROK is almost there, but the year keeps showing as zero or odd things like "J8" instead of 26 :shrug: Anyone take a peek see if anything looks wrong in the ASM code ?
Code: Select all
* Atari ST 68000 Assembly for Devpac
* Fixed version: uses proper low-byte masking (andi #$00FF) for ALL registers
* Year is now correctly preserved and printed (was being overwritten before)
* Matches HiSoft BASIC logic exactly where it matters
* Busy-wait and DM check also use safe masking
* PRINT_NUM logic is correct (DIVU remainder/quotient handling was already right)
SECTION TEXT
START:
jsr GETRTCTIMEDATE
clr.w -(sp)
trap #1
* BusyWait - returns d0=0 ok, d0=1 timeout
BUSYWAIT:
movem.l d1/a0,-(sp)
move.l #10000,d1
.loop:
move.w #$FF0A,(RTC_ADDR)
move.w (RTC_DATA),d0
andi.w #$00FF,d0 ; safe low byte
btst #7,d0 ; UIP bit
beq.s .ok
subq.l #1,d1
bne.s .loop
moveq #1,d0
bra.s .exit
.ok:
moveq #0,d0
.exit:
movem.l (sp)+,d1/a0
rts
GETRTCTIMEDATE:
movem.l d0-d7/a0-a1,-(sp)
clr.w d7 ; error flag
jsr BUSYWAIT
tst.w d0
beq.s .notimeout
pea MSG_TIMEOUT(PC)
move.w #9,-(sp)
trap #1
addq.l #6,sp
bra .exit
.notimeout:
* Seconds (reg 0)
move.w #$FF00,(RTC_ADDR)
move.w (RTC_DATA),d0
andi.w #$00FF,d0
move.w d0,d6 ; S%
jsr BUSYWAIT
* Minutes (reg 2)
move.w #$FF02,(RTC_ADDR)
move.w (RTC_DATA),d0
andi.w #$00FF,d0
move.w d0,d5 ; M%
jsr BUSYWAIT
* Hours (reg 4) - ignore 12h/PM bit (assumes 24h as per your BASIC checks)
move.w #$FF04,(RTC_ADDR)
move.w (RTC_DATA),d0
andi.w #$00FF,d0
move.w d0,d4 ; H%
* Time validity
cmpi.w #24,d4
bhi.s .timecorr
cmpi.w #60,d5
bhi.s .timecorr
cmpi.w #60,d6
bhi.s .timecorr
bra.s .timeok
.timecorr:
addq.w #1,d7
pea MSG_CORRUPTED(PC)
move.w #9,-(sp)
trap #1
addq.l #6,sp
.timeok:
* Weekday (reg 6)
move.w #$FF06,(RTC_ADDR)
move.w (RTC_DATA),d0
andi.w #$00FF,d0
move.w d0,d3 ; DY%
* Day (reg 7)
move.w #$FF07,(RTC_ADDR)
move.w (RTC_DATA),d0
andi.w #$00FF,d0
move.w d0,d2 ; DATE%
* Month (reg 8)
move.w #$FF08,(RTC_ADDR)
move.w (RTC_DATA),d0
andi.w #$00FF,d0
move.w d0,d1 ; MTH%
* Year (reg 9) - THIS IS THE ONE THAT WAS BEING LOST
move.w #$FF09,(RTC_ADDR)
move.w (RTC_DATA),d0
andi.w #$00FF,d0
move.w d0,d0 ; YR% now safely in d0 (and preserved until print)
* Date validity
cmpi.w #7,d3
bhi.s .datecorr
cmpi.w #32,d2
bhi.s .datecorr
cmpi.w #12,d1
bhi.s .datecorr
bra.s .dateok
.datecorr:
addq.w #1,d7
pea MSG_CORRUPTED(PC)
move.w #9,-(sp)
trap #1
addq.l #6,sp
.dateok:
* DM bit check (binary mode)
jsr BUSYWAIT
move.w #$FF0B,(RTC_ADDR)
move.w (RTC_DATA),d3
andi.w #$00FF,d3
btst #2,d3 ; DM=1 (binary)
bne.s .dmok
addq.w #1,d7
pea MSG_CORRUPTED(PC)
move.w #9,-(sp)
trap #1
addq.l #6,sp
.dmok:
tst.w d7
bne.s .exit
* Print: H M S DATE MTH YEAR (year was previously lost)
move.w d0,-(sp) ; save year
move.w d4,d0
jsr PRINT_NUM
move.w d5,d0
jsr PRINT_NUM
move.w d6,d0
jsr PRINT_NUM
move.w d2,d0
jsr PRINT_NUM
move.w d1,d0
jsr PRINT_NUM
move.w (sp)+,d0 ; restore year
jsr PRINT_NUM
.exit:
movem.l (sp)+,d0-d7/a0-a1
rts
* PRINT_NUM: prints 0-99 as decimal string + CRLF (no leading zero)
PRINT_NUM:
movem.l d1/a1,-(sp)
lea BUFFER(PC),a1
cmpi.w #10,d0
bcs.s .one
move.w d0,d1
divu.w #10,d1
swap d1
addi.b #'0',d1
move.b d1,1(a1) ; units
swap d1
addi.b #'0',d1
move.b d1,(a1) ; tens
moveq #2,d1
bra.s .out
.one:
addi.b #'0',d0
move.b d0,(a1)
moveq #1,d1
.out:
clr.b (a1,d1.w)
pea (a1)
move.w #9,-(sp)
trap #1
addq.l #6,sp
pea CRLF(PC)
move.w #9,-(sp)
trap #1
addq.l #6,sp
movem.l (sp)+,d1/a1
rts
SECTION DATA
RTC_ADDR EQU $FF89F0
RTC_DATA EQU $FF89F2
MSG_TIMEOUT DC.B 'RTC TIME OUT!',13,10,0
MSG_CORRUPTED DC.B 'RTC TIME IS CORRUPTED',13,10,0
CRLF DC.B 13,10,0
SECTION BSS
BUFFER DS.B 10
END
