The memory map gave CosmOS 0x0000 through 0x1FFF of Program Memory and applications 0x2000 and above. CosmOS is 8141 bytes at the previous commit, which is fifty one bytes short of the line, and the next thing added to it went over. GOING OVER DOES NOT FAIL WHERE IT HAPPENS. Nothing enforces the division: an application says where it goes with #Base and the loader puts it there, so a CosmOS that has grown past 0x1FFF simply has the next program loaded written over the end of it. What breaks is whichever part of the shell that program happened to cover, at whatever later moment somebody uses it. It turned up here as the monitor's assemble command answering "I do not know" to valid instructions, several commands into a session, on a machine that had booted perfectly well. Both halves are doubled: applications now start at 0x4000 in Program Memory and 0x2000 in Data Memory. That is 16K of code and 8K of data for the system, against the 8775 and 2948 it uses today. Both were on the same trajectory, and moving them together means the twenty files that say #Base are edited once rather than twice. The standalone loader's loadable.asm keeps its old base: it belongs to the loader CosmOS grew out of, not to CosmOS, and its addresses answer to a different program. The unbased-segment diagnostic keeps its old base too - it exists to produce an error message that names the address, and the message is what is recorded. Tests/docs.sh now reads the two limits out of the table in the README and measures both segments against them. It reads them rather than being told them because the table is the specification, and this is the second time in this project that the thing nobody checked is the thing that rotted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E2JrLzFvuFX9fgi1LDRjrW
152 lines
2.4 KiB
NASM
152 lines
2.4 KiB
NASM
; Read a text file one screen at a time.
|
|
;
|
|
; Twenty two lines are shown before a prompt. Space advances another screen, Return one
|
|
; line, and q gives the machine back to CosmOS. This is forward-only on purpose: the file
|
|
; stream holds one block and never asks the whole document to fit in memory.
|
|
;
|
|
; Written by ChatGPT for Anachronaut's SplitBit
|
|
|
|
#Include services.asm
|
|
#Program
|
|
#Base 0x4000
|
|
|
|
start:
|
|
SETD.0 Name
|
|
INIB 0d29
|
|
SWI osArgument
|
|
SETD.0 Name
|
|
LDA.0
|
|
BRA noName
|
|
CALL fileStreamOpen
|
|
BNQ openFailed
|
|
CALL fullPage
|
|
|
|
nextBlock:
|
|
CALL fileStreamNext
|
|
BNQ readFailed
|
|
PSHD.3
|
|
POPB
|
|
POPA
|
|
SETD.2 Remaining
|
|
STA.2
|
|
INCD.2
|
|
STB.2
|
|
OR
|
|
BRQ finished
|
|
SETD.1 FileStreamBlock
|
|
SETD.2 Remaining
|
|
|
|
printLoop:
|
|
LDA.1
|
|
OUTA 0x00
|
|
INIB 0x0A
|
|
XOR
|
|
BNQ bytePrinted
|
|
SETD.3 LinesLeft
|
|
LDA.3
|
|
DECA
|
|
STA.3
|
|
BNA bytePrinted
|
|
CALL pause
|
|
BNQ finished
|
|
bytePrinted:
|
|
INCD.1
|
|
CALL fileStreamTakeRemaining
|
|
BRQ nextBlock
|
|
BRI printLoop
|
|
|
|
; Ask for one key without asking for Return. The console is put back immediately,
|
|
; including on q and end of redirected input.
|
|
pause:
|
|
SETD.0 MorePrompt
|
|
SWI osPrintString
|
|
INIA 0x01
|
|
OUTA 0x02
|
|
INA 0x00
|
|
PSHA ; Keep the key while A is used to restore line mode.
|
|
RSTA
|
|
OUTA 0x02
|
|
POPA
|
|
SETD.0 ClearPrompt
|
|
SWI osPrintString
|
|
|
|
INIB 0x71 ; q
|
|
XOR
|
|
BRQ pauseQuit
|
|
INIB 0xFF ; end of redirected input
|
|
XOR
|
|
BRQ pauseQuit
|
|
INIB 0x0A ; Return: one more line.
|
|
XOR
|
|
BRQ oneLine
|
|
INIB 0x20 ; Space: one more screen.
|
|
XOR
|
|
BNQ pause ; Ignore every other key.
|
|
CALL fullPage
|
|
RSTA
|
|
RSTB
|
|
OR
|
|
RET
|
|
oneLine:
|
|
SETD.3 LinesLeft
|
|
INIA 0x01
|
|
STA.3
|
|
RSTA
|
|
RSTB
|
|
OR
|
|
RET
|
|
pauseQuit:
|
|
RSTA
|
|
INIB 0x01
|
|
OR
|
|
RET
|
|
fullPage:
|
|
SETD.3 LinesLeft
|
|
INIA 0d22
|
|
STA.3
|
|
RET
|
|
|
|
noName:
|
|
SETD.0 Usage
|
|
SWI osPrintString
|
|
SWI osExit
|
|
openFailed:
|
|
SETD.0 OpenError
|
|
SWI osPrintString
|
|
BRI printError
|
|
readFailed:
|
|
SETD.0 ReadError
|
|
SWI osPrintString
|
|
printError:
|
|
RSTA
|
|
MVQB
|
|
SWI osPrintNumber
|
|
SETD.0 NewLine
|
|
SWI osPrintString
|
|
finished:
|
|
SWI osExit
|
|
|
|
#Data
|
|
#Base 0x2000
|
|
Usage:
|
|
"more: give me a file name
|
|
"
|
|
OpenError:
|
|
"more: cannot find the file, error "
|
|
ReadError:
|
|
"more: cannot read the file, error "
|
|
NewLine:
|
|
0x0A 0x00
|
|
MorePrompt:
|
|
"-- more --"
|
|
ClearPrompt:
|
|
0x0A 0x00
|
|
Name:
|
|
#Reserve 0d29
|
|
Remaining:
|
|
0x00 0x00
|
|
LinesLeft:
|
|
0x00
|
|
|
|
#Include fileStream.asm
|