Merge pull request #193 from jgharston/main

Patched FORTH, rewrote BUILD, some tweeks
This commit is contained in:
Bobbi Webber-Manners 2022-11-07 12:18:17 -05:00 committed by GitHub
commit 2d29a0de62
6 changed files with 210 additions and 216 deletions

BIN
ROMs/FORTH103.ROM Normal file

Binary file not shown.

View File

@ -1,5 +1,5 @@
* AUXMEM.BYTWRD.S
* (c) Bobbi 2021 GPLv3
* (c) Bobbi 2021,2022 GPLv3
*
* Applecorn OSBYTE and OSWORD handlers
*
@ -266,8 +266,8 @@ WORD00 IF MAXLEN-OSTEXT-2
BPL :WORD00LP3 ; 4 = MAXCHAR
INY ; Initial line length = zero
FIN
CLI ; Set IRQs going again
STY FXLINES ; Reset line counter
CLI ; Ensure IRQs are on
BEQ :WORD00LP ; Enter main loop
:WORD00BELL LDA #$07 ; $07=BELL
@ -328,24 +328,24 @@ WORD00 IF MAXLEN-OSTEXT-2
************************************
* On entry, (OSCTRL)=>control block
* Y=0
* IRQs are disabled while we access the timers
* IRQs are disabled while we access the timers and main memory
WORD01 STA RDMAINRAM ; Read from main memory
WORD01 STA RDMAINRAM ; Read from main mem (IRQs are off)
:WORD01LP LDA SYSCLOCK,Y ; Read sys clock in main mem
STA (OSCTRL),Y ; Store in buffer
STA (OSCTRL),Y ; Store in buffer in aux mem
INY
CPY #$05
BCC :WORD01LP
STA RDCARDRAM ; Read from aux memory
STA RDCARDRAM ; Reads back to aux memory
RTS
WORD02 >>> WRTMAIN
:WORD02LP LDA (OSCTRL),Y ; Read from buffer
WORD02 STA WRMAINRAM ; Write to main mem (IRQs are off)
:WORD02LP LDA (OSCTRL),Y ; Read from buffer in aux mem
STA SYSCLOCK,Y ; Store to sys clock in main mem
INY
CPY #$05
BCC :WORD02LP
>>> WRTAUX
STA WRCARDRAM ; Writes back to aux memory
RTS
WORD03
@ -359,35 +359,46 @@ WORD04 RTS ; Dummy, do nothing
* Y=0, A=(OSCTRL)
* IRQs are disabled, so we don't have to preserve IRQ state
*
WORD05 JSR GETADDR ; Point to address, set Y=>data
BNE WORD05A
JSR WORD05IO
LDY #$04
STA (OSCTRL),Y ; Store it
WORD05RET RTS
WORD05IO LDA OSINTWS+0 ; X CORRUPTED BY XF2MAIN
LDY OSINTWS+1
WORD05IO1 >>> XF2MAIN,MAINRDMEM
* <8000xxxx language memory
* ????xxxx main memory RAM paged in via STA RDMAINRAM
* ????xxxx main memory ROM paged in via XFER
STA RDMAINRAM ; Switch to main memory
WORD05A LDA (OSINTWS) ; Get byte
STA RDCARDRAM ; Back to aux memory
* <8000xxxx language memory - aux memory
* FFxxxxxx I/O memory - aux memory
* A0xxxxxx use this to specify 'A'pple main memory
*
WORD05 JSR GETADDR ; Point to address, set Y=>data byte
BEQ WORD5A ; Skip to read from main memory
LDA (OSINTWS) ; Get byte
STA (OSCTRL),Y ; Store it
RTS
WORD06 JSR GETADDR ; Point to address, set Y=>data
* We want to read from anywhere in main memory. We can't just set
* 'all reads from main' as we'd page out our own code. We need to call
* mainmem and read from there.
WORD5A JSR WORD05IO ; Call as a subroutine to return here
STA (OSCTRL),Y ; Store it
RTS
WORD05IO LDA OSINTWS+0 ; X CORRUPTED BY XF2MAIN
LDY OSINTWS+1 ; &YYAA=address to read
WORD05IO1 >>> XF2MAIN,MAINRDMEM
WORD06 JSR GETADDR ; Point to address, set Y=>data byte
PHP
LDA (OSCTRL),Y ; Get byte
LDA (OSCTRL),Y ; Get byte from our memory
PLP
BNE WORD06A
STA WRMAINRAM ; Switch to main memory
WORD06A STA (OSINTWS) ; Store it
STA WRCARDRAM ; Back to aux memory
BEQ WORD06A ; Skip to write to main memory
STA (OSINTWS) ; Store it
RTS
* We want to be able to write to anywhere in main memory.
* As we are within the OSWORD handler, IRQs are off, so we can just
* 'write through' all memory.
WORD06A STA $C008 ; &0000-&01FF writes to main memory
STA WRMAINRAM ; &0200-&BFFF writes to main memory
* ; &C000-&CFFF is always I/O
* ; &D000-&FFFF how do we write to this?
STA (OSINTWS) ; Store it
STA $C009 ; &0000-&01FF writes to aux memory
STA WRCARDRAM ; &0200-&BFFF writes to aux memory
* ; &D000-&FFFF
RTS
GETADDR STA OSINTWS+0 ; (OSINTWS)=>byte to read/write
@ -398,7 +409,7 @@ GETADDR STA OSINTWS+0 ; (OSINTWS)=>byte to read/write
INY
LDA (OSCTRL),Y ; Get address high byte
INY ; Point Y to data byte
CMP #$80 ; *TO DO* Needs an appropriate value
CMP #$A0 ; Let's use A0xxxxxx for 'A'pple memory
RTS

View File

@ -445,7 +445,7 @@ ESCPOLL9 BIT ESCFLAG ; Return with Escape state
RTS
* Process pending Escape state
BYTE7E STA KBDACK ; Flush keyboard
BYTE7E STA KBDACK ; Flush keyboard
LDX #$00 ; $7E = ack detection of ESC
BIT ESCFLAG
BPL BYTE7DOK ; No Escape pending

View File

@ -9,17 +9,13 @@
MAXROM EQU $F9 ; Max sideways ROM number
*
* $90-$9f are spare Econet space so safe to use
*
ZP1 EQU $90
ZP1 EQU $90 ; $90-$9f are spare Econet space
; so safe to use
ZP2 EQU $92
ZP3 EQU $94
TEMP32 EQU $96 ; $96-$99 inclusive
STRTBCKL EQU $9D ; *TO DO* No longer needed to preserve
STRTBCKH EQU $9E
*STRTBCKL EQU $9D ; *TO DO* No longer needed to preserve
*STRTBCKH EQU $9E
MOSSHIM
ORG AUXMOS ; MOS shim implementation
@ -111,7 +107,7 @@ MOSINIT SEI ; Ensure IRQs disabled
:S8 STA SET80VID ; 80 col on
STA CLRALTCHAR ; Alt charset off
STA PAGE2 ; PAGE2
* JMP MOSHIGH ; Ensure executing in high memory here
JMP MOSHIGH ; Ensure executing in high memory here
MOSHIGH SEI ; Ensure IRQs disabled
LDX #$FF
@ -169,11 +165,10 @@ BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
*********************************
* X=service call, Y=parameter
*
SERVICE TAX ; Enter here with A=Service Num
* SERVICE TAX ; Enter here with A=Service Num
BYTE8F
SERVICEX LDA $F4
SERVICEX LDA $F4 ; Enter here with X=Service Number
PHA ; Save current ROM
*DEBUG
LDA $E0
AND #$20 ; Test debug *OPT255,32
@ -182,7 +177,7 @@ SERVICEX LDA $F4
BEQ :SERVDONE ; If debug on, ignore SERV06
:SERVDEBUG
*DEBUG
TXA
TXA ; A=service number
LDX MAXROM ; Start at highest ROM
:SERVLP JSR ROMSELECT ; Bring it into memory
BIT $8006
@ -207,13 +202,13 @@ PRHELLO LDX #<HELLO
JSR OSPRSTR
JMP OSNEWL
BYTE00XX
* BYTE00XX
BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error
LDX #$0A ; Identify Host
RTS ; %000x1xxx host type, 'A'pple
BYTE00A BRK
DB $F7
HELLO ASC 'Applecorn MOS 2022-11-06'
HELLO ASC 'Applecorn MOS 2022-11-04'
DB $00 ; Unify MOS messages
* TO DO: Move into RAM
GSSPEED DB $00 ; $80 if GS is fast, $00 for slow

View File

@ -103,14 +103,14 @@ FORCENL LDA #$86
BEQ PRSTROK
JMP OSNEWL
* OSPR2HEX - Print XY in hex
****************************
* PR2HEX - Print XY in hex
**************************
OUT2HEX TYA
JSR OUTHEX
TXA ; Continue into OUTHEX
* OSPR1HEX - Print hex byte in A
********************************
* PR1HEX - Print hex byte in A
******************************
OUTHEX PHA
LSR
LSR
@ -139,38 +139,38 @@ PRNIB CMP #$0A
* X=>four byte zero page locations
* Y= number of digits to pad to, 0 for no padding
*
PRINTDEC STY OSPAD ; Number of padding+digits
LDY #0 ; Digit counter
PRDECDIGIT LDA #32 ; 32-bit divide
STA OSTEMP
LDA #0 ; Remainder=0
CLV ; V=0 means div result = 0
PRDECDIV10 CMP #10/2 ; Calculate OSNUM/10
BCC PRDEC10
SBC #10/2+$80 ; Remove digit & set V=1 to show div result > 0
SEC ; Shift 1 into div result
PRDEC10 ROL 0,X ; Shift /10 result into OSNUM
ROL 1,X
ROL 2,X
ROL 3,X
ROL A ; Shift bits of input into acc (input mod 10)
DEC OSTEMP
BNE PRDECDIV10 ; Continue 32-bit divide
ORA #48
PHA ; Push low digit 0-9 to print
INY
BVS PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit
LDA #32
PRDECLP1 CPY OSPAD
BCS PRDECLP2 ; Enough padding pushed
PHA ; Push leading space characters
INY
BNE PRDECLP1
PRDECLP2 PLA ; Pop character left to right
JSR OSWRCH ; Print it
DEY
BNE PRDECLP2
RTS
PRINTDEC sty OSPAD ; Number of padding+digits
ldy #0 ; Digit counter
PRDECDIGIT lda #32 ; 32-bit divide
sta OSTEMP
lda #0 ; Remainder=0
clv ; V=0 means div result = 0
PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10
bcc PRDEC10
sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0
sec ; Shift 1 into div result
PRDEC10 rol 0,x ; Shift /10 result into OSNUM
rol 1,x
rol 2,x
rol 3,x
rol a ; Shift bits of input into acc (input mod 10)
dec OSTEMP
bne PRDECDIV10 ; Continue 32-bit divide
ora #48
pha ; Push low digit 0-9 to print
iny
bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit
lda #32
PRDECLP1 cpy OSPAD
bcs PRDECLP2 ; Enough padding pushed
pha ; Push leading space characters
iny
bne PRDECLP1
PRDECLP2 pla ; Pop character left to right
jsr OSWRCH ; Print it
dey
bne PRDECLP2
rts
* GSINIT - Initialise for GSTRANS string parsing
@ -247,7 +247,7 @@ GSREADLP STA GSCHAR ; Update accumulator
BNE GSREAD2 ; No, check character
BIT GSFLAG
BPL GSREADEND ; We aren't waiting for a closing quote
* ; End of line before closing quote
* ; End of line before closing quote
ERRBADSTR BRK
DB $FD
ASC 'Bad string'
@ -258,7 +258,7 @@ GSREAD2 CMP #' '
BNE GSREAD3 ; Not a space, process it
BIT GSFLAG ; Can space terminate string?
BMI GSREADCHAR ; We're waiting for a terminating quote
* ; so return the space character
* ; so return the space character
BVC GSREADEND ; Space is a terminator, finish
GSREAD3 CMP #$22 ; Is it a quote?
BNE GSREADESC ; Not quote, check for escapes
@ -333,10 +333,11 @@ ROMSELECT
PHP
CPX ROMID ; Speed up by checking if
BEQ ROMSELOK ; already paged in
* BUG: This needs ROMID an invalid value on startup so first access works
PHA
PHX
PHY
* LDA $FF
* JSR PR1HEX
SEI
TXA ; A=ROM to select
>>> XF2MAIN,SELECTROM
@ -362,9 +363,6 @@ ROMINIT STZ MAXROM ; One sideways ROM only
STA MAXROM
:X2 LDA #$FF
STA ROMID ; Ensure set to invalid value
RTS
EVENT RTS
@ -400,15 +398,13 @@ IRQBRKHDLR PHA
LDA $0105,X
SBC #$00
STA FAULT+1
LDA $F4 ; Get current ROM
LDA ROMID ; Get current ROM
STA BYTEVARBASE+$BA ; Set ROM at last BRK
STX OSXREG ; Pass stack pointer
LDA #$06 ; Service Call 6 = BRK occured
JSR SERVICE
LDX #$06 ; Service Call 6 = BRK occured
JSR SERVICEX
LDX BYTEVARBASE+$FC ; Get current language
JSR ROMSELECT ; Bring it into memory
PLA
TAX
PLA
@ -443,8 +439,8 @@ PRERRLP LDA (FAULT),Y
JSR OSWRCH
INY
BNE PRERRLP
NULLRTS
PRERR1 RTS
PRERR1
NULLRTS RTS
* Default page 2 contents
@ -491,7 +487,7 @@ MOSAPI EQU $FF95
* OPTIONAL ENTRIES
* ----------------
OSSERV JMP SERVICE ; FF95 OSSERV
OSSERV JMP SERVICEX ; FF95 OSSERV
OSCOLD JMP NULLRTS ; FF98 OSCOLD
OSPRSTR JMP OUTSTR ; FF9B OSPRSTR
OSSCANDEC JMP SCANDEC ; FF9E SCANDEC

View File

@ -14,6 +14,7 @@
* Sorted command table, added *HELP FILE.
* Optimised CLILOOK dispatcher.
* 05-Nov-2022 Added ROM, TAPE, TV to command table -> OSBYTE calls.
* 06-Nov-2022 Rewrote *BUILD, avoids using code memory.
* COMMAND TABLE
@ -24,13 +25,17 @@
* b6=0 - Enter with XY=>parameters
* b6=1 - Enter with LPTR,Y=>parameters
*
* Ok, let's get around to sorting these
CMDTABLE
CMDFILE ASC 'CAT' ; Must be first command so matches '*.'
CMDTABLE ASC 'CAT' ; Must be first command so matches '*.'
DB $85
DW STARFSC-1 ; CAT -> FSC 5, XY=>params
ASC 'BASIC' ; Bodge to allow *B. priority over *BUILD
DB $FF
DW STARBASIC-1 ; BASIC -> (LPTR)=>params
CMDFILE ASC 'CAT'
DB $85
DW STARFSC-1 ; CAT -> FSC 5, XY=>params
ASC 'BUILD'
DB $81 ; TO DO
DB $80 ; $81 ; TO DO
DW CMDBUILD-1 ; BUILD -> XY=>params
ASC 'CDIR'
DB $88
@ -42,10 +47,10 @@ CMDFILE ASC 'CAT' ; Must be first command so matches '*.'
DB $86
DW STARFILE-1 ; DELETE -> OSFILE 06, CBLK=>filename
ASC 'DUMP'
DB $81 ; TO DO
DB $80 ; $81 ; TO DO
DW CMDDUMP-1 ; DUMP -> XY=>params
ASC 'EXEC'
DB $81 ; TO DO
DB $80 ; $81 ; TO DO
DW CMDEXEC-1 ; EXEC -> XY=>params
ASC 'EX'
DB $89
@ -72,10 +77,10 @@ CMDFILE ASC 'CAT' ; Must be first command so matches '*.'
DB $81
DW STARSAVE-1 ; SAVE -> OSFILE 00, CBLK=>filename
ASC 'SPOOL'
DB $81 ; TO DO
DB $80 ; $81 ; TO DO
DW CMDSPOOL-1 ; SPOOL -> XY=>params
ASC 'TYPE'
DB $81 ; TO DO
DB $80 ; $81 ; TO DO
DW CMDTYPE-1 ; TYPE -> XY=>params
* Split between HELP lists
DB $00
@ -93,7 +98,7 @@ CMDMOS ASC 'BASIC'
DB $FF
DW CMDFAST-1 ; FAST -> (LPTR)=>params
ASC 'HELP'
DB $81
DB $80
DW STARHELP-1 ; HELP -> XY=>params
ASC 'KEY'
DB $FF
@ -120,13 +125,13 @@ CMDMOS ASC 'BASIC'
* *HELP TABLE
*************
HLPTABLE ASC 'MOS'
DB $80
DB $FF
DW HELPMOS-1 ; *HELP MOS
ASC 'FILE'
DB $80
DB $FF
DW HELPFILE-1 ; *HELP FILE
ASC 'HOSTFS'
DB $80
DB $FF
DW HELPHOSTFS-1 ; *HELP HOSTFS
DB $FF
@ -193,12 +198,12 @@ CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters
PHX ; SP->high
PHA ; SP->low, high
PHP ; SP->flg, low, high
* BIT OSTEMP
* BVS CLICALL
LDA OSTEMP
ASL A ; Move bit 6 into bit 7
BMI CLICALL ; If b6=1 don't convert LPTR
BEQ CLICALL ; *TEMP* If $80, skip - remove when HOSTFS updated
BIT OSTEMP ; Test command parameter
BVS CLICALL ; If b6=1 don't convert LPTR
; LDA OSTEMP
; ASL A ; Move bit 6 into bit 7
; BMI CLICALL ; If b6=1 don't convert LPTR
; BEQ CLICALL ; *TEMP* If $80, skip - remove when HOSTFS updated
*
JSR LPTRtoXY ; XY=>parameters
CLICALL LDA OSTEMP ; A=command parameter
@ -213,6 +218,7 @@ CLISTEP2 LDA (OSTEXT,X) ; Get next byte
* OSCLI HANDLER
***************
* On entry, XY=>command string
* On exit, AXY corrupted or error generated
*
@ -246,8 +252,8 @@ CLISLASH JSR SKIPSPC1
LDA #$02
BNE STARFSC2 ; FSC 2 = */filename
*
CLIUNKNOWN LDA #$04
JSR SERVICE ; Offer to sideways ROM(s)
CLIUNKNOWN LDX #$04
JSR SERVICEX ; Offer to sideways ROM(s)
BEQ CLIDONE ; Claimed
LDA #$03 ; FSC 3 = unknown command
STARFSC2 PHA
@ -303,9 +309,15 @@ STARBYTE2 LDY OSYREG
* Line scanning
* -------------
* Scan decimal number
SCANDEC JSR SKIPSPC
*********************
* On entry, (OSLPTR),Y=>first character
* On exit, A =8-bit decimal value
* X =preserved
* (OSLPTR),Y=>skipped spaces after number
*
SCANDEC
* JSR SKIPSPC
JSR SCANDIGIT ; Check first digit
BCS ERRBADNUM ; Doesn't start with a digit
SCANDECLP STA OSTEMP ; Store as current number
@ -325,7 +337,8 @@ SCANDECLP STA OSTEMP ; Store as current number
BCC SCANDECLP
BCS ERRBADNUM ; Overflowed
SCANDECOK LDA OSTEMP ; Return A=number
SCANDECOK JSR SKIPSPC ; Ensure trailing spaces skipped
LDA OSTEMP ; Return A=number
SCANDIG2 SEC
RTS
@ -351,8 +364,15 @@ HEXDIGIT JSR SCANDIGIT
HEXDIGIT2 RTS
* Scan hex address
* (OSLPTR),Y=>first character
* $200,X = 4-byte accumulator
******************
* On entry, (OSLPTR),Y=>first character
* $0200,X = 4-byte accumulator
* On exit, $0200,X = 4-byte accumulator
* (OSLPTR),Y=>skipped spaces after number
* X =preserved
* A =next character
* EQ =end of line, no more parameters
*
SCANHEX JSR HEXDIGIT ; Get first digit
BCS ERRBADADD1 ; Not a hex character
STA $200,X ; Store first digit
@ -438,7 +458,7 @@ STARHELP JSR XYtoLPTR ; Update OSLPTR=>parameters
JSR PRHELLO ; Unify version message
LDX #<HLPTABLE ; XY=>command table
LDY #>HLPTABLE
JSR CLILOOKUP ; Look for *HELP subject
JSR CLILOOKUP ; Look for *HELP subject at OSLPTR
BEQ STARHELP9 ; Matched
LDA $8006 ; Does ROM have service entry?
BMI STARHELP6 ; Yes, skip to send service call
@ -448,8 +468,8 @@ STARHELP JSR XYtoLPTR ; Update OSLPTR=>parameters
JSR OSPRSTR
JSR OSNEWL
STARHELP6 LDY #0 ; (OSLPTR),Y=>parameters
LDA #9
JMP SERVICE ; Pass to sideways ROM(s)
LDX #9
JMP SERVICEX ; Pass to sideways ROM(s)
* Print *HELP text
HELPHOSTFS LDX #<FSCCOMMAND ; *HELP HOSTFS
@ -624,8 +644,8 @@ ERRDUMP BRK
ASC 'Syntax: DUMP <afsp>'
BRK
* Handle *DUMP command
* --------------------
* *DUMP <afsp>
* ------------
* XY=>parameters string, EQ=no parameters
*
CMDDUMP BEQ ERRDUMP ; No filename
@ -696,7 +716,64 @@ CMDDUMP BEQ ERRDUMP ; No filename
BCC :LOOP1
JMP TYPCLOSE ; Close and finish
* *SPOOL (<afsp>)
* *BUILD <fsp>
* ------------
* XY=>parameters string, EQ=no parameters
*
BUILDLINE EQU $0700
ERRBUILD BRK
DB $DC
ASC 'Syntax: BUILD <fsp>'
BRK
BUILDBUF DW BUILDLINE ; Control block to read a line
DB $80 ; 128 characters max
DB 32 ; Min char
DB 126 ; Max char
CMDBUILD BEQ ERRBUILD ; No filename
LDA #$80 ; A=OPENOUT, for writing
JSR OPENAFILE ; Try to open file
PHA
LDA #0 ; Line number
PHA
PHA
:BUILDLP1 PLA ; Get line number
PLY
CLC
SED ; Use BCD arithmetic
ADC #$01 ; Add one to line number
BCC :BUILD2
INY
:BUILD2 CLD
PHY
PHA
TAX
JSR PR2HEX ; Print line number
JSR PRSPACE ; Followed by a space
LDX #<BUILDBUF ; XY -> control block
LDY #>BUILDBUF
LDA #$00
JSR OSWORD ; OSWORD &00 input line
BCS :BUILDDONE
TSX
LDY $103,X ; Get handle
LDX #$00
:BUILDLP2 LDA BUILDLINE,X ; Get char from line
JSR OSBPUT ; Write it to the file
INX
CMP #$0D
BNE :BUILDLP2 ; Loop until terminating CR
BEQ :BUILDLP1 ; Go for another line
:BUILDDONE LDA #$7C
JSR OSBYTE ; Clear Escape state
PLA ; Drop line number
PLA
PLY ; Get handle
LDA #$00
JSR OSFIND ; Close the file
JMP OSNEWL ; Print newline and exit
* *SPOOL (<fsp>)
* ---------------
* XY=>parameters string, EQ=no parameters
*
@ -741,91 +818,6 @@ OPENAFILE JSR OSFIND ; Try to open file
EXECNOTFND JMP ERRNOTFND ; File not found
* *BUILD (<afsp>)
* ---------------
* XY=>parameters string
*
CMDBUILD LDA #$80 ; A=OPENOUT, for writing
JSR OPENAFILE ; Try to open file
STA :FILENUM ; Stash file number
JSR LNCTRRESET ; Reset line counter
:RDLINE JSR LNCTRINCR ; Increment line counter
JSR LNCTRPRT ; Print line counter
LDA #<:LINEBUF ; Pointer to line buffer
STA OSTEXT+0
LDA #>:LINEBUF
STA OSTEXT+1
LDA #80 ; Maximum line length
STA MAXLEN
LDA #32 ; Minimum allowable char
STA MINCHAR
LDA #126 ; Maximum allowable char
STA MAXCHAR
LDA #$00 ; OSWORD &00 input line from console
LDX #<OSTEXT ; XY -> control block
LDY #>OSTEXT
JSR OSWORD ; Read line from console
PHP
LDA #$0D ; Carriage return
STA :LINEBUF,Y ; Force carriage return
INY ; Include the carriage return
STY :LINELEN ; Number of chars read
LDX #$00
:L1 CPX :LINELEN
BEQ :S1
LDA :LINEBUF,X
LDY :FILENUM ; Recover file number
JSR OSBPUT ; Write char to file
INX
BRA :L1
:S1 PLP
BCS :CLOSE ; Escape pressed
BRA :RDLINE
:CLOSE JSR OSNEWL
LDA #$00 ; A=CLOSE
LDY :FILENUM ; Recover file number
JSR OSFIND ; Close build file
STZ ESCFLAG
RTS
:LINEBUF DS 81 ; 80 char line plus CR
:LINELEN DB $00 ; Line length excluding CR
:FILENUM DB $00 ; File handle
* Reset line counter
* Helper function used for *BUILD and *LIST line counter
LNCTRRESET STZ LINENUM+0 ; Zero line counter
STZ LINENUM+1
STZ TEMP32+0 ; Zero buffer used by PRINTDEC
STZ TEMP32+1
STZ TEMP32+2
STZ TEMP32+3
RTS
* Increment line counter
* Helper function used for *BUILD and *LIST line counter
LNCTRINCR INC LINENUM+0 ; Increment line counter
BNE :DONE
INC LINENUM+1
:DONE RTS
* Print line counter
* Helper function used for *BUILD and *LIST line counter
LNCTRPRT LDA LINENUM+0 ; Print line number
STA TEMP32+0
LDA LINENUM+1
STA TEMP32+1
LDX #TEMP32
LDY #$04 ; Pad to length 4
JSR PRINTDEC
LDA #' ' ; Print space
JSR OSWRCH
RTS
LINENUM DW $00 ; Line number
* ZIP SPEED COMMANDS
* ==================