OBJECT memi
  task, size, type, ret
ENDOBJECT

MODULE 'exec/nodes','exec/memory'

DEF list[256]:ARRAY OF memi, oldptr, task, size, type, ret, missed

CONST MIN=128 -> allocs < 128 bytes are not written (efficiency!)

PROC main()
  DEF mem:PTR TO memi,cnt
  LEA globvec(PC),A3; MOVE.L A4,(A3) -> this is the global variables ptr
  SetTaskPri(FindTask(NIL),-40)
  WriteF('MemPatch v1.0 by Kyzer/CSG. Press CTRL-C to end.\n\s\n\s\n',
  'Taskname                      | Size wanted     | Flags   | Result',
  '------------------------------|-----------------|---------|----------')
  FOR cnt:=0 TO 255 DO list[cnt].task:=0
  oldptr:=SetFunction(execbase,-198,{patch})
  WHILE CtrlC()=0
    Delay(1)
    IF missed
       WriteF('Missed \d allocations\n',missed)
       missed:=0
    ENDIF
    FOR cnt:=0 TO 255
      mem:=list[cnt]
      IF mem.task
        WriteF('\l\s[30]| \d[16]| \s\s\s\s\s\s\s | $\h\n',
        (IF mem.task::ln.name THEN mem.task::ln.name ELSE 'no valid name'),
        mem.size,
        (IF mem.type AND MEMF_PUBLIC   THEN 'P' ELSE '-'),
        (IF mem.type AND MEMF_CHIP     THEN 'C' ELSE '-'),
        (IF mem.type AND MEMF_FAST     THEN 'F' ELSE '-'),
        (IF mem.type AND MEMF_LOCAL    THEN 'L' ELSE '-'),
        (IF mem.type AND MEMF_24BITDMA THEN 'D' ELSE '-'),
        (IF mem.type AND MEMF_CLEAR    THEN 'X' ELSE '-'),
        (IF mem.type AND MEMF_REVERSE  THEN 'R' ELSE '-'),
        mem.ret)
        mem.task:=0
      ENDIF
    ENDFOR
  ENDWHILE
  WriteF('Finished.\n')
  SetFunction(execbase,-198,oldptr)
ENDPROC

patch:
  MOVEM.L D1-D7/A0-A6,-(A7)
  LEA     globvec(PC),A3
  MOVE.L  (A3),A4

  MOVE.L  276(A6),task
  MOVE.L  D0,size
  MOVE.L  D1,type
  MOVE.L  oldptr,A3
  JSR     (A3)
  MOVE.L  D0,ret
  CMP.L   #MIN,size
  BLS.S   noput
  MOVE.L  list,A3
  MOVE.L  #255,D1
loop:
  TST.L   (A3)
  BEQ.S   put
  ADD.L   #SIZEOF memi,A3
  DBRA    D1,loop
  ADD.L   #1,missed
  BRA.S   noput
put:
  MOVE.L  task,(A3)+
  MOVE.L  size,(A3)+
  MOVE.L  type,(A3)+
  MOVE.L  ret, (A3)
noput:
  MOVE.L  ret,D0
  MOVEM.L (A7)+,D1-D7/A0-A6
  RTS
globvec: LONG 0
