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