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
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 0x2000
|
|
|
|
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 0x1000
|
|
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
|