Add Type and More, and the file stream they are built on
Two applications that read a file too big for Data Memory: Type prints one, More pages it. Both sit on fileStream.asm, which wraps osFileInfo and osFileBlock into open-and-next so an application walks a file's blocks without repeating the service calls. The disk fixture is deliberately awkward: readable.txt crosses several blocks and carries no zero byte to be mistaken for an end marker, and empty.txt says that zero blocks is a valid file rather than an error. These three files were written by ChatGPT, as their headers record. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E2JrLzFvuFX9fgi1LDRjrW
This commit is contained in:
co-authored by
Claude Opus 5
parent
4fd8bf7b3f
commit
dbe58db660
@@ -0,0 +1,89 @@
|
||||
CosmOS
|
||||
> loaded, starting at 2000
|
||||
> first line
|
||||
second line
|
||||
line 00: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 01: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 02: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 03: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 04: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 05: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 06: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 07: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 08: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 09: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 10: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 11: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 12: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 13: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 14: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 15: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 16: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 17: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 18: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 19: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
-- more --
|
||||
finished
|
||||
> first line
|
||||
second line
|
||||
line 00: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 01: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 02: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 03: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 04: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 05: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 06: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 07: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 08: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 09: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 10: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 11: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 12: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 13: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 14: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 15: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 16: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 17: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 18: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 19: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
-- more --
|
||||
line 20: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 21: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 22: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 23: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 24: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 26: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 27: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 28: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 29: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
finished
|
||||
> first line
|
||||
second line
|
||||
line 00: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 01: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 02: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 03: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 04: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 05: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 06: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 07: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 08: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 09: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 10: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 11: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 12: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 13: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 14: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 15: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 16: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 17: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 18: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 19: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
-- more --
|
||||
line 20: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
-- more --
|
||||
finished
|
||||
> halted
|
||||
Execution halted.
|
||||
[exit 0]
|
||||
@@ -0,0 +1,43 @@
|
||||
CosmOS
|
||||
> loaded, starting at 2000
|
||||
> first line
|
||||
second line
|
||||
line 00: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 01: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 02: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 03: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 04: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 05: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 06: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 07: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 08: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 09: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 10: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 11: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 12: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 13: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 14: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 15: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 16: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 17: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 18: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 19: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 20: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 21: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 22: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 23: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 24: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 26: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 27: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 28: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
line 29: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
finished
|
||||
> finished
|
||||
> type: cannot find the file, error 2
|
||||
finished
|
||||
> type: give me a file name
|
||||
finished
|
||||
> halted
|
||||
Execution halted.
|
||||
[exit 0]
|
||||
@@ -0,0 +1,6 @@
|
||||
load More.sbx
|
||||
run readable.txt
|
||||
qrun readable.txt
|
||||
run readable.txt
|
||||
|
||||
qexit
|
||||
@@ -0,0 +1,6 @@
|
||||
load Type.sbx
|
||||
run readable.txt
|
||||
run empty.txt
|
||||
run missing.txt
|
||||
run
|
||||
exit
|
||||
@@ -161,6 +161,22 @@ awk 'BEGIN { for (i = 0; i < 50; i++) printf "small %05d\n", i }' > small.txt
|
||||
"$ROOT/Programs/CosmOS/Apps/Stream.asm" -o "$WORK/Stream.sbx" >/dev/null
|
||||
"$TOOL" put "$DISKS/stream.img" "$WORK/Stream.sbx" >/dev/null
|
||||
|
||||
# A disk for Type. The first file crosses several blocks and deliberately has no zero byte
|
||||
# for the application to mistake for an end marker. The second proves that zero blocks is
|
||||
# a valid empty file rather than an error.
|
||||
"$TOOL" format "$DISKS/type.img" 64 2 >/dev/null
|
||||
printf 'first line\nsecond line\n' > readable.txt
|
||||
awk 'BEGIN { for (i = 0; i < 30; i++) printf "line %02d: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n", i }' >> readable.txt
|
||||
: > empty.txt
|
||||
"$TOOL" put "$DISKS/type.img" readable.txt >/dev/null
|
||||
"$TOOL" put "$DISKS/type.img" empty.txt >/dev/null
|
||||
"$ROOT/Assembler" -I "$ROOT/Programs/CosmOS/Source" \
|
||||
"$ROOT/Programs/CosmOS/Apps/Type.asm" -o "$WORK/Type.sbx" >/dev/null
|
||||
"$TOOL" put "$DISKS/type.img" "$WORK/Type.sbx" >/dev/null
|
||||
"$ROOT/Assembler" -I "$ROOT/Programs/CosmOS/Source" \
|
||||
"$ROOT/Programs/CosmOS/Apps/More.asm" -o "$WORK/More.sbx" >/dev/null
|
||||
"$TOOL" put "$DISKS/type.img" "$WORK/More.sbx" >/dev/null
|
||||
|
||||
# A disk for the assembler that runs on the machine. It holds a source file and the two
|
||||
# programs that check the front end - the reader on its own and the tokenizer on its own -
|
||||
# because a fault in either of those would otherwise turn up much later as a mysterious
|
||||
|
||||
@@ -316,6 +316,14 @@ cosmosServices | CosmOS/Source/cosmos.asm | run | cosmosFil
|
||||
# notice the file moved - and that one would otherwise pass, since the blocks are still
|
||||
# there and still hold the same bytes.
|
||||
cosmosStream | CosmOS/Source/cosmos.asm | run | cosmosStream.in | - | disks/stream.img
|
||||
# A useful application made out of the streaming primitive: print a named text file without
|
||||
# requiring it to fit in Data Memory. The fixture crosses block boundaries, includes a full
|
||||
# 256-byte block, and also checks empty, missing, and absent filename cases.
|
||||
cosmosType | CosmOS/Source/cosmos.asm | run | cosmosType.in | - | disks/type.img
|
||||
# The same stream with interaction layered on it. Three runs exercise q, a whole screen
|
||||
# with Space, and one line with Return. The input is intentionally packed so that the one
|
||||
# byte the pager consumes leaves the next shell command immediately behind it.
|
||||
cosmosMore | CosmOS/Source/cosmos.asm | run | cosmosMore.in | - | disks/type.img
|
||||
# The assembler's front end, checked in two pieces before anything is built on it.
|
||||
#
|
||||
# cosmosSource reads a source file and prints it back. The file crosses a block boundary,
|
||||
@@ -340,6 +348,8 @@ app-Break | CosmOS/Apps/Break.asm | assemble | -
|
||||
app-Edit | CosmOS/Apps/Edit.asm | assemble | - | -
|
||||
app-Files | CosmOS/Apps/Files.asm | assemble | - | -
|
||||
app-Stream | CosmOS/Apps/Stream.asm | assemble | - | -
|
||||
app-Type | CosmOS/Apps/Type.asm | assemble | - | -
|
||||
app-More | CosmOS/Apps/More.asm | assemble | - | -
|
||||
# The assembler that runs on the machine, and its parts. Checked on their own so that a
|
||||
# failure reads as "it does not assemble" rather than as a broken disk image.
|
||||
asm-Asm | CosmOS/Assembler/Asm.asm | assemble | - | -
|
||||
|
||||
Reference in New Issue
Block a user