83 lines
2.0 KiB
ArmAsm
83 lines
2.0 KiB
ArmAsm
;; 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"
|