From d56f5d65ab492387b9df8e5a6a4973e880b64bad Mon Sep 17 00:00:00 2001 From: Greg King Date: Tue, 24 Dec 2013 05:18:04 -0500 Subject: [PATCH 1/3] Added a simplistic read() that gives a stdin console on the Atmos. --- asminc/atmos.inc | 1 + libsrc/atmos/read.s | 70 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 libsrc/atmos/read.s diff --git a/asminc/atmos.inc b/asminc/atmos.inc index 6534a2ef0..4c3c442fa 100644 --- a/asminc/atmos.inc +++ b/asminc/atmos.inc @@ -90,6 +90,7 @@ SCREEN := $BB80 ; --------------------------------------------------------------------------- ; ROM entries +GETLINE := $C592 TEXT := $EC21 HIRES := $EC33 CURSET := $F0C8 diff --git a/libsrc/atmos/read.s b/libsrc/atmos/read.s new file mode 100644 index 000000000..e6e1f7eee --- /dev/null +++ b/libsrc/atmos/read.s @@ -0,0 +1,70 @@ +; +; 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 + + .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 + +.data + +text_count: + .byte <-1 + From 0dc8a278c7d8656ab222a24610c884d3dcd9dc03 Mon Sep 17 00:00:00 2001 From: Greg King Date: Tue, 24 Dec 2013 13:56:19 -0500 Subject: [PATCH 2/3] Moved the command-line arguments out of BASIC's input buffer. The stdin console re-uses that buffer. --- libsrc/atmos/mainargs.s | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/libsrc/atmos/mainargs.s b/libsrc/atmos/mainargs.s index 42a94da51..639b1304a 100644 --- a/libsrc/atmos/mainargs.s +++ b/libsrc/atmos/mainargs.s @@ -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 #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 sta __argv stx __argv + 1 - rts .endproc @@ -115,7 +126,8 @@ done: lda # Date: Tue, 24 Dec 2013 15:26:05 -0500 Subject: [PATCH 3/3] Reset the stdin console when a program starts. --- libsrc/atmos/read.s | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/libsrc/atmos/read.s b/libsrc/atmos/read.s index e6e1f7eee..443808fa8 100644 --- a/libsrc/atmos/read.s +++ b/libsrc/atmos/read.s @@ -7,6 +7,7 @@ ; .export _read + .constructor initstdin .import popax .importzp ptr1, ptr2, ptr3 @@ -63,8 +64,22 @@ L9: lda ptr3 .endproc -.data + +;-------------------------------------------------------------------------- +; initstdin: Reset the stdin console. + +.segment "INIT" + +initstdin: + ldx #<-1 + stx text_count + rts + + +;-------------------------------------------------------------------------- + +.bss text_count: - .byte <-1 + .res 1