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