1145
|
1 * F$UnLoad entry point
|
|
2 FUnLoad pshs u preserve register stack pointer
|
|
3 lda R$A,u get module type
|
|
4 ldx <D.Proc get current process pointer
|
|
5 leay P$DATImg,x point to DAT image
|
|
6 ldx R$X,u get pointer to name
|
|
7 os9 F$FModul find it in module directory
|
|
8 puls y restore register stack pointer
|
|
9 bcs L0A4F couldn't find it, return error
|
|
10 stx R$X,y save update name pointer
|
|
11 IFNE H6309
|
|
12 ldw MD$Link,u get link count
|
|
13 beq L0A21 already 0 check if it's a I/O module
|
|
14 decw subtract 1
|
|
15 stw MD$Link,u save it back
|
|
16 ELSE
|
|
17 ldx MD$Link,u get module link count
|
|
18 beq L0A21 branch if zero
|
|
19 leax -1,x else decrement
|
|
20 stx MD$Link,u
|
|
21 ENDC
|
|
22 bne L0A4E not zero, don't remove from memory, return
|
|
23
|
|
24 * Link count is zero, check if module can be removed from memory
|
|
25 L0A21 cmpa #FlMgr is it a I/O module?
|
|
26 blo L0A4B no, remove module from memory
|
|
27
|
|
28 * Special handling for I/O module deletion
|
|
29 clra
|
|
30 ldx [MD$MPDAT,u] get 1st 2 blocks in DAT image of module
|
|
31 ldy <D.SysDAT get pointer to system DAT image
|
|
32 L0A2B adda #2
|
|
33 cmpa #DAT.ImSz done entire DAT?
|
|
34 bcc L0A4B yes, delete the module from memory
|
|
35 cmpx a,y find block?
|
|
36 bne L0A2B no, keep looking
|
|
37 lsla multiply by 16 to calculate the offset
|
|
38 lsla
|
|
39 lsla
|
|
40 lsla
|
|
41 clrb
|
|
42 addd MD$MPtr,u add in the pointer
|
|
43 tfr d,x copy it to X
|
|
44 os9 F$IODel delete the device from memory
|
|
45 bcc L0A4B no error, skip ahead
|
|
46
|
|
47 IFNE H6309
|
|
48 ldw MD$Link,u put link count back
|
|
49 incw
|
|
50 stw MD$Link,u
|
|
51 ELSE
|
|
52 ldx MD$Link,u put link count back
|
|
53 leax 1,x
|
|
54 stx MD$Link,u
|
|
55 ENDC
|
|
56 rts Return with error
|
|
57
|
|
58 * Delete module from memory
|
|
59 L0A4B lbsr DelMod Delete module from memory
|
|
60 L0A4E clrb clear errors
|
|
61 L0A4F rts return
|