.segment "CODE" ; ---------------------------------------------------------------------------- ; INPUT CONVERSION ERROR: ILLEGAL CHARACTER ; IN NUMERIC FIELD. MUST DISTINGUISH ; BETWEEN INPUT, READ, AND GET ; ---------------------------------------------------------------------------- INPUTERR: lda INPUTFLG beq RESPERR ; INPUT ; without this, it treats GET errors ; like READ errors bmi L2A63 ; READ ldy #$FF ; GET bne L2A67 L2A63: lda Z8C ldy Z8C+1 L2A67: sta CURLIN sty CURLIN+1 SYNERR4: jmp SYNERR RESPERR: lda CURDVC beq LCA8F ldx #ERR_BADDATA jmp ERROR LCA8F: lda #ERRREENTRY jsr STROUT lda OLDTEXT ldy OLDTEXT+1 sta TXTPTR sty TXTPTR+1 RTS20: rts ; ---------------------------------------------------------------------------- ; "GET" STATEMENT ; ---------------------------------------------------------------------------- GET: jsr ERRDIR ; CBM: if GET#, then switch input cmp #'#' bne LCAB6 jsr CHRGET jsr GETBYT lda #',' jsr SYNCHR jsr CHKIN stx CURDVC LCAB6: ldx #<(INPUTBUFFER+1) ldy #>(INPUTBUFFER+1) lda #$00 sta INPUTBUFFER+1 lda #$40 jsr PROCESS_INPUT_LIST ; CBM: if GET#, then switch input back ldx CURDVC bne LCAD8 rts ; ---------------------------------------------------------------------------- ; "INPUT#" STATEMENT ; ---------------------------------------------------------------------------- INPUTH: jsr GETBYT lda #$2C jsr SYNCHR jsr CHKIN stx CURDVC jsr L2A9E LCAD6: lda CURDVC LCAD8: jsr CLRCH ldx #$00 stx CURDVC rts LCAE0: ; ---------------------------------------------------------------------------- ; "INPUT" STATEMENT ; ---------------------------------------------------------------------------- INPUT: lsr Z14 cmp #$22 bne L2A9E jsr STRTXT lda #$3B jsr SYNCHR jsr STRPRT L2A9E: jsr ERRDIR lda #$2C sta INPUTBUFFER-1 LCAF8: jsr NXIN lda CURDVC beq LCB0C lda IO_FILE_STATUS and #FILE_STATUS_EOF beq LCB0C jsr LCAD6 jmp DATA LCB0C: lda INPUTBUFFER bne L2ABE lda CURDVC bne LCAF8 clc jmp CONTROL_C_TYPED NXIN: lda CURDVC bne LCB21 jsr OUTQUES ; '?' jsr OUTSP LCB21: jmp INLIN ; ---------------------------------------------------------------------------- ; "READ" STATEMENT ; ---------------------------------------------------------------------------- READ: ldx DATPTR ldy DATPTR+1 ; AppleSoft II, too lda #$98 ; READ .byte $2C L2ABE: lda #$00 ; INPUT ; ---------------------------------------------------------------------------- ; PROCESS INPUT LIST ; ; (Y,X) IS ADDRESS OF INPUT DATA STRING ; (A) = VALUE FOR INPUTFLG: $00 FOR INPUT ; $40 FOR GET ; $98 FOR READ ; ---------------------------------------------------------------------------- PROCESS_INPUT_LIST: sta INPUTFLG stx INPTR sty INPTR+1 PROCESS_INPUT_ITEM: jsr PTRGET sta FORPNT sty FORPNT+1 lda TXTPTR ldy TXTPTR+1 sta TXPSV sty TXPSV+1 ldx INPTR ldy INPTR+1 stx TXTPTR sty TXTPTR+1 jsr CHRGOT bne INSTART bit INPUTFLG bvc L2AF0 jsr MONRDKEY sta INPUTBUFFER ; BUG: The beq/bne L2AF8 below is supposed ; to be always taken. For this to happen, ; the last load must be a 0 for beq ; and != 0 for bne. The original Microsoft ; code had ldx/ldy/bne here, which was only ; correct for a non-ZP INPUTBUFFER. Commodore ; fixed it in CBMBASIC V1 by swapping the ; ldx and the ldy. It was broken on KIM, ; but okay on APPLE and CBM2, because ; these used a non-ZP INPUTBUFFER. ; Microsoft fixed this somewhere after KIM ; and before MICROTAN, by using beq instead ; of bne in the ZP case. ldx #<(INPUTBUFFER-1) ldy #>(INPUTBUFFER-1) bne L2AF8 ; always L2AF0: bmi FINDATA lda CURDVC bne LCB64 jsr OUTQUES LCB64: jsr NXIN L2AF8: stx TXTPTR sty TXTPTR+1 ; ---------------------------------------------------------------------------- INSTART: jsr CHRGET bit VALTYP bpl L2B34 bit INPUTFLG bvc L2B10 inx stx TXTPTR lda #$00 sta CHARAC beq L2B1C L2B10: sta CHARAC cmp #$22 beq L2B1D lda #$3A sta CHARAC lda #$2C L2B1C: clc L2B1D: sta ENDCHR lda TXTPTR ldy TXTPTR+1 adc #$00 bcc L2B28 iny L2B28: jsr STRLT2 jsr POINT jsr PUTSTR jmp INPUT_MORE ; ---------------------------------------------------------------------------- L2B34: jsr FIN lda VALTYP+1 jsr LET2 ; ---------------------------------------------------------------------------- INPUT_MORE: jsr CHRGOT beq L2B48 cmp #$2C beq L2B48 jmp INPUTERR L2B48: lda TXTPTR ldy TXTPTR+1 sta INPTR sty INPTR+1 lda TXPSV ldy TXPSV+1 sta TXTPTR sty TXTPTR+1 jsr CHRGOT beq INPDONE jsr CHKCOM jmp PROCESS_INPUT_ITEM ; ---------------------------------------------------------------------------- FINDATA: jsr DATAN iny tax bne L2B7C ldx #ERR_NODATA iny lda (TXTPTR),y beq GERR iny lda (TXTPTR),y sta Z8C iny lda (TXTPTR),y iny sta Z8C+1 L2B7C: lda (TXTPTR),y tax jsr ADDON cpx #$83 bne FINDATA jmp INSTART ; ---NO MORE INPUT REQUESTED------ INPDONE: lda INPTR ldy INPTR+1 ldx INPUTFLG bpl L2B94; INPUT or GET jmp SETDA L2B94: ldy #$00 lda (INPTR),y beq L2BA1 lda CURDVC bne L2BA1 lda #ERREXTRA jmp STROUT L2BA1: rts ; ---------------------------------------------------------------------------- ERREXTRA: .byte "?EXTRA IGNORED" .byte $0D,$0A,$00 ERRREENTRY: .byte "?REDO FROM START" .byte $0D,$0A,$00