1
0
mirror of https://github.com/DoctorWkt/pdp7-unix.git synced 2026-04-29 21:26:48 +00:00
Files
DoctorWkt.pdp7-unix/pdp7parse/src/test/resources/s4.s
2016-03-05 15:21:44 -07:00

372 lines
5.8 KiB
ArmAsm

"** 01-s1.pdf page 21
" s4
" allocate a free disk block for a file (data or indirect)
alloc: 0
-1
tad s.nfblks
spa
jmp 1f
dac s.nfblks
tad fblksp
jms laci
dac 9f+t
jms copyz; dskbuf; 64
lac 9f+t
jms dskwr
dzm .savblk
lac 9f+t
jmp alloc i
1:
lac s.nxfblk
sna
jms halt " OUT OF DISK
dac s.fblks
jms dskrd
lac dskbuf
dac s.nxfblk
jms copy; dskbuf+1; s.fblks+1; 9
lac d10
dac s.nfblks
jmp alloc+1
" free a disk block
free: 0
lmq
lac s.nfblks
sad d10
jmp 1f
tad fblksp
dac 9f+t
lacq
dac 9f+t i
dzm .savblk
isz s.nfblks
jmp free i
1:
lac s.nxfblk
dac dskbuf
jms copy; s.fblks+1; dskbuf+1; 9
lacq
dac s.nxfblk
jms dskwr
dzm .savblk
lac d1
dac s.nfblks
jmp free i
t = t+1
" load AC indirect (without using indirect!)
" AC/ address
" jms laci
" AC/ contents of address
laci: 0
and o17777 " clear everything but addr
tad o200000 " make into "lac addr"
dac .+1
lac .. " fetch
jmp laci i " return
"** 01-s1.pdf page 22
" skip if AC between two values (inclusive)
" jms betwen; low_ptr; high_ptr
" <not between>
" <between>
" listing has an alternate written in
" (which would require 'lac ptr' instead of 'ptr' args?)
betwen: 0
lmq cmq " get ~AC in MQ
lac betwen i " get low_ptr
dac 9f+t
isz betwen " skip low_ptr
lacq " get ~AC (-AC-1) from MQ
tad 9f+t i " get low-AC-1
sma " negative (AC >= low)?
jmp 1f " no, return w/o skip
lac betwen i " fetch high_ptr
dac 9f+t
isz betwen " skip high_ptr
lacq " get -AC-1
tad 9f+t i " add to high value (high-AC-1)
cma " complement (AC-high)
spa sna " AC-high <= 0?
1:
isz betwen " no: give happy (skip) return
lacq " restore ~AC
cma " restore AC
jmp betwen i " return w/o skip
" copy memory
" call:
" jms copy; src; dest; count
copy: 0
-1
tad copy i
dac 8
isz copy
-1
tad copy i
dac 9
isz copy
-1
tad copy i
cma
dac 9f+t
isz copy
1:
lac 8 i
dac 9 i
isz 9f+t
jmp 1b
jmp copy i
" copy zeroes (clear memory)
" call:
" jms copyz; pointer; count
copyz: 0
-1
tad copyz i " get call PC
dac 8 " save in index (pre-increments)
isz copyz " skip pointer
-1
tad copyz i " get count-1
cma " get negative count
dac 9f+t " save in t0
isz copyz " skip count
1:
dzm 8 i " zero word
isz 9f+t " done?
jmp 1b " no: loop
jmp copyz i " return
t = t+1
putchar: 0
"** 01-s1.pdf page 23
dac 9f+t
cla
jms takeq
jmp putchar i
tad o40001
dac .+4
lac 9f+t
jms putq
lac char
dac q2+1 ..
isz putchar
jmp putchar i
t = t+1
getchar: 0
jms takeq
jmp i getchar
tad o200001
dac .+3
cla
jms putq
lac q2+1 ..
isz getchar
jmp i getchar
takeq: 0
rcl
tad lacq1
dac .+7
tad o640000
dac .+17
tad d1
dac .+14
tad o500000
dac .+5
lac q1 ..
sna
jmp takeq i
dac lnkaddr
sad q1+1 ..
jmp .+5
tad o200000
dac .+1
lac q2 ..
jmp .+3
cla
dac q1+1 ..
dac q1 ..
isz takeq
lac lnkaddr
jmp i takeq
putq: 0
rcl
tad dacq1
dac .+14
tad d1
dac .+13
tad o140000
dac .+1
lac q1-1 ..
"** 01-s1.pdf page 24
sna
jmp .+6
tad o40000
dac .+2
lac lnkaddr
dac q2 ..
jmp .+3
lac lnkaddr
dac q1 ..
dac q1+1 ..
jmp putq i
srcdbs: 0
dac 9f+t+2 "* lmq
-ndskbs
dac 9f+t
law dskbs "* -1 dac 8 written
dac 9f+t+1 "* lacq
1:
lac 9f+t+2 "** crossed out
sad 9f+t+1 "** isz 8 written
jmp srcdbs i
law 65 "** ??? crossed out
tad 9f+t+1 "** crossed out isz 8 written
isz 9f+t+1
isz 9f+t
jmp 1b
isz srcdbs
jmp srcdbs i
collapse: 0
cla
jms srcdbs
jmp 1f
law dskbs
dac 9f+t+1 "** 9f+t+1 crossed out: 8 written in
1:
lac 9f+t+1 "** 9f+t+1 crossed out: 8 written in
dac 0f+1
tad d65 "** crossed out: d2-- original obscured
dac 0f
cma
tad d1
tad edskbsp
and o17777
sna
jmp 0f+3
dac 0f+2
jms copy; 0:..; ..; ..
-65
tad edskbsp
dac 9f+t
tad d1
dac 0f
lac dskaddr
dac 9f+t i
jms copy; dskbuf; 0:..; 64
jmp collapse i
dskrd: 0
jms betwen; d2; d7999
"** 01-s1.pdf page 25
jms halt
sad dskaddr
jmp dskrd i
dac dskaddr
jms srcdbs
jmp 1f
lac dskaddr
jms dskio; 06000
jmp 2f
1:
dzm 9f+t+1 i
law 1
tad 9f+t+1
dac .+2
jms copy; ..; dskbuf; 64
2:
jms collapse
jmp dskrd i
" write a file block (data, inode or indirect)
" AC/ block
dskwr: 0
jms betwen; d2; d7999
jms halt
jms dskio; 07000
lac dskaddr
jms srcdbs
dzm 9f+t+1 i
jms collapse
jmp dskwr i
t = t+3
" AC/ block
" jms dskio; dsld_bits
dskio: 0
dac dskaddr
cll; idiv; 80
dac 9f+t
lacq
idiv; 10
dac 9f+t+1
lls 22
xor 9f+t+1
als 8
dac 9f+t+1
lac 9f+t
idiv; 10
dac 9f+t
lls 22
xor 9f+t
xor 9f+t+1
xor o200000
dac 9f+t
jms dsktrans; -64; dskbuf; 9f+t; dskio
isz dskio
jmp dskio i
t = t+1
" called with:
" jms dsktrans; -WC; MAC; addr_ptr?; dsld_ptr
dsktrans: 0
-10
dac 9f+t
1:
-1
tad dsktrans
dac 12
"** 01-s1.pdf page 26
dscs " clear status register
lac 12 i
dslw " load WC
lac 12 i
dslm " load MAC
lac 12 i
jms laci
dsld " load TA & SA
dzm .dskb
lac 12 i
jms laci
jms laci
dsls " load status
lac .dskb " check for interrupt
sna
jmp .-2
lac .dske " get status from interrupt
sma
jmp 12 i " return
isz 9f+t
jmp 1b
jms halt " 10 disk errors
t = t+1
halt: 0
isz 9f+t " spin for a while (process interrupts)
jmp .-1
iof " disable interrupts
hlt " halt
jms copy; law; 4096; 4096 " continued: copy system up to user memory?
hlt; jmp .-1 " halt for good
t = t+1