A couple of useful functions that may be of use

This commit is contained in:
Jeremiah Orians 2016-09-05 19:50:28 -04:00
parent 0323fa7149
commit 1a32cfa8c9
No known key found for this signature in database
GPG Key ID: 7457821534D2ACCD
2 changed files with 117 additions and 0 deletions

View File

@ -0,0 +1,42 @@
;; add_node Function
;; Recieves pointers in R0 R1
;; Alters R0 if NULL
;; Appends nodes together
;; Returns to whatever called it
:add_node
;; Preserve Registers
PUSHR R2 R15
PUSHR R1 R15
PUSHR R0 R15
;; Handle if Head is NULL
JUMP.NZ R0 @add_node_0
POPR R0 R15
PUSHR R1 R15
JUMP @add_node_2
:add_node_0
;; Handle if Head->next is NULL
LOAD32 R2 R0 0
JUMP.NZ R2 @add_node_1
;; Set head->next = p
STORE32 R1 R0 0
;; Set p->prev = head
STORE32 R0 R1 4
JUMP @add_node_2
:add_node_1
;; Handle case of Head->next not being NULL
LOAD32 R0 R0 0 ; Move to next node
LOAD32 R2 R0 0 ; Get node->next
CMPSKIP.E R2 0 ; If it is not null
JUMP @add_node_1 ; Move to the next node and try again
JUMP @add_node_0 ; Else simply act as if we got this node
; in the first place
:add_node_2
;; Restore registers
POPR R0 R15
POPR R1 R15
POPR R2 R15
RET R15

View File

@ -0,0 +1,75 @@
;; Readline function
;; Recieves Pointer to node in R0
;; And Input in R1
;; Allocates Text segment on Heap
;; Sets node's pointer to Text segment
;; Sets R14 to True if EOF reached
;; Requires a malloc function to exist
;; Returns to whatever called it
:Readline
;; Preserve registers
PUSHR R0 R15
PUSHR R1 R15
PUSHR R2 R15
PUSHR R3 R15
PUSHR R4 R15
;; Initialize
MOVE R4 R0
FALSE R0 ; Get where space is free
CALLI R15 @malloc
MOVE R2 R0
FALSE R3
:Readline_0
FGETC ; Read a Char
;; Flag if reached EOF
CMPSKIP.GE R0 0
TRUE R14
;; Stop if EOF
CMPSKIP.GE R0 0
JUMP @Readline_2
;; Handle Backspace
CMPSKIP.E R0 127
JUMP @Readline_1
;; Move back 1 character if R3 > 0
CMPSKIP.LE R3 0
SUBUI R3 R3 1
;; Hopefully they keep typing
JUMP @Readline_0
:Readline_1
;; Replace all CR with LF
CMPSKIP.NE R0 13
LOADUI R0 10
;; Store the Byte
STOREX8 R0 R2 R3
;; Prep for next loop
ADDUI R3 R3 1
;; Check for EOL
CMPSKIP.NE R0 10
JUMP @Readline_2
;; Otherwise loop
JUMP @Readline_0
:Readline_2
;; Set Text pointer
CMPSKIP.E R3 0 ; Don't bother for Empty strings
STORE32 R2 R4 8
;; Correct Malloc
MOVE R0 R3 ; Ensure actually allocates exactly
CALLI R15 @malloc ; the amount of space required
;; Restore Registers
POPR R4 R15
POPR R3 R15
POPR R2 R15
POPR R1 R15
POPR R0 R15
RET R15