diff --git a/Makefile b/Makefile index 06f677a..ced05fe 100644 --- a/Makefile +++ b/Makefile @@ -7,5 +7,8 @@ buildit: run: buildit cd build && make run +altrun: buildit + cd build && make alt && make altrun + clean: cd build && make clean diff --git a/README.md b/README.md index af653d4..d33504e 100644 --- a/README.md +++ b/README.md @@ -37,20 +37,30 @@ To compile it: ## Running pdp7-unix You will need [simh](http://simh.trailing-edge.com/) 4.0 to run pdp7-unix. You can get the source code [here](https://github.com/simh/simh). -On 64-bit systems, you may need to set the C compiler's optimisation -level to -O1. +On 64-bit systems, you may need to set the C compiler's optimisation level to -O1. + +### Running from source To run pdp-unix from the pdp7-unix source tree, do: `make run` -
-cd binaries -pdp7 ../build/unixv0.simh -- Press `ctl-e` to break out the simulator into simh +### Precompiled Binaries + +You can also run pdp7-unix from precompiled binaries in the [/binaries](/binaries) directory. There are **orig** binaries and **alt** binaries. + +The orig binaries use the unixv0 directory semantics as restored from the printouts. To run pdp7-unix orig: + +`cd binaries/orig; pdp7 unixv0.simh` + +The alt binaries use the more familiar "." and ".." diretory semanatics as found in later unix. To run pdp7-unix alt: + +`cd binaries/alt; pdp7 unixv0.simh` + +### Typical Output + A typical pdp7-unix session on simh looks like:
diff --git a/binaries/alt/a.rim b/binaries/alt/a.rim new file mode 100644 index 0000000..3ad059c --- /dev/null +++ b/binaries/alt/a.rim @@ -0,0 +1 @@ +ผ ฐฟฟฟธฎฎฐธฎดฎ ฎกขฎฃทคฅฎฆงจฎฃฉฟฟฟช บซ ถฌฌผญฃฎกฏกฐฑธขฒฟฟฟณฎฃดตฃถกฑทฎธฐฆนบปปฒฐฅฌฎธข บ ผฐทญขฟฝฒธ ถผฐฉทฎฎฎฎตฎฒฎฃธข ถกขฐฉฃถคฅผฆฐ งกจฐฉข ชถซฌฐฑญถฎฏฐฑฐฐฟฑฒฎจณธดกธตฎงถฎงทธขธทนธบฏปผผฐฟฝพคฆพฟธกพข ข ธขท ฐฎจกกฏผฌผธฒฐฉปฐฑท ข ฑ ทณ ฏกขฃคฆฅฒฆฆงฟจฉชชฆซฌฟญฎฏฎฐฏฑฐฒฎณจกฐดฃตกถทธฝนบบปฎผฐฝฝพฟฏฎญขทฃ ฆฟญฌพฅญญ ถผฒ ทผฐฌฎฎฐก ธผฒฌฎฎผฒ ธ ฐขก ทขฏฃผคฒฅฟฟฟฆ ถงธขจคฉฒชซฎฌฎฆญฎฏฐฑฎฒจกฐณฃดกฎตกฏถทบธทนฏบปผฏงฝพฐฟฎฏฐฏพคฆ ฐดฎจกตฏจขดฏฆฐดฎฏขฆฐฎคฎฐฅฎฉผตฏฏจก ผกจขดฃฃคกฅฏคฆงฐญจดฉฃชกซฏคฌฏคญฏฐฎฎฏฐฐฑฅฒผณกดฎฉตฎถฐทธฟนบ ปผ ฝฎฆพฟ ฎฉ ท ญ ฎฆ ญ ผ ก ญ ณ ฎฉ ฏ ฏง ท ญ ฏจ ฏฅ ฏฌ ฟฟฟ ฏฃ ฏฃ ฆ กฐ ข ฃฎฉ คก ฅญ ฆ งฏง จ ฉฎฉ ช ซคฏฃ ฌฐ ฏ ญฝ ฎฏ ฏฆ ฐฐ ฑฎค ฒผ ณ ดฎ ตฎค ถฐ ท ธ ฝ น บ ปฎฆ ผ ฝ พ ฟกญทฏจ ฐญฏฎญฐฎฐฏจกผฏฎฆฐ ผกผกญฎฆ กขฃคฏฅจกฆผงฐจญฉจกชผซฐฌฎคญผฎฏฐฐกฑญฒณตดทตถญทธฎฆนบญปฐผฝพฏฟจกผฐ ฎคผ ฝฝฐฎจกฝฐธฏฏฐจกฐฎฉฎชฎฉฃกฎกฐฎชฃ ฎฉกกฐขฃฎซคธฅฏฏฆจกงผจฉฏชจกซผฌฐฒญธฎฏฏฐฑฑฒฒฎฉณธดฎชตนถฏฐทถธนบฐปผจกฐฝฎฉพฟฎชฎฉฃฎฉกฐ ฎซธฏฏจกผฏจกผฐธฏฒฎฉฎชฏฐฏฎฏฐฏฐฆ กฐขฃขคขฅฟฟถฆขงพญฐจฉชญซฌญญฎญฏฐญฑขฒคขณฐฉดคขตฒขถทขธผนคถบคถปฒถผฝญพผฟผจกฎถผฒผฟฟฝ จกฐคถฒถถผขคญญฎพฎจกธฎงฎงทธขฎงกถฎงฎงฎฅฎญ ฎฅกคขขขฃคฎฃคฏฅฐฆธคงฟฟฟจฉกชซฝฌฏญฎฏฏฐฎฑฒฆณฏดผตฐธถพคฆทธนฎงบจกตปฎงผคฎงฝฎงพฟกถฎงฎงพฎง ขฟฟฟขพฎงขขผฎขคขขฎขฐฎผขพฎงขข ญกฌฎขผฃฒคญฅฌขฆฐตงกถจฎงฉฎงชพซฎงฌขญฎฎขฏฐพฑฎงฒขณขดฐตฟฟฝถทขธขนขบขปคขผคขฝฎฅพผฟขคขฎขฐ ขฒฎฅฌญผฒฟฟฝขขขขฒฒฑฏฉฝฌ กกฅขฐซฃจกงคฃฅกกฆกฃงผจกฉถชฐซฌญญฎฐฏฐฑผฒฐณตดญตผถฐพทกปธญนดบธปฌกผ ฝฐพดฟญกผฐ ญฐฏกฅฐฅตจกฆฌกฐดจกฅฌกคผฐดกตดฎซฎซ ฐขญ กฐขฎซฃถคฐฅฆญงจฐฉชซ ฌฐญฎญฏฐฐฉฑกฒฅณฐถดถตฐถญทผธธนบญปผฐฑฝพผฟฐตญผฐกป ญดธฐดญกผฐญฐฝฌกฌฐฎฉกฎฐฟฟฟฎฐ ถ ผกฐฉขฟฟฟฃ ถคฒฅฆฟฟฟงญฃจผฉฐถชญฃซกฌญขฎฏฟฐฑขฒฆณ บดขตฒฅถญขทผธฌนญคบปฟผญขฝทพฟฟญฅกญฃฐฆ ตญฃฌกฐกขดข บคญฃฒญขฟทญฅฟดญขฆ บกญฃฒจกฐกธ กกขฒฃคตฅฃฆขงคฃจดฉขชผซฐณฌฃญขฎคฃฏดฐขฑผฒผณคฃดดตผถฒฃทธฟฟฟนทบปคทผฟฟฟฝทพฟคทฟฟฟทผขคท คขฐ ฒทฟฟฟคฟฟฟผขคคขฐฒขฝฏฒกณขข กญขฃฃคคฒฅฆฏงฒฅจกนฉฌชฝซฌฃญคฅฎฒฅฏฐผ ฑกฒนณกฟด ตกถทกผธฝนขฐบผปฒฏผญฝฌขฑพฐฟกธฃฐ ฝขฑ ขฐคฏญฒฏผ กกกทขฏผฐกฒญฃฐญขฐขฑฒขฟฟผ ขกพจทขขฃขคฌขฅฒฆพงขจคขฉคขชฐฃซคฌฒญฎฝฏฐฐณฑพจทฒขณขดตกกถฟทผธกนฌปบจกฐปผผฐฝพทฟฟพฟฌปข กญขทฟฒญฃกกญฌฌญฒญฐญฒฐฐคขพขก ทกขฟฃคญฅฒฆงฃจกฉกญชฌซฒฌธญญฎฏขฐญฑฒฆฒณญดผ ตตถทขธดนตบปขผดฝขพดฟขขตขด ขขกธขฟฟฟขฒคฒฒฒฟฟถขฟฟฟธนกธนธนขธน ผ กขธนคฃ ผคผฅฐฃฆ ฝงผจฒฉคขชฐซฌฌญคขฎฐญฏธฐผ ฑทฒพณดตผ ถฐตทธผ นดบขปผฟฟฝฎพขฟทขกขฟ ขทคทฒทฏตฎคผฒฌฏขด ดจญผฒฟฟถขขกฐฌฏฏผ ฐคกคขขฐฃฒคญฅกปฆฏฏงฏจฏฑฉขชกซฎฌฏฐญฎคฏฒฐฑฃฒกณกดฒฐตผ ถตทธดนกบขปฝผทฝพฏฏฟคฐฒฐข ทฏฏฒฎฉฌฎซฐฎฉผฎฉผด จกชฒฎฉกปฎฉฐฎชฎฐพญฐกธ ตกฎงขฎฃฐชคคฅคฆคงฝจด ฉฐกชกถซฎงฌญขฎขฏดฐขฑคฒฒณดฏฆตผถคฏฆทฏฆธนฏงบผปฐถผฒณฝพขฟณกฏคฏฏ ฏผฐฏฏงทญฏจคญฎญฎฏฌฏฅขกปฏฎคฏขฟฟฟฏฃฏคฏฆฒฝ กจกงขผฃฒ คฌกฅฐฐฆตงฌกจผฉคคชฌกปซฐฒฌดญคคฎคคคฏฒ ฐฑฒ ฒคคณฌกดฐตถกปทธฝนถบคคปฒ ผฝคฅพฌกขฟฐคคฅฒผกซธคค ฒ ก คคกปคฉคฅฒธธ ฌฝฟฟฟญธขฒฎฃคฎฃฒทญ ฎฆกขญฃคฒฅฆงฎฉจฉฎซชธซฎซฌผญฒฅฎฌกฏฐฒฐฏคฑฒฅฒฏฐณฒฅดตถทฎคธผนฌฏขบผปผฒดฝพฟฟนฟขกขขผฐ ฏจกธผฐฟฟขกขขขผคขคขฐขขคขคขฐฏจกฝฏฒฝ กฟฟฟขฃขคคฅฏฆจกงผจฒฉฟฟธชฏคซผฌถ ญขฎผฏฒฐฏฆฑฏฆฒณฏงดผตฐถขทธฏจนฎบผปฐผฏฉฝฎพผฟฐฏชฎผฐฏซ ฎผฐฏงคฒคฏฆคขฐฑฒฏผ ต ข ดกขกข ผ ตดกข ขกทขฃฏคฅฒฆงขกจฉพฏชซฟฟฟฌข ญฎฟฟดฏขขฐฑฎฒผณฐทดคขขตฐฐถฒฆทฟฟฟธนบฟฟฟปผฝพฟคขขฐฝขกฆฒฆ ฏฆถขฃชขคขฃจก กขฅทฏงขฃกฃกฏคผฒฏงฒขค กขฅขฅฃทคฏงฅฆงขคจฆฉฒชซถ ฌขฆญฏฎจกธฏผฐฐฑขฆฒฃณกดกตฐฝถกทขฆธขฆนผบฅปขฆผฒชฝฅพขงฟทฏฟฟ นขงฆขงฏฏฏกธฏขฆถ ฃกกฌกขงขงผฅขงขจขฆจก กกขงขขงฃผคฒชฅฅฆขฆงขจจฉขฆชขงซขจฌฆญขฆฎฒชฏฐขฉฑฏฒถณดฏตฐบถทขฉธขนฏบฟฟฟปถผฝพคถฟถขชคถกด ฏฏค ผขฉผฃกขชขชขซผกผฒถขชขฉชขฌขฉจก กข ฏฐผ กคขฉขคขชฃฐฏค ฏฅฐญฆขฉงฃจกฉฏคชฏคซขฌฌฆญขซฎฒถฏขฉฐจก ฑผฒฐณ ฏดฐตขฌถฆทฐธนฎบฐปผฏฏฝผพฟฏฑฒธฏคฆ ฏคฒ นธงกฐธงฑธงชญผฐธงญฟฟฟญญผผฐญฟฟฟญฐญธฐถธคฌพคญฐผ คญฏกคฌผขผฃฟฟฟคฅธคฆญงผจคญฉผชบซญฌผญฐญฎค ปฏผฐฐฑฌกฒฐญณคญดฐญตฐถธนทฐพธฟฟฟน ผบธนป ฝผธนกฝฐญพธชฟผฐธ ญผฐญ ขผฐญฐญกญฌฝธ งฟฟถ ปฐญผฐธขฐญผฐธญธฐญธฐตญผคญ ธกญขฌกฉฃฐ คกฅฆญงญจฒฉญชญซฌกจฌผญฐญฎญฏผฐกปฑญฒ ณบดฐญตธถฐทธธบนฐญบปญผผฝฒบพญฟญผฐคญกฅ ฐธฌก ฌกผฒบญกผ ผญฒบญฒญฒบธฃฐคธฃธฃญฌกฐ คกผ ญกฒขญฃฐญคธฅฐฆญงผจฐญฉญชธซญฌฐฏญธฎญฏญฐผฑฐธฒกณดฐตญถฌกทฐธญนผบฐพปญผญฝฐฏพธฟญฒกปญฐญญ ญญฒญฐญธฐธกฅฐธฐญญฒญฐญธคฐฅธคธคฌฟจกซผฐญญ ฒกญขฝฃธคคฐญฅธทฆฐฌงธทจญกฉฟฟฟชญ ซฐญฌธทญฎผฏ นฐธขฑฒฒณขญดฟฟถตขฎถ พท ธ ฟน บขญปผผขญฝผพฐ ฟข ก ก คขฎ ฐบ ฝ ฒฒ ก ญ ฝ ฒ ก ท ก ฅ ผ ฐ ก ฅ ผ ฐ ญ ฒ ญ ญ ฒ ญ ก ขฐญ ฃฐ ฒ คก ฅ ธ ฆก งฅ จผ ฉฐ ฆ ชญ ซฒ ฌญ ญญ ฎฒ ฏญ ฐ ฑฐญ ฒ ณ ด น ตฐ ถ ท ธ น บ ป ผ ฝ พญฑ ฟญฑกกฎฌกฏกฟกจดก คฉกญคกขฐกขฐกฃกฎกดก ก กกกกกก กกกกกกกกกกก กญก ฟกกกขกกฃกคกฅกฆญกงฟกจกฉฝกชฟกซกฌ กญผฟกฎกฏฟฒกฐฟฟกฑกฒกณกดกตฟฟกถกทกธกนกบกป กผจกฝฏฟฟกพฐกฟดขธขฟฟขฟฟฐขฟฟฝขฟฟฟขฐฃขฑคขฃฃฃฃฃฃฃฃฃ ฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃ ฃฃ ฃขฃกฃขฃคฃฃฃคฃฆฃฅฃฆฃจฃงฃจฃชฃฉฃชฃฌฃซฃฌฃฎฃญฃฎฃฐฃฏฃฐฃฒฃฑฃฒฃดฃณฃดฃถฃตฃถฃธฃทฃธฃบฃนฃบฃผฃปฃผฃพฃฝฃพคฃฟคคคคคคคคค คคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคค คค คขคกคขคฃคฆจฏคงฟ คจฅฅธฅธขฅธคฅพฐฅธขฅฅพคฆฅฅฝฅฒฅฐฅทฅฟฅญขฅฅกฅฅกฅฌฅฅฝฅถฅฅฅ ฑฌปฌปญญฑญฒญณญดญต ญถญทญธญนญบญปญผญฝ ญพญฟฎฎฎฎฎฎ ฎฎฎฎฎฎฎฎ ฎฎฎฎฎฎฎฎ ฎฎฎฎฎฎคฟฟฟฎฅฎฆฎงญฑฎจฎฉฎชฎซฏฏฏฑผ \ No newline at end of file diff --git a/binaries/alt/image.fs b/binaries/alt/image.fs new file mode 100644 index 0000000..1786bc4 Binary files /dev/null and b/binaries/alt/image.fs differ diff --git a/binaries/alt/unixv0.simh b/binaries/alt/unixv0.simh new file mode 100644 index 0000000..38593b0 --- /dev/null +++ b/binaries/alt/unixv0.simh @@ -0,0 +1,13 @@ +set cpu 8k +set cpu eae +set cpu history=100 +show cpu + +set tti unix +set rb ena +att rb image.fs +show dev + +load -S a.rim +dep pc 0100 +go diff --git a/binaries/a.rim b/binaries/orig/a.rim similarity index 100% rename from binaries/a.rim rename to binaries/orig/a.rim diff --git a/binaries/image.fs b/binaries/orig/image.fs similarity index 99% rename from binaries/image.fs rename to binaries/orig/image.fs index 3a707a7..3bb1469 100644 Binary files a/binaries/image.fs and b/binaries/orig/image.fs differ diff --git a/binaries/unixv0.simh b/binaries/orig/unixv0.simh similarity index 100% rename from binaries/unixv0.simh rename to binaries/orig/unixv0.simh diff --git a/build/Makefile b/build/Makefile index 9f980fa..88edea7 100644 --- a/build/Makefile +++ b/build/Makefile @@ -21,7 +21,7 @@ TESTDIR=tests BINARIES=../binaries/ -all: cmd others a.rim image.fs copybinaries +all: cmd others a.rim image.fs # Make alternative everything: no dd but . and .. alt: altcmd altothers alt/a.rim alt/image.fs @@ -33,7 +33,18 @@ run: # Alternative run, use the alt/image.fs altrun: - $(PDP7) alt/unixv0.simh + cd alt; $(PDP7) unixv0.simh + +dist: all alt + mkdir -p $(BINARIES) + mkdir -p $(BINARIES)/orig + mkdir -p $(BINARIES)/alt + cp image.fs $(BINARIES)/orig + cp a.rim $(BINARIES)/orig + cp unixv0.simh $(BINARIES)/orig + cp alt/image.fs $(BINARIES)/alt + cp alt/a.rim $(BINARIES)/alt + cp alt/unixv0.simh $(BINARIES)/alt # Warm boot Unix kernel: boots into init and a login prompt a.rim: @@ -63,13 +74,6 @@ alt/image.fs: altcmd altothers $(MKFS) -1 -2 -3 -o alt/image.fs alt/proto $(FSCK) -3 alt/image.fs - -copybinaries: - mkdir -p $(BINARIES) - cp image.fs $(BINARIES) - cp a.rim $(BINARIES) - cp unixv0.simh $(BINARIES) - clean: rm -f a.rim image.fs a.lst n.out alt/image.fs alt/a.rim alt/a.lst rm -rf $(BINDIR) $(TESTDIR) diff --git a/build/alt/a.lst b/build/alt/a.lst new file mode 100644 index 0000000..adb4508 --- /dev/null +++ b/build/alt/a.lst @@ -0,0 +1,5376 @@ + "** 01-s1.pdf page 62 + " sop + dac = 0040000 " MEM: deposit AC + 040000 + jms = 0100000 " MEM: jump to subroutine + 100000 + dzm = 0140000 " MEM: deposit zero to memory + 140000 + lac = 0200000 " MEM: load AC + 200000 + xor = 0240000 " MEM: XOR with AC + 240000 + add = 0300000 " MEM: one's complement add + 300000 + tad = 0340000 " MEM: two's complement add + 340000 + xct = 0400000 " MEM: execute + 400000 + isz = 0440000 " MEM: increment and skip if zero + 440000 + and = 0500000 " MEM: AND + 500000 + sad = 0540000 " MEM: skip if AC different + 540000 + jmp = 0600000 " MEM: jump + 600000 + nop = 0740000 " OPR: no-op + 740000 + i = 020000 " indirect + 020000 + law = 0760000 " OPR: load accumulator with (instr) + 760000 + cma = 0740001 " OPR: complement AC + 740001 + las = 0750004 " OPR: load AC from switches + 750004 + ral = 0740010 " OPR: rotate AC left + 740010 + rar = 0740020 " OPR: rotate AC right + 740020 + hlt = 0740040 " OPR: halt + 740040 + sma = 0740100 " OPR: skip on minus AC + 740100 + sza = 0740200 " OPR: skip on zero AC + 740200 + snl = 0740400 " OPR: skip on non-zero link + 740400 + skp = 0741000 " OPR: skip unconditionally + 741000 + spa = 0741100 " OPR: skip on positive AC + 741100 + sna = 0741200 " OPR: skip on non-zero AC + 741200 + szl = 0741400 " OPR: skip on zero link + 741400 + rtl = 0742010 " OPR: rotate two left + 742010 + rtr = 0742020 " OPR: rotate two right + 742020 + cll = 0744000 " OPR: clear link + 744000 + rcl = 0744010 " OPR: clear link, rotate left + 744010 + rcr = 0744020 " OPR: clear link, rotate right + 744020 + cla = 0750000 " OPR: clear AC + 750000 + lrs = 0640500 " EAE: long right shift + 640500 + lrss = 0660500 " EAE: long right shift, signed + 660500 + lls = 0640600 " EAE: long left shift + 640600 + llss = 0660600 " EAE: long left shift, signed + 660600 + als = 0640700 " EAE: AC left shift + 640700 + alss = 0660700 " EAE: AC left shift, signed + 660700 + mul = 0653122 " EAE: multiply + 653122 + idiv = 0653323 " EAE: integer divide + 653323 + lacq = 0641002 " EAE: load AC with MQ + 641002 + clq = 0650000 " EAE: clear MQ + 650000 + omq = 0640002 " EAE: OR MQ into AC + 640002 + cmq = 0650004 " EAE: complement MQ + 650004 + lmq = 0652000 " EAE: load MQ from AC + 652000 + dscs = 0707141 " DSK: clear status register + 707141 + dslw = 0707124 " DSK: clear and load WC from AC + 707124 + dslm = 0707142 " DSK: clear and load MAC from AC + 707142 + dsld = 0707104 " DSK: clear and load TA and SA from AC + 707104 + dsls = 0707144 " DSK: load status + 707144 + dssf = 0707121 " DSK: skip on flags + 707121 + dsrs = 0707132 " DSK: read status register + 707132 + iof = 0700002 " PIC: interrupts off + 700002 + ion = 0700042 " PIC: interrupts on + 700042 + caf = 0703302 " CPU: clear all flags + 703302 + clon = 0700044 " CLK: clear flag, enable + 700044 + clsf = 0700001 " CLK: skip if overflow + 700001 + "** 01-s1.pdf page 63 + clof = 0700004 " CLK: clear flag, disable + 700004 + ksf = 0700301 " KBD: skip if flag set + 700301 + krb = 0700312 " KBD: read buffer + 700312 + tsf = 0700401 " TTY: skip if flag set + 700401 + tcf = 0700402 " TTY: clear flag + 700402 + tls = 0700406 " TTY: load buffer, select + 700406 + sck = 0704301 " G-2: skip on console keyboard + 704301 + cck = 0704304 " G-2: clear console keyboard + 704304 + lck = 0704312 " G-2: load console keyboard + 704312 + rsf = 0700101 " PTR: skip if flag set + 700101 + rsa = 0700104 " PTR: select alphanumeric mode + 700104 + rrb = 0700112 " PTR: clear flag, or read buffer + 700112 + psf = 0700201 " PTP: skip if flag set + 700201 + pcf = 0700202 " PTP: clear flag + 700202 + psa = 0700204 " PTP: alphanumeric mode + 700204 + cdf = 0700501 " G-2: clear display flags + 700501 + lds = 0701052 " G-2: load display status + 701052 + lda = 0701012 " G-2: load display address + 701012 + wcga = 0704206 " G-2: ??? + 704206 + raef = 0700742 " G-2: resume after edges flag + 700742 + rlpd = 0700723 " G-2: resume after light pen stop, disabled + 700723 + beg = 0700547 " G-2: begin + 700547 + spb = 0704401 " G-2: skip on push button flag + 704401 + cpb = 0704404 " G-2: clear push button flag + 704404 + lpb = 0704412 " G-2: load push buttons + 704412 + wbl = 0704424 " G-2: write button lights + 704424 + dprs = 0704752 " dataphone: read status + 704752 + dpsf = 0704741 " dataphone: skip on flag + 704741 + dpcf = 0704761 " dataphone: clear flag + 704761 + dprc = 0704712 " dataphone: read character + 704712 + crsf = 0706701 " CDR: skip if ready + 706701 + crrb = 0706712 " CDR: read buffer + 706712 + " S1 + .. = 0 + 000000 + t = 0 + 000000 + orig: + hlt " overwritten with interrupt return addr +000000: 740040 + jmp pibreak " dispatch to interrupt processing +000001: 603407 + . = orig+7 + 1000007 + -1 " only ever set (to -1): never read?! +000007: 777777 + . = orig+020 " syscall (CAL) and user "interrupt" processing + 1000020 + 1f " addr for "CAL I": store return here on "CAL" +000020: 000032 + iof " interrupts off +000021: 700002 + dac u.ac " save user AC +000022: 045631 + lac 020 " save user return addr +000023: 200020 + dac 1f " save as if "CAL I" +000024: 040032 + lac 1f-1 +000025: 200031 + dac 020 " restore location 20 +000026: 040020 + lac u.ac " restore user AC +000027: 205631 + jmp 1f+1 " join "CAL I" processing +000030: 600033 + 1f " literal to restore location 20 +000031: 000032 + 1: 0 " "CAL I" PC stored here +000032: 000000 + iof " interrupts off +000033: 700002 + dac u.ac " save user AC +000034: 045631 + lacq +000035: 641002 + dac u.mq " save user MQ +000036: 045632 + lac 8 +000037: 200010 + dac u.rq " save user auto-index location 8 +000040: 045633 + lac 9 +000041: 200011 + dac u.rq+1 " save user auto-index location 9 +000042: 045634 + jms copy; 10; u.rq+2; 6 " save user auto-index locations 10-15 +000043: 101667 +000044: 000012 +000045: 005635 +000046: 000006 + lac 1b " load user PC after system call +000047: 200032 + dac u.rq+8 " save user PC +000050: 045643 + -1 " load -1 +000051: 777777 + dac .savblk " set "save" flag (cleared by disk I/O?) +000052: 044072 + dac .insys " set "in system" flag +000053: 044066 + lac uquant " load user quantum count +000054: 205474 + jms betwen; d0; maxquant " check if between 0 & maxquant?? +000055: 101643 +000056: 004116 +000057: 004100 + jms swap " no: swap processes +000060: 100136 + ion " interrupts on +000061: 700042 + -1 +000062: 777777 + tad u.rq+8 " get address of system call +000063: 345643 + jms laci " load AC indirect?? +000064: 101635 + jms betwen; o20001; swn " range check +000065: 101643 +000066: 004161 +000067: 000256 + jmp badcal " bad system call +000070: 601146 + tad swp " add system call table base +000071: 340220 + dac .+1 " save as next instruction +000072: 040073 + jmp .. i " dispatch system call +000073: 620000 + . = orig+0100 + 1000100 + jmp coldentry " here to start kernel +000100: 604507 + jms halt +000101: 102254 + okexit: + dzm u.ac " 'OK' system call exit: clear user AC +000102: 145631 + sysexit: " common system call exit code + ion " enable interrupts +000103: 700042 + lac .savblk " load "save" flag +000104: 204072 + sza " is zero (cleared by disk I/O)? +000105: 740200 + jmp 1f " no: no disk I/O done? +000106: 600116 + jms copy; sysdata; dskbuf; 64 " copy system data to disk buffer +000107: 101667 +000110: 005542 +000111: 007700 +000112: 000100 + cla +000113: 750000 + jms dskio; 07000 " save to disk? +000114: 102162 +000115: 007000 + 1: + dzm .insys " clear "in system call" flag +000116: 144066 + jms chkint " pending user interrupt? +000117: 100320 + skp " no +000120: 741000 + jmp .save " yes: dump core +000121: 601151 + jms copy; u.rq+2; 10; 6 " restore auto-index locations 10-15 +000122: 101667 +000123: 005635 +000124: 000012 +000125: 000006 + lac u.rq+1 " restore auto-index location 9 +000126: 205634 + dac 9 +000127: 040011 + lac u.rq " restore auto-index location 8 +000130: 205633 + dac 8 +000131: 040010 + lac u.mq " restore MQ register +000132: 205632 + lmq +000133: 652000 + lac u.ac " restore AC register +000134: 205631 + jmp u.rq+8 i " return to user +000135: 625643 + " scheduler / idle loop + swap: 0 +000136: 000000 + ion +000137: 700042 + 1: + jms lookfor; 3 " out/ready +000140: 101066 +000141: 000003 + jmp 1f +000142: 600151 + jms lookfor; 1 " in/ready +000143: 101066 +000144: 000001 + skp +000145: 741000 + jmp 1b " loop until a process becomes ready +000146: 600140 + dzm maxquant " in/ready (self?): come back next tick! +000147: 144100 + jmp 3f +000150: 600215 + 1: " here with out/ready process + dac 9f+t " save process pointer (swapped out) in t0 +000151: 044205 + jms lookfor; 2 " in/notready " find a swapped in process to swap out? +000152: 101066 +000153: 000002 + jmp 1f +000154: 600161 + jms lookfor; 1 " in/ready +000155: 101066 +000156: 000001 + jmp 1f +000157: 600161 + jmp 2f +000160: 600177 + 1: + lac swap +000161: 200136 + dac u.swapret " return to caller when swapped back +000162: 045650 + iof +000163: 700002 + lac o200000 " change status to swapped out +000164: 204170 + tad u.ulistp i +000165: 365647 + dac u.ulistp i +000166: 065647 + ion +000167: 700042 + jms dskswap; 07000 " swap process out +000170: 102267 +000171: 007000 + lac u.dspbuf +000172: 205712 + sna " process using display?? +000173: 741200 + jmp 2f " no +000174: 600177 + law dspbuf " reset to default display buffer +000175: 764446 + jms movdsp +000176: 102615 + 2: + iof " disable interrupts +000177: 700002 + lac o600000 " change status (1->7???] +000200: 204176 + tad 9f+t i +000201: 364205 + dac 9f+t i +000202: 064205 + ion " enable interrupts +000203: 700042 + jms dskswap; 06000 " read process in? +000204: 102267 +000205: 006000 + lac u.swapret " set our return addr +000206: 205650 + dac swap " to saved return addr +000207: 040136 + lac o20 " reset maxquant to 16 ticks +000210: 204134 + dac maxquant +000211: 044100 + lac u.dspbuf +000212: 205712 + sza " using display? +000213: 740200 + "** 01-s1.pdf page 4 + jms movdsp " yes. switch to user display bufferx +000214: 102615 + 3: + dzm uquant " no. reset process tick count +000215: 145474 + iof +000216: 700002 + jmp swap i " return +000217: 620136 + t = t+1 + 000001 + swp: " system call dispatch table + jmp . " base instruction +000220: 600220 + .save; .getuid; .open; .read; .write; .creat; .seek; .tell +000221: 001151 +000222: 000426 +000223: 000626 +000224: 000724 +000225: 000773 +000226: 000660 +000227: 000431 +000230: 000461 + .close; .link; .unlink; .setuid; .rename; .exit; .time; .intrp +000231: 000720 +000232: 000467 +000233: 000542 +000234: 000561 +000235: 000567 +000236: 001163 +000237: 000610 +000240: 000257 + .chdir; .chmod; .chown; badcal; .sysloc; badcal; .capt; .rele +000241: 000615 +000242: 000407 +000243: 000421 +000244: 001146 +000245: 000262 +000246: 001146 +000247: 000377 +000250: 000403 + .status; badcal; .smes; .rmes; .fork +000251: 000352 +000252: 001146 +000253: 001225 +000254: 001177 +000255: 001111 + swn: + .-swp-1 i " count of system calls, plus indirect! +000256: 020035 + " AC/ new value for intflg (non-zero to ignore interrupt char) + " sys intrp + .intrp: + lac u.ac +000257: 205631 + dac u.intflg +000260: 045713 + jmp okexit +000261: 600102 + " syscall to retrieve system addresses (data & routines!!) + " AC/ index (1..17) + " sys sysloc + " AC/ address (or -1 on bad index) + .sysloc: + lac u.ac +000262: 205631 + and o17777 +000263: 504160 + jms betwen; d1; locn +000264: 101643 +000265: 004117 +000266: 000317 + jms error +000267: 101531 + tad locsw +000270: 340275 + dac .+1 +000271: 040272 + lac .. +000272: 200000 + dac u.ac +000273: 045631 + jmp sysexit +000274: 600103 + locsw: " table of system addresses for sysloc + lac . +000275: 200275 + iget; inode; userdata; sysdata; copy; copyz; betwen; dskrd +000276: 003017 +000277: 005732 +000300: 005631 +000301: 005542 +000302: 001667 +000303: 001712 +000304: 001643 +000305: 002116 + dskwr; dskbuf; dpdata; namei; pbsflgs; alloc; free; dspdata +000306: 002146 +000307: 007700 +000310: 005532 +000311: 002737 +000312: 005476 +000313: 001545 +000314: 001604 +000315: 005536 + crdata +000316: 005540 + locn: + .-locsw-1 +000317: 000021 + " check if "interrupt" for current process + " checks .int1 and .int2 (contain i-number of interrupt source) + " compared against process stdin + " + " call: + " .insys/ 0 + " jms chkint + " no: no interrupt, or intflg set (discards interrupt) + " yes: PI off, .insys set + chkint: 0 +000320: 000000 + lac .insys +000321: 204066 + sza " in system? +000322: 740200 + jmp chkint i " yes: return +000323: 620320 + lac .int1 " get inumber of interrupt1 source? +000324: 204067 + sna " zero? +000325: 741200 + jmp 1f " yes: skip stdin check +000326: 600331 + sad u.ofiles+2 " non-zero: compare to stdin inumber +000327: 545656 + jmp 2f " same +000330: 600341 + 1: + lac .int2 " get inum of interrupt 2 source? +000331: 204070 + sna " zero? +000332: 741200 + jmp chkint i " yes: return +000333: 620320 + sad u.ofiles+2 " non-zero: compare to stdin inumber +000334: 545656 + skp " match! +000335: 741000 + jmp chkint i " no match: return +000336: 620320 + dzm .int2 " clear int2 source +000337: 144070 + jmp 1f +000340: 600342 + 2: + dzm .int1 " clear int1 source +000341: 144067 + 1: + "** 01-s1.pdf page 5 + lac u.intflg " get user intflg +000342: 205713 + sza " zero? +000343: 740200 + jmp chkint i " no: ignore +000344: 620320 + -1 +000345: 777777 + dac .insys " set "in system" flag +000346: 044066 + ion " enable interrupts +000347: 700042 + isz chkint " give skip return +000350: 440320 + jmp chkint i +000351: 620320 + "** 01-s1.pdf page 7 + " s2 + " file status (stat) system call + " AC/ pointer to status (inode) buffer + i-num (13 words) + " sys status; dir_name_ptr; file_name_ptr + " NO_DD version: sys status; file_name_ptr + .status: + jms arg " fetch file name pointer +000352: 102625 + dac .+3 +000353: 040356 + lac u.cdir " get current working directory +000354: 205646 + jms namei; .. " look up file +000355: 102737 +000356: 000000 + jms error " not found: return error +000357: 101531 + jms iget " read file inode +000360: 103017 + lac u.ac " get user buffer pointer +000361: 205631 + and o17777 " truncate to 13 bits +000362: 504160 + jms betwen; o10000; o17762 " is user memory (but not last 14 wds)? +000363: 101643 +000364: 004156 +000365: 004157 + jms error " no: error +000366: 101531 + dac .+3 " save as copy destination +000367: 040372 + jms copy; inode; ..; 12 " copy inode to user buffer +000370: 101667 +000371: 005732 +000372: 000000 +000373: 000014 + lac d.i " copy i-num from last dnode read ?? +000374: 205747 + dac 9 i " save thru index 9 (pre-increment) ?? +000375: 060011 + jmp okexit +000376: 600102 + " capture display? + .capt: + lac u.ac " get user AC +000377: 205631 + dac u.dspbuf " save as user display buffer +000400: 045712 + jms movdsp " switch to user display buffer +000401: 102615 + jmp sysexit +000402: 600103 + " release display? + .rele: + dzm u.dspbuf " clear user display buffer pointer +000403: 145712 + law dspbuf " get default display buffer +000404: 764446 + jms movdsp " change to it +000405: 102615 + jmp sysexit +000406: 600103 + .chmod: + jms isown " check if user owns file arg +000407: 102664 + lac u.ac " get new permissions +000410: 205631 + and o17 " mask to read/write bits +000411: 504133 + lmq " save in MQ +000412: 652000 + lac i.flags " get file flags +000413: 205732 + and o777760 " clear permissions +000414: 504202 + omq " or in new permissions from MQ +000415: 640002 + dac i.flags " save in inode +000416: 045732 + jms iput " write inode back +000417: 103046 + jmp okexit +000420: 600102 + .chown: + jms isown " check if user owns file arg +000421: 102664 + lac u.ac " get new owner +000422: 205631 + dac i.uid " save in inode +000423: 045742 + jms iput " write inode back +000424: 103046 + jmp okexit +000425: 600102 + .getuid: " getuid system call + lac u.uid +000426: 205644 + dac u.ac " return u.uid in user AC +000427: 045631 + jmp sysexit +000430: 600103 + .seek: + jms seektell +000431: 102645 + tad u.base +000432: 345651 + "** 01-s1.pdf page 8 + spa +000433: 741100 + jms error +000434: 101531 + lmq +000435: 652000 + lac f.flags +000436: 205757 + and d1 +000437: 504117 + sna +000440: 741200 + jms 1f +000441: 100450 + lacq +000442: 641002 + jms betwen; d0; i.size +000443: 101643 +000444: 004116 +000445: 005744 + jms dacisize +000446: 103402 + jmp 2f +000447: 600455 + 1: + lacq +000450: 641002 + jms betwen; d0; i.size +000451: 101643 +000452: 004116 +000453: 005744 + lac i.size +000454: 205744 + 2: + dac f.badd +000455: 045760 + dac u.ac +000456: 045631 + jms fput +000457: 102402 + jmp sysexit +000460: 600103 + .tell: + jms seektell +000461: 102645 + cma +000462: 740001 + tad d1 +000463: 344117 + tad u.base +000464: 345651 + dac u.ac +000465: 045631 + jmp sysexit +000466: 600103 + .link: + jms arg " Save the argument pointers in +000467: 102625 + dac 0f "0f, 1f and 2f +000470: 040477 + jms arg +000471: 102625 + dac 1f +000472: 040502 + jms arg +000473: 102625 + dac 2f +000474: 040506 + lac u.cdir " Search the current directory +000475: 205646 + jms namei; 0:0 " for the first argument +000476: 102737 +000477: 000000 + jms error " Didn't find it +000500: 101531 + jms namei; 1:0 " In the i-num found by 1st namei, +000501: 102737 +000502: 000000 + jms error " search for 2nd argument, err not found +000503: 101531 + dac u.base " save in user data +000504: 045651 + jms copy; 2:0; name; 4 +000505: 101667 +000506: 000000 +000507: 005504 +000510: 000004 + lac u.cdir " Search the process' current directory +000511: 205646 + jms namei; name " for the third argument +000512: 102737 +000513: 005504 + skp +000514: 741000 + jms error " Error if it already exists +000515: 101531 + lac d1 +000516: 204117 + dac mode " Save mode bits for access +000517: 045500 + jms access " check access (or return error to user) +000520: 102312 + jms dslot " allocate directory slot +000521: 102463 + lac u.base " get source file i-number +000522: 205651 + jms iget " read inode in +000523: 103017 + lac ii " get the i-num +000524: 205731 + dac d.i " Save the i-num in the directory entry +000525: 045747 + jms copy; name; d.name; 4 " Copy the new link name into the directory entry +000526: 101667 +000527: 005504 +000530: 005750 +000531: 000004 + lac i.uniq " Copy the i-node unique number into +000532: 205745 + dac d.uniq " the directory entry +000533: 045754 + -1 +000534: 777777 + tad i.nlks " Decrement link count, i.e. one more link +000535: 345743 + dac i.nlks +000536: 045743 + "** 01-s1.pdf page 9 + jms iput " Save the i-node and directory entry for +000537: 103046 + jms dput " the new link +000540: 103136 + jmp okexit " and return OK +000541: 600102 + .unlink: + jms argname " fetch filename, inode +000542: 102631 + dac u.base " save i-number +000543: 045651 + lac d1 " write mode bit +000544: 204117 + dac mode " save for access call +000545: 045500 + jms access " check access or return error (reads inode) +000546: 102312 + dzm d.i " clear directory i-num +000547: 145747 + jms dput " write directory entry back +000550: 103136 + lac u.base " get i-number back +000551: 205651 + jms iget " read inode back +000552: 103017 + isz i.nlks " increment link count (kept as negative count) +000553: 445743 + jmp 1f " not zero +000554: 600557 + jms itrunc " zero links: free blocks +000555: 102675 + dzm i.flags " clear status (free inode) +000556: 145732 + 1: + jms iput " write inode back to disk +000557: 103046 + jmp sysexit +000560: 600103 + .setuid: " setuid system call + lac u.uid " load current user id +000561: 205644 + sma " negative (super user) +000562: 740100 + jms error " no: error!! +000563: 101531 + lac u.ac " load user AC +000564: 205631 + dac u.uid " save as new uid +000565: 045644 + jmp sysexit +000566: 600103 + " rename system call: + " sys rename; old_name_ptr; new_name_ptr + " Questions: + " when is directory entry read?? + " is access check on directory or src file?? + " check for existing file with new name?? + " when is directory entry written back?? + .rename: + jms arg " fetch first arg (old name pointer) +000567: 102625 + dac 0f " save for namei +000570: 040575 + jms arg " fetch second arg (new name pointer) +000571: 102625 + dac 1f " save for copy +000572: 040603 + lac u.cdir " get CWD +000573: 205646 + jms namei; 0:0 " search for (old) name +000574: 102737 +000575: 000000 + jms error " not found: return error +000576: 101531 + lac d1 " get write mode bit +000577: 204117 + dac mode " save for access call +000600: 045500 + jms access " access OK? (or return error to user) +000601: 102312 + jms copy; 1:0; d.name; 4 " copy new name into directory entry +000602: 101667 +000603: 000000 +000604: 005750 +000605: 000004 + jms dput " and write it to disk +000606: 103136 + jmp okexit +000607: 600102 + " time system call returns line (mains) frequency ticks + " high order bits returned in AC, low order in MQ + " s.tim is located in "system" block (written to disk) + " so this is a running count of uptime since first boot! + " at 60Hz, 36 bits would last 36+ years! + .time: + lac s.tim " load high order bits +000610: 205557 + dac u.ac " return in AC +000611: 045631 + lac s.tim+1 " load low order bits +000612: 205560 + dac u.mq " return in MQ +000613: 045632 + jmp sysexit +000614: 600103 + .chdir: + jms argname " fetch argument as filename +000615: 102631 + jms iget " (re)read inode(?] +000616: 103017 + lac i.flags " get flags +000617: 205732 + and o20 " get directory bit +000620: 504134 + sna " is a directory? +000621: 741200 + jms error " no: return error to user +000622: 101531 + lac ii " yes: get i-number +000623: 205731 + dac u.cdir " save as current working directory +000624: 045646 + "** 01-s1.pdf page 10 + jmp okexit +000625: 600102 + " open system call + " sys open; filename_ptr; flags (0 for read, 1 for write) + " returns w/ "fd" in AC (or -1 if not found) + .open: + jms arg " get filename +000626: 102625 + dac 0f " save for namei +000627: 040640 + jms arg " get flags +000630: 102625 + sza " zero (read) +000631: 740200 + lac d1 " no: get write mode bit +000632: 204117 + sna " non-zero (write)? +000633: 741200 + lac d2 " no: get read mode bot +000634: 204120 + dac mode " save for access call +000635: 045500 + lac u.cdir " get current working directory +000636: 205646 + jms namei; 0:0 " search for file +000637: 102737 +000640: 000000 + jms error " error: return -1 +000641: 101531 + jms iget " load inode +000642: 103017 + jms access " check access (may return w/ error to user) +000643: 102312 + lac i.flags " get file flags +000644: 205732 + and o20 " get directory bit +000645: 504134 + sna " is directory? +000646: 741200 + jmp open1 " no, join common code +000647: 600715 + lac mode " get access mode +000650: 205500 + and d1 " get write bit +000651: 504117 + sna " write access? +000652: 741200 + jmp open1 " no, continue +000653: 600715 + lac u.uid " yes: get uid? +000654: 205644 + sma " negative? (-1 is superuser) +000655: 740100 + jms error " no: return error +000656: 101531 + jmp open1 " yes: join common code +000657: 600715 + .creat: + lac d1 " mode bit 1 (write) +000660: 204117 + dac mode " save for access call +000661: 045500 + jms arg " get name pointer +000662: 102625 + dac .+2 " save for copy +000663: 040665 + jms copy; ..; name; 4 " copy filename to "name" +000664: 101667 +000665: 000000 +000666: 005504 +000667: 000004 + lac u.cdir +000670: 205646 + jms namei; name " look up in current working directory +000671: 102737 +000672: 005504 + jmp 1f " not found +000673: 600711 + jms iget " file exists: read inode +000674: 103017 + jms access " check access (or return error to user) +000675: 102312 + lac i.flags " get flags +000676: 205732 + and o20 " get directory bit +000677: 504134 + sna " is a directory? +000700: 741200 + jmp .+4 " no: skip to truncate +000701: 600705 + lac u.uid " get user +000702: 205644 + sma " is super user? +000703: 740100 + jms error " no: error +000704: 101531 + jms itrunc " yes: truncate +000705: 102675 + cla +000706: 750000 + jms dacisize " clear i.size +000707: 103402 + jmp open1 +000710: 600715 + 1: + jms access " here if not found +000711: 102312 + lac u.ac " get access bits from user AC (zero for lock!) +000712: 205631 + and o17 " mask to permissions +000713: 504133 + jms icreat +000714: 102475 + open1: " common exit for open/creat + jms fassign " assign fd slot +000715: 102327 + jms error " none free, return -1 +000716: 101531 + jmp sysexit +000717: 600103 + "** 01-s1.pdf page 11 + .close: + jms finac " get fnode (open file) for fd in user AC +000720: 103370 + dzm f.flags " clear flags +000721: 145757 + jms fput " write fnode back to u.ofiles +000722: 102402 + jmp sysexit +000723: 600103 + .read: + jms arg " get argument +000724: 102625 + and o17777 " mask to address +000725: 504160 + dac u.base " save as I/O base +000726: 045651 + jms arg " get second argument +000727: 102625 + dac u.count " save as count +000730: 045652 + lac u.base " get base +000731: 205651 + jms betwen; o10000; o17777 " end inside user memory? +000732: 101643 +000733: 004156 +000734: 004160 + jms error " no: error +000735: 101531 + tad u.count " get end of buffer +000736: 345652 + jms betwen; u.base; o17777 " inside buffer/user memory? +000737: 101643 +000740: 005651 +000741: 004160 + jms error " no: error +000742: 101531 + dac u.limit " yes: save as I/O limit +000743: 045653 + 1: + jms finac " get fnode for fd in user AC +000744: 103370 + lac f.flags " get open file flags +000745: 205757 + and d1 " get write bit +000746: 504117 + sza " open for write? +000747: 740200 + jms error " yes: error +000750: 101531 + lac i.flags " get inode flags +000751: 205732 + and o40 " get special file bit +000752: 504136 + sna " special? +000753: 741200 + jmp 1f " no +000754: 600762 + iof " yes: disable interrupts +000755: 700002 + lac ii " get i number +000756: 205731 + tad swr " add to base instruction +000757: 341324 + dac .+1 +000760: 040761 + jmp .. i " dispatch to read routine +000761: 620000 + 1: + lac u.base " get user base +000762: 205651 + dac 1f+1 " save as iread base +000763: 040770 + lac u.count " get user count +000764: 205652 + dac 1f+2 " save as iread count +000765: 040771 + lac f.badd " get file offset +000766: 205760 + 1: + jms iread; ..; .. +000767: 103266 +000770: 000000 +000771: 000000 + jmp exitrw +000772: 601034 + " write system call: + " AC/ fd + " sys write; buffer; count + " AC/ count or -1 on error + .write: + jms arg " pick up buffer +000773: 102625 + and o17777 " mask to addr +000774: 504160 + dac u.base " save as I/O base +000775: 045651 + jms arg " pick up count +000776: 102625 + dac u.count " save as count +000777: 045652 + tad u.base " add base (get limit) +001000: 345651 + jms betwen; u.base; o17777 " check between base and end of memory +001001: 101643 +001002: 005651 +001003: 004160 + jms error " no: error +001004: 101531 + dac u.limit " yes: save as limit +001005: 045653 + jms finac " get fnode with fd from user AC +001006: 103370 + lac f.flags " get open file table flags +001007: 205757 + and d1 " open for write? +001010: 504117 + sna " if yes, skip +001011: 741200 + jms error " no: error +001012: 101531 + lac i.flags " get inode flags +001013: 205732 + and o40 " get device bit +001014: 504136 + "** 01-s1.pdf page 12 + sna " special? +001015: 741200 + jmp 1f " no +001016: 601024 + iof " yes, special: turn interrupts off +001017: 700002 + lac ii " get i number +001020: 205731 + tad sww " get write routine entry addr +001021: 341324 + dac .+1 +001022: 041023 + jmp .. i " dispatch to write routine +001023: 620000 + 1: " here with regular file + lac u.base " get base +001024: 205651 + dac 1f+1 " save as iwrite arg 1 +001025: 041032 + lac u.count " get count +001026: 205652 + dac 1f+2 " save as iwrite 2 +001027: 041033 + lac f.badd " get fd offset +001030: 205760 + 1: + jms iwrite; ..; .. " write to file +001031: 103257 +001032: 000000 +001033: 000000 + exitrw: " common exit for read/write system calls + dac u.ac " save return in user AC +001034: 045631 + tad f.badd +001035: 345760 + dac f.badd " update file offset +001036: 045760 + jms iput " release inode +001037: 103046 + jms fput " release fnode +001040: 102402 + jmp sysexit " return to user +001041: 600103 + "** 01-s1.pdf page 14 + " s3 + " search for user (process) table entry + " call: + " jms searchu; worker_routine_addr + " worker called with copy of a process table entry in "lu" + " can return directly (from caller of searchu) + " index location 8 points to next process table entry + searchu: 0 +001042: 000000 + lac searchu i " fetch argument +001043: 221042 + dac 9f+t+1 " in t1 +001044: 044207 + -mnproc " loop counter +001045: 777766 + dac 9f+t " in t0 +001046: 044206 + law ulist-1 " ulist ptr +001047: 765560 + dac 8 " in index 8 +001050: 040010 + 1: + lac 8 i " copy ulist entry to lu +001051: 220010 + dac lu +001052: 045514 + lac 8 i +001053: 220010 + dac lu+1 +001054: 045515 + lac 8 i +001055: 220010 + dac lu+2 +001056: 045516 + lac 8 i +001057: 220010 + dac lu+3 +001060: 045517 + jms 9f+t+1 i " call argument as subroutine +001061: 124207 + isz 9f+t " returned: loop done? +001062: 444206 + jmp 1b " no, do it again +001063: 601051 + isz searchu " skip argument +001064: 441042 + jmp searchu i +001065: 621042 + t = t+2 + 000003 + " look for a process with matching status + " jms lookfor; status + " found: ulist ptr in AC + " not found + lookfor: 0 +001066: 000000 + jms searchu; 1f +001067: 101042 +001070: 001074 + isz lookfor " skip argument +001071: 441066 + isz lookfor " give skip return +001072: 441066 + jmp lookfor i +001073: 621066 + 1: 0 " worker called by searchu +001074: 000000 + lac lu +001075: 205514 + rtl; rtl; and o7 " bits 0:2 of lu +001076: 742010 +001077: 742010 +001100: 504125 + sad lookfor i " match argument? +001101: 561066 + skp " yes +001102: 741000 + jmp 1b i " no, return, keep going +001103: 621074 + -3 +001104: 777775 + tad 8 " roll index 8 back to this entry +001105: 340010 + and o17777 +001106: 504160 + isz lookfor " skip lookfor argument +001107: 441066 + jmp lookfor i " non-skip return +001110: 621066 + " fork system call: + " sys fork + " return at +1 in parent, child pid in AC + " return at +2 in child, parent pid in AC + .fork: + jms lookfor; 0 " not-used " find an unused process slot +001111: 101066 +001112: 000000 + skp +001113: 741000 + jms error " none found- return error +001114: 101531 + dac 9f+t " save ulist ptr in t0 +001115: 044210 + isz uniqpid " generate new pid +001116: 445513 + lac uniqpid +001117: 205513 + dac u.ac " return in child pid in AC +001120: 045631 + law sysexit +001121: 760103 + dac u.swapret " return from system call when swapped back in +001122: 045650 + lac o200000 " change process status to out/ready (1->3) +001123: 204170 + tad u.ulistp i +001124: 365647 + dac u.ulistp i +001125: 065647 + jms dskswap; 07000 " swap parent out +001126: 102267 +001127: 007000 + lac 9f+t " get unused ulist slot back +001130: 204210 + dac u.ulistp " set ulist pointer +001131: 045647 + lac o100000 " mark child in/notready? (3->2) +001132: 204166 + xor u.ulistp i +001133: 265647 + dac u.ulistp i +001134: 065647 + lac u.pid " get old (parent) pid +001135: 205645 + "** 01-s1.pdf page 15 + dac u.ac " return parent pid in AC +001136: 045631 + lac uniqpid +001137: 205513 + dac u.pid " set child pid +001140: 045645 + isz 9f+t " advance to second word in process table +001141: 444210 + dac 9f+t i " set pid in process table +001142: 064210 + isz u.rq+8 " give skip return +001143: 445643 + dzm u.intflg " clear int flag +001144: 145713 + jmp sysexit " return in child process +001145: 600103 + t= t+1 + 000004 + badcal: " bad (unimplemented) system call + clon " clear any pending clock interrupt? +001146: 700044 + -1 +001147: 777777 + dac 7 " set location 7 to -1?! +001150: 040007 + " fall into "save" system call + " Ken says save files could be resumed, and used for checkpointing! + .save: " "sys save" system call + lac d1 " get inode 1 (core file?) +001151: 204117 + jms iget +001152: 103017 + cla +001153: 750000 + jms iwrite; 4096; 4096 " dump core +001154: 103257 +001155: 010000 +001156: 010000 + jms iwrite; userdata; 64 " and user area +001157: 103257 +001160: 005631 +001161: 000100 + jms iput +001162: 103046 + .exit: + lac u.dspbuf +001163: 205712 + sna " process using display? +001164: 741200 + jmp .+3 " no +001165: 601170 + law dspbuf " yes: get default display buffer +001166: 764446 + jms movdsp " move display +001167: 102615 + jms awake +001170: 101304 + lac u.ulistp i +001171: 225647 + and o77777 " mark process table entry free +001172: 504165 + dac u.ulistp i +001173: 065647 + isz u.ulistp +001174: 445647 + dzm u.ulistp i " clear pid in process table +001175: 165647 + jms swap " find a new process to run +001176: 100136 + " exit falls into "rmes" !!! + " rmes system call + " sys smes + " returns with message delivered, or error if process does not exit + " AC/ sending pid + " MQ/ message + .rmes: + jms awake +001177: 101304 + lac o100000 " mark this process "not ready" +001200: 204166 + tad u.ulistp i " by incrementing status +001201: 365647 + dac u.ulistp i +001202: 065647 + law 2 +001203: 760002 + tad u.ulistp +001204: 345647 + dac 9f+t " pointer to msg status in proc table +001205: 044211 + -1 +001206: 777777 + dac 9f+t i " set to -1 (waiting for message) +001207: 064211 + jms swap " switch processes +001210: 100136 + law 2 +001211: 760002 + tad u.ulistp +001212: 345647 + dac 9f+t +001213: 044211 + lac 9f+t i " get msg status word +001214: 224211 + cma " complement (get sender pid) +001215: 740001 + dac u.ac " return in user AC +001216: 045631 + dzm 9f+t i " clear status word +001217: 164211 + isz 9f+t +001220: 444211 + lac 9f+t i " get message +001221: 224211 + dac u.mq " return in user MQ +001222: 045632 + dzm 9f+t i " clear message +001223: 164211 + jmp sysexit +001224: 600103 + t = t+1 + 000005 + "** 01-s1.pdf page 16 + " smes system call + " AC/ pid + " MQ/ message + " sys smes + " returns with message delivered, or error if process does not exit + .smes: + lac u.ac " get pid from user AC +001225: 205631 + sna spa " >0? +001226: 741300 + jms error " no: error +001227: 101531 + jms searchu; 1f " search for process +001230: 101042 +001231: 001237 + law 2 +001232: 760002 + tad u.ulistp +001233: 345647 + dac 9f+t +001234: 044212 + dzm 9f+t i +001235: 164212 + jms error +001236: 101531 + 1: 0 " worker for searchu +001237: 000000 + lac lu+1 " get pid +001240: 205515 + sad u.ac " match? +001241: 545631 + skp " yes +001242: 741000 + jmp 1b i " no +001243: 621237 + lac lu+2 " get mailbox status +001244: 205516 + sad dm1 " -1? +001245: 544204 + jmp 1f " yes +001246: 601265 + lac o100000 " no: bump our process status (to notready?) +001247: 204166 + tad u.ulistp i +001250: 365647 + dac u.ulistp i +001251: 065647 + law 2 +001252: 760002 + tad u.ulistp +001253: 345647 + dac 9f+t +001254: 044212 + lac u.ac +001255: 205631 + dac 9f+t i +001256: 064212 + jms swap +001257: 100136 + law 2 +001260: 760002 + tad u.ulistp +001261: 345647 + dac 9f+t +001262: 044212 + dzm 9f+t i +001263: 164212 + jmp .smes +001264: 601225 + 1: + -3 +001265: 777775 + tad 8 +001266: 340010 + dac 9f+t " pointer to dest process ulist entry +001267: 044212 + lac o700000 " complement process status? marks ready?? +001270: 204200 + tad 9f+t i +001271: 364212 + dac 9f+t i +001272: 064212 + isz 9f+t +001273: 444212 + isz 9f+t " point to mailbox word? +001274: 444212 + lac u.pid " get our pid +001275: 205645 + cma " complement +001276: 740001 + dac 9f+t i " store in mailbox?? +001277: 064212 + isz 9f+t " advance to next word +001300: 444212 + lac u.mq " get user MQ +001301: 205632 + dac 9f+t i " save as message +001302: 064212 + jmp okexit +001303: 600102 + t = t+1 + 000006 + " wake up process hanging on rmes for current process?? + awake: 0 +001304: 000000 + jms searchu; 1f +001305: 101042 +001306: 001310 + jmp awake i +001307: 621304 + 1: 0 " searchu worker +001310: 000000 + lac u.pid " get caller pid +001311: 205645 + sad lu+2 " match mailbox status? +001312: 545516 + skp " yes +001313: 741000 + jmp 1b i " no, return +001314: 621310 + -3 +001315: 777775 + tad 8 " get pointer to process table entry +001316: 340010 + dac 9f+t " save in t0 +001317: 044213 + "** 01-s1.pdf page 17 + lac o700000 +001320: 204200 + tad 9f+t i " complement process status (mark ready)?? +001321: 364213 + dac 9f+t i +001322: 064213 + jmp 1b i " return from worker +001323: 621310 + t = t+1 + 000007 + swr: + sww: + jmp .-4 i +001324: 621320 + .halt; rttyi; rkbdi; rppti; .halt +001325: 001336 +001326: 001337 +001327: 001410 +001330: 001461 +001331: 001336 + .halt; wttyo; wdspo; wppto +001332: 001336 +001333: 001357 +001334: 001451 +001335: 001475 + .halt: jms halt +001336: 102254 + " read routine for ttyin special file + rttyi: + jms chkint1 +001337: 101535 + lac d1 " ** written d3 ttyin2 +001340: 204117 + jms getchar +001341: 101745 + jmp 1f +001342: 601353 + and o177 +001343: 504147 + jms betwen; o101; o132 " upper case? +001344: 101643 +001345: 004141 +001346: 004143 + skp " no +001347: 741000 + tad o40 " yes: convert to lower +001350: 344136 + alss 9 +001351: 660711 + jmp passone +001352: 601523 + 1: + jms sleep; sfiles+0 +001353: 102434 +001354: 005520 + jms swap +001355: 100136 + jmp rttyi +001356: 601337 + " write routine for ttyout special file + wttyo: + jms chkint1 +001357: 101535 + jms forall +001360: 102412 + sna +001361: 741200 + jmp fallr +001362: 602425 + lmq +001363: 652000 + lac sfiles+1 +001364: 205521 + spa +001365: 741100 + jmp 1f +001366: 601376 + xor o400000 +001367: 244173 + dac sfiles+1 +001370: 045521 + lacq +001371: 641002 + tls " load output buffer +001372: 700406 + sad o12 " newline? +001373: 544130 + jms putcr " yes, put CR as well +001374: 104014 + jmp fallr +001375: 602425 + 1: + lacq +001376: 641002 + dac char +001377: 045511 + lac d2 "** written: d6 ttyout +001400: 204120 + jms putchar +001401: 101730 + skp +001402: 741000 + jmp fallr +001403: 602425 + jms sleep; sfiles+1 +001404: 102434 +001405: 005521 + jms swap +001406: 100136 + jmp wttyo +001407: 601357 + " read routine for (display) "keyboard" special file + rkbdi: + jms chkint1 +001410: 101535 + lac d3 +001411: 204121 + jms getchar +001412: 101745 + "** 01-s1.pdf page 18 + jmp 3f +001413: 601445 + lmq +001414: 652000 + and o155 +001415: 504146 + sad o55 +001416: 544137 + jmp 1f " -/=? map to =?-/ ??? +001417: 601425 + lacq +001420: 641002 + and o137 +001421: 504145 + sad o134 +001422: 544144 + skp " \| map to Ll ??? +001423: 741000 + jmp 2f +001424: 601430 + 1: + lacq +001425: 641002 + xor o20 +001426: 244134 + lmq +001427: 652000 + 2: + lacq +001430: 641002 + dac u.limit +001431: 045653 + 1: + jms chkint1 +001432: 101535 + lac u.limit +001433: 205653 + jms dspput +001434: 102540 + jmp 1f +001435: 601442 + jms sleep; sfiles+6 +001436: 102434 +001437: 005526 + jms swap +001440: 100136 + jmp 1b +001441: 601432 + 1: + lac u.limit +001442: 205653 + alss 9 +001443: 660711 + jmp passone +001444: 601523 + 3: + jms sleep; sfiles+2 +001445: 102434 +001446: 005522 + jms swap +001447: 100136 + jmp rkbdi +001450: 601410 + " write routine for (graphic) "display" special file + wdspo: + jms chkint1 +001451: 101535 + jms forall +001452: 102412 + jms dspput " put char (fallr "returns" here) +001453: 102540 + jmp fallr " go back for next (continuation!) +001454: 602425 + jms sleep; sfiles+6 +001455: 102434 +001456: 005526 + jms swap +001457: 100136 + jmp wdspo +001460: 601451 + " read routine for paper tape reader special file + rppti: + lac d4 +001461: 204122 + jms getchar +001462: 101745 + jmp .+3 +001463: 601466 + alss 9 +001464: 660711 + jmp passone +001465: 601523 + lac sfiles+3 +001466: 205523 + sma +001467: 740100 + rsa +001470: 700104 + 1: + jms sleep; sfiles+3 +001471: 102434 +001472: 005523 + jms swap +001473: 100136 + jmp rppti +001474: 601461 + "** 01-s1.pdf page 19 + " write routine for paper tape punch special file + wppto: + jms forall +001475: 102412 + sna +001476: 741200 + jmp fallr +001477: 602425 + lmq +001500: 652000 + lac sfiles+4 +001501: 205524 + spa +001502: 741100 + jmp 1f +001503: 601511 + xor o400000 +001504: 244173 + dac sfiles+4 +001505: 045524 + lacq +001506: 641002 + psa +001507: 700204 + jmp fallr +001510: 602425 + 1: + lacq +001511: 641002 + dac char +001512: 045511 + lac d5 +001513: 204123 + jms putchar +001514: 101730 + skp +001515: 741000 + jmp fallr +001516: 602425 + jms sleep; sfiles+4 +001517: 102434 +001520: 005524 + jms swap +001521: 100136 + jmp wppto +001522: 601475 + " common exit for special file input + passone: + sad o4000 " CTRL/D? +001523: 544154 + jmp okexit " yes: return zero +001524: 600102 + dac u.base i " no: save for user +001525: 065651 + lac d1 " return 1 +001526: 204117 + dac u.ac +001527: 045631 + jmp sysexit +001530: 600103 + error: 0 +001531: 000000 + -1 +001532: 777777 + dac u.ac +001533: 045631 + jmp sysexit +001534: 600103 + chkint1: 0 +001535: 000000 + dzm .insys +001536: 144066 + jms chkint +001537: 100320 + skp +001540: 741000 + jmp .save +001541: 601151 + -1 +001542: 777777 + dac .insys +001543: 044066 + jmp chkint1 i +001544: 621535 + "** 01-s1.pdf page 21 + " s4 + " allocate a free disk block for a file (data or indirect) + alloc: 0 +001545: 000000 + -1 " Decrement the # free block numbers in the cache +001546: 777777 + tad s.nfblks " kept at s.fblks. Jump to 1f if no free blocks left. +001547: 345543 + spa +001550: 741100 + jmp 1f +001551: 601566 + dac s.nfblks " Update the count of free block numbers +001552: 045543 + tad fblksp +001553: 344106 + jms laci +001554: 101635 + dac 9f+t +001555: 044214 + jms copyz; dskbuf; 64 +001556: 101712 +001557: 007700 +001560: 000100 + lac 9f+t +001561: 204214 + jms dskwr +001562: 102146 + dzm .savblk +001563: 144072 + lac 9f+t +001564: 204214 + jmp alloc i " Return from routine +001565: 621545 + 1: + lac s.nxfblk +001566: 205542 + sna +001567: 741200 + jms halt " OUT OF DISK +001570: 102254 + dac s.fblks +001571: 045544 + jms dskrd +001572: 102116 + lac dskbuf +001573: 207700 + dac s.nxfblk +001574: 045542 + jms copy; dskbuf+1; s.fblks+1; 9 +001575: 101667 +001576: 007701 +001577: 005545 +001600: 000011 + lac d10 +001601: 204130 + dac s.nfblks +001602: 045543 + jmp alloc+1 +001603: 601546 + " free the disk block whose number is in AC + free: 0 +001604: 000000 + lmq +001605: 652000 + lac s.nfblks +001606: 205543 + sad d10 +001607: 544130 + jmp 1f +001610: 601620 + tad fblksp +001611: 344106 + dac 9f+t +001612: 044214 + lacq +001613: 641002 + dac 9f+t i +001614: 064214 + dzm .savblk +001615: 144072 + isz s.nfblks +001616: 445543 + jmp free i +001617: 621604 + 1: + lac s.nxfblk +001620: 205542 + dac dskbuf +001621: 047700 + jms copy; s.fblks+1; dskbuf+1; 9 +001622: 101667 +001623: 005545 +001624: 007701 +001625: 000011 + lacq +001626: 641002 + dac s.nxfblk +001627: 045542 + jms dskwr +001630: 102146 + dzm .savblk +001631: 144072 + lac d1 +001632: 204117 + dac s.nfblks +001633: 045543 + jmp free i " Return from the routine +001634: 621604 + t = t+1 + 000010 + " load AC indirect (without using indirect!) + " AC/ address + " jms laci + " AC/ contents of address + laci: 0 +001635: 000000 + and o17777 " clear everything but addr +001636: 504160 + tad o200000 " make into "lac addr" +001637: 344170 + dac .+1 +001640: 041641 + lac .. " fetch +001641: 200000 + jmp laci i " return +001642: 621635 + "** 01-s1.pdf page 22 + " skip if AC between two values (inclusive) + " jms betwen; low_ptr; high_ptr + "+ " + " listing has an alternate written in + " (which would require 'lac ptr' instead of 'ptr' args?) + betwen: 0 +001643: 000000 + lmq cmq " get ~AC in MQ +001644: 652004 + lac betwen i " get low_ptr +001645: 221643 + dac 9f+t +001646: 044215 + isz betwen " skip low_ptr +001647: 441643 + lacq " get ~AC (-AC-1) from MQ +001650: 641002 + tad 9f+t i " get low-AC-1 +001651: 364215 + sma " negative (AC >= low)? +001652: 740100 + jmp 1f " no, return w/o skip +001653: 601663 + lac betwen i " fetch high_ptr +001654: 221643 + dac 9f+t +001655: 044215 + isz betwen " skip high_ptr +001656: 441643 + lacq " get -AC-1 +001657: 641002 + tad 9f+t i " add to high value (high-AC-1) +001660: 364215 + cma " complement (AC-high) +001661: 740001 + spa sna " AC-high <= 0? +001662: 741300 + 1: + isz betwen " no: give happy (skip) return +001663: 441643 + lacq " restore ~AC +001664: 641002 + cma " restore AC +001665: 740001 + jmp betwen i " return w/o skip +001666: 621643 + " copy memory + " call: + " jms copy; src; dest; count + copy: 0 +001667: 000000 + -1 +001670: 777777 + tad copy i +001671: 361667 + dac 8 +001672: 040010 + isz copy +001673: 441667 + -1 +001674: 777777 + tad copy i +001675: 361667 + dac 9 +001676: 040011 + isz copy +001677: 441667 + -1 +001700: 777777 + tad copy i +001701: 361667 + cma +001702: 740001 + dac 9f+t +001703: 044215 + isz copy +001704: 441667 + 1: + lac 8 i +001705: 220010 + dac 9 i +001706: 060011 + isz 9f+t +001707: 444215 + jmp 1b +001710: 601705 + jmp copy i +001711: 621667 + " copy zeroes (clear memory) + " call: + " jms copyz; pointer; count + copyz: 0 +001712: 000000 + -1 +001713: 777777 + tad copyz i " get call PC +001714: 361712 + dac 8 " save in index (pre-increments) +001715: 040010 + isz copyz " skip pointer +001716: 441712 + -1 +001717: 777777 + tad copyz i " get count-1 +001720: 361712 + cma " get negative count +001721: 740001 + dac 9f+t " save in t0 +001722: 044215 + isz copyz " skip count +001723: 441712 + 1: + dzm 8 i " zero word +001724: 160010 + isz 9f+t " done? +001725: 444215 + jmp 1b " no: loop +001726: 601724 + jmp copyz i " return +001727: 621712 + t = t+1 + 000011 + " put queued character + " CALLED FROM PI: AVOIDS INDIRECT!! + " queue number in AC + putchar: 0 +001730: 000000 + "** 01-s1.pdf page 23 + dac 9f+t +001731: 044216 + cla +001732: 750000 + jms takeq +001733: 101757 + jmp putchar i +001734: 621730 + tad o40001 +001735: 344163 + dac .+4 +001736: 041742 + lac 9f+t +001737: 204216 + jms putq +001740: 102011 + lac char +001741: 205511 + dac q2+1 .. +001742: 044301 + isz putchar +001743: 441730 + jmp putchar i +001744: 621730 + t = t+1 + 000012 + " get queued character + " CALLED FROM PI: AVOIDS INDIRECT!! + " queue number in AC: + " 1: tty input + " 2: tty output + " 3: display keyboard + " 4: paper tape reader + " 5: paper tape punch + getchar: 0 +001745: 000000 + jms takeq +001746: 101757 + jmp i getchar +001747: 621745 + tad o200001 +001750: 344171 + dac .+3 +001751: 041754 + cla +001752: 750000 + jms putq +001753: 102011 + lac q2+1 .. +001754: 204301 + isz getchar +001755: 441745 + jmp i getchar +001756: 621745 + " CALLED FROM PI: AVOIDS INDIRECT!! + takeq: 0 +001757: 000000 + rcl +001760: 744010 + tad lacq1 +001761: 344110 + dac .+7 +001762: 041771 + tad o640000 +001763: 344177 + dac .+17 +001764: 042005 + tad d1 +001765: 344117 + dac .+14 +001766: 042004 + tad o500000 +001767: 344174 + dac .+5 +001770: 041775 + lac q1 .. +001771: 204260 + sna +001772: 741200 + jmp takeq i +001773: 621757 + dac lnkaddr +001774: 045510 + sad q1+1 .. +001775: 544261 + jmp .+5 +001776: 602003 + tad o200000 +001777: 344170 + dac .+1 +002000: 042001 + lac q2 .. +002001: 204300 + jmp .+3 +002002: 602005 + cla +002003: 750000 + dac q1+1 .. +002004: 044261 + dac q1 .. +002005: 044260 + isz takeq +002006: 441757 + lac lnkaddr +002007: 205510 + jmp i takeq +002010: 621757 + putq: 0 +002011: 000000 + rcl +002012: 744010 + tad dacq1 +002013: 344107 + dac .+14 +002014: 042032 + tad d1 +002015: 344117 + dac .+13 +002016: 042033 + tad o140000 +002017: 344167 + dac .+1 +002020: 042021 + lac q1-1 .. +002021: 204257 + "** 01-s1.pdf page 24 + sna +002022: 741200 + jmp .+6 +002023: 602031 + tad o40000 +002024: 344162 + dac .+2 +002025: 042027 + lac lnkaddr +002026: 205510 + dac q2 .. +002027: 044300 + jmp .+3 +002030: 602033 + lac lnkaddr +002031: 205510 + dac q1 .. +002032: 044260 + dac q1+1 .. +002033: 044261 + jmp putq i +002034: 622011 + srcdbs: 0 +002035: 000000 + dac 9f+t+2 "* lmq +002036: 044221 + -ndskbs +002037: 777774 + dac 9f+t +002040: 044217 + law dskbs "* -1 dac 8 written +002041: 765067 + dac 9f+t+1 "* lacq +002042: 044220 + 1: + lac 9f+t+2 "** crossed out +002043: 204221 + sad 9f+t+1 "** isz 8 written +002044: 544220 + jmp srcdbs i +002045: 622035 + law 65 "** ??? crossed out +002046: 760101 + tad 9f+t+1 "** crossed out isz 8 written +002047: 344220 + isz 9f+t+1 +002050: 444220 + isz 9f+t +002051: 444217 + jmp 1b +002052: 602043 + isz srcdbs +002053: 442035 + jmp srcdbs i +002054: 622035 + collapse: 0 +002055: 000000 + cla +002056: 750000 + jms srcdbs +002057: 102035 + jmp 1f +002060: 602063 + law dskbs +002061: 765067 + dac 9f+t+1 "** 9f+t+1 crossed out: 8 written in +002062: 044220 + 1: + lac 9f+t+1 "** 9f+t+1 crossed out: 8 written in +002063: 204220 + dac 0f+1 +002064: 042100 + tad d65 "** crossed out: d2-- original obscured +002065: 344141 + dac 0f +002066: 042077 + cma +002067: 740001 + tad d1 +002070: 344117 + tad edskbsp +002071: 345473 + and o17777 +002072: 504160 + sna +002073: 741200 + jmp 0f+3 +002074: 602102 + dac 0f+2 +002075: 042101 + jms copy; 0:..; ..; .. +002076: 101667 +002077: 000000 +002100: 000000 +002101: 000000 + -65 +002102: 777677 + tad edskbsp +002103: 345473 + dac 9f+t +002104: 044217 + tad d1 +002105: 344117 + dac 0f +002106: 042113 + lac dskaddr +002107: 205512 + dac 9f+t i +002110: 064217 + jms copy; dskbuf; 0:..; 64 +002111: 101667 +002112: 007700 +002113: 000000 +002114: 000100 + jmp collapse i +002115: 622055 + dskrd: 0 +002116: 000000 + jms betwen; d2; d7999 +002117: 101643 +002120: 004120 +002121: 004155 + "** 01-s1.pdf page 25 + jms halt +002122: 102254 + sad dskaddr +002123: 545512 + jmp dskrd i +002124: 622116 + dac dskaddr +002125: 045512 + jms srcdbs +002126: 102035 + jmp 1f +002127: 602134 + lac dskaddr +002130: 205512 + jms dskio; 06000 +002131: 102162 +002132: 006000 + jmp 2f +002133: 602144 + 1: + dzm 9f+t+1 i +002134: 164220 + law 1 +002135: 760001 + tad 9f+t+1 +002136: 344220 + dac .+2 +002137: 042141 + jms copy; ..; dskbuf; 64 +002140: 101667 +002141: 000000 +002142: 007700 +002143: 000100 + 2: + jms collapse +002144: 102055 + jmp dskrd i +002145: 622116 + " write a file block (data, inode or indirect) + " AC/ block + dskwr: 0 +002146: 000000 + jms betwen; d2; d7999 +002147: 101643 +002150: 004120 +002151: 004155 + jms halt +002152: 102254 + jms dskio; 07000 +002153: 102162 +002154: 007000 + lac dskaddr +002155: 205512 + jms srcdbs +002156: 102035 + dzm 9f+t+1 i +002157: 164220 + jms collapse +002160: 102055 + jmp dskwr i +002161: 622146 + t = t+3 + 000015 + " AC/ block + " jms dskio; dsld_bits + dskio: 0 +002162: 000000 + dac dskaddr +002163: 045512 + cll; idiv; 80 +002164: 744000 +002165: 653323 +002166: 000120 + dac 9f+t +002167: 044222 + lacq +002170: 641002 + idiv; 10 +002171: 653323 +002172: 000012 + dac 9f+t+1 +002173: 044223 + lls 22 +002174: 640626 + xor 9f+t+1 +002175: 244223 + als 8 +002176: 640710 + dac 9f+t+1 +002177: 044223 + lac 9f+t +002200: 204222 + idiv; 10 +002201: 653323 +002202: 000012 + dac 9f+t +002203: 044222 + lls 22 +002204: 640626 + xor 9f+t +002205: 244222 + xor 9f+t+1 +002206: 244223 + xor o200000 +002207: 244170 + dac 9f+t +002210: 044222 + jms dsktrans; -64; dskbuf; 9f+t; dskio +002211: 102220 +002212: 777700 +002213: 007700 +002214: 004222 +002215: 002162 + isz dskio +002216: 442162 + jmp dskio i +002217: 622162 + t = t+1 + 000016 + " called with: + " jms dsktrans; -WC; MAC; addr_ptr?; dsld_ptr + dsktrans: 0 +002220: 000000 + -10 +002221: 777766 + dac 9f+t +002222: 044223 + 1: + -1 +002223: 777777 + tad dsktrans +002224: 342220 + dac 12 +002225: 040014 + "** 01-s1.pdf page 26 + dscs " clear status register +002226: 707141 + lac 12 i +002227: 220014 + dslw " load WC +002230: 707124 + lac 12 i +002231: 220014 + dslm " load MAC +002232: 707142 + lac 12 i +002233: 220014 + jms laci +002234: 101635 + dsld " load TA & SA +002235: 707104 + dzm .dskb +002236: 144074 + lac 12 i +002237: 220014 + jms laci +002240: 101635 + jms laci +002241: 101635 + dsls " load status +002242: 707144 + lac .dskb " check for interrupt +002243: 204074 + sna +002244: 741200 + jmp .-2 +002245: 602243 + lac .dske " get status from interrupt +002246: 204075 + sma +002247: 740100 + jmp 12 i " return +002250: 620014 + isz 9f+t +002251: 444223 + jmp 1b +002252: 602223 + jms halt " 10 disk errors +002253: 102254 + t = t+1 + 000017 + halt: 0 +002254: 000000 + isz 9f+t " spin for a while (process interrupts) +002255: 444224 + jmp .-1 +002256: 602255 + iof " disable interrupts +002257: 700002 + hlt " halt +002260: 740040 + jms copy; law; 4096; 4096 " continued: copy system up to user memory? +002261: 101667 +002262: 760000 +002263: 010000 +002264: 010000 + hlt; jmp .-1 " halt for good +002265: 740040 +002266: 602265 + t = t+1 + 000020 + "** 01-s1.pdf page 28 + " s5 + " read/write a process from/to swap space + " call: + " AC/ first word of process table + " jms dskswap; DSLD bits + dskswap: 0 +002267: 000000 + cll; als 3 " get process disk address +002270: 744000 +002271: 640703 + dac 9f+t " save in t0 +002272: 044225 + jms dsktrans; -64; userdata; 9f+t; dskswap " read/write user area +002273: 102220 +002274: 777700 +002275: 005631 +002276: 004225 +002277: 002267 + lac 9f+t " get swap addr back +002300: 204225 + tad o20 " advance by 16?? +002301: 344134 + dac 9f+t " save +002302: 044225 + jms dsktrans; -4096; 4096; 9f+t; dskswap " read/write user memory +002303: 102220 +002304: 770000 +002305: 010000 +002306: 004225 +002307: 002267 + isz dskswap " skip bits +002310: 442267 + jmp dskswap i " return +002311: 622267 + t = t+1 + 000021 + access: 0 +002312: 000000 + lac i.flags " get inode flags +002313: 205732 + lmq " save in MQ +002314: 652000 + lac u.uid " get user id +002315: 205644 + spa " negative? +002316: 741100 + jmp access i " yes: super user, return +002317: 622312 + sad i.uid " compare to file owner +002320: 545742 + lrs 2 " same: shift flags down two +002321: 640502 + lacq " get inode flags back +002322: 641002 + and mode " AND with mode from system call +002323: 505500 + sza " access allowed? +002324: 740200 + jmp access i " yes: return +002325: 622312 + jms error " no: return error from system call +002326: 101531 + fassign: 0 +002327: 000000 + -10 " loop count +002330: 777766 + dac 9f+t " in t0 +002331: 044226 + 1: + lac 9f+t " get count +002332: 204226 + tad d10 " turn into fd +002333: 344130 + jms fget " fetch open file into "fnode" +002334: 102360 + jms halt " will not happen +002335: 102254 + lac f.flags " get fnode flags +002336: 205757 + sma " sign bit set (active)? +002337: 740100 + jmp 1f " no: free +002340: 602344 + isz 9f+t " increment loop count & loop until zero +002341: 444226 + jmp 1b +002342: 602332 + jmp fassign i +002343: 622327 + 1: + lac mode " get mode from system call +002344: 205500 + xor o400000 " set sign bit +002345: 244173 + dac f.flags " save in fnode +002346: 045757 + lac ii " get i-number +002347: 205731 + dac f.i " save in fnode +002350: 045761 + lac 9f+t +002351: 204226 + tad d10 " get fd +002352: 344130 + dac u.ac " return in user AC +002353: 045631 + dzm f.badd " clear file offset in fnode +002354: 145760 + jms fput " copy fnode back into u.ofiles +002355: 102402 + isz fassign " give skip return +002356: 442327 + jmp fassign i +002357: 622327 + t = t+1 + 000022 + " load fnode (open file entry) from u.ofiles + " AC/ user fd + " jms fget + " bad fd + " return with fnode set + fget: 0 +002360: 000000 + jms betwen; d0; d9 " fd 0..9? +002361: 101643 +002362: 004116 +002363: 004127 + jmp fget i " no, return +002364: 622360 + cll; mul; 3 " multiply by three +002365: 744000 +002366: 653122 +002367: 000003 + lacq +002370: 641002 + "** 01-s1.pdf page 29 + tad ofilesp " get pointer into u.ofiles +002371: 344101 + dac 9f+t " save in t0 +002372: 044227 + dac .+2 " save as copy source +002373: 042375 + jms copy; ..; fnode; 3 " copy to "fnode" +002374: 101667 +002375: 000000 +002376: 005757 +002377: 000003 + isz fget " give skip return +002400: 442360 + jmp fget i +002401: 622360 + " copy fnode back to u.ofiles + " uses temp value set by "fget" + " (fget and fput calls must be paired) + fput: 0 +002402: 000000 + lac 9f+t +002403: 204227 + dac .+3 +002404: 042407 + jms copy; fnode; ..; 3 +002405: 101667 +002406: 005757 +002407: 000000 +002410: 000003 + jmp fput i +002411: 622402 + t = t+1 + 000023 + " helper for special device write routines + " return to caller with next character to write: + " when done return character count to user. + forall: 0 +002412: 000000 + lac u.base +002413: 205651 + sad u.limit +002414: 545653 + jmp 1f " done +002415: 602431 + lac u.base " get base pointer (again?) +002416: 205651 + ral " rotate MSB into LINK +002417: 740010 + lac u.base i " fetch word via base pointer +002420: 225651 + snl " link set? +002421: 740400 + lrs 9 " no: get low 9 bits +002422: 640511 + and o777 " mask to 9 bits +002423: 504152 + jmp forall i " return char +002424: 622412 + fallr: " jump here for subsequent characters + lac u.base " get base +002425: 205651 + add o400000 " advance pointer +002426: 304173 + dac u.base " start from top +002427: 045651 + jmp forall+1 +002430: 602413 + 1: + lac u.count +002431: 205652 + dac u.ac +002432: 045631 + jmp sysexit +002433: 600103 + " wait for a condition variable + " call: + " jmr sleep; sfiles+N + sleep: 0 +002434: 000000 + law ulist-1 " pointer to process table +002435: 765560 + dac 8 " in index register +002436: 040010 + lac o200000 +002437: 204170 + lmq " get 200000 in MQ +002440: 652000 + 1: + lac u.ulistp i " get current process status word +002441: 225647 + sad 8 i " compare to next process table entry +002442: 560010 + jmp 1f " match +002443: 602452 + isz 8 " no match: skip other 3 words of process table +002444: 440010 + isz 8 +002445: 440010 + isz 8 +002446: 440010 + cla; lrs 1 " shift MQ down one +002447: 750000 +002450: 640501 + jmp 1b " loop +002451: 602441 + 1: + tad o100000 " mark process not ready +002452: 344166 + dac u.ulistp i +002453: 065647 + lac sleep i " get sleep variable pointer +002454: 222434 + dac 9f+t +002455: 044230 + lac 9f+t i " get sleep variable contents +002456: 224230 + omq " or in MQ (bit vector of processes waiting) +002457: 640002 + dac 9f+t i " save +002460: 064230 + isz sleep " skip sleep variable pointer +002461: 442434 + jmp sleep i +002462: 622434 + t = t+1 + 000024 + "** 01-s1.pdf page 30 + " look for a free directory entry?? + dslot: 0 +002463: 000000 + dzm di +002464: 145746 + skp +002465: 741000 + 1: + isz di +002466: 445746 + lac di +002467: 205746 + jms dget " get directory entry +002470: 103104 + lac d.i " get i number +002471: 205747 + sza " zero (free)? +002472: 740200 + jmp 1b " no keep looking +002473: 602466 + jmp dslot i " yes: return index +002474: 622463 + " called with: + " AC/ mode + " name/ file name + icreat: 0 +002475: 000000 + dac 9f+t " save mode in t0 +002476: 044231 + jms dslot +002477: 102463 + lac o20 " look for a free inode starting at 17 +002500: 204134 + dac ii +002501: 045731 + 1: + isz ii +002502: 445731 + lac ii +002503: 205731 + jms iget +002504: 103017 + lac i.flags +002505: 205732 + spa " "in use" bit bit clear? +002506: 741100 + jmp 1b " no, guess again +002507: 602502 + lac ii +002510: 205731 + dac d.i +002511: 045747 + jms copy; name; d.name; 4 +002512: 101667 +002513: 005504 +002514: 005750 +002515: 000004 + isz s.uniq " get a new unique number +002516: 445556 + lac s.uniq +002517: 205556 + dac d.uniq " save in directory entry +002520: 045754 + dac i.uniq " and inode +002521: 045745 + lac 9f+t " get mode +002522: 204231 + xor o400000 " set "in use" +002523: 244173 + dac i.flags +002524: 045732 + lac u.uid " get user +002525: 205644 + dac i.uid " set owner +002526: 045742 + -1 +002527: 777777 + dac i.nlks " -1 links?! +002530: 045743 + dzm i.size " empty +002531: 145744 + jms copyz; i.dskps; 7 " clear disk block numbers +002532: 101712 +002533: 005733 +002534: 000007 + jms iput " write inode +002535: 103046 + jms dput " write directory entry +002536: 103136 + jmp icreat i +002537: 622475 + t = t+1 + 000025 + " output character to display + dspput: 0 +002540: 000000 + and o177 " mask to 7 bits +002541: 504147 + sna +002542: 741200 + jmp i dspput " discard NUL +002543: 622540 + sad o14 " Form Feed? +002544: 544131 + jmp 1f " yes +002545: 602560 + lmq " save char in MQ +002546: 652000 + sad o12 " newline? +002547: 544130 + jms dspnl " yes +002550: 102574 + lac dsploc i " get display word +002551: 224444 + sad o400000 " TRAP? +002552: 544173 + jmp dspleft " yes (first character) +002553: 602562 + omq " no: or in second character +002554: 640002 + dac dsploc i " save both characters +002555: 064444 + isz dsploc " advance display pointer +002556: 444444 + jmp i dspput +002557: 622540 + "** 01-s1.pdf page 31 + 1: " here on form feed + jms dspinit " clear display +002560: 102606 + jmp dspput i +002561: 622540 + dspleft: + lac dsploc " get display pointer +002562: 204444 + sad edspbuf " end of the buffer? +002563: 544104 + jmp 1f " yes: light up a button!? +002564: 602602 + dac 8 " no: store in index +002565: 040010 + lac o400000 " get TRAP instruction +002566: 204173 + dac 8 i " store as next +002567: 060010 + cla; llss 18+7 " shift MQ upto "char1" position +002570: 750000 +002571: 660631 + dac dsploc i " store word with char1 +002572: 064444 + jmp dspput i +002573: 622540 + dspnl: 0 " only called once! +002574: 000000 + lac dsplno " get display line number +002575: 204445 + sad d33 " 33? +002576: 544142 + jmp 1f " yes: light a button! +002577: 602602 + isz dsplno " no: increment line number +002600: 444445 + jmp dspnl i +002601: 622574 + 1: + lac o2000 " get bit for push button 7 +002602: 204153 + wbl " write button lights +002603: 704424 + isz dspput +002604: 442540 + jmp dspput i +002605: 622540 + dspinit: 0 +002606: 000000 + lac dspbufp3 " get pointer to dspbuf+3 +002607: 204105 + dac dsploc " store location +002610: 044444 + lac o400000 " display "TRAP" instruction (end of list) +002611: 204173 + dac dspbuf+3 " save in buffer +002612: 044451 + dzm dsplno " clear display line number +002613: 144445 + jmp dspinit i +002614: 622606 + " "move display" (change display buffer pointer) + " called with new buffer pointer in AC?? + movdsp: 0 +002615: 000000 + iof +002616: 700002 + cdf +002617: 700501 + dac dspbufp +002620: 045475 + -1 +002621: 777777 + dac .dspb +002622: 045536 + ion +002623: 700042 + jmp movdsp i +002624: 622615 + " fetch user argument from word after "sys" call, return in AC + arg: 0 +002625: 000000 + lac u.rq+8 i " fetch word after return PC +002626: 225643 + isz u.rq+8 " bump PC +002627: 445643 + jmp arg i +002630: 622625 + " fetch user pathname argument from pointer word after "sys" call + " into "name" and look it up (in current working directory) + " if lookup fails: returns error to user (not caller) + " if lookup OK: returns with file i-inode read (into "inode") + " and i-number in AC + argname: 0 +002631: 000000 + jms arg " fetch name pointer +002632: 102625 + dac .+2 " save as copy source +002633: 042635 + jms copy; ..; name; 4 " copy to "name" +002634: 101667 +002635: 000000 +002636: 005504 +002637: 000004 + lac u.cdir " get CWD +002640: 205646 + jms namei; name " look up file +002641: 102737 +002642: 005504 + jms error " failed: return error directly to user +002643: 101531 + jmp argname i +002644: 622631 + seektell: 0 +002645: 000000 + jms arg +002646: 102625 + dac u.base +002647: 045651 + "** 01-s1.pdf page 32 + jms arg +002650: 102625 + dac u.limit +002651: 045653 + jms finac +002652: 103370 + lac u.limit +002653: 205653 + sna +002654: 741200 + jmp seektell i +002655: 622645 + sad d1 +002656: 544117 + jmp .+3 +002657: 602662 + lac i.size +002660: 205744 + jmp seektell i +002661: 622645 + lac f.badd +002662: 205760 + jmp seektell i +002663: 622645 + " system call helper + " fetch system call argument name pointer from after "sys" call + " read inode; if current user is not owner, return error to user + isown: 0 +002664: 000000 + jms argname +002665: 102631 + jms iget +002666: 103017 + lac u.uid " get user id +002667: 205644 + sma " super user? +002670: 740100 + sad i.uid " no: does user own file? +002671: 545742 + skp " yes, or super user +002672: 741000 + jms error " not super user, not owner: return error +002673: 101531 + jmp isown i +002674: 622664 + "** 01-s1.pdf page 34 + " s6 + itrunc: 0 +002675: 000000 + -7 " loop 7 times +002676: 777771 + dac 9f+t " in t0 +002677: 044232 + lac idskpp " pointer to inode block numbers +002700: 204102 + dac 9f+t+1 " save in t1 +002701: 044233 + 1: " top of loop for inode blocks + lac 9f+t+1 i " fetch next block number +002702: 224233 + sna " allocated? +002703: 741200 + jmp 4f " no +002704: 602730 + lac i.flags " check flags +002705: 205732 + and o200000 +002706: 504170 + sna " large file? +002707: 741200 + jmp 3f " no +002710: 602725 + -64 " loop 64 times +002711: 777700 + dac 9f+t+2 " save count in t2 +002712: 044234 + lac dskbufp " get pointer to dskbuf +002713: 204103 + dac 9f+t+3 " in t3 +002714: 044235 + 2: " inner loop for indirect blocks + lac 9f+t+1 i " get indirect block number +002715: 224233 + jms dskrd " read it +002716: 102116 + lac 9f+t+3 i " read block number from indirect +002717: 224235 + sza " free? +002720: 740200 + jms free " no: free it +002721: 101604 + isz 9f+t+3 " increment pointer into indirect block +002722: 444235 + isz 9f+t+2 " increment loop counter, skip if done +002723: 444234 + jmp 2b " not done: loop +002724: 602715 + 3: " here with small file + lac 9f+t+1 i " load block number +002725: 224233 + jms free " free it +002726: 101604 + dzm 9f+t+1 i " clear block number +002727: 164233 + 4: " bottom of loop for inode block ptrs + isz 9f+t+1 " increment block pointer +002730: 444233 + isz 9f+t " increment count, skip if done +002731: 444232 + jmp 1b " not done +002732: 602702 + lac i.flags +002733: 205732 + and o577777 " clear large file flag +002734: 504175 + dac i.flags +002735: 045732 + jmp itrunc i +002736: 622675 + t = t+4 + 000031 + " Given a pointer to a 4-word filename after + " the jms to namei, and with AC holding the + " i-num of the directory it is in, return the + " i-number of the filename (and skip) + " return zero in AC if not found (no skip) + namei: 0 +002737: 000000 + jms iget " Get the inode from the i-num in the AC +002740: 103017 + -1 +002741: 777777 + tad namei i " get argptr-1 +002742: 362737 + dac 9f+t+1 " save in t1 +002743: 044237 + isz namei " skip over argument +002744: 442737 + lac i.flags +002745: 205732 + and o20 " get directory bit +002746: 504134 + sna " Is this a directory? +002747: 741200 + jmp namei i " no: return without skip +002750: 622737 + -8 +002751: 777770 + tad i.size " Subtract 8 from the file's size +002752: 345744 + cma +002753: 740001 + lrss 3 +002754: 660503 + dac 9f+t " negative count of directory entries in t0 +002755: 044236 + sna " any? +002756: 741200 + jmp namei i " no: return without skip +002757: 622737 + dzm di " Store zero in di +002760: 145746 + 1: + lac di +002761: 205746 + "** 01-s1.pdf page 35 + jms dget " Get a directory entry from the dirblock +002762: 103104 + lac d.i " get i-num +002763: 205747 + sna " in use? +002764: 741200 + jmp 2f " no +002765: 603013 + lac 9f+t+1 " get argptr-1 +002766: 204237 + dac 8 +002767: 040010 + lac d.name " Compare the four words of the filename in the +002770: 205750 + sad 8 i " directory entry with the argument to namei +002771: 560010 + skp +002772: 741000 + jmp 2f " No match +002773: 603013 + lac d.name+1 +002774: 205751 + sad 8 i +002775: 560010 + skp +002776: 741000 + jmp 2f " No match +002777: 603013 + lac d.name+2 +003000: 205752 + sad 8 i +003001: 560010 + skp +003002: 741000 + jmp 2f " No match +003003: 603013 + lac d.name+3 +003004: 205753 + sad 8 i +003005: 560010 + skp +003006: 741000 + jmp 2f " No match +003007: 603013 + lac d.i " A match. Get the i-number into AC +003010: 205747 + isz namei " give skip return +003011: 442737 + jmp namei i +003012: 622737 + 2: + isz di " No match, move up to the next direntry +003013: 445746 + isz 9f+t " any left? +003014: 444236 + jmp 1b " yes: keep going +003015: 602761 + jmp namei i " Didn't find it, return zero in AC (without skip) +003016: 622737 + t = t+2 + 000033 + " Given an i-number in AC, fetch that i-node + " from disk and store it in the inode buffer + iget: 0 +003017: 000000 + dac ii " Store the i-number in ii +003020: 045731 + cll; idiv; 5 " Divide by 5: 5 inodes in a block +003021: 744000 +003022: 653323 +003023: 000005 + dac 9f+t " Store the remainder in 9f+t: the i-node +003024: 044240 + lacq " number within the block +003025: 641002 + tad d2 " Add 2 to the quotient to get the block number +003026: 344120 + dac 9f+t+1 " and store in 9f+t+1 +003027: 044241 + jms dskrd " Get the block +003030: 102116 + lac 9f+t +003031: 204240 + cll; mul; 12 " Multiply the i-num within the block by 12 +003032: 744000 +003033: 653122 +003034: 000014 + lacq " to get the offset into the block +003035: 641002 + tad dskbufp " Add on the base of the disk buffer +003036: 344103 + dac 9f+t +003037: 044240 + dac .+2 +003040: 043042 + jms copy; ..; inode; 12 " Copy 12 words from buffer to inode +003041: 101667 +003042: 000000 +003043: 005732 +003044: 000014 + jmp iget i " and return +003045: 623017 + iput: 0 +003046: 000000 + lac 9f+t+1 +003047: 204241 + jms dskrd +003050: 102116 + law inode-1 +003051: 765731 + dac 8 +003052: 040010 + -1 +003053: 777777 + tad 9f+t +003054: 344240 + dac 9 +003055: 040011 + -12 +003056: 777764 + dac 9f+t+2 +003057: 044242 + 1: + lac 8 i +003060: 220010 + "** 01-s1.pdf page 36 + sad 9 i +003061: 560011 + skp +003062: 741000 + jmp 2f +003063: 603067 + isz 9f+t+2 +003064: 444242 + jmp 1b +003065: 603060 + jmp iput i +003066: 623046 + 2: + -1 +003067: 777777 + tad 8 +003070: 340010 + dac 8 +003071: 040010 + -1 +003072: 777777 + tad 9 +003073: 340011 + dac 9 +003074: 040011 + 1: + lac 8 i +003075: 220010 + dac 9 i +003076: 060011 + isz 9f+t+2 +003077: 444242 + jmp 1b +003100: 603075 + lac 9f+t+1 +003101: 204241 + jms dskwr +003102: 102146 + jmp iput i +003103: 623046 + t = t+3 + 000036 + " allocate directory entry + " AC/ entry number + dget: 0 +003104: 000000 + dac di " save entry number +003105: 045746 + alss 3 " get word number +003106: 660703 + dac 9f+t " save in t0 +003107: 044243 + jms pget " get free disk block +003110: 103152 + dac 9f+t+1 " save in t1 +003111: 044244 + jms dskrd +003112: 102116 + lac 9f+t +003113: 204243 + and o77 +003114: 504140 + tad dskbufp +003115: 344103 + dac 9f+t+2 +003116: 044245 + dac .+2 +003117: 043121 + jms copy; ..; dnode; 8 +003120: 101667 +003121: 000000 +003122: 005747 +003123: 000010 + lac 9f+t +003124: 204243 + tad d8 +003125: 344126 + jms betwen; d0; i.size +003126: 101643 +003127: 004116 +003130: 005744 + skp +003131: 741000 + jmp dget i +003132: 623104 + jms dacisize +003133: 103402 + dzm d.i +003134: 145747 + jmp dget i +003135: 623104 + dput: 0 +003136: 000000 + lac 9f+t+1 +003137: 204244 + jms dskrd +003140: 102116 + lac 9f+t+2 +003141: 204245 + dac .+3 +003142: 043145 + jms copy; dnode; ..; 8 +003143: 101667 +003144: 005747 +003145: 000000 +003146: 000010 + lac 9f+t+1 +003147: 204244 + jms dskwr +003150: 102146 + jmp dput i +003151: 623136 + t = t+3 + 000041 + " get a block number for a file, returns disk block number + " allocates block if not allocated + " AC/ file offset + " jms pget + " AC/ disk block number + pget: 0 +003152: 000000 + lrss 6 " convert offset to block +003153: 660506 + dac 9f+t " save as t0 +003154: 044246 + lac i.flags +003155: 205732 + "** 01-s1.pdf page 37 + and o200000 +003156: 504170 + sza " large file bit set? +003157: 740200 + jmp 2f " yes +003160: 603220 + lac 9f+t " no: small file +003161: 204246 + jms betwen; d0; d6 " block 0..6? +003162: 101643 +003163: 004116 +003164: 004124 + jmp 1f " no +003165: 603175 + tad idskpp " make into block number pointer +003166: 344102 + dac 9f+t " save in t0 +003167: 044246 + lac 9f+t i " get disk block number +003170: 224246 + sna " allocated? +003171: 741200 + jms alloc " no: allocate now +003172: 101545 + dac 9f+t i " save (new) disk block number +003173: 064246 + jmp pget i " return disk block number +003174: 623152 + 1: " here when file block>=7, not "large" + jms alloc " allocate indirect block +003175: 101545 + dac 9f+t+1 " save as t1 +003176: 044247 + jms copy; i.dskps; dskbuf; 7 " copy all the disk block numbers +003177: 101667 +003200: 005733 +003201: 007700 +003202: 000007 + jms copyz; dskbuf+7; 64-7 " zero rest of indirect block +003203: 101712 +003204: 007707 +003205: 000071 + lac 9f+t+1 " get indirect block number back +003206: 204247 + jms dskwr " write indirect block to disk +003207: 102146 + lac 9f+t+1 +003210: 204247 + dac i.dskps " save indirect as new first block +003211: 045733 + jms copyz; i.dskps+1; 6 " zero rest of block pointers +003212: 101712 +003213: 005734 +003214: 000006 + lac i.flags +003215: 205732 + xor o200000 " set "large file" +003216: 244170 + dac i.flags +003217: 045732 + 2: " here with "large file" + lac 9f+t " get file block number +003220: 204246 + lrss 6 " divide by 64 (indirects/block) +003221: 660506 + jms betwen; d0; d6 " ok now? +003222: 101643 +003223: 004116 +003224: 004124 + jms halt " file too big " no, you lose! +003225: 102254 + tad idskpp " yes: get indirect block pointer +003226: 344102 + dac 9f+t+1 " save in t1 +003227: 044247 + lac 9f+t+1 i " get indirect block number +003230: 224247 + sna " allocated? +003231: 741200 + jms alloc " no, get it now +003232: 101545 + dac 9f+t+1 i " save (new) indirect block +003233: 064247 + dac 9f+t+2 " save as t2 +003234: 044250 + jms dskrd " read indirect block +003235: 102116 + lac 9f+t " get original block number +003236: 204246 + and o77 " mod by 64 +003237: 504140 + tad dskbufp " get pointer to disk block number +003240: 344103 + dac 9f+t+1 " save as t1 +003241: 044247 + lac 9f+t+1 i " fetch disk block number +003242: 224247 + sza " allocated? +003243: 740200 + jmp pget i " yes: return +003244: 623152 + jms alloc " no: allocate data block +003245: 101545 + dac 9f+t " save as t0 +003246: 044246 + lac 9f+t+2 " get indirect block number +003247: 204250 + jms dskrd " read it in +003250: 102116 + lac 9f+t " get data block number +003251: 204246 + dac 9f+t+1 i " save data block number +003252: 064247 + lac 9f+t+2 +003253: 204250 + jms dskwr " write indirect block back +003254: 102146 + lac 9f+t " get data block back +003255: 204246 + jmp pget i " return it +003256: 623152 + t = t+3 + 000044 + iwrite: 0 +003257: 000000 + dac 9f+t " save arg in t0 +003260: 044251 + lac iwrite " load return address +003261: 203257 + "** 01-s1.pdf page 38 + dac iread " save as iread return addr +003262: 043266 + lac cskp " load skip instruction +003263: 203335 + dac iwrite " save as iwrite instruction +003264: 043257 + jmp 1f +003265: 603272 + " iread from file referenced by loaded inode + " AC/ file offset + " jms iread; addr; count + iread: 0 +003266: 000000 + dac 9f+t " save offset in t0 +003267: 044251 + lac cnop " get nop +003270: 203442 + dac iwrite " save as iwrite instruction +003271: 043257 + 1: + -1 +003272: 777777 + tad iread i " get word before return addr +003273: 363266 + dac 10 " store in index 10 & 11 +003274: 040012 + dac 11 +003275: 040013 + isz iread " increment return addr +003276: 443266 + lac iread i " load addr +003277: 223266 + dac 9f+t+1 " save in t1 +003300: 044252 + isz iread " increment return addr +003301: 443266 + lac o70000 +003302: 204164 + xct iwrite " skip if write +003303: 403257 + lac i.size " read: get file size +003304: 205744 + cma +003305: 740001 + tad 9f+t " add offset +003306: 344251 + cma +003307: 740001 + jms betwen; d0; 9f+t+1 +003310: 101643 +003311: 004116 +003312: 004252 + lac 9f+t+1 +003313: 204252 + dac 9f+t+2 +003314: 044253 + cma +003315: 740001 + tad d1 +003316: 344117 + sna +003317: 741200 + jmp iread i +003320: 623266 + dac 9f+t+1 +003321: 044252 + 1: + lac 9f+t +003322: 204251 + jms pget +003323: 103152 + dac 9f+t+3 +003324: 044254 + jms dskrd +003325: 102116 + lac 9f+t +003326: 204251 + and o77 +003327: 504140 + tad dskbufp +003330: 344103 + tad dm1 +003331: 344204 + xct iwrite +003332: 403257 + jmp .+3 +003333: 603336 + dac 10 +003334: 040012 + cskp: + skp +003335: 741000 + dac 11 +003336: 040013 + 2: + lac 11 i +003337: 220013 + dac 10 i +003340: 060012 + isz 9f+t +003341: 444251 + isz 9f+t+1 +003342: 444252 + jmp 3f +003343: 603357 + xct iwrite +003344: 403257 + jmp 4f +003345: 603355 + lac 9f+t +003346: 204251 + jms betwen; d0; i.size +003347: 101643 +003350: 004116 +003351: 005744 + dac i.size +003352: 045744 + lac 9f+t+3 +003353: 204254 + jms dskwr +003354: 102146 + 4: + "** 01-s1.pdf page 38 + lac 9f+t+2 +003355: 204253 + jmp iread i +003356: 623266 + 3: + lac 9f+t +003357: 204251 + and o77 +003360: 504140 + sza +003361: 740200 + jmp 2b +003362: 603337 + xct iwrite +003363: 403257 + jmp 1b +003364: 603322 + lac 9f+t+3 +003365: 204254 + jms dskwr +003366: 102146 + jmp 1b +003367: 603322 + t = t+4 + 000050 + " system call helper + " AC/ fd + " jms finac + " return with: fnode and inode loaded + " or makes error return to user + finac: 0 +003370: 000000 + lac u.ac +003371: 205631 + jms fget +003372: 102360 + jms error +003373: 101531 + lac f.flags +003374: 205757 + sma +003375: 740100 + jms error +003376: 101531 + lac f.i +003377: 205761 + jms iget +003400: 103017 + jmp finac i +003401: 623370 + " update inode file size with value in AC + dacisize: 0 +003402: 000000 + dac i.size +003403: 045744 + jms iput +003404: 103046 + lac i.size +003405: 205744 + jmp dacisize i +003406: 623402 + "** 01-s1.pdf page 41 + " s7 + pibreak: " priority interrupt break processing "chain" + dac .ac " save interrupt AC +003407: 044071 + "** CROSSED OUT.... + dpsf +003410: 704741 + jmp 1f " disable the Graphics-2 I/O +003411: 603432 + dpcf +003412: 704761 + dprs +003413: 704752 + dac dpstat +003414: 045532 + sma ral +003415: 740110 + jmp 2f +003416: 603425 + dprc +003417: 704712 + dac dpchar +003420: 045535 + -1 +003421: 777777 + dac dpread +003422: 045533 + lac dpstat +003423: 205532 + ral +003424: 740010 + 2: + sma +003425: 740100 + jmp piret +003426: 603755 + -1 +003427: 777777 + dac dpwrite +003430: 045534 + jmp piret "** END OF CROSSOUT +003431: 603755 + 1: clsf " clock overflow (line frequency ticks)? +003432: 700001 + jmp 1f " no +003433: 603466 + lpb " load display push buttons +003434: 704412 + dac pbsflgs " save +003435: 045476 + isz s.tim+1 " increment low order tick count +003436: 445560 + skp " no overflow, skip second increment +003437: 741000 + isz s.tim " low order overflowed, increment high order count +003440: 445557 + isz uquant " increment user quantum counter +003441: 445474 + "** written: ttydelay -> ttyd1 + "** written: ttyrestart -> ttyres1 + cnop: " fetched as constant in iread + nop +003442: 740000 + -1 +003443: 777777 + dac 7 " set location 7 to -1 (nothing ever clears it) +003444: 040007 + clon " enable clock interrupts, reset flag +003445: 700044 + lac ttydelay " tty delay positive? +003446: 205503 + spa " yes: skip to skp +003447: 741100 + isz ttydelay " no: done delaying? +003450: 445503 + skp " not done +003451: 741000 + jms ttyrestart " yes: start output +003452: 103572 + "** START CROSSED OUT: written: lac tty + lac .dspb +003453: 205536 + sna +003454: 741200 + jmp piret +003455: 603755 + isz .dsptm +003456: 444073 + skp +003457: 741000 + jmp dsprestart +003460: 603512 + sad d3 +003461: 544121 + jmp piret +003462: 603755 + isz .dspb +003463: 445536 + jmp piret +003464: 603755 + jmp dsprestart "** END CROSSED OUT +003465: 603512 + 1: dssf " disk flag set? +003466: 707121 + jmp 1f " no +003467: 603476 + -1 " set .dskb = -1 +003470: 777777 + dac .dskb +003471: 044074 + "** 01-s1.pdf page 42 + dsrs " get disk status in .dske +003472: 707132 + dac .dske +003473: 044075 + dscs " clear status register +003474: 707141 + jmp piret +003475: 603755 + "** BEGIN CROSSED OUT + 1: lds " load display status (see 03-scope.pdf pg 25) +003476: 701052 + sma ral " display trap set? (and rotate left) +003477: 740110 + jmp 1f " not set +003500: 603521 + cdf " display done executing; clear display flags +003501: 700501 + lac .dspb +003502: 205536 + sna +003503: 741200 + jmp piret " return now if .dspb == 0 +003504: 603755 + tad dm3 +003505: 344203 + sna +003506: 741200 + jmp dsprestart " start display if .dspb == 3 +003507: 603512 + dac .dspb " otherwise, .dspb -= 3 and return +003510: 045536 + jmp piret +003511: 603755 + dsprestart: + lac d1 +003512: 204117 + dac .dspb " set .dspb = 1 +003513: 045536 + lac dspbufp " load display buf pointer +003514: 205475 + beg " start display processor +003515: 700547 + -10 +003516: 777766 + dac .dsptm " set .dsptm = -10 (10 ticks) +003517: 044073 + jmp piret +003520: 603755 + 1: sma ral " edges flag set?? (and rotate) +003521: 740110 + jmp .+3 " no +003522: 603525 + raef " "resume after edges flag" +003523: 700742 + jmp piret " return +003524: 603755 + sma " light pen flag? +003525: 740100 + jmp 1f " no +003526: 603533 + lda " G-2: load display address +003527: 701012 + dac .lpba " save +003530: 045537 + rlpd " G-2: resume after light pen stop +003531: 700723 + jmp piret +003532: 603755 + 1: ksf " (TTY) keyboard flag set? +003533: 700301 + jmp 1f " no +003534: 603565 + lac ttydelay " get TTY delay +003535: 205503 + sma " minus (waiting for output)? +003536: 740100 + isz ttydelay " no: increment??? (make more positive) +003537: 445503 + krb " read keyboard buffer +003540: 700312 + dac char " save in char +003541: 045511 + sad o375 " interrupt char (TTY ALT MODE?) +003542: 544151 + jmp intrp1 " yes +003543: 604021 + lac d1 +003544: 204117 + jms putchar +003545: 101730 + dzm char +003546: 145511 + lac sfiles+0 " get sleep word for ttyin +003547: 205520 + jms wakeup " wake processes +003550: 103762 + dac sfiles+0 " clear sleep word +003551: 045520 + lac char " get character +003552: 205511 + sad o212 " new line (with parity)?? +003553: 544150 + skp " yes +003554: 741000 + jmp piret " no: done +003555: 603755 + lac sfiles+1 " get ttyout sleep word +003556: 205521 + sma " highest bit set? +003557: 740100 + xor o400000 " no, make it so (why?] +003560: 244173 + dac sfiles+1 " save back +003561: 045521 + "** 01-s1.pdf page 43 + jms putcr " output CR next +003562: 104014 + jms ttyrestart " start output +003563: 103572 + jmp piret +003564: 603755 + 1: tsf " TTY output flag set? +003565: 700401 + jmp 1f " no +003566: 603626 + tcf " yes: clear flag +003567: 700402 + jms ttyrestart " transmit next character +003570: 103572 + jmp piret +003571: 603755 + ttyrestart: 0 +003572: 000000 + lac ttydelay " get tty delay +003573: 205503 + spa " positive? +003574: 741100 + jmp ttyrestart i " no: keep waiting +003575: 623572 + lac nttychar " get pending CR, if any +003576: 205501 + dzm nttychar " clear it +003577: 145501 + sza " need to send CR? +003600: 740200 + jmp 3f " yes +003601: 603606 + isz ttydelay " increment ttydelay (make more positive) +003602: 445503 + lac d2 +003603: 204120 + jms getchar " get a character +003604: 101745 + jmp 2f " none found?? +003605: 603622 + 3: + tls " start output +003606: 700406 + sad o12 " newline? +003607: 544130 + jms putcr " yes: put CR next +003610: 104014 + sad o15 " CR? +003611: 544132 + skp " yes +003612: 741000 + jmp ttyrestart i " no: return +003613: 623572 + lac ttydelay " get current tty delay +003614: 205503 + tad o20 " bump by 16 +003615: 344134 + rcr " divide by two +003616: 744020 + cma " complement +003617: 740001 + dac ttydelay " save +003620: 045503 + jmp ttyrestart i +003621: 623572 + 2: + lac sfiles+1 " run out of characters to send: wake user(s) +003622: 205521 + jms wakeup +003623: 103762 + dac sfiles+1 +003624: 045521 + jmp ttyrestart i "** written arrow up 2 copies +003625: 623572 + "** BEGIN CROSSED OUT + 1: sck " Graphic-2 keyboard flag set? +003626: 704301 + jmp 1f " no. +003627: 603644 + cck " yes: clear flag +003630: 704304 + lck " read character +003631: 704312 + dac char +003632: 045511 + sad o33 " code 33 (ESCAPE?) +003633: 544135 + jmp intrp2 " yes: mark interrupt +003634: 604044 + lac d3 +003635: 204121 + jms putchar +003636: 101730 + nop +003637: 740000 + lac sfiles+2 +003640: 205522 + jms wakeup +003641: 103762 + dac sfiles+2 +003642: 045522 + jmp piret +003643: 603755 + 1: rsf " paper tape ready? +003644: 700101 + jmp 1f " no +003645: 603712 + "** 01-s1.pdf page 44 + lac npptchar +003646: 205502 + sna +003647: 741200 + jmp .+5 +003650: 603655 + dac char +003651: 045511 + rrb +003652: 700112 + dac npptchar +003653: 045502 + jmp .+3 +003654: 603657 + rrb +003655: 700112 + dac char +003656: 045511 + 3: + lac char +003657: 205511 + sna +003660: 741200 + jmp 2f +003661: 603670 + lac d4 +003662: 204122 + jms putchar +003663: 101730 + jmp 3f +003664: 603704 + lac char +003665: 205511 + sad d4 +003666: 544122 + jmp 4f +003667: 603706 + 2: + lac npptchar +003670: 205502 + sna +003671: 741200 + jmp .+4 +003672: 603676 + dac char +003673: 045511 + dzm npptchar +003674: 145502 + jmp 3b +003675: 603657 + rsa +003676: 700104 + lac sfiles+3 +003677: 205523 + jms wakeup +003700: 103762 + xor o400000 +003701: 244173 + dac sfiles+3 +003702: 045523 + jmp piret +003703: 603755 + 3: + lac char +003704: 205511 + dac npptchar +003705: 045502 + 4: + lac sfiles+3 +003706: 205523 + jms wakeup +003707: 103762 + dac sfiles+3 +003710: 045523 + jmp piret +003711: 603755 + 1: psf " paper tape ready? +003712: 700201 + jmp 1f " no +003713: 603726 + pcf " clear ptp flag +003714: 700202 + lac d5 +003715: 204123 + jms getchar " get next char +003716: 101745 + jmp .+3 +003717: 603722 + psa +003720: 700204 + jmp piret +003721: 603755 + lac sfiles+4 +003722: 205524 + jms wakeup +003723: 103762 + dac sfiles+4 +003724: 045524 + jmp piret +003725: 603755 + "** BEGIN CROSSED OUT + 1: spb " any graphic-2 push button? +003726: 704401 + jmp 1f " no +003727: 603745 + cpb " clear push button flag +003730: 704404 + lpb " load push button value +003731: 704412 + dac pbsflgs+1 +003732: 045477 + "** 01-s1.pdf page 45 + and o2000 " get push button 7 +003733: 504153 + sna " set? +003734: 741200 + jmp piret " no: done +003735: 603755 + jms dspinit " yes: reset display buffer +003736: 102606 + lac sfiles+6 " wake up anyone sleeping on display +003737: 205526 + jms wakeup +003740: 103762 + dac sfiles+6 +003741: 045526 + cla " clear button lights +003742: 750000 + wbl +003743: 704424 + jmp piret "** END CROSSED OUT +003744: 603755 + 1: crsf " card reader flag set? +003745: 706701 + jmp 1f " no +003746: 603754 + crrb +003747: 706712 + dac crchar +003750: 045541 + -1 +003751: 777777 + dac crread +003752: 045540 + jmp piret +003753: 603755 + 1: crrb " read card reader buffer?? +003754: 706712 + piret: " return from priority interrupt + lac 0 " get LINK/PC +003755: 200000 + ral " restore LINK +003756: 740010 + lac .ac " restore AC +003757: 204071 + ion " reenable interrupts +003760: 700042 + jmp 0 i " return from interrupt +003761: 620000 + " wake sleeping processes + " NOTE!! Called from interrupt service, so avoids indirect!!! + " call: + " AC/ sfiles word (bit vector of processes to wake) + " jms wakeup + " AC/ 0 (to store in sfiles word) + wakeup: 0 +003762: 000000 + dac 9f+t " save vector in t0 +003763: 044255 + -mnproc +003764: 777766 + dac 9f+t+1 " loop count in t1 +003765: 044256 + lac tadu " get "tad ulist" +003766: 204076 + dac 2f +003767: 044000 + lac dacu " get "dac ulist" +003770: 204077 + dac 2f+1 +003771: 044001 + 1: + lac 9f+t +003772: 204255 + ral " rotate vector up one +003773: 740010 + dac 9f+t +003774: 044255 + sma " high bit set? +003775: 740100 + jmp 2f+2 " no: skip the fun +003776: 604002 + lac o700000 " yes: decrement process status (wake) +003777: 204200 + 2: tad .. " (avoiding indirect) +004000: 340000 + dac .. +004001: 040000 + lac 2b " advance tad operand by 4 words +004002: 204000 + tad d4 +004003: 344122 + dac 2b +004004: 044000 + lac 2b+1 " advance tad operand by 4 words +004005: 204001 + tad d4 +004006: 344122 + dac 2b+1 +004007: 044001 + isz 9f+t+1 " done? +004010: 444256 + jmp 1b " no, keep going +004011: 603772 + cla " return zero in AC +004012: 750000 + jmp wakeup i +004013: 623762 + t = t+2 + 000052 + " call to output CR after LF (NL) + putcr: 0 +004014: 000000 + lac o15 +004015: 204132 + dac nttychar +004016: 045501 + "** 01-s1.pdf page 46 + cla +004017: 750000 + jmp putcr i +004020: 624014 + intrp1: " here with TTY interrupt character + lac d6 " get keyboard special device number +004021: 204124 + dac .int1 " save as interrupt source +004022: 044067 + lac d1 " drain tty input buffer? +004023: 204117 + jms getchar +004024: 101745 + skp +004025: 741000 + jmp .-3 +004026: 604023 + lac d2 " drain tty output buffer? +004027: 204120 + jms getchar +004030: 101745 + skp +004031: 741000 + jmp .-3 +004032: 604027 + lac sfiles+0 " wake ttyin sleepers +004033: 205520 + jms wakeup +004034: 103762 + dac sfiles+0 +004035: 045520 + lac sfiles+1 " wake ttyout sleepers +004036: 205521 + jms wakeup +004037: 103762 + dac sfiles+1 +004040: 045521 + jms chkint " check if user interrupted +004041: 100320 + jmp piret " no, return from PI +004042: 603755 + jmp 1f " yes: return thru system call code (dump core) +004043: 604062 + intrp2: " here with display interrupt character + lac d7 " get keyboard special device number +004044: 204125 + dac .int2 " save as interrupt source +004045: 044070 + lac d3 " drain keyboard buffer? +004046: 204121 + jms getchar +004047: 101745 + skp +004050: 741000 + jmp .-3 +004051: 604046 + lac sfiles+2 " wake up any "keyboard" sleepers +004052: 205522 + jms wakeup +004053: 103762 + dac sfiles+2 +004054: 045522 + lac sfiles+6 " wake up any "display" sleepers +004055: 205526 + jms wakeup +004056: 103762 + dac sfiles+6 +004057: 045526 + jms chkint " check if user interrupted +004060: 100320 + jmp piret " no, return from PI +004061: 603755 + 1: + lac 0 " get interrupt PC +004062: 200000 + dac 020 " save as system call return PC +004063: 040020 + lac .ac " restore AC from interrupt +004064: 204071 + jmp 021 " join system call processing (dump core?) +004065: 600021 + "** 01-s1.pdf page 48 + " s8 + " manifests + mnproc = 10 + 000012 + dspbsz = 270 + 000416 + ndskbs = 4 + 000004 + " flags + .insys: 0 " "in system" +004066: 000000 + .int1: 0 " inode for user interrupt 1 +004067: 000000 + .int2: 0 " inode for user interrupt 2 +004070: 000000 + .ac: 0 " saved AC from Priotity Interrupt +004071: 000000 + .savblk: 0 " set by system call, cleared by disk i/o +004072: 000000 + .dsptm: 0 " display restart countdown (10 ticks) +004073: 000000 + .dskb: 0 " set on disk interrupt +004074: 000000 + .dske: 0 " status from disk interrupt +004075: 000000 + " pointers + tadu: tad ulist +004076: 345561 + dacu: dac ulist +004077: 045561 + maxquant: 30 +004100: 000036 + ofilesp: u.ofiles +004101: 005654 + idskpp: i.dskps +004102: 005733 + dskbufp: dskbuf +004103: 007700 + edspbuf: dspbuf+dspbsz +004104: 005064 + dspbufp3: dspbuf+3 +004105: 004451 + fblksp: s.fblks +004106: 005544 + dacq1: dac q1 +004107: 044260 + lacq1: lac q1 +004110: 204260 + q2p: q2 +004111: 004300 + " strings + initf: + n;t;< > ;< > " +004112: 151156 +004113: 151164 +004114: 040040 +004115: 040040 + " constants + d0: 0 +004116: 000000 + d1: 1 +004117: 000001 + d2: 2 +004120: 000002 + d3: 3 +004121: 000003 + d4: 4 +004122: 000004 + d5: 5 +004123: 000005 + d6: 6 +004124: 000006 + d7: o7: 07 +004125: 000007 + d8: 8 +004126: 000010 + d9: 9 +004127: 000011 + o12: d10: 10 +004130: 000012 + o14: 014 +004131: 000014 + o15: 015 +004132: 000015 + o17: 017 +004133: 000017 + o20: 020 +004134: 000020 + o33: 033 +004135: 000033 + o40: 040 +004136: 000040 + o55: 055 +004137: 000055 + o77: 077 +004140: 000077 + d65:o101: 0101 +004141: 000101 + d33: 33 +004142: 000041 + o132: 0132 +004143: 000132 + o134: 0134 +004144: 000134 + o137: 0137 +004145: 000137 + o155: 0155 +004146: 000155 + o177: 0177 +004147: 000177 + "** 01-s1.pdf page 49 + o212: 0212 +004150: 000212 + o375: 0375 +004151: 000375 + o777: 0777 +004152: 000777 + o2000: 02000 +004153: 002000 + o4000: 04000 +004154: 004000 + d7999: 7999 +004155: 017477 + o10000: 010000 +004156: 010000 + o17762: 017762 +004157: 017762 + o17777: 017777 +004160: 017777 + o20001: 020001 +004161: 020001 + o40000: 040000 +004162: 040000 + o40001: 040001 +004163: 040001 + o70000: 070000 +004164: 070000 + o77777: 077777 +004165: 077777 + o100000: 0100000 +004166: 100000 + o140000: 0140000 +004167: 140000 + o200000: 0200000 +004170: 200000 + o200001: 0200001 +004171: 200001 + o300000: 0300000 +004172: 300000 + o400000: 0400000 +004173: 400000 + o500000: 0500000 +004174: 500000 + o577777: 0577777 +004175: 577777 + o600000: 0600000 +004176: 600000 + o640000: 0640000 +004177: 640000 + o700000: 0700000 +004200: 700000 + o777700: 0777700 +004201: 777700 + o777760: 0777760 +004202: 777760 + dm3: -3 +004203: 777775 + dm1: -1 +004204: 777777 + 9: .=.+t " per-routine temp variables + 1004257 + c1: .=.+1 " not used? + 1004260 + q1: q2;q2+98 " ** 90? 96?? " queue element free list? +004260: 004300 +004261: 004442 + .=.+14 + 1004300 + " queues (two words each, head and tail pointers?) + " 1: tty input + " 2: tty output + " 3: display keyboard + " 4: paper tape reader + " 5: paper tape punch + q2: + .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 +004300: 004302 +004301: 000000 +004302: 004304 +004303: 000000 +004304: 004306 +004305: 000000 +004306: 004310 +004307: 000000 +004310: 004312 +004311: 000000 +004312: 004314 +004313: 000000 +004314: 004316 +004315: 000000 +004316: 004320 +004317: 000000 +004320: 004322 +004321: 000000 +004322: 004324 +004323: 000000 + .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 +004324: 004326 +004325: 000000 +004326: 004330 +004327: 000000 +004330: 004332 +004331: 000000 +004332: 004334 +004333: 000000 +004334: 004336 +004335: 000000 +004336: 004340 +004337: 000000 +004340: 004342 +004341: 000000 +004342: 004344 +004343: 000000 +004344: 004346 +004345: 000000 +004346: 004350 +004347: 000000 + .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 +004350: 004352 +004351: 000000 +004352: 004354 +004353: 000000 +004354: 004356 +004355: 000000 +004356: 004360 +004357: 000000 +004360: 004362 +004361: 000000 +004362: 004364 +004363: 000000 +004364: 004366 +004365: 000000 +004366: 004370 +004367: 000000 +004370: 004372 +004371: 000000 +004372: 004374 +004373: 000000 + .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 +004374: 004376 +004375: 000000 +004376: 004400 +004377: 000000 +004400: 004402 +004401: 000000 +004402: 004404 +004403: 000000 +004404: 004406 +004405: 000000 +004406: 004410 +004407: 000000 +004410: 004412 +004411: 000000 +004412: 004414 +004413: 000000 +004414: 004416 +004415: 000000 +004416: 004420 +004417: 000000 + .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;0;0 +004420: 004422 +004421: 000000 +004422: 004424 +004423: 000000 +004424: 004426 +004425: 000000 +004426: 004430 +004427: 000000 +004430: 004432 +004431: 000000 +004432: 004434 +004433: 000000 +004434: 004436 +004435: 000000 +004436: 004440 +004437: 000000 +004440: 004442 +004441: 000000 +004442: 000000 +004443: 000000 + dsploc: .=.+1 + 1004445 + dsplno: .=.+1 + 1004446 + dspbuf: + 0065057;0147740;0160000 " display commands: see 03-scope.pdf pg 20 +004446: 065057 +004447: 147740 +004450: 160000 + " PARAM: clear blink, clear light pen, scale=1, intensity=3 + " X-Y: invisible, no delay, Y=01740 (992) + " X-Y: invisible, settling delay, X=0 + .=.+30 + 1004507 + coldentry: + dzm 0100 " not re-entrant +004507: 140100 + caf " clear all flags +004510: 703302 + ion " enable interrupts +004511: 700042 + clon " clear clock flag +004512: 700044 + law 3072 " initialize display.... +004513: 766000 + wcga +004514: 704206 + jms dspinit +004515: 102606 + law dspbuf " set display buffer to default +004516: 764446 + jms movdsp +004517: 102615 + cla " read system block from disk +004520: 750000 + jms dskio; 06000 +004521: 102162 +004522: 006000 + jms copy; dskbuf; sysdata; ulist-sysdata " copy to system data +004523: 101667 +004524: 007700 +004525: 005542 +004526: 000017 + lac d3 " look for "init" in default directory +004527: 204121 + jms namei; initf +004530: 102737 +004531: 004112 + jms halt +004532: 102254 + "** 01-s1.pdf page 50 + jms iget +004533: 103017 + cla +004534: 750000 + jms iread; 4096; 4096 " read in "init" +004535: 103266 +004536: 010000 +004537: 010000 + jmp 4096 " start process 1 +004540: 610000 + . = dspbuf+dspbsz+3 + 1005067 + dskbuf = 07700 + 007700 + dskbs: .=.+65+65+65+65 + 1005473 + edskbsp: . +005473: 005473 + uquant: .=.+1 " number of ticks user has been running + 1005475 + dspbufp: .=.+1 " pointer to display buffer + 1005476 + pbsflgs: .=.+2 " buttons on last tick, last button interrupt + 1005500 + mode: .=.+1 + 1005501 + nttychar: .=.+1 " CR to send next, or zero + 1005502 + npptchar: .=.+1 + 1005503 + ttydelay: .=.+1 " delay count for TTY output + 1005504 + name: .=.+4 + 1005510 + lnkaddr: .=.+1 + 1005511 + char: .=.+1 + 1005512 + dskaddr: .=.+1 + 1005513 + uniqpid: 1 " pid generator +005513: 000001 + lu: .=.+4 " user (process) table entry copy + 1005520 + sfiles: .=.+10 " wait addresses for special files + 1005532 + " (bit vector of waiting processes?) + " offsets: 0: ttyin, 1: ttyout, 2: keyboard, + " 3: ptr, 4: ptp, 6: display + dpdata: + dpstat: .=.+1 + 1005533 + dpread: .=.+1 + 1005534 + dpwrite: .=.+1 + 1005535 + dpchar: .=.+1 + 1005536 + dspdata: + .dspb: .=.+1 + 1005537 + .lpba: .=.+1 "** 4 written on listing + 1005540 + crdata: + crread: .=.+1 + 1005541 + crchar: .=.+1 + 1005542 + sysdata: " system data 64 words saved to disk + s.nxfblk: .=.+1 " pointer to next free block?? + 1005543 + s.nfblks: .=.+1 " number of free blocks (in fblks?) + 1005544 + s.fblks: .=.+10 " cached free block numbers + 1005556 + s.uniq: .=.+1 " next unique value + 1005557 + s.tim: .=.+2 " (up?)time in 60Hz ticks (low, high) + 1005561 + " process table + " first word + " bits 0:2 -- status + " 0: free slot + " 1: in/ready + " 2: in/notready + " 3: out/ready + " 4: out/notready?? + " bits 3:17 -- disk swap address/8 + " second word: process pid + " third word: smes/rmes status: + " 0: not waiting + " -1: this process waiting (rmes) + " other: complement of sender pid + " fourth word: smes message + ulist: + 0131000;1;0;0 +005561: 131000 +005562: 000001 +005563: 000000 +005564: 000000 + 0031040;0;0;0 +005565: 031040 +005566: 000000 +005567: 000000 +005570: 000000 + 0031100;0;0;0 +005571: 031100 +005572: 000000 +005573: 000000 +005574: 000000 + 0031140;0;0;0 +005575: 031140 +005576: 000000 +005577: 000000 +005600: 000000 + 0031200;0;0;0 +005601: 031200 +005602: 000000 +005603: 000000 +005604: 000000 + 0031240;0;0;0 +005605: 031240 +005606: 000000 +005607: 000000 +005610: 000000 + 0031300;0;0;0 +005611: 031300 +005612: 000000 +005613: 000000 +005614: 000000 + 0031340;0;0;0 +005615: 031340 +005616: 000000 +005617: 000000 +005620: 000000 + 0031400;0;0;0 +005621: 031400 +005622: 000000 +005623: 000000 +005624: 000000 + 0031440;0;0;0 +005625: 031440 +005626: 000000 +005627: 000000 +005630: 000000 + userdata: " "ustruct" (swappable) + u.ac: 0 " user AC +005631: 000000 + u.mq: 0 " user MQ +005632: 000000 + u.rq: .=.+9 " user 010-017, user PC + 1005644 + u.uid: -1 " user id +005644: 777777 + u.pid: 1 " process id +005645: 000001 + u.cdir: 3 " connected directory (inode number?) +005646: 000003 + u.ulistp: ulist " pointer to process table entry +005647: 005561 + u.swapret: 0 " kernel routine to resume at after swap in +005650: 000000 + u.base: 0 " start of user buffer +005651: 000000 + u.count: 0 " size of user buffer +005652: 000000 + "** 01-s1.pdf page 51 + u.limit: 0 " end of user buffer +005653: 000000 + u.ofiles: .=.+30 " open files (10 "fnode" entries) + 1005712 + u.dspbuf: 0 +005712: 000000 + u.intflg: 1 +005713: 000001 + .=userdata+64 + 1005731 + ii: .=.+1 " The current i-node number stored in inode + 1005732 + inode: " disk inode in memory: + i.flags: .=.+1 " inode flags + 1005733 + " 400000 in use + " 200000 large file + " 000040 special device (indicated by inum) + " 000020 directory + " 000010 owner read + " 000004 owner write + " 000002 world read + " 000001 world write + i.dskps: .=.+7 " disk block numbers (indirect if "large file") + 1005742 + i.uid: .=.+1 " owner + 1005743 + i.nlks: .=.+1 " link count (negative) + 1005744 + i.size: .=.+1 " size (in words) + 1005745 + i.uniq: .=.+1 " unique number + 1005746 + .= inode+12 + 1005746 + di: .=.+1 " directory index + 1005747 + dnode: " directory entry: + d.i: .=.+1 " inode number + 1005750 + d.name: .=.+4 " name (space padded) + 1005754 + d.uniq: .=.+1 " unique number from directory inode + 1005755 + . = dnode+8 + 1005757 + fnode: " open file entry + f.flags: .=.+1 " see below + 1005760 + f.badd: .=.+1 " offset + 1005761 + f.i: 0 " file i-number +005761: 000000 + " f.flags: + " 400000 in use + " 000002 read + " 000001 write + +Labels: +.ac 004071 r +.capt 000377 r +.chdir 000615 r +.chmod 000407 r +.chown 000421 r +.close 000720 r +.creat 000660 r +.dskb 004074 r +.dske 004075 r +.dspb 005536 r +.dsptm 004073 r +.exit 001163 r +.fork 001111 r +.getuid 000426 r +.halt 001336 r +.insys 004066 r +.int1 004067 r +.int2 004070 r +.intrp 000257 r +.link 000467 r +.lpba 005537 r +.open 000626 r +.read 000724 r +.rele 000403 r +.rename 000567 r +.rmes 001177 r +.savblk 004072 r +.save 001151 r +.seek 000431 r +.setuid 000561 r +.smes 001225 r +.status 000352 r +.sysloc 000262 r +.tell 000461 r +.time 000610 r +.unlink 000542 r +.write 000773 r +access 002312 r +alloc 001545 r +arg 002625 r +argname 002631 r +awake 001304 r +badcal 001146 r +betwen 001643 r +c1 004257 r +char 005511 r +chkint 000320 r +chkint1 001535 r +cnop 003442 r +coldentr 004507 r +collapse 002055 r +copy 001667 r +copyz 001712 r +crchar 005541 r +crdata 005540 r +crread 005540 r +cskp 003335 r +d.i 005747 r +d.name 005750 r +d.uniq 005754 r +d0 004116 r +d1 004117 r +d10 004130 r +d2 004120 r +d3 004121 r +d33 004142 r +d4 004122 r +d5 004123 r +d6 004124 r +d65 004141 r +d7 004125 r +d7999 004155 r +d8 004126 r +d9 004127 r +dacisize 003402 r +dacq1 004107 r +dacu 004077 r +dget 003104 r +di 005746 r +dm1 004204 r +dm3 004203 r +dnode 005747 r +dpchar 005535 r +dpdata 005532 r +dpread 005533 r +dpstat 005532 r +dput 003136 r +dpwrite 005534 r +dskaddr 005512 r +dskbs 005067 r +dskbufp 004103 r +dskio 002162 r +dskrd 002116 r +dskswap 002267 r +dsktrans 002220 r +dskwr 002146 r +dslot 002463 r +dspbuf 004446 r +dspbufp 005475 r +dspbufp3 004105 r +dspdata 005536 r +dspinit 002606 r +dspleft 002562 r +dsplno 004445 r +dsploc 004444 r +dspnl 002574 r +dspput 002540 r +dspresta 003512 r +edskbsp 005473 r +edspbuf 004104 r +error 001531 r +exitrw 001034 r +f.badd 005760 r +f.flags 005757 r +f.i 005761 r +fallr 002425 r +fassign 002327 r +fblksp 004106 r +fget 002360 r +finac 003370 r +fnode 005757 r +forall 002412 r +fput 002402 r +free 001604 r +getchar 001745 r +halt 002254 r +i.dskps 005733 r +i.flags 005732 r +i.nlks 005743 r +i.size 005744 r +i.uid 005742 r +i.uniq 005745 r +icreat 002475 r +idskpp 004102 r +iget 003017 r +ii 005731 r +initf 004112 r +inode 005732 r +intrp1 004021 r +intrp2 004044 r +iput 003046 r +iread 003266 r +isown 002664 r +itrunc 002675 r +iwrite 003257 r +laci 001635 r +lacq1 004110 r +lnkaddr 005510 r +locn 000317 r +locsw 000275 r +lookfor 001066 r +lu 005514 r +maxquant 004100 r +mode 005500 r +movdsp 002615 r +name 005504 r +namei 002737 r +npptchar 005502 r +nttychar 005501 r +o10000 004156 r +o100000 004166 r +o101 004141 r +o12 004130 r +o132 004143 r +o134 004144 r +o137 004145 r +o14 004131 r +o140000 004167 r +o15 004132 r +o155 004146 r +o17 004133 r +o177 004147 r +o17762 004157 r +o17777 004160 r +o20 004134 r +o2000 004153 r +o200000 004170 r +o200001 004171 r +o20001 004161 r +o212 004150 r +o300000 004172 r +o33 004135 r +o375 004151 r +o40 004136 r +o4000 004154 r +o40000 004162 r +o400000 004173 r +o40001 004163 r +o500000 004174 r +o55 004137 r +o577777 004175 r +o600000 004176 r +o640000 004177 r +o7 004125 r +o70000 004164 r +o700000 004200 r +o77 004140 r +o777 004152 r +o777700 004201 r +o777760 004202 r +o77777 004165 r +ofilesp 004101 r +okexit 000102 r +open1 000715 r +orig 000000 r +passone 001523 r +pbsflgs 005476 r +pget 003152 r +pibreak 003407 r +piret 003755 r +putchar 001730 r +putcr 004014 r +putq 002011 r +q1 004260 r +q2 004300 r +q2p 004111 r +rkbdi 001410 r +rppti 001461 r +rttyi 001337 r +s.fblks 005544 r +s.nfblks 005543 r +s.nxfblk 005542 r +s.tim 005557 r +s.uniq 005556 r +searchu 001042 r +seektell 002645 r +sfiles 005520 r +sleep 002434 r +srcdbs 002035 r +swap 000136 r +swn 000256 r +swp 000220 r +swr 001324 r +sww 001324 r +sysdata 005542 r +sysexit 000103 r +tadu 004076 r +takeq 001757 r +ttydelay 005503 r +ttyresta 003572 r +u.ac 005631 r +u.base 005651 r +u.cdir 005646 r +u.count 005652 r +u.dspbuf 005712 r +u.intflg 005713 r +u.limit 005653 r +u.mq 005632 r +u.ofiles 005654 r +u.pid 005645 r +u.rq 005633 r +u.swapre 005650 r +u.uid 005644 r +u.ulistp 005647 r +ulist 005561 r +uniqpid 005513 r +uquant 005474 r +userdata 005631 r +wakeup 003762 r +wdspo 001451 r +wppto 001475 r +wttyo 001357 r diff --git a/build/alt/a.rim b/build/alt/a.rim new file mode 100644 index 0000000..3ad059c --- /dev/null +++ b/build/alt/a.rim @@ -0,0 +1 @@ +ผ ฐฟฟฟธฎฎฐธฎดฎ ฎกขฎฃทคฅฎฆงจฎฃฉฟฟฟช บซ ถฌฌผญฃฎกฏกฐฑธขฒฟฟฟณฎฃดตฃถกฑทฎธฐฆนบปปฒฐฅฌฎธข บ ผฐทญขฟฝฒธ ถผฐฉทฎฎฎฎตฎฒฎฃธข ถกขฐฉฃถคฅผฆฐ งกจฐฉข ชถซฌฐฑญถฎฏฐฑฐฐฟฑฒฎจณธดกธตฎงถฎงทธขธทนธบฏปผผฐฟฝพคฆพฟธกพข ข ธขท ฐฎจกกฏผฌผธฒฐฉปฐฑท ข ฑ ทณ ฏกขฃคฆฅฒฆฆงฟจฉชชฆซฌฟญฎฏฎฐฏฑฐฒฎณจกฐดฃตกถทธฝนบบปฎผฐฝฝพฟฏฎญขทฃ ฆฟญฌพฅญญ ถผฒ ทผฐฌฎฎฐก ธผฒฌฎฎผฒ ธ ฐขก ทขฏฃผคฒฅฟฟฟฆ ถงธขจคฉฒชซฎฌฎฆญฎฏฐฑฎฒจกฐณฃดกฎตกฏถทบธทนฏบปผฏงฝพฐฟฎฏฐฏพคฆ ฐดฎจกตฏจขดฏฆฐดฎฏขฆฐฎคฎฐฅฎฉผตฏฏจก ผกจขดฃฃคกฅฏคฆงฐญจดฉฃชกซฏคฌฏคญฏฐฎฎฏฐฐฑฅฒผณกดฎฉตฎถฐทธฟนบ ปผ ฝฎฆพฟ ฎฉ ท ญ ฎฆ ญ ผ ก ญ ณ ฎฉ ฏ ฏง ท ญ ฏจ ฏฅ ฏฌ ฟฟฟ ฏฃ ฏฃ ฆ กฐ ข ฃฎฉ คก ฅญ ฆ งฏง จ ฉฎฉ ช ซคฏฃ ฌฐ ฏ ญฝ ฎฏ ฏฆ ฐฐ ฑฎค ฒผ ณ ดฎ ตฎค ถฐ ท ธ ฝ น บ ปฎฆ ผ ฝ พ ฟกญทฏจ ฐญฏฎญฐฎฐฏจกผฏฎฆฐ ผกผกญฎฆ กขฃคฏฅจกฆผงฐจญฉจกชผซฐฌฎคญผฎฏฐฐกฑญฒณตดทตถญทธฎฆนบญปฐผฝพฏฟจกผฐ ฎคผ ฝฝฐฎจกฝฐธฏฏฐจกฐฎฉฎชฎฉฃกฎกฐฎชฃ ฎฉกกฐขฃฎซคธฅฏฏฆจกงผจฉฏชจกซผฌฐฒญธฎฏฏฐฑฑฒฒฎฉณธดฎชตนถฏฐทถธนบฐปผจกฐฝฎฉพฟฎชฎฉฃฎฉกฐ ฎซธฏฏจกผฏจกผฐธฏฒฎฉฎชฏฐฏฎฏฐฏฐฆ กฐขฃขคขฅฟฟถฆขงพญฐจฉชญซฌญญฎญฏฐญฑขฒคขณฐฉดคขตฒขถทขธผนคถบคถปฒถผฝญพผฟผจกฎถผฒผฟฟฝ จกฐคถฒถถผขคญญฎพฎจกธฎงฎงทธขฎงกถฎงฎงฎฅฎญ ฎฅกคขขขฃคฎฃคฏฅฐฆธคงฟฟฟจฉกชซฝฌฏญฎฏฏฐฎฑฒฆณฏดผตฐธถพคฆทธนฎงบจกตปฎงผคฎงฝฎงพฟกถฎงฎงพฎง ขฟฟฟขพฎงขขผฎขคขขฎขฐฎผขพฎงขข ญกฌฎขผฃฒคญฅฌขฆฐตงกถจฎงฉฎงชพซฎงฌขญฎฎขฏฐพฑฎงฒขณขดฐตฟฟฝถทขธขนขบขปคขผคขฝฎฅพผฟขคขฎขฐ ขฒฎฅฌญผฒฟฟฝขขขขฒฒฑฏฉฝฌ กกฅขฐซฃจกงคฃฅกกฆกฃงผจกฉถชฐซฌญญฎฐฏฐฑผฒฐณตดญตผถฐพทกปธญนดบธปฌกผ ฝฐพดฟญกผฐ ญฐฏกฅฐฅตจกฆฌกฐดจกฅฌกคผฐดกตดฎซฎซ ฐขญ กฐขฎซฃถคฐฅฆญงจฐฉชซ ฌฐญฎญฏฐฐฉฑกฒฅณฐถดถตฐถญทผธธนบญปผฐฑฝพผฟฐตญผฐกป ญดธฐดญกผฐญฐฝฌกฌฐฎฉกฎฐฟฟฟฎฐ ถ ผกฐฉขฟฟฟฃ ถคฒฅฆฟฟฟงญฃจผฉฐถชญฃซกฌญขฎฏฟฐฑขฒฆณ บดขตฒฅถญขทผธฌนญคบปฟผญขฝทพฟฟญฅกญฃฐฆ ตญฃฌกฐกขดข บคญฃฒญขฟทญฅฟดญขฆ บกญฃฒจกฐกธ กกขฒฃคตฅฃฆขงคฃจดฉขชผซฐณฌฃญขฎคฃฏดฐขฑผฒผณคฃดดตผถฒฃทธฟฟฟนทบปคทผฟฟฟฝทพฟคทฟฟฟทผขคท คขฐ ฒทฟฟฟคฟฟฟผขคคขฐฒขฝฏฒกณขข กญขฃฃคคฒฅฆฏงฒฅจกนฉฌชฝซฌฃญคฅฎฒฅฏฐผ ฑกฒนณกฟด ตกถทกผธฝนขฐบผปฒฏผญฝฌขฑพฐฟกธฃฐ ฝขฑ ขฐคฏญฒฏผ กกกทขฏผฐกฒญฃฐญขฐขฑฒขฟฟผ ขกพจทขขฃขคฌขฅฒฆพงขจคขฉคขชฐฃซคฌฒญฎฝฏฐฐณฑพจทฒขณขดตกกถฟทผธกนฌปบจกฐปผผฐฝพทฟฟพฟฌปข กญขทฟฒญฃกกญฌฌญฒญฐญฒฐฐคขพขก ทกขฟฃคญฅฒฆงฃจกฉกญชฌซฒฌธญญฎฏขฐญฑฒฆฒณญดผ ตตถทขธดนตบปขผดฝขพดฟขขตขด ขขกธขฟฟฟขฒคฒฒฒฟฟถขฟฟฟธนกธนธนขธน ผ กขธนคฃ ผคผฅฐฃฆ ฝงผจฒฉคขชฐซฌฌญคขฎฐญฏธฐผ ฑทฒพณดตผ ถฐตทธผ นดบขปผฟฟฝฎพขฟทขกขฟ ขทคทฒทฏตฎคผฒฌฏขด ดจญผฒฟฟถขขกฐฌฏฏผ ฐคกคขขฐฃฒคญฅกปฆฏฏงฏจฏฑฉขชกซฎฌฏฐญฎคฏฒฐฑฃฒกณกดฒฐตผ ถตทธดนกบขปฝผทฝพฏฏฟคฐฒฐข ทฏฏฒฎฉฌฎซฐฎฉผฎฉผด จกชฒฎฉกปฎฉฐฎชฎฐพญฐกธ ตกฎงขฎฃฐชคคฅคฆคงฝจด ฉฐกชกถซฎงฌญขฎขฏดฐขฑคฒฒณดฏฆตผถคฏฆทฏฆธนฏงบผปฐถผฒณฝพขฟณกฏคฏฏ ฏผฐฏฏงทญฏจคญฎญฎฏฌฏฅขกปฏฎคฏขฟฟฟฏฃฏคฏฆฒฝ กจกงขผฃฒ คฌกฅฐฐฆตงฌกจผฉคคชฌกปซฐฒฌดญคคฎคคคฏฒ ฐฑฒ ฒคคณฌกดฐตถกปทธฝนถบคคปฒ ผฝคฅพฌกขฟฐคคฅฒผกซธคค ฒ ก คคกปคฉคฅฒธธ ฌฝฟฟฟญธขฒฎฃคฎฃฒทญ ฎฆกขญฃคฒฅฆงฎฉจฉฎซชธซฎซฌผญฒฅฎฌกฏฐฒฐฏคฑฒฅฒฏฐณฒฅดตถทฎคธผนฌฏขบผปผฒดฝพฟฟนฟขกขขผฐ ฏจกธผฐฟฟขกขขขผคขคขฐขขคขคขฐฏจกฝฏฒฝ กฟฟฟขฃขคคฅฏฆจกงผจฒฉฟฟธชฏคซผฌถ ญขฎผฏฒฐฏฆฑฏฆฒณฏงดผตฐถขทธฏจนฎบผปฐผฏฉฝฎพผฟฐฏชฎผฐฏซ ฎผฐฏงคฒคฏฆคขฐฑฒฏผ ต ข ดกขกข ผ ตดกข ขกทขฃฏคฅฒฆงขกจฉพฏชซฟฟฟฌข ญฎฟฟดฏขขฐฑฎฒผณฐทดคขขตฐฐถฒฆทฟฟฟธนบฟฟฟปผฝพฟคขขฐฝขกฆฒฆ ฏฆถขฃชขคขฃจก กขฅทฏงขฃกฃกฏคผฒฏงฒขค กขฅขฅฃทคฏงฅฆงขคจฆฉฒชซถ ฌขฆญฏฎจกธฏผฐฐฑขฆฒฃณกดกตฐฝถกทขฆธขฆนผบฅปขฆผฒชฝฅพขงฟทฏฟฟ นขงฆขงฏฏฏกธฏขฆถ ฃกกฌกขงขงผฅขงขจขฆจก กกขงขขงฃผคฒชฅฅฆขฆงขจจฉขฆชขงซขจฌฆญขฆฎฒชฏฐขฉฑฏฒถณดฏตฐบถทขฉธขนฏบฟฟฟปถผฝพคถฟถขชคถกด ฏฏค ผขฉผฃกขชขชขซผกผฒถขชขฉชขฌขฉจก กข ฏฐผ กคขฉขคขชฃฐฏค ฏฅฐญฆขฉงฃจกฉฏคชฏคซขฌฌฆญขซฎฒถฏขฉฐจก ฑผฒฐณ ฏดฐตขฌถฆทฐธนฎบฐปผฏฏฝผพฟฏฑฒธฏคฆ ฏคฒ นธงกฐธงฑธงชญผฐธงญฟฟฟญญผผฐญฟฟฟญฐญธฐถธคฌพคญฐผ คญฏกคฌผขผฃฟฟฟคฅธคฆญงผจคญฉผชบซญฌผญฐญฎค ปฏผฐฐฑฌกฒฐญณคญดฐญตฐถธนทฐพธฟฟฟน ผบธนป ฝผธนกฝฐญพธชฟผฐธ ญผฐญ ขผฐญฐญกญฌฝธ งฟฟถ ปฐญผฐธขฐญผฐธญธฐญธฐตญผคญ ธกญขฌกฉฃฐ คกฅฆญงญจฒฉญชญซฌกจฌผญฐญฎญฏผฐกปฑญฒ ณบดฐญตธถฐทธธบนฐญบปญผผฝฒบพญฟญผฐคญกฅ ฐธฌก ฌกผฒบญกผ ผญฒบญฒญฒบธฃฐคธฃธฃญฌกฐ คกผ ญกฒขญฃฐญคธฅฐฆญงผจฐญฉญชธซญฌฐฏญธฎญฏญฐผฑฐธฒกณดฐตญถฌกทฐธญนผบฐพปญผญฝฐฏพธฟญฒกปญฐญญ ญญฒญฐญธฐธกฅฐธฐญญฒญฐญธคฐฅธคธคฌฟจกซผฐญญ ฒกญขฝฃธคคฐญฅธทฆฐฌงธทจญกฉฟฟฟชญ ซฐญฌธทญฎผฏ นฐธขฑฒฒณขญดฟฟถตขฎถ พท ธ ฟน บขญปผผขญฝผพฐ ฟข ก ก คขฎ ฐบ ฝ ฒฒ ก ญ ฝ ฒ ก ท ก ฅ ผ ฐ ก ฅ ผ ฐ ญ ฒ ญ ญ ฒ ญ ก ขฐญ ฃฐ ฒ คก ฅ ธ ฆก งฅ จผ ฉฐ ฆ ชญ ซฒ ฌญ ญญ ฎฒ ฏญ ฐ ฑฐญ ฒ ณ ด น ตฐ ถ ท ธ น บ ป ผ ฝ พญฑ ฟญฑกกฎฌกฏกฟกจดก คฉกญคกขฐกขฐกฃกฎกดก ก กกกกกก กกกกกกกกกกก กญก ฟกกกขกกฃกคกฅกฆญกงฟกจกฉฝกชฟกซกฌ กญผฟกฎกฏฟฒกฐฟฟกฑกฒกณกดกตฟฟกถกทกธกนกบกป กผจกฝฏฟฟกพฐกฟดขธขฟฟขฟฟฐขฟฟฝขฟฟฟขฐฃขฑคขฃฃฃฃฃฃฃฃฃ ฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃฃ ฃฃ ฃขฃกฃขฃคฃฃฃคฃฆฃฅฃฆฃจฃงฃจฃชฃฉฃชฃฌฃซฃฌฃฎฃญฃฎฃฐฃฏฃฐฃฒฃฑฃฒฃดฃณฃดฃถฃตฃถฃธฃทฃธฃบฃนฃบฃผฃปฃผฃพฃฝฃพคฃฟคคคคคคคคค คคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคคค คค คขคกคขคฃคฆจฏคงฟ คจฅฅธฅธขฅธคฅพฐฅธขฅฅพคฆฅฅฝฅฒฅฐฅทฅฟฅญขฅฅกฅฅกฅฌฅฅฝฅถฅฅฅ ฑฌปฌปญญฑญฒญณญดญต ญถญทญธญนญบญปญผญฝ ญพญฟฎฎฎฎฎฎ ฎฎฎฎฎฎฎฎ ฎฎฎฎฎฎฎฎ ฎฎฎฎฎฎคฟฟฟฎฅฎฆฎงญฑฎจฎฉฎชฎซฏฏฏฑผ \ No newline at end of file diff --git a/build/alt/image.fs b/build/alt/image.fs new file mode 100644 index 0000000..d37e641 Binary files /dev/null and b/build/alt/image.fs differ diff --git a/build/alt/unixv0.simh b/build/alt/unixv0.simh index ea840ac..38593b0 100644 --- a/build/alt/unixv0.simh +++ b/build/alt/unixv0.simh @@ -5,8 +5,9 @@ show cpu set tti unix set rb ena -att rb alt/image.fs +att rb image.fs show dev -load -S alt/a.rim +load -S a.rim dep pc 0100 +go