Mercurial > hg > Members > kono > nitros9-code
diff level2/modules/kernel/funload.asm @ 1145:ca83286ded5b
Start of new OS-9 L2 Kernel
author | boisy |
---|---|
date | Tue, 22 Apr 2003 19:35:48 +0000 |
parents | |
children | 1da8ab9ba433 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level2/modules/kernel/funload.asm Tue Apr 22 19:35:48 2003 +0000 @@ -0,0 +1,61 @@ +* F$UnLoad entry point +FUnLoad pshs u preserve register stack pointer + lda R$A,u get module type + ldx <D.Proc get current process pointer + leay P$DATImg,x point to DAT image + ldx R$X,u get pointer to name + os9 F$FModul find it in module directory + puls y restore register stack pointer + bcs L0A4F couldn't find it, return error + stx R$X,y save update name pointer + IFNE H6309 + ldw MD$Link,u get link count + beq L0A21 already 0 check if it's a I/O module + decw subtract 1 + stw MD$Link,u save it back + ELSE + ldx MD$Link,u get module link count + beq L0A21 branch if zero + leax -1,x else decrement + stx MD$Link,u + ENDC + bne L0A4E not zero, don't remove from memory, return + +* Link count is zero, check if module can be removed from memory +L0A21 cmpa #FlMgr is it a I/O module? + blo L0A4B no, remove module from memory + +* Special handling for I/O module deletion + clra + ldx [MD$MPDAT,u] get 1st 2 blocks in DAT image of module + ldy <D.SysDAT get pointer to system DAT image +L0A2B adda #2 + cmpa #DAT.ImSz done entire DAT? + bcc L0A4B yes, delete the module from memory + cmpx a,y find block? + bne L0A2B no, keep looking + lsla multiply by 16 to calculate the offset + lsla + lsla + lsla + clrb + addd MD$MPtr,u add in the pointer + tfr d,x copy it to X + os9 F$IODel delete the device from memory + bcc L0A4B no error, skip ahead + + IFNE H6309 + ldw MD$Link,u put link count back + incw + stw MD$Link,u + ELSE + ldx MD$Link,u put link count back + leax 1,x + stx MD$Link,u + ENDC + rts Return with error + +* Delete module from memory +L0A4B lbsr DelMod Delete module from memory +L0A4E clrb clear errors +L0A4F rts return