msbasic/msbasic.s

1903 lines
35 KiB
ArmAsm
Raw Normal View History

2008-10-09 07:24:49 +00:00
; Microsoft BASIC for 6502
2008-10-06 05:21:05 +00:00
2008-10-12 03:33:45 +00:00
.debuginfo +
2008-10-12 19:50:23 +00:00
.if .def(cbmbasic1)
2008-10-12 03:33:45 +00:00
CBM1 := 1
2008-10-12 20:17:43 +00:00
.include "defines_cbm.s"
2008-10-12 19:50:23 +00:00
.elseif .def(osi)
2008-10-12 03:33:45 +00:00
OSI := 1
2008-10-12 20:17:43 +00:00
.include "defines_osi.s"
2008-10-12 19:50:23 +00:00
.elseif .def(applesoft)
2008-10-12 03:33:45 +00:00
APPLE := 1
2008-10-12 20:17:43 +00:00
.include "defines_apple.s"
2008-10-12 19:50:23 +00:00
.elseif .def(kb9)
2008-10-12 03:33:45 +00:00
KIM := 1
2008-10-12 20:17:43 +00:00
.include "defines_kim.s"
2008-10-12 19:50:23 +00:00
.elseif .def(cbmbasic2)
2008-10-12 03:33:45 +00:00
CBM2 := 1
2008-10-12 20:17:43 +00:00
.include "defines_cbm.s"
2008-10-12 19:50:23 +00:00
.elseif .def(kbdbasic)
2008-10-12 03:33:45 +00:00
KBD := 1
2008-10-12 20:17:43 +00:00
.include "defines_kbd.s"
2008-10-12 01:32:09 +00:00
.endif
2008-10-12 19:54:16 +00:00
.ifdef CONFIG_SMALL
BYTES_FP := 4
.else
BYTES_FP := 5
2008-10-12 20:17:43 +00:00
.endif
2008-10-12 19:54:16 +00:00
2008-10-12 20:17:43 +00:00
.ifdef APPLE
BYTES_PER_ELEMENT := 6 ; ???
.else
BYTES_PER_ELEMENT := BYTES_FP
2008-10-12 19:54:16 +00:00
.endif
2008-10-12 20:43:37 +00:00
BYTES_PER_VARIABLE := BYTES_FP+2
2008-10-12 19:54:16 +00:00
MANTISSA_BYTES := BYTES_FP-1
2008-10-12 19:50:23 +00:00
BYTES_PER_FRAME := 2*BYTES_FP+8
FOR_STACK1 := 2*BYTES_FP+5
FOR_STACK2 := BYTES_FP+4
2008-10-12 01:32:09 +00:00
2008-10-12 20:17:43 +00:00
.ifdef CBM1
MAX_EXPON = 12
.else
MAX_EXPON = 10
.endif
2008-10-12 19:50:23 +00:00
.include "macros.s"
.include "zeropage.s"
2008-10-11 23:57:13 +00:00
2008-10-06 05:21:05 +00:00
.setcpu "6502"
2008-10-09 09:18:45 +00:00
.macpack longbranch
2008-10-06 05:21:05 +00:00
STACK := $0100
2008-10-11 17:10:12 +00:00
.segment "HEADER"
2008-10-08 05:07:59 +00:00
.ifdef KBD
jmp LE68C
.byte $00,$13,$56
.endif
2008-10-13 00:44:36 +00:00
.include "token.s"
2008-10-12 19:04:31 +00:00
2008-10-13 00:44:36 +00:00
.include "error.s"
2008-10-11 22:37:02 +00:00
2008-10-13 02:05:35 +00:00
.include "message.s"
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
; CALLED BY "NEXT" AND "FOR" TO SCAN THROUGH
; THE STACK FOR A FRAME WITH THE SAME VARIABLE.
;
; (FORPNT) = ADDRESS OF VARIABLE IF "FOR" OR "NEXT"
; = $XXFF IF CALLED FROM "RETURN"
; <<< BUG: SHOULD BE $FFXX >>>
;
; RETURNS .NE. IF VARIABLE NOT FOUND,
; (X) = STACK PNTR AFTER SKIPPING ALL FRAMES
;
; .EQ. IF FOUND
; (X) = STACK PNTR OF FRAME FOUND
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
GTFORPNT:
tsx
inx
inx
inx
inx
L2279:
lda STACK+1,x
cmp #$81
bne L22A1
lda FORPNT+1
bne L228E
lda STACK+2,x
sta FORPNT
lda STACK+3,x
sta FORPNT+1
L228E:
cmp STACK+3,x
bne L229A
lda FORPNT
cmp STACK+2,x
beq L22A1
L229A:
txa
clc
adc #BYTES_PER_FRAME
tax
bne L2279
L22A1:
rts
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
; MOVE BLOCK OF MEMORY UP
;
; ON ENTRY:
; (Y,A) = (HIGHDS) = DESTINATION END+1
; (LOWTR) = LOWEST ADDRESS OF SOURCE
; (HIGHTR) = HIGHEST SOURCE ADDRESS+1
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
BLTU:
jsr REASON
sta STREND
sty STREND+1
BLTU2:
sec
lda HIGHTR
sbc LOWTR
sta INDEX
tay
lda HIGHTR+1
sbc LOWTR+1
tax
inx
tya
beq L22DD
lda HIGHTR
sec
sbc INDEX
sta HIGHTR
bcs L22C6
dec HIGHTR+1
sec
L22C6:
lda HIGHDS
sbc INDEX
sta HIGHDS
bcs L22D6
dec HIGHDS+1
bcc L22D6
L22D2:
lda (HIGHTR),y
sta (HIGHDS),y
L22D6:
dey
bne L22D2
lda (HIGHTR),y
sta (HIGHDS),y
L22DD:
dec HIGHTR+1
dec HIGHDS+1
dex
bne L22D6
rts
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
; CHECK IF ENOUGH ROOM LEFT ON STACK
; FOR "FOR", "GOSUB", OR EXPRESSION EVALUATION
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
CHKMEM:
asl a
adc #SPACE_FOR_GOSUB
bcs MEMERR
sta INDEX
tsx
cpx INDEX
bcc MEMERR
rts
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
; CHECK IF ENOUGH ROOM BETWEEN ARRAYS AND STRINGS
; (Y,A) = ADDR ARRAYS NEED TO GROW TO
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
REASON:
cpy FRETOP+1
bcc L231E
bne L22FC
cmp FRETOP
bcc L231E
L22FC:
pha
ldx #FAC-TEMP1-1
tya
L2300:
pha
lda TEMP1,x
dex
bpl L2300
jsr GARBAG
ldx #TEMP1-FAC+1
L230B:
pla
sta FAC,x
inx
bmi L230B
pla
tay
pla
cpy FRETOP+1
bcc L231E
bne MEMERR
cmp FRETOP
bcs MEMERR
L231E:
rts
2008-10-13 01:12:57 +00:00
2008-10-13 02:05:35 +00:00
.include "program.s"
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "FOR" STATEMENT
2008-10-13 01:12:57 +00:00
;
2008-10-13 02:05:35 +00:00
; FOR PUSHES 18 BYTES ON THE STACK:
; 2 -- TXTPTR
; 2 -- LINE NUMBER
; 5 -- INITIAL (CURRENT) FOR VARIABLE VALUE
; 1 -- STEP SIGN
; 5 -- STEP VALUE
; 2 -- ADDRESS OF FOR VARIABLE IN VARTAB
; 1 -- FOR TOKEN ($81)
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
FOR:
lda #$80
sta SUBFLG
jsr LET
jsr GTFORPNT
bne L2619
txa
adc #FOR_STACK1
tax
txs
L2619:
2008-10-06 05:21:05 +00:00
pla
2008-10-13 02:05:35 +00:00
pla
lda #FOR_STACK2
jsr CHKMEM
jsr DATAN
clc
tya
adc TXTPTR
pha
lda TXTPTR+1
adc #$00
pha
lda CURLIN+1
pha
lda CURLIN
pha
lda #TOKEN_TO
jsr SYNCHR
jsr CHKNUM
jsr FRMNUM
lda FACSIGN
ora #$7F
and FAC+1
sta FAC+1
lda #<STEP
ldy #>STEP
sta INDEX
sty INDEX+1
jmp FRM_STACK3
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "STEP" PHRASE OF "FOR" STATEMENT
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
STEP:
lda #<CON_ONE
ldy #>CON_ONE
jsr LOAD_FAC_FROM_YA
jsr CHRGOT
cmp #TOKEN_STEP
bne L2665
jsr CHRGET
jsr FRMNUM
L2665:
jsr SIGN
jsr FRM_STACK2
lda FORPNT+1
pha
lda FORPNT
pha
lda #$81
pha
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; PERFORM NEXT STATEMENT
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
NEWSTT:
jsr ISCNTC
lda TXTPTR
ldy TXTPTR+1
.ifdef CBM2_KBD
cpy #>INPUTBUFFER
2008-10-08 05:07:59 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifdef CBM2
nop
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifdef CBM2_KBD
beq LC6D4
2008-10-08 11:42:15 +00:00
.else
2008-10-13 02:05:35 +00:00
beq L2683
2008-10-08 11:42:15 +00:00
.endif
2008-10-13 02:05:35 +00:00
sta OLDTEXT
sty OLDTEXT+1
LC6D4:
ldy #$00
L2683:
lda (TXTPTR),y
.ifndef CONFIG_11
beq LA5DC
cmp #$3A
beq NEWSTT2
SYNERR1:
2008-10-08 05:07:59 +00:00
jmp SYNERR
2008-10-13 02:05:35 +00:00
LA5DC:
2008-10-08 05:07:59 +00:00
.else
2008-10-13 02:05:35 +00:00
bne COLON
2008-10-13 01:12:57 +00:00
.endif
2008-10-13 02:05:35 +00:00
ldy #$02
lda (TXTPTR),y
2008-10-07 08:03:36 +00:00
clc
2008-10-13 02:05:35 +00:00
.ifdef CBM2_KBD
jeq L2701
2008-10-07 08:03:36 +00:00
.else
2008-10-13 02:05:35 +00:00
beq L2701
2008-10-07 08:03:36 +00:00
.endif
2008-10-06 05:21:05 +00:00
iny
2008-10-13 02:05:35 +00:00
lda (TXTPTR),y
sta CURLIN
iny
lda (TXTPTR),y
sta CURLIN+1
tya
adc TXTPTR
sta TXTPTR
bcc NEWSTT2
inc TXTPTR+1
NEWSTT2:
jsr CHRGET
jsr EXECUTE_STATEMENT
jmp NEWSTT
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; EXECUTE A STATEMENT
;
; (A) IS FIRST CHAR OF STATEMENT
; CARRY IS SET
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
EXECUTE_STATEMENT:
.ifndef CONFIG_11_NOAPPLE
beq RET1
.ifndef APPLE
sec
2008-10-07 08:03:36 +00:00
.endif
.else
2008-10-13 02:05:35 +00:00
beq RET2
2008-10-06 10:32:35 +00:00
.endif
2008-10-13 02:05:35 +00:00
EXECUTE_STATEMENT1:
sbc #$80
.ifndef CONFIG_11
jcc LET
2008-10-07 05:52:42 +00:00
.else
2008-10-13 02:05:35 +00:00
bcc LET1
2008-10-06 10:32:35 +00:00
.endif
2008-10-13 02:05:35 +00:00
cmp #NUM_TOKENS
.ifdef CBM2_KBD
bcs LC721
2008-10-06 10:32:35 +00:00
.else
2008-10-13 02:05:35 +00:00
bcs SYNERR1
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 02:05:35 +00:00
asl a
tay
lda TOKEN_ADDRESS_TABLE+1,y
2008-10-06 05:21:05 +00:00
pha
2008-10-13 02:05:35 +00:00
lda TOKEN_ADDRESS_TABLE,y
pha
jmp CHRGET
.ifdef CONFIG_11
LET1:
jmp LET
COLON:
cmp #$3A
beq NEWSTT2
SYNERR1:
jmp SYNERR
2008-10-06 10:32:35 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifdef CBM2_KBD
LC721:
2008-10-08 11:42:15 +00:00
.ifdef KBD
2008-10-13 02:05:35 +00:00
cmp #$45
2008-10-08 11:42:15 +00:00
.else
2008-10-13 02:05:35 +00:00
cmp #$4B
2008-10-08 11:42:15 +00:00
.endif
2008-10-13 02:05:35 +00:00
bne SYNERR1
jsr CHRGET
lda #TOKEN_TO
jsr SYNCHR
jmp GOTO
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "RESTORE" STATEMENT
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
RESTORE:
sec
2008-10-06 05:21:05 +00:00
lda TXTTAB
2008-10-13 02:05:35 +00:00
sbc #$01
ldy TXTTAB+1
bcs SETDA
2008-10-06 05:21:05 +00:00
dey
2008-10-13 02:05:35 +00:00
SETDA:
sta DATPTR
sty DATPTR+1
RET2:
2008-10-06 05:21:05 +00:00
rts
2008-10-13 02:05:35 +00:00
.ifndef CONFIG_CBM_ALL
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; SEE IF CONTROL-C TYPED
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
ISCNTC:
2008-10-11 06:23:53 +00:00
.endif
2008-10-08 06:08:08 +00:00
.ifdef KBD
2008-10-13 02:05:35 +00:00
jsr LE8F3
bcc RET1
LE633:
jsr LDE7F
beq STOP
cmp #$03
bne LE633
2008-10-11 07:15:19 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifdef OSI
jmp MONISCNTC
nop
nop
nop
nop
lsr a
bcc RET2
jsr GETLN
cmp #$03
2008-10-07 08:03:36 +00:00
.endif
2008-10-11 07:15:19 +00:00
.ifdef APPLE
2008-10-13 02:05:35 +00:00
lda $C000
cmp #$83
beq L0ECC
rts
L0ECC:
jsr RDKEY
cmp #$03
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifdef KIM
lda #$01
bit $1740
bmi RET2
ldx #$08
lda #$03
clc
cmp #$03
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "STOP" STATEMENT
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
STOP:
bcs END2
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "END" STATEMENT
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
END:
clc
END2:
bne RET1
lda TXTPTR
ldy TXTPTR+1
.ifdef CBM2_KBD
ldx CURLIN+1
inx
.endif
beq END4
sta OLDTEXT
sty OLDTEXT+1
CONTROL_C_TYPED:
lda CURLIN
ldy CURLIN+1
sta OLDLIN
sty OLDLIN+1
END4:
2008-10-06 05:21:05 +00:00
pla
pla
2008-10-13 02:05:35 +00:00
L2701:
lda #<QT_BREAK
ldy #>QT_BREAK
.ifndef KBD
ldx #$00
stx Z14
2008-10-08 05:07:59 +00:00
.endif
2008-10-13 02:05:35 +00:00
bcc L270E
jmp PRINT_ERROR_LINNUM
L270E:
jmp RESTART
.ifdef KBD
LE664:
tay
jmp SNGFLT
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
; "CONT" COMMAND
; ----------------------------------------------------------------------------
CONT:
bne RET1
ldx #ERR_CANTCONT
ldy OLDTEXT+1
bne L271C
jmp ERROR
L271C:
lda OLDTEXT
sta TXTPTR
sty TXTPTR+1
lda OLDLIN
ldy OLDLIN+1
sta CURLIN
sty CURLIN+1
RET1:
rts
.ifdef KBD
PRT:
jsr GETBYT
txa
ror a
ror a
ror a
sta $8F
rts
LE68C:
ldy #$12
LE68E:
lda LEA30,y
sta $03A2,y
dey
bpl LE68E
rts
2008-10-08 05:07:59 +00:00
.endif
2008-10-13 02:05:35 +00:00
.if .def(CONFIG_NULL) || .def(CBM1)
; CBM1 has the keyword removed,
; but the code is, still here
NULL:
jsr GETBYT
bne RET1
inx
cpx #NULL_MAX
bcs L2739
dex
stx Z15
rts
L2739:
jmp IQERR
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifndef CONFIG_11_NOAPPLE
CLEAR:
bne RET1
jmp CLEARC
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifdef APPLE
.include "apple_loadsave.s"
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifdef KIM
.include "kim_loadsave.s"
.endif
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "RUN" COMMAND
; ----------------------------------------------------------------------------
RUN:
bne L27CF
jmp SETPTRS
L27CF:
jsr CLEARC
jmp L27E9
; ----------------------------------------------------------------------------
; "GOSUB" STATEMENT
2008-10-13 01:12:57 +00:00
;
2008-10-13 02:05:35 +00:00
; LEAVES 7 BYTES ON STACK:
; 2 -- RETURN ADDRESS (NEWSTT)
2008-10-13 01:12:57 +00:00
; 2 -- TXTPTR
2008-10-13 02:05:35 +00:00
; 2 -- LINE #
; 1 -- GOSUB TOKEN
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
GOSUB:
lda #$03
2008-10-06 05:21:05 +00:00
jsr CHKMEM
lda TXTPTR+1
2008-10-13 02:05:35 +00:00
pha
lda TXTPTR
2008-10-06 05:21:05 +00:00
pha
lda CURLIN+1
pha
lda CURLIN
pha
2008-10-13 02:05:35 +00:00
lda #TOKEN_GOSUB
2008-10-06 05:21:05 +00:00
pha
2008-10-13 02:05:35 +00:00
L27E9:
jsr CHRGOT
jsr GOTO
jmp NEWSTT
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "GOTO" STATEMENT
; ALSO USED BY "RUN" AND "GOSUB"
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
GOTO:
jsr LINGET
jsr REMN
lda CURLIN+1
cmp LINNUM+1
bcs L2809
tya
sec
adc TXTPTR
ldx TXTPTR+1
bcc L280D
inx
bcs L280D
L2809:
lda TXTTAB
ldx TXTTAB+1
L280D:
.ifdef KBD
jsr LF457
bne UNDERR
2008-10-07 05:52:42 +00:00
.else
2008-10-13 02:05:35 +00:00
jsr FL1
bcc UNDERR
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 02:05:35 +00:00
lda LOWTRX
sbc #$01
sta TXTPTR
lda LOWTRX+1
sbc #$00
sta TXTPTR+1
L281E:
rts
; ----------------------------------------------------------------------------
; "POP" AND "RETURN" STATEMENTS
; ----------------------------------------------------------------------------
POP:
bne L281E
lda #$FF
2008-10-08 05:07:59 +00:00
.ifdef CBM2_KBD
2008-10-13 02:05:35 +00:00
sta FORPNT+1 ; bugfix, wrong in AppleSoft
2008-10-07 08:03:36 +00:00
.else
2008-10-13 02:05:35 +00:00
sta FORPNT
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 02:05:35 +00:00
jsr GTFORPNT
txs
cmp #TOKEN_GOSUB
beq RETURN
ldx #ERR_NOGOSUB
.byte $2C
UNDERR:
ldx #ERR_UNDEFSTAT
jmp ERROR
; ----------------------------------------------------------------------------
SYNERR2:
jmp SYNERR
; ----------------------------------------------------------------------------
RETURN:
pla
pla
2008-10-06 05:21:05 +00:00
sta CURLIN
2008-10-13 02:05:35 +00:00
pla
2008-10-06 05:21:05 +00:00
sta CURLIN+1
2008-10-13 02:05:35 +00:00
pla
sta TXTPTR
pla
sta TXTPTR+1
; ----------------------------------------------------------------------------
; "DATA" STATEMENT
; EXECUTED BY SKIPPING TO NEXT COLON OR EOL
; ----------------------------------------------------------------------------
DATA:
jsr DATAN
; ----------------------------------------------------------------------------
; ADD (Y) TO TXTPTR
; ----------------------------------------------------------------------------
ADDON:
2008-10-06 05:21:05 +00:00
tya
2008-10-13 02:05:35 +00:00
clc
2008-10-06 05:21:05 +00:00
adc TXTPTR
sta TXTPTR
2008-10-13 02:05:35 +00:00
bcc L2852
2008-10-06 05:21:05 +00:00
inc TXTPTR+1
2008-10-13 02:05:35 +00:00
L2852:
rts
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; SCAN AHEAD TO NEXT ":" OR EOL
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
DATAN:
ldx #$3A
.byte $2C
REMN:
ldx #$00
stx CHARAC
ldy #$00
sty ENDCHR
L285E:
lda ENDCHR
ldx CHARAC
sta CHARAC
stx ENDCHR
L2866:
lda (TXTPTR),y
beq L2852
cmp ENDCHR
beq L2852
iny
cmp #$22
2008-10-07 10:36:34 +00:00
.ifndef CONFIG_11
2008-10-13 02:05:35 +00:00
beq L285E
bne L2866
2008-10-08 06:08:08 +00:00
.else
2008-10-13 02:05:35 +00:00
bne L2866
beq L285E
2008-10-08 06:08:08 +00:00
.endif
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
; "IF" STATEMENT
; ----------------------------------------------------------------------------
IF:
jsr FRMEVL
jsr CHRGOT
cmp #TOKEN_GOTO
beq L2884
lda #TOKEN_THEN
2008-10-07 08:03:36 +00:00
jsr SYNCHR
2008-10-13 02:05:35 +00:00
L2884:
lda FAC
bne L288D
; ----------------------------------------------------------------------------
; "REM" STATEMENT, OR FALSE "IF" STATEMENT
; ----------------------------------------------------------------------------
REM:
jsr REMN
beq ADDON
L288D:
jsr CHRGOT
bcs L2895
2008-10-07 08:03:36 +00:00
jmp GOTO
2008-10-13 02:05:35 +00:00
L2895:
jmp EXECUTE_STATEMENT
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "ON" STATEMENT
;
; ON <EXP> GOTO <LIST>
; ON <EXP> GOSUB <LIST>
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
ON:
jsr GETBYT
pha
cmp #TOKEN_GOSUB
beq L28A4
L28A0:
cmp #TOKEN_GOTO
bne SYNERR2
L28A4:
dec FAC_LAST
bne L28AC
pla
jmp EXECUTE_STATEMENT1
L28AC:
jsr CHRGET
jsr LINGET
cmp #$2C
beq L28A4
pla
L28B7:
2008-10-06 05:21:05 +00:00
rts
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; CONVERT LINE NUMBER
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
LINGET:
ldx #$00
stx LINNUM
stx LINNUM+1
L28BE:
bcs L28B7
sbc #$2F
sta CHARAC
lda LINNUM+1
2008-10-06 05:21:05 +00:00
sta INDEX
2008-10-13 02:05:35 +00:00
cmp #$19
bcs L28A0
; <<<<<DANGEROUS CODE>>>>>
; NOTE THAT IF (A) = $AB ON THE LINE ABOVE,
; ON.1 WILL COMPARE = AND CAUSE A CATASTROPHIC
; JUMP TO $22D9 (FOR GOTO), OR OTHER LOCATIONS
; FOR OTHER CALLS TO LINGET.
;
; YOU CAN SEE THIS IS YOU FIRST PUT "BRK" IN $22D9,
; THEN TYPE "GO TO 437761".
;
; ANY VALUE FROM 437760 THROUGH 440319 WILL CAUSE
; THE PROBLEM. ($AB00 - $ABFF)
; <<<<<DANGEROUS CODE>>>>>
lda LINNUM
2008-10-06 05:21:05 +00:00
asl a
2008-10-13 02:05:35 +00:00
rol INDEX
asl a
rol INDEX
adc LINNUM
sta LINNUM
lda INDEX
adc LINNUM+1
sta LINNUM+1
asl LINNUM
rol LINNUM+1
lda LINNUM
adc CHARAC
sta LINNUM
bcc L28EC
inc LINNUM+1
L28EC:
jsr CHRGET
jmp L28BE
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "LET" STATEMENT
;
; LET <VAR> = <EXP>
; <VAR> = <EXP>
2008-10-13 01:12:57 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
LET:
jsr PTRGET
sta FORPNT
sty FORPNT+1
lda #TOKEN_EQUAL
jsr SYNCHR
.ifndef CONFIG_SMALL
lda VALTYP+1
2008-10-06 05:21:05 +00:00
pha
2008-10-13 02:05:35 +00:00
.endif
lda VALTYP
2008-10-06 05:21:05 +00:00
pha
2008-10-13 02:05:35 +00:00
jsr FRMEVL
2008-10-06 05:21:05 +00:00
pla
2008-10-13 02:05:35 +00:00
rol a
jsr CHKVAL
bne LETSTRING
.ifndef CONFIG_SMALL
2008-10-06 05:21:05 +00:00
pla
2008-10-13 02:05:35 +00:00
LET2:
bpl L2923
2008-10-06 05:21:05 +00:00
jsr ROUND_FAC
2008-10-13 02:05:35 +00:00
jsr AYINT
ldy #$00
lda FAC+3
sta (FORPNT),y
iny
2008-10-06 05:21:05 +00:00
lda FAC+4
2008-10-13 02:05:35 +00:00
sta (FORPNT),y
rts
L2923:
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; REAL VARIABLE = EXPRESSION
; ----------------------------------------------------------------------------
jmp SETFOR
LETSTRING:
2008-10-11 10:14:29 +00:00
.ifndef CONFIG_SMALL
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; INSTALL STRING, DESCRIPTOR ADDRESS IS AT FAC+3,4
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
PUTSTR:
.endif
2008-10-11 09:56:31 +00:00
.ifdef CONFIG_CBM_ALL
2008-10-13 02:05:35 +00:00
ldy FORPNT+1
.ifdef CBM1
cpy #$D0
.else
cpy #$DE
.endif
bne LC92B
jsr FREFAC
cmp #$06
.ifdef CBM2_KBD
bne IQERR1
.else
beq LC8E2
jmp IQERR
LC8E2:
.endif
ldy #$00
sty FAC
sty FACSIGN
LC8E8:
sty STRNG2
jsr LC91C
jsr MUL10
inc STRNG2
ldy STRNG2
jsr LC91C
jsr COPY_FAC_TO_ARG_ROUNDED
tax
beq LC902
inx
txa
jsr LD9BF
LC902:
ldy STRNG2
2008-10-06 05:21:05 +00:00
iny
2008-10-13 02:05:35 +00:00
cpy #$06
bne LC8E8
jsr MUL10
jsr QINT
ldx #$02
sei
LC912:
lda FAC+2,x
.ifdef CBM2
sta $8D,x
.else
sta $0200,x
.endif
dex
bpl LC912
cli
rts
LC91C:
lda (INDEX),y
jsr L00CF
bcc LC926
IQERR1:
jmp IQERR
LC926:
sbc #$2F
jmp ADDACC
LC92B:
.endif
ldy #$02
lda (FAC_LAST-1),y
cmp FRETOP+1
bcc L2946
bne L2938
dey
lda (FAC_LAST-1),y
cmp FRETOP
bcc L2946
L2938:
ldy FAC_LAST
cpy VARTAB+1
bcc L2946
bne L294D
lda FAC_LAST-1
cmp VARTAB
bcs L294D
L2946:
lda FAC_LAST-1
ldy FAC_LAST
jmp L2963
L294D:
ldy #$00
lda (FAC_LAST-1),y
jsr STRINI
lda DSCPTR
ldy DSCPTR+1
sta STRNG1
sty STRNG1+1
jsr MOVINS
lda #FAC
ldy #$00
L2963:
sta DSCPTR
sty DSCPTR+1
jsr FRETMS
ldy #$00
lda (DSCPTR),y
sta (FORPNT),y
iny
lda (DSCPTR),y
sta (FORPNT),y
iny
lda (DSCPTR),y
sta (FORPNT),y
rts
.ifdef CONFIG_CBM_ALL
PRINTH:
jsr CMD
jmp LCAD6
CMD:
jsr GETBYT
beq LC98F
lda #$2C
jsr SYNCHR
LC98F:
php
jsr CHKOUT
stx Z03
plp
jmp PRINT
.endif
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
PRSTRING:
jsr STRPRT
L297E:
jsr CHRGOT
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; "PRINT" STATEMENT
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
PRINT:
beq CRDO
PRINT2:
beq L29DD
cmp #TOKEN_TAB
beq L29F5
cmp #TOKEN_SPC
.ifdef CBM2_KBD
clc
.endif
beq L29F5
cmp #','
.ifdef KIM
clc
.endif
beq L29DE
cmp #$3B
beq L2A0D
2008-10-06 05:21:05 +00:00
jsr FRMEVL
2008-10-13 02:05:35 +00:00
bit VALTYP
bmi PRSTRING
jsr FOUT
jsr STRLIT
.ifndef CONFIG_CBM_ALL
2008-10-06 05:21:05 +00:00
ldy #$00
2008-10-13 02:05:35 +00:00
lda (FAC_LAST-1),y
clc
adc Z16
.ifdef KBD
cmp #$28
.else
cmp Z17
.endif
bcc L29B1
jsr CRDO
L29B1:
.endif
jsr STRPRT
.ifdef KBD
jmp L297E
LE86C:
2008-10-06 05:21:05 +00:00
pla
2008-10-13 02:05:35 +00:00
jmp CONTROL_C_TYPED
LE870:
jsr GETBYT
txa
LE874:
beq LE878
bpl LE8F2
LE878:
jmp IQERR
CRDO:
lda #$0A
sta $10
jsr OUTDO
LE882:
lda #$0D
jsr OUTDO
PRINTNULLS:
lda #$00
sta $10
eor #$FF
.else
jsr OUTSP
bne L297E
L29B9:
.ifdef CBM2
lda #$00
sta INPUTBUFFER,x
ldx #<(INPUTBUFFER-1)
ldy #>(INPUTBUFFER-1)
.else
.ifndef APPLE
ldy #$00
sty INPUTBUFFER,x
ldx #LINNUM+1
.endif
2008-10-06 10:32:35 +00:00
.endif
2008-10-11 09:56:31 +00:00
.ifdef CONFIG_CBM_ALL
2008-10-13 02:05:35 +00:00
lda Z03
bne L29DD
LC9D2:
.endif
CRDO:
.ifdef CBM1
lda Z03
bne LC9D8
sta $05
LC9D8:
.endif
lda #$0D
.ifndef CONFIG_CBM_ALL
sta Z16
.endif
jsr OUTDO
.ifdef APPLE
lda #$80
2008-10-07 08:03:36 +00:00
.else
2008-10-13 02:05:35 +00:00
lda #$0A
2008-10-08 07:04:03 +00:00
.endif
2008-10-13 02:05:35 +00:00
jsr OUTDO
PRINTNULLS:
.ifdef CBM1
lda Z03
bne L29DD
2008-10-06 10:32:35 +00:00
.endif
2008-10-13 02:05:35 +00:00
.if .def(CONFIG_NULL) || .def(CBM1)
2008-10-06 05:21:05 +00:00
txa
2008-10-13 02:05:35 +00:00
pha
ldx Z15
beq L29D9
lda #$00
L29D3:
jsr OUTDO
dex
bne L29D3
L29D9:
stx Z16
pla
tax
.else
.ifdef APPLE
lda #$00
sta $50
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 02:05:35 +00:00
eor #$FF
2008-10-07 08:03:36 +00:00
.endif
.endif
2008-10-13 02:05:35 +00:00
L29DD:
rts
L29DE:
lda Z16
2008-10-11 09:56:31 +00:00
.ifndef CONFIG_CBM_ALL
2008-10-13 02:05:35 +00:00
.ifdef KBD
cmp #$1A
.else
cmp Z18
2008-10-09 10:10:09 +00:00
.endif
2008-10-13 02:05:35 +00:00
bcc L29EA
jsr CRDO
jmp L2A0D
L29EA:
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 02:05:35 +00:00
sec
L29EB:
2008-10-11 09:56:31 +00:00
.ifdef CONFIG_CBM_ALL
2008-10-13 02:05:35 +00:00
sbc #$0A
.else
2008-10-13 02:05:35 +00:00
.ifdef KBD
sbc #$0D
.else
sbc #$0E
.endif
2008-10-13 02:05:35 +00:00
.endif
bcs L29EB
eor #$FF
adc #$01
bne L2A08
L29F5:
.ifdef CONFIG_11_NOAPPLE
php
.else
pha
.endif
jsr GTBYTC
cmp #$29
.ifndef CONFIG_11_NOAPPLE
.ifdef APPLE
beq L1185
jmp SYNERR
L1185:
.else
bne SYNERR4
.endif
pla
cmp #TOKEN_TAB
.ifdef APPLE
bne L2A09
.else
bne L2A0A
.endif
.else
.ifdef CBM2_KBD
bne SYNERR4
.else
beq @1
jmp SYNERR
@1:
.endif
plp ;; XXX c64 has this
bcc L2A09
.endif
txa
sbc Z16
bcc L2A0D
.ifndef CONFIG_11
beq L2A0D
.endif
L2A08:
tax
.ifdef CONFIG_11
L2A09:
inx
.endif
L2A0A:
.ifndef CONFIG_11
jsr OUTSP
.endif
dex
.ifndef CONFIG_11
bne L2A0A
.else
2008-10-13 02:05:35 +00:00
bne L2A13
2008-10-06 10:32:35 +00:00
.endif
2008-10-13 02:05:35 +00:00
L2A0D:
2008-10-06 05:21:05 +00:00
jsr CHRGET
2008-10-13 02:05:35 +00:00
jmp PRINT2
.ifdef CONFIG_11
L2A13:
jsr OUTSP
bne L2A0A
2008-10-08 11:42:15 +00:00
.endif
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; PRINT STRING AT (Y,A)
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
STROUT:
jsr STRLIT
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; PRINT STRING AT (FACMO,FACLO)
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
STRPRT:
2008-10-06 05:21:05 +00:00
jsr FREFAC
tax
2008-10-13 02:05:35 +00:00
ldy #$00
2008-10-06 05:21:05 +00:00
inx
2008-10-13 02:05:35 +00:00
L2A22:
2008-10-06 05:21:05 +00:00
dex
2008-10-13 02:05:35 +00:00
beq L29DD
lda (INDEX),y
jsr OUTDO
iny
cmp #$0D
bne L2A22
jsr PRINTNULLS
jmp L2A22
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
OUTSP:
.ifdef CBM2
lda $0E
beq LCA40
lda #$20
.byte $2C
LCA40:
.endif
.ifdef CONFIG_CBM_ALL
lda #$1D
.else
lda #$20
.endif
.byte $2C
OUTQUES:
lda #$3F
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
; PRINT CHAR FROM (A)
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
OUTDO:
.ifndef KBD
bit Z14
bmi L2A56
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifndef CBM2_KBD
pha
.endif
.ifdef CBM1
cmp #$1D
beq LCA6A
cmp #$9D
beq LCA5A
cmp #$14
bne LCA64
LCA5A:
lda $05
beq L2A4E
lda Z03
bne L2A4E
dec $05
LCA64:
and #$7F
.endif
.ifndef CBM2
cmp #$20
bcc L2A4E
.endif
LCA6A:
.ifdef CONFIG_CBM1_PATCHES
lda Z03
jsr PATCH6
nop
.endif
.ifdef CONFIG_PRINT_CR
lda Z16
cmp Z17
bne L2A4C
.ifdef APPLE
nop ; PATCH!
nop ; don't print CR
nop
2008-10-07 05:52:42 +00:00
.else
2008-10-13 02:05:35 +00:00
jsr CRDO
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 02:05:35 +00:00
L2A4C:
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 02:05:35 +00:00
.ifndef CONFIG_CBM_ALL
inc Z16
.endif
L2A4E:
.ifndef CBM2_KBD
pla
.endif
.ifdef KIM
sty DIMFLG
.endif
.ifdef APPLE
2008-10-06 05:21:05 +00:00
ora #$80
2008-10-13 02:05:35 +00:00
.endif
jsr MONCOUT
.ifdef APPLE
and #$7F
.endif
.ifdef KIM
ldy DIMFLG
.endif
.ifdef OSI
nop
nop
nop
nop
.endif
L2A56:
and #$FF
LE8F2:
rts
.ifdef KBD
LE8F3:
pha
lda $047F
2008-10-06 05:21:05 +00:00
clc
2008-10-13 02:05:35 +00:00
beq LE900
lda #$00
sta $047F
2008-10-06 05:21:05 +00:00
sec
2008-10-13 02:05:35 +00:00
LE900:
2008-10-06 05:21:05 +00:00
pla
rts
2008-10-07 08:03:36 +00:00
.endif
2008-10-13 01:43:59 +00:00
2008-10-13 02:05:35 +00:00
.include "input.s"
.include "eval.s"
.include "memory.s"
2008-10-13 01:43:59 +00:00
.include "array.s"
; ----------------------------------------------------------------------------
; "FRE" FUNCTION
;
; COLLECTS GARBAGE AND RETURNS # BYTES OF MEMORY LEFT
; ----------------------------------------------------------------------------
FRE:
lda VALTYP
beq L3188
jsr FREFAC
L3188:
jsr GARBAG
sec
lda FRETOP
sbc STREND
tay
lda FRETOP+1
sbc STREND+1
; FALL INTO GIVAYF TO FLOAT THE VALUE
; NOTE THAT VALUES OVER 32767 WILL RETURN AS NEGATIVE
; ----------------------------------------------------------------------------
; FLOAT THE SIGNED INTEGER IN A,Y
; ----------------------------------------------------------------------------
GIVAYF:
ldx #$00
stx VALTYP
sta FAC+1
sty FAC+2
ldx #$90
jmp FLOAT1
POS:
ldy Z16
; ----------------------------------------------------------------------------
; FLOAT (Y) INTO FAC, GIVING VALUE 0-255
; ----------------------------------------------------------------------------
SNGFLT:
lda #$00
beq GIVAYF
; ----------------------------------------------------------------------------
; CHECK FOR DIRECT OR RUNNING MODE
; GIVING ERROR IF DIRECT MODE
; ----------------------------------------------------------------------------
ERRDIR:
ldx CURLIN+1
inx
bne RTS9
ldx #ERR_ILLDIR
2008-10-08 05:07:59 +00:00
.ifdef CBM2_KBD
2008-10-13 01:43:59 +00:00
.byte $2C
LD288:
ldx #ERR_UNDEFFN
.endif
2008-10-13 01:43:59 +00:00
L31AF:
jmp ERROR
DEF:
jsr FNC
jsr ERRDIR
jsr CHKOPN
lda #$80
sta SUBFLG
jsr PTRGET
2008-10-07 08:03:36 +00:00
jsr CHKNUM
2008-10-13 01:43:59 +00:00
jsr CHKCLS
lda #TOKEN_EQUAL
jsr SYNCHR
2008-10-11 10:14:29 +00:00
.ifndef CONFIG_SMALL
2008-10-06 05:21:05 +00:00
pha
2008-10-13 01:43:59 +00:00
.endif
lda VARPNT+1
2008-10-06 05:21:05 +00:00
pha
2008-10-13 01:43:59 +00:00
lda VARPNT
2008-10-06 05:21:05 +00:00
pha
2008-10-13 01:43:59 +00:00
lda TXTPTR+1
2008-10-06 05:21:05 +00:00
pha
2008-10-13 01:43:59 +00:00
lda TXTPTR
2008-10-06 05:21:05 +00:00
pha
2008-10-13 01:43:59 +00:00
jsr DATA
jmp L3250
FNC:
lda #TOKEN_FN
jsr SYNCHR
ora #$80
sta SUBFLG
jsr PTRGET3
sta FNCNAM
sty FNCNAM+1
jmp CHKNUM
L31F3:
jsr FNC
lda FNCNAM+1
2008-10-06 05:21:05 +00:00
pha
2008-10-13 01:43:59 +00:00
lda FNCNAM
2008-10-06 05:21:05 +00:00
pha
2008-10-13 01:43:59 +00:00
jsr PARCHK
jsr CHKNUM
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
sta FNCNAM
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
sta FNCNAM+1
ldy #$02
.ifndef CBM2_KBD
ldx #ERR_UNDEFFN
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 01:43:59 +00:00
lda (FNCNAM),y
.ifndef CBM2_KBD
beq L31AF
.endif
sta VARPNT
2008-10-06 05:21:05 +00:00
tax
iny
2008-10-13 01:43:59 +00:00
lda (FNCNAM),y
.ifdef CBM2_KBD
beq LD288
2008-10-07 05:52:42 +00:00
.endif
2008-10-13 01:43:59 +00:00
sta VARPNT+1
2008-10-11 10:14:29 +00:00
.ifndef CONFIG_SMALL
2008-10-06 05:21:05 +00:00
iny
2008-10-08 07:04:03 +00:00
.endif
2008-10-13 01:43:59 +00:00
L3219:
lda (VARPNT),y
pha
dey
bpl L3219
ldy VARPNT+1
jsr STORE_FAC_AT_YX_ROUNDED
lda TXTPTR+1
pha
lda TXTPTR
pha
lda (FNCNAM),y
sta TXTPTR
2008-10-06 05:21:05 +00:00
iny
2008-10-13 01:43:59 +00:00
lda (FNCNAM),y
sta TXTPTR+1
lda VARPNT+1
pha
lda VARPNT
pha
jsr FRMNUM
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
sta FNCNAM
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
sta FNCNAM+1
jsr CHRGOT
beq L324A
jmp SYNERR
L324A:
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
sta TXTPTR
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
sta TXTPTR+1
L3250:
2008-10-06 05:21:05 +00:00
ldy #$00
pla
2008-10-13 01:43:59 +00:00
sta (FNCNAM),y
2008-10-06 05:21:05 +00:00
pla
iny
2008-10-13 01:43:59 +00:00
sta (FNCNAM),y
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
iny
sta (FNCNAM),y
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
iny
sta (FNCNAM),y
.ifndef CONFIG_SMALL
2008-10-06 05:21:05 +00:00
pla
2008-10-13 01:43:59 +00:00
iny
sta (FNCNAM),y
2008-10-07 05:52:42 +00:00
.endif
2008-10-06 05:21:05 +00:00
rts
2008-10-13 01:43:59 +00:00
.include "string.s"
2008-10-08 07:04:03 +00:00
.ifdef KBD
LF422:
lda VARTAB
sec
sbc #$02
ldy VARTAB+1
bcs LF42C
dey
LF42C:
rts
LF42D:
lda Z00,x
LF430:
cmp #$61
bcc LF43A
cmp #$7B
bcs LF43A
LF438:
sbc #$1F
LF43A:
rts
LF43B:
ldx #$5D
LF43D:
txa
and #$7F
cmp $0340
beq LF44D
sta $0340
lda #$03
jsr LDE48
LF44D:
jsr LDE7F
2008-10-09 10:10:09 +00:00
bne RTS4
2008-10-08 07:04:03 +00:00
cpx #$80
bcc LF44D
2008-10-09 10:10:09 +00:00
RTS4:
2008-10-08 07:04:03 +00:00
rts
LF457:
lda TXTTAB
ldx TXTTAB+1
LF45B:
sta JMPADRS+1
stx JMPADRS+2
ldy #$01
lda (JMPADRS+1),y
beq LF438
iny
iny
lda (JMPADRS+1),y
dey
cmp $14
bne LF472
lda (JMPADRS+1),y
cmp $13
LF472:
bcs LF43A
dey
lda (JMPADRS+1),y
tax
dey
lda (JMPADRS+1),y
bcc LF45B
LF47D:
jmp (JMPADRS+1)
.else
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
; EVALUATE "EXP1,EXP2"
;
; CONVERT EXP1 TO 16-BIT NUMBER IN LINNUM
; CONVERT EXP2 TO 8-BIT NUMBER IN X-REG
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
GTNUM:
jsr FRMNUM
jsr GETADR
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
; EVALUATE ",EXPRESSION"
; CONVERT EXPRESSION TO SINGLE BYTE IN X-REG
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
COMBYTE:
jsr CHKCOM
jmp GETBYT
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
; CONVERT (FAC) TO A 16-BIT VALUE IN LINNUM
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
GETADR:
lda FACSIGN
2008-10-11 06:23:53 +00:00
.ifdef APPLE
nop
nop
.else
2008-10-06 05:21:05 +00:00
bmi GOIQ
2008-10-11 06:23:53 +00:00
.endif
2008-10-06 05:21:05 +00:00
lda FAC
cmp #$91
bcs GOIQ
jsr QINT
lda FAC_LAST-1
ldy FAC_LAST
sty LINNUM
sta LINNUM+1
rts
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
; "PEEK" FUNCTION
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
PEEK:
2008-10-08 05:07:59 +00:00
.ifdef CBM2_KBD
2008-10-07 08:47:13 +00:00
lda $12
pha
lda $11
pha
.endif
2008-10-06 05:21:05 +00:00
jsr GETADR
ldy #$00
2008-10-07 08:47:13 +00:00
.ifdef CBM1
2008-10-06 10:58:56 +00:00
cmp #$C0
bcc LD6F3
cmp #$E1
bcc LD6F6
LD6F3:
2008-10-07 08:47:13 +00:00
.endif
2008-10-08 05:07:59 +00:00
.ifdef CBM2_KBD
2008-10-13 01:43:59 +00:00
nop ; patch that disables the compares above
2008-10-07 08:47:13 +00:00
nop
nop
nop
nop
nop
nop
nop
2008-10-06 10:58:56 +00:00
.endif
2008-10-06 05:21:05 +00:00
lda (LINNUM),y
tay
2008-10-08 05:07:59 +00:00
.ifdef CBM2_KBD
2008-10-07 08:47:13 +00:00
pla
sta $11
pla
sta $12
.endif
2008-10-06 10:58:56 +00:00
LD6F6:
2008-10-06 05:21:05 +00:00
jmp SNGFLT
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
; "POKE" STATEMENT
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
POKE:
jsr GTNUM
txa
ldy #$00
sta (LINNUM),y
rts
2008-10-13 01:43:59 +00:00
; ----------------------------------------------------------------------------
; "WAIT" STATEMENT
; ----------------------------------------------------------------------------
2008-10-06 05:21:05 +00:00
WAIT:
jsr GTNUM
stx FORPNT
ldx #$00
jsr CHRGOT
.ifdef CBM2
2008-10-12 21:39:54 +00:00
beq EASTER_EGG
.else
2008-10-06 05:21:05 +00:00
beq L3628
.endif
2008-10-06 05:21:05 +00:00
jsr COMBYTE
L3628:
stx FORPNT+1
ldy #$00
L362C:
lda (LINNUM),y
eor FORPNT+1
and FORPNT
beq L362C
2008-10-09 10:10:09 +00:00
RTS3:
2008-10-06 05:21:05 +00:00
rts
2008-10-08 07:04:03 +00:00
.endif
2008-10-12 21:39:54 +00:00
.include "float.s"
2008-10-13 00:27:11 +00:00
.include "chrget.s"
2008-10-12 21:39:54 +00:00
2008-10-13 00:11:02 +00:00
.include "rnd.s"
2008-10-12 21:39:54 +00:00
2008-10-13 00:11:02 +00:00
.include "trig.s"
2008-10-12 21:39:54 +00:00
2008-10-13 00:27:11 +00:00
.include "init.s"