From 23ee3961353bcf52b23bcc19f6bc032c5990482b Mon Sep 17 00:00:00 2001 From: Jeremiah Orians Date: Sat, 26 Nov 2016 12:45:06 -0500 Subject: [PATCH] Added a tape concatination program make manual process easier --- stage1/CAT.s | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 stage1/CAT.s diff --git a/stage1/CAT.s b/stage1/CAT.s new file mode 100644 index 0000000..4ddfb04 --- /dev/null +++ b/stage1/CAT.s @@ -0,0 +1,82 @@ +;; 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"