File: mem.asm - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

001: ;===============================================================================
002: ;
003: ;       FreeObjectHandles
004: ;
005: ;       Free all handles used while assembling a source
006: ;
007: ;       in      fp      Stack frame
008: ;
009: ;       out     nothing
010: ;
011: ;       destroy d0-d2/a0-a1
012: ;
013: ;===============================================================================
014: 
015: FreeObjectHandles:
016:         move.w  BIN_HD(fp),d0
017:         bsr     FreeHandle
018:         clr.w   BIN_HD(fp)
019: 
020:         move.w  LABELS_HD(fp),d0
021:         bsr.s   FreeHandle
022:         clr.w   LABELS_HD(fp)
023: 
024:         rts
025: 
026: 
027: ;===============================================================================
028: ;
029: ;       FreeHandle
030: ;
031: ;       Free an handle, deleting the file if it belongs to one
032: ;       Return without error if Handle is H_NULL
033: ;
034: ;       in      d0.w    Handle
035: ;               fp      Stack frame
036: ;
037: ;       out     nothing
038: ;
039: ;       destroy d0-d2/a0-a1
040: ;
041: ;===============================================================================
042: 
043: FreeHandle:
044:         move.w  d0,-(sp)
045:         beq.s    \End
046:         RAMT    RAM_kernel::Hd2Sym
047:         move.l  a0,d0
048:         bne.s   \FreeFile
049:                 ROMT    HeapFree        ; No symbol associated to this handle, free it
050:                 bra.s   \End
051: \FreeFile:                              ; A file is associated to the handle, its SYM_ENTRY is at a0
052:         pea     (a0)
053:         jsr     UNLINK(fp)
054:         addq.l  #4,sp
055: \End:   addq.l  #2,sp
056:         rts
057: 
058: 
059: ;===============================================================================
060: ;
061: ;       AllocHandle
062: ;
063: ;       Allocate an handle on the heap
064: ;       Will call NeedRAM if first attempt fails. NeedRAM checks is swapping is allowed
065: ;       Will call MainExit if the handle could not be allocated
066: ;
067: ;       in      d0.l    size
068: ;               fp      Stack frame
069: ;
070: ;       out     d0.w    handle
071: ;               a0      ptr to the handle
072: ;
073: ;       destroy d0-d2/a0-a1
074: ;
075: ;===============================================================================
076: 
077: AllocHandle:
078:         move.l  d0,-(sp)
079:         move.l  d0,-(sp)
080:         ROMT    HeapAlloc
081:         addq.l  #4,sp
082:         tst.w   d0
083:         bne.s   \End
084:                 moveq.l #0,d0           ; We can archive all
085:                 bsr     NeedRAM
086:                 ROMT    HeapAlloc
087:                 tst.w   d0
088:                 bne.s   \End
089:                         move.w  #ERROR_MEMORY,ERROR(fp)
090:                         pea     StrErrorMemory(pc)
091:                         bsr     PrintToStderr
092:                         bra     MainExit
093: \End:   movea.w d0,a0
094:         trap    #3
095:         addq.l  #4,sp
096:         rts
097: 
098: 
099: ;===============================================================================
100: ;
101: ;       ReallocHandle
102: ;
103: ;       Reallocate an handle on the heap
104: ;
105: ;       SwapOut is automatically called for this handle
106: ;       Call NeedRAM if first attempt fails. NeedRAM checks is swapping is allowed
107: ;       Call MainExit if the handle could not be allocated
108: ;
109: ;       in      d0.l    size
110: ;               d1.w    handle
111: ;               fp      Stack frame
112: ;
113: ;       out     d0.w    handle
114: ;               a0      ptr to the handle
115: ;
116: ;       destroy d0-d2/a0-a1
117: ;===============================================================================
118: 
119: ReallocHandle:
120:         move.l  d0,-(sp)
121:         move.w  d1,-(sp)
122:         move.l  d0,-(sp)
123:         move.w  d1,-(sp)
124: 
125:         move.w  d1,d0
126:         bsr     SwapOut
127: 
128:         jsr     REALLOC(fp)             ; Use Pedrom's realloc to allow files larger than 64 kb
129:         addq.l  #6,sp
130:         tst.w   d0
131:         bne.s   \End
132:                 move.w  (sp),d0         ; This handle musn't be swapped !
133:                 bsr     NeedRAM
134:                 jsr     REALLOC(fp)
135:                 tst.w   d0
136:                 bne.s   \End
137:                         move.w  #ERROR_MEMORY,ERROR(fp)
138:                         pea     StrErrorMemory(pc)
139:                         bsr     PrintToStderr
140:                         bra     MainExit
141: \End:   movea.w d0,a0
142:         trap    #3
143:         addq.l  #6,sp
144:         rts
145: 
146: 
147: ;===============================================================================
148: ;
149: ;       NeedRAM
150: ;
151: ;       Swap all possible data in flash, if allowed by the flag
152: ;       This function is called only by AllocHandle and ReallocHandle
153: ;       It won't throw an error if nothing can be swapped, calling functions will do that
154: ;
155: ;       in      d0.w    Handle which musn't be swapped in case of reallocation
156: ;                       Set to 0 by swapout to prevent a random file to be not swapped in
157: ;               fp      Stack frame
158: ;
159: ;       out     nothing
160: ;
161: ;       destroy nothing
162: ;
163: ;===============================================================================
164: 
165: NeedRAM:
166:         movem.l d0-d5/a0-a1,-(sp)
167:         move.w  d0,d3
168: 
169:         ;----------------------------------------------------------------------
170:         ;       Check if swapping is allowed
171:         ;----------------------------------------------------------------------
172: 
173:         movea.l CURRENT_FLAGS_PTR(fp),a0
174:         move.l  (a0),d0
175:         btst.l  #BIT_SWAP,d0
176:         beq.s   \End
177: 
178:         ;----------------------------------------------------------------------
179:         ;       Try to swap all availables handles and files
180:         ;       It doesn't matter if all files are not really put in flash, the
181:         ;       next (re)allocation will fail, that's all.
182:         ;       So don't check if something is really performed
183:         ;----------------------------------------------------------------------
184: 
185:         ;----------------------------------------------------------------------
186:         ;       Swap sources files
187:         ;----------------------------------------------------------------------
188: 
189:         move.w  FILES_LIST_HD(fp),d4
190:         moveq.l #0,d5
191: 
192: \Loop:  movea.w d4,a0
193:         trap    #3
194:         cmp.w   (a0)+,d5
195:         beq.s   \EndLoop
196:                 move.w  d5,d0
197:                 mulu.w  #FILE.sizeof,d0
198:                 move.w  FILE.Handle(a0,d0.l),d0 ; SwapIn () needs the Z-Flag to be set if the handle exists, so don't change that !
199:                 bsr.s   \SwapIn
200:                 addq.w  #1,d5
201:                 bra.s   \Loop
202: \EndLoop:
203: 
204:         ;----------------------------------------------------------------------
205:         ;       Swap objects handles
206:         ;----------------------------------------------------------------------
207: 
208:         move.w  FILES_LIST_HD(fp),d0
209:         bsr.s   \SwapIn                         ; SwapIn () needs the Z-Flag to be set if the handle exists, so don't change that !
210: 
211:         move.w  BIN_HD(fp),d0
212:         bsr.s   \SwapIn
213: 
214:         move.w  LABELS_HD(fp),d0
215:         bsr.s   \SwapIn
216: 
217: \End:   movem.l (sp)+,d0-d5/a0-a1
218:         rts
219: 
220: 
221: ;-------------------------------------------------------------------------------
222: ;       Swap a file :
223: ;       - chekc that the handle exists
224: ;       - check that the handle mustn't be kept in RAM
225: ;       -       get a tmp filename if the handle doesn't belong to a file
226: ;       -       create a file and give it the handle
227: ;       - archive the file
228: ;
229: ;       This function is called only by NeedRAM
230: ;-------------------------------------------------------------------------------
231: 
232: \SwapIn:
233:         beq.s   \NoSwapIn                       ; Handle not created yep (Z-flag already set)
234:         cmp.w   d0,d3                           ; Handle currently reallocated : don't swap it
235:         beq.s   \NoSwapIn
236:                 lea     -18(sp),sp              ; Frame buffer for pdtlib::Hd2FullName
237:                 movea.l sp,a0
238:                 move.w  d0,d2                   ; Save handle
239:                 jsr     HD_2_FULL_NAME(fp)
240:                 tst.w   d0
241:                 bne.s   \ArchiveFile            ; This handle already belongs to a file
242:                         move.w  d2,-(sp)        ; Save Hd
243:                         suba.l  a0,a0           ; Use PedroM internal buffer
244:                         jsr     TMPNAM(fp)      ; We don't care about the filename itself and don't have to save it
245:                         move.w  (sp)+,d0        ; Hd
246:                         pea     (a0)            ; Save filename
247:                         jsr     CREATE_FILE(fp)
248:                         movea.l (sp)+,a0        ; Filename
249:                         tst.w   d0
250:                         beq.s   \Fail
251: 
252: \ArchiveFile:   jsr     ARCHIVE_FILE(fp)
253: \Fail:          lea     18(sp),sp
254: \NoSwapIn:
255:         rts
256: 
257: 
258: ;===============================================================================
259: ;
260: ;       SwapOut
261: ;
262: ;       Swap an handle in RAM. If it fails, call NeedRAM, then retry.
263: ;       If it fails again, throw an error and call Main Exit
264: ;
265: ;       in      d0.w    Handle which must be swapped in RAM
266: ;               fp      Stack frame
267: ;
268: ;       out     nothing
269: ;
270: ;       destroy nothing
271: ;
272: ;===============================================================================
273: 
274: SwapOut:
275:         movem.l d0-d3/a0-a2,-(sp)
276:         move.w  d0,d3
277: 
278:         ;----------------------------------------------------------------------
279:         ;       Check if the file is already in RAM
280:         ;----------------------------------------------------------------------
281: 
282:         movea.w d0,a0
283:         trap    #3
284:         cmpa.l  ROM_BASE(fp),a0
285:         bcs.s   \End                    ; Already in RAM
286: 
287:         ;----------------------------------------------------------------------
288:         ;       Try twice to pop in RAM. Call NeedRAM if first attempt fails
289:         ;----------------------------------------------------------------------
290: 
291:         bsr.s   \Unarchive
292:         bne.s   \End
293:         bsr     NeedRAM                 ; d0 already set to 0
294:         bsr.s   \Unarchive
295:         bne.s   \End
296: 
297:         ;----------------------------------------------------------------------
298:         ;       Failed. Throw an error and quit
299:         ;----------------------------------------------------------------------
300: 
301:         move.w  #ERROR_MEMORY,ERROR(fp)
302:         pea     StrErrorMemory(pc)
303:         bsr     PrintToStderr
304:         bra     MainExit
305: 
306:         ;----------------------------------------------------------------------
307:         ;       Success
308:         ;----------------------------------------------------------------------
309: 
310: \End:   movem.l (sp)+,d0-d3/a0-a2
311:         rts
312: 
313:         ;----------------------------------------------------------------------
314:         ;       Unarchive a file. Z-flag set according to success
315:         ;----------------------------------------------------------------------
316: 
317: \Unarchive:
318:         lea     -18(sp),sp              ; Buffer for pdtlib::Hd2FullName
319:         move.w  d3,d0                   ; Handle
320:         movea.l sp,a0
321:         jsr     HD_2_FULL_NAME(fp)
322:         jsr     UNARCHIVE_FILE(fp)
323:         tst.w   d0
324:         lea     18(sp),sp
325:         rts