changeset 54:fc10b7ae23d0

clock level2 worked
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 22 Jul 2018 19:41:06 +0900
parents fe88cea67ef0
children 8d151f303bee
files io.c os9/level1/clock.asm os9/level2/clock.asm
diffstat 3 files changed, 27 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/io.c	Sun Jul 22 17:55:06 2018 +0900
+++ b/io.c	Sun Jul 22 19:41:06 2018 +0900
@@ -405,9 +405,9 @@
         fcntl(0, F_SETFL, tflags | O_NDELAY); /* Make input from stdin non-blocking */
         signal(SIGALRM, timehandler);
         timercontrol.it_interval.tv_sec = 0;
-        timercontrol.it_interval.tv_usec = 200000;
+        timercontrol.it_interval.tv_usec = 2000000;
         timercontrol.it_value.tv_sec = 0;
-        timercontrol.it_value.tv_usec = 200000;
+        timercontrol.it_value.tv_usec = 2000000;
         if (timer)
             setitimer(ITIMER_REAL, &timercontrol, NULL);
 }
--- a/os9/level1/clock.asm	Sun Jul 22 17:55:06 2018 +0900
+++ b/os9/level1/clock.asm	Sun Jul 22 19:41:06 2018 +0900
@@ -48,7 +48,8 @@
          ldb   #$8f     start timer
          stb   ,x
 L00B4    
-         jmp   [>D.SvcIRQ]
+         jsr   [>D.SvcIRQ]
+         rti
 
 ClkEnt   equ   *
          ldd   #59*256+$01 last second and last tick
@@ -66,8 +67,8 @@
          leay  <SysTbl,pcr
          os9   F$SSvc
          ldx   #TimerPort
-*         ldb   #$8f     start timer
-*         stb   ,x
+         ldb   #$8f     start timer
+         stb   ,x
          puls  pc,cc
 
 * F$Time system call code
--- a/os9/level2/clock.asm	Sun Jul 22 17:55:06 2018 +0900
+++ b/os9/level2/clock.asm	Sun Jul 22 19:41:06 2018 +0900
@@ -42,12 +42,22 @@
          lda   ,x
          bita  #$10
          beq   L00AE
+L00AE    leax  ClockIRQ1,pcr
+         stx   <D.SvcIRQ
+         jmp   [D.XIRQ]   Chain through Kernel to continue IRQ handling
+ClockIRQ1
+         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
+VIRQend
+         ldx   #TimerPort
          lda   #$8f
          sta   >TimerPort
-L00AE    jsr   [>D.Poll]
-         bcc   L00AE
-L00B4    jsr   [>D.AltIRQ]
-         rti
+         jmp   [>D.Clock]
+
+TkPerTS  equ   2
 
 ClkEnt   equ   *
          pshs  cc
@@ -57,6 +67,13 @@
 * install system calls
          leay  >SysTbl,pcr
          os9   F$SSvc
+         ldd   #59*256+TkPerTS last second and time slice in minute
+         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
+         lda   #TkPerSec  Reset to start of second
+         sta   <D.Tick
+
          ldx   #TimerPort
          ldb   #$8f     start timer
          stb   ,x