changeset 2631:442795681807

o Fixed Atari SIO DWRead to timeout longer o Commented out call to InitVIRQ in dw3.sb for Atari due to issues o VTIO for Atari now properly handles IRQ shadow registers o Level 1 clock now merged to include Atari
author Boisy Pitre <boisy.pitre@nuance.com>
date Sun, 26 Feb 2012 21:39:44 -0600
parents e310e8613606
children 9356ea0bf67a
files level1/atari/bootfiles/makefile level1/atari/cmds/makefile level1/atari/makefile level1/atari/modules/clock.asm level1/atari/modules/dw3.asm level1/atari/modules/dwread.asm level1/atari/modules/makefile level1/atari/modules/vtio.asm level1/modules/clock.asm
diffstat 9 files changed, 67 insertions(+), 760 deletions(-) [+]
line wrap: on
line diff
--- a/level1/atari/bootfiles/makefile	Sun Feb 26 16:22:27 2012 -0600
+++ b/level1/atari/bootfiles/makefile	Sun Feb 26 21:39:44 2012 -0600
@@ -11,14 +11,13 @@
 BOOTFILE_P1 = $(MD)/krnp2 $(MD)/init \
 		$(MD)/ioman $(MD)/scf.mn $(MD)/vtio.dr $(MD)/term.dt \
 		$(MD)/sysgo \
-		$(MD)/clock_60hz $(MD)/clock2_soft \
+		$(MD)/clock_60hz $(MD)/clock2_dw3 \
 		$(MD)/krn
 
 BOOTFILE_P2 = $(MD)/rbf.mn $(MD)/rbdw3.dr \
-		$(MD)/x0.dd $(MD)/dw3.sb \
+		$(MD)/x0.dd $(MD)/x1.dd $(MD)/dw3.sb \
 		$(MD)/scdwp.dr $(MD)/p_scdwp.dd \
-		$(CD)/shell_21 $(CD)/dir \
-		$(CD)/mdir $(CD)/dump
+		$(CD)/shell_21 $(CD)/date
 
 BOOTFILES	= bootfile
 
@@ -33,6 +32,7 @@
 	$(PADROM) -b 12288 $@_p1
 	$(MERGE) $@_p2 $@_p1>$@
 	$(RM) $@_p2 $@_p1
+	$(PADROM) -b 32768 $@
 
 clean:
 	$(RM) $(ALLOBJS)
--- a/level1/atari/cmds/makefile	Sun Feb 26 16:22:27 2012 -0600
+++ b/level1/atari/cmds/makefile	Sun Feb 26 21:39:44 2012 -0600
@@ -10,16 +10,14 @@
 LFLAGS		+= -l=$(NITROS9DIR)/lib/net.l -l=$(NITROS9DIR)/lib/alib.l -l=$(NITROS9DIR)/lib/sys6809l1.l
 
 BASIC09FILES	= basic09.asm runb.asm gfx.asm inkey.asm syscall.asm
-CMDS		= asm attr backup binex build calldbg cmp cobbler copy cputype \
+CMDS		= asm attr backup binex build calldbg cmp copy cputype \
 		date dcheck debug ded deiniz del deldir devs dir dirsort disasm \
 		display dmode dsave dump echo edit error exbin format \
-		free grfdrv help ident iniz irqs link list load login makdir \
-		megaread mdir merge mfree mpi os9gen padrom park printerr procs prompt pwd pxd \
+		free help ident iniz irqs link list load login makdir \
+		megaread mdir merge mfree os9gen padrom park printerr procs prompt pwd pxd \
 		rename save setime shellplus shell_21 sleep \
-		tee tmode touch tsmon tuneport unlink verify xmode
-
-CMDS_D2		= basic09 runb gfx inkey syscall copy del echo format \
-		merge os9gen prompt tmode
+		tee tmode touch tsmon tuneport unlink verify xmode\
+          basic09 runb gfx inkey syscall 
 
 CMDS_DW		= inetd telnet dw
 
--- a/level1/atari/makefile	Sun Feb 26 16:22:27 2012 -0600
+++ b/level1/atari/makefile	Sun Feb 26 21:39:44 2012 -0600
@@ -53,19 +53,15 @@
 $(PACKAGENAME): $(DSKS) ../../ReadMe ../../ChangeLog
 	$(ARCHIVE) $@ $^
 
+#	$(OS9GEN) $@ -b=$(BOOTFILE)	
 $(DSK):
 	$(RM) $@
 	$(OS9FORMAT_DW3) -q $@ -n"NitrOS-9/$(CPU) Level 1"
-
-XX:
-	$(OS9GEN) $@ -b=$(BOOTFILE)	
 	$(MAKDIR) $@,CMDS
 	$(MAKDIR) $@,SYS
 	$(MAKDIR) $@,DEFS
-	$(CD) cmds; $(CP) $(CMDS_DW) ../$@,CMDS
-	$(foreach file, $(CMDS_DW), $(OS9ATTR_EXEC) $@,CMDS/$(file);)
-	$(CD) cmds; $(CP) $(CMDS_D2) ../$@,CMDS
-	$(foreach file, $(CMDS_D2), $(OS9ATTR_EXEC) $@,CMDS/$(file);)
+	$(CD) cmds; $(CP) $(CMDS) ../$@,CMDS
+	$(foreach file, $(CMDS), $(OS9ATTR_EXEC) $@,CMDS/$(file);)
 	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
 	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
 	$(foreach file, $(SYS), $(OS9ATTR_TEXT) $@,SYS/$(file);)
--- a/level1/atari/modules/clock.asm	Sun Feb 26 16:22:27 2012 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,259 +0,0 @@
-********************************************************************
-* Clock - NitrOS-9 System Clock for Atari XL/XE
-*
-* $Id$
-*
-* Edt/Rev  YYYY/MM/DD  Modified by
-* Comment
-* ------------------------------------------------------------------
-*   1      2012/02/22  Boisy G. Pitre
-* Created
- 
-         nam   Clock     
-         ttl   NitrOS-9 System Clock for Atari XL/XE
-                         
-         ifp1            
-         use   defsfile  
-         endc            
-                         
-tylg     set   Systm+Objct
-atrv     set   ReEnt+rev 
-rev      set   0
-edition  set   1         
-                         
-                         
-*------------------------------------------------------------
-*
-* Start of module
-*
-         mod   len,name,tylg,atrv,init,0
-                         
-name     fcs   "Clock"   
-         fcb   edition   
-                         
-                         
-TkPerTS  equ   TkPerSec/10 ticks per time slice
-                         
-*
-* Table to set up Service Calls
-*
-NewSvc   fcb   F$Time    
-         fdb   FTime-*-2 
-         fcb   F$VIRQ    
-         fdb   FVIRQ-*-2 
-         fcb   F$STime   
-         fdb   FSTime-*-2
-         fcb   $80        end of service call installation table
-                         
-                         
-*------------------------------------------------------------
-*
-* Handle F$STime system call
-*
-* First, copy time packet from user address space to system time
-* variables, then fall through to code to update RTC.
-*
-FSTime   equ   *         
-         ldx   R$X,u     
-         ldd   ,x        
-         std   <D.Year   
-         ldd   2,x       
-         std   <D.Day    
-         ldd   4,x       
-         std   <D.Min    
-         lda   #TkPerSec  reset to start of second
-         sta   <D.Tick   
-         ldx   <D.Clock2  get entry point to Clock2
-         clra             clear carry
-         jmp   $06,x      and call SetTime entry point
-                         
-                         
-*--------------------------------------------------
-*
-* Clock Initialization
-*
-* This vector is called by the kernel to service the first F$STime
-* call.  F$STime is usually called by SysGo (with a dummy argument)
-* in order to initialize the clock.  F$STime is re-vectored to the
-* service code above to handle future F$STime calls.
-*
-*
-                         
-Clock2   fcs   "Clock2"  
-                         
-init              
-         pshs  dp,cc      save DP and CC
-         clra            
-         tfr   a,dp       set DP to zero
-                         
-         leax  <Clock2,pcr
-         lda   #Sbrtn+Objct
-         os9   F$Link    
-                         
-         bcc   LinkOk    
-                         
-         jmp   >$FFFE     level 1: jump to reset vector
-                         
-LinkOk                   
-         puls  cc,dp      ; Restore saved dp and cc
-                         
-         sty   <D.Clock2  save entry point
-InitCont                 
-                         
-* Don't need to explicitly read RTC during initialization
-         ldd   #59*256+$01 last second and last tick
-         std   <D.Sec     will prompt RTC read at next time slice
-         ldb   #TkPerSec
-         stb   <D.TSec    set ticks per second
-         ldb   #TkPerTS   get ticks per time slice
-         stb   <D.TSlice  set ticks per time slice
-         stb   <D.Slice   set first time slice
-         leax  SvcIRQ,pcr set NMI handler
-         stx   <D.NMI    
-                         
-         leay  NewSvc,pcr insert syscalls
-         os9   F$SSvc    
-                         
-* Call Clock2 init routine
-         ldy   <D.Clock2  get entry point to Clock2
-         jsr   ,y         call init entry point of Clock2
-
-* Tell ANTIC to assert NMI on Vertical Blank
-     	lda     #$40
-     	sta     $D40E		enable VBlank NMI
-InitRts  rts
-                         
-*
-* Clock IRQ Entry Point
-*
-* Called once every 16.667 milliseconds
-SvcIRQ                   
-          clra            
-         tfr   a,dp       set direct page to zero
-          sta   $D40F     clear NMI interrupt
-*         tst   PIA0Base+3 get hw byte
-*         bmi   L0032      branch if sync flag on
-*         jmp   [>D.SvcIRQ] else service other possible IRQ
-L0032
-         dec   <D.Tick    decrement tick counter
-         bne   L007F      go around if not zero
-         ldb   <D.Sec     get minutes/seconds
-* Seconds increment
-         incb             increment seconds
-         cmpb  #60        full minute?
-         bcs   L0079      nope...
-*
-* Call GetTime entry point in Clock2
-*
-         ldx   <D.Clock2  get entry point to Clock2
-         jsr   $03,x      call GetTime entry point
-         fcb   $8C        skip next 2 bytes
-L0079    stb   <D.Sec     update sec
-L007B    lda   <D.TSec    get ticks per second value
-         sta   <D.Tick    and repopulate tick decrement counter
-L007F    clra             clear A
-         pshs  a          and save it on the stack
-         ldy   <D.CLTb    get pointer to VIRQ Polling Entries
-         bra   L009E      go to the processing portion of the loop
-L0087    ldd   Vi.Cnt,x   get count down counter
-         subd  #$0001     subtract tick count
-         bne   L009C      branch if not at terminal count ($0000)
-         lda   #$01      
-         sta   ,s         set flag on stack to 1
-         lda   Vi.Stat,x  get status byte
-         beq   DelEntry   branch if zero (one shot, so delete)
-L0096    ora   #Vi.IFlag  set interrupted flag
-         sta   Vi.Stat,x  save in packet
-         ldd   Vi.Rst,x   get reset count
-L009C    std   Vi.Cnt,x   save tick count back
-L009E    ldx   ,y++       get two bytes at Y
-         bne   L0087      if not zero, branch
-         lda   ,s+        else get byte off stack
-         beq   GoAltIRQ   branch if zero
-         ldx   <D.Proc    else get pointer to current process descriptor
-         beq   L00AE      branch if none
-         tst   P$State,x  test process' state
-         bpl   UsrPoll    branch if system state not set
-L00AE    jsr   [>D.Poll]  poll ISRs
-         bcc   L00AE      keep polling until carry set
-GoAltIRQ                 
-         jmp   [>D.AltIRQ] jump into an alternate IRQ if available
-DelEntry                 
-         bsr   DelVIRQ    delete the VIRQ entry
-         bra   L0096     
-                         
-UsrPoll  leay  >up@,pcr   point to routine to execute
-         jmp   [>D.URtoSs] User to System
-up@      jsr   [>D.Poll]  call polling routine
-         bcc   up@        keep polling until carry set
-         ldx   <D.Proc    get current process descriptor
-         ldb   P$State,x  and its state
-         andb  #^SysState turn off sysstate bit
-         stb   P$State,x  save new state
-         ldd   <P$SWI2,x 
-         std   <D.SWI2   
-         ldd   <D.UsrIRQ 
-         std   <D.SvcIRQ 
-         bra   GoAltIRQ  
-                         
-DelVIRQ  pshs  y,x        save off Y,X
-dl@      ldx   ,y++       get next entry
-         stx   -$04,y     move up
-         bne   dl@        continue until all are moved
-         puls  y,x        restore
-         leay  -2,y       move back 2 from Y (points to last entry)
-         rts              return
-                         
-* Install or Remove VIRQ Entry
-FVIRQ    pshs  cc        
-         orcc  #IntMasks  mask all interrupts
-         ldy   <D.CLTb    get pointer to VIRQ polling table
-         ldx   <D.Init    get pointer to init module
-         ldb   PollCnt,x  get poll count
-         ldx   R$X,u      get pointer to caller's X
-         beq   L0118      branch if removing
-         tst   ,y         entry available?
-         beq   L010C     
-         subb  #$02      
-         lslb            
-         leay  b,y       
-         tst   ,y        
-         bne   PTblFul    polling table full
-L0106    tst   ,--y      
-         beq   L0106     
-         leay  $02,y     
-L010C    ldx   R$Y,u     
-         stx   ,y        
-         ldy   R$D,u     
-         sty   ,x        
-         bra   L0124     
-L0118    leax  R$Y,u      X = caller's Y
-L011A    tst   ,y         end of VIRQ table
-         beq   L0124      branch if so
-         cmpx  ,y++       else compare to current VIRQ entry and inc Y
-         bne   L011A      continue searching if not matched
-         bsr   DelVIRQ    else delete entry
-L0124    puls  cc        
-         clrb            
-         rts             
-PTblFul  puls  cc        
-         comb            
-         ldb   #E$Poll   
-         rts             
-                         
-                         
-                         
-* F$Time system call code
-FTime    ldx   R$X,u     
-         ldd   <D.Year   
-         std   ,x        
-         ldd   <D.Day    
-         std   2,x       
-         ldd   <D.Min    
-         std   4,x       
-         clrb            
-         rts             
-                         
-         emod            
-len      equ   *         
-         end             
--- a/level1/atari/modules/dw3.asm	Sun Feb 26 16:22:27 2012 -0600
+++ b/level1/atari/modules/dw3.asm	Sun Feb 26 21:39:44 2012 -0600
@@ -139,9 +139,7 @@
                leax      ,s                  ; point X to stack head
                ldy       #1                  ; 1 byte to retrieve
                jsr       3,u                 ; call DWRead
-               IFNE      atari-1
-               beq       InstIRQ             ; branch if no error
-               ENDC
+*               beq       InstIRQ             ; branch if no error
                leas      3,s                 ; error, cleanup stack (u and 1 byte from read) 
                lbra      InitEx            	 ; don't install IRQ handler
 
--- a/level1/atari/modules/dwread.asm	Sun Feb 26 16:22:27 2012 -0600
+++ b/level1/atari/modules/dwread.asm	Sun Feb 26 21:39:44 2012 -0600
@@ -25,7 +25,6 @@
 * enable the serial input interrupt
           
           ldb       SERIN               read what is in the buffer
-
           lda	#$13
           sta	SKCTL
           sta	SKRES
@@ -34,16 +33,15 @@
 inloop@
           ora       #%00100000
           sta       IRQEN
-*          lda       1,s
+          lda       1,s
+          clrb
 loop@
-*          ldb       #2
-*loopin@
-*          decb
-*          bne       loopin@
-*          deca
-*          beq       outtahere@
+          subd      #$0001
+          beq       outtahere@
+          pshs      b
           ldb       IRQST
           bitb      #%00100000
+          puls      b
           bne       loop@
           ldb       SERIN
           lda       D.IRQENSHDW
@@ -58,6 +56,7 @@
           leay      -1,y
           bne       inloop@
           stx       4,s
+bye
           bsr       CleanUp
           puls      cc,a,x,y,u,pc
 outtahere@
--- a/level1/atari/modules/makefile	Sun Feb 26 16:22:27 2012 -0600
+++ b/level1/atari/modules/makefile	Sun Feb 26 21:39:44 2012 -0600
@@ -13,7 +13,7 @@
 BOOTERS		= 
 KERNEL		= krn krnp2
 SYSMODS		= ioman init sysgo
-CLOCKS      = clock_60hz clock_50hz clock2_soft
+CLOCKS      = clock_60hz clock_50hz clock2_soft clock2_dw3
 
 RBF		= rbf.mn rbdw3.dr ddx0.dd x0.dd x1.dd x2.dd x3.dd
 
--- a/level1/atari/modules/vtio.asm	Sun Feb 26 16:22:27 2012 -0600
+++ b/level1/atari/modules/vtio.asm	Sun Feb 26 21:39:44 2012 -0600
@@ -142,6 +142,11 @@
 
 * tell POKEY to enable keyboard scanning
 		lda	#%11000000
+		pshs	cc
+		orcc	#IntMasks
+		ora	D.IRQENSHDW
+		sta	D.IRQENSHDW
+		puls	cc
 		sta	IRQEN
 
 * clear carry and return
--- a/level1/modules/clock.asm	Sun Feb 26 16:22:27 2012 -0600
+++ b/level1/modules/clock.asm	Sun Feb 26 21:39:44 2012 -0600
@@ -1,10 +1,6 @@
 ********************************************************************
 * Clock - NitrOS-9 System Clock
 *
-* CoCo 3 notes:
-* Includes support for several different RTC chips, GIME Toggle
-* IRQ fix, numerous minor changes.
-*
 * $Id$
 *
 * Edt/Rev  YYYY/MM/DD  Modified by
@@ -46,9 +42,6 @@
                          
          ifp1            
          use   defsfile  
-         ifgt  Level-1   
-         use   cocovtio.d
-         endc            
          endc            
                          
 tylg     set   Systm+Objct
@@ -67,11 +60,7 @@
          fcb   edition   
                          
                          
-         ifeq  Level-1   
 TkPerTS  equ   TkPerSec/10 ticks per time slice
-         else            
-TkPerTS  equ   2          ticks per time slice
-         endc            
                          
 *
 * Table to set up Service Calls
@@ -80,15 +69,11 @@
          fdb   FTime-*-2 
          fcb   F$VIRQ    
          fdb   FVIRQ-*-2 
-         ifgt  Level-1   
-         fcb   F$Alarm   
-         fdb   FALARM-*-2
-         endc            
          fcb   F$STime   
          fdb   FSTime-*-2
          fcb   $80        end of service call installation table
-                         
-                         
+
+
 *------------------------------------------------------------
 *
 * Handle F$STime system call
@@ -97,14 +82,6 @@
 * variables, then fall through to code to update RTC.
 *
 FSTime   equ   *         
-         ifgt  Level-1   
-         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
-         lbsr  STime.Mv   get time packet (ignore errors)
-         else            
          ldx   R$X,u     
          ldd   ,x        
          std   <D.Year   
@@ -112,14 +89,12 @@
          std   <D.Day    
          ldd   4,x       
          std   <D.Min    
-         endc            
          lda   #TkPerSec  reset to start of second
          sta   <D.Tick   
          ldx   <D.Clock2  get entry point to Clock2
          clra             clear carry
          jmp   $06,x      and call SetTime entry point
                          
-                         
 *--------------------------------------------------
 *
 * Clock Initialization
@@ -133,56 +108,56 @@
                          
 Clock2   fcs   "Clock2"  
                          
-init                     
-         ifeq  Level-1   
+init
          pshs  dp,cc      save DP and CC
          clra            
          tfr   a,dp       set DP to zero
-         else            
-         ldx   <D.Proc    save user proc
-         pshs  x         
-         ldx   <D.SysPrc  make sys for link
-         stx   <D.Proc   
-         endc            
-                         
          leax  <Clock2,pcr
          lda   #Sbrtn+Objct
          os9   F$Link    
-                         
          bcc   LinkOk    
-                         
-         ifeq  Level-1   
          jmp   >$FFFE     level 1: jump to reset vector
-         else            
-         lda   #E$MNF    
-         jmp   <D.Crash   level 2: jump to CRASH vector
-         endc            
                          
 LinkOk                   
-         ifeq  Level-1   
          puls  cc,dp      ; Restore saved dp and cc
-         else            
-         puls  x         
-         stx   <D.Proc    restore user proc
-         endc            
-                         
          sty   <D.Clock2  save entry point
 InitCont                 
+* Do not need to explicitly read RTC during initialization
+         ldd   #59*256+$01 last second and last tick
+         std   <D.Sec     will prompt RTC read at next time slice
+         ldb   #TkPerSec
+         stb   <D.TSec    set ticks per second
+         ldb   #TkPerTS   get ticks per time slice
+         stb   <D.TSlice  set ticks per time slice
+         stb   <D.Slice   set first time slice
+         IFNE  atari
+* Atari gets its clock source from the NMI
+         leax  SvcIRQ,pcr set NMI handler
+         stx   <D.NMI    
+         ELSE
+         leax  SvcIRQ,pcr set IRQ handler
+         stx   <D.IRQ    
+         ENDC
+                         
+         leay  NewSvc,pcr insert syscalls
+         os9   F$SSvc    
+                         
+* Call Clock2 init routine
+         ldy   <D.Clock2  get entry point to Clock2
+         jsr   ,y         call init entry point of Clock2
+
+* Initialize clock hardware
+          IFNE atari
+* Atari - Tell ANTIC to assert NMI on Vertical Blank
+     	lda     #$40
+     	sta     $D40E		enable VBlank NMI
+          rts
+          ELSE
          ldx   #PIA0Base  point to PIA0
          clra             no error for return...
          pshs  cc         save IRQ enable status (and Carry clear)
          orcc  #IntMasks  stop interrupts
                          
-         ifgt  Level-1   
-* Note: this code can go away once we have a rel_50hz
-         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            
-         endc            
-                         
          sta   1,x        enable DDRA
          sta   ,x         set port A all inputs
          sta   3,x        enable DDRB
@@ -191,58 +166,15 @@
                          
 ;	ldd	#$343C		[A]=PIA0 CRA contents, [B]=PIA0 CRB contents
                          
-         ifgt  Level-1   
-         ldd   #$3434     as per Robert Gault's suggestion
-         else            
          ldd   #$3435     IRQ needs to be left enabled for Level1, as no GIME generated IRQ
-         endif            
                          
          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
                          
-         ifgt  Level-1   
-         lda   ,x         clear possible pending PIA0 HBORD IRQ
-         endc            
          lda   2,x        clear possible pending PIA0 VBORD IRQ
-                         
-* Don't need to explicitly read RTC during initialization
-         ldd   #59*256+$01 last second and last tick
-         std   <D.Sec     will prompt RTC read at next time slice
-         ifeq  Level-1
-         ldb   #TkPerSec
-         stb   <D.TSec    set ticks per second
-         endc
-         ldb   #TkPerTS   get ticks per 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    
+          puls  cc,pc      recover IRQ enable status and return
+          ENDC       
                          
-         ifgt  Level-1   
-         leax  SvcVIRQ,pcr set VIRQ handler
-         stx   <D.VIRQ   
-         endc            
-                         
-         leay  NewSvc,pcr insert syscalls
-         os9   F$SSvc    
-                         
-         ifgt  Level-1   
-         ifne  H6309     
-         oim              #$08,<D.IRQER
-         else            
-         lda   <D.IRQER   get shadow GIME IRQ enable register
-         ora   #$08       set VBORD bit
-         sta   <D.IRQER   save shadow register
-         endc            
-         sta   >IRQEnR    enable GIME VBORD IRQs
-         endc            
-                         
-* 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
-                         
-         ifeq  Level-1   
 *
 * Clock IRQ Entry Point
 *
@@ -250,10 +182,14 @@
 SvcIRQ                   
          clra            
          tfr   a,dp       set direct page to zero
+         IFNE  atari
+          sta   $D40F     clear NMI interrupt
+         ELSE
          tst   PIA0Base+3 get hw byte
          bmi   L0032      branch if sync flag on
          jmp   [>D.SvcIRQ] else service other possible IRQ
 L0032    tst   PIA0Base+2 clear interrupt
+          ENDC
          dec   <D.Tick    decrement tick counter
          bne   L007F      go around if not zero
          ldb   <D.Sec     get minutes/seconds
@@ -291,7 +227,7 @@
          beq   GoAltIRQ   branch if zero
          ldx   <D.Proc    else get pointer to current process descriptor
          beq   L00AE      branch if none
-         tst   P$State,x  test process' state
+         tst   P$State,x  test process state
          bpl   UsrPoll    branch if system state not set
 L00AE    jsr   [>D.Poll]  poll ISRs
          bcc   L00AE      keep polling until carry set
@@ -373,372 +309,6 @@
          clrb            
          rts             
                          
-                         
-                         
-                         
-         else            
-                         
-                         
-                         
-                         
-* NitrOS-9 Level 2 Clock
-                         
-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
-                         
-                         
-*---------------------------------------------------------
-* IRQ Handling starts here.
-*
-* 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   
-                         
-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
-                         
-*------------------------------------------------------------
-*
-* IRQ handling re-enters here on VSYNC IRQ.
-*
-* - Count down VIRQ timers, mark ones that are done
-* - Call DoPoll/DoToggle to service VIRQs and IRQs and reset GIME
-* - Call Keyboard scan
-* - 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   
-                         
-virqloop                 
-         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  
-                         
-         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            
-                         
-KbdCheck                 
-         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.
-                         
-         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   
-                         
-* 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
-                         
-*
-* Call GetTime entry point in Clock2
-*
-         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   
-         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    
-         std   >WGlobal+G.AlPID
-         bra   VIRQend   
-dobell   ldx   >WGlobal+G.BelVec
-         beq   VIRQend   
-         jsr   ,x        
-VIRQend  jmp   [>D.Clock] jump to kernel's timeslice routine
-                         
-*------------------------------------------------------------
-* Interrupt polling and GIME reset code
-*
-                         
-*
-* 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            
-d@       jsr   [>D.Poll]  call poll routine
-         bcc   d@         until error (error -> no interrupt found)
-                         
-         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             
-                         
-                         
-*------------------------------------------------------------
-*
-* Handle F$VIRQ system call
-*
-FVIRQ    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
-                         
-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             
-                         
-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             
-                         
-DelVIRQ  pshs  x,y       
-DelVLup                  
-         IFEQ  H6309-1   
-         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
-                         
-         IFGT  Level-1   
-*------------------------------------------------------------
-*
-* Handle F$Alarm call
-*
-FAlarm   ldx   #WGlobal+G.AlPckt
-         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  
-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
-         ldu   #WGlobal+G.AlPckt
-         ldy   #5         move 5 bytes
-         bra   FMove     
-                         
-GetAlarm                 
-         cmpd  #2        
-         bne   AlarmErr  
-         ldd   G.AlPID-G.AlPckt,x
-         std   R$D,u     
-         bra   RetTime   
-AlarmErr                 
-         comb            
-         ldb   #E$IllArg 
-         rts             
-         endc            
-                         
-*------------------------------------------------------------
-*
-* Handle F$Time System call
-*
-FTime    equ   *         
-         ifgt  Level-1   
-         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
-         lda   <D.SysTsk  from System Task
-         ldu   R$X,u     
-STime.Mv                 
-         ldy   #6         move 6 bytes
-FMove    os9   F$Move    
-         else            
-         ldx   R$X,u      get pointer to caller's space
-         ldd   <D.Year    get year and month
-         std   ,x        
-         ldd   <D.Day     get day and hour
-         std   2,x       
-         ldd   <D.Min     get minute and second
-         std   4,x       
-         clrb            
-         endc            
-         rts             
-                         
-         endc            
-                         
          emod            
 len      equ   *         
          end