diff level1/modules/kernel/krnp2.asm @ 1453:5dbf908c1483

Kernel and KernelP2 moved to krnl/
author boisy
date Thu, 11 Dec 2003 23:47:53 +0000
parents
children 5f18094d961d
line wrap: on
line diff
--- /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   *