summaryrefslogtreecommitdiff
path: root/programs/sub-suite/tmp-stuff/free-new.s
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2021-02-25 12:43:11 -0500
committermrb0nk500 <b0nk@b0nk.xyz>2021-02-25 12:43:11 -0500
commit35a18609864470b3dc49f3a9a6cb6ec93e57300d (patch)
treec52364211b25723b2cf4595ed6c4bc2d45195062 /programs/sub-suite/tmp-stuff/free-new.s
parent8d7f27d9a0b61d3694a62f3e54be885d8073f02b (diff)
- Implemented the multiply expression into the assembler.
- Implemented support for the SIB addressing mode into the assembler. SIB is short for "Scale Index, and Base", and works much like x86's version of SIB (scale*index+base), although my version supports any scale value between 1, and 256. - Redid the line shifting routine in SuBEditor. It now uses memcpy, and memset to do that, and also supports shifting the line left, or right by any number of characters.
Diffstat (limited to 'programs/sub-suite/tmp-stuff/free-new.s')
-rw-r--r--programs/sub-suite/tmp-stuff/free-new.s143
1 files changed, 0 insertions, 143 deletions
diff --git a/programs/sub-suite/tmp-stuff/free-new.s b/programs/sub-suite/tmp-stuff/free-new.s
deleted file mode 100644
index dad19d0..0000000
--- a/programs/sub-suite/tmp-stuff/free-new.s
+++ /dev/null
@@ -1,143 +0,0 @@
-.include "declare.s"
-
-.org 0
-
-; free: Free allocated memory.
-; Input: D = Pointer to allocated memory.
-; Output: none.
-; Caller preserved registers: D.
-; Callie preserved registers: A, B, X, Y, E.
-
-free:
- pha.q ; Preserve A.
- phb.q ; Preserve B.
- phx.q ; Preserve X.
- phy.q ; Preserve Y.
- phe.q ; Preserve E.
- and #0 ; Reset A.
- tab ; Reset B.
- tax ; Reset X.
- tay ; Reset Y.
- mov a, d ; Get the passed pointer.
- bne @getrealblk ; The pointer isn't NULL, so get the real block.
- bra @end ; The pointer is NULL, so we're done.
-@getrealblk:
- sub #8 ; Get the start of the used block.
- mov.q a, (a) ; Get the start of the real block.
- mov.q b, (a+ublk.size) ; Get the size of the real block.
- lea e, (a+b) ; Add the size of the real block with the start of the real block.
- cmp.q e, heapptr ; Is this block on top of the heap?
- bne @heapadd ; No, so add it to the free block list.
-@dectop:
- mov.q heapptr, (a) ; Set the top of the heap to the start of the previous real block.
-@chklastblk:
- mov.q b, heapl ; Get the last free list entry.
- beq @end ; The free list is empty, so we're done.
- ldy #fblk.size ; Get the size of the block.
- mov.q a, (b+fblk.size) ; Get the size of the block.
- lea e, (a+b) ; Add the size of the block, with the address of the block entry.
- cmp.q e, heapptr ; Is the last block on top of the heap?
- bne @end ; No, so we're done.
-@delblk:
- mov.q heapptr, b ; Yes, so remove the last block.
-@correctblk:
- mov.q a, (b+fblk.prev) ; Get the previous block.
- sta.q heapl ; Set the last block to the previous block.
- bne @delnxtblk ; The previous block isn't NULL, so delete the next block.
- sta.q heapf ; The previous block is NULL, so empty the free list.
- bra @end ; We are done.
-@delnxtblk:
- lea e, (a+fblk.next) ; Delete the next block.
- stz.q (e) ;
-@end:
- ple.q ; Restore E.
- ply.q ; Restore Y.
- plx.q ; Restore X.
- plb.q ; Restore B.
- pla.q ; Restore A.
- rts ; End of free.
-
-
-@heapadd:
- mov.q y, heapf ; Get the first block.
- bne @srchflst ; The Free list isn't empty, so start searching the free list.
-@empty:
- mov.q (a+fblk.next), y ; Clear the next block.
- mov.q (a+fblk.prev), y ; Clear the previous block.
- sta.q heapf ; Set the first block entry to the current block.
- sta.q heapl ; Set the last block entry to the current block.
- bra @end ; We are done.
-@srchflst:
-@loop:
- cmp y, a ; Is the right pointer at, or below the current block?
- beq @nextright ; Yes, so get the next right pointer.
- bcs @chkrmerge ; No, so do the right block merge.
-@nextright:
- tyx ; Set the left pointer, to the right pointer.
- mov.q y, (y+fblk.next) ; Set the current right pointer to the next right pointer.
- bne @loop ; The next right pointer isn't NULL, so keep looping.
-@st_lmerge2:
- mov.q (a+fblk.next), y ; Clear the next block.
- sta.q heapl ; Set the last free block entry to it.
- bra @chklmerge2 ; Do the left block merge.
-@chkrmerge:
- lea e, (a+b) ; Add the size of the current block, to the current block.
- cmp e, y ; Is the current block the same as the right block?
- bne @normerge ; No, so don't merge the right block.
-@rmerge:
- mov e, b ; Get the size of the current block.
- add.q e, (y+fblk.size) ; Add the size of the current block, with the size of the right pointer.
- mov.q (a+fblk.size), e ; Set the size of the current block, to the new size.
-@rmerge2:
- lea fblk.next ; Get the next right pointer.
- mov.q (a+e), (y+e) ; Set the next block, to the next right pointer.
- mov.q b, (y+e) ; Save the next block.
- beq @setheapl ; The next block is NULL, so set the last block.
-@setprev:
- mov.q (b+fblk.prev), a ; Set the previous block to the current block.
- bra @chklmerge ; Do the left block merge.
-@setheapl:
- sta.q heapl ; Set the last block to the current block.
- bra @chklmerge ; Do the left block merge.
-@normerge:
- mov.q (a+fblk.next), y ; Set the next block to the right pointer.
- mov.q (y+fblk.prev), a ; Set the previous right pointer to the current block.
-@chklmerge:
- and x, x ; Is the left pointer NULL?
- bne @chklmerge2 ; No, so keep checking.
-@newstart:
- mov.q (a+fblk.prev), x ;
- sta.q heapf ; Set the first block, to the current block.
- bra @end2 ; We are done.
-@chklmerge2:
- mov.q e, (x+fblk.size) ; Get the size of the left block.
- add e, x ; Add the size of the left block, to the left pointer.
- cmp e, a ; Is the left block adjacent?
- bne @nolmerge ; No, so don't merge the left block.
-@lmerge:
- lea fblk.size ; Set the offset to the block size.
- add.q (x+e), (a+e) ; Add the size of the left block, with the size of the current block.
-@lmerge2:
- lea fblk.next ; Set the offset to the next block.
- mov.q (x+e), (a+e) ; Set the next left pointer, to the next block.
- mov.q b, (a+e) ; Get the next block.
- beq @newlast ; The next block is NULL, so set the last block.
-@lprev:
- mov.q (b+fblk.prev), x ; Set the next left pointer's previous pointer to the left pointer.
- bra @end2 ; We are done.
-@newlast:
- stx.q heapl ; Set the last block, to the left pointer.
- bra @end2 ; We are done.
-@nolmerge:
- mov.q (x+fblk.next), a ; Set the next left pointer, to the current block.
-@nolmerge2:
- mov.q (a+fblk.prev), x ; Set the previous block, to the left pointer.
-@end2:
- ple.q ; Restore E.
- ply.q ; Restore Y.
- plb.q ; Restore B.
- pla.q ; Restore A.
- rts ; End of free.
-
-a
-q