stage0/stage1/CAT.s

98 lines
2.6 KiB
ArmAsm

; This file is part of stage0.
;
; stage0 is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; stage0 is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with stage0. If not, see <http://www.gnu.org/licenses/>.
;; CAT program
;; Concatinates multiple tapes into a single tape output
;; Read tapes in tape_01 and writes the assembled result
;; Into tape_02 and stops when user precesses C-d
:start
;; Prep TAPE_02
LOADUI R0 0x1101
FOPEN_WRITE
;; Read_file function
;; Primary work function
;; Copies contents of TAPE_01 to TAPE_02
;; Then calls a user interaction function at EOF
:Read_file
;; Prep TAPE_01
LOADUI R0 0x1100
FOPEN_READ
:Read_Loop
;; Read Byte
LOADUI R1 0x1100 ; Reading from TAPE_01
FGETC ; Get a byte
;; Check for EOF
CMPSKIPI.GE R0 0
JUMP @Read_Cleanup
;; Write the Byte
LOADUI R1 0x1101 ; Write to TAPE_02
FPUTC ; That byte
JUMP @Read_Loop ; Loop until EOF
:Read_Cleanup
;; Close up TAPE_01
LOADUI R0 0x1100
FCLOSE
JUMP @Prompt_User ; See if user wants to read another
;; Closeup function
;; A minimal cleanup function to ensure we end
;; In a known good state
:Closeup
;; Close up TAPE_02
LOADUI R0 0x1101
FCLOSE
HALT
;; Prompt_User function
;; Displays message to user
;; Jumps to Read_file if [ENTER]
;; Otherwise Closeup to register
;; All done reading tapes and to start closeout
:Prompt_User
FALSE R1 ; Using TTY
FALSE R3 ; Starting at beginning
LOADUI R4 $Prompt_Text ; of the prompt text
:Prompt_Loop
LOADXU8 R0 R3 R4 ; Get a char
CMPSKIPI.NE R0 0 ; If NULL
JUMP @Prompt_Done ; We reached the end
FPUTC ; Write it to TTY
ADDUI R3 R3 1 ; Move to next char
JUMP @Prompt_Loop ; And loop again
:Prompt_Done
LOADUI R0 10 ; Using LF
FPUTC ; Terminate Line
FGETC ; Get user input
;; Check for Ctrl-D
CMPSKIPI.NE R0 4 ; If user hit Ctrl-D
JUMP @Closeup
;; Otherwise assume user wants to read another tape from TAPE_01
JUMP @Read_file
:Prompt_Text
"Press [Enter] to read next tape or Ctrl-d to be done"