mirror of
https://github.com/DoctorWkt/pdp7-unix.git
synced 2026-01-25 11:47:35 +00:00
locations, fixed a bug in character input, added several EAE instructions. We now have cp.s, chmod.s and chown.s working.
105 lines
2.9 KiB
ArmAsm
105 lines
2.9 KiB
ArmAsm
" cp: cp file1 file2 [file3 file4 [file5 file6] ...]
|
|
"
|
|
" Copies in pairs: file1 to file2, file3 to file4 etc.
|
|
|
|
lac 017777 " Skip past argc and save
|
|
tad d1 " argv[0] (our name) into name2
|
|
dac name2 " We will skip past it later
|
|
|
|
loop:
|
|
lac 017777 i " Any arguments left?
|
|
sad d4
|
|
sys exit " 4 words = no args left, exit
|
|
sad d8 " Do we have 2 args?
|
|
jmp unbal " No, an unbalanced set of arguments
|
|
tad dm8 " Subtract 8 (two args) from the argc
|
|
dac 017777 i " and save it
|
|
lac name2
|
|
tad d4
|
|
dac name1 " Skipping pairs of filenames? not sure
|
|
tad d4
|
|
dac name2
|
|
sys open; name1: 0; 0 " Open the input file
|
|
spa
|
|
jmp error " File open error
|
|
lac o17 " Why load 15 (017) into AC?
|
|
sys creat; name2: 0 " Create the output file
|
|
spa
|
|
jmp error " File create error
|
|
dzm nin " Set the number of input words to zero
|
|
|
|
1:
|
|
lac bufp " Set up the base of the upcoming read
|
|
tad nin " to be the buffer + nin so we skip
|
|
dac 0f " the existing words in the buffer
|
|
-1
|
|
tad nin " Calculate 1024 - nin, i.e. the number
|
|
cma " of empty words yet to be filled in the
|
|
tad d1024 " buffer, and use it as the read count
|
|
dac 0f+1
|
|
lac d2 " Read from fd 2: hard-wired in fd!
|
|
sys read; 0:..;..
|
|
sna
|
|
jmp 2f " No words were read in, go to 2f
|
|
tad nin " Add the number of words read in
|
|
dac nin " to the existing number of words
|
|
sad d1024
|
|
jmp 2f " We do have 1,024 words, go to 2f
|
|
jmp 1b " Loop back if we don't have 1,024 words
|
|
|
|
2:
|
|
lac nin " Load the number of words in the input buffer
|
|
dac 2f " Save in the write word count argument
|
|
lac d3 " Write to fd 3: hard-wired out fd!
|
|
sys write; buf; 2:0
|
|
dzm nin " Set nin back to zero
|
|
lac 2b " Get the write count (updated by sys write)
|
|
sad d1024 " Did we write the buffer out?
|
|
jmp 1b " Yes, we wrote 1,024 words, so loop back
|
|
" to read another buffer's worth
|
|
lac d2
|
|
sys close " Close fd 2 and fd 3
|
|
lac d3
|
|
sys close
|
|
jmp loop " Loop back to deal with the next arguments
|
|
|
|
error: " File error, print out the name1 on
|
|
lac name1 " standard output, fd 1 followed by " ?\n"
|
|
dac 1f
|
|
lac d1
|
|
sys write; 1:0; 4
|
|
lac d1
|
|
sys write; mes; 1
|
|
lac name2 " Then do the same with name 2
|
|
dac 1f
|
|
lac d1
|
|
sys write; 1: 0; 4
|
|
lac d1
|
|
sys write; mes; 2
|
|
jmp loop " Loop back to deal with the next arguments
|
|
|
|
mes:
|
|
040000;077012 " String literal: " ?\n"
|
|
|
|
unbal: " We had an unbalanced set of arguments
|
|
lac name2 " so print out the name after name2
|
|
tad d4 " on standard output followed by " ?\n"
|
|
dac 1f
|
|
lac d1
|
|
sys write; 1: 0; 4
|
|
lac d1
|
|
sys write; mes; 2
|
|
sys exit
|
|
|
|
d1: 1 " Numeric constants
|
|
d2: 2
|
|
d3: 3
|
|
d4: 4
|
|
d8: 8
|
|
o17: 017
|
|
dm8: -8
|
|
d1024: 1024
|
|
nin: 0 " Number of words in the input buffer
|
|
bufp: buf " Pointer to the buffer
|
|
buf: .=.+1024 " Buffer of 1,024 words
|