ca65 V2.19 Main file : C:\work\msbasic65\msbasic.s Current file: C:\work\msbasic65\msbasic.s 00.000000r 1 ; Microsoft BASIC for 6502 00.000000r 1 ; 00.000000r 1 ; (first revision of this distribution, 20 Oct 2008, Michael Steil www.pagetable.com) 00.000000r 1 ; 00.000000r 1 ; This is a single integrated assembly source tree that can generate seven different versions of 00.000000r 1 ; Microsoft BASIC for 6502. 00.000000r 1 ; 00.000000r 1 ; By running ./make.sh, this will generate all versions and compare them to the original files 00.000000r 1 ; byte by byte. The CC65 compiler suite is need to build this project. 00.000000r 1 ; 00.000000r 1 ; These are the first eight (known) versions of Microsoft BASIC for 6502: 00.000000r 1 ; 00.000000r 1 ; Name Release MS Version ROM 9digit INPUTBUFFER extensions .define 00.000000r 1 ;--------------------------------------------------------------------------------------------------- 00.000000r 1 ; Commodore BASIC 1 1977 Y Y ZP CBM 00.000000r 1 ; OSI BASIC 1977 1.0 REV 3.2 Y N ZP - CONFIG_10A 00.000000r 1 ; AppleSoft I 1977 1.1 N Y $0200 Apple CONFIG_11 00.000000r 1 ; KIM BASIC 1977 1.1 N Y ZP - CONFIG_11A 00.000000r 1 ; AppleSoft II 1978 Y Y $0200 Apple CONFIG_2 00.000000r 1 ; Commodore BASIC 2 1979 Y Y $0200 CBM CONFIG_2A 00.000000r 1 ; KBD BASIC 1982 Y N $0700 KBD CONFIG_2B 00.000000r 1 ; MicroTAN 1980 Y Y ZP - CONFIG_2C 00.000000r 1 ; 00.000000r 1 ; (Note that this assembly source cannot (yet) build AppleSoft II.) 00.000000r 1 ; 00.000000r 1 ; This lists the versions in the order in which they were forked from the Microsoft source base. 00.000000r 1 ; Commodore BASIC 1, as used on the original PET is the oldest known version of Microsoft BASIC 00.000000r 1 ; for 6502. It contains some additions to Microsoft's version, like Commodore-style file I/O. 00.000000r 1 ; 00.000000r 1 ; The CONFIG_n defines specify what Microsoft-version the OEM version is based on. If CONFIG_2B 00.000000r 1 ; is defined, for example, CONFIG_2A, CONFIG_2, CONFIG_11A, CONFIG_11 and CONFIG_10A will be 00.000000r 1 ; defined as well, and all bugfixes up to version 2B will be enabled. 00.000000r 1 ; 00.000000r 1 ; The following symbols can be defined in addition: 00.000000r 1 ; 00.000000r 1 ; CONFIG_CBM1_PATCHES jump out into CBM1's binary patches instead of doing the right thing inline 00.000000r 1 ; CONFIG_CBM_ALL add all Commodore-specific additions except file I/O 00.000000r 1 ; CONFIG_DATAFLG ? 00.000000r 1 ; CONFIG_EASTER_EGG include the CBM2 "WAIT 6502" easter egg 00.000000r 1 ; CONFIG_FILE support Commodore PRINT#, INPUT#, GET#, CMD 00.000000r 1 ; CONFIG_IO_MSB all I/O has bit #7 set 00.000000r 1 ; CONFIG_MONCOUT_DESTROYS_Y Y needs to be preserved when calling MONCOUT 00.000000r 1 ; CONFIG_NO_CR terminal doesn't need explicit CRs on line ends 00.000000r 1 ; CONFIG_NO_LINE_EDITING disable support for Microsoft-style "@", "_", BEL etc. 00.000000r 1 ; CONFIG_NO_POKE don't support PEEK, POKE and WAIT 00.000000r 1 ; CONFIG_NO_READ_Y_IS_ZERO_HACK don't do a very volatile trick that saves one byte 00.000000r 1 ; CONFIG_NULL support for the NULL statement 00.000000r 1 ; CONFIG_PEEK_SAVE_LINNUM preserve LINNUM on a PEEK 00.000000r 1 ; CONFIG_PRINTNULLS whether PRINTNULLS does anything 00.000000r 1 ; CONFIG_PRINT_CR print CR when line end reached 00.000000r 1 ; CONFIG_RAM optimizations for RAM version of BASIC, only use on 1.x 00.000000r 1 ; CONFIG_ROR_WORKAROUND use workaround for buggy 6502s from 1975/1976; not safe for CONFIG_SMALL! 00.000000r 1 ; CONFIG_SAFE_NAMENOTFOUND check both bytes of the caller's address in NAMENOTFOUND 00.000000r 1 ; CONFIG_SCRTCH_ORDER where in the init code to call SCRTCH 00.000000r 1 ; CONFIG_SMALL use 6 digit FP instead of 9 digit, use 2 character error messages, don't have GET 00.000000r 1 ; 00.000000r 1 ; Changing symbol definitions can alter an existing base configuration, but it not guaranteed to assemble 00.000000r 1 ; or work correctly. 00.000000r 1 ; 00.000000r 1 ; Credits: 00.000000r 1 ; * main work by Michael Steil 00.000000r 1 ; * function names and all uppercase comments taken from Bob Sander-Cederlof's excellent AppleSoft II disassembly: 00.000000r 1 ; http://www.txbobsc.com/scsc/scdocumentor/ 00.000000r 1 ; * Applesoft lite by Tom Greene http://cowgod.org/replica1/applesoft/ helped a lot, too. 00.000000r 1 ; * Thanks to Joe Zbicak for help with Intellision Keyboard BASIC 00.000000r 1 ; * This work is dedicated to the memory of my dear hacking pal Michael "acidity" Kollmann. 00.000000r 1 00.000000r 1 .debuginfo + 00.000000r 1 00.000000r 1 .setcpu "6502" 00.000000r 1 .macpack longbranch 00.000000r 2 .macro jeq Target 00.000000r 2 .if .match(Target, 0) 00.000000r 2 bne *+5 00.000000r 2 jmp Target 00.000000r 2 .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) 00.000000r 2 beq Target 00.000000r 2 .else 00.000000r 2 bne *+5 00.000000r 2 jmp Target 00.000000r 2 .endif 00.000000r 2 .endmacro 00.000000r 2 .macro jne Target 00.000000r 2 .if .match(Target, 0) 00.000000r 2 beq *+5 00.000000r 2 jmp Target 00.000000r 2 .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) 00.000000r 2 bne Target 00.000000r 2 .else 00.000000r 2 beq *+5 00.000000r 2 jmp Target 00.000000r 2 .endif 00.000000r 2 .endmacro 00.000000r 2 .macro jmi Target 00.000000r 2 .if .match(Target, 0) 00.000000r 2 bpl *+5 00.000000r 2 jmp Target 00.000000r 2 .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) 00.000000r 2 bmi Target 00.000000r 2 .else 00.000000r 2 bpl *+5 00.000000r 2 jmp Target 00.000000r 2 .endif 00.000000r 2 .endmacro 00.000000r 2 .macro jpl Target 00.000000r 2 .if .match(Target, 0) 00.000000r 2 bmi *+5 00.000000r 2 jmp Target 00.000000r 2 .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) 00.000000r 2 bpl Target 00.000000r 2 .else 00.000000r 2 bmi *+5 00.000000r 2 jmp Target 00.000000r 2 .endif 00.000000r 2 .endmacro 00.000000r 2 .macro jcs Target 00.000000r 2 .if .match(Target, 0) 00.000000r 2 bcc *+5 00.000000r 2 jmp Target 00.000000r 2 .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) 00.000000r 2 bcs Target 00.000000r 2 .else 00.000000r 2 bcc *+5 00.000000r 2 jmp Target 00.000000r 2 .endif 00.000000r 2 .endmacro 00.000000r 2 .macro jcc Target 00.000000r 2 .if .match(Target, 0) 00.000000r 2 bcs *+5 00.000000r 2 jmp Target 00.000000r 2 .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) 00.000000r 2 bcc Target 00.000000r 2 .else 00.000000r 2 bcs *+5 00.000000r 2 jmp Target 00.000000r 2 .endif 00.000000r 2 .endmacro 00.000000r 2 .macro jvs Target 00.000000r 2 .if .match(Target, 0) 00.000000r 2 bvc *+5 00.000000r 2 jmp Target 00.000000r 2 .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) 00.000000r 2 bvs Target 00.000000r 2 .else 00.000000r 2 bvc *+5 00.000000r 2 jmp Target 00.000000r 2 .endif 00.000000r 2 .endmacro 00.000000r 2 .macro jvc Target 00.000000r 2 .if .match(Target, 0) 00.000000r 2 bvs *+5 00.000000r 2 jmp Target 00.000000r 2 .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) 00.000000r 2 bvc Target 00.000000r 2 .else 00.000000r 2 bvs *+5 00.000000r 2 jmp Target 00.000000r 2 .endif 00.000000r 2 .endmacro 00.000000r 2 00.000000r 1 00.000000r 1 .include "defines.s" 00.000000r 2 .if .def(cbmbasic1) 00.000000r 2 CBM1 := 1 00.000000r 2 .include "defines_cbm1.s" 00.000000r 2 .elseif .def(osi) 00.000000r 2 OSI := 1 00.000000r 2 .include "defines_osi.s" 00.000000r 2 .elseif .def(applesoft) 00.000000r 2 APPLE := 1 00.000000r 2 .include "defines_apple.s" 00.000000r 2 .elseif .def(kb9) 00.000000r 2 KIM := 1 00.000000r 2 .include "defines_kim.s" 00.000000r 3 ; configuration 00.000000r 3 CONFIG_11A := 1 00.000000r 3 00.000000r 3 CONFIG_MONCOUT_DESTROYS_Y := 1 00.000000r 3 CONFIG_NULL := 1 00.000000r 3 CONFIG_PRINT_CR := 1 ; print CR when line end reached 00.000000r 3 CONFIG_RAM := 1 00.000000r 3 CONFIG_ROR_WORKAROUND := 1 00.000000r 3 CONFIG_SAFE_NAMENOTFOUND := 1 00.000000r 3 CONFIG_SCRTCH_ORDER := 2 00.000000r 3 00.000000r 3 ; zero page 00.000000r 3 ZP_START1 = $00 00.000000r 3 ZP_START2 = $15 00.000000r 3 ZP_START3 = $0A 00.000000r 3 ZP_START4 = $63 00.000000r 3 00.000000r 3 ; constants 00.000000r 3 STACK_TOP := $FC 00.000000r 3 SPACE_FOR_GOSUB := $36 00.000000r 3 NULL_MAX := $F2 ; probably different in original version; the image I have seems to be modified; see PDF 00.000000r 3 WIDTH := 72 00.000000r 3 WIDTH2 := 56 00.000000r 3 00.000000r 3 ; magic memory locations 00.000000r 3 L1800 := $1800 00.000000r 3 L1873 := $1873 00.000000r 3 00.000000r 3 ; monitor functions 00.000000r 3 MONRDKEY := $1E5A 00.000000r 3 MONCOUT := $1EA0 00.000000r 3 00.000000r 3 00.000000r 2 .elseif .def(cbmbasic2) 00.000000r 2 CBM2 := 1 00.000000r 2 .include "defines_cbm2.s" 00.000000r 2 .elseif .def(kbdbasic) 00.000000r 2 KBD := 1 00.000000r 2 .include "defines_kbd.s" 00.000000r 2 .elseif .def(microtan) 00.000000r 2 MICROTAN := 1 00.000000r 2 .include "defines_microtan.s" 00.000000r 2 .endif 00.000000r 2 00.000000r 2 .ifdef CONFIG_2C 00.000000r 2 CONFIG_2B := 1 00.000000r 2 .endif 00.000000r 2 .ifdef CONFIG_2B 00.000000r 2 CONFIG_2A := 1 00.000000r 2 .endif 00.000000r 2 .ifdef CONFIG_2A 00.000000r 2 CONFIG_2 := 1 00.000000r 2 .endif 00.000000r 2 .ifdef CONFIG_2 00.000000r 2 CONFIG_11A := 1 00.000000r 2 .endif 00.000000r 2 .ifdef CONFIG_11A 00.000000r 2 CONFIG_11 := 1 00.000000r 2 .endif 00.000000r 2 .ifdef CONFIG_11 00.000000r 2 CONFIG_10A := 1 00.000000r 2 .endif 00.000000r 2 00.000000r 2 .ifdef CONFIG_SMALL 00.000000r 2 BYTES_FP := 4 00.000000r 2 .else 00.000000r 2 BYTES_FP := 5 00.000000r 2 .endif 00.000000r 2 00.000000r 2 .ifndef BYTES_PER_ELEMENT 00.000000r 2 BYTES_PER_ELEMENT := BYTES_FP 00.000000r 2 .endif 00.000000r 2 BYTES_PER_VARIABLE := BYTES_FP+2 00.000000r 2 MANTISSA_BYTES := BYTES_FP-1 00.000000r 2 BYTES_PER_FRAME := 2*BYTES_FP+8 00.000000r 2 FOR_STACK1 := 2*BYTES_FP+5 00.000000r 2 FOR_STACK2 := BYTES_FP+4 00.000000r 2 00.000000r 2 .ifndef MAX_EXPON 00.000000r 2 MAX_EXPON = 10 00.000000r 2 .endif 00.000000r 2 00.000000r 2 STACK := $0100 00.000000r 2 00.000000r 2 .ifdef INPUTBUFFER 00.000000r 2 .if INPUTBUFFER >= $0100 00.000000r 2 CONFIG_NO_INPUTBUFFER_ZP := 1 00.000000r 2 .endif 00.000000r 2 .if INPUTBUFFER = $0200 00.000000r 2 CONFIG_INPUTBUFFER_0200 := 1 00.000000r 2 .endif 00.000000r 2 .endif 00.000000r 2 INPUTBUFFERX = INPUTBUFFER & $FF00 00.000000r 2 00.000000r 2 CR=13 00.000000r 2 LF=10 00.000000r 2 00.000000r 2 .ifndef CRLF_1 00.000000r 2 CRLF_1 := CR 00.000000r 2 CRLF_2 := LF 00.000000r 2 .endif 00.000000r 2 00.000000r 2 00.000000r 2 00.000000r 2 00.000000r 1 .include "macros.s" 00.000000r 2 ; htasc - set the hi bit on the last byte of a string for termination 00.000000r 2 ; (by Tom Greene) 00.000000r 2 .macro htasc str 00.000000r 2 .repeat .strlen(str)-1,I 00.000000r 2 .byte .strat(str,I) 00.000000r 2 .endrep 00.000000r 2 .byte .strat(str,.strlen(str)-1) | $80 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 ; For every token, a byte gets put into segment "DUMMY". 00.000000r 2 ; This way, we count up with every token. The DUMMY segment 00.000000r 2 ; doesn't get linked into the binary. 00.000000r 2 .macro init_token_tables 00.000000r 2 .segment "VECTORS" 00.000000r 2 TOKEN_ADDRESS_TABLE: 00.000000r 2 .segment "KEYWORDS" 00.000000r 2 TOKEN_NAME_TABLE: 00.000000r 2 .segment "DUMMY" 00.000000r 2 DUMMY_START: 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 ; optionally define token symbol 00.000000r 2 ; count up token number 00.000000r 2 .macro define_token token 00.000000r 2 .segment "DUMMY" 00.000000r 2 .ifnblank token 00.000000r 2 token := <(*-DUMMY_START)+$80 00.000000r 2 .endif 00.000000r 2 .res 1; count up in any case 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 ; lay down a keyword, optionally define a token symbol 00.000000r 2 .macro keyword key, token 00.000000r 2 .segment "KEYWORDS" 00.000000r 2 htasc key 00.000000r 2 define_token token 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 ; lay down a keyword and an address (RTS style), 00.000000r 2 ; optionally define a token symbol 00.000000r 2 .macro keyword_rts key, vec, token 00.000000r 2 .segment "VECTORS" 00.000000r 2 .word vec-1 00.000000r 2 keyword key, token 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 ; lay down a keyword and an address, 00.000000r 2 ; optionally define a token symbol 00.000000r 2 .macro keyword_addr key, vec, token 00.000000r 2 .segment "VECTORS" 00.000000r 2 .addr vec 00.000000r 2 keyword key, token 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 .macro count_tokens 00.000000r 2 .segment "DUMMY" 00.000000r 2 NUM_TOKENS := <(*-DUMMY_START) 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 .macro init_error_table 00.000000r 2 .segment "ERROR" 00.000000r 2 ERROR_MESSAGES: 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 .macro define_error error, msg 00.000000r 2 .segment "ERROR" 00.000000r 2 error := <(*-ERROR_MESSAGES) 00.000000r 2 htasc msg 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 ;--------------------------------------------- 00.000000r 2 ; set the MSB of every byte of a string 00.000000r 2 .macro asc80 str 00.000000r 2 .repeat .strlen(str),I 00.000000r 2 .byte .strat(str,I)+$80 00.000000r 2 .endrep 00.000000r 2 .endmacro 00.000000r 2 00.000000r 2 00.000000r 1 .include "zeropage.s" 00.000000r 2 00.000000r 2 .feature org_per_seg 00.000000r 2 .zeropage 04.000000r 2 04.000000r 2 .org ZP_START1 000000 2 000000 2 GORESTART: 000000 2 xx xx xx .res 3 000003 2 GOSTROUT: 000003 2 xx xx xx .res 3 000006 2 GOAYINT: 000006 2 xx xx .res 2 000008 2 GOGIVEAYF: 000008 2 xx xx .res 2 00000A 2 00000A 2 .org ZP_START2 000015 2 Z15: 000015 2 xx .res 1 000016 2 .ifndef POSX; allow override 000016 2 POSX: 000016 2 .endif 000016 2 xx .res 1 000017 2 .ifndef Z17; allow override 000017 2 Z17: 000017 2 .endif 000017 2 xx .res 1 000018 2 .ifndef Z18; allow override 000018 2 Z18: 000018 2 .endif 000018 2 xx .res 1 000019 2 LINNUM: 000019 2 .ifndef TXPSV; allow override 000019 2 TXPSV: 000019 2 .endif 000019 2 xx xx .res 2 00001B 2 .ifndef INPUTBUFFER; allow override 00001B 2 INPUTBUFFER: 00001B 2 .endif 00001B 2 00001B 2 .org ZP_START3 00000A 2 00000A 2 CHARAC: 00000A 2 xx .res 1 00000B 2 ENDCHR: 00000B 2 xx .res 1 00000C 2 EOLPNTR: 00000C 2 xx .res 1 00000D 2 DIMFLG: 00000D 2 xx .res 1 00000E 2 VALTYP: 00000E 2 .ifdef CONFIG_SMALL 00000E 2 .res 1 00000E 2 .else 00000E 2 xx xx .res 2 000010 2 .endif 000010 2 DATAFLG: 000010 2 xx .res 1 000011 2 SUBFLG: 000011 2 xx .res 1 000012 2 INPUTFLG: 000012 2 xx .res 1 000013 2 CPRMASK: 000013 2 xx .res 1 000014 2 Z14: 000014 2 xx .res 1 000015 2 000015 2 .org ZP_START4 000063 2 000063 2 TEMPPT: 000063 2 xx .res 1 000064 2 LASTPT: 000064 2 xx xx .res 2 000066 2 TEMPST: 000066 2 xx xx xx xx .res 9 00006A 2 xx xx xx xx 00006E 2 xx 00006F 2 INDEX: 00006F 2 xx xx .res 2 000071 2 DEST: 000071 2 xx xx .res 2 000073 2 RESULT: 000073 2 xx xx xx xx .res BYTES_FP 000077 2 xx 000078 2 RESULT_LAST = RESULT + BYTES_FP-1 000078 2 TXTTAB: 000078 2 xx xx .res 2 00007A 2 VARTAB: 00007A 2 xx xx .res 2 00007C 2 ARYTAB: 00007C 2 xx xx .res 2 00007E 2 STREND: 00007E 2 xx xx .res 2 000080 2 FRETOP: 000080 2 xx xx .res 2 000082 2 FRESPC: 000082 2 xx xx .res 2 000084 2 MEMSIZ: 000084 2 xx xx .res 2 000086 2 CURLIN: 000086 2 xx xx .res 2 000088 2 OLDLIN: 000088 2 xx xx .res 2 00008A 2 OLDTEXT: 00008A 2 xx xx .res 2 00008C 2 Z8C: 00008C 2 xx xx .res 2 00008E 2 DATPTR: 00008E 2 xx xx .res 2 000090 2 INPTR: 000090 2 xx xx .res 2 000092 2 VARNAM: 000092 2 xx xx .res 2 000094 2 VARPNT: 000094 2 xx xx .res 2 000096 2 FORPNT: 000096 2 xx xx .res 2 000098 2 LASTOP: 000098 2 xx xx .res 2 00009A 2 CPRTYP: 00009A 2 xx .res 1 00009B 2 FNCNAM: 00009B 2 TEMP3: 00009B 2 xx xx .res 2 00009D 2 DSCPTR: 00009D 2 .ifdef CONFIG_SMALL 00009D 2 .res 2 00009D 2 .else 00009D 2 xx xx xx .res 3 0000A0 2 .endif 0000A0 2 DSCLEN: 0000A0 2 xx xx .res 2 0000A2 2 .ifndef JMPADRS ; allow override 0000A2 2 JMPADRS := DSCLEN + 1 0000A2 2 .endif 0000A2 2 Z52: 0000A2 2 xx .res 1 0000A3 2 ARGEXTENSION: 0000A3 2 .ifndef CONFIG_SMALL 0000A3 2 xx .res 1 0000A4 2 .endif 0000A4 2 TEMP1: 0000A4 2 xx .res 1 0000A5 2 HIGHDS: 0000A5 2 xx xx .res 2 0000A7 2 HIGHTR: 0000A7 2 xx xx .res 2 0000A9 2 .ifndef CONFIG_SMALL 0000A9 2 TEMP2: 0000A9 2 xx .res 1 0000AA 2 .endif 0000AA 2 INDX: 0000AA 2 TMPEXP: 0000AA 2 .ifdef CONFIG_SMALL 0000AA 2 TEMP2: 0000AA 2 .endif 0000AA 2 xx .res 1 0000AB 2 EXPON: 0000AB 2 xx .res 1 0000AC 2 LOWTR: 0000AC 2 .ifndef LOWTRX ; allow override 0000AC 2 LOWTRX: 0000AC 2 .endif 0000AC 2 xx .res 1 0000AD 2 EXPSGN: 0000AD 2 xx .res 1 0000AE 2 FAC: 0000AE 2 xx xx xx xx .res BYTES_FP 0000B2 2 xx 0000B3 2 FAC_LAST = FAC + BYTES_FP-1 0000B3 2 FACSIGN: 0000B3 2 xx .res 1 0000B4 2 SERLEN: 0000B4 2 xx .res 1 0000B5 2 SHIFTSIGNEXT: 0000B5 2 xx .res 1 0000B6 2 ARG: 0000B6 2 xx xx xx xx .res BYTES_FP 0000BA 2 xx 0000BB 2 ARG_LAST = ARG + BYTES_FP-1 0000BB 2 ARGSIGN: 0000BB 2 xx .res 1 0000BC 2 STRNG1: 0000BC 2 xx xx .res 2 0000BE 2 SGNCPR = STRNG1 0000BE 2 FACEXTENSION = STRNG1+1 0000BE 2 STRNG2: 0000BE 2 xx xx .res 2 0000C0 2 CHRGET: 0000C0 2 TXTPTR = <(GENERIC_TXTPTR-GENERIC_CHRGET + CHRGET) 0000C0 2 CHRGOT = <(GENERIC_CHRGOT-GENERIC_CHRGET + CHRGET) 0000C0 2 CHRGOT2 = <(GENERIC_CHRGOT2-GENERIC_CHRGET + CHRGET) 0000C0 2 RNDSEED = <(GENERIC_RNDSEED-GENERIC_CHRGET + CHRGET) 0000C0 2 0000C0 2 0000C0 2 0000C0 1 0000C0 1 .include "header.s" 0000C0 2 .segment "HEADER" 06.000000r 2 .ifdef KBD 06.000000r 2 jmp LE68C 06.000000r 2 .byte $00,$13,$56 06.000000r 2 .endif 06.000000r 2 06.000000r 1 .include "token.s" 06.000000r 2 init_token_tables 09.000000r 2 09.000000r 2 rr rr 45 4E keyword_rts "END", END 09.000004r 2 C4 xx 09.000001r 2 rr rr 46 4F keyword_rts "FOR", FOR 09.000005r 2 D2 xx 09.000002r 2 rr rr 4E 45 keyword_rts "NEXT", NEXT 09.000006r 2 58 D4 xx 09.000003r 2 rr rr 44 41 keyword_rts "DATA", DATA 09.000007r 2 54 C1 xx 09.000004r 2 .ifdef CONFIG_FILE 09.000004r 2 keyword_rts "INPUT#", INPUTH 09.000004r 2 .endif 09.000004r 2 rr rr 49 4E keyword_rts "INPUT", INPUT 09.000008r 2 50 55 D4 xx 09.000005r 2 rr rr 44 49 keyword_rts "DIM", DIM 09.000009r 2 CD xx 09.000006r 2 rr rr 52 45 keyword_rts "READ", READ 09.00000Ar 2 41 C4 xx 09.000007r 2 .ifdef APPLE 09.000007r 2 keyword_rts "PLT", PLT 09.000007r 2 .else 09.000007r 2 rr rr 4C 45 keyword_rts "LET", LET 09.00000Br 2 D4 xx 09.000008r 2 .endif 09.000008r 2 rr rr 47 4F keyword_rts "GOTO", GOTO, TOKEN_GOTO 09.00000Cr 2 54 CF xx 09.000009r 2 rr rr 52 55 keyword_rts "RUN", RUN 09.00000Dr 2 CE xx 09.00000Ar 2 rr rr 49 C6 keyword_rts "IF", IF 09.00000Er 2 xx 09.00000Br 2 rr rr 52 45 keyword_rts "RESTORE", RESTORE 09.00000Fr 2 53 54 4F 52 09.000013r 2 C5 xx 09.00000Cr 2 rr rr 47 4F keyword_rts "GOSUB", GOSUB, TOKEN_GOSUB 09.000010r 2 53 55 C2 xx 09.00000Dr 2 rr rr 52 45 keyword_rts "RETURN", POP 09.000011r 2 54 55 52 CE 09.000015r 2 xx 09.00000Er 2 .ifdef APPLE 09.00000Er 2 keyword_rts "TEX", TEX, TOKEN_REM 09.00000Er 2 .else 09.00000Er 2 rr rr 52 45 keyword_rts "REM", REM, TOKEN_REM 09.000012r 2 CD xx 09.00000Fr 2 .endif 09.00000Fr 2 rr rr 53 54 keyword_rts "STOP", STOP 09.000013r 2 4F D0 xx 09.000010r 2 rr rr 4F CE keyword_rts "ON", ON 09.000014r 2 xx 09.000011r 2 .ifdef CONFIG_NULL 09.000011r 2 rr rr 4E 55 keyword_rts "NULL", NULL 09.000015r 2 4C CC xx 09.000012r 2 .endif 09.000012r 2 .ifdef KBD 09.000012r 2 keyword_rts "PLOD", PLOD 09.000012r 2 keyword_rts "PSAV", PSAV 09.000012r 2 keyword_rts "VLOD", VLOD 09.000012r 2 keyword_rts "VSAV", VSAV 09.000012r 2 .endif 09.000012r 2 .ifndef CONFIG_NO_POKE 09.000012r 2 rr rr 57 41 keyword_rts "WAIT", WAIT 09.000016r 2 49 D4 xx 09.000013r 2 .endif 09.000013r 2 .ifndef KBD 09.000013r 2 rr rr 4C 4F keyword_rts "LOAD", LOAD 09.000017r 2 41 C4 xx 09.000014r 2 rr rr 53 41 keyword_rts "SAVE", SAVE 09.000018r 2 56 C5 xx 09.000015r 2 .endif 09.000015r 2 .ifdef CONFIG_CBM_ALL 09.000015r 2 keyword_rts "VERIFY", VERIFY 09.000015r 2 .endif 09.000015r 2 rr rr 44 45 keyword_rts "DEF", DEF 09.000019r 2 C6 xx 09.000016r 2 .ifdef KBD 09.000016r 2 keyword_rts "SLOD", SLOD 09.000016r 2 .endif 09.000016r 2 .ifndef CONFIG_NO_POKE 09.000016r 2 rr rr 50 4F keyword_rts "POKE", POKE 09.00001Ar 2 4B C5 xx 09.000017r 2 .endif 09.000017r 2 .ifdef CONFIG_FILE 09.000017r 2 keyword_rts "PRINT#", PRINTH 09.000017r 2 .endif 09.000017r 2 rr rr 50 52 keyword_rts "PRINT", PRINT, TOKEN_PRINT 09.00001Br 2 49 4E D4 xx 09.000018r 2 rr rr 43 4F keyword_rts "CONT", CONT 09.00001Cr 2 4E D4 xx 09.000019r 2 rr rr 4C 49 keyword_rts "LIST", LIST 09.00001Dr 2 53 D4 xx 09.00001Ar 2 .ifdef CONFIG_CBM_ALL 09.00001Ar 2 keyword_rts "CLR", CLEAR 09.00001Ar 2 .else 09.00001Ar 2 rr rr 43 4C keyword_rts "CLEAR", CLEAR 09.00001Er 2 45 41 D2 xx 09.00001Br 2 .endif 09.00001Br 2 .ifdef CONFIG_FILE 09.00001Br 2 keyword_rts "CMD", CMD 09.00001Br 2 keyword_rts "SYS", SYS 09.00001Br 2 keyword_rts "OPEN", OPEN 09.00001Br 2 keyword_rts "CLOSE", CLOSE 09.00001Br 2 .endif 09.00001Br 2 .ifndef CONFIG_SMALL 09.00001Br 2 rr rr 47 45 keyword_rts "GET", GET 09.00001Fr 2 D4 xx 09.00001Cr 2 .endif 09.00001Cr 2 .ifdef KBD 09.00001Cr 2 keyword_rts "PRT", PRT 09.00001Cr 2 .endif 09.00001Cr 2 rr rr 4E 45 keyword_rts "NEW", NEW 09.000020r 2 D7 xx 09.00001Dr 2 09.00001Dr 2 count_tokens 09.00001Dr 2 09.00001Dr 2 54 41 42 A8 keyword "TAB(", TOKEN_TAB 09.000021r 2 xx 09.00001Er 2 54 CF xx keyword "TO", TOKEN_TO 09.00001Fr 2 46 CE xx keyword "FN", TOKEN_FN 09.000020r 2 53 50 43 A8 keyword "SPC(", TOKEN_SPC 09.000024r 2 xx 09.000021r 2 54 48 45 CE keyword "THEN", TOKEN_THEN 09.000025r 2 xx 09.000022r 2 4E 4F D4 xx keyword "NOT", TOKEN_NOT 09.000023r 2 53 54 45 D0 keyword "STEP", TOKEN_STEP 09.000027r 2 xx 09.000024r 2 AB xx keyword "+", TOKEN_PLUS 09.000025r 2 AD xx keyword "-", TOKEN_MINUS 09.000026r 2 AA xx keyword "*" 09.000027r 2 AF xx keyword "/" 09.000028r 2 .ifdef KBD 09.000028r 2 keyword "#" 09.000028r 2 .else 09.000028r 2 DE xx keyword "^" 09.000029r 2 .endif 09.000029r 2 41 4E C4 xx keyword "AND" 09.00002Ar 2 4F D2 xx keyword "OR" 09.00002Br 2 BE xx keyword ">", TOKEN_GREATER 09.00002Cr 2 BD xx keyword "=", TOKEN_EQUAL 09.00002Dr 2 BC xx keyword "<" 09.00002Er 2 09.00002Er 2 .segment "VECTORS" 07.00003Ar 2 UNFNC: 07.00003Ar 2 07.00003Ar 2 rr rr 53 47 keyword_addr "SGN", SGN, TOKEN_SGN 07.00003Er 2 CE xx 09.00002Fr 2 rr rr 49 4E keyword_addr "INT", INT 09.000033r 2 D4 xx 09.000030r 2 rr rr 41 42 keyword_addr "ABS", ABS 09.000034r 2 D3 xx 09.000031r 2 .ifdef KBD 09.000031r 2 keyword_addr "VER", VER 09.000031r 2 .endif 09.000031r 2 .ifndef CONFIG_NO_POKE 09.000031r 2 .ifdef CONFIG_RAM 09.000031r 2 rr rr 55 53 keyword_addr "USR", IQERR 09.000035r 2 D2 xx 09.000032r 2 .else 09.000032r 2 keyword_addr "USR", USR 09.000032r 2 .endif 09.000032r 2 .endif 09.000032r 2 rr rr 46 52 keyword_addr "FRE", FRE 09.000036r 2 C5 xx 09.000033r 2 rr rr 50 4F keyword_addr "POS", POS 09.000037r 2 D3 xx 09.000034r 2 rr rr 53 51 keyword_addr "SQR", SQR 09.000038r 2 D2 xx 09.000035r 2 rr rr 52 4E keyword_addr "RND", RND 09.000039r 2 C4 xx 09.000036r 2 rr rr 4C 4F keyword_addr "LOG", LOG 09.00003Ar 2 C7 xx 09.000037r 2 rr rr 45 58 keyword_addr "EXP", EXP 09.00003Br 2 D0 xx 09.000038r 2 .segment "VECTORS" 07.00004Er 2 UNFNC_COS: 07.00004Er 2 rr rr 43 4F keyword_addr "COS", COS 07.000052r 2 D3 xx 09.000039r 2 .segment "VECTORS" 07.000050r 2 UNFNC_SIN: 07.000050r 2 rr rr 53 49 keyword_addr "SIN", SIN 07.000054r 2 CE xx 09.00003Ar 2 .segment "VECTORS" 07.000052r 2 UNFNC_TAN: 07.000052r 2 rr rr 54 41 keyword_addr "TAN", TAN 07.000056r 2 CE xx 09.00003Br 2 .segment "VECTORS" 07.000054r 2 UNFNC_ATN: 07.000054r 2 rr rr 41 54 keyword_addr "ATN", ATN 07.000058r 2 CE xx 09.00003Cr 2 .ifdef KBD 09.00003Cr 2 keyword_addr "GETC", GETC 09.00003Cr 2 .endif 09.00003Cr 2 .ifndef CONFIG_NO_POKE 09.00003Cr 2 rr rr 50 45 keyword_addr "PEEK", PEEK 09.000040r 2 45 CB xx 09.00003Dr 2 .endif 09.00003Dr 2 rr rr 4C 45 keyword_addr "LEN", LEN 09.000041r 2 CE xx 09.00003Er 2 rr rr 53 54 keyword_addr "STR$", STR 09.000042r 2 52 A4 xx 09.00003Fr 2 rr rr 56 41 keyword_addr "VAL", VAL 09.000043r 2 CC xx 09.000040r 2 rr rr 41 53 keyword_addr "ASC", ASC 09.000044r 2 C3 xx 09.000041r 2 rr rr 43 48 keyword_addr "CHR$", CHRSTR 09.000045r 2 52 A4 xx 09.000042r 2 rr rr 4C 45 keyword_addr "LEFT$", LEFTSTR, TOKEN_LEFTSTR 09.000046r 2 46 54 A4 xx 09.000043r 2 rr rr 52 49 keyword_addr "RIGHT$", RIGHTSTR 09.000047r 2 47 48 54 A4 09.00004Br 2 xx 09.000044r 2 rr rr 4D 49 keyword_addr "MID$", MIDSTR 09.000048r 2 44 A4 xx 09.000045r 2 .ifdef CONFIG_2 09.000045r 2 keyword "GO", TOKEN_GO 09.000045r 2 .endif 09.000045r 2 .segment "KEYWORDS" 08.0000E2r 2 00 .byte 0 08.0000E3r 2 08.0000E3r 2 .segment "VECTORS" 07.000068r 2 MATHTBL: 07.000068r 2 79 .byte $79 07.000069r 2 rr rr .word FADDT-1 07.00006Br 2 79 .byte $79 07.00006Cr 2 rr rr .word FSUBT-1 07.00006Er 2 7B .byte $7B 07.00006Fr 2 rr rr .word FMULTT-1 07.000071r 2 7B .byte $7B 07.000072r 2 rr rr .word FDIVT-1 07.000074r 2 7F .byte $7F 07.000075r 2 rr rr .word FPWRT-1 07.000077r 2 50 .byte $50 07.000078r 2 rr rr .word TAND-1 07.00007Ar 2 46 .byte $46 07.00007Br 2 rr rr .word OR-1 07.00007Dr 2 7D .byte $7D 07.00007Er 2 rr rr .word NEGOP-1 07.000080r 2 5A .byte $5A 07.000081r 2 rr rr .word EQUOP-1 07.000083r 2 64 .byte $64 07.000084r 2 rr rr .word RELOPS-1 07.000086r 2 07.000086r 1 .include "error.s" 07.000086r 2 init_error_table 0A.000000r 2 0A.000000r 2 .ifdef CONFIG_SMALL 0A.000000r 2 define_error ERR_NOFOR, "NF" 0A.000000r 2 define_error ERR_SYNTAX, "SN" 0A.000000r 2 define_error ERR_NOGOSUB, "RG" 0A.000000r 2 define_error ERR_NODATA, "OD" 0A.000000r 2 define_error ERR_ILLQTY, "FC" 0A.000000r 2 define_error ERR_OVERFLOW, "OV" 0A.000000r 2 define_error ERR_MEMFULL, "OM" 0A.000000r 2 define_error ERR_UNDEFSTAT, "US" 0A.000000r 2 define_error ERR_BADSUBS, "BS" 0A.000000r 2 define_error ERR_REDIMD, "DD" 0A.000000r 2 define_error ERR_ZERODIV, "/0" 0A.000000r 2 define_error ERR_ILLDIR, "ID" 0A.000000r 2 define_error ERR_BADTYPE, "TM" 0A.000000r 2 define_error ERR_STRLONG, "LS" 0A.000000r 2 define_error ERR_FRMCPX, "ST" 0A.000000r 2 define_error ERR_CANTCONT, "CN" 0A.000000r 2 define_error ERR_UNDEFFN, "UF" 0A.000000r 2 .else 0A.000000r 2 4E 45 58 54 define_error ERR_NOFOR, "NEXT WITHOUT FOR" 0A.000004r 2 20 57 49 54 0A.000008r 2 48 4F 55 54 0A.000010r 2 53 59 4E 54 define_error ERR_SYNTAX, "SYNTAX" 0A.000014r 2 41 D8 0A.000016r 2 52 45 54 55 define_error ERR_NOGOSUB, "RETURN WITHOUT GOSUB" 0A.00001Ar 2 52 4E 20 57 0A.00001Er 2 49 54 48 4F 0A.00002Ar 2 4F 55 54 20 define_error ERR_NODATA, "OUT OF DATA" 0A.00002Er 2 4F 46 20 44 0A.000032r 2 41 54 C1 0A.000035r 2 49 4C 4C 45 define_error ERR_ILLQTY, "ILLEGAL QUANTITY" 0A.000039r 2 47 41 4C 20 0A.00003Dr 2 51 55 41 4E 0A.000045r 2 .ifdef CBM1 0A.000045r 2 .byte 0,0,0,0,0 0A.000045r 2 .endif 0A.000045r 2 4F 56 45 52 define_error ERR_OVERFLOW, "OVERFLOW" 0A.000049r 2 46 4C 4F D7 0A.00004Dr 2 4F 55 54 20 define_error ERR_MEMFULL, "OUT OF MEMORY" 0A.000051r 2 4F 46 20 4D 0A.000055r 2 45 4D 4F 52 0A.00005Ar 2 55 4E 44 45 define_error ERR_UNDEFSTAT, "UNDEF'D STATEMENT" 0A.00005Er 2 46 27 44 20 0A.000062r 2 53 54 41 54 0A.00006Br 2 42 41 44 20 define_error ERR_BADSUBS, "BAD SUBSCRIPT" 0A.00006Fr 2 53 55 42 53 0A.000073r 2 43 52 49 50 0A.000078r 2 52 45 44 49 define_error ERR_REDIMD, "REDIM'D ARRAY" 0A.00007Cr 2 4D 27 44 20 0A.000080r 2 41 52 52 41 0A.000085r 2 44 49 56 49 define_error ERR_ZERODIV, "DIVISION BY ZERO" 0A.000089r 2 53 49 4F 4E 0A.00008Dr 2 20 42 59 20 0A.000095r 2 49 4C 4C 45 define_error ERR_ILLDIR, "ILLEGAL DIRECT" 0A.000099r 2 47 41 4C 20 0A.00009Dr 2 44 49 52 45 0A.0000A3r 2 54 59 50 45 define_error ERR_BADTYPE, "TYPE MISMATCH" 0A.0000A7r 2 20 4D 49 53 0A.0000ABr 2 4D 41 54 43 0A.0000B0r 2 53 54 52 49 define_error ERR_STRLONG, "STRING TOO LONG" 0A.0000B4r 2 4E 47 20 54 0A.0000B8r 2 4F 4F 20 4C 0A.0000BFr 2 .ifdef CONFIG_FILE 0A.0000BFr 2 .ifdef CBM1 0A.0000BFr 2 define_error ERR_BADDATA, "BAD DATA" 0A.0000BFr 2 .else 0A.0000BFr 2 define_error ERR_BADDATA, "FILE DATA" 0A.0000BFr 2 .endif 0A.0000BFr 2 .endif 0A.0000BFr 2 46 4F 52 4D define_error ERR_FRMCPX, "FORMULA TOO COMPLEX" 0A.0000C3r 2 55 4C 41 20 0A.0000C7r 2 54 4F 4F 20 0A.0000D2r 2 43 41 4E 27 define_error ERR_CANTCONT, "CAN'T CONTINUE" 0A.0000D6r 2 54 20 43 4F 0A.0000DAr 2 4E 54 49 4E 0A.0000E0r 2 55 4E 44 45 define_error ERR_UNDEFFN, "UNDEF'D FUNCTION" 0A.0000E4r 2 46 27 44 20 0A.0000E8r 2 46 55 4E 43 0A.0000F0r 2 .endif 0A.0000F0r 2 0A.0000F0r 1 .include "message.s" 0A.0000F0r 2 ; global messages: "error", "in", "ready", "break" 0A.0000F0r 2 0A.0000F0r 2 .segment "CODE" 00.000000r 2 00.000000r 2 QT_ERROR: 00.000000r 2 .ifdef KBD 00.000000r 2 .byte " err" 00.000000r 2 .else 00.000000r 2 .ifdef APPLE 00.000000r 2 .byte " ERR" 00.000000r 2 .byte $07,$07 00.000000r 2 .else 00.000000r 2 20 45 52 52 .byte " ERROR" 00.000004r 2 4F 52 00.000006r 2 .endif 00.000006r 2 .endif 00.000006r 2 00 .byte 0 00.000007r 2 00.000007r 2 .ifndef KBD 00.000007r 2 QT_IN: 00.000007r 2 20 49 4E 20 .byte " IN " 00.00000Br 2 00 .byte $00 00.00000Cr 2 .endif 00.00000Cr 2 00.00000Cr 2 .ifdef KBD 00.00000Cr 2 .byte $54,$D2 ; ??? 00.00000Cr 2 OKPRT: 00.00000Cr 2 jsr PRIMM 00.00000Cr 2 .byte CR,CR,">>",CR,LF 00.00000Cr 2 .byte 0 00.00000Cr 2 rts 00.00000Cr 2 nop 00.00000Cr 2 .else 00.00000Cr 2 QT_OK: 00.00000Cr 2 .ifdef CONFIG_CBM_ALL 00.00000Cr 2 .byte CR,LF,"READY.",CR,LF 00.00000Cr 2 .else 00.00000Cr 2 .ifdef APPLE 00.00000Cr 2 ; binary patch! 00.00000Cr 2 .byte CR,0,0,"K",CR,LF 00.00000Cr 2 .else 00.00000Cr 2 0D 0A 4F 4B .byte CR,LF,"OK",CR,LF 00.000010r 2 0D 0A 00.000012r 2 .endif 00.000012r 2 .endif 00.000012r 2 00 .byte 0 00.000013r 2 .endif 00.000013r 2 00.000013r 2 QT_BREAK: 00.000013r 2 00.000013r 2 .ifdef KBD 00.000013r 2 .byte CR,LF," Brk" 00.000013r 2 .byte 0 00.000013r 2 .byte $54,$D0 ; ??? 00.000013r 2 .elseif .def(MICROTAN) 00.000013r 2 .byte CR,LF," BREAK" 00.000013r 2 .byte 0 00.000013r 2 .else 00.000013r 2 0D 0A 42 52 .byte CR,LF,"BREAK" 00.000017r 2 45 41 4B 00.00001Ar 2 00 .byte 0 00.00001Br 2 .endif 00.00001Br 2 00.00001Br 1 .include "memory.s" 00.00001Br 2 ; generic stack and memory management code 00.00001Br 2 ; this code is identical across all versions of 00.00001Br 2 ; BASIC 00.00001Br 2 00.00001Br 2 .segment "CODE" 00.00001Br 2 00.00001Br 2 ; ---------------------------------------------------------------------------- 00.00001Br 2 ; CALLED BY "NEXT" AND "FOR" TO SCAN THROUGH 00.00001Br 2 ; THE STACK FOR A FRAME WITH THE SAME VARIABLE. 00.00001Br 2 ; 00.00001Br 2 ; (FORPNT) = ADDRESS OF VARIABLE IF "FOR" OR "NEXT" 00.00001Br 2 ; = $XXFF IF CALLED FROM "RETURN" 00.00001Br 2 ; <<< BUG: SHOULD BE $FFXX >>> 00.00001Br 2 ; 00.00001Br 2 ; RETURNS .NE. IF VARIABLE NOT FOUND, 00.00001Br 2 ; (X) = STACK PNTR AFTER SKIPPING ALL FRAMES 00.00001Br 2 ; 00.00001Br 2 ; .EQ. IF FOUND 00.00001Br 2 ; (X) = STACK PNTR OF FRAME FOUND 00.00001Br 2 ; ---------------------------------------------------------------------------- 00.00001Br 2 GTFORPNT: 00.00001Br 2 BA tsx 00.00001Cr 2 E8 inx 00.00001Dr 2 E8 inx 00.00001Er 2 E8 inx 00.00001Fr 2 E8 inx 00.000020r 2 L2279: 00.000020r 2 BD 01 01 lda STACK+1,x 00.000023r 2 C9 81 cmp #$81 00.000025r 2 D0 21 bne L22A1 00.000027r 2 A5 97 lda FORPNT+1 00.000029r 2 D0 0A bne L228E 00.00002Br 2 BD 02 01 lda STACK+2,x 00.00002Er 2 85 96 sta FORPNT 00.000030r 2 BD 03 01 lda STACK+3,x 00.000033r 2 85 97 sta FORPNT+1 00.000035r 2 L228E: 00.000035r 2 DD 03 01 cmp STACK+3,x 00.000038r 2 D0 07 bne L229A 00.00003Ar 2 A5 96 lda FORPNT 00.00003Cr 2 DD 02 01 cmp STACK+2,x 00.00003Fr 2 F0 07 beq L22A1 00.000041r 2 L229A: 00.000041r 2 8A txa 00.000042r 2 18 clc 00.000043r 2 69 12 adc #BYTES_PER_FRAME 00.000045r 2 AA tax 00.000046r 2 D0 D8 bne L2279 00.000048r 2 L22A1: 00.000048r 2 60 rts 00.000049r 2 00.000049r 2 ; ---------------------------------------------------------------------------- 00.000049r 2 ; MOVE BLOCK OF MEMORY UP 00.000049r 2 ; 00.000049r 2 ; ON ENTRY: 00.000049r 2 ; (Y,A) = (HIGHDS) = DESTINATION END+1 00.000049r 2 ; (LOWTR) = LOWEST ADDRESS OF SOURCE 00.000049r 2 ; (HIGHTR) = HIGHEST SOURCE ADDRESS+1 00.000049r 2 ; ---------------------------------------------------------------------------- 00.000049r 2 BLTU: 00.000049r 2 20 rr rr jsr REASON 00.00004Cr 2 85 7E sta STREND 00.00004Er 2 84 7F sty STREND+1 00.000050r 2 BLTU2: 00.000050r 2 38 sec 00.000051r 2 A5 A7 lda HIGHTR 00.000053r 2 E5 AC sbc LOWTR 00.000055r 2 85 6F sta INDEX 00.000057r 2 A8 tay 00.000058r 2 A5 A8 lda HIGHTR+1 00.00005Ar 2 E5 AD sbc LOWTR+1 00.00005Cr 2 AA tax 00.00005Dr 2 E8 inx 00.00005Er 2 98 tya 00.00005Fr 2 F0 23 beq L22DD 00.000061r 2 A5 A7 lda HIGHTR 00.000063r 2 38 sec 00.000064r 2 E5 6F sbc INDEX 00.000066r 2 85 A7 sta HIGHTR 00.000068r 2 B0 03 bcs L22C6 00.00006Ar 2 C6 A8 dec HIGHTR+1 00.00006Cr 2 38 sec 00.00006Dr 2 L22C6: 00.00006Dr 2 A5 A5 lda HIGHDS 00.00006Fr 2 E5 6F sbc INDEX 00.000071r 2 85 A5 sta HIGHDS 00.000073r 2 B0 08 bcs L22D6 00.000075r 2 C6 A6 dec HIGHDS+1 00.000077r 2 90 04 bcc L22D6 00.000079r 2 L22D2: 00.000079r 2 B1 A7 lda (HIGHTR),y 00.00007Br 2 91 A5 sta (HIGHDS),y 00.00007Dr 2 L22D6: 00.00007Dr 2 88 dey 00.00007Er 2 D0 F9 bne L22D2 00.000080r 2 B1 A7 lda (HIGHTR),y 00.000082r 2 91 A5 sta (HIGHDS),y 00.000084r 2 L22DD: 00.000084r 2 C6 A8 dec HIGHTR+1 00.000086r 2 C6 A6 dec HIGHDS+1 00.000088r 2 CA dex 00.000089r 2 D0 F2 bne L22D6 00.00008Br 2 60 rts 00.00008Cr 2 00.00008Cr 2 ; ---------------------------------------------------------------------------- 00.00008Cr 2 ; CHECK IF ENOUGH ROOM LEFT ON STACK 00.00008Cr 2 ; FOR "FOR", "GOSUB", OR EXPRESSION EVALUATION 00.00008Cr 2 ; ---------------------------------------------------------------------------- 00.00008Cr 2 CHKMEM: 00.00008Cr 2 0A asl a 00.00008Dr 2 69 36 adc #SPACE_FOR_GOSUB 00.00008Fr 2 B0 35 bcs MEMERR 00.000091r 2 85 6F sta INDEX 00.000093r 2 BA tsx 00.000094r 2 E4 6F cpx INDEX 00.000096r 2 90 2E bcc MEMERR 00.000098r 2 60 rts 00.000099r 2 00.000099r 2 ; ---------------------------------------------------------------------------- 00.000099r 2 ; CHECK IF ENOUGH ROOM BETWEEN ARRAYS AND STRINGS 00.000099r 2 ; (Y,A) = ADDR ARRAYS NEED TO GROW TO 00.000099r 2 ; ---------------------------------------------------------------------------- 00.000099r 2 REASON: 00.000099r 2 C4 81 cpy FRETOP+1 00.00009Br 2 90 28 bcc L231E 00.00009Dr 2 D0 04 bne L22FC 00.00009Fr 2 C5 80 cmp FRETOP 00.0000A1r 2 90 22 bcc L231E 00.0000A3r 2 L22FC: 00.0000A3r 2 48 pha 00.0000A4r 2 A2 09 ldx #FAC-TEMP1-1 00.0000A6r 2 98 tya 00.0000A7r 2 L2300: 00.0000A7r 2 48 pha 00.0000A8r 2 B5 A4 lda TEMP1,x 00.0000AAr 2 CA dex 00.0000ABr 2 10 FA bpl L2300 00.0000ADr 2 20 rr rr jsr GARBAG 00.0000B0r 2 A2 F7 ldx #<(TEMP1-FAC+1) 00.0000B2r 2 L230B: 00.0000B2r 2 68 pla 00.0000B3r 2 95 AE sta FAC,x 00.0000B5r 2 E8 inx 00.0000B6r 2 30 FA bmi L230B 00.0000B8r 2 68 pla 00.0000B9r 2 A8 tay 00.0000BAr 2 68 pla 00.0000BBr 2 C4 81 cpy FRETOP+1 00.0000BDr 2 90 06 bcc L231E 00.0000BFr 2 D0 05 bne MEMERR 00.0000C1r 2 C5 80 cmp FRETOP 00.0000C3r 2 B0 01 bcs MEMERR 00.0000C5r 2 L231E: 00.0000C5r 2 60 rts 00.0000C6r 2 00.0000C6r 1 .include "program.s" 00.0000C6r 2 ; error 00.0000C6r 2 ; line input, line editing 00.0000C6r 2 ; tokenize 00.0000C6r 2 ; detokenize 00.0000C6r 2 ; BASIC program memory management 00.0000C6r 2 00.0000C6r 2 ; MICROTAN has some nonstandard extension to LIST here 00.0000C6r 2 00.0000C6r 2 .segment "CODE" 00.0000C6r 2 00.0000C6r 2 MEMERR: 00.0000C6r 2 A2 4D ldx #ERR_MEMFULL 00.0000C8r 2 00.0000C8r 2 ; ---------------------------------------------------------------------------- 00.0000C8r 2 ; HANDLE AN ERROR 00.0000C8r 2 ; 00.0000C8r 2 ; (X)=OFFSET IN ERROR MESSAGE TABLE 00.0000C8r 2 ; (ERRFLG) > 128 IF "ON ERR" TURNED ON 00.0000C8r 2 ; (CURLIN+1) = $FF IF IN DIRECT MODE 00.0000C8r 2 ; ---------------------------------------------------------------------------- 00.0000C8r 2 ERROR: 00.0000C8r 2 46 14 lsr Z14 00.0000CAr 2 .ifdef CONFIG_FILE 00.0000CAr 2 lda CURDVC ; output 00.0000CAr 2 beq LC366 ; is screen 00.0000CAr 2 jsr CLRCH ; otherwise redirect output back to screen 00.0000CAr 2 lda #$00 00.0000CAr 2 sta CURDVC 00.0000CAr 2 LC366: 00.0000CAr 2 .endif 00.0000CAr 2 20 rr rr jsr CRDO 00.0000CDr 2 20 rr rr jsr OUTQUES 00.0000D0r 2 L2329: 00.0000D0r 2 BD rr rr lda ERROR_MESSAGES,x 00.0000D3r 2 .ifndef CONFIG_SMALL 00.0000D3r 2 48 pha 00.0000D4r 2 29 7F and #$7F 00.0000D6r 2 .endif 00.0000D6r 2 20 rr rr jsr OUTDO 00.0000D9r 2 .ifdef CONFIG_SMALL 00.0000D9r 2 lda ERROR_MESSAGES+1,x 00.0000D9r 2 .ifdef KBD 00.0000D9r 2 and #$7F 00.0000D9r 2 .endif 00.0000D9r 2 jsr OUTDO 00.0000D9r 2 .else 00.0000D9r 2 E8 inx 00.0000DAr 2 68 pla 00.0000DBr 2 10 F3 bpl L2329 00.0000DDr 2 .endif 00.0000DDr 2 20 rr rr jsr STKINI 00.0000E0r 2 A9 rr lda #QT_ERROR 00.0000E4r 2 00.0000E4r 2 ; ---------------------------------------------------------------------------- 00.0000E4r 2 ; PRINT STRING AT (Y,A) 00.0000E4r 2 ; PRINT CURRENT LINE # UNLESS IN DIRECT MODE 00.0000E4r 2 ; FALL INTO WARM RESTART 00.0000E4r 2 ; ---------------------------------------------------------------------------- 00.0000E4r 2 PRINT_ERROR_LINNUM: 00.0000E4r 2 20 rr rr jsr STROUT 00.0000E7r 2 A4 87 ldy CURLIN+1 00.0000E9r 2 C8 iny 00.0000EAr 2 F0 03 beq RESTART 00.0000ECr 2 20 rr rr jsr INPRT 00.0000EFr 2 00.0000EFr 2 ; ---------------------------------------------------------------------------- 00.0000EFr 2 ; WARM RESTART ENTRY 00.0000EFr 2 ; ---------------------------------------------------------------------------- 00.0000EFr 2 RESTART: 00.0000EFr 2 .ifdef KBD 00.0000EFr 2 jsr CRDO 00.0000EFr 2 nop 00.0000EFr 2 L2351X: 00.0000EFr 2 jsr OKPRT 00.0000EFr 2 L2351: 00.0000EFr 2 jsr INLIN 00.0000EFr 2 LE28E: 00.0000EFr 2 bpl RESTART 00.0000EFr 2 .else 00.0000EFr 2 46 14 lsr Z14 00.0000F1r 2 A9 rr lda #QT_OK 00.0000F5r 2 .ifdef CONFIG_CBM_ALL 00.0000F5r 2 jsr STROUT 00.0000F5r 2 .else 00.0000F5r 2 20 03 00 jsr GOSTROUT 00.0000F8r 2 .endif 00.0000F8r 2 L2351: 00.0000F8r 2 20 rr rr jsr INLIN 00.0000FBr 2 .endif 00.0000FBr 2 86 C7 stx TXTPTR 00.0000FDr 2 84 C8 sty TXTPTR+1 00.0000FFr 2 20 C0 00 jsr CHRGET 00.000102r 2 .ifdef CONFIG_11 00.000102r 2 ; bug in pre-1.1: CHRGET sets Z on '\0' 00.000102r 2 ; and ':' - a line starting with ':' in 00.000102r 2 ; direct mode gets ignored 00.000102r 2 AA tax 00.000103r 2 .endif 00.000103r 2 .ifdef KBD 00.000103r 2 beq L2351X 00.000103r 2 .else 00.000103r 2 F0 F3 beq L2351 00.000105r 2 .endif 00.000105r 2 A2 FF ldx #$FF 00.000107r 2 86 87 stx CURLIN+1 00.000109r 2 90 06 bcc NUMBERED_LINE 00.00010Br 2 20 rr rr jsr PARSE_INPUT_LINE 00.00010Er 2 4C rr rr jmp NEWSTT2 00.000111r 2 00.000111r 2 ; ---------------------------------------------------------------------------- 00.000111r 2 ; HANDLE NUMBERED LINE 00.000111r 2 ; ---------------------------------------------------------------------------- 00.000111r 2 NUMBERED_LINE: 00.000111r 2 20 rr rr jsr LINGET 00.000114r 2 20 rr rr jsr PARSE_INPUT_LINE 00.000117r 2 84 0C sty EOLPNTR 00.000119r 2 .ifdef KBD 00.000119r 2 jsr FNDLIN2 00.000119r 2 lda JMPADRS+1 00.000119r 2 sta LOWTR 00.000119r 2 sta Z96 00.000119r 2 lda JMPADRS+2 00.000119r 2 sta LOWTR+1 00.000119r 2 sta Z96+1 00.000119r 2 lda LINNUM 00.000119r 2 sta L06FE 00.000119r 2 lda LINNUM+1 00.000119r 2 sta L06FE+1 00.000119r 2 inc LINNUM 00.000119r 2 bne LE2D2 00.000119r 2 inc LINNUM+1 00.000119r 2 bne LE2D2 00.000119r 2 jmp SYNERR 00.000119r 2 LE2D2: 00.000119r 2 jsr LF457 00.000119r 2 ldx #Z96 00.000119r 2 jsr CMPJMPADRS 00.000119r 2 bcs LE2FD 00.000119r 2 LE2DC: 00.000119r 2 ldx #$00 00.000119r 2 lda (JMPADRS+1,x) 00.000119r 2 sta (Z96,x) 00.000119r 2 inc JMPADRS+1 00.000119r 2 bne LE2E8 00.000119r 2 inc JMPADRS+2 00.000119r 2 LE2E8: 00.000119r 2 inc Z96 00.000119r 2 bne LE2EE 00.000119r 2 inc Z96+1 00.000119r 2 LE2EE: 00.000119r 2 ldx #VARTAB 00.000119r 2 jsr CMPJMPADRS 00.000119r 2 bne LE2DC 00.000119r 2 lda Z96 00.000119r 2 sta VARTAB 00.000119r 2 lda Z96+1 00.000119r 2 sta VARTAB+1 00.000119r 2 LE2FD: 00.000119r 2 jsr SETPTRS 00.000119r 2 jsr LE33D 00.000119r 2 lda INPUTBUFFER 00.000119r 2 LE306: 00.000119r 2 beq LE28E 00.000119r 2 cmp #$A5 00.000119r 2 beq LE306 00.000119r 2 clc 00.000119r 2 .else 00.000119r 2 20 rr rr jsr FNDLIN 00.00011Cr 2 90 44 bcc PUT_NEW_LINE 00.00011Er 2 A0 01 ldy #$01 00.000120r 2 B1 AC lda (LOWTR),y 00.000122r 2 85 70 sta INDEX+1 00.000124r 2 A5 7A lda VARTAB 00.000126r 2 85 6F sta INDEX 00.000128r 2 A5 AD lda LOWTR+1 00.00012Ar 2 85 72 sta DEST+1 00.00012Cr 2 A5 AC lda LOWTR 00.00012Er 2 88 dey 00.00012Fr 2 F1 AC sbc (LOWTR),y 00.000131r 2 18 clc 00.000132r 2 65 7A adc VARTAB 00.000134r 2 85 7A sta VARTAB 00.000136r 2 85 71 sta DEST 00.000138r 2 A5 7B lda VARTAB+1 00.00013Ar 2 69 FF adc #$FF 00.00013Cr 2 85 7B sta VARTAB+1 00.00013Er 2 E5 AD sbc LOWTR+1 00.000140r 2 AA tax 00.000141r 2 38 sec 00.000142r 2 A5 AC lda LOWTR 00.000144r 2 E5 7A sbc VARTAB 00.000146r 2 A8 tay 00.000147r 2 B0 03 bcs L23A5 00.000149r 2 E8 inx 00.00014Ar 2 C6 72 dec DEST+1 00.00014Cr 2 L23A5: 00.00014Cr 2 18 clc 00.00014Dr 2 65 6F adc INDEX 00.00014Fr 2 90 03 bcc L23AD 00.000151r 2 C6 70 dec INDEX+1 00.000153r 2 18 clc 00.000154r 2 L23AD: 00.000154r 2 B1 6F lda (INDEX),y 00.000156r 2 91 71 sta (DEST),y 00.000158r 2 C8 iny 00.000159r 2 D0 F9 bne L23AD 00.00015Br 2 E6 70 inc INDEX+1 00.00015Dr 2 E6 72 inc DEST+1 00.00015Fr 2 CA dex 00.000160r 2 D0 F2 bne L23AD 00.000162r 2 .endif 00.000162r 2 ; ---------------------------------------------------------------------------- 00.000162r 2 PUT_NEW_LINE: 00.000162r 2 .ifndef KBD 00.000162r 2 .ifdef CONFIG_2 00.000162r 2 jsr SETPTRS 00.000162r 2 jsr LE33D 00.000162r 2 lda INPUTBUFFER 00.000162r 2 beq L2351 00.000162r 2 clc 00.000162r 2 .else 00.000162r 2 A5 1B lda INPUTBUFFER 00.000164r 2 F0 2F beq FIX_LINKS 00.000166r 2 A5 84 lda MEMSIZ 00.000168r 2 A4 85 ldy MEMSIZ+1 00.00016Ar 2 85 80 sta FRETOP 00.00016Cr 2 84 81 sty FRETOP+1 00.00016Er 2 .endif 00.00016Er 2 .endif 00.00016Er 2 A5 7A lda VARTAB 00.000170r 2 85 A7 sta HIGHTR 00.000172r 2 65 0C adc EOLPNTR 00.000174r 2 85 A5 sta HIGHDS 00.000176r 2 A4 7B ldy VARTAB+1 00.000178r 2 84 A8 sty HIGHTR+1 00.00017Ar 2 90 01 bcc L23D6 00.00017Cr 2 C8 iny 00.00017Dr 2 L23D6: 00.00017Dr 2 84 A6 sty HIGHDS+1 00.00017Fr 2 20 rr rr jsr BLTU 00.000182r 2 .ifdef CONFIG_INPUTBUFFER_0200 00.000182r 2 lda LINNUM 00.000182r 2 ldy LINNUM+1 00.000182r 2 sta INPUTBUFFER-2 00.000182r 2 sty INPUTBUFFER-1 00.000182r 2 .endif 00.000182r 2 A5 7E lda STREND 00.000184r 2 A4 7F ldy STREND+1 00.000186r 2 85 7A sta VARTAB 00.000188r 2 84 7B sty VARTAB+1 00.00018Ar 2 A4 0C ldy EOLPNTR 00.00018Cr 2 88 dey 00.00018Dr 2 ; ---COPY LINE INTO PROGRAM------- 00.00018Dr 2 L23E6: 00.00018Dr 2 B9 17 00 lda INPUTBUFFER-4,y 00.000190r 2 91 AC sta (LOWTR),y 00.000192r 2 88 dey 00.000193r 2 10 F8 bpl L23E6 00.000195r 2 00.000195r 2 ; ---------------------------------------------------------------------------- 00.000195r 2 ; CLEAR ALL VARIABLES 00.000195r 2 ; RE-ESTABLISH ALL FORWARD LINKS 00.000195r 2 ; ---------------------------------------------------------------------------- 00.000195r 2 FIX_LINKS: 00.000195r 2 20 rr rr jsr SETPTRS 00.000198r 2 .ifdef CONFIG_2 00.000198r 2 jsr LE33D 00.000198r 2 jmp L2351 00.000198r 2 LE33D: 00.000198r 2 .endif 00.000198r 2 A5 78 lda TXTTAB 00.00019Ar 2 A4 79 ldy TXTTAB+1 00.00019Cr 2 85 6F sta INDEX 00.00019Er 2 84 70 sty INDEX+1 00.0001A0r 2 18 clc 00.0001A1r 2 L23FA: 00.0001A1r 2 A0 01 ldy #$01 00.0001A3r 2 B1 6F lda (INDEX),y 00.0001A5r 2 .ifdef CONFIG_2 00.0001A5r 2 beq RET3 00.0001A5r 2 .else 00.0001A5r 2 D0 03 4C rr jeq L2351 00.0001A9r 2 rr 00.0001AAr 2 .endif 00.0001AAr 2 A0 04 ldy #$04 00.0001ACr 2 L2405: 00.0001ACr 2 C8 iny 00.0001ADr 2 B1 6F lda (INDEX),y 00.0001AFr 2 D0 FB bne L2405 00.0001B1r 2 C8 iny 00.0001B2r 2 98 tya 00.0001B3r 2 65 6F adc INDEX 00.0001B5r 2 AA tax 00.0001B6r 2 A0 00 ldy #$00 00.0001B8r 2 91 6F sta (INDEX),y 00.0001BAr 2 A5 70 lda INDEX+1 00.0001BCr 2 69 00 adc #$00 00.0001BEr 2 C8 iny 00.0001BFr 2 91 6F sta (INDEX),y 00.0001C1r 2 86 6F stx INDEX 00.0001C3r 2 85 70 sta INDEX+1 00.0001C5r 2 90 DA bcc L23FA ; always 00.0001C7r 2 00.0001C7r 2 ; ---------------------------------------------------------------------------- 00.0001C7r 2 .ifdef KBD 00.0001C7r 2 .include "kbd_loadsave.s" 00.0001C7r 2 .endif 00.0001C7r 2 00.0001C7r 2 .ifdef CONFIG_2 00.0001C7r 2 ; !!! kbd_loadsave.s requires an RTS here! 00.0001C7r 2 RET3: 00.0001C7r 2 rts 00.0001C7r 2 .endif 00.0001C7r 2 00.0001C7r 2 .include "inline.s" 00.0001C7r 3 .segment "CODE" 00.0001C7r 3 00.0001C7r 3 .ifndef CONFIG_NO_INPUTBUFFER_ZP 00.0001C7r 3 L2420: 00.0001C7r 3 .ifdef OSI 00.0001C7r 3 jsr OUTDO 00.0001C7r 3 .endif 00.0001C7r 3 CA dex 00.0001C8r 3 10 05 bpl INLIN2 00.0001CAr 3 L2423: 00.0001CAr 3 .ifdef OSI 00.0001CAr 3 jsr OUTDO 00.0001CAr 3 .endif 00.0001CAr 3 20 rr rr jsr CRDO 00.0001CDr 3 .endif 00.0001CDr 3 00.0001CDr 3 ; ---------------------------------------------------------------------------- 00.0001CDr 3 ; READ A LINE, AND STRIP OFF SIGN BITS 00.0001CDr 3 ; ---------------------------------------------------------------------------- 00.0001CDr 3 .ifndef KBD 00.0001CDr 3 INLIN: 00.0001CDr 3 .ifdef APPLE 00.0001CDr 3 ldx #$DD 00.0001CDr 3 INLIN1: 00.0001CDr 3 stx $33 00.0001CDr 3 jsr L2900 00.0001CDr 3 cpx #$EF 00.0001CDr 3 bcs L0C32 00.0001CDr 3 ldx #$EF 00.0001CDr 3 L0C32: 00.0001CDr 3 lda #$00 00.0001CDr 3 sta INPUTBUFFER,x 00.0001CDr 3 ldx #INPUTBUFFER-1 00.0001CDr 3 rts 00.0001CDr 3 .endif 00.0001CDr 3 00.0001CDr 3 .ifndef APPLE 00.0001CDr 3 A2 00 ldx #$00 00.0001CFr 3 INLIN2: 00.0001CFr 3 20 rr rr jsr GETLN 00.0001D2r 3 .ifndef CONFIG_NO_LINE_EDITING 00.0001D2r 3 C9 07 cmp #$07 00.0001D4r 3 F0 14 beq L2443 00.0001D6r 3 .endif 00.0001D6r 3 C9 0D cmp #$0D 00.0001D8r 3 F0 20 beq L2453 00.0001DAr 3 .ifndef CONFIG_NO_LINE_EDITING 00.0001DAr 3 C9 20 cmp #$20 00.0001DCr 3 90 F1 bcc INLIN2 00.0001DEr 3 .ifdef MICROTAN 00.0001DEr 3 cmp #$80 00.0001DEr 3 .else 00.0001DEr 3 C9 7D cmp #$7D 00.0001E0r 3 .endif 00.0001E0r 3 B0 ED bcs INLIN2 00.0001E2r 3 C9 40 cmp #$40 ; @ 00.0001E4r 3 F0 E4 beq L2423 00.0001E6r 3 .ifdef MICROTAN 00.0001E6r 3 cmp #$7F ; DEL 00.0001E6r 3 .else 00.0001E6r 3 C9 5F cmp #$5F ; _ 00.0001E8r 3 .endif 00.0001E8r 3 F0 DD beq L2420 00.0001EAr 3 L2443: 00.0001EAr 3 .ifdef MICROTAN 00.0001EAr 3 cpx #$4F 00.0001EAr 3 .else 00.0001EAr 3 E0 47 cpx #$47 00.0001ECr 3 .endif 00.0001ECr 3 B0 05 bcs L244C 00.0001EEr 3 .endif 00.0001EEr 3 95 1B sta INPUTBUFFER,x 00.0001F0r 3 E8 inx 00.0001F1r 3 .ifdef OSI 00.0001F1r 3 .byte $2C 00.0001F1r 3 .else 00.0001F1r 3 D0 DC bne INLIN2 00.0001F3r 3 .endif 00.0001F3r 3 L244C: 00.0001F3r 3 .ifndef CONFIG_NO_LINE_EDITING 00.0001F3r 3 A9 07 lda #$07 ; BEL 00.0001F5r 3 20 rr rr jsr OUTDO 00.0001F8r 3 D0 D5 bne INLIN2 00.0001FAr 3 .endif 00.0001FAr 3 L2453: 00.0001FAr 3 4C rr rr jmp L29B9 00.0001FDr 3 .endif 00.0001FDr 3 .endif 00.0001FDr 3 00.0001FDr 3 .ifndef KBD 00.0001FDr 3 .ifndef APPLE 00.0001FDr 3 GETLN: 00.0001FDr 3 .ifdef CONFIG_FILE 00.0001FDr 3 jsr CHRIN 00.0001FDr 3 ldy CURDVC 00.0001FDr 3 bne L2465 00.0001FDr 3 .else 00.0001FDr 3 20 5A 1E jsr MONRDKEY 00.000200r 3 .endif 00.000200r 3 .ifdef OSI 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 nop 00.000200r 3 and #$7F 00.000200r 3 .endif 00.000200r 3 .endif ; APPLE 00.000200r 3 .ifdef APPLE 00.000200r 3 RDKEY: 00.000200r 3 jsr LFD0C 00.000200r 3 and #$7F 00.000200r 3 .endif 00.000200r 3 C9 0F cmp #$0F 00.000202r 3 D0 08 bne L2465 00.000204r 3 48 pha 00.000205r 3 A5 14 lda Z14 00.000207r 3 49 FF eor #$FF 00.000209r 3 85 14 sta Z14 00.00020Br 3 68 pla 00.00020Cr 3 L2465: 00.00020Cr 3 60 rts 00.00020Dr 3 .endif ; KBD 00.00020Dr 3 00.00020Dr 2 00.00020Dr 2 ; ---------------------------------------------------------------------------- 00.00020Dr 2 ; TOKENIZE THE INPUT LINE 00.00020Dr 2 ; ---------------------------------------------------------------------------- 00.00020Dr 2 PARSE_INPUT_LINE: 00.00020Dr 2 A6 C7 ldx TXTPTR 00.00020Fr 2 A0 04 ldy #$04 00.000211r 2 84 10 sty DATAFLG 00.000213r 2 L246C: 00.000213r 2 BD 00 00 lda INPUTBUFFERX,x 00.000216r 2 .ifdef CONFIG_CBM_ALL 00.000216r 2 bpl LC49E 00.000216r 2 cmp #$FF 00.000216r 2 beq L24AC 00.000216r 2 inx 00.000216r 2 bne L246C 00.000216r 2 LC49E: 00.000216r 2 .endif 00.000216r 2 C9 20 cmp #$20 00.000218r 2 F0 3B beq L24AC 00.00021Ar 2 85 0B sta ENDCHR 00.00021Cr 2 C9 22 cmp #$22 00.00021Er 2 F0 5A beq L24D0 00.000220r 2 24 10 bit DATAFLG 00.000222r 2 70 31 bvs L24AC 00.000224r 2 C9 3F cmp #$3F 00.000226r 2 D0 04 bne L2484 00.000228r 2 A9 97 lda #TOKEN_PRINT 00.00022Ar 2 D0 29 bne L24AC 00.00022Cr 2 L2484: 00.00022Cr 2 C9 30 cmp #$30 00.00022Er 2 90 04 bcc L248C 00.000230r 2 C9 3C cmp #$3C 00.000232r 2 90 21 bcc L24AC 00.000234r 2 ; ---------------------------------------------------------------------------- 00.000234r 2 ; SEARCH TOKEN NAME TABLE FOR MATCH STARTING 00.000234r 2 ; WITH CURRENT CHAR FROM INPUT LINE 00.000234r 2 ; ---------------------------------------------------------------------------- 00.000234r 2 L248C: 00.000234r 2 84 BE sty STRNG2 00.000236r 2 A0 00 ldy #$00 00.000238r 2 84 0C sty EOLPNTR 00.00023Ar 2 88 dey 00.00023Br 2 86 C7 stx TXTPTR 00.00023Dr 2 CA dex 00.00023Er 2 L2496: 00.00023Er 2 C8 iny 00.00023Fr 2 L2497: 00.00023Fr 2 E8 inx 00.000240r 2 L2498: 00.000240r 2 .ifdef KBD 00.000240r 2 jsr GET_UPPER 00.000240r 2 .else 00.000240r 2 BD 00 00 lda INPUTBUFFERX,x 00.000243r 2 .ifndef CONFIG_2 00.000243r 2 C9 20 cmp #$20 00.000245r 2 F0 F8 beq L2497 00.000247r 2 .endif 00.000247r 2 .endif 00.000247r 2 38 sec 00.000248r 2 F9 rr rr sbc TOKEN_NAME_TABLE,y 00.00024Br 2 F0 F1 beq L2496 00.00024Dr 2 C9 80 cmp #$80 00.00024Fr 2 D0 30 bne L24D7 00.000251r 2 05 0C ora EOLPNTR 00.000253r 2 ; ---------------------------------------------------------------------------- 00.000253r 2 ; STORE CHARACTER OR TOKEN IN OUTPUT LINE 00.000253r 2 ; ---------------------------------------------------------------------------- 00.000253r 2 L24AA: 00.000253r 2 A4 BE ldy STRNG2 00.000255r 2 L24AC: 00.000255r 2 E8 inx 00.000256r 2 C8 iny 00.000257r 2 99 16 00 sta INPUTBUFFER-5,y 00.00025Ar 2 B9 16 00 lda INPUTBUFFER-5,y 00.00025Dr 2 F0 36 beq L24EA 00.00025Fr 2 38 sec 00.000260r 2 E9 3A sbc #$3A 00.000262r 2 F0 04 beq L24BF 00.000264r 2 C9 49 cmp #$49 00.000266r 2 D0 02 bne L24C1 00.000268r 2 L24BF: 00.000268r 2 85 10 sta DATAFLG 00.00026Ar 2 L24C1: 00.00026Ar 2 38 sec 00.00026Br 2 E9 54 sbc #TOKEN_REM-':' 00.00026Dr 2 D0 A4 bne L246C 00.00026Fr 2 85 0B sta ENDCHR 00.000271r 2 ; ---------------------------------------------------------------------------- 00.000271r 2 ; HANDLE LITERAL (BETWEEN QUOTES) OR REMARK, 00.000271r 2 ; BY COPYING CHARS UP TO ENDCHR. 00.000271r 2 ; ---------------------------------------------------------------------------- 00.000271r 2 L24C8: 00.000271r 2 BD 00 00 lda INPUTBUFFERX,x 00.000274r 2 F0 DF beq L24AC 00.000276r 2 C5 0B cmp ENDCHR 00.000278r 2 F0 DB beq L24AC 00.00027Ar 2 L24D0: 00.00027Ar 2 C8 iny 00.00027Br 2 99 16 00 sta INPUTBUFFER-5,y 00.00027Er 2 E8 inx 00.00027Fr 2 D0 F0 bne L24C8 00.000281r 2 ; ---------------------------------------------------------------------------- 00.000281r 2 ; ADVANCE POINTER TO NEXT TOKEN NAME 00.000281r 2 ; ---------------------------------------------------------------------------- 00.000281r 2 L24D7: 00.000281r 2 A6 C7 ldx TXTPTR 00.000283r 2 E6 0C inc EOLPNTR 00.000285r 2 L24DB: 00.000285r 2 C8 iny 00.000286r 2 B9 rr rr lda MATHTBL+28+1,y 00.000289r 2 10 FA bpl L24DB 00.00028Br 2 B9 rr rr lda TOKEN_NAME_TABLE,y 00.00028Er 2 D0 B0 bne L2498 00.000290r 2 BD 00 00 lda INPUTBUFFERX,x 00.000293r 2 10 BE bpl L24AA 00.000295r 2 ; ---END OF LINE------------------ 00.000295r 2 L24EA: 00.000295r 2 99 18 00 sta INPUTBUFFER-3,y 00.000298r 2 .ifdef CONFIG_NO_INPUTBUFFER_ZP 00.000298r 2 dec TXTPTR+1 00.000298r 2 .endif 00.000298r 2 A9 1A lda #CONST_MEMSIZ 00.0002E9r 2 .else 00.0002E9r 2 A5 84 lda MEMSIZ 00.0002EBr 2 A4 85 ldy MEMSIZ+1 00.0002EDr 2 .endif 00.0002EDr 2 85 80 sta FRETOP 00.0002EFr 2 84 81 sty FRETOP+1 00.0002F1r 2 .ifdef CONFIG_CBM_ALL 00.0002F1r 2 jsr CLALL 00.0002F1r 2 .endif 00.0002F1r 2 A5 7A lda VARTAB 00.0002F3r 2 A4 7B ldy VARTAB+1 00.0002F5r 2 85 7C sta ARYTAB 00.0002F7r 2 84 7D sty ARYTAB+1 00.0002F9r 2 85 7E sta STREND 00.0002FBr 2 84 7F sty STREND+1 00.0002FDr 2 20 rr rr jsr RESTORE 00.000300r 2 ; ---------------------------------------------------------------------------- 00.000300r 2 STKINI: 00.000300r 2 A2 66 ldx #TEMPST 00.000302r 2 86 63 stx TEMPPT 00.000304r 2 68 pla 00.000305r 2 .ifdef CONFIG_2 00.000305r 2 tay 00.000305r 2 .else 00.000305r 2 8D FD 01 sta STACK+STACK_TOP+1 00.000308r 2 .endif 00.000308r 2 68 pla 00.000309r 2 .ifndef CONFIG_2 00.000309r 2 8D FE 01 sta STACK+STACK_TOP+2 00.00030Cr 2 .endif 00.00030Cr 2 A2 FC ldx #STACK_TOP 00.00030Er 2 9A txs 00.00030Fr 2 .ifdef CONFIG_2 00.00030Fr 2 pha 00.00030Fr 2 tya 00.00030Fr 2 pha 00.00030Fr 2 .endif 00.00030Fr 2 A9 00 lda #$00 00.000311r 2 85 8B sta OLDTEXT+1 00.000313r 2 85 11 sta SUBFLG 00.000315r 2 L256A: 00.000315r 2 60 rts 00.000316r 2 00.000316r 2 ; ---------------------------------------------------------------------------- 00.000316r 2 ; SET TXTPTR TO BEGINNING OF PROGRAM 00.000316r 2 ; ---------------------------------------------------------------------------- 00.000316r 2 STXTPT: 00.000316r 2 18 clc 00.000317r 2 A5 78 lda TXTTAB 00.000319r 2 69 FF adc #$FF 00.00031Br 2 85 C7 sta TXTPTR 00.00031Dr 2 A5 79 lda TXTTAB+1 00.00031Fr 2 69 FF adc #$FF 00.000321r 2 85 C8 sta TXTPTR+1 00.000323r 2 60 rts 00.000324r 2 00.000324r 2 ; ---------------------------------------------------------------------------- 00.000324r 2 .ifdef KBD 00.000324r 2 LE4C0: 00.000324r 2 ldy #LE444 00.000324r 2 LE4C4: 00.000324r 2 jsr LFFD6 00.000324r 2 jsr LFFED 00.000324r 2 lda $0504 00.000324r 2 clc 00.000324r 2 adc #$08 00.000324r 2 sta $0504 00.000324r 2 rts 00.000324r 2 00.000324r 2 CMPJMPADRS: 00.000324r 2 lda 1,x 00.000324r 2 cmp JMPADRS+2 00.000324r 2 bne LE4DE 00.000324r 2 lda 0,x 00.000324r 2 cmp JMPADRS+1 00.000324r 2 LE4DE: 00.000324r 2 rts 00.000324r 2 .endif 00.000324r 2 00.000324r 2 ; ---------------------------------------------------------------------------- 00.000324r 2 ; "LIST" STATEMENT 00.000324r 2 ; ---------------------------------------------------------------------------- 00.000324r 2 LIST: 00.000324r 2 .ifdef KBD 00.000324r 2 jsr LE440 00.000324r 2 bne LE4DE 00.000324r 2 pla 00.000324r 2 pla 00.000324r 2 L25A6: 00.000324r 2 jsr CRDO 00.000324r 2 .else 00.000324r 2 .ifdef MICROTAN 00.000324r 2 php 00.000324r 2 jmp LE21C ; patch 00.000324r 2 LC57E: 00.000324r 2 .else 00.000324r 2 90 06 bcc L2581 00.000326r 2 F0 04 beq L2581 00.000328r 2 C9 A5 cmp #TOKEN_MINUS 00.00032Ar 2 D0 E9 bne L256A 00.00032Cr 2 L2581: 00.00032Cr 2 20 rr rr jsr LINGET 00.00032Fr 2 .endif 00.00032Fr 2 20 rr rr jsr FNDLIN 00.000332r 2 .ifdef MICROTAN 00.000332r 2 plp 00.000332r 2 beq L2598 00.000332r 2 .endif 00.000332r 2 20 C6 00 jsr CHRGOT 00.000335r 2 .ifdef MICROTAN 00.000335r 2 beq L25A6 00.000335r 2 .else 00.000335r 2 F0 0C beq L2598 00.000337r 2 .endif 00.000337r 2 C9 A5 cmp #TOKEN_MINUS 00.000339r 2 D0 90 bne L2520 00.00033Br 2 20 C0 00 jsr CHRGET 00.00033Er 2 .ifdef MICROTAN 00.00033Er 2 beq L2598 00.00033Er 2 jsr LINGET 00.00033Er 2 beq L25A6 00.00033Er 2 rts 00.00033Er 2 .else 00.00033Er 2 20 rr rr jsr LINGET 00.000341r 2 D0 88 bne L2520 00.000343r 2 .endif 00.000343r 2 L2598: 00.000343r 2 .ifndef MICROTAN 00.000343r 2 68 pla 00.000344r 2 68 pla 00.000345r 2 A5 19 lda LINNUM 00.000347r 2 05 1A ora LINNUM+1 00.000349r 2 D0 06 bne L25A6 00.00034Br 2 .endif 00.00034Br 2 A9 FF lda #$FF 00.00034Dr 2 85 19 sta LINNUM 00.00034Fr 2 85 1A sta LINNUM+1 00.000351r 2 L25A6: 00.000351r 2 .ifdef MICROTAN 00.000351r 2 pla 00.000351r 2 pla 00.000351r 2 .endif 00.000351r 2 L25A6X: 00.000351r 2 .endif 00.000351r 2 A0 01 ldy #$01 00.000353r 2 .ifdef CONFIG_DATAFLG 00.000353r 2 sty DATAFLG 00.000353r 2 .endif 00.000353r 2 B1 AC lda (LOWTRX),y 00.000355r 2 F0 39 beq L25E5 00.000357r 2 .ifdef MICROTAN 00.000357r 2 jmp LE21F 00.000357r 2 LC5A9: 00.000357r 2 .else 00.000357r 2 20 rr rr jsr ISCNTC 00.00035Ar 2 .endif 00.00035Ar 2 .ifndef KBD 00.00035Ar 2 20 rr rr jsr CRDO 00.00035Dr 2 .endif 00.00035Dr 2 C8 iny 00.00035Er 2 B1 AC lda (LOWTRX),y 00.000360r 2 AA tax 00.000361r 2 C8 iny 00.000362r 2 B1 AC lda (LOWTRX),y 00.000364r 2 C5 1A cmp LINNUM+1 00.000366r 2 D0 04 bne L25C1 00.000368r 2 E4 19 cpx LINNUM 00.00036Ar 2 F0 02 beq L25C3 00.00036Cr 2 L25C1: 00.00036Cr 2 B0 22 bcs L25E5 00.00036Er 2 ; ---LIST ONE LINE---------------- 00.00036Er 2 L25C3: 00.00036Er 2 84 96 sty FORPNT 00.000370r 2 20 rr rr jsr LINPRT 00.000373r 2 A9 20 lda #$20 00.000375r 2 L25CA: 00.000375r 2 A4 96 ldy FORPNT 00.000377r 2 29 7F and #$7F 00.000379r 2 L25CE: 00.000379r 2 20 rr rr jsr OUTDO 00.00037Cr 2 .ifdef CONFIG_DATAFLG 00.00037Cr 2 cmp #$22 00.00037Cr 2 bne LA519 00.00037Cr 2 lda DATAFLG 00.00037Cr 2 eor #$FF 00.00037Cr 2 sta DATAFLG 00.00037Cr 2 LA519: 00.00037Cr 2 .endif 00.00037Cr 2 C8 iny 00.00037Dr 2 .ifdef CONFIG_11 00.00037Dr 2 F0 11 beq L25E5 00.00037Fr 2 .endif 00.00037Fr 2 B1 AC lda (LOWTRX),y 00.000381r 2 D0 10 bne L25E8 00.000383r 2 A8 tay 00.000384r 2 B1 AC lda (LOWTRX),y 00.000386r 2 AA tax 00.000387r 2 C8 iny 00.000388r 2 B1 AC lda (LOWTRX),y 00.00038Ar 2 86 AC stx LOWTRX 00.00038Cr 2 85 AD sta LOWTRX+1 00.00038Er 2 .ifdef MICROTAN 00.00038Er 2 bne L25A6X 00.00038Er 2 .else 00.00038Er 2 D0 C1 bne L25A6 00.000390r 2 .endif 00.000390r 2 L25E5: 00.000390r 2 4C rr rr jmp RESTART 00.000393r 2 L25E8: 00.000393r 2 10 E4 bpl L25CE 00.000395r 2 .ifdef CONFIG_DATAFLG 00.000395r 2 cmp #$FF 00.000395r 2 beq L25CE 00.000395r 2 bit DATAFLG 00.000395r 2 bmi L25CE 00.000395r 2 .endif 00.000395r 2 38 sec 00.000396r 2 E9 7F sbc #$7F 00.000398r 2 AA tax 00.000399r 2 84 96 sty FORPNT 00.00039Br 2 A0 FF ldy #$FF 00.00039Dr 2 L25F2: 00.00039Dr 2 CA dex 00.00039Er 2 F0 08 beq L25FD 00.0003A0r 2 L25F5: 00.0003A0r 2 C8 iny 00.0003A1r 2 B9 rr rr lda TOKEN_NAME_TABLE,y 00.0003A4r 2 10 FA bpl L25F5 00.0003A6r 2 30 F5 bmi L25F2 00.0003A8r 2 L25FD: 00.0003A8r 2 C8 iny 00.0003A9r 2 B9 rr rr lda TOKEN_NAME_TABLE,y 00.0003ACr 2 30 C7 bmi L25CA 00.0003AEr 2 20 rr rr jsr OUTDO 00.0003B1r 2 D0 F5 bne L25FD ; always 00.0003B3r 2 00.0003B3r 2 00.0003B3r 1 .include "flow1.s" 00.0003B3r 2 .segment "CODE" 00.0003B3r 2 00.0003B3r 2 ; ---------------------------------------------------------------------------- 00.0003B3r 2 ; "FOR" STATEMENT 00.0003B3r 2 ; 00.0003B3r 2 ; FOR PUSHES 18 BYTES ON THE STACK: 00.0003B3r 2 ; 2 -- TXTPTR 00.0003B3r 2 ; 2 -- LINE NUMBER 00.0003B3r 2 ; 5 -- INITIAL (CURRENT) FOR VARIABLE VALUE 00.0003B3r 2 ; 1 -- STEP SIGN 00.0003B3r 2 ; 5 -- STEP VALUE 00.0003B3r 2 ; 2 -- ADDRESS OF FOR VARIABLE IN VARTAB 00.0003B3r 2 ; 1 -- FOR TOKEN ($81) 00.0003B3r 2 ; ---------------------------------------------------------------------------- 00.0003B3r 2 FOR: 00.0003B3r 2 A9 80 lda #$80 00.0003B5r 2 85 11 sta SUBFLG 00.0003B7r 2 20 rr rr jsr LET 00.0003BAr 2 20 rr rr jsr GTFORPNT 00.0003BDr 2 D0 05 bne L2619 00.0003BFr 2 8A txa 00.0003C0r 2 69 0F adc #FOR_STACK1 00.0003C2r 2 AA tax 00.0003C3r 2 9A txs 00.0003C4r 2 L2619: 00.0003C4r 2 68 pla 00.0003C5r 2 68 pla 00.0003C6r 2 A9 09 lda #FOR_STACK2 00.0003C8r 2 20 rr rr jsr CHKMEM 00.0003CBr 2 20 rr rr jsr DATAN 00.0003CEr 2 18 clc 00.0003CFr 2 98 tya 00.0003D0r 2 65 C7 adc TXTPTR 00.0003D2r 2 48 pha 00.0003D3r 2 A5 C8 lda TXTPTR+1 00.0003D5r 2 69 00 adc #$00 00.0003D7r 2 48 pha 00.0003D8r 2 A5 87 lda CURLIN+1 00.0003DAr 2 48 pha 00.0003DBr 2 A5 86 lda CURLIN 00.0003DDr 2 48 pha 00.0003DEr 2 A9 9E lda #TOKEN_TO 00.0003E0r 2 20 rr rr jsr SYNCHR 00.0003E3r 2 20 rr rr jsr CHKNUM 00.0003E6r 2 20 rr rr jsr FRMNUM 00.0003E9r 2 A5 B3 lda FACSIGN 00.0003EBr 2 09 7F ora #$7F 00.0003EDr 2 25 AF and FAC+1 00.0003EFr 2 85 AF sta FAC+1 00.0003F1r 2 A9 rr lda #STEP 00.0003F5r 2 85 6F sta INDEX 00.0003F7r 2 84 70 sty INDEX+1 00.0003F9r 2 4C rr rr jmp FRM_STACK3 00.0003FCr 2 00.0003FCr 2 ; ---------------------------------------------------------------------------- 00.0003FCr 2 ; "STEP" PHRASE OF "FOR" STATEMENT 00.0003FCr 2 ; ---------------------------------------------------------------------------- 00.0003FCr 2 STEP: 00.0003FCr 2 A9 rr lda #CON_ONE 00.000400r 2 20 rr rr jsr LOAD_FAC_FROM_YA 00.000403r 2 20 C6 00 jsr CHRGOT 00.000406r 2 C9 A3 cmp #TOKEN_STEP 00.000408r 2 D0 06 bne L2665 00.00040Ar 2 20 C0 00 jsr CHRGET 00.00040Dr 2 20 rr rr jsr FRMNUM 00.000410r 2 L2665: 00.000410r 2 20 rr rr jsr SIGN 00.000413r 2 20 rr rr jsr FRM_STACK2 00.000416r 2 A5 97 lda FORPNT+1 00.000418r 2 48 pha 00.000419r 2 A5 96 lda FORPNT 00.00041Br 2 48 pha 00.00041Cr 2 A9 81 lda #$81 00.00041Er 2 48 pha 00.00041Fr 2 00.00041Fr 2 ; ---------------------------------------------------------------------------- 00.00041Fr 2 ; PERFORM NEXT STATEMENT 00.00041Fr 2 ; ---------------------------------------------------------------------------- 00.00041Fr 2 NEWSTT: 00.00041Fr 2 20 rr rr jsr ISCNTC 00.000422r 2 A5 C7 lda TXTPTR 00.000424r 2 A4 C8 ldy TXTPTR+1 00.000426r 2 .if .def(CONFIG_NO_INPUTBUFFER_ZP) && .def(CONFIG_2) 00.000426r 2 cpy #>INPUTBUFFER 00.000426r 2 .ifdef CBM2 00.000426r 2 nop 00.000426r 2 .endif 00.000426r 2 beq LC6D4 00.000426r 2 .else 00.000426r 2 ; BUG on AppleSoft I, 00.000426r 2 ; fixed differently on AppleSoft II (ldx/inx) 00.000426r 2 F0 06 beq L2683 00.000428r 2 .endif 00.000428r 2 85 8A sta OLDTEXT 00.00042Ar 2 84 8B sty OLDTEXT+1 00.00042Cr 2 LC6D4: 00.00042Cr 2 A0 00 ldy #$00 00.00042Er 2 L2683: 00.00042Er 2 B1 C7 lda (TXTPTR),y 00.000430r 2 .ifndef CONFIG_11 00.000430r 2 beq LA5DC ; old: 1 cycle more on generic case 00.000430r 2 cmp #$3A 00.000430r 2 beq NEWSTT2 00.000430r 2 SYNERR1: 00.000430r 2 jmp SYNERR 00.000430r 2 LA5DC: 00.000430r 2 .else 00.000430r 2 D0 3D bne COLON; new: 1 cycle more on ":" case 00.000432r 2 .endif 00.000432r 2 A0 02 ldy #$02 00.000434r 2 B1 C7 lda (TXTPTR),y 00.000436r 2 18 clc 00.000437r 2 .ifdef CONFIG_2 00.000437r 2 jeq L2701 00.000437r 2 .else 00.000437r 2 F0 73 beq L2701 00.000439r 2 .endif 00.000439r 2 C8 iny 00.00043Ar 2 B1 C7 lda (TXTPTR),y 00.00043Cr 2 85 86 sta CURLIN 00.00043Er 2 C8 iny 00.00043Fr 2 B1 C7 lda (TXTPTR),y 00.000441r 2 85 87 sta CURLIN+1 00.000443r 2 98 tya 00.000444r 2 65 C7 adc TXTPTR 00.000446r 2 85 C7 sta TXTPTR 00.000448r 2 90 02 bcc NEWSTT2 00.00044Ar 2 E6 C8 inc TXTPTR+1 00.00044Cr 2 NEWSTT2: 00.00044Cr 2 20 C0 00 jsr CHRGET 00.00044Fr 2 20 rr rr jsr EXECUTE_STATEMENT 00.000452r 2 4C rr rr jmp NEWSTT 00.000455r 2 00.000455r 2 ; ---------------------------------------------------------------------------- 00.000455r 2 ; EXECUTE A STATEMENT 00.000455r 2 ; 00.000455r 2 ; (A) IS FIRST CHAR OF STATEMENT 00.000455r 2 ; CARRY IS SET 00.000455r 2 ; ---------------------------------------------------------------------------- 00.000455r 2 EXECUTE_STATEMENT: 00.000455r 2 .ifndef CONFIG_11A 00.000455r 2 beq RET1 00.000455r 2 .else 00.000455r 2 F0 2D beq RET2 00.000457r 2 .endif 00.000457r 2 .ifndef CONFIG_11 00.000457r 2 sec 00.000457r 2 .endif 00.000457r 2 EXECUTE_STATEMENT1: 00.000457r 2 E9 80 sbc #$80 00.000459r 2 .ifndef CONFIG_11 00.000459r 2 jcc LET ; old: 1 cycle more on instr. 00.000459r 2 .else 00.000459r 2 90 11 bcc LET1; new: 1 cycle more on assignment 00.00045Br 2 .endif 00.00045Br 2 C9 1D cmp #NUM_TOKENS 00.00045Dr 2 .ifdef CONFIG_2 00.00045Dr 2 bcs LC721 00.00045Dr 2 .else 00.00045Dr 2 B0 14 bcs SYNERR1 00.00045Fr 2 .endif 00.00045Fr 2 0A asl a 00.000460r 2 A8 tay 00.000461r 2 B9 rr rr lda TOKEN_ADDRESS_TABLE+1,y 00.000464r 2 48 pha 00.000465r 2 B9 rr rr lda TOKEN_ADDRESS_TABLE,y 00.000468r 2 48 pha 00.000469r 2 4C C0 00 jmp CHRGET 00.00046Cr 2 00.00046Cr 2 .ifdef CONFIG_11 00.00046Cr 2 LET1: 00.00046Cr 2 4C rr rr jmp LET 00.00046Fr 2 00.00046Fr 2 COLON: 00.00046Fr 2 C9 3A cmp #$3A 00.000471r 2 F0 D9 beq NEWSTT2 00.000473r 2 SYNERR1: 00.000473r 2 4C rr rr jmp SYNERR 00.000476r 2 .endif 00.000476r 2 00.000476r 2 .ifdef CONFIG_2; GO TO 00.000476r 2 LC721: 00.000476r 2 cmp #TOKEN_GO-$80 00.000476r 2 bne SYNERR1 00.000476r 2 jsr CHRGET 00.000476r 2 lda #TOKEN_TO 00.000476r 2 jsr SYNCHR 00.000476r 2 jmp GOTO 00.000476r 2 .endif 00.000476r 2 00.000476r 2 ; ---------------------------------------------------------------------------- 00.000476r 2 ; "RESTORE" STATEMENT 00.000476r 2 ; ---------------------------------------------------------------------------- 00.000476r 2 RESTORE: 00.000476r 2 38 sec 00.000477r 2 A5 78 lda TXTTAB 00.000479r 2 E9 01 sbc #$01 00.00047Br 2 A4 79 ldy TXTTAB+1 00.00047Dr 2 B0 01 bcs SETDA 00.00047Fr 2 88 dey 00.000480r 2 SETDA: 00.000480r 2 85 8E sta DATPTR 00.000482r 2 84 8F sty DATPTR+1 00.000484r 2 RET2: 00.000484r 2 60 rts 00.000485r 2 00.000485r 2 .include "iscntc.s" 00.000485r 3 .segment "CODE" 00.000485r 3 ; ---------------------------------------------------------------------------- 00.000485r 3 ; SEE IF CONTROL-C TYPED 00.000485r 3 ; ---------------------------------------------------------------------------- 00.000485r 3 .ifndef CONFIG_CBM_ALL 00.000485r 3 .include "cbm_iscntc.s" 00.000485r 4 ; nothing - ISCNTC is a KERNAL function 00.000485r 4 00.000485r 3 .endif 00.000485r 3 .ifdef KBD 00.000485r 3 .include "kbd_iscntc.s" 00.000485r 3 .endif 00.000485r 3 .ifdef OSI 00.000485r 3 .include "osi_iscntc.s" 00.000485r 3 .endif 00.000485r 3 .ifdef APPLE 00.000485r 3 .include "apple_iscntc.s" 00.000485r 3 .endif 00.000485r 3 .ifdef KIM 00.000485r 3 .include "kim_iscntc.s" 00.000485r 4 .segment "CODE" 00.000485r 4 ISCNTC: 00.000485r 4 A9 01 lda #$01 00.000487r 4 2C 40 17 bit $1740 00.00048Ar 4 30 F8 bmi RET2 00.00048Cr 4 A2 08 ldx #$08 00.00048Er 4 A9 03 lda #$03 00.000490r 4 18 clc 00.000491r 4 C9 03 cmp #$03 00.000493r 4 ;!!! runs into "STOP" 00.000493r 4 00.000493r 3 .endif 00.000493r 3 .ifdef MICROTAN 00.000493r 3 .include "microtan_iscntc.s" 00.000493r 3 .endif 00.000493r 3 ;!!! runs into "STOP" 00.000493r 3 00.000493r 2 ;!!! runs into "STOP" 00.000493r 2 ; ---------------------------------------------------------------------------- 00.000493r 2 ; "STOP" STATEMENT 00.000493r 2 ; ---------------------------------------------------------------------------- 00.000493r 2 STOP: 00.000493r 2 B0 01 bcs END2 00.000495r 2 00.000495r 2 ; ---------------------------------------------------------------------------- 00.000495r 2 ; "END" STATEMENT 00.000495r 2 ; ---------------------------------------------------------------------------- 00.000495r 2 END: 00.000495r 2 18 clc 00.000496r 2 END2: 00.000496r 2 D0 3D bne RET1 00.000498r 2 A5 C7 lda TXTPTR 00.00049Ar 2 A4 C8 ldy TXTPTR+1 00.00049Cr 2 .if .def(CONFIG_NO_INPUTBUFFER_ZP) && .def(CONFIG_2) 00.00049Cr 2 ; BUG on AppleSoft I 00.00049Cr 2 ; fix exists on AppleSoft II 00.00049Cr 2 ; TXTPTR+1 will always be > 0 00.00049Cr 2 ldx CURLIN+1 00.00049Cr 2 inx 00.00049Cr 2 .endif 00.00049Cr 2 F0 0C beq END4 00.00049Er 2 85 8A sta OLDTEXT 00.0004A0r 2 84 8B sty OLDTEXT+1 00.0004A2r 2 CONTROL_C_TYPED: 00.0004A2r 2 A5 86 lda CURLIN 00.0004A4r 2 A4 87 ldy CURLIN+1 00.0004A6r 2 85 88 sta OLDLIN 00.0004A8r 2 84 89 sty OLDLIN+1 00.0004AAr 2 END4: 00.0004AAr 2 68 pla 00.0004ABr 2 68 pla 00.0004ACr 2 L2701: 00.0004ACr 2 A9 rr lda #QT_BREAK 00.0004B0r 2 .ifndef KBD 00.0004B0r 2 A2 00 ldx #$00 00.0004B2r 2 86 14 stx Z14 00.0004B4r 2 .endif 00.0004B4r 2 90 03 bcc L270E 00.0004B6r 2 4C rr rr jmp PRINT_ERROR_LINNUM 00.0004B9r 2 L270E: 00.0004B9r 2 4C rr rr jmp RESTART 00.0004BCr 2 .ifdef KBD 00.0004BCr 2 LE664: 00.0004BCr 2 tay 00.0004BCr 2 jmp SNGFLT 00.0004BCr 2 .endif 00.0004BCr 2 00.0004BCr 2 ; ---------------------------------------------------------------------------- 00.0004BCr 2 ; "CONT" COMMAND 00.0004BCr 2 ; ---------------------------------------------------------------------------- 00.0004BCr 2 CONT: 00.0004BCr 2 D0 17 bne RET1 00.0004BEr 2 A2 D2 ldx #ERR_CANTCONT 00.0004C0r 2 A4 8B ldy OLDTEXT+1 00.0004C2r 2 D0 03 bne L271C 00.0004C4r 2 4C rr rr jmp ERROR 00.0004C7r 2 L271C: 00.0004C7r 2 A5 8A lda OLDTEXT 00.0004C9r 2 85 C7 sta TXTPTR 00.0004CBr 2 84 C8 sty TXTPTR+1 00.0004CDr 2 A5 88 lda OLDLIN 00.0004CFr 2 A4 89 ldy OLDLIN+1 00.0004D1r 2 85 86 sta CURLIN 00.0004D3r 2 84 87 sty CURLIN+1 00.0004D5r 2 RET1: 00.0004D5r 2 60 rts 00.0004D6r 2 00.0004D6r 2 .ifdef KBD 00.0004D6r 2 PRT: 00.0004D6r 2 jsr GETBYT 00.0004D6r 2 txa 00.0004D6r 2 ; not ROR bug safe 00.0004D6r 2 ror a 00.0004D6r 2 ror a 00.0004D6r 2 ror a 00.0004D6r 2 sta $8F 00.0004D6r 2 rts 00.0004D6r 2 00.0004D6r 2 LE68C: 00.0004D6r 2 ldy #$12 00.0004D6r 2 LE68E: 00.0004D6r 2 lda LEA30,y 00.0004D6r 2 sta $03A2,y 00.0004D6r 2 dey 00.0004D6r 2 bpl LE68E 00.0004D6r 2 rts 00.0004D6r 2 .endif 00.0004D6r 2 00.0004D6r 2 .if .def(CONFIG_NULL) || .def(CONFIG_PRINTNULLS) 00.0004D6r 2 ; CBM1 has the keyword removed, 00.0004D6r 2 ; but the code is still here 00.0004D6r 2 NULL: 00.0004D6r 2 20 rr rr jsr GETBYT 00.0004D9r 2 D0 FA bne RET1 00.0004DBr 2 E8 inx 00.0004DCr 2 E0 F2 cpx #NULL_MAX 00.0004DEr 2 B0 04 bcs L2739 00.0004E0r 2 CA dex 00.0004E1r 2 86 15 stx Z15 00.0004E3r 2 60 rts 00.0004E4r 2 L2739: 00.0004E4r 2 4C rr rr jmp IQERR 00.0004E7r 2 .endif 00.0004E7r 2 .ifndef CONFIG_11A 00.0004E7r 2 CLEAR: 00.0004E7r 2 bne RET1 00.0004E7r 2 jmp CLEARC 00.0004E7r 2 .endif 00.0004E7r 2 00.0004E7r 1 .include "loadsave.s" 00.0004E7r 2 .segment "CODE" 00.0004E7r 2 00.0004E7r 2 .ifdef APPLE 00.0004E7r 2 .include "apple_loadsave.s" 00.0004E7r 2 .endif 00.0004E7r 2 .ifdef KIM 00.0004E7r 2 .include "kim_loadsave.s" 00.0004E7r 3 .segment "CODE" 00.0004E7r 3 SAVE: 00.0004E7r 3 BA tsx 00.0004E8r 3 86 12 stx INPUTFLG 00.0004EAr 3 A9 37 lda #$37 00.0004ECr 3 85 F2 sta $F2 00.0004EEr 3 A9 FE lda #$FE 00.0004F0r 3 8D F9 17 sta $17F9 00.0004F3r 3 A5 78 lda TXTTAB 00.0004F5r 3 A4 79 ldy TXTTAB+1 00.0004F7r 3 8D F5 17 sta $17F5 00.0004FAr 3 8C F6 17 sty $17F6 00.0004FDr 3 A5 7A lda VARTAB 00.0004FFr 3 A4 7B ldy VARTAB+1 00.000501r 3 8D F7 17 sta $17F7 00.000504r 3 8C F8 17 sty $17F8 00.000507r 3 4C 00 18 jmp L1800 00.00050Ar 3 A6 12 ldx INPUTFLG 00.00050Cr 3 9A txs 00.00050Dr 3 A9 rr lda #QT_SAVED 00.000511r 3 4C rr rr jmp STROUT 00.000514r 3 QT_LOADED: 00.000514r 3 4C 4F 41 44 .byte "LOADED" 00.000518r 3 45 44 00.00051Ar 3 00 .byte $00 00.00051Br 3 QT_SAVED: 00.00051Br 3 53 41 56 45 .byte "SAVED" 00.00051Fr 3 44 00.000520r 3 0D 0A 00 00 .byte $0D,$0A,$00,$00,$00,$00,$00,$00 00.000524r 3 00 00 00 00 00.000528r 3 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 00.00052Cr 3 00 00 00 00 00.000530r 3 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00 00.000534r 3 00 00 00 00.000537r 3 LOAD: 00.000537r 3 A5 78 lda TXTTAB 00.000539r 3 A4 79 ldy TXTTAB+1 00.00053Br 3 8D F5 17 sta $17F5 00.00053Er 3 8C F6 17 sty $17F6 00.000541r 3 A9 FF lda #$FF 00.000543r 3 8D F9 17 sta $17F9 00.000546r 3 A9 rr lda #L27A6 00.00054Ar 3 85 01 sta GORESTART+1 00.00054Cr 3 84 02 sty GORESTART+2 00.00054Er 3 4C 73 18 jmp L1873 00.000551r 3 L27A6: 00.000551r 3 A2 FF ldx #$FF 00.000553r 3 9A txs 00.000554r 3 A9 rr lda #RESTART 00.000558r 3 85 01 sta GORESTART+1 00.00055Ar 3 84 02 sty GORESTART+2 00.00055Cr 3 A9 rr lda #QT_LOADED 00.000560r 3 20 rr rr jsr STROUT 00.000563r 3 AE ED 17 ldx $17ED 00.000566r 3 AC EE 17 ldy $17EE 00.000569r 3 8A txa 00.00056Ar 3 D0 01 bne L27C2 00.00056Cr 3 EA nop 00.00056Dr 3 L27C2: 00.00056Dr 3 EA nop 00.00056Er 3 86 7A stx VARTAB 00.000570r 3 84 7B sty VARTAB+1 00.000572r 3 4C rr rr jmp FIX_LINKS 00.000575r 3 00.000575r 2 .endif 00.000575r 2 .ifdef MICROTAN 00.000575r 2 .include "microtan_loadsave.s" 00.000575r 2 .endif 00.000575r 2 00.000575r 1 .include "flow2.s" 00.000575r 2 .segment "CODE" 00.000575r 2 ; ---------------------------------------------------------------------------- 00.000575r 2 ; "RUN" COMMAND 00.000575r 2 ; ---------------------------------------------------------------------------- 00.000575r 2 RUN: 00.000575r 2 D0 03 bne L27CF 00.000577r 2 4C rr rr jmp SETPTRS 00.00057Ar 2 L27CF: 00.00057Ar 2 20 rr rr jsr CLEARC 00.00057Dr 2 4C rr rr jmp L27E9 00.000580r 2 00.000580r 2 ; ---------------------------------------------------------------------------- 00.000580r 2 ; "GOSUB" STATEMENT 00.000580r 2 ; 00.000580r 2 ; LEAVES 7 BYTES ON STACK: 00.000580r 2 ; 2 -- RETURN ADDRESS (NEWSTT) 00.000580r 2 ; 2 -- TXTPTR 00.000580r 2 ; 2 -- LINE # 00.000580r 2 ; 1 -- GOSUB TOKEN 00.000580r 2 ; ---------------------------------------------------------------------------- 00.000580r 2 GOSUB: 00.000580r 2 A9 03 lda #$03 00.000582r 2 20 rr rr jsr CHKMEM 00.000585r 2 A5 C8 lda TXTPTR+1 00.000587r 2 48 pha 00.000588r 2 A5 C7 lda TXTPTR 00.00058Ar 2 48 pha 00.00058Br 2 A5 87 lda CURLIN+1 00.00058Dr 2 48 pha 00.00058Er 2 A5 86 lda CURLIN 00.000590r 2 48 pha 00.000591r 2 A9 8C lda #TOKEN_GOSUB 00.000593r 2 48 pha 00.000594r 2 L27E9: 00.000594r 2 20 C6 00 jsr CHRGOT 00.000597r 2 20 rr rr jsr GOTO 00.00059Ar 2 4C rr rr jmp NEWSTT 00.00059Dr 2 00.00059Dr 2 ; ---------------------------------------------------------------------------- 00.00059Dr 2 ; "GOTO" STATEMENT 00.00059Dr 2 ; ALSO USED BY "RUN" AND "GOSUB" 00.00059Dr 2 ; ---------------------------------------------------------------------------- 00.00059Dr 2 GOTO: 00.00059Dr 2 20 rr rr jsr LINGET 00.0005A0r 2 20 rr rr jsr REMN 00.0005A3r 2 A5 87 lda CURLIN+1 00.0005A5r 2 C5 1A cmp LINNUM+1 00.0005A7r 2 B0 0B bcs L2809 00.0005A9r 2 98 tya 00.0005AAr 2 38 sec 00.0005ABr 2 65 C7 adc TXTPTR 00.0005ADr 2 A6 C8 ldx TXTPTR+1 00.0005AFr 2 90 07 bcc L280D 00.0005B1r 2 E8 inx 00.0005B2r 2 B0 04 bcs L280D 00.0005B4r 2 L2809: 00.0005B4r 2 A5 78 lda TXTTAB 00.0005B6r 2 A6 79 ldx TXTTAB+1 00.0005B8r 2 L280D: 00.0005B8r 2 .ifdef KBD 00.0005B8r 2 jsr LF457 00.0005B8r 2 bne UNDERR 00.0005B8r 2 .else 00.0005B8r 2 20 rr rr jsr FL1 00.0005BBr 2 90 1E bcc UNDERR 00.0005BDr 2 .endif 00.0005BDr 2 A5 AC lda LOWTRX 00.0005BFr 2 E9 01 sbc #$01 00.0005C1r 2 85 C7 sta TXTPTR 00.0005C3r 2 A5 AD lda LOWTRX+1 00.0005C5r 2 E9 00 sbc #$00 00.0005C7r 2 85 C8 sta TXTPTR+1 00.0005C9r 2 L281E: 00.0005C9r 2 60 rts 00.0005CAr 2 00.0005CAr 2 ; ---------------------------------------------------------------------------- 00.0005CAr 2 ; "POP" AND "RETURN" STATEMENTS 00.0005CAr 2 ; ---------------------------------------------------------------------------- 00.0005CAr 2 POP: 00.0005CAr 2 D0 FD bne L281E 00.0005CCr 2 A9 FF lda #$FF 00.0005CEr 2 .ifdef CONFIG_2A 00.0005CEr 2 sta FORPNT+1 ; bugfix, wrong in AppleSoft II 00.0005CEr 2 .else 00.0005CEr 2 85 96 sta FORPNT 00.0005D0r 2 .endif 00.0005D0r 2 20 rr rr jsr GTFORPNT 00.0005D3r 2 9A txs 00.0005D4r 2 C9 8C cmp #TOKEN_GOSUB 00.0005D6r 2 F0 0B beq RETURN 00.0005D8r 2 A2 16 ldx #ERR_NOGOSUB 00.0005DAr 2 2C .byte $2C 00.0005DBr 2 UNDERR: 00.0005DBr 2 A2 5A ldx #ERR_UNDEFSTAT 00.0005DDr 2 4C rr rr jmp ERROR 00.0005E0r 2 ; ---------------------------------------------------------------------------- 00.0005E0r 2 SYNERR2: 00.0005E0r 2 4C rr rr jmp SYNERR 00.0005E3r 2 ; ---------------------------------------------------------------------------- 00.0005E3r 2 RETURN: 00.0005E3r 2 68 pla 00.0005E4r 2 68 pla 00.0005E5r 2 85 86 sta CURLIN 00.0005E7r 2 68 pla 00.0005E8r 2 85 87 sta CURLIN+1 00.0005EAr 2 68 pla 00.0005EBr 2 85 C7 sta TXTPTR 00.0005EDr 2 68 pla 00.0005EEr 2 85 C8 sta TXTPTR+1 00.0005F0r 2 00.0005F0r 2 ; ---------------------------------------------------------------------------- 00.0005F0r 2 ; "DATA" STATEMENT 00.0005F0r 2 ; EXECUTED BY SKIPPING TO NEXT COLON OR EOL 00.0005F0r 2 ; ---------------------------------------------------------------------------- 00.0005F0r 2 DATA: 00.0005F0r 2 20 rr rr jsr DATAN 00.0005F3r 2 00.0005F3r 2 ; ---------------------------------------------------------------------------- 00.0005F3r 2 ; ADD (Y) TO TXTPTR 00.0005F3r 2 ; ---------------------------------------------------------------------------- 00.0005F3r 2 ADDON: 00.0005F3r 2 98 tya 00.0005F4r 2 18 clc 00.0005F5r 2 65 C7 adc TXTPTR 00.0005F7r 2 85 C7 sta TXTPTR 00.0005F9r 2 90 02 bcc L2852 00.0005FBr 2 E6 C8 inc TXTPTR+1 00.0005FDr 2 L2852: 00.0005FDr 2 60 rts 00.0005FEr 2 00.0005FEr 2 ; ---------------------------------------------------------------------------- 00.0005FEr 2 ; SCAN AHEAD TO NEXT ":" OR EOL 00.0005FEr 2 ; ---------------------------------------------------------------------------- 00.0005FEr 2 DATAN: 00.0005FEr 2 A2 3A ldx #$3A 00.000600r 2 2C .byte $2C 00.000601r 2 REMN: 00.000601r 2 A2 00 ldx #$00 00.000603r 2 86 0A stx CHARAC 00.000605r 2 A0 00 ldy #$00 00.000607r 2 84 0B sty ENDCHR 00.000609r 2 L285E: 00.000609r 2 A5 0B lda ENDCHR 00.00060Br 2 A6 0A ldx CHARAC 00.00060Dr 2 85 0A sta CHARAC 00.00060Fr 2 86 0B stx ENDCHR 00.000611r 2 L2866: 00.000611r 2 B1 C7 lda (TXTPTR),y 00.000613r 2 F0 E8 beq L2852 00.000615r 2 C5 0B cmp ENDCHR 00.000617r 2 F0 E4 beq L2852 00.000619r 2 C8 iny 00.00061Ar 2 C9 22 cmp #$22 00.00061Cr 2 .ifndef CONFIG_11 00.00061Cr 2 beq L285E; old: swap & cont is faster 00.00061Cr 2 bne L2866 00.00061Cr 2 .else 00.00061Cr 2 D0 F3 bne L2866; new: cont is faster 00.00061Er 2 F0 E9 beq L285E 00.000620r 2 .endif 00.000620r 2 00.000620r 2 ; ---------------------------------------------------------------------------- 00.000620r 2 ; "IF" STATEMENT 00.000620r 2 ; ---------------------------------------------------------------------------- 00.000620r 2 IF: 00.000620r 2 20 rr rr jsr FRMEVL 00.000623r 2 20 C6 00 jsr CHRGOT 00.000626r 2 C9 88 cmp #TOKEN_GOTO 00.000628r 2 F0 05 beq L2884 00.00062Ar 2 A9 A1 lda #TOKEN_THEN 00.00062Cr 2 20 rr rr jsr SYNCHR 00.00062Fr 2 L2884: 00.00062Fr 2 A5 AE lda FAC 00.000631r 2 D0 05 bne L288D 00.000633r 2 00.000633r 2 ; ---------------------------------------------------------------------------- 00.000633r 2 ; "REM" STATEMENT, OR FALSE "IF" STATEMENT 00.000633r 2 ; ---------------------------------------------------------------------------- 00.000633r 2 REM: 00.000633r 2 20 rr rr jsr REMN 00.000636r 2 F0 BB beq ADDON 00.000638r 2 L288D: 00.000638r 2 20 C6 00 jsr CHRGOT 00.00063Br 2 B0 03 bcs L2895 00.00063Dr 2 4C rr rr jmp GOTO 00.000640r 2 L2895: 00.000640r 2 4C rr rr jmp EXECUTE_STATEMENT 00.000643r 2 00.000643r 2 ; ---------------------------------------------------------------------------- 00.000643r 2 ; "ON" STATEMENT 00.000643r 2 ; 00.000643r 2 ; ON GOTO 00.000643r 2 ; ON GOSUB 00.000643r 2 ; ---------------------------------------------------------------------------- 00.000643r 2 ON: 00.000643r 2 20 rr rr jsr GETBYT 00.000646r 2 48 pha 00.000647r 2 C9 8C cmp #TOKEN_GOSUB 00.000649r 2 F0 04 beq L28A4 00.00064Br 2 L28A0: 00.00064Br 2 C9 88 cmp #TOKEN_GOTO 00.00064Dr 2 D0 91 bne SYNERR2 00.00064Fr 2 L28A4: 00.00064Fr 2 C6 B2 dec FAC_LAST 00.000651r 2 D0 04 bne L28AC 00.000653r 2 68 pla 00.000654r 2 4C rr rr jmp EXECUTE_STATEMENT1 00.000657r 2 L28AC: 00.000657r 2 20 C0 00 jsr CHRGET 00.00065Ar 2 20 rr rr jsr LINGET 00.00065Dr 2 C9 2C cmp #$2C 00.00065Fr 2 F0 EE beq L28A4 00.000661r 2 68 pla 00.000662r 2 L28B7: 00.000662r 2 60 rts 00.000663r 2 00.000663r 1 .include "misc1.s" 00.000663r 2 .segment "CODE" 00.000663r 2 00.000663r 2 ; ---------------------------------------------------------------------------- 00.000663r 2 ; CONVERT LINE NUMBER 00.000663r 2 ; ---------------------------------------------------------------------------- 00.000663r 2 LINGET: 00.000663r 2 A2 00 ldx #$00 00.000665r 2 86 19 stx LINNUM 00.000667r 2 86 1A stx LINNUM+1 00.000669r 2 L28BE: 00.000669r 2 B0 F7 bcs L28B7 00.00066Br 2 E9 2F sbc #$2F 00.00066Dr 2 85 0A sta CHARAC 00.00066Fr 2 A5 1A lda LINNUM+1 00.000671r 2 85 6F sta INDEX 00.000673r 2 C9 19 cmp #$19 00.000675r 2 B0 D4 bcs L28A0 00.000677r 2 ; <<<<>>>> 00.000677r 2 ; NOTE THAT IF (A) = $AB ON THE LINE ABOVE, 00.000677r 2 ; ON.1 WILL COMPARE = AND CAUSE A CATASTROPHIC 00.000677r 2 ; JUMP TO $22D9 (FOR GOTO), OR OTHER LOCATIONS 00.000677r 2 ; FOR OTHER CALLS TO LINGET. 00.000677r 2 ; 00.000677r 2 ; YOU CAN SEE THIS IS YOU FIRST PUT "BRK" IN $22D9, 00.000677r 2 ; THEN TYPE "GO TO 437761". 00.000677r 2 ; 00.000677r 2 ; ANY VALUE FROM 437760 THROUGH 440319 WILL CAUSE 00.000677r 2 ; THE PROBLEM. ($AB00 - $ABFF) 00.000677r 2 ; <<<<>>>> 00.000677r 2 A5 19 lda LINNUM 00.000679r 2 0A asl a 00.00067Ar 2 26 6F rol INDEX 00.00067Cr 2 0A asl a 00.00067Dr 2 26 6F rol INDEX 00.00067Fr 2 65 19 adc LINNUM 00.000681r 2 85 19 sta LINNUM 00.000683r 2 A5 6F lda INDEX 00.000685r 2 65 1A adc LINNUM+1 00.000687r 2 85 1A sta LINNUM+1 00.000689r 2 06 19 asl LINNUM 00.00068Br 2 26 1A rol LINNUM+1 00.00068Dr 2 A5 19 lda LINNUM 00.00068Fr 2 65 0A adc CHARAC 00.000691r 2 85 19 sta LINNUM 00.000693r 2 90 02 bcc L28EC 00.000695r 2 E6 1A inc LINNUM+1 00.000697r 2 L28EC: 00.000697r 2 20 C0 00 jsr CHRGET 00.00069Ar 2 4C rr rr jmp L28BE 00.00069Dr 2 00.00069Dr 2 ; ---------------------------------------------------------------------------- 00.00069Dr 2 ; "LET" STATEMENT 00.00069Dr 2 ; 00.00069Dr 2 ; LET = 00.00069Dr 2 ; = 00.00069Dr 2 ; ---------------------------------------------------------------------------- 00.00069Dr 2 LET: 00.00069Dr 2 20 rr rr jsr PTRGET 00.0006A0r 2 85 96 sta FORPNT 00.0006A2r 2 84 97 sty FORPNT+1 00.0006A4r 2 A9 AC lda #TOKEN_EQUAL 00.0006A6r 2 20 rr rr jsr SYNCHR 00.0006A9r 2 .ifndef CONFIG_SMALL 00.0006A9r 2 A5 0F lda VALTYP+1 00.0006ABr 2 48 pha 00.0006ACr 2 .endif 00.0006ACr 2 A5 0E lda VALTYP 00.0006AEr 2 48 pha 00.0006AFr 2 20 rr rr jsr FRMEVL 00.0006B2r 2 68 pla 00.0006B3r 2 2A rol a 00.0006B4r 2 20 rr rr jsr CHKVAL 00.0006B7r 2 D0 18 bne LETSTRING 00.0006B9r 2 .ifndef CONFIG_SMALL 00.0006B9r 2 68 pla 00.0006BAr 2 LET2: 00.0006BAr 2 10 12 bpl L2923 00.0006BCr 2 20 rr rr jsr ROUND_FAC 00.0006BFr 2 20 rr rr jsr AYINT 00.0006C2r 2 A0 00 ldy #$00 00.0006C4r 2 A5 B1 lda FAC+3 00.0006C6r 2 91 96 sta (FORPNT),y 00.0006C8r 2 C8 iny 00.0006C9r 2 A5 B2 lda FAC+4 00.0006CBr 2 91 96 sta (FORPNT),y 00.0006CDr 2 60 rts 00.0006CEr 2 L2923: 00.0006CEr 2 .endif 00.0006CEr 2 00.0006CEr 2 ; ---------------------------------------------------------------------------- 00.0006CEr 2 ; REAL VARIABLE = EXPRESSION 00.0006CEr 2 ; ---------------------------------------------------------------------------- 00.0006CEr 2 4C rr rr jmp SETFOR 00.0006D1r 2 LETSTRING: 00.0006D1r 2 .ifndef CONFIG_SMALL 00.0006D1r 2 68 pla 00.0006D2r 2 .endif 00.0006D2r 2 00.0006D2r 2 ; ---------------------------------------------------------------------------- 00.0006D2r 2 ; INSTALL STRING, DESCRIPTOR ADDRESS IS AT FAC+3,4 00.0006D2r 2 ; ---------------------------------------------------------------------------- 00.0006D2r 2 PUTSTR: 00.0006D2r 2 .ifdef CONFIG_CBM_ALL 00.0006D2r 2 ldy FORPNT+1 00.0006D2r 2 .ifdef CBM1 00.0006D2r 2 cpy #$D0 ; TI$ 00.0006D2r 2 .else 00.0006D2r 2 cpy #$DE 00.0006D2r 2 .endif 00.0006D2r 2 bne LC92B 00.0006D2r 2 jsr FREFAC 00.0006D2r 2 cmp #$06 00.0006D2r 2 .ifdef CBM2 00.0006D2r 2 bne IQERR1 00.0006D2r 2 .else 00.0006D2r 2 jne IQERR 00.0006D2r 2 .endif 00.0006D2r 2 ldy #$00 00.0006D2r 2 sty FAC 00.0006D2r 2 sty FACSIGN 00.0006D2r 2 LC8E8: 00.0006D2r 2 sty STRNG2 00.0006D2r 2 jsr LC91C 00.0006D2r 2 jsr MUL10 00.0006D2r 2 inc STRNG2 00.0006D2r 2 ldy STRNG2 00.0006D2r 2 jsr LC91C 00.0006D2r 2 jsr COPY_FAC_TO_ARG_ROUNDED 00.0006D2r 2 tax 00.0006D2r 2 beq LC902 00.0006D2r 2 inx 00.0006D2r 2 txa 00.0006D2r 2 jsr LD9BF 00.0006D2r 2 LC902: 00.0006D2r 2 ldy STRNG2 00.0006D2r 2 iny 00.0006D2r 2 cpy #$06 00.0006D2r 2 bne LC8E8 00.0006D2r 2 jsr MUL10 00.0006D2r 2 jsr QINT 00.0006D2r 2 ldx #$02 00.0006D2r 2 sei 00.0006D2r 2 LC912: 00.0006D2r 2 lda FAC+2,x 00.0006D2r 2 sta TISTR,x 00.0006D2r 2 dex 00.0006D2r 2 bpl LC912 00.0006D2r 2 cli 00.0006D2r 2 rts 00.0006D2r 2 LC91C: 00.0006D2r 2 lda (INDEX),y 00.0006D2r 2 jsr CHRGOT2 00.0006D2r 2 bcc LC926 00.0006D2r 2 IQERR1: 00.0006D2r 2 jmp IQERR 00.0006D2r 2 LC926: 00.0006D2r 2 sbc #$2F 00.0006D2r 2 jmp ADDACC 00.0006D2r 2 LC92B: 00.0006D2r 2 .endif 00.0006D2r 2 A0 02 ldy #$02 00.0006D4r 2 B1 B1 lda (FAC_LAST-1),y 00.0006D6r 2 C5 81 cmp FRETOP+1 00.0006D8r 2 90 17 bcc L2946 00.0006DAr 2 D0 07 bne L2938 00.0006DCr 2 88 dey 00.0006DDr 2 B1 B1 lda (FAC_LAST-1),y 00.0006DFr 2 C5 80 cmp FRETOP 00.0006E1r 2 90 0E bcc L2946 00.0006E3r 2 L2938: 00.0006E3r 2 A4 B2 ldy FAC_LAST 00.0006E5r 2 C4 7B cpy VARTAB+1 00.0006E7r 2 90 08 bcc L2946 00.0006E9r 2 D0 0D bne L294D 00.0006EBr 2 A5 B1 lda FAC_LAST-1 00.0006EDr 2 C5 7A cmp VARTAB 00.0006EFr 2 B0 07 bcs L294D 00.0006F1r 2 L2946: 00.0006F1r 2 A5 B1 lda FAC_LAST-1 00.0006F3r 2 A4 B2 ldy FAC_LAST 00.0006F5r 2 4C rr rr jmp L2963 00.0006F8r 2 L294D: 00.0006F8r 2 A0 00 ldy #$00 00.0006FAr 2 B1 B1 lda (FAC_LAST-1),y 00.0006FCr 2 20 rr rr jsr STRINI 00.0006FFr 2 A5 9D lda DSCPTR 00.000701r 2 A4 9E ldy DSCPTR+1 00.000703r 2 85 BC sta STRNG1 00.000705r 2 84 BD sty STRNG1+1 00.000707r 2 20 rr rr jsr MOVINS 00.00070Ar 2 A9 AE lda #FAC 00.00070Cr 2 A0 00 ldy #$00 00.00070Er 2 L2963: 00.00070Er 2 85 9D sta DSCPTR 00.000710r 2 84 9E sty DSCPTR+1 00.000712r 2 20 rr rr jsr FRETMS 00.000715r 2 A0 00 ldy #$00 00.000717r 2 B1 9D lda (DSCPTR),y 00.000719r 2 91 96 sta (FORPNT),y 00.00071Br 2 C8 iny 00.00071Cr 2 B1 9D lda (DSCPTR),y 00.00071Er 2 91 96 sta (FORPNT),y 00.000720r 2 C8 iny 00.000721r 2 B1 9D lda (DSCPTR),y 00.000723r 2 91 96 sta (FORPNT),y 00.000725r 2 60 rts 00.000726r 2 .ifdef CONFIG_FILE 00.000726r 2 PRINTH: 00.000726r 2 jsr CMD 00.000726r 2 jmp LCAD6 00.000726r 2 CMD: 00.000726r 2 jsr GETBYT 00.000726r 2 beq LC98F 00.000726r 2 lda #$2C 00.000726r 2 jsr SYNCHR 00.000726r 2 LC98F: 00.000726r 2 php 00.000726r 2 jsr CHKOUT 00.000726r 2 stx CURDVC 00.000726r 2 plp 00.000726r 2 jmp PRINT 00.000726r 2 .endif 00.000726r 2 00.000726r 2 00.000726r 1 .include "print.s" 00.000726r 2 .segment "CODE" 00.000726r 2 00.000726r 2 PRSTRING: 00.000726r 2 20 rr rr jsr STRPRT 00.000729r 2 L297E: 00.000729r 2 20 C6 00 jsr CHRGOT 00.00072Cr 2 00.00072Cr 2 ; ---------------------------------------------------------------------------- 00.00072Cr 2 ; "PRINT" STATEMENT 00.00072Cr 2 ; ---------------------------------------------------------------------------- 00.00072Cr 2 PRINT: 00.00072Cr 2 F0 3C beq CRDO 00.00072Er 2 PRINT2: 00.00072Er 2 F0 58 beq L29DD 00.000730r 2 C9 9D cmp #TOKEN_TAB 00.000732r 2 F0 6C beq L29F5 00.000734r 2 C9 A0 cmp #TOKEN_SPC 00.000736r 2 .ifdef CONFIG_2 00.000736r 2 clc ; also AppleSoft II 00.000736r 2 .endif 00.000736r 2 F0 68 beq L29F5 00.000738r 2 C9 2C cmp #',' 00.00073Ar 2 ; Pre-KIM had no CLC. KIM added the CLC 00.00073Ar 2 ; here. Post-KIM moved the CLC up... 00.00073Ar 2 ; (makes no sense on KIM, liveness = 0) 00.00073Ar 2 .if .def(CONFIG_11A) && (!.def(CONFIG_2)) 00.00073Ar 2 18 clc 00.00073Br 2 .endif 00.00073Br 2 F0 4C beq L29DE 00.00073Dr 2 C9 3B cmp #$3B 00.00073Fr 2 F0 77 beq L2A0D 00.000741r 2 20 rr rr jsr FRMEVL 00.000744r 2 24 0E bit VALTYP 00.000746r 2 30 DE bmi PRSTRING 00.000748r 2 20 rr rr jsr FOUT 00.00074Br 2 20 rr rr jsr STRLIT 00.00074Er 2 .ifndef CONFIG_NO_CR 00.00074Er 2 A0 00 ldy #$00 00.000750r 2 B1 B1 lda (FAC_LAST-1),y 00.000752r 2 18 clc 00.000753r 2 65 16 adc POSX 00.000755r 2 .ifdef KBD 00.000755r 2 cmp #$28 00.000755r 2 .else 00.000755r 2 C5 17 cmp Z17 00.000757r 2 .endif 00.000757r 2 90 03 bcc L29B1 00.000759r 2 20 rr rr jsr CRDO 00.00075Cr 2 L29B1: 00.00075Cr 2 .endif 00.00075Cr 2 20 rr rr jsr STRPRT 00.00075Fr 2 .ifdef KBD 00.00075Fr 2 jmp L297E 00.00075Fr 2 .else 00.00075Fr 2 20 rr rr jsr OUTSP 00.000762r 2 D0 C5 bne L297E ; branch always 00.000764r 2 .endif 00.000764r 2 00.000764r 2 .ifdef KBD 00.000764r 2 ; PATCHES 00.000764r 2 LE86C: 00.000764r 2 pla 00.000764r 2 jmp CONTROL_C_TYPED 00.000764r 2 LE870: 00.000764r 2 jsr GETBYT 00.000764r 2 txa 00.000764r 2 LE874: 00.000764r 2 beq LE878 00.000764r 2 bpl LE8F2 00.000764r 2 LE878: 00.000764r 2 jmp IQERR 00.000764r 2 ; PATCHES 00.000764r 2 .endif 00.000764r 2 00.000764r 2 00.000764r 2 00.000764r 2 .ifndef KBD 00.000764r 2 L29B9: 00.000764r 2 .ifdef CBM2 00.000764r 2 lda #$00 00.000764r 2 sta INPUTBUFFER,x 00.000764r 2 ldx #<(INPUTBUFFER-1) 00.000764r 2 ldy #>(INPUTBUFFER-1) 00.000764r 2 .else 00.000764r 2 .ifndef APPLE 00.000764r 2 A0 00 ldy #$00 00.000766r 2 94 1B sty INPUTBUFFER,x 00.000768r 2 A2 1A ldx #LINNUM+1 00.00076Ar 2 .endif 00.00076Ar 2 .ifdef MICROTAN 00.00076Ar 2 bne CRDO2 00.00076Ar 2 .endif 00.00076Ar 2 .endif 00.00076Ar 2 .ifdef CONFIG_FILE 00.00076Ar 2 lda CURDVC 00.00076Ar 2 bne L29DD 00.00076Ar 2 .endif 00.00076Ar 2 .endif 00.00076Ar 2 00.00076Ar 2 00.00076Ar 2 CRDO: 00.00076Ar 2 .if .def(CONFIG_PRINTNULLS) && .def(CONFIG_FILE) 00.00076Ar 2 lda CURDVC 00.00076Ar 2 bne LC9D8 00.00076Ar 2 sta POSX 00.00076Ar 2 LC9D8: 00.00076Ar 2 .endif 00.00076Ar 2 A9 0D lda #CRLF_1 00.00076Cr 2 .ifndef CONFIG_CBM_ALL 00.00076Cr 2 85 16 sta POSX 00.00076Er 2 .endif 00.00076Er 2 20 rr rr jsr OUTDO 00.000771r 2 CRDO2: 00.000771r 2 A9 0A lda #CRLF_2 00.000773r 2 20 rr rr jsr OUTDO 00.000776r 2 00.000776r 2 PRINTNULLS: 00.000776r 2 .ifdef KBD 00.000776r 2 lda #$00 00.000776r 2 sta POSX 00.000776r 2 eor #$FF 00.000776r 2 .else 00.000776r 2 .if .def(CONFIG_NULL) || .def(CONFIG_PRINTNULLS) 00.000776r 2 .ifdef CONFIG_FILE 00.000776r 2 ; Although there is no statement for it, 00.000776r 2 ; CBM1 had NULL support and ignores 00.000776r 2 ; it when not targeting the screen, 00.000776r 2 ; CBM2 dropped it completely. 00.000776r 2 lda CURDVC 00.000776r 2 bne L29DD 00.000776r 2 .endif 00.000776r 2 8A txa 00.000777r 2 48 pha 00.000778r 2 A6 15 ldx Z15 00.00077Ar 2 F0 08 beq L29D9 00.00077Cr 2 A9 00 lda #$00 00.00077Er 2 L29D3: 00.00077Er 2 20 rr rr jsr OUTDO 00.000781r 2 CA dex 00.000782r 2 D0 FA bne L29D3 00.000784r 2 L29D9: 00.000784r 2 86 16 stx POSX 00.000786r 2 68 pla 00.000787r 2 AA tax 00.000788r 2 .else 00.000788r 2 .ifndef CONFIG_2 00.000788r 2 lda #$00 00.000788r 2 sta POSX 00.000788r 2 .endif 00.000788r 2 eor #$FF 00.000788r 2 .endif 00.000788r 2 .endif 00.000788r 2 L29DD: 00.000788r 2 60 rts 00.000789r 2 L29DE: 00.000789r 2 A5 16 lda POSX 00.00078Br 2 .ifndef CONFIG_NO_CR 00.00078Br 2 .ifdef KBD 00.00078Br 2 cmp #$1A 00.00078Br 2 .else 00.00078Br 2 C5 18 cmp Z18 00.00078Dr 2 .endif 00.00078Dr 2 90 06 bcc L29EA 00.00078Fr 2 20 rr rr jsr CRDO 00.000792r 2 4C rr rr jmp L2A0D 00.000795r 2 L29EA: 00.000795r 2 .endif 00.000795r 2 38 sec 00.000796r 2 L29EB: 00.000796r 2 .ifdef CONFIG_CBM_ALL 00.000796r 2 sbc #$0A 00.000796r 2 .else 00.000796r 2 .ifdef KBD 00.000796r 2 sbc #$0D 00.000796r 2 .else 00.000796r 2 E9 0E sbc #$0E 00.000798r 2 .endif 00.000798r 2 .endif 00.000798r 2 B0 FC bcs L29EB 00.00079Ar 2 49 FF eor #$FF 00.00079Cr 2 69 01 adc #$01 00.00079Er 2 D0 13 bne L2A08 00.0007A0r 2 L29F5: 00.0007A0r 2 .ifdef CONFIG_11A 00.0007A0r 2 08 php 00.0007A1r 2 .else 00.0007A1r 2 pha 00.0007A1r 2 .endif 00.0007A1r 2 20 rr rr jsr GTBYTC 00.0007A4r 2 C9 29 cmp #')' 00.0007A6r 2 .ifdef CONFIG_11A 00.0007A6r 2 .ifdef CONFIG_2 00.0007A6r 2 bne SYNERR4 00.0007A6r 2 .else 00.0007A6r 2 F0 03 4C rr jne SYNERR 00.0007AAr 2 rr 00.0007ABr 2 .endif 00.0007ABr 2 28 plp 00.0007ACr 2 90 06 bcc L2A09 00.0007AEr 2 .else 00.0007AEr 2 .ifdef CONFIG_11 00.0007AEr 2 jne SYNERR 00.0007AEr 2 .else 00.0007AEr 2 bne SYNERR4 00.0007AEr 2 .endif 00.0007AEr 2 pla 00.0007AEr 2 cmp #TOKEN_TAB 00.0007AEr 2 .ifdef CONFIG_11 00.0007AEr 2 bne L2A09 00.0007AEr 2 .else 00.0007AEr 2 bne L2A0A 00.0007AEr 2 .endif 00.0007AEr 2 .endif 00.0007AEr 2 8A txa 00.0007AFr 2 E5 16 sbc POSX 00.0007B1r 2 90 05 bcc L2A0D 00.0007B3r 2 .ifndef CONFIG_11 00.0007B3r 2 beq L2A0D 00.0007B3r 2 .endif 00.0007B3r 2 L2A08: 00.0007B3r 2 AA tax 00.0007B4r 2 .ifdef CONFIG_11 00.0007B4r 2 L2A09: 00.0007B4r 2 E8 inx 00.0007B5r 2 .endif 00.0007B5r 2 L2A0A: 00.0007B5r 2 .ifndef CONFIG_11 00.0007B5r 2 jsr OUTSP 00.0007B5r 2 .endif 00.0007B5r 2 CA dex 00.0007B6r 2 .ifndef CONFIG_11 00.0007B6r 2 bne L2A0A 00.0007B6r 2 .else 00.0007B6r 2 D0 06 bne L2A13 00.0007B8r 2 .endif 00.0007B8r 2 L2A0D: 00.0007B8r 2 20 C0 00 jsr CHRGET 00.0007BBr 2 4C rr rr jmp PRINT2 00.0007BEr 2 .ifdef CONFIG_11 00.0007BEr 2 L2A13: 00.0007BEr 2 20 rr rr jsr OUTSP 00.0007C1r 2 D0 F2 bne L2A0A 00.0007C3r 2 .endif 00.0007C3r 2 00.0007C3r 2 ; ---------------------------------------------------------------------------- 00.0007C3r 2 ; PRINT STRING AT (Y,A) 00.0007C3r 2 ; ---------------------------------------------------------------------------- 00.0007C3r 2 STROUT: 00.0007C3r 2 20 rr rr jsr STRLIT 00.0007C6r 2 00.0007C6r 2 ; ---------------------------------------------------------------------------- 00.0007C6r 2 ; PRINT STRING AT (FACMO,FACLO) 00.0007C6r 2 ; ---------------------------------------------------------------------------- 00.0007C6r 2 STRPRT: 00.0007C6r 2 20 rr rr jsr FREFAC 00.0007C9r 2 AA tax 00.0007CAr 2 A0 00 ldy #$00 00.0007CCr 2 E8 inx 00.0007CDr 2 L2A22: 00.0007CDr 2 CA dex 00.0007CEr 2 F0 B8 beq L29DD 00.0007D0r 2 B1 6F lda (INDEX),y 00.0007D2r 2 20 rr rr jsr OUTDO 00.0007D5r 2 C8 iny 00.0007D6r 2 C9 0D cmp #$0D 00.0007D8r 2 D0 F3 bne L2A22 00.0007DAr 2 20 rr rr jsr PRINTNULLS 00.0007DDr 2 4C rr rr jmp L2A22 00.0007E0r 2 ; ---------------------------------------------------------------------------- 00.0007E0r 2 OUTSP: 00.0007E0r 2 .ifdef CONFIG_FILE 00.0007E0r 2 .ifndef CBM1 00.0007E0r 2 ; on non-screen devices, print SPACE 00.0007E0r 2 ; instead of CRSR RIGHT 00.0007E0r 2 lda CURDVC 00.0007E0r 2 beq LCA40 00.0007E0r 2 lda #$20 00.0007E0r 2 .byte $2C 00.0007E0r 2 LCA40: 00.0007E0r 2 .endif 00.0007E0r 2 lda #$1D ; CRSR RIGHT 00.0007E0r 2 .else 00.0007E0r 2 A9 20 lda #$20 00.0007E2r 2 .endif 00.0007E2r 2 2C .byte $2C 00.0007E3r 2 OUTQUES: 00.0007E3r 2 A9 3F lda #$3F 00.0007E5r 2 00.0007E5r 2 ; ---------------------------------------------------------------------------- 00.0007E5r 2 ; PRINT CHAR FROM (A) 00.0007E5r 2 ; ---------------------------------------------------------------------------- 00.0007E5r 2 OUTDO: 00.0007E5r 2 .ifndef KBD 00.0007E5r 2 24 14 bit Z14 00.0007E7r 2 30 18 bmi L2A56 00.0007E9r 2 .endif 00.0007E9r 2 .if .def(CONFIG_PRINT_CR) || .def(CBM1) 00.0007E9r 2 ; Commodore forgot to remove this in CBM1 00.0007E9r 2 48 pha 00.0007EAr 2 .endif 00.0007EAr 2 .ifdef CBM1 00.0007EAr 2 cmp #$1D ; CRSR RIGHT 00.0007EAr 2 beq LCA6A 00.0007EAr 2 cmp #$9D ; CRSR LEFT 00.0007EAr 2 beq LCA5A 00.0007EAr 2 cmp #$14 ; DEL 00.0007EAr 2 bne LCA64 00.0007EAr 2 LCA5A: 00.0007EAr 2 lda POSX 00.0007EAr 2 beq L2A4E 00.0007EAr 2 lda CURDVC 00.0007EAr 2 bne L2A4E 00.0007EAr 2 dec POSX 00.0007EAr 2 LCA64: 00.0007EAr 2 and #$7F 00.0007EAr 2 .endif 00.0007EAr 2 .ifndef CBM2 00.0007EAr 2 C9 20 cmp #$20 00.0007ECr 2 90 0B bcc L2A4E 00.0007EEr 2 .endif 00.0007EEr 2 LCA6A: 00.0007EEr 2 .ifdef CONFIG_CBM1_PATCHES 00.0007EEr 2 lda CURDVC 00.0007EEr 2 jsr PATCH6 00.0007EEr 2 nop 00.0007EEr 2 .endif 00.0007EEr 2 .ifdef CONFIG_PRINT_CR 00.0007EEr 2 A5 16 lda POSX 00.0007F0r 2 C5 17 cmp Z17 00.0007F2r 2 D0 03 bne L2A4C 00.0007F4r 2 .ifdef APPLE 00.0007F4r 2 nop ; PATCH! 00.0007F4r 2 nop ; don't print CR 00.0007F4r 2 nop 00.0007F4r 2 .else 00.0007F4r 2 20 rr rr jsr CRDO 00.0007F7r 2 .endif 00.0007F7r 2 L2A4C: 00.0007F7r 2 .endif 00.0007F7r 2 .ifndef CONFIG_CBM_ALL 00.0007F7r 2 E6 16 inc POSX 00.0007F9r 2 .endif 00.0007F9r 2 L2A4E: 00.0007F9r 2 .if .def(CONFIG_PRINT_CR) || .def(CBM1) 00.0007F9r 2 ; Commodore forgot to remove this in CBM1 00.0007F9r 2 68 pla 00.0007FAr 2 .endif 00.0007FAr 2 .ifdef CONFIG_MONCOUT_DESTROYS_Y 00.0007FAr 2 84 0D sty DIMFLG 00.0007FCr 2 .endif 00.0007FCr 2 .ifdef CONFIG_IO_MSB 00.0007FCr 2 ora #$80 00.0007FCr 2 .endif 00.0007FCr 2 20 A0 1E jsr MONCOUT 00.0007FFr 2 .ifdef CONFIG_IO_MSB 00.0007FFr 2 and #$7F 00.0007FFr 2 .endif 00.0007FFr 2 .ifdef CONFIG_MONCOUT_DESTROYS_Y 00.0007FFr 2 A4 0D ldy DIMFLG 00.000801r 2 .endif 00.000801r 2 .ifdef OSI 00.000801r 2 nop 00.000801r 2 nop 00.000801r 2 nop 00.000801r 2 nop 00.000801r 2 .endif 00.000801r 2 L2A56: 00.000801r 2 29 FF and #$FF 00.000803r 2 LE8F2: 00.000803r 2 60 rts 00.000804r 2 00.000804r 2 ; ---------------------------------------------------------------------------- 00.000804r 2 ; ??? 00.000804r 2 ; ---------------------------------------------------------------------------- 00.000804r 2 .ifdef KBD 00.000804r 2 LE8F3: 00.000804r 2 pha 00.000804r 2 lda $047F 00.000804r 2 clc 00.000804r 2 beq LE900 00.000804r 2 lda #$00 00.000804r 2 sta $047F 00.000804r 2 sec 00.000804r 2 LE900: 00.000804r 2 pla 00.000804r 2 rts 00.000804r 2 .endif 00.000804r 2 00.000804r 1 .include "input.s" 00.000804r 2 .segment "CODE" 00.000804r 2 00.000804r 2 ; ---------------------------------------------------------------------------- 00.000804r 2 ; INPUT CONVERSION ERROR: ILLEGAL CHARACTER 00.000804r 2 ; IN NUMERIC FIELD. MUST DISTINGUISH 00.000804r 2 ; BETWEEN INPUT, READ, AND GET 00.000804r 2 ; ---------------------------------------------------------------------------- 00.000804r 2 INPUTERR: 00.000804r 2 A5 12 lda INPUTFLG 00.000806r 2 F0 11 beq RESPERR ; INPUT 00.000808r 2 .ifndef CONFIG_SMALL 00.000808r 2 .ifdef CONFIG_10A 00.000808r 2 ; without this, it treats GET errors 00.000808r 2 ; like READ errors 00.000808r 2 30 04 bmi L2A63 ; READ 00.00080Ar 2 A0 FF ldy #$FF ; GET 00.00080Cr 2 D0 04 bne L2A67 00.00080Er 2 L2A63: 00.00080Er 2 .endif 00.00080Er 2 .endif 00.00080Er 2 .ifdef CONFIG_CBM1_PATCHES 00.00080Er 2 jsr PATCH5 00.00080Er 2 nop 00.00080Er 2 .else 00.00080Er 2 A5 8C lda Z8C 00.000810r 2 A4 8D ldy Z8C+1 00.000812r 2 .endif 00.000812r 2 L2A67: 00.000812r 2 85 86 sta CURLIN 00.000814r 2 84 87 sty CURLIN+1 00.000816r 2 SYNERR4: 00.000816r 2 4C rr rr jmp SYNERR 00.000819r 2 RESPERR: 00.000819r 2 .ifdef CONFIG_FILE 00.000819r 2 lda CURDVC 00.000819r 2 beq LCA8F 00.000819r 2 ldx #ERR_BADDATA 00.000819r 2 jmp ERROR 00.000819r 2 LCA8F: 00.000819r 2 .endif 00.000819r 2 A9 rr lda #ERRREENTRY 00.00081Dr 2 20 rr rr jsr STROUT 00.000820r 2 A5 8A lda OLDTEXT 00.000822r 2 A4 8B ldy OLDTEXT+1 00.000824r 2 85 C7 sta TXTPTR 00.000826r 2 84 C8 sty TXTPTR+1 00.000828r 2 RTS20: 00.000828r 2 60 rts 00.000829r 2 00.000829r 2 ; ---------------------------------------------------------------------------- 00.000829r 2 ; "GET" STATEMENT 00.000829r 2 ; ---------------------------------------------------------------------------- 00.000829r 2 .ifndef CONFIG_SMALL 00.000829r 2 GET: 00.000829r 2 20 rr rr jsr ERRDIR 00.00082Cr 2 ; CBM: if GET#, then switch input 00.00082Cr 2 .ifdef CONFIG_FILE 00.00082Cr 2 cmp #'#' 00.00082Cr 2 bne LCAB6 00.00082Cr 2 jsr CHRGET 00.00082Cr 2 jsr GETBYT 00.00082Cr 2 lda #',' 00.00082Cr 2 jsr SYNCHR 00.00082Cr 2 jsr CHKIN 00.00082Cr 2 stx CURDVC 00.00082Cr 2 LCAB6: 00.00082Cr 2 .endif 00.00082Cr 2 A2 1C ldx #<(INPUTBUFFER+1) 00.00082Er 2 A0 00 ldy #>(INPUTBUFFER+1) 00.000830r 2 .ifdef CONFIG_NO_INPUTBUFFER_ZP 00.000830r 2 lda #$00 00.000830r 2 sta INPUTBUFFER+1 00.000830r 2 .else 00.000830r 2 84 1C sty INPUTBUFFER+1 00.000832r 2 .endif 00.000832r 2 A9 40 lda #$40 00.000834r 2 20 rr rr jsr PROCESS_INPUT_LIST 00.000837r 2 ; CBM: if GET#, then switch input back 00.000837r 2 .ifdef CONFIG_FILE 00.000837r 2 ldx CURDVC 00.000837r 2 bne LCAD8 00.000837r 2 .endif 00.000837r 2 60 rts 00.000838r 2 .endif 00.000838r 2 00.000838r 2 ; ---------------------------------------------------------------------------- 00.000838r 2 ; "INPUT#" STATEMENT 00.000838r 2 ; ---------------------------------------------------------------------------- 00.000838r 2 .ifdef CONFIG_FILE 00.000838r 2 INPUTH: 00.000838r 2 jsr GETBYT 00.000838r 2 lda #$2C 00.000838r 2 jsr SYNCHR 00.000838r 2 jsr CHKIN 00.000838r 2 stx CURDVC 00.000838r 2 jsr L2A9E 00.000838r 2 LCAD6: 00.000838r 2 lda CURDVC 00.000838r 2 LCAD8: 00.000838r 2 jsr CLRCH 00.000838r 2 ldx #$00 00.000838r 2 stx CURDVC 00.000838r 2 rts 00.000838r 2 LCAE0: 00.000838r 2 .endif 00.000838r 2 00.000838r 2 ; ---------------------------------------------------------------------------- 00.000838r 2 ; "INPUT" STATEMENT 00.000838r 2 ; ---------------------------------------------------------------------------- 00.000838r 2 INPUT: 00.000838r 2 .ifndef KBD 00.000838r 2 46 14 lsr Z14 00.00083Ar 2 .endif 00.00083Ar 2 C9 22 cmp #$22 00.00083Cr 2 D0 0B bne L2A9E 00.00083Er 2 20 rr rr jsr STRTXT 00.000841r 2 A9 3B lda #$3B 00.000843r 2 20 rr rr jsr SYNCHR 00.000846r 2 20 rr rr jsr STRPRT 00.000849r 2 L2A9E: 00.000849r 2 20 rr rr jsr ERRDIR 00.00084Cr 2 A9 2C lda #$2C 00.00084Er 2 85 1A sta INPUTBUFFER-1 00.000850r 2 LCAF8: 00.000850r 2 .ifdef APPLE 00.000850r 2 jsr INLINX 00.000850r 2 .else 00.000850r 2 20 rr rr jsr NXIN 00.000853r 2 .endif 00.000853r 2 .ifdef KBD 00.000853r 2 bmi L2ABE 00.000853r 2 .else 00.000853r 2 .ifdef CONFIG_FILE 00.000853r 2 lda CURDVC 00.000853r 2 beq LCB0C 00.000853r 2 lda Z96 00.000853r 2 and #$02 00.000853r 2 beq LCB0C 00.000853r 2 jsr LCAD6 00.000853r 2 jmp DATA 00.000853r 2 LCB0C: 00.000853r 2 .endif 00.000853r 2 A5 1B lda INPUTBUFFER 00.000855r 2 D0 12 bne L2ABE 00.000857r 2 .ifdef CONFIG_FILE 00.000857r 2 lda CURDVC 00.000857r 2 bne LCAF8 00.000857r 2 .endif 00.000857r 2 .ifdef CONFIG_CBM1_PATCHES 00.000857r 2 jmp PATCH1 00.000857r 2 .else 00.000857r 2 18 clc 00.000858r 2 4C rr rr jmp CONTROL_C_TYPED 00.00085Br 2 .endif 00.00085Br 2 .endif 00.00085Br 2 00.00085Br 2 NXIN: 00.00085Br 2 .ifdef KBD 00.00085Br 2 jsr INLIN 00.00085Br 2 bmi RTS20 00.00085Br 2 pla 00.00085Br 2 jmp LE86C 00.00085Br 2 .else 00.00085Br 2 .ifdef CONFIG_FILE 00.00085Br 2 lda CURDVC 00.00085Br 2 bne LCB21 00.00085Br 2 .endif 00.00085Br 2 20 rr rr jsr OUTQUES ; '?' 00.00085Er 2 20 rr rr jsr OUTSP 00.000861r 2 LCB21: 00.000861r 2 4C rr rr jmp INLIN 00.000864r 2 .endif 00.000864r 2 00.000864r 2 ; ---------------------------------------------------------------------------- 00.000864r 2 ; "GETC" STATEMENT 00.000864r 2 ; ---------------------------------------------------------------------------- 00.000864r 2 .ifdef KBD 00.000864r 2 GETC: 00.000864r 2 jsr CONINT 00.000864r 2 jsr LF43D 00.000864r 2 jmp LE664 00.000864r 2 .endif 00.000864r 2 00.000864r 2 ; ---------------------------------------------------------------------------- 00.000864r 2 ; "READ" STATEMENT 00.000864r 2 ; ---------------------------------------------------------------------------- 00.000864r 2 READ: 00.000864r 2 A6 8E ldx DATPTR 00.000866r 2 A4 8F ldy DATPTR+1 00.000868r 2 .ifdef CONFIG_NO_READ_Y_IS_ZERO_HACK 00.000868r 2 ; AppleSoft II, too 00.000868r 2 lda #$98 ; READ 00.000868r 2 .byte $2C 00.000868r 2 L2ABE: 00.000868r 2 lda #$00 ; INPUT 00.000868r 2 .else 00.000868r 2 A9 .byte $A9 ; LDA #$98 00.000869r 2 L2ABE: 00.000869r 2 98 tya 00.00086Ar 2 .endif 00.00086Ar 2 00.00086Ar 2 ; ---------------------------------------------------------------------------- 00.00086Ar 2 ; PROCESS INPUT LIST 00.00086Ar 2 ; 00.00086Ar 2 ; (Y,X) IS ADDRESS OF INPUT DATA STRING 00.00086Ar 2 ; (A) = VALUE FOR INPUTFLG: $00 FOR INPUT 00.00086Ar 2 ; $40 FOR GET 00.00086Ar 2 ; $98 FOR READ 00.00086Ar 2 ; ---------------------------------------------------------------------------- 00.00086Ar 2 PROCESS_INPUT_LIST: 00.00086Ar 2 85 12 sta INPUTFLG 00.00086Cr 2 86 90 stx INPTR 00.00086Er 2 84 91 sty INPTR+1 00.000870r 2 PROCESS_INPUT_ITEM: 00.000870r 2 20 rr rr jsr PTRGET 00.000873r 2 85 96 sta FORPNT 00.000875r 2 84 97 sty FORPNT+1 00.000877r 2 A5 C7 lda TXTPTR 00.000879r 2 A4 C8 ldy TXTPTR+1 00.00087Br 2 85 19 sta TXPSV 00.00087Dr 2 84 1A sty TXPSV+1 00.00087Fr 2 A6 90 ldx INPTR 00.000881r 2 A4 91 ldy INPTR+1 00.000883r 2 86 C7 stx TXTPTR 00.000885r 2 84 C8 sty TXTPTR+1 00.000887r 2 20 C6 00 jsr CHRGOT 00.00088Ar 2 D0 1B bne INSTART 00.00088Cr 2 24 12 bit INPUTFLG 00.00088Er 2 .ifndef CONFIG_SMALL ; GET 00.00088Er 2 50 0B bvc L2AF0 00.000890r 2 .ifdef MICROTAN 00.000890r 2 jsr MONRDKEY2 00.000890r 2 .else 00.000890r 2 20 5A 1E jsr MONRDKEY 00.000893r 2 .endif 00.000893r 2 .ifdef CONFIG_IO_MSB 00.000893r 2 and #$7F 00.000893r 2 .endif 00.000893r 2 85 1B sta INPUTBUFFER 00.000895r 2 ; BUG: The beq/bne L2AF8 below is supposed 00.000895r 2 ; to be always taken. For this to happen, 00.000895r 2 ; the last load must be a 0 for beq 00.000895r 2 ; and != 0 for bne. The original Microsoft 00.000895r 2 ; code had ldx/ldy/bne here, which was only 00.000895r 2 ; correct for a non-ZP INPUTBUFFER. Commodore 00.000895r 2 ; fixed it in CBMBASIC V1 by swapping the 00.000895r 2 ; ldx and the ldy. It was broken on KIM, 00.000895r 2 ; but okay on APPLE and CBM2, because 00.000895r 2 ; these used a non-ZP INPUTBUFFER. 00.000895r 2 ; Microsoft fixed this somewhere after KIM 00.000895r 2 ; and before MICROTAN, by using beq instead 00.000895r 2 ; of bne in the ZP case. 00.000895r 2 .ifdef CBM1 00.000895r 2 ldy #>(INPUTBUFFER-1) 00.000895r 2 ldx #<(INPUTBUFFER-1) 00.000895r 2 .else 00.000895r 2 A2 1A ldx #<(INPUTBUFFER-1) 00.000897r 2 A0 00 ldy #>(INPUTBUFFER-1) 00.000899r 2 .endif 00.000899r 2 .if .def(CONFIG_2) && (!.def(CONFIG_NO_INPUTBUFFER_ZP)) 00.000899r 2 beq L2AF8 ; always 00.000899r 2 .else 00.000899r 2 D0 08 bne L2AF8 ; always 00.00089Br 2 .endif 00.00089Br 2 L2AF0: 00.00089Br 2 .endif 00.00089Br 2 30 71 bmi FINDATA 00.00089Dr 2 .ifdef CONFIG_FILE 00.00089Dr 2 lda CURDVC 00.00089Dr 2 bne LCB64 00.00089Dr 2 .endif 00.00089Dr 2 .ifdef KBD 00.00089Dr 2 jsr OUTQUESSP 00.00089Dr 2 .else 00.00089Dr 2 20 rr rr jsr OUTQUES 00.0008A0r 2 .endif 00.0008A0r 2 LCB64: 00.0008A0r 2 20 rr rr jsr NXIN 00.0008A3r 2 L2AF8: 00.0008A3r 2 86 C7 stx TXTPTR 00.0008A5r 2 84 C8 sty TXTPTR+1 00.0008A7r 2 00.0008A7r 2 ; ---------------------------------------------------------------------------- 00.0008A7r 2 INSTART: 00.0008A7r 2 20 C0 00 jsr CHRGET 00.0008AAr 2 24 0E bit VALTYP 00.0008ACr 2 10 31 bpl L2B34 00.0008AEr 2 .ifndef CONFIG_SMALL ; GET 00.0008AEr 2 24 12 bit INPUTFLG 00.0008B0r 2 50 09 bvc L2B10 00.0008B2r 2 .ifdef CONFIG_CBM1_PATCHES 00.0008B2r 2 lda #$00 00.0008B2r 2 jsr PATCH4 00.0008B2r 2 nop 00.0008B2r 2 .else 00.0008B2r 2 E8 inx 00.0008B3r 2 86 C7 stx TXTPTR 00.0008B5r 2 A9 00 lda #$00 00.0008B7r 2 85 0A sta CHARAC 00.0008B9r 2 F0 0C beq L2B1C 00.0008BBr 2 .endif 00.0008BBr 2 L2B10: 00.0008BBr 2 .endif 00.0008BBr 2 85 0A sta CHARAC 00.0008BDr 2 C9 22 cmp #$22 00.0008BFr 2 F0 07 beq L2B1D 00.0008C1r 2 A9 3A lda #$3A 00.0008C3r 2 85 0A sta CHARAC 00.0008C5r 2 A9 2C lda #$2C 00.0008C7r 2 L2B1C: 00.0008C7r 2 18 clc 00.0008C8r 2 L2B1D: 00.0008C8r 2 85 0B sta ENDCHR 00.0008CAr 2 A5 C7 lda TXTPTR 00.0008CCr 2 A4 C8 ldy TXTPTR+1 00.0008CEr 2 69 00 adc #$00 00.0008D0r 2 90 01 bcc L2B28 00.0008D2r 2 C8 iny 00.0008D3r 2 L2B28: 00.0008D3r 2 20 rr rr jsr STRLT2 00.0008D6r 2 20 rr rr jsr POINT 00.0008D9r 2 .ifdef CONFIG_SMALL 00.0008D9r 2 jsr LETSTRING 00.0008D9r 2 .else 00.0008D9r 2 20 rr rr jsr PUTSTR 00.0008DCr 2 .endif 00.0008DCr 2 4C rr rr jmp INPUT_MORE 00.0008DFr 2 ; ---------------------------------------------------------------------------- 00.0008DFr 2 L2B34: 00.0008DFr 2 20 rr rr jsr FIN 00.0008E2r 2 .ifdef CONFIG_SMALL 00.0008E2r 2 jsr SETFOR 00.0008E2r 2 .else 00.0008E2r 2 A5 0F lda VALTYP+1 00.0008E4r 2 20 rr rr jsr LET2 00.0008E7r 2 .endif 00.0008E7r 2 ; ---------------------------------------------------------------------------- 00.0008E7r 2 INPUT_MORE: 00.0008E7r 2 20 C6 00 jsr CHRGOT 00.0008EAr 2 F0 07 beq L2B48 00.0008ECr 2 C9 2C cmp #$2C 00.0008EEr 2 F0 03 beq L2B48 00.0008F0r 2 4C rr rr jmp INPUTERR 00.0008F3r 2 L2B48: 00.0008F3r 2 A5 C7 lda TXTPTR 00.0008F5r 2 A4 C8 ldy TXTPTR+1 00.0008F7r 2 85 90 sta INPTR 00.0008F9r 2 84 91 sty INPTR+1 00.0008FBr 2 A5 19 lda TXPSV 00.0008FDr 2 A4 1A ldy TXPSV+1 00.0008FFr 2 85 C7 sta TXTPTR 00.000901r 2 84 C8 sty TXTPTR+1 00.000903r 2 20 C6 00 jsr CHRGOT 00.000906r 2 F0 2C beq INPDONE 00.000908r 2 20 rr rr jsr CHKCOM 00.00090Br 2 4C rr rr jmp PROCESS_INPUT_ITEM 00.00090Er 2 ; ---------------------------------------------------------------------------- 00.00090Er 2 FINDATA: 00.00090Er 2 20 rr rr jsr DATAN 00.000911r 2 C8 iny 00.000912r 2 AA tax 00.000913r 2 D0 12 bne L2B7C 00.000915r 2 A2 2A ldx #ERR_NODATA 00.000917r 2 C8 iny 00.000918r 2 B1 C7 lda (TXTPTR),y 00.00091Ar 2 F0 69 beq GERR 00.00091Cr 2 C8 iny 00.00091Dr 2 B1 C7 lda (TXTPTR),y 00.00091Fr 2 85 8C sta Z8C 00.000921r 2 C8 iny 00.000922r 2 B1 C7 lda (TXTPTR),y 00.000924r 2 C8 iny 00.000925r 2 85 8D sta Z8C+1 00.000927r 2 L2B7C: 00.000927r 2 B1 C7 lda (TXTPTR),y 00.000929r 2 AA tax 00.00092Ar 2 20 rr rr jsr ADDON 00.00092Dr 2 E0 83 cpx #$83 00.00092Fr 2 D0 DD bne FINDATA 00.000931r 2 4C rr rr jmp INSTART 00.000934r 2 ; ---NO MORE INPUT REQUESTED------ 00.000934r 2 INPDONE: 00.000934r 2 A5 90 lda INPTR 00.000936r 2 A4 91 ldy INPTR+1 00.000938r 2 A6 12 ldx INPUTFLG 00.00093Ar 2 .if .def(CONFIG_SMALL) && (!.def(CONFIG_11)) 00.00093Ar 2 beq L2B94 ; INPUT 00.00093Ar 2 .else 00.00093Ar 2 10 03 bpl L2B94; INPUT or GET 00.00093Cr 2 .endif 00.00093Cr 2 4C rr rr jmp SETDA 00.00093Fr 2 L2B94: 00.00093Fr 2 A0 00 ldy #$00 00.000941r 2 B1 90 lda (INPTR),y 00.000943r 2 F0 07 beq L2BA1 00.000945r 2 .ifdef CONFIG_FILE 00.000945r 2 lda CURDVC 00.000945r 2 bne L2BA1 00.000945r 2 .endif 00.000945r 2 A9 rr lda #ERREXTRA 00.000949r 2 4C rr rr jmp STROUT 00.00094Cr 2 L2BA1: 00.00094Cr 2 60 rts 00.00094Dr 2 00.00094Dr 2 ; ---------------------------------------------------------------------------- 00.00094Dr 2 ERREXTRA: 00.00094Dr 2 .ifdef KBD 00.00094Dr 2 .byte "?Extra" 00.00094Dr 2 .else 00.00094Dr 2 3F 45 58 54 .byte "?EXTRA IGNORED" 00.000951r 2 52 41 20 49 00.000955r 2 47 4E 4F 52 00.00095Br 2 .endif 00.00095Br 2 0D 0A 00 .byte $0D,$0A,$00 00.00095Er 2 ERRREENTRY: 00.00095Er 2 .ifdef KBD 00.00095Er 2 .byte "What?" 00.00095Er 2 .else 00.00095Er 2 3F 52 45 44 .byte "?REDO FROM START" 00.000962r 2 4F 20 46 52 00.000966r 2 4F 4D 20 53 00.00096Er 2 .endif 00.00096Er 2 0D 0A 00 .byte $0D,$0A,$00 00.000971r 2 .ifdef KBD 00.000971r 2 LEA30: 00.000971r 2 .byte "B" 00.000971r 2 .byte $FD 00.000971r 2 .byte "GsBASIC" 00.000971r 2 .byte $00,$1B,$0D,$13 00.000971r 2 .byte " BASIC" 00.000971r 2 .endif 00.000971r 2 00.000971r 1 .include "eval.s" 00.000971r 2 .segment "CODE" 00.000971r 2 00.000971r 2 ; ---------------------------------------------------------------------------- 00.000971r 2 ; "NEXT" STATEMENT 00.000971r 2 ; ---------------------------------------------------------------------------- 00.000971r 2 NEXT: 00.000971r 2 D0 04 bne NEXT1 00.000973r 2 A0 00 ldy #$00 00.000975r 2 F0 03 beq NEXT2 00.000977r 2 NEXT1: 00.000977r 2 20 rr rr jsr PTRGET 00.00097Ar 2 NEXT2: 00.00097Ar 2 85 96 sta FORPNT 00.00097Cr 2 84 97 sty FORPNT+1 00.00097Er 2 20 rr rr jsr GTFORPNT 00.000981r 2 F0 04 beq NEXT3 00.000983r 2 A2 00 ldx #$00 00.000985r 2 GERR: 00.000985r 2 F0 69 beq JERROR 00.000987r 2 NEXT3: 00.000987r 2 9A txs 00.000988r 2 .ifndef CONFIG_2 00.000988r 2 E8 inx 00.000989r 2 E8 inx 00.00098Ar 2 E8 inx 00.00098Br 2 E8 inx 00.00098Cr 2 .endif 00.00098Cr 2 8A txa 00.00098Dr 2 .ifdef CONFIG_2 00.00098Dr 2 clc 00.00098Dr 2 adc #$04 00.00098Dr 2 pha 00.00098Dr 2 adc #BYTES_FP+1 00.00098Dr 2 sta DEST 00.00098Dr 2 pla 00.00098Dr 2 .else 00.00098Dr 2 E8 inx 00.00098Er 2 E8 inx 00.00098Fr 2 E8 inx 00.000990r 2 E8 inx 00.000991r 2 E8 inx 00.000992r 2 .ifndef CONFIG_SMALL 00.000992r 2 E8 inx 00.000993r 2 .endif 00.000993r 2 86 71 stx DEST 00.000995r 2 .endif 00.000995r 2 A0 01 ldy #>STACK 00.000997r 2 20 rr rr jsr LOAD_FAC_FROM_YA 00.00099Ar 2 BA tsx 00.00099Br 2 BD 09 01 lda STACK+BYTES_FP+4,x 00.00099Er 2 85 B3 sta FACSIGN 00.0009A0r 2 A5 96 lda FORPNT 00.0009A2r 2 A4 97 ldy FORPNT+1 00.0009A4r 2 20 rr rr jsr FADD 00.0009A7r 2 20 rr rr jsr SETFOR 00.0009AAr 2 A0 01 ldy #>STACK 00.0009ACr 2 20 rr rr jsr FCOMP2 00.0009AFr 2 BA tsx 00.0009B0r 2 38 sec 00.0009B1r 2 FD 09 01 sbc STACK+BYTES_FP+4,x 00.0009B4r 2 F0 17 beq L2C22 00.0009B6r 2 BD 0F 01 lda STACK+2*BYTES_FP+5,x 00.0009B9r 2 85 86 sta CURLIN 00.0009BBr 2 BD 10 01 lda STACK+2*BYTES_FP+6,x 00.0009BEr 2 85 87 sta CURLIN+1 00.0009C0r 2 BD 12 01 lda STACK+2*BYTES_FP+8,x 00.0009C3r 2 85 C7 sta TXTPTR 00.0009C5r 2 BD 11 01 lda STACK+2*BYTES_FP+7,x 00.0009C8r 2 85 C8 sta TXTPTR+1 00.0009CAr 2 L2C1F: 00.0009CAr 2 4C rr rr jmp NEWSTT 00.0009CDr 2 L2C22: 00.0009CDr 2 8A txa 00.0009CEr 2 69 11 adc #2*BYTES_FP+7 00.0009D0r 2 AA tax 00.0009D1r 2 9A txs 00.0009D2r 2 20 C6 00 jsr CHRGOT 00.0009D5r 2 C9 2C cmp #$2C 00.0009D7r 2 D0 F1 bne L2C1F 00.0009D9r 2 20 C0 00 jsr CHRGET 00.0009DCr 2 20 rr rr jsr NEXT1 00.0009DFr 2 00.0009DFr 2 ; ---------------------------------------------------------------------------- 00.0009DFr 2 ; EVALUATE EXPRESSION, MAKE SURE IT IS NUMERIC 00.0009DFr 2 ; ---------------------------------------------------------------------------- 00.0009DFr 2 FRMNUM: 00.0009DFr 2 20 rr rr jsr FRMEVL 00.0009E2r 2 00.0009E2r 2 ; ---------------------------------------------------------------------------- 00.0009E2r 2 ; MAKE SURE (FAC) IS NUMERIC 00.0009E2r 2 ; ---------------------------------------------------------------------------- 00.0009E2r 2 CHKNUM: 00.0009E2r 2 18 clc 00.0009E3r 2 24 .byte $24 00.0009E4r 2 00.0009E4r 2 ; ---------------------------------------------------------------------------- 00.0009E4r 2 ; MAKE SURE (FAC) IS STRING 00.0009E4r 2 ; ---------------------------------------------------------------------------- 00.0009E4r 2 CHKSTR: 00.0009E4r 2 38 sec 00.0009E5r 2 00.0009E5r 2 ; ---------------------------------------------------------------------------- 00.0009E5r 2 ; MAKE SURE (FAC) IS CORRECT TYPE 00.0009E5r 2 ; IF C=0, TYPE MUST BE NUMERIC 00.0009E5r 2 ; IF C=1, TYPE MUST BE STRING 00.0009E5r 2 ; ---------------------------------------------------------------------------- 00.0009E5r 2 CHKVAL: 00.0009E5r 2 24 0E bit VALTYP 00.0009E7r 2 30 03 bmi L2C41 00.0009E9r 2 B0 03 bcs L2C43 00.0009EBr 2 L2C40: 00.0009EBr 2 60 rts 00.0009ECr 2 L2C41: 00.0009ECr 2 B0 FD bcs L2C40 00.0009EEr 2 L2C43: 00.0009EEr 2 A2 A3 ldx #ERR_BADTYPE 00.0009F0r 2 JERROR: 00.0009F0r 2 4C rr rr jmp ERROR 00.0009F3r 2 00.0009F3r 2 ; ---------------------------------------------------------------------------- 00.0009F3r 2 ; EVALUATE THE EXPRESSION AT TXTPTR, LEAVING THE 00.0009F3r 2 ; RESULT IN FAC. WORKS FOR BOTH STRING AND NUMERIC 00.0009F3r 2 ; EXPRESSIONS. 00.0009F3r 2 ; ---------------------------------------------------------------------------- 00.0009F3r 2 FRMEVL: 00.0009F3r 2 A6 C7 ldx TXTPTR 00.0009F5r 2 D0 02 bne L2C4E 00.0009F7r 2 C6 C8 dec TXTPTR+1 00.0009F9r 2 L2C4E: 00.0009F9r 2 C6 C7 dec TXTPTR 00.0009FBr 2 A2 00 ldx #$00 00.0009FDr 2 24 .byte $24 00.0009FEr 2 FRMEVL1: 00.0009FEr 2 48 pha 00.0009FFr 2 8A txa 00.000A00r 2 48 pha 00.000A01r 2 A9 01 lda #$01 00.000A03r 2 20 rr rr jsr CHKMEM 00.000A06r 2 20 rr rr jsr FRM_ELEMENT 00.000A09r 2 A9 00 lda #$00 00.000A0Br 2 85 9A sta CPRTYP 00.000A0Dr 2 FRMEVL2: 00.000A0Dr 2 20 C6 00 jsr CHRGOT 00.000A10r 2 L2C65: 00.000A10r 2 38 sec 00.000A11r 2 E9 AB sbc #TOKEN_GREATER 00.000A13r 2 90 17 bcc L2C81 00.000A15r 2 C9 03 cmp #$03 00.000A17r 2 B0 13 bcs L2C81 00.000A19r 2 C9 01 cmp #$01 00.000A1Br 2 2A rol a 00.000A1Cr 2 49 01 eor #$01 00.000A1Er 2 45 9A eor CPRTYP 00.000A20r 2 C5 9A cmp CPRTYP 00.000A22r 2 90 61 bcc SNTXERR 00.000A24r 2 85 9A sta CPRTYP 00.000A26r 2 20 C0 00 jsr CHRGET 00.000A29r 2 4C rr rr jmp L2C65 00.000A2Cr 2 L2C81: 00.000A2Cr 2 A6 9A ldx CPRTYP 00.000A2Er 2 D0 2C bne FRM_RELATIONAL 00.000A30r 2 B0 7B bcs L2D02 00.000A32r 2 69 07 adc #$07 00.000A34r 2 90 77 bcc L2D02 00.000A36r 2 65 0E adc VALTYP 00.000A38r 2 D0 03 bne L2C92 00.000A3Ar 2 4C rr rr jmp CAT 00.000A3Dr 2 L2C92: 00.000A3Dr 2 69 FF adc #$FF 00.000A3Fr 2 85 6F sta INDEX 00.000A41r 2 0A asl a 00.000A42r 2 65 6F adc INDEX 00.000A44r 2 A8 tay 00.000A45r 2 FRM_PRECEDENCE_TEST: 00.000A45r 2 68 pla 00.000A46r 2 D9 rr rr cmp MATHTBL,y 00.000A49r 2 B0 67 bcs FRM_PERFORM1 00.000A4Br 2 20 rr rr jsr CHKNUM 00.000A4Er 2 L2CA3: 00.000A4Er 2 48 pha 00.000A4Fr 2 L2CA4: 00.000A4Fr 2 20 rr rr jsr FRM_RECURSE 00.000A52r 2 68 pla 00.000A53r 2 A4 98 ldy LASTOP 00.000A55r 2 10 17 bpl PREFNC 00.000A57r 2 AA tax 00.000A58r 2 F0 56 beq GOEX 00.000A5Ar 2 D0 5F bne FRM_PERFORM2 00.000A5Cr 2 00.000A5Cr 2 ; ---------------------------------------------------------------------------- 00.000A5Cr 2 ; FOUND ONE OR MORE RELATIONAL OPERATORS <,=,> 00.000A5Cr 2 ; ---------------------------------------------------------------------------- 00.000A5Cr 2 FRM_RELATIONAL: 00.000A5Cr 2 46 0E lsr VALTYP 00.000A5Er 2 8A txa 00.000A5Fr 2 2A rol a 00.000A60r 2 A6 C7 ldx TXTPTR 00.000A62r 2 D0 02 bne L2CBB 00.000A64r 2 C6 C8 dec TXTPTR+1 00.000A66r 2 L2CBB: 00.000A66r 2 C6 C7 dec TXTPTR 00.000A68r 2 A0 1B ldy #$1B 00.000A6Ar 2 85 9A sta CPRTYP 00.000A6Cr 2 D0 D7 bne FRM_PRECEDENCE_TEST 00.000A6Er 2 PREFNC: 00.000A6Er 2 D9 rr rr cmp MATHTBL,y 00.000A71r 2 B0 48 bcs FRM_PERFORM2 00.000A73r 2 90 D9 bcc L2CA3 00.000A75r 2 00.000A75r 2 ; ---------------------------------------------------------------------------- 00.000A75r 2 ; STACK THIS OPERATION AND CALL FRMEVL FOR 00.000A75r 2 ; ANOTHER ONE 00.000A75r 2 ; ---------------------------------------------------------------------------- 00.000A75r 2 FRM_RECURSE: 00.000A75r 2 B9 rr rr lda MATHTBL+2,y 00.000A78r 2 48 pha 00.000A79r 2 B9 rr rr lda MATHTBL+1,y 00.000A7Cr 2 48 pha 00.000A7Dr 2 20 rr rr jsr FRM_STACK1 00.000A80r 2 A5 9A lda CPRTYP 00.000A82r 2 4C rr rr jmp FRMEVL1 00.000A85r 2 SNTXERR: 00.000A85r 2 4C rr rr jmp SYNERR 00.000A88r 2 00.000A88r 2 ; ---------------------------------------------------------------------------- 00.000A88r 2 ; STACK (FAC) 00.000A88r 2 ; THREE ENTRY POINTS: 00.000A88r 2 ; 1, FROM FRMEVL 00.000A88r 2 ; 2, FROM "STEP" 00.000A88r 2 ; 3, FROM "FOR" 00.000A88r 2 ; ---------------------------------------------------------------------------- 00.000A88r 2 FRM_STACK1: 00.000A88r 2 A5 B3 lda FACSIGN 00.000A8Ar 2 BE rr rr ldx MATHTBL,y 00.000A8Dr 2 00.000A8Dr 2 ; ---------------------------------------------------------------------------- 00.000A8Dr 2 ; ENTER HERE FROM "STEP", TO PUSH STEP SIGN AND VALUE 00.000A8Dr 2 ; ---------------------------------------------------------------------------- 00.000A8Dr 2 FRM_STACK2: 00.000A8Dr 2 A8 tay 00.000A8Er 2 68 pla 00.000A8Fr 2 85 6F sta INDEX 00.000A91r 2 .ifndef CONFIG_2B 00.000A91r 2 E6 6F inc INDEX ; bug: assumes not on page boundary 00.000A93r 2 ; bug exists on AppleSoft II 00.000A93r 2 .endif 00.000A93r 2 68 pla 00.000A94r 2 85 70 sta INDEX+1 00.000A96r 2 .ifdef CONFIG_2B 00.000A96r 2 inc INDEX 00.000A96r 2 bne LEB69 00.000A96r 2 inc INDEX+1 00.000A96r 2 LEB69: 00.000A96r 2 .endif 00.000A96r 2 98 tya 00.000A97r 2 48 pha 00.000A98r 2 00.000A98r 2 ; ---------------------------------------------------------------------------- 00.000A98r 2 ; ENTER HERE FROM "FOR", WITH (INDEX) = STEP, 00.000A98r 2 ; TO PUSH INITIAL VALUE OF "FOR" VARIABLE 00.000A98r 2 ; ---------------------------------------------------------------------------- 00.000A98r 2 FRM_STACK3: 00.000A98r 2 20 rr rr jsr ROUND_FAC 00.000A9Br 2 .ifndef CONFIG_SMALL 00.000A9Br 2 A5 B2 lda FAC+4 00.000A9Dr 2 48 pha 00.000A9Er 2 .endif 00.000A9Er 2 A5 B1 lda FAC+3 00.000AA0r 2 48 pha 00.000AA1r 2 A5 B0 lda FAC+2 00.000AA3r 2 48 pha 00.000AA4r 2 A5 AF lda FAC+1 00.000AA6r 2 48 pha 00.000AA7r 2 A5 AE lda FAC 00.000AA9r 2 48 pha 00.000AAAr 2 6C 6F 00 jmp (INDEX) 00.000AADr 2 L2D02: 00.000AADr 2 A0 FF ldy #$FF 00.000AAFr 2 68 pla 00.000AB0r 2 GOEX: 00.000AB0r 2 F0 23 beq EXIT 00.000AB2r 2 00.000AB2r 2 ; ---------------------------------------------------------------------------- 00.000AB2r 2 ; PERFORM STACKED OPERATION 00.000AB2r 2 ; 00.000AB2r 2 ; (A) = PRECEDENCE BYTE 00.000AB2r 2 ; STACK: 1 -- CPRMASK 00.000AB2r 2 ; 5 -- (ARG) 00.000AB2r 2 ; 2 -- ADDR OF PERFORMER 00.000AB2r 2 ; ---------------------------------------------------------------------------- 00.000AB2r 2 FRM_PERFORM1: 00.000AB2r 2 C9 64 cmp #$64 00.000AB4r 2 F0 03 beq L2D0E 00.000AB6r 2 20 rr rr jsr CHKNUM 00.000AB9r 2 L2D0E: 00.000AB9r 2 84 98 sty LASTOP 00.000ABBr 2 FRM_PERFORM2: 00.000ABBr 2 68 pla 00.000ABCr 2 4A lsr a 00.000ABDr 2 85 13 sta CPRMASK 00.000ABFr 2 68 pla 00.000AC0r 2 85 B6 sta ARG 00.000AC2r 2 68 pla 00.000AC3r 2 85 B7 sta ARG+1 00.000AC5r 2 68 pla 00.000AC6r 2 85 B8 sta ARG+2 00.000AC8r 2 68 pla 00.000AC9r 2 85 B9 sta ARG+3 00.000ACBr 2 68 pla 00.000ACCr 2 .ifndef CONFIG_SMALL 00.000ACCr 2 85 BA sta ARG+4 00.000ACEr 2 68 pla 00.000ACFr 2 .endif 00.000ACFr 2 85 BB sta ARGSIGN 00.000AD1r 2 45 B3 eor FACSIGN 00.000AD3r 2 85 BC sta SGNCPR 00.000AD5r 2 EXIT: 00.000AD5r 2 A5 AE lda FAC 00.000AD7r 2 60 rts 00.000AD8r 2 00.000AD8r 2 ; ---------------------------------------------------------------------------- 00.000AD8r 2 ; GET ELEMENT IN EXPRESSION 00.000AD8r 2 ; 00.000AD8r 2 ; GET VALUE OF VARIABLE OR NUMBER AT TXTPNT, OR POINT 00.000AD8r 2 ; TO STRING DESCRIPTOR IF A STRING, AND PUT IN FAC. 00.000AD8r 2 ; ---------------------------------------------------------------------------- 00.000AD8r 2 FRM_ELEMENT: 00.000AD8r 2 A9 00 lda #$00 00.000ADAr 2 85 0E sta VALTYP 00.000ADCr 2 L2D31: 00.000ADCr 2 20 C0 00 jsr CHRGET 00.000ADFr 2 B0 03 bcs L2D39 00.000AE1r 2 L2D36: 00.000AE1r 2 4C rr rr jmp FIN 00.000AE4r 2 L2D39: 00.000AE4r 2 20 rr rr jsr ISLETC 00.000AE7r 2 B0 67 bcs FRM_VARIABLE 00.000AE9r 2 .ifdef CONFIG_CBM_ALL 00.000AE9r 2 cmp #$FF 00.000AE9r 2 bne LCDC1 00.000AE9r 2 lda #CON_PI 00.000AE9r 2 jsr LOAD_FAC_FROM_YA 00.000AE9r 2 jmp CHRGET 00.000AE9r 2 CON_PI: 00.000AE9r 2 .byte $82,$49,$0f,$DA,$A1 00.000AE9r 2 LCDC1: 00.000AE9r 2 .endif 00.000AE9r 2 C9 2E cmp #$2E 00.000AEBr 2 F0 F4 beq L2D36 00.000AEDr 2 C9 A5 cmp #TOKEN_MINUS 00.000AEFr 2 F0 58 beq MIN 00.000AF1r 2 C9 A4 cmp #TOKEN_PLUS 00.000AF3r 2 F0 E7 beq L2D31 00.000AF5r 2 C9 22 cmp #$22 00.000AF7r 2 D0 0F bne NOT_ 00.000AF9r 2 00.000AF9r 2 ; ---------------------------------------------------------------------------- 00.000AF9r 2 ; STRING CONSTANT ELEMENT 00.000AF9r 2 ; 00.000AF9r 2 ; SET Y,A = (TXTPTR)+CARRY 00.000AF9r 2 ; ---------------------------------------------------------------------------- 00.000AF9r 2 STRTXT: 00.000AF9r 2 A5 C7 lda TXTPTR 00.000AFBr 2 A4 C8 ldy TXTPTR+1 00.000AFDr 2 69 00 adc #$00 00.000AFFr 2 90 01 bcc L2D57 00.000B01r 2 C8 iny 00.000B02r 2 L2D57: 00.000B02r 2 20 rr rr jsr STRLIT 00.000B05r 2 4C rr rr jmp POINT 00.000B08r 2 00.000B08r 2 ; ---------------------------------------------------------------------------- 00.000B08r 2 ; "NOT" FUNCTION 00.000B08r 2 ; IF FAC=0, RETURN FAC=1 00.000B08r 2 ; IF FAC<>0, RETURN FAC=0 00.000B08r 2 ; ---------------------------------------------------------------------------- 00.000B08r 2 NOT_: 00.000B08r 2 C9 A2 cmp #TOKEN_NOT 00.000B0Ar 2 D0 13 bne L2D74 00.000B0Cr 2 A0 18 ldy #$18 00.000B0Er 2 D0 3B bne EQUL 00.000B10r 2 00.000B10r 2 ; ---------------------------------------------------------------------------- 00.000B10r 2 ; COMPARISON FOR EQUALITY (= OPERATOR) 00.000B10r 2 ; ALSO USED TO EVALUATE "NOT" FUNCTION 00.000B10r 2 ; ---------------------------------------------------------------------------- 00.000B10r 2 EQUOP: 00.000B10r 2 20 rr rr jsr AYINT 00.000B13r 2 A5 B2 lda FAC_LAST 00.000B15r 2 49 FF eor #$FF 00.000B17r 2 A8 tay 00.000B18r 2 A5 B1 lda FAC_LAST-1 00.000B1Ar 2 49 FF eor #$FF 00.000B1Cr 2 4C rr rr jmp GIVAYF 00.000B1Fr 2 L2D74: 00.000B1Fr 2 C9 9F cmp #TOKEN_FN 00.000B21r 2 D0 03 bne L2D7B 00.000B23r 2 4C rr rr jmp L31F3 00.000B26r 2 L2D7B: 00.000B26r 2 C9 AE cmp #TOKEN_SGN 00.000B28r 2 90 03 bcc PARCHK 00.000B2Ar 2 4C rr rr jmp UNARY 00.000B2Dr 2 00.000B2Dr 2 ; ---------------------------------------------------------------------------- 00.000B2Dr 2 ; EVALUATE "(EXPRESSION)" 00.000B2Dr 2 ; ---------------------------------------------------------------------------- 00.000B2Dr 2 PARCHK: 00.000B2Dr 2 20 rr rr jsr CHKOPN 00.000B30r 2 20 rr rr jsr FRMEVL 00.000B33r 2 CHKCLS: 00.000B33r 2 A9 29 lda #$29 00.000B35r 2 2C .byte $2C 00.000B36r 2 CHKOPN: 00.000B36r 2 A9 28 lda #$28 00.000B38r 2 2C .byte $2C 00.000B39r 2 CHKCOM: 00.000B39r 2 A9 2C lda #$2C 00.000B3Br 2 00.000B3Br 2 ; ---------------------------------------------------------------------------- 00.000B3Br 2 ; UNLESS CHAR AT TXTPTR = (A), SYNTAX ERROR 00.000B3Br 2 ; ---------------------------------------------------------------------------- 00.000B3Br 2 SYNCHR: ; XXX all CBM code calls SYNCHR instead of CHKCOM 00.000B3Br 2 A0 00 ldy #$00 00.000B3Dr 2 D1 C7 cmp (TXTPTR),y 00.000B3Fr 2 D0 03 bne SYNERR 00.000B41r 2 4C C0 00 jmp CHRGET 00.000B44r 2 ; ---------------------------------------------------------------------------- 00.000B44r 2 SYNERR: 00.000B44r 2 A2 10 ldx #ERR_SYNTAX 00.000B46r 2 4C rr rr jmp ERROR 00.000B49r 2 ; ---------------------------------------------------------------------------- 00.000B49r 2 MIN: 00.000B49r 2 A0 15 ldy #$15 00.000B4Br 2 EQUL: 00.000B4Br 2 68 pla 00.000B4Cr 2 68 pla 00.000B4Dr 2 4C rr rr jmp L2CA4 00.000B50r 2 ; ---------------------------------------------------------------------------- 00.000B50r 2 FRM_VARIABLE: 00.000B50r 2 20 rr rr jsr PTRGET 00.000B53r 2 FRM_VARIABLE_CALL = *-1 00.000B53r 2 85 B1 sta FAC_LAST-1 00.000B55r 2 84 B2 sty FAC_LAST 00.000B57r 2 .ifdef CONFIG_CBM_ALL 00.000B57r 2 lda VARNAM 00.000B57r 2 ldy VARNAM+1 00.000B57r 2 .endif 00.000B57r 2 A6 0E ldx VALTYP 00.000B59r 2 F0 01 beq L2DB1 00.000B5Br 2 .ifdef CONFIG_CBM_ALL 00.000B5Br 2 .ifdef CONFIG_CBM1_PATCHES 00.000B5Br 2 jmp PATCH2 00.000B5Br 2 clc 00.000B5Br 2 LCE3B: 00.000B5Br 2 .else 00.000B5Br 2 ldx #$00 00.000B5Br 2 stx STRNG1+1 00.000B5Br 2 bit FAC+4 00.000B5Br 2 bpl LCE53 00.000B5Br 2 cmp #$54 ; T 00.000B5Br 2 bne LCE53 00.000B5Br 2 .endif 00.000B5Br 2 cpy #$C9 ; I$ 00.000B5Br 2 bne LCE53 00.000B5Br 2 jsr LCE76 00.000B5Br 2 sty EXPON 00.000B5Br 2 dey 00.000B5Br 2 sty STRNG2 00.000B5Br 2 ldy #$06 00.000B5Br 2 sty INDX 00.000B5Br 2 ldy #$24 00.000B5Br 2 jsr LDD3A 00.000B5Br 2 jmp LD353 00.000B5Br 2 LCE53: 00.000B5Br 2 .endif 00.000B5Br 2 .ifdef CONFIG_2 00.000B5Br 2 .ifndef CBM2 00.000B5Br 2 ; bugfix? 00.000B5Br 2 ; fixed on AppleSoft II, not on any CBM 00.000B5Br 2 ldx #$00 00.000B5Br 2 stx STRNG1+1 00.000B5Br 2 .endif 00.000B5Br 2 .endif 00.000B5Br 2 60 rts 00.000B5Cr 2 L2DB1: 00.000B5Cr 2 .ifndef CONFIG_SMALL 00.000B5Cr 2 A6 0F ldx VALTYP+1 00.000B5Er 2 10 0D bpl L2DC2 00.000B60r 2 A0 00 ldy #$00 00.000B62r 2 B1 B1 lda (FAC+3),y 00.000B64r 2 AA tax 00.000B65r 2 C8 iny 00.000B66r 2 B1 B1 lda (FAC+3),y 00.000B68r 2 A8 tay 00.000B69r 2 8A txa 00.000B6Ar 2 4C rr rr jmp GIVAYF 00.000B6Dr 2 L2DC2: 00.000B6Dr 2 .endif 00.000B6Dr 2 .ifdef CONFIG_CBM1_PATCHES 00.000B6Dr 2 jmp PATCH3 00.000B6Dr 2 .byte $19 00.000B6Dr 2 .endif 00.000B6Dr 2 .ifdef CBM2 00.000B6Dr 2 bit FAC+4 00.000B6Dr 2 bpl LCE90 00.000B6Dr 2 cmp #$54 00.000B6Dr 2 bne LCE82 00.000B6Dr 2 .endif 00.000B6Dr 2 .ifndef CONFIG_CBM_ALL 00.000B6Dr 2 4C rr rr jmp LOAD_FAC_FROM_YA 00.000B70r 2 .endif 00.000B70r 2 .ifdef CONFIG_CBM_ALL 00.000B70r 2 LCE69: 00.000B70r 2 cpy #$49 00.000B70r 2 .ifdef CBM1 00.000B70r 2 bne LCE82 00.000B70r 2 .else 00.000B70r 2 bne LCE90 00.000B70r 2 .endif 00.000B70r 2 jsr LCE76 00.000B70r 2 tya 00.000B70r 2 ldx #$A0 00.000B70r 2 jmp LDB21 00.000B70r 2 LCE76: 00.000B70r 2 .ifdef CBM1 00.000B70r 2 lda #$FE 00.000B70r 2 ldy #$01 00.000B70r 2 .else 00.000B70r 2 lda #$8B 00.000B70r 2 ldy #$00 00.000B70r 2 .endif 00.000B70r 2 sei 00.000B70r 2 jsr LOAD_FAC_FROM_YA 00.000B70r 2 cli 00.000B70r 2 sty FAC+1 00.000B70r 2 rts 00.000B70r 2 LCE82: 00.000B70r 2 cmp #$53 00.000B70r 2 bne LCE90 00.000B70r 2 cpy #$54 00.000B70r 2 bne LCE90 00.000B70r 2 lda Z96 00.000B70r 2 jmp FLOAT 00.000B70r 2 LCE90: 00.000B70r 2 lda FAC+3 00.000B70r 2 ldy FAC+4 00.000B70r 2 jmp LOAD_FAC_FROM_YA 00.000B70r 2 .endif 00.000B70r 2 00.000B70r 2 ; ---------------------------------------------------------------------------- 00.000B70r 2 UNARY: 00.000B70r 2 0A asl a 00.000B71r 2 48 pha 00.000B72r 2 AA tax 00.000B73r 2 20 C0 00 jsr CHRGET 00.000B76r 2 E0 83 cpx #<(TOKEN_LEFTSTR*2-1) 00.000B78r 2 90 20 bcc L2DEF 00.000B7Ar 2 20 rr rr jsr CHKOPN 00.000B7Dr 2 20 rr rr jsr FRMEVL 00.000B80r 2 20 rr rr jsr CHKCOM 00.000B83r 2 20 rr rr jsr CHKSTR 00.000B86r 2 68 pla 00.000B87r 2 AA tax 00.000B88r 2 A5 B2 lda FAC_LAST 00.000B8Ar 2 48 pha 00.000B8Br 2 A5 B1 lda FAC_LAST-1 00.000B8Dr 2 48 pha 00.000B8Er 2 8A txa 00.000B8Fr 2 48 pha 00.000B90r 2 20 rr rr jsr GETBYT 00.000B93r 2 68 pla 00.000B94r 2 A8 tay 00.000B95r 2 8A txa 00.000B96r 2 48 pha 00.000B97r 2 4C rr rr jmp L2DF4 00.000B9Ar 2 L2DEF: 00.000B9Ar 2 20 rr rr jsr PARCHK 00.000B9Dr 2 68 pla 00.000B9Er 2 A8 tay 00.000B9Fr 2 L2DF4: 00.000B9Fr 2 B9 rr rr lda UNFNC-TOKEN_SGN-TOKEN_SGN+$100,y 00.000BA2r 2 85 A2 sta JMPADRS+1 00.000BA4r 2 B9 rr rr lda UNFNC-TOKEN_SGN-TOKEN_SGN+$101,y 00.000BA7r 2 85 A3 sta JMPADRS+2 00.000BA9r 2 .ifdef KBD 00.000BA9r 2 jsr LF47D 00.000BA9r 2 .else 00.000BA9r 2 20 A1 00 jsr JMPADRS 00.000BACr 2 .endif 00.000BACr 2 4C rr rr jmp CHKNUM 00.000BAFr 2 00.000BAFr 2 ; ---------------------------------------------------------------------------- 00.000BAFr 2 OR: 00.000BAFr 2 A0 FF ldy #$FF 00.000BB1r 2 2C .byte $2C 00.000BB2r 2 ; ---------------------------------------------------------------------------- 00.000BB2r 2 TAND: 00.000BB2r 2 A0 00 ldy #$00 00.000BB4r 2 84 0C sty EOLPNTR 00.000BB6r 2 20 rr rr jsr AYINT 00.000BB9r 2 A5 B1 lda FAC_LAST-1 00.000BBBr 2 45 0C eor EOLPNTR 00.000BBDr 2 85 0A sta CHARAC 00.000BBFr 2 A5 B2 lda FAC_LAST 00.000BC1r 2 45 0C eor EOLPNTR 00.000BC3r 2 85 0B sta ENDCHR 00.000BC5r 2 20 rr rr jsr COPY_ARG_TO_FAC 00.000BC8r 2 20 rr rr jsr AYINT 00.000BCBr 2 A5 B2 lda FAC_LAST 00.000BCDr 2 45 0C eor EOLPNTR 00.000BCFr 2 25 0B and ENDCHR 00.000BD1r 2 45 0C eor EOLPNTR 00.000BD3r 2 A8 tay 00.000BD4r 2 A5 B1 lda FAC_LAST-1 00.000BD6r 2 45 0C eor EOLPNTR 00.000BD8r 2 25 0A and CHARAC 00.000BDAr 2 45 0C eor EOLPNTR 00.000BDCr 2 4C rr rr jmp GIVAYF 00.000BDFr 2 00.000BDFr 2 ; ---------------------------------------------------------------------------- 00.000BDFr 2 ; PERFORM RELATIONAL OPERATIONS 00.000BDFr 2 ; ---------------------------------------------------------------------------- 00.000BDFr 2 RELOPS: 00.000BDFr 2 20 rr rr jsr CHKVAL 00.000BE2r 2 B0 13 bcs STRCMP 00.000BE4r 2 A5 BB lda ARGSIGN 00.000BE6r 2 09 7F ora #$7F 00.000BE8r 2 25 B7 and ARG+1 00.000BEAr 2 85 B7 sta ARG+1 00.000BECr 2 A9 B6 lda #FRM_VARIABLE_CALL 00.000CF4r 2 D0 07 bne MAKENEWVARIABLE 00.000CF6r 2 .endif 00.000CF6r 2 LD015: 00.000CF6r 2 A9 rr lda #C_ZERO 00.000CFAr 2 60 rts 00.000CFBr 2 00.000CFBr 2 ; ---------------------------------------------------------------------------- 00.000CFBr 2 .ifndef CONFIG_2 00.000CFBr 2 C_ZERO: 00.000CFBr 2 00 00 .byte $00,$00 00.000CFDr 2 .endif 00.000CFDr 2 00.000CFDr 2 ; ---------------------------------------------------------------------------- 00.000CFDr 2 ; MAKE A NEW SIMPLE VARIABLE 00.000CFDr 2 ; 00.000CFDr 2 ; MOVE ARRAYS UP 7 BYTES TO MAKE ROOM FOR NEW VARIABLE 00.000CFDr 2 ; ENTER 7-BYTE VARIABLE DATA IN THE HOLE 00.000CFDr 2 ; ---------------------------------------------------------------------------- 00.000CFDr 2 MAKENEWVARIABLE: 00.000CFDr 2 .ifdef CONFIG_CBM_ALL 00.000CFDr 2 lda VARNAM 00.000CFDr 2 ldy VARNAM+1 00.000CFDr 2 cmp #$54 00.000CFDr 2 bne LD02F 00.000CFDr 2 cpy #$C9 00.000CFDr 2 beq LD015 00.000CFDr 2 cpy #$49 00.000CFDr 2 bne LD02F 00.000CFDr 2 LD02C: 00.000CFDr 2 jmp SYNERR 00.000CFDr 2 LD02F: 00.000CFDr 2 cmp #$53 00.000CFDr 2 bne LD037 00.000CFDr 2 cpy #$54 00.000CFDr 2 beq LD02C 00.000CFDr 2 LD037: 00.000CFDr 2 .endif 00.000CFDr 2 A5 7C lda ARYTAB 00.000CFFr 2 A4 7D ldy ARYTAB+1 00.000D01r 2 85 AC sta LOWTR 00.000D03r 2 84 AD sty LOWTR+1 00.000D05r 2 A5 7E lda STREND 00.000D07r 2 A4 7F ldy STREND+1 00.000D09r 2 85 A7 sta HIGHTR 00.000D0Br 2 84 A8 sty HIGHTR+1 00.000D0Dr 2 18 clc 00.000D0Er 2 69 07 adc #BYTES_PER_VARIABLE 00.000D10r 2 90 01 bcc L2F68 00.000D12r 2 C8 iny 00.000D13r 2 L2F68: 00.000D13r 2 85 A5 sta HIGHDS 00.000D15r 2 84 A6 sty HIGHDS+1 00.000D17r 2 20 rr rr jsr BLTU 00.000D1Ar 2 A5 A5 lda HIGHDS 00.000D1Cr 2 A4 A6 ldy HIGHDS+1 00.000D1Er 2 C8 iny 00.000D1Fr 2 85 7C sta ARYTAB 00.000D21r 2 84 7D sty ARYTAB+1 00.000D23r 2 A0 00 ldy #$00 00.000D25r 2 A5 92 lda VARNAM 00.000D27r 2 91 AC sta (LOWTR),y 00.000D29r 2 C8 iny 00.000D2Ar 2 A5 93 lda VARNAM+1 00.000D2Cr 2 91 AC sta (LOWTR),y 00.000D2Er 2 A9 00 lda #$00 00.000D30r 2 C8 iny 00.000D31r 2 91 AC sta (LOWTR),y 00.000D33r 2 C8 iny 00.000D34r 2 91 AC sta (LOWTR),y 00.000D36r 2 C8 iny 00.000D37r 2 91 AC sta (LOWTR),y 00.000D39r 2 C8 iny 00.000D3Ar 2 91 AC sta (LOWTR),y 00.000D3Cr 2 .ifndef CONFIG_SMALL 00.000D3Cr 2 C8 iny 00.000D3Dr 2 91 AC sta (LOWTR),y 00.000D3Fr 2 .endif 00.000D3Fr 2 00.000D3Fr 2 ; ---------------------------------------------------------------------------- 00.000D3Fr 2 ; PUT ADDRESS OF VALUE OF VARIABLE IN VARPNT AND Y,A 00.000D3Fr 2 ; ---------------------------------------------------------------------------- 00.000D3Fr 2 SET_VARPNT_AND_YA: 00.000D3Fr 2 A5 AC lda LOWTR 00.000D41r 2 18 clc 00.000D42r 2 69 02 adc #$02 00.000D44r 2 A4 AD ldy LOWTR+1 00.000D46r 2 90 01 bcc L2F9E 00.000D48r 2 C8 iny 00.000D49r 2 L2F9E: 00.000D49r 2 85 94 sta VARPNT 00.000D4Br 2 84 95 sty VARPNT+1 00.000D4Dr 2 60 rts 00.000D4Er 2 00.000D4Er 1 .include "array.s" 00.000D4Er 2 .segment "CODE" 00.000D4Er 2 00.000D4Er 2 ; ---------------------------------------------------------------------------- 00.000D4Er 2 ; COMPUTE ADDRESS OF FIRST VALUE IN ARRAY 00.000D4Er 2 ; ARYPNT = (LOWTR) + #DIMS*2 + 5 00.000D4Er 2 ; ---------------------------------------------------------------------------- 00.000D4Er 2 GETARY: 00.000D4Er 2 A5 0C lda EOLPNTR 00.000D50r 2 0A asl a 00.000D51r 2 69 05 adc #$05 00.000D53r 2 65 AC adc LOWTR 00.000D55r 2 A4 AD ldy LOWTR+1 00.000D57r 2 90 01 bcc L2FAF 00.000D59r 2 C8 iny 00.000D5Ar 2 L2FAF: 00.000D5Ar 2 85 A5 sta HIGHDS 00.000D5Cr 2 84 A6 sty HIGHDS+1 00.000D5Er 2 60 rts 00.000D5Fr 2 00.000D5Fr 2 ; ---------------------------------------------------------------------------- 00.000D5Fr 2 NEG32768: 00.000D5Fr 2 90 80 00 00 .byte $90,$80,$00,$00 00.000D63r 2 00.000D63r 2 .ifdef CONFIG_2C 00.000D63r 2 .byte $00; bugfix: short number 00.000D63r 2 .endif 00.000D63r 2 00.000D63r 2 ; ---------------------------------------------------------------------------- 00.000D63r 2 ; EVALUATE NUMERIC FORMULA AT TXTPTR 00.000D63r 2 ; CONVERTING RESULT TO INTEGER 0 <= X <= 32767 00.000D63r 2 ; IN FAC+3,4 00.000D63r 2 ; ---------------------------------------------------------------------------- 00.000D63r 2 MAKINT: 00.000D63r 2 20 C0 00 jsr CHRGET 00.000D66r 2 .ifdef CONFIG_2 00.000D66r 2 jsr FRMEVL 00.000D66r 2 .else 00.000D66r 2 20 rr rr jsr FRMNUM 00.000D69r 2 .endif 00.000D69r 2 00.000D69r 2 ; ---------------------------------------------------------------------------- 00.000D69r 2 ; CONVERT FAC TO INTEGER 00.000D69r 2 ; MUST BE POSITIVE AND LESS THAN 32768 00.000D69r 2 ; ---------------------------------------------------------------------------- 00.000D69r 2 MKINT: 00.000D69r 2 .ifdef CONFIG_2 00.000D69r 2 jsr CHKNUM 00.000D69r 2 .endif 00.000D69r 2 A5 B3 lda FACSIGN 00.000D6Br 2 30 0D bmi MI1 00.000D6Dr 2 00.000D6Dr 2 ; ---------------------------------------------------------------------------- 00.000D6Dr 2 ; CONVERT FAC TO INTEGER 00.000D6Dr 2 ; MUST BE -32767 <= FAC <= 32767 00.000D6Dr 2 ; ---------------------------------------------------------------------------- 00.000D6Dr 2 AYINT: 00.000D6Dr 2 A5 AE lda FAC 00.000D6Fr 2 C9 90 cmp #$90 00.000D71r 2 90 09 bcc MI2 00.000D73r 2 A9 rr lda #NEG32768 00.000D77r 2 20 rr rr jsr FCOMP 00.000D7Ar 2 MI1: 00.000D7Ar 2 D0 7A bne IQERR 00.000D7Cr 2 MI2: 00.000D7Cr 2 4C rr rr jmp QINT 00.000D7Fr 2 00.000D7Fr 2 ; ---------------------------------------------------------------------------- 00.000D7Fr 2 ; LOCATE ARRAY ELEMENT OR CREATE AN ARRAY 00.000D7Fr 2 ; ---------------------------------------------------------------------------- 00.000D7Fr 2 ARRAY: 00.000D7Fr 2 A5 0D lda DIMFLG 00.000D81r 2 .ifndef CONFIG_SMALL 00.000D81r 2 05 0F ora VALTYP+1 00.000D83r 2 .endif 00.000D83r 2 48 pha 00.000D84r 2 A5 0E lda VALTYP 00.000D86r 2 48 pha 00.000D87r 2 A0 00 ldy #$00 00.000D89r 2 L2FDE: 00.000D89r 2 98 tya 00.000D8Ar 2 48 pha 00.000D8Br 2 A5 93 lda VARNAM+1 00.000D8Dr 2 48 pha 00.000D8Er 2 A5 92 lda VARNAM 00.000D90r 2 48 pha 00.000D91r 2 20 rr rr jsr MAKINT 00.000D94r 2 68 pla 00.000D95r 2 85 92 sta VARNAM 00.000D97r 2 68 pla 00.000D98r 2 85 93 sta VARNAM+1 00.000D9Ar 2 68 pla 00.000D9Br 2 A8 tay 00.000D9Cr 2 BA tsx 00.000D9Dr 2 BD 02 01 lda STACK+2,x 00.000DA0r 2 48 pha 00.000DA1r 2 BD 01 01 lda STACK+1,x 00.000DA4r 2 48 pha 00.000DA5r 2 A5 B1 lda FAC_LAST-1 00.000DA7r 2 9D 02 01 sta STACK+2,x 00.000DAAr 2 A5 B2 lda FAC_LAST 00.000DACr 2 9D 01 01 sta STACK+1,x 00.000DAFr 2 C8 iny 00.000DB0r 2 20 C6 00 jsr CHRGOT 00.000DB3r 2 C9 2C cmp #$2C 00.000DB5r 2 F0 D2 beq L2FDE 00.000DB7r 2 84 0C sty EOLPNTR 00.000DB9r 2 20 rr rr jsr CHKCLS 00.000DBCr 2 68 pla 00.000DBDr 2 85 0E sta VALTYP 00.000DBFr 2 68 pla 00.000DC0r 2 .ifndef CONFIG_SMALL 00.000DC0r 2 85 0F sta VALTYP+1 00.000DC2r 2 29 7F and #$7F 00.000DC4r 2 .endif 00.000DC4r 2 85 0D sta DIMFLG 00.000DC6r 2 ; ---------------------------------------------------------------------------- 00.000DC6r 2 ; SEARCH ARRAY TABLE FOR THIS ARRAY NAME 00.000DC6r 2 ; ---------------------------------------------------------------------------- 00.000DC6r 2 A6 7C ldx ARYTAB 00.000DC8r 2 A5 7D lda ARYTAB+1 00.000DCAr 2 L301F: 00.000DCAr 2 86 AC stx LOWTR 00.000DCCr 2 85 AD sta LOWTR+1 00.000DCEr 2 C5 7F cmp STREND+1 00.000DD0r 2 D0 04 bne L302B 00.000DD2r 2 E4 7E cpx STREND 00.000DD4r 2 F0 39 beq MAKE_NEW_ARRAY 00.000DD6r 2 L302B: 00.000DD6r 2 A0 00 ldy #$00 00.000DD8r 2 B1 AC lda (LOWTR),y 00.000DDAr 2 C8 iny 00.000DDBr 2 C5 92 cmp VARNAM 00.000DDDr 2 D0 06 bne L303A 00.000DDFr 2 A5 93 lda VARNAM+1 00.000DE1r 2 D1 AC cmp (LOWTR),y 00.000DE3r 2 F0 16 beq USE_OLD_ARRAY 00.000DE5r 2 L303A: 00.000DE5r 2 C8 iny 00.000DE6r 2 B1 AC lda (LOWTR),y 00.000DE8r 2 18 clc 00.000DE9r 2 65 AC adc LOWTR 00.000DEBr 2 AA tax 00.000DECr 2 C8 iny 00.000DEDr 2 B1 AC lda (LOWTR),y 00.000DEFr 2 65 AD adc LOWTR+1 00.000DF1r 2 90 D7 bcc L301F 00.000DF3r 2 00.000DF3r 2 ; ---------------------------------------------------------------------------- 00.000DF3r 2 ; ERROR: BAD SUBSCRIPTS 00.000DF3r 2 ; ---------------------------------------------------------------------------- 00.000DF3r 2 SUBERR: 00.000DF3r 2 A2 6B ldx #ERR_BADSUBS 00.000DF5r 2 2C .byte $2C 00.000DF6r 2 00.000DF6r 2 ; ---------------------------------------------------------------------------- 00.000DF6r 2 ; ERROR: ILLEGAL QUANTITY 00.000DF6r 2 ; ---------------------------------------------------------------------------- 00.000DF6r 2 IQERR: 00.000DF6r 2 A2 35 ldx #ERR_ILLQTY 00.000DF8r 2 JER: 00.000DF8r 2 4C rr rr jmp ERROR 00.000DFBr 2 00.000DFBr 2 ; ---------------------------------------------------------------------------- 00.000DFBr 2 ; FOUND THE ARRAY 00.000DFBr 2 ; ---------------------------------------------------------------------------- 00.000DFBr 2 USE_OLD_ARRAY: 00.000DFBr 2 A2 78 ldx #ERR_REDIMD 00.000DFDr 2 A5 0D lda DIMFLG 00.000DFFr 2 D0 F7 bne JER 00.000E01r 2 20 rr rr jsr GETARY 00.000E04r 2 A5 0C lda EOLPNTR 00.000E06r 2 A0 04 ldy #$04 00.000E08r 2 D1 AC cmp (LOWTR),y 00.000E0Ar 2 D0 E7 bne SUBERR 00.000E0Cr 2 4C rr rr jmp FIND_ARRAY_ELEMENT 00.000E0Fr 2 00.000E0Fr 2 ; ---------------------------------------------------------------------------- 00.000E0Fr 2 ; CREATE A NEW ARRAY, UNLESS CALLED FROM GETARYPT 00.000E0Fr 2 ; ---------------------------------------------------------------------------- 00.000E0Fr 2 MAKE_NEW_ARRAY: 00.000E0Fr 2 20 rr rr jsr GETARY 00.000E12r 2 20 rr rr jsr REASON 00.000E15r 2 A9 00 lda #$00 00.000E17r 2 A8 tay 00.000E18r 2 85 BF sta STRNG2+1 00.000E1Ar 2 A2 05 ldx #BYTES_PER_ELEMENT 00.000E1Cr 2 .if .def(CONFIG_SMALL) && (!.def(CONFIG_2)) 00.000E1Cr 2 stx STRNG2 00.000E1Cr 2 .endif 00.000E1Cr 2 A5 92 lda VARNAM 00.000E1Er 2 91 AC sta (LOWTR),y 00.000E20r 2 .ifndef CONFIG_SMALL 00.000E20r 2 10 01 bpl L3078 00.000E22r 2 CA dex 00.000E23r 2 L3078: 00.000E23r 2 .endif 00.000E23r 2 C8 iny 00.000E24r 2 A5 93 lda VARNAM+1 00.000E26r 2 91 AC sta (LOWTR),y 00.000E28r 2 .if (!.def(CONFIG_SMALL)) || .def(CONFIG_2) 00.000E28r 2 10 02 bpl L3081 00.000E2Ar 2 CA dex 00.000E2Br 2 .if !(.def(CONFIG_SMALL) && .def(CONFIG_2)) 00.000E2Br 2 CA dex 00.000E2Cr 2 .endif 00.000E2Cr 2 L3081: 00.000E2Cr 2 86 BE stx STRNG2 00.000E2Er 2 .endif 00.000E2Er 2 A5 0C lda EOLPNTR 00.000E30r 2 C8 iny 00.000E31r 2 C8 iny 00.000E32r 2 C8 iny 00.000E33r 2 91 AC sta (LOWTR),y 00.000E35r 2 L308A: 00.000E35r 2 A2 0B ldx #$0B 00.000E37r 2 A9 00 lda #$00 00.000E39r 2 24 0D bit DIMFLG 00.000E3Br 2 50 08 bvc L309A 00.000E3Dr 2 68 pla 00.000E3Er 2 18 clc 00.000E3Fr 2 69 01 adc #$01 00.000E41r 2 AA tax 00.000E42r 2 68 pla 00.000E43r 2 69 00 adc #$00 00.000E45r 2 L309A: 00.000E45r 2 C8 iny 00.000E46r 2 91 AC sta (LOWTR),y 00.000E48r 2 C8 iny 00.000E49r 2 8A txa 00.000E4Ar 2 91 AC sta (LOWTR),y 00.000E4Cr 2 20 rr rr jsr MULTIPLY_SUBSCRIPT 00.000E4Fr 2 86 BE stx STRNG2 00.000E51r 2 85 BF sta STRNG2+1 00.000E53r 2 A4 6F ldy INDEX 00.000E55r 2 C6 0C dec EOLPNTR 00.000E57r 2 D0 DC bne L308A 00.000E59r 2 65 A6 adc HIGHDS+1 00.000E5Br 2 B0 5D bcs GME 00.000E5Dr 2 85 A6 sta HIGHDS+1 00.000E5Fr 2 A8 tay 00.000E60r 2 8A txa 00.000E61r 2 65 A5 adc HIGHDS 00.000E63r 2 90 03 bcc L30BD 00.000E65r 2 C8 iny 00.000E66r 2 F0 52 beq GME 00.000E68r 2 L30BD: 00.000E68r 2 20 rr rr jsr REASON 00.000E6Br 2 85 7E sta STREND 00.000E6Dr 2 84 7F sty STREND+1 00.000E6Fr 2 A9 00 lda #$00 00.000E71r 2 E6 BF inc STRNG2+1 00.000E73r 2 A4 BE ldy STRNG2 00.000E75r 2 F0 05 beq L30D1 00.000E77r 2 L30CC: 00.000E77r 2 88 dey 00.000E78r 2 91 A5 sta (HIGHDS),y 00.000E7Ar 2 D0 FB bne L30CC 00.000E7Cr 2 L30D1: 00.000E7Cr 2 C6 A6 dec HIGHDS+1 00.000E7Er 2 C6 BF dec STRNG2+1 00.000E80r 2 D0 F5 bne L30CC 00.000E82r 2 E6 A6 inc HIGHDS+1 00.000E84r 2 38 sec 00.000E85r 2 A5 7E lda STREND 00.000E87r 2 E5 AC sbc LOWTR 00.000E89r 2 A0 02 ldy #$02 00.000E8Br 2 91 AC sta (LOWTR),y 00.000E8Dr 2 A5 7F lda STREND+1 00.000E8Fr 2 C8 iny 00.000E90r 2 E5 AD sbc LOWTR+1 00.000E92r 2 91 AC sta (LOWTR),y 00.000E94r 2 A5 0D lda DIMFLG 00.000E96r 2 D0 62 bne RTS9 00.000E98r 2 C8 iny 00.000E99r 2 00.000E99r 2 ; ---------------------------------------------------------------------------- 00.000E99r 2 ; FIND SPECIFIED ARRAY ELEMENT 00.000E99r 2 ; 00.000E99r 2 ; (LOWTR),Y POINTS AT # OF DIMS IN ARRAY DESCRIPTOR 00.000E99r 2 ; THE SUBSCRIPTS ARE ALL ON THE STACK AS INTEGERS 00.000E99r 2 ; ---------------------------------------------------------------------------- 00.000E99r 2 FIND_ARRAY_ELEMENT: 00.000E99r 2 B1 AC lda (LOWTR),y 00.000E9Br 2 85 0C sta EOLPNTR 00.000E9Dr 2 A9 00 lda #$00 00.000E9Fr 2 85 BE sta STRNG2 00.000EA1r 2 L30F6: 00.000EA1r 2 85 BF sta STRNG2+1 00.000EA3r 2 C8 iny 00.000EA4r 2 68 pla 00.000EA5r 2 AA tax 00.000EA6r 2 85 B1 sta FAC_LAST-1 00.000EA8r 2 68 pla 00.000EA9r 2 85 B2 sta FAC_LAST 00.000EABr 2 D1 AC cmp (LOWTR),y 00.000EADr 2 90 0E bcc FAE2 00.000EAFr 2 D0 06 bne GSE 00.000EB1r 2 C8 iny 00.000EB2r 2 8A txa 00.000EB3r 2 D1 AC cmp (LOWTR),y 00.000EB5r 2 90 07 bcc FAE3 00.000EB7r 2 ; ---------------------------------------------------------------------------- 00.000EB7r 2 GSE: 00.000EB7r 2 4C rr rr jmp SUBERR 00.000EBAr 2 GME: 00.000EBAr 2 4C rr rr jmp MEMERR 00.000EBDr 2 ; ---------------------------------------------------------------------------- 00.000EBDr 2 FAE2: 00.000EBDr 2 C8 iny 00.000EBEr 2 FAE3: 00.000EBEr 2 A5 BF lda STRNG2+1 00.000EC0r 2 05 BE ora STRNG2 00.000EC2r 2 18 clc 00.000EC3r 2 F0 0A beq L3124 00.000EC5r 2 20 rr rr jsr MULTIPLY_SUBSCRIPT 00.000EC8r 2 8A txa 00.000EC9r 2 65 B1 adc FAC_LAST-1 00.000ECBr 2 AA tax 00.000ECCr 2 98 tya 00.000ECDr 2 A4 6F ldy INDEX 00.000ECFr 2 L3124: 00.000ECFr 2 65 B2 adc FAC_LAST 00.000ED1r 2 86 BE stx STRNG2 00.000ED3r 2 C6 0C dec EOLPNTR 00.000ED5r 2 D0 CA bne L30F6 00.000ED7r 2 .if .def(CONFIG_SMALL) && (!.def(CONFIG_2)) 00.000ED7r 2 asl STRNG2 00.000ED7r 2 rol a 00.000ED7r 2 bcs GSE 00.000ED7r 2 asl STRNG2 00.000ED7r 2 rol a 00.000ED7r 2 bcs GSE 00.000ED7r 2 tay 00.000ED7r 2 lda STRNG2 00.000ED7r 2 .else 00.000ED7r 2 .ifdef CONFIG_11A 00.000ED7r 2 85 BF sta STRNG2+1 00.000ED9r 2 .endif 00.000ED9r 2 A2 05 ldx #BYTES_FP 00.000EDBr 2 .ifdef CONFIG_SMALL 00.000EDBr 2 lda VARNAM+1 00.000EDBr 2 .else 00.000EDBr 2 A5 92 lda VARNAM 00.000EDDr 2 .endif 00.000EDDr 2 10 01 bpl L3135 00.000EDFr 2 CA dex 00.000EE0r 2 L3135: 00.000EE0r 2 .ifdef CONFIG_SMALL 00.000EE0r 2 stx RESULT+1 00.000EE0r 2 .else 00.000EE0r 2 A5 93 lda VARNAM+1 00.000EE2r 2 10 02 bpl L313B 00.000EE4r 2 CA dex 00.000EE5r 2 CA dex 00.000EE6r 2 L313B: 00.000EE6r 2 86 75 stx RESULT+2 00.000EE8r 2 .endif 00.000EE8r 2 A9 00 lda #$00 00.000EEAr 2 20 rr rr jsr MULTIPLY_SUBS1 00.000EEDr 2 8A txa 00.000EEEr 2 .endif 00.000EEEr 2 65 A5 adc HIGHDS 00.000EF0r 2 85 94 sta VARPNT 00.000EF2r 2 98 tya 00.000EF3r 2 65 A6 adc HIGHDS+1 00.000EF5r 2 85 95 sta VARPNT+1 00.000EF7r 2 A8 tay 00.000EF8r 2 A5 94 lda VARPNT 00.000EFAr 2 RTS9: 00.000EFAr 2 60 rts 00.000EFBr 2 00.000EFBr 2 ; ---------------------------------------------------------------------------- 00.000EFBr 2 ; MULTIPLY (STRNG2) BY ((LOWTR),Y) 00.000EFBr 2 ; LEAVING PRODUCT IN A,X. (HI-BYTE ALSO IN Y.) 00.000EFBr 2 ; USED ONLY BY ARRAY SUBSCRIPT ROUTINES 00.000EFBr 2 ; ---------------------------------------------------------------------------- 00.000EFBr 2 MULTIPLY_SUBSCRIPT: 00.000EFBr 2 84 6F sty INDEX 00.000EFDr 2 B1 AC lda (LOWTR),y 00.000EFFr 2 85 75 sta RESULT_LAST-2 00.000F01r 2 88 dey 00.000F02r 2 B1 AC lda (LOWTR),y 00.000F04r 2 MULTIPLY_SUBS1: 00.000F04r 2 85 76 sta RESULT_LAST-1 00.000F06r 2 A9 10 lda #$10 00.000F08r 2 85 AA sta INDX 00.000F0Ar 2 A2 00 ldx #$00 00.000F0Cr 2 A0 00 ldy #$00 00.000F0Er 2 L3163: 00.000F0Er 2 8A txa 00.000F0Fr 2 0A asl a 00.000F10r 2 AA tax 00.000F11r 2 98 tya 00.000F12r 2 2A rol a 00.000F13r 2 A8 tay 00.000F14r 2 B0 A4 bcs GME 00.000F16r 2 06 BE asl STRNG2 00.000F18r 2 26 BF rol STRNG2+1 00.000F1Ar 2 90 0B bcc L317C 00.000F1Cr 2 18 clc 00.000F1Dr 2 8A txa 00.000F1Er 2 65 75 adc RESULT_LAST-2 00.000F20r 2 AA tax 00.000F21r 2 98 tya 00.000F22r 2 65 76 adc RESULT_LAST-1 00.000F24r 2 A8 tay 00.000F25r 2 B0 93 bcs GME 00.000F27r 2 L317C: 00.000F27r 2 C6 AA dec INDX 00.000F29r 2 D0 E3 bne L3163 00.000F2Br 2 60 rts 00.000F2Cr 2 00.000F2Cr 2 00.000F2Cr 1 .include "misc2.s" 00.000F2Cr 2 .segment "CODE" 00.000F2Cr 2 00.000F2Cr 2 ; ---------------------------------------------------------------------------- 00.000F2Cr 2 ; "FRE" FUNCTION 00.000F2Cr 2 ; 00.000F2Cr 2 ; COLLECTS GARBAGE AND RETURNS # BYTES OF MEMORY LEFT 00.000F2Cr 2 ; ---------------------------------------------------------------------------- 00.000F2Cr 2 FRE: 00.000F2Cr 2 A5 0E lda VALTYP 00.000F2Er 2 F0 03 beq L3188 00.000F30r 2 20 rr rr jsr FREFAC 00.000F33r 2 L3188: 00.000F33r 2 20 rr rr jsr GARBAG 00.000F36r 2 38 sec 00.000F37r 2 A5 80 lda FRETOP 00.000F39r 2 E5 7E sbc STREND 00.000F3Br 2 A8 tay 00.000F3Cr 2 A5 81 lda FRETOP+1 00.000F3Er 2 E5 7F sbc STREND+1 00.000F40r 2 ; FALL INTO GIVAYF TO FLOAT THE VALUE 00.000F40r 2 ; NOTE THAT VALUES OVER 32767 WILL RETURN AS NEGATIVE 00.000F40r 2 00.000F40r 2 ; ---------------------------------------------------------------------------- 00.000F40r 2 ; FLOAT THE SIGNED INTEGER IN A,Y 00.000F40r 2 ; ---------------------------------------------------------------------------- 00.000F40r 2 GIVAYF: 00.000F40r 2 A2 00 ldx #$00 00.000F42r 2 86 0E stx VALTYP 00.000F44r 2 85 AF sta FAC+1 00.000F46r 2 84 B0 sty FAC+2 00.000F48r 2 A2 90 ldx #$90 00.000F4Ar 2 4C rr rr jmp FLOAT1 00.000F4Dr 2 POS: 00.000F4Dr 2 A4 16 ldy POSX 00.000F4Fr 2 00.000F4Fr 2 ; ---------------------------------------------------------------------------- 00.000F4Fr 2 ; FLOAT (Y) INTO FAC, GIVING VALUE 0-255 00.000F4Fr 2 ; ---------------------------------------------------------------------------- 00.000F4Fr 2 SNGFLT: 00.000F4Fr 2 A9 00 lda #$00 00.000F51r 2 F0 ED beq GIVAYF 00.000F53r 2 00.000F53r 2 ; ---------------------------------------------------------------------------- 00.000F53r 2 ; CHECK FOR DIRECT OR RUNNING MODE 00.000F53r 2 ; GIVING ERROR IF DIRECT MODE 00.000F53r 2 ; ---------------------------------------------------------------------------- 00.000F53r 2 ERRDIR: 00.000F53r 2 A6 87 ldx CURLIN+1 00.000F55r 2 E8 inx 00.000F56r 2 D0 A2 bne RTS9 00.000F58r 2 A2 95 ldx #ERR_ILLDIR 00.000F5Ar 2 .ifdef CONFIG_2 00.000F5Ar 2 .byte $2C 00.000F5Ar 2 LD288: 00.000F5Ar 2 ldx #ERR_UNDEFFN 00.000F5Ar 2 .endif 00.000F5Ar 2 L31AF: 00.000F5Ar 2 4C rr rr jmp ERROR 00.000F5Dr 2 DEF: 00.000F5Dr 2 20 rr rr jsr FNC 00.000F60r 2 20 rr rr jsr ERRDIR 00.000F63r 2 20 rr rr jsr CHKOPN 00.000F66r 2 A9 80 lda #$80 00.000F68r 2 85 11 sta SUBFLG 00.000F6Ar 2 20 rr rr jsr PTRGET 00.000F6Dr 2 20 rr rr jsr CHKNUM 00.000F70r 2 20 rr rr jsr CHKCLS 00.000F73r 2 A9 AC lda #TOKEN_EQUAL 00.000F75r 2 20 rr rr jsr SYNCHR 00.000F78r 2 .ifndef CONFIG_SMALL 00.000F78r 2 48 pha 00.000F79r 2 .endif 00.000F79r 2 A5 95 lda VARPNT+1 00.000F7Br 2 48 pha 00.000F7Cr 2 A5 94 lda VARPNT 00.000F7Er 2 48 pha 00.000F7Fr 2 A5 C8 lda TXTPTR+1 00.000F81r 2 48 pha 00.000F82r 2 A5 C7 lda TXTPTR 00.000F84r 2 48 pha 00.000F85r 2 20 rr rr jsr DATA 00.000F88r 2 4C rr rr jmp L3250 00.000F8Br 2 FNC: 00.000F8Br 2 A9 9F lda #TOKEN_FN 00.000F8Dr 2 20 rr rr jsr SYNCHR 00.000F90r 2 09 80 ora #$80 00.000F92r 2 85 11 sta SUBFLG 00.000F94r 2 20 rr rr jsr PTRGET3 00.000F97r 2 85 9B sta FNCNAM 00.000F99r 2 84 9C sty FNCNAM+1 00.000F9Br 2 4C rr rr jmp CHKNUM 00.000F9Er 2 L31F3: 00.000F9Er 2 20 rr rr jsr FNC 00.000FA1r 2 A5 9C lda FNCNAM+1 00.000FA3r 2 48 pha 00.000FA4r 2 A5 9B lda FNCNAM 00.000FA6r 2 48 pha 00.000FA7r 2 20 rr rr jsr PARCHK 00.000FAAr 2 20 rr rr jsr CHKNUM 00.000FADr 2 68 pla 00.000FAEr 2 85 9B sta FNCNAM 00.000FB0r 2 68 pla 00.000FB1r 2 85 9C sta FNCNAM+1 00.000FB3r 2 A0 02 ldy #$02 00.000FB5r 2 .ifndef CONFIG_2 00.000FB5r 2 A2 E0 ldx #ERR_UNDEFFN 00.000FB7r 2 .endif 00.000FB7r 2 B1 9B lda (FNCNAM),y 00.000FB9r 2 .ifndef CONFIG_2 00.000FB9r 2 F0 9F beq L31AF 00.000FBBr 2 .endif 00.000FBBr 2 85 94 sta VARPNT 00.000FBDr 2 AA tax 00.000FBEr 2 C8 iny 00.000FBFr 2 B1 9B lda (FNCNAM),y 00.000FC1r 2 .ifdef CONFIG_2 00.000FC1r 2 beq LD288 00.000FC1r 2 .endif 00.000FC1r 2 85 95 sta VARPNT+1 00.000FC3r 2 .ifndef CONFIG_SMALL 00.000FC3r 2 C8 iny 00.000FC4r 2 .endif 00.000FC4r 2 L3219: 00.000FC4r 2 B1 94 lda (VARPNT),y 00.000FC6r 2 48 pha 00.000FC7r 2 88 dey 00.000FC8r 2 10 FA bpl L3219 00.000FCAr 2 A4 95 ldy VARPNT+1 00.000FCCr 2 20 rr rr jsr STORE_FAC_AT_YX_ROUNDED 00.000FCFr 2 A5 C8 lda TXTPTR+1 00.000FD1r 2 48 pha 00.000FD2r 2 A5 C7 lda TXTPTR 00.000FD4r 2 48 pha 00.000FD5r 2 B1 9B lda (FNCNAM),y 00.000FD7r 2 85 C7 sta TXTPTR 00.000FD9r 2 C8 iny 00.000FDAr 2 B1 9B lda (FNCNAM),y 00.000FDCr 2 85 C8 sta TXTPTR+1 00.000FDEr 2 A5 95 lda VARPNT+1 00.000FE0r 2 48 pha 00.000FE1r 2 A5 94 lda VARPNT 00.000FE3r 2 48 pha 00.000FE4r 2 20 rr rr jsr FRMNUM 00.000FE7r 2 68 pla 00.000FE8r 2 85 9B sta FNCNAM 00.000FEAr 2 68 pla 00.000FEBr 2 85 9C sta FNCNAM+1 00.000FEDr 2 20 C6 00 jsr CHRGOT 00.000FF0r 2 F0 03 beq L324A 00.000FF2r 2 4C rr rr jmp SYNERR 00.000FF5r 2 L324A: 00.000FF5r 2 68 pla 00.000FF6r 2 85 C7 sta TXTPTR 00.000FF8r 2 68 pla 00.000FF9r 2 85 C8 sta TXTPTR+1 00.000FFBr 2 L3250: 00.000FFBr 2 A0 00 ldy #$00 00.000FFDr 2 68 pla 00.000FFEr 2 91 9B sta (FNCNAM),y 00.001000r 2 68 pla 00.001001r 2 C8 iny 00.001002r 2 91 9B sta (FNCNAM),y 00.001004r 2 68 pla 00.001005r 2 C8 iny 00.001006r 2 91 9B sta (FNCNAM),y 00.001008r 2 68 pla 00.001009r 2 C8 iny 00.00100Ar 2 91 9B sta (FNCNAM),y 00.00100Cr 2 .ifndef CONFIG_SMALL 00.00100Cr 2 68 pla 00.00100Dr 2 C8 iny 00.00100Er 2 91 9B sta (FNCNAM),y 00.001010r 2 .endif 00.001010r 2 60 rts 00.001011r 2 00.001011r 1 .include "string.s" 00.001011r 2 .segment "CODE" 00.001011r 2 ; ---------------------------------------------------------------------------- 00.001011r 2 ; "STR$" FUNCTION 00.001011r 2 ; ---------------------------------------------------------------------------- 00.001011r 2 STR: 00.001011r 2 20 rr rr jsr CHKNUM 00.001014r 2 A0 00 ldy #$00 00.001016r 2 20 rr rr jsr FOUT1 00.001019r 2 68 pla 00.00101Ar 2 68 pla 00.00101Br 2 LD353: 00.00101Br 2 A9 FF lda #$FF 00.00101Dr 2 A0 00 ldy #$00 00.00101Fr 2 F0 12 beq STRLIT 00.001021r 2 00.001021r 2 ; ---------------------------------------------------------------------------- 00.001021r 2 ; GET SPACE AND MAKE DESCRIPTOR FOR STRING WHOSE 00.001021r 2 ; ADDRESS IS IN FAC+3,4 AND WHOSE LENGTH IS IN A-REG 00.001021r 2 ; ---------------------------------------------------------------------------- 00.001021r 2 STRINI: 00.001021r 2 A6 B1 ldx FAC_LAST-1 00.001023r 2 A4 B2 ldy FAC_LAST 00.001025r 2 86 9D stx DSCPTR 00.001027r 2 84 9E sty DSCPTR+1 00.001029r 2 00.001029r 2 ; ---------------------------------------------------------------------------- 00.001029r 2 ; GET SPACE AND MAKE DESCRIPTOR FOR STRING WHOSE 00.001029r 2 ; ADDRESS IS IN Y,X AND WHOSE LENGTH IS IN A-REG 00.001029r 2 ; ---------------------------------------------------------------------------- 00.001029r 2 STRSPA: 00.001029r 2 20 rr rr jsr GETSPA 00.00102Cr 2 86 AF stx FAC+1 00.00102Er 2 84 B0 sty FAC+2 00.001030r 2 85 AE sta FAC 00.001032r 2 60 rts 00.001033r 2 00.001033r 2 ; ---------------------------------------------------------------------------- 00.001033r 2 ; BUILD A DESCRIPTOR FOR STRING STARTING AT Y,A 00.001033r 2 ; AND TERMINATED BY $00 OR QUOTATION MARK 00.001033r 2 ; RETURN WITH DESCRIPTOR IN A TEMPORARY 00.001033r 2 ; AND ADDRESS OF DESCRIPTOR IN FAC+3,4 00.001033r 2 ; ---------------------------------------------------------------------------- 00.001033r 2 STRLIT: 00.001033r 2 A2 22 ldx #$22 00.001035r 2 86 0A stx CHARAC 00.001037r 2 86 0B stx ENDCHR 00.001039r 2 00.001039r 2 ; ---------------------------------------------------------------------------- 00.001039r 2 ; BUILD A DESCRIPTOR FOR STRING STARTING AT Y,A 00.001039r 2 ; AND TERMINATED BY $00, (CHARAC), OR (ENDCHR) 00.001039r 2 ; 00.001039r 2 ; RETURN WITH DESCRIPTOR IN A TEMPORARY 00.001039r 2 ; AND ADDRESS OF DESCRIPTOR IN FAC+3,4 00.001039r 2 ; ---------------------------------------------------------------------------- 00.001039r 2 STRLT2: 00.001039r 2 85 BC sta STRNG1 00.00103Br 2 84 BD sty STRNG1+1 00.00103Dr 2 85 AF sta FAC+1 00.00103Fr 2 84 B0 sty FAC+2 00.001041r 2 A0 FF ldy #$FF 00.001043r 2 L3298: 00.001043r 2 C8 iny 00.001044r 2 B1 BC lda (STRNG1),y 00.001046r 2 F0 0C beq L32A9 00.001048r 2 C5 0A cmp CHARAC 00.00104Ar 2 F0 04 beq L32A5 00.00104Cr 2 C5 0B cmp ENDCHR 00.00104Er 2 D0 F3 bne L3298 00.001050r 2 L32A5: 00.001050r 2 C9 22 cmp #$22 00.001052r 2 F0 01 beq L32AA 00.001054r 2 L32A9: 00.001054r 2 18 clc 00.001055r 2 L32AA: 00.001055r 2 84 AE sty FAC 00.001057r 2 98 tya 00.001058r 2 65 BC adc STRNG1 00.00105Ar 2 85 BE sta STRNG2 00.00105Cr 2 A6 BD ldx STRNG1+1 00.00105Er 2 90 01 bcc L32B6 00.001060r 2 E8 inx 00.001061r 2 L32B6: 00.001061r 2 86 BF stx STRNG2+1 00.001063r 2 A5 BD lda STRNG1+1 00.001065r 2 .ifdef CONFIG_NO_INPUTBUFFER_ZP 00.001065r 2 beq LD399 00.001065r 2 cmp #>INPUTBUFFER 00.001065r 2 .endif 00.001065r 2 D0 0B bne PUTNEW 00.001067r 2 LD399: 00.001067r 2 98 tya 00.001068r 2 20 rr rr jsr STRINI 00.00106Br 2 A6 BC ldx STRNG1 00.00106Dr 2 A4 BD ldy STRNG1+1 00.00106Fr 2 20 rr rr jsr MOVSTR 00.001072r 2 00.001072r 2 ; ---------------------------------------------------------------------------- 00.001072r 2 ; STORE DESCRIPTOR IN TEMPORARY DESCRIPTOR STACK 00.001072r 2 ; 00.001072r 2 ; THE DESCRIPTOR IS NOW IN FAC, FAC+1, FAC+2 00.001072r 2 ; PUT ADDRESS OF TEMP DESCRIPTOR IN FAC+3,4 00.001072r 2 ; ---------------------------------------------------------------------------- 00.001072r 2 PUTNEW: 00.001072r 2 A6 63 ldx TEMPPT 00.001074r 2 E0 6F cpx #TEMPST+9 00.001076r 2 D0 05 bne PUTEMP 00.001078r 2 A2 BF ldx #ERR_FRMCPX 00.00107Ar 2 JERR: 00.00107Ar 2 4C rr rr jmp ERROR 00.00107Dr 2 PUTEMP: 00.00107Dr 2 A5 AE lda FAC 00.00107Fr 2 95 00 sta 0,x 00.001081r 2 A5 AF lda FAC+1 00.001083r 2 95 01 sta 1,x 00.001085r 2 A5 B0 lda FAC+2 00.001087r 2 95 02 sta 2,x 00.001089r 2 A0 00 ldy #$00 00.00108Br 2 86 B1 stx FAC_LAST-1 00.00108Dr 2 84 B2 sty FAC_LAST 00.00108Fr 2 .ifdef CONFIG_2 00.00108Fr 2 sty FACEXTENSION 00.00108Fr 2 .endif 00.00108Fr 2 88 dey 00.001090r 2 84 0E sty VALTYP 00.001092r 2 86 64 stx LASTPT 00.001094r 2 E8 inx 00.001095r 2 E8 inx 00.001096r 2 E8 inx 00.001097r 2 86 63 stx TEMPPT 00.001099r 2 60 rts 00.00109Ar 2 00.00109Ar 2 ; ---------------------------------------------------------------------------- 00.00109Ar 2 ; MAKE SPACE FOR STRING AT BOTTOM OF STRING SPACE 00.00109Ar 2 ; (A)=# BYTES SPACE TO MAKE 00.00109Ar 2 ; 00.00109Ar 2 ; RETURN WITH (A) SAME, 00.00109Ar 2 ; AND Y,X = ADDRESS OF SPACE ALLOCATED 00.00109Ar 2 ; ---------------------------------------------------------------------------- 00.00109Ar 2 GETSPA: 00.00109Ar 2 46 10 lsr DATAFLG 00.00109Cr 2 L32F1: 00.00109Cr 2 48 pha 00.00109Dr 2 49 FF eor #$FF 00.00109Fr 2 38 sec 00.0010A0r 2 65 80 adc FRETOP 00.0010A2r 2 A4 81 ldy FRETOP+1 00.0010A4r 2 B0 01 bcs L32FC 00.0010A6r 2 88 dey 00.0010A7r 2 L32FC: 00.0010A7r 2 C4 7F cpy STREND+1 00.0010A9r 2 90 11 bcc L3311 00.0010ABr 2 D0 04 bne L3306 00.0010ADr 2 C5 7E cmp STREND 00.0010AFr 2 90 0B bcc L3311 00.0010B1r 2 L3306: 00.0010B1r 2 85 80 sta FRETOP 00.0010B3r 2 84 81 sty FRETOP+1 00.0010B5r 2 85 82 sta FRESPC 00.0010B7r 2 84 83 sty FRESPC+1 00.0010B9r 2 AA tax 00.0010BAr 2 68 pla 00.0010BBr 2 60 rts 00.0010BCr 2 L3311: 00.0010BCr 2 A2 4D ldx #ERR_MEMFULL 00.0010BEr 2 A5 10 lda DATAFLG 00.0010C0r 2 30 B8 bmi JERR 00.0010C2r 2 20 rr rr jsr GARBAG 00.0010C5r 2 A9 80 lda #$80 00.0010C7r 2 85 10 sta DATAFLG 00.0010C9r 2 68 pla 00.0010CAr 2 D0 D0 bne L32F1 00.0010CCr 2 00.0010CCr 2 ; ---------------------------------------------------------------------------- 00.0010CCr 2 ; SHOVE ALL REFERENCED STRINGS AS HIGH AS POSSIBLE 00.0010CCr 2 ; IN MEMORY (AGAINST HIMEM), FREEING UP SPACE 00.0010CCr 2 ; BELOW STRING AREA DOWN TO STREND. 00.0010CCr 2 ; ---------------------------------------------------------------------------- 00.0010CCr 2 GARBAG: 00.0010CCr 2 00.0010CCr 2 .ifdef CONST_MEMSIZ 00.0010CCr 2 ldx #CONST_MEMSIZ 00.0010CCr 2 .else 00.0010CCr 2 A6 84 ldx MEMSIZ 00.0010CEr 2 A5 85 lda MEMSIZ+1 00.0010D0r 2 .endif 00.0010D0r 2 FINDHIGHESTSTRING: 00.0010D0r 2 86 80 stx FRETOP 00.0010D2r 2 85 81 sta FRETOP+1 00.0010D4r 2 A0 00 ldy #$00 00.0010D6r 2 84 9C sty FNCNAM+1 00.0010D8r 2 .ifdef CONFIG_2 00.0010D8r 2 sty FNCNAM ; GC bugfix! 00.0010D8r 2 .endif 00.0010D8r 2 A5 7E lda STREND 00.0010DAr 2 A6 7F ldx STREND+1 00.0010DCr 2 85 AC sta LOWTR 00.0010DEr 2 86 AD stx LOWTR+1 00.0010E0r 2 A9 66 lda #TEMPST 00.0010E2r 2 A2 00 ldx #$00 00.0010E4r 2 85 6F sta INDEX 00.0010E6r 2 86 70 stx INDEX+1 00.0010E8r 2 L333D: 00.0010E8r 2 C5 63 cmp TEMPPT 00.0010EAr 2 F0 05 beq L3346 00.0010ECr 2 20 rr rr jsr CHECK_VARIABLE 00.0010EFr 2 F0 F7 beq L333D 00.0010F1r 2 L3346: 00.0010F1r 2 A9 07 lda #BYTES_PER_VARIABLE 00.0010F3r 2 85 A0 sta DSCLEN 00.0010F5r 2 A5 7A lda VARTAB 00.0010F7r 2 A6 7B ldx VARTAB+1 00.0010F9r 2 85 6F sta INDEX 00.0010FBr 2 86 70 stx INDEX+1 00.0010FDr 2 L3352: 00.0010FDr 2 E4 7D cpx ARYTAB+1 00.0010FFr 2 D0 04 bne L335A 00.001101r 2 C5 7C cmp ARYTAB 00.001103r 2 F0 05 beq L335F 00.001105r 2 L335A: 00.001105r 2 20 rr rr jsr CHECK_SIMPLE_VARIABLE 00.001108r 2 F0 F3 beq L3352 00.00110Ar 2 L335F: 00.00110Ar 2 85 A5 sta HIGHDS 00.00110Cr 2 86 A6 stx HIGHDS+1 00.00110Er 2 A9 03 lda #$03 ; OSI GC bugfix -> $04 ??? 00.001110r 2 85 A0 sta DSCLEN 00.001112r 2 L3367: 00.001112r 2 A5 A5 lda HIGHDS 00.001114r 2 A6 A6 ldx HIGHDS+1 00.001116r 2 L336B: 00.001116r 2 E4 7F cpx STREND+1 00.001118r 2 D0 07 bne L3376 00.00111Ar 2 C5 7E cmp STREND 00.00111Cr 2 D0 03 bne L3376 00.00111Er 2 4C rr rr jmp MOVE_HIGHEST_STRING_TO_TOP 00.001121r 2 L3376: 00.001121r 2 85 6F sta INDEX 00.001123r 2 86 70 stx INDEX+1 00.001125r 2 .ifdef CONFIG_SMALL 00.001125r 2 ldy #$01 00.001125r 2 .else 00.001125r 2 A0 00 ldy #$00 00.001127r 2 B1 6F lda (INDEX),y 00.001129r 2 AA tax 00.00112Ar 2 C8 iny 00.00112Br 2 .endif 00.00112Br 2 B1 6F lda (INDEX),y 00.00112Dr 2 08 php 00.00112Er 2 C8 iny 00.00112Fr 2 B1 6F lda (INDEX),y 00.001131r 2 65 A5 adc HIGHDS 00.001133r 2 85 A5 sta HIGHDS 00.001135r 2 C8 iny 00.001136r 2 B1 6F lda (INDEX),y 00.001138r 2 65 A6 adc HIGHDS+1 00.00113Ar 2 85 A6 sta HIGHDS+1 00.00113Cr 2 28 plp 00.00113Dr 2 10 D3 bpl L3367 00.00113Fr 2 .ifndef CONFIG_SMALL 00.00113Fr 2 8A txa 00.001140r 2 30 D0 bmi L3367 00.001142r 2 .endif 00.001142r 2 C8 iny 00.001143r 2 B1 6F lda (INDEX),y 00.001145r 2 .ifdef CONFIG_CBM1_PATCHES 00.001145r 2 jsr LE7F3 ; XXX patch, call into screen editor 00.001145r 2 .else 00.001145r 2 .ifdef CONFIG_11 00.001145r 2 A0 00 ldy #$00 ; GC bugfix 00.001147r 2 .endif 00.001147r 2 0A asl a 00.001148r 2 69 05 adc #$05 00.00114Ar 2 .endif 00.00114Ar 2 65 6F adc INDEX 00.00114Cr 2 85 6F sta INDEX 00.00114Er 2 90 02 bcc L33A7 00.001150r 2 E6 70 inc INDEX+1 00.001152r 2 L33A7: 00.001152r 2 A6 70 ldx INDEX+1 00.001154r 2 L33A9: 00.001154r 2 E4 A6 cpx HIGHDS+1 00.001156r 2 D0 04 bne L33B1 00.001158r 2 C5 A5 cmp HIGHDS 00.00115Ar 2 F0 BA beq L336B 00.00115Cr 2 L33B1: 00.00115Cr 2 20 rr rr jsr CHECK_VARIABLE 00.00115Fr 2 F0 F3 beq L33A9 00.001161r 2 00.001161r 2 ; ---------------------------------------------------------------------------- 00.001161r 2 ; PROCESS A SIMPLE VARIABLE 00.001161r 2 ; ---------------------------------------------------------------------------- 00.001161r 2 CHECK_SIMPLE_VARIABLE: 00.001161r 2 .ifndef CONFIG_SMALL 00.001161r 2 B1 6F lda (INDEX),y 00.001163r 2 30 35 bmi CHECK_BUMP 00.001165r 2 .endif 00.001165r 2 C8 iny 00.001166r 2 B1 6F lda (INDEX),y 00.001168r 2 10 30 bpl CHECK_BUMP 00.00116Ar 2 C8 iny 00.00116Br 2 00.00116Br 2 ; ---------------------------------------------------------------------------- 00.00116Br 2 ; IF STRING IS NOT EMPTY, CHECK IF IT IS HIGHEST 00.00116Br 2 ; ---------------------------------------------------------------------------- 00.00116Br 2 CHECK_VARIABLE: 00.00116Br 2 B1 6F lda (INDEX),y 00.00116Dr 2 F0 2B beq CHECK_BUMP 00.00116Fr 2 C8 iny 00.001170r 2 B1 6F lda (INDEX),y 00.001172r 2 AA tax 00.001173r 2 C8 iny 00.001174r 2 B1 6F lda (INDEX),y 00.001176r 2 C5 81 cmp FRETOP+1 00.001178r 2 90 06 bcc L33D5 00.00117Ar 2 D0 1E bne CHECK_BUMP 00.00117Cr 2 E4 80 cpx FRETOP 00.00117Er 2 B0 1A bcs CHECK_BUMP 00.001180r 2 L33D5: 00.001180r 2 C5 AD cmp LOWTR+1 00.001182r 2 90 16 bcc CHECK_BUMP 00.001184r 2 D0 04 bne L33DF 00.001186r 2 E4 AC cpx LOWTR 00.001188r 2 90 10 bcc CHECK_BUMP 00.00118Ar 2 L33DF: 00.00118Ar 2 86 AC stx LOWTR 00.00118Cr 2 85 AD sta LOWTR+1 00.00118Er 2 A5 6F lda INDEX 00.001190r 2 A6 70 ldx INDEX+1 00.001192r 2 85 9B sta FNCNAM 00.001194r 2 86 9C stx FNCNAM+1 00.001196r 2 A5 A0 lda DSCLEN 00.001198r 2 85 A2 sta Z52 00.00119Ar 2 00.00119Ar 2 ; ---------------------------------------------------------------------------- 00.00119Ar 2 ; ADD (DSCLEN) TO PNTR IN INDEX 00.00119Ar 2 ; RETURN WITH Y=0, PNTR ALSO IN X,A 00.00119Ar 2 ; ---------------------------------------------------------------------------- 00.00119Ar 2 CHECK_BUMP: 00.00119Ar 2 A5 A0 lda DSCLEN 00.00119Cr 2 18 clc 00.00119Dr 2 65 6F adc INDEX 00.00119Fr 2 85 6F sta INDEX 00.0011A1r 2 90 02 bcc L33FA 00.0011A3r 2 E6 70 inc INDEX+1 00.0011A5r 2 L33FA: 00.0011A5r 2 A6 70 ldx INDEX+1 00.0011A7r 2 A0 00 ldy #$00 00.0011A9r 2 60 rts 00.0011AAr 2 00.0011AAr 2 ; ---------------------------------------------------------------------------- 00.0011AAr 2 ; FOUND HIGHEST NON-EMPTY STRING, SO MOVE IT 00.0011AAr 2 ; TO TOP AND GO BACK FOR ANOTHER 00.0011AAr 2 ; ---------------------------------------------------------------------------- 00.0011AAr 2 MOVE_HIGHEST_STRING_TO_TOP: 00.0011AAr 2 .ifdef CONFIG_2 00.0011AAr 2 lda FNCNAM+1 ; GC bugfix 00.0011AAr 2 ora FNCNAM 00.0011AAr 2 .else 00.0011AAr 2 A6 9C ldx FNCNAM+1 00.0011ACr 2 .endif 00.0011ACr 2 F0 F7 beq L33FA 00.0011AEr 2 A5 A2 lda Z52 00.0011B0r 2 .ifndef CONFIG_10A 00.0011B0r 2 sbc #$03 00.0011B0r 2 .else 00.0011B0r 2 29 04 and #$04 00.0011B2r 2 .endif 00.0011B2r 2 4A lsr a 00.0011B3r 2 A8 tay 00.0011B4r 2 85 A2 sta Z52 00.0011B6r 2 B1 9B lda (FNCNAM),y 00.0011B8r 2 65 AC adc LOWTR 00.0011BAr 2 85 A7 sta HIGHTR 00.0011BCr 2 A5 AD lda LOWTR+1 00.0011BEr 2 69 00 adc #$00 00.0011C0r 2 85 A8 sta HIGHTR+1 00.0011C2r 2 A5 80 lda FRETOP 00.0011C4r 2 A6 81 ldx FRETOP+1 00.0011C6r 2 85 A5 sta HIGHDS 00.0011C8r 2 86 A6 stx HIGHDS+1 00.0011CAr 2 20 rr rr jsr BLTU2 00.0011CDr 2 A4 A2 ldy Z52 00.0011CFr 2 C8 iny 00.0011D0r 2 A5 A5 lda HIGHDS 00.0011D2r 2 91 9B sta (FNCNAM),y 00.0011D4r 2 AA tax 00.0011D5r 2 E6 A6 inc HIGHDS+1 00.0011D7r 2 A5 A6 lda HIGHDS+1 00.0011D9r 2 C8 iny 00.0011DAr 2 91 9B sta (FNCNAM),y 00.0011DCr 2 4C rr rr jmp FINDHIGHESTSTRING 00.0011DFr 2 00.0011DFr 2 ; ---------------------------------------------------------------------------- 00.0011DFr 2 ; CONCATENATE TWO STRINGS 00.0011DFr 2 ; ---------------------------------------------------------------------------- 00.0011DFr 2 CAT: 00.0011DFr 2 A5 B2 lda FAC_LAST 00.0011E1r 2 48 pha 00.0011E2r 2 A5 B1 lda FAC_LAST-1 00.0011E4r 2 48 pha 00.0011E5r 2 20 rr rr jsr FRM_ELEMENT 00.0011E8r 2 20 rr rr jsr CHKSTR 00.0011EBr 2 68 pla 00.0011ECr 2 85 BC sta STRNG1 00.0011EEr 2 68 pla 00.0011EFr 2 85 BD sta STRNG1+1 00.0011F1r 2 A0 00 ldy #$00 00.0011F3r 2 B1 BC lda (STRNG1),y 00.0011F5r 2 18 clc 00.0011F6r 2 71 B1 adc (FAC_LAST-1),y 00.0011F8r 2 90 05 bcc L3454 00.0011FAr 2 A2 B0 ldx #ERR_STRLONG 00.0011FCr 2 4C rr rr jmp ERROR 00.0011FFr 2 L3454: 00.0011FFr 2 20 rr rr jsr STRINI 00.001202r 2 20 rr rr jsr MOVINS 00.001205r 2 A5 9D lda DSCPTR 00.001207r 2 A4 9E ldy DSCPTR+1 00.001209r 2 20 rr rr jsr FRETMP 00.00120Cr 2 20 rr rr jsr MOVSTR1 00.00120Fr 2 A5 BC lda STRNG1 00.001211r 2 A4 BD ldy STRNG1+1 00.001213r 2 20 rr rr jsr FRETMP 00.001216r 2 20 rr rr jsr PUTNEW 00.001219r 2 4C rr rr jmp FRMEVL2 00.00121Cr 2 00.00121Cr 2 ; ---------------------------------------------------------------------------- 00.00121Cr 2 ; GET STRING DESCRIPTOR POINTED AT BY (STRNG1) 00.00121Cr 2 ; AND MOVE DESCRIBED STRING TO (FRESPC) 00.00121Cr 2 ; ---------------------------------------------------------------------------- 00.00121Cr 2 MOVINS: 00.00121Cr 2 A0 00 ldy #$00 00.00121Er 2 B1 BC lda (STRNG1),y 00.001220r 2 48 pha 00.001221r 2 C8 iny 00.001222r 2 B1 BC lda (STRNG1),y 00.001224r 2 AA tax 00.001225r 2 C8 iny 00.001226r 2 B1 BC lda (STRNG1),y 00.001228r 2 A8 tay 00.001229r 2 68 pla 00.00122Ar 2 00.00122Ar 2 ; ---------------------------------------------------------------------------- 00.00122Ar 2 ; MOVE STRING AT (Y,X) WITH LENGTH (A) 00.00122Ar 2 ; TO DESTINATION WHOSE ADDRESS IS IN FRESPC,FRESPC+1 00.00122Ar 2 ; ---------------------------------------------------------------------------- 00.00122Ar 2 MOVSTR: 00.00122Ar 2 86 6F stx INDEX 00.00122Cr 2 84 70 sty INDEX+1 00.00122Er 2 MOVSTR1: 00.00122Er 2 A8 tay 00.00122Fr 2 F0 0A beq L3490 00.001231r 2 48 pha 00.001232r 2 L3487: 00.001232r 2 88 dey 00.001233r 2 B1 6F lda (INDEX),y 00.001235r 2 91 82 sta (FRESPC),y 00.001237r 2 98 tya 00.001238r 2 D0 F8 bne L3487 00.00123Ar 2 68 pla 00.00123Br 2 L3490: 00.00123Br 2 18 clc 00.00123Cr 2 65 82 adc FRESPC 00.00123Er 2 85 82 sta FRESPC 00.001240r 2 90 02 bcc L3499 00.001242r 2 E6 83 inc FRESPC+1 00.001244r 2 L3499: 00.001244r 2 60 rts 00.001245r 2 00.001245r 2 ; ---------------------------------------------------------------------------- 00.001245r 2 ; IF (FAC) IS A TEMPORARY STRING, RELEASE DESCRIPTOR 00.001245r 2 ; ---------------------------------------------------------------------------- 00.001245r 2 FRESTR: 00.001245r 2 20 rr rr jsr CHKSTR 00.001248r 2 00.001248r 2 ; ---------------------------------------------------------------------------- 00.001248r 2 ; IF STRING DESCRIPTOR POINTED TO BY FAC+3,4 IS 00.001248r 2 ; A TEMPORARY STRING, RELEASE IT. 00.001248r 2 ; ---------------------------------------------------------------------------- 00.001248r 2 FREFAC: 00.001248r 2 A5 B1 lda FAC_LAST-1 00.00124Ar 2 A4 B2 ldy FAC_LAST 00.00124Cr 2 00.00124Cr 2 ; ---------------------------------------------------------------------------- 00.00124Cr 2 ; IF STRING DESCRIPTOR WHOSE ADDRESS IS IN Y,A IS 00.00124Cr 2 ; A TEMPORARY STRING, RELEASE IT. 00.00124Cr 2 ; ---------------------------------------------------------------------------- 00.00124Cr 2 FRETMP: 00.00124Cr 2 85 6F sta INDEX 00.00124Er 2 84 70 sty INDEX+1 00.001250r 2 20 rr rr jsr FRETMS 00.001253r 2 08 php 00.001254r 2 A0 00 ldy #$00 00.001256r 2 B1 6F lda (INDEX),y 00.001258r 2 48 pha 00.001259r 2 C8 iny 00.00125Ar 2 B1 6F lda (INDEX),y 00.00125Cr 2 AA tax 00.00125Dr 2 C8 iny 00.00125Er 2 B1 6F lda (INDEX),y 00.001260r 2 A8 tay 00.001261r 2 68 pla 00.001262r 2 28 plp 00.001263r 2 D0 13 bne L34CD 00.001265r 2 C4 81 cpy FRETOP+1 00.001267r 2 D0 0F bne L34CD 00.001269r 2 E4 80 cpx FRETOP 00.00126Br 2 D0 0B bne L34CD 00.00126Dr 2 48 pha 00.00126Er 2 18 clc 00.00126Fr 2 65 80 adc FRETOP 00.001271r 2 85 80 sta FRETOP 00.001273r 2 90 02 bcc L34CC 00.001275r 2 E6 81 inc FRETOP+1 00.001277r 2 L34CC: 00.001277r 2 68 pla 00.001278r 2 L34CD: 00.001278r 2 86 6F stx INDEX 00.00127Ar 2 84 70 sty INDEX+1 00.00127Cr 2 60 rts 00.00127Dr 2 00.00127Dr 2 ; ---------------------------------------------------------------------------- 00.00127Dr 2 ; RELEASE TEMPORARY DESCRIPTOR IF Y,A = LASTPT 00.00127Dr 2 ; ---------------------------------------------------------------------------- 00.00127Dr 2 FRETMS: 00.00127Dr 2 .ifdef KBD 00.00127Dr 2 cpy #$00 00.00127Dr 2 .else 00.00127Dr 2 C4 65 cpy LASTPT+1 00.00127Fr 2 .endif 00.00127Fr 2 D0 0C bne L34E2 00.001281r 2 C5 64 cmp LASTPT 00.001283r 2 D0 08 bne L34E2 00.001285r 2 85 63 sta TEMPPT 00.001287r 2 E9 03 sbc #$03 00.001289r 2 85 64 sta LASTPT 00.00128Br 2 A0 00 ldy #$00 00.00128Dr 2 L34E2: 00.00128Dr 2 60 rts 00.00128Er 2 00.00128Er 2 ; ---------------------------------------------------------------------------- 00.00128Er 2 ; "CHR$" FUNCTION 00.00128Er 2 ; ---------------------------------------------------------------------------- 00.00128Er 2 CHRSTR: 00.00128Er 2 20 rr rr jsr CONINT 00.001291r 2 8A txa 00.001292r 2 48 pha 00.001293r 2 A9 01 lda #$01 00.001295r 2 20 rr rr jsr STRSPA 00.001298r 2 68 pla 00.001299r 2 A0 00 ldy #$00 00.00129Br 2 91 AF sta (FAC+1),y 00.00129Dr 2 68 pla 00.00129Er 2 68 pla 00.00129Fr 2 4C rr rr jmp PUTNEW 00.0012A2r 2 00.0012A2r 2 ; ---------------------------------------------------------------------------- 00.0012A2r 2 ; "LEFT$" FUNCTION 00.0012A2r 2 ; ---------------------------------------------------------------------------- 00.0012A2r 2 LEFTSTR: 00.0012A2r 2 20 rr rr jsr SUBSTRING_SETUP 00.0012A5r 2 D1 9D cmp (DSCPTR),y 00.0012A7r 2 98 tya 00.0012A8r 2 SUBSTRING1: 00.0012A8r 2 90 04 bcc L3503 00.0012AAr 2 B1 9D lda (DSCPTR),y 00.0012ACr 2 AA tax 00.0012ADr 2 98 tya 00.0012AEr 2 L3503: 00.0012AEr 2 48 pha 00.0012AFr 2 SUBSTRING2: 00.0012AFr 2 8A txa 00.0012B0r 2 SUBSTRING3: 00.0012B0r 2 48 pha 00.0012B1r 2 20 rr rr jsr STRSPA 00.0012B4r 2 A5 9D lda DSCPTR 00.0012B6r 2 A4 9E ldy DSCPTR+1 00.0012B8r 2 20 rr rr jsr FRETMP 00.0012BBr 2 68 pla 00.0012BCr 2 A8 tay 00.0012BDr 2 68 pla 00.0012BEr 2 18 clc 00.0012BFr 2 65 6F adc INDEX 00.0012C1r 2 85 6F sta INDEX 00.0012C3r 2 90 02 bcc L351C 00.0012C5r 2 E6 70 inc INDEX+1 00.0012C7r 2 L351C: 00.0012C7r 2 98 tya 00.0012C8r 2 20 rr rr jsr MOVSTR1 00.0012CBr 2 4C rr rr jmp PUTNEW 00.0012CEr 2 00.0012CEr 2 ; ---------------------------------------------------------------------------- 00.0012CEr 2 ; "RIGHT$" FUNCTION 00.0012CEr 2 ; ---------------------------------------------------------------------------- 00.0012CEr 2 RIGHTSTR: 00.0012CEr 2 20 rr rr jsr SUBSTRING_SETUP 00.0012D1r 2 18 clc 00.0012D2r 2 F1 9D sbc (DSCPTR),y 00.0012D4r 2 49 FF eor #$FF 00.0012D6r 2 4C rr rr jmp SUBSTRING1 00.0012D9r 2 00.0012D9r 2 ; ---------------------------------------------------------------------------- 00.0012D9r 2 ; "MID$" FUNCTION 00.0012D9r 2 ; ---------------------------------------------------------------------------- 00.0012D9r 2 MIDSTR: 00.0012D9r 2 A9 FF lda #$FF 00.0012DBr 2 85 B2 sta FAC_LAST 00.0012DDr 2 20 C6 00 jsr CHRGOT 00.0012E0r 2 C9 29 cmp #$29 00.0012E2r 2 F0 06 beq L353F 00.0012E4r 2 20 rr rr jsr CHKCOM 00.0012E7r 2 20 rr rr jsr GETBYT 00.0012EAr 2 L353F: 00.0012EAr 2 20 rr rr jsr SUBSTRING_SETUP 00.0012EDr 2 .ifdef CONFIG_2 00.0012EDr 2 beq GOIQ 00.0012EDr 2 .endif 00.0012EDr 2 CA dex 00.0012EEr 2 8A txa 00.0012EFr 2 48 pha 00.0012F0r 2 18 clc 00.0012F1r 2 A2 00 ldx #$00 00.0012F3r 2 F1 9D sbc (DSCPTR),y 00.0012F5r 2 B0 B8 bcs SUBSTRING2 00.0012F7r 2 49 FF eor #$FF 00.0012F9r 2 C5 B2 cmp FAC_LAST 00.0012FBr 2 90 B3 bcc SUBSTRING3 00.0012FDr 2 A5 B2 lda FAC_LAST 00.0012FFr 2 B0 AF bcs SUBSTRING3 00.001301r 2 00.001301r 2 ; ---------------------------------------------------------------------------- 00.001301r 2 ; COMMON SETUP ROUTINE FOR LEFT$, RIGHT$, MID$: 00.001301r 2 ; REQUIRE ")"; POP RETURN ADRS, GET DESCRIPTOR 00.001301r 2 ; ADDRESS, GET 1ST PARAMETER OF COMMAND 00.001301r 2 ; ---------------------------------------------------------------------------- 00.001301r 2 SUBSTRING_SETUP: 00.001301r 2 20 rr rr jsr CHKCLS 00.001304r 2 68 pla 00.001305r 2 .ifndef CONFIG_11 00.001305r 2 sta JMPADRS+1 00.001305r 2 pla 00.001305r 2 sta JMPADRS+2 00.001305r 2 .else 00.001305r 2 A8 tay 00.001306r 2 68 pla 00.001307r 2 85 A2 sta Z52 00.001309r 2 .endif 00.001309r 2 68 pla 00.00130Ar 2 68 pla 00.00130Br 2 68 pla 00.00130Cr 2 AA tax 00.00130Dr 2 68 pla 00.00130Er 2 85 9D sta DSCPTR 00.001310r 2 68 pla 00.001311r 2 85 9E sta DSCPTR+1 00.001313r 2 .ifdef CONFIG_11 00.001313r 2 A5 A2 lda Z52 00.001315r 2 48 pha 00.001316r 2 98 tya 00.001317r 2 48 pha 00.001318r 2 .endif 00.001318r 2 A0 00 ldy #$00 00.00131Ar 2 8A txa 00.00131Br 2 .ifndef CONFIG_2 00.00131Br 2 F0 1D beq GOIQ 00.00131Dr 2 .endif 00.00131Dr 2 .ifndef CONFIG_11 00.00131Dr 2 inc JMPADRS+1 00.00131Dr 2 jmp (JMPADRS+1) 00.00131Dr 2 .else 00.00131Dr 2 60 rts 00.00131Er 2 .endif 00.00131Er 2 00.00131Er 2 ; ---------------------------------------------------------------------------- 00.00131Er 2 ; "LEN" FUNCTION 00.00131Er 2 ; ---------------------------------------------------------------------------- 00.00131Er 2 LEN: 00.00131Er 2 20 rr rr jsr GETSTR 00.001321r 2 SNGFLT1: 00.001321r 2 4C rr rr jmp SNGFLT 00.001324r 2 00.001324r 2 ; ---------------------------------------------------------------------------- 00.001324r 2 ; IF LAST RESULT IS A TEMPORARY STRING, FREE IT 00.001324r 2 ; MAKE VALTYP NUMERIC, RETURN LENGTH IN Y-REG 00.001324r 2 ; ---------------------------------------------------------------------------- 00.001324r 2 GETSTR: 00.001324r 2 20 rr rr jsr FRESTR 00.001327r 2 A2 00 ldx #$00 00.001329r 2 86 0E stx VALTYP 00.00132Br 2 A8 tay 00.00132Cr 2 60 rts 00.00132Dr 2 00.00132Dr 2 ; ---------------------------------------------------------------------------- 00.00132Dr 2 ; "ASC" FUNCTION 00.00132Dr 2 ; ---------------------------------------------------------------------------- 00.00132Dr 2 ASC: 00.00132Dr 2 20 rr rr jsr GETSTR 00.001330r 2 F0 08 beq GOIQ 00.001332r 2 A0 00 ldy #$00 00.001334r 2 B1 6F lda (INDEX),y 00.001336r 2 A8 tay 00.001337r 2 .ifndef CONFIG_11A 00.001337r 2 jmp SNGFLT1 00.001337r 2 .else 00.001337r 2 4C rr rr jmp SNGFLT 00.00133Ar 2 .endif 00.00133Ar 2 ; ---------------------------------------------------------------------------- 00.00133Ar 2 GOIQ: 00.00133Ar 2 4C rr rr jmp IQERR 00.00133Dr 2 00.00133Dr 2 ; ---------------------------------------------------------------------------- 00.00133Dr 2 ; SCAN TO NEXT CHARACTER AND CONVERT EXPRESSION 00.00133Dr 2 ; TO SINGLE BYTE IN X-REG 00.00133Dr 2 ; ---------------------------------------------------------------------------- 00.00133Dr 2 GTBYTC: 00.00133Dr 2 20 C0 00 jsr CHRGET 00.001340r 2 00.001340r 2 ; ---------------------------------------------------------------------------- 00.001340r 2 ; EVALUATE EXPRESSION AT TXTPTR, AND 00.001340r 2 ; CONVERT IT TO SINGLE BYTE IN X-REG 00.001340r 2 ; ---------------------------------------------------------------------------- 00.001340r 2 GETBYT: 00.001340r 2 20 rr rr jsr FRMNUM 00.001343r 2 00.001343r 2 ; ---------------------------------------------------------------------------- 00.001343r 2 ; CONVERT (FAC) TO SINGLE BYTE INTEGER IN X-REG 00.001343r 2 ; ---------------------------------------------------------------------------- 00.001343r 2 CONINT: 00.001343r 2 20 rr rr jsr MKINT 00.001346r 2 A6 B1 ldx FAC_LAST-1 00.001348r 2 D0 F0 bne GOIQ 00.00134Ar 2 A6 B2 ldx FAC_LAST 00.00134Cr 2 4C C6 00 jmp CHRGOT 00.00134Fr 2 00.00134Fr 2 ; ---------------------------------------------------------------------------- 00.00134Fr 2 ; "VAL" FUNCTION 00.00134Fr 2 ; ---------------------------------------------------------------------------- 00.00134Fr 2 VAL: 00.00134Fr 2 20 rr rr jsr GETSTR 00.001352r 2 D0 03 bne L35AC 00.001354r 2 4C rr rr jmp ZERO_FAC 00.001357r 2 L35AC: 00.001357r 2 A6 C7 ldx TXTPTR 00.001359r 2 A4 C8 ldy TXTPTR+1 00.00135Br 2 86 BE stx STRNG2 00.00135Dr 2 84 BF sty STRNG2+1 00.00135Fr 2 A6 6F ldx INDEX 00.001361r 2 86 C7 stx TXTPTR 00.001363r 2 18 clc 00.001364r 2 65 6F adc INDEX 00.001366r 2 85 71 sta DEST 00.001368r 2 A6 70 ldx INDEX+1 00.00136Ar 2 86 C8 stx TXTPTR+1 00.00136Cr 2 90 01 bcc L35C4 00.00136Er 2 E8 inx 00.00136Fr 2 L35C4: 00.00136Fr 2 86 72 stx DEST+1 00.001371r 2 A0 00 ldy #$00 00.001373r 2 B1 71 lda (DEST),y 00.001375r 2 48 pha 00.001376r 2 A9 00 lda #$00 00.001378r 2 91 71 sta (DEST),y 00.00137Ar 2 20 C6 00 jsr CHRGOT 00.00137Dr 2 20 rr rr jsr FIN 00.001380r 2 68 pla 00.001381r 2 A0 00 ldy #$00 00.001383r 2 91 71 sta (DEST),y 00.001385r 2 00.001385r 2 ; ---------------------------------------------------------------------------- 00.001385r 2 ; COPY STRNG2 INTO TXTPTR 00.001385r 2 ; ---------------------------------------------------------------------------- 00.001385r 2 POINT: 00.001385r 2 A6 BE ldx STRNG2 00.001387r 2 A4 BF ldy STRNG2+1 00.001389r 2 86 C7 stx TXTPTR 00.00138Br 2 84 C8 sty TXTPTR+1 00.00138Dr 2 60 rts 00.00138Er 2 00.00138Er 2 00.00138Er 1 .include "misc3.s" 00.00138Er 2 ; KBD specific patches 00.00138Er 2 00.00138Er 2 .segment "CODE" 00.00138Er 2 00.00138Er 2 .ifdef KBD 00.00138Er 2 VARTAB_MINUS_2_TO_AY: 00.00138Er 2 lda VARTAB 00.00138Er 2 sec 00.00138Er 2 sbc #$02 00.00138Er 2 ldy VARTAB+1 00.00138Er 2 bcs LF42C 00.00138Er 2 dey 00.00138Er 2 LF42C: 00.00138Er 2 rts 00.00138Er 2 00.00138Er 2 ; ---------------------------------------------------------------------------- 00.00138Er 2 GET_UPPER: 00.00138Er 2 lda INPUTBUFFERX,x 00.00138Er 2 LF430: 00.00138Er 2 cmp #'a' 00.00138Er 2 bcc LF43A 00.00138Er 2 cmp #'z'+1 00.00138Er 2 bcs LF43A 00.00138Er 2 LF438: 00.00138Er 2 sbc #$1F 00.00138Er 2 LF43A: 00.00138Er 2 rts 00.00138Er 2 00.00138Er 2 ; ---------------------------------------------------------------------------- 00.00138Er 2 GETLN: 00.00138Er 2 ldx #$5D 00.00138Er 2 LF43D: 00.00138Er 2 txa 00.00138Er 2 and #$7F 00.00138Er 2 cmp $0340 00.00138Er 2 beq LF44D 00.00138Er 2 sta $0340 00.00138Er 2 lda #$03 00.00138Er 2 jsr LDE48 00.00138Er 2 LF44D: 00.00138Er 2 jsr LDE7F 00.00138Er 2 bne RTS4 00.00138Er 2 cpx #$80 00.00138Er 2 bcc LF44D 00.00138Er 2 RTS4: 00.00138Er 2 rts 00.00138Er 2 00.00138Er 2 ; ---------------------------------------------------------------------------- 00.00138Er 2 LF457: 00.00138Er 2 lda TXTTAB 00.00138Er 2 ldx TXTTAB+1 00.00138Er 2 LF45B: 00.00138Er 2 sta JMPADRS+1 00.00138Er 2 stx JMPADRS+2 00.00138Er 2 ldy #$01 00.00138Er 2 lda (JMPADRS+1),y 00.00138Er 2 beq LF438 00.00138Er 2 iny 00.00138Er 2 iny 00.00138Er 2 lda (JMPADRS+1),y 00.00138Er 2 dey 00.00138Er 2 cmp LINNUM+1 00.00138Er 2 bne LF472 00.00138Er 2 lda (JMPADRS+1),y 00.00138Er 2 cmp LINNUM 00.00138Er 2 LF472: 00.00138Er 2 bcs LF43A 00.00138Er 2 dey 00.00138Er 2 lda (JMPADRS+1),y 00.00138Er 2 tax 00.00138Er 2 dey 00.00138Er 2 lda (JMPADRS+1),y 00.00138Er 2 bcc LF45B 00.00138Er 2 LF47D: 00.00138Er 2 jmp (JMPADRS+1) 00.00138Er 2 .endif 00.00138Er 2 00.00138Er 1 .include "poke.s" 00.00138Er 2 .segment "CODE" 00.00138Er 2 00.00138Er 2 .ifndef CONFIG_NO_POKE 00.00138Er 2 ; ---------------------------------------------------------------------------- 00.00138Er 2 ; EVALUATE "EXP1,EXP2" 00.00138Er 2 ; 00.00138Er 2 ; CONVERT EXP1 TO 16-BIT NUMBER IN LINNUM 00.00138Er 2 ; CONVERT EXP2 TO 8-BIT NUMBER IN X-REG 00.00138Er 2 ; ---------------------------------------------------------------------------- 00.00138Er 2 GTNUM: 00.00138Er 2 20 rr rr jsr FRMNUM 00.001391r 2 20 rr rr jsr GETADR 00.001394r 2 00.001394r 2 ; ---------------------------------------------------------------------------- 00.001394r 2 ; EVALUATE ",EXPRESSION" 00.001394r 2 ; CONVERT EXPRESSION TO SINGLE BYTE IN X-REG 00.001394r 2 ; ---------------------------------------------------------------------------- 00.001394r 2 COMBYTE: 00.001394r 2 20 rr rr jsr CHKCOM 00.001397r 2 4C rr rr jmp GETBYT 00.00139Ar 2 00.00139Ar 2 ; ---------------------------------------------------------------------------- 00.00139Ar 2 ; CONVERT (FAC) TO A 16-BIT VALUE IN LINNUM 00.00139Ar 2 ; ---------------------------------------------------------------------------- 00.00139Ar 2 GETADR: 00.00139Ar 2 A5 B3 lda FACSIGN 00.00139Cr 2 .ifdef APPLE 00.00139Cr 2 nop ; PATCH 00.00139Cr 2 nop 00.00139Cr 2 .else 00.00139Cr 2 30 9C bmi GOIQ 00.00139Er 2 .endif 00.00139Er 2 A5 AE lda FAC 00.0013A0r 2 C9 91 cmp #$91 00.0013A2r 2 B0 96 bcs GOIQ 00.0013A4r 2 20 rr rr jsr QINT 00.0013A7r 2 A5 B1 lda FAC_LAST-1 00.0013A9r 2 A4 B2 ldy FAC_LAST 00.0013ABr 2 84 19 sty LINNUM 00.0013ADr 2 85 1A sta LINNUM+1 00.0013AFr 2 60 rts 00.0013B0r 2 00.0013B0r 2 ; ---------------------------------------------------------------------------- 00.0013B0r 2 ; "PEEK" FUNCTION 00.0013B0r 2 ; ---------------------------------------------------------------------------- 00.0013B0r 2 PEEK: 00.0013B0r 2 .ifdef CONFIG_PEEK_SAVE_LINNUM 00.0013B0r 2 lda LINNUM+1 00.0013B0r 2 pha 00.0013B0r 2 lda LINNUM 00.0013B0r 2 pha 00.0013B0r 2 .endif 00.0013B0r 2 20 rr rr jsr GETADR 00.0013B3r 2 A0 00 ldy #$00 00.0013B5r 2 .ifdef CBM1 00.0013B5r 2 ; disallow PEEK between $C000 and $DFFF 00.0013B5r 2 cmp #$C0 00.0013B5r 2 bcc LD6F3 00.0013B5r 2 cmp #$E1 00.0013B5r 2 bcc LD6F6 00.0013B5r 2 LD6F3: 00.0013B5r 2 .endif 00.0013B5r 2 .ifdef CBM2 00.0013B5r 2 nop ; patch that disables the compares above 00.0013B5r 2 nop 00.0013B5r 2 nop 00.0013B5r 2 nop 00.0013B5r 2 nop 00.0013B5r 2 nop 00.0013B5r 2 nop 00.0013B5r 2 nop 00.0013B5r 2 .endif 00.0013B5r 2 B1 19 lda (LINNUM),y 00.0013B7r 2 A8 tay 00.0013B8r 2 .ifdef CONFIG_PEEK_SAVE_LINNUM 00.0013B8r 2 pla 00.0013B8r 2 sta LINNUM 00.0013B8r 2 pla 00.0013B8r 2 sta LINNUM+1 00.0013B8r 2 .endif 00.0013B8r 2 LD6F6: 00.0013B8r 2 4C rr rr jmp SNGFLT 00.0013BBr 2 00.0013BBr 2 ; ---------------------------------------------------------------------------- 00.0013BBr 2 ; "POKE" STATEMENT 00.0013BBr 2 ; ---------------------------------------------------------------------------- 00.0013BBr 2 POKE: 00.0013BBr 2 20 rr rr jsr GTNUM 00.0013BEr 2 8A txa 00.0013BFr 2 A0 00 ldy #$00 00.0013C1r 2 91 19 sta (LINNUM),y 00.0013C3r 2 60 rts 00.0013C4r 2 00.0013C4r 2 ; ---------------------------------------------------------------------------- 00.0013C4r 2 ; "WAIT" STATEMENT 00.0013C4r 2 ; ---------------------------------------------------------------------------- 00.0013C4r 2 WAIT: 00.0013C4r 2 20 rr rr jsr GTNUM 00.0013C7r 2 86 96 stx FORPNT 00.0013C9r 2 A2 00 ldx #$00 00.0013CBr 2 20 C6 00 jsr CHRGOT 00.0013CEr 2 .ifdef CONFIG_EASTER_EGG 00.0013CEr 2 beq EASTER_EGG 00.0013CEr 2 .else 00.0013CEr 2 F0 03 beq L3628 00.0013D0r 2 .endif 00.0013D0r 2 20 rr rr jsr COMBYTE 00.0013D3r 2 L3628: 00.0013D3r 2 86 97 stx FORPNT+1 00.0013D5r 2 A0 00 ldy #$00 00.0013D7r 2 L362C: 00.0013D7r 2 B1 19 lda (LINNUM),y 00.0013D9r 2 45 97 eor FORPNT+1 00.0013DBr 2 25 96 and FORPNT 00.0013DDr 2 F0 F8 beq L362C 00.0013DFr 2 RTS3: 00.0013DFr 2 60 rts 00.0013E0r 2 .endif ; KBD 00.0013E0r 2 00.0013E0r 1 .include "float.s" 00.0013E0r 2 .segment "CODE" 00.0013E0r 2 00.0013E0r 2 TEMP1X = TEMP1+(5-BYTES_FP) 00.0013E0r 2 00.0013E0r 2 ; ---------------------------------------------------------------------------- 00.0013E0r 2 ; ADD 0.5 TO FAC 00.0013E0r 2 ; ---------------------------------------------------------------------------- 00.0013E0r 2 FADDH: 00.0013E0r 2 A9 rr lda #CON_HALF 00.0013E4r 2 4C rr rr jmp FADD 00.0013E7r 2 00.0013E7r 2 ; ---------------------------------------------------------------------------- 00.0013E7r 2 ; FAC = (Y,A) - FAC 00.0013E7r 2 ; ---------------------------------------------------------------------------- 00.0013E7r 2 FSUB: 00.0013E7r 2 20 rr rr jsr LOAD_ARG_FROM_YA 00.0013EAr 2 00.0013EAr 2 ; ---------------------------------------------------------------------------- 00.0013EAr 2 ; FAC = ARG - FAC 00.0013EAr 2 ; ---------------------------------------------------------------------------- 00.0013EAr 2 FSUBT: 00.0013EAr 2 A5 B3 lda FACSIGN 00.0013ECr 2 49 FF eor #$FF 00.0013EEr 2 85 B3 sta FACSIGN 00.0013F0r 2 45 BB eor ARGSIGN 00.0013F2r 2 85 BC sta SGNCPR 00.0013F4r 2 A5 AE lda FAC 00.0013F6r 2 4C rr rr jmp FADDT 00.0013F9r 2 00.0013F9r 2 ; ---------------------------------------------------------------------------- 00.0013F9r 2 ; Commodore BASIC V2 Easter Egg 00.0013F9r 2 ; ---------------------------------------------------------------------------- 00.0013F9r 2 .ifdef CONFIG_EASTER_EGG 00.0013F9r 2 EASTER_EGG: 00.0013F9r 2 lda LINNUM 00.0013F9r 2 cmp #<6502 00.0013F9r 2 bne L3628 00.0013F9r 2 lda LINNUM+1 00.0013F9r 2 sbc #>6502 00.0013F9r 2 bne L3628 00.0013F9r 2 sta LINNUM 00.0013F9r 2 tay 00.0013F9r 2 lda #$80 00.0013F9r 2 sta LINNUM+1 00.0013F9r 2 LD758: 00.0013F9r 2 ldx #$0A 00.0013F9r 2 LD75A: 00.0013F9r 2 lda MICROSOFT-1,x 00.0013F9r 2 and #$3F 00.0013F9r 2 sta (LINNUM),y 00.0013F9r 2 iny 00.0013F9r 2 bne LD766 00.0013F9r 2 inc LINNUM+1 00.0013F9r 2 LD766: 00.0013F9r 2 dex 00.0013F9r 2 bne LD75A 00.0013F9r 2 dec FORPNT 00.0013F9r 2 bne LD758 00.0013F9r 2 rts 00.0013F9r 2 .endif 00.0013F9r 2 00.0013F9r 2 ; ---------------------------------------------------------------------------- 00.0013F9r 2 ; SHIFT SMALLER ARGUMENT MORE THAN 7 BITS 00.0013F9r 2 ; ---------------------------------------------------------------------------- 00.0013F9r 2 FADD1: 00.0013F9r 2 20 rr rr jsr SHIFT_RIGHT 00.0013FCr 2 90 3C bcc FADD3 00.0013FEr 2 00.0013FEr 2 ; ---------------------------------------------------------------------------- 00.0013FEr 2 ; FAC = (Y,A) + FAC 00.0013FEr 2 ; ---------------------------------------------------------------------------- 00.0013FEr 2 FADD: 00.0013FEr 2 20 rr rr jsr LOAD_ARG_FROM_YA 00.001401r 2 00.001401r 2 ; ---------------------------------------------------------------------------- 00.001401r 2 ; FAC = ARG + FAC 00.001401r 2 ; ---------------------------------------------------------------------------- 00.001401r 2 FADDT: 00.001401r 2 D0 03 bne L365B 00.001403r 2 4C rr rr jmp COPY_ARG_TO_FAC 00.001406r 2 L365B: 00.001406r 2 A6 BD ldx FACEXTENSION 00.001408r 2 86 A3 stx ARGEXTENSION 00.00140Ar 2 A2 B6 ldx #ARG 00.00140Cr 2 A5 B6 lda ARG 00.00140Er 2 FADD2: 00.00140Er 2 A8 tay 00.00140Fr 2 .ifdef KBD 00.00140Fr 2 beq RTS4 00.00140Fr 2 .else 00.00140Fr 2 F0 CE beq RTS3 00.001411r 2 .endif 00.001411r 2 38 sec 00.001412r 2 E5 AE sbc FAC 00.001414r 2 F0 24 beq FADD3 00.001416r 2 90 12 bcc L367F 00.001418r 2 84 AE sty FAC 00.00141Ar 2 A4 BB ldy ARGSIGN 00.00141Cr 2 84 B3 sty FACSIGN 00.00141Er 2 49 FF eor #$FF 00.001420r 2 69 00 adc #$00 00.001422r 2 A0 00 ldy #$00 00.001424r 2 84 A3 sty ARGEXTENSION 00.001426r 2 A2 AE ldx #FAC 00.001428r 2 D0 04 bne L3683 00.00142Ar 2 L367F: 00.00142Ar 2 A0 00 ldy #$00 00.00142Cr 2 84 BD sty FACEXTENSION 00.00142Er 2 L3683: 00.00142Er 2 C9 F9 cmp #$F9 00.001430r 2 30 C7 bmi FADD1 00.001432r 2 A8 tay 00.001433r 2 A5 BD lda FACEXTENSION 00.001435r 2 56 01 lsr 1,x 00.001437r 2 20 rr rr jsr SHIFT_RIGHT4 00.00143Ar 2 FADD3: 00.00143Ar 2 24 BC bit SGNCPR 00.00143Cr 2 10 57 bpl FADD4 00.00143Er 2 A0 AE ldy #FAC 00.001440r 2 E0 B6 cpx #ARG 00.001442r 2 F0 02 beq L369B 00.001444r 2 A0 B6 ldy #ARG 00.001446r 2 L369B: 00.001446r 2 38 sec 00.001447r 2 49 FF eor #$FF 00.001449r 2 65 A3 adc ARGEXTENSION 00.00144Br 2 85 BD sta FACEXTENSION 00.00144Dr 2 .ifndef CONFIG_SMALL 00.00144Dr 2 B9 04 00 lda 4,y 00.001450r 2 F5 04 sbc 4,x 00.001452r 2 85 B2 sta FAC+4 00.001454r 2 .endif 00.001454r 2 B9 03 00 lda 3,y 00.001457r 2 F5 03 sbc 3,x 00.001459r 2 85 B1 sta FAC+3 00.00145Br 2 B9 02 00 lda 2,y 00.00145Er 2 F5 02 sbc 2,x 00.001460r 2 85 B0 sta FAC+2 00.001462r 2 B9 01 00 lda 1,y 00.001465r 2 F5 01 sbc 1,x 00.001467r 2 85 AF sta FAC+1 00.001469r 2 00.001469r 2 ; ---------------------------------------------------------------------------- 00.001469r 2 ; NORMALIZE VALUE IN FAC 00.001469r 2 ; ---------------------------------------------------------------------------- 00.001469r 2 NORMALIZE_FAC1: 00.001469r 2 B0 03 bcs NORMALIZE_FAC2 00.00146Br 2 20 rr rr jsr COMPLEMENT_FAC 00.00146Er 2 NORMALIZE_FAC2: 00.00146Er 2 A0 00 ldy #$00 00.001470r 2 98 tya 00.001471r 2 18 clc 00.001472r 2 L36C7: 00.001472r 2 A6 AF ldx FAC+1 00.001474r 2 D0 4A bne NORMALIZE_FAC4 00.001476r 2 A6 B0 ldx FAC+2 00.001478r 2 86 AF stx FAC+1 00.00147Ar 2 A6 B1 ldx FAC+3 00.00147Cr 2 86 B0 stx FAC+2 00.00147Er 2 .ifdef CONFIG_SMALL 00.00147Er 2 ldx FACEXTENSION 00.00147Er 2 stx FAC+3 00.00147Er 2 .else 00.00147Er 2 A6 B2 ldx FAC+4 00.001480r 2 86 B1 stx FAC+3 00.001482r 2 A6 BD ldx FACEXTENSION 00.001484r 2 86 B2 stx FAC+4 00.001486r 2 .endif 00.001486r 2 84 BD sty FACEXTENSION 00.001488r 2 69 08 adc #$08 00.00148Ar 2 .ifdef CONFIG_2B 00.00148Ar 2 ; bugfix? 00.00148Ar 2 ; fix does not exist on AppleSoft 2 00.00148Ar 2 cmp #(MANTISSA_BYTES+1)*8 00.00148Ar 2 .else 00.00148Ar 2 C9 20 cmp #MANTISSA_BYTES*8 00.00148Cr 2 .endif 00.00148Cr 2 D0 E4 bne L36C7 00.00148Er 2 00.00148Er 2 ; ---------------------------------------------------------------------------- 00.00148Er 2 ; SET FAC = 0 00.00148Er 2 ; (ONLY NECESSARY TO ZERO EXPONENT AND SIGN CELLS) 00.00148Er 2 ; ---------------------------------------------------------------------------- 00.00148Er 2 ZERO_FAC: 00.00148Er 2 A9 00 lda #$00 00.001490r 2 STA_IN_FAC_SIGN_AND_EXP: 00.001490r 2 85 AE sta FAC 00.001492r 2 STA_IN_FAC_SIGN: 00.001492r 2 85 B3 sta FACSIGN 00.001494r 2 60 rts 00.001495r 2 00.001495r 2 ; ---------------------------------------------------------------------------- 00.001495r 2 ; ADD MANTISSAS OF FAC AND ARG INTO FAC 00.001495r 2 ; ---------------------------------------------------------------------------- 00.001495r 2 FADD4: 00.001495r 2 65 A3 adc ARGEXTENSION 00.001497r 2 85 BD sta FACEXTENSION 00.001499r 2 .ifndef CONFIG_SMALL 00.001499r 2 A5 B2 lda FAC+4 00.00149Br 2 65 BA adc ARG+4 00.00149Dr 2 85 B2 sta FAC+4 00.00149Fr 2 .endif 00.00149Fr 2 A5 B1 lda FAC+3 00.0014A1r 2 65 B9 adc ARG+3 00.0014A3r 2 85 B1 sta FAC+3 00.0014A5r 2 A5 B0 lda FAC+2 00.0014A7r 2 65 B8 adc ARG+2 00.0014A9r 2 85 B0 sta FAC+2 00.0014ABr 2 A5 AF lda FAC+1 00.0014ADr 2 65 B7 adc ARG+1 00.0014AFr 2 85 AF sta FAC+1 00.0014B1r 2 4C rr rr jmp NORMALIZE_FAC5 00.0014B4r 2 00.0014B4r 2 ; ---------------------------------------------------------------------------- 00.0014B4r 2 ; FINISH NORMALIZING FAC 00.0014B4r 2 ; ---------------------------------------------------------------------------- 00.0014B4r 2 NORMALIZE_FAC3: 00.0014B4r 2 69 01 adc #$01 00.0014B6r 2 06 BD asl FACEXTENSION 00.0014B8r 2 .ifndef CONFIG_SMALL 00.0014B8r 2 26 B2 rol FAC+4 00.0014BAr 2 .endif 00.0014BAr 2 26 B1 rol FAC+3 00.0014BCr 2 26 B0 rol FAC+2 00.0014BEr 2 26 AF rol FAC+1 00.0014C0r 2 NORMALIZE_FAC4: 00.0014C0r 2 10 F2 bpl NORMALIZE_FAC3 00.0014C2r 2 38 sec 00.0014C3r 2 E5 AE sbc FAC 00.0014C5r 2 B0 C7 bcs ZERO_FAC 00.0014C7r 2 49 FF eor #$FF 00.0014C9r 2 69 01 adc #$01 00.0014CBr 2 85 AE sta FAC 00.0014CDr 2 NORMALIZE_FAC5: 00.0014CDr 2 90 40 bcc L3764 00.0014CFr 2 NORMALIZE_FAC6: 00.0014CFr 2 E6 AE inc FAC 00.0014D1r 2 F0 74 beq OVERFLOW 00.0014D3r 2 .ifndef CONFIG_ROR_WORKAROUND 00.0014D3r 2 ror FAC+1 00.0014D3r 2 ror FAC+2 00.0014D3r 2 ror FAC+3 00.0014D3r 2 .ifndef CONFIG_SMALL 00.0014D3r 2 ror FAC+4 00.0014D3r 2 .endif 00.0014D3r 2 ror FACEXTENSION 00.0014D3r 2 .else 00.0014D3r 2 A9 00 lda #$00 00.0014D5r 2 90 02 bcc L372E 00.0014D7r 2 A9 80 lda #$80 00.0014D9r 2 L372E: 00.0014D9r 2 46 AF lsr FAC+1 00.0014DBr 2 05 AF ora FAC+1 00.0014DDr 2 85 AF sta FAC+1 00.0014DFr 2 A9 00 lda #$00 00.0014E1r 2 90 02 bcc L373A 00.0014E3r 2 A9 80 lda #$80 00.0014E5r 2 L373A: 00.0014E5r 2 46 B0 lsr FAC+2 00.0014E7r 2 05 B0 ora FAC+2 00.0014E9r 2 85 B0 sta FAC+2 00.0014EBr 2 A9 00 lda #$00 00.0014EDr 2 90 02 bcc L3746 00.0014EFr 2 A9 80 lda #$80 00.0014F1r 2 L3746: 00.0014F1r 2 46 B1 lsr FAC+3 00.0014F3r 2 05 B1 ora FAC+3 00.0014F5r 2 85 B1 sta FAC+3 00.0014F7r 2 A9 00 lda #$00 00.0014F9r 2 90 02 bcc L3752 00.0014FBr 2 A9 80 lda #$80 00.0014FDr 2 L3752: 00.0014FDr 2 46 B2 lsr FAC+4 00.0014FFr 2 05 B2 ora FAC+4 00.001501r 2 85 B2 sta FAC+4 00.001503r 2 A9 00 lda #$00 00.001505r 2 90 02 bcc L375E 00.001507r 2 A9 80 lda #$80 00.001509r 2 L375E: 00.001509r 2 46 BD lsr FACEXTENSION 00.00150Br 2 05 BD ora FACEXTENSION 00.00150Dr 2 85 BD sta FACEXTENSION 00.00150Fr 2 .endif 00.00150Fr 2 L3764: 00.00150Fr 2 60 rts 00.001510r 2 00.001510r 2 ; ---------------------------------------------------------------------------- 00.001510r 2 ; 2'S COMPLEMENT OF FAC 00.001510r 2 ; ---------------------------------------------------------------------------- 00.001510r 2 COMPLEMENT_FAC: 00.001510r 2 A5 B3 lda FACSIGN 00.001512r 2 49 FF eor #$FF 00.001514r 2 85 B3 sta FACSIGN 00.001516r 2 00.001516r 2 ; ---------------------------------------------------------------------------- 00.001516r 2 ; 2'S COMPLEMENT OF FAC MANTISSA ONLY 00.001516r 2 ; ---------------------------------------------------------------------------- 00.001516r 2 COMPLEMENT_FAC_MANTISSA: 00.001516r 2 A5 AF lda FAC+1 00.001518r 2 49 FF eor #$FF 00.00151Ar 2 85 AF sta FAC+1 00.00151Cr 2 A5 B0 lda FAC+2 00.00151Er 2 49 FF eor #$FF 00.001520r 2 85 B0 sta FAC+2 00.001522r 2 A5 B1 lda FAC+3 00.001524r 2 49 FF eor #$FF 00.001526r 2 85 B1 sta FAC+3 00.001528r 2 .ifndef CONFIG_SMALL 00.001528r 2 A5 B2 lda FAC+4 00.00152Ar 2 49 FF eor #$FF 00.00152Cr 2 85 B2 sta FAC+4 00.00152Er 2 .endif 00.00152Er 2 A5 BD lda FACEXTENSION 00.001530r 2 49 FF eor #$FF 00.001532r 2 85 BD sta FACEXTENSION 00.001534r 2 E6 BD inc FACEXTENSION 00.001536r 2 D0 0E bne RTS12 00.001538r 2 00.001538r 2 ; ---------------------------------------------------------------------------- 00.001538r 2 ; INCREMENT FAC MANTISSA 00.001538r 2 ; ---------------------------------------------------------------------------- 00.001538r 2 INCREMENT_FAC_MANTISSA: 00.001538r 2 .ifndef CONFIG_SMALL 00.001538r 2 E6 B2 inc FAC+4 00.00153Ar 2 D0 0A bne RTS12 00.00153Cr 2 .endif 00.00153Cr 2 E6 B1 inc FAC+3 00.00153Er 2 D0 06 bne RTS12 00.001540r 2 E6 B0 inc FAC+2 00.001542r 2 D0 02 bne RTS12 00.001544r 2 E6 AF inc FAC+1 00.001546r 2 RTS12: 00.001546r 2 60 rts 00.001547r 2 OVERFLOW: 00.001547r 2 A2 45 ldx #ERR_OVERFLOW 00.001549r 2 4C rr rr jmp ERROR 00.00154Cr 2 00.00154Cr 2 ; ---------------------------------------------------------------------------- 00.00154Cr 2 ; SHIFT 1,X THRU 5,X RIGHT 00.00154Cr 2 ; (A) = NEGATIVE OF SHIFT COUNT 00.00154Cr 2 ; (X) = POINTER TO BYTES TO BE SHIFTED 00.00154Cr 2 ; 00.00154Cr 2 ; RETURN WITH (Y)=0, CARRY=0, EXTENSION BITS IN A-REG 00.00154Cr 2 ; ---------------------------------------------------------------------------- 00.00154Cr 2 SHIFT_RIGHT1: 00.00154Cr 2 A2 72 ldx #RESULT-1 00.00154Er 2 SHIFT_RIGHT2: 00.00154Er 2 .ifdef CONFIG_SMALL 00.00154Er 2 ldy 3,x 00.00154Er 2 .else 00.00154Er 2 B4 04 ldy 4,x 00.001550r 2 .endif 00.001550r 2 84 BD sty FACEXTENSION 00.001552r 2 .ifndef CONFIG_SMALL 00.001552r 2 B4 03 ldy 3,x 00.001554r 2 94 04 sty 4,x 00.001556r 2 .endif 00.001556r 2 B4 02 ldy 2,x 00.001558r 2 94 03 sty 3,x 00.00155Ar 2 B4 01 ldy 1,x 00.00155Cr 2 94 02 sty 2,x 00.00155Er 2 A4 B5 ldy SHIFTSIGNEXT 00.001560r 2 94 01 sty 1,x 00.001562r 2 00.001562r 2 ; ---------------------------------------------------------------------------- 00.001562r 2 ; MAIN ENTRY TO RIGHT SHIFT SUBROUTINE 00.001562r 2 ; ---------------------------------------------------------------------------- 00.001562r 2 SHIFT_RIGHT: 00.001562r 2 69 08 adc #$08 00.001564r 2 30 E8 bmi SHIFT_RIGHT2 00.001566r 2 F0 E6 beq SHIFT_RIGHT2 00.001568r 2 E9 08 sbc #$08 00.00156Ar 2 A8 tay 00.00156Br 2 A5 BD lda FACEXTENSION 00.00156Dr 2 B0 3C bcs SHIFT_RIGHT5 00.00156Fr 2 .ifndef CONFIG_ROR_WORKAROUND 00.00156Fr 2 LB588: 00.00156Fr 2 asl 1,x 00.00156Fr 2 bcc LB58E 00.00156Fr 2 inc 1,x 00.00156Fr 2 LB58E: 00.00156Fr 2 ror 1,x 00.00156Fr 2 ror 1,x 00.00156Fr 2 00.00156Fr 2 ; ---------------------------------------------------------------------------- 00.00156Fr 2 ; ENTER HERE FOR SHORT SHIFTS WITH NO SIGN EXTENSION 00.00156Fr 2 ; ---------------------------------------------------------------------------- 00.00156Fr 2 SHIFT_RIGHT4: 00.00156Fr 2 ror 2,x 00.00156Fr 2 ror 3,x 00.00156Fr 2 .ifndef CONFIG_SMALL 00.00156Fr 2 ror 4,x 00.00156Fr 2 .endif 00.00156Fr 2 ror a 00.00156Fr 2 iny 00.00156Fr 2 bne LB588 00.00156Fr 2 .else 00.00156Fr 2 L37C4: 00.00156Fr 2 48 pha 00.001570r 2 B5 01 lda 1,x 00.001572r 2 29 80 and #$80 00.001574r 2 56 01 lsr 1,x 00.001576r 2 15 01 ora 1,x 00.001578r 2 95 01 sta 1,x 00.00157Ar 2 24 .byte $24 00.00157Br 2 SHIFT_RIGHT4: 00.00157Br 2 48 pha 00.00157Cr 2 A9 00 lda #$00 00.00157Er 2 90 02 bcc L37D7 00.001580r 2 A9 80 lda #$80 00.001582r 2 L37D7: 00.001582r 2 56 02 lsr 2,x 00.001584r 2 15 02 ora 2,x 00.001586r 2 95 02 sta 2,x 00.001588r 2 A9 00 lda #$00 00.00158Ar 2 90 02 bcc L37E3 00.00158Cr 2 A9 80 lda #$80 00.00158Er 2 L37E3: 00.00158Er 2 56 03 lsr 3,x 00.001590r 2 15 03 ora 3,x 00.001592r 2 95 03 sta 3,x 00.001594r 2 A9 00 lda #$00 00.001596r 2 90 02 bcc L37EF 00.001598r 2 A9 80 lda #$80 00.00159Ar 2 L37EF: 00.00159Ar 2 56 04 lsr 4,x 00.00159Cr 2 15 04 ora 4,x 00.00159Er 2 95 04 sta 4,x 00.0015A0r 2 68 pla 00.0015A1r 2 08 php 00.0015A2r 2 4A lsr a 00.0015A3r 2 28 plp 00.0015A4r 2 90 02 bcc L37FD 00.0015A6r 2 09 80 ora #$80 00.0015A8r 2 L37FD: 00.0015A8r 2 C8 iny 00.0015A9r 2 D0 C4 bne L37C4 00.0015ABr 2 .endif 00.0015ABr 2 SHIFT_RIGHT5: 00.0015ABr 2 18 clc 00.0015ACr 2 60 rts 00.0015ADr 2 00.0015ADr 2 ; ---------------------------------------------------------------------------- 00.0015ADr 2 .ifdef CONFIG_SMALL 00.0015ADr 2 CON_ONE: 00.0015ADr 2 .byte $81,$00,$00,$00 00.0015ADr 2 POLY_LOG: 00.0015ADr 2 .byte $02 00.0015ADr 2 .byte $80,$19,$56,$62 00.0015ADr 2 .byte $80,$76,$22,$F3 00.0015ADr 2 .byte $82,$38,$AA,$40 00.0015ADr 2 CON_SQR_HALF: 00.0015ADr 2 .byte $80,$35,$04,$F3 00.0015ADr 2 CON_SQR_TWO: 00.0015ADr 2 .byte $81,$35,$04,$F3 00.0015ADr 2 CON_NEG_HALF: 00.0015ADr 2 .byte $80,$80,$00,$00 00.0015ADr 2 CON_LOG_TWO: 00.0015ADr 2 .byte $80,$31,$72,$18 00.0015ADr 2 .else 00.0015ADr 2 CON_ONE: 00.0015ADr 2 81 00 00 00 .byte $81,$00,$00,$00,$00 00.0015B1r 2 00 00.0015B2r 2 POLY_LOG: 00.0015B2r 2 03 .byte $03 00.0015B3r 2 7F 5E 56 CB .byte $7F,$5E,$56,$CB,$79 00.0015B7r 2 79 00.0015B8r 2 80 13 9B 0B .byte $80,$13,$9B,$0B,$64 00.0015BCr 2 64 00.0015BDr 2 80 76 38 93 .byte $80,$76,$38,$93,$16 00.0015C1r 2 16 00.0015C2r 2 82 38 AA 3B .byte $82,$38,$AA,$3B,$20 00.0015C6r 2 20 00.0015C7r 2 CON_SQR_HALF: 00.0015C7r 2 80 35 04 F3 .byte $80,$35,$04,$F3,$34 00.0015CBr 2 34 00.0015CCr 2 CON_SQR_TWO: 00.0015CCr 2 81 35 04 F3 .byte $81,$35,$04,$F3,$34 00.0015D0r 2 34 00.0015D1r 2 CON_NEG_HALF: 00.0015D1r 2 80 80 00 00 .byte $80,$80,$00,$00,$00 00.0015D5r 2 00 00.0015D6r 2 CON_LOG_TWO: 00.0015D6r 2 80 31 72 17 .byte $80,$31,$72,$17,$F8 00.0015DAr 2 F8 00.0015DBr 2 .endif 00.0015DBr 2 00.0015DBr 2 ; ---------------------------------------------------------------------------- 00.0015DBr 2 ; "LOG" FUNCTION 00.0015DBr 2 ; ---------------------------------------------------------------------------- 00.0015DBr 2 LOG: 00.0015DBr 2 20 rr rr jsr SIGN 00.0015DEr 2 F0 02 beq GIQ 00.0015E0r 2 10 03 bpl LOG2 00.0015E2r 2 GIQ: 00.0015E2r 2 4C rr rr jmp IQERR 00.0015E5r 2 LOG2: 00.0015E5r 2 A5 AE lda FAC 00.0015E7r 2 E9 7F sbc #$7F 00.0015E9r 2 48 pha 00.0015EAr 2 A9 80 lda #$80 00.0015ECr 2 85 AE sta FAC 00.0015EEr 2 A9 rr lda #CON_SQR_HALF 00.0015F2r 2 20 rr rr jsr FADD 00.0015F5r 2 A9 rr lda #CON_SQR_TWO 00.0015F9r 2 20 rr rr jsr FDIV 00.0015FCr 2 A9 rr lda #CON_ONE 00.001600r 2 20 rr rr jsr FSUB 00.001603r 2 A9 rr lda #POLY_LOG 00.001607r 2 20 rr rr jsr POLYNOMIAL_ODD 00.00160Ar 2 A9 rr lda #CON_NEG_HALF 00.00160Er 2 20 rr rr jsr FADD 00.001611r 2 68 pla 00.001612r 2 20 rr rr jsr ADDACC 00.001615r 2 A9 rr lda #CON_LOG_TWO 00.001619r 2 00.001619r 2 ; ---------------------------------------------------------------------------- 00.001619r 2 ; FAC = (Y,A) * FAC 00.001619r 2 ; ---------------------------------------------------------------------------- 00.001619r 2 FMULT: 00.001619r 2 20 rr rr jsr LOAD_ARG_FROM_YA 00.00161Cr 2 00.00161Cr 2 ; ---------------------------------------------------------------------------- 00.00161Cr 2 ; FAC = ARG * FAC 00.00161Cr 2 ; ---------------------------------------------------------------------------- 00.00161Cr 2 FMULTT: 00.00161Cr 2 .ifndef CONFIG_11 00.00161Cr 2 beq L3903 00.00161Cr 2 .else 00.00161Cr 2 D0 03 4C rr jeq L3903 00.001620r 2 rr 00.001621r 2 .endif 00.001621r 2 20 rr rr jsr ADD_EXPONENTS 00.001624r 2 A9 00 lda #$00 00.001626r 2 85 73 sta RESULT 00.001628r 2 85 74 sta RESULT+1 00.00162Ar 2 85 75 sta RESULT+2 00.00162Cr 2 .ifndef CONFIG_SMALL 00.00162Cr 2 85 76 sta RESULT+3 00.00162Er 2 .endif 00.00162Er 2 A5 BD lda FACEXTENSION 00.001630r 2 20 rr rr jsr MULTIPLY1 00.001633r 2 .ifndef CONFIG_SMALL 00.001633r 2 A5 B2 lda FAC+4 00.001635r 2 20 rr rr jsr MULTIPLY1 00.001638r 2 .endif 00.001638r 2 A5 B1 lda FAC+3 00.00163Ar 2 20 rr rr jsr MULTIPLY1 00.00163Dr 2 A5 B0 lda FAC+2 00.00163Fr 2 20 rr rr jsr MULTIPLY1 00.001642r 2 A5 AF lda FAC+1 00.001644r 2 20 rr rr jsr MULTIPLY2 00.001647r 2 4C rr rr jmp COPY_RESULT_INTO_FAC 00.00164Ar 2 00.00164Ar 2 ; ---------------------------------------------------------------------------- 00.00164Ar 2 ; MULTIPLY ARG BY (A) INTO RESULT 00.00164Ar 2 ; ---------------------------------------------------------------------------- 00.00164Ar 2 MULTIPLY1: 00.00164Ar 2 D0 03 bne MULTIPLY2 00.00164Cr 2 4C rr rr jmp SHIFT_RIGHT1 00.00164Fr 2 MULTIPLY2: 00.00164Fr 2 4A lsr a 00.001650r 2 09 80 ora #$80 00.001652r 2 L38A7: 00.001652r 2 A8 tay 00.001653r 2 90 19 bcc L38C3 00.001655r 2 18 clc 00.001656r 2 .ifndef CONFIG_SMALL 00.001656r 2 A5 76 lda RESULT+3 00.001658r 2 65 BA adc ARG+4 00.00165Ar 2 85 76 sta RESULT+3 00.00165Cr 2 .endif 00.00165Cr 2 A5 75 lda RESULT+2 00.00165Er 2 65 B9 adc ARG+3 00.001660r 2 85 75 sta RESULT+2 00.001662r 2 A5 74 lda RESULT+1 00.001664r 2 65 B8 adc ARG+2 00.001666r 2 85 74 sta RESULT+1 00.001668r 2 A5 73 lda RESULT 00.00166Ar 2 65 B7 adc ARG+1 00.00166Cr 2 85 73 sta RESULT 00.00166Er 2 L38C3: 00.00166Er 2 .ifndef CONFIG_ROR_WORKAROUND 00.00166Er 2 ror RESULT 00.00166Er 2 ror RESULT+1 00.00166Er 2 .ifdef APPLE_BAD_BYTE 00.00166Er 2 ; this seems to be a bad byte in the dump 00.00166Er 2 .byte RESULT+2,RESULT+2 ; XXX BUG! 00.00166Er 2 .else 00.00166Er 2 ror RESULT+2 00.00166Er 2 .endif 00.00166Er 2 .ifndef CONFIG_SMALL 00.00166Er 2 ror RESULT+3 00.00166Er 2 .endif 00.00166Er 2 ror FACEXTENSION 00.00166Er 2 .else 00.00166Er 2 A9 00 lda #$00 00.001670r 2 90 02 bcc L38C9 00.001672r 2 A9 80 lda #$80 00.001674r 2 L38C9: 00.001674r 2 46 73 lsr RESULT 00.001676r 2 05 73 ora RESULT 00.001678r 2 85 73 sta RESULT 00.00167Ar 2 A9 00 lda #$00 00.00167Cr 2 90 02 bcc L38D5 00.00167Er 2 A9 80 lda #$80 00.001680r 2 L38D5: 00.001680r 2 46 74 lsr RESULT+1 00.001682r 2 05 74 ora RESULT+1 00.001684r 2 85 74 sta RESULT+1 00.001686r 2 A9 00 lda #$00 00.001688r 2 90 02 bcc L38E1 00.00168Ar 2 A9 80 lda #$80 00.00168Cr 2 L38E1: 00.00168Cr 2 46 75 lsr RESULT+2 00.00168Er 2 05 75 ora RESULT+2 00.001690r 2 85 75 sta RESULT+2 00.001692r 2 A9 00 lda #$00 00.001694r 2 90 02 bcc L38ED 00.001696r 2 A9 80 lda #$80 00.001698r 2 L38ED: 00.001698r 2 46 76 lsr RESULT+3 00.00169Ar 2 05 76 ora RESULT+3 00.00169Cr 2 85 76 sta RESULT+3 00.00169Er 2 A9 00 lda #$00 00.0016A0r 2 90 02 bcc L38F9 00.0016A2r 2 A9 80 lda #$80 00.0016A4r 2 L38F9: 00.0016A4r 2 46 BD lsr FACEXTENSION 00.0016A6r 2 05 BD ora FACEXTENSION 00.0016A8r 2 85 BD sta FACEXTENSION 00.0016AAr 2 .endif 00.0016AAr 2 98 tya 00.0016ABr 2 4A lsr a 00.0016ACr 2 D0 A4 bne L38A7 00.0016AEr 2 L3903: 00.0016AEr 2 60 rts 00.0016AFr 2 00.0016AFr 2 ; ---------------------------------------------------------------------------- 00.0016AFr 2 ; UNPACK NUMBER AT (Y,A) INTO ARG 00.0016AFr 2 ; ---------------------------------------------------------------------------- 00.0016AFr 2 LOAD_ARG_FROM_YA: 00.0016AFr 2 85 6F sta INDEX 00.0016B1r 2 84 70 sty INDEX+1 00.0016B3r 2 A0 04 ldy #BYTES_FP-1 00.0016B5r 2 .ifndef CONFIG_SMALL 00.0016B5r 2 B1 6F lda (INDEX),y 00.0016B7r 2 85 BA sta ARG+4 00.0016B9r 2 88 dey 00.0016BAr 2 .endif 00.0016BAr 2 B1 6F lda (INDEX),y 00.0016BCr 2 85 B9 sta ARG+3 00.0016BEr 2 88 dey 00.0016BFr 2 B1 6F lda (INDEX),y 00.0016C1r 2 85 B8 sta ARG+2 00.0016C3r 2 88 dey 00.0016C4r 2 B1 6F lda (INDEX),y 00.0016C6r 2 85 BB sta ARGSIGN 00.0016C8r 2 45 B3 eor FACSIGN 00.0016CAr 2 85 BC sta SGNCPR 00.0016CCr 2 A5 BB lda ARGSIGN 00.0016CEr 2 09 80 ora #$80 00.0016D0r 2 85 B7 sta ARG+1 00.0016D2r 2 88 dey 00.0016D3r 2 B1 6F lda (INDEX),y 00.0016D5r 2 85 B6 sta ARG 00.0016D7r 2 A5 AE lda FAC 00.0016D9r 2 60 rts 00.0016DAr 2 00.0016DAr 2 ; ---------------------------------------------------------------------------- 00.0016DAr 2 ; ADD EXPONENTS OF ARG AND FAC 00.0016DAr 2 ; (CALLED BY FMULT AND FDIV) 00.0016DAr 2 ; 00.0016DAr 2 ; ALSO CHECK FOR OVERFLOW, AND SET RESULT SIGN 00.0016DAr 2 ; ---------------------------------------------------------------------------- 00.0016DAr 2 ADD_EXPONENTS: 00.0016DAr 2 A5 B6 lda ARG 00.0016DCr 2 ADD_EXPONENTS1: 00.0016DCr 2 F0 1F beq ZERO 00.0016DEr 2 18 clc 00.0016DFr 2 65 AE adc FAC 00.0016E1r 2 90 04 bcc L393C 00.0016E3r 2 30 1D bmi JOV 00.0016E5r 2 18 clc 00.0016E6r 2 2C .byte $2C 00.0016E7r 2 L393C: 00.0016E7r 2 10 14 bpl ZERO 00.0016E9r 2 69 80 adc #$80 00.0016EBr 2 85 AE sta FAC 00.0016EDr 2 D0 03 bne L3947 00.0016EFr 2 4C rr rr jmp STA_IN_FAC_SIGN 00.0016F2r 2 L3947: 00.0016F2r 2 A5 BC lda SGNCPR 00.0016F4r 2 85 B3 sta FACSIGN 00.0016F6r 2 60 rts 00.0016F7r 2 00.0016F7r 2 ; ---------------------------------------------------------------------------- 00.0016F7r 2 ; IF (FAC) IS POSITIVE, GIVE "OVERFLOW" ERROR 00.0016F7r 2 ; IF (FAC) IS NEGATIVE, SET FAC=0, POP ONE RETURN, AND RTS 00.0016F7r 2 ; CALLED FROM "EXP" FUNCTION 00.0016F7r 2 ; ---------------------------------------------------------------------------- 00.0016F7r 2 OUTOFRNG: 00.0016F7r 2 A5 B3 lda FACSIGN 00.0016F9r 2 49 FF eor #$FF 00.0016FBr 2 30 05 bmi JOV 00.0016FDr 2 00.0016FDr 2 ; ---------------------------------------------------------------------------- 00.0016FDr 2 ; POP RETURN ADDRESS AND SET FAC=0 00.0016FDr 2 ; ---------------------------------------------------------------------------- 00.0016FDr 2 ZERO: 00.0016FDr 2 68 pla 00.0016FEr 2 68 pla 00.0016FFr 2 4C rr rr jmp ZERO_FAC 00.001702r 2 JOV: 00.001702r 2 4C rr rr jmp OVERFLOW 00.001705r 2 00.001705r 2 ; ---------------------------------------------------------------------------- 00.001705r 2 ; MULTIPLY FAC BY 10 00.001705r 2 ; ---------------------------------------------------------------------------- 00.001705r 2 MUL10: 00.001705r 2 20 rr rr jsr COPY_FAC_TO_ARG_ROUNDED 00.001708r 2 AA tax 00.001709r 2 F0 10 beq L3970 00.00170Br 2 18 clc 00.00170Cr 2 69 02 adc #$02 00.00170Er 2 B0 F2 bcs JOV 00.001710r 2 LD9BF: 00.001710r 2 A2 00 ldx #$00 00.001712r 2 86 BC stx SGNCPR 00.001714r 2 20 rr rr jsr FADD2 00.001717r 2 E6 AE inc FAC 00.001719r 2 F0 E7 beq JOV 00.00171Br 2 L3970: 00.00171Br 2 60 rts 00.00171Cr 2 00.00171Cr 2 ; ---------------------------------------------------------------------------- 00.00171Cr 2 CONTEN: 00.00171Cr 2 .ifdef CONFIG_SMALL 00.00171Cr 2 .byte $84,$20,$00,$00 00.00171Cr 2 .else 00.00171Cr 2 84 20 00 00 .byte $84,$20,$00,$00,$00 00.001720r 2 00 00.001721r 2 .endif 00.001721r 2 00.001721r 2 ; ---------------------------------------------------------------------------- 00.001721r 2 ; DIVIDE FAC BY 10 00.001721r 2 ; ---------------------------------------------------------------------------- 00.001721r 2 DIV10: 00.001721r 2 20 rr rr jsr COPY_FAC_TO_ARG_ROUNDED 00.001724r 2 A9 rr lda #CONTEN 00.001728r 2 A2 00 ldx #$00 00.00172Ar 2 00.00172Ar 2 ; ---------------------------------------------------------------------------- 00.00172Ar 2 ; FAC = ARG / (Y,A) 00.00172Ar 2 ; ---------------------------------------------------------------------------- 00.00172Ar 2 DIV: 00.00172Ar 2 86 BC stx SGNCPR 00.00172Cr 2 20 rr rr jsr LOAD_FAC_FROM_YA 00.00172Fr 2 4C rr rr jmp FDIVT 00.001732r 2 00.001732r 2 ; ---------------------------------------------------------------------------- 00.001732r 2 ; FAC = (Y,A) / FAC 00.001732r 2 ; ---------------------------------------------------------------------------- 00.001732r 2 FDIV: 00.001732r 2 20 rr rr jsr LOAD_ARG_FROM_YA 00.001735r 2 00.001735r 2 ; ---------------------------------------------------------------------------- 00.001735r 2 ; FAC = ARG / FAC 00.001735r 2 ; ---------------------------------------------------------------------------- 00.001735r 2 FDIVT: 00.001735r 2 F0 76 beq L3A02 00.001737r 2 20 rr rr jsr ROUND_FAC 00.00173Ar 2 A9 00 lda #$00 00.00173Cr 2 38 sec 00.00173Dr 2 E5 AE sbc FAC 00.00173Fr 2 85 AE sta FAC 00.001741r 2 20 rr rr jsr ADD_EXPONENTS 00.001744r 2 E6 AE inc FAC 00.001746r 2 F0 BA beq JOV 00.001748r 2 A2 FC ldx #<-MANTISSA_BYTES 00.00174Ar 2 A9 01 lda #$01 00.00174Cr 2 L39A1: 00.00174Cr 2 A4 B7 ldy ARG+1 00.00174Er 2 C4 AF cpy FAC+1 00.001750r 2 D0 10 bne L39B7 00.001752r 2 A4 B8 ldy ARG+2 00.001754r 2 C4 B0 cpy FAC+2 00.001756r 2 D0 0A bne L39B7 00.001758r 2 A4 B9 ldy ARG+3 00.00175Ar 2 C4 B1 cpy FAC+3 00.00175Cr 2 .ifndef CONFIG_SMALL 00.00175Cr 2 D0 04 bne L39B7 00.00175Er 2 A4 BA ldy ARG+4 00.001760r 2 C4 B2 cpy FAC+4 00.001762r 2 .endif 00.001762r 2 L39B7: 00.001762r 2 08 php 00.001763r 2 2A rol a 00.001764r 2 90 09 bcc L39C4 00.001766r 2 E8 inx 00.001767r 2 95 76 sta RESULT_LAST-1,x 00.001769r 2 F0 32 beq L39F2 00.00176Br 2 10 34 bpl L39F6 00.00176Dr 2 A9 01 lda #$01 00.00176Fr 2 L39C4: 00.00176Fr 2 28 plp 00.001770r 2 B0 0E bcs L39D5 00.001772r 2 L39C7: 00.001772r 2 06 BA asl ARG_LAST 00.001774r 2 .ifndef CONFIG_SMALL 00.001774r 2 26 B9 rol ARG+3 00.001776r 2 .endif 00.001776r 2 26 B8 rol ARG+2 00.001778r 2 26 B7 rol ARG+1 00.00177Ar 2 B0 E6 bcs L39B7 00.00177Cr 2 30 CE bmi L39A1 00.00177Er 2 10 E2 bpl L39B7 00.001780r 2 L39D5: 00.001780r 2 A8 tay 00.001781r 2 .ifndef CONFIG_SMALL 00.001781r 2 A5 BA lda ARG+4 00.001783r 2 E5 B2 sbc FAC+4 00.001785r 2 85 BA sta ARG+4 00.001787r 2 .endif 00.001787r 2 A5 B9 lda ARG+3 00.001789r 2 E5 B1 sbc FAC+3 00.00178Br 2 85 B9 sta ARG+3 00.00178Dr 2 A5 B8 lda ARG+2 00.00178Fr 2 E5 B0 sbc FAC+2 00.001791r 2 85 B8 sta ARG+2 00.001793r 2 A5 B7 lda ARG+1 00.001795r 2 E5 AF sbc FAC+1 00.001797r 2 85 B7 sta ARG+1 00.001799r 2 98 tya 00.00179Ar 2 4C rr rr jmp L39C7 00.00179Dr 2 L39F2: 00.00179Dr 2 A9 40 lda #$40 00.00179Fr 2 D0 CE bne L39C4 00.0017A1r 2 L39F6: 00.0017A1r 2 0A asl a 00.0017A2r 2 0A asl a 00.0017A3r 2 0A asl a 00.0017A4r 2 0A asl a 00.0017A5r 2 0A asl a 00.0017A6r 2 0A asl a 00.0017A7r 2 85 BD sta FACEXTENSION 00.0017A9r 2 28 plp 00.0017AAr 2 4C rr rr jmp COPY_RESULT_INTO_FAC 00.0017ADr 2 L3A02: 00.0017ADr 2 A2 85 ldx #ERR_ZERODIV 00.0017AFr 2 4C rr rr jmp ERROR 00.0017B2r 2 00.0017B2r 2 ; ---------------------------------------------------------------------------- 00.0017B2r 2 ; COPY RESULT INTO FAC MANTISSA, AND NORMALIZE 00.0017B2r 2 ; ---------------------------------------------------------------------------- 00.0017B2r 2 COPY_RESULT_INTO_FAC: 00.0017B2r 2 A5 73 lda RESULT 00.0017B4r 2 85 AF sta FAC+1 00.0017B6r 2 A5 74 lda RESULT+1 00.0017B8r 2 85 B0 sta FAC+2 00.0017BAr 2 A5 75 lda RESULT+2 00.0017BCr 2 85 B1 sta FAC+3 00.0017BEr 2 .ifndef CONFIG_SMALL 00.0017BEr 2 A5 76 lda RESULT+3 00.0017C0r 2 85 B2 sta FAC+4 00.0017C2r 2 .endif 00.0017C2r 2 4C rr rr jmp NORMALIZE_FAC2 00.0017C5r 2 00.0017C5r 2 ; ---------------------------------------------------------------------------- 00.0017C5r 2 ; UNPACK (Y,A) INTO FAC 00.0017C5r 2 ; ---------------------------------------------------------------------------- 00.0017C5r 2 LOAD_FAC_FROM_YA: 00.0017C5r 2 85 6F sta INDEX 00.0017C7r 2 84 70 sty INDEX+1 00.0017C9r 2 A0 04 ldy #MANTISSA_BYTES 00.0017CBr 2 .ifndef CONFIG_SMALL 00.0017CBr 2 B1 6F lda (INDEX),y 00.0017CDr 2 85 B2 sta FAC+4 00.0017CFr 2 88 dey 00.0017D0r 2 .endif 00.0017D0r 2 B1 6F lda (INDEX),y 00.0017D2r 2 85 B1 sta FAC+3 00.0017D4r 2 88 dey 00.0017D5r 2 B1 6F lda (INDEX),y 00.0017D7r 2 85 B0 sta FAC+2 00.0017D9r 2 88 dey 00.0017DAr 2 B1 6F lda (INDEX),y 00.0017DCr 2 85 B3 sta FACSIGN 00.0017DEr 2 09 80 ora #$80 00.0017E0r 2 85 AF sta FAC+1 00.0017E2r 2 88 dey 00.0017E3r 2 B1 6F lda (INDEX),y 00.0017E5r 2 85 AE sta FAC 00.0017E7r 2 84 BD sty FACEXTENSION 00.0017E9r 2 60 rts 00.0017EAr 2 00.0017EAr 2 ; ---------------------------------------------------------------------------- 00.0017EAr 2 ; ROUND FAC, STORE IN TEMP2 00.0017EAr 2 ; ---------------------------------------------------------------------------- 00.0017EAr 2 STORE_FAC_IN_TEMP2_ROUNDED: 00.0017EAr 2 A2 A9 ldx #TEMP2 00.0017ECr 2 2C .byte $2C 00.0017EDr 2 00.0017EDr 2 ; ---------------------------------------------------------------------------- 00.0017EDr 2 ; ROUND FAC, STORE IN TEMP1 00.0017EDr 2 ; ---------------------------------------------------------------------------- 00.0017EDr 2 STORE_FAC_IN_TEMP1_ROUNDED: 00.0017EDr 2 A2 A4 ldx #TEMP1X 00.0017EFr 2 A0 00 ldy #$00 00.0017F1r 2 F0 04 beq STORE_FAC_AT_YX_ROUNDED 00.0017F3r 2 00.0017F3r 2 ; ---------------------------------------------------------------------------- 00.0017F3r 2 ; ROUND FAC, AND STORE WHERE FORPNT POINTS 00.0017F3r 2 ; ---------------------------------------------------------------------------- 00.0017F3r 2 SETFOR: 00.0017F3r 2 A6 96 ldx FORPNT 00.0017F5r 2 A4 97 ldy FORPNT+1 00.0017F7r 2 00.0017F7r 2 ; ---------------------------------------------------------------------------- 00.0017F7r 2 ; ROUND FAC, AND STORE AT (Y,X) 00.0017F7r 2 ; ---------------------------------------------------------------------------- 00.0017F7r 2 STORE_FAC_AT_YX_ROUNDED: 00.0017F7r 2 20 rr rr jsr ROUND_FAC 00.0017FAr 2 86 6F stx INDEX 00.0017FCr 2 84 70 sty INDEX+1 00.0017FEr 2 A0 04 ldy #MANTISSA_BYTES 00.001800r 2 .ifndef CONFIG_SMALL 00.001800r 2 A5 B2 lda FAC+4 00.001802r 2 91 6F sta (INDEX),y 00.001804r 2 88 dey 00.001805r 2 .endif 00.001805r 2 A5 B1 lda FAC+3 00.001807r 2 91 6F sta (INDEX),y 00.001809r 2 88 dey 00.00180Ar 2 A5 B0 lda FAC+2 00.00180Cr 2 91 6F sta (INDEX),y 00.00180Er 2 88 dey 00.00180Fr 2 A5 B3 lda FACSIGN 00.001811r 2 09 7F ora #$7F 00.001813r 2 25 AF and FAC+1 00.001815r 2 91 6F sta (INDEX),y 00.001817r 2 88 dey 00.001818r 2 A5 AE lda FAC 00.00181Ar 2 91 6F sta (INDEX),y 00.00181Cr 2 84 BD sty FACEXTENSION 00.00181Er 2 60 rts 00.00181Fr 2 00.00181Fr 2 ; ---------------------------------------------------------------------------- 00.00181Fr 2 ; COPY ARG INTO FAC 00.00181Fr 2 ; ---------------------------------------------------------------------------- 00.00181Fr 2 COPY_ARG_TO_FAC: 00.00181Fr 2 A5 BB lda ARGSIGN 00.001821r 2 MFA: 00.001821r 2 85 B3 sta FACSIGN 00.001823r 2 A2 05 ldx #BYTES_FP 00.001825r 2 L3A7A: 00.001825r 2 B5 B5 lda SHIFTSIGNEXT,x 00.001827r 2 95 AD sta EXPSGN,x 00.001829r 2 CA dex 00.00182Ar 2 D0 F9 bne L3A7A 00.00182Cr 2 86 BD stx FACEXTENSION 00.00182Er 2 60 rts 00.00182Fr 2 00.00182Fr 2 ; ---------------------------------------------------------------------------- 00.00182Fr 2 ; ROUND FAC AND COPY TO ARG 00.00182Fr 2 ; ---------------------------------------------------------------------------- 00.00182Fr 2 COPY_FAC_TO_ARG_ROUNDED: 00.00182Fr 2 20 rr rr jsr ROUND_FAC 00.001832r 2 MAF: 00.001832r 2 A2 06 ldx #BYTES_FP+1 00.001834r 2 L3A89: 00.001834r 2 B5 AD lda EXPSGN,x 00.001836r 2 95 B5 sta SHIFTSIGNEXT,x 00.001838r 2 CA dex 00.001839r 2 D0 F9 bne L3A89 00.00183Br 2 86 BD stx FACEXTENSION 00.00183Dr 2 RTS14: 00.00183Dr 2 60 rts 00.00183Er 2 00.00183Er 2 ; ---------------------------------------------------------------------------- 00.00183Er 2 ; ROUND FAC USING EXTENSION BYTE 00.00183Er 2 ; ---------------------------------------------------------------------------- 00.00183Er 2 ROUND_FAC: 00.00183Er 2 A5 AE lda FAC 00.001840r 2 F0 FB beq RTS14 00.001842r 2 06 BD asl FACEXTENSION 00.001844r 2 90 F7 bcc RTS14 00.001846r 2 00.001846r 2 ; ---------------------------------------------------------------------------- 00.001846r 2 ; INCREMENT MANTISSA AND RE-NORMALIZE IF CARRY 00.001846r 2 ; ---------------------------------------------------------------------------- 00.001846r 2 INCREMENT_MANTISSA: 00.001846r 2 20 rr rr jsr INCREMENT_FAC_MANTISSA 00.001849r 2 D0 F2 bne RTS14 00.00184Br 2 4C rr rr jmp NORMALIZE_FAC6 00.00184Er 2 00.00184Er 2 ; ---------------------------------------------------------------------------- 00.00184Er 2 ; TEST FAC FOR ZERO AND SIGN 00.00184Er 2 ; 00.00184Er 2 ; FAC > 0, RETURN +1 00.00184Er 2 ; FAC = 0, RETURN 0 00.00184Er 2 ; FAC < 0, RETURN -1 00.00184Er 2 ; ---------------------------------------------------------------------------- 00.00184Er 2 SIGN: 00.00184Er 2 A5 AE lda FAC 00.001850r 2 F0 09 beq RTS15 00.001852r 2 L3AA7: 00.001852r 2 A5 B3 lda FACSIGN 00.001854r 2 SIGN2: 00.001854r 2 2A rol a 00.001855r 2 A9 FF lda #$FF 00.001857r 2 B0 02 bcs RTS15 00.001859r 2 A9 01 lda #$01 00.00185Br 2 RTS15: 00.00185Br 2 60 rts 00.00185Cr 2 00.00185Cr 2 ; ---------------------------------------------------------------------------- 00.00185Cr 2 ; "SGN" FUNCTION 00.00185Cr 2 ; ---------------------------------------------------------------------------- 00.00185Cr 2 SGN: 00.00185Cr 2 20 rr rr jsr SIGN 00.00185Fr 2 00.00185Fr 2 ; ---------------------------------------------------------------------------- 00.00185Fr 2 ; CONVERT (A) INTO FAC, AS SIGNED VALUE -128 TO +127 00.00185Fr 2 ; ---------------------------------------------------------------------------- 00.00185Fr 2 FLOAT: 00.00185Fr 2 85 AF sta FAC+1 00.001861r 2 A9 00 lda #$00 00.001863r 2 85 B0 sta FAC+2 00.001865r 2 A2 88 ldx #$88 00.001867r 2 00.001867r 2 ; ---------------------------------------------------------------------------- 00.001867r 2 ; FLOAT UNSIGNED VALUE IN FAC+1,2 00.001867r 2 ; (X) = EXPONENT 00.001867r 2 ; ---------------------------------------------------------------------------- 00.001867r 2 FLOAT1: 00.001867r 2 A5 AF lda FAC+1 00.001869r 2 49 FF eor #$FF 00.00186Br 2 2A rol a 00.00186Cr 2 00.00186Cr 2 ; ---------------------------------------------------------------------------- 00.00186Cr 2 ; FLOAT UNSIGNED VALUE IN FAC+1,2 00.00186Cr 2 ; (X) = EXPONENT 00.00186Cr 2 ; C=0 TO MAKE VALUE NEGATIVE 00.00186Cr 2 ; C=1 TO MAKE VALUE POSITIVE 00.00186Cr 2 ; ---------------------------------------------------------------------------- 00.00186Cr 2 FLOAT2: 00.00186Cr 2 A9 00 lda #$00 00.00186Er 2 .ifndef CONFIG_SMALL 00.00186Er 2 85 B2 sta FAC+4 00.001870r 2 .endif 00.001870r 2 85 B1 sta FAC+3 00.001872r 2 LDB21: 00.001872r 2 86 AE stx FAC 00.001874r 2 85 BD sta FACEXTENSION 00.001876r 2 85 B3 sta FACSIGN 00.001878r 2 4C rr rr jmp NORMALIZE_FAC1 00.00187Br 2 00.00187Br 2 ; ---------------------------------------------------------------------------- 00.00187Br 2 ; "ABS" FUNCTION 00.00187Br 2 ; ---------------------------------------------------------------------------- 00.00187Br 2 ABS: 00.00187Br 2 46 B3 lsr FACSIGN 00.00187Dr 2 60 rts 00.00187Er 2 00.00187Er 2 ; ---------------------------------------------------------------------------- 00.00187Er 2 ; COMPARE FAC WITH PACKED # AT (Y,A) 00.00187Er 2 ; RETURN A=1,0,-1 AS (Y,A) IS <,=,> FAC 00.00187Er 2 ; ---------------------------------------------------------------------------- 00.00187Er 2 FCOMP: 00.00187Er 2 85 71 sta DEST 00.001880r 2 00.001880r 2 ; ---------------------------------------------------------------------------- 00.001880r 2 ; SPECIAL ENTRY FROM "NEXT" PROCESSOR 00.001880r 2 ; "DEST" ALREADY SET UP 00.001880r 2 ; ---------------------------------------------------------------------------- 00.001880r 2 FCOMP2: 00.001880r 2 84 72 sty DEST+1 00.001882r 2 A0 00 ldy #$00 00.001884r 2 B1 71 lda (DEST),y 00.001886r 2 C8 iny 00.001887r 2 AA tax 00.001888r 2 F0 C4 beq SIGN 00.00188Ar 2 B1 71 lda (DEST),y 00.00188Cr 2 45 B3 eor FACSIGN 00.00188Er 2 30 C2 bmi L3AA7 00.001890r 2 E4 AE cpx FAC 00.001892r 2 D0 21 bne L3B0A 00.001894r 2 B1 71 lda (DEST),y 00.001896r 2 09 80 ora #$80 00.001898r 2 C5 AF cmp FAC+1 00.00189Ar 2 D0 19 bne L3B0A 00.00189Cr 2 C8 iny 00.00189Dr 2 B1 71 lda (DEST),y 00.00189Fr 2 C5 B0 cmp FAC+2 00.0018A1r 2 D0 12 bne L3B0A 00.0018A3r 2 C8 iny 00.0018A4r 2 .ifndef CONFIG_SMALL 00.0018A4r 2 B1 71 lda (DEST),y 00.0018A6r 2 C5 B1 cmp FAC+3 00.0018A8r 2 D0 0B bne L3B0A 00.0018AAr 2 C8 iny 00.0018ABr 2 .endif 00.0018ABr 2 A9 7F lda #$7F 00.0018ADr 2 C5 BD cmp FACEXTENSION 00.0018AFr 2 B1 71 lda (DEST),y 00.0018B1r 2 E5 B2 sbc FAC_LAST 00.0018B3r 2 F0 28 beq L3B32 00.0018B5r 2 L3B0A: 00.0018B5r 2 A5 B3 lda FACSIGN 00.0018B7r 2 90 02 bcc L3B10 00.0018B9r 2 49 FF eor #$FF 00.0018BBr 2 L3B10: 00.0018BBr 2 4C rr rr jmp SIGN2 00.0018BEr 2 00.0018BEr 2 ; ---------------------------------------------------------------------------- 00.0018BEr 2 ; QUICK INTEGER FUNCTION 00.0018BEr 2 ; 00.0018BEr 2 ; CONVERTS FP VALUE IN FAC TO INTEGER VALUE 00.0018BEr 2 ; IN FAC+1...FAC+4, BY SHIFTING RIGHT WITH SIGN 00.0018BEr 2 ; EXTENSION UNTIL FRACTIONAL BITS ARE OUT. 00.0018BEr 2 ; 00.0018BEr 2 ; THIS SUBROUTINE ASSUMES THE EXPONENT < 32. 00.0018BEr 2 ; ---------------------------------------------------------------------------- 00.0018BEr 2 QINT: 00.0018BEr 2 A5 AE lda FAC 00.0018C0r 2 F0 4A beq QINT3 00.0018C2r 2 38 sec 00.0018C3r 2 E9 A0 sbc #120+8*BYTES_FP 00.0018C5r 2 24 B3 bit FACSIGN 00.0018C7r 2 10 09 bpl L3B27 00.0018C9r 2 AA tax 00.0018CAr 2 A9 FF lda #$FF 00.0018CCr 2 85 B5 sta SHIFTSIGNEXT 00.0018CEr 2 20 rr rr jsr COMPLEMENT_FAC_MANTISSA 00.0018D1r 2 8A txa 00.0018D2r 2 L3B27: 00.0018D2r 2 A2 AE ldx #FAC 00.0018D4r 2 C9 F9 cmp #$F9 00.0018D6r 2 10 06 bpl QINT2 00.0018D8r 2 20 rr rr jsr SHIFT_RIGHT 00.0018DBr 2 84 B5 sty SHIFTSIGNEXT 00.0018DDr 2 L3B32: 00.0018DDr 2 60 rts 00.0018DEr 2 QINT2: 00.0018DEr 2 A8 tay 00.0018DFr 2 A5 B3 lda FACSIGN 00.0018E1r 2 29 80 and #$80 00.0018E3r 2 46 AF lsr FAC+1 00.0018E5r 2 05 AF ora FAC+1 00.0018E7r 2 85 AF sta FAC+1 00.0018E9r 2 20 rr rr jsr SHIFT_RIGHT4 00.0018ECr 2 84 B5 sty SHIFTSIGNEXT 00.0018EEr 2 60 rts 00.0018EFr 2 00.0018EFr 2 ; ---------------------------------------------------------------------------- 00.0018EFr 2 ; "INT" FUNCTION 00.0018EFr 2 ; 00.0018EFr 2 ; USES QINT TO CONVERT (FAC) TO INTEGER FORM, 00.0018EFr 2 ; AND THEN REFLOATS THE INTEGER. 00.0018EFr 2 ; ---------------------------------------------------------------------------- 00.0018EFr 2 INT: 00.0018EFr 2 A5 AE lda FAC 00.0018F1r 2 C9 A0 cmp #120+8*BYTES_FP 00.0018F3r 2 B0 20 bcs RTS17 00.0018F5r 2 20 rr rr jsr QINT 00.0018F8r 2 84 BD sty FACEXTENSION 00.0018FAr 2 A5 B3 lda FACSIGN 00.0018FCr 2 84 B3 sty FACSIGN 00.0018FEr 2 49 80 eor #$80 00.001900r 2 2A rol a 00.001901r 2 A9 A0 lda #120+8*BYTES_FP 00.001903r 2 85 AE sta FAC 00.001905r 2 A5 B2 lda FAC_LAST 00.001907r 2 85 0A sta CHARAC 00.001909r 2 4C rr rr jmp NORMALIZE_FAC1 00.00190Cr 2 QINT3: 00.00190Cr 2 85 AF sta FAC+1 00.00190Er 2 85 B0 sta FAC+2 00.001910r 2 85 B1 sta FAC+3 00.001912r 2 .ifndef CONFIG_SMALL 00.001912r 2 85 B2 sta FAC+4 00.001914r 2 .endif 00.001914r 2 A8 tay 00.001915r 2 RTS17: 00.001915r 2 60 rts 00.001916r 2 00.001916r 2 ; ---------------------------------------------------------------------------- 00.001916r 2 ; CONVERT STRING TO FP VALUE IN FAC 00.001916r 2 ; 00.001916r 2 ; STRING POINTED TO BY TXTPTR 00.001916r 2 ; FIRST CHAR ALREADY SCANNED BY CHRGET 00.001916r 2 ; (A) = FIRST CHAR, C=0 IF DIGIT. 00.001916r 2 ; ---------------------------------------------------------------------------- 00.001916r 2 FIN: 00.001916r 2 A0 00 ldy #$00 00.001918r 2 A2 0A ldx #SERLEN-TMPEXP 00.00191Ar 2 L3B6F: 00.00191Ar 2 94 AA sty TMPEXP,x 00.00191Cr 2 CA dex 00.00191Dr 2 10 FB bpl L3B6F 00.00191Fr 2 90 0F bcc FIN2 00.001921r 2 C9 2D cmp #$2D 00.001923r 2 D0 04 bne L3B7E 00.001925r 2 86 B4 stx SERLEN 00.001927r 2 F0 04 beq FIN1 00.001929r 2 L3B7E: 00.001929r 2 C9 2B cmp #$2B 00.00192Br 2 D0 05 bne FIN3 00.00192Dr 2 FIN1: 00.00192Dr 2 20 C0 00 jsr CHRGET 00.001930r 2 FIN2: 00.001930r 2 90 6F bcc FIN9 00.001932r 2 FIN3: 00.001932r 2 C9 2E cmp #$2E 00.001934r 2 F0 38 beq FIN10 00.001936r 2 C9 45 cmp #$45 00.001938r 2 D0 44 bne FIN7 00.00193Ar 2 20 C0 00 jsr CHRGET 00.00193Dr 2 90 21 bcc FIN5 00.00193Fr 2 C9 A5 cmp #TOKEN_MINUS 00.001941r 2 F0 0E beq L3BA6 00.001943r 2 C9 2D cmp #$2D 00.001945r 2 F0 0A beq L3BA6 00.001947r 2 C9 A4 cmp #TOKEN_PLUS 00.001949r 2 F0 12 beq FIN4 00.00194Br 2 C9 2B cmp #$2B 00.00194Dr 2 F0 0E beq FIN4 00.00194Fr 2 D0 11 bne FIN6 00.001951r 2 L3BA6: 00.001951r 2 .ifndef CONFIG_ROR_WORKAROUND 00.001951r 2 ror EXPSGN 00.001951r 2 .else 00.001951r 2 A9 00 lda #$00 00.001953r 2 90 02 bcc L3BAC 00.001955r 2 A9 80 lda #$80 00.001957r 2 L3BAC: 00.001957r 2 46 AD lsr EXPSGN 00.001959r 2 05 AD ora EXPSGN 00.00195Br 2 85 AD sta EXPSGN 00.00195Dr 2 .endif 00.00195Dr 2 FIN4: 00.00195Dr 2 20 C0 00 jsr CHRGET 00.001960r 2 FIN5: 00.001960r 2 90 66 bcc GETEXP 00.001962r 2 FIN6: 00.001962r 2 24 AD bit EXPSGN 00.001964r 2 10 18 bpl FIN7 00.001966r 2 A9 00 lda #$00 00.001968r 2 38 sec 00.001969r 2 E5 AB sbc EXPON 00.00196Br 2 4C rr rr jmp FIN8 00.00196Er 2 00.00196Er 2 ; ---------------------------------------------------------------------------- 00.00196Er 2 ; FOUND A DECIMAL POINT 00.00196Er 2 ; ---------------------------------------------------------------------------- 00.00196Er 2 FIN10: 00.00196Er 2 .ifndef CONFIG_ROR_WORKAROUND 00.00196Er 2 ror LOWTR 00.00196Er 2 .else 00.00196Er 2 A9 00 lda #$00 00.001970r 2 90 02 bcc L3BC9 00.001972r 2 A9 80 lda #$80 00.001974r 2 L3BC9: 00.001974r 2 46 AC lsr LOWTR 00.001976r 2 05 AC ora LOWTR 00.001978r 2 85 AC sta LOWTR 00.00197Ar 2 .endif 00.00197Ar 2 24 AC bit LOWTR 00.00197Cr 2 50 AF bvc FIN1 00.00197Er 2 00.00197Er 2 ; ---------------------------------------------------------------------------- 00.00197Er 2 ; NUMBER TERMINATED, ADJUST EXPONENT NOW 00.00197Er 2 ; ---------------------------------------------------------------------------- 00.00197Er 2 FIN7: 00.00197Er 2 A5 AB lda EXPON 00.001980r 2 FIN8: 00.001980r 2 38 sec 00.001981r 2 E5 AA sbc INDX 00.001983r 2 85 AB sta EXPON 00.001985r 2 F0 12 beq L3BEE 00.001987r 2 10 09 bpl L3BE7 00.001989r 2 L3BDE: 00.001989r 2 20 rr rr jsr DIV10 00.00198Cr 2 E6 AB inc EXPON 00.00198Er 2 D0 F9 bne L3BDE 00.001990r 2 F0 07 beq L3BEE 00.001992r 2 L3BE7: 00.001992r 2 20 rr rr jsr MUL10 00.001995r 2 C6 AB dec EXPON 00.001997r 2 D0 F9 bne L3BE7 00.001999r 2 L3BEE: 00.001999r 2 A5 B4 lda SERLEN 00.00199Br 2 30 01 bmi L3BF3 00.00199Dr 2 60 rts 00.00199Er 2 L3BF3: 00.00199Er 2 4C rr rr jmp NEGOP 00.0019A1r 2 00.0019A1r 2 ; ---------------------------------------------------------------------------- 00.0019A1r 2 ; ACCUMULATE A DIGIT INTO FAC 00.0019A1r 2 ; ---------------------------------------------------------------------------- 00.0019A1r 2 FIN9: 00.0019A1r 2 48 pha 00.0019A2r 2 24 AC bit LOWTR 00.0019A4r 2 10 02 bpl L3BFD 00.0019A6r 2 E6 AA inc INDX 00.0019A8r 2 L3BFD: 00.0019A8r 2 20 rr rr jsr MUL10 00.0019ABr 2 68 pla 00.0019ACr 2 38 sec 00.0019ADr 2 E9 30 sbc #$30 00.0019AFr 2 20 rr rr jsr ADDACC 00.0019B2r 2 4C rr rr jmp FIN1 00.0019B5r 2 00.0019B5r 2 ; ---------------------------------------------------------------------------- 00.0019B5r 2 ; ADD (A) TO FAC 00.0019B5r 2 ; ---------------------------------------------------------------------------- 00.0019B5r 2 ADDACC: 00.0019B5r 2 48 pha 00.0019B6r 2 20 rr rr jsr COPY_FAC_TO_ARG_ROUNDED 00.0019B9r 2 68 pla 00.0019BAr 2 20 rr rr jsr FLOAT 00.0019BDr 2 A5 BB lda ARGSIGN 00.0019BFr 2 45 B3 eor FACSIGN 00.0019C1r 2 85 BC sta SGNCPR 00.0019C3r 2 A6 AE ldx FAC 00.0019C5r 2 4C rr rr jmp FADDT 00.0019C8r 2 00.0019C8r 2 ; ---------------------------------------------------------------------------- 00.0019C8r 2 ; ACCUMULATE DIGIT OF EXPONENT 00.0019C8r 2 ; ---------------------------------------------------------------------------- 00.0019C8r 2 GETEXP: 00.0019C8r 2 A5 AB lda EXPON 00.0019CAr 2 C9 0A cmp #MAX_EXPON 00.0019CCr 2 90 09 bcc L3C2C 00.0019CEr 2 .ifdef CONFIG_10A 00.0019CEr 2 A9 64 lda #$64 00.0019D0r 2 .endif 00.0019D0r 2 24 AD bit EXPSGN 00.0019D2r 2 .ifdef CONFIG_10A 00.0019D2r 2 30 11 bmi L3C3A 00.0019D4r 2 .else 00.0019D4r 2 bmi LDC70 00.0019D4r 2 .endif 00.0019D4r 2 4C rr rr jmp OVERFLOW 00.0019D7r 2 LDC70: 00.0019D7r 2 .ifndef CONFIG_10A 00.0019D7r 2 lda #$0B 00.0019D7r 2 .endif 00.0019D7r 2 L3C2C: 00.0019D7r 2 0A asl a 00.0019D8r 2 0A asl a 00.0019D9r 2 18 clc 00.0019DAr 2 65 AB adc EXPON 00.0019DCr 2 0A asl a 00.0019DDr 2 18 clc 00.0019DEr 2 A0 00 ldy #$00 00.0019E0r 2 71 C7 adc (TXTPTR),y 00.0019E2r 2 38 sec 00.0019E3r 2 E9 30 sbc #$30 00.0019E5r 2 L3C3A: 00.0019E5r 2 85 AB sta EXPON 00.0019E7r 2 4C rr rr jmp FIN4 00.0019EAr 2 00.0019EAr 2 ; ---------------------------------------------------------------------------- 00.0019EAr 2 .ifdef CONFIG_SMALL 00.0019EAr 2 ; these values are /1000 of what the labels say 00.0019EAr 2 CON_99999999_9: 00.0019EAr 2 .byte $91,$43,$4F,$F8 00.0019EAr 2 CON_999999999: 00.0019EAr 2 .byte $94,$74,$23,$F7 00.0019EAr 2 CON_BILLION: 00.0019EAr 2 .byte $94,$74,$24,$00 00.0019EAr 2 .else 00.0019EAr 2 CON_99999999_9: 00.0019EAr 2 9B 3E BC 1F .byte $9B,$3E,$BC,$1F,$FD 00.0019EEr 2 FD 00.0019EFr 2 CON_999999999: 00.0019EFr 2 .ifndef CONFIG_10A 00.0019EFr 2 .byte $9E,$6E,$6B,$27,$FE 00.0019EFr 2 .else 00.0019EFr 2 9E 6E 6B 27 .byte $9E,$6E,$6B,$27,$FD 00.0019F3r 2 FD 00.0019F4r 2 .endif 00.0019F4r 2 CON_BILLION: 00.0019F4r 2 9E 6E 6B 28 .byte $9E,$6E,$6B,$28,$00 00.0019F8r 2 00 00.0019F9r 2 .endif 00.0019F9r 2 00.0019F9r 2 ; ---------------------------------------------------------------------------- 00.0019F9r 2 ; PRINT "IN " 00.0019F9r 2 ; ---------------------------------------------------------------------------- 00.0019F9r 2 INPRT: 00.0019F9r 2 .ifdef KBD 00.0019F9r 2 jsr LFE0B 00.0019F9r 2 .byte " in" 00.0019F9r 2 .byte 0 00.0019F9r 2 .else 00.0019F9r 2 A9 rr lda #QT_IN 00.0019FDr 2 20 rr rr jsr GOSTROUT2 00.001A00r 2 .endif 00.001A00r 2 A5 87 lda CURLIN+1 00.001A02r 2 A6 86 ldx CURLIN 00.001A04r 2 00.001A04r 2 ; ---------------------------------------------------------------------------- 00.001A04r 2 ; PRINT A,X AS DECIMAL INTEGER 00.001A04r 2 ; ---------------------------------------------------------------------------- 00.001A04r 2 LINPRT: 00.001A04r 2 85 AF sta FAC+1 00.001A06r 2 86 B0 stx FAC+2 00.001A08r 2 A2 90 ldx #$90 00.001A0Ar 2 38 sec 00.001A0Br 2 20 rr rr jsr FLOAT2 00.001A0Er 2 20 rr rr jsr FOUT 00.001A11r 2 GOSTROUT2: 00.001A11r 2 4C rr rr jmp STROUT 00.001A14r 2 00.001A14r 2 ; ---------------------------------------------------------------------------- 00.001A14r 2 ; CONVERT (FAC) TO STRING STARTING AT STACK 00.001A14r 2 ; RETURN WITH (Y,A) POINTING AT STRING 00.001A14r 2 ; ---------------------------------------------------------------------------- 00.001A14r 2 FOUT: 00.001A14r 2 A0 01 ldy #$01 00.001A16r 2 00.001A16r 2 ; ---------------------------------------------------------------------------- 00.001A16r 2 ; "STR$" FUNCTION ENTERS HERE, WITH (Y)=0 00.001A16r 2 ; SO THAT RESULT STRING STARTS AT STACK-1 00.001A16r 2 ; (THIS IS USED AS A FLAG) 00.001A16r 2 ; ---------------------------------------------------------------------------- 00.001A16r 2 FOUT1: 00.001A16r 2 A9 20 lda #$20 00.001A18r 2 24 B3 bit FACSIGN 00.001A1Ar 2 10 02 bpl L3C73 00.001A1Cr 2 A9 2D lda #$2D 00.001A1Er 2 L3C73: 00.001A1Er 2 99 FF 00 sta $FF,y 00.001A21r 2 85 B3 sta FACSIGN 00.001A23r 2 84 BE sty STRNG2 00.001A25r 2 C8 iny 00.001A26r 2 A9 30 lda #$30 00.001A28r 2 A6 AE ldx FAC 00.001A2Ar 2 D0 03 bne L3C84 00.001A2Cr 2 4C rr rr jmp FOUT4 00.001A2Fr 2 L3C84: 00.001A2Fr 2 A9 00 lda #$00 00.001A31r 2 E0 80 cpx #$80 00.001A33r 2 F0 02 beq L3C8C 00.001A35r 2 B0 09 bcs L3C95 00.001A37r 2 L3C8C: 00.001A37r 2 A9 rr lda #CON_BILLION 00.001A3Br 2 20 rr rr jsr FMULT 00.001A3Er 2 .ifdef CONFIG_SMALL 00.001A3Er 2 lda #<-6 ; exponent adjustment 00.001A3Er 2 .else 00.001A3Er 2 A9 F7 lda #<-9 00.001A40r 2 .endif 00.001A40r 2 L3C95: 00.001A40r 2 85 AA sta INDX 00.001A42r 2 ; ---------------------------------------------------------------------------- 00.001A42r 2 ; ADJUST UNTIL 1E8 <= (FAC) <1E9 00.001A42r 2 ; ---------------------------------------------------------------------------- 00.001A42r 2 L3C97: 00.001A42r 2 A9 rr lda #CON_999999999 00.001A46r 2 20 rr rr jsr FCOMP 00.001A49r 2 F0 1E beq L3CBE 00.001A4Br 2 10 12 bpl L3CB4 00.001A4Dr 2 L3CA2: 00.001A4Dr 2 A9 rr lda #CON_99999999_9 00.001A51r 2 20 rr rr jsr FCOMP 00.001A54r 2 F0 02 beq L3CAD 00.001A56r 2 10 0E bpl L3CBB 00.001A58r 2 L3CAD: 00.001A58r 2 20 rr rr jsr MUL10 00.001A5Br 2 C6 AA dec INDX 00.001A5Dr 2 D0 EE bne L3CA2 00.001A5Fr 2 L3CB4: 00.001A5Fr 2 20 rr rr jsr DIV10 00.001A62r 2 E6 AA inc INDX 00.001A64r 2 D0 DC bne L3C97 00.001A66r 2 L3CBB: 00.001A66r 2 20 rr rr jsr FADDH 00.001A69r 2 L3CBE: 00.001A69r 2 20 rr rr jsr QINT 00.001A6Cr 2 ; ---------------------------------------------------------------------------- 00.001A6Cr 2 ; FAC+1...FAC+4 IS NOW IN INTEGER FORM 00.001A6Cr 2 ; WITH POWER OF TEN ADJUSTMENT IN TMPEXP 00.001A6Cr 2 ; 00.001A6Cr 2 ; IF -10 < TMPEXP > 1, PRINT IN DECIMAL FORM 00.001A6Cr 2 ; OTHERWISE, PRINT IN EXPONENTIAL FORM 00.001A6Cr 2 ; ---------------------------------------------------------------------------- 00.001A6Cr 2 A2 01 ldx #$01 00.001A6Er 2 A5 AA lda INDX 00.001A70r 2 18 clc 00.001A71r 2 69 0A adc #3*BYTES_FP-5 00.001A73r 2 30 09 bmi L3CD3 00.001A75r 2 C9 0B cmp #3*BYTES_FP-4 00.001A77r 2 B0 06 bcs L3CD4 00.001A79r 2 69 FF adc #$FF 00.001A7Br 2 AA tax 00.001A7Cr 2 A9 02 lda #$02 00.001A7Er 2 L3CD3: 00.001A7Er 2 38 sec 00.001A7Fr 2 L3CD4: 00.001A7Fr 2 E9 02 sbc #$02 00.001A81r 2 85 AB sta EXPON 00.001A83r 2 86 AA stx INDX 00.001A85r 2 8A txa 00.001A86r 2 F0 02 beq L3CDF 00.001A88r 2 10 13 bpl L3CF2 00.001A8Ar 2 L3CDF: 00.001A8Ar 2 A4 BE ldy STRNG2 00.001A8Cr 2 A9 2E lda #$2E 00.001A8Er 2 C8 iny 00.001A8Fr 2 99 FF 00 sta $FF,y 00.001A92r 2 8A txa 00.001A93r 2 F0 06 beq L3CF0 00.001A95r 2 A9 30 lda #$30 00.001A97r 2 C8 iny 00.001A98r 2 99 FF 00 sta $FF,y 00.001A9Br 2 L3CF0: 00.001A9Br 2 84 BE sty STRNG2 00.001A9Dr 2 ; ---------------------------------------------------------------------------- 00.001A9Dr 2 ; NOW DIVIDE BY POWERS OF TEN TO GET SUCCESSIVE DIGITS 00.001A9Dr 2 ; ---------------------------------------------------------------------------- 00.001A9Dr 2 L3CF2: 00.001A9Dr 2 A0 00 ldy #$00 00.001A9Fr 2 LDD3A: 00.001A9Fr 2 A2 80 ldx #$80 00.001AA1r 2 L3CF6: 00.001AA1r 2 A5 B2 lda FAC_LAST 00.001AA3r 2 18 clc 00.001AA4r 2 .ifndef CONFIG_SMALL 00.001AA4r 2 79 rr rr adc DECTBL+3,y 00.001AA7r 2 85 B2 sta FAC+4 00.001AA9r 2 A5 B1 lda FAC+3 00.001AABr 2 .endif 00.001AABr 2 79 rr rr adc DECTBL+2,y 00.001AAEr 2 85 B1 sta FAC+3 00.001AB0r 2 A5 B0 lda FAC+2 00.001AB2r 2 79 rr rr adc DECTBL+1,y 00.001AB5r 2 85 B0 sta FAC+2 00.001AB7r 2 A5 AF lda FAC+1 00.001AB9r 2 79 rr rr adc DECTBL,y 00.001ABCr 2 85 AF sta FAC+1 00.001ABEr 2 E8 inx 00.001ABFr 2 B0 04 bcs L3D1A 00.001AC1r 2 10 DE bpl L3CF6 00.001AC3r 2 30 02 bmi L3D1C 00.001AC5r 2 L3D1A: 00.001AC5r 2 30 DA bmi L3CF6 00.001AC7r 2 L3D1C: 00.001AC7r 2 8A txa 00.001AC8r 2 90 04 bcc L3D23 00.001ACAr 2 49 FF eor #$FF 00.001ACCr 2 69 0A adc #$0A 00.001ACEr 2 L3D23: 00.001ACEr 2 69 2F adc #$2F 00.001AD0r 2 C8 iny 00.001AD1r 2 C8 iny 00.001AD2r 2 C8 iny 00.001AD3r 2 .ifndef CONFIG_SMALL 00.001AD3r 2 C8 iny 00.001AD4r 2 .endif 00.001AD4r 2 84 94 sty VARPNT 00.001AD6r 2 A4 BE ldy STRNG2 00.001AD8r 2 C8 iny 00.001AD9r 2 AA tax 00.001ADAr 2 29 7F and #$7F 00.001ADCr 2 99 FF 00 sta $FF,y 00.001ADFr 2 C6 AA dec INDX 00.001AE1r 2 D0 06 bne L3D3E 00.001AE3r 2 A9 2E lda #$2E 00.001AE5r 2 C8 iny 00.001AE6r 2 99 FF 00 sta $FF,y 00.001AE9r 2 L3D3E: 00.001AE9r 2 84 BE sty STRNG2 00.001AEBr 2 A4 94 ldy VARPNT 00.001AEDr 2 8A txa 00.001AEEr 2 49 FF eor #$FF 00.001AF0r 2 29 80 and #$80 00.001AF2r 2 AA tax 00.001AF3r 2 C0 24 cpy #DECTBL_END-DECTBL 00.001AF5r 2 .ifdef CONFIG_CBM_ALL 00.001AF5r 2 beq LDD96 00.001AF5r 2 cpy #$3C ; XXX 00.001AF5r 2 .endif 00.001AF5r 2 D0 AA bne L3CF6 00.001AF7r 2 ; ---------------------------------------------------------------------------- 00.001AF7r 2 ; NINE DIGITS HAVE BEEN STORED IN STRING. NOW LOOK 00.001AF7r 2 ; BACK AND LOP OFF TRAILING ZEROES AND A TRAILING 00.001AF7r 2 ; DECIMAL POINT. 00.001AF7r 2 ; ---------------------------------------------------------------------------- 00.001AF7r 2 LDD96: 00.001AF7r 2 A4 BE ldy STRNG2 00.001AF9r 2 L3D4E: 00.001AF9r 2 B9 FF 00 lda $FF,y 00.001AFCr 2 88 dey 00.001AFDr 2 C9 30 cmp #$30 00.001AFFr 2 F0 F8 beq L3D4E 00.001B01r 2 C9 2E cmp #$2E 00.001B03r 2 F0 01 beq L3D5B 00.001B05r 2 C8 iny 00.001B06r 2 L3D5B: 00.001B06r 2 A9 2B lda #$2B 00.001B08r 2 A6 AB ldx EXPON 00.001B0Ar 2 F0 2E beq L3D8F 00.001B0Cr 2 10 08 bpl L3D6B 00.001B0Er 2 A9 00 lda #$00 00.001B10r 2 38 sec 00.001B11r 2 E5 AB sbc EXPON 00.001B13r 2 AA tax 00.001B14r 2 A9 2D lda #$2D 00.001B16r 2 L3D6B: 00.001B16r 2 99 01 01 sta STACK+1,y 00.001B19r 2 A9 45 lda #$45 00.001B1Br 2 99 00 01 sta STACK,y 00.001B1Er 2 8A txa 00.001B1Fr 2 A2 2F ldx #$2F 00.001B21r 2 38 sec 00.001B22r 2 L3D77: 00.001B22r 2 E8 inx 00.001B23r 2 E9 0A sbc #$0A 00.001B25r 2 B0 FB bcs L3D77 00.001B27r 2 69 3A adc #$3A 00.001B29r 2 99 03 01 sta STACK+3,y 00.001B2Cr 2 8A txa 00.001B2Dr 2 99 02 01 sta STACK+2,y 00.001B30r 2 A9 00 lda #$00 00.001B32r 2 99 04 01 sta STACK+4,y 00.001B35r 2 F0 08 beq L3D94 00.001B37r 2 FOUT4: 00.001B37r 2 99 FF 00 sta $FF,y 00.001B3Ar 2 L3D8F: 00.001B3Ar 2 A9 00 lda #$00 00.001B3Cr 2 99 00 01 sta STACK,y 00.001B3Fr 2 L3D94: 00.001B3Fr 2 A9 00 lda #$00 00.001B41r 2 A0 01 ldy #$01 00.001B43r 2 60 rts 00.001B44r 2 00.001B44r 2 ; ---------------------------------------------------------------------------- 00.001B44r 2 CON_HALF: 00.001B44r 2 .ifdef CONFIG_SMALL 00.001B44r 2 .byte $80,$00,$00,$00 00.001B44r 2 .else 00.001B44r 2 80 00 00 00 .byte $80,$00,$00,$00,$00 00.001B48r 2 00 00.001B49r 2 .endif 00.001B49r 2 00.001B49r 2 ; ---------------------------------------------------------------------------- 00.001B49r 2 ; POWERS OF 10 FROM 1E8 DOWN TO 1, 00.001B49r 2 ; AS 32-BIT INTEGERS, WITH ALTERNATING SIGNS 00.001B49r 2 ; ---------------------------------------------------------------------------- 00.001B49r 2 DECTBL: 00.001B49r 2 .ifdef CONFIG_SMALL 00.001B49r 2 .byte $FE,$79,$60 ; -100000 00.001B49r 2 .byte $00,$27,$10 ; 10000 00.001B49r 2 .byte $FF,$FC,$18 ; -1000 00.001B49r 2 .byte $00,$00,$64 ; 100 00.001B49r 2 .byte $FF,$FF,$F6 ; -10 00.001B49r 2 .byte $00,$00,$01 ; 1 00.001B49r 2 .else 00.001B49r 2 FA 0A 1F 00 .byte $FA,$0A,$1F,$00 ; -100000000 00.001B4Dr 2 00 98 96 80 .byte $00,$98,$96,$80 ; 10000000 00.001B51r 2 FF F0 BD C0 .byte $FF,$F0,$BD,$C0 ; -1000000 00.001B55r 2 00 01 86 A0 .byte $00,$01,$86,$A0 ; 100000 00.001B59r 2 FF FF D8 F0 .byte $FF,$FF,$D8,$F0 ; -10000 00.001B5Dr 2 00 00 03 E8 .byte $00,$00,$03,$E8 ; 1000 00.001B61r 2 FF FF FF 9C .byte $FF,$FF,$FF,$9C ; -100 00.001B65r 2 00 00 00 0A .byte $00,$00,$00,$0A ; 10 00.001B69r 2 FF FF FF FF .byte $FF,$FF,$FF,$FF ; -1 00.001B6Dr 2 .endif 00.001B6Dr 2 DECTBL_END: 00.001B6Dr 2 .ifdef CONFIG_CBM_ALL 00.001B6Dr 2 .byte $FF,$DF,$0A,$80 ; TI$ 00.001B6Dr 2 .byte $00,$03,$4B,$C0 00.001B6Dr 2 .byte $FF,$FF,$73,$60 00.001B6Dr 2 .byte $00,$00,$0E,$10 00.001B6Dr 2 .byte $FF,$FF,$FD,$A8 00.001B6Dr 2 .byte $00,$00,$00,$3C 00.001B6Dr 2 .endif 00.001B6Dr 2 .ifdef CONFIG_2 00.001B6Dr 2 C_ZERO = CON_HALF + 2 00.001B6Dr 2 .endif 00.001B6Dr 2 00.001B6Dr 2 ; ---------------------------------------------------------------------------- 00.001B6Dr 2 ; "SQR" FUNCTION 00.001B6Dr 2 ; ---------------------------------------------------------------------------- 00.001B6Dr 2 SQR: 00.001B6Dr 2 20 rr rr jsr COPY_FAC_TO_ARG_ROUNDED 00.001B70r 2 A9 rr lda #CON_HALF 00.001B74r 2 20 rr rr jsr LOAD_FAC_FROM_YA 00.001B77r 2 00.001B77r 2 ; ---------------------------------------------------------------------------- 00.001B77r 2 ; EXPONENTIATION OPERATION 00.001B77r 2 ; 00.001B77r 2 ; ARG ^ FAC = EXP( LOG(ARG) * FAC ) 00.001B77r 2 ; ---------------------------------------------------------------------------- 00.001B77r 2 FPWRT: 00.001B77r 2 F0 70 beq EXP 00.001B79r 2 A5 B6 lda ARG 00.001B7Br 2 D0 03 bne L3DD5 00.001B7Dr 2 4C rr rr jmp STA_IN_FAC_SIGN_AND_EXP 00.001B80r 2 L3DD5: 00.001B80r 2 A2 9B ldx #TEMP3 00.001B82r 2 A0 00 ldy #$00 00.001B84r 2 20 rr rr jsr STORE_FAC_AT_YX_ROUNDED 00.001B87r 2 A5 BB lda ARGSIGN 00.001B89r 2 10 0F bpl L3DEF 00.001B8Br 2 20 rr rr jsr INT 00.001B8Er 2 A9 9B lda #TEMP3 00.001B90r 2 A0 00 ldy #$00 00.001B92r 2 20 rr rr jsr FCOMP 00.001B95r 2 D0 03 bne L3DEF 00.001B97r 2 98 tya 00.001B98r 2 A4 0A ldy CHARAC 00.001B9Ar 2 L3DEF: 00.001B9Ar 2 20 rr rr jsr MFA 00.001B9Dr 2 98 tya 00.001B9Er 2 48 pha 00.001B9Fr 2 20 rr rr jsr LOG 00.001BA2r 2 A9 9B lda #TEMP3 00.001BA4r 2 A0 00 ldy #$00 00.001BA6r 2 20 rr rr jsr FMULT 00.001BA9r 2 20 rr rr jsr EXP 00.001BACr 2 68 pla 00.001BADr 2 4A lsr a 00.001BAEr 2 90 0A bcc L3E0F 00.001BB0r 2 00.001BB0r 2 ; ---------------------------------------------------------------------------- 00.001BB0r 2 ; NEGATE VALUE IN FAC 00.001BB0r 2 ; ---------------------------------------------------------------------------- 00.001BB0r 2 NEGOP: 00.001BB0r 2 A5 AE lda FAC 00.001BB2r 2 F0 06 beq L3E0F 00.001BB4r 2 A5 B3 lda FACSIGN 00.001BB6r 2 49 FF eor #$FF 00.001BB8r 2 85 B3 sta FACSIGN 00.001BBAr 2 L3E0F: 00.001BBAr 2 60 rts 00.001BBBr 2 00.001BBBr 2 ; ---------------------------------------------------------------------------- 00.001BBBr 2 .ifdef CONFIG_SMALL 00.001BBBr 2 CON_LOG_E: 00.001BBBr 2 .byte $81,$38,$AA,$3B 00.001BBBr 2 POLY_EXP: 00.001BBBr 2 .byte $06 00.001BBBr 2 .byte $74,$63,$90,$8C 00.001BBBr 2 .byte $77,$23,$0C,$AB 00.001BBBr 2 .byte $7A,$1E,$94,$00 00.001BBBr 2 .byte $7C,$63,$42,$80 00.001BBBr 2 .byte $7E,$75,$FE,$D0 00.001BBBr 2 .byte $80,$31,$72,$15 00.001BBBr 2 .byte $81,$00,$00,$00 00.001BBBr 2 .else 00.001BBBr 2 CON_LOG_E: 00.001BBBr 2 81 38 AA 3B .byte $81,$38,$AA,$3B,$29 00.001BBFr 2 29 00.001BC0r 2 POLY_EXP: 00.001BC0r 2 07 .byte $07 00.001BC1r 2 71 34 58 3E .byte $71,$34,$58,$3E,$56 00.001BC5r 2 56 00.001BC6r 2 74 16 7E B3 .byte $74,$16,$7E,$B3,$1B 00.001BCAr 2 1B 00.001BCBr 2 77 2F EE E3 .byte $77,$2F,$EE,$E3,$85 00.001BCFr 2 85 00.001BD0r 2 7A 1D 84 1C .byte $7A,$1D,$84,$1C,$2A 00.001BD4r 2 2A 00.001BD5r 2 7C 63 59 58 .byte $7C,$63,$59,$58,$0A 00.001BD9r 2 0A 00.001BDAr 2 7E 75 FD E7 .byte $7E,$75,$FD,$E7,$C6 00.001BDEr 2 C6 00.001BDFr 2 80 31 72 18 .byte $80,$31,$72,$18,$10 00.001BE3r 2 10 00.001BE4r 2 81 00 00 00 .byte $81,$00,$00,$00,$00 00.001BE8r 2 00 00.001BE9r 2 .endif 00.001BE9r 2 00.001BE9r 2 ; ---------------------------------------------------------------------------- 00.001BE9r 2 ; "EXP" FUNCTION 00.001BE9r 2 ; 00.001BE9r 2 ; FAC = E ^ FAC 00.001BE9r 2 ; ---------------------------------------------------------------------------- 00.001BE9r 2 EXP: 00.001BE9r 2 A9 rr lda #CON_LOG_E 00.001BEDr 2 20 rr rr jsr FMULT 00.001BF0r 2 A5 BD lda FACEXTENSION 00.001BF2r 2 69 50 adc #$50 00.001BF4r 2 90 03 bcc L3E4E 00.001BF6r 2 20 rr rr jsr INCREMENT_MANTISSA 00.001BF9r 2 L3E4E: 00.001BF9r 2 85 A3 sta ARGEXTENSION 00.001BFBr 2 20 rr rr jsr MAF 00.001BFEr 2 A5 AE lda FAC 00.001C00r 2 C9 88 cmp #$88 00.001C02r 2 90 03 bcc L3E5C 00.001C04r 2 L3E59: 00.001C04r 2 20 rr rr jsr OUTOFRNG 00.001C07r 2 L3E5C: 00.001C07r 2 20 rr rr jsr INT 00.001C0Ar 2 A5 0A lda CHARAC 00.001C0Cr 2 18 clc 00.001C0Dr 2 69 81 adc #$81 00.001C0Fr 2 F0 F3 beq L3E59 00.001C11r 2 38 sec 00.001C12r 2 E9 01 sbc #$01 00.001C14r 2 48 pha 00.001C15r 2 A2 05 ldx #BYTES_FP 00.001C17r 2 L3E6C: 00.001C17r 2 B5 B6 lda ARG,x 00.001C19r 2 B4 AE ldy FAC,x 00.001C1Br 2 95 AE sta FAC,x 00.001C1Dr 2 94 B6 sty ARG,x 00.001C1Fr 2 CA dex 00.001C20r 2 10 F5 bpl L3E6C 00.001C22r 2 A5 A3 lda ARGEXTENSION 00.001C24r 2 85 BD sta FACEXTENSION 00.001C26r 2 20 rr rr jsr FSUBT 00.001C29r 2 20 rr rr jsr NEGOP 00.001C2Cr 2 A9 rr lda #POLY_EXP 00.001C30r 2 20 rr rr jsr POLYNOMIAL 00.001C33r 2 A9 00 lda #$00 00.001C35r 2 85 BC sta SGNCPR 00.001C37r 2 68 pla 00.001C38r 2 20 rr rr jsr ADD_EXPONENTS1 00.001C3Br 2 60 rts 00.001C3Cr 2 00.001C3Cr 2 ; ---------------------------------------------------------------------------- 00.001C3Cr 2 ; ODD POLYNOMIAL SUBROUTINE 00.001C3Cr 2 ; 00.001C3Cr 2 ; F(X) = X * P(X^2) 00.001C3Cr 2 ; 00.001C3Cr 2 ; WHERE: X IS VALUE IN FAC 00.001C3Cr 2 ; Y,A POINTS AT COEFFICIENT TABLE 00.001C3Cr 2 ; FIRST BYTE OF COEFF. TABLE IS N 00.001C3Cr 2 ; COEFFICIENTS FOLLOW, HIGHEST POWER FIRST 00.001C3Cr 2 ; 00.001C3Cr 2 ; P(X^2) COMPUTED USING NORMAL POLYNOMIAL SUBROUTINE 00.001C3Cr 2 ; ---------------------------------------------------------------------------- 00.001C3Cr 2 POLYNOMIAL_ODD: 00.001C3Cr 2 85 BE sta STRNG2 00.001C3Er 2 84 BF sty STRNG2+1 00.001C40r 2 20 rr rr jsr STORE_FAC_IN_TEMP1_ROUNDED 00.001C43r 2 A9 A4 lda #TEMP1X 00.001C45r 2 20 rr rr jsr FMULT 00.001C48r 2 20 rr rr jsr SERMAIN 00.001C4Br 2 A9 A4 lda #TEMP1X 00.001C4Dr 2 A0 00 ldy #$00 00.001C4Fr 2 4C rr rr jmp FMULT 00.001C52r 2 00.001C52r 2 ; ---------------------------------------------------------------------------- 00.001C52r 2 ; NORMAL POLYNOMIAL SUBROUTINE 00.001C52r 2 ; 00.001C52r 2 ; P(X) = C(0)*X^N + C(1)*X^(N-1) + ... + C(N) 00.001C52r 2 ; 00.001C52r 2 ; WHERE: X IS VALUE IN FAC 00.001C52r 2 ; Y,A POINTS AT COEFFICIENT TABLE 00.001C52r 2 ; FIRST BYTE OF COEFF. TABLE IS N 00.001C52r 2 ; COEFFICIENTS FOLLOW, HIGHEST POWER FIRST 00.001C52r 2 ; ---------------------------------------------------------------------------- 00.001C52r 2 POLYNOMIAL: 00.001C52r 2 85 BE sta STRNG2 00.001C54r 2 84 BF sty STRNG2+1 00.001C56r 2 SERMAIN: 00.001C56r 2 20 rr rr jsr STORE_FAC_IN_TEMP2_ROUNDED 00.001C59r 2 B1 BE lda (STRNG2),y 00.001C5Br 2 85 B4 sta SERLEN 00.001C5Dr 2 A4 BE ldy STRNG2 00.001C5Fr 2 C8 iny 00.001C60r 2 98 tya 00.001C61r 2 D0 02 bne L3EBA 00.001C63r 2 E6 BF inc STRNG2+1 00.001C65r 2 L3EBA: 00.001C65r 2 85 BE sta STRNG2 00.001C67r 2 A4 BF ldy STRNG2+1 00.001C69r 2 L3EBE: 00.001C69r 2 20 rr rr jsr FMULT 00.001C6Cr 2 A5 BE lda STRNG2 00.001C6Er 2 A4 BF ldy STRNG2+1 00.001C70r 2 18 clc 00.001C71r 2 69 05 adc #BYTES_FP 00.001C73r 2 90 01 bcc L3ECB 00.001C75r 2 C8 iny 00.001C76r 2 L3ECB: 00.001C76r 2 85 BE sta STRNG2 00.001C78r 2 84 BF sty STRNG2+1 00.001C7Ar 2 20 rr rr jsr FADD 00.001C7Dr 2 A9 A9 lda #TEMP2 00.001C7Fr 2 A0 00 ldy #$00 00.001C81r 2 C6 B4 dec SERLEN 00.001C83r 2 D0 E4 bne L3EBE 00.001C85r 2 RTS19: 00.001C85r 2 60 rts 00.001C86r 2 00.001C86r 1 .include "chrget.s" 00.001C86r 2 .segment "CHRGET" 0B.000000r 2 RAMSTART1: 0B.000000r 2 GENERIC_CHRGET: 0B.000000r 2 E6 C7 inc TXTPTR 0B.000002r 2 D0 02 bne GENERIC_CHRGOT 0B.000004r 2 E6 C8 inc TXTPTR+1 0B.000006r 2 GENERIC_CHRGOT: 0B.000006r 2 GENERIC_TXTPTR = GENERIC_CHRGOT + 1 0B.000006r 2 AD 60 EA lda $EA60 0B.000009r 2 .ifdef KBD 0B.000009r 2 jsr LF430 0B.000009r 2 .endif 0B.000009r 2 C9 3A cmp #$3A 0B.00000Br 2 B0 0A bcs L4058 0B.00000Dr 2 GENERIC_CHRGOT2: 0B.00000Dr 2 C9 20 cmp #$20 0B.00000Fr 2 F0 EF beq GENERIC_CHRGET 0B.000011r 2 38 sec 0B.000012r 2 E9 30 sbc #$30 0B.000014r 2 38 sec 0B.000015r 2 E9 D0 sbc #$D0 0B.000017r 2 L4058: 0B.000017r 2 60 rts 0B.000018r 2 0B.000018r 1 .include "rnd.s" 0B.000018r 2 .segment "CODE" 00.001C86r 2 00.001C86r 2 ; ---------------------------------------------------------------------------- 00.001C86r 2 ; "RND" FUNCTION 00.001C86r 2 ; ---------------------------------------------------------------------------- 00.001C86r 2 00.001C86r 2 .ifdef KBD 00.001C86r 2 RND: 00.001C86r 2 ldx #$10 00.001C86r 2 jsr SIGN 00.001C86r 2 beq LFC26 00.001C86r 2 bmi LFC10 00.001C86r 2 lda RNDSEED 00.001C86r 2 ldy RNDSEED+1 00.001C86r 2 LFBFA: 00.001C86r 2 sta FAC+2 00.001C86r 2 sty FAC+1 00.001C86r 2 LFBFE: 00.001C86r 2 asl a 00.001C86r 2 asl a 00.001C86r 2 eor FAC+2 00.001C86r 2 asl a 00.001C86r 2 eor FAC+1 00.001C86r 2 asl a 00.001C86r 2 asl a 00.001C86r 2 asl a 00.001C86r 2 asl a 00.001C86r 2 eor FAC+1 00.001C86r 2 asl a 00.001C86r 2 rol FAC+2 00.001C86r 2 rol FAC+1 00.001C86r 2 LFC10: 00.001C86r 2 lda FAC+2 00.001C86r 2 dex 00.001C86r 2 bne LFBFE 00.001C86r 2 sta RNDSEED 00.001C86r 2 sta FAC+3 00.001C86r 2 lda FAC+1 00.001C86r 2 sta RNDSEED+1 00.001C86r 2 lda #$80 00.001C86r 2 sta FAC 00.001C86r 2 stx FACSIGN 00.001C86r 2 jmp NORMALIZE_FAC2 00.001C86r 2 LFC26: 00.001C86r 2 ldy $03CA 00.001C86r 2 lda $03C7 00.001C86r 2 ora #$01 00.001C86r 2 GOMOVMF: 00.001C86r 2 bne LFBFA 00.001C86r 2 .byte $F0 00.001C86r 2 .else 00.001C86r 2 ; <<< THESE ARE MISSING ONE BYTE FOR FP VALUES >>> 00.001C86r 2 ; (non CONFIG_SMALL) 00.001C86r 2 CONRND1: 00.001C86r 2 98 35 44 7A .byte $98,$35,$44,$7A 00.001C8Ar 2 CONRND2: 00.001C8Ar 2 68 28 B1 46 .byte $68,$28,$B1,$46 00.001C8Er 2 RND: 00.001C8Er 2 20 rr rr jsr SIGN 00.001C91r 2 .ifdef CONFIG_CBM_ALL 00.001C91r 2 bmi L3F01 00.001C91r 2 bne LDF63 00.001C91r 2 lda ENTROPY 00.001C91r 2 sta FAC+1 00.001C91r 2 lda ENTROPY+4 00.001C91r 2 sta FAC+2 00.001C91r 2 lda ENTROPY+1 00.001C91r 2 sta FAC+3 00.001C91r 2 lda ENTROPY+5 00.001C91r 2 sta FAC+4 00.001C91r 2 jmp LDF88 00.001C91r 2 LDF63: 00.001C91r 2 .else 00.001C91r 2 AA tax 00.001C92r 2 30 18 bmi L3F01 00.001C94r 2 .endif 00.001C94r 2 A9 D8 lda #RNDSEED 00.001C98r 2 20 rr rr jsr LOAD_FAC_FROM_YA 00.001C9Br 2 .ifndef CONFIG_CBM_ALL 00.001C9Br 2 8A txa 00.001C9Cr 2 F0 E7 beq RTS19 00.001C9Er 2 .endif 00.001C9Er 2 A9 rr lda #CONRND1 00.001CA2r 2 20 rr rr jsr FMULT 00.001CA5r 2 A9 rr lda #CONRND2 00.001CA9r 2 20 rr rr jsr FADD 00.001CACr 2 L3F01: 00.001CACr 2 A6 B2 ldx FAC_LAST 00.001CAEr 2 A5 AF lda FAC+1 00.001CB0r 2 85 B2 sta FAC_LAST 00.001CB2r 2 86 AF stx FAC+1 00.001CB4r 2 .ifdef CONFIG_CBM_ALL 00.001CB4r 2 ldx FAC+2 00.001CB4r 2 lda FAC+3 00.001CB4r 2 sta FAC+2 00.001CB4r 2 stx FAC+3 00.001CB4r 2 LDF88: 00.001CB4r 2 .endif 00.001CB4r 2 A9 00 lda #$00 00.001CB6r 2 85 B3 sta FACSIGN 00.001CB8r 2 A5 AE lda FAC 00.001CBAr 2 85 BD sta FACEXTENSION 00.001CBCr 2 A9 80 lda #$80 00.001CBEr 2 85 AE sta FAC 00.001CC0r 2 20 rr rr jsr NORMALIZE_FAC2 00.001CC3r 2 A2 D8 ldx #RNDSEED 00.001CC7r 2 GOMOVMF: 00.001CC7r 2 4C rr rr jmp STORE_FAC_AT_YX_ROUNDED 00.001CCAr 2 .endif 00.001CCAr 2 00.001CCAr 2 .segment "CHRGET" 0B.000018r 2 ; ---------------------------------------------------------------------------- 0B.000018r 2 ; INITIAL VALUE FOR RANDOM NUMBER, ALSO COPIED 0B.000018r 2 ; IN ALONG WITH CHRGET, BUT ERRONEOUSLY: 0B.000018r 2 ; <<< THE LAST BYTE IS NOT COPIED >>> 0B.000018r 2 ; (on all non-CONFIG_SMALL) 0B.000018r 2 ; ---------------------------------------------------------------------------- 0B.000018r 2 GENERIC_RNDSEED: 0B.000018r 2 .ifndef KBD 0B.000018r 2 ; random number seed 0B.000018r 2 .ifdef CONFIG_SMALL 0B.000018r 2 .byte $80,$4F,$C7,$52 0B.000018r 2 .else 0B.000018r 2 .ifdef CONFIG_11 0B.000018r 2 80 4F C7 52 .byte $80,$4F,$C7,$52,$58 0B.00001Cr 2 58 0B.00001Dr 2 .else 0B.00001Dr 2 .byte $80,$4F,$C7,$52,$59 0B.00001Dr 2 .endif 0B.00001Dr 2 .endif 0B.00001Dr 2 .endif 0B.00001Dr 2 GENERIC_CHRGET_END: 0B.00001Dr 2 0B.00001Dr 1 .include "trig.s" 0B.00001Dr 2 .segment "CODE" 00.001CCAr 2 00.001CCAr 2 SIN_COS_TAN_ATN: 00.001CCAr 2 ; ---------------------------------------------------------------------------- 00.001CCAr 2 ; "COS" FUNCTION 00.001CCAr 2 ; ---------------------------------------------------------------------------- 00.001CCAr 2 COS: 00.001CCAr 2 A9 rr lda #CON_PI_HALF 00.001CCEr 2 20 rr rr jsr FADD 00.001CD1r 2 00.001CD1r 2 ; ---------------------------------------------------------------------------- 00.001CD1r 2 ; "SIN" FUNCTION 00.001CD1r 2 ; ---------------------------------------------------------------------------- 00.001CD1r 2 SIN: 00.001CD1r 2 20 rr rr jsr COPY_FAC_TO_ARG_ROUNDED 00.001CD4r 2 A9 rr lda #CON_PI_DOUB 00.001CD8r 2 A6 BB ldx ARGSIGN 00.001CDAr 2 20 rr rr jsr DIV 00.001CDDr 2 20 rr rr jsr COPY_FAC_TO_ARG_ROUNDED 00.001CE0r 2 20 rr rr jsr INT 00.001CE3r 2 A9 00 lda #$00 00.001CE5r 2 85 BC sta STRNG1 00.001CE7r 2 20 rr rr jsr FSUBT 00.001CEAr 2 ; ---------------------------------------------------------------------------- 00.001CEAr 2 ; (FAC) = ANGLE AS A FRACTION OF A FULL CIRCLE 00.001CEAr 2 ; 00.001CEAr 2 ; NOW FOLD THE RANGE INTO A QUARTER CIRCLE 00.001CEAr 2 ; 00.001CEAr 2 ; <<< THERE ARE MUCH SIMPLER WAYS TO DO THIS >>> 00.001CEAr 2 ; ---------------------------------------------------------------------------- 00.001CEAr 2 A9 rr lda #QUARTER 00.001CEEr 2 20 rr rr jsr FSUB 00.001CF1r 2 A5 B3 lda FACSIGN 00.001CF3r 2 48 pha 00.001CF4r 2 10 0D bpl SIN1 00.001CF6r 2 20 rr rr jsr FADDH 00.001CF9r 2 A5 B3 lda FACSIGN 00.001CFBr 2 30 09 bmi L3F5B 00.001CFDr 2 A5 13 lda CPRMASK 00.001CFFr 2 49 FF eor #$FF 00.001D01r 2 85 13 sta CPRMASK 00.001D03r 2 ; ---------------------------------------------------------------------------- 00.001D03r 2 ; IF FALL THRU, RANGE IS 0...1/2 00.001D03r 2 ; IF BRANCH HERE, RANGE IS 0...1/4 00.001D03r 2 ; ---------------------------------------------------------------------------- 00.001D03r 2 SIN1: 00.001D03r 2 20 rr rr jsr NEGOP 00.001D06r 2 ; ---------------------------------------------------------------------------- 00.001D06r 2 ; IF FALL THRU, RANGE IS -1/2...0 00.001D06r 2 ; IF BRANCH HERE, RANGE IS -1/4...0 00.001D06r 2 ; ---------------------------------------------------------------------------- 00.001D06r 2 L3F5B: 00.001D06r 2 A9 rr lda #QUARTER 00.001D0Ar 2 20 rr rr jsr FADD 00.001D0Dr 2 68 pla 00.001D0Er 2 10 03 bpl L3F68 00.001D10r 2 20 rr rr jsr NEGOP 00.001D13r 2 L3F68: 00.001D13r 2 A9 rr lda #POLY_SIN 00.001D17r 2 4C rr rr jmp POLYNOMIAL_ODD 00.001D1Ar 2 00.001D1Ar 2 ; ---------------------------------------------------------------------------- 00.001D1Ar 2 ; "TAN" FUNCTION 00.001D1Ar 2 ; 00.001D1Ar 2 ; COMPUTE TAN(X) = SIN(X) / COS(X) 00.001D1Ar 2 ; ---------------------------------------------------------------------------- 00.001D1Ar 2 TAN: 00.001D1Ar 2 20 rr rr jsr STORE_FAC_IN_TEMP1_ROUNDED 00.001D1Dr 2 A9 00 lda #$00 00.001D1Fr 2 85 13 sta CPRMASK 00.001D21r 2 20 rr rr jsr SIN 00.001D24r 2 A2 9B ldx #TEMP3 00.001D26r 2 A0 00 ldy #$00 00.001D28r 2 20 rr rr jsr GOMOVMF 00.001D2Br 2 A9 A4 lda #TEMP1+(5-BYTES_FP) 00.001D2Dr 2 A0 00 ldy #$00 00.001D2Fr 2 20 rr rr jsr LOAD_FAC_FROM_YA 00.001D32r 2 A9 00 lda #$00 00.001D34r 2 85 B3 sta FACSIGN 00.001D36r 2 A5 13 lda CPRMASK 00.001D38r 2 20 rr rr jsr TAN1 00.001D3Br 2 A9 9B lda #TEMP3 00.001D3Dr 2 A0 00 ldy #$00 00.001D3Fr 2 4C rr rr jmp FDIV 00.001D42r 2 TAN1: 00.001D42r 2 48 pha 00.001D43r 2 4C rr rr jmp SIN1 00.001D46r 2 00.001D46r 2 ; ---------------------------------------------------------------------------- 00.001D46r 2 .ifdef CONFIG_SMALL 00.001D46r 2 CON_PI_HALF: 00.001D46r 2 .byte $81,$49,$0F,$DB 00.001D46r 2 CON_PI_DOUB: 00.001D46r 2 .byte $83,$49,$0F,$DB 00.001D46r 2 QUARTER: 00.001D46r 2 .byte $7F,$00,$00,$00 00.001D46r 2 POLY_SIN: 00.001D46r 2 .byte $04,$86,$1E,$D7,$FB,$87,$99,$26 00.001D46r 2 .byte $65,$87,$23,$34,$58,$86,$A5,$5D 00.001D46r 2 .byte $E1,$83,$49,$0F,$DB 00.001D46r 2 .else 00.001D46r 2 CON_PI_HALF: 00.001D46r 2 81 49 0F DA .byte $81,$49,$0F,$DA,$A2 00.001D4Ar 2 A2 00.001D4Br 2 CON_PI_DOUB: 00.001D4Br 2 83 49 0F DA .byte $83,$49,$0F,$DA,$A2 00.001D4Fr 2 A2 00.001D50r 2 QUARTER: 00.001D50r 2 7F 00 00 00 .byte $7F,$00,$00,$00,$00 00.001D54r 2 00 00.001D55r 2 POLY_SIN: 00.001D55r 2 05 84 E6 1A .byte $05,$84,$E6,$1A,$2D,$1B,$86,$28 00.001D59r 2 2D 1B 86 28 00.001D5Dr 2 07 FB F8 87 .byte $07,$FB,$F8,$87,$99,$68,$89,$01 00.001D61r 2 99 68 89 01 00.001D65r 2 87 23 35 DF .byte $87,$23,$35,$DF,$E1,$86,$A5,$5D 00.001D69r 2 E1 86 A5 5D 00.001D6Dr 2 E7 28 83 49 .byte $E7,$28,$83,$49,$0F,$DA,$A2 00.001D71r 2 0F DA A2 00.001D74r 2 .ifndef CONFIG_11 00.001D74r 2 ; no easter egg text before BASIC 1.1 00.001D74r 2 .elseif !.def(CONFIG_2A) 00.001D74r 2 ; ASCII encoded easter egg 00.001D74r 2 MICROSOFT: 00.001D74r 2 A6 D3 C1 C8 .byte $A6,$D3,$C1,$C8,$D4,$C8,$D5,$C4 00.001D78r 2 D4 C8 D5 C4 00.001D7Cr 2 CE CA .byte $CE,$CA 00.001D7Er 2 .else 00.001D7Er 2 ; PET encoded easter egg text since CBM2 00.001D7Er 2 MICROSOFT: 00.001D7Er 2 .byte $A1,$54,$46,$8F,$13,$8F,$52,$43 00.001D7Er 2 .byte $89,$CD 00.001D7Er 2 .endif 00.001D7Er 2 .endif 00.001D7Er 2 00.001D7Er 2 ; ---------------------------------------------------------------------------- 00.001D7Er 2 ; "ATN" FUNCTION 00.001D7Er 2 ; ---------------------------------------------------------------------------- 00.001D7Er 2 ATN: 00.001D7Er 2 A5 B3 lda FACSIGN 00.001D80r 2 48 pha 00.001D81r 2 10 03 bpl L3FDB 00.001D83r 2 20 rr rr jsr NEGOP 00.001D86r 2 L3FDB: 00.001D86r 2 A5 AE lda FAC 00.001D88r 2 48 pha 00.001D89r 2 C9 81 cmp #$81 00.001D8Br 2 90 07 bcc L3FE9 00.001D8Dr 2 A9 rr lda #CON_ONE 00.001D91r 2 20 rr rr jsr FDIV 00.001D94r 2 ; ---------------------------------------------------------------------------- 00.001D94r 2 ; 0 <= X <= 1 00.001D94r 2 ; 0 <= ATN(X) <= PI/8 00.001D94r 2 ; ---------------------------------------------------------------------------- 00.001D94r 2 L3FE9: 00.001D94r 2 A9 rr lda #POLY_ATN 00.001D98r 2 20 rr rr jsr POLYNOMIAL_ODD 00.001D9Br 2 68 pla 00.001D9Cr 2 C9 81 cmp #$81 00.001D9Er 2 90 07 bcc L3FFC 00.001DA0r 2 A9 rr lda #CON_PI_HALF 00.001DA4r 2 20 rr rr jsr FSUB 00.001DA7r 2 L3FFC: 00.001DA7r 2 68 pla 00.001DA8r 2 10 03 bpl L4002 00.001DAAr 2 4C rr rr jmp NEGOP 00.001DADr 2 L4002: 00.001DADr 2 60 rts 00.001DAEr 2 00.001DAEr 2 ; ---------------------------------------------------------------------------- 00.001DAEr 2 POLY_ATN: 00.001DAEr 2 .ifdef CONFIG_SMALL 00.001DAEr 2 .byte $08 00.001DAEr 2 .byte $78,$3A,$C5,$37 00.001DAEr 2 .byte $7B,$83,$A2,$5C 00.001DAEr 2 .byte $7C,$2E,$DD,$4D 00.001DAEr 2 .byte $7D,$99,$B0,$1E 00.001DAEr 2 .byte $7D,$59,$ED,$24 00.001DAEr 2 .byte $7E,$91,$72,$00 00.001DAEr 2 .byte $7E,$4C,$B9,$73 00.001DAEr 2 .byte $7F,$AA,$AA,$53 00.001DAEr 2 .byte $81,$00,$00,$00 00.001DAEr 2 .else 00.001DAEr 2 0B .byte $0B 00.001DAFr 2 76 B3 83 BD .byte $76,$B3,$83,$BD,$D3 00.001DB3r 2 D3 00.001DB4r 2 79 1E F4 A6 .byte $79,$1E,$F4,$A6,$F5 00.001DB8r 2 F5 00.001DB9r 2 7B 83 FC B0 .byte $7B,$83,$FC,$B0,$10 00.001DBDr 2 10 00.001DBEr 2 7C 0C 1F 67 .byte $7C,$0C,$1F,$67,$CA 00.001DC2r 2 CA 00.001DC3r 2 7C DE 53 CB .byte $7C,$DE,$53,$CB,$C1 00.001DC7r 2 C1 00.001DC8r 2 7D 14 64 70 .byte $7D,$14,$64,$70,$4C 00.001DCCr 2 4C 00.001DCDr 2 7D B7 EA 51 .byte $7D,$B7,$EA,$51,$7A 00.001DD1r 2 7A 00.001DD2r 2 7D 63 30 88 .byte $7D,$63,$30,$88,$7E 00.001DD6r 2 7E 00.001DD7r 2 7E 92 44 99 .byte $7E,$92,$44,$99,$3A 00.001DDBr 2 3A 00.001DDCr 2 7E 4C CC 91 .byte $7E,$4C,$CC,$91,$C7 00.001DE0r 2 C7 00.001DE1r 2 7F AA AA AA .byte $7F,$AA,$AA,$AA,$13 00.001DE5r 2 13 00.001DE6r 2 81 00 00 00 .byte $81,$00,$00,$00,$00 00.001DEAr 2 00 00.001DEBr 2 .endif 00.001DEBr 2 00.001DEBr 2 .if .def(CONFIG_11A) && (!.def(CONFIG_2)) 00.001DEBr 2 00 .byte $00 ; XXX 00.001DECr 2 .endif 00.001DECr 2 00.001DECr 1 .include "init.s" 00.001DECr 2 .segment "INIT" 0C.000000r 2 0C.000000r 2 .ifdef KBD 0C.000000r 2 FNDLIN2: 0C.000000r 2 php 0C.000000r 2 jmp FNDLIN 0C.000000r 2 .endif 0C.000000r 2 0C.000000r 2 ; ---------------------------------------------------------------------------- 0C.000000r 2 PR_WRITTEN_BY: 0C.000000r 2 .ifndef KBD 0C.000000r 2 .ifndef CONFIG_CBM_ALL 0C.000000r 2 A9 rr lda #QT_WRITTEN_BY 0C.000004r 2 20 rr rr jsr STROUT 0C.000007r 2 .endif 0C.000007r 2 .endif 0C.000007r 2 COLD_START: 0C.000007r 2 .ifdef KBD 0C.000007r 2 lda #LFD81 0C.000007r 2 sta $03A1 0C.000007r 2 lda #$20 0C.000007r 2 sta $0480 0C.000007r 2 lda $0352 0C.000007r 2 sta $04 0C.000007r 2 lda $0353 0C.000007r 2 sta $05 0C.000007r 2 .else 0C.000007r 2 .ifndef CBM2 0C.000007r 2 A2 FF ldx #$FF 0C.000009r 2 86 87 stx CURLIN+1 0C.00000Br 2 .endif 0C.00000Br 2 .ifdef CONFIG_NO_INPUTBUFFER_ZP 0C.00000Br 2 ldx #$FB 0C.00000Br 2 .endif 0C.00000Br 2 9A txs 0C.00000Cr 2 .ifndef CONFIG_CBM_ALL 0C.00000Cr 2 A9 rr lda #COLD_START 0C.000010r 2 85 01 sta GORESTART+1 0C.000012r 2 84 02 sty GORESTART+2 0C.000014r 2 85 04 sta GOSTROUT+1 0C.000016r 2 84 05 sty GOSTROUT+2 0C.000018r 2 A9 rr lda #AYINT 0C.00001Cr 2 85 06 sta GOAYINT 0C.00001Er 2 84 07 sty GOAYINT+1 0C.000020r 2 A9 rr lda #GIVAYF 0C.000024r 2 85 08 sta GOGIVEAYF 0C.000026r 2 84 09 sty GOGIVEAYF+1 0C.000028r 2 .endif 0C.000028r 2 A9 4C lda #$4C 0C.00002Ar 2 .ifdef CONFIG_CBM_ALL 0C.00002Ar 2 sta JMPADRS 0C.00002Ar 2 .endif 0C.00002Ar 2 85 00 sta GORESTART 0C.00002Cr 2 .ifndef CONFIG_CBM_ALL 0C.00002Cr 2 85 03 sta GOSTROUT 0C.00002Er 2 85 A1 sta JMPADRS 0C.000030r 2 .endif 0C.000030r 2 .if (!.def(CONFIG_RAM)) && (!.def(CONFIG_CBM_ALL)) 0C.000030r 2 sta USR 0C.000030r 2 .endif 0C.000030r 2 0C.000030r 2 .ifndef CONFIG_RAM 0C.000030r 2 .ifdef APPLE 0C.000030r 2 lda #USR_FUNC 0C.000030r 2 .else 0C.000030r 2 lda #IQERR 0C.000030r 2 .endif 0C.000030r 2 sta USR+1 0C.000030r 2 sty USR+2 0C.000030r 2 .endif 0C.000030r 2 .ifndef CBM1 0C.000030r 2 A9 48 lda #WIDTH 0C.000032r 2 85 17 sta Z17 0C.000034r 2 A9 38 lda #WIDTH2 0C.000036r 2 85 18 sta Z18 0C.000038r 2 .endif 0C.000038r 2 .endif ; KBD 0C.000038r 2 0C.000038r 2 ; All non-CONFIG_SMALL versions of BASIC have 0C.000038r 2 ; the same bug here: While the number of bytes 0C.000038r 2 ; to be copied is correct for CONFIG_SMALL, 0C.000038r 2 ; it is one byte short on non-CONFIG_SMALL: 0C.000038r 2 ; It seems the "ldx" value below has been 0C.000038r 2 ; hardcoded. So on these configurations, 0C.000038r 2 ; the last byte of GENERIC_RNDSEED, which 0C.000038r 2 ; is 5 bytes instead of 4, does not get copied - 0C.000038r 2 ; which is nothing major, because it is just 0C.000038r 2 ; the least significant 8 bits of the mantissa 0C.000038r 2 ; of the random number seed. 0C.000038r 2 ; KBD added three bytes to CHRGET and removed 0C.000038r 2 ; the random number seed, but only adjusted 0C.000038r 2 ; the number of bytes by adding 3 - this 0C.000038r 2 ; copies four bytes too many, which is no 0C.000038r 2 ; problem. 0C.000038r 2 .ifdef CONFIG_SMALL 0C.000038r 2 .ifdef KBD 0C.000038r 2 ldx #GENERIC_CHRGET_END-GENERIC_CHRGET+4 0C.000038r 2 .else 0C.000038r 2 ldx #GENERIC_CHRGET_END-GENERIC_CHRGET 0C.000038r 2 .endif 0C.000038r 2 .else 0C.000038r 2 A2 1C ldx #GENERIC_CHRGET_END-GENERIC_CHRGET-1 ; XXX 0C.00003Ar 2 .endif 0C.00003Ar 2 L4098: 0C.00003Ar 2 BD rr rr lda GENERIC_CHRGET-1,x 0C.00003Dr 2 95 BF sta CHRGET-1,x 0C.00003Fr 2 CA dex 0C.000040r 2 D0 F8 bne L4098 0C.000042r 2 .ifdef CONFIG_2 0C.000042r 2 lda #$03 0C.000042r 2 sta DSCLEN 0C.000042r 2 .endif 0C.000042r 2 .ifndef KBD 0C.000042r 2 8A txa 0C.000043r 2 85 B5 sta SHIFTSIGNEXT 0C.000045r 2 .ifdef CONFIG_CBM_ALL 0C.000045r 2 sta CURDVC 0C.000045r 2 .endif 0C.000045r 2 85 65 sta LASTPT+1 0C.000047r 2 .if .defined(CONFIG_NULL) || .defined(CONFIG_PRINTNULLS) 0C.000047r 2 85 15 sta Z15 0C.000049r 2 .endif 0C.000049r 2 .ifndef CONFIG_11 0C.000049r 2 sta POSX 0C.000049r 2 .endif 0C.000049r 2 48 pha 0C.00004Ar 2 85 14 sta Z14 0C.00004Cr 2 .ifndef CBM2 0C.00004Cr 2 .ifndef MICROTAN 0C.00004Cr 2 A9 03 lda #$03 0C.00004Er 2 85 A0 sta DSCLEN 0C.000050r 2 .endif 0C.000050r 2 .ifndef CONFIG_11 0C.000050r 2 lda #$2C 0C.000050r 2 sta LINNUM+1 0C.000050r 2 .endif 0C.000050r 2 20 rr rr jsr CRDO 0C.000053r 2 .endif 0C.000053r 2 .ifdef CBM2 0C.000053r 2 inx 0C.000053r 2 stx INPUTBUFFER-3 0C.000053r 2 stx INPUTBUFFER-4 0C.000053r 2 .endif 0C.000053r 2 .ifdef APPLE 0C.000053r 2 lda #$01 0C.000053r 2 sta INPUTBUFFER-3 0C.000053r 2 sta INPUTBUFFER-4 0C.000053r 2 .endif 0C.000053r 2 A2 66 ldx #TEMPST 0C.000055r 2 86 63 stx TEMPPT 0C.000057r 2 .ifndef CONFIG_CBM_ALL 0C.000057r 2 A9 rr lda #QT_MEMORY_SIZE 0C.00005Br 2 20 rr rr jsr STROUT 0C.00005Er 2 .ifdef APPLE 0C.00005Er 2 jsr INLINX 0C.00005Er 2 .else 0C.00005Er 2 20 rr rr jsr NXIN 0C.000061r 2 .endif 0C.000061r 2 86 C7 stx TXTPTR 0C.000063r 2 84 C8 sty TXTPTR+1 0C.000065r 2 20 C0 00 jsr CHRGET 0C.000068r 2 C9 41 cmp #$41 0C.00006Ar 2 F0 94 beq PR_WRITTEN_BY 0C.00006Cr 2 A8 tay 0C.00006Dr 2 D0 21 bne L40EE 0C.00006Fr 2 .endif 0C.00006Fr 2 .ifndef CBM2 0C.00006Fr 2 A9 rr lda #RAMSTART2 0C.000073r 2 .ifdef CONFIG_2 0C.000073r 2 sta TXTTAB 0C.000073r 2 sty TXTTAB+1 0C.000073r 2 .endif 0C.000073r 2 85 19 sta LINNUM 0C.000075r 2 84 1A sty LINNUM+1 0C.000077r 2 .ifdef CBM2 0C.000077r 2 tay 0C.000077r 2 .else 0C.000077r 2 A0 00 ldy #$00 0C.000079r 2 .endif 0C.000079r 2 L40D7: 0C.000079r 2 E6 19 inc LINNUM 0C.00007Br 2 D0 02 bne L40DD 0C.00007Dr 2 E6 1A inc LINNUM+1 0C.00007Fr 2 .ifdef CBM1 0C.00007Fr 2 ; CBM: hard RAM top limit is $8000 0C.00007Fr 2 lda LINNUM+1 0C.00007Fr 2 cmp #$80 0C.00007Fr 2 beq L40FA 0C.00007Fr 2 .endif 0C.00007Fr 2 .ifdef CBM2 0C.00007Fr 2 ; optimized version of the CBM1 code 0C.00007Fr 2 bmi L40FA 0C.00007Fr 2 .endif 0C.00007Fr 2 L40DD: 0C.00007Fr 2 .ifdef CONFIG_2 0C.00007Fr 2 lda #$55 ; 01010101 / 10101010 0C.00007Fr 2 .else 0C.00007Fr 2 A9 92 lda #$92 ; 10010010 / 00100100 0C.000081r 2 .endif 0C.000081r 2 91 19 sta (LINNUM),y 0C.000083r 2 D1 19 cmp (LINNUM),y 0C.000085r 2 D0 15 bne L40FA 0C.000087r 2 0A asl a 0C.000088r 2 91 19 sta (LINNUM),y 0C.00008Ar 2 D1 19 cmp (LINNUM),y 0C.00008Cr 2 .ifdef CONFIG_CBM_ALL 0C.00008Cr 2 beq L40D7 0C.00008Cr 2 .else 0C.00008Cr 2 .ifndef CONFIG_11 0C.00008Cr 2 beq L40D7; old: faster 0C.00008Cr 2 bne L40FA 0C.00008Cr 2 .else 0C.00008Cr 2 D0 0E bne L40FA; new: slower 0C.00008Er 2 F0 E9 beq L40D7 0C.000090r 2 .endif 0C.000090r 2 L40EE: 0C.000090r 2 20 C6 00 jsr CHRGOT 0C.000093r 2 20 rr rr jsr LINGET 0C.000096r 2 A8 tay 0C.000097r 2 F0 03 beq L40FA 0C.000099r 2 4C rr rr jmp SYNERR 0C.00009Cr 2 .endif 0C.00009Cr 2 L40FA: 0C.00009Cr 2 A5 19 lda LINNUM 0C.00009Er 2 A4 1A ldy LINNUM+1 0C.0000A0r 2 85 84 sta MEMSIZ 0C.0000A2r 2 84 85 sty MEMSIZ+1 0C.0000A4r 2 .ifndef MICROTAN 0C.0000A4r 2 85 80 sta FRETOP 0C.0000A6r 2 84 81 sty FRETOP+1 0C.0000A8r 2 .endif 0C.0000A8r 2 L4106: 0C.0000A8r 2 .ifndef CONFIG_CBM_ALL 0C.0000A8r 2 .ifdef APPLE 0C.0000A8r 2 lda #$FF 0C.0000A8r 2 jmp L2829 0C.0000A8r 2 .word STROUT ; PATCH! 0C.0000A8r 2 jsr NXIN 0C.0000A8r 2 .else 0C.0000A8r 2 A9 rr lda #QT_TERMINAL_WIDTH 0C.0000ACr 2 20 rr rr jsr STROUT 0C.0000AFr 2 20 rr rr jsr NXIN 0C.0000B2r 2 .endif 0C.0000B2r 2 86 C7 stx TXTPTR 0C.0000B4r 2 84 C8 sty TXTPTR+1 0C.0000B6r 2 20 C0 00 jsr CHRGET 0C.0000B9r 2 A8 tay 0C.0000BAr 2 F0 1C beq L4136 0C.0000BCr 2 20 rr rr jsr LINGET 0C.0000BFr 2 A5 1A lda LINNUM+1 0C.0000C1r 2 D0 E5 bne L4106 0C.0000C3r 2 A5 19 lda LINNUM 0C.0000C5r 2 C9 10 cmp #$10 0C.0000C7r 2 90 DF bcc L4106 0C.0000C9r 2 L2829: 0C.0000C9r 2 85 17 sta Z17 0C.0000CBr 2 L4129: 0C.0000CBr 2 E9 0E sbc #$0E 0C.0000CDr 2 B0 FC bcs L4129 0C.0000CFr 2 49 FF eor #$FF 0C.0000D1r 2 E9 0C sbc #$0C 0C.0000D3r 2 18 clc 0C.0000D4r 2 65 17 adc Z17 0C.0000D6r 2 85 18 sta Z18 0C.0000D8r 2 .endif 0C.0000D8r 2 L4136: 0C.0000D8r 2 .ifdef CONFIG_RAM 0C.0000D8r 2 A9 rr lda #QT_WANT 0C.0000DCr 2 20 rr rr jsr STROUT 0C.0000DFr 2 20 rr rr jsr NXIN 0C.0000E2r 2 86 C7 stx TXTPTR 0C.0000E4r 2 84 C8 sty TXTPTR+1 0C.0000E6r 2 20 C0 00 jsr CHRGET 0C.0000E9r 2 A2 rr ldx #RAMSTART1 0C.0000EDr 2 C9 59 cmp #'Y' 0C.0000EFr 2 F0 34 beq L4183 0C.0000F1r 2 C9 41 cmp #'A' 0C.0000F3r 2 F0 04 beq L4157 0C.0000F5r 2 C9 4E cmp #'N' 0C.0000F7r 2 D0 DF bne L4136 0C.0000F9r 2 L4157: 0C.0000F9r 2 A2 rr ldx #IQERR 0C.0000FDr 2 8E rr rr stx UNFNC_ATN 0C.000100r 2 8C rr rr sty UNFNC_ATN+1 0C.000103r 2 A2 rr ldx #ATN ; with ATN 0C.000107r 2 C9 41 cmp #'A' 0C.000109r 2 F0 1A beq L4183 0C.00010Br 2 A2 rr ldx #IQERR 0C.00010Fr 2 8E rr rr stx UNFNC_COS 0C.000112r 2 8C rr rr sty UNFNC_COS+1 0C.000115r 2 8E rr rr stx UNFNC_TAN 0C.000118r 2 8C rr rr sty UNFNC_TAN+1 0C.00011Br 2 8E rr rr stx UNFNC_SIN 0C.00011Er 2 8C rr rr sty UNFNC_SIN+1 0C.000121r 2 A2 rr ldx #SIN_COS_TAN_ATN ; all of trig.s 0C.000125r 2 L4183: 0C.000125r 2 .else 0C.000125r 2 ldx #RAMSTART2 0C.000125r 2 .endif 0C.000125r 2 86 78 stx TXTTAB 0C.000127r 2 84 79 sty TXTTAB+1 0C.000129r 2 A0 00 ldy #$00 0C.00012Br 2 98 tya 0C.00012Cr 2 91 78 sta (TXTTAB),y 0C.00012Er 2 E6 78 inc TXTTAB 0C.000130r 2 .ifndef CBM2 0C.000130r 2 D0 02 bne L4192 0C.000132r 2 E6 79 inc TXTTAB+1 0C.000134r 2 L4192: 0C.000134r 2 .endif 0C.000134r 2 .if CONFIG_SCRTCH_ORDER = 1 0C.000134r 2 jsr SCRTCH 0C.000134r 2 .endif 0C.000134r 2 A5 78 lda TXTTAB 0C.000136r 2 A4 79 ldy TXTTAB+1 0C.000138r 2 20 rr rr jsr REASON 0C.00013Br 2 .ifdef CBM2 0C.00013Br 2 lda #QT_BASIC 0C.00013Br 2 jsr STROUT 0C.00013Br 2 .else 0C.00013Br 2 20 rr rr jsr CRDO 0C.00013Er 2 .endif 0C.00013Er 2 A5 84 lda MEMSIZ 0C.000140r 2 38 sec 0C.000141r 2 E5 78 sbc TXTTAB 0C.000143r 2 AA tax 0C.000144r 2 A5 85 lda MEMSIZ+1 0C.000146r 2 E5 79 sbc TXTTAB+1 0C.000148r 2 20 rr rr jsr LINPRT 0C.00014Br 2 A9 rr lda #QT_BYTES_FREE 0C.00014Fr 2 20 rr rr jsr STROUT 0C.000152r 2 .if CONFIG_SCRTCH_ORDER = 2 0C.000152r 2 20 rr rr jsr SCRTCH 0C.000155r 2 .endif 0C.000155r 2 .ifdef CONFIG_CBM_ALL 0C.000155r 2 jmp RESTART 0C.000155r 2 .else 0C.000155r 2 A9 rr lda #STROUT 0C.000159r 2 85 04 sta GOSTROUT+1 0C.00015Br 2 84 05 sty GOSTROUT+2 0C.00015Dr 2 .if CONFIG_SCRTCH_ORDER = 3 0C.00015Dr 2 jsr SCRTCH 0C.00015Dr 2 .endif 0C.00015Dr 2 A9 rr lda #RESTART 0C.000161r 2 85 01 sta GORESTART+1 0C.000163r 2 84 02 sty GORESTART+2 0C.000165r 2 6C 01 00 jmp (GORESTART+1) 0C.000168r 2 .endif 0C.000168r 2 0C.000168r 2 .if .def(CONFIG_RAM) || .def(OSI) 0C.000168r 2 ; OSI is compiled for ROM, but includes 0C.000168r 2 ; this unused string 0C.000168r 2 QT_WANT: 0C.000168r 2 57 41 4E 54 .byte "WANT SIN-COS-TAN-ATN" 0C.00016Cr 2 20 53 49 4E 0C.000170r 2 2D 43 4F 53 0C.00017Cr 2 00 .byte 0 0C.00017Dr 2 .endif 0C.00017Dr 2 QT_WRITTEN_BY: 0C.00017Dr 2 .ifndef CONFIG_CBM_ALL 0C.00017Dr 2 .ifdef APPLE 0C.00017Dr 2 asc80 "COPYRIGHT 1977 BY MICROSOFT CO" 0C.00017Dr 2 .byte CR,0 0C.00017Dr 2 .else 0C.00017Dr 2 0D 0A 0C .byte CR,LF,$0C ; FORM FEED 0C.000180r 2 .ifndef CONFIG_11 0C.000180r 2 .byte "WRITTEN BY RICHARD W. WEILAND." 0C.000180r 2 .else 0C.000180r 2 57 52 49 54 .byte "WRITTEN BY WEILAND & GATES" 0C.000184r 2 54 45 4E 20 0C.000188r 2 42 59 20 57 0C.00019Ar 2 .endif 0C.00019Ar 2 0D 0A 00 .byte CR,LF,0 0C.00019Dr 2 .endif 0C.00019Dr 2 QT_MEMORY_SIZE: 0C.00019Dr 2 4D 45 4D 4F .byte "MEMORY SIZE" 0C.0001A1r 2 52 59 20 53 0C.0001A5r 2 49 5A 45 0C.0001A8r 2 00 .byte 0 0C.0001A9r 2 QT_TERMINAL_WIDTH: 0C.0001A9r 2 54 45 52 4D .byte "TERMINAL WIDTH" 0C.0001ADr 2 49 4E 41 4C 0C.0001B1r 2 20 57 49 44 0C.0001B7r 2 00 .byte 0 0C.0001B8r 2 .endif 0C.0001B8r 2 QT_BYTES_FREE: 0C.0001B8r 2 20 42 59 54 .byte " BYTES FREE" 0C.0001BCr 2 45 53 20 46 0C.0001C0r 2 52 45 45 0C.0001C3r 2 .ifdef CBM1 0C.0001C3r 2 .elseif .def(CBM2) 0C.0001C3r 2 .byte CR,0 0C.0001C3r 2 .elseif .def(APPLE) 0C.0001C3r 2 .byte 0 0C.0001C3r 2 .else 0C.0001C3r 2 0D 0A 0D 0A .byte CR,LF,CR,LF 0C.0001C7r 2 .endif 0C.0001C7r 2 QT_BASIC: 0C.0001C7r 2 .ifdef OSI 0C.0001C7r 2 .byte "OSI 6502 BASIC VERSION 1.0 REV 3.2" 0C.0001C7r 2 .endif 0C.0001C7r 2 .ifdef KIM 0C.0001C7r 2 4D 4F 53 20 .byte "MOS TECH 6502 BASIC V1.1" 0C.0001CBr 2 54 45 43 48 0C.0001CFr 2 20 36 35 30 0C.0001DFr 2 .endif 0C.0001DFr 2 .ifdef MICROTAN 0C.0001DFr 2 .byte "MICROTAN BASIC" 0C.0001DFr 2 .endif 0C.0001DFr 2 .ifdef CBM1 0C.0001DFr 2 .byte $13 ; HOME 0C.0001DFr 2 .byte "*** COMMODORE BASIC ***" 0C.0001DFr 2 .byte $11,$11,$11,0 ; DOWN/DOWN/DOWN 0C.0001DFr 2 .endif 0C.0001DFr 2 .ifdef CBM2 0C.0001DFr 2 .byte "### COMMODORE BASIC ###" 0C.0001DFr 2 .byte CR,CR,0 0C.0001DFr 2 .endif 0C.0001DFr 2 .ifdef APPLE 0C.0001DFr 2 .byte LF,CR,LF 0C.0001DFr 2 .byte "APPLE BASIC V1.1" 0C.0001DFr 2 .endif 0C.0001DFr 2 .ifndef CONFIG_CBM_ALL 0C.0001DFr 2 0D 0A .byte CR,LF 0C.0001E1r 2 .ifdef MICROTAN 0C.0001E1r 2 .byte "(C) 1980 MICROSOFT" 0C.0001E1r 2 .else 0C.0001E1r 2 43 4F 50 59 .byte "COPYRIGHT 1977 BY MICROSOFT CO." 0C.0001E5r 2 52 49 47 48 0C.0001E9r 2 54 20 31 39 0C.000200r 2 .endif 0C.000200r 2 0D 0A 00 .byte CR,LF,0 0C.000203r 2 .endif 0C.000203r 2 .endif ; KBD 0C.000203r 2 0C.000203r 1 .include "extra.s" 0C.000203r 2 .segment "EXTRA" 0D.000000r 2 0D.000000r 2 .ifdef KIM 0D.000000r 2 .include "kim_extra.s" 0D.000000r 3 .segment "EXTRA" 0D.000000r 3 0D.000000r 3 RAMSTART2: 0D.000000r 3 08 29 25 20 .byte $08,$29,$25,$20,$60,$2A,$E5,$E4 0D.000004r 3 60 2A E5 E4 0D.000008r 3 20 66 24 65 .byte $20,$66,$24,$65,$AC,$04,$A4 0D.00000Cr 3 AC 04 A4 0D.00000Fr 3 0D.00000Fr 2 .endif 0D.00000Fr 2 0D.00000Fr 2 .ifdef CONFIG_CBM1_PATCHES 0D.00000Fr 2 .include "cbm1_patches.s" 0D.00000Fr 2 .endif 0D.00000Fr 2 0D.00000Fr 2 .ifdef KBD 0D.00000Fr 2 .include "kbd_extra.s" 0D.00000Fr 2 .endif 0D.00000Fr 2 0D.00000Fr 2 .ifdef APPLE 0D.00000Fr 2 .include "apple_extra.s" 0D.00000Fr 2 .endif 0D.00000Fr 2 0D.00000Fr 2 .ifdef MICROTAN 0D.00000Fr 2 .include "microtan_extra.s" 0D.00000Fr 2 .endif 0D.00000Fr 2 0D.00000Fr 1 Segment summary Segment: 00 = CODE Segment: 04 = ZEROPAGE Segment: 07 = VECTORS Segment: 08 = KEYWORDS Segment: 09 = DUMMY Segment: 0A = ERROR Segment: 0B = CHRGET Segment: 0C = INIT Segment: 0D = EXTRA