Mercurial > hg > Members > kono > nitros9-code
changeset 1267:6f047b53bbfa
Dressed up source code
author | boisy |
---|---|
date | Tue, 19 Aug 2003 12:05:47 +0000 |
parents | 7cb546cb7e80 |
children | db34c496ad22 |
files | level2/modules/clock.asm level2/modules/clock2.asm |
diffstat | 2 files changed, 883 insertions(+), 887 deletions(-) [+] |
line wrap: on
line diff
--- a/level2/modules/clock.asm Tue Aug 19 04:21:47 2003 +0000 +++ b/level2/modules/clock.asm Tue Aug 19 12:05:47 2003 +0000 @@ -22,43 +22,43 @@ * 9r5 2003/08/18 Boisy G. Pitre * Separated clock into Clock and Clock2 for modularity. - nam Clock + nam Clock ttl Clock for OS-9 Level Two/NitrOS-9 -TkPerTS equ 2 ticks per time slice -GI.Toggl equ %00000001 GIME CART* IRQ enable bit, for CC3 +TkPerTS equ 2 ticks per time slice +GI.Toggl equ %00000001 GIME CART* IRQ enable bit, for CC3 * TC9 needs to reset more interrupt sources *GI.Toggl equ %00000111 GIME SERINT*, KEYINT*, CART* IRQ enable bits - IFP1 - use defsfile - ENDC + ifp1 + use defsfile + endc -Edtn equ 9 -Vrsn equ 5 +Edtn equ 9 +Vrsn equ 5 *------------------------------------------------------------ * * Start of module * - mod len,name,Systm+Objct,ReEnt+Vrsn,Init,0 + mod len,name,Systm+Objct,ReEnt+Vrsn,Init,0 -name fcs "Clock" - fcb Edtn +name fcs "Clock" + fcb Edtn * * Table to set up Service Calls: * -NewSvc fcb F$Time +NewSvc fcb F$Time fdb F.Time-*-2 - fcb F$VIRQ + fcb F$VIRQ fdb F.VIRQ-*-2 - fcb F$Alarm + fcb F$Alarm fdb F.ALARM-*-2 - fcb F$STime + fcb F$STime fdb F.STime-*-2 - fcb $80 end of service call installation table + fcb $80 end of service call installation table *--------------------------------------------------------- * IRQ Handling starts here. @@ -66,26 +66,26 @@ * Caveat: There may not be a stack at this point, so avoid using one. * Stack is set up by the kernel between here and SvcVIRQ. * -SvcIRQ lda >IRQEnR Get GIME IRQ Status and save it. - ora <D.IRQS - sta <D.IRQS - bita #$08 Check for clock interrupt - beq NoClock - anda #^$08 Drop clock interrupt - sta <D.IRQS - ldx <D.VIRQ Set VIRQ routine to be executed - clr <D.QIRQ ---x IS clock IRQ - bra ContIRQ +SvcIRQ lda >IRQEnR Get GIME IRQ Status and save it. + ora <D.IRQS + sta <D.IRQS + bita #$08 Check for clock interrupt + beq NoClock + anda #^$08 Drop clock interrupt + sta <D.IRQS + ldx <D.VIRQ Set VIRQ routine to be executed + clr <D.QIRQ ---x IS clock IRQ + bra ContIRQ -NoClock leax DoPoll,pcr If not clock IRQ, just poll IRQ source - IFNE H6309 - oim #$FF,<D.QIRQ ---x set flag to NOT clock IRQ - ELSE - lda #$FF - sta <D.QIRQ - ENDC -ContIRQ stx <D.SvcIRQ - jmp [D.XIRQ] Chain through Kernel to continue IRQ handling +NoClock leax DoPoll,pcr If not clock IRQ, just poll IRQ source + IFNE H6309 + oim #$FF,<D.QIRQ ---x set flag to NOT clock IRQ + ELSE + lda #$FF + sta <D.QIRQ + ENDC +ContIRQ stx <D.SvcIRQ + jmp [D.XIRQ] Chain through Kernel to continue IRQ handling *------------------------------------------------------------ * @@ -97,138 +97,138 @@ * - Update time variables * - At end of minute, check alarm * -SvcVIRQ clra Flag if we find any VIRQs to service - pshs a - ldy <D.CLTb Get address of VIRQ table - bra virqent +SvcVIRQ clra Flag if we find any VIRQs to service + pshs a + ldy <D.CLTb Get address of VIRQ table + bra virqent -virqloop equ * - IFGT Level-2 - ldd 2,y Get Level 3 extended map type - orcc #IntMasks - sta >$0643 - stb >$0645 - std >$FFA1 - andcc #^IntMasks - ENDC +virqloop equ * + ifgt Level-2 + ldd 2,y Get Level 3 extended map type + orcc #IntMasks + sta >$0643 + stb >$0645 + std >$FFA1 + andcc #^IntMasks + endc - ldd Vi.Cnt,x Decrement tick count - IFNE H6309 - decd --- subd #1 - ELSE - subd #$0001 - ENDC - bne notzero Is this one done? - lda Vi.Stat,x Should we reset? - bmi doreset - lbsr DelVIRQ No, delete this entry -doreset ora #$01 Mark this VIRQ as triggered. - sta Vi.Stat,x - lda #$80 Add VIRQ as interrupt source - sta ,s - ldd Vi.Rst,x Reset from Reset count. -notzero std Vi.Cnt,x -virqent ldx ,y++ - bne virqloop + ldd Vi.Cnt,x Decrement tick count + IFNE H6309 + decd --- subd #1 + ELSE + subd #$0001 + ENDC + bne notzero Is this one done? + lda Vi.Stat,x Should we reset? + bmi doreset + lbsr DelVIRQ No, delete this entry +doreset ora #$01 Mark this VIRQ as triggered. + sta Vi.Stat,x + lda #$80 Add VIRQ as interrupt source + sta ,s + ldd Vi.Rst,x Reset from Reset count. +notzero std Vi.Cnt,x +virqent ldx ,y++ + bne virqloop - IFGT Level-2 - puls d - orcc #Carry - stb >$0643 - stb >$FFA1 - incb - stb >$0645 - stb >$FFA1 - andcc #^IntMasks - ELSE - puls a Get VIRQ status flag: high bit set if VIRQ - ENDC + ifgt Level-2 + puls d + orcc #Carry + stb >$0643 + stb >$FFA1 + incb + stb >$0645 + stb >$FFA1 + andcc #^IntMasks + else + puls a Get VIRQ status flag: high bit set if VIRQ + endc - ora <D.IRQS Check to see if other hardware IRQ pending. - bita #%10110111 Any V/IRQ interrupts pending? - beq toggle - IFGT Level-2 - lbsr DoPoll Yes, go service them. - ELSE - bsr DoPoll Yes, go service them. - ENDC - bra KbdCheck -toggle equ * - IFGT Level-2 - lbsr DoToggle No, toggle GIME anyway - ELSE - bsr DoToggle No, toggle GIME anyway - ENDC + ora <D.IRQS Check to see if other hardware IRQ pending. + bita #%10110111 Any V/IRQ interrupts pending? + beq toggle + ifgt Level-2 + lbsr DoPoll Yes, go service them. + else + bsr DoPoll Yes, go service them. + endc + bra KbdCheck +toggle equ * + ifgt Level-2 + lbsr DoToggle No, toggle GIME anyway + else + bsr DoToggle No, toggle GIME anyway + endc -KbdCheck equ * - IFGT Level-2 - lda >$0643 grab current map type - ldb >$0645 - pshs d save it - orcc #IntMasks IRQs off - lda >$0660 SCF local memory ---x - sta >$0643 into DAT image ---x - sta >$FFA1 and into RAM ---x - inca - sta >$0645 - sta >$FFA2 map in SCF, CC3IO, WindInt, etc. - ENDC +KbdCheck equ * + ifgt Level-2 + lda >$0643 grab current map type + ldb >$0645 + pshs d save it + orcc #IntMasks IRQs off + lda >$0660 SCF local memory ---x + sta >$0643 into DAT image ---x + sta >$FFA1 and into RAM ---x + inca + sta >$0645 + sta >$FFA2 map in SCF, CC3IO, WindInt, etc. + endc - jsr [>D.AltIRQ] go update mouse, gfx cursor, keyboard, etc. + jsr [>D.AltIRQ] go update mouse, gfx cursor, keyboard, etc. - IFGT Level-2 - puls d restore original map type ---x - orcc #IntMasks - sta >$0643 into system DAT image ---x - stb >$0645 - std >$FFA1 and into RAM ---x - andcc #$AF - ENDC + ifgt Level-2 + puls d restore original map type ---x + orcc #IntMasks + sta >$0643 into system DAT image ---x + stb >$0645 + std >$FFA1 and into RAM ---x + andcc #$AF + endc - dec <D.Tick End of second? - bne VIRQend No, skip time update and alarm check - lda #TkPerSec Reset tick count - sta <D.Tick + dec <D.Tick End of second? + bne VIRQend No, skip time update and alarm check + lda #TkPerSec Reset tick count + sta <D.Tick * ATD: Modified to call real time clocks on every minute ONLY. - inc <D.Sec go up one second - lda <D.Sec grab current second - cmpa #60 End of minute? - blo VIRQend No, skip time update and alarm check - clr <D.Sec Reset second count to zero + inc <D.Sec go up one second + lda <D.Sec grab current second + cmpa #60 End of minute? + blo VIRQend No, skip time update and alarm check + clr <D.Sec Reset second count to zero * * Call GetTime entry point in Clock2 * - ldx <D.Clock2 get entry point to Clock2 - jsr $03,x call GetTime entry point + ldx <D.Clock2 get entry point to Clock2 + jsr $03,x call GetTime entry point NoGet ldd >WGlobal+G.AlPID - ble VIRQend Quit if no Alarm set - ldd >WGlobal+G.AlPckt+3 Does Hour/Minute agree? - cmpd <D.Hour - bne VIRQend - ldd >WGlobal+G.AlPckt+1 Does Month/Day agree? - cmpd <D.Month - bne VIRQend - ldb >WGlobal+G.AlPckt+0 Does Year agree? - cmpb <D.Year - bne VIRQend + ble VIRQend Quit if no Alarm set + ldd >WGlobal+G.AlPckt+3 Does Hour/Minute agree? + cmpd <D.Hour + bne VIRQend + ldd >WGlobal+G.AlPckt+1 Does Month/Day agree? + cmpd <D.Month + bne VIRQend + ldb >WGlobal+G.AlPckt+0 Does Year agree? + cmpb <D.Year + bne VIRQend ldd >WGlobal+G.AlPID - cmpd #1 - beq checkbel - os9 F$Send - bra endalarm -checkbel ldb <D.Sec Sound bell for 15 seconds - andb #$F0 - beq dobell -endalarm ldd #$FFFF + cmpd #1 + beq checkbel + os9 F$Send + bra endalarm +checkbel ldb <D.Sec Sound bell for 15 seconds + andb #$F0 + beq dobell +endalarm ldd #$FFFF std >WGlobal+G.AlPID - bra VIRQend + bra VIRQend dobell ldx >WGlobal+G.BelVec - beq VIRQend - jsr ,x -VIRQend jmp [>D.Clock] Jump to kernel's timeslice routine + beq VIRQend + jsr ,x +VIRQend jmp [>D.Clock] Jump to kernel's timeslice routine *------------------------------------------------------------ * Interrupt polling and GIME reset code @@ -237,144 +237,144 @@ * * Call [D.Poll] until all interrupts have been handled * -Dopoll - IFGT Level-2 - lda >$0643 Level 3: get map type - ldb >$0645 - pshs d save for later - ENDC -Dopoll.i - jsr [>D.Poll] Call poll routine - bcc DoPoll.i Until error (error -> no interrupt found) +Dopoll + ifgt Level-2 + lda >$0643 Level 3: get map type + ldb >$0645 + pshs d save for later + endc +Dopoll.i + jsr [>D.Poll] Call poll routine + bcc DoPoll.i Until error (error -> no interrupt found) - IFGT Level-2 - puls d - orcc #IntMasks - sta >$0643 - stb >$0645 - std >$FFA1 - andcc #^IntMasks - ENDC + ifgt Level-2 + puls d + orcc #IntMasks + sta >$0643 + stb >$0645 + std >$FFA1 + andcc #^IntMasks + endc * * Reset GIME to avoid missed IRQs * -DoToggle lda #^GI.Toggl Mask off CART* bit - anda <D.IRQS - sta <D.IRQS - lda <D.IRQER Get current enable register status - tfr a,b - anda #^GI.Toggl Mask off CART* bit - orb #GI.Toggl --- ensure that 60Hz IRQ's are always enabled - sta >IRQEnR Disable CART - stb >IRQEnR Enable CART - clrb - rts +DoToggle lda #^GI.Toggl Mask off CART* bit + anda <D.IRQS + sta <D.IRQS + lda <D.IRQER Get current enable register status + tfr a,b + anda #^GI.Toggl Mask off CART* bit + orb #GI.Toggl --- ensure that 60Hz IRQ's are always enabled + sta >IRQEnR Disable CART + stb >IRQEnR Enable CART + clrb + rts *------------------------------------------------------------ * * Handle F$VIRQ system call * -F.VIRQ pshs cc +F.VIRQ pshs cc orcc #IntMasks Disable interrupts ldy <D.CLTb Address of VIRQ table ldx <D.Init Address of INIT ldb PollCnt,x Number of polling table entries from INIT ldx R$X,u Zero means delete entry - beq RemVIRQ - IFGT Level-2 - bra FindVIRQ ---x + beq RemVIRQ + ifgt Level-2 + bra FindVIRQ ---x -v.loop leay 4,y ---x - ENDC +v.loop leay 4,y ---x + endc FindVIRQ ldx ,y++ Is VIRQ entry null? beq AddVIRQ If yes, add entry here - decb - bne FindVIRQ - puls cc - comb - ldb #E$Poll - rts + decb + bne FindVIRQ + puls cc + comb + ldb #E$Poll + rts -AddVIRQ - IFGT Level-2 - ldx R$Y,u - stx ,y - lda >$0643 - ldb >$0645 - std 2,y - ELSE - leay -2,y point to first null VIRQ entry - ldx R$Y,u - stx ,y - ENDC - ldy R$D,u - sty ,x - bra virqexit +AddVIRQ + ifgt Level-2 + ldx R$Y,u + stx ,y + lda >$0643 + ldb >$0645 + std 2,y + else + leay -2,y point to first null VIRQ entry + ldx R$Y,u + stx ,y + endc + ldy R$D,u + sty ,x + bra virqexit - IFGT Level-2 -v.chk leay 4,y -RemVIRQ ldx ,y - ELSE -RemVIRQ ldx ,y++ - ENDC - beq virqexit - cmpx R$Y,u - bne RemVIRQ - bsr DelVIRQ -virqexit puls cc - clrb - rts + ifgt Level-2 +v.chk leay 4,y +RemVIRQ ldx ,y + else +RemVIRQ ldx ,y++ + endc + beq virqexit + cmpx R$Y,u + bne RemVIRQ + bsr DelVIRQ +virqexit puls cc + clrb + rts -DelVIRQ pshs x,y -DelVLup - IFGT Level-2 - ldq ,y++ move entries up in table - leay 2,y - stq -8,y - bne DelVLup - puls x,y,pc - ELSE - ldx ,y++ move entries up in table - stx -4,y - bne DelVLup - puls x,y - leay -2,y - rts - ENDC +DelVIRQ pshs x,y +DelVLup + ifgt Level-2 + ldq ,y++ move entries up in table + leay 2,y + stq -8,y + bne DelVLup + puls x,y,pc + else + ldx ,y++ move entries up in table + stx -4,y + bne DelVLup + puls x,y + leay -2,y + rts + endc *------------------------------------------------------------ * * Handle F$Alarm call * F.Alarm ldx #WGlobal+G.AlPckt - ldd R$D,u - bne DoAlarm - std G.AlPID-G.AlPckt,x Erase F$Alarm PID, Signal. - rts + ldd R$D,u + bne DoAlarm + std G.AlPID-G.AlPckt,x Erase F$Alarm PID, Signal. + rts -DoAlarm tsta If PID != 0, set alarm for this process - bne SetAlarm - cmpd #1 1 -> Set system-wide alarm - bne GetAlarm +DoAlarm tsta If PID != 0, set alarm for this process + bne SetAlarm + cmpd #1 1 -> Set system-wide alarm + bne GetAlarm SetAlarm std G.AlPID-G.AlPckt,x - ldy <D.Proc - lda P$Task,y Move from process task - ldb <D.SysTsk To system task - ldx R$X,u From address given in X + ldy <D.Proc + lda P$Task,y Move from process task + ldb <D.SysTsk To system task + ldx R$X,u From address given in X ldu #WGlobal+G.AlPckt - ldy #5 Move 5 bytes - bra FMove + ldy #5 Move 5 bytes + bra FMove -GetAlarm cmpd #2 - bne AlarmErr +GetAlarm cmpd #2 + bne AlarmErr ldd G.AlPID-G.AlPckt,x - std R$D,u - bra RetTime -AlarmErr comb - ldb #E$IllArg - rts + std R$D,u + bra RetTime +AlarmErr comb + ldb #E$IllArg + rts *------------------------------------------------------------ * @@ -382,12 +382,12 @@ * F.Time ldx #D.Time Address of system time packet RetTime ldy <D.Proc Get pointer to current proc descriptor - ldb P$Task,y Process Task number + ldb P$Task,y Process Task number lda <D.SysTsk From System Task - ldu R$X,u + ldu R$X,u STime.Mv ldy #6 Move 6 bytes -FMove os9 F$Move - rts +FMove os9 F$Move + rts *------------------------------------------------------------ * @@ -396,23 +396,23 @@ * First, copy time packet from user address space to system time * variables, then fall through to code to update RTC. * -F.STime ldx <D.Proc Caller's process descriptor - lda P$Task,x Source is in user map - ldx R$X,u Address of caller's time packet - ldu #D.Time Destination address - ldb <D.SysTsk Destination is in system map - bsr STime.Mv Get time packet (ignore errors) - lda #TkPerSec Reset to start of second - sta <D.Tick +F.STime ldx <D.Proc Caller's process descriptor + lda P$Task,x Source is in user map + ldx R$X,u Address of caller's time packet + ldu #D.Time Destination address + ldb <D.SysTsk Destination is in system map + bsr STime.Mv Get time packet (ignore errors) + lda #TkPerSec Reset to start of second + sta <D.Tick * * Call SetTime entry point in Clock2 - ldx <D.Clock2 get entry point to Clock2 - jsr $06,x else call GetTime entry point + ldx <D.Clock2 get entry point to Clock2 + jsr $06,x else call GetTime entry point -NoSet rts +NoSet rts -Clock2 fcs "Clock2" +Clock2 fcs "Clock2" *-------------------------------------------------- * @@ -424,68 +424,68 @@ * service code above to handle future F$STime calls. * * -Init ldx <D.Proc save user proc - pshs x - ldx <D.SysPrc make sys for link - stx <D.Proc +Init ldx <D.Proc save user proc + pshs x + ldx <D.SysPrc make sys for link + stx <D.Proc leax <Clock2,pcr lda #Systm+Objct - os9 F$Link + os9 F$Link * And here, we restore the original D.Proc value - puls x - stx <D.Proc restore user proc + puls x + stx <D.Proc restore user proc - bcc LinkOk - lda #E$MNF - jmp <D.Crash -LinkOk sty <D.Clock2 save entry point -InitCont ldx #PIA0Base point to PIA0 - clra no error for return... - pshs cc save IRQ enable status (and Carry clear) - orcc #IntMasks stop interrupts + bcc LinkOk + lda #E$MNF + jmp <D.Crash +LinkOk sty <D.Clock2 save entry point +InitCont ldx #PIA0Base point to PIA0 + clra no error for return... + pshs cc save IRQ enable status (and Carry clear) + orcc #IntMasks stop interrupts IFEQ TkPerSec-50 - ldb <D.VIDMD get video mode register copy - orb #$08 set 50 Hz VSYNC bit - stb <D.VIDMD save video mode register copy - stb >$FF98 set 50 Hz VSYNC - ENDC + ldb <D.VIDMD get video mode register copy + orb #$08 set 50 Hz VSYNC bit + stb <D.VIDMD save video mode register copy + stb >$FF98 set 50 Hz VSYNC + ENDC - sta 1,x enable DDRA - sta ,x set port A all inputs - sta 3,x enable DDRB - coma - sta 2,x set port B all outputs - ldd #$343C [A]=PIA0 CRA contents, [B]=PIA0 CRB contents - sta 1,x CA2 (MUX0) out low, port A, disable HBORD high-to-low IRQs - stb 3,x CB2 (MUX1) out low, port B, disable VBORD low-to-high IRQs - lda ,x clear possible pending PIA0 HBORD IRQ - lda 2,x clear possible pending PIA0 VBORD IRQ + sta 1,x enable DDRA + sta ,x set port A all inputs + sta 3,x enable DDRB + coma + sta 2,x set port B all outputs + ldd #$343C [A]=PIA0 CRA contents, [B]=PIA0 CRB contents + sta 1,x CA2 (MUX0) out low, port A, disable HBORD high-to-low IRQs + stb 3,x CB2 (MUX1) out low, port B, disable VBORD low-to-high IRQs + lda ,x clear possible pending PIA0 HBORD IRQ + lda 2,x clear possible pending PIA0 VBORD IRQ * Don't need to explicitly read RTC during initialization ldd #59*256+TkPerTS last second and time slice in minute - std <D.Sec Will prompt RTC read at next time slice + std <D.Sec Will prompt RTC read at next time slice - stb <D.TSlice set ticks per time slice - stb <D.Slice set first time slice + stb <D.TSlice set ticks per time slice + stb <D.Slice set first time slice leax SvcIRQ,pcr set IRQ handler - stx <D.IRQ + stx <D.IRQ leax SvcVIRQ,pcr set VIRQ handler - stx <D.VIRQ + stx <D.VIRQ leay NewSvc,pcr insert syscalls - os9 F$SSvc - lda <D.IRQER get shadow GIME IRQ enable register - ora #$08 set VBORD bit - sta <D.IRQER save shadow register - sta >IRQEnR enable GIME VBORD IRQs + os9 F$SSvc + lda <D.IRQER get shadow GIME IRQ enable register + ora #$08 set VBORD bit + sta <D.IRQER save shadow register + sta >IRQEnR enable GIME VBORD IRQs * Call Clock2 init routine - ldy <D.Clock2 get entry point to Clock2 - jsr ,y call init entry point of Clock2 -InitRts puls cc,pc recover IRQ enable status and return + ldy <D.Clock2 get entry point to Clock2 + jsr ,y call init entry point of Clock2 +InitRts puls cc,pc recover IRQ enable status and return - emod -len equ * - end + emod +len equ * + end
--- a/level2/modules/clock2.asm Tue Aug 19 04:21:47 2003 +0000 +++ b/level2/modules/clock2.asm Tue Aug 19 12:05:47 2003 +0000 @@ -9,56 +9,56 @@ * 1 2003/08/18 Boisy G. Pitre * Stripped from clock.asm in order to modularize clocks. - nam Clock2 + nam Clock2 ttl Real-Time Clock Subroutines - IFP1 - use defsfile - ENDC + ifp1 + use defsfile + endc * * Setup for specific RTC chip * - IFNE RTCDriveWire -RTC.Base equ $0000 - ENDC + IFNE RTCDriveWire +RTC.Base equ $0000 + ENDC - IFNE RTCElim -RTC.Sped equ $20 32.768 KHz, rate=0 -RTC.Strt equ $06 binary, 24 Hour, DST disabled -RTC.Stop equ $86 bit 7 set stops clock to allow setting time -RTC.Base equ $FF72 I don't know base for this chip. - ENDC + IFNE RTCElim +RTC.Sped equ $20 32.768 KHz, rate=0 +RTC.Strt equ $06 binary, 24 Hour, DST disabled +RTC.Stop equ $86 bit 7 set stops clock to allow setting time +RTC.Base equ $FF72 I don't know base for this chip. + ENDC - IFNE RTCDsto2+RTCDsto4 -RTC.Base equ $FF50 Base address of clock - ENDC + IFNE RTCDsto2+RTCDsto4 +RTC.Base equ $FF50 Base address of clock + ENDC - IFNE RTCBB+RTCTc3 - IFNE RTCBB -RTC.Base equ $FF5C In SCS* Decode - ELSE -RTC.Base equ $FF7C Fully decoded RTC - ENDC -RTC.Zero equ -4 Send zero bit by writing this offset -RTC.One equ -3 Send one bit by writing this offset -RTC.Read equ 0 Read data from this offset - ENDC + IFNE RTCBB+RTCTc3 + IFNE RTCBB +RTC.Base equ $FF5C In SCS* Decode + ELSE +RTC.Base equ $FF7C Fully decoded RTC + ENDC +RTC.Zero equ -4 Send zero bit by writing this offset +RTC.One equ -3 Send one bit by writing this offset +RTC.Read equ 0 Read data from this offset + ENDC - IFNE RTCSmart -RTC.Base equ $4004 We map the clock into this addr -RTC.Zero equ -4 Send zero bit by writing this offset -RTC.One equ -3 Send one bit by writing this offset -RTC.Read equ 0 Read data from this offset - ENDC + IFNE RTCSmart +RTC.Base equ $4004 We map the clock into this addr +RTC.Zero equ -4 Send zero bit by writing this offset +RTC.One equ -3 Send one bit by writing this offset +RTC.Read equ 0 Read data from this offset + ENDC - IFNE RTCHarrs -RTC.Base equ $FF60 Base address for clock - ENDC + IFNE RTCHarrs +RTC.Base equ $FF60 Base address for clock + ENDC - IFNE RTCSoft -RTC.Base equ 0 Have to have one defined. - ENDC + IFNE RTCSoft +RTC.Base equ 0 Have to have one defined. + ENDC *------------------------------------------------------------ * @@ -66,12 +66,12 @@ * mod len,name,Systm+Objct,ReEnt+0,JmpTable,RTC.Base -name fcs "Clock2" - fcb 1 +name fcs "Clock2" + fcb 1 - IFNE MPIFlag -SlotSlct fcb MPI.Slot-1 Slot constant for MPI select code - ENDC + IFNE MPIFlag +SlotSlct fcb MPI.Slot-1 Slot constant for MPI select code + ENDC * Jump table for RTC * @@ -79,12 +79,12 @@ * - Init * - SetTime * - GetTime -JmpTable - lbra Init - bra GetTime - nop - lbra SetTime - +JmpTable + lbra Init + bra GetTime + nop + lbra SetTime + * * GetTime Subroutine * @@ -94,161 +94,161 @@ * * Eliminator time update (lacks MPI slot select ability) * -GetTime equ * - IFNE RTCElim - ldx M$Mem,pcr get RTC base address from fake memory requirement - ldb #$0A UIP status register address - stb ,x generate address strobe - lda 1,x get UIP status - bpl NoUIP Update In Progress, go shift next RTC read +GetTime equ * + IFNE RTCElim + ldx M$Mem,pcr get RTC base address from fake memory requirement + ldb #$0A UIP status register address + stb ,x generate address strobe + lda 1,x get UIP status + bpl NoUIP Update In Progress, go shift next RTC read lda #TkPerSec/2 set up next RTC read attempt in 1/2 second - sta <D.Tick save tick - bra UpdTExit and return + sta <D.Tick save tick + bra UpdTExit and return -NoUIP decb year register address - stb ,x generate address strobe - lda 1,x get year - sta <D.Year - decb month register address - stb ,x - lda 1,x - sta <D.Month - decb day of month register address - stb ,x - lda 1,x - sta <D.Day - ldb #4 hour register address - stb ,x - lda 1,x - sta <D.Hour - ldb #2 minute register address - stb ,x - lda 1,x - sta <D.Min - clrb second register address - stb ,x - lda 1,x -SaveSec sta <D.Sec -UpdTExit rts - ENDC +NoUIP decb year register address + stb ,x generate address strobe + lda 1,x get year + sta <D.Year + decb month register address + stb ,x + lda 1,x + sta <D.Month + decb day of month register address + stb ,x + lda 1,x + sta <D.Day + ldb #4 hour register address + stb ,x + lda 1,x + sta <D.Hour + ldb #2 minute register address + stb ,x + lda 1,x + sta <D.Min + clrb second register address + stb ,x + lda 1,x +SaveSec sta <D.Sec +UpdTExit rts + ENDC * * Disto 2-in-1 RTC time update * - IFNE RTCDsto2 + IFNE RTCDsto2 pshs a,cc Save old interrupt status and mask IRQs - bsr RTCPre + bsr RTCPre - bsr GetVal Get Year - bsr GetVal Get Month - bsr GetVal Get Day - decb ldb #5 - stb 2,x - decb - lda ,x - anda #3 - bsr GetVal1 Get Hour - bsr GetVal Get Minute - bsr GetVal Get Second + bsr GetVal Get Year + bsr GetVal Get Month + bsr GetVal Get Day + decb ldb #5 + stb 2,x + decb + lda ,x + anda #3 + bsr GetVal1 Get Hour + bsr GetVal Get Minute + bsr GetVal Get Second -RTCPost clr >$FFD9 2 MHz (Really should check $A0 first) - puls cc,b +RTCPost clr >$FFD9 2 MHz (Really should check $A0 first) + puls cc,b - IFNE MPIFlag + IFNE MPIFlag stb >MPI.Slct Restore saved "currently" selected MPak slot - ENDC + ENDC - clrb - rts + clrb + rts -RTCPre orcc #IntMasks +RTCPre orcc #IntMasks - IFNE MPIFlag + IFNE MPIFlag ldb >MPI.Slct Save currently selected MPak slot on stack - stb 3,s - andb #$F0 + stb 3,s + andb #$F0 orb >SlotSlct,pcr Get slot to select - stb >MPI.Slct Select MPak slot for clock - ENDC + stb >MPI.Slct Select MPak slot for clock + ENDC - ldy #D.Time - ldx M$Mem,pcr - clr 1,x - ldb #12 - clr >$FFD8 1 MHz - rts + ldy #D.Time + ldx M$Mem,pcr + clr 1,x + ldb #12 + clr >$FFD8 1 MHz + rts -GetVal stb 2,x - decb - lda ,x read tens digit from clock - anda #$0f -GetVal1 pshs b save b - ldb #10 - mul multiply by 10 to get value - stb ,y save 10s value - puls b set up clock for ones digit - stb 2,x - decb - lda ,x read ones digit from clock - anda #$0f - adda ,y add ones + tens - sta ,y+ store clock value into time packet - rts +GetVal stb 2,x + decb + lda ,x read tens digit from clock + anda #$0f +GetVal1 pshs b save b + ldb #10 + mul multiply by 10 to get value + stb ,y save 10s value + puls b set up clock for ones digit + stb 2,x + decb + lda ,x read ones digit from clock + anda #$0f + adda ,y add ones + tens + sta ,y+ store clock value into time packet + rts - ENDC + ENDC * * Disto 4-in-1 RTC time update * - IFNE RTCDsto4 - IFNE MPIFlag - pshs cc Save old interrupt status and mask IRQs - orcc #IntMasks + IFNE RTCDsto4 + IFNE MPIFlag + pshs cc Save old interrupt status and mask IRQs + orcc #IntMasks ldb >MPI.Slct Save currently selected MPak slot on stack - pshs b - andb #$F0 + pshs b + andb #$F0 orb >SlotSlct,pcr Select MPak slot for clock - stb >MPI.Slct - ENDC + stb >MPI.Slct + ENDC - ldx M$Mem,pcr + ldx M$Mem,pcr ldy #D.Time Start with seconds - - ldb #11 - bsr GetVal Get Year - bsr GetVal Get Month - bsr GetVal Get Day - lda #3 Mask tens digit of hour to remove AM/PM bit - bsr GetVal1 Get Hour - bsr GetVal Get Minute - bsr GetVal Get Second + + ldb #11 + bsr GetVal Get Year + bsr GetVal Get Month + bsr GetVal Get Day + lda #3 Mask tens digit of hour to remove AM/PM bit + bsr GetVal1 Get Hour + bsr GetVal Get Minute + bsr GetVal Get Second - IFNE MPIFlag - puls b Restore saved "currently" selected MPak slot - stb >MPI.Slct - puls cc,pc Restore previous IRQ status - ELSE - rts No MPI, don't need to mess with slot, CC - ENDC + IFNE MPIFlag + puls b Restore saved "currently" selected MPak slot + stb >MPI.Slct + puls cc,pc Restore previous IRQ status + ELSE + rts No MPI, don't need to mess with slot, CC + ENDC -GetVal lda #$0f Mask to apply to tens digit -GetVal1 stb 1,x - decb - anda ,x read ones digit from clock - pshs b save b - ldb #10 - mul multiply by 10 to get value - stb ,y Add to ones digit - puls b - stb 1,x - decb - lda ,x read tens digit from clock and mask it - anda #$0f - adda ,y - sta ,y+ - rts +GetVal lda #$0f Mask to apply to tens digit +GetVal1 stb 1,x + decb + anda ,x read ones digit from clock + pshs b save b + ldb #10 + mul multiply by 10 to get value + stb ,y Add to ones digit + puls b + stb 1,x + decb + lda ,x read tens digit from clock and mask it + anda #$0f + adda ,y + sta ,y+ + rts - ENDC + ENDC * @@ -256,330 +256,330 @@ * IFNE RTCDriveWire - bra DoDW + bra DoDW use bbwrite.asm -DoDW pshs y,x,cc - lda #'# Time packet - orcc #IntMasks Disable interrupts - lbsr SerWrite - bsr SerRead Read year byte - bcs UpdLeave - sta <D.Year - bsr SerRead Read month byte - bcs UpdLeave - sta <D.Month - bsr SerRead Read day byte - bcs UpdLeave - sta <D.Day - bsr SerRead Read hour byte - bcs UpdLeave - sta <D.Hour - bsr SerRead Read minute byte - bcs UpdLeave - sta <D.Min - bsr SerRead Read second byte - bcs UpdLeave - sta <D.Sec - bsr SerRead Read day of week (0-6) byte +DoDW pshs y,x,cc + lda #'# Time packet + orcc #IntMasks Disable interrupts + lbsr SerWrite + bsr SerRead Read year byte + bcs UpdLeave + sta <D.Year + bsr SerRead Read month byte + bcs UpdLeave + sta <D.Month + bsr SerRead Read day byte + bcs UpdLeave + sta <D.Day + bsr SerRead Read hour byte + bcs UpdLeave + sta <D.Hour + bsr SerRead Read minute byte + bcs UpdLeave + sta <D.Min + bsr SerRead Read second byte + bcs UpdLeave + sta <D.Sec + bsr SerRead Read day of week (0-6) byte UpdLeave puls cc,x,y,pc use bbread.asm - ENDC + ENDC * * Update time from B&B RTC * IFNE RTCBB+RTCTc3 - pshs u,y,cc - leay ReadBCD,pcr Read bytes of clock + pshs u,y,cc + leay ReadBCD,pcr Read bytes of clock TfrTime orcc #IntMasks turn off interrupts ldu M$Mem,pcr Get base address - IFNE MPIFlag + IFNE MPIFlag ldb >MPI.Slct Select slot - pshs b - andb #$F0 + pshs b + andb #$F0 orb SlotSlct,pcr - stb >MPI.Slct - ENDC + stb >MPI.Slct + ENDC - lbsr SendMsg Initialize clock - ldx #D.Sec - ldb #8 Tfr 8 bytes + lbsr SendMsg Initialize clock + ldx #D.Sec + ldb #8 Tfr 8 bytes -tfrloop jsr ,y Tfr 1 byte +tfrloop jsr ,y Tfr 1 byte - bitb #$03 - beq skipstuf Skip over day-of-week, etc. - leax -1,x -skipstuf decb - bne tfrloop + bitb #$03 + beq skipstuf Skip over day-of-week, etc. + leax -1,x +skipstuf decb + bne tfrloop - IFNE MPIFlag - puls b - stb >MPI.Slct restore MPAK slot - ENDC + IFNE MPIFlag + puls b + stb >MPI.Slct restore MPAK slot + ENDC - puls u,y,cc,pc + puls u,y,cc,pc ClkMsg fcb $C5,$3A,$A3,$5C,$C5,$3A,$A3,$5C * Enable clock with message $C53AA35CC53AA35C -SendMsg lda RTC.Read,u Send Initialization message to clock +SendMsg lda RTC.Read,u Send Initialization message to clock leax <ClkMsg,pcr - ldb #8 -msgloop lda ,x+ - bsr SendByte - decb - bne msgloop - rts + ldb #8 +msgloop lda ,x+ + bsr SendByte + decb + bne msgloop + rts SendBCD pshs b Send byte to clock, first converting to BCD - bitb #$03 + bitb #$03 bne BCDskip Send zero for day-of-week, etc. - lda #0 - bra SndBCDGo -BCDskip lda ,x -SndBCDGo tfr a,b - bra binenter -binloop adda #6 -binenter subb #10 - bhs binloop - puls b + lda #0 + bra SndBCDGo +BCDskip lda ,x +SndBCDGo tfr a,b + bra binenter +binloop adda #6 +binenter subb #10 + bhs binloop + puls b SendByte coma Send one byte to clock - rora - bcc sendone + rora + bcc sendone sendzero tst RTC.Zero,u - lsra - bcc sendone - bne sendzero - rts -sendone tst RTC.One,u - lsra - bcc sendone - bne sendzero - rts + lsra + bcc sendone + bne sendzero + rts +sendone tst RTC.One,u + lsra + bcc sendone + bne sendzero + rts -ReadBCD pshs b - ldb #$80 High bit will rotate out after we read 8 bits -readbit lda RTC.Read,u Read a bit - lsra - rorb Shift it into B - bcc readbit Stop when marker bit appears - tfr b,a - bra BCDEnter Convert BCD number to Binary -BCDLoop subb #6 by subtracting 6 for each $10 -BCDEnter suba #$10 - bhs BCDLoop - stb ,x - puls b,pc +ReadBCD pshs b + ldb #$80 High bit will rotate out after we read 8 bits +readbit lda RTC.Read,u Read a bit + lsra + rorb Shift it into B + bcc readbit Stop when marker bit appears + tfr b,a + bra BCDEnter Convert BCD number to Binary +BCDLoop subb #6 by subtracting 6 for each $10 +BCDEnter suba #$10 + bhs BCDLoop + stb ,x + puls b,pc - ENDC + ENDC * * Update time from Smartwatch RTC * - IFNE RTCSmart - pshs cc - orcc #IntMasks Disable interrupts - lda >MPI.Slct Get MPI slot - ldb <$90 Get GIME shadow of $FF90 - pshs b,a - anda #$F0 + IFNE RTCSmart + pshs cc + orcc #IntMasks Disable interrupts + lda >MPI.Slct Get MPI slot + ldb <$90 Get GIME shadow of $FF90 + pshs b,a + anda #$F0 ora >SlotSlct,pcr Get new slot to select - anda #$03 *** TEST *** - sta >MPI.Slct And select it - andb #$FC - stb >$FF90 ROM mapping = 16k internal, 16k external - ldb >$FFA2 Read GIME for $4000-$5fff - pshs b - lda #$3E - sta >$FFA2 Put block $3E at $4000-$5fff - clr >$FFDE Map RAM/ROM, to map in external ROM - lbsr SendMsg Initialize clock - ldx #D.Sec Start with seconds - lda #$08 - sta ,-s Set up loop counter = 8 -L021E ldb #$08 -L0220 lda >RTC.Read+RTC.Base Read one bit - lsra - ror ,x Put bit into time - decb End of bit loop - bne L0220 - lda ,s Check loop counter - cmpa #$08 - beq L023D Fill "seconds" twice (ignore 1st value) - cmpa #$04 - bne L0239 - ldb ,x Save 4th value read at $34 (day of week?) - stb $0A,x - bra L023D And overwrite "day" with day -L0239 leax -$01,x Go to next time to read - bsr BCD2Dec Convert 1,x from BCD to decimal -L023D dec ,s - bne L021E End of loop for reading time - leas $01,s Done with loop counter - clr >$FFDF Map all RAM - puls b - stb >$FFA2 Put back original memory block - puls b,a - sta >MPI.Slct - stb >$FF90 Restore original ROM mapping - puls cc,pc Re-enable interrupts + anda #$03 *** TEST *** + sta >MPI.Slct And select it + andb #$FC + stb >$FF90 ROM mapping = 16k internal, 16k external + ldb >$FFA2 Read GIME for $4000-$5fff + pshs b + lda #$3E + sta >$FFA2 Put block $3E at $4000-$5fff + clr >$FFDE Map RAM/ROM, to map in external ROM + lbsr SendMsg Initialize clock + ldx #D.Sec Start with seconds + lda #$08 + sta ,-s Set up loop counter = 8 +L021E ldb #$08 +L0220 lda >RTC.Read+RTC.Base Read one bit + lsra + ror ,x Put bit into time + decb End of bit loop + bne L0220 + lda ,s Check loop counter + cmpa #$08 + beq L023D Fill "seconds" twice (ignore 1st value) + cmpa #$04 + bne L0239 + ldb ,x Save 4th value read at $34 (day of week?) + stb $0A,x + bra L023D And overwrite "day" with day +L0239 leax -$01,x Go to next time to read + bsr BCD2Dec Convert 1,x from BCD to decimal +L023D dec ,s + bne L021E End of loop for reading time + leas $01,s Done with loop counter + clr >$FFDF Map all RAM + puls b + stb >$FFA2 Put back original memory block + puls b,a + sta >MPI.Slct + stb >$FF90 Restore original ROM mapping + puls cc,pc Re-enable interrupts * Convert BCD to a normal number -BCD2Dec lda $01,x - clrb -B2DLoop cmpa #$10 - bcs B2DDone - suba #$10 - addb #$0A - bra B2DLoop -B2DDone pshs a - addb ,s+ - stb $01,x - rts +BCD2Dec lda $01,x + clrb +B2DLoop cmpa #$10 + bcs B2DDone + suba #$10 + addb #$0A + bra B2DLoop +B2DDone pshs a + addb ,s+ + stb $01,x + rts ClkMsg fcb $C5,$3A,$A3,$5C,$C5,$3A,$A3,$5C * Send above "string" to smartwatch, one bit at a time SendMsg leax <ClkMsg,pcr - lda >RTC.Read+RTC.Base Tell clock we're going to start??? - lda #$08 - sta ,-s Store counter = 8 -L006B ldb #$08 Start of outer loop, 8 bytes to send - lda ,x+ Get byte to send -L006F lsra Start of inner loop, 8 bits to send - bcs L0077 - tst >RTC.Zero+RTC.Base Send a "zero" bit - bra L007A -L0077 tst >RTC.One+RTC.Base Send a "one" bit -L007A decb - bne L006F End of inner loop - dec ,s End of outer loop - bne L006B - puls pc,a + lda >RTC.Read+RTC.Base Tell clock we're going to start??? + lda #$08 + sta ,-s Store counter = 8 +L006B ldb #$08 Start of outer loop, 8 bytes to send + lda ,x+ Get byte to send +L006F lsra Start of inner loop, 8 bits to send + bcs L0077 + tst >RTC.Zero+RTC.Base Send a "zero" bit + bra L007A +L0077 tst >RTC.One+RTC.Base Send a "one" bit +L007A decb + bne L006F End of inner loop + dec ,s End of outer loop + bne L006B + puls pc,a - ENDC + ENDC * * Update time from Harris RTC * - IFNE RTCHarrs - pshs cc - orcc #IntMasks Disable interrupts + IFNE RTCHarrs + pshs cc + orcc #IntMasks Disable interrupts - ldu M$Mem,pcr Get base address - ldy #D.Time Pointer to time in system map + ldu M$Mem,pcr Get base address + ldy #D.Time Pointer to time in system map - lda #%00001100 Init command register (Normal,Int. Disabled, - sta $11,u Run,24-hour mode, 32kHz) + lda #%00001100 Init command register (Normal,Int. Disabled, + sta $11,u Run,24-hour mode, 32kHz) - lda ,u Read base address to set-up clock regs for read - lda 6,u Get year - sta ,y+ - lda 4,u Get month - sta ,y+ - lda 5,u Get day - sta ,y+ - lda 1,u Get hour - sta ,y+ - lda 2,u Get minute - sta ,y+ - lda 3,u Get second - sta ,y+ + lda ,u Read base address to set-up clock regs for read + lda 6,u Get year + sta ,y+ + lda 4,u Get month + sta ,y+ + lda 5,u Get day + sta ,y+ + lda 1,u Get hour + sta ,y+ + lda 2,u Get minute + sta ,y+ + lda 3,u Get second + sta ,y+ - puls cc,pc Re-enable interrupts - ENDC + puls cc,pc Re-enable interrupts + ENDC * * * Software time update * * - IFNE RTCSoft - lda <D.Min grab current minute - inca minute+1 - cmpa #60 End of hour? - blo UpdMin no, Set start of minute - ldd <D.Day get day, hour - incb hour+1 - cmpb #24 End of Day? - blo UpdHour ..no - inca day+1 + IFNE RTCSoft + lda <D.Min grab current minute + inca minute+1 + cmpa #60 End of hour? + blo UpdMin no, Set start of minute + ldd <D.Day get day, hour + incb hour+1 + cmpb #24 End of Day? + blo UpdHour ..no + inca day+1 leax months-1,pcr point to months table with offset-1: Jan = +1 - ldb <D.Month this month - cmpa b,x end of month? - bls UpdDay ..no, update the day - cmpb #2 yes, is it Feb? - bne NoLeap ..no, ok - ldb <D.Year else get year - andb #$03 check for leap year: good until 2099 - cmpd #$1D00 29th on leap year? - beq UpdDay ..yes, skip it -NoLeap ldd <D.Year else month+1 - incb month+1 - cmpb #13 end of year? - blo UpdMonth ..no - inca year+1 - ldb #$01 set month to jan -UpdMonth std <D.Year save year, month - lda #$01 day=1st -UpdDay clrb hour=midnite -UpdHour std <D.Day save day,hour - clra minute=00 -UpdMin clrb seconds=00 - std <D.Min save min,secs -UpdTExit rts - ENDC + ldb <D.Month this month + cmpa b,x end of month? + bls UpdDay ..no, update the day + cmpb #2 yes, is it Feb? + bne NoLeap ..no, ok + ldb <D.Year else get year + andb #$03 check for leap year: good until 2099 + cmpd #$1D00 29th on leap year? + beq UpdDay ..yes, skip it +NoLeap ldd <D.Year else month+1 + incb month+1 + cmpb #13 end of year? + blo UpdMonth ..no + inca year+1 + ldb #$01 set month to jan +UpdMonth std <D.Year save year, month + lda #$01 day=1st +UpdDay clrb hour=midnite +UpdHour std <D.Day save day,hour + clra minute=00 +UpdMin clrb seconds=00 + std <D.Min save min,secs +UpdTExit rts + ENDC -months fcb 31,28,31,30,31,30,31,31,30,31,30,31 Days in each month +months fcb 31,28,31,30,31,30,31,31,30,31,30,31 Days in each month -SetTime equ * +SetTime equ * * * Set Eliminator RTC from D.Time * - IFNE RTCElim - pshs cc save interrupt status - orcc #IntMasks disable IRQs - ldx M$Mem,pcr get RTC base address from fake memory requirement - ldy #D.Time point [Y] to time variables in DP + IFNE RTCElim + pshs cc save interrupt status + orcc #IntMasks disable IRQs + ldx M$Mem,pcr get RTC base address from fake memory requirement + ldy #D.Time point [Y] to time variables in DP ldd #$0B*256+RTC.Stop - bsr UpdatCk0 stop clock before setting it - ldb #RTC.Sped - bsr UpdatCk0 set crystal speed, output rate - bsr UpdatClk go set year - bsr UpdatClk go set month - bsr UpdatClk go set day of month - bsr UpdatCk0 go set day of week (value doesn't matter) - bsr UpdatCk0 go set hours alarm (value doesn't matter) - bsr UpdatClk go set hour - bsr UpdatCk0 go set minutes alarm (value doesn't matter) - bsr UpdatClk go set minute - bsr UpdatCk0 go set seconds alarm (value doesn't matter) - bsr UpdatClk go set second + bsr UpdatCk0 stop clock before setting it + ldb #RTC.Sped + bsr UpdatCk0 set crystal speed, output rate + bsr UpdatClk go set year + bsr UpdatClk go set month + bsr UpdatClk go set day of month + bsr UpdatCk0 go set day of week (value doesn't matter) + bsr UpdatCk0 go set hours alarm (value doesn't matter) + bsr UpdatClk go set hour + bsr UpdatCk0 go set minutes alarm (value doesn't matter) + bsr UpdatClk go set minute + bsr UpdatCk0 go set seconds alarm (value doesn't matter) + bsr UpdatClk go set second ldd #$0B*256+RTC.Strt - bsr UpdatCk0 go start clock - puls cc Recover IRQ status - clrb - rts + bsr UpdatCk0 go start clock + puls cc Recover IRQ status + clrb + rts -UpdatClk ldb ,y+ get data from D.Time variables in DP -UpdatCk0 std ,x generate address strobe, save data - deca set [A] to next register down - rts +UpdatClk ldb ,y+ get data from D.Time variables in DP +UpdatCk0 std ,x generate address strobe, save data + deca set [A] to next register down + rts NewSvc fcb F$NVRAM Eliminator adds one new service call fdb F.NVRAM-*-2 - fcb $80 end of service call installation table + fcb $80 end of service call installation table *------------------------------------------------------------ * read/write RTC Non Volatile RAM (NVRAM) @@ -597,57 +597,57 @@ * [B] = error code F.NVRAM tfr u,y copy caller's register stack pointer ldd #$0100 ask for one page - os9 F$SRqMem + os9 F$SRqMem bcs NVR.Exit go report error... - pshs y,u save caller's stack and data buffer pointers + pshs y,u save caller's stack and data buffer pointers ldx R$Y,y get NVRAM start address - cmpx #50 too high? + cmpx #50 too high? bhs Arg.Err yes, go return error... ldb R$B,y get NVRAM byte count - beq Arg.Err - abx check end address - cmpx #50 too high? + beq Arg.Err + abx check end address + cmpx #50 too high? bhi Arg.Err yes, go return error... lda R$A,y get direction flag - cmpa #WRITE. put caller's data into NVRAM? + cmpa #WRITE. put caller's data into NVRAM? bne ChkRead no, go check if read... - clra [D]=byte count - pshs d save it... + clra [D]=byte count + pshs d save it... ldx <D.Proc get caller's process descriptor address lda P$Task,x caller is source task ldb <D.SysTsk system is destination task ldx R$X,y get caller's source pointer - puls y recover byte count + puls y recover byte count os9 F$Move go MOVE data - bcs NVR.Err + bcs NVR.Err ldy ,s get caller's register stack pointer from stack lda R$Y+1,y get NVRAM start address - adda #$0E add offset to first RTC NVRAM address + adda #$0E add offset to first RTC NVRAM address ldb R$B,y get byte count ldx M$Mem,pcr get clock base address from fake memory requirement - pshs cc,b save IRQ enable status and byte counter - orcc #IntMasks disable IRQs + pshs cc,b save IRQ enable status and byte counter + orcc #IntMasks disable IRQs WrNVR.Lp ldb ,u+ get caller's data std ,x generate RTC address strobe and save data to NVRAM inca next NVRAM address dec 1,s done yet? bne WrNVR.Lp no, go save another byte - puls cc,b recover IRQ enable status and clean up stack -NVR.RtM puls y,u recover register stack & data buffer pointers + puls cc,b recover IRQ enable status and clean up stack +NVR.RtM puls y,u recover register stack & data buffer pointers ldd #$0100 return one page - os9 F$SRtMem -NVR.Exit rts + os9 F$SRtMem +NVR.Exit rts -Arg.Err ldb #E$IllArg Illegal Argument error - bra NVR.Err +Arg.Err ldb #E$IllArg Illegal Argument error + bra NVR.Err -ChkRead cmpa #READ. return NVRAM data to caller? +ChkRead cmpa #READ. return NVRAM data to caller? bne Arg.Err illegal access mode, go return error... lda R$Y+1,y get NVRAM start address - adda #$0E add offset to first RTC NVRAM address + adda #$0E add offset to first RTC NVRAM address ldx M$Mem,pcr get clock base address from fake memory requirement - pshs cc,b save IRQ enable status and byte counter - orcc #IntMasks disable IRQs + pshs cc,b save IRQ enable status and byte counter + orcc #IntMasks disable IRQs RdNVR.Lp sta ,x generate RTC address strobe ldb 1,x get NVRAM data stb ,u+ save it to buffer @@ -658,178 +658,174 @@ ldb R$B,y [D]=byte count pshs d save it... ldx <D.Proc get caller's process descriptor address - ldb P$Task,x caller is source task + ldb P$Task,x caller is source task lda <D.SysTsk system is destination task ldu R$X,y get caller's source pointer puls y recover byte count ldx 2,s get data buffer (source) pointer os9 F$Move go MOVE data - bcc NVR.RtM -NVR.Err puls y,u recover caller's stack and data pointers - pshs b save error code + bcc NVR.RtM +NVR.Err puls y,u recover caller's stack and data pointers + pshs b save error code ldd #$0100 return one page - os9 F$SRtMem - comb set Carry for error - puls b,pc recover error code, return... + os9 F$SRtMem + comb set Carry for error + puls b,pc recover error code, return... - ENDC + ENDC * * Set Disto 2-in-1 RTC from Time variables * - IFNE RTCDsto2 - pshs a,cc - lbsr RTCPre Initialize + IFNE RTCDsto2 + pshs a,cc + lbsr RTCPre Initialize - bsr SetVal Set Year - bsr SetVal Set Month - bsr SetVal Set Day - ldd #$0805 $08 in A, $05 in B - bsr SetVal1 Set Hour (OR value in A ($08) with hour) - bsr SetVal Set Minute - bsr SetVal Set Second + bsr SetVal Set Year + bsr SetVal Set Month + bsr SetVal Set Day + ldd #$0805 $08 in A, $05 in B + bsr SetVal1 Set Hour (OR value in A ($08) with hour) + bsr SetVal Set Minute + bsr SetVal Set Second - lbra RTCPost Clean up + return + lbra RTCPost Clean up + return -SetVal clra -SetVal1 stb 2,x Set Clock address - decb - pshs b - ldb ,y+ Get current value -DvLoop subb #10 Get Tens digit in A, ones digit in B - bcs DvDone - inca - bra DvLoop -DvDone addb #10 - sta ,x Store tens digit - tfr b,a - puls b Get back original clock address - stb 2,x - decb - sta ,x Store ones digit - rts - ENDC +SetVal clra +SetVal1 stb 2,x Set Clock address + decb + pshs b + ldb ,y+ Get current value +DvLoop subb #10 Get Tens digit in A, ones digit in B + bcs DvDone + inca + bra DvLoop +DvDone addb #10 + sta ,x Store tens digit + tfr b,a + puls b Get back original clock address + stb 2,x + decb + sta ,x Store ones digit + rts + ENDC * * Set Disto 4-in-1 RTC from Time variables * - IFNE RTCDsto4 - pshs cc - orcc #IntMasks + IFNE RTCDsto4 + pshs cc + orcc #IntMasks - IFNE MPIFlag - ldb >MPI.Slct Save currently selected MPak slot - pshs b - andb #$F0 + IFNE MPIFlag + ldb >MPI.Slct Save currently selected MPak slot + pshs b + andb #$F0 orb >SlotSlct,pcr Get slot to select - stb >MPI.Slct Select MPak slot for clock - ENDC + stb >MPI.Slct Select MPak slot for clock + ENDC - ldy #D.Time+6 - ldx M$Mem,pcr - clrb - bsr SetVal Set Second - bsr SetVal Set Minute - bsr SetVal Set Hour - bsr SetVal Set Day - bsr SetVal Set Month - bsr SetVal Set Year + ldy #D.Time+6 + ldx M$Mem,pcr + clrb + bsr SetVal Set Second + bsr SetVal Set Minute + bsr SetVal Set Hour + bsr SetVal Set Day + bsr SetVal Set Month + bsr SetVal Set Year - IFNE MPIFlag - puls b Restore old MPAK slot - stb >MPI.Slct - ENDC + IFNE MPIFlag + puls b Restore old MPAK slot + stb >MPI.Slct + ENDC - puls cc - clrb No error - rts + puls cc + clrb No error + rts -SetVal clr ,-s Create variable for tens digit - lda ,-y Get current value -DvLoop suba #10 Get Tens digit on stack, ones digit in A - bcs DvDone - inc ,s - bra DvLoop -DvDone adda #10 - stb 1,x Set Clock address - incb - sta ,x Store ones digit - stb 1,x - incb - puls a - sta ,x Store tens digit - rts - ENDC +SetVal clr ,-s Create variable for tens digit + lda ,-y Get current value +DvLoop suba #10 Get Tens digit on stack, ones digit in A + bcs DvDone + inc ,s + bra DvLoop +DvDone adda #10 + stb 1,x Set Clock address + incb + sta ,x Store ones digit + stb 1,x + incb + puls a + sta ,x Store tens digit + rts + ENDC * * Set B&B RTC from Time variables * IFNE RTCBB+RTCTc3 - pshs u,y,cc - leay SendBCD,pcr Send bytes of clock - lbra TfrTime - ENDC - + pshs u,y,cc + leay SendBCD,pcr Send bytes of clock + lbra TfrTime + ENDC + * * Set Harris 1770 RTC from Time variables * - IFNE RTCHarrs - pshs cc - orcc #IntMasks Disable interrupts + IFNE RTCHarrs + pshs cc + orcc #IntMasks Disable interrupts - ldu M$Mem,pcr Get base address - ldy #D.Time Pointer to time in system map + ldu M$Mem,pcr Get base address + ldy #D.Time Pointer to time in system map - lda #%00000100 Init command register (Normal,Int. Disabled, - sta $11,u STOP clock,24-hour mode, 32kHz) + lda #%00000100 Init command register (Normal,Int. Disabled, + sta $11,u STOP clock,24-hour mode, 32kHz) - lda ,y+ Get year - sta 6,u - lda ,y+ Get month - sta 4,u - lda ,y+ Get day - sta 5,u - lda ,y+ Get hour - sta 1,u - lda ,y+ Get minute - sta 2,u - lda ,y Get second - sta 3,u + lda ,y+ Get year + sta 6,u + lda ,y+ Get month + sta 4,u + lda ,y+ Get day + sta 5,u + lda ,y+ Get hour + sta 1,u + lda ,y+ Get minute + sta 2,u + lda ,y Get second + sta 3,u - lda #%00001100 Init command register (Normal,Int. Disabled, - sta $11,u START clock,24-hour mode, 32kHz) + lda #%00001100 Init command register (Normal,Int. Disabled, + sta $11,u START clock,24-hour mode, 32kHz) - puls cc,pc Re-enable interrupts - ENDC + puls cc,pc Re-enable interrupts + ENDC * * RTC-specific initializations here * -Init equ * - IFNE RTCDsto4 +Init equ * + IFNE RTCDsto4 * Disto 4-N-1 RTC specific initialization - ldx M$Mem,pcr - ldd #$010F Set mode for RTC chip - stb 1,x - sta ,x - ldd #$0504 - sta ,x - stb ,x - ENDC + ldx M$Mem,pcr + ldd #$010F Set mode for RTC chip + stb 1,x + sta ,x + ldd #$0504 + sta ,x + stb ,x + ENDC - IFNE RTCElim -* Eliminator will install specific system calls to itself + IFNE RTCElim +* Eliminator will install specific system calls leay NewSvc,pcr insert syscalls - os9 F$SSvc - ENDC - - rts + os9 F$SSvc + ENDC -Term equ * - rts - + rts - emod -len equ * - end + emod +len equ * + end