Add original unix v6
This commit is contained in:
@@ -0,0 +1,741 @@
|
||||
.globl b1
|
||||
.globl hblk
|
||||
.globl headers
|
||||
.globl initl
|
||||
.globl asmem
|
||||
.globl b1s
|
||||
.globl b1e
|
||||
.globl w1
|
||||
.globl stats
|
||||
.globl lookchar
|
||||
.globl flush
|
||||
.globl fsfile
|
||||
.globl seekchar
|
||||
.globl backspace
|
||||
.globl alterchar
|
||||
.globl zero
|
||||
.globl getchar
|
||||
.globl putchar
|
||||
.globl copy
|
||||
.globl rewind
|
||||
.globl create
|
||||
.globl allocate
|
||||
.globl release
|
||||
.globl collect
|
||||
.globl w,r,a,l
|
||||
.globl getword
|
||||
.globl putword
|
||||
.globl backword
|
||||
.globl alterword
|
||||
/
|
||||
/
|
||||
/ routine to read next character from string
|
||||
/ pointer to by r1; character returned in r0
|
||||
/ c-bit set if character not availiable (eof)
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,getchar
|
||||
/ movb r0,...
|
||||
/
|
||||
getchar:
|
||||
jsr pc,lookchar
|
||||
bes 1f
|
||||
inc r(r1)
|
||||
tst r0 /clears c-bit
|
||||
1: rts pc
|
||||
/
|
||||
/
|
||||
/ routine to read a string backwards
|
||||
/ the read pointer is decremented before reading
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,backspace
|
||||
/ mov r0,...
|
||||
/
|
||||
backspace:
|
||||
cmp a(r1),r(r1)
|
||||
bhis nochc
|
||||
dec r(r1)
|
||||
jsr pc,lookchar
|
||||
rts pc
|
||||
nochc: clr r0
|
||||
sec
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to put a word onto the string
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ mov ...,r0
|
||||
/ jsr pc,putword
|
||||
/
|
||||
putword:
|
||||
mov r0,-(sp)
|
||||
sub $hblk,r0
|
||||
jsr pc,putchar
|
||||
swab r0
|
||||
jsr pc,putchar
|
||||
mov (sp)+,r0
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to get a word from the string
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,getword
|
||||
/ mov r0,...
|
||||
/
|
||||
getword:
|
||||
jsr pc,lookchar
|
||||
bes 1f
|
||||
movb r0,nchar
|
||||
inc r(r1)
|
||||
jsr pc,lookchar
|
||||
bes 1f
|
||||
movb r0,nchar+1
|
||||
inc r(r1)
|
||||
mov nchar,r0
|
||||
add $hblk,r0
|
||||
1: rts pc
|
||||
/
|
||||
/
|
||||
/ routine to alter the word pointed to by r(r1)
|
||||
/ by replacing the word there with r0
|
||||
/
|
||||
/ mov wd,r0
|
||||
/ mov ...,r1
|
||||
/ jsr pc,alterword
|
||||
/
|
||||
alterword:
|
||||
mov r0,-(sp)
|
||||
sub $hblk,r0
|
||||
jsr pc,alterchar
|
||||
swab r0
|
||||
jsr pc,alterchar
|
||||
mov (sp)+,r0
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to get words backwards from string
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,backword
|
||||
/ mov r0,...
|
||||
/
|
||||
backword:
|
||||
cmp a(r1),r(r1)
|
||||
bhis nochw
|
||||
dec r(r1)
|
||||
jsr pc,lookchar
|
||||
movb r0,nchar+1
|
||||
cmp a(r1),r(r1)
|
||||
bhis nochw
|
||||
dec r(r1)
|
||||
jsr pc,lookchar
|
||||
movb r0,nchar
|
||||
mov nchar,r0
|
||||
add $hblk,r0
|
||||
rts pc
|
||||
/
|
||||
nochw:
|
||||
clr r0
|
||||
sec
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to copy the contents of one string
|
||||
/ to another.
|
||||
/
|
||||
/ mov source,r0
|
||||
/ mov dest,r1
|
||||
/ jsr pc,copy
|
||||
/ mov r1,...
|
||||
/
|
||||
/ on return, r1 points to the new string and should
|
||||
/ be saved. r0 is preserved.
|
||||
/
|
||||
copy:
|
||||
inc stats+12.
|
||||
mov r0,-(sp)
|
||||
mov r1,-(sp)
|
||||
mov r2,-(sp)
|
||||
mov r3,-(sp)
|
||||
mov w(r0),r2
|
||||
sub a(r0),r2 /W-A (old)
|
||||
mov l(r1),r3
|
||||
sub a(r1),r3 /L-A (new)
|
||||
cmp r2,r3
|
||||
blos 1f
|
||||
mov r2,r0
|
||||
jsr pc,allocate
|
||||
mov 4(sp),r0 /new
|
||||
jsr pc,swap
|
||||
jsr pc,release
|
||||
mov r0,r1
|
||||
mov 0(sp),r0 /old
|
||||
1:
|
||||
mov a(r1),w(r1) /rewind w pointer
|
||||
cmp r2,$512.
|
||||
blos copy1 /is a short string
|
||||
/
|
||||
jsr pc,flush
|
||||
jsr pc,reset
|
||||
/
|
||||
mov a(r0),-(sp)
|
||||
4:
|
||||
mov (sp),0f
|
||||
mov afi,r0
|
||||
sys seek;0:.. ;0 /set input pointer
|
||||
cmp r2,$512.
|
||||
blos 2f
|
||||
mov $512.,r3 /# output this time
|
||||
mov r3,0f
|
||||
mov r3,3f
|
||||
add r3,(sp)
|
||||
sub r3,r2 /# left to output
|
||||
br 1f
|
||||
2:
|
||||
mov r2,0f
|
||||
mov r2,3f
|
||||
mov r2,r3
|
||||
clr r2
|
||||
1:
|
||||
mov afi,r0
|
||||
sys read;b1;0:..
|
||||
bes bad
|
||||
cmp r0,r3
|
||||
bne bad
|
||||
mov afout,r0
|
||||
mov (r1),0f
|
||||
add r3,(r1)
|
||||
sys seek;0:.. ;0
|
||||
sys write;b1;3:..
|
||||
bes bad
|
||||
tst r2
|
||||
bgt 4b
|
||||
tst (sp)+
|
||||
/
|
||||
/ fix up read ptr of new string
|
||||
/
|
||||
copy2:
|
||||
mov 6(sp),r0 /restore r0
|
||||
mov r(r0),r2
|
||||
sub a(r0),r2
|
||||
add a(r1),r2
|
||||
mov r2,r(r1)
|
||||
/
|
||||
/ restore and return
|
||||
/
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r2
|
||||
mov (sp)+,r1
|
||||
mov (sp)+,r0
|
||||
rts pc
|
||||
/
|
||||
bad: mov $1,r0
|
||||
sys write;1f;2f-1f
|
||||
4
|
||||
1: <error on copy\n>
|
||||
2: .even
|
||||
/
|
||||
swap:
|
||||
mov w(r1),-(sp)
|
||||
mov w(r0),w(r1)
|
||||
mov (sp),w(r0)
|
||||
mov r(r1),(sp)
|
||||
|
||||
mov r(r0),r(r1)
|
||||
mov (sp),r(r0)
|
||||
mov a(r1),(sp)
|
||||
mov a(r0),a(r1)
|
||||
mov (sp),a(r0)
|
||||
mov l(r1),(sp)
|
||||
mov l(r0),l(r1)
|
||||
mov (sp)+,l(r0)
|
||||
rts pc
|
||||
/
|
||||
/ copy a short string
|
||||
/
|
||||
copy1:
|
||||
mov r(r0),-(sp)
|
||||
mov a(r0),r(r0)
|
||||
mov nchar,-(sp)
|
||||
mov r0,r2 /old
|
||||
mov r1,r3 /new
|
||||
1:
|
||||
mov r2,r1
|
||||
jsr pc,getchar
|
||||
bes 1f
|
||||
mov r3,r1
|
||||
jsr pc,putchar
|
||||
br 1b
|
||||
1:
|
||||
mov r2,r0
|
||||
mov (sp)+,nchar
|
||||
mov (sp)+,r(r0)
|
||||
mov r3,r1
|
||||
br copy2
|
||||
/
|
||||
/
|
||||
/
|
||||
/
|
||||
/
|
||||
/ routine to rewind read pointer of string
|
||||
/ pointed to by r1
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,rewind
|
||||
/
|
||||
rewind:
|
||||
mov a(r1),r(r1)
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to rewind write pointer of string
|
||||
/ pointed to by r1
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,create
|
||||
/
|
||||
create:
|
||||
mov a(r1),w(r1)
|
||||
mov a(r1),r(r1)
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to zero a string
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,zero
|
||||
/
|
||||
zero:
|
||||
mov r0,-(sp)
|
||||
.if testing
|
||||
jsr pc,preposterous
|
||||
.endif
|
||||
mov a(r1),w(r1)
|
||||
clrb r0
|
||||
1: cmp w(r1),l(r1)
|
||||
bhis 1f
|
||||
jsr pc,putchar
|
||||
br 1b
|
||||
1: mov a(r1),w(r1)
|
||||
mov (sp)+,r0
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/
|
||||
/ routine to move the read pointer of a string to the
|
||||
/ relative position indicated by r0. the string is
|
||||
/ extended if necessary - there is no error return.
|
||||
/
|
||||
/ mov position,r0
|
||||
/ mov ...,r1
|
||||
/ jsr pc,seekchar
|
||||
/
|
||||
seekchar:
|
||||
mov r1,-(sp)
|
||||
mov r0,-(sp)
|
||||
.if testing
|
||||
jsr pc,preposterous
|
||||
.endif
|
||||
inc stats+10.
|
||||
1:
|
||||
mov (sp),r0
|
||||
add a(r1),r0
|
||||
cmp r0,l(r1)
|
||||
bhi 3f
|
||||
mov r0,r(r1)
|
||||
cmp r0,w(r1)
|
||||
blo 1f
|
||||
mov r0,w(r1)
|
||||
br 1f
|
||||
3:
|
||||
mov (sp),r0
|
||||
jsr pc,allocate
|
||||
mov 2(sp),r0
|
||||
jsr pc,copy
|
||||
jsr pc,swap
|
||||
jsr pc,release
|
||||
mov 2(sp),r1
|
||||
br 1b
|
||||
1:
|
||||
mov (sp)+,r0
|
||||
mov (sp)+,r1
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to move read pointer of string to end of string
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,fsfile
|
||||
/
|
||||
fsfile:
|
||||
mov r0,-(sp)
|
||||
.if testing
|
||||
jsr pc,preposterous
|
||||
.endif
|
||||
inc stats+10.
|
||||
mov w(r1),r(r1)
|
||||
mov (sp)+,r0
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to place the character in r0 at the current
|
||||
/ position of the read pointer - the read pointer
|
||||
/ is not moved.
|
||||
/
|
||||
/ movb ch,r0
|
||||
/ mov ...,r1
|
||||
/ jsr pc,alterchar
|
||||
/ mov r1,...
|
||||
/
|
||||
alterchar:
|
||||
mov r2,-(sp)
|
||||
mov r1,-(sp)
|
||||
mov r0,nchar
|
||||
.if testing
|
||||
jsr pc,preposterous
|
||||
.endif
|
||||
inc stats+8.
|
||||
1: cmp r(r1),l(r1) /W,L
|
||||
blo 3f
|
||||
mov l(r1),r0
|
||||
inc r0
|
||||
sub a(r1),r0 /W-A+1
|
||||
jsr pc,allocate
|
||||
mov (sp),r0
|
||||
jsr pc,copy
|
||||
jsr pc,swap
|
||||
jsr pc,release
|
||||
mov (sp),r1
|
||||
3:
|
||||
mov r(r1),r0
|
||||
jsr pc,bufchar
|
||||
bec 2f
|
||||
jsr pc,getbuf
|
||||
|
||||
2: movb nchar,(r0)
|
||||
mov $1,w1(r2)
|
||||
mov nchar,r0 /to preserve r0 for user
|
||||
inc r(r1)
|
||||
cmp r(r1),w(r1)
|
||||
blos 3f
|
||||
mov r(r1),w(r1)
|
||||
3:
|
||||
mov (sp)+,r1
|
||||
mov (sp)+,r2
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to look at next character from string
|
||||
/ pointed to by r1; character returned in r0
|
||||
/ c-bit set if character not available (end of file)
|
||||
/ r1 is preserved
|
||||
/
|
||||
/ mov ...,r1
|
||||
/ jsr pc,lookchar
|
||||
/ movb r0,...
|
||||
/
|
||||
lookchar:
|
||||
mov r2,-(sp)
|
||||
inc stats+6.
|
||||
.if testing
|
||||
jsr pc,preposterous
|
||||
.endif
|
||||
cmp w(r1),r(r1) /W,R
|
||||
blos noch
|
||||
mov r(r1),r0
|
||||
jsr pc,bufchar
|
||||
bec 2f
|
||||
jsr pc,getbuf
|
||||
/
|
||||
2:
|
||||
inc flag
|
||||
bne 2f
|
||||
jsr pc,fixct
|
||||
br 1f
|
||||
2:
|
||||
mov flag,u1(r2)
|
||||
1:
|
||||
mov (sp)+,r2
|
||||
movb (r0),r0
|
||||
tst r0 /clears c-bit
|
||||
rts pc
|
||||
/
|
||||
noch:
|
||||
mov (sp)+,r2
|
||||
clr r0
|
||||
sec
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to put a character into the string
|
||||
/ pointed to by r1; character in r0
|
||||
/ r0 is preserved; r1 points to the string
|
||||
/ after return and must be saved.
|
||||
/
|
||||
/ movb ch,r0
|
||||
/ mov ...,r1
|
||||
/ jsr pc,putchar
|
||||
/ mov r1,...
|
||||
/
|
||||
putchar:
|
||||
mov r2,-(sp)
|
||||
mov r1,-(sp)
|
||||
mov r0,nchar
|
||||
.if testing
|
||||
jsr pc,preposterous
|
||||
.endif
|
||||
inc stats+8.
|
||||
1: cmp w(r1),l(r1) /W,L
|
||||
blo 3f
|
||||
mov w(r1),r0
|
||||
inc r0
|
||||
sub a(r1),r0 /W-A+1
|
||||
jsr pc,allocate
|
||||
mov (sp),r0
|
||||
jsr pc,copy
|
||||
jsr pc,swap
|
||||
jsr pc,release
|
||||
mov (sp),r1
|
||||
3:
|
||||
mov w(r1),r0
|
||||
jsr pc,bufchar
|
||||
bec 2f
|
||||
jsr pc,getbuf
|
||||
2: movb nchar,(r0)
|
||||
mov $1,w1(r2)
|
||||
mov nchar,r0 /to preserve r0 for user
|
||||
inc w(r1)
|
||||
inc flag
|
||||
bne 2f
|
||||
jsr pc,fixct
|
||||
br 1f
|
||||
2:
|
||||
mov flag,u1(r2)
|
||||
1:
|
||||
mov (sp)+,r1
|
||||
mov (sp)+,r2
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to flush contents of all buffers.
|
||||
/
|
||||
/ jsr pc,flush
|
||||
/
|
||||
flush:
|
||||
mov r1,-(sp)
|
||||
mov r2,-(sp)
|
||||
mov r3,-(sp)
|
||||
clr r3
|
||||
1:
|
||||
cmp r3,$numb
|
||||
bhis 1f
|
||||
mov r3,r2
|
||||
asl r2
|
||||
tst w1(r2)
|
||||
ble 2f
|
||||
mov r3,r1
|
||||
ashc $9.,r1
|
||||
bic $777,r1
|
||||
add $b1,r1
|
||||
jsr pc,clean
|
||||
2:
|
||||
inc r3
|
||||
br 1b
|
||||
1:
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r2
|
||||
mov (sp)+,r1
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
reset:
|
||||
mov r3,-(sp)
|
||||
mov r2,-(sp)
|
||||
clr r3
|
||||
1:
|
||||
cmp r3,$numb
|
||||
bge 1f
|
||||
mov r3,r2
|
||||
asl r2
|
||||
mov $-1.,w1(r2)
|
||||
clr b1s(r2)
|
||||
clr b1e(r2)
|
||||
clr u1(r2)
|
||||
inc r3
|
||||
br 1b
|
||||
1:
|
||||
clr flag
|
||||
mov (sp)+,r2
|
||||
mov (sp)+,r3
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to read from disc to a buffer
|
||||
/ wcing the buffer if necessary
|
||||
/
|
||||
/ mov disc addr,r0
|
||||
/ mov buffer addr,r2
|
||||
/ jsr pc,getb
|
||||
/
|
||||
/ on return r0 = addr of byte in buffer
|
||||
/
|
||||
getb:
|
||||
mov r3,-(sp)
|
||||
mov r1,-(sp)
|
||||
mov r0,-(sp)
|
||||
mov r2,r3
|
||||
asr r3
|
||||
mov r3,r1
|
||||
ashc $9.,r1
|
||||
bic $777,r1
|
||||
add $b1,r1
|
||||
tst w1(r2) / w
|
||||
ble 1f
|
||||
|
||||
jsr pc,clean
|
||||
|
||||
1: mov (sp),r0
|
||||
bic $777,r0 /get lowest multiple of 512.
|
||||
mov r0,0f
|
||||
mov r0,b1s(r2) /set start
|
||||
mov afi,r0
|
||||
sys seek;0:..;0
|
||||
mov r1,0f
|
||||
sys read;0:..;512.
|
||||
|
||||
mov b1s(r2),b1e(r2)
|
||||
add $512.,b1e(r2) / set end
|
||||
clr w1(r2) /clear w
|
||||
mov (sp)+,r0
|
||||
sub b1s(r2),r0
|
||||
add r1,r0 / set r0=byte addr in buffer
|
||||
mov (sp)+,r1
|
||||
mov (sp)+,r3
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to wc a buffer
|
||||
/
|
||||
/ mov buffer addr,r2
|
||||
/ mov buffer addr+6,r1 beginning of buffer
|
||||
/ jsr pc,clean
|
||||
/
|
||||
clean:
|
||||
inc stats+24.
|
||||
mov r0,-(sp)
|
||||
mov b1s(r2),0f
|
||||
mov afout,r0
|
||||
sys seek;0:..;0
|
||||
mov r1,0f
|
||||
sys write;0:..;512.
|
||||
|
||||
clr w1(r2) /clear w
|
||||
mov (sp)+,r0
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to get buffer addr of byte whose disc
|
||||
/ addr is in r0 - also returns addr of write
|
||||
/ flag for buffer in r2
|
||||
/
|
||||
/ mov disc addr,r0
|
||||
/ jsr pc,bufchar
|
||||
/ mov (r0),r0 for read
|
||||
/ inc (r2) for write must inc w
|
||||
/
|
||||
/ c-bit set if char not in either buffer
|
||||
/
|
||||
bufchar:
|
||||
mov r1,-(sp)
|
||||
mov r3,-(sp)
|
||||
clr r3
|
||||
1:
|
||||
mov r3,r2
|
||||
asl r2
|
||||
cmp r0,b1s(r2)
|
||||
blo 2f
|
||||
cmp r0,b1e(r2)
|
||||
bhis 2f
|
||||
sub b1s(r2),r0
|
||||
mov r3,r1
|
||||
ashc $9.,r1
|
||||
bic $777,r1
|
||||
add r1,r0
|
||||
add $b1,r0
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r1
|
||||
clc
|
||||
rts pc
|
||||
2:
|
||||
inc r3
|
||||
cmp r3,$numb
|
||||
blt 1b
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r1
|
||||
sec
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ routine to get a buffer
|
||||
/
|
||||
/ mov disc addr,r0
|
||||
/ jsr pc,getbuf
|
||||
/ mov (r0),r0 (for read)
|
||||
/ inc (r2) must inc w for w
|
||||
/
|
||||
getbuf:
|
||||
mov r4,-(sp)
|
||||
mov r3,-(sp)
|
||||
mov $2,r3
|
||||
clr r2
|
||||
mov $1,r4
|
||||
1:
|
||||
cmp r4,$numb
|
||||
bge 1f
|
||||
cmp u1(r3),u1(r2)
|
||||
bhis 2f
|
||||
mov r3,r2
|
||||
2:
|
||||
inc r4
|
||||
add $2.,r3
|
||||
br 1b
|
||||
1:
|
||||
mov r2,r3
|
||||
jsr pc,getb
|
||||
add $stats+14.,r3
|
||||
inc (r3)
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r4
|
||||
rts pc
|
||||
/
|
||||
/
|
||||
/ this routine renumbers the time used cell u1(r2)
|
||||
/ of the buffers when the clock overflows
|
||||
/
|
||||
fixct:
|
||||
mov r1,-(sp)
|
||||
mov r3,-(sp)
|
||||
mov $numb,r1
|
||||
mov $numb,flag
|
||||
2:
|
||||
mov r1,u1(r2)
|
||||
dec r1
|
||||
bge 1f
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r1
|
||||
rts pc
|
||||
1:
|
||||
clr r2
|
||||
mov $2,r3
|
||||
1:
|
||||
cmp r3,$numb2
|
||||
bge 2b
|
||||
cmp u1(r3),u1(r2)
|
||||
blo 2f
|
||||
mov r3,r2
|
||||
2:
|
||||
add $2,r3
|
||||
br 1b
|
||||
Reference in New Issue
Block a user