Fixed Let Expressions
This commit is contained in:
parent
8724c655d6
commit
5f78bfdf0b
|
@ -2571,44 +2571,60 @@
|
||||||
|
|
||||||
|
|
||||||
;; unmark_cells
|
;; unmark_cells
|
||||||
;; Recieves a List in R0
|
;; Recieves a List in R0 and R1 and a Count in R2
|
||||||
;; Returns nothing
|
;; Returns nothing
|
||||||
;; Unmarks all connected Cells
|
;; Unmarks all connected Cells
|
||||||
:unmark_cells
|
:unmark_cells
|
||||||
|
CMPSKIPI.LE R2 2 ; If Greater than 1
|
||||||
|
RET R15 ; Just return
|
||||||
PUSHR R0 R15 ; Protect R0
|
PUSHR R0 R15 ; Protect R0
|
||||||
PUSHR R1 R15 ; Protect R1
|
PUSHR R1 R15 ; Protect R1
|
||||||
PUSHR R2 R15 ; Protect R2
|
PUSHR R2 R15 ; Protect R2
|
||||||
LOADUI R2 2 ; GET MARKED
|
PUSHR R3 R15 ; Protect R3
|
||||||
NOT R2 R2 ; Use ~MARKED
|
PUSHR R4 R15 ; Protect R4
|
||||||
|
LOADUI R4 2 ; GET MARKED
|
||||||
|
NOT R4 R4 ; Use ~MARKED
|
||||||
|
|
||||||
:unmark_cells_0
|
:unmark_cells_0
|
||||||
JUMP.Z R0 @unmark_cells_done
|
JUMP.Z R0 @unmark_cells_done
|
||||||
LOAD32 R1 R0 0 ; Get I->TYPE
|
CMPSKIP.NE R0 R1 ; If LIST == STOP
|
||||||
AND R1 R1 R2 ; Remove MARK
|
ADDUI R2 R2 1 ; Increment Count
|
||||||
STORE32 R1 R0 0 ; Store the cleaned type
|
LOAD32 R3 R0 0 ; Get I->TYPE
|
||||||
|
AND R3 R3 R4 ; Remove MARK
|
||||||
|
STORE32 R3 R0 0 ; Store the cleaned type
|
||||||
|
|
||||||
;; Deal with CONS
|
;; Deal with CONS
|
||||||
CMPSKIPI.NE R1 16 ; If A CONS
|
CMPSKIPI.NE R3 16 ; If A CONS
|
||||||
JUMP @unmark_cells_proc ; Deal with it
|
JUMP @unmark_cells_cons ; Deal with it
|
||||||
|
|
||||||
;; Deal with PROC
|
;; Deal with PROC
|
||||||
CMPSKIPI.NE R1 32 ; If A PROC
|
CMPSKIPI.NE R3 32 ; If A PROC
|
||||||
JUMP @unmark_cells_proc ; Deal with it
|
JUMP @unmark_cells_proc ; Deal with it
|
||||||
|
|
||||||
;; Everything else
|
;; Everything else
|
||||||
JUMP @unmark_cells_1 ; Move onto NEXT
|
JUMP @unmark_cells_1 ; Move onto NEXT
|
||||||
|
|
||||||
:unmark_cells_proc
|
:unmark_cells_proc
|
||||||
LOAD32 R1 R0 4 ; Using list->CAR
|
LOAD32 R3 R0 12 ; Using list->ENV
|
||||||
SWAP R0 R1 ; Protect list
|
CMPSKIPI.NE R3 0 ; If NULL
|
||||||
|
JUMP @unmark_cells_cons ; Skip
|
||||||
|
SWAP R0 R3 ; Protect list
|
||||||
CALLI R15 @unmark_cells ; Recurse until the ends
|
CALLI R15 @unmark_cells ; Recurse until the ends
|
||||||
SWAP R0 R1 ; Put list back
|
SWAP R0 R3 ; Put list back
|
||||||
|
|
||||||
|
:unmark_cells_cons
|
||||||
|
LOAD32 R3 R0 4 ; Using list->CAR
|
||||||
|
SWAP R0 R3 ; Protect list
|
||||||
|
CALLI R15 @unmark_cells ; Recurse until the ends
|
||||||
|
SWAP R0 R3 ; Put list back
|
||||||
|
|
||||||
:unmark_cells_1
|
:unmark_cells_1
|
||||||
LOAD32 R0 R0 8 ; Get list->CDR
|
LOAD32 R0 R0 8 ; Get list->CDR
|
||||||
JUMP @unmark_cells_0 ; Keep going down list
|
JUMP @unmark_cells_0 ; Keep going down list
|
||||||
|
|
||||||
:unmark_cells_done
|
:unmark_cells_done
|
||||||
|
POPR R4 R15 ; Restore R4
|
||||||
|
POPR R3 R15 ; Restore R3
|
||||||
POPR R2 R15 ; Restore R2
|
POPR R2 R15 ; Restore R2
|
||||||
POPR R1 R15 ; Restore R1
|
POPR R1 R15 ; Restore R1
|
||||||
POPR R0 R15 ; Restore R0
|
POPR R0 R15 ; Restore R0
|
||||||
|
@ -2745,10 +2761,16 @@
|
||||||
;; The Core of Garbage Collection
|
;; The Core of Garbage Collection
|
||||||
:garbage_collect
|
:garbage_collect
|
||||||
PUSHR R0 R15 ; Protect R0
|
PUSHR R0 R15 ; Protect R0
|
||||||
|
PUSHR R1 R15 ; Protect R1
|
||||||
|
PUSHR R2 R15 ; Protect R2
|
||||||
CALLI R15 @mark_all_cells ; MARK_ALL_CELLS
|
CALLI R15 @mark_all_cells ; MARK_ALL_CELLS
|
||||||
LOADR R0 @all_symbols ; Using ALL_SYMBOLS
|
LOADR R0 @all_symbols ; Using ALL_SYMBOLS
|
||||||
|
COPY R1 R0 ; Using it as STOP
|
||||||
|
FALSE R2 ; Setting Counter to 0
|
||||||
CALLI R15 @unmark_cells ; UNMARK ALL_SYMBOLS
|
CALLI R15 @unmark_cells ; UNMARK ALL_SYMBOLS
|
||||||
LOADR R0 @top_env ; Using TOP_ENV
|
LOADR R0 @top_env ; Using TOP_ENV
|
||||||
|
COPY R1 R0 ; Using it as STOP
|
||||||
|
FALSE R2 ; Setting Counter to 0
|
||||||
CALLI R15 @unmark_cells ; UNMARK TOP_ENV
|
CALLI R15 @unmark_cells ; UNMARK TOP_ENV
|
||||||
CALLI R15 @reclaim_marked ; RECLAIM_MARKED
|
CALLI R15 @reclaim_marked ; RECLAIM_MARKED
|
||||||
CALLI R15 @update_remaining ; Fix the Count
|
CALLI R15 @update_remaining ; Fix the Count
|
||||||
|
@ -2758,6 +2780,8 @@
|
||||||
CALLI R15 @compact ; Compact
|
CALLI R15 @compact ; Compact
|
||||||
FALSE R0 ; Using NULL
|
FALSE R0 ; Using NULL
|
||||||
STORER R0 @top_allocated ; Clear TOP_ALLOCATED
|
STORER R0 @top_allocated ; Clear TOP_ALLOCATED
|
||||||
|
POPR R2 R15 ; Restore R
|
||||||
|
POPR R1 R15 ; Restore R1
|
||||||
POPR R0 R15 ; Restore R0
|
POPR R0 R15 ; Restore R0
|
||||||
RET R15
|
RET R15
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue