mirror of
https://github.com/cc65/cc65.git
synced 2024-12-25 17:29:50 +00:00
Merge pull request #68 from greg-king5/line
Add a stdin console to the Atmos target.
This commit is contained in:
commit
dda8abeab9
@ -90,6 +90,7 @@ SCREEN := $BB80
|
||||
; ---------------------------------------------------------------------------
|
||||
; ROM entries
|
||||
|
||||
GETLINE := $C592
|
||||
TEXT := $EC21
|
||||
HIRES := $EC33
|
||||
CURSET := $F0C8
|
||||
|
@ -1,7 +1,7 @@
|
||||
;
|
||||
; 2003-03-07, Ullrich von Bassewitz
|
||||
; 2011-01-28, Stefan Haubenthal
|
||||
; 2013-07-15, Greg King
|
||||
; 2013-12-22, Greg King
|
||||
;
|
||||
; Setup arguments for main
|
||||
;
|
||||
@ -40,11 +40,21 @@ L0: lda CFOUND_NAME,y
|
||||
;
|
||||
ldx #0
|
||||
L2: lda BASIC_BUF,x
|
||||
beq done ; no "rem," no args.
|
||||
beq done ; no "rem", no args.
|
||||
inx
|
||||
cmp #REM
|
||||
bne L2
|
||||
ldy #1 * 2
|
||||
|
||||
; The arguments must be copied to a safe place because BASIC's input buffer
|
||||
; might be re-used by the stdin console.
|
||||
|
||||
ldy #(SCREEN_XSIZE * 2 - 1) - 1
|
||||
L3: lda BASIC_BUF,y
|
||||
sta args,y
|
||||
dey
|
||||
bpl L3
|
||||
|
||||
ldy #1 * 2 ; Point to second argv slot
|
||||
|
||||
; Find the next argument
|
||||
|
||||
@ -65,12 +75,14 @@ found: cmp #'"' ; Is the argument quoted?
|
||||
lda #' ' ; A space ends the argument
|
||||
setterm:sta term ; Set end of argument marker
|
||||
|
||||
; Now store a pointer to the argument into the next slot. Since the BASIC
|
||||
; input buffer is located at the zero page, no calculations are necessary.
|
||||
; Now, store a pointer, to the argument, into the next slot.
|
||||
|
||||
txa ; Get low byte
|
||||
add #<BASIC_BUF ; Not at page boundary
|
||||
add #<args
|
||||
sta argv,y ; argv[y]= &arg
|
||||
lda #>0
|
||||
adc #>args
|
||||
sta argv+1,y
|
||||
iny
|
||||
iny
|
||||
inc __argc ; Found another arg
|
||||
@ -88,7 +100,7 @@ argloop:lda BASIC_BUF,x
|
||||
; replace the terminating character by a zero.
|
||||
|
||||
lda #0
|
||||
sta BASIC_BUF-1,x
|
||||
sta args-1,x
|
||||
|
||||
; Check if the maximum number of command line arguments is reached. If not,
|
||||
; parse the next one.
|
||||
@ -103,7 +115,6 @@ done: lda #<argv
|
||||
ldx #>argv
|
||||
sta __argv
|
||||
stx __argv + 1
|
||||
|
||||
rts
|
||||
|
||||
.endproc
|
||||
@ -115,7 +126,8 @@ done: lda #<argv
|
||||
.bss
|
||||
term: .res 1
|
||||
name: .res FNAME_LEN + 1
|
||||
args: .res SCREEN_XSIZE * 2 - 1
|
||||
|
||||
.data
|
||||
argv: .addr name
|
||||
.res MAXARGS * 2
|
||||
.res MAXARGS * 2, 0
|
||||
|
85
libsrc/atmos/read.s
Normal file
85
libsrc/atmos/read.s
Normal file
@ -0,0 +1,85 @@
|
||||
;
|
||||
; 2013-12-24, Greg King
|
||||
;
|
||||
; int read (int fd, void* buf, unsigned count);
|
||||
;
|
||||
; This function is a hack! It lets us get text from the stdin console.
|
||||
;
|
||||
|
||||
.export _read
|
||||
.constructor initstdin
|
||||
|
||||
.import popax
|
||||
.importzp ptr1, ptr2, ptr3
|
||||
|
||||
.macpack generic
|
||||
.include "atmos.inc"
|
||||
|
||||
.proc _read
|
||||
|
||||
sta ptr3
|
||||
stx ptr3+1 ; save count as result
|
||||
eor #$FF
|
||||
sta ptr2
|
||||
txa
|
||||
eor #$FF
|
||||
sta ptr2+1 ; Remember -count-1
|
||||
|
||||
jsr popax ; get buf
|
||||
sta ptr1
|
||||
stx ptr1+1
|
||||
jsr popax ; get fd and discard
|
||||
|
||||
L1: inc ptr2
|
||||
bnz L2
|
||||
inc ptr2+1
|
||||
bze L9 ; no more room in buf
|
||||
|
||||
; If there are no more characters in BASIC's input buffer, then get a line from
|
||||
; the console into that buffer.
|
||||
|
||||
L2: ldx text_count
|
||||
bpl L3
|
||||
jsr GETLINE
|
||||
ldx #<(0 - 1)
|
||||
|
||||
L3: inx
|
||||
lda BASIC_BUF,x
|
||||
bnz L4 ; (zero-terminated buffer)
|
||||
ldx #<-1
|
||||
lda #$0A ; return newline char. at end of line
|
||||
L4: stx text_count
|
||||
ldy #0
|
||||
sta (ptr1),y
|
||||
inc ptr1
|
||||
bnz L1
|
||||
inc ptr1+1
|
||||
bnz L1 ; branch always
|
||||
|
||||
; No error, return count.
|
||||
|
||||
L9: lda ptr3
|
||||
ldx ptr3+1
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
;--------------------------------------------------------------------------
|
||||
; initstdin: Reset the stdin console.
|
||||
|
||||
.segment "INIT"
|
||||
|
||||
initstdin:
|
||||
ldx #<-1
|
||||
stx text_count
|
||||
rts
|
||||
|
||||
|
||||
;--------------------------------------------------------------------------
|
||||
|
||||
.bss
|
||||
|
||||
text_count:
|
||||
.res 1
|
||||
|
Loading…
Reference in New Issue
Block a user