From e13e86f33fef93e76ee32fd535cd1cbebd01d6ca Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 19 Sep 2019 21:29:33 +0200 Subject: [PATCH] added Commodore-64 emulator --- README.md | 20 +- c64.png | Bin 0 -> 197056 bytes ehbasic.png | Bin 0 -> 183640 bytes src/ehbasic/basic-patched.asm | 8791 +++++++++++++++++ src/ehbasic/main.asm | 133 + src/main/kotlin/razorvine/c64emu/GUI.kt | 247 + src/main/kotlin/razorvine/c64emu/Petscii.kt | 1121 +++ src/main/kotlin/razorvine/c64emu/VicII.kt | 61 + src/main/kotlin/razorvine/c64emu/c64Main.kt | 92 + .../kotlin/razorvine/examplemachine/GUI.kt | 10 +- .../razorvine/examplemachine/ehBasicMain.kt | 2 +- .../razorvine/examplemachine/machineMain.kt | 18 +- .../razorvine/ksim65/IVirtualMachine.kt | 9 + 13 files changed, 10482 insertions(+), 22 deletions(-) create mode 100644 c64.png create mode 100644 ehbasic.png create mode 100644 src/ehbasic/basic-patched.asm create mode 100644 src/ehbasic/main.asm create mode 100644 src/main/kotlin/razorvine/c64emu/GUI.kt create mode 100644 src/main/kotlin/razorvine/c64emu/Petscii.kt create mode 100644 src/main/kotlin/razorvine/c64emu/VicII.kt create mode 100644 src/main/kotlin/razorvine/c64emu/c64Main.kt create mode 100644 src/main/kotlin/razorvine/ksim65/IVirtualMachine.kt diff --git a/README.md b/README.md index 62345c9..aeece1b 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,20 @@ Properties of this simulator: - passes several extensive unit test suites that verify instruction and cpu flags behavior - maximum simulated performance is a 6502 running at ~100 Mhz (on my machine) -## Virtual machine examples - -Two virtual example machines are included. -The default one starts with ``gradle run`` or run the ``ksim64vm`` command. -There's another one ``ehBasicMain`` that is configured to run the "enhanced 6502 basic" ROM. - ## Documentation Still to be written. For now, use the source ;-) + + +## Virtual machine examples + +Three virtual example machines are included. +The default one starts with ``gradle run`` or run the ``ksim64vm`` command. +There's another one ``ehBasicMain`` that is configured to run the "enhanced 6502 basic" ROM: + +![ehBasic](ehbasic.png) + +Finally there is a fairly functional C64 emulator running the actual roms (not included, +but can be easily found elsewhere for example with the Vice emulator): + +![C64 emulation](c64.png) diff --git a/c64.png b/c64.png new file mode 100644 index 0000000000000000000000000000000000000000..281a829f2fcfbe456d64f1394b3122a04aa6106e GIT binary patch literal 197056 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

  • xD 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 to cause error +; 2.21 fixed IF .. THEN RETURN to not cause error +; 2.22 fixed RND() breaking the get byte routine +; 2.22p patched to disable use of decimal mode and fix Ibuff issues +; (bugsnquirks.txt notes 2, 4 and 5) +; tabs converted to spaces, tabwidth=6 +; 2.22p2 fixed can't continue error on 1st statement after direct mode +; changed INPUT to throw "break in line ##" on empty line input +; 2.22p3 fixed RAM above code / Ibuff above EhBASIC patch breaks STR$() +; fix provided by github user mgcaret +; 2.22p4 fixed string compare of equal strings in direct mode returns FALSE +; fixed FALSE stored to a variable after a string compare +; is > 0 and < 1E-16 +; added additional stack floor protection for background interrupts +; fixed conditional LOOP & NEXT cannot find their data strucure on stack + +; zero page use .. + +; the following locations are bulk initialized from StrTab at LAB_GMEM +LAB_WARM = $00 ; BASIC warm start entry point +Wrmjpl = LAB_WARM+1; BASIC warm start vector jump low byte +Wrmjph = LAB_WARM+2; BASIC warm start vector jump high byte + +Usrjmp = $0A ; USR function JMP address +Usrjpl = Usrjmp+1 ; USR function JMP vector low byte +Usrjph = Usrjmp+2 ; USR function JMP vector high byte +Nullct = $0D ; nulls output after each line +TPos = $0E ; BASIC terminal position byte +TWidth = $0F ; BASIC terminal width byte +Iclim = $10 ; input column limit +Itempl = $11 ; temporary integer low byte +Itemph = Itempl+1 ; temporary integer high byte +; end bulk initialize from StrTab at LAB_GMEM + +nums_1 = Itempl ; number to bin/hex string convert MSB +nums_2 = nums_1+1 ; number to bin/hex string convert +nums_3 = nums_1+2 ; number to bin/hex string convert LSB + +Srchc = $5B ; search character +Temp3 = Srchc ; temp byte used in number routines +Scnquo = $5C ; scan-between-quotes flag +Asrch = Scnquo ; alt search character + +XOAw_l = Srchc ; eXclusive OR, OR and AND word low byte +XOAw_h = Scnquo ; eXclusive OR, OR and AND word high byte + +Ibptr = $5D ; input buffer pointer +Dimcnt = Ibptr ; # of dimensions +Tindx = Ibptr ; token index + +Defdim = $5E ; default DIM flag +Dtypef = $5F ; data type flag, $FF=string, $00=numeric +Oquote = $60 ; open quote flag (b7) (Flag: DATA scan; LIST quote; memory) +Gclctd = $60 ; garbage collected flag +Sufnxf = $61 ; subscript/FNX flag, 1xxx xxx = FN(0xxx xxx) +Imode = $62 ; input mode flag, $00=INPUT, $80=READ + +Cflag = $63 ; comparison evaluation flag + +TabSiz = $64 ; TAB step size (was input flag) + +next_s = $65 ; next descriptor stack address + + ; these two bytes form a word pointer to the item + ; currently on top of the descriptor stack +last_sl = $66 ; last descriptor stack address low byte +last_sh = $67 ; last descriptor stack address high byte (always $00) + +des_sk = $68 ; descriptor stack start address (temp strings) + +; = $70 ; End of descriptor stack + +ut1_pl = $71 ; utility pointer 1 low byte +ut1_ph = ut1_pl+1 ; utility pointer 1 high byte +ut2_pl = $73 ; utility pointer 2 low byte +ut2_ph = ut2_pl+1 ; utility pointer 2 high byte + +Temp_2 = ut1_pl ; temp byte for block move + +FACt_1 = $75 ; FAC temp mantissa1 +FACt_2 = FACt_1+1 ; FAC temp mantissa2 +FACt_3 = FACt_2+1 ; FAC temp mantissa3 + +dims_l = FACt_2 ; array dimension size low byte +dims_h = FACt_3 ; array dimension size high byte + +TempB = $78 ; temp page 0 byte + +Smeml = $79 ; start of mem low byte (Start-of-Basic) +Smemh = Smeml+1 ; start of mem high byte (Start-of-Basic) +Svarl = $7B ; start of vars low byte (Start-of-Variables) +Svarh = Svarl+1 ; start of vars high byte (Start-of-Variables) +Sarryl = $7D ; var mem end low byte (Start-of-Arrays) +Sarryh = Sarryl+1 ; var mem end high byte (Start-of-Arrays) +Earryl = $7F ; array mem end low byte (End-of-Arrays) +Earryh = Earryl+1 ; array mem end high byte (End-of-Arrays) +Sstorl = $81 ; string storage low byte (String storage (moving down)) +Sstorh = Sstorl+1 ; string storage high byte (String storage (moving down)) +Sutill = $83 ; string utility ptr low byte +Sutilh = Sutill+1 ; string utility ptr high byte +Ememl = $85 ; end of mem low byte (Limit-of-memory) +Ememh = Ememl+1 ; end of mem high byte (Limit-of-memory) +Clinel = $87 ; current line low byte (Basic line number) +Clineh = Clinel+1 ; current line high byte (Basic line number) +Blinel = $89 ; break line low byte (Previous Basic line number) +Blineh = Blinel+1 ; break line high byte (Previous Basic line number) + +Cpntrl = $8B ; continue pointer low byte +Cpntrh = Cpntrl+1 ; continue pointer high byte + +Dlinel = $8D ; current DATA line low byte +Dlineh = Dlinel+1 ; current DATA line high byte + +Dptrl = $8F ; DATA pointer low byte +Dptrh = Dptrl+1 ; DATA pointer high byte + +Rdptrl = $91 ; read pointer low byte +Rdptrh = Rdptrl+1 ; read pointer high byte + +Varnm1 = $93 ; current var name 1st byte +Varnm2 = Varnm1+1 ; current var name 2nd byte + +Cvaral = $95 ; current var address low byte +Cvarah = Cvaral+1 ; current var address high byte + +Frnxtl = $97 ; var pointer for FOR/NEXT low byte +Frnxth = Frnxtl+1 ; var pointer for FOR/NEXT high byte + +Tidx1 = Frnxtl ; temp line index + +Lvarpl = Frnxtl ; let var pointer low byte +Lvarph = Frnxth ; let var pointer high byte + +prstk = $99 ; precedence stacked flag + +comp_f = $9B ; compare function flag, bits 0,1 and 2 used + ; bit 2 set if > + ; bit 1 set if = + ; bit 0 set if < + +func_l = $9C ; function pointer low byte +func_h = func_l+1 ; function pointer high byte + +garb_l = func_l ; garbage collection working pointer low byte +garb_h = func_h ; garbage collection working pointer high byte + +des_2l = $9E ; string descriptor_2 pointer low byte +des_2h = des_2l+1 ; string descriptor_2 pointer high byte + +g_step = $A0 ; garbage collect step size + +Fnxjmp = $A1 ; jump vector for functions +Fnxjpl = Fnxjmp+1 ; functions jump vector low byte +Fnxjph = Fnxjmp+2 ; functions jump vector high byte + +g_indx = Fnxjpl ; garbage collect temp index + +FAC2_r = $A3 ; FAC2 rounding byte + +Adatal = $A4 ; array data pointer low byte +Adatah = Adatal+1 ; array data pointer high byte + +Nbendl = Adatal ; new block end pointer low byte +Nbendh = Adatah ; new block end pointer high byte + +Obendl = $A6 ; old block end pointer low byte +Obendh = Obendl+1 ; old block end pointer high byte + +numexp = $A8 ; string to float number exponent count +expcnt = $A9 ; string to float exponent count + +numbit = numexp ; bit count for array element calculations + +numdpf = $AA ; string to float decimal point flag +expneg = $AB ; string to float eval exponent -ve flag + +Astrtl = numdpf ; array start pointer low byte +Astrth = expneg ; array start pointer high byte + +Histrl = numdpf ; highest string low byte +Histrh = expneg ; highest string high byte + +Baslnl = numdpf ; BASIC search line pointer low byte +Baslnh = expneg ; BASIC search line pointer high byte + +Fvar_l = numdpf ; find/found variable pointer low byte +Fvar_h = expneg ; find/found variable pointer high byte + +Ostrtl = numdpf ; old block start pointer low byte +Ostrth = expneg ; old block start pointer high byte + +Vrschl = numdpf ; variable search pointer low byte +Vrschh = expneg ; variable search pointer high byte + +FAC1_e = $AC ; FAC1 exponent +FAC1_1 = FAC1_e+1 ; FAC1 mantissa1 +FAC1_2 = FAC1_e+2 ; FAC1 mantissa2 +FAC1_3 = FAC1_e+3 ; FAC1 mantissa3 +FAC1_s = FAC1_e+4 ; FAC1 sign (b7) + +str_ln = FAC1_e ; string length +str_pl = FAC1_1 ; string pointer low byte +str_ph = FAC1_2 ; string pointer high byte + +des_pl = FAC1_2 ; string descriptor pointer low byte +des_ph = FAC1_3 ; string descriptor pointer high byte + +mids_l = FAC1_3 ; MID$ string temp length byte + +negnum = $B1 ; string to float eval -ve flag +numcon = $B1 ; series evaluation constant count + +FAC1_o = $B2 ; FAC1 overflow byte + +FAC2_e = $B3 ; FAC2 exponent +FAC2_1 = FAC2_e+1 ; FAC2 mantissa1 +FAC2_2 = FAC2_e+2 ; FAC2 mantissa2 +FAC2_3 = FAC2_e+3 ; FAC2 mantissa3 +FAC2_s = FAC2_e+4 ; FAC2 sign (b7) + +FAC_sc = $B8 ; FAC sign comparison, Acc#1 vs #2 +FAC1_r = $B9 ; FAC1 rounding byte + +ssptr_l = FAC_sc ; string start pointer low byte +ssptr_h = FAC1_r ; string start pointer high byte + +sdescr = FAC_sc ; string descriptor pointer + +csidx = $BA ; line crunch save index +Asptl = csidx ; array size/pointer low byte +Aspth = $BB ; array size/pointer high byte + +Btmpl = Asptl ; BASIC pointer temp low byte +Btmph = Aspth ; BASIC pointer temp low byte + +Cptrl = Asptl ; BASIC pointer temp low byte +Cptrh = Aspth ; BASIC pointer temp low byte + +Sendl = Asptl ; BASIC pointer temp low byte +Sendh = Aspth ; BASIC pointer temp low byte + +; the following locations are bulk initialized from LAB_2CEE at LAB_2D4E +LAB_IGBY = $BC ; get next BASIC byte subroutine + +LAB_GBYT = $C2 ; get current BASIC byte subroutine +Bpntrl = $C3 ; BASIC execute (get byte) pointer low byte +Bpntrh = Bpntrl+1 ; BASIC execute (get byte) pointer high byte + +; = $D7 ; end of get BASIC char subroutine +; end bulk initialize from LAB_2CEE at LAB_2D4E + +Rbyte4 = $D8 ; extra PRNG byte +Rbyte1 = Rbyte4+1 ; most significant PRNG byte +Rbyte2 = Rbyte4+2 ; middle PRNG byte +Rbyte3 = Rbyte4+3 ; least significant PRNG byte + +NmiBase = $DC ; NMI handler enabled/setup/triggered flags + ; bit function + ; === ======== + ; 7 interrupt enabled + ; 6 interrupt setup + ; 5 interrupt happened +; = $DD ; NMI handler addr low byte +; = $DE ; NMI handler addr high byte +IrqBase = $DF ; IRQ handler enabled/setup/triggered flags +; = $E0 ; IRQ handler addr low byte +; = $E1 ; IRQ handler addr high byte + +; *** removed unused comments for $DE-$E1 + +; = $E2 ; unused +; = $E3 ; unused +; = $E4 ; unused +; = $E5 ; unused +; = $E6 ; unused +; = $E7 ; unused +; = $E8 ; unused +; = $E9 ; unused +; = $EA ; unused +; = $EB ; unused +; = $EC ; unused +; = $ED ; unused +; = $EE ; unused + +Decss = $EF ; number to decimal string start +Decssp1 = Decss+1 ; number to decimal string start + +; = $FF ; decimal string end + +; token values needed for BASIC + +; primary command tokens (can start a statement) + +TK_END = $80 ; END token +TK_FOR = TK_END+1 ; FOR token +TK_NEXT = TK_FOR+1 ; NEXT token +TK_DATA = TK_NEXT+1 ; DATA token +TK_INPUT = TK_DATA+1 ; INPUT token +TK_DIM = TK_INPUT+1 ; DIM token +TK_READ = TK_DIM+1 ; READ token +TK_LET = TK_READ+1 ; LET token +TK_DEC = TK_LET+1 ; DEC token +TK_GOTO = TK_DEC+1 ; GOTO token +TK_RUN = TK_GOTO+1 ; RUN token +TK_IF = TK_RUN+1 ; IF token +TK_RESTORE = TK_IF+1 ; RESTORE token +TK_GOSUB = TK_RESTORE+1 ; GOSUB token +TK_RETIRQ = TK_GOSUB+1 ; RETIRQ token +TK_RETNMI = TK_RETIRQ+1 ; RETNMI token +TK_RETURN = TK_RETNMI+1 ; RETURN token +TK_REM = TK_RETURN+1 ; REM token +TK_STOP = TK_REM+1 ; STOP token +TK_ON = TK_STOP+1 ; ON token +TK_NULL = TK_ON+1 ; NULL token +TK_INC = TK_NULL+1 ; INC token +TK_WAIT = TK_INC+1 ; WAIT token +TK_LOAD = TK_WAIT+1 ; LOAD token +TK_SAVE = TK_LOAD+1 ; SAVE token +TK_DEF = TK_SAVE+1 ; DEF token +TK_POKE = TK_DEF+1 ; POKE token +TK_DOKE = TK_POKE+1 ; DOKE token +TK_CALL = TK_DOKE+1 ; CALL token +TK_DO = TK_CALL+1 ; DO token +TK_LOOP = TK_DO+1 ; LOOP token +TK_PRINT = TK_LOOP+1 ; PRINT token +TK_CONT = TK_PRINT+1 ; CONT token +TK_LIST = TK_CONT+1 ; LIST token +TK_CLEAR = TK_LIST+1 ; CLEAR token +TK_NEW = TK_CLEAR+1 ; NEW token +TK_WIDTH = TK_NEW+1 ; WIDTH token +TK_GET = TK_WIDTH+1 ; GET token +TK_SWAP = TK_GET+1 ; SWAP token +TK_BITSET = TK_SWAP+1 ; BITSET token +TK_BITCLR = TK_BITSET+1 ; BITCLR token +TK_IRQ = TK_BITCLR+1 ; IRQ token +TK_NMI = TK_IRQ+1 ; NMI token + +; secondary command tokens, can't start a statement + +TK_TAB = TK_NMI+1 ; TAB token +TK_ELSE = TK_TAB+1 ; ELSE token +TK_TO = TK_ELSE+1 ; TO token +TK_FN = TK_TO+1 ; FN token +TK_SPC = TK_FN+1 ; SPC token +TK_THEN = TK_SPC+1 ; THEN token +TK_NOT = TK_THEN+1 ; NOT token +TK_STEP = TK_NOT+1 ; STEP token +TK_UNTIL = TK_STEP+1 ; UNTIL token +TK_WHILE = TK_UNTIL+1 ; WHILE token +TK_OFF = TK_WHILE+1 ; OFF token + +; opperator tokens + +TK_PLUS = TK_OFF+1 ; + token +TK_MINUS = TK_PLUS+1 ; - token +TK_MUL = TK_MINUS+1 ; * token +TK_DIV = TK_MUL+1 ; / token +TK_POWER = TK_DIV+1 ; ^ token +TK_AND = TK_POWER+1 ; AND token +TK_EOR = TK_AND+1 ; EOR token +TK_OR = TK_EOR+1 ; OR token +TK_RSHIFT = TK_OR+1 ; RSHIFT token +TK_LSHIFT = TK_RSHIFT+1 ; LSHIFT token +TK_GT = TK_LSHIFT+1 ; > token +TK_EQUAL = TK_GT+1 ; = token +TK_LT = TK_EQUAL+1 ; < token + +; functions tokens + +TK_SGN = TK_LT+1 ; SGN token +TK_INT = TK_SGN+1 ; INT token +TK_ABS = TK_INT+1 ; ABS token +TK_USR = TK_ABS+1 ; USR token +TK_FRE = TK_USR+1 ; FRE token +TK_POS = TK_FRE+1 ; POS token +TK_SQR = TK_POS+1 ; SQR token +TK_RND = TK_SQR+1 ; RND token +TK_LOG = TK_RND+1 ; LOG token +TK_EXP = TK_LOG+1 ; EXP token +TK_COS = TK_EXP+1 ; COS token +TK_SIN = TK_COS+1 ; SIN token +TK_TAN = TK_SIN+1 ; TAN token +TK_ATN = TK_TAN+1 ; ATN token +TK_PEEK = TK_ATN+1 ; PEEK token +TK_DEEK = TK_PEEK+1 ; DEEK token +TK_SADD = TK_DEEK+1 ; SADD token +TK_LEN = TK_SADD+1 ; LEN token +TK_STRS = TK_LEN+1 ; STR$ token +TK_VAL = TK_STRS+1 ; VAL token +TK_ASC = TK_VAL+1 ; ASC token +TK_UCASES = TK_ASC+1 ; UCASE$ token +TK_LCASES = TK_UCASES+1 ; LCASE$ token +TK_CHRS = TK_LCASES+1 ; CHR$ token +TK_HEXS = TK_CHRS+1 ; HEX$ token +TK_BINS = TK_HEXS+1 ; BIN$ token +TK_BITTST = TK_BINS+1 ; BITTST token +TK_MAX = TK_BITTST+1 ; MAX token +TK_MIN = TK_MAX+1 ; MIN token +TK_PI = TK_MIN+1 ; PI token +TK_TWOPI = TK_PI+1 ; TWOPI token +TK_VPTR = TK_TWOPI+1 ; VARPTR token +TK_LEFTS = TK_VPTR+1 ; LEFT$ token +TK_RIGHTS = TK_LEFTS+1 ; RIGHT$ token +TK_MIDS = TK_RIGHTS+1 ; MID$ token + +; offsets from a base of X or Y + +PLUS_0 = $00 ; X or Y plus 0 +PLUS_1 = $01 ; X or Y plus 1 +PLUS_2 = $02 ; X or Y plus 2 +PLUS_3 = $03 ; X or Y plus 3 + +LAB_STAK = $0100 ; stack bottom, no offset + +LAB_SKFE = LAB_STAK+$FE + ; flushed stack address +LAB_SKFF = LAB_STAK+$FF + ; flushed stack address + +; the following locations are bulk initialized from PG2_TABS at LAB_COLD +ccflag = $0200 ; BASIC CTRL-C flag, 00 = enabled, 01 = dis +ccbyte = ccflag+1 ; BASIC CTRL-C byte +ccnull = ccbyte+1 ; BASIC CTRL-C byte timeout + +VEC_CC = ccnull+1 ; ctrl c check vector +; end bulk initialize from PG2_TABS at LAB_COLD + +; the following locations are bulk initialized by min_mon.asm from LAB_vec at LAB_stlp +VEC_IN = VEC_CC+2 ; input vector +VEC_OUT = VEC_IN+2 ; output vector +VEC_LD = VEC_OUT+2 ; load vector +VEC_SV = VEC_LD+2 ; save vector +; end bulk initialize by min_mon.asm from LAB_vec at LAB_stlp + +; Ibuffs can now be anywhere in RAM, ensure that the max length is < $80, +; the input buffer must not cross a page boundary and must not overlap with +; program RAM pages! + +;Ibuffs = IRQ_vec+$14 +Ibuffs = VEC_SV+$16 + ; start of input buffer after IRQ/NMI code +Ibuffe = Ibuffs+$47; end of input buffer + +Ram_base = $0300 ; start of user RAM (set as needed, should be page aligned) +Ram_top = $C000 ; end of user RAM+1 (set as needed, should be page aligned) + +Stack_floor = 16 ; bytes left free on stack for background interrupts + +; This start can be changed to suit your system + + *= $C000 + +; BASIC cold start entry point + +; new page 2 initialisation, copy block to ccflag on + +LAB_COLD + LDY #PG2_TABE-PG2_TABS-1 + ; byte count-1 +LAB_2D13 + LDA PG2_TABS,Y ; get byte + STA ccflag,Y ; store in page 2 + DEY ; decrement count + BPL LAB_2D13 ; loop if not done + + LDX #$FF ; set byte + STX Clineh ; set current line high byte (set immediate mode) + TXS ; reset stack pointer + + LDA #$4C ; code for JMP + STA Fnxjmp ; save for jump vector for functions + +; copy block from LAB_2CEE to $00BC - $00D7 + + LDX #StrTab-LAB_2CEE ; set byte count +LAB_2D4E + LDA LAB_2CEE-1,X ; get byte from table + STA LAB_IGBY-1,X ; save byte in page zero + DEX ; decrement count + BNE LAB_2D4E ; loop if not all done + +; copy block from StrTab to $0000 - $0012 + +LAB_GMEM + LDX #EndTab-StrTab-1 ; set byte count-1 +TabLoop + LDA StrTab,X ; get byte from table + STA PLUS_0,X ; save byte in page zero + DEX ; decrement count + BPL TabLoop ; loop if not all done + +; set-up start values + + LDA #$00 ; clear A + STA NmiBase ; clear NMI handler enabled flag + STA IrqBase ; clear IRQ handler enabled flag + STA FAC1_o ; clear FAC1 overflow byte + STA last_sh ; clear descriptor stack top item pointer high byte + + LDA #$0E ; set default tab size + STA TabSiz ; save it + LDA #$03 ; set garbage collect step size for descriptor stack + STA g_step ; save it + LDX #des_sk ; descriptor stack start + STX next_s ; set descriptor stack pointer + JSR LAB_CRLF ; print CR/LF + LDA #LAB_MSZM ; point to memory size message (high addr) + JSR LAB_18C3 ; print null terminated string from memory + JSR LAB_INLN ; print "? " and get BASIC input + STX Bpntrl ; set BASIC execute pointer low byte + STY Bpntrh ; set BASIC execute pointer high byte + JSR LAB_GBYT ; get last byte back + + BNE LAB_2DAA ; branch if not null (user typed something) + + LDY #$00 ; else clear Y + ; character was null so get memory size the hard way + ; we get here with Y=0 and Itempl/h = Ram_base +LAB_2D93 + INC Itempl ; increment temporary integer low byte + BNE LAB_2D99 ; branch if no overflow + + INC Itemph ; increment temporary integer high byte + LDA Itemph ; get high byte + CMP #>Ram_top ; compare with top of RAM+1 + BEQ LAB_2DB6 ; branch if match (end of user RAM) + +LAB_2D99 + LDA #$55 ; set test byte + STA (Itempl),Y ; save via temporary integer + CMP (Itempl),Y ; compare via temporary integer + BNE LAB_2DB6 ; branch if fail + + ASL ; shift test byte left (now $AA) + STA (Itempl),Y ; save via temporary integer + CMP (Itempl),Y ; compare via temporary integer + BEQ LAB_2D93 ; if ok go do next byte + + BNE LAB_2DB6 ; branch if fail + +LAB_2DAA + JSR LAB_2887 ; get FAC1 from string + LDA FAC1_e ; get FAC1 exponent + CMP #$98 ; compare with exponent = 2^24 + BCS LAB_GMEM ; if too large go try again + + JSR LAB_F2FU ; save integer part of FAC1 in temporary integer + ; (no range check) + +LAB_2DB6 + LDA Itempl ; get temporary integer low byte + LDY Itemph ; get temporary integer high byte + CPY #Ram_top ; compare with top of RAM high byte +; BCC MEM_OK ; branch if < RAM top + +; BNE LAB_GMEM ; if too large go try again + ; else was = so compare low bytes +; CMP #Ram_base ; set start addr high byte + STY Smeml ; save start of mem low byte + STX Smemh ; save start of mem high byte + +; this line is only needed if Ram_base is not $xx00 + .IF Ram_base&$FF>0 + LDY #$00 ; clear Y + .ENDIF + + TYA ; clear A + STA (Smeml),Y ; clear first byte + INC Smeml ; increment start of mem low byte + +; these two lines are only needed if Ram_base is $xxFF + .IF Ram_base&$FF==$FF + BNE LAB_2E05 ; branch if no rollover + INC Smemh ; increment start of mem high byte +LAB_2E05 + .ENDIF + + JSR LAB_CRLF ; print CR/LF + JSR LAB_1463 ; do "NEW" and "CLEAR" + LDA Ememl ; get end of mem low byte + SEC ; set carry for subtract + SBC Smeml ; subtract start of mem low byte + TAX ; copy to X + LDA Ememh ; get end of mem high byte + SBC Smemh ; subtract start of mem high byte + JSR LAB_295E ; print XA as unsigned integer (bytes free) + LDA #LAB_SMSG ; point to sign-on message (high addr) + JSR LAB_18C3 ; print null terminated string from memory + LDA #LAB_1274 ; warm start vector high byte + STA Wrmjpl ; save warm start vector low byte + STY Wrmjph ; save warm start vector high byte + JMP (Wrmjpl) ; go do warm start + +; open up space in memory +; move (Ostrtl)-(Obendl) to new block ending at (Nbendl) + +; Nbendl,Nbendh - new block end address (A/Y) +; Obendl,Obendh - old block end address +; Ostrtl,Ostrth - old block start address + +; returns with .. + +; Nbendl,Nbendh - new block start address (high byte - $100) +; Obendl,Obendh - old block start address (high byte - $100) +; Ostrtl,Ostrth - old block start address (unchanged) + +LAB_11CF + JSR LAB_121F ; check available memory, "Out of memory" error if no room + ; addr to check is in AY (low/high) + STA Earryl ; save new array mem end low byte + STY Earryh ; save new array mem end high byte + +; open up space in memory +; move (Ostrtl)-(Obendl) to new block ending at (Nbendl) +; don't set array end + +LAB_11D6 + SEC ; set carry for subtract + LDA Obendl ; get block end low byte + SBC Ostrtl ; subtract block start low byte + TAY ; copy MOD(block length/$100) byte to Y + LDA Obendh ; get block end high byte + SBC Ostrth ; subtract block start high byte + TAX ; copy block length high byte to X + INX ; +1 to allow for count=0 exit + TYA ; copy block length low byte to A + BEQ LAB_120A ; branch if length low byte=0 + + ; block is (X-1)*256+Y bytes, do the Y bytes first + + SEC ; set carry for add + 1, two's complement + EOR #$FF ; invert low byte for subtract + ADC Obendl ; add block end low byte + + STA Obendl ; save corrected old block end low byte + BCS LAB_11F3 ; branch if no underflow + + DEC Obendh ; else decrement block end high byte + SEC ; set carry for add + 1, two's complement +LAB_11F3 + TYA ; get MOD(block length/$100) byte + EOR #$FF ; invert low byte for subtract + ADC Nbendl ; add destination end low byte + STA Nbendl ; save modified new block end low byte + BCS LAB_1203 ; branch if no underflow + + DEC Nbendh ; else decrement block end high byte + BCC LAB_1203 ; branch always + +LAB_11FF + LDA (Obendl),Y ; get byte from source + STA (Nbendl),Y ; copy byte to destination +LAB_1203 + DEY ; decrement index + BNE LAB_11FF ; loop until Y=0 + + ; now do Y=0 indexed byte + LDA (Obendl),Y ; get byte from source + STA (Nbendl),Y ; save byte to destination +LAB_120A + DEC Obendh ; decrement source pointer high byte + DEC Nbendh ; decrement destination pointer high byte + DEX ; decrement block count + BNE LAB_1203 ; loop until count = $0 + + RTS + +; check room on stack for A bytes +; stack too deep? do OM error + +LAB_1212 +; *** patch - additional stack floor protection for background interrupts +; *** add + .IF Stack_floor + CLC ; prep ADC + ADC #Stack_floor ; stack pointer lower limit before interrupts + .ENDIF +; *** end patch + STA TempB ; save result in temp byte + TSX ; copy stack + CPX TempB ; compare new "limit" with stack + BCC LAB_OMER ; if stack < limit do "Out of memory" error then warm start + + RTS + +; check available memory, "Out of memory" error if no room +; addr to check is in AY (low/high) + +LAB_121F + CPY Sstorh ; compare bottom of string mem high byte + BCC LAB_124B ; if less then exit (is ok) + + BNE LAB_1229 ; skip next test if greater (tested <) + + ; high byte was =, now do low byte + CMP Sstorl ; compare with bottom of string mem low byte + BCC LAB_124B ; if less then exit (is ok) + + ; addr is > string storage ptr (oops!) +LAB_1229 + PHA ; push addr low byte + LDX #$08 ; set index to save Adatal to expneg inclusive + TYA ; copy addr high byte (to push on stack) + + ; save misc numeric work area +LAB_122D + PHA ; push byte + LDA Adatal-1,X ; get byte from Adatal to expneg ( ,$00 not pushed) + DEX ; decrement index + BPL LAB_122D ; loop until all done + + JSR LAB_GARB ; garbage collection routine + + ; restore misc numeric work area + LDX #$00 ; clear the index to restore bytes +LAB_1238 + PLA ; pop byte + STA Adatal,X ; save byte to Adatal to expneg + INX ; increment index + CPX #$08 ; compare with end + 1 + BMI LAB_1238 ; loop if more to do + + PLA ; pop addr high byte + TAY ; copy back to Y + PLA ; pop addr low byte + CPY Sstorh ; compare bottom of string mem high byte + BCC LAB_124B ; if less then exit (is ok) + + BNE LAB_OMER ; if greater do "Out of memory" error then warm start + + ; high byte was =, now do low byte + CMP Sstorl ; compare with bottom of string mem low byte + BCS LAB_OMER ; if >= do "Out of memory" error then warm start + + ; ok exit, carry clear +LAB_124B + RTS + +; do "Out of memory" error then warm start + +LAB_OMER + LDX #$0C ; error code $0C ("Out of memory" error) + +; do error #X, then warm start + +LAB_XERR + JSR LAB_CRLF ; print CR/LF + + LDA LAB_BAER,X ; get error message pointer low byte + LDY LAB_BAER+1,X ; get error message pointer high byte + JSR LAB_18C3 ; print null terminated string from memory + + JSR LAB_1491 ; flush stack and clear continue flag + LDA #LAB_EMSG ; point to " Error" high addr +LAB_1269 + JSR LAB_18C3 ; print null terminated string from memory + LDY Clineh ; get current line high byte + INY ; increment it + BEQ LAB_1274 ; go do warm start (was immediate mode) + + ; else print line number + JSR LAB_2953 ; print " in line [LINE #]" + +; BASIC warm start entry point +; wait for Basic command + +LAB_1274 + ; clear ON IRQ/NMI bytes + LDA #$00 ; clear A + STA IrqBase ; clear enabled byte + STA NmiBase ; clear enabled byte + LDA #LAB_RMSG ; point to "Ready" message high byte + + JSR LAB_18C3 ; go do print string + +; wait for Basic command (no "Ready") + +LAB_127D + JSR LAB_1357 ; call for BASIC input +LAB_1280 + STX Bpntrl ; set BASIC execute pointer low byte + STY Bpntrh ; set BASIC execute pointer high byte + JSR LAB_GBYT ; scan memory + BEQ LAB_127D ; loop while null + +; got to interpret input line now .. + + LDX #$FF ; current line to null value + STX Clineh ; set current line high byte + BCC LAB_1295 ; branch if numeric character (handle new BASIC line) + + ; no line number .. immediate mode + JSR LAB_13A6 ; crunch keywords into Basic tokens + JMP LAB_15F6 ; go scan and interpret code + +; handle new BASIC line + +LAB_1295 + JSR LAB_GFPN ; get fixed-point number into temp integer + JSR LAB_13A6 ; crunch keywords into Basic tokens + STY Ibptr ; save index pointer to end of crunched line + JSR LAB_SSLN ; search BASIC for temp integer line number + BCC LAB_12E6 ; branch if not found + + ; aroooogah! line # already exists! delete it + LDY #$01 ; set index to next line pointer high byte + LDA (Baslnl),Y ; get next line pointer high byte + STA ut1_ph ; save it + LDA Svarl ; get start of vars low byte + STA ut1_pl ; save it + LDA Baslnh ; get found line pointer high byte + STA ut2_ph ; save it + LDA Baslnl ; get found line pointer low byte + DEY ; decrement index + SBC (Baslnl),Y ; subtract next line pointer low byte + CLC ; clear carry for add + ADC Svarl ; add start of vars low byte + STA Svarl ; save new start of vars low byte + STA ut2_pl ; save destination pointer low byte + LDA Svarh ; get start of vars high byte + ADC #$FF ; -1 + carry + STA Svarh ; save start of vars high byte + SBC Baslnh ; subtract found line pointer high byte + TAX ; copy to block count + SEC ; set carry for subtract + LDA Baslnl ; get found line pointer low byte + SBC Svarl ; subtract start of vars low byte + TAY ; copy to bytes in first block count + BCS LAB_12D0 ; branch if overflow + + INX ; increment block count (correct for =0 loop exit) + DEC ut2_ph ; decrement destination high byte +LAB_12D0 + CLC ; clear carry for add + ADC ut1_pl ; add source pointer low byte + BCC LAB_12D8 ; branch if no overflow + + DEC ut1_ph ; else decrement source pointer high byte + CLC ; clear carry + + ; close up memory to delete old line +LAB_12D8 + LDA (ut1_pl),Y ; get byte from source + STA (ut2_pl),Y ; copy to destination + INY ; increment index + BNE LAB_12D8 ; while <> 0 do this block + + INC ut1_ph ; increment source pointer high byte + INC ut2_ph ; increment destination pointer high byte + DEX ; decrement block count + BNE LAB_12D8 ; loop until all done + + ; got new line in buffer and no existing same # +LAB_12E6 + LDA Ibuffs ; get byte from start of input buffer + BEQ LAB_1319 ; if null line just go flush stack/vars and exit + + ; got new line and it isn't empty line + LDA Ememl ; get end of mem low byte + LDY Ememh ; get end of mem high byte + STA Sstorl ; set bottom of string space low byte + STY Sstorh ; set bottom of string space high byte + LDA Svarl ; get start of vars low byte (end of BASIC) + STA Obendl ; save old block end low byte + LDY Svarh ; get start of vars high byte (end of BASIC) + STY Obendh ; save old block end high byte + ADC Ibptr ; add input buffer pointer (also buffer length) + BCC LAB_1301 ; branch if no overflow from add + + INY ; else increment high byte +LAB_1301 + STA Nbendl ; save new block end low byte (move to, low byte) + STY Nbendh ; save new block end high byte + JSR LAB_11CF ; open up space in memory + ; old start pointer Ostrtl,Ostrth set by the find line call + LDA Earryl ; get array mem end low byte + LDY Earryh ; get array mem end high byte + STA Svarl ; save start of vars low byte + STY Svarh ; save start of vars high byte + LDY Ibptr ; get input buffer pointer (also buffer length) + DEY ; adjust for loop type +LAB_1311 + LDA Ibuffs-4,Y ; get byte from crunched line + STA (Baslnl),Y ; save it to program memory + DEY ; decrement count + CPY #$03 ; compare with first byte-1 + BNE LAB_1311 ; continue while count <> 3 + + LDA Itemph ; get line # high byte + STA (Baslnl),Y ; save it to program memory + DEY ; decrement count + LDA Itempl ; get line # low byte + STA (Baslnl),Y ; save it to program memory + DEY ; decrement count + LDA #$FF ; set byte to allow chain rebuild. if you didn't set this + ; byte then a zero already here would stop the chain rebuild + ; as it would think it was the [EOT] marker. + STA (Baslnl),Y ; save it to program memory + +LAB_1319 + JSR LAB_1477 ; reset execution to start, clear vars and flush stack + LDX Smeml ; get start of mem low byte + LDA Smemh ; get start of mem high byte + LDY #$01 ; index to high byte of next line pointer +LAB_1325 + STX ut1_pl ; set line start pointer low byte + STA ut1_ph ; set line start pointer high byte + LDA (ut1_pl),Y ; get it + BEQ LAB_133E ; exit if end of program + +; rebuild chaining of Basic lines + + LDY #$04 ; point to first code byte of line + ; there is always 1 byte + [EOL] as null entries are deleted +LAB_1330 + INY ; next code byte + LDA (ut1_pl),Y ; get byte + BNE LAB_1330 ; loop if not [EOL] + + SEC ; set carry for add + 1 + TYA ; copy end index + ADC ut1_pl ; add to line start pointer low byte + TAX ; copy to X + LDY #$00 ; clear index, point to this line's next line pointer + STA (ut1_pl),Y ; set next line pointer low byte + TYA ; clear A + ADC ut1_ph ; add line start pointer high byte + carry + INY ; increment index to high byte + STA (ut1_pl),Y ; save next line pointer low byte + BCC LAB_1325 ; go do next line, branch always, carry clear + + +LAB_133E + JMP LAB_127D ; else we just wait for Basic command, no "Ready" + +; print "? " and get BASIC input + +LAB_INLN + JSR LAB_18E3 ; print "?" character + JSR LAB_18E0 ; print " " + BNE LAB_1357 ; call for BASIC input and return + +; receive line from keyboard + + ; $08 as delete key (BACKSPACE on standard keyboard) +LAB_134B + JSR LAB_PRNA ; go print the character + DEX ; decrement the buffer counter (delete) + .byte $2C ; make LDX into BIT abs + +; call for BASIC input (main entry point) + +LAB_1357 + LDX #$00 ; clear BASIC line buffer pointer +LAB_1359 + JSR V_INPT ; call scan input device + BCC LAB_1359 ; loop if no byte + + BEQ LAB_1359 ; loop until valid input (ignore NULLs) + + CMP #$07 ; compare with [BELL] + BEQ LAB_1378 ; branch if [BELL] + + CMP #$0D ; compare with [CR] + BEQ LAB_1384 ; do CR/LF exit if [CR] + CMP #$0A + BEQ LAB_1384 ; [LF] acts like [CR] too + + CPX #$00 ; compare pointer with $00 + BNE LAB_1374 ; branch if not empty + +; next two lines ignore any non print character and [SPACE] if input buffer empty + + CMP #$21 ; compare with [SP]+1 + BCC LAB_1359 ; if < ignore character + +LAB_1374 + CMP #$08 ; compare with [BACKSPACE] (delete last character) + BEQ LAB_134B ; go delete last character + +LAB_1378 + CPX #Ibuffe-Ibuffs ; compare character count with max + BCS LAB_138E ; skip store and do [BELL] if buffer full + + STA Ibuffs,X ; else store in buffer + INX ; increment pointer +LAB_137F + JSR LAB_PRNA ; go print the character + BNE LAB_1359 ; always loop for next character + +LAB_1384 + JMP LAB_1866 ; do CR/LF exit to BASIC + +; announce buffer full + +LAB_138E + LDA #$07 ; [BELL] character into A + BNE LAB_137F ; go print the [BELL] but ignore input character + ; branch always + +; crunch keywords into Basic tokens +; position independent buffer version .. +; faster, dictionary search version .... + +LAB_13A6 + LDY #$FF ; set save index (makes for easy math later) + + SEC ; set carry for subtract + LDA Bpntrl ; get basic execute pointer low byte + SBC #= go save byte then continue crunching + + CMP #'<' ; compare with "<" + BCS LAB_13CC ; if >= go crunch now + + CMP #'0' ; compare with "0" + BCS LAB_13EC ; if >= go save byte then continue crunching + + STA Scnquo ; save buffer byte as search character + CMP #$22 ; is it quote character? + BEQ LAB_1410 ; branch if so (copy quoted string) + + CMP #'*' ; compare with "*" + BCC LAB_13EC ; if < go save byte then continue crunching + + ; else crunch now +LAB_13CC + BIT Oquote ; get open quote/DATA token flag + BVS LAB_13EC ; branch if b6 of Oquote set (was DATA) + ; go save byte then continue crunching + + STX TempB ; save buffer read index + STY csidx ; copy buffer save index + LDY #TAB_1STC ; get keyword first character table high address + STY ut2_ph ; save pointer high byte + LDY #$00 ; clear table pointer + +LAB_13D0 + CMP (ut2_pl),Y ; compare with keyword first character table byte + BEQ LAB_13D1 ; go do word_table_chr if match + + BCC LAB_13EA ; if < keyword first character table byte go restore + ; Y and save to crunched + + INY ; else increment pointer + BNE LAB_13D0 ; and loop (branch always) + +; have matched first character of some keyword + +LAB_13D1 + TYA ; copy matching index + ASL ; *2 (bytes per pointer) + TAX ; copy to new index + LDA TAB_CHRT,X ; get keyword table pointer low byte + STA ut2_pl ; save pointer low byte + LDA TAB_CHRT+1,X ; get keyword table pointer high byte + STA ut2_ph ; save pointer high byte + + LDY #$FF ; clear table pointer (make -1 for start) + + LDX TempB ; restore buffer read index + +LAB_13D6 + INY ; next table byte + LDA (ut2_pl),Y ; get byte from table +LAB_13D8 + BMI LAB_13EA ; all bytes matched so go save token + + INX ; next buffer byte + CMP Ibuffs,X ; compare with byte from input buffer + BEQ LAB_13D6 ; go compare next if match + + BNE LAB_1417 ; branch if >< (not found keyword) + +LAB_13EA + LDY csidx ; restore save index + + ; save crunched to output +LAB_13EC + INX ; increment buffer index (to next input byte) + INY ; increment save index (to next output byte) + STA Ibuffs,Y ; save byte to output + CMP #$00 ; set the flags, set carry + BEQ LAB_142A ; do exit if was null [EOL] + + ; A holds token or byte here + SBC #':' ; subtract ":" (carry set by CMP #00) + BEQ LAB_13FF ; branch if it was ":" (is now $00) + + ; A now holds token-$3A + CMP #TK_DATA-$3A ; compare with DATA token - $3A + BNE LAB_1401 ; branch if not DATA + + ; token was : or DATA +LAB_13FF + STA Oquote ; save token-$3A (clear for ":", TK_DATA-$3A for DATA) +LAB_1401 + EOR #TK_REM-$3A ; effectively subtract REM token offset + BNE LAB_13AC ; If wasn't REM then go crunch rest of line + + STA Asrch ; else was REM so set search for [EOL] + + ; loop for REM, "..." etc. +LAB_1408 + LDA Ibuffs,X ; get byte from input buffer + BEQ LAB_13EC ; branch if null [EOL] + + CMP Asrch ; compare with stored character + BEQ LAB_13EC ; branch if match (end quote) + + ; entry for copy string in quotes, don't crunch +LAB_1410 + INY ; increment buffer save index + STA Ibuffs,Y ; save byte to output + INX ; increment buffer read index + BNE LAB_1408 ; loop while <> 0 (should never be 0!) + + ; not found keyword this go +LAB_1417 + LDX TempB ; compare has failed, restore buffer index (start byte!) + + ; now find the end of this word in the table +LAB_141B + LDA (ut2_pl),Y ; get table byte + PHP ; save status + INY ; increment table index + PLP ; restore byte status + BPL LAB_141B ; if not end of keyword go do next + + LDA (ut2_pl),Y ; get byte from keyword table + BNE LAB_13D8 ; go test next word if not zero byte (end of table) + + ; reached end of table with no match + LDA Ibuffs,X ; restore byte from input buffer + BPL LAB_13EA ; branch always (all bytes in buffer are $00-$7F) + ; go save byte in output and continue crunching + + ; reached [EOL] +LAB_142A + INY ; increment pointer + INY ; increment pointer (makes it next line pointer high byte) + STA Ibuffs,Y ; save [EOL] (marks [EOT] in immediate mode) + INY ; adjust for line copy + INY ; adjust for line copy + INY ; adjust for line copy +; *** begin patch for when Ibuffs is $xx00 - Daryl Rictor *** +; *** insert + .IF Ibuffs&$FF==0 + LDA Bpntrl ; test for $00 + BNE LAB_142P ; not $00 + DEC Bpntrh ; allow for increment when $xx00 +LAB_142P + .ENDIF +; *** end patch for when Ibuffs is $xx00 - Daryl Rictor *** +; end of patch + DEC Bpntrl ; allow for increment + RTS + +; search Basic for temp integer line number from start of mem + +LAB_SSLN + LDA Smeml ; get start of mem low byte + LDX Smemh ; get start of mem high byte + +; search Basic for temp integer line number from AX +; returns carry set if found +; returns Baslnl/Baslnh pointer to found or next higher (not found) line + +; old 541 new 507 + +LAB_SHLN + LDY #$01 ; set index + STA Baslnl ; save low byte as current + STX Baslnh ; save high byte as current + LDA (Baslnl),Y ; get pointer high byte from addr + BEQ LAB_145F ; pointer was zero so we're done, do 'not found' exit + + LDY #$03 ; set index to line # high byte + LDA (Baslnl),Y ; get line # high byte + DEY ; decrement index (point to low byte) + CMP Itemph ; compare with temporary integer high byte + BNE LAB_1455 ; if <> skip low byte check + + LDA (Baslnl),Y ; get line # low byte + CMP Itempl ; compare with temporary integer low byte +LAB_1455 + BCS LAB_145E ; else if temp < this line, exit (passed line#) + +LAB_1456 + DEY ; decrement index to next line ptr high byte + LDA (Baslnl),Y ; get next line pointer high byte + TAX ; copy to X + DEY ; decrement index to next line ptr low byte + LDA (Baslnl),Y ; get next line pointer low byte + BCC LAB_SHLN ; go search for line # in temp (Itempl/Itemph) from AX + ; (carry always clear) + +LAB_145E + BEQ LAB_1460 ; exit if temp = found line #, carry is set + +LAB_145F + CLC ; clear found flag +LAB_1460 + RTS + +; perform NEW + +LAB_NEW + BNE LAB_1460 ; exit if not end of statement (to do syntax error) + +LAB_1463 + LDA #$00 ; clear A + TAY ; clear Y + STA (Smeml),Y ; clear first line, next line pointer, low byte + INY ; increment index + STA (Smeml),Y ; clear first line, next line pointer, high byte + CLC ; clear carry + LDA Smeml ; get start of mem low byte + ADC #$02 ; calculate end of BASIC low byte + STA Svarl ; save start of vars low byte + LDA Smemh ; get start of mem high byte + ADC #$00 ; add any carry + STA Svarh ; save start of vars high byte + +; reset execution to start, clear vars and flush stack + +LAB_1477 + CLC ; clear carry + LDA Smeml ; get start of mem low byte + ADC #$FF ; -1 + STA Bpntrl ; save BASIC execute pointer low byte + LDA Smemh ; get start of mem high byte + ADC #$FF ; -1+carry + STA Bpntrh ; save BASIC execute pointer high byte + +; "CLEAR" command gets here + +LAB_147A + LDA Ememl ; get end of mem low byte + LDY Ememh ; get end of mem high byte + STA Sstorl ; set bottom of string space low byte + STY Sstorh ; set bottom of string space high byte + LDA Svarl ; get start of vars low byte + LDY Svarh ; get start of vars high byte + STA Sarryl ; save var mem end low byte + STY Sarryh ; save var mem end high byte + STA Earryl ; save array mem end low byte + STY Earryh ; save array mem end high byte + JSR LAB_161A ; perform RESTORE command + +; flush stack and clear continue flag + +LAB_1491 + LDX #des_sk ; set descriptor stack pointer + STX next_s ; save descriptor stack pointer + PLA ; pull return address low byte + TAX ; copy return address low byte + PLA ; pull return address high byte + STX LAB_SKFE ; save to cleared stack + STA LAB_SKFF ; save to cleared stack + LDX #$FD ; new stack pointer + TXS ; reset stack + LDA #$00 ; clear byte +;*** fix p2: no longer necessary as the continue pointer is saved anyway +; STA Cpntrh ; clear continue pointer high byte + STA Sufnxf ; clear subscript/FNX flag +LAB_14A6 + RTS + +; perform CLEAR + +LAB_CLEAR + BEQ LAB_147A ; if no following token go do "CLEAR" + + ; else there was a following token (go do syntax error) + RTS + +; perform LIST [n][-m] +; bigger, faster version (a _lot_ faster) + +LAB_LIST + BCC LAB_14BD ; branch if next character numeric (LIST n..) + + BEQ LAB_14BD ; branch if next character [NULL] (LIST) + + CMP #TK_MINUS ; compare with token for - + BNE LAB_14A6 ; exit if not - (LIST -m) + + ; LIST [[n][-m]] + ; this bit sets the n , if present, as the start and end +LAB_14BD + JSR LAB_GFPN ; get fixed-point number into temp integer + JSR LAB_SSLN ; search BASIC for temp integer line number + ; (pointer in Baslnl/Baslnh) + JSR LAB_GBYT ; scan memory + BEQ LAB_14D4 ; branch if no more characters + + ; this bit checks the - is present + CMP #TK_MINUS ; compare with token for - + BNE LAB_1460 ; return if not "-" (will be Syntax error) + + ; LIST [n]-m + ; the - was there so set m as the end value + JSR LAB_IGBY ; increment and scan memory + JSR LAB_GFPN ; get fixed-point number into temp integer + BNE LAB_1460 ; exit if not ok + +LAB_14D4 + LDA Itempl ; get temporary integer low byte + ORA Itemph ; OR temporary integer high byte + BNE LAB_14E2 ; branch if start set + + LDA #$FF ; set for -1 + STA Itempl ; set temporary integer low byte + STA Itemph ; set temporary integer high byte +LAB_14E2 + LDY #$01 ; set index for line + STY Oquote ; clear open quote flag + JSR LAB_CRLF ; print CR/LF + LDA (Baslnl),Y ; get next line pointer high byte + ; pointer initially set by search at LAB_14BD + BEQ LAB_152B ; if null all done so exit + JSR LAB_1629 ; do CRTL-C check vector + + INY ; increment index for line + LDA (Baslnl),Y ; get line # low byte + TAX ; copy to X + INY ; increment index + LDA (Baslnl),Y ; get line # high byte + CMP Itemph ; compare with temporary integer high byte + BNE LAB_14FF ; branch if no high byte match + + CPX Itempl ; compare with temporary integer low byte + BEQ LAB_1501 ; branch if = last line to do (< will pass next branch) + +LAB_14FF ; else .. + BCS LAB_152B ; if greater all done so exit + +LAB_1501 + STY Tidx1 ; save index for line + JSR LAB_295E ; print XA as unsigned integer + LDA #$20 ; space is the next character +LAB_1508 + LDY Tidx1 ; get index for line + AND #$7F ; mask top out bit of character +LAB_150C + JSR LAB_PRNA ; go print the character + CMP #$22 ; was it " character + BNE LAB_1519 ; branch if not + + ; we are either entering or leaving a pair of quotes + LDA Oquote ; get open quote flag + EOR #$FF ; toggle it + STA Oquote ; save it back +LAB_1519 + INY ; increment index + LDA (Baslnl),Y ; get next byte + BNE LAB_152E ; branch if not [EOL] (go print character) + TAY ; else clear index + LDA (Baslnl),Y ; get next line pointer low byte + TAX ; copy to X + INY ; increment index + LDA (Baslnl),Y ; get next line pointer high byte + STX Baslnl ; set pointer to line low byte + STA Baslnh ; set pointer to line high byte + BNE LAB_14E2 ; go do next line if not [EOT] + ; else .. +LAB_152B + RTS + +LAB_152E + BPL LAB_150C ; just go print it if not token byte + + ; else was token byte so uncrunch it (maybe) + BIT Oquote ; test the open quote flag + BMI LAB_150C ; just go print character if open quote set + + LDX #>LAB_KEYT ; get table address high byte + ASL ; *2 + ASL ; *4 + BCC LAB_152F ; branch if no carry + + INX ; else increment high byte + CLC ; clear carry for add +LAB_152F + ADC #LAB_159F ; set return address high byte + STA ut1_pl ; save return address low byte + STY ut1_ph ; save return address high byte + JMP LAB_1B66 ; round FAC1 and put on stack (returns to next instruction) + +LAB_159F + LDA #LAB_259C ; set 1 pointer high addr + JSR LAB_UFAC ; unpack memory (AY) into FAC1 + JSR LAB_GBYT ; scan memory + CMP #TK_STEP ; compare with STEP token + BNE LAB_15B3 ; jump if not "STEP" + + ;.was step so .. + JSR LAB_IGBY ; increment and scan memory + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch +LAB_15B3 + JSR LAB_27CA ; return A=FF,C=1/-ve A=01,C=0/+ve + STA FAC1_s ; set FAC1 sign (b7) + ; this is +1 for +ve step and -1 for -ve step, in NEXT we + ; compare the FOR value and the TO value and return +1 if + ; FOR > TO, 0 if FOR = TO and -1 if FOR < TO. the value + ; here (+/-1) is then compared to that result and if they + ; are the same (+ve and FOR > TO or -ve and FOR < TO) then + ; the loop is done + JSR LAB_1B5B ; push sign, round FAC1 and put on stack + LDA Frnxth ; get var pointer for FOR/NEXT high byte + PHA ; push on stack + LDA Frnxtl ; get var pointer for FOR/NEXT low byte + PHA ; push on stack + LDA #TK_FOR ; get FOR token + PHA ; push on stack + +; interpreter inner loop + +LAB_15C2 + JSR LAB_1629 ; do CRTL-C check vector + LDA Bpntrl ; get BASIC execute pointer low byte + LDY Bpntrh ; get BASIC execute pointer high byte + + LDX Clineh ; continue line is $FFxx for immediate mode + ; ($00xx for RUN from immediate mode) + INX ; increment it (now $00 if immediate mode) +;*** fix p2: skip no longer necessary as the continue pointer is saved anyway +; BEQ LAB_15D1 ; branch if null (immediate mode) + + STA Cpntrl ; save continue pointer low byte + STY Cpntrh ; save continue pointer high byte +LAB_15D1 + LDY #$00 ; clear index + LDA (Bpntrl),Y ; get next byte + BEQ LAB_15DC ; branch if null [EOL] + + CMP #':' ; compare with ":" + BEQ LAB_15F6 ; branch if = (statement separator) + +LAB_15D9 + JMP LAB_SNER ; else syntax error then warm start + + ; have reached [EOL] +LAB_15DC + LDY #$02 ; set index + LDA (Bpntrl),Y ; get next line pointer high byte + CLC ; clear carry for no "BREAK" message + BEQ LAB_1651 ; if null go to immediate mode (was immediate or [EOT] + ; marker) + + INY ; increment index + LDA (Bpntrl),Y ; get line # low byte + STA Clinel ; save current line low byte + INY ; increment index + LDA (Bpntrl),Y ; get line # high byte + STA Clineh ; save current line high byte + TYA ; A now = 4 + ADC Bpntrl ; add BASIC execute pointer low byte + STA Bpntrl ; save BASIC execute pointer low byte + BCC LAB_15F6 ; branch if no overflow + + INC Bpntrh ; else increment BASIC execute pointer high byte +LAB_15F6 + JSR LAB_IGBY ; increment and scan memory + +LAB_15F9 + JSR LAB_15FF ; go interpret BASIC code from (Bpntrl) + +LAB_15FC + JMP LAB_15C2 ; loop + +; interpret BASIC code from (Bpntrl) + +LAB_15FF + BEQ LAB_1628 ; exit if zero [EOL] + +LAB_1602 + ASL ; *2 bytes per vector and normalise token + BCS LAB_1609 ; branch if was token + + JMP LAB_LET ; else go do implied LET + +LAB_1609 + CMP #(TK_TAB-$80)*2 ; compare normalised token * 2 with TAB + BCS LAB_15D9 ; branch if A>=TAB (do syntax error then warm start) + ; only tokens before TAB can start a line + TAY ; copy to index + LDA LAB_CTBL+1,Y ; get vector high byte + PHA ; onto stack + LDA LAB_CTBL,Y ; get vector low byte + PHA ; onto stack + JMP LAB_IGBY ; jump to increment and scan memory + ; then "return" to vector + +; CTRL-C check jump. this is called as a subroutine but exits back via a jump if a +; key press is detected. + +LAB_1629 + JMP (VEC_CC) ; ctrl c check vector + +; if there was a key press it gets back here .. + +LAB_1636 + CMP #$03 ; compare with CTRL-C + +; perform STOP + +LAB_STOP + BCS LAB_163B ; branch if token follows STOP + ; else just END +; END + +LAB_END + CLC ; clear the carry, indicate a normal program end +LAB_163B + BNE LAB_167A ; if wasn't CTRL-C or there is a following byte return + + LDA Bpntrh ; get the BASIC execute pointer high byte +;*** fix p2: skip no longer necessary as the continue pointer is saved anyway +; EOR #>Ibuffs ; compare with buffer address high byte (Cb unchanged) +; BEQ LAB_164F ; branch if the BASIC pointer is in the input buffer +; ; (can't continue in immediate mode) +; ; else .. +; EOR #>Ibuffs ; correct the bits + LDY Bpntrl ; get BASIC execute pointer low byte + STY Cpntrl ; save continue pointer low byte + STA Cpntrh ; save continue pointer high byte +LAB_1647 + LDA Clinel ; get current line low byte + LDY Clineh ; get current line high byte + STA Blinel ; save break line low byte + STY Blineh ; save break line high byte +LAB_164F + PLA ; pull return address low + PLA ; pull return address high +LAB_1651 + BCC LAB_165E ; if was program end just do warm start + + ; else .. + LDA #LAB_BMSG ; point to "Break" high byte + JMP LAB_1269 ; print "Break" and do warm start + +LAB_165E + JMP LAB_1274 ; go do warm start + +; perform RESTORE + +LAB_RESTORE + BNE LAB_RESTOREn ; branch if next character not null (RESTORE n) + +LAB_161A + SEC ; set carry for subtract + LDA Smeml ; get start of mem low byte + SBC #$01 ; -1 + LDY Smemh ; get start of mem high byte + BCS LAB_1624 ; branch if no underflow + +LAB_uflow + DEY ; else decrement high byte +LAB_1624 + STA Dptrl ; save DATA pointer low byte + STY Dptrh ; save DATA pointer high byte +LAB_1628 + RTS + + ; is RESTORE n +LAB_RESTOREn + JSR LAB_GFPN ; get fixed-point number into temp integer + JSR LAB_SNBL ; scan for next BASIC line + LDA Clineh ; get current line high byte + CMP Itemph ; compare with temporary integer high byte + BCS LAB_reset_search ; branch if >= (start search from beginning) + + TYA ; else copy line index to A + SEC ; set carry (+1) + ADC Bpntrl ; add BASIC execute pointer low byte + LDX Bpntrh ; get BASIC execute pointer high byte + BCC LAB_go_search ; branch if no overflow to high byte + + INX ; increment high byte + BCS LAB_go_search ; branch always (can never be carry clear) + +; search for line # in temp (Itempl/Itemph) from start of mem pointer (Smeml) + +LAB_reset_search + LDA Smeml ; get start of mem low byte + LDX Smemh ; get start of mem high byte + +; search for line # in temp (Itempl/Itemph) from (AX) + +LAB_go_search + + JSR LAB_SHLN ; search Basic for temp integer line number from AX + BCS LAB_line_found ; if carry set go set pointer + + JMP LAB_16F7 ; else go do "Undefined statement" error + +LAB_line_found + ; carry already set for subtract + LDA Baslnl ; get pointer low byte + SBC #$01 ; -1 + LDY Baslnh ; get pointer high byte + BCS LAB_1624 ; branch if no underflow (save DATA pointer and return) + + BCC LAB_uflow ; else decrement high byte then save DATA pointer and + ; return (branch always) + +; perform NULL + +LAB_NULL + JSR LAB_GTBY ; get byte parameter + STX Nullct ; save new NULL count +LAB_167A + RTS + +; perform CONT + +LAB_CONT + BNE LAB_167A ; if following byte exit to do syntax error + + LDY Cpntrh ; get continue pointer high byte + CPY #>Ibuffs ; *** fix p2: test direct mode + BNE LAB_166C ; go do continue if we can + + LDX #$1E ; error code $1E ("Can't continue" error) + JMP LAB_XERR ; do error #X, then warm start + + ; we can continue so .. +LAB_166C + LDA #TK_ON ; set token for ON + JSR LAB_IRQ ; set IRQ flags + LDA #TK_ON ; set token for ON + JSR LAB_NMI ; set NMI flags + + STY Bpntrh ; save BASIC execute pointer high byte + LDA Cpntrl ; get continue pointer low byte + STA Bpntrl ; save BASIC execute pointer low byte + LDA Blinel ; get break line low byte + LDY Blineh ; get break line high byte + STA Clinel ; set current line low byte + STY Clineh ; set current line high byte + RTS + +; perform RUN + +LAB_RUN + BNE LAB_1696 ; branch if RUN n + JMP LAB_1477 ; reset execution to start, clear variables, flush stack and + ; return + +; does RUN n + +LAB_1696 + JSR LAB_147A ; go do "CLEAR" + BEQ LAB_16B0 ; get n and do GOTO n (branch always as CLEAR sets Z=1) + +; perform DO + +LAB_DO + LDA #$05 ; need 5 bytes for DO + JSR LAB_1212 ; check room on stack for A bytes + LDA Bpntrh ; get BASIC execute pointer high byte + PHA ; push on stack + LDA Bpntrl ; get BASIC execute pointer low byte + PHA ; push on stack + LDA Clineh ; get current line high byte + PHA ; push on stack + LDA Clinel ; get current line low byte + PHA ; push on stack + LDA #TK_DO ; token for DO + PHA ; push on stack + JSR LAB_GBYT ; scan memory + JMP LAB_15C2 ; go do interpreter inner loop + +; perform GOSUB + +LAB_GOSUB + LDA #$05 ; need 5 bytes for GOSUB + JSR LAB_1212 ; check room on stack for A bytes + LDA Bpntrh ; get BASIC execute pointer high byte + PHA ; push on stack + LDA Bpntrl ; get BASIC execute pointer low byte + PHA ; push on stack + LDA Clineh ; get current line high byte + PHA ; push on stack + LDA Clinel ; get current line low byte + PHA ; push on stack + LDA #TK_GOSUB ; token for GOSUB + PHA ; push on stack +LAB_16B0 + JSR LAB_GBYT ; scan memory + JSR LAB_GOTO ; perform GOTO n + JMP LAB_15C2 ; go do interpreter inner loop + ; (can't RTS, we used the stack!) + +; perform GOTO + +LAB_GOTO + JSR LAB_GFPN ; get fixed-point number into temp integer + JSR LAB_SNBL ; scan for next BASIC line + LDA Clineh ; get current line high byte + CMP Itemph ; compare with temporary integer high byte + BCS LAB_16D0 ; branch if >= (start search from beginning) + + TYA ; else copy line index to A + SEC ; set carry (+1) + ADC Bpntrl ; add BASIC execute pointer low byte + LDX Bpntrh ; get BASIC execute pointer high byte + BCC LAB_16D4 ; branch if no overflow to high byte + + INX ; increment high byte + BCS LAB_16D4 ; branch always (can never be carry) + +; search for line # in temp (Itempl/Itemph) from start of mem pointer (Smeml) + +LAB_16D0 + LDA Smeml ; get start of mem low byte + LDX Smemh ; get start of mem high byte + +; search for line # in temp (Itempl/Itemph) from (AX) + +LAB_16D4 + JSR LAB_SHLN ; search Basic for temp integer line number from AX + BCC LAB_16F7 ; if carry clear go do "Undefined statement" error + ; (unspecified statement) + + ; carry already set for subtract + LDA Baslnl ; get pointer low byte + SBC #$01 ; -1 + STA Bpntrl ; save BASIC execute pointer low byte + LDA Baslnh ; get pointer high byte + SBC #$00 ; subtract carry + STA Bpntrh ; save BASIC execute pointer high byte +LAB_16E5 + RTS + +LAB_DONOK + LDX #$22 ; error code $22 ("LOOP without DO" error) + JMP LAB_XERR ; do error #X, then warm start + +; perform LOOP + +LAB_LOOP + TAY ; save following token + TSX ; copy stack pointer + LDA LAB_STAK+3,X ; get token byte from stack + CMP #TK_DO ; compare with DO token + BNE LAB_DONOK ; branch if no matching DO + + INX ; dump calling routine return address + INX ; dump calling routine return address + TXS ; correct stack + TYA ; get saved following token back + BEQ LoopAlways ; if no following token loop forever + ; (stack pointer in X) + + CMP #':' ; could be ':' + BEQ LoopAlways ; if :... loop forever + + SBC #TK_UNTIL ; subtract token for UNTIL, we know carry is set here + TAX ; copy to X (if it was UNTIL then Y will be correct) + BEQ DoRest ; branch if was UNTIL + + DEX ; decrement result + BNE LAB_16FC ; if not WHILE go do syntax error and warm start + ; only if the token was WHILE will this fail + + DEX ; set invert result byte +DoRest + STX Frnxth ; save invert result byte + JSR LAB_IGBY ; increment and scan memory + JSR LAB_EVEX ; evaluate expression + LDA FAC1_e ; get FAC1 exponent + BEQ DoCmp ; if =0 go do straight compare + + LDA #$FF ; else set all bits +DoCmp + TSX ; copy stack pointer + EOR Frnxth ; EOR with invert byte + BNE LoopDone ; if <> 0 clear stack and back to interpreter loop + + ; loop condition wasn't met so do it again +LoopAlways + LDA LAB_STAK+2,X ; get current line low byte + STA Clinel ; save current line low byte + LDA LAB_STAK+3,X ; get current line high byte + STA Clineh ; save current line high byte + LDA LAB_STAK+4,X ; get BASIC execute pointer low byte + STA Bpntrl ; save BASIC execute pointer low byte + LDA LAB_STAK+5,X ; get BASIC execute pointer high byte + STA Bpntrh ; save BASIC execute pointer high byte + JSR LAB_GBYT ; scan memory + JMP LAB_15C2 ; go do interpreter inner loop + + ; clear stack and back to interpreter loop +LoopDone + INX ; dump DO token + INX ; dump current line low byte + INX ; dump current line high byte + INX ; dump BASIC execute pointer low byte + INX ; dump BASIC execute pointer high byte + TXS ; correct stack + JMP LAB_DATA ; go perform DATA (find : or [EOL]) + +; do the return without gosub error + +LAB_16F4 + LDX #$04 ; error code $04 ("RETURN without GOSUB" error) + .byte $2C ; makes next line BIT LAB_0EA2 + +LAB_16F7 ; do undefined statement error + LDX #$0E ; error code $0E ("Undefined statement" error) + JMP LAB_XERR ; do error #X, then warm start + +; perform RETURN + +LAB_RETURN + BNE LAB_16E5 ; exit if following token (to allow syntax error) + +LAB_16E8 + PLA ; dump calling routine return address + PLA ; dump calling routine return address + PLA ; pull token + CMP #TK_GOSUB ; compare with GOSUB token + BNE LAB_16F4 ; branch if no matching GOSUB + +LAB_16FF + PLA ; pull current line low byte + STA Clinel ; save current line low byte + PLA ; pull current line high byte + STA Clineh ; save current line high byte + PLA ; pull BASIC execute pointer low byte + STA Bpntrl ; save BASIC execute pointer low byte + PLA ; pull BASIC execute pointer high byte + STA Bpntrh ; save BASIC execute pointer high byte + + ; now do the DATA statement as we could be returning into + ; the middle of an ON GOSUB n,m,p,q line + ; (the return address used by the DATA statement is the one + ; pushed before the GOSUB was executed!) + +; perform DATA + +LAB_DATA + JSR LAB_SNBS ; scan for next BASIC statement ([:] or [EOL]) + + ; set BASIC execute pointer +LAB_170F + TYA ; copy index to A + CLC ; clear carry for add + ADC Bpntrl ; add BASIC execute pointer low byte + STA Bpntrl ; save BASIC execute pointer low byte + BCC LAB_1719 ; skip next if no carry + + INC Bpntrh ; else increment BASIC execute pointer high byte +LAB_1719 + RTS + +LAB_16FC + JMP LAB_SNER ; do syntax error then warm start + +; scan for next BASIC statement ([:] or [EOL]) +; returns Y as index to [:] or [EOL] + +LAB_SNBS + LDX #':' ; set look for character = ":" + .byte $2C ; makes next line BIT $00A2 + +; scan for next BASIC line +; returns Y as index to [EOL] + +LAB_SNBL + LDX #$00 ; set alt search character = [EOL] + LDY #$00 ; set search character = [EOL] + STY Asrch ; store search character +LAB_1725 + TXA ; get alt search character + EOR Asrch ; toggle search character, effectively swap with $00 + STA Asrch ; save swapped search character +LAB_172D + LDA (Bpntrl),Y ; get next byte + BEQ LAB_1719 ; exit if null [EOL] + + CMP Asrch ; compare with search character + BEQ LAB_1719 ; exit if found + + INY ; increment index + CMP #$22 ; compare current character with open quote + BNE LAB_172D ; if not open quote go get next character + + BEQ LAB_1725 ; if found go swap search character for alt search character + +; perform IF + +LAB_IF + JSR LAB_EVEX ; evaluate the expression + JSR LAB_GBYT ; scan memory + CMP #TK_THEN ; compare with THEN token + BEQ LAB_174B ; if it was THEN go do IF + + ; wasn't IF .. THEN so must be IF .. GOTO + CMP #TK_GOTO ; compare with GOTO token + BNE LAB_16FC ; if it wasn't GOTO go do syntax error + + LDX Bpntrl ; save the basic pointer low byte + LDY Bpntrh ; save the basic pointer high byte + JSR LAB_IGBY ; increment and scan memory + BCS LAB_16FC ; if not numeric go do syntax error + + STX Bpntrl ; restore the basic pointer low byte + STY Bpntrh ; restore the basic pointer high byte +LAB_174B + LDA FAC1_e ; get FAC1 exponent + BEQ LAB_174E ; if the result was zero go look for an ELSE + + JSR LAB_IGBY ; else increment and scan memory + BCS LAB_174D ; if not numeric go do var or keyword + +LAB_174C + JMP LAB_GOTO ; else was numeric so do GOTO n + + ; is var or keyword +LAB_174D +; *** patch allow NEXT, LOOP & RETURN to find FOR, DO or GOSUB structure on stack +; *** replace +; CMP #TK_RETURN ; compare the byte with the token for RETURN +; BNE LAB_174G ; if it wasn't RETURN go interpret BASIC code from (Bpntrl) +; ; and return to this code to process any following code +; +; JMP LAB_1602 ; else it was RETURN so interpret BASIC code from (Bpntrl) +; ; but don't return here +; +;LAB_174G +; JSR LAB_15FF ; interpret BASIC code from (Bpntrl) +; +;; the IF was executed and there may be a following ELSE so the code needs to return +;; here to check and ignore the ELSE if present +; +; LDY #$00 ; clear the index +; LDA (Bpntrl),Y ; get the next BASIC byte +; CMP #TK_ELSE ; compare it with the token for ELSE +; BEQ LAB_DATA ; if ELSE ignore the following statement +; +;; there was no ELSE so continue execution of IF THEN [: ]. any +;; following ELSE will, correctly, cause a syntax error +; +; RTS ; else return to the interpreter inner loop +; +; *** with + PLA ; discard interpreter loop return address + PLA ; so data structures are at the correct stack offset + JSR LAB_GBYT ; restore token or variable + JSR LAB_15FF ; interpret BASIC code from (Bpntrl) + +; the IF was executed and there may be a following ELSE so the code needs to return +; here to check and ignore the ELSE if present + + LDY #$00 ; clear the index + LDA (Bpntrl),Y ; get the next BASIC byte + CMP #TK_ELSE ; compare it with the token for ELSE + BNE LAB_no_ELSE ; no - continue on this line + JSR LAB_DATA ; yes - skip the rest of the line + +; there was no ELSE so continue execution of IF THEN [: ]. any +; following ELSE will, correctly, cause a syntax error + +LAB_no_ELSE + JMP LAB_15C2 ; return to the interpreter inner loop +; *** end patch allow NEXT, LOOP & RETURN to find FOR, DO or GOSUB structure on stack + +; perform ELSE after IF + +LAB_174E + LDY #$00 ; clear the BASIC byte index + LDX #$01 ; clear the nesting depth +LAB_1750 + INY ; increment the BASIC byte index + LDA (Bpntrl),Y ; get the next BASIC byte + BEQ LAB_1753 ; if EOL go add the pointer and return + + CMP #TK_IF ; compare the byte with the token for IF + BNE LAB_1752 ; if not IF token skip the depth increment + + INX ; else increment the nesting depth .. + BNE LAB_1750 ; .. and continue looking + +LAB_1752 + CMP #TK_ELSE ; compare the byte with the token for ELSE + BNE LAB_1750 ; if not ELSE token continue looking + + DEX ; was ELSE so decrement the nesting depth + BNE LAB_1750 ; loop if still nested + + INY ; increment the BASIC byte index past the ELSE + +; found the matching ELSE, now do <{n|statement}> + +LAB_1753 + TYA ; else copy line index to A + CLC ; clear carry for add + ADC Bpntrl ; add the BASIC execute pointer low byte + STA Bpntrl ; save the BASIC execute pointer low byte + BCC LAB_1754 ; branch if no overflow to high byte + + INC Bpntrh ; else increment the BASIC execute pointer high byte +LAB_1754 + JSR LAB_GBYT ; scan memory + BCC LAB_174C ; if numeric do GOTO n + ; the code will return to the interpreter loop at the + ; tail end of the GOTO + + JMP LAB_15FF ; interpret BASIC code from (Bpntrl) + ; the code will return to the interpreter loop at the + ; tail end of the + +; perform REM, skip (rest of) line + +LAB_REM + JSR LAB_SNBL ; scan for next BASIC line + JMP LAB_170F ; go set BASIC execute pointer and return, branch always + +LAB_16FD + JMP LAB_SNER ; do syntax error then warm start + +; perform ON + +LAB_ON + CMP #TK_IRQ ; was it IRQ token ? + BNE LAB_NOIN ; if not go check NMI + + JMP LAB_SIRQ ; else go set-up IRQ + +LAB_NOIN + CMP #TK_NMI ; was it NMI token ? + BNE LAB_NONM ; if not go do normal ON command + + JMP LAB_SNMI ; else go set-up NMI + +LAB_NONM + JSR LAB_GTBY ; get byte parameter + PHA ; push GOTO/GOSUB token + CMP #TK_GOSUB ; compare with GOSUB token + BEQ LAB_176B ; branch if GOSUB + + CMP #TK_GOTO ; compare with GOTO token +LAB_1767 + BNE LAB_16FD ; if not GOTO do syntax error then warm start + + +; next character was GOTO or GOSUB + +LAB_176B + DEC FAC1_3 ; decrement index (byte value) + BNE LAB_1773 ; branch if not zero + + PLA ; pull GOTO/GOSUB token + JMP LAB_1602 ; go execute it + +LAB_1773 + JSR LAB_IGBY ; increment and scan memory + JSR LAB_GFPN ; get fixed-point number into temp integer (skip this n) + ; (we could LDX #',' and JSR LAB_SNBL+2, then we + ; just BNE LAB_176B for the loop. should be quicker .. + ; no we can't, what if we meet a colon or [EOL]?) + CMP #$2C ; compare next character with "," + BEQ LAB_176B ; loop if "," + +LAB_177E + PLA ; else pull keyword token (run out of options) + ; also dump +/-1 pointer low byte and exit +LAB_177F + RTS + +; takes n * 106 + 11 cycles where n is the number of digits + +; get fixed-point number into temp integer + +LAB_GFPN + LDX #$00 ; clear reg + STX Itempl ; clear temporary integer low byte +LAB_1785 + STX Itemph ; save temporary integer high byte + BCS LAB_177F ; return if carry set, end of scan, character was + ; not 0-9 + + CPX #$19 ; compare high byte with $19 + TAY ; ensure Zb = 0 if the branch is taken + BCS LAB_1767 ; branch if >=, makes max line # 63999 because next + ; bit does *$0A, = 64000, compare at target will fail + ; and do syntax error + + SBC #'0'-1 ; subtract "0", $2F + carry, from byte + TAY ; copy binary digit + LDA Itempl ; get temporary integer low byte + ASL ; *2 low byte + ROL Itemph ; *2 high byte + ASL ; *2 low byte + ROL Itemph ; *2 high byte, *4 + ADC Itempl ; + low byte, *5 + STA Itempl ; save it + TXA ; get high byte copy to A + ADC Itemph ; + high byte, *5 + ASL Itempl ; *2 low byte, *10d + ROL ; *2 high byte, *10d + TAX ; copy high byte back to X + TYA ; get binary digit back + ADC Itempl ; add number low byte + STA Itempl ; save number low byte + BCC LAB_17B3 ; if no overflow to high byte get next character + + INX ; else increment high byte +LAB_17B3 + JSR LAB_IGBY ; increment and scan memory + JMP LAB_1785 ; loop for next character + +; perform DEC + +LAB_DEC + LDA #LAB_259C ; set +/-1 pointer high byte (both the same) + JSR LAB_246C ; add (AY) to FAC1 + JSR LAB_PFAC ; pack FAC1 into variable (Lvarpl) + + JSR LAB_GBYT ; scan memory + CMP #',' ; compare with "," + BNE LAB_177E ; exit if not "," (either end or error) + + ; was "," so another INCR variable to do + JSR LAB_IGBY ; increment and scan memory + JMP LAB_17B7 ; go do next var + +IncrErr + JMP LAB_1ABC ; do "Type mismatch" error then warm start + +; perform LET + +LAB_LET + JSR LAB_GVAR ; get var address + STA Lvarpl ; save var address low byte + STY Lvarph ; save var address high byte + LDA #TK_EQUAL ; get = token + JSR LAB_SCCA ; scan for CHR$(A), else do syntax error then warm start + LDA Dtypef ; get data type flag, $FF=string, $00=numeric + PHA ; push data type flag + JSR LAB_EVEX ; evaluate expression + PLA ; pop data type flag + ROL ; set carry if type = string +; *** begin patch result of a string compare stores string pointer to variable +; but should store FAC1 (true/false value) +; *** replace +; JSR LAB_CKTM ; type match check, set C for string +; BNE LAB_17D5 ; branch if string +; *** with + JSR LAB_CKTM ; type match check, keep C (expected type) + BCS LAB_17D5 ; branch if string +; *** end patch + + JMP LAB_PFAC ; pack FAC1 into variable (Lvarpl) and return + +; string LET + +LAB_17D5 + LDY #$02 ; set index to pointer high byte + LDA (des_pl),Y ; get string pointer high byte + CMP Sstorh ; compare bottom of string space high byte + BCC LAB_17F4 ; if less assign value and exit (was in program memory) + + BNE LAB_17E6 ; branch if > + ; else was equal so compare low bytes + DEY ; decrement index + LDA (des_pl),Y ; get pointer low byte + CMP Sstorl ; compare bottom of string space low byte + BCC LAB_17F4 ; if less assign value and exit (was in program memory) + + ; pointer was >= to bottom of string space pointer +LAB_17E6 + LDY des_ph ; get descriptor pointer high byte + CPY Svarh ; compare start of vars high byte + BCC LAB_17F4 ; branch if less (descriptor is on stack) + + BNE LAB_17FB ; branch if greater (descriptor is not on stack) + + ; else high bytes were equal so .. + LDA des_pl ; get descriptor pointer low byte + CMP Svarl ; compare start of vars low byte + BCS LAB_17FB ; branch if >= (descriptor is not on stack) + +LAB_17F4 + LDA des_pl ; get descriptor pointer low byte + LDY des_ph ; get descriptor pointer high byte + JMP LAB_1811 ; clean stack, copy descriptor to variable and return + + ; make space and copy string +LAB_17FB + LDY #$00 ; index to length + LDA (des_pl),Y ; get string length + JSR LAB_209C ; copy string + LDA des_2l ; get descriptor pointer low byte + LDY des_2h ; get descriptor pointer high byte + STA ssptr_l ; save descriptor pointer low byte + STY ssptr_h ; save descriptor pointer high byte + JSR LAB_228A ; copy string from descriptor (sdescr) to (Sutill) + LDA #FAC1_e ; get descriptor pointer high byte + + ; clean stack and assign value to string variable +LAB_1811 + STA des_2l ; save descriptor_2 pointer low byte + STY des_2h ; save descriptor_2 pointer high byte + JSR LAB_22EB ; clean descriptor stack, YA = pointer + LDY #$00 ; index to length + LDA (des_2l),Y ; get string length + STA (Lvarpl),Y ; copy to let string variable + INY ; index to string pointer low byte + LDA (des_2l),Y ; get string pointer low byte + STA (Lvarpl),Y ; copy to let string variable + INY ; index to string pointer high byte + LDA (des_2l),Y ; get string pointer high byte + STA (Lvarpl),Y ; copy to let string variable + RTS + +; perform GET + +LAB_GET + JSR LAB_GVAR ; get var address + STA Lvarpl ; save var address low byte + STY Lvarph ; save var address high byte + JSR INGET ; get input byte + LDX Dtypef ; get data type flag, $FF=string, $00=numeric + BMI LAB_GETS ; go get string character + + ; was numeric get + TAY ; copy character to Y + JSR LAB_1FD0 ; convert Y to byte in FAC1 + JMP LAB_PFAC ; pack FAC1 into variable (Lvarpl) and return + +LAB_GETS + PHA ; save character + LDA #$01 ; string is single byte + BCS LAB_IsByte ; branch if byte received + + PLA ; string is null +LAB_IsByte + JSR LAB_MSSP ; make string space A bytes long A=$AC=length, + ; X=$AD=Sutill=ptr low byte, Y=$AE=Sutilh=ptr high byte + BEQ LAB_NoSt ; skip store if null string + + PLA ; get character back + LDY #$00 ; clear index + STA (str_pl),Y ; save byte in string (byte IS string!) +LAB_NoSt + JSR LAB_RTST ; check for space on descriptor stack then put address + ; and length on descriptor stack and update stack pointers + + JMP LAB_17D5 ; do string LET and return + +; perform PRINT + +LAB_1829 + JSR LAB_18C6 ; print string from Sutill/Sutilh +LAB_182C + JSR LAB_GBYT ; scan memory + +; PRINT + +LAB_PRINT + BEQ LAB_CRLF ; if nothing following just print CR/LF + +LAB_1831 + CMP #TK_TAB ; compare with TAB( token + BEQ LAB_18A2 ; go do TAB/SPC + + CMP #TK_SPC ; compare with SPC( token + BEQ LAB_18A2 ; go do TAB/SPC + + CMP #',' ; compare with "," + BEQ LAB_188B ; go do move to next TAB mark + + CMP #';' ; compare with ";" + BEQ LAB_18BD ; if ";" continue with PRINT processing + + JSR LAB_EVEX ; evaluate expression + BIT Dtypef ; test data type flag, $FF=string, $00=numeric + BMI LAB_1829 ; branch if string + + JSR LAB_296E ; convert FAC1 to string + JSR LAB_20AE ; print " terminated string to Sutill/Sutilh + LDY #$00 ; clear index + +; don't check fit if terminal width byte is zero + + LDA TWidth ; get terminal width byte + BEQ LAB_185E ; skip check if zero + + SEC ; set carry for subtract + SBC TPos ; subtract terminal position + SBC (des_pl),Y ; subtract string length + BCS LAB_185E ; branch if less than terminal width + + JSR LAB_CRLF ; else print CR/LF +LAB_185E + JSR LAB_18C6 ; print string from Sutill/Sutilh + BEQ LAB_182C ; always go continue processing line + +; CR/LF return to BASIC from BASIC input handler + +LAB_1866 + LDA #$00 ; clear byte + STA Ibuffs,X ; null terminate input + LDX #Ibuffs ; set Y to buffer start-1 high byte + +; print CR/LF + +LAB_CRLF + LDA #$0D ; load [CR] + JSR LAB_PRNA ; go print the character + LDA #$0A ; load [LF] + BNE LAB_PRNA ; go print the character and return, branch always + +LAB_188B + LDA TPos ; get terminal position + CMP Iclim ; compare with input column limit + BCC LAB_1897 ; branch if less + + JSR LAB_CRLF ; else print CR/LF (next line) + BNE LAB_18BD ; continue with PRINT processing (branch always) + +LAB_1897 + SEC ; set carry for subtract +LAB_1898 + SBC TabSiz ; subtract TAB size + BCS LAB_1898 ; loop if result was +ve + + EOR #$FF ; complement it + ADC #$01 ; +1 (twos complement) + BNE LAB_18B6 ; always print A spaces (result is never $00) + + ; do TAB/SPC +LAB_18A2 + PHA ; save token + JSR LAB_SGBY ; scan and get byte parameter + CMP #$29 ; is next character ) + BNE LAB_1910 ; if not do syntax error then warm start + + PLA ; get token back + CMP #TK_TAB ; was it TAB ? + BNE LAB_18B7 ; if not go do SPC + + ; calculate TAB offset + TXA ; copy integer value to A + SBC TPos ; subtract terminal position + BCC LAB_18BD ; branch if result was < 0 (can't TAB backwards) + + ; print A spaces +LAB_18B6 + TAX ; copy result to X +LAB_18B7 + TXA ; set flags on size for SPC + BEQ LAB_18BD ; branch if result was = $0, already here + + ; print X spaces +LAB_18BA + JSR LAB_18E0 ; print " " + DEX ; decrement count + BNE LAB_18BA ; loop if not all done + + ; continue with PRINT processing +LAB_18BD + JSR LAB_IGBY ; increment and scan memory + BNE LAB_1831 ; if more to print go do it + + RTS + +; print null terminated string from memory + +LAB_18C3 + JSR LAB_20AE ; print " terminated string to Sutill/Sutilh + +; print string from Sutill/Sutilh + +LAB_18C6 + JSR LAB_22B6 ; pop string off descriptor stack, or from top of string + ; space returns with A = length, X=$71=pointer low byte, + ; Y=$72=pointer high byte + LDY #$00 ; reset index + TAX ; copy length to X + BEQ LAB_188C ; exit (RTS) if null string + +LAB_18CD + + LDA (ut1_pl),Y ; get next byte + JSR LAB_PRNA ; go print the character + INY ; increment index + DEX ; decrement count + BNE LAB_18CD ; loop if not done yet + + RTS + + ; Print single format character +; print " " + +LAB_18E0 + LDA #$20 ; load " " + .byte $2C ; change next line to BIT LAB_3FA9 + +; print "?" character + +LAB_18E3 + LDA #$3F ; load "?" character + +; print character in A +; now includes the null handler +; also includes infinite line length code +; note! some routines expect this one to exit with Zb=0 + +LAB_PRNA + CMP #' ' ; compare with " " + BCC LAB_18F9 ; branch if less (non printing) + + ; else printable character + PHA ; save the character + +; don't check fit if terminal width byte is zero + + LDA TWidth ; get terminal width + BNE LAB_18F0 ; branch if not zero (not infinite length) + +; is "infinite line" so check TAB position + + LDA TPos ; get position + SBC TabSiz ; subtract TAB size, carry set by CMP #$20 above + BNE LAB_18F7 ; skip reset if different + + STA TPos ; else reset position + BEQ LAB_18F7 ; go print character + +LAB_18F0 + CMP TPos ; compare with terminal character position + BNE LAB_18F7 ; branch if not at end of line + + JSR LAB_CRLF ; else print CR/LF +LAB_18F7 + INC TPos ; increment terminal position + PLA ; get character back +LAB_18F9 + JSR V_OUTP ; output byte via output vector + CMP #$0D ; compare with [CR] + BNE LAB_188A ; branch if not [CR] + + ; else print nullct nulls after the [CR] + STX TempB ; save buffer index + LDX Nullct ; get null count + BEQ LAB_1886 ; branch if no nulls + + LDA #$00 ; load [NULL] +LAB_1880 + JSR LAB_PRNA ; go print the character + DEX ; decrement count + BNE LAB_1880 ; loop if not all done + + LDA #$0D ; restore the character (and set the flags) +LAB_1886 + STX TPos ; clear terminal position (X always = zero when we get here) + LDX TempB ; restore buffer index +LAB_188A + AND #$FF ; set the flags +LAB_188C + RTS + +; handle bad input data + +LAB_1904 + LDA Imode ; get input mode flag, $00=INPUT, $00=READ + BPL LAB_1913 ; branch if INPUT (go do redo) + + LDA Dlinel ; get current DATA line low byte + LDY Dlineh ; get current DATA line high byte + STA Clinel ; save current line low byte + STY Clineh ; save current line high byte +LAB_1910 + JMP LAB_SNER ; do syntax error then warm start + + ; mode was INPUT +LAB_1913 + LDA #LAB_REDO ; point to redo message (high addr) + JSR LAB_18C3 ; print null terminated string from memory + LDA Cpntrl ; get continue pointer low byte + LDY Cpntrh ; get continue pointer high byte + STA Bpntrl ; save BASIC execute pointer low byte + STY Bpntrh ; save BASIC execute pointer high byte + RTS + +; perform INPUT + +LAB_INPUT + CMP #$22 ; compare next byte with open quote + BNE LAB_1934 ; branch if no prompt string + + JSR LAB_1BC1 ; print "..." string + LDA #$3B ; load A with ";" + JSR LAB_SCCA ; scan for CHR$(A), else do syntax error then warm start + JSR LAB_18C6 ; print string from Sutill/Sutilh + + ; done with prompt, now get data +LAB_1934 + JSR LAB_CKRN ; check not Direct, back here if ok + JSR LAB_INLN ; print "? " and get BASIC input + LDA #$00 ; set mode = INPUT + CMP Ibuffs ; test first byte in buffer + BNE LAB_1953 ; branch if not null input + +; *** change p2: keep carry set to throw break message +; CLC ; was null input so clear carry to exit program + JMP LAB_1647 ; go do BREAK exit + +; perform READ + +LAB_READ + LDX Dptrl ; get DATA pointer low byte + LDY Dptrh ; get DATA pointer high byte + LDA #$80 ; set mode = READ + +LAB_1953 + STA Imode ; set input mode flag, $00=INPUT, $80=READ + STX Rdptrl ; save READ pointer low byte + STY Rdptrh ; save READ pointer high byte + + ; READ or INPUT next variable from list +LAB_195B + JSR LAB_GVAR ; get (var) address + STA Lvarpl ; save address low byte + STY Lvarph ; save address high byte + LDA Bpntrl ; get BASIC execute pointer low byte + LDY Bpntrh ; get BASIC execute pointer high byte + STA Itempl ; save as temporary integer low byte + STY Itemph ; save as temporary integer high byte + LDX Rdptrl ; get READ pointer low byte + LDY Rdptrh ; get READ pointer high byte + STX Bpntrl ; set BASIC execute pointer low byte + STY Bpntrh ; set BASIC execute pointer high byte + JSR LAB_GBYT ; scan memory + BNE LAB_1988 ; branch if not null + + ; pointer was to null entry + BIT Imode ; test input mode flag, $00=INPUT, $80=READ + BMI LAB_19DD ; branch if READ + + ; mode was INPUT + JSR LAB_18E3 ; print "?" character (double ? for extended input) + JSR LAB_INLN ; print "? " and get BASIC input + STX Bpntrl ; set BASIC execute pointer low byte + STY Bpntrh ; set BASIC execute pointer high byte +LAB_1985 + JSR LAB_GBYT ; scan memory +LAB_1988 + BIT Dtypef ; test data type flag, $FF=string, $00=numeric + BPL LAB_19B0 ; branch if numeric + + ; else get string + STA Srchc ; save search character + CMP #$22 ; was it " ? + BEQ LAB_1999 ; branch if so + + LDA #':' ; else search character is ":" + STA Srchc ; set new search character + LDA #',' ; other search character is "," + CLC ; clear carry for add +LAB_1999 + STA Asrch ; set second search character + LDA Bpntrl ; get BASIC execute pointer low byte + LDY Bpntrh ; get BASIC execute pointer high byte + + ADC #$00 ; c is =1 if we came via the BEQ LAB_1999, else =0 + BCC LAB_19A4 ; branch if no execute pointer low byte rollover + + INY ; else increment high byte +LAB_19A4 + JSR LAB_20B4 ; print Srchc or Asrch terminated string to Sutill/Sutilh + JSR LAB_23F3 ; restore BASIC execute pointer from temp (Btmpl/Btmph) + JSR LAB_17D5 ; go do string LET + JMP LAB_19B6 ; go check string terminator + + ; get numeric INPUT +LAB_19B0 + JSR LAB_2887 ; get FAC1 from string + JSR LAB_PFAC ; pack FAC1 into (Lvarpl) +LAB_19B6 + JSR LAB_GBYT ; scan memory + BEQ LAB_19C5 ; branch if null (last entry) + + CMP #',' ; else compare with "," + BEQ LAB_19C2 ; branch if "," + + JMP LAB_1904 ; else go handle bad input data + + ; got good input data +LAB_19C2 + JSR LAB_IGBY ; increment and scan memory +LAB_19C5 + LDA Bpntrl ; get BASIC execute pointer low byte (temp READ/INPUT ptr) + LDY Bpntrh ; get BASIC execute pointer high byte (temp READ/INPUT ptr) + STA Rdptrl ; save for now + STY Rdptrh ; save for now + LDA Itempl ; get temporary integer low byte (temp BASIC execute ptr) + LDY Itemph ; get temporary integer high byte (temp BASIC execute ptr) + STA Bpntrl ; set BASIC execute pointer low byte + STY Bpntrh ; set BASIC execute pointer high byte + JSR LAB_GBYT ; scan memory + BEQ LAB_1A03 ; if null go do extra ignored message + + JSR LAB_1C01 ; else scan for "," , else do syntax error then warm start + JMP LAB_195B ; go INPUT next variable from list + + ; find next DATA statement or do "Out of DATA" error +LAB_19DD + JSR LAB_SNBS ; scan for next BASIC statement ([:] or [EOL]) + INY ; increment index + TAX ; copy character ([:] or [EOL]) + BNE LAB_19F6 ; branch if [:] + + LDX #$06 ; set for "Out of DATA" error + INY ; increment index, now points to next line pointer high byte + LDA (Bpntrl),Y ; get next line pointer high byte + BEQ LAB_1A54 ; branch if end (eventually does error X) + + INY ; increment index + LDA (Bpntrl),Y ; get next line # low byte + STA Dlinel ; save current DATA line low byte + INY ; increment index + LDA (Bpntrl),Y ; get next line # high byte + INY ; increment index + STA Dlineh ; save current DATA line high byte +LAB_19F6 + LDA (Bpntrl),Y ; get byte + INY ; increment index + TAX ; copy to X + JSR LAB_170F ; set BASIC execute pointer + CPX #TK_DATA ; compare with "DATA" token + BEQ LAB_1985 ; was "DATA" so go do next READ + + BNE LAB_19DD ; go find next statement if not "DATA" + +; end of INPUT/READ routine + +LAB_1A03 + LDA Rdptrl ; get temp READ pointer low byte + LDY Rdptrh ; get temp READ pointer high byte + LDX Imode ; get input mode flag, $00=INPUT, $80=READ + BPL LAB_1A0E ; branch if INPUT + + JMP LAB_1624 ; save AY as DATA pointer and return + + ; we were getting INPUT +LAB_1A0E + LDY #$00 ; clear index + LDA (Rdptrl),Y ; get next byte + BNE LAB_1A1B ; error if not end of INPUT + + RTS + + ; user typed too much +LAB_1A1B + LDA #LAB_IMSG ; point to extra ignored message (high addr) + JMP LAB_18C3 ; print null terminated string from memory and return + +; search the stack for FOR activity +; exit with z=1 if FOR else exit with z=0 + +LAB_11A1 + TSX ; copy stack pointer + INX ; +1 pass return address + INX ; +2 pass return address + INX ; +3 pass calling routine return address + INX ; +4 pass calling routine return address +LAB_11A6 + LDA LAB_STAK+1,X ; get token byte from stack + CMP #TK_FOR ; is it FOR token + BNE LAB_11CE ; exit if not FOR token + + ; was FOR token + LDA Frnxth ; get var pointer for FOR/NEXT high byte + BNE LAB_11BB ; branch if not null + + LDA LAB_STAK+2,X ; get FOR variable pointer low byte + STA Frnxtl ; save var pointer for FOR/NEXT low byte + LDA LAB_STAK+3,X ; get FOR variable pointer high byte + STA Frnxth ; save var pointer for FOR/NEXT high byte +LAB_11BB + CMP LAB_STAK+3,X ; compare var pointer with stacked var pointer (high byte) + BNE LAB_11C7 ; branch if no match + + LDA Frnxtl ; get var pointer for FOR/NEXT low byte + CMP LAB_STAK+2,X ; compare var pointer with stacked var pointer (low byte) + BEQ LAB_11CE ; exit if match found + +LAB_11C7 + TXA ; copy index + CLC ; clear carry for add + ADC #$10 ; add FOR stack use size + TAX ; copy back to index + BNE LAB_11A6 ; loop if not at start of stack + +LAB_11CE + RTS + +; perform NEXT + +LAB_NEXT + BNE LAB_1A46 ; branch if NEXT var + + LDY #$00 ; else clear Y + BEQ LAB_1A49 ; branch always (no variable to search for) + +; NEXT var + +LAB_1A46 + JSR LAB_GVAR ; get variable address +LAB_1A49 + STA Frnxtl ; store variable pointer low byte + STY Frnxth ; store variable pointer high byte + ; (both cleared if no variable defined) + JSR LAB_11A1 ; search the stack for FOR activity + BEQ LAB_1A56 ; branch if found + + LDX #$00 ; else set error $00 ("NEXT without FOR" error) +LAB_1A54 + BEQ LAB_1ABE ; do error #X, then warm start + +LAB_1A56 + TXS ; set stack pointer, X set by search, dumps return addresses + + TXA ; copy stack pointer + SEC ; set carry for subtract + SBC #$F7 ; point to TO var + STA ut2_pl ; save pointer to TO var for compare + ADC #$FB ; point to STEP var + + LDY #>LAB_STAK ; point to stack page high byte + JSR LAB_UFAC ; unpack memory (STEP value) into FAC1 + TSX ; get stack pointer back + LDA LAB_STAK+8,X ; get step sign + STA FAC1_s ; save FAC1 sign (b7) + LDA Frnxtl ; get FOR variable pointer low byte + LDY Frnxth ; get FOR variable pointer high byte + JSR LAB_246C ; add (FOR variable) to FAC1 + JSR LAB_PFAC ; pack FAC1 into (FOR variable) + LDY #>LAB_STAK ; point to stack page high byte + JSR LAB_27FA ; compare FAC1 with (Y,ut2_pl) (TO value) + TSX ; get stack pointer back + CMP LAB_STAK+8,X ; compare step sign + BEQ LAB_1A9B ; branch if = (loop complete) + + ; loop back and do it all again + LDA LAB_STAK+$0D,X ; get FOR line low byte + STA Clinel ; save current line low byte + LDA LAB_STAK+$0E,X ; get FOR line high byte + STA Clineh ; save current line high byte + LDA LAB_STAK+$10,X ; get BASIC execute pointer low byte + STA Bpntrl ; save BASIC execute pointer low byte + LDA LAB_STAK+$0F,X ; get BASIC execute pointer high byte + STA Bpntrh ; save BASIC execute pointer high byte +LAB_1A98 + JMP LAB_15C2 ; go do interpreter inner loop + + ; loop complete so carry on +LAB_1A9B + TXA ; stack copy to A + ADC #$0F ; add $10 ($0F+carry) to dump FOR structure + TAX ; copy back to index + TXS ; copy to stack pointer + JSR LAB_GBYT ; scan memory + CMP #',' ; compare with "," + BNE LAB_1A98 ; branch if not "," (go do interpreter inner loop) + + ; was "," so another NEXT variable to do + JSR LAB_IGBY ; else increment and scan memory + JSR LAB_1A46 ; do NEXT (var) + +; evaluate expression and check is numeric, else do type mismatch + +LAB_EVNM + JSR LAB_EVEX ; evaluate expression + +; check if source is numeric, else do type mismatch + +LAB_CTNM + CLC ; destination is numeric + .byte $24 ; makes next line BIT $38 + +; check if source is string, else do type mismatch + +LAB_CTST + SEC ; required type is string + +; type match check, set C for string, clear C for numeric + +LAB_CKTM + BIT Dtypef ; test data type flag, $FF=string, $00=numeric + BMI LAB_1ABA ; branch if data type is string + + ; else data type was numeric + BCS LAB_1ABC ; if required type is string do type mismatch error +LAB_1AB9 + RTS + + ; data type was string, now check required type +LAB_1ABA + BCS LAB_1AB9 ; exit if required type is string + + ; else do type mismatch error +LAB_1ABC + LDX #$18 ; error code $18 ("Type mismatch" error) +LAB_1ABE + JMP LAB_XERR ; do error #X, then warm start + +; evaluate expression + +LAB_EVEX + LDX Bpntrl ; get BASIC execute pointer low byte + BNE LAB_1AC7 ; skip next if not zero + + DEC Bpntrh ; else decrement BASIC execute pointer high byte +LAB_1AC7 + DEC Bpntrl ; decrement BASIC execute pointer low byte + +LAB_EVEZ + LDA #$00 ; set null precedence (flag done) +LAB_1ACC + PHA ; push precedence byte + LDA #$02 ; 2 bytes + JSR LAB_1212 ; check room on stack for A bytes + JSR LAB_GVAL ; get value from line + LDA #$00 ; clear A + STA comp_f ; clear compare function flag +LAB_1ADB + JSR LAB_GBYT ; scan memory +LAB_1ADE + SEC ; set carry for subtract + SBC #TK_GT ; subtract token for > (lowest comparison function) + BCC LAB_1AFA ; branch if < TK_GT + + CMP #$03 ; compare with ">" to "<" tokens + BCS LAB_1AFA ; branch if >= TK_SGN (highest evaluation function +1) + + ; was token for > = or < (A = 0, 1 or 2) + CMP #$01 ; compare with token for = + ROL ; *2, b0 = carry (=1 if token was = or <) + ; (A = 0, 3 or 5) + EOR #$01 ; toggle b0 + ; (A = 1, 2 or 4. 1 if >, 2 if =, 4 if <) + EOR comp_f ; EOR with compare function flag bits + CMP comp_f ; compare with compare function flag + BCC LAB_1B53 ; if <(comp_f) do syntax error then warm start + ; was more than one <, = or >) + + STA comp_f ; save new compare function flag + JSR LAB_IGBY ; increment and scan memory + JMP LAB_1ADE ; go do next character + + ; token is < ">" or > "<" tokens +LAB_1AFA + LDX comp_f ; get compare function flag + BNE LAB_1B2A ; branch if compare function + + BCS LAB_1B78 ; go do functions + + ; else was < TK_GT so is operator or lower + ADC #TK_GT-TK_PLUS ; add # of operators (+, -, *, /, ^, AND, OR or EOR) + BCC LAB_1B78 ; branch if < + operator + + ; carry was set so token was +, -, *, /, ^, AND, OR or EOR + BNE LAB_1B0B ; branch if not + token + + BIT Dtypef ; test data type flag, $FF=string, $00=numeric + BPL LAB_1B0B ; branch if not string + + ; will only be $00 if type is string and token was + + JMP LAB_224D ; add strings, string 1 is in descriptor des_pl, string 2 + ; is in line, and return + +LAB_1B0B + STA ut1_pl ; save it + ASL ; *2 + ADC ut1_pl ; *3 + TAY ; copy to index +LAB_1B13 + PLA ; pull previous precedence + CMP LAB_OPPT,Y ; compare with precedence byte + BCS LAB_1B7D ; branch if A >= + + JSR LAB_CTNM ; check if source is numeric, else do type mismatch +LAB_1B1C + PHA ; save precedence +LAB_1B1D + JSR LAB_1B43 ; get vector, execute function then continue evaluation + PLA ; restore precedence + LDY prstk ; get precedence stacked flag + BPL LAB_1B3C ; branch if stacked values + + TAX ; copy precedence (set flags) + BEQ LAB_1B9D ; exit if done + + BNE LAB_1B86 ; else pop FAC2 and return, branch always + +LAB_1B2A + ROL Dtypef ; shift data type flag into Cb + TXA ; copy compare function flag + STA Dtypef ; clear data type flag, X is 0xxx xxxx + ROL ; shift data type into compare function byte b0 + LDX Bpntrl ; get BASIC execute pointer low byte + BNE LAB_1B34 ; branch if no underflow + + DEC Bpntrh ; else decrement BASIC execute pointer high byte +LAB_1B34 + DEC Bpntrl ; decrement BASIC execute pointer low byte +TK_LT_PLUS = TK_LT-TK_PLUS + LDY #TK_LT_PLUS*3 ; set offset to last operator entry + STA comp_f ; save new compare function flag + BNE LAB_1B13 ; branch always + +LAB_1B3C + CMP LAB_OPPT,Y ;.compare with stacked function precedence + BCS LAB_1B86 ; branch if A >=, pop FAC2 and return + + BCC LAB_1B1C ; branch always + +;.get vector, execute function then continue evaluation + +LAB_1B43 + LDA LAB_OPPT+2,Y ; get function vector high byte + PHA ; onto stack + LDA LAB_OPPT+1,Y ; get function vector low byte + PHA ; onto stack + ; now push sign, round FAC1 and put on stack + JSR LAB_1B5B ; function will return here, then the next RTS will call + ; the function + LDA comp_f ; get compare function flag + PHA ; push compare evaluation byte + LDA LAB_OPPT,Y ; get precedence byte + JMP LAB_1ACC ; continue evaluating expression + +LAB_1B53 + JMP LAB_SNER ; do syntax error then warm start + +; push sign, round FAC1 and put on stack + +LAB_1B5B + PLA ; get return addr low byte + STA ut1_pl ; save it + INC ut1_pl ; increment it (was ret-1 pushed? yes!) + ; note! no check is made on the high byte! if the calling + ; routine assembles to a page edge then this all goes + ; horribly wrong !!! + PLA ; get return addr high byte + STA ut1_ph ; save it + LDA FAC1_s ; get FAC1 sign (b7) + PHA ; push sign + +; round FAC1 and put on stack + +LAB_1B66 + JSR LAB_27BA ; round FAC1 + LDA FAC1_3 ; get FAC1 mantissa3 + PHA ; push on stack + LDA FAC1_2 ; get FAC1 mantissa2 + PHA ; push on stack + LDA FAC1_1 ; get FAC1 mantissa1 + PHA ; push on stack + LDA FAC1_e ; get FAC1 exponent + PHA ; push on stack + JMP (ut1_pl) ; return, sort of + +; do functions + +LAB_1B78 + LDY #$FF ; flag function + PLA ; pull precedence byte +LAB_1B7B + BEQ LAB_1B9D ; exit if done + +LAB_1B7D + CMP #$64 ; compare previous precedence with $64 + BEQ LAB_1B84 ; branch if was $64 (< function) + + JSR LAB_CTNM ; check if source is numeric, else do type mismatch +LAB_1B84 + STY prstk ; save precedence stacked flag + + ; pop FAC2 and return +LAB_1B86 + PLA ; pop byte + LSR ; shift out comparison evaluation lowest bit + STA Cflag ; save comparison evaluation flag + PLA ; pop exponent + STA FAC2_e ; save FAC2 exponent + PLA ; pop mantissa1 + STA FAC2_1 ; save FAC2 mantissa1 + PLA ; pop mantissa2 + STA FAC2_2 ; save FAC2 mantissa2 + PLA ; pop mantissa3 + STA FAC2_3 ; save FAC2 mantissa3 + PLA ; pop sign + STA FAC2_s ; save FAC2 sign (b7) + EOR FAC1_s ; EOR FAC1 sign (b7) + STA FAC_sc ; save sign compare (FAC1 EOR FAC2) +LAB_1B9D + LDA FAC1_e ; get FAC1 exponent + RTS + +; print "..." string to string util area + +LAB_1BC1 + LDA Bpntrl ; get BASIC execute pointer low byte + LDY Bpntrh ; get BASIC execute pointer high byte + ADC #$00 ; add carry to low byte + BCC LAB_1BCA ; branch if no overflow + + INY ; increment high byte +LAB_1BCA + JSR LAB_20AE ; print " terminated string to Sutill/Sutilh + JMP LAB_23F3 ; restore BASIC execute pointer from temp and return + +; get value from line + +LAB_GVAL + JSR LAB_IGBY ; increment and scan memory + BCS LAB_1BAC ; branch if not numeric character + + ; else numeric string found (e.g. 123) +LAB_1BA9 + JMP LAB_2887 ; get FAC1 from string and return + +; get value from line .. continued + + ; wasn't a number so .. +LAB_1BAC + TAX ; set the flags + BMI LAB_1BD0 ; if -ve go test token values + + ; else it is either a string, number, variable or () + CMP #'$' ; compare with "$" + BEQ LAB_1BA9 ; branch if "$", hex number + + CMP #'%' ; else compare with "%" + BEQ LAB_1BA9 ; branch if "%", binary number + + CMP #'.' ; compare with "." + BEQ LAB_1BA9 ; if so get FAC1 from string and return (e.g. was .123) + + ; it wasn't any sort of number so .. + CMP #$22 ; compare with " + BEQ LAB_1BC1 ; branch if open quote + + ; wasn't any sort of number so .. + +; evaluate expression within parentheses + + CMP #'(' ; compare with "(" + BNE LAB_1C18 ; if not "(" get (var), return value in FAC1 and $ flag + +LAB_1BF7 + JSR LAB_EVEZ ; evaluate expression, no decrement + +; all the 'scan for' routines return the character after the sought character + +; scan for ")" , else do syntax error then warm start + +LAB_1BFB + LDA #$29 ; load A with ")" + +; scan for CHR$(A) , else do syntax error then warm start + +LAB_SCCA + LDY #$00 ; clear index + CMP (Bpntrl),Y ; check next byte is = A + BNE LAB_SNER ; if not do syntax error then warm start + + JMP LAB_IGBY ; increment and scan memory then return + +; scan for "(" , else do syntax error then warm start + +LAB_1BFE + LDA #$28 ; load A with "(" + BNE LAB_SCCA ; scan for CHR$(A), else do syntax error then warm start + ; (branch always) + +; scan for "," , else do syntax error then warm start + +LAB_1C01 + LDA #$2C ; load A with "," + BNE LAB_SCCA ; scan for CHR$(A), else do syntax error then warm start + ; (branch always) + +; syntax error then warm start + +LAB_SNER + LDX #$02 ; error code $02 ("Syntax" error) + JMP LAB_XERR ; do error #X, then warm start + +; get value from line .. continued +; do tokens + +LAB_1BD0 + CMP #TK_MINUS ; compare with token for - + BEQ LAB_1C11 ; branch if - token (do set-up for functions) + + ; wasn't -n so .. + CMP #TK_PLUS ; compare with token for + + BEQ LAB_GVAL ; branch if + token (+n = n so ignore leading +) + + CMP #TK_NOT ; compare with token for NOT + BNE LAB_1BE7 ; branch if not token for NOT + + ; was NOT token +TK_EQUAL_PLUS = TK_EQUAL-TK_PLUS + LDY #TK_EQUAL_PLUS*3 ; offset to NOT function + BNE LAB_1C13 ; do set-up for function then execute (branch always) + +; do = compare + +LAB_EQUAL + JSR LAB_EVIR ; evaluate integer expression (no sign check) + LDA FAC1_3 ; get FAC1 mantissa3 + EOR #$FF ; invert it + TAY ; copy it + LDA FAC1_2 ; get FAC1 mantissa2 + EOR #$FF ; invert it + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +; get value from line .. continued + + ; wasn't +, -, or NOT so .. +LAB_1BE7 + CMP #TK_FN ; compare with token for FN + BNE LAB_1BEE ; branch if not token for FN + + JMP LAB_201E ; go evaluate FNx + +; get value from line .. continued + + ; wasn't +, -, NOT or FN so .. +LAB_1BEE + SBC #TK_SGN ; subtract with token for SGN + BCS LAB_1C27 ; if a function token go do it + + JMP LAB_SNER ; else do syntax error + +; set-up for functions + +LAB_1C11 +TK_GT_PLUS = TK_GT-TK_PLUS + LDY #TK_GT_PLUS*3 ; set offset from base to > operator +LAB_1C13 + PLA ; dump return address low byte + PLA ; dump return address high byte + JMP LAB_1B1D ; execute function then continue evaluation + +; variable name set-up +; get (var), return value in FAC_1 and $ flag + +LAB_1C18 + JSR LAB_GVAR ; get (var) address + STA FAC1_2 ; save address low byte in FAC1 mantissa2 + STY FAC1_3 ; save address high byte in FAC1 mantissa3 + LDX Dtypef ; get data type flag, $FF=string, $00=numeric + BMI LAB_1C25 ; if string then return (does RTS) + +LAB_1C24 + JMP LAB_UFAC ; unpack memory (AY) into FAC1 + +LAB_1C25 +; *** begin patch string pointer high byte trashed when moved to stack +; *** add + LSR FAC1_r ; clear bit 7 (<$80) = do not round up +; *** end patch + RTS + +; get value from line .. continued +; only functions left so .. + +; set up function references + +; new for V2.0+ this replaces a lot of IF .. THEN .. ELSEIF .. THEN .. that was needed +; to process function calls. now the function vector is computed and pushed on the stack +; and the preprocess offset is read. if the preprocess offset is non zero then the vector +; is calculated and the routine called, if not this routine just does RTS. whichever +; happens the RTS at the end of this routine, or the end of the preprocess routine, calls +; the function code + +; this also removes some less than elegant code that was used to bypass type checking +; for functions that returned strings + +LAB_1C27 + ASL ; *2 (2 bytes per function address) + TAY ; copy to index + + LDA LAB_FTBM,Y ; get function jump vector high byte + PHA ; push functions jump vector high byte + LDA LAB_FTBL,Y ; get function jump vector low byte + PHA ; push functions jump vector low byte + + LDA LAB_FTPM,Y ; get function pre process vector high byte + BEQ LAB_1C56 ; skip pre process if null vector + + PHA ; push functions pre process vector high byte + LDA LAB_FTPL,Y ; get function pre process vector low byte + PHA ; push functions pre process vector low byte + +LAB_1C56 + RTS ; do function, or pre process, call + +; process string expression in parenthesis + +LAB_PPFS + JSR LAB_1BF7 ; process expression in parenthesis + JMP LAB_CTST ; check if source is string then do function, + ; else do type mismatch + +; process numeric expression in parenthesis + +LAB_PPFN + JSR LAB_1BF7 ; process expression in parenthesis + JMP LAB_CTNM ; check if source is numeric then do function, + ; else do type mismatch + +; set numeric data type and increment BASIC execute pointer + +LAB_PPBI + LSR Dtypef ; clear data type flag, $FF=string, $00=numeric + JMP LAB_IGBY ; increment and scan memory then do function + +; process string for LEFT$, RIGHT$ or MID$ + +LAB_LRMS + JSR LAB_EVEZ ; evaluate (should be string) expression + JSR LAB_1C01 ; scan for ",", else do syntax error then warm start + JSR LAB_CTST ; check if source is string, else do type mismatch + + PLA ; get function jump vector low byte + TAX ; save functions jump vector low byte + PLA ; get function jump vector high byte + TAY ; save functions jump vector high byte + LDA des_ph ; get descriptor pointer high byte + PHA ; push string pointer high byte + LDA des_pl ; get descriptor pointer low byte + PHA ; push string pointer low byte + TYA ; get function jump vector high byte back + PHA ; save functions jump vector high byte + TXA ; get function jump vector low byte back + PHA ; save functions jump vector low byte + JSR LAB_GTBY ; get byte parameter + TXA ; copy byte parameter to A + RTS ; go do function + +; process numeric expression(s) for BIN$ or HEX$ + +LAB_BHSS + JSR LAB_EVEZ ; process expression + JSR LAB_CTNM ; check if source is numeric, else do type mismatch + LDA FAC1_e ; get FAC1 exponent + CMP #$98 ; compare with exponent = 2^24 + BCS LAB_BHER ; branch if n>=2^24 (is too big) + + JSR LAB_2831 ; convert FAC1 floating-to-fixed + LDX #$02 ; 3 bytes to do +LAB_CFAC + LDA FAC1_1,X ; get byte from FAC1 + STA nums_1,X ; save byte to temp + DEX ; decrement index + BPL LAB_CFAC ; copy FAC1 mantissa to temp + + JSR LAB_GBYT ; get next BASIC byte + LDX #$00 ; set default to no leading "0"s + CMP #')' ; compare with close bracket + BEQ LAB_1C54 ; if ")" go do rest of function + + JSR LAB_SCGB ; scan for "," and get byte + JSR LAB_GBYT ; get last byte back + CMP #')' ; is next character ) + BNE LAB_BHER ; if not ")" go do error + +LAB_1C54 + RTS ; else do function + +LAB_BHER + JMP LAB_FCER ; do function call error then warm start + +; perform EOR + +; added operator format is the same as AND or OR, precedence is the same as OR + +; this bit worked first time but it took a while to sort out the operator table +; pointers and offsets afterwards! + +LAB_EOR + JSR GetFirst ; get first integer expression (no sign check) + EOR XOAw_l ; EOR with expression 1 low byte + TAY ; save in Y + LDA FAC1_2 ; get FAC1 mantissa2 + EOR XOAw_h ; EOR with expression 1 high byte + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +; perform OR + +LAB_OR + JSR GetFirst ; get first integer expression (no sign check) + ORA XOAw_l ; OR with expression 1 low byte + TAY ; save in Y + LDA FAC1_2 ; get FAC1 mantissa2 + ORA XOAw_h ; OR with expression 1 high byte + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +; perform AND + +LAB_AND + JSR GetFirst ; get first integer expression (no sign check) + AND XOAw_l ; AND with expression 1 low byte + TAY ; save in Y + LDA FAC1_2 ; get FAC1 mantissa2 + AND XOAw_h ; AND with expression 1 high byte + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +; get first value for OR, AND or EOR + +GetFirst + JSR LAB_EVIR ; evaluate integer expression (no sign check) + LDA FAC1_2 ; get FAC1 mantissa2 + STA XOAw_h ; save it + LDA FAC1_3 ; get FAC1 mantissa3 + STA XOAw_l ; save it + JSR LAB_279B ; copy FAC2 to FAC1 (get 2nd value in expression) + JSR LAB_EVIR ; evaluate integer expression (no sign check) + LDA FAC1_3 ; get FAC1 mantissa3 +LAB_1C95 + RTS + +; perform comparisons + +; do < compare + +LAB_LTHAN + JSR LAB_CKTM ; type match check, set C for string + BCS LAB_1CAE ; branch if string + + ; do numeric < compare + LDA FAC2_s ; get FAC2 sign (b7) + ORA #$7F ; set all non sign bits + AND FAC2_1 ; and FAC2 mantissa1 (AND in sign bit) + STA FAC2_1 ; save FAC2 mantissa1 + LDA #FAC2_e ; set pointer high byte to FAC2 + JSR LAB_27F8 ; compare FAC1 with FAC2 (AY) + TAX ; copy result + JMP LAB_1CE1 ; go evaluate result + + ; do string < compare +LAB_1CAE + LSR Dtypef ; clear data type flag, $FF=string, $00=numeric + DEC comp_f ; clear < bit in compare function flag + JSR LAB_22B6 ; pop string off descriptor stack, or from top of string + ; space returns with A = length, X=pointer low byte, + ; Y=pointer high byte + STA str_ln ; save length + STX str_pl ; save string pointer low byte + STY str_ph ; save string pointer high byte + LDA FAC2_2 ; get descriptor pointer low byte + LDY FAC2_3 ; get descriptor pointer high byte + JSR LAB_22BA ; pop (YA) descriptor off stack or from top of string space + ; returns with A = length, X=pointer low byte, + ; Y=pointer high byte + STX FAC2_2 ; save string pointer low byte + STY FAC2_3 ; save string pointer high byte + TAX ; copy length + SEC ; set carry for subtract + SBC str_ln ; subtract string 1 length + BEQ LAB_1CD6 ; branch if str 1 length = string 2 length + + LDA #$01 ; set str 1 length > string 2 length + BCC LAB_1CD6 ; branch if so + + LDX str_ln ; get string 1 length + LDA #$FF ; set str 1 length < string 2 length +LAB_1CD6 + STA FAC1_s ; save length compare + LDY #$FF ; set index + INX ; adjust for loop +LAB_1CDB + INY ; increment index + DEX ; decrement count + BNE LAB_1CE6 ; branch if still bytes to do + + LDX FAC1_s ; get length compare back +LAB_1CE1 + BMI LAB_1CF2 ; branch if str 1 < str 2 + + CLC ; flag str 1 <= str 2 + BCC LAB_1CF2 ; go evaluate result + +LAB_1CE6 + LDA (FAC2_2),Y ; get string 2 byte + CMP (FAC1_1),Y ; compare with string 1 byte + BEQ LAB_1CDB ; loop if bytes = + + LDX #$FF ; set str 1 < string 2 + BCS LAB_1CF2 ; branch if so + + LDX #$01 ; set str 1 > string 2 +LAB_1CF2 + INX ; x = 0, 1 or 2 + TXA ; copy to A + ROL ; *2 (1, 2 or 4) + AND Cflag ; AND with comparison evaluation flag + BEQ LAB_1CFB ; branch if 0 (compare is false) + + LDA #$FF ; else set result true +LAB_1CFB + JMP LAB_27DB ; save A as integer byte and return + +LAB_1CFE + JSR LAB_1C01 ; scan for ",", else do syntax error then warm start + +; perform DIM + +LAB_DIM + TAX ; copy "DIM" flag to X + JSR LAB_1D10 ; search for variable + JSR LAB_GBYT ; scan memory + BNE LAB_1CFE ; scan for "," and loop if not null + + RTS + +; perform << (left shift) + +LAB_LSHIFT + JSR GetPair ; get integer expression and byte (no sign check) + LDA FAC1_2 ; get expression high byte + LDX TempB ; get shift count + BEQ NoShift ; branch if zero + + CPX #$10 ; compare bit count with 16d + BCS TooBig ; branch if >= + +Ls_loop + ASL FAC1_3 ; shift low byte + ROL ; shift high byte + DEX ; decrement bit count + BNE Ls_loop ; loop if shift not complete + + LDY FAC1_3 ; get expression low byte + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +; perform >> (right shift) + +LAB_RSHIFT + JSR GetPair ; get integer expression and byte (no sign check) + LDA FAC1_2 ; get expression high byte + LDX TempB ; get shift count + BEQ NoShift ; branch if zero + + CPX #$10 ; compare bit count with 16d + BCS TooBig ; branch if >= + +Rs_loop + LSR ; shift high byte + ROR FAC1_3 ; shift low byte + DEX ; decrement bit count + BNE Rs_loop ; loop if shift not complete + +NoShift + LDY FAC1_3 ; get expression low byte + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +TooBig + LDA #$00 ; clear high byte + TAY ; copy to low byte + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +GetPair + JSR LAB_EVBY ; evaluate byte expression, result in X + STX TempB ; save it + JSR LAB_279B ; copy FAC2 to FAC1 (get 2nd value in expression) + JMP LAB_EVIR ; evaluate integer expression (no sign check) + +; search for variable + +; return pointer to variable in Cvaral/Cvarah + +LAB_GVAR + LDX #$00 ; set DIM flag = $00 + JSR LAB_GBYT ; scan memory (1st character) +LAB_1D10 + STX Defdim ; save DIM flag +LAB_1D12 + STA Varnm1 ; save 1st character + AND #$7F ; clear FN flag bit + JSR LAB_CASC ; check byte, return C=0 if<"A" or >"Z" + BCS LAB_1D1F ; branch if ok + + JMP LAB_SNER ; else syntax error then warm start + + ; was variable name so .. +LAB_1D1F + LDX #$00 ; clear 2nd character temp + STX Dtypef ; clear data type flag, $FF=string, $00=numeric + JSR LAB_IGBY ; increment and scan memory (2nd character) + BCC LAB_1D2D ; branch if character = "0"-"9" (ok) + + ; 2nd character wasn't "0" to "9" so .. + JSR LAB_CASC ; check byte, return C=0 if<"A" or >"Z" + BCC LAB_1D38 ; branch if <"A" or >"Z" (go check if string) + +LAB_1D2D + TAX ; copy 2nd character + + ; ignore further (valid) characters in the variable name +LAB_1D2E + JSR LAB_IGBY ; increment and scan memory (3rd character) + BCC LAB_1D2E ; loop if character = "0"-"9" (ignore) + + JSR LAB_CASC ; check byte, return C=0 if<"A" or >"Z" + BCS LAB_1D2E ; loop if character = "A"-"Z" (ignore) + + ; check if string variable +LAB_1D38 + CMP #'$' ; compare with "$" + BNE LAB_1D47 ; branch if not string + +; to introduce a new variable type (% suffix for integers say) then this branch +; will need to go to that check and then that branch, if it fails, go to LAB_1D47 + + ; type is string + LDA #$FF ; set data type = string + STA Dtypef ; set data type flag, $FF=string, $00=numeric + TXA ; get 2nd character back + ORA #$80 ; set top bit (indicate string var) + TAX ; copy back to 2nd character temp + JSR LAB_IGBY ; increment and scan memory + +; after we have determined the variable type we need to come back here to determine +; if it's an array of type. this would plug in a%(b[,c[,d]])) integer arrays nicely + + +LAB_1D47 ; gets here with character after var name in A + STX Varnm2 ; save 2nd character + ORA Sufnxf ; or with subscript/FNX flag (or FN name) + CMP #'(' ; compare with "(" + BNE LAB_1D53 ; branch if not "(" + + JMP LAB_1E17 ; go find, or make, array + +; either find or create var +; var name (1st two characters only!) is in Varnm1,Varnm2 + + ; variable name wasn't var(... so look for plain var +LAB_1D53 + LDA #$00 ; clear A + STA Sufnxf ; clear subscript/FNX flag + LDA Svarl ; get start of vars low byte + LDX Svarh ; get start of vars high byte + LDY #$00 ; clear index +LAB_1D5D + STX Vrschh ; save search address high byte +LAB_1D5F + STA Vrschl ; save search address low byte + CPX Sarryh ; compare high address with var space end + BNE LAB_1D69 ; skip next compare if <> + + ; high addresses were = so compare low addresses + CMP Sarryl ; compare low address with var space end + BEQ LAB_1D8B ; if not found go make new var + +LAB_1D69 + LDA Varnm1 ; get 1st character of var to find + CMP (Vrschl),Y ; compare with variable name 1st character + BNE LAB_1D77 ; branch if no match + + ; 1st characters match so compare 2nd characters + LDA Varnm2 ; get 2nd character of var to find + INY ; index to point to variable name 2nd character + CMP (Vrschl),Y ; compare with variable name 2nd character + BEQ LAB_1DD7 ; branch if match (found var) + + DEY ; else decrement index (now = $00) +LAB_1D77 + CLC ; clear carry for add + LDA Vrschl ; get search address low byte + ADC #$06 ; +6 (offset to next var name) + BCC LAB_1D5F ; loop if no overflow to high byte + + INX ; else increment high byte + BNE LAB_1D5D ; loop always (RAM doesn't extend to $FFFF !) + +; check byte, return C=0 if<"A" or >"Z" or "a" to "z" + +LAB_CASC + CMP #'a' ; compare with "a" + BCS LAB_1D83 ; go check <"z"+1 + +; check byte, return C=0 if<"A" or >"Z" + +LAB_1D82 + CMP #'A' ; compare with "A" + BCC LAB_1D8A ; exit if less + + ; carry is set + SBC #$5B ; subtract "Z"+1 + SEC ; set carry + SBC #$A5 ; subtract $A5 (restore byte) + ; carry clear if byte>$5A +LAB_1D8A + RTS + +LAB_1D83 + SBC #$7B ; subtract "z"+1 + SEC ; set carry + SBC #$85 ; subtract $85 (restore byte) + ; carry clear if byte>$7A + RTS + + ; reached end of variable mem without match + ; .. so create new variable +LAB_1D8B + PLA ; pop return address low byte + PHA ; push return address low byte +LAB_1C18p2 = LAB_1C18+2 + CMP #LAB_1D96 ; high byte point to $00,$00 + RTS + + ; create new numeric variable +LAB_1D98 + LDA Sarryl ; get var mem end low byte + LDY Sarryh ; get var mem end high byte + STA Ostrtl ; save old block start low byte + STY Ostrth ; save old block start high byte + LDA Earryl ; get array mem end low byte + LDY Earryh ; get array mem end high byte + STA Obendl ; save old block end low byte + STY Obendh ; save old block end high byte + CLC ; clear carry for add + ADC #$06 ; +6 (space for one var) + BCC LAB_1DAE ; branch if no overflow to high byte + + INY ; else increment high byte +LAB_1DAE + STA Nbendl ; set new block end low byte + STY Nbendh ; set new block end high byte + JSR LAB_11CF ; open up space in memory + LDA Nbendl ; get new start low byte + LDY Nbendh ; get new start high byte (-$100) + INY ; correct high byte + STA Sarryl ; save new var mem end low byte + STY Sarryh ; save new var mem end high byte + LDY #$00 ; clear index + LDA Varnm1 ; get var name 1st character + STA (Vrschl),Y ; save var name 1st character + INY ; increment index + LDA Varnm2 ; get var name 2nd character + STA (Vrschl),Y ; save var name 2nd character + LDA #$00 ; clear A + INY ; increment index + STA (Vrschl),Y ; initialise var byte + INY ; increment index + STA (Vrschl),Y ; initialise var byte + INY ; increment index + STA (Vrschl),Y ; initialise var byte + INY ; increment index + STA (Vrschl),Y ; initialise var byte + + ; found a match for var ((Vrschl) = ptr) +LAB_1DD7 + LDA Vrschl ; get var address low byte + CLC ; clear carry for add + ADC #$02 ; +2 (offset past var name bytes) + LDY Vrschh ; get var address high byte + BCC LAB_1DE1 ; branch if no overflow from add + + INY ; else increment high byte +LAB_1DE1 + STA Cvaral ; save current var address low byte + STY Cvarah ; save current var address high byte + RTS + +; set-up array pointer (Adatal/h) to first element in array +; set Adatal,Adatah to Astrtl,Astrth+2*Dimcnt+#$05 + +LAB_1DE6 + LDA Dimcnt ; get # of dimensions (1, 2 or 3) + ASL ; *2 (also clears the carry !) + ADC #$05 ; +5 (result is 7, 9 or 11 here) + ADC Astrtl ; add array start pointer low byte + LDY Astrth ; get array pointer high byte + BCC LAB_1DF2 ; branch if no overflow + + INY ; else increment high byte +LAB_1DF2 + STA Adatal ; save array data pointer low byte + STY Adatah ; save array data pointer high byte + RTS + +; evaluate integer expression + +LAB_EVIN + JSR LAB_IGBY ; increment and scan memory + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch + +; evaluate integer expression (no check) + +LAB_EVPI + LDA FAC1_s ; get FAC1 sign (b7) + BMI LAB_1E12 ; do function call error if -ve + +; evaluate integer expression (no sign check) + +LAB_EVIR + LDA FAC1_e ; get FAC1 exponent + CMP #$90 ; compare with exponent = 2^16 (n>2^15) + BCC LAB_1E14 ; branch if n<2^16 (is ok) + + LDA #LAB_1DF7 ; set pointer high byte to -32768 + JSR LAB_27F8 ; compare FAC1 with (AY) +LAB_1E12 + BNE LAB_FCER ; if <> do function call error then warm start + +LAB_1E14 + JMP LAB_2831 ; convert FAC1 floating-to-fixed and return + +; find or make array + +LAB_1E17 + LDA Defdim ; get DIM flag + PHA ; push it + LDA Dtypef ; get data type flag, $FF=string, $00=numeric + PHA ; push it + LDY #$00 ; clear dimensions count + +; now get the array dimension(s) and stack it (them) before the data type and DIM flag + +LAB_1E1F + TYA ; copy dimensions count + PHA ; save it + LDA Varnm2 ; get array name 2nd byte + PHA ; save it + LDA Varnm1 ; get array name 1st byte + PHA ; save it + JSR LAB_EVIN ; evaluate integer expression + PLA ; pull array name 1st byte + STA Varnm1 ; restore array name 1st byte + PLA ; pull array name 2nd byte + STA Varnm2 ; restore array name 2nd byte + PLA ; pull dimensions count + TAY ; restore it + TSX ; copy stack pointer + LDA LAB_STAK+2,X ; get DIM flag + PHA ; push it + LDA LAB_STAK+1,X ; get data type flag + PHA ; push it + LDA FAC1_2 ; get this dimension size high byte + STA LAB_STAK+2,X ; stack before flag bytes + LDA FAC1_3 ; get this dimension size low byte + STA LAB_STAK+1,X ; stack before flag bytes + INY ; increment dimensions count + JSR LAB_GBYT ; scan memory + CMP #',' ; compare with "," + BEQ LAB_1E1F ; if found go do next dimension + + STY Dimcnt ; store dimensions count + JSR LAB_1BFB ; scan for ")" , else do syntax error then warm start + PLA ; pull data type flag + STA Dtypef ; restore data type flag, $FF=string, $00=numeric + PLA ; pull DIM flag + STA Defdim ; restore DIM flag + LDX Sarryl ; get array mem start low byte + LDA Sarryh ; get array mem start high byte + +; now check to see if we are at the end of array memory (we would be if there were +; no arrays). + +LAB_1E5C + STX Astrtl ; save as array start pointer low byte + STA Astrth ; save as array start pointer high byte + CMP Earryh ; compare with array mem end high byte + BNE LAB_1E68 ; branch if not reached array mem end + + CPX Earryl ; else compare with array mem end low byte + BEQ LAB_1EA1 ; go build array if not found + + ; search for array +LAB_1E68 + LDY #$00 ; clear index + LDA (Astrtl),Y ; get array name first byte + INY ; increment index to second name byte + CMP Varnm1 ; compare with this array name first byte + BNE LAB_1E77 ; branch if no match + + LDA Varnm2 ; else get this array name second byte + CMP (Astrtl),Y ; compare with array name second byte + BEQ LAB_1E8D ; array found so branch + + ; no match +LAB_1E77 + INY ; increment index + LDA (Astrtl),Y ; get array size low byte + CLC ; clear carry for add + ADC Astrtl ; add array start pointer low byte + TAX ; copy low byte to X + INY ; increment index + LDA (Astrtl),Y ; get array size high byte + ADC Astrth ; add array mem pointer high byte + BCC LAB_1E5C ; if no overflow go check next array + +; do array bounds error + +LAB_1E85 + LDX #$10 ; error code $10 ("Array bounds" error) + .byte $2C ; makes next bit BIT LAB_08A2 + +; do function call error + +LAB_FCER + LDX #$08 ; error code $08 ("Function call" error) +LAB_1E8A + JMP LAB_XERR ; do error #X, then warm start + + ; found array, are we trying to dimension it? +LAB_1E8D + LDX #$12 ; set error $12 ("Double dimension" error) + LDA Defdim ; get DIM flag + BNE LAB_1E8A ; if we are trying to dimension it do error #X, then warm + ; start + +; found the array and we're not dimensioning it so we must find an element in it + + JSR LAB_1DE6 ; set-up array pointer (Adatal/h) to first element in array + ; (Astrtl,Astrth points to start of array) + LDA Dimcnt ; get dimensions count + LDY #$04 ; set index to array's # of dimensions + CMP (Astrtl),Y ; compare with no of dimensions + BNE LAB_1E85 ; if wrong do array bounds error, could do "Wrong + ; dimensions" error here .. if we want a different + ; error message + + JMP LAB_1F28 ; found array so go get element + ; (could jump to LAB_1F28 as all LAB_1F24 does is take + ; Dimcnt and save it at (Astrtl),Y which is already the + ; same or we would have taken the BNE) + + ; array not found, so build it +LAB_1EA1 + JSR LAB_1DE6 ; set-up array pointer (Adatal/h) to first element in array + ; (Astrtl,Astrth points to start of array) + JSR LAB_121F ; check available memory, "Out of memory" error if no room + ; addr to check is in AY (low/high) + LDY #$00 ; clear Y (don't need to clear A) + STY Aspth ; clear array data size high byte + LDA Varnm1 ; get variable name 1st byte + STA (Astrtl),Y ; save array name 1st byte + INY ; increment index + LDA Varnm2 ; get variable name 2nd byte + STA (Astrtl),Y ; save array name 2nd byte + LDA Dimcnt ; get dimensions count + LDY #$04 ; index to dimension count + STY Asptl ; set array data size low byte (four bytes per element) + STA (Astrtl),Y ; set array's dimensions count + + ; now calculate the size of the data space for the array + CLC ; clear carry for add (clear on subsequent loops) +LAB_1EC0 + LDX #$0B ; set default dimension value low byte + LDA #$00 ; set default dimension value high byte + BIT Defdim ; test default DIM flag + BVC LAB_1ED0 ; branch if b6 of Defdim is clear + + PLA ; else pull dimension value low byte + ADC #$01 ; +1 (allow for zeroeth element) + TAX ; copy low byte to X + PLA ; pull dimension value high byte + ADC #$00 ; add carry from low byte + +LAB_1ED0 + INY ; index to dimension value high byte + STA (Astrtl),Y ; save dimension value high byte + INY ; index to dimension value high byte + TXA ; get dimension value low byte + STA (Astrtl),Y ; save dimension value low byte + JSR LAB_1F7C ; does XY = (Astrtl),Y * (Asptl) + STX Asptl ; save array data size low byte + STA Aspth ; save array data size high byte + LDY ut1_pl ; restore index (saved by subroutine) + DEC Dimcnt ; decrement dimensions count + BNE LAB_1EC0 ; loop while not = 0 + + ADC Adatah ; add size high byte to first element high byte + ; (carry is always clear here) + BCS LAB_1F45 ; if overflow go do "Out of memory" error + + STA Adatah ; save end of array high byte + TAY ; copy end high byte to Y + TXA ; get array size low byte + ADC Adatal ; add array start low byte + BCC LAB_1EF3 ; branch if no carry + + INY ; else increment end of array high byte + BEQ LAB_1F45 ; if overflow go do "Out of memory" error + + ; set-up mostly complete, now zero the array +LAB_1EF3 + JSR LAB_121F ; check available memory, "Out of memory" error if no room + ; addr to check is in AY (low/high) + STA Earryl ; save array mem end low byte + STY Earryh ; save array mem end high byte + LDA #$00 ; clear byte for array clear + INC Aspth ; increment array size high byte (now block count) + LDY Asptl ; get array size low byte (now index to block) + BEQ LAB_1F07 ; branch if low byte = $00 + +LAB_1F02 + DEY ; decrement index (do 0 to n-1) + STA (Adatal),Y ; zero byte + BNE LAB_1F02 ; loop until this block done + +LAB_1F07 + DEC Adatah ; decrement array pointer high byte + DEC Aspth ; decrement block count high byte + BNE LAB_1F02 ; loop until all blocks done + + INC Adatah ; correct for last loop + SEC ; set carry for subtract + LDY #$02 ; index to array size low byte + LDA Earryl ; get array mem end low byte + SBC Astrtl ; subtract array start low byte + STA (Astrtl),Y ; save array size low byte + INY ; index to array size high byte + LDA Earryh ; get array mem end high byte + SBC Astrth ; subtract array start high byte + STA (Astrtl),Y ; save array size high byte + LDA Defdim ; get default DIM flag + BNE LAB_1F7B ; exit (RET) if this was a DIM command + + ; else, find element + INY ; index to # of dimensions + +LAB_1F24 + LDA (Astrtl),Y ; get array's dimension count + STA Dimcnt ; save it + +; we have found, or built, the array. now we need to find the element + +LAB_1F28 + LDA #$00 ; clear byte + STA Asptl ; clear array data pointer low byte +LAB_1F2C + STA Aspth ; save array data pointer high byte + INY ; increment index (point to array bound high byte) + PLA ; pull array index low byte + TAX ; copy to X + STA FAC1_2 ; save index low byte to FAC1 mantissa2 + PLA ; pull array index high byte + STA FAC1_3 ; save index high byte to FAC1 mantissa3 + CMP (Astrtl),Y ; compare with array bound high byte + BCC LAB_1F48 ; branch if within bounds + + BNE LAB_1F42 ; if outside bounds do array bounds error + + ; else high byte was = so test low bytes + INY ; index to array bound low byte + TXA ; get array index low byte + CMP (Astrtl),Y ; compare with array bound low byte + BCC LAB_1F49 ; branch if within bounds + +LAB_1F42 + JMP LAB_1E85 ; else do array bounds error + +LAB_1F45 + JMP LAB_OMER ; do "Out of memory" error then warm start + +LAB_1F48 + INY ; index to array bound low byte +LAB_1F49 + LDA Aspth ; get array data pointer high byte + ORA Asptl ; OR with array data pointer low byte + BEQ LAB_1F5A ; branch if array data pointer = null (skip multiply) + + JSR LAB_1F7C ; does XY = (Astrtl),Y * (Asptl) + TXA ; get result low byte + ADC FAC1_2 ; add index low byte from FAC1 mantissa2 + TAX ; save result low byte + TYA ; get result high byte + LDY ut1_pl ; restore index +LAB_1F5A + ADC FAC1_3 ; add index high byte from FAC1 mantissa3 + STX Asptl ; save array data pointer low byte + DEC Dimcnt ; decrement dimensions count + BNE LAB_1F2C ; loop if dimensions still to do + + ASL Asptl ; array data pointer low byte * 2 + ROL ; array data pointer high byte * 2 + ASL Asptl ; array data pointer low byte * 4 + ROL ; array data pointer high byte * 4 + TAY ; copy high byte + LDA Asptl ; get low byte + ADC Adatal ; add array data start pointer low byte + STA Cvaral ; save as current var address low byte + TYA ; get high byte back + ADC Adatah ; add array data start pointer high byte + STA Cvarah ; save as current var address high byte + TAY ; copy high byte to Y + LDA Cvaral ; get current var address low byte +LAB_1F7B + RTS + +; does XY = (Astrtl),Y * (Asptl) + +LAB_1F7C + STY ut1_pl ; save index + LDA (Astrtl),Y ; get dimension size low byte + STA dims_l ; save dimension size low byte + DEY ; decrement index + LDA (Astrtl),Y ; get dimension size high byte + STA dims_h ; save dimension size high byte + + LDA #$10 ; count = $10 (16 bit multiply) + STA numbit ; save bit count + LDX #$00 ; clear result low byte + LDY #$00 ; clear result high byte +LAB_1F8F + TXA ; get result low byte + ASL ; *2 + TAX ; save result low byte + TYA ; get result high byte + ROL ; *2 + TAY ; save result high byte + BCS LAB_1F45 ; if overflow go do "Out of memory" error + + ASL Asptl ; shift multiplier low byte + ROL Aspth ; shift multiplier high byte + BCC LAB_1FA8 ; skip add if no carry + + CLC ; else clear carry for add + TXA ; get result low byte + ADC dims_l ; add dimension size low byte + TAX ; save result low byte + TYA ; get result high byte + ADC dims_h ; add dimension size high byte + TAY ; save result high byte + BCS LAB_1F45 ; if overflow go do "Out of memory" error + +LAB_1FA8 + DEC numbit ; decrement bit count + BNE LAB_1F8F ; loop until all done + + RTS + +; perform FRE() + +LAB_FRE + LDA Dtypef ; get data type flag, $FF=string, $00=numeric + BPL LAB_1FB4 ; branch if numeric + + JSR LAB_22B6 ; pop string off descriptor stack, or from top of string + ; space returns with A = length, X=$71=pointer low byte, + ; Y=$72=pointer high byte + + ; FRE(n) was numeric so do this +LAB_1FB4 + JSR LAB_GARB ; go do garbage collection + SEC ; set carry for subtract + LDA Sstorl ; get bottom of string space low byte + SBC Earryl ; subtract array mem end low byte + TAY ; copy result to Y + LDA Sstorh ; get bottom of string space high byte + SBC Earryh ; subtract array mem end high byte + +; save and convert integer AY to FAC1 + +LAB_AYFC + LSR Dtypef ; clear data type flag, $FF=string, $00=numeric + STA FAC1_1 ; save FAC1 mantissa1 + STY FAC1_2 ; save FAC1 mantissa2 + LDX #$90 ; set exponent=2^16 (integer) + JMP LAB_27E3 ; set exp=X, clear FAC1_3, normalise and return + +; perform POS() + +LAB_POS + LDY TPos ; get terminal position + +; convert Y to byte in FAC1 + +LAB_1FD0 + LDA #$00 ; clear high byte + BEQ LAB_AYFC ; always save and convert integer AY to FAC1 and return + +; check not Direct (used by DEF and INPUT) + +LAB_CKRN + LDX Clineh ; get current line high byte + INX ; increment it + BNE LAB_1F7B ; return if can continue not direct mode + + ; else do illegal direct error +LAB_1FD9 + LDX #$16 ; error code $16 ("Illegal direct" error) +LAB_1FDB + JMP LAB_XERR ; go do error #X, then warm start + +; perform DEF + +LAB_DEF + JSR LAB_200B ; check FNx syntax + STA func_l ; save function pointer low byte + STY func_h ; save function pointer high byte + JSR LAB_CKRN ; check not Direct (back here if ok) + JSR LAB_1BFE ; scan for "(" , else do syntax error then warm start + LDA #$80 ; set flag for FNx + STA Sufnxf ; save subscript/FNx flag + JSR LAB_GVAR ; get (var) address + JSR LAB_CTNM ; check if source is numeric, else do type mismatch + JSR LAB_1BFB ; scan for ")" , else do syntax error then warm start + LDA #TK_EQUAL ; get = token + JSR LAB_SCCA ; scan for CHR$(A), else do syntax error then warm start + LDA Cvarah ; get current var address high byte + PHA ; push it + LDA Cvaral ; get current var address low byte + PHA ; push it + LDA Bpntrh ; get BASIC execute pointer high byte + PHA ; push it + LDA Bpntrl ; get BASIC execute pointer low byte + PHA ; push it + JSR LAB_DATA ; go perform DATA + JMP LAB_207A ; put execute pointer and variable pointer into function + ; and return + +; check FNx syntax + +LAB_200B + LDA #TK_FN ; get FN" token + JSR LAB_SCCA ; scan for CHR$(A) , else do syntax error then warm start + ; return character after A + ORA #$80 ; set FN flag bit + STA Sufnxf ; save FN flag so array variable test fails + JSR LAB_1D12 ; search for FN variable + JMP LAB_CTNM ; check if source is numeric and return, else do type + ; mismatch + + ; Evaluate FNx +LAB_201E + JSR LAB_200B ; check FNx syntax + PHA ; push function pointer low byte + TYA ; copy function pointer high byte + PHA ; push function pointer high byte + JSR LAB_1BFE ; scan for "(", else do syntax error then warm start + JSR LAB_EVEX ; evaluate expression + JSR LAB_1BFB ; scan for ")", else do syntax error then warm start + JSR LAB_CTNM ; check if source is numeric, else do type mismatch + PLA ; pop function pointer high byte + STA func_h ; restore it + PLA ; pop function pointer low byte + STA func_l ; restore it + LDX #$20 ; error code $20 ("Undefined function" error) + LDY #$03 ; index to variable pointer high byte + LDA (func_l),Y ; get variable pointer high byte + BEQ LAB_1FDB ; if zero go do undefined function error + + STA Cvarah ; save variable address high byte + DEY ; index to variable address low byte + LDA (func_l),Y ; get variable address low byte + STA Cvaral ; save variable address low byte + TAX ; copy address low byte + + ; now stack the function variable value before use + INY ; index to mantissa_3 +LAB_2043 + LDA (Cvaral),Y ; get byte from variable + PHA ; stack it + DEY ; decrement index + BPL LAB_2043 ; loop until variable stacked + + LDY Cvarah ; get variable address high byte + JSR LAB_2778 ; pack FAC1 (function expression value) into (XY) + ; (function variable), return Y=0, always + LDA Bpntrh ; get BASIC execute pointer high byte + PHA ; push it + LDA Bpntrl ; get BASIC execute pointer low byte + PHA ; push it + LDA (func_l),Y ; get function execute pointer low byte + STA Bpntrl ; save as BASIC execute pointer low byte + INY ; index to high byte + LDA (func_l),Y ; get function execute pointer high byte + STA Bpntrh ; save as BASIC execute pointer high byte + LDA Cvarah ; get variable address high byte + PHA ; push it + LDA Cvaral ; get variable address low byte + PHA ; push it + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch + PLA ; pull variable address low byte + STA func_l ; save variable address low byte + PLA ; pull variable address high byte + STA func_h ; save variable address high byte + JSR LAB_GBYT ; scan memory + BEQ LAB_2074 ; branch if null (should be [EOL] marker) + + JMP LAB_SNER ; else syntax error then warm start + +; restore Bpntrl,Bpntrh and function variable from stack + +LAB_2074 + PLA ; pull BASIC execute pointer low byte + STA Bpntrl ; restore BASIC execute pointer low byte + PLA ; pull BASIC execute pointer high byte + STA Bpntrh ; restore BASIC execute pointer high byte + +; put execute pointer and variable pointer into function + +LAB_207A + LDY #$00 ; clear index + PLA ; pull BASIC execute pointer low byte + STA (func_l),Y ; save to function + INY ; increment index + PLA ; pull BASIC execute pointer high byte + STA (func_l),Y ; save to function + INY ; increment index + PLA ; pull current var address low byte + STA (func_l),Y ; save to function + INY ; increment index + PLA ; pull current var address high byte + STA (func_l),Y ; save to function + RTS + +; perform STR$() + +LAB_STRS + JSR LAB_CTNM ; check if source is numeric, else do type mismatch + JSR LAB_296E ; convert FAC1 to string + LDA #Decssp1 ; set result string high pointer + BEQ LAB_20AE ; print null terminated string to Sutill/Sutilh + +; Do string vector +; copy des_pl/h to des_2l/h and make string space A bytes long + +LAB_209C + LDX des_pl ; get descriptor pointer low byte + LDY des_ph ; get descriptor pointer high byte + STX des_2l ; save descriptor pointer low byte + STY des_2h ; save descriptor pointer high byte + +; make string space A bytes long +; A=length, X=Sutill=ptr low byte, Y=Sutilh=ptr high byte + +LAB_MSSP + JSR LAB_2115 ; make space in string memory for string A long + ; return X=Sutill=ptr low byte, Y=Sutilh=ptr high byte + STX str_pl ; save string pointer low byte + STY str_ph ; save string pointer high byte + STA str_ln ; save length + RTS + +; Scan, set up string +; print " terminated string to Sutill/Sutilh + +LAB_20AE + LDX #$22 ; set terminator to " + STX Srchc ; set search character (terminator 1) + STX Asrch ; set terminator 2 + +; print [Srchc] or [Asrch] terminated string to Sutill/Sutilh +; source is AY + +LAB_20B4 + STA ssptr_l ; store string start low byte + STY ssptr_h ; store string start high byte + STA str_pl ; save string pointer low byte + STY str_ph ; save string pointer high byte + LDY #$FF ; set length to -1 +LAB_20BE + INY ; increment length + LDA (ssptr_l),Y ; get byte from string + BEQ LAB_20CF ; exit loop if null byte [EOS] + + CMP Srchc ; compare with search character (terminator 1) + BEQ LAB_20CB ; branch if terminator + + CMP Asrch ; compare with terminator 2 + BNE LAB_20BE ; loop if not terminator 2 + +LAB_20CB + CMP #$22 ; compare with " + BEQ LAB_20D0 ; branch if " (carry set if = !) + +LAB_20CF + CLC ; clear carry for add (only if [EOL] terminated string) +LAB_20D0 + STY str_ln ; save length in FAC1 exponent + TYA ; copy length to A + ADC ssptr_l ; add string start low byte + STA Sendl ; save string end low byte + LDX ssptr_h ; get string start high byte + BCC LAB_20DC ; branch if no low byte overflow + + INX ; else increment high byte +LAB_20DC + STX Sendh ; save string end high byte + LDA ssptr_h ; get string start high byte +; *** begin RAM above code / Ibuff above EhBASIC patch V2 *** +; *** replace +; CMP #>Ram_base ; compare with start of program memory +; BCS LAB_RTST ; branch if not in utility area +; *** with + BEQ LAB_MVST ; fix STR$() using page zero via LAB_296E + CMP #>Ibuffs ; compare with location of input buffer page + BNE LAB_RTST ; branch if not in utility area +LAB_MVST +; *** end RAM above code / Ibuff above EhBASIC patch V2 *** + + ; string in utility area, move to string memory + TYA ; copy length to A + JSR LAB_209C ; copy des_pl/h to des_2l/h and make string space A bytes + ; long + LDX ssptr_l ; get string start low byte + LDY ssptr_h ; get string start high byte + JSR LAB_2298 ; store string A bytes long from XY to (Sutill) + +; check for space on descriptor stack then .. +; put string address and length on descriptor stack and update stack pointers + +LAB_RTST + LDX next_s ; get string stack pointer + CPX #des_sk+$09 ; compare with max+1 + BNE LAB_20F8 ; branch if space on string stack + + ; else do string too complex error + LDX #$1C ; error code $1C ("String too complex" error) +LAB_20F5 + JMP LAB_XERR ; do error #X, then warm start + +; put string address and length on descriptor stack and update stack pointers + +LAB_20F8 + LDA str_ln ; get string length + STA PLUS_0,X ; put on string stack + LDA str_pl ; get string pointer low byte + STA PLUS_1,X ; put on string stack + LDA str_ph ; get string pointer high byte + STA PLUS_2,X ; put on string stack + LDY #$00 ; clear Y + STX des_pl ; save string descriptor pointer low byte + STY des_ph ; save string descriptor pointer high byte (always $00) + DEY ; Y = $FF + STY Dtypef ; save data type flag, $FF=string + STX last_sl ; save old stack pointer (current top item) + INX ; update stack pointer + INX ; update stack pointer + INX ; update stack pointer + STX next_s ; save new top item value + RTS + +; Build descriptor +; make space in string memory for string A long +; return X=Sutill=ptr low byte, Y=Sutill=ptr high byte + +LAB_2115 + LSR Gclctd ; clear garbage collected flag (b7) + + ; make space for string A long +LAB_2117 + PHA ; save string length + EOR #$FF ; complement it + SEC ; set carry for subtract (twos comp add) + ADC Sstorl ; add bottom of string space low byte (subtract length) + LDY Sstorh ; get bottom of string space high byte + BCS LAB_2122 ; skip decrement if no underflow + + DEY ; decrement bottom of string space high byte +LAB_2122 + CPY Earryh ; compare with array mem end high byte + BCC LAB_2137 ; do out of memory error if less + + BNE LAB_212C ; if not = skip next test + + CMP Earryl ; compare with array mem end low byte + BCC LAB_2137 ; do out of memory error if less + +LAB_212C + STA Sstorl ; save bottom of string space low byte + STY Sstorh ; save bottom of string space high byte + STA Sutill ; save string utility ptr low byte + STY Sutilh ; save string utility ptr high byte + TAX ; copy low byte to X + PLA ; get string length back + RTS + +LAB_2137 + LDX #$0C ; error code $0C ("Out of memory" error) + LDA Gclctd ; get garbage collected flag + BMI LAB_20F5 ; if set then do error code X + + JSR LAB_GARB ; else go do garbage collection + LDA #$80 ; flag for garbage collected + STA Gclctd ; set garbage collected flag + PLA ; pull length + BNE LAB_2117 ; go try again (loop always, length should never be = $00) + +; garbage collection routine + +LAB_GARB + LDX Ememl ; get end of mem low byte + LDA Ememh ; get end of mem high byte + +; re-run routine from last ending + +LAB_214B + STX Sstorl ; set string storage low byte + STA Sstorh ; set string storage high byte + LDY #$00 ; clear index + STY garb_h ; clear working pointer high byte (flag no strings to move) + LDA Earryl ; get array mem end low byte + LDX Earryh ; get array mem end high byte + STA Histrl ; save as highest string low byte + STX Histrh ; save as highest string high byte + LDA #des_sk ; set descriptor stack pointer + STA ut1_pl ; save descriptor stack pointer low byte + STY ut1_ph ; save descriptor stack pointer high byte ($00) +LAB_2161 + CMP next_s ; compare with descriptor stack pointer + BEQ LAB_216A ; branch if = + + JSR LAB_21D7 ; go garbage collect descriptor stack + BEQ LAB_2161 ; loop always + + ; done stacked strings, now do string vars +LAB_216A + ASL g_step ; set step size = $06 + LDA Svarl ; get start of vars low byte + LDX Svarh ; get start of vars high byte + STA ut1_pl ; save as pointer low byte + STX ut1_ph ; save as pointer high byte +LAB_2176 + CPX Sarryh ; compare start of arrays high byte + BNE LAB_217E ; branch if no high byte match + + CMP Sarryl ; else compare start of arrays low byte + BEQ LAB_2183 ; branch if = var mem end + +LAB_217E + JSR LAB_21D1 ; go garbage collect strings + BEQ LAB_2176 ; loop always + + ; done string vars, now do string arrays +LAB_2183 + STA Nbendl ; save start of arrays low byte as working pointer + STX Nbendh ; save start of arrays high byte as working pointer + LDA #$04 ; set step size + STA g_step ; save step size +LAB_218B + LDA Nbendl ; get pointer low byte + LDX Nbendh ; get pointer high byte +LAB_218F + CPX Earryh ; compare with array mem end high byte + BNE LAB_219A ; branch if not at end + + CMP Earryl ; else compare with array mem end low byte + BEQ LAB_2216 ; tidy up and exit if at end + +LAB_219A + STA ut1_pl ; save pointer low byte + STX ut1_ph ; save pointer high byte + LDY #$02 ; set index + LDA (ut1_pl),Y ; get array size low byte + ADC Nbendl ; add start of this array low byte + STA Nbendl ; save start of next array low byte + INY ; increment index + LDA (ut1_pl),Y ; get array size high byte + ADC Nbendh ; add start of this array high byte + STA Nbendh ; save start of next array high byte + LDY #$01 ; set index + LDA (ut1_pl),Y ; get name second byte + BPL LAB_218B ; skip if not string array + +; was string array so .. + + LDY #$04 ; set index + LDA (ut1_pl),Y ; get # of dimensions + ASL ; *2 + ADC #$05 ; +5 (array header size) + JSR LAB_2208 ; go set up for first element +LAB_21C4 + CPX Nbendh ; compare with start of next array high byte + BNE LAB_21CC ; branch if <> (go do this array) + + CMP Nbendl ; else compare element pointer low byte with next array + ; low byte + BEQ LAB_218F ; if equal then go do next array + +LAB_21CC + JSR LAB_21D7 ; go defrag array strings + BEQ LAB_21C4 ; go do next array string (loop always) + +; defrag string variables +; enter with XA = variable pointer +; return with XA = next variable pointer + +LAB_21D1 + INY ; increment index (Y was $00) + LDA (ut1_pl),Y ; get var name byte 2 + BPL LAB_2206 ; if not string, step pointer to next var and return + + INY ; else increment index +LAB_21D7 + LDA (ut1_pl),Y ; get string length + BEQ LAB_2206 ; if null, step pointer to next string and return + + INY ; else increment index + LDA (ut1_pl),Y ; get string pointer low byte + TAX ; copy to X + INY ; increment index + LDA (ut1_pl),Y ; get string pointer high byte + CMP Sstorh ; compare bottom of string space high byte + BCC LAB_21EC ; branch if less + + BNE LAB_2206 ; if greater, step pointer to next string and return + + ; high bytes were = so compare low bytes + CPX Sstorl ; compare bottom of string space low byte + BCS LAB_2206 ; if >=, step pointer to next string and return + + ; string pointer is < string storage pointer (pos in mem) +LAB_21EC + CMP Histrh ; compare to highest string high byte + BCC LAB_2207 ; if <, step pointer to next string and return + + BNE LAB_21F6 ; if > update pointers, step to next and return + + ; high bytes were = so compare low bytes + CPX Histrl ; compare to highest string low byte + BCC LAB_2207 ; if <, step pointer to next string and return + + ; string is in string memory space +LAB_21F6 + STX Histrl ; save as new highest string low byte + STA Histrh ; save as new highest string high byte + LDA ut1_pl ; get start of vars(descriptors) low byte + LDX ut1_ph ; get start of vars(descriptors) high byte + STA garb_l ; save as working pointer low byte + STX garb_h ; save as working pointer high byte + DEY ; decrement index DIFFERS + DEY ; decrement index (should point to descriptor start) + STY g_indx ; save index pointer + + ; step pointer to next string +LAB_2206 + CLC ; clear carry for add +LAB_2207 + LDA g_step ; get step size +LAB_2208 + ADC ut1_pl ; add pointer low byte + STA ut1_pl ; save pointer low byte + BCC LAB_2211 ; branch if no overflow + + INC ut1_ph ; else increment high byte +LAB_2211 + LDX ut1_ph ; get pointer high byte + LDY #$00 ; clear Y + RTS + +; search complete, now either exit or set-up and move string + +LAB_2216 + DEC g_step ; decrement step size (now $03 for descriptor stack) + LDX garb_h ; get string to move high byte + BEQ LAB_2211 ; exit if nothing to move + + LDY g_indx ; get index byte back (points to descriptor) + CLC ; clear carry for add + LDA (garb_l),Y ; get string length + ADC Histrl ; add highest string low byte + STA Obendl ; save old block end low pointer + LDA Histrh ; get highest string high byte + ADC #$00 ; add any carry + STA Obendh ; save old block end high byte + LDA Sstorl ; get bottom of string space low byte + LDX Sstorh ; get bottom of string space high byte + STA Nbendl ; save new block end low byte + STX Nbendh ; save new block end high byte + JSR LAB_11D6 ; open up space in memory, don't set array end + LDY g_indx ; get index byte + INY ; point to descriptor low byte + LDA Nbendl ; get string pointer low byte + STA (garb_l),Y ; save new string pointer low byte + TAX ; copy string pointer low byte + INC Nbendh ; correct high byte (move sets high byte -1) + LDA Nbendh ; get new string pointer high byte + INY ; point to descriptor high byte + STA (garb_l),Y ; save new string pointer high byte + JMP LAB_214B ; re-run routine from last ending + ; (but don't collect this string) + +; concatenate +; add strings, string 1 is in descriptor des_pl, string 2 is in line + +LAB_224D + LDA des_ph ; get descriptor pointer high byte + PHA ; put on stack + LDA des_pl ; get descriptor pointer low byte + PHA ; put on stack + JSR LAB_GVAL ; get value from line + JSR LAB_CTST ; check if source is string, else do type mismatch + PLA ; get descriptor pointer low byte back + STA ssptr_l ; set pointer low byte + PLA ; get descriptor pointer high byte back + STA ssptr_h ; set pointer high byte + LDY #$00 ; clear index + LDA (ssptr_l),Y ; get length_1 from descriptor + CLC ; clear carry for add + ADC (des_pl),Y ; add length_2 + BCC LAB_226D ; branch if no overflow + + LDX #$1A ; else set error code $1A ("String too long" error) + JMP LAB_XERR ; do error #X, then warm start + +LAB_226D + JSR LAB_209C ; copy des_pl/h to des_2l/h and make string space A bytes + ; long + JSR LAB_228A ; copy string from descriptor (sdescr) to (Sutill) + LDA des_2l ; get descriptor pointer low byte + LDY des_2h ; get descriptor pointer high byte + JSR LAB_22BA ; pop (YA) descriptor off stack or from top of string space + ; returns with A = length, ut1_pl = pointer low byte, + ; ut1_ph = pointer high byte + JSR LAB_229C ; store string A bytes long from (ut1_pl) to (Sutill) + LDA ssptr_l ;.set descriptor pointer low byte + LDY ssptr_h ;.set descriptor pointer high byte + JSR LAB_22BA ; pop (YA) descriptor off stack or from top of string space + ; returns with A = length, X=ut1_pl=pointer low byte, + ; Y=ut1_ph=pointer high byte + JSR LAB_RTST ; check for space on descriptor stack then put string + ; address and length on descriptor stack and update stack + ; pointers + JMP LAB_1ADB ;.continue evaluation + +; copy string from descriptor (sdescr) to (Sutill) + +LAB_228A + LDY #$00 ; clear index + LDA (sdescr),Y ; get string length + PHA ; save on stack + INY ; increment index + LDA (sdescr),Y ; get source string pointer low byte + TAX ; copy to X + INY ; increment index + LDA (sdescr),Y ; get source string pointer high byte + TAY ; copy to Y + PLA ; get length back + +; store string A bytes long from YX to (Sutill) + +LAB_2298 + STX ut1_pl ; save source string pointer low byte + STY ut1_ph ; save source string pointer high byte + +; store string A bytes long from (ut1_pl) to (Sutill) + +LAB_229C + TAX ; copy length to index (don't count with Y) + BEQ LAB_22B2 ; branch if = $0 (null string) no need to add zero length + + LDY #$00 ; zero pointer (copy forward) +LAB_22A0 + LDA (ut1_pl),Y ; get source byte + STA (Sutill),Y ; save destination byte + + INY ; increment index + DEX ; decrement counter + BNE LAB_22A0 ; loop while <> 0 + + TYA ; restore length from Y +LAB_22A9 + CLC ; clear carry for add + ADC Sutill ; add string utility ptr low byte + STA Sutill ; save string utility ptr low byte + BCC LAB_22B2 ; branch if no carry + + INC Sutilh ; else increment string utility ptr high byte +LAB_22B2 + RTS + +; evaluate string + +LAB_EVST + JSR LAB_CTST ; check if source is string, else do type mismatch + +; pop string off descriptor stack, or from top of string space +; returns with A = length, X=pointer low byte, Y=pointer high byte + +LAB_22B6 + LDA des_pl ; get descriptor pointer low byte + LDY des_ph ; get descriptor pointer high byte + +; pop (YA) descriptor off stack or from top of string space +; returns with A = length, X=ut1_pl=pointer low byte, Y=ut1_ph=pointer high byte + +LAB_22BA + STA ut1_pl ; save descriptor pointer low byte + STY ut1_ph ; save descriptor pointer high byte + JSR LAB_22EB ; clean descriptor stack, YA = pointer + PHP ; save status flags + LDY #$00 ; clear index + LDA (ut1_pl),Y ; get length from string descriptor + PHA ; put on stack + INY ; increment index + LDA (ut1_pl),Y ; get string pointer low byte from descriptor + TAX ; copy to X + INY ; increment index + LDA (ut1_pl),Y ; get string pointer high byte from descriptor + TAY ; copy to Y + PLA ; get string length back + PLP ; restore status + BNE LAB_22E6 ; branch if pointer <> last_sl,last_sh + + CPY Sstorh ; compare bottom of string space high byte + BNE LAB_22E6 ; branch if <> + + CPX Sstorl ; else compare bottom of string space low byte + BNE LAB_22E6 ; branch if <> + + PHA ; save string length + CLC ; clear carry for add + ADC Sstorl ; add bottom of string space low byte + STA Sstorl ; save bottom of string space low byte + BCC LAB_22E5 ; skip increment if no overflow + + INC Sstorh ; increment bottom of string space high byte +LAB_22E5 + PLA ; restore string length +LAB_22E6 + STX ut1_pl ; save string pointer low byte + STY ut1_ph ; save string pointer high byte + RTS + +; clean descriptor stack, YA = pointer +; checks if AY is on the descriptor stack, if so does a stack discard + +LAB_22EB + CPY last_sh ; compare pointer high byte + BNE LAB_22FB ; exit if <> + + CMP last_sl ; compare pointer low byte + BNE LAB_22FB ; exit if <> + + STA next_s ; save descriptor stack pointer + SBC #$03 ; -3 + STA last_sl ; save low byte -3 + LDY #$00 ; clear high byte +LAB_22FB + RTS + +; perform CHR$() + +LAB_CHRS + JSR LAB_EVBY ; evaluate byte expression, result in X + TXA ; copy to A + PHA ; save character + LDA #$01 ; string is single byte + JSR LAB_MSSP ; make string space A bytes long A=$AC=length, + ; X=$AD=Sutill=ptr low byte, Y=$AE=Sutilh=ptr high byte + PLA ; get character back + LDY #$00 ; clear index + STA (str_pl),Y ; save byte in string (byte IS string!) + JMP LAB_RTST ; check for space on descriptor stack then put string + ; address and length on descriptor stack and update stack + ; pointers + +; perform LEFT$() + +LAB_LEFT + PHA ; push byte parameter + JSR LAB_236F ; pull string data and byte parameter from stack + ; return pointer in des_2l/h, byte in A (and X), Y=0 + CMP (des_2l),Y ; compare byte parameter with string length + TYA ; clear A + BEQ LAB_2316 ; go do string copy (branch always) + +; perform RIGHT$() + +LAB_RIGHT + PHA ; push byte parameter + JSR LAB_236F ; pull string data and byte parameter from stack + ; return pointer in des_2l/h, byte in A (and X), Y=0 + CLC ; clear carry for add-1 + SBC (des_2l),Y ; subtract string length + EOR #$FF ; invert it (A=LEN(expression$)-l) + +LAB_2316 + BCC LAB_231C ; branch if string length > byte parameter + + LDA (des_2l),Y ; else make parameter = length + TAX ; copy to byte parameter copy + TYA ; clear string start offset +LAB_231C + PHA ; save string start offset +LAB_231D + TXA ; copy byte parameter (or string length if <) +LAB_231E + PHA ; save string length + JSR LAB_MSSP ; make string space A bytes long A=$AC=length, + ; X=$AD=Sutill=ptr low byte, Y=$AE=Sutilh=ptr high byte + LDA des_2l ; get descriptor pointer low byte + LDY des_2h ; get descriptor pointer high byte + JSR LAB_22BA ; pop (YA) descriptor off stack or from top of string space + ; returns with A = length, X=ut1_pl=pointer low byte, + ; Y=ut1_ph=pointer high byte + PLA ; get string length back + TAY ; copy length to Y + PLA ; get string start offset back + CLC ; clear carry for add + ADC ut1_pl ; add start offset to string start pointer low byte + STA ut1_pl ; save string start pointer low byte + BCC LAB_2335 ; branch if no overflow + + INC ut1_ph ; else increment string start pointer high byte +LAB_2335 + TYA ; copy length to A + JSR LAB_229C ; store string A bytes long from (ut1_pl) to (Sutill) + JMP LAB_RTST ; check for space on descriptor stack then put string + ; address and length on descriptor stack and update stack + ; pointers + +; perform MID$() + +LAB_MIDS + PHA ; push byte parameter + LDA #$FF ; set default length = 255 + STA mids_l ; save default length + JSR LAB_GBYT ; scan memory + CMP #')' ; compare with ")" + BEQ LAB_2358 ; branch if = ")" (skip second byte get) + + JSR LAB_1C01 ; scan for "," , else do syntax error then warm start + JSR LAB_GTBY ; get byte parameter (use copy in mids_l) +LAB_2358 + JSR LAB_236F ; pull string data and byte parameter from stack + ; return pointer in des_2l/h, byte in A (and X), Y=0 + DEX ; decrement start index + TXA ; copy to A + PHA ; save string start offset + CLC ; clear carry for sub-1 + LDX #$00 ; clear output string length + SBC (des_2l),Y ; subtract string length + BCS LAB_231D ; if start>string length go do null string + + EOR #$FF ; complement -length + CMP mids_l ; compare byte parameter + BCC LAB_231E ; if length>remaining string go do RIGHT$ + + LDA mids_l ; get length byte + BCS LAB_231E ; go do string copy (branch always) + +; pull string data and byte parameter from stack +; return pointer in des_2l/h, byte in A (and X), Y=0 + +LAB_236F + JSR LAB_1BFB ; scan for ")" , else do syntax error then warm start + PLA ; pull return address low byte (return address) + STA Fnxjpl ; save functions jump vector low byte + PLA ; pull return address high byte (return address) + STA Fnxjph ; save functions jump vector high byte + PLA ; pull byte parameter + TAX ; copy byte parameter to X + PLA ; pull string pointer low byte + STA des_2l ; save it + PLA ; pull string pointer high byte + STA des_2h ; save it + LDY #$00 ; clear index + TXA ; copy byte parameter + BEQ LAB_23A8 ; if null do function call error then warm start + + INC Fnxjpl ; increment function jump vector low byte + ; (JSR pushes return addr-1. this is all very nice + ; but will go tits up if either call is on a page + ; boundary!) + JMP (Fnxjpl) ; in effect, RTS + +; perform LCASE$() + +LAB_LCASE + JSR LAB_EVST ; evaluate string + STA str_ln ; set string length + TAY ; copy length to Y + BEQ NoString ; branch if null string + + JSR LAB_MSSP ; make string space A bytes long A=length, + ; X=Sutill=ptr low byte, Y=Sutilh=ptr high byte + STX str_pl ; save string pointer low byte + STY str_ph ; save string pointer high byte + TAY ; get string length back + +LC_loop + DEY ; decrement index + LDA (ut1_pl),Y ; get byte from string + JSR LAB_1D82 ; is character "A" to "Z" + BCC NoUcase ; branch if not upper case alpha + + ORA #$20 ; convert upper to lower case +NoUcase + STA (Sutill),Y ; save byte back to string + TYA ; test index + BNE LC_loop ; loop if not all done + + BEQ NoString ; tidy up and exit, branch always + +; perform UCASE$() + +LAB_UCASE + JSR LAB_EVST ; evaluate string + STA str_ln ; set string length + TAY ; copy length to Y + BEQ NoString ; branch if null string + + JSR LAB_MSSP ; make string space A bytes long A=length, + ; X=Sutill=ptr low byte, Y=Sutilh=ptr high byte + STX str_pl ; save string pointer low byte + STY str_ph ; save string pointer high byte + TAY ; get string length back + +UC_loop + DEY ; decrement index + LDA (ut1_pl),Y ; get byte from string + JSR LAB_CASC ; is character "a" to "z" (or "A" to "Z") + BCC NoLcase ; branch if not alpha + + AND #$DF ; convert lower to upper case +NoLcase + STA (Sutill),Y ; save byte back to string + TYA ; test index + BNE UC_loop ; loop if not all done + +NoString + JMP LAB_RTST ; check for space on descriptor stack then put string + ; address and length on descriptor stack and update stack + ; pointers + +; perform SADD() + +LAB_SADD + JSR LAB_IGBY ; increment and scan memory + JSR LAB_GVAR ; get var address + + JSR LAB_1BFB ; scan for ")", else do syntax error then warm start + JSR LAB_CTST ; check if source is string, else do type mismatch + + LDY #$02 ; index to string pointer high byte + LDA (Cvaral),Y ; get string pointer high byte + TAX ; copy string pointer high byte to X + DEY ; index to string pointer low byte + LDA (Cvaral),Y ; get string pointer low byte + TAY ; copy string pointer low byte to Y + TXA ; copy string pointer high byte to A + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +; perform LEN() + +LAB_LENS + JSR LAB_ESGL ; evaluate string, get length in A (and Y) + JMP LAB_1FD0 ; convert Y to byte in FAC1 and return + +; evaluate string, get length in Y + +LAB_ESGL + JSR LAB_EVST ; evaluate string + TAY ; copy length to Y + RTS + +; perform ASC() + +LAB_ASC + JSR LAB_ESGL ; evaluate string, get length in A (and Y) + BEQ LAB_23A8 ; if null do function call error then warm start + + LDY #$00 ; set index to first character + LDA (ut1_pl),Y ; get byte + TAY ; copy to Y + JMP LAB_1FD0 ; convert Y to byte in FAC1 and return + +; do function call error then warm start + +LAB_23A8 + JMP LAB_FCER ; do function call error then warm start + +; scan and get byte parameter + +LAB_SGBY + JSR LAB_IGBY ; increment and scan memory + +; get byte parameter + +LAB_GTBY + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch + +; evaluate byte expression, result in X + +LAB_EVBY + JSR LAB_EVPI ; evaluate integer expression (no check) + + LDY FAC1_2 ; get FAC1 mantissa2 + BNE LAB_23A8 ; if top byte <> 0 do function call error then warm start + + LDX FAC1_3 ; get FAC1 mantissa3 + JMP LAB_GBYT ; scan memory and return + +; perform VAL() + +LAB_VAL + JSR LAB_ESGL ; evaluate string, get length in A (and Y) + BNE LAB_23C5 ; branch if not null string + + ; string was null so set result = $00 + JMP LAB_24F1 ; clear FAC1 exponent and sign and return + +LAB_23C5 + LDX Bpntrl ; get BASIC execute pointer low byte + LDY Bpntrh ; get BASIC execute pointer high byte + STX Btmpl ; save BASIC execute pointer low byte + STY Btmph ; save BASIC execute pointer high byte + LDX ut1_pl ; get string pointer low byte + STX Bpntrl ; save as BASIC execute pointer low byte + CLC ; clear carry + ADC ut1_pl ; add string length + STA ut2_pl ; save string end low byte + LDA ut1_ph ; get string pointer high byte + STA Bpntrh ; save as BASIC execute pointer high byte + ADC #$00 ; add carry to high byte + STA ut2_ph ; save string end high byte + LDY #$00 ; set index to $00 + LDA (ut2_pl),Y ; get string end +1 byte + PHA ; push it + TYA ; clear A + STA (ut2_pl),Y ; terminate string with $00 + JSR LAB_GBYT ; scan memory + JSR LAB_2887 ; get FAC1 from string + PLA ; restore string end +1 byte + LDY #$00 ; set index to zero + STA (ut2_pl),Y ; put string end byte back + +; restore BASIC execute pointer from temp (Btmpl/Btmph) + +LAB_23F3 + LDX Btmpl ; get BASIC execute pointer low byte back + LDY Btmph ; get BASIC execute pointer high byte back + STX Bpntrl ; save BASIC execute pointer low byte + STY Bpntrh ; save BASIC execute pointer high byte + RTS + +; get two parameters for POKE or WAIT + +LAB_GADB + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch + JSR LAB_F2FX ; save integer part of FAC1 in temporary integer + +; scan for "," and get byte, else do Syntax error then warm start + +LAB_SCGB + JSR LAB_1C01 ; scan for "," , else do syntax error then warm start + LDA Itemph ; save temporary integer high byte + PHA ; on stack + LDA Itempl ; save temporary integer low byte + PHA ; on stack + JSR LAB_GTBY ; get byte parameter + PLA ; pull low byte + STA Itempl ; restore temporary integer low byte + PLA ; pull high byte + STA Itemph ; restore temporary integer high byte + RTS + +; convert float to fixed routine. accepts any value that fits in 24 bits, +ve or +; -ve and converts it into a right truncated integer in Itempl and Itemph + +; save unsigned 16 bit integer part of FAC1 in temporary integer + +LAB_F2FX + LDA FAC1_e ; get FAC1 exponent + CMP #$98 ; compare with exponent = 2^24 + BCS LAB_23A8 ; if >= do function call error then warm start + +LAB_F2FU + JSR LAB_2831 ; convert FAC1 floating-to-fixed + LDA FAC1_2 ; get FAC1 mantissa2 + LDY FAC1_3 ; get FAC1 mantissa3 + STY Itempl ; save temporary integer low byte + STA Itemph ; save temporary integer high byte + RTS + +; perform PEEK() + +LAB_PEEK + JSR LAB_F2FX ; save integer part of FAC1 in temporary integer + LDX #$00 ; clear index + LDA (Itempl,X) ; get byte via temporary integer (addr) + TAY ; copy byte to Y + JMP LAB_1FD0 ; convert Y to byte in FAC1 and return + +; perform POKE + +LAB_POKE + JSR LAB_GADB ; get two parameters for POKE or WAIT + TXA ; copy byte argument to A + LDX #$00 ; clear index + STA (Itempl,X) ; save byte via temporary integer (addr) + RTS + +; perform DEEK() + +LAB_DEEK + JSR LAB_F2FX ; save integer part of FAC1 in temporary integer + LDX #$00 ; clear index + LDA (Itempl,X) ; PEEK low byte + TAY ; copy to Y + INC Itempl ; increment pointer low byte + BNE Deekh ; skip high increment if no rollover + + INC Itemph ; increment pointer high byte +Deekh + LDA (Itempl,X) ; PEEK high byte + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +; perform DOKE + +LAB_DOKE + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch + JSR LAB_F2FX ; convert floating-to-fixed + + STY Frnxtl ; save pointer low byte (float to fixed returns word in AY) + STA Frnxth ; save pointer high byte + + JSR LAB_1C01 ; scan for "," , else do syntax error then warm start + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch + JSR LAB_F2FX ; convert floating-to-fixed + + TYA ; copy value low byte (float to fixed returns word in AY) + LDX #$00 ; clear index + STA (Frnxtl,X) ; POKE low byte + INC Frnxtl ; increment pointer low byte + BNE Dokeh ; skip high increment if no rollover + + INC Frnxth ; increment pointer high byte +Dokeh + LDA Itemph ; get value high byte + STA (Frnxtl,X) ; POKE high byte + JMP LAB_GBYT ; scan memory and return + +; perform SWAP + +LAB_SWAP + JSR LAB_GVAR ; get var1 address + STA Lvarpl ; save var1 address low byte + STY Lvarph ; save var1 address high byte + LDA Dtypef ; get data type flag, $FF=string, $00=numeric + PHA ; save data type flag + + JSR LAB_1C01 ; scan for "," , else do syntax error then warm start + JSR LAB_GVAR ; get var2 address (pointer in Cvaral/h) + PLA ; pull var1 data type flag + EOR Dtypef ; compare with var2 data type + BPL SwapErr ; exit if not both the same type + + LDY #$03 ; four bytes to swap (either value or descriptor+1) +SwapLp + LDA (Lvarpl),Y ; get byte from var1 + TAX ; save var1 byte + LDA (Cvaral),Y ; get byte from var2 + STA (Lvarpl),Y ; save byte to var1 + TXA ; restore var1 byte + STA (Cvaral),Y ; save byte to var2 + DEY ; decrement index + BPL SwapLp ; loop until done + + RTS + +SwapErr + JMP LAB_1ABC ; do "Type mismatch" error then warm start + +; perform CALL + +LAB_CALL + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch + JSR LAB_F2FX ; convert floating-to-fixed + LDA #>CallExit ; set return address high byte + PHA ; put on stack + LDA #8 shifts) + BCC LAB_24A8 ;.go subtract mantissas + +; add 0.5 to FAC1 + +LAB_244E + LDA #LAB_2A96 ; set 0.5 pointer high byte + +; add (AY) to FAC1 + +LAB_246C + JSR LAB_264D ; unpack memory (AY) into FAC2 + +; add FAC2 to FAC1 + +LAB_ADD + BNE LAB_2474 ; branch if FAC1 was not zero + +; copy FAC2 to FAC1 + +LAB_279B + LDA FAC2_s ; get FAC2 sign (b7) + +; save FAC1 sign and copy ABS(FAC2) to FAC1 + +LAB_279D + STA FAC1_s ; save FAC1 sign (b7) + LDX #$04 ; 4 bytes to copy +LAB_27A1 + LDA FAC1_o,X ; get byte from FAC2,X + STA FAC1_e-1,X ; save byte at FAC1,X + DEX ; decrement count + BNE LAB_27A1 ; loop if not all done + + STX FAC1_r ; clear FAC1 rounding byte + RTS + + ; FAC1 is non zero +LAB_2474 + LDX FAC1_r ; get FAC1 rounding byte + STX FAC2_r ; save as FAC2 rounding byte + LDX #FAC2_e ; set index to FAC2 exponent addr + LDA FAC2_e ; get FAC2 exponent +LAB_247C + TAY ; copy exponent + BEQ LAB_244D ; exit if zero + + SEC ; set carry for subtract + SBC FAC1_e ; subtract FAC1 exponent + BEQ LAB_24A8 ; branch if = (go add mantissa) + + BCC LAB_2498 ; branch if < + + ; FAC2>FAC1 + STY FAC1_e ; save FAC1 exponent + LDY FAC2_s ; get FAC2 sign (b7) + STY FAC1_s ; save FAC1 sign (b7) + EOR #$FF ; complement A + ADC #$00 ; +1 (twos complement, carry is set) + LDY #$00 ; clear Y + STY FAC2_r ; clear FAC2 rounding byte + LDX #FAC1_e ; set index to FAC1 exponent addr + BNE LAB_249C ; branch always + +LAB_2498 + LDY #$00 ; clear Y + STY FAC1_r ; clear FAC1 rounding byte +LAB_249C + CMP #$F9 ; compare exponent diff with $F9 + BMI LAB_2467 ; branch if range $79-$F8 + + TAY ; copy exponent difference to Y + LDA FAC1_r ; get FAC1 rounding byte + LSR PLUS_1,X ; shift FAC? mantissa1 + JSR LAB_2592 ; shift FACX Y times right + + ; exponents are equal now do mantissa subtract +LAB_24A8 + BIT FAC_sc ; test sign compare (FAC1 EOR FAC2) + BPL LAB_24F8 ; if = add FAC2 mantissa to FAC1 mantissa and return + + LDY #FAC1_e ; set index to FAC1 exponent addr + CPX #FAC2_e ; compare X to FAC2 exponent addr + BEQ LAB_24B4 ; branch if = + + LDY #FAC2_e ; else set index to FAC2 exponent addr + + ; subtract smaller from bigger (take sign of bigger) +LAB_24B4 + SEC ; set carry for subtract + EOR #$FF ; ones complement A + ADC FAC2_r ; add FAC2 rounding byte + STA FAC1_r ; save FAC1 rounding byte + LDA PLUS_3,Y ; get FACY mantissa3 + SBC PLUS_3,X ; subtract FACX mantissa3 + STA FAC1_3 ; save FAC1 mantissa3 + LDA PLUS_2,Y ; get FACY mantissa2 + SBC PLUS_2,X ; subtract FACX mantissa2 + STA FAC1_2 ; save FAC1 mantissa2 + LDA PLUS_1,Y ; get FACY mantissa1 + SBC PLUS_1,X ; subtract FACX mantissa1 + STA FAC1_1 ; save FAC1 mantissa1 + +; do ABS and normalise FAC1 + +LAB_24D0 + BCS LAB_24D5 ; branch if number is +ve + + JSR LAB_2537 ; negate FAC1 + +; normalise FAC1 + +LAB_24D5 + LDY #$00 ; clear Y + TYA ; clear A + CLC ; clear carry for add +LAB_24D9 + LDX FAC1_1 ; get FAC1 mantissa1 + BNE LAB_251B ; if not zero normalise FAC1 + + LDX FAC1_2 ; get FAC1 mantissa2 + STX FAC1_1 ; save FAC1 mantissa1 + LDX FAC1_3 ; get FAC1 mantissa3 + STX FAC1_2 ; save FAC1 mantissa2 + LDX FAC1_r ; get FAC1 rounding byte + STX FAC1_3 ; save FAC1 mantissa3 + STY FAC1_r ; clear FAC1 rounding byte + ADC #$08 ; add x to exponent offset + CMP #$18 ; compare with $18 (max offset, all bits would be =0) + BNE LAB_24D9 ; loop if not max + +; clear FAC1 exponent and sign + +LAB_24F1 + LDA #$00 ; clear A +LAB_24F3 + STA FAC1_e ; set FAC1 exponent + +; save FAC1 sign + +LAB_24F5 + STA FAC1_s ; save FAC1 sign (b7) + RTS + +; add FAC2 mantissa to FAC1 mantissa + +LAB_24F8 + ADC FAC2_r ; add FAC2 rounding byte + STA FAC1_r ; save FAC1 rounding byte + LDA FAC1_3 ; get FAC1 mantissa3 + ADC FAC2_3 ; add FAC2 mantissa3 + STA FAC1_3 ; save FAC1 mantissa3 + LDA FAC1_2 ; get FAC1 mantissa2 + ADC FAC2_2 ; add FAC2 mantissa2 + STA FAC1_2 ; save FAC1 mantissa2 + LDA FAC1_1 ; get FAC1 mantissa1 + ADC FAC2_1 ; add FAC2 mantissa1 + STA FAC1_1 ; save FAC1 mantissa1 + BCS LAB_252A ; if carry then normalise FAC1 for C=1 + + RTS ; else just exit + +LAB_2511 + ADC #$01 ; add 1 to exponent offset + ASL FAC1_r ; shift FAC1 rounding byte + ROL FAC1_3 ; shift FAC1 mantissa3 + ROL FAC1_2 ; shift FAC1 mantissa2 + ROL FAC1_1 ; shift FAC1 mantissa1 + +; normalise FAC1 + +LAB_251B + BPL LAB_2511 ; loop if not normalised + + SEC ; set carry for subtract + SBC FAC1_e ; subtract FAC1 exponent + BCS LAB_24F1 ; branch if underflow (set result = $0) + + EOR #$FF ; complement exponent + ADC #$01 ; +1 (twos complement) + STA FAC1_e ; save FAC1 exponent + +; test and normalise FAC1 for C=0/1 + +LAB_2528 + BCC LAB_2536 ; exit if no overflow + +; normalise FAC1 for C=1 + +LAB_252A + INC FAC1_e ; increment FAC1 exponent + BEQ LAB_2564 ; if zero do overflow error and warm start + + ROR FAC1_1 ; shift FAC1 mantissa1 + ROR FAC1_2 ; shift FAC1 mantissa2 + ROR FAC1_3 ; shift FAC1 mantissa3 + ROR FAC1_r ; shift FAC1 rounding byte +LAB_2536 + RTS + +; negate FAC1 + +LAB_2537 + LDA FAC1_s ; get FAC1 sign (b7) + EOR #$FF ; complement it + STA FAC1_s ; save FAC1 sign (b7) + +; twos complement FAC1 mantissa + +LAB_253D + LDA FAC1_1 ; get FAC1 mantissa1 + EOR #$FF ; complement it + STA FAC1_1 ; save FAC1 mantissa1 + LDA FAC1_2 ; get FAC1 mantissa2 + EOR #$FF ; complement it + STA FAC1_2 ; save FAC1 mantissa2 + LDA FAC1_3 ; get FAC1 mantissa3 + EOR #$FF ; complement it + STA FAC1_3 ; save FAC1 mantissa3 + LDA FAC1_r ; get FAC1 rounding byte + EOR #$FF ; complement it + STA FAC1_r ; save FAC1 rounding byte + INC FAC1_r ; increment FAC1 rounding byte + BNE LAB_2563 ; exit if no overflow + +; increment FAC1 mantissa + +LAB_2559 + INC FAC1_3 ; increment FAC1 mantissa3 + BNE LAB_2563 ; finished if no rollover + + INC FAC1_2 ; increment FAC1 mantissa2 + BNE LAB_2563 ; finished if no rollover + + INC FAC1_1 ; increment FAC1 mantissa1 +LAB_2563 + RTS + +; do overflow error (overflow exit) + +LAB_2564 + LDX #$0A ; error code $0A ("Overflow" error) + JMP LAB_XERR ; do error #X, then warm start + +; shift FCAtemp << A+8 times + +LAB_2569 + LDX #FACt_1-1 ; set offset to FACtemp +LAB_256B + LDY PLUS_3,X ; get FACX mantissa3 + STY FAC1_r ; save as FAC1 rounding byte + LDY PLUS_2,X ; get FACX mantissa2 + STY PLUS_3,X ; save FACX mantissa3 + LDY PLUS_1,X ; get FACX mantissa1 + STY PLUS_2,X ; save FACX mantissa2 + LDY FAC1_o ; get FAC1 overflow byte + STY PLUS_1,X ; save FACX mantissa1 + +; shift FACX -A times right (> 8 shifts) + +LAB_257B + ADC #$08 ; add 8 to shift count + BMI LAB_256B ; go do 8 shift if still -ve + + BEQ LAB_256B ; go do 8 shift if zero + + SBC #$08 ; else subtract 8 again + TAY ; save count to Y + LDA FAC1_r ; get FAC1 rounding byte + BCS LAB_259A ;. + +LAB_2588 + ASL PLUS_1,X ; shift FACX mantissa1 + BCC LAB_258E ; branch if +ve + + INC PLUS_1,X ; this sets b7 eventually +LAB_258E + ROR PLUS_1,X ; shift FACX mantissa1 (correct for ASL) + ROR PLUS_1,X ; shift FACX mantissa1 (put carry in b7) + +; shift FACX Y times right + +LAB_2592 + ROR PLUS_2,X ; shift FACX mantissa2 + ROR PLUS_3,X ; shift FACX mantissa3 + ROR ; shift FACX rounding byte + INY ; increment exponent diff + BNE LAB_2588 ; branch if range adjust not complete + +LAB_259A + CLC ; just clear it + RTS + +; perform LOG() + +LAB_LOG + JSR LAB_27CA ; test sign and zero + BEQ LAB_25C4 ; if zero do function call error then warm start + + BPL LAB_25C7 ; skip error if +ve + +LAB_25C4 + JMP LAB_FCER ; do function call error then warm start (-ve) + +LAB_25C7 + LDA FAC1_e ; get FAC1 exponent + SBC #$7F ; normalise it + PHA ; save it + LDA #$80 ; set exponent to zero + STA FAC1_e ; save FAC1 exponent + LDA #LAB_25AD ; set 1/root2 pointer high byte + JSR LAB_246C ; add (AY) to FAC1 (1/root2) + LDA #LAB_25B1 ; set root2 pointer high byte + JSR LAB_26CA ; convert AY and do (AY)/FAC1 (root2/(x+(1/root2))) + LDA #LAB_259C ; set 1 pointer high byte + JSR LAB_2455 ; subtract (AY) from FAC1 ((root2/(x+(1/root2)))-1) + LDA #LAB_25A0 ; set pointer high byte to counter + JSR LAB_2B6E ; ^2 then series evaluation + LDA #LAB_25B5 ; set -0.5 pointer high byte + JSR LAB_246C ; add (AY) to FAC1 + PLA ; restore FAC1 exponent + JSR LAB_2912 ; evaluate new ASCII digit + LDA #LAB_25B9 ; set LOG(2) pointer high byte + +; do convert AY, FCA1*(AY) + +LAB_25FB + JSR LAB_264D ; unpack memory (AY) into FAC2 +LAB_MULTIPLY + BEQ LAB_264C ; exit if zero + + JSR LAB_2673 ; test and adjust accumulators + LDA #$00 ; clear A + STA FACt_1 ; clear temp mantissa1 + STA FACt_2 ; clear temp mantissa2 + STA FACt_3 ; clear temp mantissa3 + LDA FAC1_r ; get FAC1 rounding byte + JSR LAB_2622 ; go do shift/add FAC2 + LDA FAC1_3 ; get FAC1 mantissa3 + JSR LAB_2622 ; go do shift/add FAC2 + LDA FAC1_2 ; get FAC1 mantissa2 + JSR LAB_2622 ; go do shift/add FAC2 + LDA FAC1_1 ; get FAC1 mantissa1 + JSR LAB_2627 ; go do shift/add FAC2 + JMP LAB_273C ; copy temp to FAC1, normalise and return + +LAB_2622 + BNE LAB_2627 ; branch if byte <> zero + + JMP LAB_2569 ; shift FCAtemp << A+8 times + + ; else do shift and add +LAB_2627 + LSR ; shift byte + ORA #$80 ; set top bit (mark for 8 times) +LAB_262A + TAY ; copy result + BCC LAB_2640 ; skip next if bit was zero + + CLC ; clear carry for add + LDA FACt_3 ; get temp mantissa3 + ADC FAC2_3 ; add FAC2 mantissa3 + STA FACt_3 ; save temp mantissa3 + LDA FACt_2 ; get temp mantissa2 + ADC FAC2_2 ; add FAC2 mantissa2 + STA FACt_2 ; save temp mantissa2 + LDA FACt_1 ; get temp mantissa1 + ADC FAC2_1 ; add FAC2 mantissa1 + STA FACt_1 ; save temp mantissa1 +LAB_2640 + ROR FACt_1 ; shift temp mantissa1 + ROR FACt_2 ; shift temp mantissa2 + ROR FACt_3 ; shift temp mantissa3 + ROR FAC1_r ; shift temp rounding byte + TYA ; get byte back + LSR ; shift byte + BNE LAB_262A ; loop if all bits not done + +LAB_264C + RTS + +; unpack memory (AY) into FAC2 + +LAB_264D + STA ut1_pl ; save pointer low byte + STY ut1_ph ; save pointer high byte + LDY #$03 ; 4 bytes to get (0-3) + LDA (ut1_pl),Y ; get mantissa3 + STA FAC2_3 ; save FAC2 mantissa3 + DEY ; decrement index + LDA (ut1_pl),Y ; get mantissa2 + STA FAC2_2 ; save FAC2 mantissa2 + DEY ; decrement index + LDA (ut1_pl),Y ; get mantissa1+sign + STA FAC2_s ; save FAC2 sign (b7) + EOR FAC1_s ; EOR with FAC1 sign (b7) + STA FAC_sc ; save sign compare (FAC1 EOR FAC2) + LDA FAC2_s ; recover FAC2 sign (b7) + ORA #$80 ; set 1xxx xxx (set normal bit) + STA FAC2_1 ; save FAC2 mantissa1 + DEY ; decrement index + LDA (ut1_pl),Y ; get exponent byte + STA FAC2_e ; save FAC2 exponent + LDA FAC1_e ; get FAC1 exponent + RTS + +; test and adjust accumulators + +LAB_2673 + LDA FAC2_e ; get FAC2 exponent +LAB_2675 + BEQ LAB_2696 ; branch if FAC2 = $00 (handle underflow) + + CLC ; clear carry for add + ADC FAC1_e ; add FAC1 exponent + BCC LAB_2680 ; branch if sum of exponents <$0100 + + BMI LAB_269B ; do overflow error + + CLC ; clear carry for the add + .byte $2C ; makes next line BIT $1410 +LAB_2680 + BPL LAB_2696 ; if +ve go handle underflow + + ADC #$80 ; adjust exponent + STA FAC1_e ; save FAC1 exponent + BNE LAB_268B ; branch if not zero + + JMP LAB_24F5 ; save FAC1 sign and return + +LAB_268B + LDA FAC_sc ; get sign compare (FAC1 EOR FAC2) + STA FAC1_s ; save FAC1 sign (b7) +LAB_268F + RTS + +; handle overflow and underflow + +LAB_2690 + LDA FAC1_s ; get FAC1 sign (b7) + BPL LAB_269B ; do overflow error + + ; handle underflow +LAB_2696 + PLA ; pop return address low byte + PLA ; pop return address high byte + JMP LAB_24F1 ; clear FAC1 exponent and sign and return + +; multiply by 10 + +LAB_269E + JSR LAB_27AB ; round and copy FAC1 to FAC2 + TAX ; copy exponent (set the flags) + BEQ LAB_268F ; exit if zero + + CLC ; clear carry for add + ADC #$02 ; add two to exponent (*4) + BCS LAB_269B ; do overflow error if > $FF + + LDX #$00 ; clear byte + STX FAC_sc ; clear sign compare (FAC1 EOR FAC2) + JSR LAB_247C ; add FAC2 to FAC1 (*5) + INC FAC1_e ; increment FAC1 exponent (*10) + BNE LAB_268F ; if non zero just do RTS + +LAB_269B + JMP LAB_2564 ; do overflow error and warm start + +; divide by 10 + +LAB_26B9 + JSR LAB_27AB ; round and copy FAC1 to FAC2 + LDA #LAB_26B5 ; set pointer to 10d high addr + LDX #$00 ; clear sign + +; divide by (AY) (X=sign) + +LAB_26C2 + STX FAC_sc ; save sign compare (FAC1 EOR FAC2) + JSR LAB_UFAC ; unpack memory (AY) into FAC1 + JMP LAB_DIVIDE ; do FAC2/FAC1 + + ; Perform divide-by +; convert AY and do (AY)/FAC1 + +LAB_26CA + JSR LAB_264D ; unpack memory (AY) into FAC2 + + ; Perform divide-into +LAB_DIVIDE + BEQ LAB_2737 ; if zero go do /0 error + + JSR LAB_27BA ; round FAC1 + LDA #$00 ; clear A + SEC ; set carry for subtract + SBC FAC1_e ; subtract FAC1 exponent (2s complement) + STA FAC1_e ; save FAC1 exponent + JSR LAB_2673 ; test and adjust accumulators + INC FAC1_e ; increment FAC1 exponent + BEQ LAB_269B ; if zero do overflow error + + LDX #$FF ; set index for pre increment + LDA #$01 ; set bit to flag byte save +LAB_26E4 + LDY FAC2_1 ; get FAC2 mantissa1 + CPY FAC1_1 ; compare FAC1 mantissa1 + BNE LAB_26F4 ; branch if <> + + LDY FAC2_2 ; get FAC2 mantissa2 + CPY FAC1_2 ; compare FAC1 mantissa2 + BNE LAB_26F4 ; branch if <> + + LDY FAC2_3 ; get FAC2 mantissa3 + CPY FAC1_3 ; compare FAC1 mantissa3 +LAB_26F4 + PHP ; save FAC2-FAC1 compare status + ROL ; shift the result byte + BCC LAB_2702 ; if no carry skip the byte save + + LDY #$01 ; set bit to flag byte save + INX ; else increment the index to FACt + CPX #$02 ; compare with the index to FACt_3 + BMI LAB_2701 ; if not last byte just go save it + + BNE LAB_272B ; if all done go save FAC1 rounding byte, normalise and + ; return + + LDY #$40 ; set bit to flag byte save for the rounding byte +LAB_2701 + STA FACt_1,X ; write result byte to FACt_1 + index + TYA ; copy the next save byte flag +LAB_2702 + PLP ; restore FAC2-FAC1 compare status + BCC LAB_2704 ; if FAC2 < FAC1 then skip the subtract + + TAY ; save FAC2-FAC1 compare status + LDA FAC2_3 ; get FAC2 mantissa3 + SBC FAC1_3 ; subtract FAC1 mantissa3 + STA FAC2_3 ; save FAC2 mantissa3 + LDA FAC2_2 ; get FAC2 mantissa2 + SBC FAC1_2 ; subtract FAC1 mantissa2 + STA FAC2_2 ; save FAC2 mantissa2 + LDA FAC2_1 ; get FAC2 mantissa1 + SBC FAC1_1 ; subtract FAC1 mantissa1 + STA FAC2_1 ; save FAC2 mantissa1 + TYA ; restore FAC2-FAC1 compare status + + ; FAC2 = FAC2*2 +LAB_2704 + ASL FAC2_3 ; shift FAC2 mantissa3 + ROL FAC2_2 ; shift FAC2 mantissa2 + ROL FAC2_1 ; shift FAC2 mantissa1 + BCS LAB_26F4 ; loop with no compare + + BMI LAB_26E4 ; loop with compare + + BPL LAB_26F4 ; loop always with no compare + +; do A<<6, save as FAC1 rounding byte, normalise and return + +LAB_272B + LSR ; shift b1 - b0 .. + ROR ; .. + ROR ; .. to b7 - b6 + STA FAC1_r ; save FAC1 rounding byte + PLP ; dump FAC2-FAC1 compare status + JMP LAB_273C ; copy temp to FAC1, normalise and return + +; do "Divide by zero" error + +LAB_2737 + LDX #$14 ; error code $14 ("Divide by zero" error) + JMP LAB_XERR ; do error #X, then warm start + +; copy temp to FAC1 and normalise + +LAB_273C + LDA FACt_1 ; get temp mantissa1 + STA FAC1_1 ; save FAC1 mantissa1 + LDA FACt_2 ; get temp mantissa2 + STA FAC1_2 ; save FAC1 mantissa2 + LDA FACt_3 ; get temp mantissa3 + STA FAC1_3 ; save FAC1 mantissa3 + JMP LAB_24D5 ; normalise FAC1 and return + +; unpack memory (AY) into FAC1 + +LAB_UFAC + STA ut1_pl ; save pointer low byte + STY ut1_ph ; save pointer high byte + LDY #$03 ; 4 bytes to do + LDA (ut1_pl),Y ; get last byte + STA FAC1_3 ; save FAC1 mantissa3 + DEY ; decrement index + LDA (ut1_pl),Y ; get last-1 byte + STA FAC1_2 ; save FAC1 mantissa2 + DEY ; decrement index + LDA (ut1_pl),Y ; get second byte + STA FAC1_s ; save FAC1 sign (b7) + ORA #$80 ; set 1xxx xxxx (add normal bit) + STA FAC1_1 ; save FAC1 mantissa1 + DEY ; decrement index + LDA (ut1_pl),Y ; get first byte (exponent) + STA FAC1_e ; save FAC1 exponent + STY FAC1_r ; clear FAC1 rounding byte + RTS + +; pack FAC1 into Adatal + +LAB_276E + LDX #Adatal ; set pointer high byte + BEQ LAB_2778 ; pack FAC1 into (XY) and return + +; pack FAC1 into (Lvarpl) + +LAB_PFAC + LDX Lvarpl ; get destination pointer low byte + LDY Lvarph ; get destination pointer high byte + +; pack FAC1 into (XY) + +LAB_2778 + JSR LAB_27BA ; round FAC1 + STX ut1_pl ; save pointer low byte + STY ut1_ph ; save pointer high byte + LDY #$03 ; set index + LDA FAC1_3 ; get FAC1 mantissa3 + STA (ut1_pl),Y ; store in destination + DEY ; decrement index + LDA FAC1_2 ; get FAC1 mantissa2 + STA (ut1_pl),Y ; store in destination + DEY ; decrement index + LDA FAC1_s ; get FAC1 sign (b7) + ORA #$7F ; set bits x111 1111 + AND FAC1_1 ; AND in FAC1 mantissa1 + STA (ut1_pl),Y ; store in destination + DEY ; decrement index + LDA FAC1_e ; get FAC1 exponent + STA (ut1_pl),Y ; store in destination + STY FAC1_r ; clear FAC1 rounding byte + RTS + +; round and copy FAC1 to FAC2 + +LAB_27AB + JSR LAB_27BA ; round FAC1 + +; copy FAC1 to FAC2 + +LAB_27AE + LDX #$05 ; 5 bytes to copy +LAB_27B0 + LDA FAC1_e-1,X ; get byte from FAC1,X + STA FAC1_o,X ; save byte at FAC2,X + DEX ; decrement count + BNE LAB_27B0 ; loop if not all done + + STX FAC1_r ; clear FAC1 rounding byte +LAB_27B9 + RTS + +; round FAC1 + +LAB_27BA + LDA FAC1_e ; get FAC1 exponent + BEQ LAB_27B9 ; exit if zero + + ASL FAC1_r ; shift FAC1 rounding byte + BCC LAB_27B9 ; exit if no overflow + +; round FAC1 (no check) + +LAB_27C2 + JSR LAB_2559 ; increment FAC1 mantissa + BNE LAB_27B9 ; branch if no overflow + + JMP LAB_252A ; normalise FAC1 for C=1 and return + +; get FAC1 sign +; return A=FF,C=1/-ve A=01,C=0/+ve + +LAB_27CA + LDA FAC1_e ; get FAC1 exponent + BEQ LAB_27D7 ; exit if zero (already correct SGN(0)=0) + +; return A=FF,C=1/-ve A=01,C=0/+ve +; no = 0 check + +LAB_27CE + LDA FAC1_s ; else get FAC1 sign (b7) + +; return A=FF,C=1/-ve A=01,C=0/+ve +; no = 0 check, sign in A + +LAB_27D0 + ROL ; move sign bit to carry + LDA #$FF ; set byte for -ve result + BCS LAB_27D7 ; return if sign was set (-ve) + + LDA #$01 ; else set byte for +ve result +LAB_27D7 + RTS + +; perform SGN() + +LAB_SGN + JSR LAB_27CA ; get FAC1 sign + ; return A=$FF/-ve A=$01/+ve +; save A as integer byte + +LAB_27DB + STA FAC1_1 ; save FAC1 mantissa1 + LDA #$00 ; clear A + STA FAC1_2 ; clear FAC1 mantissa2 + LDX #$88 ; set exponent + +; set exp=X, clearFAC1 mantissa3 and normalise + +LAB_27E3 + LDA FAC1_1 ; get FAC1 mantissa1 + EOR #$FF ; complement it + ROL ; sign bit into carry + +; set exp=X, clearFAC1 mantissa3 and normalise + +LAB_STFA + LDA #$00 ; clear A + STA FAC1_3 ; clear FAC1 mantissa3 + STX FAC1_e ; set FAC1 exponent + STA FAC1_r ; clear FAC1 rounding byte + STA FAC1_s ; clear FAC1 sign (b7) + JMP LAB_24D0 ; do ABS and normalise FAC1 + +; perform ABS() + +LAB_ABS + LSR FAC1_s ; clear FAC1 sign (put zero in b7) + RTS + +; compare FAC1 with (AY) +; returns A=$00 if FAC1 = (AY) +; returns A=$01 if FAC1 > (AY) +; returns A=$FF if FAC1 < (AY) + +LAB_27F8 + STA ut2_pl ; save pointer low byte +LAB_27FA + STY ut2_ph ; save pointer high byte + LDY #$00 ; clear index + LDA (ut2_pl),Y ; get exponent + INY ; increment index + TAX ; copy (AY) exponent to X + BEQ LAB_27CA ; branch if (AY) exponent=0 and get FAC1 sign + ; A=FF,C=1/-ve A=01,C=0/+ve + + LDA (ut2_pl),Y ; get (AY) mantissa1 (with sign) + EOR FAC1_s ; EOR FAC1 sign (b7) + BMI LAB_27CE ; if signs <> do return A=FF,C=1/-ve + ; A=01,C=0/+ve and return + + CPX FAC1_e ; compare (AY) exponent with FAC1 exponent + BNE LAB_2828 ; branch if different + + LDA (ut2_pl),Y ; get (AY) mantissa1 (with sign) + ORA #$80 ; normalise top bit + CMP FAC1_1 ; compare with FAC1 mantissa1 + BNE LAB_2828 ; branch if different + + INY ; increment index + LDA (ut2_pl),Y ; get mantissa2 + CMP FAC1_2 ; compare with FAC1 mantissa2 + BNE LAB_2828 ; branch if different + + INY ; increment index + LDA #$7F ; set for 1/2 value rounding byte + CMP FAC1_r ; compare with FAC1 rounding byte (set carry) + LDA (ut2_pl),Y ; get mantissa3 + SBC FAC1_3 ; subtract FAC1 mantissa3 + BEQ LAB_2850 ; exit if mantissa3 equal + +; gets here if number <> FAC1 + +LAB_2828 + LDA FAC1_s ; get FAC1 sign (b7) + BCC LAB_282E ; branch if FAC1 > (AY) + + EOR #$FF ; else toggle FAC1 sign +LAB_282E + JMP LAB_27D0 ; return A=FF,C=1/-ve A=01,C=0/+ve + +; convert FAC1 floating-to-fixed + +LAB_2831 + LDA FAC1_e ; get FAC1 exponent + BEQ LAB_287F ; if zero go clear FAC1 and return + + SEC ; set carry for subtract + SBC #$98 ; subtract maximum integer range exponent + BIT FAC1_s ; test FAC1 sign (b7) + BPL LAB_2845 ; branch if FAC1 +ve + + ; FAC1 was -ve + TAX ; copy subtracted exponent + LDA #$FF ; overflow for -ve number + STA FAC1_o ; set FAC1 overflow byte + JSR LAB_253D ; twos complement FAC1 mantissa + TXA ; restore subtracted exponent +LAB_2845 + LDX #FAC1_e ; set index to FAC1 + CMP #$F9 ; compare exponent result + BPL LAB_2851 ; if < 8 shifts shift FAC1 A times right and return + + JSR LAB_257B ; shift FAC1 A times right (> 8 shifts) + STY FAC1_o ; clear FAC1 overflow byte +LAB_2850 + RTS + +; shift FAC1 A times right + +LAB_2851 + TAY ; copy shift count + LDA FAC1_s ; get FAC1 sign (b7) + AND #$80 ; mask sign bit only (x000 0000) + LSR FAC1_1 ; shift FAC1 mantissa1 + ORA FAC1_1 ; OR sign in b7 FAC1 mantissa1 + STA FAC1_1 ; save FAC1 mantissa1 + JSR LAB_2592 ; shift FAC1 Y times right + STY FAC1_o ; clear FAC1 overflow byte + RTS + +; perform INT() + +LAB_INT + LDA FAC1_e ; get FAC1 exponent + CMP #$98 ; compare with max int + BCS LAB_2886 ; exit if >= (already int, too big for fractional part!) + + JSR LAB_2831 ; convert FAC1 floating-to-fixed + STY FAC1_r ; save FAC1 rounding byte + LDA FAC1_s ; get FAC1 sign (b7) + STY FAC1_s ; save FAC1 sign (b7) + EOR #$80 ; toggle FAC1 sign + ROL ; shift into carry + LDA #$98 ; set new exponent + STA FAC1_e ; save FAC1 exponent + LDA FAC1_3 ; get FAC1 mantissa3 + STA Temp3 ; save for EXP() function + JMP LAB_24D0 ; do ABS and normalise FAC1 + +; clear FAC1 and return + +LAB_287F + STA FAC1_1 ; clear FAC1 mantissa1 + STA FAC1_2 ; clear FAC1 mantissa2 + STA FAC1_3 ; clear FAC1 mantissa3 + TAY ; clear Y +LAB_2886 + RTS + +; get FAC1 from string +; this routine now handles hex and binary values from strings +; starting with "$" and "%" respectively + +LAB_2887 + LDY #$00 ; clear Y + STY Dtypef ; clear data type flag, $FF=string, $00=numeric + LDX #$09 ; set index +LAB_288B + STY numexp,X ; clear byte + DEX ; decrement index + BPL LAB_288B ; loop until numexp to negnum (and FAC1) = $00 + + BCC LAB_28FE ; branch if 1st character numeric + +; get FAC1 from string .. first character wasn't numeric + + CMP #'-' ; else compare with "-" + BNE LAB_289A ; branch if not "-" + + STX negnum ; set flag for -ve number (X = $FF) + BEQ LAB_289C ; branch always (go scan and check for hex/bin) + +; get FAC1 from string .. first character wasn't numeric or - + +LAB_289A + CMP #'+' ; else compare with "+" + BNE LAB_289D ; branch if not "+" (go check for hex/bin) + +; was "+" or "-" to start, so get next character + +LAB_289C + JSR LAB_IGBY ; increment and scan memory + BCC LAB_28FE ; branch if numeric character + +; code here for hex and binary numbers + +LAB_289D + CMP #'$' ; else compare with "$" + BNE LAB_NHEX ; branch if not "$" + + JMP LAB_CHEX ; branch if "$" + +LAB_NHEX + CMP #'%' ; else compare with "%" + BNE LAB_28A3 ; branch if not "%" (continue original code) + + JMP LAB_CBIN ; branch if "%" + +LAB_289E + JSR LAB_IGBY ; increment and scan memory (ignore + or get next number) +LAB_28A1 + BCC LAB_28FE ; branch if numeric character + +; get FAC1 from string .. character wasn't numeric, -, +, hex or binary + +LAB_28A3 + CMP #'.' ; else compare with "." + BEQ LAB_28D5 ; branch if "." + +; get FAC1 from string .. character wasn't numeric, -, + or . + + CMP #'E' ; else compare with "E" + BNE LAB_28DB ; branch if not "E" + + ; was "E" so evaluate exponential part + JSR LAB_IGBY ; increment and scan memory + BCC LAB_28C7 ; branch if numeric character + + CMP #TK_MINUS ; else compare with token for - + BEQ LAB_28C2 ; branch if token for - + + CMP #'-' ; else compare with "-" + BEQ LAB_28C2 ; branch if "-" + + CMP #TK_PLUS ; else compare with token for + + BEQ LAB_28C4 ; branch if token for + + + CMP #'+' ; else compare with "+" + BEQ LAB_28C4 ; branch if "+" + + BNE LAB_28C9 ; branch always + +LAB_28C2 + ROR expneg ; set exponent -ve flag (C, which=1, into b7) +LAB_28C4 + JSR LAB_IGBY ; increment and scan memory +LAB_28C7 + BCC LAB_2925 ; branch if numeric character + +LAB_28C9 + BIT expneg ; test exponent -ve flag + BPL LAB_28DB ; if +ve go evaluate exponent + + ; else do exponent = -exponent + LDA #$00 ; clear result + SEC ; set carry for subtract + SBC expcnt ; subtract exponent byte + JMP LAB_28DD ; go evaluate exponent + +LAB_28D5 + ROR numdpf ; set decimal point flag + BIT numdpf ; test decimal point flag + BVC LAB_289E ; branch if only one decimal point so far + + ; evaluate exponent +LAB_28DB + LDA expcnt ; get exponent count byte +LAB_28DD + SEC ; set carry for subtract + SBC numexp ; subtract numerator exponent + STA expcnt ; save exponent count byte + BEQ LAB_28F6 ; branch if no adjustment + + BPL LAB_28EF ; else if +ve go do FAC1*10^expcnt + + ; else go do FAC1/10^(0-expcnt) +LAB_28E6 + JSR LAB_26B9 ; divide by 10 + INC expcnt ; increment exponent count byte + BNE LAB_28E6 ; loop until all done + + BEQ LAB_28F6 ; branch always + +LAB_28EF + JSR LAB_269E ; multiply by 10 + DEC expcnt ; decrement exponent count byte + BNE LAB_28EF ; loop until all done + +LAB_28F6 + LDA negnum ; get -ve flag + BMI LAB_28FB ; if -ve do - FAC1 and return + + RTS + +; do - FAC1 and return + +LAB_28FB + JMP LAB_GTHAN ; do - FAC1 and return + +; do unsigned FAC1*10+number + +LAB_28FE + PHA ; save character + BIT numdpf ; test decimal point flag + BPL LAB_2905 ; skip exponent increment if not set + + INC numexp ; else increment number exponent +LAB_2905 + JSR LAB_269E ; multiply FAC1 by 10 + PLA ; restore character + AND #$0F ; convert to binary + JSR LAB_2912 ; evaluate new ASCII digit + JMP LAB_289E ; go do next character + +; evaluate new ASCII digit + +LAB_2912 + PHA ; save digit + JSR LAB_27AB ; round and copy FAC1 to FAC2 + PLA ; restore digit + JSR LAB_27DB ; save A as integer byte + LDA FAC2_s ; get FAC2 sign (b7) + EOR FAC1_s ; toggle with FAC1 sign (b7) + STA FAC_sc ; save sign compare (FAC1 EOR FAC2) + LDX FAC1_e ; get FAC1 exponent + JMP LAB_ADD ; add FAC2 to FAC1 and return + +; evaluate next character of exponential part of number + +LAB_2925 + LDA expcnt ; get exponent count byte + CMP #$0A ; compare with 10 decimal + BCC LAB_2934 ; branch if less + + LDA #$64 ; make all -ve exponents = -100 decimal (causes underflow) + BIT expneg ; test exponent -ve flag + BMI LAB_2942 ; branch if -ve + + JMP LAB_2564 ; else do overflow error + +LAB_2934 + ASL ; * 2 + ASL ; * 4 + ADC expcnt ; * 5 + ASL ; * 10 + LDY #$00 ; set index + ADC (Bpntrl),Y ; add character (will be $30 too much!) + SBC #'0'-1 ; convert character to binary +LAB_2942 + STA expcnt ; save exponent count byte + JMP LAB_28C4 ; go get next character + +; print " in line [LINE #]" + +LAB_2953 + LDA #LAB_LMSG ; point to " in line " message high byte + JSR LAB_18C3 ; print null terminated string from memory + + ; print Basic line # + LDA Clineh ; get current line high byte + LDX Clinel ; get current line low byte + +; print XA as unsigned integer + +LAB_295E + STA FAC1_1 ; save low byte as FAC1 mantissa1 + STX FAC1_2 ; save high byte as FAC1 mantissa2 + LDX #$90 ; set exponent to 16d bits + SEC ; set integer is +ve flag + JSR LAB_STFA ; set exp=X, clearFAC1 mantissa3 and normalise + LDY #$00 ; clear index + TYA ; clear A + JSR LAB_297B ; convert FAC1 to string, skip sign character save + JMP LAB_18C3 ; print null terminated string from memory and return + +; convert FAC1 to ASCII string result in (AY) +; not any more, moved scratchpad to page 0 + +LAB_296E + LDY #$01 ; set index = 1 + LDA #$20 ; character = " " (assume +ve) + BIT FAC1_s ; test FAC1 sign (b7) + BPL LAB_2978 ; branch if +ve + + LDA #$2D ; else character = "-" +LAB_2978 + STA Decss,Y ; save leading character (" " or "-") +LAB_297B + STA FAC1_s ; clear FAC1 sign (b7) + STY Sendl ; save index + INY ; increment index + LDX FAC1_e ; get FAC1 exponent + BNE LAB_2989 ; branch if FAC1<>0 + + ; exponent was $00 so FAC1 is 0 + LDA #'0' ; set character = "0" + JMP LAB_2A89 ; save last character, [EOT] and exit + + ; FAC1 is some non zero value +LAB_2989 + LDA #$00 ; clear (number exponent count) + CPX #$81 ; compare FAC1 exponent with $81 (>1.00000) + + BCS LAB_299A ; branch if FAC1=>1 + + ; FAC1<1 + LDA #LAB_294F ; set pointer high byte to 1,000,000 + JSR LAB_25FB ; do convert AY, FCA1*(AY) + LDA #$FA ; set number exponent count (-6) +LAB_299A + STA numexp ; save number exponent count +LAB_299C + LDA #LAB_294B ; set pointer high byte to 999999.4375 + JSR LAB_27F8 ; compare FAC1 with (AY) + BEQ LAB_29C3 ; exit if FAC1 = (AY) + + BPL LAB_29B9 ; go do /10 if FAC1 > (AY) + + ; FAC1 < (AY) +LAB_29A7 + LDA #LAB_2947 ; set pointer high byte to 99999.9375 + JSR LAB_27F8 ; compare FAC1 with (AY) + BEQ LAB_29B2 ; branch if FAC1 = (AY) (allow decimal places) + + BPL LAB_29C0 ; branch if FAC1 > (AY) (no decimal places) + + ; FAC1 <= (AY) +LAB_29B2 + JSR LAB_269E ; multiply by 10 + DEC numexp ; decrement number exponent count + BNE LAB_29A7 ; go test again (branch always) + +LAB_29B9 + JSR LAB_26B9 ; divide by 10 + INC numexp ; increment number exponent count + BNE LAB_299C ; go test again (branch always) + +; now we have just the digits to do + +LAB_29C0 + JSR LAB_244E ; add 0.5 to FAC1 (round FAC1) +LAB_29C3 + JSR LAB_2831 ; convert FAC1 floating-to-fixed + LDX #$01 ; set default digits before dp = 1 + LDA numexp ; get number exponent count + CLC ; clear carry for add + ADC #$07 ; up to 6 digits before point + BMI LAB_29D8 ; if -ve then 1 digit before dp + + CMP #$08 ; A>=8 if n>=1E6 + BCS LAB_29D9 ; branch if >= $08 + + ; carry is clear + ADC #$FF ; take 1 from digit count + TAX ; copy to A + LDA #$02 ;.set exponent adjust +LAB_29D8 + SEC ; set carry for subtract +LAB_29D9 + SBC #$02 ; -2 + STA expcnt ;.save exponent adjust + STX numexp ; save digits before dp count + TXA ; copy to A + BEQ LAB_29E4 ; branch if no digits before dp + + BPL LAB_29F7 ; branch if digits before dp + +LAB_29E4 + LDY Sendl ; get output string index + LDA #$2E ; character "." + INY ; increment index + STA Decss,Y ; save to output string + TXA ;. + BEQ LAB_29F5 ;. + + LDA #'0' ; character "0" + INY ; increment index + STA Decss,Y ; save to output string +LAB_29F5 + STY Sendl ; save output string index +LAB_29F7 + LDY #$00 ; clear index (point to 100,000) + LDX #$80 ; +LAB_29FB + LDA FAC1_3 ; get FAC1 mantissa3 + CLC ; clear carry for add + ADC LAB_2A9C,Y ; add -ve LSB + STA FAC1_3 ; save FAC1 mantissa3 + LDA FAC1_2 ; get FAC1 mantissa2 + ADC LAB_2A9B,Y ; add -ve NMSB + STA FAC1_2 ; save FAC1 mantissa2 + LDA FAC1_1 ; get FAC1 mantissa1 + ADC LAB_2A9A,Y ; add -ve MSB + STA FAC1_1 ; save FAC1 mantissa1 + INX ; + BCS LAB_2A18 ; + + BPL LAB_29FB ; not -ve so try again + + BMI LAB_2A1A ; + +LAB_2A18 + BMI LAB_29FB ; + +LAB_2A1A + TXA ; + BCC LAB_2A21 ; + + EOR #$FF ; + ADC #$0A ; +LAB_2A21 + ADC #'0'-1 ; add "0"-1 to result + INY ; increment index .. + INY ; .. to next less .. + INY ; .. power of ten + STY Cvaral ; save as current var address low byte + LDY Sendl ; get output string index + INY ; increment output string index + TAX ; copy character to X + AND #$7F ; mask out top bit + STA Decss,Y ; save to output string + DEC numexp ; decrement # of characters before the dp + BNE LAB_2A3B ; branch if still characters to do + + ; else output the point + LDA #$2E ; character "." + INY ; increment output string index + STA Decss,Y ; save to output string +LAB_2A3B + STY Sendl ; save output string index + LDY Cvaral ; get current var address low byte + TXA ; get character back + EOR #$FF ; + AND #$80 ; + TAX ; + CPY #$12 ; compare index with max + BNE LAB_29FB ; loop if not max + + ; now remove trailing zeroes + LDY Sendl ; get output string index +LAB_2A4B + LDA Decss,Y ; get character from output string + DEY ; decrement output string index + CMP #'0' ; compare with "0" + BEQ LAB_2A4B ; loop until non "0" character found + + CMP #'.' ; compare with "." + BEQ LAB_2A58 ; branch if was dp + + ; restore last character + INY ; increment output string index +LAB_2A58 + LDA #$2B ; character "+" + LDX expcnt ; get exponent count + BEQ LAB_2A8C ; if zero go set null terminator and exit + + ; exponent isn't zero so write exponent + BPL LAB_2A68 ; branch if exponent count +ve + + LDA #$00 ; clear A + SEC ; set carry for subtract + SBC expcnt ; subtract exponent count adjust (convert -ve to +ve) + TAX ; copy exponent count to X + LDA #'-' ; character "-" +LAB_2A68 + STA Decss+2,Y ; save to output string + LDA #$45 ; character "E" + STA Decss+1,Y ; save exponent sign to output string + TXA ; get exponent count back + LDX #'0'-1 ; one less than "0" character + SEC ; set carry for subtract +LAB_2A74 + INX ; increment 10's character + SBC #$0A ;.subtract 10 from exponent count + BCS LAB_2A74 ; loop while still >= 0 + + ADC #':' ; add character ":" ($30+$0A, result is 10 less that value) + STA Decss+4,Y ; save to output string + TXA ; copy 10's character + STA Decss+3,Y ; save to output string + LDA #$00 ; set null terminator + STA Decss+5,Y ; save to output string + BEQ LAB_2A91 ; go set string pointer (AY) and exit (branch always) + + ; save last character, [EOT] and exit +LAB_2A89 + STA Decss,Y ; save last character to output string + + ; set null terminator and exit +LAB_2A8C + LDA #$00 ; set null terminator + STA Decss+1,Y ; save after last character + + ; set string pointer (AY) and exit +LAB_2A91 + LDA #Decssp1 ; set result string high pointer + RTS + +; perform power function + +LAB_POWER + BEQ LAB_EXP ; go do EXP() + + LDA FAC2_e ; get FAC2 exponent + BNE LAB_2ABF ; branch if FAC2<>0 + + JMP LAB_24F3 ; clear FAC1 exponent and sign and return + +LAB_2ABF + LDX #func_l ; set destination pointer high byte + JSR LAB_2778 ; pack FAC1 into (XY) + LDA FAC2_s ; get FAC2 sign (b7) + BPL LAB_2AD9 ; branch if FAC2>0 + + ; else FAC2 is -ve and can only be raised to an + ; integer power which gives an x +j0 result + JSR LAB_INT ; perform INT + LDA #func_l ; set source pointer high byte + JSR LAB_27F8 ; compare FAC1 with (AY) + BNE LAB_2AD9 ; branch if FAC1 <> (AY) to allow Function Call error + ; this will leave FAC1 -ve and cause a Function Call + ; error when LOG() is called + + TYA ; clear sign b7 + LDY Temp3 ; save mantissa 3 from INT() function as sign in Y + ; for possible later negation, b0 +LAB_2AD9 + JSR LAB_279D ; save FAC1 sign and copy ABS(FAC2) to FAC1 + TYA ; copy sign back .. + PHA ; .. and save it + JSR LAB_LOG ; do LOG(n) + LDA #garb_l ; set pointer high byte + JSR LAB_25FB ; do convert AY, FCA1*(AY) (square the value) + JSR LAB_EXP ; go do EXP(n) + PLA ; pull sign from stack + LSR ; b0 is to be tested, shift to Cb + BCC LAB_2AF9 ; if no bit then exit + + ; Perform negation +; do - FAC1 + +LAB_GTHAN + LDA FAC1_e ; get FAC1 exponent + BEQ LAB_2AF9 ; exit if FAC1_e = $00 + + LDA FAC1_s ; get FAC1 sign (b7) + EOR #$FF ; complement it + STA FAC1_s ; save FAC1 sign (b7) +LAB_2AF9 + RTS + +; perform EXP() (x^e) + +LAB_EXP + LDA #LAB_2AFA ; set 1.443 pointer high byte + JSR LAB_25FB ; do convert AY, FCA1*(AY) + LDA FAC1_r ; get FAC1 rounding byte + ADC #$50 ; +$50/$100 + BCC LAB_2B2B ; skip rounding if no carry + + JSR LAB_27C2 ; round FAC1 (no check) +LAB_2B2B + STA FAC2_r ; save FAC2 rounding byte + JSR LAB_27AE ; copy FAC1 to FAC2 + LDA FAC1_e ; get FAC1 exponent + CMP #$88 ; compare with EXP limit (256d) + BCC LAB_2B39 ; branch if less + +LAB_2B36 + JSR LAB_2690 ; handle overflow and underflow +LAB_2B39 + JSR LAB_INT ; perform INT + LDA Temp3 ; get mantissa 3 from INT() function + CLC ; clear carry for add + ADC #$81 ; normalise +1 + BEQ LAB_2B36 ; if $00 go handle overflow + + SEC ; set carry for subtract + SBC #$01 ; now correct for exponent + PHA ; save FAC2 exponent + + ; swap FAC1 and FAC2 + LDX #$04 ; 4 bytes to do +LAB_2B49 + LDA FAC2_e,X ; get FAC2,X + LDY FAC1_e,X ; get FAC1,X + STA FAC1_e,X ; save FAC1,X + STY FAC2_e,X ; save FAC2,X + DEX ; decrement count/index + BPL LAB_2B49 ; loop if not all done + + LDA FAC2_r ; get FAC2 rounding byte + STA FAC1_r ; save as FAC1 rounding byte + JSR LAB_SUBTRACT ; perform subtraction, FAC2 from FAC1 + JSR LAB_GTHAN ; do - FAC1 + LDA #LAB_2AFE ; set counter pointer high byte + JSR LAB_2B84 ; go do series evaluation + LDA #$00 ; clear A + STA FAC_sc ; clear sign compare (FAC1 EOR FAC2) + PLA ;.get saved FAC2 exponent + JMP LAB_2675 ; test and adjust accumulators and return + +; ^2 then series evaluation + +LAB_2B6E + STA Cptrl ; save count pointer low byte + STY Cptrh ; save count pointer high byte + JSR LAB_276E ; pack FAC1 into Adatal + LDA #Adatal ; pointer to original # high byte + JMP LAB_25FB ; do convert AY, FCA1*(AY) and return + +; series evaluation + +LAB_2B84 + STA Cptrl ; save count pointer low byte + STY Cptrh ; save count pointer high byte +LAB_2B88 + LDX #numexp ; set pointer high byte to partial @ numexp + DEC numcon ; decrement constants count + BNE LAB_2B9B ; loop until all done + + RTS + +; RND(n), 32 bit Galoise version. make n=0 for 19th next number in sequence or n<>0 +; to get 19th next number in sequence after seed n. This version of the PRNG uses +; the Galois method and a sample of 65536 bytes produced gives the following values. + +; Entropy = 7.997442 bits per byte +; Optimum compression would reduce these 65536 bytes by 0 percent + +; Chi square distribution for 65536 samples is 232.01, and +; randomly would exceed this value 75.00 percent of the time + +; Arithmetic mean value of data bytes is 127.6724, 127.5 would be random +; Monte Carlo value for Pi is 3.122871269, error 0.60 percent +; Serial correlation coefficient is -0.000370, totally uncorrelated would be 0.0 + +LAB_RND + LDA FAC1_e ; get FAC1 exponent + BEQ NextPRN ; do next random # if zero + + ; else get seed into random number store + LDX #Rbyte4 ; set PRNG pointer low byte + LDY #$00 ; set PRNG pointer high byte + JSR LAB_2778 ; pack FAC1 into (XY) +NextPRN + LDX #$AF ; set EOR byte + LDY #$13 ; do this nineteen times +LoopPRN + ASL Rbyte1 ; shift PRNG most significant byte + ROL Rbyte2 ; shift PRNG middle byte + ROL Rbyte3 ; shift PRNG least significant byte + ROL Rbyte4 ; shift PRNG extra byte + BCC Ninc1 ; branch if bit 32 clear + + TXA ; set EOR byte + EOR Rbyte1 ; EOR PRNG extra byte + STA Rbyte1 ; save new PRNG extra byte +Ninc1 + DEY ; decrement loop count + BNE LoopPRN ; loop if not all done + + LDX #$02 ; three bytes to copy +CopyPRNG + LDA Rbyte1,X ; get PRNG byte + STA FAC1_1,X ; save FAC1 byte + DEX + BPL CopyPRNG ; loop if not complete + + LDA #$80 ; set the exponent + STA FAC1_e ; save FAC1 exponent + + ASL ; clear A + STA FAC1_s ; save FAC1 sign + + JMP LAB_24D5 ; normalise FAC1 and return + +; perform COS() + +LAB_COS + LDA #LAB_2C78 ; set (pi/2) pointer high byte + JSR LAB_246C ; add (AY) to FAC1 + +; perform SIN() + +LAB_SIN + JSR LAB_27AB ; round and copy FAC1 to FAC2 + LDA #LAB_2C7C ; set (2*pi) pointer high byte + LDX FAC2_s ; get FAC2 sign (b7) + JSR LAB_26C2 ; divide by (AY) (X=sign) + JSR LAB_27AB ; round and copy FAC1 to FAC2 + JSR LAB_INT ; perform INT + LDA #$00 ; clear byte + STA FAC_sc ; clear sign compare (FAC1 EOR FAC2) + JSR LAB_SUBTRACT ; perform subtraction, FAC2 from FAC1 + LDA #LAB_2C80 ; set 0.25 pointer high byte + JSR LAB_2455 ; perform subtraction, (AY) from FAC1 + LDA FAC1_s ; get FAC1 sign (b7) + PHA ; save FAC1 sign + BPL LAB_2C35 ; branch if +ve + + ; FAC1 sign was -ve + JSR LAB_244E ; add 0.5 to FAC1 + LDA FAC1_s ; get FAC1 sign (b7) + BMI LAB_2C38 ; branch if -ve + + LDA Cflag ; get comparison evaluation flag + EOR #$FF ; toggle flag + STA Cflag ; save comparison evaluation flag +LAB_2C35 + JSR LAB_GTHAN ; do - FAC1 +LAB_2C38 + LDA #LAB_2C80 ; set 0.25 pointer high byte + JSR LAB_246C ; add (AY) to FAC1 + PLA ; restore FAC1 sign + BPL LAB_2C45 ; branch if was +ve + + ; else correct FAC1 + JSR LAB_GTHAN ; do - FAC1 +LAB_2C45 + LDA #LAB_2C84 ; set pointer high byte to counter + JMP LAB_2B6E ; ^2 then series evaluation and return + +; perform TAN() + +LAB_TAN + JSR LAB_276E ; pack FAC1 into Adatal + LDA #$00 ; clear byte + STA Cflag ; clear comparison evaluation flag + JSR LAB_SIN ; go do SIN(n) + LDX #func_l ; set sin(n) pointer high byte + JSR LAB_2778 ; pack FAC1 into (XY) + LDA #Adatal ; set n pointer high addr + JSR LAB_UFAC ; unpack memory (AY) into FAC1 + LDA #$00 ; clear byte + STA FAC1_s ; clear FAC1 sign (b7) + LDA Cflag ; get comparison evaluation flag + JSR LAB_2C74 ; save flag and go do series evaluation + + LDA #func_l ; set sin(n) pointer high byte + JMP LAB_26CA ; convert AY and do (AY)/FAC1 + +LAB_2C74 + PHA ; save comparison evaluation flag + JMP LAB_2C35 ; go do series evaluation + +; perform USR() + +LAB_USR + JSR Usrjmp ; call user code + JMP LAB_1BFB ; scan for ")", else do syntax error then warm start + +; perform ATN() + +LAB_ATN + LDA FAC1_s ; get FAC1 sign (b7) + PHA ; save sign + BPL LAB_2CA1 ; branch if +ve + + JSR LAB_GTHAN ; else do - FAC1 +LAB_2CA1 + LDA FAC1_e ; get FAC1 exponent + PHA ; push exponent + CMP #$81 ; compare with 1 + BCC LAB_2CAF ; branch if FAC1<1 + + LDA #LAB_259C ; set 1 pointer high byte + JSR LAB_26CA ; convert AY and do (AY)/FAC1 +LAB_2CAF + LDA #LAB_2CC9 ; set pointer high byte to counter + JSR LAB_2B6E ; ^2 then series evaluation + PLA ; restore old FAC1 exponent + CMP #$81 ; compare with 1 + BCC LAB_2CC2 ; branch if FAC1<1 + + LDA #LAB_2C78 ; set (pi/2) pointer high byte + JSR LAB_2455 ; perform subtraction, (AY) from FAC1 +LAB_2CC2 + PLA ; restore FAC1 sign + BPL LAB_2D04 ; exit if was +ve + + JMP LAB_GTHAN ; else do - FAC1 and return + +; perform BITSET + +LAB_BITSET + JSR LAB_GADB ; get two parameters for POKE or WAIT + CPX #$08 ; only 0 to 7 are allowed + BCS FCError ; branch if > 7 + + LDA #$00 ; clear A + SEC ; set the carry +S_Bits + ROL ; shift bit + DEX ; decrement bit number + BPL S_Bits ; loop if still +ve + + INX ; make X = $00 + ORA (Itempl,X) ; or with byte via temporary integer (addr) + STA (Itempl,X) ; save byte via temporary integer (addr) +LAB_2D04 + RTS + +; perform BITCLR + +LAB_BITCLR + JSR LAB_GADB ; get two parameters for POKE or WAIT + CPX #$08 ; only 0 to 7 are allowed + BCS FCError ; branch if > 7 + + LDA #$FF ; set A +S_Bitc + ROL ; shift bit + DEX ; decrement bit number + BPL S_Bitc ; loop if still +ve + + INX ; make X = $00 + AND (Itempl,X) ; and with byte via temporary integer (addr) + STA (Itempl,X) ; save byte via temporary integer (addr) + RTS + +FCError + JMP LAB_FCER ; do function call error then warm start + +; perform BITTST() + +LAB_BTST + JSR LAB_IGBY ; increment BASIC pointer + JSR LAB_GADB ; get two parameters for POKE or WAIT + CPX #$08 ; only 0 to 7 are allowed + BCS FCError ; branch if > 7 + + JSR LAB_GBYT ; get next BASIC byte + CMP #')' ; is next character ")" + BEQ TST_OK ; if ")" go do rest of function + + JMP LAB_SNER ; do syntax error then warm start + +TST_OK + JSR LAB_IGBY ; update BASIC execute pointer (to character past ")") + LDA #$00 ; clear A + SEC ; set the carry +T_Bits + ROL ; shift bit + DEX ; decrement bit number + BPL T_Bits ; loop if still +ve + + INX ; make X = $00 + AND (Itempl,X) ; AND with byte via temporary integer (addr) + BEQ LAB_NOTT ; branch if zero (already correct) + + LDA #$FF ; set for -1 result +LAB_NOTT + JMP LAB_27DB ; go do SGN tail + +; perform BIN$() + +LAB_BINS + CPX #$19 ; max + 1 + BCS BinFErr ; exit if too big ( > or = ) + + STX TempB ; save # of characters ($00 = leading zero remove) + LDA #$18 ; need A byte long space + JSR LAB_MSSP ; make string space A bytes long + LDY #$17 ; set index + LDX #$18 ; character count +NextB1 + LSR nums_1 ; shift highest byte + ROR nums_2 ; shift middle byte + ROR nums_3 ; shift lowest byte bit 0 to carry + TXA ; load with "0"/2 + ROL ; shift in carry + STA (str_pl),Y ; save to temp string + index + DEY ; decrement index + BPL NextB1 ; loop if not done + + LDA TempB ; get # of characters + BEQ EndBHS ; branch if truncate + + TAX ; copy length to X + SEC ; set carry for add ! + EOR #$FF ; 1's complement + ADC #$18 ; add 24d + BEQ GoPr2 ; if zero print whole string + + BNE GoPr1 ; else go make output string + +; this is the exit code and is also used by HEX$() +; truncate string to remove leading "0"s + +EndBHS + TAY ; clear index (A=0, X=length here) +NextB2 + LDA (str_pl),Y ; get character from string + CMP #'0' ; compare with "0" + BNE GoPr ; if not "0" then go print string from here + + DEX ; decrement character count + BEQ GoPr3 ; if zero then end of string so go print it + + INY ; else increment index + BPL NextB2 ; loop always + +; make fixed length output string - ignore overflows! + +GoPr3 + INX ; need at least 1 character +GoPr + TYA ; copy result +GoPr1 + CLC ; clear carry for add + ADC str_pl ; add low address + STA str_pl ; save low address + LDA #$00 ; do high byte + ADC str_ph ; add high address + STA str_ph ; save high address +GoPr2 + STX str_ln ; X holds string length + JSR LAB_IGBY ; update BASIC execute pointer (to character past ")") + JMP LAB_RTST ; check for space on descriptor stack then put address + ; and length on descriptor stack and update stack pointers + +BinFErr + JMP LAB_FCER ; do function call error then warm start + +; perform HEX$() + +LAB_HEXS + CPX #$07 ; max + 1 + BCS BinFErr ; exit if too big ( > or = ) + + STX TempB ; save # of characters + + LDA #$06 ; need 6 bytes for string + JSR LAB_MSSP ; make string space A bytes long + LDY #$05 ; set string index + +; *** disable decimal mode patch - comment next line *** +; SED ; need decimal mode for nibble convert + LDA nums_3 ; get lowest byte + JSR LAB_A2HX ; convert A to ASCII hex byte and output + LDA nums_2 ; get middle byte + JSR LAB_A2HX ; convert A to ASCII hex byte and output + LDA nums_1 ; get highest byte + JSR LAB_A2HX ; convert A to ASCII hex byte and output +; *** disable decimal mode patch - comment next line *** +; CLD ; back to binary + + LDX #$06 ; character count + LDA TempB ; get # of characters + BEQ EndBHS ; branch if truncate + + TAX ; copy length to X + SEC ; set carry for add ! + EOR #$FF ; 1's complement + ADC #$06 ; add 6d + BEQ GoPr2 ; if zero print whole string + + BNE GoPr1 ; else go make output string (branch always) + +; convert A to ASCII hex byte and output .. note set decimal mode before calling + +LAB_A2HX + TAX ; save byte + AND #$0F ; mask off top bits + JSR LAB_AL2X ; convert low nibble to ASCII and output + TXA ; get byte back + LSR ; /2 shift high nibble to low nibble + LSR ; /4 + LSR ; /8 + LSR ; /16 +LAB_AL2X + CMP #$0A ; set carry for +1 if >9 +; *** begin disable decimal mode patch *** +; *** insert + BCC LAB_AL20 ; skip adjust if <= 9 + ADC #$06 ; adjust for A to F +LAB_AL20 +; *** end disable decimal mode patch *** + ADC #'0' ; add ASCII "0" + STA (str_pl),Y ; save to temp string + DEY ; decrement counter + RTS + +LAB_NLTO + STA FAC1_e ; save FAC1 exponent + LDA #$00 ; clear sign compare +LAB_MLTE + STA FAC_sc ; save sign compare (FAC1 EOR FAC2) + TXA ; restore character + JSR LAB_2912 ; evaluate new ASCII digit + +; gets here if the first character was "$" for hex +; get hex number + +LAB_CHEX + JSR LAB_IGBY ; increment and scan memory + BCC LAB_ISHN ; branch if numeric character + + ORA #$20 ; case convert, allow "A" to "F" and "a" to "f" + SBC #'a' ; subtract "a" (carry set here) + CMP #$06 ; compare normalised with $06 (max+1) + BCS LAB_EXCH ; exit if >"f" or <"0" + + ADC #$0A ; convert to nibble +LAB_ISHN + AND #$0F ; convert to binary + TAX ; save nibble + LDA FAC1_e ; get FAC1 exponent + BEQ LAB_MLTE ; skip multiply if zero + + ADC #$04 ; add four to exponent (*16 - carry clear here) + BCC LAB_NLTO ; if no overflow do evaluate digit + +LAB_MLTO + JMP LAB_2564 ; do overflow error and warm start + +LAB_NXCH + TAX ; save bit + LDA FAC1_e ; get FAC1 exponent + BEQ LAB_MLBT ; skip multiply if zero + + INC FAC1_e ; increment FAC1 exponent (*2) + BEQ LAB_MLTO ; do overflow error if = $00 + + LDA #$00 ; clear sign compare +LAB_MLBT + STA FAC_sc ; save sign compare (FAC1 EOR FAC2) + TXA ; restore bit + JSR LAB_2912 ; evaluate new ASCII digit + +; gets here if the first character was "%" for binary +; get binary number + +LAB_CBIN + JSR LAB_IGBY ; increment and scan memory + EOR #'0' ; convert "0" to 0 etc. + CMP #$02 ; compare with max+1 + BCC LAB_NXCH ; branch exit if < 2 + +LAB_EXCH + JMP LAB_28F6 ; evaluate -ve flag and return + +; ctrl-c check routine. includes limited "life" byte save for INGET routine +; now also the code that checks to see if an interrupt has occurred + +CTRLC + LDA ccflag ; get [CTRL-C] check flag + BNE LAB_FBA2 ; exit if inhibited + + JSR V_INPT ; scan input device + BCC LAB_FBA0 ; exit if buffer empty + + STA ccbyte ; save received byte + LDX #$20 ; "life" timer for bytes + STX ccnull ; set countdown + JMP LAB_1636 ; return to BASIC + +LAB_FBA0 + LDX ccnull ; get countdown byte + BEQ LAB_FBA2 ; exit if finished + + DEC ccnull ; else decrement countdown +LAB_FBA2 + LDX #NmiBase ; set pointer to NMI values + JSR LAB_CKIN ; go check interrupt + LDX #IrqBase ; set pointer to IRQ values + JSR LAB_CKIN ; go check interrupt +LAB_CRTS + RTS + +; check whichever interrupt is indexed by X + +LAB_CKIN + LDA PLUS_0,X ; get interrupt flag byte + BPL LAB_CRTS ; branch if interrupt not enabled + +; we disable the interrupt here and make two new commands RETIRQ and RETNMI to +; automatically enable the interrupt when we exit + + ASL ; move happened bit to setup bit + AND #$40 ; mask happened bits + BEQ LAB_CRTS ; if no interrupt then exit + + STA PLUS_0,X ; save interrupt flag byte + + TXA ; copy index .. + TAY ; .. to Y + + PLA ; dump return address low byte, call from CTRL-C + PLA ; dump return address high byte + + LDA #$05 ; need 5 bytes for GOSUB + JSR LAB_1212 ; check room on stack for A bytes + LDA Bpntrh ; get BASIC execute pointer high byte + PHA ; push on stack + LDA Bpntrl ; get BASIC execute pointer low byte + PHA ; push on stack + LDA Clineh ; get current line high byte + PHA ; push on stack + LDA Clinel ; get current line low byte + PHA ; push on stack + LDA #TK_GOSUB ; token for GOSUB + PHA ; push on stack + + LDA PLUS_1,Y ; get interrupt code pointer low byte + STA Bpntrl ; save as BASIC execute pointer low byte + LDA PLUS_2,Y ; get interrupt code pointer high byte + STA Bpntrh ; save as BASIC execute pointer high byte + + JMP LAB_15C2 ; go do interpreter inner loop + ; can't RTS, we used the stack! the RTS from the ctrl-c + ; check will be taken when the RETIRQ/RETNMI/RETURN is + ; executed at the end of the subroutine + +; get byte from input device, no waiting +; returns with carry set if byte in A + +INGET + JSR V_INPT ; call scan input device + BCS LAB_FB95 ; if byte go reset timer + + LDA ccnull ; get countdown + BEQ LAB_FB96 ; exit if empty + + LDA ccbyte ; get last received byte + SEC ; flag we got a byte +LAB_FB95 + LDX #$00 ; clear X + STX ccnull ; clear timer because we got a byte +LAB_FB96 + RTS + +; these routines only enable the interrupts if the set-up flag is set +; if not they have no effect + +; perform IRQ {ON|OFF|CLEAR} + +LAB_IRQ + LDX #IrqBase ; set pointer to IRQ values + .byte $2C ; make next line BIT abs. + +; perform NMI {ON|OFF|CLEAR} + +LAB_NMI + LDX #NmiBase ; set pointer to NMI values + CMP #TK_ON ; compare with token for ON + BEQ LAB_INON ; go turn on interrupt + + CMP #TK_OFF ; compare with token for OFF + BEQ LAB_IOFF ; go turn off interrupt + + EOR #TK_CLEAR ; compare with token for CLEAR, A = $00 if = TK_CLEAR + BEQ LAB_INEX ; go clear interrupt flags and return + + JMP LAB_SNER ; do syntax error then warm start + +LAB_IOFF + LDA #$7F ; clear A + AND PLUS_0,X ; AND with interrupt setup flag + BPL LAB_INEX ; go clear interrupt enabled flag and return + +LAB_INON + LDA PLUS_0,X ; get interrupt setup flag + ASL ; Shift bit to enabled flag + ORA PLUS_0,X ; OR with flag byte +LAB_INEX + STA PLUS_0,X ; save interrupt flag byte + JMP LAB_IGBY ; update BASIC execute pointer and return + +; these routines set up the pointers and flags for the interrupt routines +; note that the interrupts are also enabled by these commands + +; perform ON IRQ + +LAB_SIRQ + CLI ; enable interrupts + LDX #IrqBase ; set pointer to IRQ values + .byte $2C ; make next line BIT abs. + +; perform ON NMI + +LAB_SNMI + LDX #NmiBase ; set pointer to NMI values + + STX TempB ; save interrupt pointer + JSR LAB_IGBY ; increment and scan memory (past token) + JSR LAB_GFPN ; get fixed-point number into temp integer + LDA Smeml ; get start of mem low byte + LDX Smemh ; get start of mem high byte + JSR LAB_SHLN ; search Basic for temp integer line number from AX + BCS LAB_LFND ; if carry set go set-up interrupt + + JMP LAB_16F7 ; else go do "Undefined statement" error and warm start + +LAB_LFND + LDX TempB ; get interrupt pointer + LDA Baslnl ; get pointer low byte + SBC #$01 ; -1 (carry already set for subtract) + STA PLUS_1,X ; save as interrupt pointer low byte + LDA Baslnh ; get pointer high byte + SBC #$00 ; subtract carry + STA PLUS_2,X ; save as interrupt pointer high byte + + LDA #$C0 ; set interrupt enabled/setup bits + STA PLUS_0,X ; set interrupt flags +LAB_IRTS + RTS + +; return from IRQ service, restores the enabled flag. + +; perform RETIRQ + +LAB_RETIRQ + BNE LAB_IRTS ; exit if following token (to allow syntax error) + + LDA IrqBase ; get interrupt flags + ASL ; copy setup to enabled (b7) + ORA IrqBase ; OR in setup flag + STA IrqBase ; save enabled flag + JMP LAB_16E8 ; go do rest of RETURN + +; return from NMI service, restores the enabled flag. + +; perform RETNMI + +LAB_RETNMI + BNE LAB_IRTS ; exit if following token (to allow syntax error) + + LDA NmiBase ; get set-up flag + ASL ; copy setup to enabled (b7) + ORA NmiBase ; OR in setup flag + STA NmiBase ; save enabled flag + JMP LAB_16E8 ; go do rest of RETURN + +; MAX() MIN() pre process + +LAB_MMPP + JSR LAB_EVEZ ; process expression + JMP LAB_CTNM ; check if source is numeric, else do type mismatch + +; perform MAX() + +LAB_MAX + JSR LAB_PHFA ; push FAC1, evaluate expression, + ; pull FAC2 and compare with FAC1 + BPL LAB_MAX ; branch if no swap to do + + LDA FAC2_1 ; get FAC2 mantissa1 + ORA #$80 ; set top bit (clear sign from compare) + STA FAC2_1 ; save FAC2 mantissa1 + JSR LAB_279B ; copy FAC2 to FAC1 + BEQ LAB_MAX ; go do next (branch always) + +; perform MIN() + +LAB_MIN + JSR LAB_PHFA ; push FAC1, evaluate expression, + ; pull FAC2 and compare with FAC1 + BMI LAB_MIN ; branch if no swap to do + + BEQ LAB_MIN ; branch if no swap to do + + LDA FAC2_1 ; get FAC2 mantissa1 + ORA #$80 ; set top bit (clear sign from compare) + STA FAC2_1 ; save FAC2 mantissa1 + JSR LAB_279B ; copy FAC2 to FAC1 + BEQ LAB_MIN ; go do next (branch always) + +; exit routine. don't bother returning to the loop code +; check for correct exit, else so syntax error + +LAB_MMEC + CMP #')' ; is it end of function? + BNE LAB_MMSE ; if not do MAX MIN syntax error + + PLA ; dump return address low byte + PLA ; dump return address high byte + JMP LAB_IGBY ; update BASIC execute pointer (to chr past ")") + +LAB_MMSE + JMP LAB_SNER ; do syntax error then warm start + +; check for next, evaluate and return or exit +; this is the routine that does most of the work + +LAB_PHFA + JSR LAB_GBYT ; get next BASIC byte + CMP #',' ; is there more ? + BNE LAB_MMEC ; if not go do end check + + ; push FAC1 + JSR LAB_27BA ; round FAC1 + LDA FAC1_s ; get FAC1 sign + ORA #$7F ; set all non sign bits + AND FAC1_1 ; AND FAC1 mantissa1 (AND in sign bit) + PHA ; push on stack + LDA FAC1_2 ; get FAC1 mantissa2 + PHA ; push on stack + LDA FAC1_3 ; get FAC1 mantissa3 + PHA ; push on stack + LDA FAC1_e ; get FAC1 exponent + PHA ; push on stack + + JSR LAB_IGBY ; scan and get next BASIC byte (after ",") + JSR LAB_EVNM ; evaluate expression and check is numeric, + ; else do type mismatch + + ; pop FAC2 (MAX/MIN expression so far) + PLA ; pop exponent + STA FAC2_e ; save FAC2 exponent + PLA ; pop mantissa3 + STA FAC2_3 ; save FAC2 mantissa3 + PLA ; pop mantissa1 + STA FAC2_2 ; save FAC2 mantissa2 + PLA ; pop sign/mantissa1 + STA FAC2_1 ; save FAC2 sign/mantissa1 + STA FAC2_s ; save FAC2 sign + + ; compare FAC1 with (packed) FAC2 + LDA #FAC2_e ; set pointer high byte to FAC2 + JMP LAB_27F8 ; compare FAC1 with FAC2 (AY) and return + ; returns A=$00 if FAC1 = (AY) + ; returns A=$01 if FAC1 > (AY) + ; returns A=$FF if FAC1 < (AY) + +; perform WIDTH + +LAB_WDTH + CMP #',' ; is next byte "," + BEQ LAB_TBSZ ; if so do tab size + + JSR LAB_GTBY ; get byte parameter + TXA ; copy width to A + BEQ LAB_NSTT ; branch if set for infinite line + + CPX #$10 ; else make min width = 16d + BCC TabErr ; if less do function call error and exit + +; this next compare ensures that we can't exit WIDTH via an error leaving the +; tab size greater than the line length. + + CPX TabSiz ; compare with tab size + BCS LAB_NSTT ; branch if >= tab size + + STX TabSiz ; else make tab size = terminal width +LAB_NSTT + STX TWidth ; set the terminal width + JSR LAB_GBYT ; get BASIC byte back + BEQ WExit ; exit if no following + + CMP #',' ; else is it "," + BNE LAB_MMSE ; if not do syntax error + +LAB_TBSZ + JSR LAB_SGBY ; scan and get byte parameter + TXA ; copy TAB size + BMI TabErr ; if >127 do function call error and exit + + CPX #$01 ; compare with min-1 + BCC TabErr ; if <=1 do function call error and exit + + LDA TWidth ; set flags for width + BEQ LAB_SVTB ; skip check if infinite line + + CPX TWidth ; compare TAB with width + BEQ LAB_SVTB ; ok if = + + BCS TabErr ; branch if too big + +LAB_SVTB + STX TabSiz ; save TAB size + +; calculate tab column limit from TAB size. The Iclim is set to the last tab +; position on a line that still has at least one whole tab width between it +; and the end of the line. + +WExit + LDA TWidth ; get width + BEQ LAB_SULP ; branch if infinite line + + CMP TabSiz ; compare with tab size + BCS LAB_WDLP ; branch if >= tab size + + STA TabSiz ; else make tab size = terminal width +LAB_SULP + SEC ; set carry for subtract +LAB_WDLP + SBC TabSiz ; subtract tab size + BCS LAB_WDLP ; loop while no borrow + + ADC TabSiz ; add tab size back + CLC ; clear carry for add + ADC TabSiz ; add tab size back again + STA Iclim ; save for now + LDA TWidth ; get width back + SEC ; set carry for subtract + SBC Iclim ; subtract remainder + STA Iclim ; save tab column limit +LAB_NOSQ + RTS + +TabErr + JMP LAB_FCER ; do function call error then warm start + +; perform SQR() + +LAB_SQR + LDA FAC1_s ; get FAC1 sign + BMI TabErr ; if -ve do function call error + + LDA FAC1_e ; get exponent + BEQ LAB_NOSQ ; if zero just return + + ; else do root + JSR LAB_27AB ; round and copy FAC1 to FAC2 + LDA #$00 ; clear A + + STA FACt_3 ; clear remainder + STA FACt_2 ; .. + STA FACt_1 ; .. + STA TempB ; .. + + STA FAC1_3 ; clear root + STA FAC1_2 ; .. + STA FAC1_1 ; .. + + LDX #$18 ; 24 pairs of bits to do + LDA FAC2_e ; get exponent + LSR ; check odd/even + BCS LAB_SQE2 ; if odd only 1 shift first time + +LAB_SQE1 + ASL FAC2_3 ; shift highest bit of number .. + ROL FAC2_2 ; .. + ROL FAC2_1 ; .. + ROL FACt_3 ; .. into remainder + ROL FACt_2 ; .. + ROL FACt_1 ; .. + ROL TempB ; .. never overflows +LAB_SQE2 + ASL FAC2_3 ; shift highest bit of number .. + ROL FAC2_2 ; .. + ROL FAC2_1 ; .. + ROL FACt_3 ; .. into remainder + ROL FACt_2 ; .. + ROL FACt_1 ; .. + ROL TempB ; .. never overflows + + ASL FAC1_3 ; root = root * 2 + ROL FAC1_2 ; .. + ROL FAC1_1 ; .. never overflows + + LDA FAC1_3 ; get root low byte + ROL ; *2 + STA Temp3 ; save partial low byte + LDA FAC1_2 ; get root low mid byte + ROL ; *2 + STA Temp3+1 ; save partial low mid byte + LDA FAC1_1 ; get root high mid byte + ROL ; *2 + STA Temp3+2 ; save partial high mid byte + LDA #$00 ; get root high byte (always $00) + ROL ; *2 + STA Temp3+3 ; save partial high byte + + ; carry clear for subtract +1 + LDA FACt_3 ; get remainder low byte + SBC Temp3 ; subtract partial low byte + STA Temp3 ; save partial low byte + + LDA FACt_2 ; get remainder low mid byte + SBC Temp3+1 ; subtract partial low mid byte + STA Temp3+1 ; save partial low mid byte + + LDA FACt_1 ; get remainder high mid byte + SBC Temp3+2 ; subtract partial high mid byte + TAY ; copy partial high mid byte + + LDA TempB ; get remainder high byte + SBC Temp3+3 ; subtract partial high byte + BCC LAB_SQNS ; skip sub if remainder smaller + + STA TempB ; save remainder high byte + + STY FACt_1 ; save remainder high mid byte + + LDA Temp3+1 ; get remainder low mid byte + STA FACt_2 ; save remainder low mid byte + + LDA Temp3 ; get partial low byte + STA FACt_3 ; save remainder low byte + + INC FAC1_3 ; increment root low byte (never any rollover) +LAB_SQNS + DEX ; decrement bit pair count + BNE LAB_SQE1 ; loop if not all done + + SEC ; set carry for subtract + LDA FAC2_e ; get exponent + SBC #$80 ; normalise + ROR ; /2 and re-bias to $80 + ADC #$00 ; add bit zero back in (allow for half shift) + STA FAC1_e ; save it + JMP LAB_24D5 ; normalise FAC1 and return + +; perform VARPTR() + +LAB_VARPTR + JSR LAB_IGBY ; increment and scan memory + JSR LAB_GVAR ; get var address + JSR LAB_1BFB ; scan for ")" , else do syntax error then warm start + LDY Cvaral ; get var address low byte + LDA Cvarah ; get var address high byte + JMP LAB_AYFC ; save and convert integer AY to FAC1 and return + +; perform PI + +LAB_PI + LDA #LAB_2C7C ; set (2*pi) pointer high byte + JSR LAB_UFAC ; unpack memory (AY) into FAC1 + DEC FAC1_e ; make result = PI + RTS + +; perform TWOPI + +LAB_TWOPI + LDA #LAB_2C7C ; set (2*pi) pointer high byte + JMP LAB_UFAC ; unpack memory (AY) into FAC1 and return + +; system dependant i/o vectors +; these are in RAM and are set by the monitor at start-up + +V_INPT + JMP (VEC_IN) ; non halting scan input device +V_OUTP + JMP (VEC_OUT) ; send byte to output device +V_LOAD + JMP (VEC_LD) ; load BASIC program +V_SAVE + JMP (VEC_SV) ; save BASIC program + +; The rest are tables messages and code for RAM + +; the rest of the code is tables and BASIC start-up code + +PG2_TABS + .byte $00 ; ctrl-c flag - $00 = enabled + .byte $00 ; ctrl-c byte - GET needs this + .byte $00 ; ctrl-c byte timeout - GET needs this + .word CTRLC ; ctrl c check vector +; .word xxxx ; non halting key input - monitor to set this +; .word xxxx ; output vector - monitor to set this +; .word xxxx ; load vector - monitor to set this +; .word xxxx ; save vector - monitor to set this +PG2_TABE + +; character get subroutine for zero page + +; For a 1.8432MHz 6502 including the JSR and RTS +; fastest (>=":") = 29 cycles = 15.7uS +; slowest (<":") = 40 cycles = 21.7uS +; space skip = +21 cycles = +11.4uS +; inc across page = +4 cycles = +2.2uS + +; the target address for the LDA at LAB_2CF4 becomes the BASIC execute pointer once the +; block is copied to it's destination, any non zero page address will do at assembly +; time, to assemble a three byte instruction. + +; page 0 initialisation table from $BC +; increment and scan memory + +LAB_2CEE + INC Bpntrl ; increment BASIC execute pointer low byte + BNE LAB_2CF4 ; branch if no carry + ; else + INC Bpntrh ; increment BASIC execute pointer high byte + +; page 0 initialisation table from $C2 +; scan memory + +LAB_2CF4 + LDA $FFFF ; get byte to scan (addr set by call routine) + CMP #TK_ELSE ; compare with the token for ELSE + BEQ LAB_2D05 ; exit if ELSE, not numeric, carry set + + CMP #':' ; compare with ":" + BCS LAB_2D05 ; exit if >= ":", not numeric, carry set + + CMP #' ' ; compare with " " + BEQ LAB_2CEE ; if " " go do next + + SEC ; set carry for SBC + SBC #'0' ; subtract "0" + SEC ; set carry for SBC + SBC #$D0 ; subtract -"0" + ; clear carry if byte = "0"-"9" +LAB_2D05 + RTS + +; page zero initialisation table $00-$12 inclusive + +StrTab + .byte $4C ; JMP opcode + .word LAB_COLD ; initial warm start vector (cold start) + + .byte $00 ; these bytes are not used by BASIC + .word $0000 ; + .word $0000 ; + .word $0000 ; + + .byte $4C ; JMP opcode + .word LAB_FCER ; initial user function vector ("Function call" error) + .byte $00 ; default NULL count + .byte $00 ; clear terminal position + .byte $00 ; default terminal width byte + .byte $F2 ; default limit for TAB = 14 + .word Ram_base ; start of user RAM +EndTab + +LAB_MSZM + .text $0D,$0A,"Memory size ",$00 + +LAB_SMSG + .text " Bytes free",$0D,$0A,$0A + .text "Enhanced BASIC 2.22p4",$0A,$00 + +; numeric constants and series + + ; constants and series for LOG(n) +LAB_25A0 + .byte $02 ; counter + .byte $80,$19,$56,$62 ; 0.59898 + .byte $80,$76,$22,$F3 ; 0.96147 +;## .byte $80,$76,$22,$F1 ; 0.96147 + .byte $82,$38,$AA,$40 ; 2.88539 +;## .byte $82,$38,$AA,$45 ; 2.88539 + +LAB_25AD + .byte $80,$35,$04,$F3 ; 0.70711 1/root 2 +LAB_25B1 + .byte $81,$35,$04,$F3 ; 1.41421 root 2 +LAB_25B5 + .byte $80,$80,$00,$00 ; -0.5 +LAB_25B9 + .byte $80,$31,$72,$18 ; 0.69315 LOG(2) + + ; numeric PRINT constants +LAB_2947 + .byte $91,$43,$4F,$F8 ; 99999.9375 (max value with at least one decimal) +LAB_294B + .byte $94,$74,$23,$F7 ; 999999.4375 (max value before scientific notation) +LAB_294F + .byte $94,$74,$24,$00 ; 1000000 + + ; EXP(n) constants and series +LAB_2AFA + .byte $81,$38,$AA,$3B ; 1.4427 (1/LOG base 2 e) +LAB_2AFE + .byte $06 ; counter + .byte $74,$63,$90,$8C ; 2.17023e-4 + .byte $77,$23,$0C,$AB ; 0.00124 + .byte $7A,$1E,$94,$00 ; 0.00968 + .byte $7C,$63,$42,$80 ; 0.05548 + .byte $7E,$75,$FE,$D0 ; 0.24023 + .byte $80,$31,$72,$15 ; 0.69315 + .byte $81,$00,$00,$00 ; 1.00000 + +;## .byte $07 ; counter +;## .byte $74,$94,$2E,$40 ; -1/7! (-1/5040) +;## .byte $77,$2E,$4F,$70 ; 1/6! ( 1/720) +;## .byte $7A,$88,$02,$6E ; -1/5! (-1/120) +;## .byte $7C,$2A,$A0,$E6 ; 1/4! ( 1/24) +;## .byte $7E,$AA,$AA,$50 ; -1/3! (-1/6) +;## .byte $7F,$7F,$FF,$FF ; 1/2! ( 1/2) +;## .byte $81,$80,$00,$00 ; -1/1! (-1/1) +;## .byte $81,$00,$00,$00 ; 1/0! ( 1/1) + + ; trigonometric constants and series +LAB_2C78 + .byte $81,$49,$0F,$DB ; 1.570796371 (pi/2) as floating # +LAB_2C84 + .byte $04 ; counter + .byte $86,$1E,$D7,$FB ; 39.7109 +;## .byte $86,$1E,$D7,$BA ; 39.7109 + .byte $87,$99,$26,$65 ;-76.575 +;## .byte $87,$99,$26,$64 ;-76.575 + .byte $87,$23,$34,$58 ; 81.6022 + .byte $86,$A5,$5D,$E1 ;-41.3417 +;## .byte $86,$A5,$5D,$E0 ;-41.3417 +LAB_2C7C + .byte $83,$49,$0F,$DB ; 6.28319 (2*pi) as floating # +;## .byte $83,$49,$0F,$DA ; 6.28319 (2*pi) as floating # + +LAB_2CC9 + .byte $08 ; counter + .byte $78,$3A,$C5,$37 ; 0.00285 + .byte $7B,$83,$A2,$5C ;-0.0160686 + .byte $7C,$2E,$DD,$4D ; 0.0426915 + .byte $7D,$99,$B0,$1E ;-0.0750429 + .byte $7D,$59,$ED,$24 ; 0.106409 + .byte $7E,$91,$72,$00 ;-0.142036 + .byte $7E,$4C,$B9,$73 ; 0.199926 + .byte $7F,$AA,$AA,$53 ;-0.333331 + +;## .byte $08 ; counter +;## .byte $78,$3B,$D7,$4A ; 1/17 +;## .byte $7B,$84,$6E,$02 ;-1/15 +;## .byte $7C,$2F,$C1,$FE ; 1/13 +;## .byte $7D,$9A,$31,$74 ;-1/11 +;## .byte $7D,$5A,$3D,$84 ; 1/9 +;## .byte $7E,$91,$7F,$C8 ;-1/7 +;## .byte $7E,$4C,$BB,$E4 ; 1/5 +;## .byte $7F,$AA,$AA,$6C ;-1/3 + +LAB_1D96 = *+1 ; $00,$00 used for undefined variables +LAB_259C + .byte $81,$00,$00,$00 ; 1.000000, used for INC +LAB_2AFD + .byte $81,$80,$00,$00 ; -1.00000, used for DEC. must be on the same page as +1.00 + + ; misc constants +LAB_1DF7 + .byte $90 ;-32768 (uses first three bytes from 0.5) +LAB_2A96 + .byte $80,$00,$00,$00 ; 0.5 +LAB_2C80 + .byte $7F,$00,$00,$00 ; 0.25 +LAB_26B5 + .byte $84,$20,$00,$00 ; 10.0000 divide by 10 constant + +; This table is used in converting numbers to ASCII. + +LAB_2A9A +LAB_2A9B = LAB_2A9A+1 +LAB_2A9C = LAB_2A9B+1 + .byte $FE,$79,$60 ; -100000 + .byte $00,$27,$10 ; 10000 + .byte $FF,$FC,$18 ; -1000 + .byte $00,$00,$64 ; 100 + .byte $FF,$FF,$F6 ; -10 + .byte $00,$00,$01 ; 1 + +LAB_CTBL + .word LAB_END-1 ; END + .word LAB_FOR-1 ; FOR + .word LAB_NEXT-1 ; NEXT + .word LAB_DATA-1 ; DATA + .word LAB_INPUT-1 ; INPUT + .word LAB_DIM-1 ; DIM + .word LAB_READ-1 ; READ + .word LAB_LET-1 ; LET + .word LAB_DEC-1 ; DEC new command + .word LAB_GOTO-1 ; GOTO + .word LAB_RUN-1 ; RUN + .word LAB_IF-1 ; IF + .word LAB_RESTORE-1 ; RESTORE modified command + .word LAB_GOSUB-1 ; GOSUB + .word LAB_RETIRQ-1 ; RETIRQ new command + .word LAB_RETNMI-1 ; RETNMI new command + .word LAB_RETURN-1 ; RETURN + .word LAB_REM-1 ; REM + .word LAB_STOP-1 ; STOP + .word LAB_ON-1 ; ON modified command + .word LAB_NULL-1 ; NULL modified command + .word LAB_INC-1 ; INC new command + .word LAB_WAIT-1 ; WAIT + .word V_LOAD-1 ; LOAD + .word V_SAVE-1 ; SAVE + .word LAB_DEF-1 ; DEF + .word LAB_POKE-1 ; POKE + .word LAB_DOKE-1 ; DOKE new command + .word LAB_CALL-1 ; CALL new command + .word LAB_DO-1 ; DO new command + .word LAB_LOOP-1 ; LOOP new command + .word LAB_PRINT-1 ; PRINT + .word LAB_CONT-1 ; CONT + .word LAB_LIST-1 ; LIST + .word LAB_CLEAR-1 ; CLEAR + .word LAB_NEW-1 ; NEW + .word LAB_WDTH-1 ; WIDTH new command + .word LAB_GET-1 ; GET new command + .word LAB_SWAP-1 ; SWAP new command + .word LAB_BITSET-1 ; BITSET new command + .word LAB_BITCLR-1 ; BITCLR new command + .word LAB_IRQ-1 ; IRQ new command + .word LAB_NMI-1 ; NMI new command + +; function pre process routine table + +LAB_FTPL +LAB_FTPM = LAB_FTPL+$01 + .word LAB_PPFN-1 ; SGN(n) process numeric expression in () + .word LAB_PPFN-1 ; INT(n) " + .word LAB_PPFN-1 ; ABS(n) " + .word LAB_EVEZ-1 ; USR(x) process any expression + .word LAB_1BF7-1 ; FRE(x) " + .word LAB_1BF7-1 ; POS(x) " + .word LAB_PPFN-1 ; SQR(n) process numeric expression in () + .word LAB_PPFN-1 ; RND(n) " + .word LAB_PPFN-1 ; LOG(n) " + .word LAB_PPFN-1 ; EXP(n) " + .word LAB_PPFN-1 ; COS(n) " + .word LAB_PPFN-1 ; SIN(n) " + .word LAB_PPFN-1 ; TAN(n) " + .word LAB_PPFN-1 ; ATN(n) " + .word LAB_PPFN-1 ; PEEK(n) " + .word LAB_PPFN-1 ; DEEK(n) " + .word $0000 ; SADD() none + .word LAB_PPFS-1 ; LEN($) process string expression in () + .word LAB_PPFN-1 ; STR$(n) process numeric expression in () + .word LAB_PPFS-1 ; VAL($) process string expression in () + .word LAB_PPFS-1 ; ASC($) " + .word LAB_PPFS-1 ; UCASE$($) " + .word LAB_PPFS-1 ; LCASE$($) " + .word LAB_PPFN-1 ; CHR$(n) process numeric expression in () + .word LAB_BHSS-1 ; HEX$(n) " + .word LAB_BHSS-1 ; BIN$(n) " + .word $0000 ; BITTST() none + .word LAB_MMPP-1 ; MAX() process numeric expression + .word LAB_MMPP-1 ; MIN() " + .word LAB_PPBI-1 ; PI advance pointer + .word LAB_PPBI-1 ; TWOPI " + .word $0000 ; VARPTR() none + .word LAB_LRMS-1 ; LEFT$() process string expression + .word LAB_LRMS-1 ; RIGHT$() " + .word LAB_LRMS-1 ; MID$() " + +; action addresses for functions + +LAB_FTBL +LAB_FTBM = LAB_FTBL+$01 + .word LAB_SGN-1 ; SGN() + .word LAB_INT-1 ; INT() + .word LAB_ABS-1 ; ABS() + .word LAB_USR-1 ; USR() + .word LAB_FRE-1 ; FRE() + .word LAB_POS-1 ; POS() + .word LAB_SQR-1 ; SQR() + .word LAB_RND-1 ; RND() modified function + .word LAB_LOG-1 ; LOG() + .word LAB_EXP-1 ; EXP() + .word LAB_COS-1 ; COS() + .word LAB_SIN-1 ; SIN() + .word LAB_TAN-1 ; TAN() + .word LAB_ATN-1 ; ATN() + .word LAB_PEEK-1 ; PEEK() + .word LAB_DEEK-1 ; DEEK() new function + .word LAB_SADD-1 ; SADD() new function + .word LAB_LENS-1 ; LEN() + .word LAB_STRS-1 ; STR$() + .word LAB_VAL-1 ; VAL() + .word LAB_ASC-1 ; ASC() + .word LAB_UCASE-1 ; UCASE$() new function + .word LAB_LCASE-1 ; LCASE$() new function + .word LAB_CHRS-1 ; CHR$() + .word LAB_HEXS-1 ; HEX$() new function + .word LAB_BINS-1 ; BIN$() new function + .word LAB_BTST-1 ; BITTST() new function + .word LAB_MAX-1 ; MAX() new function + .word LAB_MIN-1 ; MIN() new function + .word LAB_PI-1 ; PI new function + .word LAB_TWOPI-1 ; TWOPI new function + .word LAB_VARPTR-1 ; VARPTR() new function + .word LAB_LEFT-1 ; LEFT$() + .word LAB_RIGHT-1 ; RIGHT$() + .word LAB_MIDS-1 ; MID$() + +; hierarchy and action addresses for operator + +LAB_OPPT + .byte $79 ; + + .word LAB_ADD-1 + .byte $79 ; - + .word LAB_SUBTRACT-1 + .byte $7B ; * + .word LAB_MULTIPLY-1 + .byte $7B ; / + .word LAB_DIVIDE-1 + .byte $7F ; ^ + .word LAB_POWER-1 + .byte $50 ; AND + .word LAB_AND-1 + .byte $46 ; EOR new operator + .word LAB_EOR-1 + .byte $46 ; OR + .word LAB_OR-1 + .byte $56 ; >> new operator + .word LAB_RSHIFT-1 + .byte $56 ; << new operator + .word LAB_LSHIFT-1 + .byte $7D ; > + .word LAB_GTHAN-1 + .byte $5A ; = + .word LAB_EQUAL-1 + .byte $64 ; < + .word LAB_LTHAN-1 + +; keywords start with .. +; this is the first character table and must be in alphabetic order + +TAB_1STC + .text "*" + .text "+" + .text "-" + .text "/" + .text "<" + .text "=" + .text ">" + .text "?" + .text "A" + .text "B" + .text "C" + .text "D" + .text "E" + .text "F" + .text "G" + .text "H" + .text "I" + .text "L" + .text "M" + .text "N" + .text "O" + .text "P" + .text "R" + .text "S" + .text "T" + .text "U" + .text "V" + .text "W" + .text "^" + .byte $00 ; table terminator + +; pointers to keyword tables + +TAB_CHRT + .word TAB_STAR ; table for "*" + .word TAB_PLUS ; table for "+" + .word TAB_MNUS ; table for "-" + .word TAB_SLAS ; table for "/" + .word TAB_LESS ; table for "<" + .word TAB_EQUL ; table for "=" + .word TAB_MORE ; table for ">" + .word TAB_QEST ; table for "?" + .word TAB_ASCA ; table for "A" + .word TAB_ASCB ; table for "B" + .word TAB_ASCC ; table for "C" + .word TAB_ASCD ; table for "D" + .word TAB_ASCE ; table for "E" + .word TAB_ASCF ; table for "F" + .word TAB_ASCG ; table for "G" + .word TAB_ASCH ; table for "H" + .word TAB_ASCI ; table for "I" + .word TAB_ASCL ; table for "L" + .word TAB_ASCM ; table for "M" + .word TAB_ASCN ; table for "N" + .word TAB_ASCO ; table for "O" + .word TAB_ASCP ; table for "P" + .word TAB_ASCR ; table for "R" + .word TAB_ASCS ; table for "S" + .word TAB_ASCT ; table for "T" + .word TAB_ASCU ; table for "U" + .word TAB_ASCV ; table for "V" + .word TAB_ASCW ; table for "W" + .word TAB_POWR ; table for "^" + +; tables for each start character, note if a longer keyword with the same start +; letters as a shorter one exists then it must come first, else the list is in +; alphabetical order as follows .. + +; [keyword,token +; [keyword,token]] +; end marker (#$00) + +TAB_STAR + .byte TK_MUL,$00 ; * +TAB_PLUS + .byte TK_PLUS,$00 ; + +TAB_MNUS + .byte TK_MINUS,$00 ; - +TAB_SLAS + .byte TK_DIV,$00 ; / +TAB_LESS +LBB_LSHIFT + .text "<",TK_LSHIFT ; << note - "<<" must come before "<" + .byte TK_LT ; < + .byte $00 +TAB_EQUL + .byte TK_EQUAL,$00 ; = +TAB_MORE +LBB_RSHIFT + .text ">",TK_RSHIFT ; >> note - ">>" must come before ">" + .byte TK_GT ; > + .byte $00 +TAB_QEST + .byte TK_PRINT,$00 ; ? +TAB_ASCA +LBB_ABS + .text "BS(",TK_ABS ; ABS( +LBB_AND + .text "ND",TK_AND ; AND +LBB_ASC + .text "SC(",TK_ASC ; ASC( +LBB_ATN + .text "TN(",TK_ATN ; ATN( + .byte $00 +TAB_ASCB +LBB_BINS + .text "IN$(",TK_BINS ; BIN$( +LBB_BITCLR + .text "ITCLR",TK_BITCLR ; BITCLR +LBB_BITSET + .text "ITSET",TK_BITSET ; BITSET +LBB_BITTST + .text "ITTST(",TK_BITTST + ; BITTST( + .byte $00 +TAB_ASCC +LBB_CALL + .text "ALL",TK_CALL ; CALL +LBB_CHRS + .text "HR$(",TK_CHRS ; CHR$( +LBB_CLEAR + .text "LEAR",TK_CLEAR ; CLEAR +LBB_CONT + .text "ONT",TK_CONT ; CONT +LBB_COS + .text "OS(",TK_COS ; COS( + .byte $00 +TAB_ASCD +LBB_DATA + .text "ATA",TK_DATA ; DATA +LBB_DEC + .text "EC",TK_DEC ; DEC +LBB_DEEK + .text "EEK(",TK_DEEK ; DEEK( +LBB_DEF + .text "EF",TK_DEF ; DEF +LBB_DIM + .text "IM",TK_DIM ; DIM +LBB_DOKE + .text "OKE",TK_DOKE ; DOKE note - "DOKE" must come before "DO" +LBB_DO + .text "O",TK_DO ; DO + .byte $00 +TAB_ASCE +LBB_ELSE + .text "LSE",TK_ELSE ; ELSE +LBB_END + .text "ND",TK_END ; END +LBB_EOR + .text "OR",TK_EOR ; EOR +LBB_EXP + .text "XP(",TK_EXP ; EXP( + .byte $00 +TAB_ASCF +LBB_FN + .text "N",TK_FN ; FN +LBB_FOR + .text "OR",TK_FOR ; FOR +LBB_FRE + .text "RE(",TK_FRE ; FRE( + .byte $00 +TAB_ASCG +LBB_GET + .text "ET",TK_GET ; GET +LBB_GOSUB + .text "OSUB",TK_GOSUB ; GOSUB +LBB_GOTO + .text "OTO",TK_GOTO ; GOTO + .byte $00 +TAB_ASCH +LBB_HEXS + .text "EX$(",TK_HEXS ; HEX$( + .byte $00 +TAB_ASCI +LBB_IF + .text "F",TK_IF ; IF +LBB_INC + .text "NC",TK_INC ; INC +LBB_INPUT + .text "NPUT",TK_INPUT ; INPUT +LBB_INT + .text "NT(",TK_INT ; INT( +LBB_IRQ + .text "RQ",TK_IRQ ; IRQ + .byte $00 +TAB_ASCL +LBB_LCASES + .text "CASE$(",TK_LCASES + ; LCASE$( +LBB_LEFTS + .text "EFT$(",TK_LEFTS ; LEFT$( +LBB_LEN + .text "EN(",TK_LEN ; LEN( +LBB_LET + .text "ET",TK_LET ; LET +LBB_LIST + .text "IST",TK_LIST ; LIST +LBB_LOAD + .text "OAD",TK_LOAD ; LOAD +LBB_LOG + .text "OG(",TK_LOG ; LOG( +LBB_LOOP + .text "OOP",TK_LOOP ; LOOP + .byte $00 +TAB_ASCM +LBB_MAX + .text "AX(",TK_MAX ; MAX( +LBB_MIDS + .text "ID$(",TK_MIDS ; MID$( +LBB_MIN + .text "IN(",TK_MIN ; MIN( + .byte $00 +TAB_ASCN +LBB_NEW + .text "EW",TK_NEW ; NEW +LBB_NEXT + .text "EXT",TK_NEXT ; NEXT +LBB_NMI + .text "MI",TK_NMI ; NMI +LBB_NOT + .text "OT",TK_NOT ; NOT +LBB_NULL + .text "ULL",TK_NULL ; NULL + .byte $00 +TAB_ASCO +LBB_OFF + .text "FF",TK_OFF ; OFF +LBB_ON + .text "N",TK_ON ; ON +LBB_OR + .text "R",TK_OR ; OR + .byte $00 +TAB_ASCP +LBB_PEEK + .text "EEK(",TK_PEEK ; PEEK( +LBB_PI + .text "I",TK_PI ; PI +LBB_POKE + .text "OKE",TK_POKE ; POKE +LBB_POS + .text "OS(",TK_POS ; POS( +LBB_PRINT + .text "RINT",TK_PRINT ; PRINT + .byte $00 +TAB_ASCR +LBB_READ + .text "EAD",TK_READ ; READ +LBB_REM + .text "EM",TK_REM ; REM +LBB_RESTORE + .text "ESTORE",TK_RESTORE + ; RESTORE +LBB_RETIRQ + .text "ETIRQ",TK_RETIRQ ; RETIRQ +LBB_RETNMI + .text "ETNMI",TK_RETNMI ; RETNMI +LBB_RETURN + .text "ETURN",TK_RETURN ; RETURN +LBB_RIGHTS + .text "IGHT$(",TK_RIGHTS + ; RIGHT$( +LBB_RND + .text "ND(",TK_RND ; RND( +LBB_RUN + .text "UN",TK_RUN ; RUN + .byte $00 +TAB_ASCS +LBB_SADD + .text "ADD(",TK_SADD ; SADD( +LBB_SAVE + .text "AVE",TK_SAVE ; SAVE +LBB_SGN + .text "GN(",TK_SGN ; SGN( +LBB_SIN + .text "IN(",TK_SIN ; SIN( +LBB_SPC + .text "PC(",TK_SPC ; SPC( +LBB_SQR + .text "QR(",TK_SQR ; SQR( +LBB_STEP + .text "TEP",TK_STEP ; STEP +LBB_STOP + .text "TOP",TK_STOP ; STOP +LBB_STRS + .text "TR$(",TK_STRS ; STR$( +LBB_SWAP + .text "WAP",TK_SWAP ; SWAP + .byte $00 +TAB_ASCT +LBB_TAB + .text "AB(",TK_TAB ; TAB( +LBB_TAN + .text "AN(",TK_TAN ; TAN( +LBB_THEN + .text "HEN",TK_THEN ; THEN +LBB_TO + .text "O",TK_TO ; TO +LBB_TWOPI + .text "WOPI",TK_TWOPI ; TWOPI + .byte $00 +TAB_ASCU +LBB_UCASES + .text "CASE$(",TK_UCASES + ; UCASE$( +LBB_UNTIL + .text "NTIL",TK_UNTIL ; UNTIL +LBB_USR + .text "SR(",TK_USR ; USR( + .byte $00 +TAB_ASCV +LBB_VAL + .text "AL(",TK_VAL ; VAL( +LBB_VPTR + .text "ARPTR(",TK_VPTR ; VARPTR( + .byte $00 +TAB_ASCW +LBB_WAIT + .text "AIT",TK_WAIT ; WAIT +LBB_WHILE + .text "HILE",TK_WHILE ; WHILE +LBB_WIDTH + .text "IDTH",TK_WIDTH ; WIDTH + .byte $00 +TAB_POWR + .byte TK_POWER,$00 ; ^ + +; new decode table for LIST +; Table is .. +; byte - keyword length, keyword first character +; word - pointer to rest of keyword from dictionary + +; note if length is 1 then the pointer is ignored + +LAB_KEYT + .byte 3,'E' + .word LBB_END ; END + .byte 3,'F' + .word LBB_FOR ; FOR + .byte 4,'N' + .word LBB_NEXT ; NEXT + .byte 4,'D' + .word LBB_DATA ; DATA + .byte 5,'I' + .word LBB_INPUT ; INPUT + .byte 3,'D' + .word LBB_DIM ; DIM + .byte 4,'R' + .word LBB_READ ; READ + .byte 3,'L' + .word LBB_LET ; LET + .byte 3,'D' + .word LBB_DEC ; DEC + .byte 4,'G' + .word LBB_GOTO ; GOTO + .byte 3,'R' + .word LBB_RUN ; RUN + .byte 2,'I' + .word LBB_IF ; IF + .byte 7,'R' + .word LBB_RESTORE ; RESTORE + .byte 5,'G' + .word LBB_GOSUB ; GOSUB + .byte 6,'R' + .word LBB_RETIRQ ; RETIRQ + .byte 6,'R' + .word LBB_RETNMI ; RETNMI + .byte 6,'R' + .word LBB_RETURN ; RETURN + .byte 3,'R' + .word LBB_REM ; REM + .byte 4,'S' + .word LBB_STOP ; STOP + .byte 2,'O' + .word LBB_ON ; ON + .byte 4,'N' + .word LBB_NULL ; NULL + .byte 3,'I' + .word LBB_INC ; INC + .byte 4,'W' + .word LBB_WAIT ; WAIT + .byte 4,'L' + .word LBB_LOAD ; LOAD + .byte 4,'S' + .word LBB_SAVE ; SAVE + .byte 3,'D' + .word LBB_DEF ; DEF + .byte 4,'P' + .word LBB_POKE ; POKE + .byte 4,'D' + .word LBB_DOKE ; DOKE + .byte 4,'C' + .word LBB_CALL ; CALL + .byte 2,'D' + .word LBB_DO ; DO + .byte 4,'L' + .word LBB_LOOP ; LOOP + .byte 5,'P' + .word LBB_PRINT ; PRINT + .byte 4,'C' + .word LBB_CONT ; CONT + .byte 4,'L' + .word LBB_LIST ; LIST + .byte 5,'C' + .word LBB_CLEAR ; CLEAR + .byte 3,'N' + .word LBB_NEW ; NEW + .byte 5,'W' + .word LBB_WIDTH ; WIDTH + .byte 3,'G' + .word LBB_GET ; GET + .byte 4,'S' + .word LBB_SWAP ; SWAP + .byte 6,'B' + .word LBB_BITSET ; BITSET + .byte 6,'B' + .word LBB_BITCLR ; BITCLR + .byte 3,'I' + .word LBB_IRQ ; IRQ + .byte 3,'N' + .word LBB_NMI ; NMI + +; secondary commands (can't start a statement) + + .byte 4,'T' + .word LBB_TAB ; TAB + .byte 4,'E' + .word LBB_ELSE ; ELSE + .byte 2,'T' + .word LBB_TO ; TO + .byte 2,'F' + .word LBB_FN ; FN + .byte 4,'S' + .word LBB_SPC ; SPC + .byte 4,'T' + .word LBB_THEN ; THEN + .byte 3,'N' + .word LBB_NOT ; NOT + .byte 4,'S' + .word LBB_STEP ; STEP + .byte 5,'U' + .word LBB_UNTIL ; UNTIL + .byte 5,'W' + .word LBB_WHILE ; WHILE + .byte 3,'O' + .word LBB_OFF ; OFF + +; opperators + + .byte 1,'+' + .word $0000 ; + + .byte 1,'-' + .word $0000 ; - + .byte 1,'*' + .word $0000 ; * + .byte 1,'/' + .word $0000 ; / + .byte 1,'^' + .word $0000 ; ^ + .byte 3,'A' + .word LBB_AND ; AND + .byte 3,'E' + .word LBB_EOR ; EOR + .byte 2,'O' + .word LBB_OR ; OR + .byte 2,'>' + .word LBB_RSHIFT ; >> + .byte 2,'<' + .word LBB_LSHIFT ; << + .byte 1,'>' + .word $0000 ; > + .byte 1,'=' + .word $0000 ; = + .byte 1,'<' + .word $0000 ; < + +; functions + + .byte 4,'S' ; + .word LBB_SGN ; SGN + .byte 4,'I' ; + .word LBB_INT ; INT + .byte 4,'A' ; + .word LBB_ABS ; ABS + .byte 4,'U' ; + .word LBB_USR ; USR + .byte 4,'F' ; + .word LBB_FRE ; FRE + .byte 4,'P' ; + .word LBB_POS ; POS + .byte 4,'S' ; + .word LBB_SQR ; SQR + .byte 4,'R' ; + .word LBB_RND ; RND + .byte 4,'L' ; + .word LBB_LOG ; LOG + .byte 4,'E' ; + .word LBB_EXP ; EXP + .byte 4,'C' ; + .word LBB_COS ; COS + .byte 4,'S' ; + .word LBB_SIN ; SIN + .byte 4,'T' ; + .word LBB_TAN ; TAN + .byte 4,'A' ; + .word LBB_ATN ; ATN + .byte 5,'P' ; + .word LBB_PEEK ; PEEK + .byte 5,'D' ; + .word LBB_DEEK ; DEEK + .byte 5,'S' ; + .word LBB_SADD ; SADD + .byte 4,'L' ; + .word LBB_LEN ; LEN + .byte 5,'S' ; + .word LBB_STRS ; STR$ + .byte 4,'V' ; + .word LBB_VAL ; VAL + .byte 4,'A' ; + .word LBB_ASC ; ASC + .byte 7,'U' ; + .word LBB_UCASES ; UCASE$ + .byte 7,'L' ; + .word LBB_LCASES ; LCASE$ + .byte 5,'C' ; + .word LBB_CHRS ; CHR$ + .byte 5,'H' ; + .word LBB_HEXS ; HEX$ + .byte 5,'B' ; + .word LBB_BINS ; BIN$ + .byte 7,'B' ; + .word LBB_BITTST ; BITTST + .byte 4,'M' ; + .word LBB_MAX ; MAX + .byte 4,'M' ; + .word LBB_MIN ; MIN + .byte 2,'P' ; + .word LBB_PI ; PI + .byte 5,'T' ; + .word LBB_TWOPI ; TWOPI + .byte 7,'V' ; + .word LBB_VPTR ; VARPTR + .byte 6,'L' ; + .word LBB_LEFTS ; LEFT$ + .byte 7,'R' ; + .word LBB_RIGHTS ; RIGHT$ + .byte 5,'M' ; + .word LBB_MIDS ; MID$ + +; BASIC messages, mostly error messages + +LAB_BAER + .word ERR_NF ;$00 NEXT without FOR + .word ERR_SN ;$02 syntax + .word ERR_RG ;$04 RETURN without GOSUB + .word ERR_OD ;$06 out of data + .word ERR_FC ;$08 function call + .word ERR_OV ;$0A overflow + .word ERR_OM ;$0C out of memory + .word ERR_US ;$0E undefined statement + .word ERR_BS ;$10 array bounds + .word ERR_DD ;$12 double dimension array + .word ERR_D0 ;$14 divide by 0 + .word ERR_ID ;$16 illegal direct + .word ERR_TM ;$18 type mismatch + .word ERR_LS ;$1A long string + .word ERR_ST ;$1C string too complex + .word ERR_CN ;$1E continue error + .word ERR_UF ;$20 undefined function + .word ERR_LD ;$22 LOOP without DO + +; I may implement these two errors to force definition of variables and +; dimensioning of arrays before use. + +; .word ERR_UV ;$24 undefined variable + +; the above error has been tested and works (see code and comments below LAB_1D8B) + +; .word ERR_UA ;$26 undimensioned array + +ERR_NF .text "NEXT without FOR",$00 +ERR_SN .text "Syntax",$00 +ERR_RG .text "RETURN without GOSUB",$00 +ERR_OD .text "Out of DATA",$00 +ERR_FC .text "Function call",$00 +ERR_OV .text "Overflow",$00 +ERR_OM .text "Out of memory",$00 +ERR_US .text "Undefined statement",$00 +ERR_BS .text "Array bounds",$00 +ERR_DD .text "Double dimension",$00 +ERR_D0 .text "Divide by zero",$00 +ERR_ID .text "Illegal direct",$00 +ERR_TM .text "Type mismatch",$00 +ERR_LS .text "String too long",$00 +ERR_ST .text "String too complex",$00 +ERR_CN .text "Can't continue",$00 +ERR_UF .text "Undefined function",$00 +ERR_LD .text "LOOP without DO",$00 + +;ERR_UV .text "Undefined variable",$00 + +; the above error has been tested and works (see code and comments below LAB_1D8B) + +;ERR_UA .text "Undimensioned array",$00 + +LAB_BMSG .text $0D,$0A,"Break",$00 +LAB_EMSG .text " Error",$00 +LAB_LMSG .text " in line ",$00 +LAB_RMSG .text $0D,$0A,"Ready",$0D,$0A,$00 + +LAB_IMSG .text " Extra ignored",$0D,$0A,$00 +LAB_REDO .text " Redo from start",$0D,$0A,$00 + +AA_end_basic diff --git a/src/ehbasic/main.asm b/src/ehbasic/main.asm new file mode 100644 index 0000000..bca6f0d --- /dev/null +++ b/src/ehbasic/main.asm @@ -0,0 +1,133 @@ +; minimal monitor for EhBASIC and 6502 simulator V1.05 +; tabs converted to space, tabwidth=6 + +; To run EhBASIC on the simulator load and assemble [F7] this file, start the simulator +; running [F6] then start the code with the RESET [CTRL][SHIFT]R. Just selecting RUN +; will do nothing, you'll still have to do a reset to run the code. + + .include "basic-patched.asm" + +; put the IRQ and MNI code in RAM so that it can be changed + +IRQ_vec = VEC_SV+2 ; IRQ code vector +NMI_vec = IRQ_vec+$0A ; NMI code vector + +; setup for the 6502 simulator environment + +IO_AREA = $F000 ; set I/O area for this monitor + +ACIAsimwr = $d00a ; simulated ACIA write port (display char out) +ACIAsimrd = $d400 ; simulated ACIA read port (keyboard input char) + +; now the code. all this does is set up the vectors and interrupt code +; and wait for the user to select [C]old or [W]arm start. nothing else +; fits in less than 128 bytes + + *= $FF80 ; pretend this is in a 1/8K ROM + +; reset vector points here + +RES_vec + CLD ; clear decimal mode + LDX #$FF ; empty stack + TXS ; set the stack + +; set up vectors and interrupt code, copy them to page 2 + + LDY #END_CODE-LAB_vec ; set index/count +LAB_stlp + LDA LAB_vec-1,Y ; get byte from interrupt code + STA VEC_IN-1,Y ; save to RAM + DEY ; decrement index/count + BNE LAB_stlp ; loop if more to do + +; now do the signon message, Y = $00 here + +LAB_signon + LDA LAB_mess,Y ; get byte from sign on message + BEQ LAB_nokey ; exit loop if done + + JSR V_OUTP ; output character + INY ; increment index + BNE LAB_signon ; loop, branch always + +LAB_nokey + JSR V_INPT ; call scan input device + BCC LAB_nokey ; loop if no key + + AND #$DF ; mask xx0x xxxx, ensure upper case + CMP #'W' ; compare with [W]arm start + BEQ LAB_dowarm ; branch if [W]arm start + + CMP #'C' ; compare with [C]old start + BNE RES_vec ; loop if not [C]old start + + JMP LAB_COLD ; do EhBASIC cold start + +LAB_dowarm + JMP LAB_WARM ; do EhBASIC warm start + +; byte out to simulated ACIA + +ACIAout + STA ACIAsimwr ; save byte to simulated ACIA + RTS + +; byte in from simulated ACIA + +ACIAin + LDA ACIAsimrd ; get byte from simulated ACIA + BEQ LAB_nobyw ; branch if no byte waiting + + SEC ; flag byte received + RTS + +LAB_nobyw + CLC ; flag no byte received +no_load ; empty load vector for EhBASIC +no_save ; empty save vector for EhBASIC + RTS + +; vector tables + +LAB_vec + .word ACIAin ; byte in from simulated ACIA + .word ACIAout ; byte out to simulated ACIA + .word no_load ; null load vector for EhBASIC + .word no_save ; null save vector for EhBASIC + +; EhBASIC IRQ support + +IRQ_CODE + PHA ; save A + LDA IrqBase ; get the IRQ flag byte + LSR ; shift the set b7 to b6, and on down ... + ORA IrqBase ; OR the original back in + STA IrqBase ; save the new IRQ flag byte + PLA ; restore A + RTI + +; EhBASIC NMI support + +NMI_CODE + PHA ; save A + LDA NmiBase ; get the NMI flag byte + LSR ; shift the set b7 to b6, and on down ... + ORA NmiBase ; OR the original back in + STA NmiBase ; save the new NMI flag byte + PLA ; restore A + RTI + +END_CODE + +LAB_mess + .text $0D,$0A,"6502 EhBASIC [C]old/[W]arm ?",$00 + ; sign on string + +; system vectors + + *= $FFFA + + .word NMI_vec ; NMI vector + .word RES_vec ; RESET vector + .word IRQ_vec ; IRQ vector diff --git a/src/main/kotlin/razorvine/c64emu/GUI.kt b/src/main/kotlin/razorvine/c64emu/GUI.kt new file mode 100644 index 0000000..4f90ee7 --- /dev/null +++ b/src/main/kotlin/razorvine/c64emu/GUI.kt @@ -0,0 +1,247 @@ +package razorvine.c64emu + +import razorvine.ksim65.components.MemoryComponent +import java.awt.* +import java.awt.image.BufferedImage +import java.awt.event.* +import java.awt.image.ByteLookupTable +import java.awt.image.LookupOp +import java.io.CharConversionException +import java.util.* +import javax.swing.* +import javax.swing.Timer + + +/** + * Define the C64 character screen matrix: 320x200 pixels, + * 40x25 characters (of 8x8 pixels), and a colored border. + */ +object ScreenDefs { + const val SCREEN_WIDTH_CHARS = 40 + const val SCREEN_HEIGHT_CHARS = 25 + const val SCREEN_WIDTH = SCREEN_WIDTH_CHARS * 8 + const val SCREEN_HEIGHT = SCREEN_HEIGHT_CHARS * 8 + const val DISPLAY_PIXEL_SCALING: Double = 2.0 + + val colorPalette = listOf( // this is Pepto's Commodore-64 palette http://www.pepto.de/projects/colorvic/ + Color(0x000000), // 0 = black + Color(0xFFFFFF), // 1 = white + Color(0x813338), // 2 = red + Color(0x75cec8), // 3 = cyan + Color(0x8e3c97), // 4 = purple + Color(0x56ac4d), // 5 = green + Color(0x2e2c9b), // 6 = blue + Color(0xedf171), // 7 = yellow + Color(0x8e5029), // 8 = orange + Color(0x553800), // 9 = brown + Color(0xc46c71), // 10 = light red + Color(0x4a4a4a), // 11 = dark grey + Color(0x7b7b7b), // 12 = medium grey + Color(0xa9ff9f), // 13 = light green + Color(0x706deb), // 14 = light blue + Color(0xb2b2b2) // 15 = light grey + ) +} + +private class BitmapScreenPanel(val chargenData: ByteArray, val ram: MemoryComponent) : JPanel() { + + private val image = BufferedImage(ScreenDefs.SCREEN_WIDTH, ScreenDefs.SCREEN_HEIGHT, BufferedImage.TYPE_INT_ARGB) + private val g2d = image.graphics as Graphics2D + private val normalCharacters = loadCharacters(false) + + init { + val size = Dimension( + (image.width * ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), + (image.height * ScreenDefs.DISPLAY_PIXEL_SCALING).toInt() + ) + minimumSize = size + maximumSize = size + preferredSize = size + isFocusable = true + requestFocusInWindow() + } + + private fun loadCharacters(shifted: Boolean): Array { + val chars = Array(256) { BufferedImage(8, 8, BufferedImage.TYPE_BYTE_BINARY) } + val offset = if(shifted) 256*8 else 0 + // val color = ScreenDefs.colorPalette[14].rgb + for(char in 0..255) { + for(line in 0..7) { + val charbyte = chargenData[offset + char*8 + line].toInt() + for(x in 0..7) { + if(charbyte and (0b10000000 ushr x) !=0 ) + chars[char].setRGB(x, line, 0xffffff) + } + } + } + return chars + } + + override fun paint(graphics: Graphics?) { + redrawCharacters() + val g2d = graphics as Graphics2D? + g2d!!.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF) + g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE) + g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC) + g2d.drawImage( + image, 0, 0, (image.width * ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), + (image.height * ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), null + ) + } + + private fun redrawCharacters() { + val screen = 0x0400 + val colors = 0xd800 + g2d.background = ScreenDefs.colorPalette[ram[0xd021].toInt()] + g2d.clearRect(0, 0, ScreenDefs.SCREEN_WIDTH, ScreenDefs.SCREEN_HEIGHT) + for(y in 0 until ScreenDefs.SCREEN_HEIGHT_CHARS) { + for(x in 0 until ScreenDefs.SCREEN_WIDTH_CHARS) { + val char = ram[screen + x + y*ScreenDefs.SCREEN_WIDTH_CHARS].toInt() + val color = ram[colors + x + y*ScreenDefs.SCREEN_WIDTH_CHARS].toInt() + drawColoredChar(x, y, char, color and 15) + } + } + } + + private val coloredCharacters = mutableMapOf, BufferedImage>() + + private fun drawColoredChar(x: Int, y: Int, char: Int, color: Int) { + var cached = coloredCharacters[Pair(char, color)] + if(cached==null) { + cached = normalCharacters.get(char) + val colored = g2d.deviceConfiguration.createCompatibleImage(8, 8, BufferedImage.BITMASK) + val sourceRaster = cached.raster + val coloredRaster = colored.raster + val pixelArray = IntArray(4) + val javaColor = ScreenDefs.colorPalette[color] + val coloredPixel = listOf(javaColor.red, javaColor.green, javaColor.blue, javaColor.alpha).toIntArray() + for(y in 0..7) { + for(x in 0..7) { + val source = sourceRaster.getPixel(x, y, pixelArray) + if(source[0]!=0) { + coloredRaster.setPixel(x, y, coloredPixel) + } + } + } + coloredCharacters[Pair(char, color)] = colored + cached = colored + } + g2d.drawImage(cached, x * 8, y * 8, null) + } +} + +class MainWindow(title: String, chargenData: ByteArray, val ram: MemoryComponent) : JFrame(title), KeyListener { + private val canvas = BitmapScreenPanel(chargenData, ram) + val keyboardBuffer = ArrayDeque() + private var borderTop: JPanel + private var borderBottom: JPanel + private var borderLeft: JPanel + private var borderRight: JPanel + + init { + val borderWidth = 24 + layout = GridBagLayout() + defaultCloseOperation = EXIT_ON_CLOSE + isResizable = false + isFocusable = true + + // the borders (top, left, right, bottom) + borderTop = JPanel().apply { + preferredSize = Dimension( + (ScreenDefs.DISPLAY_PIXEL_SCALING * (ScreenDefs.SCREEN_WIDTH + 2 * borderWidth)).toInt(), + (ScreenDefs.DISPLAY_PIXEL_SCALING * borderWidth).toInt() + ) + background = ScreenDefs.colorPalette[14] + } + borderBottom = JPanel().apply { + preferredSize = Dimension( + (ScreenDefs.DISPLAY_PIXEL_SCALING * (ScreenDefs.SCREEN_WIDTH + 2 * borderWidth)).toInt(), + (ScreenDefs.DISPLAY_PIXEL_SCALING * borderWidth).toInt() + ) + background = ScreenDefs.colorPalette[14] + } + borderLeft = JPanel().apply { + preferredSize = Dimension( + (ScreenDefs.DISPLAY_PIXEL_SCALING * borderWidth).toInt(), + (ScreenDefs.DISPLAY_PIXEL_SCALING * ScreenDefs.SCREEN_HEIGHT).toInt() + ) + background = ScreenDefs.colorPalette[14] + } + borderRight = JPanel().apply { + preferredSize = Dimension( + (ScreenDefs.DISPLAY_PIXEL_SCALING * borderWidth).toInt(), + (ScreenDefs.DISPLAY_PIXEL_SCALING * ScreenDefs.SCREEN_HEIGHT).toInt() + ) + background = ScreenDefs.colorPalette[14] + } + var c = GridBagConstraints() + c.gridx = 0; c.gridy = 1; c.gridwidth = 3 + add(borderTop, c) + c = GridBagConstraints() + c.gridx = 0; c.gridy = 2 + add(borderLeft, c) + c = GridBagConstraints() + c.gridx = 2; c.gridy = 2 + add(borderRight, c) + c = GridBagConstraints() + c.gridx = 0; c.gridy = 3; c.gridwidth = 3 + add(borderBottom, c) + // the screen canvas(bitmap) + c = GridBagConstraints() + c.gridx = 1; c.gridy = 2 + add(canvas, c) + addKeyListener(this) + pack() + setLocationRelativeTo(null) + setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, mutableSetOf()) + setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, mutableSetOf()) + requestFocusInWindow() + } + + fun start() { + // repaint the screen's back buffer ~60 times per second + val repaintTimer = Timer(1000 / 60) { + repaint() + borderTop.background = ScreenDefs.colorPalette[ram[0xd020].toInt() and 15] + borderBottom.background = ScreenDefs.colorPalette[ram[0xd020].toInt() and 15] + borderLeft.background = ScreenDefs.colorPalette[ram[0xd020].toInt() and 15] + borderRight.background = ScreenDefs.colorPalette[ram[0xd020].toInt() and 15] + + if(keyboardBuffer.isNotEmpty()) { + // inject keystrokes directly into the c64's keyboard buffer (translate to petscii first) + var kbbLen = ram[0xc6] + while(kbbLen<=10 && keyboardBuffer.isNotEmpty()) { + try { + val char = keyboardBuffer.pop() + // print("CHAR: '$char' ${char.toShort()} -> ") + val petscii = when(char) { + '\n' -> 13 // enter + '\b' -> 20 // backspace ('delete') + else -> Petscii.encodePetscii(char.toString(), true)[0] + } + // println("$petscii") + ram[0x277 + kbbLen] = petscii + kbbLen++ + } catch(ccx: CharConversionException) { + // ignore character + // println("ignored") + } + } + ram[0xc6] = kbbLen + } + } + repaintTimer.initialDelay = 0 + repaintTimer.start() + } + + // keyboard events: + override fun keyTyped(event: KeyEvent) { + // println("KEY TYPED: $event '${event.keyChar}'") + keyboardBuffer.add(event.keyChar) + while (keyboardBuffer.size > 8) + keyboardBuffer.pop() + } + + override fun keyPressed(event: KeyEvent) {} + override fun keyReleased(event: KeyEvent) {} +} diff --git a/src/main/kotlin/razorvine/c64emu/Petscii.kt b/src/main/kotlin/razorvine/c64emu/Petscii.kt new file mode 100644 index 0000000..e614b33 --- /dev/null +++ b/src/main/kotlin/razorvine/c64emu/Petscii.kt @@ -0,0 +1,1121 @@ +package razorvine.c64emu + +import java.io.CharConversionException + +object Petscii { + + // decoding: from Petscii/Screencodes (0-255) to unicode + // character tables used from https://github.com/dj51d/cbmcodecs + + private val decodingPetsciiLowercase = arrayOf( + '\u0000', // 0x00 -> \u0000 + '\ufffe', // 0x01 -> UNDEFINED + '\ufffe', // 0x02 -> UNDEFINED + '\ufffe', // 0x03 -> UNDEFINED + '\ufffe', // 0x04 -> UNDEFINED + '\uf100', // 0x05 -> WHITE COLOR SWITCH (CUS) + '\ufffe', // 0x06 -> UNDEFINED + '\ufffe', // 0x07 -> UNDEFINED + '\uf118', // 0x08 -> DISABLE CHARACTER SET SWITCHING (CUS) + '\uf119', // 0x09 -> ENABLE CHARACTER SET SWITCHING (CUS) + '\ufffe', // 0x0A -> UNDEFINED + '\ufffe', // 0x0B -> UNDEFINED + '\ufffe', // 0x0C -> UNDEFINED + '\r' , // 0x0D -> CARRIAGE RETURN + '\u000e', // 0x0E -> SHIFT OUT + '\ufffe', // 0x0F -> UNDEFINED + '\ufffe', // 0x10 -> UNDEFINED + '\uf11c', // 0x11 -> CURSOR DOWN (CUS) + '\uf11a', // 0x12 -> REVERSE VIDEO ON (CUS) + '\uf120', // 0x13 -> HOME (CUS) + '\u007f', // 0x14 -> DELETE + '\ufffe', // 0x15 -> UNDEFINED + '\ufffe', // 0x16 -> UNDEFINED + '\ufffe', // 0x17 -> UNDEFINED + '\ufffe', // 0x18 -> UNDEFINED + '\ufffe', // 0x19 -> UNDEFINED + '\ufffe', // 0x1A -> UNDEFINED + '\ufffe', // 0x1B -> UNDEFINED + '\uf101', // 0x1C -> RED COLOR SWITCH (CUS) + '\uf11d', // 0x1D -> CURSOR RIGHT (CUS) + '\uf102', // 0x1E -> GREEN COLOR SWITCH (CUS) + '\uf103', // 0x1F -> BLUE COLOR SWITCH (CUS) + ' ' , // 0x20 -> SPACE + '!' , // ! 0x21 -> EXCLAMATION MARK + '"' , // " 0x22 -> QUOTATION MARK + '#' , // # 0x23 -> NUMBER SIGN + '$' , // $ 0x24 -> DOLLAR SIGN + '%' , // % 0x25 -> PERCENT SIGN + '&' , // & 0x26 -> AMPERSAND + '\'' , // ' 0x27 -> APOSTROPHE + '(' , // ( 0x28 -> LEFT PARENTHESIS + ')' , // ) 0x29 -> RIGHT PARENTHESIS + '*' , // * 0x2A -> ASTERISK + '+' , // + 0x2B -> PLUS SIGN + ',' , // , 0x2C -> COMMA + '-' , // - 0x2D -> HYPHEN-MINUS + '.' , // . 0x2E -> FULL STOP + '/' , // / 0x2F -> SOLIDUS + '0' , // 0 0x30 -> DIGIT ZERO + '1' , // 1 0x31 -> DIGIT ONE + '2' , // 2 0x32 -> DIGIT TWO + '3' , // 3 0x33 -> DIGIT THREE + '4' , // 4 0x34 -> DIGIT FOUR + '5' , // 5 0x35 -> DIGIT FIVE + '6' , // 6 0x36 -> DIGIT SIX + '7' , // 7 0x37 -> DIGIT SEVEN + '8' , // 8 0x38 -> DIGIT EIGHT + '9' , // 9 0x39 -> DIGIT NINE + ':' , // : 0x3A -> COLON + ';' , // ; 0x3B -> SEMICOLON + '<' , // < 0x3C -> LESS-THAN SIGN + '=' , // = 0x3D -> EQUALS SIGN + '>' , // > 0x3E -> GREATER-THAN SIGN + '?' , // ? 0x3F -> QUESTION MARK + '@' , // @ 0x40 -> COMMERCIAL AT + 'a' , // a 0x41 -> LATIN SMALL LETTER A + 'b' , // b 0x42 -> LATIN SMALL LETTER B + 'c' , // c 0x43 -> LATIN SMALL LETTER C + 'd' , // d 0x44 -> LATIN SMALL LETTER D + 'e' , // e 0x45 -> LATIN SMALL LETTER E + 'f' , // f 0x46 -> LATIN SMALL LETTER F + 'g' , // g 0x47 -> LATIN SMALL LETTER G + 'h' , // h 0x48 -> LATIN SMALL LETTER H + 'i' , // i 0x49 -> LATIN SMALL LETTER I + 'j' , // j 0x4A -> LATIN SMALL LETTER J + 'k' , // k 0x4B -> LATIN SMALL LETTER K + 'l' , // l 0x4C -> LATIN SMALL LETTER L + 'm' , // m 0x4D -> LATIN SMALL LETTER M + 'n' , // n 0x4E -> LATIN SMALL LETTER N + 'o' , // o 0x4F -> LATIN SMALL LETTER O + 'p' , // p 0x50 -> LATIN SMALL LETTER P + 'q' , // q 0x51 -> LATIN SMALL LETTER Q + 'r' , // r 0x52 -> LATIN SMALL LETTER R + 's' , // s 0x53 -> LATIN SMALL LETTER S + 't' , // t 0x54 -> LATIN SMALL LETTER T + 'u' , // u 0x55 -> LATIN SMALL LETTER U + 'v' , // v 0x56 -> LATIN SMALL LETTER V + 'w' , // w 0x57 -> LATIN SMALL LETTER W + 'x' , // x 0x58 -> LATIN SMALL LETTER X + 'y' , // y 0x59 -> LATIN SMALL LETTER Y + 'z' , // z 0x5A -> LATIN SMALL LETTER Z + '[' , // [ 0x5B -> LEFT SQUARE BRACKET + '\u00a3', // £ 0x5C -> POUND SIGN + ']' , // ] 0x5D -> RIGHT SQUARE BRACKET + '\u2191', // ↑ 0x5E -> UPWARDS ARROW + '\u2190', // ← 0x5F -> LEFTWARDS ARROW + '\u2500', // ─ 0x60 -> BOX DRAWINGS LIGHT HORIZONTAL + 'A' , // A 0x61 -> LATIN CAPITAL LETTER A + 'B' , // B 0x62 -> LATIN CAPITAL LETTER B + 'C' , // C 0x63 -> LATIN CAPITAL LETTER C + 'D' , // D 0x64 -> LATIN CAPITAL LETTER D + 'E' , // E 0x65 -> LATIN CAPITAL LETTER E + 'F' , // F 0x66 -> LATIN CAPITAL LETTER F + 'G' , // G 0x67 -> LATIN CAPITAL LETTER G + 'H' , // H 0x68 -> LATIN CAPITAL LETTER H + 'I' , // I 0x69 -> LATIN CAPITAL LETTER I + 'J' , // J 0x6A -> LATIN CAPITAL LETTER J + 'K' , // K 0x6B -> LATIN CAPITAL LETTER K + 'L' , // L 0x6C -> LATIN CAPITAL LETTER L + 'M' , // M 0x6D -> LATIN CAPITAL LETTER M + 'N' , // N 0x6E -> LATIN CAPITAL LETTER N + 'O' , // O 0x6F -> LATIN CAPITAL LETTER O + 'P' , // P 0x70 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0x71 -> LATIN CAPITAL LETTER Q + 'R' , // R 0x72 -> LATIN CAPITAL LETTER R + 'S' , // S 0x73 -> LATIN CAPITAL LETTER S + 'T' , // T 0x74 -> LATIN CAPITAL LETTER T + 'U' , // U 0x75 -> LATIN CAPITAL LETTER U + 'V' , // V 0x76 -> LATIN CAPITAL LETTER V + 'W' , // W 0x77 -> LATIN CAPITAL LETTER W + 'X' , // X 0x78 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0x79 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0x7A -> LATIN CAPITAL LETTER Z + '\u253c', // ┼ 0x7B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0x7C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0x7D -> BOX DRAWINGS LIGHT VERTICAL + '\u2592', // ▒ 0x7E -> MEDIUM SHADE + '\uf139', //  0x7F -> MEDIUM SHADE SLASHED LEFT (CUS) + '\ufffe', // 0x80 -> UNDEFINED + '\uf104', // 0x81 -> ORANGE COLOR SWITCH (CUS) + '\ufffe', // 0x82 -> UNDEFINED + '\ufffe', // 0x83 -> UNDEFINED + '\ufffe', // 0x84 -> UNDEFINED + '\uf110', //  0x85 -> FUNCTION KEY 1 (CUS) + '\uf112', //  0x86 -> FUNCTION KEY 3 (CUS) + '\uf114', //  0x87 -> FUNCTION KEY 5 (CUS) + '\uf116', //  0x88 -> FUNCTION KEY 7 (CUS) + '\uf111', //  0x89 -> FUNCTION KEY 2 (CUS) + '\uf113', //  0x8A -> FUNCTION KEY 4 (CUS) + '\uf115', //  0x8B -> FUNCTION KEY 6 (CUS) + '\uf117', //  0x8C -> FUNCTION KEY 8 (CUS) + '\n' , // 0x8D -> LINE FEED + '\u000f', //  0x8E -> SHIFT IN + '\ufffe', // 0x8F -> UNDEFINED + '\uf105', // 0x90 -> BLACK COLOR SWITCH (CUS) + '\uf11e', //  0x91 -> CURSOR UP (CUS) + '\uf11b', //  0x92 -> REVERSE VIDEO OFF (CUS) + '\u000c', // 0x93 -> FORM FEED + '\uf121', //  0x94 -> INSERT (CUS) + '\uf106', // 0x95 -> BROWN COLOR SWITCH (CUS) + '\uf107', // 0x96 -> LIGHT RED COLOR SWITCH (CUS) + '\uf108', // 0x97 -> GRAY 1 COLOR SWITCH (CUS) + '\uf109', //  0x98 -> GRAY 2 COLOR SWITCH (CUS) + '\uf10a', //  0x99 -> LIGHT GREEN COLOR SWITCH (CUS) + '\uf10b', //  0x9A -> LIGHT BLUE COLOR SWITCH (CUS) + '\uf10c', //  0x9B -> GRAY 3 COLOR SWITCH (CUS) + '\uf10d', //  0x9C -> PURPLE COLOR SWITCH (CUS) + '\uf11d', //  0x9D -> CURSOR LEFT (CUS) + '\uf10e', //  0x9E -> YELLOW COLOR SWITCH (CUS) + '\uf10f', //  0x9F -> CYAN COLOR SWITCH (CUS) + '\u00a0', // 0xA0 -> NO-BREAK SPACE + '\u258c', // ▌ 0xA1 -> LEFT HALF BLOCK + '\u2584', // ▄ 0xA2 -> LOWER HALF BLOCK + '\u2594', // ▔ 0xA3 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0xA4 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0xA5 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0xA6 -> MEDIUM SHADE + '\u2595', // ▕ 0xA7 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0xA8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\uf13a', //  0xA9 -> MEDIUM SHADE SLASHED RIGHT (CUS) + '\uf130', //  0xAA -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0xAB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0xAC -> QUADRANT LOWER RIGHT + '\u2514', // └ 0xAD -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0xAE -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0xAF -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0xB0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0xB1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0xB2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0xB3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0xB4 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0xB5 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0xB6 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0xB7 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0xB8 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0xB9 -> LOWER THREE EIGHTHS BLOCK + '\u2713', // ✓ 0xBA -> CHECK MARK + '\u2596', // ▖ 0xBB -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0xBC -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0xBD -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0xBE -> QUADRANT UPPER LEFT + '\u259a', // ▚ 0xBF -> QUADRANT UPPER LEFT AND LOWER RIGHT + '\u2500', // ─ 0xC0 -> BOX DRAWINGS LIGHT HORIZONTAL + 'A' , // A 0xC1 -> LATIN CAPITAL LETTER A + 'B' , // B 0xC2 -> LATIN CAPITAL LETTER B + 'C' , // C 0xC3 -> LATIN CAPITAL LETTER C + 'D' , // D 0xC4 -> LATIN CAPITAL LETTER D + 'E' , // E 0xC5 -> LATIN CAPITAL LETTER E + 'F' , // F 0xC6 -> LATIN CAPITAL LETTER F + 'G' , // G 0xC7 -> LATIN CAPITAL LETTER G + 'H' , // H 0xC8 -> LATIN CAPITAL LETTER H + 'I' , // I 0xC9 -> LATIN CAPITAL LETTER I + 'J' , // J 0xCA -> LATIN CAPITAL LETTER J + 'K' , // K 0xCB -> LATIN CAPITAL LETTER K + 'L' , // L 0xCC -> LATIN CAPITAL LETTER L + 'M' , // M 0xCD -> LATIN CAPITAL LETTER M + 'N' , // N 0xCE -> LATIN CAPITAL LETTER N + 'O' , // O 0xCF -> LATIN CAPITAL LETTER O + 'P' , // P 0xD0 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0xD1 -> LATIN CAPITAL LETTER Q + 'R' , // R 0xD2 -> LATIN CAPITAL LETTER R + 'S' , // S 0xD3 -> LATIN CAPITAL LETTER S + 'T' , // T 0xD4 -> LATIN CAPITAL LETTER T + 'U' , // U 0xD5 -> LATIN CAPITAL LETTER U + 'V' , // V 0xD6 -> LATIN CAPITAL LETTER V + 'W' , // W 0xD7 -> LATIN CAPITAL LETTER W + 'X' , // X 0xD8 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0xD9 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0xDA -> LATIN CAPITAL LETTER Z + '\u253c', // ┼ 0xDB -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0xDC -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0xDD -> BOX DRAWINGS LIGHT VERTICAL + '\u2592', // ▒ 0xDE -> MEDIUM SHADE + '\uf139', //  0xDF -> MEDIUM SHADE SLASHED LEFT (CUS) + '\u00a0', // 0xE0 -> NO-BREAK SPACE + '\u258c', // ▌ 0xE1 -> LEFT HALF BLOCK + '\u2584', // ▄ 0xE2 -> LOWER HALF BLOCK + '\u2594', // ▔ 0xE3 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0xE4 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0xE5 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0xE6 -> MEDIUM SHADE + '\u2595', // ▕ 0xE7 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0xE8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\uf13a', //  0xE9 -> MEDIUM SHADE SLASHED RIGHT (CUS) + '\uf130', //  0xEA -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0xEB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0xEC -> QUADRANT LOWER RIGHT + '\u2514', // └ 0xED -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0xEE -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0xEF -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0xF0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0xF1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0xF2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0xF3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0xF4 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0xF5 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0xF6 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0xF7 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0xF8 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0xF9 -> LOWER THREE EIGHTHS BLOCK + '\u2713', // ✓ 0xFA -> CHECK MARK + '\u2596', // ▖ 0xFB -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0xFC -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0xFD -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0xFE -> QUADRANT UPPER LEFT + '\u2592' // ▒ 0xFF -> MEDIUM SHADE + ) + + private val decodingPetsciiUppercase = arrayOf( + '\u0000', // 0x00 -> \u0000 + '\ufffe', // 0x01 -> UNDEFINED + '\ufffe', // 0x02 -> UNDEFINED + '\ufffe', // 0x03 -> UNDEFINED + '\ufffe', // 0x04 -> UNDEFINED + '\uf100', // 0x05 -> WHITE COLOR SWITCH (CUS) + '\ufffe', // 0x06 -> UNDEFINED + '\ufffe', // 0x07 -> UNDEFINED + '\uf118', // 0x08 -> DISABLE CHARACTER SET SWITCHING (CUS) + '\uf119', // 0x09 -> ENABLE CHARACTER SET SWITCHING (CUS) + '\ufffe', // 0x0A -> UNDEFINED + '\ufffe', // 0x0B -> UNDEFINED + '\ufffe', // 0x0C -> UNDEFINED + '\r' , // 0x0D -> CARRIAGE RETURN + '\u000e', // 0x0E -> SHIFT OUT + '\ufffe', // 0x0F -> UNDEFINED + '\ufffe', // 0x10 -> UNDEFINED + '\uf11c', // 0x11 -> CURSOR DOWN (CUS) + '\uf11a', // 0x12 -> REVERSE VIDEO ON (CUS) + '\uf120', // 0x13 -> HOME (CUS) + '\u007f', // 0x14 -> DELETE + '\ufffe', // 0x15 -> UNDEFINED + '\ufffe', // 0x16 -> UNDEFINED + '\ufffe', // 0x17 -> UNDEFINED + '\ufffe', // 0x18 -> UNDEFINED + '\ufffe', // 0x19 -> UNDEFINED + '\ufffe', // 0x1A -> UNDEFINED + '\ufffe', // 0x1B -> UNDEFINED + '\uf101', // 0x1C -> RED COLOR SWITCH (CUS) + '\uf11d', // 0x1D -> CURSOR RIGHT (CUS) + '\uf102', // 0x1E -> GREEN COLOR SWITCH (CUS) + '\uf103', // 0x1F -> BLUE COLOR SWITCH (CUS) + ' ' , // 0x20 -> SPACE + '!' , // ! 0x21 -> EXCLAMATION MARK + '"' , // " 0x22 -> QUOTATION MARK + '#' , // # 0x23 -> NUMBER SIGN + '$' , // $ 0x24 -> DOLLAR SIGN + '%' , // % 0x25 -> PERCENT SIGN + '&' , // & 0x26 -> AMPERSAND + '\'' , // ' 0x27 -> APOSTROPHE + '(' , // ( 0x28 -> LEFT PARENTHESIS + ')' , // ) 0x29 -> RIGHT PARENTHESIS + '*' , // * 0x2A -> ASTERISK + '+' , // + 0x2B -> PLUS SIGN + ',' , // , 0x2C -> COMMA + '-' , // - 0x2D -> HYPHEN-MINUS + '.' , // . 0x2E -> FULL STOP + '/' , // / 0x2F -> SOLIDUS + '0' , // 0 0x30 -> DIGIT ZERO + '1' , // 1 0x31 -> DIGIT ONE + '2' , // 2 0x32 -> DIGIT TWO + '3' , // 3 0x33 -> DIGIT THREE + '4' , // 4 0x34 -> DIGIT FOUR + '5' , // 5 0x35 -> DIGIT FIVE + '6' , // 6 0x36 -> DIGIT SIX + '7' , // 7 0x37 -> DIGIT SEVEN + '8' , // 8 0x38 -> DIGIT EIGHT + '9' , // 9 0x39 -> DIGIT NINE + ':' , // : 0x3A -> COLON + ';' , // ; 0x3B -> SEMICOLON + '<' , // < 0x3C -> LESS-THAN SIGN + '=' , // = 0x3D -> EQUALS SIGN + '>' , // > 0x3E -> GREATER-THAN SIGN + '?' , // ? 0x3F -> QUESTION MARK + '@' , // @ 0x40 -> COMMERCIAL AT + 'A' , // A 0x41 -> LATIN CAPITAL LETTER A + 'B' , // B 0x42 -> LATIN CAPITAL LETTER B + 'C' , // C 0x43 -> LATIN CAPITAL LETTER C + 'D' , // D 0x44 -> LATIN CAPITAL LETTER D + 'E' , // E 0x45 -> LATIN CAPITAL LETTER E + 'F' , // F 0x46 -> LATIN CAPITAL LETTER F + 'G' , // G 0x47 -> LATIN CAPITAL LETTER G + 'H' , // H 0x48 -> LATIN CAPITAL LETTER H + 'I' , // I 0x49 -> LATIN CAPITAL LETTER I + 'J' , // J 0x4A -> LATIN CAPITAL LETTER J + 'K' , // K 0x4B -> LATIN CAPITAL LETTER K + 'L' , // L 0x4C -> LATIN CAPITAL LETTER L + 'M' , // M 0x4D -> LATIN CAPITAL LETTER M + 'N' , // N 0x4E -> LATIN CAPITAL LETTER N + 'O' , // O 0x4F -> LATIN CAPITAL LETTER O + 'P' , // P 0x50 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0x51 -> LATIN CAPITAL LETTER Q + 'R' , // R 0x52 -> LATIN CAPITAL LETTER R + 'S' , // S 0x53 -> LATIN CAPITAL LETTER S + 'T' , // T 0x54 -> LATIN CAPITAL LETTER T + 'U' , // U 0x55 -> LATIN CAPITAL LETTER U + 'V' , // V 0x56 -> LATIN CAPITAL LETTER V + 'W' , // W 0x57 -> LATIN CAPITAL LETTER W + 'X' , // X 0x58 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0x59 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0x5A -> LATIN CAPITAL LETTER Z + '[' , // [ 0x5B -> LEFT SQUARE BRACKET + '\u00a3', // £ 0x5C -> POUND SIGN + ']' , // ] 0x5D -> RIGHT SQUARE BRACKET + '\u2191', // ↑ 0x5E -> UPWARDS ARROW + '\u2190', // ← 0x5F -> LEFTWARDS ARROW + '\u2500', // ─ 0x60 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2660', // ♠ 0x61 -> BLACK SPADE SUIT + '\u2502', // │ 0x62 -> BOX DRAWINGS LIGHT VERTICAL + '\u2500', // ─ 0x63 -> BOX DRAWINGS LIGHT HORIZONTAL + '\uf122', //  0x64 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS) + '\uf123', //  0x65 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS) + '\uf124', //  0x66 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS) + '\uf126', //  0x67 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS) + '\uf128', //  0x68 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS) + '\u256e', // ╮ 0x69 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT + '\u2570', // ╰ 0x6A -> BOX DRAWINGS LIGHT ARC UP AND RIGHT + '\u256f', // ╯ 0x6B -> BOX DRAWINGS LIGHT ARC UP AND LEFT + '\uf12a', //  0x6C -> ONE EIGHTH BLOCK UP AND RIGHT (CUS) + '\u2572', // ╲ 0x6D -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + '\u2571', // ╱ 0x6E -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + '\uf12b', //  0x6F -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS) + '\uf12c', //  0x70 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS) + '\u25cf', // ● 0x71 -> BLACK CIRCLE + '\uf125', //  0x72 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS) + '\u2665', // ♥ 0x73 -> BLACK HEART SUIT + '\uf127', //  0x74 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS) + '\u256d', // ╭ 0x75 -> BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + '\u2573', // ╳ 0x76 -> BOX DRAWINGS LIGHT DIAGONAL CROSS + '\u25cb', // ○ 0x77 -> WHITE CIRCLE + '\u2663', // ♣ 0x78 -> BLACK CLUB SUIT + '\uf129', //  0x79 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS) + '\u2666', // ♦ 0x7A -> BLACK DIAMOND SUIT + '\u253c', // ┼ 0x7B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0x7C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0x7D -> BOX DRAWINGS LIGHT VERTICAL + '\u03c0', // π 0x7E -> GREEK SMALL LETTER PI + '\u25e5', // ◥ 0x7F -> BLACK UPPER RIGHT TRIANGLE + '\ufffe', // 0x80 -> UNDEFINED + '\uf104', //  0x81 -> ORANGE COLOR SWITCH (CUS) + '\ufffe', // 0x82 -> UNDEFINED + '\ufffe', // 0x83 -> UNDEFINED + '\ufffe', // 0x84 -> UNDEFINED + '\uf110', // 0x85 -> FUNCTION KEY 1 (CUS) + '\uf112', // 0x86 -> FUNCTION KEY 3 (CUS) + '\uf114', // 0x87 -> FUNCTION KEY 5 (CUS) + '\uf116', // 0x88 -> FUNCTION KEY 7 (CUS) + '\uf111', // 0x89 -> FUNCTION KEY 2 (CUS) + '\uf113', // 0x8A -> FUNCTION KEY 4 (CUS) + '\uf115', // 0x8B -> FUNCTION KEY 6 (CUS) + '\uf117', // 0x8C -> FUNCTION KEY 8 (CUS) + '\n' , // 0x8D -> LINE FEED + '\u000f', // 0x8E -> SHIFT IN + '\ufffe', // 0x8F -> UNDEFINED + '\uf105', // 0x90 -> BLACK COLOR SWITCH (CUS) + '\uf11e', // 0x91 -> CURSOR UP (CUS) + '\uf11b', // 0x92 -> REVERSE VIDEO OFF (CUS) + '\u000c', // 0x93 -> FORM FEED + '\uf121', // 0x94 -> INSERT (CUS) + '\uf106', // 0x95 -> BROWN COLOR SWITCH (CUS) + '\uf107', // 0x96 -> LIGHT RED COLOR SWITCH (CUS) + '\uf108', // 0x97 -> GRAY 1 COLOR SWITCH (CUS) + '\uf109', // 0x98 -> GRAY 2 COLOR SWITCH (CUS) + '\uf10a', // 0x99 -> LIGHT GREEN COLOR SWITCH (CUS) + '\uf10b', // 0x9A -> LIGHT BLUE COLOR SWITCH (CUS) + '\uf10c', // 0x9B -> GRAY 3 COLOR SWITCH (CUS) + '\uf10d', // 0x9C -> PURPLE COLOR SWITCH (CUS) + '\uf11d', // 0x9D -> CURSOR LEFT (CUS) + '\uf10e', // 0x9E -> YELLOW COLOR SWITCH (CUS) + '\uf10f', // 0x9F -> CYAN COLOR SWITCH (CUS) + '\u00a0', // 0xA0 -> NO-BREAK SPACE + '\u258c', // ▌ 0xA1 -> LEFT HALF BLOCK + '\u2584', // ▄ 0xA2 -> LOWER HALF BLOCK + '\u2594', // ▔ 0xA3 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0xA4 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0xA5 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0xA6 -> MEDIUM SHADE + '\u2595', // ▕ 0xA7 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0xA8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\u25e4', // ◤ 0xA9 -> BLACK UPPER LEFT TRIANGLE + '\uf130', //  0xAA -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0xAB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0xAC -> QUADRANT LOWER RIGHT + '\u2514', // └ 0xAD -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0xAE -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0xAF -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0xB0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0xB1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0xB2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0xB3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0xB4 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0xB5 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0xB6 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0xB7 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0xB8 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0xB9 -> LOWER THREE EIGHTHS BLOCK + '\uf12d', //  0xBA -> ONE EIGHTH BLOCK UP AND LEFT (CUS) + '\u2596', // ▖ 0xBB -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0xBC -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0xBD -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0xBE -> QUADRANT UPPER LEFT + '\u259a', // ▚ 0xBF -> QUADRANT UPPER LEFT AND LOWER RIGHT + '\u2500', // ─ 0xC0 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2660', // ♠ 0xC1 -> BLACK SPADE SUIT + '\u2502', // │ 0xC2 -> BOX DRAWINGS LIGHT VERTICAL + '\u2500', // ─ 0xC3 -> BOX DRAWINGS LIGHT HORIZONTAL + '\uf122', //  0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS) + '\uf123', //  0xC5 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS) + '\uf124', //  0xC6 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS) + '\uf126', //  0xC7 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS) + '\uf128', //  0xC8 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS) + '\u256e', // ╮ 0xC9 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT + '\u2570', // ╰ 0xCA -> BOX DRAWINGS LIGHT ARC UP AND RIGHT + '\u256f', // ╯ 0xCB -> BOX DRAWINGS LIGHT ARC UP AND LEFT + '\uf12a', //  0xCC -> ONE EIGHTH BLOCK UP AND RIGHT (CUS) + '\u2572', // ╲ 0xCD -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + '\u2571', // ╱ 0xCE -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + '\uf12b', //  0xCF -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS) + '\uf12c', //  0xD0 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS) + '\u25cf', // ● 0xD1 -> BLACK CIRCLE + '\uf125', //  0xD2 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS) + '\u2665', // ♥ 0xD3 -> BLACK HEART SUIT + '\uf127', //  0xD4 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS) + '\u256d', // ╭ 0xD5 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT + '\u2573', // ╳ 0xD6 -> BOX DRAWINGS LIGHT DIAGONAL CROSS + '\u25cb', // ○ 0xD7 -> WHITE CIRCLE + '\u2663', // ♣ 0xD8 -> BLACK CLUB SUIT + '\uf129', //  0xD9 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS) + '\u2666', // ♦ 0xDA -> BLACK DIAMOND SUIT + '\u253c', // ┼ 0xDB -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0xDC -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0xDD -> BOX DRAWINGS LIGHT VERTICAL + '\u03c0', // π 0xDE -> GREEK SMALL LETTER PI + '\u25e5', // ◥ 0xDF -> BLACK UPPER RIGHT TRIANGLE + '\u00a0', // 0xE0 -> NO-BREAK SPACE + '\u258c', // ▌ 0xE1 -> LEFT HALF BLOCK + '\u2584', // ▄ 0xE2 -> LOWER HALF BLOCK + '\u2594', // ▔ 0xE3 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0xE4 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0xE5 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0xE6 -> MEDIUM SHADE + '\u2595', // ▕ 0xE7 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0xE8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\u25e4', // ◤ 0xE9 -> BLACK UPPER LEFT TRIANGLE + '\uf130', //  0xEA -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0xEB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0xEC -> QUADRANT LOWER RIGHT + '\u2514', // └ 0xED -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0xEE -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0xEF -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0xF0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0xF1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0xF2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0xF3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0xF4 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0xF5 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0xF6 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0xF7 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0xF8 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0xF9 -> LOWER THREE EIGHTHS BLOCK + '\uf12d', //  0xFA -> ONE EIGHTH BLOCK UP AND LEFT (CUS) + '\u2596', // ▖ 0xFB -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0xFC -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0xFD -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0xFE -> QUADRANT UPPER LEFT + '\u03c0' // π 0xFF -> GREEK SMALL LETTER PI + ) + + private val decodingScreencodeLowercase = arrayOf( + '@' , // @ 0x00 -> COMMERCIAL AT + 'a' , // a 0x01 -> LATIN SMALL LETTER A + 'b' , // b 0x02 -> LATIN SMALL LETTER B + 'c' , // c 0x03 -> LATIN SMALL LETTER C + 'd' , // d 0x04 -> LATIN SMALL LETTER D + 'e' , // e 0x05 -> LATIN SMALL LETTER E + 'f' , // f 0x06 -> LATIN SMALL LETTER F + 'g' , // g 0x07 -> LATIN SMALL LETTER G + 'h' , // h 0x08 -> LATIN SMALL LETTER H + 'i' , // i 0x09 -> LATIN SMALL LETTER I + 'j' , // j 0x0A -> LATIN SMALL LETTER J + 'k' , // k 0x0B -> LATIN SMALL LETTER K + 'l' , // l 0x0C -> LATIN SMALL LETTER L + 'm' , // m 0x0D -> LATIN SMALL LETTER M + 'n' , // n 0x0E -> LATIN SMALL LETTER N + 'o' , // o 0x0F -> LATIN SMALL LETTER O + 'p' , // p 0x10 -> LATIN SMALL LETTER P + 'q' , // q 0x11 -> LATIN SMALL LETTER Q + 'r' , // r 0x12 -> LATIN SMALL LETTER R + 's' , // s 0x13 -> LATIN SMALL LETTER S + 't' , // t 0x14 -> LATIN SMALL LETTER T + 'u' , // u 0x15 -> LATIN SMALL LETTER U + 'v' , // v 0x16 -> LATIN SMALL LETTER V + 'w' , // w 0x17 -> LATIN SMALL LETTER W + 'x' , // x 0x18 -> LATIN SMALL LETTER X + 'y' , // y 0x19 -> LATIN SMALL LETTER Y + 'z' , // z 0x1A -> LATIN SMALL LETTER Z + '[' , // [ 0x1B -> LEFT SQUARE BRACKET + '\u00a3', // £ 0x1C -> POUND SIGN + ']' , // ] 0x1D -> RIGHT SQUARE BRACKET + '\u2191', // ↑ 0x1E -> UPWARDS ARROW + '\u2190', // ← 0x1F -> LEFTWARDS ARROW + ' ' , // 0x20 -> SPACE + '!' , // ! 0x21 -> EXCLAMATION MARK + '"' , // " 0x22 -> QUOTATION MARK + '#' , // # 0x23 -> NUMBER SIGN + '$' , // $ 0x24 -> DOLLAR SIGN + '%' , // % 0x25 -> PERCENT SIGN + '&' , // & 0x26 -> AMPERSAND + '\'' , // ' 0x27 -> APOSTROPHE + '(' , // ( 0x28 -> LEFT PARENTHESIS + ')' , // ) 0x29 -> RIGHT PARENTHESIS + '*' , // * 0x2A -> ASTERISK + '+' , // + 0x2B -> PLUS SIGN + ',' , // , 0x2C -> COMMA + '-' , // - 0x2D -> HYPHEN-MINUS + '.' , // . 0x2E -> FULL STOP + '/' , // / 0x2F -> SOLIDUS + '0' , // 0 0x30 -> DIGIT ZERO + '1' , // 1 0x31 -> DIGIT ONE + '2' , // 2 0x32 -> DIGIT TWO + '3' , // 3 0x33 -> DIGIT THREE + '4' , // 4 0x34 -> DIGIT FOUR + '5' , // 5 0x35 -> DIGIT FIVE + '6' , // 6 0x36 -> DIGIT SIX + '7' , // 7 0x37 -> DIGIT SEVEN + '8' , // 8 0x38 -> DIGIT EIGHT + '9' , // 9 0x39 -> DIGIT NINE + ':' , // : 0x3A -> COLON + ';' , // ; 0x3B -> SEMICOLON + '<' , // < 0x3C -> LESS-THAN SIGN + '=' , // = 0x3D -> EQUALS SIGN + '>' , // > 0x3E -> GREATER-THAN SIGN + '?' , // ? 0x3F -> QUESTION MARK + '\u2500', // ─ 0x40 -> BOX DRAWINGS LIGHT HORIZONTAL + 'A' , // A 0x41 -> LATIN CAPITAL LETTER A + 'B' , // B 0x42 -> LATIN CAPITAL LETTER B + 'C' , // C 0x43 -> LATIN CAPITAL LETTER C + 'D' , // D 0x44 -> LATIN CAPITAL LETTER D + 'E' , // E 0x45 -> LATIN CAPITAL LETTER E + 'F' , // F 0x46 -> LATIN CAPITAL LETTER F + 'G' , // G 0x47 -> LATIN CAPITAL LETTER G + 'H' , // H 0x48 -> LATIN CAPITAL LETTER H + 'I' , // I 0x49 -> LATIN CAPITAL LETTER I + 'J' , // J 0x4A -> LATIN CAPITAL LETTER J + 'K' , // K 0x4B -> LATIN CAPITAL LETTER K + 'L' , // L 0x4C -> LATIN CAPITAL LETTER L + 'M' , // M 0x4D -> LATIN CAPITAL LETTER M + 'N' , // N 0x4E -> LATIN CAPITAL LETTER N + 'O' , // O 0x4F -> LATIN CAPITAL LETTER O + 'P' , // P 0x50 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0x51 -> LATIN CAPITAL LETTER Q + 'R' , // R 0x52 -> LATIN CAPITAL LETTER R + 'S' , // S 0x53 -> LATIN CAPITAL LETTER S + 'T' , // T 0x54 -> LATIN CAPITAL LETTER T + 'U' , // U 0x55 -> LATIN CAPITAL LETTER U + 'V' , // V 0x56 -> LATIN CAPITAL LETTER V + 'W' , // W 0x57 -> LATIN CAPITAL LETTER W + 'X' , // X 0x58 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0x59 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0x5A -> LATIN CAPITAL LETTER Z + '\u253c', // ┼ 0x5B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0x5C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0x5D -> BOX DRAWINGS LIGHT VERTICAL + '\u2592', // ▒ 0x5E -> MEDIUM SHADE + '\uf139', //  0x5F -> MEDIUM SHADE SLASHED LEFT (CUS) + '\u00a0', // 0x60 -> NO-BREAK SPACE + '\u258c', // ▌ 0x61 -> LEFT HALF BLOCK + '\u2584', // ▄ 0x62 -> LOWER HALF BLOCK + '\u2594', // ▔ 0x63 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0x64 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0x65 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0x66 -> MEDIUM SHADE + '\u2595', // ▕ 0x67 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0x68 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\uf13a', //  0x69 -> MEDIUM SHADE SLASHED RIGHT (CUS) + '\uf130', //  0x6A -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0x6B -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0x6C -> QUADRANT LOWER RIGHT + '\u2514', // └ 0x6D -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0x6E -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0x6F -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0x70 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0x71 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0x72 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0x73 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0x74 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0x75 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0x76 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0x77 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0x78 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0x79 -> LOWER THREE EIGHTHS BLOCK + '\u2713', // ✓ 0x7A -> CHECK MARK + '\u2596', // ▖ 0x7B -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0x7C -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0x7D -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0x7E -> QUADRANT UPPER LEFT + '\u259a', // ▚ 0x7F -> QUADRANT UPPER LEFT AND LOWER RIGHT + '\ufffe', // 0x80 -> UNDEFINED + '\ufffe', // 0x81 -> UNDEFINED + '\ufffe', // 0x82 -> UNDEFINED + '\ufffe', // 0x83 -> UNDEFINED + '\ufffe', // 0x84 -> UNDEFINED + '\ufffe', // 0x85 -> UNDEFINED + '\ufffe', // 0x86 -> UNDEFINED + '\ufffe', // 0x87 -> UNDEFINED + '\ufffe', // 0x88 -> UNDEFINED + '\ufffe', // 0x89 -> UNDEFINED + '\ufffe', // 0x8A -> UNDEFINED + '\ufffe', // 0x8B -> UNDEFINED + '\ufffe', // 0x8C -> UNDEFINED + '\ufffe', // 0x8D -> UNDEFINED + '\ufffe', // 0x8E -> UNDEFINED + '\ufffe', // 0x8F -> UNDEFINED + '\ufffe', // 0x90 -> UNDEFINED + '\ufffe', // 0x91 -> UNDEFINED + '\ufffe', // 0x92 -> UNDEFINED + '\ufffe', // 0x93 -> UNDEFINED + '\ufffe', // 0x94 -> UNDEFINED + '\ufffe', // 0x95 -> UNDEFINED + '\ufffe', // 0x96 -> UNDEFINED + '\ufffe', // 0x97 -> UNDEFINED + '\ufffe', // 0x98 -> UNDEFINED + '\ufffe', // 0x99 -> UNDEFINED + '\ufffe', // 0x9A -> UNDEFINED + '\ufffe', // 0x9B -> UNDEFINED + '\ufffe', // 0x9C -> UNDEFINED + '\ufffe', // 0x9D -> UNDEFINED + '\ufffe', // 0x9E -> UNDEFINED + '\ufffe', // 0x9F -> UNDEFINED + '\ufffe', // 0xA0 -> UNDEFINED + '\ufffe', // 0xA1 -> UNDEFINED + '\ufffe', // 0xA2 -> UNDEFINED + '\ufffe', // 0xA3 -> UNDEFINED + '\ufffe', // 0xA4 -> UNDEFINED + '\ufffe', // 0xA5 -> UNDEFINED + '\ufffe', // 0xA6 -> UNDEFINED + '\ufffe', // 0xA7 -> UNDEFINED + '\ufffe', // 0xA8 -> UNDEFINED + '\ufffe', // 0xA9 -> UNDEFINED + '\ufffe', // 0xAA -> UNDEFINED + '\ufffe', // 0xAB -> UNDEFINED + '\ufffe', // 0xAC -> UNDEFINED + '\ufffe', // 0xAD -> UNDEFINED + '\ufffe', // 0xAE -> UNDEFINED + '\ufffe', // 0xAF -> UNDEFINED + '\ufffe', // 0xB0 -> UNDEFINED + '\ufffe', // 0xB1 -> UNDEFINED + '\ufffe', // 0xB2 -> UNDEFINED + '\ufffe', // 0xB3 -> UNDEFINED + '\ufffe', // 0xB4 -> UNDEFINED + '\ufffe', // 0xB5 -> UNDEFINED + '\ufffe', // 0xB6 -> UNDEFINED + '\ufffe', // 0xB7 -> UNDEFINED + '\ufffe', // 0xB8 -> UNDEFINED + '\ufffe', // 0xB9 -> UNDEFINED + '\ufffe', // 0xBA -> UNDEFINED + '\ufffe', // 0xBB -> UNDEFINED + '\ufffe', // 0xBC -> UNDEFINED + '\ufffe', // 0xBD -> UNDEFINED + '\ufffe', // 0xBE -> UNDEFINED + '\ufffe', // 0xBF -> UNDEFINED + '\ufffe', // 0xC0 -> UNDEFINED + '\ufffe', // 0xC1 -> UNDEFINED + '\ufffe', // 0xC2 -> UNDEFINED + '\ufffe', // 0xC3 -> UNDEFINED + '\ufffe', // 0xC4 -> UNDEFINED + '\ufffe', // 0xC5 -> UNDEFINED + '\ufffe', // 0xC6 -> UNDEFINED + '\ufffe', // 0xC7 -> UNDEFINED + '\ufffe', // 0xC8 -> UNDEFINED + '\ufffe', // 0xC9 -> UNDEFINED + '\ufffe', // 0xCA -> UNDEFINED + '\ufffe', // 0xCB -> UNDEFINED + '\ufffe', // 0xCC -> UNDEFINED + '\ufffe', // 0xCD -> UNDEFINED + '\ufffe', // 0xCE -> UNDEFINED + '\ufffe', // 0xCF -> UNDEFINED + '\ufffe', // 0xD0 -> UNDEFINED + '\ufffe', // 0xD1 -> UNDEFINED + '\ufffe', // 0xD2 -> UNDEFINED + '\ufffe', // 0xD3 -> UNDEFINED + '\ufffe', // 0xD4 -> UNDEFINED + '\ufffe', // 0xD5 -> UNDEFINED + '\ufffe', // 0xD6 -> UNDEFINED + '\ufffe', // 0xD7 -> UNDEFINED + '\ufffe', // 0xD8 -> UNDEFINED + '\ufffe', // 0xD9 -> UNDEFINED + '\ufffe', // 0xDA -> UNDEFINED + '\ufffe', // 0xDB -> UNDEFINED + '\ufffe', // 0xDC -> UNDEFINED + '\ufffe', // 0xDD -> UNDEFINED + '\ufffe', // 0xDE -> UNDEFINED + '\ufffe', // 0xDF -> UNDEFINED + '\ufffe', // 0xE0 -> UNDEFINED + '\ufffe', // 0xE1 -> UNDEFINED + '\ufffe', // 0xE2 -> UNDEFINED + '\ufffe', // 0xE3 -> UNDEFINED + '\ufffe', // 0xE4 -> UNDEFINED + '\ufffe', // 0xE5 -> UNDEFINED + '\ufffe', // 0xE6 -> UNDEFINED + '\ufffe', // 0xE7 -> UNDEFINED + '\ufffe', // 0xE8 -> UNDEFINED + '\ufffe', // 0xE9 -> UNDEFINED + '\ufffe', // 0xEA -> UNDEFINED + '\ufffe', // 0xEB -> UNDEFINED + '\ufffe', // 0xEC -> UNDEFINED + '\ufffe', // 0xED -> UNDEFINED + '\ufffe', // 0xEE -> UNDEFINED + '\ufffe', // 0xEF -> UNDEFINED + '\ufffe', // 0xF0 -> UNDEFINED + '\ufffe', // 0xF1 -> UNDEFINED + '\ufffe', // 0xF2 -> UNDEFINED + '\ufffe', // 0xF3 -> UNDEFINED + '\ufffe', // 0xF4 -> UNDEFINED + '\ufffe', // 0xF5 -> UNDEFINED + '\ufffe', // 0xF6 -> UNDEFINED + '\ufffe', // 0xF7 -> UNDEFINED + '\ufffe', // 0xF8 -> UNDEFINED + '\ufffe', // 0xF9 -> UNDEFINED + '\ufffe', // 0xFA -> UNDEFINED + '\ufffe', // 0xFB -> UNDEFINED + '\ufffe', // 0xFC -> UNDEFINED + '\ufffe', // 0xFD -> UNDEFINED + '\ufffe', // 0xFE -> UNDEFINED + '\ufffe' // 0xFF -> UNDEFINED + ) + + private val decodingScreencodeUppercase = arrayOf( + '@' , // @ 0x00 -> COMMERCIAL AT + 'A' , // A 0x01 -> LATIN CAPITAL LETTER A + 'B' , // B 0x02 -> LATIN CAPITAL LETTER B + 'C' , // C 0x03 -> LATIN CAPITAL LETTER C + 'D' , // D 0x04 -> LATIN CAPITAL LETTER D + 'E' , // E 0x05 -> LATIN CAPITAL LETTER E + 'F' , // F 0x06 -> LATIN CAPITAL LETTER F + 'G' , // G 0x07 -> LATIN CAPITAL LETTER G + 'H' , // H 0x08 -> LATIN CAPITAL LETTER H + 'I' , // I 0x09 -> LATIN CAPITAL LETTER I + 'J' , // J 0x0A -> LATIN CAPITAL LETTER J + 'K' , // K 0x0B -> LATIN CAPITAL LETTER K + 'L' , // L 0x0C -> LATIN CAPITAL LETTER L + 'M' , // M 0x0D -> LATIN CAPITAL LETTER M + 'N' , // N 0x0E -> LATIN CAPITAL LETTER N + 'O' , // O 0x0F -> LATIN CAPITAL LETTER O + 'P' , // P 0x10 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0x11 -> LATIN CAPITAL LETTER Q + 'R' , // R 0x12 -> LATIN CAPITAL LETTER R + 'S' , // S 0x13 -> LATIN CAPITAL LETTER S + 'T' , // T 0x14 -> LATIN CAPITAL LETTER T + 'U' , // U 0x15 -> LATIN CAPITAL LETTER U + 'V' , // V 0x16 -> LATIN CAPITAL LETTER V + 'W' , // W 0x17 -> LATIN CAPITAL LETTER W + 'X' , // X 0x18 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0x19 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0x1A -> LATIN CAPITAL LETTER Z + '[' , // [ 0x1B -> LEFT SQUARE BRACKET + '\u00a3', // £ 0x1C -> POUND SIGN + ']' , // ] 0x1D -> RIGHT SQUARE BRACKET + '\u2191', // ↑ 0x1E -> UPWARDS ARROW + '\u2190', // ← 0x1F -> LEFTWARDS ARROW + ' ' , // 0x20 -> SPACE + '!' , // ! 0x21 -> EXCLAMATION MARK + '"' , // " 0x22 -> QUOTATION MARK + '#' , // # 0x23 -> NUMBER SIGN + '$' , // $ 0x24 -> DOLLAR SIGN + '%' , // % 0x25 -> PERCENT SIGN + '&' , // & 0x26 -> AMPERSAND + '\'' , // ' 0x27 -> APOSTROPHE + '(' , // ( 0x28 -> LEFT PARENTHESIS + ')' , // ) 0x29 -> RIGHT PARENTHESIS + '*' , // * 0x2A -> ASTERISK + '+' , // + 0x2B -> PLUS SIGN + ',' , // , 0x2C -> COMMA + '-' , // - 0x2D -> HYPHEN-MINUS + '.' , // . 0x2E -> FULL STOP + '/' , // / 0x2F -> SOLIDUS + '0' , // 0 0x30 -> DIGIT ZERO + '1' , // 1 0x31 -> DIGIT ONE + '2' , // 2 0x32 -> DIGIT TWO + '3' , // 3 0x33 -> DIGIT THREE + '4' , // 4 0x34 -> DIGIT FOUR + '5' , // 5 0x35 -> DIGIT FIVE + '6' , // 6 0x36 -> DIGIT SIX + '7' , // 7 0x37 -> DIGIT SEVEN + '8' , // 8 0x38 -> DIGIT EIGHT + '9' , // 9 0x39 -> DIGIT NINE + ':' , // : 0x3A -> COLON + ';' , // ; 0x3B -> SEMICOLON + '<' , // < 0x3C -> LESS-THAN SIGN + '=' , // = 0x3D -> EQUALS SIGN + '>' , // > 0x3E -> GREATER-THAN SIGN + '?' , // ? 0x3F -> QUESTION MARK + '\u2500', // ─ 0x40 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2660', // ♠ 0x41 -> BLACK SPADE SUIT + '\u2502', // │ 0x42 -> BOX DRAWINGS LIGHT VERTICAL + '\u2500', // ─ 0x43 -> BOX DRAWINGS LIGHT HORIZONTAL + '\uf122', //  0x44 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS) + '\uf123', //  0x45 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS) + '\uf124', //  0x46 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS) + '\uf126', //  0x47 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS) + '\uf128', //  0x48 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS) + '\u256e', // ╮ 0x49 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT + '\u2570', // ╰ 0x4A -> BOX DRAWINGS LIGHT ARC UP AND RIGHT + '\u256f', // ╯ 0x4B -> BOX DRAWINGS LIGHT ARC UP AND LEFT + '\uf12a', //  0x4C -> ONE EIGHTH BLOCK UP AND RIGHT (CUS) + '\u2572', // ╲ 0x4D -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + '\u2571', // ╱ 0x4E -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + '\uf12b', //  0x4F -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS) + '\uf12c', //  0x50 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS) + '\u25cf', // ● 0x51 -> BLACK CIRCLE + '\uf125', //  0x52 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS) + '\u2665', // ♥ 0x53 -> BLACK HEART SUIT + '\uf127', //  0x54 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS) + '\u256d', // ╭ 0x55 -> BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + '\u2573', // ╳ 0x56 -> BOX DRAWINGS LIGHT DIAGONAL CROSS + '\u25cb', // ○ 0x57 -> WHITE CIRCLE + '\u2663', // ♣ 0x58 -> BLACK CLUB SUIT + '\uf129', //  0x59 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS) + '\u2666', // ♦ 0x5A -> BLACK DIAMOND SUIT + '\u253c', // ┼ 0x5B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0x5C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0x5D -> BOX DRAWINGS LIGHT VERTICAL + '\u03c0', // π 0x5E -> GREEK SMALL LETTER PI + '\u25e5', // ◥ 0x5F -> BLACK UPPER RIGHT TRIANGLE + '\u00a0', // 0x60 -> NO-BREAK SPACE + '\u258c', // ▌ 0x61 -> LEFT HALF BLOCK + '\u2584', // ▄ 0x62 -> LOWER HALF BLOCK + '\u2594', // ▔ 0x63 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0x64 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0x65 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0x66 -> MEDIUM SHADE + '\u2595', // ▕ 0x67 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0x68 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\u25e4', // ◤ 0x69 -> BLACK UPPER LEFT TRIANGLE + '\uf130', //  0x6A -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0x6B -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0x6C -> QUADRANT LOWER RIGHT + '\u2514', // └ 0x6D -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0x6E -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0x6F -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0x70 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0x71 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0x72 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0x73 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0x74 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0x75 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0x76 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0x77 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0x78 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0x79 -> LOWER THREE EIGHTHS BLOCK + '\uf12d', //  0x7A -> ONE EIGHTH BLOCK UP AND LEFT (CUS) + '\u2596', // ▖ 0x7B -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0x7C -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0x7D -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0x7E -> QUADRANT UPPER LEFT + '\u259a', // ▚ 0x7F -> QUADRANT UPPER LEFT AND LOWER RIGHT + '\ufffe', // 0x80 -> UNDEFINED + '\ufffe', // 0x81 -> UNDEFINED + '\ufffe', // 0x82 -> UNDEFINED + '\ufffe', // 0x83 -> UNDEFINED + '\ufffe', // 0x84 -> UNDEFINED + '\ufffe', // 0x85 -> UNDEFINED + '\ufffe', // 0x86 -> UNDEFINED + '\ufffe', // 0x87 -> UNDEFINED + '\ufffe', // 0x88 -> UNDEFINED + '\ufffe', // 0x89 -> UNDEFINED + '\ufffe', // 0x8A -> UNDEFINED + '\ufffe', // 0x8B -> UNDEFINED + '\ufffe', // 0x8C -> UNDEFINED + '\ufffe', // 0x8D -> UNDEFINED + '\ufffe', // 0x8E -> UNDEFINED + '\ufffe', // 0x8F -> UNDEFINED + '\ufffe', // 0x90 -> UNDEFINED + '\ufffe', // 0x91 -> UNDEFINED + '\ufffe', // 0x92 -> UNDEFINED + '\ufffe', // 0x93 -> UNDEFINED + '\ufffe', // 0x94 -> UNDEFINED + '\ufffe', // 0x95 -> UNDEFINED + '\ufffe', // 0x96 -> UNDEFINED + '\ufffe', // 0x97 -> UNDEFINED + '\ufffe', // 0x98 -> UNDEFINED + '\ufffe', // 0x99 -> UNDEFINED + '\ufffe', // 0x9A -> UNDEFINED + '\ufffe', // 0x9B -> UNDEFINED + '\ufffe', // 0x9C -> UNDEFINED + '\ufffe', // 0x9D -> UNDEFINED + '\ufffe', // 0x9E -> UNDEFINED + '\ufffe', // 0x9F -> UNDEFINED + '\ufffe', // 0xA0 -> UNDEFINED + '\ufffe', // 0xA1 -> UNDEFINED + '\ufffe', // 0xA2 -> UNDEFINED + '\ufffe', // 0xA3 -> UNDEFINED + '\ufffe', // 0xA4 -> UNDEFINED + '\ufffe', // 0xA5 -> UNDEFINED + '\ufffe', // 0xA6 -> UNDEFINED + '\ufffe', // 0xA7 -> UNDEFINED + '\ufffe', // 0xA8 -> UNDEFINED + '\ufffe', // 0xA9 -> UNDEFINED + '\ufffe', // 0xAA -> UNDEFINED + '\ufffe', // 0xAB -> UNDEFINED + '\ufffe', // 0xAC -> UNDEFINED + '\ufffe', // 0xAD -> UNDEFINED + '\ufffe', // 0xAE -> UNDEFINED + '\ufffe', // 0xAF -> UNDEFINED + '\ufffe', // 0xB0 -> UNDEFINED + '\ufffe', // 0xB1 -> UNDEFINED + '\ufffe', // 0xB2 -> UNDEFINED + '\ufffe', // 0xB3 -> UNDEFINED + '\ufffe', // 0xB4 -> UNDEFINED + '\ufffe', // 0xB5 -> UNDEFINED + '\ufffe', // 0xB6 -> UNDEFINED + '\ufffe', // 0xB7 -> UNDEFINED + '\ufffe', // 0xB8 -> UNDEFINED + '\ufffe', // 0xB9 -> UNDEFINED + '\ufffe', // 0xBA -> UNDEFINED + '\ufffe', // 0xBB -> UNDEFINED + '\ufffe', // 0xBC -> UNDEFINED + '\ufffe', // 0xBD -> UNDEFINED + '\ufffe', // 0xBE -> UNDEFINED + '\ufffe', // 0xBF -> UNDEFINED + '\ufffe', // 0xC0 -> UNDEFINED + '\ufffe', // 0xC1 -> UNDEFINED + '\ufffe', // 0xC2 -> UNDEFINED + '\ufffe', // 0xC3 -> UNDEFINED + '\ufffe', // 0xC4 -> UNDEFINED + '\ufffe', // 0xC5 -> UNDEFINED + '\ufffe', // 0xC6 -> UNDEFINED + '\ufffe', // 0xC7 -> UNDEFINED + '\ufffe', // 0xC8 -> UNDEFINED + '\ufffe', // 0xC9 -> UNDEFINED + '\ufffe', // 0xCA -> UNDEFINED + '\ufffe', // 0xCB -> UNDEFINED + '\ufffe', // 0xCC -> UNDEFINED + '\ufffe', // 0xCD -> UNDEFINED + '\ufffe', // 0xCE -> UNDEFINED + '\ufffe', // 0xCF -> UNDEFINED + '\ufffe', // 0xD0 -> UNDEFINED + '\ufffe', // 0xD1 -> UNDEFINED + '\ufffe', // 0xD2 -> UNDEFINED + '\ufffe', // 0xD3 -> UNDEFINED + '\ufffe', // 0xD4 -> UNDEFINED + '\ufffe', // 0xD5 -> UNDEFINED + '\ufffe', // 0xD6 -> UNDEFINED + '\ufffe', // 0xD7 -> UNDEFINED + '\ufffe', // 0xD8 -> UNDEFINED + '\ufffe', // 0xD9 -> UNDEFINED + '\ufffe', // 0xDA -> UNDEFINED + '\ufffe', // 0xDB -> UNDEFINED + '\ufffe', // 0xDC -> UNDEFINED + '\ufffe', // 0xDD -> UNDEFINED + '\ufffe', // 0xDE -> UNDEFINED + '\ufffe', // 0xDF -> UNDEFINED + '\ufffe', // 0xE0 -> UNDEFINED + '\ufffe', // 0xE1 -> UNDEFINED + '\ufffe', // 0xE2 -> UNDEFINED + '\ufffe', // 0xE3 -> UNDEFINED + '\ufffe', // 0xE4 -> UNDEFINED + '\ufffe', // 0xE5 -> UNDEFINED + '\ufffe', // 0xE6 -> UNDEFINED + '\ufffe', // 0xE7 -> UNDEFINED + '\ufffe', // 0xE8 -> UNDEFINED + '\ufffe', // 0xE9 -> UNDEFINED + '\ufffe', // 0xEA -> UNDEFINED + '\ufffe', // 0xEB -> UNDEFINED + '\ufffe', // 0xEC -> UNDEFINED + '\ufffe', // 0xED -> UNDEFINED + '\ufffe', // 0xEE -> UNDEFINED + '\ufffe', // 0xEF -> UNDEFINED + '\ufffe', // 0xF0 -> UNDEFINED + '\ufffe', // 0xF1 -> UNDEFINED + '\ufffe', // 0xF2 -> UNDEFINED + '\ufffe', // 0xF3 -> UNDEFINED + '\ufffe', // 0xF4 -> UNDEFINED + '\ufffe', // 0xF5 -> UNDEFINED + '\ufffe', // 0xF6 -> UNDEFINED + '\ufffe', // 0xF7 -> UNDEFINED + '\ufffe', // 0xF8 -> UNDEFINED + '\ufffe', // 0xF9 -> UNDEFINED + '\ufffe', // 0xFA -> UNDEFINED + '\ufffe', // 0xFB -> UNDEFINED + '\ufffe', // 0xFC -> UNDEFINED + '\ufffe', // 0xFD -> UNDEFINED + '\ufffe', // 0xFE -> UNDEFINED + '\ufffe' // 0xFF -> UNDEFINED + ) + + // encoding: from unicode to Petscii/Screencodes (0-255) + private val encodingPetsciiLowercase = decodingPetsciiLowercase.withIndex().associate{it.value to it.index} + private val encodingPetsciiUppercase = decodingPetsciiUppercase.withIndex().associate{it.value to it.index} + private val encodingScreencodeLowercase = decodingScreencodeLowercase.withIndex().associate{it.value to it.index} + private val encodingScreencodeUppercase = decodingScreencodeUppercase.withIndex().associate{it.value to it.index} + + + fun encodePetscii(text: String, lowercase: Boolean = false): List { + val lookup = if(lowercase) encodingPetsciiLowercase else encodingPetsciiUppercase + return text.map { + val petscii = lookup[it] + petscii?.toShort() ?: if(it=='\u0000') + 0.toShort() + else { + val case = if (lowercase) "lower" else "upper" + throw CharConversionException("no ${case}case Petscii character for '$it'") + } + } + } + + fun decodePetscii(petscii: Iterable, lowercase: Boolean = false): String { + val decodeTable = if(lowercase) decodingPetsciiLowercase else decodingPetsciiUppercase + return petscii.map { decodeTable[it.toInt()] }.joinToString("") + } + + fun encodeScreencode(text: String, lowercase: Boolean = false): List { + val lookup = if(lowercase) encodingScreencodeLowercase else encodingScreencodeUppercase + return text.map{ + val screencode = lookup[it] + screencode?.toShort() ?: if(it=='\u0000') + 0.toShort() + else { + val case = if (lowercase) "lower" else "upper" + throw CharConversionException("no ${case}Screencode character for '$it'") + } + } + } + + fun decodeScreencode(screencode: Iterable, lowercase: Boolean = false): String { + val decodeTable = if(lowercase) decodingScreencodeLowercase else decodingScreencodeUppercase + return screencode.map { decodeTable[it.toInt()] }.joinToString("") + } + + fun petscii2scr(petscii_code: Short, inverseVideo: Boolean): Short { + val code = when { + petscii_code <= 0x1f -> petscii_code + 128 + petscii_code <= 0x3f -> petscii_code.toInt() + petscii_code <= 0x5f -> petscii_code - 64 + petscii_code <= 0x7f -> petscii_code - 32 + petscii_code <= 0x9f -> petscii_code + 64 + petscii_code <= 0xbf -> petscii_code - 64 + petscii_code <= 0xfe -> petscii_code - 128 + petscii_code == 255.toShort() -> 95 + else -> throw CharConversionException("petscii code out of range") + } + if(inverseVideo) + return (code or 0x80).toShort() + return code.toShort() + } + + fun scr2petscii(screencode: Short): Short { + val petscii = when { + screencode <= 0x1f -> screencode + 64 + screencode <= 0x3f -> screencode.toInt() + screencode <= 0x5d -> screencode +123 + screencode == 0x5e.toShort() -> 255 + screencode == 0x5f.toShort() -> 223 + screencode <= 0x7f -> screencode + 64 + screencode <= 0xbf -> screencode - 128 + screencode <= 0xfe -> screencode - 64 + screencode == 255.toShort() -> 191 + else -> throw CharConversionException("screencode out of range") + } + return petscii.toShort() + } +} diff --git a/src/main/kotlin/razorvine/c64emu/VicII.kt b/src/main/kotlin/razorvine/c64emu/VicII.kt new file mode 100644 index 0000000..239ced1 --- /dev/null +++ b/src/main/kotlin/razorvine/c64emu/VicII.kt @@ -0,0 +1,61 @@ +package razorvine.c64emu + +import razorvine.ksim65.components.Address +import razorvine.ksim65.components.MemMappedComponent +import razorvine.ksim65.components.UByte + +class VicII(startAddress: Address, endAddress: Address): MemMappedComponent(startAddress, endAddress) { + private var ramBuffer = Array(endAddress - startAddress + 1) { 0 } + private var rasterIrqLine = 0 + var currentRasterLine = 1 + private var totalClocks = 0L + private var interruptStatusRegisterD019 = 0 + + override fun clock() { + totalClocks++ + if(totalClocks % 63L == 0L) { + currentRasterLine++ + if(currentRasterLine >= 312) + currentRasterLine = 0 + interruptStatusRegisterD019 = if(currentRasterLine == rasterIrqLine) { + // signal that current raster line is equal to the desired IRQ raster line + interruptStatusRegisterD019 or 0b00000001 + } else + interruptStatusRegisterD019 and 0b11111110 + } + } + + override fun reset() { + rasterIrqLine = 0 + currentRasterLine = 1 + totalClocks = 0L + interruptStatusRegisterD019 = 0 + } + + override fun get(address: Address): UByte { + val register = (address - startAddress) and 63 + // println("VIC GET ${register.toString(16)}") + return when(register) { + 0x11 -> (0b00011011 or ((currentRasterLine and 0b100000000) ushr 1)).toShort() + 0x12 -> { + // println(" read raster: $currentRasterLine") + (currentRasterLine and 255).toShort() + } + 0x19 -> interruptStatusRegisterD019.toShort() + else -> ramBuffer[register] + } + } + + override fun set(address: Address, data: UByte) { + val register = (address - startAddress) and 63 + ramBuffer[register] = data + when(register) { + 0x11 -> { + val rasterHigh = (data.toInt() ushr 7) shl 8 + rasterIrqLine = (rasterIrqLine and 0x00ff) or rasterHigh + } + 0x12 -> rasterIrqLine = (rasterIrqLine and 0xff00) or data.toInt() + } + // println("VIC SET ${register.toString(16)} = ${data.toString(16)} (rasterIrqLine= $rasterIrqLine)") + } +} diff --git a/src/main/kotlin/razorvine/c64emu/c64Main.kt b/src/main/kotlin/razorvine/c64emu/c64Main.kt new file mode 100644 index 0000000..aa2c5b0 --- /dev/null +++ b/src/main/kotlin/razorvine/c64emu/c64Main.kt @@ -0,0 +1,92 @@ +package razorvine.c64emu + +import razorvine.examplemachine.DebugWindow +import kotlin.concurrent.scheduleAtFixedRate +import razorvine.ksim65.Bus +import razorvine.ksim65.Cpu6502 +import razorvine.ksim65.IVirtualMachine +import razorvine.ksim65.Version +import razorvine.ksim65.components.* +import java.io.File +import java.nio.file.Paths +import javax.swing.ImageIcon + +/** + * The virtual representation of the Commodore-64 + */ +class C64Machine(title: String) : IVirtualMachine { + + private val romsPath = Paths.get(expandUser("~/.vice/C64")) + val chargenData = romsPath.resolve("chargen").toFile().readBytes() + val basicData = romsPath.resolve("basic").toFile().readBytes() + val kernalData = romsPath.resolve("kernal").toFile().readBytes() + + override val bus = Bus() + override val cpu = Cpu6502(false) + val ram = Ram(0x0000, 0xffff) + val vic = VicII(0xd000, 0xd3ff) + val basicRom = Rom(0xa000, 0xbfff).also { it.load(basicData) } + val kernalRom = Rom(0xe000, 0xffff).also { it.load(kernalData) } + + private val debugWindow = DebugWindow(this) + private val hostDisplay = MainWindow(title, chargenData, ram) + + init { + hostDisplay.iconImage = ImageIcon(javaClass.getResource("/icon.png")).image + debugWindow.iconImage = hostDisplay.iconImage + debugWindow.setLocation(hostDisplay.location.x+hostDisplay.width, hostDisplay.location.y) + + bus += basicRom + bus += kernalRom + bus += vic + bus += ram + bus += cpu + bus.reset() + + debugWindow.isVisible = true + hostDisplay.isVisible = true + hostDisplay.start() + } + + private fun expandUser(path: String): String { + if(path.startsWith("~" + File.separator)) { + return System.getProperty("user.home") + path.substring(1); + } else { + throw UnsupportedOperationException("home dir expansion not implemented for other users") + } + } + + override var paused = false + + override fun stepInstruction() { + while (cpu.instrCycles > 0) bus.clock() + bus.clock() + while (cpu.instrCycles > 0) bus.clock() + } + + fun start() { + val timer = java.util.Timer("clock", true) + val startTime = System.currentTimeMillis() + timer.scheduleAtFixedRate(1, 1) { + if(!paused) { + repeat(400) { + stepInstruction() + if(vic.currentRasterLine == 255) { + // we force an irq here ourselves rather than fully emulating the VIC-II's raster IRQ + // or the CIA timer IRQ/NMI. + cpu.irq() + } + } + debugWindow.updateCpu(cpu, bus) + val duration = System.currentTimeMillis() - startTime + val speedKhz = cpu.totalCycles.toDouble() / duration + debugWindow.speedKhzTf.text = "%.1f".format(speedKhz) + } + } + } +} + +fun main(args: Array) { + val machine = C64Machine("virtual Commodore-64 - using KSim65 v${Version.version}") + machine.start() +} diff --git a/src/main/kotlin/razorvine/examplemachine/GUI.kt b/src/main/kotlin/razorvine/examplemachine/GUI.kt index e4a070a..97e340a 100644 --- a/src/main/kotlin/razorvine/examplemachine/GUI.kt +++ b/src/main/kotlin/razorvine/examplemachine/GUI.kt @@ -7,6 +7,7 @@ import java.awt.image.BufferedImage import javax.imageio.ImageIO import javax.swing.event.MouseInputListener import razorvine.ksim65.IHostInterface +import razorvine.ksim65.IVirtualMachine import java.awt.event.* import java.util.* import javax.swing.* @@ -146,7 +147,7 @@ private class BitmapScreenPanel : JPanel() { } } -class DebugWindow(val vm: VirtualMachine) : JFrame("debugger"), ActionListener { +class DebugWindow(val vm: IVirtualMachine) : JFrame("debugger"), ActionListener { val cyclesTf = JTextField("00000000000000") val speedKhzTf = JTextField("0000000") val regAtf = JTextField("000") @@ -160,7 +161,7 @@ class DebugWindow(val vm: VirtualMachine) : JFrame("debugger"), ActionListener { init { defaultCloseOperation = EXIT_ON_CLOSE - preferredSize = Dimension(350, 600) + preferredSize = Dimension(350, 500) val cpuPanel = JPanel(GridBagLayout()) cpuPanel.border = BorderFactory.createTitledBorder("CPU: ${vm.cpu.name}") val gc = GridBagConstraints() @@ -323,12 +324,9 @@ class MainWindow(title: String) : JFrame(title), KeyListener, MouseInputListener addMouseMotionListener(this) addMouseListener(this) pack() - requestFocusInWindow() setLocationRelativeTo(null) setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, mutableSetOf()) - isVisible = true - toFront() - requestFocus() + requestFocusInWindow() } fun start() { diff --git a/src/main/kotlin/razorvine/examplemachine/ehBasicMain.kt b/src/main/kotlin/razorvine/examplemachine/ehBasicMain.kt index 67c58a2..f409a42 100644 --- a/src/main/kotlin/razorvine/examplemachine/ehBasicMain.kt +++ b/src/main/kotlin/razorvine/examplemachine/ehBasicMain.kt @@ -33,8 +33,8 @@ class EhBasicMachine(title: String) { bus += cpu bus.reset() + hostDisplay.isVisible = true hostDisplay.start() - hostDisplay.requestFocus() } var paused = false diff --git a/src/main/kotlin/razorvine/examplemachine/machineMain.kt b/src/main/kotlin/razorvine/examplemachine/machineMain.kt index 2aa7ca8..41631d1 100644 --- a/src/main/kotlin/razorvine/examplemachine/machineMain.kt +++ b/src/main/kotlin/razorvine/examplemachine/machineMain.kt @@ -3,6 +3,7 @@ package razorvine.examplemachine import kotlin.concurrent.scheduleAtFixedRate import razorvine.ksim65.Bus import razorvine.ksim65.Cpu6502 +import razorvine.ksim65.IVirtualMachine import razorvine.ksim65.Version import razorvine.ksim65.components.* import razorvine.ksim65.components.Timer @@ -11,9 +12,9 @@ import javax.swing.ImageIcon /** * A virtual computer constructed from the various virtual components */ -class VirtualMachine(title: String) { - val bus = Bus() - val cpu = Cpu6502(false) +class VirtualMachine(title: String) : IVirtualMachine { + override val bus = Bus() + override val cpu = Cpu6502(false) val ram = Ram(0x0000, 0xffff) private val rtc = RealTimeClock(0xd100, 0xd108) private val timer = Timer(0xd200, 0xd203, cpu) @@ -29,6 +30,7 @@ class VirtualMachine(title: String) { init { hostDisplay.iconImage = ImageIcon(javaClass.getResource("/icon.png")).image debugWindow.iconImage = hostDisplay.iconImage + debugWindow.setLocation(hostDisplay.location.x+hostDisplay.width, hostDisplay.location.y) ram[Cpu6502.RESET_vector] = 0x00 ram[Cpu6502.RESET_vector + 1] = 0x10 @@ -43,16 +45,14 @@ class VirtualMachine(title: String) { bus += cpu bus.reset() - hostDisplay.start() - - debugWindow.setLocation(hostDisplay.location.x+hostDisplay.width, hostDisplay.location.y) debugWindow.isVisible = true - hostDisplay.requestFocus() + hostDisplay.isVisible = true + hostDisplay.start() } - var paused = false + override var paused = false - fun stepInstruction() { + override fun stepInstruction() { while (cpu.instrCycles > 0) bus.clock() bus.clock() while (cpu.instrCycles > 0) bus.clock() diff --git a/src/main/kotlin/razorvine/ksim65/IVirtualMachine.kt b/src/main/kotlin/razorvine/ksim65/IVirtualMachine.kt new file mode 100644 index 0000000..54f03c8 --- /dev/null +++ b/src/main/kotlin/razorvine/ksim65/IVirtualMachine.kt @@ -0,0 +1,9 @@ +package razorvine.ksim65 + +interface IVirtualMachine { + fun stepInstruction() + + var paused: Boolean + val cpu: Cpu6502 + val bus: Bus +}