changeset 1453:5dbf908c1483

Kernel and KernelP2 moved to krnl/
author boisy
date Thu, 11 Dec 2003 23:47:53 +0000
parents 32b27b6792b6
children 5b97ef510c7f
files level1/modules/kernel/defsfile level1/modules/kernel/fcmpnam.asm level1/modules/kernel/krn.asm level1/modules/kernel/krnp2.asm level1/modules/kernel/makefile level1/modules/makefile
diffstat 6 files changed, 2086 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/kernel/defsfile	Thu Dec 11 23:47:53 2003 +0000
@@ -0,0 +1,1 @@
+         use   ../../defsfile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/kernel/fcmpnam.asm	Thu Dec 11 23:47:53 2003 +0000
@@ -0,0 +1,108 @@
+**************************************************
+* System Call: F$CmpNam
+*
+* Function: Compare two names
+*
+* Input:  X = Address of first name
+*         Y = Address of second name
+*         B = length of first name
+*
+* Output: None
+*
+* Error:  CC = C bit set; B = error code
+*
+
+         IFGT  Level-1
+
+FCmpNam  ldx   <D.Proc      get current process ptr
+         leay  P$DATImg,x   Point to the DAT image
+         ldx   R$X,u        Get pointer to string #1
+         pshs  y,x          preserve 'em
+         bra   L07CF
+
+* F$CmpNam entry point for system state
+FSCmpNam ldx   <D.Proc      Get current proc. dsc. ptr
+         leay  P$DATImg,x   Point to it's DAT image
+         ldx   R$X,u        get pointer to string #1
+         pshs  x,y
+         ldy   <D.SysDAT    get pointer to system DAT
+L07CF    ldx   R$Y,u        get pointer to string #2
+         pshs  y,x          Preserve them
+         ldd   R$D,u        get length
+         leax  4,s          point to string #1 info packet
+         leay  ,s           point to string #2 info packet
+         bsr   L07DE        go compare 'em
+         leas  8,s          purge stack
+         rts                return
+
+* Compare 2 strings
+*
+* Input:  D = Length of string #1 (only requires B)
+*         X = Ptr to string #1 info packet
+*             0,X = DAT image pointer
+*             2,X = Pointer to string
+*         Y = Ptr to string #2 info packet
+*             0,Y = DAT image pointer
+*             2,Y = Pointer to string
+*         U = Register stack ptr
+L07DE    pshs  d,x,y,u      preserve registers
+         tfr   x,u          U=ptr to string #1 packet
+         pulu  x,y          get DAT ptr to Y and string ptr to X
+         lbsr  AdjBlk0      adjust X to use block 0
+         pshu  x,y          put them back
+         ldu   4,s          get pointer to string #2 packet
+         pulu  x,y          get DAT ptr to Y and string ptr to X
+         lbsr  AdjBlk0      Adjust X to block 0
+         bra   L07F6        go compare the strings
+
+L07F2    ldu   4,s          get pointer to string #2 packet
+         pulu  x,y          get DAT ptr to Y and string ptr to X
+L07F6    lbsr  LDAXY        Map in the block & grab a byte from string
+         pshu  x,y          Put updated DAT & string ptr back
+         pshs  a            Save the character
+         ldu   3,s          pointer to string #1 packet
+         pulu  x,y          get DAT ptr to Y and string ptr to X
+         lbsr  LDAXY        get byte from string #1
+         pshu  y,x          put pointers back
+         eora  ,s
+         tst   ,s+          was it high bit?
+         bmi   L0816        yes, check if last character in string #2
+         decb  
+         beq   L0813
+         anda  #$DF         match?
+         beq   L07F2        yes, check next character
+L0813    comb               set carry
+         puls  d,x,y,u,pc
+
+L0816    decb               done whole string?
+         bne   L0813        no, exit with no match
+         anda  #$5F         match?
+         bne   L0813        yes, keep checking
+         clrb               strings match, clear carry
+         puls  d,x,y,u,pc   restore & return
+
+         ELSE
+
+FCmpNam  ldb   R$B,u
+         leau  R$X,u
+         pulu  y,x
+L07AB    pshs  y,x,b,a
+L07AD    lda   ,y+
+         bmi   L07BE
+         decb
+         beq   L07BA
+         eora  ,x+
+         anda  #$DF
+         beq   L07AD
+L07BA    orcc  #Carry
+         puls  pc,y,x,b,a
+L07BE    decb
+         bne   L07BA
+         eora  ,x
+         anda  #$5F
+         bne   L07BA
+         puls  y,x,b,a
+L07C9    andcc #^Carry
+         rts
+
+         ENDC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/kernel/krn.asm	Thu Dec 11 23:47:53 2003 +0000
@@ -0,0 +1,1203 @@
+********************************************************************
+* Kernel - NitrOS-9 Level 1 Kernel
+*
+* $Id$
+*
+* This is how the memory map looks after the kernel has initialized:
+*
+*     $0000----> ================================== 
+*               |                                  |
+*               |                                  |
+*  $0020-$0111  |  System Globals (D.FMBM-D.XNMI)  |
+*               |                                  |
+*               |                                  |
+*     $0200---->|==================================|
+*               |        Free Memory Bitmap        |
+*  $0200-$021F  |     (1 bit = 256 byte page)      |
+*               |----------------------------------|
+*               |      System Dispatch Table       |
+*  $0222-$0291  |     (Room for 56 addresses)      |
+*               |----------------------------------|
+*  $0292-$02FF  |       User Dispatch Table        |
+*               |     (Room for 56 addresses)      |
+*     $0300---->|==================================|
+*               |                                  |
+*               |                                  |
+*  $0300-$03FF  |     Module Directory Entries     |
+*               |      (Room for 64 entries)       |
+*               |                                  |
+*     $0400---->|==================================|
+*               |                                  |
+*  $0400-$04FF  |           System Stack           |
+*               |                                  |
+*     $0500---->|==================================|
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*  14      1985/??/??
+* From Tandy OS-9 Level One VR 02.00.00
+*
+*  15      2002/07/21  Boisy G. Pitre
+* Module validation consists only of module header parity check.
+* CRC check is not done unless D.CRC is set to 1, which is NOT the
+* default case.  By default, D.CRC is set to 0, thus there is no
+* CRC checking.  Speeds up module loads quite a bit. The Init module
+* has a bit in a compatibility byte that can turn on/off CRC checking
+*
+*  15r1    2003/12/09  Boisy G. Pitre
+* Kernel no longer scans for modules in I/O space.
+
+         nam   Kernel
+         ttl   NitrOS-9 Level 1 Kernel
+
+         ifp1
+         use   defsfile
+         use   scfdefs
+         endc
+
+tylg     set   Systm+Objct
+atrv     set   ReEnt+rev
+rev      set   $01
+edition  set   15
+
+L0000    mod   eom,name,tylg,atrv,OS9Cold,size
+
+size     equ   .
+
+name     fcs   /Kernel/
+         fcb   edition
+
+InitNam  fcs   /Init/
+
+P2Nam    fcs   /KernelP2/
+
+VectCode bra   SWI3Jmp		$0100
+         nop
+         bra   SWI2Jmp		$0103
+         nop
+         bra   SWIJmp		$0106
+         nop
+         bra   NMIJmp		$0109
+         nop
+         bra   IRQJmp		$010C
+         nop
+         bra   FIRQJmp		$010F
+
+SWI3Jmp  jmp   [>D.SWI3]
+SWI2Jmp  jmp   [>D.SWI2]
+SWIJmp   jmp   [>D.SWI]
+NMIJmp   jmp   [>D.NMI]
+IRQJmp   jmp   [>D.IRQ]
+FIRQJmp  jmp   [>D.FIRQ]
+VectCSz  equ   *-VectCode
+
+
+SysTbl   fcb   F$Link
+         fdb   FLink-*-2
+
+         fcb   F$Fork
+         fdb   FFork-*-2
+
+         fcb   F$Chain
+         fdb   FChain-*-2
+
+         fcb   F$Chain+$80
+         fdb   SFChain-*-2
+
+         fcb   F$PrsNam
+         fdb   FPrsNam-*-2
+
+         fcb   F$CmpNam
+         fdb   FCmpNam-*-2
+
+         fcb   F$SchBit
+         fdb   FSchBit-*-2
+
+         fcb   F$AllBit
+         fdb   FAllBit-*-2
+
+         fcb   F$DelBit
+         fdb   FDelBit-*-2
+
+         fcb   F$CRC
+         fdb   FCRC-*-2
+
+         fcb   F$SRqMem+$80
+         fdb   FSRqMem-*-2
+
+         fcb   F$SRtMem+$80
+         fdb   FSRtMem-*-2
+
+         fcb   F$AProc+$80
+         fdb   FAProc-*-2
+
+         fcb   F$NProc+$80
+         fdb   FNProc-*-2
+
+         fcb   F$VModul+$80
+         fdb   FVModul-*-2
+
+         fcb   F$SSvc
+         fdb   FSSvc-*-2
+
+         fcb   $80
+
+*
+* OS-9 Genesis!
+OS9Cold  equ   *
+* clear out system globals from $0020-$0400
+         ldx   #D.FMBM
+         ldy   #$400-D.FMBM
+         clra
+         clrb
+L007F    std   ,x++
+         leay  -2,y
+         bne   L007F
+* set up system globals
+         inca
+         inca                          D = $200
+         std   <D.FMBM                 $200 = start of free memory bitmap
+         addb  #$20
+         std   <D.FMBM+2               $220 = end of free memory bitmap
+         addb  #$02
+         std   <D.SysDis               $222 = addr of sys dispatch tbl
+         addb  #$70
+         std   <D.UsrDis               $292 = addr of usr dispatch tbl
+         clrb
+         inca                          D = $300
+         std   <D.ModDir               $300 = mod dir start
+         stx   <D.ModDir+2             X = $400 = mod dir end
+         leas  >$0100,x                S = $500 (system stack?)
+
+* Check for valid RAM starting at $400
+ChkRAM   leay  ,x
+         ldd   ,y                      store org contents in D
+         ldx   #$00FF
+         stx   ,y                      write pattern to ,Y
+         cmpx  ,y                      same as what we wrote?
+         bne   L00C2                   nope, not RAM here!
+         ldx   #$FF00                  try different pattern
+         stx   ,y                      write it to ,Y
+         cmpx  ,y                      same as what we wrote?
+         bne   L00C2                   nope, not RAM here!
+         std   ,y                      else restore org contents
+         leax  >$0100,y                check top of next 256 block
+         cmpx  #Bt.Start               stop short of boot track mem
+         bcs   ChkRAM
+         leay  ,x
+* Here, Y = end of RAM
+L00C2    leax  ,y                      X = end of RAM
+         stx   <D.MLIM                 save off memory limit
+
+* Copy vector code over to address $100
+         pshs  y,x
+         leax  >VectCode,pcr
+         ldy   #D.XSWI3
+         ldb   #VectCSz
+L00D2    lda   ,x+
+         sta   ,y+
+         decb
+         bne   L00D2
+         puls  y,x
+* validate modules at top of RAM (kernel, etc.)
+L00DB    lbsr  ValMod
+         bcs   L00E6
+         ldd   M$Size,x
+         leax  d,x                     go past module
+         bra   L00EC
+L00E6    cmpb  #E$KwnMod
+         beq   L00EE
+         leax  1,x
+* Modification to stop scan into I/O space
+L00EC    cmpx  #Bt.Start+Bt.Size
+         bcs   L00DB
+
+* copy vectors to system globals
+L00EE    leay  >Vectors,pcr
+         leax  >L0000,pcr
+         pshs  x
+         ldx   #D.SWI3
+L00FB    ldd   ,y++
+         addd  ,s
+         std   ,x++
+         cmpx  #$0036
+         bls   L00FB
+         leas  2,s                     restore stack
+
+* fill in more system globals
+         leax  >URtoSs,pcr
+         stx   <D.URtoSs
+         leax  >UsrIRQ,pcr
+         stx   <D.UsrIRQ
+         leax  >UsrSvc,pcr
+         stx   <D.UsrSvc
+         leax  >SysIRQ,pcr
+         stx   <D.SysIRQ
+         stx   <D.SvcIRQ
+         leax  >SysSvc,pcr
+         stx   <D.SysSvc
+         stx   <D.SWI2
+         leax  >Poll,pcr
+         stx   <D.Poll
+         leax  >Clock,pcr
+         stx   <D.Clock
+         stx   <D.AltIRQ
+
+* install system calls
+         leay  >SysTbl,pcr
+         lbsr  InstSSvc
+
+* link to init module
+         lda   #Systm+0
+         leax  >InitNam,pcr
+         os9   F$Link
+         lbcs  OS9Cold
+         stu   <D.Init
+         lda   Feature1,u		get feature byte 1
+         bita  #CRCOn			CRC on?
+         beq   GetMem			branch if not (already cleared earlier)
+         inc   <D.CRC			else turn on CRC checking
+GetMem   ldd   MaxMem+1,u
+         clrb
+         cmpd  <D.MLIM
+         bcc   L0158
+         std   <D.MLIM
+L0158    ldx   <D.FMBM
+         ldb   #$F8
+         stb   ,x
+         clra
+         ldb   <D.MLIM
+         negb
+         tfr   d,y
+         negb
+         lbsr  L065A
+
+* jump into OS9p2 here
+         leax  >P2Nam,pcr
+         lda   #Systm+Objct
+         os9   F$Link
+         lbcs  OS9Cold
+         jmp   ,y
+SWI3     pshs  pc,x,b
+         ldb   #P$SWI3
+         bra   L018C
+SWI2     pshs  pc,x,b
+         ldb   #P$SWI2
+         bra   L018C
+DUMMY    rti
+SVCIRQ   jmp   [>D.SvcIRQ]
+SWI      pshs  pc,x,b
+         ldb   #P$SWI
+L018C    ldx   >D.Proc
+         ldx   b,x                     get SWI entry
+         stx   3,s                     put in PC on stack
+         puls  pc,x,b
+
+UsrIRQ   leay  <L01B1,pcr
+* transition from user to system state
+URtoSs   clra
+         tfr   a,dp                    clear direct page
+         ldx   <D.Proc
+         ldd   <D.SysSvc
+         std   <D.SWI2
+         ldd   <D.SysIRQ
+         std   <D.SvcIRQ
+         leau  ,s
+         stu   P$SP,x
+         lda   P$State,x
+         ora   #SysState
+         sta   P$State,x
+         jmp   ,y
+
+L01B1    jsr   [>D.Poll]
+         bcc   L01BD
+         ldb   ,s
+         orb   #$10
+         stb   ,s
+L01BD    lbra  L0255
+
+SysIRQ   clra
+         tfr   a,dp
+         jsr   [>D.Poll]
+         bcc   L01CF
+         ldb   ,s
+         orb   #$10
+         stb   ,s
+L01CF    rti
+Poll     comb
+         rts
+
+Clock    ldx   <D.SProcQ
+         beq   L01FD
+         lda   P$State,x
+         bita  #TimSleep
+         beq   L01FD
+         ldu   P$SP,x
+         ldd   P$SP,u
+         subd  #$0001
+         std   P$SP,u
+         bne   L01FD
+L01E7    ldu   P$Queue,x
+         bsr   L021A
+         leax  ,u
+         beq   L01FB
+         lda   P$State,x
+         bita  #TimSleep
+         beq   L01FB
+         ldu   P$SP,x
+         ldd   P$SP,u
+         beq   L01E7
+L01FB    stx   <D.SProcQ
+L01FD    dec   <D.Slice
+         bne   ClockRTI
+         lda   <D.TSlice
+         sta   <D.Slice
+         ldx   <D.Proc
+         beq   ClockRTI
+         lda   P$State,x
+         ora   #TimOut
+         sta   P$State,x
+         bpl   L0212                   branch if not system state
+ClockRTI rti
+
+L0212    leay  >L0255,pcr
+         bra   URtoSs
+
+* X = proc desc
+FAProc   ldx   R$X,u
+L021A    pshs  u,y
+         ldu   #$003F
+         bra   L0228
+L0221    ldb   P$Age,u
+         incb
+         beq   L0228
+         stb   P$Age,u
+L0228    ldu   P$Queue,u               U = proc desc
+         bne   L0221
+         ldu   #$003F
+         lda   P$Prior,x
+         sta   P$Age,x
+         orcc  #IntMasks
+L0235    leay  ,u
+         ldu   P$Queue,u
+         beq   L023F
+         cmpa  P$Age,u
+         bls   L0235
+L023F    stu   P$Queue,x
+         stx   P$Queue,y
+         clrb
+         puls  pc,u,y
+
+UsrSvc   leay  <L024E,pcr
+         orcc  #IntMasks
+         lbra  URtoSs
+
+L024E    andcc #^IntMasks
+         ldy   <D.UsrDis
+         bsr   L0278
+L0255    ldx   <D.Proc                 get current proc desc
+         beq   FNProc                  branch to FNProc if none
+         orcc  #IntMasks
+         ldb   P$State,x
+         andb  #^SysState
+         stb   P$State,x
+         bitb  #TimOut
+         beq   L02D1
+         andb  #^TimOut
+         stb   P$State,x
+         bsr   L021A
+         bra   FNProc
+
+* system call entry
+SysSvc   clra
+         tfr   a,dp                    set direct page to 0
+         leau  ,s
+         ldy   <D.SysDis
+         bsr   L0278
+         rti
+
+L0278    pshs  u
+         ldx   R$PC,u                  point X to PC
+         ldb   ,x+                     get func code at X
+         stx   R$PC,u                  restore updated PC
+         lslb                          multiply by 2
+         bcc   L0288                   branch if user call
+         rorb
+         ldx   -2,y
+         bra   L0290
+L0288    cmpb  #$6E
+         bcc   L02A7
+         ldx   b,y                     X = addr of system call
+         beq   L02A7
+L0290    jsr   ,x                      jsr into system call
+L0292    puls  u
+         tfr   cc,a
+         bcc   FixCC                   branch if no error
+         stb   R$B,u                   store error code
+FixCC    ldb   R$CC,u                  get caller's CC
+         andb  #^(Negative+Zero+TwosOvfl+Carry)
+         stb   R$CC,u
+         anda  #Negative+Zero+TwosOvfl+Carry
+         ora   R$CC,u
+         sta   R$CC,u
+         rts
+L02A7    comb
+         ldb   #E$UnkSvc
+         bra   L0292
+
+* no signal handler, exit with signal value as exit code
+L02AC    ldb   P$State,x
+         orb   #SysState
+         stb   P$State,x
+         ldb   <P$Signal,x
+         andcc #^(IntMasks)
+         os9   F$Exit
+
+FNProc   clra
+         clrb
+         std   <D.Proc
+         bra   L02C2
+* execution goes here when there are no active processes
+L02C0    cwai  #^(IntMasks)
+L02C2    orcc  #IntMasks
+         ldx   <D.AProcQ               get next active process
+         beq   L02C0                   CWAI if none
+         ldd   P$Queue,x               get queue ptr
+         std   <D.AProcQ               store in Active Q
+         stx   <D.Proc                 store in current process
+         lds   P$SP,x                  get process' stack ptr
+L02D1    ldb   P$State,x               get state
+         bmi   L0308                   branch if system state
+         bitb  #Condem                 process condemned?
+         bne   L02AC                   branch if so...
+         ldb   <P$Signal,x             get signal no
+         beq   L02FF                   branch if none
+         decb                          decrement
+         beq   L02FC                   branch if wake up
+         ldu   <P$SigVec,x             get signal handler addr
+         beq   L02AC                   branch if none
+         ldy   <P$SigDat,x             get data addr
+         ldd   $06,s
+         pshs  u,y,b,a
+         ldu   $0A,s
+         lda   <P$Signal,x
+         ldb   $09,s
+         tfr   d,y
+         ldd   $06,s
+         pshs  u,y,b,a
+         clrb
+L02FC    stb   <P$Signal,x
+L02FF    ldd   <P$SWI2,x
+         std   <D.SWI2
+         ldd   <D.UsrIRQ
+         std   <D.SvcIRQ
+L0308    rti
+
+FLink    pshs  u                       save caller regs
+         ldd   R$A,u
+         ldx   R$X,u
+         lbsr  L0443
+         bcc   FLinkOK
+         ldb   #E$MNF
+         bra   L033D
+* U = module dir entry
+FLinkOK  ldy   ,u                      get module ptr
+         ldb   M$Revs,y
+         bitb  #ReEnt                  reentrant?
+         bne   L032A                   branch if so
+         tst   $02,u                   link count zero?
+         beq   L032A                   yep, ok to link to nonreent
+         comb                          else module is busy
+         ldb   #E$ModBsy
+         bra   L033D
+L032A    inc   $02,u                   increment link count
+         ldu   ,s                      get caller regs from stack
+         stx   R$X,u
+         sty   R$U,u
+         ldd   M$Type,y
+         std   R$D,u
+         ldd   M$IDSize,y
+         leax  d,y
+         stx   R$Y,u
+L033D    puls  pc,u
+
+FVModul  pshs  u
+         ldx   R$X,u
+         bsr   ValMod
+         puls  y
+         stu   R$U,y
+         rts
+* X = address of module to validate
+ValMod   bsr   ChkMHCRC
+         bcs   L039A
+         lda   M$Type,x
+         pshs  x,a
+         ldd   M$Name,x
+         leax  d,x                     X = addr of name in mod
+         puls  a
+         lbsr  L0443
+         puls  x
+         bcs   L039B
+         ldb   #E$KwnMod
+         cmpx  ,u
+         beq   L03A1
+         lda   M$Revs,x
+         anda  #RevsMask
+         pshs  a
+         ldy   ,u
+         lda   M$Revs,y
+         anda  #RevsMask
+         cmpa  ,s+                     same revision as other mod?
+         bcc   L03A1
+         pshs  y,x
+         ldb   M$Size,u
+         bne   L0395
+         ldx   ,u
+         cmpx  <D.BTLO
+         bcc   L0395
+         ldd   $02,x
+         addd  #$00FF
+         tfr   a,b
+         clra
+         tfr   d,y
+         ldb   ,u
+         ldx   <D.FMBM
+         os9   F$DelBit
+         clr   $02,u
+L0395    puls  y,x
+L0397    stx   ,u
+         clrb
+L039A    rts
+L039B    leay  ,u
+         bne   L0397
+         ldb   #E$DirFul
+L03A1    coma
+         rts
+
+* check module header and CRC
+* X = address of potential module
+ChkMHCRC ldd   ,x
+         cmpd  #M$ID12                 sync bytes?
+         bne   L03B1                   nope, not a module here
+         leay  M$Parity,x
+         bsr   ChkMHPar                check header parity
+         bcc   L03B5                   branch if ok
+L03B1    comb
+         ldb   #E$BMID
+         rts
+
+L03B5
+* Following 4 lines added to support no CRC checks - 2002/07/21
+         lda   <D.CRC			is CRC checking on?
+         bne   DoCRCCk			branch if so
+         clrb
+         rts
+
+DoCRCCk  pshs  x
+         ldy   M$Size,x
+         bsr   ChkMCRC                 checkm module CRC
+         puls  pc,x
+* check module header parity
+* Y = pointer to parity byte
+ChkMHPar pshs  y,x
+         clra
+ChkM010  eora  ,x+
+         cmpx  2,s                     compare to addr of M$Parity
+         bls   ChkM010
+         cmpa  #$FF
+         puls  pc,y,x
+* X = address of potential module
+* Y = size of module
+ChkMCRC  ldd   #$FFFF
+         pshs  b,a
+         pshs  b,a
+         leau  1,s
+L03D4    lda   ,x+
+         bsr   CRCAlgo
+         leay  -1,y                    dec Y (size of module)
+         bne   L03D4                   continue
+         clr   -1,u
+         lda   ,u
+         cmpa  #CRCCon1
+         bne   L03EC
+         ldd   1,u
+         cmpd  #CRCCon23
+         beq   L03EF
+L03EC    comb
+         ldb   #E$BMCRC
+L03EF    puls  pc,y,x
+
+* F$CRC
+FCRC     ldx   R$X,u
+         ldy   R$Y,u
+         beq   L0402
+         ldu   R$U,u
+L03FA    lda   ,x+
+         bsr   CRCAlgo
+         leay  -1,y
+         bne   L03FA
+L0402    clrb
+         rts
+
+CRCAlgo  eora  ,u
+         pshs  a
+         ldd   $01,u
+         std   ,u
+         clra
+         ldb   ,s
+         lslb
+         rola
+         eora  1,u
+         std   1,u
+         clrb
+         lda   ,s
+         lsra
+         rorb
+         lsra
+         rorb
+         eora  1,u
+         eorb  2,u
+         std   1,u
+         lda   ,s
+         lsla
+         eora  ,s
+         sta   ,s
+         lsla
+         lsla
+         eora  ,s
+         sta   ,s
+         lsla
+         lsla
+         lsla
+         lsla
+         eora  ,s+
+         bpl   L0442
+         ldd   #$8021
+         eora  ,u
+         sta   ,u
+         eorb  2,u
+         stb   2,u
+L0442    rts
+
+L0443    ldu   #$0000
+         tfr   a,b
+         anda  #TypeMask
+         andb  #LangMask
+         pshs  u,y,x,b,a
+         bsr   EatSpace
+         cmpa  #PDELIM                 pathlist char?
+         beq   L049C                   branch if so
+*         lbsr  L074D                   parse name
+         lbsr  ParseNam                parse name
+         bcs   L049D                   return if error
+         ldu   <D.ModDir
+L045B    pshs  u,y,b
+         ldu   ,u
+         beq   L048B
+         ldd   $04,u
+         leay  d,u
+         ldb   ,s
+         lbsr  L07AB
+         bcs   L0493
+         lda   $05,s
+         beq   L0476
+         eora  $06,u
+         anda  #$F0
+         bne   L0493
+L0476    lda   $06,s
+         beq   L0480
+         eora  $06,u
+         anda  #$0F
+         bne   L0493
+L0480    puls  u,x,b
+         stu   $06,s
+         bsr   EatSpace
+         stx   $02,s
+         clra
+         bra   L049D
+L048B    ldd   $0B,s
+         bne   L0493
+         ldd   $03,s
+         std   $0B,s
+L0493    puls  u,y,b
+         leau  $04,u
+         cmpu  <D.ModDir+2
+         bcs   L045B
+L049C    comb
+L049D    puls  pc,u,y,x,b,a
+
+EatSpace lda   #C$SPAC
+EatSpc10 cmpa  ,x+
+         beq   EatSpc10
+         lda   ,-x
+         rts
+
+FFork    ldx   <D.PrcDBT
+         os9   F$All64
+         bcs   L0517
+         ldx   <D.Proc
+         pshs  x                       save calling proc desc on stack
+         ldd   P$User,x
+         std   P$User,y
+         lda   P$Prior,x
+         clrb
+         std   P$Prior,y
+         ldb   #SysState
+         stb   P$State,y
+         sty   <D.Proc
+         ldd   <P$NIO,x
+         std   <P$NIO,y
+         ldd   <P$NIO+2,x
+         std   <P$NIO+2,y
+         leax  <P$DIO,x
+         leay  <P$DIO,y
+         ldb   #DefIOSiz
+* copy I/O stuff from parent to child
+L04D7    lda   ,x+
+         sta   ,y+
+         decb
+         bne   L04D7
+* X/Y = address of path table in respective proc desc
+* Dup stdin/stdout/stderr
+         ldb   #$03
+L04E0    lda   ,x+
+         os9   I$Dup
+         bcc   L04E8
+         clra
+L04E8    sta   ,y+
+         decb
+         bne   L04E0
+         bsr   L0553
+         bcs   L050C
+         puls  y                       get parent proc desc
+         sty   <D.Proc
+         lda   P$ID,x                  get ID of new process
+         sta   R$A,u                   store in caller's A
+         ldb   P$CID,y                 get child id of parent
+         sta   P$CID,y                 store new proc in parent's CID
+         lda   P$ID,y                  get ID of parent
+         std   P$PID,x                 store in child proc desc
+         ldb   P$State,x               update state of child
+         andb  #^SysState
+         stb   P$State,x
+         os9   F$AProc                 insert child in active Q
+         rts
+L050C    pshs  b
+         os9   F$Exit
+         comb
+         puls  x,b
+         stx   <D.Proc
+         rts
+L0517    comb
+         ldb   #E$PrcFul
+         rts
+
+FChain   bsr   L0543
+         bcs   L0531
+         orcc  #IntMasks
+         ldb   $0D,x
+         andb  #$7F
+         stb   $0D,x
+L0527    os9   F$AProc
+         os9   F$NProc
+
+SFChain  bsr   L0543
+         bcc   L0527
+L0531    pshs  b
+         stb   <P$Signal,x
+         ldb   P$State,x
+         orb   #Condem
+         stb   P$State,x
+         ldb   #$FF
+         stb   P$Prior,x
+         comb
+         puls  pc,b
+L0543    pshs  u
+         ldx   <D.Proc
+         ldu   <P$PModul,x
+         os9   F$UnLink
+         ldu   ,s
+         bsr   L0553
+         puls  pc,u
+L0553    ldx   <D.Proc
+         pshs  u,x
+         ldd   <D.UsrSvc
+         std   <P$SWI,x
+         std   <P$SWI2,x
+         std   <P$SWI3,x
+         clra
+         clrb
+         sta   <P$Signal,x
+         std   <P$SigVec,x
+         lda   R$A,u
+         ldx   R$X,u
+         os9   F$Link
+         bcc   L0578
+         os9   F$Load
+         bcs   L05E7
+L0578    ldy   <D.Proc
+         stu   <P$PModul,y
+         cmpa  #Prgrm+Objct
+         beq   L058B
+         cmpa  #Systm+Objct
+         beq   L058B
+         comb
+         ldb   #E$NEMod
+         bra   L05E7
+L058B    leay  ,u                      Y = addr of module
+         ldu   2,s                     get U off stack (caller regs)
+         stx   R$X,u
+         lda   R$B,u
+         clrb
+         cmpd  M$Mem,y                 compare passed mem to module's
+         bcc   L059B                   branch if less than
+         ldd   M$Mem,y
+L059B    addd  #$0000
+         bne   L05A0
+L05A0    os9   F$Mem
+         bcs   L05E7
+         subd  #R$Size                 subtract registers
+         subd  R$Y,u                   subtract parameter area
+         bcs   L05E5
+         ldx   R$U,u                   get parameter area
+         ldd   R$Y,u                   get parameter size
+         pshs  b,a
+         beq   L05BE
+         leax  d,x                     point to end of param area
+L05B6    lda   ,-x                     get byte, dec X
+         sta   ,-y                     save byte in data area, dec X
+         cmpx  R$U,u                   at top of param area?
+         bhi   L05B6
+* set up registers for return of F$Fork/F$Chain
+L05BE    ldx   <D.Proc
+         sty   -$08,y                  put in X on caller stack
+         leay  -R$Size,y               back up register size
+         sty   P$SP,x
+         lda   P$ADDR,x
+         clrb
+         std   R$U,y                   lowest address
+         sta   R$DP,y                  set direct page
+         adda  P$PagCnt,x
+         std   R$Y,y
+         puls  b,a
+         std   R$D,y                   size of param area
+         ldb   #Entire
+         stb   R$CC,y
+         ldu   <P$PModul,x             get addr of prim. mod
+         ldd   M$Exec,u
+         leau  d,u
+         stu   R$PC,y                  put in PC on caller reg
+         clrb
+L05E5    ldb   #E$IForkP
+L05E7    puls  pc,u,x
+
+FSRqMem  ldd   R$D,u
+         addd  #$00FF
+         clrb
+         std   R$D,u
+         ldx   <D.FMBM+2
+         ldd   #$01FF
+         pshs  b,a
+         bra   L0604
+L05FA    dec   $01,s
+         ldb   $01,s
+L05FE    lsl   ,s
+         bcc   L060A
+         rol   ,s
+L0604    leax  -1,x
+         cmpx  <D.FMBM
+         bcs   L0620
+L060A    lda   ,x
+         anda  ,s
+         bne   L05FA
+         dec   1,s
+         subb  1,s
+         cmpb  1,u
+         rora
+         addb  1,s
+         rola
+         bcs   L05FE
+         ldb   1,s
+         clra
+         incb
+L0620    leas  2,s
+         bcs   L0635
+         ldx   <D.FMBM
+         tfr   d,y
+         ldb   1,u
+         clra
+         exg   d,y
+         bsr   L065A
+         exg   a,b
+         std   8,u
+L0633    clra
+         rts
+L0635    comb
+         ldb   #E$MemFul
+         rts
+
+FSRtMem  ldd   R$D,u
+         addd  #$00FF
+         tfr   a,b
+         clra
+         tfr   d,y
+         ldd   R$U,u
+         beq   L0633
+         tstb
+         beq   L064E
+         comb
+         ldb   #E$BPAddr
+         rts
+L064E    exg   a,b
+         ldx   <D.FMBM
+         bra   L06AD
+
+FAllBit  ldd   R$D,u
+         leau  R$X,u
+         pulu  y,x
+L065A    pshs  y,x,b,a
+         bsr   L0690
+         tsta
+         pshs  a
+         bmi   L0671
+         lda   ,x
+L0665    ora   ,s
+         leay  -1,y
+         beq   L0689
+         lsr   ,s
+         bcc   L0665
+         sta   ,x+
+L0671    tfr   y,d
+         sta   ,s
+         lda   #$FF
+         bra   L067B
+L0679    sta   ,x+
+L067B    subb  #$08
+         bcc   L0679
+         dec   ,s
+         bpl   L0679
+L0683    lsla
+         incb
+         bne   L0683
+         ora   ,x
+L0689    sta   ,x
+         clra
+         leas  1,s
+         puls  pc,y,x,b,a
+L0690    pshs  b
+         lsra
+         rorb
+         lsra
+         rorb
+         lsra
+         rorb
+         leax  d,x
+         puls  b
+         lda   #$80
+         andb  #$07
+         beq   L06A6
+L06A2    lsra
+         decb
+         bne   L06A2
+L06A6    rts
+
+FDelBit  ldd   R$D,u
+         leau  R$X,u
+         pulu  y,x
+L06AD    pshs  y,x,b,a
+         bsr   L0690
+         coma
+         pshs  a
+         bpl   L06C4
+         lda   ,x
+L06B8    anda  ,s
+         leay  -1,y
+         beq   L06D8
+         asr   ,s
+         bcs   L06B8
+         sta   ,x+
+L06C4    tfr   y,d
+         bra   L06CA
+L06C8    clr   ,x+
+L06CA    subd  #$0008
+         bhi   L06C8
+         beq   L06D8
+L06D1    lsla
+         incb
+         bne   L06D1
+         coma
+         anda  ,x
+L06D8    sta   ,x
+         clr   ,s+
+         puls  pc,y,x,b,a
+
+FSchBit  pshs  u
+         ldd   R$D,u
+         ldx   R$X,u
+         ldy   R$Y,u
+         ldu   R$U,u
+         bsr   L06F3
+         puls  u
+         std   R$D,u
+         sty   R$Y,u
+         rts
+L06F3    pshs  u,y,x,b,a
+         pshs  y,b,a
+         clr   8,s
+         clr   9,s
+         tfr   d,y
+         bsr   L0690
+         pshs  a
+         bra   L0710
+L0703    leay  $01,y
+         sty   $05,s
+L0708    lsr   ,s
+         bcc   L0714
+         ror   ,s
+         leax  $01,x
+L0710    cmpx  $0B,s
+         bcc   L0732
+L0714    lda   ,x
+         anda  ,s
+         bne   L0703
+         leay  $01,y
+         tfr   y,d
+         subd  $05,s
+         cmpd  $03,s
+         bcc   L0739
+         cmpd  $09,s
+         bls   L0708
+         std   $09,s
+         ldd   $05,s
+         std   $01,s
+         bra   L0708
+L0732    ldd   $01,s
+         std   $05,s
+         coma
+         bra   L073B
+L0739    std   $09,s
+L073B    leas  $05,s
+         puls  pc,u,y,x,b,a
+
+         
+         use   fprsnam.asm
+
+*FPrsNam  ldx   R$X,u
+*         bsr   L074D
+*         std   R$D,u
+*         bcs   L0749
+*         stx   R$X,u
+*L0749    sty   R$Y,u
+*         rts
+*L074D    lda   ,x
+*         cmpa  #PDELIM                 pathlist char?
+*         bne   L0755                   branch if not
+*         leax  1,x                     go past pathlist char
+*L0755    leay  ,x
+*         clrb
+*         lda   ,y+
+*         anda  #$7F
+*         bsr   L0792
+*         bcs   L0772
+*L0760    incb
+*         lda   -1,y
+*         bmi   L076F                   hi bit set on this char, done
+*         lda   ,y+
+*         anda  #$7F
+*         bsr   IllChar
+*         bcc   L0760
+*         lda   ,-y
+*L076F    andcc #^Carry
+*         rts
+*L0772    cmpa  #C$COMA                 comma?
+*         bne   L0778
+*L0776    lda   ,y+
+*L0778    cmpa  #C$SPAC                 space?
+*         beq   L0776
+*         lda   ,-y
+*         comb
+*         ldb   #E$BNam
+*         rts
+
+* check for illegal characters in a pathlist
+*IllChar  cmpa  #C$PERD                 period?
+*         beq   L07C9                   branch if so
+*         cmpa  #'0                     zero?
+*         bcs   L07A2                   branch if less than
+*         cmpa  #'9                     number?
+*         bls   L07C9                   branch if lower/same
+*         cmpa  #'_                     underscore?
+*         beq   L07C9                   branch if so
+*L0792    cmpa  #'A                     A?
+*         bcs   L07A2                   branch if less than
+*         cmpa  #'Z                     Z?
+*         bls   L07C9                   branch if less or equal
+*         cmpa  #'a                     a?
+*         bcs   L07A2                   branch if lower
+*         cmpa  #'z                     z?
+*         bls   L07C9                   branch if less or equal
+*L07A2    orcc  #Carry
+*         rts
+
+         use   fcmpnam.asm
+
+*FCmpNam  ldb   R$B,u
+*         leau  R$X,u
+*         pulu  y,x
+*L07AB    pshs  y,x,b,a
+*L07AD    lda   ,y+
+*         bmi   L07BE
+*         decb
+*         beq   L07BA
+*         eora  ,x+
+*         anda  #$DF
+*         beq   L07AD
+*L07BA    orcc  #Carry
+*         puls  pc,y,x,b,a
+*L07BE    decb
+*         bne   L07BA
+*         eora  ,x
+*         anda  #$5F
+*         bne   L07BA
+*         puls  y,x,b,a
+*L07C9    andcc #^Carry
+*         rts
+
+FSSvc    ldy   R$Y,u
+         bra   InstSSvc
+SSvcLoop tfr   b,a                     put syscall code in A
+         anda  #$7F                    kill hi bit
+         cmpa  #$7F                    is code $7F?
+         beq   SSvcOK
+         cmpa  #$37			compare against highest call allowed
+         bcs   SSvcOK                  branch if A less than highest call
+         comb
+         ldb   #E$ISWI
+         rts
+SSvcOK   lslb
+         ldu   <D.SysDis
+         leau  b,u                     U points to entry in table
+         ldd   ,y++                    get addr of func
+         leax  d,y                     get absolute addr
+         stx   ,u                      store in system table
+         bcs   InstSSvc                branch if system only
+         stx   <$70,u                  else store in user table too
+InstSSvc ldb   ,y+                     get system call code in B
+         cmpb  #$80                    end of table?
+         bne   SSvcLoop                branch if not
+         rts
+
+         emod
+eom      equ   *
+
+         fdb   Clock
+Vectors  fdb   SWI3			SWI3 
+         fdb   SWI2 			SWI2
+         fdb   DUMMY			FIRQ
+         fdb   SVCIRQ			IRQ
+         fdb   SWI			SWI
+         fdb   DUMMY			NMI
+
+         end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/kernel/krnp2.asm	Thu Dec 11 23:47:53 2003 +0000
@@ -0,0 +1,742 @@
+********************************************************************
+* KernelP2 - NitrOS-9 Level 1 Kernel Part 2
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+
+         nam   KernelP2
+         ttl   NitrOS-9 Level 1 Kernel Part 2
+
+         ifp1
+         use   defsfile
+         endc
+
+tylg     set   Systm+Objct
+atrv     set   ReEnt+rev
+rev      set   $00
+edition  set   10
+
+         mod   eom,name,tylg,atrv,start,size
+
+size     equ   .
+
+name     fcs   /KernelP2/
+         fcb   edition
+
+SvcTbl   fcb   $7F
+         fdb   IOCall-*-2
+
+         fcb   F$Unlink
+         fdb   FUnlink-*-2
+
+         fcb   F$Wait
+         fdb   FWait-*-2
+
+         fcb   F$Exit
+         fdb   FExit-*-2
+
+         fcb   F$Mem
+         fdb   FMem-*-2
+
+         fcb   F$Send
+         fdb   FSend-*-2
+
+         fcb   F$Sleep
+         fdb   FSleep-*-2
+
+         fcb   F$Icpt
+         fdb   FIcpt-*-2
+
+         fcb   F$ID
+         fdb   FID-*-2
+
+         fcb   F$SPrior
+         fdb   FSPrior-*-2
+
+         fcb   F$SSwi
+         fdb   FSSwi-*-2
+
+         fcb   F$STime
+         fdb   FSTime-*-2
+
+         fcb   F$Find64+$80
+         fdb   FFind64-*-2
+
+         fcb   F$All64+$80
+         fdb   FAll64-*-2
+
+         fcb   F$Ret64+$80
+         fdb   FRet64-*-2
+
+         fcb   $80
+
+start    equ   *
+* install system calls
+         leay  SvcTbl,pcr
+         os9   F$SSvc
+         ldx   <D.PrcDBT
+         os9   F$All64
+         bcs   L0081
+         stx   <D.PrcDBT
+         sty   <D.Proc
+         tfr   s,d
+         deca
+         ldb   #$01
+         std   P$ADDR,y
+         lda   #SysState
+         sta   P$State,y
+         ldu   <D.Init
+         bsr   ChdDir
+         bcc   L006A
+         lbsr  JmpBoot
+         bsr   ChdDir
+L006A    bsr   OpenCons
+         bcc   L0073
+         lbsr  JmpBoot
+         bsr   OpenCons
+L0073    ldd   InitStr,u
+         leax  d,u
+         lda   #$01
+         clrb
+         ldy   #$0000
+         os9   F$Chain
+L0081    jmp   [<$FFFE]
+
+*
+* U = address of init module
+ChdDir   clrb
+         ldd   <SysStr,u		get system device
+         beq   ChdDir10			branch if none
+         leax  d,u
+         lda   #READ.+EXEC.
+         os9   I$ChgDir			else change directory to it
+ChdDir10 rts
+
+* open console device
+* U = address of init module
+OpenCons clrb
+         ldd   <StdStr,u
+         leax  d,u
+         lda   #UPDAT.
+         os9   I$Open
+         bcs   OpenCn10
+         ldx   <D.Proc			get process descriptor
+         sta   P$Path+0,x		save path to console to stdin...
+         os9   I$Dup
+         sta   P$Path+1,x		...stdout
+         os9   I$Dup
+         sta   P$Path+2,x		...and stderr
+OpenCn10 rts
+
+FUnlink  ldd   R$U,u			D = ptr to module to unlink
+         beq   L00F9
+         ldx   <D.ModDir		X = ptr to 1st module dir entry
+L00B8    cmpd  MD$MPtr,x	 	module match?
+         beq   L00C5			branch if so
+         leax  MD$ESize,x		go to next entry
+         cmpx  <D.ModDir+2		is this end?
+         bcs   L00B8			if not, go check next entry for match
+         bra   L00F9			else exit
+L00C5    lda   MD$Link,x		get link count
+         beq   L00CE			branch if zero
+         deca				else decrement by one
+         sta   MD$Link,x		and save count
+         bne   L00F9			branch if post-dec wasn't zero
+* If here, deallocate module
+L00CE    ldy   MD$MPtr,x		get module pointer
+         cmpy  <D.BTLO			compare against boot lo mem
+         bcc   L00F9
+         ldb   M$Type,y			get type of module
+         cmpb  #FlMgr			is it a file manager?
+         bcs   L00E5			branch if not
+         os9   F$IODel			determine if I/O module is in use
+         bcc   L00E5			branch if not
+         inc   MD$Link,x		else cancel out prior dec
+         bra   L00FA			and exit call
+L00E5    clra
+         clrb
+         std   MD$MPtr,x		clear out moddir entry's module address
+         std   M$ID,y			and destroy module's first 2 bytes
+         ldd   M$Size,y			get size of module in D
+         lbsr  L0236
+         exg   d,y
+         exg   a,b
+         ldx   <D.FMBM			get free mem bitmap ptr
+         os9   F$DelBit			delete the corresponding bits
+L00F9    clra
+L00FA    rts
+
+FWait    ldy   <D.Proc
+         ldx   <D.PrcDBT
+         lda   P$CID,y
+         bne   L0108
+         comb
+         ldb   #E$NoChld
+         rts
+L0108    os9   F$Find64
+         lda   P$State,y
+         bita  #Dead                   dead?
+         bne   L0124                   branch if so
+         lda   P$SID,y                 siblings?
+         bne   L0108                   branch if so
+         clr   R$A,u
+         ldx   <D.Proc
+         orcc  #FIRQMask+IRQMask
+         ldd   <D.WProcQ
+         std   P$Queue,x
+         stx   <D.WProcQ
+         lbra  L034D
+L0124    ldx   <D.Proc
+L0126    lda   P$ID,y
+         ldb   <P$Signal,y
+         std   R$A,u
+         pshs  u,y,x,a
+         leay  P$PID,x
+         ldx   <D.PrcDBT
+         bra   L0138
+L0135    os9   F$Find64
+L0138    lda   P$SID,y
+         cmpa  ,s
+         bne   L0135
+         ldu   $03,s
+         ldb   $02,u
+         stb   $02,y
+         os9   F$Ret64
+         puls  pc,u,y,x,a
+
+FExit    ldx   <D.Proc
+         ldb   R$B,u
+         stb   P$Signal,x
+         ldb   #NumPaths
+         leay  P$PATH,x
+L0155    lda   ,y+
+         beq   L0160
+         pshs  b
+         os9   I$Close
+         puls  b
+L0160    decb
+         bne   L0155
+         lda   P$ADDR,x
+         tfr   d,u
+         lda   P$PagCnt,x
+         os9   F$SRtMem
+         ldu   P$PModul,x
+         os9   F$UnLink
+         ldu   <D.Proc
+         leay  P$PID,u
+         ldx   <D.PrcDBT
+         bra   L018C
+L017A    clr   $02,y
+         os9   F$Find64
+         lda   P$State,y
+         bita  #Dead                   dead?
+         beq   L018A                   branch if not
+         lda   ,y
+         os9   F$Ret64
+L018A    clr   P$PID,y
+L018C    lda   P$SID,y
+         bne   L017A
+         ldx   #$0041
+         lda   P$PID,u
+         bne   L01A4
+         ldx   <D.PrcDBT
+         lda   P$ID,u
+         os9   F$Ret64
+         bra   L01C2
+L01A0    cmpa  ,x
+         beq   L01B2
+L01A4    leay  ,x                      Y = proc desc ptr
+         ldx   P$Queue,x
+         bne   L01A0
+         lda   P$State,u
+         ora   #Dead
+         sta   P$State,u
+         bra   L01C2
+L01B2    ldd   P$Queue,x
+         std   P$Queue,y
+         os9   F$AProc
+         leay  ,u
+         ldu   P$SP,x
+         ldu   $01,u
+         lbsr  L0126
+L01C2    clra
+         clrb
+         std   <D.Proc
+         rts
+
+FMem     ldx   <D.Proc
+         ldd   R$A,u
+         beq   L0227
+         bsr   L0236
+         subb  P$PagCnt,x
+         beq   L0227
+         bcs   L0207
+         tfr   d,y
+         ldx   P$ADDR,x
+         pshs  u,y,x
+         ldb   ,s
+         beq   L01E1
+         addb  $01,s
+L01E1    ldx   <D.FMBM
+         ldu   <D.FMBM+2
+         os9   F$SchBit
+         bcs   L0231
+         stb   $02,s
+         ldb   ,s
+         beq   L01F6
+         addb  $01,s
+         cmpb  $02,s
+         bne   L0231
+L01F6    ldb   $02,s
+         os9   F$AllBit
+         ldd   $02,s
+         suba  $01,s
+         addb  $01,s
+         puls  u,y,x
+         ldx   <D.Proc
+         bra   L0225
+
+L0207    negb
+         tfr   d,y
+         negb
+         addb  $08,x
+         addb  $07,x
+         cmpb  $04,x
+         bhi   L0217
+         comb
+         ldb   #E$DelSP
+         rts
+
+L0217    ldx   <D.FMBM
+         os9   F$DelBit
+         tfr   y,d
+         negb
+         ldx   <D.Proc
+         addb  P$PagCnt,x
+         lda   P$ADDR,x
+L0225    std   P$ADDR,x
+L0227    lda   P$PagCnt,x
+         clrb
+         std   $01,u
+         adda  P$ADDR,x
+         std   $06,u
+         rts
+L0231    comb
+         ldb   #E$MemFul
+         puls  pc,u,y,x
+
+L0236    addd  #$00FF
+         clrb
+         exg   a,b
+         rts
+
+FSend    lda   R$A,u
+         bne   L024F
+         inca
+L0242    ldx   <D.Proc
+         cmpa  P$ID,x
+         beq   L024A
+         bsr   L024F
+L024A    inca
+         bne   L0242
+         clrb
+         rts
+
+L024F    ldx   <D.PrcDBT
+         os9   F$Find64
+         bcc   L025E
+         ldb   #E$IPrcID
+         rts
+
+L0259    comb
+         ldb   #E$IPrcID
+         puls  pc,y,a
+
+L025E    pshs  y,a
+         ldb   P$SID,u
+         bne   L0275
+         ldx   <D.Proc
+         ldd   P$User,x
+         beq   L026F
+         cmpd  P$User,y
+         bne   L0259
+L026F    lda   P$State,y
+         ora   #Condem
+         sta   P$State,y
+L0275    orcc  #FIRQMask+IRQMask
+         lda   <P$Signal,y
+         beq   L0284
+         deca
+         beq   L0284
+         comb
+         ldb   #E$USigP
+         puls  pc,y,a
+
+L0284    ldb   P$SID,u
+         stb   <P$Signal,y
+         ldx   #$0043
+         bra   L02B4
+L028E    cmpx  $01,s
+         bne   L02B4
+         lda   P$State,x
+         bita  #$40
+         beq   L02C7
+         ldu   P$SP,x
+         ldd   R$X,u
+         beq   L02C7
+         ldu   P$Queue,x
+         beq   L02C7
+         pshs  b,a
+         lda   P$State,u
+         bita  #$40
+         puls  b,a
+         beq   L02C7
+         ldu   P$SP,u
+         addd  P$SP,u
+         std   P$SP,u
+         bra   L02C7
+L02B4    leay  ,x
+         ldx   P$Queue,y
+         bne   L028E
+         ldx   #$0041
+L02BD    leay  ,x
+         ldx   P$Queue,y
+         beq   L02D7
+         cmpx  $01,s
+         bne   L02BD
+L02C7    ldd   P$Queue,x
+         std   P$Queue,y
+         lda   <P$Signal,x
+         deca
+         bne   L02D4
+         sta   <P$Signal,x
+L02D4    os9   F$AProc
+L02D7    clrb
+         puls  pc,y,a
+
+* F$Sleep
+FSleep   ldx   <D.Proc                 get pdesc
+         orcc  #FIRQMask+IRQMask       mask ints
+         lda   P$Signal,x              get proc signal
+         beq   L02EE                   branch if none
+         deca                          dec signal
+         bne   L02E9                   branch if not S$Wake
+         sta   P$Signal,x              clear signal
+L02E9    os9   F$AProc                 insert into activeq
+         bra   L034D
+L02EE    ldd   R$X,u                   get timeout
+         beq   L033A                   branch if forever
+         subd  #$0001                  subtract 1
+         std   R$X,u                   save back to caller
+         beq   L02E9                   branch if give up tslice
+         pshs  u,x
+         ldx   #$0043
+L02FE    leay  ,x
+         ldx   P$Queue,x
+         beq   L0316
+         pshs  b,a
+         lda   P$State,x
+         bita  #TimSleep
+         puls  b,a
+         beq   L0316
+         ldu   P$SP,x
+         subd  $04,u
+         bcc   L02FE
+         addd  $04,u
+L0316    puls  u,x
+         std   R$X,u
+         ldd   P$Queue,y
+         stx   P$Queue,y
+         std   P$Queue,x
+         lda   P$State,x
+         ora   #TimSleep
+         sta   P$State,x
+         ldx   P$Queue,x
+         beq   L034D
+         lda   P$State,x
+         bita  #TimSleep
+         beq   L034D
+         ldx   P$SP,x
+         ldd   P$SP,x
+         subd  R$X,u
+         std   P$SP,x
+         bra   L034D
+L033A    lda   P$State,x
+         anda  #^TimSleep
+         sta   P$State,x
+         ldd   #$0043
+L0343    tfr   d,y
+         ldd   P$Queue,y
+         bne   L0343
+         stx   P$Queue,y
+         std   P$Queue,x
+L034D    leay  <L0361,pcr
+         pshs  y
+         ldy   <D.Proc
+         ldd   P$SP,y
+         ldx   R$X,u
+         pshs  u,y,x,dp,b,a,cc
+         sts   P$SP,y
+         os9   F$NProc
+L0361    std   P$SP,y
+         stx   R$X,u
+         clrb
+         rts
+
+* F$Icpt
+FIcpt    ldx   <D.Proc                 get pdesc
+         ldd   R$X,u                   get addr of icpt rtn
+         std   <P$SigVec,x             store in pdesc
+         ldd   R$U,u                   get data ptr
+         std   <P$SigDat,x             store in pdesc
+         clrb
+         rts
+
+* F$SPrior
+FSPrior  lda   R$A,u                   get ID
+         ldx   <D.PrcDBT               find pdesc
+         os9   F$Find64
+         bcs   FSPrEx                  branch if can't find
+         ldx   <D.Proc                 get pdesc
+         ldd   P$User,x                get user ID
+         cmpd  P$User,y                same as dest pdesc
+         bne   FSPrEx                  branch if not, must be owner
+         lda   R$B,u                   else get prior
+         sta   P$Prior,y               and store it in dest pdesc
+         rts
+FSPrEx   comb
+         ldb   #E$IPrcID
+         rts
+
+* F$ID
+FID      ldx   <D.Proc                 get proc desc
+         lda   P$ID,x                  get id
+         sta   R$A,u                   put in A
+         ldd   P$User,x                get user ID
+         std   R$Y,u                   store in Y
+         clrb
+         rts
+
+* F$SSwi
+FSSwi    ldx   <D.Proc
+         leay  P$SWI,x
+         ldb   R$A,u
+         decb
+         cmpb  #$03
+         bcc   FSSwiEx
+         lslb
+         ldx   R$X,u
+         stx   b,y
+         rts
+FSSwiEx  comb
+         ldb   #E$ISWI
+         rts
+
+ClkName  fcs   /Clock/
+
+* F$STime
+FSTime   ldx   R$X,u
+         ldd   ,x
+         std   <D.Year
+         ldd   2,x
+         std   <D.Day
+         ldd   4,x
+         std   <D.Min
+         lda   #Systm+Objct
+         leax  <ClkName,pcr
+         os9   F$Link
+         bcs   L03D2
+         jmp   ,y
+         clrb
+L03D2    rts
+
+* F$Find64
+FFind64  lda   R$A,u
+         ldx   R$X,u
+         bsr   L03DF
+         bcs   L03DE
+         sty   R$Y,u
+L03DE    rts
+
+L03DF    pshs  b,a
+         tsta
+         beq   L03F3
+         clrb
+         lsra
+         rorb
+         lsra
+         rorb
+         lda   a,x
+         tfr   d,y
+         beq   L03F3
+         tst   ,y
+         bne   L03F4
+L03F3    coma
+L03F4    puls  pc,b,a
+
+* F$All64
+FAll64   ldx   R$X,u
+         bne   L0402
+         bsr   L040C
+         bcs   L040B
+         stx   ,x
+         stx   R$X,u
+L0402    bsr   L0422
+         bcs   L040B
+         sta   R$A,u
+         sty   R$Y,u
+L040B    rts
+
+L040C    pshs  u
+         ldd   #$0100
+         os9   F$SRqMem
+         leax  ,u
+         puls  u
+         bcs   L0421
+         clra
+         clrb
+L041C    sta   d,x
+         incb
+         bne   L041C
+L0421    rts
+
+L0422    pshs  u,x
+         clra
+L0425    pshs  a
+         clrb
+         lda   a,x
+         beq   L0437
+         tfr   d,y
+         clra
+L042F    tst   d,y
+         beq   L0439
+         addb  #$40
+         bcc   L042F
+L0437    orcc  #Carry
+L0439    leay  d,y
+         puls  a
+         bcc   L0464
+         inca
+         cmpa  #$40
+         bcs   L0425
+         clra
+L0445    tst   a,x
+         beq   L0453
+         inca
+         cmpa  #$40
+         bcs   L0445
+         ldb   #E$PthFul
+         coma
+         bra   L0471
+L0453    pshs  x,a
+         bsr   L040C
+         bcs   L0473
+         leay  ,x
+         tfr   x,d
+         tfr   a,b
+         puls  x,a
+         stb   a,x
+         clrb
+L0464    lslb
+         rola
+         lslb
+         rola
+         ldb   #$3F
+L046A    clr   b,y
+         decb
+         bne   L046A
+         sta   ,y
+L0471    puls  pc,u,x
+L0473    leas  3,s
+         puls  pc,u,x
+
+* F$Ret64
+FRet64   lda   R$A,u
+         ldx   R$X,u
+         pshs  u,y,x,b,a
+         clrb
+         lsra
+         rorb
+         lsra
+         rorb
+         pshs  a
+         lda   a,x
+         beq   L04A0
+         tfr   d,y
+         clr   ,y
+         clrb
+         tfr   d,u
+         clra
+Ret64Lp  tst   d,u
+         bne   Ret64Ex
+         addb  #64
+         bne   Ret64Lp
+         inca
+         os9   F$SRtMem
+         lda   ,s
+         clr   a,x
+L04A0
+Ret64Ex  clr   ,s+
+         puls  pc,u,y,x,b,a
+
+IOMgr    fcs   /IOMAN/
+
+IOCall   pshs  u,y,x,b,a
+         ldu   <D.Init                 get ptr to init
+         bsr   LinkIOM                 link to IOMan
+         bcc   JmpIOM                  jump into him if ok
+         bsr   JmpBoot                 try boot
+         bcs   IOCallRt                problem booting... return w/ error
+         bsr   LinkIOM                 ok, NOW link to IOMan
+         bcs   IOCallRt                still a problem...
+JmpIOM   jsr   ,y
+         puls  u,y,x,b,a
+         ldx   -2,y
+         jmp   ,x
+IOCAllRt puls  pc,u,y,x,b,a
+
+LinkIOM  leax  IOMgr,pcr
+         lda   #Systm+Objct
+         os9   F$Link
+         rts
+
+*
+* U = address of init module
+JmpBoot  pshs  u
+         comb
+         tst   <D.Boot                 already booted?
+         bne   JmpBtEr                 yep, return to caller...
+         inc   <D.Boot                 else set boot flag
+         ldd   <BootStr,u              get pointer to boot str
+         beq   JmpBtEr                 if none, return to caller
+         leax  d,u                     X = ptr to boot mod name
+         lda   #Systm+Objct
+         os9   F$Link                  link
+         bcs   JmpBtEr                 return if error
+         jsr   ,y                      ...else jsr into boot module
+* D = size of bootfile
+* X = address of bootfile
+         bcs   JmpBtEr                 return if error
+         stx   <D.MLIM
+         stx   <D.BTLO
+         leau  d,x
+         stu   <D.BTHI
+* search through bootfile and validate modules
+ValBoot  ldd   ,x
+         cmpd  #M$ID12
+         bne   ValBoot1
+         os9   F$VModul
+         bcs   ValBoot1
+         ldd   M$Size,x
+         leax  d,x                     move X to next module
+         bra   ValBoot2
+ValBoot1 leax  1,x                     advance one byte
+ValBoot2 cmpx  <D.BTHI
+         bcs   ValBoot
+JmpBtEr  puls  pc,u
+
+         emod
+eom      equ   *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/kernel/makefile	Thu Dec 11 23:47:53 2003 +0000
@@ -0,0 +1,27 @@
+include ../../../rules.mak
+
+DEPENDS		= ./makefile
+
+KERNEL		= kernel
+KERNELP2	= kernelp2
+SYSCALLS	= fcmpnam.asm fprsnam.asm
+
+ALLOBJS		= $(KERNEL) $(KERNELP2)
+
+all:	$(ALLOBJS)
+
+$(KERNEL):	kernel.asm $(SYSCALLS)
+
+$(KERNELP2):	kernelp2.asm $(SYSCALLS)
+
+clean:
+	$(RM) $(ALLOBJS)
+
+showobjs:
+	@$(ECHO) $(ALLOBJS)
+
+showcopyobjs:
+	@$(ECHO) $(COPYOBJS)
+
+identify:
+	$(IDENT_SHORT) $(ALLOBJS)
--- a/level1/modules/makefile	Thu Dec 11 23:00:04 2003 +0000
+++ b/level1/modules/makefile	Thu Dec 11 23:47:53 2003 +0000
@@ -44,6 +44,11 @@
 
 # Special cases
 
+# Kernel
+kernel kernelp2:
+	$(CD) krnl; make $@
+	$(CP) krnl/$@ .
+
 boot_1773_6ms:	boot_1773.asm
 	$(AS) $< $(ASOUT)$@ $(AFLAGS) -aDNum=0 -aSTEP=0