From f219ef5c22bfbdbe946744e6791330634db8358e Mon Sep 17 00:00:00 2001 From: Fred VanEijk Date: Thu, 5 Dec 2024 21:22:14 -0500 Subject: [PATCH] - work on basic/interpreter option for for Z80/CPM - add warm/cold reset option for the 6809 - add tools and docs to build 6809 interpreter - revert the basMon files --- Microcomputer6502Basic.vhd | 668 +- Microcomputer6809Basic.vhd | 664 +- MicrocomputerZ80Basic.vhd | 684 +- MicrocomputerZ80CPM.vhd | 803 +- README.md | 879 +- ROMS/6809/BASIC.S19 | 259 + ROMS/6809/BASIC.SYM | 1009 ++ ROMS/6809/ExBasROM.LST | 5406 ++++++++ ROMS/6809/ExBasROM.asm | 5398 ++++++++ ROMS/6809/ExBasROM.hex | 513 + ROMS/6809/ExBasRom.zip | Bin 0 -> 180465 bytes ROMS/6809/M6809_EXT_BASIC_ROM.vhd | 2 +- ROMS/6809/as11v2.pdf | Bin 0 -> 88893 bytes ROMS/6809/as9.exe | Bin 0 -> 37198 bytes ROMS/6809/basic.asm | 603 +- ROMS/6809/basic.hex | 258 + ROMS/6809/basic.lst | 4818 ++++++++ ROMS/6809/basic_remap.hex | 257 + ROMS/6809/hex_addr_remap | 43 + ROMS/6809/hex_addr_remap.py | 54 + ROMS/6809/readme.md | 10 + ROMS/6809/srec_cat.exe | Bin 0 -> 1440270 bytes ROMS/Z80/BASMON.HEX | 688 +- ROMS/Z80/Z80_CPM_BASIC_ROM.vhd | 288 +- ROMS/Z80/intMon.hex | 341 + .../Z80-dis-asm.py | 431 + Z80 CPM and bootloader (basmon)/_ASSEMBLE.BAT | 1 + .../hexFiles/BASMON.HEX | 688 +- .../hexFiles/intMon.hex | 341 + .../source/BASMON.LST | 10142 ++++++++-------- .../source/basMon.asm | 51 +- .../source/intprt.asm | 4317 +++++++ .../source/mon.asm | 693 ++ .../source/mon.lst | 5089 ++++++++ .../tasm manual.pdf | Bin 0 -> 487449 bytes Z80 CPM and bootloader (basmon)/tasm65.tab | 222 + Z80 CPM and bootloader (basmon)/tasm85.tab | 257 + Z80 CPM and bootloader (basmon)/tasmrun.bat | 2 + Z80 CPM and bootloader (basmon)/z80dis.py | 2232 ++++ build_id.v | 2 +- releases/MultiComp_20241205.rbf | Bin 0 -> 3500364 bytes 41 files changed, 40009 insertions(+), 8104 deletions(-) create mode 100644 ROMS/6809/BASIC.S19 create mode 100644 ROMS/6809/BASIC.SYM create mode 100644 ROMS/6809/ExBasROM.LST create mode 100644 ROMS/6809/ExBasROM.asm create mode 100644 ROMS/6809/ExBasROM.hex create mode 100644 ROMS/6809/ExBasRom.zip create mode 100644 ROMS/6809/as11v2.pdf create mode 100644 ROMS/6809/as9.exe create mode 100644 ROMS/6809/basic.hex create mode 100644 ROMS/6809/basic.lst create mode 100644 ROMS/6809/basic_remap.hex create mode 100644 ROMS/6809/hex_addr_remap create mode 100644 ROMS/6809/hex_addr_remap.py create mode 100644 ROMS/6809/readme.md create mode 100644 ROMS/6809/srec_cat.exe create mode 100644 ROMS/Z80/intMon.hex create mode 100644 Z80 CPM and bootloader (basmon)/Z80-dis-asm.py create mode 100644 Z80 CPM and bootloader (basmon)/hexFiles/intMon.hex create mode 100644 Z80 CPM and bootloader (basmon)/source/intprt.asm create mode 100644 Z80 CPM and bootloader (basmon)/source/mon.asm create mode 100644 Z80 CPM and bootloader (basmon)/source/mon.lst create mode 100644 Z80 CPM and bootloader (basmon)/tasm manual.pdf create mode 100644 Z80 CPM and bootloader (basmon)/tasm65.tab create mode 100644 Z80 CPM and bootloader (basmon)/tasm85.tab create mode 100644 Z80 CPM and bootloader (basmon)/tasmrun.bat create mode 100644 Z80 CPM and bootloader (basmon)/z80dis.py create mode 100644 releases/MultiComp_20241205.rbf diff --git a/Microcomputer6502Basic.vhd b/Microcomputer6502Basic.vhd index 7cffa61..6f67b72 100644 --- a/Microcomputer6502Basic.vhd +++ b/Microcomputer6502Basic.vhd @@ -1,325 +1,345 @@ --- This file is copyright by Grant Searle 2014 --- You are free to use this file in your own projects but must never charge for it nor use it without --- acknowledgement. --- Please ask permission from Grant Searle before republishing elsewhere. --- If you use this file or any part of it, please add an acknowledgement to myself and --- a link back to my main web site http://searle.hostei.com/grant/ --- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html --- --- Please check on the above web pages to see if there are any updates before using this file. --- If for some reason the page is no longer available, please search for "Grant Searle" --- on the internet to see if I have moved to another web hosting service. --- --- Grant Searle --- eMail address available on my main web page link above. - -library ieee; -use ieee.std_logic_1164.all; -use IEEE.STD_LOGIC_ARITH.all; -use IEEE.STD_LOGIC_UNSIGNED.all; - -entity Microcomputer6502Basic is - port( - N_RESET : in std_logic; - clk : in std_logic; - baud_increment : in std_logic_vector(15 downto 0); - - sramData : inout std_logic_vector(7 downto 0); - sramAddress : out std_logic_vector(15 downto 0); - n_sRamWE : out std_logic; - n_sRamCS : out std_logic; - n_sRamOE : out std_logic; - n_sRamLB : out std_logic; - n_sRamUB : out std_logic; - - rxd1 : in std_logic; - txd1 : out std_logic; - rts1 : out std_logic; - cts1 : in std_logic; -- Added CTS input - - rxd2 : in std_logic; - txd2 : out std_logic; - rts2 : out std_logic; - - videoSync : out std_logic; - video : out std_logic; - - R : out std_logic_vector(1 downto 0); - G : out std_logic_vector(1 downto 0); - B : out std_logic_vector(1 downto 0); - HS : out std_logic; - VS : out std_logic; - hBlank : out std_logic; - vBlank : out std_logic; - cepix : out std_logic; - - ps2Clk : in std_logic; - ps2Data : in std_logic; - - sdCS : out std_logic; - sdMOSI : out std_logic; - sdMISO : in std_logic; - sdSCLK : out std_logic; - sd_ctrl_sel : in std_logic; - driveLED : out std_logic :='1' - ); -end Microcomputer6502Basic; - -architecture struct of Microcomputer6502Basic is - - signal n_WR : std_logic; - signal n_RD : std_logic; - signal cpuAddress : std_logic_vector(15 downto 0); - signal cpuDataOut : std_logic_vector(7 downto 0); - signal cpuDataIn : std_logic_vector(7 downto 0); - - signal basRomData : std_logic_vector(7 downto 0); - signal internalRam1DataOut : std_logic_vector(7 downto 0); - signal internalRam2DataOut : std_logic_vector(7 downto 0); - signal interface1DataOut : std_logic_vector(7 downto 0); - signal interface2DataOut : std_logic_vector(7 downto 0); - signal sdCardDataOut : std_logic_vector(7 downto 0); - - signal n_memWR : std_logic :='1'; - signal n_memRD : std_logic :='1'; - - signal n_ioWR : std_logic :='1'; - signal n_ioRD : std_logic :='1'; - - signal n_MREQ : std_logic :='1'; - signal n_IORQ : std_logic :='1'; - - signal n_int1 : std_logic :='1'; - signal n_int2 : std_logic :='1'; - - signal n_externalRamCS : std_logic :='1'; - signal n_internalRam1CS : std_logic :='1'; - signal n_internalRam2CS : std_logic :='1'; - signal n_basRomCS : std_logic :='1'; - signal n_interface1CS : std_logic :='1'; - signal n_interface2CS : std_logic :='1'; - signal n_sdCardCS : std_logic :='1'; - - signal sdCardDataOut_sd : std_logic_vector(7 downto 0); - signal sdCardDataOut_img : std_logic_vector(7 downto 0); - signal driveLED_sd, driveLED_img : std_logic; - signal sdMISO_int : std_logic; -- Add this signal declaration - - signal serialClkCount : unsigned(15 downto 0); - signal cpuClkCount : std_logic_vector(5 downto 0); - signal sdClkCount : std_logic_vector(5 downto 0); - signal cpuClock : std_logic; - signal serialClock : std_logic; - signal sdClock : std_logic; - -begin - --- ____________________________________________________________________________________ --- CPU CHOICE GOES HERE - -cpu1 : entity work.T65 -port map( - Enable => '1', - Mode => "00", - Res_n => N_RESET, - Clk => cpuClock, - Rdy => '1', - Abort_n => '1', - IRQ_n => '1', - NMI_n => '1', - SO_n => '1', - R_W_n => n_WR, - A(15 downto 0) => cpuAddress, - DI => cpuDataIn, - DO => cpuDataOut -); - --- ____________________________________________________________________________________ --- ROM GOES HERE - -rom1 : entity work.M6502_BASIC_ROM -- 8KB BASIC -port map( - address => cpuAddress(12 downto 0), - clock => clk, - q => basRomData -); - --- ____________________________________________________________________________________ --- RAM GOES HERE - -ram1: entity work.InternalRam64K -port map -( - address => cpuAddress(15 downto 0), - clock => clk, - data => cpuDataOut, - wren => not(n_memWR or n_internalRam1CS), - q => internalRam1DataOut -); - --- ____________________________________________________________________________________ --- INPUT/OUTPUT DEVICES GO HERE - -io1 : entity work.SBCTextDisplayRGB -port map ( - n_reset => N_RESET, - clk => clk, - - -- RGB video signals - hSync => HS, - vSync => VS, - videoR0 => R(1), - videoR1 => R(0), - videoG0 => G(1), - videoG1 => G(0), - videoB0 => B(1), - videoB1 => B(0), - hBlank => hBlank, - vBlank => vBlank, - cepix => cepix, - - -- Monochrome video signals (when using TV timings only) - sync => videoSync, - video => video, - - n_wr => n_interface1CS or cpuClock or n_WR, - n_rd => n_interface1CS or cpuClock or (not n_WR), - n_int => n_int1, - regSel => cpuAddress(0), - dataIn => cpuDataOut, - dataOut => interface1DataOut, - ps2Clk => ps2Clk, - ps2Data => ps2Data -); - -io2 : entity work.bufferedUART -port map( - clk => clk, - n_wr => n_interface2CS or cpuClock or n_WR, - n_rd => n_interface2CS or cpuClock or (not n_WR), - n_int => n_int2, - regSel => cpuAddress(0), - dataIn => cpuDataOut, - dataOut => interface2DataOut, - rxClock => serialClock, - txClock => serialClock, - rxd => rxd1, - txd => txd1, - n_cts => cts1, -- Connect CTS signal - n_dcd => '0', - n_rts => rts1 -); - -sd1 : entity work.sd_controller -port map( - sdCS => sdCS, - sdMOSI => sdMOSI, - sdMISO => sdMISO_int, - sdSCLK => sdSCLK, - n_wr => n_sdCardCS or cpuClock or n_WR, - n_rd => n_sdCardCS or cpuClock or (not n_WR), - n_reset => n_reset, - dataIn => cpuDataOut, - dataOut => sdCardDataOut_sd, - regAddr => cpuAddress(2 downto 0), - driveLED => driveLED_sd, - clk => sdClock -- twice the spi clk -); - - -- Add signal assignment outside port map: - sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1'; - - -- New image controller - img1 : entity work.image_controller - port map( - clk => clk, - n_reset => N_RESET, - n_rd => n_sdCardCS or n_ioRD, - n_wr => n_sdCardCS or n_ioWR, - dataIn => cpuDataOut, - dataOut => sdCardDataOut_img, - regAddr => cpuAddress(2 downto 0), - driveLED => driveLED_img - ); - --- ____________________________________________________________________________________ --- MEMORY READ/WRITE LOGIC GOES HERE - -n_memRD <= not(cpuClock) nand n_WR; -n_memWR <= not(cpuClock) nand (not n_WR); - --- ____________________________________________________________________________________ --- CHIP SELECTS GO HERE - -n_basRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K at top of memory -n_interface1CS <= '0' when cpuAddress(15 downto 1) = "111111111101000" else '1'; -- 2 bytes FFD0-FFD1 -n_interface2CS <= '0' when cpuAddress(15 downto 1) = "111111111101001" else '1'; -- 2 bytes FFD2-FFD3 -n_sdCardCS <= '0' when cpuAddress(15 downto 3) = "1111111111011" else '1'; -- 8 bytes FFD8-FFDF -n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K - --- ____________________________________________________________________________________ --- BUS ISOLATION GOES HERE - -- Mux controller outputs based on selection - sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else - sdCardDataOut_sd; - - driveLED <= driveLED_img when sd_ctrl_sel = '1' else - driveLED_sd; - - -cpuDataIn <= -interface1DataOut when n_interface1CS = '0' else -interface2DataOut when n_interface2CS = '0' else -sdCardDataOut when n_sdCardCS = '0' else -basRomData when n_basRomCS = '0' else -internalRam1DataOut when n_internalRam1CS= '0' else -sramData when n_externalRamCS= '0' else -x"FF"; - --- ____________________________________________________________________________________ --- SYSTEM CLOCKS GO HERE - --- SUB-CIRCUIT CLOCK SIGNALS - -serialClock <= serialClkCount(15); -process (clk) -begin - if rising_edge(clk) then - - if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz - cpuClkCount <= cpuClkCount + 1; - else - cpuClkCount <= (others=>'0'); - end if; - if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz - cpuClock <= '0'; - else - cpuClock <= '1'; - end if; - - if sdClkCount < 49 then -- 1MHz - sdClkCount <= sdClkCount + 1; - else - sdClkCount <= (others=>'0'); - end if; - - if sdClkCount < 25 then - sdClock <= '0'; - else - sdClock <= '1'; - end if; - - -- Serial clock DDS - -- 50MHz master input clock: - -- Baud Increment - -- 115200 2416 - -- 38400 805 - -- 19200 403 - -- 9600 201 - -- 4800 101 - -- 2400 50 - serialClkCount <= serialClkCount + unsigned(baud_increment); - end if; -end process; - +-- This file is copyright by Grant Searle 2014 +-- You are free to use this file in your own projects but must never charge for it nor use it without +-- acknowledgement. +-- Please ask permission from Grant Searle before republishing elsewhere. +-- If you use this file or any part of it, please add an acknowledgement to myself and +-- a link back to my main web site http://searle.hostei.com/grant/ +-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html +-- +-- Please check on the above web pages to see if there are any updates before using this file. +-- If for some reason the page is no longer available, please search for "Grant Searle" +-- on the internet to see if I have moved to another web hosting service. +-- +-- Grant Searle +-- eMail address available on my main web page link above. + +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_ARITH.all; +use IEEE.STD_LOGIC_UNSIGNED.all; + +entity Microcomputer6502Basic is + port( + N_RESET : in std_logic; + clk : in std_logic; + baud_increment : in std_logic_vector(15 downto 0); + + sramData : inout std_logic_vector(7 downto 0); + sramAddress : out std_logic_vector(15 downto 0); + n_sRamWE : out std_logic; + n_sRamCS : out std_logic; + n_sRamOE : out std_logic; + n_sRamLB : out std_logic; + n_sRamUB : out std_logic; + + rxd1 : in std_logic; + txd1 : out std_logic; + rts1 : out std_logic; + cts1 : in std_logic; -- Added CTS input + + rxd2 : in std_logic; + txd2 : out std_logic; + rts2 : out std_logic; + + videoSync : out std_logic; + video : out std_logic; + + R : out std_logic_vector(1 downto 0); + G : out std_logic_vector(1 downto 0); + B : out std_logic_vector(1 downto 0); + HS : out std_logic; + VS : out std_logic; + hBlank : out std_logic; + vBlank : out std_logic; + cepix : out std_logic; + + ps2Clk : in std_logic; + ps2Data : in std_logic; + + sdCS : out std_logic; + sdMOSI : out std_logic; + sdMISO : in std_logic; + sdSCLK : out std_logic; + sd_ctrl_sel : in std_logic; + driveLED : out std_logic :='1' + ); +end Microcomputer6502Basic; + +architecture struct of Microcomputer6502Basic is + + signal reset_counter : unsigned(15 downto 0) := (others => '0'); + signal reset_n_internal : std_logic := '0'; -- Active low internal reset + + signal n_WR : std_logic; + signal n_RD : std_logic; + signal cpuAddress : std_logic_vector(15 downto 0); + signal cpuDataOut : std_logic_vector(7 downto 0); + signal cpuDataIn : std_logic_vector(7 downto 0); + + signal basRomData : std_logic_vector(7 downto 0); + signal internalRam1DataOut : std_logic_vector(7 downto 0); + signal internalRam2DataOut : std_logic_vector(7 downto 0); + signal interface1DataOut : std_logic_vector(7 downto 0); + signal interface2DataOut : std_logic_vector(7 downto 0); + signal sdCardDataOut : std_logic_vector(7 downto 0); + + signal n_memWR : std_logic :='1'; + signal n_memRD : std_logic :='1'; + + signal n_ioWR : std_logic :='1'; + signal n_ioRD : std_logic :='1'; + + signal n_MREQ : std_logic :='1'; + signal n_IORQ : std_logic :='1'; + + signal n_int1 : std_logic :='1'; + signal n_int2 : std_logic :='1'; + + signal n_externalRamCS : std_logic :='1'; + signal n_internalRam1CS : std_logic :='1'; + signal n_internalRam2CS : std_logic :='1'; + signal n_basRomCS : std_logic :='1'; + signal n_interface1CS : std_logic :='1'; + signal n_interface2CS : std_logic :='1'; + signal n_sdCardCS : std_logic :='1'; + + signal sdCardDataOut_sd : std_logic_vector(7 downto 0); + signal sdCardDataOut_img : std_logic_vector(7 downto 0); + signal driveLED_sd, driveLED_img : std_logic; + signal sdMISO_int : std_logic; -- Add this signal declaration + + signal serialClkCount : unsigned(15 downto 0); + signal cpuClkCount : std_logic_vector(5 downto 0); + signal sdClkCount : std_logic_vector(5 downto 0); + signal cpuClock : std_logic; + signal serialClock : std_logic; + signal sdClock : std_logic; + +begin + +process(clk) +begin + if rising_edge(clk) then + if N_RESET = '0' then + reset_counter <= (others => '0'); + reset_n_internal <= '0'; + else + if reset_counter /= unsigned'(X"FFFF") then + reset_counter <= reset_counter + 1; + reset_n_internal <= '0'; + else + reset_n_internal <= '1'; + end if; + end if; + end if; +end process; + +-- ____________________________________________________________________________________ +-- CPU CHOICE GOES HERE + +cpu1 : entity work.T65 +port map( + Enable => '1', + Mode => "00", + Res_n => reset_n_internal, + Clk => cpuClock, + Rdy => '1', + Abort_n => '1', + IRQ_n => '1', + NMI_n => '1', + SO_n => '1', + R_W_n => n_WR, + A(15 downto 0) => cpuAddress, + DI => cpuDataIn, + DO => cpuDataOut +); + +-- ____________________________________________________________________________________ +-- ROM GOES HERE + +rom1 : entity work.M6502_BASIC_ROM -- 8KB BASIC +port map( + address => cpuAddress(12 downto 0), + clock => clk, + q => basRomData +); + +-- ____________________________________________________________________________________ +-- RAM GOES HERE + +ram1: entity work.InternalRam64K +port map +( + address => cpuAddress(15 downto 0), + clock => clk, + data => cpuDataOut, + wren => not(n_memWR or n_internalRam1CS), + q => internalRam1DataOut +); + +-- ____________________________________________________________________________________ +-- INPUT/OUTPUT DEVICES GO HERE + +io1 : entity work.SBCTextDisplayRGB +port map ( + n_reset => N_RESET, + clk => clk, + + -- RGB video signals + hSync => HS, + vSync => VS, + videoR0 => R(1), + videoR1 => R(0), + videoG0 => G(1), + videoG1 => G(0), + videoB0 => B(1), + videoB1 => B(0), + hBlank => hBlank, + vBlank => vBlank, + cepix => cepix, + + -- Monochrome video signals (when using TV timings only) + sync => videoSync, + video => video, + + n_wr => n_interface1CS or cpuClock or n_WR, + n_rd => n_interface1CS or cpuClock or (not n_WR), + n_int => n_int1, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => interface1DataOut, + ps2Clk => ps2Clk, + ps2Data => ps2Data +); + +io2 : entity work.bufferedUART +port map( + clk => clk, + n_wr => n_interface2CS or cpuClock or n_WR, + n_rd => n_interface2CS or cpuClock or (not n_WR), + n_int => n_int2, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => interface2DataOut, + rxClock => serialClock, + txClock => serialClock, + rxd => rxd1, + txd => txd1, + n_cts => cts1, -- Connect CTS signal + n_dcd => '0', + n_rts => rts1 +); + +sd1 : entity work.sd_controller +port map( + sdCS => sdCS, + sdMOSI => sdMOSI, + sdMISO => sdMISO_int, + sdSCLK => sdSCLK, + n_wr => n_sdCardCS or cpuClock or n_WR, + n_rd => n_sdCardCS or cpuClock or (not n_WR), + n_reset => N_RESET, + dataIn => cpuDataOut, + dataOut => sdCardDataOut_sd, + regAddr => cpuAddress(2 downto 0), + driveLED => driveLED_sd, + clk => sdClock -- twice the spi clk +); + + -- Add signal assignment outside port map: + sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1'; + + -- New image controller + img1 : entity work.image_controller + port map( + clk => clk, + n_reset => N_RESET, + n_rd => n_sdCardCS or n_ioRD, + n_wr => n_sdCardCS or n_ioWR, + dataIn => cpuDataOut, + dataOut => sdCardDataOut_img, + regAddr => cpuAddress(2 downto 0), + driveLED => driveLED_img + ); + +-- ____________________________________________________________________________________ +-- MEMORY READ/WRITE LOGIC GOES HERE + +n_memRD <= not(cpuClock) nand n_WR; +n_memWR <= not(cpuClock) nand (not n_WR); + +-- ____________________________________________________________________________________ +-- CHIP SELECTS GO HERE + +n_basRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K at top of memory +n_interface1CS <= '0' when cpuAddress(15 downto 1) = "111111111101000" else '1'; -- 2 bytes FFD0-FFD1 +n_interface2CS <= '0' when cpuAddress(15 downto 1) = "111111111101001" else '1'; -- 2 bytes FFD2-FFD3 +n_sdCardCS <= '0' when cpuAddress(15 downto 3) = "1111111111011" else '1'; -- 8 bytes FFD8-FFDF +n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K + +-- ____________________________________________________________________________________ +-- BUS ISOLATION GOES HERE + -- Mux controller outputs based on selection + sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else + sdCardDataOut_sd; + + driveLED <= driveLED_img when sd_ctrl_sel = '1' else + driveLED_sd; + + +cpuDataIn <= +interface1DataOut when n_interface1CS = '0' else +interface2DataOut when n_interface2CS = '0' else +sdCardDataOut when n_sdCardCS = '0' else +basRomData when n_basRomCS = '0' else +internalRam1DataOut when n_internalRam1CS= '0' else +sramData when n_externalRamCS= '0' else +x"FF"; + +-- ____________________________________________________________________________________ +-- SYSTEM CLOCKS GO HERE + +-- SUB-CIRCUIT CLOCK SIGNALS + +serialClock <= serialClkCount(15); +process (clk) +begin + if rising_edge(clk) then + + if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz + cpuClkCount <= cpuClkCount + 1; + else + cpuClkCount <= (others=>'0'); + end if; + if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz + cpuClock <= '0'; + else + cpuClock <= '1'; + end if; + + if sdClkCount < 49 then -- 1MHz + sdClkCount <= sdClkCount + 1; + else + sdClkCount <= (others=>'0'); + end if; + + if sdClkCount < 25 then + sdClock <= '0'; + else + sdClock <= '1'; + end if; + + -- Serial clock DDS + -- 50MHz master input clock: + -- Baud Increment + -- 115200 2416 + -- 38400 805 + -- 19200 403 + -- 9600 201 + -- 4800 101 + -- 2400 50 + serialClkCount <= serialClkCount + unsigned(baud_increment); + end if; +end process; + end; \ No newline at end of file diff --git a/Microcomputer6809Basic.vhd b/Microcomputer6809Basic.vhd index 77bbfbf..0778a86 100644 --- a/Microcomputer6809Basic.vhd +++ b/Microcomputer6809Basic.vhd @@ -1,323 +1,343 @@ --- This file is copyright by Grant Searle 2014 --- You are free to use this file in your own projects but must never charge for it nor use it without --- acknowledgement. --- Please ask permission from Grant Searle before republishing elsewhere. --- If you use this file or any part of it, please add an acknowledgement to myself and --- a link back to my main web site http://searle.hostei.com/grant/ --- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html --- --- Please check on the above web pages to see if there are any updates before using this file. --- If for some reason the page is no longer available, please search for "Grant Searle" --- on the internet to see if I have moved to another web hosting service. --- --- Grant Searle --- eMail address available on my main web page link above. - -library ieee; -use ieee.std_logic_1164.all; -use IEEE.STD_LOGIC_ARITH.all; -use IEEE.STD_LOGIC_UNSIGNED.all; - -entity Microcomputer6809Basic is - port( - N_RESET : in std_logic; - clk : in std_logic; - baud_increment : in std_logic_vector(15 downto 0); - - sramData : inout std_logic_vector(7 downto 0); - sramAddress : out std_logic_vector(15 downto 0); - n_sRamWE : out std_logic; - n_sRamCS : out std_logic; - n_sRamOE : out std_logic; - n_sRamLB : out std_logic; - n_sRamUB : out std_logic; - - rxd1 : in std_logic; - txd1 : out std_logic; - rts1 : out std_logic; - cts1 : in std_logic; -- Added CTS input - - rxd2 : in std_logic; - txd2 : out std_logic; - rts2 : out std_logic; - - videoSync : out std_logic; - video : out std_logic; - - R : out std_logic_vector(1 downto 0); - G : out std_logic_vector(1 downto 0); - B : out std_logic_vector(1 downto 0); - HS : out std_logic; - VS : out std_logic; - hBlank : out std_logic; - vBlank : out std_logic; - cepix : out std_logic; - - ps2Clk : in std_logic; - ps2Data : in std_logic; - - sdCS : out std_logic; - sdMOSI : out std_logic; - sdMISO : in std_logic; - sdSCLK : out std_logic; - sd_ctrl_sel : in std_logic; - driveLED : out std_logic :='1' - ); -end Microcomputer6809Basic; - -architecture struct of Microcomputer6809Basic is - - signal n_WR : std_logic; - signal n_RD : std_logic; - signal cpuAddress : std_logic_vector(15 downto 0); - signal cpuDataOut : std_logic_vector(7 downto 0); - signal cpuDataIn : std_logic_vector(7 downto 0); - - signal basRomData : std_logic_vector(7 downto 0); - signal internalRam1DataOut : std_logic_vector(7 downto 0); - signal internalRam2DataOut : std_logic_vector(7 downto 0); - signal interface1DataOut : std_logic_vector(7 downto 0); - signal interface2DataOut : std_logic_vector(7 downto 0); - signal sdCardDataOut : std_logic_vector(7 downto 0); - - signal n_memWR : std_logic :='1'; - signal n_memRD : std_logic :='1'; - - signal n_ioWR : std_logic :='1'; - signal n_ioRD : std_logic :='1'; - - signal n_MREQ : std_logic :='1'; - signal n_IORQ : std_logic :='1'; - - signal n_int1 : std_logic :='1'; - signal n_int2 : std_logic :='1'; - - signal n_externalRamCS : std_logic :='1'; - signal n_internalRam1CS : std_logic :='1'; - signal n_internalRam2CS : std_logic :='1'; - signal n_basRomCS : std_logic :='1'; - signal n_interface1CS : std_logic :='1'; - signal n_interface2CS : std_logic :='1'; - signal n_sdCardCS : std_logic :='1'; - - signal sdCardDataOut_sd : std_logic_vector(7 downto 0); - signal sdCardDataOut_img : std_logic_vector(7 downto 0); - signal driveLED_sd, driveLED_img : std_logic; - signal sdMISO_int : std_logic; -- Add this signal declaration - - signal serialClkCount : unsigned(15 downto 0); - signal cpuClkCount : std_logic_vector(5 downto 0); - signal sdClkCount : std_logic_vector(5 downto 0); - signal cpuClock : std_logic; - signal serialClock : std_logic; - signal sdClock : std_logic; - -begin - --- ____________________________________________________________________________________ --- CPU CHOICE GOES HERE - -cpu1 : entity work.cpu09 -port map( - clk => not(cpuClock), - rst => not N_RESET, - rw => n_WR, - addr => cpuAddress, - data_in => cpuDataIn, - data_out => cpuDataOut, - halt => '0', - hold => '0', - irq => '0', - firq => '0', - nmi => '0' -); - --- ____________________________________________________________________________________ --- ROM GOES HERE - -rom1 : entity work.M6809_EXT_BASIC_ROM -- 8KB BASIC -port map( - address => cpuAddress(12 downto 0), - clock => clk, - q => basRomData -); - --- ____________________________________________________________________________________ --- RAM GOES HERE - -ram1: entity work.InternalRam64K -port map -( - address => cpuAddress(15 downto 0), - clock => clk, - data => cpuDataOut, - wren => not(n_memWR or n_internalRam1CS), - q => internalRam1DataOut -); - --- ____________________________________________________________________________________ --- INPUT/OUTPUT DEVICES GO HERE - -io1 : entity work.SBCTextDisplayRGB -port map ( - n_reset => N_RESET, - clk => clk, - - -- RGB video signals - hSync => HS, - vSync => VS, - videoR0 => R(1), - videoR1 => R(0), - videoG0 => G(1), - videoG1 => G(0), - videoB0 => B(1), - videoB1 => B(0), - hBlank => hBlank, - vBlank => vBlank, - cepix => cepix, - - -- Monochrome video signals (when using TV timings only) - sync => videoSync, - video => video, - - n_wr => n_interface1CS or cpuClock or n_WR, - n_rd => n_interface1CS or cpuClock or (not n_WR), - n_int => n_int1, - regSel => cpuAddress(0), - dataIn => cpuDataOut, - dataOut => interface1DataOut, - ps2Clk => ps2Clk, - ps2Data => ps2Data -); - -io2 : entity work.bufferedUART -port map( - clk => clk, - n_wr => n_interface2CS or cpuClock or n_WR, - n_rd => n_interface2CS or cpuClock or (not n_WR), - n_int => n_int2, - regSel => cpuAddress(0), - dataIn => cpuDataOut, - dataOut => interface2DataOut, - rxClock => serialClock, - txClock => serialClock, - rxd => rxd1, - txd => txd1, - n_cts => cts1, -- Connect CTS signal - n_dcd => '0', - n_rts => rts1 -); - -sd1 : entity work.sd_controller -port map( - sdCS => sdCS, - sdMOSI => sdMOSI, - sdMISO => sdMISO_int, - sdSCLK => sdSCLK, - n_wr => n_sdCardCS or cpuClock or n_WR, - n_rd => n_sdCardCS or cpuClock or (not n_WR), - n_reset => n_reset, - dataIn => cpuDataOut, - dataOut => sdCardDataOut_sd, - regAddr => cpuAddress(2 downto 0), - driveLED => driveLED_sd, - clk => sdClock -- twice the spi clk -); - - -- Add signal assignment outside port map: - sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1'; - - -- New image controller - img1 : entity work.image_controller - port map( - clk => clk, - n_reset => N_RESET, - n_rd => n_sdCardCS or n_ioRD, - n_wr => n_sdCardCS or n_ioWR, - dataIn => cpuDataOut, - dataOut => sdCardDataOut_img, - regAddr => cpuAddress(2 downto 0), - driveLED => driveLED_img - ); - --- ____________________________________________________________________________________ --- MEMORY READ/WRITE LOGIC GOES HERE - -n_memRD <= not(cpuClock) nand n_WR; -n_memWR <= not(cpuClock) nand (not n_WR); - --- ____________________________________________________________________________________ --- CHIP SELECTS GO HERE - -n_basRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K at top of memory -n_interface1CS <= '0' when cpuAddress(15 downto 1) = "111111111101000" else '1'; -- 2 bytes FFD0-FFD1 -n_interface2CS <= '0' when cpuAddress(15 downto 1) = "111111111101001" else '1'; -- 2 bytes FFD2-FFD3 -n_sdCardCS <= '0' when cpuAddress(15 downto 3) = "1111111111011" else '1'; -- 8 bytes FFD8-FFDF -n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K - --- ____________________________________________________________________________________ --- BUS ISOLATION GOES HERE - -- Mux controller outputs based on selection - sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else - sdCardDataOut_sd; - - driveLED <= driveLED_img when sd_ctrl_sel = '1' else - driveLED_sd; - - -cpuDataIn <= -interface1DataOut when n_interface1CS = '0' else -interface2DataOut when n_interface2CS = '0' else -sdCardDataOut when n_sdCardCS = '0' else -basRomData when n_basRomCS = '0' else -internalRam1DataOut when n_internalRam1CS= '0' else -sramData when n_externalRamCS= '0' else -x"FF"; - --- ____________________________________________________________________________________ --- SYSTEM CLOCKS GO HERE - --- SUB-CIRCUIT CLOCK SIGNALS - -serialClock <= serialClkCount(15); -process (clk) -begin - if rising_edge(clk) then - - if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz - cpuClkCount <= cpuClkCount + 1; - else - cpuClkCount <= (others=>'0'); - end if; - if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz - cpuClock <= '0'; - else - cpuClock <= '1'; - end if; - - if sdClkCount < 49 then -- 1MHz - sdClkCount <= sdClkCount + 1; - else - sdClkCount <= (others=>'0'); - end if; - - if sdClkCount < 25 then - sdClock <= '0'; - else - sdClock <= '1'; - end if; - - -- Serial clock DDS - -- 50MHz master input clock: - -- Baud Increment - -- 115200 2416 - -- 38400 805 - -- 19200 403 - -- 9600 201 - -- 4800 101 - -- 2400 50 - serialClkCount <= serialClkCount + unsigned(baud_increment); - end if; -end process; - +-- This file is copyright by Grant Searle 2014 +-- You are free to use this file in your own projects but must never charge for it nor use it without +-- acknowledgement. +-- Please ask permission from Grant Searle before republishing elsewhere. +-- If you use this file or any part of it, please add an acknowledgement to myself and +-- a link back to my main web site http://searle.hostei.com/grant/ +-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html +-- +-- Please check on the above web pages to see if there are any updates before using this file. +-- If for some reason the page is no longer available, please search for "Grant Searle" +-- on the internet to see if I have moved to another web hosting service. +-- +-- Grant Searle +-- eMail address available on my main web page link above. + +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_ARITH.all; +use IEEE.STD_LOGIC_UNSIGNED.all; + +entity Microcomputer6809Basic is + port( + N_RESET : in std_logic; + clk : in std_logic; + baud_increment : in std_logic_vector(15 downto 0); + + sramData : inout std_logic_vector(7 downto 0); + sramAddress : out std_logic_vector(15 downto 0); + n_sRamWE : out std_logic; + n_sRamCS : out std_logic; + n_sRamOE : out std_logic; + n_sRamLB : out std_logic; + n_sRamUB : out std_logic; + + rxd1 : in std_logic; + txd1 : out std_logic; + rts1 : out std_logic; + cts1 : in std_logic; -- Added CTS input + + rxd2 : in std_logic; + txd2 : out std_logic; + rts2 : out std_logic; + + videoSync : out std_logic; + video : out std_logic; + + R : out std_logic_vector(1 downto 0); + G : out std_logic_vector(1 downto 0); + B : out std_logic_vector(1 downto 0); + HS : out std_logic; + VS : out std_logic; + hBlank : out std_logic; + vBlank : out std_logic; + cepix : out std_logic; + + ps2Clk : in std_logic; + ps2Data : in std_logic; + + sdCS : out std_logic; + sdMOSI : out std_logic; + sdMISO : in std_logic; + sdSCLK : out std_logic; + sd_ctrl_sel : in std_logic; + driveLED : out std_logic :='1' + ); +end Microcomputer6809Basic; + +architecture struct of Microcomputer6809Basic is + + signal reset_counter : unsigned(15 downto 0) := (others => '0'); + signal reset_n_internal : std_logic := '0'; -- Active low internal reset + + signal n_WR : std_logic; + signal n_RD : std_logic; + signal cpuAddress : std_logic_vector(15 downto 0); + signal cpuDataOut : std_logic_vector(7 downto 0); + signal cpuDataIn : std_logic_vector(7 downto 0); + + signal basRomData : std_logic_vector(7 downto 0); + signal internalRam1DataOut : std_logic_vector(7 downto 0); + signal internalRam2DataOut : std_logic_vector(7 downto 0); + signal interface1DataOut : std_logic_vector(7 downto 0); + signal interface2DataOut : std_logic_vector(7 downto 0); + signal sdCardDataOut : std_logic_vector(7 downto 0); + + signal n_memWR : std_logic :='1'; + signal n_memRD : std_logic :='1'; + + signal n_ioWR : std_logic :='1'; + signal n_ioRD : std_logic :='1'; + + signal n_MREQ : std_logic :='1'; + signal n_IORQ : std_logic :='1'; + + signal n_int1 : std_logic :='1'; + signal n_int2 : std_logic :='1'; + + signal n_externalRamCS : std_logic :='1'; + signal n_internalRam1CS : std_logic :='1'; + signal n_internalRam2CS : std_logic :='1'; + signal n_basRomCS : std_logic :='1'; + signal n_interface1CS : std_logic :='1'; + signal n_interface2CS : std_logic :='1'; + signal n_sdCardCS : std_logic :='1'; + + signal sdCardDataOut_sd : std_logic_vector(7 downto 0); + signal sdCardDataOut_img : std_logic_vector(7 downto 0); + signal driveLED_sd, driveLED_img : std_logic; + signal sdMISO_int : std_logic; -- Add this signal declaration + + signal serialClkCount : unsigned(15 downto 0); + signal cpuClkCount : std_logic_vector(5 downto 0); + signal sdClkCount : std_logic_vector(5 downto 0); + signal cpuClock : std_logic; + signal serialClock : std_logic; + signal sdClock : std_logic; + +begin + +process(cpuClock) -- Use cpuClock instead of clk +begin + if falling_edge(cpuClock) then -- Match CPU's falling edge trigger + if N_RESET = '0' then + reset_counter <= (others => '0'); + reset_n_internal <= '0'; + else + if reset_counter /= unsigned'(X"FFFF") then + reset_counter <= reset_counter + 1; + reset_n_internal <= '0'; + else + reset_n_internal <= '1'; + end if; + end if; + end if; +end process; + +-- ____________________________________________________________________________________ +-- CPU CHOICE GOES HERE + +cpu1 : entity work.cpu09 +port map( + clk => not(cpuClock), + rst => not(reset_n_internal), + rw => n_WR, + addr => cpuAddress, + data_in => cpuDataIn, + data_out => cpuDataOut, + halt => '0', + hold => '0', + irq => '0', + firq => '0', + nmi => '0' +); + +-- ____________________________________________________________________________________ +-- ROM GOES HERE + +rom1 : entity work.M6809_EXT_BASIC_ROM -- 8KB BASIC +port map( + address => cpuAddress(12 downto 0), + clock => clk, + q => basRomData +); + +-- ____________________________________________________________________________________ +-- RAM GOES HERE + +ram1: entity work.InternalRam64K +port map +( + address => cpuAddress(15 downto 0), + clock => clk, + data => cpuDataOut, + wren => not(n_memWR or n_internalRam1CS), + q => internalRam1DataOut +); + +-- ____________________________________________________________________________________ +-- INPUT/OUTPUT DEVICES GO HERE + +io1 : entity work.SBCTextDisplayRGB +port map ( + n_reset => reset_n_internal, + clk => clk, + + -- RGB video signals + hSync => HS, + vSync => VS, + videoR0 => R(1), + videoR1 => R(0), + videoG0 => G(1), + videoG1 => G(0), + videoB0 => B(1), + videoB1 => B(0), + hBlank => hBlank, + vBlank => vBlank, + cepix => cepix, + + -- Monochrome video signals (when using TV timings only) + sync => videoSync, + video => video, + + n_wr => n_interface1CS or cpuClock or n_WR, + n_rd => n_interface1CS or cpuClock or (not n_WR), + n_int => n_int1, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => interface1DataOut, + ps2Clk => ps2Clk, + ps2Data => ps2Data +); + +io2 : entity work.bufferedUART +port map( + clk => clk, + n_wr => n_interface2CS or cpuClock or n_WR, + n_rd => n_interface2CS or cpuClock or (not n_WR), + n_int => n_int2, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => interface2DataOut, + rxClock => serialClock, + txClock => serialClock, + rxd => rxd1, + txd => txd1, + n_cts => cts1, -- Connect CTS signal + n_dcd => '0', + n_rts => rts1 +); + +sd1 : entity work.sd_controller +port map( + sdCS => sdCS, + sdMOSI => sdMOSI, + sdMISO => sdMISO_int, + sdSCLK => sdSCLK, + n_wr => n_sdCardCS or cpuClock or n_WR, + n_rd => n_sdCardCS or cpuClock or (not n_WR), + n_reset => reset_n_internal, + dataIn => cpuDataOut, + dataOut => sdCardDataOut_sd, + regAddr => cpuAddress(2 downto 0), + driveLED => driveLED_sd, + clk => sdClock -- twice the spi clk +); + + -- Add signal assignment outside port map: + sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1'; + + -- New image controller + img1 : entity work.image_controller + port map( + clk => clk, + n_reset => reset_n_internal, + n_rd => n_sdCardCS or n_ioRD, + n_wr => n_sdCardCS or n_ioWR, + dataIn => cpuDataOut, + dataOut => sdCardDataOut_img, + regAddr => cpuAddress(2 downto 0), + driveLED => driveLED_img + ); + +-- ____________________________________________________________________________________ +-- MEMORY READ/WRITE LOGIC GOES HERE + +n_memRD <= not(cpuClock) nand n_WR; +n_memWR <= not(cpuClock) nand (not n_WR); + +-- ____________________________________________________________________________________ +-- CHIP SELECTS GO HERE + +n_basRomCS <= '0' when cpuAddress(15 downto 13) = "111" else '1'; --8K at top of memory +n_interface1CS <= '0' when cpuAddress(15 downto 1) = "111111111101000" else '1'; -- 2 bytes FFD0-FFD1 +n_interface2CS <= '0' when cpuAddress(15 downto 1) = "111111111101001" else '1'; -- 2 bytes FFD2-FFD3 +n_sdCardCS <= '0' when cpuAddress(15 downto 3) = "1111111111011" else '1'; -- 8 bytes FFD8-FFDF +n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K + +-- ____________________________________________________________________________________ +-- BUS ISOLATION GOES HERE + -- Mux controller outputs based on selection + sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else + sdCardDataOut_sd; + + driveLED <= driveLED_img when sd_ctrl_sel = '1' else + driveLED_sd; + + +cpuDataIn <= +interface1DataOut when n_interface1CS = '0' else +interface2DataOut when n_interface2CS = '0' else +sdCardDataOut when n_sdCardCS = '0' else +basRomData when n_basRomCS = '0' else +internalRam1DataOut when n_internalRam1CS= '0' else +sramData when n_externalRamCS= '0' else +x"FF"; + +-- ____________________________________________________________________________________ +-- SYSTEM CLOCKS GO HERE + +-- SUB-CIRCUIT CLOCK SIGNALS + +serialClock <= serialClkCount(15); +process (clk) +begin + if rising_edge(clk) then + + if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz + cpuClkCount <= cpuClkCount + 1; + else + cpuClkCount <= (others=>'0'); + end if; + if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz + cpuClock <= '0'; + else + cpuClock <= '1'; + end if; + + if sdClkCount < 49 then -- 1MHz + sdClkCount <= sdClkCount + 1; + else + sdClkCount <= (others=>'0'); + end if; + + if sdClkCount < 25 then + sdClock <= '0'; + else + sdClock <= '1'; + end if; + + -- Serial clock DDS + -- 50MHz master input clock: + -- Baud Increment + -- 115200 2416 + -- 38400 805 + -- 19200 403 + -- 9600 201 + -- 4800 101 + -- 2400 50 + serialClkCount <= serialClkCount + unsigned(baud_increment); + end if; +end process; + end; \ No newline at end of file diff --git a/MicrocomputerZ80Basic.vhd b/MicrocomputerZ80Basic.vhd index 77edfca..712c05c 100644 --- a/MicrocomputerZ80Basic.vhd +++ b/MicrocomputerZ80Basic.vhd @@ -1,332 +1,352 @@ --- This file is copyright by Grant Searle 2014 --- You are free to use this file in your own projects but must never charge for it nor use it without --- acknowledgement. --- Please ask permission from Grant Searle before republishing elsewhere. --- If you use this file or any part of it, please add an acknowledgement to myself and --- a link back to my main web site http://searle.hostei.com/grant/ --- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html --- --- Please check on the above web pages to see if there are any updates before using this file. --- If for some reason the page is no longer available, please search for "Grant Searle" --- on the internet to see if I have moved to another web hosting service. --- --- Grant Searle --- eMail address available on my main web page link above. - -library ieee; -use ieee.std_logic_1164.all; -use IEEE.STD_LOGIC_ARITH.all; -use IEEE.STD_LOGIC_UNSIGNED.all; - -entity MicrocomputerZ80Basic is - port( - N_RESET : in std_logic; - clk : in std_logic; - baud_increment : in std_logic_vector(15 downto 0); - - sramData : inout std_logic_vector(7 downto 0); - sramAddress : out std_logic_vector(15 downto 0); - n_sRamWE : out std_logic; - n_sRamCS : out std_logic; - n_sRamOE : out std_logic; - n_sRamLB : out std_logic; - n_sRamUB : out std_logic; - - rxd1 : in std_logic; - txd1 : out std_logic; - rts1 : out std_logic; - cts1 : in std_logic; -- Added CTS input - - rxd2 : in std_logic; - txd2 : out std_logic; - rts2 : out std_logic; - - videoSync : out std_logic; - video : out std_logic; - - R : out std_logic_vector(1 downto 0); - G : out std_logic_vector(1 downto 0); - B : out std_logic_vector(1 downto 0); - HS : out std_logic; - VS : out std_logic; - hBlank : out std_logic; - vBlank : out std_logic; - cepix : out std_logic; - - ps2Clk : in std_logic; - ps2Data : in std_logic; - - sdCS : out std_logic; - sdMOSI : out std_logic; - sdMISO : in std_logic; - sdSCLK : out std_logic; - sd_ctrl_sel : in std_logic; - driveLED : out std_logic :='1' - ); -end MicrocomputerZ80Basic; - -architecture struct of MicrocomputerZ80Basic is - - signal n_WR : std_logic; - signal n_RD : std_logic; - signal cpuAddress : std_logic_vector(15 downto 0); - signal cpuDataOut : std_logic_vector(7 downto 0); - signal cpuDataIn : std_logic_vector(7 downto 0); - - signal basRomData : std_logic_vector(7 downto 0); - signal internalRam1DataOut : std_logic_vector(7 downto 0); - signal internalRam2DataOut : std_logic_vector(7 downto 0); - signal interface1DataOut : std_logic_vector(7 downto 0); - signal interface2DataOut : std_logic_vector(7 downto 0); - signal sdCardDataOut : std_logic_vector(7 downto 0); - - signal n_memWR : std_logic :='1'; - signal n_memRD : std_logic :='1'; - - signal n_ioWR : std_logic :='1'; - signal n_ioRD : std_logic :='1'; - - signal n_MREQ : std_logic :='1'; - signal n_IORQ : std_logic :='1'; - - signal n_int1 : std_logic :='1'; - signal n_int2 : std_logic :='1'; - - signal n_externalRamCS : std_logic :='1'; - signal n_internalRam1CS : std_logic :='1'; - signal n_internalRam2CS : std_logic :='1'; - signal n_basRomCS : std_logic :='1'; - signal n_interface1CS : std_logic :='1'; - signal n_interface2CS : std_logic :='1'; - signal n_sdCardCS : std_logic :='1'; - - signal sdCardDataOut_sd : std_logic_vector(7 downto 0); - signal sdCardDataOut_img : std_logic_vector(7 downto 0); - signal driveLED_sd, driveLED_img : std_logic; - signal sdMISO_int : std_logic; -- Add this signal declaration - - - signal serialClkCount : unsigned(15 downto 0); - signal cpuClkCount : std_logic_vector(5 downto 0); - signal sdClkCount : std_logic_vector(5 downto 0); - signal cpuClock : std_logic; - signal serialClock : std_logic; - signal sdClock : std_logic; - -begin - --- ____________________________________________________________________________________ --- CPU CHOICE GOES HERE - -cpu1 : entity work.t80s -generic map(mode => 1, t2write => 1, iowait => 0) -port map( - reset_n => N_RESET, - clk_n => cpuClock, - wait_n => '1', - int_n => '1', - nmi_n => '1', - busrq_n => '1', - mreq_n => n_MREQ, - iorq_n => n_IORQ, - rd_n => n_RD, - wr_n => n_WR, - a => cpuAddress, - di => cpuDataIn, - do => cpuDataOut -); --- ____________________________________________________________________________________ --- ROM GOES HERE - -rom1 : entity work.Z80_BASIC_ROM -- 8KB BASIC -port map( - address => cpuAddress(12 downto 0), - clock => clk, - q => basRomData -); - --- ____________________________________________________________________________________ --- RAM GOES HERE - -ram1: entity work.InternalRam64K -port map -( - address => cpuAddress(15 downto 0), - clock => clk, - data => cpuDataOut, - wren => not(n_memWR or n_internalRam1CS), - q => internalRam1DataOut -); - --- ____________________________________________________________________________________ --- INPUT/OUTPUT DEVICES GO HERE - - -io1 : entity work.SBCTextDisplayRGB -port map ( - n_reset => N_RESET, - clk => clk, - - -- RGB video signals - hSync => HS, - vSync => VS, - videoR0 => R(1), - videoR1 => R(0), - videoG0 => G(1), - videoG1 => G(0), - videoB0 => B(1), - videoB1 => B(0), - hBlank => hBlank, - vBlank => vBlank, - cepix => cepix, - - -- Monochrome video signals (when using TV timings only) - sync => videoSync, - video => video, - - n_wr => n_interface1CS or n_ioWR, - n_rd => n_interface1CS or n_ioRD, - n_int => n_int1, - regSel => cpuAddress(0), - dataIn => cpuDataOut, - dataOut => interface1DataOut, - ps2Clk => ps2Clk, - ps2Data => ps2Data -); - -io2 : entity work.bufferedUART -port map( - clk => clk, - n_wr => n_interface2CS or n_ioWR, - n_rd => n_interface2CS or n_ioRD, - n_int => n_int2, - regSel => cpuAddress(0), - dataIn => cpuDataOut, - dataOut => interface2DataOut, - rxClock => serialClock, - txClock => serialClock, - rxd => rxd1, - txd => txd1, - n_cts => cts1, -- Connect CTS signal - n_dcd => '0', - n_rts => rts1 -); - -sd1 : entity work.sd_controller -port map( - sdCS => sdCS, - sdMOSI => sdMOSI, - sdMISO => sdMISO_int, - sdSCLK => sdSCLK, - n_wr => n_sdCardCS or n_ioWR, - n_rd => n_sdCardCS or n_ioRD, - n_reset => N_RESET, - dataIn => cpuDataOut, - dataOut => sdCardDataOut_sd, - regAddr => cpuAddress(2 downto 0), - driveLED => driveLED_sd, - clk => sdClock -- twice the spi clk -); - - -- Add signal assignment outside port map: - sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1'; - - -- New image controller - img1 : entity work.image_controller - port map( - clk => clk, - n_reset => N_RESET, - n_rd => n_sdCardCS or n_ioRD, - n_wr => n_sdCardCS or n_ioWR, - dataIn => cpuDataOut, - dataOut => sdCardDataOut_img, - regAddr => cpuAddress(2 downto 0), - driveLED => driveLED_img - ); - - --- ____________________________________________________________________________________ --- MEMORY READ/WRITE LOGIC GOES HERE - -n_ioWR <= n_WR or n_IORQ; -n_memWR <= n_WR or n_MREQ; -n_ioRD <= n_RD or n_IORQ; -n_memRD <= n_RD or n_MREQ; - --- ____________________________________________________________________________________ --- CHIP SELECTS GO HERE - - -n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" else '1'; --8K at bottom of memory -n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81 -n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83 -n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F -n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K - --- ____________________________________________________________________________________ --- BUS ISOLATION GOES HERE - - -- Mux controller outputs based on selection - sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else - sdCardDataOut_sd; - - driveLED <= driveLED_img when sd_ctrl_sel = '1' else - driveLED_sd; - - -cpuDataIn <= -interface1DataOut when n_interface1CS = '0' else -interface2DataOut when n_interface2CS = '0' else -sdCardDataOut when n_sdCardCS = '0' else -basRomData when n_basRomCS = '0' else -internalRam1DataOut when n_internalRam1CS= '0' else -sramData when n_externalRamCS= '0' else -x"FF"; - --- ____________________________________________________________________________________ --- SYSTEM CLOCKS GO HERE - - --- SUB-CIRCUIT CLOCK SIGNALS -serialClock <= serialClkCount(15); -process (clk) -begin - if rising_edge(clk) then - - if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz - cpuClkCount <= cpuClkCount + 1; - else - cpuClkCount <= (others=>'0'); - end if; - if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz - cpuClock <= '0'; - else - cpuClock <= '1'; - end if; - - if sdClkCount < 49 then -- 1MHz - sdClkCount <= sdClkCount + 1; - else - sdClkCount <= (others=>'0'); - end if; - - if sdClkCount < 25 then - sdClock <= '0'; - else - sdClock <= '1'; - end if; - - -- Serial clock DDS - -- 50MHz master input clock: - -- Baud Increment - -- 115200 2416 - -- 38400 805 - -- 19200 403 - -- 9600 201 - -- 4800 101 - -- 2400 50 - serialClkCount <= serialClkCount + unsigned(baud_increment); - end if; -end process; - -end; +-- This file is copyright by Grant Searle 2014 +-- You are free to use this file in your own projects but must never charge for it nor use it without +-- acknowledgement. +-- Please ask permission from Grant Searle before republishing elsewhere. +-- If you use this file or any part of it, please add an acknowledgement to myself and +-- a link back to my main web site http://searle.hostei.com/grant/ +-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html +-- +-- Please check on the above web pages to see if there are any updates before using this file. +-- If for some reason the page is no longer available, please search for "Grant Searle" +-- on the internet to see if I have moved to another web hosting service. +-- +-- Grant Searle +-- eMail address available on my main web page link above. + +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_ARITH.all; +use IEEE.STD_LOGIC_UNSIGNED.all; + +entity MicrocomputerZ80Basic is + port( + N_RESET : in std_logic; + clk : in std_logic; + baud_increment : in std_logic_vector(15 downto 0); + + sramData : inout std_logic_vector(7 downto 0); + sramAddress : out std_logic_vector(15 downto 0); + n_sRamWE : out std_logic; + n_sRamCS : out std_logic; + n_sRamOE : out std_logic; + n_sRamLB : out std_logic; + n_sRamUB : out std_logic; + + rxd1 : in std_logic; + txd1 : out std_logic; + rts1 : out std_logic; + cts1 : in std_logic; -- Added CTS input + + rxd2 : in std_logic; + txd2 : out std_logic; + rts2 : out std_logic; + + videoSync : out std_logic; + video : out std_logic; + + R : out std_logic_vector(1 downto 0); + G : out std_logic_vector(1 downto 0); + B : out std_logic_vector(1 downto 0); + HS : out std_logic; + VS : out std_logic; + hBlank : out std_logic; + vBlank : out std_logic; + cepix : out std_logic; + + ps2Clk : in std_logic; + ps2Data : in std_logic; + + sdCS : out std_logic; + sdMOSI : out std_logic; + sdMISO : in std_logic; + sdSCLK : out std_logic; + sd_ctrl_sel : in std_logic; + driveLED : out std_logic :='1' + ); +end MicrocomputerZ80Basic; + +architecture struct of MicrocomputerZ80Basic is + + signal reset_counter : unsigned(15 downto 0) := (others => '0'); + signal reset_n_internal : std_logic := '0'; -- Active low internal reset + + signal n_WR : std_logic; + signal n_RD : std_logic; + signal cpuAddress : std_logic_vector(15 downto 0); + signal cpuDataOut : std_logic_vector(7 downto 0); + signal cpuDataIn : std_logic_vector(7 downto 0); + + signal basRomData : std_logic_vector(7 downto 0); + signal internalRam1DataOut : std_logic_vector(7 downto 0); + signal internalRam2DataOut : std_logic_vector(7 downto 0); + signal interface1DataOut : std_logic_vector(7 downto 0); + signal interface2DataOut : std_logic_vector(7 downto 0); + signal sdCardDataOut : std_logic_vector(7 downto 0); + + signal n_memWR : std_logic :='1'; + signal n_memRD : std_logic :='1'; + + signal n_ioWR : std_logic :='1'; + signal n_ioRD : std_logic :='1'; + + signal n_MREQ : std_logic :='1'; + signal n_IORQ : std_logic :='1'; + + signal n_int1 : std_logic :='1'; + signal n_int2 : std_logic :='1'; + + signal n_externalRamCS : std_logic :='1'; + signal n_internalRam1CS : std_logic :='1'; + signal n_internalRam2CS : std_logic :='1'; + signal n_basRomCS : std_logic :='1'; + signal n_interface1CS : std_logic :='1'; + signal n_interface2CS : std_logic :='1'; + signal n_sdCardCS : std_logic :='1'; + + signal sdCardDataOut_sd : std_logic_vector(7 downto 0); + signal sdCardDataOut_img : std_logic_vector(7 downto 0); + signal driveLED_sd, driveLED_img : std_logic; + signal sdMISO_int : std_logic; -- Add this signal declaration + + + signal serialClkCount : unsigned(15 downto 0); + signal cpuClkCount : std_logic_vector(5 downto 0); + signal sdClkCount : std_logic_vector(5 downto 0); + signal cpuClock : std_logic; + signal serialClock : std_logic; + signal sdClock : std_logic; + +begin + +process(clk) +begin + if rising_edge(clk) then + if N_RESET = '0' then + reset_counter <= (others => '0'); + reset_n_internal <= '0'; + else + if reset_counter /= unsigned'(X"FFFF") then + reset_counter <= reset_counter + 1; + reset_n_internal <= '0'; + else + reset_n_internal <= '1'; + end if; + end if; + end if; +end process; + +-- ____________________________________________________________________________________ +-- CPU CHOICE GOES HERE + +cpu1 : entity work.t80s +generic map(mode => 1, t2write => 1, iowait => 0) +port map( + reset_n => reset_n_internal, + clk_n => cpuClock, + wait_n => '1', + int_n => '1', + nmi_n => '1', + busrq_n => '1', + mreq_n => n_MREQ, + iorq_n => n_IORQ, + rd_n => n_RD, + wr_n => n_WR, + a => cpuAddress, + di => cpuDataIn, + do => cpuDataOut +); +-- ____________________________________________________________________________________ +-- ROM GOES HERE + +rom1 : entity work.Z80_BASIC_ROM -- 8KB BASIC +port map( + address => cpuAddress(12 downto 0), + clock => clk, + q => basRomData +); + +-- ____________________________________________________________________________________ +-- RAM GOES HERE + +ram1: entity work.InternalRam64K +port map +( + address => cpuAddress(15 downto 0), + clock => clk, + data => cpuDataOut, + wren => not(n_memWR or n_internalRam1CS), + q => internalRam1DataOut +); + +-- ____________________________________________________________________________________ +-- INPUT/OUTPUT DEVICES GO HERE + + +io1 : entity work.SBCTextDisplayRGB +port map ( + n_reset => N_RESET, + clk => clk, + + -- RGB video signals + hSync => HS, + vSync => VS, + videoR0 => R(1), + videoR1 => R(0), + videoG0 => G(1), + videoG1 => G(0), + videoB0 => B(1), + videoB1 => B(0), + hBlank => hBlank, + vBlank => vBlank, + cepix => cepix, + + -- Monochrome video signals (when using TV timings only) + sync => videoSync, + video => video, + + n_wr => n_interface1CS or n_ioWR, + n_rd => n_interface1CS or n_ioRD, + n_int => n_int1, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => interface1DataOut, + ps2Clk => ps2Clk, + ps2Data => ps2Data +); + +io2 : entity work.bufferedUART +port map( + clk => clk, + n_wr => n_interface2CS or n_ioWR, + n_rd => n_interface2CS or n_ioRD, + n_int => n_int2, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => interface2DataOut, + rxClock => serialClock, + txClock => serialClock, + rxd => rxd1, + txd => txd1, + n_cts => cts1, -- Connect CTS signal + n_dcd => '0', + n_rts => rts1 +); + +sd1 : entity work.sd_controller +port map( + sdCS => sdCS, + sdMOSI => sdMOSI, + sdMISO => sdMISO_int, + sdSCLK => sdSCLK, + n_wr => n_sdCardCS or n_ioWR, + n_rd => n_sdCardCS or n_ioRD, + n_reset => N_RESET, + dataIn => cpuDataOut, + dataOut => sdCardDataOut_sd, + regAddr => cpuAddress(2 downto 0), + driveLED => driveLED_sd, + clk => sdClock -- twice the spi clk +); + + -- Add signal assignment outside port map: + sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1'; + + -- New image controller + img1 : entity work.image_controller + port map( + clk => clk, + n_reset => N_RESET, + n_rd => n_sdCardCS or n_ioRD, + n_wr => n_sdCardCS or n_ioWR, + dataIn => cpuDataOut, + dataOut => sdCardDataOut_img, + regAddr => cpuAddress(2 downto 0), + driveLED => driveLED_img + ); + + +-- ____________________________________________________________________________________ +-- MEMORY READ/WRITE LOGIC GOES HERE + +n_ioWR <= n_WR or n_IORQ; +n_memWR <= n_WR or n_MREQ; +n_ioRD <= n_RD or n_IORQ; +n_memRD <= n_RD or n_MREQ; + +-- ____________________________________________________________________________________ +-- CHIP SELECTS GO HERE + + +n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" else '1'; --8K at bottom of memory +n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81 +n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83 +n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F +n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K + +-- ____________________________________________________________________________________ +-- BUS ISOLATION GOES HERE + + -- Mux controller outputs based on selection + sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else + sdCardDataOut_sd; + + driveLED <= driveLED_img when sd_ctrl_sel = '1' else + driveLED_sd; + + +cpuDataIn <= +interface1DataOut when n_interface1CS = '0' else +interface2DataOut when n_interface2CS = '0' else +sdCardDataOut when n_sdCardCS = '0' else +basRomData when n_basRomCS = '0' else +internalRam1DataOut when n_internalRam1CS= '0' else +sramData when n_externalRamCS= '0' else +x"FF"; + +-- ____________________________________________________________________________________ +-- SYSTEM CLOCKS GO HERE + + +-- SUB-CIRCUIT CLOCK SIGNALS +serialClock <= serialClkCount(15); +process (clk) +begin + if rising_edge(clk) then + + if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz + cpuClkCount <= cpuClkCount + 1; + else + cpuClkCount <= (others=>'0'); + end if; + if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz + cpuClock <= '0'; + else + cpuClock <= '1'; + end if; + + if sdClkCount < 49 then -- 1MHz + sdClkCount <= sdClkCount + 1; + else + sdClkCount <= (others=>'0'); + end if; + + if sdClkCount < 25 then + sdClock <= '0'; + else + sdClock <= '1'; + end if; + + -- Serial clock DDS + -- 50MHz master input clock: + -- Baud Increment + -- 115200 2416 + -- 38400 805 + -- 19200 403 + -- 9600 201 + -- 4800 101 + -- 2400 50 + serialClkCount <= serialClkCount + unsigned(baud_increment); + end if; +end process; + +end; diff --git a/MicrocomputerZ80CPM.vhd b/MicrocomputerZ80CPM.vhd index 9e3d9c2..5edfa6f 100644 --- a/MicrocomputerZ80CPM.vhd +++ b/MicrocomputerZ80CPM.vhd @@ -1,391 +1,412 @@ --- This file is copyright by Grant Searle 2014 --- You are free to use this file in your own projects but must never charge for it nor use it without --- acknowledgement. --- Please ask permission from Grant Searle before republishing elsewhere. --- If you use this file or any part of it, please add an acknowledgement to myself and --- a link back to my main web site http://searle.hostei.com/grant/ --- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html --- --- Please check on the above web pages to see if there are any updates before using this file. --- If for some reason the page is no longer available, please search for "Grant Searle" --- on the internet to see if I have moved to another web hosting service. --- --- Grant Searle --- eMail address available on my main web page link above. - -library ieee; -use ieee.std_logic_1164.all; -use IEEE.STD_LOGIC_ARITH.all; -use IEEE.STD_LOGIC_UNSIGNED.all; - -entity MicrocomputerZ80CPM is - port( - N_RESET : in std_logic; - clk : in std_logic; - baud_increment : in std_logic_vector(15 downto 0); - - sramData : inout std_logic_vector(7 downto 0); - sramAddress : out std_logic_vector(15 downto 0); - n_sRamWE : out std_logic; - n_sRamCS : out std_logic; - n_sRamOE : out std_logic; - n_sRamLB : out std_logic; - n_sRamUB : out std_logic; - - rxd1 : in std_logic; - txd1 : out std_logic; - rts1 : out std_logic; - cts1 : in std_logic; -- Added CTS input - - rxd2 : in std_logic; - txd2 : out std_logic; - rts2 : out std_logic; - - videoSync : out std_logic; - video : out std_logic; - - R : out std_logic_vector(1 downto 0); - G : out std_logic_vector(1 downto 0); - B : out std_logic_vector(1 downto 0); - HS : out std_logic; - VS : out std_logic; - hBlank : out std_logic; - vBlank : out std_logic; - cepix : out std_logic; - - ps2Clk : in std_logic; - ps2Data : in std_logic; - - sdCS : out std_logic; - sdMOSI : out std_logic; - sdMISO : in std_logic; - sdSCLK : out std_logic; - sd_ctrl_sel : in std_logic; - driveLED : out std_logic :='1'; - - usbCS : out std_logic; - usbMOSI : out std_logic; - usbMISO : in std_logic; - usbSCLK : out std_logic - ); -end MicrocomputerZ80CPM; - -architecture struct of MicrocomputerZ80CPM is - - signal n_WR : std_logic; - signal n_RD : std_logic; - signal cpuAddress : std_logic_vector(15 downto 0); - signal cpuDataOut : std_logic_vector(7 downto 0); - signal cpuDataIn : std_logic_vector(7 downto 0); - - signal basRomData : std_logic_vector(7 downto 0); - signal internalRam1DataOut : std_logic_vector(7 downto 0); - signal internalRam2DataOut : std_logic_vector(7 downto 0); - signal interface1DataOut : std_logic_vector(7 downto 0); - signal interface2DataOut : std_logic_vector(7 downto 0); - signal ch376sDataOut : std_logic_vector(7 downto 0); - signal sdCardDataOut : std_logic_vector(7 downto 0); - - signal n_memWR : std_logic :='1'; - signal n_memRD : std_logic :='1'; - - signal n_ioWR : std_logic :='1'; - signal n_ioRD : std_logic :='1'; - - signal n_MREQ : std_logic :='1'; - signal n_IORQ : std_logic :='1'; - - signal n_int1 : std_logic :='1'; - signal n_int2 : std_logic :='1'; - - signal n_externalRamCS : std_logic :='1'; - signal n_internalRam1CS : std_logic :='1'; - signal n_internalRam2CS : std_logic :='1'; - signal n_basRomCS : std_logic :='1'; - signal n_interface1CS : std_logic :='1'; - signal n_interface2CS : std_logic :='1'; - signal n_ch376sCS : std_logic :='1'; - signal n_sdCardCS : std_logic :='1'; - - signal serialClkCount : unsigned(15 downto 0); - signal cpuClkCount : std_logic_vector(5 downto 0); - signal sdClkCount : std_logic_vector(5 downto 0); - signal cpuClock : std_logic; - signal serialClock : std_logic; - signal sdClock : std_logic; - signal sdCardDataOut_sd : std_logic_vector(7 downto 0); - signal sdCardDataOut_img : std_logic_vector(7 downto 0); - signal driveLED_sd, driveLED_img : std_logic; - signal sdMISO_int : std_logic; -- Add this signal declaration - - --CPM - signal n_RomActive : std_logic := '0'; - - component ch376s_module is - port ( - -- interface - clk : in std_logic; - rd : in std_logic; - wr : in std_logic; - reset : in std_logic; - a0 : in std_logic; - - -- SPI wires - sck : out std_logic; - sdcs : out std_logic; - sdo : out std_logic; -- reg - sdi : in std_logic; - - -- data - din : in std_logic_vector (7 downto 0); - dout : out std_logic_vector (7 downto 0) -- reg - ); - end component; - - -begin - --CPM - -- Disable ROM if out 38. Re-enable when (asynchronous) reset pressed - process (n_ioWR, N_RESET) begin - if (N_RESET = '0') then - n_RomActive <= '0'; - elsif (rising_edge(n_ioWR)) then - if cpuAddress(7 downto 0) = "00111000" then -- $38 - n_RomActive <= '1'; - end if; - end if; - end process; --- ____________________________________________________________________________________ --- CPU CHOICE GOES HERE - -cpu1 : entity work.t80s -generic map(mode => 1, t2write => 1, iowait => 0) -port map( - reset_n => N_RESET, - clk_n => cpuClock, - wait_n => '1', - int_n => '1', - nmi_n => '1', - busrq_n => '1', - mreq_n => n_MREQ, - iorq_n => n_IORQ, - rd_n => n_RD, - wr_n => n_WR, - a => cpuAddress, - di => cpuDataIn, - do => cpuDataOut -); --- ____________________________________________________________________________________ --- ROM GOES HERE - -rom1 : entity work.Z80_CPM_BASIC_ROM -port map( - address => cpuAddress(12 downto 0), - clock => clk, - q => basRomData -); - --- ____________________________________________________________________________________ --- RAM GOES HERE - -ram1: entity work.InternalRam64K -port map -( - address => cpuAddress(15 downto 0), - clock => clk, - data => cpuDataOut, - wren => not(n_memWR or n_internalRam1CS), - q => internalRam1DataOut -); - --- ____________________________________________________________________________________ --- INPUT/OUTPUT DEVICES GO HERE - - -io1 : entity work.SBCTextDisplayRGB -port map ( - n_reset => N_RESET, - clk => clk, - - -- RGB video signals - hSync => HS, - vSync => VS, - videoR0 => R(1), - videoR1 => R(0), - videoG0 => G(1), - videoG1 => G(0), - videoB0 => B(1), - videoB1 => B(0), - hBlank => hBlank, - vBlank => vBlank, - cepix => cepix, - - -- Monochrome video signals (when using TV timings only) - sync => videoSync, - video => video, - - n_wr => n_interface1CS or n_ioWR, - n_rd => n_interface1CS or n_ioRD, - n_int => n_int1, - regSel => cpuAddress(0), - dataIn => cpuDataOut, - dataOut => interface1DataOut, - ps2Clk => ps2Clk, - ps2Data => ps2Data -); - -io2 : entity work.bufferedUART -port map( - clk => clk, - n_wr => n_interface2CS or n_ioWR, - n_rd => n_interface2CS or n_ioRD, - n_int => n_int2, - regSel => cpuAddress(0), - dataIn => cpuDataOut, - dataOut => interface2DataOut, - rxClock => serialClock, - txClock => serialClock, - rxd => rxd1, - txd => txd1, - n_cts => cts1, -- Connect CTS signal - n_dcd => '0', - n_rts => rts1 -); - - sd1 : entity work.sd_controller - port map( - sdCS => sdCS, - sdMOSI => sdMOSI, - sdMISO => sdMISO_int, -- Use the internal signal - sdSCLK => sdSCLK, - n_wr => n_sdCardCS or n_ioWR, - n_rd => n_sdCardCS or n_ioRD, - n_reset => N_RESET, - dataIn => cpuDataOut, - dataOut => sdCardDataOut_sd, - regAddr => cpuAddress(2 downto 0), - driveLED => driveLED_sd, - clk => clk - ); - - -- Add signal assignment outside port map: - sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1'; - - -- New image controller - img1 : entity work.image_controller - port map( - clk => clk, - n_reset => N_RESET, - n_rd => n_sdCardCS or n_ioRD, - n_wr => n_sdCardCS or n_ioWR, - dataIn => cpuDataOut, - dataOut => sdCardDataOut_img, - regAddr => cpuAddress(2 downto 0), - driveLED => driveLED_img - ); - -usb : ch376s_module -port map ( - sdcs => usbCS, - sdo => usbMOSI, - sdi => usbMISO, - sck => usbSCLK, - - wr => not (n_ch376sCS or n_ioWR), - rd => not (n_ch376sCS or n_ioRD), - - dout => ch376sDataOut, - din => cpuDataOut, - - a0 => cpuAddress (0), - reset => not (N_RESET), - clk => sdClock -- twice the spi clk -); - - --- ____________________________________________________________________________________ --- MEMORY READ/WRITE LOGIC GOES HERE - -n_ioWR <= n_WR or n_IORQ; -n_memWR <= n_WR or n_MREQ; -n_ioRD <= n_RD or n_IORQ; -n_memRD <= n_RD or n_MREQ; - --- ____________________________________________________________________________________ --- CHIP SELECTS GO HERE - -n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" and n_RomActive = '0' else '1'; --8K at bottom of memory -n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81 -n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83 -n_ch376sCS <= '0' when cpuAddress(7 downto 1) = "0010000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $20-$21 -n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F -n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K - --- ____________________________________________________________________________________ --- BUS ISOLATION GOES HERE - - -- Mux controller outputs based on selection - sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else - sdCardDataOut_sd; - - driveLED <= driveLED_img when sd_ctrl_sel = '1' else - driveLED_sd; - - -- CPU data input mux needs to be written like this: - cpuDataIn <= interface1DataOut when (n_interface1CS = '0') else - interface2DataOut when (n_interface2CS = '0') else - ch376sDataOut when (n_ch376sCS = '0') else - sdCardDataOut when (n_sdCardCS = '0') else - basRomData when (n_basRomCS = '0') else - internalRam1DataOut when (n_internalRam1CS = '0') else - sramData when (n_externalRamCS = '0') else - x"FF"; --- ____________________________________________________________________________________ --- SYSTEM CLOCKS GO HERE - - --- SUB-CIRCUIT CLOCK SIGNALS -serialClock <= serialClkCount(15); ---sdClock <= clk; - -process (clk) -begin - if rising_edge(clk) then - - if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz - cpuClkCount <= cpuClkCount + 1; - else - cpuClkCount <= (others=>'0'); - end if; - - if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz - cpuClock <= '0'; - else - cpuClock <= '1'; - end if; - - if sdClkCount < 16 then -- 5MHz - sdClkCount <= sdClkCount + 1; - else - sdClkCount <= (others=>'0'); - end if; - - sdClock <= sdClkCount (3); -- divide by 8 = 6.25 Mhz - --usbCS <= sdClkCount (4); - --usbMOSI <= sdClkCount (3); - --usbSCLK <= sdClkCount (2); - - -- Serial clock DDS - -- 50MHz master input clock: - -- Baud Increment - -- 115200 2416 - -- 38400 805 - -- 19200 403 - -- 9600 201 - -- 4800 101 - -- 2400 50 - serialClkCount <= serialClkCount + unsigned(baud_increment); - end if; -end process; - -end; +-- This file is copyright by Grant Searle 2014 +-- You are free to use this file in your own projects but must never charge for it nor use it without +-- acknowledgement. +-- Please ask permission from Grant Searle before republishing elsewhere. +-- If you use this file or any part of it, please add an acknowledgement to myself and +-- a link back to my main web site http://searle.hostei.com/grant/ +-- and to the "multicomp" page at http://searle.hostei.com/grant/Multicomp/index.html +-- +-- Please check on the above web pages to see if there are any updates before using this file. +-- If for some reason the page is no longer available, please search for "Grant Searle" +-- on the internet to see if I have moved to another web hosting service. +-- +-- Grant Searle +-- eMail address available on my main web page link above. + +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_ARITH.all; +use IEEE.STD_LOGIC_UNSIGNED.all; + +entity MicrocomputerZ80CPM is + port( + N_RESET : in std_logic; + clk : in std_logic; + baud_increment : in std_logic_vector(15 downto 0); + + sramData : inout std_logic_vector(7 downto 0); + sramAddress : out std_logic_vector(15 downto 0); + n_sRamWE : out std_logic; + n_sRamCS : out std_logic; + n_sRamOE : out std_logic; + n_sRamLB : out std_logic; + n_sRamUB : out std_logic; + + rxd1 : in std_logic; + txd1 : out std_logic; + rts1 : out std_logic; + cts1 : in std_logic; -- Added CTS input + + rxd2 : in std_logic; + txd2 : out std_logic; + rts2 : out std_logic; + + videoSync : out std_logic; + video : out std_logic; + + R : out std_logic_vector(1 downto 0); + G : out std_logic_vector(1 downto 0); + B : out std_logic_vector(1 downto 0); + HS : out std_logic; + VS : out std_logic; + hBlank : out std_logic; + vBlank : out std_logic; + cepix : out std_logic; + + ps2Clk : in std_logic; + ps2Data : in std_logic; + + sdCS : out std_logic; + sdMOSI : out std_logic; + sdMISO : in std_logic; + sdSCLK : out std_logic; + sd_ctrl_sel : in std_logic; + driveLED : out std_logic :='1'; + + usbCS : out std_logic; + usbMOSI : out std_logic; + usbMISO : in std_logic; + usbSCLK : out std_logic + ); +end MicrocomputerZ80CPM; + +architecture struct of MicrocomputerZ80CPM is + + signal reset_counter : unsigned(15 downto 0) := (others => '0'); + signal reset_n_internal : std_logic := '0'; -- Active low internal reset + + signal n_WR : std_logic; + signal n_RD : std_logic; + signal cpuAddress : std_logic_vector(15 downto 0); + signal cpuDataOut : std_logic_vector(7 downto 0); + signal cpuDataIn : std_logic_vector(7 downto 0); + + signal basRomData : std_logic_vector(7 downto 0); + signal internalRam1DataOut : std_logic_vector(7 downto 0); + signal internalRam2DataOut : std_logic_vector(7 downto 0); + signal interface1DataOut : std_logic_vector(7 downto 0); + signal interface2DataOut : std_logic_vector(7 downto 0); + signal ch376sDataOut : std_logic_vector(7 downto 0); + signal sdCardDataOut : std_logic_vector(7 downto 0); + + signal n_memWR : std_logic :='1'; + signal n_memRD : std_logic :='1'; + + signal n_ioWR : std_logic :='1'; + signal n_ioRD : std_logic :='1'; + + signal n_MREQ : std_logic :='1'; + signal n_IORQ : std_logic :='1'; + + signal n_int1 : std_logic :='1'; + signal n_int2 : std_logic :='1'; + + signal n_externalRamCS : std_logic :='1'; + signal n_internalRam1CS : std_logic :='1'; + signal n_internalRam2CS : std_logic :='1'; + signal n_basRomCS : std_logic :='1'; + signal n_interface1CS : std_logic :='1'; + signal n_interface2CS : std_logic :='1'; + signal n_ch376sCS : std_logic :='1'; + signal n_sdCardCS : std_logic :='1'; + + signal serialClkCount : unsigned(15 downto 0); + signal cpuClkCount : std_logic_vector(5 downto 0); + signal sdClkCount : std_logic_vector(5 downto 0); + signal cpuClock : std_logic; + signal serialClock : std_logic; + signal sdClock : std_logic; + signal sdCardDataOut_sd : std_logic_vector(7 downto 0); + signal sdCardDataOut_img : std_logic_vector(7 downto 0); + signal driveLED_sd, driveLED_img : std_logic; + signal sdMISO_int : std_logic; -- Add this signal declaration + + --CPM + signal n_RomActive : std_logic := '0'; + + component ch376s_module is + port ( + -- interface + clk : in std_logic; + rd : in std_logic; + wr : in std_logic; + reset : in std_logic; + a0 : in std_logic; + + -- SPI wires + sck : out std_logic; + sdcs : out std_logic; + sdo : out std_logic; -- reg + sdi : in std_logic; + + -- data + din : in std_logic_vector (7 downto 0); + dout : out std_logic_vector (7 downto 0) -- reg + ); + end component; + + +begin + --CPM + -- Disable ROM if out 38. Re-enable when (asynchronous) reset pressed + process (n_ioWR, N_RESET) begin + if (N_RESET = '0') then + n_RomActive <= '0'; + elsif (rising_edge(n_ioWR)) then + if cpuAddress(7 downto 0) = "00111000" then -- $38 + n_RomActive <= '1'; + end if; + end if; + end process; + +process(clk) +begin + if rising_edge(clk) then + if N_RESET = '0' then + reset_counter <= (others => '0'); + reset_n_internal <= '0'; + else + if reset_counter /= unsigned'(X"FFFF") then + reset_counter <= reset_counter + 1; + reset_n_internal <= '0'; + else + reset_n_internal <= '1'; + end if; + end if; + end if; +end process; + +-- ____________________________________________________________________________________ +-- CPU CHOICE GOES HERE + +cpu1 : entity work.t80s +generic map(mode => 1, t2write => 1, iowait => 0) +port map( + reset_n => reset_n_internal, + clk_n => cpuClock, + wait_n => '1', + int_n => '1', + nmi_n => '1', + busrq_n => '1', + mreq_n => n_MREQ, + iorq_n => n_IORQ, + rd_n => n_RD, + wr_n => n_WR, + a => cpuAddress, + di => cpuDataIn, + do => cpuDataOut +); +-- ____________________________________________________________________________________ +-- ROM GOES HERE + +rom1 : entity work.Z80_CPM_BASIC_ROM +port map( + address => cpuAddress(12 downto 0), + clock => clk, + q => basRomData +); + +-- ____________________________________________________________________________________ +-- RAM GOES HERE + +ram1: entity work.InternalRam64K +port map +( + address => cpuAddress(15 downto 0), + clock => clk, + data => cpuDataOut, + wren => not(n_memWR or n_internalRam1CS), + q => internalRam1DataOut +); + +-- ____________________________________________________________________________________ +-- INPUT/OUTPUT DEVICES GO HERE + + +io1 : entity work.SBCTextDisplayRGB +port map ( + n_reset => N_RESET, + clk => clk, + + -- RGB video signals + hSync => HS, + vSync => VS, + videoR0 => R(1), + videoR1 => R(0), + videoG0 => G(1), + videoG1 => G(0), + videoB0 => B(1), + videoB1 => B(0), + hBlank => hBlank, + vBlank => vBlank, + cepix => cepix, + + -- Monochrome video signals (when using TV timings only) + sync => videoSync, + video => video, + + n_wr => n_interface1CS or n_ioWR, + n_rd => n_interface1CS or n_ioRD, + n_int => n_int1, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => interface1DataOut, + ps2Clk => ps2Clk, + ps2Data => ps2Data +); + +io2 : entity work.bufferedUART +port map( + clk => clk, + n_wr => n_interface2CS or n_ioWR, + n_rd => n_interface2CS or n_ioRD, + n_int => n_int2, + regSel => cpuAddress(0), + dataIn => cpuDataOut, + dataOut => interface2DataOut, + rxClock => serialClock, + txClock => serialClock, + rxd => rxd1, + txd => txd1, + n_cts => cts1, -- Connect CTS signal + n_dcd => '0', + n_rts => rts1 +); + + sd1 : entity work.sd_controller + port map( + sdCS => sdCS, + sdMOSI => sdMOSI, + sdMISO => sdMISO_int, -- Use the internal signal + sdSCLK => sdSCLK, + n_wr => n_sdCardCS or n_ioWR, + n_rd => n_sdCardCS or n_ioRD, + n_reset => N_RESET, + dataIn => cpuDataOut, + dataOut => sdCardDataOut_sd, + regAddr => cpuAddress(2 downto 0), + driveLED => driveLED_sd, + clk => clk + ); + + -- Add signal assignment outside port map: + sdMISO_int <= sdMISO when sd_ctrl_sel = '0' else '1'; + + -- New image controller + img1 : entity work.image_controller + port map( + clk => clk, + n_reset => N_RESET, + n_rd => n_sdCardCS or n_ioRD, + n_wr => n_sdCardCS or n_ioWR, + dataIn => cpuDataOut, + dataOut => sdCardDataOut_img, + regAddr => cpuAddress(2 downto 0), + driveLED => driveLED_img + ); + +usb : ch376s_module +port map ( + sdcs => usbCS, + sdo => usbMOSI, + sdi => usbMISO, + sck => usbSCLK, + + wr => not (n_ch376sCS or n_ioWR), + rd => not (n_ch376sCS or n_ioRD), + + dout => ch376sDataOut, + din => cpuDataOut, + + a0 => cpuAddress (0), + reset => not (N_RESET), + clk => sdClock -- twice the spi clk +); + + +-- ____________________________________________________________________________________ +-- MEMORY READ/WRITE LOGIC GOES HERE + +n_ioWR <= n_WR or n_IORQ; +n_memWR <= n_WR or n_MREQ; +n_ioRD <= n_RD or n_IORQ; +n_memRD <= n_RD or n_MREQ; + +-- ____________________________________________________________________________________ +-- CHIP SELECTS GO HERE + +n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" and n_RomActive = '0' else '1'; --8K at bottom of memory +n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81 +n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83 +n_ch376sCS <= '0' when cpuAddress(7 downto 1) = "0010000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $20-$21 +n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F +n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K + +-- ____________________________________________________________________________________ +-- BUS ISOLATION GOES HERE + + -- Mux controller outputs based on selection + sdCardDataOut <= sdCardDataOut_img when sd_ctrl_sel = '1' else + sdCardDataOut_sd; + + driveLED <= driveLED_img when sd_ctrl_sel = '1' else + driveLED_sd; + + -- CPU data input mux needs to be written like this: + cpuDataIn <= interface1DataOut when (n_interface1CS = '0') else + interface2DataOut when (n_interface2CS = '0') else + ch376sDataOut when (n_ch376sCS = '0') else + sdCardDataOut when (n_sdCardCS = '0') else + basRomData when (n_basRomCS = '0') else + internalRam1DataOut when (n_internalRam1CS = '0') else + sramData when (n_externalRamCS = '0') else + x"FF"; +-- ____________________________________________________________________________________ +-- SYSTEM CLOCKS GO HERE + + +-- SUB-CIRCUIT CLOCK SIGNALS +serialClock <= serialClkCount(15); +--sdClock <= clk; + +process (clk) +begin + if rising_edge(clk) then + + if cpuClkCount < 4 then -- 4 = 10MHz, 3 = 12.5MHz, 2=16.6MHz, 1=25MHz + cpuClkCount <= cpuClkCount + 1; + else + cpuClkCount <= (others=>'0'); + end if; + + if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz + cpuClock <= '0'; + else + cpuClock <= '1'; + end if; + + if sdClkCount < 16 then -- 5MHz + sdClkCount <= sdClkCount + 1; + else + sdClkCount <= (others=>'0'); + end if; + + sdClock <= sdClkCount (3); -- divide by 8 = 6.25 Mhz + --usbCS <= sdClkCount (4); + --usbMOSI <= sdClkCount (3); + --usbSCLK <= sdClkCount (2); + + -- Serial clock DDS + -- 50MHz master input clock: + -- Baud Increment + -- 115200 2416 + -- 38400 805 + -- 19200 403 + -- 9600 201 + -- 4800 101 + -- 2400 50 + serialClkCount <= serialClkCount + unsigned(baud_increment); + end if; +end process; + +end; diff --git a/README.md b/README.md index 790c3ce..9102f82 100644 --- a/README.md +++ b/README.md @@ -1,439 +1,440 @@ -MiSTer MultiComp -================ - -Port of Grant Searle's MultiComp to the MiSTer. - -Ported by Cyril Venditti and Fred VanEijk. - -Updated by S0urceror to use MiSTer image files, use all 4 machine types and have the MiSTer -UART connected to serial interface 2 of the core. The latter allows to use the core remotely. - -## Using the MiSTer Serial Terminal/Console - -### Connection Methods - -1. USB: Connect the console port from the MiSTer FPGA to your computer using a USB cable. - -2. Network: Use SSH to connect to the MiSTer FPGA if you have a Wireless or Ethernet connection. - -3. USB/Serial cable: For more information see the Serial Port section of the Altair8800_MiSTer repository: - -### Setting Up the Connection - -#### For UART/Serial with PuTTY - -- Connect at 115200 baud, 8 bits, no parity to the COM port. - -#### USB to serial cable connection - -##### User Port - extra USB 3.1A style connector on MiSTer - -| USB | P7 | Name | PIN | Mister | emu wire | -|---|---|---|---|---|---| -|1 | +5V | +5V| -|2 | 2 | TX | SDA | AH9 | USER_IO[1] | -|3 | 1 |RX | SCL | AG11 | USER_IO[0] | -|4 | GND | GND| -|5 | 8 | DSR | IO10 | AF15 | USER_IO[5]| -|6 | 7 | DTR | IO11 | AG16 | USER_IO[4]| -|7 | 6 | CTS | IO12 | AH11 | USER_IO[3]| -|8 | 5 | RTS | IO13 | AH12 | USER_IO[2]| -|9 | 10 | IO6 | IO8 | AF17 | USER_IO[6]| -|10 | Shield | Shield | - -##### FT232 USB to serial cable - -|wire |name | mister usb IO port| -|---|---|---| -| Red|5V|N/C| -| Black|GND|GND| -| White|RXD|2| -| Green|TXD|3| -| Yellow|RTS|7| -| Blue|CTS|8| - -#### For SSH with PuTTY - -- Connect to the ip address of your MiSTer fpga. - -#### Linux command line to establish the connection to the core - -1. Identify the UART device: - - Usually mapped to `/dev/ttyS1` or `/dev/ttyUSB0` - - Use this command to help identify the correct device: - - ``` bash - dmesg | grep tty - ``` - -2. Access the serial terminal: - - Use `screen` or `minicom` - - Example command with `screen`: - - ``` bash - screen /dev/ttyS1 115200 - ``` - - - Replace `/dev/ttyS1` with the correct device identifier - - Change 115200 to the appropriate baud rate if different - -3. Enable Flow Control: - - Use `stty` - - ``` bash - stty -F /dev/ttyS1 crtscts - ``` - - - Replace `/dev/ttyS1` with the correct device identifier - - This is done before the screen command - -### Additional Information - -For more details on console connection, refer to the official MiSTer documentation: -[MiSTer Console Connection Guide](https://MiSTer-devel.github.io/MkDocs_MiSTer/advanced/console/) - -## The MiSTer OSD allows the access to four machines - -### Z80 CP/M - -You can now use both an external SDCard and/or select the image file within MiSTer. Whatever you like. - -### Formatting the SD Card and Installing CP/M - -Note this procedure has to be performed from a tty terminal as descibed above. - -#### Formatting the Drive - -1. Load the Intel-HEX dump of the `FORMAT` program into memory by copying the contents of `FORM128.HEX` (for 128MB SD card utilization) into the terminal window. -2. The `FORMAT` program will reside at memory address `$5000` when loaded. To start the formatting process, execute the program by typing `G5000` and pressing ENTER. -3. You will see the following message: - -``` -CP/M Formatter by G. Searle 2012 -``` - -4. After a few seconds, the formatting process will display: - -``` -ABCDEFGHIJKLMNOP -Formatting complete -``` - -Each drive is 8MB, so a 128MB SD card will have drives labeled A: to P:. - -#### Installing CP/M - -CP/M is installed on the first track of the disk. When booted, the first track is read into memory and executed. To install CP/M, follow these steps: - -1. Load the Intel-HEX dump of CP/M by copying the contents of `CPM22.HEX` into the terminal window (this takes about 10 seconds). -2. Load the Intel-HEX dump of the CBIOS by copying the contents of `CBIOS128.HEX` (for 128MB total drive space) into the terminal window (this takes about 3 seconds). -3. Load the Intel-HEX dump of `PUTSYS` by copying the contents of `PUTSYS.HEX` into the terminal window. - -The `PUTSYS` program also resides at memory address `$5000`. To transfer CP/M and CBIOS to the disk, execute `PUTSYS` by typing `G5000` and pressing ENTER. You will see: - -``` -CP/M System Transfer by G. Searle 2012 -System transfer complete -``` - -At this point, CP/M is installed and ready for boot. You can now proceed with installing applications. - -#### Boot CP/M from image file - -Note that currently the `DOWNLOAD.COM` program is not working reliably (we hope to fix this in the future). To get around the issues with `DOWNLOAD.COM` we have added the cpm image file and some Python based utilities, thus being able to get a working and custamizable CP/M sytem up and running. - -In the CPM-sd-image directory, you will find a zip file that contains a cmp.img file that can be copied to the /media/fat/games/MultipComp directory. This file can be used to boot CP/M without the SD card. It contains the structure for disks A thru P with A having the DOWNLOAD program and other utilities available. Use this as a strating point to place CP/M applications on the image. See the Installing Applications section at . - -Note the process for this is mostly described in PART 2 - Using the Windows packager program. The packager program is in windowsApp. Again, this process requires the use of the tty terminal not the console, as you will be pasting the file data into the terminal. - -We have also added a zip file in the CPM-sd-image directory with a set of application pre installed. See cpm-apps.zip. This file can also be copied to the /media/fat/games/MultipComp directory and mounted. It contains 5 drives A,C,D,E, and F where A still only has the DOWNLOAD program and the other drives contain the following. The cpm.zip file contains just the basic utilities described in the [CPM-sd-image](CPM-sd-image/README.MD) directory. - -| C: | D: | E: | F: | -|-----------------|-------------------|------------------|-----------------| -| 0_FILES.TXT | 0_GAMES | 0_OLDUTILS | 0_NEWUTILS | -| 1_BDS_TINY_C | 1_MUMATHSIMP | 1_F80M80BASIC | 1_ROMS | -| 2_APL | 2_CROSSTALK | 2_AZTEC_C_106D | 2_ZSYSTEM | -| 3_JANUS_ADA15 | 3_QTERM43 | 3_TPASCAL3 | 3_MICROPRO | -| 4_MS_COBOL | 4_CLINK | 4_DXFORTH401 | 4_MULTIPLAN | -| 5_PILOT | 5_SUPERSFTUTIL | 5_PLI14 | 5_DBASEII | -| 6_SYSLIB | 6_RCPM | 6_ALGOLM | 6_DWG_APPS | -| 7_BBC BASIC | 7_DDTZ SOURCES | 7_SUPERCALC | 8_MICROSHELL | - -Note the use of user numbers here i.e. 0_, 1_ etc.. -(Not all the applications were tested to run, so you are on your own) - -The applications were obtained from the Obsolescence Guaranteed site. - -Included in the CPM-sd-image directory are also some python scripts to initialize/build the image for the CP/M disks. Along with a script in the transient packages directory that can extract the .COM files from the package (note this was used to provide some content to build the cpm.img file provided in CPM-sd-image directory). - -To use the Python scripts we recommend using Visual Studio Code and opening the MultiComp_MiSTer directory as its project location. Them just run the Python scripts from within Visual Studio Code. - -__Other useful links.__ - -For convenience you can use the Multicomp FPGA - CP/M Demo Disk from Obsolescence Guaranteed: - - -After you have flashed the CP/M Demo Disk to the SD Card you will have to use the secondary SD Card on the MiSTer on the I/O Board: - - -Using CP/M - from Grant Searle website: - - -DeRamp - This website focuses on early personal computers from the mid 70s into the early 80s. Here you'll find resources for restoring and maintaining many of the great computers and peripherals from this era, in addition it has a Downloads section where you can find the bits for many applications. - -### Z80 Basic - -SGN, INT, ABS ,USR, FRE, INP, POS, SQR, RND ,LOG, EXP, COS, SIN, TAN, ATN, PEEK ,DEEK ,LEN, STR$, VAL ,ASC, CHR$ ,LEFT$, -RIGHT$, MID$, END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, OUT, ON, -NULL, WAIT, DEF, POKE, DOKE, LINES, CLS, WIDTH, MONITOR, PRINT, CONT, LIST, CLEAR, NEW, TAB, TO, FN, SPC, THEN, NOT, -STEP, +, -, *, /, ^, AND, OR, >, <, = - -PLUS additional implementations here (making it version 4.7b): - -HEX$(nn) - convert a SIGNED integer (-32768 to +32767) to a string containing the hex value - -BIN$(nn) - convert a SIGNED integer (-32768 to +32767) to a string containing the binary value - -&Hnn - interpret the value after the &H as a HEX value (signed 16 bit) - -&Bnn - interpret the value after the &B as a BINARY value (signed 16 bit) - -### 6502 Basic - No SD card support (No CSAVE/CLOAD) - -END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, ON, NULL, WAIT, DEF, POKE, PRINT, -CONT, LIST, CLEAR, NEW, TAB(, TO, FN, SPC(, THEN, NOT, STEP, SGN, INT, ABS, USR, FRE, POS, SQR, RND, LOG, EXP, COS, SIN, TAN, ATN, -PEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, +, -, *, /, ^, AND, OR, >, +, < - -### 6809 Basic - No SD card support(No CSAVE/CLOAD) - -FOR, GO, REM, ELSE, IF, DATA, PRINT, ON GOSUB, ON GOTO, INPUT, LINE INPUT, END, NEXT, DIM, READ, RUN, RESTORE, RETURN, STOP, POKE, -CONT, LIST, CLEAR, NEW, EXEC, TAB, TO, SUB, THEN, NOT, STEP, +, -, *, /, ^, AND, OR, >, =, <, DEL, DEF, LET, RENUM, FN, &, &H, TRON, -TROFF, EDIT, SGN, INT, ABS, USR, RND, SIN, PEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, INKEY$, MEM, ATN, COS, TAN, EXP, FIX, -LOG, SQR, HEX$, VARPTR, INSTR, STRING$, MID$ (MODIFICATION), POS - - - -# MultiComp OSD Configuration - -This section describes the On-Screen Display menu configuration for the MultiComp system, providing control over CPU selection, storage, and communication parameters. - -## Menu Structure - -### System Control - -- __Mount *.IMG__: Provide the image in the games/Multicomp directory -- __Reset after Mount__: Configures system behavior after mounting storage - Options: No, Yes -- __Reset__: System reset function - -### CPU and ROM Configuration - -- __CPU-ROM Selection__: -- Z80 with CP/M -- Z80 with BASIC -- 6502 with BASIC -- 6809 with BASIC - -### Communication Settings - -- __Baud Rate__: -- 115200 -- 38400 -- 19200 -- 9600 -- 4800 -- 2400 -- __Serial Port__: -- Console Port - use the MiSTer console port -- User IO Port - use the MiSTer user I/O USB 3.1 port -- __Flow Control__: -- None - no hardware flow control -- RTS/CTS - enable hardware flow control using RTS/CTS signals - -### Storage Configuration - -- __Storage Controller__: -- SD Controller - select the secondary SD card as storage -- Image Controller - select this to access the cpm image from the games/Multicomp directory -- __Storage Images__: Allows mounting disk images (.IMG files) - -### Additional Information -The OSD includes version information and build date tracking. This configuration interface provides comprehensive control over the MultiComp's core functionality, allowing users to switch between different CPU architectures, operating systems, and I/O configurations. - -The menu system is designed for straightforward navigation and configuration of the MultiComp's essential features, making it accessible for both basic setup and advanced customization needs. - -## Troubleshooting - -### Serial Communication Issues - -- If no response when typing: -- Verify correct baud rate is selected -- Check that the correct serial port is selected (Console vs User IO) -- Try enabling/disabling flow control -- For User IO port, verify cable connections match pinout documentation - -### Storage Issues - -- If unable to access CP/M: -- When using SD Controller, verify SD card is properly formatted -- When using Image Controller, ensure .IMG file is in the correct directory (/media/fat/games/MultiComp) -- Try toggling "Reset after Mount" option - -### System Stability - -- 6809 Basic has known reset issues (inherited from original design) -- If system becomes unresponsive: -- Use OSD Reset function -- Try power cycling the MiSTer -- Verify correct CPU-ROM selection for your intended use - -### Known Limitations - -- If the DOWNLOAD\.COM program has reliability issues in CP/M use a slower baud rate, we have had some sucess at 2400 and 9600 baud, 115200 baud seems to consistantly drop characters even with flow control enabled -- 6502 and 6809 Basic variants do not support SD card operations (no CSAVE/CLOAD)\ - -### License - -__Software and VHDL project download link__ - -By downloading these files you must agree to the following: The original -copyright owners of ROM contents are respectfully acknowledged. Use of the -contents of any file within your own projects is permitted freely, but any -publishing of material containing whole or part of any file distributed -here, or derived from the work that I have done here will contain an -acknowledgment back to myself, Grant Searle, and a link back to this page. -Any file published or distributed that contains all or part of any file -arom this page must be made available free of charge. - -### Original Author - -Grant Searle - -### URL - -[Grant's MULTICOMP pick and mix computer](http://searle.x10host.com/Multicomp/) - -# MiSTer MultiComp BASIC Keywords Reference - -## Keywords by Category - -### Mathematical Functions - -| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | -|---------|-----|------|------|-------------|---------------| -| ABS | ✓ | ✓ | ✓ | Returns absolute value | `X = ABS(-5)` | -| ATN | ✓ | ✓ | ✓ | Returns arctangent | `A = ATN(1)` | -| COS | ✓ | ✓ | ✓ | Returns cosine | `C = COS(3.14159/2)` | -| EXP | ✓ | ✓ | ✓ | Returns e raised to power | `E = EXP(2)` | -| FIX | - | - | ✓ | Truncates decimal portion | `F = FIX(3.7)` | -| INT | ✓ | ✓ | ✓ | Returns integer portion | `I = INT(5.7)` | -| LOG | ✓ | ✓ | ✓ | Returns natural logarithm | `L = LOG(100)` | -| SGN | ✓ | ✓ | ✓ | Returns sign of number (-1,0,1) | `S = SGN(-42)` | -| SIN | ✓ | ✓ | ✓ | Returns sine | `S = SIN(3.14159/2)` | -| SQR | ✓ | ✓ | ✓ | Returns square root | `R = SQR(16)` | -| TAN | ✓ | ✓ | ✓ | Returns tangent | `T = TAN(0.785)` | - -### String Functions - -| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | -|---------|-----|------|------|-------------|---------------| -| ASC | ✓ | ✓ | ✓ | Returns ASCII value of character | `A = ASC("A")` | -| CHR$ | ✓ | ✓ | ✓ | Returns character for ASCII value | `C$ = CHR$(65)` | -| INSTR | - | - | ✓ | Searches for substring | `I = INSTR(A$, "FIND")` | -| LEFT$ | ✓ | ✓ | ✓ | Returns leftmost characters | `L$ = LEFT$("HELLO", 2)` | -| LEN | ✓ | ✓ | ✓ | Returns string length | `L = LEN("TEST")` | -| MID$ | ✓ | ✓ | ✓ | Returns substring | `M$ = MID$("HELLO", 2, 2)` | -| RIGHT$ | ✓ | ✓ | ✓ | Returns rightmost characters | `R$ = RIGHT$("WORLD", 3)` | -| STR$ | ✓ | ✓ | ✓ | Converts number to string | `S$ = STR$(123)` | -| STRING$ | - | - | ✓ | Creates string of repeated characters | `S$ = STRING$(5, "*")` | -| VAL | ✓ | ✓ | ✓ | Converts string to number | `V = VAL("123")` | - -### Program Control - -| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | -|---------|-----|------|------|-------------|---------------| -| CONT | ✓ | ✓ | ✓ | Continues program execution | `CONT` | -| END | ✓ | ✓ | ✓ | Ends program | `END` | -| FOR/NEXT | ✓ | ✓ | ✓ | Loop structure | `FOR I=1 TO 10 : PRINT I : NEXT I` | -| GOSUB | ✓ | ✓ | ✓ | Calls subroutine | `GOSUB 1000` | -| GOTO | ✓ | ✓ | ✓ | Jumps to line number | `GOTO 100` | -| IF/THEN | ✓ | ✓ | ✓ | Conditional execution | `IF X=5 THEN PRINT "YES"` | -| ON GOSUB | - | - | ✓ | Multiple branch subroutine | `ON X GOSUB 100,200,300` | -| ON GOTO | - | - | ✓ | Multiple branch jump | `ON X GOTO 100,200,300` | -| RETURN | ✓ | ✓ | ✓ | Returns from subroutine | `RETURN` | -| STOP | ✓ | ✓ | ✓ | Halts program execution | `STOP` | - -### Data and Variables - -| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | -|---------|-----|------|------|-------------|---------------| -| DATA | ✓ | ✓ | ✓ | Stores program data | `DATA 100,200,"TEXT"` | -| DEF FN | ✓ | ✓ | ✓ | Defines function | `DEF FNA(X)=X*X+2` | -| DIM | ✓ | ✓ | ✓ | Declares array dimensions | `DIM A(10),B$(20)` | -| INPUT | ✓ | ✓ | ✓ | Accepts user input | `INPUT "Name?";N$` | -| LET | ✓ | ✓ | ✓ | Assigns variable value | `LET A=5` or `A=5` | -| LINE INPUT | - | - | ✓ | Inputs entire line | `LINE INPUT "Text?";A$` | -| READ | ✓ | ✓ | ✓ | Reads DATA values | `READ A,B,C$` | -| RESTORE | ✓ | ✓ | ✓ | Resets DATA pointer | `RESTORE` | - -### System and Memory - -| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | -|---------|-----|------|------|-------------|---------------| -| DEEK | ✓ | - | - | Reads word from memory | `D = DEEK(16384)` | -| DOKE | ✓ | - | - | Writes word to memory | `DOKE 16384,12345` | -| FRE | ✓ | ✓ | - | Returns free memory | `F = FRE(0)` | -| INP | ✓ | - | - | Reads from I/O port | `I = INP(255)` | -| MEM | - | - | ✓ | Returns memory size | `M = MEM` | -| OUT | ✓ | - | - | Writes to I/O port | `OUT 255,10` | -| PEEK | ✓ | ✓ | ✓ | Reads byte from memory | `P = PEEK(16384)` | -| POKE | ✓ | ✓ | ✓ | Writes byte to memory | `POKE 16384,255` | -| USR | ✓ | ✓ | ✓ | Calls machine language routine | `U = USR(32768)` | -| VARPTR | - | - | ✓ | Returns variable address | `V = VARPTR(A)` | - -### Program Editing - -| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | -|---------|-----|------|------|-------------|---------------| -| CLEAR | ✓ | ✓ | ✓ | Clears variables | `CLEAR` | -| CLS | ✓ | - | - | Clears screen | `CLS` | -| DEL | - | - | ✓ | Deletes program lines | `DEL 100-200` | -| EDIT | - | - | ✓ | Edits program line | `EDIT 100` | -| LIST | ✓ | ✓ | ✓ | Lists program | `LIST` or `LIST 100-200` | -| NEW | ✓ | ✓ | ✓ | Clears program | `NEW` | -| RENUM | - | - | ✓ | Renumbers program lines | `RENUM 100,10` | -| RUN | ✓ | ✓ | ✓ | Executes program | `RUN` or `RUN 100` | -| TRON/TROFF | - | - | ✓ | Trace mode on/off | `TRON` or `TROFF` | - -### Z80 BASIC Specific Extensions (v4.7b) - -| Keyword | Description | Usage Example | -|---------|-------------|---------------| -| HEX$(nn) | Converts signed integer to hex string | `H$ = HEX$(255)` | -| BIN$(nn) | Converts signed integer to binary string | `B$ = BIN$(15)` | -| &Hnn | Interprets nn as hexadecimal value | `X = &H1F` | -| &Bnn | Interprets nn as binary value | `Y = &B1010` | - -### Operators - -| Operator | Z80 | 6502 | 6809 | Description | Usage Example | -|----------|-----|------|------|-------------|---------------| -| + | ✓ | ✓ | ✓ | Addition | `A = B + C` | -| - | ✓ | ✓ | ✓ | Subtraction | `X = Y - Z` | -| * | ✓ | ✓ | ✓ | Multiplication | `P = Q * R` | -| / | ✓ | ✓ | ✓ | Division | `D = N / 2` | -| ^ | ✓ | ✓ | ✓ | Exponentiation | `E = 2 ^ 3` | -| AND | ✓ | ✓ | ✓ | Logical AND | `IF A>0 AND B<10 THEN...` | -| OR | ✓ | ✓ | ✓ | Logical OR | `IF X=0 OR Y=0 THEN...` | -| NOT | ✓ | ✓ | ✓ | Logical NOT | `IF NOT A THEN...` | -| > | ✓ | ✓ | ✓ | Greater than | `IF X > 10 THEN...` | -| < | ✓ | ✓ | ✓ | Less than | `IF Y < 5 THEN...` | -| = | ✓ | ✓ | ✓ | Equal to | `IF A = B THEN...` | -| & | - | - | ✓ | Bitwise AND | `R = X & Y` | - -Notes: -1. Z80 BASIC is the most commonly used version for CP/M systems -2. 6502 BASIC is a Microsoft BASIC variant -3. 6809 BASIC has the most extensive command set but lacks storage commands -4. None of the 6502 and 6809 variants support CSAVE/CLOAD operations - -Each example shows the most common usage pattern for the command. Many commands have additional optional parameters or alternate syntaxes not shown in these basic examples. +MiSTer MultiComp +================ + +Port of Grant Searle's MultiComp to the MiSTer. + +Ported by Cyril Venditti and Fred VanEijk. + +Updated by S0urceror to use MiSTer image files, use all 4 machine types and have the MiSTer +UART connected to serial interface 2 of the core. The latter allows to use the core remotely. + +## Using the MiSTer Serial Terminal/Console + +### Connection Methods + +1. USB: Connect the console port from the MiSTer FPGA to your computer using a USB cable. + +2. Network: Use SSH to connect to the MiSTer FPGA if you have a Wireless or Ethernet connection. + +3. USB/Serial cable: For more information see the Serial Port section of the Altair8800_MiSTer repository: + +### Setting Up the Connection + +#### For UART/Serial with PuTTY + +- Connect at 115200 baud, 8 bits, no parity to the COM port. + +#### USB to serial cable connection + +##### User Port - extra USB 3.1A style connector on MiSTer + +| USB | P7 | Name | PIN | Mister | emu wire | +|---|---|---|---|---|---| +|1 | +5V | +5V| +|2 | 2 | TX | SDA | AH9 | USER_IO[1] | +|3 | 1 |RX | SCL | AG11 | USER_IO[0] | +|4 | GND | GND| +|5 | 8 | DSR | IO10 | AF15 | USER_IO[5]| +|6 | 7 | DTR | IO11 | AG16 | USER_IO[4]| +|7 | 6 | CTS | IO12 | AH11 | USER_IO[3]| +|8 | 5 | RTS | IO13 | AH12 | USER_IO[2]| +|9 | 10 | IO6 | IO8 | AF17 | USER_IO[6]| +|10 | Shield | Shield | + +##### FT232 USB to serial cable + +|wire |name | mister usb IO port| +|---|---|---| +| Red|5V|N/C| +| Black|GND|GND| +| White|RXD|2| +| Green|TXD|3| +| Yellow|RTS|7| +| Blue|CTS|8| + +#### For SSH with PuTTY + +- Connect to the ip address of your MiSTer fpga. + +#### Linux command line to establish the connection to the core + +1. Identify the UART device: + - Usually mapped to `/dev/ttyS1` or `/dev/ttyUSB0` + - Use this command to help identify the correct device: + + ``` bash + dmesg | grep tty + ``` + +2. Access the serial terminal: + - Use `screen` or `minicom` + - Example command with `screen`: + + ``` bash + screen /dev/ttyS1 115200 + ``` + + - Replace `/dev/ttyS1` with the correct device identifier + - Change 115200 to the appropriate baud rate if different + +3. Enable Flow Control: + - Use `stty` + + ``` bash + stty -F /dev/ttyS1 crtscts + ``` + + - Replace `/dev/ttyS1` with the correct device identifier + - This is done before the screen command + +### Additional Information + +For more details on console connection, refer to the official MiSTer documentation: +[MiSTer Console Connection Guide](https://MiSTer-devel.github.io/MkDocs_MiSTer/advanced/console/) + +## The MiSTer OSD allows the access to four machines + +### Z80 CP/M + +You can now use both an external SDCard and/or select the image file within MiSTer. Whatever you like. + +### Formatting the SD Card and Installing CP/M + +Note this procedure has to be performed from a tty terminal as descibed above. + +#### Formatting the Drive + +1. Load the Intel-HEX dump of the `FORMAT` program into memory by copying the contents of `FORM128.HEX` (for 128MB SD card utilization) into the terminal window. +2. The `FORMAT` program will reside at memory address `$5000` when loaded. To start the formatting process, execute the program by typing `G5000` and pressing ENTER. +3. You will see the following message: + +``` +CP/M Formatter by G. Searle 2012 +``` + +4. After a few seconds, the formatting process will display: + +``` +ABCDEFGHIJKLMNOP +Formatting complete +``` + +Each drive is 8MB, so a 128MB SD card will have drives labeled A: to P:. + +#### Installing CP/M + +CP/M is installed on the first track of the disk. When booted, the first track is read into memory and executed. To install CP/M, follow these steps: + +1. Load the Intel-HEX dump of CP/M by copying the contents of `CPM22.HEX` into the terminal window (this takes about 10 seconds). +2. Load the Intel-HEX dump of the CBIOS by copying the contents of `CBIOS128.HEX` (for 128MB total drive space) into the terminal window (this takes about 3 seconds). +3. Load the Intel-HEX dump of `PUTSYS` by copying the contents of `PUTSYS.HEX` into the terminal window. + +The `PUTSYS` program also resides at memory address `$5000`. To transfer CP/M and CBIOS to the disk, execute `PUTSYS` by typing `G5000` and pressing ENTER. You will see: + +``` +CP/M System Transfer by G. Searle 2012 +System transfer complete +``` + +At this point, CP/M is installed and ready for boot. You can now proceed with installing applications. + +#### Boot CP/M from image file + +Note that currently the `DOWNLOAD.COM` program is not working reliably (we hope to fix this in the future). To get around the issues with `DOWNLOAD.COM` we have added the cpm image file and some Python based utilities, thus being able to get a working and custamizable CP/M sytem up and running. + +In the CPM-sd-image directory, you will find a zip file that contains a cmp.img file that can be copied to the /media/fat/games/MultipComp directory. This file can be used to boot CP/M without the SD card. It contains the structure for disks A thru P with A having the DOWNLOAD program and other utilities available. Use this as a strating point to place CP/M applications on the image. See the Installing Applications section at . + +Note the process for this is mostly described in PART 2 - Using the Windows packager program. The packager program is in windowsApp. Again, this process requires the use of the tty terminal not the console, as you will be pasting the file data into the terminal. + +We have also added a zip file in the CPM-sd-image directory with a set of application pre installed. See cpm-apps.zip. This file can also be copied to the /media/fat/games/MultipComp directory and mounted. It contains 5 drives A,C,D,E, and F where A still only has the DOWNLOAD program and the other drives contain the following. The cpm.zip file contains just the basic utilities described in the [CPM-sd-image](CPM-sd-image/README.MD) directory. + +| C: | D: | E: | F: | +|-----------------|-------------------|------------------|-----------------| +| 0_FILES.TXT | 0_GAMES | 0_OLDUTILS | 0_NEWUTILS | +| 1_BDS_TINY_C | 1_MUMATHSIMP | 1_F80M80BASIC | 1_ROMS | +| 2_APL | 2_CROSSTALK | 2_AZTEC_C_106D | 2_ZSYSTEM | +| 3_JANUS_ADA15 | 3_QTERM43 | 3_TPASCAL3 | 3_MICROPRO | +| 4_MS_COBOL | 4_CLINK | 4_DXFORTH401 | 4_MULTIPLAN | +| 5_PILOT | 5_SUPERSFTUTIL | 5_PLI14 | 5_DBASEII | +| 6_SYSLIB | 6_RCPM | 6_ALGOLM | 6_DWG_APPS | +| 7_BBC BASIC | 7_DDTZ SOURCES | 7_SUPERCALC | 8_MICROSHELL | + +Note the use of user numbers here i.e. 0_, 1_ etc.. +(Not all the applications were tested to run, so you are on your own) + +The applications were obtained from the Obsolescence Guaranteed site. + +Included in the CPM-sd-image directory are also some python scripts to initialize/build the image for the CP/M disks. Along with a script in the transient packages directory that can extract the .COM files from the package (note this was used to provide some content to build the cpm.img file provided in CPM-sd-image directory). + +To use the Python scripts we recommend using Visual Studio Code and opening the MultiComp_MiSTer directory as its project location. Them just run the Python scripts from within Visual Studio Code. + +__Other useful links.__ + +For convenience you can use the Multicomp FPGA - CP/M Demo Disk from Obsolescence Guaranteed: + + +After you have flashed the CP/M Demo Disk to the SD Card you will have to use the secondary SD Card on the MiSTer on the I/O Board: + + +Using CP/M - from Grant Searle website: + + +DeRamp - This website focuses on early personal computers from the mid 70s into the early 80s. Here you'll find resources for restoring and maintaining many of the great computers and peripherals from this era, in addition it has a Downloads section where you can find the bits for many applications. + +### Z80 Basic + +SGN, INT, ABS ,USR, FRE, INP, POS, SQR, RND ,LOG, EXP, COS, SIN, TAN, ATN, PEEK ,DEEK ,LEN, STR$, VAL ,ASC, CHR$ ,LEFT$, +RIGHT$, MID$, END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, OUT, ON, +NULL, WAIT, DEF, POKE, DOKE, LINES, CLS, WIDTH, MONITOR, PRINT, CONT, LIST, CLEAR, NEW, TAB, TO, FN, SPC, THEN, NOT, +STEP, +, -, *, /, ^, AND, OR, >, <, = + +PLUS additional implementations here (making it version 4.7b): + +HEX$(nn) - convert a SIGNED integer (-32768 to +32767) to a string containing the hex value + +BIN$(nn) - convert a SIGNED integer (-32768 to +32767) to a string containing the binary value + +&Hnn - interpret the value after the &H as a HEX value (signed 16 bit) + +&Bnn - interpret the value after the &B as a BINARY value (signed 16 bit) + +### 6502 Basic - No SD card support (No CSAVE/CLOAD) + +END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, ON, NULL, WAIT, DEF, POKE, PRINT, +CONT, LIST, CLEAR, NEW, TAB(, TO, FN, SPC(, THEN, NOT, STEP, SGN, INT, ABS, USR, FRE, POS, SQR, RND, LOG, EXP, COS, SIN, TAN, ATN, +PEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, +, -, *, /, ^, AND, OR, >, +, < + +### 6809 Basic - No SD card support(No CSAVE/CLOAD) + +FOR, GO, REM, ELSE, IF, DATA, PRINT, ON GOSUB, ON GOTO, INPUT, LINE INPUT, END, NEXT, DIM, READ, RUN, RESTORE, RETURN, STOP, POKE, +CONT, LIST, CLEAR, NEW, EXEC, TAB, TO, SUB, THEN, NOT, STEP, +, -, *, /, ^, AND, OR, >, =, <, DEL, DEF, LET, RENUM, FN, &, &H, TRON, +TROFF, EDIT, SGN, INT, ABS, USR, RND, SIN, PEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, INKEY$, MEM, ATN, COS, TAN, EXP, FIX, +LOG, SQR, HEX$, VARPTR, INSTR, STRING$, MID$ (MODIFICATION), POS + + + +# MultiComp OSD Configuration + +This section describes the On-Screen Display menu configuration for the MultiComp system, providing control over CPU selection, storage, and communication parameters. + +## Menu Structure + +### System Control + +- __Mount *.IMG__: Provide the image in the games/Multicomp directory +- __Reset after Mount__: Configures system behavior after mounting storage - Options: No, Yes +- __Reset__: System reset function + +### CPU and ROM Configuration + +- __CPU-ROM Selection__: +- Z80 with CP/M +- Z80 with BASIC +- 6502 with BASIC +- 6809 with BASIC + +### Communication Settings + +- __Baud Rate__: +- 115200 +- 38400 +- 19200 +- 9600 +- 4800 +- 2400 +- __Serial Port__: +- Console Port - use the MiSTer console port +- User IO Port - use the MiSTer user I/O USB 3.1 port +- __Flow Control__: +- None - no hardware flow control +- RTS/CTS - enable hardware flow control using RTS/CTS signals + +### Storage Configuration + +- __Storage Controller__: +- SD Controller - select the secondary SD card as storage +- Image Controller - select this to access the cpm image from the games/Multicomp directory +- __Storage Images__: Allows mounting disk images (.IMG files) + +### Additional Information +The OSD includes version information and build date tracking. This configuration interface provides comprehensive control over the MultiComp's core functionality, allowing users to switch between different CPU architectures, operating systems, and I/O configurations. + +The menu system is designed for straightforward navigation and configuration of the MultiComp's essential features, making it accessible for both basic setup and advanced customization needs. + +## Troubleshooting + +### Serial Communication Issues + +- Only the Z80 supports the external uart at this time +- If no response when typing: + - Verify correct baud rate is selected + - Check that the correct serial port is selected (Console vs User IO) + - Try enabling/disabling flow control + - For User IO port, verify cable connections match pinout documentation + +### Storage Issues + +- If unable to access CP/M: +- When using SD Controller, verify SD card is properly formatted +- When using Image Controller, ensure .IMG file is in the correct directory (/media/fat/games/MultiComp) +- Try toggling "Reset after Mount" option + +### System Stability + +- 6809 Basic had known reset issues (inherited from original design) the core was actually being reset but only a warm reset, now it supports a cold or warm reset with a prompt +- If system becomes unresponsive: + - Use OSD Reset function + - Try power cycling the MiSTer + - Verify correct CPU-ROM selection for your intended use + +### Known Limitations + +- If the DOWNLOAD\.COM program has reliability issues in CP/M use a slower baud rate, we have had some sucess at 2400 and 9600 baud, 115200 baud seems to consistantly drop characters even with flow control enabled +- 6502 and 6809 Basic variants do not support SD card operations (no CSAVE/CLOAD)\ + +### License + +__Software and VHDL project download link__ + +By downloading these files you must agree to the following: The original +copyright owners of ROM contents are respectfully acknowledged. Use of the +contents of any file within your own projects is permitted freely, but any +publishing of material containing whole or part of any file distributed +here, or derived from the work that I have done here will contain an +acknowledgment back to myself, Grant Searle, and a link back to this page. +Any file published or distributed that contains all or part of any file +arom this page must be made available free of charge. + +### Original Author + +Grant Searle + +### URL + +[Grant's MULTICOMP pick and mix computer](http://searle.x10host.com/Multicomp/) + +# MiSTer MultiComp BASIC Keywords Reference + +## Keywords by Category + +### Mathematical Functions + +| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | +|---------|-----|------|------|-------------|---------------| +| ABS | ✓ | ✓ | ✓ | Returns absolute value | `X = ABS(-5)` | +| ATN | ✓ | ✓ | ✓ | Returns arctangent | `A = ATN(1)` | +| COS | ✓ | ✓ | ✓ | Returns cosine | `C = COS(3.14159/2)` | +| EXP | ✓ | ✓ | ✓ | Returns e raised to power | `E = EXP(2)` | +| FIX | - | - | ✓ | Truncates decimal portion | `F = FIX(3.7)` | +| INT | ✓ | ✓ | ✓ | Returns integer portion | `I = INT(5.7)` | +| LOG | ✓ | ✓ | ✓ | Returns natural logarithm | `L = LOG(100)` | +| SGN | ✓ | ✓ | ✓ | Returns sign of number (-1,0,1) | `S = SGN(-42)` | +| SIN | ✓ | ✓ | ✓ | Returns sine | `S = SIN(3.14159/2)` | +| SQR | ✓ | ✓ | ✓ | Returns square root | `R = SQR(16)` | +| TAN | ✓ | ✓ | ✓ | Returns tangent | `T = TAN(0.785)` | + +### String Functions + +| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | +|---------|-----|------|------|-------------|---------------| +| ASC | ✓ | ✓ | ✓ | Returns ASCII value of character | `A = ASC("A")` | +| CHR$ | ✓ | ✓ | ✓ | Returns character for ASCII value | `C$ = CHR$(65)` | +| INSTR | - | - | ✓ | Searches for substring | `I = INSTR(A$, "FIND")` | +| LEFT$ | ✓ | ✓ | ✓ | Returns leftmost characters | `L$ = LEFT$("HELLO", 2)` | +| LEN | ✓ | ✓ | ✓ | Returns string length | `L = LEN("TEST")` | +| MID$ | ✓ | ✓ | ✓ | Returns substring | `M$ = MID$("HELLO", 2, 2)` | +| RIGHT$ | ✓ | ✓ | ✓ | Returns rightmost characters | `R$ = RIGHT$("WORLD", 3)` | +| STR$ | ✓ | ✓ | ✓ | Converts number to string | `S$ = STR$(123)` | +| STRING$ | - | - | ✓ | Creates string of repeated characters | `S$ = STRING$(5, "*")` | +| VAL | ✓ | ✓ | ✓ | Converts string to number | `V = VAL("123")` | + +### Program Control + +| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | +|---------|-----|------|------|-------------|---------------| +| CONT | ✓ | ✓ | ✓ | Continues program execution | `CONT` | +| END | ✓ | ✓ | ✓ | Ends program | `END` | +| FOR/NEXT | ✓ | ✓ | ✓ | Loop structure | `FOR I=1 TO 10 : PRINT I : NEXT I` | +| GOSUB | ✓ | ✓ | ✓ | Calls subroutine | `GOSUB 1000` | +| GOTO | ✓ | ✓ | ✓ | Jumps to line number | `GOTO 100` | +| IF/THEN | ✓ | ✓ | ✓ | Conditional execution | `IF X=5 THEN PRINT "YES"` | +| ON GOSUB | - | - | ✓ | Multiple branch subroutine | `ON X GOSUB 100,200,300` | +| ON GOTO | - | - | ✓ | Multiple branch jump | `ON X GOTO 100,200,300` | +| RETURN | ✓ | ✓ | ✓ | Returns from subroutine | `RETURN` | +| STOP | ✓ | ✓ | ✓ | Halts program execution | `STOP` | + +### Data and Variables + +| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | +|---------|-----|------|------|-------------|---------------| +| DATA | ✓ | ✓ | ✓ | Stores program data | `DATA 100,200,"TEXT"` | +| DEF FN | ✓ | ✓ | ✓ | Defines function | `DEF FNA(X)=X*X+2` | +| DIM | ✓ | ✓ | ✓ | Declares array dimensions | `DIM A(10),B$(20)` | +| INPUT | ✓ | ✓ | ✓ | Accepts user input | `INPUT "Name?";N$` | +| LET | ✓ | ✓ | ✓ | Assigns variable value | `LET A=5` or `A=5` | +| LINE INPUT | - | - | ✓ | Inputs entire line | `LINE INPUT "Text?";A$` | +| READ | ✓ | ✓ | ✓ | Reads DATA values | `READ A,B,C$` | +| RESTORE | ✓ | ✓ | ✓ | Resets DATA pointer | `RESTORE` | + +### System and Memory + +| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | +|---------|-----|------|------|-------------|---------------| +| DEEK | ✓ | - | - | Reads word from memory | `D = DEEK(16384)` | +| DOKE | ✓ | - | - | Writes word to memory | `DOKE 16384,12345` | +| FRE | ✓ | ✓ | - | Returns free memory | `F = FRE(0)` | +| INP | ✓ | - | - | Reads from I/O port | `I = INP(255)` | +| MEM | - | - | ✓ | Returns memory size | `M = MEM` | +| OUT | ✓ | - | - | Writes to I/O port | `OUT 255,10` | +| PEEK | ✓ | ✓ | ✓ | Reads byte from memory | `P = PEEK(16384)` | +| POKE | ✓ | ✓ | ✓ | Writes byte to memory | `POKE 16384,255` | +| USR | ✓ | ✓ | ✓ | Calls machine language routine | `U = USR(32768)` | +| VARPTR | - | - | ✓ | Returns variable address | `V = VARPTR(A)` | + +### Program Editing + +| Keyword | Z80 | 6502 | 6809 | Description | Usage Example | +|---------|-----|------|------|-------------|---------------| +| CLEAR | ✓ | ✓ | ✓ | Clears variables | `CLEAR` | +| CLS | ✓ | - | - | Clears screen | `CLS` | +| DEL | - | - | ✓ | Deletes program lines | `DEL 100-200` | +| EDIT | - | - | ✓ | Edits program line | `EDIT 100` | +| LIST | ✓ | ✓ | ✓ | Lists program | `LIST` or `LIST 100-200` | +| NEW | ✓ | ✓ | ✓ | Clears program | `NEW` | +| RENUM | - | - | ✓ | Renumbers program lines | `RENUM 100,10` | +| RUN | ✓ | ✓ | ✓ | Executes program | `RUN` or `RUN 100` | +| TRON/TROFF | - | - | ✓ | Trace mode on/off | `TRON` or `TROFF` | + +### Z80 BASIC Specific Extensions (v4.7b) + +| Keyword | Description | Usage Example | +|---------|-------------|---------------| +| HEX$(nn) | Converts signed integer to hex string | `H$ = HEX$(255)` | +| BIN$(nn) | Converts signed integer to binary string | `B$ = BIN$(15)` | +| &Hnn | Interprets nn as hexadecimal value | `X = &H1F` | +| &Bnn | Interprets nn as binary value | `Y = &B1010` | + +### Operators + +| Operator | Z80 | 6502 | 6809 | Description | Usage Example | +|----------|-----|------|------|-------------|---------------| +| + | ✓ | ✓ | ✓ | Addition | `A = B + C` | +| - | ✓ | ✓ | ✓ | Subtraction | `X = Y - Z` | +| * | ✓ | ✓ | ✓ | Multiplication | `P = Q * R` | +| / | ✓ | ✓ | ✓ | Division | `D = N / 2` | +| ^ | ✓ | ✓ | ✓ | Exponentiation | `E = 2 ^ 3` | +| AND | ✓ | ✓ | ✓ | Logical AND | `IF A>0 AND B<10 THEN...` | +| OR | ✓ | ✓ | ✓ | Logical OR | `IF X=0 OR Y=0 THEN...` | +| NOT | ✓ | ✓ | ✓ | Logical NOT | `IF NOT A THEN...` | +| > | ✓ | ✓ | ✓ | Greater than | `IF X > 10 THEN...` | +| < | ✓ | ✓ | ✓ | Less than | `IF Y < 5 THEN...` | +| = | ✓ | ✓ | ✓ | Equal to | `IF A = B THEN...` | +| & | - | - | ✓ | Bitwise AND | `R = X & Y` | + +Notes: +1. Z80 BASIC is the most commonly used version for CP/M systems +2. 6502 BASIC is a Microsoft BASIC variant +3. 6809 BASIC has the most extensive command set but lacks storage commands +4. None of the 6502 and 6809 variants support CSAVE/CLOAD operations + +Each example shows the most common usage pattern for the command. Many commands have additional optional parameters or alternate syntaxes not shown in these basic examples. diff --git a/ROMS/6809/BASIC.S19 b/ROMS/6809/BASIC.S19 new file mode 100644 index 0000000..ae6237d --- /dev/null +++ b/ROMS/6809/BASIC.S19 @@ -0,0 +1,259 @@ +S10A007C0C8426020C83B67C +S10600857EE20212 +S123E0008D0327FC39B6FFD085012706B6FFD1847F394F398D263402810D270DB7FFD10C50 +S123E0207996799178251220100F798D0F860DB7FFD18D08860AB7FFD13502393402B6FF9F +S123E040D0850227F935023910CE01EE860CBDE0148EE157A6802705BDE01420F7B6FFD060 +S123E060850127F9B6FFD1847F8143271481572706966E8155260A9E6FA684811226026EFF +S123E080848E02186F83300126FA8E02176F809F19A60243A702A10226063001630120F1B6 +S123E0A09F719F279F233089FF389F211F148EE0F5CE0076C612BDE1F1CE00A7C604BDE1F6 +S123E0C0F1863997F0BDE4FD8E00B59F8DCEEC11C60AEF815A26FB8695B7FFD08EE12ABD7B +S123E0E0F1258EE0ED9F6F8655976E200412BDE5177EE4653B1040FF00EC110C8426020CBC +S123E10083B600007EE2027EE2017EE0F47EEC11804FC7525932E260E36D1DE300E211003A +S123E12000000000000000000000003638303920455854454E4445442042415349430D28DC +S123E14043292031393832204259204D4943524F534F46540D0D00434F4C44204F52205756 +S123E16041524D2053544152542028432F57293F200D0034169E76DC789F6AD76C976D3530 +S123E180960F738E00F4C601BDE000810826075A27EF301F20348115260A5A27E48608BD3E +S123E1A0E01420F681031A012705810D260D4F3401BDF0E56F848E00F33581812025C98175 +S123E1C07B24C5C1FA24C1A7805CBDE01420B92705BDEF049F7A6E9F007A7EE5E696732636 +S123E1E003BDE0050F73975310260C6A97567EEE62A680A7C05A26F939399D8227FB7EEA82 +S123E200433B813A240A812026020E7C803080D039F403F477F41C00ADF6A8F6FDEF17EE63 +S123E22048ECC4EEDDEE67EE53F7ADF775F77EF8EFF921F843FAA9F87DFF7BEE72EE8FEE63 +S123E24096E1DDECB5FAB1FB71FB4179F14E79F1457BF2557BF31A7FF88650EA9C46EA9B23 +S123E260464FD247CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D44541 +S123E2804EC44E4558D44449CD524541C45255CE524553544F52C55245545552CE53544F44 +S123E2A0D0504F4BC5434F4ED44C4953D4434C4541D24E45D7455845C354524FCE54524FBD +S123E2C046C64445CC4445C64C494EC552454E55CD454449D4544142A854CF5355C254488D +S123E2E045CE4E4FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC46CE5553494EC72B +S123E3005347CE494ED44142D35553D2524EC45349CE504545CB4C45CE535452A45641CC84 +S123E3204153C3434852A44154CE434FD35441CE4558D04649D84C4FC7504FD35351D24870 +S123E3404558A44C454654A45249474854A44D4944A4494E4B4559A44D45CD5641525054F9 +S123E360D2494E5354D2535452494E47A4E52BE676E6D3E6D3E6D3E704E6D0F0ADE732E767 +S123E380DFE5FDE8C4EB15E819E66BE5DFE6B0E601EF1EE626EF25E637E4FBE1CFFAA4FA08 +S123E3A0A5FD20FC64FFBFFDAAF9304E46534E52474F4446434F564F4D554C425344442F91 +S123E3C0304944544D4F534C535354434E4644414F444E494F464D4E4F4945445355464EE0 +S123E3E045204552524F520020494E20000D4F4B0D000D425245414B003064C6129F0FA66D +S123E4008480802615AE019F119E3B27099C1127099E0F3A20E59E119F3B9E0F4D398D17A8 +S123E420DE4133419E433001A68236029C4726F8DF45394F58D31FC3003A250810DF17109C +S123E440931725EEC60CBDE517BDF0E9BDF1388EE3AB3A8D318D2F8EE3E0BDF12596684CB6 +S123E4602703BDF54EBDF0E98EE3EDBDF125BDE181CEFFFFDF6825F69F839D7C27F0250BD8 +S123E480BDEFDA7EE5B4A6807EF13ABDE7579E2B9FF1BDEFDAD7038D4C2512DC47A384D32B +S123E4A01BDD1BEE843702A7809C1B26F896F3271CDC1BDD43DB038900DD41BDE41ECE00A9 +S123E4C0EF3702A7809C4526F89E419F1B8D368D02209B9E19EC8427213304A6C026FCEF27 +S123E4E084AE8420F0DC2B9E19EE84270910A3022306AE8420F31A019F473926FB9E196F4E +S123E500806F809F1B9E19BDE6AB9E279F23BDE5DF9E1B9F1D9F1F8E00C99F0BAEE410DE0D +S123E520216FE20F2D0F2E0F086E8486809708BDE779BDE3F9326226049E0F3285C609BDDA +S123E540E433BDE6D8DC683416C6A0BDEA3BBDE90FBDE90DD654CA7FD450D750108EE56343 +S123E5607EE9B68EF24EBDF39D9D8281A426059D7CBDE90DBDF3F6BDE9B2DC3B34068680CF +S123E58034021CAF8D609E839F2FA6802707813A27227EEA43A68197002772EC80DD689FF0 +S123E5A083968C270F865BBDE0149668BDF555865DBDE0149D7C8D0220C827294D102A01E9 +S123E5C0B881FF270F819E22C9BEE118481F893A9D7C6E949D7C8197102714ED7EEA439E11 +S123E5E019301F9F3339BDE005270A8103271281132703977339BDE00527FB20EE9D822002 +S123E600021A0126319E839F2F060032629E688CFFFF27069F299E2F9F2D8EE3F10D00105C +S123E6202AFE427EE45A260EC6209E2D1027FE169F839E299F6839272CBDEBAD34069E27B0 +S123E6409D82270CBDEA39BDEF04301F9C7122181F10A3E125121F0383003A250B931B2572 +S123E66007DF219F277EE50A7EE4449D821027FE94BDE50A20191F899D7CC1A02716C1A128 +S123E6802645C603BDE433DE839E6886A134528D037EE5829D82BDE7578D403001DC2B10B6 +S123E6A0936822029E19BDE4E92517301F9F833926FD86FF973BBDE3F91F148121270BC630 +S123E6C0048CC60E7EE4467EEA4335529F68DF838D068C8D069F8339C63A865FD7015F9EC8 +S123E6E0831F98D6019701A68427EC3404A1E027E63001812227EA4C26023001818626E7CC +S123E7000C0420E3BDE90D9D8281812705C6A2BDEA3B964F26130F048DB64D27BA9D7C815C +S123E7208426F50A042AF19D7C9D821025FF657EE5BABDEED2C681BDEA3B340281A12704F6 +S123E74081A026830A53260535047EE6789D7C8D06812C27EF35849E749F2B24618030977E +S123E76001DC2B811822DB58495849D32B5849DB018900DD2B9D7C20E2BDEB1E9F3BC6AE7A +S123E780BDEA3B96063402BDE922350246BDE91410270C289E52DC2110A30224119C1B25A4 +S123E7A00DE684BDECD49E4DBDEE0A8E00569F4DBDEE3CDE4D9E3B3726A78410AF02393F45 +S123E7C05245444F0D007EE446960927079E319F687EEA438EE7BEBDF1259E2F9F8339C614 +S123E7E0169E68300127DF8D01398122260BBDEA10C63BBDEA3BBDF1288E00F36F848D06B0 +S123E800C62CE7842016BDF138BDF135BDE181240532647EE609C62E399E33864F97099F3B +S123E82035BDEB1E9F3B9E839F2B9E35A684260996092651BDF1388DCD9F839D7CD6062754 +S123E840239E8397018122270E301F4F9701BDE173863A9701862C9702BDECE5BDEA15BD0F +S123E860E7942006BDF49BBDF3BC9D822706812C1026FF529E839F359E2B9F839D82272174 +S123E880BDEA39209C9F83BDE6D830014D260AC606EE812741EC81DD31A684818626E62012 +S123E8A0989E35D6091026FD3AA68427068EE8B37EF125393F45585452412049474E4F52EE +S123E8C045440D0026049E742003BDEB1E9F3BBDE3F92704C60020471F143003BDF39DA655 +S123E8E06897549E3BBDF14BBDF3BC3069BDF41FE068270CAE6E9F68AEE8109F837EE582CF +S123E90032E8129D82812C26F49D7C8DBD8D131CFE7D1A010D0625032A998C2B96C6187E85 +S123E920E4468D6E4F8C34043402C601BDE433BDE9EF0F3F9D8280AD25138103240F81012A +S123E94049983F913F2564973F9D7C20E9D63F26331024006B8B072467990610270477893E +S123E960FF340248ABE08EE24B30863502A18424558D9C34028D299E3D3502261D4D102757 +S123E980006A204B0806598D098EE997D73F0F0620D99E837EE6AB64EABBA184243120D3C9 +S123E9A0EC0134068D08D63F16FF7B7EEA43D654A68435203404D64F9E50DE5234546EA489 +S123E9C09E74A6E0272681642703BDE90F9F3D3504815A2719817D271554D70A3552975C71 +S123E9E09F5DDF5F3504D761D854D762D64F39BDFC390F069D7C24037EF49BBDEB692450CC +S123EA00812E27F481A7274081A627E38122260A9E83BDECDF9E649F833981A3260D865A58 +S123EA20BDE926BDEBB443537EECBB4C272E8D06BDE922C6298CC6288CC62CE19F008326E3 +S123EA40020E7CC6027EE446867DBDE9267EF672BDEB1E9F52960626957EF39D9D7C1F8924 +S123EA60589D7CC13823037EEA433404C12A251EC130241C8DC0A6E4BDE9228DBCBDE91220 +S123EA803502DE523442BDEED2350234068E8D9E3504BEE11D3AAD947EE90F864F9703BDDC +S123EAA0EBB4DD01BDF3D3BDEBB40D0326069401D40220049A01DA027EECBBBDE91426109F +S123EAC096618A7F945D975D8E005CBDF41F20360F060A3FBDEE1ED7569F589E5FBDEE202A +S123EAE096563404A0E0270786012403D656409754DE585C5A2604D654200BA680A1C02722 +S123EB00F3C6FF240150CB0159D40A2702C6FF7EF405BDEA39C6018D089D8226F5395F9DB1 +S123EB2082D70597379D828D401025FF165FD7069D7C25048D33250A1F899D7C25FC8D296A +S123EB4024F8812426060306CB809D7CD7389A088028102700750F089E1BDC379C1D27127D +S123EB6010A381273E300520F381412504805B80A5398E0074EEE41183EA532728DC1FDDC0 +S123EB8043C30007DD419E1D9F47BDE41E9E419F1F9E459F1D9E47DC37ED814F5FED84ED38 +S123EBA002A7049F393990800000009D7CBDE90D96542B5DBDE90F964F819025088EEBA64E +S123EBC0BDF41F264CBDF451DC5239DC053406125F9E3734148DD435349F37DE5234605C1D +S123EBE09D82812C27EBD703BDEA333506DD059E1D9C1F2721DC3710A3842706EC02308B84 +S123EC0020EFC6129605260BD603E1042759C6108CC6087EE446CC0005DD64DC37ED84D6BB +S123EC2003E704BDE4339F41C60B4F0D0527053506C30001ED058D5DDD6430020A0326E867 +S123EC409F0FD30F1025F7FC1F01BDE437830035DD1F4F301FA7059C0F26F89E41961F9312 +S123EC6041ED029605262DE604D7034F5FDD643506DD5210A305243ADE6427048D17D35209 +S123EC8030020A0326E7EDE358495849E3E1308B30059F393986109745EC05DD174F5F58F0 +S123ECA049250F086509642404D31725050A4526EE397EEC0E1F40931F214F0F06DD50C620 +S123ECC0907EF40BBDE90FCE01F0BDF56532628E01EF200B9F4D8D5C9F58D75639301F8654 +S123ECE0229701970230019F629F58C6FF5CA680270C91012704910226F381222702301F96 +S123ED009F64D756DE62118301F022078DC69E62BDEE0C9E0B8C00F12605C61E7EE4469654 +S123ED2056A700DC58ED0286FF97069F0D9F5230059F0B390F074F3406DC23A3E0109321F3 +S123ED40250ADD239E2330019F253584C61A030727CA8D04350420DE9E279F234F5FDD4B11 +S123ED609E219F478E00C99C0B27048D3220F89E1B9C1D27048D2220F89F419E419C1F27E5 +S123ED8035EC02D341DD41A6012AF0E60458CB053A9C4127E88D0820F8A60130022A14E677 +S123EDA0842710EC02109323220910934723049F4BDD473005399E4B27FB4FE6845AD347F0 +S123EDC0DD439E239F41BDE4209E4BDC45ED029E45301F7EED5ADC523406BDE9EFBDE91208 +S123EDE035109F62E6849E52EB842405C61C7EE446BDECD49E62E6848D109E4D8D228D0C96 +S123EE009E628D1CBDED137EE934AE02DE255C2004A680A7C05A26F9DF2539BDE9129E52CF +S123EE20E6848D182613AE07301F9C2326083404D323DD233504300139AE02399C0D260705 +S123EE409F0B301B9F0D4F398D037EECBA8DCC0F065D39BDEED5C601BDED349653BDECD83E +S123EE60A78432627EED138D0220DF8DE0275EE684398D484FE1842303E6844F3406BDECE3 +S123EE80D69E4D8D9B35043A3504BDEE0C20D58D2BA0844020DFC6FFD7539D82812927052E +S123EEA0BDEA398D2D8D1527245F4AA18424CD1F89E08450D15323C4D65320C0BDEA33EED0 +S123EEC0E4AE659F4DA664E66432671F357EEC119D7CBDE90DBDEBB04D26F20E82BDEE4D7E +S123EEE0102702DEDE839F833AA68434526F849D82BDF49B3552A784DF83398D079F2BBDC4 +S123EF00EA3920CEBDE90D96542BC2964F819022BCBDF4519E52398DEEE6847EECBA8DDBE2 +S123EF209E2BE784393401BDE757BDE4E59F66350127129D82271381A726099D7C2706BD83 +S123EF40E757270639CEFFFFDF2B32629E66BDF0E9BDE1DAEC8426037EE4659F66EC02102A +S123EF60932B22F4BDF555BDF1359E668D10AE9F0066CE00F4A6C027D5BDF13A20F7300424 +S123EF80108E00F4A68027512B15813A260DE684C18427F0C18327EC8C86218D3020E5CE2F +S123EFA0E10B81FF2604A6803345847F334A6DC427E7A0C42AF6ABC4EE414A2B066DC02A66 +S123EFC0FC20F7A6C48D066DC02AF820B7108C01ED2406847FA7A06FA4399E83CE00F30FBC +S123EFE0430F44A68027210D43270FBDEB69241881302504813923100F438120270A974272 +S123F000812227380D442719A7C02706813A27CF20D16FC06FC01F308300F18E00F29F8360 +S123F02039813F2604868720DF81272613CC3A83EDC10F42A68027D0914227CCA7C020F4D6 +S123F04081302504813C25C0301F34500F41CEE10B0F42334AA6C4273110AE41AEE4E6A0AC +S123F060E08027FAC180263832623540DA4296412606C1842606863AEDC12094E7C0C186C3 +S123F08026020C44C18227AA2086CEE110034126C03550A680A7C0BDEB6925EC034320E8CF +S123F0A00C424A27AE313FE6A02AFC20AF27368D0139273E819F2753812C2737813B276083 +S123F0C0BDE922960634022606BDF562BDECDD8D573504BDE1735D26089D82812C27148D7F +S123F0E0549D8226CF860D2051BDE17327F7966C26F339BDE173270AD66CD16B25068DE5C0 +S123F100201ED66CD06A24FC502010BDEED081291026F92FBDE173D06C23058D185A26FB79 +S123F1209D7C7EF0B2BDECDFBDEE1E5C5A27C3A6808D0720F786208C863F7EE0148EF6499A +S123F1402009BDF2B8035403622003BDF2B85D102702808E005C1F895D276CD04F27692569 +S123F1600A974F966197548E004F50C1F82F594F6401BDF243D6622A0B63016302630363A6 +S123F1800443890097639653996097539652995F97529651995E97519650995D97505D2AFC +S123F1A04425028D5D5F9650262E965197509652975196539752966397530F63CB08C128DC +S123F1C02DE44F974F9754398D6D5F20A85C086309530952095109502AF3964F3404A0E0B5 +S123F1E0974F23DE8C2508086386009763200C0C4F2728065006510652065324048D0D2763 +S123F200EE39035403500351035203539E5230019F5226069E5030019F5039C60A7EE4461D +S123F2208E0012A6049763A603A704A602A703A601A702965BA701CB082FE89663C0082725 +S123F2400C6701660266036604465C26F43981000000008D6327608D788600971397149797 +S123F260159716D6538D22D663D78BD6528D1AD663D78AD6518D12D663D789D6508D0CD6F8 +S123F28063D788BDF3947EF1A52795439613562726241696169B6097169615995F97159692 +S123F2A014995E97149613995D46971306140615061606634F20D539EC0197618A80DD5DA5 +S123F2C0D661D854D762EC03DD5FA684975CD64F394D27169B4F464928108B80974F270C89 +S123F2E0966297543996544320023262102AFED27EF21BBDF3E8270D8B0225F40F62BDF1E5 +S123F300560C4F27EB398420000000BDF3E88EF3065FD762BDF39D8C8D9E2773004F8DB167 +S123F3200C4F27CC8E0013C604D703C6019650915D26139651915E260D9652915F260796BE +S123F3405391602601431FA859240AE7800A032B34272EC6011F8A250E0860095F095E09A2 +S123F3605D25E32BC820DF966090539760965F9252975F965E9251975E965D9250975D20DE +S123F380D8C64020D0565656D7638D087EF1A5C6147EE4469E139F509E159F52393402EC95 +S123F3A00197548A80DD500F63E684AE039F52D74F35828E004520068E00408C9E3B964FBA +S123F3C0A78496548A7F9450A7019651A702DE52EF0339966197549E5C9F4F0F63965E97CD +S123F3E05196549E5F9F5239DC4FDD5C9E519F5E9E539F604D39D64F2708D65459C6FF2520 +S123F4000150398DF1D7500F51C68896508080D74FDC74DD52976397547EF1A10F5439E609 +S123F4208427D3E601D8542BD1D64FE184261DE601CA7FD450E1012613D651E102260DD6EC +S123F44052E1032607D653E00426013956D85420ABD64F273DC0A096542A05035BBDF20478 +S123F4608E004FC1F82E06BDF2370F5B390F5B96544906507EF243D64FC1A0241D8DD2D792 +S123F480639654D754808086A0974F965397017EF1A1D750D751D752D753399E749F549FD4 +S123F4A04F9F519F529F479F452564BDFBD8812D260403552004812B26049D7C2551812ECD +S123F4C02728814526289D7C256481A7270E812D270A81A62708812B2704200603489D7C30 +S123F4E0254C0D48270800472004034626CC96479045974727122A09BDF30B0C4726F92024 +S123F50007BDF2F30A4726F996552A8E7EF672D645D046D7453402BDF2F33504C0308D0268 +S123F5202098BDF3B8BDF4058E00407EF14BD6475858DB475880303404ABE09747209F9B77 +S123F5403EBC1FFD9E6E6B27FD9E6E6B28008EE3E78D0CDC68DD50C69043BDF40F8D037E8E +S123F560F125CE01F18620D6542A02862DA7C0DF6497548630D64F102700C64FC1802208DB +S123F5808EF549BDF25386F797458EF544BDF4292E0F8EF53FBDF4292E0EBDF2F30A452079 +S123F5A0F1BDF30B0C4520E2BDF13DBDF451C60196458B0A2B09810B24054A1F8986024A77 +S123F5C04A9747D7452E0DDE64862EA7C05D27048630A7C08EF64EC6809653AB0397539677 +S123F5E052A90297529651A90197519650A98497505C565928E32403C00B50CB2F30041F09 +S123F60098847FA7C00A452604862EA7C053C4808CF67226C4A6C2813027FA812E26023397 +S123F6205F862BD647271C2A03862D50A7428645A741862F4CC00A24FBCB3AED436F452097 +S123F64004A7C46F418E01F1398000000000FA0A1F0000989680FFF0BDC0000186A0FFFFEC +S123F660D8F0000003E8FFFFFF9C0000000AFFFFFFFF964F27020354399F64BDF3B88D0599 +S123F6808D088E00407EF2539F64BDF3B39E64E680D7559F648DEE9E6430059F64BDF14B95 +S123F6A08E00450A5526EE39BDF3F62B1F27158D10BDF3B88D0E8E00408DCA8EF24EBDF15A +S123F6C04B7EF4779EB19F509EB39F52BEF6F99F5DBEF6FB9F5FBDF259DC8AC3658BDDB36B +S123F6E0DD52DC88C9B08905DDB1DD500F548680974F961597637EF1A540E64DABBDF3E8F3 +S123F7008EF742D661BDF312BDF3E88DB40F62965CD64FBDF1458EF747BDF14296543402F5 +S123F7202A09BDF13D96542B05030ABDF6728EF747BDF14B35024D2A03BDF6728EF74C7E71 +S123F740F67983490FDAA27F000000000584E61A2D1B862807FBF88799688901872335DF17 +S123F760E186A55DE72883490FDAA2A154468F138F524389CD8EF7A8BDF14B7EF6FDBDF318 +S123F780B80F0A8DF68E004ABDF3BE8E0040BDF39D0F54960A8D0C0D4F1027FA7E8E004A31 +S123F7A07EF31834027EF72B81490FDAA2965434022A028D24964F3402818125058EF24E7F +S123F7C08DDE8EF7DDBDF6793502818125068EF7A8BDF14235024D2A037EF672390B76B3A7 +S123F7E083BDD3791EF4A6F57B83FCB0107C0C1F67CA7CDE53CBC17D1464704C7DB7EA51E1 +S123F8007A7D6330887E7E9244993A7E4CCC91C77FAAAAAA138100000000037F5E56CB79B4 +S123F82080139B0B6480763893168238AA3B20803504F334813504F334808000000080311F +S123F8407217F8BDF3F6102FF3C78EF82F964F808034028680974FBDF14B8EF834BDF3184D +S123F8608EF24EBDF1428EF81ABDF6798EF839BDF14B3504BDF5228EF83E7EF253BDF3E816 +S123F8808EF649BDF39D27674D26037EF1C38E004ABDF3BE5F96612A10BDF4778E004A96A8 +S123F8A061BDF429260343D601BDF3D53404BDF8438E004ABDF2538D363502461025FDB213 +S123F8C0398138AA3B29077134583E5674167EB31B772FEEE3857A1D841C2A7C6359580ABF +S123F8E07E75FDE7C6803172181081000000008EF8C1BDF253BDF3B8964F818825037EF264 +S123F900E5BDF47796018B8127F44A34028E0040BDF1428EF8C6BDF6880F623502BDF2D12B +S123F92039BDF3F62B037EF47703548DF97EF672BDFD5E326286019798BDE4E51025ED827E +S123F940BDEF7E1F208300F5D797DC2BBDF555BDF1358E00F4D69826255FBDFA84BDFFB61C +S123F960250B80303402860A3DEBE020EDC001C90181412605BDF0E520BB814C260B8D3127 +S123F9800F98BDF0E520C33262810D260D8D22BDF0E58E00F49F837EE48E814527F181516D +S123F9A02606BDF0E57EE4658D0220AD812026108CC6F9A6842708BDE01430015A26F43958 +S123F9C0814426486D8427F78D045A26F7390A97311F3121A621A7A426F83981492713816F +S123F9E058270D8148265C6F841F108300F5D7978DBFBDFA84810D278E811B2725810826C3 +S123FA00228C00F427EC8D458DC420E6814326CB6D84270EBDFA84250220F5A7808D375A6D +S123FA2026EE39D697C1F9260220C734106D8026FCE682E701ACE426F83262A7808D170C83 +S123FA409720AF810826128D045A26FB398C00F427D0301F86087EE014814B27058053277E +S123FA60013934028D1E3402A68427166D6126068DE430012003BDF9CEA684A1E426E95A6F +S123FA8026E635A0BDE000817F24F9815F2602861B810D270E811B270A8108270681202512 +S123FAA0E31A0139864F978C398600D6791D7EECBBBDEA36DC1F3406BDEB1EBDEA333506D6 +S123FAC01E109C1F26517EECBB9D7CBDEA36BDEB1E3410EC02109321230493272312E6846B +S123FAE0BDED343410AE62BDEE0A3550AF423440BDEEFF34045D271FC6FF81292703BDEE68 +S123FB00FF3404BDEA33C6AEBDEA3B8D2E1F13AE62A684A06124037EEC114CA1E42402A712 +S123FB20E4A6611E89AE025A3A4D270DA1E42302A6E41F891E31BDE1F13596BDE9227EEEB1 +S123FB401BBDEA36BDEED23404BDEA39BDE922BDEA3396062605BDEED52003BDEE6B3404BA +S123FB60E661BDECD635062705A7805A26FB7EEE62BDEA36BDE922C601340496062610BDB1 +S123FB80EED5E7E42791BDEA39BDE922BDE9129E523410BDEA39BDFB3B3414BDEA33AE6381 +S123FBA0BDEE203404E1662523A661271CE6665A3A3184EE62E661A6E4A0664CA161250C2A +S123FBC0A680A1C0260C5A26F7E666215F32677EECBA6C66302120D98126265C32620F522E +S123FBE00F538E00529D7C814F2712814827239D82200C81381022EE4AC6038D2A9D7C255E +S123FC00F20F500F510F060F630F54C6A0D74F7EF1A59D7C250BBDEB6925E6814724E280F2 +S123FC2007C6048D0220EB680169841025F5EC5A26F58030AB01A7013935400F069E839DEF +S123FC407C8126279981B0275E81FF26089D7C8183102700AB9F836EC49E68300126D9C60A +S123FC60167EE446AE9F00838CFF83102700748D238DE6BDEA36C680D708BDEB1E8D25BDDF +S123FC80EA33C6AEBDEA3B9E4BDC83ED84DC39ED027EE6D0C6B0BDEA3BC680D7088A80BDB8 +S123FCA0EB239F4B7EE90F8DEB3410BDEA2E8DF43540C632AE4227A9109E83EEC4DF83A6A8 +S123FCC0043402EC84EE023476BDF3BEBDE90D3576ED84EF023502A7049D821026ED641016 +S123FCE09F83399D7C8D0934108D2D3540AFC4395F9D7C240680301F899D7C9E8D583A39CE +S123FD008DEEAE843410BDEA2E8E004F96062707BDEE1E9E52960639C6AEBDEA3B7EEF041D +S123FD201027EEEDBDE757BDE4E59F939D82271081A7263B9D7C27048D24200486FF972BBB +S123FD40DE938CEEC4ECC42706EC42932B23F49E938D15BDE5059E93BDE4D57EE465BDE784 +S123FD60577EE1FAA6C0A78011931B26F79F1B39BDFC599D7C8122260BBDEA10C63BBDEA15 +S123FD803BBDF128327EBDE80C3262BDEB1E9F3BBDE9128E00F34FBDECE37EE794BDE757B1 +S123FDA09E2B399E919F2B7EE4E5BDE50ACC000ADD95DD8F5FDD919D8224068DE09F959D49 +S123FDC082271BBDEA3924068DD39F919D82270EBDEA3924068DC69F8F2749BDE1FA8DC38A +S123FDE09F939E958DBF9C93253A8D1CBDFE7EBDE4D38DAF9F938D3A8D0F8D36BDFF19BD44 +S123FE00E50ABDE4D37EE465864F97989E93DC958D150D982602ED02AE848D0BD38F25045B +S123FE2081FA25EE7EEC113406EC84350626023262399E19301F30018DED30033001A6849C +S123FE4027F49F0F4A270C4A272A4A26EF8603A78020E7EC016A0227014FE6036A04270158 +S123FE605FED01DD2BBDE4E59E0F25E1DC476C80ED8420C66F84AE01AE029F4720EA9E1991 +S123FE8020049E8330018D9F300230019F839D7C4D27EF2AF99E8381FF27EF81A227128104 +S123FEA084270E818126E79D7C81A0270481A126DB9D7C25049D8220D79E833410BDE75736 +S123FEC09E83A682BDFFB625F930011F10E061C0052720250A3384503085BDFD6820149FB8 +S123FEE0479E1B9F435030859F419F1BBDE41E9E459F8335108601A784A702A704D62B2647 +S123FF0004C6016C02E701D62C2604C6016C04E7039D82812C279A209C9E19301F3001EC03 +S123FF2002DD68BDFE2730033001A68427EF4A271B800226F334108EFF76BDF125AEE4EC31 +S123FF4001BDF555BDF54EBDF0E535103410EC01DD52BDFC01BDF5623540C6053001A684F5 +S123FF6027055AA7C020F530C45D27BE31C433C5BDFD6830A420B3554C2000BDEF078E018C +S123FF80F0C60434045F860408530952594A26F85D260AA6E44A27058C01F0270CCB30C112 +S123FFA0392302CB07E7806F8435045A26D532628E01EF7EECDF81302504803A80C6398136 +S10BFFC0891027FDAB7EEA4322 +S113FFF00000009B009E00AA00A700A100A4E04806 +S9030000FC diff --git a/ROMS/6809/BASIC.SYM b/ROMS/6809/BASIC.SYM new file mode 100644 index 0000000..43e4104 --- /dev/null +++ b/ROMS/6809/BASIC.SYM @@ -0,0 +1,1009 @@ +ABS f3d9 +ARYDIS 0008 +ARYEND 001f +ARYTAB 001d +ASC ee24 +ATN f76a +BACDST e05a +BAWMST e0c6 +BFRQSV e0cd +BINVAL 002b +BIRQSV e1be +BOTSTK 0017 +BROMHK e1bf +BS 0008 +CHARAC 0001 +CHARAD 0083 +CHR ee10 +CLEAR e5f4 +CMD_TAB e32a +COEFCT 0055 +COEFPT 0064 +COMPARISON eac8 +COMVEC e0ee +CONT e5e3 +COS f732 +CR 000d +CURLIN 0068 +DATA e68d +DATPTR 0033 +DATTMP 0035 +DATTXT 0031 +DEF fc21 +DEL fcdd +DEVCFW 006a +DEVLCF 006b +DEVPOS 006c +DEVWID 006d +DIM ead2 +DIMFLG 0005 +EDIT f8ed +ELSE e690 +END e5ba +ENDCHR 0002 +ENDFLG 0000 +ESC 001b +EXEC e18c +EXECJP 007a +EXP f8ac +FIRQ fff6 +FIX f8de +FOR e4e8 +FP0EXP 004f +FP0SGN 0054 +FP1EXP 005c +FP1SGN 0061 +FPA0 0050 +FPA1 005d +FPA2 0013 +FPCARY 005b +FPSBYT 0063 +FRESPC 0025 +FRETOP 0021 +FRQVEC 00aa +FUNC_TAB e1ce +GARBFL 0007 +GETCCH 0082 +GETNCH 007c +GIVABF ec78 +GO e633 +HEXDOL ff38 +IF e6c1 +IFCTR 0004 +IKEYIM 0073 +INKEY e19a +INPFLG 0009 +INPUT e79c +INSTR fb2e +INT f434 +INTCNV eb71 +IRQ fff8 +IRQVEC 00a7 +KEYIN e005 +L8031 e0ab +L837E f738 +L83A3 f75d +L83A6 f760 +L83AB f765 +L83B8 f772 +L83C5 f77f +L83D7 f791 +L83DC f796 +L83DF f799 +L83E0 f79a +L83E1 f79b +L83E6 f7a0 +L83EB f7a5 +L83F0 f7aa +L83F5 f7af +L83FA f7b4 +L83FF f7b9 +L8404 f7be +L8409 f7c3 +L840E f7c8 +L8413 f7cd +L8418 f7d2 +L841D f7d7 +L841E f7d8 +L8423 f7dd +L8428 f7e2 +L842D f7e7 +L8432 f7ec +L8437 f7f1 +L843C f7f6 +L8441 f7fb +L8489 f843 +L8491 f84b +L84AC f866 +L84C4 f87e +L84C9 f883 +L84CA f884 +L84CF f889 +L84D4 f88e +L84D9 f893 +L84DE f898 +L84E3 f89d +L84E8 f8a2 +L84ED f8a7 +L8501 f8bb +L8504 f8be +L8529 f8e3 +L852C f8e6 +L8538 f8f2 +L854D f907 +L855C f916 +L855D f917 +L8570 f92a +L857D f937 +L8581 f93b +L858A f944 +L858C f946 +L8592 f94c +L859D f957 +L85AB f965 +L85AF f969 +L85B3 f96d +L85B4 f96e +L85B6 f970 +L85C2 f97c +L85C3 f97d +L85C7 f981 +L85D1 f98b +L85D5 f98f +L85DE f998 +L85F3 f9ad +L85F5 f9af +L860F f9c9 +L8613 f9cd +L861E f9d8 +L8625 f9df +L8626 f9e0 +L862E f9e8 +L8630 f9ea +L8634 f9ee +L8646 fa00 +L864A fa04 +L8650 fa0a +L8659 fa13 +L865C fa16 +L8665 fa1f +L866B fa25 +L8679 fa33 +L867C fa36 +L8685 fa3f +L8687 fa41 +L8694 fa4e +L86A6 fa60 +L86D6 fa86 +L86EB fa9b +L86FD faad +L870E fabe +L8724 fad4 +L8727 fad7 +L872E fade +L873F faef +L8746 faf6 +L8748 faf8 +L8768 fb18 +L876B fb1b +L8776 fb26 +L877B fb2b +L879C fb4c +L87BE fb6e +L87CD fb7d +L87D6 fb86 +L87D8 fb88 +L87D9 fb89 +L87DF fb8f +L87EB fb9b +L8800 fbb0 +L880A fbba +L880C fbbc +L880E fbbe +L881F fbcf +L882E fbde +L8834 fbe4 +L8845 fbf5 +L8862 fc12 +L8866 fc16 +L886E fc1e +L88A1 fc51 +L88B1 fc61 +L88B4 fc64 +L88D9 fc89 +L88EF fc9f +L890B e39a +L890D e39c +L890F fca0 +L891C fcad +L8927 fcb8 +L892C fcbd +L8943 fcd4 +L8944 fcd5 +L898C fcf9 +L8990 fcfd +L8992 fcff +L8993 fd00 +L899F fd0c +L89AE fd1b +L89B4 fd21 +L89B8 fd25 +L89BF fd2c +L89C0 fd2d +L89D2 fd32 +L89E1 fd41 +L89FC fd5a +L8A02 fd60 +L8A04 fd62 +L8A20 fd7e +L8A2D fd8b +L8A3A fd98 +L8A3D fd9b +L8A67 fdc5 +L8A68 fdc6 +L8A71 fdcf +L8A77 fdd5 +L8A83 fde1 +L8A86 fde4 +L8A90 fdee +L8A91 fdef +L8A95 fdf3 +L8A99 fdf7 +L8A9B fdf9 +L8AAC fe0a +L8AB2 fe10 +L8AB9 fe17 +L8AC0 fe1e +L8AC7 fe25 +L8AD3 fe31 +L8ADD fe3b +L8AE1 fe3f +L8AE5 fe43 +L8AE9 fe47 +L8AEB fe49 +L8AED fe4b +L8AEF fe4d +L8B13 fe6e +L8B17 fe72 +L8B1B fe76 +L8B24 fe7f +L8B41 fe9c +L8B55 feb0 +L8B67 fec2 +L8B71 fecc +L8B7B fed6 +L8B7F feda +L8B8A fee5 +L8B8C fee7 +L8BAE ff09 +L8BBE ff19 +L8BC9 ff24 +L8BD9 ff34 +L8BE5 ff40 +L8BEA ff45 +L8BFF ff5a +L8C07 ff62 +L8C0B ff66 +L90AA ff73 +L90B2 ff7b +LA00E e046 +LA077 e05d +LA084 e06a +LA093 e079 +LA0F3 e0ca +LA10D e0ce +LA123 e0da +LA147 e104 +LA156 e12d +LA165 e12f +LA171 e000 +LA1C1 e005 +LA35F e130 +LA37C e136 +LA38D e13e +LA390 e13e +LA39A e145 +LA3B4 e153 +LA3B8 e157 +LA3C2 e161 +LA3C8 e167 +LA3CC e16b +LA3CD e16c +LA3D9 e178 +LA3E8 e187 +LA545 e193 +LA549 e197 +LA56B e1a1 +LA59A e1ae +LA5A1 e1b5 +LA5C4 e1b6 +LA5C7 e1b7 +LA5C9 e1b9 +LA5E8 fa6a +LA9C5 e1be +LAA24 e1c9 +LAA28 e1cd +LAA29 e1ce +LAA51 e208 +LAA66 e21d +LAB1A e2bd +LAB67 e32a +LABAF e368 +LABE1 e39e +LABE8 e3a5 +LABED e3aa +LABEE e3ab +LABF2 e3af +LABF9 e3b6 +LABFB e3b8 +LAC16 e3d3 +LAC1A e3d7 +LAC1E e3db +LAC20 e3dd +LAC28 e3e5 +LAC32 e3ef +LAC33 e3f0 +LAC37 e3f4 +LAC44 e401 +LAC46 e403 +LAC60 e40f +LAC68 e417 +LAC73 e422 +LAC7C e42b +LACA0 e443 +LACA5 e448 +LACA8 e44b +LACC0 e462 +LACC8 e46a +LACDD e47e +LACE9 e48a +LACEF e490 +LACF1 e492 +LACF7 e498 +LAD01 e4a2 +LAD05 e4a6 +LAD12 e4b3 +LAD14 e4b5 +LAD16 e4b7 +LAD19 e4ba +LAD21 e4c2 +LAD26 e4c7 +LAD33 e4d4 +LAD59 e4fa +LAD7F e520 +LAD90 e531 +LAD9E e53f +LADB1 e54f +LADB4 e552 +LADC0 e571 +LADC6 e577 +LADD4 e589 +LADE8 e5a0 +LADEA e5a2 +LADEB e5a3 +LADF0 e5a8 +LADFA e5b2 +LADFB e5b3 +LAE0B e5c0 +LAE11 e5c6 +LAE15 e5ca +LAE22 e5d7 +LAE40 e5f3 +LAE5A e60d +LAE6F e622 +LAE72 e625 +LAE88 e635 +LAE9F e64c +LAEA4 e651 +LAEB6 e663 +LAEBB e668 +LAEBF e66c +LAED2 e67f +LAED7 e684 +LAEDA e687 +LAEE7 e694 +LAEE8 e695 +LAEEA e697 +LAEEB e698 +LAEF1 e69e +LAEF7 e6a4 +LAF0C e6b9 +LAF22 e6cf +LAF28 e6d5 +LAF39 e6e6 +LAF52 e6ff +LAF54 e701 +LAF5D e70a +LAF67 e714 +LAF6B e718 +LAFA4 e751 +LAFB1 e75e +LAFBE e76b +LAFCE e77b +LAFCF e77c +LAFD6 e783 +LAFDC e783 +LAFDF e786 +LAFEA e791 +LASTPT 000d +LB00F e7a7 +LB01E e7b6 +LB02F e7c3 +LB035 e7c9 +LB03F e7d3 +LB049 e7d9 +LB04E e7de +LB069 e7f6 +LB08B e814 +LB098 e821 +LB09E e827 +LB0A8 e831 +LB0B9 e842 +LB0CD e856 +LB0D5 e85e +LB0E7 e870 +LB0E8 e871 +LB0FE e887 +LB101 e88a +LB10A e893 +LB10C e895 +LB131 e8ba +LB134 e8bd +LB141 e8ca +LB143 e8cc +LB145 e8ce +LB146 e8cf +LB148 e8d1 +LB14F e8d8 +LB153 e8dc +LB156 e8df +LB158 e8e1 +LB15A e8e3 +LB168 e8f1 +LB16A e8f3 +LB181 e90a +LB19F e928 +LB1A7 e930 +LB1B8 e941 +LB1C6 e94f +LB1CB e954 +LB1CC e955 +LB1CE e957 +LB1D4 e95d +LB1DF e968 +LB1E2 e96b +LB1E6 e96f +LB1EA e973 +LB1F4 e97d +LB1FA e983 +LB201 e98a +LB203 e98c +LB220 e9a9 +LB222 e9ab +LB223 e9ac +LB22C e9b5 +LB22F e9b8 +LB244 e9cd +LB249 e9d2 +LB24E e9d7 +LB25F e9e8 +LB262 e9eb +LB267 e9f0 +LB26A e9f3 +LB26D e9f6 +LB26F e9f8 +LB277 ea00 +LB27C ea05 +LB284 ea0d +LB287 ea10 +LB290 ea19 +LB29F ea27 +LB2C7 ea4b +LB2C9 ea4d +LB2CE ea52 +LB2D4 ea58 +LB2D5 ea59 +LB2ED ea71 +LB2F1 ea75 +LB2F4 ea78 +LB309 ea8d +LB328 eaac +LB32D eab1 +LB334 eab8 +LB33F eac3 +LB348 eacc +LB34B eacf +LB357 eadb +LB35A eade +LB35C eae0 +LB371 eaf5 +LB373 eaf7 +LB37B eaff +LB385 eb09 +LB395 eb19 +LB3A2 eb26 +LB3AA eb2e +LB3AB eb2f +LB3DC eb60 +LB3DE eb62 +LB3DF eb63 +LB3E4 eb68 +LB3E6 eb6a +LB3E9 eb6d +LB3FE eb82 +LB404 eb88 +LB40A eb8e +LB42A ebae +LB43B ebbf +LB447 ebcb +LB44A ebce +LB44C ebd0 +LB44F ebd3 +LB461 ebe5 +LB46D ebf1 +LB48C ec10 +LB4A0 ec24 +LB4A6 ec2a +LB4B9 ec3d +LB4CD ec51 +LB4CE ec52 +LB4D8 ec5c +LB4E6 ec6a +LB4EB ec6f +LB4F3 ec77 +LB50D ec91 +LB50F ec93 +LB511 ec95 +LB516 ec9a +LB518 ec9c +LB51A eca0 +LB51E eca2 +LB526 ecaa +LB533 ecb7 +LB537 ecbb +LB539 ecbd +LB543 ecc7 +LB54C ecd0 +LB555 ecd9 +LB558 ecdc +LB56D ecf1 +LB56F ecf3 +LB585 ed09 +LB591 ed15 +LB593 ed17 +LB5A0 ed24 +LB5A8 ed2c +LB5AA ed2e +LB5B2 ed36 +LB5B4 ed38 +LB5B6 ed3a +LB5CA ed4e +LB5D2 ed56 +LB5D8 ed5c +LB5EC ed70 +LB5EE ed72 +LB5EF ed73 +LB60F ed93 +LB62A edae +LB643 edc7 +LB645 edc9 +LB64A edce +LB64E edd2 +LB654 edd8 +LB657 eddb +LB659 eddd +LB66F edf3 +LB672 edf6 +LB675 edf9 +LB680 ee04 +LB683 ee07 +LB686 ee0a +LB68F ee13 +LB69B ee1f +LB69D ee21 +LB6A4 ee28 +LB6AD ee31 +LB6AE ee32 +LB6B5 ee39 +LB6DE ee62 +LB6F5 ee79 +LB706 ee8a +LB709 ee8d +LB70B ee8f +LB70E ee92 +LB734 eeb8 +LB738 eebc +LB73D eec1 +LB740 eec4 +LB783 ef01 +LB784 ef02 +LB789 ef07 +LB78D ef0b +LB797 ef15 +LB79F ef18 +LB7B9 ef32 +LB7C2 ef3b +LB7CB ef41 +LB7E0 ef56 +LB7E2 ef58 +LB7E6 ef5c +LB7F1 ef67 +LB7F3 ef69 +LB801 ef77 +LB804 ef7a +LB80A ef80 +LB814 ef8a +LB820 ef96 +LB821 ef97 +LB829 ef9c +LB82D efa0 +LB842 efb5 +LB844 efb7 +LB852 efc5 +LB85A efcd +LB85C efcf +LB86B efde +LB873 efe6 +LB87C efef +LB87E eff1 +LB886 eff9 +LB88A effd +LB892 f005 +LB89B f00e +LB89D f010 +LB8A6 f019 +LB8A8 f01b +LB8C2 f035 +LB8C6 f039 +LB8CE f041 +LB8D2 f045 +LB8D4 f047 +LB8EA f05d +LB8F1 f064 +LB8FE f06f +LB91B f06f +LB91D f071 +LB938 f08c +LB949 f093 +LB954 f09e +LB958 f0a2 +LB95C f0a6 +LB965 f0af +LB966 f0b0 +LB975 f0bf +LB977 f0c1 +LB97E f0c8 +LB98E f0d8 +LB992 f0d8 +LB997 f0dd +LB99C f0e2 +LB99F f0e5 +LB9A3 f0e9 +LB9AC f0f2 +LB9AF f0f5 +LB9B1 f0f7 +LB9B4 f0fa +LB9B9 f0ff +LB9BC f102 +LB9C2 f108 +LB9C5 f10b +LB9CD f113 +LB9E2 f128 +LB9EC f132 +LB9FB f141 +LBA18 f15e +LBA1C f162 +LBA1D f163 +LBA39 f17f +LBA3A f180 +LBA3E f184 +LBA3F f185 +LBA44 f18a +LBA4F f195 +LBA5C f1a2 +LBA66 f1ac +LBA72 f1b8 +LBA78 f1be +LBA79 f1bf +LBA7B f1c1 +LBA83 f1c9 +LBA91 f1d7 +LBA92 f1d8 +LBA97 f1dd +LBA9A f1e0 +LBAAE f1f4 +LBAB8 f1fe +LBABA f200 +LBAC4 f20a +LBAC5 f20b +LBACA f210 +LBACC f212 +LBAD0 f216 +LBB00 f246 +LBB02 f248 +LBB03 f249 +LBB20 f266 +LBB2E f274 +LBB2F f275 +LBB48 f28e +LBB5C f2a2 +LBB61 f2a7 +LBB63 f2a9 +LBB67 f2ad +LBB6A f2b0 +LBB7C f2c2 +LBB7D f2c3 +LBB82 f2c8 +LBB89 f2cf +LBB8F f2d5 +LBB91 f2d7 +LBBA4 f2ea +LBBBD f303 +LBBCC f312 +LBBD0 f316 +LBBDE f324 +LBBF8 f33e +LBBFC f342 +LBC06 f34c +LBC0B f351 +LBC14 f35a +LBC2A f370 +LBC2F f375 +LBC33 f379 +LBC35 f37b +LBC4A f390 +LBC4C f392 +LBC5F f3a5 +LBC6D f3b3 +LBC71 f3b7 +LBC73 f3b9 +LBC79 f3bf +LBC7C f3c2 +LBC82 f3c8 +LBC86 f3cc +LBC96 f3dc +LBCA0 f3e6 +LBCC3 f409 +LBCC8 f40e +LBCD7 f41d +LBCE4 f42a +LBD09 f44f +LBD11 f457 +LBD12 f458 +LBD25 f46b +LBD2D f473 +LBD31 f477 +LBD35 f47b +LBD53 f499 +LBD55 f49b +LBD59 f49f +LBD61 f4a7 +LBD65 f4ab +LBD6F f4b5 +LBD78 f4be +LBD7F f4c5 +LBD86 f4cc +LBD99 f4df +LBDA5 f4eb +LBDB6 f4fc +LBDBB f501 +LBDC0 f506 +LBDC5 f50b +LBDCC f512 +LBDD6 f51c +LBDD9 f51f +LBDDC f522 +LBDE4 f52a +LBDFF f545 +LBE01 f547 +LBE09 f54f +LBE18 f55e +LBE1F f565 +LBE36 f57c +LBE4B f591 +LBE50 f596 +LBE72 f5b8 +LBE84 f5ca +LBE8C f5d2 +LBE98 f5de +LBEA3 f5e9 +LBEAB f5f1 +LBEB8 f5fe +LBEBA f600 +LBEBC f602 +LBEC0 f606 +LBEC5 f60b +LBEC9 f60f +LBECD f613 +LBED1 f617 +LBED5 f61b +LBED9 f61f +LBEDD f623 +LBEE1 f627 +LBEE5 f62b +LBEE9 f62f +LBEEF f635 +LBEF0 f636 +LBEFC f642 +LBEFF f645 +LBF01 f647 +LBF0C f652 +LBF38 f67e +LBF3B f681 +LBF45 f689 +LBFA6 f6e8 +LBFA9 f6eb +LBFB7 f6f9 +LBFBD f6ff +LBFC2 f704 +LBFC7 f709 +LBFC8 f70a +LBFCD f70f +LBFD2 f714 +LBFD7 f719 +LBFDC f71e +LBFE1 f723 +LBFF0 fff0 +LBFF2 fff2 +LBFF4 fff4 +LBFF6 fff6 +LBFF8 fff8 +LBFFA fffa +LBFFC fffc +LBFFE fffe +LBUFMX 00fa +LEFT ee2f +LEN ee05 +LET e736 +LINBUF 00f3 +LINE ff7c +LINHDR 00f1 +LIST eee2 +LOG f800 +LPTCFW 0076 +LPTLCF 0077 +LPTPOS 0079 +LPTWID 0078 +LSTTXT 0066 +MAXLIN 00fa +MEM ec72 +MEMSIZ 0027 +MID ee53 +NEW e4b8 +NEWLINE e027 +NEXT e881 +NMI fffc +NMIVEC 00a4 +NOCHAR e012 +NUM_SEC_FNS 001d +OLDPTR 002d +OLDTXT 0029 +ON e6ef +PEEK eed4 +POKE eedb +POS fa66 +PRINT f06a +PROGST 0217 +PUTCHR e014 +PUTEND e037 +READ e7d6 +RECEV ffd1 +RELFLG 000a +RELPTR 003d +REM e690 +RENUM fd67 +RESETV fffe +RESSGN 0062 +RESTOR e59c +RESVEC e046 +RETURN e66d +RIGHT ee4c +RND f665 +RSEED f6b6 +RSTFLG 006e +RSTVEC 006f +RTS_LOW 0095 +RUN e628 +RVSEED 00b0 +SECTOK e591 +SGN f3c0 +SIN f6ba +SKP1 0021 +SKP1LD 0086 +SKP2 008c +SPACE 0020 +SQR f83a +STKBUF 003a +STOP e5be +STR ec81 +STRBUF 01ee +STRDES 0056 +STRING fafe +STRSTK 00c9 +STRTAB 0023 +SW2VEC 009e +SW3VEC 009b +SWI fffa +SWI2 fff4 +SWI3 fff2 +SWIVEC 00a1 +TAN f73b +TEMPPT 000b +TEMPTR 000f +TINPTR 002f +TMPLOC 0003 +TMPTR1 0011 +TOK_DATA 0086 +TOK_ELSE 0084 +TOK_EQUALS 00ae +TOK_FF_USR ff83 +TOK_FN 00b0 +TOK_GO 0081 +TOK_GREATER 00ad +TOK_HIGH_EXEC 009e +TOK_IF 0085 +TOK_INKEY 0098 +TOK_INPUT 0089 +TOK_LEFT 0095 +TOK_MID 0097 +TOK_MINUS 00a7 +TOK_NOT 00a3 +TOK_PLUS 00a6 +TOK_PRINT 0087 +TOK_REM 0082 +TOK_SNGL_Q 0083 +TOK_STEP 00a4 +TOK_SUB 00a1 +TOK_TAB 009f +TOK_THEN 00a2 +TOK_TO 00a0 +TOK_USR 0083 +TOPRAM 0071 +TRANS ffd1 +TRCFLG 008c +TRELFL 003f +TROFF fa62 +TRON fa61 +TXTTAB 0019 +UART ffd0 +UCTRL ffd0 +USR0 00b5 +USRADR 008d +USRJMP 00ad +USTAT ffd0 +V40 0040 +V41 0041 +V42 0042 +V43 0043 +V44 0044 +V45 0045 +V46 0046 +V47 0047 +V48 0048 +V4A 004a +V4B 004b +V4D 004d +VAB 0088 +VAC 0089 +VAD 008a +VAE 008b +VAL ee9a +VALTYP 0006 +VARDES 003b +VARNAM 0037 +VARPT fa6e +VARPTR 0039 +VARTAB 001b +VCF 008f +VD1 0091 +VD3 0093 +VD5 0095 +VD7 0097 +VD8 0098 +VD9 0099 +VDA 009a +WAITACIA e03a +WRWAIT e03c +XVEC15 fbf6 +XVEC19 fb95 +ZERO 0074 diff --git a/ROMS/6809/ExBasROM.LST b/ROMS/6809/ExBasROM.LST new file mode 100644 index 0000000..90a0fdc --- /dev/null +++ b/ROMS/6809/ExBasROM.LST @@ -0,0 +1,5406 @@ +0001 +0002 a000 UART EQU $A000 +0003 a001 RECEV EQU UART+1 +0004 a001 TRANS EQU UART+1 +0005 a000 USTAT EQU UART +0006 a000 UCTRL EQU UART +0007 +0008 0008 BS EQU 8 BACKSPACE +0009 000d CR EQU $D ENTER KEY +0010 001b ESC EQU $1B ESCAPE CODE +0011 0020 SPACE EQU $20 SPACE (BLANK) +0012 003a STKBUF EQU 58 STACK BUFFER ROOM +0013 00fa LBUFMX EQU 250 MAX NUMBER OF CHARS IN A BASIC LINE +0014 00fa MAXLIN EQU $FA MAXIMUM MS BYTE OF LINE NUMBER +0015 * PSEUDO OPS +0016 0021 SKP1 EQU $21 OP CODE OF BRN — SKIP ONE BYTE +0017 008c SKP2 EQU $8C OP CODE OF CMPX # - SKIP TWO BYTES +0018 0086 SKP1LD EQU $86 OP CODE OF LDA # - SKIP THE NEXT BYTE +0019 * AND LOAD THE VALUE OF THAT BYTE INTO ACCA — THIS +0020 * IS USUALLY USED TO LOAD ACCA WITH A NON ZERO VALUE +0021 0095 RTS_LOW EQU $95 +0022 0000 ORG 0 +0023 0000 ENDFLG RMB 1 STOP/END FLAG: POSITIVE=STOP, NEG=END +0024 0001 CHARAC RMB 1 TERMINATOR FLAG 1 +0025 0002 ENDCHR RMB 1 TERMINATOR FLAG 2 +0026 0003 TMPLOC RMB 1 SCRATCH VARIABLE +0027 0004 IFCTR RMB 1 IF COUNTER - HOW MANY IF STATEMENTS IN A LINE +0028 0005 DIMFLG RMB 1 *DV* ARRAY FLAG 0=EVALUATE, 1=DIMENSIONING +0029 0006 VALTYP RMB 1 *DV* *PV TYPE FLAG: 0=NUMERIC, $FF=STRING +0030 0007 GARBFL RMB 1 *TV STRING SPACE HOUSEKEEPING FLAG +0031 0008 ARYDIS RMB 1 DISABLE ARRAY SEARCH: 00=ALLOW SEARCH +0032 0009 INPFLG RMB 1 *TV INPUT FLAG: READ=0, INPUT<>0 +0033 000a RELFLG RMB 1 *TV RELATIONAL OPERATOR FLAG +0034 000b TEMPPT RMB 2 *PV TEMPORARY STRING STACK POINTER +0035 000d LASTPT RMB 2 *PV ADDR OF LAST USED STRING STACK ADDRESS +0036 000f TEMPTR RMB 2 TEMPORARY POINTER +0037 0011 TMPTR1 RMB 2 TEMPORARY DESCRIPTOR STORAGE (STACK SEARCH) +0038 0013 FPA2 RMB 4 FLOATING POINT ACCUMULATOR #2 MANTISSA +0039 0017 BOTSTK RMB 2 BOTTOM OF STACK AT LAST CHECK +0040 0019 TXTTAB RMB 2 *PV BEGINNING OF BASIC PROGRAM +0041 001b VARTAB RMB 2 *PV START OF VARIABLES +0042 001d ARYTAB RMB 2 *PV START OF ARRAYS +0043 001f ARYEND RMB 2 *PV END OF ARRAYS (+1) +0044 0021 FRETOP RMB 2 *PV START OF STRING STORAGE (TOP OF FREE RAM) +0045 0023 STRTAB RMB 2 *PV START OF STRING VARIABLES +0046 0025 FRESPC RMB 2 UTILITY STRING POINTER +0047 0027 MEMSIZ RMB 2 *PV TOP OF STRING SPACE +0048 0029 OLDTXT RMB 2 SAVED LINE NUMBER DURING A "STOP" +0049 002b BINVAL RMB 2 BINARY VALUE OF A CONVERTED LINE NUMBER +0050 002d OLDPTR RMB 2 SAVED INPUT PTR DURING A "STOP" +0051 002f TINPTR RMB 2 TEMPORARY INPUT POINTER STORAGE +0052 0031 DATTXT RMB 2 *PV 'DATA' STATEMENT LINE NUMBER POINTER +0053 0033 DATPTR RMB 2 *PV 'DATA' STATEMENT ADDRESS POINTER +0054 0035 DATTMP RMB 2 DATA POINTER FOR 'INPUT' & 'READ' +0055 0037 VARNAM RMB 2 *TV TEMP STORAGE FOR A VARIABLE NAME +0056 0039 VARPTR RMB 2 *TV POINTER TO A VARIABLE DESCRIPTOR +0057 003b VARDES RMB 2 TEMP POINTER TO A VARIABLE DESCRIPTOR +0058 003d RELPTR RMB 2 POINTER TO RELATIONAL OPERATOR PROCESSING ROUTINE +0059 003f TRELFL RMB 1 TEMPORARY RELATIONAL OPERATOR FLAG BYTE +0060 * FLOATING POINT ACCUMULATORS #3,4 & 5 ARE MOSTLY +0061 * USED AS SCRATCH PAD VARIABLES. +0062 ** FLOATING POINT ACCUMULATOR #3 :PACKED: ($40-$44) +0063 0040 V40 RMB 1 +0064 0041 V41 RMB 1 +0065 0042 V42 RMB 1 +0066 0043 V43 RMB 1 +0067 0044 V44 RMB 1 +0068 ** FLOATING POINT ACCUMULATOR #4 :PACKED: ($45-$49) +0069 0045 V45 RMB 1 +0070 0046 V46 RMB 1 +0071 0047 V47 RMB 1 +0072 0048 V48 RMB 2 +0073 ** FLOATING POINT ACCUMULATOR #5 :PACKED: ($4A—$4E) +0074 004a V4A RMB 1 +0075 004b V4B RMB 2 +0076 004d V4D RMB 2 +0077 ** FLOATING POINT ACCUMULATOR #0 +0078 004f FP0EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #0 EXPONENT +0079 0050 FPA0 RMB 4 *PV FLOATING POINT ACCUMULATOR #0 MANTISSA +0080 0054 FP0SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #0 SIGN +0081 0055 COEFCT RMB 1 POLYNOMIAL COEFFICIENT COUNTER +0082 0056 STRDES RMB 5 TEMPORARY STRING DESCRIPTOR +0083 005b FPCARY RMB 1 FLOATING POINT CARRY BYTE +0084 ** FLOATING POINT ACCUMULATOR #1 +0085 005c FP1EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #1 EXPONENT +0086 005d FPA1 RMB 4 *PV FLOATING POINT ACCUMULATOR #1 MANTISSA +0087 0061 FP1SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #1 SIGN +0088 0062 RESSGN RMB 1 SIGN OF RESULT OF FLOATING POINT OPERATION +0089 0063 FPSBYT RMB 1 FLOATING POINT SUB BYTE (FIFTH BYTE) +0090 0064 COEFPT RMB 2 POLYNOMIAL COEFFICIENT POINTER +0091 0066 LSTTXT RMB 2 CURRENT LINE POINTER DURING LIST +0092 0068 CURLIN RMB 2 *PV CURRENT LINE # OF BASIC PROGRAM, $FFFF = DIRECT +0093 006a DEVCFW RMB 1 *TV TAB FIELD WIDTH +0094 006b DEVLCF RMB 1 *TV TAB ZONE +0095 006c DEVPOS RMB 1 *TV PRINT POSITION +0096 006d DEVWID RMB 1 *TV PRINT WIDTH +0097 006e RSTFLG RMB 1 *PV WARM START FLAG: $55=WARM, OTHER=COLD +0098 006f RSTVEC RMB 2 *PV WARM START VECTOR - JUMP ADDRESS FOR WARM START +0099 0071 TOPRAM RMB 2 *PV TOP OF RAM +0100 0073 IKEYIM RMB 1 *TV INKEY$ RAM IMAGE +0101 0074 ZERO RMB 2 *PV DUMMY - THESE TWO BYTES ARE ALWAYS ZERO +0102 * THE FOLLOWING BYTES ARE MOVED DOWN FROM ROM +0103 0076 LPTCFW RMB 1 16 +0104 0077 LPTLCF RMB 1 112 +0105 0078 LPTWID RMB 1 132 +0106 0079 LPTPOS RMB 1 0 +0107 007a EXECJP RMB 2 LB4AA +0108 +0109 * THIS ROUTINE PICKS UP THE NEXT INPUT CHARACTER FROM +0110 * BASIC. THE ADDRESS OF THE NEXT BASIC BYTE TO BE +0111 * INTERPRETED IS STORED AT CHARAD. +0112 007c 0c 84 GETNCH INC 7372800 / 4 / 16 = 115200 +0287 dbb2 b7 a0 00 STA UCTRL +0288 dbb5 8e dc 03 LDX #LA147-1 POINT X TO COLOR BASIC COPYRIGHT MESSAGE +0289 dbb8 bd eb e5 JSR LB99C PRINT ‘COLOR BASIC’ +0290 dbbb 8e db c6 LDX #BAWMST WARM START ADDRESS +0291 dbbe 9f 6f STX RSTVEC SAVE IT +0292 dbc0 86 55 LDA #$55 WARM START FLAG +0293 dbc2 97 6e STA RSTFLG SAVE IT +0294 dbc4 20 04 BRA LA0F3 GO TO BASIC’S MAIN LOOP +0295 dbc6 12 BAWMST NOP NOP REQ’D FOR WARM START +0296 dbc7 bd df d4 JSR LAD33 DO PART OF A NEW +0297 dbca 7e df 22 LA0F3 JMP LAC73 GO TO MAIN LOOP OF BASIC +0298 * +0299 * FIRQ SERVICE ROUTINE +0300 BFRQSV +0301 dbcd 3b RTI +0302 * +0303 * THESE BYTES ARE MOVED TO ADDRESSES $76 - $85 THE DIRECT PAGE +0304 dbce 10 LA10D FCB 16 TAB FIELD WIDTH +0305 dbcf 40 FCB 64 LAST TAB ZONE +0306 dbd0 50 FCB 80 PRINTER WIDTH +0307 dbd1 00 FCB 0 LINE PRINTER POSITION +0308 dbd2 e6 ce FDB LB44A ARGUMENT OF EXEC COMMAND - SET TO ‘FC’ ERROR +0309 * LINE INPUT ROUTINE +0310 dbd4 0c 84 INC CHARAD+1 +0311 dbd6 26 02 BNE LA123 +0312 dbd8 0c 83 INC CHARAD +0313 dbda b6 00 00 LA123 LDA >0000 +0314 dbdd 7e dc bf JMP BROMHK +0315 * +0316 * THESE BYTES ARE MOVED TO ADDRESSES $A7-$B1 +0317 dbe0 7e dc be JMP BIRQSV IRQ SERVICE +0318 dbe3 7e db cd JMP BFRQSV FIRQ SERVICE +0319 dbe6 7e e6 ce JMP LB44A USR ADDRESS FOR 8K BASIC (INITIALIZED TO ‘FC’ ERROR) +0320 dbe9 80 FCB $80 *RANDOM SEED +0321 dbea 4f c7 FDB $4FC7 *RANDON SEED OF MANTISSA +0322 dbec 52 59 FDB $5259 *.811635157 +0323 * BASIC COMMAND INTERPRETATION TABLE ROM IMAGE +0324 dbee 32 COMVEC FCB 50 50 BASIC COMMANDS +0325 dbef dd 1d FDB LAA66 POINTS TO RESERVED WORDS +0326 dbf1 de 2a FDB LAB67 POINTS TO JUMP TABLE FOR COMMANDS +0327 dbf3 1d FCB 29 29 BASIC SECONDARY COMMANDS +0328 dbf4 dd bd FDB LAB1A POINTS TO SECONDARY FUNCTION RESERVED WORDS +0329 dbf6 dc ce FDB LAA29 POINTS TO SECONDARY FUNCTION JUMP TABLE +0330 dbf8 00 00 FDB 0 NO MORE TABLES (RES WORDS=0) +0331 dbfa 00 00 FDB 0 NO MORE TABLES +0332 dbfc 00 00 FDB 0 NO MORE TABLES +0333 dbfe 00 00 FDB 0 NO MORE TABLES +0334 dc00 00 00 FDB 0 NO MORE TABLES +0335 dc02 00 00 FDB 0 NO MORE TABLES (SECONDARY FNS =0) +0336 +0337 * COPYRIGHT MESSAGES +0338 dc04 36 38 30 39 20 45 LA147 FCC "6809 EXTENDED BASIC" + 58 54 45 4e 44 45 + 44 20 42 41 53 49 + 43 +0339 dc17 0d FCB CR +0340 dc18 28 43 29 20 31 39 FCC "(C) 1982 BY MICROSOFT" + 38 32 20 42 59 20 + 4d 49 43 52 4f 53 + 4f 46 54 +0341 dc2d 0d 0d LA156 FCB CR,CR +0342 dc2f 00 LA165 FCB $00 +0343 +0344 +0345 dc30 34 16 LA35F PSHS X,B,A SAVE REGISTERS +0346 dc32 9e 76 LDX LPTCFW TAB FIELD WIDTH AND TAB ZONE +0347 dc34 dc 78 LDD LPTWID PRINTER WIDTH AND POSITION +0348 dc36 9f 6a LA37C STX DEVCFW SAVE TAB FIELD WIDTH AND ZONE +0349 dc38 d7 6c STB DEVPOS SAVE PRINT POSITION +0350 dc3a 97 6d STA DEVWID SAVE PRINT WIDTH +0351 dc3c 35 96 PULS A,B,X,PC RESTORE REGISTERS +0352 +0353 * THIS IS THE ROUTINE THAT GETS AN INPUT LINE FOR BASIC +0354 * EXIT WITH BREAK KEY: CARRY = 1 +0355 * EXIT WITH ENTER KEY: CARRY = 0 +0356 LA38D +0357 dc3e 0f 73 LA390 CLR IKEYIM RESET BREAK CHECK KEY TEMP KEY STORAGE +0358 dc40 8e 00 f4 LDX #LINBUF+1 INPUT LINE BUFFER +0359 dc43 c6 01 LDB #1 ACCB CHAR COUNTER: SET TO 1 TO ALLOW A +0360 * BACKSPACE AS FIRST CHARACTER +0361 dc45 bd db 00 LA39A JSR LA171 GO GET A CHARACTER FROM CONSOLE IN +0362 dc48 81 08 CMPA #BS BACKSPACE +0363 dc4a 26 07 BNE LA3B4 NO +0364 dc4c 5a DECB YES - DECREMENT CHAR COUNTER +0365 dc4d 27 ef BEQ LA390 BRANCH IF BACK AT START OF LINE AGAIN +0366 dc4f 30 1f LEAX -1,X DECREMENT BUFFER POINTER +0367 dc51 20 34 BRA LA3E8 ECHO CHAR TO SCREEN +0368 dc53 81 15 LA3B4 CMPA #$15 SHIFT RIGHT ARROW? +0369 dc55 26 0a BNE LA3C2 NO +0370 * YES, RESET BUFFER TO BEGINNING AND ERASE CURRENT LINE +0371 dc57 5a LA3B8 DECB DEC CHAR CTR +0372 dc58 27 e4 BEQ LA390 GO BACK TO START IF CHAR CTR = 0 +0373 dc5a 86 08 LDA #BS BACKSPACE? +0374 dc5c bd db 14 JSR PUTCHR SEND TO CONSOLE OUT (SCREEN) +0375 dc5f 20 f6 BRA LA3B8 KEEP GOING +0376 dc61 81 03 LA3C2 CMPA #3 BREAK KEY? +0377 dc63 1a 01 ORCC #1 SET CARRY FLAG +0378 dc65 27 05 BEQ LA3CD BRANCH IF BREAK KEY DOWN +0379 dc67 81 0d LA3C8 CMPA #CR ENTER KEY? +0380 dc69 26 0d BNE LA3D9 NO +0381 dc6b 4f LA3CC CLRA CLEAR CARRY FLAG IF ENTER KEY - END LINE ENTRY +0382 dc6c 34 01 LA3CD PSHS CC SAVE CARRY FLAG +0383 dc6e bd eb a5 JSR LB958 SEND CR TO SCREEN +0384 dc71 6f 84 CLR ,X MAKE LAST BYTE IN INPUT BUFFER = 0 +0385 dc73 8e 00 f3 LDX #LINBUF RESET INPUT BUFFER POINTER +0386 dc76 35 81 PULS CC,PC RESTORE CARRY FLAG +0387 +0388 * INSERT A CHARACTER INTO THE BASIC LINE INPUT BUFFER +0389 dc78 81 20 LA3D9 CMPA #$20 IS IT CONTROL CHAR? +0390 dc7a 25 c9 BLO LA39A BRANCH IF CONTROL CHARACTER +0391 dc7c 81 7b CMPA #'z+1 * +0392 dc7e 24 c5 BCC LA39A * IGNORE IF > LOWER CASE Z +0393 dc80 c1 fa CMPB #LBUFMX HAVE 250 OR MORE CHARACTERS BEEN ENTERED? +0394 dc82 24 c1 BCC LA39A YES, IGNORE ANY MORE +0395 dc84 a7 80 STA ,X+ PUT IT IN INPUT BUFFER +0396 dc86 5c INCB INCREMENT CHARACTER COUNTER +0397 dc87 bd db 14 LA3E8 JSR PUTCHR ECHO IT TO SCREEN +0398 dc8a 20 b9 BRA LA39A GO SET SOME MORE +0399 +0400 +0401 * EXEC +0402 dc8c 27 05 EXEC BEQ LA545 BRANCH IF NO ARGUMENT +0403 dc8e bd e9 c1 JSR LB73D EVALUATE ARGUMENT - ARGUMENT RETURNED IN X +0404 dc91 9f 7a STX EXECJP STORE X TO EXEC JUMP ADDRESS +0405 dc93 6e 9f 00 7a LA545 JMP [EXECJP] GO DO IT +0406 +0407 * BREAK CHECK +0408 dc97 7e e0 a3 LA549 JMP LADEB GO DO BREAK KEY CHECK +0409 +0410 * INKEY$ +0411 dc9a 96 73 INKEY LDA IKEYIM WAS A KEY DOWN IN THE BREAK CHECK? +0412 dc9c 26 03 BNE LA56B YES +0413 dc9e bd db 05 JSR KEYIN GO GET A KEY +0414 dca1 0f 73 LA56B CLR IKEYIM CLEAR INKEY RAM IMAGE +0415 dca3 97 53 STA FPA0+3 STORE THE KEY IN FPA0 +0416 dca5 10 26 0c 6a LBNE LB68F CONVERT FPA0+3 TO A STRING +0417 dca9 97 56 STA STRDES SET LENGTH OF STRING = 0 IF NO KEY DOWN +0418 dcab 7e e9 1f JMP LB69B PUT A NULL STRING ONTO THE STRING STACK +0419 +0420 * MOVE ACCB BYTES FROM (X) TO (U) +0421 dcae a6 80 LA59A LDA ,X+ GET BYTE FROM X +0422 dcb0 a7 c0 STA ,U+ STORE IT AT U +0423 dcb2 5a DECB MOVED ALL BYTES? +0424 dcb3 26 f9 BNE LA59A NO +0425 dcb5 39 LA5A1 RTS +0426 +0427 dcb6 39 LA5C4 RTS +0428 +0429 ** THIS ROUTINE WILL SCAN OFF THE FILE NAME FROM A BASIC LINE +0430 ** AND RETURN A SYNTAX ERROR IF THERE ARE ANY CHARACTERS +0431 ** FOLLOWING THE END OF THE NAME +0432 dcb7 9d 82 LA5C7 JSR GETCCH GET CURRENT INPUT CHAR FROM BASIC LINE +0433 dcb9 27 fb LA5C9 BEQ LA5C4 RETURN IF END OF LINE +0434 dcbb 7e e5 00 JMP LB277 SYNTAX ERROR IF ANY MORE CHARACTERS +0435 * IRQ SERVICE +0436 BIRQSV +0437 dcbe 3b LA9C5 RTI RETURN FROM INTERRUPT +0438 +0439 * SET CARRY IF NUMERIC - RETURN WITH +0440 * ZERO FLAG SET IF ACCA = 0 OR 3A(:) - END +0441 * OF BASIC LINE OR SUB LINE +0442 dcbf 81 3a BROMHK CMPA #'9+1 IS THIS CHARACTER >=(ASCII 9)+1? +0443 dcc1 24 0a BHS LAA28 BRANCH IF > 9; Z SET IF = COLON +0444 dcc3 81 20 CMPA #SPACE SPACE? +0445 dcc5 26 02 BNE LAA24 NO - SET CARRY IF NUMERIC +0446 dcc7 0e 7c JMP GETNCH IF SPACE, GET NECT CHAR (IGNORE SPACES) +0447 dcc9 80 30 LAA24 SUBA #'0 * SET CARRY IF +0448 dccb 80 d0 SUBA #-'0 * CHARACTER > ASCII 0 +0449 dccd 39 LAA28 RTS +0450 +0451 * DISPATCH TABLE FOR SECONDARY FUNCTIONS +0452 * TOKENS ARE PRECEEDED BY $FF +0453 * FIRST SET ALWAYS HAS ONE PARAMETER +0454 FUNC_TAB +0455 dcce ee c3 LAA29 FDB SGN SGN +0456 dcd0 ef 37 FDB INT INT +0457 dcd2 ee dc FDB ABS ABS +0458 dcd4 00 ad FDB USRJMP USR +0459 0083 TOK_USR EQU *-FUNC_TAB/2+$7F +0460 ff83 TOK_FF_USR EQU *-FUNC_TAB/2+$FF7F +0461 dcd6 f1 68 FDB RND RND +0462 dcd8 f1 bd FDB SIN SIN +0463 dcda e9 d4 FDB PEEK PEEK +0464 dcdc e9 05 FDB LEN LEN +0465 dcde e7 81 FDB STR STR$ +0466 dce0 e9 9a FDB VAL VAL +0467 dce2 e9 24 FDB ASC ASC +0468 dce4 e9 10 FDB CHR CHR$ +0469 dce6 f2 6d FDB ATN ATN +0470 dce8 f2 35 FDB COS COS +0471 dcea f2 3e FDB TAN TAN +0472 dcec f3 af FDB EXP EXP +0473 dcee f3 e1 FDB FIX FIX +0474 dcf0 f3 03 FDB LOG LOG +0475 dcf2 f5 69 FDB POS POS +0476 dcf4 f3 3d FDB SQR SQR +0477 dcf6 fa 3b FDB HEXDOL HEX$ +0478 * LEFT, RIGHT AND MID ARE TREATED SEPARATELY +0479 dcf8 e9 2f FDB LEFT LEFT$ +0480 0095 TOK_LEFT EQU *-FUNC_TAB/2+$7F +0481 dcfa e9 4c FDB RIGHT RIGHT$ +0482 dcfc e9 53 FDB MID MID$ +0483 0097 TOK_MID EQU *-FUNC_TAB/2+$7F +0484 * REMAINING FUNCTIONS +0485 dcfe dc 9a FDB INKEY INKEY$ +0486 0098 TOK_INKEY EQU *-FUNC_TAB/2+$7F +0487 dd00 e7 72 FDB MEM MEM +0488 dd02 f5 71 FDB VARPT VARPTR +0489 dd04 f6 31 FDB INSTR INSTR +0490 dd06 f6 01 FDB STRING STRING$ +0491 001d NUM_SEC_FNS EQU *-FUNC_TAB/2 +0492 +0493 * THIS TABLE CONTAINS PRECEDENCES AND DISPATCH ADDRESSES FOR ARITHMETIC +0494 * AND LOGICAL OPERATORS - THE NEGATION OPERATORS DO NOT ACT ON TWO OPERANDS +0495 * S0 THEY ARE NOT LISTED IN THIS TABLE. THEY ARE TREATED SEPARATELY IN THE +0496 * EXPRESSION EVALUATION ROUTINE. THEY ARE: +0497 * UNARY NEGATION (-), PRECEDENCE &7D AND LOGICAL NEGATION (NOT), PRECEDENCE $5A +0498 * THE RELATIONAL OPERATORS < > = ARE ALSO NOT LISTED, PRECEDENCE $64. +0499 * A PRECEDENCE VALUE OF ZERO INDICATES END OF EXPRESSION OR PARENTHESES +0500 * +0501 dd08 79 LAA51 FCB $79 +0502 dd09 ec 0e FDB LB9C5 + +0503 dd0b 79 FCB $79 +0504 dd0c ec 05 FDB LB9BC - +0505 dd0e 7b FCB $7B +0506 dd0f ed 15 FDB LBACC * +0507 dd11 7b FCB $7B +0508 dd12 ed da FDB LBB91 / +0509 dd14 7f FCB $7F +0510 dd15 f3 46 FDB L8489 EXPONENTIATION +0511 dd17 50 FCB $50 +0512 dd18 e5 59 FDB LB2D5 AND +0513 dd1a 46 FCB $46 +0514 dd1b e5 58 FDB LB2D4 OR +0515 +0516 * THIS IS THE RESERVED WORD TABLE +0517 * FIRST PART OF THE TABLE CONTAINS EXECUTABLE COMMANDS +0518 dd1d 46 4f LAA66 FCC "FO" 80 +0519 dd1f d2 FCB $80+'R' +0520 dd20 47 FCC "G" 81 +0521 dd21 cf FCB $80+'O' +0522 0081 TOK_GO EQU $81 +0523 dd22 52 45 FCC "RE" 82 +0524 dd24 cd FCB $80+'M' +0525 dd25 a7 FCB ''+$80 83 +0526 dd26 45 4c 53 FCC "ELS" 84 +0527 dd29 c5 FCB $80+'E' +0528 dd2a 49 FCC "I" 85 +0529 dd2b c6 FCB $80+'F' +0530 dd2c 44 41 54 FCC "DAT" 86 +0531 dd2f c1 FCB $80+'A' +0532 dd30 50 52 49 4e FCC "PRIN" 87 +0533 dd34 d4 FCB $80+'T' +0534 dd35 4f FCC "O" 88 +0535 dd36 ce FCB $80+'N' +0536 dd37 49 4e 50 55 FCC "INPU" 89 +0537 dd3b d4 FCB $80+'T' +0538 dd3c 45 4e FCC "EN" 8A +0539 dd3e c4 FCB $80+'D' +0540 dd3f 4e 45 58 FCC "NEX" 8B +0541 dd42 d4 FCB $80+'T' +0542 dd43 44 49 FCC "DI" 8C +0543 dd45 cd FCB $80+'M' +0544 dd46 52 45 41 FCC "REA" 8D +0545 dd49 c4 FCB $80+'D' +0546 dd4a 52 55 FCC "RU" 8E +0547 dd4c ce FCB $80+'N' +0548 dd4d 52 45 53 54 4f 52 FCC "RESTOR" 8F +0549 dd53 c5 FCB $80+'E' +0550 dd54 52 45 54 55 52 FCC "RETUR" 90 +0551 dd59 ce FCB $80+'N' +0552 dd5a 53 54 4f FCC "STO" 91 +0553 dd5d d0 FCB $80+'P' +0554 dd5e 50 4f 4b FCC "POK" 92 +0555 dd61 c5 FCB $80+'E' +0556 dd62 43 4f 4e FCC "CON" 93 +0557 dd65 d4 FCB $80+'T' +0558 dd66 4c 49 53 FCC "LIS" 94 +0559 dd69 d4 FCB $80+'T' +0560 dd6a 43 4c 45 41 FCC "CLEA" 95 +0561 dd6e d2 FCB $80+'R' +0562 dd6f 4e 45 FCC "NE" 96 +0563 dd71 d7 FCB $80+'W' +0564 dd72 45 58 45 FCC "EXE" 97 +0565 dd75 c3 FCB $80+'C' +0566 dd76 54 52 4f FCC "TRO" 98 +0567 dd79 ce FCB $80+'N' +0568 dd7a 54 52 4f 46 FCC "TROF" 99 +0569 dd7e c6 FCB $80+'F' +0570 dd7f 44 45 FCC "DE" 9A +0571 dd81 cc FCB $80+'L' +0572 dd82 44 45 FCC "DE" 9B +0573 dd84 c6 FCB $80+'F' +0574 dd85 4c 49 4e FCC "LIN" 9C +0575 dd88 c5 FCB $80+'E' +0576 dd89 52 45 4e 55 FCC "RENU" 9D +0577 dd8d cd FCB $80+'M' +0578 dd8e 45 44 49 FCC "EDI" 9E +0579 dd91 d4 FCB $80+'T' +0580 * END OF EXECUTABLE COMMANDS. THE REMAINDER OF THE TABLE ARE NON-EXECUTABLE TOKENS +0581 dd92 54 41 42 FCC "TAB" 9F +0582 dd95 a8 FCB $80+'(' +0583 009f TOK_TAB EQU $9F +0584 dd96 54 FCC "T" A0 +0585 dd97 cf FCB $80+'O' +0586 00a0 TOK_TO EQU $A0 +0587 dd98 53 55 FCC "SU" A1 +0588 dd9a c2 FCB $80+'B' +0589 00a1 TOK_SUB EQU $A1 +0590 dd9b 54 48 45 FCC "THE" A2 +0591 dd9e ce FCB $80+'N' +0592 00a2 TOK_THEN EQU $A2 +0593 dd9f 4e 4f FCC "NO" A3 +0594 dda1 d4 FCB $80+'T' +0595 00a3 TOK_NOT EQU $A3 +0596 dda2 53 54 45 FCC "STE" A4 +0597 dda5 d0 FCB $80+'P' +0598 00a4 TOK_STEP EQU $A4 +0599 dda6 4f 46 FCC "OF" A5 +0600 dda8 c6 FCB $80+'F' +0601 dda9 ab FCB '++$80 A6 +0602 00a6 TOK_PLUS EQU $A6 +0603 ddaa ad FCB '-+$80 A7 +0604 00a7 TOK_MINUS EQU $A7 +0605 ddab aa FCB '*+$80 A8 +0606 ddac af FCB '/+$80 A9 +0607 ddad de FCB '^+$80 AA +0608 ddae 41 4e FCC "AN" AB +0609 ddb0 c4 FCB $80+'D' +0610 ddb1 4f FCC "O" AC +0611 ddb2 d2 FCB $80+'R' +0612 ddb3 be FCB '>+$80 AD +0613 00ad TOK_GREATER EQU $AD +0614 ddb4 bd FCB '=+$80 AE +0615 00ae TOK_EQUALS EQU $AE +0616 ddb5 bc FCB '<+$80 AF +0617 ddb6 46 FCC "F" B0 +0618 ddb7 ce FCB $80+'N' +0619 00b0 TOK_FN EQU $B0 +0620 ddb8 55 53 49 4e FCC "USIN" B1 +0621 ddbc c7 FCB $80+'G' +0622 00b1 TOK_USING EQU $B1 +0623 * +0624 +0625 * FIRST SET ALWAYS HAS ONE PARAMETER +0626 ddbd 53 47 LAB1A FCC "SG" 80 +0627 ddbf ce FCB $80+'N' +0628 ddc0 49 4e FCC "IN" 81 +0629 ddc2 d4 FCB $80+'T' +0630 ddc3 41 42 FCC "AB" 82 +0631 ddc5 d3 FCB $80+'S' +0632 ddc6 55 53 FCC "US" 83 +0633 ddc8 d2 FCB $80+'R' +0634 ddc9 52 4e FCC "RN" 84 +0635 ddcb c4 FCB $80+'D' +0636 ddcc 53 49 FCC "SI" 85 +0637 ddce ce FCB $80+'N' +0638 ddcf 50 45 45 FCC "PEE" 86 +0639 ddd2 cb FCB $80+'K' +0640 ddd3 4c 45 FCC "LE" 87 +0641 ddd5 ce FCB $80+'N' +0642 ddd6 53 54 52 FCC "STR" 88 +0643 ddd9 a4 FCB $80+'$' +0644 ddda 56 41 FCC "VA" 89 +0645 dddc cc FCB $80+'L' +0646 dddd 41 53 FCC "AS" 8A +0647 dddf c3 FCB $80+'C' +0648 dde0 43 48 52 FCC "CHR" 8B +0649 dde3 a4 FCB $80+'$' +0650 dde4 41 54 FCC "AT" 8C +0651 dde6 ce FCB $80+'N' +0652 dde7 43 4f FCC "CO" 8D +0653 dde9 d3 FCB $80+'S' +0654 ddea 54 41 FCC "TA" 8E +0655 ddec ce FCB $80+'N' +0656 dded 45 58 FCC "EX" 8F +0657 ddef d0 FCB $80+'P' +0658 ddf0 46 49 FCC "FI" 90 +0659 ddf2 d8 FCB $80+'X' +0660 ddf3 4c 4f FCC "LO" 91 +0661 ddf5 c7 FCB $80+'G' +0662 ddf6 50 4f FCC "PO" 92 +0663 ddf8 d3 FCB $80+'S' +0664 ddf9 53 51 FCC "SQ" 93 +0665 ddfb d2 FCB $80+'R' +0666 ddfc 48 45 58 FCC "HEX" 94 +0667 ddff a4 FCB $80+'$' +0668 * LEFT, RIGHT AND MID ARE TREATED SEPARATELY +0669 de00 4c 45 46 54 FCC "LEFT" 95 +0670 de04 a4 FCB $80+'$' +0671 de05 52 49 47 48 54 FCC "RIGHT" 96 +0672 de0a a4 FCB $80+'$' +0673 de0b 4d 49 44 FCC "MID" 97 +0674 de0e a4 FCB $80+'$' +0675 * REMAINING FUNCTIONS +0676 de0f 49 4e 4b 45 59 FCC "INKEY" 98 +0677 de14 a4 FCB $80+'$' +0678 de15 4d 45 FCC "ME" 99 +0679 de17 cd FCB $80+'M' +0680 de18 56 41 52 50 54 FCC "VARPT" 9A +0681 de1d d2 FCB $80+'R' +0682 de1e 49 4e 53 54 FCC "INST" 9B +0683 de22 d2 FCB $80+'R' +0684 de23 53 54 52 49 4e 47 FCC "STRING" 9C +0685 de29 a4 FCB $80+'$' +0686 +0687 * +0688 * DISPATCH TABLE FOR COMMANDS TOKEN # +0689 CMD_TAB +0690 de2a df e8 LAB67 FDB FOR 80 +0691 de2c e1 33 FDB GO 81 +0692 de2e e1 90 FDB REM 82 +0693 0082 TOK_REM EQU *-CMD_TAB/2+$7F +0694 de30 e1 90 FDB REM 83 (') +0695 0083 TOK_SNGL_Q EQU *-CMD_TAB/2+$7F +0696 de32 e1 90 FDB REM 84 (ELSE) +0697 0084 TOK_ELSE EQU *-CMD_TAB/2+$7F +0698 de34 e1 c1 FDB IF 85 +0699 0085 TOK_IF EQU *-CMD_TAB/2+$7F +0700 de36 e1 8d FDB DATA 86 +0701 0086 TOK_DATA EQU *-CMD_TAB/2+$7F +0702 de38 eb 6a FDB PRINT 87 +0703 0087 TOK_PRINT EQU *-CMD_TAB/2+$7F +0704 de3a e1 ef FDB ON 88 +0705 de3c e2 9c FDB INPUT 89 +0706 0089 TOK_INPUT EQU *-CMD_TAB/2+$7F +0707 de3e e0 ba FDB END 8A +0708 de40 e3 81 FDB NEXT 8B +0709 de42 e5 d2 FDB DIM 8C +0710 de44 e2 d6 FDB READ 8D +0711 de46 e1 28 FDB RUN 8E +0712 de48 e0 9c FDB RESTOR 8F +0713 de4a e1 6d FDB RETURN 90 +0714 de4c e0 be FDB STOP 91 +0715 de4e e9 db FDB POKE 92 +0716 de50 e0 e3 FDB CONT 93 +0717 de52 e9 e2 FDB LIST 94 +0718 de54 e0 f4 FDB CLEAR 95 +0719 de56 df b8 FDB NEW 96 +0720 de58 dc 8c FDB EXEC 97 +0721 de5a f5 64 FDB TRON 98 +0722 de5c f5 65 FDB TROFF 99 +0723 de5e f7 e0 FDB DEL 9A +0724 de60 f7 24 FDB DEF 9B +0725 de62 fe ce FDB LINE 9C +0726 de64 f8 6a FDB RENUM 9D +0727 de66 f3 f0 FDB EDIT 9E +0728 009e TOK_HIGH_EXEC EQU *-CMD_TAB/2+$7F +0729 +0730 * ERROR MESSAGES AND THEIR NUMBERS AS USED INTERNALLY +0731 de68 4e 46 LABAF FCC "NF" 0 NEXT WITHOUT FOR +0732 de6a 53 4e FCC "SN" 1 SYNTAX ERROR +0733 de6c 52 47 FCC "RG" 2 RETURN WITHOUT GOSUB +0734 de6e 4f 44 FCC "OD" 3 OUT OF DATA +0735 de70 46 43 FCC "FC" 4 ILLEGAL FUNCTION CALL +0736 de72 4f 56 FCC "OV" 5 OVERFLOW +0737 de74 4f 4d FCC "OM" 6 OUT OF MEMORY +0738 de76 55 4c FCC "UL" 7 UNDEFINED LINE NUMBER +0739 de78 42 53 FCC "BS" 8 BAD SUBSCRIPT +0740 de7a 44 44 FCC "DD" 9 REDIMENSIONED ARRAY +0741 de7c 2f 30 FCC "/0" 10 DIVISION BY ZERO +0742 de7e 49 44 FCC "ID" 11 ILLEGAL DIRECT STATEMENT +0743 de80 54 4d FCC "TM" 12 TYPE MISMATCH +0744 de82 4f 53 FCC "OS" 13 OUT OF STRING SPACE +0745 de84 4c 53 FCC "LS" 14 STRING TOO LONG +0746 de86 53 54 FCC "ST" 15 STRING FORMULA TOO COMPLEX +0747 de88 43 4e FCC "CN" 16 CAN'T CONTINUE +0748 de8a 46 44 FCC "FD" 17 BAD FILE DATA +0749 de8c 41 4f FCC "AO" 18 FILE ALREADY OPEN +0750 de8e 44 4e FCC "DN" 19 DEVICE NUMBER ERROR +0751 de90 49 4f FCC "IO" 20 I/O ERROR +0752 de92 46 4d FCC "FM" 21 BAD FILE MODE +0753 de94 4e 4f FCC "NO" 22 FILE NOT OPEN +0754 de96 49 45 FCC "IE" 23 INPUT PAST END OF FILE +0755 de98 44 53 FCC "DS" 24 DIRECT STATEMENT IN FILE +0756 * ADDITIONAL ERROR MESSAGES ADDED BY EXTENDED BASIC +0757 de9a 55 46 L890B FCC "UF" 25 UNDEFINED FUNCTION (FN) CALL +0758 de9c 4e 45 L890D FCC "NE" 26 FILE NOT FOUND +0759 +0760 de9e 20 45 52 52 4f 52 LABE1 FCC " ERROR" +0761 dea4 00 FCB $00 +0762 dea5 20 49 4e 20 LABE8 FCC " IN " +0763 dea9 00 FCB $00 +0764 deaa 0d LABED FCB CR +0765 deab 4f 4b LABEE FCC "OK" +0766 dead 0d 00 FCB CR,$00 +0767 deaf 0d LABF2 FCB CR +0768 deb0 42 52 45 41 4b FCC "BREAK" +0769 deb5 00 FCB $00 +0770 +0771 * SEARCH THE STACK FOR ‘GOSUB/RETURN’ OR ‘FOR/NEXT’ DATA. +0772 * THE ‘FOR/NEXT’ INDEX VARIABLE DESCRIPTOR ADDRESS BEING +0773 * SOUGHT IS STORED IN VARDES. EACH BLOCK OF FOR/NEXT DATA IS 18 +0774 * BYTES WITH A $80 LEADER BYTE AND THE GOSUB/RETURN DATA IS 5 BYTES +0775 * WITH AN $A6 LEADER BYTE. THE FIRST NON "FOR/NEXT" DATA +0776 * IS CONSIDERED ‘GOSUB/RETURN’ +0777 deb6 30 64 LABF9 LEAX 4,S POINT X TO 3RD ADDRESS ON STACK - IGNORE THE +0778 * FIRST TWO RETURN ADDRESSES ON THE STACK +0779 deb8 c6 12 LABFB LDB #18 18 BYTES SAVED ON STACK FOR EACH ‘FOR’ LOOP +0780 deba 9f 0f STX TEMPTR SAVE POINTER +0781 debc a6 84 LDA ,X GET 1ST BYTE +0782 debe 80 80 SUBA #$80 * CHECK FOR TYPE OF STACK JUMP FOUND +0783 dec0 26 15 BNE LAC1A * BRANCH IF NOT ‘FOR/NEXT’ +0784 dec2 ae 01 LDX 1,X = GET INDEX VARIABLE DESCRIPTOR +0785 dec4 9f 11 STX TMPTR1 = POINTER AND SAVE IT IN TMPTR1 +0786 dec6 9e 3b LDX VARDES GET INDEX VARIABLE BEING SEARCHED FOR +0787 dec8 27 09 BEQ LAC16 BRANCH IF DEFAULT INDEX VARIABLE - USE THE +0788 * FIRST ‘FOR/NEXT’ DATA FOUND ON STACK +0789 * IF NO INDEX VARIABLE AFTER ‘NEXT’ +0790 deca 9c 11 CMPX TMPTR1 DOES THE STACK INDEX MATCH THE ONE +0791 * BEING SEARCHED FOR? +0792 decc 27 09 BEQ LAC1A YES +0793 dece 9e 0f LDX TEMPTR * RESTORE INITIAL POINTER, ADD +0794 ded0 3a ABX * 18 TO IT AND LOOK FOR +0795 ded1 20 e5 BRA LABFB * NEXT BLOCK OF DATA +0796 ded3 9e 11 LAC16 LDX TMPTR1 = GET 1ST INDEX VARIABLE FOUND AND +0797 ded5 9f 3b STX VARDES = SAVE AS ‘NEXT’ INDEX +0798 ded7 9e 0f LAC1A LDX TEMPTR POINT X TO START OF ‘FOR/NEXT’ DATA +0799 ded9 4d TSTA SET ZERO FLAG IF ‘FOR/NEXT’ DATA +0800 deda 39 RTS +0801 * CHECK FOR MEMORY SPACE FOR NEW TOP OF +0802 * ARRAYS AND MOVE ARRAYS TO NEW LOCATION +0803 dedb 8d 17 LAC1E BSR LAC37 ACCD = NEW BOTTOM OF FREE RAM - IS THERE +0804 * ROOM FOR THE STACK? +0805 * MOVE BYTES FROM V43(X) TO V41(U) UNTIL (X) = V47 AND +0806 * SAVE FINAL VALUE OF U IN V45 +0807 dedd de 41 LAC20 LDU V41 POINT U TO DESTINATION ADDRESS (V41) +0808 dedf 33 41 LEAU 1,U ADD ONE TO U - COMPENSATE FOR FIRST PSHU +0809 dee1 9e 43 LDX V43 POINT X TO SOURCE ADDRESS (V43) +0810 dee3 30 01 LEAX 1,X ADD ONE - COMPENSATE FOR FIRST LDA ,X +0811 dee5 a6 82 LAC28 LDA ,-X GRAB A BYTE FROM SOURCE +0812 dee7 36 02 PSHU A MOVE IT TO DESTINATION +0813 dee9 9c 47 CMPX V47 DONE? +0814 deeb 26 f8 BNE LAC28 NO - KEEP MOVING BYTES +0815 deed df 45 STU V45 SAVE FINAL DESTINATION ADDRESS +0816 deef 39 LAC32 RTS +0817 * CHECK TO SEE IF THERE IS ROOM TO STORE 2*ACCB +0818 * BYTES IN FREE RAM - OM ERROR IF NOT +0819 def0 4f LAC33 CLRA * ACCD CONTAINS NUMBER OF EXTRA +0820 def1 58 ASLB * BYTES TO PUT ON STACK +0821 def2 d3 1f ADDD ARYEND END OF PROGRAM AND VARIABLES +0822 def4 c3 00 3a LAC37 ADDD #STKBUF ADD STACK BUFFER - ROOM FOR STACK? +0823 def7 25 08 BCS LAC44 BRANCH IF GREATER THAN $FFFF +0824 def9 10 df 17 STS BOTSTK CURRENT NEW BOTTOM OF STACK STACK POINTER +0825 defc 10 93 17 CMPD BOTSTK ARE WE GOING TO BE BELOW STACK? +0826 deff 25 ee BCS LAC32 YES - NO ERROR +0827 df01 c6 0c LAC44 LDB #6*2 OUT OF MEMORY ERROR +0828 +0829 * ERROR SERVICING ROUTINE +0830 df03 bd df d4 LAC46 JSR LAD33 RESET STACK, STRING STACK, CONTINUE POINTER +0831 df06 bd eb a9 JSR LB95C SEND A CR TO SCREEN +0832 df09 bd eb f8 JSR LB9AF SEND A ‘?‘ TO SCREEN +0833 df0c 8e de 68 LDX #LABAF POINT TO ERROR TABLE +0834 df0f 3a LAC60 ABX ADD MESSAGE NUMBER OFFSET +0835 df10 8d 31 BSR LACA0 * GET TWO CHARACTERS FROM X AND +0836 df12 8d 2f BSR LACA0 * SEND TO CONSOLE OUT (SCREEN) +0837 df14 8e de 9d LDX #LABE1-1 POINT TO "ERROR" MESSAGE +0838 df17 bd eb e5 LAC68 JSR LB99C PRINT MESSAGE POINTED TO BY X +0839 df1a 96 68 LDA CURLIN GET CURRENT LINE NUMBER (CURL IN) +0840 df1c 4c INCA TEST FOR DIRECT MODE +0841 df1d 27 03 BEQ LAC73 BRANCH IF DIRECT MODE +0842 df1f bd f0 0e JSR LBDC5 PRINT ‘IN ****‘ +0843 +0844 * THIS IS THE MAIN LOOP OF BASIC WHEN IN DIRECT MODE +0845 df22 bd eb a9 LAC73 JSR LB95C MOVE CURSOR TO START OF LINE +0846 df25 8e de aa LDX #LABED POINT X TO ‘OK’, CR MESSAGE +0847 df28 bd eb e5 JSR LB99C PRINT ‘OK’, CR +0848 df2b bd dc 3e LAC7C JSR LA390 GO GET AN INPUT LINE +0849 df2e ce ff ff LDU #$FFFF THE LINE NUMBER FOR DIRECT MODE IS $FFFF +0850 df31 df 68 STU CURLIN SAVE IT IN CURLIN +0851 df33 25 f6 BCS LAC7C BRANCH IF LINE INPUT TERMINATED BY BREAK +0852 df35 9f 83 STX CHARAD SAVE (X) AS CURRENT INPUT POINTER - THIS WILL +0853 * ENABLE THE ‘LIVE KEYBOARD’ (DIRECT) MODE. THE +0854 * LINE JUST ENTERED WILL BE INTERPRETED +0855 df37 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC +0856 df39 27 f0 BEQ LAC7C NO LINE INPUT - GET ANOTHER LINE +0857 df3b 25 0b BCS LACA5 BRANCH IF NUMER1C - THERE WAS A LINE NUMBER BEFORE +0858 * THE STATEMENT ENTERED, SO THIS STATEMENT +0859 * WILL BE MERGED INTO THE BASIC PROGRAM +0860 df3d bd ea 97 JSR LB821 GO CRUNCH LINE +0861 df40 7e e0 71 JMP LADC0 GO EXECUTE THE STATEMENT (LIVE KEYBOARD) +0862 * +0863 df43 a6 80 LACA0 LDA ,X+ GET A CHARACTER +0864 df45 7e eb fa JMP LB9B1 SEND TO CONSOLE OUT +0865 * TAKE A LINE FROM THE LINE INPUT BUFFER +0866 * AND INSERT IT INTO THE BASIC PROGRAM +0867 df48 bd e2 14 LACA5 JSR LAF67 CONVERT LINE NUMBER TO BINARY +0868 df4b 9e 2b LACA8 LDX BINVAL GET CONVERTED LINE NUMBER +0869 df4d 9f f1 STX LINHDR STORE IT IN LINE INPUT HEADER +0870 df4f bd ea 97 JSR LB821 GO CRUNCH THE LINE +0871 df52 d7 03 STB TMPLOC SAVE LINE LENGTH +0872 df54 8d 4c BSR LAD01 FIND OUT WHERE TO INSERT LINE +0873 df56 25 12 BCS LACC8 BRANCH IF LINE NUMBER DOES NOT ALREADY EXIST +0874 df58 dc 47 LDD V47 GET ABSOLUTE ADDRESS OF LINE NUMBER +0875 df5a a3 84 SUBD ,X SUBTRACT ADDRESS OF NEXT LINE NUMBER +0876 df5c d3 1b ADDD VARTAB * ADD TO CURRENT END OF PROGRAM - THIS WILL REMOVE +0877 df5e dd 1b STD VARTAB * THE LENGTH OF THIS LINE NUMBER FROM THE PROGRAM +0878 df60 ee 84 LDU ,X POINT U TO ADDRESS OF NEXT LINE NUMBER +0879 * DELETE OLD LINE FROM BASIC PROGRAM +0880 df62 37 02 LACC0 PULU A GET A BYTE FROM WHAT’S LEFT OF PROGRAM +0881 df64 a7 80 STA ,X+ MOVE IT DOWN +0882 df66 9c 1b CMPX VARTAB COMPARE TO END OF BASIC PROGRAM +0883 df68 26 f8 BNE LACC0 BRANCH IF NOT AT END +0884 df6a 96 f3 LACC8 LDA LINBUF * CHECK TO SEE IF THERE IS A LINE IN +0885 df6c 27 1c BEQ LACE9 * THE BUFFER AND BRANCH IF NONE +0886 df6e dc 1b LDD VARTAB = SAVE CURRENT END OF +0887 df70 dd 43 STD V43 = PROGRAM IN V43 +0888 df72 db 03 ADDB TMPLOC * ADD LENGTH OF CRUNCHED LINE, +0889 df74 89 00 ADCA #0 * PROPOGATE CARRY AND SAVE NEW END +0890 df76 dd 41 STD V41 * OF PROGRAM IN V41 +0891 df78 bd de db JSR LAC1E = MAKE SURE THERE’S ENOUGH RAM FOR THIS +0892 * = LINE & MAKE A HOLE IN BASIC FOR NEW LINE +0893 df7b ce 00 ef LDU #LINHDR-2 POINT U TO LINE TO BE INSERTED +0894 df7e 37 02 LACDD PULU A GET A BYTE FROM NEW LINE +0895 df80 a7 80 STA ,X+ INSERT IT IN PROGRAM +0896 df82 9c 45 CMPX V45 * COMPARE TO ADDRESS OF END OF INSERTED +0897 df84 26 f8 BNE LACDD * LINE AND BRANCH IF NOT DONE +0898 df86 9e 41 LDX V41 = GET AND SAVE +0899 df88 9f 1b STX VARTAB = END OF PROGRAM +0900 df8a 8d 36 LACE9 BSR LAD21 RESET INPUT POINTER, CLEAR VARIABLES, INITIALIZE +0901 df8c 8d 02 BSR LACEF ADJUST START OF NEXT LINE ADDRESSES +0902 df8e 20 9b BRA LAC7C REENTER BASIC’S INPUT LOOP +0903 * COMPUTE THE START OF NEXT LINE ADDRESSES FOR THE BASIC PROGRAM +0904 df90 9e 19 LACEF LDX TXTTAB POINT X TO START OF PROGRAM +0905 df92 ec 84 LACF1 LDD ,X GET ADDRESS OF NEXT LINE +0906 df94 27 21 BEQ LAD16 RETURN IF END OF PROGRAM +0907 df96 33 04 LEAU 4,X POINT U TO START OF BASIC TEXT IN LINE +0908 df98 a6 c0 LACF7 LDA ,U+ * SKIP THROUGH THE LINE UNTIL A +0909 df9a 26 fc BNE LACF7 * ZERO (END OF LINE) IS FOUND +0910 df9c ef 84 STU ,X SAVE THE NEW START OF NEXT LINE ADDRESS +0911 df9e ae 84 LDX ,X POINT X TO START OF NEXT LINE +0912 dfa0 20 f0 BRA LACF1 KEEP GOING +0913 * +0914 * FIND A LINE NUMBER IN THE BASIC PROGRAM +0915 * RETURN WITH CARRY SET IF NO MATCH FOUND +0916 dfa2 dc 2b LAD01 LDD BINVAL GET THE LINE NUMBER TO FIND +0917 dfa4 9e 19 LDX TXTTAB BEGINNING OF PROGRAM +0918 dfa6 ee 84 LAD05 LDU ,X GET ADDRESS OF NEXT LINE NUMBER +0919 dfa8 27 09 BEQ LAD12 BRANCH IF END OF PROG +0920 dfaa 10 a3 02 CMPD 2,X IS IT A MATCH? +0921 dfad 23 06 BLS LAD14 CARRY SET IF LOWER; CARRY CLEAR IF MATCH +0922 dfaf ae 84 LDX ,X X = ADDRESS OF NEXT LINE +0923 dfb1 20 f3 BRA LAD05 KEEP LOOPING FOR LINE NUMBER +0924 dfb3 1a 01 LAD12 ORCC #1 SET CARRY FLAG +0925 dfb5 9f 47 LAD14 STX V47 SAVE MATCH LINE NUMBER OR NUMBER OF LINE JUST AFTER +0926 * WHERE IT SHOULD HAVE BEEN +0927 dfb7 39 LAD16 RTS +0928 +0929 * NEW +0930 dfb8 26 fb NEW BNE LAD14 BRANCH IF ARGUMENT GIVEN +0931 dfba 9e 19 LAD19 LDX TXTTAB GET START OF BASIC +0932 dfbc 6f 80 CLR ,X+ * PUT 2 ZERO BYTES THERE - ERASE +0933 dfbe 6f 80 CLR ,X+ * THE BASIC PROGRAM +0934 dfc0 9f 1b STX VARTAB AND THE NEXT ADDRESS IS NOW THE END OF PROGRAM +0935 dfc2 9e 19 LAD21 LDX TXTTAB GET START OF BASIC +0936 dfc4 bd e1 68 JSR LAEBB PUT INPUT POINTER ONE BEFORE START OF BASIC +0937 * ERASE ALL VARIABLES +0938 dfc7 9e 27 LAD26 LDX MEMSIZ * RESET START OF STRING VARIABLES +0939 dfc9 9f 23 STX STRTAB * TO TOP OF STRING SPACE +0940 dfcb bd e0 9c JSR RESTOR RESET ‘DATA’ POINTER TO START OF BASIC +0941 dfce 9e 1b LDX VARTAB * GET START OF VARIABLES AND USE IT +0942 dfd0 9f 1d STX ARYTAB * TO RESET START OF ARRAYS +0943 dfd2 9f 1f STX ARYEND RESET END OF ARRAYS +0944 dfd4 8e 00 c9 LAD33 LDX #STRSTK * RESET STRING STACK POINTER TO +0945 dfd7 9f 0b STX TEMPPT * BOTTOM OF STRING STACK +0946 dfd9 ae e4 LDX ,S GET RETURN ADDRESS OFF STACK +0947 dfdb 10 de 21 LDS FRETOP RESTORE STACK POINTER +0948 dfde 6f e2 CLR ,-S PUT A ZERO BYTE ON STACK - TO CLEAR ANY RETURN OF +0949 * FOR/NEXT DATA FROM THE STACK +0950 dfe0 0f 2d CLR OLDPTR RESET ‘CONT’ ADDRESS SO YOU +0951 dfe2 0f 2e CLR OLDPTR+1 ‘CAN’T CONTINUE’ +0952 dfe4 0f 08 CLR ARYDIS CLEAR THE ARRAY DISABLE FLAG +0953 dfe6 6e 84 JMP ,X RETURN TO CALLING ROUTINE - THIS IS NECESSARY +0954 * SINCE THE STACK WAS RESET +0955 * +0956 * FOR +0957 * +0958 * THE FOR COMMAND WILL STORE 18 BYTES ON THE STACK FOR +0959 * EACH FOR-NEXT LOOP WHICH IS BEING PROCESSED. THESE +0960 * BYTES ARE DEFINED AS FOLLOWS: 0- $80 (FOR FLAG); +0961 * 1,2=INDEX VARIABLE DESCRIPTOR POINTER; 3-7=FP VALUE OF STEP; +0962 * 8=STEP DIRECTION: $FF IF NEGATIVE; 0 IF ZERO; 1 IF POSITIVE; +0963 * 9-13=FP VALUE OF ‘TO’ PARAMETER; +0964 * 14,15=CURRENT LINE NUMBER; 16,17=RAM ADDRESS OF THE END +0965 * OF THE LINE CONTAINING THE ‘FOR’ STATEMENT +0966 dfe8 86 80 FOR LDA #$80 * SAVE THE DISABLE ARRAY FLAG IN VO8 +0967 dfea 97 08 STA ARYDIS * DO NOT ALLOW THE INDEX VARIABLE TO BE AN ARRAY +0968 dfec bd e2 36 JSR LET SET INDEX VARIABLE TO INITIAL VALUE +0969 dfef bd de b6 JSR LABF9 SEARCH THE STACK FOR ‘FOR/NEXT’ DATA +0970 dff2 32 62 LEAS 2,S PURGE RETURN ADDRESS OFF OF THE STACK +0971 dff4 26 04 BNE LAD59 BRANCH IF INDEX VARIABLE NOT ALREADY BEING USED +0972 dff6 9e 0f LDX TEMPTR GET (ADDRESS + 18) OF MATCHED ‘FOR/NEXT’ DATA +0973 dff8 32 85 LEAS B,X MOVE THE STACK POINTER TO THE BEGINNING OF THE +0974 * MATCHED ‘FOR/NEXT’ DATA SO THE NEW DATA WILL +0975 * OVERLAY THE OLD DATA. THIS WILL ALSO DESTROY +0976 * ALL OF THE ‘RETURN’ AND ‘FOR/NEXT’ DATA BELOW +0977 * THIS POINT ON THE STACK +0978 dffa c6 09 LAD59 LDB #$09 * CHECK FOR ROOM FOR 18 BYTES +0979 dffc bd de f0 JSR LAC33 * IN FREE RAM +0980 dfff bd e1 95 JSR LAEE8 GET ADDR OF END OF SUBLINE IN X +0981 e002 dc 68 LDD CURLIN GET CURRENT LINE NUMBER +0982 e004 34 16 PSHS X,B,A SAVE LINE ADDR AND LINE NUMBER ON STACK +0983 e006 c6 a0 LDB #TOK_TO TOKEN FOR ‘TO’ +0984 e008 bd e4 f8 JSR LB26F SYNTAX CHECK FOR ‘TO’ +0985 e00b bd e3 cc JSR LB143 ‘TM’ ERROR IF INDEX VARIABLE SET TO STRING +0986 e00e bd e3 ca JSR LB141 EVALUATE EXPRESSION +0987 * +0988 e011 d6 54 LDB FP0SGN GET FPA0 MANTISSA SIGN +0989 e013 ca 7f ORB #$7F FORM A MASK TO SAVE DATA BITS OF HIGH ORDER MANTISSA +0990 e015 d4 50 ANDB FPA0 PUT THE MANTISSA SIGN IN BIT 7 OF HIGH ORDER MANTISSA +0991 e017 d7 50 STB FPA0 SAVE THE PACKED HIGH ORDER MANTISSA +0992 e019 10 8e e0 20 LDY #LAD7F LOAD FOLLOWING ADDRESS INTO Y AS A RETURN +0993 e01d 7e e4 73 JMP LB1EA ADDRESS - PUSH FPA0 ONTO THE STACK +0994 e020 8e ed 0e LAD7F LDX #LBAC5 POINT X TO FLOATING POINT NUMBER 1.0 (DEFAULT STEP VALUE) +0995 e023 bd ee 5d JSR LBC14 MOVE (X) TO FPA0 +0996 e026 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +0997 e028 81 a4 CMPA #TOK_STEP STEP TOKEN +0998 e02a 26 05 BNE LAD90 BRANCH IF NO ‘STEP’ VALUE +0999 e02c 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +1000 e02e bd e3 ca JSR LB141 EVALUATE NUMERIC EXPRESSION +1001 e031 bd ee b6 LAD90 JSR LBC6D CHECK STATUS OF FPA0 +1002 e034 bd e4 6f JSR LB1E6 SAVE STATUS AND FPA0 ON THE STACK +1003 e037 dc 3b LDD VARDES * GET DESCRIPTOR POINTER FOR THE ‘STEP’ +1004 e039 34 06 PSHS B,A * VARIABLE AND SAVE IT ON THE STACK +1005 e03b 86 80 LDA #$80 = GET THE ‘FOR’ FLAG AND +1006 e03d 34 02 PSHS A = SAVE IT ON THE STACK +1007 * +1008 * MAIN COMMAND INTERPRETATION LOOP +1009 e03f 1c af LAD9E ANDCC #$AF ENABLE IRQ,FIRQ +1010 e041 8d 60 BSR LADEB CHECK FOR KEYBOARD BREAK +1011 e043 9e 83 LDX CHARAD GET BASIC’S INPUT POINTER +1012 e045 9f 2f STX TINPTR SAVE IT +1013 e047 a6 80 LDA ,X+ GET CURRENT INPUT CHAR & MOVE POINTER +1014 e049 27 07 BEQ LADB4 BRANCH IF END OF LINE +1015 e04b 81 3a CMPA #': CHECK FOR LINE SEPARATOR +1016 e04d 27 22 BEQ LADC0 BRANCH IF COLON +1017 e04f 7e e5 00 LADB1 JMP LB277 ‘SYNTAX ERROR’-IF NOT LINE SEPARATOR +1018 e052 a6 81 LADB4 LDA ,X++ GET MS BYTE OF ADDRESS OF NEXT BASIC LINE +1019 e054 97 00 STA ENDFLG SAVE IN STOP/END FLAG - CAUSE A STOP IF +1020 * NEXT LINE ADDRESS IS < $8000; CAUSE +1021 * AN END IF ADDRESS > $8000 +1022 e056 27 72 BEQ LAE15 BRANCH TO ‘STOP’ - END OF PROGRAM +1023 e058 ec 80 LDD ,X+ GET CURRENT LINE NUMBER +1024 e05a dd 68 STD CURLIN SAVE IN CURLIN +1025 e05c 9f 83 STX CHARAD SAVE ADDRESS OF FIRST BYTE OF LINE +1026 * EXTENDED BASIC TRACE +1027 e05e 96 8c LDA TRCFLG TEST THE TRACE FLAG +1028 e060 27 0f BEQ LADC0 BRANCH IF TRACE OFF +1029 e062 86 5b LDA #$5B RIGHT HAND MARKER FOR TRON LINE NUMBER +1034 e06e bd db 14 JSR PUTCHR OUTPUT A CHARACTER +1035 * END OF EXTENDED BASIC TRACE +1036 e071 9d 7c LADC0 JSR GETNCH GET A CHARACTER FROM BASIC +1037 e073 8d 02 BSR LADC6 GO PROCESS COMMAND +1038 e075 20 c8 BRA LAD9E GO BACK TO MAIN LOOP +1039 e077 27 29 LADC6 BEQ LADEA RETURN IF END OF LINE (RTS - was BEQ LAE40) +1040 e079 4d TSTA CHECK FOR TOKEN - BIT 7 SET (NEGATIVE) +1041 e07a 10 2a 01 b8 LBPL LET BRANCH IF NOT A TOKEN - GO DO A ‘LET’ WHICH +1042 * IS THE ‘DEFAULT’ TOKEN FOR MICROSOFT BASIC +1043 e07e 81 ff CMPA #$FF SECONDARY TOKEN +1044 e080 27 0f BEQ SECTOK +1045 e082 81 9e CMPA #TOK_HIGH_EXEC SKIPF TOKEN - HIGHEST EXECUTABLE COMMAND IN BASIC +1046 e084 22 c9 BHI LADB1 ‘SYNTAX ERROR’ IF NON-EXECUTABLE TOKEN +1047 e086 be db f1 LDX COMVEC+3 GET ADDRESS OF BASIC’S COMMAND TABLE +1048 e089 48 LADD4 ASLA X2 (2 BYTE/JUMP ADDRESS) & DISCARD BIT 7 +1049 e08a 1f 89 TFR A,B SAVE COMMAND OFFSET IN ACCB +1050 e08c 3a ABX NON X POINTS TO COMMAND JUMP ADDR +1051 e08d 9d 7c JSR GETNCH GET AN INPUT CHAR +1052 * +1053 * HERE IS WHERE WE BRANCH TO DO A ‘COMMAND’ +1054 e08f 6e 94 JMP [,X] GO DO A COMMAND +1055 SECTOK +1056 * THE ONLY SECONDARY TOKEN THAT CAN ALSO BE AN EXECUTABLE IS +1057 * THE MID$ REPLACEMENT STATEMENT. SO SPECIAL-CASE CHECK DONE HERE +1058 e091 9d 7c JSR GETNCH GET AN INPUT CHAR +1059 e093 81 97 CMPA #TOK_MID TOKEN FOR "MID$" +1060 e095 10 27 14 f0 LBEQ L86D6 PROCESS MID$ REPLACEMENT +1061 e099 7e e5 00 JMP LB277 SYNTAX ERROR +1062 +1063 * +1064 * RESTORE +1065 e09c 9e 19 RESTOR LDX TXTTAB BEGINNING OF PROGRAM ADDRESS +1066 e09e 30 1f LEAX -1,X MOVE TO ONE BYTE BEFORE PROGRAM +1067 e0a0 9f 33 LADE8 STX DATPTR SAVE NEW DATA POINTER +1068 e0a2 39 LADEA RTS +1069 * +1070 * BREAK CHECK +1071 e0a3 bd db 05 LADEB JSR LA1C1 GET A KEYSTROKE ENTRY +1072 e0a6 27 0a BEQ LADFA RETURN IF NO INPUT +1073 e0a8 81 03 LADF0 CMPA #3 CONTROL C? (BREAK) +1074 e0aa 27 12 BEQ STOP YES +1075 e0ac 81 13 CMPA #$13 CONTROL S? (PAUSE) +1076 e0ae 27 03 BEQ LADFB YES +1077 e0b0 97 73 STA IKEYIM SAVE KEYSTROKE IN INKEY IMAGE +1078 e0b2 39 LADFA RTS +1079 e0b3 bd db 05 LADFB JSR KEYIN GET A KEY +1080 e0b6 27 fb BEQ LADFB BRANCH IF NO KEY DOWN +1081 e0b8 20 ee BRA LADF0 CONTINUE - DO A BREAK CHECK +1082 * +1083 * END +1084 e0ba 9d 82 END JSR GETCCH GET CURRENT INPUT CHAR +1085 e0bc 20 02 BRA LAE0B +1086 * +1087 * STOP +1088 e0be 1a 01 STOP ORCC #$01 SET CARRY FLAG +1089 e0c0 26 31 LAE0B BNE LAE40 BRANCH IF ARGUMENT EXISTS +1090 e0c2 9e 83 LDX CHARAD * SAVE CURRENT POSITION OF +1091 e0c4 9f 2f STX TINPTR * BASIC’S INPUT POINTER +1092 e0c6 06 00 LAE11 ROR ENDFLG ROTATE CARRY INTO BIT 7 OF STOP/END FLAG +1093 e0c8 32 62 LEAS 2,S PURGE RETURN ADDRESS OFF STACK +1094 e0ca 9e 68 LAE15 LDX CURLIN GET CURRENT LINE NUMBER +1095 e0cc 8c ff ff CMPX #$FFFF DIRECT MODE? +1096 e0cf 27 06 BEQ LAE22 YES +1097 e0d1 9f 29 STX OLDTXT SAVE CURRENT LINE NUMBER +1098 e0d3 9e 2f LDX TINPTR * GET AND SAVE CURRENT POSITION +1099 e0d5 9f 2d STX OLDPTR * OF BASIC’S INPUT POINTER +1100 LAE22 +1101 e0d7 8e de ae LDX #LABF2-1 POINT TO CR, ‘BREAK’ MESSAGE +1102 e0da 0d 00 TST ENDFLG CHECK STOP/END FLAG +1103 e0dc 10 2a fe 42 LBPL LAC73 BRANCH TO MAIN LOOP OF BASIC IF END +1104 e0e0 7e df 17 JMP LAC68 PRINT ‘BREAK AT ####’ AND GO TO +1105 * BASIC’S MAIN LOOP IF ‘STOP’ +1106 +1107 * CONT +1108 e0e3 26 0e CONT BNE LAE40 RETURN IF ARGUMENT GIVEN +1109 e0e5 c6 20 LDB #2*16 ‘CAN’T CONTINUE’ ERROR +1110 e0e7 9e 2d LDX OLDPTR GET CONTINUE ADDRESS (INPUT POINTER) +1111 e0e9 10 27 fe 16 LBEQ LAC46 ‘CN’ ERROR IF CONTINUE ADDRESS = 0 +1112 e0ed 9f 83 STX CHARAD RESET BASIC’S INPUT POINTER +1113 e0ef 9e 29 LDX OLDTXT GET LINE NUMBER +1114 e0f1 9f 68 STX CURLIN RESET CURRENT LINE NUMBER +1115 e0f3 39 LAE40 RTS +1116 * +1117 * CLEAR +1118 e0f4 27 2c CLEAR BEQ LAE6F BRANCH IF NO ARGUMENT +1119 e0f6 bd e6 6a JSR LB3E6 EVALUATE ARGUMENT +1120 e0f9 34 06 PSHS B,A SAVE AMOUNT OF STRING SPACE ON STACK +1121 e0fb 9e 27 LDX MEMSIZ GET CURRENT TOP OF CLEARED SPACE +1122 e0fd 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1123 e0ff 27 0c BEQ LAE5A BRANCH IF NO NEW TOP OF CLEARED SPACE +1124 e101 bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +1125 e104 bd e9 c1 JSR LB73D EVALUATE EXPRESSlON; RETURN VALUE IN X +1126 e107 30 1f LEAX -1,X X = TOP OF CLEARED SPACE +1127 e109 9c 71 CMPX TOPRAM COMPARE TO TOP OF RAM +1128 e10b 22 18 BHI LAE72 ‘OM’ ERROR IF > TOP OF RAM +1129 e10d 1f 10 LAE5A TFR X,D ACCD = TOP OF CLEARED SPACE +1130 e10f a3 e1 SUBD ,S++ SUBTRACT OUT AMOUNT OF CLEARED SPACE +1131 e111 25 12 BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 +1132 e113 1f 03 TFR D,U U = BOTTOM OF CLEARED SPACE +1133 e115 83 00 3a SUBD #STKBUF SUBTRACT OUT STACK BUFFER +1134 e118 25 0b BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 +1135 e11a 93 1b SUBD VARTAB SUBTRACT OUT START OF VARIABLES +1136 e11c 25 07 BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 +1137 e11e df 21 STU FRETOP SAVE NEW BOTTOM OF CLEARED SPACE +1138 e120 9f 27 STX MEMSIZ SAVE NEW TOP OF CLEARED SPACE +1139 e122 7e df c7 LAE6F JMP LAD26 ERASE ALL VARIABLES, INITIALIZE POINTERS, ETC +1140 e125 7e df 01 LAE72 JMP LAC44 ‘OM’ ERROR +1141 * +1142 * RUN +1143 e128 9d 82 RUN JSR GETCCH * GET CURRENT INPUT CHARACTER +1144 e12a 10 27 fe 94 LBEQ LAD21 * IF NO LINE NUMBER +1145 e12e bd df c7 JSR LAD26 ERASE ALL VARIABLES +1146 e131 20 19 BRA LAE9F ‘GOTO’ THE RUN ADDRESS +1147 * +1148 * GO +1149 e133 1f 89 GO TFR A,B SAVE INPUT CHARACTER IN ACCB +1150 e135 9d 7c LAE88 JSR GETNCH GET A CHARACTER FROM BASIC +1151 e137 c1 a0 CMPB #TOK_TO ‘TO’ TOKEN +1152 e139 27 16 BEQ LAEA4 BRANCH IF GOTO +1153 e13b c1 a1 CMPB #TOK_SUB ‘SUB’ TOKEN +1154 e13d 26 45 BNE LAED7 ‘SYNTAX ERROR’ IF NEITHER +1155 e13f c6 03 LDB #3 =ROOM FOR 6 +1156 e141 bd de f0 JSR LAC33 =BYTES ON STACK? +1157 e144 de 83 LDU CHARAD * SAVE CURRENT BASIC INPUT POINTER, LINE +1158 e146 9e 68 LDX CURLIN * NUMBER AND SUB TOKEN ON STACK +1159 e148 86 a1 LDA #TOK_SUB * +1160 e14a 34 52 PSHS U,X,A * +1161 e14c 8d 03 LAE9F BSR LAEA4 GO DO A ‘GOTO’ +1162 e14e 7e e0 3f JMP LAD9E JUMP BACK TO BASIC’S MAIN LOOP +1163 * GOTO +1164 e151 9d 82 LAEA4 JSR GETCCH GET CURRENT INPUT CHAR +1165 e153 bd e2 14 JSR LAF67 GET LINE NUMBER TO BINARY IN BINVAL +1166 e156 8d 40 BSR LAEEB ADVANCE BASIC’S POINTER TO END OF LINE +1167 e158 30 01 LEAX $01,X POINT TO START OF NEXT LINE +1168 e15a dc 2b LDD BINVAL GET THE LINE NUMBER TO RUN +1169 e15c 10 93 68 CMPD CURLIN COMPARE TO CURRENT LINE NUMBER +1170 e15f 22 02 BHI LAEB6 IF REO’D LINE NUMBER IS > CURRENT LINE NUMBER, +1171 * DON’T START LOOKING FROM +1172 * START OF PROGRAM +1173 e161 9e 19 LDX TXTTAB BEGINNING OF PROGRAM +1174 e163 bd df a6 LAEB6 JSR LAD05 GO FIND A LINE NUMBER +1175 e166 25 17 BCS LAED2 ‘UNDEFINED LINE NUMBER’ +1176 e168 30 1f LAEBB LEAX -1,X MOVE BACK TO JUST BEFORE START OF LINE +1177 e16a 9f 83 STX CHARAD RESET BASIC’S INPUT POINTER +1178 e16c 39 LAEBF RTS +1179 * +1180 * RETURN +1181 e16d 26 fd RETURN BNE LAEBF EXIT ROUTINE IF ARGUMENT GIVEN +1182 e16f 86 ff LDA #$FF * PUT AN ILLEGAL VARIABLE NAME IN FIRST BYTE OF +1183 e171 97 3b STA VARDES * VARDES WHICH WILL CAUSE ‘FOR/NEXT’ DATA ON THE +1184 * STACK TO BE IGNORED +1185 e173 bd de b6 JSR LABF9 CHECK FOR RETURN DATA ON THE STACK +1186 e176 1f 14 TFR X,S RESET STACK POINTER - PURGE TWO RETURN ADDRESSES +1187 * FROM THE STACK +1188 e178 81 21 CMPA #TOK_SUB-$80 SUB TOKEN - $80 +1189 e17a 27 0b BEQ LAEDA BRANCH IF ‘RETURN’ FROM SUBROUTINE +1190 e17c c6 04 LDB #2*2 ERROR #2 ‘RETURN WITHOUT GOSUB’ +1191 e17e 8c FCB SKP2 SKIP TWO BYTES +1192 e17f c6 0e LAED2 LDB #7*2 ERROR #7 ‘UNDEFINED LINE NUMBER’ +1193 e181 7e df 03 JMP LAC46 JUMP TO ERROR HANDLER +1194 e184 7e e5 00 LAED7 JMP LB277 ‘SYNTAX ERROR’ +1195 e187 35 52 LAEDA PULS A,X,U * RESTORE VALUES OF CURRENT LINE NUMBER AND +1196 e189 9f 68 STX CURLIN * BASIC’S INPUT POINTER FOR THIS SUBROUTINE +1197 e18b df 83 STU CHARAD * AND LOAD ACCA WITH SUB TOKEN ($A6) +1198 * +1199 * DATA +1200 e18d 8d 06 DATA BSR LAEE8 MOVE INPUT POINTER TO END OF SUBLINE OR LINE +1201 e18f 8c FCB SKP2 SKIP 2 BYTES +1202 +1203 * REM, ELSE +1204 ELSE +1205 e190 8d 06 REM BSR LAEEB MOVE INPUT POINTER TO END OF LINE +1206 e192 9f 83 STX CHARAD RESET BASIC’S INPUT POINTER +1207 e194 39 LAEE7 RTS +1208 * ADVANCE INPUT POINTER TO END OF SUBLINE OR LINE +1209 e195 c6 3a LAEE8 LDB #': COLON = SUBLINE TERMINATOR CHARACTER +1210 e197 86 LAEEA FCB SKP1LD SKPILD SKIP ONE BYTE; LDA #$5F +1211 * ADVANCE BASIC’S INPUT POINTER TO END OF +1212 * LINE - RETURN ADDRESS OF END OF LINE+1 IN X +1213 e198 5f LAEEB CLRB 0 = LINE TERMINATOR CHARACTER +1214 e199 d7 01 STB CHARAC TEMP STORE PRIMARY TERMINATOR CHARACTER +1215 e19b 5f CLRB 0 (END OF LINE) = ALTERNATE TERM. CHAR. +1216 e19c 9e 83 LDX CHARAD LOAD X W/BASIC’S INPUT POINTER +1217 e19e 1f 98 LAEF1 TFR B,A * CHANGE TERMINATOR CHARACTER +1218 e1a0 d6 01 LDB CHARAC * FROM ACCB TO CHARAC - SAVE OLD TERMINATOR +1219 * IN CHARAC +1220 e1a2 97 01 STA CHARAC SWAP PRIMARY AND SECONDARY TERMINATORS +1221 e1a4 a6 84 LAEF7 LDA ,X GET NEXT INPUT CHARACTER +1222 e1a6 27 ec BEQ LAEE7 RETURN IF 0 (END OF LINE) +1223 e1a8 34 04 PSHS B SAVE TERMINATOR ON STACK +1224 e1aa a1 e0 CMPA ,S+ COMPARE TO INPUT CHARACTER +1225 e1ac 27 e6 BEQ LAEE7 RETURN IF EQUAL +1226 e1ae 30 01 LEAX 1,X MOVE POINTER UP ONE +1227 e1b0 81 22 CMPA #'" CHECK FOR DOUBLE QUOTES +1228 e1b2 27 ea BEQ LAEF1 BRANCH IF " - TOGGLE TERMINATOR CHARACTERS +1229 e1b4 4c INCA * CHECK FOR $FF AND BRANCH IF +1230 e1b5 26 02 BNE LAF0C * NOT SECONDARY TOKEN +1231 e1b7 30 01 LEAX 1,X MOVE INPUT POINTER 1 MORE IF SECONDARY +1232 e1b9 81 86 LAF0C CMPA #TOK_IF+1 TOKEN FOR IF? +1233 e1bb 26 e7 BNE LAEF7 NO - GET ANOTHER INPUT CHARACTER +1234 e1bd 0c 04 INC IFCTR INCREMENT IF COUNTER - KEEP TRACK OF HOW MANY +1235 * ‘IF’ STATEMENTS ARE NESTED IN ONE LINE +1236 e1bf 20 e3 BRA LAEF7 GET ANOTHER INPUT CHARACTER +1237 +1238 * IF +1239 e1c1 bd e3 ca IF JSR LB141 EVALUATE NUMERIC EXPRESSION +1240 e1c4 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1241 e1c6 81 81 CMPA #TOK_GO TOKEN FOR GO +1242 e1c8 27 05 BEQ LAF22 TREAT ‘GO’ THE SAME AS ‘THEN’ +1243 e1ca c6 a2 LDB #TOK_THEN TOKEN FOR THEN +1244 e1cc bd e4 f8 JSR LB26F DO A SYNTAX CHECK ON ACCB +1245 e1cf 96 4f LAF22 LDA FP0EXP CHECK FOR TRUE/FALSE - FALSE IF FPA0 EXPONENT = ZERO +1246 e1d1 26 13 BNE LAF39 BRANCH IF CONDITION TRUE +1247 e1d3 0f 04 CLR IFCTR CLEAR FLAG - KEEP TRACK OF WHICH NESTED ELSE STATEMENT +1248 * TO SEARCH FOR IN NESTED ‘IF’ LOOPS +1249 e1d5 8d b6 LAF28 BSR DATA MOVE BASIC’S POINTER TO END OF SUBLINE +1250 e1d7 4d TSTA * CHECK TO SEE IF END OF LINE OR SUBLINE +1251 e1d8 27 ba BEQ LAEE7 * AND RETURN IF END OF LINE +1252 e1da 9d 7c JSR GETNCH GET AN INPUT CHARACTER FROM BASIC +1253 e1dc 81 84 CMPA #TOK_ELSE TOKEN FOR ELSE +1254 e1de 26 f5 BNE LAF28 IGNORE ALL DATA EXCEPT ‘ELSE’ UNTIL +1255 * END OF LINE (ZERO BYTE) +1256 e1e0 0a 04 DEC IFCTR CHECK TO SEE IF YOU MUST SEARCH ANOTHER SUBLINE +1257 e1e2 2a f1 BPL LAF28 BRANCH TO SEARCH ANOTHER SUBLINE FOR ‘ELSE’ +1258 e1e4 9d 7c JSR GETNCH GET AN INPUT CHARACTER FROM BASIC +1259 e1e6 9d 82 LAF39 JSR GETCCH GET CURRENT INPUT CHARACTER +1260 e1e8 10 25 ff 65 LBCS LAEA4 BRANCH TO ‘GOTO’ IF NUMERIC CHARACTER +1261 e1ec 7e e0 77 JMP LADC6 RETURN TO MAIN INTERPRETATION LOOP +1262 +1263 * ON +1264 e1ef bd e9 8f ON JSR LB70B EVALUATE EXPRESSION +1265 e1f2 c6 81 LDB #TOK_GO TOKEN FOR GO +1266 e1f4 bd e4 f8 JSR LB26F SYNTAX CHECK FOR GO +1267 e1f7 34 02 PSHS A SAVE NEW TOKEN (TO,SUB) +1268 e1f9 81 a1 CMPA #TOK_SUB TOKEN FOR SUB? +1269 e1fb 27 04 BEQ LAF54 YES +1270 e1fd 81 a0 CMPA #TOK_TO TOKEN FOR TO? +1271 e1ff 26 83 LAF52 BNE LAED7 ‘SYNTAX’ ERROR IF NOT ‘SUB’ OR ‘TO’ +1272 e201 0a 53 LAF54 DEC FPA0+3 DECREMENT IS BYTE OF MANTISSA OF FPA0 - THIS +1273 * IS THE ARGUMENT OF THE ‘ON’ STATEMENT +1274 e203 26 05 BNE LAF5D BRANCH IF NOT AT THE PROPER GOTO OR GOSUB LINE NUMBER +1275 e205 35 04 PULS B GET BACK THE TOKEN FOLLOWING ‘GO’ +1276 e207 7e e1 35 JMP LAE88 GO DO A ‘GOTO’ OR ‘GOSUB’ +1277 e20a 9d 7c LAF5D JSR GETNCH GET A CHARACTER FROM BASIC +1278 e20c 8d 06 BSR LAF67 CONVERT BASIC LINE NUMBER TO BINARY +1279 e20e 81 2c CMPA #', IS CHARACTER FOLLOWING LINE NUMBER A COMMA? +1280 e210 27 ef BEQ LAF54 YES +1281 e212 35 84 PULS B,PC IF NOT, FALL THROUGH TO NEXT COMMAND +1282 e214 9e 74 LAF67 LDX ZERO DEFAULT LINE NUMBER OF ZERO +1283 e216 9f 2b STX BINVAL SAVE IT IN BINVAL +1284 * +1285 * CONVERT LINE NUMBER TO BINARY - RETURN VALUE IN BINVAL +1286 * +1287 e218 24 61 LAF6B BCC LAFCE RETURN IF NOT NUMERIC CHARACTER +1288 e21a 80 30 SUBA #'0 MASK OFF ASCII +1289 e21c 97 01 STA CHARAC SAVE DIGIT IN VO1 +1290 e21e dc 2b LDD BINVAL GET ACCUMULATED LINE NUMBER VALUE +1291 e220 81 18 CMPA #24 LARGEST LINE NUMBER IS $F9FF (63999) - +1292 * (24*256+255)*10+9 +1293 e222 22 db BHI LAF52 ‘SYNTAX’ ERROR IF TOO BIG +1294 * MULT ACCD X 10 +1295 e224 58 ASLB * +1296 e225 49 ROLA * TIMES 2 +1297 e226 58 ASLB = +1298 e227 49 ROLA = TIMES 4 +1299 e228 d3 2b ADDD BINVAL ADD 1 = TIMES 5 +1300 e22a 58 ASLB * +1301 e22b 49 ROLA * TIMES 10 +1302 e22c db 01 ADDB CHARAC ADD NEXT DIGIT +1303 e22e 89 00 ADCA #0 PROPAGATE CARRY +1304 e230 dd 2b STD BINVAL SAVE NEW ACCUMULATED LINE NUMBER +1305 e232 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC +1306 e234 20 e2 BRA LAF6B LOOP- PROCESS NEXT DIGIT +1307 * +1308 * LET (EXBAS) +1309 * EVALUATE A NON-TOKEN EXPRESSION +1310 * TARGET = REPLACEMENT +1311 e236 bd e5 db LET JSR LB357 FIND TARGET VARIABLE DESCRIPTOR +1312 e239 9f 3b STX VARDES SAVE DESCRIPTOR ADDRESS OF 1ST EXPRESSION +1313 e23b c6 ae LDB #TOK_EQUALS TOKEN FOR "=" +1314 e23d bd e4 f8 JSR LB26F DO A SYNTAX CHECK FOR ‘=‘ +1315 e240 96 06 LDA VALTYP * GET VARIABLE TYPE AND +1316 e242 34 02 PSHS A * SAVE ON THE STACK +1317 e244 bd e3 df JSR LB156 EVALUATE EXPRESSION +1318 e247 35 02 PULS A * REGET VARIABLE TYPE OF 1ST EXPRESSION AND +1319 e249 46 RORA * SET CARRY IF STRING +1320 e24a bd e3 d1 JSR LB148 TYPE CHECK-TM ERROR IF VARIABLE TYPES ON +1321 * BOTH SIDES OF EQUALS SIGN NOT THE SAME +1322 e24d 10 27 0c 2b LBEQ LBC33 GO PUT FPA0 INTO VARIABLE DESCRIPTOR IF NUMERIC +1323 * MOVE A STRING WHOSE DESCRIPTOR IS LOCATED AT +1324 * FPA0+2 INTO THE STRING SPACE. TRANSFER THE +1325 * DESCRIPTOR ADDRESS TO THE ADDRESS IN VARDES +1326 * DON’T MOVE THE STRING IF IT IS ALREADY IN THE +1327 * STRING SPACE. REMOVE DESCRIPTOR FROM STRING +1328 * STACK IF IT IS LAST ONE ON THE STACK +1329 e251 9e 52 LAFA4 LDX FPA0+2 POINT X TO DESCRIPTOR OF REPLACEMENT STRING +1330 e253 dc 21 LDD FRETOP LOAD ACCD WITH START OF STRING SPACE +1331 e255 10 a3 02 CMPD 2,X IS THE STRING IN STRING SPACE? +1332 e258 24 11 BCC LAFBE BRANCH IF IT’S NOT IN THE STRING SPACE +1333 e25a 9c 1b CMPX VARTAB COMPARE DESCRIPTOR ADDRESS TO START OF VARIABLES +1334 e25c 25 0d BCS LAFBE BRANCH IF DESCRIPTOR ADDRESS NOT IN VARIABLES +1335 e25e e6 84 LAFB1 LDB ,X GET LENGTH OF REPLACEMENT STRING +1336 e260 bd e7 91 JSR LB50D RESERVE ACCB BYTES OF STRING SPACE +1337 e263 9e 4d LDX V4D GET DESCRIPTOR ADDRESS BACK +1338 e265 bd e8 c7 JSR LB643 MOVE STRING INTO STRING SPACE +1339 e268 8e 00 56 LDX #STRDES POINT X TO TEMP STRING DESCRIPTOR ADDRESS +1340 e26b 9f 4d LAFBE STX V4D SAVE STRING DESCRIPTOR ADDRESS IN V4D +1341 e26d bd e8 f9 JSR LB675 REMOVE STRING DESCRIPTOR IF LAST ONE +1342 * ON STRING STACK +1343 e270 de 4d LDU V4D POINT U TO REPLACEMENT DESCRIPTOR ADDRESS +1344 e272 9e 3b LDX VARDES GET TARGET DESCRIPTOR ADDRESS +1345 e274 37 26 PULU A,B,Y GET LENGTH AND START OF REPLACEMENT STRING +1346 e276 a7 84 STA ,X * SAVE STRING LENGTH AND START IN +1347 e278 10 af 02 STY 2,X * TARGET DESCRIPTOR LOCATION +1348 e27b 39 LAFCE RTS +1349 +1350 e27c 3f 52 45 44 4f LAFCF FCC "?REDO" ?REDO MESSAGE +1351 e281 0d 00 FCB CR,$00 +1352 +1353 LAFD6 +1354 e283 7e df 03 LAFDC JMP LAC46 JMP TO ERROR HANDLER +1355 e286 96 09 LAFDF LDA INPFLG = GET THE INPUT FLAG AND BRANCH +1356 e288 27 07 BEQ LAFEA = IF ‘INPUT’ +1357 e28a 9e 31 LDX DATTXT * GET LINE NUMBER WHERE THE ERROR OCCURRED +1358 e28c 9f 68 STX CURLIN * AND USE IT AS THE CURRENT LINE NUMBER +1359 e28e 7e e5 00 JMP LB277 ‘SYNTAX ERROR’ +1360 e291 8e e2 7b LAFEA LDX #LAFCF-1 * POINT X TO ‘?REDO’ AND PRINT +1361 e294 bd eb e5 JSR LB99C * IT ON THE SCREEN +1362 e297 9e 2f LDX TINPTR = GET THE SAVED ABSOLUTE ADDRESS OF +1363 e299 9f 83 STX CHARAD = INPUT POINTER AND RESTORE IT +1364 e29b 39 RTS +1365 * +1366 * INPUT +1367 e29c c6 16 INPUT LDB #11*2 ‘ID’ ERROR +1368 e29e 9e 68 LDX CURLIN GET CURRENT LINE NUMBER +1369 e2a0 30 01 LEAX 1,X ADD ONE +1370 e2a2 27 df BEQ LAFDC ‘ID’ ERROR BRANCH IF DIRECT MODE +1371 e2a4 8d 01 BSR LB00F GET SOME INPUT DATA - WAS LB002 +1372 e2a6 39 RTS +1373 e2a7 81 22 LB00F CMPA #'" CHECK FOR PROMPT STRING DELIMITER +1374 e2a9 26 0b BNE LB01E BRANCH IF NO PROMPT STRING +1375 e2ab bd e4 cd JSR LB244 PUT PROMPT STRING ON STRING STACK +1376 e2ae c6 3b LDB #'; * +1377 e2b0 bd e4 f8 JSR LB26F * DO A SYNTAX CHECK FOR SEMICOLON +1378 e2b3 bd eb e8 JSR LB99F PRINT MESSAGE TO CONSOLE OUT +1379 e2b6 8e 00 f3 LB01E LDX #LINBUF POINT TO BASIC’S LINE BUFFER +1380 e2b9 6f 84 CLR ,X CLEAR 1ST BYTE - FLAG TO INDICATE NO DATA +1381 * IN LINE BUFFER +1382 e2bb 8d 06 BSR LB02F INPUT A STRING TO LINE BUFFER +1383 e2bd c6 2c LDB #', * INSERT A COMMA AT THE END +1384 e2bf e7 84 STB ,X * OF THE LINE INPUT BUFFER +1385 e2c1 20 16 BRA LB049 +1386 * FILL BASIC’S LINE INPUT BUFFER CONSOLE IN +1387 e2c3 bd eb f8 LB02F JSR LB9AF SEND A "?" TO CONSOLE OUT +1388 e2c6 bd eb f5 JSR LB9AC SEND A ‘SPACE’ TO CONSOLE OUT +1389 e2c9 bd dc 3e LB035 JSR LA390 GO READ IN A BASIC LINE +1390 e2cc 24 05 BCC LB03F BRANCH IF ENTER KEY ENDED ENTRY +1391 e2ce 32 64 LEAS 4,S PURGE TWO RETURN ADDRESSES OFF THE STACK +1392 e2d0 7e e0 c6 JMP LAE11 GO DO A ‘STOP’ IF BREAK KEY ENDED LINE ENTRY +1393 e2d3 c6 2e LB03F LDB #2*23 ‘INPUT PAST END OF FILE’ ERROR +1394 e2d5 39 RTS +1395 * +1396 * READ +1397 e2d6 9e 33 READ LDX DATPTR GET ‘READ’ START ADDRESS +1398 e2d8 86 FCB SKP1LD SKIP ONE BYTE - LDA #*$4F +1399 e2d9 4f LB049 CLRA ‘INPUT’ ENTRY POINT: INPUT FLAG = 0 +1400 e2da 97 09 STA INPFLG SET INPUT FLAG; 0 = INPUT: <> 0 = READ +1401 e2dc 9f 35 STX DATTMP SAVE ‘READ’ START ADDRESS/’INPUT’ BUFFER START +1402 e2de bd e5 db LB04E JSR LB357 EVALUATE A VARIABLE +1403 e2e1 9f 3b STX VARDES SAVE DESCRIPTOR ADDRESS +1404 e2e3 9e 83 LDX CHARAD * GET BASIC’S INPUT POINTER +1405 e2e5 9f 2b STX BINVAL * AND SAVE IT +1406 e2e7 9e 35 LDX DATTMP GET ‘READ’ ADDRESS START/’INPUT’ BUFFER POINTER +1407 e2e9 a6 84 LDA ,X GET A CHARACTER FROM THE BASIC PROGRAM +1408 e2eb 26 09 BNE LB069 BRANCH IF NOT END OF LINE +1409 e2ed 96 09 LDA INPFLG * CHECK INPUT FLAG AND BRANCH +1410 e2ef 26 51 BNE LB0B9 * IF LOOKING FOR DATA (READ) +1411 * NO DATA IN ‘INPUT’ LINE BUFFER AND/OR INPUT +1412 * NOT COMING FROM SCREEN +1413 e2f1 bd eb f8 JSR LB9AF SEND A '?' TO CONSOLE OUT +1414 e2f4 8d cd BSR LB02F FILL INPUT BUFFER FROM CONSOLE IN +1415 e2f6 9f 83 LB069 STX CHARAD RESET BASIC’S INPUT POINTER +1416 e2f8 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +1417 e2fa d6 06 LDB VALTYP * CHECK VARIABLE TYPE AND +1418 e2fc 27 23 BEQ LB098 * BRANCH IF NUMERIC +1419 * READ/INPUT A STRING VARIABLE +1420 e2fe 9e 83 LDX CHARAD LOAD X WITH CURRENT BASIC INPUT POINTER +1421 e300 97 01 STA CHARAC SAVE CURRENT INPUT CHARACTER +1422 e302 81 22 CMPA #'" CHECK FOR STRING DELIMITER +1423 e304 27 0e BEQ LB08B BRANCH IF STRING DELIMITER +1424 e306 30 1f LEAX -1,X BACK UP POINTER +1425 e308 4f CLRA * ZERO = END OF LINE CHARACTER +1426 e309 97 01 STA CHARAC * SAVE AS TERMINATOR +1427 e30b bd dc 30 JSR LA35F SET UP PRINT PARAMETERS +1428 e30e 86 3a LDA #': END OF SUBLINE CHARACTER +1429 e310 97 01 STA CHARAC SAVE AS TERMINATOR I +1430 e312 86 2c LDA #', COMMA +1431 e314 97 02 LB08B STA ENDCHR SAVE AS TERMINATOR 2 +1432 e316 bd e7 a2 JSR LB51E STRIP A STRING FROM THE INPUT BUFFER +1433 e319 bd e4 d2 JSR LB249 MOVE INPUT POINTER TO END OF STRING +1434 e31c bd e2 51 JSR LAFA4 PUT A STRING INTO THE STRING SPACE IF NECESSARY +1435 e31f 20 06 BRA LB09E CHECK FOR ANOTHER DATA ITEM +1436 * SAVE A NUMERIC VALUE IN A READ OR INPUT DATA ITEM +1437 e321 bd ef 5b LB098 JSR LBD12 CONVERT AN ASCII STRING TO FP NUMBER +1438 e324 bd ee 7c JSR LBC33 PACK FPA0 AND STORE IT IN ADDRESS IN VARDES - +1439 * INPUT OR READ DATA ITEM +1440 e327 9d 82 LB09E JSR GETCCH GET CURRENT INPUT CHARACTER +1441 e329 27 06 BEQ LB0A8 BRANCH IF END OF LINE +1442 e32b 81 2c CMPA #', CHECK FOR A COMMA +1443 e32d 10 26 ff 52 LBNE LAFD6 BAD FILE DATA' ERROR OR RETRY +1444 e331 9e 83 LB0A8 LDX CHARAD * GET CURRENT INPUT +1445 e333 9f 35 STX DATTMP * POINTER (USED AS A DATA POINTER) AND SAVE IT +1446 e335 9e 2b LDX BINVAL * RESET INPUT POINTER TO INPUT OR +1447 e337 9f 83 STX CHARAD * READ STATEMENT +1448 e339 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +1449 e33b 27 21 BEQ LB0D5 BRANCH IF END OF LINE - EXIT COMMAND +1450 e33d bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +1451 e340 20 9c BRA LB04E GET ANOTHER INPUT OR READ ITEM +1452 * SEARCH FROM ADDRESS IN X FOR +1453 * 1ST OCCURENCE OF THE TOKEN FOR DATA +1454 e342 9f 83 LB0B9 STX CHARAD RESET BASIC’S INPUT POINTER +1455 e344 bd e1 95 JSR LAEE8 SEARCH FOR END OF CURRENT LINE OR SUBLINE +1456 e347 30 01 LEAX 1,X MOVE X ONE PAST END OF LINE +1457 e349 4d TSTA CHECK FOR END OF LINE +1458 e34a 26 0a BNE LB0CD BRANCH IF END OF SUBLINE +1459 e34c c6 06 LDB #2*3 ‘OUT OF DATA’ ERROR +1460 e34e ee 81 LDU ,X++ GET NEXT 2 CHARACTERS +1461 e350 27 41 BEQ LB10A ‘OD’ ERROR IF END OF PROGRAM +1462 e352 ec 81 LDD ,X++ GET BASIC LINE NUMBER AND +1463 e354 dd 31 STD DATTXT SAVE IT IN DATTXT +1464 e356 a6 84 LB0CD LDA ,X GET AN INPUT CHARACTER +1465 e358 81 86 CMPA #TOK_DATA DATA TOKEN? +1466 e35a 26 e6 BNE LB0B9 NO — KEEP LOOKING +1467 e35c 20 98 BRA LB069 YES +1468 * EXIT READ AND INPUT COMMANDS +1469 e35e 9e 35 LB0D5 LDX DATTMP GET DATA POINTER +1470 e360 d6 09 LDB INPFLG * CHECK INPUT FLAG +1471 e362 10 26 fd 3a LBNE LADE8 * SAVE NEW DATA POINTER IF READ +1472 e366 a6 84 LDA ,X = CHECK NEXT CHARACTER IN ‘INPUT’ BUFFER +1473 e368 27 06 BEQ LB0E7 = +1474 e36a 8e e3 70 LDX #LB0E8-1 POINT X TO ‘?EXTRA IGNORED’ +1475 e36d 7e eb e5 JMP LB99C PRINT THE MESSAGE +1476 e370 39 LB0E7 RTS +1477 +1478 e371 3f 45 58 54 52 41 LB0E8 FCC "?EXTRA IGNORED" ?EXTRA IGNORED MESSAGE + 20 49 47 4e 4f 52 + 45 44 +1479 +1480 +1481 e37f 0d 00 FCB CR,$00 +1482 +1483 * NEXT +1484 e381 26 04 NEXT BNE LB0FE BRANCH IF ARGUMENT GIVEN +1485 e383 9e 74 LDX ZERO X = 0: DEFAULT FOR NO ARGUMENT +1486 e385 20 03 BRA LB101 +1487 e387 bd e5 db LB0FE JSR LB357 EVALUATE AN ALPHA EXPRESSION +1488 e38a 9f 3b LB101 STX VARDES SAVE VARIABLE DESCRIPTOR POINTER +1489 e38c bd de b6 JSR LABF9 GO SCAN FOR ‘FOR/NEXT’ DATA ON STACK +1490 e38f 27 04 BEQ LB10C BRANCH IF DATA FOUND +1491 e391 c6 00 LDB #0 ‘NEXT WITHOUT FOR’ ERROR (SHOULD BE CLRB) +1492 e393 20 47 LB10A BRA LB153 PROCESS ERROR +1493 e395 1f 14 LB10C TFR X,S POINT S TO START OF ‘FOR/NEXT’ DATA +1494 e397 30 03 LEAX 3,X POINT X TO FP VALUE OF STEP +1495 e399 bd ee 5d JSR LBC14 COPY A FP NUMBER FROM (X) TO FPA0 +1496 e39c a6 68 LDA 8,S GET THE DIRECTION OF STEP +1497 e39e 97 54 STA FP0SGN SAVE IT AS THE SIGN OF FPA0 +1498 e3a0 9e 3b LDX VARDES POINT (X) TO INDEX VARIABLE DESCRIPTOR +1499 e3a2 bd ec 0b JSR LB9C2 ADD (X) TO FPA0 (STEP TO INDEX) +1500 e3a5 bd ee 7c JSR LBC33 PACK FPA0 AND STORE IT IN ADDRESS +1501 * CONTAINED IN VARDES +1502 e3a8 30 69 LEAX 9,S POINT (X) TO TERMINAL VALUE OF INDEX +1503 e3aa bd ee df JSR LBC96 COMPARE CURRENT INDEX VALUE TO TERMINAL VALUE OF INDEX +1504 e3ad e0 68 SUBB 8,S ACCB = 0 IF TERMINAL VALUE=CURRENT VALUE AND STEP=0 OR IF +1505 * STEP IS POSITIVE AND CURRENT VALUE>TERMINAL VALUE OR +1506 * STEP IS NEGATIVE AND CURRENT VALUE +1552 e3f5 25 13 BCS LB181 BRANCH IF LESS THAN RELATIONAL OPERATORS +1553 e3f7 81 03 CMPA #3 * +1554 e3f9 24 0f BCC LB181 * BRANCH IF GREATER THAN RELATIONAL OPERATORS +1555 e3fb 81 01 CMPA #1 SET CARRY IF ‘>‘ +1556 e3fd 49 ROLA CARRY TO BIT 0 +1557 e3fe 98 3f EORA TRELFL * CARRY SET IF +1558 e400 91 3f CMPA TRELFL * TRELFL = ACCA +1559 e402 25 64 BCS LB1DF BRANCH IF SYNTAX ERROR : == << OR >> +1560 e404 97 3f STA TRELFL BIT 0: >, BIT 1 =, BIT 2: < +1561 e406 9d 7c JSR GETNCH GET AN INPUT CHARACTER +1562 e408 20 e9 BRA LB16A CHECK FOR ANOTHER RELATIONAL OPERATOR +1563 * +1564 e40a d6 3f LB181 LDB TRELFL GET RELATIONAL OPERATOR FLAG +1565 e40c 26 33 BNE LB1B8 BRANCH IF RELATIONAL COMPARISON +1566 e40e 10 24 00 6b LBCC LB1F4 BRANCH IF > RELATIONAL OPERATOR +1567 e412 8b 07 ADDA #7 SEVEN ARITHMETIC/LOGICAL OPERATORS +1568 e414 24 67 BCC LB1F4 BRANCH IF NOT ARITHMETIC/LOGICAL OPERATOR +1569 e416 99 06 ADCA VALTYP ADD CARRY, NUMERIC FLAG AND MODIFIED TOKEN NUMBER +1570 e418 10 27 04 77 LBEQ LB60F BRANCH IF VALTYP = FF, AND ACCA = ‘+‘ TOKEN - +1571 * CONCATENATE TWO STRINGS +1572 e41c 89 ff ADCA #-1 RESTORE ARITHMETIC/LOGICAL OPERATOR NUMBER +1573 e41e 34 02 PSHS A * STORE OPERATOR NUMBER ON STACK; MULTIPLY IT BY 2 +1574 e420 48 ASLA * THEN ADD THE STORED STACK DATA = MULTIPLY +1575 e421 ab e0 ADDA ,S+ * X 3; 3 BYTE/TABLE ENTRY +1576 e423 8e dd 08 LDX #LAA51 JUMP TABLE FOR ARITHMETIC & LOGICAL OPERATORS +1577 e426 30 86 LEAX A,X POINT X TO PROPER TABLE +1578 e428 35 02 LB19F PULS A GET PRECEDENCE FLAG FROM STACK +1579 e42a a1 84 CMPA ,X COMPARE TO CURRENT OPERATOR +1580 e42c 24 55 BCC LB1FA BRANCH IF STACK OPERATOR > CURRENT OPERATOR +1581 e42e 8d 9c BSR LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING +1582 +1583 * OPERATION BEING PROCESSED IS OF HIGHER PRECEDENCE THAN THE PREVIOUS OPERATION. +1584 e430 34 02 LB1A7 PSHS A SAVE PRECEDENCE FLAG +1585 e432 8d 29 BSR LB1D4 PUSH OPERATOR ROUTINE ADDRESS AND FPA0 ONTO STACK +1586 e434 9e 3d LDX RELPTR GET POINTER TO ARITHMETIC/LOGICAL TABLE ENTRY FOR +1587 * LAST CALCULATED OPERATION +1588 e436 35 02 PULS A GET PRECEDENCE FLAG OF PREVIOUS OPERATION +1589 e438 26 1d BNE LB1CE BRANCH IF NOT END OF OPERATION +1590 e43a 4d TSTA CHECK TYPE OF PRECEDENCE FLAG +1591 e43b 10 27 00 6a LBEQ LB220 BRANCH IF END OF EXPRESSION OR SUB-EXPRESSION +1592 e43f 20 4b BRA LB203 EVALUATE AN OPERATION +1593 +1594 e441 08 06 LB1B8 ASL VALTYP BIT 7 OF TYPE FLAG TO CARRY +1595 e443 59 ROLB SHIFT RELATIONAL FLAG LEFT - VALTYP TO BIT 0 +1596 e444 8d 09 BSR LB1C6 MOVE THE INPUT POINTER BACK ONE +1597 e446 8e e4 54 LDX #LB1CB POINT X TO RELATIONAL COMPARISON JUMP TABLE +1598 e449 d7 3f STB TRELFL SAVE RELATIONAL COMPARISON DATA +1599 e44b 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC +1600 e44d 20 d9 BRA LB19F PERFORM OPERATION OR SAVE ON STACK +1601 +1602 e44f 9e 83 LB1C6 LDX CHARAD * GET BASIC’S INPUT POINTER AND +1603 e451 7e e1 68 JMP LAEBB * MOVE IT BACK ONE +1604 * RELATIONAL COMPARISON JUMP TABLE +1605 e454 64 LB1CB FCB $64 RELATIONAL COMPARISON FLAG +1606 e455 e5 78 LB1CC FDB LB2F4 JUMP ADDRESS +1607 +1608 e457 a1 84 LB1CE CMPA ,X COMPARE PRECEDENCE OF LAST DONE OPERATION TO +1609 * NEXT TO BE DONE OPERATION +1610 e459 24 31 BCC LB203 EVALUATE OPERATION IF LOWER PRECEDENCE +1611 e45b 20 d3 BRA LB1A7 PUSH OPERATION DATA ON STACK IF HIGHER PRECEDENCE +1612 +1613 * PUSH OPERATOR EVALUATION ADDRESS AND FPA0 ONTO STACK AND EVALUATE ANOTHER EXPR +1614 e45d ec 01 LB1D4 LDD 1,X GET ADDRESS OF OPERATOR ROUTINE +1615 e45f 34 06 PSHS B,A SAVE IT ON THE STACK +1616 e461 8d 08 BSR LB1E2 PUSH FPA0 ONTO STACK +1617 e463 d6 3f LDB TRELFL GET BACK RELATIONAL OPERATOR FLAG +1618 e465 16 ff 7b LBRA LB15A EVALUATE ANOTHER EXPRESSION +1619 e468 7e e5 00 LB1DF JMP LB277 ‘SYNTAX ERROR’ +1620 * PUSH FPA0 ONTO THE STACK. ,S = EXPONENT +1621 * 1-2,S =HIGH ORDER MANTISSA 3-4,S = LOW ORDER MANTISSA +1622 * 5,S = SIGN RETURN WITH PRECEDENCE CODE IN ACCA +1623 e46b d6 54 LB1E2 LDB FP0SGN GET SIGN OF FPA0 MANTISSA +1624 e46d a6 84 LDA ,X GET PRECEDENCE CODE TO ACCA +1625 e46f 35 20 LB1E6 PULS Y GET RETURN ADDRESS FROM STACK & PUT IT IN Y +1626 e471 34 04 PSHS B SAVE ACCB ON STACK +1627 e473 d6 4f LB1EA LDB FP0EXP * PUSH FPA0 ONTO THE STACK +1628 e475 9e 50 LDX FPA0 * +1629 e477 de 52 LDU FPA0+2 * +1630 e479 34 54 PSHS U,X,B * +1631 e47b 6e a4 JMP ,Y JUMP TO ADDRESS IN Y +1632 +1633 * BRANCH HERE IF NON-OPERATOR CHARACTER FOUND - USUALLY ‘)‘ OR END OF LINE +1634 e47d 9e 74 LB1F4 LDX ZERO POINT X TO DUMMY VALUE (ZERO) +1635 e47f a6 e0 LDA ,S+ GET PRECEDENCE FLAG FROM STACK +1636 e481 27 26 BEQ LB220 BRANCH IF END OF EXPRESSION +1637 e483 81 64 LB1FA CMPA #$64 * CHECK FOR RELATIONAL COMPARISON FLAG +1638 e485 27 03 BEQ LB201 * AND BRANCH IF RELATIONAL COMPARISON +1639 e487 bd e3 cc JSR LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING +1640 e48a 9f 3d LB201 STX RELPTR SAVE POINTER TO OPERATOR ROUTINE +1641 e48c 35 04 LB203 PULS B GET RELATIONAL OPERATOR FLAG FROM STACK +1642 e48e 81 5a CMPA #$5A CHECK FOR ‘NOT’ OPERATOR +1643 e490 27 19 BEQ LB222 RETURN IF ‘NOT’ - NO RELATIONAL COMPARISON +1644 e492 81 7d CMPA #$7D CHECK FOR NEGATION (UNARY) FLAG +1645 e494 27 15 BEQ LB222 RETURN IF NEGATION - NO RELATIONAL COMPARISON +1646 +1647 * EVALUATE AN OPERATION. EIGHT BYTES WILL BE STORED ON STACK, FIRST SIX BYTES +1648 * ARE A TEMPORARY FLOATING POINT RESULT THEN THE ADDRESS OF ROUTINE WHICH +1649 * WILL EVALUATE THE OPERATION. THE RTS AT END OF ROUTINE WILL VECTOR +1650 * TO EVALUATING ROUTINE. +1651 e496 54 LSRB = ROTATE VALTYP BIT INTO CARRY +1652 e497 d7 0a STB RELFLG = FLAG AND SAVE NEW RELFLG +1653 e499 35 52 PULS A,X,U * PULL A FP VALUE OFF OF THE STACK +1654 e49b 97 5c STA FP1EXP * AND SAVE IT IN FPA1 +1655 e49d 9f 5d STX FPA1 * +1656 e49f df 5f STU FPA1+2 * +1657 e4a1 35 04 PULS B = GET MANTISSA SIGN AND +1658 e4a3 d7 61 STB FP1SGN = SAVE IT IN FPA1 +1659 e4a5 d8 54 EORB FP0SGN EOR IT WITH FPA1 MANTISSA SIGN +1660 e4a7 d7 62 STB RESSGN SAVE IT IN RESULT SIGN BYTE +1661 e4a9 d6 4f LB220 LDB FP0EXP GET EXPONENT OF FPA0 +1662 e4ab 39 LB222 RTS +1663 +1664 e4ac bd f6 f9 LB223 JSR XVEC15 CALL EXTENDED BASIC ADD-IN +1665 e4af 0f 06 CLR VALTYP INITIALIZE TYPE FLAG TO NUMERIC +1666 e4b1 9d 7c JSR GETNCH GET AN INPUT CHAR +1667 e4b3 24 03 BCC LB22F BRANCH IF NOT NUMERIC +1668 e4b5 7e ef 5b LB22C JMP LBD12 CONVERT ASCII STRING TO FLOATING POINT - +1669 * RETURN RESULT IN FPA0 +1670 * PROCESS A NON NUMERIC FIRST CHARACTER +1671 e4b8 bd e6 26 LB22F JSR LB3A2 SET CARRY IF NOT ALPHA +1672 e4bb 24 50 BCC LB284 BRANCH IF ALPHA CHARACTER +1673 e4bd 81 2e CMPA #'. IS IT ‘.‘ (DECIMAL POINT)? +1674 e4bf 27 f4 BEQ LB22C CONVERT ASCII STRING TO FLOATING POINT +1675 e4c1 81 a7 CMPA #TOK_MINUS MINUS TOKEN +1676 e4c3 27 40 BEQ LB27C YES - GO PROCESS THE MINUS OPERATOR +1677 e4c5 81 a6 CMPA #TOK_PLUS PLUS TOKEN +1678 e4c7 27 e3 BEQ LB223 YES - GET ANOTHER CHARACTER +1679 e4c9 81 22 CMPA #'" STRING DELIMITER? +1680 e4cb 26 0a BNE LB24E NO +1681 e4cd 9e 83 LB244 LDX CHARAD CURRENT BASIC POINTER TO X +1682 e4cf bd e7 9c JSR LB518 SAVE STRING ON STRING STACK +1683 e4d2 9e 64 LB249 LDX COEFPT * GET ADDRESS OF END OF STRING AND +1684 e4d4 9f 83 STX CHARAD * PUT BASIC’S INPUT POINTER THERE +1685 e4d6 39 RTS +1686 e4d7 81 a3 LB24E CMPA #TOK_NOT NOT TOKEN? +1687 e4d9 26 0d BNE LB25F NO +1688 * PROCESS THE NOT OPERATOR +1689 e4db 86 5a LDA #$5A ‘NOT’ PRECEDENCE FLAG +1690 e4dd bd e3 e3 JSR LB15A PROCESS OPERATION FOLLOWING ‘NOT’ +1691 e4e0 bd e6 71 JSR INTCNV CONVERT FPA0 TO INTEGER IN ACCD +1692 e4e3 43 COMA * ‘NOT’ THE INTEGER +1693 e4e4 53 COMB * +1694 e4e5 7e e7 78 JMP GIVABF CONVERT ACCD TO FLOATING POINT (FPA0) +1695 e4e8 4c LB25F INCA CHECK FOR TOKENS PRECEEDED BY $FF +1696 e4e9 27 2e BEQ LB290 IT WAS PRECEEDED BY $FF +1697 e4eb 8d 06 LB262 BSR LB26A SYNTAX CHECK FOR A ‘(‘ +1698 e4ed bd e3 df JSR LB156 EVALUATE EXPRESSIONS WITHIN PARENTHESES AT +1699 * HIGHEST PRECEDENCE +1700 e4f0 c6 29 LB267 LDB #') SYNTAX CHECK FOR ‘)‘ +1701 e4f2 8c FCB SKP2 SKIP 2 BYTES +1702 e4f3 c6 28 LB26A LDB #'( SYNTAX CHECK FOR ‘(‘ +1703 e4f5 8c FCB SKP2 SKIP 2 BYTES +1704 e4f6 c6 2c LB26D LDB #', SYNTAX CHECK FOR COMMA +1705 e4f8 e1 9f 00 83 LB26F CMPB [CHARAD] * COMPARE ACCB TO CURRENT INPUT +1706 e4fc 26 02 BNE LB277 * CHARACTER - SYNTAX ERROR IF NO MATCH +1707 e4fe 0e 7c JMP GETNCH GET A CHARACTER FROM BASIC +1708 e500 c6 02 LB277 LDB #2*1 SYNTAX ERROR +1709 e502 7e df 03 JMP LAC46 JUMP TO ERROR HANDLER +1710 +1711 * PROCESS THE MINUS (UNARY) OPERATOR +1712 e505 86 7d LB27C LDA #$7D MINUS (UNARY) PRECEDENCE FLAG +1713 e507 bd e3 e3 JSR LB15A PROCESS OPERATION FOLLOWING ‘UNARY’ NEGATION +1714 e50a 7e f1 32 JMP LBEE9 CHANGE SIGN OF FPA0 MANTISSA +1715 +1716 * EVALUATE ALPHA EXPRESSION +1717 e50d bd e5 db LB284 JSR LB357 FIND THE DESCRIPTOR ADDRESS OF A VARIABLE +1718 e510 9f 52 LB287 STX FPA0+2 SAVE DESCRIPTOR ADDRESS IN FPA0 +1719 e512 96 06 LDA VALTYP TEST VARIABLE TYPE +1720 e514 26 95 BNE LB222 RETURN IF STRING +1721 e516 7e ee 5d JMP LBC14 COPY A FP NUMBER FROM (X) TO FPA0 +1722 +1723 * EVALUATING A SECONDARY TOKEN +1724 e519 9d 7c LB290 JSR GETNCH GET AN INPUT CHARACTER (SECONDARY TOKEN) +1725 e51b 1f 89 TFR A,B SAVE IT IN ACCB +1726 e51d 58 ASLB X2 & BET RID OF BIT 7 +1727 e51e 9d 7c JSR GETNCH GET ANOTHER INPUT CHARACTER +1728 e520 c1 38 CMPB #NUM_SEC_FNS-1*2 29 SECONDARY FUNCTIONS - 1 +1729 e522 23 03 BLS LB29F BRANCH IF COLOR BASIC TOKEN +1730 e524 7e e5 00 JMP LB277 SYNTAX ERROR +1731 e527 34 04 LB29F PSHS B SAVE TOKEN OFFSET ON STACK +1732 e529 c1 2a CMPB #TOK_LEFT-$80*2 CHECK FOR TOKEN WITH AN ARGUMENT +1733 e52b 25 1e BCS LB2C7 DO SECONDARIES STRING$ OR LESS +1734 e52d c1 30 CMPB #TOK_INKEY-$80*2 * +1735 e52f 24 1c BCC LB2C9 * DO SECONDARIES $92 (INKEY$) OR > +1736 e531 8d c0 BSR LB26A SYNTAX CHECK FOR A ‘(‘ +1737 e533 a6 e4 LDA ,S GET TOKEN NUMBER +1738 * DO SECONDARIES (LEFT$, RIGHT$, MID$) +1739 e535 bd e3 df JSR LB156 EVALUATE FIRST STRING IN ARGUMENT +1740 e538 8d bc BSR LB26D SYNTAX CHECK FOR A COMMA +1741 e53a bd e3 cf JSR LB146 ‘TM’ ERROR IF NUMERIC VARiABLE +1742 e53d 35 02 PULS A GET TOKEN OFFSET FROM STACK +1743 e53f de 52 LDU FPA0+2 POINT U TO STRING DESCRIPTOR +1744 e541 34 42 PSHS U,A SAVE TOKEN OFFSET AND DESCRIPTOR ADDRESS +1745 e543 bd e9 8f JSR LB70B EVALUATE FIRST NUMERIC ARGUMENT +1746 e546 35 02 PULS A GET TOKEN OFFSET FROM STACK +1747 e548 34 06 PSHS B,A SAVE TOKEN OFFSET AND NUMERIC ARGUMENT +1748 e54a 8e FCB $8E OP CODE OF LDX# - SKlP 2 BYTES +1749 e54b 8d 9e LB2C7 BSR LB262 SYNTAX CHECK FOR A ‘(‘ +1750 e54d 35 04 LB2C9 PULS B GET TOKEN OFFSET +1751 e54f be db f6 LDX COMVEC+8 GET SECONDARY FUNCTION JUMP TABLE ADDRESS +1752 e552 3a LB2CE ABX ADD IN COMMAND OFFSET +1753 * +1754 * HERE IS WHERE WE BRANCH TO A SECONDARY FUNCTION +1755 e553 ad 94 JSR [,X] GO DO AN SECONDARY FUNCTION +1756 e555 7e e3 cc JMP LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING +1757 +1758 * LOGICAL OPERATOR ‘OR’ JUMPS HERE +1759 e558 86 LB2D4 FCB SKP1LD SKIP ONE BYTE - ‘OR’ FLAG = $4F +1760 +1761 * LOGICAL OPERATOR ‘AND’ JUMPS HERE +1762 e559 4f LB2D5 CLRA AND FLAG = 0 +1763 e55a 97 03 STA TMPLOC AND/OR FLAG +1764 e55c bd e6 71 JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD +1765 e55f dd 01 STD CHARAC TEMP SAVE ACCD +1766 e561 bd ee 93 JSR LBC4A MOVE FPA1 TO FPA0 +1767 e564 bd e6 71 JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD +1768 e567 0d 03 TST TMPLOC CHECK AND/OR FLAG +1769 e569 26 06 BNE LB2ED BRANCH IF OR +1770 e56b 94 01 ANDA CHARAC * ‘AND’ ACCD WITH FPA0 INTEGER +1771 e56d d4 02 ANDB ENDCHR * STORED IN ENDCHR +1772 e56f 20 04 BRA LB2F1 CONVERT TO FP +1773 e571 9a 01 LB2ED ORA CHARAC * ‘OR’ ACCD WITH FPA0 INTEGER +1774 e573 da 02 ORB ENDCHR * STORED IN CHARAC +1775 e575 7e e7 78 LB2F1 JMP GIVABF CONVERT THE VALUE IN ACCD INTO A FP NUMBER +1776 +1777 * RELATIONAL COMPARISON PROCESS HANDLER +1778 e578 bd e3 d1 LB2F4 JSR LB148 ‘TM’ ERROR IF TYPE MISMATCH +1779 e57b 26 10 BNE LB309 BRANCH IF STRING VARIABLE +1780 e57d 96 61 LDA FP1SGN * ‘PACK’ THE MANTISSA +1781 e57f 8a 7f ORA #$7F * SIGN OF FPA1 INTO +1782 e581 94 5d ANDA FPA1 * BIT 7 OF THE +1783 e583 97 5d STA FPA1 * MANTISSA MS BYTE +1784 e585 8e 00 5c LDX #FP1EXP POINT X TO FPA1 +1785 e588 bd ee df JSR LBC96 COMPARE FPA0 TO FPA1 +1786 e58b 20 36 BRA LB33F CHECK TRUTH OF RELATIONAL COMPARISON +1787 +1788 * RELATIONAL COMPARISON OF STRINGS +1789 e58d 0f 06 LB309 CLR VALTYP SET VARIABLE TYPE TO NUMERIC +1790 e58f 0a 3f DEC TRELFL REMOVE STRING TYPE FLAG (BIT0=1 FOR STRINGS) FROM THE +1791 * DESIRED RELATIONAL COMPARISON DATA +1792 e591 bd e8 db JSR LB657 GET LENGTH AND ADDRESS OF STRING WHOSE +1793 * DESCRIPTOR ADDRESS IS IN THE BOTTOM OF FPA0 +1794 e594 d7 56 STB STRDES * SAVE LENGTH AND ADDRESS IN TEMPORARY +1795 e596 9f 58 STX STRDES+2 * DESCRIPTOR (STRING B) +1796 e598 9e 5f LDX FPA1+2 = RETURN LENGTH AND ADDRESS OF STRING +1797 e59a bd e8 dd JSR LB659 = WHOSE DESCRIPTOR ADDRESS IS STORED IN FPA1+2 +1798 e59d 96 56 LDA STRDES LOAD ACCA WITH LENGTH OF STRING B +1799 e59f 34 04 PSHS B SAVE LENGTH A ON STACK +1800 e5a1 a0 e0 SUBA ,S+ SUBTRACT LENGTH A FROM LENGTH B +1801 e5a3 27 07 BEQ LB328 BRANCH IF STRINGS OF EQUAL LENGTH +1802 e5a5 86 01 LDA #1 TRUE FLAG +1803 e5a7 24 03 BCC LB328 TRUE IF LENGTH B > LENGTH A +1804 e5a9 d6 56 LDB STRDES LOAD ACCB WITH LENGTH B +1805 e5ab 40 NEGA SET FLAG = FALSE (1FF) +1806 e5ac 97 54 LB328 STA FP0SGN SAVE TRUE/FALSE FLAG +1807 e5ae de 58 LDU STRDES+2 POINT U TO START OF STRING +1808 e5b0 5c INCB COMPENSATE FOR THE DECB BELOW +1809 * ENTER WITH ACCB CONTAINING LENGTH OF SHORTER STRING +1810 e5b1 5a LB32D DECB DECREMENT SHORTER STRING LENGTH +1811 e5b2 26 04 BNE LB334 BRANCH IF ALL OF STRING NOT COMPARED +1812 e5b4 d6 54 LDB FP0SGN GET TRUE/FALSE FLAB +1813 e5b6 20 0b BRA LB33F CHECK TRUTH OF RELATIONAL COMPARISON +1814 e5b8 a6 80 LB334 LDA ,X+ GET A BYTE FROM STRING A +1815 e5ba a1 c0 CMPA ,U+ COMPARE TO STRING B +1816 e5bc 27 f3 BEQ LB32D CHECK ANOTHER CHARACTER IF = +1817 e5be c6 ff LDB #$FF FALSE FLAG IF STRING A > B +1818 e5c0 24 01 BCC LB33F BRANCH IF STRING A > STRING B +1819 e5c2 50 NEGB SET FLAG = TRUE +1820 +1821 * DETERMINE TRUTH OF COMPARISON - RETURN RESULT IN FPA0 +1822 e5c3 cb 01 LB33F ADDB #1 CONVERT $FF,0,1 TO 0,1,2 +1823 e5c5 59 ROLB NOW IT’S 1,2,4 FOR > = < +1824 e5c6 d4 0a ANDB RELFLG ‘AND’ THE ACTUAL COMPARISON WITH THE DESIRED - +1825 COMPARISON +1826 e5c8 27 02 BEQ LB348 BRANCH IF FALSE (NO MATCHING BITS) +1827 e5ca c6 ff LDB #$FF TRUE FLAG +1828 e5cc 7e ee c5 LB348 JMP LBC7C CONVERT ACCB INTO FP NUMBER IN FPA0 +1829 +1830 * DIM +1831 e5cf bd e4 f6 LB34B JSR LB26D SYNTAX CHECK FOR COMMA +1832 e5d2 c6 01 DIM LDB #1 DIMENSION FLAG +1833 e5d4 8d 08 BSR LB35A SAVE ARRAY SPACE FOR THIS VARIABLE +1834 e5d6 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1835 e5d8 26 f5 BNE LB34B KEEP DIMENSIONING IF NOT END OF LINE +1836 e5da 39 RTS +1837 * EVALUATE A VARIABLE - RETURN X AND +1838 * VARPTR POINTING TO VARIABLE DESCRIPTOR +1839 * EACH VARIABLE REQUIRES 7 BYTES - THE FIRST TWO +1840 * BYTES ARE THE VARIABLE NAME AND THE NEXT 5 +1841 * BYTES ARE THE DESCRIPTOR. IF BIT 7 OF THE +1842 * FIRST BYTE OF VARlABLE NAME IS SET, THE +1843 * VARIABLE IS A DEF FN VARIABLE. IF BIT 7 OF +1844 * THE SECOND BYTE OF VARIABLE NAME IS SET, THE +1845 * VARIABLE IS A STRING, OTHERWISE THE VARIABLE +1846 * IS NUMERIC. +1847 * IF THE VARIABLE IS NOT FOUND, A ZERO VARIABLE IS +1848 * INSERTED INTO THE VARIABLE SPACE +1849 e5db 5f LB357 CLRB DIMENSION FLAG = 0; DO NOT SET UP AN ARRAY +1850 e5dc 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1851 e5de d7 05 LB35A STB DIMFLG SAVE ARRAY FLAG +1852 * ENTRY POINT FOR DEF FN VARIABLE SEARCH +1853 e5e0 97 37 LB35C STA VARNAM SAVE INPUT CHARACTER +1854 e5e2 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1855 e5e4 8d 40 BSR LB3A2 SET CARRY IF NOT ALPHA +1856 e5e6 10 25 ff 16 LBCS LB277 SYNTAX ERROR IF NOT ALPHA +1857 e5ea 5f CLRB DEFAULT 2ND VARIABLE CHARACTER TO ZERO +1858 e5eb d7 06 STB VALTYP SET VARIABLE TYPE TO NUMERIC +1859 e5ed 9d 7c JSR GETNCH GET ANOTHER CHARACTER FROM BASIC +1860 e5ef 25 04 BCS LB371 BRANCH IF NUMERIC (2ND CHARACTER IN +1861 * VARIABLE MAY BE NUMERIC) +1862 e5f1 8d 33 BSR LB3A2 SET CARRY IF NOT ALPHA +1863 e5f3 25 0a BCS LB37B BRANCH IF NOT ALPHA +1864 e5f5 1f 89 LB371 TFR A,B SAVE 2ND CHARACTER IN ACCB +1865 * READ INPUT CHARACTERS UNTIL A NON ALPHA OR +1866 * NON NUMERIC IS FOUND - IGNORE ALL CHARACTERS +1867 * IN VARIABLE NAME AFTER THE 1ST TWO +1868 e5f7 9d 7c LB373 JSR GETNCH GET AN INPUT CHARACTER +1869 e5f9 25 fc BCS LB373 BRANCH IF NUMERIC +1870 e5fb 8d 29 BSR LB3A2 SET CARRY IF NOT ALPHA +1871 e5fd 24 f8 BCC LB373 BRANCH IF ALPHA +1872 e5ff 81 24 LB37B CMPA #'$ CHECK FOR A STRING VARIABLE +1873 e601 26 06 BNE LB385 BRANCH IF IT IS NOT A STRING +1874 e603 03 06 COM VALTYP SET VARIABLE TYPE TO STRING +1875 e605 cb 80 ADDB #$80 SET BIT 7 OF 2ND CHARACTER (STRING) +1876 e607 9d 7c JSR GETNCH GET AN INPUT CHARACTER +1877 e609 d7 38 LB385 STB VARNAM+1 SAVE 2ND CHARACTER IN VARNAM+1 +1878 e60b 9a 08 ORA ARYDIS OR IN THE ARRAY DISABLE FLAG - IF = $80, +1879 * DON’T SEARCH FOR VARIABLES IN THE ARRAYS +1880 e60d 80 28 SUBA #'( IS THIS AN ARRAY VARIABLE? +1881 e60f 10 27 00 75 LBEQ LB404 BRANCH IF IT IS +1882 e613 0f 08 CLR ARYDIS RESET THE ARRAY DISABLE FLAG +1883 e615 9e 1b LDX VARTAB POINT X TO THE START OF VARIABLES +1884 e617 dc 37 LDD VARNAM GET VARIABLE IN QUESTION +1885 e619 9c 1d LB395 CMPX ARYTAB COMPARE X TO THE END OF VARIABLES +1886 e61b 27 12 BEQ LB3AB BRANCH IF END OF VARIABLES +1887 e61d 10 a3 81 CMPD ,X++ * COMPARE VARIABLE IN QUESTION TO CURRENT +1888 e620 27 3e BEQ LB3DC * VARIABLE AND BRANCH IF MATCH +1889 e622 30 05 LEAX 5,X = MOVE POINTER TO NEXT VARIABLE AND +1890 e624 20 f3 BRA LB395 = KEEP LOOKING +1891 +1892 * SET CARRY IF NOT UPPER CASE ALPHA +1893 e626 81 41 LB3A2 CMPA #'A * CARRY SET IF < ‘A’ +1894 e628 25 04 BCS LB3AA * +1895 e62a 80 5b SUBA #'Z+1 = +1896 * SUBA #-('Z+1) = CARRY CLEAR IF <= 'Z' +1897 e62c 80 a5 FCB $80,$A5 +1898 e62e 39 LB3AA RTS +1899 * PUT A NEW VARIABLE IN TABLE OF VARIABLES +1900 e62f 8e 00 74 LB3AB LDX #ZERO POINT X TO ZERO LOCATION +1901 e632 ee e4 LDU ,S GET CURRENT RETURN ADDRESS +1902 e634 11 83 e5 10 CMPU #LB287 DID WE COME FROM ‘EVALUATE ALPHA EXPR’? +1903 e638 27 28 BEQ LB3DE YES - RETURN A ZERO VALUE +1904 e63a dc 1f LDD ARYEND * GET END OF ARRAYS ADDRESS AND +1905 e63c dd 43 STD V43 * SAVE IT AT V43 +1906 e63e c3 00 07 ADDD #7 = ADD 7 TO END OF ARRAYS (EACH +1907 e641 dd 41 STD V41 = VARIABLE = 7 BYTES) AND SAVE AT V41 +1908 e643 9e 1d LDX ARYTAB * GET END OF VARIABLES AND SAVE AT V47 +1909 e645 9f 47 STX V47 * +1910 e647 bd de db JSR LAC1E MAKE A SEVEN BYTE SLOT FOR NEW VARIABLE AT +1911 * TOP OF VARIABLES +1912 e64a 9e 41 LDX V41 = GET NEW END OF ARRAYS AND SAVE IT +1913 e64c 9f 1f STX ARYEND = +1914 e64e 9e 45 LDX V45 * GET NEW END OF VARIABLES AND SAVE IT +1915 e650 9f 1d STX ARYTAB * +1916 e652 9e 47 LDX V47 GET OLD END OF VARIABLES +1917 e654 dc 37 LDD VARNAM GET NEW VARIABLE NAME +1918 e656 ed 81 STD ,X++ SAVE VARIABLE NAME +1919 e658 4f CLRA * ZERO OUT THE FP VALUE OF THE NUMERIC +1920 e659 5f CLRB * VARIABLE OR THE LENGTH AND ADDRESS +1921 e65a ed 84 STD ,X * OF A STRING VARIABLE +1922 e65c ed 02 STD 2,X * +1923 e65e a7 04 STA 4,X * +1924 e660 9f 39 LB3DC STX VARPTR STORE ADDRESS OF VARIABLE VALUE +1925 e662 39 LB3DE RTS +1926 * +1927 e663 90 80 00 00 00 LB3DF FCB $90,$80,$00,$00,$00 * FLOATING POINT -32768 +1928 * SMALLEST SIGNED TWO BYTE INTEGER +1929 * +1930 e668 9d 7c LB3E4 JSR GETNCH GET AN INPUT CHARACTER FROM BASIC +1931 e66a bd e3 ca LB3E6 JSR LB141 GO EVALUATE NUMERIC EXPRESSION +1932 e66d 96 54 LB3E9 LDA FP0SGN GET FPA0 MANTISSA SIGN +1933 e66f 2b 5d BMI LB44A ‘FC’ ERROR IF NEGATIVE NUMBER +1934 +1935 +1936 e671 bd e3 cc INTCNV JSR LB143 ‘TM’ ERROR IF STRING VARIABLE +1937 e674 96 4f LDA FP0EXP GET FPA0 EXPONENT +1938 e676 81 90 CMPA #$90 * COMPARE TO 32768 - LARGEST INTEGER EXPONENT AND +1939 e678 25 08 BCS LB3FE * BRANCH IF FPA0 < 32768 +1940 e67a 8e e6 63 LDX #LB3DF POINT X TO FP VALUE OF -32768 +1941 e67d bd ee df JSR LBC96 COMPARE -32768 TO FPA0 +1942 e680 26 4c BNE LB44A ‘FC’ ERROR IF NOT = +1943 e682 bd ef 11 LB3FE JSR LBCC8 CONVERT FPA0 TO A TWO BYTE INTEGER +1944 e685 dc 52 LDD FPA0+2 GET THE INTEGER +1945 e687 39 RTS +1946 * EVALUATE AN ARRAY VARIABLE +1947 e688 dc 05 LB404 LDD DIMFLG GET ARRAY FLAG AND VARIABLE TYPE +1948 e68a 34 06 PSHS B,A SAVE THEM ON STACK +1949 e68c 12 NOP DEAD SPACE CAUSED BY 1.2 REVISION +1950 e68d 5f CLRB RESET DIMENSION COUNTER +1951 e68e 9e 37 LB40A LDX VARNAM GET VARIABLE NAME +1952 e690 34 14 PSHS X,B SAVE VARIABLE NAME AND DIMENSION COUNTER +1953 e692 8d d4 BSR LB3E4 EVALUATE EXPRESSION (DIMENSlON LENGTH) +1954 e694 35 34 PULS B,X,Y PULL OFF VARIABLE NAME, DIMENSlON COUNTER, +1955 * ARRAY FLAG +1956 e696 9f 37 STX VARNAM SAVE VARIABLE NAME AND VARIABLE TYPE +1957 e698 de 52 LDU FPA0+2 GET DIMENSION LENGTH +1958 e69a 34 60 PSHS U,Y SAVE DIMENSION LENGTH, ARRAY FLAG, VARIABLE TYPE +1959 e69c 5c INCB INCREASE DIMENSION COUNTER +1960 e69d 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1961 e69f 81 2c CMPA #', CHECK FOR ANOTHER DIMENSION +1962 e6a1 27 eb BEQ LB40A BRANCH IF MORE +1963 e6a3 d7 03 STB TMPLOC SAVE DIMENSION COUNTER +1964 e6a5 bd e4 f0 JSR LB267 SYNTAX CHECK FOR A ‘)‘ +1965 e6a8 35 06 PULS A,B * RESTORE VARIABLE TYPE AND ARRAY +1966 e6aa dd 05 STD DIMFLG * FLAG - LEAVE DIMENSION LENGTH ON STACK +1967 e6ac 9e 1d LDX ARYTAB GET START OF ARRAYS +1968 e6ae 9c 1f LB42A CMPX ARYEND COMPARE TO END OF ARRAYS +1969 e6b0 27 21 BEQ LB44F BRANCH IF NO MATCH FOUND +1970 e6b2 dc 37 LDD VARNAM GET VARIABLE IN QUESTION +1971 e6b4 10 a3 84 CMPD ,X COMPARE TO CURRENT VARIABLE +1972 e6b7 27 06 BEQ LB43B BRANCH IF = +1973 e6b9 ec 02 LDD 2,X GET OFFSET TO NEXT ARRAY VARIABLE +1974 e6bb 30 8b LEAX D,X ADD TO CURRENT POINTER +1975 e6bd 20 ef BRA LB42A KEEP SEARCHING +1976 e6bf c6 12 LB43B LDB #2*9 ‘REDIMENSIONED ARRAY’ ERROR +1977 e6c1 96 05 LDA DIMFLG * TEST ARRAY FLAG - IF <>0 YOU ARE TRYING +1978 e6c3 26 0b BNE LB44C * TO REDIMENSION AN ARRAY +1979 e6c5 d6 03 LDB TMPLOC GET NUMBER OF DIMENSIONS IN ARRAY +1980 e6c7 e1 04 CMPB 4,X COMPARE TO THIS ARRAYS DIMENSIONS +1981 e6c9 27 59 BEQ LB4A0 BRANCH IF = +1982 e6cb c6 10 LB447 LDB #8*2 ‘BAD SUBSCRIPT’ +1983 e6cd 8c FCB SKP2 SKIP TWO BYTES +1984 e6ce c6 08 LB44A LDB #4*2 ‘ILLEGAL FUNCTION CALL’ +1985 e6d0 7e df 03 LB44C JMP LAC46 JUMP TO ERROR SERVICING ROUTINE +1986 +1987 * INSERT A NEW ARRAY INTO ARRAY VARIABLES +1988 * EACH SET OF ARRAY VARIABLES IS PRECEEDED BY A DE- +1989 * SCRIPTOR BLOCK COMPOSED OF 5+2*N BYTES WHERE N IS THE +1990 * NUMBER OF DIMENSIONS IN THE ARRAY. THE BLOCK IS DEFINED +1991 * AS FOLLOWS: BYTES 0,1:VARIABLE’S NAME; 2,3:TOTAL LENGTH +1992 * OF ARRAY ITEMS AND DESCRIPTOR BLOCK; 4:NUMBER OF DIMEN- +1993 * ISIONS; 5,6:LENGTH OF DIMENSION 1; 7,8:LENGTH OF DIMEN- +1994 * SION 2;… 4+N,5+N:LENGTH OF DIMENSION N. +1995 +1996 e6d3 cc 00 05 LB44F LDD #5 * 5 BYTES/ARRAY ENTRY SAVE AT COEFPT +1997 e6d6 dd 64 STD COEFPT * +1998 e6d8 dc 37 LDD VARNAM = GET NAME OF ARRAY AND SAVE IN +1999 e6da ed 84 STD ,X = FIRST 2 BYTES OF DESCRIPTOR +2000 e6dc d6 03 LDB TMPLOC GET NUMBER OF DIMENSIONS AND SAVE IN +2001 e6de e7 04 STB 4,X * 5TH BYTE OF DESCRIPTOR +2002 e6e0 bd de f0 JSR LAC33 CHECK FOR ROOM FOR DESCRIPTOR IN FREE RAM +2003 e6e3 9f 41 STX V41 TEMPORARILY SAVE DESCRIPTOR ADDRESS +2004 e6e5 c6 0b LB461 LDB #11 * DEFAULT DIMENSION VALUE:X(10) +2005 e6e7 4f CLRA * +2006 e6e8 0d 05 TST DIMFLG = CHECK ARRAY FLAG AND BRANCH IF +2007 e6ea 27 05 BEQ LB46D = NOT DIMENSIONING AN ARRAY +2008 e6ec 35 06 PULS A,B GET DIMENSION LENGTH +2009 e6ee c3 00 01 ADDD #1 ADD ONE (X(0) HAS A LENGTH OF ONE) +2010 e6f1 ed 05 LB46D STD 5,X SAVE LENGTH OF ARRAY DIMENSION +2011 e6f3 8d 5d BSR LB4CE MULTIPLY ACCUM ARRAY SIZE NUMBER LENGTH +2012 * OF NEW DIMENSION +2013 e6f5 dd 64 STD COEFPT TEMP STORE NEW CURRENT ACCUMULATED ARRAY SIZE +2014 e6f7 30 02 LEAX 2,X BUMP POINTER UP TWO +2015 e6f9 0a 03 DEC TMPLOC * DECREMENT DIMENSION COUNTER AND BRANCH IF +2016 e6fb 26 e8 BNE LB461 * NOT DONE WITH ALL DIMENSIONS +2017 e6fd 9f 0f STX TEMPTR SAVE ADDRESS OF (END OF ARRAY DESCRIPTOR - 5) +2018 e6ff d3 0f ADDD TEMPTR ADD TOTAL SIZE OF NEW ARRAY +2019 e701 10 25 f7 fc LBCS LAC44 ‘OM’ ERROR IF > $FFFF +2020 e705 1f 01 TFR D,X SAVE END OF ARRAY IN X +2021 e707 bd de f4 JSR LAC37 MAKE SURE THERE IS ENOUGH FREE RAM FOR ARRAY +2022 e70a 83 00 35 SUBD #STKBUF-5 SUBTRACT OUT THE (STACK BUFFER - 5) +2023 e70d dd 1f STD ARYEND SAVE NEW END OF ARRAYS +2024 e70f 4f CLRA ZERO = TERMINATOR BYTE +2025 e710 30 1f LB48C LEAX -1,X * STORE TWO TERMINATOR BYTES AT +2026 e712 a7 05 STA 5,X * THE END OF THE ARRAY DESCRIPTOR +2027 e714 9c 0f CMPX TEMPTR * +2028 e716 26 f8 BNE LB48C * +2029 e718 9e 41 LDX V41 GET ADDRESS OF START OF DESCRIPTOR +2030 e71a 96 1f LDA ARYEND GET MSB OF END OF ARRAYS; LSB ALREADY THERE +2031 e71c 93 41 SUBD V41 SUBTRACT OUT ADDRESS OF START OF DESCRIPTOR +2032 e71e ed 02 STD 2,X SAVE LENGTH OF (ARRAY AND DESCRIPTOR) +2033 e720 96 05 LDA DIMFLG * GET ARRAY FLAG AND BRANCH +2034 e722 26 2d BNE LB4CD * BACK IF DIMENSIONING +2035 * CALCULATE POINTER TO CORRECT ELEMENT +2036 e724 e6 04 LB4A0 LDB 4,X GET THE NUMBER OF DIMENSIONS +2037 e726 d7 03 STB TMPLOC TEMPORARILY SAVE +2038 e728 4f CLRA * INITIALIZE POINTER +2039 e729 5f CLRB * TO ZERO +2040 e72a dd 64 LB4A6 STD COEFPT SAVE ACCUMULATED POINTER +2041 e72c 35 06 PULS A,B * PULL DIMENSION ARGUMENT OFF THE +2042 e72e dd 52 STD FPA0+2 * STACK AND SAVE IT +2043 e730 10 a3 05 CMPD 5,X COMPARE TO STORED ‘DIM’ ARGUMENT +2044 e733 24 3a BCC LB4EB ‘BS’ ERROR IF > = "DIM" ARGUMENT +2045 e735 de 64 LDU COEFPT * GET ACCUMULATED POINTER AND +2046 e737 27 04 BEQ LB4B9 * BRANCH IF 1ST DIMENSION +2047 e739 8d 17 BSR LB4CE = MULTIPLY ACCUMULATED POINTER AND DIMENSION +2048 e73b d3 52 ADDD FPA0+2 = LENGTH AND ADD TO CURRENT ARGUMENT +2049 e73d 30 02 LB4B9 LEAX 2,X MOVE POINTER TO NEXT DIMENSION +2050 e73f 0a 03 DEC TMPLOC * DECREMENT DIMENSION COUNTER AND +2051 e741 26 e7 BNE LB4A6 * BRANCH IF ANY DIMENSIONS LEFT +2052 * MULTIPLY ACCD BY 5 - 5 BYTES/ARRAY VALUE +2053 e743 ed e3 STD ,--S +2054 e745 58 ASLB +2055 e746 49 ROLA TIMES 2 +2056 e747 58 ASLB +2057 e748 49 ROLA TIMES 4 +2058 e749 e3 e1 ADDD ,S++ TIMES 5 +2059 e74b 30 8b LEAX D,X ADD OFFSET TO START OF ARRAY +2060 e74d 30 05 LEAX 5,X ADJUST POINTER FOR SIZE OF DESCRIPTOR +2061 e74f 9f 39 STX VARPTR SAVE POINTER TO ARRAY VALUE +2062 e751 39 LB4CD RTS +2063 * MULTIPLY 2 BYTE NUMBER IN 5,X BY THE 2 BYTE NUMBER +2064 * IN COEFPT. RETURN RESULT IN ACCD, BS ERROR IF > $FFFF +2065 e752 86 10 LB4CE LDA #16 16 SHIFTS TO DO A MULTIPLY +2066 e754 97 45 STA V45 SHIFT COUNTER +2067 e756 ec 05 LDD 5,X * GET SIZE OF DIMENSION +2068 e758 dd 17 STD BOTSTK * AND SAVE IT +2069 e75a 4f CLRA * ZERO +2070 e75b 5f CLRB * ACCD +2071 e75c 58 LB4D8 ASLB = SHIFT ACCB LEFT +2072 e75d 49 ROLA = ONE BIT +2073 e75e 25 0f BCS LB4EB BS' ERROR IF CARRY +2074 e760 08 65 ASL COEFPT+1 * SHIFT MULTIPLICAND LEFT ONE +2075 e762 09 64 ROL COEFPT * BIT - ADD MULTIPLIER TO ACCUMULATOR +2076 e764 24 04 BCC LB4E6 * IF CARRY <> 0 +2077 e766 d3 17 ADDD BOTSTK ADD MULTIPLIER TO ACCD +2078 e768 25 05 BCS LB4EB BS' ERROR IF CARRY (>$FFFF) +2079 e76a 0a 45 LB4E6 DEC V45 * DECREMENT SHIFT COUNTER +2080 e76c 26 ee BNE LB4D8 * IF NOT DONE +2081 e76e 39 RTS +2082 e76f 7e e6 cb LB4EB JMP LB447 BS' ERROR +2083 * +2084 * MEM +2085 * THIS IS NOT A TRUE INDICATOR OF FREE MEMORY BECAUSE +2086 * BASIC REQUIRES A STKBUF SIZE BUFFER FOR THE STACK +2087 * FOR WHICH MEM DOES NOT ALLOW. +2088 * +2089 e772 1f 40 MEM TFR S,D PUT STACK POINTER INTO ACCD +2090 e774 93 1f SUBD ARYEND SUBTRACT END OF ARRAYS +2091 e776 21 FCB SKP1 SKIP ONE BYTE +2092 *CONVERT THE VALUE IN ACCB INTO A FP NUMBER IN FPA0 +2093 e777 4f LB4F3 CLRA CLEAR MS BYTE OF ACCD +2094 * CONVERT THE VALUE IN ACCD INTO A FLOATING POINT NUMBER IN FPA0 +2095 e778 0f 06 GIVABF CLR VALTYP SET VARIABLE TYPE TO NUMERIC +2096 e77a dd 50 STD FPA0 SAVE ACCD IN TOP OF FACA +2097 e77c c6 90 LDB #$90 EXPONENT REQUIRED IF THE TOP TWO BYTES +2098 * OF FPA0 ARE TO BE TREATED AS AN INTEGER IN FPA0 +2099 e77e 7e ee cb JMP LBC82 CONVERT THE REST OF FPA0 TO AN INTEGER +2100 +2101 * STR$ +2102 e781 bd e3 cc STR JSR LB143 TM' ERROR IF STRING VARIABLE +2103 e784 ce 01 f0 LDU #STRBUF+2 *CONVERT FP NUMBER TO ASCII STRING IN +2104 e787 bd f0 25 JSR LBDDC *THE STRING BUFFER +2105 e78a 32 62 LEAS 2,S PURGE THE RETURN ADDRESS FROM THE STACK +2106 e78c 8e 01 ef LDX #STRBUF+1 *POINT X TO STRING BUFFER AND SAVE +2107 e78f 20 0b BRA LB518 *THE STRING IN THE STRING SPACE +2108 * RESERVE ACCB BYTES OF STRING SPACE. RETURN START +2109 * ADDRESS IN (X) AND FRESPC +2110 e791 9f 4d LB50D STX V4D SAVE X IN V4D +2111 e793 8d 5c LB50F BSR LB56D RESERVE ACCB BYTES IN STRING SPACE +2112 e795 9f 58 LB511 STX STRDES+2 SAVE NEW STRING ADDRESS +2113 e797 d7 56 STB STRDES SAVE LENGTH OF RESERVED BLOCK +2114 e799 39 RTS +2115 e79a 30 1f LB516 LEAX -1,X MOVE POINTER BACK ONE +2116 * SCAN A LINE FROM (X) UNTIL AN END OF LINE FLAG (ZERO) OR +2117 * EITHER OF THE TWO TERMINATORS STORED IN CHARAC OR ENDCHR IS MATCHED. +2118 * THE RESULTING STRING IS STORED IN THE STRING SPACE +2119 * ONLY IF THE START OF THE STRING IS <= STRBUF+2 +2120 e79c 86 22 LB518 LDA #'" * INITIALIZE +2121 e79e 97 01 STA CHARAC * TERMINATORS +2122 e7a0 97 02 LB51A STA ENDCHR * TO " +2123 e7a2 30 01 LB51E LEAX 1,X MOVE POINTER UP ONE +2124 e7a4 9f 62 STX RESSGN TEMPORARILY SAVE START OF STRING +2125 e7a6 9f 58 STX STRDES+2 SAVE START OF STRING IN TEMP DESCRIPTOR +2126 e7a8 c6 ff LDB #-1 INITIALIZE CHARACTER COUNTER TO - 1 +2127 e7aa 5c LB526 INCB INCREMENT CHARACTER COUNTER +2128 e7ab a6 80 LDA ,X+ GET CHARACTER +2129 e7ad 27 0c BEQ LB537 BRANCH IF END OF LINE +2130 e7af 91 01 CMPA CHARAC * CHECK FOR TERMINATORS +2131 e7b1 27 04 BEQ LB533 * IN CHARAC AND ENDCHR +2132 e7b3 91 02 CMPA ENDCHR * DON’T MOVE POINTER BACK +2133 e7b5 26 f3 BNE LB526 * ONE IF TERMINATOR IS "MATCHED" +2134 e7b7 81 22 LB533 CMPA #'" = COMPARE CHARACTER TO STRING DELIMITER +2135 e7b9 27 02 BEQ LB539 = & DON’T MOVE POINTER BACK IF SO +2136 e7bb 30 1f LB537 LEAX -1,X MOVE POINTER BACK ONE +2137 e7bd 9f 64 LB539 STX COEFPT SAVE END OF STRING ADDRESS +2138 e7bf d7 56 STB STRDES SAVE STRING LENGTH IN TEMP DESCRIPTOR +2139 e7c1 de 62 LDU RESSGN GET INITlAL STRING START +2140 e7c3 11 83 01 f0 CMPU #STRBUF+2 COMPARE TO START OF STRING BUFFER +2141 e7c7 22 07 LB543 BHI LB54C BRANCH IF > START OF STRING BUFFER +2142 e7c9 8d c6 BSR LB50D GO RESERVE SPACE FOR THE STRING +2143 e7cb 9e 62 LDX RESSGN POINT X TO THE BEGINNING OF THE STRING +2144 e7cd bd e8 c9 JSR LB645 MOVE (B) BYTES FROM (X) TO +2145 * [FRESPC] - MOVE STRING DATA +2146 * PUT DIRECT PAGE STRING DESCRIPTOR BUFFER DATA +2147 * ON THE STRING STACK. SET VARIABLE TYPE TO STRING +2148 e7d0 9e 0b LB54C LDX TEMPPT GET NEXT AVAILABLE STRING STACK DESCRIPTOR +2149 e7d2 8c 00 f1 CMPX #LINHDR COMPARE TO TOP OF STRING DESCRIPTOR STACK - WAS #CFNBUF +2150 e7d5 26 05 BNE LB558 FORMULA O.K. +2151 e7d7 c6 1e LDB #15*2 STRING FORMULA TOO COMPLEX' ERROR +2152 e7d9 7e df 03 LB555 JMP LAC46 JUMP TO ERROR SERVICING ROUTINE +2153 e7dc 96 56 LB558 LDA STRDES * GET LENGTH OF STRING AND SAVE IT +2154 * STA ,X * IN BYTE 0 OF DESCRIPTOR +2155 e7de a7 00 FCB $A7,$00 +2156 e7e0 dc 58 LDD STRDES+2 = GET START ADDRESS OF ACTUAL STRING +2157 e7e2 ed 02 STD 2,X = AND SAVE IN BYTES 2,3 OF DESCRIPTOR +2158 e7e4 86 ff LDA #$FF * VARIABLE TYPE = STRING +2159 e7e6 97 06 STA VALTYP * SAVE IN VARIABLE TYPE FLAG +2160 e7e8 9f 0d STX LASTPT = SAVE START OF DESCRIPTOR +2161 e7ea 9f 52 STX FPA0+2 = ADDRESS IN LASTPT AND FPA0 +2162 e7ec 30 05 LEAX 5,X 5 BYTES/STRING DESCRIPTOR +2163 e7ee 9f 0b STX TEMPPT NEXT AVAILABLE STRING VARIABLE DESCRIPTOR +2164 e7f0 39 RTS +2165 * RESERVE ACCB BYTES IN STRING STORAGE SPACE +2166 * RETURN WITH THE STARTING ADDRESS OF THE +2167 * RESERVED STRING SPACE IN (X) AND FRESPC +2168 e7f1 0f 07 LB56D CLR GARBFL CLEAR STRING REORGANIZATION FLAG +2169 e7f3 4f LB56F CLRA * PUSH THE LENGTH OF THE +2170 e7f4 34 06 PSHS B,A * STRING ONTO THE STACK +2171 e7f6 dc 23 LDD STRTAB GET START OF STRING VARIABLES +2172 e7f8 a3 e0 SUBD ,S+ SUBTRACT STRING LENGTH +2173 e7fa 10 93 21 CMPD FRETOP COMPARE TO START OF STRING STORAGE +2174 e7fd 25 0a BCS LB585 IF BELOW START, THEN REORGANIZE +2175 e7ff dd 23 STD STRTAB SAVE NEW START OF STRING VARIABLES +2176 e801 9e 23 LDX STRTAB GET START OF STRING VARIABLES +2177 e803 30 01 LEAX 1,X ADD ONE +2178 e805 9f 25 STX FRESPC SAVE START ADDRESS OF NEWLY RESERVED SPACE +2179 e807 35 84 PULS B,PC RESTORE NUMBER OF BYTES RESERVED AND RETURN +2180 e809 c6 1a LB585 LDB #2*13 OUT OF STRING SPACE' ERROR +2181 e80b 03 07 COM GARBFL TOGGLE REORGANIZATiON FLAG +2182 e80d 27 ca BEQ LB555 ERROR IF FRESHLY REORGANIZED +2183 e80f 8d 04 BSR LB591 GO REORGANIZE STRING SPACE +2184 e811 35 04 PULS B GET BACK THE NUMBER OF BYTES TO RESERVE +2185 e813 20 de BRA LB56F TRY TO RESERVE ACCB BYTES AGAIN +2186 * REORGANIZE THE STRING SPACE +2187 e815 9e 27 LB591 LDX MEMSIZ GET THE TOP OF STRING SPACE +2188 e817 9f 23 LB593 STX STRTAB SAVE TOP OF UNORGANIZED STRING SPACE +2189 e819 4f CLRA * ZERO OUT ACCD +2190 e81a 5f CLRB * AND RESET VARIABLE +2191 e81b dd 4b STD V4B * POINTER TO 0 +2192 e81d 9e 21 LDX FRETOP POINT X TO START OF STRING SPACE +2193 e81f 9f 47 STX V47 SAVE POINTER IN V47 +2194 e821 8e 00 c9 LDX #STRSTK POINT X TO START OF STRING DESCRIPTOR STACK +2195 e824 9c 0b LB5A0 CMPX TEMPPT COMPARE TO ADDRESS OF NEXT AVAILABLE DESCRIPTOR +2196 e826 27 04 BEQ LB5A8 BRANCH IF TOP OF STRING STACK +2197 e828 8d 32 BSR LB5D8 CHECK FOR STRING IN UNORGANIZED STRING SPACE +2198 e82a 20 f8 BRA LB5A0 KEEP CHECKING +2199 e82c 9e 1b LB5A8 LDX VARTAB GET THE END OF BASIC PROGRAM +2200 e82e 9c 1d LB5AA CMPX ARYTAB COMPARE TO END OF VARIABLES +2201 e830 27 04 BEQ LB5B2 BRANCH IF AT TOP OF VARIABLES +2202 e832 8d 22 BSR LB5D2 CHECK FOR STRING IN UNORGANIZED STRING SPACE +2203 e834 20 f8 BRA LB5AA KEEP CHECKING VARIABLES +2204 e836 9f 41 LB5B2 STX V41 SAVE ADDRESS OF THE END OF VARIABLES +2205 e838 9e 41 LB5B4 LDX V41 GET CURRENT ARRAY POINTER +2206 e83a 9c 1f LB5B6 CMPX ARYEND COMPARE TO THE END OF ARRAYS +2207 e83c 27 35 BEQ LB5EF BRANCH IF AT END OF ARRAYS +2208 e83e ec 02 LDD 2,X GET LENGTH OF ARRAY AND DESCRIPTOR +2209 e840 d3 41 ADDD V41 * ADD TO CURRENT ARRAY POINTER +2210 e842 dd 41 STD V41 * AND SAVE IT +2211 e844 a6 01 LDA 1,X GET 1ST CHARACTER OF VARIABLE NAME +2212 e846 2a f0 BPL LB5B4 BRANCH IF NUMERIC ARRAY +2213 e848 e6 04 LDB 4,X GET THE NUMBER OF DIMENSIONS IN THIS ARRAY +2214 e84a 58 ASLB MULTIPLY BY 2 +2215 e84b cb 05 ADDB #5 ADD FIVE BYTES (VARIABLE NAME, ARRAY +2216 * LENGTH, NUMBER DIMENSIONS) +2217 e84d 3a ABX X NOW POINTS TO START OF ARRAY ELEMENTS +2218 e84e 9c 41 LB5CA CMPX V41 AT END OF THIS ARRAY? +2219 e850 27 e8 BEQ LB5B6 YES - CHECK FOR ANOTHER +2220 e852 8d 08 BSR LB5D8 CHECK FOR STRING LOCATED IN +2221 * UNORGANIZED STRING SPACE +2222 e854 20 f8 BRA LB5CA KEEP CHECKING ELEMENTS IN THIS ARRAY +2223 e856 a6 01 LB5D2 LDA 1,X GET F1RST BYTE OF VARIABLE NAME +2224 e858 30 02 LEAX 2,X MOVE POINTER TO DESCRIPTOR +2225 e85a 2a 14 BPL LB5EC BRANCH IF VARIABLE IS NUMERIC +2226 * SEARCH FOR STRING - ENTER WITH X POINTING TO +2227 * THE STRING DESCRIPTOR. IF STRING IS STORED +2228 * BETWEEN V47 AND STRTAB, SAVE DESCRIPTOR POINTER +2229 * IN V4B AND RESET V47 TO STRING ADDRESS +2230 e85c e6 84 LB5D8 LDB ,X GET THE LENGTH OF THE STRING +2231 e85e 27 10 BEQ LB5EC BRANCH IF NULL - NO STRING +2232 e860 ec 02 LDD 2,X GET STARTING ADDRESS OF THE STRING +2233 e862 10 93 23 CMPD STRTAB COMPARE TO THE START OF STRING VARIABLES +2234 e865 22 09 BHI LB5EC BRANCH IF THIS STRING IS STORED IN +2235 * THE STRING VARIABLES +2236 e867 10 93 47 CMPD V47 COMPARE TO START OF STRING SPACE +2237 e86a 23 04 BLS LB5EC BRANCH IF NOT STORED IN THE STRING SPACE +2238 e86c 9f 4b STX V4B SAVE VARIABLE POINTER IF STORED IN STRING SPACE +2239 e86e dd 47 STD V47 SAVE STRING STARTING ADDRESS +2240 e870 30 05 LB5EC LEAX 5,X MOVE TO NEXT VARIABLE DESCRIPTOR +2241 e872 39 LB5EE RTS +2242 e873 9e 4b LB5EF LDX V4B GET ADDRESS OF THE DESCRIPTOR FOR THE +2243 * STRING WHICH IS STORED IN THE HIGHEST RAM ADDRESS IN +2244 * THE UNORGANIZED STRING SPACE +2245 e875 27 fb BEQ LB5EE BRANCH IF NONE FOUND AND REORGANIZATION DONE +2246 e877 4f CLRA CLEAR MS BYTE OF LENGTH +2247 e878 e6 84 LDB ,X GET LENGTH OF STRING +2248 e87a 5a DECB SUBTRACT ONE +2249 e87b d3 47 ADDD V47 ADD LENGTH OF STRING TO ITS STARTING ADDRESS +2250 e87d dd 43 STD V43 SAVE AS MOVE STARTING ADDRESS +2251 e87f 9e 23 LDX STRTAB POINT X TO THE START OF ORGANIZED STRING VARIABLES +2252 e881 9f 41 STX V41 SAVE AS MOVE ENDING ADDRESS +2253 e883 bd de dd JSR LAC20 MOVE STRING FROM CURRENT POSITION TO THE +2254 * TOP OF UNORGANIZED STRING SPACE +2255 e886 9e 4b LDX V4B POINT X TO STRING DESCRIPTOR +2256 e888 dc 45 LDD V45 * GET NEW STARTING ADDRESS OF STRING AND +2257 e88a ed 02 STD 2,X * SAVE IT IN DESCRIPTOR +2258 e88c 9e 45 LDX V45 GET NEW TOP OF UNORGANIZED STRING SPACE +2259 e88e 30 1f LEAX -1,X MOVE POINTER BACK ONE +2260 e890 7e e8 17 JMP LB593 JUMP BACK AND REORGANIZE SOME MORE +2261 +2262 +2263 e893 dc 52 LB60F LDD FPA0+2 * GET DESCRIPTOR ADDRESS OF STRING A +2264 e895 34 06 PSHS B,A * AND SAVE IT ON THE STACK +2265 e897 bd e4 ac JSR LB223 GET DESCRIPTOR ADDRESS OF STRING B +2266 e89a bd e3 cf JSR LB146 TM' ERROR IF NUMERIC VARIABLE +2267 e89d 35 10 PULS X * POINT X TO STRING A DESCRIPTOR +2268 e89f 9f 62 STX RESSGN * ADDRESS AND SAVE IT IN RESSGN +2269 e8a1 e6 84 LDB ,X GET LENGTH OF STRING A +2270 e8a3 9e 52 LDX FPA0+2 POINT X TO DESCRIPTOR OF STRING B +2271 e8a5 eb 84 ADDB ,X ADD LENGTH OF STRING B TO STR1NG A +2272 e8a7 24 05 BCC LB62A BRANCH IF LENGTH < 256 +2273 e8a9 c6 1c LDB #2*14 STRING TOO LONG' ERROR IF LENGTH > 255 +2274 e8ab 7e df 03 JMP LAC46 JUMP TO ERROR SERVICING ROUTINE +2275 e8ae bd e7 91 LB62A JSR LB50D RESERVE ROOM IN STRING SPACE FOR NEW STRING +2276 e8b1 9e 62 LDX RESSGN GET DESCRIPTOR ADDRESS OF STRING A +2277 e8b3 e6 84 LDB ,X GET LENGTH OF STRING A +2278 e8b5 8d 10 BSR LB643 MOVE STRING A INTO RESERVED BUFFER IN STRING SPACE +2279 e8b7 9e 4d LDX V4D GET DESCRIPTOR ADDRESS OF STRING B +2280 e8b9 8d 22 BSR LB659 GET LENGTH AND ADDRESS OF STRING B +2281 e8bb 8d 0c BSR LB645 MOVE STRING B INTO REST OF RESERVED BUFFER +2282 e8bd 9e 62 LDX RESSGN POINT X TO DESCRIPTOR OF STRING A +2283 e8bf 8d 1c BSR LB659 DELETE STRING A IF LAST STRING ON STRING STACK +2284 e8c1 bd e7 d0 JSR LB54C PUT STRING DESCRIPTOR ON THE STRING STACK +2285 e8c4 7e e3 f1 JMP LB168 BRANCH BACK TO EXPRESSION EVALUATION +2286 +2287 * MOVE (B) BYTES FROM 2,X TO FRESPC +2288 e8c7 ae 02 LB643 LDX 2,X POINT X TO SOURCE ADDRESS +2289 e8c9 de 25 LB645 LDU FRESPC POINT U TO DESTINATION ADDRESS +2290 e8cb 5c INCB COMPENSATION FOR THE DECB BELOW +2291 e8cc 20 04 BRA LB64E GO MOVE THE BYTES +2292 * MOVE B BYTES FROM (X) TO (U) +2293 e8ce a6 80 LB64A LDA ,X+ * GET A SOURCE BYTE AND MOVE IT +2294 e8d0 a7 c0 STA ,U+ * TO THE DESTINATION +2295 e8d2 5a LB64E DECB DECREMENT BYTE COUNTER +2296 e8d3 26 f9 BNE LB64A BRANCH IF ALL BYTES NOT MOVED +2297 e8d5 df 25 STU FRESPC SAVE ENDING ADDRESS IN FRESPC +2298 e8d7 39 RTS +2299 * RETURN LENGTH (ACCB) AND ADDRESS (X) OF +2300 * STRING WHOSE DESCRIPTOR IS IN FPA0+2 +2301 * DELETE THE STRING IF IT IS THE LAST ONE +2302 * PUT ON THE STRING STACK. REMOVE STRING FROM STRING +2303 * SPACE IF IT IS AT THE BOTTOM OF STRING VARIABLES. +2304 e8d8 bd e3 cf LB654 JSR LB146 TM' ERROR IF VARIABLE TYPE = NUMERIC +2305 e8db 9e 52 LB657 LDX FPA0+2 GET ADDRESS OF SELECTED STRING DESCRIPTOR +2306 e8dd e6 84 LB659 LDB ,X GET LENGTH OF STRING +2307 e8df 8d 18 BSR LB675 * CHECK TO SEE IF THIS STRING DESCRIPTOR WAS +2308 e8e1 26 13 BNE LB672 * THE LAST ONE PUT ON THE STRING STACK AND +2309 * * BRANCH IF NOT +2310 e8e3 ae 07 LDX 5+2,X GET START ADDRESS OF STRING JUST REMOVED +2311 e8e5 30 1f LEAX -1,X MOVE POINTER DOWN ONE +2312 e8e7 9c 23 CMPX STRTAB COMPARE TO START OF STRING VARIABLES +2313 e8e9 26 08 BNE LB66F BRANCH IF THIS STRING IS NOT AT THE BOTTOM +2314 * OF STRING VARIABLES +2315 e8eb 34 04 PSHS B SAVE LENGTH; ACCA WAS CLEARED +2316 e8ed d3 23 ADDD STRTAB * ADD THE LENGTH OF THE JUST REMOVED STRING +2317 e8ef dd 23 STD STRTAB * TO THE START OF STRING VARIABLES - THIS WILL +2318 * * REMOVE THE STRING FROM THE STRING SPACE +2319 e8f1 35 04 PULS B RESTORE LENGTH +2320 e8f3 30 01 LB66F LEAX 1,X ADD ONE TO POINTER +2321 e8f5 39 RTS +2322 e8f6 ae 02 LB672 LDX 2,X *POINT X TO ADDRESS OF STRING NOT +2323 e8f8 39 RTS *ON THE STRING STACK +2324 * REMOVE STRING FROM STRING STACK. ENTER WITH X +2325 * POINTING TO A STRING DESCRIPTOR - DELETE THE +2326 * STRING FROM STACK IF IT IS ON TOP OF THE +2327 * STACK. IF THE STRING IS DELETED, SET THE ZERO FLAG +2328 e8f9 9c 0d LB675 CMPX LASTPT *COMPARE TO LAST USED DESCRIPTOR ADDRESS +2329 e8fb 26 07 BNE LB680 *ON THE STRING STACK, RETURN IF DESCRIPTOR +2330 * *ADDRESS NOT ON THE STRING STACK +2331 e8fd 9f 0b STX TEMPPT SAVE LAST USED DESCRIPTOR AS NEXT AVAILABLE +2332 e8ff 30 1b LEAX -5,X * MOVE LAST USED DESCRIPTOR BACK 5 BYTES +2333 e901 9f 0d STX LASTPT * AND SAVE AS THE LAST USED DESCRIPTOR ADDR +2334 e903 4f CLRA SET ZERO FLAG +2335 e904 39 LB680 RTS +2336 +2337 * LEN +2338 e905 8d 03 LEN BSR LB686 POINT X TO PROPER STRING AND GET LENGTH +2339 e907 7e e7 77 LB683 JMP LB4F3 CONVERT ACCB TO FP NUMBER IN FPA0 +2340 * POINT X TO STRING ADDRESS LOAD LENGTH INTO +2341 * ACCB. ENTER WITH THE STRING DESCRIPTOR IN +2342 * BOTTOM TWO BYTES OF FPA0 +2343 e90a 8d cc LB686 BSR LB654 GET LENGTH AND ADDRESS OF STRING +2344 e90c 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC +2345 e90e 5d TSTB SET FLAGS ACCORDING TO LENGTH +2346 e90f 39 RTS +2347 +2348 * CHR$ +2349 e910 bd e9 92 CHR JSR LB70E CONVERT FPA0 TO AN INTEGER IN ACCD +2350 e913 c6 01 LB68F LDB #1 * RESERVE ONE BYTE IN +2351 e915 bd e7 f1 JSR LB56D * THE STRING SPACE +2352 e918 96 53 LDA FPA0+3 GET ASCII STRING VALUE +2353 e91a bd e7 95 JSR LB511 SAVE RESERVED STRING DESCRIPTOR IN TEMP DESCRIPTOR +2354 e91d a7 84 STA ,X SAVE THE STRING (IT’S ONLY ONE BYTE) +2355 e91f 32 62 LB69B LEAS 2,S PURGE THE RETURN ADDRESS OFF OF THE STACK +2356 e921 7e e7 d0 LB69D JMP LB54C PUT TEMP DESCRIPTOR DATA ONTO STRING STACK +2357 +2358 +2359 e924 8d 02 ASC BSR LB6A4 PUT 1ST CHARACTER OF STRING INTO ACCB +2360 e926 20 df BRA LB683 CONVERT ACCB INTO FP NUMBER IN FPA0 +2361 e928 8d e0 LB6A4 BSR LB686 POINT X TO STRING DESCRIPTOR +2362 e92a 27 5e BEQ LB706 FC' ERROR IF NULL STRING +2363 e92c e6 84 LDB ,X GET FIRST BYTE OF STRING +2364 e92e 39 RTS +2365 +2366 +2367 e92f 8d 48 LEFT BSR LB6F5 GET ARGUMENTS FROM STACK +2368 e931 4f LB6AD CLRA CLEAR STRING POINTER OFFSET - OFFSET = 0 FOR LEFT$ +2369 e932 e1 84 LB6AE CMPB ,X * COMPARE LENGTH PARAMETER TO LENGTH OF +2370 e934 23 03 BLS LB6B5 * STRING AND BRANCH IF LENGTH OF STRING +2371 * >= LENGTH PARAMETER +2372 e936 e6 84 LDB ,X USE LENGTH OF STRING OTHERWISE +2373 e938 4f CLRA CLEAR STRING POINTER OFFSET (0 FOR LEFT$) +2374 e939 34 06 LB6B5 PSHS B,A PUSH PARAMETERS ONTO STACK +2375 e93b bd e7 93 JSR LB50F RESERVE ACCB BYTES IN THE STRING SPACE +2376 e93e 9e 4d LDX V4D POINT X TO STRING DESCRIPTOR +2377 e940 8d 9b BSR LB659 GET ADDRESS OF OLD STRING (X=ADDRESS) +2378 e942 35 04 PULS B * PULL STRING POINTER OFFSET OFF OF THE STACK +2379 e944 3a ABX * AND ADD IT TO STRING ADDRESS +2380 e945 35 04 PULS B PULL LENGTH PARAMETER OFF OF THE STACK +2381 e947 bd e8 c9 JSR LB645 MOVE ACCB BYTES FROM (X) TO [FRESPC] +2382 e94a 20 d5 BRA LB69D PUT TEMP STRING DESCRIPTOR ONTO THE STRING STACK +2383 +2384 * RIGHT$ +2385 e94c 8d 2b RIGHT BSR LB6F5 GET ARGUMENTS FROM STACK +2386 e94e a0 84 SUBA ,X ACCA=LENGTH PARAMETER - LENGTH OF OLD STRING +2387 e950 40 NEGA NOW ACCA = LENGTH OF OLD STRING +2388 e951 20 df BRA LB6AE PUT NEW STRING IN THE STRING SPACE +2389 +2390 * MID$ +2391 e953 c6 ff MID LDB #$FF * GET DEFAULT VALUE OF LENGTH AND +2392 e955 d7 53 STB FPA0+3 * SAVE IT IN FPA0 +2393 e957 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +2394 e959 81 29 CMPA #') ARGUMENT DELIMITER? +2395 e95b 27 05 BEQ LB6DE YES - NO LENGTH PARAMETER GIVEN +2396 e95d bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +2397 e960 8d 2d BSR LB70B EVALUATE NUMERIC EXPRESSION (LENGTH) +2398 e962 8d 15 LB6DE BSR LB6F5 GET ARGUMENTS FROM STACK +2399 e964 27 24 BEQ LB706 FC' ERROR IF NULL STRING +2400 e966 5f CLRB CLEAR LENGTH COUNTER (DEFAULT VALUE) +2401 e967 4a DECA *SUOTRACT ONE FROM POSITION PARAMETER (THESE +2402 e968 a1 84 CMPA ,X *ROUTINES EXPECT 1ST POSITION TO BE ZERO, NOT ONE) +2403 * *AND COMPARE IT TO LENGTH OF OLD STRING +2404 e96a 24 cd BCC LB6B5 IF POSITION > LENGTH OF OLD STRING, THEN NEW +2405 * STRING WILL BE A NULL STRING +2406 e96c 1f 89 TFR A,B SAVE ABSOLUTE POSITION PARAMETER IN ACCB +2407 e96e e0 84 SUBB ,X ACCB=POSITION-LENGTH OF OLD STRING +2408 e970 50 NEGB NOW ACCB=LENGTH OF OLDSTRING-POSITION +2409 e971 d1 53 CMPB FPA0+3 *IF THE AMOUNT OF OLD STRING TO THE RIGHT OF +2410 e973 23 c4 BLS LB6B5 *POSITION IS <= THE LENGTH PARAMETER, BRANCH AND +2411 * USE ALL OF THE STRING TO THE RIGHT OF THE POSITION +2412 * INSTEAD OF THE LENGTH PARAMETER +2413 e975 d6 53 LDB FPA0+3 GET LENGTH OF NEW STRING +2414 e977 20 c0 BRA LB6B5 PUT NEW STRING IN STRING SPACE +2415 * DO A SYNTAX CHECK FOR ")", THEN PULL THE PREVIOUSLY CALCULATED NUMERIC +2416 * ARGUMENT (ACCD) AND STRING ARGUMENT DESCRIPTOR ADDR OFF OF THE STACK +2417 e979 bd e4 f0 LB6F5 JSR LB267 SYNTAX CHECK FOR A ")" +2418 e97c ee e4 LDU ,S LOAD THE RETURN ADDRESS INTO U REGISTER +2419 e97e ae 65 LDX 5,S * GET ADDRESS OF STRING AND +2420 e980 9f 4d STX V4D * SAVE IT IN V4D +2421 e982 a6 64 LDA 4,S = PUT LENGTH OF STRING IN +2422 e984 e6 64 LDB 4,S = BOTH ACCA AND ACCB +2423 e986 32 67 LEAS 7,S REMOVE DESCRIPTOR AND RETURN ADDRESS FROM STACK +2424 e988 1f 35 TFR U,PC JUMP TO ADDRESS IN U REGISTER +2425 e98a 7e e6 ce LB706 JMP LB44A ILLEGAL FUNCTION CALL' +2426 * EVALUATE AN EXPRESSION - RETURN AN INTEGER IN +2427 * ACCB - 'FC' ERROR IF EXPRESSION > 255 +2428 e98d 9d 7c LB709 JSR GETNCH GET NEXT BASIC INPUT CHARACTER +2429 e98f bd e3 ca LB70B JSR LB141 EVALUATE A NUMERIC EXPRESSION +2430 e992 bd e6 6d LB70E JSR LB3E9 CONVERT FPA0 TO INTEGER IN ACCD +2431 e995 4d TSTA TEST MS BYTE OF INTEGER +2432 e996 26 f2 BNE LB706 FC' ERROR IF EXPRESSION > 255 +2433 e998 0e 82 JMP GETCCH GET CURRENT INPUT CHARACTER FROM BASIC +2434 +2435 * VAL +2436 e99a bd e9 0a VAL JSR LB686 POINT X TO STRING ADDRESS +2437 e99d 10 27 02 e1 LBEQ LBA39 IF NULL STRING SET FPA0 +2438 e9a1 de 83 LDU CHARAD SAVE INPUT POINTER IN REGISTER U +2439 e9a3 9f 83 STX CHARAD POINT INPUT POINTER TO ADDRESS OF STRING +2440 e9a5 3a ABX MOVE POINTER TO END OF STRING TERMINATOR +2441 e9a6 a6 84 LDA ,X GET LAST BYTE OF STRING +2442 e9a8 34 52 PSHS U,X,A SAVE INPUT POINTER, STRING TERMINATOR +2443 * ADDRESS AND CHARACTER +2444 e9aa 6f 84 CLR ,X CLEAR STRING TERMINATOR : FOR ASCII - FP CONVERSION +2445 e9ac 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +2446 e9ae bd ef 5b JSR LBD12 CONVERT AN ASCII STRING TO FLOATING POINT +2447 e9b1 35 52 PULS A,X,U RESTORE CHARACTERS AND POINTERS +2448 e9b3 a7 84 STA ,X REPLACE STRING TERMINATOR +2449 e9b5 df 83 STU CHARAD RESTORE INPUT CHARACTER +2450 e9b7 39 RTS +2451 +2452 e9b8 8d 07 LB734 BSR LB73D * EVALUATE AN EXPRESSION, RETURN +2453 e9ba 9f 2b STX BINVAL * THE VALUE IN X; STORE IT IN BINVAL +2454 e9bc bd e4 f6 LB738 JSR LB26D SYNTAX CHECK FOR A COMMA +2455 e9bf 20 ce BRA LB70B EVALUATE EXPRESSION IN RANGE 0 <= X < 256 +2456 * EVALUATE EXPRESSION : RETURN INTEGER PORTION IN X - 'FC' ERROR IF +2457 +2458 e9c1 bd e3 ca LB73D JSR LB141 EVALUATE NUMERIC EXPRESSION +2459 e9c4 96 54 LB740 LDA FP0SGN GET SIGN OF FPA0 MANTISSA +2460 e9c6 2b c2 BMI LB706 ILLEGAL FUNCTION CALL' IF NEGATIVE +2461 e9c8 96 4f LDA FP0EXP GET EXPONENT OF FPA0 +2462 e9ca 81 90 CMPA #$90 COMPARE TO LARGEST POSITIVE INTEGER +2463 e9cc 22 bc BHI LB706 ILLEGAL FUNCTION CALL' IF TOO LARGE +2464 e9ce bd ef 11 JSR LBCC8 SHIFT BINARY POINT TO EXTREME RIGHT OF FPA0 +2465 e9d1 9e 52 LDX FPA0+2 LOAD X WITH LOWER TWO BYTES OF FPA0 +2466 e9d3 39 RTS +2467 +2468 * PEEK +2469 e9d4 8d ee PEEK BSR LB740 CONVERT FPA0 TO INTEGER IN REGISTER X +2470 e9d6 e6 84 LDB ,X GET THE VALUE BEING 'PEEK'ED +2471 e9d8 7e e7 77 JMP LB4F3 CONVERT ACCB INTO A FP NUMBER +2472 +2473 * POKE +2474 e9db 8d db POKE BSR LB734 EVALUATE 2 EXPRESSIONS +2475 e9dd 9e 2b LDX BINVAL GET THE ADDRESS TO BE 'POKE'ED +2476 e9df e7 84 STB ,X STORE THE DATA IN THAT ADDRESS +2477 e9e1 39 RTS +2478 +2479 +2480 * LIST +2481 e9e2 34 01 LIST PSHS CC SAVE ZERO FLAG ON STACK +2482 e9e4 bd e2 14 JSR LAF67 CONVERT DECIMAL LINE NUMBER TO BINARY +2483 e9e7 bd df a2 JSR LAD01 * FIND RAM ADDRESS OF THAT LINE NUMBER AND +2484 e9ea 9f 66 STX LSTTXT * SAVE IT IN LSTTXT +2485 e9ec 35 01 PULS CC GET ZERO FLAG FROM STACK +2486 e9ee 27 12 BEQ LB784 BRANCH IF END OF LINE +2487 e9f0 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +2488 e9f2 27 13 BEQ LB789 BRANCH IF END OF LINE +2489 e9f4 81 a7 CMPA #TOK_MINUS MINUS TOKEN (IS IT A RANGE OF LINE NUMBERS?) +2490 e9f6 26 09 BNE LB783 NO - RETURN +2491 e9f8 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC +2492 e9fa 27 06 BEQ LB784 BRANCH IF END OF LINE +2493 e9fc bd e2 14 JSR LAF67 GET ENDING LINE NUMBER +2494 e9ff 27 06 BEQ LB789 BRANCH IF LEGAL LINE NUMBER +2495 ea01 39 LB783 RTS +2496 * LIST THE ENTIRE PROGRAM +2497 ea02 ce ff ff LB784 LDU #$FFFF * SET THE DEFAULT ENDING LINE NUMBER +2498 ea05 df 2b STU BINVAL * TO $FFFF +2499 ea07 32 62 LB789 LEAS 2,S PURGE RETURN ADDRESS FROM THE STACK +2500 ea09 9e 66 LDX LSTTXT POINT X TO STARTING LINE ADDRESS +2501 ea0b bd eb a9 LB78D JSR LB95C MOVE CURSOR TO START OF A NEW LINE +2502 ea0e bd dc 97 JSR LA549 CHECK FOR A BREAK OR PAUSE +2503 ea11 ec 84 LDD ,X GET ADDRESS OF NEXT BASIC LINE +2504 ea13 26 03 BNE LB79F BRANCH IF NOT END OF PROGRAM +2505 LB797 +2506 ea15 7e df 22 JMP LAC73 RETURN TO BASIC’S MAIN INPUT LOOP +2507 ea18 9f 66 LB79F STX LSTTXT SAVE NEW STARTING LINE ADDRESS +2508 ea1a ec 02 LDD 2,X * GET THE LINE NUMBER OF THIS LINE AND +2509 ea1c 10 93 2b CMPD BINVAL * COMPARE IT TO ENDING LINE NUMBER +2510 ea1f 22 f4 BHI LB797 EXIT IF LINE NUMBER > ENDING LINE NUMBER +2511 ea21 bd f0 15 JSR LBDCC PRINT THE NUMBER IN ACCD ON SCREEN IN DECIMAL +2512 ea24 bd eb f5 JSR LB9AC SEND A SPACE TO CONSOLE OUT +2513 ea27 9e 66 LDX LSTTXT GET RAM ADDRESS OF THIS LINE +2514 ea29 8d 10 BSR LB7C2 UNCRUNCH A LINE +2515 ea2b ae 9f 00 66 LDX [LSTTXT] POINT X TO START OF NEXT LINE +2516 ea2f ce 00 f4 LDU #LINBUF+1 POINT U TO BUFFER FULL OF UNCRUNCHED LINE +2517 ea32 a6 c0 LB7B9 LDA ,U+ GET A BYTE FROM THE BUFFER +2518 ea34 27 d5 BEQ LB78D BRANCH IF END OF BUFFER +2519 ea36 bd eb fa JSR LB9B1 SEND CHARACTER TO CONSOLE OUT +2520 ea39 20 f7 BRA LB7B9 GET ANOTHER CHARACTER +2521 +2522 * UNCRUNCH A LINE INTO BASIC’S LINE INPUT BUFFER +2523 ea3b 30 04 LB7C2 LEAX 4,X MOVE POINTER PAST ADDRESS OF NEXT LINE AND LINE NUMBER +2524 ea3d 10 8e 00 f4 LDY #LINBUF+1 UNCRUNCH LINE INTO LINE INPUT BUFFER +2525 ea41 a6 80 LB7CB LDA ,X+ GET A CHARACTER +2526 ea43 27 51 BEQ LB820 BRANCH IF END OF LINE +2527 ea45 2b 15 BMI LB7E6 BRANCH IF IT’S A TOKEN +2528 ea47 81 3a CMPA #': CHECK FOR END OF SUB LINE +2529 ea49 26 0d BNE LB7E2 BRNCH IF NOT END OF SUB LINE +2530 ea4b e6 84 LDB ,X GET CHARACTER FOLLOWING COLON +2531 ea4d c1 84 CMPB #TOK_ELSE TOKEN FOR ELSE? +2532 ea4f 27 f0 BEQ LB7CB YES - DON’T PUT IT IN BUFFER +2533 ea51 c1 83 CMPB #TOK_SNGL_Q TOKEN FOR REMARK? +2534 ea53 27 ec BEQ LB7CB YES - DON’T PUT IT IN BUFFER +2535 ea55 8c FCB SKP2 SKIP TWO BYTES +2536 ea56 86 21 LB7E0 LDA #'! EXCLAMATION POINT +2537 ea58 8d 30 LB7E2 BSR LB814 PUT CHARACTER IN BUFFER +2538 ea5a 20 e5 BRA LB7CB GET ANOTHER CHARACTER +2539 +2540 ea5c ce db e4 LB7E6 LDU #COMVEC-10 FIRST DO COMMANDS +2541 ea5f 81 ff CMPA #$FF CHECK FOR SECONDARY TOKEN +2542 ea61 26 04 BNE LB7F1 BRANCH IF NON SECONDARY TOKEN +2543 ea63 a6 80 LDA ,X+ GET SECONDARY TOKEN +2544 ea65 33 45 LEAU 5,U BUMP IT UP TO SECONDARY FUNCTIONS +2545 ea67 84 7f LB7F1 ANDA #$7F MASK OFF BIT 7 OF TOKEN +2546 ea69 33 4a LB7F3 LEAU 10,U MOVE TO NEXT COMMAND TABLE +2547 ea6b 6d c4 TST ,U IS THIS TABLE ENABLED? +2548 ea6d 27 e7 BEQ LB7E0 NO - ILLEGAL TOKEN +2549 ea6f a0 c4 SUBA ,U SUBTRACT THE NUMBER OF TOKENS FROM THE CURRENT TOKEN NUMBER +2550 ea71 2a f6 BPL LB7F3 BRANCH IF TOKEN NOT IN THIS TABLE +2551 ea73 ab c4 ADDA ,U RESTORE TOKEN NUMBER RELATIVE TO THIS TABLE +2552 ea75 ee 41 LDU 1,U POINT U TO COMMAND DICTIONARY TABLE +2553 ea77 4a LB801 DECA DECREMENT TOKEN NUMBER +2554 ea78 2b 06 BMI LB80A BRANCH IF THIS IS THE CORRECT TOKEN +2555 * SKIP THROUGH DICTIONARY TABLE TO START OF NEXT TOKEN +2556 ea7a 6d c0 LB804 TST ,U+ GRAB A BYTE +2557 ea7c 2a fc BPL LB804 BRANCH IF BIT 7 NOT SET +2558 ea7e 20 f7 BRA LB801 GO SEE IF THIS IS THE CORRECT TOKEN +2559 ea80 a6 c4 LB80A LDA ,U GET A CHARACTER FROM DICTIONARY TABLE +2560 ea82 8d 06 BSR LB814 PUT CHARACTER IN BUFFER +2561 ea84 6d c0 TST ,U+ CHECK FOR START OF NEXT TOKEN +2562 ea86 2a f8 BPL LB80A BRANCH IF NOT DONE WITH THIS TOKEN +2563 ea88 20 b7 BRA LB7CB GO GET ANOTHER CHARACTER +2564 ea8a 10 8c 01 ed LB814 CMPY #LINBUF+LBUFMX TEST FOR END OF LINE INPUT BUFFER +2565 ea8e 24 06 BCC LB820 BRANCH IF AT END OF BUFFER +2566 ea90 84 7f ANDA #$7F MASK OFF BIT 7 +2567 ea92 a7 a0 STA ,Y+ * SAVE CHARACTER IN BUFFER AND +2568 ea94 6f a4 CLR ,Y * CLEAR NEXT CHARACTER SLOT IN BUFFER +2569 ea96 39 LB820 RTS +2570 * +2571 * CRUNCH THE LINE THAT THE INPUT POINTER IS +2572 * POINTING TO INTO THE LINE INPUT BUFFER +2573 * RETURN LENGTH OF CRUNCHED LINE IN ACCD +2574 * +2575 ea97 9e 83 LB821 LDX CHARAD GET BASIC'S INPUT POINTER ADDRESS +2576 ea99 ce 00 f3 LDU #LINBUF POINT X TO LINE INPUT BUFFER +2577 ea9c 0f 43 LB829 CLR V43 CLEAR ILLEGAL TOKEN FLAG +2578 ea9e 0f 44 CLR V44 CLEAR DATA FLAG +2579 eaa0 a6 80 LB82D LDA ,X+ GET INPUT CHAR +2580 eaa2 27 21 BEQ LB852 BRANCH IF END OF LINE +2581 eaa4 0d 43 TST V43 * CHECK ILLEGAL TOKEN FLAG & BRANCH IF NOT +2582 eaa6 27 0f BEQ LB844 * PROCESSING AN ILLEGAL TOKEN +2583 eaa8 bd e6 26 JSR LB3A2 SET CARRY IF NOT UPPER CASE ALPHA +2584 eaab 24 18 BCC LB852 BRANCH IF UPPER CASE ALPHA +2585 eaad 81 30 CMPA #'0 * DON’T CRUNCH ASCII NUMERIC CHARACTERS +2586 eaaf 25 04 BLO LB842 * BRANCH IF NOT NUMERIC +2587 eab1 81 39 CMPA #'9 * +2588 eab3 23 10 BLS LB852 * BRANCH IF NUMERIC +2589 * END UP HERE IF NOT UPPER CASE ALPHA OR NUMERIC +2590 eab5 0f 43 LB842 CLR V43 CLEAR ILLEGAL TOKEN FLAG +2591 eab7 81 20 LB844 CMPA #SPACE SPACE? +2592 eab9 27 0a BEQ LB852 DO NOT REMOVE SPACES +2593 eabb 97 42 STA V42 SAVE INPUT CHARACTER AS SCAN DELIMITER +2594 eabd 81 22 CMPA #'" CHECK FOR STRING DELIMITER +2595 eabf 27 38 BEQ LB886 BRANCH IF STRING +2596 eac1 0d 44 TST V44 * CHECK DATA FLAG AND BRANCH IF CLEAR +2597 eac3 27 19 BEQ LB86B * DO NOT CRUNCH DATA +2598 eac5 a7 c0 LB852 STA ,U+ SAVE CHARACTER IN BUFFER +2599 eac7 27 06 BEQ LB85C BRANCH IF END OF LINE +2600 eac9 81 3a CMPA #': * CHECK FOR END OF SUBLINE +2601 eacb 27 cf BEQ LB829 * AND RESET FLAGS IF END OF SUBLINE +2602 eacd 20 d1 LB85A BRA LB82D GO GET ANOTHER CHARACTER +2603 eacf 6f c0 LB85C CLR ,U+ * DOUBLE ZERO AT END OF LINE +2604 ead1 6f c0 CLR ,U+ * +2605 ead3 1f 30 TFR U,D SAVE ADDRESS OF END OF LINE IN ACCD +2606 ead5 83 00 f1 SUBD #LINHDR LENGTH OF LINE IN ACCD +2607 ead8 8e 00 f2 LDX #LINBUF-1 * SET THE INPUT POINTER TO ONE BEFORE +2608 eadb 9f 83 STX CHARAD * THE START OF THE CRUNCHED LINE +2609 eadd 39 RTS EXIT 'CRUNCH' +2610 eade 81 3f LB86B CMPA #'? CHECK FOR "?" - PRINT ABBREVIATION +2611 eae0 26 04 BNE LB873 BRANCH IF NOT PRINT ABBREVIATION +2612 eae2 86 87 LDA #TOK_PRINT * GET THE PRINT TOKEN AND SAVE IT +2613 eae4 20 df BRA LB852 * IN BUFFER +2614 eae6 81 27 LB873 CMPA #'' APOSTROPHE IS SAME AS REM +2615 eae8 26 13 BNE LB88A BRANCH IF NOT REMARK +2616 eaea cc 3a 83 LDD #$3A00+TOK_SNGL_Q COLON, REM TOKEN +2617 eaed ed c1 STD ,U++ SAVE IN BUFFER +2618 eaef 0f 42 LB87C CLR V42 SET DELIMITER = 0 (END OF LINE) +2619 eaf1 a6 80 LB87E LDA ,X+ SCAN TILL WE MATCH [V42] +2620 eaf3 27 d0 BEQ LB852 BRANCH IF END OF LINE +2621 eaf5 91 42 CMPA V42 DELIMITER? +2622 eaf7 27 cc BEQ LB852 BRANCH OUT IF SO +2623 eaf9 a7 c0 LB886 STA ,U+ DON’T CRUNCH REMARKS OR STRINGS +2624 eafb 20 f4 BRA LB87E GO GET MORE STRING OR REMARK +2625 eafd 81 30 LB88A CMPA #'0 * LESS THAN ASCII ZERO? +2626 eaff 25 04 BCS LB892 * BRANCH IF SO +2627 eb01 81 3c CMPA #';+1 = CHECK FOR NUMERIC VALUE, COLON OR SEMICOLON +2628 eb03 25 c0 BCS LB852 = AND INSERT IN BUFFER IF SO +2629 eb05 30 1f LB892 LEAX -1,X MOVE INPUT POINTER BACK ONE +2630 eb07 34 50 PSHS U,X SAVE POINTERS TO INPUT STRING, OUTPUT STRING +2631 eb09 0f 41 CLR V41 TOKEN FLAG 0 = COMMAND, FF = SECONDARY +2632 eb0b ce db e4 LDU #COMVEC-10 POINT U TO COMMAND INTERPRETATION +2633 * TABLE FOR BASIC - 10 +2634 eb0e 0f 42 LB89B CLR V42 INITIALIZE V42 AS TOKEN COUNTER +2635 eb10 33 4a LB89D LEAU 10,U MOVE TO NEXT COMMAND INTERPRETATION TABLE +2636 eb12 a6 c4 LDA ,U GET NUMBER OF COMMANDS +2637 eb14 27 31 BEQ LB8D4 GO DO SECONDARY FUNCTIONS IF NO COMMAND TABLE +2638 eb16 10 ae 41 LDY 1,U POINT Y TO COMMAND DICTIONARY TABLE +2639 eb19 ae e4 LB8A6 LDX ,S GET POINTER TO INPUT STRING +2640 eb1b e6 a0 LB8A8 LDB ,Y+ GET A BYTE FROM DICTIONARY TABLE +2641 eb1d e0 80 SUBB ,X+ SUBTRACT INPUT CHARACTER +2642 eb1f 27 fa BEQ LB8A8 LOOP IF SAME +2643 eb21 c1 80 CMPB #$80 LAST CHAR IN RESERVED WORD TABLE HAD +2644 * BIT 7 SET, SO IF WE HAVE $80 HERE +2645 * THEN IT IS A GOOD COMPARE +2646 eb23 26 38 BNE LB8EA BRANCH IF NO MATCH - CHECK ANOTHER COMMAND +2647 eb25 32 62 LEAS 2,S DELETE OLD INPUT POINTER FROM STACK +2648 eb27 35 40 PULS U GET POINTER TO OUTPUT STRING +2649 eb29 da 42 ORB V42 OR IN THE TABLE POSITION TO MAKE THE TOKEN +2650 * - NOTE THAT B ALREADY HAD $80 IN IT - +2651 eb2b 96 41 LDA V41 * CHECK TOKEN FLAG AND BRANCH +2652 eb2d 26 06 BNE LB8C2 * IF SECONDARY +2653 eb2f c1 84 CMPB #TOK_ELSE IS IT ELSE TOKEN? +2654 eb31 26 06 BNE LB8C6 NO +2655 eb33 86 3a LDA #': PUT A COLON (SUBLINE) BEFORE ELSE TOKEN +2656 eb35 ed c1 LB8C2 STD ,U++ SECONDARY TOKENS PRECEEDED BY $FF +2657 eb37 20 94 BRA LB85A GO PROCESS MORE INPUT CHARACTERS +2658 eb39 e7 c0 LB8C6 STB ,U+ SAVE THIS TOKEN +2659 eb3b c1 86 CMPB #TOK_DATA DATA TOKEN? +2660 eb3d 26 02 BNE LB8CE NO +2661 eb3f 0c 44 INC V44 SET DATA FLAG +2662 eb41 c1 82 LB8CE CMPB #TOK_REM REM TOKEN? +2663 eb43 27 aa BEQ LB87C YES +2664 eb45 20 86 LB8D2 BRA LB85A GO PROCESS MORE INPUT CHARACTERS +2665 * CHECK FOR A SECONDARY TOKEN +2666 eb47 ce db e9 LB8D4 LDU #COMVEC-5 NOW DO SECONDARY FUNCTIONS +2667 eb4a 03 41 COM V41 TOGGLE THE TOKEN FLAG +2668 eb4c 26 c0 BNE LB89B BRANCH IF NOW CHECKING SECONDARY COMMANDS +2669 +2670 * THIS CODE WILL PROCESS INPUT DATA WHICH CANNOT BE CRUNCHED AND SO +2671 * IS ASSUMED TO BE ILLEGAL DATA OR AN ILLEGAL TOKEN +2672 eb4e 35 50 PULS X,U RESTORE INPUT AND OUTPUT POINTERS +2673 eb50 a6 80 LDA ,X+ * MOVE THE FIRST CHARACTER OF AN +2674 eb52 a7 c0 STA ,U+ * ILLEGAL TOKEN +2675 eb54 bd e6 26 JSR LB3A2 SET CARRY IF NOT ALPHA +2676 eb57 25 ec BCS LB8D2 BRANCH IF NOT ALPHA +2677 eb59 03 43 COM V43 SET ILLEGAL TOKEN FLAG IF UPPER CASE ALPHA +2678 eb5b 20 e8 BRA LB8D2 PROCESS MORE INPUT CHARACTERS +2679 eb5d 0c 42 LB8EA INC V42 INCREMENT TOKEN COUNTER +2680 eb5f 4a DECA DECR COMMAND COUNTER +2681 eb60 27 ae BEQ LB89D GET ANOTHER COMMAND TABLE IF DONE W/THIS ONE +2682 eb62 31 3f LEAY -1,Y MOVE POINTER BACK ONE +2683 eb64 e6 a0 LB8F1 LDB ,Y+ * GET TO NEXT +2684 eb66 2a fc BPL LB8F1 * RESERVED WORD +2685 eb68 20 af BRA LB8A6 GO SEE IF THIS WORD IS A MATCH +2686 +2687 * PRINT +2688 eb6a 27 39 PRINT BEQ LB958 BRANCH IF NO ARGUMENT +2689 eb6c 8d 01 BSR LB8FE CHECK FOR ALL PRINT OPTIONS +2690 eb6e 39 RTS +2691 LB8FE +2692 eb6f bd fa cf LB918 JSR XVEC9 CALL EXTENDED BASIC ADD-IN +2693 eb72 27 3e LB91B BEQ LB965 RETURN IF END OF LINE +2694 eb74 81 9f LB91D CMPA #TOK_TAB TOKEN FOR TAB( ? +2695 eb76 27 53 BEQ LB97E YES +2696 eb78 81 2c CMPA #', COMMA? +2697 eb7a 27 37 BEQ LB966 YES - ADVANCE TO NEXT TAB FIELD +2698 eb7c 81 3b CMPA #'; SEMICOLON? +2699 eb7e 27 60 BEQ LB997 YES - DO NOT ADVANCE CURSOR +2700 eb80 bd e3 df JSR LB156 EVALUATE EXPRESSION +2701 eb83 96 06 LDA VALTYP * GET VARIABLE TYPE AND +2702 eb85 34 02 PSHS A * SAVE IT ON THE STACK +2703 eb87 26 06 BNE LB938 BRANCH IF STRING VARIABLE +2704 eb89 bd f0 22 JSR LBDD9 CONVERT FP NUMBER TO AN ASCII STRING +2705 eb8c bd e7 9a JSR LB516 PARSE A STRING FROM (X-1) AND PUT +2706 * DESCRIPTOR ON STRING STACK +2707 eb8f 8d 57 LB938 BSR LB99F PRINT STRING POINTED TO BY X +2708 eb91 35 04 PULS B GET VARIABLE TYPE BACK +2709 eb93 bd dc 30 JSR LA35F SET UP TAB WIDTH ZONE, ETC +2710 eb96 5d LB949 TSTB CHECK CURRENT PRINT POSITION +2711 eb97 26 08 BNE LB954 BRANCH IF NOT AT START OF LINE +2712 eb99 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +2713 eb9b 81 2c CMPA #', COMMA? +2714 eb9d 27 14 BEQ LB966 SKIP TO NEXT TAB FIELD +2715 eb9f 8d 54 BSR LB9AC SEND A SPACE TO CONSOLE OUT +2716 eba1 9d 82 LB954 JSR GETCCH GET CURRENT INPUT CHARACTER +2717 eba3 26 cf BNE LB91D BRANCH IF NOT END OF LINE +2718 eba5 86 0d LB958 LDA #CR * SEND A CR TO +2719 eba7 20 51 BRA LB9B1 * CONSOLE OUT +2720 eba9 bd dc 30 LB95C JSR LA35F SET UP TAB WIDTH, ZONE ETC +2721 ebac 27 f7 BEQ LB958 BRANCH IF WIDTH = ZERO +2722 ebae 96 6c LDA DEVPOS GET PRINT POSITION +2723 ebb0 26 f3 BNE LB958 BRANCH IF NOT AT START OF LINE +2724 ebb2 39 LB965 RTS +2725 * SKIP TO NEXT TAB FIELD +2726 ebb3 bd dc 30 LB966 JSR LA35F SET UP TAB WIDTH, ZONE ETC +2727 ebb6 27 0a BEQ LB975 BRANCH IF LINE WIDTH = 0 (CASSETTE) +2728 ebb8 d6 6c LDB DEVPOS GET CURRENT POSITION +2729 ebba d1 6b CMPB DEVLCF COMPARE TO LAST TAB ZONE +2730 ebbc 25 06 BCS LB977 BRANCH IF < LAST TAB ZONE +2731 ebbe 8d e5 BSR LB958 SEND A CARRIAGE RETURN TO CONSOLE OUT +2732 ebc0 20 1e BRA LB997 GET MORE DATA +2733 ebc2 d6 6c LB975 LDB DEVPOS * +2734 ebc4 d0 6a LB977 SUBB DEVCFW * SUBTRACT TAB FIELD WIDTH FROM CURRENT +2735 ebc6 24 fc BCC LB977 * POSITION UNTIL CARRY SET - NEGATING THE +2736 ebc8 50 NEGB * REMAINDER LEAVES THE NUMBER OF SPACES TO NEXT +2737 * * TAB ZONE IN ACCB +2738 ebc9 20 10 BRA LB98E GO ADVANCE TO NEXT TAB ZONE +2739 +2740 * PRINT TAB( +2741 ebcb bd e9 8d LB97E JSR LB709 EVALUATE EXPRESSION - RETURN VALUE IN B +2742 ebce 81 29 CMPA #') * 'SYNTAX' ERROR IF NOT ')' +2743 ebd0 10 26 f9 2c LBNE LB277 * +2744 ebd4 bd dc 30 JSR LA35F SET UP TAB WIDTH, ZONE ETC +2745 ebd7 d0 6c SUBB DEVPOS GET DIFFERENCE OF PRINT POSITION & TAB POSITION +2746 ebd9 23 05 BLS LB997 BRANCH IF TAB POSITION < CURRENT POSITION +2747 LB98E +2748 ebdb 8d 18 LB992 BSR LB9AC SEND A SPACE TO CONSOLE OUT +2749 ebdd 5a DECB DECREMENT DIFFERENCE COUNT +2750 ebde 26 fb BNE LB992 BRANCH UNTIL CURRENT POSITION = TAB POSITION +2751 ebe0 9d 7c LB997 JSR GETNCH GET NEXT CHARACTER FROM BASIC +2752 ebe2 7e eb 72 JMP LB91B LOOK FOR MORE PRINT DATA +2753 * COPY A STRING FROM (X) TO CONSOLE OUT +2754 ebe5 bd e7 9c LB99C JSR LB518 PARSE A STRING FROM X AND PUT +2755 * DESCRIPTOR ON STRING STACK +2756 ebe8 bd e8 db LB99F JSR LB657 GET LENGTH OF STRING AND REMOVE +2757 * DESCRIPTOR FROM STRING STACK +2758 ebeb 5c INCB COMPENSATE FOR DECB BELOW +2759 ebec 5a LB9A3 DECB DECREMENT COUNTER +2760 ebed 27 c3 BEQ LB965 EXIT ROUTINE +2761 ebef a6 80 LDA ,X+ GET A CHARACTER FROM X +2762 ebf1 8d 07 BSR LB9B1 SEND TO CONSOLE OUT +2763 ebf3 20 f7 BRA LB9A3 KEEP LOOPING +2764 ebf5 86 20 LB9AC LDA #SPACE SPACE TO CONSOLE OUT +2765 ebf7 8c FCB SKP2 SKIP NEXT TWO BYTES +2766 ebf8 86 3f LB9AF LDA #'? QUESTION MARK TO CONSOLE OUT +2767 ebfa 7e db 14 LB9B1 JMP PUTCHR JUMP TO CONSOLE OUT +2768 +2769 * FLOATING POINT MATH PACKAGE +2770 +2771 * ADD .5 TO FPA0 +2772 ebfd 8e f1 09 LB9B4 LDX #LBEC0 FLOATING POINT CONSTANT (.5) +2773 ec00 20 09 BRA LB9C2 ADD .5 TO FPA0 +2774 * SUBTRACT FPA0 FROM FP NUMBER POINTED +2775 * TO BY (X), LEAVE RESULT IN FPA0 +2776 ec02 bd ed 78 LB9B9 JSR LBB2F COPY PACKED FP DATA FROM (X) TO FPA1 +2777 +2778 * ARITHMETIC OPERATION (-) JUMPS HERE - SUBTRACT FPA0 FROM FPA1 (ENTER +2779 * WITH EXPONENT OF FPA0 IN ACCB AND EXPONENT OF FPA1 IN ACCA) +2780 ec05 03 54 LB9BC COM FP0SGN CHANGE MANTISSA SIGN OF FPA0 +2781 ec07 03 62 COM RESSGN REVERSE RESULT SIGN FLAG +2782 ec09 20 03 BRA LB9C5 GO ADD FPA1 AND FPA0 +2783 * ADD FP NUMBER POINTED TO BY +2784 * (X) TO FPA0 - LEAVE RESULT IN FPA0 +2785 ec0b bd ed 78 LB9C2 JSR LBB2F UNPACK PACKED FP DATA FROM (X) TO +2786 * FPA1; RETURN EXPONENT OF FPA1 IN ACCA +2787 +2788 * ARITHMETIC OPERATION (+) JUMPS HERE - ADD FPA0 TO +2789 +2790 ec0e 5d LB9C5 TSTB CHECK EXPONENT OF FPA0 +2791 ec0f 10 27 02 80 LBEQ LBC4A COPY FPA1 TO FPA0 IF FPA0 = +2792 ec13 8e 00 5c LDX #FP1EXP POINT X TO FPA1 +2793 ec16 1f 89 LB9CD TFR A,B PUT EXPONENT OF FPA1 INTO ACCB +2794 ec18 5d TSTB CHECK EXPONENT +2795 ec19 27 6c BEQ LBA3E RETURN IF EXPONENT = 0 (ADDING 0 TO FPA0) +2796 ec1b d0 4f SUBB FP0EXP SUBTRACT EXPONENT OF FPA0 FROM EXPONENT OF FPA1 +2797 ec1d 27 69 BEQ LBA3F BRANCH IF EXPONENTS ARE EQUAL +2798 ec1f 25 0a BCS LB9E2 BRANCH IF EXPONENT FPA0 > FPA1 +2799 ec21 97 4f STA FP0EXP REPLACE FPA0 EXPONENT WITH FPA1 EXPONENT +2800 ec23 96 61 LDA FP1SGN * REPLACE FPA0 MANTISSA SIGN +2801 ec25 97 54 STA FP0SGN * WITH FPA1 MANTISSA SIGN +2802 ec27 8e 00 4f LDX #FP0EXP POINT X TO FPA0 +2803 ec2a 50 NEGB NEGATE DIFFERENCE OF EXPONENTS +2804 ec2b c1 f8 LB9E2 CMPB #-8 TEST DIFFERENCE OF EXPONENTS +2805 ec2d 2f 59 BLE LBA3F BRANCH IF DIFFERENCE OF EXPONENTS <= 8 +2806 ec2f 4f CLRA CLEAR OVERFLOW BYTE +2807 ec30 64 01 LSR 1,X SHIFT MS BYTE OF MANTISSA; BIT 7 = 0 +2808 ec32 bd ed 03 JSR LBABA GO SHIFT MANTISSA OF (X) TO THE RIGHT (B) TIMES +2809 ec35 d6 62 LB9EC LDB RESSGN GET SIGN FLAG +2810 ec37 2a 0b BPL LB9FB BRANCH IF FPA0 AND FPA1 SIGNS ARE THE SAME +2811 ec39 63 01 COM 1,X * COMPLEMENT MANTISSA POINTED +2812 ec3b 63 02 COM 2,X * TO BY (X) THE +2813 ec3d 63 03 COM 3,X * ADCA BELOW WILL +2814 ec3f 63 04 COM 4,X * CONVERT THIS OPERATION +2815 ec41 43 COMA * INTO A NEG (MANTISSA) +2816 ec42 89 00 ADCA #0 ADD ONE TO ACCA - COMA ALWAYS SETS THE CARRY FLAG +2817 * THE PREVIOUS TWO BYTES MAY BE REPLACED BY A NEGA +2818 * +2819 * ADD MANTISSAS OF FPA0 AND FPA1, PUT RESULT IN FPA0 +2820 ec44 97 63 LB9FB STA FPSBYT SAVE FPA SUB BYTE +2821 ec46 96 53 LDA FPA0+3 * ADD LS BYTE +2822 ec48 99 60 ADCA FPA1+3 * OF MANTISSA +2823 ec4a 97 53 STA FPA0+3 SAVE IN FPA0 LSB +2824 ec4c 96 52 LDA FPA0+2 * ADD NEXT BYTE +2825 ec4e 99 5f ADCA FPA1+2 * OF MANTISSA +2826 ec50 97 52 STA FPA0+2 SAVE IN FPA0 +2827 ec52 96 51 LDA FPA0+1 * ADD NEXT BYTE +2828 ec54 99 5e ADCA FPA1+1 * OF MANTISSA +2829 ec56 97 51 STA FPA0+1 SAVE IN FPA0 +2830 ec58 96 50 LDA FPA0 * ADD MS BYTE +2831 ec5a 99 5d ADCA FPA1 * OF MANTISSA +2832 ec5c 97 50 STA FPA0 SAVE IN FPA0 +2833 ec5e 5d TSTB TEST SIGN FLAG +2834 ec5f 2a 44 BPL LBA5C BRANCH IF FPA0 & FPA1 SIGNS WERE ALIKE +2835 ec61 25 02 LBA18 BCS LBA1C BRANCH IF POSITIVE MANTISSA +2836 ec63 8d 5d BSR LBA79 NEGATE FPA0 MANTISSA +2837 +2838 * NORMALIZE FPA0 +2839 ec65 5f LBA1C CLRB CLEAR TEMPORARY EXPONENT ACCUMULATOR +2840 ec66 96 50 LBA1D LDA FPA0 TEST MSB OF MANTISSA +2841 ec68 26 2e BNE LBA4F BRANCH IF <> 0 +2842 ec6a 96 51 LDA FPA0+1 * IF THE MSB IS +2843 ec6c 97 50 STA FPA0 * 0, THEN SHIFT THE +2844 ec6e 96 52 LDA FPA0+2 * MANTISSA A WHOLE BYTE +2845 ec70 97 51 STA FPA0+1 * AT A TIME. THIS +2846 ec72 96 53 LDA FPA0+3 * IS FASTER THAN ONE +2847 ec74 97 52 STA FPA0+2 * BIT AT A TIME +2848 ec76 96 63 LDA FPSBYT * BUT USES MORE MEMORY. +2849 ec78 97 53 STA FPA0+3 * FPSBYT, THE CARRY IN +2850 ec7a 0f 63 CLR FPSBYT * BYTE, REPLACES THE MATISSA LSB. +2851 ec7c cb 08 ADDB #8 SHIFTING ONE BYTE = 8 BIT SHIFTS; ADD 8 TO EXPONENT +2852 ec7e c1 28 CMPB #5*8 CHECK FOR 5 SHIFTS +2853 ec80 2d e4 BLT LBA1D BRANCH IF < 5 SHIFTS, IF > 5, THEN MANTISSA = 0 +2854 ec82 4f LBA39 CLRA A ZERO EXPONENT = 0 FLOATING POINT +2855 ec83 97 4f LBA3A STA FP0EXP ZERO OUT THE EXPONENT +2856 ec85 97 54 STA FP0SGN ZERO OUT THE MANTISSA SIGN +2857 ec87 39 LBA3E RTS +2858 ec88 8d 6d LBA3F BSR LBAAE SHIFT FPA0 MANTISSA TO RIGHT +2859 ec8a 5f CLRB CLEAR CARRY FLAG +2860 ec8b 20 a8 BRA LB9EC +2861 * SHIFT FPA0 LEFT ONE BIT UNTIL BIT 7 +2862 * OF MATISSA MS BYTE = 1 +2863 ec8d 5c LBA44 INCB ADD ONE TO EXPONENT ACCUMULATOR +2864 ec8e 08 63 ASL FPSBYT SHIFT SUB BYTE ONE LEFT +2865 ec90 09 53 ROL FPA0+3 SHIFT LS BYTE +2866 ec92 09 52 ROL FPA0+2 SHIFT NS BYTE +2867 ec94 09 51 ROL FPA0+1 SHIFT NS BYTE +2868 ec96 09 50 ROL FPA0 SHIFT MS BYTE +2869 ec98 2a f3 LBA4F BPL LBA44 BRANCH IF NOT YET NORMALIZED +2870 ec9a 96 4f LDA FP0EXP GET CURRENT EXPONENT +2871 ec9c 34 04 PSHS B SAVE EXPONENT MODIFIER CAUSED BY NORMALIZATION +2872 ec9e a0 e0 SUBA ,S+ SUBTRACT ACCUMULATED EXPONENT MODIFIER +2873 eca0 97 4f STA FP0EXP SAVE AS NEW EXPONENT +2874 eca2 23 de BLS LBA39 SET FPA0 = 0 IF THE NORMALIZATION CAUSED +2875 * MORE OR EQUAL NUMBER OF LEFT SHIFTS THAN THE +2876 * SIZE OF THE EXPONENT +2877 eca4 8c FCB SKP2 SKIP 2 BYTES +2878 eca5 25 08 LBA5C BCS LBA66 BRANCH IF MANTISSA OVERFLOW +2879 eca7 08 63 ASL FPSBYT SUB BYTE BIT 7 TO CARRY - USE AS ROUND-OFF +2880 * FLAG (TRUNCATE THE REST OF SUB BYTE) +2881 eca9 86 00 LDA #0 CLRA, BUT DO NOT CHANGE CARRY FLAG +2882 ecab 97 63 STA FPSBYT CLEAR THE SUB BYTE +2883 ecad 20 0c BRA LBA72 GO ROUND-OFF RESULT +2884 ecaf 0c 4f LBA66 INC FP0EXP INCREMENT EXPONENT - MULTIPLY BY 2 +2885 ecb1 27 28 BEQ LBA92 OVERFLOW ERROR IF CARRY PAST $FF +2886 ecb3 06 50 ROR FPA0 * SHIFT MANTISSA +2887 ecb5 06 51 ROR FPA0+1 * ONE TO +2888 ecb7 06 52 ROR FPA0+2 * THE RIGHT - +2889 ecb9 06 53 ROR FPA0+3 * DIVIDE BY TWO +2890 ecbb 24 04 LBA72 BCC LBA78 BRANCH IF NO ROUND-OFF NEEDED +2891 ecbd 8d 0d BSR LBA83 ADD ONE TO MANTISSA - ROUND OFF +2892 ecbf 27 ee BEQ LBA66 BRANCH iF OVERFLOW - MANTISSA = 0 +2893 ecc1 39 LBA78 RTS +2894 * NEGATE FPA0 MANTISSA +2895 ecc2 03 54 LBA79 COM FP0SGN TOGGLE SIGN OF MANTISSA +2896 ecc4 03 50 LBA7B COM FPA0 * COMPLEMENT ALL 4 MANTISSA BYTES +2897 ecc6 03 51 COM FPA0+1 * +2898 ecc8 03 52 COM FPA0+2 * +2899 ecca 03 53 COM FPA0+3 * +2900 * ADD ONE TO FPA0 MANTISSA +2901 eccc 9e 52 LBA83 LDX FPA0+2 * GET BOTTOM 2 MANTISSA +2902 ecce 30 01 LEAX 1,X * BYTES, ADD ONE TO +2903 ecd0 9f 52 STX FPA0+2 * THEM AND SAVE THEM +2904 ecd2 26 06 BNE LBA91 BRANCH IF NO OVERFLOW +2905 ecd4 9e 50 LDX FPA0 * IF OVERFLOW ADD ONE +2906 ecd6 30 01 LEAX 1,X * TO TOP 2 MANTISSA +2907 ecd8 9f 50 STX FPA0 * BYTES AND SAVE THEM +2908 ecda 39 LBA91 RTS +2909 ecdb c6 0a LBA92 LDB #2*5 OV' OVERFLOW ERROR +2910 ecdd 7e df 03 JMP LAC46 PROCESS AN ERROR +2911 ece0 8e 00 12 LBA97 LDX #FPA2-1 POINT X TO FPA2 +2912 * SHIFT FPA POINTED TO BY (X) TO +2913 * THE RIGHT -(B) TIMES. EXIT WITH +2914 * ACCA CONTAINING DATA SHIFTED OUT +2915 * TO THE RIGHT (SUB BYTE) AND THE DATA +2916 * SHIFTED IN FROM THE LEFT WILL COME FROM FPCARY +2917 ece3 a6 04 LBA9A LDA 4,X GET LS BYTE OF MANTISSA (X) +2918 ece5 97 63 STA FPSBYT SAVE IN FPA SUB BYTE +2919 ece7 a6 03 LDA 3,X * SHIFT THE NEXT THREE BYTES OF THE +2920 ece9 a7 04 STA 4,X * MANTISSA RIGHT ONE COMPLETE BYTE. +2921 eceb a6 02 LDA 2,X * +2922 eced a7 03 STA 3,X * +2923 ecef a6 01 LDA 1,X * +2924 ecf1 a7 02 STA 2,X * +2925 ecf3 96 5b LDA FPCARY GET THE CARRY IN BYTE +2926 ecf5 a7 01 STA 1,X STORE AS THE MS MANTISSA BYTE OF (X) +2927 ecf7 cb 08 LBAAE ADDB #8 ADD 8 TO DIFFERENCE OF EXPONENTS +2928 ecf9 2f e8 BLE LBA9A BRANCH IF EXPONENT DIFFERENCE < -8 +2929 ecfb 96 63 LDA FPSBYT GET FPA SUB BYTE +2930 ecfd c0 08 SUBB #8 CAST OUT THE 8 ADDED IN ABOVE +2931 ecff 27 0c BEQ LBAC4 BRANCH IF EXPONENT DIFFERENCE = 0 +2932 +2933 +2934 ed01 67 01 LBAB8 ASR 1,X * SHIFT MANTISSA AND SUB BYTE ONE BIT TO THE RIGHT +2935 ed03 66 02 LBABA ROR 2,X * +2936 ed05 66 03 ROR 3,X * +2937 ed07 66 04 ROR 4,X * +2938 ed09 46 RORA * +2939 ed0a 5c INCB ADD ONE TO EXPONENT DIFFERENCE +2940 ed0b 26 f4 BNE LBAB8 BRANCH IF EXPONENTS NOT = +2941 ed0d 39 LBAC4 RTS +2942 ed0e 81 00 00 00 00 LBAC5 FCB $81,$00,$00,$00,$00 FLOATING POINT CONSTANT 1.0 +2943 +2944 * ARITHMETIC OPERATION (*) JUMPS HERE - MULTIPLY +2945 * FPA0 BY (X) - RETURN PRODUCT IN FPA0 +2946 ed13 8d 63 LBACA BSR LBB2F MOVE PACKED FPA FROM (X) TO FPA1 +2947 ed15 27 60 LBACC BEQ LBB2E BRANCH IF EXPONENT OF FPA0 = 0 +2948 ed17 8d 78 BSR LBB48 CALCULATE EXPONENT OF PRODUCT +2949 * MULTIPLY FPA0 MANTISSA BY FPA1. NORMALIZE +2950 * HIGH ORDER BYTES OF PRODUCT IN FPA0. THE +2951 * LOW ORDER FOUR BYTES OF THE PRODUCT WILL +2952 * BE STORED IN VAB-VAE. +2953 ed19 86 00 LBAD0 LDA #0 * ZERO OUT MANTISSA OF FPA2 +2954 ed1b 97 13 STA FPA2 * +2955 ed1d 97 14 STA FPA2+1 * +2956 ed1f 97 15 STA FPA2+2 * +2957 ed21 97 16 STA FPA2+3 * +2958 ed23 d6 53 LDB FPA0+3 GET LS BYTE OF FPA0 +2959 ed25 8d 22 BSR LBB00 MULTIPLY BY FPA1 +2960 ed27 d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 4 +2961 ed29 d7 8b STB VAE * +2962 ed2b d6 52 LDB FPA0+2 GET NUMBER 3 MANTISSA BYTE OF FPA0 +2963 ed2d 8d 1a BSR LBB00 MULTIPLY BY FPA1 +2964 ed2f d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 3 +2965 ed31 d7 8a STB VAD * +2966 ed33 d6 51 LDB FPA0+1 GET NUMBER 2 MANTISSA BYTE OF FPA0 +2967 ed35 8d 12 BSR LBB00 MULTIPLY BY FPA1 +2968 ed37 d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 2 +2969 ed39 d7 89 STB VAC * +2970 ed3b d6 50 LDB FPA0 GET MS BYTE OF FPA0 MANTISSA +2971 ed3d 8d 0c BSR LBB02 MULTIPLY BY FPA1 +2972 ed3f d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 1 +2973 ed41 d7 88 STB VAB * +2974 ed43 bd ee 54 JSR LBC0B COPY MANTISSA FROM FPA2 TO FPA0 +2975 ed46 7e ec 65 JMP LBA1C NORMALIZE FPA0 +2976 ed49 27 95 LBB00 BEQ LBA97 SHIFT FPA2 ONE BYTE TO RIGHT +2977 ed4b 43 LBB02 COMA SET CARRY FLAG +2978 * MULTIPLY FPA1 MANTISSA BY ACCB AND +2979 * ADD PRODUCT TO FPA2 MANTISSA +2980 ed4c 96 13 LBB03 LDA FPA2 GET FPA2 MS BYTE +2981 ed4e 56 RORB ROTATE CARRY FLAG INTO SHIFT COUNTER; +2982 * DATA BIT INTO CARRY +2983 ed4f 27 26 BEQ LBB2E BRANCH WHEN 8 SHIFTS DONE +2984 ed51 24 16 BCC LBB20 DO NOT ADD FPA1 IF DATA BIT = 0 +2985 ed53 96 16 LDA FPA2+3 * ADD MANTISSA LS BYTE +2986 ed55 9b 60 ADDA FPA1+3 * +2987 ed57 97 16 STA FPA2+3 * +2988 ed59 96 15 LDA FPA2+2 = ADD MANTISSA NUMBER 3 BYTE +2989 ed5b 99 5f ADCA FPA1+2 = +2990 ed5d 97 15 STA FPA2+2 = +2991 ed5f 96 14 LDA FPA2+1 * ADD MANTISSA NUMBER 2 BYTE +2992 ed61 99 5e ADCA FPA1+1 * +2993 ed63 97 14 STA FPA2+1 * +2994 ed65 96 13 LDA FPA2 = ADD MANTISSA MS BYTE +2995 ed67 99 5d ADCA FPA1 = +2996 ed69 46 LBB20 RORA * ROTATE CARRY INTO MS BYTE +2997 ed6a 97 13 STA FPA2 * +2998 ed6c 06 14 ROR FPA2+1 = ROTATE FPA2 ONE BIT TO THE RIGHT +2999 ed6e 06 15 ROR FPA2+2 = +3000 ed70 06 16 ROR FPA2+3 = +3001 ed72 06 63 ROR FPSBYT = +3002 ed74 4f CLRA CLEAR CARRY FLAG +3003 ed75 20 d5 BRA LBB03 KEEP LOOPING +3004 ed77 39 LBB2E RTS +3005 * UNPACK A FP NUMBER FROM (X) TO FPA1 +3006 ed78 ec 01 LBB2F LDD 1,X GET TWO MSB BYTES OF MANTISSA FROM +3007 * FPA POINTED TO BY X +3008 ed7a 97 61 STA FP1SGN SAVE PACKED MANTISSA SIGN BYTE +3009 ed7c 8a 80 ORA #$80 FORCE BIT 7 OF MSB MANTISSA = 1 +3010 ed7e dd 5d STD FPA1 SAVE 2 MSB BYTES IN FPA1 +3011 ed80 d6 61 LDB FP1SGN * GET PACKED MANTISSA SIGN BYTE. EOR W/FPA0 +3012 ed82 d8 54 EORB FP0SGN * SIGN - NEW SIGN POSITION IF BOTH OLD SIGNS ALIKE, +3013 ed84 d7 62 STB RESSGN * NEG IF BOTH OLD SIGNS DIFF. SAVE ADJUSTED +3014 * * MANTISSA SIGN BYTE +3015 ed86 ec 03 LDD 3,X = GET 2 LSB BYTES OF MANTISSA +3016 ed88 dd 5f STD FPA1+2 = AND PUT IN FPA1 +3017 ed8a a6 84 LDA ,X * GET EXPONENT FROM (X) AND +3018 ed8c 97 5c STA FP1EXP * PUT IN EXPONENT OF FPA1 +3019 ed8e d6 4f LDB FP0EXP GET EXPONENT OF FPA0 +3020 ed90 39 RTS +3021 * CALCULATE EXPONENT FOR PRODUCT OF FPA0 & FPA1 +3022 * ENTER WITH EXPONENT OF FPA1 IN ACCA +3023 ed91 4d LBB48 TSTA TEST EXPONENT OF FPA1 +3024 ed92 27 16 BEQ LBB61 PURGE RETURN ADDRESS & SET FPA0 = 0 +3025 ed94 9b 4f ADDA FP0EXP ADD FPA1 EXPONENT TO FPA0 EXPONENT +3026 ed96 46 RORA ROTATE CARRY INTO BIT 7; BIT 0 INTO CARRY +3027 ed97 49 ROLA SET OVERFLOW FLAG +3028 ed98 28 10 BVC LBB61 BRANCH IF EXPONENT TOO LARGE OR SMALL +3029 ed9a 8b 80 ADDA #$80 ADD $80 BIAS TO EXPONENT +3030 ed9c 97 4f STA FP0EXP SAVE NEW EXPONENT +3031 ed9e 27 0c BEQ LBB63 SET FPA0 +3032 eda0 96 62 LDA RESSGN GET MANTISSA SIGN +3033 eda2 97 54 STA FP0SGN SAVE AS MANTISSA SIGN OF FPA0 +3034 eda4 39 RTS +3035 * IF FPA0 = POSITIVE THEN 'OV' ERROR IF FPA0 +3036 * = IS NEGATIVE THEN FPA0 = 0 +3037 eda5 96 54 LBB5C LDA FP0SGN GET MANTISSA SIGN OF FPA0 +3038 eda7 43 COMA CHANGE SIGN OF FPA0 MANTISSA +3039 eda8 20 02 BRA LBB63 +3040 edaa 32 62 LBB61 LEAS 2,S PURGE RETURN ADDRESS FROM STACK +3041 edac 10 2a fe d2 LBB63 LBPL LBA39 ZERO FPA0 MANTISSA SIGN & EXPONENT +3042 edb0 7e ec db LBB67 JMP LBA92 OV' OVERFLOW ERROR +3043 * FAST MULTIPLY BY 10 AND LEAVE RESULT IN FPA0 +3044 edb3 bd ee a8 LBB6A JSR LBC5F TRANSFER FPA0 TO FPA1 +3045 edb6 27 0d BEQ LBB7C BRANCH IF EXPONENT = 0 +3046 edb8 8b 02 ADDA #2 ADD 2 TO EXPONENT (TIMES 4) +3047 edba 25 f4 BCS LBB67 OV' ERROR IF EXPONENT > $FF +3048 edbc 0f 62 CLR RESSGN CLEAR RESULT SIGN BYTE +3049 edbe bd ec 16 JSR LB9CD ADD FPA1 TO FPA0 (TIMES 5) +3050 edc1 0c 4f INC FP0EXP ADD ONE TO EXPONENT (TIMES 10) +3051 edc3 27 eb BEQ LBB67 OV' ERROR IF EXPONENT > $FF +3052 edc5 39 LBB7C RTS +3053 edc6 84 20 00 00 00 LBB7D FCB $84,$20,$00,$00,$00 FLOATING POINT CONSTANT 10 +3054 * DIVIDE FPA0 BY 10 +3055 edcb bd ee a8 LBB82 JSR LBC5F MOVE FPA0 TO FPA1 +3056 edce 8e ed c6 LDX #LBB7D POINT TO FLOATING POINT CONSTANT 10 +3057 edd1 5f CLRB ZERO MANTISSA SIGN BYTE +3058 edd2 d7 62 LBB89 STB RESSGN STORE THE QUOTIENT MANTISSA SIGN BYTE +3059 edd4 bd ee 5d JSR LBC14 UNPACK AN FP NUMBER FROM (X) INTO FPA0 +3060 edd7 8c FCB SKP2 SKIP TWO BYTES +3061 * DIVIDE (X) BY FPA0-LEAVE NORMALIZED QUOTIENT IN FPA0 +3062 edd8 8d 9e LBB8F BSR LBB2F GET FP NUMBER FROM (X) TO FPA1 +3063 +3064 * ARITHMETIC OPERATION (/) JUMPS HERE. DIVIDE FPA1 BY FPA0 (ENTER WITH +3065 * EXPONENT OF FPA1 IN ACCA AND FLAGS SET BY TSTA) +3066 +3067 * DIVIDE FPA1 BY FPA0 +3068 edda 27 73 LBB91 BEQ LBC06 /0' DIVIDE BY ZERO ERROR +3069 eddc 00 4f NEG FP0EXP GET EXPONENT OF RECIPROCAL OF DIVISOR +3070 edde 8d b1 BSR LBB48 CALCULATE EXPONENT OF QUOTIENT +3071 ede0 0c 4f INC FP0EXP INCREMENT EXPONENT +3072 ede2 27 cc BEQ LBB67 OV' OVERFLOW ERROR +3073 ede4 8e 00 13 LDX #FPA2 POINT X TO MANTISSA OF FPA2 - HOLD +3074 * TEMPORARY QUOTIENT IN FPA2 +3075 ede7 c6 04 LDB #4 5 BYTE DIVIDE +3076 ede9 d7 03 STB TMPLOC SAVE BYTE COUNTER +3077 edeb c6 01 LDB #1 SHIFT COUNTER-AND TEMPORARY QUOTIENT BYTE +3078 * COMPARE FPA0 MANTISSA TO FPA1 MANTISSA - +3079 * SET CARRY FLAG IF FPA1 >= FPA0 +3080 eded 96 50 LBBA4 LDA FPA0 * COMPARE THE TWO MS BYTES +3081 edef 91 5d CMPA FPA1 * OF FPA0 AND FPA1 AND +3082 edf1 26 13 BNE LBBBD * BRANCH IF <> +3083 edf3 96 51 LDA FPA0+1 = COMPARE THE NUMBER 2 +3084 edf5 91 5e CMPA FPA1+1 = BYTES AND +3085 edf7 26 0d BNE LBBBD = BRANCH IF <> +3086 edf9 96 52 LDA FPA0+2 * COMPARE THE NUMBER 3 +3087 edfb 91 5f CMPA FPA1+2 * BYTES AND +3088 edfd 26 07 BNE LBBBD * BRANCH IF <> +3089 edff 96 53 LDA FPA0+3 = COMPARE THE LS BYTES +3090 ee01 91 60 CMPA FPA1+3 = AND BRANCH +3091 ee03 26 01 BNE LBBBD = IF <> +3092 ee05 43 COMA SET CARRY FLAG IF FPA0 = FPA1 +3093 ee06 1f a8 LBBBD TFR CC,A SAVE CARRY FLAG STATUS IN ACCA; CARRY +3094 * CLEAR IF FPA0 > FPA1 +3095 ee08 59 ROLB ROTATE CARRY INTO TEMPORARY QUOTIENT BYTE +3096 ee09 24 0a BCC LBBCC CARRY WILL BE SET AFTER 8 SHIFTS +3097 ee0b e7 80 STB ,X+ SAVE TEMPORARY QUOTIENT +3098 ee0d 0a 03 DEC TMPLOC DECREMENT BYTE COUNTER +3099 ee0f 2b 34 BMI LBBFC BRANCH IF DONE +3100 ee11 27 2e BEQ LBBF8 BRANCH IF LAST BYTE +3101 ee13 c6 01 LDB #1 RESET SHIFT COUNTER AND TEMPORARY QUOTIENT BYTE +3102 ee15 1f 8a LBBCC TFR A,CC RESTORE CARRY FLAG AND +3103 ee17 25 0e BCS LBBDE BRANCH IF FPA0 =< FPA1 +3104 ee19 08 60 LBBD0 ASL FPA1+3 * SHIFT FPA1 MANTISSA 1 BIT TO LEFT +3105 ee1b 09 5f ROL FPA1+2 * +3106 ee1d 09 5e ROL FPA1+1 * +3107 ee1f 09 5d ROL FPA1 * +3108 ee21 25 e3 BCS LBBBD BRANCH IF CARRY - ADD ONE TO PARTIAL QUOTIENT +3109 ee23 2b c8 BMI LBBA4 IF MSB OF HIGH ORDER MANTISSA BYTE IS +3110 * SET, CHECK THE MAGNITUDES OF FPA0, FPA1 +3111 ee25 20 df BRA LBBBD CARRY IS CLEAR, CHECK ANOTHER BIT +3112 * SUBTRACT FPA0 FROM FPA1 - LEAVE RESULT IN FPA1 +3113 ee27 96 60 LBBDE LDA FPA1+3 * SUBTRACT THE LS BYTES OF MANTISSA +3114 ee29 90 53 SUBA FPA0+3 * +3115 ee2b 97 60 STA FPA1+3 * +3116 ee2d 96 5f LDA FPA1+2 = THEN THE NEXT BYTE +3117 ee2f 92 52 SBCA FPA0+2 = +3118 ee31 97 5f STA FPA1+2 = +3119 ee33 96 5e LDA FPA1+1 * AND THE NEXT +3120 ee35 92 51 SBCA FPA0+1 * +3121 ee37 97 5e STA FPA1+1 * +3122 ee39 96 5d LDA FPA1 = AND FINALLY, THE MS BYTE OF MANTISSA +3123 ee3b 92 50 SBCA FPA0 = +3124 ee3d 97 5d STA FPA1 = +3125 ee3f 20 d8 BRA LBBD0 GO SHIFT FPA1 +3126 ee41 c6 40 LBBF8 LDB #$40 USE ONLY TWO BITS OF THE LAST BYTE (FIFTH) +3127 ee43 20 d0 BRA LBBCC GO SHIFT THE LAST BYTE +3128 ee45 56 LBBFC RORB * SHIFT CARRY (ALWAYS SET HERE) INTO +3129 ee46 56 RORB * BIT 5 AND MOVE +3130 ee47 56 RORB * BITS 1,0 TO BITS 7,6 +3131 ee48 d7 63 STB FPSBYT SAVE SUB BYTE +3132 ee4a 8d 08 BSR LBC0B MOVE MANTISSA OF FPA2 TO FPA0 +3133 ee4c 7e ec 65 JMP LBA1C NORMALIZE FPA0 +3134 ee4f c6 14 LBC06 LDB #2*10 /0' ERROR +3135 ee51 7e df 03 JMP LAC46 PROCESS THE ERROR +3136 * COPY MANTISSA FROM FPA2 TO FPA0 +3137 ee54 9e 13 LBC0B LDX FPA2 * MOVE TOP 2 BYTES +3138 ee56 9f 50 STX FPA0 * +3139 ee58 9e 15 LDX FPA2+2 = MOVE BOTTOM 2 BYTES +3140 ee5a 9f 52 STX FPA0+2 = +3141 ee5c 39 RTS +3142 * COPY A PACKED FP NUMBER FROM (X) TO FPA0 +3143 ee5d 34 02 LBC14 PSHS A SAVE ACCA +3144 ee5f ec 01 LDD 1,X GET TOP TWO MANTISSA BYTES +3145 ee61 97 54 STA FP0SGN SAVE MS BYTE OF MANTISSA AS MANTISSA SIGN +3146 ee63 8a 80 ORA #$80 UNPACK MS BYTE +3147 ee65 dd 50 STD FPA0 SAVE UNPACKED TOP 2 MANTISSA BYTES +3148 ee67 0f 63 CLR FPSBYT CLEAR MANTISSA SUB BYTE +3149 ee69 e6 84 LDB ,X GET EXPONENT TO ACCB +3150 ee6b ae 03 LDX 3,X * MOVE LAST 2 +3151 ee6d 9f 52 STX FPA0+2 * MANTISSA BYTES +3152 ee6f d7 4f STB FP0EXP SAVE EXPONENT +3153 ee71 35 82 PULS A,PC RESTORE ACCA AND RETURN +3154 +3155 ee73 8e 00 45 LBC2A LDX #V45 POINT X TO MANTISSA OF FPA4 +3156 ee76 20 06 BRA LBC35 MOVE FPA0 TO FPA4 +3157 ee78 8e 00 40 LBC2F LDX #V40 POINT X TO MANTISSA OF FPA3 +3158 ee7b 8c FCB SKP2 SKIP TWO BYTES +3159 ee7c 9e 3b LBC33 LDX VARDES POINT X TO VARIABLE DESCRIPTOR IN VARDES +3160 * PACK FPA0 AND MOVE IT TO ADDRESS IN X +3161 ee7e 96 4f LBC35 LDA FP0EXP * COPY EXPONENT +3162 ee80 a7 84 STA ,X * +3163 ee82 96 54 LDA FP0SGN GET MANTISSA SIGN BIT +3164 ee84 8a 7f ORA #$7F MASK THE BOTTOM 7 BITS +3165 ee86 94 50 ANDA FPA0 AND BIT 7 OF MANTISSA SIGN INTO BIT 7 OF MS BYTE +3166 ee88 a7 01 STA 1,X SAVE MS BYTE +3167 ee8a 96 51 LDA FPA0+1 * MOVE 2ND MANTISSA BYTE +3168 ee8c a7 02 STA 2,X * +3169 ee8e de 52 LDU FPA0+2 = MOVE BOTTOM 2 MANTISSA BYTES +3170 ee90 ef 03 STU 3,X = +3171 ee92 39 RTS +3172 * MOVE FPA1 TO FPA0 RETURN W/MANTISSA SIGN IN ACCA +3173 ee93 96 61 LBC4A LDA FP1SGN * COPY MANTISSA SIGN FROM +3174 ee95 97 54 LBC4C STA FP0SGN * FPA1 TO FPA0 +3175 ee97 9e 5c LDX FP1EXP = COPY EXPONENT + MS BYTE FROM +3176 ee99 9f 4f STX FP0EXP = FPA1 TO FPA0 +3177 ee9b 0f 63 CLR FPSBYT CLEAR MANTISSA SUB BYTE +3178 ee9d 96 5e LDA FPA1+1 * COPY 2ND MANTISSA BYTE +3179 ee9f 97 51 STA FPA0+1 * FROM FPA1 TO FPA0 +3180 eea1 96 54 LDA FP0SGN GET MANTISSA SIGN +3181 eea3 9e 5f LDX FPA1+2 * COPY 3RD AND 4TH MANTISSA BYTE +3182 eea5 9f 52 STX FPA0+2 * FROM FPA1 TO FPA0 +3183 eea7 39 RTS +3184 * TRANSFER FPA0 TO FPA1 +3185 eea8 dc 4f LBC5F LDD FP0EXP * TRANSFER EXPONENT & MS BYTE +3186 eeaa dd 5c STD FP1EXP * +3187 eeac 9e 51 LDX FPA0+1 = TRANSFER MIDDLE TWO BYTES +3188 eeae 9f 5e STX FPA1+1 = +3189 eeb0 9e 53 LDX FPA0+3 * TRANSFER BOTTOM TWO BYTES +3190 eeb2 9f 60 STX FPA1+3 * +3191 eeb4 4d TSTA SET FLAGS ACCORDING TO EXPONENT +3192 eeb5 39 RTS +3193 * CHECK FPA0; RETURN ACCB = 0 IF FPA0 = 0, +3194 * ACCB = $FF IF FPA0 = NEGATIVE, ACCB = 1 IF FPA0 = POSITIVE +3195 eeb6 d6 4f LBC6D LDB FP0EXP GET EXPONENT +3196 eeb8 27 08 BEQ LBC79 BRANCH IF FPA0 = 0 +3197 eeba d6 54 LBC71 LDB FP0SGN GET SIGN OF MANTISSA +3198 eebc 59 LBC73 ROLB BIT 7 TO CARRY +3199 eebd c6 ff LDB #$FF NEGATIVE FLAG +3200 eebf 25 01 BCS LBC79 BRANCH IF NEGATIVE MANTISSA +3201 eec1 50 NEGB ACCB = 1 IF POSITIVE MANTISSA +3202 eec2 39 LBC79 RTS +3203 +3204 * SGN +3205 eec3 8d f1 SGN BSR LBC6D SET ACCB ACCORDING TO SIGN OF FPA0 +3206 * CONVERT A SIGNED NUMBER IN ACCB INTO A FLOATING POINT NUMBER +3207 eec5 d7 50 LBC7C STB FPA0 SAVE ACCB IN FPA0 +3208 eec7 0f 51 CLR FPA0+1 CLEAR NUMBER 2 MANTISSA BYTE OF FPA0 +3209 eec9 c6 88 LDB #$88 EXPONENT REQUIRED IF FPA0 IS TO BE AN INTEGER +3210 eecb 96 50 LBC82 LDA FPA0 GET MS BYTE OF MANTISSA +3211 eecd 80 80 SUBA #$80 SET CARRY IF POSITIVE MANTISSA +3212 eecf d7 4f LBC86 STB FP0EXP SAVE EXPONENT +3213 eed1 dc 74 LDD ZERO * ZERO OUT ACCD AND +3214 eed3 dd 52 STD FPA0+2 * BOTTOM HALF OF FPA0 +3215 eed5 97 63 STA FPSBYT CLEAR SUB BYTE +3216 eed7 97 54 STA FP0SGN CLEAR SIGN OF FPA0 MANTISSA +3217 eed9 7e ec 61 JMP LBA18 GO NORMALIZE FPA0 +3218 +3219 * ABS +3220 eedc 0f 54 ABS CLR FP0SGN FORCE MANTISSA SIGN OF FPA0 POSITIVE +3221 eede 39 RTS +3222 * COMPARE A PACKED FLOATING POINT NUMBER POINTED TO +3223 * BY (X) TO AN UNPACKED FP NUMBER IN FPA0. RETURN +3224 * ZERO FLAG SET AND ACCB = 0, IF EQUAL; ACCB = 1 IF +3225 * FPA0 > (X); ACCB = $FF IF FPA0 < (X) +3226 eedf e6 84 LBC96 LDB ,X CHECK EXPONENT OF (X) +3227 eee1 27 d3 BEQ LBC6D BRANCH IF FPA = 0 +3228 eee3 e6 01 LDB 1,X GET MS BYTE OF MANTISSA OF (X) +3229 eee5 d8 54 EORB FP0SGN EOR WITH SIGN OF FPA0 +3230 eee7 2b d1 BMI LBC71 BRANCH IF SIGNS NOT = +3231 * COMPARE FPA0 WITH FP NUMBER POINTED TO BY (X). +3232 * FPA0 IS NORMALIZED, (X) IS PACKED. +3233 eee9 d6 4f LBCA0 LDB FP0EXP * GET EXPONENT OF +3234 eeeb e1 84 CMPB ,X * FPA0, COMPARE TO EXPONENT OF +3235 eeed 26 1d BNE LBCC3 * (X) AND BRANCH IF <>. +3236 eeef e6 01 LDB 1,X * GET MS BYTE OF (X), KEEP ONLY +3237 eef1 ca 7f ORB #$7F * THE SIGN BIT - 'AND' THE BOTTOM 7 +3238 eef3 d4 50 ANDB FPA0 * BITS OF FPA0 INTO ACCB +3239 eef5 e1 01 CMPB 1,X = COMPARE THE BOTTOM 7 BITS OF THE MANTISSA +3240 eef7 26 13 BNE LBCC3 = MS BYTE AND BRANCH IF <> +3241 eef9 d6 51 LDB FPA0+1 * COMPARE 2ND BYTE +3242 eefb e1 02 CMPB 2,X * OF MANTISSA, +3243 eefd 26 0d BNE LBCC3 * BRANCH IF <> +3244 eeff d6 52 LDB FPA0+2 = COMPARE 3RD BYTE +3245 ef01 e1 03 CMPB 3,X = OF MANTISSA, +3246 ef03 26 07 BNE LBCC3 = BRANCH IF <> +3247 ef05 d6 53 LDB FPA0+3 * SUBTRACT LS BYTE +3248 ef07 e0 04 SUBB 4,X * OF (X) FROM LS BYTE OF +3249 ef09 26 01 BNE LBCC3 * FPA0, BRANCH IF <> +3250 ef0b 39 RTS RETURN IF FP (X) = FPA0 +3251 ef0c 56 LBCC3 RORB SHIFT CARRY TO BIT 7; CARRY SET IF FPA0 < (X) +3252 ef0d d8 54 EORB FP0SGN TOGGLE SIZE COMPARISON BIT IF FPA0 IS NEGATIVE +3253 ef0f 20 ab BRA LBC73 GO SET ACCB ACCORDING TO COMPARISON +3254 * DE-NORMALIZE FPA0 : SHIFT THE MANTISSA UNTIL THE BINARY POINT IS TO THE RIGHT +3255 * OF THE LEAST SIGNIFICANT BYTE OF THE MANTISSA +3256 ef11 d6 4f LBCC8 LDB FP0EXP GET EXPONENT OF FPA0 +3257 ef13 27 3d BEQ LBD09 ZERO MANTISSA IF FPA0 = 0 +3258 ef15 c0 a0 SUBB #$A0 SUBTRACT $A0 FROM FPA0 EXPONENT T THIS WILL YIELD +3259 * THE NUMBER OF SHIFTS REQUIRED TO DENORMALIZE FPA0. WHEN +3260 * THE EXPONENT OF FPA0 IS = ZERO, THEN THE BINARY POINT +3261 * WILL BE TO THE RIGHT OF THE MANTISSA +3262 ef17 96 54 LDA FP0SGN TEST SIGN OF FPA0 MANTISSA +3263 ef19 2a 05 BPL LBCD7 BRANCH IF POSITIVE +3264 ef1b 03 5b COM FPCARY COMPLEMENT CARRY IN BYTE +3265 ef1d bd ec c4 JSR LBA7B NEGATE MANTISSA OF FPA0 +3266 ef20 8e 00 4f LBCD7 LDX #FP0EXP POINT X TO FPA0 +3267 ef23 c1 f8 CMPB #-8 EXPONENT DIFFERENCE < -8? +3268 ef25 2e 06 BGT LBCE4 YES +3269 ef27 bd ec f7 JSR LBAAE SHIFT FPA0 RIGHT UNTIL FPA0 EXPONENT = $A0 +3270 ef2a 0f 5b CLR FPCARY CLEAR CARRY IN BYTE +3271 ef2c 39 RTS +3272 ef2d 0f 5b LBCE4 CLR FPCARY CLEAR CARRY IN BYTE +3273 ef2f 96 54 LDA FP0SGN * GET SIGN OF FPA0 MANTISSA +3274 ef31 49 ROLA * ROTATE IT INTO THE CARRY FLAG +3275 ef32 06 50 ROR FPA0 ROTATE CARRY (MANTISSA SIGN) INTO BIT 7 +3276 * OF LS BYTE OF MANTISSA +3277 ef34 7e ed 03 JMP LBABA DE-NORMALIZE FPA0 +3278 +3279 * INT +3280 * THE INT STATEMENT WILL "DENORMALIZE" FPA0 - THAT IS IT WILL SHIFT THE BINARY POINT +3281 * TO THE EXTREME RIGHT OF THE MANTISSA TO FORCE ITS EXPONENT TO BE $AO. ONCE +3282 * THIS IS DONE THE MANTISSA OF FPA0 WILL CONTAIN THE FOUR LEAST SIGNIFICANT +3283 * BYTES OF THE INTEGER PORTION OF FPA0. AT THE CONCLUSION OF THE DE-NORMALIZATION +3284 * ONLY THE INTEGER PORTION OF FPA0 WILL REMAIN. +3285 * +3286 ef37 d6 4f INT LDB FP0EXP GET EXPONENT OF FPA0 +3287 ef39 c1 a0 CMPB #$A0 LARGEST POSSIBLE INTEGER EXPONENT +3288 ef3b 24 1d BCC LBD11 RETURN IF FPA0 >= 32768 +3289 ef3d 8d d2 BSR LBCC8 SHIFT THE BINARY POINT ONE TO THE RIGHT OF THE +3290 * LS BYTE OF THE FPA0 MANTISSA +3291 ef3f d7 63 STB FPSBYT ACCB = 0: ZERO OUT THE SUB BYTE +3292 ef41 96 54 LDA FP0SGN GET MANTISSA SIGN +3293 ef43 d7 54 STB FP0SGN FORCE MANTISSA SIGN TO BE POSITIVE +3294 ef45 80 80 SUBA #$80 SET CARRY IF MANTISSA +3295 ef47 86 a0 LDA #$A0 * GET DENORMALIZED EXPONENT AND +3296 ef49 97 4f STA FP0EXP * SAVE IT IN FPA0 EXPONENT +3297 ef4b 96 53 LDA FPA0+3 = GET LS BYTE OF FPA0 AND +3298 ef4d 97 01 STA CHARAC = SAVE IT IN CHARAC +3299 ef4f 7e ec 61 JMP LBA18 NORMALIZE FPA0 +3300 +3301 ef52 d7 50 LBD09 STB FPA0 * LOAD MANTISSA OF FPA0 WITH CONTENTS OF ACCB +3302 ef54 d7 51 STB FPA0+1 * +3303 ef56 d7 52 STB FPA0+2 * +3304 ef58 d7 53 STB FPA0+3 * +3305 ef5a 39 LBD11 RTS * +3306 +3307 * CONVERT ASCII STRING TO FLOATING POINT +3308 ef5b 9e 74 LBD12 LDX ZERO (X) = 0 +3309 ef5d 9f 54 STX FP0SGN * ZERO OUT FPA0 & THE SIGN FLAG (COEFCT) +3310 ef5f 9f 4f STX FP0EXP * +3311 ef61 9f 51 STX FPA0+1 * +3312 ef63 9f 52 STX FPA0+2 * +3313 ef65 9f 47 STX V47 INITIALIZE EXPONENT & EXPONENT SIGN FLAG TO ZERO +3314 ef67 9f 45 STX V45 INITIALIZE RIGHT DECIMAL CTR & DECIMAL PT FLAG TO 0 +3315 ef69 25 64 BCS LBD86 IF CARRY SET (NUMERIC CHARACTER), ASSUME ACCA CONTAINS FIRST +3316 * NUMERIC CHAR, SIGN IS POSITIVE AND SKIP THE RAM HOOK +3317 ef6b bd f6 98 JSR XVEC19 CALL EXTENDED BASIC ADD-IN +3318 ef6e 81 2d LBD25 CMPA #'- * CHECK FOR A LEADING MINUS SIGN AND BRANCH +3319 ef70 26 04 BNE LBD2D * IF NO MINUS SIGN +3320 ef72 03 55 COM COEFCT TOGGLE SIGN; 0 = +; FF = - +3321 ef74 20 04 BRA LBD31 INTERPRET THE REST OF THE STRING +3322 ef76 81 2b LBD2D CMPA #'+ * CHECK FOR LEADING PLUS SlGN AND BRANCH +3323 ef78 26 04 BNE LBD35 * IF NOT A PLUS SIGN +3324 ef7a 9d 7c LBD31 JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC +3325 ef7c 25 51 BCS LBD86 BRANCH IF NUMERIC CHARACTER +3326 ef7e 81 2e LBD35 CMPA #'. DECIMAL POlNT? +3327 ef80 27 28 BEQ LBD61 YES +3328 ef82 81 45 CMPA #'E "E" SHORTHAND FORM (SCIENTIFIC NOTATION)? +3329 ef84 26 28 BNE LBD65 NO +3330 * EVALUATE EXPONENT OF EXPONENTIAL FORMAT +3331 ef86 9d 7c JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC +3332 ef88 25 64 BCS LBDA5 BRANCH IF NUMERIC +3333 ef8a 81 a7 CMPA #TOK_MINUS MINUS TOKEN? +3334 ef8c 27 0e BEQ LBD53 YES +3335 ef8e 81 2d CMPA #'- ASCII MINUS? +3336 ef90 27 0a BEQ LBD53 YES +3337 ef92 81 a6 CMPA #TOK_PLUS PLUS TOKEN? +3338 ef94 27 08 BEQ LBD55 YES +3339 ef96 81 2b CMPA #'+ ASCII PLUS? +3340 ef98 27 04 BEQ LBD55 YES +3341 ef9a 20 06 BRA LBD59 BRANCH IF NO SIGN FOUND +3342 ef9c 03 48 LBD53 COM V48 SET EXPONENT SIGN FLAG TO NEGATIVE +3343 * STRIP A DECIMAL NUMBER FROM BASIC LINE, CONVERT IT TO BINARY IN V47 +3344 ef9e 9d 7c LBD55 JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC +3345 efa0 25 4c BCS LBDA5 IF NUMERIC CHARACTER, CONVERT TO BINARY +3346 efa2 0d 48 LBD59 TST V48 * CHECK EXPONENT SIGN FLAG +3347 efa4 27 08 BEQ LBD65 * AND BRANCH IF POSITIVE +3348 efa6 00 47 NEG V47 NEGATE VALUE OF EXPONENT +3349 efa8 20 04 BRA LBD65 +3350 efaa 03 46 LBD61 COM V46 *TOGGLE DECIMAL PT FLAG AND INTERPRET ANOTHER +3351 efac 26 cc BNE LBD31 *CHARACTER IF <> 0 - TERMINATE INTERPRETATION +3352 * IF SECOND DECIMAL POINT +3353 * ADJUST FPA0 FOR THE DECIMAL EXPONENT IN V47 +3354 efae 96 47 LBD65 LDA V47 * GET EXPONENT, SUBTRACT THE NUMBER OF +3355 efb0 90 45 SUBA V45 * PLACES TO THE RIGHT OF DECIMAL POINT +3356 efb2 97 47 STA V47 * AND RESAVE IT. +3357 efb4 27 12 BEQ LBD7F EXIT ROUTINE IF ADJUSTED EXPONENT = ZERO +3358 efb6 2a 09 BPL LBD78 BRANCH IF POSITIVE EXPONENT +3359 efb8 bd ed cb LBD6F JSR LBB82 DIVIDE FPA0 BY 10 +3360 efbb 0c 47 INC V47 INCREMENT EXPONENT COUNTER (MULTIPLY BY 10) +3361 efbd 26 f9 BNE LBD6F KEEP MULTIPLYING +3362 efbf 20 07 BRA LBD7F EXIT ROUTINE +3363 efc1 bd ed b3 LBD78 JSR LBB6A MULTIPLY FPA0 BY 10 +3364 efc4 0a 47 DEC V47 DECREMENT EXPONENT COUNTER (DIVIDE BY 10) +3365 efc6 26 f9 BNE LBD78 KEEP MULTIPLYING +3366 efc8 96 55 LBD7F LDA COEFCT GET THE SIGN FLAG +3367 efca 2a 8e BPL LBD11 RETURN IF POSITIVE +3368 efcc 7e f1 32 JMP LBEE9 TOGGLE MANTISSA SIGN OF FPA0, IF NEGATIVE +3369 *MULTIPLY FPA0 BY TEN AND ADD ACCA TO THE RESULT +3370 efcf d6 45 LBD86 LDB V45 *GET THE RIGHT DECIMAL COUNTER AND SUBTRACT +3371 efd1 d0 46 SUBB V46 *THE DECIMAL POINT FLAG FROM IT. IF DECIMAL POINT +3372 efd3 d7 45 STB V45 *FLAG=0, NOTHING HAPPENS. IF DECIMAL POINT FLAG IS +3373 * -1, THEN RIGHT DECIMAL COUNTER IS INCREMENTED BY ONE +3374 efd5 34 02 PSHS A SAVE NEW DIGIT ON STACK +3375 efd7 bd ed b3 JSR LBB6A MULTIPLY FPA0 BY 10 +3376 efda 35 04 PULS B GET NEW DIGIT BACK +3377 efdc c0 30 SUBB #'0 MASK OFF ASCII +3378 efde 8d 02 BSR LBD99 ADD ACCB TO FPA0 +3379 efe0 20 98 BRA LBD31 GET ANOTHER CHARACTER FROM BASIC +3380 efe2 bd ee 78 LBD99 JSR LBC2F PACK FPA0 AND SAVE IT IN FPA3 +3381 efe5 bd ee c5 JSR LBC7C CONVERT ACCB TO FP NUMBER IN FPA0 +3382 efe8 8e 00 40 LDX #V40 * ADD FPA0 TO +3383 efeb 7e ec 0b JMP LB9C2 * FPA3 +3384 +3385 +3386 efee d6 47 LBDA5 LDB V47 +3387 eff0 58 ASLB TIMES 2 +3388 eff1 58 ASLB TIMES 4 +3389 eff2 db 47 ADDB V47 ADD 1 = TIMES 5 +3390 eff4 58 ASLB TIMES 10 +3391 eff5 80 30 SUBA #'0 *MASK OFF ASCII FROM ACCA, PUSH +3392 eff7 34 04 PSHS B *RESULT ONTO THE STACK AND +3393 eff9 ab e0 ADDA ,S+ ADD lT TO ACCB +3394 effb 97 47 STA V47 SAVE IN V47 +3395 effd 20 9f BRA LBD55 INTERPRET ANOTHER CHARACTER +3396 * +3397 efff 9b 3e bc 1f fd LBDB6 FCB $9B,$3E,$BC,$1F,$FD * 99999999.9 +3398 f004 9e 6e 6b 27 fd LBDBB FCB $9E,$6E,$6B,$27,$FD * 999999999 +3399 f009 9e 6e 6b 28 00 LBDC0 FCB $9E,$6E,$6B,$28,$00 * 1E + 09 +3400 * +3401 f00e 8e de a4 LBDC5 LDX #LABE8-1 POINT X TO " IN " MESSAGE +3402 f011 8d 0c BSR LBDD6 COPY A STRING FROM (X) TO CONSOLE OUT +3403 f013 dc 68 LDD CURLIN GET CURRENT BASIC LINE NUMBER TO ACCD +3404 * CONVERT VALUE IN ACCD INTO A DECIMAL NUMBER +3405 * AND PRINT IT TO CONSOLE OUT +3406 f015 dd 50 LBDCC STD FPA0 SAVE ACCD IN TOP HALF OF FPA0 +3407 f017 c6 90 LDB #$90 REQ’D EXPONENT IF TOP HALF OF ACCD = INTEGER +3408 f019 43 COMA SET CARRY FLAG - FORCE POSITIVE MANTISSA +3409 f01a bd ee cf JSR LBC86 ZERO BOTTOM HALF AND SIGN OF FPA0, THEN +3410 * SAVE EXPONENT AND NORMALIZE IT +3411 f01d 8d 03 BSR LBDD9 CONVERT FP NUMBER TO ASCII STRING +3412 f01f 7e eb e5 LBDD6 JMP LB99C COPY A STRING FROM (X) TO CONSOLE OUT +3413 +3414 * CONVERT FP NUMBER TO ASCII STRING +3415 f022 ce 01 f1 LBDD9 LDU #STRBUF+3 POINT U TO BUFFER WHICH WILL NOT CAUSE +3416 * THE STRING TO BE STORED IN STRING SPACE +3417 f025 86 20 LBDDC LDA #SPACE SPACE = DEFAULT SIGN FOR POSITIVE # +3418 f027 d6 54 LDB FP0SGN GET SIGN OF FPA0 +3419 f029 2a 02 BPL LBDE4 BRANCH IF POSITIVE +3420 f02b 86 2d LDA #'- ASCII MINUS SIGN +3421 f02d a7 c0 LBDE4 STA ,U+ STORE SIGN OF NUMBER +3422 f02f df 64 STU COEFPT SAVE BUFFER POINTER +3423 f031 97 54 STA FP0SGN SAVE SIGN (IN ASCII) +3424 f033 86 30 LDA #'0 ASCII ZERO IF EXPONENT = 0 +3425 f035 d6 4f LDB FP0EXP GET FPA0 EXPONENT +3426 f037 10 27 00 c6 LBEQ LBEB8 BRANCH IF FPA0 = 0 +3427 f03b 4f CLRA BASE 10 EXPONENT=0 FOR FP NUMBER > 1 +3428 f03c c1 80 CMPB #$80 CHECK EXPONENT +3429 f03e 22 08 BHI LBDFF BRANCH IF FP NUMBER > 1 +3430 * IF FPA0 < 1.0, MULTIPLY IT BY 1E+09 TO SPEED UP THE CONVERSION PROCESS +3431 f040 8e f0 09 LDX #LBDC0 POINT X TO FP 1E+09 +3432 f043 bd ed 13 JSR LBACA MULTIPLY FPA0 BY (X) +3433 f046 86 f7 LDA #-9 BASE 10 EXPONENT = -9 +3434 f048 97 45 LBDFF STA V45 BASE 10 EXPONENT +3435 * PSEUDO - NORMALIZE THE FP NUMBER TO A VALUE IN THE RANGE +3436 * OF 999,999,999 RO 99,999,999.9 - THIS IS THE LARGEST +3437 * NUMBER RANGE IN WHICH ALL OF THE DIGITS ARE +3438 * SIGNIFICANT WHICH CAN BE DISPLAYED WITHOUT USING +3439 * SCIENTIFIC NOTATION +3440 f04a 8e f0 04 LBE01 LDX #LBDBB POINT X TO FP 999,999,999 +3441 f04d bd ee e9 JSR LBCA0 COMPARE FPA0 TO 999,999,999 +3442 f050 2e 0f BGT LBE18 BRANCH IF > 999,999,999 +3443 f052 8e ef ff LBE09 LDX #LBDB6 POINT X TO FP 99,999,999.9 +3444 f055 bd ee e9 JSR LBCA0 COMPARE FPA0 TO 99,999,999.9 +3445 f058 2e 0e BGT LBE1F BRANCH IF > 99,999,999.9 (IN RANGE) +3446 f05a bd ed b3 JSR LBB6A MULTIPLY FPA0 BY 10 +3447 f05d 0a 45 DEC V45 SUBTRACT ONE FROM DECIMAL OFFSET +3448 f05f 20 f1 BRA LBE09 PSEUDO - NORMALIZE SOME MORE +3449 f061 bd ed cb LBE18 JSR LBB82 DIVIDE FPA0 BY 10 +3450 f064 0c 45 INC V45 ADD ONE TO BASE 10 EXPONENT +3451 f066 20 e2 BRA LBE01 PSEUDO - NORMALIZE SOME MORE +3452 f068 bd eb fd LBE1F JSR LB9B4 ADD .5 TO FPA0 (ROUND OFF) +3453 f06b bd ef 11 JSR LBCC8 CONVERT FPA0 TO AN INTEGER +3454 f06e c6 01 LDB #1 DEFAULT DECIMAL POINT FLAG (FORCE IMMED DECIMAL PT) +3455 f070 96 45 LDA V45 * GET BASE 10 EXPONENT AND ADD TEN TO IT +3456 f072 8b 0a ADDA #9+1 * (NUMBER ‘NORMALIZED’ TO 9 PLACES & DECIMAL PT) +3457 f074 2b 09 BMI LBE36 BRANCH IF NUMBER < 1.0 +3458 f076 81 0b CMPA #9+2 NINE PLACES MAY BE DISPLAYED WITHOUT +3459 * USING SCIENTIFIC NOTATION +3460 f078 24 05 BCC LBE36 BRANCH IF SCIENTIFIC NOTATION REQUIRED +3461 f07a 4a DECA * SUBTRACT 1 FROM MODIFIED BASE 10 EXPONENT CTR +3462 f07b 1f 89 TFR A,B * AND SAVE IT IN ACCB (DECiMAL POINT FLAG) +3463 f07d 86 02 LDA #2 FORCE EXPONENT = 0 - DON'T USE SCIENTIFIC NOTATION +3464 f07f 4a LBE36 DECA * SUBTRACT TWO (WITHOUT AFFECTING CARRY) +3465 f080 4a DECA * FROM BASE 10 EXPONENT +3466 f081 97 47 STA V47 SAVE EXPONENT - ZERO EXPONENT = DO NOT DISPLAY +3467 * IN SCIENTIFIC NOTATION +3468 f083 d7 45 STB V45 DECIMAL POINT FLAG - NUMBER OF PLACES TO +3469 * LEFT OF DECIMAL POINT +3470 f085 2e 0d BGT LBE4B BRANCH IF >= 1 +3471 f087 de 64 LDU COEFPT POINT U TO THE STRING BUFFER +3472 f089 86 2e LDA #'. * STORE A PERIOD +3473 f08b a7 c0 STA ,U+ * IN THE BUFFER +3474 f08d 5d TSTB CHECK DECIMAL POINT FLAG +3475 f08e 27 04 BEQ LBE4B BRANCH IF NOTHING TO LEFT OF DECIMAL POINT +3476 f090 86 30 LDA #'0 * STORE A ZERO +3477 f092 a7 c0 STA ,U+ * IN THE BUFFER +3478 +3479 * CONVERT FPA0 INTO A STRING OF ASCII DIGITS +3480 f094 8e f1 0e LBE4B LDX #LBEC5 POINT X TO FP POWER OF 10 MANTISSA +3481 f097 c6 80 LDB #0+$80 INITIALIZE DIGIT COUNTER TO 0+$80 +3482 * BIT 7 SET IS USED TO INDICATE THAT THE POWER OF 10 MANTISSA +3483 * IS NEGATIVE. WHEN YOU 'ADD' A NEGATIVE MANTISSA, IT IS +3484 * THE SAME AS SUBTRACTING A POSITIVE ONE AND BIT 7 OF ACCB IS HOW +3485 * THE ROUTINE KNOWS THAT A 'SUBTRACTION' IS OCCURING. +3486 f099 96 53 LBE50 LDA FPA0+3 * ADD MANTISSA LS +3487 f09b ab 03 ADDA 3,X * BYTE OF FPA0 +3488 f09d 97 53 STA FPA0+3 * AND (X) +3489 f09f 96 52 LDA FPA0+2 = ADD MANTISSA +3490 f0a1 a9 02 ADCA 2,X = NUMBER 3 BYTE OF +3491 f0a3 97 52 STA FPA0+2 = FPA0 AND (X) +3492 f0a5 96 51 LDA FPA0+1 * ADD MANTISSA +3493 f0a7 a9 01 ADCA 1,X * NUMBER 2 BYTE OF +3494 f0a9 97 51 STA FPA0+1 * FPA0 AND (X) +3495 f0ab 96 50 LDA FPA0 = ADD MANTISSA +3496 f0ad a9 84 ADCA ,X = MS BYTE OF +3497 f0af 97 50 STA FPA0 = FPA0 AND (X) +3498 f0b1 5c INCB ADD ONE TO DIGIT COUNTER +3499 f0b2 56 RORB ROTATE CARRY INTO BIT 7 +3500 f0b3 59 ROLB *SET OVERFLOW FLAG AND BRANCH IF CARRY = 1 AND +3501 f0b4 28 e3 BVC LBE50 *POSITIVE MANTISSA OR CARRY = 0 AND NEG MANTISSA +3502 f0b6 24 03 BCC LBE72 BRANCH IF NEGATIVE MANTISSA +3503 f0b8 c0 0b SUBB #10+1 * TAKE THE 9’S COMPLEMENT IF +3504 f0ba 50 NEGB * ADDING MANTISSA +3505 f0bb cb 2f LBE72 ADDB #'0-1 ADD ASCII OFFSET TO DIGIT +3506 f0bd 30 04 LEAX 4,X MOVE TO NEXT POWER OF 10 MANTISSA +3507 f0bf 1f 98 TFR B,A SAVE DIGIT IN ACCA +3508 f0c1 84 7f ANDA #$7F MASK OFF BIT 7 (ADD/SUBTRACT FLAG) +3509 f0c3 a7 c0 STA ,U+ STORE DIGIT IN STRING BUFFER +3510 f0c5 0a 45 DEC V45 DECREMENT DECIMAL POINT FLAG +3511 f0c7 26 04 BNE LBE84 BRANCH IF NOT TIME FOR DECIMAL POINT +3512 f0c9 86 2e LDA #'. * STORE DECIMAL POINT IN +3513 f0cb a7 c0 STA ,U+ * STRING BUFFER +3514 f0cd 53 LBE84 COMB TOGGLE BIT 7 (ADD/SUBTRACT FLAG) +3515 f0ce c4 80 ANDB #$80 MASK OFF ALL BUT ADD/SUBTRACT FLAG +3516 f0d0 8c f1 32 CMPX #LBEC5+36 COMPARE X TO END OF MANTISSA TABLE +3517 f0d3 26 c4 BNE LBE50 BRANCH IF NOT AT END OF TABLE +3518 * BLANK TRAILING ZEROS AND STORE EXPONENT IF ANY +3519 f0d5 a6 c2 LBE8C LDA ,-U GET THE LAST CHARACTER; MOVE POINTER BACK +3520 f0d7 81 30 CMPA #'0 WAS IT A ZERO? +3521 f0d9 27 fa BEQ LBE8C IGNORE TRAILING ZEROS IF SO +3522 f0db 81 2e CMPA #'. CHECK FOR DECIMAL POINT +3523 f0dd 26 02 BNE LBE98 BRANCH IF NOT DECIMAL POINT +3524 f0df 33 5f LEAU -1,U STEP OVER THE DECIMAL POINT +3525 f0e1 86 2b LBE98 LDA #'+ ASCII PLUS SIGN +3526 f0e3 d6 47 LDB V47 GET SCIENTIFIC NOTATION EXPONENT +3527 f0e5 27 1c BEQ LBEBA BRANCH IF NOT SCIENTIFIC NOTATION +3528 f0e7 2a 03 BPL LBEA3 BRANCH IF POSITIVE EXPONENT +3529 f0e9 86 2d LDA #'- ASCII MINUS SIGN +3530 f0eb 50 NEGB NEGATE EXPONENT IF NEGATIVE +3531 f0ec a7 42 LBEA3 STA 2,U STORE EXPONENT SIGN IN STRING +3532 f0ee 86 45 LDA #'E * GET ASCII ‘E’ (SCIENTIFIC NOTATION +3533 f0f0 a7 41 STA 1,U * FLAG) AND SAVE IT IN THE STRING +3534 f0f2 86 2f LDA #'0-1 INITIALIZE ACCA TO ASCII ZERO +3535 +3536 +3537 f0f4 4c LBEAB INCA ADD ONE TO 10’S DIGIT OF EXPONENT +3538 f0f5 c0 0a SUBB #10 SUBTRACT 10 FROM ACCB +3539 f0f7 24 fb BCC LBEAB ADD 1 TO 10’S DIGIT IF NO CARRY +3540 f0f9 cb 3a ADDB #'9+1 CONVERT UNITS DIGIT TO ASCII +3541 f0fb ed 43 STD 3,U SAVE EXPONENT IN STRING +3542 f0fd 6f 45 CLR 5,U CLEAR LAST BYTE (TERMINATOR) +3543 f0ff 20 04 BRA LBEBC GO RESET POINTER +3544 f101 a7 c4 LBEB8 STA ,U STORE LAST CHARACTER +3545 f103 6f 41 LBEBA CLR 1,U CLEAR LAST BYTE (TERMINATOR - REQUIRED BY +3546 * PRINT SUBROUTINES) +3547 f105 8e 01 f1 LBEBC LDX #STRBUF+3 RESET POINTER TO START OF BUFFER +3548 f108 39 RTS +3549 * +3550 f109 80 00 00 00 00 LBEC0 FCB $80,$00,$00,$00,$00 FLOATING POINT .5 +3551 * +3552 *** TABLE OF UNNORMALIZED POWERS OF 10 +3553 f10e fa 0a 1f 00 LBEC5 FCB $FA,$0A,$1F,$00 -100000000 +3554 f112 00 98 96 80 LBEC9 FCB $00,$98,$96,$80 10000000 +3555 f116 ff f0 bd c0 LBECD FCB $FF,$F0,$BD,$C0 -1000000 +3556 f11a 00 01 86 a0 LBED1 FCB $00,$01,$86,$A0 100000 +3557 f11e ff ff d8 f0 LBED5 FCB $FF,$FF,$D8,$F0 -10000 +3558 f122 00 00 03 e8 LBED9 FCB $00,$00,$03,$E8 1000 +3559 f126 ff ff ff 9c LBEDD FCB $FF,$FF,$FF,$9C -100 +3560 f12a 00 00 00 0a LBEE1 FCB $00,$00,$00,$0A 10 +3561 f12e ff ff ff ff LBEE5 FCB $FF,$FF,$FF,$FF -1 +3562 * +3563 * +3564 f132 96 4f LBEE9 LDA FP0EXP GET EXPONENT OF FPA0 +3565 f134 27 02 BEQ LBEEF BRANCH IF FPA0 = 0 +3566 f136 03 54 COM FP0SGN TOGGLE MANTISSA SIGN OF FPA0 +3567 f138 39 LBEEF RTS +3568 * EXPAND A POLYNOMIAL OF THE FORM +3569 * AQ+BQ**3+CQ**5+DQ**7.... WHERE Q = FPA0 +3570 * AND THE X REGISTER POINTS TO A TABLE OF +3571 * COEFFICIENTS A,B,C,D.... +3572 f139 9f 64 LBEF0 STX COEFPT SAVE COEFFICIENT TABLE POINTER +3573 f13b bd ee 78 JSR LBC2F MOVE FPA0 TO FPA3 +3574 f13e 8d 05 BSR LBEFC MULTIPLY FPA3 BY FPA0 +3575 f140 8d 08 BSR LBF01 EXPAND POLYNOMIAL +3576 f142 8e 00 40 LDX #V40 POINT X TO FPA3 +3577 f145 7e ed 13 LBEFC JMP LBACA MULTIPLY (X) BY FPA0 +3578 +3579 * CALCULATE THE VALUE OF AN EXPANDED POLYNOMIAL +3580 * EXPRESSION. ENTER WITH (X) POINTING TO A TABLE +3581 * OF COEFFICIENTS, THE FIRST BYTE OF WHICH IS THE +3582 * NUMBER OF (COEFFICIENTS-1) FOLLOWED BY THAT NUMBER +3583 * OF PACKED FLOATING POINT NUMBERS. THE +3584 * POLYNOMIAL IS EVALUATED AS FOLLOWS: VALUE = +3585 * (((FPA0*Y0+Y1)*FPA0+Y2)*FPA0…YN) +3586 f148 9f 64 LBEFF STX COEFPT SAVE COEFFICIENT TABLE POINTER +3587 f14a bd ee 73 LBF01 JSR LBC2A MOVE FPA0 TO FPA4 +3588 f14d 9e 64 LDX COEFPT GET THE COEFFICIENT POINTER +3589 f14f e6 80 LDB ,X+ GET THE TOP OF COEFFICIENT TABLE TO +3590 f151 d7 55 STB COEFCT * USE AND STORE IT IN TEMPORARY COUNTER +3591 f153 9f 64 STX COEFPT SAVE NEW COEFFICIENT POINTER +3592 f155 8d ee LBF0C BSR LBEFC MULTIPLY (X) BY FPA0 +3593 f157 9e 64 LDX COEFPT *GET COEFFICIENT POINTER +3594 f159 30 05 LEAX 5,X *MOVE TO NEXT FP NUMBER +3595 f15b 9f 64 STX COEFPT *SAVE NEW COEFFICIENT POINTER +3596 f15d bd ec 0b JSR LB9C2 ADD (X) AND FPA0 +3597 f160 8e 00 45 LDX #V45 POINT (X) TO FPA4 +3598 f163 0a 55 DEC COEFCT DECREMENT TEMP COUNTER +3599 f165 26 ee BNE LBF0C BRANCH IF MORE COEFFICIENTS LEFT +3600 f167 39 RTS +3601 +3602 * RND +3603 f168 bd ee b6 RND JSR LBC6D TEST FPA0 +3604 f16b 2b 1f BMI LBF45 BRANCH IF FPA0 = NEGATIVE +3605 f16d 27 15 BEQ LBF3B BRANCH IF FPA0 = 0 +3606 f16f 8d 10 BSR LBF38 CONVERT FPA0 TO AN INTEGER +3607 f171 bd ee 78 JSR LBC2F PACK FPA0 TO FPA3 +3608 f174 8d 0e BSR LBF3B GET A RANDOM NUMBER: FPA0 < 1.0 +3609 f176 8e 00 40 LDX #V40 POINT (X) TO FPA3 +3610 f179 8d ca BSR LBEFC MULTIPLY (X) BY FPA0 +3611 f17b 8e ed 0e LDX #LBAC5 POINT (X) TO FP VALUE OF 1.0 +3612 f17e bd ec 0b JSR LB9C2 ADD 1.0 TO FPA0 +3613 f181 7e ef 37 LBF38 JMP INT CONVERT FPA0 TO AN INTEGER +3614 * CALCULATE A RANDOM NUMBER IN THE RANGE 0.0 < X <= 1.0 +3615 f184 9e b1 LBF3B LDX RVSEED+1 * MOVE VARIABLE +3616 f186 9f 50 STX FPA0 * RANDOM NUMBER +3617 f188 9e b3 LDX RVSEED+3 * SEED TO +3618 f18a 9f 52 STX FPA0+2 * FPA0 +3619 f18c be f1 b9 LBF45 LDX RSEED = MOVE FIXED +3620 f18f 9f 5d STX FPA1 = RANDOM NUMBER +3621 f191 be f1 bb LDX RSEED+2 = SEED TO +3622 f194 9f 5f STX FPA1+2 = MANTISSA OF FPA0 +3623 f196 bd ed 19 JSR LBAD0 MULTIPLY FPA0 X FPA1 +3624 f199 dc 8a LDD VAD GET THE TWO LOWEST ORDER PRODUCT BYTES +3625 f19b c3 65 8b ADDD #$658B ADD A CONSTANT +3626 f19e dd b3 STD RVSEED+3 SAVE NEW LOW ORDER VARIABLE RANDOM # SEED +3627 f1a0 dd 52 STD FPA0+2 SAVE NEW LOW ORDER BYTES OF FPA0 MANTISSA +3628 f1a2 dc 88 LDD VAB GET 2 MORE LOW ORDER PRODUCT BYTES +3629 f1a4 c9 b0 ADCB #$B0 ADD A CONSTANT +3630 f1a6 89 05 ADCA #5 ADD A CONSTANT +3631 f1a8 dd b1 STD RVSEED+1 SAVE NEW HIGH ORDER VARIABLE RANDOM # SEED +3632 f1aa dd 50 STD FPA0 SAVE NEW HIGH ORDER FPA0 MANTISSA +3633 f1ac 0f 54 CLR FP0SGN FORCE FPA0 MANTISSA = POSITIVE +3634 f1ae 86 80 LDA #$80 * SET FPA0 BIASED EXPONENT +3635 f1b0 97 4f STA FP0EXP * TO 0 1 < FPA0 < 0 +3636 f1b2 96 15 LDA FPA2+2 GET A BYTE FROM FPA2 (MORE RANDOMNESS) +3637 f1b4 97 63 STA FPSBYT SAVE AS SUB BYTE +3638 f1b6 7e ec 65 JMP LBA1C NORMALIZE FPA0 +3639 * +3640 f1b9 40 e6 RSEED FDB $40E6 *CONSTANT RANDOM NUMBER GENERATOR SEED +3641 f1bb 4d ab FDB $4DAB * +3642 +3643 * SIN +3644 * THE SIN FUNCTION REQUIRES AN ARGUMENT IN RADIANS AND WILL REPEAT ITSELF EVERY +3645 * 2*PI RADIANS. THE ARGUMENT IS DIVIDED BY 2*PI AND ONLY THE FRACTIONAL PART IS +3646 * RETAINED. SINCE THE ARGUMENT WAS DIVIDED BY 2*P1, THE COEFFICIENTS MUST BE +3647 * MULTIPLIED BY THE APPROPRIATE POWER OF 2*PI. +3648 +3649 * SIN IS EVALUATED USING THE TRIGONOMETRIC IDENTITIES BELOW: +3650 * SIN(X)=SIN(PI-X) & -SIN(PI/2-X)=SIN((3*PI)/2+X) +3651 f1bd bd ee a8 SIN JSR LBC5F COPY FPA0 TO FPA1 +3652 f1c0 8e f2 02 LDX #LBFBD POINT (X) TO 2*PI +3653 f1c3 d6 61 LDB FP1SGN *GET MANTISSA SIGN OF FPA1 +3654 f1c5 bd ed d2 JSR LBB89 *AND DIVIDE FPA0 BY 2*PI +3655 f1c8 bd ee a8 JSR LBC5F COPY FPA0 TO FPA1 +3656 f1cb 8d b4 BSR LBF38 CONVERT FPA0 TO AN INTEGER +3657 f1cd 0f 62 CLR RESSGN SET RESULT SIGN = POSITIVE +3658 f1cf 96 5c LDA FP1EXP *GET EXPONENT OF FPA1 +3659 f1d1 d6 4f LDB FP0EXP *GET EXPONENT OF FPA0 +3660 f1d3 bd ec 05 JSR LB9BC *SUBTRACT FPA0 FROM FPA1 +3661 * NOW FPA0 CONTAINS ONLY THE FRACTIONAL PART OF ARGUMENT/2*PI +3662 f1d6 8e f2 07 LDX #LBFC2 POINT X TO FP (.25) +3663 f1d9 bd ec 02 JSR LB9B9 SUBTRACT FPA0 FROM .25 (PI/2) +3664 f1dc 96 54 LDA FP0SGN GET MANTISSA SIGN OF FPA0 +3665 f1de 34 02 PSHS A SAVE IT ON STACK +3666 f1e0 2a 09 BPL LBFA6 BRANCH IF MANTISSA POSITIVE +3667 f1e2 bd eb fd JSR LB9B4 ADD .5 (PI) TO FPA0 +3668 f1e5 96 54 LDA FP0SGN GET SIGN OF FPA0 +3669 f1e7 2b 05 BMI LBFA9 BRANCH IF NEGATIVE +3670 f1e9 03 0a COM RELFLG COM IF +(3*PI)/2 >= ARGUMENT >+ PI/2 (QUADRANT FLAG) +3671 f1eb bd f1 32 LBFA6 JSR LBEE9 TOGGLE MANTISSA SIGN OF FPA0 +3672 f1ee 8e f2 07 LBFA9 LDX #LBFC2 POINT X TO FP (.25) +3673 f1f1 bd ec 0b JSR LB9C2 ADD .25 (PI/2) TO FPA0 +3674 f1f4 35 02 PULS A GET OLD MANTISSA SIGN +3675 f1f6 4d TSTA * BRANCH IF OLD +3676 f1f7 2a 03 BPL LBFB7 * SIGN WAS POSITIVE +3677 f1f9 bd f1 32 JSR LBEE9 TOGGLE MANTISSA SIGN +3678 f1fc 8e f2 0c LBFB7 LDX #LBFC7 POINT X TO TABLE OF COEFFICIENTS +3679 f1ff 7e f1 39 JMP LBEF0 GO CALCULATE POLYNOMIAL VALUE +3680 +3681 f202 83 49 0f da a2 LBFBD FCB $83,$49,$0F,$DA,$A2 6.28318531 (2*PI) +3682 f207 7f 00 00 00 00 LBFC2 FCB $7F,$00,$00,$00,$00 .25 +3683 +3684 +3685 f20c 05 LBFC7 FCB 6-1 SIX COEFFICIENTS +3686 f20d 84 e6 1a 2d 1b LBFC8 FCB $84,$E6,$1A,$2D,$1B * -((2*PI)**11)/11! +3687 f212 86 28 07 fb f8 LBFCD FCB $86,$28,$07,$FB,$F8 * ((2*PI)**9)/9! +3688 f217 87 99 68 89 01 LBFD2 FCB $87,$99,$68,$89,$01 * -((2*PI)**7)/7! +3689 f21c 87 23 35 df e1 LBFD7 FCB $87,$23,$35,$DF,$E1 * ((2*PI)**5)/5! +3690 f221 86 a5 5d e7 28 LBFDC FCB $86,$A5,$5D,$E7,$28 * -((2*PI)**3)/3! +3691 f226 83 49 0f da a2 LBFE1 FCB $83,$49,$0F,$DA,$A2 * +3692 +3693 f22b a1 54 46 8f 13 FCB $A1,$54,$46,$8F,$13 UNUSED GARBAGE BYTES +3694 f230 8f 52 43 89 cd FCB $8F,$52,$43,$89,$CD UNUSED GARBAGE BYTES +3695 * EXTENDED BASIC +3696 +3697 * COS +3698 * THE VALUE OF COS(X) IS DETERMINED BY THE TRIG IDENTITY COS(X)=SIN((PI/2)+X) +3699 f235 8e f2 68 COS LDX #L83AB POINT X TO FP CONSTANT (P1/2) +3700 f238 bd ec 0b JSR LB9C2 ADD FPA0 TO (X) +3701 f23b 7e f1 bd L837E JMP SIN JUMP TO SIN ROUTINE +3702 +3703 * TAN +3704 * THE VALUE OF TAN(X) IS DETERMINED BY THE TRIG IDENTITY TAN(X)=SIN(X)/COS(X) +3705 f23e bd ee 78 TAN JSR LBC2F PACK FPA0 AND MOVE IT TO FPA3 +3706 f241 0f 0a CLR RELFLG RESET QUADRANT FLAG +3707 f243 8d f6 BSR L837E CALCULATE SIN OF ARGUMENT +3708 f245 8e 00 4a LDX #V4A POINT X TO FPA5 +3709 f248 bd ee 7e JSR LBC35 PACK FPA0 AND MOVE IT TO FPA5 +3710 f24b 8e 00 40 LDX #V40 POINT X TO FPA3 +3711 f24e bd ee 5d JSR LBC14 MOVE FPA3 TO FPA0 +3712 f251 0f 54 CLR FP0SGN FORCE FPA0 MANTISSA TO BE POSITIVE +3713 f253 96 0a LDA RELFLG GET THE QUADRANT FLAG - COS NEGATIVE IN QUADS 2,3 +3714 f255 8d 0c BSR L83A6 CALCULATE VALUE OF COS(FPA0) +3715 f257 0d 4f TST FP0EXP CHECK EXPONENT OF FPA0 +3716 f259 10 27 fa 7e LBEQ LBA92 ‘OV’ ERROR IF COS(X)=0 +3717 f25d 8e 00 4a LDX #V4A POINT X TO FPA5 +3718 f260 7e ed d8 L83A3 JMP LBB8F DIVIDE (X) BY FPA0 - SIN(X)/COS(X) +3719 f263 34 02 L83A6 PSHS A SAVE SIGN FLAG ON STACK +3720 f265 7e f1 eb JMP LBFA6 EXPAND POLYNOMIAL +3721 +3722 f268 81 49 0f da a2 L83AB FCB $81,$49,$0F,$DA,$A2 1.57079633 (PI/2) +3723 +3724 * ATN +3725 * A 12 TERM TAYLOR SERIES IS USED TO EVALUATE THE +3726 * ARCTAN EXPRESSION. TWO DIFFERENT FORMULI ARE USED +3727 * TO EVALUATE THE EXPRESSION DEPENDING UPON +3728 * WHETHER OR NOT THE ARGUMENT SQUARED IS > OR < 1.0 +3729 +3730 * IF X**2<1 THEN ATN=X-(X**3)/3+(X**5)/5-(X**7)/7. . . +3731 * IF X**2>=1 THEN ATN=PI/2-(1/X-1/((X**3)*3)+(1/((X**5)*5)-. . .) +3732 +3733 f26d 96 54 ATN LDA FP0SGN * GET THE SIGN OF THE MANTISSA AND +3734 f26f 34 02 PSHS A * SAVE IT ON THE STACK +3735 f271 2a 02 BPL L83B8 BRANCH IF POSITIVE MANTISSA +3736 f273 8d 24 BSR L83DC CHANGE SIGN OF FPA0 +3737 f275 96 4f L83B8 LDA FP0EXP * GET EXPONENT OF FPA0 AND +3738 f277 34 02 PSHS A * SAVE IT ON THE STACK +3739 f279 81 81 CMPA #$81 IS FPAO < 1.0? +3740 f27b 25 05 BLO L83C5 YES +3741 f27d 8e ed 0e LDX #LBAC5 POINT X TO FP CONSTANT 1.0 +3742 f280 8d de BSR L83A3 GET RECIPROCAL OF FPA0 +3743 f282 8e f2 9d L83C5 LDX #L83E0 POINT (X) TO TAYLOR SERIES COEFFICIENTS +3744 f285 bd f1 39 JSR LBEF0 EXPAND POLYNOMIAL +3745 f288 35 02 PULS A GET EXPONENT OF ARGUMENT +3746 f28a 81 81 CMPA #$81 WAS ARGUMENT < 1.0? +3747 f28c 25 06 BLO L83D7 YES +3748 f28e 8e f2 68 LDX #L83AB POINT (X) TO FP NUMBER (PI/2) +3749 f291 bd ec 02 JSR LB9B9 SUBTRACT FPA0 FROM (PI/2) +3750 f294 35 02 L83D7 PULS A * GET SIGN OF INITIAL ARGUMENT MANTISSA +3751 f296 4d TSTA * AND SET FLAGS ACCORDING TO IT +3752 f297 2a 03 BPL L83DF RETURN IF ARGUMENT WAS POSITIVE +3753 f299 7e f1 32 L83DC JMP LBEE9 CHANGE MANTISSA SIGN OF FPA0 +3754 f29c 39 L83DF RTS +3755 * +3756 * TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR ARCTANGENT +3757 f29d 0b L83E0 FCB $0B TWELVE COEFFICIENTS +3758 f29e 76 b3 83 bd d3 L83E1 FCB $76,$B3,$83,$BD,$D3 -6.84793912E-04 1/23 +3759 f2a3 79 1e f4 a6 f5 L83E6 FCB $79,$1E,$F4,$A6,$F5 +4.85094216E-03 1/21 +3760 f2a8 7b 83 fc b0 10 L83EB FCB $7B,$83,$FC,$B0,$10 -0.0161117018 +3761 f2ad 7c 0c 1f 67 ca L83F0 FCB $7C,$0C,$1F,$67,$CA 0.0342096381 +3762 f2b2 7c de 53 cb c1 L83F5 FCB $7C,$DE,$53,$CB,$C1 -0.0542791328 +3763 f2b7 7d 14 64 70 4c L83FA FCB $7D,$14,$64,$70,$4C 0.0724571965 +3764 f2bc 7d b7 ea 51 7a L83FF FCB $7D,$B7,$EA,$51,$7A -0.0898023954 +3765 f2c1 7d 63 30 88 7e L8404 FCB $7D,$63,$30,$88,$7E 0.110932413 +3766 f2c6 7e 92 44 99 3a L8409 FCB $7E,$92,$44,$99,$3A -0.142839808 +3767 f2cb 7e 4c cc 91 c7 L840E FCB $7E,$4C,$CC,$91,$C7 0.199999121 +3768 f2d0 7f aa aa aa 13 L8413 FCB $7F,$AA,$AA,$AA,$13 -0.333333316 +3769 f2d5 81 00 00 00 00 L8418 FCB $81,$00,$00,$00,$00 1 +3770 * +3771 *** TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR LN(X) +3772 * +3773 f2da 03 L841D FCB 3 FOUR COEFFICIENTS +3774 f2db 7f 5e 56 cb 79 L841E FCB $7F,$5E,$56,$CB,$79 0.434255942 +3775 f2e0 80 13 9b 0b 64 L8423 FCB $80,$13,$9B,$0B,$64 0.576584541 +3776 f2e5 80 76 38 93 16 L8428 FCB $80,$76,$38,$93,$16 0.961800759 +3777 f2ea 82 38 aa 3b 20 L842D FCB $82,$38,$AA,$3B,$20 2.88539007 +3778 +3779 f2ef 80 35 04 f3 34 L8432 FCB $80,$35,$04,$F3,$34 1/SQR(2) +3780 +3781 f2f4 81 35 04 f3 34 L8437 FCB $81,$35,$04,$F3,$34 SQR(2) +3782 +3783 f2f9 80 80 00 00 00 L843C FCB $80,$80,$00,$00,$00 -0.5 +3784 +3785 f2fe 80 31 72 17 f8 L8441 FCB $80,$31,$72,$17,$F8 LN(2) +3786 * +3787 * LOG - NATURAL LOGARITHM (LN) +3788 +3789 * THE NATURAL OR NAPERIAN LOGARITHM IS CALCULATED USING +3790 * MATHEMATICAL IDENTITIES. FPA0 IS OF THE FORM FPA0=A*(2**B) (SCIENTIFIC +3791 * NOTATION). THEREFORE, THE LOG ROUTINE DETERMINES THE VALUE OF +3792 * LN(A*(2**B)). A SERIES OF MATHEMATICAL IDENTITIES WILL EXPAND THIS +3793 * TERM: LN(A*(2**B))=(-1/2+(1/LN(2))*(LN(A*SQR(2)))+B)*LN(2). ALL OF +3794 * THE TERMS OF THE LATTER EXPRESSION ARE CONSTANTS EXCEPT FOR THE +3795 * LN(A*SQR(2)) TERM WHICH IS EVALUATED USING THE TAYLOR SERIES EXPANSION +3796 f303 bd ee b6 LOG JSR LBC6D CHECK STATUS OF FPA0 +3797 f306 10 2f f3 c4 LBLE LB44A ‘FC’ ERROR IF NEGATIVE OR ZERO +3798 f30a 8e f2 ef LDX #L8432 POINT (X) TO FP NUMBER (1/SQR(2)) +3799 f30d 96 4f LDA FP0EXP *GET EXPONENT OF ARGUMENT +3800 f30f 80 80 SUBA #$80 *SUBTRACT OFF THE BIAS AND +3801 f311 34 02 PSHS A *SAVE IT ON THE STACK +3802 f313 86 80 LDA #$80 +3803 f315 97 4f STA FP0EXP +3804 f317 bd ec 0b JSR LB9C2 ADD FPA0 TO (X) +3805 f31a 8e f2 f4 LDX #L8437 POINT X TO SQR(2) +3806 f31d bd ed d8 JSR LBB8F DIVIDE SQR(2) BY FPA0 +3807 f320 8e ed 0e LDX #LBAC5 POINT X TO FP VALUE OF 1.00 +3808 f323 bd ec 02 JSR LB9B9 SUBTRACT FPA0 FROM (X) +3809 * NOW FPA0 = (1-SQR(2)*X)/(1+SQR(2)*X) WHERE X IS ARGUMENT +3810 f326 8e f2 da LDX #L841D POINT X TO TABLE OF COEFFICIENTS +3811 f329 bd f1 39 JSR LBEF0 EXPAND POLYNOMIAL +3812 f32c 8e f2 f9 LDX #L843C POINT X TO FP VALUE OF (-.5) +3813 f32f bd ec 0b JSR LB9C2 ADD FPA0 TO X +3814 f332 35 04 PULS B GET EXPONENT OF ARGUMENT BACK (WITHOUT BIAS) +3815 f334 bd ef e2 JSR LBD99 ADD ACCB TO FPA0 +3816 f337 8e f2 fe LDX #L8441 POINT X TO LN(2) +3817 f33a 7e ed 13 JMP LBACA MULTIPLY FPA0 * LN(2) +3818 +3819 * SQR +3820 f33d bd ee a8 SQR JSR LBC5F MOVE FPA0 TO FPA1 +3821 f340 8e f1 09 LDX #LBEC0 POINT (X) TO FP NUMBER (.5) +3822 f343 bd ee 5d JSR LBC14 COPY A PACKED NUMBER FROM (X) TO FPA0 +3823 +3824 * ARITHMETIC OPERATOR FOR EXPONENTIATION JUMPS +3825 * HERE. THE FORMULA USED TO EVALUATE EXPONENTIATION +3826 * IS A**X=E**(X LN A) = E**(FPA0*LN(FPA1)), E=2.7182818 +3827 f346 27 67 L8489 BEQ EXP DO A NATURAL EXPONENTIATION IF EXPONENT = 0 +3828 f348 4d TSTA *CHECK VALUE BEING EXPONENTIATED +3829 f349 26 03 BNE L8491 *AND BRANCH IF IT IS <> 0 +3830 f34b 7e ec 83 JMP LBA3A FPA0=0 IF RAISING ZERO TO A POWER +3831 f34e 8e 00 4a L8491 LDX #V4A * PACK FPA0 AND SAVE +3832 f351 bd ee 7e JSR LBC35 * IT IN FPA5 (ARGUMENT’S EXPONENT) +3833 f354 5f CLRB ACCB=DEFAULT RESULT SIGN FLAG; 0=POSITIVE +3834 f355 96 61 LDA FP1SGN *CHECK THE SIGN OF ARGUMENT +3835 f357 2a 10 BPL L84AC *BRANCH IF POSITIVE +3836 f359 bd ef 37 JSR INT CONVERT EXPONENT INTO AN INTEGER +3837 f35c 8e 00 4a LDX #V4A POINT X TO FPA5 (ORIGINAL EXPONENT) +3838 f35f 96 61 LDA FP1SGN GET MANTISSA SIGN OF FPA1 (ARGUMENT) +3839 f361 bd ee e9 JSR LBCA0 *COMPARE FPA0 TO (X) AND +3840 f364 26 03 BNE L84AC *BRANCH IF NOT EQUAL +3841 f366 43 COMA TOGGLE FPA1 MANTISSA SIGN - FORCE POSITIVE +3842 f367 d6 01 LDB CHARAC GET LS BYTE OF INTEGER VALUE OF EXPONENT (RESULT SIGN FLAG) +3843 f369 bd ee 95 L84AC JSR LBC4C COPY FPA1 TO FPA0; ACCA = MANTISSA SIGN +3844 f36c 34 04 PSHS B PUT RESULT SIGN FLAG ON THE STACK +3845 f36e bd f3 03 JSR LOG +3846 f371 8e 00 4a LDX #V4A POINT (X) TO FPA5 +3847 f374 bd ed 13 JSR LBACA MULTIPLY FPA0 BY FPA5 +3848 f377 8d 36 BSR EXP CALCULATE E**(FPA0) +3849 f379 35 02 PULS A * GET RESULT SIGN FLAG FROM THE STACK +3850 f37b 46 RORA * AND BRANCH IF NEGATIVE +3851 f37c 10 25 fd b2 LBCS LBEE9 CHANGE SIGN OF FPA0 MANTISSA +3852 f380 39 RTS +3853 +3854 * CORRECTION FACTOR FOR EXPONENTIAL FUNCTION +3855 f381 81 38 aa 3b 29 L84C4 FCB $81,$38,$AA,$3B,$29 1.44269504 ( CF ) +3856 * +3857 * TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR E**X +3858 * +3859 f386 07 L84C9 FCB 7 EIGHT COEFFICIENTS +3860 f387 71 34 58 3e 56 L84CA FCB $71,$34,$58,$3E,$56 2.14987637E-05: 1/(7!*(CF**7)) +3861 f38c 74 16 7e b3 1b L84CF FCB $74,$16,$7E,$B3,$1B 1.4352314E-04 : 1/(6!*(CF**6)) +3862 f391 77 2f ee e3 85 L84D4 FCB $77,$2F,$EE,$E3,$85 1.34226348E-03: 1/(5!*(CF**5)) +3863 f396 7a 1d 84 1c 2a L84D9 FCB $7A,$1D,$84,$1C,$2A 9.61401701E-03: 1/(4!*(CF**4)) +3864 f39b 7c 63 59 58 0a L84DE FCB $7C,$63,$59,$58,$0A 0.0555051269 +3865 f3a0 7e 75 fd e7 c6 L84E3 FCB $7E,$75,$FD,$E7,$C6 0.240226385 +3866 f3a5 80 31 72 18 10 L84E8 FCB $80,$31,$72,$18,$10 0.693147186 +3867 f3aa 81 00 00 00 00 L84ED FCB $81,$00,$00,$00,$00 1 +3868 * +3869 * EXP ( E**X) +3870 * THE EXPONENTIAL FUNCTION IS EVALUATED BY FIRST MULTIPLYING THE +3871 * ARGUMENT BY A CORRECTION FACTOR (CF). AFTER THIS IS DONE, AN +3872 * ARGUMENT >= 127 WILL YIELD A ZERO RESULT (NO UNDERFLOW) FOR A +3873 * NEGATIVE ARGUMENT OR AN 'OV' (OVERFLOW) ERROR FOR A POSITIVE +3874 * ARGUMENT. THE POLYNOMIAL COEFFICIENTS ARE MODIFIED TO REFLECT +3875 * THE CF MULTIPLICATION AT THE START OF THE EVALUATION PROCESS. +3876 +3877 f3af 8e f3 81 EXP LDX #L84C4 POINT X TO THE CORRECTION FACTOR +3878 f3b2 bd ed 13 JSR LBACA MULTIPLY FPA0 BY (X) +3879 f3b5 bd ee 78 JSR LBC2F PACK FPA0 AND STORE IT IN FPA3 +3880 f3b8 96 4f LDA FP0EXP *GET EXPONENT OF FPA0 AND +3881 f3ba 81 88 CMPA #$88 *COMPARE TO THE MAXIMUM VALUE +3882 f3bc 25 03 BLO L8504 BRANCH IF FPA0 < 128 +3883 f3be 7e ed a5 L8501 JMP LBB5C SET FPA0 = 0 OR ‘OV’ ERROR +3884 f3c1 bd ef 37 L8504 JSR INT CONVERT FPA0 TO INTEGER +3885 f3c4 96 01 LDA CHARAC GET LS BYTE OF INTEGER +3886 f3c6 8b 81 ADDA #$81 * WAS THE ARGUMENT =127, IF SO +3887 f3c8 27 f4 BEQ L8501 * THEN ‘OV’ ERROR; THIS WILL ALSO ADD THE $80 BIAS +3888 * * REQUIRED WHEN THE NEW EXPONENT IS CALCULATED BELOW +3889 f3ca 4a DECA DECREMENT ONE FROM THE EXPONENT, BECAUSE $81, NOT $80 WAS USED ABOVE +3890 f3cb 34 02 PSHS A SAVE EXPONENT OF INTEGER PORTION ON STACK +3891 f3cd 8e 00 40 LDX #V40 POINT (X) TO FPA3 +3892 f3d0 bd ec 02 JSR LB9B9 SUBTRACT FPA0 FROM (X) - GET FRACTIONAL PART OF ARGUMENT +3893 f3d3 8e f3 86 LDX #L84C9 POINT X TO COEFFICIENTS +3894 f3d6 bd f1 48 JSR LBEFF EVALUATE POLYNOMIAL FOR FRACTIONAL PART +3895 f3d9 0f 62 CLR RESSGN FORCE THE MANTISSA TO BE POSITIVE +3896 f3db 35 02 PULS A GET INTEGER EXPONENT FROM STACK +3897 f3dd bd ed 91 JSR LBB48 * CALCULATE EXPONENT OF NEW FPA0 BY ADDING THE EXPONENTS OF THE +3898 * * INTEGER AND FRACTIONAL PARTS +3899 f3e0 39 RTS +3900 +3901 * FIX +3902 f3e1 bd ee b6 FIX JSR LBC6D CHECK STATUS OF FPA0 +3903 f3e4 2b 03 BMI L852C BRANCH IF FPA0 = NEGATIVE +3904 f3e6 7e ef 37 L8529 JMP INT CONVERT FPA0 TO INTEGER +3905 f3e9 03 54 L852C COM FP0SGN TOGGLE SIGN OF FPA0 MANTISSA +3906 f3eb 8d f9 BSR L8529 CONVERT FPA0 TO INTEGER +3907 f3ed 7e f1 32 JMP LBEE9 TOGGLE SIGN OF FPA0 +3908 +3909 * EDIT +3910 f3f0 bd f8 1e EDIT JSR L89AE GET LINE NUMBER FROM BASIC +3911 f3f3 32 62 LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK +3912 f3f5 86 01 L8538 LDA #$01 ‘LIST’ FLAG +3913 f3f7 97 98 STA VD8 SET FLAG TO LIST LINE +3914 f3f9 bd df a2 JSR LAD01 GO FIND THE LINE NUMBER IN PROGRAM +3915 f3fc 10 25 ed 7f LBCS LAED2 ERROR #7 ‘UNDEFINED LINE #' +3916 f400 bd ea 3b JSR LB7C2 GO UNCRUNCH LINE INTO BUFFER AT LINBUF+1 +3917 f403 1f 20 TFR Y,D PUT ABSOLUTE ADDRESS OF END OF LINE TO ACCD +3918 f405 83 00 f5 SUBD #LINBUF+2 SUBTRACT OUT THE START OF LINE +3919 f408 d7 97 STB VD7 SAVE LENGTH OF LINE +3920 f40a dc 2b L854D LDD BINVAL GET THE HEX VALUE OF LINE NUMBER +3921 f40c bd f0 15 JSR LBDCC LIST THE LINE NUMBER ON THE SCREEN +3922 f40f bd eb f5 JSR LB9AC PRINT A SPACE +3923 f412 8e 00 f4 LDX #LINBUF+1 POINT X TO BUFFER +3924 f415 d6 98 LDB VD8 * CHECK TO SEE IF LINE IS TO BE +3925 f417 26 25 BNE L8581 * LISTED TO SCREEN - BRANCH IF IT IS +3926 f419 5f L855C CLRB RESET DIGIT ACCUMULATOR - DEFAULT VALUE +3927 f41a bd f5 44 L855D JSR L8687 GET KEY STROKE +3928 f41d bd fc e9 JSR L90AA SET CARRY IF NOT NUMERIC +3929 f420 25 0b BLO L8570 BRANCH IF NOT NUMERIC +3930 f422 80 30 SUBA #'0' MASK OFF ASCII +3931 f424 34 02 PSHS A SAVE IT ON STACK +3932 f426 86 0a LDA #10 NUMBER BEING CONVERTED IS BASE 10 +3933 f428 3d MUL MULTIPLY ACCUMULATED VALUE BY BASE (10) +3934 f429 eb e0 ADDB ,S+ ADD DIGIT TO ACCUMULATED VALUE +3935 f42b 20 ed BRA L855D CHECK FOR ANOTHER DIGIT +3936 f42d c0 01 L8570 SUBB #$01 * REPEAT PARAMETER IN ACCB; IF IT +3937 f42f c9 01 ADCB #$01 *IS 0, THEN MAKE IT ‘1’ +3938 f431 81 41 CMPA #'A' ABORT? +3939 f433 26 05 BNE L857D NO +3940 f435 bd eb a5 JSR LB958 PRINT CARRIAGE RETURN TO SCREEN +3941 f438 20 bb BRA L8538 RESTART EDIT PROCESS - CANCEL ALL CHANGES +3942 f43a 81 4c L857D CMPA #'L' LIST? +3943 f43c 26 0b BNE L858C NO +3944 f43e 8d 31 L8581 BSR L85B4 LIST THE LINE +3945 f440 0f 98 CLR VD8 RESET THE LIST FLAG TO ‘NO LIST’ +3946 f442 bd eb a5 JSR LB958 PRINT CARRIAGE RETURN +3947 f445 20 c3 BRA L854D GO INTERPRET ANOTHER EDIT COMMAND +3948 f447 32 62 L858A LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK +3949 f449 81 0d L858C CMPA #CR ENTER KEY? +3950 f44b 26 0d BNE L859D NO +3951 f44d 8d 22 BSR L85B4 ECHO THE LINE TO THE SCREEN +3952 f44f bd eb a5 L8592 JSR LB958 PRINT CARRIAGE RETURN +3953 f452 8e 00 f4 LDX #LINBUF+1 * RESET BASIC’S INPUT POINTER +3954 f455 9f 83 STX CHARAD * TO THE LINE INPUT BUFFER +3955 f457 7e df 4b JMP LACA8 GO PUT LINE BACK IN PROGRAM +3956 f45a 81 45 L859D CMPA #'E' EXIT? +3957 f45c 27 f1 BEQ L8592 YES - SAME AS ENTER EXCEPT NO ECHO +3958 f45e 81 51 CMPA #'Q' QUIT? +3959 f460 26 06 BNE L85AB NO +3960 f462 bd eb a5 JSR LB958 PRINT CARRIAGE RETURN TO SCREEN +3961 f465 7e df 22 JMP LAC73 GO TO COMMAND LEVEL - MAKE NO CHANGES +3962 f468 8d 02 L85AB BSR L85AF INTERPRET THE REMAINING COMMANDS AS SUBROUTINES +3963 f46a 20 ad BRA L855C GO INTERPRET ANOTHER EDIT COMMAND +3964 f46c 81 20 L85AF CMPA #SPACE SPACE BAR? +3965 f46e 26 10 BNE L85C3 NO +3966 f470 8c L85B3 FCB SKP2 SKIP TWO BYTES +3967 * DISPLAY THE NEXT ACCB BYTES OF THE LINE IN THE BUFFER TO THE SCREEN +3968 * +3969 f471 c6 f9 L85B4 LDB #LBUFMX-1 250 BYTES MAX IN BUFFER +3970 f473 a6 84 L85B6 LDA ,X GET A CHARACTER FROM BUFFER +3971 f475 27 08 BEQ L85C2 EXIT IF IT’S A 0 +3972 f477 bd db 14 JSR PUTCHR SEND CHAR TO CONSOLE OUT +3973 f47a 30 01 LEAX $01,X MOVE POINTER UP ONE +3974 f47c 5a DECB DECREMENT CHARACTER COUNTER +3975 f47d 26 f4 BNE L85B6 LOOP IF NOT DONE +3976 f47f 39 L85C2 RTS +3977 f480 81 44 L85C3 CMPA #'D' DELETE? +3978 f482 26 48 BNE L860F NO +3979 f484 6d 84 L85C7 TST ,X * CHECK FOR END OF LINE +3980 f486 27 f7 BEQ L85C2 * AND BRANCH IF SO +3981 f488 8d 04 BSR L85D1 REMOVE A CHARACTER +3982 f48a 5a DECB DECREMENT REPEAT PARAMETER +3983 f48b 26 f7 BNE L85C7 BRANCH IF NOT DONE +3984 f48d 39 RTS +3985 * REMOVE ONE CHARACTER FROM BUFFER +3986 f48e 0a 97 L85D1 DEC VD7 DECREMENT LENGTH OF BUFFER +3987 f490 31 1f LEAY $-01,X POINT Y TO ONE BEFORE CURRENT BUFFER POINTER +3988 f492 31 21 L85D5 LEAY $01,Y INCREMENT TEMPORARY BUFFER POINTER +3989 f494 a6 21 LDA $01,Y GET NEXT CHARACTER +3990 f496 a7 a4 STA ,Y PUT IT IN CURRENT POSITION +3991 f498 26 f8 BNE L85D5 BRANCH IF NOT END OF LINE +3992 f49a 39 RTS +3993 f49b 81 49 L85DE CMPA #'I' INSERT? +3994 f49d 27 13 BEQ L85F5 YES +3995 f49f 81 58 CMPA #'X' EXTEND? +3996 f4a1 27 0d BEQ L85F3 YES +3997 f4a3 81 48 CMPA #'H' HACK? +3998 f4a5 26 5c BNE L8646 NO +3999 f4a7 6f 84 CLR ,X TURN CURRENT BUFFER POINTER INTO END OF LINE FLAG +4000 f4a9 1f 10 TFR X,D PUT CURRENT BUFFER POINTER IN ACCD +4001 f4ab 83 00 f5 SUBD #LINBUF+2 SUBTRACT INITIAL POINTER POSITION +4002 f4ae d7 97 STB VD7 SAVE NEW BUFFER LENGTH +4003 f4b0 8d bf L85F3 BSR L85B4 DISPLAY THE LINE ON THE SCREEN +4004 f4b2 bd f5 44 L85F5 JSR L8687 GET A KEYSTROKE +4005 f4b5 81 0d CMPA #CR ENTER KEY? +4006 f4b7 27 8e BEQ L858A YES - INTERPRET ANOTHER COMMAND - PRINT LINE +4007 f4b9 81 1b CMPA #ESC ESCAPE? +4008 f4bb 27 25 BEQ L8625 YES - RETURN TO COMMAND LEVEL - DON’T PRINT LINE +4009 f4bd 81 08 CMPA #BS BACK SPACE? +4010 f4bf 26 22 BNE L8626 NO +4011 f4c1 8c 00 f4 CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER +4012 f4c4 27 ec BEQ L85F5 DO NOT ALLOW BS IF AT START +4013 f4c6 8d 45 BSR L8650 MOVE POINTER BACK ONE, BS TO SCREEN +4014 f4c8 8d c4 BSR L85D1 REMOVE ONE CHARACTER FROM BUFFER +4015 f4ca 20 e6 BRA L85F5 GET INSERT SUB COMMAND +4016 f4cc 81 43 L860F CMPA #'C' CHANGE? +4017 f4ce 26 cb BNE L85DE NO +4018 f4d0 6d 84 L8613 TST ,X CHECK CURRENT BUFFER CHARACTER +4019 f4d2 27 0e BEQ L8625 BRANCH IF END OF LINE +4020 f4d4 bd f5 44 JSR L8687 GET A KEYSTROKE +4021 f4d7 25 02 BLO L861E BRANCH IF LEGITIMATE KEY +4022 f4d9 20 f5 BRA L8613 TRY AGAIN IF ILLEGAL KEY +4023 f4db a7 80 L861E STA ,X+ INSERT NEW CHARACTER INTO BUFFER +4024 f4dd 8d 37 BSR L8659 SEND NEW CHARACTER TO SCREEN +4025 f4df 5a DECB DECREMENT REPEAT PARAMETER +4026 f4e0 26 ee BNE L8613 BRANCH IF NOT DONE +4027 f4e2 39 L8625 RTS +4028 f4e3 d6 97 L8626 LDB VD7 GET LENGTH OF LINE +4029 f4e5 c1 f9 CMPB #LBUFMX-1 COMPARE TO MAXIMUM LENGTH +4030 f4e7 26 02 BNE L862E BRANCH IF NOT AT MAXIMUM +4031 f4e9 20 c7 BRA L85F5 IGNORE INPUT IF LINE AT MAXIMUM LENGTH +4032 f4eb 34 10 L862E PSHS X SAVE CURRENT BUFFER POINTER +4033 f4ed 6d 80 L8630 TST ,X+ * SCAN THE LINE UNTIL END OF +4034 f4ef 26 fc BNE L8630 * LINE (0) IS FOUND +4035 f4f1 e6 82 L8634 LDB ,-X DECR TEMP LINE POINTER AND GET A CHARACTER +4036 f4f3 e7 01 STB $01,X PUT CHARACTER BACK DOWN ONE SPOT +4037 f4f5 ac e4 CMPX ,S HAVE WE REACHED STARTING POINT? +4038 f4f7 26 f8 BNE L8634 NO - KEEP GOING +4039 f4f9 32 62 LEAS $02,S PURGE BUFFER POINTER FROM STACK +4040 f4fb a7 80 STA ,X+ INSERT NEW CHARACTER INTO THE LINE +4041 f4fd 8d 17 BSR L8659 SEND A CHARACTER TO CONSOLE OUT +4042 f4ff 0c 97 INC VD7 ADD ONE TO BUFFER LENGTH +4043 f501 20 af BRA L85F5 GET INSERT SUB COMMAND +4044 f503 81 08 L8646 CMPA #BS BACKSPACE? +4045 f505 26 12 BNE L865C NO +4046 f507 8d 04 L864A BSR L8650 MOVE POINTER BACK 1, SEND BS TO SCREEN +4047 f509 5a DECB DECREMENT REPEAT PARAMETER +4048 f50a 26 fb BNE L864A LOOP UNTIL DONE +4049 f50c 39 RTS +4050 f50d 8c 00 f4 L8650 CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER +4051 f510 27 d0 BEQ L8625 DO NOT ALLOW BS IF AT START +4052 f512 30 1f LEAX $-01,X MOVE POINTER BACK ONE +4053 f514 86 08 LDA #BS BACK SPACE +4054 f516 7e db 14 L8659 JMP PUTCHR SEND TO CONSOLE OUT +4055 f519 81 4b L865C CMPA #'K' KILL? +4056 f51b 27 05 BEQ L8665 YES +4057 f51d 80 53 SUBA #'S' SEARCH? +4058 f51f 27 01 BEQ L8665 YES +4059 f521 39 RTS +4060 f522 34 02 L8665 PSHS A SAVE KILL/SEARCH FLAG ON STACK +4061 f524 8d 1e BSR L8687 * GET A KEYSTROKE (TARGET CHARACTER) +4062 f526 34 02 PSHS A * AND SAVE IT ON STACK +4063 f528 a6 84 L866B LDA ,X GET CURRENT BUFFER CHARACTER +4064 f52a 27 16 BEQ L8685 AND RETURN IF END OF LINE +4065 f52c 6d 61 TST $01,S CHECK KILL/SEARCH FLAG +4066 f52e 26 06 BNE L8679 BRANCH IF KILL +4067 f530 8d e4 BSR L8659 SEND A CHARACTER TO CONSOLE OUT +4068 f532 30 01 LEAX $01,X INCREMENT BUFFER POINTER +4069 f534 20 03 BRA L867C CHECK NEXT INPUT CHARACTER +4070 f536 bd f4 8e L8679 JSR L85D1 REMOVE ONE CHARACTER FROM BUFFER +4071 f539 a6 84 L867C LDA ,X GET CURRENT INPUT CHARACTER +4072 f53b a1 e4 CMPA ,S COMPARE TO TARGET CHARACTER +4073 f53d 26 e9 BNE L866B BRANCH IF NO MATCH +4074 f53f 5a DECB DECREMENT REPEAT PARAMETER +4075 f540 26 e6 BNE L866B BRANCH IF NOT DONE +4076 f542 35 a0 L8685 PULS Y,PC THE Y PULL WILL CLEAN UP THE STACK FOR THE 2 PSHS A +4077 * +4078 * GET A KEYSTRKE +4079 f544 bd db 00 L8687 JSR LA171 CALL CONSOLE IN : DEV NBR=SCREEN +4080 f547 81 7f CMPA #$7F GRAPHIC CHARACTER? +4081 f549 24 f9 BCC L8687 YES - GET ANOTHER CHAR +4082 f54b 81 5f CMPA #$5F SHIFT UP ARROW (QUIT INSERT) +4083 f54d 26 02 BNE L8694 NO +4084 f54f 86 1b LDA #ESC REPLACE W/ESCAPE CODE +4085 f551 81 0d L8694 CMPA #CR ENTER KEY +4086 f553 27 0e BEQ L86A6 YES +4087 f555 81 1b CMPA #ESC ESCAPE? +4088 f557 27 0a BEQ L86A6 YES +4089 f559 81 08 CMPA #BS BACKSPACE? +4090 f55b 27 06 BEQ L86A6 YES +4091 f55d 81 20 CMPA #SPACE SPACE +4092 f55f 25 e3 BLO L8687 GET ANOTHER CHAR IF CONTROL CHAR +4093 f561 1a 01 ORCC #$01 SET CARRY +4094 f563 39 L86A6 RTS +4095 +4096 * TRON +4097 f564 86 TRON FCB SKP1LD SKIP ONE BYTE AND LDA #$4F +4098 +4099 * TROFF +4100 f565 4f TROFF CLRA TROFF FLAG +4101 f566 97 8c STA TRCFLG TRON/TROFF FLAG:0=TROFF, <> 0=TRON +4102 f568 39 RTS +4103 +4104 * POS +4105 +4106 f569 86 00 POS LDA #0 GET DEVICE NUMBER +4107 f56b d6 79 LDB LPTPOS GET PRINT POSITION +4108 f56d 1d LA5E8 SEX CONVERT ACCB TO 2 DIGIT SIGNED INTEGER +4109 f56e 7e e7 78 JMP GIVABF CONVERT ACCD TO FLOATING POINT +4110 +4111 +4112 * VARPTR +4113 f571 bd e4 f3 VARPT JSR LB26A SYNTAX CHECK FOR ‘(‘ +4114 f574 dc 1f LDD ARYEND GET ADDR OF END OF ARRAYS +4115 f576 34 06 PSHS B,A SAVE IT ON STACK +4116 f578 bd e5 db JSR LB357 GET VARIABLE DESCRIPTOR +4117 f57b bd e4 f0 JSR LB267 SYNTAX CHECK FOR ‘)‘ +4118 f57e 35 06 PULS A,B GET END OF ARRAYS ADDR BACK +4119 f580 1e 10 EXG X,D SWAP END OF ARRAYS AND VARIABLE DESCRIPTOR +4120 f582 9c 1f CMPX ARYEND COMPARE TO NEW END OF ARRAYS +4121 f584 26 51 BNE L8724 ‘FC’ ERROR IF VARIABLE WAS NOT DEFINED PRIOR TO CALLING VARPTR +4122 f586 7e e7 78 JMP GIVABF CONVERT VARIABLE DESCRIPTOR INTO A FP NUMBER +4123 +4124 * MID$(OLDSTRING,POSITION,LENGTH)=REPLACEMENT +4125 f589 9d 7c L86D6 JSR GETNCH GET INPUT CHAR FROM BASIC +4126 f58b bd e4 f3 JSR LB26A SYNTAX CHECK FOR ‘(‘ +4127 f58e bd e5 db JSR LB357 * GET VARIABLE DESCRIPTOR ADDRESS AND +4128 f591 34 10 PSHS X * SAVE IT ON THE STACK +4129 f593 ec 02 LDD $02,X POINT ACCD TO START OF OLDSTRING +4130 f595 10 93 21 CMPD FRETOP COMPARE TO START OF CLEARED SPACE +4131 f598 23 04 BLS L86EB BRANCH IF <= +4132 f59a 93 27 SUBD MEMSIZ SUBTRACT OUT TOP OF CLEARED SPACE +4133 f59c 23 12 BLS L86FD BRANCH IF STRING IN STRING SPACE +4134 f59e e6 84 L86EB LDB ,X GET LENGTH OF OLDSTRING +4135 f5a0 bd e7 f1 JSR LB56D RESERVE ACCB BYTES IN STRING SPACE +4136 f5a3 34 10 PSHS X SAVE RESERVED SPACE STRING ADDRESS ON STACK +4137 f5a5 ae 62 LDX $02,S POINT X TO OLDSTRING DESCRIPTOR +4138 f5a7 bd e8 c7 JSR LB643 MOVE OLDSTRING INTO STRING SPACE +4139 f5aa 35 50 PULS X,U * GET OLDSTRING DESCRIPTOR ADDRESS AND RESERVED STRING +4140 f5ac af 42 STX $02,U * ADDRESS AND SAVE RESERVED ADDRESS AS OLDSTRING ADDRESS +4141 f5ae 34 40 PSHS U SAVE OLDSTRING DESCRIPTOR ADDRESS +4142 f5b0 bd e9 bc L86FD JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION +4143 f5b3 34 04 PSHS B SAVE POSITION PARAMETER ON STACK +4144 f5b5 5d TSTB * CHECK POSITION PARAMETER AND BRANCH +4145 f5b6 27 1f BEQ L8724 * IF START OF STRING +4146 f5b8 c6 ff LDB #$FF DEFAULT REPLACEMENT LENGTH = $FF +4147 f5ba 81 29 CMPA #')' * CHECK FOR END OF MID$ STATEMENT AND +4148 f5bc 27 03 BEQ L870E * BRANCH IF AT END OF STATEMENT +4149 f5be bd e9 bc JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION +4150 f5c1 34 04 L870E PSHS B SAVE LENGTH PARAMETER ON STACK +4151 f5c3 bd e4 f0 JSR LB267 SYNTAX CHECK FOR ‘)‘ +4152 f5c6 c6 ae LDB #TOK_EQUALS TOKEN FOR = +4153 f5c8 bd e4 f8 JSR LB26F SYNTAX CHECK FOR “=‘ +4154 f5cb 8d 2e BSR L8748 EVALUATE REPLACEMENT STRING +4155 f5cd 1f 13 TFR X,U SAVE REPLACEMENT STRING ADDRESS IN U +4156 f5cf ae 62 LDX $02,S POINT X TO OLOSTRING DESCRIPTOR ADDRESS +4157 f5d1 a6 84 LDA ,X GET LENGTH OF OLDSTRING +4158 f5d3 a0 61 SUBA $01,S SUBTRACT POSITION PARAMETER +4159 f5d5 24 03 BCC L8727 INSERT REPLACEMENT STRING INTO OLDSTRING +4160 f5d7 7e e6 ce L8724 JMP LB44A ‘FC’ ERROR IF POSITION > LENGTH OF OLDSTRING +4161 f5da 4c L8727 INCA * NOW ACCA = NUMBER OF CHARACTERS TO THE RIGHT +4162 * * (INCLUSIVE) OF THE POSITION PARAMETER +4163 f5db a1 e4 CMPA ,S +4164 f5dd 24 02 BCC L872E BRANCH IF NEW STRING WILL FIT IN OLDSTRING +4165 f5df a7 e4 STA ,S IF NOT, USE AS MUCH OF LENGTH PARAMETER AS WILL FIT +4166 f5e1 a6 61 L872E LDA $01,S GET POSITION PARAMETER +4167 f5e3 1e 89 EXG A,B ACCA=LENGTH OF REPL STRING, ACCB=POSITION PARAMETER +4168 f5e5 ae 02 LDX $02,X POINT X TO OLDSTRING ADDRESS +4169 f5e7 5a DECB * BASIC’S POSITION PARAMETER STARTS AT 1; THIS ROUTINE +4170 * * WANTS IT TO START AT ZERO +4171 f5e8 3a ABX POINT X TO POSITION IN OLDSTRING WHERE THE REPLACEMENT WILL GO +4172 f5e9 4d TSTA * IF THE LENGTH OF THE REPLACEMENT STRING IS ZERO +4173 f5ea 27 0d BEQ L8746 * THEN RETURN +4174 f5ec a1 e4 CMPA ,S +4175 f5ee 23 02 BLS L873F ADJUSTED LENGTH PARAMETER, THEN BRANCH +4176 f5f0 a6 e4 LDA ,S OTHERWISE USE AS MUCH ROOM AS IS AVAILABLE +4177 f5f2 1f 89 L873F TFR A,B SAVE NUMBER OF BYTES TO MOVE IN ACCB +4178 f5f4 1e 31 EXG U,X SWAP SOURCE AND DESTINATION POINTERS +4179 f5f6 bd dc ae JSR LA59A MOVE (B) BYTES FROM (X) TO (U) +4180 f5f9 35 96 L8746 PULS A,B,X,PC +4181 f5fb bd e3 df L8748 JSR LB156 EVALUATE EXPRESSION +4182 f5fe 7e e8 d8 JMP LB654 *‘TM’ ERROR IF NUMERIC; RETURN WITH X POINTING +4183 * *TO STRING, ACCB = LENGTH +4184 +4185 * STRING +4186 f601 bd e4 f3 STRING JSR LB26A SYNTAX CHECK FOR ‘(’ +4187 f604 bd e9 8f JSR LB70B EVALUATE EXPRESSION; ERROR IF > 255 +4188 f607 34 04 PSHS B SAVE LENGTH OF STRING +4189 f609 bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +4190 f60c bd e3 df JSR LB156 EVALUATE EXPRESSION +4191 f60f bd e4 f0 JSR LB267 SYNTAX CHECK FOR ‘)‘ +4192 f612 96 06 LDA VALTYP GET VARIABLE TYPE +4193 f614 26 05 BNE L8768 BRANCH IF STRING +4194 f616 bd e9 92 JSR LB70E CONVERT FPA0 INTO AN INTEGER IN ACCB +4195 f619 20 03 BRA L876B SAVE THE STRING IN STRING SPACE +4196 f61b bd e9 28 L8768 JSR LB6A4 GET FIRST BYTE OF STRING +4197 f61e 34 04 L876B PSHS B SAVE FIRST BYTE OF EXPRESSION +4198 f620 e6 61 LDB $01,S GET LENGTH OF STRING +4199 f622 bd e7 93 JSR LB50F RESERVE ACCB BYTES IN STRING SPACE +4200 f625 35 06 PULS A,B GET LENGTH OF STRING AND CHARACTER +4201 f627 27 05 BEQ L877B BRANCH IF NULL STRING +4202 f629 a7 80 L8776 STA ,X+ SAVE A CHARACTER IN STRING SPACE +4203 f62b 5a DECB DECREMENT LENGTH +4204 f62c 26 fb BNE L8776 BRANCH IF NOT DONE +4205 f62e 7e e9 1f L877B JMP LB69B PUT STRING DESCRIPTOR ONTO STRING STACK +4206 +4207 * INSTR +4208 f631 bd e4 f3 INSTR JSR LB26A SYNTAX CHECK FOR ‘(‘ +4209 f634 bd e3 df JSR LB156 EVALUATE EXPRESSION +4210 f637 c6 01 LDB #$01 DEFAULT POSITION = 1 (SEARCH START) +4211 f639 34 04 PSHS B SAVE START +4212 f63b 96 06 LDA VALTYP GET VARIABLE TYPE +4213 f63d 26 10 BNE L879C BRANCH IF STRING +4214 f63f bd e9 92 JSR LB70E CONVERT FPA0 TO INTEGER IN ACCB +4215 f642 e7 e4 STB ,S SAVE START SEARCH VALUE +4216 f644 27 91 BEQ L8724 BRANCH IF START SEARCH AT ZERO +4217 f646 bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +4218 f649 bd e3 df JSR LB156 EVALUATE EXPRESSION - SEARCH STRING +4219 f64c bd e3 cf JSR LB146 ‘TM’ ERROR IF NUMERIC +4220 f64f 9e 52 L879C LDX FPA0+2 SEARCH STRING DESCRIPTOR ADDRESS +4221 f651 34 10 PSHS X SAVE ON THE STACK +4222 f653 bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +4223 f656 bd f5 fb JSR L8748 EVALUATE TARGET STRING EXPRESSION +4224 f659 34 14 PSHS X,B SAVE ADDRESS AND LENGTH ON STACK +4225 f65b bd e4 f0 JSR LB267 SYNTAX CHECK FOR ')' +4226 f65e ae 63 LDX $03,S * LOAD X WITH SEARCH STRING DESCRIPTOR ADDRESS +4227 f660 bd e8 dd JSR LB659 * AND GET THE LENGTH ANDADDRESS OF SEARCH STRING +4228 f663 34 04 PSHS B SAVE LENGTH ON STACK +4229 * +4230 * AT THIS POINT THE STACK HAS THE FOLLOWING INFORMATION +4231 * ON IT: 0,S-SEARCH LENGTH; 1,S-TARGET LENGTH; 2 3,S-TARGET +4232 * ADDRESS; 4 5,S-SEARCH DESCRIPTOR ADDRESS; 6,S-SEARCH POSITION +4233 f665 e1 66 CMPB $06,S COMPARE LENGTH OF SEARCH STRING TO START +4234 f667 25 23 BLO L87D9 POSITION; RETURN 0 IF LENGTH < START +4235 f669 a6 61 LDA $01,S GET LENGTH OF TARGET STRING +4236 f66b 27 1c BEQ L87D6 BRANCH IF TARGET STRING = NULL +4237 f66d e6 66 LDB $06,S GET START POSITION +4238 f66f 5a DECB MOVE BACK ONE +4239 f670 3a ABX POINT X TO POSITION IN SEARCH STRING WHERE SEARCHING WILL START +4240 f671 31 84 L87BE LEAY ,X POINT Y TO SEARCH POSITION +4241 f673 ee 62 LDU $02,S POINT U TO START OF TARGET +4242 f675 e6 61 LDB $01,S LOAD ACCB WITH LENGTH OF TARGET +4243 f677 a6 e4 LDA ,S LOAD ACCA WITH LENGTH OF SEARCH +4244 f679 a0 66 SUBA $06,S SUBTRACT SEARCH POSITION FROM SEARCH LENGTH +4245 f67b 4c INCA ADD ONE +4246 f67c a1 61 CMPA $01,S COMPARE TO TARGET LENGTH +4247 f67e 25 0c BLO L87D9 RETURN 0 IF TARGET LENGTH > WHAT’S LEFT OF SEARCH STRING +4248 f680 a6 80 L87CD LDA ,X+ GET A CHARACTER FROM SEARCH STRING +4249 f682 a1 c0 CMPA ,U+ COMPARE IT TO TARGET STRING +4250 f684 26 0c BNE L87DF BRANCH IF NO MATCH +4251 f686 5a DECB DECREMENT TARGET LENGTH +4252 f687 26 f7 BNE L87CD CHECK ANOTHER CHARACTER +4253 f689 e6 66 L87D6 LDB $06,S GET MATCH POSITION +4254 f68b 21 L87D8 FCB SKP1 SKIP NEXT BYTE +4255 f68c 5f L87D9 CLRB MATCH ADDRESS = 0 +4256 f68d 32 67 LEAS $07,S CLEAN UP THE STACK +4257 f68f 7e e7 77 JMP LB4F3 CONVERT ACCB TO FP NUMBER +4258 f692 6c 66 L87DF INC $06,S INCREMENT SEARCH POSITION +4259 f694 30 21 LEAX $01,Y MOVE X TO NEXT SEARCH POSITION +4260 f696 20 d9 BRA L87BE KEEP LOOKING FOR A MATCH +4261 +4262 * EXTENDED BASIC RVEC19 HOOK CODE +4263 f698 81 26 XVEC19 CMPA #'&' * +4264 f69a 26 5c BNE L8845 * RETURN IF NOT HEX OR OCTAL VARIABLE +4265 f69c 32 62 LEAS $02,S PURGE RETURN ADDRESS FROM STACK +4266 * PROCESS A VARIABLE PRECEEDED BY A ‘&‘ (&H,&O) +4267 f69e 0f 52 L87EB CLR FPA0+2 * CLEAR BOTTOM TWO +4268 f6a0 0f 53 CLR FPA0+3 * BYTES OF FPA0 +4269 f6a2 8e 00 52 LDX #FPA0+2 BYTES 2,3 OF FPA0 = (TEMPORARY ACCUMULATOR) +4270 f6a5 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4271 f6a7 81 4f CMPA #'O' +4272 f6a9 27 12 BEQ L880A YES +4273 f6ab 81 48 CMPA #'H' +4274 f6ad 27 23 BEQ L881F YES +4275 f6af 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4276 f6b1 20 0c BRA L880C DEFAULT TO OCTAL (&O) +4277 f6b3 81 38 L8800 CMPA #'8' +4278 f6b5 10 22 ee 47 LBHI LB277 +4279 f6b9 c6 03 LDB #$03 BASE 8 MULTIPLIER +4280 f6bb 8d 2a BSR L8834 ADD DIGIT TO TEMPORARY ACCUMULATOR +4281 * EVALUATE AN &O VARIABLE +4282 f6bd 9d 7c L880A JSR GETNCH GET A CHARACTER FROM BASIC +4283 f6bf 25 f2 L880C BLO L8800 BRANCH IF NUMERIC +4284 f6c1 0f 50 L880E CLR FPA0 * CLEAR 2 HIGH ORDER +4285 f6c3 0f 51 CLR FPA0+1 * BYTES OF FPA0 +4286 f6c5 0f 06 CLR VALTYP SET VARXABLE TYPE TO NUMERIC +4287 f6c7 0f 63 CLR FPSBYT ZERO OUT SUB BYTE OF FPA0 +4288 f6c9 0f 54 CLR FP0SGN ZERO OUT MANTISSA SIGN OF FPA0 +4289 f6cb c6 a0 LDB #$A0 * SET EXPONENT OF FPA0 +4290 f6cd d7 4f STB FP0EXP * +4291 f6cf 7e ec 65 JMP LBA1C GO NORMALIZE FPA0 +4292 * EVALUATE AN &H VARIABLE +4293 f6d2 9d 7c L881F JSR GETNCH GET A CHARACTER FROM BASIC +4294 f6d4 25 0b BLO L882E BRANCH IF NUMERIC +4295 f6d6 bd e6 26 JSR LB3A2 SET CARRY IF NOT ALPHA +4296 f6d9 25 e6 BLO L880E BRANCH IF NOT ALPHA OR NUMERIC +4297 f6db 81 47 CMPA #'G' CHECK FOR LETTERS A-F +4298 f6dd 24 e2 BCC L880E BRANCH IF >= G (ILLEGAL HEX LETTER) +4299 f6df 80 07 SUBA #7 SUBTRACT ASCII DIFFERENCE BETWEEN A AND 9 +4300 f6e1 c6 04 L882E LDB #$04 BASE 16 DIGIT MULTIPLIER = 2**4 +4301 f6e3 8d 02 BSR L8834 ADD DIGIT TO TEMPORARY ACCUMULATOR +4302 f6e5 20 eb BRA L881F KEEP EVALUATING VARIABLE +4303 f6e7 68 01 L8834 ASL $01,X * MULTIPLY TEMPORARY +4304 f6e9 69 84 ROL ,X * ACCUMULATOR BY TWO +4305 f6eb 10 25 f5 ec LBCS LBA92 ‘OV' OVERFLOW ERROR +4306 f6ef 5a DECB DECREMENT SHIFT COUNTER +4307 f6f0 26 f5 BNE L8834 MULTIPLY TEMPORARY ACCUMULATOR AGAIN +4308 f6f2 80 30 SUBA #'0' MASK OFF ASCII +4309 f6f4 ab 01 ADDA $01,X * ADD DIGIT TO TEMPORARY +4310 f6f6 a7 01 STA $01,X * ACCUMULATOR AND SAVE IT +4311 f6f8 39 L8845 RTS +4312 +4313 f6f9 35 40 XVEC15 PULS U PULL RETURN ADDRESS AND SAVE IN U REGISTER +4314 f6fb 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC +4315 f6fd 9e 83 LDX CHARAD CURRENT INPUT POINTER TO X +4316 f6ff 9d 7c JSR GETNCH GET CHARACTER FROM BASIC +4317 f701 81 26 CMPA #'&' HEX AND OCTAL VARIABLES ARE PRECEEDED BY & +4318 f703 27 99 BEQ L87EB PROCESS A ‘&‘ VARIABLE +4319 f705 81 b0 CMPA #TOK_FN TOKEN FOR FN +4320 f707 27 5e BEQ L88B4 PROCESS FN CALL +4321 f709 81 ff CMPA #$FF CHECK FOR SECONDARY TOKEN +4322 f70b 26 08 BNE L8862 NOT SECONDARY +4323 f70d 9d 7c JSR GETNCH GET CHARACTER FROM BASIC +4324 f70f 81 83 CMPA #TOK_USR TOKEN FOR USR +4325 f711 10 27 00 ab LBEQ L892C PROCESS USR CALL +4326 f715 9f 83 L8862 STX CHARAD RESTORE BASIC’S INPUT POINTER +4327 f717 6e c4 JMP ,U RETURN TO CALLING ROUTINE +4328 f719 9e 68 L8866 LDX CURLIN GET CURRENT LINE NUMBER +4329 f71b 30 01 LEAX $01,X IN DIRECT MODE? +4330 f71d 26 d9 BNE L8845 RETURN IF NOT IN DIRECT MODE +4331 f71f c6 16 LDB #2*11 ‘ILLEGAL DIRECT STATEMENT’ ERROR +4332 f721 7e df 03 L886E JMP LAC46 PROCESS ERROR +4333 +4334 f724 ae 9f 00 83 DEF LDX [CHARAD] GET TWO INPUT CHARS +4335 f728 8c ff 83 CMPX #TOK_FF_USR TOKEN FOR USR +4336 f72b 10 27 00 74 LBEQ L890F BRANCH IF DEF USR +4337 f72f 8d 23 BSR L88A1 GET DESCRIPTOR ADDRESS FOR FN VARIABLE NAME +4338 f731 8d e6 BSR L8866 DON’T ALLOW DEF FN IF IN DIRECT MODE +4339 f733 bd e4 f3 JSR LB26A SYNTAX CHECK FOR ‘(‘ +4340 f736 c6 80 LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE +4341 f738 d7 08 STB ARYDIS * AND SAVE IT IN THE ARRAY DISABLE FLAG +4342 f73a bd e5 db JSR LB357 GET VARIABLE DESCRIPTOR +4343 f73d 8d 25 BSR L88B1 ‘TM’ ERROR IF STRING +4344 f73f bd e4 f0 JSR LB267 SYNTAX CHECK FOR ‘)‘ +4345 f742 c6 ae LDB #TOK_EQUALS TOKEN FOR ‘=‘ +4346 f744 bd e4 f8 JSR LB26F DO A SYNTAX CHECK FOR = +4347 f747 9e 4b LDX V4B GET THE ADDRESS OF THE FN NAME DESCRIPTOR +4348 f749 dc 83 LDD CHARAD * GET THE CURRENT INPUT POINTER ADDRESS AND +4349 f74b ed 84 STD ,X * SAVE IT IN FIRST 2 BYTES OF THE DESCRIPTOR +4350 f74d dc 39 LDD VARPTR = GET THE DESCRIPTOR ADDRESS OF THE ARGUMENT +4351 f74f ed 02 STD $02,X = VARIABLE AND SAVE IT IN THE DESCRIPTOR OF THE FN NAME +4352 f751 7e e1 8d JMP DATA MOVE INPUT POINTER TO END OF LINE OR SUBLINE +4353 f754 c6 b0 L88A1 LDB #TOK_FN TOKEN FOR FN +4354 f756 bd e4 f8 JSR LB26F DO A SYNTAX CHECK FOR FN +4355 f759 c6 80 LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE FLAG +4356 f75b d7 08 STB ARYDIS * AND SAVE IT IN ARRAY VARIABLE FLAG +4357 f75d 8a 80 ORA #$80 SET BIT 7 OF CURRENT INPUT CHARACTER TO INDICATE AN FN VARIABLE +4358 f75f bd e5 e0 JSR LB35C * GET THE DESCRIPTOR ADDRESS OF THIS +4359 f762 9f 4b STX V4B * VARIABLE AND SAVE IT IN V4B +4360 f764 7e e3 cc L88B1 JMP LB143 ‘TM’ ERROR IF STRING VARIABLE +4361 * EVALUATE AN FN CALL +4362 f767 8d eb L88B4 BSR L88A1 * GET THE DESCRIPTOR OF THE FN NAME +4363 f769 34 10 PSHS X * VARIABLE AND SAVE IT ON THE STACK +4364 f76b bd e4 eb JSR LB262 SYNTAX CHECK FOR ‘(‘ & EVALUATE EXPR +4365 f76e 8d f4 BSR L88B1 ‘TM’ ERROR IF STRING VARIABLE +4366 f770 35 40 PULS U POINT U TO FN NAME DESCRIPTOR +4367 f772 c6 32 LDB #2*25 ‘UNDEFINED FUNCTION CALL’ ERROR +4368 f774 ae 42 LDX $02,U POINT X TO ARGUMENT VARIABLE DESCRIPTOR +4369 f776 27 a9 BEQ L886E BRANCH TO ERROR HANDLER +4370 f778 10 9e 83 LDY CHARAD SAVE CURRENT INPUT POINTER IN Y +4371 f77b ee c4 LDU ,U * POINT U TO START OF FN FORMULA AND +4372 f77d df 83 STU CHARAD * SAVE IT IN INPUT POINTER +4373 f77f a6 04 LDA $04,X = GET FP VALUE OF +4374 f781 34 02 PSHS A = ARGUMENT VARIABLE, CURRENT INPUT +4375 f783 ec 84 LDD ,X = POINTER, AND ADDRESS OF START +4376 f785 ee 02 LDU $02,X = OF FN FORMULA AND SAVE +4377 f787 34 76 PSHS U,Y,X,B,A = THEM ON THE STACK +4378 f789 bd ee 7e JSR LBC35 PACK FPA0 AND SAVE IT IN (X) +4379 f78c bd e3 ca L88D9 JSR LB141 EVALUATE FN EXPRESSION +4380 f78f 35 76 PULS A,B,X,Y,U RESTORE REGISTERS +4381 f791 ed 84 STD ,X * GET THE FP +4382 f793 ef 02 STU $02,X * VALUE OF THE ARGUMENT +4383 f795 35 02 PULS A * VARIABLE OFF OF THE +4384 f797 a7 04 STA $04,X * STACK AND RE-SAVE IT +4385 f799 9d 82 JSR GETCCH GET FINAL CHARACTER OF THE FN FORMULA +4386 f79b 10 26 ed 61 LBNE LB277 ‘SYNTAX’ ERROR IF NOT END OF LINE +4387 f79f 10 9f 83 STY CHARAD RESTORE INPUT POINTER +4388 f7a2 39 L88EF RTS +4389 +4390 +4391 +4392 * DEF USR +4393 f7a3 9d 7c L890F JSR GETNCH SKIP PAST SECOND BYTE OF DEF USR TOKEN +4394 f7a5 8d 09 BSR L891C GET FN NUMBER +4395 f7a7 34 10 PSHS X SAVE FN EXEC ADDRESS STORAGE LOC +4396 f7a9 8d 2d BSR L8944 CALCULATE EXEC ADDRESS +4397 f7ab 35 40 PULS U GET FN EXEC ADDRESS STORAGE LOC +4398 f7ad af c4 STX ,U SAVE EXEC ADDRESS +4399 f7af 39 RTS +4400 f7b0 5f L891C CLRB DEFAULT TO USR0 IF NO ARGUMENT +4401 f7b1 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4402 f7b3 24 06 BCC L8927 BRANCH IF NOT NUMERIC +4403 f7b5 80 30 SUBA #'0' MASK OFF ASCII +4404 f7b7 1f 89 TFR A,B SAVE USR NUMBER IN ACCB +4405 f7b9 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4406 f7bb 9e 8d L8927 LDX USRADR GET ADDRESS OF STORAGE LOCs FOR USR ADDRESS +4407 f7bd 58 ASLB X2 - 2 BYTES/USR ADDRESS +4408 f7be 3a ABX ADD OFFSET TO START ADDRESS OF STORAGE LOCs +4409 f7bf 39 RTS +4410 * PROCESS A USR CALL +4411 f7c0 8d ee L892C BSR L891C GET STORAGE LOC OF EXEC ADDRESS FOR USR N +4412 f7c2 ae 84 LDX ,X * GET EXEC ADDRESS AND +4413 f7c4 34 10 PSHS X * PUSH IT ONTO STACK +4414 f7c6 bd e4 eb JSR LB262 SYNTAX CHECK FOR ‘(‘ & EVALUATE EXPR +4415 f7c9 8e 00 4f LDX #FP0EXP POINT X TO FPA0 +4416 f7cc 96 06 LDA VALTYP GET VARIABLE TYPE +4417 f7ce 27 07 BEQ L8943 BRANCH IF NUMERIC, STRING IF <> 0 +4418 f7d0 bd e8 db JSR LB657 GET LENGTH & ADDRESS OF STRING VARIABLE +4419 f7d3 9e 52 LDX FPA0+2 GET POINTER TO STRING DESCRIPTOR +4420 f7d5 96 06 LDA VALTYP GET VARIABLE TYPE +4421 f7d7 39 L8943 RTS JUMP TO USR ROUTINE (PSHS X ABOVE) +4422 f7d8 c6 ae L8944 LDB #TOK_EQUALS TOKEN FOR ‘=‘ +4423 f7da bd e4 f8 JSR LB26F DO A SYNTAX CHECK FOR = +4424 f7dd 7e e9 c1 JMP LB73D EVALUATE EXPRESSION, RETURN VALUE IN X +4425 +4426 +4427 +4428 * DEL +4429 f7e0 10 27 ee ea DEL LBEQ LB44A FC’ ERROR IF NO ARGUMENT +4430 f7e4 bd e2 14 JSR LAF67 CONVERT A DECIMAL BASiC NUMBER TO BINARY +4431 f7e7 bd df a2 JSR LAD01 FIND RAM ADDRESS OF START OF A BASIC LINE +4432 f7ea 9f 93 STX VD3 SAVE RAM ADDRESS OF STARTING LINE NUMBER +4433 f7ec 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4434 f7ee 27 10 BEQ L8990 BRANCH IF END OF LINE +4435 f7f0 81 a7 CMPA #TOK_MINUS TOKEN FOR ‘-' +4436 f7f2 26 3b BNE L89BF TERMINATE COMMAND IF LINE NUMBER NOT FOLLOWED BY ‘-‘ +4437 f7f4 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4438 f7f6 27 04 BEQ L898C IF END OF LINE, USE DEFAULT ENDING LINE NUMBER +4439 f7f8 8d 24 BSR L89AE * CONVERT ENDING LINE NUMBER TO BINARY +4440 f7fa 20 04 BRA L8990 * AND SAVE IT IN BINVAL +4441 f7fc 86 ff L898C LDA #$FF = USE $FFXX AS DEFAULT ENDING +4442 f7fe 97 2b STA BINVAL = LINE NUMBER - SAVE IT IN BINVAL +4443 f800 de 93 L8990 LDU VD3 POINT U TO STARTING LINE NUMBER ADDRESS +4444 f802 8c L8992 FCB SKP2 SKIP TWO BYTES +4445 f803 ee c4 L8993 LDU ,U POINT U TO START OF NEXT LINE +4446 f805 ec c4 LDD ,U CHECK FOR END OF PROGRAM +4447 f807 27 06 BEQ L899F BRANCH IF END OF PROGRAM +4448 f809 ec 42 LDD $02,U LOAD ACCD WITH THIS LINE’S NUMBER +4449 f80b 93 2b SUBD BINVAL SUBTRACT ENDING LINE NUMBER ADDRESS +4450 f80d 23 f4 BLS L8993 BRANCH IF = < ENDING LINE NUMBER +4451 f80f 9e 93 L899F LDX VD3 GET STARTING LINE NUMBER +4452 f811 8d 15 BSR L89B8 MOVE (U) TO (X) UNTIL END OF PROGRAM +4453 f813 bd df c2 JSR LAD21 RESET BASIC’S INPUT POINTER AND ERASE VARIABLES +4454 f816 9e 93 LDX VD3 GET STARTING LINE NUMBER ADDRESS +4455 f818 bd df 92 JSR LACF1 RECOMPUTE START OF NEXT LINE ADDRESSES +4456 f81b 7e df 22 JMP LAC73 JUMP TO BASIC’S MAIN COMMAND LOOP +4457 f81e bd e2 14 L89AE JSR LAF67 GO GET LINE NUMBER CONVERTED TO BINARY +4458 f821 7e dc b7 JMP LA5C7 MAKE SURE THERE’S NO MORE ON THIS LINE +4459 f824 a6 c0 L89B4 LDA ,U+ GET A BYTE FROM (U) +4460 f826 a7 80 STA ,X+ MOVE THE BYTE TO (X) +4461 f828 11 93 1b L89B8 CMPU VARTAB COMPARE TO END OF BASIC +4462 f82b 26 f7 BNE L89B4 BRANCH IF NOT AT END +4463 f82d 9f 1b STX VARTAB SAVE (X) AS NEW END OF BASIC +4464 f82f 39 L89BF RTS +4465 +4466 +4467 f830 bd f7 19 L89C0 JSR L8866 ‘BS’ ERROR IF IN DIRECT MODE +4468 f833 9d 7c JSR GETNCH GET A CHAR FROM BASIC +4469 f835 81 22 L89D2 CMPA #'"' CHECK FOR PROMPT STRING +4470 f837 26 0b BNE L89E1 BRANCH IF NO PROMPT STRING +4471 f839 bd e4 cd JSR LB244 STRIP OFF PROMPT STRING & PUT IT ON STRING STACK +4472 f83c c6 3b LDB #';' * +4473 f83e bd e4 f8 JSR LB26F * DO A SYNTAX CHECK FOR; +4474 f841 bd eb e8 JSR LB99F REMOVE PROMPT STRING FROM STRING STACK & SEND TO CONSOLE OUT +4475 f844 32 7e L89E1 LEAS $-02,S RESERVE TWO STORAGE SLOTS ON STACK +4476 f846 bd e2 c9 JSR LB035 INPUT A LINE FROM CURRENT INPUT DEVICE +4477 f849 32 62 LEAS $02,S CLEAN UP THE STACK +4478 f84b bd e5 db JSR LB357 SEARCH FOR A VARIABLE +4479 f84e 9f 3b STX VARDES SAVE POINTER TO VARIABLE DESCRIPTOR +4480 f850 bd e3 cf JSR LB146 ‘TM’ ERROR IF VARIABLE TYPE = NUMERIC +4481 f853 8e 00 f3 LDX #LINBUF POINT X TO THE STRING BUFFER WHERE THE INPUT STRING WAS STORED +4482 f856 4f CLRA TERMINATOR CHARACTER 0 (END OF LINE) +4483 f857 bd e7 a0 JSR LB51A PARSE THE INPUT STRING AND STORE IT IN THE STRING SPACE +4484 f85a 7e e2 51 JMP LAFA4 REMOVE DESCRIPTOR FROM STRING STACK +4485 f85d bd e2 14 L89FC JSR LAF67 STRIP A DECIMAL NUMBER FROM BASIC INPUT LINE +4486 f860 9e 2b LDX BINVAL GET BINARY VALUE +4487 f862 39 RTS +4488 f863 9e 91 L8A02 LDX VD1 GET CURRENT OLD NUMBER BEING RENUMBERED +4489 f865 9f 2b L8A04 STX BINVAL SAVE THE LINE NUMBER BEING SEARCHED FOR +4490 f867 7e df a2 JMP LAD01 GO FIND THE LINE NUMBER IN BASIC PROGRAM +4491 +4492 * RENUM +4493 f86a bd df c7 RENUM JSR LAD26 ERASE VARIABLES +4494 f86d cc 00 0a LDD #10 DEFAULT LINE NUMBER INTERVAL +4495 f870 dd 95 STD VD5 SAVE DEFAULT RENUMBER START LINE NUMBER +4496 f872 dd 8f STD VCF SAVE DEFAULT INTERVAL +4497 f874 5f CLRB NOW ACCD = 0 +4498 f875 dd 91 STD VD1 DEFAULT LINE NUMBER OF WHERE TO START RENUMBERING +4499 f877 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4500 f879 24 06 BCC L8A20 BRANCH IF NOT NUMERIC +4501 f87b 8d e0 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY +4502 f87d 9f 95 STX VD5 SAVE LINE NUMBER WHERE RENUMBERING STARTS +4503 f87f 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4504 f881 27 1b L8A20 BEQ L8A3D BRANCH IF END OF LINE +4505 f883 bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +4506 f886 24 06 BCC L8A2D BRANCH IF NEXT CHARACTER NOT NUMERIC +4507 f888 8d d3 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY +4508 f88a 9f 91 STX VD1 SAVE NEW RENUMBER LINE +4509 f88c 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4510 f88e 27 0e L8A2D BEQ L8A3D BRANCH IF END OF LINE +4511 f890 bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +4512 f893 24 06 BCC L8A3A BRANCH IF NEXT CHARACTER NOT NUMERIC +4513 f895 8d c6 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY +4514 f897 9f 8f STX VCF SAVE NEW INTERVAL +4515 f899 27 49 BEQ L8A83 ‘FC' ERROR +4516 f89b bd dc b7 L8A3A JSR LA5C7 CHECK FOR MORE CHARACTERS ON LINE - ‘SYNTAX’ ERROR IF ANY +4517 f89e 8d c3 L8A3D BSR L8A02 GO GET ADDRESS OF OLD NUMBER BEING RENUMBERED +4518 f8a0 9f 93 STX VD3 SAVE ADDRESS +4519 f8a2 9e 95 LDX VD5 GET NEXT RENUMBERED LINE NUMBER TO USE +4520 f8a4 8d bf BSR L8A04 FIND THE LINE NUMBER IN THE BASIC PROGRAM +4521 f8a6 9c 93 CMPX VD3 COMPARE TO ADDRESS OF OLD LINE NUMBER +4522 f8a8 25 3a BLO L8A83 ‘FC’ ERROR IF NEW ADDRESS < OLD ADDRESS +4523 f8aa 8d 1c BSR L8A67 MAKE SURE RENUMBERED LINE NUMBERS WILL BE IN RANGE +4524 f8ac bd f9 3e JSR L8ADD CONVERT ASCII LINE NUMBERS TO ‘EXPANDED’ BINARY +4525 f8af bd df 90 JSR LACEF RECALCULATE NEXT LINE RAM ADDRESSES +4526 f8b2 8d af BSR L8A02 GET RAM ADDRESS OF FIRST LINE TO BE RENUMBERED +4527 f8b4 9f 93 STX VD3 SAVE IT +4528 f8b6 8d 3a BSR L8A91 MAKE SURE LINE NUMBERS EXIST +4529 f8b8 8d 0f BSR L8A68 INSERT NEW LINE NUMBERS IN LINE HEADERS +4530 f8ba 8d 36 BSR L8A91 INSERT NEW LINE NUMBERS IN PROGRAM STATEMENTS +4531 f8bc bd f9 d9 JSR L8B7B CONVERT PACKED BINARY LINE NUMBERS TO ASCII +4532 f8bf bd df c7 JSR LAD26 ERASE VARIABLES +4533 f8c2 bd df 90 JSR LACEF RECALCULATE NEXT LINE RAM ADDRESS +4534 f8c5 7e df 22 JMP LAC73 GO BACK TO BASIC’S MAIN LOOP +4535 f8c8 86 L8A67 FCB SKP1LD SKIP ONE BYTE - LDA #$4F +4536 f8c9 4f L8A68 CLRA NEW LINE NUMBER FLAG - 0; INSERT NEW LINE NUMBERS +4537 f8ca 97 98 STA VD8 SAVE NEW LINE NUMBER FLAG; 0 = INSERT NEW NUMBERS +4538 f8cc 9e 93 LDX VD3 GET ADDRESS OF OLD LINE NUMBER BEING RENUMBERED +4539 f8ce dc 95 LDD VD5 GET THE CURRENT RENUMBERED LINE NUMBER +4540 f8d0 8d 15 BSR L8A86 RETURN IF END OF PROGRAM +4541 f8d2 0d 98 L8A71 TST VD8 CHECK NEW LINE NUMBER FLAG +4542 f8d4 26 02 BNE L8A77 BRANCH IF NOT INSERTING NEW LINE NUMBERS +4543 f8d6 ed 02 STD $02,X STORE THE NEW LINE NUMBER IN THE BASIC PROGRAM +4544 f8d8 ae 84 L8A77 LDX ,X POINT X TO THE NEXT LINE IN BASIC +4545 f8da 8d 0b BSR L8A86 RETURN IF END OF PROGRAM +4546 f8dc d3 8f ADDD VCF ADD INTERVAL TO CURRENT RENUMBERED LINE NUMBER +4547 f8de 25 04 BLO L8A83 ‘FC’ ERROR IF LINE NUMBER > $FFFF +4548 f8e0 81 fa CMPA #MAXLIN LARGEST LINE NUMBER = $F9FF +4549 f8e2 25 ee BLO L8A71 BRANCH IF LEGAL LINE NUMBER +4550 f8e4 7e e6 ce L8A83 JMP LB44A ‘FC’ ERROR IF LINE NUMBER MS BYTE > $F9 +4551 * TEST THE TWO BYTES POINTED TO BY (X). +4552 * NORMAL RETURN IF <> 0. IF = 0 (END OF +4553 * PROGRAM) RETURN IS PULLED OFF STACK AND +4554 * YOU RETURN TO PREVIOUS SUBROUTINE CALL. +4555 f8e7 34 06 L8A86 PSHS B,A SAVE ACCD +4556 f8e9 ec 84 LDD ,X TEST THE 2 BYTES POINTED TO BY X +4557 f8eb 35 06 PULS A,B RESTORE ACCD +4558 f8ed 26 02 BNE L8A90 BRANCH IF NOT END OF PROGRAM +4559 f8ef 32 62 LEAS $02,S PURGE RETURN ADDRESS FROM STACK +4560 f8f1 39 L8A90 RTS +4561 f8f2 9e 19 L8A91 LDX TXTTAB GET START OF BASIC PROGRAM +4562 f8f4 30 1f LEAX $-01,X MOVE POINTER BACK ONE +4563 f8f6 30 01 L8A95 LEAX $01,X MOVE POINTER UP ONE +4564 f8f8 8d ed BSR L8A86 RETURN IF END OF PROGRAM +4565 f8fa 30 03 L8A99 LEAX $03,X SKIP OVER NEXT LINE ADDRESS AND LINE NUMBER +4566 f8fc 30 01 L8A9B LEAX $01,X MOVE POINTER TO NEXT CHARACTER +4567 f8fe a6 84 LDA ,X CHECK CURRENT CHARACTER +4568 f900 27 f4 BEQ L8A95 BRANCH IF END OF LINE +4569 f902 9f 0f STX TEMPTR SAVE CURRENT POINTER +4570 f904 4a DECA = +4571 f905 27 0c BEQ L8AB2 =BRANCH IF START OF PACKED NUMERIC LINE +4572 f907 4a DECA * +4573 f908 27 2a BEQ L8AD3 *BRANCH IF LINE NUMBER EXISTS +4574 f90a 4a DECA = +4575 f90b 26 ef BNE L8A9B =MOVE TO NEXT CHARACTER IF > 3 +4576 f90d 86 03 L8AAC LDA #$03 * SET 1ST BYTE = 3 TO INDICATE LINE +4577 f90f a7 80 STA ,X+ * NUMBER DOESN’T CURRENTLY EXIST +4578 f911 20 e7 BRA L8A99 GO GET ANOTHER CHARACTER +4579 f913 ec 01 L8AB2 LDD $01,X GET MS BYTE OF LINE NUMBER +4580 f915 6a 02 DEC $02,X DECREMENT ZERO CHECK BYTE +4581 f917 27 01 BEQ L8AB9 BRANCH IF MS BYTE <> 0 +4582 f919 4f CLRA CLEAR MS BYTE +4583 f91a e6 03 L8AB9 LDB $03,X GET LS BYTE OF LINE NUMBER +4584 f91c 6a 04 DEC $04,X DECREMENT ZERO CHECK FLAG +4585 f91e 27 01 BEQ L8AC0 BRANCH IF IS BYTE <> 0 +4586 f920 5f CLRB CLEAR LS BYTE +4587 f921 ed 01 L8AC0 STD $01,X SAVE BINARY LINE NUMBER +4588 f923 dd 2b STD BINVAL SAVE TRIAL LINE NUMBER +4589 f925 bd df a2 JSR LAD01 FIND RAM ADDRESS OF A BASIC LINE NUMBER +4590 f928 9e 0f L8AC7 LDX TEMPTR GET BACK POINTER TO START OF PACKED LINE NUMBER +4591 f92a 25 e1 BLO L8AAC BRANCH IF NO LINE NUMBER MATCH FOUND +4592 f92c dc 47 LDD V47 GET START ADDRESS OF LINE NUMBER +4593 f92e 6c 80 INC ,X+ * SET 1ST BYTE = 2, TO INDICATE LINE NUMBER EXISTS IF CHECKING FOR +4594 * * EXISTENCE OF LINE NUMBER, SET IT = 1 IF INSERTING LINE NUMBERS +4595 +4596 f930 ed 84 STD ,X SAVE RAM ADDRESS OF CORRECT LINE NUMBER +4597 f932 20 c6 BRA L8A99 GO GET ANOTHER CHARACTER +4598 f934 6f 84 L8AD3 CLR ,X CLEAR CARRY FLAG AND 1ST BYTE +4599 f936 ae 01 LDX $01,X POINT X TO RAM ADDRESS OF CORRECT LINE NUMBER +4600 f938 ae 02 LDX $02,X PUT CORRECT LINE NUMBER INTO (X) +4601 f93a 9f 47 STX V47 SAVE IT TEMPORARILY +4602 f93c 20 ea BRA L8AC7 GO INSERT IT INTO BASIC LINE +4603 f93e 9e 19 L8ADD LDX TXTTAB GET BEGINNING OF BASIC PROGRAM +4604 f940 20 04 BRA L8AE5 +4605 f942 9e 83 L8AE1 LDX CHARAD *GET CURRENT INPUT POINTER +4606 f944 30 01 LEAX $01,X *AND BUMP IT ONE +4607 f946 8d 9f L8AE5 BSR L8A86 RETURN IF END OF PROGRAM +4608 f948 30 02 LEAX $02,X SKIP PAST NEXT LINE ADDRESS +4609 f94a 30 01 L8AE9 LEAX $01,X ADVANCE POINTER BY ONE +4610 f94c 9f 83 L8AEB STX CHARAD SAVE NEW BASIC INPUT POINTER +4611 f94e 9d 7c L8AED JSR GETNCH GET NEXT CHARACTER FROM BASIC +4612 f950 4d L8AEF TSTA CHECK THE CHARACTER +4613 f951 27 ef BEQ L8AE1 BRANCH IF END OF LINE +4614 f953 2a f9 BPL L8AED BRANCH IF NOT A TOKEN +4615 f955 9e 83 LDX CHARAD GET CURRENT INPUT POINTER +4616 f957 81 ff CMPA #$FF IS THIS A SECONDARY TOKEN? +4617 f959 27 ef BEQ L8AE9 YES - IGNORE IT +4618 f95b 81 a2 CMPA #TOK_THEN TOKEN FOR THEN? +4619 f95d 27 12 BEQ L8B13 YES +4620 f95f 81 84 CMPA #TOK_ELSE TOKEN FOR ELSE? +4621 f961 27 0e BEQ L8B13 YES +4622 f963 81 81 CMPA #TOK_GO TOKEN FOR GO? +4623 f965 26 e7 BNE L8AED NO +4624 f967 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4625 f969 81 a0 CMPA #TOK_TO TOKEN FOR TO? +4626 f96b 27 04 BEQ L8B13 YES +4627 f96d 81 a1 CMPA #TOK_SUB TOKEN FOR SUB? +4628 f96f 26 db BNE L8AEB NO +4629 f971 9d 7c L8B13 JSR GETNCH GET A CHARACTER FROM BASIC +4630 f973 25 04 BLO L8B1B BRANCH IF NUMERIC +4631 f975 9d 82 L8B17 JSR GETCCH GET CURRENT BASIC INPUT CHARRACTER +4632 f977 20 d7 BRA L8AEF KEEP CHECKING THE LINE +4633 f979 9e 83 L8B1B LDX CHARAD GET CURRENT INPUT ADDRESS +4634 f97b 34 10 PSHS X SAVE IT ON THE STACK +4635 f97d bd e2 14 JSR LAF67 CONVERT DECIMAL BASIC NUMBER TO BINARY +4636 f980 9e 83 LDX CHARAD GET CURRENT INPUT POINTER +4637 f982 a6 82 L8B24 LDA ,-X GET PREVIOUS INPUT CHARACTER +4638 f984 bd fc e9 JSR L90AA CLEAR CARRY IF NUMERIC INPUT VALUE +4639 f987 25 f9 BLO L8B24 BRANCH IF NON-NUMERIC +4640 f989 30 01 LEAX $01,X MOVE POINTER UP ONE +4641 f98b 1f 10 TFR X,D NOW ACCD POINTS TO ONE PAST END OF LINE NUMBER +4642 f98d e0 61 SUBB $01,S SUBTRACT PRE-NUMERIC POINTER LS BYTE +4643 f98f c0 05 SUBB #$05 MAKE SURE THERE ARE AT LEAST 5 CHARACTERS IN THE NUMERIC LINE +4644 * +4645 f991 27 20 BEQ L8B55 BRANCH IF EXACTLY 5 +4646 f993 25 0a BLO L8B41 BRANCH IF < 5 +4647 f995 33 84 LEAU ,X TRANSFER X TO U +4648 f997 50 NEGB NEGATE B +4649 f998 30 85 LEAX B,X MOVE X BACK B BYTES +4650 f99a bd f8 28 JSR L89B8 *MOVE BYTES FROM (U) TO (X) UNTIL +4651 * *U = END OF BASIC; (I) = NEW END OF BASIC +4652 f99d 20 14 BRA L8B55 +4653 * FORCE FIVE BYTES OF SPACE FOR THE LINE NUMBER +4654 f99f 9f 47 L8B41 STX V47 SAVE END OF NUMERIC VALUE +4655 f9a1 9e 1b LDX VARTAB GET END OF BASIC PROGRAM +4656 f9a3 9f 43 STX V43 SAVE IT +4657 f9a5 50 NEGB NEGATE B +4658 f9a6 30 85 LEAX B,X ADD IT TO END OF NUMERIC POiNTER +4659 f9a8 9f 41 STX V41 SAVE POINTER +4660 f9aa 9f 1b STX VARTAB STORE END OF BASIC PROGRAM +4661 f9ac bd de db JSR LAC1E ACCD = TOP OF ARRAYS - CHECK FOR ENOUGH ROOM +4662 f9af 9e 45 LDX V45 * GET AND SAVE THE +4663 f9b1 9f 83 STX CHARAD * NEW CURRENT INPUT POINTER +4664 f9b3 35 10 L8B55 PULS X RESTORE POINTER TO START OF NUMERIC VALUE +4665 f9b5 86 01 LDA #$01 NEW LINE NUMBER FLAG +4666 f9b7 a7 84 STA ,X * SAVE NEW LINE FLAG +4667 f9b9 a7 02 STA $02,X * +4668 f9bb a7 04 STA $04,X * +4669 f9bd d6 2b LDB BINVAL GET MS BYTE OF BINARY LINE NUMBER +4670 f9bf 26 04 BNE L8B67 BRANCH IF IT IS NOT ZERO +4671 f9c1 c6 01 LDB #$01 SAVE A 1 IF BYTE IS 0; OTHERWISE, BASIC WILL +4672 * THINK IT IS THE END OF A LINE +4673 f9c3 6c 02 INC $02,X IF 2,X = 2, THEN PREVIOUS BYTE WAS A ZERO +4674 f9c5 e7 01 L8B67 STB $01,X SAVE MS BYTE OF BINARY LINE NUMBER +4675 f9c7 d6 2c LDB BINVAL+1 GET IS BYTE OF BINARY LINE NUMBER +4676 f9c9 26 04 BNE L8B71 BRANCH IF NOT A ZERO BYTE +4677 f9cb c6 01 LDB #$01 SAVE A 1 IF BYTE IS A 0 +4678 f9cd 6c 04 INC $04,X IF 4,X = 2, THEN PREVIOUS BYTE WAS A 0 +4679 f9cf e7 03 L8B71 STB $03,X SAVE LS BYTE OF BINARY LINE NUMBER +4680 f9d1 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4681 f9d3 81 2c CMPA #',' IS IT A COMMA? +4682 f9d5 27 9a BEQ L8B13 YES - PROCESS ANOTHER NUMERIC VALUE +4683 f9d7 20 9c BRA L8B17 NO - GO GET AND PROCESS AN INPUT CHARACTER +4684 f9d9 9e 19 L8B7B LDX TXTTAB POINT X TO START OF BASIC PROGRAM +4685 f9db 30 1f LEAX $-01,X MOVE POINTER BACK ONE +4686 f9dd 30 01 L8B7F LEAX $01,X MOVE POINTER UP ONE +4687 f9df ec 02 LDD $02,X GET ADDRESS OF NEXT LINE +4688 f9e1 dd 68 STD CURLIN SAVE IT IN CURLIN +4689 f9e3 bd f8 e7 JSR L8A86 RETURN IF END OF PROGRAM +4690 f9e6 30 03 LEAX $03,X SKIP OVER ADDRESS OF NEXT LINE AND 1ST BYTE OF LINE NUMBER +4691 f9e8 30 01 L8B8A LEAX $01,X MOVE POINTER UP ONE +4692 f9ea a6 84 L8B8C LDA ,X GET CURRENT CHARACTER +4693 f9ec 27 ef BEQ L8B7F BRANCH IF END OF LINE +4694 f9ee 4a DECA INPUT CHARACTER = 1? - VALID LINE NUMBER +4695 f9ef 27 1b BEQ L8BAE YES +4696 f9f1 80 02 SUBA #$02 INPUT CHARACTER 3? - UL LINE NUMBER +4697 f9f3 26 f3 BNE L8B8A NO +4698 f9f5 34 10 PSHS X SAVE CURRENT POSITION OF INPUT POINTER +4699 f9f7 8e fa 36 LDX #L8BD9-1 POINT X TO ‘UL’ MESSAGE +4700 f9fa bd eb e5 JSR LB99C PRINT STRING TO THE SCREEN +4701 f9fd ae e4 LDX ,S GET INPUT POINTER +4702 f9ff ec 01 LDD $01,X GET THE UNDEFINED LINE NUMBER +4703 fa01 bd f0 15 JSR LBDCC CONVERT NUMBER IN ACCD TO DECIMAL AND DISPLAY IT +4704 fa04 bd f0 0e JSR LBDC5 PRINT ‘IN XXXX’ XXXX = CURRENT LINE NUMBER +4705 fa07 bd eb a5 JSR LB958 SEND A CR TO CONSOLE OUT +4706 fa0a 35 10 PULS X GET INPUT POINTER BACK +4707 fa0c 34 10 L8BAE PSHS X SAVE CURRENT POSITION OF INPUT POINTER +4708 fa0e ec 01 LDD $01,X LOAD ACCD WITH BINARY VALUE OF LINE NUMBER +4709 fa10 dd 52 STD FPA0+2 SAVE IN BOTTOM 2 BYTES OF FPA0 +4710 fa12 bd f6 c1 JSR L880E ADJUST REST OF FPA0 AS AN INTEGER +4711 fa15 bd f0 22 JSR LBDD9 CONVERT FPA0 TO ASCII, STORE IN LINE NUMBER +4712 fa18 35 40 PULS U LOAD U WITH PREVIOUS ADDRESS OF INPUT POINTER +4713 fa1a c6 05 LDB #$05 EACH EXPANDED LINE NUMBER USES 5 BYTES +4714 fa1c 30 01 L8BBE LEAX $01,X MOVE POINTER FORWARD ONE +4715 fa1e a6 84 LDA ,X GET AN ASCII BYTE +4716 fa20 27 05 BEQ L8BC9 BRANCH IF END OF NUMBER +4717 fa22 5a DECB DECREMENT BYTE COUNTER +4718 fa23 a7 c0 STA ,U+ STORE ASCII NUMBER IN BASIC LINE +4719 fa25 20 f5 BRA L8BBE CHECK FOR ANOTHER DIGIT +4720 fa27 30 c4 L8BC9 LEAX ,U TRANSFER NEW LINE POINTER TO (X) +4721 fa29 5d TSTB DOES THE NEW LINE NUMBER REQUIRE 5 BYTES? +4722 fa2a 27 be BEQ L8B8C YES - GO GET ANOTHER INPUT CHARACTER +4723 fa2c 31 c4 LEAY ,U SAVE NEW LINE POINTER IN Y +4724 fa2e 33 c5 LEAU B,U POINT U TO END OF 5 BYTE PACKED LINE NUMBER BLOCK +4725 fa30 bd f8 28 JSR L89B8 MOVE BYTES FROM (U) TO (X) UNTIL END OF PROGRAM +4726 fa33 30 a4 LEAX ,Y LOAD (X) WITH NEW LINE POINTER +4727 fa35 20 b3 BRA L8B8C GO GET ANOTHER INPUT CHARACTER +4728 +4729 fa37 55 4c 20 L8BD9 FCC "UL " UNKNOWN LINE NUMBER MESSAGE +4730 fa3a 00 FCB 0 +4731 +4732 +4733 fa3b bd e9 c4 HEXDOL JSR LB740 CONVERT FPA0 INTO A POSITIVE 2 BYTE INTEGER +4734 fa3e 8e 01 f0 LDX #STRBUF+2 POINT TO TEMPORARY BUFFER +4735 fa41 c6 04 LDB #$04 CONVERT 4 NIBBLES +4736 fa43 34 04 L8BE5 PSHS B SAVE NIBBLE COUNTER +4737 fa45 5f CLRB CLEAR CARRY FLAG +4738 fa46 86 04 LDA #$04 4 SHIFTS +4739 fa48 08 53 L8BEA ASL FPA0+3 * SHIFT BOTTOM TWO BYTES OF +4740 fa4a 09 52 ROL FPA0+2 * FPA0 LEFT ONE BIT (X2) +4741 fa4c 59 ROLB IF OVERFLOW, ACCB <> 0 +4742 fa4d 4a DECA * DECREMENT SHIFT COUNTER AND +4743 fa4e 26 f8 BNE L8BEA * BRANCH IF NOT DONE +4744 fa50 5d TSTB CHECK FOR OVERFLOW +4745 fa51 26 0a BNE L8BFF BRANCH IF OVERFLOW +4746 fa53 a6 e4 LDA ,S * GET NIBBLE COUNTER, +4747 fa55 4a DECA * DECREMENT IT AND +4748 fa56 27 05 BEQ L8BFF * BRANCH IF DONE +4749 fa58 8c 01 f0 CMPX #STRBUF+2 DO NOT DO A CONVERSION UNTIL A NON-ZERO +4750 fa5b 27 0c BEQ L8C0B BYTE IS FOUND - LEADING ZERO SUPPRESSION +4751 fa5d cb 30 L8BFF ADDB #'0' ADD IN ASCII ZERO +4752 fa5f c1 39 CMPB #'9' COMPARE TO ASCII 9 +4753 fa61 23 02 BLS L8C07 BRANCH IF < 9 +4754 fa63 cb 07 ADDB #7 ADD ASCII OFFSET IF HEX LETTER +4755 fa65 e7 80 L8C07 STB ,X+ STORE HEX VALUE AND ADVANCE POINTER +4756 fa67 6f 84 CLR ,X CLEAR NEXT BYTE - END OF STRING FLAG +4757 fa69 35 04 L8C0B PULS B * GET NIBBLE COUNTER, +4758 fa6b 5a DECB * DECREMENT IT AND +4759 fa6c 26 d5 BNE L8BE5 * BRANCH IF NOT DONE +4760 fa6e 32 62 LEAS $02,S PURGE RETURN ADDRESS OFF OF STACK +4761 fa70 8e 01 ef LDX #STRBUF+1 RESET POINTER +4762 fa73 7e e7 9c JMP LB518 SAVE STRING ON STRING STACK +4763 * PROCESS EXCLAMATION POINT +4764 fa76 86 01 L8E37 LDA #$01 * SET SPACES +4765 fa78 97 99 STA VD9 * COUNTER = 1 +4766 * PROCESS STRING ITEM - LIST +4767 fa7a 5a L8E3B DECB DECREMENT FORMAT STRING LENGTH COUNTER +4768 fa7b bd fc 17 JSR L8FD8 SEND A '+' TO CONSOLE OUT IF VDA <>0 +4769 fa7e 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4770 fa80 10 27 00 93 LBEQ L8ED8 EXIT PRINT USING IF END OF LINE +4771 fa84 d7 93 STB VD3 SAVE REMAINDER FORMAT STRING LENGTH +4772 fa86 bd e3 df JSR LB156 EVALUATE EXPRESSION +4773 fa89 bd e3 cf JSR LB146 ‘TM’ ERROR IF NUMERIC VARIABLE +4774 fa8c 9e 52 LDX FPA0+2 * GET ITEM - LIST DESCRIPTOR ADDRESS +4775 fa8e 9f 4d STX V4D * AND SAVE IT IN V4D +4776 fa90 d6 99 LDB VD9 GET SPACES COUNTER +4777 fa92 bd e9 31 JSR LB6AD PUT ACCB BYTES INTO STRING SPACE & PUT DESCRIPTOR ON STRING STACK +4778 fa95 bd eb e8 JSR LB99F PRINT THE FORMATTED STRING TO CONSOLE OUT +4779 * PAD FORMAT STRING WITH SPACES IF ITEM - LIST STRING < FORMAT STRING LENGTH +4780 fa98 9e 52 LDX FPA0+2 POINT X TO FORMATTED STRING DESCRIPTOR ADDRESS +4781 fa9a d6 99 LDB VD9 GET SPACES COUNTER +4782 fa9c e0 84 SUBB ,X SUBTRACT LENGTH OF FORMATTED STRING +4783 fa9e 5a L8E5F DECB DECREMENT DIFFERENCE +4784 fa9f 10 2b 01 4f LBMI L8FB3 GO INTERPRET ANOTHER ITEM - LIST +4785 faa3 bd eb f5 JSR LB9AC PAD FORMAT STRING WITH A SPACE +4786 faa6 20 f6 BRA L8E5F KEEP PADDING +4787 * PERCENT SIGN - PROCESS A %SPACES% COMMAND +4788 faa8 d7 93 L8E69 STB VD3 * SAVE THE CURRENT FORMAT STRING +4789 faaa 9f 0f STX TEMPTR * COUNTER AND POINTER +4790 faac 86 02 LDA #$02 INITIAL SPACES COUNTER = 2 +4791 faae 97 99 STA VD9 SAVE IN SPACES COUNTER +4792 fab0 a6 84 L8E71 LDA ,X GET A CHARACTER FROM FORMAT STRING +4793 fab2 81 25 CMPA #'%' COMPARE TO TERMINATOR CHARACTER +4794 fab4 27 c4 BEQ L8E3B BRANCH IF END OF SPACES COMMAND +4795 fab6 81 20 CMPA #' ' BLANK +4796 fab8 26 07 BNE L8E82 BRANCH IF ILLEGAL CHARACTER +4797 faba 0c 99 INC VD9 ADD ONE TO SPACES COUNTER +4798 fabc 30 01 LEAX $01,X MOVE FORMAT POINTER UP ONE +4799 fabe 5a DECB DECREMENT LENGTH COUNTER +4800 fabf 26 ef BNE L8E71 BRANCH IF NOT END OF FORMAT STRING +4801 fac1 9e 0f L8E82 LDX TEMPTR * RESTORE CURRENT FORMAT STRING COUNTER +4802 fac3 d6 93 LDB VD3 * AND POINTER TO POSITION BEFORE SPACES COMMAND +4803 fac5 86 25 LDA #'%' SEND A ‘%’ TO CONSOLE OUT AS A DEBUGGING AID +4804 * ERROR PROCESSOR - ILLEGAL CHARACTER OR BAD SYNTAX IN FORMAT STRING +4805 fac7 bd fc 17 L8E88 JSR L8FD8 SEND A ‘+' TO CONSOLE OUT IF VDA <> 0 +4806 faca bd db 14 JSR PUTCHR SEND CHARACTER TO CONSOLE OUT +4807 facd 20 29 BRA L8EB9 GET NEXT CHARACTER IN FORMAT STRING +4808 +4809 * PRINT RAM HOOK +4810 facf 81 b1 XVEC9 CMPA #TOK_USING USING TOKEN +4811 fad1 27 01 BEQ L8E95 BRANCH IF PRINT USING +4812 fad3 39 RTS +4813 +4814 * PRINT USING +4815 * VDA IS USED AS A STATUS BYTE: BIT 6 = COMMA FORCE +4816 * BIT 5=LEADING ASTERISK FORCE; BIT 4 = FLOATING $ FORCE +4817 * BIT 3 = PRE SIGN FORCE; BIT 2 = POST SIGN FORCE; BIT 0 = EXPONENTIAL FORCE +4818 fad4 32 62 L8E95 LEAS $02,S PURGE RETURN ADDRESS OFF THE STACK +4819 fad6 bd e3 e1 JSR LB158 EVALUATE FORMAT STRING +4820 fad9 bd e3 cf JSR LB146 ‘TM’ ERROR IF VARIABLE TYPE = NUMERIC +4821 fadc c6 3b LDB #';' CHECK FOR ITEM LIST SEPARATOR +4822 fade bd e4 f8 JSR LB26F SYNTAX CHECK FOR ; +4823 fae1 9e 52 LDX FPA0+2 * GET FORMAT STRING DESCRIPTOR ADDRESS +4824 fae3 9f 95 STX VD5 * AND SAVE IT IN VD5 +4825 fae5 20 06 BRA L8EAE GO PROCESS FORMAT STRING +4826 fae7 96 97 L8EA8 LDA VD7 *CHECK NEXT PRINT ITEM FLAG AND +4827 fae9 27 08 BEQ L8EB4 *‘FC’ ERROR IF NO FURTHER PRINT ITEMS +4828 faeb 9e 95 LDX VD5 RESET FORMAT STRING POINTER TO START OF STRING +4829 faed 0f 97 L8EAE CLR VD7 RESET NEXT PRINT ITEM FLAG +4830 faef e6 84 LDB ,X GET LENGTH OF FORMAT STRING +4831 faf1 26 03 BNE L8EB7 INTERPRET FORMAT STRING IF LENGTH > 0 +4832 faf3 7e e6 ce L8EB4 JMP LB44A ‘FC’ ERROR IF FORMAT STRING = NULL +4833 faf6 ae 02 L8EB7 LDX $02,X POINT X TO START OF FORMAT STRING +4834 * INTERPRET THE FORMAT STRING +4835 faf8 0f 9a L8EB9 CLR VDA CLEAR THE STATUS BYTE +4836 fafa 0f 99 L8EBB CLR VD9 CLEAR LEFT DIGIT COUNTER +4837 fafc a6 80 LDA ,X+ GET A CHARACTER FROM FORMAT STRING +4838 fafe 81 21 CMPA #'!' EXCLAMATION POINT? +4839 fb00 10 27 ff 72 LBEQ L8E37 YES - STRING TYPE FORMAT +4840 fb04 81 23 CMPA #'#' NUMBER SIGN? (DIGIT LOCATOR) +4841 fb06 27 5b BEQ L8F24 YES - NUMERIC TYPE FORMAT +4842 fb08 5a DECB DECREMENT FORMAT STRING LENGTH +4843 fb09 26 16 BNE L8EE2 BRANCH IF NOT DONE +4844 fb0b bd fc 17 JSR L8FD8 SEND A ‘+‘ TO CONSOLE OUT IF VDA <> 0 +4845 fb0e bd db 14 JSR PUTCHR SEND CHARACTER TO CONSOLE OUT +4846 fb11 9d 82 L8ED2 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +4847 fb13 26 d2 BNE L8EA8 BRANCH IF NOT END OF LINE +4848 fb15 96 97 LDA VD7 GET NEXT PRINT ITEM FLAG +4849 fb17 26 03 L8ED8 BNE L8EDD BRANCH IF MORE PRINT ITEMS +4850 fb19 bd eb a5 JSR LB958 SEND A CARRIAGE RETURN TO CONSOLE OUT +4851 fb1c 9e 95 L8EDD LDX VD5 POINT X TO FORMAT STRING DESCRIPTOR +4852 fb1e 7e e8 dd JMP LB659 RETURN ADDRESS AND LENGTH OF FORMAT STRING - EXIT PRINT USING +4853 fb21 81 2b L8EE2 CMPA #'+' CHECK FOR ‘+‘ (PRE-SIGN FORCE) +4854 fb23 26 09 BNE L8EEF NO PLUS +4855 fb25 bd fc 17 JSR L8FD8 SEND A ‘+' TO CONSOLE OUT IF VDA <> 0 +4856 fb28 86 08 LDA #$08 * LOAD THE STATUS BYTE WITH 8; +4857 fb2a 97 9a STA VDA * PRE-SIGN FORCE FLAG +4858 fb2c 20 cc BRA L8EBB INTERPRET THE REST OF THE FORMAT STRING +4859 fb2e 81 2e L8EEF CMPA #'.' DECIMAL POINT? +4860 fb30 27 4e BEQ L8F41 YES +4861 fb32 81 25 CMPA #'%' PERCENT SIGN? +4862 fb34 10 27 ff 70 LBEQ L8E69 YES +4863 fb38 a1 84 CMPA ,X COMPARE THE PRESENT FORMAT STRING INPUT +4864 * CHARACTER TO THE NEXT ONE IN THE STRING +4865 fb3a 26 8b L8EFB BNE L8E88 NO MATCH - ILLEGAL CHARACTER +4866 * TWO CONSECUTIVE EQUAL CHARACTERS IN FORMAT STRING +4867 fb3c 81 24 CMPA #'$' DOLLAR SIGN? +4868 fb3e 27 19 BEQ L8F1A YES - MAKE THE DOLLAR SIGN FLOAT +4869 fb40 81 2a CMPA #'*' ASTERISK? +4870 fb42 26 f6 BNE L8EFB NO - ILLEGAL CHARACTER +4871 fb44 96 9a LDA VDA * GRAB THE STATUS BYTE AND BET BIT 5 +4872 fb46 8a 20 ORA #$20 * TO INDICATE THAT THE OUTPUT WILL +4873 fb48 97 9a STA VDA * BE LEFT PADDED WITH ASTERISKS +4874 fb4a c1 02 CMPB #2 * CHECK TO SEE IF THE $$ ARE THE LAST TWO +4875 fb4c 25 11 BLO L8F20 * CHARACTERS IN THE FORMAT STRING AND BRANCH IF SO +4876 fb4e a6 01 LDA $01,X GET THE NEXT CHARACTER AFTER ** +4877 fb50 81 24 CMPA #'$' CHECK FOR **$ +4878 fb52 26 0b BNE L8F20 CHECK FOR MORE CHARACTERS +4879 fb54 5a DECB DECREMENT STRING LENGTH COUNTER +4880 fb55 30 01 LEAX $01,X MOVE FORMAT STRING POINTER UP ONE +4881 fb57 0c 99 INC VD9 ADD ONE TO LEFT DIGIT COUNTER - FOR ASTERISK PAD AND +4882 * FLOATING DOLLAR SIGN COMBINATION +4883 fb59 96 9a L8F1A LDA VDA * GET THE STATUS BYTE AND SET +4884 fb5b 8a 10 ORA #$10 * BIT 4 TO INDICATE A +4885 fb5d 97 9a STA VDA * FLOATING DOLLAR SIGN +4886 fb5f 30 01 L8F20 LEAX $01,X MOVE FORMAT STRING POINTER UP ONE +4887 fb61 0c 99 INC VD9 ADD ONE TO LEFT DIGIT (FLOATING $ OR ASTERISK PAD) +4888 * PROCESS CHARACTERS TO THE LEFT OF THE DECIMAL POINT IN THE FORMAT STRING +4889 fb63 0f 98 L8F24 CLR VD8 CLEAR THE RIGHT DIGIT COUNTER +4890 fb65 0c 99 L8F26 INC VD9 ADD ONE TO LEFT DIGIT COUNTER +4891 fb67 5a DECB DECREMENT FORMAT STRING LENGTH COUNTER +4892 fb68 27 49 BEQ L8F74 BRANCH IF END OF FORMAT STRING +4893 fb6a a6 80 LDA ,X+ GET THE NEXT FORMAT CHARACTER +4894 fb6c 81 2e CMPA #'.' DECIMAL POINT? +4895 fb6e 27 1e BEQ L8F4F YES +4896 fb70 81 23 CMPA #'#' NUMBER SIGN? +4897 fb72 27 f1 BEQ L8F26 YES +4898 fb74 81 2c CMPA #',' COMMA? +4899 fb76 26 21 BNE L8F5A NO +4900 fb78 96 9a LDA VDA * GET THE STATUS BYTE +4901 fb7a 8a 40 ORA #$40 * AND SET BIT 6 WHICH IS THE +4902 fb7c 97 9a STA VDA * COMMA SEPARATOR FLAG +4903 fb7e 20 e5 BRA L8F26 PROCESS MORE CHARACTERS TO LEFT OF DECIMAL POINT +4904 * PROCESS DECIMAL POINT IF NO DIGITS TO LEFT OF IT +4905 fb80 a6 84 L8F41 LDA ,X GET NEXT FORMAT CHARACTER +4906 fb82 81 23 CMPA #'#' IS IT A NUMBER SIGN? +4907 fb84 10 26 ff 3f LBNE L8E88 NO +4908 fb88 86 01 LDA #1 * SET THE RIGHT DIGIT COUNTER TO 1 - +4909 fb8a 97 98 STA VD8 * ALLOW ONE SPOT FOR DECIMAL POINT +4910 fb8c 30 01 LEAX $01,X MOVE FORMAT POINTER UP ONE +4911 * PROCESS DIGITS TO RIGHT OF DECIMAL POINT +4912 fb8e 0c 98 L8F4F INC VD8 ADD ONE TO RIGHT DIGIT COUNTER +4913 fb90 5a DECB DECREMENT FORMAT LENGTH COUNTER +4914 fb91 27 20 BEQ L8F74 BRANCH IF END OF FORMAT STRING +4915 fb93 a6 80 LDA ,X+ GET A CHARACTER FROM FORMAT STRING +4916 fb95 81 23 CMPA #'#' IS IT NUMBER SIGN? +4917 fb97 27 f5 BEQ L8F4F YES - KEEP CHECKING +4918 * CHECK FOR EXPONENTIAL FORCE +4919 fb99 81 5e L8F5A CMPA #$5E CHECK FOR UP ARROW +4920 fb9b 26 16 BNE L8F74 NO UP ARROW +4921 fb9d a1 84 CMPA ,X IS THE NEXT CHARACTER AN UP ARROW? +4922 fb9f 26 12 BNE L8F74 NO +4923 fba1 a1 01 CMPA $01,X AND THE NEXT CHARACTER? +4924 fba3 26 0e BNE L8F74 NO +4925 fba5 a1 02 CMPA $02,X HOW ABOUT THE 4TH CHARACTER? +4926 fba7 26 0a BNE L8F74 NO, ALSO +4927 fba9 c1 04 CMPB #4 * CHECK TO SEE IF THE 4 UP ARROWS ARE IN THE +4928 fbab 25 06 BLO L8F74 * FORMAT STRING AND BRANCH IF NOT +4929 fbad c0 04 SUBB #4 * MOVE POINTER UP 4 AND SUBTRACT +4930 fbaf 30 04 LEAX $04,X * FOUR FROM LENGTH +4931 fbb1 0c 9a INC VDA INCREMENT STATUS BYTE - EXPONENTIAL FORM +4932 +4933 * CHECK FOR A PRE OR POST - SIGN FORCE AT END OF FORMAT STRING +4934 fbb3 30 1f L8F74 LEAX $-01,X MOVE POINTER BACK ONE +4935 fbb5 0c 99 INC VD9 ADD ONE TO LEFT DIGIT COUNTER FOR PRE-SIGN FORCE +4936 fbb7 96 9a LDA VDA * PRE-SIGN +4937 fbb9 85 08 BITA #$08 * FORCE AND +4938 fbbb 26 18 BNE L8F96 * BRANCH IF SET +4939 fbbd 0a 99 DEC VD9 DECREMENT LEFT DIGIT — NO PRE-SIGN FORCE +4940 fbbf 5d TSTB * CHECK LENGTH COUNTER AND BRANCH +4941 fbc0 27 13 BEQ L8F96 * IF END OF FORMAT STRING +4942 fbc2 a6 84 LDA ,X GET NEXT FORMAT STRING CHARACTER +4943 fbc4 80 2d SUBA #'-' CHECK FOR MINUS SIGN +4944 fbc6 27 06 BEQ L8F8F BRANCH IF MINUS SIGN +4945 fbc8 81 fe CMPA #$FE * WAS CMPA #('+')-('-') +4946 fbca 26 09 BNE L8F96 BRANCH IF NO PLUS SIGN +4947 fbcc 86 08 LDA #$08 GET THE PRE-SIGN FORCE FLAG +4948 fbce 8a 04 L8F8F ORA #$04 ‘OR’ IN POST-SIGN FORCE FLAG +4949 fbd0 9a 9a ORA VDA ‘OR’ IN THE STATUS BYTE +4950 fbd2 97 9a STA VDA SAVE THE STATUS BYTE +4951 fbd4 5a DECB DECREMENT FORMAT STRING LENGTH +4952 +4953 * EVALUATE NUMERIC ITEM-LIST +4954 fbd5 9d 82 L8F96 JSR GETCCH GET CURRENT CHARACTER +4955 fbd7 10 27 ff 3c LBEQ L8ED8 BRANCH IF END OF LINE +4956 fbdb d7 93 STB VD3 SAVE FORMAT STRING LENGTH WHEN FORMAT EVALUATION ENDED +4957 fbdd bd e3 ca JSR LB141 EVALUATE EXPRESSION +4958 fbe0 96 99 LDA VD9 GET THE LEFT DIGIT COUNTER +4959 fbe2 9b 98 ADDA VD8 ADD IT TO THE RIGHT DIGIT COUNTER +4960 fbe4 81 11 CMPA #17 * +4961 fbe6 10 22 ea e4 LBHI LB44A *‘FC’ ERROR IF MORE THAN 16 DIGITS AND DECIMAL POiNT +4962 fbea bd fc 24 JSR L8FE5 CONVERT ITEM-LIST TO FORMATTED ASCII STRING +4963 fbed 30 1f LEAX $-01,X MOVE BUFFER POINTER BACK ONE +4964 fbef bd eb e5 JSR LB99C DISPLAY THE FORMATTED STRING TO CONSOLE OUT +4965 fbf2 0f 97 L8FB3 CLR VD7 RESET NEXT PRINT ITEM FLAG +4966 fbf4 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4967 fbf6 27 0d BEQ L8FC6 BRANCH IF END OF LINE +4968 fbf8 97 97 STA VD7 SAVE CURRENT CHARACTER (<>0) IN NEXT PRINT ITEM FLAG +4969 fbfa 81 3b CMPA #';' * CHECK FOR ; - ITEM-LIST SEPARATOR AND +4970 fbfc 27 05 BEQ L8FC4 * BRANCH IF SEMICOLON +4971 fbfe bd e4 f6 JSR LB26D SYNTAX CHECK FOR COMMA +4972 fc01 20 02 BRA L8FC6 PROCESS NEXT PRINT ITEM +4973 fc03 9d 7c L8FC4 JSR GETNCH GET NEXT INPUT CHARACTER +4974 fc05 9e 95 L8FC6 LDX VD5 GET FORMAT STRING DESCRIPTOR ADDRESS +4975 fc07 e6 84 LDB ,X GET LENGTH OF FORMAT STRING +4976 fc09 d0 93 SUBB VD3 SUBTRACT AMOUNT OF FORMAT STRING LEFT AFTER LAST PRINT ITEM +4977 fc0b ae 02 LDX $02,X *GET FORMAT STRING START ADDRESS AND ADVANCE +4978 fc0d 3a ABX *POINTER TO START OF UNUSED FORMAT STRING +4979 fc0e d6 93 LDB VD3 * GET AMOUNT OF UNUSED FORMAT STRING +4980 fc10 10 26 fe e4 LBNE L8EB9 * REINTERPRET FORMAT STRING FROM THAT POINT +4981 fc14 7e fb 11 JMP L8ED2 REINTERPRET FORMAT STRING FROM THE START IF ENTIRELY +4982 * USED ON LAST PRINT ITEM +4983 +4984 * PRINT A ‘+‘ TO CONSOLE OUT IF THE STATUS BYTE <> 0 +4985 fc17 34 02 L8FD8 PSHS A RESTORE ACCA AND RETURN +4986 fc19 86 2b LDA #'+' GET ASCII PLUS SIGN +4987 fc1b 0d 9a TST VDA * CHECK THE STATUS BYTE AND +4988 fc1d 27 03 BEQ L8FE3 * RETURN IF = 0 +4989 fc1f bd db 14 JSR PUTCHR SEND A CHARACTER TO CONSOLE OUT +4990 fc22 35 82 L8FE3 PULS A,PC RETURN ACCA AND RETURN +4991 +4992 * CONVERT ITEM-LIST TO DECIMAL ASCII STRING +4993 fc24 ce 01 f2 L8FE5 LDU #STRBUF+4 POINT U TO STRING BUFFER +4994 fc27 c6 20 LDB #SPACE BLANK +4995 fc29 96 9a LDA VDA * GET THE STATUS FLAG AND +4996 fc2b 85 08 BITA #$08 * CHECK FOR A PRE-SIGN FORCE +4997 fc2d 27 02 BEQ L8FF2 * BRANCH IF NO PRE-SIGN FORCE +4998 fc2f c6 2b LDB #'+' PLUS SIGN +4999 fc31 0d 54 L8FF2 TST FP0SGN CHECK THE SIGN OF FPA0 +5000 fc33 2a 04 BPL L8FFA BRANCH IF POSITIVE +5001 fc35 0f 54 CLR FP0SGN FORCE FPA0 SIGN TO BE POSITIVE +5002 fc37 c6 2d LDB #'-' MINUS SIGN +5003 fc39 e7 c0 L8FFA STB ,U+ SAVE THE SIGN IN BUFFER +5004 fc3b c6 30 LDB #'0' * PUT A ZERO INTO THE BUFFER +5005 fc3d e7 c0 STB ,U+ * +5006 fc3f 84 01 ANDA #$01 * CHECK THE EXPONENTIAL FORCE FLAG IN +5007 fc41 10 26 01 07 LBNE L910D * THE STATUS BYTE - BRANCH IF ACTIVE +5008 fc45 8e f0 09 LDX #LBDC0 POINT X TO FLOATING POINT 1E + 09 +5009 fc48 bd ee e9 JSR LBCA0 COMPARE FPA0 TO (X) +5010 fc4b 2b 15 BMI L9023 BRANCH IF FPA0 < 1E+09 +5011 fc4d bd f0 22 JSR LBDD9 CONVERT FP NUMBER TO ASCII STRING +5012 fc50 a6 80 L9011 LDA ,X+ * ADVANCE POINTER TO END OF +5013 fc52 26 fc BNE L9011 * ASCII STRING (ZERO BYTE) +5014 fc54 a6 82 L9015 LDA ,-X MOVE THE +5015 fc56 a7 01 STA $01,X ENTIRE STRING +5016 fc58 8c 01 f1 CMPX #STRBUF+3 UP ONE +5017 fc5b 26 f7 BNE L9015 BYTE +5018 fc5d 86 25 LDA #'%' * INSERT A % SIGN AT START OF +5019 fc5f a7 84 STA ,X * STRING - OVERFLOW ERROR +5020 fc61 39 RTS +5021 +5022 fc62 96 4f L9023 LDA FP0EXP GET EXPONENT OF FPA0 +5023 fc64 97 47 STA V47 AND SAVE IT IN V74 +5024 fc66 27 03 BEQ L902C BRANCH IF FPA0 = 0 +5025 fc68 bd fe 0c JSR L91CD CONVERT FPA0 TO NUMBER WITH 9 SIGNIFICANT +5026 * PLACES TO LEFT OF DECIMAL POINT +5027 fc6b 96 47 L902C LDA V47 GET BASE 10 EXPONENT OFFSET +5028 fc6d 10 2b 00 81 LBMI L90B3 BRANCH IF FPA0 < 100,000,000 +5029 fc71 40 NEGA * CALCULATE THE NUMBER OF LEADING ZEROES TO INSERT - +5030 fc72 9b 99 ADDA VD9 * SUBTRACT BASE 10 EXPONENT OFFSET AND 9 (FPA0 HAS +5031 fc74 80 09 SUBA #$09 * 9 PLACES TO LEFT OF EXPONENT) FROM LEFT DIGIT COUNTER +5032 fc76 bd fd 29 JSR L90EA PUT ACCA ZEROES IN STRING BUFFER +5033 fc79 bd fe a2 JSR L9263 INITIALIZE DECIMAL POINT AND COMMA COUNTERS +5034 fc7c bd fe 41 JSR L9202 CONVERT FPA0 TO DECIMAL ASCII IN THE STRING BUFFER +5035 fc7f 96 47 LDA V47 * GET BASE 10 EXPONENT AND PUT THAT MANY +5036 fc81 bd fe c0 JSR L9281 * ZEROES IN STRING BUFFER - STOP AT DECIMAL POINT +5037 fc84 96 47 LDA V47 WASTED INSTRUCTION - SERVES NO PURPOSE +5038 fc86 bd fe 88 JSR L9249 CHECK FOR DECIMAL POINT +5039 fc89 96 98 LDA VD8 GET THE RIGHT DIGIT COUNTER +5040 fc8b 26 02 BNE L9050 BRANCH IF RIGHT DIGlT COUNTER <> 0 +5041 fc8d 33 5f LEAU $-01,U * MOVE BUFFER POINTER BACK ONE - DELETE +5042 * * DECIMAL POINT IF NO RIGHT DIGITS SPECiFIED +5043 fc8f 4a L9050 DECA SUBTRACT ONE (DECIMAL POINT) +5044 fc90 bd fd 29 JSR L90EA PUT ACCA ZEROES INTO BUFFER (TRAILING ZEROES) +5045 fc93 bd fd c4 L9054 JSR L9185 INSERT ASTERISK PADDING, FLOATING $, AND POST-SIGN +5046 fc96 4d TSTA WAS THERE A POST-SIGN? +5047 fc97 27 06 BEQ L9060 NO +5048 fc99 c1 2a CMPB #'*' IS THE FIRST CHARACTER AN $? +5049 fc9b 27 02 BEQ L9060 YES +5050 fc9d e7 c0 STB ,U+ STORE THE POST-SIGN +5051 fc9f 6f c4 L9060 CLR ,U CLEAR THE LAST CHARACTER IN THE BUFFER +5052 * +5053 * REMOVE ANY EXTRA BLANKS OR ASTERISKS FROM THE +5054 * STRING BUFFER TO THE LEFT OF THE DECIMAL POINT +5055 fca1 8e 01 f1 LDX #STRBUF+3 POINT X TO THE START OF THE BUFFER +5056 fca4 30 01 L9065 LEAX $01,X MOVE BUFFER POINTER UP ONE +5057 fca6 9f 0f STX TEMPTR SAVE BUFFER POINTER IN TEMPTR +5058 fca8 96 3a LDA VARPTR+1 * GET ADDRESS OF DECIMAL POINT IN BUFFER, SUBTRACT +5059 fcaa 90 10 SUBA TEMPTR+1 * CURRENT POSITION AND SUBTRACT LEFT DIGIT COUNTER - +5060 fcac 90 99 SUBA VD9 * THE RESULT WILL BE ZERO WHEN TEMPTR+1 IS POINTING +5061 * * TO THE FIRST DIGIT OF THE FORMAT STRING +5062 fcae 27 38 BEQ L90A9 RETURN IF NO DIGITS TO LEFT OF THE DECiMAL POINT +5063 fcb0 a6 84 LDA ,X GET THE CURRENT BUFFER CHARACTER +5064 fcb2 81 20 CMPA #SPACE SPACE? +5065 fcb4 27 ee BEQ L9065 YES - ADVANCE POINTER +5066 fcb6 81 2a CMPA #'*' ASTERISK? +5067 fcb8 27 ea BEQ L9065 YES - ADVANCE POINTER +5068 fcba 4f CLRA A ZERO ON THE STACK IS END OF DATA POINTER +5069 fcbb 34 02 L907C PSHS A PUSH A CHARACTER ONTO THE STACK +5070 fcbd a6 80 LDA ,X+ GET NEXT CHARACTER FROM BUFFER +5071 fcbf 81 2d CMPA #'-' MINUS SIGN? +5072 fcc1 27 f8 BEQ L907C YES +5073 fcc3 81 2b CMPA #'+' PLUS SIGN? +5074 fcc5 27 f4 BEQ L907C YES +5075 fcc7 91 00 CMPA $'$' DOLLAR SIGN? +5076 fcc9 27 f0 BEQ L907C YES +5077 fccb 81 30 CMPA #'0' ZERO? +5078 fccd 26 0e BNE L909E NO - ERROR +5079 fccf a6 01 LDA $01,X GET CHARACTER FOLLOWING ZERO +5080 fcd1 8d 16 BSR L90AA CLEAR CARRY IF NUMERIC +5081 fcd3 25 08 BLO L909E BRANCH IF NOT A NUMERIC CHARACTER - ERROR +5082 fcd5 35 02 L9096 PULS A * PULL A CHARACTER OFF OF THE STACK +5083 fcd7 a7 82 STA ,-X * AND PUT IT BACK IN THE STRING BUFFER +5084 fcd9 26 fa BNE L9096 * KEEP GOING UNTIL ZERO FLAG +5085 fcdb 20 c7 BRA L9065 KEEP CLEANING UP THE INPUT BUFFER +5086 fcdd 35 02 L909E PULS A +5087 fcdf 4d TSTA * THE STACK AND EXIT WHEN +5088 fce0 26 fb BNE L909E * ZERO FLAG FOUND +5089 fce2 9e 0f LDX TEMPTR GET THE STRING BUFFER START POINTER +5090 fce4 86 25 LDA #'%' * PUT A % SIGN BEFORE THE ERROR POSITION TO +5091 fce6 a7 82 STA ,-X * INDICATE AN ERROR +5092 fce8 39 L90A9 RTS +5093 * +5094 * CLEAR CARRY IF NUMERIC +5095 fce9 81 30 L90AA CMPA #'0' ASCII ZERO +5096 fceb 25 04 BLO L90B2 RETURN IF ACCA < ASCII 0 +5097 fced 80 3a SUBA #$3A * #'9'+1 +5098 fcef 80 c6 SUBA #$C6 * #-('9'+1) CARRY CLEAR IF NUMERIC +5099 fcf1 39 L90B2 RTS +5100 * +5101 * PROCESS AN ITEM-LIST WHICH IS < 100,000,000 +5102 fcf2 96 98 L90B3 LDA VD8 GET RIGHT DIGIT COUNTER +5103 fcf4 27 01 BEQ L90B8 BRANCH IF NO FORMATTED DIGITS TO THE RIGHT OF DECIMAL PT +5104 fcf6 4a DECA SUBTRACT ONE FOR DECIMAL POINT +5105 fcf7 9b 47 L90B8 ADDA V47 *ADD THE BASE 10 EXPONENT OFFSET - ACCA CONTAINS THE +5106 * *NUMBER OF SHIFTS REQUIRED TO ADJUST FPA0 TO THE SPECIFIED +5107 * *NUMBER OF DlGITS TO THE RIGHT OF THE DECIMAL POINT +5108 fcf9 2b 01 BMI L90BD IF ACCA >= 0 THEN NO SHIFTS ARE REQUIRED +5109 fcfb 4f CLRA FORCE SHIFT COUNTER = 0 +5110 fcfc 34 02 L90BD PSHS A SAVE INITIAL SHIFT COUNTER ON THE STACK +5111 fcfe 2a 0a L90BF BPL L90CB EXIT ROUTINE IF POSITIVE +5112 fd00 34 02 PSHS A SAVE SHIFT COUNTER ON STACK +5113 fd02 bd ed cb JSR LBB82 DIVIDE FPA0 BY 10 - SHIFT ONE DIGIT TO RIGHT +5114 fd05 35 02 PULS A GET SHIFT COUNTER FROM THE STACK +5115 fd07 4c INCA BUMP SHIFT COUNTER UP BY ONE +5116 fd08 20 f4 BRA L90BF CHECK FOR FURTHER DIVISION +5117 fd0a 96 47 L90CB LDA V47 * GET BASE 10 EXPONENT OFFSET, ADD INITIAL SHIFT COUNTER +5118 fd0c a0 e0 SUBA ,S+ * AND SAVE NEW BASE 10 EXPONENT OFFSET - BECAUSE +5119 fd0e 97 47 STA V47 * FPA0 WAS SHIFTED ABOVE +5120 fd10 8b 09 ADDA #$09 * ADD NINE (SIGNIFICANT PLACES) AND BRANCH IF THERE ARE NO +5121 fd12 2b 19 BMI L90EE * ZEROES TO THE LEFT OF THE DECIMAL POINT IN THIS PRINT ITEM +5122 fd14 96 99 LDA VD9 *DETERMINE HOW MANY FILLER ZEROES TO THE LEFT OF THE DECIMAL +5123 fd16 80 09 SUBA #$09 *POINT. GET THE NUMBER OF FORMAT PLACES TO LEFT OF DECIMAL +5124 fd18 90 47 SUBA V47 *POINT, SUBTRACT THE BASE 10 EXPONENT OFFSET AND THE CONSTANT 9 +5125 fd1a 8d 0d BSR L90EA *(UNNORMALIZATION)-THEN OUTPUT THAT MANY ZEROES TO THE BUFFER +5126 fd1c bd fe a2 JSR L9263 INITIALIZE DECIMAL POINT AND COMMA COUNTERS +5127 fd1f 20 1d BRA L90FF PROCESS THE REMAINDER OF THE PRINT ITEM +5128 * +5129 * PUT (ACCA+1) ASCII ZEROES IN BUFFER +5130 fd21 34 02 L90E2 PSHS A SAVE ZERO COUNTER +5131 fd23 86 30 LDA #'0' * INSERT A ZERO INTO +5132 fd25 a7 c0 STA ,U+ * THE BUFFER +5133 fd27 35 02 PULS A RESTORE ZERO COUNTER +5134 +5135 * PUT ACCA ASCII ZEROES INTO THE BUFFER +5136 fd29 4a L90EA DECA DECREMENT ZERO COUNTER +5137 fd2a 2a f5 BPL L90E2 BRANCH IF NOT DONE +5138 fd2c 39 RTS +5139 +5140 fd2d 96 99 L90EE LDA VD9 * GET THE LEFT DIGIT COUNTER AND PUT +5141 fd2f 8d f8 BSR L90EA * THAT MANY ZEROES IN THE STRiNG BUFFER +5142 fd31 bd fe 8c JSR L924D PUT THE DECIMAL POINT IN THE STRING BUFFER +5143 fd34 86 f7 LDA #-9 *DETERMINE HOW MANY FILLER ZEROES BETWEEN THE DECIMAL POINT +5144 fd36 90 47 SUBA V47 *AND SIGNIFICANT DATA. SUBTRACT BASE 10 EXPONENT FROM -9 +5145 fd38 8d ef BSR L90EA *(UNNORMALIZATION) AND OUTPUT THAT MANY ZEROES TO BUFFER +5146 fd3a 0f 45 CLR V45 CLEAR THE DECIMAL POINT COUNTER - SUPPRESS THE DECIMAL POINT +5147 fd3c 0f 97 CLR VD7 CLEAR THE COMMA COUNTER - SUPPRESS COMMAS +5148 fd3e bd fe 41 L90FF JSR L9202 DECODE FPA0 INTO A DECIMAL ASCII STRING +5149 fd41 96 98 LDA VD8 GET THE RIGHT DIGIT COUNTER +5150 fd43 26 02 BNE L9108 BRANCH IF RIGHT DIGIT COUNTER <> 0 +5151 fd45 de 39 LDU VARPTR RESET BUFFER PTR TO THE DECIMAL POINT IF NO DIGITS TO RIGHT +5152 fd47 9b 47 L9108 ADDA V47 *ADD BASE 10 EXPONENT - A POSITIVE ACCA WILL CAUSE THAT MANY +5153 * *FILLER ZEROES TO BE OUTPUT TO THE RIGHT OF LAST SIGNIFICANT DATA +5154 * *SIGNIFICANT DATA +5155 fd49 16 ff 43 LBRA L9050 INSERT LEADING ASTERISKS, FLOATING DOLLAR SIGN, ETC +5156 * +5157 * FORCE THE NUMERIC OUTPUT FORMAT TO BE EXPONENTIAL FORMAT +5158 fd4c 96 4f L910D LDA FP0EXP * GET EXPONENT OF FPA0 AND +5159 fd4e 34 02 PSHS A * SAVE IT ON THE STACK +5160 fd50 27 03 BEQ L9116 BRANCH IF FPA0 = 0 +5161 fd52 bd fe 0c JSR L91CD *CONVERT FPA0 INTO A NUMBER WITH 9 SIGNIFICANT +5162 * *DIGITS TO THE LEFT OF THE DECIMAL POINT +5163 fd55 96 98 L9116 LDA VD8 GET THE RIGHT DIGIT COUNTER +5164 fd57 27 01 BEQ L911B BRANCH IF NO FORMATTED DIGITS TO THE RIGHT +5165 fd59 4a DECA SUBTRACT ONE FOR THE DECIMAL POINT +5166 fd5a 9b 99 L911B ADDA VD9 ADD TO THE LEFT DIGIT COUNTER +5167 fd5c 7f 01 f1 CLR STRBUF+3 CLEAR BUFFER BYTE AS TEMPORARY STORAGE LOCATION +5168 fd5f d6 9a LDB VDA * GET THE STATUS BYTE FOR A +5169 fd61 c4 04 ANDB #$04 * POST-BYTE FORCE; BRANCH IF +5170 fd63 26 03 BNE L9129 * A POST-BYTE FORCE +5171 fd65 73 01 f1 COM STRBUF+3 TOGGLE BUFFER BYTE TO -1 IF NO POST-BYTE FORCE +5172 fd68 bb 01 f1 L9129 ADDA STRBUF+3 SUBTRACT 1 IF NO POST BYTE FORCE +5173 fd6b 80 09 SUBA #$09 *SUBTRACT 9 (DUE TO THE CONVERSION TO 9 +5174 * *SIGNIFICANT DIGITS TO LEFT OF DECIMAL POINT) +5175 fd6d 34 02 PSHS A * SAVE SHIFT COUNTER ON THE STACK - ACCA CONTAINS THE NUMBER +5176 * OF SHIFTS REQUIRED TO ADJUST FPA0 FOR THE NUMBER OF +5177 * FORMATTED PLACES TO THE RIGHT OF THE DECIMAL POINT. +5178 fd6f 2a 0a L9130 BPL L913C NO MORE SHIFTS WHEN ACCA >= 0 +5179 fd71 34 02 PSHS A SAVE SHIFT COUNTER +5180 fd73 bd ed cb JSR LBB82 DIVIDE FPA0 BY 10 - SHIFT TO RIGHT ONE +5181 fd76 35 02 PULS A RESTORE THE SHIFT COUNTER +5182 fd78 4c INCA ADD 1 TO SHIFT COUNTER +5183 fd79 20 f4 BRA L9130 CHECK FOR FURTHER SHIFTING (DIVISION) +5184 fd7b a6 e4 L913C LDA ,S *GET THE INITIAL VALUE OF THE SHIFT COUNTER +5185 fd7d 2b 01 BMI L9141 *AND BRANCH IF SHIFTING HAS TAKEN PLACE +5186 fd7f 4f CLRA RESET ACCA IF NO SHIFTING HAS TAKEN PLACE +5187 fd80 40 L9141 NEGA *CALCULATE THE POSITION OF THE DECIMAL POINT BY +5188 fd81 9b 99 ADDA VD9 *NEGATING SHIFT COUNTER, ADDING THE LEFT DIGIT COUNTER +5189 fd83 4c INCA *PLUS ONE AND THE POST-BYTE POSlTION, IF USED +5190 fd84 bb 01 f1 ADDA STRBUF+3 * +5191 fd87 97 45 STA V45 SAVE DECIMAL POINT COUNTER +5192 fd89 0f 97 CLR VD7 CLEAR COMMA COUNTER - NO COMMAS INSERTED +5193 fd8b bd fe 41 JSR L9202 CONVERT FPA0 INTO ASCII DECIMAL STRING +5194 fd8e 35 02 PULS A * GET THE INITIAL VALUE OF SHIFT COUNTER AND +5195 fd90 bd fe c0 JSR L9281 * INSERT THAT MANY ZEROES INTO THE BUFFER +5196 fd93 96 98 LDA VD8 *GET THE RIGHT DIGIT COUNTER AND BRANCH +5197 fd95 26 02 BNE L915A *IF NOT ZERO +5198 fd97 33 5f LEAU $-01,U MOVE BUFFER POINTER BACK ONE +5199 +5200 * CALCULATE VALUE OF EXPONENT AND PUT IN STRING BUFFER +5201 fd99 e6 e0 L915A LDB ,S+ GET ORIGINAL EXPONENT OF FPA0 +5202 fd9b 27 09 BEQ L9167 BRANCH IF EXPONENT = 0 +5203 fd9d d6 47 LDB V47 GET BASE 10 EXPONENT +5204 fd9f cb 09 ADDB #$09 ADD 9 FOR 9 SIGNIFICANT DIGIT CONVERSION +5205 fda1 d0 99 SUBB VD9 SUBTRACT LEFT DIGIT COUNTER +5206 fda3 f0 01 f1 SUBB STRBUF+3 ADD ONE TO EXPONENT IF POST-SIGN FORCE +5207 fda6 86 2b L9167 LDA #'+' PLUS SIGN +5208 fda8 5d TSTB TEST EXPONENT +5209 fda9 2a 03 BPL L916F BRANCH IF POSITIVE EXPONENT +5210 fdab 86 2d LDA #'-' MINUS SIGN +5211 fdad 50 NEGB CONVERT EXPONENT TO POSITIVE NUMBER +5212 fdae a7 41 L916F STA $01,U PUT SIGN OF EXPONENT IN STRING BUFFER +5213 fdb0 86 45 LDA #'E' * PUT AN ‘E’ (EXPONENTIATION FLAG) IN +5214 fdb2 a7 c1 STA ,U++ * BUFFER AND SKIP OVER THE SIGN +5215 fdb4 86 2f LDA #$2F * WAS LDA #'0'-1 +5216 *CONVERT BINARY EXPONENT IN ACCB TO ASCII VALUE IN ACCA +5217 fdb6 4c L9177 INCA ADD ONE TO TENS DIGIT COUNTER +5218 fdb7 c0 0a SUBB #10 *SUBTRACT 10 FROM EXPONENT AND ADD ONE TO TENS +5219 fdb9 24 fb BCC L9177 * DIGIT IF NO CARRY. TENS DIGIT DONE IF THERE IS A CARRY +5220 fdbb cb 3a ADDB #$3A WAS ADDB #'9'+1 +5221 fdbd ed c1 STD ,U++ SAVE EXPONENT IN BUFFER +5222 fdbf 6f c4 CLR ,U CLEAR FINAL BYTE IN BUFFER - PRINT TERMINATOR +5223 fdc1 7e fc 93 JMP L9054 INSERT ASTERISK PADDING, FLOATING DOLLAR SIGN, ETC. +5224 +5225 * INSERT ASTERISK PADDING, FLOATING $ AND PRE-SIGN +5226 fdc4 8e 01 f2 L9185 LDX #STRBUF+4 POINT X TO START OF PRINT ITEM BUFFER +5227 fdc7 e6 84 LDB ,X * GET SIGN BYTE OF ITEM-LIST BUFFER +5228 fdc9 34 04 PSHS B * AND SAVE IT ON THE STACK +5229 fdcb 86 20 LDA #SPACE DEFAULT PAD WITH BLANKS +5230 fdcd d6 9a LDB VDA * GET STATUS BYTE AND CHECK FOR +5231 fdcf c5 20 BITB #$20 * ASTERISK LEFT PADDING +5232 fdd1 35 04 PULS B GET SIGN BYTE AGAIN +5233 fdd3 27 08 BEQ L919E BRANCH IF NO PADDING +5234 fdd5 86 2a LDA #'*' PAD WITH ASTERISK +5235 fdd7 c1 20 CMPB #SPACE WAS THE FIRST BYTE A BLANK (POSITIVE)? +5236 fdd9 26 02 BNE L919E NO +5237 fddb 1f 89 TFR A,B TRANSFER PAD CHARACTER TO ACCB +5238 fddd 34 04 L919E PSHS B SAVE FIRST CHARACTER ON STACK +5239 fddf a7 80 L91A0 STA ,X+ STORE PAD CHARACTER IN BUFFER +5240 fde1 e6 84 LDB ,X GET NEXT CHARACTER IN BUFFER +5241 fde3 27 10 BEQ L91B6 INSERT A ZERO IF END OF BUFFER +5242 fde5 c1 45 CMPB #'E' * CHECK FOR AN ‘E’ AND +5243 fde7 27 0c BEQ L91B6 * PUT A ZERO BEFORE IT +5244 fde9 c1 30 CMPB #'0' * REPLACE LEADING ZEROES WITH +5245 fdeb 27 f2 BEQ L91A0 * PAD CHARACTERS +5246 fded c1 2c CMPB #',' * REPLACE LEADING COMMAS +5247 fdef 27 ee BEQ L91A0 * WITH PAD CHARACTERS +5248 fdf1 c1 2e CMPB #'.' * CHECK FOR DECIMAL POINT +5249 fdf3 26 04 BNE L91BA * AND DON’T PUT A ZERO BEFORE IT +5250 fdf5 86 30 L91B6 LDA #'0' * REPLACE PREVIOUS CHARACTER +5251 fdf7 a7 82 STA ,-X * WITH A ZERO +5252 fdf9 96 9a L91BA LDA VDA * GET STATUS BYTE, CHECK +5253 fdfb 85 10 BITA #$10 * FOR FLOATING $ +5254 fdfd 27 04 BEQ L91C4 * BRANCH IF NO FLOATING $ +5255 fdff c6 24 LDB #'$' * STORE A $ IN +5256 fe01 e7 82 STB ,-X * BUFFER +5257 fe03 84 04 L91C4 ANDA #$04 CHECK PRE-SIGN FLAG +5258 fe05 35 04 PULS B GET SIGN CHARACTER +5259 fe07 26 02 BNE L91CC RETURN IF POST-SIGN REQUIRED +5260 fe09 e7 82 STB ,-X STORE FIRST CHARACTER +5261 fe0b 39 L91CC RTS +5262 * +5263 * CONVERT FPA0 INTO A NUMBER OF THE FORM - NNN,NNN,NNN X 10**M. +5264 * THE EXPONENT M WILL BE RETURNED IN V47 (BASE 10 EXPONENT). +5265 fe0c 34 40 L91CD PSHS U SAVE BUFFER POINTER +5266 fe0e 4f CLRA INITIAL EXPONENT OFFSET = 0 +5267 fe0f 97 47 L91D0 STA V47 SAVE EXPONENT OFFSET +5268 fe11 d6 4f LDB FP0EXP GET EXPONENT OF FPA0 +5269 fe13 c1 80 CMPB #$80 * COMPARE TO EXPONENT OF .5 +5270 fe15 22 11 BHI L91E9 * AND BRANCH IF FPA0 > = 1.0 +5271 +5272 * IF FPA0 < 1.0, MULTIPLY IT BY 1E+09 UNTIL IT IS >= 1 +5273 fe17 8e f0 09 LDX #LBDC0 POINT X TO FP NUMBER (1E+09) +5274 fe1a bd ed 13 JSR LBACA MULTIPLY FPA0 BY 1E+09 +5275 fe1d 96 47 LDA V47 GET EXPONENT OFFSET +5276 fe1f 80 09 SUBA #$09 SUBTRACT 9 (BECAUSE WE MULTIPLIED BY 1E+09 ABOVE) +5277 fe21 20 ec BRA L91D0 CHECK TO SEE IF > 1.0 +5278 fe23 bd ed cb L91E4 JSR LBB82 DIVIDE FPA0 BY 10 +5279 fe26 0c 47 INC V47 INCREMENT EXPONENT OFFSET +5280 fe28 8e f0 04 L91E9 LDX #LBDBB POINT X TO FP NUMBER (999,999,999) +5281 fe2b bd ee e9 JSR LBCA0 COMPARE FPA0 TO X +5282 fe2e 2e f3 BGT L91E4 BRANCH IF FPA0 > 999,999,999 +5283 fe30 8e ef ff L91F1 LDX #LBDB6 POINT X TO FP NUMBER (99,999,999.9) +5284 fe33 bd ee e9 JSR LBCA0 COMPARE FPA0 TO X +5285 fe36 2e 07 BGT L9200 RETURN IF 999,999,999 > FPA0 > 99,999,999.9 +5286 fe38 bd ed b3 JSR LBB6A MULTIPLY FPA0 BY 10 +5287 fe3b 0a 47 DEC V47 DECREMENT EXPONENT OFFSET +5288 fe3d 20 f1 BRA L91F1 KEEP UNNORMALIZING +5289 fe3f 35 c0 L9200 PULS U,PC RESTORE BUFFER POINTER AND RETURN +5290 * +5291 * CONVERT FPA0 INTO AN INTEGER, THEN DECODE IT +5292 * INTO A DECIMAL ASCII STRING IN THE BUFFER +5293 fe41 34 40 L9202 PSHS U SAVE BUFFER POINTER +5294 fe43 bd eb fd JSR LB9B4 ADD .5 TO FPA0 (ROUND OFF) +5295 fe46 bd ef 11 JSR LBCC8 CONVERT FPA0 TO INTEGER FORMAT +5296 fe49 35 40 PULS U RESTORE BUFFER POINTER +5297 * +5298 * CONVERT FPA0 INTO A DECIMAL ASCII STRING +5299 fe4b 8e f1 0e LDX #LBEC5 POINT X TO UNNORMALIZED POWERS OF 10 +5300 fe4e c6 80 LDB #$80 INITIALIZE DIGIT COUNTER TO 0 + $80. +5301 * BIT 7 SET IS USED TO INDICATE THAT THE POWER OF 10 MANTISSA +5302 * IS NEGATIVE. WHEN YOU ‘ADD’ A NEGATIVE MANTISSA, IT IS +5303 * THE SAME AS SUBTRACTING A POSITIVE ONE AND BIT 7 OF ACCB +5304 * IS HOW THIS ROUTINE KNOWS THAT A ‘SUBTRACTION’ IS OCCURRING. +5305 fe50 8d 36 L9211 BSR L9249 CHECK FOR COMMA INSERTION +5306 fe52 96 53 L9213 LDA FPA0+3 * ‘ADD’ A POWER OF 10 MANTISSA TO FPA0. +5307 fe54 ab 03 ADDA $03,X * IF THE MANTISSA IS NEGATIVE, A SUBTRACTION +5308 fe56 97 53 STA FPA0+3 * WILL BE WHAT REALLY TAKES PLACE. +5309 fe58 96 52 LDA FPA0+2 * +5310 fe5a a9 02 ADCA $02,X * +5311 fe5c 97 52 STA FPA0+2 * +5312 fe5e 96 51 LDA FPA0+1 * +5313 fe60 a9 01 ADCA $01,X * +5314 fe62 97 51 STA FPA0+1 * +5315 fe64 96 50 LDA FPA0 * +5316 fe66 a9 84 ADCA ,X * +5317 fe68 97 50 STA FPA0 * +5318 fe6a 5c INCB ADD ONE TO DIGIT COUNTER +5319 fe6b 56 RORB ROTATE CARRY INTO BIT 7 +5320 fe6c 59 ROLB * SET OVERFLOW FLAG - BRANCH IF CARRY SET AND +5321 fe6d 28 e3 BVC L9213 * ADDING MANTISSA OR CARRY CLEAR AND SUBTRACTING MANTISSA +5322 fe6f 24 03 BCC L9235 BRANCH IF SUBTRACTING MANTISSA +5323 fe71 c0 0b SUBB #10+1 WAS SUBB #10+1 +5324 fe73 50 NEGB * IF ADDING MANTISSA +5325 fe74 cb 2f L9235 ADDB #$2F WAS ADDB #'0'-1 +5326 fe76 30 04 LEAX $04,X MOVE TO NEXT POWER OF 10 MANTISSA +5327 fe78 1f 98 TFR B,A SAVE DIGIT IN ACCA +5328 fe7a 84 7f ANDA #$7F MASK OFF ADD/SUBTRACT FLAG (BIT 7) +5329 fe7c a7 c0 STA ,U+ STORE DIGIT IN BUFFER +5330 fe7e 53 COMB TOGGLE ADD/SUBTRACT FLAG +5331 fe7f c4 80 ANDB #$80 MASK OFF EVERYTHING BUT ADD/SUB FLAG +5332 fe81 8c f1 32 CMPX #LBEE9 COMPARE TO END OF UNNORMALIZED POWERS OF 10 +5333 fe84 26 ca BNE L9211 BRANCH IF NOT DONE +5334 fe86 6f c4 CLR ,U PUT A ZERO AT END OF INTEGER +5335 +5336 * DECREMENT DECIMAL POINT COUNTER AND CHECK FOR COMMA INSERTION +5337 fe88 0a 45 L9249 DEC V45 DECREMENT DECIMAL POINT COUNTER +5338 fe8a 26 09 BNE L9256 NOT TIME FOR DECIMAL POINT +5339 fe8c df 39 L924D STU VARPTR SAVE BUFFER POINTER-POSITION OF THE DECIMAL POINT +5340 fe8e 86 2e LDA #'.' * STORE A DECIMAL +5341 fe90 a7 c0 STA ,U+ * POINT IN THE OUTPUT BUFFER +5342 fe92 0f 97 CLR VD7 * CLEAR COMMA COUNTER - NOW IT WILL TAKE 255 +5343 * * DECREMENTS BEFORE ANOTHER COMMA WILL BE INSERTED +5344 fe94 39 RTS +5345 fe95 0a 97 L9256 DEC VD7 DECREMENT COMMA COUNTER +5346 fe97 26 08 BNE L9262 RETURN IF NOT TIME FOR COMMA +5347 fe99 86 03 LDA #$03 * RESET COMMA COUNTER TO 3; THREE +5348 fe9b 97 97 STA VD7 * DIGITS BETWEEN COMMAS +5349 fe9d 86 2c LDA #',' * PUT A COMMA INTO +5350 fe9f a7 c0 STA ,U+ * THE BUFFER +5351 fea1 39 L9262 RTS +5352 +5353 * INITIALIZE DECIMAL POINT AND COMMA COUNTERS +5354 fea2 96 47 L9263 LDA V47 GET THE BASE 10 EXPONENT OFFSET +5355 fea4 8b 0a ADDA #10 * ADD 10 (FPA0 WAS ‘NORMALIZED’ TO 9 PLACES LEFT +5356 fea6 97 45 STA V45 * OF DECIMAL POINT) - SAVE IN DECIMAL POINT COUNTER +5357 fea8 4c INCA ADD ONE FOR THE DECIMAL POINT +5358 fea9 80 03 L926A SUBA #$03 * DIVIDE DECIMAL POINT COUNTER BY 3; LEAVE +5359 feab 24 fc BCC L926A * THE REMAINDER IN ACCA +5360 fead 8b 05 ADDA #$05 CONVERT REMAINDER INTO A NUMBER FROM 1-3 +5361 feaf 97 97 STA VD7 SAVE COMMA COUNTER +5362 feb1 96 9a LDA VDA GET STATUS BYTE +5363 feb3 84 40 ANDA #$40 CHECK FOR COMMA FLAG +5364 feb5 26 02 BNE L927A BRANCH IF COMMA FLAG ACTIVE +5365 feb7 97 97 STA VD7 CLEAR COMMA COUNTER - 255 DIGITS OUTPUT BEFORE A COMMA +5366 feb9 39 L927A RTS +5367 * +5368 * INSERT ACCA ZEROES INTO THE BUFFER +5369 feba 34 02 L927B PSHS A SAVE ZEROES COUNTER +5370 febc 8d ca BSR L9249 CHECK FOR DECIMAL POINT +5371 febe 35 02 PULS A RESTORE ZEROES COUNTER +5372 fec0 4a L9281 DECA * DECREMENT ZEROES COUNTER AND +5373 fec1 2b 0a BMI L928E * RETURN IF < 0 +5374 fec3 34 02 PSHS A SAVE ZEROES COUNTER +5375 fec5 86 30 LDA #'0' * PUT A ZERO INTO +5376 fec7 a7 c0 STA ,U+ * THE BUFFER +5377 fec9 a6 e0 LDA ,S+ RESTORE THE ZEROES COUNTER +5378 fecb 26 ed BNE L927B BRANCH IF NOT DONE +5379 fecd 39 L928E RTS +5380 +5381 +5382 * LINE +5383 fece 81 89 LINE CMPA #TOK_INPUT ‘INPUT’ TOKEN +5384 fed0 10 27 f9 5c LBEQ L89C0 GO DO ‘LINE INPUT’ COMMAND +5385 fed4 7e e5 00 JMP LB277 ‘SYNTAX ERROR’ IF NOT "LINE INPUT" +5386 +5387 +5388 * END OF EXTENDED BASIC +5389 * INTERRUPT VECTORS +5390 fff0 ORG $FFF0 +5391 fff0 00 00 LBFF0 FDB $0000 RESERVED +5392 fff2 00 9b LBFF2 FDB SW3VEC SWI3 +5393 fff4 00 9e LBFF4 FDB SW2VEC SWI2 +5394 fff6 00 aa LBFF6 FDB FRQVEC FIRQ +5395 fff8 00 a7 LBFF8 FDB IRQVEC IRQ +5396 fffa 00 a1 LBFFA FDB SWIVEC SWI +5397 fffc 00 a4 LBFFC FDB NMIVEC NMI +5398 fffe db 46 LBFFE FDB RESVEC RESET diff --git a/ROMS/6809/ExBasROM.asm b/ROMS/6809/ExBasROM.asm new file mode 100644 index 0000000..b068b4b --- /dev/null +++ b/ROMS/6809/ExBasROM.asm @@ -0,0 +1,5398 @@ + +UART EQU $A000 +RECEV EQU UART+1 +TRANS EQU UART+1 +USTAT EQU UART +UCTRL EQU UART + +BS EQU 8 BACKSPACE +CR EQU $D ENTER KEY +ESC EQU $1B ESCAPE CODE +SPACE EQU $20 SPACE (BLANK) +STKBUF EQU 58 STACK BUFFER ROOM +LBUFMX EQU 250 MAX NUMBER OF CHARS IN A BASIC LINE +MAXLIN EQU $FA MAXIMUM MS BYTE OF LINE NUMBER +* PSEUDO OPS +SKP1 EQU $21 OP CODE OF BRN — SKIP ONE BYTE +SKP2 EQU $8C OP CODE OF CMPX # - SKIP TWO BYTES +SKP1LD EQU $86 OP CODE OF LDA # - SKIP THE NEXT BYTE +* AND LOAD THE VALUE OF THAT BYTE INTO ACCA — THIS +* IS USUALLY USED TO LOAD ACCA WITH A NON ZERO VALUE +RTS_LOW EQU $95 + ORG 0 +ENDFLG RMB 1 STOP/END FLAG: POSITIVE=STOP, NEG=END +CHARAC RMB 1 TERMINATOR FLAG 1 +ENDCHR RMB 1 TERMINATOR FLAG 2 +TMPLOC RMB 1 SCRATCH VARIABLE +IFCTR RMB 1 IF COUNTER - HOW MANY IF STATEMENTS IN A LINE +DIMFLG RMB 1 *DV* ARRAY FLAG 0=EVALUATE, 1=DIMENSIONING +VALTYP RMB 1 *DV* *PV TYPE FLAG: 0=NUMERIC, $FF=STRING +GARBFL RMB 1 *TV STRING SPACE HOUSEKEEPING FLAG +ARYDIS RMB 1 DISABLE ARRAY SEARCH: 00=ALLOW SEARCH +INPFLG RMB 1 *TV INPUT FLAG: READ=0, INPUT<>0 +RELFLG RMB 1 *TV RELATIONAL OPERATOR FLAG +TEMPPT RMB 2 *PV TEMPORARY STRING STACK POINTER +LASTPT RMB 2 *PV ADDR OF LAST USED STRING STACK ADDRESS +TEMPTR RMB 2 TEMPORARY POINTER +TMPTR1 RMB 2 TEMPORARY DESCRIPTOR STORAGE (STACK SEARCH) +FPA2 RMB 4 FLOATING POINT ACCUMULATOR #2 MANTISSA +BOTSTK RMB 2 BOTTOM OF STACK AT LAST CHECK +TXTTAB RMB 2 *PV BEGINNING OF BASIC PROGRAM +VARTAB RMB 2 *PV START OF VARIABLES +ARYTAB RMB 2 *PV START OF ARRAYS +ARYEND RMB 2 *PV END OF ARRAYS (+1) +FRETOP RMB 2 *PV START OF STRING STORAGE (TOP OF FREE RAM) +STRTAB RMB 2 *PV START OF STRING VARIABLES +FRESPC RMB 2 UTILITY STRING POINTER +MEMSIZ RMB 2 *PV TOP OF STRING SPACE +OLDTXT RMB 2 SAVED LINE NUMBER DURING A "STOP" +BINVAL RMB 2 BINARY VALUE OF A CONVERTED LINE NUMBER +OLDPTR RMB 2 SAVED INPUT PTR DURING A "STOP" +TINPTR RMB 2 TEMPORARY INPUT POINTER STORAGE +DATTXT RMB 2 *PV 'DATA' STATEMENT LINE NUMBER POINTER +DATPTR RMB 2 *PV 'DATA' STATEMENT ADDRESS POINTER +DATTMP RMB 2 DATA POINTER FOR 'INPUT' & 'READ' +VARNAM RMB 2 *TV TEMP STORAGE FOR A VARIABLE NAME +VARPTR RMB 2 *TV POINTER TO A VARIABLE DESCRIPTOR +VARDES RMB 2 TEMP POINTER TO A VARIABLE DESCRIPTOR +RELPTR RMB 2 POINTER TO RELATIONAL OPERATOR PROCESSING ROUTINE +TRELFL RMB 1 TEMPORARY RELATIONAL OPERATOR FLAG BYTE +* FLOATING POINT ACCUMULATORS #3,4 & 5 ARE MOSTLY +* USED AS SCRATCH PAD VARIABLES. +** FLOATING POINT ACCUMULATOR #3 :PACKED: ($40-$44) +V40 RMB 1 +V41 RMB 1 +V42 RMB 1 +V43 RMB 1 +V44 RMB 1 +** FLOATING POINT ACCUMULATOR #4 :PACKED: ($45-$49) +V45 RMB 1 +V46 RMB 1 +V47 RMB 1 +V48 RMB 2 +** FLOATING POINT ACCUMULATOR #5 :PACKED: ($4A—$4E) +V4A RMB 1 +V4B RMB 2 +V4D RMB 2 +** FLOATING POINT ACCUMULATOR #0 +FP0EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #0 EXPONENT +FPA0 RMB 4 *PV FLOATING POINT ACCUMULATOR #0 MANTISSA +FP0SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #0 SIGN +COEFCT RMB 1 POLYNOMIAL COEFFICIENT COUNTER +STRDES RMB 5 TEMPORARY STRING DESCRIPTOR +FPCARY RMB 1 FLOATING POINT CARRY BYTE +** FLOATING POINT ACCUMULATOR #1 +FP1EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #1 EXPONENT +FPA1 RMB 4 *PV FLOATING POINT ACCUMULATOR #1 MANTISSA +FP1SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #1 SIGN +RESSGN RMB 1 SIGN OF RESULT OF FLOATING POINT OPERATION +FPSBYT RMB 1 FLOATING POINT SUB BYTE (FIFTH BYTE) +COEFPT RMB 2 POLYNOMIAL COEFFICIENT POINTER +LSTTXT RMB 2 CURRENT LINE POINTER DURING LIST +CURLIN RMB 2 *PV CURRENT LINE # OF BASIC PROGRAM, $FFFF = DIRECT +DEVCFW RMB 1 *TV TAB FIELD WIDTH +DEVLCF RMB 1 *TV TAB ZONE +DEVPOS RMB 1 *TV PRINT POSITION +DEVWID RMB 1 *TV PRINT WIDTH +RSTFLG RMB 1 *PV WARM START FLAG: $55=WARM, OTHER=COLD +RSTVEC RMB 2 *PV WARM START VECTOR - JUMP ADDRESS FOR WARM START +TOPRAM RMB 2 *PV TOP OF RAM +IKEYIM RMB 1 *TV INKEY$ RAM IMAGE +ZERO RMB 2 *PV DUMMY - THESE TWO BYTES ARE ALWAYS ZERO +* THE FOLLOWING BYTES ARE MOVED DOWN FROM ROM +LPTCFW RMB 1 16 +LPTLCF RMB 1 112 +LPTWID RMB 1 132 +LPTPOS RMB 1 0 +EXECJP RMB 2 LB4AA + +* THIS ROUTINE PICKS UP THE NEXT INPUT CHARACTER FROM +* BASIC. THE ADDRESS OF THE NEXT BASIC BYTE TO BE +* INTERPRETED IS STORED AT CHARAD. +GETNCH INC 7372800 / 4 / 16 = 115200 + STA UCTRL + LDX #LA147-1 POINT X TO COLOR BASIC COPYRIGHT MESSAGE + JSR LB99C PRINT ‘COLOR BASIC’ + LDX #BAWMST WARM START ADDRESS + STX RSTVEC SAVE IT + LDA #$55 WARM START FLAG + STA RSTFLG SAVE IT + BRA LA0F3 GO TO BASIC’S MAIN LOOP +BAWMST NOP NOP REQ’D FOR WARM START + JSR LAD33 DO PART OF A NEW +LA0F3 JMP LAC73 GO TO MAIN LOOP OF BASIC +* +* FIRQ SERVICE ROUTINE +BFRQSV + RTI +* +* THESE BYTES ARE MOVED TO ADDRESSES $76 - $85 THE DIRECT PAGE +LA10D FCB 16 TAB FIELD WIDTH + FCB 64 LAST TAB ZONE + FCB 80 PRINTER WIDTH + FCB 0 LINE PRINTER POSITION + FDB LB44A ARGUMENT OF EXEC COMMAND - SET TO ‘FC’ ERROR +* LINE INPUT ROUTINE + INC CHARAD+1 + BNE LA123 + INC CHARAD +LA123 LDA >0000 + JMP BROMHK +* +* THESE BYTES ARE MOVED TO ADDRESSES $A7-$B1 + JMP BIRQSV IRQ SERVICE + JMP BFRQSV FIRQ SERVICE + JMP LB44A USR ADDRESS FOR 8K BASIC (INITIALIZED TO ‘FC’ ERROR) + FCB $80 *RANDOM SEED + FDB $4FC7 *RANDON SEED OF MANTISSA + FDB $5259 *.811635157 +* BASIC COMMAND INTERPRETATION TABLE ROM IMAGE +COMVEC FCB 50 50 BASIC COMMANDS + FDB LAA66 POINTS TO RESERVED WORDS + FDB LAB67 POINTS TO JUMP TABLE FOR COMMANDS + FCB 29 29 BASIC SECONDARY COMMANDS + FDB LAB1A POINTS TO SECONDARY FUNCTION RESERVED WORDS + FDB LAA29 POINTS TO SECONDARY FUNCTION JUMP TABLE + FDB 0 NO MORE TABLES (RES WORDS=0) + FDB 0 NO MORE TABLES + FDB 0 NO MORE TABLES + FDB 0 NO MORE TABLES + FDB 0 NO MORE TABLES + FDB 0 NO MORE TABLES (SECONDARY FNS =0) + +* COPYRIGHT MESSAGES +LA147 FCC "6809 EXTENDED BASIC" + FCB CR + FCC "(C) 1982 BY MICROSOFT" +LA156 FCB CR,CR +LA165 FCB $00 + + +LA35F PSHS X,B,A SAVE REGISTERS + LDX LPTCFW TAB FIELD WIDTH AND TAB ZONE + LDD LPTWID PRINTER WIDTH AND POSITION +LA37C STX DEVCFW SAVE TAB FIELD WIDTH AND ZONE + STB DEVPOS SAVE PRINT POSITION + STA DEVWID SAVE PRINT WIDTH + PULS A,B,X,PC RESTORE REGISTERS + +* THIS IS THE ROUTINE THAT GETS AN INPUT LINE FOR BASIC +* EXIT WITH BREAK KEY: CARRY = 1 +* EXIT WITH ENTER KEY: CARRY = 0 +LA38D +LA390 CLR IKEYIM RESET BREAK CHECK KEY TEMP KEY STORAGE + LDX #LINBUF+1 INPUT LINE BUFFER + LDB #1 ACCB CHAR COUNTER: SET TO 1 TO ALLOW A +* BACKSPACE AS FIRST CHARACTER +LA39A JSR LA171 GO GET A CHARACTER FROM CONSOLE IN + CMPA #BS BACKSPACE + BNE LA3B4 NO + DECB YES - DECREMENT CHAR COUNTER + BEQ LA390 BRANCH IF BACK AT START OF LINE AGAIN + LEAX -1,X DECREMENT BUFFER POINTER + BRA LA3E8 ECHO CHAR TO SCREEN +LA3B4 CMPA #$15 SHIFT RIGHT ARROW? + BNE LA3C2 NO +* YES, RESET BUFFER TO BEGINNING AND ERASE CURRENT LINE +LA3B8 DECB DEC CHAR CTR + BEQ LA390 GO BACK TO START IF CHAR CTR = 0 + LDA #BS BACKSPACE? + JSR PUTCHR SEND TO CONSOLE OUT (SCREEN) + BRA LA3B8 KEEP GOING +LA3C2 CMPA #3 BREAK KEY? + ORCC #1 SET CARRY FLAG + BEQ LA3CD BRANCH IF BREAK KEY DOWN +LA3C8 CMPA #CR ENTER KEY? + BNE LA3D9 NO +LA3CC CLRA CLEAR CARRY FLAG IF ENTER KEY - END LINE ENTRY +LA3CD PSHS CC SAVE CARRY FLAG + JSR LB958 SEND CR TO SCREEN + CLR ,X MAKE LAST BYTE IN INPUT BUFFER = 0 + LDX #LINBUF RESET INPUT BUFFER POINTER + PULS CC,PC RESTORE CARRY FLAG + +* INSERT A CHARACTER INTO THE BASIC LINE INPUT BUFFER +LA3D9 CMPA #$20 IS IT CONTROL CHAR? + BLO LA39A BRANCH IF CONTROL CHARACTER + CMPA #'z+1 * + BCC LA39A * IGNORE IF > LOWER CASE Z + CMPB #LBUFMX HAVE 250 OR MORE CHARACTERS BEEN ENTERED? + BCC LA39A YES, IGNORE ANY MORE + STA ,X+ PUT IT IN INPUT BUFFER + INCB INCREMENT CHARACTER COUNTER +LA3E8 JSR PUTCHR ECHO IT TO SCREEN + BRA LA39A GO SET SOME MORE + + +* EXEC +EXEC BEQ LA545 BRANCH IF NO ARGUMENT + JSR LB73D EVALUATE ARGUMENT - ARGUMENT RETURNED IN X + STX EXECJP STORE X TO EXEC JUMP ADDRESS +LA545 JMP [EXECJP] GO DO IT + +* BREAK CHECK +LA549 JMP LADEB GO DO BREAK KEY CHECK + +* INKEY$ +INKEY LDA IKEYIM WAS A KEY DOWN IN THE BREAK CHECK? + BNE LA56B YES + JSR KEYIN GO GET A KEY +LA56B CLR IKEYIM CLEAR INKEY RAM IMAGE + STA FPA0+3 STORE THE KEY IN FPA0 + LBNE LB68F CONVERT FPA0+3 TO A STRING + STA STRDES SET LENGTH OF STRING = 0 IF NO KEY DOWN + JMP LB69B PUT A NULL STRING ONTO THE STRING STACK + +* MOVE ACCB BYTES FROM (X) TO (U) +LA59A LDA ,X+ GET BYTE FROM X + STA ,U+ STORE IT AT U + DECB MOVED ALL BYTES? + BNE LA59A NO +LA5A1 RTS + +LA5C4 RTS + +** THIS ROUTINE WILL SCAN OFF THE FILE NAME FROM A BASIC LINE +** AND RETURN A SYNTAX ERROR IF THERE ARE ANY CHARACTERS +** FOLLOWING THE END OF THE NAME +LA5C7 JSR GETCCH GET CURRENT INPUT CHAR FROM BASIC LINE +LA5C9 BEQ LA5C4 RETURN IF END OF LINE + JMP LB277 SYNTAX ERROR IF ANY MORE CHARACTERS +* IRQ SERVICE +BIRQSV +LA9C5 RTI RETURN FROM INTERRUPT + +* SET CARRY IF NUMERIC - RETURN WITH +* ZERO FLAG SET IF ACCA = 0 OR 3A(:) - END +* OF BASIC LINE OR SUB LINE +BROMHK CMPA #'9+1 IS THIS CHARACTER >=(ASCII 9)+1? + BHS LAA28 BRANCH IF > 9; Z SET IF = COLON + CMPA #SPACE SPACE? + BNE LAA24 NO - SET CARRY IF NUMERIC + JMP GETNCH IF SPACE, GET NECT CHAR (IGNORE SPACES) +LAA24 SUBA #'0 * SET CARRY IF + SUBA #-'0 * CHARACTER > ASCII 0 +LAA28 RTS + +* DISPATCH TABLE FOR SECONDARY FUNCTIONS +* TOKENS ARE PRECEEDED BY $FF +* FIRST SET ALWAYS HAS ONE PARAMETER +FUNC_TAB +LAA29 FDB SGN SGN + FDB INT INT + FDB ABS ABS + FDB USRJMP USR +TOK_USR EQU *-FUNC_TAB/2+$7F +TOK_FF_USR EQU *-FUNC_TAB/2+$FF7F + FDB RND RND + FDB SIN SIN + FDB PEEK PEEK + FDB LEN LEN + FDB STR STR$ + FDB VAL VAL + FDB ASC ASC + FDB CHR CHR$ + FDB ATN ATN + FDB COS COS + FDB TAN TAN + FDB EXP EXP + FDB FIX FIX + FDB LOG LOG + FDB POS POS + FDB SQR SQR + FDB HEXDOL HEX$ +* LEFT, RIGHT AND MID ARE TREATED SEPARATELY + FDB LEFT LEFT$ +TOK_LEFT EQU *-FUNC_TAB/2+$7F + FDB RIGHT RIGHT$ + FDB MID MID$ +TOK_MID EQU *-FUNC_TAB/2+$7F +* REMAINING FUNCTIONS + FDB INKEY INKEY$ +TOK_INKEY EQU *-FUNC_TAB/2+$7F + FDB MEM MEM + FDB VARPT VARPTR + FDB INSTR INSTR + FDB STRING STRING$ +NUM_SEC_FNS EQU *-FUNC_TAB/2 + +* THIS TABLE CONTAINS PRECEDENCES AND DISPATCH ADDRESSES FOR ARITHMETIC +* AND LOGICAL OPERATORS - THE NEGATION OPERATORS DO NOT ACT ON TWO OPERANDS +* S0 THEY ARE NOT LISTED IN THIS TABLE. THEY ARE TREATED SEPARATELY IN THE +* EXPRESSION EVALUATION ROUTINE. THEY ARE: +* UNARY NEGATION (-), PRECEDENCE &7D AND LOGICAL NEGATION (NOT), PRECEDENCE $5A +* THE RELATIONAL OPERATORS < > = ARE ALSO NOT LISTED, PRECEDENCE $64. +* A PRECEDENCE VALUE OF ZERO INDICATES END OF EXPRESSION OR PARENTHESES +* +LAA51 FCB $79 + FDB LB9C5 + + FCB $79 + FDB LB9BC - + FCB $7B + FDB LBACC * + FCB $7B + FDB LBB91 / + FCB $7F + FDB L8489 EXPONENTIATION + FCB $50 + FDB LB2D5 AND + FCB $46 + FDB LB2D4 OR + +* THIS IS THE RESERVED WORD TABLE +* FIRST PART OF THE TABLE CONTAINS EXECUTABLE COMMANDS +LAA66 FCC "FO" 80 + FCB $80+'R' + FCC "G" 81 + FCB $80+'O' +TOK_GO EQU $81 + FCC "RE" 82 + FCB $80+'M' + FCB ''+$80 83 + FCC "ELS" 84 + FCB $80+'E' + FCC "I" 85 + FCB $80+'F' + FCC "DAT" 86 + FCB $80+'A' + FCC "PRIN" 87 + FCB $80+'T' + FCC "O" 88 + FCB $80+'N' + FCC "INPU" 89 + FCB $80+'T' + FCC "EN" 8A + FCB $80+'D' + FCC "NEX" 8B + FCB $80+'T' + FCC "DI" 8C + FCB $80+'M' + FCC "REA" 8D + FCB $80+'D' + FCC "RU" 8E + FCB $80+'N' + FCC "RESTOR" 8F + FCB $80+'E' + FCC "RETUR" 90 + FCB $80+'N' + FCC "STO" 91 + FCB $80+'P' + FCC "POK" 92 + FCB $80+'E' + FCC "CON" 93 + FCB $80+'T' + FCC "LIS" 94 + FCB $80+'T' + FCC "CLEA" 95 + FCB $80+'R' + FCC "NE" 96 + FCB $80+'W' + FCC "EXE" 97 + FCB $80+'C' + FCC "TRO" 98 + FCB $80+'N' + FCC "TROF" 99 + FCB $80+'F' + FCC "DE" 9A + FCB $80+'L' + FCC "DE" 9B + FCB $80+'F' + FCC "LIN" 9C + FCB $80+'E' + FCC "RENU" 9D + FCB $80+'M' + FCC "EDI" 9E + FCB $80+'T' +* END OF EXECUTABLE COMMANDS. THE REMAINDER OF THE TABLE ARE NON-EXECUTABLE TOKENS + FCC "TAB" 9F + FCB $80+'(' +TOK_TAB EQU $9F + FCC "T" A0 + FCB $80+'O' +TOK_TO EQU $A0 + FCC "SU" A1 + FCB $80+'B' +TOK_SUB EQU $A1 + FCC "THE" A2 + FCB $80+'N' +TOK_THEN EQU $A2 + FCC "NO" A3 + FCB $80+'T' +TOK_NOT EQU $A3 + FCC "STE" A4 + FCB $80+'P' +TOK_STEP EQU $A4 + FCC "OF" A5 + FCB $80+'F' + FCB '++$80 A6 +TOK_PLUS EQU $A6 + FCB '-+$80 A7 +TOK_MINUS EQU $A7 + FCB '*+$80 A8 + FCB '/+$80 A9 + FCB '^+$80 AA + FCC "AN" AB + FCB $80+'D' + FCC "O" AC + FCB $80+'R' + FCB '>+$80 AD +TOK_GREATER EQU $AD + FCB '=+$80 AE +TOK_EQUALS EQU $AE + FCB '<+$80 AF + FCC "F" B0 + FCB $80+'N' +TOK_FN EQU $B0 + FCC "USIN" B1 + FCB $80+'G' +TOK_USING EQU $B1 +* + +* FIRST SET ALWAYS HAS ONE PARAMETER +LAB1A FCC "SG" 80 + FCB $80+'N' + FCC "IN" 81 + FCB $80+'T' + FCC "AB" 82 + FCB $80+'S' + FCC "US" 83 + FCB $80+'R' + FCC "RN" 84 + FCB $80+'D' + FCC "SI" 85 + FCB $80+'N' + FCC "PEE" 86 + FCB $80+'K' + FCC "LE" 87 + FCB $80+'N' + FCC "STR" 88 + FCB $80+'$' + FCC "VA" 89 + FCB $80+'L' + FCC "AS" 8A + FCB $80+'C' + FCC "CHR" 8B + FCB $80+'$' + FCC "AT" 8C + FCB $80+'N' + FCC "CO" 8D + FCB $80+'S' + FCC "TA" 8E + FCB $80+'N' + FCC "EX" 8F + FCB $80+'P' + FCC "FI" 90 + FCB $80+'X' + FCC "LO" 91 + FCB $80+'G' + FCC "PO" 92 + FCB $80+'S' + FCC "SQ" 93 + FCB $80+'R' + FCC "HEX" 94 + FCB $80+'$' +* LEFT, RIGHT AND MID ARE TREATED SEPARATELY + FCC "LEFT" 95 + FCB $80+'$' + FCC "RIGHT" 96 + FCB $80+'$' + FCC "MID" 97 + FCB $80+'$' +* REMAINING FUNCTIONS + FCC "INKEY" 98 + FCB $80+'$' + FCC "ME" 99 + FCB $80+'M' + FCC "VARPT" 9A + FCB $80+'R' + FCC "INST" 9B + FCB $80+'R' + FCC "STRING" 9C + FCB $80+'$' + +* +* DISPATCH TABLE FOR COMMANDS TOKEN # +CMD_TAB +LAB67 FDB FOR 80 + FDB GO 81 + FDB REM 82 +TOK_REM EQU *-CMD_TAB/2+$7F + FDB REM 83 (') +TOK_SNGL_Q EQU *-CMD_TAB/2+$7F + FDB REM 84 (ELSE) +TOK_ELSE EQU *-CMD_TAB/2+$7F + FDB IF 85 +TOK_IF EQU *-CMD_TAB/2+$7F + FDB DATA 86 +TOK_DATA EQU *-CMD_TAB/2+$7F + FDB PRINT 87 +TOK_PRINT EQU *-CMD_TAB/2+$7F + FDB ON 88 + FDB INPUT 89 +TOK_INPUT EQU *-CMD_TAB/2+$7F + FDB END 8A + FDB NEXT 8B + FDB DIM 8C + FDB READ 8D + FDB RUN 8E + FDB RESTOR 8F + FDB RETURN 90 + FDB STOP 91 + FDB POKE 92 + FDB CONT 93 + FDB LIST 94 + FDB CLEAR 95 + FDB NEW 96 + FDB EXEC 97 + FDB TRON 98 + FDB TROFF 99 + FDB DEL 9A + FDB DEF 9B + FDB LINE 9C + FDB RENUM 9D + FDB EDIT 9E +TOK_HIGH_EXEC EQU *-CMD_TAB/2+$7F + +* ERROR MESSAGES AND THEIR NUMBERS AS USED INTERNALLY +LABAF FCC "NF" 0 NEXT WITHOUT FOR + FCC "SN" 1 SYNTAX ERROR + FCC "RG" 2 RETURN WITHOUT GOSUB + FCC "OD" 3 OUT OF DATA + FCC "FC" 4 ILLEGAL FUNCTION CALL + FCC "OV" 5 OVERFLOW + FCC "OM" 6 OUT OF MEMORY + FCC "UL" 7 UNDEFINED LINE NUMBER + FCC "BS" 8 BAD SUBSCRIPT + FCC "DD" 9 REDIMENSIONED ARRAY + FCC "/0" 10 DIVISION BY ZERO + FCC "ID" 11 ILLEGAL DIRECT STATEMENT + FCC "TM" 12 TYPE MISMATCH + FCC "OS" 13 OUT OF STRING SPACE + FCC "LS" 14 STRING TOO LONG + FCC "ST" 15 STRING FORMULA TOO COMPLEX + FCC "CN" 16 CAN'T CONTINUE + FCC "FD" 17 BAD FILE DATA + FCC "AO" 18 FILE ALREADY OPEN + FCC "DN" 19 DEVICE NUMBER ERROR + FCC "IO" 20 I/O ERROR + FCC "FM" 21 BAD FILE MODE + FCC "NO" 22 FILE NOT OPEN + FCC "IE" 23 INPUT PAST END OF FILE + FCC "DS" 24 DIRECT STATEMENT IN FILE +* ADDITIONAL ERROR MESSAGES ADDED BY EXTENDED BASIC +L890B FCC "UF" 25 UNDEFINED FUNCTION (FN) CALL +L890D FCC "NE" 26 FILE NOT FOUND + +LABE1 FCC " ERROR" + FCB $00 +LABE8 FCC " IN " + FCB $00 +LABED FCB CR +LABEE FCC "OK" + FCB CR,$00 +LABF2 FCB CR + FCC "BREAK" + FCB $00 + +* SEARCH THE STACK FOR ‘GOSUB/RETURN’ OR ‘FOR/NEXT’ DATA. +* THE ‘FOR/NEXT’ INDEX VARIABLE DESCRIPTOR ADDRESS BEING +* SOUGHT IS STORED IN VARDES. EACH BLOCK OF FOR/NEXT DATA IS 18 +* BYTES WITH A $80 LEADER BYTE AND THE GOSUB/RETURN DATA IS 5 BYTES +* WITH AN $A6 LEADER BYTE. THE FIRST NON "FOR/NEXT" DATA +* IS CONSIDERED ‘GOSUB/RETURN’ +LABF9 LEAX 4,S POINT X TO 3RD ADDRESS ON STACK - IGNORE THE +* FIRST TWO RETURN ADDRESSES ON THE STACK +LABFB LDB #18 18 BYTES SAVED ON STACK FOR EACH ‘FOR’ LOOP + STX TEMPTR SAVE POINTER + LDA ,X GET 1ST BYTE + SUBA #$80 * CHECK FOR TYPE OF STACK JUMP FOUND + BNE LAC1A * BRANCH IF NOT ‘FOR/NEXT’ + LDX 1,X = GET INDEX VARIABLE DESCRIPTOR + STX TMPTR1 = POINTER AND SAVE IT IN TMPTR1 + LDX VARDES GET INDEX VARIABLE BEING SEARCHED FOR + BEQ LAC16 BRANCH IF DEFAULT INDEX VARIABLE - USE THE +* FIRST ‘FOR/NEXT’ DATA FOUND ON STACK +* IF NO INDEX VARIABLE AFTER ‘NEXT’ + CMPX TMPTR1 DOES THE STACK INDEX MATCH THE ONE +* BEING SEARCHED FOR? + BEQ LAC1A YES + LDX TEMPTR * RESTORE INITIAL POINTER, ADD + ABX * 18 TO IT AND LOOK FOR + BRA LABFB * NEXT BLOCK OF DATA +LAC16 LDX TMPTR1 = GET 1ST INDEX VARIABLE FOUND AND + STX VARDES = SAVE AS ‘NEXT’ INDEX +LAC1A LDX TEMPTR POINT X TO START OF ‘FOR/NEXT’ DATA + TSTA SET ZERO FLAG IF ‘FOR/NEXT’ DATA + RTS +* CHECK FOR MEMORY SPACE FOR NEW TOP OF +* ARRAYS AND MOVE ARRAYS TO NEW LOCATION +LAC1E BSR LAC37 ACCD = NEW BOTTOM OF FREE RAM - IS THERE +* ROOM FOR THE STACK? +* MOVE BYTES FROM V43(X) TO V41(U) UNTIL (X) = V47 AND +* SAVE FINAL VALUE OF U IN V45 +LAC20 LDU V41 POINT U TO DESTINATION ADDRESS (V41) + LEAU 1,U ADD ONE TO U - COMPENSATE FOR FIRST PSHU + LDX V43 POINT X TO SOURCE ADDRESS (V43) + LEAX 1,X ADD ONE - COMPENSATE FOR FIRST LDA ,X +LAC28 LDA ,-X GRAB A BYTE FROM SOURCE + PSHU A MOVE IT TO DESTINATION + CMPX V47 DONE? + BNE LAC28 NO - KEEP MOVING BYTES + STU V45 SAVE FINAL DESTINATION ADDRESS +LAC32 RTS +* CHECK TO SEE IF THERE IS ROOM TO STORE 2*ACCB +* BYTES IN FREE RAM - OM ERROR IF NOT +LAC33 CLRA * ACCD CONTAINS NUMBER OF EXTRA + ASLB * BYTES TO PUT ON STACK + ADDD ARYEND END OF PROGRAM AND VARIABLES +LAC37 ADDD #STKBUF ADD STACK BUFFER - ROOM FOR STACK? + BCS LAC44 BRANCH IF GREATER THAN $FFFF + STS BOTSTK CURRENT NEW BOTTOM OF STACK STACK POINTER + CMPD BOTSTK ARE WE GOING TO BE BELOW STACK? + BCS LAC32 YES - NO ERROR +LAC44 LDB #6*2 OUT OF MEMORY ERROR + +* ERROR SERVICING ROUTINE +LAC46 JSR LAD33 RESET STACK, STRING STACK, CONTINUE POINTER + JSR LB95C SEND A CR TO SCREEN + JSR LB9AF SEND A ‘?‘ TO SCREEN + LDX #LABAF POINT TO ERROR TABLE +LAC60 ABX ADD MESSAGE NUMBER OFFSET + BSR LACA0 * GET TWO CHARACTERS FROM X AND + BSR LACA0 * SEND TO CONSOLE OUT (SCREEN) + LDX #LABE1-1 POINT TO "ERROR" MESSAGE +LAC68 JSR LB99C PRINT MESSAGE POINTED TO BY X + LDA CURLIN GET CURRENT LINE NUMBER (CURL IN) + INCA TEST FOR DIRECT MODE + BEQ LAC73 BRANCH IF DIRECT MODE + JSR LBDC5 PRINT ‘IN ****‘ + +* THIS IS THE MAIN LOOP OF BASIC WHEN IN DIRECT MODE +LAC73 JSR LB95C MOVE CURSOR TO START OF LINE + LDX #LABED POINT X TO ‘OK’, CR MESSAGE + JSR LB99C PRINT ‘OK’, CR +LAC7C JSR LA390 GO GET AN INPUT LINE + LDU #$FFFF THE LINE NUMBER FOR DIRECT MODE IS $FFFF + STU CURLIN SAVE IT IN CURLIN + BCS LAC7C BRANCH IF LINE INPUT TERMINATED BY BREAK + STX CHARAD SAVE (X) AS CURRENT INPUT POINTER - THIS WILL +* ENABLE THE ‘LIVE KEYBOARD’ (DIRECT) MODE. THE +* LINE JUST ENTERED WILL BE INTERPRETED + JSR GETNCH GET NEXT CHARACTER FROM BASIC + BEQ LAC7C NO LINE INPUT - GET ANOTHER LINE + BCS LACA5 BRANCH IF NUMER1C - THERE WAS A LINE NUMBER BEFORE +* THE STATEMENT ENTERED, SO THIS STATEMENT +* WILL BE MERGED INTO THE BASIC PROGRAM + JSR LB821 GO CRUNCH LINE + JMP LADC0 GO EXECUTE THE STATEMENT (LIVE KEYBOARD) +* +LACA0 LDA ,X+ GET A CHARACTER + JMP LB9B1 SEND TO CONSOLE OUT +* TAKE A LINE FROM THE LINE INPUT BUFFER +* AND INSERT IT INTO THE BASIC PROGRAM +LACA5 JSR LAF67 CONVERT LINE NUMBER TO BINARY +LACA8 LDX BINVAL GET CONVERTED LINE NUMBER + STX LINHDR STORE IT IN LINE INPUT HEADER + JSR LB821 GO CRUNCH THE LINE + STB TMPLOC SAVE LINE LENGTH + BSR LAD01 FIND OUT WHERE TO INSERT LINE + BCS LACC8 BRANCH IF LINE NUMBER DOES NOT ALREADY EXIST + LDD V47 GET ABSOLUTE ADDRESS OF LINE NUMBER + SUBD ,X SUBTRACT ADDRESS OF NEXT LINE NUMBER + ADDD VARTAB * ADD TO CURRENT END OF PROGRAM - THIS WILL REMOVE + STD VARTAB * THE LENGTH OF THIS LINE NUMBER FROM THE PROGRAM + LDU ,X POINT U TO ADDRESS OF NEXT LINE NUMBER +* DELETE OLD LINE FROM BASIC PROGRAM +LACC0 PULU A GET A BYTE FROM WHAT’S LEFT OF PROGRAM + STA ,X+ MOVE IT DOWN + CMPX VARTAB COMPARE TO END OF BASIC PROGRAM + BNE LACC0 BRANCH IF NOT AT END +LACC8 LDA LINBUF * CHECK TO SEE IF THERE IS A LINE IN + BEQ LACE9 * THE BUFFER AND BRANCH IF NONE + LDD VARTAB = SAVE CURRENT END OF + STD V43 = PROGRAM IN V43 + ADDB TMPLOC * ADD LENGTH OF CRUNCHED LINE, + ADCA #0 * PROPOGATE CARRY AND SAVE NEW END + STD V41 * OF PROGRAM IN V41 + JSR LAC1E = MAKE SURE THERE’S ENOUGH RAM FOR THIS +* = LINE & MAKE A HOLE IN BASIC FOR NEW LINE + LDU #LINHDR-2 POINT U TO LINE TO BE INSERTED +LACDD PULU A GET A BYTE FROM NEW LINE + STA ,X+ INSERT IT IN PROGRAM + CMPX V45 * COMPARE TO ADDRESS OF END OF INSERTED + BNE LACDD * LINE AND BRANCH IF NOT DONE + LDX V41 = GET AND SAVE + STX VARTAB = END OF PROGRAM +LACE9 BSR LAD21 RESET INPUT POINTER, CLEAR VARIABLES, INITIALIZE + BSR LACEF ADJUST START OF NEXT LINE ADDRESSES + BRA LAC7C REENTER BASIC’S INPUT LOOP +* COMPUTE THE START OF NEXT LINE ADDRESSES FOR THE BASIC PROGRAM +LACEF LDX TXTTAB POINT X TO START OF PROGRAM +LACF1 LDD ,X GET ADDRESS OF NEXT LINE + BEQ LAD16 RETURN IF END OF PROGRAM + LEAU 4,X POINT U TO START OF BASIC TEXT IN LINE +LACF7 LDA ,U+ * SKIP THROUGH THE LINE UNTIL A + BNE LACF7 * ZERO (END OF LINE) IS FOUND + STU ,X SAVE THE NEW START OF NEXT LINE ADDRESS + LDX ,X POINT X TO START OF NEXT LINE + BRA LACF1 KEEP GOING +* +* FIND A LINE NUMBER IN THE BASIC PROGRAM +* RETURN WITH CARRY SET IF NO MATCH FOUND +LAD01 LDD BINVAL GET THE LINE NUMBER TO FIND + LDX TXTTAB BEGINNING OF PROGRAM +LAD05 LDU ,X GET ADDRESS OF NEXT LINE NUMBER + BEQ LAD12 BRANCH IF END OF PROG + CMPD 2,X IS IT A MATCH? + BLS LAD14 CARRY SET IF LOWER; CARRY CLEAR IF MATCH + LDX ,X X = ADDRESS OF NEXT LINE + BRA LAD05 KEEP LOOPING FOR LINE NUMBER +LAD12 ORCC #1 SET CARRY FLAG +LAD14 STX V47 SAVE MATCH LINE NUMBER OR NUMBER OF LINE JUST AFTER +* WHERE IT SHOULD HAVE BEEN +LAD16 RTS + +* NEW +NEW BNE LAD14 BRANCH IF ARGUMENT GIVEN +LAD19 LDX TXTTAB GET START OF BASIC + CLR ,X+ * PUT 2 ZERO BYTES THERE - ERASE + CLR ,X+ * THE BASIC PROGRAM + STX VARTAB AND THE NEXT ADDRESS IS NOW THE END OF PROGRAM +LAD21 LDX TXTTAB GET START OF BASIC + JSR LAEBB PUT INPUT POINTER ONE BEFORE START OF BASIC +* ERASE ALL VARIABLES +LAD26 LDX MEMSIZ * RESET START OF STRING VARIABLES + STX STRTAB * TO TOP OF STRING SPACE + JSR RESTOR RESET ‘DATA’ POINTER TO START OF BASIC + LDX VARTAB * GET START OF VARIABLES AND USE IT + STX ARYTAB * TO RESET START OF ARRAYS + STX ARYEND RESET END OF ARRAYS +LAD33 LDX #STRSTK * RESET STRING STACK POINTER TO + STX TEMPPT * BOTTOM OF STRING STACK + LDX ,S GET RETURN ADDRESS OFF STACK + LDS FRETOP RESTORE STACK POINTER + CLR ,-S PUT A ZERO BYTE ON STACK - TO CLEAR ANY RETURN OF +* FOR/NEXT DATA FROM THE STACK + CLR OLDPTR RESET ‘CONT’ ADDRESS SO YOU + CLR OLDPTR+1 ‘CAN’T CONTINUE’ + CLR ARYDIS CLEAR THE ARRAY DISABLE FLAG + JMP ,X RETURN TO CALLING ROUTINE - THIS IS NECESSARY +* SINCE THE STACK WAS RESET +* +* FOR +* +* THE FOR COMMAND WILL STORE 18 BYTES ON THE STACK FOR +* EACH FOR-NEXT LOOP WHICH IS BEING PROCESSED. THESE +* BYTES ARE DEFINED AS FOLLOWS: 0- $80 (FOR FLAG); +* 1,2=INDEX VARIABLE DESCRIPTOR POINTER; 3-7=FP VALUE OF STEP; +* 8=STEP DIRECTION: $FF IF NEGATIVE; 0 IF ZERO; 1 IF POSITIVE; +* 9-13=FP VALUE OF ‘TO’ PARAMETER; +* 14,15=CURRENT LINE NUMBER; 16,17=RAM ADDRESS OF THE END +* OF THE LINE CONTAINING THE ‘FOR’ STATEMENT +FOR LDA #$80 * SAVE THE DISABLE ARRAY FLAG IN VO8 + STA ARYDIS * DO NOT ALLOW THE INDEX VARIABLE TO BE AN ARRAY + JSR LET SET INDEX VARIABLE TO INITIAL VALUE + JSR LABF9 SEARCH THE STACK FOR ‘FOR/NEXT’ DATA + LEAS 2,S PURGE RETURN ADDRESS OFF OF THE STACK + BNE LAD59 BRANCH IF INDEX VARIABLE NOT ALREADY BEING USED + LDX TEMPTR GET (ADDRESS + 18) OF MATCHED ‘FOR/NEXT’ DATA + LEAS B,X MOVE THE STACK POINTER TO THE BEGINNING OF THE +* MATCHED ‘FOR/NEXT’ DATA SO THE NEW DATA WILL +* OVERLAY THE OLD DATA. THIS WILL ALSO DESTROY +* ALL OF THE ‘RETURN’ AND ‘FOR/NEXT’ DATA BELOW +* THIS POINT ON THE STACK +LAD59 LDB #$09 * CHECK FOR ROOM FOR 18 BYTES + JSR LAC33 * IN FREE RAM + JSR LAEE8 GET ADDR OF END OF SUBLINE IN X + LDD CURLIN GET CURRENT LINE NUMBER + PSHS X,B,A SAVE LINE ADDR AND LINE NUMBER ON STACK + LDB #TOK_TO TOKEN FOR ‘TO’ + JSR LB26F SYNTAX CHECK FOR ‘TO’ + JSR LB143 ‘TM’ ERROR IF INDEX VARIABLE SET TO STRING + JSR LB141 EVALUATE EXPRESSION +* + LDB FP0SGN GET FPA0 MANTISSA SIGN + ORB #$7F FORM A MASK TO SAVE DATA BITS OF HIGH ORDER MANTISSA + ANDB FPA0 PUT THE MANTISSA SIGN IN BIT 7 OF HIGH ORDER MANTISSA + STB FPA0 SAVE THE PACKED HIGH ORDER MANTISSA + LDY #LAD7F LOAD FOLLOWING ADDRESS INTO Y AS A RETURN + JMP LB1EA ADDRESS - PUSH FPA0 ONTO THE STACK +LAD7F LDX #LBAC5 POINT X TO FLOATING POINT NUMBER 1.0 (DEFAULT STEP VALUE) + JSR LBC14 MOVE (X) TO FPA0 + JSR GETCCH GET CURRENT INPUT CHARACTER + CMPA #TOK_STEP STEP TOKEN + BNE LAD90 BRANCH IF NO ‘STEP’ VALUE + JSR GETNCH GET A CHARACTER FROM BASIC + JSR LB141 EVALUATE NUMERIC EXPRESSION +LAD90 JSR LBC6D CHECK STATUS OF FPA0 + JSR LB1E6 SAVE STATUS AND FPA0 ON THE STACK + LDD VARDES * GET DESCRIPTOR POINTER FOR THE ‘STEP’ + PSHS B,A * VARIABLE AND SAVE IT ON THE STACK + LDA #$80 = GET THE ‘FOR’ FLAG AND + PSHS A = SAVE IT ON THE STACK +* +* MAIN COMMAND INTERPRETATION LOOP +LAD9E ANDCC #$AF ENABLE IRQ,FIRQ + BSR LADEB CHECK FOR KEYBOARD BREAK + LDX CHARAD GET BASIC’S INPUT POINTER + STX TINPTR SAVE IT + LDA ,X+ GET CURRENT INPUT CHAR & MOVE POINTER + BEQ LADB4 BRANCH IF END OF LINE + CMPA #': CHECK FOR LINE SEPARATOR + BEQ LADC0 BRANCH IF COLON +LADB1 JMP LB277 ‘SYNTAX ERROR’-IF NOT LINE SEPARATOR +LADB4 LDA ,X++ GET MS BYTE OF ADDRESS OF NEXT BASIC LINE + STA ENDFLG SAVE IN STOP/END FLAG - CAUSE A STOP IF +* NEXT LINE ADDRESS IS < $8000; CAUSE +* AN END IF ADDRESS > $8000 + BEQ LAE15 BRANCH TO ‘STOP’ - END OF PROGRAM + LDD ,X+ GET CURRENT LINE NUMBER + STD CURLIN SAVE IN CURLIN + STX CHARAD SAVE ADDRESS OF FIRST BYTE OF LINE +* EXTENDED BASIC TRACE + LDA TRCFLG TEST THE TRACE FLAG + BEQ LADC0 BRANCH IF TRACE OFF + LDA #$5B RIGHT HAND MARKER FOR TRON LINE NUMBER + JSR PUTCHR OUTPUT A CHARACTER +* END OF EXTENDED BASIC TRACE +LADC0 JSR GETNCH GET A CHARACTER FROM BASIC + BSR LADC6 GO PROCESS COMMAND + BRA LAD9E GO BACK TO MAIN LOOP +LADC6 BEQ LADEA RETURN IF END OF LINE (RTS - was BEQ LAE40) + TSTA CHECK FOR TOKEN - BIT 7 SET (NEGATIVE) + LBPL LET BRANCH IF NOT A TOKEN - GO DO A ‘LET’ WHICH +* IS THE ‘DEFAULT’ TOKEN FOR MICROSOFT BASIC + CMPA #$FF SECONDARY TOKEN + BEQ SECTOK + CMPA #TOK_HIGH_EXEC SKIPF TOKEN - HIGHEST EXECUTABLE COMMAND IN BASIC + BHI LADB1 ‘SYNTAX ERROR’ IF NON-EXECUTABLE TOKEN + LDX COMVEC+3 GET ADDRESS OF BASIC’S COMMAND TABLE +LADD4 ASLA X2 (2 BYTE/JUMP ADDRESS) & DISCARD BIT 7 + TFR A,B SAVE COMMAND OFFSET IN ACCB + ABX NON X POINTS TO COMMAND JUMP ADDR + JSR GETNCH GET AN INPUT CHAR +* +* HERE IS WHERE WE BRANCH TO DO A ‘COMMAND’ + JMP [,X] GO DO A COMMAND +SECTOK +* THE ONLY SECONDARY TOKEN THAT CAN ALSO BE AN EXECUTABLE IS +* THE MID$ REPLACEMENT STATEMENT. SO SPECIAL-CASE CHECK DONE HERE + JSR GETNCH GET AN INPUT CHAR + CMPA #TOK_MID TOKEN FOR "MID$" + LBEQ L86D6 PROCESS MID$ REPLACEMENT + JMP LB277 SYNTAX ERROR + +* +* RESTORE +RESTOR LDX TXTTAB BEGINNING OF PROGRAM ADDRESS + LEAX -1,X MOVE TO ONE BYTE BEFORE PROGRAM +LADE8 STX DATPTR SAVE NEW DATA POINTER +LADEA RTS +* +* BREAK CHECK +LADEB JSR LA1C1 GET A KEYSTROKE ENTRY + BEQ LADFA RETURN IF NO INPUT +LADF0 CMPA #3 CONTROL C? (BREAK) + BEQ STOP YES + CMPA #$13 CONTROL S? (PAUSE) + BEQ LADFB YES + STA IKEYIM SAVE KEYSTROKE IN INKEY IMAGE +LADFA RTS +LADFB JSR KEYIN GET A KEY + BEQ LADFB BRANCH IF NO KEY DOWN + BRA LADF0 CONTINUE - DO A BREAK CHECK +* +* END +END JSR GETCCH GET CURRENT INPUT CHAR + BRA LAE0B +* +* STOP +STOP ORCC #$01 SET CARRY FLAG +LAE0B BNE LAE40 BRANCH IF ARGUMENT EXISTS + LDX CHARAD * SAVE CURRENT POSITION OF + STX TINPTR * BASIC’S INPUT POINTER +LAE11 ROR ENDFLG ROTATE CARRY INTO BIT 7 OF STOP/END FLAG + LEAS 2,S PURGE RETURN ADDRESS OFF STACK +LAE15 LDX CURLIN GET CURRENT LINE NUMBER + CMPX #$FFFF DIRECT MODE? + BEQ LAE22 YES + STX OLDTXT SAVE CURRENT LINE NUMBER + LDX TINPTR * GET AND SAVE CURRENT POSITION + STX OLDPTR * OF BASIC’S INPUT POINTER +LAE22 + LDX #LABF2-1 POINT TO CR, ‘BREAK’ MESSAGE + TST ENDFLG CHECK STOP/END FLAG + LBPL LAC73 BRANCH TO MAIN LOOP OF BASIC IF END + JMP LAC68 PRINT ‘BREAK AT ####’ AND GO TO +* BASIC’S MAIN LOOP IF ‘STOP’ + +* CONT +CONT BNE LAE40 RETURN IF ARGUMENT GIVEN + LDB #2*16 ‘CAN’T CONTINUE’ ERROR + LDX OLDPTR GET CONTINUE ADDRESS (INPUT POINTER) + LBEQ LAC46 ‘CN’ ERROR IF CONTINUE ADDRESS = 0 + STX CHARAD RESET BASIC’S INPUT POINTER + LDX OLDTXT GET LINE NUMBER + STX CURLIN RESET CURRENT LINE NUMBER +LAE40 RTS +* +* CLEAR +CLEAR BEQ LAE6F BRANCH IF NO ARGUMENT + JSR LB3E6 EVALUATE ARGUMENT + PSHS B,A SAVE AMOUNT OF STRING SPACE ON STACK + LDX MEMSIZ GET CURRENT TOP OF CLEARED SPACE + JSR GETCCH GET CURRENT INPUT CHARACTER + BEQ LAE5A BRANCH IF NO NEW TOP OF CLEARED SPACE + JSR LB26D SYNTAX CHECK FOR COMMA + JSR LB73D EVALUATE EXPRESSlON; RETURN VALUE IN X + LEAX -1,X X = TOP OF CLEARED SPACE + CMPX TOPRAM COMPARE TO TOP OF RAM + BHI LAE72 ‘OM’ ERROR IF > TOP OF RAM +LAE5A TFR X,D ACCD = TOP OF CLEARED SPACE + SUBD ,S++ SUBTRACT OUT AMOUNT OF CLEARED SPACE + BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 + TFR D,U U = BOTTOM OF CLEARED SPACE + SUBD #STKBUF SUBTRACT OUT STACK BUFFER + BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 + SUBD VARTAB SUBTRACT OUT START OF VARIABLES + BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 + STU FRETOP SAVE NEW BOTTOM OF CLEARED SPACE + STX MEMSIZ SAVE NEW TOP OF CLEARED SPACE +LAE6F JMP LAD26 ERASE ALL VARIABLES, INITIALIZE POINTERS, ETC +LAE72 JMP LAC44 ‘OM’ ERROR +* +* RUN +RUN JSR GETCCH * GET CURRENT INPUT CHARACTER + LBEQ LAD21 * IF NO LINE NUMBER + JSR LAD26 ERASE ALL VARIABLES + BRA LAE9F ‘GOTO’ THE RUN ADDRESS +* +* GO +GO TFR A,B SAVE INPUT CHARACTER IN ACCB +LAE88 JSR GETNCH GET A CHARACTER FROM BASIC + CMPB #TOK_TO ‘TO’ TOKEN + BEQ LAEA4 BRANCH IF GOTO + CMPB #TOK_SUB ‘SUB’ TOKEN + BNE LAED7 ‘SYNTAX ERROR’ IF NEITHER + LDB #3 =ROOM FOR 6 + JSR LAC33 =BYTES ON STACK? + LDU CHARAD * SAVE CURRENT BASIC INPUT POINTER, LINE + LDX CURLIN * NUMBER AND SUB TOKEN ON STACK + LDA #TOK_SUB * + PSHS U,X,A * +LAE9F BSR LAEA4 GO DO A ‘GOTO’ + JMP LAD9E JUMP BACK TO BASIC’S MAIN LOOP +* GOTO +LAEA4 JSR GETCCH GET CURRENT INPUT CHAR + JSR LAF67 GET LINE NUMBER TO BINARY IN BINVAL + BSR LAEEB ADVANCE BASIC’S POINTER TO END OF LINE + LEAX $01,X POINT TO START OF NEXT LINE + LDD BINVAL GET THE LINE NUMBER TO RUN + CMPD CURLIN COMPARE TO CURRENT LINE NUMBER + BHI LAEB6 IF REO’D LINE NUMBER IS > CURRENT LINE NUMBER, +* DON’T START LOOKING FROM +* START OF PROGRAM + LDX TXTTAB BEGINNING OF PROGRAM +LAEB6 JSR LAD05 GO FIND A LINE NUMBER + BCS LAED2 ‘UNDEFINED LINE NUMBER’ +LAEBB LEAX -1,X MOVE BACK TO JUST BEFORE START OF LINE + STX CHARAD RESET BASIC’S INPUT POINTER +LAEBF RTS +* +* RETURN +RETURN BNE LAEBF EXIT ROUTINE IF ARGUMENT GIVEN + LDA #$FF * PUT AN ILLEGAL VARIABLE NAME IN FIRST BYTE OF + STA VARDES * VARDES WHICH WILL CAUSE ‘FOR/NEXT’ DATA ON THE +* STACK TO BE IGNORED + JSR LABF9 CHECK FOR RETURN DATA ON THE STACK + TFR X,S RESET STACK POINTER - PURGE TWO RETURN ADDRESSES +* FROM THE STACK + CMPA #TOK_SUB-$80 SUB TOKEN - $80 + BEQ LAEDA BRANCH IF ‘RETURN’ FROM SUBROUTINE + LDB #2*2 ERROR #2 ‘RETURN WITHOUT GOSUB’ + FCB SKP2 SKIP TWO BYTES +LAED2 LDB #7*2 ERROR #7 ‘UNDEFINED LINE NUMBER’ + JMP LAC46 JUMP TO ERROR HANDLER +LAED7 JMP LB277 ‘SYNTAX ERROR’ +LAEDA PULS A,X,U * RESTORE VALUES OF CURRENT LINE NUMBER AND + STX CURLIN * BASIC’S INPUT POINTER FOR THIS SUBROUTINE + STU CHARAD * AND LOAD ACCA WITH SUB TOKEN ($A6) +* +* DATA +DATA BSR LAEE8 MOVE INPUT POINTER TO END OF SUBLINE OR LINE + FCB SKP2 SKIP 2 BYTES + +* REM, ELSE +ELSE +REM BSR LAEEB MOVE INPUT POINTER TO END OF LINE + STX CHARAD RESET BASIC’S INPUT POINTER +LAEE7 RTS +* ADVANCE INPUT POINTER TO END OF SUBLINE OR LINE +LAEE8 LDB #': COLON = SUBLINE TERMINATOR CHARACTER +LAEEA FCB SKP1LD SKPILD SKIP ONE BYTE; LDA #$5F +* ADVANCE BASIC’S INPUT POINTER TO END OF +* LINE - RETURN ADDRESS OF END OF LINE+1 IN X +LAEEB CLRB 0 = LINE TERMINATOR CHARACTER + STB CHARAC TEMP STORE PRIMARY TERMINATOR CHARACTER + CLRB 0 (END OF LINE) = ALTERNATE TERM. CHAR. + LDX CHARAD LOAD X W/BASIC’S INPUT POINTER +LAEF1 TFR B,A * CHANGE TERMINATOR CHARACTER + LDB CHARAC * FROM ACCB TO CHARAC - SAVE OLD TERMINATOR +* IN CHARAC + STA CHARAC SWAP PRIMARY AND SECONDARY TERMINATORS +LAEF7 LDA ,X GET NEXT INPUT CHARACTER + BEQ LAEE7 RETURN IF 0 (END OF LINE) + PSHS B SAVE TERMINATOR ON STACK + CMPA ,S+ COMPARE TO INPUT CHARACTER + BEQ LAEE7 RETURN IF EQUAL + LEAX 1,X MOVE POINTER UP ONE + CMPA #'" CHECK FOR DOUBLE QUOTES + BEQ LAEF1 BRANCH IF " - TOGGLE TERMINATOR CHARACTERS + INCA * CHECK FOR $FF AND BRANCH IF + BNE LAF0C * NOT SECONDARY TOKEN + LEAX 1,X MOVE INPUT POINTER 1 MORE IF SECONDARY +LAF0C CMPA #TOK_IF+1 TOKEN FOR IF? + BNE LAEF7 NO - GET ANOTHER INPUT CHARACTER + INC IFCTR INCREMENT IF COUNTER - KEEP TRACK OF HOW MANY +* ‘IF’ STATEMENTS ARE NESTED IN ONE LINE + BRA LAEF7 GET ANOTHER INPUT CHARACTER + +* IF +IF JSR LB141 EVALUATE NUMERIC EXPRESSION + JSR GETCCH GET CURRENT INPUT CHARACTER + CMPA #TOK_GO TOKEN FOR GO + BEQ LAF22 TREAT ‘GO’ THE SAME AS ‘THEN’ + LDB #TOK_THEN TOKEN FOR THEN + JSR LB26F DO A SYNTAX CHECK ON ACCB +LAF22 LDA FP0EXP CHECK FOR TRUE/FALSE - FALSE IF FPA0 EXPONENT = ZERO + BNE LAF39 BRANCH IF CONDITION TRUE + CLR IFCTR CLEAR FLAG - KEEP TRACK OF WHICH NESTED ELSE STATEMENT +* TO SEARCH FOR IN NESTED ‘IF’ LOOPS +LAF28 BSR DATA MOVE BASIC’S POINTER TO END OF SUBLINE + TSTA * CHECK TO SEE IF END OF LINE OR SUBLINE + BEQ LAEE7 * AND RETURN IF END OF LINE + JSR GETNCH GET AN INPUT CHARACTER FROM BASIC + CMPA #TOK_ELSE TOKEN FOR ELSE + BNE LAF28 IGNORE ALL DATA EXCEPT ‘ELSE’ UNTIL +* END OF LINE (ZERO BYTE) + DEC IFCTR CHECK TO SEE IF YOU MUST SEARCH ANOTHER SUBLINE + BPL LAF28 BRANCH TO SEARCH ANOTHER SUBLINE FOR ‘ELSE’ + JSR GETNCH GET AN INPUT CHARACTER FROM BASIC +LAF39 JSR GETCCH GET CURRENT INPUT CHARACTER + LBCS LAEA4 BRANCH TO ‘GOTO’ IF NUMERIC CHARACTER + JMP LADC6 RETURN TO MAIN INTERPRETATION LOOP + +* ON +ON JSR LB70B EVALUATE EXPRESSION + LDB #TOK_GO TOKEN FOR GO + JSR LB26F SYNTAX CHECK FOR GO + PSHS A SAVE NEW TOKEN (TO,SUB) + CMPA #TOK_SUB TOKEN FOR SUB? + BEQ LAF54 YES + CMPA #TOK_TO TOKEN FOR TO? +LAF52 BNE LAED7 ‘SYNTAX’ ERROR IF NOT ‘SUB’ OR ‘TO’ +LAF54 DEC FPA0+3 DECREMENT IS BYTE OF MANTISSA OF FPA0 - THIS +* IS THE ARGUMENT OF THE ‘ON’ STATEMENT + BNE LAF5D BRANCH IF NOT AT THE PROPER GOTO OR GOSUB LINE NUMBER + PULS B GET BACK THE TOKEN FOLLOWING ‘GO’ + JMP LAE88 GO DO A ‘GOTO’ OR ‘GOSUB’ +LAF5D JSR GETNCH GET A CHARACTER FROM BASIC + BSR LAF67 CONVERT BASIC LINE NUMBER TO BINARY + CMPA #', IS CHARACTER FOLLOWING LINE NUMBER A COMMA? + BEQ LAF54 YES + PULS B,PC IF NOT, FALL THROUGH TO NEXT COMMAND +LAF67 LDX ZERO DEFAULT LINE NUMBER OF ZERO + STX BINVAL SAVE IT IN BINVAL +* +* CONVERT LINE NUMBER TO BINARY - RETURN VALUE IN BINVAL +* +LAF6B BCC LAFCE RETURN IF NOT NUMERIC CHARACTER + SUBA #'0 MASK OFF ASCII + STA CHARAC SAVE DIGIT IN VO1 + LDD BINVAL GET ACCUMULATED LINE NUMBER VALUE + CMPA #24 LARGEST LINE NUMBER IS $F9FF (63999) - +* (24*256+255)*10+9 + BHI LAF52 ‘SYNTAX’ ERROR IF TOO BIG +* MULT ACCD X 10 + ASLB * + ROLA * TIMES 2 + ASLB = + ROLA = TIMES 4 + ADDD BINVAL ADD 1 = TIMES 5 + ASLB * + ROLA * TIMES 10 + ADDB CHARAC ADD NEXT DIGIT + ADCA #0 PROPAGATE CARRY + STD BINVAL SAVE NEW ACCUMULATED LINE NUMBER + JSR GETNCH GET NEXT CHARACTER FROM BASIC + BRA LAF6B LOOP- PROCESS NEXT DIGIT +* +* LET (EXBAS) +* EVALUATE A NON-TOKEN EXPRESSION +* TARGET = REPLACEMENT +LET JSR LB357 FIND TARGET VARIABLE DESCRIPTOR + STX VARDES SAVE DESCRIPTOR ADDRESS OF 1ST EXPRESSION + LDB #TOK_EQUALS TOKEN FOR "=" + JSR LB26F DO A SYNTAX CHECK FOR ‘=‘ + LDA VALTYP * GET VARIABLE TYPE AND + PSHS A * SAVE ON THE STACK + JSR LB156 EVALUATE EXPRESSION + PULS A * REGET VARIABLE TYPE OF 1ST EXPRESSION AND + RORA * SET CARRY IF STRING + JSR LB148 TYPE CHECK-TM ERROR IF VARIABLE TYPES ON +* BOTH SIDES OF EQUALS SIGN NOT THE SAME + LBEQ LBC33 GO PUT FPA0 INTO VARIABLE DESCRIPTOR IF NUMERIC +* MOVE A STRING WHOSE DESCRIPTOR IS LOCATED AT +* FPA0+2 INTO THE STRING SPACE. TRANSFER THE +* DESCRIPTOR ADDRESS TO THE ADDRESS IN VARDES +* DON’T MOVE THE STRING IF IT IS ALREADY IN THE +* STRING SPACE. REMOVE DESCRIPTOR FROM STRING +* STACK IF IT IS LAST ONE ON THE STACK +LAFA4 LDX FPA0+2 POINT X TO DESCRIPTOR OF REPLACEMENT STRING + LDD FRETOP LOAD ACCD WITH START OF STRING SPACE + CMPD 2,X IS THE STRING IN STRING SPACE? + BCC LAFBE BRANCH IF IT’S NOT IN THE STRING SPACE + CMPX VARTAB COMPARE DESCRIPTOR ADDRESS TO START OF VARIABLES + BCS LAFBE BRANCH IF DESCRIPTOR ADDRESS NOT IN VARIABLES +LAFB1 LDB ,X GET LENGTH OF REPLACEMENT STRING + JSR LB50D RESERVE ACCB BYTES OF STRING SPACE + LDX V4D GET DESCRIPTOR ADDRESS BACK + JSR LB643 MOVE STRING INTO STRING SPACE + LDX #STRDES POINT X TO TEMP STRING DESCRIPTOR ADDRESS +LAFBE STX V4D SAVE STRING DESCRIPTOR ADDRESS IN V4D + JSR LB675 REMOVE STRING DESCRIPTOR IF LAST ONE +* ON STRING STACK + LDU V4D POINT U TO REPLACEMENT DESCRIPTOR ADDRESS + LDX VARDES GET TARGET DESCRIPTOR ADDRESS + PULU A,B,Y GET LENGTH AND START OF REPLACEMENT STRING + STA ,X * SAVE STRING LENGTH AND START IN + STY 2,X * TARGET DESCRIPTOR LOCATION +LAFCE RTS + +LAFCF FCC "?REDO" ?REDO MESSAGE + FCB CR,$00 + +LAFD6 +LAFDC JMP LAC46 JMP TO ERROR HANDLER +LAFDF LDA INPFLG = GET THE INPUT FLAG AND BRANCH + BEQ LAFEA = IF ‘INPUT’ + LDX DATTXT * GET LINE NUMBER WHERE THE ERROR OCCURRED + STX CURLIN * AND USE IT AS THE CURRENT LINE NUMBER + JMP LB277 ‘SYNTAX ERROR’ +LAFEA LDX #LAFCF-1 * POINT X TO ‘?REDO’ AND PRINT + JSR LB99C * IT ON THE SCREEN + LDX TINPTR = GET THE SAVED ABSOLUTE ADDRESS OF + STX CHARAD = INPUT POINTER AND RESTORE IT + RTS +* +* INPUT +INPUT LDB #11*2 ‘ID’ ERROR + LDX CURLIN GET CURRENT LINE NUMBER + LEAX 1,X ADD ONE + BEQ LAFDC ‘ID’ ERROR BRANCH IF DIRECT MODE + BSR LB00F GET SOME INPUT DATA - WAS LB002 + RTS +LB00F CMPA #'" CHECK FOR PROMPT STRING DELIMITER + BNE LB01E BRANCH IF NO PROMPT STRING + JSR LB244 PUT PROMPT STRING ON STRING STACK + LDB #'; * + JSR LB26F * DO A SYNTAX CHECK FOR SEMICOLON + JSR LB99F PRINT MESSAGE TO CONSOLE OUT +LB01E LDX #LINBUF POINT TO BASIC’S LINE BUFFER + CLR ,X CLEAR 1ST BYTE - FLAG TO INDICATE NO DATA +* IN LINE BUFFER + BSR LB02F INPUT A STRING TO LINE BUFFER + LDB #', * INSERT A COMMA AT THE END + STB ,X * OF THE LINE INPUT BUFFER + BRA LB049 +* FILL BASIC’S LINE INPUT BUFFER CONSOLE IN +LB02F JSR LB9AF SEND A "?" TO CONSOLE OUT + JSR LB9AC SEND A ‘SPACE’ TO CONSOLE OUT +LB035 JSR LA390 GO READ IN A BASIC LINE + BCC LB03F BRANCH IF ENTER KEY ENDED ENTRY + LEAS 4,S PURGE TWO RETURN ADDRESSES OFF THE STACK + JMP LAE11 GO DO A ‘STOP’ IF BREAK KEY ENDED LINE ENTRY +LB03F LDB #2*23 ‘INPUT PAST END OF FILE’ ERROR + RTS +* +* READ +READ LDX DATPTR GET ‘READ’ START ADDRESS + FCB SKP1LD SKIP ONE BYTE - LDA #*$4F +LB049 CLRA ‘INPUT’ ENTRY POINT: INPUT FLAG = 0 + STA INPFLG SET INPUT FLAG; 0 = INPUT: <> 0 = READ + STX DATTMP SAVE ‘READ’ START ADDRESS/’INPUT’ BUFFER START +LB04E JSR LB357 EVALUATE A VARIABLE + STX VARDES SAVE DESCRIPTOR ADDRESS + LDX CHARAD * GET BASIC’S INPUT POINTER + STX BINVAL * AND SAVE IT + LDX DATTMP GET ‘READ’ ADDRESS START/’INPUT’ BUFFER POINTER + LDA ,X GET A CHARACTER FROM THE BASIC PROGRAM + BNE LB069 BRANCH IF NOT END OF LINE + LDA INPFLG * CHECK INPUT FLAG AND BRANCH + BNE LB0B9 * IF LOOKING FOR DATA (READ) +* NO DATA IN ‘INPUT’ LINE BUFFER AND/OR INPUT +* NOT COMING FROM SCREEN + JSR LB9AF SEND A '?' TO CONSOLE OUT + BSR LB02F FILL INPUT BUFFER FROM CONSOLE IN +LB069 STX CHARAD RESET BASIC’S INPUT POINTER + JSR GETNCH GET A CHARACTER FROM BASIC + LDB VALTYP * CHECK VARIABLE TYPE AND + BEQ LB098 * BRANCH IF NUMERIC +* READ/INPUT A STRING VARIABLE + LDX CHARAD LOAD X WITH CURRENT BASIC INPUT POINTER + STA CHARAC SAVE CURRENT INPUT CHARACTER + CMPA #'" CHECK FOR STRING DELIMITER + BEQ LB08B BRANCH IF STRING DELIMITER + LEAX -1,X BACK UP POINTER + CLRA * ZERO = END OF LINE CHARACTER + STA CHARAC * SAVE AS TERMINATOR + JSR LA35F SET UP PRINT PARAMETERS + LDA #': END OF SUBLINE CHARACTER + STA CHARAC SAVE AS TERMINATOR I + LDA #', COMMA +LB08B STA ENDCHR SAVE AS TERMINATOR 2 + JSR LB51E STRIP A STRING FROM THE INPUT BUFFER + JSR LB249 MOVE INPUT POINTER TO END OF STRING + JSR LAFA4 PUT A STRING INTO THE STRING SPACE IF NECESSARY + BRA LB09E CHECK FOR ANOTHER DATA ITEM +* SAVE A NUMERIC VALUE IN A READ OR INPUT DATA ITEM +LB098 JSR LBD12 CONVERT AN ASCII STRING TO FP NUMBER + JSR LBC33 PACK FPA0 AND STORE IT IN ADDRESS IN VARDES - +* INPUT OR READ DATA ITEM +LB09E JSR GETCCH GET CURRENT INPUT CHARACTER + BEQ LB0A8 BRANCH IF END OF LINE + CMPA #', CHECK FOR A COMMA + LBNE LAFD6 BAD FILE DATA' ERROR OR RETRY +LB0A8 LDX CHARAD * GET CURRENT INPUT + STX DATTMP * POINTER (USED AS A DATA POINTER) AND SAVE IT + LDX BINVAL * RESET INPUT POINTER TO INPUT OR + STX CHARAD * READ STATEMENT + JSR GETCCH GET CURRENT CHARACTER FROM BASIC + BEQ LB0D5 BRANCH IF END OF LINE - EXIT COMMAND + JSR LB26D SYNTAX CHECK FOR COMMA + BRA LB04E GET ANOTHER INPUT OR READ ITEM +* SEARCH FROM ADDRESS IN X FOR +* 1ST OCCURENCE OF THE TOKEN FOR DATA +LB0B9 STX CHARAD RESET BASIC’S INPUT POINTER + JSR LAEE8 SEARCH FOR END OF CURRENT LINE OR SUBLINE + LEAX 1,X MOVE X ONE PAST END OF LINE + TSTA CHECK FOR END OF LINE + BNE LB0CD BRANCH IF END OF SUBLINE + LDB #2*3 ‘OUT OF DATA’ ERROR + LDU ,X++ GET NEXT 2 CHARACTERS + BEQ LB10A ‘OD’ ERROR IF END OF PROGRAM + LDD ,X++ GET BASIC LINE NUMBER AND + STD DATTXT SAVE IT IN DATTXT +LB0CD LDA ,X GET AN INPUT CHARACTER + CMPA #TOK_DATA DATA TOKEN? + BNE LB0B9 NO — KEEP LOOKING + BRA LB069 YES +* EXIT READ AND INPUT COMMANDS +LB0D5 LDX DATTMP GET DATA POINTER + LDB INPFLG * CHECK INPUT FLAG + LBNE LADE8 * SAVE NEW DATA POINTER IF READ + LDA ,X = CHECK NEXT CHARACTER IN ‘INPUT’ BUFFER + BEQ LB0E7 = + LDX #LB0E8-1 POINT X TO ‘?EXTRA IGNORED’ + JMP LB99C PRINT THE MESSAGE +LB0E7 RTS + +LB0E8 FCC "?EXTRA IGNORED" ?EXTRA IGNORED MESSAGE + + + FCB CR,$00 + +* NEXT +NEXT BNE LB0FE BRANCH IF ARGUMENT GIVEN + LDX ZERO X = 0: DEFAULT FOR NO ARGUMENT + BRA LB101 +LB0FE JSR LB357 EVALUATE AN ALPHA EXPRESSION +LB101 STX VARDES SAVE VARIABLE DESCRIPTOR POINTER + JSR LABF9 GO SCAN FOR ‘FOR/NEXT’ DATA ON STACK + BEQ LB10C BRANCH IF DATA FOUND + LDB #0 ‘NEXT WITHOUT FOR’ ERROR (SHOULD BE CLRB) +LB10A BRA LB153 PROCESS ERROR +LB10C TFR X,S POINT S TO START OF ‘FOR/NEXT’ DATA + LEAX 3,X POINT X TO FP VALUE OF STEP + JSR LBC14 COPY A FP NUMBER FROM (X) TO FPA0 + LDA 8,S GET THE DIRECTION OF STEP + STA FP0SGN SAVE IT AS THE SIGN OF FPA0 + LDX VARDES POINT (X) TO INDEX VARIABLE DESCRIPTOR + JSR LB9C2 ADD (X) TO FPA0 (STEP TO INDEX) + JSR LBC33 PACK FPA0 AND STORE IT IN ADDRESS +* CONTAINED IN VARDES + LEAX 9,S POINT (X) TO TERMINAL VALUE OF INDEX + JSR LBC96 COMPARE CURRENT INDEX VALUE TO TERMINAL VALUE OF INDEX + SUBB 8,S ACCB = 0 IF TERMINAL VALUE=CURRENT VALUE AND STEP=0 OR IF +* STEP IS POSITIVE AND CURRENT VALUE>TERMINAL VALUE OR +* STEP IS NEGATIVE AND CURRENT VALUE + BCS LB181 BRANCH IF LESS THAN RELATIONAL OPERATORS + CMPA #3 * + BCC LB181 * BRANCH IF GREATER THAN RELATIONAL OPERATORS + CMPA #1 SET CARRY IF ‘>‘ + ROLA CARRY TO BIT 0 + EORA TRELFL * CARRY SET IF + CMPA TRELFL * TRELFL = ACCA + BCS LB1DF BRANCH IF SYNTAX ERROR : == << OR >> + STA TRELFL BIT 0: >, BIT 1 =, BIT 2: < + JSR GETNCH GET AN INPUT CHARACTER + BRA LB16A CHECK FOR ANOTHER RELATIONAL OPERATOR +* +LB181 LDB TRELFL GET RELATIONAL OPERATOR FLAG + BNE LB1B8 BRANCH IF RELATIONAL COMPARISON + LBCC LB1F4 BRANCH IF > RELATIONAL OPERATOR + ADDA #7 SEVEN ARITHMETIC/LOGICAL OPERATORS + BCC LB1F4 BRANCH IF NOT ARITHMETIC/LOGICAL OPERATOR + ADCA VALTYP ADD CARRY, NUMERIC FLAG AND MODIFIED TOKEN NUMBER + LBEQ LB60F BRANCH IF VALTYP = FF, AND ACCA = ‘+‘ TOKEN - +* CONCATENATE TWO STRINGS + ADCA #-1 RESTORE ARITHMETIC/LOGICAL OPERATOR NUMBER + PSHS A * STORE OPERATOR NUMBER ON STACK; MULTIPLY IT BY 2 + ASLA * THEN ADD THE STORED STACK DATA = MULTIPLY + ADDA ,S+ * X 3; 3 BYTE/TABLE ENTRY + LDX #LAA51 JUMP TABLE FOR ARITHMETIC & LOGICAL OPERATORS + LEAX A,X POINT X TO PROPER TABLE +LB19F PULS A GET PRECEDENCE FLAG FROM STACK + CMPA ,X COMPARE TO CURRENT OPERATOR + BCC LB1FA BRANCH IF STACK OPERATOR > CURRENT OPERATOR + BSR LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING + +* OPERATION BEING PROCESSED IS OF HIGHER PRECEDENCE THAN THE PREVIOUS OPERATION. +LB1A7 PSHS A SAVE PRECEDENCE FLAG + BSR LB1D4 PUSH OPERATOR ROUTINE ADDRESS AND FPA0 ONTO STACK + LDX RELPTR GET POINTER TO ARITHMETIC/LOGICAL TABLE ENTRY FOR +* LAST CALCULATED OPERATION + PULS A GET PRECEDENCE FLAG OF PREVIOUS OPERATION + BNE LB1CE BRANCH IF NOT END OF OPERATION + TSTA CHECK TYPE OF PRECEDENCE FLAG + LBEQ LB220 BRANCH IF END OF EXPRESSION OR SUB-EXPRESSION + BRA LB203 EVALUATE AN OPERATION + +LB1B8 ASL VALTYP BIT 7 OF TYPE FLAG TO CARRY + ROLB SHIFT RELATIONAL FLAG LEFT - VALTYP TO BIT 0 + BSR LB1C6 MOVE THE INPUT POINTER BACK ONE + LDX #LB1CB POINT X TO RELATIONAL COMPARISON JUMP TABLE + STB TRELFL SAVE RELATIONAL COMPARISON DATA + CLR VALTYP SET VARIABLE TYPE TO NUMERIC + BRA LB19F PERFORM OPERATION OR SAVE ON STACK + +LB1C6 LDX CHARAD * GET BASIC’S INPUT POINTER AND + JMP LAEBB * MOVE IT BACK ONE +* RELATIONAL COMPARISON JUMP TABLE +LB1CB FCB $64 RELATIONAL COMPARISON FLAG +LB1CC FDB LB2F4 JUMP ADDRESS + +LB1CE CMPA ,X COMPARE PRECEDENCE OF LAST DONE OPERATION TO +* NEXT TO BE DONE OPERATION + BCC LB203 EVALUATE OPERATION IF LOWER PRECEDENCE + BRA LB1A7 PUSH OPERATION DATA ON STACK IF HIGHER PRECEDENCE + +* PUSH OPERATOR EVALUATION ADDRESS AND FPA0 ONTO STACK AND EVALUATE ANOTHER EXPR +LB1D4 LDD 1,X GET ADDRESS OF OPERATOR ROUTINE + PSHS B,A SAVE IT ON THE STACK + BSR LB1E2 PUSH FPA0 ONTO STACK + LDB TRELFL GET BACK RELATIONAL OPERATOR FLAG + LBRA LB15A EVALUATE ANOTHER EXPRESSION +LB1DF JMP LB277 ‘SYNTAX ERROR’ +* PUSH FPA0 ONTO THE STACK. ,S = EXPONENT +* 1-2,S =HIGH ORDER MANTISSA 3-4,S = LOW ORDER MANTISSA +* 5,S = SIGN RETURN WITH PRECEDENCE CODE IN ACCA +LB1E2 LDB FP0SGN GET SIGN OF FPA0 MANTISSA + LDA ,X GET PRECEDENCE CODE TO ACCA +LB1E6 PULS Y GET RETURN ADDRESS FROM STACK & PUT IT IN Y + PSHS B SAVE ACCB ON STACK +LB1EA LDB FP0EXP * PUSH FPA0 ONTO THE STACK + LDX FPA0 * + LDU FPA0+2 * + PSHS U,X,B * + JMP ,Y JUMP TO ADDRESS IN Y + +* BRANCH HERE IF NON-OPERATOR CHARACTER FOUND - USUALLY ‘)‘ OR END OF LINE +LB1F4 LDX ZERO POINT X TO DUMMY VALUE (ZERO) + LDA ,S+ GET PRECEDENCE FLAG FROM STACK + BEQ LB220 BRANCH IF END OF EXPRESSION +LB1FA CMPA #$64 * CHECK FOR RELATIONAL COMPARISON FLAG + BEQ LB201 * AND BRANCH IF RELATIONAL COMPARISON + JSR LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING +LB201 STX RELPTR SAVE POINTER TO OPERATOR ROUTINE +LB203 PULS B GET RELATIONAL OPERATOR FLAG FROM STACK + CMPA #$5A CHECK FOR ‘NOT’ OPERATOR + BEQ LB222 RETURN IF ‘NOT’ - NO RELATIONAL COMPARISON + CMPA #$7D CHECK FOR NEGATION (UNARY) FLAG + BEQ LB222 RETURN IF NEGATION - NO RELATIONAL COMPARISON + +* EVALUATE AN OPERATION. EIGHT BYTES WILL BE STORED ON STACK, FIRST SIX BYTES +* ARE A TEMPORARY FLOATING POINT RESULT THEN THE ADDRESS OF ROUTINE WHICH +* WILL EVALUATE THE OPERATION. THE RTS AT END OF ROUTINE WILL VECTOR +* TO EVALUATING ROUTINE. + LSRB = ROTATE VALTYP BIT INTO CARRY + STB RELFLG = FLAG AND SAVE NEW RELFLG + PULS A,X,U * PULL A FP VALUE OFF OF THE STACK + STA FP1EXP * AND SAVE IT IN FPA1 + STX FPA1 * + STU FPA1+2 * + PULS B = GET MANTISSA SIGN AND + STB FP1SGN = SAVE IT IN FPA1 + EORB FP0SGN EOR IT WITH FPA1 MANTISSA SIGN + STB RESSGN SAVE IT IN RESULT SIGN BYTE +LB220 LDB FP0EXP GET EXPONENT OF FPA0 +LB222 RTS + +LB223 JSR XVEC15 CALL EXTENDED BASIC ADD-IN + CLR VALTYP INITIALIZE TYPE FLAG TO NUMERIC + JSR GETNCH GET AN INPUT CHAR + BCC LB22F BRANCH IF NOT NUMERIC +LB22C JMP LBD12 CONVERT ASCII STRING TO FLOATING POINT - +* RETURN RESULT IN FPA0 +* PROCESS A NON NUMERIC FIRST CHARACTER +LB22F JSR LB3A2 SET CARRY IF NOT ALPHA + BCC LB284 BRANCH IF ALPHA CHARACTER + CMPA #'. IS IT ‘.‘ (DECIMAL POINT)? + BEQ LB22C CONVERT ASCII STRING TO FLOATING POINT + CMPA #TOK_MINUS MINUS TOKEN + BEQ LB27C YES - GO PROCESS THE MINUS OPERATOR + CMPA #TOK_PLUS PLUS TOKEN + BEQ LB223 YES - GET ANOTHER CHARACTER + CMPA #'" STRING DELIMITER? + BNE LB24E NO +LB244 LDX CHARAD CURRENT BASIC POINTER TO X + JSR LB518 SAVE STRING ON STRING STACK +LB249 LDX COEFPT * GET ADDRESS OF END OF STRING AND + STX CHARAD * PUT BASIC’S INPUT POINTER THERE + RTS +LB24E CMPA #TOK_NOT NOT TOKEN? + BNE LB25F NO +* PROCESS THE NOT OPERATOR + LDA #$5A ‘NOT’ PRECEDENCE FLAG + JSR LB15A PROCESS OPERATION FOLLOWING ‘NOT’ + JSR INTCNV CONVERT FPA0 TO INTEGER IN ACCD + COMA * ‘NOT’ THE INTEGER + COMB * + JMP GIVABF CONVERT ACCD TO FLOATING POINT (FPA0) +LB25F INCA CHECK FOR TOKENS PRECEEDED BY $FF + BEQ LB290 IT WAS PRECEEDED BY $FF +LB262 BSR LB26A SYNTAX CHECK FOR A ‘(‘ + JSR LB156 EVALUATE EXPRESSIONS WITHIN PARENTHESES AT +* HIGHEST PRECEDENCE +LB267 LDB #') SYNTAX CHECK FOR ‘)‘ + FCB SKP2 SKIP 2 BYTES +LB26A LDB #'( SYNTAX CHECK FOR ‘(‘ + FCB SKP2 SKIP 2 BYTES +LB26D LDB #', SYNTAX CHECK FOR COMMA +LB26F CMPB [CHARAD] * COMPARE ACCB TO CURRENT INPUT + BNE LB277 * CHARACTER - SYNTAX ERROR IF NO MATCH + JMP GETNCH GET A CHARACTER FROM BASIC +LB277 LDB #2*1 SYNTAX ERROR + JMP LAC46 JUMP TO ERROR HANDLER + +* PROCESS THE MINUS (UNARY) OPERATOR +LB27C LDA #$7D MINUS (UNARY) PRECEDENCE FLAG + JSR LB15A PROCESS OPERATION FOLLOWING ‘UNARY’ NEGATION + JMP LBEE9 CHANGE SIGN OF FPA0 MANTISSA + +* EVALUATE ALPHA EXPRESSION +LB284 JSR LB357 FIND THE DESCRIPTOR ADDRESS OF A VARIABLE +LB287 STX FPA0+2 SAVE DESCRIPTOR ADDRESS IN FPA0 + LDA VALTYP TEST VARIABLE TYPE + BNE LB222 RETURN IF STRING + JMP LBC14 COPY A FP NUMBER FROM (X) TO FPA0 + +* EVALUATING A SECONDARY TOKEN +LB290 JSR GETNCH GET AN INPUT CHARACTER (SECONDARY TOKEN) + TFR A,B SAVE IT IN ACCB + ASLB X2 & BET RID OF BIT 7 + JSR GETNCH GET ANOTHER INPUT CHARACTER + CMPB #NUM_SEC_FNS-1*2 29 SECONDARY FUNCTIONS - 1 + BLS LB29F BRANCH IF COLOR BASIC TOKEN + JMP LB277 SYNTAX ERROR +LB29F PSHS B SAVE TOKEN OFFSET ON STACK + CMPB #TOK_LEFT-$80*2 CHECK FOR TOKEN WITH AN ARGUMENT + BCS LB2C7 DO SECONDARIES STRING$ OR LESS + CMPB #TOK_INKEY-$80*2 * + BCC LB2C9 * DO SECONDARIES $92 (INKEY$) OR > + BSR LB26A SYNTAX CHECK FOR A ‘(‘ + LDA ,S GET TOKEN NUMBER +* DO SECONDARIES (LEFT$, RIGHT$, MID$) + JSR LB156 EVALUATE FIRST STRING IN ARGUMENT + BSR LB26D SYNTAX CHECK FOR A COMMA + JSR LB146 ‘TM’ ERROR IF NUMERIC VARiABLE + PULS A GET TOKEN OFFSET FROM STACK + LDU FPA0+2 POINT U TO STRING DESCRIPTOR + PSHS U,A SAVE TOKEN OFFSET AND DESCRIPTOR ADDRESS + JSR LB70B EVALUATE FIRST NUMERIC ARGUMENT + PULS A GET TOKEN OFFSET FROM STACK + PSHS B,A SAVE TOKEN OFFSET AND NUMERIC ARGUMENT + FCB $8E OP CODE OF LDX# - SKlP 2 BYTES +LB2C7 BSR LB262 SYNTAX CHECK FOR A ‘(‘ +LB2C9 PULS B GET TOKEN OFFSET + LDX COMVEC+8 GET SECONDARY FUNCTION JUMP TABLE ADDRESS +LB2CE ABX ADD IN COMMAND OFFSET +* +* HERE IS WHERE WE BRANCH TO A SECONDARY FUNCTION + JSR [,X] GO DO AN SECONDARY FUNCTION + JMP LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING + +* LOGICAL OPERATOR ‘OR’ JUMPS HERE +LB2D4 FCB SKP1LD SKIP ONE BYTE - ‘OR’ FLAG = $4F + +* LOGICAL OPERATOR ‘AND’ JUMPS HERE +LB2D5 CLRA AND FLAG = 0 + STA TMPLOC AND/OR FLAG + JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD + STD CHARAC TEMP SAVE ACCD + JSR LBC4A MOVE FPA1 TO FPA0 + JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD + TST TMPLOC CHECK AND/OR FLAG + BNE LB2ED BRANCH IF OR + ANDA CHARAC * ‘AND’ ACCD WITH FPA0 INTEGER + ANDB ENDCHR * STORED IN ENDCHR + BRA LB2F1 CONVERT TO FP +LB2ED ORA CHARAC * ‘OR’ ACCD WITH FPA0 INTEGER + ORB ENDCHR * STORED IN CHARAC +LB2F1 JMP GIVABF CONVERT THE VALUE IN ACCD INTO A FP NUMBER + +* RELATIONAL COMPARISON PROCESS HANDLER +LB2F4 JSR LB148 ‘TM’ ERROR IF TYPE MISMATCH + BNE LB309 BRANCH IF STRING VARIABLE + LDA FP1SGN * ‘PACK’ THE MANTISSA + ORA #$7F * SIGN OF FPA1 INTO + ANDA FPA1 * BIT 7 OF THE + STA FPA1 * MANTISSA MS BYTE + LDX #FP1EXP POINT X TO FPA1 + JSR LBC96 COMPARE FPA0 TO FPA1 + BRA LB33F CHECK TRUTH OF RELATIONAL COMPARISON + +* RELATIONAL COMPARISON OF STRINGS +LB309 CLR VALTYP SET VARIABLE TYPE TO NUMERIC + DEC TRELFL REMOVE STRING TYPE FLAG (BIT0=1 FOR STRINGS) FROM THE +* DESIRED RELATIONAL COMPARISON DATA + JSR LB657 GET LENGTH AND ADDRESS OF STRING WHOSE +* DESCRIPTOR ADDRESS IS IN THE BOTTOM OF FPA0 + STB STRDES * SAVE LENGTH AND ADDRESS IN TEMPORARY + STX STRDES+2 * DESCRIPTOR (STRING B) + LDX FPA1+2 = RETURN LENGTH AND ADDRESS OF STRING + JSR LB659 = WHOSE DESCRIPTOR ADDRESS IS STORED IN FPA1+2 + LDA STRDES LOAD ACCA WITH LENGTH OF STRING B + PSHS B SAVE LENGTH A ON STACK + SUBA ,S+ SUBTRACT LENGTH A FROM LENGTH B + BEQ LB328 BRANCH IF STRINGS OF EQUAL LENGTH + LDA #1 TRUE FLAG + BCC LB328 TRUE IF LENGTH B > LENGTH A + LDB STRDES LOAD ACCB WITH LENGTH B + NEGA SET FLAG = FALSE (1FF) +LB328 STA FP0SGN SAVE TRUE/FALSE FLAG + LDU STRDES+2 POINT U TO START OF STRING + INCB COMPENSATE FOR THE DECB BELOW +* ENTER WITH ACCB CONTAINING LENGTH OF SHORTER STRING +LB32D DECB DECREMENT SHORTER STRING LENGTH + BNE LB334 BRANCH IF ALL OF STRING NOT COMPARED + LDB FP0SGN GET TRUE/FALSE FLAB + BRA LB33F CHECK TRUTH OF RELATIONAL COMPARISON +LB334 LDA ,X+ GET A BYTE FROM STRING A + CMPA ,U+ COMPARE TO STRING B + BEQ LB32D CHECK ANOTHER CHARACTER IF = + LDB #$FF FALSE FLAG IF STRING A > B + BCC LB33F BRANCH IF STRING A > STRING B + NEGB SET FLAG = TRUE + +* DETERMINE TRUTH OF COMPARISON - RETURN RESULT IN FPA0 +LB33F ADDB #1 CONVERT $FF,0,1 TO 0,1,2 + ROLB NOW IT’S 1,2,4 FOR > = < + ANDB RELFLG ‘AND’ THE ACTUAL COMPARISON WITH THE DESIRED - +COMPARISON + BEQ LB348 BRANCH IF FALSE (NO MATCHING BITS) + LDB #$FF TRUE FLAG +LB348 JMP LBC7C CONVERT ACCB INTO FP NUMBER IN FPA0 + +* DIM +LB34B JSR LB26D SYNTAX CHECK FOR COMMA +DIM LDB #1 DIMENSION FLAG + BSR LB35A SAVE ARRAY SPACE FOR THIS VARIABLE + JSR GETCCH GET CURRENT INPUT CHARACTER + BNE LB34B KEEP DIMENSIONING IF NOT END OF LINE + RTS +* EVALUATE A VARIABLE - RETURN X AND +* VARPTR POINTING TO VARIABLE DESCRIPTOR +* EACH VARIABLE REQUIRES 7 BYTES - THE FIRST TWO +* BYTES ARE THE VARIABLE NAME AND THE NEXT 5 +* BYTES ARE THE DESCRIPTOR. IF BIT 7 OF THE +* FIRST BYTE OF VARlABLE NAME IS SET, THE +* VARIABLE IS A DEF FN VARIABLE. IF BIT 7 OF +* THE SECOND BYTE OF VARIABLE NAME IS SET, THE +* VARIABLE IS A STRING, OTHERWISE THE VARIABLE +* IS NUMERIC. +* IF THE VARIABLE IS NOT FOUND, A ZERO VARIABLE IS +* INSERTED INTO THE VARIABLE SPACE +LB357 CLRB DIMENSION FLAG = 0; DO NOT SET UP AN ARRAY + JSR GETCCH GET CURRENT INPUT CHARACTER +LB35A STB DIMFLG SAVE ARRAY FLAG +* ENTRY POINT FOR DEF FN VARIABLE SEARCH +LB35C STA VARNAM SAVE INPUT CHARACTER + JSR GETCCH GET CURRENT INPUT CHARACTER + BSR LB3A2 SET CARRY IF NOT ALPHA + LBCS LB277 SYNTAX ERROR IF NOT ALPHA + CLRB DEFAULT 2ND VARIABLE CHARACTER TO ZERO + STB VALTYP SET VARIABLE TYPE TO NUMERIC + JSR GETNCH GET ANOTHER CHARACTER FROM BASIC + BCS LB371 BRANCH IF NUMERIC (2ND CHARACTER IN +* VARIABLE MAY BE NUMERIC) + BSR LB3A2 SET CARRY IF NOT ALPHA + BCS LB37B BRANCH IF NOT ALPHA +LB371 TFR A,B SAVE 2ND CHARACTER IN ACCB +* READ INPUT CHARACTERS UNTIL A NON ALPHA OR +* NON NUMERIC IS FOUND - IGNORE ALL CHARACTERS +* IN VARIABLE NAME AFTER THE 1ST TWO +LB373 JSR GETNCH GET AN INPUT CHARACTER + BCS LB373 BRANCH IF NUMERIC + BSR LB3A2 SET CARRY IF NOT ALPHA + BCC LB373 BRANCH IF ALPHA +LB37B CMPA #'$ CHECK FOR A STRING VARIABLE + BNE LB385 BRANCH IF IT IS NOT A STRING + COM VALTYP SET VARIABLE TYPE TO STRING + ADDB #$80 SET BIT 7 OF 2ND CHARACTER (STRING) + JSR GETNCH GET AN INPUT CHARACTER +LB385 STB VARNAM+1 SAVE 2ND CHARACTER IN VARNAM+1 + ORA ARYDIS OR IN THE ARRAY DISABLE FLAG - IF = $80, +* DON’T SEARCH FOR VARIABLES IN THE ARRAYS + SUBA #'( IS THIS AN ARRAY VARIABLE? + LBEQ LB404 BRANCH IF IT IS + CLR ARYDIS RESET THE ARRAY DISABLE FLAG + LDX VARTAB POINT X TO THE START OF VARIABLES + LDD VARNAM GET VARIABLE IN QUESTION +LB395 CMPX ARYTAB COMPARE X TO THE END OF VARIABLES + BEQ LB3AB BRANCH IF END OF VARIABLES + CMPD ,X++ * COMPARE VARIABLE IN QUESTION TO CURRENT + BEQ LB3DC * VARIABLE AND BRANCH IF MATCH + LEAX 5,X = MOVE POINTER TO NEXT VARIABLE AND + BRA LB395 = KEEP LOOKING + +* SET CARRY IF NOT UPPER CASE ALPHA +LB3A2 CMPA #'A * CARRY SET IF < ‘A’ + BCS LB3AA * + SUBA #'Z+1 = +* SUBA #-('Z+1) = CARRY CLEAR IF <= 'Z' + FCB $80,$A5 +LB3AA RTS +* PUT A NEW VARIABLE IN TABLE OF VARIABLES +LB3AB LDX #ZERO POINT X TO ZERO LOCATION + LDU ,S GET CURRENT RETURN ADDRESS + CMPU #LB287 DID WE COME FROM ‘EVALUATE ALPHA EXPR’? + BEQ LB3DE YES - RETURN A ZERO VALUE + LDD ARYEND * GET END OF ARRAYS ADDRESS AND + STD V43 * SAVE IT AT V43 + ADDD #7 = ADD 7 TO END OF ARRAYS (EACH + STD V41 = VARIABLE = 7 BYTES) AND SAVE AT V41 + LDX ARYTAB * GET END OF VARIABLES AND SAVE AT V47 + STX V47 * + JSR LAC1E MAKE A SEVEN BYTE SLOT FOR NEW VARIABLE AT +* TOP OF VARIABLES + LDX V41 = GET NEW END OF ARRAYS AND SAVE IT + STX ARYEND = + LDX V45 * GET NEW END OF VARIABLES AND SAVE IT + STX ARYTAB * + LDX V47 GET OLD END OF VARIABLES + LDD VARNAM GET NEW VARIABLE NAME + STD ,X++ SAVE VARIABLE NAME + CLRA * ZERO OUT THE FP VALUE OF THE NUMERIC + CLRB * VARIABLE OR THE LENGTH AND ADDRESS + STD ,X * OF A STRING VARIABLE + STD 2,X * + STA 4,X * +LB3DC STX VARPTR STORE ADDRESS OF VARIABLE VALUE +LB3DE RTS +* +LB3DF FCB $90,$80,$00,$00,$00 * FLOATING POINT -32768 +* SMALLEST SIGNED TWO BYTE INTEGER +* +LB3E4 JSR GETNCH GET AN INPUT CHARACTER FROM BASIC +LB3E6 JSR LB141 GO EVALUATE NUMERIC EXPRESSION +LB3E9 LDA FP0SGN GET FPA0 MANTISSA SIGN + BMI LB44A ‘FC’ ERROR IF NEGATIVE NUMBER + + +INTCNV JSR LB143 ‘TM’ ERROR IF STRING VARIABLE + LDA FP0EXP GET FPA0 EXPONENT + CMPA #$90 * COMPARE TO 32768 - LARGEST INTEGER EXPONENT AND + BCS LB3FE * BRANCH IF FPA0 < 32768 + LDX #LB3DF POINT X TO FP VALUE OF -32768 + JSR LBC96 COMPARE -32768 TO FPA0 + BNE LB44A ‘FC’ ERROR IF NOT = +LB3FE JSR LBCC8 CONVERT FPA0 TO A TWO BYTE INTEGER + LDD FPA0+2 GET THE INTEGER + RTS +* EVALUATE AN ARRAY VARIABLE +LB404 LDD DIMFLG GET ARRAY FLAG AND VARIABLE TYPE + PSHS B,A SAVE THEM ON STACK + NOP DEAD SPACE CAUSED BY 1.2 REVISION + CLRB RESET DIMENSION COUNTER +LB40A LDX VARNAM GET VARIABLE NAME + PSHS X,B SAVE VARIABLE NAME AND DIMENSION COUNTER + BSR LB3E4 EVALUATE EXPRESSION (DIMENSlON LENGTH) + PULS B,X,Y PULL OFF VARIABLE NAME, DIMENSlON COUNTER, +* ARRAY FLAG + STX VARNAM SAVE VARIABLE NAME AND VARIABLE TYPE + LDU FPA0+2 GET DIMENSION LENGTH + PSHS U,Y SAVE DIMENSION LENGTH, ARRAY FLAG, VARIABLE TYPE + INCB INCREASE DIMENSION COUNTER + JSR GETCCH GET CURRENT INPUT CHARACTER + CMPA #', CHECK FOR ANOTHER DIMENSION + BEQ LB40A BRANCH IF MORE + STB TMPLOC SAVE DIMENSION COUNTER + JSR LB267 SYNTAX CHECK FOR A ‘)‘ + PULS A,B * RESTORE VARIABLE TYPE AND ARRAY + STD DIMFLG * FLAG - LEAVE DIMENSION LENGTH ON STACK + LDX ARYTAB GET START OF ARRAYS +LB42A CMPX ARYEND COMPARE TO END OF ARRAYS + BEQ LB44F BRANCH IF NO MATCH FOUND + LDD VARNAM GET VARIABLE IN QUESTION + CMPD ,X COMPARE TO CURRENT VARIABLE + BEQ LB43B BRANCH IF = + LDD 2,X GET OFFSET TO NEXT ARRAY VARIABLE + LEAX D,X ADD TO CURRENT POINTER + BRA LB42A KEEP SEARCHING +LB43B LDB #2*9 ‘REDIMENSIONED ARRAY’ ERROR + LDA DIMFLG * TEST ARRAY FLAG - IF <>0 YOU ARE TRYING + BNE LB44C * TO REDIMENSION AN ARRAY + LDB TMPLOC GET NUMBER OF DIMENSIONS IN ARRAY + CMPB 4,X COMPARE TO THIS ARRAYS DIMENSIONS + BEQ LB4A0 BRANCH IF = +LB447 LDB #8*2 ‘BAD SUBSCRIPT’ + FCB SKP2 SKIP TWO BYTES +LB44A LDB #4*2 ‘ILLEGAL FUNCTION CALL’ +LB44C JMP LAC46 JUMP TO ERROR SERVICING ROUTINE + +* INSERT A NEW ARRAY INTO ARRAY VARIABLES +* EACH SET OF ARRAY VARIABLES IS PRECEEDED BY A DE- +* SCRIPTOR BLOCK COMPOSED OF 5+2*N BYTES WHERE N IS THE +* NUMBER OF DIMENSIONS IN THE ARRAY. THE BLOCK IS DEFINED +* AS FOLLOWS: BYTES 0,1:VARIABLE’S NAME; 2,3:TOTAL LENGTH +* OF ARRAY ITEMS AND DESCRIPTOR BLOCK; 4:NUMBER OF DIMEN- +* ISIONS; 5,6:LENGTH OF DIMENSION 1; 7,8:LENGTH OF DIMEN- +* SION 2;… 4+N,5+N:LENGTH OF DIMENSION N. + +LB44F LDD #5 * 5 BYTES/ARRAY ENTRY SAVE AT COEFPT + STD COEFPT * + LDD VARNAM = GET NAME OF ARRAY AND SAVE IN + STD ,X = FIRST 2 BYTES OF DESCRIPTOR + LDB TMPLOC GET NUMBER OF DIMENSIONS AND SAVE IN + STB 4,X * 5TH BYTE OF DESCRIPTOR + JSR LAC33 CHECK FOR ROOM FOR DESCRIPTOR IN FREE RAM + STX V41 TEMPORARILY SAVE DESCRIPTOR ADDRESS +LB461 LDB #11 * DEFAULT DIMENSION VALUE:X(10) + CLRA * + TST DIMFLG = CHECK ARRAY FLAG AND BRANCH IF + BEQ LB46D = NOT DIMENSIONING AN ARRAY + PULS A,B GET DIMENSION LENGTH + ADDD #1 ADD ONE (X(0) HAS A LENGTH OF ONE) +LB46D STD 5,X SAVE LENGTH OF ARRAY DIMENSION + BSR LB4CE MULTIPLY ACCUM ARRAY SIZE NUMBER LENGTH +* OF NEW DIMENSION + STD COEFPT TEMP STORE NEW CURRENT ACCUMULATED ARRAY SIZE + LEAX 2,X BUMP POINTER UP TWO + DEC TMPLOC * DECREMENT DIMENSION COUNTER AND BRANCH IF + BNE LB461 * NOT DONE WITH ALL DIMENSIONS + STX TEMPTR SAVE ADDRESS OF (END OF ARRAY DESCRIPTOR - 5) + ADDD TEMPTR ADD TOTAL SIZE OF NEW ARRAY + LBCS LAC44 ‘OM’ ERROR IF > $FFFF + TFR D,X SAVE END OF ARRAY IN X + JSR LAC37 MAKE SURE THERE IS ENOUGH FREE RAM FOR ARRAY + SUBD #STKBUF-5 SUBTRACT OUT THE (STACK BUFFER - 5) + STD ARYEND SAVE NEW END OF ARRAYS + CLRA ZERO = TERMINATOR BYTE +LB48C LEAX -1,X * STORE TWO TERMINATOR BYTES AT + STA 5,X * THE END OF THE ARRAY DESCRIPTOR + CMPX TEMPTR * + BNE LB48C * + LDX V41 GET ADDRESS OF START OF DESCRIPTOR + LDA ARYEND GET MSB OF END OF ARRAYS; LSB ALREADY THERE + SUBD V41 SUBTRACT OUT ADDRESS OF START OF DESCRIPTOR + STD 2,X SAVE LENGTH OF (ARRAY AND DESCRIPTOR) + LDA DIMFLG * GET ARRAY FLAG AND BRANCH + BNE LB4CD * BACK IF DIMENSIONING +* CALCULATE POINTER TO CORRECT ELEMENT +LB4A0 LDB 4,X GET THE NUMBER OF DIMENSIONS + STB TMPLOC TEMPORARILY SAVE + CLRA * INITIALIZE POINTER + CLRB * TO ZERO +LB4A6 STD COEFPT SAVE ACCUMULATED POINTER + PULS A,B * PULL DIMENSION ARGUMENT OFF THE + STD FPA0+2 * STACK AND SAVE IT + CMPD 5,X COMPARE TO STORED ‘DIM’ ARGUMENT + BCC LB4EB ‘BS’ ERROR IF > = "DIM" ARGUMENT + LDU COEFPT * GET ACCUMULATED POINTER AND + BEQ LB4B9 * BRANCH IF 1ST DIMENSION + BSR LB4CE = MULTIPLY ACCUMULATED POINTER AND DIMENSION + ADDD FPA0+2 = LENGTH AND ADD TO CURRENT ARGUMENT +LB4B9 LEAX 2,X MOVE POINTER TO NEXT DIMENSION + DEC TMPLOC * DECREMENT DIMENSION COUNTER AND + BNE LB4A6 * BRANCH IF ANY DIMENSIONS LEFT +* MULTIPLY ACCD BY 5 - 5 BYTES/ARRAY VALUE + STD ,--S + ASLB + ROLA TIMES 2 + ASLB + ROLA TIMES 4 + ADDD ,S++ TIMES 5 + LEAX D,X ADD OFFSET TO START OF ARRAY + LEAX 5,X ADJUST POINTER FOR SIZE OF DESCRIPTOR + STX VARPTR SAVE POINTER TO ARRAY VALUE +LB4CD RTS +* MULTIPLY 2 BYTE NUMBER IN 5,X BY THE 2 BYTE NUMBER +* IN COEFPT. RETURN RESULT IN ACCD, BS ERROR IF > $FFFF +LB4CE LDA #16 16 SHIFTS TO DO A MULTIPLY + STA V45 SHIFT COUNTER + LDD 5,X * GET SIZE OF DIMENSION + STD BOTSTK * AND SAVE IT + CLRA * ZERO + CLRB * ACCD +LB4D8 ASLB = SHIFT ACCB LEFT + ROLA = ONE BIT + BCS LB4EB BS' ERROR IF CARRY + ASL COEFPT+1 * SHIFT MULTIPLICAND LEFT ONE + ROL COEFPT * BIT - ADD MULTIPLIER TO ACCUMULATOR + BCC LB4E6 * IF CARRY <> 0 + ADDD BOTSTK ADD MULTIPLIER TO ACCD + BCS LB4EB BS' ERROR IF CARRY (>$FFFF) +LB4E6 DEC V45 * DECREMENT SHIFT COUNTER + BNE LB4D8 * IF NOT DONE + RTS +LB4EB JMP LB447 BS' ERROR +* +* MEM +* THIS IS NOT A TRUE INDICATOR OF FREE MEMORY BECAUSE +* BASIC REQUIRES A STKBUF SIZE BUFFER FOR THE STACK +* FOR WHICH MEM DOES NOT ALLOW. +* +MEM TFR S,D PUT STACK POINTER INTO ACCD + SUBD ARYEND SUBTRACT END OF ARRAYS + FCB SKP1 SKIP ONE BYTE +*CONVERT THE VALUE IN ACCB INTO A FP NUMBER IN FPA0 +LB4F3 CLRA CLEAR MS BYTE OF ACCD +* CONVERT THE VALUE IN ACCD INTO A FLOATING POINT NUMBER IN FPA0 +GIVABF CLR VALTYP SET VARIABLE TYPE TO NUMERIC + STD FPA0 SAVE ACCD IN TOP OF FACA + LDB #$90 EXPONENT REQUIRED IF THE TOP TWO BYTES +* OF FPA0 ARE TO BE TREATED AS AN INTEGER IN FPA0 + JMP LBC82 CONVERT THE REST OF FPA0 TO AN INTEGER + +* STR$ +STR JSR LB143 TM' ERROR IF STRING VARIABLE + LDU #STRBUF+2 *CONVERT FP NUMBER TO ASCII STRING IN + JSR LBDDC *THE STRING BUFFER + LEAS 2,S PURGE THE RETURN ADDRESS FROM THE STACK + LDX #STRBUF+1 *POINT X TO STRING BUFFER AND SAVE + BRA LB518 *THE STRING IN THE STRING SPACE +* RESERVE ACCB BYTES OF STRING SPACE. RETURN START +* ADDRESS IN (X) AND FRESPC +LB50D STX V4D SAVE X IN V4D +LB50F BSR LB56D RESERVE ACCB BYTES IN STRING SPACE +LB511 STX STRDES+2 SAVE NEW STRING ADDRESS + STB STRDES SAVE LENGTH OF RESERVED BLOCK + RTS +LB516 LEAX -1,X MOVE POINTER BACK ONE +* SCAN A LINE FROM (X) UNTIL AN END OF LINE FLAG (ZERO) OR +* EITHER OF THE TWO TERMINATORS STORED IN CHARAC OR ENDCHR IS MATCHED. +* THE RESULTING STRING IS STORED IN THE STRING SPACE +* ONLY IF THE START OF THE STRING IS <= STRBUF+2 +LB518 LDA #'" * INITIALIZE + STA CHARAC * TERMINATORS +LB51A STA ENDCHR * TO " +LB51E LEAX 1,X MOVE POINTER UP ONE + STX RESSGN TEMPORARILY SAVE START OF STRING + STX STRDES+2 SAVE START OF STRING IN TEMP DESCRIPTOR + LDB #-1 INITIALIZE CHARACTER COUNTER TO - 1 +LB526 INCB INCREMENT CHARACTER COUNTER + LDA ,X+ GET CHARACTER + BEQ LB537 BRANCH IF END OF LINE + CMPA CHARAC * CHECK FOR TERMINATORS + BEQ LB533 * IN CHARAC AND ENDCHR + CMPA ENDCHR * DON’T MOVE POINTER BACK + BNE LB526 * ONE IF TERMINATOR IS "MATCHED" +LB533 CMPA #'" = COMPARE CHARACTER TO STRING DELIMITER + BEQ LB539 = & DON’T MOVE POINTER BACK IF SO +LB537 LEAX -1,X MOVE POINTER BACK ONE +LB539 STX COEFPT SAVE END OF STRING ADDRESS + STB STRDES SAVE STRING LENGTH IN TEMP DESCRIPTOR + LDU RESSGN GET INITlAL STRING START + CMPU #STRBUF+2 COMPARE TO START OF STRING BUFFER +LB543 BHI LB54C BRANCH IF > START OF STRING BUFFER + BSR LB50D GO RESERVE SPACE FOR THE STRING + LDX RESSGN POINT X TO THE BEGINNING OF THE STRING + JSR LB645 MOVE (B) BYTES FROM (X) TO +* [FRESPC] - MOVE STRING DATA +* PUT DIRECT PAGE STRING DESCRIPTOR BUFFER DATA +* ON THE STRING STACK. SET VARIABLE TYPE TO STRING +LB54C LDX TEMPPT GET NEXT AVAILABLE STRING STACK DESCRIPTOR + CMPX #LINHDR COMPARE TO TOP OF STRING DESCRIPTOR STACK - WAS #CFNBUF + BNE LB558 FORMULA O.K. + LDB #15*2 STRING FORMULA TOO COMPLEX' ERROR +LB555 JMP LAC46 JUMP TO ERROR SERVICING ROUTINE +LB558 LDA STRDES * GET LENGTH OF STRING AND SAVE IT +* STA ,X * IN BYTE 0 OF DESCRIPTOR + FCB $A7,$00 + LDD STRDES+2 = GET START ADDRESS OF ACTUAL STRING + STD 2,X = AND SAVE IN BYTES 2,3 OF DESCRIPTOR + LDA #$FF * VARIABLE TYPE = STRING + STA VALTYP * SAVE IN VARIABLE TYPE FLAG + STX LASTPT = SAVE START OF DESCRIPTOR + STX FPA0+2 = ADDRESS IN LASTPT AND FPA0 + LEAX 5,X 5 BYTES/STRING DESCRIPTOR + STX TEMPPT NEXT AVAILABLE STRING VARIABLE DESCRIPTOR + RTS +* RESERVE ACCB BYTES IN STRING STORAGE SPACE +* RETURN WITH THE STARTING ADDRESS OF THE +* RESERVED STRING SPACE IN (X) AND FRESPC +LB56D CLR GARBFL CLEAR STRING REORGANIZATION FLAG +LB56F CLRA * PUSH THE LENGTH OF THE + PSHS B,A * STRING ONTO THE STACK + LDD STRTAB GET START OF STRING VARIABLES + SUBD ,S+ SUBTRACT STRING LENGTH + CMPD FRETOP COMPARE TO START OF STRING STORAGE + BCS LB585 IF BELOW START, THEN REORGANIZE + STD STRTAB SAVE NEW START OF STRING VARIABLES + LDX STRTAB GET START OF STRING VARIABLES + LEAX 1,X ADD ONE + STX FRESPC SAVE START ADDRESS OF NEWLY RESERVED SPACE + PULS B,PC RESTORE NUMBER OF BYTES RESERVED AND RETURN +LB585 LDB #2*13 OUT OF STRING SPACE' ERROR + COM GARBFL TOGGLE REORGANIZATiON FLAG + BEQ LB555 ERROR IF FRESHLY REORGANIZED + BSR LB591 GO REORGANIZE STRING SPACE + PULS B GET BACK THE NUMBER OF BYTES TO RESERVE + BRA LB56F TRY TO RESERVE ACCB BYTES AGAIN +* REORGANIZE THE STRING SPACE +LB591 LDX MEMSIZ GET THE TOP OF STRING SPACE +LB593 STX STRTAB SAVE TOP OF UNORGANIZED STRING SPACE + CLRA * ZERO OUT ACCD + CLRB * AND RESET VARIABLE + STD V4B * POINTER TO 0 + LDX FRETOP POINT X TO START OF STRING SPACE + STX V47 SAVE POINTER IN V47 + LDX #STRSTK POINT X TO START OF STRING DESCRIPTOR STACK +LB5A0 CMPX TEMPPT COMPARE TO ADDRESS OF NEXT AVAILABLE DESCRIPTOR + BEQ LB5A8 BRANCH IF TOP OF STRING STACK + BSR LB5D8 CHECK FOR STRING IN UNORGANIZED STRING SPACE + BRA LB5A0 KEEP CHECKING +LB5A8 LDX VARTAB GET THE END OF BASIC PROGRAM +LB5AA CMPX ARYTAB COMPARE TO END OF VARIABLES + BEQ LB5B2 BRANCH IF AT TOP OF VARIABLES + BSR LB5D2 CHECK FOR STRING IN UNORGANIZED STRING SPACE + BRA LB5AA KEEP CHECKING VARIABLES +LB5B2 STX V41 SAVE ADDRESS OF THE END OF VARIABLES +LB5B4 LDX V41 GET CURRENT ARRAY POINTER +LB5B6 CMPX ARYEND COMPARE TO THE END OF ARRAYS + BEQ LB5EF BRANCH IF AT END OF ARRAYS + LDD 2,X GET LENGTH OF ARRAY AND DESCRIPTOR + ADDD V41 * ADD TO CURRENT ARRAY POINTER + STD V41 * AND SAVE IT + LDA 1,X GET 1ST CHARACTER OF VARIABLE NAME + BPL LB5B4 BRANCH IF NUMERIC ARRAY + LDB 4,X GET THE NUMBER OF DIMENSIONS IN THIS ARRAY + ASLB MULTIPLY BY 2 + ADDB #5 ADD FIVE BYTES (VARIABLE NAME, ARRAY +* LENGTH, NUMBER DIMENSIONS) + ABX X NOW POINTS TO START OF ARRAY ELEMENTS +LB5CA CMPX V41 AT END OF THIS ARRAY? + BEQ LB5B6 YES - CHECK FOR ANOTHER + BSR LB5D8 CHECK FOR STRING LOCATED IN +* UNORGANIZED STRING SPACE + BRA LB5CA KEEP CHECKING ELEMENTS IN THIS ARRAY +LB5D2 LDA 1,X GET F1RST BYTE OF VARIABLE NAME + LEAX 2,X MOVE POINTER TO DESCRIPTOR + BPL LB5EC BRANCH IF VARIABLE IS NUMERIC +* SEARCH FOR STRING - ENTER WITH X POINTING TO +* THE STRING DESCRIPTOR. IF STRING IS STORED +* BETWEEN V47 AND STRTAB, SAVE DESCRIPTOR POINTER +* IN V4B AND RESET V47 TO STRING ADDRESS +LB5D8 LDB ,X GET THE LENGTH OF THE STRING + BEQ LB5EC BRANCH IF NULL - NO STRING + LDD 2,X GET STARTING ADDRESS OF THE STRING + CMPD STRTAB COMPARE TO THE START OF STRING VARIABLES + BHI LB5EC BRANCH IF THIS STRING IS STORED IN +* THE STRING VARIABLES + CMPD V47 COMPARE TO START OF STRING SPACE + BLS LB5EC BRANCH IF NOT STORED IN THE STRING SPACE + STX V4B SAVE VARIABLE POINTER IF STORED IN STRING SPACE + STD V47 SAVE STRING STARTING ADDRESS +LB5EC LEAX 5,X MOVE TO NEXT VARIABLE DESCRIPTOR +LB5EE RTS +LB5EF LDX V4B GET ADDRESS OF THE DESCRIPTOR FOR THE +* STRING WHICH IS STORED IN THE HIGHEST RAM ADDRESS IN +* THE UNORGANIZED STRING SPACE + BEQ LB5EE BRANCH IF NONE FOUND AND REORGANIZATION DONE + CLRA CLEAR MS BYTE OF LENGTH + LDB ,X GET LENGTH OF STRING + DECB SUBTRACT ONE + ADDD V47 ADD LENGTH OF STRING TO ITS STARTING ADDRESS + STD V43 SAVE AS MOVE STARTING ADDRESS + LDX STRTAB POINT X TO THE START OF ORGANIZED STRING VARIABLES + STX V41 SAVE AS MOVE ENDING ADDRESS + JSR LAC20 MOVE STRING FROM CURRENT POSITION TO THE +* TOP OF UNORGANIZED STRING SPACE + LDX V4B POINT X TO STRING DESCRIPTOR + LDD V45 * GET NEW STARTING ADDRESS OF STRING AND + STD 2,X * SAVE IT IN DESCRIPTOR + LDX V45 GET NEW TOP OF UNORGANIZED STRING SPACE + LEAX -1,X MOVE POINTER BACK ONE + JMP LB593 JUMP BACK AND REORGANIZE SOME MORE + + +LB60F LDD FPA0+2 * GET DESCRIPTOR ADDRESS OF STRING A + PSHS B,A * AND SAVE IT ON THE STACK + JSR LB223 GET DESCRIPTOR ADDRESS OF STRING B + JSR LB146 TM' ERROR IF NUMERIC VARIABLE + PULS X * POINT X TO STRING A DESCRIPTOR + STX RESSGN * ADDRESS AND SAVE IT IN RESSGN + LDB ,X GET LENGTH OF STRING A + LDX FPA0+2 POINT X TO DESCRIPTOR OF STRING B + ADDB ,X ADD LENGTH OF STRING B TO STR1NG A + BCC LB62A BRANCH IF LENGTH < 256 + LDB #2*14 STRING TOO LONG' ERROR IF LENGTH > 255 + JMP LAC46 JUMP TO ERROR SERVICING ROUTINE +LB62A JSR LB50D RESERVE ROOM IN STRING SPACE FOR NEW STRING + LDX RESSGN GET DESCRIPTOR ADDRESS OF STRING A + LDB ,X GET LENGTH OF STRING A + BSR LB643 MOVE STRING A INTO RESERVED BUFFER IN STRING SPACE + LDX V4D GET DESCRIPTOR ADDRESS OF STRING B + BSR LB659 GET LENGTH AND ADDRESS OF STRING B + BSR LB645 MOVE STRING B INTO REST OF RESERVED BUFFER + LDX RESSGN POINT X TO DESCRIPTOR OF STRING A + BSR LB659 DELETE STRING A IF LAST STRING ON STRING STACK + JSR LB54C PUT STRING DESCRIPTOR ON THE STRING STACK + JMP LB168 BRANCH BACK TO EXPRESSION EVALUATION + +* MOVE (B) BYTES FROM 2,X TO FRESPC +LB643 LDX 2,X POINT X TO SOURCE ADDRESS +LB645 LDU FRESPC POINT U TO DESTINATION ADDRESS + INCB COMPENSATION FOR THE DECB BELOW + BRA LB64E GO MOVE THE BYTES +* MOVE B BYTES FROM (X) TO (U) +LB64A LDA ,X+ * GET A SOURCE BYTE AND MOVE IT + STA ,U+ * TO THE DESTINATION +LB64E DECB DECREMENT BYTE COUNTER + BNE LB64A BRANCH IF ALL BYTES NOT MOVED + STU FRESPC SAVE ENDING ADDRESS IN FRESPC + RTS +* RETURN LENGTH (ACCB) AND ADDRESS (X) OF +* STRING WHOSE DESCRIPTOR IS IN FPA0+2 +* DELETE THE STRING IF IT IS THE LAST ONE +* PUT ON THE STRING STACK. REMOVE STRING FROM STRING +* SPACE IF IT IS AT THE BOTTOM OF STRING VARIABLES. +LB654 JSR LB146 TM' ERROR IF VARIABLE TYPE = NUMERIC +LB657 LDX FPA0+2 GET ADDRESS OF SELECTED STRING DESCRIPTOR +LB659 LDB ,X GET LENGTH OF STRING + BSR LB675 * CHECK TO SEE IF THIS STRING DESCRIPTOR WAS + BNE LB672 * THE LAST ONE PUT ON THE STRING STACK AND +* * BRANCH IF NOT + LDX 5+2,X GET START ADDRESS OF STRING JUST REMOVED + LEAX -1,X MOVE POINTER DOWN ONE + CMPX STRTAB COMPARE TO START OF STRING VARIABLES + BNE LB66F BRANCH IF THIS STRING IS NOT AT THE BOTTOM +* OF STRING VARIABLES + PSHS B SAVE LENGTH; ACCA WAS CLEARED + ADDD STRTAB * ADD THE LENGTH OF THE JUST REMOVED STRING + STD STRTAB * TO THE START OF STRING VARIABLES - THIS WILL +* * REMOVE THE STRING FROM THE STRING SPACE + PULS B RESTORE LENGTH +LB66F LEAX 1,X ADD ONE TO POINTER + RTS +LB672 LDX 2,X *POINT X TO ADDRESS OF STRING NOT + RTS *ON THE STRING STACK +* REMOVE STRING FROM STRING STACK. ENTER WITH X +* POINTING TO A STRING DESCRIPTOR - DELETE THE +* STRING FROM STACK IF IT IS ON TOP OF THE +* STACK. IF THE STRING IS DELETED, SET THE ZERO FLAG +LB675 CMPX LASTPT *COMPARE TO LAST USED DESCRIPTOR ADDRESS + BNE LB680 *ON THE STRING STACK, RETURN IF DESCRIPTOR +* *ADDRESS NOT ON THE STRING STACK + STX TEMPPT SAVE LAST USED DESCRIPTOR AS NEXT AVAILABLE + LEAX -5,X * MOVE LAST USED DESCRIPTOR BACK 5 BYTES + STX LASTPT * AND SAVE AS THE LAST USED DESCRIPTOR ADDR + CLRA SET ZERO FLAG +LB680 RTS + +* LEN +LEN BSR LB686 POINT X TO PROPER STRING AND GET LENGTH +LB683 JMP LB4F3 CONVERT ACCB TO FP NUMBER IN FPA0 +* POINT X TO STRING ADDRESS LOAD LENGTH INTO +* ACCB. ENTER WITH THE STRING DESCRIPTOR IN +* BOTTOM TWO BYTES OF FPA0 +LB686 BSR LB654 GET LENGTH AND ADDRESS OF STRING + CLR VALTYP SET VARIABLE TYPE TO NUMERIC + TSTB SET FLAGS ACCORDING TO LENGTH + RTS + +* CHR$ +CHR JSR LB70E CONVERT FPA0 TO AN INTEGER IN ACCD +LB68F LDB #1 * RESERVE ONE BYTE IN + JSR LB56D * THE STRING SPACE + LDA FPA0+3 GET ASCII STRING VALUE + JSR LB511 SAVE RESERVED STRING DESCRIPTOR IN TEMP DESCRIPTOR + STA ,X SAVE THE STRING (IT’S ONLY ONE BYTE) +LB69B LEAS 2,S PURGE THE RETURN ADDRESS OFF OF THE STACK +LB69D JMP LB54C PUT TEMP DESCRIPTOR DATA ONTO STRING STACK + + +ASC BSR LB6A4 PUT 1ST CHARACTER OF STRING INTO ACCB + BRA LB683 CONVERT ACCB INTO FP NUMBER IN FPA0 +LB6A4 BSR LB686 POINT X TO STRING DESCRIPTOR + BEQ LB706 FC' ERROR IF NULL STRING + LDB ,X GET FIRST BYTE OF STRING + RTS + + +LEFT BSR LB6F5 GET ARGUMENTS FROM STACK +LB6AD CLRA CLEAR STRING POINTER OFFSET - OFFSET = 0 FOR LEFT$ +LB6AE CMPB ,X * COMPARE LENGTH PARAMETER TO LENGTH OF + BLS LB6B5 * STRING AND BRANCH IF LENGTH OF STRING +* >= LENGTH PARAMETER + LDB ,X USE LENGTH OF STRING OTHERWISE + CLRA CLEAR STRING POINTER OFFSET (0 FOR LEFT$) +LB6B5 PSHS B,A PUSH PARAMETERS ONTO STACK + JSR LB50F RESERVE ACCB BYTES IN THE STRING SPACE + LDX V4D POINT X TO STRING DESCRIPTOR + BSR LB659 GET ADDRESS OF OLD STRING (X=ADDRESS) + PULS B * PULL STRING POINTER OFFSET OFF OF THE STACK + ABX * AND ADD IT TO STRING ADDRESS + PULS B PULL LENGTH PARAMETER OFF OF THE STACK + JSR LB645 MOVE ACCB BYTES FROM (X) TO [FRESPC] + BRA LB69D PUT TEMP STRING DESCRIPTOR ONTO THE STRING STACK + +* RIGHT$ +RIGHT BSR LB6F5 GET ARGUMENTS FROM STACK + SUBA ,X ACCA=LENGTH PARAMETER - LENGTH OF OLD STRING + NEGA NOW ACCA = LENGTH OF OLD STRING + BRA LB6AE PUT NEW STRING IN THE STRING SPACE + +* MID$ +MID LDB #$FF * GET DEFAULT VALUE OF LENGTH AND + STB FPA0+3 * SAVE IT IN FPA0 + JSR GETCCH GET CURRENT CHARACTER FROM BASIC + CMPA #') ARGUMENT DELIMITER? + BEQ LB6DE YES - NO LENGTH PARAMETER GIVEN + JSR LB26D SYNTAX CHECK FOR COMMA + BSR LB70B EVALUATE NUMERIC EXPRESSION (LENGTH) +LB6DE BSR LB6F5 GET ARGUMENTS FROM STACK + BEQ LB706 FC' ERROR IF NULL STRING + CLRB CLEAR LENGTH COUNTER (DEFAULT VALUE) + DECA *SUOTRACT ONE FROM POSITION PARAMETER (THESE + CMPA ,X *ROUTINES EXPECT 1ST POSITION TO BE ZERO, NOT ONE) +* *AND COMPARE IT TO LENGTH OF OLD STRING + BCC LB6B5 IF POSITION > LENGTH OF OLD STRING, THEN NEW +* STRING WILL BE A NULL STRING + TFR A,B SAVE ABSOLUTE POSITION PARAMETER IN ACCB + SUBB ,X ACCB=POSITION-LENGTH OF OLD STRING + NEGB NOW ACCB=LENGTH OF OLDSTRING-POSITION + CMPB FPA0+3 *IF THE AMOUNT OF OLD STRING TO THE RIGHT OF + BLS LB6B5 *POSITION IS <= THE LENGTH PARAMETER, BRANCH AND +* USE ALL OF THE STRING TO THE RIGHT OF THE POSITION +* INSTEAD OF THE LENGTH PARAMETER + LDB FPA0+3 GET LENGTH OF NEW STRING + BRA LB6B5 PUT NEW STRING IN STRING SPACE +* DO A SYNTAX CHECK FOR ")", THEN PULL THE PREVIOUSLY CALCULATED NUMERIC +* ARGUMENT (ACCD) AND STRING ARGUMENT DESCRIPTOR ADDR OFF OF THE STACK +LB6F5 JSR LB267 SYNTAX CHECK FOR A ")" + LDU ,S LOAD THE RETURN ADDRESS INTO U REGISTER + LDX 5,S * GET ADDRESS OF STRING AND + STX V4D * SAVE IT IN V4D + LDA 4,S = PUT LENGTH OF STRING IN + LDB 4,S = BOTH ACCA AND ACCB + LEAS 7,S REMOVE DESCRIPTOR AND RETURN ADDRESS FROM STACK + TFR U,PC JUMP TO ADDRESS IN U REGISTER +LB706 JMP LB44A ILLEGAL FUNCTION CALL' +* EVALUATE AN EXPRESSION - RETURN AN INTEGER IN +* ACCB - 'FC' ERROR IF EXPRESSION > 255 +LB709 JSR GETNCH GET NEXT BASIC INPUT CHARACTER +LB70B JSR LB141 EVALUATE A NUMERIC EXPRESSION +LB70E JSR LB3E9 CONVERT FPA0 TO INTEGER IN ACCD + TSTA TEST MS BYTE OF INTEGER + BNE LB706 FC' ERROR IF EXPRESSION > 255 + JMP GETCCH GET CURRENT INPUT CHARACTER FROM BASIC + +* VAL +VAL JSR LB686 POINT X TO STRING ADDRESS + LBEQ LBA39 IF NULL STRING SET FPA0 + LDU CHARAD SAVE INPUT POINTER IN REGISTER U + STX CHARAD POINT INPUT POINTER TO ADDRESS OF STRING + ABX MOVE POINTER TO END OF STRING TERMINATOR + LDA ,X GET LAST BYTE OF STRING + PSHS U,X,A SAVE INPUT POINTER, STRING TERMINATOR +* ADDRESS AND CHARACTER + CLR ,X CLEAR STRING TERMINATOR : FOR ASCII - FP CONVERSION + JSR GETCCH GET CURRENT CHARACTER FROM BASIC + JSR LBD12 CONVERT AN ASCII STRING TO FLOATING POINT + PULS A,X,U RESTORE CHARACTERS AND POINTERS + STA ,X REPLACE STRING TERMINATOR + STU CHARAD RESTORE INPUT CHARACTER + RTS + +LB734 BSR LB73D * EVALUATE AN EXPRESSION, RETURN + STX BINVAL * THE VALUE IN X; STORE IT IN BINVAL +LB738 JSR LB26D SYNTAX CHECK FOR A COMMA + BRA LB70B EVALUATE EXPRESSION IN RANGE 0 <= X < 256 +* EVALUATE EXPRESSION : RETURN INTEGER PORTION IN X - 'FC' ERROR IF + +LB73D JSR LB141 EVALUATE NUMERIC EXPRESSION +LB740 LDA FP0SGN GET SIGN OF FPA0 MANTISSA + BMI LB706 ILLEGAL FUNCTION CALL' IF NEGATIVE + LDA FP0EXP GET EXPONENT OF FPA0 + CMPA #$90 COMPARE TO LARGEST POSITIVE INTEGER + BHI LB706 ILLEGAL FUNCTION CALL' IF TOO LARGE + JSR LBCC8 SHIFT BINARY POINT TO EXTREME RIGHT OF FPA0 + LDX FPA0+2 LOAD X WITH LOWER TWO BYTES OF FPA0 + RTS + +* PEEK +PEEK BSR LB740 CONVERT FPA0 TO INTEGER IN REGISTER X + LDB ,X GET THE VALUE BEING 'PEEK'ED + JMP LB4F3 CONVERT ACCB INTO A FP NUMBER + +* POKE +POKE BSR LB734 EVALUATE 2 EXPRESSIONS + LDX BINVAL GET THE ADDRESS TO BE 'POKE'ED + STB ,X STORE THE DATA IN THAT ADDRESS + RTS + + +* LIST +LIST PSHS CC SAVE ZERO FLAG ON STACK + JSR LAF67 CONVERT DECIMAL LINE NUMBER TO BINARY + JSR LAD01 * FIND RAM ADDRESS OF THAT LINE NUMBER AND + STX LSTTXT * SAVE IT IN LSTTXT + PULS CC GET ZERO FLAG FROM STACK + BEQ LB784 BRANCH IF END OF LINE + JSR GETCCH GET CURRENT CHARACTER FROM BASIC + BEQ LB789 BRANCH IF END OF LINE + CMPA #TOK_MINUS MINUS TOKEN (IS IT A RANGE OF LINE NUMBERS?) + BNE LB783 NO - RETURN + JSR GETNCH GET NEXT CHARACTER FROM BASIC + BEQ LB784 BRANCH IF END OF LINE + JSR LAF67 GET ENDING LINE NUMBER + BEQ LB789 BRANCH IF LEGAL LINE NUMBER +LB783 RTS +* LIST THE ENTIRE PROGRAM +LB784 LDU #$FFFF * SET THE DEFAULT ENDING LINE NUMBER + STU BINVAL * TO $FFFF +LB789 LEAS 2,S PURGE RETURN ADDRESS FROM THE STACK + LDX LSTTXT POINT X TO STARTING LINE ADDRESS +LB78D JSR LB95C MOVE CURSOR TO START OF A NEW LINE + JSR LA549 CHECK FOR A BREAK OR PAUSE + LDD ,X GET ADDRESS OF NEXT BASIC LINE + BNE LB79F BRANCH IF NOT END OF PROGRAM +LB797 + JMP LAC73 RETURN TO BASIC’S MAIN INPUT LOOP +LB79F STX LSTTXT SAVE NEW STARTING LINE ADDRESS + LDD 2,X * GET THE LINE NUMBER OF THIS LINE AND + CMPD BINVAL * COMPARE IT TO ENDING LINE NUMBER + BHI LB797 EXIT IF LINE NUMBER > ENDING LINE NUMBER + JSR LBDCC PRINT THE NUMBER IN ACCD ON SCREEN IN DECIMAL + JSR LB9AC SEND A SPACE TO CONSOLE OUT + LDX LSTTXT GET RAM ADDRESS OF THIS LINE + BSR LB7C2 UNCRUNCH A LINE + LDX [LSTTXT] POINT X TO START OF NEXT LINE + LDU #LINBUF+1 POINT U TO BUFFER FULL OF UNCRUNCHED LINE +LB7B9 LDA ,U+ GET A BYTE FROM THE BUFFER + BEQ LB78D BRANCH IF END OF BUFFER + JSR LB9B1 SEND CHARACTER TO CONSOLE OUT + BRA LB7B9 GET ANOTHER CHARACTER + +* UNCRUNCH A LINE INTO BASIC’S LINE INPUT BUFFER +LB7C2 LEAX 4,X MOVE POINTER PAST ADDRESS OF NEXT LINE AND LINE NUMBER + LDY #LINBUF+1 UNCRUNCH LINE INTO LINE INPUT BUFFER +LB7CB LDA ,X+ GET A CHARACTER + BEQ LB820 BRANCH IF END OF LINE + BMI LB7E6 BRANCH IF IT’S A TOKEN + CMPA #': CHECK FOR END OF SUB LINE + BNE LB7E2 BRNCH IF NOT END OF SUB LINE + LDB ,X GET CHARACTER FOLLOWING COLON + CMPB #TOK_ELSE TOKEN FOR ELSE? + BEQ LB7CB YES - DON’T PUT IT IN BUFFER + CMPB #TOK_SNGL_Q TOKEN FOR REMARK? + BEQ LB7CB YES - DON’T PUT IT IN BUFFER + FCB SKP2 SKIP TWO BYTES +LB7E0 LDA #'! EXCLAMATION POINT +LB7E2 BSR LB814 PUT CHARACTER IN BUFFER + BRA LB7CB GET ANOTHER CHARACTER + +LB7E6 LDU #COMVEC-10 FIRST DO COMMANDS + CMPA #$FF CHECK FOR SECONDARY TOKEN + BNE LB7F1 BRANCH IF NON SECONDARY TOKEN + LDA ,X+ GET SECONDARY TOKEN + LEAU 5,U BUMP IT UP TO SECONDARY FUNCTIONS +LB7F1 ANDA #$7F MASK OFF BIT 7 OF TOKEN +LB7F3 LEAU 10,U MOVE TO NEXT COMMAND TABLE + TST ,U IS THIS TABLE ENABLED? + BEQ LB7E0 NO - ILLEGAL TOKEN + SUBA ,U SUBTRACT THE NUMBER OF TOKENS FROM THE CURRENT TOKEN NUMBER + BPL LB7F3 BRANCH IF TOKEN NOT IN THIS TABLE + ADDA ,U RESTORE TOKEN NUMBER RELATIVE TO THIS TABLE + LDU 1,U POINT U TO COMMAND DICTIONARY TABLE +LB801 DECA DECREMENT TOKEN NUMBER + BMI LB80A BRANCH IF THIS IS THE CORRECT TOKEN +* SKIP THROUGH DICTIONARY TABLE TO START OF NEXT TOKEN +LB804 TST ,U+ GRAB A BYTE + BPL LB804 BRANCH IF BIT 7 NOT SET + BRA LB801 GO SEE IF THIS IS THE CORRECT TOKEN +LB80A LDA ,U GET A CHARACTER FROM DICTIONARY TABLE + BSR LB814 PUT CHARACTER IN BUFFER + TST ,U+ CHECK FOR START OF NEXT TOKEN + BPL LB80A BRANCH IF NOT DONE WITH THIS TOKEN + BRA LB7CB GO GET ANOTHER CHARACTER +LB814 CMPY #LINBUF+LBUFMX TEST FOR END OF LINE INPUT BUFFER + BCC LB820 BRANCH IF AT END OF BUFFER + ANDA #$7F MASK OFF BIT 7 + STA ,Y+ * SAVE CHARACTER IN BUFFER AND + CLR ,Y * CLEAR NEXT CHARACTER SLOT IN BUFFER +LB820 RTS +* +* CRUNCH THE LINE THAT THE INPUT POINTER IS +* POINTING TO INTO THE LINE INPUT BUFFER +* RETURN LENGTH OF CRUNCHED LINE IN ACCD +* +LB821 LDX CHARAD GET BASIC'S INPUT POINTER ADDRESS + LDU #LINBUF POINT X TO LINE INPUT BUFFER +LB829 CLR V43 CLEAR ILLEGAL TOKEN FLAG + CLR V44 CLEAR DATA FLAG +LB82D LDA ,X+ GET INPUT CHAR + BEQ LB852 BRANCH IF END OF LINE + TST V43 * CHECK ILLEGAL TOKEN FLAG & BRANCH IF NOT + BEQ LB844 * PROCESSING AN ILLEGAL TOKEN + JSR LB3A2 SET CARRY IF NOT UPPER CASE ALPHA + BCC LB852 BRANCH IF UPPER CASE ALPHA + CMPA #'0 * DON’T CRUNCH ASCII NUMERIC CHARACTERS + BLO LB842 * BRANCH IF NOT NUMERIC + CMPA #'9 * + BLS LB852 * BRANCH IF NUMERIC +* END UP HERE IF NOT UPPER CASE ALPHA OR NUMERIC +LB842 CLR V43 CLEAR ILLEGAL TOKEN FLAG +LB844 CMPA #SPACE SPACE? + BEQ LB852 DO NOT REMOVE SPACES + STA V42 SAVE INPUT CHARACTER AS SCAN DELIMITER + CMPA #'" CHECK FOR STRING DELIMITER + BEQ LB886 BRANCH IF STRING + TST V44 * CHECK DATA FLAG AND BRANCH IF CLEAR + BEQ LB86B * DO NOT CRUNCH DATA +LB852 STA ,U+ SAVE CHARACTER IN BUFFER + BEQ LB85C BRANCH IF END OF LINE + CMPA #': * CHECK FOR END OF SUBLINE + BEQ LB829 * AND RESET FLAGS IF END OF SUBLINE +LB85A BRA LB82D GO GET ANOTHER CHARACTER +LB85C CLR ,U+ * DOUBLE ZERO AT END OF LINE + CLR ,U+ * + TFR U,D SAVE ADDRESS OF END OF LINE IN ACCD + SUBD #LINHDR LENGTH OF LINE IN ACCD + LDX #LINBUF-1 * SET THE INPUT POINTER TO ONE BEFORE + STX CHARAD * THE START OF THE CRUNCHED LINE + RTS EXIT 'CRUNCH' +LB86B CMPA #'? CHECK FOR "?" - PRINT ABBREVIATION + BNE LB873 BRANCH IF NOT PRINT ABBREVIATION + LDA #TOK_PRINT * GET THE PRINT TOKEN AND SAVE IT + BRA LB852 * IN BUFFER +LB873 CMPA #'' APOSTROPHE IS SAME AS REM + BNE LB88A BRANCH IF NOT REMARK + LDD #$3A00+TOK_SNGL_Q COLON, REM TOKEN + STD ,U++ SAVE IN BUFFER +LB87C CLR V42 SET DELIMITER = 0 (END OF LINE) +LB87E LDA ,X+ SCAN TILL WE MATCH [V42] + BEQ LB852 BRANCH IF END OF LINE + CMPA V42 DELIMITER? + BEQ LB852 BRANCH OUT IF SO +LB886 STA ,U+ DON’T CRUNCH REMARKS OR STRINGS + BRA LB87E GO GET MORE STRING OR REMARK +LB88A CMPA #'0 * LESS THAN ASCII ZERO? + BCS LB892 * BRANCH IF SO + CMPA #';+1 = CHECK FOR NUMERIC VALUE, COLON OR SEMICOLON + BCS LB852 = AND INSERT IN BUFFER IF SO +LB892 LEAX -1,X MOVE INPUT POINTER BACK ONE + PSHS U,X SAVE POINTERS TO INPUT STRING, OUTPUT STRING + CLR V41 TOKEN FLAG 0 = COMMAND, FF = SECONDARY + LDU #COMVEC-10 POINT U TO COMMAND INTERPRETATION +* TABLE FOR BASIC - 10 +LB89B CLR V42 INITIALIZE V42 AS TOKEN COUNTER +LB89D LEAU 10,U MOVE TO NEXT COMMAND INTERPRETATION TABLE + LDA ,U GET NUMBER OF COMMANDS + BEQ LB8D4 GO DO SECONDARY FUNCTIONS IF NO COMMAND TABLE + LDY 1,U POINT Y TO COMMAND DICTIONARY TABLE +LB8A6 LDX ,S GET POINTER TO INPUT STRING +LB8A8 LDB ,Y+ GET A BYTE FROM DICTIONARY TABLE + SUBB ,X+ SUBTRACT INPUT CHARACTER + BEQ LB8A8 LOOP IF SAME + CMPB #$80 LAST CHAR IN RESERVED WORD TABLE HAD +* BIT 7 SET, SO IF WE HAVE $80 HERE +* THEN IT IS A GOOD COMPARE + BNE LB8EA BRANCH IF NO MATCH - CHECK ANOTHER COMMAND + LEAS 2,S DELETE OLD INPUT POINTER FROM STACK + PULS U GET POINTER TO OUTPUT STRING + ORB V42 OR IN THE TABLE POSITION TO MAKE THE TOKEN +* - NOTE THAT B ALREADY HAD $80 IN IT - + LDA V41 * CHECK TOKEN FLAG AND BRANCH + BNE LB8C2 * IF SECONDARY + CMPB #TOK_ELSE IS IT ELSE TOKEN? + BNE LB8C6 NO + LDA #': PUT A COLON (SUBLINE) BEFORE ELSE TOKEN +LB8C2 STD ,U++ SECONDARY TOKENS PRECEEDED BY $FF + BRA LB85A GO PROCESS MORE INPUT CHARACTERS +LB8C6 STB ,U+ SAVE THIS TOKEN + CMPB #TOK_DATA DATA TOKEN? + BNE LB8CE NO + INC V44 SET DATA FLAG +LB8CE CMPB #TOK_REM REM TOKEN? + BEQ LB87C YES +LB8D2 BRA LB85A GO PROCESS MORE INPUT CHARACTERS +* CHECK FOR A SECONDARY TOKEN +LB8D4 LDU #COMVEC-5 NOW DO SECONDARY FUNCTIONS + COM V41 TOGGLE THE TOKEN FLAG + BNE LB89B BRANCH IF NOW CHECKING SECONDARY COMMANDS + +* THIS CODE WILL PROCESS INPUT DATA WHICH CANNOT BE CRUNCHED AND SO +* IS ASSUMED TO BE ILLEGAL DATA OR AN ILLEGAL TOKEN + PULS X,U RESTORE INPUT AND OUTPUT POINTERS + LDA ,X+ * MOVE THE FIRST CHARACTER OF AN + STA ,U+ * ILLEGAL TOKEN + JSR LB3A2 SET CARRY IF NOT ALPHA + BCS LB8D2 BRANCH IF NOT ALPHA + COM V43 SET ILLEGAL TOKEN FLAG IF UPPER CASE ALPHA + BRA LB8D2 PROCESS MORE INPUT CHARACTERS +LB8EA INC V42 INCREMENT TOKEN COUNTER + DECA DECR COMMAND COUNTER + BEQ LB89D GET ANOTHER COMMAND TABLE IF DONE W/THIS ONE + LEAY -1,Y MOVE POINTER BACK ONE +LB8F1 LDB ,Y+ * GET TO NEXT + BPL LB8F1 * RESERVED WORD + BRA LB8A6 GO SEE IF THIS WORD IS A MATCH + +* PRINT +PRINT BEQ LB958 BRANCH IF NO ARGUMENT + BSR LB8FE CHECK FOR ALL PRINT OPTIONS + RTS +LB8FE +LB918 JSR XVEC9 CALL EXTENDED BASIC ADD-IN +LB91B BEQ LB965 RETURN IF END OF LINE +LB91D CMPA #TOK_TAB TOKEN FOR TAB( ? + BEQ LB97E YES + CMPA #', COMMA? + BEQ LB966 YES - ADVANCE TO NEXT TAB FIELD + CMPA #'; SEMICOLON? + BEQ LB997 YES - DO NOT ADVANCE CURSOR + JSR LB156 EVALUATE EXPRESSION + LDA VALTYP * GET VARIABLE TYPE AND + PSHS A * SAVE IT ON THE STACK + BNE LB938 BRANCH IF STRING VARIABLE + JSR LBDD9 CONVERT FP NUMBER TO AN ASCII STRING + JSR LB516 PARSE A STRING FROM (X-1) AND PUT +* DESCRIPTOR ON STRING STACK +LB938 BSR LB99F PRINT STRING POINTED TO BY X + PULS B GET VARIABLE TYPE BACK + JSR LA35F SET UP TAB WIDTH ZONE, ETC +LB949 TSTB CHECK CURRENT PRINT POSITION + BNE LB954 BRANCH IF NOT AT START OF LINE + JSR GETCCH GET CURRENT INPUT CHARACTER + CMPA #', COMMA? + BEQ LB966 SKIP TO NEXT TAB FIELD + BSR LB9AC SEND A SPACE TO CONSOLE OUT +LB954 JSR GETCCH GET CURRENT INPUT CHARACTER + BNE LB91D BRANCH IF NOT END OF LINE +LB958 LDA #CR * SEND A CR TO + BRA LB9B1 * CONSOLE OUT +LB95C JSR LA35F SET UP TAB WIDTH, ZONE ETC + BEQ LB958 BRANCH IF WIDTH = ZERO + LDA DEVPOS GET PRINT POSITION + BNE LB958 BRANCH IF NOT AT START OF LINE +LB965 RTS +* SKIP TO NEXT TAB FIELD +LB966 JSR LA35F SET UP TAB WIDTH, ZONE ETC + BEQ LB975 BRANCH IF LINE WIDTH = 0 (CASSETTE) + LDB DEVPOS GET CURRENT POSITION + CMPB DEVLCF COMPARE TO LAST TAB ZONE + BCS LB977 BRANCH IF < LAST TAB ZONE + BSR LB958 SEND A CARRIAGE RETURN TO CONSOLE OUT + BRA LB997 GET MORE DATA +LB975 LDB DEVPOS * +LB977 SUBB DEVCFW * SUBTRACT TAB FIELD WIDTH FROM CURRENT + BCC LB977 * POSITION UNTIL CARRY SET - NEGATING THE + NEGB * REMAINDER LEAVES THE NUMBER OF SPACES TO NEXT +* * TAB ZONE IN ACCB + BRA LB98E GO ADVANCE TO NEXT TAB ZONE + +* PRINT TAB( +LB97E JSR LB709 EVALUATE EXPRESSION - RETURN VALUE IN B + CMPA #') * 'SYNTAX' ERROR IF NOT ')' + LBNE LB277 * + JSR LA35F SET UP TAB WIDTH, ZONE ETC + SUBB DEVPOS GET DIFFERENCE OF PRINT POSITION & TAB POSITION + BLS LB997 BRANCH IF TAB POSITION < CURRENT POSITION +LB98E +LB992 BSR LB9AC SEND A SPACE TO CONSOLE OUT + DECB DECREMENT DIFFERENCE COUNT + BNE LB992 BRANCH UNTIL CURRENT POSITION = TAB POSITION +LB997 JSR GETNCH GET NEXT CHARACTER FROM BASIC + JMP LB91B LOOK FOR MORE PRINT DATA +* COPY A STRING FROM (X) TO CONSOLE OUT +LB99C JSR LB518 PARSE A STRING FROM X AND PUT +* DESCRIPTOR ON STRING STACK +LB99F JSR LB657 GET LENGTH OF STRING AND REMOVE +* DESCRIPTOR FROM STRING STACK + INCB COMPENSATE FOR DECB BELOW +LB9A3 DECB DECREMENT COUNTER + BEQ LB965 EXIT ROUTINE + LDA ,X+ GET A CHARACTER FROM X + BSR LB9B1 SEND TO CONSOLE OUT + BRA LB9A3 KEEP LOOPING +LB9AC LDA #SPACE SPACE TO CONSOLE OUT + FCB SKP2 SKIP NEXT TWO BYTES +LB9AF LDA #'? QUESTION MARK TO CONSOLE OUT +LB9B1 JMP PUTCHR JUMP TO CONSOLE OUT + +* FLOATING POINT MATH PACKAGE + +* ADD .5 TO FPA0 +LB9B4 LDX #LBEC0 FLOATING POINT CONSTANT (.5) + BRA LB9C2 ADD .5 TO FPA0 +* SUBTRACT FPA0 FROM FP NUMBER POINTED +* TO BY (X), LEAVE RESULT IN FPA0 +LB9B9 JSR LBB2F COPY PACKED FP DATA FROM (X) TO FPA1 + +* ARITHMETIC OPERATION (-) JUMPS HERE - SUBTRACT FPA0 FROM FPA1 (ENTER +* WITH EXPONENT OF FPA0 IN ACCB AND EXPONENT OF FPA1 IN ACCA) +LB9BC COM FP0SGN CHANGE MANTISSA SIGN OF FPA0 + COM RESSGN REVERSE RESULT SIGN FLAG + BRA LB9C5 GO ADD FPA1 AND FPA0 +* ADD FP NUMBER POINTED TO BY +* (X) TO FPA0 - LEAVE RESULT IN FPA0 +LB9C2 JSR LBB2F UNPACK PACKED FP DATA FROM (X) TO +* FPA1; RETURN EXPONENT OF FPA1 IN ACCA + +* ARITHMETIC OPERATION (+) JUMPS HERE - ADD FPA0 TO + +LB9C5 TSTB CHECK EXPONENT OF FPA0 + LBEQ LBC4A COPY FPA1 TO FPA0 IF FPA0 = + LDX #FP1EXP POINT X TO FPA1 +LB9CD TFR A,B PUT EXPONENT OF FPA1 INTO ACCB + TSTB CHECK EXPONENT + BEQ LBA3E RETURN IF EXPONENT = 0 (ADDING 0 TO FPA0) + SUBB FP0EXP SUBTRACT EXPONENT OF FPA0 FROM EXPONENT OF FPA1 + BEQ LBA3F BRANCH IF EXPONENTS ARE EQUAL + BCS LB9E2 BRANCH IF EXPONENT FPA0 > FPA1 + STA FP0EXP REPLACE FPA0 EXPONENT WITH FPA1 EXPONENT + LDA FP1SGN * REPLACE FPA0 MANTISSA SIGN + STA FP0SGN * WITH FPA1 MANTISSA SIGN + LDX #FP0EXP POINT X TO FPA0 + NEGB NEGATE DIFFERENCE OF EXPONENTS +LB9E2 CMPB #-8 TEST DIFFERENCE OF EXPONENTS + BLE LBA3F BRANCH IF DIFFERENCE OF EXPONENTS <= 8 + CLRA CLEAR OVERFLOW BYTE + LSR 1,X SHIFT MS BYTE OF MANTISSA; BIT 7 = 0 + JSR LBABA GO SHIFT MANTISSA OF (X) TO THE RIGHT (B) TIMES +LB9EC LDB RESSGN GET SIGN FLAG + BPL LB9FB BRANCH IF FPA0 AND FPA1 SIGNS ARE THE SAME + COM 1,X * COMPLEMENT MANTISSA POINTED + COM 2,X * TO BY (X) THE + COM 3,X * ADCA BELOW WILL + COM 4,X * CONVERT THIS OPERATION + COMA * INTO A NEG (MANTISSA) + ADCA #0 ADD ONE TO ACCA - COMA ALWAYS SETS THE CARRY FLAG +* THE PREVIOUS TWO BYTES MAY BE REPLACED BY A NEGA +* +* ADD MANTISSAS OF FPA0 AND FPA1, PUT RESULT IN FPA0 +LB9FB STA FPSBYT SAVE FPA SUB BYTE + LDA FPA0+3 * ADD LS BYTE + ADCA FPA1+3 * OF MANTISSA + STA FPA0+3 SAVE IN FPA0 LSB + LDA FPA0+2 * ADD NEXT BYTE + ADCA FPA1+2 * OF MANTISSA + STA FPA0+2 SAVE IN FPA0 + LDA FPA0+1 * ADD NEXT BYTE + ADCA FPA1+1 * OF MANTISSA + STA FPA0+1 SAVE IN FPA0 + LDA FPA0 * ADD MS BYTE + ADCA FPA1 * OF MANTISSA + STA FPA0 SAVE IN FPA0 + TSTB TEST SIGN FLAG + BPL LBA5C BRANCH IF FPA0 & FPA1 SIGNS WERE ALIKE +LBA18 BCS LBA1C BRANCH IF POSITIVE MANTISSA + BSR LBA79 NEGATE FPA0 MANTISSA + +* NORMALIZE FPA0 +LBA1C CLRB CLEAR TEMPORARY EXPONENT ACCUMULATOR +LBA1D LDA FPA0 TEST MSB OF MANTISSA + BNE LBA4F BRANCH IF <> 0 + LDA FPA0+1 * IF THE MSB IS + STA FPA0 * 0, THEN SHIFT THE + LDA FPA0+2 * MANTISSA A WHOLE BYTE + STA FPA0+1 * AT A TIME. THIS + LDA FPA0+3 * IS FASTER THAN ONE + STA FPA0+2 * BIT AT A TIME + LDA FPSBYT * BUT USES MORE MEMORY. + STA FPA0+3 * FPSBYT, THE CARRY IN + CLR FPSBYT * BYTE, REPLACES THE MATISSA LSB. + ADDB #8 SHIFTING ONE BYTE = 8 BIT SHIFTS; ADD 8 TO EXPONENT + CMPB #5*8 CHECK FOR 5 SHIFTS + BLT LBA1D BRANCH IF < 5 SHIFTS, IF > 5, THEN MANTISSA = 0 +LBA39 CLRA A ZERO EXPONENT = 0 FLOATING POINT +LBA3A STA FP0EXP ZERO OUT THE EXPONENT + STA FP0SGN ZERO OUT THE MANTISSA SIGN +LBA3E RTS +LBA3F BSR LBAAE SHIFT FPA0 MANTISSA TO RIGHT + CLRB CLEAR CARRY FLAG + BRA LB9EC +* SHIFT FPA0 LEFT ONE BIT UNTIL BIT 7 +* OF MATISSA MS BYTE = 1 +LBA44 INCB ADD ONE TO EXPONENT ACCUMULATOR + ASL FPSBYT SHIFT SUB BYTE ONE LEFT + ROL FPA0+3 SHIFT LS BYTE + ROL FPA0+2 SHIFT NS BYTE + ROL FPA0+1 SHIFT NS BYTE + ROL FPA0 SHIFT MS BYTE +LBA4F BPL LBA44 BRANCH IF NOT YET NORMALIZED + LDA FP0EXP GET CURRENT EXPONENT + PSHS B SAVE EXPONENT MODIFIER CAUSED BY NORMALIZATION + SUBA ,S+ SUBTRACT ACCUMULATED EXPONENT MODIFIER + STA FP0EXP SAVE AS NEW EXPONENT + BLS LBA39 SET FPA0 = 0 IF THE NORMALIZATION CAUSED +* MORE OR EQUAL NUMBER OF LEFT SHIFTS THAN THE +* SIZE OF THE EXPONENT + FCB SKP2 SKIP 2 BYTES +LBA5C BCS LBA66 BRANCH IF MANTISSA OVERFLOW + ASL FPSBYT SUB BYTE BIT 7 TO CARRY - USE AS ROUND-OFF +* FLAG (TRUNCATE THE REST OF SUB BYTE) + LDA #0 CLRA, BUT DO NOT CHANGE CARRY FLAG + STA FPSBYT CLEAR THE SUB BYTE + BRA LBA72 GO ROUND-OFF RESULT +LBA66 INC FP0EXP INCREMENT EXPONENT - MULTIPLY BY 2 + BEQ LBA92 OVERFLOW ERROR IF CARRY PAST $FF + ROR FPA0 * SHIFT MANTISSA + ROR FPA0+1 * ONE TO + ROR FPA0+2 * THE RIGHT - + ROR FPA0+3 * DIVIDE BY TWO +LBA72 BCC LBA78 BRANCH IF NO ROUND-OFF NEEDED + BSR LBA83 ADD ONE TO MANTISSA - ROUND OFF + BEQ LBA66 BRANCH iF OVERFLOW - MANTISSA = 0 +LBA78 RTS +* NEGATE FPA0 MANTISSA +LBA79 COM FP0SGN TOGGLE SIGN OF MANTISSA +LBA7B COM FPA0 * COMPLEMENT ALL 4 MANTISSA BYTES + COM FPA0+1 * + COM FPA0+2 * + COM FPA0+3 * +* ADD ONE TO FPA0 MANTISSA +LBA83 LDX FPA0+2 * GET BOTTOM 2 MANTISSA + LEAX 1,X * BYTES, ADD ONE TO + STX FPA0+2 * THEM AND SAVE THEM + BNE LBA91 BRANCH IF NO OVERFLOW + LDX FPA0 * IF OVERFLOW ADD ONE + LEAX 1,X * TO TOP 2 MANTISSA + STX FPA0 * BYTES AND SAVE THEM +LBA91 RTS +LBA92 LDB #2*5 OV' OVERFLOW ERROR + JMP LAC46 PROCESS AN ERROR +LBA97 LDX #FPA2-1 POINT X TO FPA2 +* SHIFT FPA POINTED TO BY (X) TO +* THE RIGHT -(B) TIMES. EXIT WITH +* ACCA CONTAINING DATA SHIFTED OUT +* TO THE RIGHT (SUB BYTE) AND THE DATA +* SHIFTED IN FROM THE LEFT WILL COME FROM FPCARY +LBA9A LDA 4,X GET LS BYTE OF MANTISSA (X) + STA FPSBYT SAVE IN FPA SUB BYTE + LDA 3,X * SHIFT THE NEXT THREE BYTES OF THE + STA 4,X * MANTISSA RIGHT ONE COMPLETE BYTE. + LDA 2,X * + STA 3,X * + LDA 1,X * + STA 2,X * + LDA FPCARY GET THE CARRY IN BYTE + STA 1,X STORE AS THE MS MANTISSA BYTE OF (X) +LBAAE ADDB #8 ADD 8 TO DIFFERENCE OF EXPONENTS + BLE LBA9A BRANCH IF EXPONENT DIFFERENCE < -8 + LDA FPSBYT GET FPA SUB BYTE + SUBB #8 CAST OUT THE 8 ADDED IN ABOVE + BEQ LBAC4 BRANCH IF EXPONENT DIFFERENCE = 0 + + +LBAB8 ASR 1,X * SHIFT MANTISSA AND SUB BYTE ONE BIT TO THE RIGHT +LBABA ROR 2,X * + ROR 3,X * + ROR 4,X * + RORA * + INCB ADD ONE TO EXPONENT DIFFERENCE + BNE LBAB8 BRANCH IF EXPONENTS NOT = +LBAC4 RTS +LBAC5 FCB $81,$00,$00,$00,$00 FLOATING POINT CONSTANT 1.0 + +* ARITHMETIC OPERATION (*) JUMPS HERE - MULTIPLY +* FPA0 BY (X) - RETURN PRODUCT IN FPA0 +LBACA BSR LBB2F MOVE PACKED FPA FROM (X) TO FPA1 +LBACC BEQ LBB2E BRANCH IF EXPONENT OF FPA0 = 0 + BSR LBB48 CALCULATE EXPONENT OF PRODUCT +* MULTIPLY FPA0 MANTISSA BY FPA1. NORMALIZE +* HIGH ORDER BYTES OF PRODUCT IN FPA0. THE +* LOW ORDER FOUR BYTES OF THE PRODUCT WILL +* BE STORED IN VAB-VAE. +LBAD0 LDA #0 * ZERO OUT MANTISSA OF FPA2 + STA FPA2 * + STA FPA2+1 * + STA FPA2+2 * + STA FPA2+3 * + LDB FPA0+3 GET LS BYTE OF FPA0 + BSR LBB00 MULTIPLY BY FPA1 + LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 4 + STB VAE * + LDB FPA0+2 GET NUMBER 3 MANTISSA BYTE OF FPA0 + BSR LBB00 MULTIPLY BY FPA1 + LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 3 + STB VAD * + LDB FPA0+1 GET NUMBER 2 MANTISSA BYTE OF FPA0 + BSR LBB00 MULTIPLY BY FPA1 + LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 2 + STB VAC * + LDB FPA0 GET MS BYTE OF FPA0 MANTISSA + BSR LBB02 MULTIPLY BY FPA1 + LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 1 + STB VAB * + JSR LBC0B COPY MANTISSA FROM FPA2 TO FPA0 + JMP LBA1C NORMALIZE FPA0 +LBB00 BEQ LBA97 SHIFT FPA2 ONE BYTE TO RIGHT +LBB02 COMA SET CARRY FLAG +* MULTIPLY FPA1 MANTISSA BY ACCB AND +* ADD PRODUCT TO FPA2 MANTISSA +LBB03 LDA FPA2 GET FPA2 MS BYTE + RORB ROTATE CARRY FLAG INTO SHIFT COUNTER; +* DATA BIT INTO CARRY + BEQ LBB2E BRANCH WHEN 8 SHIFTS DONE + BCC LBB20 DO NOT ADD FPA1 IF DATA BIT = 0 + LDA FPA2+3 * ADD MANTISSA LS BYTE + ADDA FPA1+3 * + STA FPA2+3 * + LDA FPA2+2 = ADD MANTISSA NUMBER 3 BYTE + ADCA FPA1+2 = + STA FPA2+2 = + LDA FPA2+1 * ADD MANTISSA NUMBER 2 BYTE + ADCA FPA1+1 * + STA FPA2+1 * + LDA FPA2 = ADD MANTISSA MS BYTE + ADCA FPA1 = +LBB20 RORA * ROTATE CARRY INTO MS BYTE + STA FPA2 * + ROR FPA2+1 = ROTATE FPA2 ONE BIT TO THE RIGHT + ROR FPA2+2 = + ROR FPA2+3 = + ROR FPSBYT = + CLRA CLEAR CARRY FLAG + BRA LBB03 KEEP LOOPING +LBB2E RTS +* UNPACK A FP NUMBER FROM (X) TO FPA1 +LBB2F LDD 1,X GET TWO MSB BYTES OF MANTISSA FROM +* FPA POINTED TO BY X + STA FP1SGN SAVE PACKED MANTISSA SIGN BYTE + ORA #$80 FORCE BIT 7 OF MSB MANTISSA = 1 + STD FPA1 SAVE 2 MSB BYTES IN FPA1 + LDB FP1SGN * GET PACKED MANTISSA SIGN BYTE. EOR W/FPA0 + EORB FP0SGN * SIGN - NEW SIGN POSITION IF BOTH OLD SIGNS ALIKE, + STB RESSGN * NEG IF BOTH OLD SIGNS DIFF. SAVE ADJUSTED +* * MANTISSA SIGN BYTE + LDD 3,X = GET 2 LSB BYTES OF MANTISSA + STD FPA1+2 = AND PUT IN FPA1 + LDA ,X * GET EXPONENT FROM (X) AND + STA FP1EXP * PUT IN EXPONENT OF FPA1 + LDB FP0EXP GET EXPONENT OF FPA0 + RTS +* CALCULATE EXPONENT FOR PRODUCT OF FPA0 & FPA1 +* ENTER WITH EXPONENT OF FPA1 IN ACCA +LBB48 TSTA TEST EXPONENT OF FPA1 + BEQ LBB61 PURGE RETURN ADDRESS & SET FPA0 = 0 + ADDA FP0EXP ADD FPA1 EXPONENT TO FPA0 EXPONENT + RORA ROTATE CARRY INTO BIT 7; BIT 0 INTO CARRY + ROLA SET OVERFLOW FLAG + BVC LBB61 BRANCH IF EXPONENT TOO LARGE OR SMALL + ADDA #$80 ADD $80 BIAS TO EXPONENT + STA FP0EXP SAVE NEW EXPONENT + BEQ LBB63 SET FPA0 + LDA RESSGN GET MANTISSA SIGN + STA FP0SGN SAVE AS MANTISSA SIGN OF FPA0 + RTS +* IF FPA0 = POSITIVE THEN 'OV' ERROR IF FPA0 +* = IS NEGATIVE THEN FPA0 = 0 +LBB5C LDA FP0SGN GET MANTISSA SIGN OF FPA0 + COMA CHANGE SIGN OF FPA0 MANTISSA + BRA LBB63 +LBB61 LEAS 2,S PURGE RETURN ADDRESS FROM STACK +LBB63 LBPL LBA39 ZERO FPA0 MANTISSA SIGN & EXPONENT +LBB67 JMP LBA92 OV' OVERFLOW ERROR +* FAST MULTIPLY BY 10 AND LEAVE RESULT IN FPA0 +LBB6A JSR LBC5F TRANSFER FPA0 TO FPA1 + BEQ LBB7C BRANCH IF EXPONENT = 0 + ADDA #2 ADD 2 TO EXPONENT (TIMES 4) + BCS LBB67 OV' ERROR IF EXPONENT > $FF + CLR RESSGN CLEAR RESULT SIGN BYTE + JSR LB9CD ADD FPA1 TO FPA0 (TIMES 5) + INC FP0EXP ADD ONE TO EXPONENT (TIMES 10) + BEQ LBB67 OV' ERROR IF EXPONENT > $FF +LBB7C RTS +LBB7D FCB $84,$20,$00,$00,$00 FLOATING POINT CONSTANT 10 +* DIVIDE FPA0 BY 10 +LBB82 JSR LBC5F MOVE FPA0 TO FPA1 + LDX #LBB7D POINT TO FLOATING POINT CONSTANT 10 + CLRB ZERO MANTISSA SIGN BYTE +LBB89 STB RESSGN STORE THE QUOTIENT MANTISSA SIGN BYTE + JSR LBC14 UNPACK AN FP NUMBER FROM (X) INTO FPA0 + FCB SKP2 SKIP TWO BYTES +* DIVIDE (X) BY FPA0-LEAVE NORMALIZED QUOTIENT IN FPA0 +LBB8F BSR LBB2F GET FP NUMBER FROM (X) TO FPA1 + +* ARITHMETIC OPERATION (/) JUMPS HERE. DIVIDE FPA1 BY FPA0 (ENTER WITH +* EXPONENT OF FPA1 IN ACCA AND FLAGS SET BY TSTA) + +* DIVIDE FPA1 BY FPA0 +LBB91 BEQ LBC06 /0' DIVIDE BY ZERO ERROR + NEG FP0EXP GET EXPONENT OF RECIPROCAL OF DIVISOR + BSR LBB48 CALCULATE EXPONENT OF QUOTIENT + INC FP0EXP INCREMENT EXPONENT + BEQ LBB67 OV' OVERFLOW ERROR + LDX #FPA2 POINT X TO MANTISSA OF FPA2 - HOLD +* TEMPORARY QUOTIENT IN FPA2 + LDB #4 5 BYTE DIVIDE + STB TMPLOC SAVE BYTE COUNTER + LDB #1 SHIFT COUNTER-AND TEMPORARY QUOTIENT BYTE +* COMPARE FPA0 MANTISSA TO FPA1 MANTISSA - +* SET CARRY FLAG IF FPA1 >= FPA0 +LBBA4 LDA FPA0 * COMPARE THE TWO MS BYTES + CMPA FPA1 * OF FPA0 AND FPA1 AND + BNE LBBBD * BRANCH IF <> + LDA FPA0+1 = COMPARE THE NUMBER 2 + CMPA FPA1+1 = BYTES AND + BNE LBBBD = BRANCH IF <> + LDA FPA0+2 * COMPARE THE NUMBER 3 + CMPA FPA1+2 * BYTES AND + BNE LBBBD * BRANCH IF <> + LDA FPA0+3 = COMPARE THE LS BYTES + CMPA FPA1+3 = AND BRANCH + BNE LBBBD = IF <> + COMA SET CARRY FLAG IF FPA0 = FPA1 +LBBBD TFR CC,A SAVE CARRY FLAG STATUS IN ACCA; CARRY +* CLEAR IF FPA0 > FPA1 + ROLB ROTATE CARRY INTO TEMPORARY QUOTIENT BYTE + BCC LBBCC CARRY WILL BE SET AFTER 8 SHIFTS + STB ,X+ SAVE TEMPORARY QUOTIENT + DEC TMPLOC DECREMENT BYTE COUNTER + BMI LBBFC BRANCH IF DONE + BEQ LBBF8 BRANCH IF LAST BYTE + LDB #1 RESET SHIFT COUNTER AND TEMPORARY QUOTIENT BYTE +LBBCC TFR A,CC RESTORE CARRY FLAG AND + BCS LBBDE BRANCH IF FPA0 =< FPA1 +LBBD0 ASL FPA1+3 * SHIFT FPA1 MANTISSA 1 BIT TO LEFT + ROL FPA1+2 * + ROL FPA1+1 * + ROL FPA1 * + BCS LBBBD BRANCH IF CARRY - ADD ONE TO PARTIAL QUOTIENT + BMI LBBA4 IF MSB OF HIGH ORDER MANTISSA BYTE IS +* SET, CHECK THE MAGNITUDES OF FPA0, FPA1 + BRA LBBBD CARRY IS CLEAR, CHECK ANOTHER BIT +* SUBTRACT FPA0 FROM FPA1 - LEAVE RESULT IN FPA1 +LBBDE LDA FPA1+3 * SUBTRACT THE LS BYTES OF MANTISSA + SUBA FPA0+3 * + STA FPA1+3 * + LDA FPA1+2 = THEN THE NEXT BYTE + SBCA FPA0+2 = + STA FPA1+2 = + LDA FPA1+1 * AND THE NEXT + SBCA FPA0+1 * + STA FPA1+1 * + LDA FPA1 = AND FINALLY, THE MS BYTE OF MANTISSA + SBCA FPA0 = + STA FPA1 = + BRA LBBD0 GO SHIFT FPA1 +LBBF8 LDB #$40 USE ONLY TWO BITS OF THE LAST BYTE (FIFTH) + BRA LBBCC GO SHIFT THE LAST BYTE +LBBFC RORB * SHIFT CARRY (ALWAYS SET HERE) INTO + RORB * BIT 5 AND MOVE + RORB * BITS 1,0 TO BITS 7,6 + STB FPSBYT SAVE SUB BYTE + BSR LBC0B MOVE MANTISSA OF FPA2 TO FPA0 + JMP LBA1C NORMALIZE FPA0 +LBC06 LDB #2*10 /0' ERROR + JMP LAC46 PROCESS THE ERROR +* COPY MANTISSA FROM FPA2 TO FPA0 +LBC0B LDX FPA2 * MOVE TOP 2 BYTES + STX FPA0 * + LDX FPA2+2 = MOVE BOTTOM 2 BYTES + STX FPA0+2 = + RTS +* COPY A PACKED FP NUMBER FROM (X) TO FPA0 +LBC14 PSHS A SAVE ACCA + LDD 1,X GET TOP TWO MANTISSA BYTES + STA FP0SGN SAVE MS BYTE OF MANTISSA AS MANTISSA SIGN + ORA #$80 UNPACK MS BYTE + STD FPA0 SAVE UNPACKED TOP 2 MANTISSA BYTES + CLR FPSBYT CLEAR MANTISSA SUB BYTE + LDB ,X GET EXPONENT TO ACCB + LDX 3,X * MOVE LAST 2 + STX FPA0+2 * MANTISSA BYTES + STB FP0EXP SAVE EXPONENT + PULS A,PC RESTORE ACCA AND RETURN + +LBC2A LDX #V45 POINT X TO MANTISSA OF FPA4 + BRA LBC35 MOVE FPA0 TO FPA4 +LBC2F LDX #V40 POINT X TO MANTISSA OF FPA3 + FCB SKP2 SKIP TWO BYTES +LBC33 LDX VARDES POINT X TO VARIABLE DESCRIPTOR IN VARDES +* PACK FPA0 AND MOVE IT TO ADDRESS IN X +LBC35 LDA FP0EXP * COPY EXPONENT + STA ,X * + LDA FP0SGN GET MANTISSA SIGN BIT + ORA #$7F MASK THE BOTTOM 7 BITS + ANDA FPA0 AND BIT 7 OF MANTISSA SIGN INTO BIT 7 OF MS BYTE + STA 1,X SAVE MS BYTE + LDA FPA0+1 * MOVE 2ND MANTISSA BYTE + STA 2,X * + LDU FPA0+2 = MOVE BOTTOM 2 MANTISSA BYTES + STU 3,X = + RTS +* MOVE FPA1 TO FPA0 RETURN W/MANTISSA SIGN IN ACCA +LBC4A LDA FP1SGN * COPY MANTISSA SIGN FROM +LBC4C STA FP0SGN * FPA1 TO FPA0 + LDX FP1EXP = COPY EXPONENT + MS BYTE FROM + STX FP0EXP = FPA1 TO FPA0 + CLR FPSBYT CLEAR MANTISSA SUB BYTE + LDA FPA1+1 * COPY 2ND MANTISSA BYTE + STA FPA0+1 * FROM FPA1 TO FPA0 + LDA FP0SGN GET MANTISSA SIGN + LDX FPA1+2 * COPY 3RD AND 4TH MANTISSA BYTE + STX FPA0+2 * FROM FPA1 TO FPA0 + RTS +* TRANSFER FPA0 TO FPA1 +LBC5F LDD FP0EXP * TRANSFER EXPONENT & MS BYTE + STD FP1EXP * + LDX FPA0+1 = TRANSFER MIDDLE TWO BYTES + STX FPA1+1 = + LDX FPA0+3 * TRANSFER BOTTOM TWO BYTES + STX FPA1+3 * + TSTA SET FLAGS ACCORDING TO EXPONENT + RTS +* CHECK FPA0; RETURN ACCB = 0 IF FPA0 = 0, +* ACCB = $FF IF FPA0 = NEGATIVE, ACCB = 1 IF FPA0 = POSITIVE +LBC6D LDB FP0EXP GET EXPONENT + BEQ LBC79 BRANCH IF FPA0 = 0 +LBC71 LDB FP0SGN GET SIGN OF MANTISSA +LBC73 ROLB BIT 7 TO CARRY + LDB #$FF NEGATIVE FLAG + BCS LBC79 BRANCH IF NEGATIVE MANTISSA + NEGB ACCB = 1 IF POSITIVE MANTISSA +LBC79 RTS + +* SGN +SGN BSR LBC6D SET ACCB ACCORDING TO SIGN OF FPA0 +* CONVERT A SIGNED NUMBER IN ACCB INTO A FLOATING POINT NUMBER +LBC7C STB FPA0 SAVE ACCB IN FPA0 + CLR FPA0+1 CLEAR NUMBER 2 MANTISSA BYTE OF FPA0 + LDB #$88 EXPONENT REQUIRED IF FPA0 IS TO BE AN INTEGER +LBC82 LDA FPA0 GET MS BYTE OF MANTISSA + SUBA #$80 SET CARRY IF POSITIVE MANTISSA +LBC86 STB FP0EXP SAVE EXPONENT + LDD ZERO * ZERO OUT ACCD AND + STD FPA0+2 * BOTTOM HALF OF FPA0 + STA FPSBYT CLEAR SUB BYTE + STA FP0SGN CLEAR SIGN OF FPA0 MANTISSA + JMP LBA18 GO NORMALIZE FPA0 + +* ABS +ABS CLR FP0SGN FORCE MANTISSA SIGN OF FPA0 POSITIVE + RTS +* COMPARE A PACKED FLOATING POINT NUMBER POINTED TO +* BY (X) TO AN UNPACKED FP NUMBER IN FPA0. RETURN +* ZERO FLAG SET AND ACCB = 0, IF EQUAL; ACCB = 1 IF +* FPA0 > (X); ACCB = $FF IF FPA0 < (X) +LBC96 LDB ,X CHECK EXPONENT OF (X) + BEQ LBC6D BRANCH IF FPA = 0 + LDB 1,X GET MS BYTE OF MANTISSA OF (X) + EORB FP0SGN EOR WITH SIGN OF FPA0 + BMI LBC71 BRANCH IF SIGNS NOT = +* COMPARE FPA0 WITH FP NUMBER POINTED TO BY (X). +* FPA0 IS NORMALIZED, (X) IS PACKED. +LBCA0 LDB FP0EXP * GET EXPONENT OF + CMPB ,X * FPA0, COMPARE TO EXPONENT OF + BNE LBCC3 * (X) AND BRANCH IF <>. + LDB 1,X * GET MS BYTE OF (X), KEEP ONLY + ORB #$7F * THE SIGN BIT - 'AND' THE BOTTOM 7 + ANDB FPA0 * BITS OF FPA0 INTO ACCB + CMPB 1,X = COMPARE THE BOTTOM 7 BITS OF THE MANTISSA + BNE LBCC3 = MS BYTE AND BRANCH IF <> + LDB FPA0+1 * COMPARE 2ND BYTE + CMPB 2,X * OF MANTISSA, + BNE LBCC3 * BRANCH IF <> + LDB FPA0+2 = COMPARE 3RD BYTE + CMPB 3,X = OF MANTISSA, + BNE LBCC3 = BRANCH IF <> + LDB FPA0+3 * SUBTRACT LS BYTE + SUBB 4,X * OF (X) FROM LS BYTE OF + BNE LBCC3 * FPA0, BRANCH IF <> + RTS RETURN IF FP (X) = FPA0 +LBCC3 RORB SHIFT CARRY TO BIT 7; CARRY SET IF FPA0 < (X) + EORB FP0SGN TOGGLE SIZE COMPARISON BIT IF FPA0 IS NEGATIVE + BRA LBC73 GO SET ACCB ACCORDING TO COMPARISON +* DE-NORMALIZE FPA0 : SHIFT THE MANTISSA UNTIL THE BINARY POINT IS TO THE RIGHT +* OF THE LEAST SIGNIFICANT BYTE OF THE MANTISSA +LBCC8 LDB FP0EXP GET EXPONENT OF FPA0 + BEQ LBD09 ZERO MANTISSA IF FPA0 = 0 + SUBB #$A0 SUBTRACT $A0 FROM FPA0 EXPONENT T THIS WILL YIELD +* THE NUMBER OF SHIFTS REQUIRED TO DENORMALIZE FPA0. WHEN +* THE EXPONENT OF FPA0 IS = ZERO, THEN THE BINARY POINT +* WILL BE TO THE RIGHT OF THE MANTISSA + LDA FP0SGN TEST SIGN OF FPA0 MANTISSA + BPL LBCD7 BRANCH IF POSITIVE + COM FPCARY COMPLEMENT CARRY IN BYTE + JSR LBA7B NEGATE MANTISSA OF FPA0 +LBCD7 LDX #FP0EXP POINT X TO FPA0 + CMPB #-8 EXPONENT DIFFERENCE < -8? + BGT LBCE4 YES + JSR LBAAE SHIFT FPA0 RIGHT UNTIL FPA0 EXPONENT = $A0 + CLR FPCARY CLEAR CARRY IN BYTE + RTS +LBCE4 CLR FPCARY CLEAR CARRY IN BYTE + LDA FP0SGN * GET SIGN OF FPA0 MANTISSA + ROLA * ROTATE IT INTO THE CARRY FLAG + ROR FPA0 ROTATE CARRY (MANTISSA SIGN) INTO BIT 7 +* OF LS BYTE OF MANTISSA + JMP LBABA DE-NORMALIZE FPA0 + +* INT +* THE INT STATEMENT WILL "DENORMALIZE" FPA0 - THAT IS IT WILL SHIFT THE BINARY POINT +* TO THE EXTREME RIGHT OF THE MANTISSA TO FORCE ITS EXPONENT TO BE $AO. ONCE +* THIS IS DONE THE MANTISSA OF FPA0 WILL CONTAIN THE FOUR LEAST SIGNIFICANT +* BYTES OF THE INTEGER PORTION OF FPA0. AT THE CONCLUSION OF THE DE-NORMALIZATION +* ONLY THE INTEGER PORTION OF FPA0 WILL REMAIN. +* +INT LDB FP0EXP GET EXPONENT OF FPA0 + CMPB #$A0 LARGEST POSSIBLE INTEGER EXPONENT + BCC LBD11 RETURN IF FPA0 >= 32768 + BSR LBCC8 SHIFT THE BINARY POINT ONE TO THE RIGHT OF THE +* LS BYTE OF THE FPA0 MANTISSA + STB FPSBYT ACCB = 0: ZERO OUT THE SUB BYTE + LDA FP0SGN GET MANTISSA SIGN + STB FP0SGN FORCE MANTISSA SIGN TO BE POSITIVE + SUBA #$80 SET CARRY IF MANTISSA + LDA #$A0 * GET DENORMALIZED EXPONENT AND + STA FP0EXP * SAVE IT IN FPA0 EXPONENT + LDA FPA0+3 = GET LS BYTE OF FPA0 AND + STA CHARAC = SAVE IT IN CHARAC + JMP LBA18 NORMALIZE FPA0 + +LBD09 STB FPA0 * LOAD MANTISSA OF FPA0 WITH CONTENTS OF ACCB + STB FPA0+1 * + STB FPA0+2 * + STB FPA0+3 * +LBD11 RTS * + +* CONVERT ASCII STRING TO FLOATING POINT +LBD12 LDX ZERO (X) = 0 + STX FP0SGN * ZERO OUT FPA0 & THE SIGN FLAG (COEFCT) + STX FP0EXP * + STX FPA0+1 * + STX FPA0+2 * + STX V47 INITIALIZE EXPONENT & EXPONENT SIGN FLAG TO ZERO + STX V45 INITIALIZE RIGHT DECIMAL CTR & DECIMAL PT FLAG TO 0 + BCS LBD86 IF CARRY SET (NUMERIC CHARACTER), ASSUME ACCA CONTAINS FIRST +* NUMERIC CHAR, SIGN IS POSITIVE AND SKIP THE RAM HOOK + JSR XVEC19 CALL EXTENDED BASIC ADD-IN +LBD25 CMPA #'- * CHECK FOR A LEADING MINUS SIGN AND BRANCH + BNE LBD2D * IF NO MINUS SIGN + COM COEFCT TOGGLE SIGN; 0 = +; FF = - + BRA LBD31 INTERPRET THE REST OF THE STRING +LBD2D CMPA #'+ * CHECK FOR LEADING PLUS SlGN AND BRANCH + BNE LBD35 * IF NOT A PLUS SIGN +LBD31 JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC + BCS LBD86 BRANCH IF NUMERIC CHARACTER +LBD35 CMPA #'. DECIMAL POlNT? + BEQ LBD61 YES + CMPA #'E "E" SHORTHAND FORM (SCIENTIFIC NOTATION)? + BNE LBD65 NO +* EVALUATE EXPONENT OF EXPONENTIAL FORMAT + JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC + BCS LBDA5 BRANCH IF NUMERIC + CMPA #TOK_MINUS MINUS TOKEN? + BEQ LBD53 YES + CMPA #'- ASCII MINUS? + BEQ LBD53 YES + CMPA #TOK_PLUS PLUS TOKEN? + BEQ LBD55 YES + CMPA #'+ ASCII PLUS? + BEQ LBD55 YES + BRA LBD59 BRANCH IF NO SIGN FOUND +LBD53 COM V48 SET EXPONENT SIGN FLAG TO NEGATIVE +* STRIP A DECIMAL NUMBER FROM BASIC LINE, CONVERT IT TO BINARY IN V47 +LBD55 JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC + BCS LBDA5 IF NUMERIC CHARACTER, CONVERT TO BINARY +LBD59 TST V48 * CHECK EXPONENT SIGN FLAG + BEQ LBD65 * AND BRANCH IF POSITIVE + NEG V47 NEGATE VALUE OF EXPONENT + BRA LBD65 +LBD61 COM V46 *TOGGLE DECIMAL PT FLAG AND INTERPRET ANOTHER + BNE LBD31 *CHARACTER IF <> 0 - TERMINATE INTERPRETATION +* IF SECOND DECIMAL POINT +* ADJUST FPA0 FOR THE DECIMAL EXPONENT IN V47 +LBD65 LDA V47 * GET EXPONENT, SUBTRACT THE NUMBER OF + SUBA V45 * PLACES TO THE RIGHT OF DECIMAL POINT + STA V47 * AND RESAVE IT. + BEQ LBD7F EXIT ROUTINE IF ADJUSTED EXPONENT = ZERO + BPL LBD78 BRANCH IF POSITIVE EXPONENT +LBD6F JSR LBB82 DIVIDE FPA0 BY 10 + INC V47 INCREMENT EXPONENT COUNTER (MULTIPLY BY 10) + BNE LBD6F KEEP MULTIPLYING + BRA LBD7F EXIT ROUTINE +LBD78 JSR LBB6A MULTIPLY FPA0 BY 10 + DEC V47 DECREMENT EXPONENT COUNTER (DIVIDE BY 10) + BNE LBD78 KEEP MULTIPLYING +LBD7F LDA COEFCT GET THE SIGN FLAG + BPL LBD11 RETURN IF POSITIVE + JMP LBEE9 TOGGLE MANTISSA SIGN OF FPA0, IF NEGATIVE +*MULTIPLY FPA0 BY TEN AND ADD ACCA TO THE RESULT +LBD86 LDB V45 *GET THE RIGHT DECIMAL COUNTER AND SUBTRACT + SUBB V46 *THE DECIMAL POINT FLAG FROM IT. IF DECIMAL POINT + STB V45 *FLAG=0, NOTHING HAPPENS. IF DECIMAL POINT FLAG IS +* -1, THEN RIGHT DECIMAL COUNTER IS INCREMENTED BY ONE + PSHS A SAVE NEW DIGIT ON STACK + JSR LBB6A MULTIPLY FPA0 BY 10 + PULS B GET NEW DIGIT BACK + SUBB #'0 MASK OFF ASCII + BSR LBD99 ADD ACCB TO FPA0 + BRA LBD31 GET ANOTHER CHARACTER FROM BASIC +LBD99 JSR LBC2F PACK FPA0 AND SAVE IT IN FPA3 + JSR LBC7C CONVERT ACCB TO FP NUMBER IN FPA0 + LDX #V40 * ADD FPA0 TO + JMP LB9C2 * FPA3 + + +LBDA5 LDB V47 + ASLB TIMES 2 + ASLB TIMES 4 + ADDB V47 ADD 1 = TIMES 5 + ASLB TIMES 10 + SUBA #'0 *MASK OFF ASCII FROM ACCA, PUSH + PSHS B *RESULT ONTO THE STACK AND + ADDA ,S+ ADD lT TO ACCB + STA V47 SAVE IN V47 + BRA LBD55 INTERPRET ANOTHER CHARACTER +* +LBDB6 FCB $9B,$3E,$BC,$1F,$FD * 99999999.9 +LBDBB FCB $9E,$6E,$6B,$27,$FD * 999999999 +LBDC0 FCB $9E,$6E,$6B,$28,$00 * 1E + 09 +* +LBDC5 LDX #LABE8-1 POINT X TO " IN " MESSAGE + BSR LBDD6 COPY A STRING FROM (X) TO CONSOLE OUT + LDD CURLIN GET CURRENT BASIC LINE NUMBER TO ACCD +* CONVERT VALUE IN ACCD INTO A DECIMAL NUMBER +* AND PRINT IT TO CONSOLE OUT +LBDCC STD FPA0 SAVE ACCD IN TOP HALF OF FPA0 + LDB #$90 REQ’D EXPONENT IF TOP HALF OF ACCD = INTEGER + COMA SET CARRY FLAG - FORCE POSITIVE MANTISSA + JSR LBC86 ZERO BOTTOM HALF AND SIGN OF FPA0, THEN +* SAVE EXPONENT AND NORMALIZE IT + BSR LBDD9 CONVERT FP NUMBER TO ASCII STRING +LBDD6 JMP LB99C COPY A STRING FROM (X) TO CONSOLE OUT + +* CONVERT FP NUMBER TO ASCII STRING +LBDD9 LDU #STRBUF+3 POINT U TO BUFFER WHICH WILL NOT CAUSE +* THE STRING TO BE STORED IN STRING SPACE +LBDDC LDA #SPACE SPACE = DEFAULT SIGN FOR POSITIVE # + LDB FP0SGN GET SIGN OF FPA0 + BPL LBDE4 BRANCH IF POSITIVE + LDA #'- ASCII MINUS SIGN +LBDE4 STA ,U+ STORE SIGN OF NUMBER + STU COEFPT SAVE BUFFER POINTER + STA FP0SGN SAVE SIGN (IN ASCII) + LDA #'0 ASCII ZERO IF EXPONENT = 0 + LDB FP0EXP GET FPA0 EXPONENT + LBEQ LBEB8 BRANCH IF FPA0 = 0 + CLRA BASE 10 EXPONENT=0 FOR FP NUMBER > 1 + CMPB #$80 CHECK EXPONENT + BHI LBDFF BRANCH IF FP NUMBER > 1 +* IF FPA0 < 1.0, MULTIPLY IT BY 1E+09 TO SPEED UP THE CONVERSION PROCESS + LDX #LBDC0 POINT X TO FP 1E+09 + JSR LBACA MULTIPLY FPA0 BY (X) + LDA #-9 BASE 10 EXPONENT = -9 +LBDFF STA V45 BASE 10 EXPONENT +* PSEUDO - NORMALIZE THE FP NUMBER TO A VALUE IN THE RANGE +* OF 999,999,999 RO 99,999,999.9 - THIS IS THE LARGEST +* NUMBER RANGE IN WHICH ALL OF THE DIGITS ARE +* SIGNIFICANT WHICH CAN BE DISPLAYED WITHOUT USING +* SCIENTIFIC NOTATION +LBE01 LDX #LBDBB POINT X TO FP 999,999,999 + JSR LBCA0 COMPARE FPA0 TO 999,999,999 + BGT LBE18 BRANCH IF > 999,999,999 +LBE09 LDX #LBDB6 POINT X TO FP 99,999,999.9 + JSR LBCA0 COMPARE FPA0 TO 99,999,999.9 + BGT LBE1F BRANCH IF > 99,999,999.9 (IN RANGE) + JSR LBB6A MULTIPLY FPA0 BY 10 + DEC V45 SUBTRACT ONE FROM DECIMAL OFFSET + BRA LBE09 PSEUDO - NORMALIZE SOME MORE +LBE18 JSR LBB82 DIVIDE FPA0 BY 10 + INC V45 ADD ONE TO BASE 10 EXPONENT + BRA LBE01 PSEUDO - NORMALIZE SOME MORE +LBE1F JSR LB9B4 ADD .5 TO FPA0 (ROUND OFF) + JSR LBCC8 CONVERT FPA0 TO AN INTEGER + LDB #1 DEFAULT DECIMAL POINT FLAG (FORCE IMMED DECIMAL PT) + LDA V45 * GET BASE 10 EXPONENT AND ADD TEN TO IT + ADDA #9+1 * (NUMBER ‘NORMALIZED’ TO 9 PLACES & DECIMAL PT) + BMI LBE36 BRANCH IF NUMBER < 1.0 + CMPA #9+2 NINE PLACES MAY BE DISPLAYED WITHOUT +* USING SCIENTIFIC NOTATION + BCC LBE36 BRANCH IF SCIENTIFIC NOTATION REQUIRED + DECA * SUBTRACT 1 FROM MODIFIED BASE 10 EXPONENT CTR + TFR A,B * AND SAVE IT IN ACCB (DECiMAL POINT FLAG) + LDA #2 FORCE EXPONENT = 0 - DON'T USE SCIENTIFIC NOTATION +LBE36 DECA * SUBTRACT TWO (WITHOUT AFFECTING CARRY) + DECA * FROM BASE 10 EXPONENT + STA V47 SAVE EXPONENT - ZERO EXPONENT = DO NOT DISPLAY +* IN SCIENTIFIC NOTATION + STB V45 DECIMAL POINT FLAG - NUMBER OF PLACES TO +* LEFT OF DECIMAL POINT + BGT LBE4B BRANCH IF >= 1 + LDU COEFPT POINT U TO THE STRING BUFFER + LDA #'. * STORE A PERIOD + STA ,U+ * IN THE BUFFER + TSTB CHECK DECIMAL POINT FLAG + BEQ LBE4B BRANCH IF NOTHING TO LEFT OF DECIMAL POINT + LDA #'0 * STORE A ZERO + STA ,U+ * IN THE BUFFER + +* CONVERT FPA0 INTO A STRING OF ASCII DIGITS +LBE4B LDX #LBEC5 POINT X TO FP POWER OF 10 MANTISSA + LDB #0+$80 INITIALIZE DIGIT COUNTER TO 0+$80 +* BIT 7 SET IS USED TO INDICATE THAT THE POWER OF 10 MANTISSA +* IS NEGATIVE. WHEN YOU 'ADD' A NEGATIVE MANTISSA, IT IS +* THE SAME AS SUBTRACTING A POSITIVE ONE AND BIT 7 OF ACCB IS HOW +* THE ROUTINE KNOWS THAT A 'SUBTRACTION' IS OCCURING. +LBE50 LDA FPA0+3 * ADD MANTISSA LS + ADDA 3,X * BYTE OF FPA0 + STA FPA0+3 * AND (X) + LDA FPA0+2 = ADD MANTISSA + ADCA 2,X = NUMBER 3 BYTE OF + STA FPA0+2 = FPA0 AND (X) + LDA FPA0+1 * ADD MANTISSA + ADCA 1,X * NUMBER 2 BYTE OF + STA FPA0+1 * FPA0 AND (X) + LDA FPA0 = ADD MANTISSA + ADCA ,X = MS BYTE OF + STA FPA0 = FPA0 AND (X) + INCB ADD ONE TO DIGIT COUNTER + RORB ROTATE CARRY INTO BIT 7 + ROLB *SET OVERFLOW FLAG AND BRANCH IF CARRY = 1 AND + BVC LBE50 *POSITIVE MANTISSA OR CARRY = 0 AND NEG MANTISSA + BCC LBE72 BRANCH IF NEGATIVE MANTISSA + SUBB #10+1 * TAKE THE 9’S COMPLEMENT IF + NEGB * ADDING MANTISSA +LBE72 ADDB #'0-1 ADD ASCII OFFSET TO DIGIT + LEAX 4,X MOVE TO NEXT POWER OF 10 MANTISSA + TFR B,A SAVE DIGIT IN ACCA + ANDA #$7F MASK OFF BIT 7 (ADD/SUBTRACT FLAG) + STA ,U+ STORE DIGIT IN STRING BUFFER + DEC V45 DECREMENT DECIMAL POINT FLAG + BNE LBE84 BRANCH IF NOT TIME FOR DECIMAL POINT + LDA #'. * STORE DECIMAL POINT IN + STA ,U+ * STRING BUFFER +LBE84 COMB TOGGLE BIT 7 (ADD/SUBTRACT FLAG) + ANDB #$80 MASK OFF ALL BUT ADD/SUBTRACT FLAG + CMPX #LBEC5+36 COMPARE X TO END OF MANTISSA TABLE + BNE LBE50 BRANCH IF NOT AT END OF TABLE +* BLANK TRAILING ZEROS AND STORE EXPONENT IF ANY +LBE8C LDA ,-U GET THE LAST CHARACTER; MOVE POINTER BACK + CMPA #'0 WAS IT A ZERO? + BEQ LBE8C IGNORE TRAILING ZEROS IF SO + CMPA #'. CHECK FOR DECIMAL POINT + BNE LBE98 BRANCH IF NOT DECIMAL POINT + LEAU -1,U STEP OVER THE DECIMAL POINT +LBE98 LDA #'+ ASCII PLUS SIGN + LDB V47 GET SCIENTIFIC NOTATION EXPONENT + BEQ LBEBA BRANCH IF NOT SCIENTIFIC NOTATION + BPL LBEA3 BRANCH IF POSITIVE EXPONENT + LDA #'- ASCII MINUS SIGN + NEGB NEGATE EXPONENT IF NEGATIVE +LBEA3 STA 2,U STORE EXPONENT SIGN IN STRING + LDA #'E * GET ASCII ‘E’ (SCIENTIFIC NOTATION + STA 1,U * FLAG) AND SAVE IT IN THE STRING + LDA #'0-1 INITIALIZE ACCA TO ASCII ZERO + + +LBEAB INCA ADD ONE TO 10’S DIGIT OF EXPONENT + SUBB #10 SUBTRACT 10 FROM ACCB + BCC LBEAB ADD 1 TO 10’S DIGIT IF NO CARRY + ADDB #'9+1 CONVERT UNITS DIGIT TO ASCII + STD 3,U SAVE EXPONENT IN STRING + CLR 5,U CLEAR LAST BYTE (TERMINATOR) + BRA LBEBC GO RESET POINTER +LBEB8 STA ,U STORE LAST CHARACTER +LBEBA CLR 1,U CLEAR LAST BYTE (TERMINATOR - REQUIRED BY +* PRINT SUBROUTINES) +LBEBC LDX #STRBUF+3 RESET POINTER TO START OF BUFFER + RTS +* +LBEC0 FCB $80,$00,$00,$00,$00 FLOATING POINT .5 +* +*** TABLE OF UNNORMALIZED POWERS OF 10 +LBEC5 FCB $FA,$0A,$1F,$00 -100000000 +LBEC9 FCB $00,$98,$96,$80 10000000 +LBECD FCB $FF,$F0,$BD,$C0 -1000000 +LBED1 FCB $00,$01,$86,$A0 100000 +LBED5 FCB $FF,$FF,$D8,$F0 -10000 +LBED9 FCB $00,$00,$03,$E8 1000 +LBEDD FCB $FF,$FF,$FF,$9C -100 +LBEE1 FCB $00,$00,$00,$0A 10 +LBEE5 FCB $FF,$FF,$FF,$FF -1 +* +* +LBEE9 LDA FP0EXP GET EXPONENT OF FPA0 + BEQ LBEEF BRANCH IF FPA0 = 0 + COM FP0SGN TOGGLE MANTISSA SIGN OF FPA0 +LBEEF RTS +* EXPAND A POLYNOMIAL OF THE FORM +* AQ+BQ**3+CQ**5+DQ**7.... WHERE Q = FPA0 +* AND THE X REGISTER POINTS TO A TABLE OF +* COEFFICIENTS A,B,C,D.... +LBEF0 STX COEFPT SAVE COEFFICIENT TABLE POINTER + JSR LBC2F MOVE FPA0 TO FPA3 + BSR LBEFC MULTIPLY FPA3 BY FPA0 + BSR LBF01 EXPAND POLYNOMIAL + LDX #V40 POINT X TO FPA3 +LBEFC JMP LBACA MULTIPLY (X) BY FPA0 + +* CALCULATE THE VALUE OF AN EXPANDED POLYNOMIAL +* EXPRESSION. ENTER WITH (X) POINTING TO A TABLE +* OF COEFFICIENTS, THE FIRST BYTE OF WHICH IS THE +* NUMBER OF (COEFFICIENTS-1) FOLLOWED BY THAT NUMBER +* OF PACKED FLOATING POINT NUMBERS. THE +* POLYNOMIAL IS EVALUATED AS FOLLOWS: VALUE = +* (((FPA0*Y0+Y1)*FPA0+Y2)*FPA0…YN) +LBEFF STX COEFPT SAVE COEFFICIENT TABLE POINTER +LBF01 JSR LBC2A MOVE FPA0 TO FPA4 + LDX COEFPT GET THE COEFFICIENT POINTER + LDB ,X+ GET THE TOP OF COEFFICIENT TABLE TO + STB COEFCT * USE AND STORE IT IN TEMPORARY COUNTER + STX COEFPT SAVE NEW COEFFICIENT POINTER +LBF0C BSR LBEFC MULTIPLY (X) BY FPA0 + LDX COEFPT *GET COEFFICIENT POINTER + LEAX 5,X *MOVE TO NEXT FP NUMBER + STX COEFPT *SAVE NEW COEFFICIENT POINTER + JSR LB9C2 ADD (X) AND FPA0 + LDX #V45 POINT (X) TO FPA4 + DEC COEFCT DECREMENT TEMP COUNTER + BNE LBF0C BRANCH IF MORE COEFFICIENTS LEFT + RTS + +* RND +RND JSR LBC6D TEST FPA0 + BMI LBF45 BRANCH IF FPA0 = NEGATIVE + BEQ LBF3B BRANCH IF FPA0 = 0 + BSR LBF38 CONVERT FPA0 TO AN INTEGER + JSR LBC2F PACK FPA0 TO FPA3 + BSR LBF3B GET A RANDOM NUMBER: FPA0 < 1.0 + LDX #V40 POINT (X) TO FPA3 + BSR LBEFC MULTIPLY (X) BY FPA0 + LDX #LBAC5 POINT (X) TO FP VALUE OF 1.0 + JSR LB9C2 ADD 1.0 TO FPA0 +LBF38 JMP INT CONVERT FPA0 TO AN INTEGER +* CALCULATE A RANDOM NUMBER IN THE RANGE 0.0 < X <= 1.0 +LBF3B LDX RVSEED+1 * MOVE VARIABLE + STX FPA0 * RANDOM NUMBER + LDX RVSEED+3 * SEED TO + STX FPA0+2 * FPA0 +LBF45 LDX RSEED = MOVE FIXED + STX FPA1 = RANDOM NUMBER + LDX RSEED+2 = SEED TO + STX FPA1+2 = MANTISSA OF FPA0 + JSR LBAD0 MULTIPLY FPA0 X FPA1 + LDD VAD GET THE TWO LOWEST ORDER PRODUCT BYTES + ADDD #$658B ADD A CONSTANT + STD RVSEED+3 SAVE NEW LOW ORDER VARIABLE RANDOM # SEED + STD FPA0+2 SAVE NEW LOW ORDER BYTES OF FPA0 MANTISSA + LDD VAB GET 2 MORE LOW ORDER PRODUCT BYTES + ADCB #$B0 ADD A CONSTANT + ADCA #5 ADD A CONSTANT + STD RVSEED+1 SAVE NEW HIGH ORDER VARIABLE RANDOM # SEED + STD FPA0 SAVE NEW HIGH ORDER FPA0 MANTISSA + CLR FP0SGN FORCE FPA0 MANTISSA = POSITIVE + LDA #$80 * SET FPA0 BIASED EXPONENT + STA FP0EXP * TO 0 1 < FPA0 < 0 + LDA FPA2+2 GET A BYTE FROM FPA2 (MORE RANDOMNESS) + STA FPSBYT SAVE AS SUB BYTE + JMP LBA1C NORMALIZE FPA0 +* +RSEED FDB $40E6 *CONSTANT RANDOM NUMBER GENERATOR SEED + FDB $4DAB * + +* SIN +* THE SIN FUNCTION REQUIRES AN ARGUMENT IN RADIANS AND WILL REPEAT ITSELF EVERY +* 2*PI RADIANS. THE ARGUMENT IS DIVIDED BY 2*PI AND ONLY THE FRACTIONAL PART IS +* RETAINED. SINCE THE ARGUMENT WAS DIVIDED BY 2*P1, THE COEFFICIENTS MUST BE +* MULTIPLIED BY THE APPROPRIATE POWER OF 2*PI. + +* SIN IS EVALUATED USING THE TRIGONOMETRIC IDENTITIES BELOW: +* SIN(X)=SIN(PI-X) & -SIN(PI/2-X)=SIN((3*PI)/2+X) +SIN JSR LBC5F COPY FPA0 TO FPA1 + LDX #LBFBD POINT (X) TO 2*PI + LDB FP1SGN *GET MANTISSA SIGN OF FPA1 + JSR LBB89 *AND DIVIDE FPA0 BY 2*PI + JSR LBC5F COPY FPA0 TO FPA1 + BSR LBF38 CONVERT FPA0 TO AN INTEGER + CLR RESSGN SET RESULT SIGN = POSITIVE + LDA FP1EXP *GET EXPONENT OF FPA1 + LDB FP0EXP *GET EXPONENT OF FPA0 + JSR LB9BC *SUBTRACT FPA0 FROM FPA1 +* NOW FPA0 CONTAINS ONLY THE FRACTIONAL PART OF ARGUMENT/2*PI + LDX #LBFC2 POINT X TO FP (.25) + JSR LB9B9 SUBTRACT FPA0 FROM .25 (PI/2) + LDA FP0SGN GET MANTISSA SIGN OF FPA0 + PSHS A SAVE IT ON STACK + BPL LBFA6 BRANCH IF MANTISSA POSITIVE + JSR LB9B4 ADD .5 (PI) TO FPA0 + LDA FP0SGN GET SIGN OF FPA0 + BMI LBFA9 BRANCH IF NEGATIVE + COM RELFLG COM IF +(3*PI)/2 >= ARGUMENT >+ PI/2 (QUADRANT FLAG) +LBFA6 JSR LBEE9 TOGGLE MANTISSA SIGN OF FPA0 +LBFA9 LDX #LBFC2 POINT X TO FP (.25) + JSR LB9C2 ADD .25 (PI/2) TO FPA0 + PULS A GET OLD MANTISSA SIGN + TSTA * BRANCH IF OLD + BPL LBFB7 * SIGN WAS POSITIVE + JSR LBEE9 TOGGLE MANTISSA SIGN +LBFB7 LDX #LBFC7 POINT X TO TABLE OF COEFFICIENTS + JMP LBEF0 GO CALCULATE POLYNOMIAL VALUE + +LBFBD FCB $83,$49,$0F,$DA,$A2 6.28318531 (2*PI) +LBFC2 FCB $7F,$00,$00,$00,$00 .25 + + +LBFC7 FCB 6-1 SIX COEFFICIENTS +LBFC8 FCB $84,$E6,$1A,$2D,$1B * -((2*PI)**11)/11! +LBFCD FCB $86,$28,$07,$FB,$F8 * ((2*PI)**9)/9! +LBFD2 FCB $87,$99,$68,$89,$01 * -((2*PI)**7)/7! +LBFD7 FCB $87,$23,$35,$DF,$E1 * ((2*PI)**5)/5! +LBFDC FCB $86,$A5,$5D,$E7,$28 * -((2*PI)**3)/3! +LBFE1 FCB $83,$49,$0F,$DA,$A2 * + + FCB $A1,$54,$46,$8F,$13 UNUSED GARBAGE BYTES + FCB $8F,$52,$43,$89,$CD UNUSED GARBAGE BYTES +* EXTENDED BASIC + +* COS +* THE VALUE OF COS(X) IS DETERMINED BY THE TRIG IDENTITY COS(X)=SIN((PI/2)+X) +COS LDX #L83AB POINT X TO FP CONSTANT (P1/2) + JSR LB9C2 ADD FPA0 TO (X) +L837E JMP SIN JUMP TO SIN ROUTINE + +* TAN +* THE VALUE OF TAN(X) IS DETERMINED BY THE TRIG IDENTITY TAN(X)=SIN(X)/COS(X) +TAN JSR LBC2F PACK FPA0 AND MOVE IT TO FPA3 + CLR RELFLG RESET QUADRANT FLAG + BSR L837E CALCULATE SIN OF ARGUMENT + LDX #V4A POINT X TO FPA5 + JSR LBC35 PACK FPA0 AND MOVE IT TO FPA5 + LDX #V40 POINT X TO FPA3 + JSR LBC14 MOVE FPA3 TO FPA0 + CLR FP0SGN FORCE FPA0 MANTISSA TO BE POSITIVE + LDA RELFLG GET THE QUADRANT FLAG - COS NEGATIVE IN QUADS 2,3 + BSR L83A6 CALCULATE VALUE OF COS(FPA0) + TST FP0EXP CHECK EXPONENT OF FPA0 + LBEQ LBA92 ‘OV’ ERROR IF COS(X)=0 + LDX #V4A POINT X TO FPA5 +L83A3 JMP LBB8F DIVIDE (X) BY FPA0 - SIN(X)/COS(X) +L83A6 PSHS A SAVE SIGN FLAG ON STACK + JMP LBFA6 EXPAND POLYNOMIAL + +L83AB FCB $81,$49,$0F,$DA,$A2 1.57079633 (PI/2) + +* ATN +* A 12 TERM TAYLOR SERIES IS USED TO EVALUATE THE +* ARCTAN EXPRESSION. TWO DIFFERENT FORMULI ARE USED +* TO EVALUATE THE EXPRESSION DEPENDING UPON +* WHETHER OR NOT THE ARGUMENT SQUARED IS > OR < 1.0 + +* IF X**2<1 THEN ATN=X-(X**3)/3+(X**5)/5-(X**7)/7. . . +* IF X**2>=1 THEN ATN=PI/2-(1/X-1/((X**3)*3)+(1/((X**5)*5)-. . .) + +ATN LDA FP0SGN * GET THE SIGN OF THE MANTISSA AND + PSHS A * SAVE IT ON THE STACK + BPL L83B8 BRANCH IF POSITIVE MANTISSA + BSR L83DC CHANGE SIGN OF FPA0 +L83B8 LDA FP0EXP * GET EXPONENT OF FPA0 AND + PSHS A * SAVE IT ON THE STACK + CMPA #$81 IS FPAO < 1.0? + BLO L83C5 YES + LDX #LBAC5 POINT X TO FP CONSTANT 1.0 + BSR L83A3 GET RECIPROCAL OF FPA0 +L83C5 LDX #L83E0 POINT (X) TO TAYLOR SERIES COEFFICIENTS + JSR LBEF0 EXPAND POLYNOMIAL + PULS A GET EXPONENT OF ARGUMENT + CMPA #$81 WAS ARGUMENT < 1.0? + BLO L83D7 YES + LDX #L83AB POINT (X) TO FP NUMBER (PI/2) + JSR LB9B9 SUBTRACT FPA0 FROM (PI/2) +L83D7 PULS A * GET SIGN OF INITIAL ARGUMENT MANTISSA + TSTA * AND SET FLAGS ACCORDING TO IT + BPL L83DF RETURN IF ARGUMENT WAS POSITIVE +L83DC JMP LBEE9 CHANGE MANTISSA SIGN OF FPA0 +L83DF RTS +* +* TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR ARCTANGENT +L83E0 FCB $0B TWELVE COEFFICIENTS +L83E1 FCB $76,$B3,$83,$BD,$D3 -6.84793912E-04 1/23 +L83E6 FCB $79,$1E,$F4,$A6,$F5 +4.85094216E-03 1/21 +L83EB FCB $7B,$83,$FC,$B0,$10 -0.0161117018 +L83F0 FCB $7C,$0C,$1F,$67,$CA 0.0342096381 +L83F5 FCB $7C,$DE,$53,$CB,$C1 -0.0542791328 +L83FA FCB $7D,$14,$64,$70,$4C 0.0724571965 +L83FF FCB $7D,$B7,$EA,$51,$7A -0.0898023954 +L8404 FCB $7D,$63,$30,$88,$7E 0.110932413 +L8409 FCB $7E,$92,$44,$99,$3A -0.142839808 +L840E FCB $7E,$4C,$CC,$91,$C7 0.199999121 +L8413 FCB $7F,$AA,$AA,$AA,$13 -0.333333316 +L8418 FCB $81,$00,$00,$00,$00 1 +* +*** TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR LN(X) +* +L841D FCB 3 FOUR COEFFICIENTS +L841E FCB $7F,$5E,$56,$CB,$79 0.434255942 +L8423 FCB $80,$13,$9B,$0B,$64 0.576584541 +L8428 FCB $80,$76,$38,$93,$16 0.961800759 +L842D FCB $82,$38,$AA,$3B,$20 2.88539007 + +L8432 FCB $80,$35,$04,$F3,$34 1/SQR(2) + +L8437 FCB $81,$35,$04,$F3,$34 SQR(2) + +L843C FCB $80,$80,$00,$00,$00 -0.5 + +L8441 FCB $80,$31,$72,$17,$F8 LN(2) +* +* LOG - NATURAL LOGARITHM (LN) + +* THE NATURAL OR NAPERIAN LOGARITHM IS CALCULATED USING +* MATHEMATICAL IDENTITIES. FPA0 IS OF THE FORM FPA0=A*(2**B) (SCIENTIFIC +* NOTATION). THEREFORE, THE LOG ROUTINE DETERMINES THE VALUE OF +* LN(A*(2**B)). A SERIES OF MATHEMATICAL IDENTITIES WILL EXPAND THIS +* TERM: LN(A*(2**B))=(-1/2+(1/LN(2))*(LN(A*SQR(2)))+B)*LN(2). ALL OF +* THE TERMS OF THE LATTER EXPRESSION ARE CONSTANTS EXCEPT FOR THE +* LN(A*SQR(2)) TERM WHICH IS EVALUATED USING THE TAYLOR SERIES EXPANSION +LOG JSR LBC6D CHECK STATUS OF FPA0 + LBLE LB44A ‘FC’ ERROR IF NEGATIVE OR ZERO + LDX #L8432 POINT (X) TO FP NUMBER (1/SQR(2)) + LDA FP0EXP *GET EXPONENT OF ARGUMENT + SUBA #$80 *SUBTRACT OFF THE BIAS AND + PSHS A *SAVE IT ON THE STACK + LDA #$80 + STA FP0EXP + JSR LB9C2 ADD FPA0 TO (X) + LDX #L8437 POINT X TO SQR(2) + JSR LBB8F DIVIDE SQR(2) BY FPA0 + LDX #LBAC5 POINT X TO FP VALUE OF 1.00 + JSR LB9B9 SUBTRACT FPA0 FROM (X) +* NOW FPA0 = (1-SQR(2)*X)/(1+SQR(2)*X) WHERE X IS ARGUMENT + LDX #L841D POINT X TO TABLE OF COEFFICIENTS + JSR LBEF0 EXPAND POLYNOMIAL + LDX #L843C POINT X TO FP VALUE OF (-.5) + JSR LB9C2 ADD FPA0 TO X + PULS B GET EXPONENT OF ARGUMENT BACK (WITHOUT BIAS) + JSR LBD99 ADD ACCB TO FPA0 + LDX #L8441 POINT X TO LN(2) + JMP LBACA MULTIPLY FPA0 * LN(2) + +* SQR +SQR JSR LBC5F MOVE FPA0 TO FPA1 + LDX #LBEC0 POINT (X) TO FP NUMBER (.5) + JSR LBC14 COPY A PACKED NUMBER FROM (X) TO FPA0 + +* ARITHMETIC OPERATOR FOR EXPONENTIATION JUMPS +* HERE. THE FORMULA USED TO EVALUATE EXPONENTIATION +* IS A**X=E**(X LN A) = E**(FPA0*LN(FPA1)), E=2.7182818 +L8489 BEQ EXP DO A NATURAL EXPONENTIATION IF EXPONENT = 0 + TSTA *CHECK VALUE BEING EXPONENTIATED + BNE L8491 *AND BRANCH IF IT IS <> 0 + JMP LBA3A FPA0=0 IF RAISING ZERO TO A POWER +L8491 LDX #V4A * PACK FPA0 AND SAVE + JSR LBC35 * IT IN FPA5 (ARGUMENT’S EXPONENT) + CLRB ACCB=DEFAULT RESULT SIGN FLAG; 0=POSITIVE + LDA FP1SGN *CHECK THE SIGN OF ARGUMENT + BPL L84AC *BRANCH IF POSITIVE + JSR INT CONVERT EXPONENT INTO AN INTEGER + LDX #V4A POINT X TO FPA5 (ORIGINAL EXPONENT) + LDA FP1SGN GET MANTISSA SIGN OF FPA1 (ARGUMENT) + JSR LBCA0 *COMPARE FPA0 TO (X) AND + BNE L84AC *BRANCH IF NOT EQUAL + COMA TOGGLE FPA1 MANTISSA SIGN - FORCE POSITIVE + LDB CHARAC GET LS BYTE OF INTEGER VALUE OF EXPONENT (RESULT SIGN FLAG) +L84AC JSR LBC4C COPY FPA1 TO FPA0; ACCA = MANTISSA SIGN + PSHS B PUT RESULT SIGN FLAG ON THE STACK + JSR LOG + LDX #V4A POINT (X) TO FPA5 + JSR LBACA MULTIPLY FPA0 BY FPA5 + BSR EXP CALCULATE E**(FPA0) + PULS A * GET RESULT SIGN FLAG FROM THE STACK + RORA * AND BRANCH IF NEGATIVE + LBCS LBEE9 CHANGE SIGN OF FPA0 MANTISSA + RTS + +* CORRECTION FACTOR FOR EXPONENTIAL FUNCTION +L84C4 FCB $81,$38,$AA,$3B,$29 1.44269504 ( CF ) +* +* TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR E**X +* +L84C9 FCB 7 EIGHT COEFFICIENTS +L84CA FCB $71,$34,$58,$3E,$56 2.14987637E-05: 1/(7!*(CF**7)) +L84CF FCB $74,$16,$7E,$B3,$1B 1.4352314E-04 : 1/(6!*(CF**6)) +L84D4 FCB $77,$2F,$EE,$E3,$85 1.34226348E-03: 1/(5!*(CF**5)) +L84D9 FCB $7A,$1D,$84,$1C,$2A 9.61401701E-03: 1/(4!*(CF**4)) +L84DE FCB $7C,$63,$59,$58,$0A 0.0555051269 +L84E3 FCB $7E,$75,$FD,$E7,$C6 0.240226385 +L84E8 FCB $80,$31,$72,$18,$10 0.693147186 +L84ED FCB $81,$00,$00,$00,$00 1 +* +* EXP ( E**X) +* THE EXPONENTIAL FUNCTION IS EVALUATED BY FIRST MULTIPLYING THE +* ARGUMENT BY A CORRECTION FACTOR (CF). AFTER THIS IS DONE, AN +* ARGUMENT >= 127 WILL YIELD A ZERO RESULT (NO UNDERFLOW) FOR A +* NEGATIVE ARGUMENT OR AN 'OV' (OVERFLOW) ERROR FOR A POSITIVE +* ARGUMENT. THE POLYNOMIAL COEFFICIENTS ARE MODIFIED TO REFLECT +* THE CF MULTIPLICATION AT THE START OF THE EVALUATION PROCESS. + +EXP LDX #L84C4 POINT X TO THE CORRECTION FACTOR + JSR LBACA MULTIPLY FPA0 BY (X) + JSR LBC2F PACK FPA0 AND STORE IT IN FPA3 + LDA FP0EXP *GET EXPONENT OF FPA0 AND + CMPA #$88 *COMPARE TO THE MAXIMUM VALUE + BLO L8504 BRANCH IF FPA0 < 128 +L8501 JMP LBB5C SET FPA0 = 0 OR ‘OV’ ERROR +L8504 JSR INT CONVERT FPA0 TO INTEGER + LDA CHARAC GET LS BYTE OF INTEGER + ADDA #$81 * WAS THE ARGUMENT =127, IF SO + BEQ L8501 * THEN ‘OV’ ERROR; THIS WILL ALSO ADD THE $80 BIAS +* * REQUIRED WHEN THE NEW EXPONENT IS CALCULATED BELOW + DECA DECREMENT ONE FROM THE EXPONENT, BECAUSE $81, NOT $80 WAS USED ABOVE + PSHS A SAVE EXPONENT OF INTEGER PORTION ON STACK + LDX #V40 POINT (X) TO FPA3 + JSR LB9B9 SUBTRACT FPA0 FROM (X) - GET FRACTIONAL PART OF ARGUMENT + LDX #L84C9 POINT X TO COEFFICIENTS + JSR LBEFF EVALUATE POLYNOMIAL FOR FRACTIONAL PART + CLR RESSGN FORCE THE MANTISSA TO BE POSITIVE + PULS A GET INTEGER EXPONENT FROM STACK + JSR LBB48 * CALCULATE EXPONENT OF NEW FPA0 BY ADDING THE EXPONENTS OF THE +* * INTEGER AND FRACTIONAL PARTS + RTS + +* FIX +FIX JSR LBC6D CHECK STATUS OF FPA0 + BMI L852C BRANCH IF FPA0 = NEGATIVE +L8529 JMP INT CONVERT FPA0 TO INTEGER +L852C COM FP0SGN TOGGLE SIGN OF FPA0 MANTISSA + BSR L8529 CONVERT FPA0 TO INTEGER + JMP LBEE9 TOGGLE SIGN OF FPA0 + +* EDIT +EDIT JSR L89AE GET LINE NUMBER FROM BASIC + LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK +L8538 LDA #$01 ‘LIST’ FLAG + STA VD8 SET FLAG TO LIST LINE + JSR LAD01 GO FIND THE LINE NUMBER IN PROGRAM + LBCS LAED2 ERROR #7 ‘UNDEFINED LINE #' + JSR LB7C2 GO UNCRUNCH LINE INTO BUFFER AT LINBUF+1 + TFR Y,D PUT ABSOLUTE ADDRESS OF END OF LINE TO ACCD + SUBD #LINBUF+2 SUBTRACT OUT THE START OF LINE + STB VD7 SAVE LENGTH OF LINE +L854D LDD BINVAL GET THE HEX VALUE OF LINE NUMBER + JSR LBDCC LIST THE LINE NUMBER ON THE SCREEN + JSR LB9AC PRINT A SPACE + LDX #LINBUF+1 POINT X TO BUFFER + LDB VD8 * CHECK TO SEE IF LINE IS TO BE + BNE L8581 * LISTED TO SCREEN - BRANCH IF IT IS +L855C CLRB RESET DIGIT ACCUMULATOR - DEFAULT VALUE +L855D JSR L8687 GET KEY STROKE + JSR L90AA SET CARRY IF NOT NUMERIC + BLO L8570 BRANCH IF NOT NUMERIC + SUBA #'0' MASK OFF ASCII + PSHS A SAVE IT ON STACK + LDA #10 NUMBER BEING CONVERTED IS BASE 10 + MUL MULTIPLY ACCUMULATED VALUE BY BASE (10) + ADDB ,S+ ADD DIGIT TO ACCUMULATED VALUE + BRA L855D CHECK FOR ANOTHER DIGIT +L8570 SUBB #$01 * REPEAT PARAMETER IN ACCB; IF IT + ADCB #$01 *IS 0, THEN MAKE IT ‘1’ + CMPA #'A' ABORT? + BNE L857D NO + JSR LB958 PRINT CARRIAGE RETURN TO SCREEN + BRA L8538 RESTART EDIT PROCESS - CANCEL ALL CHANGES +L857D CMPA #'L' LIST? + BNE L858C NO +L8581 BSR L85B4 LIST THE LINE + CLR VD8 RESET THE LIST FLAG TO ‘NO LIST’ + JSR LB958 PRINT CARRIAGE RETURN + BRA L854D GO INTERPRET ANOTHER EDIT COMMAND +L858A LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK +L858C CMPA #CR ENTER KEY? + BNE L859D NO + BSR L85B4 ECHO THE LINE TO THE SCREEN +L8592 JSR LB958 PRINT CARRIAGE RETURN + LDX #LINBUF+1 * RESET BASIC’S INPUT POINTER + STX CHARAD * TO THE LINE INPUT BUFFER + JMP LACA8 GO PUT LINE BACK IN PROGRAM +L859D CMPA #'E' EXIT? + BEQ L8592 YES - SAME AS ENTER EXCEPT NO ECHO + CMPA #'Q' QUIT? + BNE L85AB NO + JSR LB958 PRINT CARRIAGE RETURN TO SCREEN + JMP LAC73 GO TO COMMAND LEVEL - MAKE NO CHANGES +L85AB BSR L85AF INTERPRET THE REMAINING COMMANDS AS SUBROUTINES + BRA L855C GO INTERPRET ANOTHER EDIT COMMAND +L85AF CMPA #SPACE SPACE BAR? + BNE L85C3 NO +L85B3 FCB SKP2 SKIP TWO BYTES +* DISPLAY THE NEXT ACCB BYTES OF THE LINE IN THE BUFFER TO THE SCREEN +* +L85B4 LDB #LBUFMX-1 250 BYTES MAX IN BUFFER +L85B6 LDA ,X GET A CHARACTER FROM BUFFER + BEQ L85C2 EXIT IF IT’S A 0 + JSR PUTCHR SEND CHAR TO CONSOLE OUT + LEAX $01,X MOVE POINTER UP ONE + DECB DECREMENT CHARACTER COUNTER + BNE L85B6 LOOP IF NOT DONE +L85C2 RTS +L85C3 CMPA #'D' DELETE? + BNE L860F NO +L85C7 TST ,X * CHECK FOR END OF LINE + BEQ L85C2 * AND BRANCH IF SO + BSR L85D1 REMOVE A CHARACTER + DECB DECREMENT REPEAT PARAMETER + BNE L85C7 BRANCH IF NOT DONE + RTS +* REMOVE ONE CHARACTER FROM BUFFER +L85D1 DEC VD7 DECREMENT LENGTH OF BUFFER + LEAY $-01,X POINT Y TO ONE BEFORE CURRENT BUFFER POINTER +L85D5 LEAY $01,Y INCREMENT TEMPORARY BUFFER POINTER + LDA $01,Y GET NEXT CHARACTER + STA ,Y PUT IT IN CURRENT POSITION + BNE L85D5 BRANCH IF NOT END OF LINE + RTS +L85DE CMPA #'I' INSERT? + BEQ L85F5 YES + CMPA #'X' EXTEND? + BEQ L85F3 YES + CMPA #'H' HACK? + BNE L8646 NO + CLR ,X TURN CURRENT BUFFER POINTER INTO END OF LINE FLAG + TFR X,D PUT CURRENT BUFFER POINTER IN ACCD + SUBD #LINBUF+2 SUBTRACT INITIAL POINTER POSITION + STB VD7 SAVE NEW BUFFER LENGTH +L85F3 BSR L85B4 DISPLAY THE LINE ON THE SCREEN +L85F5 JSR L8687 GET A KEYSTROKE + CMPA #CR ENTER KEY? + BEQ L858A YES - INTERPRET ANOTHER COMMAND - PRINT LINE + CMPA #ESC ESCAPE? + BEQ L8625 YES - RETURN TO COMMAND LEVEL - DON’T PRINT LINE + CMPA #BS BACK SPACE? + BNE L8626 NO + CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER + BEQ L85F5 DO NOT ALLOW BS IF AT START + BSR L8650 MOVE POINTER BACK ONE, BS TO SCREEN + BSR L85D1 REMOVE ONE CHARACTER FROM BUFFER + BRA L85F5 GET INSERT SUB COMMAND +L860F CMPA #'C' CHANGE? + BNE L85DE NO +L8613 TST ,X CHECK CURRENT BUFFER CHARACTER + BEQ L8625 BRANCH IF END OF LINE + JSR L8687 GET A KEYSTROKE + BLO L861E BRANCH IF LEGITIMATE KEY + BRA L8613 TRY AGAIN IF ILLEGAL KEY +L861E STA ,X+ INSERT NEW CHARACTER INTO BUFFER + BSR L8659 SEND NEW CHARACTER TO SCREEN + DECB DECREMENT REPEAT PARAMETER + BNE L8613 BRANCH IF NOT DONE +L8625 RTS +L8626 LDB VD7 GET LENGTH OF LINE + CMPB #LBUFMX-1 COMPARE TO MAXIMUM LENGTH + BNE L862E BRANCH IF NOT AT MAXIMUM + BRA L85F5 IGNORE INPUT IF LINE AT MAXIMUM LENGTH +L862E PSHS X SAVE CURRENT BUFFER POINTER +L8630 TST ,X+ * SCAN THE LINE UNTIL END OF + BNE L8630 * LINE (0) IS FOUND +L8634 LDB ,-X DECR TEMP LINE POINTER AND GET A CHARACTER + STB $01,X PUT CHARACTER BACK DOWN ONE SPOT + CMPX ,S HAVE WE REACHED STARTING POINT? + BNE L8634 NO - KEEP GOING + LEAS $02,S PURGE BUFFER POINTER FROM STACK + STA ,X+ INSERT NEW CHARACTER INTO THE LINE + BSR L8659 SEND A CHARACTER TO CONSOLE OUT + INC VD7 ADD ONE TO BUFFER LENGTH + BRA L85F5 GET INSERT SUB COMMAND +L8646 CMPA #BS BACKSPACE? + BNE L865C NO +L864A BSR L8650 MOVE POINTER BACK 1, SEND BS TO SCREEN + DECB DECREMENT REPEAT PARAMETER + BNE L864A LOOP UNTIL DONE + RTS +L8650 CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER + BEQ L8625 DO NOT ALLOW BS IF AT START + LEAX $-01,X MOVE POINTER BACK ONE + LDA #BS BACK SPACE +L8659 JMP PUTCHR SEND TO CONSOLE OUT +L865C CMPA #'K' KILL? + BEQ L8665 YES + SUBA #'S' SEARCH? + BEQ L8665 YES + RTS +L8665 PSHS A SAVE KILL/SEARCH FLAG ON STACK + BSR L8687 * GET A KEYSTROKE (TARGET CHARACTER) + PSHS A * AND SAVE IT ON STACK +L866B LDA ,X GET CURRENT BUFFER CHARACTER + BEQ L8685 AND RETURN IF END OF LINE + TST $01,S CHECK KILL/SEARCH FLAG + BNE L8679 BRANCH IF KILL + BSR L8659 SEND A CHARACTER TO CONSOLE OUT + LEAX $01,X INCREMENT BUFFER POINTER + BRA L867C CHECK NEXT INPUT CHARACTER +L8679 JSR L85D1 REMOVE ONE CHARACTER FROM BUFFER +L867C LDA ,X GET CURRENT INPUT CHARACTER + CMPA ,S COMPARE TO TARGET CHARACTER + BNE L866B BRANCH IF NO MATCH + DECB DECREMENT REPEAT PARAMETER + BNE L866B BRANCH IF NOT DONE +L8685 PULS Y,PC THE Y PULL WILL CLEAN UP THE STACK FOR THE 2 PSHS A +* +* GET A KEYSTRKE +L8687 JSR LA171 CALL CONSOLE IN : DEV NBR=SCREEN + CMPA #$7F GRAPHIC CHARACTER? + BCC L8687 YES - GET ANOTHER CHAR + CMPA #$5F SHIFT UP ARROW (QUIT INSERT) + BNE L8694 NO + LDA #ESC REPLACE W/ESCAPE CODE +L8694 CMPA #CR ENTER KEY + BEQ L86A6 YES + CMPA #ESC ESCAPE? + BEQ L86A6 YES + CMPA #BS BACKSPACE? + BEQ L86A6 YES + CMPA #SPACE SPACE + BLO L8687 GET ANOTHER CHAR IF CONTROL CHAR + ORCC #$01 SET CARRY +L86A6 RTS + +* TRON +TRON FCB SKP1LD SKIP ONE BYTE AND LDA #$4F + +* TROFF +TROFF CLRA TROFF FLAG + STA TRCFLG TRON/TROFF FLAG:0=TROFF, <> 0=TRON + RTS + +* POS + +POS LDA #0 GET DEVICE NUMBER + LDB LPTPOS GET PRINT POSITION +LA5E8 SEX CONVERT ACCB TO 2 DIGIT SIGNED INTEGER + JMP GIVABF CONVERT ACCD TO FLOATING POINT + + +* VARPTR +VARPT JSR LB26A SYNTAX CHECK FOR ‘(‘ + LDD ARYEND GET ADDR OF END OF ARRAYS + PSHS B,A SAVE IT ON STACK + JSR LB357 GET VARIABLE DESCRIPTOR + JSR LB267 SYNTAX CHECK FOR ‘)‘ + PULS A,B GET END OF ARRAYS ADDR BACK + EXG X,D SWAP END OF ARRAYS AND VARIABLE DESCRIPTOR + CMPX ARYEND COMPARE TO NEW END OF ARRAYS + BNE L8724 ‘FC’ ERROR IF VARIABLE WAS NOT DEFINED PRIOR TO CALLING VARPTR + JMP GIVABF CONVERT VARIABLE DESCRIPTOR INTO A FP NUMBER + +* MID$(OLDSTRING,POSITION,LENGTH)=REPLACEMENT +L86D6 JSR GETNCH GET INPUT CHAR FROM BASIC + JSR LB26A SYNTAX CHECK FOR ‘(‘ + JSR LB357 * GET VARIABLE DESCRIPTOR ADDRESS AND + PSHS X * SAVE IT ON THE STACK + LDD $02,X POINT ACCD TO START OF OLDSTRING + CMPD FRETOP COMPARE TO START OF CLEARED SPACE + BLS L86EB BRANCH IF <= + SUBD MEMSIZ SUBTRACT OUT TOP OF CLEARED SPACE + BLS L86FD BRANCH IF STRING IN STRING SPACE +L86EB LDB ,X GET LENGTH OF OLDSTRING + JSR LB56D RESERVE ACCB BYTES IN STRING SPACE + PSHS X SAVE RESERVED SPACE STRING ADDRESS ON STACK + LDX $02,S POINT X TO OLDSTRING DESCRIPTOR + JSR LB643 MOVE OLDSTRING INTO STRING SPACE + PULS X,U * GET OLDSTRING DESCRIPTOR ADDRESS AND RESERVED STRING + STX $02,U * ADDRESS AND SAVE RESERVED ADDRESS AS OLDSTRING ADDRESS + PSHS U SAVE OLDSTRING DESCRIPTOR ADDRESS +L86FD JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION + PSHS B SAVE POSITION PARAMETER ON STACK + TSTB * CHECK POSITION PARAMETER AND BRANCH + BEQ L8724 * IF START OF STRING + LDB #$FF DEFAULT REPLACEMENT LENGTH = $FF + CMPA #')' * CHECK FOR END OF MID$ STATEMENT AND + BEQ L870E * BRANCH IF AT END OF STATEMENT + JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION +L870E PSHS B SAVE LENGTH PARAMETER ON STACK + JSR LB267 SYNTAX CHECK FOR ‘)‘ + LDB #TOK_EQUALS TOKEN FOR = + JSR LB26F SYNTAX CHECK FOR “=‘ + BSR L8748 EVALUATE REPLACEMENT STRING + TFR X,U SAVE REPLACEMENT STRING ADDRESS IN U + LDX $02,S POINT X TO OLOSTRING DESCRIPTOR ADDRESS + LDA ,X GET LENGTH OF OLDSTRING + SUBA $01,S SUBTRACT POSITION PARAMETER + BCC L8727 INSERT REPLACEMENT STRING INTO OLDSTRING +L8724 JMP LB44A ‘FC’ ERROR IF POSITION > LENGTH OF OLDSTRING +L8727 INCA * NOW ACCA = NUMBER OF CHARACTERS TO THE RIGHT +* * (INCLUSIVE) OF THE POSITION PARAMETER + CMPA ,S + BCC L872E BRANCH IF NEW STRING WILL FIT IN OLDSTRING + STA ,S IF NOT, USE AS MUCH OF LENGTH PARAMETER AS WILL FIT +L872E LDA $01,S GET POSITION PARAMETER + EXG A,B ACCA=LENGTH OF REPL STRING, ACCB=POSITION PARAMETER + LDX $02,X POINT X TO OLDSTRING ADDRESS + DECB * BASIC’S POSITION PARAMETER STARTS AT 1; THIS ROUTINE +* * WANTS IT TO START AT ZERO + ABX POINT X TO POSITION IN OLDSTRING WHERE THE REPLACEMENT WILL GO + TSTA * IF THE LENGTH OF THE REPLACEMENT STRING IS ZERO + BEQ L8746 * THEN RETURN + CMPA ,S + BLS L873F ADJUSTED LENGTH PARAMETER, THEN BRANCH + LDA ,S OTHERWISE USE AS MUCH ROOM AS IS AVAILABLE +L873F TFR A,B SAVE NUMBER OF BYTES TO MOVE IN ACCB + EXG U,X SWAP SOURCE AND DESTINATION POINTERS + JSR LA59A MOVE (B) BYTES FROM (X) TO (U) +L8746 PULS A,B,X,PC +L8748 JSR LB156 EVALUATE EXPRESSION + JMP LB654 *‘TM’ ERROR IF NUMERIC; RETURN WITH X POINTING +* *TO STRING, ACCB = LENGTH + +* STRING +STRING JSR LB26A SYNTAX CHECK FOR ‘(’ + JSR LB70B EVALUATE EXPRESSION; ERROR IF > 255 + PSHS B SAVE LENGTH OF STRING + JSR LB26D SYNTAX CHECK FOR COMMA + JSR LB156 EVALUATE EXPRESSION + JSR LB267 SYNTAX CHECK FOR ‘)‘ + LDA VALTYP GET VARIABLE TYPE + BNE L8768 BRANCH IF STRING + JSR LB70E CONVERT FPA0 INTO AN INTEGER IN ACCB + BRA L876B SAVE THE STRING IN STRING SPACE +L8768 JSR LB6A4 GET FIRST BYTE OF STRING +L876B PSHS B SAVE FIRST BYTE OF EXPRESSION + LDB $01,S GET LENGTH OF STRING + JSR LB50F RESERVE ACCB BYTES IN STRING SPACE + PULS A,B GET LENGTH OF STRING AND CHARACTER + BEQ L877B BRANCH IF NULL STRING +L8776 STA ,X+ SAVE A CHARACTER IN STRING SPACE + DECB DECREMENT LENGTH + BNE L8776 BRANCH IF NOT DONE +L877B JMP LB69B PUT STRING DESCRIPTOR ONTO STRING STACK + +* INSTR +INSTR JSR LB26A SYNTAX CHECK FOR ‘(‘ + JSR LB156 EVALUATE EXPRESSION + LDB #$01 DEFAULT POSITION = 1 (SEARCH START) + PSHS B SAVE START + LDA VALTYP GET VARIABLE TYPE + BNE L879C BRANCH IF STRING + JSR LB70E CONVERT FPA0 TO INTEGER IN ACCB + STB ,S SAVE START SEARCH VALUE + BEQ L8724 BRANCH IF START SEARCH AT ZERO + JSR LB26D SYNTAX CHECK FOR COMMA + JSR LB156 EVALUATE EXPRESSION - SEARCH STRING + JSR LB146 ‘TM’ ERROR IF NUMERIC +L879C LDX FPA0+2 SEARCH STRING DESCRIPTOR ADDRESS + PSHS X SAVE ON THE STACK + JSR LB26D SYNTAX CHECK FOR COMMA + JSR L8748 EVALUATE TARGET STRING EXPRESSION + PSHS X,B SAVE ADDRESS AND LENGTH ON STACK + JSR LB267 SYNTAX CHECK FOR ')' + LDX $03,S * LOAD X WITH SEARCH STRING DESCRIPTOR ADDRESS + JSR LB659 * AND GET THE LENGTH ANDADDRESS OF SEARCH STRING + PSHS B SAVE LENGTH ON STACK +* +* AT THIS POINT THE STACK HAS THE FOLLOWING INFORMATION +* ON IT: 0,S-SEARCH LENGTH; 1,S-TARGET LENGTH; 2 3,S-TARGET +* ADDRESS; 4 5,S-SEARCH DESCRIPTOR ADDRESS; 6,S-SEARCH POSITION + CMPB $06,S COMPARE LENGTH OF SEARCH STRING TO START + BLO L87D9 POSITION; RETURN 0 IF LENGTH < START + LDA $01,S GET LENGTH OF TARGET STRING + BEQ L87D6 BRANCH IF TARGET STRING = NULL + LDB $06,S GET START POSITION + DECB MOVE BACK ONE + ABX POINT X TO POSITION IN SEARCH STRING WHERE SEARCHING WILL START +L87BE LEAY ,X POINT Y TO SEARCH POSITION + LDU $02,S POINT U TO START OF TARGET + LDB $01,S LOAD ACCB WITH LENGTH OF TARGET + LDA ,S LOAD ACCA WITH LENGTH OF SEARCH + SUBA $06,S SUBTRACT SEARCH POSITION FROM SEARCH LENGTH + INCA ADD ONE + CMPA $01,S COMPARE TO TARGET LENGTH + BLO L87D9 RETURN 0 IF TARGET LENGTH > WHAT’S LEFT OF SEARCH STRING +L87CD LDA ,X+ GET A CHARACTER FROM SEARCH STRING + CMPA ,U+ COMPARE IT TO TARGET STRING + BNE L87DF BRANCH IF NO MATCH + DECB DECREMENT TARGET LENGTH + BNE L87CD CHECK ANOTHER CHARACTER +L87D6 LDB $06,S GET MATCH POSITION +L87D8 FCB SKP1 SKIP NEXT BYTE +L87D9 CLRB MATCH ADDRESS = 0 + LEAS $07,S CLEAN UP THE STACK + JMP LB4F3 CONVERT ACCB TO FP NUMBER +L87DF INC $06,S INCREMENT SEARCH POSITION + LEAX $01,Y MOVE X TO NEXT SEARCH POSITION + BRA L87BE KEEP LOOKING FOR A MATCH + +* EXTENDED BASIC RVEC19 HOOK CODE +XVEC19 CMPA #'&' * + BNE L8845 * RETURN IF NOT HEX OR OCTAL VARIABLE + LEAS $02,S PURGE RETURN ADDRESS FROM STACK +* PROCESS A VARIABLE PRECEEDED BY A ‘&‘ (&H,&O) +L87EB CLR FPA0+2 * CLEAR BOTTOM TWO + CLR FPA0+3 * BYTES OF FPA0 + LDX #FPA0+2 BYTES 2,3 OF FPA0 = (TEMPORARY ACCUMULATOR) + JSR GETNCH GET A CHARACTER FROM BASIC + CMPA #'O' + BEQ L880A YES + CMPA #'H' + BEQ L881F YES + JSR GETCCH GET CURRENT INPUT CHARACTER + BRA L880C DEFAULT TO OCTAL (&O) +L8800 CMPA #'8' + LBHI LB277 + LDB #$03 BASE 8 MULTIPLIER + BSR L8834 ADD DIGIT TO TEMPORARY ACCUMULATOR +* EVALUATE AN &O VARIABLE +L880A JSR GETNCH GET A CHARACTER FROM BASIC +L880C BLO L8800 BRANCH IF NUMERIC +L880E CLR FPA0 * CLEAR 2 HIGH ORDER + CLR FPA0+1 * BYTES OF FPA0 + CLR VALTYP SET VARXABLE TYPE TO NUMERIC + CLR FPSBYT ZERO OUT SUB BYTE OF FPA0 + CLR FP0SGN ZERO OUT MANTISSA SIGN OF FPA0 + LDB #$A0 * SET EXPONENT OF FPA0 + STB FP0EXP * + JMP LBA1C GO NORMALIZE FPA0 +* EVALUATE AN &H VARIABLE +L881F JSR GETNCH GET A CHARACTER FROM BASIC + BLO L882E BRANCH IF NUMERIC + JSR LB3A2 SET CARRY IF NOT ALPHA + BLO L880E BRANCH IF NOT ALPHA OR NUMERIC + CMPA #'G' CHECK FOR LETTERS A-F + BCC L880E BRANCH IF >= G (ILLEGAL HEX LETTER) + SUBA #7 SUBTRACT ASCII DIFFERENCE BETWEEN A AND 9 +L882E LDB #$04 BASE 16 DIGIT MULTIPLIER = 2**4 + BSR L8834 ADD DIGIT TO TEMPORARY ACCUMULATOR + BRA L881F KEEP EVALUATING VARIABLE +L8834 ASL $01,X * MULTIPLY TEMPORARY + ROL ,X * ACCUMULATOR BY TWO + LBCS LBA92 ‘OV' OVERFLOW ERROR + DECB DECREMENT SHIFT COUNTER + BNE L8834 MULTIPLY TEMPORARY ACCUMULATOR AGAIN + SUBA #'0' MASK OFF ASCII + ADDA $01,X * ADD DIGIT TO TEMPORARY + STA $01,X * ACCUMULATOR AND SAVE IT +L8845 RTS + +XVEC15 PULS U PULL RETURN ADDRESS AND SAVE IN U REGISTER + CLR VALTYP SET VARIABLE TYPE TO NUMERIC + LDX CHARAD CURRENT INPUT POINTER TO X + JSR GETNCH GET CHARACTER FROM BASIC + CMPA #'&' HEX AND OCTAL VARIABLES ARE PRECEEDED BY & + BEQ L87EB PROCESS A ‘&‘ VARIABLE + CMPA #TOK_FN TOKEN FOR FN + BEQ L88B4 PROCESS FN CALL + CMPA #$FF CHECK FOR SECONDARY TOKEN + BNE L8862 NOT SECONDARY + JSR GETNCH GET CHARACTER FROM BASIC + CMPA #TOK_USR TOKEN FOR USR + LBEQ L892C PROCESS USR CALL +L8862 STX CHARAD RESTORE BASIC’S INPUT POINTER + JMP ,U RETURN TO CALLING ROUTINE +L8866 LDX CURLIN GET CURRENT LINE NUMBER + LEAX $01,X IN DIRECT MODE? + BNE L8845 RETURN IF NOT IN DIRECT MODE + LDB #2*11 ‘ILLEGAL DIRECT STATEMENT’ ERROR +L886E JMP LAC46 PROCESS ERROR + +DEF LDX [CHARAD] GET TWO INPUT CHARS + CMPX #TOK_FF_USR TOKEN FOR USR + LBEQ L890F BRANCH IF DEF USR + BSR L88A1 GET DESCRIPTOR ADDRESS FOR FN VARIABLE NAME + BSR L8866 DON’T ALLOW DEF FN IF IN DIRECT MODE + JSR LB26A SYNTAX CHECK FOR ‘(‘ + LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE + STB ARYDIS * AND SAVE IT IN THE ARRAY DISABLE FLAG + JSR LB357 GET VARIABLE DESCRIPTOR + BSR L88B1 ‘TM’ ERROR IF STRING + JSR LB267 SYNTAX CHECK FOR ‘)‘ + LDB #TOK_EQUALS TOKEN FOR ‘=‘ + JSR LB26F DO A SYNTAX CHECK FOR = + LDX V4B GET THE ADDRESS OF THE FN NAME DESCRIPTOR + LDD CHARAD * GET THE CURRENT INPUT POINTER ADDRESS AND + STD ,X * SAVE IT IN FIRST 2 BYTES OF THE DESCRIPTOR + LDD VARPTR = GET THE DESCRIPTOR ADDRESS OF THE ARGUMENT + STD $02,X = VARIABLE AND SAVE IT IN THE DESCRIPTOR OF THE FN NAME + JMP DATA MOVE INPUT POINTER TO END OF LINE OR SUBLINE +L88A1 LDB #TOK_FN TOKEN FOR FN + JSR LB26F DO A SYNTAX CHECK FOR FN + LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE FLAG + STB ARYDIS * AND SAVE IT IN ARRAY VARIABLE FLAG + ORA #$80 SET BIT 7 OF CURRENT INPUT CHARACTER TO INDICATE AN FN VARIABLE + JSR LB35C * GET THE DESCRIPTOR ADDRESS OF THIS + STX V4B * VARIABLE AND SAVE IT IN V4B +L88B1 JMP LB143 ‘TM’ ERROR IF STRING VARIABLE +* EVALUATE AN FN CALL +L88B4 BSR L88A1 * GET THE DESCRIPTOR OF THE FN NAME + PSHS X * VARIABLE AND SAVE IT ON THE STACK + JSR LB262 SYNTAX CHECK FOR ‘(‘ & EVALUATE EXPR + BSR L88B1 ‘TM’ ERROR IF STRING VARIABLE + PULS U POINT U TO FN NAME DESCRIPTOR + LDB #2*25 ‘UNDEFINED FUNCTION CALL’ ERROR + LDX $02,U POINT X TO ARGUMENT VARIABLE DESCRIPTOR + BEQ L886E BRANCH TO ERROR HANDLER + LDY CHARAD SAVE CURRENT INPUT POINTER IN Y + LDU ,U * POINT U TO START OF FN FORMULA AND + STU CHARAD * SAVE IT IN INPUT POINTER + LDA $04,X = GET FP VALUE OF + PSHS A = ARGUMENT VARIABLE, CURRENT INPUT + LDD ,X = POINTER, AND ADDRESS OF START + LDU $02,X = OF FN FORMULA AND SAVE + PSHS U,Y,X,B,A = THEM ON THE STACK + JSR LBC35 PACK FPA0 AND SAVE IT IN (X) +L88D9 JSR LB141 EVALUATE FN EXPRESSION + PULS A,B,X,Y,U RESTORE REGISTERS + STD ,X * GET THE FP + STU $02,X * VALUE OF THE ARGUMENT + PULS A * VARIABLE OFF OF THE + STA $04,X * STACK AND RE-SAVE IT + JSR GETCCH GET FINAL CHARACTER OF THE FN FORMULA + LBNE LB277 ‘SYNTAX’ ERROR IF NOT END OF LINE + STY CHARAD RESTORE INPUT POINTER +L88EF RTS + + + +* DEF USR +L890F JSR GETNCH SKIP PAST SECOND BYTE OF DEF USR TOKEN + BSR L891C GET FN NUMBER + PSHS X SAVE FN EXEC ADDRESS STORAGE LOC + BSR L8944 CALCULATE EXEC ADDRESS + PULS U GET FN EXEC ADDRESS STORAGE LOC + STX ,U SAVE EXEC ADDRESS + RTS +L891C CLRB DEFAULT TO USR0 IF NO ARGUMENT + JSR GETNCH GET A CHARACTER FROM BASIC + BCC L8927 BRANCH IF NOT NUMERIC + SUBA #'0' MASK OFF ASCII + TFR A,B SAVE USR NUMBER IN ACCB + JSR GETNCH GET A CHARACTER FROM BASIC +L8927 LDX USRADR GET ADDRESS OF STORAGE LOCs FOR USR ADDRESS + ASLB X2 - 2 BYTES/USR ADDRESS + ABX ADD OFFSET TO START ADDRESS OF STORAGE LOCs + RTS +* PROCESS A USR CALL +L892C BSR L891C GET STORAGE LOC OF EXEC ADDRESS FOR USR N + LDX ,X * GET EXEC ADDRESS AND + PSHS X * PUSH IT ONTO STACK + JSR LB262 SYNTAX CHECK FOR ‘(‘ & EVALUATE EXPR + LDX #FP0EXP POINT X TO FPA0 + LDA VALTYP GET VARIABLE TYPE + BEQ L8943 BRANCH IF NUMERIC, STRING IF <> 0 + JSR LB657 GET LENGTH & ADDRESS OF STRING VARIABLE + LDX FPA0+2 GET POINTER TO STRING DESCRIPTOR + LDA VALTYP GET VARIABLE TYPE +L8943 RTS JUMP TO USR ROUTINE (PSHS X ABOVE) +L8944 LDB #TOK_EQUALS TOKEN FOR ‘=‘ + JSR LB26F DO A SYNTAX CHECK FOR = + JMP LB73D EVALUATE EXPRESSION, RETURN VALUE IN X + + + +* DEL +DEL LBEQ LB44A FC’ ERROR IF NO ARGUMENT + JSR LAF67 CONVERT A DECIMAL BASiC NUMBER TO BINARY + JSR LAD01 FIND RAM ADDRESS OF START OF A BASIC LINE + STX VD3 SAVE RAM ADDRESS OF STARTING LINE NUMBER + JSR GETCCH GET CURRENT INPUT CHARACTER + BEQ L8990 BRANCH IF END OF LINE + CMPA #TOK_MINUS TOKEN FOR ‘-' + BNE L89BF TERMINATE COMMAND IF LINE NUMBER NOT FOLLOWED BY ‘-‘ + JSR GETNCH GET A CHARACTER FROM BASIC + BEQ L898C IF END OF LINE, USE DEFAULT ENDING LINE NUMBER + BSR L89AE * CONVERT ENDING LINE NUMBER TO BINARY + BRA L8990 * AND SAVE IT IN BINVAL +L898C LDA #$FF = USE $FFXX AS DEFAULT ENDING + STA BINVAL = LINE NUMBER - SAVE IT IN BINVAL +L8990 LDU VD3 POINT U TO STARTING LINE NUMBER ADDRESS +L8992 FCB SKP2 SKIP TWO BYTES +L8993 LDU ,U POINT U TO START OF NEXT LINE + LDD ,U CHECK FOR END OF PROGRAM + BEQ L899F BRANCH IF END OF PROGRAM + LDD $02,U LOAD ACCD WITH THIS LINE’S NUMBER + SUBD BINVAL SUBTRACT ENDING LINE NUMBER ADDRESS + BLS L8993 BRANCH IF = < ENDING LINE NUMBER +L899F LDX VD3 GET STARTING LINE NUMBER + BSR L89B8 MOVE (U) TO (X) UNTIL END OF PROGRAM + JSR LAD21 RESET BASIC’S INPUT POINTER AND ERASE VARIABLES + LDX VD3 GET STARTING LINE NUMBER ADDRESS + JSR LACF1 RECOMPUTE START OF NEXT LINE ADDRESSES + JMP LAC73 JUMP TO BASIC’S MAIN COMMAND LOOP +L89AE JSR LAF67 GO GET LINE NUMBER CONVERTED TO BINARY + JMP LA5C7 MAKE SURE THERE’S NO MORE ON THIS LINE +L89B4 LDA ,U+ GET A BYTE FROM (U) + STA ,X+ MOVE THE BYTE TO (X) +L89B8 CMPU VARTAB COMPARE TO END OF BASIC + BNE L89B4 BRANCH IF NOT AT END + STX VARTAB SAVE (X) AS NEW END OF BASIC +L89BF RTS + + +L89C0 JSR L8866 ‘BS’ ERROR IF IN DIRECT MODE + JSR GETNCH GET A CHAR FROM BASIC +L89D2 CMPA #'"' CHECK FOR PROMPT STRING + BNE L89E1 BRANCH IF NO PROMPT STRING + JSR LB244 STRIP OFF PROMPT STRING & PUT IT ON STRING STACK + LDB #';' * + JSR LB26F * DO A SYNTAX CHECK FOR; + JSR LB99F REMOVE PROMPT STRING FROM STRING STACK & SEND TO CONSOLE OUT +L89E1 LEAS $-02,S RESERVE TWO STORAGE SLOTS ON STACK + JSR LB035 INPUT A LINE FROM CURRENT INPUT DEVICE + LEAS $02,S CLEAN UP THE STACK + JSR LB357 SEARCH FOR A VARIABLE + STX VARDES SAVE POINTER TO VARIABLE DESCRIPTOR + JSR LB146 ‘TM’ ERROR IF VARIABLE TYPE = NUMERIC + LDX #LINBUF POINT X TO THE STRING BUFFER WHERE THE INPUT STRING WAS STORED + CLRA TERMINATOR CHARACTER 0 (END OF LINE) + JSR LB51A PARSE THE INPUT STRING AND STORE IT IN THE STRING SPACE + JMP LAFA4 REMOVE DESCRIPTOR FROM STRING STACK +L89FC JSR LAF67 STRIP A DECIMAL NUMBER FROM BASIC INPUT LINE + LDX BINVAL GET BINARY VALUE + RTS +L8A02 LDX VD1 GET CURRENT OLD NUMBER BEING RENUMBERED +L8A04 STX BINVAL SAVE THE LINE NUMBER BEING SEARCHED FOR + JMP LAD01 GO FIND THE LINE NUMBER IN BASIC PROGRAM + +* RENUM +RENUM JSR LAD26 ERASE VARIABLES + LDD #10 DEFAULT LINE NUMBER INTERVAL + STD VD5 SAVE DEFAULT RENUMBER START LINE NUMBER + STD VCF SAVE DEFAULT INTERVAL + CLRB NOW ACCD = 0 + STD VD1 DEFAULT LINE NUMBER OF WHERE TO START RENUMBERING + JSR GETCCH GET CURRENT INPUT CHARACTER + BCC L8A20 BRANCH IF NOT NUMERIC + BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY + STX VD5 SAVE LINE NUMBER WHERE RENUMBERING STARTS + JSR GETCCH GET CURRENT INPUT CHARACTER +L8A20 BEQ L8A3D BRANCH IF END OF LINE + JSR LB26D SYNTAX CHECK FOR COMMA + BCC L8A2D BRANCH IF NEXT CHARACTER NOT NUMERIC + BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY + STX VD1 SAVE NEW RENUMBER LINE + JSR GETCCH GET CURRENT INPUT CHARACTER +L8A2D BEQ L8A3D BRANCH IF END OF LINE + JSR LB26D SYNTAX CHECK FOR COMMA + BCC L8A3A BRANCH IF NEXT CHARACTER NOT NUMERIC + BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY + STX VCF SAVE NEW INTERVAL + BEQ L8A83 ‘FC' ERROR +L8A3A JSR LA5C7 CHECK FOR MORE CHARACTERS ON LINE - ‘SYNTAX’ ERROR IF ANY +L8A3D BSR L8A02 GO GET ADDRESS OF OLD NUMBER BEING RENUMBERED + STX VD3 SAVE ADDRESS + LDX VD5 GET NEXT RENUMBERED LINE NUMBER TO USE + BSR L8A04 FIND THE LINE NUMBER IN THE BASIC PROGRAM + CMPX VD3 COMPARE TO ADDRESS OF OLD LINE NUMBER + BLO L8A83 ‘FC’ ERROR IF NEW ADDRESS < OLD ADDRESS + BSR L8A67 MAKE SURE RENUMBERED LINE NUMBERS WILL BE IN RANGE + JSR L8ADD CONVERT ASCII LINE NUMBERS TO ‘EXPANDED’ BINARY + JSR LACEF RECALCULATE NEXT LINE RAM ADDRESSES + BSR L8A02 GET RAM ADDRESS OF FIRST LINE TO BE RENUMBERED + STX VD3 SAVE IT + BSR L8A91 MAKE SURE LINE NUMBERS EXIST + BSR L8A68 INSERT NEW LINE NUMBERS IN LINE HEADERS + BSR L8A91 INSERT NEW LINE NUMBERS IN PROGRAM STATEMENTS + JSR L8B7B CONVERT PACKED BINARY LINE NUMBERS TO ASCII + JSR LAD26 ERASE VARIABLES + JSR LACEF RECALCULATE NEXT LINE RAM ADDRESS + JMP LAC73 GO BACK TO BASIC’S MAIN LOOP +L8A67 FCB SKP1LD SKIP ONE BYTE - LDA #$4F +L8A68 CLRA NEW LINE NUMBER FLAG - 0; INSERT NEW LINE NUMBERS + STA VD8 SAVE NEW LINE NUMBER FLAG; 0 = INSERT NEW NUMBERS + LDX VD3 GET ADDRESS OF OLD LINE NUMBER BEING RENUMBERED + LDD VD5 GET THE CURRENT RENUMBERED LINE NUMBER + BSR L8A86 RETURN IF END OF PROGRAM +L8A71 TST VD8 CHECK NEW LINE NUMBER FLAG + BNE L8A77 BRANCH IF NOT INSERTING NEW LINE NUMBERS + STD $02,X STORE THE NEW LINE NUMBER IN THE BASIC PROGRAM +L8A77 LDX ,X POINT X TO THE NEXT LINE IN BASIC + BSR L8A86 RETURN IF END OF PROGRAM + ADDD VCF ADD INTERVAL TO CURRENT RENUMBERED LINE NUMBER + BLO L8A83 ‘FC’ ERROR IF LINE NUMBER > $FFFF + CMPA #MAXLIN LARGEST LINE NUMBER = $F9FF + BLO L8A71 BRANCH IF LEGAL LINE NUMBER +L8A83 JMP LB44A ‘FC’ ERROR IF LINE NUMBER MS BYTE > $F9 +* TEST THE TWO BYTES POINTED TO BY (X). +* NORMAL RETURN IF <> 0. IF = 0 (END OF +* PROGRAM) RETURN IS PULLED OFF STACK AND +* YOU RETURN TO PREVIOUS SUBROUTINE CALL. +L8A86 PSHS B,A SAVE ACCD + LDD ,X TEST THE 2 BYTES POINTED TO BY X + PULS A,B RESTORE ACCD + BNE L8A90 BRANCH IF NOT END OF PROGRAM + LEAS $02,S PURGE RETURN ADDRESS FROM STACK +L8A90 RTS +L8A91 LDX TXTTAB GET START OF BASIC PROGRAM + LEAX $-01,X MOVE POINTER BACK ONE +L8A95 LEAX $01,X MOVE POINTER UP ONE + BSR L8A86 RETURN IF END OF PROGRAM +L8A99 LEAX $03,X SKIP OVER NEXT LINE ADDRESS AND LINE NUMBER +L8A9B LEAX $01,X MOVE POINTER TO NEXT CHARACTER + LDA ,X CHECK CURRENT CHARACTER + BEQ L8A95 BRANCH IF END OF LINE + STX TEMPTR SAVE CURRENT POINTER + DECA = + BEQ L8AB2 =BRANCH IF START OF PACKED NUMERIC LINE + DECA * + BEQ L8AD3 *BRANCH IF LINE NUMBER EXISTS + DECA = + BNE L8A9B =MOVE TO NEXT CHARACTER IF > 3 +L8AAC LDA #$03 * SET 1ST BYTE = 3 TO INDICATE LINE + STA ,X+ * NUMBER DOESN’T CURRENTLY EXIST + BRA L8A99 GO GET ANOTHER CHARACTER +L8AB2 LDD $01,X GET MS BYTE OF LINE NUMBER + DEC $02,X DECREMENT ZERO CHECK BYTE + BEQ L8AB9 BRANCH IF MS BYTE <> 0 + CLRA CLEAR MS BYTE +L8AB9 LDB $03,X GET LS BYTE OF LINE NUMBER + DEC $04,X DECREMENT ZERO CHECK FLAG + BEQ L8AC0 BRANCH IF IS BYTE <> 0 + CLRB CLEAR LS BYTE +L8AC0 STD $01,X SAVE BINARY LINE NUMBER + STD BINVAL SAVE TRIAL LINE NUMBER + JSR LAD01 FIND RAM ADDRESS OF A BASIC LINE NUMBER +L8AC7 LDX TEMPTR GET BACK POINTER TO START OF PACKED LINE NUMBER + BLO L8AAC BRANCH IF NO LINE NUMBER MATCH FOUND + LDD V47 GET START ADDRESS OF LINE NUMBER + INC ,X+ * SET 1ST BYTE = 2, TO INDICATE LINE NUMBER EXISTS IF CHECKING FOR +* * EXISTENCE OF LINE NUMBER, SET IT = 1 IF INSERTING LINE NUMBERS + + STD ,X SAVE RAM ADDRESS OF CORRECT LINE NUMBER + BRA L8A99 GO GET ANOTHER CHARACTER +L8AD3 CLR ,X CLEAR CARRY FLAG AND 1ST BYTE + LDX $01,X POINT X TO RAM ADDRESS OF CORRECT LINE NUMBER + LDX $02,X PUT CORRECT LINE NUMBER INTO (X) + STX V47 SAVE IT TEMPORARILY + BRA L8AC7 GO INSERT IT INTO BASIC LINE +L8ADD LDX TXTTAB GET BEGINNING OF BASIC PROGRAM + BRA L8AE5 +L8AE1 LDX CHARAD *GET CURRENT INPUT POINTER + LEAX $01,X *AND BUMP IT ONE +L8AE5 BSR L8A86 RETURN IF END OF PROGRAM + LEAX $02,X SKIP PAST NEXT LINE ADDRESS +L8AE9 LEAX $01,X ADVANCE POINTER BY ONE +L8AEB STX CHARAD SAVE NEW BASIC INPUT POINTER +L8AED JSR GETNCH GET NEXT CHARACTER FROM BASIC +L8AEF TSTA CHECK THE CHARACTER + BEQ L8AE1 BRANCH IF END OF LINE + BPL L8AED BRANCH IF NOT A TOKEN + LDX CHARAD GET CURRENT INPUT POINTER + CMPA #$FF IS THIS A SECONDARY TOKEN? + BEQ L8AE9 YES - IGNORE IT + CMPA #TOK_THEN TOKEN FOR THEN? + BEQ L8B13 YES + CMPA #TOK_ELSE TOKEN FOR ELSE? + BEQ L8B13 YES + CMPA #TOK_GO TOKEN FOR GO? + BNE L8AED NO + JSR GETNCH GET A CHARACTER FROM BASIC + CMPA #TOK_TO TOKEN FOR TO? + BEQ L8B13 YES + CMPA #TOK_SUB TOKEN FOR SUB? + BNE L8AEB NO +L8B13 JSR GETNCH GET A CHARACTER FROM BASIC + BLO L8B1B BRANCH IF NUMERIC +L8B17 JSR GETCCH GET CURRENT BASIC INPUT CHARRACTER + BRA L8AEF KEEP CHECKING THE LINE +L8B1B LDX CHARAD GET CURRENT INPUT ADDRESS + PSHS X SAVE IT ON THE STACK + JSR LAF67 CONVERT DECIMAL BASIC NUMBER TO BINARY + LDX CHARAD GET CURRENT INPUT POINTER +L8B24 LDA ,-X GET PREVIOUS INPUT CHARACTER + JSR L90AA CLEAR CARRY IF NUMERIC INPUT VALUE + BLO L8B24 BRANCH IF NON-NUMERIC + LEAX $01,X MOVE POINTER UP ONE + TFR X,D NOW ACCD POINTS TO ONE PAST END OF LINE NUMBER + SUBB $01,S SUBTRACT PRE-NUMERIC POINTER LS BYTE + SUBB #$05 MAKE SURE THERE ARE AT LEAST 5 CHARACTERS IN THE NUMERIC LINE +* + BEQ L8B55 BRANCH IF EXACTLY 5 + BLO L8B41 BRANCH IF < 5 + LEAU ,X TRANSFER X TO U + NEGB NEGATE B + LEAX B,X MOVE X BACK B BYTES + JSR L89B8 *MOVE BYTES FROM (U) TO (X) UNTIL +* *U = END OF BASIC; (I) = NEW END OF BASIC + BRA L8B55 +* FORCE FIVE BYTES OF SPACE FOR THE LINE NUMBER +L8B41 STX V47 SAVE END OF NUMERIC VALUE + LDX VARTAB GET END OF BASIC PROGRAM + STX V43 SAVE IT + NEGB NEGATE B + LEAX B,X ADD IT TO END OF NUMERIC POiNTER + STX V41 SAVE POINTER + STX VARTAB STORE END OF BASIC PROGRAM + JSR LAC1E ACCD = TOP OF ARRAYS - CHECK FOR ENOUGH ROOM + LDX V45 * GET AND SAVE THE + STX CHARAD * NEW CURRENT INPUT POINTER +L8B55 PULS X RESTORE POINTER TO START OF NUMERIC VALUE + LDA #$01 NEW LINE NUMBER FLAG + STA ,X * SAVE NEW LINE FLAG + STA $02,X * + STA $04,X * + LDB BINVAL GET MS BYTE OF BINARY LINE NUMBER + BNE L8B67 BRANCH IF IT IS NOT ZERO + LDB #$01 SAVE A 1 IF BYTE IS 0; OTHERWISE, BASIC WILL +* THINK IT IS THE END OF A LINE + INC $02,X IF 2,X = 2, THEN PREVIOUS BYTE WAS A ZERO +L8B67 STB $01,X SAVE MS BYTE OF BINARY LINE NUMBER + LDB BINVAL+1 GET IS BYTE OF BINARY LINE NUMBER + BNE L8B71 BRANCH IF NOT A ZERO BYTE + LDB #$01 SAVE A 1 IF BYTE IS A 0 + INC $04,X IF 4,X = 2, THEN PREVIOUS BYTE WAS A 0 +L8B71 STB $03,X SAVE LS BYTE OF BINARY LINE NUMBER + JSR GETCCH GET CURRENT INPUT CHARACTER + CMPA #',' IS IT A COMMA? + BEQ L8B13 YES - PROCESS ANOTHER NUMERIC VALUE + BRA L8B17 NO - GO GET AND PROCESS AN INPUT CHARACTER +L8B7B LDX TXTTAB POINT X TO START OF BASIC PROGRAM + LEAX $-01,X MOVE POINTER BACK ONE +L8B7F LEAX $01,X MOVE POINTER UP ONE + LDD $02,X GET ADDRESS OF NEXT LINE + STD CURLIN SAVE IT IN CURLIN + JSR L8A86 RETURN IF END OF PROGRAM + LEAX $03,X SKIP OVER ADDRESS OF NEXT LINE AND 1ST BYTE OF LINE NUMBER +L8B8A LEAX $01,X MOVE POINTER UP ONE +L8B8C LDA ,X GET CURRENT CHARACTER + BEQ L8B7F BRANCH IF END OF LINE + DECA INPUT CHARACTER = 1? - VALID LINE NUMBER + BEQ L8BAE YES + SUBA #$02 INPUT CHARACTER 3? - UL LINE NUMBER + BNE L8B8A NO + PSHS X SAVE CURRENT POSITION OF INPUT POINTER + LDX #L8BD9-1 POINT X TO ‘UL’ MESSAGE + JSR LB99C PRINT STRING TO THE SCREEN + LDX ,S GET INPUT POINTER + LDD $01,X GET THE UNDEFINED LINE NUMBER + JSR LBDCC CONVERT NUMBER IN ACCD TO DECIMAL AND DISPLAY IT + JSR LBDC5 PRINT ‘IN XXXX’ XXXX = CURRENT LINE NUMBER + JSR LB958 SEND A CR TO CONSOLE OUT + PULS X GET INPUT POINTER BACK +L8BAE PSHS X SAVE CURRENT POSITION OF INPUT POINTER + LDD $01,X LOAD ACCD WITH BINARY VALUE OF LINE NUMBER + STD FPA0+2 SAVE IN BOTTOM 2 BYTES OF FPA0 + JSR L880E ADJUST REST OF FPA0 AS AN INTEGER + JSR LBDD9 CONVERT FPA0 TO ASCII, STORE IN LINE NUMBER + PULS U LOAD U WITH PREVIOUS ADDRESS OF INPUT POINTER + LDB #$05 EACH EXPANDED LINE NUMBER USES 5 BYTES +L8BBE LEAX $01,X MOVE POINTER FORWARD ONE + LDA ,X GET AN ASCII BYTE + BEQ L8BC9 BRANCH IF END OF NUMBER + DECB DECREMENT BYTE COUNTER + STA ,U+ STORE ASCII NUMBER IN BASIC LINE + BRA L8BBE CHECK FOR ANOTHER DIGIT +L8BC9 LEAX ,U TRANSFER NEW LINE POINTER TO (X) + TSTB DOES THE NEW LINE NUMBER REQUIRE 5 BYTES? + BEQ L8B8C YES - GO GET ANOTHER INPUT CHARACTER + LEAY ,U SAVE NEW LINE POINTER IN Y + LEAU B,U POINT U TO END OF 5 BYTE PACKED LINE NUMBER BLOCK + JSR L89B8 MOVE BYTES FROM (U) TO (X) UNTIL END OF PROGRAM + LEAX ,Y LOAD (X) WITH NEW LINE POINTER + BRA L8B8C GO GET ANOTHER INPUT CHARACTER + +L8BD9 FCC "UL " UNKNOWN LINE NUMBER MESSAGE + FCB 0 + + +HEXDOL JSR LB740 CONVERT FPA0 INTO A POSITIVE 2 BYTE INTEGER + LDX #STRBUF+2 POINT TO TEMPORARY BUFFER + LDB #$04 CONVERT 4 NIBBLES +L8BE5 PSHS B SAVE NIBBLE COUNTER + CLRB CLEAR CARRY FLAG + LDA #$04 4 SHIFTS +L8BEA ASL FPA0+3 * SHIFT BOTTOM TWO BYTES OF + ROL FPA0+2 * FPA0 LEFT ONE BIT (X2) + ROLB IF OVERFLOW, ACCB <> 0 + DECA * DECREMENT SHIFT COUNTER AND + BNE L8BEA * BRANCH IF NOT DONE + TSTB CHECK FOR OVERFLOW + BNE L8BFF BRANCH IF OVERFLOW + LDA ,S * GET NIBBLE COUNTER, + DECA * DECREMENT IT AND + BEQ L8BFF * BRANCH IF DONE + CMPX #STRBUF+2 DO NOT DO A CONVERSION UNTIL A NON-ZERO + BEQ L8C0B BYTE IS FOUND - LEADING ZERO SUPPRESSION +L8BFF ADDB #'0' ADD IN ASCII ZERO + CMPB #'9' COMPARE TO ASCII 9 + BLS L8C07 BRANCH IF < 9 + ADDB #7 ADD ASCII OFFSET IF HEX LETTER +L8C07 STB ,X+ STORE HEX VALUE AND ADVANCE POINTER + CLR ,X CLEAR NEXT BYTE - END OF STRING FLAG +L8C0B PULS B * GET NIBBLE COUNTER, + DECB * DECREMENT IT AND + BNE L8BE5 * BRANCH IF NOT DONE + LEAS $02,S PURGE RETURN ADDRESS OFF OF STACK + LDX #STRBUF+1 RESET POINTER + JMP LB518 SAVE STRING ON STRING STACK +* PROCESS EXCLAMATION POINT +L8E37 LDA #$01 * SET SPACES + STA VD9 * COUNTER = 1 +* PROCESS STRING ITEM - LIST +L8E3B DECB DECREMENT FORMAT STRING LENGTH COUNTER + JSR L8FD8 SEND A '+' TO CONSOLE OUT IF VDA <>0 + JSR GETCCH GET CURRENT INPUT CHARACTER + LBEQ L8ED8 EXIT PRINT USING IF END OF LINE + STB VD3 SAVE REMAINDER FORMAT STRING LENGTH + JSR LB156 EVALUATE EXPRESSION + JSR LB146 ‘TM’ ERROR IF NUMERIC VARIABLE + LDX FPA0+2 * GET ITEM - LIST DESCRIPTOR ADDRESS + STX V4D * AND SAVE IT IN V4D + LDB VD9 GET SPACES COUNTER + JSR LB6AD PUT ACCB BYTES INTO STRING SPACE & PUT DESCRIPTOR ON STRING STACK + JSR LB99F PRINT THE FORMATTED STRING TO CONSOLE OUT +* PAD FORMAT STRING WITH SPACES IF ITEM - LIST STRING < FORMAT STRING LENGTH + LDX FPA0+2 POINT X TO FORMATTED STRING DESCRIPTOR ADDRESS + LDB VD9 GET SPACES COUNTER + SUBB ,X SUBTRACT LENGTH OF FORMATTED STRING +L8E5F DECB DECREMENT DIFFERENCE + LBMI L8FB3 GO INTERPRET ANOTHER ITEM - LIST + JSR LB9AC PAD FORMAT STRING WITH A SPACE + BRA L8E5F KEEP PADDING +* PERCENT SIGN - PROCESS A %SPACES% COMMAND +L8E69 STB VD3 * SAVE THE CURRENT FORMAT STRING + STX TEMPTR * COUNTER AND POINTER + LDA #$02 INITIAL SPACES COUNTER = 2 + STA VD9 SAVE IN SPACES COUNTER +L8E71 LDA ,X GET A CHARACTER FROM FORMAT STRING + CMPA #'%' COMPARE TO TERMINATOR CHARACTER + BEQ L8E3B BRANCH IF END OF SPACES COMMAND + CMPA #' ' BLANK + BNE L8E82 BRANCH IF ILLEGAL CHARACTER + INC VD9 ADD ONE TO SPACES COUNTER + LEAX $01,X MOVE FORMAT POINTER UP ONE + DECB DECREMENT LENGTH COUNTER + BNE L8E71 BRANCH IF NOT END OF FORMAT STRING +L8E82 LDX TEMPTR * RESTORE CURRENT FORMAT STRING COUNTER + LDB VD3 * AND POINTER TO POSITION BEFORE SPACES COMMAND + LDA #'%' SEND A ‘%’ TO CONSOLE OUT AS A DEBUGGING AID +* ERROR PROCESSOR - ILLEGAL CHARACTER OR BAD SYNTAX IN FORMAT STRING +L8E88 JSR L8FD8 SEND A ‘+' TO CONSOLE OUT IF VDA <> 0 + JSR PUTCHR SEND CHARACTER TO CONSOLE OUT + BRA L8EB9 GET NEXT CHARACTER IN FORMAT STRING + +* PRINT RAM HOOK +XVEC9 CMPA #TOK_USING USING TOKEN + BEQ L8E95 BRANCH IF PRINT USING + RTS + +* PRINT USING +* VDA IS USED AS A STATUS BYTE: BIT 6 = COMMA FORCE +* BIT 5=LEADING ASTERISK FORCE; BIT 4 = FLOATING $ FORCE +* BIT 3 = PRE SIGN FORCE; BIT 2 = POST SIGN FORCE; BIT 0 = EXPONENTIAL FORCE +L8E95 LEAS $02,S PURGE RETURN ADDRESS OFF THE STACK + JSR LB158 EVALUATE FORMAT STRING + JSR LB146 ‘TM’ ERROR IF VARIABLE TYPE = NUMERIC + LDB #';' CHECK FOR ITEM LIST SEPARATOR + JSR LB26F SYNTAX CHECK FOR ; + LDX FPA0+2 * GET FORMAT STRING DESCRIPTOR ADDRESS + STX VD5 * AND SAVE IT IN VD5 + BRA L8EAE GO PROCESS FORMAT STRING +L8EA8 LDA VD7 *CHECK NEXT PRINT ITEM FLAG AND + BEQ L8EB4 *‘FC’ ERROR IF NO FURTHER PRINT ITEMS + LDX VD5 RESET FORMAT STRING POINTER TO START OF STRING +L8EAE CLR VD7 RESET NEXT PRINT ITEM FLAG + LDB ,X GET LENGTH OF FORMAT STRING + BNE L8EB7 INTERPRET FORMAT STRING IF LENGTH > 0 +L8EB4 JMP LB44A ‘FC’ ERROR IF FORMAT STRING = NULL +L8EB7 LDX $02,X POINT X TO START OF FORMAT STRING +* INTERPRET THE FORMAT STRING +L8EB9 CLR VDA CLEAR THE STATUS BYTE +L8EBB CLR VD9 CLEAR LEFT DIGIT COUNTER + LDA ,X+ GET A CHARACTER FROM FORMAT STRING + CMPA #'!' EXCLAMATION POINT? + LBEQ L8E37 YES - STRING TYPE FORMAT + CMPA #'#' NUMBER SIGN? (DIGIT LOCATOR) + BEQ L8F24 YES - NUMERIC TYPE FORMAT + DECB DECREMENT FORMAT STRING LENGTH + BNE L8EE2 BRANCH IF NOT DONE + JSR L8FD8 SEND A ‘+‘ TO CONSOLE OUT IF VDA <> 0 + JSR PUTCHR SEND CHARACTER TO CONSOLE OUT +L8ED2 JSR GETCCH GET CURRENT CHARACTER FROM BASIC + BNE L8EA8 BRANCH IF NOT END OF LINE + LDA VD7 GET NEXT PRINT ITEM FLAG +L8ED8 BNE L8EDD BRANCH IF MORE PRINT ITEMS + JSR LB958 SEND A CARRIAGE RETURN TO CONSOLE OUT +L8EDD LDX VD5 POINT X TO FORMAT STRING DESCRIPTOR + JMP LB659 RETURN ADDRESS AND LENGTH OF FORMAT STRING - EXIT PRINT USING +L8EE2 CMPA #'+' CHECK FOR ‘+‘ (PRE-SIGN FORCE) + BNE L8EEF NO PLUS + JSR L8FD8 SEND A ‘+' TO CONSOLE OUT IF VDA <> 0 + LDA #$08 * LOAD THE STATUS BYTE WITH 8; + STA VDA * PRE-SIGN FORCE FLAG + BRA L8EBB INTERPRET THE REST OF THE FORMAT STRING +L8EEF CMPA #'.' DECIMAL POINT? + BEQ L8F41 YES + CMPA #'%' PERCENT SIGN? + LBEQ L8E69 YES + CMPA ,X COMPARE THE PRESENT FORMAT STRING INPUT +* CHARACTER TO THE NEXT ONE IN THE STRING +L8EFB BNE L8E88 NO MATCH - ILLEGAL CHARACTER +* TWO CONSECUTIVE EQUAL CHARACTERS IN FORMAT STRING + CMPA #'$' DOLLAR SIGN? + BEQ L8F1A YES - MAKE THE DOLLAR SIGN FLOAT + CMPA #'*' ASTERISK? + BNE L8EFB NO - ILLEGAL CHARACTER + LDA VDA * GRAB THE STATUS BYTE AND BET BIT 5 + ORA #$20 * TO INDICATE THAT THE OUTPUT WILL + STA VDA * BE LEFT PADDED WITH ASTERISKS + CMPB #2 * CHECK TO SEE IF THE $$ ARE THE LAST TWO + BLO L8F20 * CHARACTERS IN THE FORMAT STRING AND BRANCH IF SO + LDA $01,X GET THE NEXT CHARACTER AFTER ** + CMPA #'$' CHECK FOR **$ + BNE L8F20 CHECK FOR MORE CHARACTERS + DECB DECREMENT STRING LENGTH COUNTER + LEAX $01,X MOVE FORMAT STRING POINTER UP ONE + INC VD9 ADD ONE TO LEFT DIGIT COUNTER - FOR ASTERISK PAD AND +* FLOATING DOLLAR SIGN COMBINATION +L8F1A LDA VDA * GET THE STATUS BYTE AND SET + ORA #$10 * BIT 4 TO INDICATE A + STA VDA * FLOATING DOLLAR SIGN +L8F20 LEAX $01,X MOVE FORMAT STRING POINTER UP ONE + INC VD9 ADD ONE TO LEFT DIGIT (FLOATING $ OR ASTERISK PAD) +* PROCESS CHARACTERS TO THE LEFT OF THE DECIMAL POINT IN THE FORMAT STRING +L8F24 CLR VD8 CLEAR THE RIGHT DIGIT COUNTER +L8F26 INC VD9 ADD ONE TO LEFT DIGIT COUNTER + DECB DECREMENT FORMAT STRING LENGTH COUNTER + BEQ L8F74 BRANCH IF END OF FORMAT STRING + LDA ,X+ GET THE NEXT FORMAT CHARACTER + CMPA #'.' DECIMAL POINT? + BEQ L8F4F YES + CMPA #'#' NUMBER SIGN? + BEQ L8F26 YES + CMPA #',' COMMA? + BNE L8F5A NO + LDA VDA * GET THE STATUS BYTE + ORA #$40 * AND SET BIT 6 WHICH IS THE + STA VDA * COMMA SEPARATOR FLAG + BRA L8F26 PROCESS MORE CHARACTERS TO LEFT OF DECIMAL POINT +* PROCESS DECIMAL POINT IF NO DIGITS TO LEFT OF IT +L8F41 LDA ,X GET NEXT FORMAT CHARACTER + CMPA #'#' IS IT A NUMBER SIGN? + LBNE L8E88 NO + LDA #1 * SET THE RIGHT DIGIT COUNTER TO 1 - + STA VD8 * ALLOW ONE SPOT FOR DECIMAL POINT + LEAX $01,X MOVE FORMAT POINTER UP ONE +* PROCESS DIGITS TO RIGHT OF DECIMAL POINT +L8F4F INC VD8 ADD ONE TO RIGHT DIGIT COUNTER + DECB DECREMENT FORMAT LENGTH COUNTER + BEQ L8F74 BRANCH IF END OF FORMAT STRING + LDA ,X+ GET A CHARACTER FROM FORMAT STRING + CMPA #'#' IS IT NUMBER SIGN? + BEQ L8F4F YES - KEEP CHECKING +* CHECK FOR EXPONENTIAL FORCE +L8F5A CMPA #$5E CHECK FOR UP ARROW + BNE L8F74 NO UP ARROW + CMPA ,X IS THE NEXT CHARACTER AN UP ARROW? + BNE L8F74 NO + CMPA $01,X AND THE NEXT CHARACTER? + BNE L8F74 NO + CMPA $02,X HOW ABOUT THE 4TH CHARACTER? + BNE L8F74 NO, ALSO + CMPB #4 * CHECK TO SEE IF THE 4 UP ARROWS ARE IN THE + BLO L8F74 * FORMAT STRING AND BRANCH IF NOT + SUBB #4 * MOVE POINTER UP 4 AND SUBTRACT + LEAX $04,X * FOUR FROM LENGTH + INC VDA INCREMENT STATUS BYTE - EXPONENTIAL FORM + +* CHECK FOR A PRE OR POST - SIGN FORCE AT END OF FORMAT STRING +L8F74 LEAX $-01,X MOVE POINTER BACK ONE + INC VD9 ADD ONE TO LEFT DIGIT COUNTER FOR PRE-SIGN FORCE + LDA VDA * PRE-SIGN + BITA #$08 * FORCE AND + BNE L8F96 * BRANCH IF SET + DEC VD9 DECREMENT LEFT DIGIT — NO PRE-SIGN FORCE + TSTB * CHECK LENGTH COUNTER AND BRANCH + BEQ L8F96 * IF END OF FORMAT STRING + LDA ,X GET NEXT FORMAT STRING CHARACTER + SUBA #'-' CHECK FOR MINUS SIGN + BEQ L8F8F BRANCH IF MINUS SIGN + CMPA #$FE * WAS CMPA #('+')-('-') + BNE L8F96 BRANCH IF NO PLUS SIGN + LDA #$08 GET THE PRE-SIGN FORCE FLAG +L8F8F ORA #$04 ‘OR’ IN POST-SIGN FORCE FLAG + ORA VDA ‘OR’ IN THE STATUS BYTE + STA VDA SAVE THE STATUS BYTE + DECB DECREMENT FORMAT STRING LENGTH + +* EVALUATE NUMERIC ITEM-LIST +L8F96 JSR GETCCH GET CURRENT CHARACTER + LBEQ L8ED8 BRANCH IF END OF LINE + STB VD3 SAVE FORMAT STRING LENGTH WHEN FORMAT EVALUATION ENDED + JSR LB141 EVALUATE EXPRESSION + LDA VD9 GET THE LEFT DIGIT COUNTER + ADDA VD8 ADD IT TO THE RIGHT DIGIT COUNTER + CMPA #17 * + LBHI LB44A *‘FC’ ERROR IF MORE THAN 16 DIGITS AND DECIMAL POiNT + JSR L8FE5 CONVERT ITEM-LIST TO FORMATTED ASCII STRING + LEAX $-01,X MOVE BUFFER POINTER BACK ONE + JSR LB99C DISPLAY THE FORMATTED STRING TO CONSOLE OUT +L8FB3 CLR VD7 RESET NEXT PRINT ITEM FLAG + JSR GETCCH GET CURRENT INPUT CHARACTER + BEQ L8FC6 BRANCH IF END OF LINE + STA VD7 SAVE CURRENT CHARACTER (<>0) IN NEXT PRINT ITEM FLAG + CMPA #';' * CHECK FOR ; - ITEM-LIST SEPARATOR AND + BEQ L8FC4 * BRANCH IF SEMICOLON + JSR LB26D SYNTAX CHECK FOR COMMA + BRA L8FC6 PROCESS NEXT PRINT ITEM +L8FC4 JSR GETNCH GET NEXT INPUT CHARACTER +L8FC6 LDX VD5 GET FORMAT STRING DESCRIPTOR ADDRESS + LDB ,X GET LENGTH OF FORMAT STRING + SUBB VD3 SUBTRACT AMOUNT OF FORMAT STRING LEFT AFTER LAST PRINT ITEM + LDX $02,X *GET FORMAT STRING START ADDRESS AND ADVANCE + ABX *POINTER TO START OF UNUSED FORMAT STRING + LDB VD3 * GET AMOUNT OF UNUSED FORMAT STRING + LBNE L8EB9 * REINTERPRET FORMAT STRING FROM THAT POINT + JMP L8ED2 REINTERPRET FORMAT STRING FROM THE START IF ENTIRELY +* USED ON LAST PRINT ITEM + +* PRINT A ‘+‘ TO CONSOLE OUT IF THE STATUS BYTE <> 0 +L8FD8 PSHS A RESTORE ACCA AND RETURN + LDA #'+' GET ASCII PLUS SIGN + TST VDA * CHECK THE STATUS BYTE AND + BEQ L8FE3 * RETURN IF = 0 + JSR PUTCHR SEND A CHARACTER TO CONSOLE OUT +L8FE3 PULS A,PC RETURN ACCA AND RETURN + +* CONVERT ITEM-LIST TO DECIMAL ASCII STRING +L8FE5 LDU #STRBUF+4 POINT U TO STRING BUFFER + LDB #SPACE BLANK + LDA VDA * GET THE STATUS FLAG AND + BITA #$08 * CHECK FOR A PRE-SIGN FORCE + BEQ L8FF2 * BRANCH IF NO PRE-SIGN FORCE + LDB #'+' PLUS SIGN +L8FF2 TST FP0SGN CHECK THE SIGN OF FPA0 + BPL L8FFA BRANCH IF POSITIVE + CLR FP0SGN FORCE FPA0 SIGN TO BE POSITIVE + LDB #'-' MINUS SIGN +L8FFA STB ,U+ SAVE THE SIGN IN BUFFER + LDB #'0' * PUT A ZERO INTO THE BUFFER + STB ,U+ * + ANDA #$01 * CHECK THE EXPONENTIAL FORCE FLAG IN + LBNE L910D * THE STATUS BYTE - BRANCH IF ACTIVE + LDX #LBDC0 POINT X TO FLOATING POINT 1E + 09 + JSR LBCA0 COMPARE FPA0 TO (X) + BMI L9023 BRANCH IF FPA0 < 1E+09 + JSR LBDD9 CONVERT FP NUMBER TO ASCII STRING +L9011 LDA ,X+ * ADVANCE POINTER TO END OF + BNE L9011 * ASCII STRING (ZERO BYTE) +L9015 LDA ,-X MOVE THE + STA $01,X ENTIRE STRING + CMPX #STRBUF+3 UP ONE + BNE L9015 BYTE + LDA #'%' * INSERT A % SIGN AT START OF + STA ,X * STRING - OVERFLOW ERROR + RTS + +L9023 LDA FP0EXP GET EXPONENT OF FPA0 + STA V47 AND SAVE IT IN V74 + BEQ L902C BRANCH IF FPA0 = 0 + JSR L91CD CONVERT FPA0 TO NUMBER WITH 9 SIGNIFICANT +* PLACES TO LEFT OF DECIMAL POINT +L902C LDA V47 GET BASE 10 EXPONENT OFFSET + LBMI L90B3 BRANCH IF FPA0 < 100,000,000 + NEGA * CALCULATE THE NUMBER OF LEADING ZEROES TO INSERT - + ADDA VD9 * SUBTRACT BASE 10 EXPONENT OFFSET AND 9 (FPA0 HAS + SUBA #$09 * 9 PLACES TO LEFT OF EXPONENT) FROM LEFT DIGIT COUNTER + JSR L90EA PUT ACCA ZEROES IN STRING BUFFER + JSR L9263 INITIALIZE DECIMAL POINT AND COMMA COUNTERS + JSR L9202 CONVERT FPA0 TO DECIMAL ASCII IN THE STRING BUFFER + LDA V47 * GET BASE 10 EXPONENT AND PUT THAT MANY + JSR L9281 * ZEROES IN STRING BUFFER - STOP AT DECIMAL POINT + LDA V47 WASTED INSTRUCTION - SERVES NO PURPOSE + JSR L9249 CHECK FOR DECIMAL POINT + LDA VD8 GET THE RIGHT DIGIT COUNTER + BNE L9050 BRANCH IF RIGHT DIGlT COUNTER <> 0 + LEAU $-01,U * MOVE BUFFER POINTER BACK ONE - DELETE +* * DECIMAL POINT IF NO RIGHT DIGITS SPECiFIED +L9050 DECA SUBTRACT ONE (DECIMAL POINT) + JSR L90EA PUT ACCA ZEROES INTO BUFFER (TRAILING ZEROES) +L9054 JSR L9185 INSERT ASTERISK PADDING, FLOATING $, AND POST-SIGN + TSTA WAS THERE A POST-SIGN? + BEQ L9060 NO + CMPB #'*' IS THE FIRST CHARACTER AN $? + BEQ L9060 YES + STB ,U+ STORE THE POST-SIGN +L9060 CLR ,U CLEAR THE LAST CHARACTER IN THE BUFFER +* +* REMOVE ANY EXTRA BLANKS OR ASTERISKS FROM THE +* STRING BUFFER TO THE LEFT OF THE DECIMAL POINT + LDX #STRBUF+3 POINT X TO THE START OF THE BUFFER +L9065 LEAX $01,X MOVE BUFFER POINTER UP ONE + STX TEMPTR SAVE BUFFER POINTER IN TEMPTR + LDA VARPTR+1 * GET ADDRESS OF DECIMAL POINT IN BUFFER, SUBTRACT + SUBA TEMPTR+1 * CURRENT POSITION AND SUBTRACT LEFT DIGIT COUNTER - + SUBA VD9 * THE RESULT WILL BE ZERO WHEN TEMPTR+1 IS POINTING +* * TO THE FIRST DIGIT OF THE FORMAT STRING + BEQ L90A9 RETURN IF NO DIGITS TO LEFT OF THE DECiMAL POINT + LDA ,X GET THE CURRENT BUFFER CHARACTER + CMPA #SPACE SPACE? + BEQ L9065 YES - ADVANCE POINTER + CMPA #'*' ASTERISK? + BEQ L9065 YES - ADVANCE POINTER + CLRA A ZERO ON THE STACK IS END OF DATA POINTER +L907C PSHS A PUSH A CHARACTER ONTO THE STACK + LDA ,X+ GET NEXT CHARACTER FROM BUFFER + CMPA #'-' MINUS SIGN? + BEQ L907C YES + CMPA #'+' PLUS SIGN? + BEQ L907C YES + CMPA $'$' DOLLAR SIGN? + BEQ L907C YES + CMPA #'0' ZERO? + BNE L909E NO - ERROR + LDA $01,X GET CHARACTER FOLLOWING ZERO + BSR L90AA CLEAR CARRY IF NUMERIC + BLO L909E BRANCH IF NOT A NUMERIC CHARACTER - ERROR +L9096 PULS A * PULL A CHARACTER OFF OF THE STACK + STA ,-X * AND PUT IT BACK IN THE STRING BUFFER + BNE L9096 * KEEP GOING UNTIL ZERO FLAG + BRA L9065 KEEP CLEANING UP THE INPUT BUFFER +L909E PULS A + TSTA * THE STACK AND EXIT WHEN + BNE L909E * ZERO FLAG FOUND + LDX TEMPTR GET THE STRING BUFFER START POINTER + LDA #'%' * PUT A % SIGN BEFORE THE ERROR POSITION TO + STA ,-X * INDICATE AN ERROR +L90A9 RTS +* +* CLEAR CARRY IF NUMERIC +L90AA CMPA #'0' ASCII ZERO + BLO L90B2 RETURN IF ACCA < ASCII 0 + SUBA #$3A * #'9'+1 + SUBA #$C6 * #-('9'+1) CARRY CLEAR IF NUMERIC +L90B2 RTS +* +* PROCESS AN ITEM-LIST WHICH IS < 100,000,000 +L90B3 LDA VD8 GET RIGHT DIGIT COUNTER + BEQ L90B8 BRANCH IF NO FORMATTED DIGITS TO THE RIGHT OF DECIMAL PT + DECA SUBTRACT ONE FOR DECIMAL POINT +L90B8 ADDA V47 *ADD THE BASE 10 EXPONENT OFFSET - ACCA CONTAINS THE +* *NUMBER OF SHIFTS REQUIRED TO ADJUST FPA0 TO THE SPECIFIED +* *NUMBER OF DlGITS TO THE RIGHT OF THE DECIMAL POINT + BMI L90BD IF ACCA >= 0 THEN NO SHIFTS ARE REQUIRED + CLRA FORCE SHIFT COUNTER = 0 +L90BD PSHS A SAVE INITIAL SHIFT COUNTER ON THE STACK +L90BF BPL L90CB EXIT ROUTINE IF POSITIVE + PSHS A SAVE SHIFT COUNTER ON STACK + JSR LBB82 DIVIDE FPA0 BY 10 - SHIFT ONE DIGIT TO RIGHT + PULS A GET SHIFT COUNTER FROM THE STACK + INCA BUMP SHIFT COUNTER UP BY ONE + BRA L90BF CHECK FOR FURTHER DIVISION +L90CB LDA V47 * GET BASE 10 EXPONENT OFFSET, ADD INITIAL SHIFT COUNTER + SUBA ,S+ * AND SAVE NEW BASE 10 EXPONENT OFFSET - BECAUSE + STA V47 * FPA0 WAS SHIFTED ABOVE + ADDA #$09 * ADD NINE (SIGNIFICANT PLACES) AND BRANCH IF THERE ARE NO + BMI L90EE * ZEROES TO THE LEFT OF THE DECIMAL POINT IN THIS PRINT ITEM + LDA VD9 *DETERMINE HOW MANY FILLER ZEROES TO THE LEFT OF THE DECIMAL + SUBA #$09 *POINT. GET THE NUMBER OF FORMAT PLACES TO LEFT OF DECIMAL + SUBA V47 *POINT, SUBTRACT THE BASE 10 EXPONENT OFFSET AND THE CONSTANT 9 + BSR L90EA *(UNNORMALIZATION)-THEN OUTPUT THAT MANY ZEROES TO THE BUFFER + JSR L9263 INITIALIZE DECIMAL POINT AND COMMA COUNTERS + BRA L90FF PROCESS THE REMAINDER OF THE PRINT ITEM +* +* PUT (ACCA+1) ASCII ZEROES IN BUFFER +L90E2 PSHS A SAVE ZERO COUNTER + LDA #'0' * INSERT A ZERO INTO + STA ,U+ * THE BUFFER + PULS A RESTORE ZERO COUNTER + +* PUT ACCA ASCII ZEROES INTO THE BUFFER +L90EA DECA DECREMENT ZERO COUNTER + BPL L90E2 BRANCH IF NOT DONE + RTS + +L90EE LDA VD9 * GET THE LEFT DIGIT COUNTER AND PUT + BSR L90EA * THAT MANY ZEROES IN THE STRiNG BUFFER + JSR L924D PUT THE DECIMAL POINT IN THE STRING BUFFER + LDA #-9 *DETERMINE HOW MANY FILLER ZEROES BETWEEN THE DECIMAL POINT + SUBA V47 *AND SIGNIFICANT DATA. SUBTRACT BASE 10 EXPONENT FROM -9 + BSR L90EA *(UNNORMALIZATION) AND OUTPUT THAT MANY ZEROES TO BUFFER + CLR V45 CLEAR THE DECIMAL POINT COUNTER - SUPPRESS THE DECIMAL POINT + CLR VD7 CLEAR THE COMMA COUNTER - SUPPRESS COMMAS +L90FF JSR L9202 DECODE FPA0 INTO A DECIMAL ASCII STRING + LDA VD8 GET THE RIGHT DIGIT COUNTER + BNE L9108 BRANCH IF RIGHT DIGIT COUNTER <> 0 + LDU VARPTR RESET BUFFER PTR TO THE DECIMAL POINT IF NO DIGITS TO RIGHT +L9108 ADDA V47 *ADD BASE 10 EXPONENT - A POSITIVE ACCA WILL CAUSE THAT MANY +* *FILLER ZEROES TO BE OUTPUT TO THE RIGHT OF LAST SIGNIFICANT DATA +* *SIGNIFICANT DATA + LBRA L9050 INSERT LEADING ASTERISKS, FLOATING DOLLAR SIGN, ETC +* +* FORCE THE NUMERIC OUTPUT FORMAT TO BE EXPONENTIAL FORMAT +L910D LDA FP0EXP * GET EXPONENT OF FPA0 AND + PSHS A * SAVE IT ON THE STACK + BEQ L9116 BRANCH IF FPA0 = 0 + JSR L91CD *CONVERT FPA0 INTO A NUMBER WITH 9 SIGNIFICANT +* *DIGITS TO THE LEFT OF THE DECIMAL POINT +L9116 LDA VD8 GET THE RIGHT DIGIT COUNTER + BEQ L911B BRANCH IF NO FORMATTED DIGITS TO THE RIGHT + DECA SUBTRACT ONE FOR THE DECIMAL POINT +L911B ADDA VD9 ADD TO THE LEFT DIGIT COUNTER + CLR STRBUF+3 CLEAR BUFFER BYTE AS TEMPORARY STORAGE LOCATION + LDB VDA * GET THE STATUS BYTE FOR A + ANDB #$04 * POST-BYTE FORCE; BRANCH IF + BNE L9129 * A POST-BYTE FORCE + COM STRBUF+3 TOGGLE BUFFER BYTE TO -1 IF NO POST-BYTE FORCE +L9129 ADDA STRBUF+3 SUBTRACT 1 IF NO POST BYTE FORCE + SUBA #$09 *SUBTRACT 9 (DUE TO THE CONVERSION TO 9 +* *SIGNIFICANT DIGITS TO LEFT OF DECIMAL POINT) + PSHS A * SAVE SHIFT COUNTER ON THE STACK - ACCA CONTAINS THE NUMBER +* OF SHIFTS REQUIRED TO ADJUST FPA0 FOR THE NUMBER OF +* FORMATTED PLACES TO THE RIGHT OF THE DECIMAL POINT. +L9130 BPL L913C NO MORE SHIFTS WHEN ACCA >= 0 + PSHS A SAVE SHIFT COUNTER + JSR LBB82 DIVIDE FPA0 BY 10 - SHIFT TO RIGHT ONE + PULS A RESTORE THE SHIFT COUNTER + INCA ADD 1 TO SHIFT COUNTER + BRA L9130 CHECK FOR FURTHER SHIFTING (DIVISION) +L913C LDA ,S *GET THE INITIAL VALUE OF THE SHIFT COUNTER + BMI L9141 *AND BRANCH IF SHIFTING HAS TAKEN PLACE + CLRA RESET ACCA IF NO SHIFTING HAS TAKEN PLACE +L9141 NEGA *CALCULATE THE POSITION OF THE DECIMAL POINT BY + ADDA VD9 *NEGATING SHIFT COUNTER, ADDING THE LEFT DIGIT COUNTER + INCA *PLUS ONE AND THE POST-BYTE POSlTION, IF USED + ADDA STRBUF+3 * + STA V45 SAVE DECIMAL POINT COUNTER + CLR VD7 CLEAR COMMA COUNTER - NO COMMAS INSERTED + JSR L9202 CONVERT FPA0 INTO ASCII DECIMAL STRING + PULS A * GET THE INITIAL VALUE OF SHIFT COUNTER AND + JSR L9281 * INSERT THAT MANY ZEROES INTO THE BUFFER + LDA VD8 *GET THE RIGHT DIGIT COUNTER AND BRANCH + BNE L915A *IF NOT ZERO + LEAU $-01,U MOVE BUFFER POINTER BACK ONE + +* CALCULATE VALUE OF EXPONENT AND PUT IN STRING BUFFER +L915A LDB ,S+ GET ORIGINAL EXPONENT OF FPA0 + BEQ L9167 BRANCH IF EXPONENT = 0 + LDB V47 GET BASE 10 EXPONENT + ADDB #$09 ADD 9 FOR 9 SIGNIFICANT DIGIT CONVERSION + SUBB VD9 SUBTRACT LEFT DIGIT COUNTER + SUBB STRBUF+3 ADD ONE TO EXPONENT IF POST-SIGN FORCE +L9167 LDA #'+' PLUS SIGN + TSTB TEST EXPONENT + BPL L916F BRANCH IF POSITIVE EXPONENT + LDA #'-' MINUS SIGN + NEGB CONVERT EXPONENT TO POSITIVE NUMBER +L916F STA $01,U PUT SIGN OF EXPONENT IN STRING BUFFER + LDA #'E' * PUT AN ‘E’ (EXPONENTIATION FLAG) IN + STA ,U++ * BUFFER AND SKIP OVER THE SIGN + LDA #$2F * WAS LDA #'0'-1 +*CONVERT BINARY EXPONENT IN ACCB TO ASCII VALUE IN ACCA +L9177 INCA ADD ONE TO TENS DIGIT COUNTER + SUBB #10 *SUBTRACT 10 FROM EXPONENT AND ADD ONE TO TENS + BCC L9177 * DIGIT IF NO CARRY. TENS DIGIT DONE IF THERE IS A CARRY + ADDB #$3A WAS ADDB #'9'+1 + STD ,U++ SAVE EXPONENT IN BUFFER + CLR ,U CLEAR FINAL BYTE IN BUFFER - PRINT TERMINATOR + JMP L9054 INSERT ASTERISK PADDING, FLOATING DOLLAR SIGN, ETC. + +* INSERT ASTERISK PADDING, FLOATING $ AND PRE-SIGN +L9185 LDX #STRBUF+4 POINT X TO START OF PRINT ITEM BUFFER + LDB ,X * GET SIGN BYTE OF ITEM-LIST BUFFER + PSHS B * AND SAVE IT ON THE STACK + LDA #SPACE DEFAULT PAD WITH BLANKS + LDB VDA * GET STATUS BYTE AND CHECK FOR + BITB #$20 * ASTERISK LEFT PADDING + PULS B GET SIGN BYTE AGAIN + BEQ L919E BRANCH IF NO PADDING + LDA #'*' PAD WITH ASTERISK + CMPB #SPACE WAS THE FIRST BYTE A BLANK (POSITIVE)? + BNE L919E NO + TFR A,B TRANSFER PAD CHARACTER TO ACCB +L919E PSHS B SAVE FIRST CHARACTER ON STACK +L91A0 STA ,X+ STORE PAD CHARACTER IN BUFFER + LDB ,X GET NEXT CHARACTER IN BUFFER + BEQ L91B6 INSERT A ZERO IF END OF BUFFER + CMPB #'E' * CHECK FOR AN ‘E’ AND + BEQ L91B6 * PUT A ZERO BEFORE IT + CMPB #'0' * REPLACE LEADING ZEROES WITH + BEQ L91A0 * PAD CHARACTERS + CMPB #',' * REPLACE LEADING COMMAS + BEQ L91A0 * WITH PAD CHARACTERS + CMPB #'.' * CHECK FOR DECIMAL POINT + BNE L91BA * AND DON’T PUT A ZERO BEFORE IT +L91B6 LDA #'0' * REPLACE PREVIOUS CHARACTER + STA ,-X * WITH A ZERO +L91BA LDA VDA * GET STATUS BYTE, CHECK + BITA #$10 * FOR FLOATING $ + BEQ L91C4 * BRANCH IF NO FLOATING $ + LDB #'$' * STORE A $ IN + STB ,-X * BUFFER +L91C4 ANDA #$04 CHECK PRE-SIGN FLAG + PULS B GET SIGN CHARACTER + BNE L91CC RETURN IF POST-SIGN REQUIRED + STB ,-X STORE FIRST CHARACTER +L91CC RTS +* +* CONVERT FPA0 INTO A NUMBER OF THE FORM - NNN,NNN,NNN X 10**M. +* THE EXPONENT M WILL BE RETURNED IN V47 (BASE 10 EXPONENT). +L91CD PSHS U SAVE BUFFER POINTER + CLRA INITIAL EXPONENT OFFSET = 0 +L91D0 STA V47 SAVE EXPONENT OFFSET + LDB FP0EXP GET EXPONENT OF FPA0 + CMPB #$80 * COMPARE TO EXPONENT OF .5 + BHI L91E9 * AND BRANCH IF FPA0 > = 1.0 + +* IF FPA0 < 1.0, MULTIPLY IT BY 1E+09 UNTIL IT IS >= 1 + LDX #LBDC0 POINT X TO FP NUMBER (1E+09) + JSR LBACA MULTIPLY FPA0 BY 1E+09 + LDA V47 GET EXPONENT OFFSET + SUBA #$09 SUBTRACT 9 (BECAUSE WE MULTIPLIED BY 1E+09 ABOVE) + BRA L91D0 CHECK TO SEE IF > 1.0 +L91E4 JSR LBB82 DIVIDE FPA0 BY 10 + INC V47 INCREMENT EXPONENT OFFSET +L91E9 LDX #LBDBB POINT X TO FP NUMBER (999,999,999) + JSR LBCA0 COMPARE FPA0 TO X + BGT L91E4 BRANCH IF FPA0 > 999,999,999 +L91F1 LDX #LBDB6 POINT X TO FP NUMBER (99,999,999.9) + JSR LBCA0 COMPARE FPA0 TO X + BGT L9200 RETURN IF 999,999,999 > FPA0 > 99,999,999.9 + JSR LBB6A MULTIPLY FPA0 BY 10 + DEC V47 DECREMENT EXPONENT OFFSET + BRA L91F1 KEEP UNNORMALIZING +L9200 PULS U,PC RESTORE BUFFER POINTER AND RETURN +* +* CONVERT FPA0 INTO AN INTEGER, THEN DECODE IT +* INTO A DECIMAL ASCII STRING IN THE BUFFER +L9202 PSHS U SAVE BUFFER POINTER + JSR LB9B4 ADD .5 TO FPA0 (ROUND OFF) + JSR LBCC8 CONVERT FPA0 TO INTEGER FORMAT + PULS U RESTORE BUFFER POINTER +* +* CONVERT FPA0 INTO A DECIMAL ASCII STRING + LDX #LBEC5 POINT X TO UNNORMALIZED POWERS OF 10 + LDB #$80 INITIALIZE DIGIT COUNTER TO 0 + $80. +* BIT 7 SET IS USED TO INDICATE THAT THE POWER OF 10 MANTISSA +* IS NEGATIVE. WHEN YOU ‘ADD’ A NEGATIVE MANTISSA, IT IS +* THE SAME AS SUBTRACTING A POSITIVE ONE AND BIT 7 OF ACCB +* IS HOW THIS ROUTINE KNOWS THAT A ‘SUBTRACTION’ IS OCCURRING. +L9211 BSR L9249 CHECK FOR COMMA INSERTION +L9213 LDA FPA0+3 * ‘ADD’ A POWER OF 10 MANTISSA TO FPA0. + ADDA $03,X * IF THE MANTISSA IS NEGATIVE, A SUBTRACTION + STA FPA0+3 * WILL BE WHAT REALLY TAKES PLACE. + LDA FPA0+2 * + ADCA $02,X * + STA FPA0+2 * + LDA FPA0+1 * + ADCA $01,X * + STA FPA0+1 * + LDA FPA0 * + ADCA ,X * + STA FPA0 * + INCB ADD ONE TO DIGIT COUNTER + RORB ROTATE CARRY INTO BIT 7 + ROLB * SET OVERFLOW FLAG - BRANCH IF CARRY SET AND + BVC L9213 * ADDING MANTISSA OR CARRY CLEAR AND SUBTRACTING MANTISSA + BCC L9235 BRANCH IF SUBTRACTING MANTISSA + SUBB #10+1 WAS SUBB #10+1 + NEGB * IF ADDING MANTISSA +L9235 ADDB #$2F WAS ADDB #'0'-1 + LEAX $04,X MOVE TO NEXT POWER OF 10 MANTISSA + TFR B,A SAVE DIGIT IN ACCA + ANDA #$7F MASK OFF ADD/SUBTRACT FLAG (BIT 7) + STA ,U+ STORE DIGIT IN BUFFER + COMB TOGGLE ADD/SUBTRACT FLAG + ANDB #$80 MASK OFF EVERYTHING BUT ADD/SUB FLAG + CMPX #LBEE9 COMPARE TO END OF UNNORMALIZED POWERS OF 10 + BNE L9211 BRANCH IF NOT DONE + CLR ,U PUT A ZERO AT END OF INTEGER + +* DECREMENT DECIMAL POINT COUNTER AND CHECK FOR COMMA INSERTION +L9249 DEC V45 DECREMENT DECIMAL POINT COUNTER + BNE L9256 NOT TIME FOR DECIMAL POINT +L924D STU VARPTR SAVE BUFFER POINTER-POSITION OF THE DECIMAL POINT + LDA #'.' * STORE A DECIMAL + STA ,U+ * POINT IN THE OUTPUT BUFFER + CLR VD7 * CLEAR COMMA COUNTER - NOW IT WILL TAKE 255 +* * DECREMENTS BEFORE ANOTHER COMMA WILL BE INSERTED + RTS +L9256 DEC VD7 DECREMENT COMMA COUNTER + BNE L9262 RETURN IF NOT TIME FOR COMMA + LDA #$03 * RESET COMMA COUNTER TO 3; THREE + STA VD7 * DIGITS BETWEEN COMMAS + LDA #',' * PUT A COMMA INTO + STA ,U+ * THE BUFFER +L9262 RTS + +* INITIALIZE DECIMAL POINT AND COMMA COUNTERS +L9263 LDA V47 GET THE BASE 10 EXPONENT OFFSET + ADDA #10 * ADD 10 (FPA0 WAS ‘NORMALIZED’ TO 9 PLACES LEFT + STA V45 * OF DECIMAL POINT) - SAVE IN DECIMAL POINT COUNTER + INCA ADD ONE FOR THE DECIMAL POINT +L926A SUBA #$03 * DIVIDE DECIMAL POINT COUNTER BY 3; LEAVE + BCC L926A * THE REMAINDER IN ACCA + ADDA #$05 CONVERT REMAINDER INTO A NUMBER FROM 1-3 + STA VD7 SAVE COMMA COUNTER + LDA VDA GET STATUS BYTE + ANDA #$40 CHECK FOR COMMA FLAG + BNE L927A BRANCH IF COMMA FLAG ACTIVE + STA VD7 CLEAR COMMA COUNTER - 255 DIGITS OUTPUT BEFORE A COMMA +L927A RTS +* +* INSERT ACCA ZEROES INTO THE BUFFER +L927B PSHS A SAVE ZEROES COUNTER + BSR L9249 CHECK FOR DECIMAL POINT + PULS A RESTORE ZEROES COUNTER +L9281 DECA * DECREMENT ZEROES COUNTER AND + BMI L928E * RETURN IF < 0 + PSHS A SAVE ZEROES COUNTER + LDA #'0' * PUT A ZERO INTO + STA ,U+ * THE BUFFER + LDA ,S+ RESTORE THE ZEROES COUNTER + BNE L927B BRANCH IF NOT DONE +L928E RTS + + +* LINE +LINE CMPA #TOK_INPUT ‘INPUT’ TOKEN + LBEQ L89C0 GO DO ‘LINE INPUT’ COMMAND + JMP LB277 ‘SYNTAX ERROR’ IF NOT "LINE INPUT" + + +* END OF EXTENDED BASIC +* INTERRUPT VECTORS + ORG $FFF0 +LBFF0 FDB $0000 RESERVED +LBFF2 FDB SW3VEC SWI3 +LBFF4 FDB SW2VEC SWI2 +LBFF6 FDB FRQVEC FIRQ +LBFF8 FDB IRQVEC IRQ +LBFFA FDB SWIVEC SWI +LBFFC FDB NMIVEC NMI +LBFFE FDB RESVEC RESET diff --git a/ROMS/6809/ExBasROM.hex b/ROMS/6809/ExBasROM.hex new file mode 100644 index 0000000..62d5aaf --- /dev/null +++ b/ROMS/6809/ExBasROM.hex @@ -0,0 +1,513 @@ +:20C00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:20C02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:20C04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:20C06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20C08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20C0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20C0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20C0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20C10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:20C12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:20C14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:20C16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20C18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20C1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20C1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20C1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20C20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:20C22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:20C24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:20C26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20C28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20C2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20C2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20C2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20C30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:20C32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:20C34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:20C36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20C38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20C3A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20C3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20C3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20C40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:20C42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:20C44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:20C46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20C48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20C4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20C4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20C4E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20C50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:20C52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:20C54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:20C56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20C58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20C5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20C5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20C5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20C60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:20C62000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:20C64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:20C66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20C68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20C6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20C6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20C6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20C70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:20C72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:20C74000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:20C76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20C78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20C7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20C7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20C7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20C80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:20C82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:20C84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:20C86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20C88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20C8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20C8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20C8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20C90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:20C92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:20C94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:20C96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:20C98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20C9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20C9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20C9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20CA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:20CA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:20CA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:20CA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:20CA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:20CAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:20CAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:20CAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:20CB0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:20CB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:20CB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:20CB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:20CB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:20CBA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:20CBC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:20CBE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:20CC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:20CC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:20CC4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:20CC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:20CC8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:20CCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:20CCC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:20CCE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:20CD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:20CD2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:20CD4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:20CD6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:20CD8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:20CDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:20CDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:20CDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:20CE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:20CE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:20CE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:20CE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:20CE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:20CEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:20CEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:20CEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:20CF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:20CF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:20CF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:20CF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:20CF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:20CFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:20CFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:20CFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:20D00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:20D02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:20D04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:20D06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20D08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20D0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20D0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20D0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:20D10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:20D12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:20D14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:20D16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20D18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20D1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20D1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20D1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:20D20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:20D22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:20D24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:20D26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20D28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20D2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20D2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20D2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:20D30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:20D32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:20D34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:20D36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20D38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20D3A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20D3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20D3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:20D40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:20D42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:20D44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20D46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20D48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20D4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20D4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20D4E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:20D50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:20D52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:20D54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20D56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20D58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20D5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20D5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20D5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:20D60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:20D62000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:20D64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20D66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20D68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20D6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20D6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20D6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:20D70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:20D72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:20D74000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20D76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20D78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20D7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20D7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20D7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:20D80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:20D82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:20D84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20D86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20D88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20D8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20D8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20D8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:20D90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:20D92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:20D94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:20D96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20D98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20D9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20D9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20D9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:20DA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:20DA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:20DA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:20DA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:20DA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:20DAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:20DAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:20DAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:20DB00008D0327FC39B6A00085012706B6A001847F394F398D243402810D270BB7A0010CEA +:20DB2000799679917825100F798D0F860DB7A0018D08860AB7A0013502393402B6A0008512 +:20DB40000227F935023910CE01EE966E8155260A9E6FA684811226026E848E02186F8330AE +:20DB60000126FA8E02176F809F19A60243A702A10226063001630120F19F719F279F233065 +:20DB800089FF389F211F148EDBCECE0076C612BDDCAECE00A7C604BDDCAE863997F0BDDFD0 +:20DBA000BA8E00B59F8DCEE6CEC60AEF815A26FB8695B7A0008EDC03BDEBE58EDBC69F6F56 +:20DBC0008655976E200412BDDFD47EDF223B10405000E6CE0C8426020C83B600007EDCBF9B +:20DBE0007EDCBE7EDBCD7EE6CE804FC7525932DD1DDE2A1DDDBDDCCE0000000000000000DF +:20DC0000000000003638303920455854454E4445442042415349430D2843292031393832A5 +:20DC2000204259204D4943524F534F46540D0D0034169E76DC789F6AD76C976D35960F73EA +:20DC40008E00F4C601BDDB00810826075A27EF301F20348115260A5A27E48608BDDB142095 +:20DC6000F681031A012705810D260D4F3401BDEBA56F848E00F33581812025C9817B24C5B3 +:20DC8000C1FA24C1A7805CBDDB1420B92705BDE9C19F7A6E9F007A7EE0A396732603BDDBDE +:20DCA000050F73975310260C6A97567EE91FA680A7C05A26F939399D8227FB7EE5003B81FC +:20DCC0003A240A812026020E7C803080D039EEC3EF37EEDC00ADF168F1BDE9D4E905E781E8 +:20DCE000E99AE924E910F26DF235F23EF3AFF3E1F303F569F33DFA3BE92FE94CE953DC9AB7 +:20DD0000E772F571F631F60179EC0E79EC057BED157BEDDA7FF34650E55946E558464FD25A +:20DD200047CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D4454EC44E91 +:20DD40004558D44449CD524541C45255CE524553544F52C55245545552CE53544FD0504F7E +:20DD60004BC5434F4ED44C4953D4434C4541D24E45D7455845C354524FCE54524F46C64425 +:20DD800045CC4445C64C494EC552454E55CD454449D4544142A854CF5355C2544845CE4EC5 +:20DDA0004FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC46CE5553494EC75347CE6D +:20DDC000494ED44142D35553D2524EC45349CE504545CB4C45CE535452A45641CC4153C3DF +:20DDE000434852A44154CE434FD35441CE4558D04649D84C4FC7504FD35351D2484558A4D0 +:20DE00004C454654A45249474854A44D4944A4494E4B4559A44D45CD5641525054D2494E1A +:20DE20005354D2535452494E47A4DFE8E133E190E190E190E1C1E18DEB6AE1EFE29CE0BA73 +:20DE4000E381E5D2E2D6E128E09CE16DE0BEE9DBE0E3E9E2E0F4DFB8DC8CF564F565F7E0CF +:20DE6000F724FECEF86AF3F04E46534E52474F4446434F564F4D554C425344442F304944A1 +:20DE8000544D4F534C535354434E4644414F444E494F464D4E4F4945445355464E4520453C +:20DEA00052524F520020494E20000D4F4B0D000D425245414B003064C6129F0FA6848080DC +:20DEC0002615AE019F119E3B27099C1127099E0F3A20E59E119F3B9E0F4D398D17DE413324 +:20DEE000419E433001A68236029C4726F8DF45394F58D31FC3003A250810DF171093172569 +:20DF0000EEC60CBDDFD4BDEBA9BDEBF88EDE683A8D318D2F8EDE9DBDEBE596684C2703BD91 +:20DF2000F00EBDEBA98EDEAABDEBE5BDDC3ECEFFFFDF6825F69F839D7C27F0250BBDEA972A +:20DF40007EE071A6807EEBFABDE2149E2B9FF1BDEA97D7038D4C2512DC47A384D31BDD1B05 +:20DF6000EE843702A7809C1B26F896F3271CDC1BDD43DB038900DD41BDDEDBCE00EF370226 +:20DF8000A7809C4526F89E419F1B8D368D02209B9E19EC8427213304A6C026FCEF84AE84E2 +:20DFA00020F0DC2B9E19EE84270910A3022306AE8420F31A019F473926FB9E196F806F80DE +:20DFC0009F1B9E19BDE1689E279F23BDE09C9E1B9F1D9F1F8E00C99F0BAEE410DE216FE2E4 +:20DFE0000F2D0F2E0F086E8486809708BDE236BDDEB6326226049E0F3285C609BDDEF0BD9B +:20E00000E195DC683416C6A0BDE4F8BDE3CCBDE3CAD654CA7FD450D750108EE0207EE473F6 +:20E020008EED0EBDEE5D9D8281A426059D7CBDE3CABDEEB6BDE46FDC3B3406868034021C43 +:20E04000AF8D609E839F2FA6802707813A27227EE500A68197002772EC80DD689F83968C2E +:20E06000270F865BBDDB149668BDF015865DBDDB149D7C8D0220C827294D102A01B881FFEE +:20E08000270F819E22C9BEDBF1481F893A9D7C6E949D7C8197102714F07EE5009E19301F9C +:20E0A0009F3339BDDB05270A8103271281132703977339BDDB0527FB20EE9D8220021A01A0 +:20E0C00026319E839F2F060032629E688CFFFF27069F299E2F9F2D8EDEAE0D00102AFE42A1 +:20E0E0007EDF17260EC6209E2D1027FE169F839E299F6839272CBDE66A34069E279D8227AE +:20E100000CBDE4F6BDE9C1301F9C7122181F10A3E125121F0383003A250B931B2507DF218C +:20E120009F277EDFC77EDF019D821027FE94BDDFC720191F899D7CC1A02716C1A12645C621 +:20E1400003BDDEF0DE839E6886A134528D037EE03F9D82BDE2148D403001DC2B10936822EC +:20E16000029E19BDDFA62517301F9F833926FD86FF973BBDDEB61F148121270BC6048CC6D0 +:20E180000E7EDF037EE50035529F68DF838D068C8D069F8339C63A865FD7015F9E831F98BD +:20E1A000D6019701A68427EC3404A1E027E63001812227EA4C26023001818626E70C04201F +:20E1C000E3BDE3CA9D8281812705C6A2BDE4F8964F26130F048DB64D27BA9D7C818426F5C9 +:20E1E0000A042AF19D7C9D821025FF657EE077BDE98FC681BDE4F8340281A1270481A02671 +:20E20000830A53260535047EE1359D7C8D06812C27EF35849E749F2B246180309701DC2B4E +:20E22000811822DB58495849D32B5849DB018900DD2B9D7C20E2BDE5DB9F3BC6AEBDE4F87B +:20E2400096063402BDE3DF350246BDE3D110270C2B9E52DC2110A30224119C1B250DE684E7 +:20E26000BDE7919E4DBDE8C78E00569F4DBDE8F9DE4D9E3B3726A78410AF02393F52454404 +:20E280004F0D007EDF03960927079E319F687EE5008EE27BBDEBE59E2F9F8339C6169E683A +:20E2A000300127DF8D01398122260BBDE4CDC63BBDE4F8BDEBE88E00F36F848D06C62CE714 +:20E2C000842016BDEBF8BDEBF5BDDC3E240532647EE0C6C62E399E33864F97099F35BDE5A4 +:20E2E000DB9F3B9E839F2B9E35A684260996092651BDEBF88DCD9F839D7CD60627239E83C0 +:20E3000097018122270E301F4F9701BDDC30863A9701862C9702BDE7A2BDE4D2BDE2512022 +:20E3200006BDEF5BBDEE7C9D822706812C1026FF529E839F359E2B9F839D822721BDE4F64B +:20E34000209C9F83BDE19530014D260AC606EE812741EC81DD31A684818626E620989E3518 +:20E36000D6091026FD3AA68427068EE3707EEBE5393F45585452412049474E4F5245440D9A +:20E380000026049E742003BDE5DB9F3BBDDEB62704C60020471F143003BDEE5DA6689754B7 +:20E3A0009E3BBDEC0BBDEE7C3069BDEEDFE068270CAE6E9F68AEE8109F837EE03F32E81257 +:20E3C0009D82812C26F49D7C8DBD8D131CFE7D1A010D0625032A998C2B96C6187EDF038D8C +:20E3E0006E4F8C34043402C601BDDEF0BDE4AC0F3F9D8280AD25138103240F810149983F9C +:20E40000913F2564973F9D7C20E9D63F26331024006B8B07246799061027047789FF340272 +:20E4200048ABE08EDD0830863502A18424558D9C34028D299E3D3502261D4D1027006A2093 +:20E440004B0806598D098EE454D73F0F0620D99E837EE16864E578A184243120D3EC013453 +:20E46000068D08D63F16FF7B7EE500D654A68435203404D64F9E50DE5234546EA49E74A683 +:20E48000E0272681642703BDE3CC9F3D3504815A2719817D271554D70A3552975C9F5DDFE0 +:20E4A0005F3504D761D854D762D64F39BDF6F90F069D7C24037EEF5BBDE6262450812E27ED +:20E4C000F481A7274081A627E38122260A9E83BDE79C9E649F833981A3260D865ABDE3E33D +:20E4E000BDE67143537EE7784C272E8D06BDE3DFC6298CC6288CC62CE19F008326020E7C46 +:20E50000C6027EDF03867DBDE3E37EF132BDE5DB9F52960626957EEE5D9D7C1F89589D7CEC +:20E52000C13823037EE5003404C12A251EC130241C8DC0A6E4BDE3DF8DBCBDE3CF3502DE9F +:20E54000523442BDE98F350234068E8D9E3504BEDBF63AAD947EE3CC864F9703BDE671DDC4 +:20E5600001BDEE93BDE6710D0326069401D40220049A01DA027EE778BDE3D1261096618A01 +:20E580007F945D975D8E005CBDEEDF20360F060A3FBDE8DBD7569F589E5FBDE8DD965634AC +:20E5A00004A0E0270786012403D656409754DE585C5A2604D654200BA680A1C027F3C6FFD3 +:20E5C000240150CB0159D40A2702C6FF7EEEC5BDE4F6C6018D089D8226F5395F9D82D705E4 +:20E5E00097379D828D401025FF165FD7069D7C25048D33250A1F899D7C25FC8D2924F88175 +:20E600002426060306CB809D7CD7389A088028102700750F089E1BDC379C1D271210A3812F +:20E62000273E300520F381412504805B80A5398E0074EEE41183E5102728DC1FDD43C3007F +:20E6400007DD419E1D9F47BDDEDB9E419F1F9E459F1D9E47DC37ED814F5FED84ED02A70423 +:20E660009F393990800000009D7CBDE3CA96542B5DBDE3CC964F819025088EE663BDEEDF94 +:20E68000264CBDEF11DC5239DC053406125F9E3734148DD435349F37DE5234605C9D8281DB +:20E6A0002C27EBD703BDE4F03506DD059E1D9C1F2721DC3710A3842706EC02308B20EFC6E1 +:20E6C000129605260BD603E1042759C6108CC6087EDF03CC0005DD64DC37ED84D603E70434 +:20E6E000BDDEF09F41C60B4F0D0527053506C30001ED058D5DDD6430020A0326E89F0FD367 +:20E700000F1025F7FC1F01BDDEF4830035DD1F4F301FA7059C0F26F89E41961F9341ED02F5 +:20E720009605262DE604D7034F5FDD643506DD5210A305243ADE6427048D17D35230020A46 +:20E740000326E7EDE358495849E3E1308B30059F393986109745EC05DD174F5F5849250FF8 +:20E76000086509642404D31725050A4526EE397EE6CB1F40931F214F0F06DD50C6907EEE33 +:20E78000CBBDE3CCCE01F0BDF02532628E01EF200B9F4D8D5C9F58D75639301F86229701B3 +:20E7A000970230019F629F58C6FF5CA680270C91012704910226F381222702301F9F64D7BF +:20E7C00056DE62118301F022078DC69E62BDE8C99E0B8C00F12605C61E7EDF039656A7000C +:20E7E000DC58ED0286FF97069F0D9F5230059F0B390F074F3406DC23A3E0109321250ADD2E +:20E80000239E2330019F253584C61A030727CA8D04350420DE9E279F234F5FDD4B9E219F08 +:20E82000478E00C99C0B27048D3220F89E1B9C1D27048D2220F89F419E419C1F2735EC0269 +:20E84000D341DD41A6012AF0E60458CB053A9C4127E88D0820F8A60130022A14E684271028 +:20E86000EC02109323220910934723049F4BDD473005399E4B27FB4FE6845AD347DD439E36 +:20E88000239F41BDDEDD9E4BDC45ED029E45301F7EE817DC523406BDE4ACBDE3CF35109F4D +:20E8A00062E6849E52EB842405C61C7EDF03BDE7919E62E6848D109E4D8D228D0C9E628DC6 +:20E8C0001CBDE7D07EE3F1AE02DE255C2004A680A7C05A26F9DF2539BDE3CF9E52E6848D8A +:20E8E000182613AE07301F9C2326083404D323DD233504300139AE02399C0D26079F0B306C +:20E900001B9F0D4F398D037EE7778DCC0F065D39BDE992C601BDE7F19653BDE795A7843225 +:20E92000627EE7D08D0220DF8DE0275EE684398D484FE1842303E6844F3406BDE7939E4D59 +:20E940008D9B35043A3504BDE8C920D58D2BA0844020DFC6FFD7539D8281292705BDE4F6EA +:20E960008D2D8D1527245F4AA18424CD1F89E08450D15323C4D65320C0BDE4F0EEE4AE654B +:20E980009F4DA664E66432671F357EE6CE9D7CBDE3CABDE66D4D26F20E82BDE90A102702A7 +:20E9A000E1DE839F833AA68434526F849D82BDEF5B3552A784DF83398D079F2BBDE4F6208E +:20E9C000CEBDE3CA96542BC2964F819022BCBDEF119E52398DEEE6847EE7778DDB9E2BE795 +:20E9E00084393401BDE214BDDFA29F66350127129D82271381A726099D7C2706BDE21427F0 +:20EA00000639CEFFFFDF2B32629E66BDEBA9BDDC97EC8426037EDF229F66EC0210932B22CD +:20EA2000F4BDF015BDEBF59E668D10AE9F0066CE00F4A6C027D5BDEBFA20F73004108E0080 +:20EA4000F4A68027512B15813A260DE684C18427F0C18327EC8C86218D3020E5CEDBE481D6 +:20EA6000FF2604A6803345847F334A6DC427E7A0C42AF6ABC4EE414A2B066DC02AFC20F709 +:20EA8000A6C48D066DC02AF820B7108C01ED2406847FA7A06FA4399E83CE00F30F430F4482 +:20EAA000A68027210D43270FBDE626241881302504813923100F438120270A9742812227CF +:20EAC000380D442719A7C02706813A27CF20D16FC06FC01F308300F18E00F29F8339813F7B +:20EAE0002604868720DF81272613CC3A83EDC10F42A68027D0914227CCA7C020F481302543 +:20EB000004813C25C0301F34500F41CEDBE40F42334AA6C4273110AE41AEE4E6A0E0802771 +:20EB2000FAC180263832623540DA4296412606C1842606863AEDC12094E7C0C18626020C5F +:20EB400044C18227AA2086CEDBE9034126C03550A680A7C0BDE62625EC034320E80C424A29 +:20EB600027AE313FE6A02AFC20AF27398D0139BDFACF273E819F2753812C2737813B2760DB +:20EB8000BDE3DF960634022606BDF022BDE79A8D573504BDDC305D26089D82812C27148DE6 +:20EBA000549D8226CF860D2051BDDC3027F7966C26F339BDDC30270AD66CD16B25068DE599 +:20EBC000201ED66CD06A24FC502010BDE98D81291026F92CBDDC30D06C23058D185A26FB56 +:20EBE0009D7C7EEB72BDE79CBDE8DB5C5A27C3A6808D0720F786208C863F7EDB148EF10904 +:20EC00002009BDED78035403622003BDED785D102702808E005C1F895D276CD04F2769253C +:20EC20000A974F966197548E004F50C1F82F594F6401BDED03D6622A0B6301630263036334 +:20EC40000443890097639653996097539652995F97529651995E97519650995D97505D2A45 +:20EC60004425028D5D5F9650262E965197509652975196539752966397530F63CB08C12825 +:20EC80002DE44F974F9754398D6D5F20A85C086309530952095109502AF3964F3404A0E0FE +:20ECA000974F23DE8C2508086386009763200C0C4F2728065006510652065324048D0D27AC +:20ECC000EE39035403500351035203539E5230019F5226069E5030019F5039C60A7EDF03AF +:20ECE0008E0012A6049763A603A704A602A703A601A702965BA701CB082FE89663C008276F +:20ED00000C6701660266036604465C26F43981000000008D6327608D7886009713971497E0 +:20ED2000159716D6538D22D663D78BD6528D1AD663D78AD6518D12D663D789D6508D0CD641 +:20ED400063D788BDEE547EEC652795439613562726241696169B6097169615995F97159665 +:20ED600014995E97149613995D46971306140615061606634F20D539EC0197618A80DD5DEE +:20ED8000D661D854D762EC03DD5FA684975CD64F394D27169B4F464928108B80974F270CD2 +:20EDA000966297543996544320023262102AFED27EECDBBDEEA8270D8B0225F40F62BDECBE +:20EDC000160C4F27EB398420000000BDEEA88EEDC65FD762BDEE5D8C8D9E2773004F8DB1C1 +:20EDE0000C4F27CC8E0013C604D703C6019650915D26139651915E260D9652915F26079608 +:20EE00005391602601431FA859240AE7800A032B34272EC6011F8A250E0860095F095E09EB +:20EE20005D25E32BC820DF966090539760965F9252975F965E9251975E965D9250975D2027 +:20EE4000D8C64020D0565656D7638D087EEC65C6147EDF039E139F509E159F52393402EC6B +:20EE60000197548A80DD500F63E684AE039F52D74F35828E004520068E00408C9E3B964F03 +:20EE8000A78496548A7F9450A7019651A702DE52EF0339966197549E5C9F4F0F63965E9716 +:20EEA0005196549E5F9F5239DC4FDD5C9E519F5E9E539F604D39D64F2708D65459C6FF2569 +:20EEC0000150398DF1D7500F51C68896508080D74FDC74DD52976397547EEC610F5439E698 +:20EEE0008427D3E601D8542BD1D64FE184261DE601CA7FD450E1012613D651E102260DD636 +:20EF000052E1032607D653E00426013956D85420ABD64F273DC0A096542A05035BBDECC407 +:20EF20008E004FC1F82E06BDECF70F5B390F5B96544906507EED03D64FC1A0241D8DD2D766 +:20EF4000639654D754808086A0974F965397017EEC61D750D751D752D753399E749F549F62 +:20EF60004F9F519F529F479F452564BDF698812D260403552004812B26049D7C2551812E5B +:20EF80002728814526289D7C256481A7270E812D270A81A62708812B2704200603489D7C79 +:20EFA000254C0D48270800472004034626CC96479045974727122A09BDEDCB0C4726F920B3 +:20EFC00007BDEDB30A4726F996552A8E7EF132D645D046D7453402BDEDB33504C0308D0281 +:20EFE0002098BDEE78BDEEC58E00407EEC0BD6475858DB475880303404ABE09747209F9B91 +:20F000003EBC1FFD9E6E6B27FD9E6E6B28008EDEA48D0CDC68DD50C69043BDEECF8D037E65 +:20F02000EBE5CE01F18620D6542A02862DA7C0DF6497548630D64F102700C64FC18022086A +:20F040008EF009BDED1386F797458EF004BDEEE92E0F8EEFFFBDEEE92E0EBDEDB30A4520A8 +:20F06000F1BDEDCB0C4520E2BDEBFDBDEF11C60196458B0A2B09810B24054A1F8986024A91 +:20F080004A9747D7452E0DDE64862EA7C05D27048630A7C08EF10EC6809653AB0397539605 +:20F0A00052A90297529651A90197519650A98497505C565928E32403C00B50CB2F30041F52 +:20F0C00098847FA7C00A452604862EA7C053C4808CF13226C4A6C2813027FA812E26023326 +:20F0E0005F862BD647271C2A03862D50A7428645A741862F4CC00A24FBCB3AED436F4520E1 +:20F1000004A7C46F418E01F1398000000000FA0A1F0000989680FFF0BDC0000186A0FFFF35 +:20F12000D8F0000003E8FFFFFF9C0000000AFFFFFFFF964F27020354399F64BDEE788D0527 +:20F140008D088E00407EED139F64BDEE739E64E680D7559F648DEE9E6430059F64BDEC0BAD +:20F160008E00450A5526EE39BDEEB62B1F27158D10BDEE788D0E8E00408DCA8EED0EBDEC77 +:20F180000B7EEF379EB19F509EB39F52BEF1B99F5DBEF1BB9F5FBDED19DC8AC3658BDDB308 +:20F1A000DD52DC88C9B08905DDB1DD500F548680974F961597637EEC6540E64DABBDEEA8C6 +:20F1C0008EF202D661BDEDD2BDEEA88DB40F62965CD64FBDEC058EF207BDEC0296543402DE +:20F1E0002A09BDEBFD96542B05030ABDF1328EF207BDEC0B35024D2A03BDF1328EF20C7E5A +:20F20000F13983490FDAA27F000000000584E61A2D1B862807FBF88799688901872335DFA5 +:20F22000E186A55DE72883490FDAA2A154468F138F524389CD8EF268BDEC0B7EF1BDBDEE35 +:20F24000780F0A8DF68E004ABDEE7E8E0040BDEE5D0F54960A8D0C0D4F1027FA7E8E004A44 +:20F260007EEDD834027EF1EB81490FDAA2965434022A028D24964F3402818125058EED0E99 +:20F280008DDE8EF29DBDF1393502818125068EF268BDEC0235024D2A037EF132390B76B349 +:20F2A00083BDD3791EF4A6F57B83FCB0107C0C1F67CA7CDE53CBC17D1464704C7DB7EA512A +:20F2C0007A7D6330887E7E9244993A7E4CCC91C77FAAAAAA138100000000037F5E56CB79FE +:20F2E00080139B0B6480763893168238AA3B20803504F334813504F3348080000000803169 +:20F300007217F8BDEEB6102FF3C48EF2EF964F808034028680974FBDEC0B8EF2F4BDEDD8F5 +:20F320008EED0EBDEC028EF2DABDF1398EF2F9BDEC0B3504BDEFE28EF2FE7EED13BDEEA815 +:20F340008EF109BDEE5D27674D26037EEC838E004ABDEE7E5F96612A10BDEF378E004A964A +:20F3600061BDEEE9260343D601BDEE953404BDF3038E004ABDED138D363502461025FDB271 +:20F38000398138AA3B29077134583E5674167EB31B772FEEE3857A1D841C2A7C6359580A08 +:20F3A0007E75FDE7C6803172181081000000008EF381BDED13BDEE78964F818825037EED81 +:20F3C000A5BDEF3796018B8127F44A34028E0040BDEC028EF386BDF1480F623502BDED910E +:20F3E00039BDEEB62B037EEF3703548DF97EF132BDF81E326286019798BDDFA21025ED7F27 +:20F40000BDEA3B1F208300F5D797DC2BBDF015BDEBF58E00F4D69826255FBDF544BDFCE94D +:20F42000250B80303402860A3DEBE020EDC001C90181412605BDEBA520BB814C260B8D31B5 +:20F440000F98BDEBA520C33262810D260D8D22BDEBA58E00F49F837EDF4B814527F1815188 +:20F460002606BDEBA57EDF228D0220AD812026108CC6F9A6842708BDDB1430015A26F43933 +:20F48000814426486D8427F78D045A26F7390A97311F3121A621A7A426F8398149271381B8 +:20F4A00058270D8148265C6F841F108300F5D7978DBFBDF544810D278E811B272581082651 +:20F4C000228C00F427EC8D458DC420E6814326CB6D84270EBDF544250220F5A7808D375AFC +:20F4E00026EE39D697C1F9260220C734106D8026FCE682E701ACE426F83262A7808D170CCD +:20F500009720AF810826128D045A26FB398C00F427D0301F86087EDB14814B2705805327CC +:20F52000013934028D1E3402A68427166D6126068DE430012003BDF48EA684A1E426E95AFD +:20F5400026E635A0BDDB00817F24F9815F2602861B810D270E811B270A8108270681202560 +:20F56000E31A0139864F978C398600D6791D7EE778BDE4F3DC1F3406BDE5DBBDE4F0350642 +:20F580001E109C1F26517EE7789D7CBDE4F3BDE5DB3410EC02109321230493272312E6848E +:20F5A000BDE7F13410AE62BDE8C73550AF423440BDE9BC34045D271FC6FF81292703BDE990 +:20F5C000BC3404BDE4F0C6AEBDE4F88D2E1F13AE62A684A06124037EE6CE4CA1E42402A77A +:20F5E000E4A6611E89AE025A3A4D270DA1E42302A6E41F891E31BDDCAE3596BDE3DF7EE892 +:20F60000D8BDE4F3BDE98F3404BDE4F6BDE3DFBDE4F096062605BDE9922003BDE928340442 +:20F62000E661BDE79335062705A7805A26FB7EE91FBDE4F3BDE3DFC601340496062610BD1C +:20F64000E992E7E42791BDE4F6BDE3DFBDE3CF9E523410BDE4F6BDF5FB3414BDE4F0AE63C5 +:20F66000BDE8DD3404E1662523A661271CE6665A3A3184EE62E661A6E4A0664CA161250CBC +:20F68000A680A1C0260C5A26F7E666215F32677EE7776C66302120D98126265C32620F52BF +:20F6A0000F538E00529D7C814F2712814827239D82200C81381022EE47C6038D2A9D7C25AA +:20F6C000F20F500F510F060F630F54C6A0D74F7EEC659D7C250BBDE62625E6814724E280C9 +:20F6E00007C6048D0220EB680169841025F5EC5A26F58030AB01A7013935400F069E839D39 +:20F700007C8126279981B0275E81FF26089D7C8183102700AB9F836EC49E68300126D9C653 +:20F72000167EDF03AE9F00838CFF83102700748D238DE6BDE4F3C680D708BDE5DB8D25BD02 +:20F74000E4F0C6AEBDE4F89E4BDC83ED84DC39ED027EE18DC6B0BDE4F8C680D7088A80BD24 +:20F76000E5E09F4B7EE3CC8DEB3410BDE4EB8DF43540C632AE4227A9109E83EEC4DF83A6CC +:20F78000043402EC84EE023476BDEE7EBDE3CA3576ED84EF023502A7049D821026ED6110F0 +:20F7A0009F83399D7C8D0934108D2D3540AFC4395F9D7C240680301F899D7C9E8D583A3917 +:20F7C0008DEEAE843410BDE4EB8E004F96062707BDE8DB9E52960639C6AEBDE4F87EE9C18B +:20F7E0001027EEEABDE214BDDFA29F939D82271081A7263B9D7C27048D24200486FF972B98 +:20F80000DE938CEEC4ECC42706EC42932B23F49E938D15BDDFC29E93BDDF927EDF22BDE2AB +:20F82000147EDCB7A6C0A78011931B26F79F1B39BDF7199D7C8122260BBDE4CDC63BBDE47D +:20F84000F8BDEBE8327EBDE2C93262BDE5DB9F3BBDE3CF8E00F34FBDE7A07EE251BDE21436 +:20F860009E2B399E919F2B7EDFA2BDDFC7CC000ADD95DD8F5FDD919D8224068DE09F959D23 +:20F8800082271BBDE4F624068DD39F919D82270EBDE4F624068DC69F8F2749BDDCB78DC3AD +:20F8A0009F939E958DBF9C93253A8D1CBDF93EBDDF908DAF9F938D3A8D0F8D36BDF9D9BD60 +:20F8C000DFC7BDDF907EDF22864F97989E93DC958D150D982602ED02AE848D0BD38F25047E +:20F8E00081FA25EE7EE6CE3406EC84350626023262399E19301F30018DED30033001A6842F +:20F9000027F49F0F4A270C4A272A4A26EF8603A78020E7EC016A0227014FE6036A042701A1 +:20F920005FED01DD2BBDDFA29E0F25E1DC476C80ED8420C66F84AE01AE029F4720EA9E1922 +:20F9400020049E8330018D9F300230019F839D7C4D27EF2AF99E8381FF27EF81A22712814D +:20F9600084270E818126E79D7C81A0270481A126DB9D7C25049D8220D79E833410BDE214C7 +:20F980009E83A682BDFCE925F930011F10E061C0052720250A3384503085BDF82820149F16 +:20F9A000479E1B9F435030859F419F1BBDDEDB9E459F8335108601A784A702A704D62B26D9 +:20F9C00004C6016C02E701D62C2604C6016C04E7039D82812C279A209C9E19301F3001EC4D +:20F9E00002DD68BDF8E730033001A68427EF4A271B800226F334108EFA36BDEBE5AEE4EC4C +:20FA000001BDF015BDF00EBDEBA535103410EC01DD52BDF6C1BDF0223540C6053001A68498 +:20FA200027055AA7C020F530C45D27BE31C433C5BDF82830A420B3554C2000BDE9C48E0163 +:20FA4000F0C60434045F860408530952594A26F85D260AA6E44A27058C01F0270CCB30C15B +:20FA6000392302CB07E7806F8435045A26D532628E01EF7EE79C860197995ABDFC179D825B +:20FA800010270093D793BDE3DFBDE3CF9E529F4DD699BDE931BDEBE89E52D699E0845A1065 +:20FAA0002B014FBDEBF520F6D7939F0F86029799A684812527C4812026070C9930015A2669 +:20FAC000EF9E0FD6938625BDFC17BDDB14202981B12701393262BDE3E1BDE3CFC63BBDE4F8 +:20FAE000F89E529F952006969727089E950F97E68426037EE6CEAE020F9A0F99A680812101 +:20FB00001027FF728123275B5A2616BDFC17BDDB149D8226D296972603BDEBA59E957EE8B2 +:20FB2000DD812B2609BDFC178608979A20CC812E274E81251027FF70A184268B8124271967 +:20FB4000812A26F6969A8A20979AC1022511A6018124260B5A30010C99969A8A10979A3002 +:20FB6000010C990F980C995A2749A680812E271E812327F1812C2621969A8A40979A20E5CF +:20FB8000A68481231026FF3F8601979830010C985A2720A680812327F5815E2616A18426AB +:20FBA00012A101260EA102260AC1042506C00430040C9A301F0C99969A850826180A995D0D +:20FBC0002713A684802D270681FE260986088A049A9A979A5A9D821027FF3CD793BDE3CAF9 +:20FBE00096999B9881111022EAE4BDFC24301FBDEBE50F979D82270D9797813B2705BDE4A8 +:20FC0000F620029D7C9E95E684D093AE023AD6931026FEE47EFB113402862B0D9A2703BD49 +:20FC2000DB143582CE01F2C620969A85082702C62B0D542A040F54C62DE7C0C630E7C084F3 +:20FC400001102601078EF009BDEEE92B15BDF022A68026FCA682A7018C01F126F78625A736 +:20FC60008439964F97472703BDFE0C9647102B0081409B998009BDFD29BDFEA2BDFE4196AB +:20FC800047BDFEC09647BDFE8896982602335F4ABDFD29BDFDC44D2706C12A2702E7C06F4B +:20FCA000C48E01F130019F0F963A901090992738A684812027EE812A27EA4F3402A6808161 +:20FCC0002D27F8812B27F4910027F08130260EA6018D1625083502A78226FA20C735024D22 +:20FCE00026FB9E0F8625A7823981302504803A80C639969827014A9B472B014F34022A0AAF +:20FD00003402BDEDCB35024C20F49647A0E097478B092B199699800990478D0DBDFEA220E8 +:20FD20001D34028630A7C035024A2AF53996998DF8BDFE8C86F790478DEF0F450F97BDFEFA +:20FD40004196982602DE399B4716FF43964F34022703BDFE0C969827014A9B997F01F1D694 +:20FD60009AC40426037301F1BB01F1800934022A0A3402BDEDCB35024C20F4A6E42B014FAC +:20FD8000409B994CBB01F197450F97BDFE413502BDFEC096982602335FE6E02709D647CB00 +:20FDA00009D099F001F1862B5D2A03862D50A7418645A7C1862F4CC00A24FBCB3AEDC16F8A +:20FDC000C47EFC938E01F2E68434048620D69AC52035042708862AC12026021F893404A78C +:20FDE00080E6842710C145270CC13027F2C12C27EEC12E26048630A782969A85102704C6EF +:20FE000024E782840435042602E7823934404F9747D64FC18022118EF009BDED13964780EF +:20FE20000920ECBDEDCB0C478EF004BDEEE92EF38EEFFFBDEEE92E07BDEDB30A4720F13575 +:20FE4000C03440BDEBFDBDEF1135408EF10EC6808D369653AB0397539652A902975296511D +:20FE6000A90197519650A98497505C565928E32403C00B50CB2F30041F98847FA7C053C438 +:20FE8000808CF13226CA6FC40A452609DF39862EA7C00F97390A97260886039797862CA7A1 +:20FEA000C03996478B0A97454C800324FC8B059797969A8440260297973934028DCA350207 +:20FEC0004A2B0A34028630A7C0A6E026ED3981891027F95C7EE500FFFFFFFFFFFFFFFFFF8E +:20FEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:20FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:20FF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:20FF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:20FF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:20FF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:20FFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:20FFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:20FFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000009B009E00AA00A700A100A4DB4621 +:00000001FF diff --git a/ROMS/6809/ExBasRom.zip b/ROMS/6809/ExBasRom.zip new file mode 100644 index 0000000000000000000000000000000000000000..4e0a1d1c5579cb15e04a5e932cc111532df4fea2 GIT binary patch literal 180465 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%0A=fd375 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%0ADU7~rlxnRiKej4R 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 literal 0 HcmV?d00001 diff --git a/ROMS/6809/M6809_EXT_BASIC_ROM.vhd b/ROMS/6809/M6809_EXT_BASIC_ROM.vhd index c24aa2f..9f2eb98 100644 --- a/ROMS/6809/M6809_EXT_BASIC_ROM.vhd +++ b/ROMS/6809/M6809_EXT_BASIC_ROM.vhd @@ -62,7 +62,7 @@ BEGIN address_aclr_a => "NONE", clock_enable_input_a => "BYPASS", clock_enable_output_a => "BYPASS", - init_file => "./ROMS/6809/EXT_BASIC_NO_USING.hex", + init_file => "./ROMS/6809/basic_remap.hex", intended_device_family => "Cyclone V", lpm_hint => "ENABLE_RUNTIME_MOD=NO", lpm_type => "altsyncram", diff --git a/ROMS/6809/as11v2.pdf b/ROMS/6809/as11v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..96ee3a7f5f1f33df6fadadeab12e55984685b20f GIT binary patch literal 88893 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

&05G4ahp~s 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 bfY}V3B8$#3R1~%2-LDD{;1I0srttp{C>F4+ literal 0 HcmV?d00001 diff --git a/ROMS/6809/as9.exe b/ROMS/6809/as9.exe new file mode 100644 index 0000000000000000000000000000000000000000..3f48679912cfb0356ba6f5640865d0602a13d69a GIT binary patch literal 37198 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 literal 0 HcmV?d00001 diff --git a/ROMS/6809/basic.asm b/ROMS/6809/basic.asm index 869f9ae..8b8129b 100644 --- a/ROMS/6809/basic.asm +++ b/ROMS/6809/basic.asm @@ -13,10 +13,10 @@ STKBUF EQU 58 STACK BUFFER ROOM LBUFMX EQU 250 MAX NUMBER OF CHARS IN A BASIC LINE MAXLIN EQU $FA MAXIMUM MS BYTE OF LINE NUMBER * PSEUDO OPS -SKP1 EQU $21 OP CODE OF BRN — SKIP ONE BYTE +SKP1 EQU $21 OP CODE OF BRN � SKIP ONE BYTE SKP2 EQU $8C OP CODE OF CMPX # - SKIP TWO BYTES SKP1LD EQU $86 OP CODE OF LDA # - SKIP THE NEXT BYTE -* AND LOAD THE VALUE OF THAT BYTE INTO ACCA — THIS +* AND LOAD THE VALUE OF THAT BYTE INTO ACCA � THIS * IS USUALLY USED TO LOAD ACCA WITH A NON ZERO VALUE RTS_LOW EQU $95 ORG 0 @@ -70,7 +70,7 @@ V45 RMB 1 V46 RMB 1 V47 RMB 1 V48 RMB 2 -** FLOATING POINT ACCUMULATOR #5 :PACKED: ($4A—$4E) +** FLOATING POINT ACCUMULATOR #5 :PACKED: ($4A�$4E) V4A RMB 1 V4B RMB 2 V4D RMB 2 @@ -201,25 +201,26 @@ NOCHAR CLRA * CONSOLE OUT -PUTCHR BSR WAITACIA - PSHS A - CMPA #CR IS IT CARRIAGE RETURN? - BEQ NEWLINE YES - STA TRANS - INC LPTPOS INCREMENT CHARACTER COUNTER - LDA LPTPOS CHECK FOR END OF LINE PRINTER LINE - CMPA LPTWID AT END OF LINE PRINTER LINE? - BLO PUTEND NO -NEWLINE CLR LPTPOS RESET CHARACTER COUNTER - BSR WAITACIA - LDA #13 - STA TRANS - BSR WAITACIA - LDA #10 DO LINEFEED AFTER CR - STA TRANS -PUTEND PULS A - RTS - +PUTCHR BSR WAITACIA + PSHS A + CMPA #CR IS IT CARRIAGE RETURN? + BEQ NEWLINE YES + STA TRANS + INC LPTPOS INCREMENT CHARACTER COUNTER + LDA LPTPOS CHECK FOR END OF LINE PRINTER LINE + CMPA LPTWID AT END OF LINE PRINTER LINE? + BLO PUTEND NO + BRA PUTEND Skip newline if not CR +NEWLINE CLR LPTPOS + BSR WAITACIA + LDA #13 Send CR + STA TRANS + BSR WAITACIA + LDA #10 Send LF after CR + STA TRANS +PUTEND PULS A + RTS + WAITACIA PSHS A WRWAIT LDA USTAT BITA #2 @@ -227,18 +228,33 @@ WRWAIT LDA USTAT PULS A RTS -* -RESVEC -LA00E LDS #LINBUF+LBUFMX+1 SET STACK TO TOP OF LINE INPUT BUFFER - LDA RSTFLG GET WARM START FLAG - CMPA #$55 IS IT A WARM START? - BNE BACDST NO - D0 A COLD START - LDX RSTVEC WARM START VECTOR - LDA ,X GET FIRST BYTE OF WARM START ADDR - CMPA #$12 IS IT NOP? - BNE BACDST NO - DO A COLD START - JMP ,X YES, G0 THERE - +* ALLOW CHOICE OF COLD OR WARM START +RESVEC LDS #LINBUF+LBUFMX+1 SET STACK TO TOP OF LINE INPUT BUFFER + LDA #$0C Load FF (Form Feed) character to clear screen + JSR PUTCHR Send it to clear the screen + LDX #PROMPT POINT TO PROMPT MESSAGE +PRLOOP LDA ,X+ GET NEXT CHARACTER FROM PROMPT + BEQ KCHECK EXIT IF NULL TERMINATOR + JSR PUTCHR PRINT CHARACTER + BRA PRLOOP CONTINUE PRINTING +KCHECK LDA USTAT CHECK UART STATUS + BITA #1 TEST INPUT READY BIT + BEQ KCHECK LOOP UNTIL KEY PRESSED + LDA RECEV GET CHARACTER FROM UART + ANDA #$7F MASK TO 7 BITS + CMPA #'C CHECK FOR COLD START REQUEST + BEQ BACDST DO COLD START IF REQUESTED + CMPA #'W CHECK FOR WARM START REQUEST + BEQ DOWARM DO WARM START IF REQUESTED + LDA RSTFLG DEFAULT TO FLAG CHECK IF NO VALID KEY + CMPA #$55 IS IT A WARM START? + BNE BACDST NO - DO A COLD START +DOWARM LDX RSTVEC WARM START VECTOR + LDA ,X GET FIRST BYTE OF WARM START ADDR + CMPA #$12 IS IT NOP? + BNE BACDST NO - DO A COLD START + JMP ,X YES, GO THERE + * COLD START ENTRY BACDST LDX #PROGST+1 POINT X TO CLEAR 1ST 1K OF RAM @@ -271,14 +287,14 @@ LA093 STX TOPRAM SAVE ABSOLUTE TOP OF RAM JSR LA59A MOVE 4 BYTES FROM ROM TO RAM LDA #$39 STA LINHDR-1 PUT RTS IN LINHDR-1 - JSR LAD19 G0 DO A ‘NEW’ + JSR LAD19 G0 DO A �NEW� * EXTENDED BASIC INITIALISATION LDX #USR0 INITIALIZE ADDRESS OF START OF STX USRADR USR JUMP TABLE -* INITIALIZE THE USR CALLS TO ‘FC ERROR’ - LDU #LB44A ADDRESS OF ‘FC ERROR’ ROUTINE +* INITIALIZE THE USR CALLS TO �FC ERROR� + LDU #LB44A ADDRESS OF �FC ERROR� ROUTINE LDB #10 10 USR CALLS IN EX BASIC -L8031 STU ,X++ STORE ‘FC’ ERROR AT USR ADDRESSES +L8031 STU ,X++ STORE �FC� ERROR AT USR ADDRESSES DECB FINISHED ALL 10? BNE L8031 NO @@ -286,13 +302,13 @@ L8031 STU ,X++ STORE LDA #RTS_LOW DIV16 CLOCK -> 7372800 / 4 / 16 = 115200 STA UCTRL LDX #LA147-1 POINT X TO COLOR BASIC COPYRIGHT MESSAGE - JSR LB99C PRINT ‘COLOR BASIC’ + JSR LB99C PRINT �COLOR BASIC� LDX #BAWMST WARM START ADDRESS STX RSTVEC SAVE IT LDA #$55 WARM START FLAG STA RSTFLG SAVE IT - BRA LA0F3 GO TO BASIC’S MAIN LOOP -BAWMST NOP NOP REQ’D FOR WARM START + BRA LA0F3 GO TO BASIC�S MAIN LOOP +BAWMST NOP NOP REQ�D FOR WARM START JSR LAD33 DO PART OF A NEW LA0F3 JMP LAC73 GO TO MAIN LOOP OF BASIC * @@ -305,7 +321,7 @@ LA10D FCB 16 TAB FIELD WIDTH FCB 64 LAST TAB ZONE FCB 255 PRINTER WIDTH FCB 0 LINE PRINTER POSITION - FDB LB44A ARGUMENT OF EXEC COMMAND - SET TO ‘FC’ ERROR + FDB LB44A ARGUMENT OF EXEC COMMAND - SET TO �FC� ERROR * LINE INPUT ROUTINE INC CHARAD+1 BNE LA123 @@ -316,7 +332,7 @@ LA123 LDA >0000 * THESE BYTES ARE MOVED TO ADDRESSES $A7-$B1 JMP BIRQSV IRQ SERVICE JMP BFRQSV FIRQ SERVICE - JMP LB44A USR ADDRESS FOR 8K BASIC (INITIALIZED TO ‘FC’ ERROR) + JMP LB44A USR ADDRESS FOR 8K BASIC (INITIALIZED TO �FC� ERROR) FCB $80 *RANDOM SEED FDB $4FC7 *RANDON SEED OF MANTISSA FDB $5259 *.811635157 @@ -341,7 +357,10 @@ LA147 FCC "6809 EXTENDED BASIC" LA156 FCB CR,CR LA165 FCB $00 - +PROMPT FCC "COLD OR WARM START (C/W)? " + FCB CR + FCB $00 + LA35F PSHS X,B,A SAVE REGISTERS LDX LPTCFW TAB FIELD WIDTH AND TAB ZONE LDD LPTWID PRINTER WIDTH AND POSITION @@ -767,25 +786,25 @@ LABF2 FCB CR FCC "BREAK" FCB $00 -* SEARCH THE STACK FOR ‘GOSUB/RETURN’ OR ‘FOR/NEXT’ DATA. -* THE ‘FOR/NEXT’ INDEX VARIABLE DESCRIPTOR ADDRESS BEING +* SEARCH THE STACK FOR �GOSUB/RETURN� OR �FOR/NEXT� DATA. +* THE �FOR/NEXT� INDEX VARIABLE DESCRIPTOR ADDRESS BEING * SOUGHT IS STORED IN VARDES. EACH BLOCK OF FOR/NEXT DATA IS 18 * BYTES WITH A $80 LEADER BYTE AND THE GOSUB/RETURN DATA IS 5 BYTES * WITH AN $A6 LEADER BYTE. THE FIRST NON "FOR/NEXT" DATA -* IS CONSIDERED ‘GOSUB/RETURN’ +* IS CONSIDERED �GOSUB/RETURN� LABF9 LEAX 4,S POINT X TO 3RD ADDRESS ON STACK - IGNORE THE * FIRST TWO RETURN ADDRESSES ON THE STACK -LABFB LDB #18 18 BYTES SAVED ON STACK FOR EACH ‘FOR’ LOOP +LABFB LDB #18 18 BYTES SAVED ON STACK FOR EACH �FOR� LOOP STX TEMPTR SAVE POINTER LDA ,X GET 1ST BYTE SUBA #$80 * CHECK FOR TYPE OF STACK JUMP FOUND - BNE LAC1A * BRANCH IF NOT ‘FOR/NEXT’ + BNE LAC1A * BRANCH IF NOT �FOR/NEXT� LDX 1,X = GET INDEX VARIABLE DESCRIPTOR STX TMPTR1 = POINTER AND SAVE IT IN TMPTR1 LDX VARDES GET INDEX VARIABLE BEING SEARCHED FOR BEQ LAC16 BRANCH IF DEFAULT INDEX VARIABLE - USE THE -* FIRST ‘FOR/NEXT’ DATA FOUND ON STACK -* IF NO INDEX VARIABLE AFTER ‘NEXT’ +* FIRST �FOR/NEXT� DATA FOUND ON STACK +* IF NO INDEX VARIABLE AFTER �NEXT� CMPX TMPTR1 DOES THE STACK INDEX MATCH THE ONE * BEING SEARCHED FOR? BEQ LAC1A YES @@ -793,9 +812,9 @@ LABFB LDB #18 18 BYTES SAVED ON STACK FOR EACH ABX * 18 TO IT AND LOOK FOR BRA LABFB * NEXT BLOCK OF DATA LAC16 LDX TMPTR1 = GET 1ST INDEX VARIABLE FOUND AND - STX VARDES = SAVE AS ‘NEXT’ INDEX -LAC1A LDX TEMPTR POINT X TO START OF ‘FOR/NEXT’ DATA - TSTA SET ZERO FLAG IF ‘FOR/NEXT’ DATA + STX VARDES = SAVE AS �NEXT� INDEX +LAC1A LDX TEMPTR POINT X TO START OF �FOR/NEXT� DATA + TSTA SET ZERO FLAG IF �FOR/NEXT� DATA RTS * CHECK FOR MEMORY SPACE FOR NEW TOP OF * ARRAYS AND MOVE ARRAYS TO NEW LOCATION @@ -828,7 +847,7 @@ LAC44 LDB #6*2 OUT OF MEMORY ERROR * ERROR SERVICING ROUTINE LAC46 JSR LAD33 RESET STACK, STRING STACK, CONTINUE POINTER JSR LB95C SEND A CR TO SCREEN - JSR LB9AF SEND A ‘?‘ TO SCREEN + JSR LB9AF SEND A �?� TO SCREEN LDX #LABAF POINT TO ERROR TABLE LAC60 ABX ADD MESSAGE NUMBER OFFSET BSR LACA0 * GET TWO CHARACTERS FROM X AND @@ -838,18 +857,18 @@ LAC68 JSR LB99C PRINT MESSAGE POINTED TO BY X LDA CURLIN GET CURRENT LINE NUMBER (CURL IN) INCA TEST FOR DIRECT MODE BEQ LAC73 BRANCH IF DIRECT MODE - JSR LBDC5 PRINT ‘IN ****‘ + JSR LBDC5 PRINT �IN ****� * THIS IS THE MAIN LOOP OF BASIC WHEN IN DIRECT MODE LAC73 JSR LB95C MOVE CURSOR TO START OF LINE - LDX #LABED POINT X TO ‘OK’, CR MESSAGE - JSR LB99C PRINT ‘OK’, CR + LDX #LABED POINT X TO �OK�, CR MESSAGE + JSR LB99C PRINT �OK�, CR LAC7C JSR LA390 GO GET AN INPUT LINE LDU #$FFFF THE LINE NUMBER FOR DIRECT MODE IS $FFFF STU CURLIN SAVE IT IN CURLIN BCS LAC7C BRANCH IF LINE INPUT TERMINATED BY BREAK STX CHARAD SAVE (X) AS CURRENT INPUT POINTER - THIS WILL -* ENABLE THE ‘LIVE KEYBOARD’ (DIRECT) MODE. THE +* ENABLE THE �LIVE KEYBOARD� (DIRECT) MODE. THE * LINE JUST ENTERED WILL BE INTERPRETED JSR GETNCH GET NEXT CHARACTER FROM BASIC BEQ LAC7C NO LINE INPUT - GET ANOTHER LINE @@ -876,7 +895,7 @@ LACA8 LDX BINVAL GET CONVERTED LINE NUMBER STD VARTAB * THE LENGTH OF THIS LINE NUMBER FROM THE PROGRAM LDU ,X POINT U TO ADDRESS OF NEXT LINE NUMBER * DELETE OLD LINE FROM BASIC PROGRAM -LACC0 PULU A GET A BYTE FROM WHAT’S LEFT OF PROGRAM +LACC0 PULU A GET A BYTE FROM WHAT�S LEFT OF PROGRAM STA ,X+ MOVE IT DOWN CMPX VARTAB COMPARE TO END OF BASIC PROGRAM BNE LACC0 BRANCH IF NOT AT END @@ -887,7 +906,7 @@ LACC8 LDA LINBUF * CHECK TO SEE IF THERE IS A LINE IN ADDB TMPLOC * ADD LENGTH OF CRUNCHED LINE, ADCA #0 * PROPOGATE CARRY AND SAVE NEW END STD V41 * OF PROGRAM IN V41 - JSR LAC1E = MAKE SURE THERE’S ENOUGH RAM FOR THIS + JSR LAC1E = MAKE SURE THERE�S ENOUGH RAM FOR THIS * = LINE & MAKE A HOLE IN BASIC FOR NEW LINE LDU #LINHDR-2 POINT U TO LINE TO BE INSERTED LACDD PULU A GET A BYTE FROM NEW LINE @@ -898,7 +917,7 @@ LACDD PULU A GET A BYTE FROM NEW LINE STX VARTAB = END OF PROGRAM LACE9 BSR LAD21 RESET INPUT POINTER, CLEAR VARIABLES, INITIALIZE BSR LACEF ADJUST START OF NEXT LINE ADDRESSES - BRA LAC7C REENTER BASIC’S INPUT LOOP + BRA LAC7C REENTER BASIC�S INPUT LOOP * COMPUTE THE START OF NEXT LINE ADDRESSES FOR THE BASIC PROGRAM LACEF LDX TXTTAB POINT X TO START OF PROGRAM LACF1 LDD ,X GET ADDRESS OF NEXT LINE @@ -936,7 +955,7 @@ LAD21 LDX TXTTAB GET START OF BASIC * ERASE ALL VARIABLES LAD26 LDX MEMSIZ * RESET START OF STRING VARIABLES STX STRTAB * TO TOP OF STRING SPACE - JSR RESTOR RESET ‘DATA’ POINTER TO START OF BASIC + JSR RESTOR RESET �DATA� POINTER TO START OF BASIC LDX VARTAB * GET START OF VARIABLES AND USE IT STX ARYTAB * TO RESET START OF ARRAYS STX ARYEND RESET END OF ARRAYS @@ -946,8 +965,8 @@ LAD33 LDX #STRSTK * RESET STRING STACK POINTER TO LDS FRETOP RESTORE STACK POINTER CLR ,-S PUT A ZERO BYTE ON STACK - TO CLEAR ANY RETURN OF * FOR/NEXT DATA FROM THE STACK - CLR OLDPTR RESET ‘CONT’ ADDRESS SO YOU - CLR OLDPTR+1 ‘CAN’T CONTINUE’ + CLR OLDPTR RESET �CONT� ADDRESS SO YOU + CLR OLDPTR+1 �CAN�T CONTINUE� CLR ARYDIS CLEAR THE ARRAY DISABLE FLAG JMP ,X RETURN TO CALLING ROUTINE - THIS IS NECESSARY * SINCE THE STACK WAS RESET @@ -959,29 +978,29 @@ LAD33 LDX #STRSTK * RESET STRING STACK POINTER TO * BYTES ARE DEFINED AS FOLLOWS: 0- $80 (FOR FLAG); * 1,2=INDEX VARIABLE DESCRIPTOR POINTER; 3-7=FP VALUE OF STEP; * 8=STEP DIRECTION: $FF IF NEGATIVE; 0 IF ZERO; 1 IF POSITIVE; -* 9-13=FP VALUE OF ‘TO’ PARAMETER; +* 9-13=FP VALUE OF �TO� PARAMETER; * 14,15=CURRENT LINE NUMBER; 16,17=RAM ADDRESS OF THE END -* OF THE LINE CONTAINING THE ‘FOR’ STATEMENT +* OF THE LINE CONTAINING THE �FOR� STATEMENT FOR LDA #$80 * SAVE THE DISABLE ARRAY FLAG IN VO8 STA ARYDIS * DO NOT ALLOW THE INDEX VARIABLE TO BE AN ARRAY JSR LET SET INDEX VARIABLE TO INITIAL VALUE - JSR LABF9 SEARCH THE STACK FOR ‘FOR/NEXT’ DATA + JSR LABF9 SEARCH THE STACK FOR �FOR/NEXT� DATA LEAS 2,S PURGE RETURN ADDRESS OFF OF THE STACK BNE LAD59 BRANCH IF INDEX VARIABLE NOT ALREADY BEING USED - LDX TEMPTR GET (ADDRESS + 18) OF MATCHED ‘FOR/NEXT’ DATA + LDX TEMPTR GET (ADDRESS + 18) OF MATCHED �FOR/NEXT� DATA LEAS B,X MOVE THE STACK POINTER TO THE BEGINNING OF THE -* MATCHED ‘FOR/NEXT’ DATA SO THE NEW DATA WILL +* MATCHED �FOR/NEXT� DATA SO THE NEW DATA WILL * OVERLAY THE OLD DATA. THIS WILL ALSO DESTROY -* ALL OF THE ‘RETURN’ AND ‘FOR/NEXT’ DATA BELOW +* ALL OF THE �RETURN� AND �FOR/NEXT� DATA BELOW * THIS POINT ON THE STACK LAD59 LDB #$09 * CHECK FOR ROOM FOR 18 BYTES JSR LAC33 * IN FREE RAM JSR LAEE8 GET ADDR OF END OF SUBLINE IN X LDD CURLIN GET CURRENT LINE NUMBER PSHS X,B,A SAVE LINE ADDR AND LINE NUMBER ON STACK - LDB #TOK_TO TOKEN FOR ‘TO’ - JSR LB26F SYNTAX CHECK FOR ‘TO’ - JSR LB143 ‘TM’ ERROR IF INDEX VARIABLE SET TO STRING + LDB #TOK_TO TOKEN FOR �TO� + JSR LB26F SYNTAX CHECK FOR �TO� + JSR LB143 �TM� ERROR IF INDEX VARIABLE SET TO STRING JSR LB141 EVALUATE EXPRESSION * LDB FP0SGN GET FPA0 MANTISSA SIGN @@ -994,31 +1013,31 @@ LAD7F LDX #LBAC5 POINT X TO FLOATING POINT NUMBER 1.0 (DEFAULT STEP JSR LBC14 MOVE (X) TO FPA0 JSR GETCCH GET CURRENT INPUT CHARACTER CMPA #TOK_STEP STEP TOKEN - BNE LAD90 BRANCH IF NO ‘STEP’ VALUE + BNE LAD90 BRANCH IF NO �STEP� VALUE JSR GETNCH GET A CHARACTER FROM BASIC JSR LB141 EVALUATE NUMERIC EXPRESSION LAD90 JSR LBC6D CHECK STATUS OF FPA0 JSR LB1E6 SAVE STATUS AND FPA0 ON THE STACK - LDD VARDES * GET DESCRIPTOR POINTER FOR THE ‘STEP’ + LDD VARDES * GET DESCRIPTOR POINTER FOR THE �STEP� PSHS B,A * VARIABLE AND SAVE IT ON THE STACK - LDA #$80 = GET THE ‘FOR’ FLAG AND + LDA #$80 = GET THE �FOR� FLAG AND PSHS A = SAVE IT ON THE STACK * * MAIN COMMAND INTERPRETATION LOOP LAD9E ANDCC #$AF ENABLE IRQ,FIRQ BSR LADEB CHECK FOR KEYBOARD BREAK - LDX CHARAD GET BASIC’S INPUT POINTER + LDX CHARAD GET BASIC�S INPUT POINTER STX TINPTR SAVE IT LDA ,X+ GET CURRENT INPUT CHAR & MOVE POINTER BEQ LADB4 BRANCH IF END OF LINE CMPA #': CHECK FOR LINE SEPARATOR BEQ LADC0 BRANCH IF COLON -LADB1 JMP LB277 ‘SYNTAX ERROR’-IF NOT LINE SEPARATOR +LADB1 JMP LB277 �SYNTAX ERROR�-IF NOT LINE SEPARATOR LADB4 LDA ,X++ GET MS BYTE OF ADDRESS OF NEXT BASIC LINE STA ENDFLG SAVE IN STOP/END FLAG - CAUSE A STOP IF * NEXT LINE ADDRESS IS < $8000; CAUSE * AN END IF ADDRESS > $8000 - BEQ LAE15 BRANCH TO ‘STOP’ - END OF PROGRAM + BEQ LAE15 BRANCH TO �STOP� - END OF PROGRAM LDD ,X+ GET CURRENT LINE NUMBER STD CURLIN SAVE IN CURLIN STX CHARAD SAVE ADDRESS OF FIRST BYTE OF LINE @@ -1037,19 +1056,19 @@ LADC0 JSR GETNCH GET A CHARACTER FROM BASIC BRA LAD9E GO BACK TO MAIN LOOP LADC6 BEQ LADEA RETURN IF END OF LINE (RTS - was BEQ LAE40) TSTA CHECK FOR TOKEN - BIT 7 SET (NEGATIVE) - LBPL LET BRANCH IF NOT A TOKEN - GO DO A ‘LET’ WHICH -* IS THE ‘DEFAULT’ TOKEN FOR MICROSOFT BASIC + LBPL LET BRANCH IF NOT A TOKEN - GO DO A �LET� WHICH +* IS THE �DEFAULT� TOKEN FOR MICROSOFT BASIC CMPA #$FF SECONDARY TOKEN BEQ SECTOK CMPA #TOK_HIGH_EXEC SKIPF TOKEN - HIGHEST EXECUTABLE COMMAND IN BASIC - BHI LADB1 ‘SYNTAX ERROR’ IF NON-EXECUTABLE TOKEN - LDX COMVEC+3 GET ADDRESS OF BASIC’S COMMAND TABLE + BHI LADB1 �SYNTAX ERROR� IF NON-EXECUTABLE TOKEN + LDX COMVEC+3 GET ADDRESS OF BASIC�S COMMAND TABLE LADD4 ASLA X2 (2 BYTE/JUMP ADDRESS) & DISCARD BIT 7 TFR A,B SAVE COMMAND OFFSET IN ACCB ABX NON X POINTS TO COMMAND JUMP ADDR JSR GETNCH GET AN INPUT CHAR * -* HERE IS WHERE WE BRANCH TO DO A ‘COMMAND’ +* HERE IS WHERE WE BRANCH TO DO A �COMMAND� JMP [,X] GO DO A COMMAND SECTOK * THE ONLY SECONDARY TOKEN THAT CAN ALSO BE AN EXECUTABLE IS @@ -1087,7 +1106,7 @@ END JSR GETCCH GET CURRENT INPUT CHAR STOP ORCC #$01 SET CARRY FLAG LAE0B BNE LAE40 BRANCH IF ARGUMENT EXISTS LDX CHARAD * SAVE CURRENT POSITION OF - STX TINPTR * BASIC’S INPUT POINTER + STX TINPTR * BASIC�S INPUT POINTER LAE11 ROR ENDFLG ROTATE CARRY INTO BIT 7 OF STOP/END FLAG LEAS 2,S PURGE RETURN ADDRESS OFF STACK LAE15 LDX CURLIN GET CURRENT LINE NUMBER @@ -1095,20 +1114,20 @@ LAE15 LDX CURLIN GET CURRENT LINE NUMBER BEQ LAE22 YES STX OLDTXT SAVE CURRENT LINE NUMBER LDX TINPTR * GET AND SAVE CURRENT POSITION - STX OLDPTR * OF BASIC’S INPUT POINTER + STX OLDPTR * OF BASIC�S INPUT POINTER LAE22 - LDX #LABF2-1 POINT TO CR, ‘BREAK’ MESSAGE + LDX #LABF2-1 POINT TO CR, �BREAK� MESSAGE TST ENDFLG CHECK STOP/END FLAG LBPL LAC73 BRANCH TO MAIN LOOP OF BASIC IF END - JMP LAC68 PRINT ‘BREAK AT ####’ AND GO TO -* BASIC’S MAIN LOOP IF ‘STOP’ + JMP LAC68 PRINT �BREAK AT ####� AND GO TO +* BASIC�S MAIN LOOP IF �STOP� * CONT CONT BNE LAE40 RETURN IF ARGUMENT GIVEN - LDB #2*16 ‘CAN’T CONTINUE’ ERROR + LDB #2*16 �CAN�T CONTINUE� ERROR LDX OLDPTR GET CONTINUE ADDRESS (INPUT POINTER) - LBEQ LAC46 ‘CN’ ERROR IF CONTINUE ADDRESS = 0 - STX CHARAD RESET BASIC’S INPUT POINTER + LBEQ LAC46 �CN� ERROR IF CONTINUE ADDRESS = 0 + STX CHARAD RESET BASIC�S INPUT POINTER LDX OLDTXT GET LINE NUMBER STX CURLIN RESET CURRENT LINE NUMBER LAE40 RTS @@ -1124,75 +1143,75 @@ CLEAR BEQ LAE6F BRANCH IF NO ARGUMENT JSR LB73D EVALUATE EXPRESSlON; RETURN VALUE IN X LEAX -1,X X = TOP OF CLEARED SPACE CMPX TOPRAM COMPARE TO TOP OF RAM - BHI LAE72 ‘OM’ ERROR IF > TOP OF RAM + BHI LAE72 �OM� ERROR IF > TOP OF RAM LAE5A TFR X,D ACCD = TOP OF CLEARED SPACE SUBD ,S++ SUBTRACT OUT AMOUNT OF CLEARED SPACE - BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 + BCS LAE72 �OM� ERROR IF FREE MEM < 0 TFR D,U U = BOTTOM OF CLEARED SPACE SUBD #STKBUF SUBTRACT OUT STACK BUFFER - BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 + BCS LAE72 �OM� ERROR IF FREE MEM < 0 SUBD VARTAB SUBTRACT OUT START OF VARIABLES - BCS LAE72 ‘OM’ ERROR IF FREE MEM < 0 + BCS LAE72 �OM� ERROR IF FREE MEM < 0 STU FRETOP SAVE NEW BOTTOM OF CLEARED SPACE STX MEMSIZ SAVE NEW TOP OF CLEARED SPACE LAE6F JMP LAD26 ERASE ALL VARIABLES, INITIALIZE POINTERS, ETC -LAE72 JMP LAC44 ‘OM’ ERROR +LAE72 JMP LAC44 �OM� ERROR * * RUN RUN JSR GETCCH * GET CURRENT INPUT CHARACTER LBEQ LAD21 * IF NO LINE NUMBER JSR LAD26 ERASE ALL VARIABLES - BRA LAE9F ‘GOTO’ THE RUN ADDRESS + BRA LAE9F �GOTO� THE RUN ADDRESS * * GO GO TFR A,B SAVE INPUT CHARACTER IN ACCB LAE88 JSR GETNCH GET A CHARACTER FROM BASIC - CMPB #TOK_TO ‘TO’ TOKEN + CMPB #TOK_TO �TO� TOKEN BEQ LAEA4 BRANCH IF GOTO - CMPB #TOK_SUB ‘SUB’ TOKEN - BNE LAED7 ‘SYNTAX ERROR’ IF NEITHER + CMPB #TOK_SUB �SUB� TOKEN + BNE LAED7 �SYNTAX ERROR� IF NEITHER LDB #3 =ROOM FOR 6 JSR LAC33 =BYTES ON STACK? LDU CHARAD * SAVE CURRENT BASIC INPUT POINTER, LINE LDX CURLIN * NUMBER AND SUB TOKEN ON STACK LDA #TOK_SUB * PSHS U,X,A * -LAE9F BSR LAEA4 GO DO A ‘GOTO’ - JMP LAD9E JUMP BACK TO BASIC’S MAIN LOOP +LAE9F BSR LAEA4 GO DO A �GOTO� + JMP LAD9E JUMP BACK TO BASIC�S MAIN LOOP * GOTO LAEA4 JSR GETCCH GET CURRENT INPUT CHAR JSR LAF67 GET LINE NUMBER TO BINARY IN BINVAL - BSR LAEEB ADVANCE BASIC’S POINTER TO END OF LINE + BSR LAEEB ADVANCE BASIC�S POINTER TO END OF LINE LEAX $01,X POINT TO START OF NEXT LINE LDD BINVAL GET THE LINE NUMBER TO RUN CMPD CURLIN COMPARE TO CURRENT LINE NUMBER - BHI LAEB6 IF REO’D LINE NUMBER IS > CURRENT LINE NUMBER, -* DON’T START LOOKING FROM + BHI LAEB6 IF REO�D LINE NUMBER IS > CURRENT LINE NUMBER, +* DON�T START LOOKING FROM * START OF PROGRAM LDX TXTTAB BEGINNING OF PROGRAM LAEB6 JSR LAD05 GO FIND A LINE NUMBER - BCS LAED2 ‘UNDEFINED LINE NUMBER’ + BCS LAED2 �UNDEFINED LINE NUMBER� LAEBB LEAX -1,X MOVE BACK TO JUST BEFORE START OF LINE - STX CHARAD RESET BASIC’S INPUT POINTER + STX CHARAD RESET BASIC�S INPUT POINTER LAEBF RTS * * RETURN RETURN BNE LAEBF EXIT ROUTINE IF ARGUMENT GIVEN LDA #$FF * PUT AN ILLEGAL VARIABLE NAME IN FIRST BYTE OF - STA VARDES * VARDES WHICH WILL CAUSE ‘FOR/NEXT’ DATA ON THE + STA VARDES * VARDES WHICH WILL CAUSE �FOR/NEXT� DATA ON THE * STACK TO BE IGNORED JSR LABF9 CHECK FOR RETURN DATA ON THE STACK TFR X,S RESET STACK POINTER - PURGE TWO RETURN ADDRESSES * FROM THE STACK CMPA #TOK_SUB-$80 SUB TOKEN - $80 - BEQ LAEDA BRANCH IF ‘RETURN’ FROM SUBROUTINE - LDB #2*2 ERROR #2 ‘RETURN WITHOUT GOSUB’ + BEQ LAEDA BRANCH IF �RETURN� FROM SUBROUTINE + LDB #2*2 ERROR #2 �RETURN WITHOUT GOSUB� FCB SKP2 SKIP TWO BYTES -LAED2 LDB #7*2 ERROR #7 ‘UNDEFINED LINE NUMBER’ +LAED2 LDB #7*2 ERROR #7 �UNDEFINED LINE NUMBER� JMP LAC46 JUMP TO ERROR HANDLER -LAED7 JMP LB277 ‘SYNTAX ERROR’ +LAED7 JMP LB277 �SYNTAX ERROR� LAEDA PULS A,X,U * RESTORE VALUES OF CURRENT LINE NUMBER AND - STX CURLIN * BASIC’S INPUT POINTER FOR THIS SUBROUTINE + STX CURLIN * BASIC�S INPUT POINTER FOR THIS SUBROUTINE STU CHARAD * AND LOAD ACCA WITH SUB TOKEN ($A6) * * DATA @@ -1202,17 +1221,17 @@ DATA BSR LAEE8 MOVE INPUT POINTER TO END OF SUBLINE OR LINE * REM, ELSE ELSE REM BSR LAEEB MOVE INPUT POINTER TO END OF LINE - STX CHARAD RESET BASIC’S INPUT POINTER + STX CHARAD RESET BASIC�S INPUT POINTER LAEE7 RTS * ADVANCE INPUT POINTER TO END OF SUBLINE OR LINE LAEE8 LDB #': COLON = SUBLINE TERMINATOR CHARACTER LAEEA FCB SKP1LD SKPILD SKIP ONE BYTE; LDA #$5F -* ADVANCE BASIC’S INPUT POINTER TO END OF +* ADVANCE BASIC�S INPUT POINTER TO END OF * LINE - RETURN ADDRESS OF END OF LINE+1 IN X LAEEB CLRB 0 = LINE TERMINATOR CHARACTER STB CHARAC TEMP STORE PRIMARY TERMINATOR CHARACTER CLRB 0 (END OF LINE) = ALTERNATE TERM. CHAR. - LDX CHARAD LOAD X W/BASIC’S INPUT POINTER + LDX CHARAD LOAD X W/BASIC�S INPUT POINTER LAEF1 TFR B,A * CHANGE TERMINATOR CHARACTER LDB CHARAC * FROM ACCB TO CHARAC - SAVE OLD TERMINATOR * IN CHARAC @@ -1231,32 +1250,32 @@ LAEF7 LDA ,X GET NEXT INPUT CHARACTER LAF0C CMPA #TOK_IF+1 TOKEN FOR IF? BNE LAEF7 NO - GET ANOTHER INPUT CHARACTER INC IFCTR INCREMENT IF COUNTER - KEEP TRACK OF HOW MANY -* ‘IF’ STATEMENTS ARE NESTED IN ONE LINE +* �IF� STATEMENTS ARE NESTED IN ONE LINE BRA LAEF7 GET ANOTHER INPUT CHARACTER * IF IF JSR LB141 EVALUATE NUMERIC EXPRESSION JSR GETCCH GET CURRENT INPUT CHARACTER CMPA #TOK_GO TOKEN FOR GO - BEQ LAF22 TREAT ‘GO’ THE SAME AS ‘THEN’ + BEQ LAF22 TREAT �GO� THE SAME AS �THEN� LDB #TOK_THEN TOKEN FOR THEN JSR LB26F DO A SYNTAX CHECK ON ACCB LAF22 LDA FP0EXP CHECK FOR TRUE/FALSE - FALSE IF FPA0 EXPONENT = ZERO BNE LAF39 BRANCH IF CONDITION TRUE CLR IFCTR CLEAR FLAG - KEEP TRACK OF WHICH NESTED ELSE STATEMENT -* TO SEARCH FOR IN NESTED ‘IF’ LOOPS -LAF28 BSR DATA MOVE BASIC’S POINTER TO END OF SUBLINE +* TO SEARCH FOR IN NESTED �IF� LOOPS +LAF28 BSR DATA MOVE BASIC�S POINTER TO END OF SUBLINE TSTA * CHECK TO SEE IF END OF LINE OR SUBLINE BEQ LAEE7 * AND RETURN IF END OF LINE JSR GETNCH GET AN INPUT CHARACTER FROM BASIC CMPA #TOK_ELSE TOKEN FOR ELSE - BNE LAF28 IGNORE ALL DATA EXCEPT ‘ELSE’ UNTIL + BNE LAF28 IGNORE ALL DATA EXCEPT �ELSE� UNTIL * END OF LINE (ZERO BYTE) DEC IFCTR CHECK TO SEE IF YOU MUST SEARCH ANOTHER SUBLINE - BPL LAF28 BRANCH TO SEARCH ANOTHER SUBLINE FOR ‘ELSE’ + BPL LAF28 BRANCH TO SEARCH ANOTHER SUBLINE FOR �ELSE� JSR GETNCH GET AN INPUT CHARACTER FROM BASIC LAF39 JSR GETCCH GET CURRENT INPUT CHARACTER - LBCS LAEA4 BRANCH TO ‘GOTO’ IF NUMERIC CHARACTER + LBCS LAEA4 BRANCH TO �GOTO� IF NUMERIC CHARACTER JMP LADC6 RETURN TO MAIN INTERPRETATION LOOP * ON @@ -1267,12 +1286,12 @@ ON JSR LB70B EVALUATE EXPRESSION CMPA #TOK_SUB TOKEN FOR SUB? BEQ LAF54 YES CMPA #TOK_TO TOKEN FOR TO? -LAF52 BNE LAED7 ‘SYNTAX’ ERROR IF NOT ‘SUB’ OR ‘TO’ +LAF52 BNE LAED7 �SYNTAX� ERROR IF NOT �SUB� OR �TO� LAF54 DEC FPA0+3 DECREMENT IS BYTE OF MANTISSA OF FPA0 - THIS -* IS THE ARGUMENT OF THE ‘ON’ STATEMENT +* IS THE ARGUMENT OF THE �ON� STATEMENT BNE LAF5D BRANCH IF NOT AT THE PROPER GOTO OR GOSUB LINE NUMBER - PULS B GET BACK THE TOKEN FOLLOWING ‘GO’ - JMP LAE88 GO DO A ‘GOTO’ OR ‘GOSUB’ + PULS B GET BACK THE TOKEN FOLLOWING �GO� + JMP LAE88 GO DO A �GOTO� OR �GOSUB� LAF5D JSR GETNCH GET A CHARACTER FROM BASIC BSR LAF67 CONVERT BASIC LINE NUMBER TO BINARY CMPA #', IS CHARACTER FOLLOWING LINE NUMBER A COMMA? @@ -1289,7 +1308,7 @@ LAF6B BCC LAFCE RETURN IF NOT NUMERIC CHARACTER LDD BINVAL GET ACCUMULATED LINE NUMBER VALUE CMPA #24 LARGEST LINE NUMBER IS $F9FF (63999) - * (24*256+255)*10+9 - BHI LAF52 ‘SYNTAX’ ERROR IF TOO BIG + BHI LAF52 �SYNTAX� ERROR IF TOO BIG * MULT ACCD X 10 ASLB * ROLA * TIMES 2 @@ -1310,7 +1329,7 @@ LAF6B BCC LAFCE RETURN IF NOT NUMERIC CHARACTER LET JSR LB357 FIND TARGET VARIABLE DESCRIPTOR STX VARDES SAVE DESCRIPTOR ADDRESS OF 1ST EXPRESSION LDB #TOK_EQUALS TOKEN FOR "=" - JSR LB26F DO A SYNTAX CHECK FOR ‘=‘ + JSR LB26F DO A SYNTAX CHECK FOR �=� LDA VALTYP * GET VARIABLE TYPE AND PSHS A * SAVE ON THE STACK JSR LB156 EVALUATE EXPRESSION @@ -1322,13 +1341,13 @@ LET JSR LB357 FIND TARGET VARIABLE DESCRIPTOR * MOVE A STRING WHOSE DESCRIPTOR IS LOCATED AT * FPA0+2 INTO THE STRING SPACE. TRANSFER THE * DESCRIPTOR ADDRESS TO THE ADDRESS IN VARDES -* DON’T MOVE THE STRING IF IT IS ALREADY IN THE +* DON�T MOVE THE STRING IF IT IS ALREADY IN THE * STRING SPACE. REMOVE DESCRIPTOR FROM STRING * STACK IF IT IS LAST ONE ON THE STACK LAFA4 LDX FPA0+2 POINT X TO DESCRIPTOR OF REPLACEMENT STRING LDD FRETOP LOAD ACCD WITH START OF STRING SPACE CMPD 2,X IS THE STRING IN STRING SPACE? - BCC LAFBE BRANCH IF IT’S NOT IN THE STRING SPACE + BCC LAFBE BRANCH IF IT�S NOT IN THE STRING SPACE CMPX VARTAB COMPARE DESCRIPTOR ADDRESS TO START OF VARIABLES BCS LAFBE BRANCH IF DESCRIPTOR ADDRESS NOT IN VARIABLES LAFB1 LDB ,X GET LENGTH OF REPLACEMENT STRING @@ -1352,21 +1371,21 @@ LAFCF FCC "?REDO" ?REDO MESSAGE LAFD6 LAFDC JMP LAC46 JMP TO ERROR HANDLER LAFDF LDA INPFLG = GET THE INPUT FLAG AND BRANCH - BEQ LAFEA = IF ‘INPUT’ + BEQ LAFEA = IF �INPUT� LDX DATTXT * GET LINE NUMBER WHERE THE ERROR OCCURRED STX CURLIN * AND USE IT AS THE CURRENT LINE NUMBER - JMP LB277 ‘SYNTAX ERROR’ -LAFEA LDX #LAFCF-1 * POINT X TO ‘?REDO’ AND PRINT + JMP LB277 �SYNTAX ERROR� +LAFEA LDX #LAFCF-1 * POINT X TO �?REDO� AND PRINT JSR LB99C * IT ON THE SCREEN LDX TINPTR = GET THE SAVED ABSOLUTE ADDRESS OF STX CHARAD = INPUT POINTER AND RESTORE IT RTS * * INPUT -INPUT LDB #11*2 ‘ID’ ERROR +INPUT LDB #11*2 �ID� ERROR LDX CURLIN GET CURRENT LINE NUMBER LEAX 1,X ADD ONE - BEQ LAFDC ‘ID’ ERROR BRANCH IF DIRECT MODE + BEQ LAFDC �ID� ERROR BRANCH IF DIRECT MODE BSR LB00F GET SOME INPUT DATA - WAS LB002 RTS LB00F CMPA #'" CHECK FOR PROMPT STRING DELIMITER @@ -1375,43 +1394,43 @@ LB00F CMPA #'" CHECK FOR PROMPT STRING DELIMITER LDB #'; * JSR LB26F * DO A SYNTAX CHECK FOR SEMICOLON JSR LB99F PRINT MESSAGE TO CONSOLE OUT -LB01E LDX #LINBUF POINT TO BASIC’S LINE BUFFER +LB01E LDX #LINBUF POINT TO BASIC�S LINE BUFFER CLR ,X CLEAR 1ST BYTE - FLAG TO INDICATE NO DATA * IN LINE BUFFER BSR LB02F INPUT A STRING TO LINE BUFFER LDB #', * INSERT A COMMA AT THE END STB ,X * OF THE LINE INPUT BUFFER BRA LB049 -* FILL BASIC’S LINE INPUT BUFFER CONSOLE IN +* FILL BASIC�S LINE INPUT BUFFER CONSOLE IN LB02F JSR LB9AF SEND A "?" TO CONSOLE OUT - JSR LB9AC SEND A ‘SPACE’ TO CONSOLE OUT + JSR LB9AC SEND A �SPACE� TO CONSOLE OUT LB035 JSR LA390 GO READ IN A BASIC LINE BCC LB03F BRANCH IF ENTER KEY ENDED ENTRY LEAS 4,S PURGE TWO RETURN ADDRESSES OFF THE STACK - JMP LAE11 GO DO A ‘STOP’ IF BREAK KEY ENDED LINE ENTRY -LB03F LDB #2*23 ‘INPUT PAST END OF FILE’ ERROR + JMP LAE11 GO DO A �STOP� IF BREAK KEY ENDED LINE ENTRY +LB03F LDB #2*23 �INPUT PAST END OF FILE� ERROR RTS * * READ -READ LDX DATPTR GET ‘READ’ START ADDRESS +READ LDX DATPTR GET �READ� START ADDRESS FCB SKP1LD SKIP ONE BYTE - LDA #*$4F -LB049 CLRA ‘INPUT’ ENTRY POINT: INPUT FLAG = 0 +LB049 CLRA �INPUT� ENTRY POINT: INPUT FLAG = 0 STA INPFLG SET INPUT FLAG; 0 = INPUT: <> 0 = READ - STX DATTMP SAVE ‘READ’ START ADDRESS/’INPUT’ BUFFER START + STX DATTMP SAVE �READ� START ADDRESS/�INPUT� BUFFER START LB04E JSR LB357 EVALUATE A VARIABLE STX VARDES SAVE DESCRIPTOR ADDRESS - LDX CHARAD * GET BASIC’S INPUT POINTER + LDX CHARAD * GET BASIC�S INPUT POINTER STX BINVAL * AND SAVE IT - LDX DATTMP GET ‘READ’ ADDRESS START/’INPUT’ BUFFER POINTER + LDX DATTMP GET �READ� ADDRESS START/�INPUT� BUFFER POINTER LDA ,X GET A CHARACTER FROM THE BASIC PROGRAM BNE LB069 BRANCH IF NOT END OF LINE LDA INPFLG * CHECK INPUT FLAG AND BRANCH BNE LB0B9 * IF LOOKING FOR DATA (READ) -* NO DATA IN ‘INPUT’ LINE BUFFER AND/OR INPUT +* NO DATA IN �INPUT� LINE BUFFER AND/OR INPUT * NOT COMING FROM SCREEN JSR LB9AF SEND A '?' TO CONSOLE OUT BSR LB02F FILL INPUT BUFFER FROM CONSOLE IN -LB069 STX CHARAD RESET BASIC’S INPUT POINTER +LB069 STX CHARAD RESET BASIC�S INPUT POINTER JSR GETNCH GET A CHARACTER FROM BASIC LDB VALTYP * CHECK VARIABLE TYPE AND BEQ LB098 * BRANCH IF NUMERIC @@ -1450,27 +1469,27 @@ LB0A8 LDX CHARAD * GET CURRENT INPUT BRA LB04E GET ANOTHER INPUT OR READ ITEM * SEARCH FROM ADDRESS IN X FOR * 1ST OCCURENCE OF THE TOKEN FOR DATA -LB0B9 STX CHARAD RESET BASIC’S INPUT POINTER +LB0B9 STX CHARAD RESET BASIC�S INPUT POINTER JSR LAEE8 SEARCH FOR END OF CURRENT LINE OR SUBLINE LEAX 1,X MOVE X ONE PAST END OF LINE TSTA CHECK FOR END OF LINE BNE LB0CD BRANCH IF END OF SUBLINE - LDB #2*3 ‘OUT OF DATA’ ERROR + LDB #2*3 �OUT OF DATA� ERROR LDU ,X++ GET NEXT 2 CHARACTERS - BEQ LB10A ‘OD’ ERROR IF END OF PROGRAM + BEQ LB10A �OD� ERROR IF END OF PROGRAM LDD ,X++ GET BASIC LINE NUMBER AND STD DATTXT SAVE IT IN DATTXT LB0CD LDA ,X GET AN INPUT CHARACTER CMPA #TOK_DATA DATA TOKEN? - BNE LB0B9 NO — KEEP LOOKING + BNE LB0B9 NO � KEEP LOOKING BRA LB069 YES * EXIT READ AND INPUT COMMANDS LB0D5 LDX DATTMP GET DATA POINTER LDB INPFLG * CHECK INPUT FLAG LBNE LADE8 * SAVE NEW DATA POINTER IF READ - LDA ,X = CHECK NEXT CHARACTER IN ‘INPUT’ BUFFER + LDA ,X = CHECK NEXT CHARACTER IN �INPUT� BUFFER BEQ LB0E7 = - LDX #LB0E8-1 POINT X TO ‘?EXTRA IGNORED’ + LDX #LB0E8-1 POINT X TO �?EXTRA IGNORED� JMP LB99C PRINT THE MESSAGE LB0E7 RTS @@ -1485,11 +1504,11 @@ NEXT BNE LB0FE BRANCH IF ARGUMENT GIVEN BRA LB101 LB0FE JSR LB357 EVALUATE AN ALPHA EXPRESSION LB101 STX VARDES SAVE VARIABLE DESCRIPTOR POINTER - JSR LABF9 GO SCAN FOR ‘FOR/NEXT’ DATA ON STACK + JSR LABF9 GO SCAN FOR �FOR/NEXT� DATA ON STACK BEQ LB10C BRANCH IF DATA FOUND - LDB #0 ‘NEXT WITHOUT FOR’ ERROR (SHOULD BE CLRB) + LDB #0 �NEXT WITHOUT FOR� ERROR (SHOULD BE CLRB) LB10A BRA LB153 PROCESS ERROR -LB10C TFR X,S POINT S TO START OF ‘FOR/NEXT’ DATA +LB10C TFR X,S POINT S TO START OF �FOR/NEXT� DATA LEAX 3,X POINT X TO FP VALUE OF STEP JSR LBC14 COPY A FP NUMBER FROM (X) TO FPA0 LDA 8,S GET THE DIRECTION OF STEP @@ -1503,18 +1522,18 @@ LB10C TFR X,S POINT S TO START OF SUBB 8,S ACCB = 0 IF TERMINAL VALUE=CURRENT VALUE AND STEP=0 OR IF * STEP IS POSITIVE AND CURRENT VALUE>TERMINAL VALUE OR * STEP IS NEGATIVE AND CURRENT VALUE BCS LB181 BRANCH IF LESS THAN RELATIONAL OPERATORS CMPA #3 * BCC LB181 * BRANCH IF GREATER THAN RELATIONAL OPERATORS - CMPA #1 SET CARRY IF ‘>‘ + CMPA #1 SET CARRY IF �>� ROLA CARRY TO BIT 0 EORA TRELFL * CARRY SET IF CMPA TRELFL * TRELFL = ACCA @@ -1566,7 +1585,7 @@ LB181 LDB TRELFL GET RELATIONAL OPERATOR FLAG ADDA #7 SEVEN ARITHMETIC/LOGICAL OPERATORS BCC LB1F4 BRANCH IF NOT ARITHMETIC/LOGICAL OPERATOR ADCA VALTYP ADD CARRY, NUMERIC FLAG AND MODIFIED TOKEN NUMBER - LBEQ LB60F BRANCH IF VALTYP = FF, AND ACCA = ‘+‘ TOKEN - + LBEQ LB60F BRANCH IF VALTYP = FF, AND ACCA = �+� TOKEN - * CONCATENATE TWO STRINGS ADCA #-1 RESTORE ARITHMETIC/LOGICAL OPERATOR NUMBER PSHS A * STORE OPERATOR NUMBER ON STACK; MULTIPLY IT BY 2 @@ -1577,7 +1596,7 @@ LB181 LDB TRELFL GET RELATIONAL OPERATOR FLAG LB19F PULS A GET PRECEDENCE FLAG FROM STACK CMPA ,X COMPARE TO CURRENT OPERATOR BCC LB1FA BRANCH IF STACK OPERATOR > CURRENT OPERATOR - BSR LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING + BSR LB143 �TM� ERROR IF VARIABLE TYPE = STRING * OPERATION BEING PROCESSED IS OF HIGHER PRECEDENCE THAN THE PREVIOUS OPERATION. LB1A7 PSHS A SAVE PRECEDENCE FLAG @@ -1598,7 +1617,7 @@ LB1B8 ASL VALTYP BIT 7 OF TYPE FLAG TO CARRY CLR VALTYP SET VARIABLE TYPE TO NUMERIC BRA LB19F PERFORM OPERATION OR SAVE ON STACK -LB1C6 LDX CHARAD * GET BASIC’S INPUT POINTER AND +LB1C6 LDX CHARAD * GET BASIC�S INPUT POINTER AND JMP LAEBB * MOVE IT BACK ONE * RELATIONAL COMPARISON JUMP TABLE LB1CB FCB $64 RELATIONAL COMPARISON FLAG @@ -1615,7 +1634,7 @@ LB1D4 LDD 1,X GET ADDRESS OF OPERATOR ROUTINE BSR LB1E2 PUSH FPA0 ONTO STACK LDB TRELFL GET BACK RELATIONAL OPERATOR FLAG LBRA LB15A EVALUATE ANOTHER EXPRESSION -LB1DF JMP LB277 ‘SYNTAX ERROR’ +LB1DF JMP LB277 �SYNTAX ERROR� * PUSH FPA0 ONTO THE STACK. ,S = EXPONENT * 1-2,S =HIGH ORDER MANTISSA 3-4,S = LOW ORDER MANTISSA * 5,S = SIGN RETURN WITH PRECEDENCE CODE IN ACCA @@ -1629,17 +1648,17 @@ LB1EA LDB FP0EXP * PUSH FPA0 ONTO THE STACK PSHS U,X,B * JMP ,Y JUMP TO ADDRESS IN Y -* BRANCH HERE IF NON-OPERATOR CHARACTER FOUND - USUALLY ‘)‘ OR END OF LINE +* BRANCH HERE IF NON-OPERATOR CHARACTER FOUND - USUALLY �)� OR END OF LINE LB1F4 LDX ZERO POINT X TO DUMMY VALUE (ZERO) LDA ,S+ GET PRECEDENCE FLAG FROM STACK BEQ LB220 BRANCH IF END OF EXPRESSION LB1FA CMPA #$64 * CHECK FOR RELATIONAL COMPARISON FLAG BEQ LB201 * AND BRANCH IF RELATIONAL COMPARISON - JSR LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING + JSR LB143 �TM� ERROR IF VARIABLE TYPE = STRING LB201 STX RELPTR SAVE POINTER TO OPERATOR ROUTINE LB203 PULS B GET RELATIONAL OPERATOR FLAG FROM STACK - CMPA #$5A CHECK FOR ‘NOT’ OPERATOR - BEQ LB222 RETURN IF ‘NOT’ - NO RELATIONAL COMPARISON + CMPA #$5A CHECK FOR �NOT� OPERATOR + BEQ LB222 RETURN IF �NOT� - NO RELATIONAL COMPARISON CMPA #$7D CHECK FOR NEGATION (UNARY) FLAG BEQ LB222 RETURN IF NEGATION - NO RELATIONAL COMPARISON @@ -1669,7 +1688,7 @@ LB22C JMP LBD12 CONVERT ASCII STRING TO FLOATING POINT - * PROCESS A NON NUMERIC FIRST CHARACTER LB22F JSR LB3A2 SET CARRY IF NOT ALPHA BCC LB284 BRANCH IF ALPHA CHARACTER - CMPA #'. IS IT ‘.‘ (DECIMAL POINT)? + CMPA #'. IS IT �.� (DECIMAL POINT)? BEQ LB22C CONVERT ASCII STRING TO FLOATING POINT CMPA #TOK_MINUS MINUS TOKEN BEQ LB27C YES - GO PROCESS THE MINUS OPERATOR @@ -1680,25 +1699,25 @@ LB22F JSR LB3A2 SET CARRY IF NOT ALPHA LB244 LDX CHARAD CURRENT BASIC POINTER TO X JSR LB518 SAVE STRING ON STRING STACK LB249 LDX COEFPT * GET ADDRESS OF END OF STRING AND - STX CHARAD * PUT BASIC’S INPUT POINTER THERE + STX CHARAD * PUT BASIC�S INPUT POINTER THERE RTS LB24E CMPA #TOK_NOT NOT TOKEN? BNE LB25F NO * PROCESS THE NOT OPERATOR - LDA #$5A ‘NOT’ PRECEDENCE FLAG - JSR LB15A PROCESS OPERATION FOLLOWING ‘NOT’ + LDA #$5A �NOT� PRECEDENCE FLAG + JSR LB15A PROCESS OPERATION FOLLOWING �NOT� JSR INTCNV CONVERT FPA0 TO INTEGER IN ACCD - COMA * ‘NOT’ THE INTEGER + COMA * �NOT� THE INTEGER COMB * JMP GIVABF CONVERT ACCD TO FLOATING POINT (FPA0) LB25F INCA CHECK FOR TOKENS PRECEEDED BY $FF BEQ LB290 IT WAS PRECEEDED BY $FF -LB262 BSR LB26A SYNTAX CHECK FOR A ‘(‘ +LB262 BSR LB26A SYNTAX CHECK FOR A �(� JSR LB156 EVALUATE EXPRESSIONS WITHIN PARENTHESES AT * HIGHEST PRECEDENCE -LB267 LDB #') SYNTAX CHECK FOR ‘)‘ +LB267 LDB #') SYNTAX CHECK FOR �)� FCB SKP2 SKIP 2 BYTES -LB26A LDB #'( SYNTAX CHECK FOR ‘(‘ +LB26A LDB #'( SYNTAX CHECK FOR �(� FCB SKP2 SKIP 2 BYTES LB26D LDB #', SYNTAX CHECK FOR COMMA LB26F CMPB [CHARAD] * COMPARE ACCB TO CURRENT INPUT @@ -1709,7 +1728,7 @@ LB277 LDB #2*1 SYNTAX ERROR * PROCESS THE MINUS (UNARY) OPERATOR LB27C LDA #$7D MINUS (UNARY) PRECEDENCE FLAG - JSR LB15A PROCESS OPERATION FOLLOWING ‘UNARY’ NEGATION + JSR LB15A PROCESS OPERATION FOLLOWING �UNARY� NEGATION JMP LBEE9 CHANGE SIGN OF FPA0 MANTISSA * EVALUATE ALPHA EXPRESSION @@ -1732,12 +1751,12 @@ LB29F PSHS B SAVE TOKEN OFFSET ON STACK BCS LB2C7 DO SECONDARIES STRING$ OR LESS CMPB #TOK_INKEY-$80*2 * BCC LB2C9 * DO SECONDARIES $92 (INKEY$) OR > - BSR LB26A SYNTAX CHECK FOR A ‘(‘ + BSR LB26A SYNTAX CHECK FOR A �(� LDA ,S GET TOKEN NUMBER * DO SECONDARIES (LEFT$, RIGHT$, MID$) JSR LB156 EVALUATE FIRST STRING IN ARGUMENT BSR LB26D SYNTAX CHECK FOR A COMMA - JSR LB146 ‘TM’ ERROR IF NUMERIC VARiABLE + JSR LB146 �TM� ERROR IF NUMERIC VARiABLE PULS A GET TOKEN OFFSET FROM STACK LDU FPA0+2 POINT U TO STRING DESCRIPTOR PSHS U,A SAVE TOKEN OFFSET AND DESCRIPTOR ADDRESS @@ -1745,19 +1764,19 @@ LB29F PSHS B SAVE TOKEN OFFSET ON STACK PULS A GET TOKEN OFFSET FROM STACK PSHS B,A SAVE TOKEN OFFSET AND NUMERIC ARGUMENT FCB $8E OP CODE OF LDX# - SKlP 2 BYTES -LB2C7 BSR LB262 SYNTAX CHECK FOR A ‘(‘ +LB2C7 BSR LB262 SYNTAX CHECK FOR A �(� LB2C9 PULS B GET TOKEN OFFSET LDX COMVEC+8 GET SECONDARY FUNCTION JUMP TABLE ADDRESS LB2CE ABX ADD IN COMMAND OFFSET * * HERE IS WHERE WE BRANCH TO A SECONDARY FUNCTION JSR [,X] GO DO AN SECONDARY FUNCTION - JMP LB143 ‘TM’ ERROR IF VARIABLE TYPE = STRING + JMP LB143 �TM� ERROR IF VARIABLE TYPE = STRING -* LOGICAL OPERATOR ‘OR’ JUMPS HERE -LB2D4 FCB SKP1LD SKIP ONE BYTE - ‘OR’ FLAG = $4F +* LOGICAL OPERATOR �OR� JUMPS HERE +LB2D4 FCB SKP1LD SKIP ONE BYTE - �OR� FLAG = $4F -* LOGICAL OPERATOR ‘AND’ JUMPS HERE +* LOGICAL OPERATOR �AND� JUMPS HERE LB2D5 CLRA AND FLAG = 0 STA TMPLOC AND/OR FLAG JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD @@ -1766,17 +1785,17 @@ LB2D5 CLRA AND FLAG = 0 JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD TST TMPLOC CHECK AND/OR FLAG BNE LB2ED BRANCH IF OR - ANDA CHARAC * ‘AND’ ACCD WITH FPA0 INTEGER + ANDA CHARAC * �AND� ACCD WITH FPA0 INTEGER ANDB ENDCHR * STORED IN ENDCHR BRA LB2F1 CONVERT TO FP -LB2ED ORA CHARAC * ‘OR’ ACCD WITH FPA0 INTEGER +LB2ED ORA CHARAC * �OR� ACCD WITH FPA0 INTEGER ORB ENDCHR * STORED IN CHARAC LB2F1 JMP GIVABF CONVERT THE VALUE IN ACCD INTO A FP NUMBER * RELATIONAL COMPARISON PROCESS HANDLER -LB2F4 JSR LB148 ‘TM’ ERROR IF TYPE MISMATCH +LB2F4 JSR LB148 �TM� ERROR IF TYPE MISMATCH BNE LB309 BRANCH IF STRING VARIABLE - LDA FP1SGN * ‘PACK’ THE MANTISSA + LDA FP1SGN * �PACK� THE MANTISSA ORA #$7F * SIGN OF FPA1 INTO ANDA FPA1 * BIT 7 OF THE STA FPA1 * MANTISSA MS BYTE @@ -1819,8 +1838,8 @@ LB334 LDA ,X+ GET A BYTE FROM STRING A * DETERMINE TRUTH OF COMPARISON - RETURN RESULT IN FPA0 LB33F ADDB #1 CONVERT $FF,0,1 TO 0,1,2 - ROLB NOW IT’S 1,2,4 FOR > = < - ANDB RELFLG ‘AND’ THE ACTUAL COMPARISON WITH THE DESIRED - + ROLB NOW IT�S 1,2,4 FOR > = < + ANDB RELFLG �AND� THE ACTUAL COMPARISON WITH THE DESIRED - COMPARISON BEQ LB348 BRANCH IF FALSE (NO MATCHING BITS) LDB #$FF TRUE FLAG @@ -1875,7 +1894,7 @@ LB37B CMPA #'$ CHECK FOR A STRING VARIABLE JSR GETNCH GET AN INPUT CHARACTER LB385 STB VARNAM+1 SAVE 2ND CHARACTER IN VARNAM+1 ORA ARYDIS OR IN THE ARRAY DISABLE FLAG - IF = $80, -* DON’T SEARCH FOR VARIABLES IN THE ARRAYS +* DON�T SEARCH FOR VARIABLES IN THE ARRAYS SUBA #'( IS THIS AN ARRAY VARIABLE? LBEQ LB404 BRANCH IF IT IS CLR ARYDIS RESET THE ARRAY DISABLE FLAG @@ -1889,7 +1908,7 @@ LB395 CMPX ARYTAB COMPARE X TO THE END OF VARIABLES BRA LB395 = KEEP LOOKING * SET CARRY IF NOT UPPER CASE ALPHA -LB3A2 CMPA #'A * CARRY SET IF < ‘A’ +LB3A2 CMPA #'A * CARRY SET IF < �A� BCS LB3AA * SUBA #'Z+1 = * SUBA #-('Z+1) = CARRY CLEAR IF <= 'Z' @@ -1898,7 +1917,7 @@ LB3AA RTS * PUT A NEW VARIABLE IN TABLE OF VARIABLES LB3AB LDX #ZERO POINT X TO ZERO LOCATION LDU ,S GET CURRENT RETURN ADDRESS - CMPU #LB287 DID WE COME FROM ‘EVALUATE ALPHA EXPR’? + CMPU #LB287 DID WE COME FROM �EVALUATE ALPHA EXPR�? BEQ LB3DE YES - RETURN A ZERO VALUE LDD ARYEND * GET END OF ARRAYS ADDRESS AND STD V43 * SAVE IT AT V43 @@ -1929,16 +1948,16 @@ LB3DF FCB $90,$80,$00,$00,$00 * FLOATING POINT -32768 LB3E4 JSR GETNCH GET AN INPUT CHARACTER FROM BASIC LB3E6 JSR LB141 GO EVALUATE NUMERIC EXPRESSION LB3E9 LDA FP0SGN GET FPA0 MANTISSA SIGN - BMI LB44A ‘FC’ ERROR IF NEGATIVE NUMBER + BMI LB44A �FC� ERROR IF NEGATIVE NUMBER -INTCNV JSR LB143 ‘TM’ ERROR IF STRING VARIABLE +INTCNV JSR LB143 �TM� ERROR IF STRING VARIABLE LDA FP0EXP GET FPA0 EXPONENT CMPA #$90 * COMPARE TO 32768 - LARGEST INTEGER EXPONENT AND BCS LB3FE * BRANCH IF FPA0 < 32768 LDX #LB3DF POINT X TO FP VALUE OF -32768 JSR LBC96 COMPARE -32768 TO FPA0 - BNE LB44A ‘FC’ ERROR IF NOT = + BNE LB44A �FC� ERROR IF NOT = LB3FE JSR LBCC8 CONVERT FPA0 TO A TWO BYTE INTEGER LDD FPA0+2 GET THE INTEGER RTS @@ -1960,7 +1979,7 @@ LB40A LDX VARNAM GET VARIABLE NAME CMPA #', CHECK FOR ANOTHER DIMENSION BEQ LB40A BRANCH IF MORE STB TMPLOC SAVE DIMENSION COUNTER - JSR LB267 SYNTAX CHECK FOR A ‘)‘ + JSR LB267 SYNTAX CHECK FOR A �)� PULS A,B * RESTORE VARIABLE TYPE AND ARRAY STD DIMFLG * FLAG - LEAVE DIMENSION LENGTH ON STACK LDX ARYTAB GET START OF ARRAYS @@ -1972,25 +1991,25 @@ LB42A CMPX ARYEND COMPARE TO END OF ARRAYS LDD 2,X GET OFFSET TO NEXT ARRAY VARIABLE LEAX D,X ADD TO CURRENT POINTER BRA LB42A KEEP SEARCHING -LB43B LDB #2*9 ‘REDIMENSIONED ARRAY’ ERROR +LB43B LDB #2*9 �REDIMENSIONED ARRAY� ERROR LDA DIMFLG * TEST ARRAY FLAG - IF <>0 YOU ARE TRYING BNE LB44C * TO REDIMENSION AN ARRAY LDB TMPLOC GET NUMBER OF DIMENSIONS IN ARRAY CMPB 4,X COMPARE TO THIS ARRAYS DIMENSIONS BEQ LB4A0 BRANCH IF = -LB447 LDB #8*2 ‘BAD SUBSCRIPT’ +LB447 LDB #8*2 �BAD SUBSCRIPT� FCB SKP2 SKIP TWO BYTES -LB44A LDB #4*2 ‘ILLEGAL FUNCTION CALL’ +LB44A LDB #4*2 �ILLEGAL FUNCTION CALL� LB44C JMP LAC46 JUMP TO ERROR SERVICING ROUTINE * INSERT A NEW ARRAY INTO ARRAY VARIABLES * EACH SET OF ARRAY VARIABLES IS PRECEEDED BY A DE- * SCRIPTOR BLOCK COMPOSED OF 5+2*N BYTES WHERE N IS THE * NUMBER OF DIMENSIONS IN THE ARRAY. THE BLOCK IS DEFINED -* AS FOLLOWS: BYTES 0,1:VARIABLE’S NAME; 2,3:TOTAL LENGTH +* AS FOLLOWS: BYTES 0,1:VARIABLE�S NAME; 2,3:TOTAL LENGTH * OF ARRAY ITEMS AND DESCRIPTOR BLOCK; 4:NUMBER OF DIMEN- * ISIONS; 5,6:LENGTH OF DIMENSION 1; 7,8:LENGTH OF DIMEN- -* SION 2;… 4+N,5+N:LENGTH OF DIMENSION N. +* SION 2;� 4+N,5+N:LENGTH OF DIMENSION N. LB44F LDD #5 * 5 BYTES/ARRAY ENTRY SAVE AT COEFPT STD COEFPT * @@ -2015,7 +2034,7 @@ LB46D STD 5,X SAVE LENGTH OF ARRAY DIMENSION BNE LB461 * NOT DONE WITH ALL DIMENSIONS STX TEMPTR SAVE ADDRESS OF (END OF ARRAY DESCRIPTOR - 5) ADDD TEMPTR ADD TOTAL SIZE OF NEW ARRAY - LBCS LAC44 ‘OM’ ERROR IF > $FFFF + LBCS LAC44 �OM� ERROR IF > $FFFF TFR D,X SAVE END OF ARRAY IN X JSR LAC37 MAKE SURE THERE IS ENOUGH FREE RAM FOR ARRAY SUBD #STKBUF-5 SUBTRACT OUT THE (STACK BUFFER - 5) @@ -2039,8 +2058,8 @@ LB4A0 LDB 4,X GET THE NUMBER OF DIMENSIONS LB4A6 STD COEFPT SAVE ACCUMULATED POINTER PULS A,B * PULL DIMENSION ARGUMENT OFF THE STD FPA0+2 * STACK AND SAVE IT - CMPD 5,X COMPARE TO STORED ‘DIM’ ARGUMENT - BCC LB4EB ‘BS’ ERROR IF > = "DIM" ARGUMENT + CMPD 5,X COMPARE TO STORED �DIM� ARGUMENT + BCC LB4EB �BS� ERROR IF > = "DIM" ARGUMENT LDU COEFPT * GET ACCUMULATED POINTER AND BEQ LB4B9 * BRANCH IF 1ST DIMENSION BSR LB4CE = MULTIPLY ACCUMULATED POINTER AND DIMENSION @@ -2128,10 +2147,10 @@ LB526 INCB INCREMENT CHARACTER COUNTER BEQ LB537 BRANCH IF END OF LINE CMPA CHARAC * CHECK FOR TERMINATORS BEQ LB533 * IN CHARAC AND ENDCHR - CMPA ENDCHR * DON’T MOVE POINTER BACK + CMPA ENDCHR * DON�T MOVE POINTER BACK BNE LB526 * ONE IF TERMINATOR IS "MATCHED" LB533 CMPA #'" = COMPARE CHARACTER TO STRING DELIMITER - BEQ LB539 = & DON’T MOVE POINTER BACK IF SO + BEQ LB539 = & DON�T MOVE POINTER BACK IF SO LB537 LEAX -1,X MOVE POINTER BACK ONE LB539 STX COEFPT SAVE END OF STRING ADDRESS STB STRDES SAVE STRING LENGTH IN TEMP DESCRIPTOR @@ -2350,7 +2369,7 @@ LB68F LDB #1 * RESERVE ONE BYTE IN JSR LB56D * THE STRING SPACE LDA FPA0+3 GET ASCII STRING VALUE JSR LB511 SAVE RESERVED STRING DESCRIPTOR IN TEMP DESCRIPTOR - STA ,X SAVE THE STRING (IT’S ONLY ONE BYTE) + STA ,X SAVE THE STRING (IT�S ONLY ONE BYTE) LB69B LEAS 2,S PURGE THE RETURN ADDRESS OFF OF THE STACK LB69D JMP LB54C PUT TEMP DESCRIPTOR DATA ONTO STRING STACK @@ -2502,7 +2521,7 @@ LB78D JSR LB95C MOVE CURSOR TO START OF A NEW LINE LDD ,X GET ADDRESS OF NEXT BASIC LINE BNE LB79F BRANCH IF NOT END OF PROGRAM LB797 - JMP LAC73 RETURN TO BASIC’S MAIN INPUT LOOP + JMP LAC73 RETURN TO BASIC�S MAIN INPUT LOOP LB79F STX LSTTXT SAVE NEW STARTING LINE ADDRESS LDD 2,X * GET THE LINE NUMBER OF THIS LINE AND CMPD BINVAL * COMPARE IT TO ENDING LINE NUMBER @@ -2518,19 +2537,19 @@ LB7B9 LDA ,U+ GET A BYTE FROM THE BUFFER JSR LB9B1 SEND CHARACTER TO CONSOLE OUT BRA LB7B9 GET ANOTHER CHARACTER -* UNCRUNCH A LINE INTO BASIC’S LINE INPUT BUFFER +* UNCRUNCH A LINE INTO BASIC�S LINE INPUT BUFFER LB7C2 LEAX 4,X MOVE POINTER PAST ADDRESS OF NEXT LINE AND LINE NUMBER LDY #LINBUF+1 UNCRUNCH LINE INTO LINE INPUT BUFFER LB7CB LDA ,X+ GET A CHARACTER BEQ LB820 BRANCH IF END OF LINE - BMI LB7E6 BRANCH IF IT’S A TOKEN + BMI LB7E6 BRANCH IF IT�S A TOKEN CMPA #': CHECK FOR END OF SUB LINE BNE LB7E2 BRNCH IF NOT END OF SUB LINE LDB ,X GET CHARACTER FOLLOWING COLON CMPB #TOK_ELSE TOKEN FOR ELSE? - BEQ LB7CB YES - DON’T PUT IT IN BUFFER + BEQ LB7CB YES - DON�T PUT IT IN BUFFER CMPB #TOK_SNGL_Q TOKEN FOR REMARK? - BEQ LB7CB YES - DON’T PUT IT IN BUFFER + BEQ LB7CB YES - DON�T PUT IT IN BUFFER FCB SKP2 SKIP TWO BYTES LB7E0 LDA #'! EXCLAMATION POINT LB7E2 BSR LB814 PUT CHARACTER IN BUFFER @@ -2581,7 +2600,7 @@ LB82D LDA ,X+ GET INPUT CHAR BEQ LB844 * PROCESSING AN ILLEGAL TOKEN JSR LB3A2 SET CARRY IF NOT UPPER CASE ALPHA BCC LB852 BRANCH IF UPPER CASE ALPHA - CMPA #'0 * DON’T CRUNCH ASCII NUMERIC CHARACTERS + CMPA #'0 * DON�T CRUNCH ASCII NUMERIC CHARACTERS BLO LB842 * BRANCH IF NOT NUMERIC CMPA #'9 * BLS LB852 * BRANCH IF NUMERIC @@ -2619,7 +2638,7 @@ LB87E LDA ,X+ SCAN TILL WE MATCH [V42] BEQ LB852 BRANCH IF END OF LINE CMPA V42 DELIMITER? BEQ LB852 BRANCH OUT IF SO -LB886 STA ,U+ DON’T CRUNCH REMARKS OR STRINGS +LB886 STA ,U+ DON�T CRUNCH REMARKS OR STRINGS BRA LB87E GO GET MORE STRING OR REMARK LB88A CMPA #'0 * LESS THAN ASCII ZERO? BCS LB892 * BRANCH IF SO @@ -3402,7 +3421,7 @@ LBDC5 LDX #LABE8-1 POINT X TO " IN " MESSAGE * CONVERT VALUE IN ACCD INTO A DECIMAL NUMBER * AND PRINT IT TO CONSOLE OUT LBDCC STD FPA0 SAVE ACCD IN TOP HALF OF FPA0 - LDB #$90 REQ’D EXPONENT IF TOP HALF OF ACCD = INTEGER + LDB #$90 REQ�D EXPONENT IF TOP HALF OF ACCD = INTEGER COMA SET CARRY FLAG - FORCE POSITIVE MANTISSA JSR LBC86 ZERO BOTTOM HALF AND SIGN OF FPA0, THEN * SAVE EXPONENT AND NORMALIZE IT @@ -3451,7 +3470,7 @@ LBE1F JSR LB9B4 ADD .5 TO FPA0 (ROUND OFF) JSR LBCC8 CONVERT FPA0 TO AN INTEGER LDB #1 DEFAULT DECIMAL POINT FLAG (FORCE IMMED DECIMAL PT) LDA V45 * GET BASE 10 EXPONENT AND ADD TEN TO IT - ADDA #9+1 * (NUMBER ‘NORMALIZED’ TO 9 PLACES & DECIMAL PT) + ADDA #9+1 * (NUMBER �NORMALIZED� TO 9 PLACES & DECIMAL PT) BMI LBE36 BRANCH IF NUMBER < 1.0 CMPA #9+2 NINE PLACES MAY BE DISPLAYED WITHOUT * USING SCIENTIFIC NOTATION @@ -3498,7 +3517,7 @@ LBE50 LDA FPA0+3 * ADD MANTISSA LS ROLB *SET OVERFLOW FLAG AND BRANCH IF CARRY = 1 AND BVC LBE50 *POSITIVE MANTISSA OR CARRY = 0 AND NEG MANTISSA BCC LBE72 BRANCH IF NEGATIVE MANTISSA - SUBB #10+1 * TAKE THE 9’S COMPLEMENT IF + SUBB #10+1 * TAKE THE 9�S COMPLEMENT IF NEGB * ADDING MANTISSA LBE72 ADDB #'0-1 ADD ASCII OFFSET TO DIGIT LEAX 4,X MOVE TO NEXT POWER OF 10 MANTISSA @@ -3527,14 +3546,14 @@ LBE98 LDA #'+ ASCII PLUS SIGN LDA #'- ASCII MINUS SIGN NEGB NEGATE EXPONENT IF NEGATIVE LBEA3 STA 2,U STORE EXPONENT SIGN IN STRING - LDA #'E * GET ASCII ‘E’ (SCIENTIFIC NOTATION + LDA #'E * GET ASCII �E� (SCIENTIFIC NOTATION STA 1,U * FLAG) AND SAVE IT IN THE STRING LDA #'0-1 INITIALIZE ACCA TO ASCII ZERO -LBEAB INCA ADD ONE TO 10’S DIGIT OF EXPONENT +LBEAB INCA ADD ONE TO 10�S DIGIT OF EXPONENT SUBB #10 SUBTRACT 10 FROM ACCB - BCC LBEAB ADD 1 TO 10’S DIGIT IF NO CARRY + BCC LBEAB ADD 1 TO 10�S DIGIT IF NO CARRY ADDB #'9+1 CONVERT UNITS DIGIT TO ASCII STD 3,U SAVE EXPONENT IN STRING CLR 5,U CLEAR LAST BYTE (TERMINATOR) @@ -3580,7 +3599,7 @@ LBEFC JMP LBACA MULTIPLY (X) BY FPA0 * NUMBER OF (COEFFICIENTS-1) FOLLOWED BY THAT NUMBER * OF PACKED FLOATING POINT NUMBERS. THE * POLYNOMIAL IS EVALUATED AS FOLLOWS: VALUE = -* (((FPA0*Y0+Y1)*FPA0+Y2)*FPA0…YN) +* (((FPA0*Y0+Y1)*FPA0+Y2)*FPA0�YN) LBEFF STX COEFPT SAVE COEFFICIENT TABLE POINTER LBF01 JSR LBC2A MOVE FPA0 TO FPA4 LDX COEFPT GET THE COEFFICIENT POINTER @@ -3711,7 +3730,7 @@ TAN JSR LBC2F PACK FPA0 AND MOVE IT TO FPA3 LDA RELFLG GET THE QUADRANT FLAG - COS NEGATIVE IN QUADS 2,3 BSR L83A6 CALCULATE VALUE OF COS(FPA0) TST FP0EXP CHECK EXPONENT OF FPA0 - LBEQ LBA92 ‘OV’ ERROR IF COS(X)=0 + LBEQ LBA92 �OV� ERROR IF COS(X)=0 LDX #V4A POINT X TO FPA5 L83A3 JMP LBB8F DIVIDE (X) BY FPA0 - SIN(X)/COS(X) L83A6 PSHS A SAVE SIGN FLAG ON STACK @@ -3792,7 +3811,7 @@ L8441 FCB $80,$31,$72,$17,$F8 LN(2) * THE TERMS OF THE LATTER EXPRESSION ARE CONSTANTS EXCEPT FOR THE * LN(A*SQR(2)) TERM WHICH IS EVALUATED USING THE TAYLOR SERIES EXPANSION LOG JSR LBC6D CHECK STATUS OF FPA0 - LBLE LB44A ‘FC’ ERROR IF NEGATIVE OR ZERO + LBLE LB44A �FC� ERROR IF NEGATIVE OR ZERO LDX #L8432 POINT (X) TO FP NUMBER (1/SQR(2)) LDA FP0EXP *GET EXPONENT OF ARGUMENT SUBA #$80 *SUBTRACT OFF THE BIAS AND @@ -3827,7 +3846,7 @@ L8489 BEQ EXP DO A NATURAL EXPONENTIATION IF EXPONENT = 0 BNE L8491 *AND BRANCH IF IT IS <> 0 JMP LBA3A FPA0=0 IF RAISING ZERO TO A POWER L8491 LDX #V4A * PACK FPA0 AND SAVE - JSR LBC35 * IT IN FPA5 (ARGUMENT’S EXPONENT) + JSR LBC35 * IT IN FPA5 (ARGUMENT�S EXPONENT) CLRB ACCB=DEFAULT RESULT SIGN FLAG; 0=POSITIVE LDA FP1SGN *CHECK THE SIGN OF ARGUMENT BPL L84AC *BRANCH IF POSITIVE @@ -3878,11 +3897,11 @@ EXP LDX #L84C4 POINT X TO THE CORRECTION FACTOR LDA FP0EXP *GET EXPONENT OF FPA0 AND CMPA #$88 *COMPARE TO THE MAXIMUM VALUE BLO L8504 BRANCH IF FPA0 < 128 -L8501 JMP LBB5C SET FPA0 = 0 OR ‘OV’ ERROR +L8501 JMP LBB5C SET FPA0 = 0 OR �OV� ERROR L8504 JSR INT CONVERT FPA0 TO INTEGER LDA CHARAC GET LS BYTE OF INTEGER ADDA #$81 * WAS THE ARGUMENT =127, IF SO - BEQ L8501 * THEN ‘OV’ ERROR; THIS WILL ALSO ADD THE $80 BIAS + BEQ L8501 * THEN �OV� ERROR; THIS WILL ALSO ADD THE $80 BIAS * * REQUIRED WHEN THE NEW EXPONENT IS CALCULATED BELOW DECA DECREMENT ONE FROM THE EXPONENT, BECAUSE $81, NOT $80 WAS USED ABOVE PSHS A SAVE EXPONENT OF INTEGER PORTION ON STACK @@ -3907,10 +3926,10 @@ L852C COM FP0SGN TOGGLE SIGN OF FPA0 MANTISSA * EDIT EDIT JSR L89AE GET LINE NUMBER FROM BASIC LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK -L8538 LDA #$01 ‘LIST’ FLAG +L8538 LDA #$01 �LIST� FLAG STA VD8 SET FLAG TO LIST LINE JSR LAD01 GO FIND THE LINE NUMBER IN PROGRAM - LBCS LAED2 ERROR #7 ‘UNDEFINED LINE #' + LBCS LAED2 ERROR #7 �UNDEFINED LINE #' JSR LB7C2 GO UNCRUNCH LINE INTO BUFFER AT LINBUF+1 TFR Y,D PUT ABSOLUTE ADDRESS OF END OF LINE TO ACCD SUBD #LINBUF+2 SUBTRACT OUT THE START OF LINE @@ -3932,7 +3951,7 @@ L855D JSR L8687 GET KEY STROKE ADDB ,S+ ADD DIGIT TO ACCUMULATED VALUE BRA L855D CHECK FOR ANOTHER DIGIT L8570 SUBB #$01 * REPEAT PARAMETER IN ACCB; IF IT - ADCB #$01 *IS 0, THEN MAKE IT ‘1’ + ADCB #$01 *IS 0, THEN MAKE IT �1� CMPA #'A' ABORT? BNE L857D NO JSR LB958 PRINT CARRIAGE RETURN TO SCREEN @@ -3940,7 +3959,7 @@ L8570 SUBB #$01 * REPEAT PARAMETER IN ACCB; IF IT L857D CMPA #'L' LIST? BNE L858C NO L8581 BSR L85B4 LIST THE LINE - CLR VD8 RESET THE LIST FLAG TO ‘NO LIST’ + CLR VD8 RESET THE LIST FLAG TO �NO LIST� JSR LB958 PRINT CARRIAGE RETURN BRA L854D GO INTERPRET ANOTHER EDIT COMMAND L858A LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK @@ -3948,7 +3967,7 @@ L858C CMPA #CR ENTER KEY? BNE L859D NO BSR L85B4 ECHO THE LINE TO THE SCREEN L8592 JSR LB958 PRINT CARRIAGE RETURN - LDX #LINBUF+1 * RESET BASIC’S INPUT POINTER + LDX #LINBUF+1 * RESET BASIC�S INPUT POINTER STX CHARAD * TO THE LINE INPUT BUFFER JMP LACA8 GO PUT LINE BACK IN PROGRAM L859D CMPA #'E' EXIT? @@ -3966,7 +3985,7 @@ L85B3 FCB SKP2 SKIP TWO BYTES * L85B4 LDB #LBUFMX-1 250 BYTES MAX IN BUFFER L85B6 LDA ,X GET A CHARACTER FROM BUFFER - BEQ L85C2 EXIT IF IT’S A 0 + BEQ L85C2 EXIT IF IT�S A 0 JSR PUTCHR SEND CHAR TO CONSOLE OUT LEAX $01,X MOVE POINTER UP ONE DECB DECREMENT CHARACTER COUNTER @@ -4003,7 +4022,7 @@ L85F5 JSR L8687 GET A KEYSTROKE CMPA #CR ENTER KEY? BEQ L858A YES - INTERPRET ANOTHER COMMAND - PRINT LINE CMPA #ESC ESCAPE? - BEQ L8625 YES - RETURN TO COMMAND LEVEL - DON’T PRINT LINE + BEQ L8625 YES - RETURN TO COMMAND LEVEL - DON�T PRINT LINE CMPA #BS BACK SPACE? BNE L8626 NO CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER @@ -4108,20 +4127,20 @@ LA5E8 SEX CONVERT ACCB TO 2 DIGIT SIGNED INTEGER * VARPTR -VARPT JSR LB26A SYNTAX CHECK FOR ‘(‘ +VARPT JSR LB26A SYNTAX CHECK FOR �(� LDD ARYEND GET ADDR OF END OF ARRAYS PSHS B,A SAVE IT ON STACK JSR LB357 GET VARIABLE DESCRIPTOR - JSR LB267 SYNTAX CHECK FOR ‘)‘ + JSR LB267 SYNTAX CHECK FOR �)� PULS A,B GET END OF ARRAYS ADDR BACK EXG X,D SWAP END OF ARRAYS AND VARIABLE DESCRIPTOR CMPX ARYEND COMPARE TO NEW END OF ARRAYS - BNE L8724 ‘FC’ ERROR IF VARIABLE WAS NOT DEFINED PRIOR TO CALLING VARPTR + BNE L8724 �FC� ERROR IF VARIABLE WAS NOT DEFINED PRIOR TO CALLING VARPTR JMP GIVABF CONVERT VARIABLE DESCRIPTOR INTO A FP NUMBER * MID$(OLDSTRING,POSITION,LENGTH)=REPLACEMENT L86D6 JSR GETNCH GET INPUT CHAR FROM BASIC - JSR LB26A SYNTAX CHECK FOR ‘(‘ + JSR LB26A SYNTAX CHECK FOR �(� JSR LB357 * GET VARIABLE DESCRIPTOR ADDRESS AND PSHS X * SAVE IT ON THE STACK LDD $02,X POINT ACCD TO START OF OLDSTRING @@ -4146,16 +4165,16 @@ L86FD JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESS BEQ L870E * BRANCH IF AT END OF STATEMENT JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION L870E PSHS B SAVE LENGTH PARAMETER ON STACK - JSR LB267 SYNTAX CHECK FOR ‘)‘ + JSR LB267 SYNTAX CHECK FOR �)� LDB #TOK_EQUALS TOKEN FOR = - JSR LB26F SYNTAX CHECK FOR “=‘ + JSR LB26F SYNTAX CHECK FOR �=� BSR L8748 EVALUATE REPLACEMENT STRING TFR X,U SAVE REPLACEMENT STRING ADDRESS IN U LDX $02,S POINT X TO OLOSTRING DESCRIPTOR ADDRESS LDA ,X GET LENGTH OF OLDSTRING SUBA $01,S SUBTRACT POSITION PARAMETER BCC L8727 INSERT REPLACEMENT STRING INTO OLDSTRING -L8724 JMP LB44A ‘FC’ ERROR IF POSITION > LENGTH OF OLDSTRING +L8724 JMP LB44A �FC� ERROR IF POSITION > LENGTH OF OLDSTRING L8727 INCA * NOW ACCA = NUMBER OF CHARACTERS TO THE RIGHT * * (INCLUSIVE) OF THE POSITION PARAMETER CMPA ,S @@ -4164,7 +4183,7 @@ L8727 INCA * NOW ACCA = NUMBER OF CHARACTERS TO THE RIGHT L872E LDA $01,S GET POSITION PARAMETER EXG A,B ACCA=LENGTH OF REPL STRING, ACCB=POSITION PARAMETER LDX $02,X POINT X TO OLDSTRING ADDRESS - DECB * BASIC’S POSITION PARAMETER STARTS AT 1; THIS ROUTINE + DECB * BASIC�S POSITION PARAMETER STARTS AT 1; THIS ROUTINE * * WANTS IT TO START AT ZERO ABX POINT X TO POSITION IN OLDSTRING WHERE THE REPLACEMENT WILL GO TSTA * IF THE LENGTH OF THE REPLACEMENT STRING IS ZERO @@ -4177,16 +4196,16 @@ L873F TFR A,B SAVE NUMBER OF BYTES TO MOVE IN ACCB JSR LA59A MOVE (B) BYTES FROM (X) TO (U) L8746 PULS A,B,X,PC L8748 JSR LB156 EVALUATE EXPRESSION - JMP LB654 *‘TM’ ERROR IF NUMERIC; RETURN WITH X POINTING + JMP LB654 *�TM� ERROR IF NUMERIC; RETURN WITH X POINTING * *TO STRING, ACCB = LENGTH * STRING -STRING JSR LB26A SYNTAX CHECK FOR ‘(’ +STRING JSR LB26A SYNTAX CHECK FOR �(� JSR LB70B EVALUATE EXPRESSION; ERROR IF > 255 PSHS B SAVE LENGTH OF STRING JSR LB26D SYNTAX CHECK FOR COMMA JSR LB156 EVALUATE EXPRESSION - JSR LB267 SYNTAX CHECK FOR ‘)‘ + JSR LB267 SYNTAX CHECK FOR �)� LDA VALTYP GET VARIABLE TYPE BNE L8768 BRANCH IF STRING JSR LB70E CONVERT FPA0 INTO AN INTEGER IN ACCB @@ -4203,7 +4222,7 @@ L8776 STA ,X+ SAVE A CHARACTER IN STRING SPACE L877B JMP LB69B PUT STRING DESCRIPTOR ONTO STRING STACK * INSTR -INSTR JSR LB26A SYNTAX CHECK FOR ‘(‘ +INSTR JSR LB26A SYNTAX CHECK FOR �(� JSR LB156 EVALUATE EXPRESSION LDB #$01 DEFAULT POSITION = 1 (SEARCH START) PSHS B SAVE START @@ -4214,7 +4233,7 @@ INSTR JSR LB26A SYNTAX CHECK FOR BEQ L8724 BRANCH IF START SEARCH AT ZERO JSR LB26D SYNTAX CHECK FOR COMMA JSR LB156 EVALUATE EXPRESSION - SEARCH STRING - JSR LB146 ‘TM’ ERROR IF NUMERIC + JSR LB146 �TM� ERROR IF NUMERIC L879C LDX FPA0+2 SEARCH STRING DESCRIPTOR ADDRESS PSHS X SAVE ON THE STACK JSR LB26D SYNTAX CHECK FOR COMMA @@ -4242,7 +4261,7 @@ L87BE LEAY ,X POINT Y TO SEARCH POSITION SUBA $06,S SUBTRACT SEARCH POSITION FROM SEARCH LENGTH INCA ADD ONE CMPA $01,S COMPARE TO TARGET LENGTH - BLO L87D9 RETURN 0 IF TARGET LENGTH > WHAT’S LEFT OF SEARCH STRING + BLO L87D9 RETURN 0 IF TARGET LENGTH > WHAT�S LEFT OF SEARCH STRING L87CD LDA ,X+ GET A CHARACTER FROM SEARCH STRING CMPA ,U+ COMPARE IT TO TARGET STRING BNE L87DF BRANCH IF NO MATCH @@ -4261,7 +4280,7 @@ L87DF INC $06,S INCREMENT SEARCH POSITION XVEC19 CMPA #'&' * BNE L8845 * RETURN IF NOT HEX OR OCTAL VARIABLE LEAS $02,S PURGE RETURN ADDRESS FROM STACK -* PROCESS A VARIABLE PRECEEDED BY A ‘&‘ (&H,&O) +* PROCESS A VARIABLE PRECEEDED BY A �&� (&H,&O) L87EB CLR FPA0+2 * CLEAR BOTTOM TWO CLR FPA0+3 * BYTES OF FPA0 LDX #FPA0+2 BYTES 2,3 OF FPA0 = (TEMPORARY ACCUMULATOR) @@ -4300,7 +4319,7 @@ L882E LDB #$04 BASE 16 DIGIT MULTIPLIER = 2**4 BRA L881F KEEP EVALUATING VARIABLE L8834 ASL $01,X * MULTIPLY TEMPORARY ROL ,X * ACCUMULATOR BY TWO - LBCS LBA92 ‘OV' OVERFLOW ERROR + LBCS LBA92 �OV' OVERFLOW ERROR DECB DECREMENT SHIFT COUNTER BNE L8834 MULTIPLY TEMPORARY ACCUMULATOR AGAIN SUBA #'0' MASK OFF ASCII @@ -4313,7 +4332,7 @@ XVEC15 PULS U PULL RETURN ADDRESS AND SAVE IN U REGISTER LDX CHARAD CURRENT INPUT POINTER TO X JSR GETNCH GET CHARACTER FROM BASIC CMPA #'&' HEX AND OCTAL VARIABLES ARE PRECEEDED BY & - BEQ L87EB PROCESS A ‘&‘ VARIABLE + BEQ L87EB PROCESS A �&� VARIABLE CMPA #TOK_FN TOKEN FOR FN BEQ L88B4 PROCESS FN CALL CMPA #$FF CHECK FOR SECONDARY TOKEN @@ -4321,26 +4340,26 @@ XVEC15 PULS U PULL RETURN ADDRESS AND SAVE IN U REGISTER JSR GETNCH GET CHARACTER FROM BASIC CMPA #TOK_USR TOKEN FOR USR LBEQ L892C PROCESS USR CALL -L8862 STX CHARAD RESTORE BASIC’S INPUT POINTER +L8862 STX CHARAD RESTORE BASIC�S INPUT POINTER JMP ,U RETURN TO CALLING ROUTINE L8866 LDX CURLIN GET CURRENT LINE NUMBER LEAX $01,X IN DIRECT MODE? BNE L8845 RETURN IF NOT IN DIRECT MODE - LDB #2*11 ‘ILLEGAL DIRECT STATEMENT’ ERROR + LDB #2*11 �ILLEGAL DIRECT STATEMENT� ERROR L886E JMP LAC46 PROCESS ERROR DEF LDX [CHARAD] GET TWO INPUT CHARS CMPX #TOK_FF_USR TOKEN FOR USR LBEQ L890F BRANCH IF DEF USR BSR L88A1 GET DESCRIPTOR ADDRESS FOR FN VARIABLE NAME - BSR L8866 DON’T ALLOW DEF FN IF IN DIRECT MODE - JSR LB26A SYNTAX CHECK FOR ‘(‘ + BSR L8866 DON�T ALLOW DEF FN IF IN DIRECT MODE + JSR LB26A SYNTAX CHECK FOR �(� LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE STB ARYDIS * AND SAVE IT IN THE ARRAY DISABLE FLAG JSR LB357 GET VARIABLE DESCRIPTOR - BSR L88B1 ‘TM’ ERROR IF STRING - JSR LB267 SYNTAX CHECK FOR ‘)‘ - LDB #TOK_EQUALS TOKEN FOR ‘=‘ + BSR L88B1 �TM� ERROR IF STRING + JSR LB267 SYNTAX CHECK FOR �)� + LDB #TOK_EQUALS TOKEN FOR �=� JSR LB26F DO A SYNTAX CHECK FOR = LDX V4B GET THE ADDRESS OF THE FN NAME DESCRIPTOR LDD CHARAD * GET THE CURRENT INPUT POINTER ADDRESS AND @@ -4355,14 +4374,14 @@ L88A1 LDB #TOK_FN TOKEN FOR FN ORA #$80 SET BIT 7 OF CURRENT INPUT CHARACTER TO INDICATE AN FN VARIABLE JSR LB35C * GET THE DESCRIPTOR ADDRESS OF THIS STX V4B * VARIABLE AND SAVE IT IN V4B -L88B1 JMP LB143 ‘TM’ ERROR IF STRING VARIABLE +L88B1 JMP LB143 �TM� ERROR IF STRING VARIABLE * EVALUATE AN FN CALL L88B4 BSR L88A1 * GET THE DESCRIPTOR OF THE FN NAME PSHS X * VARIABLE AND SAVE IT ON THE STACK - JSR LB262 SYNTAX CHECK FOR ‘(‘ & EVALUATE EXPR - BSR L88B1 ‘TM’ ERROR IF STRING VARIABLE + JSR LB262 SYNTAX CHECK FOR �(� & EVALUATE EXPR + BSR L88B1 �TM� ERROR IF STRING VARIABLE PULS U POINT U TO FN NAME DESCRIPTOR - LDB #2*25 ‘UNDEFINED FUNCTION CALL’ ERROR + LDB #2*25 �UNDEFINED FUNCTION CALL� ERROR LDX $02,U POINT X TO ARGUMENT VARIABLE DESCRIPTOR BEQ L886E BRANCH TO ERROR HANDLER LDY CHARAD SAVE CURRENT INPUT POINTER IN Y @@ -4381,7 +4400,7 @@ L88D9 JSR LB141 EVALUATE FN EXPRESSION PULS A * VARIABLE OFF OF THE STA $04,X * STACK AND RE-SAVE IT JSR GETCCH GET FINAL CHARACTER OF THE FN FORMULA - LBNE LB277 ‘SYNTAX’ ERROR IF NOT END OF LINE + LBNE LB277 �SYNTAX� ERROR IF NOT END OF LINE STY CHARAD RESTORE INPUT POINTER L88EF RTS @@ -4409,7 +4428,7 @@ L8927 LDX USRADR GET ADDRESS OF STORAGE LOCs FOR USR ADDRESS L892C BSR L891C GET STORAGE LOC OF EXEC ADDRESS FOR USR N LDX ,X * GET EXEC ADDRESS AND PSHS X * PUSH IT ONTO STACK - JSR LB262 SYNTAX CHECK FOR ‘(‘ & EVALUATE EXPR + JSR LB262 SYNTAX CHECK FOR �(� & EVALUATE EXPR LDX #FP0EXP POINT X TO FPA0 LDA VALTYP GET VARIABLE TYPE BEQ L8943 BRANCH IF NUMERIC, STRING IF <> 0 @@ -4417,21 +4436,21 @@ L892C BSR L891C GET STORAGE LOC OF EXEC ADDRESS FOR USR N LDX FPA0+2 GET POINTER TO STRING DESCRIPTOR LDA VALTYP GET VARIABLE TYPE L8943 RTS JUMP TO USR ROUTINE (PSHS X ABOVE) -L8944 LDB #TOK_EQUALS TOKEN FOR ‘=‘ +L8944 LDB #TOK_EQUALS TOKEN FOR �=� JSR LB26F DO A SYNTAX CHECK FOR = JMP LB73D EVALUATE EXPRESSION, RETURN VALUE IN X * DEL -DEL LBEQ LB44A FC’ ERROR IF NO ARGUMENT +DEL LBEQ LB44A FC� ERROR IF NO ARGUMENT JSR LAF67 CONVERT A DECIMAL BASiC NUMBER TO BINARY JSR LAD01 FIND RAM ADDRESS OF START OF A BASIC LINE STX VD3 SAVE RAM ADDRESS OF STARTING LINE NUMBER JSR GETCCH GET CURRENT INPUT CHARACTER BEQ L8990 BRANCH IF END OF LINE - CMPA #TOK_MINUS TOKEN FOR ‘-' - BNE L89BF TERMINATE COMMAND IF LINE NUMBER NOT FOLLOWED BY ‘-‘ + CMPA #TOK_MINUS TOKEN FOR �-' + BNE L89BF TERMINATE COMMAND IF LINE NUMBER NOT FOLLOWED BY �-� JSR GETNCH GET A CHARACTER FROM BASIC BEQ L898C IF END OF LINE, USE DEFAULT ENDING LINE NUMBER BSR L89AE * CONVERT ENDING LINE NUMBER TO BINARY @@ -4443,17 +4462,17 @@ L8992 FCB SKP2 SKIP TWO BYTES L8993 LDU ,U POINT U TO START OF NEXT LINE LDD ,U CHECK FOR END OF PROGRAM BEQ L899F BRANCH IF END OF PROGRAM - LDD $02,U LOAD ACCD WITH THIS LINE’S NUMBER + LDD $02,U LOAD ACCD WITH THIS LINE�S NUMBER SUBD BINVAL SUBTRACT ENDING LINE NUMBER ADDRESS BLS L8993 BRANCH IF = < ENDING LINE NUMBER L899F LDX VD3 GET STARTING LINE NUMBER BSR L89B8 MOVE (U) TO (X) UNTIL END OF PROGRAM - JSR LAD21 RESET BASIC’S INPUT POINTER AND ERASE VARIABLES + JSR LAD21 RESET BASIC�S INPUT POINTER AND ERASE VARIABLES LDX VD3 GET STARTING LINE NUMBER ADDRESS JSR LACF1 RECOMPUTE START OF NEXT LINE ADDRESSES - JMP LAC73 JUMP TO BASIC’S MAIN COMMAND LOOP + JMP LAC73 JUMP TO BASIC�S MAIN COMMAND LOOP L89AE JSR LAF67 GO GET LINE NUMBER CONVERTED TO BINARY - JMP LA5C7 MAKE SURE THERE’S NO MORE ON THIS LINE + JMP LA5C7 MAKE SURE THERE�S NO MORE ON THIS LINE L89B4 LDA ,U+ GET A BYTE FROM (U) STA ,X+ MOVE THE BYTE TO (X) L89B8 CMPU VARTAB COMPARE TO END OF BASIC @@ -4462,7 +4481,7 @@ L89B8 CMPU VARTAB COMPARE TO END OF BASIC L89BF RTS -L89C0 JSR L8866 ‘BS’ ERROR IF IN DIRECT MODE +L89C0 JSR L8866 �BS� ERROR IF IN DIRECT MODE JSR GETNCH GET A CHAR FROM BASIC L89D2 CMPA #'"' CHECK FOR PROMPT STRING BNE L89E1 BRANCH IF NO PROMPT STRING @@ -4475,7 +4494,7 @@ L89E1 LEAS $-02,S RESERVE TWO STORAGE SLOTS ON STACK LEAS $02,S CLEAN UP THE STACK JSR LB357 SEARCH FOR A VARIABLE STX VARDES SAVE POINTER TO VARIABLE DESCRIPTOR - JSR LB146 ‘TM’ ERROR IF VARIABLE TYPE = NUMERIC + JSR LB146 �TM� ERROR IF VARIABLE TYPE = NUMERIC LDX #LINBUF POINT X TO THE STRING BUFFER WHERE THE INPUT STRING WAS STORED CLRA TERMINATOR CHARACTER 0 (END OF LINE) JSR LB51A PARSE THE INPUT STRING AND STORE IT IN THE STRING SPACE @@ -4510,16 +4529,16 @@ L8A2D BEQ L8A3D BRANCH IF END OF LINE BCC L8A3A BRANCH IF NEXT CHARACTER NOT NUMERIC BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY STX VCF SAVE NEW INTERVAL - BEQ L8A83 ‘FC' ERROR -L8A3A JSR LA5C7 CHECK FOR MORE CHARACTERS ON LINE - ‘SYNTAX’ ERROR IF ANY + BEQ L8A83 �FC' ERROR +L8A3A JSR LA5C7 CHECK FOR MORE CHARACTERS ON LINE - �SYNTAX� ERROR IF ANY L8A3D BSR L8A02 GO GET ADDRESS OF OLD NUMBER BEING RENUMBERED STX VD3 SAVE ADDRESS LDX VD5 GET NEXT RENUMBERED LINE NUMBER TO USE BSR L8A04 FIND THE LINE NUMBER IN THE BASIC PROGRAM CMPX VD3 COMPARE TO ADDRESS OF OLD LINE NUMBER - BLO L8A83 ‘FC’ ERROR IF NEW ADDRESS < OLD ADDRESS + BLO L8A83 �FC� ERROR IF NEW ADDRESS < OLD ADDRESS BSR L8A67 MAKE SURE RENUMBERED LINE NUMBERS WILL BE IN RANGE - JSR L8ADD CONVERT ASCII LINE NUMBERS TO ‘EXPANDED’ BINARY + JSR L8ADD CONVERT ASCII LINE NUMBERS TO �EXPANDED� BINARY JSR LACEF RECALCULATE NEXT LINE RAM ADDRESSES BSR L8A02 GET RAM ADDRESS OF FIRST LINE TO BE RENUMBERED STX VD3 SAVE IT @@ -4529,7 +4548,7 @@ L8A3D BSR L8A02 GO GET ADDRESS OF OLD NUMBER BEING RENUMBERED JSR L8B7B CONVERT PACKED BINARY LINE NUMBERS TO ASCII JSR LAD26 ERASE VARIABLES JSR LACEF RECALCULATE NEXT LINE RAM ADDRESS - JMP LAC73 GO BACK TO BASIC’S MAIN LOOP + JMP LAC73 GO BACK TO BASIC�S MAIN LOOP L8A67 FCB SKP1LD SKIP ONE BYTE - LDA #$4F L8A68 CLRA NEW LINE NUMBER FLAG - 0; INSERT NEW LINE NUMBERS STA VD8 SAVE NEW LINE NUMBER FLAG; 0 = INSERT NEW NUMBERS @@ -4542,10 +4561,10 @@ L8A71 TST VD8 CHECK NEW LINE NUMBER FLAG L8A77 LDX ,X POINT X TO THE NEXT LINE IN BASIC BSR L8A86 RETURN IF END OF PROGRAM ADDD VCF ADD INTERVAL TO CURRENT RENUMBERED LINE NUMBER - BLO L8A83 ‘FC’ ERROR IF LINE NUMBER > $FFFF + BLO L8A83 �FC� ERROR IF LINE NUMBER > $FFFF CMPA #MAXLIN LARGEST LINE NUMBER = $F9FF BLO L8A71 BRANCH IF LEGAL LINE NUMBER -L8A83 JMP LB44A ‘FC’ ERROR IF LINE NUMBER MS BYTE > $F9 +L8A83 JMP LB44A �FC� ERROR IF LINE NUMBER MS BYTE > $F9 * TEST THE TWO BYTES POINTED TO BY (X). * NORMAL RETURN IF <> 0. IF = 0 (END OF * PROGRAM) RETURN IS PULLED OFF STACK AND @@ -4572,7 +4591,7 @@ L8A9B LEAX $01,X MOVE POINTER TO NEXT CHARACTER DECA = BNE L8A9B =MOVE TO NEXT CHARACTER IF > 3 L8AAC LDA #$03 * SET 1ST BYTE = 3 TO INDICATE LINE - STA ,X+ * NUMBER DOESN’T CURRENTLY EXIST + STA ,X+ * NUMBER DOESN�T CURRENTLY EXIST BRA L8A99 GO GET ANOTHER CHARACTER L8AB2 LDD $01,X GET MS BYTE OF LINE NUMBER DEC $02,X DECREMENT ZERO CHECK BYTE @@ -4694,12 +4713,12 @@ L8B8C LDA ,X GET CURRENT CHARACTER SUBA #$02 INPUT CHARACTER 3? - UL LINE NUMBER BNE L8B8A NO PSHS X SAVE CURRENT POSITION OF INPUT POINTER - LDX #L8BD9-1 POINT X TO ‘UL’ MESSAGE + LDX #L8BD9-1 POINT X TO �UL� MESSAGE JSR LB99C PRINT STRING TO THE SCREEN LDX ,S GET INPUT POINTER LDD $01,X GET THE UNDEFINED LINE NUMBER JSR LBDCC CONVERT NUMBER IN ACCD TO DECIMAL AND DISPLAY IT - JSR LBDC5 PRINT ‘IN XXXX’ XXXX = CURRENT LINE NUMBER + JSR LBDC5 PRINT �IN XXXX� XXXX = CURRENT LINE NUMBER JSR LB958 SEND A CR TO CONSOLE OUT PULS X GET INPUT POINTER BACK L8BAE PSHS X SAVE CURRENT POSITION OF INPUT POINTER @@ -4769,9 +4788,9 @@ L90B2 RTS * LINE -LINE CMPA #TOK_INPUT ‘INPUT’ TOKEN - LBEQ L89C0 GO DO ‘LINE INPUT’ COMMAND - JMP LB277 ‘SYNTAX ERROR’ IF NOT "LINE INPUT" +LINE CMPA #TOK_INPUT �INPUT� TOKEN + LBEQ L89C0 GO DO �LINE INPUT� COMMAND + JMP LB277 �SYNTAX ERROR� IF NOT "LINE INPUT" * END OF EXTENDED BASIC diff --git a/ROMS/6809/basic.hex b/ROMS/6809/basic.hex new file mode 100644 index 0000000..2cca0a2 --- /dev/null +++ b/ROMS/6809/basic.hex @@ -0,0 +1,258 @@ +:20006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C842602E4 +:200080000C83B6FFFF7EE202FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:20E000008D0327FC39B6FFD085012706B6FFD1847F394F398D263402810D270DB7FFD10C54 +:20E020007996799178251220100F798D0F860DB7FFD18D08860AB7FFD13502393402B6FFA3 +:20E04000D0850227F935023910CE01EE860CBDE0148EE157A6802705BDE01420F7B6FFD064 +:20E06000850127F9B6FFD1847F8143271481572706966E8155260A9E6FA684811226026E03 +:20E08000848E02186F83300126FA8E02176F809F19A60243A702A10226063001630120F1BA +:20E0A0009F719F279F233089FF389F211F148EE0F5CE0076C612BDE1F1CE00A7C604BDE1FA +:20E0C000F1863997F0BDE4FD8E00B59F8DCEEC11C60AEF815A26FB8695B7FFD08EE12ABD7F +:20E0E000F1258EE0ED9F6F8655976E200412BDE5177EE4653B1040FF00EC110C8426020CC0 +:20E1000083B600007EE2027EE2017EE0F47EEC11804FC7525932E260E36D1DE300E211003E +:20E1200000000000000000000000003638303920455854454E4445442042415349430D28E0 +:20E1400043292031393832204259204D4943524F534F46540D0D00434F4C44204F5220575A +:20E1600041524D2053544152542028432F57293F200D0034169E76DC789F6AD76C976D3534 +:20E18000960F738E00F4C601BDE000810826075A27EF301F20348115260A5A27E48608BD42 +:20E1A000E01420F681031A012705810D260D4F3401BDF0E56F848E00F33581812025C98179 +:20E1C0007B24C5C1FA24C1A7805CBDE01420B92705BDEF049F7A6E9F007A7EE5E69673263A +:20E1E00003BDE0050F73975310260C6A97567EEE62A680A7C05A26F939399D8227FB7EEA86 +:20E20000433B813A240A812026020E7C803080D039F403F477F41C00ADF6A8F6FDEF17EE67 +:20E2200048ECC4EEDDEE67EE53F7ADF775F77EF8EFF921F843FAA9F87DFF7BEE72EE8FEE67 +:20E2400096E1DDECB5FAB1FB71FB4179F14E79F1457BF2557BF31A7FF88650EA9C46EA9B27 +:20E26000464FD247CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D44545 +:20E280004EC44E4558D44449CD524541C45255CE524553544F52C55245545552CE53544F48 +:20E2A000D0504F4BC5434F4ED44C4953D4434C4541D24E45D7455845C354524FCE54524FC1 +:20E2C00046C64445CC4445C64C494EC552454E55CD454449D4544142A854CF5355C2544891 +:20E2E00045CE4E4FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC46CE5553494EC72F +:20E300005347CE494ED44142D35553D2524EC45349CE504545CB4C45CE535452A45641CC88 +:20E320004153C3434852A44154CE434FD35441CE4558D04649D84C4FC7504FD35351D24874 +:20E340004558A44C454654A45249474854A44D4944A4494E4B4559A44D45CD5641525054FD +:20E36000D2494E5354D2535452494E47A4E52BE676E6D3E6D3E6D3E704E6D0F0ADE732E76B +:20E38000DFE5FDE8C4EB15E819E66BE5DFE6B0E601EF1EE626EF25E637E4FBE1CFFAA4FA0C +:20E3A000A5FD20FC64FFBFFDAAF9304E46534E52474F4446434F564F4D554C425344442F95 +:20E3C000304944544D4F534C535354434E4644414F444E494F464D4E4F4945445355464EE4 +:20E3E00045204552524F520020494E20000D4F4B0D000D425245414B003064C6129F0FA671 +:20E400008480802615AE019F119E3B27099C1127099E0F3A20E59E119F3B9E0F4D398D17AC +:20E42000DE4133419E433001A68236029C4726F8DF45394F58D31FC3003A250810DF1710A0 +:20E44000931725EEC60CBDE517BDF0E9BDF1388EE3AB3A8D318D2F8EE3E0BDF12596684CBA +:20E460002703BDF54EBDF0E98EE3EDBDF125BDE181CEFFFFDF6825F69F839D7C27F0250BDC +:20E48000BDEFDA7EE5B4A6807EF13ABDE7579E2B9FF1BDEFDAD7038D4C2512DC47A384D32F +:20E4A0001BDD1BEE843702A7809C1B26F896F3271CDC1BDD43DB038900DD41BDE41ECE00AD +:20E4C000EF3702A7809C4526F89E419F1B8D368D02209B9E19EC8427213304A6C026FCEF2B +:20E4E00084AE8420F0DC2B9E19EE84270910A3022306AE8420F31A019F473926FB9E196F52 +:20E50000806F809F1B9E19BDE6AB9E279F23BDE5DF9E1B9F1D9F1F8E00C99F0BAEE410DE11 +:20E52000216FE20F2D0F2E0F086E8486809708BDE779BDE3F9326226049E0F3285C609BDDE +:20E54000E433BDE6D8DC683416C6A0BDEA3BBDE90FBDE90DD654CA7FD450D750108EE56347 +:20E560007EE9B68EF24EBDF39D9D8281A426059D7CBDE90DBDF3F6BDE9B2DC3B34068680D3 +:20E5800034021CAF8D609E839F2FA6802707813A27227EEA43A68197002772EC80DD689FF4 +:20E5A00083968C270F865BBDE0149668BDF555865DBDE0149D7C8D0220C827294D102A01ED +:20E5C000B881FF270F819E22C9BEE118481F893A9D7C6E949D7C8197102714ED7EEA439E15 +:20E5E00019301F9F3339BDE005270A8103271281132703977339BDE00527FB20EE9D822006 +:20E60000021A0126319E839F2F060032629E688CFFFF27069F299E2F9F2D8EE3F10D001060 +:20E620002AFE427EE45A260EC6209E2D1027FE169F839E299F6839272CBDEBAD34069E27B4 +:20E640009D82270CBDEA39BDEF04301F9C7122181F10A3E125121F0383003A250B931B2576 +:20E6600007DF219F277EE50A7EE4449D821027FE94BDE50A20191F899D7CC1A02716C1A12C +:20E680002645C603BDE433DE839E6886A134528D037EE5829D82BDE7578D403001DC2B10BA +:20E6A000936822029E19BDE4E92517301F9F833926FD86FF973BBDE3F91F148121270BC634 +:20E6C000048CC60E7EE4467EEA4335529F68DF838D068C8D069F8339C63A865FD7015F9ECC +:20E6E000831F98D6019701A68427EC3404A1E027E63001812227EA4C26023001818626E7D0 +:20E700000C0420E3BDE90D9D8281812705C6A2BDEA3B964F26130F048DB64D27BA9D7C8160 +:20E720008426F50A042AF19D7C9D821025FF657EE5BABDEED2C681BDEA3B340281A12704FA +:20E7400081A026830A53260535047EE6789D7C8D06812C27EF35849E749F2B246180309782 +:20E7600001DC2B811822DB58495849D32B5849DB018900DD2B9D7C20E2BDEB1E9F3BC6AE7E +:20E78000BDEA3B96063402BDE922350246BDE91410270C289E52DC2110A30224119C1B25A8 +:20E7A0000DE684BDECD49E4DBDEE0A8E00569F4DBDEE3CDE4D9E3B3726A78410AF02393F49 +:20E7C0005245444F0D007EE446960927079E319F687EEA438EE7BEBDF1259E2F9F8339C618 +:20E7E000169E68300127DF8D01398122260BBDEA10C63BBDEA3BBDF1288E00F36F848D06B4 +:20E80000C62CE7842016BDF138BDF135BDE181240532647EE609C62E399E33864F97099F3F +:20E8200035BDEB1E9F3B9E839F2B9E35A684260996092651BDF1388DCD9F839D7CD6062758 +:20E84000239E8397018122270E301F4F9701BDE173863A9701862C9702BDECE5BDEA15BD13 +:20E86000E7942006BDF49BBDF3BC9D822706812C1026FF529E839F359E2B9F839D82272178 +:20E88000BDEA39209C9F83BDE6D830014D260AC606EE812741EC81DD31A684818626E62016 +:20E8A000989E35D6091026FD3AA68427068EE8B37EF125393F45585452412049474E4F52F2 +:20E8C00045440D0026049E742003BDEB1E9F3BBDE3F92704C60020471F143003BDF39DA659 +:20E8E0006897549E3BBDF14BBDF3BC3069BDF41FE068270CAE6E9F68AEE8109F837EE582D3 +:20E9000032E8129D82812C26F49D7C8DBD8D131CFE7D1A010D0625032A998C2B96C6187E89 +:20E92000E4468D6E4F8C34043402C601BDE433BDE9EF0F3F9D8280AD25138103240F81012E +:20E9400049983F913F2564973F9D7C20E9D63F26331024006B8B0724679906102704778942 +:20E96000FF340248ABE08EE24B30863502A18424558D9C34028D299E3D3502261D4D10275B +:20E98000006A204B0806598D098EE997D73F0F0620D99E837EE6AB64EABBA184243120D3CD +:20E9A000EC0134068D08D63F16FF7B7EEA43D654A68435203404D64F9E50DE5234546EA48D +:20E9C0009E74A6E0272681642703BDE90F9F3D3504815A2719817D271554D70A3552975C75 +:20E9E0009F5DDF5F3504D761D854D762D64F39BDFC390F069D7C24037EF49BBDEB692450D0 +:20EA0000812E27F481A7274081A627E38122260A9E83BDECDF9E649F833981A3260D865A5C +:20EA2000BDE926BDEBB443537EECBB4C272E8D06BDE922C6298CC6288CC62CE19F008326E7 +:20EA4000020E7CC6027EE446867DBDE9267EF672BDEB1E9F52960626957EF39D9D7C1F8928 +:20EA6000589D7CC13823037EEA433404C12A251EC130241C8DC0A6E4BDE9228DBCBDE91224 +:20EA80003502DE523442BDEED2350234068E8D9E3504BEE11D3AAD947EE90F864F9703BDE0 +:20EAA000EBB4DD01BDF3D3BDEBB40D0326069401D40220049A01DA027EECBBBDE9142610A3 +:20EAC00096618A7F945D975D8E005CBDF41F20360F060A3FBDEE1ED7569F589E5FBDEE202E +:20EAE00096563404A0E0270786012403D656409754DE585C5A2604D654200BA680A1C02726 +:20EB0000F3C6FF240150CB0159D40A2702C6FF7EF405BDEA39C6018D089D8226F5395F9DB5 +:20EB200082D70597379D828D401025FF165FD7069D7C25048D33250A1F899D7C25FC8D296E +:20EB400024F8812426060306CB809D7CD7389A088028102700750F089E1BDC379C1D271281 +:20EB600010A381273E300520F381412504805B80A5398E0074EEE41183EA532728DC1FDDC4 +:20EB800043C30007DD419E1D9F47BDE41E9E419F1F9E459F1D9E47DC37ED814F5FED84ED3C +:20EBA00002A7049F393990800000009D7CBDE90D96542B5DBDE90F964F819025088EEBA652 +:20EBC000BDF41F264CBDF451DC5239DC053406125F9E3734148DD435349F37DE5234605C21 +:20EBE0009D82812C27EBD703BDEA333506DD059E1D9C1F2721DC3710A3842706EC02308B88 +:20EC000020EFC6129605260BD603E1042759C6108CC6087EE446CC0005DD64DC37ED84D6BF +:20EC200003E704BDE4339F41C60B4F0D0527053506C30001ED058D5DDD6430020A0326E86B +:20EC40009F0FD30F1025F7FC1F01BDE437830035DD1F4F301FA7059C0F26F89E41961F9316 +:20EC600041ED029605262DE604D7034F5FDD643506DD5210A305243ADE6427048D17D3520D +:20EC800030020A0326E7EDE358495849E3E1308B30059F393986109745EC05DD174F5F58F4 +:20ECA00049250F086509642404D31725050A4526EE397EEC0E1F40931F214F0F06DD50C624 +:20ECC000907EF40BBDE90FCE01F0BDF56532628E01EF200B9F4D8D5C9F58D75639301F8658 +:20ECE000229701970230019F629F58C6FF5CA680270C91012704910226F381222702301F9A +:20ED00009F64D756DE62118301F022078DC69E62BDEE0C9E0B8C00F12605C61E7EE4469658 +:20ED200056A700DC58ED0286FF97069F0D9F5230059F0B390F074F3406DC23A3E0109321F7 +:20ED4000250ADD239E2330019F253584C61A030727CA8D04350420DE9E279F234F5FDD4B15 +:20ED60009E219F478E00C99C0B27048D3220F89E1B9C1D27048D2220F89F419E419C1F27E9 +:20ED800035EC02D341DD41A6012AF0E60458CB053A9C4127E88D0820F8A60130022A14E67B +:20EDA000842710EC02109323220910934723049F4BDD473005399E4B27FB4FE6845AD347F4 +:20EDC000DD439E239F41BDE4209E4BDC45ED029E45301F7EED5ADC523406BDE9EFBDE9120C +:20EDE00035109F62E6849E52EB842405C61C7EE446BDECD49E62E6848D109E4D8D228D0C9A +:20EE00009E628D1CBDED137EE934AE02DE255C2004A680A7C05A26F9DF2539BDE9129E52D3 +:20EE2000E6848D182613AE07301F9C2326083404D323DD233504300139AE02399C0D260709 +:20EE40009F0B301B9F0D4F398D037EECBA8DCC0F065D39BDEED5C601BDED349653BDECD842 +:20EE6000A78432627EED138D0220DF8DE0275EE684398D484FE1842303E6844F3406BDECE7 +:20EE8000D69E4D8D9B35043A3504BDEE0C20D58D2BA0844020DFC6FFD7539D828129270532 +:20EEA000BDEA398D2D8D1527245F4AA18424CD1F89E08450D15323C4D65320C0BDEA33EED4 +:20EEC000E4AE659F4DA664E66432671F357EEC119D7CBDE90DBDEBB04D26F20E82BDEE4D82 +:20EEE000102702DEDE839F833AA68434526F849D82BDF49B3552A784DF83398D079F2BBDC8 +:20EF0000EA3920CEBDE90D96542BC2964F819022BCBDF4519E52398DEEE6847EECBA8DDBE6 +:20EF20009E2BE784393401BDE757BDE4E59F66350127129D82271381A726099D7C2706BD87 +:20EF4000E757270639CEFFFFDF2B32629E66BDF0E9BDE1DAEC8426037EE4659F66EC02102E +:20EF6000932B22F4BDF555BDF1359E668D10AE9F0066CE00F4A6C027D5BDF13A20F7300428 +:20EF8000108E00F4A68027512B15813A260DE684C18427F0C18327EC8C86218D3020E5CE33 +:20EFA000E10B81FF2604A6803345847F334A6DC427E7A0C42AF6ABC4EE414A2B066DC02A6A +:20EFC000FC20F7A6C48D066DC02AF820B7108C01ED2406847FA7A06FA4399E83CE00F30FC0 +:20EFE000430F44A68027210D43270FBDEB69241881302504813923100F438120270A974276 +:20F00000812227380D442719A7C02706813A27CF20D16FC06FC01F308300F18E00F29F8364 +:20F0200039813F2604868720DF81272613CC3A83EDC10F42A68027D0914227CCA7C020F4DA +:20F0400081302504813C25C0301F34500F41CEE10B0F42334AA6C4273110AE41AEE4E6A0B0 +:20F06000E08027FAC180263832623540DA4296412606C1842606863AEDC12094E7C0C186C7 +:20F0800026020C44C18227AA2086CEE110034126C03550A680A7C0BDEB6925EC034320E8D3 +:20F0A0000C424A27AE313FE6A02AFC20AF27368D0139273E819F2753812C2737813B276087 +:20F0C000BDE922960634022606BDF562BDECDD8D573504BDE1735D26089D82812C27148D83 +:20F0E000549D8226CF860D2051BDE17327F7966C26F339BDE173270AD66CD16B25068DE5C4 +:20F10000201ED66CD06A24FC502010BDEED081291026F92FBDE173D06C23058D185A26FB7D +:20F120009D7C7EF0B2BDECDFBDEE1E5C5A27C3A6808D0720F786208C863F7EE0148EF6499E +:20F140002009BDF2B8035403622003BDF2B85D102702808E005C1F895D276CD04F2769256D +:20F160000A974F966197548E004F50C1F82F594F6401BDF243D6622A0B63016302630363AA +:20F180000443890097639653996097539652995F97529651995E97519650995D97505D2A00 +:20F1A0004425028D5D5F9650262E965197509652975196539752966397530F63CB08C128E0 +:20F1C0002DE44F974F9754398D6D5F20A85C086309530952095109502AF3964F3404A0E0B9 +:20F1E000974F23DE8C2508086386009763200C0C4F2728065006510652065324048D0D2767 +:20F20000EE39035403500351035203539E5230019F5226069E5030019F5039C60A7EE44621 +:20F220008E0012A6049763A603A704A602A703A601A702965BA701CB082FE89663C0082729 +:20F240000C6701660266036604465C26F43981000000008D6327608D78860097139714979B +:20F26000159716D6538D22D663D78BD6528D1AD663D78AD6518D12D663D789D6508D0CD6FC +:20F2800063D788BDF3947EF1A52795439613562726241696169B6097169615995F97159696 +:20F2A00014995E97149613995D46971306140615061606634F20D539EC0197618A80DD5DA9 +:20F2C000D661D854D762EC03DD5FA684975CD64F394D27169B4F464928108B80974F270C8D +:20F2E000966297543996544320023262102AFED27EF21BBDF3E8270D8B0225F40F62BDF1E9 +:20F30000560C4F27EB398420000000BDF3E88EF3065FD762BDF39D8C8D9E2773004F8DB16B +:20F320000C4F27CC8E0013C604D703C6019650915D26139651915E260D9652915F260796C2 +:20F340005391602601431FA859240AE7800A032B34272EC6011F8A250E0860095F095E09A6 +:20F360005D25E32BC820DF966090539760965F9252975F965E9251975E965D9250975D20E2 +:20F38000D8C64020D0565656D7638D087EF1A5C6147EE4469E139F509E159F52393402EC99 +:20F3A0000197548A80DD500F63E684AE039F52D74F35828E004520068E00408C9E3B964FBE +:20F3C000A78496548A7F9450A7019651A702DE52EF0339966197549E5C9F4F0F63965E97D1 +:20F3E0005196549E5F9F5239DC4FDD5C9E519F5E9E539F604D39D64F2708D65459C6FF2524 +:20F400000150398DF1D7500F51C68896508080D74FDC74DD52976397547EF1A10F5439E60D +:20F420008427D3E601D8542BD1D64FE184261DE601CA7FD450E1012613D651E102260DD6F0 +:20F4400052E1032607D653E00426013956D85420ABD64F273DC0A096542A05035BBDF2047C +:20F460008E004FC1F82E06BDF2370F5B390F5B96544906507EF243D64FC1A0241D8DD2D796 +:20F48000639654D754808086A0974F965397017EF1A1D750D751D752D753399E749F549FD8 +:20F4A0004F9F519F529F479F452564BDFBD8812D260403552004812B26049D7C2551812ED1 +:20F4C0002728814526289D7C256481A7270E812D270A81A62708812B2704200603489D7C34 +:20F4E000254C0D48270800472004034626CC96479045974727122A09BDF30B0C4726F92028 +:20F5000007BDF2F30A4726F996552A8E7EF672D645D046D7453402BDF2F33504C0308D026C +:20F520002098BDF3B8BDF4058E00407EF14BD6475858DB475880303404ABE09747209F9B7B +:20F540003EBC1FFD9E6E6B27FD9E6E6B28008EE3E78D0CDC68DD50C69043BDF40F8D037E92 +:20F56000F125CE01F18620D6542A02862DA7C0DF6497548630D64F102700C64FC1802208DF +:20F580008EF549BDF25386F797458EF544BDF4292E0F8EF53FBDF4292E0EBDF2F30A45207D +:20F5A000F1BDF30B0C4520E2BDF13DBDF451C60196458B0A2B09810B24054A1F8986024A7B +:20F5C0004A9747D7452E0DDE64862EA7C05D27048630A7C08EF64EC6809653AB039753967B +:20F5E00052A90297529651A90197519650A98497505C565928E32403C00B50CB2F30041F0D +:20F6000098847FA7C00A452604862EA7C053C4808CF67226C4A6C2813027FA812E2602339B +:20F620005F862BD647271C2A03862D50A7428645A741862F4CC00A24FBCB3AED436F45209B +:20F6400004A7C46F418E01F1398000000000FA0A1F0000989680FFF0BDC0000186A0FFFFF0 +:20F66000D8F0000003E8FFFFFF9C0000000AFFFFFFFF964F27020354399F64BDF3B88D059D +:20F680008D088E00407EF2539F64BDF3B39E64E680D7559F648DEE9E6430059F64BDF14B99 +:20F6A0008E00450A5526EE39BDF3F62B1F27158D10BDF3B88D0E8E00408DCA8EF24EBDF15E +:20F6C0004B7EF4779EB19F509EB39F52BEF6F99F5DBEF6FB9F5FBDF259DC8AC3658BDDB36F +:20F6E000DD52DC88C9B08905DDB1DD500F548680974F961597637EF1A540E64DABBDF3E8F7 +:20F700008EF742D661BDF312BDF3E88DB40F62965CD64FBDF1458EF747BDF14296543402F9 +:20F720002A09BDF13D96542B05030ABDF6728EF747BDF14B35024D2A03BDF6728EF74C7E75 +:20F74000F67983490FDAA27F000000000584E61A2D1B862807FBF88799688901872335DF1B +:20F76000E186A55DE72883490FDAA2A154468F138F524389CD8EF7A8BDF14B7EF6FDBDF31C +:20F78000B80F0A8DF68E004ABDF3BE8E0040BDF39D0F54960A8D0C0D4F1027FA7E8E004A35 +:20F7A0007EF31834027EF72B81490FDAA2965434022A028D24964F3402818125058EF24E83 +:20F7C0008DDE8EF7DDBDF6793502818125068EF7A8BDF14235024D2A037EF672390B76B3AB +:20F7E00083BDD3791EF4A6F57B83FCB0107C0C1F67CA7CDE53CBC17D1464704C7DB7EA51E5 +:20F800007A7D6330887E7E9244993A7E4CCC91C77FAAAAAA138100000000037F5E56CB79B8 +:20F8200080139B0B6480763893168238AA3B20803504F334813504F3348080000000803123 +:20F840007217F8BDF3F6102FF3C78EF82F964F808034028680974FBDF14B8EF834BDF31851 +:20F860008EF24EBDF1428EF81ABDF6798EF839BDF14B3504BDF5228EF83E7EF253BDF3E81A +:20F880008EF649BDF39D27674D26037EF1C38E004ABDF3BE5F96612A10BDF4778E004A96AC +:20F8A00061BDF429260343D601BDF3D53404BDF8438E004ABDF2538D363502461025FDB217 +:20F8C000398138AA3B29077134583E5674167EB31B772FEEE3857A1D841C2A7C6359580AC3 +:20F8E0007E75FDE7C6803172181081000000008EF8C1BDF253BDF3B8964F818825037EF268 +:20F90000E5BDF47796018B8127F44A34028E0040BDF1428EF8C6BDF6880F623502BDF2D12F +:20F9200039BDF3F62B037EF47703548DF97EF672BDFD5E326286019798BDE4E51025ED8282 +:20F94000BDEF7E1F208300F5D797DC2BBDF555BDF1358E00F4D69826255FBDFA84BDFFB620 +:20F96000250B80303402860A3DEBE020EDC001C90181412605BDF0E520BB814C260B8D312B +:20F980000F98BDF0E520C33262810D260D8D22BDF0E58E00F49F837EE48E814527F1815171 +:20F9A0002606BDF0E57EE4658D0220AD812026108CC6F9A6842708BDE01430015A26F4395C +:20F9C000814426486D8427F78D045A26F7390A97311F3121A621A7A426F839814927138173 +:20F9E00058270D8148265C6F841F108300F5D7978DBFBDFA84810D278E811B2725810826C7 +:20FA0000228C00F427EC8D458DC420E6814326CB6D84270EBDFA84250220F5A7808D375A71 +:20FA200026EE39D697C1F9260220C734106D8026FCE682E701ACE426F83262A7808D170C87 +:20FA40009720AF810826128D045A26FB398C00F427D0301F86087EE014814B270580532782 +:20FA6000013934028D1E3402A68427166D6126068DE430012003BDF9CEA684A1E426E95A73 +:20FA800026E635A0BDE000817F24F9815F2602861B810D270E811B270A8108270681202516 +:20FAA000E31A0139864F978C398600D6791D7EECBBBDEA36DC1F3406BDEB1EBDEA333506DA +:20FAC0001E109C1F26517EECBB9D7CBDEA36BDEB1E3410EC02109321230493272312E6846F +:20FAE000BDED343410AE62BDEE0A3550AF423440BDEEFF34045D271FC6FF81292703BDEE6C +:20FB0000FF3404BDEA33C6AEBDEA3B8D2E1F13AE62A684A06124037EEC114CA1E42402A716 +:20FB2000E4A6611E89AE025A3A4D270DA1E42302A6E41F891E31BDE1F13596BDE9227EEEB5 +:20FB40001BBDEA36BDEED23404BDEA39BDE922BDEA3396062605BDEED52003BDEE6B3404BE +:20FB6000E661BDECD635062705A7805A26FB7EEE62BDEA36BDE922C601340496062610BDB5 +:20FB8000EED5E7E42791BDEA39BDE922BDE9129E523410BDEA39BDFB3B3414BDEA33AE6385 +:20FBA000BDEE203404E1662523A661271CE6665A3A3184EE62E661A6E4A0664CA161250C2E +:20FBC000A680A1C0260C5A26F7E666215F32677EECBA6C66302120D98126265C32620F5232 +:20FBE0000F538E00529D7C814F2712814827239D82200C81381022EE4AC6038D2A9D7C2562 +:20FC0000F20F500F510F060F630F54C6A0D74F7EF1A59D7C250BBDEB6925E6814724E280F6 +:20FC200007C6048D0220EB680169841025F5EC5A26F58030AB01A7013935400F069E839DF3 +:20FC40007C8126279981B0275E81FF26089D7C8183102700AB9F836EC49E68300126D9C60E +:20FC6000167EE446AE9F00838CFF83102700748D238DE6BDEA36C680D708BDEB1E8D25BDE3 +:20FC8000EA33C6AEBDEA3B9E4BDC83ED84DC39ED027EE6D0C6B0BDEA3BC680D7088A80BDBC +:20FCA000EB239F4B7EE90F8DEB3410BDEA2E8DF43540C632AE4227A9109E83EEC4DF83A6AC +:20FCC000043402EC84EE023476BDF3BEBDE90D3576ED84EF023502A7049D821026ED64101A +:20FCE0009F83399D7C8D0934108D2D3540AFC4395F9D7C240680301F899D7C9E8D583A39D2 +:20FD00008DEEAE843410BDEA2E8E004F96062707BDEE1E9E52960639C6AEBDEA3B7EEF0421 +:20FD20001027EEEDBDE757BDE4E59F939D82271081A7263B9D7C27048D24200486FF972BBF +:20FD4000DE938CEEC4ECC42706EC42932B23F49E938D15BDE5059E93BDE4D57EE465BDE788 +:20FD6000577EE1FAA6C0A78011931B26F79F1B39BDFC599D7C8122260BBDEA10C63BBDEA19 +:20FD80003BBDF128327EBDE80C3262BDEB1E9F3BBDE9128E00F34FBDECE37EE794BDE757B5 +:20FDA0009E2B399E919F2B7EE4E5BDE50ACC000ADD95DD8F5FDD919D8224068DE09F959D4D +:20FDC00082271BBDEA3924068DD39F919D82270EBDEA3924068DC69F8F2749BDE1FA8DC38E +:20FDE0009F939E958DBF9C93253A8D1CBDFE7EBDE4D38DAF9F938D3A8D0F8D36BDFF19BD48 +:20FE0000E50ABDE4D37EE465864F97989E93DC958D150D982602ED02AE848D0BD38F25045F +:20FE200081FA25EE7EEC113406EC84350626023262399E19301F30018DED30033001A684A0 +:20FE400027F49F0F4A270C4A272A4A26EF8603A78020E7EC016A0227014FE6036A0427015C +:20FE60005FED01DD2BBDE4E59E0F25E1DC476C80ED8420C66F84AE01AE029F4720EA9E1995 +:20FE800020049E8330018D9F300230019F839D7C4D27EF2AF99E8381FF27EF81A227128108 +:20FEA00084270E818126E79D7C81A0270481A126DB9D7C25049D8220D79E833410BDE7573A +:20FEC0009E83A682BDFFB625F930011F10E061C0052720250A3384503085BDFD6820149FBC +:20FEE000479E1B9F435030859F419F1BBDE41E9E459F8335108601A784A702A704D62B264B +:20FF000004C6016C02E701D62C2604C6016C04E7039D82812C279A209C9E19301F3001EC07 +:20FF200002DD68BDFE2730033001A68427EF4A271B800226F334108EFF76BDF125AEE4EC35 +:20FF400001BDF555BDF54EBDF0E535103410EC01DD52BDFC01BDF5623540C6053001A684F9 +:20FF600027055AA7C020F530C45D27BE31C433C5BDFD6830A420B3554C2000BDEF078E0190 +:20FF8000F0C60434045F860408530952594A26F85D260AA6E44A27058C01F0270CCB30C116 +:20FFA000392302CB07E7806F8435045A26D532628E01EF7EECDF81302504803A80C639813A +:20FFC000891027FDAB7EEA43FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:20FFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000009B009E00AA00A700A100A4E0481A diff --git a/ROMS/6809/basic.lst b/ROMS/6809/basic.lst new file mode 100644 index 0000000..dba4335 --- /dev/null +++ b/ROMS/6809/basic.lst @@ -0,0 +1,4818 @@ +0001 +0002 ffd0 UART EQU $FFD0 +0003 ffd1 RECEV EQU UART+1 +0004 ffd1 TRANS EQU UART+1 +0005 ffd0 USTAT EQU UART +0006 ffd0 UCTRL EQU UART +0007 +0008 0008 BS EQU 8 BACKSPACE +0009 000d CR EQU $D ENTER KEY +0010 001b ESC EQU $1B ESCAPE CODE +0011 0020 SPACE EQU $20 SPACE (BLANK) +0012 003a STKBUF EQU 58 STACK BUFFER ROOM +0013 00fa LBUFMX EQU 250 MAX NUMBER OF CHARS IN A BASIC LINE +0014 00fa MAXLIN EQU $FA MAXIMUM MS BYTE OF LINE NUMBER +0015 * PSEUDO OPS +0016 0021 SKP1 EQU $21 OP CODE OF BRN � SKIP ONE BYTE +0017 008c SKP2 EQU $8C OP CODE OF CMPX # - SKIP TWO BYTES +0018 0086 SKP1LD EQU $86 OP CODE OF LDA # - SKIP THE NEXT BYTE +0019 * AND LOAD THE VALUE OF THAT BYTE INTO ACCA � THIS +0020 * IS USUALLY USED TO LOAD ACCA WITH A NON ZERO VALUE +0021 0095 RTS_LOW EQU $95 +0022 0000 ORG 0 +0023 0000 ENDFLG RMB 1 STOP/END FLAG: POSITIVE=STOP, NEG=END +0024 0001 CHARAC RMB 1 TERMINATOR FLAG 1 +0025 0002 ENDCHR RMB 1 TERMINATOR FLAG 2 +0026 0003 TMPLOC RMB 1 SCRATCH VARIABLE +0027 0004 IFCTR RMB 1 IF COUNTER - HOW MANY IF STATEMENTS IN A LINE +0028 0005 DIMFLG RMB 1 *DV* ARRAY FLAG 0=EVALUATE, 1=DIMENSIONING +0029 0006 VALTYP RMB 1 *DV* *PV TYPE FLAG: 0=NUMERIC, $FF=STRING +0030 0007 GARBFL RMB 1 *TV STRING SPACE HOUSEKEEPING FLAG +0031 0008 ARYDIS RMB 1 DISABLE ARRAY SEARCH: 00=ALLOW SEARCH +0032 0009 INPFLG RMB 1 *TV INPUT FLAG: READ=0, INPUT<>0 +0033 000a RELFLG RMB 1 *TV RELATIONAL OPERATOR FLAG +0034 000b TEMPPT RMB 2 *PV TEMPORARY STRING STACK POINTER +0035 000d LASTPT RMB 2 *PV ADDR OF LAST USED STRING STACK ADDRESS +0036 000f TEMPTR RMB 2 TEMPORARY POINTER +0037 0011 TMPTR1 RMB 2 TEMPORARY DESCRIPTOR STORAGE (STACK SEARCH) +0038 0013 FPA2 RMB 4 FLOATING POINT ACCUMULATOR #2 MANTISSA +0039 0017 BOTSTK RMB 2 BOTTOM OF STACK AT LAST CHECK +0040 0019 TXTTAB RMB 2 *PV BEGINNING OF BASIC PROGRAM +0041 001b VARTAB RMB 2 *PV START OF VARIABLES +0042 001d ARYTAB RMB 2 *PV START OF ARRAYS +0043 001f ARYEND RMB 2 *PV END OF ARRAYS (+1) +0044 0021 FRETOP RMB 2 *PV START OF STRING STORAGE (TOP OF FREE RAM) +0045 0023 STRTAB RMB 2 *PV START OF STRING VARIABLES +0046 0025 FRESPC RMB 2 UTILITY STRING POINTER +0047 0027 MEMSIZ RMB 2 *PV TOP OF STRING SPACE +0048 0029 OLDTXT RMB 2 SAVED LINE NUMBER DURING A "STOP" +0049 002b BINVAL RMB 2 BINARY VALUE OF A CONVERTED LINE NUMBER +0050 002d OLDPTR RMB 2 SAVED INPUT PTR DURING A "STOP" +0051 002f TINPTR RMB 2 TEMPORARY INPUT POINTER STORAGE +0052 0031 DATTXT RMB 2 *PV 'DATA' STATEMENT LINE NUMBER POINTER +0053 0033 DATPTR RMB 2 *PV 'DATA' STATEMENT ADDRESS POINTER +0054 0035 DATTMP RMB 2 DATA POINTER FOR 'INPUT' & 'READ' +0055 0037 VARNAM RMB 2 *TV TEMP STORAGE FOR A VARIABLE NAME +0056 0039 VARPTR RMB 2 *TV POINTER TO A VARIABLE DESCRIPTOR +0057 003b VARDES RMB 2 TEMP POINTER TO A VARIABLE DESCRIPTOR +0058 003d RELPTR RMB 2 POINTER TO RELATIONAL OPERATOR PROCESSING ROUTINE +0059 003f TRELFL RMB 1 TEMPORARY RELATIONAL OPERATOR FLAG BYTE +0060 * FLOATING POINT ACCUMULATORS #3,4 & 5 ARE MOSTLY +0061 * USED AS SCRATCH PAD VARIABLES. +0062 ** FLOATING POINT ACCUMULATOR #3 :PACKED: ($40-$44) +0063 0040 V40 RMB 1 +0064 0041 V41 RMB 1 +0065 0042 V42 RMB 1 +0066 0043 V43 RMB 1 +0067 0044 V44 RMB 1 +0068 ** FLOATING POINT ACCUMULATOR #4 :PACKED: ($45-$49) +0069 0045 V45 RMB 1 +0070 0046 V46 RMB 1 +0071 0047 V47 RMB 1 +0072 0048 V48 RMB 2 +0073 ** FLOATING POINT ACCUMULATOR #5 :PACKED: ($4A�$4E) +0074 004a V4A RMB 1 +0075 004b V4B RMB 2 +0076 004d V4D RMB 2 +0077 ** FLOATING POINT ACCUMULATOR #0 +0078 004f FP0EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #0 EXPONENT +0079 0050 FPA0 RMB 4 *PV FLOATING POINT ACCUMULATOR #0 MANTISSA +0080 0054 FP0SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #0 SIGN +0081 0055 COEFCT RMB 1 POLYNOMIAL COEFFICIENT COUNTER +0082 0056 STRDES RMB 5 TEMPORARY STRING DESCRIPTOR +0083 005b FPCARY RMB 1 FLOATING POINT CARRY BYTE +0084 ** FLOATING POINT ACCUMULATOR #1 +0085 005c FP1EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #1 EXPONENT +0086 005d FPA1 RMB 4 *PV FLOATING POINT ACCUMULATOR #1 MANTISSA +0087 0061 FP1SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #1 SIGN +0088 0062 RESSGN RMB 1 SIGN OF RESULT OF FLOATING POINT OPERATION +0089 0063 FPSBYT RMB 1 FLOATING POINT SUB BYTE (FIFTH BYTE) +0090 0064 COEFPT RMB 2 POLYNOMIAL COEFFICIENT POINTER +0091 0066 LSTTXT RMB 2 CURRENT LINE POINTER DURING LIST +0092 0068 CURLIN RMB 2 *PV CURRENT LINE # OF BASIC PROGRAM, $FFFF = DIRECT +0093 006a DEVCFW RMB 1 *TV TAB FIELD WIDTH +0094 006b DEVLCF RMB 1 *TV TAB ZONE +0095 006c DEVPOS RMB 1 *TV PRINT POSITION +0096 006d DEVWID RMB 1 *TV PRINT WIDTH +0097 006e RSTFLG RMB 1 *PV WARM START FLAG: $55=WARM, OTHER=COLD +0098 006f RSTVEC RMB 2 *PV WARM START VECTOR - JUMP ADDRESS FOR WARM START +0099 0071 TOPRAM RMB 2 *PV TOP OF RAM +0100 0073 IKEYIM RMB 1 *TV INKEY$ RAM IMAGE +0101 0074 ZERO RMB 2 *PV DUMMY - THESE TWO BYTES ARE ALWAYS ZERO +0102 * THE FOLLOWING BYTES ARE MOVED DOWN FROM ROM +0103 0076 LPTCFW RMB 1 16 +0104 0077 LPTLCF RMB 1 112 +0105 0078 LPTWID RMB 1 132 +0106 0079 LPTPOS RMB 1 0 +0107 007a EXECJP RMB 2 LB4AA +0108 +0109 * THIS ROUTINE PICKS UP THE NEXT INPUT CHARACTER FROM +0110 * BASIC. THE ADDRESS OF THE NEXT BASIC BYTE TO BE +0111 * INTERPRETED IS STORED AT CHARAD. +0112 007c 0c 84 GETNCH INC 7372800 / 4 / 16 = 115200 +0303 e0d9 b7 ff d0 STA UCTRL +0304 e0dc 8e e1 2a LDX #LA147-1 POINT X TO COLOR BASIC COPYRIGHT MESSAGE +0305 e0df bd f1 25 JSR LB99C PRINT �COLOR BASIC� +0306 e0e2 8e e0 ed LDX #BAWMST WARM START ADDRESS +0307 e0e5 9f 6f STX RSTVEC SAVE IT +0308 e0e7 86 55 LDA #$55 WARM START FLAG +0309 e0e9 97 6e STA RSTFLG SAVE IT +0310 e0eb 20 04 BRA LA0F3 GO TO BASIC�S MAIN LOOP +0311 e0ed 12 BAWMST NOP NOP REQ�D FOR WARM START +0312 e0ee bd e5 17 JSR LAD33 DO PART OF A NEW +0313 e0f1 7e e4 65 LA0F3 JMP LAC73 GO TO MAIN LOOP OF BASIC +0314 * +0315 * FIRQ SERVICE ROUTINE +0316 BFRQSV +0317 e0f4 3b RTI +0318 * +0319 * THESE BYTES ARE MOVED TO ADDRESSES $76 - $85 THE DIRECT PAGE +0320 e0f5 10 LA10D FCB 16 TAB FIELD WIDTH +0321 e0f6 40 FCB 64 LAST TAB ZONE +0322 e0f7 ff FCB 255 PRINTER WIDTH +0323 e0f8 00 FCB 0 LINE PRINTER POSITION +0324 e0f9 ec 11 FDB LB44A ARGUMENT OF EXEC COMMAND - SET TO �FC� ERROR +0325 * LINE INPUT ROUTINE +0326 e0fb 0c 84 INC CHARAD+1 +0327 e0fd 26 02 BNE LA123 +0328 e0ff 0c 83 INC CHARAD +0329 e101 b6 00 00 LA123 LDA >0000 +0330 e104 7e e2 02 JMP BROMHK +0331 * +0332 * THESE BYTES ARE MOVED TO ADDRESSES $A7-$B1 +0333 e107 7e e2 01 JMP BIRQSV IRQ SERVICE +0334 e10a 7e e0 f4 JMP BFRQSV FIRQ SERVICE +0335 e10d 7e ec 11 JMP LB44A USR ADDRESS FOR 8K BASIC (INITIALIZED TO �FC� ERROR) +0336 e110 80 FCB $80 *RANDOM SEED +0337 e111 4f c7 FDB $4FC7 *RANDON SEED OF MANTISSA +0338 e113 52 59 FDB $5259 *.811635157 +0339 * BASIC COMMAND INTERPRETATION TABLE ROM IMAGE +0340 e115 32 COMVEC FCB 50 50 BASIC COMMANDS +0341 e116 e2 60 FDB LAA66 POINTS TO RESERVED WORDS +0342 e118 e3 6d FDB LAB67 POINTS TO JUMP TABLE FOR COMMANDS +0343 e11a 1d FCB 29 29 BASIC SECONDARY COMMANDS +0344 e11b e3 00 FDB LAB1A POINTS TO SECONDARY FUNCTION RESERVED WORDS +0345 e11d e2 11 FDB LAA29 POINTS TO SECONDARY FUNCTION JUMP TABLE +0346 e11f 00 00 FDB 0 NO MORE TABLES (RES WORDS=0) +0347 e121 00 00 FDB 0 NO MORE TABLES +0348 e123 00 00 FDB 0 NO MORE TABLES +0349 e125 00 00 FDB 0 NO MORE TABLES +0350 e127 00 00 FDB 0 NO MORE TABLES +0351 e129 00 00 FDB 0 NO MORE TABLES (SECONDARY FNS =0) +0352 +0353 * COPYRIGHT MESSAGES +0354 e12b 36 38 30 39 20 45 LA147 FCC "6809 EXTENDED BASIC" + 58 54 45 4e 44 45 + 44 20 42 41 53 49 + 43 +0355 e13e 0d FCB CR +0356 e13f 28 43 29 20 31 39 FCC "(C) 1982 BY MICROSOFT" + 38 32 20 42 59 20 + 4d 49 43 52 4f 53 + 4f 46 54 +0357 e154 0d 0d LA156 FCB CR,CR +0358 e156 00 LA165 FCB $00 +0359 +0360 e157 43 4f 4c 44 20 4f PROMPT FCC "COLD OR WARM START (C/W)? " + 52 20 57 41 52 4d + 20 53 54 41 52 54 + 20 28 43 2f 57 29 + 3f 20 +0361 e171 0d FCB CR +0362 e172 00 FCB $00 +0363 +0364 e173 34 16 LA35F PSHS X,B,A SAVE REGISTERS +0365 e175 9e 76 LDX LPTCFW TAB FIELD WIDTH AND TAB ZONE +0366 e177 dc 78 LDD LPTWID PRINTER WIDTH AND POSITION +0367 e179 9f 6a LA37C STX DEVCFW SAVE TAB FIELD WIDTH AND ZONE +0368 e17b d7 6c STB DEVPOS SAVE PRINT POSITION +0369 e17d 97 6d STA DEVWID SAVE PRINT WIDTH +0370 e17f 35 96 PULS A,B,X,PC RESTORE REGISTERS +0371 +0372 * THIS IS THE ROUTINE THAT GETS AN INPUT LINE FOR BASIC +0373 * EXIT WITH BREAK KEY: CARRY = 1 +0374 * EXIT WITH ENTER KEY: CARRY = 0 +0375 LA38D +0376 e181 0f 73 LA390 CLR IKEYIM RESET BREAK CHECK KEY TEMP KEY STORAGE +0377 e183 8e 00 f4 LDX #LINBUF+1 INPUT LINE BUFFER +0378 e186 c6 01 LDB #1 ACCB CHAR COUNTER: SET TO 1 TO ALLOW A +0379 * BACKSPACE AS FIRST CHARACTER +0380 e188 bd e0 00 LA39A JSR LA171 GO GET A CHARACTER FROM CONSOLE IN +0381 e18b 81 08 CMPA #BS BACKSPACE +0382 e18d 26 07 BNE LA3B4 NO +0383 e18f 5a DECB YES - DECREMENT CHAR COUNTER +0384 e190 27 ef BEQ LA390 BRANCH IF BACK AT START OF LINE AGAIN +0385 e192 30 1f LEAX -1,X DECREMENT BUFFER POINTER +0386 e194 20 34 BRA LA3E8 ECHO CHAR TO SCREEN +0387 e196 81 15 LA3B4 CMPA #$15 SHIFT RIGHT ARROW? +0388 e198 26 0a BNE LA3C2 NO +0389 * YES, RESET BUFFER TO BEGINNING AND ERASE CURRENT LINE +0390 e19a 5a LA3B8 DECB DEC CHAR CTR +0391 e19b 27 e4 BEQ LA390 GO BACK TO START IF CHAR CTR = 0 +0392 e19d 86 08 LDA #BS BACKSPACE? +0393 e19f bd e0 14 JSR PUTCHR SEND TO CONSOLE OUT (SCREEN) +0394 e1a2 20 f6 BRA LA3B8 KEEP GOING +0395 e1a4 81 03 LA3C2 CMPA #3 BREAK KEY? +0396 e1a6 1a 01 ORCC #1 SET CARRY FLAG +0397 e1a8 27 05 BEQ LA3CD BRANCH IF BREAK KEY DOWN +0398 e1aa 81 0d LA3C8 CMPA #CR ENTER KEY? +0399 e1ac 26 0d BNE LA3D9 NO +0400 e1ae 4f LA3CC CLRA CLEAR CARRY FLAG IF ENTER KEY - END LINE ENTRY +0401 e1af 34 01 LA3CD PSHS CC SAVE CARRY FLAG +0402 e1b1 bd f0 e5 JSR LB958 SEND CR TO SCREEN +0403 e1b4 6f 84 CLR ,X MAKE LAST BYTE IN INPUT BUFFER = 0 +0404 e1b6 8e 00 f3 LDX #LINBUF RESET INPUT BUFFER POINTER +0405 e1b9 35 81 PULS CC,PC RESTORE CARRY FLAG +0406 +0407 * INSERT A CHARACTER INTO THE BASIC LINE INPUT BUFFER +0408 e1bb 81 20 LA3D9 CMPA #$20 IS IT CONTROL CHAR? +0409 e1bd 25 c9 BLO LA39A BRANCH IF CONTROL CHARACTER +0410 e1bf 81 7b CMPA #'z+1 * +0411 e1c1 24 c5 BCC LA39A * IGNORE IF > LOWER CASE Z +0412 e1c3 c1 fa CMPB #LBUFMX HAVE 250 OR MORE CHARACTERS BEEN ENTERED? +0413 e1c5 24 c1 BCC LA39A YES, IGNORE ANY MORE +0414 e1c7 a7 80 STA ,X+ PUT IT IN INPUT BUFFER +0415 e1c9 5c INCB INCREMENT CHARACTER COUNTER +0416 e1ca bd e0 14 LA3E8 JSR PUTCHR ECHO IT TO SCREEN +0417 e1cd 20 b9 BRA LA39A GO SET SOME MORE +0418 +0419 +0420 * EXEC +0421 e1cf 27 05 EXEC BEQ LA545 BRANCH IF NO ARGUMENT +0422 e1d1 bd ef 04 JSR LB73D EVALUATE ARGUMENT - ARGUMENT RETURNED IN X +0423 e1d4 9f 7a STX EXECJP STORE X TO EXEC JUMP ADDRESS +0424 e1d6 6e 9f 00 7a LA545 JMP [EXECJP] GO DO IT +0425 +0426 * BREAK CHECK +0427 e1da 7e e5 e6 LA549 JMP LADEB GO DO BREAK KEY CHECK +0428 +0429 * INKEY$ +0430 e1dd 96 73 INKEY LDA IKEYIM WAS A KEY DOWN IN THE BREAK CHECK? +0431 e1df 26 03 BNE LA56B YES +0432 e1e1 bd e0 05 JSR KEYIN GO GET A KEY +0433 e1e4 0f 73 LA56B CLR IKEYIM CLEAR INKEY RAM IMAGE +0434 e1e6 97 53 STA FPA0+3 STORE THE KEY IN FPA0 +0435 e1e8 10 26 0c 6a LBNE LB68F CONVERT FPA0+3 TO A STRING +0436 e1ec 97 56 STA STRDES SET LENGTH OF STRING = 0 IF NO KEY DOWN +0437 e1ee 7e ee 62 JMP LB69B PUT A NULL STRING ONTO THE STRING STACK +0438 +0439 * MOVE ACCB BYTES FROM (X) TO (U) +0440 e1f1 a6 80 LA59A LDA ,X+ GET BYTE FROM X +0441 e1f3 a7 c0 STA ,U+ STORE IT AT U +0442 e1f5 5a DECB MOVED ALL BYTES? +0443 e1f6 26 f9 BNE LA59A NO +0444 e1f8 39 LA5A1 RTS +0445 +0446 e1f9 39 LA5C4 RTS +0447 +0448 ** THIS ROUTINE WILL SCAN OFF THE FILE NAME FROM A BASIC LINE +0449 ** AND RETURN A SYNTAX ERROR IF THERE ARE ANY CHARACTERS +0450 ** FOLLOWING THE END OF THE NAME +0451 e1fa 9d 82 LA5C7 JSR GETCCH GET CURRENT INPUT CHAR FROM BASIC LINE +0452 e1fc 27 fb LA5C9 BEQ LA5C4 RETURN IF END OF LINE +0453 e1fe 7e ea 43 JMP LB277 SYNTAX ERROR IF ANY MORE CHARACTERS +0454 * IRQ SERVICE +0455 BIRQSV +0456 e201 3b LA9C5 RTI RETURN FROM INTERRUPT +0457 +0458 * SET CARRY IF NUMERIC - RETURN WITH +0459 * ZERO FLAG SET IF ACCA = 0 OR 3A(:) - END +0460 * OF BASIC LINE OR SUB LINE +0461 e202 81 3a BROMHK CMPA #'9+1 IS THIS CHARACTER >=(ASCII 9)+1? +0462 e204 24 0a BHS LAA28 BRANCH IF > 9; Z SET IF = COLON +0463 e206 81 20 CMPA #SPACE SPACE? +0464 e208 26 02 BNE LAA24 NO - SET CARRY IF NUMERIC +0465 e20a 0e 7c JMP GETNCH IF SPACE, GET NECT CHAR (IGNORE SPACES) +0466 e20c 80 30 LAA24 SUBA #'0 * SET CARRY IF +0467 e20e 80 d0 SUBA #-'0 * CHARACTER > ASCII 0 +0468 e210 39 LAA28 RTS +0469 +0470 * DISPATCH TABLE FOR SECONDARY FUNCTIONS +0471 * TOKENS ARE PRECEEDED BY $FF +0472 * FIRST SET ALWAYS HAS ONE PARAMETER +0473 FUNC_TAB +0474 e211 f4 03 LAA29 FDB SGN SGN +0475 e213 f4 77 FDB INT INT +0476 e215 f4 1c FDB ABS ABS +0477 e217 00 ad FDB USRJMP USR +0478 0083 TOK_USR EQU *-FUNC_TAB/2+$7F +0479 ff83 TOK_FF_USR EQU *-FUNC_TAB/2+$FF7F +0480 e219 f6 a8 FDB RND RND +0481 e21b f6 fd FDB SIN SIN +0482 e21d ef 17 FDB PEEK PEEK +0483 e21f ee 48 FDB LEN LEN +0484 e221 ec c4 FDB STR STR$ +0485 e223 ee dd FDB VAL VAL +0486 e225 ee 67 FDB ASC ASC +0487 e227 ee 53 FDB CHR CHR$ +0488 e229 f7 ad FDB ATN ATN +0489 e22b f7 75 FDB COS COS +0490 e22d f7 7e FDB TAN TAN +0491 e22f f8 ef FDB EXP EXP +0492 e231 f9 21 FDB FIX FIX +0493 e233 f8 43 FDB LOG LOG +0494 e235 fa a9 FDB POS POS +0495 e237 f8 7d FDB SQR SQR +0496 e239 ff 7b FDB HEXDOL HEX$ +0497 * LEFT, RIGHT AND MID ARE TREATED SEPARATELY +0498 e23b ee 72 FDB LEFT LEFT$ +0499 0095 TOK_LEFT EQU *-FUNC_TAB/2+$7F +0500 e23d ee 8f FDB RIGHT RIGHT$ +0501 e23f ee 96 FDB MID MID$ +0502 0097 TOK_MID EQU *-FUNC_TAB/2+$7F +0503 * REMAINING FUNCTIONS +0504 e241 e1 dd FDB INKEY INKEY$ +0505 0098 TOK_INKEY EQU *-FUNC_TAB/2+$7F +0506 e243 ec b5 FDB MEM MEM +0507 e245 fa b1 FDB VARPT VARPTR +0508 e247 fb 71 FDB INSTR INSTR +0509 e249 fb 41 FDB STRING STRING$ +0510 001d NUM_SEC_FNS EQU *-FUNC_TAB/2 +0511 +0512 * THIS TABLE CONTAINS PRECEDENCES AND DISPATCH ADDRESSES FOR ARITHMETIC +0513 * AND LOGICAL OPERATORS - THE NEGATION OPERATORS DO NOT ACT ON TWO OPERANDS +0514 * S0 THEY ARE NOT LISTED IN THIS TABLE. THEY ARE TREATED SEPARATELY IN THE +0515 * EXPRESSION EVALUATION ROUTINE. THEY ARE: +0516 * UNARY NEGATION (-), PRECEDENCE &7D AND LOGICAL NEGATION (NOT), PRECEDENCE $5A +0517 * THE RELATIONAL OPERATORS < > = ARE ALSO NOT LISTED, PRECEDENCE $64. +0518 * A PRECEDENCE VALUE OF ZERO INDICATES END OF EXPRESSION OR PARENTHESES +0519 * +0520 e24b 79 LAA51 FCB $79 +0521 e24c f1 4e FDB LB9C5 + +0522 e24e 79 FCB $79 +0523 e24f f1 45 FDB LB9BC - +0524 e251 7b FCB $7B +0525 e252 f2 55 FDB LBACC * +0526 e254 7b FCB $7B +0527 e255 f3 1a FDB LBB91 / +0528 e257 7f FCB $7F +0529 e258 f8 86 FDB L8489 EXPONENTIATION +0530 e25a 50 FCB $50 +0531 e25b ea 9c FDB LB2D5 AND +0532 e25d 46 FCB $46 +0533 e25e ea 9b FDB LB2D4 OR +0534 +0535 * THIS IS THE RESERVED WORD TABLE +0536 * FIRST PART OF THE TABLE CONTAINS EXECUTABLE COMMANDS +0537 e260 46 4f LAA66 FCC "FO" 80 +0538 e262 d2 FCB $80+'R' +0539 e263 47 FCC "G" 81 +0540 e264 cf FCB $80+'O' +0541 0081 TOK_GO EQU $81 +0542 e265 52 45 FCC "RE" 82 +0543 e267 cd FCB $80+'M' +0544 e268 a7 FCB ''+$80 83 +0545 e269 45 4c 53 FCC "ELS" 84 +0546 e26c c5 FCB $80+'E' +0547 e26d 49 FCC "I" 85 +0548 e26e c6 FCB $80+'F' +0549 e26f 44 41 54 FCC "DAT" 86 +0550 e272 c1 FCB $80+'A' +0551 e273 50 52 49 4e FCC "PRIN" 87 +0552 e277 d4 FCB $80+'T' +0553 e278 4f FCC "O" 88 +0554 e279 ce FCB $80+'N' +0555 e27a 49 4e 50 55 FCC "INPU" 89 +0556 e27e d4 FCB $80+'T' +0557 e27f 45 4e FCC "EN" 8A +0558 e281 c4 FCB $80+'D' +0559 e282 4e 45 58 FCC "NEX" 8B +0560 e285 d4 FCB $80+'T' +0561 e286 44 49 FCC "DI" 8C +0562 e288 cd FCB $80+'M' +0563 e289 52 45 41 FCC "REA" 8D +0564 e28c c4 FCB $80+'D' +0565 e28d 52 55 FCC "RU" 8E +0566 e28f ce FCB $80+'N' +0567 e290 52 45 53 54 4f 52 FCC "RESTOR" 8F +0568 e296 c5 FCB $80+'E' +0569 e297 52 45 54 55 52 FCC "RETUR" 90 +0570 e29c ce FCB $80+'N' +0571 e29d 53 54 4f FCC "STO" 91 +0572 e2a0 d0 FCB $80+'P' +0573 e2a1 50 4f 4b FCC "POK" 92 +0574 e2a4 c5 FCB $80+'E' +0575 e2a5 43 4f 4e FCC "CON" 93 +0576 e2a8 d4 FCB $80+'T' +0577 e2a9 4c 49 53 FCC "LIS" 94 +0578 e2ac d4 FCB $80+'T' +0579 e2ad 43 4c 45 41 FCC "CLEA" 95 +0580 e2b1 d2 FCB $80+'R' +0581 e2b2 4e 45 FCC "NE" 96 +0582 e2b4 d7 FCB $80+'W' +0583 e2b5 45 58 45 FCC "EXE" 97 +0584 e2b8 c3 FCB $80+'C' +0585 e2b9 54 52 4f FCC "TRO" 98 +0586 e2bc ce FCB $80+'N' +0587 e2bd 54 52 4f 46 FCC "TROF" 99 +0588 e2c1 c6 FCB $80+'F' +0589 e2c2 44 45 FCC "DE" 9A +0590 e2c4 cc FCB $80+'L' +0591 e2c5 44 45 FCC "DE" 9B +0592 e2c7 c6 FCB $80+'F' +0593 e2c8 4c 49 4e FCC "LIN" 9C +0594 e2cb c5 FCB $80+'E' +0595 e2cc 52 45 4e 55 FCC "RENU" 9D +0596 e2d0 cd FCB $80+'M' +0597 e2d1 45 44 49 FCC "EDI" 9E +0598 e2d4 d4 FCB $80+'T' +0599 * END OF EXECUTABLE COMMANDS. THE REMAINDER OF THE TABLE ARE NON-EXECUTABLE TOKENS +0600 e2d5 54 41 42 FCC "TAB" 9F +0601 e2d8 a8 FCB $80+'(' +0602 009f TOK_TAB EQU $9F +0603 e2d9 54 FCC "T" A0 +0604 e2da cf FCB $80+'O' +0605 00a0 TOK_TO EQU $A0 +0606 e2db 53 55 FCC "SU" A1 +0607 e2dd c2 FCB $80+'B' +0608 00a1 TOK_SUB EQU $A1 +0609 e2de 54 48 45 FCC "THE" A2 +0610 e2e1 ce FCB $80+'N' +0611 00a2 TOK_THEN EQU $A2 +0612 e2e2 4e 4f FCC "NO" A3 +0613 e2e4 d4 FCB $80+'T' +0614 00a3 TOK_NOT EQU $A3 +0615 e2e5 53 54 45 FCC "STE" A4 +0616 e2e8 d0 FCB $80+'P' +0617 00a4 TOK_STEP EQU $A4 +0618 e2e9 4f 46 FCC "OF" A5 +0619 e2eb c6 FCB $80+'F' +0620 e2ec ab FCB '++$80 A6 +0621 00a6 TOK_PLUS EQU $A6 +0622 e2ed ad FCB '-+$80 A7 +0623 00a7 TOK_MINUS EQU $A7 +0624 e2ee aa FCB '*+$80 A8 +0625 e2ef af FCB '/+$80 A9 +0626 e2f0 de FCB '^+$80 AA +0627 e2f1 41 4e FCC "AN" AB +0628 e2f3 c4 FCB $80+'D' +0629 e2f4 4f FCC "O" AC +0630 e2f5 d2 FCB $80+'R' +0631 e2f6 be FCB '>+$80 AD +0632 00ad TOK_GREATER EQU $AD +0633 e2f7 bd FCB '=+$80 AE +0634 00ae TOK_EQUALS EQU $AE +0635 e2f8 bc FCB '<+$80 AF +0636 e2f9 46 FCC "F" B0 +0637 e2fa ce FCB $80+'N' +0638 00b0 TOK_FN EQU $B0 +0639 e2fb 55 53 49 4e FCC "USIN" B1 +0640 e2ff c7 FCB $80+'G' +0641 * +0642 +0643 * FIRST SET ALWAYS HAS ONE PARAMETER +0644 e300 53 47 LAB1A FCC "SG" 80 +0645 e302 ce FCB $80+'N' +0646 e303 49 4e FCC "IN" 81 +0647 e305 d4 FCB $80+'T' +0648 e306 41 42 FCC "AB" 82 +0649 e308 d3 FCB $80+'S' +0650 e309 55 53 FCC "US" 83 +0651 e30b d2 FCB $80+'R' +0652 e30c 52 4e FCC "RN" 84 +0653 e30e c4 FCB $80+'D' +0654 e30f 53 49 FCC "SI" 85 +0655 e311 ce FCB $80+'N' +0656 e312 50 45 45 FCC "PEE" 86 +0657 e315 cb FCB $80+'K' +0658 e316 4c 45 FCC "LE" 87 +0659 e318 ce FCB $80+'N' +0660 e319 53 54 52 FCC "STR" 88 +0661 e31c a4 FCB $80+'$' +0662 e31d 56 41 FCC "VA" 89 +0663 e31f cc FCB $80+'L' +0664 e320 41 53 FCC "AS" 8A +0665 e322 c3 FCB $80+'C' +0666 e323 43 48 52 FCC "CHR" 8B +0667 e326 a4 FCB $80+'$' +0668 e327 41 54 FCC "AT" 8C +0669 e329 ce FCB $80+'N' +0670 e32a 43 4f FCC "CO" 8D +0671 e32c d3 FCB $80+'S' +0672 e32d 54 41 FCC "TA" 8E +0673 e32f ce FCB $80+'N' +0674 e330 45 58 FCC "EX" 8F +0675 e332 d0 FCB $80+'P' +0676 e333 46 49 FCC "FI" 90 +0677 e335 d8 FCB $80+'X' +0678 e336 4c 4f FCC "LO" 91 +0679 e338 c7 FCB $80+'G' +0680 e339 50 4f FCC "PO" 92 +0681 e33b d3 FCB $80+'S' +0682 e33c 53 51 FCC "SQ" 93 +0683 e33e d2 FCB $80+'R' +0684 e33f 48 45 58 FCC "HEX" 94 +0685 e342 a4 FCB $80+'$' +0686 * LEFT, RIGHT AND MID ARE TREATED SEPARATELY +0687 e343 4c 45 46 54 FCC "LEFT" 95 +0688 e347 a4 FCB $80+'$' +0689 e348 52 49 47 48 54 FCC "RIGHT" 96 +0690 e34d a4 FCB $80+'$' +0691 e34e 4d 49 44 FCC "MID" 97 +0692 e351 a4 FCB $80+'$' +0693 * REMAINING FUNCTIONS +0694 e352 49 4e 4b 45 59 FCC "INKEY" 98 +0695 e357 a4 FCB $80+'$' +0696 e358 4d 45 FCC "ME" 99 +0697 e35a cd FCB $80+'M' +0698 e35b 56 41 52 50 54 FCC "VARPT" 9A +0699 e360 d2 FCB $80+'R' +0700 e361 49 4e 53 54 FCC "INST" 9B +0701 e365 d2 FCB $80+'R' +0702 e366 53 54 52 49 4e 47 FCC "STRING" 9C +0703 e36c a4 FCB $80+'$' +0704 +0705 * +0706 * DISPATCH TABLE FOR COMMANDS TOKEN # +0707 CMD_TAB +0708 e36d e5 2b LAB67 FDB FOR 80 +0709 e36f e6 76 FDB GO 81 +0710 e371 e6 d3 FDB REM 82 +0711 0082 TOK_REM EQU *-CMD_TAB/2+$7F +0712 e373 e6 d3 FDB REM 83 (') +0713 0083 TOK_SNGL_Q EQU *-CMD_TAB/2+$7F +0714 e375 e6 d3 FDB REM 84 (ELSE) +0715 0084 TOK_ELSE EQU *-CMD_TAB/2+$7F +0716 e377 e7 04 FDB IF 85 +0717 0085 TOK_IF EQU *-CMD_TAB/2+$7F +0718 e379 e6 d0 FDB DATA 86 +0719 0086 TOK_DATA EQU *-CMD_TAB/2+$7F +0720 e37b f0 ad FDB PRINT 87 +0721 0087 TOK_PRINT EQU *-CMD_TAB/2+$7F +0722 e37d e7 32 FDB ON 88 +0723 e37f e7 df FDB INPUT 89 +0724 0089 TOK_INPUT EQU *-CMD_TAB/2+$7F +0725 e381 e5 fd FDB END 8A +0726 e383 e8 c4 FDB NEXT 8B +0727 e385 eb 15 FDB DIM 8C +0728 e387 e8 19 FDB READ 8D +0729 e389 e6 6b FDB RUN 8E +0730 e38b e5 df FDB RESTOR 8F +0731 e38d e6 b0 FDB RETURN 90 +0732 e38f e6 01 FDB STOP 91 +0733 e391 ef 1e FDB POKE 92 +0734 e393 e6 26 FDB CONT 93 +0735 e395 ef 25 FDB LIST 94 +0736 e397 e6 37 FDB CLEAR 95 +0737 e399 e4 fb FDB NEW 96 +0738 e39b e1 cf FDB EXEC 97 +0739 e39d fa a4 FDB TRON 98 +0740 e39f fa a5 FDB TROFF 99 +0741 e3a1 fd 20 FDB DEL 9A +0742 e3a3 fc 64 FDB DEF 9B +0743 e3a5 ff bf FDB LINE 9C +0744 e3a7 fd aa FDB RENUM 9D +0745 e3a9 f9 30 FDB EDIT 9E +0746 009e TOK_HIGH_EXEC EQU *-CMD_TAB/2+$7F +0747 +0748 * ERROR MESSAGES AND THEIR NUMBERS AS USED INTERNALLY +0749 e3ab 4e 46 LABAF FCC "NF" 0 NEXT WITHOUT FOR +0750 e3ad 53 4e FCC "SN" 1 SYNTAX ERROR +0751 e3af 52 47 FCC "RG" 2 RETURN WITHOUT GOSUB +0752 e3b1 4f 44 FCC "OD" 3 OUT OF DATA +0753 e3b3 46 43 FCC "FC" 4 ILLEGAL FUNCTION CALL +0754 e3b5 4f 56 FCC "OV" 5 OVERFLOW +0755 e3b7 4f 4d FCC "OM" 6 OUT OF MEMORY +0756 e3b9 55 4c FCC "UL" 7 UNDEFINED LINE NUMBER +0757 e3bb 42 53 FCC "BS" 8 BAD SUBSCRIPT +0758 e3bd 44 44 FCC "DD" 9 REDIMENSIONED ARRAY +0759 e3bf 2f 30 FCC "/0" 10 DIVISION BY ZERO +0760 e3c1 49 44 FCC "ID" 11 ILLEGAL DIRECT STATEMENT +0761 e3c3 54 4d FCC "TM" 12 TYPE MISMATCH +0762 e3c5 4f 53 FCC "OS" 13 OUT OF STRING SPACE +0763 e3c7 4c 53 FCC "LS" 14 STRING TOO LONG +0764 e3c9 53 54 FCC "ST" 15 STRING FORMULA TOO COMPLEX +0765 e3cb 43 4e FCC "CN" 16 CAN'T CONTINUE +0766 e3cd 46 44 FCC "FD" 17 BAD FILE DATA +0767 e3cf 41 4f FCC "AO" 18 FILE ALREADY OPEN +0768 e3d1 44 4e FCC "DN" 19 DEVICE NUMBER ERROR +0769 e3d3 49 4f FCC "IO" 20 I/O ERROR +0770 e3d5 46 4d FCC "FM" 21 BAD FILE MODE +0771 e3d7 4e 4f FCC "NO" 22 FILE NOT OPEN +0772 e3d9 49 45 FCC "IE" 23 INPUT PAST END OF FILE +0773 e3db 44 53 FCC "DS" 24 DIRECT STATEMENT IN FILE +0774 * ADDITIONAL ERROR MESSAGES ADDED BY EXTENDED BASIC +0775 e3dd 55 46 L890B FCC "UF" 25 UNDEFINED FUNCTION (FN) CALL +0776 e3df 4e 45 L890D FCC "NE" 26 FILE NOT FOUND +0777 +0778 e3e1 20 45 52 52 4f 52 LABE1 FCC " ERROR" +0779 e3e7 00 FCB $00 +0780 e3e8 20 49 4e 20 LABE8 FCC " IN " +0781 e3ec 00 FCB $00 +0782 e3ed 0d LABED FCB CR +0783 e3ee 4f 4b LABEE FCC "OK" +0784 e3f0 0d 00 FCB CR,$00 +0785 e3f2 0d LABF2 FCB CR +0786 e3f3 42 52 45 41 4b FCC "BREAK" +0787 e3f8 00 FCB $00 +0788 +0789 * SEARCH THE STACK FOR �GOSUB/RETURN� OR �FOR/NEXT� DATA. +0790 * THE �FOR/NEXT� INDEX VARIABLE DESCRIPTOR ADDRESS BEING +0791 * SOUGHT IS STORED IN VARDES. EACH BLOCK OF FOR/NEXT DATA IS 18 +0792 * BYTES WITH A $80 LEADER BYTE AND THE GOSUB/RETURN DATA IS 5 BYTES +0793 * WITH AN $A6 LEADER BYTE. THE FIRST NON "FOR/NEXT" DATA +0794 * IS CONSIDERED �GOSUB/RETURN� +0795 e3f9 30 64 LABF9 LEAX 4,S POINT X TO 3RD ADDRESS ON STACK - IGNORE THE +0796 * FIRST TWO RETURN ADDRESSES ON THE STACK +0797 e3fb c6 12 LABFB LDB #18 18 BYTES SAVED ON STACK FOR EACH �FOR� LOOP +0798 e3fd 9f 0f STX TEMPTR SAVE POINTER +0799 e3ff a6 84 LDA ,X GET 1ST BYTE +0800 e401 80 80 SUBA #$80 * CHECK FOR TYPE OF STACK JUMP FOUND +0801 e403 26 15 BNE LAC1A * BRANCH IF NOT �FOR/NEXT� +0802 e405 ae 01 LDX 1,X = GET INDEX VARIABLE DESCRIPTOR +0803 e407 9f 11 STX TMPTR1 = POINTER AND SAVE IT IN TMPTR1 +0804 e409 9e 3b LDX VARDES GET INDEX VARIABLE BEING SEARCHED FOR +0805 e40b 27 09 BEQ LAC16 BRANCH IF DEFAULT INDEX VARIABLE - USE THE +0806 * FIRST �FOR/NEXT� DATA FOUND ON STACK +0807 * IF NO INDEX VARIABLE AFTER �NEXT� +0808 e40d 9c 11 CMPX TMPTR1 DOES THE STACK INDEX MATCH THE ONE +0809 * BEING SEARCHED FOR? +0810 e40f 27 09 BEQ LAC1A YES +0811 e411 9e 0f LDX TEMPTR * RESTORE INITIAL POINTER, ADD +0812 e413 3a ABX * 18 TO IT AND LOOK FOR +0813 e414 20 e5 BRA LABFB * NEXT BLOCK OF DATA +0814 e416 9e 11 LAC16 LDX TMPTR1 = GET 1ST INDEX VARIABLE FOUND AND +0815 e418 9f 3b STX VARDES = SAVE AS �NEXT� INDEX +0816 e41a 9e 0f LAC1A LDX TEMPTR POINT X TO START OF �FOR/NEXT� DATA +0817 e41c 4d TSTA SET ZERO FLAG IF �FOR/NEXT� DATA +0818 e41d 39 RTS +0819 * CHECK FOR MEMORY SPACE FOR NEW TOP OF +0820 * ARRAYS AND MOVE ARRAYS TO NEW LOCATION +0821 e41e 8d 17 LAC1E BSR LAC37 ACCD = NEW BOTTOM OF FREE RAM - IS THERE +0822 * ROOM FOR THE STACK? +0823 * MOVE BYTES FROM V43(X) TO V41(U) UNTIL (X) = V47 AND +0824 * SAVE FINAL VALUE OF U IN V45 +0825 e420 de 41 LAC20 LDU V41 POINT U TO DESTINATION ADDRESS (V41) +0826 e422 33 41 LEAU 1,U ADD ONE TO U - COMPENSATE FOR FIRST PSHU +0827 e424 9e 43 LDX V43 POINT X TO SOURCE ADDRESS (V43) +0828 e426 30 01 LEAX 1,X ADD ONE - COMPENSATE FOR FIRST LDA ,X +0829 e428 a6 82 LAC28 LDA ,-X GRAB A BYTE FROM SOURCE +0830 e42a 36 02 PSHU A MOVE IT TO DESTINATION +0831 e42c 9c 47 CMPX V47 DONE? +0832 e42e 26 f8 BNE LAC28 NO - KEEP MOVING BYTES +0833 e430 df 45 STU V45 SAVE FINAL DESTINATION ADDRESS +0834 e432 39 LAC32 RTS +0835 * CHECK TO SEE IF THERE IS ROOM TO STORE 2*ACCB +0836 * BYTES IN FREE RAM - OM ERROR IF NOT +0837 e433 4f LAC33 CLRA * ACCD CONTAINS NUMBER OF EXTRA +0838 e434 58 ASLB * BYTES TO PUT ON STACK +0839 e435 d3 1f ADDD ARYEND END OF PROGRAM AND VARIABLES +0840 e437 c3 00 3a LAC37 ADDD #STKBUF ADD STACK BUFFER - ROOM FOR STACK? +0841 e43a 25 08 BCS LAC44 BRANCH IF GREATER THAN $FFFF +0842 e43c 10 df 17 STS BOTSTK CURRENT NEW BOTTOM OF STACK STACK POINTER +0843 e43f 10 93 17 CMPD BOTSTK ARE WE GOING TO BE BELOW STACK? +0844 e442 25 ee BCS LAC32 YES - NO ERROR +0845 e444 c6 0c LAC44 LDB #6*2 OUT OF MEMORY ERROR +0846 +0847 * ERROR SERVICING ROUTINE +0848 e446 bd e5 17 LAC46 JSR LAD33 RESET STACK, STRING STACK, CONTINUE POINTER +0849 e449 bd f0 e9 JSR LB95C SEND A CR TO SCREEN +0850 e44c bd f1 38 JSR LB9AF SEND A �?� TO SCREEN +0851 e44f 8e e3 ab LDX #LABAF POINT TO ERROR TABLE +0852 e452 3a LAC60 ABX ADD MESSAGE NUMBER OFFSET +0853 e453 8d 31 BSR LACA0 * GET TWO CHARACTERS FROM X AND +0854 e455 8d 2f BSR LACA0 * SEND TO CONSOLE OUT (SCREEN) +0855 e457 8e e3 e0 LDX #LABE1-1 POINT TO "ERROR" MESSAGE +0856 e45a bd f1 25 LAC68 JSR LB99C PRINT MESSAGE POINTED TO BY X +0857 e45d 96 68 LDA CURLIN GET CURRENT LINE NUMBER (CURL IN) +0858 e45f 4c INCA TEST FOR DIRECT MODE +0859 e460 27 03 BEQ LAC73 BRANCH IF DIRECT MODE +0860 e462 bd f5 4e JSR LBDC5 PRINT �IN ****� +0861 +0862 * THIS IS THE MAIN LOOP OF BASIC WHEN IN DIRECT MODE +0863 e465 bd f0 e9 LAC73 JSR LB95C MOVE CURSOR TO START OF LINE +0864 e468 8e e3 ed LDX #LABED POINT X TO �OK�, CR MESSAGE +0865 e46b bd f1 25 JSR LB99C PRINT �OK�, CR +0866 e46e bd e1 81 LAC7C JSR LA390 GO GET AN INPUT LINE +0867 e471 ce ff ff LDU #$FFFF THE LINE NUMBER FOR DIRECT MODE IS $FFFF +0868 e474 df 68 STU CURLIN SAVE IT IN CURLIN +0869 e476 25 f6 BCS LAC7C BRANCH IF LINE INPUT TERMINATED BY BREAK +0870 e478 9f 83 STX CHARAD SAVE (X) AS CURRENT INPUT POINTER - THIS WILL +0871 * ENABLE THE �LIVE KEYBOARD� (DIRECT) MODE. THE +0872 * LINE JUST ENTERED WILL BE INTERPRETED +0873 e47a 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC +0874 e47c 27 f0 BEQ LAC7C NO LINE INPUT - GET ANOTHER LINE +0875 e47e 25 0b BCS LACA5 BRANCH IF NUMER1C - THERE WAS A LINE NUMBER BEFORE +0876 * THE STATEMENT ENTERED, SO THIS STATEMENT +0877 * WILL BE MERGED INTO THE BASIC PROGRAM +0878 e480 bd ef da JSR LB821 GO CRUNCH LINE +0879 e483 7e e5 b4 JMP LADC0 GO EXECUTE THE STATEMENT (LIVE KEYBOARD) +0880 * +0881 e486 a6 80 LACA0 LDA ,X+ GET A CHARACTER +0882 e488 7e f1 3a JMP LB9B1 SEND TO CONSOLE OUT +0883 * TAKE A LINE FROM THE LINE INPUT BUFFER +0884 * AND INSERT IT INTO THE BASIC PROGRAM +0885 e48b bd e7 57 LACA5 JSR LAF67 CONVERT LINE NUMBER TO BINARY +0886 e48e 9e 2b LACA8 LDX BINVAL GET CONVERTED LINE NUMBER +0887 e490 9f f1 STX LINHDR STORE IT IN LINE INPUT HEADER +0888 e492 bd ef da JSR LB821 GO CRUNCH THE LINE +0889 e495 d7 03 STB TMPLOC SAVE LINE LENGTH +0890 e497 8d 4c BSR LAD01 FIND OUT WHERE TO INSERT LINE +0891 e499 25 12 BCS LACC8 BRANCH IF LINE NUMBER DOES NOT ALREADY EXIST +0892 e49b dc 47 LDD V47 GET ABSOLUTE ADDRESS OF LINE NUMBER +0893 e49d a3 84 SUBD ,X SUBTRACT ADDRESS OF NEXT LINE NUMBER +0894 e49f d3 1b ADDD VARTAB * ADD TO CURRENT END OF PROGRAM - THIS WILL REMOVE +0895 e4a1 dd 1b STD VARTAB * THE LENGTH OF THIS LINE NUMBER FROM THE PROGRAM +0896 e4a3 ee 84 LDU ,X POINT U TO ADDRESS OF NEXT LINE NUMBER +0897 * DELETE OLD LINE FROM BASIC PROGRAM +0898 e4a5 37 02 LACC0 PULU A GET A BYTE FROM WHAT�S LEFT OF PROGRAM +0899 e4a7 a7 80 STA ,X+ MOVE IT DOWN +0900 e4a9 9c 1b CMPX VARTAB COMPARE TO END OF BASIC PROGRAM +0901 e4ab 26 f8 BNE LACC0 BRANCH IF NOT AT END +0902 e4ad 96 f3 LACC8 LDA LINBUF * CHECK TO SEE IF THERE IS A LINE IN +0903 e4af 27 1c BEQ LACE9 * THE BUFFER AND BRANCH IF NONE +0904 e4b1 dc 1b LDD VARTAB = SAVE CURRENT END OF +0905 e4b3 dd 43 STD V43 = PROGRAM IN V43 +0906 e4b5 db 03 ADDB TMPLOC * ADD LENGTH OF CRUNCHED LINE, +0907 e4b7 89 00 ADCA #0 * PROPOGATE CARRY AND SAVE NEW END +0908 e4b9 dd 41 STD V41 * OF PROGRAM IN V41 +0909 e4bb bd e4 1e JSR LAC1E = MAKE SURE THERE�S ENOUGH RAM FOR THIS +0910 * = LINE & MAKE A HOLE IN BASIC FOR NEW LINE +0911 e4be ce 00 ef LDU #LINHDR-2 POINT U TO LINE TO BE INSERTED +0912 e4c1 37 02 LACDD PULU A GET A BYTE FROM NEW LINE +0913 e4c3 a7 80 STA ,X+ INSERT IT IN PROGRAM +0914 e4c5 9c 45 CMPX V45 * COMPARE TO ADDRESS OF END OF INSERTED +0915 e4c7 26 f8 BNE LACDD * LINE AND BRANCH IF NOT DONE +0916 e4c9 9e 41 LDX V41 = GET AND SAVE +0917 e4cb 9f 1b STX VARTAB = END OF PROGRAM +0918 e4cd 8d 36 LACE9 BSR LAD21 RESET INPUT POINTER, CLEAR VARIABLES, INITIALIZE +0919 e4cf 8d 02 BSR LACEF ADJUST START OF NEXT LINE ADDRESSES +0920 e4d1 20 9b BRA LAC7C REENTER BASIC�S INPUT LOOP +0921 * COMPUTE THE START OF NEXT LINE ADDRESSES FOR THE BASIC PROGRAM +0922 e4d3 9e 19 LACEF LDX TXTTAB POINT X TO START OF PROGRAM +0923 e4d5 ec 84 LACF1 LDD ,X GET ADDRESS OF NEXT LINE +0924 e4d7 27 21 BEQ LAD16 RETURN IF END OF PROGRAM +0925 e4d9 33 04 LEAU 4,X POINT U TO START OF BASIC TEXT IN LINE +0926 e4db a6 c0 LACF7 LDA ,U+ * SKIP THROUGH THE LINE UNTIL A +0927 e4dd 26 fc BNE LACF7 * ZERO (END OF LINE) IS FOUND +0928 e4df ef 84 STU ,X SAVE THE NEW START OF NEXT LINE ADDRESS +0929 e4e1 ae 84 LDX ,X POINT X TO START OF NEXT LINE +0930 e4e3 20 f0 BRA LACF1 KEEP GOING +0931 * +0932 * FIND A LINE NUMBER IN THE BASIC PROGRAM +0933 * RETURN WITH CARRY SET IF NO MATCH FOUND +0934 e4e5 dc 2b LAD01 LDD BINVAL GET THE LINE NUMBER TO FIND +0935 e4e7 9e 19 LDX TXTTAB BEGINNING OF PROGRAM +0936 e4e9 ee 84 LAD05 LDU ,X GET ADDRESS OF NEXT LINE NUMBER +0937 e4eb 27 09 BEQ LAD12 BRANCH IF END OF PROG +0938 e4ed 10 a3 02 CMPD 2,X IS IT A MATCH? +0939 e4f0 23 06 BLS LAD14 CARRY SET IF LOWER; CARRY CLEAR IF MATCH +0940 e4f2 ae 84 LDX ,X X = ADDRESS OF NEXT LINE +0941 e4f4 20 f3 BRA LAD05 KEEP LOOPING FOR LINE NUMBER +0942 e4f6 1a 01 LAD12 ORCC #1 SET CARRY FLAG +0943 e4f8 9f 47 LAD14 STX V47 SAVE MATCH LINE NUMBER OR NUMBER OF LINE JUST AFTER +0944 * WHERE IT SHOULD HAVE BEEN +0945 e4fa 39 LAD16 RTS +0946 +0947 * NEW +0948 e4fb 26 fb NEW BNE LAD14 BRANCH IF ARGUMENT GIVEN +0949 e4fd 9e 19 LAD19 LDX TXTTAB GET START OF BASIC +0950 e4ff 6f 80 CLR ,X+ * PUT 2 ZERO BYTES THERE - ERASE +0951 e501 6f 80 CLR ,X+ * THE BASIC PROGRAM +0952 e503 9f 1b STX VARTAB AND THE NEXT ADDRESS IS NOW THE END OF PROGRAM +0953 e505 9e 19 LAD21 LDX TXTTAB GET START OF BASIC +0954 e507 bd e6 ab JSR LAEBB PUT INPUT POINTER ONE BEFORE START OF BASIC +0955 * ERASE ALL VARIABLES +0956 e50a 9e 27 LAD26 LDX MEMSIZ * RESET START OF STRING VARIABLES +0957 e50c 9f 23 STX STRTAB * TO TOP OF STRING SPACE +0958 e50e bd e5 df JSR RESTOR RESET �DATA� POINTER TO START OF BASIC +0959 e511 9e 1b LDX VARTAB * GET START OF VARIABLES AND USE IT +0960 e513 9f 1d STX ARYTAB * TO RESET START OF ARRAYS +0961 e515 9f 1f STX ARYEND RESET END OF ARRAYS +0962 e517 8e 00 c9 LAD33 LDX #STRSTK * RESET STRING STACK POINTER TO +0963 e51a 9f 0b STX TEMPPT * BOTTOM OF STRING STACK +0964 e51c ae e4 LDX ,S GET RETURN ADDRESS OFF STACK +0965 e51e 10 de 21 LDS FRETOP RESTORE STACK POINTER +0966 e521 6f e2 CLR ,-S PUT A ZERO BYTE ON STACK - TO CLEAR ANY RETURN OF +0967 * FOR/NEXT DATA FROM THE STACK +0968 e523 0f 2d CLR OLDPTR RESET �CONT� ADDRESS SO YOU +0969 e525 0f 2e CLR OLDPTR+1 �CAN�T CONTINUE� +0970 e527 0f 08 CLR ARYDIS CLEAR THE ARRAY DISABLE FLAG +0971 e529 6e 84 JMP ,X RETURN TO CALLING ROUTINE - THIS IS NECESSARY +0972 * SINCE THE STACK WAS RESET +0973 * +0974 * FOR +0975 * +0976 * THE FOR COMMAND WILL STORE 18 BYTES ON THE STACK FOR +0977 * EACH FOR-NEXT LOOP WHICH IS BEING PROCESSED. THESE +0978 * BYTES ARE DEFINED AS FOLLOWS: 0- $80 (FOR FLAG); +0979 * 1,2=INDEX VARIABLE DESCRIPTOR POINTER; 3-7=FP VALUE OF STEP; +0980 * 8=STEP DIRECTION: $FF IF NEGATIVE; 0 IF ZERO; 1 IF POSITIVE; +0981 * 9-13=FP VALUE OF �TO� PARAMETER; +0982 * 14,15=CURRENT LINE NUMBER; 16,17=RAM ADDRESS OF THE END +0983 * OF THE LINE CONTAINING THE �FOR� STATEMENT +0984 e52b 86 80 FOR LDA #$80 * SAVE THE DISABLE ARRAY FLAG IN VO8 +0985 e52d 97 08 STA ARYDIS * DO NOT ALLOW THE INDEX VARIABLE TO BE AN ARRAY +0986 e52f bd e7 79 JSR LET SET INDEX VARIABLE TO INITIAL VALUE +0987 e532 bd e3 f9 JSR LABF9 SEARCH THE STACK FOR �FOR/NEXT� DATA +0988 e535 32 62 LEAS 2,S PURGE RETURN ADDRESS OFF OF THE STACK +0989 e537 26 04 BNE LAD59 BRANCH IF INDEX VARIABLE NOT ALREADY BEING USED +0990 e539 9e 0f LDX TEMPTR GET (ADDRESS + 18) OF MATCHED �FOR/NEXT� DATA +0991 e53b 32 85 LEAS B,X MOVE THE STACK POINTER TO THE BEGINNING OF THE +0992 * MATCHED �FOR/NEXT� DATA SO THE NEW DATA WILL +0993 * OVERLAY THE OLD DATA. THIS WILL ALSO DESTROY +0994 * ALL OF THE �RETURN� AND �FOR/NEXT� DATA BELOW +0995 * THIS POINT ON THE STACK +0996 e53d c6 09 LAD59 LDB #$09 * CHECK FOR ROOM FOR 18 BYTES +0997 e53f bd e4 33 JSR LAC33 * IN FREE RAM +0998 e542 bd e6 d8 JSR LAEE8 GET ADDR OF END OF SUBLINE IN X +0999 e545 dc 68 LDD CURLIN GET CURRENT LINE NUMBER +1000 e547 34 16 PSHS X,B,A SAVE LINE ADDR AND LINE NUMBER ON STACK +1001 e549 c6 a0 LDB #TOK_TO TOKEN FOR �TO� +1002 e54b bd ea 3b JSR LB26F SYNTAX CHECK FOR �TO� +1003 e54e bd e9 0f JSR LB143 �TM� ERROR IF INDEX VARIABLE SET TO STRING +1004 e551 bd e9 0d JSR LB141 EVALUATE EXPRESSION +1005 * +1006 e554 d6 54 LDB FP0SGN GET FPA0 MANTISSA SIGN +1007 e556 ca 7f ORB #$7F FORM A MASK TO SAVE DATA BITS OF HIGH ORDER MANTISSA +1008 e558 d4 50 ANDB FPA0 PUT THE MANTISSA SIGN IN BIT 7 OF HIGH ORDER MANTISSA +1009 e55a d7 50 STB FPA0 SAVE THE PACKED HIGH ORDER MANTISSA +1010 e55c 10 8e e5 63 LDY #LAD7F LOAD FOLLOWING ADDRESS INTO Y AS A RETURN +1011 e560 7e e9 b6 JMP LB1EA ADDRESS - PUSH FPA0 ONTO THE STACK +1012 e563 8e f2 4e LAD7F LDX #LBAC5 POINT X TO FLOATING POINT NUMBER 1.0 (DEFAULT STEP VALUE) +1013 e566 bd f3 9d JSR LBC14 MOVE (X) TO FPA0 +1014 e569 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1015 e56b 81 a4 CMPA #TOK_STEP STEP TOKEN +1016 e56d 26 05 BNE LAD90 BRANCH IF NO �STEP� VALUE +1017 e56f 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +1018 e571 bd e9 0d JSR LB141 EVALUATE NUMERIC EXPRESSION +1019 e574 bd f3 f6 LAD90 JSR LBC6D CHECK STATUS OF FPA0 +1020 e577 bd e9 b2 JSR LB1E6 SAVE STATUS AND FPA0 ON THE STACK +1021 e57a dc 3b LDD VARDES * GET DESCRIPTOR POINTER FOR THE �STEP� +1022 e57c 34 06 PSHS B,A * VARIABLE AND SAVE IT ON THE STACK +1023 e57e 86 80 LDA #$80 = GET THE �FOR� FLAG AND +1024 e580 34 02 PSHS A = SAVE IT ON THE STACK +1025 * +1026 * MAIN COMMAND INTERPRETATION LOOP +1027 e582 1c af LAD9E ANDCC #$AF ENABLE IRQ,FIRQ +1028 e584 8d 60 BSR LADEB CHECK FOR KEYBOARD BREAK +1029 e586 9e 83 LDX CHARAD GET BASIC�S INPUT POINTER +1030 e588 9f 2f STX TINPTR SAVE IT +1031 e58a a6 80 LDA ,X+ GET CURRENT INPUT CHAR & MOVE POINTER +1032 e58c 27 07 BEQ LADB4 BRANCH IF END OF LINE +1033 e58e 81 3a CMPA #': CHECK FOR LINE SEPARATOR +1034 e590 27 22 BEQ LADC0 BRANCH IF COLON +1035 e592 7e ea 43 LADB1 JMP LB277 �SYNTAX ERROR�-IF NOT LINE SEPARATOR +1036 e595 a6 81 LADB4 LDA ,X++ GET MS BYTE OF ADDRESS OF NEXT BASIC LINE +1037 e597 97 00 STA ENDFLG SAVE IN STOP/END FLAG - CAUSE A STOP IF +1038 * NEXT LINE ADDRESS IS < $8000; CAUSE +1039 * AN END IF ADDRESS > $8000 +1040 e599 27 72 BEQ LAE15 BRANCH TO �STOP� - END OF PROGRAM +1041 e59b ec 80 LDD ,X+ GET CURRENT LINE NUMBER +1042 e59d dd 68 STD CURLIN SAVE IN CURLIN +1043 e59f 9f 83 STX CHARAD SAVE ADDRESS OF FIRST BYTE OF LINE +1044 * EXTENDED BASIC TRACE +1045 e5a1 96 8c LDA TRCFLG TEST THE TRACE FLAG +1046 e5a3 27 0f BEQ LADC0 BRANCH IF TRACE OFF +1047 e5a5 86 5b LDA #$5B RIGHT HAND MARKER FOR TRON LINE NUMBER +1052 e5b1 bd e0 14 JSR PUTCHR OUTPUT A CHARACTER +1053 * END OF EXTENDED BASIC TRACE +1054 e5b4 9d 7c LADC0 JSR GETNCH GET A CHARACTER FROM BASIC +1055 e5b6 8d 02 BSR LADC6 GO PROCESS COMMAND +1056 e5b8 20 c8 BRA LAD9E GO BACK TO MAIN LOOP +1057 e5ba 27 29 LADC6 BEQ LADEA RETURN IF END OF LINE (RTS - was BEQ LAE40) +1058 e5bc 4d TSTA CHECK FOR TOKEN - BIT 7 SET (NEGATIVE) +1059 e5bd 10 2a 01 b8 LBPL LET BRANCH IF NOT A TOKEN - GO DO A �LET� WHICH +1060 * IS THE �DEFAULT� TOKEN FOR MICROSOFT BASIC +1061 e5c1 81 ff CMPA #$FF SECONDARY TOKEN +1062 e5c3 27 0f BEQ SECTOK +1063 e5c5 81 9e CMPA #TOK_HIGH_EXEC SKIPF TOKEN - HIGHEST EXECUTABLE COMMAND IN BASIC +1064 e5c7 22 c9 BHI LADB1 �SYNTAX ERROR� IF NON-EXECUTABLE TOKEN +1065 e5c9 be e1 18 LDX COMVEC+3 GET ADDRESS OF BASIC�S COMMAND TABLE +1066 e5cc 48 LADD4 ASLA X2 (2 BYTE/JUMP ADDRESS) & DISCARD BIT 7 +1067 e5cd 1f 89 TFR A,B SAVE COMMAND OFFSET IN ACCB +1068 e5cf 3a ABX NON X POINTS TO COMMAND JUMP ADDR +1069 e5d0 9d 7c JSR GETNCH GET AN INPUT CHAR +1070 * +1071 * HERE IS WHERE WE BRANCH TO DO A �COMMAND� +1072 e5d2 6e 94 JMP [,X] GO DO A COMMAND +1073 SECTOK +1074 * THE ONLY SECONDARY TOKEN THAT CAN ALSO BE AN EXECUTABLE IS +1075 * THE MID$ REPLACEMENT STATEMENT. SO SPECIAL-CASE CHECK DONE HERE +1076 e5d4 9d 7c JSR GETNCH GET AN INPUT CHAR +1077 e5d6 81 97 CMPA #TOK_MID TOKEN FOR "MID$" +1078 e5d8 10 27 14 ed LBEQ L86D6 PROCESS MID$ REPLACEMENT +1079 e5dc 7e ea 43 JMP LB277 SYNTAX ERROR +1080 +1081 * +1082 * RESTORE +1083 e5df 9e 19 RESTOR LDX TXTTAB BEGINNING OF PROGRAM ADDRESS +1084 e5e1 30 1f LEAX -1,X MOVE TO ONE BYTE BEFORE PROGRAM +1085 e5e3 9f 33 LADE8 STX DATPTR SAVE NEW DATA POINTER +1086 e5e5 39 LADEA RTS +1087 * +1088 * BREAK CHECK +1089 e5e6 bd e0 05 LADEB JSR LA1C1 GET A KEYSTROKE ENTRY +1090 e5e9 27 0a BEQ LADFA RETURN IF NO INPUT +1091 e5eb 81 03 LADF0 CMPA #3 CONTROL C? (BREAK) +1092 e5ed 27 12 BEQ STOP YES +1093 e5ef 81 13 CMPA #$13 CONTROL S? (PAUSE) +1094 e5f1 27 03 BEQ LADFB YES +1095 e5f3 97 73 STA IKEYIM SAVE KEYSTROKE IN INKEY IMAGE +1096 e5f5 39 LADFA RTS +1097 e5f6 bd e0 05 LADFB JSR KEYIN GET A KEY +1098 e5f9 27 fb BEQ LADFB BRANCH IF NO KEY DOWN +1099 e5fb 20 ee BRA LADF0 CONTINUE - DO A BREAK CHECK +1100 * +1101 * END +1102 e5fd 9d 82 END JSR GETCCH GET CURRENT INPUT CHAR +1103 e5ff 20 02 BRA LAE0B +1104 * +1105 * STOP +1106 e601 1a 01 STOP ORCC #$01 SET CARRY FLAG +1107 e603 26 31 LAE0B BNE LAE40 BRANCH IF ARGUMENT EXISTS +1108 e605 9e 83 LDX CHARAD * SAVE CURRENT POSITION OF +1109 e607 9f 2f STX TINPTR * BASIC�S INPUT POINTER +1110 e609 06 00 LAE11 ROR ENDFLG ROTATE CARRY INTO BIT 7 OF STOP/END FLAG +1111 e60b 32 62 LEAS 2,S PURGE RETURN ADDRESS OFF STACK +1112 e60d 9e 68 LAE15 LDX CURLIN GET CURRENT LINE NUMBER +1113 e60f 8c ff ff CMPX #$FFFF DIRECT MODE? +1114 e612 27 06 BEQ LAE22 YES +1115 e614 9f 29 STX OLDTXT SAVE CURRENT LINE NUMBER +1116 e616 9e 2f LDX TINPTR * GET AND SAVE CURRENT POSITION +1117 e618 9f 2d STX OLDPTR * OF BASIC�S INPUT POINTER +1118 LAE22 +1119 e61a 8e e3 f1 LDX #LABF2-1 POINT TO CR, �BREAK� MESSAGE +1120 e61d 0d 00 TST ENDFLG CHECK STOP/END FLAG +1121 e61f 10 2a fe 42 LBPL LAC73 BRANCH TO MAIN LOOP OF BASIC IF END +1122 e623 7e e4 5a JMP LAC68 PRINT �BREAK AT ####� AND GO TO +1123 * BASIC�S MAIN LOOP IF �STOP� +1124 +1125 * CONT +1126 e626 26 0e CONT BNE LAE40 RETURN IF ARGUMENT GIVEN +1127 e628 c6 20 LDB #2*16 �CAN�T CONTINUE� ERROR +1128 e62a 9e 2d LDX OLDPTR GET CONTINUE ADDRESS (INPUT POINTER) +1129 e62c 10 27 fe 16 LBEQ LAC46 �CN� ERROR IF CONTINUE ADDRESS = 0 +1130 e630 9f 83 STX CHARAD RESET BASIC�S INPUT POINTER +1131 e632 9e 29 LDX OLDTXT GET LINE NUMBER +1132 e634 9f 68 STX CURLIN RESET CURRENT LINE NUMBER +1133 e636 39 LAE40 RTS +1134 * +1135 * CLEAR +1136 e637 27 2c CLEAR BEQ LAE6F BRANCH IF NO ARGUMENT +1137 e639 bd eb ad JSR LB3E6 EVALUATE ARGUMENT +1138 e63c 34 06 PSHS B,A SAVE AMOUNT OF STRING SPACE ON STACK +1139 e63e 9e 27 LDX MEMSIZ GET CURRENT TOP OF CLEARED SPACE +1140 e640 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1141 e642 27 0c BEQ LAE5A BRANCH IF NO NEW TOP OF CLEARED SPACE +1142 e644 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA +1143 e647 bd ef 04 JSR LB73D EVALUATE EXPRESSlON; RETURN VALUE IN X +1144 e64a 30 1f LEAX -1,X X = TOP OF CLEARED SPACE +1145 e64c 9c 71 CMPX TOPRAM COMPARE TO TOP OF RAM +1146 e64e 22 18 BHI LAE72 �OM� ERROR IF > TOP OF RAM +1147 e650 1f 10 LAE5A TFR X,D ACCD = TOP OF CLEARED SPACE +1148 e652 a3 e1 SUBD ,S++ SUBTRACT OUT AMOUNT OF CLEARED SPACE +1149 e654 25 12 BCS LAE72 �OM� ERROR IF FREE MEM < 0 +1150 e656 1f 03 TFR D,U U = BOTTOM OF CLEARED SPACE +1151 e658 83 00 3a SUBD #STKBUF SUBTRACT OUT STACK BUFFER +1152 e65b 25 0b BCS LAE72 �OM� ERROR IF FREE MEM < 0 +1153 e65d 93 1b SUBD VARTAB SUBTRACT OUT START OF VARIABLES +1154 e65f 25 07 BCS LAE72 �OM� ERROR IF FREE MEM < 0 +1155 e661 df 21 STU FRETOP SAVE NEW BOTTOM OF CLEARED SPACE +1156 e663 9f 27 STX MEMSIZ SAVE NEW TOP OF CLEARED SPACE +1157 e665 7e e5 0a LAE6F JMP LAD26 ERASE ALL VARIABLES, INITIALIZE POINTERS, ETC +1158 e668 7e e4 44 LAE72 JMP LAC44 �OM� ERROR +1159 * +1160 * RUN +1161 e66b 9d 82 RUN JSR GETCCH * GET CURRENT INPUT CHARACTER +1162 e66d 10 27 fe 94 LBEQ LAD21 * IF NO LINE NUMBER +1163 e671 bd e5 0a JSR LAD26 ERASE ALL VARIABLES +1164 e674 20 19 BRA LAE9F �GOTO� THE RUN ADDRESS +1165 * +1166 * GO +1167 e676 1f 89 GO TFR A,B SAVE INPUT CHARACTER IN ACCB +1168 e678 9d 7c LAE88 JSR GETNCH GET A CHARACTER FROM BASIC +1169 e67a c1 a0 CMPB #TOK_TO �TO� TOKEN +1170 e67c 27 16 BEQ LAEA4 BRANCH IF GOTO +1171 e67e c1 a1 CMPB #TOK_SUB �SUB� TOKEN +1172 e680 26 45 BNE LAED7 �SYNTAX ERROR� IF NEITHER +1173 e682 c6 03 LDB #3 =ROOM FOR 6 +1174 e684 bd e4 33 JSR LAC33 =BYTES ON STACK? +1175 e687 de 83 LDU CHARAD * SAVE CURRENT BASIC INPUT POINTER, LINE +1176 e689 9e 68 LDX CURLIN * NUMBER AND SUB TOKEN ON STACK +1177 e68b 86 a1 LDA #TOK_SUB * +1178 e68d 34 52 PSHS U,X,A * +1179 e68f 8d 03 LAE9F BSR LAEA4 GO DO A �GOTO� +1180 e691 7e e5 82 JMP LAD9E JUMP BACK TO BASIC�S MAIN LOOP +1181 * GOTO +1182 e694 9d 82 LAEA4 JSR GETCCH GET CURRENT INPUT CHAR +1183 e696 bd e7 57 JSR LAF67 GET LINE NUMBER TO BINARY IN BINVAL +1184 e699 8d 40 BSR LAEEB ADVANCE BASIC�S POINTER TO END OF LINE +1185 e69b 30 01 LEAX $01,X POINT TO START OF NEXT LINE +1186 e69d dc 2b LDD BINVAL GET THE LINE NUMBER TO RUN +1187 e69f 10 93 68 CMPD CURLIN COMPARE TO CURRENT LINE NUMBER +1188 e6a2 22 02 BHI LAEB6 IF REO�D LINE NUMBER IS > CURRENT LINE NUMBER, +1189 * DON�T START LOOKING FROM +1190 * START OF PROGRAM +1191 e6a4 9e 19 LDX TXTTAB BEGINNING OF PROGRAM +1192 e6a6 bd e4 e9 LAEB6 JSR LAD05 GO FIND A LINE NUMBER +1193 e6a9 25 17 BCS LAED2 �UNDEFINED LINE NUMBER� +1194 e6ab 30 1f LAEBB LEAX -1,X MOVE BACK TO JUST BEFORE START OF LINE +1195 e6ad 9f 83 STX CHARAD RESET BASIC�S INPUT POINTER +1196 e6af 39 LAEBF RTS +1197 * +1198 * RETURN +1199 e6b0 26 fd RETURN BNE LAEBF EXIT ROUTINE IF ARGUMENT GIVEN +1200 e6b2 86 ff LDA #$FF * PUT AN ILLEGAL VARIABLE NAME IN FIRST BYTE OF +1201 e6b4 97 3b STA VARDES * VARDES WHICH WILL CAUSE �FOR/NEXT� DATA ON THE +1202 * STACK TO BE IGNORED +1203 e6b6 bd e3 f9 JSR LABF9 CHECK FOR RETURN DATA ON THE STACK +1204 e6b9 1f 14 TFR X,S RESET STACK POINTER - PURGE TWO RETURN ADDRESSES +1205 * FROM THE STACK +1206 e6bb 81 21 CMPA #TOK_SUB-$80 SUB TOKEN - $80 +1207 e6bd 27 0b BEQ LAEDA BRANCH IF �RETURN� FROM SUBROUTINE +1208 e6bf c6 04 LDB #2*2 ERROR #2 �RETURN WITHOUT GOSUB� +1209 e6c1 8c FCB SKP2 SKIP TWO BYTES +1210 e6c2 c6 0e LAED2 LDB #7*2 ERROR #7 �UNDEFINED LINE NUMBER� +1211 e6c4 7e e4 46 JMP LAC46 JUMP TO ERROR HANDLER +1212 e6c7 7e ea 43 LAED7 JMP LB277 �SYNTAX ERROR� +1213 e6ca 35 52 LAEDA PULS A,X,U * RESTORE VALUES OF CURRENT LINE NUMBER AND +1214 e6cc 9f 68 STX CURLIN * BASIC�S INPUT POINTER FOR THIS SUBROUTINE +1215 e6ce df 83 STU CHARAD * AND LOAD ACCA WITH SUB TOKEN ($A6) +1216 * +1217 * DATA +1218 e6d0 8d 06 DATA BSR LAEE8 MOVE INPUT POINTER TO END OF SUBLINE OR LINE +1219 e6d2 8c FCB SKP2 SKIP 2 BYTES +1220 +1221 * REM, ELSE +1222 ELSE +1223 e6d3 8d 06 REM BSR LAEEB MOVE INPUT POINTER TO END OF LINE +1224 e6d5 9f 83 STX CHARAD RESET BASIC�S INPUT POINTER +1225 e6d7 39 LAEE7 RTS +1226 * ADVANCE INPUT POINTER TO END OF SUBLINE OR LINE +1227 e6d8 c6 3a LAEE8 LDB #': COLON = SUBLINE TERMINATOR CHARACTER +1228 e6da 86 LAEEA FCB SKP1LD SKPILD SKIP ONE BYTE; LDA #$5F +1229 * ADVANCE BASIC�S INPUT POINTER TO END OF +1230 * LINE - RETURN ADDRESS OF END OF LINE+1 IN X +1231 e6db 5f LAEEB CLRB 0 = LINE TERMINATOR CHARACTER +1232 e6dc d7 01 STB CHARAC TEMP STORE PRIMARY TERMINATOR CHARACTER +1233 e6de 5f CLRB 0 (END OF LINE) = ALTERNATE TERM. CHAR. +1234 e6df 9e 83 LDX CHARAD LOAD X W/BASIC�S INPUT POINTER +1235 e6e1 1f 98 LAEF1 TFR B,A * CHANGE TERMINATOR CHARACTER +1236 e6e3 d6 01 LDB CHARAC * FROM ACCB TO CHARAC - SAVE OLD TERMINATOR +1237 * IN CHARAC +1238 e6e5 97 01 STA CHARAC SWAP PRIMARY AND SECONDARY TERMINATORS +1239 e6e7 a6 84 LAEF7 LDA ,X GET NEXT INPUT CHARACTER +1240 e6e9 27 ec BEQ LAEE7 RETURN IF 0 (END OF LINE) +1241 e6eb 34 04 PSHS B SAVE TERMINATOR ON STACK +1242 e6ed a1 e0 CMPA ,S+ COMPARE TO INPUT CHARACTER +1243 e6ef 27 e6 BEQ LAEE7 RETURN IF EQUAL +1244 e6f1 30 01 LEAX 1,X MOVE POINTER UP ONE +1245 e6f3 81 22 CMPA #'" CHECK FOR DOUBLE QUOTES +1246 e6f5 27 ea BEQ LAEF1 BRANCH IF " - TOGGLE TERMINATOR CHARACTERS +1247 e6f7 4c INCA * CHECK FOR $FF AND BRANCH IF +1248 e6f8 26 02 BNE LAF0C * NOT SECONDARY TOKEN +1249 e6fa 30 01 LEAX 1,X MOVE INPUT POINTER 1 MORE IF SECONDARY +1250 e6fc 81 86 LAF0C CMPA #TOK_IF+1 TOKEN FOR IF? +1251 e6fe 26 e7 BNE LAEF7 NO - GET ANOTHER INPUT CHARACTER +1252 e700 0c 04 INC IFCTR INCREMENT IF COUNTER - KEEP TRACK OF HOW MANY +1253 * �IF� STATEMENTS ARE NESTED IN ONE LINE +1254 e702 20 e3 BRA LAEF7 GET ANOTHER INPUT CHARACTER +1255 +1256 * IF +1257 e704 bd e9 0d IF JSR LB141 EVALUATE NUMERIC EXPRESSION +1258 e707 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1259 e709 81 81 CMPA #TOK_GO TOKEN FOR GO +1260 e70b 27 05 BEQ LAF22 TREAT �GO� THE SAME AS �THEN� +1261 e70d c6 a2 LDB #TOK_THEN TOKEN FOR THEN +1262 e70f bd ea 3b JSR LB26F DO A SYNTAX CHECK ON ACCB +1263 e712 96 4f LAF22 LDA FP0EXP CHECK FOR TRUE/FALSE - FALSE IF FPA0 EXPONENT = ZERO +1264 e714 26 13 BNE LAF39 BRANCH IF CONDITION TRUE +1265 e716 0f 04 CLR IFCTR CLEAR FLAG - KEEP TRACK OF WHICH NESTED ELSE STATEMENT +1266 * TO SEARCH FOR IN NESTED �IF� LOOPS +1267 e718 8d b6 LAF28 BSR DATA MOVE BASIC�S POINTER TO END OF SUBLINE +1268 e71a 4d TSTA * CHECK TO SEE IF END OF LINE OR SUBLINE +1269 e71b 27 ba BEQ LAEE7 * AND RETURN IF END OF LINE +1270 e71d 9d 7c JSR GETNCH GET AN INPUT CHARACTER FROM BASIC +1271 e71f 81 84 CMPA #TOK_ELSE TOKEN FOR ELSE +1272 e721 26 f5 BNE LAF28 IGNORE ALL DATA EXCEPT �ELSE� UNTIL +1273 * END OF LINE (ZERO BYTE) +1274 e723 0a 04 DEC IFCTR CHECK TO SEE IF YOU MUST SEARCH ANOTHER SUBLINE +1275 e725 2a f1 BPL LAF28 BRANCH TO SEARCH ANOTHER SUBLINE FOR �ELSE� +1276 e727 9d 7c JSR GETNCH GET AN INPUT CHARACTER FROM BASIC +1277 e729 9d 82 LAF39 JSR GETCCH GET CURRENT INPUT CHARACTER +1278 e72b 10 25 ff 65 LBCS LAEA4 BRANCH TO �GOTO� IF NUMERIC CHARACTER +1279 e72f 7e e5 ba JMP LADC6 RETURN TO MAIN INTERPRETATION LOOP +1280 +1281 * ON +1282 e732 bd ee d2 ON JSR LB70B EVALUATE EXPRESSION +1283 e735 c6 81 LDB #TOK_GO TOKEN FOR GO +1284 e737 bd ea 3b JSR LB26F SYNTAX CHECK FOR GO +1285 e73a 34 02 PSHS A SAVE NEW TOKEN (TO,SUB) +1286 e73c 81 a1 CMPA #TOK_SUB TOKEN FOR SUB? +1287 e73e 27 04 BEQ LAF54 YES +1288 e740 81 a0 CMPA #TOK_TO TOKEN FOR TO? +1289 e742 26 83 LAF52 BNE LAED7 �SYNTAX� ERROR IF NOT �SUB� OR �TO� +1290 e744 0a 53 LAF54 DEC FPA0+3 DECREMENT IS BYTE OF MANTISSA OF FPA0 - THIS +1291 * IS THE ARGUMENT OF THE �ON� STATEMENT +1292 e746 26 05 BNE LAF5D BRANCH IF NOT AT THE PROPER GOTO OR GOSUB LINE NUMBER +1293 e748 35 04 PULS B GET BACK THE TOKEN FOLLOWING �GO� +1294 e74a 7e e6 78 JMP LAE88 GO DO A �GOTO� OR �GOSUB� +1295 e74d 9d 7c LAF5D JSR GETNCH GET A CHARACTER FROM BASIC +1296 e74f 8d 06 BSR LAF67 CONVERT BASIC LINE NUMBER TO BINARY +1297 e751 81 2c CMPA #', IS CHARACTER FOLLOWING LINE NUMBER A COMMA? +1298 e753 27 ef BEQ LAF54 YES +1299 e755 35 84 PULS B,PC IF NOT, FALL THROUGH TO NEXT COMMAND +1300 e757 9e 74 LAF67 LDX ZERO DEFAULT LINE NUMBER OF ZERO +1301 e759 9f 2b STX BINVAL SAVE IT IN BINVAL +1302 * +1303 * CONVERT LINE NUMBER TO BINARY - RETURN VALUE IN BINVAL +1304 * +1305 e75b 24 61 LAF6B BCC LAFCE RETURN IF NOT NUMERIC CHARACTER +1306 e75d 80 30 SUBA #'0 MASK OFF ASCII +1307 e75f 97 01 STA CHARAC SAVE DIGIT IN VO1 +1308 e761 dc 2b LDD BINVAL GET ACCUMULATED LINE NUMBER VALUE +1309 e763 81 18 CMPA #24 LARGEST LINE NUMBER IS $F9FF (63999) - +1310 * (24*256+255)*10+9 +1311 e765 22 db BHI LAF52 �SYNTAX� ERROR IF TOO BIG +1312 * MULT ACCD X 10 +1313 e767 58 ASLB * +1314 e768 49 ROLA * TIMES 2 +1315 e769 58 ASLB = +1316 e76a 49 ROLA = TIMES 4 +1317 e76b d3 2b ADDD BINVAL ADD 1 = TIMES 5 +1318 e76d 58 ASLB * +1319 e76e 49 ROLA * TIMES 10 +1320 e76f db 01 ADDB CHARAC ADD NEXT DIGIT +1321 e771 89 00 ADCA #0 PROPAGATE CARRY +1322 e773 dd 2b STD BINVAL SAVE NEW ACCUMULATED LINE NUMBER +1323 e775 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC +1324 e777 20 e2 BRA LAF6B LOOP- PROCESS NEXT DIGIT +1325 * +1326 * LET (EXBAS) +1327 * EVALUATE A NON-TOKEN EXPRESSION +1328 * TARGET = REPLACEMENT +1329 e779 bd eb 1e LET JSR LB357 FIND TARGET VARIABLE DESCRIPTOR +1330 e77c 9f 3b STX VARDES SAVE DESCRIPTOR ADDRESS OF 1ST EXPRESSION +1331 e77e c6 ae LDB #TOK_EQUALS TOKEN FOR "=" +1332 e780 bd ea 3b JSR LB26F DO A SYNTAX CHECK FOR �=� +1333 e783 96 06 LDA VALTYP * GET VARIABLE TYPE AND +1334 e785 34 02 PSHS A * SAVE ON THE STACK +1335 e787 bd e9 22 JSR LB156 EVALUATE EXPRESSION +1336 e78a 35 02 PULS A * REGET VARIABLE TYPE OF 1ST EXPRESSION AND +1337 e78c 46 RORA * SET CARRY IF STRING +1338 e78d bd e9 14 JSR LB148 TYPE CHECK-TM ERROR IF VARIABLE TYPES ON +1339 * BOTH SIDES OF EQUALS SIGN NOT THE SAME +1340 e790 10 27 0c 28 LBEQ LBC33 GO PUT FPA0 INTO VARIABLE DESCRIPTOR IF NUMERIC +1341 * MOVE A STRING WHOSE DESCRIPTOR IS LOCATED AT +1342 * FPA0+2 INTO THE STRING SPACE. TRANSFER THE +1343 * DESCRIPTOR ADDRESS TO THE ADDRESS IN VARDES +1344 * DON�T MOVE THE STRING IF IT IS ALREADY IN THE +1345 * STRING SPACE. REMOVE DESCRIPTOR FROM STRING +1346 * STACK IF IT IS LAST ONE ON THE STACK +1347 e794 9e 52 LAFA4 LDX FPA0+2 POINT X TO DESCRIPTOR OF REPLACEMENT STRING +1348 e796 dc 21 LDD FRETOP LOAD ACCD WITH START OF STRING SPACE +1349 e798 10 a3 02 CMPD 2,X IS THE STRING IN STRING SPACE? +1350 e79b 24 11 BCC LAFBE BRANCH IF IT�S NOT IN THE STRING SPACE +1351 e79d 9c 1b CMPX VARTAB COMPARE DESCRIPTOR ADDRESS TO START OF VARIABLES +1352 e79f 25 0d BCS LAFBE BRANCH IF DESCRIPTOR ADDRESS NOT IN VARIABLES +1353 e7a1 e6 84 LAFB1 LDB ,X GET LENGTH OF REPLACEMENT STRING +1354 e7a3 bd ec d4 JSR LB50D RESERVE ACCB BYTES OF STRING SPACE +1355 e7a6 9e 4d LDX V4D GET DESCRIPTOR ADDRESS BACK +1356 e7a8 bd ee 0a JSR LB643 MOVE STRING INTO STRING SPACE +1357 e7ab 8e 00 56 LDX #STRDES POINT X TO TEMP STRING DESCRIPTOR ADDRESS +1358 e7ae 9f 4d LAFBE STX V4D SAVE STRING DESCRIPTOR ADDRESS IN V4D +1359 e7b0 bd ee 3c JSR LB675 REMOVE STRING DESCRIPTOR IF LAST ONE +1360 * ON STRING STACK +1361 e7b3 de 4d LDU V4D POINT U TO REPLACEMENT DESCRIPTOR ADDRESS +1362 e7b5 9e 3b LDX VARDES GET TARGET DESCRIPTOR ADDRESS +1363 e7b7 37 26 PULU A,B,Y GET LENGTH AND START OF REPLACEMENT STRING +1364 e7b9 a7 84 STA ,X * SAVE STRING LENGTH AND START IN +1365 e7bb 10 af 02 STY 2,X * TARGET DESCRIPTOR LOCATION +1366 e7be 39 LAFCE RTS +1367 +1368 e7bf 3f 52 45 44 4f LAFCF FCC "?REDO" ?REDO MESSAGE +1369 e7c4 0d 00 FCB CR,$00 +1370 +1371 LAFD6 +1372 e7c6 7e e4 46 LAFDC JMP LAC46 JMP TO ERROR HANDLER +1373 e7c9 96 09 LAFDF LDA INPFLG = GET THE INPUT FLAG AND BRANCH +1374 e7cb 27 07 BEQ LAFEA = IF �INPUT� +1375 e7cd 9e 31 LDX DATTXT * GET LINE NUMBER WHERE THE ERROR OCCURRED +1376 e7cf 9f 68 STX CURLIN * AND USE IT AS THE CURRENT LINE NUMBER +1377 e7d1 7e ea 43 JMP LB277 �SYNTAX ERROR� +1378 e7d4 8e e7 be LAFEA LDX #LAFCF-1 * POINT X TO �?REDO� AND PRINT +1379 e7d7 bd f1 25 JSR LB99C * IT ON THE SCREEN +1380 e7da 9e 2f LDX TINPTR = GET THE SAVED ABSOLUTE ADDRESS OF +1381 e7dc 9f 83 STX CHARAD = INPUT POINTER AND RESTORE IT +1382 e7de 39 RTS +1383 * +1384 * INPUT +1385 e7df c6 16 INPUT LDB #11*2 �ID� ERROR +1386 e7e1 9e 68 LDX CURLIN GET CURRENT LINE NUMBER +1387 e7e3 30 01 LEAX 1,X ADD ONE +1388 e7e5 27 df BEQ LAFDC �ID� ERROR BRANCH IF DIRECT MODE +1389 e7e7 8d 01 BSR LB00F GET SOME INPUT DATA - WAS LB002 +1390 e7e9 39 RTS +1391 e7ea 81 22 LB00F CMPA #'" CHECK FOR PROMPT STRING DELIMITER +1392 e7ec 26 0b BNE LB01E BRANCH IF NO PROMPT STRING +1393 e7ee bd ea 10 JSR LB244 PUT PROMPT STRING ON STRING STACK +1394 e7f1 c6 3b LDB #'; * +1395 e7f3 bd ea 3b JSR LB26F * DO A SYNTAX CHECK FOR SEMICOLON +1396 e7f6 bd f1 28 JSR LB99F PRINT MESSAGE TO CONSOLE OUT +1397 e7f9 8e 00 f3 LB01E LDX #LINBUF POINT TO BASIC�S LINE BUFFER +1398 e7fc 6f 84 CLR ,X CLEAR 1ST BYTE - FLAG TO INDICATE NO DATA +1399 * IN LINE BUFFER +1400 e7fe 8d 06 BSR LB02F INPUT A STRING TO LINE BUFFER +1401 e800 c6 2c LDB #', * INSERT A COMMA AT THE END +1402 e802 e7 84 STB ,X * OF THE LINE INPUT BUFFER +1403 e804 20 16 BRA LB049 +1404 * FILL BASIC�S LINE INPUT BUFFER CONSOLE IN +1405 e806 bd f1 38 LB02F JSR LB9AF SEND A "?" TO CONSOLE OUT +1406 e809 bd f1 35 JSR LB9AC SEND A �SPACE� TO CONSOLE OUT +1407 e80c bd e1 81 LB035 JSR LA390 GO READ IN A BASIC LINE +1408 e80f 24 05 BCC LB03F BRANCH IF ENTER KEY ENDED ENTRY +1409 e811 32 64 LEAS 4,S PURGE TWO RETURN ADDRESSES OFF THE STACK +1410 e813 7e e6 09 JMP LAE11 GO DO A �STOP� IF BREAK KEY ENDED LINE ENTRY +1411 e816 c6 2e LB03F LDB #2*23 �INPUT PAST END OF FILE� ERROR +1412 e818 39 RTS +1413 * +1414 * READ +1415 e819 9e 33 READ LDX DATPTR GET �READ� START ADDRESS +1416 e81b 86 FCB SKP1LD SKIP ONE BYTE - LDA #*$4F +1417 e81c 4f LB049 CLRA �INPUT� ENTRY POINT: INPUT FLAG = 0 +1418 e81d 97 09 STA INPFLG SET INPUT FLAG; 0 = INPUT: <> 0 = READ +1419 e81f 9f 35 STX DATTMP SAVE �READ� START ADDRESS/�INPUT� BUFFER START +1420 e821 bd eb 1e LB04E JSR LB357 EVALUATE A VARIABLE +1421 e824 9f 3b STX VARDES SAVE DESCRIPTOR ADDRESS +1422 e826 9e 83 LDX CHARAD * GET BASIC�S INPUT POINTER +1423 e828 9f 2b STX BINVAL * AND SAVE IT +1424 e82a 9e 35 LDX DATTMP GET �READ� ADDRESS START/�INPUT� BUFFER POINTER +1425 e82c a6 84 LDA ,X GET A CHARACTER FROM THE BASIC PROGRAM +1426 e82e 26 09 BNE LB069 BRANCH IF NOT END OF LINE +1427 e830 96 09 LDA INPFLG * CHECK INPUT FLAG AND BRANCH +1428 e832 26 51 BNE LB0B9 * IF LOOKING FOR DATA (READ) +1429 * NO DATA IN �INPUT� LINE BUFFER AND/OR INPUT +1430 * NOT COMING FROM SCREEN +1431 e834 bd f1 38 JSR LB9AF SEND A '?' TO CONSOLE OUT +1432 e837 8d cd BSR LB02F FILL INPUT BUFFER FROM CONSOLE IN +1433 e839 9f 83 LB069 STX CHARAD RESET BASIC�S INPUT POINTER +1434 e83b 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +1435 e83d d6 06 LDB VALTYP * CHECK VARIABLE TYPE AND +1436 e83f 27 23 BEQ LB098 * BRANCH IF NUMERIC +1437 * READ/INPUT A STRING VARIABLE +1438 e841 9e 83 LDX CHARAD LOAD X WITH CURRENT BASIC INPUT POINTER +1439 e843 97 01 STA CHARAC SAVE CURRENT INPUT CHARACTER +1440 e845 81 22 CMPA #'" CHECK FOR STRING DELIMITER +1441 e847 27 0e BEQ LB08B BRANCH IF STRING DELIMITER +1442 e849 30 1f LEAX -1,X BACK UP POINTER +1443 e84b 4f CLRA * ZERO = END OF LINE CHARACTER +1444 e84c 97 01 STA CHARAC * SAVE AS TERMINATOR +1445 e84e bd e1 73 JSR LA35F SET UP PRINT PARAMETERS +1446 e851 86 3a LDA #': END OF SUBLINE CHARACTER +1447 e853 97 01 STA CHARAC SAVE AS TERMINATOR I +1448 e855 86 2c LDA #', COMMA +1449 e857 97 02 LB08B STA ENDCHR SAVE AS TERMINATOR 2 +1450 e859 bd ec e5 JSR LB51E STRIP A STRING FROM THE INPUT BUFFER +1451 e85c bd ea 15 JSR LB249 MOVE INPUT POINTER TO END OF STRING +1452 e85f bd e7 94 JSR LAFA4 PUT A STRING INTO THE STRING SPACE IF NECESSARY +1453 e862 20 06 BRA LB09E CHECK FOR ANOTHER DATA ITEM +1454 * SAVE A NUMERIC VALUE IN A READ OR INPUT DATA ITEM +1455 e864 bd f4 9b LB098 JSR LBD12 CONVERT AN ASCII STRING TO FP NUMBER +1456 e867 bd f3 bc JSR LBC33 PACK FPA0 AND STORE IT IN ADDRESS IN VARDES - +1457 * INPUT OR READ DATA ITEM +1458 e86a 9d 82 LB09E JSR GETCCH GET CURRENT INPUT CHARACTER +1459 e86c 27 06 BEQ LB0A8 BRANCH IF END OF LINE +1460 e86e 81 2c CMPA #', CHECK FOR A COMMA +1461 e870 10 26 ff 52 LBNE LAFD6 BAD FILE DATA' ERROR OR RETRY +1462 e874 9e 83 LB0A8 LDX CHARAD * GET CURRENT INPUT +1463 e876 9f 35 STX DATTMP * POINTER (USED AS A DATA POINTER) AND SAVE IT +1464 e878 9e 2b LDX BINVAL * RESET INPUT POINTER TO INPUT OR +1465 e87a 9f 83 STX CHARAD * READ STATEMENT +1466 e87c 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +1467 e87e 27 21 BEQ LB0D5 BRANCH IF END OF LINE - EXIT COMMAND +1468 e880 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA +1469 e883 20 9c BRA LB04E GET ANOTHER INPUT OR READ ITEM +1470 * SEARCH FROM ADDRESS IN X FOR +1471 * 1ST OCCURENCE OF THE TOKEN FOR DATA +1472 e885 9f 83 LB0B9 STX CHARAD RESET BASIC�S INPUT POINTER +1473 e887 bd e6 d8 JSR LAEE8 SEARCH FOR END OF CURRENT LINE OR SUBLINE +1474 e88a 30 01 LEAX 1,X MOVE X ONE PAST END OF LINE +1475 e88c 4d TSTA CHECK FOR END OF LINE +1476 e88d 26 0a BNE LB0CD BRANCH IF END OF SUBLINE +1477 e88f c6 06 LDB #2*3 �OUT OF DATA� ERROR +1478 e891 ee 81 LDU ,X++ GET NEXT 2 CHARACTERS +1479 e893 27 41 BEQ LB10A �OD� ERROR IF END OF PROGRAM +1480 e895 ec 81 LDD ,X++ GET BASIC LINE NUMBER AND +1481 e897 dd 31 STD DATTXT SAVE IT IN DATTXT +1482 e899 a6 84 LB0CD LDA ,X GET AN INPUT CHARACTER +1483 e89b 81 86 CMPA #TOK_DATA DATA TOKEN? +1484 e89d 26 e6 BNE LB0B9 NO � KEEP LOOKING +1485 e89f 20 98 BRA LB069 YES +1486 * EXIT READ AND INPUT COMMANDS +1487 e8a1 9e 35 LB0D5 LDX DATTMP GET DATA POINTER +1488 e8a3 d6 09 LDB INPFLG * CHECK INPUT FLAG +1489 e8a5 10 26 fd 3a LBNE LADE8 * SAVE NEW DATA POINTER IF READ +1490 e8a9 a6 84 LDA ,X = CHECK NEXT CHARACTER IN �INPUT� BUFFER +1491 e8ab 27 06 BEQ LB0E7 = +1492 e8ad 8e e8 b3 LDX #LB0E8-1 POINT X TO �?EXTRA IGNORED� +1493 e8b0 7e f1 25 JMP LB99C PRINT THE MESSAGE +1494 e8b3 39 LB0E7 RTS +1495 +1496 e8b4 3f 45 58 54 52 41 LB0E8 FCC "?EXTRA IGNORED" ?EXTRA IGNORED MESSAGE + 20 49 47 4e 4f 52 + 45 44 +1497 +1498 +1499 e8c2 0d 00 FCB CR,$00 +1500 +1501 * NEXT +1502 e8c4 26 04 NEXT BNE LB0FE BRANCH IF ARGUMENT GIVEN +1503 e8c6 9e 74 LDX ZERO X = 0: DEFAULT FOR NO ARGUMENT +1504 e8c8 20 03 BRA LB101 +1505 e8ca bd eb 1e LB0FE JSR LB357 EVALUATE AN ALPHA EXPRESSION +1506 e8cd 9f 3b LB101 STX VARDES SAVE VARIABLE DESCRIPTOR POINTER +1507 e8cf bd e3 f9 JSR LABF9 GO SCAN FOR �FOR/NEXT� DATA ON STACK +1508 e8d2 27 04 BEQ LB10C BRANCH IF DATA FOUND +1509 e8d4 c6 00 LDB #0 �NEXT WITHOUT FOR� ERROR (SHOULD BE CLRB) +1510 e8d6 20 47 LB10A BRA LB153 PROCESS ERROR +1511 e8d8 1f 14 LB10C TFR X,S POINT S TO START OF �FOR/NEXT� DATA +1512 e8da 30 03 LEAX 3,X POINT X TO FP VALUE OF STEP +1513 e8dc bd f3 9d JSR LBC14 COPY A FP NUMBER FROM (X) TO FPA0 +1514 e8df a6 68 LDA 8,S GET THE DIRECTION OF STEP +1515 e8e1 97 54 STA FP0SGN SAVE IT AS THE SIGN OF FPA0 +1516 e8e3 9e 3b LDX VARDES POINT (X) TO INDEX VARIABLE DESCRIPTOR +1517 e8e5 bd f1 4b JSR LB9C2 ADD (X) TO FPA0 (STEP TO INDEX) +1518 e8e8 bd f3 bc JSR LBC33 PACK FPA0 AND STORE IT IN ADDRESS +1519 * CONTAINED IN VARDES +1520 e8eb 30 69 LEAX 9,S POINT (X) TO TERMINAL VALUE OF INDEX +1521 e8ed bd f4 1f JSR LBC96 COMPARE CURRENT INDEX VALUE TO TERMINAL VALUE OF INDEX +1522 e8f0 e0 68 SUBB 8,S ACCB = 0 IF TERMINAL VALUE=CURRENT VALUE AND STEP=0 OR IF +1523 * STEP IS POSITIVE AND CURRENT VALUE>TERMINAL VALUE OR +1524 * STEP IS NEGATIVE AND CURRENT VALUE +1570 e938 25 13 BCS LB181 BRANCH IF LESS THAN RELATIONAL OPERATORS +1571 e93a 81 03 CMPA #3 * +1572 e93c 24 0f BCC LB181 * BRANCH IF GREATER THAN RELATIONAL OPERATORS +1573 e93e 81 01 CMPA #1 SET CARRY IF �>� +1574 e940 49 ROLA CARRY TO BIT 0 +1575 e941 98 3f EORA TRELFL * CARRY SET IF +1576 e943 91 3f CMPA TRELFL * TRELFL = ACCA +1577 e945 25 64 BCS LB1DF BRANCH IF SYNTAX ERROR : == << OR >> +1578 e947 97 3f STA TRELFL BIT 0: >, BIT 1 =, BIT 2: < +1579 e949 9d 7c JSR GETNCH GET AN INPUT CHARACTER +1580 e94b 20 e9 BRA LB16A CHECK FOR ANOTHER RELATIONAL OPERATOR +1581 * +1582 e94d d6 3f LB181 LDB TRELFL GET RELATIONAL OPERATOR FLAG +1583 e94f 26 33 BNE LB1B8 BRANCH IF RELATIONAL COMPARISON +1584 e951 10 24 00 6b LBCC LB1F4 BRANCH IF > RELATIONAL OPERATOR +1585 e955 8b 07 ADDA #7 SEVEN ARITHMETIC/LOGICAL OPERATORS +1586 e957 24 67 BCC LB1F4 BRANCH IF NOT ARITHMETIC/LOGICAL OPERATOR +1587 e959 99 06 ADCA VALTYP ADD CARRY, NUMERIC FLAG AND MODIFIED TOKEN NUMBER +1588 e95b 10 27 04 77 LBEQ LB60F BRANCH IF VALTYP = FF, AND ACCA = �+� TOKEN - +1589 * CONCATENATE TWO STRINGS +1590 e95f 89 ff ADCA #-1 RESTORE ARITHMETIC/LOGICAL OPERATOR NUMBER +1591 e961 34 02 PSHS A * STORE OPERATOR NUMBER ON STACK; MULTIPLY IT BY 2 +1592 e963 48 ASLA * THEN ADD THE STORED STACK DATA = MULTIPLY +1593 e964 ab e0 ADDA ,S+ * X 3; 3 BYTE/TABLE ENTRY +1594 e966 8e e2 4b LDX #LAA51 JUMP TABLE FOR ARITHMETIC & LOGICAL OPERATORS +1595 e969 30 86 LEAX A,X POINT X TO PROPER TABLE +1596 e96b 35 02 LB19F PULS A GET PRECEDENCE FLAG FROM STACK +1597 e96d a1 84 CMPA ,X COMPARE TO CURRENT OPERATOR +1598 e96f 24 55 BCC LB1FA BRANCH IF STACK OPERATOR > CURRENT OPERATOR +1599 e971 8d 9c BSR LB143 �TM� ERROR IF VARIABLE TYPE = STRING +1600 +1601 * OPERATION BEING PROCESSED IS OF HIGHER PRECEDENCE THAN THE PREVIOUS OPERATION. +1602 e973 34 02 LB1A7 PSHS A SAVE PRECEDENCE FLAG +1603 e975 8d 29 BSR LB1D4 PUSH OPERATOR ROUTINE ADDRESS AND FPA0 ONTO STACK +1604 e977 9e 3d LDX RELPTR GET POINTER TO ARITHMETIC/LOGICAL TABLE ENTRY FOR +1605 * LAST CALCULATED OPERATION +1606 e979 35 02 PULS A GET PRECEDENCE FLAG OF PREVIOUS OPERATION +1607 e97b 26 1d BNE LB1CE BRANCH IF NOT END OF OPERATION +1608 e97d 4d TSTA CHECK TYPE OF PRECEDENCE FLAG +1609 e97e 10 27 00 6a LBEQ LB220 BRANCH IF END OF EXPRESSION OR SUB-EXPRESSION +1610 e982 20 4b BRA LB203 EVALUATE AN OPERATION +1611 +1612 e984 08 06 LB1B8 ASL VALTYP BIT 7 OF TYPE FLAG TO CARRY +1613 e986 59 ROLB SHIFT RELATIONAL FLAG LEFT - VALTYP TO BIT 0 +1614 e987 8d 09 BSR LB1C6 MOVE THE INPUT POINTER BACK ONE +1615 e989 8e e9 97 LDX #LB1CB POINT X TO RELATIONAL COMPARISON JUMP TABLE +1616 e98c d7 3f STB TRELFL SAVE RELATIONAL COMPARISON DATA +1617 e98e 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC +1618 e990 20 d9 BRA LB19F PERFORM OPERATION OR SAVE ON STACK +1619 +1620 e992 9e 83 LB1C6 LDX CHARAD * GET BASIC�S INPUT POINTER AND +1621 e994 7e e6 ab JMP LAEBB * MOVE IT BACK ONE +1622 * RELATIONAL COMPARISON JUMP TABLE +1623 e997 64 LB1CB FCB $64 RELATIONAL COMPARISON FLAG +1624 e998 ea bb LB1CC FDB LB2F4 JUMP ADDRESS +1625 +1626 e99a a1 84 LB1CE CMPA ,X COMPARE PRECEDENCE OF LAST DONE OPERATION TO +1627 * NEXT TO BE DONE OPERATION +1628 e99c 24 31 BCC LB203 EVALUATE OPERATION IF LOWER PRECEDENCE +1629 e99e 20 d3 BRA LB1A7 PUSH OPERATION DATA ON STACK IF HIGHER PRECEDENCE +1630 +1631 * PUSH OPERATOR EVALUATION ADDRESS AND FPA0 ONTO STACK AND EVALUATE ANOTHER EXPR +1632 e9a0 ec 01 LB1D4 LDD 1,X GET ADDRESS OF OPERATOR ROUTINE +1633 e9a2 34 06 PSHS B,A SAVE IT ON THE STACK +1634 e9a4 8d 08 BSR LB1E2 PUSH FPA0 ONTO STACK +1635 e9a6 d6 3f LDB TRELFL GET BACK RELATIONAL OPERATOR FLAG +1636 e9a8 16 ff 7b LBRA LB15A EVALUATE ANOTHER EXPRESSION +1637 e9ab 7e ea 43 LB1DF JMP LB277 �SYNTAX ERROR� +1638 * PUSH FPA0 ONTO THE STACK. ,S = EXPONENT +1639 * 1-2,S =HIGH ORDER MANTISSA 3-4,S = LOW ORDER MANTISSA +1640 * 5,S = SIGN RETURN WITH PRECEDENCE CODE IN ACCA +1641 e9ae d6 54 LB1E2 LDB FP0SGN GET SIGN OF FPA0 MANTISSA +1642 e9b0 a6 84 LDA ,X GET PRECEDENCE CODE TO ACCA +1643 e9b2 35 20 LB1E6 PULS Y GET RETURN ADDRESS FROM STACK & PUT IT IN Y +1644 e9b4 34 04 PSHS B SAVE ACCB ON STACK +1645 e9b6 d6 4f LB1EA LDB FP0EXP * PUSH FPA0 ONTO THE STACK +1646 e9b8 9e 50 LDX FPA0 * +1647 e9ba de 52 LDU FPA0+2 * +1648 e9bc 34 54 PSHS U,X,B * +1649 e9be 6e a4 JMP ,Y JUMP TO ADDRESS IN Y +1650 +1651 * BRANCH HERE IF NON-OPERATOR CHARACTER FOUND - USUALLY �)� OR END OF LINE +1652 e9c0 9e 74 LB1F4 LDX ZERO POINT X TO DUMMY VALUE (ZERO) +1653 e9c2 a6 e0 LDA ,S+ GET PRECEDENCE FLAG FROM STACK +1654 e9c4 27 26 BEQ LB220 BRANCH IF END OF EXPRESSION +1655 e9c6 81 64 LB1FA CMPA #$64 * CHECK FOR RELATIONAL COMPARISON FLAG +1656 e9c8 27 03 BEQ LB201 * AND BRANCH IF RELATIONAL COMPARISON +1657 e9ca bd e9 0f JSR LB143 �TM� ERROR IF VARIABLE TYPE = STRING +1658 e9cd 9f 3d LB201 STX RELPTR SAVE POINTER TO OPERATOR ROUTINE +1659 e9cf 35 04 LB203 PULS B GET RELATIONAL OPERATOR FLAG FROM STACK +1660 e9d1 81 5a CMPA #$5A CHECK FOR �NOT� OPERATOR +1661 e9d3 27 19 BEQ LB222 RETURN IF �NOT� - NO RELATIONAL COMPARISON +1662 e9d5 81 7d CMPA #$7D CHECK FOR NEGATION (UNARY) FLAG +1663 e9d7 27 15 BEQ LB222 RETURN IF NEGATION - NO RELATIONAL COMPARISON +1664 +1665 * EVALUATE AN OPERATION. EIGHT BYTES WILL BE STORED ON STACK, FIRST SIX BYTES +1666 * ARE A TEMPORARY FLOATING POINT RESULT THEN THE ADDRESS OF ROUTINE WHICH +1667 * WILL EVALUATE THE OPERATION. THE RTS AT END OF ROUTINE WILL VECTOR +1668 * TO EVALUATING ROUTINE. +1669 e9d9 54 LSRB = ROTATE VALTYP BIT INTO CARRY +1670 e9da d7 0a STB RELFLG = FLAG AND SAVE NEW RELFLG +1671 e9dc 35 52 PULS A,X,U * PULL A FP VALUE OFF OF THE STACK +1672 e9de 97 5c STA FP1EXP * AND SAVE IT IN FPA1 +1673 e9e0 9f 5d STX FPA1 * +1674 e9e2 df 5f STU FPA1+2 * +1675 e9e4 35 04 PULS B = GET MANTISSA SIGN AND +1676 e9e6 d7 61 STB FP1SGN = SAVE IT IN FPA1 +1677 e9e8 d8 54 EORB FP0SGN EOR IT WITH FPA1 MANTISSA SIGN +1678 e9ea d7 62 STB RESSGN SAVE IT IN RESULT SIGN BYTE +1679 e9ec d6 4f LB220 LDB FP0EXP GET EXPONENT OF FPA0 +1680 e9ee 39 LB222 RTS +1681 +1682 e9ef bd fc 39 LB223 JSR XVEC15 CALL EXTENDED BASIC ADD-IN +1683 e9f2 0f 06 CLR VALTYP INITIALIZE TYPE FLAG TO NUMERIC +1684 e9f4 9d 7c JSR GETNCH GET AN INPUT CHAR +1685 e9f6 24 03 BCC LB22F BRANCH IF NOT NUMERIC +1686 e9f8 7e f4 9b LB22C JMP LBD12 CONVERT ASCII STRING TO FLOATING POINT - +1687 * RETURN RESULT IN FPA0 +1688 * PROCESS A NON NUMERIC FIRST CHARACTER +1689 e9fb bd eb 69 LB22F JSR LB3A2 SET CARRY IF NOT ALPHA +1690 e9fe 24 50 BCC LB284 BRANCH IF ALPHA CHARACTER +1691 ea00 81 2e CMPA #'. IS IT �.� (DECIMAL POINT)? +1692 ea02 27 f4 BEQ LB22C CONVERT ASCII STRING TO FLOATING POINT +1693 ea04 81 a7 CMPA #TOK_MINUS MINUS TOKEN +1694 ea06 27 40 BEQ LB27C YES - GO PROCESS THE MINUS OPERATOR +1695 ea08 81 a6 CMPA #TOK_PLUS PLUS TOKEN +1696 ea0a 27 e3 BEQ LB223 YES - GET ANOTHER CHARACTER +1697 ea0c 81 22 CMPA #'" STRING DELIMITER? +1698 ea0e 26 0a BNE LB24E NO +1699 ea10 9e 83 LB244 LDX CHARAD CURRENT BASIC POINTER TO X +1700 ea12 bd ec df JSR LB518 SAVE STRING ON STRING STACK +1701 ea15 9e 64 LB249 LDX COEFPT * GET ADDRESS OF END OF STRING AND +1702 ea17 9f 83 STX CHARAD * PUT BASIC�S INPUT POINTER THERE +1703 ea19 39 RTS +1704 ea1a 81 a3 LB24E CMPA #TOK_NOT NOT TOKEN? +1705 ea1c 26 0d BNE LB25F NO +1706 * PROCESS THE NOT OPERATOR +1707 ea1e 86 5a LDA #$5A �NOT� PRECEDENCE FLAG +1708 ea20 bd e9 26 JSR LB15A PROCESS OPERATION FOLLOWING �NOT� +1709 ea23 bd eb b4 JSR INTCNV CONVERT FPA0 TO INTEGER IN ACCD +1710 ea26 43 COMA * �NOT� THE INTEGER +1711 ea27 53 COMB * +1712 ea28 7e ec bb JMP GIVABF CONVERT ACCD TO FLOATING POINT (FPA0) +1713 ea2b 4c LB25F INCA CHECK FOR TOKENS PRECEEDED BY $FF +1714 ea2c 27 2e BEQ LB290 IT WAS PRECEEDED BY $FF +1715 ea2e 8d 06 LB262 BSR LB26A SYNTAX CHECK FOR A �(� +1716 ea30 bd e9 22 JSR LB156 EVALUATE EXPRESSIONS WITHIN PARENTHESES AT +1717 * HIGHEST PRECEDENCE +1718 ea33 c6 29 LB267 LDB #') SYNTAX CHECK FOR �)� +1719 ea35 8c FCB SKP2 SKIP 2 BYTES +1720 ea36 c6 28 LB26A LDB #'( SYNTAX CHECK FOR �(� +1721 ea38 8c FCB SKP2 SKIP 2 BYTES +1722 ea39 c6 2c LB26D LDB #', SYNTAX CHECK FOR COMMA +1723 ea3b e1 9f 00 83 LB26F CMPB [CHARAD] * COMPARE ACCB TO CURRENT INPUT +1724 ea3f 26 02 BNE LB277 * CHARACTER - SYNTAX ERROR IF NO MATCH +1725 ea41 0e 7c JMP GETNCH GET A CHARACTER FROM BASIC +1726 ea43 c6 02 LB277 LDB #2*1 SYNTAX ERROR +1727 ea45 7e e4 46 JMP LAC46 JUMP TO ERROR HANDLER +1728 +1729 * PROCESS THE MINUS (UNARY) OPERATOR +1730 ea48 86 7d LB27C LDA #$7D MINUS (UNARY) PRECEDENCE FLAG +1731 ea4a bd e9 26 JSR LB15A PROCESS OPERATION FOLLOWING �UNARY� NEGATION +1732 ea4d 7e f6 72 JMP LBEE9 CHANGE SIGN OF FPA0 MANTISSA +1733 +1734 * EVALUATE ALPHA EXPRESSION +1735 ea50 bd eb 1e LB284 JSR LB357 FIND THE DESCRIPTOR ADDRESS OF A VARIABLE +1736 ea53 9f 52 LB287 STX FPA0+2 SAVE DESCRIPTOR ADDRESS IN FPA0 +1737 ea55 96 06 LDA VALTYP TEST VARIABLE TYPE +1738 ea57 26 95 BNE LB222 RETURN IF STRING +1739 ea59 7e f3 9d JMP LBC14 COPY A FP NUMBER FROM (X) TO FPA0 +1740 +1741 * EVALUATING A SECONDARY TOKEN +1742 ea5c 9d 7c LB290 JSR GETNCH GET AN INPUT CHARACTER (SECONDARY TOKEN) +1743 ea5e 1f 89 TFR A,B SAVE IT IN ACCB +1744 ea60 58 ASLB X2 & BET RID OF BIT 7 +1745 ea61 9d 7c JSR GETNCH GET ANOTHER INPUT CHARACTER +1746 ea63 c1 38 CMPB #NUM_SEC_FNS-1*2 29 SECONDARY FUNCTIONS - 1 +1747 ea65 23 03 BLS LB29F BRANCH IF COLOR BASIC TOKEN +1748 ea67 7e ea 43 JMP LB277 SYNTAX ERROR +1749 ea6a 34 04 LB29F PSHS B SAVE TOKEN OFFSET ON STACK +1750 ea6c c1 2a CMPB #TOK_LEFT-$80*2 CHECK FOR TOKEN WITH AN ARGUMENT +1751 ea6e 25 1e BCS LB2C7 DO SECONDARIES STRING$ OR LESS +1752 ea70 c1 30 CMPB #TOK_INKEY-$80*2 * +1753 ea72 24 1c BCC LB2C9 * DO SECONDARIES $92 (INKEY$) OR > +1754 ea74 8d c0 BSR LB26A SYNTAX CHECK FOR A �(� +1755 ea76 a6 e4 LDA ,S GET TOKEN NUMBER +1756 * DO SECONDARIES (LEFT$, RIGHT$, MID$) +1757 ea78 bd e9 22 JSR LB156 EVALUATE FIRST STRING IN ARGUMENT +1758 ea7b 8d bc BSR LB26D SYNTAX CHECK FOR A COMMA +1759 ea7d bd e9 12 JSR LB146 �TM� ERROR IF NUMERIC VARiABLE +1760 ea80 35 02 PULS A GET TOKEN OFFSET FROM STACK +1761 ea82 de 52 LDU FPA0+2 POINT U TO STRING DESCRIPTOR +1762 ea84 34 42 PSHS U,A SAVE TOKEN OFFSET AND DESCRIPTOR ADDRESS +1763 ea86 bd ee d2 JSR LB70B EVALUATE FIRST NUMERIC ARGUMENT +1764 ea89 35 02 PULS A GET TOKEN OFFSET FROM STACK +1765 ea8b 34 06 PSHS B,A SAVE TOKEN OFFSET AND NUMERIC ARGUMENT +1766 ea8d 8e FCB $8E OP CODE OF LDX# - SKlP 2 BYTES +1767 ea8e 8d 9e LB2C7 BSR LB262 SYNTAX CHECK FOR A �(� +1768 ea90 35 04 LB2C9 PULS B GET TOKEN OFFSET +1769 ea92 be e1 1d LDX COMVEC+8 GET SECONDARY FUNCTION JUMP TABLE ADDRESS +1770 ea95 3a LB2CE ABX ADD IN COMMAND OFFSET +1771 * +1772 * HERE IS WHERE WE BRANCH TO A SECONDARY FUNCTION +1773 ea96 ad 94 JSR [,X] GO DO AN SECONDARY FUNCTION +1774 ea98 7e e9 0f JMP LB143 �TM� ERROR IF VARIABLE TYPE = STRING +1775 +1776 * LOGICAL OPERATOR �OR� JUMPS HERE +1777 ea9b 86 LB2D4 FCB SKP1LD SKIP ONE BYTE - �OR� FLAG = $4F +1778 +1779 * LOGICAL OPERATOR �AND� JUMPS HERE +1780 ea9c 4f LB2D5 CLRA AND FLAG = 0 +1781 ea9d 97 03 STA TMPLOC AND/OR FLAG +1782 ea9f bd eb b4 JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD +1783 eaa2 dd 01 STD CHARAC TEMP SAVE ACCD +1784 eaa4 bd f3 d3 JSR LBC4A MOVE FPA1 TO FPA0 +1785 eaa7 bd eb b4 JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD +1786 eaaa 0d 03 TST TMPLOC CHECK AND/OR FLAG +1787 eaac 26 06 BNE LB2ED BRANCH IF OR +1788 eaae 94 01 ANDA CHARAC * �AND� ACCD WITH FPA0 INTEGER +1789 eab0 d4 02 ANDB ENDCHR * STORED IN ENDCHR +1790 eab2 20 04 BRA LB2F1 CONVERT TO FP +1791 eab4 9a 01 LB2ED ORA CHARAC * �OR� ACCD WITH FPA0 INTEGER +1792 eab6 da 02 ORB ENDCHR * STORED IN CHARAC +1793 eab8 7e ec bb LB2F1 JMP GIVABF CONVERT THE VALUE IN ACCD INTO A FP NUMBER +1794 +1795 * RELATIONAL COMPARISON PROCESS HANDLER +1796 eabb bd e9 14 LB2F4 JSR LB148 �TM� ERROR IF TYPE MISMATCH +1797 eabe 26 10 BNE LB309 BRANCH IF STRING VARIABLE +1798 eac0 96 61 LDA FP1SGN * �PACK� THE MANTISSA +1799 eac2 8a 7f ORA #$7F * SIGN OF FPA1 INTO +1800 eac4 94 5d ANDA FPA1 * BIT 7 OF THE +1801 eac6 97 5d STA FPA1 * MANTISSA MS BYTE +1802 eac8 8e 00 5c LDX #FP1EXP POINT X TO FPA1 +1803 eacb bd f4 1f JSR LBC96 COMPARE FPA0 TO FPA1 +1804 eace 20 36 BRA LB33F CHECK TRUTH OF RELATIONAL COMPARISON +1805 +1806 * RELATIONAL COMPARISON OF STRINGS +1807 ead0 0f 06 LB309 CLR VALTYP SET VARIABLE TYPE TO NUMERIC +1808 ead2 0a 3f DEC TRELFL REMOVE STRING TYPE FLAG (BIT0=1 FOR STRINGS) FROM THE +1809 * DESIRED RELATIONAL COMPARISON DATA +1810 ead4 bd ee 1e JSR LB657 GET LENGTH AND ADDRESS OF STRING WHOSE +1811 * DESCRIPTOR ADDRESS IS IN THE BOTTOM OF FPA0 +1812 ead7 d7 56 STB STRDES * SAVE LENGTH AND ADDRESS IN TEMPORARY +1813 ead9 9f 58 STX STRDES+2 * DESCRIPTOR (STRING B) +1814 eadb 9e 5f LDX FPA1+2 = RETURN LENGTH AND ADDRESS OF STRING +1815 eadd bd ee 20 JSR LB659 = WHOSE DESCRIPTOR ADDRESS IS STORED IN FPA1+2 +1816 eae0 96 56 LDA STRDES LOAD ACCA WITH LENGTH OF STRING B +1817 eae2 34 04 PSHS B SAVE LENGTH A ON STACK +1818 eae4 a0 e0 SUBA ,S+ SUBTRACT LENGTH A FROM LENGTH B +1819 eae6 27 07 BEQ LB328 BRANCH IF STRINGS OF EQUAL LENGTH +1820 eae8 86 01 LDA #1 TRUE FLAG +1821 eaea 24 03 BCC LB328 TRUE IF LENGTH B > LENGTH A +1822 eaec d6 56 LDB STRDES LOAD ACCB WITH LENGTH B +1823 eaee 40 NEGA SET FLAG = FALSE (1FF) +1824 eaef 97 54 LB328 STA FP0SGN SAVE TRUE/FALSE FLAG +1825 eaf1 de 58 LDU STRDES+2 POINT U TO START OF STRING +1826 eaf3 5c INCB COMPENSATE FOR THE DECB BELOW +1827 * ENTER WITH ACCB CONTAINING LENGTH OF SHORTER STRING +1828 eaf4 5a LB32D DECB DECREMENT SHORTER STRING LENGTH +1829 eaf5 26 04 BNE LB334 BRANCH IF ALL OF STRING NOT COMPARED +1830 eaf7 d6 54 LDB FP0SGN GET TRUE/FALSE FLAB +1831 eaf9 20 0b BRA LB33F CHECK TRUTH OF RELATIONAL COMPARISON +1832 eafb a6 80 LB334 LDA ,X+ GET A BYTE FROM STRING A +1833 eafd a1 c0 CMPA ,U+ COMPARE TO STRING B +1834 eaff 27 f3 BEQ LB32D CHECK ANOTHER CHARACTER IF = +1835 eb01 c6 ff LDB #$FF FALSE FLAG IF STRING A > B +1836 eb03 24 01 BCC LB33F BRANCH IF STRING A > STRING B +1837 eb05 50 NEGB SET FLAG = TRUE +1838 +1839 * DETERMINE TRUTH OF COMPARISON - RETURN RESULT IN FPA0 +1840 eb06 cb 01 LB33F ADDB #1 CONVERT $FF,0,1 TO 0,1,2 +1841 eb08 59 ROLB NOW IT�S 1,2,4 FOR > = < +1842 eb09 d4 0a ANDB RELFLG �AND� THE ACTUAL COMPARISON WITH THE DESIRED - +1843 COMPARISON +1844 eb0b 27 02 BEQ LB348 BRANCH IF FALSE (NO MATCHING BITS) +1845 eb0d c6 ff LDB #$FF TRUE FLAG +1846 eb0f 7e f4 05 LB348 JMP LBC7C CONVERT ACCB INTO FP NUMBER IN FPA0 +1847 +1848 * DIM +1849 eb12 bd ea 39 LB34B JSR LB26D SYNTAX CHECK FOR COMMA +1850 eb15 c6 01 DIM LDB #1 DIMENSION FLAG +1851 eb17 8d 08 BSR LB35A SAVE ARRAY SPACE FOR THIS VARIABLE +1852 eb19 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1853 eb1b 26 f5 BNE LB34B KEEP DIMENSIONING IF NOT END OF LINE +1854 eb1d 39 RTS +1855 * EVALUATE A VARIABLE - RETURN X AND +1856 * VARPTR POINTING TO VARIABLE DESCRIPTOR +1857 * EACH VARIABLE REQUIRES 7 BYTES - THE FIRST TWO +1858 * BYTES ARE THE VARIABLE NAME AND THE NEXT 5 +1859 * BYTES ARE THE DESCRIPTOR. IF BIT 7 OF THE +1860 * FIRST BYTE OF VARlABLE NAME IS SET, THE +1861 * VARIABLE IS A DEF FN VARIABLE. IF BIT 7 OF +1862 * THE SECOND BYTE OF VARIABLE NAME IS SET, THE +1863 * VARIABLE IS A STRING, OTHERWISE THE VARIABLE +1864 * IS NUMERIC. +1865 * IF THE VARIABLE IS NOT FOUND, A ZERO VARIABLE IS +1866 * INSERTED INTO THE VARIABLE SPACE +1867 eb1e 5f LB357 CLRB DIMENSION FLAG = 0; DO NOT SET UP AN ARRAY +1868 eb1f 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1869 eb21 d7 05 LB35A STB DIMFLG SAVE ARRAY FLAG +1870 * ENTRY POINT FOR DEF FN VARIABLE SEARCH +1871 eb23 97 37 LB35C STA VARNAM SAVE INPUT CHARACTER +1872 eb25 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1873 eb27 8d 40 BSR LB3A2 SET CARRY IF NOT ALPHA +1874 eb29 10 25 ff 16 LBCS LB277 SYNTAX ERROR IF NOT ALPHA +1875 eb2d 5f CLRB DEFAULT 2ND VARIABLE CHARACTER TO ZERO +1876 eb2e d7 06 STB VALTYP SET VARIABLE TYPE TO NUMERIC +1877 eb30 9d 7c JSR GETNCH GET ANOTHER CHARACTER FROM BASIC +1878 eb32 25 04 BCS LB371 BRANCH IF NUMERIC (2ND CHARACTER IN +1879 * VARIABLE MAY BE NUMERIC) +1880 eb34 8d 33 BSR LB3A2 SET CARRY IF NOT ALPHA +1881 eb36 25 0a BCS LB37B BRANCH IF NOT ALPHA +1882 eb38 1f 89 LB371 TFR A,B SAVE 2ND CHARACTER IN ACCB +1883 * READ INPUT CHARACTERS UNTIL A NON ALPHA OR +1884 * NON NUMERIC IS FOUND - IGNORE ALL CHARACTERS +1885 * IN VARIABLE NAME AFTER THE 1ST TWO +1886 eb3a 9d 7c LB373 JSR GETNCH GET AN INPUT CHARACTER +1887 eb3c 25 fc BCS LB373 BRANCH IF NUMERIC +1888 eb3e 8d 29 BSR LB3A2 SET CARRY IF NOT ALPHA +1889 eb40 24 f8 BCC LB373 BRANCH IF ALPHA +1890 eb42 81 24 LB37B CMPA #'$ CHECK FOR A STRING VARIABLE +1891 eb44 26 06 BNE LB385 BRANCH IF IT IS NOT A STRING +1892 eb46 03 06 COM VALTYP SET VARIABLE TYPE TO STRING +1893 eb48 cb 80 ADDB #$80 SET BIT 7 OF 2ND CHARACTER (STRING) +1894 eb4a 9d 7c JSR GETNCH GET AN INPUT CHARACTER +1895 eb4c d7 38 LB385 STB VARNAM+1 SAVE 2ND CHARACTER IN VARNAM+1 +1896 eb4e 9a 08 ORA ARYDIS OR IN THE ARRAY DISABLE FLAG - IF = $80, +1897 * DON�T SEARCH FOR VARIABLES IN THE ARRAYS +1898 eb50 80 28 SUBA #'( IS THIS AN ARRAY VARIABLE? +1899 eb52 10 27 00 75 LBEQ LB404 BRANCH IF IT IS +1900 eb56 0f 08 CLR ARYDIS RESET THE ARRAY DISABLE FLAG +1901 eb58 9e 1b LDX VARTAB POINT X TO THE START OF VARIABLES +1902 eb5a dc 37 LDD VARNAM GET VARIABLE IN QUESTION +1903 eb5c 9c 1d LB395 CMPX ARYTAB COMPARE X TO THE END OF VARIABLES +1904 eb5e 27 12 BEQ LB3AB BRANCH IF END OF VARIABLES +1905 eb60 10 a3 81 CMPD ,X++ * COMPARE VARIABLE IN QUESTION TO CURRENT +1906 eb63 27 3e BEQ LB3DC * VARIABLE AND BRANCH IF MATCH +1907 eb65 30 05 LEAX 5,X = MOVE POINTER TO NEXT VARIABLE AND +1908 eb67 20 f3 BRA LB395 = KEEP LOOKING +1909 +1910 * SET CARRY IF NOT UPPER CASE ALPHA +1911 eb69 81 41 LB3A2 CMPA #'A * CARRY SET IF < �A� +1912 eb6b 25 04 BCS LB3AA * +1913 eb6d 80 5b SUBA #'Z+1 = +1914 * SUBA #-('Z+1) = CARRY CLEAR IF <= 'Z' +1915 eb6f 80 a5 FCB $80,$A5 +1916 eb71 39 LB3AA RTS +1917 * PUT A NEW VARIABLE IN TABLE OF VARIABLES +1918 eb72 8e 00 74 LB3AB LDX #ZERO POINT X TO ZERO LOCATION +1919 eb75 ee e4 LDU ,S GET CURRENT RETURN ADDRESS +1920 eb77 11 83 ea 53 CMPU #LB287 DID WE COME FROM �EVALUATE ALPHA EXPR�? +1921 eb7b 27 28 BEQ LB3DE YES - RETURN A ZERO VALUE +1922 eb7d dc 1f LDD ARYEND * GET END OF ARRAYS ADDRESS AND +1923 eb7f dd 43 STD V43 * SAVE IT AT V43 +1924 eb81 c3 00 07 ADDD #7 = ADD 7 TO END OF ARRAYS (EACH +1925 eb84 dd 41 STD V41 = VARIABLE = 7 BYTES) AND SAVE AT V41 +1926 eb86 9e 1d LDX ARYTAB * GET END OF VARIABLES AND SAVE AT V47 +1927 eb88 9f 47 STX V47 * +1928 eb8a bd e4 1e JSR LAC1E MAKE A SEVEN BYTE SLOT FOR NEW VARIABLE AT +1929 * TOP OF VARIABLES +1930 eb8d 9e 41 LDX V41 = GET NEW END OF ARRAYS AND SAVE IT +1931 eb8f 9f 1f STX ARYEND = +1932 eb91 9e 45 LDX V45 * GET NEW END OF VARIABLES AND SAVE IT +1933 eb93 9f 1d STX ARYTAB * +1934 eb95 9e 47 LDX V47 GET OLD END OF VARIABLES +1935 eb97 dc 37 LDD VARNAM GET NEW VARIABLE NAME +1936 eb99 ed 81 STD ,X++ SAVE VARIABLE NAME +1937 eb9b 4f CLRA * ZERO OUT THE FP VALUE OF THE NUMERIC +1938 eb9c 5f CLRB * VARIABLE OR THE LENGTH AND ADDRESS +1939 eb9d ed 84 STD ,X * OF A STRING VARIABLE +1940 eb9f ed 02 STD 2,X * +1941 eba1 a7 04 STA 4,X * +1942 eba3 9f 39 LB3DC STX VARPTR STORE ADDRESS OF VARIABLE VALUE +1943 eba5 39 LB3DE RTS +1944 * +1945 eba6 90 80 00 00 00 LB3DF FCB $90,$80,$00,$00,$00 * FLOATING POINT -32768 +1946 * SMALLEST SIGNED TWO BYTE INTEGER +1947 * +1948 ebab 9d 7c LB3E4 JSR GETNCH GET AN INPUT CHARACTER FROM BASIC +1949 ebad bd e9 0d LB3E6 JSR LB141 GO EVALUATE NUMERIC EXPRESSION +1950 ebb0 96 54 LB3E9 LDA FP0SGN GET FPA0 MANTISSA SIGN +1951 ebb2 2b 5d BMI LB44A �FC� ERROR IF NEGATIVE NUMBER +1952 +1953 +1954 ebb4 bd e9 0f INTCNV JSR LB143 �TM� ERROR IF STRING VARIABLE +1955 ebb7 96 4f LDA FP0EXP GET FPA0 EXPONENT +1956 ebb9 81 90 CMPA #$90 * COMPARE TO 32768 - LARGEST INTEGER EXPONENT AND +1957 ebbb 25 08 BCS LB3FE * BRANCH IF FPA0 < 32768 +1958 ebbd 8e eb a6 LDX #LB3DF POINT X TO FP VALUE OF -32768 +1959 ebc0 bd f4 1f JSR LBC96 COMPARE -32768 TO FPA0 +1960 ebc3 26 4c BNE LB44A �FC� ERROR IF NOT = +1961 ebc5 bd f4 51 LB3FE JSR LBCC8 CONVERT FPA0 TO A TWO BYTE INTEGER +1962 ebc8 dc 52 LDD FPA0+2 GET THE INTEGER +1963 ebca 39 RTS +1964 * EVALUATE AN ARRAY VARIABLE +1965 ebcb dc 05 LB404 LDD DIMFLG GET ARRAY FLAG AND VARIABLE TYPE +1966 ebcd 34 06 PSHS B,A SAVE THEM ON STACK +1967 ebcf 12 NOP DEAD SPACE CAUSED BY 1.2 REVISION +1968 ebd0 5f CLRB RESET DIMENSION COUNTER +1969 ebd1 9e 37 LB40A LDX VARNAM GET VARIABLE NAME +1970 ebd3 34 14 PSHS X,B SAVE VARIABLE NAME AND DIMENSION COUNTER +1971 ebd5 8d d4 BSR LB3E4 EVALUATE EXPRESSION (DIMENSlON LENGTH) +1972 ebd7 35 34 PULS B,X,Y PULL OFF VARIABLE NAME, DIMENSlON COUNTER, +1973 * ARRAY FLAG +1974 ebd9 9f 37 STX VARNAM SAVE VARIABLE NAME AND VARIABLE TYPE +1975 ebdb de 52 LDU FPA0+2 GET DIMENSION LENGTH +1976 ebdd 34 60 PSHS U,Y SAVE DIMENSION LENGTH, ARRAY FLAG, VARIABLE TYPE +1977 ebdf 5c INCB INCREASE DIMENSION COUNTER +1978 ebe0 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +1979 ebe2 81 2c CMPA #', CHECK FOR ANOTHER DIMENSION +1980 ebe4 27 eb BEQ LB40A BRANCH IF MORE +1981 ebe6 d7 03 STB TMPLOC SAVE DIMENSION COUNTER +1982 ebe8 bd ea 33 JSR LB267 SYNTAX CHECK FOR A �)� +1983 ebeb 35 06 PULS A,B * RESTORE VARIABLE TYPE AND ARRAY +1984 ebed dd 05 STD DIMFLG * FLAG - LEAVE DIMENSION LENGTH ON STACK +1985 ebef 9e 1d LDX ARYTAB GET START OF ARRAYS +1986 ebf1 9c 1f LB42A CMPX ARYEND COMPARE TO END OF ARRAYS +1987 ebf3 27 21 BEQ LB44F BRANCH IF NO MATCH FOUND +1988 ebf5 dc 37 LDD VARNAM GET VARIABLE IN QUESTION +1989 ebf7 10 a3 84 CMPD ,X COMPARE TO CURRENT VARIABLE +1990 ebfa 27 06 BEQ LB43B BRANCH IF = +1991 ebfc ec 02 LDD 2,X GET OFFSET TO NEXT ARRAY VARIABLE +1992 ebfe 30 8b LEAX D,X ADD TO CURRENT POINTER +1993 ec00 20 ef BRA LB42A KEEP SEARCHING +1994 ec02 c6 12 LB43B LDB #2*9 �REDIMENSIONED ARRAY� ERROR +1995 ec04 96 05 LDA DIMFLG * TEST ARRAY FLAG - IF <>0 YOU ARE TRYING +1996 ec06 26 0b BNE LB44C * TO REDIMENSION AN ARRAY +1997 ec08 d6 03 LDB TMPLOC GET NUMBER OF DIMENSIONS IN ARRAY +1998 ec0a e1 04 CMPB 4,X COMPARE TO THIS ARRAYS DIMENSIONS +1999 ec0c 27 59 BEQ LB4A0 BRANCH IF = +2000 ec0e c6 10 LB447 LDB #8*2 �BAD SUBSCRIPT� +2001 ec10 8c FCB SKP2 SKIP TWO BYTES +2002 ec11 c6 08 LB44A LDB #4*2 �ILLEGAL FUNCTION CALL� +2003 ec13 7e e4 46 LB44C JMP LAC46 JUMP TO ERROR SERVICING ROUTINE +2004 +2005 * INSERT A NEW ARRAY INTO ARRAY VARIABLES +2006 * EACH SET OF ARRAY VARIABLES IS PRECEEDED BY A DE- +2007 * SCRIPTOR BLOCK COMPOSED OF 5+2*N BYTES WHERE N IS THE +2008 * NUMBER OF DIMENSIONS IN THE ARRAY. THE BLOCK IS DEFINED +2009 * AS FOLLOWS: BYTES 0,1:VARIABLE�S NAME; 2,3:TOTAL LENGTH +2010 * OF ARRAY ITEMS AND DESCRIPTOR BLOCK; 4:NUMBER OF DIMEN- +2011 * ISIONS; 5,6:LENGTH OF DIMENSION 1; 7,8:LENGTH OF DIMEN- +2012 * SION 2;� 4+N,5+N:LENGTH OF DIMENSION N. +2013 +2014 ec16 cc 00 05 LB44F LDD #5 * 5 BYTES/ARRAY ENTRY SAVE AT COEFPT +2015 ec19 dd 64 STD COEFPT * +2016 ec1b dc 37 LDD VARNAM = GET NAME OF ARRAY AND SAVE IN +2017 ec1d ed 84 STD ,X = FIRST 2 BYTES OF DESCRIPTOR +2018 ec1f d6 03 LDB TMPLOC GET NUMBER OF DIMENSIONS AND SAVE IN +2019 ec21 e7 04 STB 4,X * 5TH BYTE OF DESCRIPTOR +2020 ec23 bd e4 33 JSR LAC33 CHECK FOR ROOM FOR DESCRIPTOR IN FREE RAM +2021 ec26 9f 41 STX V41 TEMPORARILY SAVE DESCRIPTOR ADDRESS +2022 ec28 c6 0b LB461 LDB #11 * DEFAULT DIMENSION VALUE:X(10) +2023 ec2a 4f CLRA * +2024 ec2b 0d 05 TST DIMFLG = CHECK ARRAY FLAG AND BRANCH IF +2025 ec2d 27 05 BEQ LB46D = NOT DIMENSIONING AN ARRAY +2026 ec2f 35 06 PULS A,B GET DIMENSION LENGTH +2027 ec31 c3 00 01 ADDD #1 ADD ONE (X(0) HAS A LENGTH OF ONE) +2028 ec34 ed 05 LB46D STD 5,X SAVE LENGTH OF ARRAY DIMENSION +2029 ec36 8d 5d BSR LB4CE MULTIPLY ACCUM ARRAY SIZE NUMBER LENGTH +2030 * OF NEW DIMENSION +2031 ec38 dd 64 STD COEFPT TEMP STORE NEW CURRENT ACCUMULATED ARRAY SIZE +2032 ec3a 30 02 LEAX 2,X BUMP POINTER UP TWO +2033 ec3c 0a 03 DEC TMPLOC * DECREMENT DIMENSION COUNTER AND BRANCH IF +2034 ec3e 26 e8 BNE LB461 * NOT DONE WITH ALL DIMENSIONS +2035 ec40 9f 0f STX TEMPTR SAVE ADDRESS OF (END OF ARRAY DESCRIPTOR - 5) +2036 ec42 d3 0f ADDD TEMPTR ADD TOTAL SIZE OF NEW ARRAY +2037 ec44 10 25 f7 fc LBCS LAC44 �OM� ERROR IF > $FFFF +2038 ec48 1f 01 TFR D,X SAVE END OF ARRAY IN X +2039 ec4a bd e4 37 JSR LAC37 MAKE SURE THERE IS ENOUGH FREE RAM FOR ARRAY +2040 ec4d 83 00 35 SUBD #STKBUF-5 SUBTRACT OUT THE (STACK BUFFER - 5) +2041 ec50 dd 1f STD ARYEND SAVE NEW END OF ARRAYS +2042 ec52 4f CLRA ZERO = TERMINATOR BYTE +2043 ec53 30 1f LB48C LEAX -1,X * STORE TWO TERMINATOR BYTES AT +2044 ec55 a7 05 STA 5,X * THE END OF THE ARRAY DESCRIPTOR +2045 ec57 9c 0f CMPX TEMPTR * +2046 ec59 26 f8 BNE LB48C * +2047 ec5b 9e 41 LDX V41 GET ADDRESS OF START OF DESCRIPTOR +2048 ec5d 96 1f LDA ARYEND GET MSB OF END OF ARRAYS; LSB ALREADY THERE +2049 ec5f 93 41 SUBD V41 SUBTRACT OUT ADDRESS OF START OF DESCRIPTOR +2050 ec61 ed 02 STD 2,X SAVE LENGTH OF (ARRAY AND DESCRIPTOR) +2051 ec63 96 05 LDA DIMFLG * GET ARRAY FLAG AND BRANCH +2052 ec65 26 2d BNE LB4CD * BACK IF DIMENSIONING +2053 * CALCULATE POINTER TO CORRECT ELEMENT +2054 ec67 e6 04 LB4A0 LDB 4,X GET THE NUMBER OF DIMENSIONS +2055 ec69 d7 03 STB TMPLOC TEMPORARILY SAVE +2056 ec6b 4f CLRA * INITIALIZE POINTER +2057 ec6c 5f CLRB * TO ZERO +2058 ec6d dd 64 LB4A6 STD COEFPT SAVE ACCUMULATED POINTER +2059 ec6f 35 06 PULS A,B * PULL DIMENSION ARGUMENT OFF THE +2060 ec71 dd 52 STD FPA0+2 * STACK AND SAVE IT +2061 ec73 10 a3 05 CMPD 5,X COMPARE TO STORED �DIM� ARGUMENT +2062 ec76 24 3a BCC LB4EB �BS� ERROR IF > = "DIM" ARGUMENT +2063 ec78 de 64 LDU COEFPT * GET ACCUMULATED POINTER AND +2064 ec7a 27 04 BEQ LB4B9 * BRANCH IF 1ST DIMENSION +2065 ec7c 8d 17 BSR LB4CE = MULTIPLY ACCUMULATED POINTER AND DIMENSION +2066 ec7e d3 52 ADDD FPA0+2 = LENGTH AND ADD TO CURRENT ARGUMENT +2067 ec80 30 02 LB4B9 LEAX 2,X MOVE POINTER TO NEXT DIMENSION +2068 ec82 0a 03 DEC TMPLOC * DECREMENT DIMENSION COUNTER AND +2069 ec84 26 e7 BNE LB4A6 * BRANCH IF ANY DIMENSIONS LEFT +2070 * MULTIPLY ACCD BY 5 - 5 BYTES/ARRAY VALUE +2071 ec86 ed e3 STD ,--S +2072 ec88 58 ASLB +2073 ec89 49 ROLA TIMES 2 +2074 ec8a 58 ASLB +2075 ec8b 49 ROLA TIMES 4 +2076 ec8c e3 e1 ADDD ,S++ TIMES 5 +2077 ec8e 30 8b LEAX D,X ADD OFFSET TO START OF ARRAY +2078 ec90 30 05 LEAX 5,X ADJUST POINTER FOR SIZE OF DESCRIPTOR +2079 ec92 9f 39 STX VARPTR SAVE POINTER TO ARRAY VALUE +2080 ec94 39 LB4CD RTS +2081 * MULTIPLY 2 BYTE NUMBER IN 5,X BY THE 2 BYTE NUMBER +2082 * IN COEFPT. RETURN RESULT IN ACCD, BS ERROR IF > $FFFF +2083 ec95 86 10 LB4CE LDA #16 16 SHIFTS TO DO A MULTIPLY +2084 ec97 97 45 STA V45 SHIFT COUNTER +2085 ec99 ec 05 LDD 5,X * GET SIZE OF DIMENSION +2086 ec9b dd 17 STD BOTSTK * AND SAVE IT +2087 ec9d 4f CLRA * ZERO +2088 ec9e 5f CLRB * ACCD +2089 ec9f 58 LB4D8 ASLB = SHIFT ACCB LEFT +2090 eca0 49 ROLA = ONE BIT +2091 eca1 25 0f BCS LB4EB BS' ERROR IF CARRY +2092 eca3 08 65 ASL COEFPT+1 * SHIFT MULTIPLICAND LEFT ONE +2093 eca5 09 64 ROL COEFPT * BIT - ADD MULTIPLIER TO ACCUMULATOR +2094 eca7 24 04 BCC LB4E6 * IF CARRY <> 0 +2095 eca9 d3 17 ADDD BOTSTK ADD MULTIPLIER TO ACCD +2096 ecab 25 05 BCS LB4EB BS' ERROR IF CARRY (>$FFFF) +2097 ecad 0a 45 LB4E6 DEC V45 * DECREMENT SHIFT COUNTER +2098 ecaf 26 ee BNE LB4D8 * IF NOT DONE +2099 ecb1 39 RTS +2100 ecb2 7e ec 0e LB4EB JMP LB447 BS' ERROR +2101 * +2102 * MEM +2103 * THIS IS NOT A TRUE INDICATOR OF FREE MEMORY BECAUSE +2104 * BASIC REQUIRES A STKBUF SIZE BUFFER FOR THE STACK +2105 * FOR WHICH MEM DOES NOT ALLOW. +2106 * +2107 ecb5 1f 40 MEM TFR S,D PUT STACK POINTER INTO ACCD +2108 ecb7 93 1f SUBD ARYEND SUBTRACT END OF ARRAYS +2109 ecb9 21 FCB SKP1 SKIP ONE BYTE +2110 *CONVERT THE VALUE IN ACCB INTO A FP NUMBER IN FPA0 +2111 ecba 4f LB4F3 CLRA CLEAR MS BYTE OF ACCD +2112 * CONVERT THE VALUE IN ACCD INTO A FLOATING POINT NUMBER IN FPA0 +2113 ecbb 0f 06 GIVABF CLR VALTYP SET VARIABLE TYPE TO NUMERIC +2114 ecbd dd 50 STD FPA0 SAVE ACCD IN TOP OF FACA +2115 ecbf c6 90 LDB #$90 EXPONENT REQUIRED IF THE TOP TWO BYTES +2116 * OF FPA0 ARE TO BE TREATED AS AN INTEGER IN FPA0 +2117 ecc1 7e f4 0b JMP LBC82 CONVERT THE REST OF FPA0 TO AN INTEGER +2118 +2119 * STR$ +2120 ecc4 bd e9 0f STR JSR LB143 TM' ERROR IF STRING VARIABLE +2121 ecc7 ce 01 f0 LDU #STRBUF+2 *CONVERT FP NUMBER TO ASCII STRING IN +2122 ecca bd f5 65 JSR LBDDC *THE STRING BUFFER +2123 eccd 32 62 LEAS 2,S PURGE THE RETURN ADDRESS FROM THE STACK +2124 eccf 8e 01 ef LDX #STRBUF+1 *POINT X TO STRING BUFFER AND SAVE +2125 ecd2 20 0b BRA LB518 *THE STRING IN THE STRING SPACE +2126 * RESERVE ACCB BYTES OF STRING SPACE. RETURN START +2127 * ADDRESS IN (X) AND FRESPC +2128 ecd4 9f 4d LB50D STX V4D SAVE X IN V4D +2129 ecd6 8d 5c LB50F BSR LB56D RESERVE ACCB BYTES IN STRING SPACE +2130 ecd8 9f 58 LB511 STX STRDES+2 SAVE NEW STRING ADDRESS +2131 ecda d7 56 STB STRDES SAVE LENGTH OF RESERVED BLOCK +2132 ecdc 39 RTS +2133 ecdd 30 1f LB516 LEAX -1,X MOVE POINTER BACK ONE +2134 * SCAN A LINE FROM (X) UNTIL AN END OF LINE FLAG (ZERO) OR +2135 * EITHER OF THE TWO TERMINATORS STORED IN CHARAC OR ENDCHR IS MATCHED. +2136 * THE RESULTING STRING IS STORED IN THE STRING SPACE +2137 * ONLY IF THE START OF THE STRING IS <= STRBUF+2 +2138 ecdf 86 22 LB518 LDA #'" * INITIALIZE +2139 ece1 97 01 STA CHARAC * TERMINATORS +2140 ece3 97 02 LB51A STA ENDCHR * TO " +2141 ece5 30 01 LB51E LEAX 1,X MOVE POINTER UP ONE +2142 ece7 9f 62 STX RESSGN TEMPORARILY SAVE START OF STRING +2143 ece9 9f 58 STX STRDES+2 SAVE START OF STRING IN TEMP DESCRIPTOR +2144 eceb c6 ff LDB #-1 INITIALIZE CHARACTER COUNTER TO - 1 +2145 eced 5c LB526 INCB INCREMENT CHARACTER COUNTER +2146 ecee a6 80 LDA ,X+ GET CHARACTER +2147 ecf0 27 0c BEQ LB537 BRANCH IF END OF LINE +2148 ecf2 91 01 CMPA CHARAC * CHECK FOR TERMINATORS +2149 ecf4 27 04 BEQ LB533 * IN CHARAC AND ENDCHR +2150 ecf6 91 02 CMPA ENDCHR * DON�T MOVE POINTER BACK +2151 ecf8 26 f3 BNE LB526 * ONE IF TERMINATOR IS "MATCHED" +2152 ecfa 81 22 LB533 CMPA #'" = COMPARE CHARACTER TO STRING DELIMITER +2153 ecfc 27 02 BEQ LB539 = & DON�T MOVE POINTER BACK IF SO +2154 ecfe 30 1f LB537 LEAX -1,X MOVE POINTER BACK ONE +2155 ed00 9f 64 LB539 STX COEFPT SAVE END OF STRING ADDRESS +2156 ed02 d7 56 STB STRDES SAVE STRING LENGTH IN TEMP DESCRIPTOR +2157 ed04 de 62 LDU RESSGN GET INITlAL STRING START +2158 ed06 11 83 01 f0 CMPU #STRBUF+2 COMPARE TO START OF STRING BUFFER +2159 ed0a 22 07 LB543 BHI LB54C BRANCH IF > START OF STRING BUFFER +2160 ed0c 8d c6 BSR LB50D GO RESERVE SPACE FOR THE STRING +2161 ed0e 9e 62 LDX RESSGN POINT X TO THE BEGINNING OF THE STRING +2162 ed10 bd ee 0c JSR LB645 MOVE (B) BYTES FROM (X) TO +2163 * [FRESPC] - MOVE STRING DATA +2164 * PUT DIRECT PAGE STRING DESCRIPTOR BUFFER DATA +2165 * ON THE STRING STACK. SET VARIABLE TYPE TO STRING +2166 ed13 9e 0b LB54C LDX TEMPPT GET NEXT AVAILABLE STRING STACK DESCRIPTOR +2167 ed15 8c 00 f1 CMPX #LINHDR COMPARE TO TOP OF STRING DESCRIPTOR STACK - WAS #CFNBUF +2168 ed18 26 05 BNE LB558 FORMULA O.K. +2169 ed1a c6 1e LDB #15*2 STRING FORMULA TOO COMPLEX' ERROR +2170 ed1c 7e e4 46 LB555 JMP LAC46 JUMP TO ERROR SERVICING ROUTINE +2171 ed1f 96 56 LB558 LDA STRDES * GET LENGTH OF STRING AND SAVE IT +2172 * STA ,X * IN BYTE 0 OF DESCRIPTOR +2173 ed21 a7 00 FCB $A7,$00 +2174 ed23 dc 58 LDD STRDES+2 = GET START ADDRESS OF ACTUAL STRING +2175 ed25 ed 02 STD 2,X = AND SAVE IN BYTES 2,3 OF DESCRIPTOR +2176 ed27 86 ff LDA #$FF * VARIABLE TYPE = STRING +2177 ed29 97 06 STA VALTYP * SAVE IN VARIABLE TYPE FLAG +2178 ed2b 9f 0d STX LASTPT = SAVE START OF DESCRIPTOR +2179 ed2d 9f 52 STX FPA0+2 = ADDRESS IN LASTPT AND FPA0 +2180 ed2f 30 05 LEAX 5,X 5 BYTES/STRING DESCRIPTOR +2181 ed31 9f 0b STX TEMPPT NEXT AVAILABLE STRING VARIABLE DESCRIPTOR +2182 ed33 39 RTS +2183 * RESERVE ACCB BYTES IN STRING STORAGE SPACE +2184 * RETURN WITH THE STARTING ADDRESS OF THE +2185 * RESERVED STRING SPACE IN (X) AND FRESPC +2186 ed34 0f 07 LB56D CLR GARBFL CLEAR STRING REORGANIZATION FLAG +2187 ed36 4f LB56F CLRA * PUSH THE LENGTH OF THE +2188 ed37 34 06 PSHS B,A * STRING ONTO THE STACK +2189 ed39 dc 23 LDD STRTAB GET START OF STRING VARIABLES +2190 ed3b a3 e0 SUBD ,S+ SUBTRACT STRING LENGTH +2191 ed3d 10 93 21 CMPD FRETOP COMPARE TO START OF STRING STORAGE +2192 ed40 25 0a BCS LB585 IF BELOW START, THEN REORGANIZE +2193 ed42 dd 23 STD STRTAB SAVE NEW START OF STRING VARIABLES +2194 ed44 9e 23 LDX STRTAB GET START OF STRING VARIABLES +2195 ed46 30 01 LEAX 1,X ADD ONE +2196 ed48 9f 25 STX FRESPC SAVE START ADDRESS OF NEWLY RESERVED SPACE +2197 ed4a 35 84 PULS B,PC RESTORE NUMBER OF BYTES RESERVED AND RETURN +2198 ed4c c6 1a LB585 LDB #2*13 OUT OF STRING SPACE' ERROR +2199 ed4e 03 07 COM GARBFL TOGGLE REORGANIZATiON FLAG +2200 ed50 27 ca BEQ LB555 ERROR IF FRESHLY REORGANIZED +2201 ed52 8d 04 BSR LB591 GO REORGANIZE STRING SPACE +2202 ed54 35 04 PULS B GET BACK THE NUMBER OF BYTES TO RESERVE +2203 ed56 20 de BRA LB56F TRY TO RESERVE ACCB BYTES AGAIN +2204 * REORGANIZE THE STRING SPACE +2205 ed58 9e 27 LB591 LDX MEMSIZ GET THE TOP OF STRING SPACE +2206 ed5a 9f 23 LB593 STX STRTAB SAVE TOP OF UNORGANIZED STRING SPACE +2207 ed5c 4f CLRA * ZERO OUT ACCD +2208 ed5d 5f CLRB * AND RESET VARIABLE +2209 ed5e dd 4b STD V4B * POINTER TO 0 +2210 ed60 9e 21 LDX FRETOP POINT X TO START OF STRING SPACE +2211 ed62 9f 47 STX V47 SAVE POINTER IN V47 +2212 ed64 8e 00 c9 LDX #STRSTK POINT X TO START OF STRING DESCRIPTOR STACK +2213 ed67 9c 0b LB5A0 CMPX TEMPPT COMPARE TO ADDRESS OF NEXT AVAILABLE DESCRIPTOR +2214 ed69 27 04 BEQ LB5A8 BRANCH IF TOP OF STRING STACK +2215 ed6b 8d 32 BSR LB5D8 CHECK FOR STRING IN UNORGANIZED STRING SPACE +2216 ed6d 20 f8 BRA LB5A0 KEEP CHECKING +2217 ed6f 9e 1b LB5A8 LDX VARTAB GET THE END OF BASIC PROGRAM +2218 ed71 9c 1d LB5AA CMPX ARYTAB COMPARE TO END OF VARIABLES +2219 ed73 27 04 BEQ LB5B2 BRANCH IF AT TOP OF VARIABLES +2220 ed75 8d 22 BSR LB5D2 CHECK FOR STRING IN UNORGANIZED STRING SPACE +2221 ed77 20 f8 BRA LB5AA KEEP CHECKING VARIABLES +2222 ed79 9f 41 LB5B2 STX V41 SAVE ADDRESS OF THE END OF VARIABLES +2223 ed7b 9e 41 LB5B4 LDX V41 GET CURRENT ARRAY POINTER +2224 ed7d 9c 1f LB5B6 CMPX ARYEND COMPARE TO THE END OF ARRAYS +2225 ed7f 27 35 BEQ LB5EF BRANCH IF AT END OF ARRAYS +2226 ed81 ec 02 LDD 2,X GET LENGTH OF ARRAY AND DESCRIPTOR +2227 ed83 d3 41 ADDD V41 * ADD TO CURRENT ARRAY POINTER +2228 ed85 dd 41 STD V41 * AND SAVE IT +2229 ed87 a6 01 LDA 1,X GET 1ST CHARACTER OF VARIABLE NAME +2230 ed89 2a f0 BPL LB5B4 BRANCH IF NUMERIC ARRAY +2231 ed8b e6 04 LDB 4,X GET THE NUMBER OF DIMENSIONS IN THIS ARRAY +2232 ed8d 58 ASLB MULTIPLY BY 2 +2233 ed8e cb 05 ADDB #5 ADD FIVE BYTES (VARIABLE NAME, ARRAY +2234 * LENGTH, NUMBER DIMENSIONS) +2235 ed90 3a ABX X NOW POINTS TO START OF ARRAY ELEMENTS +2236 ed91 9c 41 LB5CA CMPX V41 AT END OF THIS ARRAY? +2237 ed93 27 e8 BEQ LB5B6 YES - CHECK FOR ANOTHER +2238 ed95 8d 08 BSR LB5D8 CHECK FOR STRING LOCATED IN +2239 * UNORGANIZED STRING SPACE +2240 ed97 20 f8 BRA LB5CA KEEP CHECKING ELEMENTS IN THIS ARRAY +2241 ed99 a6 01 LB5D2 LDA 1,X GET F1RST BYTE OF VARIABLE NAME +2242 ed9b 30 02 LEAX 2,X MOVE POINTER TO DESCRIPTOR +2243 ed9d 2a 14 BPL LB5EC BRANCH IF VARIABLE IS NUMERIC +2244 * SEARCH FOR STRING - ENTER WITH X POINTING TO +2245 * THE STRING DESCRIPTOR. IF STRING IS STORED +2246 * BETWEEN V47 AND STRTAB, SAVE DESCRIPTOR POINTER +2247 * IN V4B AND RESET V47 TO STRING ADDRESS +2248 ed9f e6 84 LB5D8 LDB ,X GET THE LENGTH OF THE STRING +2249 eda1 27 10 BEQ LB5EC BRANCH IF NULL - NO STRING +2250 eda3 ec 02 LDD 2,X GET STARTING ADDRESS OF THE STRING +2251 eda5 10 93 23 CMPD STRTAB COMPARE TO THE START OF STRING VARIABLES +2252 eda8 22 09 BHI LB5EC BRANCH IF THIS STRING IS STORED IN +2253 * THE STRING VARIABLES +2254 edaa 10 93 47 CMPD V47 COMPARE TO START OF STRING SPACE +2255 edad 23 04 BLS LB5EC BRANCH IF NOT STORED IN THE STRING SPACE +2256 edaf 9f 4b STX V4B SAVE VARIABLE POINTER IF STORED IN STRING SPACE +2257 edb1 dd 47 STD V47 SAVE STRING STARTING ADDRESS +2258 edb3 30 05 LB5EC LEAX 5,X MOVE TO NEXT VARIABLE DESCRIPTOR +2259 edb5 39 LB5EE RTS +2260 edb6 9e 4b LB5EF LDX V4B GET ADDRESS OF THE DESCRIPTOR FOR THE +2261 * STRING WHICH IS STORED IN THE HIGHEST RAM ADDRESS IN +2262 * THE UNORGANIZED STRING SPACE +2263 edb8 27 fb BEQ LB5EE BRANCH IF NONE FOUND AND REORGANIZATION DONE +2264 edba 4f CLRA CLEAR MS BYTE OF LENGTH +2265 edbb e6 84 LDB ,X GET LENGTH OF STRING +2266 edbd 5a DECB SUBTRACT ONE +2267 edbe d3 47 ADDD V47 ADD LENGTH OF STRING TO ITS STARTING ADDRESS +2268 edc0 dd 43 STD V43 SAVE AS MOVE STARTING ADDRESS +2269 edc2 9e 23 LDX STRTAB POINT X TO THE START OF ORGANIZED STRING VARIABLES +2270 edc4 9f 41 STX V41 SAVE AS MOVE ENDING ADDRESS +2271 edc6 bd e4 20 JSR LAC20 MOVE STRING FROM CURRENT POSITION TO THE +2272 * TOP OF UNORGANIZED STRING SPACE +2273 edc9 9e 4b LDX V4B POINT X TO STRING DESCRIPTOR +2274 edcb dc 45 LDD V45 * GET NEW STARTING ADDRESS OF STRING AND +2275 edcd ed 02 STD 2,X * SAVE IT IN DESCRIPTOR +2276 edcf 9e 45 LDX V45 GET NEW TOP OF UNORGANIZED STRING SPACE +2277 edd1 30 1f LEAX -1,X MOVE POINTER BACK ONE +2278 edd3 7e ed 5a JMP LB593 JUMP BACK AND REORGANIZE SOME MORE +2279 +2280 +2281 edd6 dc 52 LB60F LDD FPA0+2 * GET DESCRIPTOR ADDRESS OF STRING A +2282 edd8 34 06 PSHS B,A * AND SAVE IT ON THE STACK +2283 edda bd e9 ef JSR LB223 GET DESCRIPTOR ADDRESS OF STRING B +2284 eddd bd e9 12 JSR LB146 TM' ERROR IF NUMERIC VARIABLE +2285 ede0 35 10 PULS X * POINT X TO STRING A DESCRIPTOR +2286 ede2 9f 62 STX RESSGN * ADDRESS AND SAVE IT IN RESSGN +2287 ede4 e6 84 LDB ,X GET LENGTH OF STRING A +2288 ede6 9e 52 LDX FPA0+2 POINT X TO DESCRIPTOR OF STRING B +2289 ede8 eb 84 ADDB ,X ADD LENGTH OF STRING B TO STR1NG A +2290 edea 24 05 BCC LB62A BRANCH IF LENGTH < 256 +2291 edec c6 1c LDB #2*14 STRING TOO LONG' ERROR IF LENGTH > 255 +2292 edee 7e e4 46 JMP LAC46 JUMP TO ERROR SERVICING ROUTINE +2293 edf1 bd ec d4 LB62A JSR LB50D RESERVE ROOM IN STRING SPACE FOR NEW STRING +2294 edf4 9e 62 LDX RESSGN GET DESCRIPTOR ADDRESS OF STRING A +2295 edf6 e6 84 LDB ,X GET LENGTH OF STRING A +2296 edf8 8d 10 BSR LB643 MOVE STRING A INTO RESERVED BUFFER IN STRING SPACE +2297 edfa 9e 4d LDX V4D GET DESCRIPTOR ADDRESS OF STRING B +2298 edfc 8d 22 BSR LB659 GET LENGTH AND ADDRESS OF STRING B +2299 edfe 8d 0c BSR LB645 MOVE STRING B INTO REST OF RESERVED BUFFER +2300 ee00 9e 62 LDX RESSGN POINT X TO DESCRIPTOR OF STRING A +2301 ee02 8d 1c BSR LB659 DELETE STRING A IF LAST STRING ON STRING STACK +2302 ee04 bd ed 13 JSR LB54C PUT STRING DESCRIPTOR ON THE STRING STACK +2303 ee07 7e e9 34 JMP LB168 BRANCH BACK TO EXPRESSION EVALUATION +2304 +2305 * MOVE (B) BYTES FROM 2,X TO FRESPC +2306 ee0a ae 02 LB643 LDX 2,X POINT X TO SOURCE ADDRESS +2307 ee0c de 25 LB645 LDU FRESPC POINT U TO DESTINATION ADDRESS +2308 ee0e 5c INCB COMPENSATION FOR THE DECB BELOW +2309 ee0f 20 04 BRA LB64E GO MOVE THE BYTES +2310 * MOVE B BYTES FROM (X) TO (U) +2311 ee11 a6 80 LB64A LDA ,X+ * GET A SOURCE BYTE AND MOVE IT +2312 ee13 a7 c0 STA ,U+ * TO THE DESTINATION +2313 ee15 5a LB64E DECB DECREMENT BYTE COUNTER +2314 ee16 26 f9 BNE LB64A BRANCH IF ALL BYTES NOT MOVED +2315 ee18 df 25 STU FRESPC SAVE ENDING ADDRESS IN FRESPC +2316 ee1a 39 RTS +2317 * RETURN LENGTH (ACCB) AND ADDRESS (X) OF +2318 * STRING WHOSE DESCRIPTOR IS IN FPA0+2 +2319 * DELETE THE STRING IF IT IS THE LAST ONE +2320 * PUT ON THE STRING STACK. REMOVE STRING FROM STRING +2321 * SPACE IF IT IS AT THE BOTTOM OF STRING VARIABLES. +2322 ee1b bd e9 12 LB654 JSR LB146 TM' ERROR IF VARIABLE TYPE = NUMERIC +2323 ee1e 9e 52 LB657 LDX FPA0+2 GET ADDRESS OF SELECTED STRING DESCRIPTOR +2324 ee20 e6 84 LB659 LDB ,X GET LENGTH OF STRING +2325 ee22 8d 18 BSR LB675 * CHECK TO SEE IF THIS STRING DESCRIPTOR WAS +2326 ee24 26 13 BNE LB672 * THE LAST ONE PUT ON THE STRING STACK AND +2327 * * BRANCH IF NOT +2328 ee26 ae 07 LDX 5+2,X GET START ADDRESS OF STRING JUST REMOVED +2329 ee28 30 1f LEAX -1,X MOVE POINTER DOWN ONE +2330 ee2a 9c 23 CMPX STRTAB COMPARE TO START OF STRING VARIABLES +2331 ee2c 26 08 BNE LB66F BRANCH IF THIS STRING IS NOT AT THE BOTTOM +2332 * OF STRING VARIABLES +2333 ee2e 34 04 PSHS B SAVE LENGTH; ACCA WAS CLEARED +2334 ee30 d3 23 ADDD STRTAB * ADD THE LENGTH OF THE JUST REMOVED STRING +2335 ee32 dd 23 STD STRTAB * TO THE START OF STRING VARIABLES - THIS WILL +2336 * * REMOVE THE STRING FROM THE STRING SPACE +2337 ee34 35 04 PULS B RESTORE LENGTH +2338 ee36 30 01 LB66F LEAX 1,X ADD ONE TO POINTER +2339 ee38 39 RTS +2340 ee39 ae 02 LB672 LDX 2,X *POINT X TO ADDRESS OF STRING NOT +2341 ee3b 39 RTS *ON THE STRING STACK +2342 * REMOVE STRING FROM STRING STACK. ENTER WITH X +2343 * POINTING TO A STRING DESCRIPTOR - DELETE THE +2344 * STRING FROM STACK IF IT IS ON TOP OF THE +2345 * STACK. IF THE STRING IS DELETED, SET THE ZERO FLAG +2346 ee3c 9c 0d LB675 CMPX LASTPT *COMPARE TO LAST USED DESCRIPTOR ADDRESS +2347 ee3e 26 07 BNE LB680 *ON THE STRING STACK, RETURN IF DESCRIPTOR +2348 * *ADDRESS NOT ON THE STRING STACK +2349 ee40 9f 0b STX TEMPPT SAVE LAST USED DESCRIPTOR AS NEXT AVAILABLE +2350 ee42 30 1b LEAX -5,X * MOVE LAST USED DESCRIPTOR BACK 5 BYTES +2351 ee44 9f 0d STX LASTPT * AND SAVE AS THE LAST USED DESCRIPTOR ADDR +2352 ee46 4f CLRA SET ZERO FLAG +2353 ee47 39 LB680 RTS +2354 +2355 * LEN +2356 ee48 8d 03 LEN BSR LB686 POINT X TO PROPER STRING AND GET LENGTH +2357 ee4a 7e ec ba LB683 JMP LB4F3 CONVERT ACCB TO FP NUMBER IN FPA0 +2358 * POINT X TO STRING ADDRESS LOAD LENGTH INTO +2359 * ACCB. ENTER WITH THE STRING DESCRIPTOR IN +2360 * BOTTOM TWO BYTES OF FPA0 +2361 ee4d 8d cc LB686 BSR LB654 GET LENGTH AND ADDRESS OF STRING +2362 ee4f 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC +2363 ee51 5d TSTB SET FLAGS ACCORDING TO LENGTH +2364 ee52 39 RTS +2365 +2366 * CHR$ +2367 ee53 bd ee d5 CHR JSR LB70E CONVERT FPA0 TO AN INTEGER IN ACCD +2368 ee56 c6 01 LB68F LDB #1 * RESERVE ONE BYTE IN +2369 ee58 bd ed 34 JSR LB56D * THE STRING SPACE +2370 ee5b 96 53 LDA FPA0+3 GET ASCII STRING VALUE +2371 ee5d bd ec d8 JSR LB511 SAVE RESERVED STRING DESCRIPTOR IN TEMP DESCRIPTOR +2372 ee60 a7 84 STA ,X SAVE THE STRING (IT�S ONLY ONE BYTE) +2373 ee62 32 62 LB69B LEAS 2,S PURGE THE RETURN ADDRESS OFF OF THE STACK +2374 ee64 7e ed 13 LB69D JMP LB54C PUT TEMP DESCRIPTOR DATA ONTO STRING STACK +2375 +2376 +2377 ee67 8d 02 ASC BSR LB6A4 PUT 1ST CHARACTER OF STRING INTO ACCB +2378 ee69 20 df BRA LB683 CONVERT ACCB INTO FP NUMBER IN FPA0 +2379 ee6b 8d e0 LB6A4 BSR LB686 POINT X TO STRING DESCRIPTOR +2380 ee6d 27 5e BEQ LB706 FC' ERROR IF NULL STRING +2381 ee6f e6 84 LDB ,X GET FIRST BYTE OF STRING +2382 ee71 39 RTS +2383 +2384 +2385 ee72 8d 48 LEFT BSR LB6F5 GET ARGUMENTS FROM STACK +2386 ee74 4f LB6AD CLRA CLEAR STRING POINTER OFFSET - OFFSET = 0 FOR LEFT$ +2387 ee75 e1 84 LB6AE CMPB ,X * COMPARE LENGTH PARAMETER TO LENGTH OF +2388 ee77 23 03 BLS LB6B5 * STRING AND BRANCH IF LENGTH OF STRING +2389 * >= LENGTH PARAMETER +2390 ee79 e6 84 LDB ,X USE LENGTH OF STRING OTHERWISE +2391 ee7b 4f CLRA CLEAR STRING POINTER OFFSET (0 FOR LEFT$) +2392 ee7c 34 06 LB6B5 PSHS B,A PUSH PARAMETERS ONTO STACK +2393 ee7e bd ec d6 JSR LB50F RESERVE ACCB BYTES IN THE STRING SPACE +2394 ee81 9e 4d LDX V4D POINT X TO STRING DESCRIPTOR +2395 ee83 8d 9b BSR LB659 GET ADDRESS OF OLD STRING (X=ADDRESS) +2396 ee85 35 04 PULS B * PULL STRING POINTER OFFSET OFF OF THE STACK +2397 ee87 3a ABX * AND ADD IT TO STRING ADDRESS +2398 ee88 35 04 PULS B PULL LENGTH PARAMETER OFF OF THE STACK +2399 ee8a bd ee 0c JSR LB645 MOVE ACCB BYTES FROM (X) TO [FRESPC] +2400 ee8d 20 d5 BRA LB69D PUT TEMP STRING DESCRIPTOR ONTO THE STRING STACK +2401 +2402 * RIGHT$ +2403 ee8f 8d 2b RIGHT BSR LB6F5 GET ARGUMENTS FROM STACK +2404 ee91 a0 84 SUBA ,X ACCA=LENGTH PARAMETER - LENGTH OF OLD STRING +2405 ee93 40 NEGA NOW ACCA = LENGTH OF OLD STRING +2406 ee94 20 df BRA LB6AE PUT NEW STRING IN THE STRING SPACE +2407 +2408 * MID$ +2409 ee96 c6 ff MID LDB #$FF * GET DEFAULT VALUE OF LENGTH AND +2410 ee98 d7 53 STB FPA0+3 * SAVE IT IN FPA0 +2411 ee9a 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +2412 ee9c 81 29 CMPA #') ARGUMENT DELIMITER? +2413 ee9e 27 05 BEQ LB6DE YES - NO LENGTH PARAMETER GIVEN +2414 eea0 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA +2415 eea3 8d 2d BSR LB70B EVALUATE NUMERIC EXPRESSION (LENGTH) +2416 eea5 8d 15 LB6DE BSR LB6F5 GET ARGUMENTS FROM STACK +2417 eea7 27 24 BEQ LB706 FC' ERROR IF NULL STRING +2418 eea9 5f CLRB CLEAR LENGTH COUNTER (DEFAULT VALUE) +2419 eeaa 4a DECA *SUOTRACT ONE FROM POSITION PARAMETER (THESE +2420 eeab a1 84 CMPA ,X *ROUTINES EXPECT 1ST POSITION TO BE ZERO, NOT ONE) +2421 * *AND COMPARE IT TO LENGTH OF OLD STRING +2422 eead 24 cd BCC LB6B5 IF POSITION > LENGTH OF OLD STRING, THEN NEW +2423 * STRING WILL BE A NULL STRING +2424 eeaf 1f 89 TFR A,B SAVE ABSOLUTE POSITION PARAMETER IN ACCB +2425 eeb1 e0 84 SUBB ,X ACCB=POSITION-LENGTH OF OLD STRING +2426 eeb3 50 NEGB NOW ACCB=LENGTH OF OLDSTRING-POSITION +2427 eeb4 d1 53 CMPB FPA0+3 *IF THE AMOUNT OF OLD STRING TO THE RIGHT OF +2428 eeb6 23 c4 BLS LB6B5 *POSITION IS <= THE LENGTH PARAMETER, BRANCH AND +2429 * USE ALL OF THE STRING TO THE RIGHT OF THE POSITION +2430 * INSTEAD OF THE LENGTH PARAMETER +2431 eeb8 d6 53 LDB FPA0+3 GET LENGTH OF NEW STRING +2432 eeba 20 c0 BRA LB6B5 PUT NEW STRING IN STRING SPACE +2433 * DO A SYNTAX CHECK FOR ")", THEN PULL THE PREVIOUSLY CALCULATED NUMERIC +2434 * ARGUMENT (ACCD) AND STRING ARGUMENT DESCRIPTOR ADDR OFF OF THE STACK +2435 eebc bd ea 33 LB6F5 JSR LB267 SYNTAX CHECK FOR A ")" +2436 eebf ee e4 LDU ,S LOAD THE RETURN ADDRESS INTO U REGISTER +2437 eec1 ae 65 LDX 5,S * GET ADDRESS OF STRING AND +2438 eec3 9f 4d STX V4D * SAVE IT IN V4D +2439 eec5 a6 64 LDA 4,S = PUT LENGTH OF STRING IN +2440 eec7 e6 64 LDB 4,S = BOTH ACCA AND ACCB +2441 eec9 32 67 LEAS 7,S REMOVE DESCRIPTOR AND RETURN ADDRESS FROM STACK +2442 eecb 1f 35 TFR U,PC JUMP TO ADDRESS IN U REGISTER +2443 eecd 7e ec 11 LB706 JMP LB44A ILLEGAL FUNCTION CALL' +2444 * EVALUATE AN EXPRESSION - RETURN AN INTEGER IN +2445 * ACCB - 'FC' ERROR IF EXPRESSION > 255 +2446 eed0 9d 7c LB709 JSR GETNCH GET NEXT BASIC INPUT CHARACTER +2447 eed2 bd e9 0d LB70B JSR LB141 EVALUATE A NUMERIC EXPRESSION +2448 eed5 bd eb b0 LB70E JSR LB3E9 CONVERT FPA0 TO INTEGER IN ACCD +2449 eed8 4d TSTA TEST MS BYTE OF INTEGER +2450 eed9 26 f2 BNE LB706 FC' ERROR IF EXPRESSION > 255 +2451 eedb 0e 82 JMP GETCCH GET CURRENT INPUT CHARACTER FROM BASIC +2452 +2453 * VAL +2454 eedd bd ee 4d VAL JSR LB686 POINT X TO STRING ADDRESS +2455 eee0 10 27 02 de LBEQ LBA39 IF NULL STRING SET FPA0 +2456 eee4 de 83 LDU CHARAD SAVE INPUT POINTER IN REGISTER U +2457 eee6 9f 83 STX CHARAD POINT INPUT POINTER TO ADDRESS OF STRING +2458 eee8 3a ABX MOVE POINTER TO END OF STRING TERMINATOR +2459 eee9 a6 84 LDA ,X GET LAST BYTE OF STRING +2460 eeeb 34 52 PSHS U,X,A SAVE INPUT POINTER, STRING TERMINATOR +2461 * ADDRESS AND CHARACTER +2462 eeed 6f 84 CLR ,X CLEAR STRING TERMINATOR : FOR ASCII - FP CONVERSION +2463 eeef 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +2464 eef1 bd f4 9b JSR LBD12 CONVERT AN ASCII STRING TO FLOATING POINT +2465 eef4 35 52 PULS A,X,U RESTORE CHARACTERS AND POINTERS +2466 eef6 a7 84 STA ,X REPLACE STRING TERMINATOR +2467 eef8 df 83 STU CHARAD RESTORE INPUT CHARACTER +2468 eefa 39 RTS +2469 +2470 eefb 8d 07 LB734 BSR LB73D * EVALUATE AN EXPRESSION, RETURN +2471 eefd 9f 2b STX BINVAL * THE VALUE IN X; STORE IT IN BINVAL +2472 eeff bd ea 39 LB738 JSR LB26D SYNTAX CHECK FOR A COMMA +2473 ef02 20 ce BRA LB70B EVALUATE EXPRESSION IN RANGE 0 <= X < 256 +2474 * EVALUATE EXPRESSION : RETURN INTEGER PORTION IN X - 'FC' ERROR IF +2475 +2476 ef04 bd e9 0d LB73D JSR LB141 EVALUATE NUMERIC EXPRESSION +2477 ef07 96 54 LB740 LDA FP0SGN GET SIGN OF FPA0 MANTISSA +2478 ef09 2b c2 BMI LB706 ILLEGAL FUNCTION CALL' IF NEGATIVE +2479 ef0b 96 4f LDA FP0EXP GET EXPONENT OF FPA0 +2480 ef0d 81 90 CMPA #$90 COMPARE TO LARGEST POSITIVE INTEGER +2481 ef0f 22 bc BHI LB706 ILLEGAL FUNCTION CALL' IF TOO LARGE +2482 ef11 bd f4 51 JSR LBCC8 SHIFT BINARY POINT TO EXTREME RIGHT OF FPA0 +2483 ef14 9e 52 LDX FPA0+2 LOAD X WITH LOWER TWO BYTES OF FPA0 +2484 ef16 39 RTS +2485 +2486 * PEEK +2487 ef17 8d ee PEEK BSR LB740 CONVERT FPA0 TO INTEGER IN REGISTER X +2488 ef19 e6 84 LDB ,X GET THE VALUE BEING 'PEEK'ED +2489 ef1b 7e ec ba JMP LB4F3 CONVERT ACCB INTO A FP NUMBER +2490 +2491 * POKE +2492 ef1e 8d db POKE BSR LB734 EVALUATE 2 EXPRESSIONS +2493 ef20 9e 2b LDX BINVAL GET THE ADDRESS TO BE 'POKE'ED +2494 ef22 e7 84 STB ,X STORE THE DATA IN THAT ADDRESS +2495 ef24 39 RTS +2496 +2497 +2498 * LIST +2499 ef25 34 01 LIST PSHS CC SAVE ZERO FLAG ON STACK +2500 ef27 bd e7 57 JSR LAF67 CONVERT DECIMAL LINE NUMBER TO BINARY +2501 ef2a bd e4 e5 JSR LAD01 * FIND RAM ADDRESS OF THAT LINE NUMBER AND +2502 ef2d 9f 66 STX LSTTXT * SAVE IT IN LSTTXT +2503 ef2f 35 01 PULS CC GET ZERO FLAG FROM STACK +2504 ef31 27 12 BEQ LB784 BRANCH IF END OF LINE +2505 ef33 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC +2506 ef35 27 13 BEQ LB789 BRANCH IF END OF LINE +2507 ef37 81 a7 CMPA #TOK_MINUS MINUS TOKEN (IS IT A RANGE OF LINE NUMBERS?) +2508 ef39 26 09 BNE LB783 NO - RETURN +2509 ef3b 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC +2510 ef3d 27 06 BEQ LB784 BRANCH IF END OF LINE +2511 ef3f bd e7 57 JSR LAF67 GET ENDING LINE NUMBER +2512 ef42 27 06 BEQ LB789 BRANCH IF LEGAL LINE NUMBER +2513 ef44 39 LB783 RTS +2514 * LIST THE ENTIRE PROGRAM +2515 ef45 ce ff ff LB784 LDU #$FFFF * SET THE DEFAULT ENDING LINE NUMBER +2516 ef48 df 2b STU BINVAL * TO $FFFF +2517 ef4a 32 62 LB789 LEAS 2,S PURGE RETURN ADDRESS FROM THE STACK +2518 ef4c 9e 66 LDX LSTTXT POINT X TO STARTING LINE ADDRESS +2519 ef4e bd f0 e9 LB78D JSR LB95C MOVE CURSOR TO START OF A NEW LINE +2520 ef51 bd e1 da JSR LA549 CHECK FOR A BREAK OR PAUSE +2521 ef54 ec 84 LDD ,X GET ADDRESS OF NEXT BASIC LINE +2522 ef56 26 03 BNE LB79F BRANCH IF NOT END OF PROGRAM +2523 LB797 +2524 ef58 7e e4 65 JMP LAC73 RETURN TO BASIC�S MAIN INPUT LOOP +2525 ef5b 9f 66 LB79F STX LSTTXT SAVE NEW STARTING LINE ADDRESS +2526 ef5d ec 02 LDD 2,X * GET THE LINE NUMBER OF THIS LINE AND +2527 ef5f 10 93 2b CMPD BINVAL * COMPARE IT TO ENDING LINE NUMBER +2528 ef62 22 f4 BHI LB797 EXIT IF LINE NUMBER > ENDING LINE NUMBER +2529 ef64 bd f5 55 JSR LBDCC PRINT THE NUMBER IN ACCD ON SCREEN IN DECIMAL +2530 ef67 bd f1 35 JSR LB9AC SEND A SPACE TO CONSOLE OUT +2531 ef6a 9e 66 LDX LSTTXT GET RAM ADDRESS OF THIS LINE +2532 ef6c 8d 10 BSR LB7C2 UNCRUNCH A LINE +2533 ef6e ae 9f 00 66 LDX [LSTTXT] POINT X TO START OF NEXT LINE +2534 ef72 ce 00 f4 LDU #LINBUF+1 POINT U TO BUFFER FULL OF UNCRUNCHED LINE +2535 ef75 a6 c0 LB7B9 LDA ,U+ GET A BYTE FROM THE BUFFER +2536 ef77 27 d5 BEQ LB78D BRANCH IF END OF BUFFER +2537 ef79 bd f1 3a JSR LB9B1 SEND CHARACTER TO CONSOLE OUT +2538 ef7c 20 f7 BRA LB7B9 GET ANOTHER CHARACTER +2539 +2540 * UNCRUNCH A LINE INTO BASIC�S LINE INPUT BUFFER +2541 ef7e 30 04 LB7C2 LEAX 4,X MOVE POINTER PAST ADDRESS OF NEXT LINE AND LINE NUMBER +2542 ef80 10 8e 00 f4 LDY #LINBUF+1 UNCRUNCH LINE INTO LINE INPUT BUFFER +2543 ef84 a6 80 LB7CB LDA ,X+ GET A CHARACTER +2544 ef86 27 51 BEQ LB820 BRANCH IF END OF LINE +2545 ef88 2b 15 BMI LB7E6 BRANCH IF IT�S A TOKEN +2546 ef8a 81 3a CMPA #': CHECK FOR END OF SUB LINE +2547 ef8c 26 0d BNE LB7E2 BRNCH IF NOT END OF SUB LINE +2548 ef8e e6 84 LDB ,X GET CHARACTER FOLLOWING COLON +2549 ef90 c1 84 CMPB #TOK_ELSE TOKEN FOR ELSE? +2550 ef92 27 f0 BEQ LB7CB YES - DON�T PUT IT IN BUFFER +2551 ef94 c1 83 CMPB #TOK_SNGL_Q TOKEN FOR REMARK? +2552 ef96 27 ec BEQ LB7CB YES - DON�T PUT IT IN BUFFER +2553 ef98 8c FCB SKP2 SKIP TWO BYTES +2554 ef99 86 21 LB7E0 LDA #'! EXCLAMATION POINT +2555 ef9b 8d 30 LB7E2 BSR LB814 PUT CHARACTER IN BUFFER +2556 ef9d 20 e5 BRA LB7CB GET ANOTHER CHARACTER +2557 +2558 ef9f ce e1 0b LB7E6 LDU #COMVEC-10 FIRST DO COMMANDS +2559 efa2 81 ff CMPA #$FF CHECK FOR SECONDARY TOKEN +2560 efa4 26 04 BNE LB7F1 BRANCH IF NON SECONDARY TOKEN +2561 efa6 a6 80 LDA ,X+ GET SECONDARY TOKEN +2562 efa8 33 45 LEAU 5,U BUMP IT UP TO SECONDARY FUNCTIONS +2563 efaa 84 7f LB7F1 ANDA #$7F MASK OFF BIT 7 OF TOKEN +2564 efac 33 4a LB7F3 LEAU 10,U MOVE TO NEXT COMMAND TABLE +2565 efae 6d c4 TST ,U IS THIS TABLE ENABLED? +2566 efb0 27 e7 BEQ LB7E0 NO - ILLEGAL TOKEN +2567 efb2 a0 c4 SUBA ,U SUBTRACT THE NUMBER OF TOKENS FROM THE CURRENT TOKEN NUMBER +2568 efb4 2a f6 BPL LB7F3 BRANCH IF TOKEN NOT IN THIS TABLE +2569 efb6 ab c4 ADDA ,U RESTORE TOKEN NUMBER RELATIVE TO THIS TABLE +2570 efb8 ee 41 LDU 1,U POINT U TO COMMAND DICTIONARY TABLE +2571 efba 4a LB801 DECA DECREMENT TOKEN NUMBER +2572 efbb 2b 06 BMI LB80A BRANCH IF THIS IS THE CORRECT TOKEN +2573 * SKIP THROUGH DICTIONARY TABLE TO START OF NEXT TOKEN +2574 efbd 6d c0 LB804 TST ,U+ GRAB A BYTE +2575 efbf 2a fc BPL LB804 BRANCH IF BIT 7 NOT SET +2576 efc1 20 f7 BRA LB801 GO SEE IF THIS IS THE CORRECT TOKEN +2577 efc3 a6 c4 LB80A LDA ,U GET A CHARACTER FROM DICTIONARY TABLE +2578 efc5 8d 06 BSR LB814 PUT CHARACTER IN BUFFER +2579 efc7 6d c0 TST ,U+ CHECK FOR START OF NEXT TOKEN +2580 efc9 2a f8 BPL LB80A BRANCH IF NOT DONE WITH THIS TOKEN +2581 efcb 20 b7 BRA LB7CB GO GET ANOTHER CHARACTER +2582 efcd 10 8c 01 ed LB814 CMPY #LINBUF+LBUFMX TEST FOR END OF LINE INPUT BUFFER +2583 efd1 24 06 BCC LB820 BRANCH IF AT END OF BUFFER +2584 efd3 84 7f ANDA #$7F MASK OFF BIT 7 +2585 efd5 a7 a0 STA ,Y+ * SAVE CHARACTER IN BUFFER AND +2586 efd7 6f a4 CLR ,Y * CLEAR NEXT CHARACTER SLOT IN BUFFER +2587 efd9 39 LB820 RTS +2588 * +2589 * CRUNCH THE LINE THAT THE INPUT POINTER IS +2590 * POINTING TO INTO THE LINE INPUT BUFFER +2591 * RETURN LENGTH OF CRUNCHED LINE IN ACCD +2592 * +2593 efda 9e 83 LB821 LDX CHARAD GET BASIC'S INPUT POINTER ADDRESS +2594 efdc ce 00 f3 LDU #LINBUF POINT X TO LINE INPUT BUFFER +2595 efdf 0f 43 LB829 CLR V43 CLEAR ILLEGAL TOKEN FLAG +2596 efe1 0f 44 CLR V44 CLEAR DATA FLAG +2597 efe3 a6 80 LB82D LDA ,X+ GET INPUT CHAR +2598 efe5 27 21 BEQ LB852 BRANCH IF END OF LINE +2599 efe7 0d 43 TST V43 * CHECK ILLEGAL TOKEN FLAG & BRANCH IF NOT +2600 efe9 27 0f BEQ LB844 * PROCESSING AN ILLEGAL TOKEN +2601 efeb bd eb 69 JSR LB3A2 SET CARRY IF NOT UPPER CASE ALPHA +2602 efee 24 18 BCC LB852 BRANCH IF UPPER CASE ALPHA +2603 eff0 81 30 CMPA #'0 * DON�T CRUNCH ASCII NUMERIC CHARACTERS +2604 eff2 25 04 BLO LB842 * BRANCH IF NOT NUMERIC +2605 eff4 81 39 CMPA #'9 * +2606 eff6 23 10 BLS LB852 * BRANCH IF NUMERIC +2607 * END UP HERE IF NOT UPPER CASE ALPHA OR NUMERIC +2608 eff8 0f 43 LB842 CLR V43 CLEAR ILLEGAL TOKEN FLAG +2609 effa 81 20 LB844 CMPA #SPACE SPACE? +2610 effc 27 0a BEQ LB852 DO NOT REMOVE SPACES +2611 effe 97 42 STA V42 SAVE INPUT CHARACTER AS SCAN DELIMITER +2612 f000 81 22 CMPA #'" CHECK FOR STRING DELIMITER +2613 f002 27 38 BEQ LB886 BRANCH IF STRING +2614 f004 0d 44 TST V44 * CHECK DATA FLAG AND BRANCH IF CLEAR +2615 f006 27 19 BEQ LB86B * DO NOT CRUNCH DATA +2616 f008 a7 c0 LB852 STA ,U+ SAVE CHARACTER IN BUFFER +2617 f00a 27 06 BEQ LB85C BRANCH IF END OF LINE +2618 f00c 81 3a CMPA #': * CHECK FOR END OF SUBLINE +2619 f00e 27 cf BEQ LB829 * AND RESET FLAGS IF END OF SUBLINE +2620 f010 20 d1 LB85A BRA LB82D GO GET ANOTHER CHARACTER +2621 f012 6f c0 LB85C CLR ,U+ * DOUBLE ZERO AT END OF LINE +2622 f014 6f c0 CLR ,U+ * +2623 f016 1f 30 TFR U,D SAVE ADDRESS OF END OF LINE IN ACCD +2624 f018 83 00 f1 SUBD #LINHDR LENGTH OF LINE IN ACCD +2625 f01b 8e 00 f2 LDX #LINBUF-1 * SET THE INPUT POINTER TO ONE BEFORE +2626 f01e 9f 83 STX CHARAD * THE START OF THE CRUNCHED LINE +2627 f020 39 RTS EXIT 'CRUNCH' +2628 f021 81 3f LB86B CMPA #'? CHECK FOR "?" - PRINT ABBREVIATION +2629 f023 26 04 BNE LB873 BRANCH IF NOT PRINT ABBREVIATION +2630 f025 86 87 LDA #TOK_PRINT * GET THE PRINT TOKEN AND SAVE IT +2631 f027 20 df BRA LB852 * IN BUFFER +2632 f029 81 27 LB873 CMPA #'' APOSTROPHE IS SAME AS REM +2633 f02b 26 13 BNE LB88A BRANCH IF NOT REMARK +2634 f02d cc 3a 83 LDD #$3A00+TOK_SNGL_Q COLON, REM TOKEN +2635 f030 ed c1 STD ,U++ SAVE IN BUFFER +2636 f032 0f 42 LB87C CLR V42 SET DELIMITER = 0 (END OF LINE) +2637 f034 a6 80 LB87E LDA ,X+ SCAN TILL WE MATCH [V42] +2638 f036 27 d0 BEQ LB852 BRANCH IF END OF LINE +2639 f038 91 42 CMPA V42 DELIMITER? +2640 f03a 27 cc BEQ LB852 BRANCH OUT IF SO +2641 f03c a7 c0 LB886 STA ,U+ DON�T CRUNCH REMARKS OR STRINGS +2642 f03e 20 f4 BRA LB87E GO GET MORE STRING OR REMARK +2643 f040 81 30 LB88A CMPA #'0 * LESS THAN ASCII ZERO? +2644 f042 25 04 BCS LB892 * BRANCH IF SO +2645 f044 81 3c CMPA #';+1 = CHECK FOR NUMERIC VALUE, COLON OR SEMICOLON +2646 f046 25 c0 BCS LB852 = AND INSERT IN BUFFER IF SO +2647 f048 30 1f LB892 LEAX -1,X MOVE INPUT POINTER BACK ONE +2648 f04a 34 50 PSHS U,X SAVE POINTERS TO INPUT STRING, OUTPUT STRING +2649 f04c 0f 41 CLR V41 TOKEN FLAG 0 = COMMAND, FF = SECONDARY +2650 f04e ce e1 0b LDU #COMVEC-10 POINT U TO COMMAND INTERPRETATION +2651 * TABLE FOR BASIC - 10 +2652 f051 0f 42 LB89B CLR V42 INITIALIZE V42 AS TOKEN COUNTER +2653 f053 33 4a LB89D LEAU 10,U MOVE TO NEXT COMMAND INTERPRETATION TABLE +2654 f055 a6 c4 LDA ,U GET NUMBER OF COMMANDS +2655 f057 27 31 BEQ LB8D4 GO DO SECONDARY FUNCTIONS IF NO COMMAND TABLE +2656 f059 10 ae 41 LDY 1,U POINT Y TO COMMAND DICTIONARY TABLE +2657 f05c ae e4 LB8A6 LDX ,S GET POINTER TO INPUT STRING +2658 f05e e6 a0 LB8A8 LDB ,Y+ GET A BYTE FROM DICTIONARY TABLE +2659 f060 e0 80 SUBB ,X+ SUBTRACT INPUT CHARACTER +2660 f062 27 fa BEQ LB8A8 LOOP IF SAME +2661 f064 c1 80 CMPB #$80 LAST CHAR IN RESERVED WORD TABLE HAD +2662 * BIT 7 SET, SO IF WE HAVE $80 HERE +2663 * THEN IT IS A GOOD COMPARE +2664 f066 26 38 BNE LB8EA BRANCH IF NO MATCH - CHECK ANOTHER COMMAND +2665 f068 32 62 LEAS 2,S DELETE OLD INPUT POINTER FROM STACK +2666 f06a 35 40 PULS U GET POINTER TO OUTPUT STRING +2667 f06c da 42 ORB V42 OR IN THE TABLE POSITION TO MAKE THE TOKEN +2668 * - NOTE THAT B ALREADY HAD $80 IN IT - +2669 f06e 96 41 LDA V41 * CHECK TOKEN FLAG AND BRANCH +2670 f070 26 06 BNE LB8C2 * IF SECONDARY +2671 f072 c1 84 CMPB #TOK_ELSE IS IT ELSE TOKEN? +2672 f074 26 06 BNE LB8C6 NO +2673 f076 86 3a LDA #': PUT A COLON (SUBLINE) BEFORE ELSE TOKEN +2674 f078 ed c1 LB8C2 STD ,U++ SECONDARY TOKENS PRECEEDED BY $FF +2675 f07a 20 94 BRA LB85A GO PROCESS MORE INPUT CHARACTERS +2676 f07c e7 c0 LB8C6 STB ,U+ SAVE THIS TOKEN +2677 f07e c1 86 CMPB #TOK_DATA DATA TOKEN? +2678 f080 26 02 BNE LB8CE NO +2679 f082 0c 44 INC V44 SET DATA FLAG +2680 f084 c1 82 LB8CE CMPB #TOK_REM REM TOKEN? +2681 f086 27 aa BEQ LB87C YES +2682 f088 20 86 LB8D2 BRA LB85A GO PROCESS MORE INPUT CHARACTERS +2683 * CHECK FOR A SECONDARY TOKEN +2684 f08a ce e1 10 LB8D4 LDU #COMVEC-5 NOW DO SECONDARY FUNCTIONS +2685 f08d 03 41 COM V41 TOGGLE THE TOKEN FLAG +2686 f08f 26 c0 BNE LB89B BRANCH IF NOW CHECKING SECONDARY COMMANDS +2687 +2688 * THIS CODE WILL PROCESS INPUT DATA WHICH CANNOT BE CRUNCHED AND SO +2689 * IS ASSUMED TO BE ILLEGAL DATA OR AN ILLEGAL TOKEN +2690 f091 35 50 PULS X,U RESTORE INPUT AND OUTPUT POINTERS +2691 f093 a6 80 LDA ,X+ * MOVE THE FIRST CHARACTER OF AN +2692 f095 a7 c0 STA ,U+ * ILLEGAL TOKEN +2693 f097 bd eb 69 JSR LB3A2 SET CARRY IF NOT ALPHA +2694 f09a 25 ec BCS LB8D2 BRANCH IF NOT ALPHA +2695 f09c 03 43 COM V43 SET ILLEGAL TOKEN FLAG IF UPPER CASE ALPHA +2696 f09e 20 e8 BRA LB8D2 PROCESS MORE INPUT CHARACTERS +2697 f0a0 0c 42 LB8EA INC V42 INCREMENT TOKEN COUNTER +2698 f0a2 4a DECA DECR COMMAND COUNTER +2699 f0a3 27 ae BEQ LB89D GET ANOTHER COMMAND TABLE IF DONE W/THIS ONE +2700 f0a5 31 3f LEAY -1,Y MOVE POINTER BACK ONE +2701 f0a7 e6 a0 LB8F1 LDB ,Y+ * GET TO NEXT +2702 f0a9 2a fc BPL LB8F1 * RESERVED WORD +2703 f0ab 20 af BRA LB8A6 GO SEE IF THIS WORD IS A MATCH +2704 +2705 * PRINT +2706 f0ad 27 36 PRINT BEQ LB958 BRANCH IF NO ARGUMENT +2707 f0af 8d 01 BSR LB8FE CHECK FOR ALL PRINT OPTIONS +2708 f0b1 39 RTS +2709 LB8FE +2710 f0b2 27 3e LB91B BEQ LB965 RETURN IF END OF LINE +2711 f0b4 81 9f LB91D CMPA #TOK_TAB TOKEN FOR TAB( ? +2712 f0b6 27 53 BEQ LB97E YES +2713 f0b8 81 2c CMPA #', COMMA? +2714 f0ba 27 37 BEQ LB966 YES - ADVANCE TO NEXT TAB FIELD +2715 f0bc 81 3b CMPA #'; SEMICOLON? +2716 f0be 27 60 BEQ LB997 YES - DO NOT ADVANCE CURSOR +2717 f0c0 bd e9 22 JSR LB156 EVALUATE EXPRESSION +2718 f0c3 96 06 LDA VALTYP * GET VARIABLE TYPE AND +2719 f0c5 34 02 PSHS A * SAVE IT ON THE STACK +2720 f0c7 26 06 BNE LB938 BRANCH IF STRING VARIABLE +2721 f0c9 bd f5 62 JSR LBDD9 CONVERT FP NUMBER TO AN ASCII STRING +2722 f0cc bd ec dd JSR LB516 PARSE A STRING FROM (X-1) AND PUT +2723 * DESCRIPTOR ON STRING STACK +2724 f0cf 8d 57 LB938 BSR LB99F PRINT STRING POINTED TO BY X +2725 f0d1 35 04 PULS B GET VARIABLE TYPE BACK +2726 f0d3 bd e1 73 JSR LA35F SET UP TAB WIDTH ZONE, ETC +2727 f0d6 5d LB949 TSTB CHECK CURRENT PRINT POSITION +2728 f0d7 26 08 BNE LB954 BRANCH IF NOT AT START OF LINE +2729 f0d9 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +2730 f0db 81 2c CMPA #', COMMA? +2731 f0dd 27 14 BEQ LB966 SKIP TO NEXT TAB FIELD +2732 f0df 8d 54 BSR LB9AC SEND A SPACE TO CONSOLE OUT +2733 f0e1 9d 82 LB954 JSR GETCCH GET CURRENT INPUT CHARACTER +2734 f0e3 26 cf BNE LB91D BRANCH IF NOT END OF LINE +2735 f0e5 86 0d LB958 LDA #CR * SEND A CR TO +2736 f0e7 20 51 BRA LB9B1 * CONSOLE OUT +2737 f0e9 bd e1 73 LB95C JSR LA35F SET UP TAB WIDTH, ZONE ETC +2738 f0ec 27 f7 BEQ LB958 BRANCH IF WIDTH = ZERO +2739 f0ee 96 6c LDA DEVPOS GET PRINT POSITION +2740 f0f0 26 f3 BNE LB958 BRANCH IF NOT AT START OF LINE +2741 f0f2 39 LB965 RTS +2742 * SKIP TO NEXT TAB FIELD +2743 f0f3 bd e1 73 LB966 JSR LA35F SET UP TAB WIDTH, ZONE ETC +2744 f0f6 27 0a BEQ LB975 BRANCH IF LINE WIDTH = 0 (CASSETTE) +2745 f0f8 d6 6c LDB DEVPOS GET CURRENT POSITION +2746 f0fa d1 6b CMPB DEVLCF COMPARE TO LAST TAB ZONE +2747 f0fc 25 06 BCS LB977 BRANCH IF < LAST TAB ZONE +2748 f0fe 8d e5 BSR LB958 SEND A CARRIAGE RETURN TO CONSOLE OUT +2749 f100 20 1e BRA LB997 GET MORE DATA +2750 f102 d6 6c LB975 LDB DEVPOS * +2751 f104 d0 6a LB977 SUBB DEVCFW * SUBTRACT TAB FIELD WIDTH FROM CURRENT +2752 f106 24 fc BCC LB977 * POSITION UNTIL CARRY SET - NEGATING THE +2753 f108 50 NEGB * REMAINDER LEAVES THE NUMBER OF SPACES TO NEXT +2754 * * TAB ZONE IN ACCB +2755 f109 20 10 BRA LB98E GO ADVANCE TO NEXT TAB ZONE +2756 +2757 * PRINT TAB( +2758 f10b bd ee d0 LB97E JSR LB709 EVALUATE EXPRESSION - RETURN VALUE IN B +2759 f10e 81 29 CMPA #') * 'SYNTAX' ERROR IF NOT ')' +2760 f110 10 26 f9 2f LBNE LB277 * +2761 f114 bd e1 73 JSR LA35F SET UP TAB WIDTH, ZONE ETC +2762 f117 d0 6c SUBB DEVPOS GET DIFFERENCE OF PRINT POSITION & TAB POSITION +2763 f119 23 05 BLS LB997 BRANCH IF TAB POSITION < CURRENT POSITION +2764 LB98E +2765 f11b 8d 18 LB992 BSR LB9AC SEND A SPACE TO CONSOLE OUT +2766 f11d 5a DECB DECREMENT DIFFERENCE COUNT +2767 f11e 26 fb BNE LB992 BRANCH UNTIL CURRENT POSITION = TAB POSITION +2768 f120 9d 7c LB997 JSR GETNCH GET NEXT CHARACTER FROM BASIC +2769 f122 7e f0 b2 JMP LB91B LOOK FOR MORE PRINT DATA +2770 * COPY A STRING FROM (X) TO CONSOLE OUT +2771 f125 bd ec df LB99C JSR LB518 PARSE A STRING FROM X AND PUT +2772 * DESCRIPTOR ON STRING STACK +2773 f128 bd ee 1e LB99F JSR LB657 GET LENGTH OF STRING AND REMOVE +2774 * DESCRIPTOR FROM STRING STACK +2775 f12b 5c INCB COMPENSATE FOR DECB BELOW +2776 f12c 5a LB9A3 DECB DECREMENT COUNTER +2777 f12d 27 c3 BEQ LB965 EXIT ROUTINE +2778 f12f a6 80 LDA ,X+ GET A CHARACTER FROM X +2779 f131 8d 07 BSR LB9B1 SEND TO CONSOLE OUT +2780 f133 20 f7 BRA LB9A3 KEEP LOOPING +2781 f135 86 20 LB9AC LDA #SPACE SPACE TO CONSOLE OUT +2782 f137 8c FCB SKP2 SKIP NEXT TWO BYTES +2783 f138 86 3f LB9AF LDA #'? QUESTION MARK TO CONSOLE OUT +2784 f13a 7e e0 14 LB9B1 JMP PUTCHR JUMP TO CONSOLE OUT +2785 +2786 * FLOATING POINT MATH PACKAGE +2787 +2788 * ADD .5 TO FPA0 +2789 f13d 8e f6 49 LB9B4 LDX #LBEC0 FLOATING POINT CONSTANT (.5) +2790 f140 20 09 BRA LB9C2 ADD .5 TO FPA0 +2791 * SUBTRACT FPA0 FROM FP NUMBER POINTED +2792 * TO BY (X), LEAVE RESULT IN FPA0 +2793 f142 bd f2 b8 LB9B9 JSR LBB2F COPY PACKED FP DATA FROM (X) TO FPA1 +2794 +2795 * ARITHMETIC OPERATION (-) JUMPS HERE - SUBTRACT FPA0 FROM FPA1 (ENTER +2796 * WITH EXPONENT OF FPA0 IN ACCB AND EXPONENT OF FPA1 IN ACCA) +2797 f145 03 54 LB9BC COM FP0SGN CHANGE MANTISSA SIGN OF FPA0 +2798 f147 03 62 COM RESSGN REVERSE RESULT SIGN FLAG +2799 f149 20 03 BRA LB9C5 GO ADD FPA1 AND FPA0 +2800 * ADD FP NUMBER POINTED TO BY +2801 * (X) TO FPA0 - LEAVE RESULT IN FPA0 +2802 f14b bd f2 b8 LB9C2 JSR LBB2F UNPACK PACKED FP DATA FROM (X) TO +2803 * FPA1; RETURN EXPONENT OF FPA1 IN ACCA +2804 +2805 * ARITHMETIC OPERATION (+) JUMPS HERE - ADD FPA0 TO +2806 +2807 f14e 5d LB9C5 TSTB CHECK EXPONENT OF FPA0 +2808 f14f 10 27 02 80 LBEQ LBC4A COPY FPA1 TO FPA0 IF FPA0 = +2809 f153 8e 00 5c LDX #FP1EXP POINT X TO FPA1 +2810 f156 1f 89 LB9CD TFR A,B PUT EXPONENT OF FPA1 INTO ACCB +2811 f158 5d TSTB CHECK EXPONENT +2812 f159 27 6c BEQ LBA3E RETURN IF EXPONENT = 0 (ADDING 0 TO FPA0) +2813 f15b d0 4f SUBB FP0EXP SUBTRACT EXPONENT OF FPA0 FROM EXPONENT OF FPA1 +2814 f15d 27 69 BEQ LBA3F BRANCH IF EXPONENTS ARE EQUAL +2815 f15f 25 0a BCS LB9E2 BRANCH IF EXPONENT FPA0 > FPA1 +2816 f161 97 4f STA FP0EXP REPLACE FPA0 EXPONENT WITH FPA1 EXPONENT +2817 f163 96 61 LDA FP1SGN * REPLACE FPA0 MANTISSA SIGN +2818 f165 97 54 STA FP0SGN * WITH FPA1 MANTISSA SIGN +2819 f167 8e 00 4f LDX #FP0EXP POINT X TO FPA0 +2820 f16a 50 NEGB NEGATE DIFFERENCE OF EXPONENTS +2821 f16b c1 f8 LB9E2 CMPB #-8 TEST DIFFERENCE OF EXPONENTS +2822 f16d 2f 59 BLE LBA3F BRANCH IF DIFFERENCE OF EXPONENTS <= 8 +2823 f16f 4f CLRA CLEAR OVERFLOW BYTE +2824 f170 64 01 LSR 1,X SHIFT MS BYTE OF MANTISSA; BIT 7 = 0 +2825 f172 bd f2 43 JSR LBABA GO SHIFT MANTISSA OF (X) TO THE RIGHT (B) TIMES +2826 f175 d6 62 LB9EC LDB RESSGN GET SIGN FLAG +2827 f177 2a 0b BPL LB9FB BRANCH IF FPA0 AND FPA1 SIGNS ARE THE SAME +2828 f179 63 01 COM 1,X * COMPLEMENT MANTISSA POINTED +2829 f17b 63 02 COM 2,X * TO BY (X) THE +2830 f17d 63 03 COM 3,X * ADCA BELOW WILL +2831 f17f 63 04 COM 4,X * CONVERT THIS OPERATION +2832 f181 43 COMA * INTO A NEG (MANTISSA) +2833 f182 89 00 ADCA #0 ADD ONE TO ACCA - COMA ALWAYS SETS THE CARRY FLAG +2834 * THE PREVIOUS TWO BYTES MAY BE REPLACED BY A NEGA +2835 * +2836 * ADD MANTISSAS OF FPA0 AND FPA1, PUT RESULT IN FPA0 +2837 f184 97 63 LB9FB STA FPSBYT SAVE FPA SUB BYTE +2838 f186 96 53 LDA FPA0+3 * ADD LS BYTE +2839 f188 99 60 ADCA FPA1+3 * OF MANTISSA +2840 f18a 97 53 STA FPA0+3 SAVE IN FPA0 LSB +2841 f18c 96 52 LDA FPA0+2 * ADD NEXT BYTE +2842 f18e 99 5f ADCA FPA1+2 * OF MANTISSA +2843 f190 97 52 STA FPA0+2 SAVE IN FPA0 +2844 f192 96 51 LDA FPA0+1 * ADD NEXT BYTE +2845 f194 99 5e ADCA FPA1+1 * OF MANTISSA +2846 f196 97 51 STA FPA0+1 SAVE IN FPA0 +2847 f198 96 50 LDA FPA0 * ADD MS BYTE +2848 f19a 99 5d ADCA FPA1 * OF MANTISSA +2849 f19c 97 50 STA FPA0 SAVE IN FPA0 +2850 f19e 5d TSTB TEST SIGN FLAG +2851 f19f 2a 44 BPL LBA5C BRANCH IF FPA0 & FPA1 SIGNS WERE ALIKE +2852 f1a1 25 02 LBA18 BCS LBA1C BRANCH IF POSITIVE MANTISSA +2853 f1a3 8d 5d BSR LBA79 NEGATE FPA0 MANTISSA +2854 +2855 * NORMALIZE FPA0 +2856 f1a5 5f LBA1C CLRB CLEAR TEMPORARY EXPONENT ACCUMULATOR +2857 f1a6 96 50 LBA1D LDA FPA0 TEST MSB OF MANTISSA +2858 f1a8 26 2e BNE LBA4F BRANCH IF <> 0 +2859 f1aa 96 51 LDA FPA0+1 * IF THE MSB IS +2860 f1ac 97 50 STA FPA0 * 0, THEN SHIFT THE +2861 f1ae 96 52 LDA FPA0+2 * MANTISSA A WHOLE BYTE +2862 f1b0 97 51 STA FPA0+1 * AT A TIME. THIS +2863 f1b2 96 53 LDA FPA0+3 * IS FASTER THAN ONE +2864 f1b4 97 52 STA FPA0+2 * BIT AT A TIME +2865 f1b6 96 63 LDA FPSBYT * BUT USES MORE MEMORY. +2866 f1b8 97 53 STA FPA0+3 * FPSBYT, THE CARRY IN +2867 f1ba 0f 63 CLR FPSBYT * BYTE, REPLACES THE MATISSA LSB. +2868 f1bc cb 08 ADDB #8 SHIFTING ONE BYTE = 8 BIT SHIFTS; ADD 8 TO EXPONENT +2869 f1be c1 28 CMPB #5*8 CHECK FOR 5 SHIFTS +2870 f1c0 2d e4 BLT LBA1D BRANCH IF < 5 SHIFTS, IF > 5, THEN MANTISSA = 0 +2871 f1c2 4f LBA39 CLRA A ZERO EXPONENT = 0 FLOATING POINT +2872 f1c3 97 4f LBA3A STA FP0EXP ZERO OUT THE EXPONENT +2873 f1c5 97 54 STA FP0SGN ZERO OUT THE MANTISSA SIGN +2874 f1c7 39 LBA3E RTS +2875 f1c8 8d 6d LBA3F BSR LBAAE SHIFT FPA0 MANTISSA TO RIGHT +2876 f1ca 5f CLRB CLEAR CARRY FLAG +2877 f1cb 20 a8 BRA LB9EC +2878 * SHIFT FPA0 LEFT ONE BIT UNTIL BIT 7 +2879 * OF MATISSA MS BYTE = 1 +2880 f1cd 5c LBA44 INCB ADD ONE TO EXPONENT ACCUMULATOR +2881 f1ce 08 63 ASL FPSBYT SHIFT SUB BYTE ONE LEFT +2882 f1d0 09 53 ROL FPA0+3 SHIFT LS BYTE +2883 f1d2 09 52 ROL FPA0+2 SHIFT NS BYTE +2884 f1d4 09 51 ROL FPA0+1 SHIFT NS BYTE +2885 f1d6 09 50 ROL FPA0 SHIFT MS BYTE +2886 f1d8 2a f3 LBA4F BPL LBA44 BRANCH IF NOT YET NORMALIZED +2887 f1da 96 4f LDA FP0EXP GET CURRENT EXPONENT +2888 f1dc 34 04 PSHS B SAVE EXPONENT MODIFIER CAUSED BY NORMALIZATION +2889 f1de a0 e0 SUBA ,S+ SUBTRACT ACCUMULATED EXPONENT MODIFIER +2890 f1e0 97 4f STA FP0EXP SAVE AS NEW EXPONENT +2891 f1e2 23 de BLS LBA39 SET FPA0 = 0 IF THE NORMALIZATION CAUSED +2892 * MORE OR EQUAL NUMBER OF LEFT SHIFTS THAN THE +2893 * SIZE OF THE EXPONENT +2894 f1e4 8c FCB SKP2 SKIP 2 BYTES +2895 f1e5 25 08 LBA5C BCS LBA66 BRANCH IF MANTISSA OVERFLOW +2896 f1e7 08 63 ASL FPSBYT SUB BYTE BIT 7 TO CARRY - USE AS ROUND-OFF +2897 * FLAG (TRUNCATE THE REST OF SUB BYTE) +2898 f1e9 86 00 LDA #0 CLRA, BUT DO NOT CHANGE CARRY FLAG +2899 f1eb 97 63 STA FPSBYT CLEAR THE SUB BYTE +2900 f1ed 20 0c BRA LBA72 GO ROUND-OFF RESULT +2901 f1ef 0c 4f LBA66 INC FP0EXP INCREMENT EXPONENT - MULTIPLY BY 2 +2902 f1f1 27 28 BEQ LBA92 OVERFLOW ERROR IF CARRY PAST $FF +2903 f1f3 06 50 ROR FPA0 * SHIFT MANTISSA +2904 f1f5 06 51 ROR FPA0+1 * ONE TO +2905 f1f7 06 52 ROR FPA0+2 * THE RIGHT - +2906 f1f9 06 53 ROR FPA0+3 * DIVIDE BY TWO +2907 f1fb 24 04 LBA72 BCC LBA78 BRANCH IF NO ROUND-OFF NEEDED +2908 f1fd 8d 0d BSR LBA83 ADD ONE TO MANTISSA - ROUND OFF +2909 f1ff 27 ee BEQ LBA66 BRANCH iF OVERFLOW - MANTISSA = 0 +2910 f201 39 LBA78 RTS +2911 * NEGATE FPA0 MANTISSA +2912 f202 03 54 LBA79 COM FP0SGN TOGGLE SIGN OF MANTISSA +2913 f204 03 50 LBA7B COM FPA0 * COMPLEMENT ALL 4 MANTISSA BYTES +2914 f206 03 51 COM FPA0+1 * +2915 f208 03 52 COM FPA0+2 * +2916 f20a 03 53 COM FPA0+3 * +2917 * ADD ONE TO FPA0 MANTISSA +2918 f20c 9e 52 LBA83 LDX FPA0+2 * GET BOTTOM 2 MANTISSA +2919 f20e 30 01 LEAX 1,X * BYTES, ADD ONE TO +2920 f210 9f 52 STX FPA0+2 * THEM AND SAVE THEM +2921 f212 26 06 BNE LBA91 BRANCH IF NO OVERFLOW +2922 f214 9e 50 LDX FPA0 * IF OVERFLOW ADD ONE +2923 f216 30 01 LEAX 1,X * TO TOP 2 MANTISSA +2924 f218 9f 50 STX FPA0 * BYTES AND SAVE THEM +2925 f21a 39 LBA91 RTS +2926 f21b c6 0a LBA92 LDB #2*5 OV' OVERFLOW ERROR +2927 f21d 7e e4 46 JMP LAC46 PROCESS AN ERROR +2928 f220 8e 00 12 LBA97 LDX #FPA2-1 POINT X TO FPA2 +2929 * SHIFT FPA POINTED TO BY (X) TO +2930 * THE RIGHT -(B) TIMES. EXIT WITH +2931 * ACCA CONTAINING DATA SHIFTED OUT +2932 * TO THE RIGHT (SUB BYTE) AND THE DATA +2933 * SHIFTED IN FROM THE LEFT WILL COME FROM FPCARY +2934 f223 a6 04 LBA9A LDA 4,X GET LS BYTE OF MANTISSA (X) +2935 f225 97 63 STA FPSBYT SAVE IN FPA SUB BYTE +2936 f227 a6 03 LDA 3,X * SHIFT THE NEXT THREE BYTES OF THE +2937 f229 a7 04 STA 4,X * MANTISSA RIGHT ONE COMPLETE BYTE. +2938 f22b a6 02 LDA 2,X * +2939 f22d a7 03 STA 3,X * +2940 f22f a6 01 LDA 1,X * +2941 f231 a7 02 STA 2,X * +2942 f233 96 5b LDA FPCARY GET THE CARRY IN BYTE +2943 f235 a7 01 STA 1,X STORE AS THE MS MANTISSA BYTE OF (X) +2944 f237 cb 08 LBAAE ADDB #8 ADD 8 TO DIFFERENCE OF EXPONENTS +2945 f239 2f e8 BLE LBA9A BRANCH IF EXPONENT DIFFERENCE < -8 +2946 f23b 96 63 LDA FPSBYT GET FPA SUB BYTE +2947 f23d c0 08 SUBB #8 CAST OUT THE 8 ADDED IN ABOVE +2948 f23f 27 0c BEQ LBAC4 BRANCH IF EXPONENT DIFFERENCE = 0 +2949 +2950 +2951 f241 67 01 LBAB8 ASR 1,X * SHIFT MANTISSA AND SUB BYTE ONE BIT TO THE RIGHT +2952 f243 66 02 LBABA ROR 2,X * +2953 f245 66 03 ROR 3,X * +2954 f247 66 04 ROR 4,X * +2955 f249 46 RORA * +2956 f24a 5c INCB ADD ONE TO EXPONENT DIFFERENCE +2957 f24b 26 f4 BNE LBAB8 BRANCH IF EXPONENTS NOT = +2958 f24d 39 LBAC4 RTS +2959 f24e 81 00 00 00 00 LBAC5 FCB $81,$00,$00,$00,$00 FLOATING POINT CONSTANT 1.0 +2960 +2961 * ARITHMETIC OPERATION (*) JUMPS HERE - MULTIPLY +2962 * FPA0 BY (X) - RETURN PRODUCT IN FPA0 +2963 f253 8d 63 LBACA BSR LBB2F MOVE PACKED FPA FROM (X) TO FPA1 +2964 f255 27 60 LBACC BEQ LBB2E BRANCH IF EXPONENT OF FPA0 = 0 +2965 f257 8d 78 BSR LBB48 CALCULATE EXPONENT OF PRODUCT +2966 * MULTIPLY FPA0 MANTISSA BY FPA1. NORMALIZE +2967 * HIGH ORDER BYTES OF PRODUCT IN FPA0. THE +2968 * LOW ORDER FOUR BYTES OF THE PRODUCT WILL +2969 * BE STORED IN VAB-VAE. +2970 f259 86 00 LBAD0 LDA #0 * ZERO OUT MANTISSA OF FPA2 +2971 f25b 97 13 STA FPA2 * +2972 f25d 97 14 STA FPA2+1 * +2973 f25f 97 15 STA FPA2+2 * +2974 f261 97 16 STA FPA2+3 * +2975 f263 d6 53 LDB FPA0+3 GET LS BYTE OF FPA0 +2976 f265 8d 22 BSR LBB00 MULTIPLY BY FPA1 +2977 f267 d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 4 +2978 f269 d7 8b STB VAE * +2979 f26b d6 52 LDB FPA0+2 GET NUMBER 3 MANTISSA BYTE OF FPA0 +2980 f26d 8d 1a BSR LBB00 MULTIPLY BY FPA1 +2981 f26f d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 3 +2982 f271 d7 8a STB VAD * +2983 f273 d6 51 LDB FPA0+1 GET NUMBER 2 MANTISSA BYTE OF FPA0 +2984 f275 8d 12 BSR LBB00 MULTIPLY BY FPA1 +2985 f277 d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 2 +2986 f279 d7 89 STB VAC * +2987 f27b d6 50 LDB FPA0 GET MS BYTE OF FPA0 MANTISSA +2988 f27d 8d 0c BSR LBB02 MULTIPLY BY FPA1 +2989 f27f d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 1 +2990 f281 d7 88 STB VAB * +2991 f283 bd f3 94 JSR LBC0B COPY MANTISSA FROM FPA2 TO FPA0 +2992 f286 7e f1 a5 JMP LBA1C NORMALIZE FPA0 +2993 f289 27 95 LBB00 BEQ LBA97 SHIFT FPA2 ONE BYTE TO RIGHT +2994 f28b 43 LBB02 COMA SET CARRY FLAG +2995 * MULTIPLY FPA1 MANTISSA BY ACCB AND +2996 * ADD PRODUCT TO FPA2 MANTISSA +2997 f28c 96 13 LBB03 LDA FPA2 GET FPA2 MS BYTE +2998 f28e 56 RORB ROTATE CARRY FLAG INTO SHIFT COUNTER; +2999 * DATA BIT INTO CARRY +3000 f28f 27 26 BEQ LBB2E BRANCH WHEN 8 SHIFTS DONE +3001 f291 24 16 BCC LBB20 DO NOT ADD FPA1 IF DATA BIT = 0 +3002 f293 96 16 LDA FPA2+3 * ADD MANTISSA LS BYTE +3003 f295 9b 60 ADDA FPA1+3 * +3004 f297 97 16 STA FPA2+3 * +3005 f299 96 15 LDA FPA2+2 = ADD MANTISSA NUMBER 3 BYTE +3006 f29b 99 5f ADCA FPA1+2 = +3007 f29d 97 15 STA FPA2+2 = +3008 f29f 96 14 LDA FPA2+1 * ADD MANTISSA NUMBER 2 BYTE +3009 f2a1 99 5e ADCA FPA1+1 * +3010 f2a3 97 14 STA FPA2+1 * +3011 f2a5 96 13 LDA FPA2 = ADD MANTISSA MS BYTE +3012 f2a7 99 5d ADCA FPA1 = +3013 f2a9 46 LBB20 RORA * ROTATE CARRY INTO MS BYTE +3014 f2aa 97 13 STA FPA2 * +3015 f2ac 06 14 ROR FPA2+1 = ROTATE FPA2 ONE BIT TO THE RIGHT +3016 f2ae 06 15 ROR FPA2+2 = +3017 f2b0 06 16 ROR FPA2+3 = +3018 f2b2 06 63 ROR FPSBYT = +3019 f2b4 4f CLRA CLEAR CARRY FLAG +3020 f2b5 20 d5 BRA LBB03 KEEP LOOPING +3021 f2b7 39 LBB2E RTS +3022 * UNPACK A FP NUMBER FROM (X) TO FPA1 +3023 f2b8 ec 01 LBB2F LDD 1,X GET TWO MSB BYTES OF MANTISSA FROM +3024 * FPA POINTED TO BY X +3025 f2ba 97 61 STA FP1SGN SAVE PACKED MANTISSA SIGN BYTE +3026 f2bc 8a 80 ORA #$80 FORCE BIT 7 OF MSB MANTISSA = 1 +3027 f2be dd 5d STD FPA1 SAVE 2 MSB BYTES IN FPA1 +3028 f2c0 d6 61 LDB FP1SGN * GET PACKED MANTISSA SIGN BYTE. EOR W/FPA0 +3029 f2c2 d8 54 EORB FP0SGN * SIGN - NEW SIGN POSITION IF BOTH OLD SIGNS ALIKE, +3030 f2c4 d7 62 STB RESSGN * NEG IF BOTH OLD SIGNS DIFF. SAVE ADJUSTED +3031 * * MANTISSA SIGN BYTE +3032 f2c6 ec 03 LDD 3,X = GET 2 LSB BYTES OF MANTISSA +3033 f2c8 dd 5f STD FPA1+2 = AND PUT IN FPA1 +3034 f2ca a6 84 LDA ,X * GET EXPONENT FROM (X) AND +3035 f2cc 97 5c STA FP1EXP * PUT IN EXPONENT OF FPA1 +3036 f2ce d6 4f LDB FP0EXP GET EXPONENT OF FPA0 +3037 f2d0 39 RTS +3038 * CALCULATE EXPONENT FOR PRODUCT OF FPA0 & FPA1 +3039 * ENTER WITH EXPONENT OF FPA1 IN ACCA +3040 f2d1 4d LBB48 TSTA TEST EXPONENT OF FPA1 +3041 f2d2 27 16 BEQ LBB61 PURGE RETURN ADDRESS & SET FPA0 = 0 +3042 f2d4 9b 4f ADDA FP0EXP ADD FPA1 EXPONENT TO FPA0 EXPONENT +3043 f2d6 46 RORA ROTATE CARRY INTO BIT 7; BIT 0 INTO CARRY +3044 f2d7 49 ROLA SET OVERFLOW FLAG +3045 f2d8 28 10 BVC LBB61 BRANCH IF EXPONENT TOO LARGE OR SMALL +3046 f2da 8b 80 ADDA #$80 ADD $80 BIAS TO EXPONENT +3047 f2dc 97 4f STA FP0EXP SAVE NEW EXPONENT +3048 f2de 27 0c BEQ LBB63 SET FPA0 +3049 f2e0 96 62 LDA RESSGN GET MANTISSA SIGN +3050 f2e2 97 54 STA FP0SGN SAVE AS MANTISSA SIGN OF FPA0 +3051 f2e4 39 RTS +3052 * IF FPA0 = POSITIVE THEN 'OV' ERROR IF FPA0 +3053 * = IS NEGATIVE THEN FPA0 = 0 +3054 f2e5 96 54 LBB5C LDA FP0SGN GET MANTISSA SIGN OF FPA0 +3055 f2e7 43 COMA CHANGE SIGN OF FPA0 MANTISSA +3056 f2e8 20 02 BRA LBB63 +3057 f2ea 32 62 LBB61 LEAS 2,S PURGE RETURN ADDRESS FROM STACK +3058 f2ec 10 2a fe d2 LBB63 LBPL LBA39 ZERO FPA0 MANTISSA SIGN & EXPONENT +3059 f2f0 7e f2 1b LBB67 JMP LBA92 OV' OVERFLOW ERROR +3060 * FAST MULTIPLY BY 10 AND LEAVE RESULT IN FPA0 +3061 f2f3 bd f3 e8 LBB6A JSR LBC5F TRANSFER FPA0 TO FPA1 +3062 f2f6 27 0d BEQ LBB7C BRANCH IF EXPONENT = 0 +3063 f2f8 8b 02 ADDA #2 ADD 2 TO EXPONENT (TIMES 4) +3064 f2fa 25 f4 BCS LBB67 OV' ERROR IF EXPONENT > $FF +3065 f2fc 0f 62 CLR RESSGN CLEAR RESULT SIGN BYTE +3066 f2fe bd f1 56 JSR LB9CD ADD FPA1 TO FPA0 (TIMES 5) +3067 f301 0c 4f INC FP0EXP ADD ONE TO EXPONENT (TIMES 10) +3068 f303 27 eb BEQ LBB67 OV' ERROR IF EXPONENT > $FF +3069 f305 39 LBB7C RTS +3070 f306 84 20 00 00 00 LBB7D FCB $84,$20,$00,$00,$00 FLOATING POINT CONSTANT 10 +3071 * DIVIDE FPA0 BY 10 +3072 f30b bd f3 e8 LBB82 JSR LBC5F MOVE FPA0 TO FPA1 +3073 f30e 8e f3 06 LDX #LBB7D POINT TO FLOATING POINT CONSTANT 10 +3074 f311 5f CLRB ZERO MANTISSA SIGN BYTE +3075 f312 d7 62 LBB89 STB RESSGN STORE THE QUOTIENT MANTISSA SIGN BYTE +3076 f314 bd f3 9d JSR LBC14 UNPACK AN FP NUMBER FROM (X) INTO FPA0 +3077 f317 8c FCB SKP2 SKIP TWO BYTES +3078 * DIVIDE (X) BY FPA0-LEAVE NORMALIZED QUOTIENT IN FPA0 +3079 f318 8d 9e LBB8F BSR LBB2F GET FP NUMBER FROM (X) TO FPA1 +3080 +3081 * ARITHMETIC OPERATION (/) JUMPS HERE. DIVIDE FPA1 BY FPA0 (ENTER WITH +3082 * EXPONENT OF FPA1 IN ACCA AND FLAGS SET BY TSTA) +3083 +3084 * DIVIDE FPA1 BY FPA0 +3085 f31a 27 73 LBB91 BEQ LBC06 /0' DIVIDE BY ZERO ERROR +3086 f31c 00 4f NEG FP0EXP GET EXPONENT OF RECIPROCAL OF DIVISOR +3087 f31e 8d b1 BSR LBB48 CALCULATE EXPONENT OF QUOTIENT +3088 f320 0c 4f INC FP0EXP INCREMENT EXPONENT +3089 f322 27 cc BEQ LBB67 OV' OVERFLOW ERROR +3090 f324 8e 00 13 LDX #FPA2 POINT X TO MANTISSA OF FPA2 - HOLD +3091 * TEMPORARY QUOTIENT IN FPA2 +3092 f327 c6 04 LDB #4 5 BYTE DIVIDE +3093 f329 d7 03 STB TMPLOC SAVE BYTE COUNTER +3094 f32b c6 01 LDB #1 SHIFT COUNTER-AND TEMPORARY QUOTIENT BYTE +3095 * COMPARE FPA0 MANTISSA TO FPA1 MANTISSA - +3096 * SET CARRY FLAG IF FPA1 >= FPA0 +3097 f32d 96 50 LBBA4 LDA FPA0 * COMPARE THE TWO MS BYTES +3098 f32f 91 5d CMPA FPA1 * OF FPA0 AND FPA1 AND +3099 f331 26 13 BNE LBBBD * BRANCH IF <> +3100 f333 96 51 LDA FPA0+1 = COMPARE THE NUMBER 2 +3101 f335 91 5e CMPA FPA1+1 = BYTES AND +3102 f337 26 0d BNE LBBBD = BRANCH IF <> +3103 f339 96 52 LDA FPA0+2 * COMPARE THE NUMBER 3 +3104 f33b 91 5f CMPA FPA1+2 * BYTES AND +3105 f33d 26 07 BNE LBBBD * BRANCH IF <> +3106 f33f 96 53 LDA FPA0+3 = COMPARE THE LS BYTES +3107 f341 91 60 CMPA FPA1+3 = AND BRANCH +3108 f343 26 01 BNE LBBBD = IF <> +3109 f345 43 COMA SET CARRY FLAG IF FPA0 = FPA1 +3110 f346 1f a8 LBBBD TFR CC,A SAVE CARRY FLAG STATUS IN ACCA; CARRY +3111 * CLEAR IF FPA0 > FPA1 +3112 f348 59 ROLB ROTATE CARRY INTO TEMPORARY QUOTIENT BYTE +3113 f349 24 0a BCC LBBCC CARRY WILL BE SET AFTER 8 SHIFTS +3114 f34b e7 80 STB ,X+ SAVE TEMPORARY QUOTIENT +3115 f34d 0a 03 DEC TMPLOC DECREMENT BYTE COUNTER +3116 f34f 2b 34 BMI LBBFC BRANCH IF DONE +3117 f351 27 2e BEQ LBBF8 BRANCH IF LAST BYTE +3118 f353 c6 01 LDB #1 RESET SHIFT COUNTER AND TEMPORARY QUOTIENT BYTE +3119 f355 1f 8a LBBCC TFR A,CC RESTORE CARRY FLAG AND +3120 f357 25 0e BCS LBBDE BRANCH IF FPA0 =< FPA1 +3121 f359 08 60 LBBD0 ASL FPA1+3 * SHIFT FPA1 MANTISSA 1 BIT TO LEFT +3122 f35b 09 5f ROL FPA1+2 * +3123 f35d 09 5e ROL FPA1+1 * +3124 f35f 09 5d ROL FPA1 * +3125 f361 25 e3 BCS LBBBD BRANCH IF CARRY - ADD ONE TO PARTIAL QUOTIENT +3126 f363 2b c8 BMI LBBA4 IF MSB OF HIGH ORDER MANTISSA BYTE IS +3127 * SET, CHECK THE MAGNITUDES OF FPA0, FPA1 +3128 f365 20 df BRA LBBBD CARRY IS CLEAR, CHECK ANOTHER BIT +3129 * SUBTRACT FPA0 FROM FPA1 - LEAVE RESULT IN FPA1 +3130 f367 96 60 LBBDE LDA FPA1+3 * SUBTRACT THE LS BYTES OF MANTISSA +3131 f369 90 53 SUBA FPA0+3 * +3132 f36b 97 60 STA FPA1+3 * +3133 f36d 96 5f LDA FPA1+2 = THEN THE NEXT BYTE +3134 f36f 92 52 SBCA FPA0+2 = +3135 f371 97 5f STA FPA1+2 = +3136 f373 96 5e LDA FPA1+1 * AND THE NEXT +3137 f375 92 51 SBCA FPA0+1 * +3138 f377 97 5e STA FPA1+1 * +3139 f379 96 5d LDA FPA1 = AND FINALLY, THE MS BYTE OF MANTISSA +3140 f37b 92 50 SBCA FPA0 = +3141 f37d 97 5d STA FPA1 = +3142 f37f 20 d8 BRA LBBD0 GO SHIFT FPA1 +3143 f381 c6 40 LBBF8 LDB #$40 USE ONLY TWO BITS OF THE LAST BYTE (FIFTH) +3144 f383 20 d0 BRA LBBCC GO SHIFT THE LAST BYTE +3145 f385 56 LBBFC RORB * SHIFT CARRY (ALWAYS SET HERE) INTO +3146 f386 56 RORB * BIT 5 AND MOVE +3147 f387 56 RORB * BITS 1,0 TO BITS 7,6 +3148 f388 d7 63 STB FPSBYT SAVE SUB BYTE +3149 f38a 8d 08 BSR LBC0B MOVE MANTISSA OF FPA2 TO FPA0 +3150 f38c 7e f1 a5 JMP LBA1C NORMALIZE FPA0 +3151 f38f c6 14 LBC06 LDB #2*10 /0' ERROR +3152 f391 7e e4 46 JMP LAC46 PROCESS THE ERROR +3153 * COPY MANTISSA FROM FPA2 TO FPA0 +3154 f394 9e 13 LBC0B LDX FPA2 * MOVE TOP 2 BYTES +3155 f396 9f 50 STX FPA0 * +3156 f398 9e 15 LDX FPA2+2 = MOVE BOTTOM 2 BYTES +3157 f39a 9f 52 STX FPA0+2 = +3158 f39c 39 RTS +3159 * COPY A PACKED FP NUMBER FROM (X) TO FPA0 +3160 f39d 34 02 LBC14 PSHS A SAVE ACCA +3161 f39f ec 01 LDD 1,X GET TOP TWO MANTISSA BYTES +3162 f3a1 97 54 STA FP0SGN SAVE MS BYTE OF MANTISSA AS MANTISSA SIGN +3163 f3a3 8a 80 ORA #$80 UNPACK MS BYTE +3164 f3a5 dd 50 STD FPA0 SAVE UNPACKED TOP 2 MANTISSA BYTES +3165 f3a7 0f 63 CLR FPSBYT CLEAR MANTISSA SUB BYTE +3166 f3a9 e6 84 LDB ,X GET EXPONENT TO ACCB +3167 f3ab ae 03 LDX 3,X * MOVE LAST 2 +3168 f3ad 9f 52 STX FPA0+2 * MANTISSA BYTES +3169 f3af d7 4f STB FP0EXP SAVE EXPONENT +3170 f3b1 35 82 PULS A,PC RESTORE ACCA AND RETURN +3171 +3172 f3b3 8e 00 45 LBC2A LDX #V45 POINT X TO MANTISSA OF FPA4 +3173 f3b6 20 06 BRA LBC35 MOVE FPA0 TO FPA4 +3174 f3b8 8e 00 40 LBC2F LDX #V40 POINT X TO MANTISSA OF FPA3 +3175 f3bb 8c FCB SKP2 SKIP TWO BYTES +3176 f3bc 9e 3b LBC33 LDX VARDES POINT X TO VARIABLE DESCRIPTOR IN VARDES +3177 * PACK FPA0 AND MOVE IT TO ADDRESS IN X +3178 f3be 96 4f LBC35 LDA FP0EXP * COPY EXPONENT +3179 f3c0 a7 84 STA ,X * +3180 f3c2 96 54 LDA FP0SGN GET MANTISSA SIGN BIT +3181 f3c4 8a 7f ORA #$7F MASK THE BOTTOM 7 BITS +3182 f3c6 94 50 ANDA FPA0 AND BIT 7 OF MANTISSA SIGN INTO BIT 7 OF MS BYTE +3183 f3c8 a7 01 STA 1,X SAVE MS BYTE +3184 f3ca 96 51 LDA FPA0+1 * MOVE 2ND MANTISSA BYTE +3185 f3cc a7 02 STA 2,X * +3186 f3ce de 52 LDU FPA0+2 = MOVE BOTTOM 2 MANTISSA BYTES +3187 f3d0 ef 03 STU 3,X = +3188 f3d2 39 RTS +3189 * MOVE FPA1 TO FPA0 RETURN W/MANTISSA SIGN IN ACCA +3190 f3d3 96 61 LBC4A LDA FP1SGN * COPY MANTISSA SIGN FROM +3191 f3d5 97 54 LBC4C STA FP0SGN * FPA1 TO FPA0 +3192 f3d7 9e 5c LDX FP1EXP = COPY EXPONENT + MS BYTE FROM +3193 f3d9 9f 4f STX FP0EXP = FPA1 TO FPA0 +3194 f3db 0f 63 CLR FPSBYT CLEAR MANTISSA SUB BYTE +3195 f3dd 96 5e LDA FPA1+1 * COPY 2ND MANTISSA BYTE +3196 f3df 97 51 STA FPA0+1 * FROM FPA1 TO FPA0 +3197 f3e1 96 54 LDA FP0SGN GET MANTISSA SIGN +3198 f3e3 9e 5f LDX FPA1+2 * COPY 3RD AND 4TH MANTISSA BYTE +3199 f3e5 9f 52 STX FPA0+2 * FROM FPA1 TO FPA0 +3200 f3e7 39 RTS +3201 * TRANSFER FPA0 TO FPA1 +3202 f3e8 dc 4f LBC5F LDD FP0EXP * TRANSFER EXPONENT & MS BYTE +3203 f3ea dd 5c STD FP1EXP * +3204 f3ec 9e 51 LDX FPA0+1 = TRANSFER MIDDLE TWO BYTES +3205 f3ee 9f 5e STX FPA1+1 = +3206 f3f0 9e 53 LDX FPA0+3 * TRANSFER BOTTOM TWO BYTES +3207 f3f2 9f 60 STX FPA1+3 * +3208 f3f4 4d TSTA SET FLAGS ACCORDING TO EXPONENT +3209 f3f5 39 RTS +3210 * CHECK FPA0; RETURN ACCB = 0 IF FPA0 = 0, +3211 * ACCB = $FF IF FPA0 = NEGATIVE, ACCB = 1 IF FPA0 = POSITIVE +3212 f3f6 d6 4f LBC6D LDB FP0EXP GET EXPONENT +3213 f3f8 27 08 BEQ LBC79 BRANCH IF FPA0 = 0 +3214 f3fa d6 54 LBC71 LDB FP0SGN GET SIGN OF MANTISSA +3215 f3fc 59 LBC73 ROLB BIT 7 TO CARRY +3216 f3fd c6 ff LDB #$FF NEGATIVE FLAG +3217 f3ff 25 01 BCS LBC79 BRANCH IF NEGATIVE MANTISSA +3218 f401 50 NEGB ACCB = 1 IF POSITIVE MANTISSA +3219 f402 39 LBC79 RTS +3220 +3221 * SGN +3222 f403 8d f1 SGN BSR LBC6D SET ACCB ACCORDING TO SIGN OF FPA0 +3223 * CONVERT A SIGNED NUMBER IN ACCB INTO A FLOATING POINT NUMBER +3224 f405 d7 50 LBC7C STB FPA0 SAVE ACCB IN FPA0 +3225 f407 0f 51 CLR FPA0+1 CLEAR NUMBER 2 MANTISSA BYTE OF FPA0 +3226 f409 c6 88 LDB #$88 EXPONENT REQUIRED IF FPA0 IS TO BE AN INTEGER +3227 f40b 96 50 LBC82 LDA FPA0 GET MS BYTE OF MANTISSA +3228 f40d 80 80 SUBA #$80 SET CARRY IF POSITIVE MANTISSA +3229 f40f d7 4f LBC86 STB FP0EXP SAVE EXPONENT +3230 f411 dc 74 LDD ZERO * ZERO OUT ACCD AND +3231 f413 dd 52 STD FPA0+2 * BOTTOM HALF OF FPA0 +3232 f415 97 63 STA FPSBYT CLEAR SUB BYTE +3233 f417 97 54 STA FP0SGN CLEAR SIGN OF FPA0 MANTISSA +3234 f419 7e f1 a1 JMP LBA18 GO NORMALIZE FPA0 +3235 +3236 * ABS +3237 f41c 0f 54 ABS CLR FP0SGN FORCE MANTISSA SIGN OF FPA0 POSITIVE +3238 f41e 39 RTS +3239 * COMPARE A PACKED FLOATING POINT NUMBER POINTED TO +3240 * BY (X) TO AN UNPACKED FP NUMBER IN FPA0. RETURN +3241 * ZERO FLAG SET AND ACCB = 0, IF EQUAL; ACCB = 1 IF +3242 * FPA0 > (X); ACCB = $FF IF FPA0 < (X) +3243 f41f e6 84 LBC96 LDB ,X CHECK EXPONENT OF (X) +3244 f421 27 d3 BEQ LBC6D BRANCH IF FPA = 0 +3245 f423 e6 01 LDB 1,X GET MS BYTE OF MANTISSA OF (X) +3246 f425 d8 54 EORB FP0SGN EOR WITH SIGN OF FPA0 +3247 f427 2b d1 BMI LBC71 BRANCH IF SIGNS NOT = +3248 * COMPARE FPA0 WITH FP NUMBER POINTED TO BY (X). +3249 * FPA0 IS NORMALIZED, (X) IS PACKED. +3250 f429 d6 4f LBCA0 LDB FP0EXP * GET EXPONENT OF +3251 f42b e1 84 CMPB ,X * FPA0, COMPARE TO EXPONENT OF +3252 f42d 26 1d BNE LBCC3 * (X) AND BRANCH IF <>. +3253 f42f e6 01 LDB 1,X * GET MS BYTE OF (X), KEEP ONLY +3254 f431 ca 7f ORB #$7F * THE SIGN BIT - 'AND' THE BOTTOM 7 +3255 f433 d4 50 ANDB FPA0 * BITS OF FPA0 INTO ACCB +3256 f435 e1 01 CMPB 1,X = COMPARE THE BOTTOM 7 BITS OF THE MANTISSA +3257 f437 26 13 BNE LBCC3 = MS BYTE AND BRANCH IF <> +3258 f439 d6 51 LDB FPA0+1 * COMPARE 2ND BYTE +3259 f43b e1 02 CMPB 2,X * OF MANTISSA, +3260 f43d 26 0d BNE LBCC3 * BRANCH IF <> +3261 f43f d6 52 LDB FPA0+2 = COMPARE 3RD BYTE +3262 f441 e1 03 CMPB 3,X = OF MANTISSA, +3263 f443 26 07 BNE LBCC3 = BRANCH IF <> +3264 f445 d6 53 LDB FPA0+3 * SUBTRACT LS BYTE +3265 f447 e0 04 SUBB 4,X * OF (X) FROM LS BYTE OF +3266 f449 26 01 BNE LBCC3 * FPA0, BRANCH IF <> +3267 f44b 39 RTS RETURN IF FP (X) = FPA0 +3268 f44c 56 LBCC3 RORB SHIFT CARRY TO BIT 7; CARRY SET IF FPA0 < (X) +3269 f44d d8 54 EORB FP0SGN TOGGLE SIZE COMPARISON BIT IF FPA0 IS NEGATIVE +3270 f44f 20 ab BRA LBC73 GO SET ACCB ACCORDING TO COMPARISON +3271 * DE-NORMALIZE FPA0 : SHIFT THE MANTISSA UNTIL THE BINARY POINT IS TO THE RIGHT +3272 * OF THE LEAST SIGNIFICANT BYTE OF THE MANTISSA +3273 f451 d6 4f LBCC8 LDB FP0EXP GET EXPONENT OF FPA0 +3274 f453 27 3d BEQ LBD09 ZERO MANTISSA IF FPA0 = 0 +3275 f455 c0 a0 SUBB #$A0 SUBTRACT $A0 FROM FPA0 EXPONENT T THIS WILL YIELD +3276 * THE NUMBER OF SHIFTS REQUIRED TO DENORMALIZE FPA0. WHEN +3277 * THE EXPONENT OF FPA0 IS = ZERO, THEN THE BINARY POINT +3278 * WILL BE TO THE RIGHT OF THE MANTISSA +3279 f457 96 54 LDA FP0SGN TEST SIGN OF FPA0 MANTISSA +3280 f459 2a 05 BPL LBCD7 BRANCH IF POSITIVE +3281 f45b 03 5b COM FPCARY COMPLEMENT CARRY IN BYTE +3282 f45d bd f2 04 JSR LBA7B NEGATE MANTISSA OF FPA0 +3283 f460 8e 00 4f LBCD7 LDX #FP0EXP POINT X TO FPA0 +3284 f463 c1 f8 CMPB #-8 EXPONENT DIFFERENCE < -8? +3285 f465 2e 06 BGT LBCE4 YES +3286 f467 bd f2 37 JSR LBAAE SHIFT FPA0 RIGHT UNTIL FPA0 EXPONENT = $A0 +3287 f46a 0f 5b CLR FPCARY CLEAR CARRY IN BYTE +3288 f46c 39 RTS +3289 f46d 0f 5b LBCE4 CLR FPCARY CLEAR CARRY IN BYTE +3290 f46f 96 54 LDA FP0SGN * GET SIGN OF FPA0 MANTISSA +3291 f471 49 ROLA * ROTATE IT INTO THE CARRY FLAG +3292 f472 06 50 ROR FPA0 ROTATE CARRY (MANTISSA SIGN) INTO BIT 7 +3293 * OF LS BYTE OF MANTISSA +3294 f474 7e f2 43 JMP LBABA DE-NORMALIZE FPA0 +3295 +3296 * INT +3297 * THE INT STATEMENT WILL "DENORMALIZE" FPA0 - THAT IS IT WILL SHIFT THE BINARY POINT +3298 * TO THE EXTREME RIGHT OF THE MANTISSA TO FORCE ITS EXPONENT TO BE $AO. ONCE +3299 * THIS IS DONE THE MANTISSA OF FPA0 WILL CONTAIN THE FOUR LEAST SIGNIFICANT +3300 * BYTES OF THE INTEGER PORTION OF FPA0. AT THE CONCLUSION OF THE DE-NORMALIZATION +3301 * ONLY THE INTEGER PORTION OF FPA0 WILL REMAIN. +3302 * +3303 f477 d6 4f INT LDB FP0EXP GET EXPONENT OF FPA0 +3304 f479 c1 a0 CMPB #$A0 LARGEST POSSIBLE INTEGER EXPONENT +3305 f47b 24 1d BCC LBD11 RETURN IF FPA0 >= 32768 +3306 f47d 8d d2 BSR LBCC8 SHIFT THE BINARY POINT ONE TO THE RIGHT OF THE +3307 * LS BYTE OF THE FPA0 MANTISSA +3308 f47f d7 63 STB FPSBYT ACCB = 0: ZERO OUT THE SUB BYTE +3309 f481 96 54 LDA FP0SGN GET MANTISSA SIGN +3310 f483 d7 54 STB FP0SGN FORCE MANTISSA SIGN TO BE POSITIVE +3311 f485 80 80 SUBA #$80 SET CARRY IF MANTISSA +3312 f487 86 a0 LDA #$A0 * GET DENORMALIZED EXPONENT AND +3313 f489 97 4f STA FP0EXP * SAVE IT IN FPA0 EXPONENT +3314 f48b 96 53 LDA FPA0+3 = GET LS BYTE OF FPA0 AND +3315 f48d 97 01 STA CHARAC = SAVE IT IN CHARAC +3316 f48f 7e f1 a1 JMP LBA18 NORMALIZE FPA0 +3317 +3318 f492 d7 50 LBD09 STB FPA0 * LOAD MANTISSA OF FPA0 WITH CONTENTS OF ACCB +3319 f494 d7 51 STB FPA0+1 * +3320 f496 d7 52 STB FPA0+2 * +3321 f498 d7 53 STB FPA0+3 * +3322 f49a 39 LBD11 RTS * +3323 +3324 * CONVERT ASCII STRING TO FLOATING POINT +3325 f49b 9e 74 LBD12 LDX ZERO (X) = 0 +3326 f49d 9f 54 STX FP0SGN * ZERO OUT FPA0 & THE SIGN FLAG (COEFCT) +3327 f49f 9f 4f STX FP0EXP * +3328 f4a1 9f 51 STX FPA0+1 * +3329 f4a3 9f 52 STX FPA0+2 * +3330 f4a5 9f 47 STX V47 INITIALIZE EXPONENT & EXPONENT SIGN FLAG TO ZERO +3331 f4a7 9f 45 STX V45 INITIALIZE RIGHT DECIMAL CTR & DECIMAL PT FLAG TO 0 +3332 f4a9 25 64 BCS LBD86 IF CARRY SET (NUMERIC CHARACTER), ASSUME ACCA CONTAINS FIRST +3333 * NUMERIC CHAR, SIGN IS POSITIVE AND SKIP THE RAM HOOK +3334 f4ab bd fb d8 JSR XVEC19 CALL EXTENDED BASIC ADD-IN +3335 f4ae 81 2d LBD25 CMPA #'- * CHECK FOR A LEADING MINUS SIGN AND BRANCH +3336 f4b0 26 04 BNE LBD2D * IF NO MINUS SIGN +3337 f4b2 03 55 COM COEFCT TOGGLE SIGN; 0 = +; FF = - +3338 f4b4 20 04 BRA LBD31 INTERPRET THE REST OF THE STRING +3339 f4b6 81 2b LBD2D CMPA #'+ * CHECK FOR LEADING PLUS SlGN AND BRANCH +3340 f4b8 26 04 BNE LBD35 * IF NOT A PLUS SIGN +3341 f4ba 9d 7c LBD31 JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC +3342 f4bc 25 51 BCS LBD86 BRANCH IF NUMERIC CHARACTER +3343 f4be 81 2e LBD35 CMPA #'. DECIMAL POlNT? +3344 f4c0 27 28 BEQ LBD61 YES +3345 f4c2 81 45 CMPA #'E "E" SHORTHAND FORM (SCIENTIFIC NOTATION)? +3346 f4c4 26 28 BNE LBD65 NO +3347 * EVALUATE EXPONENT OF EXPONENTIAL FORMAT +3348 f4c6 9d 7c JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC +3349 f4c8 25 64 BCS LBDA5 BRANCH IF NUMERIC +3350 f4ca 81 a7 CMPA #TOK_MINUS MINUS TOKEN? +3351 f4cc 27 0e BEQ LBD53 YES +3352 f4ce 81 2d CMPA #'- ASCII MINUS? +3353 f4d0 27 0a BEQ LBD53 YES +3354 f4d2 81 a6 CMPA #TOK_PLUS PLUS TOKEN? +3355 f4d4 27 08 BEQ LBD55 YES +3356 f4d6 81 2b CMPA #'+ ASCII PLUS? +3357 f4d8 27 04 BEQ LBD55 YES +3358 f4da 20 06 BRA LBD59 BRANCH IF NO SIGN FOUND +3359 f4dc 03 48 LBD53 COM V48 SET EXPONENT SIGN FLAG TO NEGATIVE +3360 * STRIP A DECIMAL NUMBER FROM BASIC LINE, CONVERT IT TO BINARY IN V47 +3361 f4de 9d 7c LBD55 JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC +3362 f4e0 25 4c BCS LBDA5 IF NUMERIC CHARACTER, CONVERT TO BINARY +3363 f4e2 0d 48 LBD59 TST V48 * CHECK EXPONENT SIGN FLAG +3364 f4e4 27 08 BEQ LBD65 * AND BRANCH IF POSITIVE +3365 f4e6 00 47 NEG V47 NEGATE VALUE OF EXPONENT +3366 f4e8 20 04 BRA LBD65 +3367 f4ea 03 46 LBD61 COM V46 *TOGGLE DECIMAL PT FLAG AND INTERPRET ANOTHER +3368 f4ec 26 cc BNE LBD31 *CHARACTER IF <> 0 - TERMINATE INTERPRETATION +3369 * IF SECOND DECIMAL POINT +3370 * ADJUST FPA0 FOR THE DECIMAL EXPONENT IN V47 +3371 f4ee 96 47 LBD65 LDA V47 * GET EXPONENT, SUBTRACT THE NUMBER OF +3372 f4f0 90 45 SUBA V45 * PLACES TO THE RIGHT OF DECIMAL POINT +3373 f4f2 97 47 STA V47 * AND RESAVE IT. +3374 f4f4 27 12 BEQ LBD7F EXIT ROUTINE IF ADJUSTED EXPONENT = ZERO +3375 f4f6 2a 09 BPL LBD78 BRANCH IF POSITIVE EXPONENT +3376 f4f8 bd f3 0b LBD6F JSR LBB82 DIVIDE FPA0 BY 10 +3377 f4fb 0c 47 INC V47 INCREMENT EXPONENT COUNTER (MULTIPLY BY 10) +3378 f4fd 26 f9 BNE LBD6F KEEP MULTIPLYING +3379 f4ff 20 07 BRA LBD7F EXIT ROUTINE +3380 f501 bd f2 f3 LBD78 JSR LBB6A MULTIPLY FPA0 BY 10 +3381 f504 0a 47 DEC V47 DECREMENT EXPONENT COUNTER (DIVIDE BY 10) +3382 f506 26 f9 BNE LBD78 KEEP MULTIPLYING +3383 f508 96 55 LBD7F LDA COEFCT GET THE SIGN FLAG +3384 f50a 2a 8e BPL LBD11 RETURN IF POSITIVE +3385 f50c 7e f6 72 JMP LBEE9 TOGGLE MANTISSA SIGN OF FPA0, IF NEGATIVE +3386 *MULTIPLY FPA0 BY TEN AND ADD ACCA TO THE RESULT +3387 f50f d6 45 LBD86 LDB V45 *GET THE RIGHT DECIMAL COUNTER AND SUBTRACT +3388 f511 d0 46 SUBB V46 *THE DECIMAL POINT FLAG FROM IT. IF DECIMAL POINT +3389 f513 d7 45 STB V45 *FLAG=0, NOTHING HAPPENS. IF DECIMAL POINT FLAG IS +3390 * -1, THEN RIGHT DECIMAL COUNTER IS INCREMENTED BY ONE +3391 f515 34 02 PSHS A SAVE NEW DIGIT ON STACK +3392 f517 bd f2 f3 JSR LBB6A MULTIPLY FPA0 BY 10 +3393 f51a 35 04 PULS B GET NEW DIGIT BACK +3394 f51c c0 30 SUBB #'0 MASK OFF ASCII +3395 f51e 8d 02 BSR LBD99 ADD ACCB TO FPA0 +3396 f520 20 98 BRA LBD31 GET ANOTHER CHARACTER FROM BASIC +3397 f522 bd f3 b8 LBD99 JSR LBC2F PACK FPA0 AND SAVE IT IN FPA3 +3398 f525 bd f4 05 JSR LBC7C CONVERT ACCB TO FP NUMBER IN FPA0 +3399 f528 8e 00 40 LDX #V40 * ADD FPA0 TO +3400 f52b 7e f1 4b JMP LB9C2 * FPA3 +3401 +3402 +3403 f52e d6 47 LBDA5 LDB V47 +3404 f530 58 ASLB TIMES 2 +3405 f531 58 ASLB TIMES 4 +3406 f532 db 47 ADDB V47 ADD 1 = TIMES 5 +3407 f534 58 ASLB TIMES 10 +3408 f535 80 30 SUBA #'0 *MASK OFF ASCII FROM ACCA, PUSH +3409 f537 34 04 PSHS B *RESULT ONTO THE STACK AND +3410 f539 ab e0 ADDA ,S+ ADD lT TO ACCB +3411 f53b 97 47 STA V47 SAVE IN V47 +3412 f53d 20 9f BRA LBD55 INTERPRET ANOTHER CHARACTER +3413 * +3414 f53f 9b 3e bc 1f fd LBDB6 FCB $9B,$3E,$BC,$1F,$FD * 99999999.9 +3415 f544 9e 6e 6b 27 fd LBDBB FCB $9E,$6E,$6B,$27,$FD * 999999999 +3416 f549 9e 6e 6b 28 00 LBDC0 FCB $9E,$6E,$6B,$28,$00 * 1E + 09 +3417 * +3418 f54e 8e e3 e7 LBDC5 LDX #LABE8-1 POINT X TO " IN " MESSAGE +3419 f551 8d 0c BSR LBDD6 COPY A STRING FROM (X) TO CONSOLE OUT +3420 f553 dc 68 LDD CURLIN GET CURRENT BASIC LINE NUMBER TO ACCD +3421 * CONVERT VALUE IN ACCD INTO A DECIMAL NUMBER +3422 * AND PRINT IT TO CONSOLE OUT +3423 f555 dd 50 LBDCC STD FPA0 SAVE ACCD IN TOP HALF OF FPA0 +3424 f557 c6 90 LDB #$90 REQ�D EXPONENT IF TOP HALF OF ACCD = INTEGER +3425 f559 43 COMA SET CARRY FLAG - FORCE POSITIVE MANTISSA +3426 f55a bd f4 0f JSR LBC86 ZERO BOTTOM HALF AND SIGN OF FPA0, THEN +3427 * SAVE EXPONENT AND NORMALIZE IT +3428 f55d 8d 03 BSR LBDD9 CONVERT FP NUMBER TO ASCII STRING +3429 f55f 7e f1 25 LBDD6 JMP LB99C COPY A STRING FROM (X) TO CONSOLE OUT +3430 +3431 * CONVERT FP NUMBER TO ASCII STRING +3432 f562 ce 01 f1 LBDD9 LDU #STRBUF+3 POINT U TO BUFFER WHICH WILL NOT CAUSE +3433 * THE STRING TO BE STORED IN STRING SPACE +3434 f565 86 20 LBDDC LDA #SPACE SPACE = DEFAULT SIGN FOR POSITIVE # +3435 f567 d6 54 LDB FP0SGN GET SIGN OF FPA0 +3436 f569 2a 02 BPL LBDE4 BRANCH IF POSITIVE +3437 f56b 86 2d LDA #'- ASCII MINUS SIGN +3438 f56d a7 c0 LBDE4 STA ,U+ STORE SIGN OF NUMBER +3439 f56f df 64 STU COEFPT SAVE BUFFER POINTER +3440 f571 97 54 STA FP0SGN SAVE SIGN (IN ASCII) +3441 f573 86 30 LDA #'0 ASCII ZERO IF EXPONENT = 0 +3442 f575 d6 4f LDB FP0EXP GET FPA0 EXPONENT +3443 f577 10 27 00 c6 LBEQ LBEB8 BRANCH IF FPA0 = 0 +3444 f57b 4f CLRA BASE 10 EXPONENT=0 FOR FP NUMBER > 1 +3445 f57c c1 80 CMPB #$80 CHECK EXPONENT +3446 f57e 22 08 BHI LBDFF BRANCH IF FP NUMBER > 1 +3447 * IF FPA0 < 1.0, MULTIPLY IT BY 1E+09 TO SPEED UP THE CONVERSION PROCESS +3448 f580 8e f5 49 LDX #LBDC0 POINT X TO FP 1E+09 +3449 f583 bd f2 53 JSR LBACA MULTIPLY FPA0 BY (X) +3450 f586 86 f7 LDA #-9 BASE 10 EXPONENT = -9 +3451 f588 97 45 LBDFF STA V45 BASE 10 EXPONENT +3452 * PSEUDO - NORMALIZE THE FP NUMBER TO A VALUE IN THE RANGE +3453 * OF 999,999,999 RO 99,999,999.9 - THIS IS THE LARGEST +3454 * NUMBER RANGE IN WHICH ALL OF THE DIGITS ARE +3455 * SIGNIFICANT WHICH CAN BE DISPLAYED WITHOUT USING +3456 * SCIENTIFIC NOTATION +3457 f58a 8e f5 44 LBE01 LDX #LBDBB POINT X TO FP 999,999,999 +3458 f58d bd f4 29 JSR LBCA0 COMPARE FPA0 TO 999,999,999 +3459 f590 2e 0f BGT LBE18 BRANCH IF > 999,999,999 +3460 f592 8e f5 3f LBE09 LDX #LBDB6 POINT X TO FP 99,999,999.9 +3461 f595 bd f4 29 JSR LBCA0 COMPARE FPA0 TO 99,999,999.9 +3462 f598 2e 0e BGT LBE1F BRANCH IF > 99,999,999.9 (IN RANGE) +3463 f59a bd f2 f3 JSR LBB6A MULTIPLY FPA0 BY 10 +3464 f59d 0a 45 DEC V45 SUBTRACT ONE FROM DECIMAL OFFSET +3465 f59f 20 f1 BRA LBE09 PSEUDO - NORMALIZE SOME MORE +3466 f5a1 bd f3 0b LBE18 JSR LBB82 DIVIDE FPA0 BY 10 +3467 f5a4 0c 45 INC V45 ADD ONE TO BASE 10 EXPONENT +3468 f5a6 20 e2 BRA LBE01 PSEUDO - NORMALIZE SOME MORE +3469 f5a8 bd f1 3d LBE1F JSR LB9B4 ADD .5 TO FPA0 (ROUND OFF) +3470 f5ab bd f4 51 JSR LBCC8 CONVERT FPA0 TO AN INTEGER +3471 f5ae c6 01 LDB #1 DEFAULT DECIMAL POINT FLAG (FORCE IMMED DECIMAL PT) +3472 f5b0 96 45 LDA V45 * GET BASE 10 EXPONENT AND ADD TEN TO IT +3473 f5b2 8b 0a ADDA #9+1 * (NUMBER �NORMALIZED� TO 9 PLACES & DECIMAL PT) +3474 f5b4 2b 09 BMI LBE36 BRANCH IF NUMBER < 1.0 +3475 f5b6 81 0b CMPA #9+2 NINE PLACES MAY BE DISPLAYED WITHOUT +3476 * USING SCIENTIFIC NOTATION +3477 f5b8 24 05 BCC LBE36 BRANCH IF SCIENTIFIC NOTATION REQUIRED +3478 f5ba 4a DECA * SUBTRACT 1 FROM MODIFIED BASE 10 EXPONENT CTR +3479 f5bb 1f 89 TFR A,B * AND SAVE IT IN ACCB (DECiMAL POINT FLAG) +3480 f5bd 86 02 LDA #2 FORCE EXPONENT = 0 - DON'T USE SCIENTIFIC NOTATION +3481 f5bf 4a LBE36 DECA * SUBTRACT TWO (WITHOUT AFFECTING CARRY) +3482 f5c0 4a DECA * FROM BASE 10 EXPONENT +3483 f5c1 97 47 STA V47 SAVE EXPONENT - ZERO EXPONENT = DO NOT DISPLAY +3484 * IN SCIENTIFIC NOTATION +3485 f5c3 d7 45 STB V45 DECIMAL POINT FLAG - NUMBER OF PLACES TO +3486 * LEFT OF DECIMAL POINT +3487 f5c5 2e 0d BGT LBE4B BRANCH IF >= 1 +3488 f5c7 de 64 LDU COEFPT POINT U TO THE STRING BUFFER +3489 f5c9 86 2e LDA #'. * STORE A PERIOD +3490 f5cb a7 c0 STA ,U+ * IN THE BUFFER +3491 f5cd 5d TSTB CHECK DECIMAL POINT FLAG +3492 f5ce 27 04 BEQ LBE4B BRANCH IF NOTHING TO LEFT OF DECIMAL POINT +3493 f5d0 86 30 LDA #'0 * STORE A ZERO +3494 f5d2 a7 c0 STA ,U+ * IN THE BUFFER +3495 +3496 * CONVERT FPA0 INTO A STRING OF ASCII DIGITS +3497 f5d4 8e f6 4e LBE4B LDX #LBEC5 POINT X TO FP POWER OF 10 MANTISSA +3498 f5d7 c6 80 LDB #0+$80 INITIALIZE DIGIT COUNTER TO 0+$80 +3499 * BIT 7 SET IS USED TO INDICATE THAT THE POWER OF 10 MANTISSA +3500 * IS NEGATIVE. WHEN YOU 'ADD' A NEGATIVE MANTISSA, IT IS +3501 * THE SAME AS SUBTRACTING A POSITIVE ONE AND BIT 7 OF ACCB IS HOW +3502 * THE ROUTINE KNOWS THAT A 'SUBTRACTION' IS OCCURING. +3503 f5d9 96 53 LBE50 LDA FPA0+3 * ADD MANTISSA LS +3504 f5db ab 03 ADDA 3,X * BYTE OF FPA0 +3505 f5dd 97 53 STA FPA0+3 * AND (X) +3506 f5df 96 52 LDA FPA0+2 = ADD MANTISSA +3507 f5e1 a9 02 ADCA 2,X = NUMBER 3 BYTE OF +3508 f5e3 97 52 STA FPA0+2 = FPA0 AND (X) +3509 f5e5 96 51 LDA FPA0+1 * ADD MANTISSA +3510 f5e7 a9 01 ADCA 1,X * NUMBER 2 BYTE OF +3511 f5e9 97 51 STA FPA0+1 * FPA0 AND (X) +3512 f5eb 96 50 LDA FPA0 = ADD MANTISSA +3513 f5ed a9 84 ADCA ,X = MS BYTE OF +3514 f5ef 97 50 STA FPA0 = FPA0 AND (X) +3515 f5f1 5c INCB ADD ONE TO DIGIT COUNTER +3516 f5f2 56 RORB ROTATE CARRY INTO BIT 7 +3517 f5f3 59 ROLB *SET OVERFLOW FLAG AND BRANCH IF CARRY = 1 AND +3518 f5f4 28 e3 BVC LBE50 *POSITIVE MANTISSA OR CARRY = 0 AND NEG MANTISSA +3519 f5f6 24 03 BCC LBE72 BRANCH IF NEGATIVE MANTISSA +3520 f5f8 c0 0b SUBB #10+1 * TAKE THE 9�S COMPLEMENT IF +3521 f5fa 50 NEGB * ADDING MANTISSA +3522 f5fb cb 2f LBE72 ADDB #'0-1 ADD ASCII OFFSET TO DIGIT +3523 f5fd 30 04 LEAX 4,X MOVE TO NEXT POWER OF 10 MANTISSA +3524 f5ff 1f 98 TFR B,A SAVE DIGIT IN ACCA +3525 f601 84 7f ANDA #$7F MASK OFF BIT 7 (ADD/SUBTRACT FLAG) +3526 f603 a7 c0 STA ,U+ STORE DIGIT IN STRING BUFFER +3527 f605 0a 45 DEC V45 DECREMENT DECIMAL POINT FLAG +3528 f607 26 04 BNE LBE84 BRANCH IF NOT TIME FOR DECIMAL POINT +3529 f609 86 2e LDA #'. * STORE DECIMAL POINT IN +3530 f60b a7 c0 STA ,U+ * STRING BUFFER +3531 f60d 53 LBE84 COMB TOGGLE BIT 7 (ADD/SUBTRACT FLAG) +3532 f60e c4 80 ANDB #$80 MASK OFF ALL BUT ADD/SUBTRACT FLAG +3533 f610 8c f6 72 CMPX #LBEC5+36 COMPARE X TO END OF MANTISSA TABLE +3534 f613 26 c4 BNE LBE50 BRANCH IF NOT AT END OF TABLE +3535 * BLANK TRAILING ZEROS AND STORE EXPONENT IF ANY +3536 f615 a6 c2 LBE8C LDA ,-U GET THE LAST CHARACTER; MOVE POINTER BACK +3537 f617 81 30 CMPA #'0 WAS IT A ZERO? +3538 f619 27 fa BEQ LBE8C IGNORE TRAILING ZEROS IF SO +3539 f61b 81 2e CMPA #'. CHECK FOR DECIMAL POINT +3540 f61d 26 02 BNE LBE98 BRANCH IF NOT DECIMAL POINT +3541 f61f 33 5f LEAU -1,U STEP OVER THE DECIMAL POINT +3542 f621 86 2b LBE98 LDA #'+ ASCII PLUS SIGN +3543 f623 d6 47 LDB V47 GET SCIENTIFIC NOTATION EXPONENT +3544 f625 27 1c BEQ LBEBA BRANCH IF NOT SCIENTIFIC NOTATION +3545 f627 2a 03 BPL LBEA3 BRANCH IF POSITIVE EXPONENT +3546 f629 86 2d LDA #'- ASCII MINUS SIGN +3547 f62b 50 NEGB NEGATE EXPONENT IF NEGATIVE +3548 f62c a7 42 LBEA3 STA 2,U STORE EXPONENT SIGN IN STRING +3549 f62e 86 45 LDA #'E * GET ASCII �E� (SCIENTIFIC NOTATION +3550 f630 a7 41 STA 1,U * FLAG) AND SAVE IT IN THE STRING +3551 f632 86 2f LDA #'0-1 INITIALIZE ACCA TO ASCII ZERO +3552 +3553 +3554 f634 4c LBEAB INCA ADD ONE TO 10�S DIGIT OF EXPONENT +3555 f635 c0 0a SUBB #10 SUBTRACT 10 FROM ACCB +3556 f637 24 fb BCC LBEAB ADD 1 TO 10�S DIGIT IF NO CARRY +3557 f639 cb 3a ADDB #'9+1 CONVERT UNITS DIGIT TO ASCII +3558 f63b ed 43 STD 3,U SAVE EXPONENT IN STRING +3559 f63d 6f 45 CLR 5,U CLEAR LAST BYTE (TERMINATOR) +3560 f63f 20 04 BRA LBEBC GO RESET POINTER +3561 f641 a7 c4 LBEB8 STA ,U STORE LAST CHARACTER +3562 f643 6f 41 LBEBA CLR 1,U CLEAR LAST BYTE (TERMINATOR - REQUIRED BY +3563 * PRINT SUBROUTINES) +3564 f645 8e 01 f1 LBEBC LDX #STRBUF+3 RESET POINTER TO START OF BUFFER +3565 f648 39 RTS +3566 * +3567 f649 80 00 00 00 00 LBEC0 FCB $80,$00,$00,$00,$00 FLOATING POINT .5 +3568 * +3569 *** TABLE OF UNNORMALIZED POWERS OF 10 +3570 f64e fa 0a 1f 00 LBEC5 FCB $FA,$0A,$1F,$00 -100000000 +3571 f652 00 98 96 80 LBEC9 FCB $00,$98,$96,$80 10000000 +3572 f656 ff f0 bd c0 LBECD FCB $FF,$F0,$BD,$C0 -1000000 +3573 f65a 00 01 86 a0 LBED1 FCB $00,$01,$86,$A0 100000 +3574 f65e ff ff d8 f0 LBED5 FCB $FF,$FF,$D8,$F0 -10000 +3575 f662 00 00 03 e8 LBED9 FCB $00,$00,$03,$E8 1000 +3576 f666 ff ff ff 9c LBEDD FCB $FF,$FF,$FF,$9C -100 +3577 f66a 00 00 00 0a LBEE1 FCB $00,$00,$00,$0A 10 +3578 f66e ff ff ff ff LBEE5 FCB $FF,$FF,$FF,$FF -1 +3579 * +3580 * +3581 f672 96 4f LBEE9 LDA FP0EXP GET EXPONENT OF FPA0 +3582 f674 27 02 BEQ LBEEF BRANCH IF FPA0 = 0 +3583 f676 03 54 COM FP0SGN TOGGLE MANTISSA SIGN OF FPA0 +3584 f678 39 LBEEF RTS +3585 * EXPAND A POLYNOMIAL OF THE FORM +3586 * AQ+BQ**3+CQ**5+DQ**7.... WHERE Q = FPA0 +3587 * AND THE X REGISTER POINTS TO A TABLE OF +3588 * COEFFICIENTS A,B,C,D.... +3589 f679 9f 64 LBEF0 STX COEFPT SAVE COEFFICIENT TABLE POINTER +3590 f67b bd f3 b8 JSR LBC2F MOVE FPA0 TO FPA3 +3591 f67e 8d 05 BSR LBEFC MULTIPLY FPA3 BY FPA0 +3592 f680 8d 08 BSR LBF01 EXPAND POLYNOMIAL +3593 f682 8e 00 40 LDX #V40 POINT X TO FPA3 +3594 f685 7e f2 53 LBEFC JMP LBACA MULTIPLY (X) BY FPA0 +3595 +3596 * CALCULATE THE VALUE OF AN EXPANDED POLYNOMIAL +3597 * EXPRESSION. ENTER WITH (X) POINTING TO A TABLE +3598 * OF COEFFICIENTS, THE FIRST BYTE OF WHICH IS THE +3599 * NUMBER OF (COEFFICIENTS-1) FOLLOWED BY THAT NUMBER +3600 * OF PACKED FLOATING POINT NUMBERS. THE +3601 * POLYNOMIAL IS EVALUATED AS FOLLOWS: VALUE = +3602 * (((FPA0*Y0+Y1)*FPA0+Y2)*FPA0�YN) +3603 f688 9f 64 LBEFF STX COEFPT SAVE COEFFICIENT TABLE POINTER +3604 f68a bd f3 b3 LBF01 JSR LBC2A MOVE FPA0 TO FPA4 +3605 f68d 9e 64 LDX COEFPT GET THE COEFFICIENT POINTER +3606 f68f e6 80 LDB ,X+ GET THE TOP OF COEFFICIENT TABLE TO +3607 f691 d7 55 STB COEFCT * USE AND STORE IT IN TEMPORARY COUNTER +3608 f693 9f 64 STX COEFPT SAVE NEW COEFFICIENT POINTER +3609 f695 8d ee LBF0C BSR LBEFC MULTIPLY (X) BY FPA0 +3610 f697 9e 64 LDX COEFPT *GET COEFFICIENT POINTER +3611 f699 30 05 LEAX 5,X *MOVE TO NEXT FP NUMBER +3612 f69b 9f 64 STX COEFPT *SAVE NEW COEFFICIENT POINTER +3613 f69d bd f1 4b JSR LB9C2 ADD (X) AND FPA0 +3614 f6a0 8e 00 45 LDX #V45 POINT (X) TO FPA4 +3615 f6a3 0a 55 DEC COEFCT DECREMENT TEMP COUNTER +3616 f6a5 26 ee BNE LBF0C BRANCH IF MORE COEFFICIENTS LEFT +3617 f6a7 39 RTS +3618 +3619 * RND +3620 f6a8 bd f3 f6 RND JSR LBC6D TEST FPA0 +3621 f6ab 2b 1f BMI LBF45 BRANCH IF FPA0 = NEGATIVE +3622 f6ad 27 15 BEQ LBF3B BRANCH IF FPA0 = 0 +3623 f6af 8d 10 BSR LBF38 CONVERT FPA0 TO AN INTEGER +3624 f6b1 bd f3 b8 JSR LBC2F PACK FPA0 TO FPA3 +3625 f6b4 8d 0e BSR LBF3B GET A RANDOM NUMBER: FPA0 < 1.0 +3626 f6b6 8e 00 40 LDX #V40 POINT (X) TO FPA3 +3627 f6b9 8d ca BSR LBEFC MULTIPLY (X) BY FPA0 +3628 f6bb 8e f2 4e LDX #LBAC5 POINT (X) TO FP VALUE OF 1.0 +3629 f6be bd f1 4b JSR LB9C2 ADD 1.0 TO FPA0 +3630 f6c1 7e f4 77 LBF38 JMP INT CONVERT FPA0 TO AN INTEGER +3631 * CALCULATE A RANDOM NUMBER IN THE RANGE 0.0 < X <= 1.0 +3632 f6c4 9e b1 LBF3B LDX RVSEED+1 * MOVE VARIABLE +3633 f6c6 9f 50 STX FPA0 * RANDOM NUMBER +3634 f6c8 9e b3 LDX RVSEED+3 * SEED TO +3635 f6ca 9f 52 STX FPA0+2 * FPA0 +3636 f6cc be f6 f9 LBF45 LDX RSEED = MOVE FIXED +3637 f6cf 9f 5d STX FPA1 = RANDOM NUMBER +3638 f6d1 be f6 fb LDX RSEED+2 = SEED TO +3639 f6d4 9f 5f STX FPA1+2 = MANTISSA OF FPA0 +3640 f6d6 bd f2 59 JSR LBAD0 MULTIPLY FPA0 X FPA1 +3641 f6d9 dc 8a LDD VAD GET THE TWO LOWEST ORDER PRODUCT BYTES +3642 f6db c3 65 8b ADDD #$658B ADD A CONSTANT +3643 f6de dd b3 STD RVSEED+3 SAVE NEW LOW ORDER VARIABLE RANDOM # SEED +3644 f6e0 dd 52 STD FPA0+2 SAVE NEW LOW ORDER BYTES OF FPA0 MANTISSA +3645 f6e2 dc 88 LDD VAB GET 2 MORE LOW ORDER PRODUCT BYTES +3646 f6e4 c9 b0 ADCB #$B0 ADD A CONSTANT +3647 f6e6 89 05 ADCA #5 ADD A CONSTANT +3648 f6e8 dd b1 STD RVSEED+1 SAVE NEW HIGH ORDER VARIABLE RANDOM # SEED +3649 f6ea dd 50 STD FPA0 SAVE NEW HIGH ORDER FPA0 MANTISSA +3650 f6ec 0f 54 CLR FP0SGN FORCE FPA0 MANTISSA = POSITIVE +3651 f6ee 86 80 LDA #$80 * SET FPA0 BIASED EXPONENT +3652 f6f0 97 4f STA FP0EXP * TO 0 1 < FPA0 < 0 +3653 f6f2 96 15 LDA FPA2+2 GET A BYTE FROM FPA2 (MORE RANDOMNESS) +3654 f6f4 97 63 STA FPSBYT SAVE AS SUB BYTE +3655 f6f6 7e f1 a5 JMP LBA1C NORMALIZE FPA0 +3656 * +3657 f6f9 40 e6 RSEED FDB $40E6 *CONSTANT RANDOM NUMBER GENERATOR SEED +3658 f6fb 4d ab FDB $4DAB * +3659 +3660 * SIN +3661 * THE SIN FUNCTION REQUIRES AN ARGUMENT IN RADIANS AND WILL REPEAT ITSELF EVERY +3662 * 2*PI RADIANS. THE ARGUMENT IS DIVIDED BY 2*PI AND ONLY THE FRACTIONAL PART IS +3663 * RETAINED. SINCE THE ARGUMENT WAS DIVIDED BY 2*P1, THE COEFFICIENTS MUST BE +3664 * MULTIPLIED BY THE APPROPRIATE POWER OF 2*PI. +3665 +3666 * SIN IS EVALUATED USING THE TRIGONOMETRIC IDENTITIES BELOW: +3667 * SIN(X)=SIN(PI-X) & -SIN(PI/2-X)=SIN((3*PI)/2+X) +3668 f6fd bd f3 e8 SIN JSR LBC5F COPY FPA0 TO FPA1 +3669 f700 8e f7 42 LDX #LBFBD POINT (X) TO 2*PI +3670 f703 d6 61 LDB FP1SGN *GET MANTISSA SIGN OF FPA1 +3671 f705 bd f3 12 JSR LBB89 *AND DIVIDE FPA0 BY 2*PI +3672 f708 bd f3 e8 JSR LBC5F COPY FPA0 TO FPA1 +3673 f70b 8d b4 BSR LBF38 CONVERT FPA0 TO AN INTEGER +3674 f70d 0f 62 CLR RESSGN SET RESULT SIGN = POSITIVE +3675 f70f 96 5c LDA FP1EXP *GET EXPONENT OF FPA1 +3676 f711 d6 4f LDB FP0EXP *GET EXPONENT OF FPA0 +3677 f713 bd f1 45 JSR LB9BC *SUBTRACT FPA0 FROM FPA1 +3678 * NOW FPA0 CONTAINS ONLY THE FRACTIONAL PART OF ARGUMENT/2*PI +3679 f716 8e f7 47 LDX #LBFC2 POINT X TO FP (.25) +3680 f719 bd f1 42 JSR LB9B9 SUBTRACT FPA0 FROM .25 (PI/2) +3681 f71c 96 54 LDA FP0SGN GET MANTISSA SIGN OF FPA0 +3682 f71e 34 02 PSHS A SAVE IT ON STACK +3683 f720 2a 09 BPL LBFA6 BRANCH IF MANTISSA POSITIVE +3684 f722 bd f1 3d JSR LB9B4 ADD .5 (PI) TO FPA0 +3685 f725 96 54 LDA FP0SGN GET SIGN OF FPA0 +3686 f727 2b 05 BMI LBFA9 BRANCH IF NEGATIVE +3687 f729 03 0a COM RELFLG COM IF +(3*PI)/2 >= ARGUMENT >+ PI/2 (QUADRANT FLAG) +3688 f72b bd f6 72 LBFA6 JSR LBEE9 TOGGLE MANTISSA SIGN OF FPA0 +3689 f72e 8e f7 47 LBFA9 LDX #LBFC2 POINT X TO FP (.25) +3690 f731 bd f1 4b JSR LB9C2 ADD .25 (PI/2) TO FPA0 +3691 f734 35 02 PULS A GET OLD MANTISSA SIGN +3692 f736 4d TSTA * BRANCH IF OLD +3693 f737 2a 03 BPL LBFB7 * SIGN WAS POSITIVE +3694 f739 bd f6 72 JSR LBEE9 TOGGLE MANTISSA SIGN +3695 f73c 8e f7 4c LBFB7 LDX #LBFC7 POINT X TO TABLE OF COEFFICIENTS +3696 f73f 7e f6 79 JMP LBEF0 GO CALCULATE POLYNOMIAL VALUE +3697 +3698 f742 83 49 0f da a2 LBFBD FCB $83,$49,$0F,$DA,$A2 6.28318531 (2*PI) +3699 f747 7f 00 00 00 00 LBFC2 FCB $7F,$00,$00,$00,$00 .25 +3700 +3701 +3702 f74c 05 LBFC7 FCB 6-1 SIX COEFFICIENTS +3703 f74d 84 e6 1a 2d 1b LBFC8 FCB $84,$E6,$1A,$2D,$1B * -((2*PI)**11)/11! +3704 f752 86 28 07 fb f8 LBFCD FCB $86,$28,$07,$FB,$F8 * ((2*PI)**9)/9! +3705 f757 87 99 68 89 01 LBFD2 FCB $87,$99,$68,$89,$01 * -((2*PI)**7)/7! +3706 f75c 87 23 35 df e1 LBFD7 FCB $87,$23,$35,$DF,$E1 * ((2*PI)**5)/5! +3707 f761 86 a5 5d e7 28 LBFDC FCB $86,$A5,$5D,$E7,$28 * -((2*PI)**3)/3! +3708 f766 83 49 0f da a2 LBFE1 FCB $83,$49,$0F,$DA,$A2 * +3709 +3710 f76b a1 54 46 8f 13 FCB $A1,$54,$46,$8F,$13 UNUSED GARBAGE BYTES +3711 f770 8f 52 43 89 cd FCB $8F,$52,$43,$89,$CD UNUSED GARBAGE BYTES +3712 * EXTENDED BASIC +3713 +3714 * COS +3715 * THE VALUE OF COS(X) IS DETERMINED BY THE TRIG IDENTITY COS(X)=SIN((PI/2)+X) +3716 f775 8e f7 a8 COS LDX #L83AB POINT X TO FP CONSTANT (P1/2) +3717 f778 bd f1 4b JSR LB9C2 ADD FPA0 TO (X) +3718 f77b 7e f6 fd L837E JMP SIN JUMP TO SIN ROUTINE +3719 +3720 * TAN +3721 * THE VALUE OF TAN(X) IS DETERMINED BY THE TRIG IDENTITY TAN(X)=SIN(X)/COS(X) +3722 f77e bd f3 b8 TAN JSR LBC2F PACK FPA0 AND MOVE IT TO FPA3 +3723 f781 0f 0a CLR RELFLG RESET QUADRANT FLAG +3724 f783 8d f6 BSR L837E CALCULATE SIN OF ARGUMENT +3725 f785 8e 00 4a LDX #V4A POINT X TO FPA5 +3726 f788 bd f3 be JSR LBC35 PACK FPA0 AND MOVE IT TO FPA5 +3727 f78b 8e 00 40 LDX #V40 POINT X TO FPA3 +3728 f78e bd f3 9d JSR LBC14 MOVE FPA3 TO FPA0 +3729 f791 0f 54 CLR FP0SGN FORCE FPA0 MANTISSA TO BE POSITIVE +3730 f793 96 0a LDA RELFLG GET THE QUADRANT FLAG - COS NEGATIVE IN QUADS 2,3 +3731 f795 8d 0c BSR L83A6 CALCULATE VALUE OF COS(FPA0) +3732 f797 0d 4f TST FP0EXP CHECK EXPONENT OF FPA0 +3733 f799 10 27 fa 7e LBEQ LBA92 �OV� ERROR IF COS(X)=0 +3734 f79d 8e 00 4a LDX #V4A POINT X TO FPA5 +3735 f7a0 7e f3 18 L83A3 JMP LBB8F DIVIDE (X) BY FPA0 - SIN(X)/COS(X) +3736 f7a3 34 02 L83A6 PSHS A SAVE SIGN FLAG ON STACK +3737 f7a5 7e f7 2b JMP LBFA6 EXPAND POLYNOMIAL +3738 +3739 f7a8 81 49 0f da a2 L83AB FCB $81,$49,$0F,$DA,$A2 1.57079633 (PI/2) +3740 +3741 * ATN +3742 * A 12 TERM TAYLOR SERIES IS USED TO EVALUATE THE +3743 * ARCTAN EXPRESSION. TWO DIFFERENT FORMULI ARE USED +3744 * TO EVALUATE THE EXPRESSION DEPENDING UPON +3745 * WHETHER OR NOT THE ARGUMENT SQUARED IS > OR < 1.0 +3746 +3747 * IF X**2<1 THEN ATN=X-(X**3)/3+(X**5)/5-(X**7)/7. . . +3748 * IF X**2>=1 THEN ATN=PI/2-(1/X-1/((X**3)*3)+(1/((X**5)*5)-. . .) +3749 +3750 f7ad 96 54 ATN LDA FP0SGN * GET THE SIGN OF THE MANTISSA AND +3751 f7af 34 02 PSHS A * SAVE IT ON THE STACK +3752 f7b1 2a 02 BPL L83B8 BRANCH IF POSITIVE MANTISSA +3753 f7b3 8d 24 BSR L83DC CHANGE SIGN OF FPA0 +3754 f7b5 96 4f L83B8 LDA FP0EXP * GET EXPONENT OF FPA0 AND +3755 f7b7 34 02 PSHS A * SAVE IT ON THE STACK +3756 f7b9 81 81 CMPA #$81 IS FPAO < 1.0? +3757 f7bb 25 05 BLO L83C5 YES +3758 f7bd 8e f2 4e LDX #LBAC5 POINT X TO FP CONSTANT 1.0 +3759 f7c0 8d de BSR L83A3 GET RECIPROCAL OF FPA0 +3760 f7c2 8e f7 dd L83C5 LDX #L83E0 POINT (X) TO TAYLOR SERIES COEFFICIENTS +3761 f7c5 bd f6 79 JSR LBEF0 EXPAND POLYNOMIAL +3762 f7c8 35 02 PULS A GET EXPONENT OF ARGUMENT +3763 f7ca 81 81 CMPA #$81 WAS ARGUMENT < 1.0? +3764 f7cc 25 06 BLO L83D7 YES +3765 f7ce 8e f7 a8 LDX #L83AB POINT (X) TO FP NUMBER (PI/2) +3766 f7d1 bd f1 42 JSR LB9B9 SUBTRACT FPA0 FROM (PI/2) +3767 f7d4 35 02 L83D7 PULS A * GET SIGN OF INITIAL ARGUMENT MANTISSA +3768 f7d6 4d TSTA * AND SET FLAGS ACCORDING TO IT +3769 f7d7 2a 03 BPL L83DF RETURN IF ARGUMENT WAS POSITIVE +3770 f7d9 7e f6 72 L83DC JMP LBEE9 CHANGE MANTISSA SIGN OF FPA0 +3771 f7dc 39 L83DF RTS +3772 * +3773 * TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR ARCTANGENT +3774 f7dd 0b L83E0 FCB $0B TWELVE COEFFICIENTS +3775 f7de 76 b3 83 bd d3 L83E1 FCB $76,$B3,$83,$BD,$D3 -6.84793912E-04 1/23 +3776 f7e3 79 1e f4 a6 f5 L83E6 FCB $79,$1E,$F4,$A6,$F5 +4.85094216E-03 1/21 +3777 f7e8 7b 83 fc b0 10 L83EB FCB $7B,$83,$FC,$B0,$10 -0.0161117018 +3778 f7ed 7c 0c 1f 67 ca L83F0 FCB $7C,$0C,$1F,$67,$CA 0.0342096381 +3779 f7f2 7c de 53 cb c1 L83F5 FCB $7C,$DE,$53,$CB,$C1 -0.0542791328 +3780 f7f7 7d 14 64 70 4c L83FA FCB $7D,$14,$64,$70,$4C 0.0724571965 +3781 f7fc 7d b7 ea 51 7a L83FF FCB $7D,$B7,$EA,$51,$7A -0.0898023954 +3782 f801 7d 63 30 88 7e L8404 FCB $7D,$63,$30,$88,$7E 0.110932413 +3783 f806 7e 92 44 99 3a L8409 FCB $7E,$92,$44,$99,$3A -0.142839808 +3784 f80b 7e 4c cc 91 c7 L840E FCB $7E,$4C,$CC,$91,$C7 0.199999121 +3785 f810 7f aa aa aa 13 L8413 FCB $7F,$AA,$AA,$AA,$13 -0.333333316 +3786 f815 81 00 00 00 00 L8418 FCB $81,$00,$00,$00,$00 1 +3787 * +3788 *** TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR LN(X) +3789 * +3790 f81a 03 L841D FCB 3 FOUR COEFFICIENTS +3791 f81b 7f 5e 56 cb 79 L841E FCB $7F,$5E,$56,$CB,$79 0.434255942 +3792 f820 80 13 9b 0b 64 L8423 FCB $80,$13,$9B,$0B,$64 0.576584541 +3793 f825 80 76 38 93 16 L8428 FCB $80,$76,$38,$93,$16 0.961800759 +3794 f82a 82 38 aa 3b 20 L842D FCB $82,$38,$AA,$3B,$20 2.88539007 +3795 +3796 f82f 80 35 04 f3 34 L8432 FCB $80,$35,$04,$F3,$34 1/SQR(2) +3797 +3798 f834 81 35 04 f3 34 L8437 FCB $81,$35,$04,$F3,$34 SQR(2) +3799 +3800 f839 80 80 00 00 00 L843C FCB $80,$80,$00,$00,$00 -0.5 +3801 +3802 f83e 80 31 72 17 f8 L8441 FCB $80,$31,$72,$17,$F8 LN(2) +3803 * +3804 * LOG - NATURAL LOGARITHM (LN) +3805 +3806 * THE NATURAL OR NAPERIAN LOGARITHM IS CALCULATED USING +3807 * MATHEMATICAL IDENTITIES. FPA0 IS OF THE FORM FPA0=A*(2**B) (SCIENTIFIC +3808 * NOTATION). THEREFORE, THE LOG ROUTINE DETERMINES THE VALUE OF +3809 * LN(A*(2**B)). A SERIES OF MATHEMATICAL IDENTITIES WILL EXPAND THIS +3810 * TERM: LN(A*(2**B))=(-1/2+(1/LN(2))*(LN(A*SQR(2)))+B)*LN(2). ALL OF +3811 * THE TERMS OF THE LATTER EXPRESSION ARE CONSTANTS EXCEPT FOR THE +3812 * LN(A*SQR(2)) TERM WHICH IS EVALUATED USING THE TAYLOR SERIES EXPANSION +3813 f843 bd f3 f6 LOG JSR LBC6D CHECK STATUS OF FPA0 +3814 f846 10 2f f3 c7 LBLE LB44A �FC� ERROR IF NEGATIVE OR ZERO +3815 f84a 8e f8 2f LDX #L8432 POINT (X) TO FP NUMBER (1/SQR(2)) +3816 f84d 96 4f LDA FP0EXP *GET EXPONENT OF ARGUMENT +3817 f84f 80 80 SUBA #$80 *SUBTRACT OFF THE BIAS AND +3818 f851 34 02 PSHS A *SAVE IT ON THE STACK +3819 f853 86 80 LDA #$80 +3820 f855 97 4f STA FP0EXP +3821 f857 bd f1 4b JSR LB9C2 ADD FPA0 TO (X) +3822 f85a 8e f8 34 LDX #L8437 POINT X TO SQR(2) +3823 f85d bd f3 18 JSR LBB8F DIVIDE SQR(2) BY FPA0 +3824 f860 8e f2 4e LDX #LBAC5 POINT X TO FP VALUE OF 1.00 +3825 f863 bd f1 42 JSR LB9B9 SUBTRACT FPA0 FROM (X) +3826 * NOW FPA0 = (1-SQR(2)*X)/(1+SQR(2)*X) WHERE X IS ARGUMENT +3827 f866 8e f8 1a LDX #L841D POINT X TO TABLE OF COEFFICIENTS +3828 f869 bd f6 79 JSR LBEF0 EXPAND POLYNOMIAL +3829 f86c 8e f8 39 LDX #L843C POINT X TO FP VALUE OF (-.5) +3830 f86f bd f1 4b JSR LB9C2 ADD FPA0 TO X +3831 f872 35 04 PULS B GET EXPONENT OF ARGUMENT BACK (WITHOUT BIAS) +3832 f874 bd f5 22 JSR LBD99 ADD ACCB TO FPA0 +3833 f877 8e f8 3e LDX #L8441 POINT X TO LN(2) +3834 f87a 7e f2 53 JMP LBACA MULTIPLY FPA0 * LN(2) +3835 +3836 * SQR +3837 f87d bd f3 e8 SQR JSR LBC5F MOVE FPA0 TO FPA1 +3838 f880 8e f6 49 LDX #LBEC0 POINT (X) TO FP NUMBER (.5) +3839 f883 bd f3 9d JSR LBC14 COPY A PACKED NUMBER FROM (X) TO FPA0 +3840 +3841 * ARITHMETIC OPERATOR FOR EXPONENTIATION JUMPS +3842 * HERE. THE FORMULA USED TO EVALUATE EXPONENTIATION +3843 * IS A**X=E**(X LN A) = E**(FPA0*LN(FPA1)), E=2.7182818 +3844 f886 27 67 L8489 BEQ EXP DO A NATURAL EXPONENTIATION IF EXPONENT = 0 +3845 f888 4d TSTA *CHECK VALUE BEING EXPONENTIATED +3846 f889 26 03 BNE L8491 *AND BRANCH IF IT IS <> 0 +3847 f88b 7e f1 c3 JMP LBA3A FPA0=0 IF RAISING ZERO TO A POWER +3848 f88e 8e 00 4a L8491 LDX #V4A * PACK FPA0 AND SAVE +3849 f891 bd f3 be JSR LBC35 * IT IN FPA5 (ARGUMENT�S EXPONENT) +3850 f894 5f CLRB ACCB=DEFAULT RESULT SIGN FLAG; 0=POSITIVE +3851 f895 96 61 LDA FP1SGN *CHECK THE SIGN OF ARGUMENT +3852 f897 2a 10 BPL L84AC *BRANCH IF POSITIVE +3853 f899 bd f4 77 JSR INT CONVERT EXPONENT INTO AN INTEGER +3854 f89c 8e 00 4a LDX #V4A POINT X TO FPA5 (ORIGINAL EXPONENT) +3855 f89f 96 61 LDA FP1SGN GET MANTISSA SIGN OF FPA1 (ARGUMENT) +3856 f8a1 bd f4 29 JSR LBCA0 *COMPARE FPA0 TO (X) AND +3857 f8a4 26 03 BNE L84AC *BRANCH IF NOT EQUAL +3858 f8a6 43 COMA TOGGLE FPA1 MANTISSA SIGN - FORCE POSITIVE +3859 f8a7 d6 01 LDB CHARAC GET LS BYTE OF INTEGER VALUE OF EXPONENT (RESULT SIGN FLAG) +3860 f8a9 bd f3 d5 L84AC JSR LBC4C COPY FPA1 TO FPA0; ACCA = MANTISSA SIGN +3861 f8ac 34 04 PSHS B PUT RESULT SIGN FLAG ON THE STACK +3862 f8ae bd f8 43 JSR LOG +3863 f8b1 8e 00 4a LDX #V4A POINT (X) TO FPA5 +3864 f8b4 bd f2 53 JSR LBACA MULTIPLY FPA0 BY FPA5 +3865 f8b7 8d 36 BSR EXP CALCULATE E**(FPA0) +3866 f8b9 35 02 PULS A * GET RESULT SIGN FLAG FROM THE STACK +3867 f8bb 46 RORA * AND BRANCH IF NEGATIVE +3868 f8bc 10 25 fd b2 LBCS LBEE9 CHANGE SIGN OF FPA0 MANTISSA +3869 f8c0 39 RTS +3870 +3871 * CORRECTION FACTOR FOR EXPONENTIAL FUNCTION +3872 f8c1 81 38 aa 3b 29 L84C4 FCB $81,$38,$AA,$3B,$29 1.44269504 ( CF ) +3873 * +3874 * TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR E**X +3875 * +3876 f8c6 07 L84C9 FCB 7 EIGHT COEFFICIENTS +3877 f8c7 71 34 58 3e 56 L84CA FCB $71,$34,$58,$3E,$56 2.14987637E-05: 1/(7!*(CF**7)) +3878 f8cc 74 16 7e b3 1b L84CF FCB $74,$16,$7E,$B3,$1B 1.4352314E-04 : 1/(6!*(CF**6)) +3879 f8d1 77 2f ee e3 85 L84D4 FCB $77,$2F,$EE,$E3,$85 1.34226348E-03: 1/(5!*(CF**5)) +3880 f8d6 7a 1d 84 1c 2a L84D9 FCB $7A,$1D,$84,$1C,$2A 9.61401701E-03: 1/(4!*(CF**4)) +3881 f8db 7c 63 59 58 0a L84DE FCB $7C,$63,$59,$58,$0A 0.0555051269 +3882 f8e0 7e 75 fd e7 c6 L84E3 FCB $7E,$75,$FD,$E7,$C6 0.240226385 +3883 f8e5 80 31 72 18 10 L84E8 FCB $80,$31,$72,$18,$10 0.693147186 +3884 f8ea 81 00 00 00 00 L84ED FCB $81,$00,$00,$00,$00 1 +3885 * +3886 * EXP ( E**X) +3887 * THE EXPONENTIAL FUNCTION IS EVALUATED BY FIRST MULTIPLYING THE +3888 * ARGUMENT BY A CORRECTION FACTOR (CF). AFTER THIS IS DONE, AN +3889 * ARGUMENT >= 127 WILL YIELD A ZERO RESULT (NO UNDERFLOW) FOR A +3890 * NEGATIVE ARGUMENT OR AN 'OV' (OVERFLOW) ERROR FOR A POSITIVE +3891 * ARGUMENT. THE POLYNOMIAL COEFFICIENTS ARE MODIFIED TO REFLECT +3892 * THE CF MULTIPLICATION AT THE START OF THE EVALUATION PROCESS. +3893 +3894 f8ef 8e f8 c1 EXP LDX #L84C4 POINT X TO THE CORRECTION FACTOR +3895 f8f2 bd f2 53 JSR LBACA MULTIPLY FPA0 BY (X) +3896 f8f5 bd f3 b8 JSR LBC2F PACK FPA0 AND STORE IT IN FPA3 +3897 f8f8 96 4f LDA FP0EXP *GET EXPONENT OF FPA0 AND +3898 f8fa 81 88 CMPA #$88 *COMPARE TO THE MAXIMUM VALUE +3899 f8fc 25 03 BLO L8504 BRANCH IF FPA0 < 128 +3900 f8fe 7e f2 e5 L8501 JMP LBB5C SET FPA0 = 0 OR �OV� ERROR +3901 f901 bd f4 77 L8504 JSR INT CONVERT FPA0 TO INTEGER +3902 f904 96 01 LDA CHARAC GET LS BYTE OF INTEGER +3903 f906 8b 81 ADDA #$81 * WAS THE ARGUMENT =127, IF SO +3904 f908 27 f4 BEQ L8501 * THEN �OV� ERROR; THIS WILL ALSO ADD THE $80 BIAS +3905 * * REQUIRED WHEN THE NEW EXPONENT IS CALCULATED BELOW +3906 f90a 4a DECA DECREMENT ONE FROM THE EXPONENT, BECAUSE $81, NOT $80 WAS USED ABOVE +3907 f90b 34 02 PSHS A SAVE EXPONENT OF INTEGER PORTION ON STACK +3908 f90d 8e 00 40 LDX #V40 POINT (X) TO FPA3 +3909 f910 bd f1 42 JSR LB9B9 SUBTRACT FPA0 FROM (X) - GET FRACTIONAL PART OF ARGUMENT +3910 f913 8e f8 c6 LDX #L84C9 POINT X TO COEFFICIENTS +3911 f916 bd f6 88 JSR LBEFF EVALUATE POLYNOMIAL FOR FRACTIONAL PART +3912 f919 0f 62 CLR RESSGN FORCE THE MANTISSA TO BE POSITIVE +3913 f91b 35 02 PULS A GET INTEGER EXPONENT FROM STACK +3914 f91d bd f2 d1 JSR LBB48 * CALCULATE EXPONENT OF NEW FPA0 BY ADDING THE EXPONENTS OF THE +3915 * * INTEGER AND FRACTIONAL PARTS +3916 f920 39 RTS +3917 +3918 * FIX +3919 f921 bd f3 f6 FIX JSR LBC6D CHECK STATUS OF FPA0 +3920 f924 2b 03 BMI L852C BRANCH IF FPA0 = NEGATIVE +3921 f926 7e f4 77 L8529 JMP INT CONVERT FPA0 TO INTEGER +3922 f929 03 54 L852C COM FP0SGN TOGGLE SIGN OF FPA0 MANTISSA +3923 f92b 8d f9 BSR L8529 CONVERT FPA0 TO INTEGER +3924 f92d 7e f6 72 JMP LBEE9 TOGGLE SIGN OF FPA0 +3925 +3926 * EDIT +3927 f930 bd fd 5e EDIT JSR L89AE GET LINE NUMBER FROM BASIC +3928 f933 32 62 LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK +3929 f935 86 01 L8538 LDA #$01 �LIST� FLAG +3930 f937 97 98 STA VD8 SET FLAG TO LIST LINE +3931 f939 bd e4 e5 JSR LAD01 GO FIND THE LINE NUMBER IN PROGRAM +3932 f93c 10 25 ed 82 LBCS LAED2 ERROR #7 �UNDEFINED LINE #' +3933 f940 bd ef 7e JSR LB7C2 GO UNCRUNCH LINE INTO BUFFER AT LINBUF+1 +3934 f943 1f 20 TFR Y,D PUT ABSOLUTE ADDRESS OF END OF LINE TO ACCD +3935 f945 83 00 f5 SUBD #LINBUF+2 SUBTRACT OUT THE START OF LINE +3936 f948 d7 97 STB VD7 SAVE LENGTH OF LINE +3937 f94a dc 2b L854D LDD BINVAL GET THE HEX VALUE OF LINE NUMBER +3938 f94c bd f5 55 JSR LBDCC LIST THE LINE NUMBER ON THE SCREEN +3939 f94f bd f1 35 JSR LB9AC PRINT A SPACE +3940 f952 8e 00 f4 LDX #LINBUF+1 POINT X TO BUFFER +3941 f955 d6 98 LDB VD8 * CHECK TO SEE IF LINE IS TO BE +3942 f957 26 25 BNE L8581 * LISTED TO SCREEN - BRANCH IF IT IS +3943 f959 5f L855C CLRB RESET DIGIT ACCUMULATOR - DEFAULT VALUE +3944 f95a bd fa 84 L855D JSR L8687 GET KEY STROKE +3945 f95d bd ff b6 JSR L90AA SET CARRY IF NOT NUMERIC +3946 f960 25 0b BLO L8570 BRANCH IF NOT NUMERIC +3947 f962 80 30 SUBA #'0' MASK OFF ASCII +3948 f964 34 02 PSHS A SAVE IT ON STACK +3949 f966 86 0a LDA #10 NUMBER BEING CONVERTED IS BASE 10 +3950 f968 3d MUL MULTIPLY ACCUMULATED VALUE BY BASE (10) +3951 f969 eb e0 ADDB ,S+ ADD DIGIT TO ACCUMULATED VALUE +3952 f96b 20 ed BRA L855D CHECK FOR ANOTHER DIGIT +3953 f96d c0 01 L8570 SUBB #$01 * REPEAT PARAMETER IN ACCB; IF IT +3954 f96f c9 01 ADCB #$01 *IS 0, THEN MAKE IT �1� +3955 f971 81 41 CMPA #'A' ABORT? +3956 f973 26 05 BNE L857D NO +3957 f975 bd f0 e5 JSR LB958 PRINT CARRIAGE RETURN TO SCREEN +3958 f978 20 bb BRA L8538 RESTART EDIT PROCESS - CANCEL ALL CHANGES +3959 f97a 81 4c L857D CMPA #'L' LIST? +3960 f97c 26 0b BNE L858C NO +3961 f97e 8d 31 L8581 BSR L85B4 LIST THE LINE +3962 f980 0f 98 CLR VD8 RESET THE LIST FLAG TO �NO LIST� +3963 f982 bd f0 e5 JSR LB958 PRINT CARRIAGE RETURN +3964 f985 20 c3 BRA L854D GO INTERPRET ANOTHER EDIT COMMAND +3965 f987 32 62 L858A LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK +3966 f989 81 0d L858C CMPA #CR ENTER KEY? +3967 f98b 26 0d BNE L859D NO +3968 f98d 8d 22 BSR L85B4 ECHO THE LINE TO THE SCREEN +3969 f98f bd f0 e5 L8592 JSR LB958 PRINT CARRIAGE RETURN +3970 f992 8e 00 f4 LDX #LINBUF+1 * RESET BASIC�S INPUT POINTER +3971 f995 9f 83 STX CHARAD * TO THE LINE INPUT BUFFER +3972 f997 7e e4 8e JMP LACA8 GO PUT LINE BACK IN PROGRAM +3973 f99a 81 45 L859D CMPA #'E' EXIT? +3974 f99c 27 f1 BEQ L8592 YES - SAME AS ENTER EXCEPT NO ECHO +3975 f99e 81 51 CMPA #'Q' QUIT? +3976 f9a0 26 06 BNE L85AB NO +3977 f9a2 bd f0 e5 JSR LB958 PRINT CARRIAGE RETURN TO SCREEN +3978 f9a5 7e e4 65 JMP LAC73 GO TO COMMAND LEVEL - MAKE NO CHANGES +3979 f9a8 8d 02 L85AB BSR L85AF INTERPRET THE REMAINING COMMANDS AS SUBROUTINES +3980 f9aa 20 ad BRA L855C GO INTERPRET ANOTHER EDIT COMMAND +3981 f9ac 81 20 L85AF CMPA #SPACE SPACE BAR? +3982 f9ae 26 10 BNE L85C3 NO +3983 f9b0 8c L85B3 FCB SKP2 SKIP TWO BYTES +3984 * DISPLAY THE NEXT ACCB BYTES OF THE LINE IN THE BUFFER TO THE SCREEN +3985 * +3986 f9b1 c6 f9 L85B4 LDB #LBUFMX-1 250 BYTES MAX IN BUFFER +3987 f9b3 a6 84 L85B6 LDA ,X GET A CHARACTER FROM BUFFER +3988 f9b5 27 08 BEQ L85C2 EXIT IF IT�S A 0 +3989 f9b7 bd e0 14 JSR PUTCHR SEND CHAR TO CONSOLE OUT +3990 f9ba 30 01 LEAX $01,X MOVE POINTER UP ONE +3991 f9bc 5a DECB DECREMENT CHARACTER COUNTER +3992 f9bd 26 f4 BNE L85B6 LOOP IF NOT DONE +3993 f9bf 39 L85C2 RTS +3994 f9c0 81 44 L85C3 CMPA #'D' DELETE? +3995 f9c2 26 48 BNE L860F NO +3996 f9c4 6d 84 L85C7 TST ,X * CHECK FOR END OF LINE +3997 f9c6 27 f7 BEQ L85C2 * AND BRANCH IF SO +3998 f9c8 8d 04 BSR L85D1 REMOVE A CHARACTER +3999 f9ca 5a DECB DECREMENT REPEAT PARAMETER +4000 f9cb 26 f7 BNE L85C7 BRANCH IF NOT DONE +4001 f9cd 39 RTS +4002 * REMOVE ONE CHARACTER FROM BUFFER +4003 f9ce 0a 97 L85D1 DEC VD7 DECREMENT LENGTH OF BUFFER +4004 f9d0 31 1f LEAY $-01,X POINT Y TO ONE BEFORE CURRENT BUFFER POINTER +4005 f9d2 31 21 L85D5 LEAY $01,Y INCREMENT TEMPORARY BUFFER POINTER +4006 f9d4 a6 21 LDA $01,Y GET NEXT CHARACTER +4007 f9d6 a7 a4 STA ,Y PUT IT IN CURRENT POSITION +4008 f9d8 26 f8 BNE L85D5 BRANCH IF NOT END OF LINE +4009 f9da 39 RTS +4010 f9db 81 49 L85DE CMPA #'I' INSERT? +4011 f9dd 27 13 BEQ L85F5 YES +4012 f9df 81 58 CMPA #'X' EXTEND? +4013 f9e1 27 0d BEQ L85F3 YES +4014 f9e3 81 48 CMPA #'H' HACK? +4015 f9e5 26 5c BNE L8646 NO +4016 f9e7 6f 84 CLR ,X TURN CURRENT BUFFER POINTER INTO END OF LINE FLAG +4017 f9e9 1f 10 TFR X,D PUT CURRENT BUFFER POINTER IN ACCD +4018 f9eb 83 00 f5 SUBD #LINBUF+2 SUBTRACT INITIAL POINTER POSITION +4019 f9ee d7 97 STB VD7 SAVE NEW BUFFER LENGTH +4020 f9f0 8d bf L85F3 BSR L85B4 DISPLAY THE LINE ON THE SCREEN +4021 f9f2 bd fa 84 L85F5 JSR L8687 GET A KEYSTROKE +4022 f9f5 81 0d CMPA #CR ENTER KEY? +4023 f9f7 27 8e BEQ L858A YES - INTERPRET ANOTHER COMMAND - PRINT LINE +4024 f9f9 81 1b CMPA #ESC ESCAPE? +4025 f9fb 27 25 BEQ L8625 YES - RETURN TO COMMAND LEVEL - DON�T PRINT LINE +4026 f9fd 81 08 CMPA #BS BACK SPACE? +4027 f9ff 26 22 BNE L8626 NO +4028 fa01 8c 00 f4 CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER +4029 fa04 27 ec BEQ L85F5 DO NOT ALLOW BS IF AT START +4030 fa06 8d 45 BSR L8650 MOVE POINTER BACK ONE, BS TO SCREEN +4031 fa08 8d c4 BSR L85D1 REMOVE ONE CHARACTER FROM BUFFER +4032 fa0a 20 e6 BRA L85F5 GET INSERT SUB COMMAND +4033 fa0c 81 43 L860F CMPA #'C' CHANGE? +4034 fa0e 26 cb BNE L85DE NO +4035 fa10 6d 84 L8613 TST ,X CHECK CURRENT BUFFER CHARACTER +4036 fa12 27 0e BEQ L8625 BRANCH IF END OF LINE +4037 fa14 bd fa 84 JSR L8687 GET A KEYSTROKE +4038 fa17 25 02 BLO L861E BRANCH IF LEGITIMATE KEY +4039 fa19 20 f5 BRA L8613 TRY AGAIN IF ILLEGAL KEY +4040 fa1b a7 80 L861E STA ,X+ INSERT NEW CHARACTER INTO BUFFER +4041 fa1d 8d 37 BSR L8659 SEND NEW CHARACTER TO SCREEN +4042 fa1f 5a DECB DECREMENT REPEAT PARAMETER +4043 fa20 26 ee BNE L8613 BRANCH IF NOT DONE +4044 fa22 39 L8625 RTS +4045 fa23 d6 97 L8626 LDB VD7 GET LENGTH OF LINE +4046 fa25 c1 f9 CMPB #LBUFMX-1 COMPARE TO MAXIMUM LENGTH +4047 fa27 26 02 BNE L862E BRANCH IF NOT AT MAXIMUM +4048 fa29 20 c7 BRA L85F5 IGNORE INPUT IF LINE AT MAXIMUM LENGTH +4049 fa2b 34 10 L862E PSHS X SAVE CURRENT BUFFER POINTER +4050 fa2d 6d 80 L8630 TST ,X+ * SCAN THE LINE UNTIL END OF +4051 fa2f 26 fc BNE L8630 * LINE (0) IS FOUND +4052 fa31 e6 82 L8634 LDB ,-X DECR TEMP LINE POINTER AND GET A CHARACTER +4053 fa33 e7 01 STB $01,X PUT CHARACTER BACK DOWN ONE SPOT +4054 fa35 ac e4 CMPX ,S HAVE WE REACHED STARTING POINT? +4055 fa37 26 f8 BNE L8634 NO - KEEP GOING +4056 fa39 32 62 LEAS $02,S PURGE BUFFER POINTER FROM STACK +4057 fa3b a7 80 STA ,X+ INSERT NEW CHARACTER INTO THE LINE +4058 fa3d 8d 17 BSR L8659 SEND A CHARACTER TO CONSOLE OUT +4059 fa3f 0c 97 INC VD7 ADD ONE TO BUFFER LENGTH +4060 fa41 20 af BRA L85F5 GET INSERT SUB COMMAND +4061 fa43 81 08 L8646 CMPA #BS BACKSPACE? +4062 fa45 26 12 BNE L865C NO +4063 fa47 8d 04 L864A BSR L8650 MOVE POINTER BACK 1, SEND BS TO SCREEN +4064 fa49 5a DECB DECREMENT REPEAT PARAMETER +4065 fa4a 26 fb BNE L864A LOOP UNTIL DONE +4066 fa4c 39 RTS +4067 fa4d 8c 00 f4 L8650 CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER +4068 fa50 27 d0 BEQ L8625 DO NOT ALLOW BS IF AT START +4069 fa52 30 1f LEAX $-01,X MOVE POINTER BACK ONE +4070 fa54 86 08 LDA #BS BACK SPACE +4071 fa56 7e e0 14 L8659 JMP PUTCHR SEND TO CONSOLE OUT +4072 fa59 81 4b L865C CMPA #'K' KILL? +4073 fa5b 27 05 BEQ L8665 YES +4074 fa5d 80 53 SUBA #'S' SEARCH? +4075 fa5f 27 01 BEQ L8665 YES +4076 fa61 39 RTS +4077 fa62 34 02 L8665 PSHS A SAVE KILL/SEARCH FLAG ON STACK +4078 fa64 8d 1e BSR L8687 * GET A KEYSTROKE (TARGET CHARACTER) +4079 fa66 34 02 PSHS A * AND SAVE IT ON STACK +4080 fa68 a6 84 L866B LDA ,X GET CURRENT BUFFER CHARACTER +4081 fa6a 27 16 BEQ L8685 AND RETURN IF END OF LINE +4082 fa6c 6d 61 TST $01,S CHECK KILL/SEARCH FLAG +4083 fa6e 26 06 BNE L8679 BRANCH IF KILL +4084 fa70 8d e4 BSR L8659 SEND A CHARACTER TO CONSOLE OUT +4085 fa72 30 01 LEAX $01,X INCREMENT BUFFER POINTER +4086 fa74 20 03 BRA L867C CHECK NEXT INPUT CHARACTER +4087 fa76 bd f9 ce L8679 JSR L85D1 REMOVE ONE CHARACTER FROM BUFFER +4088 fa79 a6 84 L867C LDA ,X GET CURRENT INPUT CHARACTER +4089 fa7b a1 e4 CMPA ,S COMPARE TO TARGET CHARACTER +4090 fa7d 26 e9 BNE L866B BRANCH IF NO MATCH +4091 fa7f 5a DECB DECREMENT REPEAT PARAMETER +4092 fa80 26 e6 BNE L866B BRANCH IF NOT DONE +4093 fa82 35 a0 L8685 PULS Y,PC THE Y PULL WILL CLEAN UP THE STACK FOR THE 2 PSHS A +4094 * +4095 * GET A KEYSTRKE +4096 fa84 bd e0 00 L8687 JSR LA171 CALL CONSOLE IN : DEV NBR=SCREEN +4097 fa87 81 7f CMPA #$7F GRAPHIC CHARACTER? +4098 fa89 24 f9 BCC L8687 YES - GET ANOTHER CHAR +4099 fa8b 81 5f CMPA #$5F SHIFT UP ARROW (QUIT INSERT) +4100 fa8d 26 02 BNE L8694 NO +4101 fa8f 86 1b LDA #ESC REPLACE W/ESCAPE CODE +4102 fa91 81 0d L8694 CMPA #CR ENTER KEY +4103 fa93 27 0e BEQ L86A6 YES +4104 fa95 81 1b CMPA #ESC ESCAPE? +4105 fa97 27 0a BEQ L86A6 YES +4106 fa99 81 08 CMPA #BS BACKSPACE? +4107 fa9b 27 06 BEQ L86A6 YES +4108 fa9d 81 20 CMPA #SPACE SPACE +4109 fa9f 25 e3 BLO L8687 GET ANOTHER CHAR IF CONTROL CHAR +4110 faa1 1a 01 ORCC #$01 SET CARRY +4111 faa3 39 L86A6 RTS +4112 +4113 * TRON +4114 faa4 86 TRON FCB SKP1LD SKIP ONE BYTE AND LDA #$4F +4115 +4116 * TROFF +4117 faa5 4f TROFF CLRA TROFF FLAG +4118 faa6 97 8c STA TRCFLG TRON/TROFF FLAG:0=TROFF, <> 0=TRON +4119 faa8 39 RTS +4120 +4121 * POS +4122 +4123 faa9 86 00 POS LDA #0 GET DEVICE NUMBER +4124 faab d6 79 LDB LPTPOS GET PRINT POSITION +4125 faad 1d LA5E8 SEX CONVERT ACCB TO 2 DIGIT SIGNED INTEGER +4126 faae 7e ec bb JMP GIVABF CONVERT ACCD TO FLOATING POINT +4127 +4128 +4129 * VARPTR +4130 fab1 bd ea 36 VARPT JSR LB26A SYNTAX CHECK FOR �(� +4131 fab4 dc 1f LDD ARYEND GET ADDR OF END OF ARRAYS +4132 fab6 34 06 PSHS B,A SAVE IT ON STACK +4133 fab8 bd eb 1e JSR LB357 GET VARIABLE DESCRIPTOR +4134 fabb bd ea 33 JSR LB267 SYNTAX CHECK FOR �)� +4135 fabe 35 06 PULS A,B GET END OF ARRAYS ADDR BACK +4136 fac0 1e 10 EXG X,D SWAP END OF ARRAYS AND VARIABLE DESCRIPTOR +4137 fac2 9c 1f CMPX ARYEND COMPARE TO NEW END OF ARRAYS +4138 fac4 26 51 BNE L8724 �FC� ERROR IF VARIABLE WAS NOT DEFINED PRIOR TO CALLING VARPTR +4139 fac6 7e ec bb JMP GIVABF CONVERT VARIABLE DESCRIPTOR INTO A FP NUMBER +4140 +4141 * MID$(OLDSTRING,POSITION,LENGTH)=REPLACEMENT +4142 fac9 9d 7c L86D6 JSR GETNCH GET INPUT CHAR FROM BASIC +4143 facb bd ea 36 JSR LB26A SYNTAX CHECK FOR �(� +4144 face bd eb 1e JSR LB357 * GET VARIABLE DESCRIPTOR ADDRESS AND +4145 fad1 34 10 PSHS X * SAVE IT ON THE STACK +4146 fad3 ec 02 LDD $02,X POINT ACCD TO START OF OLDSTRING +4147 fad5 10 93 21 CMPD FRETOP COMPARE TO START OF CLEARED SPACE +4148 fad8 23 04 BLS L86EB BRANCH IF <= +4149 fada 93 27 SUBD MEMSIZ SUBTRACT OUT TOP OF CLEARED SPACE +4150 fadc 23 12 BLS L86FD BRANCH IF STRING IN STRING SPACE +4151 fade e6 84 L86EB LDB ,X GET LENGTH OF OLDSTRING +4152 fae0 bd ed 34 JSR LB56D RESERVE ACCB BYTES IN STRING SPACE +4153 fae3 34 10 PSHS X SAVE RESERVED SPACE STRING ADDRESS ON STACK +4154 fae5 ae 62 LDX $02,S POINT X TO OLDSTRING DESCRIPTOR +4155 fae7 bd ee 0a JSR LB643 MOVE OLDSTRING INTO STRING SPACE +4156 faea 35 50 PULS X,U * GET OLDSTRING DESCRIPTOR ADDRESS AND RESERVED STRING +4157 faec af 42 STX $02,U * ADDRESS AND SAVE RESERVED ADDRESS AS OLDSTRING ADDRESS +4158 faee 34 40 PSHS U SAVE OLDSTRING DESCRIPTOR ADDRESS +4159 faf0 bd ee ff L86FD JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION +4160 faf3 34 04 PSHS B SAVE POSITION PARAMETER ON STACK +4161 faf5 5d TSTB * CHECK POSITION PARAMETER AND BRANCH +4162 faf6 27 1f BEQ L8724 * IF START OF STRING +4163 faf8 c6 ff LDB #$FF DEFAULT REPLACEMENT LENGTH = $FF +4164 fafa 81 29 CMPA #')' * CHECK FOR END OF MID$ STATEMENT AND +4165 fafc 27 03 BEQ L870E * BRANCH IF AT END OF STATEMENT +4166 fafe bd ee ff JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION +4167 fb01 34 04 L870E PSHS B SAVE LENGTH PARAMETER ON STACK +4168 fb03 bd ea 33 JSR LB267 SYNTAX CHECK FOR �)� +4169 fb06 c6 ae LDB #TOK_EQUALS TOKEN FOR = +4170 fb08 bd ea 3b JSR LB26F SYNTAX CHECK FOR �=� +4171 fb0b 8d 2e BSR L8748 EVALUATE REPLACEMENT STRING +4172 fb0d 1f 13 TFR X,U SAVE REPLACEMENT STRING ADDRESS IN U +4173 fb0f ae 62 LDX $02,S POINT X TO OLOSTRING DESCRIPTOR ADDRESS +4174 fb11 a6 84 LDA ,X GET LENGTH OF OLDSTRING +4175 fb13 a0 61 SUBA $01,S SUBTRACT POSITION PARAMETER +4176 fb15 24 03 BCC L8727 INSERT REPLACEMENT STRING INTO OLDSTRING +4177 fb17 7e ec 11 L8724 JMP LB44A �FC� ERROR IF POSITION > LENGTH OF OLDSTRING +4178 fb1a 4c L8727 INCA * NOW ACCA = NUMBER OF CHARACTERS TO THE RIGHT +4179 * * (INCLUSIVE) OF THE POSITION PARAMETER +4180 fb1b a1 e4 CMPA ,S +4181 fb1d 24 02 BCC L872E BRANCH IF NEW STRING WILL FIT IN OLDSTRING +4182 fb1f a7 e4 STA ,S IF NOT, USE AS MUCH OF LENGTH PARAMETER AS WILL FIT +4183 fb21 a6 61 L872E LDA $01,S GET POSITION PARAMETER +4184 fb23 1e 89 EXG A,B ACCA=LENGTH OF REPL STRING, ACCB=POSITION PARAMETER +4185 fb25 ae 02 LDX $02,X POINT X TO OLDSTRING ADDRESS +4186 fb27 5a DECB * BASIC�S POSITION PARAMETER STARTS AT 1; THIS ROUTINE +4187 * * WANTS IT TO START AT ZERO +4188 fb28 3a ABX POINT X TO POSITION IN OLDSTRING WHERE THE REPLACEMENT WILL GO +4189 fb29 4d TSTA * IF THE LENGTH OF THE REPLACEMENT STRING IS ZERO +4190 fb2a 27 0d BEQ L8746 * THEN RETURN +4191 fb2c a1 e4 CMPA ,S +4192 fb2e 23 02 BLS L873F ADJUSTED LENGTH PARAMETER, THEN BRANCH +4193 fb30 a6 e4 LDA ,S OTHERWISE USE AS MUCH ROOM AS IS AVAILABLE +4194 fb32 1f 89 L873F TFR A,B SAVE NUMBER OF BYTES TO MOVE IN ACCB +4195 fb34 1e 31 EXG U,X SWAP SOURCE AND DESTINATION POINTERS +4196 fb36 bd e1 f1 JSR LA59A MOVE (B) BYTES FROM (X) TO (U) +4197 fb39 35 96 L8746 PULS A,B,X,PC +4198 fb3b bd e9 22 L8748 JSR LB156 EVALUATE EXPRESSION +4199 fb3e 7e ee 1b JMP LB654 *�TM� ERROR IF NUMERIC; RETURN WITH X POINTING +4200 * *TO STRING, ACCB = LENGTH +4201 +4202 * STRING +4203 fb41 bd ea 36 STRING JSR LB26A SYNTAX CHECK FOR �(� +4204 fb44 bd ee d2 JSR LB70B EVALUATE EXPRESSION; ERROR IF > 255 +4205 fb47 34 04 PSHS B SAVE LENGTH OF STRING +4206 fb49 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA +4207 fb4c bd e9 22 JSR LB156 EVALUATE EXPRESSION +4208 fb4f bd ea 33 JSR LB267 SYNTAX CHECK FOR �)� +4209 fb52 96 06 LDA VALTYP GET VARIABLE TYPE +4210 fb54 26 05 BNE L8768 BRANCH IF STRING +4211 fb56 bd ee d5 JSR LB70E CONVERT FPA0 INTO AN INTEGER IN ACCB +4212 fb59 20 03 BRA L876B SAVE THE STRING IN STRING SPACE +4213 fb5b bd ee 6b L8768 JSR LB6A4 GET FIRST BYTE OF STRING +4214 fb5e 34 04 L876B PSHS B SAVE FIRST BYTE OF EXPRESSION +4215 fb60 e6 61 LDB $01,S GET LENGTH OF STRING +4216 fb62 bd ec d6 JSR LB50F RESERVE ACCB BYTES IN STRING SPACE +4217 fb65 35 06 PULS A,B GET LENGTH OF STRING AND CHARACTER +4218 fb67 27 05 BEQ L877B BRANCH IF NULL STRING +4219 fb69 a7 80 L8776 STA ,X+ SAVE A CHARACTER IN STRING SPACE +4220 fb6b 5a DECB DECREMENT LENGTH +4221 fb6c 26 fb BNE L8776 BRANCH IF NOT DONE +4222 fb6e 7e ee 62 L877B JMP LB69B PUT STRING DESCRIPTOR ONTO STRING STACK +4223 +4224 * INSTR +4225 fb71 bd ea 36 INSTR JSR LB26A SYNTAX CHECK FOR �(� +4226 fb74 bd e9 22 JSR LB156 EVALUATE EXPRESSION +4227 fb77 c6 01 LDB #$01 DEFAULT POSITION = 1 (SEARCH START) +4228 fb79 34 04 PSHS B SAVE START +4229 fb7b 96 06 LDA VALTYP GET VARIABLE TYPE +4230 fb7d 26 10 BNE L879C BRANCH IF STRING +4231 fb7f bd ee d5 JSR LB70E CONVERT FPA0 TO INTEGER IN ACCB +4232 fb82 e7 e4 STB ,S SAVE START SEARCH VALUE +4233 fb84 27 91 BEQ L8724 BRANCH IF START SEARCH AT ZERO +4234 fb86 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA +4235 fb89 bd e9 22 JSR LB156 EVALUATE EXPRESSION - SEARCH STRING +4236 fb8c bd e9 12 JSR LB146 �TM� ERROR IF NUMERIC +4237 fb8f 9e 52 L879C LDX FPA0+2 SEARCH STRING DESCRIPTOR ADDRESS +4238 fb91 34 10 PSHS X SAVE ON THE STACK +4239 fb93 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA +4240 fb96 bd fb 3b JSR L8748 EVALUATE TARGET STRING EXPRESSION +4241 fb99 34 14 PSHS X,B SAVE ADDRESS AND LENGTH ON STACK +4242 fb9b bd ea 33 JSR LB267 SYNTAX CHECK FOR ')' +4243 fb9e ae 63 LDX $03,S * LOAD X WITH SEARCH STRING DESCRIPTOR ADDRESS +4244 fba0 bd ee 20 JSR LB659 * AND GET THE LENGTH ANDADDRESS OF SEARCH STRING +4245 fba3 34 04 PSHS B SAVE LENGTH ON STACK +4246 * +4247 * AT THIS POINT THE STACK HAS THE FOLLOWING INFORMATION +4248 * ON IT: 0,S-SEARCH LENGTH; 1,S-TARGET LENGTH; 2 3,S-TARGET +4249 * ADDRESS; 4 5,S-SEARCH DESCRIPTOR ADDRESS; 6,S-SEARCH POSITION +4250 fba5 e1 66 CMPB $06,S COMPARE LENGTH OF SEARCH STRING TO START +4251 fba7 25 23 BLO L87D9 POSITION; RETURN 0 IF LENGTH < START +4252 fba9 a6 61 LDA $01,S GET LENGTH OF TARGET STRING +4253 fbab 27 1c BEQ L87D6 BRANCH IF TARGET STRING = NULL +4254 fbad e6 66 LDB $06,S GET START POSITION +4255 fbaf 5a DECB MOVE BACK ONE +4256 fbb0 3a ABX POINT X TO POSITION IN SEARCH STRING WHERE SEARCHING WILL START +4257 fbb1 31 84 L87BE LEAY ,X POINT Y TO SEARCH POSITION +4258 fbb3 ee 62 LDU $02,S POINT U TO START OF TARGET +4259 fbb5 e6 61 LDB $01,S LOAD ACCB WITH LENGTH OF TARGET +4260 fbb7 a6 e4 LDA ,S LOAD ACCA WITH LENGTH OF SEARCH +4261 fbb9 a0 66 SUBA $06,S SUBTRACT SEARCH POSITION FROM SEARCH LENGTH +4262 fbbb 4c INCA ADD ONE +4263 fbbc a1 61 CMPA $01,S COMPARE TO TARGET LENGTH +4264 fbbe 25 0c BLO L87D9 RETURN 0 IF TARGET LENGTH > WHAT�S LEFT OF SEARCH STRING +4265 fbc0 a6 80 L87CD LDA ,X+ GET A CHARACTER FROM SEARCH STRING +4266 fbc2 a1 c0 CMPA ,U+ COMPARE IT TO TARGET STRING +4267 fbc4 26 0c BNE L87DF BRANCH IF NO MATCH +4268 fbc6 5a DECB DECREMENT TARGET LENGTH +4269 fbc7 26 f7 BNE L87CD CHECK ANOTHER CHARACTER +4270 fbc9 e6 66 L87D6 LDB $06,S GET MATCH POSITION +4271 fbcb 21 L87D8 FCB SKP1 SKIP NEXT BYTE +4272 fbcc 5f L87D9 CLRB MATCH ADDRESS = 0 +4273 fbcd 32 67 LEAS $07,S CLEAN UP THE STACK +4274 fbcf 7e ec ba JMP LB4F3 CONVERT ACCB TO FP NUMBER +4275 fbd2 6c 66 L87DF INC $06,S INCREMENT SEARCH POSITION +4276 fbd4 30 21 LEAX $01,Y MOVE X TO NEXT SEARCH POSITION +4277 fbd6 20 d9 BRA L87BE KEEP LOOKING FOR A MATCH +4278 +4279 * EXTENDED BASIC RVEC19 HOOK CODE +4280 fbd8 81 26 XVEC19 CMPA #'&' * +4281 fbda 26 5c BNE L8845 * RETURN IF NOT HEX OR OCTAL VARIABLE +4282 fbdc 32 62 LEAS $02,S PURGE RETURN ADDRESS FROM STACK +4283 * PROCESS A VARIABLE PRECEEDED BY A �&� (&H,&O) +4284 fbde 0f 52 L87EB CLR FPA0+2 * CLEAR BOTTOM TWO +4285 fbe0 0f 53 CLR FPA0+3 * BYTES OF FPA0 +4286 fbe2 8e 00 52 LDX #FPA0+2 BYTES 2,3 OF FPA0 = (TEMPORARY ACCUMULATOR) +4287 fbe5 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4288 fbe7 81 4f CMPA #'O' +4289 fbe9 27 12 BEQ L880A YES +4290 fbeb 81 48 CMPA #'H' +4291 fbed 27 23 BEQ L881F YES +4292 fbef 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4293 fbf1 20 0c BRA L880C DEFAULT TO OCTAL (&O) +4294 fbf3 81 38 L8800 CMPA #'8' +4295 fbf5 10 22 ee 4a LBHI LB277 +4296 fbf9 c6 03 LDB #$03 BASE 8 MULTIPLIER +4297 fbfb 8d 2a BSR L8834 ADD DIGIT TO TEMPORARY ACCUMULATOR +4298 * EVALUATE AN &O VARIABLE +4299 fbfd 9d 7c L880A JSR GETNCH GET A CHARACTER FROM BASIC +4300 fbff 25 f2 L880C BLO L8800 BRANCH IF NUMERIC +4301 fc01 0f 50 L880E CLR FPA0 * CLEAR 2 HIGH ORDER +4302 fc03 0f 51 CLR FPA0+1 * BYTES OF FPA0 +4303 fc05 0f 06 CLR VALTYP SET VARXABLE TYPE TO NUMERIC +4304 fc07 0f 63 CLR FPSBYT ZERO OUT SUB BYTE OF FPA0 +4305 fc09 0f 54 CLR FP0SGN ZERO OUT MANTISSA SIGN OF FPA0 +4306 fc0b c6 a0 LDB #$A0 * SET EXPONENT OF FPA0 +4307 fc0d d7 4f STB FP0EXP * +4308 fc0f 7e f1 a5 JMP LBA1C GO NORMALIZE FPA0 +4309 * EVALUATE AN &H VARIABLE +4310 fc12 9d 7c L881F JSR GETNCH GET A CHARACTER FROM BASIC +4311 fc14 25 0b BLO L882E BRANCH IF NUMERIC +4312 fc16 bd eb 69 JSR LB3A2 SET CARRY IF NOT ALPHA +4313 fc19 25 e6 BLO L880E BRANCH IF NOT ALPHA OR NUMERIC +4314 fc1b 81 47 CMPA #'G' CHECK FOR LETTERS A-F +4315 fc1d 24 e2 BCC L880E BRANCH IF >= G (ILLEGAL HEX LETTER) +4316 fc1f 80 07 SUBA #7 SUBTRACT ASCII DIFFERENCE BETWEEN A AND 9 +4317 fc21 c6 04 L882E LDB #$04 BASE 16 DIGIT MULTIPLIER = 2**4 +4318 fc23 8d 02 BSR L8834 ADD DIGIT TO TEMPORARY ACCUMULATOR +4319 fc25 20 eb BRA L881F KEEP EVALUATING VARIABLE +4320 fc27 68 01 L8834 ASL $01,X * MULTIPLY TEMPORARY +4321 fc29 69 84 ROL ,X * ACCUMULATOR BY TWO +4322 fc2b 10 25 f5 ec LBCS LBA92 �OV' OVERFLOW ERROR +4323 fc2f 5a DECB DECREMENT SHIFT COUNTER +4324 fc30 26 f5 BNE L8834 MULTIPLY TEMPORARY ACCUMULATOR AGAIN +4325 fc32 80 30 SUBA #'0' MASK OFF ASCII +4326 fc34 ab 01 ADDA $01,X * ADD DIGIT TO TEMPORARY +4327 fc36 a7 01 STA $01,X * ACCUMULATOR AND SAVE IT +4328 fc38 39 L8845 RTS +4329 +4330 fc39 35 40 XVEC15 PULS U PULL RETURN ADDRESS AND SAVE IN U REGISTER +4331 fc3b 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC +4332 fc3d 9e 83 LDX CHARAD CURRENT INPUT POINTER TO X +4333 fc3f 9d 7c JSR GETNCH GET CHARACTER FROM BASIC +4334 fc41 81 26 CMPA #'&' HEX AND OCTAL VARIABLES ARE PRECEEDED BY & +4335 fc43 27 99 BEQ L87EB PROCESS A �&� VARIABLE +4336 fc45 81 b0 CMPA #TOK_FN TOKEN FOR FN +4337 fc47 27 5e BEQ L88B4 PROCESS FN CALL +4338 fc49 81 ff CMPA #$FF CHECK FOR SECONDARY TOKEN +4339 fc4b 26 08 BNE L8862 NOT SECONDARY +4340 fc4d 9d 7c JSR GETNCH GET CHARACTER FROM BASIC +4341 fc4f 81 83 CMPA #TOK_USR TOKEN FOR USR +4342 fc51 10 27 00 ab LBEQ L892C PROCESS USR CALL +4343 fc55 9f 83 L8862 STX CHARAD RESTORE BASIC�S INPUT POINTER +4344 fc57 6e c4 JMP ,U RETURN TO CALLING ROUTINE +4345 fc59 9e 68 L8866 LDX CURLIN GET CURRENT LINE NUMBER +4346 fc5b 30 01 LEAX $01,X IN DIRECT MODE? +4347 fc5d 26 d9 BNE L8845 RETURN IF NOT IN DIRECT MODE +4348 fc5f c6 16 LDB #2*11 �ILLEGAL DIRECT STATEMENT� ERROR +4349 fc61 7e e4 46 L886E JMP LAC46 PROCESS ERROR +4350 +4351 fc64 ae 9f 00 83 DEF LDX [CHARAD] GET TWO INPUT CHARS +4352 fc68 8c ff 83 CMPX #TOK_FF_USR TOKEN FOR USR +4353 fc6b 10 27 00 74 LBEQ L890F BRANCH IF DEF USR +4354 fc6f 8d 23 BSR L88A1 GET DESCRIPTOR ADDRESS FOR FN VARIABLE NAME +4355 fc71 8d e6 BSR L8866 DON�T ALLOW DEF FN IF IN DIRECT MODE +4356 fc73 bd ea 36 JSR LB26A SYNTAX CHECK FOR �(� +4357 fc76 c6 80 LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE +4358 fc78 d7 08 STB ARYDIS * AND SAVE IT IN THE ARRAY DISABLE FLAG +4359 fc7a bd eb 1e JSR LB357 GET VARIABLE DESCRIPTOR +4360 fc7d 8d 25 BSR L88B1 �TM� ERROR IF STRING +4361 fc7f bd ea 33 JSR LB267 SYNTAX CHECK FOR �)� +4362 fc82 c6 ae LDB #TOK_EQUALS TOKEN FOR �=� +4363 fc84 bd ea 3b JSR LB26F DO A SYNTAX CHECK FOR = +4364 fc87 9e 4b LDX V4B GET THE ADDRESS OF THE FN NAME DESCRIPTOR +4365 fc89 dc 83 LDD CHARAD * GET THE CURRENT INPUT POINTER ADDRESS AND +4366 fc8b ed 84 STD ,X * SAVE IT IN FIRST 2 BYTES OF THE DESCRIPTOR +4367 fc8d dc 39 LDD VARPTR = GET THE DESCRIPTOR ADDRESS OF THE ARGUMENT +4368 fc8f ed 02 STD $02,X = VARIABLE AND SAVE IT IN THE DESCRIPTOR OF THE FN NAME +4369 fc91 7e e6 d0 JMP DATA MOVE INPUT POINTER TO END OF LINE OR SUBLINE +4370 fc94 c6 b0 L88A1 LDB #TOK_FN TOKEN FOR FN +4371 fc96 bd ea 3b JSR LB26F DO A SYNTAX CHECK FOR FN +4372 fc99 c6 80 LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE FLAG +4373 fc9b d7 08 STB ARYDIS * AND SAVE IT IN ARRAY VARIABLE FLAG +4374 fc9d 8a 80 ORA #$80 SET BIT 7 OF CURRENT INPUT CHARACTER TO INDICATE AN FN VARIABLE +4375 fc9f bd eb 23 JSR LB35C * GET THE DESCRIPTOR ADDRESS OF THIS +4376 fca2 9f 4b STX V4B * VARIABLE AND SAVE IT IN V4B +4377 fca4 7e e9 0f L88B1 JMP LB143 �TM� ERROR IF STRING VARIABLE +4378 * EVALUATE AN FN CALL +4379 fca7 8d eb L88B4 BSR L88A1 * GET THE DESCRIPTOR OF THE FN NAME +4380 fca9 34 10 PSHS X * VARIABLE AND SAVE IT ON THE STACK +4381 fcab bd ea 2e JSR LB262 SYNTAX CHECK FOR �(� & EVALUATE EXPR +4382 fcae 8d f4 BSR L88B1 �TM� ERROR IF STRING VARIABLE +4383 fcb0 35 40 PULS U POINT U TO FN NAME DESCRIPTOR +4384 fcb2 c6 32 LDB #2*25 �UNDEFINED FUNCTION CALL� ERROR +4385 fcb4 ae 42 LDX $02,U POINT X TO ARGUMENT VARIABLE DESCRIPTOR +4386 fcb6 27 a9 BEQ L886E BRANCH TO ERROR HANDLER +4387 fcb8 10 9e 83 LDY CHARAD SAVE CURRENT INPUT POINTER IN Y +4388 fcbb ee c4 LDU ,U * POINT U TO START OF FN FORMULA AND +4389 fcbd df 83 STU CHARAD * SAVE IT IN INPUT POINTER +4390 fcbf a6 04 LDA $04,X = GET FP VALUE OF +4391 fcc1 34 02 PSHS A = ARGUMENT VARIABLE, CURRENT INPUT +4392 fcc3 ec 84 LDD ,X = POINTER, AND ADDRESS OF START +4393 fcc5 ee 02 LDU $02,X = OF FN FORMULA AND SAVE +4394 fcc7 34 76 PSHS U,Y,X,B,A = THEM ON THE STACK +4395 fcc9 bd f3 be JSR LBC35 PACK FPA0 AND SAVE IT IN (X) +4396 fccc bd e9 0d L88D9 JSR LB141 EVALUATE FN EXPRESSION +4397 fccf 35 76 PULS A,B,X,Y,U RESTORE REGISTERS +4398 fcd1 ed 84 STD ,X * GET THE FP +4399 fcd3 ef 02 STU $02,X * VALUE OF THE ARGUMENT +4400 fcd5 35 02 PULS A * VARIABLE OFF OF THE +4401 fcd7 a7 04 STA $04,X * STACK AND RE-SAVE IT +4402 fcd9 9d 82 JSR GETCCH GET FINAL CHARACTER OF THE FN FORMULA +4403 fcdb 10 26 ed 64 LBNE LB277 �SYNTAX� ERROR IF NOT END OF LINE +4404 fcdf 10 9f 83 STY CHARAD RESTORE INPUT POINTER +4405 fce2 39 L88EF RTS +4406 +4407 +4408 +4409 * DEF USR +4410 fce3 9d 7c L890F JSR GETNCH SKIP PAST SECOND BYTE OF DEF USR TOKEN +4411 fce5 8d 09 BSR L891C GET FN NUMBER +4412 fce7 34 10 PSHS X SAVE FN EXEC ADDRESS STORAGE LOC +4413 fce9 8d 2d BSR L8944 CALCULATE EXEC ADDRESS +4414 fceb 35 40 PULS U GET FN EXEC ADDRESS STORAGE LOC +4415 fced af c4 STX ,U SAVE EXEC ADDRESS +4416 fcef 39 RTS +4417 fcf0 5f L891C CLRB DEFAULT TO USR0 IF NO ARGUMENT +4418 fcf1 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4419 fcf3 24 06 BCC L8927 BRANCH IF NOT NUMERIC +4420 fcf5 80 30 SUBA #'0' MASK OFF ASCII +4421 fcf7 1f 89 TFR A,B SAVE USR NUMBER IN ACCB +4422 fcf9 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4423 fcfb 9e 8d L8927 LDX USRADR GET ADDRESS OF STORAGE LOCs FOR USR ADDRESS +4424 fcfd 58 ASLB X2 - 2 BYTES/USR ADDRESS +4425 fcfe 3a ABX ADD OFFSET TO START ADDRESS OF STORAGE LOCs +4426 fcff 39 RTS +4427 * PROCESS A USR CALL +4428 fd00 8d ee L892C BSR L891C GET STORAGE LOC OF EXEC ADDRESS FOR USR N +4429 fd02 ae 84 LDX ,X * GET EXEC ADDRESS AND +4430 fd04 34 10 PSHS X * PUSH IT ONTO STACK +4431 fd06 bd ea 2e JSR LB262 SYNTAX CHECK FOR �(� & EVALUATE EXPR +4432 fd09 8e 00 4f LDX #FP0EXP POINT X TO FPA0 +4433 fd0c 96 06 LDA VALTYP GET VARIABLE TYPE +4434 fd0e 27 07 BEQ L8943 BRANCH IF NUMERIC, STRING IF <> 0 +4435 fd10 bd ee 1e JSR LB657 GET LENGTH & ADDRESS OF STRING VARIABLE +4436 fd13 9e 52 LDX FPA0+2 GET POINTER TO STRING DESCRIPTOR +4437 fd15 96 06 LDA VALTYP GET VARIABLE TYPE +4438 fd17 39 L8943 RTS JUMP TO USR ROUTINE (PSHS X ABOVE) +4439 fd18 c6 ae L8944 LDB #TOK_EQUALS TOKEN FOR �=� +4440 fd1a bd ea 3b JSR LB26F DO A SYNTAX CHECK FOR = +4441 fd1d 7e ef 04 JMP LB73D EVALUATE EXPRESSION, RETURN VALUE IN X +4442 +4443 +4444 +4445 * DEL +4446 fd20 10 27 ee ed DEL LBEQ LB44A FC� ERROR IF NO ARGUMENT +4447 fd24 bd e7 57 JSR LAF67 CONVERT A DECIMAL BASiC NUMBER TO BINARY +4448 fd27 bd e4 e5 JSR LAD01 FIND RAM ADDRESS OF START OF A BASIC LINE +4449 fd2a 9f 93 STX VD3 SAVE RAM ADDRESS OF STARTING LINE NUMBER +4450 fd2c 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4451 fd2e 27 10 BEQ L8990 BRANCH IF END OF LINE +4452 fd30 81 a7 CMPA #TOK_MINUS TOKEN FOR �-' +4453 fd32 26 3b BNE L89BF TERMINATE COMMAND IF LINE NUMBER NOT FOLLOWED BY �-� +4454 fd34 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4455 fd36 27 04 BEQ L898C IF END OF LINE, USE DEFAULT ENDING LINE NUMBER +4456 fd38 8d 24 BSR L89AE * CONVERT ENDING LINE NUMBER TO BINARY +4457 fd3a 20 04 BRA L8990 * AND SAVE IT IN BINVAL +4458 fd3c 86 ff L898C LDA #$FF = USE $FFXX AS DEFAULT ENDING +4459 fd3e 97 2b STA BINVAL = LINE NUMBER - SAVE IT IN BINVAL +4460 fd40 de 93 L8990 LDU VD3 POINT U TO STARTING LINE NUMBER ADDRESS +4461 fd42 8c L8992 FCB SKP2 SKIP TWO BYTES +4462 fd43 ee c4 L8993 LDU ,U POINT U TO START OF NEXT LINE +4463 fd45 ec c4 LDD ,U CHECK FOR END OF PROGRAM +4464 fd47 27 06 BEQ L899F BRANCH IF END OF PROGRAM +4465 fd49 ec 42 LDD $02,U LOAD ACCD WITH THIS LINE�S NUMBER +4466 fd4b 93 2b SUBD BINVAL SUBTRACT ENDING LINE NUMBER ADDRESS +4467 fd4d 23 f4 BLS L8993 BRANCH IF = < ENDING LINE NUMBER +4468 fd4f 9e 93 L899F LDX VD3 GET STARTING LINE NUMBER +4469 fd51 8d 15 BSR L89B8 MOVE (U) TO (X) UNTIL END OF PROGRAM +4470 fd53 bd e5 05 JSR LAD21 RESET BASIC�S INPUT POINTER AND ERASE VARIABLES +4471 fd56 9e 93 LDX VD3 GET STARTING LINE NUMBER ADDRESS +4472 fd58 bd e4 d5 JSR LACF1 RECOMPUTE START OF NEXT LINE ADDRESSES +4473 fd5b 7e e4 65 JMP LAC73 JUMP TO BASIC�S MAIN COMMAND LOOP +4474 fd5e bd e7 57 L89AE JSR LAF67 GO GET LINE NUMBER CONVERTED TO BINARY +4475 fd61 7e e1 fa JMP LA5C7 MAKE SURE THERE�S NO MORE ON THIS LINE +4476 fd64 a6 c0 L89B4 LDA ,U+ GET A BYTE FROM (U) +4477 fd66 a7 80 STA ,X+ MOVE THE BYTE TO (X) +4478 fd68 11 93 1b L89B8 CMPU VARTAB COMPARE TO END OF BASIC +4479 fd6b 26 f7 BNE L89B4 BRANCH IF NOT AT END +4480 fd6d 9f 1b STX VARTAB SAVE (X) AS NEW END OF BASIC +4481 fd6f 39 L89BF RTS +4482 +4483 +4484 fd70 bd fc 59 L89C0 JSR L8866 �BS� ERROR IF IN DIRECT MODE +4485 fd73 9d 7c JSR GETNCH GET A CHAR FROM BASIC +4486 fd75 81 22 L89D2 CMPA #'"' CHECK FOR PROMPT STRING +4487 fd77 26 0b BNE L89E1 BRANCH IF NO PROMPT STRING +4488 fd79 bd ea 10 JSR LB244 STRIP OFF PROMPT STRING & PUT IT ON STRING STACK +4489 fd7c c6 3b LDB #';' * +4490 fd7e bd ea 3b JSR LB26F * DO A SYNTAX CHECK FOR; +4491 fd81 bd f1 28 JSR LB99F REMOVE PROMPT STRING FROM STRING STACK & SEND TO CONSOLE OUT +4492 fd84 32 7e L89E1 LEAS $-02,S RESERVE TWO STORAGE SLOTS ON STACK +4493 fd86 bd e8 0c JSR LB035 INPUT A LINE FROM CURRENT INPUT DEVICE +4494 fd89 32 62 LEAS $02,S CLEAN UP THE STACK +4495 fd8b bd eb 1e JSR LB357 SEARCH FOR A VARIABLE +4496 fd8e 9f 3b STX VARDES SAVE POINTER TO VARIABLE DESCRIPTOR +4497 fd90 bd e9 12 JSR LB146 �TM� ERROR IF VARIABLE TYPE = NUMERIC +4498 fd93 8e 00 f3 LDX #LINBUF POINT X TO THE STRING BUFFER WHERE THE INPUT STRING WAS STORED +4499 fd96 4f CLRA TERMINATOR CHARACTER 0 (END OF LINE) +4500 fd97 bd ec e3 JSR LB51A PARSE THE INPUT STRING AND STORE IT IN THE STRING SPACE +4501 fd9a 7e e7 94 JMP LAFA4 REMOVE DESCRIPTOR FROM STRING STACK +4502 fd9d bd e7 57 L89FC JSR LAF67 STRIP A DECIMAL NUMBER FROM BASIC INPUT LINE +4503 fda0 9e 2b LDX BINVAL GET BINARY VALUE +4504 fda2 39 RTS +4505 fda3 9e 91 L8A02 LDX VD1 GET CURRENT OLD NUMBER BEING RENUMBERED +4506 fda5 9f 2b L8A04 STX BINVAL SAVE THE LINE NUMBER BEING SEARCHED FOR +4507 fda7 7e e4 e5 JMP LAD01 GO FIND THE LINE NUMBER IN BASIC PROGRAM +4508 +4509 * RENUM +4510 fdaa bd e5 0a RENUM JSR LAD26 ERASE VARIABLES +4511 fdad cc 00 0a LDD #10 DEFAULT LINE NUMBER INTERVAL +4512 fdb0 dd 95 STD VD5 SAVE DEFAULT RENUMBER START LINE NUMBER +4513 fdb2 dd 8f STD VCF SAVE DEFAULT INTERVAL +4514 fdb4 5f CLRB NOW ACCD = 0 +4515 fdb5 dd 91 STD VD1 DEFAULT LINE NUMBER OF WHERE TO START RENUMBERING +4516 fdb7 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4517 fdb9 24 06 BCC L8A20 BRANCH IF NOT NUMERIC +4518 fdbb 8d e0 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY +4519 fdbd 9f 95 STX VD5 SAVE LINE NUMBER WHERE RENUMBERING STARTS +4520 fdbf 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4521 fdc1 27 1b L8A20 BEQ L8A3D BRANCH IF END OF LINE +4522 fdc3 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA +4523 fdc6 24 06 BCC L8A2D BRANCH IF NEXT CHARACTER NOT NUMERIC +4524 fdc8 8d d3 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY +4525 fdca 9f 91 STX VD1 SAVE NEW RENUMBER LINE +4526 fdcc 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4527 fdce 27 0e L8A2D BEQ L8A3D BRANCH IF END OF LINE +4528 fdd0 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA +4529 fdd3 24 06 BCC L8A3A BRANCH IF NEXT CHARACTER NOT NUMERIC +4530 fdd5 8d c6 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY +4531 fdd7 9f 8f STX VCF SAVE NEW INTERVAL +4532 fdd9 27 49 BEQ L8A83 �FC' ERROR +4533 fddb bd e1 fa L8A3A JSR LA5C7 CHECK FOR MORE CHARACTERS ON LINE - �SYNTAX� ERROR IF ANY +4534 fdde 8d c3 L8A3D BSR L8A02 GO GET ADDRESS OF OLD NUMBER BEING RENUMBERED +4535 fde0 9f 93 STX VD3 SAVE ADDRESS +4536 fde2 9e 95 LDX VD5 GET NEXT RENUMBERED LINE NUMBER TO USE +4537 fde4 8d bf BSR L8A04 FIND THE LINE NUMBER IN THE BASIC PROGRAM +4538 fde6 9c 93 CMPX VD3 COMPARE TO ADDRESS OF OLD LINE NUMBER +4539 fde8 25 3a BLO L8A83 �FC� ERROR IF NEW ADDRESS < OLD ADDRESS +4540 fdea 8d 1c BSR L8A67 MAKE SURE RENUMBERED LINE NUMBERS WILL BE IN RANGE +4541 fdec bd fe 7e JSR L8ADD CONVERT ASCII LINE NUMBERS TO �EXPANDED� BINARY +4542 fdef bd e4 d3 JSR LACEF RECALCULATE NEXT LINE RAM ADDRESSES +4543 fdf2 8d af BSR L8A02 GET RAM ADDRESS OF FIRST LINE TO BE RENUMBERED +4544 fdf4 9f 93 STX VD3 SAVE IT +4545 fdf6 8d 3a BSR L8A91 MAKE SURE LINE NUMBERS EXIST +4546 fdf8 8d 0f BSR L8A68 INSERT NEW LINE NUMBERS IN LINE HEADERS +4547 fdfa 8d 36 BSR L8A91 INSERT NEW LINE NUMBERS IN PROGRAM STATEMENTS +4548 fdfc bd ff 19 JSR L8B7B CONVERT PACKED BINARY LINE NUMBERS TO ASCII +4549 fdff bd e5 0a JSR LAD26 ERASE VARIABLES +4550 fe02 bd e4 d3 JSR LACEF RECALCULATE NEXT LINE RAM ADDRESS +4551 fe05 7e e4 65 JMP LAC73 GO BACK TO BASIC�S MAIN LOOP +4552 fe08 86 L8A67 FCB SKP1LD SKIP ONE BYTE - LDA #$4F +4553 fe09 4f L8A68 CLRA NEW LINE NUMBER FLAG - 0; INSERT NEW LINE NUMBERS +4554 fe0a 97 98 STA VD8 SAVE NEW LINE NUMBER FLAG; 0 = INSERT NEW NUMBERS +4555 fe0c 9e 93 LDX VD3 GET ADDRESS OF OLD LINE NUMBER BEING RENUMBERED +4556 fe0e dc 95 LDD VD5 GET THE CURRENT RENUMBERED LINE NUMBER +4557 fe10 8d 15 BSR L8A86 RETURN IF END OF PROGRAM +4558 fe12 0d 98 L8A71 TST VD8 CHECK NEW LINE NUMBER FLAG +4559 fe14 26 02 BNE L8A77 BRANCH IF NOT INSERTING NEW LINE NUMBERS +4560 fe16 ed 02 STD $02,X STORE THE NEW LINE NUMBER IN THE BASIC PROGRAM +4561 fe18 ae 84 L8A77 LDX ,X POINT X TO THE NEXT LINE IN BASIC +4562 fe1a 8d 0b BSR L8A86 RETURN IF END OF PROGRAM +4563 fe1c d3 8f ADDD VCF ADD INTERVAL TO CURRENT RENUMBERED LINE NUMBER +4564 fe1e 25 04 BLO L8A83 �FC� ERROR IF LINE NUMBER > $FFFF +4565 fe20 81 fa CMPA #MAXLIN LARGEST LINE NUMBER = $F9FF +4566 fe22 25 ee BLO L8A71 BRANCH IF LEGAL LINE NUMBER +4567 fe24 7e ec 11 L8A83 JMP LB44A �FC� ERROR IF LINE NUMBER MS BYTE > $F9 +4568 * TEST THE TWO BYTES POINTED TO BY (X). +4569 * NORMAL RETURN IF <> 0. IF = 0 (END OF +4570 * PROGRAM) RETURN IS PULLED OFF STACK AND +4571 * YOU RETURN TO PREVIOUS SUBROUTINE CALL. +4572 fe27 34 06 L8A86 PSHS B,A SAVE ACCD +4573 fe29 ec 84 LDD ,X TEST THE 2 BYTES POINTED TO BY X +4574 fe2b 35 06 PULS A,B RESTORE ACCD +4575 fe2d 26 02 BNE L8A90 BRANCH IF NOT END OF PROGRAM +4576 fe2f 32 62 LEAS $02,S PURGE RETURN ADDRESS FROM STACK +4577 fe31 39 L8A90 RTS +4578 fe32 9e 19 L8A91 LDX TXTTAB GET START OF BASIC PROGRAM +4579 fe34 30 1f LEAX $-01,X MOVE POINTER BACK ONE +4580 fe36 30 01 L8A95 LEAX $01,X MOVE POINTER UP ONE +4581 fe38 8d ed BSR L8A86 RETURN IF END OF PROGRAM +4582 fe3a 30 03 L8A99 LEAX $03,X SKIP OVER NEXT LINE ADDRESS AND LINE NUMBER +4583 fe3c 30 01 L8A9B LEAX $01,X MOVE POINTER TO NEXT CHARACTER +4584 fe3e a6 84 LDA ,X CHECK CURRENT CHARACTER +4585 fe40 27 f4 BEQ L8A95 BRANCH IF END OF LINE +4586 fe42 9f 0f STX TEMPTR SAVE CURRENT POINTER +4587 fe44 4a DECA = +4588 fe45 27 0c BEQ L8AB2 =BRANCH IF START OF PACKED NUMERIC LINE +4589 fe47 4a DECA * +4590 fe48 27 2a BEQ L8AD3 *BRANCH IF LINE NUMBER EXISTS +4591 fe4a 4a DECA = +4592 fe4b 26 ef BNE L8A9B =MOVE TO NEXT CHARACTER IF > 3 +4593 fe4d 86 03 L8AAC LDA #$03 * SET 1ST BYTE = 3 TO INDICATE LINE +4594 fe4f a7 80 STA ,X+ * NUMBER DOESN�T CURRENTLY EXIST +4595 fe51 20 e7 BRA L8A99 GO GET ANOTHER CHARACTER +4596 fe53 ec 01 L8AB2 LDD $01,X GET MS BYTE OF LINE NUMBER +4597 fe55 6a 02 DEC $02,X DECREMENT ZERO CHECK BYTE +4598 fe57 27 01 BEQ L8AB9 BRANCH IF MS BYTE <> 0 +4599 fe59 4f CLRA CLEAR MS BYTE +4600 fe5a e6 03 L8AB9 LDB $03,X GET LS BYTE OF LINE NUMBER +4601 fe5c 6a 04 DEC $04,X DECREMENT ZERO CHECK FLAG +4602 fe5e 27 01 BEQ L8AC0 BRANCH IF IS BYTE <> 0 +4603 fe60 5f CLRB CLEAR LS BYTE +4604 fe61 ed 01 L8AC0 STD $01,X SAVE BINARY LINE NUMBER +4605 fe63 dd 2b STD BINVAL SAVE TRIAL LINE NUMBER +4606 fe65 bd e4 e5 JSR LAD01 FIND RAM ADDRESS OF A BASIC LINE NUMBER +4607 fe68 9e 0f L8AC7 LDX TEMPTR GET BACK POINTER TO START OF PACKED LINE NUMBER +4608 fe6a 25 e1 BLO L8AAC BRANCH IF NO LINE NUMBER MATCH FOUND +4609 fe6c dc 47 LDD V47 GET START ADDRESS OF LINE NUMBER +4610 fe6e 6c 80 INC ,X+ * SET 1ST BYTE = 2, TO INDICATE LINE NUMBER EXISTS IF CHECKING FOR +4611 * * EXISTENCE OF LINE NUMBER, SET IT = 1 IF INSERTING LINE NUMBERS +4612 +4613 fe70 ed 84 STD ,X SAVE RAM ADDRESS OF CORRECT LINE NUMBER +4614 fe72 20 c6 BRA L8A99 GO GET ANOTHER CHARACTER +4615 fe74 6f 84 L8AD3 CLR ,X CLEAR CARRY FLAG AND 1ST BYTE +4616 fe76 ae 01 LDX $01,X POINT X TO RAM ADDRESS OF CORRECT LINE NUMBER +4617 fe78 ae 02 LDX $02,X PUT CORRECT LINE NUMBER INTO (X) +4618 fe7a 9f 47 STX V47 SAVE IT TEMPORARILY +4619 fe7c 20 ea BRA L8AC7 GO INSERT IT INTO BASIC LINE +4620 fe7e 9e 19 L8ADD LDX TXTTAB GET BEGINNING OF BASIC PROGRAM +4621 fe80 20 04 BRA L8AE5 +4622 fe82 9e 83 L8AE1 LDX CHARAD *GET CURRENT INPUT POINTER +4623 fe84 30 01 LEAX $01,X *AND BUMP IT ONE +4624 fe86 8d 9f L8AE5 BSR L8A86 RETURN IF END OF PROGRAM +4625 fe88 30 02 LEAX $02,X SKIP PAST NEXT LINE ADDRESS +4626 fe8a 30 01 L8AE9 LEAX $01,X ADVANCE POINTER BY ONE +4627 fe8c 9f 83 L8AEB STX CHARAD SAVE NEW BASIC INPUT POINTER +4628 fe8e 9d 7c L8AED JSR GETNCH GET NEXT CHARACTER FROM BASIC +4629 fe90 4d L8AEF TSTA CHECK THE CHARACTER +4630 fe91 27 ef BEQ L8AE1 BRANCH IF END OF LINE +4631 fe93 2a f9 BPL L8AED BRANCH IF NOT A TOKEN +4632 fe95 9e 83 LDX CHARAD GET CURRENT INPUT POINTER +4633 fe97 81 ff CMPA #$FF IS THIS A SECONDARY TOKEN? +4634 fe99 27 ef BEQ L8AE9 YES - IGNORE IT +4635 fe9b 81 a2 CMPA #TOK_THEN TOKEN FOR THEN? +4636 fe9d 27 12 BEQ L8B13 YES +4637 fe9f 81 84 CMPA #TOK_ELSE TOKEN FOR ELSE? +4638 fea1 27 0e BEQ L8B13 YES +4639 fea3 81 81 CMPA #TOK_GO TOKEN FOR GO? +4640 fea5 26 e7 BNE L8AED NO +4641 fea7 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC +4642 fea9 81 a0 CMPA #TOK_TO TOKEN FOR TO? +4643 feab 27 04 BEQ L8B13 YES +4644 fead 81 a1 CMPA #TOK_SUB TOKEN FOR SUB? +4645 feaf 26 db BNE L8AEB NO +4646 feb1 9d 7c L8B13 JSR GETNCH GET A CHARACTER FROM BASIC +4647 feb3 25 04 BLO L8B1B BRANCH IF NUMERIC +4648 feb5 9d 82 L8B17 JSR GETCCH GET CURRENT BASIC INPUT CHARRACTER +4649 feb7 20 d7 BRA L8AEF KEEP CHECKING THE LINE +4650 feb9 9e 83 L8B1B LDX CHARAD GET CURRENT INPUT ADDRESS +4651 febb 34 10 PSHS X SAVE IT ON THE STACK +4652 febd bd e7 57 JSR LAF67 CONVERT DECIMAL BASIC NUMBER TO BINARY +4653 fec0 9e 83 LDX CHARAD GET CURRENT INPUT POINTER +4654 fec2 a6 82 L8B24 LDA ,-X GET PREVIOUS INPUT CHARACTER +4655 fec4 bd ff b6 JSR L90AA CLEAR CARRY IF NUMERIC INPUT VALUE +4656 fec7 25 f9 BLO L8B24 BRANCH IF NON-NUMERIC +4657 fec9 30 01 LEAX $01,X MOVE POINTER UP ONE +4658 fecb 1f 10 TFR X,D NOW ACCD POINTS TO ONE PAST END OF LINE NUMBER +4659 fecd e0 61 SUBB $01,S SUBTRACT PRE-NUMERIC POINTER LS BYTE +4660 fecf c0 05 SUBB #$05 MAKE SURE THERE ARE AT LEAST 5 CHARACTERS IN THE NUMERIC LINE +4661 * +4662 fed1 27 20 BEQ L8B55 BRANCH IF EXACTLY 5 +4663 fed3 25 0a BLO L8B41 BRANCH IF < 5 +4664 fed5 33 84 LEAU ,X TRANSFER X TO U +4665 fed7 50 NEGB NEGATE B +4666 fed8 30 85 LEAX B,X MOVE X BACK B BYTES +4667 feda bd fd 68 JSR L89B8 *MOVE BYTES FROM (U) TO (X) UNTIL +4668 * *U = END OF BASIC; (I) = NEW END OF BASIC +4669 fedd 20 14 BRA L8B55 +4670 * FORCE FIVE BYTES OF SPACE FOR THE LINE NUMBER +4671 fedf 9f 47 L8B41 STX V47 SAVE END OF NUMERIC VALUE +4672 fee1 9e 1b LDX VARTAB GET END OF BASIC PROGRAM +4673 fee3 9f 43 STX V43 SAVE IT +4674 fee5 50 NEGB NEGATE B +4675 fee6 30 85 LEAX B,X ADD IT TO END OF NUMERIC POiNTER +4676 fee8 9f 41 STX V41 SAVE POINTER +4677 feea 9f 1b STX VARTAB STORE END OF BASIC PROGRAM +4678 feec bd e4 1e JSR LAC1E ACCD = TOP OF ARRAYS - CHECK FOR ENOUGH ROOM +4679 feef 9e 45 LDX V45 * GET AND SAVE THE +4680 fef1 9f 83 STX CHARAD * NEW CURRENT INPUT POINTER +4681 fef3 35 10 L8B55 PULS X RESTORE POINTER TO START OF NUMERIC VALUE +4682 fef5 86 01 LDA #$01 NEW LINE NUMBER FLAG +4683 fef7 a7 84 STA ,X * SAVE NEW LINE FLAG +4684 fef9 a7 02 STA $02,X * +4685 fefb a7 04 STA $04,X * +4686 fefd d6 2b LDB BINVAL GET MS BYTE OF BINARY LINE NUMBER +4687 feff 26 04 BNE L8B67 BRANCH IF IT IS NOT ZERO +4688 ff01 c6 01 LDB #$01 SAVE A 1 IF BYTE IS 0; OTHERWISE, BASIC WILL +4689 * THINK IT IS THE END OF A LINE +4690 ff03 6c 02 INC $02,X IF 2,X = 2, THEN PREVIOUS BYTE WAS A ZERO +4691 ff05 e7 01 L8B67 STB $01,X SAVE MS BYTE OF BINARY LINE NUMBER +4692 ff07 d6 2c LDB BINVAL+1 GET IS BYTE OF BINARY LINE NUMBER +4693 ff09 26 04 BNE L8B71 BRANCH IF NOT A ZERO BYTE +4694 ff0b c6 01 LDB #$01 SAVE A 1 IF BYTE IS A 0 +4695 ff0d 6c 04 INC $04,X IF 4,X = 2, THEN PREVIOUS BYTE WAS A 0 +4696 ff0f e7 03 L8B71 STB $03,X SAVE LS BYTE OF BINARY LINE NUMBER +4697 ff11 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER +4698 ff13 81 2c CMPA #',' IS IT A COMMA? +4699 ff15 27 9a BEQ L8B13 YES - PROCESS ANOTHER NUMERIC VALUE +4700 ff17 20 9c BRA L8B17 NO - GO GET AND PROCESS AN INPUT CHARACTER +4701 ff19 9e 19 L8B7B LDX TXTTAB POINT X TO START OF BASIC PROGRAM +4702 ff1b 30 1f LEAX $-01,X MOVE POINTER BACK ONE +4703 ff1d 30 01 L8B7F LEAX $01,X MOVE POINTER UP ONE +4704 ff1f ec 02 LDD $02,X GET ADDRESS OF NEXT LINE +4705 ff21 dd 68 STD CURLIN SAVE IT IN CURLIN +4706 ff23 bd fe 27 JSR L8A86 RETURN IF END OF PROGRAM +4707 ff26 30 03 LEAX $03,X SKIP OVER ADDRESS OF NEXT LINE AND 1ST BYTE OF LINE NUMBER +4708 ff28 30 01 L8B8A LEAX $01,X MOVE POINTER UP ONE +4709 ff2a a6 84 L8B8C LDA ,X GET CURRENT CHARACTER +4710 ff2c 27 ef BEQ L8B7F BRANCH IF END OF LINE +4711 ff2e 4a DECA INPUT CHARACTER = 1? - VALID LINE NUMBER +4712 ff2f 27 1b BEQ L8BAE YES +4713 ff31 80 02 SUBA #$02 INPUT CHARACTER 3? - UL LINE NUMBER +4714 ff33 26 f3 BNE L8B8A NO +4715 ff35 34 10 PSHS X SAVE CURRENT POSITION OF INPUT POINTER +4716 ff37 8e ff 76 LDX #L8BD9-1 POINT X TO �UL� MESSAGE +4717 ff3a bd f1 25 JSR LB99C PRINT STRING TO THE SCREEN +4718 ff3d ae e4 LDX ,S GET INPUT POINTER +4719 ff3f ec 01 LDD $01,X GET THE UNDEFINED LINE NUMBER +4720 ff41 bd f5 55 JSR LBDCC CONVERT NUMBER IN ACCD TO DECIMAL AND DISPLAY IT +4721 ff44 bd f5 4e JSR LBDC5 PRINT �IN XXXX� XXXX = CURRENT LINE NUMBER +4722 ff47 bd f0 e5 JSR LB958 SEND A CR TO CONSOLE OUT +4723 ff4a 35 10 PULS X GET INPUT POINTER BACK +4724 ff4c 34 10 L8BAE PSHS X SAVE CURRENT POSITION OF INPUT POINTER +4725 ff4e ec 01 LDD $01,X LOAD ACCD WITH BINARY VALUE OF LINE NUMBER +4726 ff50 dd 52 STD FPA0+2 SAVE IN BOTTOM 2 BYTES OF FPA0 +4727 ff52 bd fc 01 JSR L880E ADJUST REST OF FPA0 AS AN INTEGER +4728 ff55 bd f5 62 JSR LBDD9 CONVERT FPA0 TO ASCII, STORE IN LINE NUMBER +4729 ff58 35 40 PULS U LOAD U WITH PREVIOUS ADDRESS OF INPUT POINTER +4730 ff5a c6 05 LDB #$05 EACH EXPANDED LINE NUMBER USES 5 BYTES +4731 ff5c 30 01 L8BBE LEAX $01,X MOVE POINTER FORWARD ONE +4732 ff5e a6 84 LDA ,X GET AN ASCII BYTE +4733 ff60 27 05 BEQ L8BC9 BRANCH IF END OF NUMBER +4734 ff62 5a DECB DECREMENT BYTE COUNTER +4735 ff63 a7 c0 STA ,U+ STORE ASCII NUMBER IN BASIC LINE +4736 ff65 20 f5 BRA L8BBE CHECK FOR ANOTHER DIGIT +4737 ff67 30 c4 L8BC9 LEAX ,U TRANSFER NEW LINE POINTER TO (X) +4738 ff69 5d TSTB DOES THE NEW LINE NUMBER REQUIRE 5 BYTES? +4739 ff6a 27 be BEQ L8B8C YES - GO GET ANOTHER INPUT CHARACTER +4740 ff6c 31 c4 LEAY ,U SAVE NEW LINE POINTER IN Y +4741 ff6e 33 c5 LEAU B,U POINT U TO END OF 5 BYTE PACKED LINE NUMBER BLOCK +4742 ff70 bd fd 68 JSR L89B8 MOVE BYTES FROM (U) TO (X) UNTIL END OF PROGRAM +4743 ff73 30 a4 LEAX ,Y LOAD (X) WITH NEW LINE POINTER +4744 ff75 20 b3 BRA L8B8C GO GET ANOTHER INPUT CHARACTER +4745 +4746 ff77 55 4c 20 L8BD9 FCC "UL " UNKNOWN LINE NUMBER MESSAGE +4747 ff7a 00 FCB 0 +4748 +4749 +4750 ff7b bd ef 07 HEXDOL JSR LB740 CONVERT FPA0 INTO A POSITIVE 2 BYTE INTEGER +4751 ff7e 8e 01 f0 LDX #STRBUF+2 POINT TO TEMPORARY BUFFER +4752 ff81 c6 04 LDB #$04 CONVERT 4 NIBBLES +4753 ff83 34 04 L8BE5 PSHS B SAVE NIBBLE COUNTER +4754 ff85 5f CLRB CLEAR CARRY FLAG +4755 ff86 86 04 LDA #$04 4 SHIFTS +4756 ff88 08 53 L8BEA ASL FPA0+3 * SHIFT BOTTOM TWO BYTES OF +4757 ff8a 09 52 ROL FPA0+2 * FPA0 LEFT ONE BIT (X2) +4758 ff8c 59 ROLB IF OVERFLOW, ACCB <> 0 +4759 ff8d 4a DECA * DECREMENT SHIFT COUNTER AND +4760 ff8e 26 f8 BNE L8BEA * BRANCH IF NOT DONE +4761 ff90 5d TSTB CHECK FOR OVERFLOW +4762 ff91 26 0a BNE L8BFF BRANCH IF OVERFLOW +4763 ff93 a6 e4 LDA ,S * GET NIBBLE COUNTER, +4764 ff95 4a DECA * DECREMENT IT AND +4765 ff96 27 05 BEQ L8BFF * BRANCH IF DONE +4766 ff98 8c 01 f0 CMPX #STRBUF+2 DO NOT DO A CONVERSION UNTIL A NON-ZERO +4767 ff9b 27 0c BEQ L8C0B BYTE IS FOUND - LEADING ZERO SUPPRESSION +4768 ff9d cb 30 L8BFF ADDB #'0' ADD IN ASCII ZERO +4769 ff9f c1 39 CMPB #'9' COMPARE TO ASCII 9 +4770 ffa1 23 02 BLS L8C07 BRANCH IF < 9 +4771 ffa3 cb 07 ADDB #7 ADD ASCII OFFSET IF HEX LETTER +4772 ffa5 e7 80 L8C07 STB ,X+ STORE HEX VALUE AND ADVANCE POINTER +4773 ffa7 6f 84 CLR ,X CLEAR NEXT BYTE - END OF STRING FLAG +4774 ffa9 35 04 L8C0B PULS B * GET NIBBLE COUNTER, +4775 ffab 5a DECB * DECREMENT IT AND +4776 ffac 26 d5 BNE L8BE5 * BRANCH IF NOT DONE +4777 ffae 32 62 LEAS $02,S PURGE RETURN ADDRESS OFF OF STACK +4778 ffb0 8e 01 ef LDX #STRBUF+1 RESET POINTER +4779 ffb3 7e ec df JMP LB518 SAVE STRING ON STRING STACK +4780 +4781 +4782 * CLEAR CARRY IF NUMERIC +4783 ffb6 81 30 L90AA CMPA #'0' ASCII ZERO +4784 ffb8 25 04 BLO L90B2 RETURN IF ACCA < ASCII 0 +4785 ffba 80 3a SUBA #$3A * #'9'+1 +4786 ffbc 80 c6 SUBA #$C6 * #-('9'+1) CARRY CLEAR IF NUMERIC +4787 ffbe 39 L90B2 RTS +4788 +4789 +4790 * LINE +4791 ffbf 81 89 LINE CMPA #TOK_INPUT �INPUT� TOKEN +4792 ffc1 10 27 fd ab LBEQ L89C0 GO DO �LINE INPUT� COMMAND +4793 ffc5 7e ea 43 JMP LB277 �SYNTAX ERROR� IF NOT "LINE INPUT" +4794 +4795 +4796 * END OF EXTENDED BASIC +4797 * INTERRUPT VECTORS +4798 fff0 ORG $FFF0 +4799 fff0 00 00 LBFF0 FDB $0000 RESERVED +4800 fff2 00 9b LBFF2 FDB SW3VEC SWI3 +4801 fff4 00 9e LBFF4 FDB SW2VEC SWI2 +4802 fff6 00 aa LBFF6 FDB FRQVEC FIRQ +4803 fff8 00 a7 LBFF8 FDB IRQVEC IRQ +4804 fffa 00 a1 LBFFA FDB SWIVEC SWI +4805 fffc 00 a4 LBFFC FDB NMIVEC NMI +4806 fffe e0 48 LBFFE FDB RESVEC RESET diff --git a/ROMS/6809/basic_remap.hex b/ROMS/6809/basic_remap.hex new file mode 100644 index 0000000..27c119f --- /dev/null +++ b/ROMS/6809/basic_remap.hex @@ -0,0 +1,257 @@ +:200000008D0327FC39B6FFD085012706B6FFD1847F394F398D263402810D270DB7FFD10C34 +:200020007996799178251220100F798D0F860DB7FFD18D08860AB7FFD13502393402B6FF83 +:20004000D0850227F935023910CE01EE860CBDE0148EE157A6802705BDE01420F7B6FFD044 +:20006000850127F9B6FFD1847F8143271481572706966E8155260A9E6FA684811226026EE3 +:20008000848E02186F83300126FA8E02176F809F19A60243A702A10226063001630120F19A +:2000A0009F719F279F233089FF389F211F148EE0F5CE0076C612BDE1F1CE00A7C604BDE1DA +:2000C000F1863997F0BDE4FD8E00B59F8DCEEC11C60AEF815A26FB8695B7FFD08EE12ABD5F +:2000E000F1258EE0ED9F6F8655976E200412BDE5177EE4653B1040FF00EC110C8426020CA0 +:2001000083B600007EE2027EE2017EE0F47EEC11804FC7525932E260E36D1DE300E211001E +:2001200000000000000000000000003638303920455854454E4445442042415349430D28C0 +:2001400043292031393832204259204D4943524F534F46540D0D00434F4C44204F5220573A +:2001600041524D2053544152542028432F57293F200D0034169E76DC789F6AD76C976D3514 +:20018000960F738E00F4C601BDE000810826075A27EF301F20348115260A5A27E48608BD22 +:2001A000E01420F681031A012705810D260D4F3401BDF0E56F848E00F33581812025C98159 +:2001C0007B24C5C1FA24C1A7805CBDE01420B92705BDEF049F7A6E9F007A7EE5E69673261A +:2001E00003BDE0050F73975310260C6A97567EEE62A680A7C05A26F939399D8227FB7EEA66 +:20020000433B813A240A812026020E7C803080D039F403F477F41C00ADF6A8F6FDEF17EE47 +:2002200048ECC4EEDDEE67EE53F7ADF775F77EF8EFF921F843FAA9F87DFF7BEE72EE8FEE47 +:2002400096E1DDECB5FAB1FB71FB4179F14E79F1457BF2557BF31A7FF88650EA9C46EA9B07 +:20026000464FD247CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D44525 +:200280004EC44E4558D44449CD524541C45255CE524553544F52C55245545552CE53544F28 +:2002A000D0504F4BC5434F4ED44C4953D4434C4541D24E45D7455845C354524FCE54524FA1 +:2002C00046C64445CC4445C64C494EC552454E55CD454449D4544142A854CF5355C2544871 +:2002E00045CE4E4FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC46CE5553494EC70F +:200300005347CE494ED44142D35553D2524EC45349CE504545CB4C45CE535452A45641CC68 +:200320004153C3434852A44154CE434FD35441CE4558D04649D84C4FC7504FD35351D24854 +:200340004558A44C454654A45249474854A44D4944A4494E4B4559A44D45CD5641525054DD +:20036000D2494E5354D2535452494E47A4E52BE676E6D3E6D3E6D3E704E6D0F0ADE732E74B +:20038000DFE5FDE8C4EB15E819E66BE5DFE6B0E601EF1EE626EF25E637E4FBE1CFFAA4FAEC +:2003A000A5FD20FC64FFBFFDAAF9304E46534E52474F4446434F564F4D554C425344442F75 +:2003C000304944544D4F534C535354434E4644414F444E494F464D4E4F4945445355464EC4 +:2003E00045204552524F520020494E20000D4F4B0D000D425245414B003064C6129F0FA651 +:200400008480802615AE019F119E3B27099C1127099E0F3A20E59E119F3B9E0F4D398D178C +:20042000DE4133419E433001A68236029C4726F8DF45394F58D31FC3003A250810DF171080 +:20044000931725EEC60CBDE517BDF0E9BDF1388EE3AB3A8D318D2F8EE3E0BDF12596684C9A +:200460002703BDF54EBDF0E98EE3EDBDF125BDE181CEFFFFDF6825F69F839D7C27F0250BBC +:20048000BDEFDA7EE5B4A6807EF13ABDE7579E2B9FF1BDEFDAD7038D4C2512DC47A384D30F +:2004A0001BDD1BEE843702A7809C1B26F896F3271CDC1BDD43DB038900DD41BDE41ECE008D +:2004C000EF3702A7809C4526F89E419F1B8D368D02209B9E19EC8427213304A6C026FCEF0B +:2004E00084AE8420F0DC2B9E19EE84270910A3022306AE8420F31A019F473926FB9E196F32 +:20050000806F809F1B9E19BDE6AB9E279F23BDE5DF9E1B9F1D9F1F8E00C99F0BAEE410DEF1 +:20052000216FE20F2D0F2E0F086E8486809708BDE779BDE3F9326226049E0F3285C609BDBE +:20054000E433BDE6D8DC683416C6A0BDEA3BBDE90FBDE90DD654CA7FD450D750108EE56327 +:200560007EE9B68EF24EBDF39D9D8281A426059D7CBDE90DBDF3F6BDE9B2DC3B34068680B3 +:2005800034021CAF8D609E839F2FA6802707813A27227EEA43A68197002772EC80DD689FD4 +:2005A00083968C270F865BBDE0149668BDF555865DBDE0149D7C8D0220C827294D102A01CD +:2005C000B881FF270F819E22C9BEE118481F893A9D7C6E949D7C8197102714ED7EEA439EF5 +:2005E00019301F9F3339BDE005270A8103271281132703977339BDE00527FB20EE9D8220E6 +:20060000021A0126319E839F2F060032629E688CFFFF27069F299E2F9F2D8EE3F10D001040 +:200620002AFE427EE45A260EC6209E2D1027FE169F839E299F6839272CBDEBAD34069E2794 +:200640009D82270CBDEA39BDEF04301F9C7122181F10A3E125121F0383003A250B931B2556 +:2006600007DF219F277EE50A7EE4449D821027FE94BDE50A20191F899D7CC1A02716C1A10C +:200680002645C603BDE433DE839E6886A134528D037EE5829D82BDE7578D403001DC2B109A +:2006A000936822029E19BDE4E92517301F9F833926FD86FF973BBDE3F91F148121270BC614 +:2006C000048CC60E7EE4467EEA4335529F68DF838D068C8D069F8339C63A865FD7015F9EAC +:2006E000831F98D6019701A68427EC3404A1E027E63001812227EA4C26023001818626E7B0 +:200700000C0420E3BDE90D9D8281812705C6A2BDEA3B964F26130F048DB64D27BA9D7C8140 +:200720008426F50A042AF19D7C9D821025FF657EE5BABDEED2C681BDEA3B340281A12704DA +:2007400081A026830A53260535047EE6789D7C8D06812C27EF35849E749F2B246180309762 +:2007600001DC2B811822DB58495849D32B5849DB018900DD2B9D7C20E2BDEB1E9F3BC6AE5E +:20078000BDEA3B96063402BDE922350246BDE91410270C289E52DC2110A30224119C1B2588 +:2007A0000DE684BDECD49E4DBDEE0A8E00569F4DBDEE3CDE4D9E3B3726A78410AF02393F29 +:2007C0005245444F0D007EE446960927079E319F687EEA438EE7BEBDF1259E2F9F8339C6F8 +:2007E000169E68300127DF8D01398122260BBDEA10C63BBDEA3BBDF1288E00F36F848D0694 +:20080000C62CE7842016BDF138BDF135BDE181240532647EE609C62E399E33864F97099F1F +:2008200035BDEB1E9F3B9E839F2B9E35A684260996092651BDF1388DCD9F839D7CD6062738 +:20084000239E8397018122270E301F4F9701BDE173863A9701862C9702BDECE5BDEA15BDF3 +:20086000E7942006BDF49BBDF3BC9D822706812C1026FF529E839F359E2B9F839D82272158 +:20088000BDEA39209C9F83BDE6D830014D260AC606EE812741EC81DD31A684818626E620F6 +:2008A000989E35D6091026FD3AA68427068EE8B37EF125393F45585452412049474E4F52D2 +:2008C00045440D0026049E742003BDEB1E9F3BBDE3F92704C60020471F143003BDF39DA639 +:2008E0006897549E3BBDF14BBDF3BC3069BDF41FE068270CAE6E9F68AEE8109F837EE582B3 +:2009000032E8129D82812C26F49D7C8DBD8D131CFE7D1A010D0625032A998C2B96C6187E69 +:20092000E4468D6E4F8C34043402C601BDE433BDE9EF0F3F9D8280AD25138103240F81010E +:2009400049983F913F2564973F9D7C20E9D63F26331024006B8B0724679906102704778922 +:20096000FF340248ABE08EE24B30863502A18424558D9C34028D299E3D3502261D4D10273B +:20098000006A204B0806598D098EE997D73F0F0620D99E837EE6AB64EABBA184243120D3AD +:2009A000EC0134068D08D63F16FF7B7EEA43D654A68435203404D64F9E50DE5234546EA46D +:2009C0009E74A6E0272681642703BDE90F9F3D3504815A2719817D271554D70A3552975C55 +:2009E0009F5DDF5F3504D761D854D762D64F39BDFC390F069D7C24037EF49BBDEB692450B0 +:200A0000812E27F481A7274081A627E38122260A9E83BDECDF9E649F833981A3260D865A3C +:200A2000BDE926BDEBB443537EECBB4C272E8D06BDE922C6298CC6288CC62CE19F008326C7 +:200A4000020E7CC6027EE446867DBDE9267EF672BDEB1E9F52960626957EF39D9D7C1F8908 +:200A6000589D7CC13823037EEA433404C12A251EC130241C8DC0A6E4BDE9228DBCBDE91204 +:200A80003502DE523442BDEED2350234068E8D9E3504BEE11D3AAD947EE90F864F9703BDC0 +:200AA000EBB4DD01BDF3D3BDEBB40D0326069401D40220049A01DA027EECBBBDE914261083 +:200AC00096618A7F945D975D8E005CBDF41F20360F060A3FBDEE1ED7569F589E5FBDEE200E +:200AE00096563404A0E0270786012403D656409754DE585C5A2604D654200BA680A1C02706 +:200B0000F3C6FF240150CB0159D40A2702C6FF7EF405BDEA39C6018D089D8226F5395F9D95 +:200B200082D70597379D828D401025FF165FD7069D7C25048D33250A1F899D7C25FC8D294E +:200B400024F8812426060306CB809D7CD7389A088028102700750F089E1BDC379C1D271261 +:200B600010A381273E300520F381412504805B80A5398E0074EEE41183EA532728DC1FDDA4 +:200B800043C30007DD419E1D9F47BDE41E9E419F1F9E459F1D9E47DC37ED814F5FED84ED1C +:200BA00002A7049F393990800000009D7CBDE90D96542B5DBDE90F964F819025088EEBA632 +:200BC000BDF41F264CBDF451DC5239DC053406125F9E3734148DD435349F37DE5234605C01 +:200BE0009D82812C27EBD703BDEA333506DD059E1D9C1F2721DC3710A3842706EC02308B68 +:200C000020EFC6129605260BD603E1042759C6108CC6087EE446CC0005DD64DC37ED84D69F +:200C200003E704BDE4339F41C60B4F0D0527053506C30001ED058D5DDD6430020A0326E84B +:200C40009F0FD30F1025F7FC1F01BDE437830035DD1F4F301FA7059C0F26F89E41961F93F6 +:200C600041ED029605262DE604D7034F5FDD643506DD5210A305243ADE6427048D17D352ED +:200C800030020A0326E7EDE358495849E3E1308B30059F393986109745EC05DD174F5F58D4 +:200CA00049250F086509642404D31725050A4526EE397EEC0E1F40931F214F0F06DD50C604 +:200CC000907EF40BBDE90FCE01F0BDF56532628E01EF200B9F4D8D5C9F58D75639301F8638 +:200CE000229701970230019F629F58C6FF5CA680270C91012704910226F381222702301F7A +:200D00009F64D756DE62118301F022078DC69E62BDEE0C9E0B8C00F12605C61E7EE4469638 +:200D200056A700DC58ED0286FF97069F0D9F5230059F0B390F074F3406DC23A3E0109321D7 +:200D4000250ADD239E2330019F253584C61A030727CA8D04350420DE9E279F234F5FDD4BF5 +:200D60009E219F478E00C99C0B27048D3220F89E1B9C1D27048D2220F89F419E419C1F27C9 +:200D800035EC02D341DD41A6012AF0E60458CB053A9C4127E88D0820F8A60130022A14E65B +:200DA000842710EC02109323220910934723049F4BDD473005399E4B27FB4FE6845AD347D4 +:200DC000DD439E239F41BDE4209E4BDC45ED029E45301F7EED5ADC523406BDE9EFBDE912EC +:200DE00035109F62E6849E52EB842405C61C7EE446BDECD49E62E6848D109E4D8D228D0C7A +:200E00009E628D1CBDED137EE934AE02DE255C2004A680A7C05A26F9DF2539BDE9129E52B3 +:200E2000E6848D182613AE07301F9C2326083404D323DD233504300139AE02399C0D2607E9 +:200E40009F0B301B9F0D4F398D037EECBA8DCC0F065D39BDEED5C601BDED349653BDECD822 +:200E6000A78432627EED138D0220DF8DE0275EE684398D484FE1842303E6844F3406BDECC7 +:200E8000D69E4D8D9B35043A3504BDEE0C20D58D2BA0844020DFC6FFD7539D828129270512 +:200EA000BDEA398D2D8D1527245F4AA18424CD1F89E08450D15323C4D65320C0BDEA33EEB4 +:200EC000E4AE659F4DA664E66432671F357EEC119D7CBDE90DBDEBB04D26F20E82BDEE4D62 +:200EE000102702DEDE839F833AA68434526F849D82BDF49B3552A784DF83398D079F2BBDA8 +:200F0000EA3920CEBDE90D96542BC2964F819022BCBDF4519E52398DEEE6847EECBA8DDBC6 +:200F20009E2BE784393401BDE757BDE4E59F66350127129D82271381A726099D7C2706BD67 +:200F4000E757270639CEFFFFDF2B32629E66BDF0E9BDE1DAEC8426037EE4659F66EC02100E +:200F6000932B22F4BDF555BDF1359E668D10AE9F0066CE00F4A6C027D5BDF13A20F7300408 +:200F8000108E00F4A68027512B15813A260DE684C18427F0C18327EC8C86218D3020E5CE13 +:200FA000E10B81FF2604A6803345847F334A6DC427E7A0C42AF6ABC4EE414A2B066DC02A4A +:200FC000FC20F7A6C48D066DC02AF820B7108C01ED2406847FA7A06FA4399E83CE00F30FA0 +:200FE000430F44A68027210D43270FBDEB69241881302504813923100F438120270A974256 +:20100000812227380D442719A7C02706813A27CF20D16FC06FC01F308300F18E00F29F8344 +:2010200039813F2604868720DF81272613CC3A83EDC10F42A68027D0914227CCA7C020F4BA +:2010400081302504813C25C0301F34500F41CEE10B0F42334AA6C4273110AE41AEE4E6A090 +:20106000E08027FAC180263832623540DA4296412606C1842606863AEDC12094E7C0C186A7 +:2010800026020C44C18227AA2086CEE110034126C03550A680A7C0BDEB6925EC034320E8B3 +:2010A0000C424A27AE313FE6A02AFC20AF27368D0139273E819F2753812C2737813B276067 +:2010C000BDE922960634022606BDF562BDECDD8D573504BDE1735D26089D82812C27148D63 +:2010E000549D8226CF860D2051BDE17327F7966C26F339BDE173270AD66CD16B25068DE5A4 +:20110000201ED66CD06A24FC502010BDEED081291026F92FBDE173D06C23058D185A26FB5D +:201120009D7C7EF0B2BDECDFBDEE1E5C5A27C3A6808D0720F786208C863F7EE0148EF6497E +:201140002009BDF2B8035403622003BDF2B85D102702808E005C1F895D276CD04F2769254D +:201160000A974F966197548E004F50C1F82F594F6401BDF243D6622A0B630163026303638A +:201180000443890097639653996097539652995F97529651995E97519650995D97505D2AE0 +:2011A0004425028D5D5F9650262E965197509652975196539752966397530F63CB08C128C0 +:2011C0002DE44F974F9754398D6D5F20A85C086309530952095109502AF3964F3404A0E099 +:2011E000974F23DE8C2508086386009763200C0C4F2728065006510652065324048D0D2747 +:20120000EE39035403500351035203539E5230019F5226069E5030019F5039C60A7EE44601 +:201220008E0012A6049763A603A704A602A703A601A702965BA701CB082FE89663C0082709 +:201240000C6701660266036604465C26F43981000000008D6327608D78860097139714977B +:20126000159716D6538D22D663D78BD6528D1AD663D78AD6518D12D663D789D6508D0CD6DC +:2012800063D788BDF3947EF1A52795439613562726241696169B6097169615995F97159676 +:2012A00014995E97149613995D46971306140615061606634F20D539EC0197618A80DD5D89 +:2012C000D661D854D762EC03DD5FA684975CD64F394D27169B4F464928108B80974F270C6D +:2012E000966297543996544320023262102AFED27EF21BBDF3E8270D8B0225F40F62BDF1C9 +:20130000560C4F27EB398420000000BDF3E88EF3065FD762BDF39D8C8D9E2773004F8DB14B +:201320000C4F27CC8E0013C604D703C6019650915D26139651915E260D9652915F260796A2 +:201340005391602601431FA859240AE7800A032B34272EC6011F8A250E0860095F095E0986 +:201360005D25E32BC820DF966090539760965F9252975F965E9251975E965D9250975D20C2 +:20138000D8C64020D0565656D7638D087EF1A5C6147EE4469E139F509E159F52393402EC79 +:2013A0000197548A80DD500F63E684AE039F52D74F35828E004520068E00408C9E3B964F9E +:2013C000A78496548A7F9450A7019651A702DE52EF0339966197549E5C9F4F0F63965E97B1 +:2013E0005196549E5F9F5239DC4FDD5C9E519F5E9E539F604D39D64F2708D65459C6FF2504 +:201400000150398DF1D7500F51C68896508080D74FDC74DD52976397547EF1A10F5439E6ED +:201420008427D3E601D8542BD1D64FE184261DE601CA7FD450E1012613D651E102260DD6D0 +:2014400052E1032607D653E00426013956D85420ABD64F273DC0A096542A05035BBDF2045C +:201460008E004FC1F82E06BDF2370F5B390F5B96544906507EF243D64FC1A0241D8DD2D776 +:20148000639654D754808086A0974F965397017EF1A1D750D751D752D753399E749F549FB8 +:2014A0004F9F519F529F479F452564BDFBD8812D260403552004812B26049D7C2551812EB1 +:2014C0002728814526289D7C256481A7270E812D270A81A62708812B2704200603489D7C14 +:2014E000254C0D48270800472004034626CC96479045974727122A09BDF30B0C4726F92008 +:2015000007BDF2F30A4726F996552A8E7EF672D645D046D7453402BDF2F33504C0308D024C +:201520002098BDF3B8BDF4058E00407EF14BD6475858DB475880303404ABE09747209F9B5B +:201540003EBC1FFD9E6E6B27FD9E6E6B28008EE3E78D0CDC68DD50C69043BDF40F8D037E72 +:20156000F125CE01F18620D6542A02862DA7C0DF6497548630D64F102700C64FC1802208BF +:201580008EF549BDF25386F797458EF544BDF4292E0F8EF53FBDF4292E0EBDF2F30A45205D +:2015A000F1BDF30B0C4520E2BDF13DBDF451C60196458B0A2B09810B24054A1F8986024A5B +:2015C0004A9747D7452E0DDE64862EA7C05D27048630A7C08EF64EC6809653AB039753965B +:2015E00052A90297529651A90197519650A98497505C565928E32403C00B50CB2F30041FED +:2016000098847FA7C00A452604862EA7C053C4808CF67226C4A6C2813027FA812E2602337B +:201620005F862BD647271C2A03862D50A7428645A741862F4CC00A24FBCB3AED436F45207B +:2016400004A7C46F418E01F1398000000000FA0A1F0000989680FFF0BDC0000186A0FFFFD0 +:20166000D8F0000003E8FFFFFF9C0000000AFFFFFFFF964F27020354399F64BDF3B88D057D +:201680008D088E00407EF2539F64BDF3B39E64E680D7559F648DEE9E6430059F64BDF14B79 +:2016A0008E00450A5526EE39BDF3F62B1F27158D10BDF3B88D0E8E00408DCA8EF24EBDF13E +:2016C0004B7EF4779EB19F509EB39F52BEF6F99F5DBEF6FB9F5FBDF259DC8AC3658BDDB34F +:2016E000DD52DC88C9B08905DDB1DD500F548680974F961597637EF1A540E64DABBDF3E8D7 +:201700008EF742D661BDF312BDF3E88DB40F62965CD64FBDF1458EF747BDF14296543402D9 +:201720002A09BDF13D96542B05030ABDF6728EF747BDF14B35024D2A03BDF6728EF74C7E55 +:20174000F67983490FDAA27F000000000584E61A2D1B862807FBF88799688901872335DFFB +:20176000E186A55DE72883490FDAA2A154468F138F524389CD8EF7A8BDF14B7EF6FDBDF3FC +:20178000B80F0A8DF68E004ABDF3BE8E0040BDF39D0F54960A8D0C0D4F1027FA7E8E004A15 +:2017A0007EF31834027EF72B81490FDAA2965434022A028D24964F3402818125058EF24E63 +:2017C0008DDE8EF7DDBDF6793502818125068EF7A8BDF14235024D2A037EF672390B76B38B +:2017E00083BDD3791EF4A6F57B83FCB0107C0C1F67CA7CDE53CBC17D1464704C7DB7EA51C5 +:201800007A7D6330887E7E9244993A7E4CCC91C77FAAAAAA138100000000037F5E56CB7998 +:2018200080139B0B6480763893168238AA3B20803504F334813504F3348080000000803103 +:201840007217F8BDF3F6102FF3C78EF82F964F808034028680974FBDF14B8EF834BDF31831 +:201860008EF24EBDF1428EF81ABDF6798EF839BDF14B3504BDF5228EF83E7EF253BDF3E8FA +:201880008EF649BDF39D27674D26037EF1C38E004ABDF3BE5F96612A10BDF4778E004A968C +:2018A00061BDF429260343D601BDF3D53404BDF8438E004ABDF2538D363502461025FDB2F7 +:2018C000398138AA3B29077134583E5674167EB31B772FEEE3857A1D841C2A7C6359580AA3 +:2018E0007E75FDE7C6803172181081000000008EF8C1BDF253BDF3B8964F818825037EF248 +:20190000E5BDF47796018B8127F44A34028E0040BDF1428EF8C6BDF6880F623502BDF2D10F +:2019200039BDF3F62B037EF47703548DF97EF672BDFD5E326286019798BDE4E51025ED8262 +:20194000BDEF7E1F208300F5D797DC2BBDF555BDF1358E00F4D69826255FBDFA84BDFFB600 +:20196000250B80303402860A3DEBE020EDC001C90181412605BDF0E520BB814C260B8D310B +:201980000F98BDF0E520C33262810D260D8D22BDF0E58E00F49F837EE48E814527F1815151 +:2019A0002606BDF0E57EE4658D0220AD812026108CC6F9A6842708BDE01430015A26F4393C +:2019C000814426486D8427F78D045A26F7390A97311F3121A621A7A426F839814927138153 +:2019E00058270D8148265C6F841F108300F5D7978DBFBDFA84810D278E811B2725810826A7 +:201A0000228C00F427EC8D458DC420E6814326CB6D84270EBDFA84250220F5A7808D375A51 +:201A200026EE39D697C1F9260220C734106D8026FCE682E701ACE426F83262A7808D170C67 +:201A40009720AF810826128D045A26FB398C00F427D0301F86087EE014814B270580532762 +:201A6000013934028D1E3402A68427166D6126068DE430012003BDF9CEA684A1E426E95A53 +:201A800026E635A0BDE000817F24F9815F2602861B810D270E811B270A81082706812025F6 +:201AA000E31A0139864F978C398600D6791D7EECBBBDEA36DC1F3406BDEB1EBDEA333506BA +:201AC0001E109C1F26517EECBB9D7CBDEA36BDEB1E3410EC02109321230493272312E6844F +:201AE000BDED343410AE62BDEE0A3550AF423440BDEEFF34045D271FC6FF81292703BDEE4C +:201B0000FF3404BDEA33C6AEBDEA3B8D2E1F13AE62A684A06124037EEC114CA1E42402A7F6 +:201B2000E4A6611E89AE025A3A4D270DA1E42302A6E41F891E31BDE1F13596BDE9227EEE95 +:201B40001BBDEA36BDEED23404BDEA39BDE922BDEA3396062605BDEED52003BDEE6B34049E +:201B6000E661BDECD635062705A7805A26FB7EEE62BDEA36BDE922C601340496062610BD95 +:201B8000EED5E7E42791BDEA39BDE922BDE9129E523410BDEA39BDFB3B3414BDEA33AE6365 +:201BA000BDEE203404E1662523A661271CE6665A3A3184EE62E661A6E4A0664CA161250C0E +:201BC000A680A1C0260C5A26F7E666215F32677EECBA6C66302120D98126265C32620F5212 +:201BE0000F538E00529D7C814F2712814827239D82200C81381022EE4AC6038D2A9D7C2542 +:201C0000F20F500F510F060F630F54C6A0D74F7EF1A59D7C250BBDEB6925E6814724E280D6 +:201C200007C6048D0220EB680169841025F5EC5A26F58030AB01A7013935400F069E839DD3 +:201C40007C8126279981B0275E81FF26089D7C8183102700AB9F836EC49E68300126D9C6EE +:201C6000167EE446AE9F00838CFF83102700748D238DE6BDEA36C680D708BDEB1E8D25BDC3 +:201C8000EA33C6AEBDEA3B9E4BDC83ED84DC39ED027EE6D0C6B0BDEA3BC680D7088A80BD9C +:201CA000EB239F4B7EE90F8DEB3410BDEA2E8DF43540C632AE4227A9109E83EEC4DF83A68C +:201CC000043402EC84EE023476BDF3BEBDE90D3576ED84EF023502A7049D821026ED6410FA +:201CE0009F83399D7C8D0934108D2D3540AFC4395F9D7C240680301F899D7C9E8D583A39B2 +:201D00008DEEAE843410BDEA2E8E004F96062707BDEE1E9E52960639C6AEBDEA3B7EEF0401 +:201D20001027EEEDBDE757BDE4E59F939D82271081A7263B9D7C27048D24200486FF972B9F +:201D4000DE938CEEC4ECC42706EC42932B23F49E938D15BDE5059E93BDE4D57EE465BDE768 +:201D6000577EE1FAA6C0A78011931B26F79F1B39BDFC599D7C8122260BBDEA10C63BBDEAF9 +:201D80003BBDF128327EBDE80C3262BDEB1E9F3BBDE9128E00F34FBDECE37EE794BDE75795 +:201DA0009E2B399E919F2B7EE4E5BDE50ACC000ADD95DD8F5FDD919D8224068DE09F959D2D +:201DC00082271BBDEA3924068DD39F919D82270EBDEA3924068DC69F8F2749BDE1FA8DC36E +:201DE0009F939E958DBF9C93253A8D1CBDFE7EBDE4D38DAF9F938D3A8D0F8D36BDFF19BD28 +:201E0000E50ABDE4D37EE465864F97989E93DC958D150D982602ED02AE848D0BD38F25043F +:201E200081FA25EE7EEC113406EC84350626023262399E19301F30018DED30033001A68480 +:201E400027F49F0F4A270C4A272A4A26EF8603A78020E7EC016A0227014FE6036A0427013C +:201E60005FED01DD2BBDE4E59E0F25E1DC476C80ED8420C66F84AE01AE029F4720EA9E1975 +:201E800020049E8330018D9F300230019F839D7C4D27EF2AF99E8381FF27EF81A2271281E8 +:201EA00084270E818126E79D7C81A0270481A126DB9D7C25049D8220D79E833410BDE7571A +:201EC0009E83A682BDFFB625F930011F10E061C0052720250A3384503085BDFD6820149F9C +:201EE000479E1B9F435030859F419F1BBDE41E9E459F8335108601A784A702A704D62B262B +:201F000004C6016C02E701D62C2604C6016C04E7039D82812C279A209C9E19301F3001ECE7 +:201F200002DD68BDFE2730033001A68427EF4A271B800226F334108EFF76BDF125AEE4EC15 +:201F400001BDF555BDF54EBDF0E535103410EC01DD52BDFC01BDF5623540C6053001A684D9 +:201F600027055AA7C020F530C45D27BE31C433C5BDFD6830A420B3554C2000BDEF078E0170 +:201F8000F0C60434045F860408530952594A26F85D260AA6E44A27058C01F0270CCB30C1F6 +:201FA000392302CB07E7806F8435045A26D532628E01EF7EECDF81302504803A80C639811A +:201FC000891027FDAB7EEA43FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000009B009E00AA00A700A100A4E048FA +:00000001FF diff --git a/ROMS/6809/hex_addr_remap b/ROMS/6809/hex_addr_remap new file mode 100644 index 0000000..2e1c8d2 --- /dev/null +++ b/ROMS/6809/hex_addr_remap @@ -0,0 +1,43 @@ +#!/usr/bin/perl -w +# +# read .HEX file. Apply offset to each record's address field and +# recompute the checksum accordingly. +# Application: .HEX file has absolute address. To go into a ROM, needs to +# relative address (ie relative to the start of the ROM) +# +# usage: hex_addr_remap foo.hex > foo2.hex +# +# The offset, which should be in hex, is SUBTRACTED from each entry. Eg +# ROM assembled at 0xE000 will be +# hex_addr_remap e000 foo.hex > foo2.hex + +$offset = hex($ARGV[0]); +open INFILE, $ARGV[1] or die "Could not open input file $ARGV[1]"; +while (my $line = ) { + $line =~/(\:)([0-9A-F][0-9A-F])([0-9A-F][0-9A-F][0-9A-F][0-9A-F])([0-9A-F][0-9A-F])(\w+)/; + my $len=hex($2); # 2 digits + my $adr=hex($3); # 4 digits + my $typ=hex($4); # 2 digits + my $dat=$5; # data and checksum + my $char = length $dat; + + # adjust addresss + $adr = 0xffff & ($adr - $offset); + + # do len adr typ + my $sum = $len + ($adr & 0xff) + (($adr>>8) & 0xff) + $typ; + printf ":%02X%04X%02X", $len, $adr, $typ; + + # process the rest upto but excluding the last byte (the old checksum) + for (my $i=0; $i<($char-2); $i=$i+2) { + my $hex=substr $dat, $i, 2; + printf "%02X", hex($hex); + $sum = $sum + hex($hex); + } + + my $current_csum = hex(substr $dat, $char -2, 2); + my $new_csum = (($sum ^ 0xff) + 1) & 0xff; + printf "%02X\r\n", $new_csum; +} +close INFILE; + diff --git a/ROMS/6809/hex_addr_remap.py b/ROMS/6809/hex_addr_remap.py new file mode 100644 index 0000000..efa98f6 --- /dev/null +++ b/ROMS/6809/hex_addr_remap.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# Direct port of the original Perl script +# Usage: python hex_addr_remap.py foo.hex > foo2.hex +import sys +import re + +# Check arguments +if len(sys.argv) != 3: + print("Usage: python hex_addr_remap.py ") + sys.exit(1) + +offset = int(sys.argv[1], 16) # Convert hex string to integer + +try: + with open(sys.argv[2], 'r') as infile: + for line in infile: + # Match the same pattern as the Perl script + match = re.match(r'(\:)([0-9A-F][0-9A-F])([0-9A-F]{4})([0-9A-F][0-9A-F])(\w+)', line.upper()) + if match: + # Extract components exactly as in Perl + len_hex = int(match.group(2), 16) # 2 digits + adr = int(match.group(3), 16) # 4 digits + typ = int(match.group(4), 16) # 2 digits + dat = match.group(5) # data and checksum + char = len(dat) + + # Adjust address + adr = 0xffff & (adr - offset) + + # Calculate sum as in original + sum_val = len_hex + (adr & 0xff) + ((adr>>8) & 0xff) + typ + + # Build output string + output = f":{len_hex:02X}{adr:04X}{typ:02X}" + + # Process data bytes + for i in range(0, char-2, 2): + hex_val = dat[i:i+2] + output += f"{int(hex_val, 16):02X}" + sum_val = sum_val + int(hex_val, 16) + + # Calculate and append new checksum + new_csum = ((sum_val ^ 0xff) + 1) & 0xff + output += f"{new_csum:02X}" + + # Print with single \r + sys.stdout.write(output + "\r") + + # Add EOF record at the end + sys.stdout.write(":00000001FF\r") + +except FileNotFoundError: + print(f"Could not open input file {sys.argv[2]}") + sys.exit(1) \ No newline at end of file diff --git a/ROMS/6809/readme.md b/ROMS/6809/readme.md new file mode 100644 index 0000000..dad48e1 --- /dev/null +++ b/ROMS/6809/readme.md @@ -0,0 +1,10 @@ +Instructions to build the 6809 basic interpreter + +- must run in dosbox +as9 basic.asm -now l s19 + +srec_cat basic.s19 -fill 0xFF -within basic.s19 -range-pad 32 -o basic.hex -intel -data-only -address-length=2 + +python hex_addr_remap.py E000 basic.hex >basic_remap.hex + +remove the 1st 2 lines from basic_remap.hex diff --git a/ROMS/6809/srec_cat.exe b/ROMS/6809/srec_cat.exe new file mode 100644 index 0000000000000000000000000000000000000000..39c7b3c87df617de117d5ff0317c900e1836a513 GIT binary patch literal 1440270 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≪dZ^sO5LU2x4Q#QuFhDfetuo9o8Jv;E>9FCQ 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

N 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%0ALybAOrwN1OTK10FnRz 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

yjUQ;Yt7UsKLYy)BWnW~BDt4jRLEJA=Zqa(E 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

Z|5XSy}xqx%lZbH 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%0DD`03#`rIVY-&vDNWU(a33 zFAuNg`wat*&D;P#AZ!Y6lpo?A;x)X-o5QgQ@W5{g~!VQ4~x{c*I+T-=IteFiCfxqfz4t)nc=Fpu(P}|oQ z2H_$2h3<&xj&{cx2km$wa>HigYy1JEvtj@z8BSm9nL3M0cg?u?jdKeFT@K`E28`=} zmJuobG~kc@@ACk^{%6fhGx{aThKpl7yKJ&Ni01HMusw zy=&=+!Nuk2z z_+)ic;2rRG{N4OVDr1NP)!x9<9+MPshrMxc%A;i)TH`Yc^T2%ng5>?s$y0pO9Izn1 zxT(9TziDR^8_)s`?G*B*fp|FO&lyaR4*SAw`Hk`I@ptk}q)BgTZ@L;@O)oYsHZ5ir zYpYE+2X2h$#NN9`uDX=#648U_Dz~XR^5%R z&sr1&marCt!8wMEJhrwTzrnW_1s%os$oK3toHWn|e9>Ze77);l7=U32ys4|TCYKA& zskLz&KHKf+97VFs@o)|o!7sTTrKab=o0LK=0U|{jH8Ppz*{6~03?mfS)q^K?>gl>q zC9<6EMCP~|OK9(DB4E9h00|ugI#lt3vw{?GMFcsPiMc{7C58bLko*!fnG$gnxaAWm zF_8y3ralj1;Y6M;fciY0l+t;i8MApx4Mp=*xPdO_0icirX#RSO5Xl1rWcPb}d#T=@ z3jr{N)A^N9*A!EVr2PliUt+PM(om^ktE5$=f=3u^Wu`S$Evc6raOlpa~rc6W!th@+huBOe$!WUJ!<>X(_rIe_cWIr)BW zTlf*~5#bFOnQ#6S1;AVATBQDM*7uCpJvoc`i0GC4Sh z@hV|Pw(j2cK-6JFIMnd>N<2c1~Iu?|>#_Bx8Xz`07)+uPFxTrom)?53-&JBC;U zCntnB28Nh(V+?P~@`R6nIPmWJ)u$i4{pV}tW#u!^mY+Vn`5#s-7zXm#DAC%JS#c{cPLCV9xxEt7=|g&;(sD3PU6ReGt=7m>$ErIH9Ge$3P?ox??!2O~(`;(MBK9Mjs(JZd9}J zNE=P$qA7qcns!8&RC$1PahRNW6rE-MOqg;}za>{do z)hT2vkzT~|bK~A1)_@cW9>>2p_+ok0dmHAS z0uAN=b7sNK>KNr_dc}rFt-87V!Y|7oz3|pQ1;G^H1AZ_$gk>FtJBIy;;(5@hx9G)d zgSP}9(sql3+OyipB0JaLZR%z=up7+%rhaA%yTxpd%Th>*sl z39I7dVw|ulzN2vRFc=`|5zHpSE2J~H(e1-w#ICN>&6P&lFOWw^OPRQKWGYc;jU!_I z^cNKWrwpjB)fzI2ycDbfd1s6iuoPTR&Xaojm^@uEY!?}bbqVdjAgJj}7EG$@a0uU+ zQ+}IIjs5uM<=TXasa5Ab*R)K;7l?Og1`n6?&t_xkJqoJd;TSyQp>-(q20q_jw*HXG_Z$07TM&;~#$v94jAFA5frM^nB_ z%D(*eqRtfN*EHm9oI;>x7h7pQ?pgv>fa;o z@muS1tE~f8T5QY)+8etY?=t+@aI(>0qwlmHYow>Kh%e$FqXOnytU&zFKH`7CK7;^g z>XYiX*ZM>;YD(48j#ShPGIH34DIX?84x2EM!%?TRUDzr>PG}P#ww)V<5y2oBFgFBb zKtJ414CoO2Qny-~+Y^9G$O%ZA%6WX71drcOOfN3oT;&xqh)BUwGT;(5_5?k z^;A_WS%_p9o>f!Hbh0K%n`{V(aEfyrh{(K?$yn+rdkmfUh+`aOPMYd~Rdv)+mjt0T z6&IEvI*OqOc4UZ)5e%^_p3I5iL{ahJmKTo`;Sl21aBJLXWp9k(Q^fX;wJ(&12YT-R zWB<&%Cdw1P0qy?FL++bTZYtmM`nI{t_TKl}jI}Grx?B>CTwKS_D^|VnXynfa zFh|tF(8zgRz}o_m{Q_Z8!G%7cyYOWfh!WmKiM~XKMo#HOVWQ-N(ZEC=MUo+O)S@GY zjx1$EXEQol(9w)yOzU_m9?y=4*`NhdEjbcdzJUVDFTNlrki#zN*c%zV{#WK$y_S*m zp6;nTryiera;m{Kbw^NdY)4y&B+jZtqp}oKq6JyXD$!P1nxI6XELoJ8OO_-hh8#zo z5-ZBmcqN7?5R1p93FF6GtrnQAs|yAtR&Yh39tH150nVXxM|Vb#M^8pg(IFVo1N_v* zQ;$uhBU8cDRyA5|FDx#=!j36Rel2EZ^JjbU=oa78ON_zrrIRfcQ!t83D_LEvP2rR9^)9loX`bvd(VTFi}qNj>} zWr=fXBP&Z#iHfo$C{e#G0VQUZC8rV-oXAkKq906dAp!uFM7ouJ<)lJuO1rXHp^quY6^NN~ zIpPE{(@5!idaJgY80ZQY@LBx_bRFdcT=O@iLqsJcRWGrpcz^z0vM0D^vxEu#13_t{#LQt28=&x~r$9xzgz|iXHiYWU&Qo!EwN9k*xl4 z6!K%u#LnUFs2dGv7tMQh0~@LxD3}{Zc zH0aPMIw^Ynl4ugybV5pwOG0cuhF>Np93l4*M&yQ@CB0;_Gm;5=StXj2rIZqFo;Y4= zHX00)kt1GLmZhW;8&_zO#sP|oI_z!~j7+2`oS5p+3T{m+P{3Z8Xl&J}i3LNG9YFk$ zUxsmXJB~V_Bf%IL#_RPDip}H3rBcc9O-<=^VlXNCd?u4I35{&?JqCxSGpOz?6-qGc3>ZZU+J|ujvy+I_yUf22ri18J(k9*vnM(o-Z8oLInYc}3;xm6 z!YH&tpsE+Q@R8EfhojR;mkbDwzCaY}${|`^IukPBsLTjfQ)0+NU(AM8U*Nh73U{cU z-bwRyb1q*uF?U(rBtutcR|fauSQ&DF}Hdlg7ekZKxa@Q2!I%V&8Hz%ylTT_*zjNl{D`z%R-(FF}J*v0~Zv zrR62A6@b4g752pty7ab8aUVunmqvL05YoB`wMUnDiU$!Y0`%xScrCmIZjNk=?2a6c z*g$j$d{56imNw3T3&RlEdRmEk$4JicQHw0`N-QGdDw7#GJ;j0R2^tI;)uarIR z?5c__GW`KjMFX$ur#KNfDAwoj+f!Vct1)PdFdmH0b&4y&a`DF8TJZs}J@=aUu6PQ3 zF52xPu=q^c6pd~a8?~t-?bVWELZeNhQSidhPP6N|@ zQ*sMHr*CfVdfyuVE8@%A+v3~WN8(4CqmqS;$WlOwW{DL+IEhtamAs@vEC`0_xZEoG zDc~1HY(6GvIkzVIw49g&IrO*t0)D>_npu{jG%cB8wW|;|@aMA8NJQDG>`|~UKB<_L z9eM+301)58&T|pYi8G4z#7QGwV&pU%N5go7yiTr+7+O{C3V^~T#S2Yzq@ap7;zc}# zJbVw*VA4D%<#@NP1yoLaNfezWkrzr7E0%miBgYT;Nvqh%67+*Fz=xneH!toDs_nVqW7@o!clb|+Rp(c) zmupnD5b32?FGz)w>bds}?mNiOjeIon8H&heQAzNkK6A4Gge?F-y{)(f z0wDxJ64trKy4JWJgzv)<$he|WfyW3ps$hg0r7>S)Zp_!1AUFYpQ6cIUgecO`AL(3j z5LnD+0Hpvcm}$Zfn{cJm8R0cv=V>09v;9uQ9DWpL;0;Mu@jKEao7_^=(;$K$p?NY5 z(=Io@g-21eC^!~H(EvgJBm|4%V9Y||0)J}Bk4Ck&f-)}Tsn7+q|CqFyR(O5-^gy*& z5{1nr!eR!GcTio}Jg3ZpUr2)%swA{gGlWId0%0X}y>P4W5ZDc#1qX!Jz+ZvzI|y*( z)k&e)x@Qu8mKz+|wJ$8RK%6p1)*OY9rw$^a(t{pVj{Mn&b^Cd1_O&tDLnr(0`XW(ty6ehrxml&EL) z`Uiwv%x=qW-f#<8%M5^xjA0UMPf@fdWipG+_^GpyqInvRr|7hio*u&d4YU*^Aw2{` z&Sv}oN5lTnUHGSw~4gtOITa z?Yu^`<1O|&;D_iWu%0@~XYkZfUnf@PUyuSL&*J1M1)s-|!CWU94H2AtG67Em7Ti|8 zwfuScRQa}FAN|Y0n>Ky##(hV>+H?~NdRLa;D!*1<4!#GP!KBxpnLecRE z{7F8WN|e-6a$HKwE=XRN?9TRQt*=lZ5KISW27l#$PcrUGfuG0U@x2>=CwU_EdE6A# zW1$r5z@{_`WQkE?$k2L}7!``t)`U_mv9=hD#TZXb%Ioz&mSF`dzz4K|9_S7j1JkqB zd@z*-dUj71KAb(4J)WhrwSYKCKwKdp4iZE;2hp}_#)|ky$Bw$}5V&QZf>TtN;Hav; zbGoGXr}eL+!8CDOh`9>jy_l=Ro+fhxuFU&|Fw z??9nJ7@42gI72iX8HZRXQ-I__s7$5Fuov`VbIakx)sc4?gO;R0p_9IGO!xl3AR%Av;W3@M41hoPF)7* zxh(yFVF(`AbF4ST(^PnnWifui4L}C!8!T(5Gtp+*m2<(1-OEPT^wg*ZrSud`1)6z# z#11*TY=`#g$-k#TAL3eA7t*8V7ChHS$gZ0c5jB{w+AKC`64iK2jX{&_iPnLTIe?Uh zL#Kojy;R)cI`m&jHnf;ozr$MxVgfpmIf&6wh#EY5Rc-Y&VicN)$CK5mTdZqt3S3aN z$`Dq9zH`~>2R4^qDSxtTYsakvU^76F1>Avj@79AW@A}?N2cElmU`FYAZqMVki1C_z z*ECIB0;Cs#2JSB3SbpQH@WjWHo6jgvw-y0XP z*s4T$2ckf@Bk^+VL+Qqje{=-_?!O*#*iA0#HaHEvs+J zHfhV^*X1lVEDQ#LN0vAxN~tM{LUFhQMc_Dl6w_g?8jnXIa6<^b9gJ#&CBX*`EqB&c}CPCS>d zD1fN^|H~vWIBo(B7kcg)Pt;T%kEX{hZ5y=ch0xLd%>=6Z+O^+^9%hW9~g|tPK<@~biZ(4 zE#LqLtu)0MQdHWQX#;K0>}(nWQ}pAFV;cjsWLP9F@-GT3l1xUs(LvQ5Yclj%`|N#= z)m(SDTkg(vYn#|RtpoM}$L-ueW|v`Co)_$Sd%<1|yR1?=W{otBOKVNNLa%F6{6Xfy+%|1j?pW%@npZN%n$9%2FK5R})JiBl4SoS2 z*Z``PVclNbULTY~D`hDhJ`%!L3jXbGWIUQ}4!6zb$k=KehJ=|crWhDT5m2h0j-_zL z80g_>0Ra5mhanKt`JD5p6Ta^R5$Ds+_nowJ2o4;Q2g4a2PX(e6$PZ`1(d_TCBgnPs zQ;T}`7w82|Wg}S)IXpx5IWUDPfhnZX0GrINOb;@ay=U<-U+-{lDVM2W58}6~-G(^a zcU0p1(QH21bpgKTbk(#r#x=&3N?2>nc`D6er{+Q@Mnf+xb+$ZZwbf>lJaTcIBVD5k z$jz}i6PEeRB@daYHZ4-UT{vHGwRM^OTK?(`&KCgWW2v6X2#?JwawUVtmGT-#;9(~q z1)l07Ny4z&XI~j4bmqfwbeJce80~w+MF9FKRp=UAxO`(~!ly5MXXfvo8&{Bj8t{i0 zRSnEPuwwo9$229&kKQxu$p|BUn^ieamo-sy@Q8MH?RvCiFbe9=qDBb615jb?acIs(7dID2= zfHf04XC@}iOzfOF>hsE(Ft(2l{0%D1hZlu+h7I8(FhzMszR<1M3VMnC^P;=&i!AM` z6j0B0VS^V&2G&}{H`r_C3W&g&5BcV5K@M|<(yc{wjK1|TfjT%15BOIrj|ZW;Ds`De zrR?@KJ46yOOw48YA(ybaCA zD;9zYn5x#1lg4KdRkPr>!<2@?j+$ISBVBEAvg#e)U?F8{GR-or}O*X_DlC81U z5Vv+08X5M*IDK zOf|Imm;`WSgDIHCks5C{v%0Os>IkH;8VgyRMRvN~*!K`WWFom@9Q0L^?&L3>+*0H< z(5>y%_Gl+HgC<7^Gb4nV5yH$!R1h|}z)BZz5#Qx<;P+f%{GQ97J9{zy>l)45;JGdm z0cN@`CUeM)*Jvkay*BfTwa<)Uk?JOtl*NhXL7|CLlWN=%siSyj!j`TBR*S-`byUi# z;-~^tzz^yD0bNKJsUEDd;BT_i$prE>m!$iN{#88?{U$h>Z_jwHIQ{y6f2>7Xaf?r( zBkm8)+OqtP|Co(D4o+83l6!{Vef@(UZvS@YpP;b*a#bzHdxxKCd%br?-+>cQ-4Llo zav-3n>?c^eps?Sf_BT1BY!QVLrwb(m&LZ$7mUWd7Y&>z$RkEa9`09ygxYB6U+ll8oJ@~OGAcmi*l1LWu zLyC}h0H8Y6Sv3A+np#YklWN(JOw^;G78udNh2RH>yZSO=x{~$4w}K(bi(aK(uWfqFbRWZO)^*o zXk{r}g7uYJh#+1NMZei(XKbv+%vda%sl*5l(N(gcL&Ac{nhO%{NknT9t@>1xlq(fTOEsxveWR%qC}>knlbM;;X;O!2J~N-~w9L2756ss( z>aQ~`WmZ_12bN1W~b?b(>zO_mYSI}bV~DbS7>xQ)6Ooi(gudIAea^O z=4ygzxt=LmN6R@O>VFvf7VtKzGtqNqG&6dPq|tly9=&Cc^>8fNlI=v}*s+82G9*r7 zf{6>cyjnK4DJ;;^xP_3L(k1ST7HFIF0flz=5`vQ$Xp7qhN*`{s-Ik@j8%TR|DJ}Ij z+ogPL!OA`V87VRS?)|{`c!Rd%A-~Q^;U(=rbF18U+is7^@j4fIWfx zUJCfnKYuYREU2}aLLsBcWDXIzD-tmxo*;rN;10U7g_dB}DUz#XBI#hJ+Fl7(=Pyh? z6||U@`3rkBchM*)qQw#qlB0uxP$*(Do2el#7$O6qLfB}GgQd1uXy*k1J_!}u$!@#L znaO5}l8+dR*=#flrk*eHkF=9#c1$a`>p`Y8Xf&NGmWu5&?X&IdmiFE46YZ09=WP4= zc4PbN#^0H)umq0>EYC0s3gEwL7EK%xPm8Sh_3oZ|=BB4~M1wR^zjRKPmfxgGin{#T zMZIK29Y@G2rI>fAW4vnxF8;rfaphK!Y`sSECrG_C&!+Jr^dC$W1m^%j-Px?yT8qF& zDUwZ8c3Ntv;i?%Q!=88p9UB;_vj>Wju1qGa|E(Bo;Ax^P+*Mv1ajW%vv-Ka>7nAjy zbE11)4}ME7SK6@UH(7;faW22#)xt>0N-2j8m}v`p)2j&vr%Q=@-g%b2_T4WUuKS2D zol2#O@x(`#1?Ir?u2pH5)oJ9(P)oePA=vyB85$y2F93ep9*|-;Vx1#yO*q zaAdPr3zEAk^=Ycs$MykW9Ev7Nx1rk|cg82xJ97`kA51)oAC(@DJsy8N@o4Vx!n28I zQ_rTKshp_2C_Nv1UU{*)(DzH{FO~nYobL-c3zFiDD@iq*FBDcwMQ2gziFIa*>JTDo zdY{r)>^t3Ocp-;BnEP;Hzk0A>=vT+Yu^4Mg_!HhWwZ093{tWMQ=W#Os-(ru%9?2UT z7#KGM`m`2DI?p&zEN=*=U@C$EK465Y2&OCPhDY`J=Nk=7LX!t=$SVb$izx*u?vUcn z8p1hejhBQVA5h3uGPx{4!diE*%3(v0^E>6BKOKjw7P^9!TwIdkIOoPVM<}P0dP$Um zTTu%6m;)K;2FI(F3dEuX{C=M2j5pM9O+}D_rr;vJ3Qyokd=xL>v-mtV<9X(V_NaRc6MfWIiiz$+vCMv5=Ee%s3SQHM zWCbhv>zYffCS*%BPu_|3-fFt&h4Fl=na_WNu%hEsyA!i%U&(P$Xn#uK8tN-QZ&tJ>jGSX8#{U5C^ z(VkzAe^X6%UU>!cr~2l(-GoPDiz(&u`5Z&|s`_WTGajXtO{F*~uyYsw3_fu9TC&IH zL#d(q4{>{E*5i>p4orsZzRfoR-n$6iKTh?EU(Rs|JE?^JSgouTua>X&j}#4Uz7P5C zNZ*mU&v!7x`#C?)prS|cWR>Dbk>faW7g-NO6V{SKHj~Vz^2OpH){2+oox+uoo!OD% zE&MIQE!kUICyO(9hQCL+Cp*(RQ#{=IRs2=vNbywom*KNTWj}vFIFMzrzyz_b5JuBV zFp9GIAktOCh#U?^l4;rJBWkXjfWKfg0(!(VS+bXv)4oDhC>pauCM|PO2_qDZMnIMH zd7I%b-liW4I+~qof^p4gVyGHP#!gaA@*kB9%!1QeRx-tmmKn)RW@a+886h*zeEz8d zAdMeNG6jf^(HoF21p-~fn~OD04GmGy&|p8+eYz;?sRuXFFry2kYE77 z(^#c;F%HNmK?IxyP6HbmKv)F15E=mJC&g+r;rgIqT9|a*Yq(pOaXpS6H$P&14$b4|%=1>aT_VuOu`KW4cnG$M zo6K$^|Cl7B86z@Ei$-Z$htX_FI2;IKdIiXU(Tg}9<_&zH;HtT{xLB8Cl_Fv3exu*% zx+C`faq8{ZM5KD6RK7M&i*9YAan#Gb(rb-kb$Zbn-La^TtS|$pAi&QdNrWH{uwk0# zFTDMv?j$5OAbM$KR+qq7kf9S@ zW$?{SvNNnN0lbK&3ai+eGc>h za=lhxj1~%vF%$Lmc)tD$j@NGz@RtAjLZhbLYFg87&y$#&$E;=v?diM$-@q`9+IIGp zwe9dfQD3UlU81c;A}ubQME}J44cup9BOK-q6wwoiL1d=Bh1*dKZKDMWXb!ACQM8gZ%+>gc$>msRO6 zy?O~RazQdz2Io6x42k;SHt_dcc43J<$UcEqq1EhVjhs`ZM&m?l8qju6P{^l@77KWR zU^Ioq4xQ^enb8g}976VAq2{a(Apag9`W^Jxj;cUgAxB-Niiw<(??4elOIxudY9?|~ zQ45D*>mVPA^A~=hMc^P&H0+bHOh;vUge;{ZLT{S^6_#pCMB5m5R%y)fVqqB`(J$0R zTp&ACh*(%SqpGK*Uo1lKXi(d034OeSac=FzP9<8MsXb;oVP>7G^DcB($Gzx2%Y9`& z?DTd^wV9g16xzsbZJ1+KWy$reSNhs%*E0cMfX9qQh!IEFd;oL+D zby!8QR3a1qE_nj{Xved#>LW_QH`=Nw6-~{gW>W?&bw0(+q;N`tgHq2j{RDkI1TUji z&pf_fiv$bRc0sdM6=6h}5m-sU=LHPKS^C%X|DA5$pPHUlAs1bhmLWVJvSXT&eQ%BT zLT>uGacOC)wgi!Ys-vpYxPp#V$5;^)-n-N&R7>srL*<@Of^&6MIx7rsGMbGHAB!t- zhA&&H3UY*9A>?$~qt+0PCwjPQ2vv+F1(!<}XGjWRTbyjV`Q8ws9yT!fH*AWndP4a$ zCOjTbO(T$xYfdUzs)#a>c5d4~Yn1D2|p zJj$*tv}V$pNoyjl>0(St^EF29Gu5pB1){3%6yrU#s#0$IY)f>ly1)LzyL;S%wYT!Xz^CzeufJ`gx_&po{0r|~ zILAIsIEfb}@y~V4e=@=W21|g;oLfXP4GfY+Fir!aivVUYL_2`zA{=jp<3&;SAp>J_ zfkx|aYbJ7-+k=8BlO;CB2-Fi)JEQ8ZAd07F)CK7Ug0w`jZIE6fgd&z)f}98Ez_}5Q zOQ#TIGxDP{1JDaU=j}PzC!K#k2}7coPB|z+Ac(&Jy~W1&E$SsMg4!KY8h?#H!5TN_kipZks;_sQVd`GCGAn*SWr~v z36AC75WR#=B}GxPj#wwHvsS|l*&Ma9$O-`kMbcfcp0)~Bg8e6Z%hrk1_ck;#F(Jxb zkA__ypVob3(=~^$O6!hN)X4f3)*_@8HlpBwSq>q;Y!O37vKKYP6zsPILnzD#l|~Vw zh9w@>RKPTwWqNE3U#g8pU`r3y$fP8BU6DhrHtfoE z++5xD#V_tDm$S@UPyfe1zxmmj?r!$@7uE-)#N={z`QKJ`y!hPFZwK9k!wwP{8YbK$ zhW~QRXuwVW!35ru21$7U?@ifF0<2-dfH|C|uEfHG;?KF<%qZ#n=mc<-a63y#JR#re zcn?W_dXlQq0LY@fSCQpYx?!4bM>zI`v#b0BdNIZqVi+>>e!2f&WxzHb! zH?hn!!_FPf`=a+LGl}yF!J*)9T{w#r@{SUMfx-v~aFM{pL~JI;pqLa>XhOqeY<5K~ z<@uO3c3t>YJGTG8n=%Pu(0$!iXtav6N^a5;`$<&9Tf{>mBNikYbvuD3(JVTOpt6k# z1{m~>TLO0nn2`WJ9KeBjENag4JVw04>#{b-_s9F6Wy@U`Jv!tAHR7^s2AlEu6Rs*JNzK4% zWkujL2E+Ii1}_a$E}@Q9&4Of&^1zgk5!%KMr(VAM3$J55ci?}txAjCEmPBIBp4FFs z`QSC1yGr<~!SY%Z>M#R%QmDgBp+}R^w>8}xCc_y@=ov_S0!9t#gHb0n z#hQHngcwlZs=Mw@)aN}uIAhP|?P^kbYvR2KPCJG-me3<*VVW#jzVWA*sg_#0_3f@+aI?9b2 zx2X>Z!g>KKg)Z}udAs@ZhOf6CDF_RN^D3h#NQpf|pxr{a;JRLAi*mJco%sXGoyuW! zSowzVwD3Z!C2e$N#6D-lHQ)(nynUfacpyqnvl!Yubk?G6xUDV9TB67j6BQ6JoSq5q zjQ0sI8}-h58Sfh{BRuFM*?bAwlS5^`Ki|Kv;e8~6@iY{xf)~V$Pm^0FN;6mle{eu!Tln5=HO;l&^QD}iXJA-R=3irgs7-qnEUtkFyOod`u7 zkc~EtyjD+9Ll^?u7=$EPAnw8frIpap91#DDkR_OM2#^oWK;Y9HoGno5N{$l@^A}#C zXOPa1P69R<+AS7J7(jxiS(V`G9j9PT*l}TT;Sw_rd!YQ-QN%WL0_cy>zfsTQP67x^ zf+8FhSR_mcP@L5ue9G_@!!ZL3UnP)R158WeY4P1Qu)cCl%O0U^Rz@ECfoV(?5{{)(Fzr=EWB}BxuP}Qr2s!>`rqkp($i~@^@ zQV`3Q=szdw2V;ly?OL%$j(?WE45iW&A9yUo(BpJa0U1I%@s_^E>9O_@>!yJS|`(oEDfVXkqRkJng8!3wIgZsOa^; zPjxw~&fT7Up2MD3JqC{__%BfZpOm|Ug>z!4Y=hG5`(*RQHw1Ye%B5UvU5Lp|P zc3Mwwnwm6Fr2-i?{X6G)gc)XPj4B7z?mJB_a02-@OQI@jxvG`CVNtweSunpr12p1T zP~QvcpEdT(`kqGJqNDbpNo2a^!Z2L_>U70y|8=$KgLP^Ydg2z&Gh`_gCD&1cK5;GVEn5$u<+w= zbni@7w2u;bXbVE@o!lpo$`~8ioyt*umD7Ojqnet(Egebqo))uFOHwtEn0Qfw<;;BPK;hksR zI)+=-c`RwxYzubU9nz=lcANxYeQIK&MBDCey{*;sHrY;F%^Ql9W^EWie79}VwqQGL z<8A)7XIP#U8X;^tP;Odku4mUvn%Bn9O;fvAZ}0MSZ*7@qwuMIQwKJ7*d($aTI_1rV zP{y4M;lGKxBtp^(12F`yB+4DI&`P6T9xQPM0u#~vJRKhVXehO2>++eF>{|b^V>^#e z-MF*66!CQoN2BSy7WyN*arx1icv~`=9k_t9;C9;!F3 zt`D;RlgQ*f=rT0Meop(C(>wCH^n;x&%1OJJ+gfki%Ai(0&tGw$VyJa(*|oRp*7W2q zsIq&v?;iP3`QvNuUUz82y<0x(`>g!nmU+X|+?;Pt{$c5d8y0q*-gS1@`CY+);^~me z?#}2g?(4?k&RP(8+0NK-5c&I^P+ZFjiHatd%WX2wq_8su_8}+XLn*o-mRN&Uvp6la z!>K1y&!yPZJpR)0o$5>s0%%^*tZ=OJaO{cLbFko@ehzKPDKT=aCeIGzVOYUnSR+Hj zZGbw%G!+*cHP>Dv-e)8o2Lw!&`3Gs$zIILY51R{qJmR16GyZQgKSw-4u1%PdMVr{77L|&4Z}Cv^aFH#_z+a0ZphU4;&9gJx@HV(NE5TOM z`O%!@rkz))EoPgZT0;iqmoP>L1Z@hBXGx&C**O{L@ z2(C;T|3$Ql>1EnkQm4;J>Xe?3tm?(1rlfPUfWwls)L;tBuK|mwNls`ifd zQaj7{rMIN>sn+!N)V2@~^+ZBwLwS>e*5aCiR&%uw8p&-6p)1sF3LcOLLwGc^BZRl_ z2zLj`;lUoXv3*#<8-~lB8q*K8zSkIfLwIxH@(|kEa=C)m`T9e8UFK$dX=C%=_2ye? z!Dc{ynoc@JS(|3gO9V#Ck`ruA=bv;oqD-67qcr&%^mIOvXy{P7r<49&tZuH?oSfSKglUmye&rt7FK@eY@yOj1-&1WY&#`v(?<=Ps85nAd#)_fIpROL?d(#)*`R@J= z7DrjwT~e#qGrVV@G_vuUbshD$3&rj|-=6zsN9m#8;LR$j<0%ne1KRI*4 zovykaieO+llXdcnscS#AV^yatr`DRTjkZSpJ5u*XpiPqqP& z%4y)1Q5Z8HiLWhhoWmG&ho)$W7)9 zGr8Fub2Nvc7}P@Ubk2~Q=z4UYUe1@6?EndMW%-UJsDe;!tlQII&h9{nGxDimI>h-y zSTF{JFtF!_rHmSep{ftqF&v$G4TMJ4vCgY$o`W9uO;tn44A<*4H8e)NY46ASHctj! zHgi#{ukmQB%xrX^*nZQnr#e{gUY&5u_GrLUuwf^6|ME3=uG@Z<_Ko_tb|`WPvU{Y> zc;JDn3#Bdf(AD{9GU+l`wzI2s?GZdPy<{U0e6gT7)9}nZjgo{BglSP7D+PCJj9M~c zG)*Vwl35esAe5GyAW4+E-9Za%IO2bL0**FW_I6D^-NzqTq6x zXHD2trOxDj>QmP2wKDsDQMCH4Nm)~?GW8pEc9&*lJR)OQzj;uESM{am zU^z6p{xWHGF_my$s6=*g5i8sXteMiy!Yj+XUxe$<&Wj6M5x8z??dfT4?d|!9zrC;C z-=7bfgh(KiwP81RKYY;J+S*f(Ei2or1ds#0qxgNFZBzXAL|e=4EE(jr*xq?Z;OV5zE2z*Ju#y32_#1TgQ%D$I1Pt87(| z5%Q<0BkHXBnC-Ff5tUcS&Wy@RWaPBU28`K^(wB*32mEkL{HQBnYV`+|7E$odW1D7` z5E2FQ&Gy5zp!fA!Z>#>8wV^VbSAD(!dA>T-Qqv#YDcL5Y(OCuC6%4CsomW^zq1M6q z3x6RRBiIIywW|LdgJ(|DMH?Ojm4@fj#aG`XPhX-rinW@KXGi(P;2edwrRgy!FxXfT z$f-6KIMb`egd#S3I2E!-LpWj!f|P@s`U_o^^=|=Yg$v8u@i%ajReO6?0vJPh<@Cv_SThmuY2R%+C*ZNRoIc*@k!tdg4 zz>gZB?B7qfdLn~E&#u*z8bm8VfETtzHh7)F2y`@67ZN%%`6zCP2ee92jHd!ap7Q^^ z7l13@loRqzIUx^}6fTg5B1SY>J}+TM)Q~p&0;w$hA`sc1CDK9~l?m)QJE^qL*@e=6 zQPllp>~Bw)L@Nbv_P0-(dAg96+7Kd^)rEzHOAfIHpMHT*O$exMFE(Q0fF?a{uSTnk zlb100|Fr3|=2^?E_^|yU$HUHtqKB(bnax#yHLzRS?bsdtfV9`KH~KJRdLyzFWoAqt zwY|W;VE;Yyd;5~(PflaaQIl)Yic+f%+NaI8+KmOKRZ>z)x=^j)iX?cXQGA88O)(^- z9e9WRHR&%BcbQ{-^n0f7ng5rW^O?L-G#rhtW7gVvi^J}+2E?#EVvF)y*-^t*ZcN(d z*yiH>_HZ~7-O4m$KMS2Qg=s9Y=1iH)(T7DWeu&_PnfGTzk$iPSx}iqFSRQSmF$>tI9)Eu9}PtOc_ON0;%3GaF@vO% zNpxlkedS2!04g90p*u+>>Q*qLM2T!z#Ectb2Fj>JUD%Le>}E-l&0Prj=J6l3jk5R? zi^a?n$oKnYv!y7`h|GBrpBB%G%%r#gJ{_O$u#DwEw2G@lv_Z*20p+FqQJN~wjpXr6 zem2kKCo0u>eEUR_51NL&8zNn9mZqW323XL>r&d%cgC(na{cy{m6cNCYdV6UI zsjXRY!=|raRh1hYU_~I@0r>2cAka!W(^KH`nQnw&qba0UV2}vfxQV_J%@WOvyu%s+ zysVvufgZC|EzmfscD*s_4Fotm>8RorVVruPwxdh0y{-pp3WAI3G#$-q)wsE?;;ODo z(iRYsEx#WYjj=So|B9RY-gx7hcroc;Q}0g)v-RKk^PB4V!Gy2i{qIiw zV!$bi?l7Y$Oupw=^?&_PtY9-Ili1_(b>Qpkr^hNXP9_}|U+i*r?ct%IBLS3VHIcCF zgwlBMC!6w>kBApkzH*B^78>?BN;5E}8CV1{yWtD}1Jy9ZrU)g1phaEb^A}z@PQByY zw+V4DLalb>f+~8hi+*v)BRZq5x@f-BWs*~1!CRpIqO^So%gXmYAhQpL92CFdrH`M%(|y@#D_KC zh;PC->6`T(AqNU#OGFrsFqjJi7Ws@dke8^uKs@H1yfGsKqvJULv?tiCmdnHWe z5LSD5NSB@|7vYQS6KDtfFAXl@8>8Ch7`4Ir9Q4sTMmH9l^u7oW6dqrZ2C>33E~@k> zwY_VwdDLL@s6krU4UQV@8|tIS^-)0Sqkz)4(GB0Wv3cIcCV$!3ya4I^RrABK8_jT; zjVe7|rKhW1G{y=Bx@eKiE{KhynU-B4xNsL$g5l6EhJH>9$#psCH5~LB4hU$`ub~th z{?G5}*HBuiZ*=~`uQdxCsxXbu-z6{#{!*{Muxj0U5U7-)ZKE0-Qy9ftM)!{H8)Zkg z^F!@&s?8$wwsCr7M*%q6_&5=)mKWgFWM~&9uJ?2spbqwwQ<6&C7pRtS(P*vplFO5; zTLeznHo9Gq+lL$!;vEWgpeia=f>k=EcJf06>9Wb_ZZPKbO zStAlsL)&-2gGsfCW{bcZIALh8y(s(4|A)PAfsUiN60Pd)nd#~IbkD!L=hvh8YeqAY zMk9G-fyP)imTe({KUl`X0&K9c!LqS2CN|b)7i=flSP3Nj@*K?9F_zmy<62il1!4f?0e^(v+o?K)YW&YtE#K3t8d*~bwB+; zeM+uGtWm>5+F{}_6ql=FTegr(%xP@HLv4rKm^PB;@40ebV(HRoPhSr++%wX{pdP7* z=^=^$UVlr^;Hv&(%xajk_R7cbI_j-tTBhYZ;mgnHr;eI{EBWiB|2=d9tI2YsDUQ9y zv)3i;q9YkkCG4>fc8Yb*D@8`0sTi|U3y^T3~B+>N<}uBuxsfoVK4m28>8(O*Ep zmT=!Xcf*F#%H6&jKE0%SYs~KuS}&UD@XU<`1TL6fS>CjiVSMciCz_U4Y^GSgx3#>i zL1|htF}Jf>rF3pu#NHfpcAc22U$^$QB}-Pc@1D4IrRE0)KOn_jefSeYg=%?`EjO`* za{VwXT>)uL)o{LT!ne9Lm`DWYuE1B{o3GKsc7)h}2TWFCrZ8EVVzNd`4>#%NWq8pa zCn%vne#OIyEKgCAVU?5O1Kv-U*9=W<`-cVhbrDWKS%FTG?0yucg~PO>Fs&k-rK@XM zN;qe01aej<(J1h)p~VciO&}$*D8wWh2_msJQO>NX*+Cqb5R1nTwV0j)p@%9-9%y9fF`|uF~QT>lc$)1r&xpc zQ}GKwP4e?3$?q?>pfJrDrU_wsF-#wnN@MV25Fk|Ucfw|vyaHlR)0%hmcaUnbvw zW4W(9SRN{mluZpBu2OgyejP5G50_7unZso~2ni?3Y?$|FBci_Wmd!>Ii|hDo#JM;g z&PL+;!dp|ieqLjwsVjuy%_aK8iFjNTokGB$u#E8dFpoukh#%!&<~g1$yaltRaH2k% z?aK}li`&E5k?i3ti?ULdp@zh)@WE#XTlB@Z+(%!0bIS^A=8_5<2w{_1HmSAGSaO_xl}^;Am&H?L>stu`n55WNeV#Axk1 z9Q)Ril^we$c3l}&=$f0@i+AqX`tgbIfIkdh+NJC8@~BcK=4ei>wR$SNiV6pRyhhe;TwztIcJO3P+4a@wa{7QJHEKck{K@xT)Kb9MJ#0 zFcdj_n#6tFAUDK~aECcFca}I6?5x^HfyJ4U3m|gAWMMY93%%Q zbziZ1)pJA=8gXz$Cr^+maQ>=qB9(1M9P+ZwZ%JA45fsm zIpq?)8VX}o!+tA3vIQWIL(*`Ng~(?MXh<vbC&E(|(-$EI6f z-uv?HH|+V|vht=&Mn8Vd9UCuY4}Edpp^tqq{MAo>Cp5-J zT0t;{RZEG|pXB>TlWH!d2(uBF|>BZV!-E%3XCHAgOOxFmQl7GgYgh@x3L=nv(bQr9rEe()=YDtvSdP2 z+R`4M6pzSB++ua!v~1nQm#?X=YAhz$%C=W`U9 z?QfKwdnf*WOT2y6W!FFR!>yOeZn96&HL;jOFqXq8hhH(qvYMi(GUcP@tbM>rM+{!t zNq7<}nQ7RC)X=g z)oQG_eo=0f*r)bK`eLi=*XFiJ*Q(dXw$$&IwyJw0TVs23cdCDz`-1p+^$U^D$L_2D zV(tL5Y9>#|-i+RfL|2EYm`TBg!3%-|qzw@y^ zDhc45pRdVI5(`Y@xq)rEON%09u*W*b$#`_vEQHI6j37pDgY2zO$qKuLi0Ww|*K;^BX(faI+6;A0SmA4w0q9KFTEx^8s z%}ldcWvb%GIZL%3udT;Xg5@Z`cvn1~*5;)m=`JML>Rnz9>*VB++(*5tx#TvuRfBlUs>zoobAYFpHjh+pY*`x+WOj!Q0{$Stf>1d}7K zM$-cJv4_6@{rUNH>jH1~>WS{9X&~Mbe#%c>_s~TlLcqazSvPrx`7w-_Ca%R8FX<8; zFQqD>&KOMhN-^Cl#bQw9({_@cj)^t&Ba(@KBAnqgKt!|25COXH)GMc?SM-^5YIHQm#5B*< z`y=jxiK%b0=+!9hB__Pd^f41-O4eJtB6wY7dxVK3-8M{G_)b+NqeT=;%_{GtTuj1*_bg;>gSV0Zgzki(#ewpozh9Fb!BM6WUYB6&$!)%s;!dG*ebHO-@ZEapma~d zBv^!ukR2=ym4-`Zv2+Y;)qQ|2zw7v}^JL;=@?YYwCVrZKgL@>}ICP-lV8KDG@(HZfZVn0gm+HO~=R>UD>kj$DN;a6k-+I6Bpmuls z?u5;qb7b<1^S!0DrQ5Q%K%$A69o>hzeqZk z`JNkNHxWhp9g#F+y;a+ghzG?XaYSUrW4N`dq*bL5$+(19xMh)Susw$&+lo@45Z4Wp`d?V^ea3pkp-M#VA20Jwxv6X6u ztg70I@nYhW`3DmZ=1l|rglKkUG^JwAC>2~4DhwP!T_9Jb`}jho07-dzSSxlZ;_h^6 zBqHkD!3sSom4q(V9M?~FVwTBM$s2Zyo^b1RiEg-s8*bsQEYDGTFkV z*L``<{SiUMmwxKgmsb{CJoxy=%EvtrzS1ssqL$KNMGni-fVnc^m{oXI*hOxX0q|qr;1}IjXCVKnik$P zeo_Lu{2+~eGvFZE^`zuf4NwR@N4F=2Y}h6Sv2UXncY86tT@{8R+}jq!CdwR`=wgbA z&VnY7zI)5Va#!+gtyOwhdr1W z7(VPd;W_R3rN`_U41N7TjWsY_U<{leAcB$SiKguM8GR=YE}g+H;*Xn9XS$y;Li2B< zGD#(0+(l`swi2bdQbcyRmHK>L{OYTvOzdJ;IzHT0SXKX-wp$tkS?P6<^B{>2aNe zKU)*c(0xd~mYYdOU1`x(7Fb@eX*SuJNCu!*y-J%w6AStt7~K`qRJtRkQW8rQ=(>uV z=TjOTd74?@6-c?sE*{C^u1N_IfQ~)4JDr-j?hlbf*BeQ6f(lr`Af$vC(1TPTrHs>r ztI*P9emI=wT5N66c5P8~k!DhPPcPv-W4)1NI?ku@JWGV{(rn2ve+)0EdIXeA!jwdw z$0^tZn=MAwrJU$6F*`JbNAb&;!&F4ht*8mNyU#P?VTK_(>|u4Q*7~r6L6`d0-V5n8 z;*n*XSQe%s{%G1c@pi+lyBG9q&4=0+;d%X?xto?$R|l(J!5Gz;7i;$KtVng6slRI%92y)9`>V$h5uzA7d$zL( zGeU8CO|3~5tU=ytt&2f9o0l&BdOcgRM?KgZ+x+2x|=YE=ofh;_TsHoT1)GVRv>%5E8bat)hM>7jPEXs*$a(_UrDOPoqf#9nuG4!1a*^{< z(bEzmh*gntIpV>M;0twJeuEedlFzGSJBvl#nq1A4 zTy0S=1+!-tm5vNimV(AIT~^@rSWa0vl%bXH%HurRk;F;cjttJ&^xE_JhFGl7V6011 z({%%#L==?XOc%$Yy&8PnP0fIWI?MhvFqp1nS}UwAY_tv)-b%iec`x~1#!fOk;VIL6 zF9oA5u|grct~IPE(O_IEa6&4a%BL!+6@iBX56cgycw4e9(U$H-OL32-o4+)%Fx`{s z$?mrdOT(_eP43U^&kh$JknSOwlgFiJlFwvbD7=(>Df83hPcx?rQDovQW*--@CM{`e z#+)q&=1cQkeWoicE9EP)2W$tW{qh0jKzx64e`>f8*k`>furI|rto?YWwA01GHvw-m znG~=Ez6vSeibz^K7ST{PA3>tvjEGSs5&^dUt|LTn@Yv*@YE@1qG~U8nEs1Q#o6Tlm zG$hlFyw%I|R-jH4UqVQF1tA$vBpPMKE6YkY6<2^+hwo2-_i!Aag^wtL&mM_l(M5hq z$O*Iw%z}~x47`RIl88|rvcN|wAICSMB;xVcs$!-JjZGvnHthp(y#PGb<4>MI>$7p9 zHRG!Wi+u`yNWsr3FDtJD*86Ot2%mTGX-!OG30}IPEs{KrC6q!w_`>Z~p}01MtEpk) z)f1n6(z+*IAL(u_0Gvy;&uq5^?bt7WbCKXvD!_)`aQz_!ih%hEZVaY@AM40$8nmT#O>D&{6 zN|Ky>^w;CQXNHv zZnJXS`1W_JX*& zl`C|bI;Bq6oK$C~($d)8ZR?eKT?-@Ksim1EE!Fmw%F1M4`wq)q+g@p}Yp;KA;B%Hy zY1H+wd^{C#nnX!-iTS7$bw%@8AsZ;R3sU+06N_L?kW0@}T64xU3EZve|U04|;n~8JA5aOH#2| z66K_~Tu$2k>2zbs?k$z<@aAQ!Jy1#~72BL*N)}jqi=`}va3~6IqF5lW0VZ&li_FRe zt^qeRL?U6q4kYGNTm0BxNFKw^BbtI0f>-TQxvCsieyN;OIFdkSW92y0ib}|WZ+N0y zNCQ4Nf=ak_oOuydP&?CeBzEe6ZYuUXky;(dZ5;!CM*sE(YO^g-*q121NiB9##>V|; zEL~#RUD;EV&q`+oNFSe}9ZkFf4nT@Te@eU00%YN(4rj+cr_{0My*4i9abHVN$IjSEr*Il&ERHBk)6}7B2(NP7~SF zv=Ae+tpsW(qzIg|8Ija>?xfGp<$aY* zqqmZU!^QiF>?Ks@uVkw(IDD06a=@JfEDM}MDPU{C>p9Qgy=2~4f@66 znUdH9x+ZOzVUx41jnFwkd?*`>+x+vEEUHW4)}}<$ialqRFRD!RH7K6yU3YgiG)(+B z5lpQ<@z~m`WEML}Xh`zS*}hJei!Y(7?F zCURrBvk*Fqrv_>$%fJ*7YYv6IF6Q=T+>G3S9^$u?dx&0d389wK6w&kAz)9c>DQ?i0 z=nqRvmalpa1t;G_%H%nu0-_frLj>&WR-zH;%zZA)cv=enb*+DGy3@>9ttL0G@TxWE zRa4f4JE5j>b8xG>9K6)M!MZ`%s9djJ7u=A)jo&5gQg*7_gSX`m2nUq=(0$f>)z9aS zqth+FHphV`$>s9(^#Z1pxTVhqD5d z1|K&_d}^@M39U^RBaX^wZn)YyC0oE41D@pTw5wfh6s5YBSPYMwm=M=>R%XwLrV{Hs4V!JcoAa~*V zOxV=uu$!f|A{HAlBZ$YDi;)v?%*E9_iwmRhScN_ZZgf-~Lk`xV76YAu-T)i07i?w3 zU`Fu=zNAkfm!03*bDr4$B%Za-51f(C5Pz{$vz|n?HX6FWz`O0+b5h3A7?8QYH%=7w zqis20(kR|{PM)q>0n4+E5K#dZ2LNJ~{7U$Vtor{r>aTDaF9CmY)LY?(+yops>aK9I zkAQC;^#LeS@WaN5spm<kb)M~R zbHuh`i+}~eCipgZU1$ULM807Yc5`zQ3E46y7IV%CUhJA9AMrs|Ua#iUy(kR%OulDv z5{T_hkKaxSXnj6D50iBVC4$G#cj#uubpLT=sgZcR_fc(PN>&nieDb4>QlHeT6ZP!` zFx&m`4+^_BZQ51%!NWUlYPjd_k$W3%n%Ec*{Of^5FO(PUab}&nyUWja@BfuQ9@@Kf z?u%XPpKmFDYkk*?bC>Rgf$^n@h3GuBSh}ogN2VKHn_5Tk2*WVP@XxDO7MTF2K;KY1 znhc}+Ib?}>(r@A@ilG~)tbx)+EnVLU5XBgMh@8h2cb#8m`t*CpEQ<)$`uM~`=5^Y` z!_~z*-8ji-t;}-vD))M3J$oy&gMBY-i3l4s8$NBrHk%hZ*#(^q9Sz;S+w~`1?SJ8n!Ah=a?j`7aes} zy=(|ZhN)c)L<7S_O99s(k(6NQo46i^#SigC$S_eQ|r*k4f z^Y#r%)n<3v+^Q>cakRdD{-*x9?E2zGH|mGxamx{jh$99JoL!6%|W4SE=*0Q-;6}4qrZ)0)Xmv+qa zMtofkiyv92=7s|&sLF;yG)<|>#)$o#ogsP~jQxp#p|L^4`^NO8Lr+9*ioB<#V)J7^sQZ5Wvx#4&)~1DwGuxYMZ)h!SEINzV7Qa$_uW@tZ zCmKJ|ysz|V%THS8&1tIKGWUgxuDtk(&L3UEU-IsPt1cB6E$IIG;-4%zci9!ad-`6! z;`-(Ht~|49e*e7w~y%nK6%8 zl$bmSaogn2A+FH4oyHxLPa-e!LYzP>Fa zq3oRySD?-^lsyP>2aVTEK8D($)XyOnq0TlWLH;%Xn=4Q=iI+l~ zE9eTEzJkK5XuJllw$s|$q0L)AcoB`4!W}!HHUclBd6v^Wt7zO0>D{Os zTG)+_qOE8JwDU2DrOAJR*ac-*pv7=?1zcT<`r+!wAa+5#n!>9oyoSPSD0~!JxB=po zQ1&Rg63QNhH@*Rpzjo$%M7(&AzZ+@H(h(b>zX;4ACw3b!i?*R(8Zb8_j|s`R&VbFR z4qsuw7If=W9v(HK#|+qt?!wy**ugx2|46rLfiLLmk%pP>1zC)M333b(ouxNAE)&*85P0^*+>Ly$^L*??WBd z`;frGjP~1T+v+K7pONk)u%(^C#K)G?vY5gifZdi=6!y-@@1y;o!~PlR3N5R*ElBUB z*BPFXCprU8(EPVixSqmyQMiG^_Yjz$(SCl$z3em6?X_ol6ltg#dZY;s4J}6-(0Vxc zpe^WTIJTo*Xo#lFhhN(OCh;|pzLDlAz?FGuGXxD?0ckft`R(Wy`fEL$*F)}GAzlYL zm&5g&XsU)TgY!mU!gwhe89v@PiR|D*POIA{BR*bdV2 z8_*7TCUWm~w30r>Ek=zR;OqkQRU1GVsC^^44z6y2>!gL-VaAxQU$1?-?mn~(N-X~~ ztzSL`bv(Dy}pe}nNZuBSC_r*DP)9-=*Q6I|U6fxJ}> zT}#VuH{Qzvz^F@MMCfI=&A2i|dubiq zOE@e`FlGtH90Hgy7;^{%gb-Fkh(c^a=>4kRYpKC@lASYW-RG;iuimX&x9+`lU%gT{ z?%`uCL;2a`O4p2c8RqNevuNeKT_{`m{ci3lAJ@{(?{;&0ND`LGvZUFwc-4Pu=3U&H zKJHN)JgDc9*D^BJXX$1ClTFB^&9&z`+B`lt1JIn4%aCemD7 ze7w}kVDhE8wxXqn&%BGTw$GlaWa;KdtZLz&?UGArRub*TRW~p7TwBjbs^lKR!e8IV}-t}?epcO8fQN)W1(fayQA4LyTRgc zf>Hm{^pdaWr`Fn*Il7!(ZLa4yKiE0b)tNJvbh-7N%|5-`Y0MR>RWucW6{61sOA;ib?}RBM^~$RnM-f8>wB!WW!AL5sBQLT9qv|ib#>`m zZO-lv4A5+EMK2o|mVpbyPuJ^HgLm0GeEO-j=k%7&7S?N2mOaJ&nJRJiRyJpc#p!Zj zb}(Do@aR4w>t(LNR2xQdSvr|B95#&F+SOz4=xR(^t-7bBr z#lwsX9;>CJ`>`1z19$PY*o>&NBkH@@N))mYY3;cFEziQK`>DLzD&pW-Kq|Ec(2 zz|Ry16noNSF>c$)^{=^X%Ohi19+Af7DGQY^D!-weulyRyuY$W7tAnjO=}BM}_6h%l ztsKh+uYliyRb=Nfqnr+3g;lL8XLy7M4;cH|CuOgAMFGEkMtiwZ=qX2 z|A1}<{a@%E(7&f2gZ@MT4HUTw?9miYDh#0KE4~4`MiB-bQA7w;h>Bs*e^fjG{THPZ z`xciH`!A(i=>zRo`auVj-vzxv`907Z*-lpZedYH-Z&FPog6aj;45CoYRLulks(Kl8 zxw?V~>etj5OI@R`1zo3p3-n_3V$e&}OF=iOU7+1+H)xN#2een+OQ?F4`kSCvtG@+$ zjb;ZCG(Xh*kSH`eH9rMCsC|V{?L6%kqR{?8JA~cTziEd-|1krSGnQoZ5JiSphh3^J zQN*<*;1 zJvKX^D6%JHH^7rh*`Jhrky}`@tz=c%o|xA{%&1-qTWJ?-F(YlG)(E;;y9{NUwi~5K z>qF_+25~o{jiQWcV`zzM^-&L)P4)}8tu11uZOLemF~(mp|HmDpr`5Z4y`NE zmGJrA0{uJP@AzDfqI@^&UCihh=EY|51(bQ&d6>)i?D3%U*}UZWWRgw7L85AQG`A4_ zGM}S^%vtWRtRQt(ON)aTJDOc~tn5r8ELvEhC*!bclCXi2=wu4-H{3RauN3xlh+cgK<^R#+T%V&$csmo8rV*<*)@yj;!8^}O7~ z%iX*@#mlRmD>_$@d%S$eNwDvpVfx+!YwsgkAeKptJ$u&3Hhr7 z87)W>WG&f9wvZiU4;df_$x(8WoFkXWHFBE_lLvxQ$Px;KsY01hA=C)kO+wy0U3)6Ky573aNj) zTCVR(^@@|6OWU!t<3PvhjvE~hI&(XxcFy6gW9&utS@s&c+3vEhwr{cTvmdozu;1eUbV*`&nN+VFE7cBzR67qyeD3LTUB)9$aNCKHbAVgPOisXilzXmT zXcL0MF-quc>ZLKdnSZv^UGxAxr|FPFsmMiHuGpa1tT?8)q|Bp3$`YkPS))9qnyac- zxm01*1=VGBk$NGr^>+11^;LXsYNl(tHM_MFwKKHk+IH<)?J?~o?cEH0hCgEzqh zDECA!b`Ho+0ofT~Av=M^U3Lb@P5{~YA3ObHXMgPEkDdFCk!H!qd|Do}0zE6_o-_Gr zA3N(~Cw=UkkDcJJ;?w+y%We!F%Km_!(%6S z{QM5IioTGXNy~s5;Ejh7S`WDz^vguQOyOfvBYg7k9e6&63J>3*1+bS2v9J{_?;{qr zA`bcx2Yp1rT5;8et2X3G#Dg#`xkq>*xreHNjN~Mm`S2HX43L*}QrMLiC7t98;Hn1K zcwu^SrtsxtgYaVVDPbn)Paf{WCek@dykF$_^8}llVIOTu$cjKG{chEFA6ML^=a{JkmGp^B4P_9eF!~1 zgdR@l;S@@M7lD}o_fxV7vg#r0OMDjDz*y+`1dsocF_CPRx5heFoQ4 zf#+~t4814HF?k;vFfA!GFhB#tzuQxJ$rt~swL+F!=yga6_tXuVeY!t!9ACV^@a}Y8IA#)HuYKPoG$QXo-eVE%IWbA{E zgOKx0$axpm9fTYf34@R`2z>{M4pN37`uN<`T+r}s1LiR!DJ161uMT2w*LlDgX>zLE*U}g_yv6n_ZpMe z>C)t8Y65LVy#jRycsl`mvY(8lv%xVZ*-z)<&TCxST}ZnNY1bibKcxMdzK-@c(4!uF zOOgkv5!V*n?}RovkPu0e&@cCFOzZVM^y=fiI&rTHSc#q!v9cy0rYEG&4${5|X_y(A z32ANA0Pae(e*^UrTsMMl!YD@2rerH^0c`=@hI%<*Mc;O4)Ct;++5>nox(}I9#iiDg z3G^-0Ce+P@Mf@wEUQ1plI@z9VwD&QOk1&sah5onss7oQm1RF9tb|MdGp=TVkzK*^- z!O3RJ?9-pJ4{Vc?Rh#@3EV&aL*D>}4?iUj{n^9XKSMp0g5m9_u(zDV?VT>4GD7q$peT6j8L2W4y{A|Ix^ZDXkU`-gkIONLdPTttWL1cuE9>b zhU|tdWtZCtt&-9AGco% z=vHp+K12YE@iuBhdpod#+p`bx)<>N@8v4?rp`T2_>gvbp>PJrPM^5d>=&%N2k;maf zA2fIo5yAXBfv>VUJe}U+aX10Ki9m}9^likO@!_wbO(r#iZU$O_W#Df`Z2?ak>g9kH zw2jAS4YbRIW;1CwXb0c~ynqkuAwynMH6wng;TCO$H6s|EN$n#VIa)U(!up|G4cE=e zV;}nsZZj)9F3?WG{<1U3`}Sgo#HiWHT^OMq9*;myKStUMOYcpK{xCNu$Y(LxFGti$?#0wBUQZhMI$@kA#NT7k9> zzGe;}?_E#peI0KeavnnOK0clW8nnsL&E!+$i3u#uvA1UPXe5mHI&WQp=x4EP2c61n z8hPbP98AgzJSA`kV_t`Mjkq!c>~0$}j1}5-CO?2?cfs{5aD9Z`|BqpdMr7Zmd`|Dn zxgwRr*$Vns^kA!KAI}*S+;{nU%EAcm^3`URGj$uDR!mc=AG09q_a5WM4F3hWEHxjA z``0ojpN}+iKI_yfZsxPTo;K@W@sYC$+i^a@^0aItGv}Vb{fB6z?Q#z2_rREu z_5U=k3IUdrMtvHQqkws4=ZI(QvUk*S)JYl94qL8F{({TRl4bO#*^lLgcjZ{nF}VpN4?zBh7`>Ltwcea!QHIpg&6=Q<@X@RJFT6m;3BMP9PsR&> z6#hi=g-?V}$Wy|fg+G&tcs~}%(^N%OWD?cTY@(-Q=os=W&7#K&R8`WI8RSFOe_f&H5GcBCVhX@>N=i)m~1k=>qaK`X;R>6|{jaCI;FF>sHZL z+DhJ_cw&=<)Jm=7P1;VoNj>#YFIh@g(N)AqSJTzRM1+j;j2QddFu6=h32FBLK_aZk zM;!xJgDxawr5W@(evhMS5v>ceRX!pdDKnvP$7(|X5x&HBKaYboX^ zw&ie?S?VO%^c;o9NRHBhOlh`N9uY2G6vG@FVB0#9>;7}39UmMCoP2>Df^vaHU@TaUpHAV zz&8xC|4^?&y=ue{QcR4q?n2*Pl0GTlj`%p`+mtU;GE=@!$u5E{z+#53=Fjlu<1zTR zeE<3V3pgJ4{XEbdjAs5CiJd|jso0su@wxoA865S9pL#i-I9hLV)XPZ4Sfy(OTu zkcv%)U6y=~k$45YJ?(lg{J}87Z)@Oq{C+CFQz)0>`%`(Q5!VcdK{FfxeSqs&%rSsi z1}q)6%?u-R8_iGBb&9`?0r6UADd*t#887m-0(W@4tC%Yhkd|+Zq_K1``}5 zEVuD>Rmf2!4WNu)N5STE`5j_4fF>OQBrG zu3sr9r0UC<=VePSpD(LF6k-?h_-}GNo@XA<8>w|a5B3LE7OgC1 zuvV@t;Yh8^$DS1<^TwL&9s-6zBj0!5w-m1=pS~VlE6|bQ@wFq{Y9-=yW!Y#EsXf8t z&rW&%*fr_+-@*z1E4Y^b{X0WdswyQps#&U+$r%1u>L=B8>NiP&x*cRKt2ApJLb2T~>}CKIZ7R#8IKikXTsGFA~)43lxHsj6vYwW?fomV8I`f$9U{ z8P%`UFAG!DbJVX2-&QxNmkZxj+tfDU2kI5-4q>a>p>_(}bQ!t~VY}`px&h(8>IQZH zL-ycPd+0L@^#l3(77?1-rMh_zA$8% zKAe^yEFT=9zd)w3?;(>qvY51x4&osqSwl9Gtz;MJCkM$fa++Kux5-2HopSSPbI`ob z95Zixdq1J(Ip&I`rN;Z9O3kyE7MrkHHy4{rjCSJOwF_M1f0DkJ=B>Na^yLF1hNuqajW?{pCUZ4N;lR`-$&{=J4L__q?C zL|o+yG5-HTJ_H{SBLm{X2tPv$V#z~YA-7cn3xEayJAGpdUa5(daaBN zz-AeY-U{rH=@fR$*asjsj0b@uz;XHhkxyaTQV;(GTicg}v@EG>y@}7zl6v+{9oYXaA#|Aj5%0Z!f-jWZ7i#Vc4fjPB zeDPJ1t$KOHBV*x_H^_MPoAAq1+%FT=jp{~H2*2zhlXQFGog#SW0eM#U5I!pY|2UFB z<`Nh8^>n-&lP0{$HQfa82G@i)wZ+IKO?X>-8*gjN97Nk#-MHYb4JaEL8{WFTY%}{? zKK%pz12nxykqcC_Rft{nLiIwTK5W-CuNnA)0?zA0c<>N%o!a zEa4Dx0dd0jPQ=Z!%N*1)7T1U$C*sG6cyS_LoQM}E;-wWa>O^cf5i_k75}c>xcE)#Z z1VW&Y(6_=85a-k~5$zXIPabXmJXodz)Bg^>QUEiy%;ncyFODm+ZcG>Csb$E^4JRJy zEAiciPn76yklXJ5zoTg^mpy`%T<6DxMjsFwqa$->b{!r6A#|L@!LM7VeJ=QYjDwnf zcSJwR%P9Bw?uiE-{k{j{5yyT%6^}34;@66&9Ebcl;yK4r|2XlY z;{?VP9jE;T;uXhvzh1oIxa6NA-gaE|PZRGtZu)14AImL6{#h7h*gpp?r%|3lS%F@s z{naS%`xl50oy6Y|RXWxFrf4SQS3~}3e~Wm-ndP^NTb;RndvvTb-|vd%ISc*%=tO6c zUlbdplG&~Eg0q-e%vs`J1^zPsTCv4h?%#mY;Xf`Od8G9EPmPogR-;t(WA~v|5nVgj?Yw@(Xqh9sKGH5m>jKf4g@k`jWW#9 z4^GBY?B4+kNOZk_H)yG)(Z5d=<9XtUMW*3J*###=Yr06PPaU zc3udS!e5sIvqjgUy1?A%L@93Nd9|Uh-+6#*csMZDg!VvQbguJSzz|*N3OhY zd%2CuwT4kUK}`NYH%G4r~(bG6S+!G{*9Sy})%YaN5K(Sah|-$ud}U9m^H=0y&$3j&5{a^skNfxvuc_#eLzr z!DyD*APqSry3KW)+y5@Jzw6_``RGp9!@#BJ9==9eq;=<3rqP+B_GkI9^8(8}(SG;X zz*TY3ofo)?OfnkD``r@*L(xM$T6VW5hu!TN$LRu2>p49oy;nFE&2tz7_mOE&2MM(8 z3myP{G%!-z}rv`JQr`^-v&WoORmj?6EGCf!rJuly# z9W08@cFzqKM=!Yz!IJ1z^WtEcXm!^F%cD2JIgj_M1n0tFU3AF2ka^a%Ez!BM<{N|CVs@kh_q_V)MLHeP8YzmFdh#R1F$dEsvC}&}Qj*x?Esc~V`n|Iw<%#{?xsiE^LtaCq zGI7*f6RAs_@GgwhCr*18qy4vglAh7t)`&TA)!QCv!;?kYMeygfw>w}+-1JW7 zYriPz1ZPJb$)+b>y5Eh>|Gt{NDO(` zMI6v-W5k;nW-?hkFqz&y->v9r@3u%daUU@}l2N5+lXoYNCFwaOJ&}2i^6p`A4*uOE zF`t%C(qrD+Kbis3GqZO;%f{YAJR9>Y?LEq9Inz3Lrk$3y>eI5c_e3PoOT4EeYkJk` zdCz-3vc5OVdnvN1H`ncnY>AdK-}UA*-}M$^2f|jz4*&7qBDQklAIs03GQK(z(CT9P zYI0u+K7ePhhG@)-Qj3yBSE=02OXsdoPIRvOW@sGR`8skBg$km>?%|L=7M9EVp((M1 zhlHlZ)_ByR8CV72=X)yn*OL{R6*(rP5O#a>e$#*Mf@4twfDGh)X)jiC)F>qDDkCq3rS*4UYma!2ffr!BNQcG=Sr+84Wq zaxiv{t*_WEk0W$2c1JF~p(C+-G93;bkL62V!@N#m+}zN)*aJ@@bTLjnYeH8{Ydz~j zH%twlO`+SMw}kFu_gKiHmzOzdwAQmd^s&i>@*yk3O6G-dW_+Bqi}vgakBt||cHSG# zi|frB!xQ6EJOkm$@o5-+4lH>fJT*SUeIh&^v@D00hr^}uS)OCz+3`7`=f*2MC&Pw# zwdYK@CceOPA-pi&;JF-L9B=Ym3mfAto?GG8xYctf+#a`k?uEPKF7}LwdiXP9Ur$9C zy9hitsd%oZ+UJcAvYmN+1ABLfALR6ro&{_#)YHIs=|Nw@zO|>xpA$dM_C;~Ndyk*% zX#sta(b0`PR?t__Hz$6BNAK+(JDxjt(<9ks53dtlJ+AOZQFJTAeTeGq@}2=}q{q+J z2zxg{-oRTx{Gr?~hPO%Wc&eg3p=5L-lfNlkN#7gvtYZ16XD!b^*c(9S4gML?eopUZ zbYd*qAtdtTXWZs+eXRlI#7Yfnt(^i)ny@7WPPByR569X=}V>)FTYK}NH; zq(o`YLI148?4Be1O@Z&>*-pd0fW>oSE~66$M#s-_x<-m~=jHGT(dFC{J}q8>O&GnM z(LEI`&-5H;d4}yq>|5DxB(adwyE(nM=T!JS+nIzfVP}XPZ^FnTJki>7E__wo-E%Q~ z6FZh_PG4a(<4+hFKX@wG`&!S9@DSdNkgpQ$Eb{H_o$*5aAfprA>3NJl>vv1f`q5p@ zqBV?8@OP_(r{{KfSlkEw@54uU2kgAe-nQZod+v_zVc1(?BFNsq>npL2(;FGR$jl?5&zl*^jb`=~MDk((Eqsr` zp90>ok;3Sq-ebLIdQbX_Jz2e*SSj9h?uu+j?g~bB#p>PbB738Ay;maxy~UmfVNcxO zL&L$i=)D;^&|BgiiX84Ob1aM;>n-;VM^5(6TT~u76W<~4@E1oe^j0#<_tr6embkq4 zBbR&Yr8ivp-Bx<5ee{jBBK4N)Bav&5zN^YlaK3-=sUx>~8+}=kJJBIuZscCCS<0)< zlaU8_%iwZ6xgw1{@a2oz-Zs8wZ%8YVjoaHHzfEIrj20frOp{)RoNq@o>Gh^(NdBgL zg}o#9hNYawGDdGgdcT(P5?jj&4|{g>u8~TqMH@nU>Bg(5rW^uTGrS+2*SkXLJnt8pT=h0-sr&(>uWaH39zXFOv4_FUo)YrPR*T zE+#7ei?50N7hhlGzxXQBdbC0EWo<~$s)3i{1bVL?8IjY*+ce`M)EUqfSAZJ z@&RckSIBj;lKh6;COzaHNs^F2g<|qeVU4hs>=QN#ACUhpd?Z{We^9n7JISAwJCr{n zN##N1&jp3@r1Gqgp}eX5o$!S6o=PEnK~DP&Z&ZDmqCI8Nln%2@W0i7>L*X~?+lHHy^Bb``j_fok_nj8 z1#+3sESLQC9RfSbWRmD{$Rb^G>Rr9JU(OOqkU)5M;u4=35 zsB%12AstZ+@tFBeu zs=Qitr|MqSgUXxLwDLsS=d}DeFMlqLe6C8LYHj6Ebx!4Q^*CTwbwRbhdP?=Q>KWB@ zsw=9itL@bbsv9aVRX2gNrP|7VNt0&2rjop^S*mFwCXG>J#Cj3P7OW&@<;g@vh#?0UC!+w+lXAmYL!M!x zVX|SWVY;EzFxxQKU@+7e78({CjA(B)v>Un&9^4HYVusb=TL*fhq0g|*u+y-|&~Mmp zIAl0#IAJ(#IB&RQxN5j*7%~hS?$0Ol)$_CF=g!ZcUpT*Le)0Uu`SZ|LZ0MU`GQVto zIr}}BcBS_JlK1uTQB~L4`+UtuNMZ~_3^at8#xc@dOws_8fzn)VGBcS8G?|(3ric+K zB4SD-QdEjG@=}V5lv2bQZ7bB%B2`6a=DZrQlwm(ChuC$ zIcIWa0HL;T|GDhndiI*N*Is+=?|t?RIbX&9`b&yyttTjyh~H2cDNaxrMYI0*Vzf9- z!DFwsSBp}6t-V%w?bGek#TX&cEW%$a5yORDi0U9wwU8oiiYF0G5mMP4q6Ve7x;&Cv z9gMg@%vVQ-R8NZJfM=Q#aaT`^6vWbIMv7x;rXJ^Ip3}{=*%42SXZhU7xa#?l^0=67 zGtbl%34%<1Nu)ZKW|HZPsmH|jO`dHoqtD9>pSWD}GZUxZESdgT{kmB)+lYNIWmZ4T zbkl#9tu%b)n5miSY9(uaE3t1}PmWut54e3+8trYCvCN3MkF1}$JtrA?*jLWeYQ&~* zrX90w+ait}O*nR3b#9hdwdV@GzcysA-dWr3Q6EX6epA*|T zu`NC>?n?Mf^}cRgZiy{+!lU$dx>5YGep%~rt?_2gwX>0x)fXbo;LX@vm(4kNInokK z>y5PXSgBDXZPxX=CMmL|CM~iZZD#sKW!GdxcGYA>+O6ZSCO6VqlONe%Ga}LzTOW+| zpr$MUkU($0atia;y1sCEzQ|eRt%_WTjdSv^CLFoUgm#-4Jy25@=>;E+9tuy69_8^G zo*L~A&xoE5H$=~c=R_~^XRPy-KRlk+L~{?iR$nIe&Er&-u}+5<_LmV$UmU#>ex_Dj z)fd+ro6QMx`$p?kV!F{r;T5&E@ao!R({FCu@Y>pRYg@&9sJ_lR#O+xhRheS@nmJC) z^y$&0npx2_P-8TsW?nSQx}Vl8h~~!ax0ZdjW>GXhaeu2>8XbYYFv+yDJX(TyRn%Lv zCR$drF6u)$*P)sX(JCgaWu|OXG#s15#$H;pHCk7*BU*1=(`sIiPDkDLL}y)hU*@s5 zH`>Vcn|n#(I()r2aeP%L#HO6r{pM?or|a!SiF*>|4UaX(>$UVO z`ziD+a~b26=NlL5G+kYf ztM=QQ_18#`?Ujl9>h;baiT!EJtyp=yrcrx;WzSdkUUjzR^48a8hO?u4!gS@tosZLJTOvUl2Mw;H==knCbq<-mhqi z=)*nAeYi)t-?rQKOKBBuP?~XrvK}`m2XTY)K5kG>IKQ6clE>p-So9{)GA$%{QH+m_QO5UGlv5IQ zqQ1Yrg%?GxSyQU#42owE$Mt0i*O_a*o@%__s5RA@>bst5+(BU>X+7>;4v?=C=3<*C}dOJ-xkB9R4G;5j=#3Gu)nTF z8A@?Qdqro({)(=OBZZ!d;}xe0R~D|UI9qX{;xeW57J7WDFR7@^msZiscNrD!{kIuK zWkueiI$v2uXKAa?SJBBg8x@^J^|;;8?=~_DFZkvaUgrA^vexcfT5*J}lC2T_;qKjJ z2cfjJw6&}=+sNSE)w#dq5-zKu0OZ*Yg5%wMa_x6X<)`|;7B~*i1 zo%Tlr5=VdA?BOgcbol8X*@m+lLQgNinTXDfxRdInW z5pjDl^^$K%R8JyU=NpW{@^v5l=_o&~u*oc&iSLGdS-yFwZ812LNTTN^ z&31nWe7lOSCHHsu_xTUT`EMakW1szp{m1+#{bx)Mt#mCp%lzm4m#p5$YC&@UdG2MM z*bi0j^P=-=!gPNh;G`nUOa23G`E`*#P|2G<8S z1~&({1$PE_2RnlMf(L_#gU5m=&7R~E{F%WsOu_TPOFo~TgVTaNAz2?kMvEFPr}sFG ztyrJx<0>|mXl#WXp;R6nAy;UKZ(ZT#P!3!0?+a8T2e(gJ#gR&{ucWf9(pOnkR8|@G zc`NHG>nTk4=T*+4(CD97SyDN#qO)=Vl{k&YS5;|i<)X@^mCGwvRjwiVy2=ej^_80{ zw^r_`e4WCc%Dt5beA6orRUWPEt~~9}BTMHhFP3hvyyDBCWyuyy4yFf_eY1j@!R%mO zFt74Zkou%@M@4V2FgPkWHaI>QsGJv^SU#Ckg3;jQ;MCxZU_)VVa8B^?;KIUFwD$05 z>!jZ6@gEGx0Y@P9?%g~C1Fpc3Ku*9NCG9?j@c8K zWX__%l)$vW%)o54EA>gm*}&Yu{6JG+NnjahWuQ6G;!melBpf63jsHxbHP9B=64;(N zQfbwwW77M_e~c-xE6~nkC(s$#&#}q#S`g?890?o`oC=%`TwwnLmjk`1huN>RK31xg zNjxhn)BGnZ+6yl;p*LyVRc2IXRpwUa2byqCyudf2a>UdeUTs6}P(i3Tl)c3Bu|47qhyNbD8(Z$d1j34 zF^Kq4GLb{)@i~>qWl0-iNi+3&be_{=X*m|2^SOx%65>>YXDT+xxEB=_+7?W{hQBIJ}B$|Ewc1W!M4SllCFLTc1#LvA%9mI2q z+KD=^)4zYm_abv&?9xm7e(Zx|yiO6I(N4W22R*Euri!MB9mWdHUA}a~$sXVE)FfFC2Fnd5?JF z=i_mMNH%&0#itDZb)r4`SRB2V=m60nqNDm}tn-|Ih-DADnK^mf6I-XPWti!syNOO; z-PYF~n>QM33G3B0*CqDl9MMIKoZ5EumH4(w^x-O7oOaeA^Rqcl%+D8yE*sQKWvHIG z{d9DaMc2AFv5#q(e)Oa)8pG~^em!AqIpCMh!znoC0b6jif9edI-(5; zdq=@_;%oHPb;sw;u5pfQkEg$OPx@Ft66dfr9%A%&Li{(awdPu4iLaVJ*W3SZ6yKme zpV;4z+cR&bUkl>PH`k`RjQDYH#vVcAZWGZ~;%!99M!7wfa%7{7T=?p7`^z zIseSFvEh#=(}R7&lkMrB_bkuT=btsdXSl_`MB8N7Q)rQy^U=CKnQM`|-v`gA{&dgS z{`K86-qLP{&z?ZSI5FDM(~!`|j{dobd=rVHo*DeRC;YX0@xSL;Q(D1)4P7KlsiI5> z_iCcGLgcmR{^Y!ls?8n2s>ugsn9&U9zH^W4MTh3--AvF`B{ z0`7_QIZ9!odoszUBFu0%xaYVZcP}JN~pc=ytDVwz0THG6RW z;C%OHvNzcs_|#nYHVQl4yDece|JL*BU;5$=4=Ud6FbMB($iO=s2IK7wS$J>5Q2fR> z2fy+CC%mhn2yba9!TT9T;{6Px@MZ=N-po*ncQSnbA6}j$rAzv+W_OCu2ysW95Vv*c zbVohWbfQ`Pvg^?ujYRWqLT>>PjlVmV>Ywu*3F*skY{Q_>GR4*r&2wpTR*xPsyz^)6E=&b-8sh zNePGebkm+`i!GUU3=1U5@S6F|lKJLPUQKOblh?^Vr)B*Y@|z-CeoH#e_jwdT^z>QcZr)(m_k{Ic-pytH4#jpAD_EjKj_k zJMWt7nmg>$uuH7RpJREgf$}3)v8#B{B3HFFaNb0H*0YAh^c*=yw)&Xk$Z?pw?w#(R zYcAI(hy2pZzn(w+^)kw5zj}uCxPq?Wphct+WIa8&#*u8^pm`LJLqGC+mjvEkBsnKL z?-jE1KIc?nb53_o7Y^qP=YzuOe8~Bb7~uSh^D83RImh{^NO8_{J|=Ft=`k!xo21L= z?|F1?5$V%!p0a6G&8Af~JO3KgsMEj(if0*dqmZ)s-BfjALi*H!4i2|o8G3HuY@N?e z&rToOJ@jIFPx{#OOp?qUI5++9Ku3Bs{V-8<=+U7^IbXVsw9ZkW&$-#_F#H}nd5 z*<<>2Eq~Ys7xb?890sNh1^T>b26>b@(c0{ z!YRKfzbKNNUvz$vMnJu@o<_izoL{05Fv~exq&gpQJ|YI?I{{*TFI{FY&?vGU>Ft71NWaUcnwMXy-Q;CH3O^dwr1zDpxo zru7KrqqJ<4#_v0IV5AF-bQL4rhLLW^NOxkSCt;)yppiaLq`(r_L7)yA>Tn0j=JyS; z=X%+nhL4ZKYe_W5WU`oIcy86xy_Q74kbM%*ZdBK6`z?vpMtg5U*?EvHGW_0ck?l9y z+p4$I@Vn8F@n8M=TgD8Jmdxwczy?bKmLyn`VM&1{2W;>ge6_26Kq&)YKlNk!aJATB z=|f$%Q?y#fo-Uhhw1!o-(r67+_V;Rwo2kv;(puMQ3rTDj`*14Y_a%$eY$1|&fhHs$ zPI0AXr0il!-j|xeF@4HP-kh32X}k3F)ZEnElr5=Ql)8oDT-G72eBg-G5iI49e3(PL zMbn;AH#^tqh)Ww0|7{1nofOP^cGZW~G3s2v!$r|jYx@0{kG`$=n{*yJG;_mIqtb121)AoFL)jwk0Z!P+It-ET2wk8+PSEye5< z57?dTNj{bACO#**0K`ZEHGIH1^RL)HWIF#J!YZZDLpT5Bb*WhLh<5ti94F0}Mqo8t z6erD=@~|d0#7SM!5Ya@RC&fvVq%{0L%d$ABkZdAKpNCtdvbcnEwksy<@4Xw(@N{{- z`~%YXS9t@i@~_CR(8+p}yoqvdk+)FW?2vZ|JGIR(ghSp#E##DcBOjpk=b-$yNRi)> z-x0UShvmZ}O+F$Y5x2_6<>O@YgnWY5oSg%9(wg&gI+YKiQ~4V-Hu!A+ZQygj7q8;K zZQ)m1_*EAEd4s3AOHpYuo&5@oy59*|l@#W`-WVq)@+5vH+!iOxlK5P(E>6b1E7AUKl_g8**ukwbRpQ@!Ot;GTU38W`Lzi6? zS1fymE;}nOSoREEc2bmgmczaJ+aav z{|@+R7QWunTi>?u&t1hoZ_#<)lJ|Lw&F3v;>HNcSBS7c5zPb2?C_j_xHO}wXrrPPx zvy58_lY~Ym$E27vZtb!y7Q$XECfHU|Xa<(srr4S&1c{$yYaxzht+qDe+iY8i+DOu7 z+fFIF5XzCSg~E0ttTckvqG@j>*=jN@aq4zxaM~8KwcXYZ3r)68;`ZBkwK30QH@iA_ zOBtvk|29@=R733iDR_u4*On2-vXxph z@y%KbQ8P)JwN^@LLnubRWfWSC(1g%VmijGv46P>E(k>clRBVukXdF>FQIPbq`{|bb$U8yJ zppd1igbUO(mH#CvM<{ebwn)uabJbksh+3j9RYwplS68XVKc!RGBweo&GK`SLsC2@j zX)l9pWsr>$BG&P;1=3>MDt+>)Ygk6HPhF?_{%&W_Pt^7b?RzP${iG};%8MtK%jbv> z7&MV6Y7q02iKgm&N?Sjr)1EtS{Mva*WbDk3kJ>nYShW~1G41BH5dhmtIB zRg#r-B@msX@c(v9ledc$-U!12!F-S!q0OOdXv}W&OT3UjTY)!>gyeSjHiJ0 zoGPtgUR<%!bCT4qxfl((2a-0%UOxSt(j~oJoL4(am<>Axy^Uuss*8|({>-=ZgMbJz}-BKRMTPkzFsvITHDOM3a)b~RG#cp0QK{VetK8~JP7$f@HhoX7s2bNj#H5A1L8y|9S7zDcK}-%d3Zvf))e`kLhnP$Etk@<~P|8N3^OfKf$#^-~SiR+y(5YBkoG0mQqUr6s^a zz&Wtfg47(?sRF+jcp5rr4ceuJd7?4SZ2GAR=d!*nz^S^OzApBYQMw4e4ty)HfKidb z&p~Pna2F&ykQ#ub3Ahos3i64-M&N1SVj#*=(|}9i?GdAGvoTgz0Qq;OSL{u|I*c5a z2%Xo?L&BP;FqSapX{0r>|Jvi+BRnI-Q9IAUZNQ_*yA600dABjjZVkP|Hf6Uh3go+n zQyNAN%W0+vAb5=SdTlyJIC!>6@+j~kQUy|-;Ln5S)CI`30I3TgUjY3D@T8nmX$D16 zE_mHCaM$`l5Zd0gv|bcLdvjr?|za z^|pYY!ZQvtw;gl8UFRXM*H;y+51GB|F^jP#Fi&~MVSVsG!nuxvKMuYC`sgV_ooD?5 zqqSEc7q1fM(VKl5&!bfJ&)oZ1qf&Y862DZt2|t4TJXW)T>Ls)QOFrUU;-KwLMvd>u z-q(2b%~l`a`G}Uu2fBblM{X=i$g_H_&B z<2x?F5~a~rfbqW;eF~m?P-)~gapZ72*j6xVK3-SVwXCTmGpZgQ8%nZ1!ntR)Wh|%p z#e65Xo8vUgZ7X;zsofYeLT&;6fKfUG{s7NS=>*}c^n@zO2WZbC%itdYmI8ONoSr+0 zmu3Qw%dhdOt1v#s5@k6wPsl&!Tr4MR|IU`dmvZS!hP<6u49=_c(3&U7m!;J_A0-+s z^f>kt;ya|@ga0%0vL7Y#Xt^kVg-rrt`OH^wezoCG%Rn<|F+a^$Fth)d|Fxs$9zVwTZ+xL+4rM zwFMgaX`iT(j`n4Z+E!bmO(LE7tfRaj{~O^zB|>8MDanwxD>UXrEr^kR~b$CO@-V4Q_6CZzozi`d`0;_m!-T!SfkK0 zt9qJqXB&t} zPpR9{KJ=8V=4OUBkU^ zufZ5-M&1vUC1_zDC%MWagjKwId%6rOBdH(k8=Q+!}gZv2g-xJs= zYQevX)KW<5u`hQ(Q(zas?SL$xBUmoZLT5Sj9|XS{ycg$Z8-6vH|=L7_}cVDlY>^^17;Q=%ukOEz;v`Kv6E zI@CHKjR852*DE;>y)4xGfs`t5!8-PDko<*FdRNb-m9dV--z@d1XBn|)ePnOobr|(( z#|bTu&y%!|QXTu!nD5(Ch@AE$KotqUhu-0t?`lq=d$ zi#^6UpZUYU{XmSI-n~XH-GctDA&(aQw-nhxm!Z>%XCIbmu&@FAt-uVFG8FPxp?_MV zG1FVhNWE`kXe4pR`HQ2-nL0g43uLb`ia53<=z@Gx&h0b{JXTZM={50?( zoQIuAZH8nScsyI#V8`}2Bu9bxHkRiC;R)dD&{2UILh8XYQQrq>&%wZ3a3&XmcA~yZ zNc|9_@sc5TK|=B#oa^WWj_*lnoHFVXej=F2CpUSTx{~JgTXxznv`LKW3E-oQavP&E zl+mu^bC3X40i9At8&E4iY8m9a!9NW7tI!9pz5~fiNc{+sF|gnQ-wgg6NPQC$8IrqT z(+>IjkSv8iGhhw8_F2eBB9~s5jgVh}{PU1h!@^YXcOzAWWC|qPz&{IIhZ66E{CkjG zfqoLO9P%$i{sHhwNT!2t2Yv|r6A&$|2EaGMAGC%Inzpx*s@Hlm>=!{k0rGDG=L69T z%6s7ZfPa8w8DkRq%Nb>Kpm*$9(3u0tNl0FVscqg=i85s+6vz8aF- zA*lj(Anyaf#X#t5zXrBI0v#26UpJ4pzCAqN1bkC!VR;(gQOI@l+{s8YUH0<4*52Y9 z5^WNrdII<;quj=*3}v+I_#7laRY0ed(FUZk-GEWufbrabvE6{t&RBrFWyrM~{KLrg zDy)H5-_b2Y|0U>r1j!hb;sW0c{u@Yr6A~GcyI|Q4`TLM8h0ilk3V7|akdH(zy}lbE zzX18?A*qIiso?KMstU;zNVb807Pt;2-U<2lAi-UemIN$^{L7Gk0DKaX>EPRe9|Hdb zL@%fT@Qv^XZDNC_?QNv$wcZT-MUYQ`{F}h}K=hRI9{4`sAN0QCR#kvBa~rUpG+?!9 zz{m41s$pR&_`8v+LNW!CZQ!2;u0x4;LjFBS zu0THtSPuD@A^!mQBqYtHfKMSW+E(pCeV<0Tdg&t|uYi0t zB)3CS1?)iH2Y`!#(ARzqY=Hzis?OJf@5cRM7!>vzQkY)Ac1NT#8z9gJ#s?|k+O z*uyBd01x2I{0Q1-1iaGt>?E~vDxIiV{}}w&+W}8rGTK%e#g>)z(8+*)5YI>JQM%sR z|BQBf7j64#NWQJ#pu)G`Lh?`W+<~6j3vYj~KgS^z=X338^u>dy-9F$?`pPL4b6+~d z<*FW7ID!(NfS)JeA;zSPa+Ue~8$WeCd?>`tUMsL3o|iDn6TuG$?!}YZW$+wn~I5ajPL(hj{EPoRy^Z-j@ezr1%Z@-jLg+1}U9h;okrA38Ui8fBr)!9M}K2l!*;TC6`;LT5KD;CmeH zCz#QN(0K#;xu|0?ETi3&-=VB*)VC8}g`m04nDx)o+KcaQ99u9`&I6x?{dZsoBf*Yu zaBLWj>J@krfdt?F&{>mhZpDmtB6SqcHQRm0N=2o}&tlB{4!u7WYZtzwkyGI3!$^G& zQW%n)J-B^LYN{6Fz>OLC^0VJo^TL)# z_^R$3BwnPJ^6i;&3@wwXR**zNDbFHx8p<86d&0ldp%!EL0Z4uez61Pb@ZSRe7QFfo z@R{~<_`^4=G9+i9IS=*qLK4;e1pf;12KjqxB^i>7d@CZipdF^6WsbA|>QZ=KV!MOz ze!kb0FWY|3t37J>3)nvZ{dP#6;Z!-@c00=A??Ht29+!?>XHZrF`avLC9v(B&4wk6D(rDk;Y>diX>R)(Y=372xy=JG>hqQyle+H?!jB+Yk z@+?~H>nQg%wE28}{$iYWVI;@~?*PxE=nQ7xMtxpjq@C2)I*jd&`dWt(`#e@2j2!t0 z9YniXqJsn1?4SoRfdv@DFTnmU(3=;vCy4(I$`Y`1h$Xa}Jb@9* zdB1>MZEUS?58rhw-{HMRtpZ*G?gy>~PGZ!ufvXv5$9xlx);zypl5&b!!K=Cv!(=|L$T@SDKT<()!n1C9gsFxs}k&%2mcKY%(iVLaCQpRSp)t#0Br67hQ2VmeqbX5o4YWsHxOCyL`-T& zuCg5=z-kuQbY<^OkULOnE?8!yHOqoh)L?W~yw|Ay8$rX;p~|&_l1p-)I4bH>#Vn&8_S_H zG=H{B#`?)a4*mpkJFAVT<45%DN5IXD;X{#O_zZ%w8=#)IAUD8M{vzCk%16qxte;#F zjM_~a4|TGhltKL?SSdV|jgHteNymk0&TD0#;rY0qQZhX0D42Z~t6$ol-DjnN;)vKj zMk?gPdt!V7jHL>s7vMh$ytEW>dnmQ0`5dcLnh$43gNy@@vVb=$f>>L`6|Si(_;xqt z)dblbJhlM*{0R8@SkO;1U0M#_z7JU98(5Bn8XT22;ODhqa|ZHFU`MwFGmv$L`pOv(|kt06>m8k6$-z|U?V z&p{70n58;!H7(m5$}&vGK%`_t^tAyWcnmpH*t2ii?sSL_Hjg^SBwhq}lcQ|bO6C9$ z&jjS>l0y)uhoF=#@ITYbVAi(*7_3mr#&U#RQbyk~H0zMNBUXcbKbq_pk277~x zgs}*se)S1veKFt<>^^=J`Y(spVfOg_9qJ2DFpU{M!|qll$QR!qvFio;RFIKkKD-eD za+Y$}4&)ZtABzRaDJ{Rzl_uxT>cIl!*Ft_DD0`9ROP+%K25refZvb5fR`fbxX#nq6 zjD#FH=+DH~nSGF01FP8`b~~$-d$3^hO}TPcz9|7UZv+X?XYoz3Z%np@{1900Plf%c zOsFjgENkKHQs~1&aj%kDZh@6P2f7^2-e;ER8RQIuJ{T&;1$DYZf3zUq5$x|l>*`Qv zH_#oSt(KtA1k1Z%DS>)=L4QWTSufD_l=)&?OuhmHI)cpz(6>Sjhe0law%pho4qQ0c zE8izEgtNn-&i-H%3pst@>`~~IKD1Q|ay7^!AeG)?31yYo!l*ISDftSu-2$5xAUi^S zFDM%h&&pqc`~>}31@evZDubmq$TDRsQ0flID#-r~Z)+R{UAdEN1C|!xEmt9b7wi?E zfH!J**y%mNO5rwOKNtE8eUrw6ZVml6gR{!(RR{Wbz+^kf64;4a4Du;l-*sSfA9B7y z&I{3o*{>7*sut{-gg1YqCy_)Bu2 zlrQvop3Ng3&oZ z4Fh4+0{G`MX!je)iy%uuUIu9cH7tO#2SJ{O7Qr*QP^fJK%cuRbqB(=5_n8E*%an#t zc@Umv9)!KYgYX>R8XT=3 zlKmR3SI>^7?2V!C-`U>`L~2L_HAcEflO54Kx{jn)0&0YGkRH;a$L!5`b_S_53HxS? zsB?%%nAO`YJkXSV+Xc=`#d8E{qb5;NNvUW8$UKnKK^B5s3UXa^V*C)aB{n`e0__61 zKR!7=104qWdwhCIB02-|A~lRa*FoM*Oo>WFk3qgjiiwU#4In?I(bEzH5}swDKO_c? zy%@*FK>n2ThbBSrCKg5K52^l>l>a0(f0D3wEY_p(lN3bR7+D}2pGg;8!o| z#n4}g`W`Vou1vKBWvW|D?P;oSs7wv~l;sT;)3#{+1{=iV{o*Ke=>KNWb|d&LdN&k| z5d8H`?%)4?D>{Rs9wjm3oNy;;A7qH!ksk^|J?ShZ5)DOZXf(>9$jw3vQ88MF%FzzA zA00(C=pwp_?xQ-?fWFYlks#ZFuxyj8M79&sQrRv@%VfJDEtl<~X$jT#LRuo*2WhFS z0@5|{9f!13 zb^_8e+3%2+%T7}3GFde}DyP<`AT5#AKw2t04QZL|45a0`KWJOV@>i-P1A}03r<{B5y^Hc_$+CUPR`Dh|EXum`@@;pGADWh`4+earq`9@?D7t zB^p3PE>R*P=ah)ZF+)TyRU#rMN<`$m5)rvfiHKaTL`1IkKS1O#sz$ZwI{d=B9(|${ zOm(@s5)rwE5)rweL`1HsL`1HoL`2?*AtKjSA|h|BL`1HmL`1HuL`1HqL`2?%AtG<8 zL`1HyL_}_&^cZ6%lb05pfq0@en=6Q$)rKJjPo@#z#cPS45_R5*hZbPS$U@1I?j# z0s$q{TY#M24GfVbQc%1)q7c+aI7gY@U*1DHM>sEPbA?*adeXcLqBd8!NVNd4yCiCJ zh0CBZyDOqL7rxhGfozd0y&m0AZ#0;)dIlPYCJR?pEnQQ!bY0cb4OL4wRW038wRBt6 z(w!eI2~VlkS?*8so{8FAp$@bFn)h7P{;M9{RrTnesz>)#J$j(((L+^_9;tftSkpdaddajeUu&#FkEAnsaOqz??IOdoi84X*$9zAcJ1D38>jW_8Bdv z^NUin3!S5W{6WIL5z$m)DrqZml6Xr3C7EpIrcs4B_~wCBD)ak3*p>(l~t`uy8s%dqtHTn+(jtCdNPA!y_gR+mwvKo%CSBb zaz_xRmWAA9RZUk^+EtZyO{HB|X*X2bO_g>_rQHUN(Ce>9eclXNarFMoEun4E`!lzc zrpKto67D#aOSwC$a(BgX%eVq=7QIHr+!|`Xj@yLPxl*naHR8&-%}ATu%56hB+zxIJ ztslc|R1dK^oG;9^w8gI?E~h6pavN!#+o(O}D!2+dKciQhn+LzpX5YMH*Pb#x%w^Tt z_qf<^z>yJG#1$c9TE_uo0>8NSfnQv+`jhEZ`8kqlzj0?;=X=lsRazI77NpX;f=1wb ziw1NZVF4xUq0}2F(E!$O!SWqr60V+>K=9Q(%;)oY99tP+48z9iSe>n(umIzr7WfHo zgqfF1coV)QD<|oL*5jwx6kA~%Y>ORmdz^!FaUPzGr{V%U3(v!acrjjzSKu{x1Kxy7 zaXH?Cci=sEKd!<@@$a|>pTigNReTfQ#Sdv+b@&B-h3knGu_0c>hjbwRB!F}#T}W3F zO2Wu5q#qeXqR0@EKvGCL89~O7@g$o}B$G%!nL?(K8Du7zP3DsMWC2-3ej`iBGP0bk zChJKF*-W;Ron#N$M=Hr-a-39?GvpkpC6~x`a+};Ik4YVQMHuz7229x8v=2d)|?E=G}M?-iPnN`||_%2tI~S*Vv-5O=E|^3A~^# zXbCz(Q=z$FESL$Ff|Xz+C<5Tz) zGQnr@S!9YY;0vfFzJjkHGkgQzK<4-kzC%6p0e*m5;V1YBvc%8uGt?SC$Ip=!eu-bA zHuyDujoMNVutL_<3v7@L@g$z89q}gK$d>pLUt~x8h#yjrj-(^9C!I(q{74STLH;C{dC%n zg2Ko;vJQolO=J`5MaoGz>P@zhZRi)WgX}S?+LaBUXzA+lc>+-rN zjo0V(Q99p@Z-z2>Bi;xN=goLCl*wE07H9--$y=h4ycKVSM)7U=wrDhO!`q-Sye)5w zvUmlrKx26a-T{r{op>iSo_FP4(FER|cSqU0H}8#dcwgQZP2~M}Ka|V&=li2c{9t}C z%HyN?Xq3;V@o8wX#%7JpXo|*Gjjd>^#!ii$XqrH8p=i251cGJ=YJwUn5Htl%G*f6S zG)A+8CPEW5TWBUULvsWp!3fP2S_&=EJfW4)3e6W<3$0P1U@cgq1%jPmhZYKsf+Jca zxCkz2vEU(ipx*=^!3Pxy{(?VRB6JoyqoqPup(|P@gbJakSO^os&~o7y;TN<*=qL0; zD}_PAAhb$|5~9#*VTdpUtr6mdc(hhX5EAJ6kA1}{9k;}7upM^9Z}2oc8!y1W;bnLw zUW>Qlop>)kK%?ylK8a7`^Y{|JhHv3}_z{aA(gwdFZAe=@jdUa3NjT|4`jf#Vn#7Sr zl1ehjNRmZXkTqljDJ5H|N9`hQNd-Abj*t`N6h2SW3*-v9LGF+T{Lz6L?7rc&QQak~Z*CW8ftn;3Zw)B|YG!CcsNgftU1wmkfZHngK60 z2VQCcjARImWCV<442)y~Y-0*+(-PRm4A{mT*v10brWLS_C9q9vU>hr7n>N5UZGmm9 zfo*JnZQ213*a8pO0S_pE2ke0d9DoNLfd`y`2b_TiT!05$fd|}x2i$=NJb(v0fd{;R z2fTp?e1Hdhfd@JO5BLEO_yZ4g1Re+g9_R!-&>46j5O|;q@IVmoKv&>_ZomVQM^FA%?dAZCAsnC%NO+Ye&4Kg8?+h}nS< zvx6XJ2Sdz8K+Hx$oJK*MMnjy&K%B-xoDP9Fje|Iihd3Pyahd>enh0^41aX=Sahd{g znhJ3`3}Q2l`s+iKip_9atiVpV0Z+$s@IqXKi}5PF4sXM|@IG9L598yw8lS3CRzmpnVOVf+wD!EDSl859ec|q#QJMxKq<2jz^)p;%am<01pu^Dg3C-UuSTn^%+ z_#qm*1gRhw1VLNS6AT1H!BnsiYy}6Qz2Gi*3w}Z;AxH=jdJ4UTzQRBuQiv6j=_phF ze^maDqmsp=BgCT<#AADiM;C}kSBOV9h(~vbM-PZcPl!h^h(~XTM<0ksUx>#J5RZNk zkNyyk9U&eAARaqGJa&e741{>>0`V9G@z@pOu^Yr=FvMdB#A7JLV|R$h9uSE=AriwN z62l=9dqE8Lh8X+>Vz3Xy;I9yaeIW+>K@9eX7#sjGI1plR5X9hMh`|Vm!AOX~D2Tym zh`|_$!B~jFArOOc5QFg$gF_((6Cef?AqJBm29qHMQ|P*xhrh!(7_C5?&<<3Ien++F zCVGtO(HGeNfHePSxSud(oD!ywojvP4d>(%06g zrtwQl;-^0}>JM!H;1oT2L)U6Iz)lN~r_oN&DO3Cu)`M&ffnYTtp(Ssz6(Br)ki)wA z5nWAgV!In$v2vY=E@(8;(E5jG60A?`sgoJ9q4@fWI}j&f#ayl0Nx09xZ3x-}mG6gEHQ7_Km$ zV2C{7Unq)1>C}A_Q4GqU|9i84ik3fBCeYI+!H$7X|yBVW%FY`6UIXd== z94YM)?pBOB3CF41ZftzL`}h7!PFDUXZA810YHzJ*!{c634P7(;l+;ma@k8P=Os%5Y znA*F!xtIpWN2R5tr^IHM`lqC&+S(f{43)-B{(L4SEg~a6CE32E!i1g2x(0uo@0pU4 zVcKDMMqEl-e8wn+vA(9lMd9i||8ulgIP}%mw0EF~&NP$$*H7f>Q02I`FMgzH zZgRGR#iz(cr<(<=o*QJc=+ss_vqM4cvQn-zG4`15rtNm4qD@1rM>~nb_iwEO*KALe z-27$ zZJGMm$k`)fix#G9=9SeSeq*{jRA)xiNt-JU0nJ|Q4J!2L9%fJz+hf#*lKkVny_e;5 zpPWoKJ0BclQPDHjYf(tG^*G1m+|K;jrDuZjxa2&vsxtpp7{|UKyfXWfBKy5Um%?e( zN-8MSc{z1mLSz^#vRANNi8On$B74CE?S5xcU&f~`HSaM_Z%c5&_mj)h{{8-z(+C|z z(>y&VH$LnAE~@U9uc8s_qpn2qT}l*~CJG~#p(Sl9)vGqD$waCB%3fbR9J07aN86Ph zqh2XA*y%=6DGj5%pF#&Sj~KJDbX<^Sea*g*j1_%aXS5x@HSg=jZu3T>;3vO7Gq@gq zL~BLX8_xge@A=gq!m6v5RrF4I71eQlNA#lb_~HwOyEK+H)0}tds&Pr1u`i#mN#8W{ zrdxs6!lC>pGyi()$;EiJ*^?{2-9dYu-n`HHsI6m5p0z2Q>z80PY^UqY+cM1) z1L96qOz4mhyKe8!y#-Fc*JJIh(QnV)_PaIa+nqa`zP-D3L33;B#X0vvcet*|YFF!Z z%)N7TrA@OpJQHJL+nCt4or!HH6Wg|J+qP}nPA0bXCii{rbDrl}>;2Au@A}r>eKo4O ztGcRouf6wm{kq3R31UP~)aQg4@86JQ|ie=Q;PVp2|`=e8qVyctpy zz3r^LzMn@v98U;u0rnqKL&KbJn!Me3S5B;lUo3LG9Vzyr&B&RvAq#()8ns#RTvvyK zSg_ItE}pNlxY^VeK0)46G)6RzsVkfuC%9Uc?gRTqE=W(L8?P|88NB(RJvp0qFxpi+ zvz+Z=O|-NPruI0{ zrqy^q)hpk~Sk;o^)R-68%YX?vZSQQI?l`*=1jNOG;%Yqtw-C+i9ouqD-eWGObj8?`Ysp2na`s*Eold)t`yN=f#k& zNv3CL4QB$q{x5PkYWW3PP9BA(W1)-f>CaL_&IRs2p}6P4i(9i<-6aNp;psju?%^+o zqn~tuq*(0xc51#+t#_5Ty%uZlZ-n^r_i~F>$F=RB(>G#KA|u-x_1<- zmR`TtTt!NAPe?*e(u!EPx*ffmkB7q)jI|>-A80T7#UMQ2)$FkSjZPd^hRSX{01FDxir1vi*b zYBsi|=)W6(#ztpuR|w_<&^G<@F)!&hEGTd8<6Ql)Mg01(X4iwa_eaDckV~L~$4XJ- z;DAo0l=0*)LZ&Ob=8-P@+Xs1jPWB8pC)UpcBlS+G;sy!_B7S4NI1NrD z#yVuWRBx9~kcDfFuPmkCx6i1p;M=;&+R6TUtjDOd#8zgyTJlrdZMCMl*-)g4e_)C@ zaXS_>F!XG#W>*z$ygO%}qd9)@qnJcN$t(9+7t$XBk-zIqJJh9r^;?kBW3De7vlNGq z72d44$!OL-qABM!=ZC@vWvAd|rtMoP^HlGuOLb^oS#NY(+i(-w303So@?a@;H;GZ? zmojvD$-NP-EW#dJjK1a=OvgF68$F9!HJWMLvq4DhI*!BtSmnowY@`tRbuAgu7lN;Q z0uXE3r0n+e>S&g3wj+FbePh&U4ZU3ii-r5NImwQRRC zmVfrP9nwxD+p9D2EzE3DCti_rclcRpP0NM3dKCvB@pMWCI?b+ui<5sOy2*pPQe>5A zz~s8&h5EAE?!he+0XjhP<(EK$ZKNh5=MXHR=KTS@OdU7mfCW) z0D-GLyNHa~xH{fodaF2`BjRWv?8lmGi++x)v9o?=Y6yw+TG+W{ap!Tun@r>W?H_QN zwz?`0+Cxj`g4sRJ&1Q019A68~el*+082xOQVf)gcvaZEv!Em(}n}Da(M*@H7R_sS? zsGAaH?)`&ZCM}7Rrv6tfq9Ulctb^Ai>}Vv2B<$f2+u2-CTz~013bzzBP?>cD4pv zd6t((+xwdf{Y^2Q3e4E;%)vRTFsKm*3SvrnF0uoynN@O=R!aZ)@!G(;mEUO13XNvr zy3+X(CyA%1B+J|PY7{#g!+G&Fz)BzlO$XhC)MUV*AtrI`wbJ| z-(gBQ3T>;`Tznsmcqi3X+b%JuEfvgMXIMFYwla$ z)=gHh@4MF_;FNXP6`3}P3-;!*FGrSBH9Bc%J+m3@_lrCA*AO>nwsV=c)%I>X(W1N^ zY(E?%^zP}%rCQw~s2Mp7qcz+c1osZ*Cc>u%r1Vn+{W#ZuSa16+yPh%!;dXs&0BY0c zl5i1`kMjE(-Z5j&9+iFfPm`=WdmweSYxoGDi#zGloW)Qdp83H+#!2hi>*3KHj^CwI zck2UnVW$VG=fz@E)B|K;M8{R?S*D?w=P2q2JAHoG?OajN2LXLP&gWvw`H3fZA5?nB zQZsoDLuFXC{V+XLSOgnpJkt2EnNHEWMsrY;e)`cGmB`q$H$eYJiKOztMOC5%14c2u zieV{t!AVHh_TK-v5PsM+Kd(Lvll$d<>xcWfyBGC1l|{|qQLciw=r2MQu6=WdLz0x*{lsUdF$Sq$p;}sKN%Q1`MzA(_ z)H|i_RI6BEl1ewvEk@eC)oh6+e}ZJ@#9cLCus_m@9)il$|Ws4=%5Zw*59;(tLEr32%5Aj1Fi| z*g33~BsD975IZX_O#}*ev9deJ$TEzsS!l#rp|Fvscd7__DGt)!RGKbaa`1tI5WXS> z@6WQ+58*Rr^C{qzffx_v8J55Bp({!dDbGnzld5_w>`0*{V>A#^6);^Ro$a)WWe9Z9 zO0!=MluA4+=vd*+2~i#KDQT0|QZ0Cx@rEs~R*ULP==uL5!oG@9M>*cszi=o$4G`k2WP=Z>N zPIbMQ4hl|wQA|p*SuFSeenf0U9M|?EMQgNuE&{5lwfMkr;xMmLFMQ+ld|k&qmukAO zv#h+6-sm38cGk=~;NCFU+RPztbH(9mWA6BcBr)w_Ikk@CV;dZ0)ue(=iQO1`G_EDh z+->~%^h)DusoGfjaLW%A&2rG=p6v5nTo)!v#>)X$qBjyv*SDi2eFzn7Eta8SvTUmP z>%RU8*Hwc@3YCoBWKx?ZWKVUH4X!{004>)Po+bxHhi>s<_I6{F!-#t7f6R+?=T4dEpUWxY2;_`mTH{ zKHlC=Mf{L-V5g_9@luPhC_Wl!A3@&}tvGOzOK0|cUjJhE$FBV0N!E4 zwQL~n0n?h&f@kIfV6gC<9}2?2Lf_WT#z4pXucD={DHH@911%jc4enoMHC!4sTxMn# z4P0D$HC#GI8eDpMdRzt?7Fy#Kinp`m0P!i_6H!^jG^={YwLS7S_M{K4~of zRsN#=!}rzytIYIC|7!nAte@lmQ~qlI8s|&vzh=zD`lbD+R!l5vxL=xl&Ea43|DN|} z`&X}j=KGa@+2=p!{EwFZ@O{z$((u3R`ZYGgr%ma;2JQTQ2!t5-`sym z_^bVIo`1dmE$ts2{?(xW8m?dEuk=O#%KtTd{~qD%WB8T+>Gj3=w}bvJ{g-xMq5W^h z`?AMh>kkJ9wUEhgI|CbPq2D@o1_B0pmih+N5(XAVcE-4Lbc|eFP!RvDUruQnQQfA! zG(Q3^JRq=I`K?>TUBSG|^`iJ&YktFQEr}T_>*ulrw!P_7+tGMKU4MA)G~PD5n+%go zF+(@>0{M~*vIP25@Y1vD7mFDJ*7f3Z@}cR=L__4}#`z zF5$VN>pVE0=UpVAc3Sg^{VFc_9_ag{CCP~q!G~(8!#?Mw?%e;$)~yU~yZSb8lZJ^U zEw_3oKuF%6XrAYdY@U?xL3*>uqe?5F_Qh%B{P;iZ1X?T#vm0S! z5s`mPo{Jmt^CsJ0Ci-W#p9}XttM!*}|95NA($Ue;{Fmuyap@T7>FNI6dSkBO>hcON zAGYV|;W`-il3P7hmh@hbq{p~h0XYCi-r4bD*_jQ zir#XpXxG~M`!_W9ZvYSj`-kBf??|;Mkd(?NQ+^x@vfH8DBj1J~lQQXuY~6S@uHMYQ z?I5;M{~@a{XcFFC`3|6@oo>>i3W;L-XQ206G;_7OyeU~}o6)5+GVULagT+LXapFrr z(6~nM7r8ivxkR5{@4;_7wB%g!nzF1$V|yqW->rV|6OE4Et;9$-8Yk#%S}W^hby=Ak z2I_VI-RSJcC$Qq>CR=_-9ivNt$dz)v-HAr~CK^~J#h>pG5qy;Z_DtOmp&s8L>nTQS z&BXID{jI`;ICr@x@cVuIRn#wwl7-ZQ-yRk$4&iqy^k5zEfMpY{bS4F6D@ZE14*n*) ze-;D5CVg{d`#CmgB^;yeZ6wL~7{SRH=wr_EH~8Ty>AmB&mlB-%jpKqzR?@O&pr z3Y&x3xohAO5EexcOAKBNj-|!0aIG2tHPXahtxKyDB;OO1-+1@qX_ua5N_~gw48HOY zs%VTs#9p|6qnMy@b{Kr;^7R<9F~Y^Sv$OWsN@5dSzmLXeLu&p7EfW&5@4cJlqgs-u zqckTUjnJHVfUo#Vt7lnBj_^#qW%J_yVX^wtUMp`a!WV^f|bRB?; zjGzLnLvUE#aMR#vj}BHKMgk~Symr7!@5B@Kz&RLAcrCu{IiOCsEb|&7Vx5f(Esq)3F_5m*|D0sw}{KparCh$^=giQlWvjCJfu5?j}VIXGz&XMfGJt9>6!`XWC&w4P?Q#dBnj3 zCB~KV3JyZhf&T!M$Vq~14swnPOoDj|iq(Pege&Nh?<@Z0rToo5$RDw=o8cWG;LxrQ zjRx=vy9wn=GilfphCUmt8mulzweKPeH6(h$8@d`uEGjopwojInpTgJXU5ykJFz34= z-UJ^9Osx)+F0eeVA|H|`bV*lG9h^iEaT5&d123a4qab|}9HlmInYZdY#T*}&F4h=t z8sJ^f9Sw>#)!6O_;0@_S;8V~;FF+sg<+mNcswhie|0*zRI0js%F5g!)r>GtNOW2*> zDpYG)3SM;pak#`Dx_1T&U!guB<%lNCE5tG{q#$w~q8&0PzYh>>Z{j}UM^Kyh?~(X# zq-8?tP?30C0Z#DPfrD_1U8;Tcmp~tk9N#}5UIRaYUF?<%lJ1^;Rk~!@S^Rt&#P_zg z3j648D$I`l72ztg>bo`I@4ZgH@G5X?1dhN*%>Kh|t)LGd6j&{<@t{;4NKb%Ca4Aii$JU(c5RXm)>A(vIIYj!k6W{l zs*xNB&I1-7KYSOpVRo>cu&(TvMsa-Gt6;2gPK75tSiEk(vjjQ8Zt%DPZtQXUGH=7~ z;5k8FQ97l5AZ`RW!ftvyM&D4i1>U+^p8m0o}yUD14-J z8^rOx*mCW=*ap}EZVGaO^Wb^?PKEal#(nh>Abv?d!!7fQ=D|BbZH0D4r@jr-i_{cy ztMG_)WM+kRrSu4O#kS+xbkXd63)K|tgs>7l3yt;KI>q}fngmEjdDZ&kgftN%^c}}R z*-`2`V|mA-nd_G1yj=_@Hg+5&u%q#Dv$lI#Gyr3-wYt05$iXpQzx{#WsC7s)rZg0A z1=r@(6*4hndAJV^u*au=ld~-*I4z)Vi?1F+9#LRET|fGmd3)pb^6v9 zoB2TN_Ryb8;t-b#Sy0f}?v~rD^sTK6?x>5cV4Iq<+FlqzUEQS@lmISo0%PWXRsY}+1C=SAU4*L7b}{RTV!tJxRIu{!KFrYC-*Nz$r~ z-|IFmjkV0vVsF^U$1q ztw7O|HXe|jzvQPcxpLFGqb!S){S@gnx4kUtXe9lUTz;N_@ks#xB)ICHexTjbaToT+=G2A^DA&}&!p=H^r7s(-+(!qrQxiuJ%3>xEt$>(~$;qZUL|#8M<)DM8 z!m1yBsyR4kb+*O;-V%QUS4pZD4DZ0gG4ghb%Z1MsLW+R|TB7ua+^aA_|vifTg0gk)#k8{8rC0LLZ0b;_QZ5H-r^!CopoH z%TN!SspAJ9CcUtQ45B|#6hE((oNRC>X9z*2ynIPv9&Epp=TkQ36&2O<$U;6m^)s|Q z3sc8FJYNCVH>6sOu1uCJfFA6i%cg?poM$&g5f~ArpDmtLypA5CtgPWz)HZUc4ShM6 z?W&vSr0(H48nAdv0!UT3N(YG45EB#CcG-9=L`y;dn6h$^yS5s!o4(Ah2x2=xds6yf zHp9Vo4*q6O1nLsQcVILTp!-@77OzOlXc$VB_T z3chh3rZ1e%z8$8iY?eT(EYMUTPc9X3sSX+8(uk@Lfo|33NrQ}JAdqg^?FyI`zih&l zz7g;^U-3CcEKEfEkym)}Kv>(5FI2U~HVh1?>goEyMjLJ=@F#Ke3 z%X-nqe^yjuQT9KF0fz%|axMi4q1Dr1Deg)*%wo~TFqW_OS1b@AWt~#lVN@YiSyHhn zb&iH7a0X2u(^ORHE9X}7ZxmL1(k8!pkJW82=U|sk<}^|Lo;a_p|6uOm(U?}wv9Fk% zUgM&VSoJ+DT^B%EHH4RSSJ41ZZc87@e>c+)#9p*iK0rp4)epl&0WrKmC!2#XFEU*9 zNt}=T`LR7&L-J&6>HGL0cM+PW1ox8kRW~2NE$zu>QkqTR}Ab-MvB>7T# zSNqn?tB?5)9l8)9#0Ebdm2L~@M5z%23u}K&l0Dp1?Jf&F{W?-@W~ymOlj0ycW6eb| zuWS8u4uBTLfdRQ+*ac3;!;aDq`uJBN+W1`}ZPgnRAqb?n7n1@%TejvJ&P&u zsq19>w&lLMwdFIxvyiG_DhfgB}!rq zFEovF(aD@V(O7z((jC;vuEWH(KP1 zC+ke(lGVkZ+pt3p!TXO!#*mW|YuS_G@iORm*OS-0W^ zAbwO2D#}vWp%I9Tsm%NKDezfG;9AFjy=jGG`H2kC{Jy6tPvQH*`Liq^*|P7F4px&w zfc?bWE~kOY1*9kJbL8zZ!{7F26IOpoyR@A{v&<&t;^fjG?eT&OQTK~fc8$L9!NdDr z8I5u(2%+ElQ<&$sxm5ojwG!X-z737sc8Eb{e7@D&&qUt_%mX&(--L7cr*P zliYo4d2UoEX$I6tgvx7TbkCv*`)MPk$<>%Wb%x474~7-^eKcwk80aGmFDS4CRtDfe z4?z_qbl0MjK6y9n1Idl|Ze{?I({E?k6g-8!$qPSgE6oFl4X0yFi7?#n)TF*f!-+H? zFrrs9K#h5$S?JdA*Ok$T6nIWcEui__Aky7jPB>CNIQL2427}_%cOQ5_uqEwiU>tfE zci?vRx4wUPd3GDJfPLVB>mxixym@a9<7{^hDo#7`p@Gf%Gt+I!Jd!NDpuDEa)L=M! zdSHJ5d{AXv(Cd(^y2EbpsVIR97r~f|{i;KHMHgj{{IJbP-N+~m$TxDo;L6#R;LOGG97XVU6cm3XiB2aPw{u{IZl zz?tIqyx+!ZNFvf(GfpM*HaUy$q6!NP3K)N%ac)}QR{nq)*mP92K3%ftNKkSaQDux` zO=O#32SH-;`xp;#d~(+wok3V|HH~Cgyot^|z4;h*(Y`iQC}S;5mD)1%lH+pZGBwTd zU`QRlZ;{Y#(h%9Rgq^6J${Zd@HGCydwc^@ZM>avL9vee%;q)MH&#DA$ z@V!Kz%sjZ|e3ruJ?~_WG+x1@KX>=!KcM_)y1!Mn3TCq*ojchNNZOFO{au&)qBCiR! z(;Ixe&xaCoJOg87oFsd#ONefU`D#MS__-US(w(qywQ}OIjJFXBqM8$n4G!qZlk3Oi z#w-rL+5QmrF(P7t?>Hr8N=+Y;GP*FJJVn0;zZbn%ao}7X!PeeHrp@Wj3C=N{_RS%l z2AL+$aTLf5>Od^*=kE)5Qt4;!ckMSKI*<7#>M5F$r$81xKRPkYrp?|4NLh7rPk^8z zhL{JeiGQdJ*BZszgGduGMmvN1>?N=RmInu0=|lF2#`uE}hu(KcUQxIp`vYC%XEO9; z)!P!(sWJPQ8`fE3t8Z_!v_H9COXt9$PKahz=5ct2@1xh&pcMZ{3W+ zpk|yIT-808!6f-<3-}2E`j>p_SVdIg_^RSl?PT%;rfQ>K;~dH4PtbLzCTZM-Ru=no zle;Na32r~ry;kaLE49;KbWoS)wn0++{UzXz27lx4uHgLsNOKR-l73B^{dQ(?b|e8J zw5IO?SqtOgSC6$QxY@;Z03

z%OhxG0F09Y?Yr3z>H>;Chgo5kz{2~*1KzfmXWCv zmWh{w8!R7K$XP8i=%bFmP))IWfs1qm_Bfm)=cZ?im^eGoSh!DGQ4p?FSJ-`7ch9gb zB~Q}o-{c?IVr4%|&=iVAlETNX20u|_-4F{fv` zGakq^ZSO4|LGX>!@cBsTae%C%p}w)c`|`fjq&GO#)zma+g@0J+#~*GQR&baiSs3YH zy15K@(i|Q-zI-VZ`XlhGqoXVEqr9+itgU!ji#3+cBn(U9yh0K}V}^#soU6yMlXk?z zH^cEJL=hdK&=J9M+=#@&;lW{}A@aSOefX&1;5lBZXtp5Ufhs9{VGf{BfPHxBW_3Q) z1gJO!LU0j4188V?S~iJ|5oHHsfwDCdZd;slL(QIfsW4KK#YT3Bh#NU|iOYdqB=pWT#4na}gFRp)i%hZNBEVA0Xb zeq2LBg)4yw1_aQJ;HnhKX8*W`P_P-v3i@S0{t>Ccm9^uBAYY=WJ7?_X#_8_n)?Pg+ zf@4Y8-ahS3h7(VHh%ia`2)i)3xEd-WD8#ZQC4Gms_eA*o_-G4$72UlCr_=+MK7>@^ zaok6Mcf@WD8qd!Unky8PN#TB=5|&kq`-o2|$&)FsQ?xF-4n)$F?_eu=2u&d)c@Bky&bJM%ld0EEQyYV7N z-Je{9;fD{pUL$AwtC@Ih}At6$JBF&5qt_=W~-*Wm{kpf#pB-w__zI8%GWf?VwyBjJ5 z@V)KpuLu6c4F2>+?JiWzjk~Mv)E=%ECz%{?W3%};38j2*%gNCrF9%RV#aLL}6!Mgg z8mH&Ad^q6nv3h$%g8=ZBIB76xR7HN5 z;fD{5=LpgecWUmQuT$gpkgRPoTh$k3Hg1~E#b`ripXcy4Rgi+tIHBu5l*F~f-`zI2 zQu_=nZf})q!aMW#t`?dVVkl*%FyLEg>+)~BQBQh!1hD>e`ZZo3$S9L+FqQ*@?PAsI zbGN$Kadsk9KwUb-Rrln*yYCOES?_N21a9l&j)sY+&s?P+IMB}v@je01O>&6C?{|mK zR4Bl~O}wfAdH9Zj;(TmDMSLt>!Ra|_|Ll2^ zgAwsAaaL}rVZ?LzFxP`EXIY5$y5_tjRoi4URyCVLW#9LR*4!htdkD*+Q)tkXXxT6e z-GsAYQMm8tD}7c+Ko~vhumT>F490#Yu|VhVumTLfB;M0_g0G(5C5k9uQhgbUAp?+4 z6vrJlBRhg4Zi1FyD5L6hRjj};DurML|Ij%5qbZ2eA;n+ax+oplzL)?+%i1?R!HchL zLTVJ3udQE-y$kFr&_Q*=nDE?T1x`%A`BR{nLFI~xQNeh2X1aqnniP+TGYW=(VjrRu zJ?Yt;{{{Y(6jGcb*faZhVIAnqxm0-E{i*C`=ySJ_tK;^|bc3`Uo7YIq9oka9lobkF z*h1qnhV+r5cY^)2%0j+pA(b0R>-*Ckv3s#%;USal)4q#ETlI)BFLI(z853G*J+g0g z2))7|_$G;R!55?W8FI2Fb$*rR{;~bz@#kYzcTuDEZs)uB{s9OJtMZN&iaALM)Vzb7 z0Svo&q1x&>`1Dfh(&8ya>1q@hkzb|ek^_gEG5#Uwqb2nP*UuFcoQW#s<@ECL)(B$a zP{u;KredZZ&D~@1=%o~C(7a|vbhb|cV(rPJ(~H*417hY#%q6Oond3)w#J+-RItO(M zMC$(4Qd;G+DR6MD zqpRae=XBA0cniz7#sX@{)R+yP$=n%jBpCnD)n=p`Z`tjyn3hlY2$5K=>F<52!dknb z3paMO5I*ItVl<_s^23-=$*3$t(pi-rNz0^!=VnShG`d$YE%{l>iWf?ePTtxOa$!L+ z@mFCI!U!eutaf}!MFmy%%=swLsi1;IaoH~gRX?1&VzP01^L0Y7HLixDStVR0>C`=m zAsl)e2_cvFByiR>zv#6lS~L|_XBGA5qP4QJD;3tK2^%BlOfn>Nvni}Qb*Pph8#Ci+ zhuDsm8SUyn)=|gB+bXex`Et|{Xma({c|t~TrO@xoRn-*SpFGD^kM=Ap(xbnrB(h2y!rW z&M(52@Wy@5SH6w!87pDRnuFKVQ1F*oRUjoRuP+YK3A#r&;XpT|C_sl)%Be&$1X%dF zsFY+;`$t+>cBq)F$~u0TDJTk1s3<^;<4|Esr3Tx!|Ce;yRjncNK_`+2zilZ848>!a z4}6~~sm@|G<*B9v_eSgT;t~oT&T6XP=CO7&bSCES0d^eeP5@49S9q7&B{SW4V0S8TA%=Aoax3&=FHY1o-AWon_y*MaXKx%qd-wzSuN z3%(}proU&GE%8m6!RAB+b<6-w)xwDk+r+CAjmffqm{!$q75{9k$M!0pce0PC!!Ccx z)nJN5udXz8fu|mPO*cI%?(}o9CoP6pwW9fc_cQ)F+=P^g zi5mUcyw}Rn&vf5OwqsU;aNzC`8B+1c#osHcQxiO^N>j)UEZa0jeF;8qd|2Hl*76nJ z&xI=+oF~GK5aH^BdTPROf!6^HZ;qcm2m?^ z!nVj{^Gs}x3k7n3^fo`_A+zh|&Xd_zHczSU>Kxk57nEku^f5SB|3GlW}nIA`~iMreXB={+<_RGsAH+>y&9Kur65?!-WkXB3dU zUMJe5@Nf~2C!p=$UeOU6hna@=L<1tUlkQ#W&m+xKL1Qa~ACdb?vA2f@aWYJr2B_i` zUbyCF1;W}6Sqx*Yry4nl{<5Uzl4RB}O*gGvoL6m@eG&!xai=lx6OzCfbL5rNhfQ3< zuKg$PPqvj@^SR?93aoT+&f)rfC_6<3?N#_zc{RJZDH{Zh+T+%~1l&=pRWhAWa<#Zk zi{@XsKC&`PROp#5Y#pEf4b7Au!?-`Ji+4U~+L#$GFCanAzdk5r8J$4gE9^V82iRSC zYX^@bL&h&Yi4xpe*4Fz~*ecky&u&c1rWV$(x0$N-hB>^tDtC z9DrY-YfiaB>Lfiyq4AhbrIF~TSavow7PxkGctqiTGmHiHxwD&}=4}`jZX2SBrzk6~ zL^m3P`r>Y;M{`)W&j{r$yC}d$B#Na`Orr*$wN2oG6XvzgHRj}-XEvRAO1=WoEUc( zD&tU^B=bDgiWMx^o_#gVGgaSjpCB0{g~?eUhe!Y9;WrWc9|Z3Nh&vF-|nI zGYIW-*nC0<+YCsJna{^$RQzT$BrYZEzzuV~w6z5-%4!N`T?7(2S{*Q zBp@Y#Kmoadh2h->e@c(w{ILDtedoRTXiv7ysS64zLK|iXPaWxJ=6Sg$j`#Wq?L8SK zXWh~e{D0fXUVF`bFP@!q)`&|_OZ=02Uo-639h-#*Gbv@gmPDq(r(4FhLQGm$>lLzd z&1SH_?TpY^Zpdp42!3{qgb&i--2`yGF9C>G^>o=FDI8%_Idq|QzY~)p&Tiwu<~(KZ zne1>e5aXeB+U&vNe8PWh01T;^mh?8?Wu)=oX{R$WX+KF#Q*fsB7II^@pGc0)-p0)A zaq=fyN%QSABl-K-^QL^QFO$Y<)4B79W3n7f*eK_&tR3&HWw*s)WngFR?p{ng{o#a| zgm$L--c=9j`I|uP&D>+I?K27Y`Fq~WdF7~r+C+wPuC?G;>L`Cg+_`&|c1g9N=So5l z(F3NUQ+~PUpVn93>k@t}%kVeT#yNBIKd%VA_}maFwmR-RuH5NRckI^2FGXSY@ARp@ zDJ$pg*S)Wq=bNe$*v)hsS0^z1g>9FQ(}{@-9k0D+6PGaUMuOXxiMh6s2V{f+?fLAKZlzf- zsJ{da5!I`S^GM9u;bf(M1PpQIF!+m;t^UMXqNB;IXR!0fn(N@jo2m3^Z?6Ma?agCx z@oNW`C1umK_iSzAfJQ`Z?Tr3IBZN$tAf3b z2Nq$gd4l9f_1aIGgF?+)(Yz-<@46pH2WKpvnU=Puh2Hu##4OI;^7Muh!rG{SwDf zrg=M|l@=q_SU~72JgC2_A0{_gl$%13(u*9pVM3=mcHoqrAjNIT_U1?Rt`8yxeQN@8 z-{}qlk=v#paTJ=S-Xr-@@ZJt`mwmtPVRruxxUuGX`)4&#gX^#|k~>Ph%)#{}glKD4 zxHIF4;c%Lc+ibHh7bZjP&&^gRzEYxdSetdzU9jE#kX&p*Xd?He&sCyV@OK?>ZVW|5 zKh0I!rI)KvsRY1%`@v4n8mD1i+u6!d3fp)!W-eMw^U-?YoC}Q1UkEg8Z=vGs>CLZt z_Ty$4b^#87FzD3tr`Ar#kM@nja3^)5F9&oB&Y=(HPPWd*YiW@na~L18|);;yzn9;@)SqrK3L_bDq3-{kTZh*@vIM zy@j|e*jLBur#!ZZJ=g~Gy{1j)BE+K%Mo+#$xmL5|WUMFdEk;}CDVuLNB5@1!OwC0V zQ9_mS2<&(q?y^C~qWpO%?k7YXt-8ri-xq5Qw3R&}DxM(#Ftj>n@BsLjZ+vbvf%b`u zph_3=w6UXW4^S1A_0jDgAG^Y@v8Y;w046^5#4cPJ7nd($Rgax-EQjW&2D7p%tMW&B z1iGq-gRr(Zl$Kbe(u*bzua|fBtuZsf9M1HM3Rm=|lxI)Awi(i#~jAQlUSkFo+6M)WW;zyzV33#zFjmNMQhVUSSZ{1u8;HkOz1+m zAZaxI3JUlSAb~eQvqx{oQ5F?*{Yv7sjODyebKpAA`ZLVOy%-oGkc8grTx?Pros zIJvStt-x|#Y3SC&7#va&H_W{no6 zwL~7Yl;_wtK!OR?%t(Kpy(kHcgW+inAiQwhf#2d4@n}ZbLlZE{65FUHj~$UC9%vP& zD`pg#Wrw^LT8HwGu}ZK~(A_zh2ar0KzT7`QROyhgJ%$OMZ7;j)E-9Xa&{l(d$H;GX z+T*U1JaXC%eEo~g$9*26*dn4?{Wl{QojV6l&X(g(G%3cg&Jv+t5u-x}GKuSYooi(e zi#^9t;d}&^M2l%HH2rOuAkB4gPKqjQgRI%^f3`gHj)0bAS{?-rl&^j_MO6_l)TX1m zMoHi+hdgr-dgk@wef((aLQP_ZVu6XLwu1!&Yq5~={{Y_iw-I-XS!guBXKH0`iKD7d zb!@)>{Eo4;$>yI5J<<>etPjB^U4N2-Ywu;R@mTf(ZSLhRu00J1dpsH8+#Er>cDd^O zJQDL$QE?6uUzTy^${0p&!U)vu25$%@tm66Ry15;1y%!3(pn3l_{Y1Rcl;7RtCTyBv4P~p%?lxoTAm3S@#f*8g|5A5-kUqORryj7VU{e;_^9d0~ zhT0^EUxlY#7g;1-hvPde4c4qlaBuA6?F?YxWgOmc&b*!oS;fQLgiVfX=(Zm1l@REr%hXMyvNs%^*_({H4vn<0);hYoNO>H^&=>= z#Ydg%Hu3L7P8PpwUGb}aGp>7>0fskPQFqA7Z$GesfzmvVNzw z4;NdT54yaby^ki}(YvDU=I!=r`mqKs#u`t`*tw}4l~!bu$IU-ao~r}r3H3BR9j(CN z%f*tCNB9Lg*N{f4k+e49zIRa>`tbhl!^M5=m&A-ClBAysWT8e6vxwJna8tU29{i|D>AL^~XKDCbqKNIx@u&8AWyOG8%c{<`9~sB z?Zznwoq8UG%Q|{MphQiIUG#Ded}dqm_?hlbG*6t8vJgaj6*PO=d`k=tS9+jgu5k-Y zuTi9;231NLW2f{&c@Hgeka5%<_2-!& z^f^ivHCPn%4HjkWx&{iDHG0Yg4SLTK=xpCa{TgJdmjysU0R65#e_(!Y%YVk;z@`JR zwW0d!!8MX$+es5$HpbgIhI# z*6N3t5=gnfnTD&=kIM~f2#gtUD~Um%(GTrIEa;hy6|<+|3U(Db<=4XMv)Vi8nU4}t zQn(+c`$-QQ8guuISsc{@@>*;}*_`-K*iLvug1DI)6`0ez4a@~n<1`*+QOsF@3fSYS zfHFx0!IQlD5eR%57TUc?oRR?uHJO}zDy3WKi7?5!uaTrEXdcd^Nt^c-4J^A)IT6;T zKoYE!*l;WHzuCmkS4MSf9xfG86wdic9B4|FR?GY?BDr6b8i=8n?pdM=PgS3omr_Ku zMQ&wl-T9_N>gn?g6Q`8pv~WtonBWheM6=RhF>IYnCrMF6&-_#w`iGHuKbDbX>}N8> zIElOwe0(Qo*FMxJflG$FDIm%=={F+LahyEaWz-}lbROY+iDzpsOQX|j3(L%YX!#O1mzeumI-;sx6kS&?XJ# zOD?Flgzbw(ow)+lQMcTN7jc!H4`R(v)!5kMQ*qRq$KGsgcfCrj7}(|Qm9EQmhTzaw z)aj?fK+QSW#iM&gAY3eIe4d3JGf@~&5Sj8V8J-&|=m(*UB*a4u+ezn2dM6;69{PBd zbJOG0K@ah!Y`3&L97=ZxvPS$NrBe^vDJDpIz4Ldw##x${`#bNf)3*FPE1bnw88lpk zz#FhCMrFlx{)uvS^nk_3d%~hbDG&fEa#GM4%Lj44O@Lgp-?vWcVFM`OI_-SfLqP!c zqt>apUd}8!x~&DvZ{>~jp^-@%TFR{O`y6caGI{PJUw}(|8Ky6FEGeo zz<|GCTuguAmuTre5nT*SpHQa%z+ABW5A!En<3EV3{}BH_0U7jk4F3)(aF3C+@TGzE zf8g>@Ji_l;ipqoMGldt_oyLj3|JH{sE8edhK+)tro6nXQL($%jl55kml z!_9qM8JjI}S@=_z@O?;%Vjj7Cq|-S-99?km0Pw-Vx_wtP@cX#^MEJGD-SRMNMSqEQ zQNz0>Q~40hCG1GkU)j^2T*0u0HYPq=Bkm5Q9Z*D0Ji+a%ZvP%EHU%skuPw)t+r0z) z2{VlPe{n6{7jou*$9ym_Gt$uhH|B$dmGwU{AE$1R%5n1xAF40zpaHylCAdLjEH=~M zFPysJK)%C?3JL;O@8OFjlRz@o%9rS&)Xh;D9*Ign;M?+$|B~Za=^vq>KigqdHL<6w zO-&E&dHFcwqz_Uo>^OXRpSG^=dCU#X;rN04FRDePEAxUpfMgEA$Y za0wwjs9rlwi-t?c5*09dfe#+FfgF$w)4bVX&GB3lV9@6~?-M0>m1yXXUWa z&3x~U5QGv~3sMv(F^c?oyh%e0XFd<>zoA51_}gOaI`3Cb99SHyaM|J;W#0%t{XHiKEiEhhLi)6(-iJt^W@IUqGP0WgOAK zX5`nCl%1(-&$macESw(fJZlax%X0K+{P;2%zWng`M8p5ztMqeb2Oa}ddHF%;_jJpH z5c+<@-#DnBYs>L{G?~)DjlNClSx^Y|kt5MQM!zaW-_NU%Yc@S(8h|EaJ)u@cGewxm zB>c4iAxuKok5ezBnHFZL5#UoeCd*1LvRY&H&s&$sk%(C?V#6>{yIj9V&Xjb0Kh2V* z5y}CdVhe4j6W~_nFE`#7AA zP$*5IrSvcr(FUra*{D%R#fU{wZ>pj#;38_Gl{69ajHd#sp!dXZ`V{MW0=@5`Rg{7n zOHktoEruLkqOG(Gqv=Ff(`w|^Aol>>LnSnfhM?E`=``OjoO~b3go2i$ec97Qv~+>$ zP|ri#yd+!mQHht%^LUKnCR)kYs8K7i@OI8XKVcZ_9JEwU_kpL98~Qqko}`aCi4$lz zW;2&Q<5QUDom7vpOvKEVqMjU66*!Dm8{cC7A8`xEqn&jac?BfzPqRfKb);}Q2T3~U zINA!u93&S(dLF7$G*QtucA`%wrwQVE-p0fD5TrL5eKtWd@6l=DG+O9pw0=MOOTp@O zemUt5jJ^ZP1yYPKLqE2&nOw$s%qP?M5oY2LeW!M6C3<{M z?b2dML+;UgF^(C~o4puA1$u}jCvq#O9ILjRx6>5XX(Ugk<+McvLsK%TkVbP3#{N3S zJq2r+L-RQavDM)DN|Tp@nv@>bksb06rRymfy~q(rYcZONjB|7yC4sI-i71T7Gm51c zMY0-4G4;gBrK`1@0`2aM@vegGZiHS7NW*%^t={3ydPDGcplApoF{tli=ef<7O{NM zLkxmeuN6*hIW_T{(Cvr06Fo{B`FhU7>Q-?z)@my?!)h$U{_9HP5dV(;O@E_D=w*7A z-lUCKj-MgPG1eu47$EB$OnUX$Xt75Q4Ogr&XE?lRS;Y_Y99z8)*G6)De(EMCE- z+=E}`SLvLKUFdW;(`;BJH#%{Q3w`nbfe*&MUY&465!mGxdIJ)A0Gi*- zJNTb!oXS`r?wudM#(!*^t1rzv*PnzB^LWWh29o_evS|x1{dDlk#~X4q*0){glP$FO zunM-kGQ%V)8_XY=#?1Aod1q5@KLW8Y*_ z0v|`pr~EbVMvJdP3J;^NBk&vEqWydoe73u3KkZQ7-2HSXG%%FDhPLkjy-E+ke%!{F zgLZ;;@I!p;g0$PDAT>qGIacWdaW1HczNZiQpIEQAkR?X$WAa?CueuJA~2VaKf zHn9UcBZ{x!Y;7^Urs{9tm-unsqxQH%QIaB~jrKwU?Vm5u2$Tl5ou9vz+n*gj$0uQx z}U*cfw zQm-}juD{0;$#ANNxm6+{d-U%CoD zsl$>tDCuc9>DSYXK0DW*(Ow#Sxn&|u#9$0})4w=K`63S}U!@cLpfKp$cz7Q=SbEW& zk(;7emZ*b&EK_RedF<5d&}|LwBb~6DK2_e`c38nqNR^(Q6T7Q3>TOY;-Cp=k_rS7B zf7yv$HXNm-r~GF{AHf^h3!S@%QgEmFoGNjnFoP@@j~V;bA7nva*ty)N%@6eXoU&)1 z4fr#yfUbDz$~+53Aid2?ZI8#sY`e$kTV*ID*U2lrG?W;NQ)V?) zE2@Kpjsoun9l$+H(mNQPybm^FJ>;D*6HljcGh0EMpkZ6Vb?Eg*^eSi2M1O#1SEF() zUMg>kJ&oIB7-$Zsa4%2_eSy=E;Tz%B#x0_w=!pB4OWgt&(IPPjC&~_>6X(O?T`Ci0xFNEBlgb&vdPtR~S-XjS8?Z7yb(7IXHgI2wV7CqlIjs4Ime81S@bV%a!x! z%6!PW2{(~F>dt;Mv}T8jZAHC0`WJL33D0TR=WF1X4^{RvRNlB?0ej+Hk>L&4k+HZ@ z$eyCHx{|xWzjx7e)QiAOW$mSCb1S6m6hR`07?gx|r_fBbbK_|scIYZ~az(=Lmp5_? z_R$pVZ+U}T3A@_?Bu_CDY?b7bZRedG_lenFk|m-jj?>z9k=%W958&ieHDo_~AP3pM zWZ#as86H$&OmY$w8F=}cL?p@CA8-)%2uYdS)%su87^htdxuNkKeXo% z=!|6F9a(xTlBJdMy{C{o3H65{Z58HPehIbv7%@f+x1;uX*aH{SCG|uQpM+Idqu6rE zt3au@tJ{&RvmUh9*sIQ__C&@!Pz?6i#YDze#$?bEP>kU($F9bRv2YF7sdlHRd-?od zo8zy|<+t?Rj^wVBclS{2(Ls;{^s-&s!b`K2&z}Sf9HFEuUyjQ62FUZ|v`OG~kPIt8 zvL-wlShu8h8XFsar(*ySmq}y!8J4i(b9YQ@D4##c%EMKc=AZJO< z;;*1#`<4HY0PRb~n#yx=DNcn;tPEQ6PzMiPYT4KXYM(AW_Ls0bdcl?ltFuUY5QPYX z5tBB&PSJMt#?EKkKt0&uUeC=8@PAp8mWW)CcIKe!$_tGn7vK zff+Oa=u+=;Gie}j1f>GA6lT*P<23fwVBkm^0?ehMz)`@jD38*BqiGm0A9#u`BPVc- z!m*SN97h?(m(VeZt6dB*4POC(OC z(ZI_UUP1ZBXV~YL0ZVBNu#CnUC$VeB8S)Lh#2HiotfcYA33#^>XVC;;mBK5j(D)Sh ztx3Sy3a_Tg#wYOCrvU$;@ER%t&INu9yHgCjj!J;lz~k5#(}45oa^M1m*V7foG3<&` z;0;s;Ttwx-8>zzh8{I@RfQzXTxCHoD?82GA8kz;XS>Y{IWgNwsC-IMT6>u5N2Hpnz z2)DAUfp^dx;GMt^sh0i#T&{2hT?4#}<{BTsT3!oWN!I~aQ8f^^LgRhx-+91$72Zel zjU%uL3xI1BK0phBYv~5#Fiu>F57AA)bqd$hV&gsf6DMK36PkyZm6=^kJca6fG7y}<2szaihDK482F`?wak zlO6=_QrJun8E?SqN&E|~1MZ>qz`gV*<8^wO9tOTb8-T9@_t9x7s`>-1;f8}x|r z8ojA-KRpI~iyj9a0KQ6Z(-XjV6dt4}jaTShdJ1?*;d}Hn@G#XGFT;9Ee4m~LexUF} z+60gGBYF;aRN-G~v$2Q%Mh(DYv;}yawgNw<=Z(L>u1frrUI3m@c#>W;cEfjT1b(jY z3u-c&>F=~1_@%;Av;+7Ra2KrlOTe#bC-98IZ)lgX6Mj@P@H^TK{GR?|yhJ}JJWG3k zKhj>{KY%;vpY$^DU-TOA-wMysK4UwbSJ*7B+ zoBq2^|8LmzwZGf+-);K;Dx3cQlAoUaU$p7@zuWZxXw$F#-KPKUr~gNrzU_aNO(*rP zPI6c8H*@ECzLCp|NQX5b^)Eac3D|_ovF8^-<2Gqatg-Stw6MM?JVc`*-I!8uziH_+S+bzy& z>u&E6pOBc;vzH?|rFWmc{rV3Wm^x_ikfCYAoRps7f-TL?8JRmOZ*=};W5$jv7(ZcR z;iSn^ii)R}OuPK&hVOhhdYO*4IMH#b>M*h{rdLlos#V6 z)iWtEA-;#byUiNcEw*b+beE{e&YdE{!$L!XI|g+Kv;>&_{Y<(hn38ksBTKFBgi^Pj zU>`LqMLyfhkWkhxq10_f(#VU;xUHqCnDye4E|i>kNlBNdq^qqYhghBDOi8xp*sbpU z*>-CqPaR)`_+8odVypYKijPt8RVp5YxXp$N)|{xSY^$3~tvT+I3#w{!O0&^ieV`@F zo>gf{Nv3*BAfkbYxg+g!>p3!=RYXMQq}2;D2Vqd|XnS^!yNf+rj=-(O=akKG7mP2; z$&Rtvic^x^oK;~jcawdDJJ_L$P?qY(?U&{DSKU~zl(V7b*81e;+7*o<-k(-yHORJoToRw#OmG&H&QhJru9bg|}ud2PO6iX9b z>!t}e*czgvT}?PjqjRjag++FoJ0r$kT$bInK7wi|+_0sK%i87QoRsAHkWi0c>pKQ} zBOQX;M=IO$R7@3@vHS^bl4Us}dma?RZLP3kBt>@2X^4c%Ayiv21jXXmJN;YClL{2^_5-k3W)t4NCx-k6BdR4$ZqT3ccHP}IS#$K%gWDfNs-e>1dF zrLc9RJEU}!2a7E>+i$GYXnZ4Uso+92?=anIj*Fj%UG#j>@H*6L7_goo@(ZWd)>sU3|yHsYOj8Fv@on7BvVKS*0V2>w6%tsL2YOt5QWX%4VEd}kg^Ra+mNyiDH&QL zvG$_&LPL)@biH*;mmdAkWJYUS$N&p%wYD4=u{iAtZ#dl>u0+@i;VN%bOvd)*XZVOW4GP`K&F{hTzWL6htyDTCp}6ce^;P$Qw@4CO7nt+m%_WO+wR~6>iiD zfh!eGS2#}LQkA<@#jjEEYg9Z##WTEdiGA8(oWfv<+5~MP?xS(qcx|)_3$z^ETjR8G zc$VQRC9EqloLHUAuA_Zc4B#)SRN<&Yfhk5OQpVG7q|di3O1pgWYkN>xRTLBvX+9o ze4J(zD<}e?)f>i%4m=&a z6ubev8EmEuPmU{4WQYuHoEWF+(C(gFoX-9#95Bcec8&Ff9isaOXI`iEgqV8L2C#-9 z_r#EUVyeEUIIw`~B+@SM0q`-f6nG+pkqBWVVuFdNpQuXtsd8t)23Ugy>~e_dsn?_~OfFGL1@xSA)%hMw2^S%NO|*M{vHoxq|Y`t?nNu+8fz|Gu31t z!S1kp$}b!dg7vsq-?!b{%Sk%adOj;Hr-Pa~!PF{9b zj5jPUmUW8ib-wGaV(PpgBPt^-J#^^E?4N;BFFG!Kq8#lXFp^mJn*51H?q_0)-Th_6 zh%L^C zF<6$1mw~5TH&w3NMdj*;+j6q&Z8l$-;i}B=i_6TqxXdh7W|p^%<|$)qSH}N1*;E;u z|M8!c>Gm7S#Q$uWcG9dI;rI_9ZlckAxISxR zBB8XrqDqEkm5qGZUYYIAvS(ZCM=$zmzI&0(9&OLAr$sr1MfHnZmDvrWU88gCW!c4B za?5&cx~RK5ecjdfD*Ktn%4B1`WM8?PekOa9%+8g4ZIXR$l6~d6a#deS>!Frr8c_`2 zRE1kapalwC8e=OS(K%#py3*!hwx}gB+jQcmC=jlC2VDDtz%nZ(GbK}IVVB9Qj`Bw6 z&5Bww%oekapYmpfAUV`Nf}(P+%*J1JwKwt`|EjC2=Uq{KMYRmoU-i8CV7W~4%i!|} zGsx_q&bK&NV`-b0gI6dUtyNbS&m*;_)$>WVHc!HZ#@k}^(K1)JR|2ZO^dmLHK^{hP z)$U4!8rEfzFHmMLMdpakk(Kn9YBk{3=5vOh*;r7 ztwMT3n{G}v`WoMHv%b$Lr$^W+4(rd+n{=AH>(qLyvD{c^tf!9jgBIJe$LMFwL9Izt zO7rO^jG%@dru|$jhKpUso$5Evl}LS&-e3n5suUjG1eE?Gt)(W~NeAeCI?2qzoWwQ! zE*~;c%ih+#MxIe_TthiDmI|l_xv?D2nPRFoRokQ;Y5BDExX}%57t#V+NH@|-_51H5 z^Z|Xuny`pMF-hA*F*IELGI=#*_An&5kB+gK2XY#__%?o4EYP)I4anQqo^d z>mbv|X*2Dmx9J_U`K|iKWfv^|B%a2Lc^Ti$_wnQWEI-Gmgh{-wY1+;DEBdL{!-mCp z$aot4#!y$X!q-j48eE3;+)rO(e!V!EGx(rzh-8iR4lS*%1B_f_sqwOLgzS`vvcuum z=Fk|Lf>GZ0R`-tz%o~w61O4Vhl9KK({nFU0rA(C=J>q zziU^mz8Cwb`fbJ*XwPB#nxnWI_vJjE%tc(vReTN4ykffyOT5BwW$H7-KQb!Wb80{I#aBW8HC)FHyn~y0H}B&&_#hwU zGq^l=61_pgunQ)MnV7>vqE5KQ2cWa!U$~YhYyGtWxK)&5Hn(ecU_K9MN41l>&^zh< z^ojaX{Z*4@nqgXFT4&m8dd>8uUx;6c*G62hAoAVpn_{<~u3b$VaXZkoFU3LO zQA$tn4mu}BLDLp!`^82vU0bK$qo?x`+%I)+)QtZ)ij7JwVmg?v?K{Wf12yH zQB=?8^nLn1IN#?W$yjKv84mZy(CKyPZ?VLz2(uZN1We3Q7EuH?1a z-}!NoN#m$es}>`9P3u`bQyTz@ZG$z*@*8R6cM(-HdVXe=z zlY1CezSaoj@zC%qHl2gjyp8Umhv+XjO&-I!l?XXr25C-%?YRa$GppDg@o zWWAq%BX`&;m`u8iXk_s-A@YKziRb`-nf3xx7xTCqqa0&HesGRyagGi7(K#lh1($kf zi&JvHz5_ySq4Bm*+bo^VTear%E)$(2tKN+LbjtWdd}1=;B#NVPuHeIgCj*7q-$EfA zJ}(;0zvv1NqUgZR&xNG3B|Y{zT%-Kie}~A!>Cnn!DasM@w^O2W#lA&;y~zLeGSnLbq{e5@P2TGxmO?c5vx8=7-aeoioG*c`n%#y^)vCB)}tx&|kw3@XWUg{S7d&~I2j z!TI(cqs;+fv0cMUMmHMG4c${!(8CkNs^Epl)X^_Q21VBUiLAn+7}s#qM$X>o>bWt+ zy0HhB@bZ^XP%$F(nbJqBcf}t|bK#t0Fc=Xc6h*7=kMh zO@)N73f~y6h3^pGVt4%?#=ZnTit_INd1hvJXZD<#-JRXp`KBZ|>l3XzJbY|y z_;B@W0V)*u5pu^!J9+V1tBp+_0ELwCxET?RB;v)QeXQ4FubNh4<3y*qxzQy#4fLd5 z_3>~N5?DyQFW~V6c80+e1vz{$M7eoU#-S(4=w9*epvM!uKU^C;pxx!c;oaoj%9jW1 z2dTrAqb|GMRmle2jLl=iznqBE3Bqn9a%&>uYd(<9eJ_D1$9%$aO$P1TSH_RgNwbLz|)hEwKt4p1-eYJLBt z0o=E%p&{L6rq-c6a#AlME4F}-ApBo|4}G|A4|@oH*g@^m4Sp;l6Feda;sCbnPBbh{ z4^Y3}H}#ZK!ZW|A%Lq4g!!Z@U2l)#ceTb#j?FyFW9-vl2sJsvB;d^{*J$TIsc+K$8 z5QLo`a3AQm6SbnkaJii*cX+5kMuvyL(c8#TU)Oz^+CF`rKNXA3jQi&WRTS=p=2Ybr z6;Dq=6FAMM;&~`ECjxIpdS}mw_o!Hjp4xMA@+1|d(tLXcoO8SZPNTint-~{aVmfW+ zPhxWxp1EgwV5Z~5gQLK(M?XP+I0B=ev}&&fsJ{#hsTPx*lH_Wx_8gjf!&fw-cRE}W zT(w<3Z5p60_>a;W4v0Jda-F9AL^sRGO_TSo7 zkEgcw&fc|?yuWpsL9&Q$mtC}Qlz!W_H{Rc_rZ@a-=BYcFCzca?Tdof#Ww$5r{eZ_Q z7vjy=oOW6^GSw5k^z`pMF8qVs@ekv|tlj1b>vyn-BWZ(pXKt~935|*^`T_i*%1;Y)=#w3-Ew(Jqj&`&(3{YP_J&i*J z(|M1%Gms82|Mk!aWCt(Fc3Jzwn7;Ug0z^}M9nJZ<+`z}y{RLKrZl%Ev04Yc z6Y|jGSuu&MMspH780bk9^h%9Wlenz~n$G&JBjuoe^S#ug3uZ=LG*=W@3Yv&5T;*L8nAUDlhz2>yJ-(3S4s51I4 zU16HF-#7nSopOcY3hs)wm+&hg-PH8_x~0*jh06`sbX?cwSr~`)cRuaE;t(M8(Qn5(fWD?aSnL1OTl#v7j2`{`th!f&i5q} z@d51F6UeGIWk22wcmdNo)zylOomtwHE_%AdededyvwHc2&!2S4(X$MgR7Puu)eCX7J8n#@TN=mUA|(5f6KDSv`EG% z$W~`puq$%n(uGG#(YXPS&5@|?7s*5Cq(m(Q*0dOK$oBgjxJPwVC=GplKGRR9?3ahMu5q zK~HREM>V+8gSZLUb$A5Kb!aj~d7r?Mup5vG^Wn&s>2NqrHt&=x$AHy*2%NrGO{C0e zp3=FjcB3fi^*Y`q*_|DBT@T0Ew_6p2crY8;_tGF>Q8$(~os@eUz7PBh6!uaJ#MxRiZYD3s#t8I67gCn7bR-#f1K^-t1F|G$0KGLX8R&O zdB=nJsaHFEd{p&)-gJJ_Tt%`y{>|j2)W+E~@wBZdrcFZ0hNMgzE{nr0_gCaI*H|J8&GmU}d9kF^xuwe@iv>-!_> zV_kiM;O^sj7WWwp>>umQ*er+G-gS`T3V1?ZaA;zK)S)@c$YFv{c;cTzH5UlsYC;H) zedusC(ojDnAFFZ$2_JZk_7T^RJ{7E-rH$>-Amsg8cv(dHBvNE5Z&I)0JOqSB)%`Q{ z26_*D2FPw7gTJJHir%mpf(FX)EWQ&N(S_JQ5itrwnk$5HO}zLyEL7g|#^orD^CNFJ zL}jCy$Yzi-Fm`G!@KBFxM$dtl=_r{YnSB=I^AAv=hkPSvxX9R#?WERTdMV85)zQDu z7=4Z`$OnvU7i(hPHp$itpTPm-u10q)V8xE7fu}32y>nVf^ZD%7DYM7{KmUW#Gw6?X z7eYX~P@TeY5|%l-6}53E;ZwLi?gH*&d?|MwdmXn0|A>1KKf>)p`|z*ui`?(=2lylI zYkZV*nK*13z%T5jO&zF@8^F6@Qhn@!0*&dngaN$&sb@91G6FfLCYSzl8IKF5xkg&w z8#zk=aAl+(FgdJ(tW*AVW=yu3ow|ozR@r8P0Q6V*+(&ezeptYd?-nUzba3F3@$%5fHfUVd&M0XT4#@&NXlMuAM+ZbxXU+(XM0$RQ946o7 z6V(MBo5K|(PX#+EBQJEgNHdQ8CNH4Cu>d=HLlyQD1YhK}WCpYyY>rTtbw&^!+@6NcBZ71Kbo%+LTmCx_JVrnsb zOKJY<*Dz1|kz3m5uf62eQdEvs-h1wuOMYF7$O;ZWN4)JYLi7>lC}h2-c8RQaVDzYJ z6ZDAXysEcX?DaC7ZIF5dnekmJ$D7SI{vgLvWJCueBG&0Be2}ee7Bz@o#~}3<5~!t5 zBOS+@Wy-N1SfPMi)UQ<|S}F*5DdI7IfLeuoz~z2jwIEW-Y1b&6mO6*3*c^=`tgnWj zKklNw4wW@6j|H;v_%?xushe?##I2DPS|kfqK6P+5*~rSw(SM&sz>izByO_H9BvM;g zQo(r)B=HvbQU-^r<&CGkri_jOs0j>ruhHx%MRX8FI!CH`#QO~R)SuO?S7|!g_C4!{ z#D?UC)I-UKQv1z&(ws#!N=0*Pnn^{|fs7*&NJasN5lgXrEDlNk5=SH^$&N|#k5AVG zsXKrVLtr%l`Ncq-InHSI4B&t6(SG)RAj9DFgiyaPlww^LV8l7#8ht1L_nW8-Q5OGj z%q#h?hlx`T6G{vc?F9KA=7(@ijHoI`@J?S)5#3TO6nBQ*DzZlf6}y5C6^jZqHSb!t zt}1VMp?=(-S9{O%R403;x4H8wO9g(=D@%8Xcd>vxcTZFocL?aZykEv*k0A8LKZ zKInSc{<7m$*B|VEa(!a|mus{jkmvR~BA_^705s@>PKvdeGD(3hz(m|g7xf`I5K6|g zGN^ucC?sYF@Qu6UrAELrH|`Zn`e>nWA;gYaX5-v59Ct#%-G<{7)C1!Upx>!?GC8Sct zN-?ey8mbaziHTN#Pi8W$<^ERG+K(k^td3BFmemqLyha9H+LflIF(0WaiMFr#-d6)F zj^u4Fo_E~!_$|LUXJ0wsk>!*7Z{2#u8MkD4!6dlPxNPgTSI(s#YubD69Uq=m$BVq% zw)*K+GjBeP_!8dKx9H~fCI{!@lcm!ST{CYBFQsTe$}|-YhCuL7(=?+C2P^?nVM10&K9H~cKH>%v zvcZ_-qz9<0RU6h>m-_udWD8($g}@+n5enlz)dW6-gewo`MTUs zs(T~tJV8zbck-WVSV}9wjBmxOf(%Q-kq`fCwIRh^~hfW-Og~+b*)mSvbi>Y@+|3L2J9gdr+(TDheRaqJG-?J3Ajqn-5fLk(tVNGc(!KnT4!A1_Is<@(tC_5$zmpQU*rfRE;Ehz|#tA8Gt9(G7Q5y z7zZ0?;%wSJ#Xi&CXJ2l=%zmwXy|UlFS9!OMqF2*@>$3tDMKc$ zbLp)Xr5=3b!M(W>O>^D>{AX1PmK?f7iL zR0l*&uHTPa@w#zHS0)7!ex$5XeMlfg*N3ZXER)KqzF0OCX6(F8u!%NWZ?>2$ls?O( zRUEQM2JnwnCyE;Z%f*x=3xgS5PQ_tcki28UF-t;4DMLa!JsR-o)B+F09j(};ITP^MYPsnfc^enQW3}P16ORRS zdfmuFB$m*0L*NV_YMdd4>hVT(nz%Fa68aQ< zYGyo)-{ipQiEWv?bC2K$5__pb#zFI7=2hcM8T)1U z!7x?t$N{q1<%>pkfSJ)FyMYbB2RX7ENCG*lb-)pHZn)C9p@&HiyR|Wgxzp)}+nr?0 zNyeOH>^N$$U_5_o6~n~%%B4ZyGO37bpVX)A%Px3t`}X%PSbkP|%I~(^@#d72<-YH( zxo_LWmuz$W_{uAP{P^0nk5kt-?mYYUciy>u@y@1V+njSZ{pL5D&h4G@(Tcn7UViSa zw^j@*ckH<6I}bk$anTNO(FJx9Lyfps%^6rGZOEYfqspM7kCPx7%|c^!Lu0W98k)=z zXd0x(Y$EFq(R(PYn>IOQ8RcQ3J>+2T$o8d+VRC|7|_9 zh_xsvZZ#)NNiGfS4|B%Z0p0t7T;xFlKPgAlVU)I+LKDcL+l&-;c_ z_5k%TYMKaL{P4(OZAobOuc&GbhdYOAC8M^9z?DekBT>d_v6`)vUH~{_=N&ww*TvEt z*hta@Hj;=(oC=9lcARGj*<@2NXoV)qhhcm#%IOQ^v1?NBLgfqzSp9fBhCyF*(y>CY zrdJIuPs(|y*p!G*sJEq=KGd~)(HRe%eQ5i4o^9%Gi{E!-`Nj@-2I@xSi6xOYpTGs3$Cm&uMBKTN;<@~wMryl%Iu zW*QZ5D2HrYbyVea-qd|DN?D{xj=8d4mf;%A>pMY}ht{ zJt_zDvwg|`RAL6Oq*_c();DYtmfn$(zBWtLiM2)FY8h+@y4AYtanqy2Mes-7s89YEe2KEf!Qx?(eb?yNi1$ZSF zuv<&HhlhsXACiaNLoyG|Mz&VrWb5YTui@Q-4h3+VpLtoz$nECdf-GHU5?q5w$`hMz?`fFVLjA zL5&>Jzi$4*OdluB$x`kUG|7U5yG$TiB2^;Ynq(oZKBk({GX*`?gJ63v2f>CX3wGr2 z|3R=51vp&uO6G!NYc$Ey#$*4eNw%WbB#VE7e^QeyiJbJ`n4bWmtVajcu4yd3$9k_o zS*+WPcUkBJ7mHpMebUP0SQbU;UV!$Z$0o(rWKGg`ThT(3Ey9tcH%#ik0LV$d0AQ_iNCV>KT9^xXLl(go z=lx;=Zt;4oL30udURwfNLbfEXf-Vxd0CJJ+R>otv0^(1NFHRb%y3_GqMcoG6#r=og z+yhsg@ZEU?f83p)HEZX~msMVwmo0Us=VeMA6m>eWh8yS1$xU0eEs&b8U7cvQzwo0) zKdj81w8sX$HTnbkEuDZ$XgV%GgZR(0t~_$X4fEj4TbNB<|M1n96n}u`44lMvlC7 zF*Y|@llTPvw6P`VF`zMqtjCt6i~6yZ;u>Uzoa7W7Vq?Sj%G!8=Qm7UvC8r=&*DGoL zSe~N$&MM<)YepwVEJ~DK25CyLc-W;S~3*unP8w~oq{)pG( z$)?i*ugBr_dPG48P&o(8LWxF=5anj%ohGGj0y|{&Ft>N zi7Oy-RLiXWU<<>Vb&~FgR&OPh4{b|?wrvmWb)!xzdu)WzxbgePFLjsu3&YQUW9|F@ zeyKfe0GdON>S7T6jlv18S!5W0;|-dQ()8scZ})4vrYgTAZ5LjBRIBdp#9ONvN^_{&M)ED8dveFgjM1yyJ1GC zCwz)BGqb^}Yp_iXO$kqlb*86gPP9$uS*{?5d|_|QoAwr>wseNQjDJ@7Re?S!bV}^v z(1y^ay4yn!hW3WoEbEix3_^a1Vs#me{cK&xN=K8{hET$vic5(&8}J9}8yX~*lGtd> zW)7MQ=1%i$^J4Q#v%x%ouU1pJ7y{>`Y{JdLbHZ!Fd%|aeUhp&}k^!tOvVTUvN8^mk zsy0EgV}EV;W?3tW5he=y(n>viwK`cV#~)t=tL7IaD>{rOdpr|MJ90T3Ge&bbE2eTt zF~xHjO)x5wTl)L^%kYW`(Mh<$PzxwEMccy=eYDgQ7Qzk9)e>eHqke4wSU{)0VUoY+ z7Y|V?-b6;K7x9H?W*EOvF zaN}!Ca4J#BM?sIZT$jJRDu{TV0 zvo1f0wtc|3mPcd-%|U;bo%cFO;q_2*qxX(uCh;rivzlx5`v<%T(x-_)Gq%+|%rdzP(P_r<~!h*xa- z>7qMll@|17PXT{86ZBC4eH5{%dKL#)>euRN!DP*dqTdwp1&h(B-$!$Lg0*acPI6YW zHn~$jpMtFD@VGK|yWi84Ck9T{XNpCCK9M6eM=G6($NjnB0A8WCdngz5C7da>Z5#JbR2QGm)p+0#=XaV#_70XJf256K1bySAR|h#7?6ShH`iVe z|1N$;s7mvUmF}A6hRBXx(u3et?gtv!UyEiV)sjB>2hnQ?@n4nSY#;B`BARxY$&9@* zK2DY!u`sseC5+ej$FwAjmEtDusg2;%sSQNz$Ic-d>DOWyy_$@SJcPA+G{MePu@cns zSY^*dwyL~KMqaJVT&%tGDQOpjmbQVG)_|6p(C6x+vvt_UnKL}^=fd7VF%t268*{e0 zU>#MLX=?K4AdNJWG$P8*j3D^scowDj6qU-vV*YF-8kd_;Oo<~TgH|}1;@GBGE*3{w zKHHn6vqaumMTsID=Oc0C4SA_v?{@EN8V=EU=L#VnBmPSMX8tpt;pO7j&k#QvPbnaL zzNQbds6q;yBkdEq_@?yHWG$5cgA#E0o9n$b6}0^CI=H*K5M1$&>A+?R(Dx9*k9_}l zB^-wrEXMz=0?@&gkU7>v=4i)pwe^P3)(}eTw-cWxlCwp07M)dPsRzKWOHd zs4E&bC!%qsS^R_ZLwd?Jr-Oc; z4tv|<&4qaL`Nbk*567%Dz`tc`$l>m4>v z;9yX8`A=W5J+XKuQ{@cpQ>Pk%P&5XVrhw9|`hrc{x}WT(Hg~`K|2g{-I4P=Y?|X0W%XC*) zS9e$SQr%VEUA@gr?>)mX(lv}gL~(FsZ9y@(kqjgn)aNorqv8^XNDM)R7bS6tf-@`w zsQ7#?C`rJd7}tD|7sTa>q8}0!rsv&T)jcx|;Fs?KbF1rCbq`f_&bj|{&i|b5M4kO; zo9vrF^Mc^uGe}0ukfsamM#zrlpl+l=&!TPMbW+-_mQi5MZCC0h7Ny#i$RE+zcH${0 zn2=IPu_{CyEh;D7JN3@@y=(MmC>B5ozo$tsz|NH2G9J=+A=+$n;vGDwp>*MdbZosQ zqn@r6PM8_(ZrnQXredzEA1G>HAdbbiiUmPU3wbXW{FclV=G4#Of(ucp${+7?D2Dtj zxS{^~n7e))%iM?90r>>WToAl1H>I`By0A6W5Mn~Ev_H*{)8(xhCgUpm%lz58POHqw zt~32zfiB)f`fgy!v6d7%4wj^#vhObezdr~9oQj1k*z&7bh^5JX%vEx@T(l#=1|^P` zI2IwvXqQYTBXL3$EAq+&GI)2z?C7AIqJj#{=b%LBaw~W7~Q% z*GZ(@Nbhnpcy#FO*y`H#2B*f;1SvhX!EQu1so+qF&n0UPRHa7gjMbQ&8j|rO{?e#B zt68`I;W?WZkcACSd0_InXSB?!ZYBbY=Bqb%z`Jtaw0W?ki0@aECdK(*o`VjIh|bQy z7I7uM%j40da)oVTOWux1zL;+*O%i5xTqZ2&SS;MoahH5o$4Yrs$GVPf9Xs<*J1FHR zG9IX;gBX;~A>G{L5(W!a{tOg50r0#(*+KnHdCA%Gs$| z&A#j*jEOs1w!!Hj1j?`^J5CouMDG9v4-wVtoV*pDKkS4kE_r)9M;-PKuy}Womym{t z(e-kQ?LEkry$2PuJkYK2zCwIJmEmixh|_*NeCKzc7QC3B^S{ zmB|+B1{#jC*pP4~>opT$B*ox`s}z#WnqjOB=aQLK==9l2?Gl+1tGUbWEJx;Eq14yi zw&4!=diAao4b8w&q#Lr}^O84R-El}EI$g0VsUSeC9n-OP2w;KSik+k)agqoG$F{|X zouv0`K2eeQL`bsuh?`?KL6aAwY2Hb5;@ay*6wV%~V05ge*@iLj3CNfbx`!#;C%;ed zE!3>=?dFn;-LXTt3m?`EDmuE(Xx$VCK2Y56QOm2Mv>;`Yb zcl>Vzj({WZNWdHgu|SNMS||CZ`5)uA@O!`>xF_%_{5a4sorhLM^PH=Rn;pb%cEV}5 z)6Rf3s6ZPEh*L!*CL~deN`YWn0XLRhzLd)qOM$dSr|cW^TBA{?4Oo0G^}|?bXM-$a z6Aa6`n1HW2u4;U0Y6_(iu~aG^3pDo+-YxqB5QO}J01puZ$;h_?zz28+Pho8h$QC{- z1%o{A4@i*gPxkwLtu097l6ac&;D)U3LY6a1KOE;V$y+MOwdKi;yk5OFIl_~DQOE}bfe!>CJ_KpVs}(cQ2b?J>8s()(1TRe2Z}Kq` z)_gyHDVw3iY=*{wpNH5vlYIa*%F&{|v8!=TV|U}y#=VXDMsG9H@U)Md?xg29yPZp& zhn!lw6FRx3wyTDmx=}b4@aAFEm|_9vt3N;sRuSu@VvRtM;?zh=bs848v zm-5msx0}_zN`GfR;?z83T48+@J+6D)^r-c9{p&{Kt>_-zy~ZBv66X@v{b-fW*rIPS z=1uL^HY!i&-EFKfiBi@y6{Vx@G&>dfbH39bq5$?RF&O#4jgT-umm+w3K0i)##fwtX@+ zfi_z7W}{E!UfDSBXq6V(d+j)Jh z)P)c<30Y&P!j%NxYq57y`&7X)vC(bzJIZwb;E_JOrTPcI>7&`Qo6!GljIZow-GMSo z1`}Sa`|KP!^eNfu`Un3yv~Quw{)=R5s%@QQi-EF>yieU8mTed`yFv~0I46$>NN7_| zuG~=DBC@4iWovEA5;jqT!#NJx@L(0mtCLqz5IF{1(S0_4uFR#OiAwd|G`Q zP9UR3SBEKldSv=M`vRyYZ!Ai%_rUP%;h*t5Kd9 zZs+Xf=1Y0HoQmV2nOKMtkB0&oN~AifK!y^J&nuDYr~(;Eq&liVh7^Mp9*)w|8L*-= z)F^I4c_xKfpeCVewU!bp68$Aw>>Q!N=qC%$D^0(kU1*!+x6&T7YjSHTdH;m$4}N$W zV{)*bZGZRzD>qi~>hAZ4)LS^;5%Q#IkJD~pLtM$~aOhZuq3%e)$sZGiuRd1&vif!P z59rd7YLAo*$n#k1n?MWv_bosed`Uh#B#cWj9(LTU;{5D2S&bppmYtlP>7AavI&^j8 zwZ(gjYm-l8cS&yr-wf@Q-fH?na@ZwPc0zEXaBbr+f_F9kD)_tLlZ`t7SOW*G@8r;Wuhtd3y!Mfl?Kk?W@Z~x-KnLYQ)WN+bv zPj*+o{_w|r=RAI0btf`cCm(ONUcGVV>f*Quzfv4R&-2Cer!Htc|2G(aZo!Cz!Pe_^ z@V=ZpEq|7;D__YkcHi#4!@Ib|&(|Jo9~VlqC%%eiQwlFwl6{DP%euiKT?{FidlZn73h!c6oBOC+U< zjJhJpkvTbc348Hen8uC=!fM3z!|qKK<>2v0;FofU@~8cC{k!~HyT9!3^3U-v#M-pZ zzt?Z{e-b4Q9f|%Ou2mG3mBn{d66=JN)(Ijk43%uxU!Z00DKSzddhuTMF@@p(6uEuJ zhe)e`BT@|)SC=T;Fuv~dusq&?uR8<9ZNN{y7HjaE-XP^C#lJp`^u)!!{rUs`PlMm0 zuk~O1z6l-;nJh@FhdxX27rs?`J;}R9-7)rL`7W#dmxtsaW@66`otE zILeRF41D&7g->5UiTB#9yy~^Adj99TA%$KU

oS|d0LH^I9uMnrCnb@S1V*xIB#S5rR;vY(Z|6?Il$2qo zvg_GHtd=DyV~Yn#Y1bUrc9+J5_xlDt(6bfZ3fyRSU!%fBBkh|GAE+FzDAgMkMOW%k z4DvUfuE#P?LO~l%F;ik0-#bxz%-Bb*QSg;VsIrd2Fn_XHwDy|nj1CXe(7<@$7}nWf zb9(+A-mZtYtYI0v!@^c|D{IG@Tvn^gq>jhjnomdW6YGP0HSMGL*~ZbADn6507mM5; zonDI_ySSIpOCc*VMUX3@E}g`1v?~oylsaSiyl!u|uiM`pxYK>R=LOvh%*SriTxzak zE!p-06AD^BUUWeh*)k zl6-VfQz=Ll8H#c;fd40HMYuX|%?eBzVcc zP{=7Y=%ofLg3rT70PqS|0UW;R6*;$ygFy~*avddpsDQ z6TdmWG`>2%EB-~?7~h7j!ywRu;kU<)-{zLn_y@n$EqjZ0_ZLbr()0~TmWmj$UDvA% zxt_znjsY6{tF^F6b_E&u0s|R|(m|l>(k<2P(rIKW_QtM=z_kluQIQJ{p03~ zTOV#-*7^srpY9j>3;mrt=pDk2!j8^&z-NUo$_G3D3BH71QX-2#HV5fW2i+N_#4sfk z@;N9J3Y|1f^Fo0UghDP%(G(AJ41_s^aW*B{C9_kaB|!>F-tkhWRFI0&*sPS3LjCAk z*^hC$+2}QnMM?BU0T!gr&T?yOIUH_oj&%}fPM14$lmwy9YSje-R<}C<$+W|+OY6#5 zuIA`;I`4#>6vnd~WAg*}H<9D!F06Ci0Zo8AeH)Y%N}EevH@PW?S!`-a^#fTwxheZu zx*l!j$Rj5Ql{pUY3{6&Qz)%5;2S*M>0Ex@UQzWTGk)#qul1h|F^JU7`;KqZMsk?$R zYL;Bd-P416`tW<`e!RtRQ?~e>G>QG-H!J)2{bbvF{72aFAH|R>pOYW_Qg+%rWryA2 zFFSNDGElBEi7m-aJSDLBU?&+U*3PJ(kGDCz-Hf*m8}{kokdvy=21ZkkM@^LQ#ONH< z=n1qEE>)u;Uye}k#w=4UH2{k1T@2cLZ$oPjuqA!A{!|@l9R|m*k2u&Lp7~&{D zUmdT$wz>7#Fn%6}#I=S*D5t_oL92e$t zSA?&~>1Waxx#t9C3Rf+_40xUjY!yeigQQQxgWhKTXN0K*<2u%19d01SaV`IC+UXjCg%*1?$L}ebYCB5_D%qf#^aIWsn1kfzAeI@ELZF9*9TY!TO;5u z0w;4;|KGB-dQ9Qe?^A<<+WWrSPJX-YQ>FMG%j-V|&(VCOyA0UDSsP7p3s=Az`;OdzUzkjs>BsO2 zqt@0BcWls4fwPRHbCMOzGCh~JLEGDu{?#pTCs5j7)w(AQ0HvuEzQ6TaxLWBJY(tNj zIfvgdP{A9YZv1!C-DZl5>K=DlC~VYWdvyTauiT4qa%l9upe(e>9D!w}PEWlH$Le=s z^gYlG^FV9Q7L|9737ixMy9F*WC@;Of!9t}RxtdR`S;8^X|&c)uJ`FfaNc<*CY zc%L+^VIK89o!)48*7gju!MlauX*-;CnIQ+0Q1e^I{a*BM&384gYJS4@Wb@0}x3V8* zjd8IbJuQ2qX(1XF1u;$soSsBU0Hp-f#+^)>|Q%0c4!DOKM?QHn8+F{4znri}!oYzGGH@)iaUfg=9l z1`qeq#%5!^zh-4ojn>HEQ?~&gpW+;Rq1Jh`A{2-FX?jMqr65g))Kq*;2Q-p$tX>s0 zee>=Ip4j(x+nrrKJ(oNaGEpA0ZQg@ZSNAR?iu>}|+s@d0+1ZPK@}q6@uKVrE?&~+% zsXHgkA7f@|huQ8;J~VG&j}l+{orCHcd+u46Pn$#H<4yS4Ps38{2XPpAhQRozWeb&7 zAiUV%cawc5mv(WS+a>yWg9chclC@&#hx0Z{f+-|mBr#7;YWx6b3?@rJu;V+A^xkCn zd|(Z^7*cFxXS$iajE3P77yWYN;~)=Ve?9e3CO!G~W8iQQ1Bd-J{^<8LY&vtjwe~RN z^RG0)j3pD96u&TjY5Z|C|zaK3JVl*M%~zo9O|`D@&3V2pW)qVr=kj6Gy^*D zGXgFKkf>C6RG<)!sHTU>-@M%q_0@lF{9yUZBiPyxzjxn#?~xzvM+0xZQvLeHm#T+e zS*tXU8mAB~cC7x}-&W(F8Z+%oteHu0Xro}Z*h%v1h}?)@yz2TO`fhAraG&ts(NANB zh%4qkJv1dcC3Zom5}g^l(tag(MRW;gb(7TBPo2yR=Y_7TqVr=%ygI#?qg>tum7t^E zyQo#vuh|vewXU`J+^|GD>>T4$Do{ATM~xGLI~_v8VCmE9{lD`FVT*07amJb;To!yG zh=SfmMv%xuUL!$5h*~CTBrf&Ri06#8P2mhz7EL*L{P}n zDjh7X01?s1vt)|$r9D0$>k)agTa243W~>H%aRJ|NtPUYjV0d7)Fb48PSe~FM)I+{i z1wwCQROrDjazDJMFO}@6SJ5r1-5(MPZ&%87@XEL!|2s_d;MAd~Y)0+=OO&9`W~7b8 z#0=}j7LdfAREUX@@SKE^T-X@lhHTW(QX4MnhXNKkPhFHpHipn5)x_NQ_n*9R-F0vL z^n+h3`wQP$@#}Zq`Spr-v>zS)5wR_Q*m2#y#nKoDCnWzkLPVz=R0R)#GcvtyMvqOx1|JjT zQGcxi_YB1=T?7TUdsNYrDw#lS%xlm#9ed3E;o}$mrNe2XSSs`NE$>wKLi>)tK=U;2 zt>w%2c;Q2jygDv#=Nt|yHx2q;+l(#8|Gnkzr~h~_!8mVYOgc!Nal-Xmno2)x1N;DOkK^9_At=$BG*o*;4Ka^!J#F86{iy&G_2mt`- z5ZBzq>P<$oh-FbWmp~&7d3PzIxk7G8yJXiw*KU{A#TBpF0{>KFrA|=_VcMw!3L0)F zNtywrh0my3zRDH%)sqo&^(bR`DYO zH&$=b-h?GH2J(=XvlEzw4EjKLGy0jZKYCO+9MNBu_)*im^t}A_4L2kf zD*t3+O@1qHLq=i^E>R4GNvAWKLU4{NuFcZK(b4~4a1u8_R=IAK++1!4E$ zhd}^jc|S3!<$8VPm{CSzgcNTBzQM!5J9xM^X~drEH@&F+(;9Yo1Itxzoc5 zvf-ZL6<8c%VKD|93J-UJYbh0p6+y)UozETDQ|1#yH??@qMiw~EEsa{l zuhHRA?6#c=GKiVYGK_~69f`C8cp7JC8XMCYF+rJCd*1*XW-F-&ky7!iB|5u?Ur7t` zr{!=lt#l9Wq!)~=g;F#d9X+!lUO{;Qc0kB$5QKZc&qBOJYGyE9c z`LDM3fF9U`dNeESwzG{(jjN4M`nURZexr{hy!}|4br$UJKD9}!6)oxo%QlPNdp;MU zoi_J!o+KgX$PR=w8a`-k2n7ONTBzmtt#BiJ1F*vhGNm-9o`f9OUp_K0T*pZIS>Xkc zT=~!yk1Q_LNaxq1IHB2pLf-=rl6wu_gsdx zd^>)w%dwUhQU4Z@z+&ufC?`mzC}UN&au;nWU*`P16TMV`NhTR>P9zKQ;+RM|dRn4f zxRSXtY?<$bVQ0ySQcPFk-RQf8&!V3djz*6bjBU}j!j+LLi%&97hV_wRI1E%XZW*%S zexmdnKoAClsK9N;zg%Dx71{$2c1$GCwJim>o?dq^Q^!jYK1nP_e)ii-j=bq@5uUW&j8S zXEDO)!cZLR_q)dW^wQYI{Me?Z#ztfrOFMvZEJS98xX`BVFbw}T8o8jj6|MnMJkzkS z&{II6LZ&dcpeYb*6lihcwI8oO3r#&HM43XS41Ph@A-#z!ZG#Vi9yO^jTrxnuJcv}j z9;`*d>RAJ&l&8iE^^Cbg+pI=oor8P&_;y0t+tcT7QMX)9-FljoZSQcg03_7{N^f=D zNxlQ&_$1t^V`-z$#is0p(~m0~a1QS4^F|7c!bEhCt}pv~@m6W0tYj&M5p)N zEv*ZKM@Cj4;xq7BQ)_2^(--9mp`i+S5(plmsSe|sp%|So6r(#KMEvXsXYpnD!<3>c z4a9II3j+)w@Qxj^DvXVm_44NS{|{42AH1iZyB*)+h#R6bmYH z;S$$RUAMY0_^?hVm=UAI=>#FttZRkCA+i7iLjXe#it3`aQyPlnMp{FqrShq*;3+NO zua38WUlIFPcO6C;b^L#IkxncalTAcPx!vAkZ?%oFx7pk6r`ctDr+tEnmaHY~248QZ zHU>)&UEsgOaEbqF!_|IW$&m9;Fih}YV9;fZEvG5^xwj3rO&r(OcG@_x#bqZ`e29iq z>D}}``Vg%JG)2p_hMs7nX}e8yMS}`Z03szKaUw5@L0*iOGU{ZW%A@?mbUvR+i=~M& znf&42PS`oI+}SCY#iq2Lmzta60lyv^k}dLBFj1crG+x1E(imDwrD)V;Zm@+sZaMfr z?0pG%R7JXIRh`qPPjBgcP11e3)9KFA=?+PNK*ywkh$x#PXkdgPkU#<O3uM`eZe`sllguX9FF{z@QE@YwdH_P{xbLH-< z@_y+`Su>&cPnC5!U7IPD&2`CDY0Dt=H|&a>eBt(+q|^ws7iP*tZ>2)fDx{oTms_jn zRl4k4KJ3FP!L4=raE>a^hh2J)52NInoa{iv$&*3dNblbKtL^*>@c`=1Bk-;xpuD`F z)IG6$N}`&Uz*Ejn3;>swWHY$(@#mARcKJ>eHg&LfpQI}vI@QykqN(&2(o?e=hD`I9 z&L8}f0avk;5FQ&-9Gx*_I77$wD~Mb%j0GQOUzIbIn>JzomBWW$86P$2{8n}k%A<+# zSJs|?pWzP-yD>AjM)q`1Mu5v3fXib zt`Td}xyRC<5y)-6m+=(i7NJ^uZXAD802j`VW^C+oE`>fVbgeNW#+-)=WRI1|8R8F>5ti$@2#{cGCgH#MIkW zh3i4RbyMB8TV+x-TbVh}pMk;R$M4wvv3jj7Jwqj`ML{G&h6)%iUCfkq+dQV*rgwc6 zXoE+O{wm!jv)4R!l+5JGpur7LCY~2?M^7%gK)t=OYURYKV@rR+_~8?_3E|E;*Dsov zs@*EQa{I)}T<<+spZ~gByPbI3u>X1f&%GD~bifBX|G<|4hv<+Kk4ThS9K6Hkba3zD zcXc0-k5vDr{y-Ra2{hZOS;dC0c-jCP`8}16`ra76L zFxdNVLfC`~(Ns_|+sWMtm&Gq6==mE7NYf;|DeM!D38w{>(2kG4?1C;RId6f%?aT9% z=g}!c@{Wcc8~I;D4$wetooBX~Y-u*WGHG(NRWXMsqt95%DF+(s>{jsE@G-nlbj0Ys|>Wlf|O z;f%gAoZoe8R@cF(bnP~|K9jo2Ro3z4j-4G}Vav`P*gD~p_3J;OfM0s6<1{wENiP>U z{hKF_{^1voANvDcIqz7)q?ev~Tac*er!@`=1N1Mr4o@JH4K)~OBFr|l;M?+=qq?_+ zx3nLsKhzuvf7tJ&@TpdGa}n+~^}XC$u9XuU8BAo|u}rr+BQxNTM=70UcaI@yNFb(+ zM%a)WGsf*1ap2Unm|v&O_2Y+lHS)!?g^=GUV$o9^L1~iLm?{5<&u6-eQWxKuYL{Gk z|FVoNAY5$y;PRi^rY?`==nLt*qkw&AYmhLddcV$p`&Brr$I%URGqWsZbajU=qF+*^ zdaR|7Y+bPU!2FK$uYYo{{C{9m%98po-e0r!;K8+z9^|I2{mD%&`noidBOlne?|}#Q@0V}e;3si6LvL?S*cPYZh-R#ImgQE< z&n>HkUs%-{@-mKZw=#Q6w{IhDFxg2YG|Hrm9+=UV7@ISOot6>E*QMF?I-rS4ZNOG! zOEYPM*>RLFXe&%G7{XkPPRY`>M)hemQF{uIO$r*buFaAc@J?q5S?aqg zI8^1Dp+2kKVJ}Y~dQaeylGlv78?BQ{>q}?F7nLrF|Gf0)@n>wCZQ7Obtv+&{n4g;! z>X*2pti-bxVLa@#K&wx?!)%Op`dcEHMdxv&C>t%O2^%O-dK~VuaOt4@{$)8CMyo4p z@rc>a)&^{89`7%KeeF?SVa1}#F|n9bQdib+JDqht2-;Sh?)F9RCW7CkV?(+poovu< z)$Y)~uRWnvElgXM_DI^sv|YMGI>9N@n=aZAkDC*Ak>}N70Gn(YyV+|klkwX4mD8rN?Wz5ZZGeZR$z^5-4(1{+s-HiRs zawd7e65W(7|519usd4iEE1q<%PUq41kTzZKL-PMC%JCja2{+q%|3ww*-}C<#haJ>? zw!golbiup{y9U|}CYM3_k9iNZu@BH6qr~8*QQ zJN^XPaUwSjg`p?bYx%7XlHbQ8rH@hmNDcd`zkpsNF5BWjUZbdqn~Z|Z&*>xyA*X}RK{UB0vn1|QV>Ml1&*{CuUREX_ zHLiTUCGTPU!NXy)yG>|uf_Ao2k7aa=m7ef!<;^~15o~hH%VKC%#PD@w2k~=&GGysI zuKZ)jJ^%@)G(V%wz;18y`;TRHarViu_j?iSa6}G$+F(E-@;p7$1efTWMjYbJv1mnC)rMbFHy>Fj*7C&ZUX52 zN%KX%U%trq%Blr>a8~Gb;RrV@(Rn81No3FFabk20o%(;!f#lFU| z+PRUu$UkRa@7zjW{9Kree5`ePdU$#?;PixX89YUG*j0{MDjj>wnSuZ5Tl?JOa!^p6k8wMALQl+mj(&l z7(jx-wQN^FK-m@0mdO1n+qA>cy#Zr2+}9fX65Ala(Q{8UYuN^YfU-dVxH2;{#&!n; zB)97kwmYEnnnY1@cYxHjJ3va=9U!Ib4v>`H0dL}CFx_qeZaPMnBJr_A7LUeb%#G)@ z;ke%um#lGv5ZC)9$zae6O)l(u+l}ep=ppowJ5ku*oyf^AaVN6FU}bv2a(losnoHdA z#MB&|^BR7ZZ40<3;dD$OiGG7h2u(+5I+8G%OGrC@HepanQ|;LPwvB(t7FW@wuEPG* zdAW2@3G?R5UU&_2AqVEd^UQ_JsGG1joF%G+z5ng1`&ESQA|R^Q@o|)!A~9ztPwpDK zzoa__CVP|%?AbPg$;oX5`DaejNaX6dyQbm{J&~MUhy5cr5?rvzKY8-J3wGaJEKu1^ zkX&)tnj^YJ-qfwo;AX#?Wdv2GyHcz5X!C@)aB>?~cU?%A zRD@4-U5JpfFJLm=06;efuuTATo646i(~0D+0LAqnSFb$*%u?MQO@8M8Ua!ymTb0lJ z&%SKQqV93Jwgv9d&FN+37i<(rWSIugtp$;;tp!?m%;crt^Ly$3ffJ?D(FWI|xWn2zcfM@0(UtF= z2?HQmWnlTKb;$!Qs4|Y_eQ1~4h@jjhbBT|~g)Fij-x0DIVV3?46^eU0e%4Mt~e1qTFANMzpH6)zhS^pZ)X{;ly*97Wt zo%t5)ErI3M<$+(DU$<@x>D2PV9`agM0!WYZ2X#(3Y4J z4#(Jrgg{zV($j5mj|U{0P}L_G&+8Y@ z&(BLk-fO*NuJ@StG@Y52TuZlsnN*T$uIiZTv`SF9i}SXzUR=KRYw|qPN$CEPiwr5s zkMgA@y`@B@^v3_iAFe-CAxe5py;G}2Q<*5=UGK-qTRbnxUcLSY^^=Bp1snud_ zi|#Mx-{{-PUlK+;YQcX||Ari~Vf4<6%Kb@SDmTU=<@!r{PDpXrojBdtst-Fpa(V4u z4Y}#Vj*s1$4zHH~Q%6>g*Jg0ymlOoC-$2DYfIh{4<+At?->J$~Emi$qctvefSE{F| z?@}KTztb$$UZ=~^{Z`*%SYV0j$oanO5%&^L zd;0hcb>`~K4qvrYUli>Wc5n->7(c$iiX%$`O?( z{$Daz=JuIB(`WijpXoDwrqA@5KGSFVOrPm9eWuU!nLg8J`b?kcGkxa&7sLKz8BE?l z^e$`qo5gI3W8`2yiW8KE3l*G0lW@6$^C@Xm$c5J^xPUV7CIwfcU0rEJRERbzxCYYf zQE&rUhfmRyt=O+Wf2V?Dq~l*zaDvn-kAickK;>6(J|&F`=~ZJCTtI26NeZq;)4S4$ z$i;u4;2KC%r{D%WTD1^z#ykh_(hF}hTm`sEc%R_{3;!d-)hzsLhKmgEWVl9YLm8Lb zP{!pplySKYWt>k*Be$W9%WWv*avRFH+=enPx1o&7ZAfu#O8IrPY-%IJ^(oK6~vXEimYX+R!)ev6K zQbZwU2xYs46P|BD^O>&}+*(Mz5bPRANpn~L{(2TFp)ugz3~oJ3Uk%X0@~(mK zIp8*<*$~!*X8aB1qPaG*9OdUGfUh2Wv?LO`9IX(bIgm>|ysH^v=Ck^?pj>prCDQlI zU(WqnsL^O>qY)5yGbVP_=HKm*7m^z5!Id0M+W%&g5aagh**tV; zY3b>chgX)Q3NrCBHEgmq=@2a~ayAyVwv=`jagsyW*d+GPOqZJ`Q-_zPYpiwDHPH!{ z8}r(_oB!e|dp4*D=$5BwWK>vM9IJ57q-22uL$A_gDxR#v1kTanib+ghX7L8uNlG>2$d1UqAZC*7G^%^HG>J_qdRmdBizo zHr7Q#p(TktR@3G4@PaDKsm8e?L1w9`foG9P#laAFq_RWHkfsX{82~qFW?>ayek|>1 znR&d}GTSfPk&O8`4qFiN+luvm(%Po{FH={r>i$vt>!~x%On~MNSC_sZBJcV<`O@M{ z?gj{>UwfbOW1Jp$VY#(cxRlb}p=>l_i`1{jHl@of^M|slPQ1i2Mh)_m&f;$S;zcbU zqIC;y>-D6S1~JvUhz7KS#Q{wXi(>_Dwv_=*%M2SEE3*J1-F$XqU7h zc&58@zLNFRb=+uOPU{afuj1W%EEV zAIY{~KA>BS$Dbsw`!B9ec_KI2J9m8^mAH1h)>*8uiZUGO=9m)&3}EEu56hMf+-m6R zm}yUF>%f6d(3rOo!`>)&J<`p{sG*;L93k{O_5p0~S8x{8`^>=)pzomyj3Zcy*bgcP zQXn2uBfZ?jDJZ9%i3k_`u^$T6aS#gjF(_}gG&FDE1PE^;KFG^&8?M662z*$Qg4PWX z-N_GR7~TFYq!*dZZ{ltJaFJfd5Y~5)p5Tbrv#25B=iC*zrLlB~gSjcyc zPcb(`OabtlbT4qA0_2MbsFNN*CoMRPNfX3d#ta1yB$sRwv{O+X=4GmXD((nt7YnBCk2>57 zL4P*NC+n_HuNrKu&LVP%=&p3vUg>WM?3@_&U>tm9h<{YqI4P=>81WzmXY7qy0CUI+tdt3`Chjm)Y-d6uR|i|` z0)-5sjRO*orV|(kCT;q`IsGA~3x=_zWtX4(h4xS`3L_cna6BiAb0Yl3osHwx>F z^lrg|bO}F@x4!j#fZe$x=|S}3fZ(u3=r`-|Vs7GsAc9zfXo56@c0$%h7K%U2Wd%?f zu#)zfB?;=Vp^inei-(9=8ng_iV1&)tl8G1WV7cWhQ;Xo`yNVUFxN)(tyQmpSKOn+E ziq6&G6pEG%s*ak&3xQA-jKCuehlq8?aYCkoS>ODCly+kJE!oE`;R-P?8*r@F=Sd$o zoIo${gpp(_b&+Bw+Xo+a>=MQpg=ESE)~^=m3j)L#_WQaeJk&xu^r9W=Nf2ZOvf@-m z{Qyx%vo^Lp)FTh5F*n?0^=uLGe8q=t*k3psFtc!Xcr5>~ zaCMSE#JOjKINv__I?(uLbxotrO&`ciC6Z$KwtR@^kx?(W@Ko z#T}Wq2PH=U#M+|-j1KeU^!g~#8KJZ%{oe|>m5eMhZ)S!MnRE}BTWEjzi3#L7Zl!`A z`(TyHt;5Uy-14gajR54;euO8+ruD4c2FA9hw0XybAWJrBtoFM*S340<0q%>?V0Nk} z6z3v>(9{lNURmPq`ncCKx8&yZ?{H!X91L)Wwfj=?3q6V|gf$03r<3^8u@@k(?=2iQ z#L9oQXR0{tpF6{JvQe&DK(vnc?-d+bZ%?FQ2VCUuWhjxH$R^BA zG<=0x>`iO~Vk4!Me2gRkXFbriF@ zQ4tsczPv90*+}Vvf(Yr3cg>#?@^6KIdPm0U%tGd$urJB<5VRDvkQDxU$=)^rw`Z5G zx<3POkSbBcA3QT(aN@QmX z$U3l08z4>d42Y!*!7UB!06$72Ogq#LRlVESuWpgTROE{$RJB&&i+wETSdz0+x>UOC z*I%*$-Ty)D2Pcm%(&uLhkqGQ_@V4Geb1*-0cJOMoypGJs=|)+YImu^4bCU4eLb!Bgtf&?01DWs|Ds0 z?4XTNN3$9lj;bn@BFXcXtyBc$su{d^1_E78k?b`t~PMFCnPv5$f6CIi+T?`KO6 zM2CG51=E2Y@FH=70&4c^!{K9r_|5o{QuD%s9HHu`iT7?I2WKk!JcV3f*K->8By{n4 zia%Xlbge-*#2OJz@TY%3uGSd&qHDm=OdGoz*}~i|LY<6mW6X!hkU;l(0)_xQ!V|)D z{@mw6Z~h)cp)sLyf;{Q|aI;7U2>)C~Mtwm<-NaD+6-6K-)Z;=FMJA{Xj4+s)Bhvgy z4dWse$%R`%srMi?)Z^q$!6P7WMTMeB+rFT8f&_KWaFXxi@HFtr6$93?AsV=0OtNTj^S<+=$({+}PYmH-x_c6uu2&#uodf1Zy_u!)b%UMGlU$Z{|`@N<$w zt}iI2Oe2`lp2Z&>_Z0y5xh$nScbvTn5Kj~#!VB{g3uu2GXjmgYcY^gj&V!aw>1`4! z#gtkJ^`MYBRIop1UhOFD2~|t;_g(bkQkezk?u0p^ivCvQ8*vd(S2g zI5lHj8&GY3u+Via>>zQS^RcbB5KfBusfLVEV)mrvW=wVUbLx^KvR|gceAOK}7++|2 zOD7*19In0WPk>>}ve1agz%eHZ^%pAWDN(b~EHcq7GSe)w(y;kq_=H3Wq(w60$`L~7 zEC(V11*y?rvoL;R`%4Gw(pp>S4Ejd36|i1+^>%_#hTDQU>PL985{oQfSXWJ-Bgd?%}~x9=~; zufmVcYOiar8yy-(c#b{utw8C@#wrk72LGm+#54offbC`}Qgf+y;sO1wCNAE-ppX8F z<<(s6)Clc^V1(Gn`|snzTIY%5wJK)R2!$E?$yU59Dy5(g@5m z_ccM@&WPe~(PFUS;Q^y$0a4=99YxzJxoNr&V#TiD?Lq8pEDTcpnrp>; zVxcfjXl{S(KFrHXVF+40ii~Nm>l2JMx%0~p16QZQAVPA_F^rp?IJ|MhBPp1r1~fjQ z702^d-kam1AT&bz3MG%$hottuqsj;7r5mh9WDo5#iN}J~nv!&re>mf174BW;V-^+e zcZlOJf?h30`Rj>ZN5BufjfjcjkmKTiP=>~b{~!^MOaJjUbJh((SYc!B%jd~wnHU`; zLXs}DD9lnQ8KOcid?#j1KaP=K=r4m=lrI?Zpqk-Xz-B&MIM0hLb>R#1~_ppOPoat|&e$Xbs6Hh#d3oTY~qs z-CmpSi3NPuReze-ReJi*H9%M0Wtx$m=NUVt3uAFC>NM`;ZOh^e$eN!)AynggXFkxm zdnDieM9L9S`94-colqoQB=FBj zHYGvMUiEJxdqVcbZ#T$Vj&I$jxf1iWUuXS`yVe|Yv^rR&8v{_ z*)$;uzau^dKQUaxvio*24lz3vA22%xG*T#kEWd_1>M=Ah4Dsvjm~srdh9>dLp02IK zb>`#;@f}V`zQEP$2J%IabdM@nLAv2A&#xQ&JsPRs^9mtHM**$BufueM6|N&%J@VV> z9U#33Hru98Elp8j=@?@T&*#5a_>wgdK7Eao&V>Lq0jqzz6R&H^SFA+BKnCYXaYG%i zH-Mp`8zkz@fq-ETnx|9OnI_!ZXz0x1`vLDcstHch(8poZ?{(9VwuZ9nswBZ2Pm)TS zBdG|_SVKe)ahMQXjzNq zShVK2@L$tnzQ7e&#aEC&LN(r}F1^>UWen)TwEC;+D`AK*C&rluR?mU8r60xP-> zepy2)0h3}5VOxu)0Zi+jak2JZx{e%1#NAe1mW2H)` z$kAXfg9pkN)Ky2AFDaZwoDbz0QdAjC#!_k?TZgyY8($twrVd|Kfwi9Owg1G?Y`1D* z7^VP81KsyoW_*ca-2YV0F$@jm&UzK5qHj%M*>XY|DJi`P)6|9Z>2-r$@5nV7D+Qp) zr5rH}N;l#W6<)SEP0|Uig5F#^p>fI%^o1#_#!U#EgF2J!kefy zXf3~Z8{JF9@*>1(E<&Cz&EYjCenZ`^1nRS<)~6{t8cF$>T)g8BeM#o@GB7+*GQCMq^kHmpNXtdL=m5CFR$zPXTZBch$D zx{)5vIRvefd=e*9+<^q+TSBg0;bvOV_EGq-@rVa1BkR0FzK{FR5yt(S>h+xKMV;?vWb z&ADN(yP3=!pUuq^+l2=^Sr}DWy^CWDM={ zQ6%H|VK-O~J%L$Gap!yoFTLAd!kX!{TaoQ))8wu4tpo=a$ZaabU3k(nCXfTuE|G_B~$cqZTZjeYXRc|&`{sb8adxH!TS{XTg#H|RRJj7BtWm^#7p zd3^GwNf)1vDMAOq5p|Ty{q3tD`1{qX2%12ntbheOsGR8IJ*%uh>|NeYFzj7+H@@vK z&iyJk{B3{NeeYHO;gwqkFKmH9`CG?#w4PzxA)7t@!5}BH;zFKNLHcm^ zQ(3EUa9oMaFnC-sA2PCV0a!`^d6q~5EP03w`K=Ml_j;6sQ}Xah@-p)5Nm54%taNd# zgdrnb8sdskjr!oEIF|a*3o7U_5{Dp_1m%MtZ6ek277n4j#PXx?cOjirxsn8od$2nZ zsrwr@*8gI>sB}VC_Id6@ys)=}u7@-4_}rwoL$0Tu55;c^UO@Oo6foD}&jMd^MBtXDFzV%VF(&7|m70Wcgx#bG0ScE}zwiFRlS!>qS5i*O}-D&&C+ z_S|SU^t_SHA@o_n2RFRD$YcA#4`$87ZCuziz#=yqi@?O<4&X+ zVe4C{PS7%-tQ)#TXbX@*0`trN>$im)&vwlEzP20oncsx{FQpOaTfsvASUv8Fp^;nr zMbzB>k~l2>&>4W-3tD$j<1M=v;wjKVOIGuSzzh0x7y1QsenkETeGyk+U?vXK$6uFN z_#LiCNbCjCC$K#%G$NGLu&!hkJsri+AgUehRd6dTXj+M4Fe;5i*+6bG9=DDdtCXjX zRCP4#fwW5jc|P_*7;7+Rl}vh1Br6Wno^pCL1EGj4H)k->jTC=Rwo~zYs>e&wc2E3W zfe1~+bF7;@C@9Z|JSvDp6HU-_@{>G5goFo8Hb0&(oT6^je=wfwK!S3P-yTGg78{|i9qnHttx_=9=wAmc$b`rPQaDnzu|F6xHuKE$I7-46 zv+54Ho8lw~%r$n0WdkRp5%;2L(~zeM@4fG zIw`55bDdx{eg>14=QB@~n`4I}^bn3~O*YwVDK`(j2LN3KKj7R(%kCqevR# zq_}jj776wttaNaZS$eIOddyvLa=%ogmO4YF7+sKaKer086&eRXXcu`Gxlw8LrcA!xPutJUf&sEF{>_S-jmaJBYe3A~*Etk#%(5-1YgnE-V_&r@%$v0u*F6}6KpYqjZBH=}j*Ke{ zHm1&!GfCBEMDtfpHNp7+xjy@X^pGut|Cg9t0_y?T_oCvsjRQh=k(_w71A>1N-3d_d zY1p+KHG>tmCY_AeBhauJ{nRACamb?3NrTKtSWXgB|)h7YfC;rtZfz?h>+RPx@%n;hlVA`i(?FI-@oS?(5ki)Lv z!_t1Y#l6m~Ko3`7`!BmLXuB;ibsJdv7O)ge@Ci?_32VQ@uJ7Id(A)3O+yC&x@36V| z?z7i{N3V^qb`w^#g9w5&WnP{GQj( zJ*T%*zn7O$Z`)2Uhm+}=Q*RqaFB7?T3VW3UZIuIVl>=|}2-@l%x)~B=1I*uAu(w%H zZv#hfLtRf3rj`K%ha;xB|Ck!ewcleE#dToomWLO5W+d{KMaxfZx2Y8(b(hagfIld9 zH}M6b+ph+Q|H9E7N>ryx;xckQcxAxI8~Q-*E#bQ-0fp+y666+-YJ>qxY&go5AnP!S zmLLyTW`UhpRhV=^?rEL_uO9n@f@;*t)W1_!pxSiWuCdP%R2=5IlNNc)yW;dEC!Q)FW8<;GupNz;AVmN=yzI z%^);@%qrOh_UhM5#6N*yuH|D(kZU%7R|0=mjoAuUuqSiyHzz;u_FjHIy%vP;P)(A9;DqY8kZU5kH(PC zW-6vRsI*o1v{n4HRp_);?6g(nG&6Xa3uKu_aLRRXbOOKdnBGCqUJ)w2z2AC!#Cm&r zdiksmEkAolNP5N9fcpx-0{ojff>#;j6IMR|%mKelo!+V4S$Pj|VPEi&7?6-x5MghB z0GU6azz}rn_6O|y0rvd?`n|JudS(zz zY-l)mkO7uF$!_vAe-{_uQCq6jX7{@9Y$Xyg*JS8P=N-$C*yyYM0}P^bwc{aj%vP^hHD zVA*}Q@$``Dic{ZtMRe_J5$4SXnN{Ias++FT%WZ28ppnx%rDu!8B1^lN437-%p@S+E zCzbKELu%x*xITW_xhRKZ>_)+_WTxDiPX%z;(#P|-Q*T$??K6aZXf%;*qEMu)ij46E zX4IRwR9FZnopvgmj(YlOTXc@cYiO=0_WdYVgiY9j z8SqnOj2xP&KI5*qcYhQn_mC7PgW1$H3Ke&e8r(Kfxns43d}}zw+n24hZJTY_G&wV? z&P>i#8=O1V%0Z>!Xl9oIOHL{I*sfVA%~>g~Kcuv$2?CGT3E#>& zR(9ysnG)e&KQkOG&n69RijfakA8`~cZ>nA)7xpIG6-mTz^j(UL%i03}nAkr0n;xQQ z37X7oR~6E6*x{Q^DrFEl9%}vCBB6fB%dV~&$Y~a9_LL_ zytRE5yZUGSOCXSj#@h(#7!Cu1b)9GyD>T=q#SPO8b?bDVhdZ<;#OcnB`;zaZeOUJ$ zV;ZkEog&~@e%Mhb;;}S_;y$Jf^K;m8Qg$D zyeQ~1+KkGSl9~P7X1(zR-Xe*9-lk1c1Y*}n(Ng4tMXO#SXxaV{x`1%KlVH9tPw%!+ zF`-2Cy#7JVw|vG~=Z|Vnr$mK(zUEwgzPpdf{>&qC#=C>zrv1#hZSG-7*$kZouCjxX zmyqAIakNg0MkE%mj+0x@SXyT%%14o@C*F1H)>W17>}|XZQHAL6IYMP*E^^k|myXmq zpS%9RJ0~So^#g0Tt51C++bE@NX?s~?wL@RK_I3JnU$T9QHh#g zxd-g;OGufDw34@b=R{A|Iq{l3kBbizmK)-4Puz9SO%JrzlCZfRog#EPG>;si<^#IP zD)f>X43f0@p31`Ha^s2Q3^@RxBgfevvj;eW7W459ts{;sE!>Z50iUt2yl6ug1VZ{UFB>Ba3pzx`D|N z4UZbo)vqUIpKS}b6V^Lzwo$dLiRIEZ&!>H>Out%?4{bMNlLffx{}mgr(+ZQV)OJl! zAlf`;;*=LcHq>LWPbbo&yJGJ$244{=PT)^CVa~;{_^Jo}`*wDuIVEoz#}#*aIi-oQ9f97T1W{DFAM=h<{ty!utD=Q`tEk{<pFQA-(svP zzVm7C6wD6hn%jgvB~255nCWf`Z`oO)n^HZY80vA)03IGu8wZb>^K@OW805%PVZ^=< zTwJ0po8B_lMZ)FnGUtTxEPetldlz|ZKS>cke271q#S>}0;>o>}sF@XK(I=#g+|1Vj zsHDNSUx;O9Q)i{*XzXF(5DP@%P>!RKe+I|@;FatvB+aC7t{@|iIW}CkkMrL&iRe{m zMh+#3nKP7vy_0vW7S)NmgM3g#zux> zf+swJ&;qj9mUoNGz$xxW!Tv$nFu6iBtl2z{Z?_{_R9vCvU6?}lzu-!f07KE_;mOIx z$xd-(N-i|+_q@ohwS02(qp#HVF~I?VtlGsM_u_}A!@Fz3m+&P`?9c2+i7w(t^$R%x zU8^~s9vgF^96-U-a?>dxqYn2I?~!oO?l;PV#1iE33#eil1+v^W;hWhXZL8y8L-^{+ z;irTGqS$NxZDry0iS4HB#?51;rntxUGu^S9MJn+S3FmsPw~I#m7J?6XXHrW>flfW9 zclFSqg%B*I5>^)+xXR>d%mq_(Sie91}Hnecf3C2qI@rd~G#MXH*?Pg1M{7G5 z0Hg{OLM67YHwz5xo7Z2BdZuH0ik;?osrY|A%hYcs8(??%pwH}-$M~{uxO$yG;9t74Sesd%R- zKT2Aw5Cz-!E3JS_*a~OjBN23=4`Y4&4fL5(9}zOJwjg0nPRrC}Ijt*>?9r>-$HgQ3 zfqqUz_&5{eY@;FOwWYM?I}5Qiz98q#i{!PI*SWE36`Nn-c{qvf-L8vo*50c(@}8Fw zBdqMAhQQC6?d8F4zmsJ+l*$n*7M;H6KDkd|T%+Wg?a|gPck8;#X+2|8O}`g*AU&Hgs?HmTWZ5b$nBrnUqk(13YtigcQP ziND8mtlEMR4A|hewavwRQnF2-FG++`Q#!Ov+&7?)Iike)^Y3`deebJMq>`N{Ps`#jCWWt3Jc1c}TH2zNx>kySWl=8JqgCyIdw* z=ycL}+bXefE2?hpmj5I-0#9>YuW_B2VQqi2)<~sDMgWJERl}{#_uQNPAy$HxOSEI< zLgT$M);oZ8tip2{+hLrjHcw(AS`t-JR1}eu-t-T%FYpfG;r_#S!c(*VO(+yR7}>>Q=8d{3q|pvh$CQ+8~ip zRfZmOVD8C7v9?d9oNAWGtJvo#X+t*hE5YN5cDK!P)rcW|gGCeep_+B{v(vfzuXUfy zX=qx7^RnLzW`u-?X}ve4OEvg}AJHhiHxdTs%Yjmf=`?04&%>h1&D4^#|6CDbxuqZQ zu-VBjgbG%D2Wy}0W*u&D<`?Fd$0rB-$H$ik*XPzJRpj#*T4m1!Y!kzwH>eq6fo4xc zY@dM6L&`C;M>S{Z)|5Aczgtrej=G1(G<@2&=6N`3*DOxLn+65J;1}+N&$0(das^zfxO)PI4WGbg>to@Aeu^Uj*pkCf(hVT05aJkw-S&+!J>e zOBJrBUP#{XW$yTFwrl&s5xHuY(*IoCr_JX(v@kduSwEAMiob~`TWkvf_BE^(=P6Mq zfZcM3-m~&z-<@qNif?M9eMf7I?z}4a>zKyPS$FxoxqM&>7ke0s3Zf! ze6Wu%H8H6jvZ2o=^)I&1edPCK4L~Y>&lX=U^HI=l7ixzb;K2OSEB55GxV7YE|Ap@K z@h?@&i1S6>H=bZNdQpd!=p_T^ufIPdUX_--s|1ha^u;R^1pkf=@`zPkP1|>Mea8-q z<4|D<+!7wAD|9w4%i^%ROSVSS_K|etd@d6IJMhtT!-Y(ACd5=GTG|ceZ*Fyyy}pmh z_UGIs{Dzd1Wkm76nH45BUN)wVlC8FGS9hJhDrq!# z(v70oIvW@*U*DVUi+psGd1_)+5H4(iTaL|BSw7DbF)9o=)mJC%KHFoEKXo9oU&v37 znGTvY#Qu2(uPj~K;+v(kcSYCC^|X}yN!XK}$}uI7NgT>7HK^JbA(d2mWz4GoV2gjZ z2kT@yEf;BPb7etEm(mAILb;IW3pmelu z?o*K@vFWq$&z=$L*}ZDHgNLqF^JPxv_K2`NUr(0$N&Mx%HIHM5_{r1{)gH`JT)9}^ z7NA9LfFSH$2O%Dz_Z~-`<2pQa_Uc-q=Be2XS8nIAM9f}iXIDG85C@U+3)|B`zcm&n zPsvo;i(X`ARK&|JxNb%CG!z<;8~ZdWgS9`=sf4jo5%ULT67JfX-J{CduE zQImNUu_=r4PRW;XH*-J@iyPw(menf&AItjUO2Zk|^l{L>^ z|4Hrgre<&J$g`gvr9lYohC9T^4X0bE}25Ft^2HS@h15UmN%*xja+3?G9zd zP#RoH`RnxrZ~{M3!p+jBEW^w#*AF!s=!hRI^|uWNci4oliwF%}<rvu{%@ zv!VF~-l>KRWQ``J$`*r+M?OolP1mO=T$UqD1*nHzj zO8+P0+5XFTUS38qb1Nrf2Sza~eJ5iPV?$dbV@4Tc8&fAUVipc&CZ_*GVJ2p0y z=SPJ5ul~j@>%tS(NoA<{Y1>(@ga>_#9F)bmoktd}&>zH~{5P>I6c~gAF(?|8BuoRG zKQZYzahM*;m?-0P#J!&sbSDZ_`ru!L0GJr!QsRJs1|f&f8d_MWhi=!Mp5?cd*OmH; zXV){8%M6#xE=x7l(6lfiP;TdGTAaB1)!jHpk<4av(WZ_AmZ6{YU6iS+Nr|EF z%sP0l4YJ)&!;-d>5uQ<{&(b22uJY;X+`F?a!rMZ+_5AK|Z~^5oj{9qFwmgUJYmOy5 zx{dx4LFmDoo|jSe^Nt1Q2>IzBw?5C#MUE4JPnz4%UtK^~ImRxVy@C_~Kt!4;SI_oe zRK(h2Jll_b@rl>FzvvU^1|}E8XS|^IT{(ppGIMH=ot6tp_REdA^q*J>xg+;0yi~b0 z{JamehH~0fJ4Wz{z1(Sd{BEy&nyy4a-7{&*0%Nu;ZKE<%0vQLlM8AdSs@WytqS4GT zXf-rFb`d{L-&!MNjF`7gkzdr&BSwFSgLLsE}SIHIIgxVRR= zvl5rjsLruR)5FGe_Oiu&1+VuXmmG=;Pv6Yy4~CUF-lKc=IWA@>vS^>eEXwz>f5n;F z@$ie;Hl$9^a=&J2JAEUbVa1q26YXc7u&#^F+)`PU(Bp}hochoLsvcMNVRh@N+ zQjvl_6;`0R-2M4O5b8rpG)p8jh$sbjvIXB!M0Z_o>(sTp2>FDXAm70wxft-FQ@>!v zt)G=g))*gShxN9w;*?NbfWtlEOd3t)ARf_sQo_t4CiL~qhrKhWE4;ptHmj-JZ-GDW zNE%3$|K;sPNXL+T$K+yBCBjqr{R2Ih>V(ZF-{1zad{nTdB77b#--;Ytyv^oEIS2ht z$YoRFSsD{EC$~7$pG8`Glv$P(XwH2N9Lh*?NrWLcea{_10DyR3H zbC~Idqc*FRA-7WD4Vt>gk2sd4diVL~9P!keil*i5)`wl}>-U_)!=^}4TxMZloF)x9 z1?-2OKm&&8?+D_ho|@S&5wj(Y_ShT~B0j?`Y#061 z)!(w=$M78oHg0dO|9o=?jqoUP$Hyz9A4s1l2~|t=DZT3qBNbd2`1(~>^B|kKWH0|Eb#^Y z!pop#aOOVpmiT)LcLuO}Aek%xb7{wZONV%CROFzihxJU8X^F()O5uB8Wh~fOBQeke zCo9YF0pg~;MQ_42b(H1k9C07W`RRy#bqJ0uofR>fi3?Kyg`MgVoYMPYflIE(=^d}y zFU-vx81gqOgghtID3Tf(4d(Z{IgVLFipCs@#BQF&4%UykhaX-i3gzUX7QO+rKn9$(D-T`JlW{3RdEvynNngJOTPKQYTa14ueU@5PGp4@xnFSpJ$CJFEvoS2CgWE)JH) z-p6jR^B6h#zgnY9_q?@8uCQ=l1=>P-@;)9g#2sjsBDVX-|7}V>_}Q)^$>R=QigMaa zRF$SsH2{ZrVLKa$D@<1>+Op`{@10d9N8H(v0WEPBiYswX6^pB^J%g@xRG(dSJ5TlU zOZ!EiK=>S??7RRKO&xp@NOf4Jhh@We*R-TZOp5~A2w0 zjssKvg7EPY$sT7IrIf~`aXn^4Yh!Kt1Cp+_8IfT>`%4nIg&|H|8 z(`-);5@R!4Ua3nq+J)A&XIBsWosayhBjBT#!N_jm{P}{TL_$eQ{ox894!EMdYTlu* zYNFJgQ+yJ0!_qj6$b9_4Psl=)$l%{&5wCH4s|!4JjG{NbiKj?c!w#uG?Lgj@q4pN} z(zd+SzgP(SwRgu{7eFPxV7Z|fPULNYQG7xjDDaO;r}{3lDp?eB!!)b40=B^Dcc>l2 zSVeG4{%K28WO^v;g~>gb1T}KOy_q@M=|vCH*OLkC+L*vjIMYv5^%W<6ihwns<{-6? zs?%Z33w$-ET3;x{9mgP)-0PnqsLMgTL8z{#oIT+|_%c#aF+$qc-?})ruJHhKoG;Zu z=*VBFmfPc9|Ln7{BSpc65%#BN)j5&GBKZQGEi9^`2L;IKpMK>*$iDu+}-1y>-C0yQ74A;&A#!3V{Mh^ZU5Mr9HF z?0Ddf8`b{?YCx60p*ww{M?+~6Vy2^1OmVO+2Tqp`h;h160ZtG=s)7!BT_C|k+eQ(MbeMR z7Pmt$PGN?9u`WqXRqSIp;=sJz@tlQio@Xl)fphYR8t%*sT^M9B+9m9 ztvjzsS&bv088T&7K&k~#AgEqtCB{b{1gbJZcAaS#pC6eHY_VY@3sSSL%@rLz|cuG7dQZ7m0 zM#Qr+mxO)XNKdyKokHm=k;91_|NBI`m zRW&~&-0-&dbF3&9)#4rA!*6p4;v} zN4yaMhD z<1B5UPjDifhDDqO2lfqCyBEIpFudhP+JxCnVZ9fNZmOfK$JO-d^m-oaYo7{*ESKhbS=)I>#$1Y zMa2v;TqfLjUdDafm0Enca@q>MSgDi}K4WpoP+UPSGr+BVwO8BNpP6^zu@i zgr)Q~;*yVfHMHh+egyhZ%bWRK;e`)AqWt7iK87*Brl096+?JM$8^jAzBgIQ%zo=xl z`rDYs@?%1r0_CJ|)0x0s^sB`{H06gl)t~&0I^5|b22vorLl6Z4gDDu;LZKCS0r&V8 zz?NhMhA0dr8!(Jo8o%RI3<0*LP+%K{;S^^4hB%=$Fj8R@wE;#0e}%q80AnZ;=uqgS zD4+}Y3nJlYpquQ#whH4ARsRgn<$}&8C~QZuz^lk@{D^3wEzm=8zzzyKQUb6O@CW$8 zcEHYb6|jrKuGHT6o{|)HBM-1Ubp$2@&r=F@0;WrySr2>JJ>Lu!wSvlhDgSz)=cE(_r8jg=1-m z@fGYoA2?272@M67(lFd%#w#qN0^kIN6RFVnf+o=j;ADkUXe4kd6#=IKPtY|~47`>` z0k2ayoyNdd%urZPqk%J#{~WqL2DhyW8Vj6FR|BtCIETgqZ=f>cDDKb_Z=?ypc?xf$ ziSR!+(*Sv;R|#J@I~N$T2Cv1KDrZFt#AWX0XNb= zj9PeiiT|S2z)f@)a5L~-+}7>}ZlN{6t#l7?8{KE@!#Q}L@ea=J`++;?0pL!ByXZmV zZQSD?0`5`x3Ox+mOOF_DNpA{#jUENQuJ8?d%y^UDq{o48DSVrr0KP*{8E@cZk@zk> z4XjnTpPm7}N6+FWe?Z|udJgzLtpgsS=Z#kp3BLe5tndiE2>g)N8++k%tAQWW2H+>O z5%{UX&*)#qD>%b80goyCoHhfG1NR^%r~!UKTYz6G{0i~JZus5pz*7pprk8=IX@{{3 zC#l3Uv=ew%;kUHQ*oj;79%BccQ+S?U0e(+=fjqDt=;)+yu>DNUT{vjg45f;>Al3sHfI{8b?o5Gb~}ChvfR!Z9yPQG`ITAjVyEw{$`4j~ zJzl*8DDev?x0(%H=BV*ulq{W$y7la%cFg z9>qeLY8anirq8T~aZZ)Xp%u>R4!bJvsIk%b5>LLji56LWA*1R@KtIQ6c>XfgQmCKyIwL^=V*SaJY7o!if6>P%aW35PM^O!!#$;PS_w8JveHMxZgg#kjP!27;ToCktSl^YyL{j<+L#FnZl0NVsZQk-yUgVdyChDQGjb1r8u*-L zPRyjpjfJF2n3zhHWvO7proHv!u))#smCQfccc%Vm3?DbD70R{liTcK6vcmzR__ zmiWclej=Hb%5h1-P~VjIc|5-M?WJCrGqI7FV;}Y2y<>+tHR2(6xy^|O#7Fr>Xja@a z5i)nV=Op$~L#~vbTo%)Jt`ZIbUdIkrpKy zb0SJpwa~;dmzd>CQIJoM!`Dw~@`M_*1*)h@*xAo#E9u{W#Q`qYf7qzTI44`F#~;la zr|IkIx%|D?W$%|wFQ`((g!OolTR5t+GT`#5>v3+MB@RjkB?u>rtq$tpM4r-m^iB*{ zFQz!Q9ZFQ3rZ{|u7yTIJvK33c^VvM_yZ%SL`2DFD)ra&?zChJOpse+^i1S$$2FLmQ zRUY3qalQ!jZ%eaWZ0PyeIc3;BZjf4jQAt#3u{0U^m1Fq)lw2D64^myVP(#?%x1rlY z7@RN9gD=dh_?8Bfay2w-_CXI?Jlh8J>e#`J9I2c$-i)kY&)0Oe}gq(xW|R=eTD6%II*|@)y}HW5_hhFH7(7T@A)^Qgs4nd zoUfGXpOw!@*Wr+0X6lS6Nb7T4O94?{?bUm0Pqi+L+4n z?2;yzQDbaf5#{T52i8?Gg?qvs3d*Q<^YWq9US3`>s%VQ1r~mT8q78yYW=TeIbz9UG zZE@mQSEb@oseE(FH_Bz~>;_>`RZ&~KM2l3dt_sw9Sq+mavow`4mDPxbGMg&Hrz34B z4zc!)(I%ie5tt6j18HOhmVl~2yFfZQv`OHy0nNOIzth^L9X$mJoo5cCLWy(&%AhGSC0 zQ8OHqD$xq593;@LkUE3BpnOnM%_2}0Xf4R66?%gL(nY$KC-O8sB(ZOAOg%k8EH#P6NDGk` zhy|My?d6VSPz@Jvh$(k$;UYfnZC~!#lV9!_m{{)U;x2c@qQU_lCT8+y1TfU54GxKr zmKJZ{7NS73#vMIagh=E83S$&TdLzq%kCp|$UKYH&EO=#EaA8?+L0Ryyvf%b*!8JVE z8#yxg)X3nWBZCKw3{D>zoH{bN`^ey~BZE7R4DQ>Ki@At`X^+Bz3cDzbRp{WN4Z-AJ z!z(xB+~wHLV<<*WY!Nh&e4$#d$Sug= zT;HxT${p|Y{aoO#;Q$;zCU*w=LUJj$FeBWT;>oQs8^e65o?M@Q{^+7=<~xh=<`c_d ze1%0dY{;UeQ8K*Sg1t&ux-v>WZ&|vsxR_ecNe@pC>C>`DzpTH2l1B9W@d@`d|K#T1 zxRV?r0 z%~eCpRsGFXz0FnK%vH@>h1-2=atn%l&)JK8U1i3w7w7uEC~%I!x^hH8cGebX9UjF+ zTSPy~$sVT4`(+gu=VB`rpBUc2SJ=oG;1$CqpBNtCZO%tAD9_qLF8NS=6r=i!xq{Cw z3MF4#`Doy?D?WQ8pGEOi=ex4As$DL{(~2lx@#ME6#iKRwxSH{pkC999xXj1?#AE*t zc-sCYPqUqynBn;^KG{>H=H(YvTPUL#p_F>Iww3o$S`?hu=l-azbVxf*fruspa2*MB zXHa^2xW|^piGD#oKNOiklDn5Hd_mM!o%k8W9facG#;T5eJNA`TumxGwLf&f{tHKxb zaz$W2z+P>K?xH~ILkC3wS*ZiHq>dQN$^(T%e;gy?c%ivG zUmK@AVccb0BtPnH=|G!lAN#|#9Ms<=8x_+{9E=ur-11+bx9D9u%dv2*%h02P9-*VC zb@MW@vwn%Oj+~SPe{?Txfsx`UTgh$?Ex{~K(?zP|Kn~%nxII57 zI>VYPwNcs&x=SCR7wD7pZ%o#@6ZJ0}cNpu8kEt(OFQnzPhSpIHn>d1d@oiiuW@;Ib zQjngmFM)imG?pgOT#RrRJx+VnFYD^K3y+AH_ z>wh)Eja1_c^wm@S{(Bg9W~%(fKP2-YZKQ1^|B`qdS`iNE7xFmV4xivB`Dy-8E6}R6 zpLD9Ls_#?3s{U)ER{cCnP-jX-UwKqSqo@>en@96$1wBbG(tfP#bI9;#s%HmZ&DZn2 ze3*~%FTx|nAuSV?;wAC2cwKy>&C%}B9?~{xC$Vxz{b6H*F~@j;!l3{0nCBoG4{e=F zH>lp1&`SCT-H#o9TaED{V}pUL^qp0OBp98c!yyp-?Y^}K_3^LP9k z;z2*edSN08&UdnyDyCr`2gJwXH?6(aOY4o5uGL=C4rm|gae7ZZLodG$d{>Ytd% zL0>v`KgY9W3fIItFQ+ zq;Kg5%+t(a?7^OQ3q|MV7Xsfi<+7|5>eS|(ipQzuZuZ8w()K8e!nD&}Z z``P?vDqk~4*?G+Ij)Nr*dM=UU3ZF8)J1B#!ba`QHwrBem1u`YDGp zIUIrP79Nb$Jg$?`kzK#{U=JL>1y{dd$iJ-_STd$V;?h zXygyHnCFVNY=_MEAWVOa`-(VTE5b!b&ZkuVNqo=OiQ6F0TX?#**RYEZU}38@hiQnh z7+%t7WhLvP6Cz{4EcwzlnY~1o(Gy4lJWLy`z1``PwxigU^ztzpg!T@!q=K zrXJdA@de*UJ@k_oKE3dY7HeEnXQ51rrI>obgN=FGY*W3~jgs{;*!O&@gMWJiYx@~G zwh%t1j%?7Ou5_B$(_1_Rw$T#aB@Uhy!6od%$p=IcG|vLt7zCf=<)_6X6u|FuF0?C1 z?*mW%uZ!yu^mpTHxU=!7zFJ!=R@6_U=cyR;pDA|JxAk|672@!PB*R}Tp%>Tzxn9ME z;x}4k+)4|L+n|HLzyqwp`E)P!HHE?R-szX2J!a}oef=^ikAK!9*`ytWrYqClH zx!6pU)Y8>5&ehU2S*MFmZP!Jwi7t>+--Q$5H{-ar&1AxA9F)8v*reBJ!QQaYkR=h3 z!L%med!Fj=-}*Isg!AhyTtMNTA+{d}pY4%&_Q$i7o>rIkReG1stoix5W8=GbO9@R* zPU_maRTwMubF0#1&9})vI;2I2xF#T_ojtC8N4vPhAxQ}UeRbU^S461Q+)_N1-pw6u zyYOqGyX&A%ZMzO4!{G14Dt$lB-~UBlm1 z_xG@8YFye(&eZJRWCAQ)W7yhJ2o9*&6<9LxEk|{+` z4G0OZF?M-_tvzDB_PA~y309PB#526{8G+}9j@{cdJXEQ>q1HRd(LE$c1VsnOSYv}z z?J@S$M3ETX&fX!WJp7jM)!}QyU-W$E`Y!f6x6$747#&($+gm->4i1+i*5P)vcX%8f za>9QL`z1Ok$Ume;EcZrQtsO(H){u~ZP)AT`8172=#yDc*;uC7b4VxV~of5ltPfkJp zB}b0QKTx)5X|Z(GEf$k0Kz9V{8ili*T2KQ2@n`$3@`tvX@V0i0B#*-*yz$-y@y8$f zo2vUcM#k9fc1jH+do-m+BhMm??J+Fk6B6vnDPhT=&``Ush3UGMn&NF2=Wz(l+pd)- z%Ik=UiH?pE#9Lu!c1*#)O^bB9*Wa3Mui^DxN1(Hvr&D)NqRA5&;tBG0N=yt446-D* z(c2{JJp!mkZ1e`OH=#RwJ9p{EHR7LMyVGiS+B@6N*>$_UXOGm>c`5!037%yClobEu zWVyUtdH$NF z`-g^l{PjE?m%4nMVdeTFy-N49LV?fenhxGgJ^WLWHQlzAyYnQdA7W)&nrEKv+}N43 zI6Toa?{kH={TzYEafPxHv8$@s)lkyNCF@&;^hg{VS%+ZwD|D9T@kmuhinN_=NRbgX z)YheiHSpxeB0h-jSmZ+rskP&&sfh``4>k|T5pUM&bIT3KYI3h zJY)Z&6eg7GYf+Hviyk_v2r>_fk4}l!qQjz7<)@fu&CD$F7JD>LSSL@KmKN3}yk|@w z&mb{S8x-aZ9~hJ885cXwGd*@;>?(1azAAcE%&OFfV%LlH(d%P(h#k>8V{2n~xBWlt zeS3UV)wTcLXP)QG>&%%m&&-^eGmm64lXqq&8HnZ-k`RzMh@hgT;T04G@*sfV1KWac zMXgX3{UB}8Vs9@3Y6DW`*NXMgUfWx}Rj(~v8_;@9#e&>cP4ZiNpEDt#_Setv^ZV!b z`H+*@d!4=a+2@?K*IN6#*4~*MOdKrzP3dnMj-kK!K9)cS8b6mtqMtWbbk4)$&H*?B ziY3?{bT%^zBvh%`626(?ApuwX250V^7B%Y;RzO_fNG~+M(W5pjp zS*WuU$8<5BW@2S(V(aT&u_7^Ue81d;`SXIu`8T%)MOhwwm85NNW=QsLKg9q3Iw3M| zwuQu~Jo;MD9hDz`(}}y7!(Vuuyjv1@QPO?rbc)hQ1@i_enOF|im3)td{)W*QAnry* zG-Jf-Z3c{DEGw980jI&w58@5G?;~b+h(Cs^r(U+_bu;dp*VMs}G-0RU%@Z3OEv3&Y z*AW9_)aO56?r~UTS^wQ2YmJV)ZsIMXWa8kyWEJM9t+*+s{)J67I%N$3BJS--gIbAq^0w)T1 zdj;Zhvd-eI@z*tb6(QE_9mKaQR+k($CA^7AoVBlV5Z5W8`~tiHok-XU@$Cu4A~Y8g zU5TE=u7o}jm>eKefoN@}Ifz4G5W5w3y=2&jObJGym1TY%u>XB2!p!{h&)o}zxdGayw<|cbn zlc9;KvK3T00jm78AUR{%!LdJ3E$-_?eV|^?)cTxUGfSdcR(Mvo&zTRwhb8iDapr4z zc<@@@mOn#oJNx?N25pW7px|xDWiw@^v8YKc%QdLz!BiAn9j$YVp8C36gKnPx_rJa6 zw(B+@U-@82S9Si%1+REHn-E&~lR2C2Gp_C<;=8QxzE{>>(Y0v#zpY#Q@O78pzVQ0+ zZ4SqzSWS~jaJVFYRew_) z{|e)c6%XLY@Kg8&>vPH1t>95$_AL+idrZn|vs!G(W_OBik2(XRPyj@pNSiI(j%+r` z?GfE>4<5ulio;V#h7c;1btXyXEY?AttYmDqq@8nDCOvLGCi6zzWjt(TjDaevt>DI} z;PLQoue%ad1;e@9U&&9}=_Ar{5@r+-iZtlmr%mvSiNN%A43k3sAZkuGA$|yi1;iyi zf~c5KDM{aI=9}y{zGx=W(FyWl(d1(vGLL<<7j#1+0)j4h$}?VpL1^ZozJ4%SAU80N z!LLpoWJVv0mYHH_Sub37K9kMBup7y+GuhP#-+J`5hetpD)*r8q9U>##cdVCWxW2IM z+jDo`*nMo>PJn2?d+F7!w~zj1`%62BIntjGY54P*)7S1^y!J;M|Il~CP7+!D4955s zuogLNdM3a-*ybD&Rs}}7%Y9L9M|QvWnd~dx7v*22%sti~8uxK5xORv1 zVc@@OSt)vl{DS;KRBux_XLHzwZM)GRzDp7H#;{yrAs?TdG4TZsodAGZx7Wd8jwrmP zOaVD6Q{b*;M6F9A8OU!|Jb^4K!_8%dvaYgCWk<>kWr4<^Tuls%7uuj|zM3gicU5ny zK2oi(_BX74*QX6($1oi?qFfy(J3-w6#}3ouyyC<#)DCyGV4}MfZ#qzj$QL zTU$EwpoOoG9X4307N+s>eMlU8YcDX&4b$RY;2z|SFl(~S+|7`PWM&1mj6lA}o+p{I z(wawRi=#Q=v*ladOF72DW!#e^Q^Xdxl2{}zO04HLq_$c%i+|>9##B?JS#Gghg|FhS ziEJ!0uS(tF+-Bcp|B1Xa{$%Q>=z#5j{W*Dm;?>CS(SP6%x&OhRB~GPWZnqfYSkA(F zShIn_h-z>9Y3+@N+ub7KEH0}YQ(v;xI*g$uJ-gOoR3B)ZD)mKXCNHm$zf{x87a0xR*edQFQsXZ_V0q za?MX-wNia_-Ky0*<1%e}I7IJnY5MgqLSY$y~p5-mPHNr)# z5qpHsvwttO>iyT0GD6Ci_E(fXrBK5n}krW3QAuBiod{*!W z_$psz1+Ma$S*wG0s#E#6VNir{dj-Z49}syy02-bsga>t!5-yiRSjbAgDkGmu26#Ri zXuyXm3V}nsm(OuLb+o~@@jUM3G4IdqXDs-BR5blWOFK@Ez~~(-Dr{57NK^ChNzmBS zurBR@A2L_>VX9v8*EkFfBxvLH(8{RFV3UTwW6YZmV5({(JtTeYfoDnfY>D^Rn|f|; zaE5&*;r=Ck_t;DD?LiiBy3RH-t>_gn`-r-&zjmw03O2W-^Db{$Z|0x~bnea3n+(;U zb1Bq_w>=X{lF5-+@GF4e5avihElFxfB1A0_dsJFgc}wH(QpTKRW^GHOt}5G&7S^sS zTbJ2Xxux-7*jyW~sjR7by7K9&*XoSnaHIxCIR(r&0N^r!#a6M^G|pm?BrL)QrtZl~ z6<1)e(JwiDk{~$k;azE2w$#hzCMlo9e9d-Cp&;RcG+){z?UMA;bIki_5^{r@dE#=8 z%;yJl*pVybdUES?$8(0&rN!lVsmO}(<4J98y-q)7Pfg928;OU%}v8Y zx7w?U{`R;j-ECy1&H+tAV+Z#*6B(4AcP1*Y4AutG^JDKJZtO3BUq3>PWAAC2h)y@# zhbqTT?x__^o*z4fg3u}jA2fEV*s_lxGf+y$BwS;uvDZk7rPZ!TCak*C2(%M7)N9fZ z(-}>6MvLmzdx@GhXvUgo=ovOz?~@M^pH1%F>#T|1G5^B95Xt#u+AaBrJ-6$v`wlL? z=b5YD9NjQ?%XJq#vigb9zdypf{4f=dFZNwDrD}ee;Bbd=`^?moFZTW7p=%G_df68r zwypfZ+*MmgKijeH5g6NEg!I>e22a8lC>Pb6L0=pIM;u;<55-Xem7`SH=Zy2I9GeR? zMjPwf*tS4>w7q@_yCm?pdQW*BE;GIz8V%|62A3gW(BWtdoL4v4Kex{xP*pjVuBxr8 zS80$A3&$1_dKq8Fq*G<_SX4s*lNvJhbwEEGZja&^iVouY6hFqX`obiH!m{4v6ogbN z%>@b$7PAC32K)t%NKiG`#r1HTxLw>BXXFA+u|nM-zFKjh6OnoxsjsQ;s(-9r4^Ls= zJ9+hwd})IFK-X1AZ}?>Auom_q6ZWv5L}bYP4Xzh4t(_)2-*o1@`~r%C5HMpyfX|1J zkz&H4C=h&pmKQc|Fmfs~|8j*U5X?7MEdKtyZ{Ka~>7o$^I^tc+4Oex~xnXnP#4;7c z191QRvbGINN~Dqh88;d_k9Wp5n>UVpR4h@^JlKpwFy3K<6X{S8yZ0f(*armv0S^2? z5rJU!tlO{myFYLntTx^yy46v$Sy`h&ua1#E=!XXxTS4;p!#1xi%tz zbB3YasryQZK`f8YEjW3?W*?joxZwo2;q)N{h=cbhojg9k96?TeHR6F^9^e<^3w$sC z7=MH}@P0pl4nGHi$sAULNvdpi3=OBph44%P>^vJxoEEZ2|9+-`y?;X0bQOwE&}R%@ z9@4)77+|I@tHfA~*=n}40c#~&&$gD>O9FvNNxGyWTp6tL*ZW&}!K68Smh=jUzyM3Tc_Kn``R<@t&7kqbUzZN*;~VH^5*c15d+R->atmM9y@iA z`KIDg97~Ohwo^wP!4ttC(rx%o>QofWay*OH0 z8jEq!Xn9o5u}!opkMew;$zPn!=W{tO8*R#>Hg+bd%1@tuaqINyZEaj@bY^Qy#Hg#Q zufcYQL-P7Wuh%C><#1F=rA3$-T3cGAEE3@vXCh+;rjKXv37vexNKi_Ot&w%QP=Pf$ z3LcNw8!eQVr?Q1qQ%j-gJTBXj^m)@Ml;s^K$a<1e0y^ncGUsKyN=??Qlq52|H{z}F zuJ`J_gUt1Nq9;lisjt(le$)3uGFstxnxmmelYfO`n)A>qm4aj_!n4`z~+^#}r9ixElR zmlhe$Tz2UEr;5I&ks9qR!Yn*?WRE?r!7LiAB8v!NyBXf!M-rJNX_90}(n=CEIQAQ2 z`yIqt1ljazc~r|&TAtPN7UChwK=?>}R3=H9Bv~FNk`|J*@=~5G7VHu8M9_Cb_H_#Z z*hD63@7dFJOq-`o#(!9JcHr$X;X5muE^$r!_T(80jW^I$fUS4y^Qo%3sh6#pMwEE# zUHZvom9^6@UrlTOi>@DRrd7Iyb62*twzYQ85`81j5KU*k=X7Sz3zl6q@;iEZpXjPr zO3Ih0rxPX_j0V6CEC4$&37@|Y$?7B;CCUz7Hp%xm^9+eIUrYue;&(K^8hSVMMM!4} z1w&C>8Oq@ELfv=+ek8Ojv|q9S2=pNtAYdvignhis$1}z@;~ml4>K_i-qcDrdz|6Xt z|1-+75R`|%4&%v_kdb0M7v4Mp-I-)Z5C;jm2tEVFO_WuCQC2&t3r$@-)0br7pN4LZk`-Gozu|5} zA05y4NHT4?VM*7ex8Kn_5xG5}jraO1rfgU$21Y(U4cxr$>0NE#9{J?UDB@3JhxOZG zgl#B@{&OG9LLb1GQt+_BnKvYz`6WSoz4dzj260vJVP-S?q~%HHe#?I6%a)g&9~u7J zXZMs$w@&AEoM;HnGhAl8+)QknpWDtn+R(+$nDKZ3uoQ ze(F0FwAf{2amyx?AUAUbt`{KoVa~t>q<~z|9o8{Ae`q`$Lh*Em8bv)Td}Rw$YQ{pR@7Zo|~TRSiAG`@B9k@^goT>r2jea zErDwBOG+;%1tdmzN5XELvM$C?;peT-mhG#2p~@U%VwG#kew@~Ct2tc52$j}KsiLg1 zYI zZ8qfg_=6!yRS1t;u-mMf0wkhgDMXZ`JKSDVswe9dAxR8{qy#cnfEJX>oWrG6rX_tvH1?p|6AW0!8-4%Kv^m<6w9O?@7gw}^Pg|>x^1$sirT_I!0 zUnhn5LEN-^C!J_$0b7l*I|juqrK`{2o25PyZ2)Ij+^(6ezHTi@S)Dj|JOsWjqd;HsL|-;+yqlf z`pHBQN6gsx#HwwhpKV{e9jxwNu)1I9)}S0}}vBj>SjJ0s|v28Z2fHFGA6L{W;x z#aJw!C;$hIh%Tqxr8Mv$Ywkixv``Y{Vin1FjJFkd6P|Cvra&bs#N%Rtk9lJi93Pt% zV^Hh}Xo$Z8K=QHO^UqiX>p0rPA3b{stciqWMus{`fM#Ocn{J0lo6LL@jdWAH+j-jT zl1NBdscL7xCfLU8ul(iSmX_ra4`+3hRQno#GPDp6km+<}c~FeVuWjC{+SfO>TzqA~ z9Wl9Lfy;h8njtpT=@3KA0pcW()vUL`rhW@-!z{d0xkw-9RxHpzj6Uy zIpsm$56~0huJRwudK&$#{OMT-(W~W$W_^~leU$vKS&So@m^CwbDD>-A!;ERIQ={Qv zz+8Hv^)8)JkxMPPK|EDqD>;vRp=qj2WO=X6LuGoeRh8|%RK{_gQq7`*StzgzkQw)y z51NmdkDK-8!0doLLxF2%5M?+%1JBrAUtXwdD%9@>*{%cZ>EcV8Q6287J5qPNPFLr@ zXwtjBL0q=6xV%MHw5W@$u5)SU1X~u@xrWs}0}~b;pG|s1kK1!Tcxq3#dD=zL%a0mQ zN4h$3XCK`eB9Q=oum+O0L3NEOq~&1((Ck3a4H-eQH6u8v1{$Vmc|^;nka(pZh;Rhn zQzA)w#E}ofM}iOfD#VsMbGhyG`nOy3dh}`xmP(OPTM}<*D9RRTQC|laROvyGNTI&m z2R)=6?`JYGum(47h zz{$F&t#o?2qf-PX2HpX(v${4R-fPB1<@dX-^hvH}f z$645l1@U-{&1MUgti@7@v6Yo6zn1V~gsclNqQaeU8=!jmdyHGUZel(U6K8`l^Xbgpp!l zr0&-(L@B&YS&VN6dEJCDPD1Xlf#eR19VHIg$NHS5Y^k#})~s)cb?CpTUv9YG&~LlL z@QC4l+xKEZmA~14q5lg1HGabuAI3_iA%m4zBIEb_sJRa~Bpj8cl7L^s3=;sfleclK znOOR{;dXxvjH)1+SCqtbzT&Q6oz4QwvSwBQyJR+#re-25JU9@%8T00dxrSP) z=kPZ2--B>y_m9ZxsJhwi^j17|VN{cquc}i;XC40ulz_CrIZ~srLq*5du5F~l8Y<~j zCl3|KKaC?r6c5&-56lyWd!WAb_$HZg>Coh7LP2qh%q@XmzqWXlc_oDchc@ajocj8| zucR{a@#7S$U;oI;d676HQ4Dam+cTwbKs{08ePk~AGeU+bAQ=ffe;)|(@jVXWe3C4o z`d@A}LnL#lnR=$w^LgNZ2*o`p%z(q?346oA>(O;?%MyNxbFE*ugj-@+VqIceVqfAg zvYg#1(3#&3NI=H$8w|^;N zfjE{6hKy(sKl9T>!A*8bxydXQ3}wL7{6r~NL@d7G!UH`F-o{|2ASl6LrdcQmn}ltG zUKrqAxY||YVqE+2K2(ZZcY|9%CL)-DMmqb3z%0PrGcp9D+|)$vg5lPx30o&sWY9@B zUUU{W$M7^li^e|C!iD5Vj_I@^EH1IdT=n?uBIc=k_Fh7<-DJ9~cIRUW{PVkLK@%;Q ztFw_Ir0XRk(^OAOU0cIwIUu`X7|k~3W#tlc3?)$&szx=amM`Zk_)5NtujXs`TE332 zcL_cUPphT5|q2QTWQB0$jz z18HNRZ4B5zmdjZl3?B|-@^1*-2z-1zc~9=d6sUT(?L^KqAmsKl!zctTEy4*tilhE% zQ&gW35aSTc8T`o5$PmFOB;-7D@)%D}2~B_`33?3=leIpWN``3|41UPUtZDDe#$zWmFQ1r$=}T(4 zos3rw2!lcsXc8k^-C{}L3L=S1+1A65xc-a+EMWBai{p zD#qH@(ecGfS5d9B5-^s~PuvOWGx`b9rMpHyA6-keYV_lvDA>6qetq!`CWN#33gqI^2#DbHXS@40Q&@@SvziE>X;#wvfaeMsP_ml1P+lOV^IN za2-Rp>Z_suX&hVJX+S)w37!?qwbfPWveE>ps|>fh1eYjiyN`0!F>tl3&30-moH3cz9bEH7MUCLi_(-A=#%sE6ldx%U_N zXm3#pTy{&%i19nLVl+rCvYFUoTfj>8CWl7~%x-Pu?IlM2=ZD6ah^rG=4n! z|L)M`|B0ht*RTJc;dbNYrp@Mi*#g&RS!#`04_go0E^^G}+xYhc9**N;#?5*>o)OQ8 z@0b2p&mHHEbH};k+;Q$Wcbq%U9p{d7$GPL&aqc*GoIB1P|9>6`p^M2M?`vNwehp1^ z^m_*6jke(q!=2Ge9em)&?=qxGoN_!gxNq}=4uXi`2(X(Qo}sY#=O zC#E>1O|*QzMw9Y(N}FlpAyt@U;MeSWIP+pN{1%gH#FhCVcO3-8cq87Ii=&YpHYn_{T!ooij=c)jfQg8 zO6f|{4?9Dnp&z!6(B=vJH&5WddBS^{C%l(+LVN3k_SOmGVl9r#P830PAOYkXNd#T2{U_&c?anKpw3_x1p?zPiJ>eqy#4G4?Ev2oizVrl>zV^MQ)4ME#@Js}_z3NN#n<2%dTsm5ar+Z4ac2X?-u$sBfT-qI$2T zS`Uk~zPf2jWHs`oHzzHYQ7Q@7l|xRXZ{hg8zUsMFe5vn$o=c~DUrc)<|FONF%9bi+ zi^gU6tKa^#T%Y+|lPB_sZ`6)!mD$ruMArU)tRtxv+apWa-Mtg2+Jsg2mm- z7xZ5n=~?o%eMOe8hzvm8+!ad)x)(<-9#}BY4HvIiT;04BR5$fBNAD+ZwJl~u(K zCQZE8^nnG-mM)sKy1RcR=`UMVTN_DsEM3&!v$AK&K=~yT%C*bjs#zCTs@HYQY42IH zpnq}Xg6@HVW!?Sr{&#y<0#4P|{@31TG|%(UK?k8aS&-Bp>EQk zNs81hqEdvC=A=kzPzgzMxs=@I_^-XraU9*;y5GIu?S9Ymx1P23yWah-cg?@`u6>rh z!=hLr-m$ExNPk!^SdTejp=_3SBrDuMA|#MameD5`mDqNQqcyx6fg<4%VSZ7*Y_c{n z0fD{&d}-k|Fw{3V$`2-Ghq3$uBg2DX2C#}SRUj1bg;M^ZY<(81FY~a_;8>Pcpf<}t z#D`4PuPd}q`in(E;(mdlb6Lf`d0bCx+y0M?O++fqghJ{w4Opt?|7lmgap$vU_`nPIB=J80X}% zv1Uad^Jsc=z^9?Xp+jTiHbLv=tn!0T{3cAkWaHM=IkEhfq2pY`H+czXC#@YDoj8xT z+o)l7b{7j#$@UGe&z-y%@#{~A9eYEr4DVNGba8~vtScF>rZ;!d z&X}6-a`9D@)9vp;#m8+H9qB)DK~hE1)5+aVmOKCWJ^K5wm1$>>zE?YWyIrWqtB$9J zw;bv|e9Me(9S`)J%j@U5YnFbtd%(h$M=#WdZEEip@q4Hsx5c5gW9=p1)0g9Gat9cz zuI^j%c=Or20U_7+K6JVc`chaY{|^Zp?}o9TNOwt8fz>DS_<{^*rbOx?OOt;`nNy?5~&8t0WgMCoz3 zT;qUePxaC$Yu#+EF--JquYvOREp0`E6=W9Fty|88~kBw_+N*Fd#&Hq`&i@&uR*(d`h<^; z^?2*Qp~*PQKWT?mtZs)2)!>)+%PXer8;~2i=xEAj{T)5-x!t+v{ysrx#v!{y8=D+f z*{sg0-uHX>@i5)c1D$>bepAuzbg+9ypHho9wnyYEY=tuCl%xAj)i3USdpmFIx%gdu zvUa-k+hXF>-)Uo7FG2q7Gq zO&sfQ@S(ray(|6mg3gS#)0gk4D4o}RzVnX~rL%Q!Gd|}eWxl`lr=9+mz3#sL>nbL; ziXG`8x@7BTH0OHYuXTk%#-k$E4%<_3M5R@a^e!_x-YV=<*>%_fi?Q*ol@~8hx0*2A zWc==rD*5`$M+Xfx&g|D)wfF4K&|vM;U4W5?{*vH;4MwpJKI(L z>}r4U!V8;c_uM)pbd^={&v|c)9X|E?UiZ1&&$!RB5kqezY`L&|Rr_@x-k7?(?#p_h zG^MFcb6dX&>Q3sd_43s7)OqXX+`G8Ga#+E_<&}M|EE=^w{($o1@8KV7s=PwNjUv)D zopgWf4UQgWklNu&u~PpR39sAnygMvBbLdLvCA?cLFZfCojW5Pd(;nHc^M-NG&nG;$ zeXe|EcBNsz%LA76%bfDfDWQMoNg9(i9K3IZrnjqFWo5Lpyp_6Bo1u|Lp^ak#(>mnc ztrECok9O&=d-{c4+6L2keIiGjwf!);|J1SHT+8D+7kC^UvG%rCf5);TnyNFp7ypv4 zX?*?0npSEoKG&gbp?OPShk;5^o?mrtqOm-I`G3U zPh8wHykm}dl18hr$E_-A%2YBoZCbnGL$O_6ztJbnlDB1Fv~iO!ZmO<$sMh!H_k#Xz zO?|I8h8dq}dT#kD^GA*P=2X&re&bB^~mN8SK`iIeEs3; z&*g*vJgIB2q|c`Y4|t&!8SPr$*mvabVZU4Xs)@#wolYp66Zo{_Xu5y?|<&9yL#vu=Fx+HAq zGCk3**=OwRd98|cMMb)MUQg@x{LGQ$i>(?zC#fCn^1V~-k^4^`Kgg-vw{#|zT6vNj@h)e=?Mkzud58L$)$6V@xNM<0dEBQ%t80B{x1{x+HM)9%*wojh@5teQ zZts>qN-CBwQr~dl?52njrxpu8jbC%cZCt?mg%;nx?{!{lwYK4Vb4K0krSYd9FZs6X zL(!=A)#<~!>DH{Wa_q9WCRHQC_ohKj)3w{X+Rf4n3brZbzs~>tJ+3}8;9hfTL+!7a zH$#OE8Oif?%-W^;#UC1J-FtIL-QKn;t*U#M^{%UX{pr@AZ3pkJOWk%PCpFf>A%4TP zfJ@FYK$F}a{F4a*!k6#@y8y_(BAv>c*-oJ@o_~rkGD?ucsM0dR660J?vu@<YTvwlkCrs8V7VQn*`UbpoOHhIGJf~X*c!i#l}7!Wx1^m3@VX|)XMsK9_c=9NQh}vryQ5ttqvI5 zTfe;D<3>)FgN|$NgAFUQ{H?E!i1CTIjv2GmpRV6Np!L4vmvp+c z6{Y2Czs>D%Iy>g&t-*zhnv>%Kj#tGlZND>O$syD08s}cMnr^1^<+1hnyrI9Wtdsxz zI(wHV#+7d_~P+2jMJ6$gK>vEK3dPrcux z4%L1!6K~ao>@Db|{b%hj--+bin)mD#tY(Y05HrhM9})jr&(-<7y2 zzxGr;71!Qfb5=I}yXx(89loZlIDO0X;E+*~8FATx76(I*Y65Hb~HDUy2ZRNsm)ss3L zUbN-?95dS`t@WJh4d1QN4VyQiGGwCoaMi%ey|Z}NB8ER4uu+z8^ZH7s4ziqv2V>2C z6pY>ctHXgk6W$HBT-S5K+wL7SXT9DWXl$VWUQczqQ^%lILsSw%nkVV%=(j)oP`PJj z$?48{#@6jSep{mYA*NM>#hlq!0>|5z&HpBjx;Z$6Z)DO>(lBP|p@{?OL(Bs{xoj^U zd|rI6r_M&JDIwlAr2?B-5p}I*8h1SAqB_yWqVz=k`fU%Fu4?t9qvs=fL9Jc#Y?XWJ zi)^kg>c2?;;?PUI?(A`h{hnBLck>apSJkb>Iv zlEHCb1pP05{e46)xafZCkNydZeLZ%?9o$gfxA&sGVN zd~!2!&+^GCo6_$lPG4R$#PCVDS$q9XKSFZ9%2lqlf4@_$=9JA9p9<}VXPZ-bJC!O@ zBlm8Y6u zb1JUba?{AW-JLcqFWP3Ue7N8C=A84t?sqGQX*K$7^C;b*brZX8NxHb*;?TDF2b=8M zdX>qeM%VNl&^Di^)N^>qIK7^uv%1d-sXC?-cgSn9d7(~zlH5OZK*HU8r-CUnPO4@_ zEH1dw!QhL!y~DXb>$-pJD7N;V{IRZkP&>UhOHI2U&Ab1@r8uq1^acNbJnH<=E>V+5 z_0m{-aKyU3L)=vNwHfN_a%6Oo>-D+?nSaI<)VN%-bp{U-kS^UE|MEM?kL zr!OJrB8M$CPv~#zIoDA~r%Ncmb<454Q951QhbOA06@H&^*w%4><}_ZKPG3*YRzKQR z+o~!x1iw2`mU!NsM?S3b@Rulbb! zJ9nw3{j9)%FDnl0IKA({e$nyz(rYrK*!JBwYVqg4+!pIQzViOy@0Gk1_Wjy&(bOVz$j6XX zU+r5D6!VtEIv)zk-LzFzWz(x3MoaH&%>I_Kr;ML^p=j04`NLIHtAAGi86&OLoH6~; zIR}3B<2P?owD0ZzWXoUO5au~Grs&62Sv&Qn{hgNEW?R}0x0pY+d(58Aqk7Mu-ru@n zbg-}c&82F^xsM|DP5t%sOJx0r-=E)_sQ)6xp7;l;L zViL(zt#d>d|TGdlaMG=5jX!Zq(NRNa^v_DLge&x-s%%SN6l(yV#ekT;`Ye@R&T z-Ok%oMl4Y6aj@&VSJwOV%-=Mo|9JPdX2+%nU5%!-Z*!u*-o@_w{gcWvuep_s?zg*e z^|>o6=0>#Ktl9Q*%owxjTd&X4oymKw9Um~r+5Ply<8L-I@BOLN5A5Uj<-{qksh6gY zc^|7jQ8``M_-cvwrwvxFbAQ%4^-UOer(?*`_To)ZN{^V`Ad(8^&5a z%_a|z&pw{kW28pc*`fXV$es))o9o3EdOjxOBDXq*YkHl}oHf!VY1XW)wjBoSYM+qT zZ&$CD)kD|rbS*2L@WVEJW9(07rv&q*PC55HT_0N|4&RWsY)_(T-o7T@?BB~@H0=Mm zbo`mKgM<%)&X514)fDqMIV#H}VtT{Dq{n96&Re>6eKOzmigZTNyM6B?&+N#9SazYKV);d@*3TKDCP@Jq@D-PQH(&nSKS`F&d6x0mq~ zzk2N0U%6Fx^k7+IQFg+PZ693xcTXPdS)KIoh*9Ow7iVR?D-v$I7vJ7~)!%J$@c7=> zdL9`$;o%YGZtEBKb$jS1Y9IC^vvqgR**%W(PREZnF{>J$v{}{Zr1_NesYfkzLm$Yh z&R2gq;#l0Najbv7oL;*@3X(XYElP}d)e#%Y%~a8^2A{8&4T@seaYRX>}xu4 zgYVTkaK(!1E2}1z$qP&CozuoX$=zOZ*+2F8g#kmdXV#Cqb+FYS$yDE06D+jvOzmh}CaZ2y5h__su}D22H9dRyv}bBzu0?e4s?q>w*ZkKro-O)5)8oPC zt5VzO9KEM6msyB!#};4pU!FhmR=&=IaUCDIRF^!KUiVuO_HpdlDU-HpI{fj;kefQm zmeoDTP4^zW=0rcg**gvxYwo;o#BOoi*l(Bo_uG}uI^KQP!v5F3J~^;H{b+^BVY{Ar zH*I37%ROVHtApE|-@L1-CbE6d`@scsy9PQMKhn|F)zOVL9NR{{_5IE|26pzemZ4?G z`KUwdlp-vi+e_n`zuVw5Pw#U{ z#l2}gGGiV+o-UX&XY}TC<)H=gEDuY^^Mk5a?;gBID!geo@U7AdPt)h4E*nl;(x-p# zQ(b0%jBUA}x@yI*HZQ!#|EzGBeDB(kvgB0D9Q!J_hxM;=!hbKDbL#Rf>nnM=2QJ%Y z2h7Sl&^+z5lhKI^mxl6$lHUy{U1xuK_iF#k>s^-|jMkBVF1PhDw@XVnY_r33cKn*< zCF70Tg-;mRX;HQ)U*@~`M^Y=v;L`bTN4}19|Fb#6y6BghN{=4amYd(ky={)4@^+-2 zR902nbK|-11A1N@W8P7ieZ+EH+3j?**ZkV)d-|qTKWDA?D|^3Dt6B4;m$SjNX;phLlsE%i`U}x~j7jZt8A9mfZx&Fgv*O}{6jpd#6rz}mQOYbc@-$Q#z>QVWz zMMpnarD$f>ZcX%dPiM@N9fQAEfA*d8;EGB~aqz^O#e&Of-V0VN)E*i7A#<>% z#>`8ZUl(68S1j zw`OZ;pW1Edb+_(T_^+I><8bGQ`Y>7A>p5$lFYLAQc>}%aA$yb8BXfUgLG1*!`tnC# zw-p{R(cUq4;utHRw*7wBS;SthOtX2iSP<(W^f^#>ZO8o6dP{6-cb_~lY}Miim&zWd zJzaXLcI=A}8w;KW?fg|OC|$GU`4Npz2U=emdO60i>oR%mw{xD;10&u~J#kt5MjF3y zsj0m~+=-Gd@vfik0*-g@v#I~ey?m3~gXWa{hEHp8Jr8T^slJ_}MPxPT*Fa%;5XPo+&FLq)Odpbobx;w8zJp@~I)m zie0~by5!d2{5aKn@Q~2yQ+Mnc@MNu7>7s-$hfeL8s3Q!lwi`711K-p7i#|2HIbJSYaG`ica`L>HtAD)ew0}(XSM55zS0m*UD^@Obynd}Ds#2@w zp6Ah9U+12F-4 zJbbE9RK9pHh@+QQL2|CHM2{D`PHS!zC@#`&VvZm)e$lQa0IE}7-Md~&*{XLirn;x32khKEeg z7j6>NZeHHI>d(Ez*R5L%Hg)vMDeSUGRjrGC>>FFPTV`7(G>zZokV7s7lf^}SdHb3= zyz1nC$=vnwD4)EieZyCHIXa&H>G;)AO-RmSR%SR+PuVD_HMz%-SZdjDX!jKlCBlMw&CLP zM!)X9&$soxJo$S5^tgU?n|DS%ceiLZ)JzW8JI9T8E!(+x<{*zdf69CtOe9B+Mq9k< zv?i*@ooA=Jjq6w3Bfam1cW!4IH<{|MJ)EEB@Jw@BgZS)t&v663F5e??a(4`>e&N)x z(O{8RyiW6xf$4v$0+O{}KVBfma|+v~fR36Gj4zYnbK(&uM!z_%IZa?jX)y5BEIU+FYwEG;rjp7L(^(fR$7&%a4p zIjGHop@Uz)v|2i8_m^>r?Gqf8V<)_L1D3y7*$L%hNBX2bVOZ zq>3+TcT`y-cAR`t@8G3#l{;pZIDTE3|9I!=9Z?q5jmAS(1?)QVJve!e&w%@D4SyZ_ z;`TND#GR#vHIL>!l`nsIBlq%6*^5!jx=$Riw%gjm)4|STQg5aXIJV^3ALVszZ}**Y zVZf#KQAKScT~-FFnsl9*QL%Hu4g2#gt%Ju6SL%7+b^k@4Qv0y*HCv5~&Ha6qC#Z%t z9K4eAs5U=T)wWafRY8|A!JSUD4{Yd=}WNj{&;L4Y0Rp+i~yee;aOlfyv;|qQ7ab~lRr<#`>e4W*C*TG8vnq#{oA3mD0r^giY zo-^l8^N!y*BQG%C@Jfl%q6PMDk$1LMy|CP~`7+N=7<>KC(c3SK`l&s)d|Du@e0%8J zho*+RFA(X}sC|mg@3`hOKh+s3xA@c8 z6Z?&fKGffu6t=@T+ueU+sfJ*6%I|F+hcBpjuYPmpw(rYILBZM;RkMBn ze70DbSaQ`nf9y{Si!OI|cD}miQr2Vd*Mb4LQyjkJbRIw1Y=2-&!`6L|YOY-HkDFC$ z;W~M<=|ld|C$qLEB-afZQjzZVV^7SH%LdW+w@n)z6&|o}c)q|9nu!)mZ%3*KGd%EghjyXw3cdKcy0h zl>6q*U;q2hzok;ye}t$678wg>7+X#Z2v|%%c*YYgNBR2%81selzkk@eTG`w1hl_c( zQhQq)d!AS%r=KIF@)0tb(9ULr(9X{K{~bYl_`g4+Ba+DE|Nd@{_=R`ccZlxPch|FMcLTk_1y!#;SFQU! zebHABpUeRV8afMqetOc}^gCeg+RI7K0UD;-3zvGNXzm$nVJ=U4xXP<(vdi2x3Ax^3 zJAJ$F{O0QSL}{qjbfc&ml?8)5Y!kkAX`15le#7vqV^r?0c=m3(=Twh|ps?aaZU0$|)k+QSv(Ruy@9GedFR)5Hzq*i`==z`@wrPG412YFojxzD%L`xzVa zl@A()Tve_aa-p4}N5Yb6^$W|33pS3dSfnymk{b|qth3ghKQmoc&rg^%Yx|J>1(TF# zEFHLb;Jlq;iCJyHRGo9vJT6~V8L>w@yzzFzW0i=Q{;D-@;j1U>%#1srKj?Dc@S(vz ziC4Aqf@@P|X`c zet3L7r{?*&>}#J@h8B0%s+(>*<4;{!`v}eH@oUr1jGcBN{nA0rL5s6R*QQklE8jVA z#`XG_9qHrVjXd+YH1pw6s|hoT&!1j$-9f8y@qqckfgbL1yU*=+JU-|DqA=|Go%2t> zzD${Uy(IHtWzmY7lvcCKYIJ{EoN z_G)6E>4)TdJVu#^c|X)jP7zH{P@8&F*+u>9IrE+Qb6vWha_@6Grmk{*fs28`Lyi6C z)Su?LprAvim;ks&uYhqsOA!d}Gy{ zYtMDRlqY%CX|U(Y`5V8UQwn$IEzK=>*6ylDz?XGHQnc%GteS`E*rj!eFY|PZx*I4zb3>e_?CjO+Onz#b`nJGs{x@QG#q8y` zyAWjRpF1$k;BvWo>87he+TU`Aq;>A>rF-m+ja5iQRd2&wlVJT#<(;fH9_JYdt3(H~ z%&j(ksOmNIhU2xk`0B1Ra|Z+`Z~io>Uj5Y#{SIG?FTKj%8?0yKY4IxecW`GTcSGwu zhkDI}Wx~m(w^vR6*w99$s!v9~H0i*H%k`ESIhOSrL(6=dLc{7+GRvKt*1fJiEQ4zDfD>*&)~*r+{aW3!!} z$u5n1m9s)EM|Ta{=x)z5S+ylA((~rP^*yp;s_fdEL~C5;g0r=I#F*Ka_M+g9vu5)S z>-?|a?Sh#zY}L5L%2^lrqkD+C#6;SQnRgM7OQgLdZgDaPHty~&m>>5-nc{KGmZ24VDgf9II*SHtyIhz-)&Hd!jiOfmzDB{i45y$MaqrY-L+X@fUPhHxi zFBkmxU;hf;LVGyb+|T=(&n^91?wXd3+U0i#t2^$9s-j8=*T}f#Zp&X!hr^w%AnxQX z77BF!P@VKMSv76()}q+6efN%>QN(*vqe&ZH6ByAr;Y`!yG0%dMxsEuf?ZyPY?%~$D z9zo{ojy}{Jd#?AM1bN9J>W#`H|MoI<8LPH+l)@N8c~( z?CP#JKdSXJUDxuV&suNbb$Q|8I)BrCUfaQ5(l6_0@O7?wb^a1{{hYKeD`RQJvPO z{T%aEtzvzvRS)DZA~!^LEuS}iu0=RkE6>cIw`;@m;BEnB3$BGNt5$zczU3jmsx_={ zn%3(aET6P0Zn;ZHLw%dfH}h77wH!Vm_f%bn9xM`$L77v8_+PDaWu@6&X-#uj2%-79*_t;$)w1@x8Uzndc0erhd8_bA_} zYG2=LLt$n|r<((}>NiktqaLquncG04cEex2c0*xa<*c{VP?MvJ?09!4JHHqZcZ=&` zb9GK^^taceW?$>)b&-C)`Wa$VHvPNe5#QHf6MMl%{yXp>1E znwE2QvM9qbF;?R;*A*M%`)}dK2Cm1`M!125>+!0zi_01rer`oH0C2;DTH@Njk6&4@ ze88j`bg9=Vx|u6=%Bh@H#Otriby7X9gKXM+axL5XiCed`l-MF*hMB~F>Ke_(7LXS(Qk&V(_{^ze7G;(QtkREn9mfq-f z%BIg7EipGzaRZl`cW=QPEvLT*uIwi<+DFalkUdUync^|w&g6(Uo!1=cUwpXSKU>NB z)Kag9IzLl%{^^%H{i6H2biIF0b5CNs=?UVJLj!l(3^w2RPTzLui|K}6Q`$_;qwaai zeaifhC+7wYI%F~^VZfk7m8UmKT)NHkF!-B~8hGt_e^~-@iA}Qv+h^jrC(xS^4qTT?EEE6DaEob ztNB^y4(>AbJR4ct5q#B%@<9D{CP72uaysgVIq5`s1&ZQwPsm#5dx^%~ye;c=+}(U! z{v261-?I7p!uV;eKD^P7$yqKls^GVFF6-qMIVO;Ak#jUne_LSpGdIO)y2YNo&I~w` zKCCoaFU8C^b=&fU)Yn$a(he=w=}A54z2TK6$ngTrL5 zFxc=xdAnc?HZCqPwqn0?g zFjG+a-8lt1-DCgioZR?ykuT8UdLx09qaQb-{C8tqPZrQn_}`vPKdG~oq^Esy z_^UT^VRiCx59w-lY*Q_*X~G|k-b)JT=UlWIaM9lNV$OLN z^}Al}PDk!&+OxJ~dXH0whD^^(;&*)E={rBdAZ5tX8{_E0 z)l;gP*X2vxkaMPW*{_~;`0Y9L%O<5jWA*GTo#+uf)tn$R^_+598;3V$F*ioWWEX0E z4sgvcbJ35W%hz!?{q}`!3sN4JJ4a^VTc)vZ!-c@Ud1dosa@+2USj0E12(-4y4NGgK zUD3;J{iz_iMb3`2HqPZM9I1<{7khR+R%TxsLj6)&F|IV)HE^(hjzOByvI>jRjVl9< z4D&>exf_C8buM?Z3eT@@d*J3`tFYsIr3YoxtRg-b*tR@d(c03puTOcOYcb9|y|Zt` z*WxboIs}xBy%zh)wx!kgHwM=tt^^w$EH_ydIlhW-of}`TUvsWiO?A7BoZ@=rmRxDQ zmP)l!hC}zuM%BWT8(YrSx67=MHm&PZ2A$Cndb`z6NC=^RC%p$kv$I<&Xo zu#5fmlAsyM$0b~=@qWW42x++!eOy6uj7dS+38JZ zuMU1*+XaW|V$qDC8?ABA&+DeBD>3-5T{_(vIXjfblB4F`W~m*eF(K6KNubprq+@7M&hMU=odadG)lDl}0GS8Vof0#&n-@fJ6$QiSFqv;Zn!`G56 zSxJ7}1?+;DBD!Kc%w5l3dXH0*Ht9=Ys#lbM`H`` zkDSU~S;zi$?SGIvt6VRQigE7aRLC7_iH`gqHGlsktvegIqtv9!3L0JhzQX0uNO(5$ zK4MYw7mvAV#^1DdrZcUc)OhHxtC+vLsxH+M0ha5zb9HiQSW~-O=6vmQ%{MG{(R#A>!xW>NZiY`{ zF1ML_^N!!9DPJQ#6}zd?^zu|q^UV8n7bCqxgI63fU6CMd zbRSWhYyV7VuluC=;cK4hyB-?a-hIscuw!vpvR&k$3 z^dC<>HtgfBb;qk!eG>N69~kk|`n}4osN!nD%L7|l7?@MU<*k0pQF zE8U52*3-YLQgGu)cJ*hA!{v>4yQdGCR+-_H;BYYeX3)=1e>%?|cPAd+lnY+y?W3m5 z>ED0~0yLYYKDck&d<MV#tDQ19up@Q^Vu?) zQ1Sc;MH1%tgd(Y2@tCQ*NfpnjP%L2jkx(w@E1m-pkIz%wo`@$BC>|emBj)%-auK6L zB&QF?E3`?GT*mB!o)9o&1dU0|_UMcA0>%0e%Y-t;V;0kg=|P#8Et4|Z#4@Q|u?>mk zJdxr#5X*%U#W;yTDqzdlF-Ia4NEOF5iA=!sUx`e_S8N9onS^_u@~?g_p<`A&FA_PQ zuecAXSi+nGDV;#YeMludzG54aO89cNOvsF#Qo@Pid8T1QtavOkYS4gVV zM>GG@E0c*Cy>bDc8F#6fiWU1l)rOEQlQQQ@4*D;Rrp)olg(8MMa*2$H`tM_w(@>&# zUgT1tK;gXbc|3uHEu&WX@9ptIK$aB6>%4hV7cw(lGL_DeD zwF;q3%IufJo8qyExK^ZaEF!vuQy3%oG-50E4=R%=GL*^)-iq6!^P<>JMG~H3yXT7} zL_)<}33tW$@Ae|*F+Adn`P8Hp;|Sgg;~!rv7BD)*Vv%CK(GE!pbG=I&1Z6@{CIV$* zP$mIoQcxxXWpcJm%wD6@sR4072aUUm*Y|wtA8Z-WLE|_Z2Xs(BXXAhl3D7}plF6lO zZ?+8RpldER4(OmUjEw_2i05n^&_UOZOq>+xARe)CK!+6QAg;2xKnGoCvvEKNT@x~K zGN3~SbkOxZn+tT%7{pI0a0nI6cpo6aYnK)X%!bkOxK6Gxn3%YY7AmBhvY9W>Wqq#~a=%D*FOdQ}jca6!$0Ub2QVdFr3 z&~-Z-2XxT9f{g<@XwJ#R0iFv0&uMZGa)A!Oa{=JFKnipKo(pKs$sRM%0eCI|JQo0- zbN7dseE^v(oV(x7=7RbFJg2*EY%burknYPf`v5%W?t8OwKnLKt5b#_G=I27db0Oe4JrrS& z1@K%5crFAy=boo9+5pdmV16zHJm;PhGus0^7XqFO0nh0sH`pGi55RLFn4i;wM6f-! zU5NnC>4_PW%RLWJ)JqR0K^d!q?gWE4wm#@iFoI3kcyHCyR7w}vJ zcrF4w7XhA&0MA8Wel7w$7XhA&!2DbUcrF4w7XhA&0MA8$=OVy!5#YH9@LU9VE&@EK z#UyNf0G@NtPMCTFJQo3;ivZ6>falzECUzg7T>+lc(-<}v@SL8|fH=_40nbH%=OS>w zT?BYeufc)+g7FIQTm*P70z4N1p3}l0cE5nyAQx~5#YH9@LU9V zE&@Ck0iKHh&qaXe-1;V_tpT2k0MA8$=d?+#&$%_T%=Q4!C18Fo0X(Ng+#&n1B862Nl_;JF0woL1_yIsngU@h^x2^#SJR zw4xv6f_@HoE&)8Jw*lDg0iH_$&m~}fE&)830G>+#&n4h~y9DrD3V6=FkE7Uzq+ot7 z1w5C6`MDJETnczD1@m($;JFm=TnczjFJZAd0MEJi5*WRJ=Ta~~mja$k!Fo7akPi02 z@>~jdE(JX2T)LQJ2J>_7-5WNJ?H^LWb1C3C_wEh5J)i^dTnczjFK4jZ13c&6yJPkX zcrFDzmja$k0nep?=Tg9P?wv>GSOCwZfag-cb1C3C_bwy54|cqg0-n=Lg={Y1xfJkR z3V1FBJm=p3V2%&)oZf~4aX<&)xfJl6URq(d2Y4<8JeLBVO99X6?JBSjpabxn-ogU8 zpgsW4rGV#Bz;h|!xfJkR3V1FBJeLBVbMJ^T^$U0|1w5Amo=XAGrGV#Bz;h{>pL6d~ zF~=k&rAvppH$xeV}J z26!$5JeL8UbMKof>Yx{tK^a>gGQe{g;JFO&Tn2b913Z@jp34BwWq{{0z;hYkxeUzD zWq{}0`?buu0z9XeGC>?W?#jUYoO_py-3O=-z;k-}kj(`=rx*D^9LsYV;5ogS3Ub+T zR|a^_y-Ukz13Z@jo^$UCGP!`~GQe{g;JFO&oL;yG`vCO;=I1iNa~a^d4DehAcup^A zv&RB>E(1K50iMeM&t+hKE(1KL7mC?q0X&xhp34BwWq{{oYykEF>I2+wmjRy30MBJ$ zel7z%mjRy30MBKB=Q6-^8Q{4L@LUFXE(1KL7uwl#1$Zt4Jm>r=L49w5TYy;%7^&tm5mjj;50na(F z7scZvlLb)5>W~AT%K^{jV16zKJm=m!W{w5$Tn>0H2RxSpp34Ex<$&jMz;ij^xg79Z z4tP$k2&^{1b8<=maiBf`&*gyU+&k&aIR!kI1DP76crFJ#mjj;50nf>xhTSjVxg79Z4tOpH^K;HagV6?fPOc#!4%7$W zxg79Z4tP$EBkVo^&*gyUa=>#r;5p}O#pne*CnF#>4)9zKcrFJ#=lr0U{Q{oL!Tekf zcrFJ#mjj;50nf=?i9Hs;b2;F-9PnHYcrFJ#mjj;50ng>^{G2>PnEIeHM#o>?A`0i3 z%9wUVWlVig8Pm_HjOia##_)s6n07^FO#k4MiIw8Hr!t^}`8m040Ua#Q zDGumhc}{Ua2g`Gc13FlqQykF2@|>K(fDV@DoP!uUKC?WhIG}^&ImH1TEYB$p=wNxy z=dnDeGSJUio>Ls?=Pb`D4)k-D=M)F}Im>g3WBWP5kvY!<8c@d82MvHAj;#;stRRl9 z4{Agpj;#+8!o~rflf4{>13CcD`GDt~C#vE#4Il8Ftm!};&;fYP2R!Ekp7R0E$<~hD zFW@;J@SOARWwZgFlO-OA1N8xT&Iddvn>==VfaiR`b3WiXAMl*)^uRuV4#0EHYnM4M zfaky;j+zjt55RLW*aQ0j^#OR!2RtYDS$2DX=fEG1nmDKrz;oaaN4Y=;;5i@goDX=; z2R!Ekp7R0E`GDtSTF9Okz;iy}IUn$x4|vW8Jm&+R^8wHKfajcFDbxM{&-sAooM$zg z3)&UnIUn$x4|vW8Jm&+RlQ|@NEP&^Hz;n(ElhFZq&Idf_1D^8%&-sAoe86));5i@g zoDX=;2R!Ekp7R0E`GDt~*RJAu0se4=6qbVm_I^9XvHgSdqGtEO)(7y1qwTTdF7St= zIG_XYTmX130P}M)9c7Oh@LT|RE&x0y(_pYYmLCGZa{=JF0PtJ@crE}u7XY3M0M7-0 z=K{cU&UclmUobxx0G#hG&jcrE}u7XY3M0ME&Uo!tlEIq-+$1AjOw1N8xT zE&x0S{&2KCFkS(k1AjQO6=%mQ;15S}Y<&m;&w)Q2<+9@y@Q0%~RtNV@5XJfh{%|z) z13CcDfj=DOvh@M{;V2I106Z50o(sYKb|K(7eVl{U3wSOBJO}=8oJ%~|9?$`JP9KN> zxu8A(&&epC%>_IM{%~aJ4(bE&9QeagE<0Wc0ndRy9Obh8oIb3;>Hs_k{%~|l0q6ic z2mWxB3v>XU3jxo8KOEi406M_^cJ5mhOn(DB2mWxh574dv&w)Q2<$`tvcnI3jx2zU9k06Yi&aFh#l0GjR`bgtyhodskKLF2xKOE(P zb_IA2{NX4U=m0#YkH@iX67XCEcnv`AP)3% zz;hAcIq-+0F9L!306Yi&aFh#l0G@Q0&Z(9Z$SMS$nP zAC4Xi0Udznz#oosfeyfP;15T+KnLJC@Q0(vR-j#h`|aE}Cz*B%cupT-1aY8Uf%!Ro zfe_@f?F#tA@qs@am9h0920RD;aFomH0RC_k$M$pJ4@Yr82jDsIhoeV^KnLJC@Q0&Z zpabxnKDNr7d*Ba8+XFhl{2chh(PK`a1Ke*1{&18FbO4?Me>loz+m#sbTny&tz#one z{NbpK?H|A&j^cn0Fh3Uqo&$e4+8(G6z;oaaM~{<1eE^<|0ndRy9Bq&7=fEG1;y`@> zo{Is`fj=Dgl{vQU0-ghZILZa}0p{nxAC7W?4#0EZ4@ci+WXE0L4@YsJT>+j0e>lno z^#OP;2KU>6KO8L~VCNseACBTceE^;Ve>lno^#OPe{NX4U)Cb@>@Q0(N5THH)&w)Q2 z<+9i9z#op{Kz)GuIq-+0T+q+K{G9v#sv@U>KO8Od0PPC!Tnu;){NZSOfFFS8VlY1k z{&2M9gw-JdJO}=8l*`r!@Q0%~wmu|)=fEG1a@qO-{&2KR2Iv4h2mWxB3v>XU1AjQm zW$Qx%=I6j4j+XJT{T%qiQ5@UPC4lD=Fh2+WaI`&8AK-qw1n?aA!_m?spaaa$fj=DO zvi$@2!%-YNUIBkNiUail*0)Ol&w)Q2ANa#j8K@7ybKnn0xj+ZtxdhD5fj=B=5A+Yf zbKnn0OTmB+z;g+BeokW_GyZYk)>a%7C18FI{NdhrZ$<_z( zhod;QT>*bMieq&Ee>jR``#JE3qd2xcfIl294Fx&?&!vFpz#opb2Xp|Q1AjQmW$Od@ z!%-aD&w)Q2EpcVr74V0nIJSQPe>jR``v>rcqd1@g@LUS!=Tg9P;197d$@){&18FbO4?Me>hq$5BLFi4*cOL7mQbc=Ta~~ z2mWxhJ)i^3&w)Q2E%66B!2BHe!%;5K0iK^r0nep?=fEG1UN>O-Iq-+0I93Pnhod;Q ze*k|tieuXq@Q0%~mgm49j$V-fIsngsKOE(<{R8;JQ5;(zz#op{*zpSZ!%-aDu7E!r zz3Rb^S28d^2mWxB3+e;#9QeagF3+j0e>lno^#Sg;1AjQm z1?>vV&w)Q2y;1|}1MnR9!%;4%55RL7n4il4&w)Q2?E|zcz;oaaN3RBf`T#r!{&18F z>I2Nrfj=DOg8BgSa~YVQ1AjO^@Q0%^(9Z$SWq{{0z;oaaNBaOe0MCIx9KCJ@+7+0e z1AjQm1?>vV&w)Q2<$`_==I6j4j$Q`?<1Uz=1AjQm1@!^u=fEG1asfX8&w)Q2<%0eJ zcnjR`>jU`1(d&ai2biA&e>loz`v>rcqd2x*0e?7(W9tL>!_n)FZ2tiMa1_V3 zE8q`DaX<&)Iq-+0Tu>i?=fEG1UdaSH!2NdM4@bG6U4i+z9PnHYcnlno^#OP;2RxU9`8n{1qgRnZKL_)3Ip8_) zhokL*@e1%9_`^{y7i&moY6sLO#h%Vrd?4PQy)~u=%6x&=TyeDD=K4j zP#M$Dsf=k?^vXQY!SbBqfDU$kPH{j7J3ps5po5*CQykF2&d=#Jf1rb%pHm#r!QOAD zIG}^&ImH1TEYB$p=wR=+lQjX*!SbBqfDV@D6bE#$Jf}FIgT3EQaX<&lbFxzaI#`}l z9MHi&Kc_gLgXKBJ0Ua#QDGumh=jQ?*%X2CN{hZ}F#esg#@|@y8KWBMPaiE{GJf}F& z&)NAoSy=!bEYB$p=wNwHaX<$Lsq z!OqVq4(MQcPL?4+2YbJr;(!j8=M)EYu=8_@13FlqQykF2@|j#t1Rj;v$YaToZ* zQ5?_#cn#6kPGSq@ErKVkrfiC55RNa4@bE`2jDsIhofAe1Mr*{9kY4?&uK9%8wYp}{Nc#@ z3FrVk2mWxB3v>XU1AjQm1?>v(oEFru+5pdKK?sNg?F#Um9_E8w(5?W_fj^vp9*DBr z13U-*aFh#l0GIygR1AAsj{QmEGf>9X2Td429Lo>7Xa#Ys4!W2Eacq4M_}MrxKL`GBWWNSp;5#^K${< zIq-+0?ExKt=fEG1a)AyoKL`GBbV`8^z;oaaN4cPX0Glno^#OP; z06Yi&aMT5X4#0B(n4bfGINBZiiel7q!2mWvZ;15S-fFFS8z#oosL45$83joi7KO7CaEC+!<9L2Hq0sP@8jvcRn zKODueI)FbM#j*7P{NV@{KnLJC@Q0&ZwmyJA9L2HiN(guk{NX4U=m7I`;15TZsO-24 z{NX4L=m7I`A>g?X@ErKV(LR6lno^#OPe{Nc#<7mQbc=Rz<)2mWxhJ)i^3&w)Q2tyjc?$Oj zp0U50GWTyPJw=p@EOD!h`1S~e@8}p1OT8{Gf2{0yK z!oPpmx?0)W@P~_ewo-dr8+-a3mz;i%kjh8Us#ZIj5kfmV>;HGe3}b6+HRVN%Jr*tw zUg+(krcAbO 65535: + raise ValueError("Start address must be between 0 and 65535") + + # Create array of correct size + code = bytearray(65536) + + # Read the data + try: + if hasattr(f, 'seekable') and f.seekable(): + f.seek(0) + data = f.read() + else: + # For non-seekable streams like stdin + data = f.read() + + # Convert to bytes if it's not already + if isinstance(data, str): + data = data.encode('latin1') + + # Copy data starting at begin + data_len = len(data) + code[begin:begin+data_len] = data + return begin + data_len - 1 + + except IOError as e: + print(f"Error reading input: {e}", file=sys.stderr) + return begin + +def process(begin, end, which): + global current_opcode_table, second, label, defb + + current_opcode_table = opcodes_main + second = which + PC = begin + while PC <= end: + if second: + if label[PC]: + print_label(PC) + if defb[PC]: + increment, text = print_defb(PC) + print_text(PC, text) + PC += increment + continue + increment, text = print_code(PC) + print_text(PC, text) + PC += increment + +def print_defb(PC): + global second + + if not second: + return 1, '' + b = get_byte(PC) + return 1, "defb %s" % hex_or_decimal(b) + +def print_text(PC, text): + global second, outfile, show_address + + if not second or not text: + return + if show_address: + spaces = " " * (24 - len(text)) + a = "%s; %s" % (spaces, hex_or_decimal(PC)) + else: + a = '' + outfile.write("\t%s%s\n" % (text, a)) + +def first_pass(begin, end): + process(begin, end, False) + +def second_pass(begin, end): + global outfile + + outfile.write("\torg %s\n" % hex_or_decimal(begin)) + process(begin, end, True) + +def print_label(address): + global outfile + + outfile.write(".Lab%s\n" % hex_or_decimal(address)) + +def op_none(PC, c, t): + global current_opcode_table, second + + st = '' + if second: + if t[1] == NULL: + st = "NOP" + else: + st = "%s" % t[1] + current_opcode_table = opcodes_main + return 1, st + +def op_byte(PC, c, t): + global current_opcode_table, second + + st = '' + if second: + b = get_byte(PC + 1) + st = t[1] % hex_or_decimal(b) + current_opcode_table = opcodes_main + return 2, st + +def op_byte_off(PC, c, t): + global current_opcode_table, second + + st = '' + if second: + b = get_byte(PC + 1) + if b > 127: + b -= 256 + sign = "" + else: + sign = "+" + st = t[1] % (sign + hex_or_decimal(b)) + current_opcode_table = opcodes_main + return 2, st + +def op_byte_off_3(PC, c, t): + global current_opcode_table, second, dis + + st = '' + if second: + if dis > 127: + dis -= 256 + sign = "" + else: + sign = "+" + st = t[1] % (sign + hex_or_decimal(dis)) + current_opcode_table = opcodes_main + return 1, st + +def op_byte_off_2(PC, c, t): + global current_opcode_table, second + + st = '' + if second: + b = get_byte(PC + 1) + if b > 127: + b -= 256 + sign = "" + else: + sign = "+" + n = get_byte(PC + 2) + st = t[1] % (sign + hex_or_decimal(b), hex_or_decimal(n)) + current_opcode_table = opcodes_main + return 3, st + +def op_word(PC, c, t): + global current_opcode_table, second, label + + st = '' + w = get_word(PC + 1) + if second: + st = t[1] % hex_or_decimal(w) + else: + label[w] = True + current_opcode_table = opcodes_main + return 3, st + +def op_offset(PC, c, t): + global current_opcode_table, second, label + + st = '' + address = get_short(PC + 1) + if second: + st = t[1] % make_lab(address) + else: + label[address] = True + current_opcode_table = opcodes_main + return 2, st + +def make_lab(address): + return "Lab%s" % hex_or_decimal(address) + +def op_jump(PC, c, t): + global current_opcode_table, second, label + + st = '' + w = get_word(PC + 1) + if second: + st = t[1] % make_lab(w) + else: + label[w] = True + current_opcode_table = opcodes_main + return 3, st + +def op_cb(PC, c, t): + global current_opcode_table + + current_opcode_table = opcodes_CB + return 1, '' + +def op_dd(PC, c, t): + global current_opcode_table + + current_opcode_table = opcodes_DD + return 1, '' + +def op_ed(PC, c, t): + global current_opcode_table + + current_opcode_table = opcodes_ED + return 1, '' + +def op_fd(PC, c, t): + global current_opcode_table + + current_opcode_table = opcodes_FD + return 1, '' + +def op_ddcb(PC, c, t): + global current_opcode_table, dis + + current_opcode_table = opcodes_DDCB + dis = get_byte(PC + 1) + return 2, '' + +def op_fdcb(PC, c, t): + global current_opcode_table, dis + + current_opcode_table = opcodes_FDCB + dis = get_byte(PC + 1) + return 2, '' + +def print_code(PC): + global code, current_opcode_table + + c = code[PC] + t = current_opcode_table[c] + f = func[t[0]] + return f(PC, c, t) + +def hex_or_decimal(v): + global hexadecimal + + if hexadecimal: + return str("%xh" % v) + return str("%d" % v) + +def get_short(a): + global code + + a = a & 65535 + d = code[a] + if d > 127: + d -= 256 + address = ((a + 1) + d) & 65535 + return address + +def get_byte(a): + global code + + a = a & 65535 + return code[a] + +def get_word(a): + global code + + al = a & 65535 + ah = (al + 1) & 65535 + return 256 * code[ah] + code[al] + +func = ( + op_none, + op_byte, + op_word, + op_offset, + op_jump, + op_cb, + op_dd, + op_ed, + op_fd, + op_byte_off, + op_byte_off_2, + op_ddcb, + op_fdcb, + op_byte_off_3, +) + +current_opcode_table = opcodes_main +dis = 0 + +def get_defb(text): + global defb + + #print text + for pairs in text.split(','): + #print pairs + start, end = pairs.split('-') + start = int(start) + end = int(end) + if start < 0: + start = 0 + if start > 65535: + start = 65535 + if end < 0: + end = 0 + if end > 65535: + end = 65535 + for i in xrange(start, end+1): + defb[i] = True + +def main(config): + global outfile, show_address + + begin = int(config["start"]) + if config["input"] == "sys.stdin": + inp = sys.stdin + else: + inp = open(config["input"], "rb") + end = read_data(begin, inp) + inp.close() + + if config["output"] == "sys.stdout": + outfile = sys.stdout + else: + outfile = open(config["output"], "rw") + if config["binary"]: + get_defb(config["binary"]) + + if config["comments"]: + show_address = True + else: + show_address = False + + first_pass(begin, end) + second_pass(begin, end) + outfile.close() + +def config(a): + import argparse + import sys + + parser = argparse.ArgumentParser(description="Disassemble Z80 code") + parser.add_argument("-c", '--comments', + help="Show addresses of instructions after semicolon", + required=False, action="store_true") + parser.add_argument("-b", '--binary', + help="Addresses of binary data. Ranges separated by comma. For example 1000-2000,3000-4000", + required=False, default="", action="store") + parser.add_argument("-i", '--input', + help="Input filename. Default stdin", + required=False, default="-", action="store") + parser.add_argument("-o", '--output', + help="Output filename. Default stdout", + required=False, default="-", action="store") + parser.add_argument("-s", '--start', + help="Start address. Default 32768", + required=False, default="32768", action="store") + + args = parser.parse_args(a) + config = vars(args) + + # Handle input file + if config['input'] == '-': + config['input'] = sys.stdin.buffer # Use buffer for binary reading + else: + try: + config['input'] = open(config['input'], 'rb') + except IOError as e: + print(f"Error opening input file: {e}", file=sys.stderr) + sys.exit(1) + + # Handle output file + if config['output'] == '-': + config['output'] = sys.stdout + else: + try: + config['output'] = open(config['output'], 'w') + except IOError as e: + print(f"Error opening output file: {e}", file=sys.stderr) + if config['input'] != sys.stdin.buffer: + config['input'].close() + sys.exit(1) + + try: + main(config) + finally: + # Clean up file handles + if config['input'] != sys.stdin.buffer: + config['input'].close() + if config['output'] != sys.stdout: + config['output'].close() + +if __name__ == "__main__": + import sys + config(sys.argv[1:]) \ No newline at end of file diff --git a/build_id.v b/build_id.v index bed7613..d6b5f92 100644 --- a/build_id.v +++ b/build_id.v @@ -1 +1 @@ -`define BUILD_DATE "241202" \ No newline at end of file +`define BUILD_DATE "241205" \ No newline at end of file diff --git a/releases/MultiComp_20241205.rbf b/releases/MultiComp_20241205.rbf new file mode 100644 index 0000000000000000000000000000000000000000..a858d857383058ed4c47b42c6bc39b0405f4c859 GIT binary patch literal 3500364 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%0A}7A#=oP=l5LFC#X*{tBJ=xIUmRsppBR> z?i3qTRD%p{lHI1WtY(9Gh;48^rA%DV6oSXarpHgdjD!fB&uzLdS;Q0DbUrZ}@tiRJ zh&M^q=gerd8ABtDTO}UiM?dYYTBeerbC2;0q*kLE8h_MJ&Vl&Z4`msu7|16!(vnIa zeJ>3DqTlyLa(*@OQ*KrGX7o_0mCS0cjY3ONN5C=ly@h+|Yh;9|&Eksd2xooAO#gc@}g*1XQWy4Gx+CplgX^ES2_I#cnI1mudaso6#e1; zZ6c%yjXElPAd_d7{Q%(yLyr4}`^yGrwmO?C^B%tu}VYw^hmLe)!Vxclf`19?ElNUFZ^8-au5!5g(&Y#PnSh&tl9 z=(~?mh#xX^HA8XmxY!oo$l%48{Q1P1l}etwNTG}Y(adnh&u1I@$1)H$s(epGr|n{HQtp6+UzijUV(3MVL(>=3^IO2a4>4;1PdQtq1l((5Z%H zAb!&y;s-B%4iMuck})b7aK0b#+o8}?)GSk4H&A~+${1*}7lIt`F#~%c`UO&}t%~Pn zwFfPW!Gn}$R9g}u=GK@*fh@Uww>H_8|bNK#VNC}*R{UWi)aL*+J!5+J7f zq@}o_!A-U~7bQ=u33Os}Su*#JH5W4il=GR5z;WzYO}vp>0nX=s`f04dN+8YYZo+#r zBHkG@rtHwU6@sI$t{|#8PrXSQ@iA3@c^|OQU;22;l)V?atrSE6b3+n!vB=!Enz{+3 z`SW^`qQPRo^)iEz9cX7pqe9{tYOWc4=OehjOj^nVmV|{mX&9tSi)-~%Oxq7b(T zgJ=vfp9rU_Q+%fKVUVhAzHc%f0o0xgwyAd>vGicLhuXiV(U*HqK__*iycA`|@H;_o z0Kb;b8dz8I(iHkoHg5JF^Ak<-Xi}`U7zgr`qMyYfg%}Ik^qpqQ7|wqfO$8VjHAhBJ zvxrffFqtJW1G%dbqSM?6do#NjKMP^MR$_A;IQ=CwQt()uG{tmLA$^^l(p+XBu{e;= z!S#Ea^+sce*I(&R)t=+5`R#?aGT5Zu3>Cj)6y`Ve53>Q5a8D5D`ow&Cx=0H!DXQ&) zxZGB%_U2%Na;zPvEM4$Cu`Tm2jcft8P}yApu1_?Rxh>)-uHS7j-((RmWwgmy2y4Y9 zzNKI?1*_WHoFvzvG{_5Rrns;egt$`6A?gMS`QrE!0&PtuNtU8U$xsoWqkiBaF7TOK zpqAiq@x72ZORh*vndQe z`Sgovc|H z3-?0SECR6MK$L}X(T6Y(fycHmwS>?8q<2-2nU1*2E=P2UjWeK)`2OOmIg>@T+kfEe3&TQ?5)#OW22r0_95dowuV3OL}Vgq_W7Mtv&+E<|vC!|)0 zPol)}rz9GrsHH#w-_O0BG)kN_8CTTA{hI>u3}p(1fY3vpATAKcZzR#-c+8hN5w(v+ zAUPulJ{Cf{5(M~-|B@NtDQeDT7W%{DqHQt_!1v3~4M`^Ni%|G{xzWnEML210I|WYI ztkuAE{xl`I?K(pWf*1Dj-lTo%dlgEG5<`jx3-d`H`uTPU(5G)lp`YJ|_*iov7)2qZ zRw&az5wJX@Xrv&rjsa?eFO>5(zYp+l#!kp0oHVL6)pFmbXw$!Xc_C`#6xLMu!&ZBndRbBwj(gHDIiM-qfE2~~{unm5 zqP-b~kPa#AYk-ei3Gp9BNl_dae`*0nlnkW~99PV;XY=ZM&jAjVt3ql$3mc?QZ4qwGMLMd7m) z!b~z00`XgUG2lGm?|KN%=iST?AyO|qLNuS~s~7iK+QOt4+7K{BnKfzmH(|r=lT18r zljcA=Rjk%eKJTMVai0?fKF*?We<%J9fA|6(d_xyuRx7y%jiX`%0c1v} zuWsWh@Wp?_E%`&+Yw;UR#`8@m>w$_*2xKUp8@EY4bv}=u?<+n}Y}m*?6kP8&!Ds$1 zjDC8dK;1@0B7i*fg>}ds<6Z-NvwND`f^)I0)kQzeB{GaJW!{ZT-8Yxd96|ja%op-8 z_rv0IR`RfTzG#E%kN;MKYlD1SLQTlzsu$*g;JFO(fyVuuB?h-4a|9g}=e}9_-HHnY zW+jN95b)ocJ`Fev_ZlxQDs^p4z$W__zY{Sw#&s=o}*1;(76ipTZ=;i&zxp1Zx;$4)K1x)*EIj3A4*YnZdjKZ~n^#ELnxridqk*G&e zWFEc|IQ(I8|Kh(PyB@IxU!KN-HB`P|0B4<{BrJeA6hoy=wVp$t8*DR2F`qCe`S(ao z27t%MntAp8#A`BS>|}0Gzk|jAtJ&0EyT@VN?Pst@HH6=Ru-wz2jiZ=K2_h2?y|^u| zQ*>8yNgNG-M-;#48%ppQxZ9!~J{Zu3rCw;jJx;buEhzmPvg2$sRy~egA zE|C3RbN@2)k!{}#Igd7iS9~*t8EZ3A@y+@xw&2()^cj6D4La(@_}Sh_9u)8DMr>}w z{q+5sZQmPNyWL9s)?ihkqs_Qt$fCxrbk;!l;F#z~ozY1H_bt}#et29Gl<_yb6FO4T zOxH#{Jc>zc2ODUM4WpBv@w*yRTd9IC;HyIv)<8lsXNHZzJ@7Se@NTyq_|b8P?S;WM zXlJ<3CdfYKlBIE_5mBW?qjvN4)`on>J_FCSx9fSJ-WX)Akr3s9K5)%B5m47g+|2d$ znuFx~V`V}`He5I3&%A+p4u!Vsenu>UaxD?QTK)$3VDp(Ea-D9VRMu+_G#4Y(Dc0!} z=vt7WGqn=@gnhZ!K#$>hXrw3&ly66ocvguY-2#$N^OHUeD=8GF%C6TT@n`5st=s^c z{@e%B0HmO>aLt`WJq-MBV(e>Jsrbfs0{H8>Jp(!A{Feg%0uCF*9cF7}yKZ=W{*g^E|~iosa4U#-IKU0p62Q%9AYOaT`t|Uu;7rj(4Jt zeQ`2r6}rtY?`NGwjd$aoujfZ>LW%HE9BMyMclJ6<#ci-r*CebxdgoB{w^sDi z*D-cG_}uechIl9+6^S3D4$7q{SHiy^Mv)rxhIooP#lv|@KYf7$x*9-4*FxBly^!|Y zAs0eS!be^d?i-R`_s#igwdXyhU&9J~oC19We!8kq!{!Kc313*vqHdaBb7+hGnmzK- zKNjYYbA!c!W8XsIdzJH1Io~bDP!c?yO78iT3P&;*ypl-cCSJK0ZhC#qU&zu|`c9xK z*FVfp@?`@YuFr$L@_oM9^nJorki|C|Rx< zuGG(1f-Tr&zJ>vH`h7<^;$nyXpoC{Hj|((^&&$BFmaRC~Npk0(gFOJ{2&^3sYanfz z?NKVBF9sQE@-vs8vt07s^|w&yx913GXvgsdTVx<`LQ}uTN18zfI{9~?{HxjG{pPu> z#D}?>pvbp2pc^Cnj4MH4p$$T0%l++uOh0#k(8s)>T|S5K9$jahe0eq0|sBC zAA~b}hj|xjdH;e>=9c=&@dm-iD~>DhLAk_4!z4zK0p~in8+6{&#F@ieeQwnF(H(x< zK)+b%!gEljSisMcByapJUZ)rs7`WFuWI#eLVT-tr8sV(E0AO^8|VvU*enc&ZT z8T_JeEWe3)<9P6m{3u;i0>Iad-}$6|>UC1poDDu2Z?I+U%xdxtvt=$BmsK7|m8#Mi&&WeRQOi8AF%v%OHV{73C%zf({cF~yXCQvp!5Wb90-U~yFKow9%V*pr zIDMzCI46#q58fxffR=eb#5fOpFL6HKgZca}w3rVxaVgRvJa!K-hkOqeTI?5T1l0bw z1I*+Wi#&D8~oY$OdyLzhyQV^bSA{J^M^i( ze;6~zr+6O&sF(SqpFVy`@~6ws`?H`;_%gYQ>SV$E4bKk@!V7fqy@*Zv&fK%eT4J=S zW)i^zf$#qLBzYbj`EHbNf$vg?zflY28dvK29k1c^TMGI+j-$R2b4&PuuLX>qh2S-D z=1}}cy#r&wd7S}&6>=8}{CpL@X)vFXThz=c-wOp$`}|`*yf7B#X#!;q4f@adFL59j zoa>Iu@8j5Jfn4ANE<7gZv63dh+6wzR5#Mj&caFkG8u~^{N6WO(Oa{NS&=>yEj2eSLyP{p6rN0SETULH$2(P}?UR@{ny;4mv$aMg9W5rdWoj z#3cM}q-0%H_{!OTUU=HokK%##YlIuKr-%#I^`|AIO zgYvby^yHwPdEo*d`3p2e z%bjl3T@`<#I`)#4>qahl1;3I!!QpWn*Kc$tpIm~!9wV^&-TL*gHlXu?*FALngZKWD zefu8hegYAmyi=b*gXy6>IjEkACs6(5pgw^H(?fZ3P(2eTTTgz29}(8__ko8V`NO~J zf8d6-c%C4APd@%WK?X7o*W9B6&XMlhxwR~4AGj`zJlJ-`?r@)_1|0hHxrTS5{;uJ zb(qDHyN2PDU^^Ra*>D&5>zTN=isO-R$bLYUTgxXu4>am>kov#4@A%J;{xp9BsnGSm z=z(X}-1I)wvje}pfdIe*7?em#W5O9O5_o7q!;nPgqrH;j#8~ZvD_zS+7QBHtMR{+sq(l=cX}C_8EIL>=)^nUbRB#19fu^&EHVwx}`^Z{B` z-HBVi%o?XnyIC%}Hbs1}s=D$~v@J7@*757VQ2cKHcYmkKGqmNCY@o9;>w?h=wQ^Go zD5w*J+Y_quhAcwirOOs-Z@K&p-W5{ik14m(b}kt?L2U!>!b{=}|77CJK6~ z7GolJF9ulW^&#N`Pfyt;1{s20eul|;Ts=tDAYKZBD}l%4LmP;#Z04*PmH8GipTGMH z-2?rf`hi#wqSe<54;abrQZJa>d85<cOI0 z_B#X;7D3@&sg9-!;Ce7`zy!3cey7uAKu@k# z?+GNb^r9QEmyf6!#9Mfzfm;w*ws`47u)&7WqZ@z}_9%D`yv@3t8QNQNM_j>*4FNN9 z<-RYr5A>h;_Yqr!n#4fBC5uHj)E-BB3+9FKKxjCdPqs3MQomrO<7f`!BExFBYr2x; zihV2ZUFdK9n|cRc6U7sYmO4Ff4gd_q6Fx|n&WQ(Qu*%V6CGtVygouS$)4ZnGiFjXd z-E^tcsA!<~j(0WIhbf~60x z(6y4NU@)Z1Y_ zF)K0{wuNDCdZ@vjSa{vI_~Kdaf8n85eD5hYzqkB}QV3Bq8*;7sb!vl1HilWU+w-9+IvO?8S1Kyjpr_qJ%Jgjdc4L zfBtWu^8Sww{`R@;>WgGqM?2Cht{_C{mcL3xHt=agwsUbVY*wWMf`LCDu`E=(pj0P! z6dXAy;Tv8>A~H?7Iwf_5O)?!(@{xOwKJuSG*FXAW5fNxGYu=ScWmB!qdy&mYS%IHp zjYiEQ>NJuBCo{L`t%Sbl?1Cxo^folcn2y1 zhxT%)06kvBqOzhFzgk#8o$NB7+M1@7nsN z4}aSWBMnq8L%KXfqE*pgx-E(x4Pem_F@1Vvk1^4L2#2AJYzkUYUGF@pc4V?DrzWnv z{40O@5B=-DrP^0%spCU8ZSYyZlxXJ&(Kjq&(f%dPp_fPj`Uf%sH~prPq4tLAk{~2R z4QGgjI044gzu{+(-+IRN=h_6V2rV|`MFQh44>C4TVl{7Io==0aLDsFwWVyFdRw=~Y zqmt!Az!s4Nw)hPgcf96AO&~aU040i$=<(XR%Nv37olQ%OaG2vV<=~6CrdsuC9B7m) zy*h6R0E6@hhxX`v{KRV>IsaSw-CKe-nf18v4MIL`6wA|eobrunye#8IZdz~6hNcOV z!#o!@cyI17Q62!})|lGn5V)j<|^rOx@9c6;_82W>+km;`A*}MN|w11%?NEGLQEN$z{CI`ZFr%> z-0`SoTcDGmfUC!$&AH(7O?4Un^`K-C!;K2#UOs4$g+oT~!3SP63ECkj9N=7$mp+ie z>Y!xlr zv6%yx@9A#6b?b}v?6SJM`^e0(nGY=-S@_7zUrT*os6RGybm8siZC%>Bb5Hy7`)Am^ zZ{fa~kB9n*w2#glS$O%v)}32t_Z+&oUDhwzx#!Tf`(}<_aI`p9pzfgFci#m!b}l}& z^;=)Ea{|qo`#LvX{@O!ZH^aT7bnntVyWrmD-S8G}eR$z0+@gEhrkh91y^p{jw(k?a zK2odI&ySmbA740d9{hqod+1+O!55T`m>F$KN ziR!oE?Tr_1MYS81!Zl+v4vwZQX@a1 zzToJ>O}En5iw|Agqpueq`ic855a$+Ovh$o>aI!dO=kBBXj?LV}B>wi+TjBH8TW`Bn zyu9t*dv@(cDz|@Z;l>MZyY;rEJ>A_O+5XpPF1`A;rP~TL@7w;d?H|W@qX}Q7d352x zJ8wIJW_$Os?MJsubLVXs<~@gQ+X-^0FGl-)lE&M1{wnHi$F|?N8y;%)+FRec^Orf= zH|_eEIJj%iE~N3@*UFsSe$x+eF5dR;i)ButMgr*~>bW?xi)pS8W-hW0-7b1R~NpEup|)}8S4rdzH(`qrcK ztQKy(b`Eadf8o9Jy~_$1nrSsJ8Y$YXiG2s=H;&)Ad2(?Rw9JgQ#@btY zOU2miWN~3{Td}=Y+%QKw86@^~io3qGyJha+)Z{s{uRL$Id3bh9W6Q`nv#qVg^#0E5 zP{A&gKr%_RCHStJs2xUd1Y&%m?@Sv^|oxfuQUFUnO)uNqNPo9 zTQ=RTL2R4-jn={OxrL(ByXJ=O{_8LXN4huM1t%9c2we?hVf?OcXBRZ}iiQlrt}f$P zkWrW$okSQf?`ExHY;mTCAUFm`=375h6w9q*+sHOXar~Yy{oOO}{YtqB=mM)xAKVNS z_$MF$|14}M~~vo&`+@H&OmPf;&APkg(+{m|O_GG83kSp%8R%sj4jP9#9V;7YwOlcRr!B#K}` zoe0Axofo2TArd2j+!l!4<-& zj!Q*f+0c2Zq86ug24@Y4`e;CSN*b^##2FD6tUKHWgNQ3Y&x8NG=Or)f|AD{JPc%D| zor&2lo)|`!TU&Z>>rBsX8QVFR&F(7Ni`UE?oNte{XD2&n_c|Bt!dBE?ykUOVMDK#7 zO`W_0q2ijE*8H1$GiaX&mhR%=R=YJhu{7VF&Bo^&*{^gK=kA)mckb=;3HJI{(VCrT z=3`5*+|rvpxOsLm>vg~}e|Wlcc5D8nt=aMUnOnw*@NZOt~@MQi_Dd!iU? z?(Y<_#j+pwf3Sm-l z73Ok-Ng`W>Ogvd1gwv;5m|a}j<(>%(lTR}&IH38&mGw?T>-@omS6}?1{=trF@hjIy7_-q3sxFz5 zO3W7|1X^XHlyQ)cWI&iO7NQV&;TEis2}!$MD@jUO4ho{=$#QM3aSX(~sL_E_wCc|Q z%^Y+?^r-*Eg+E=q_u$|kG{hYf(1=O#2kYorn_*7|Q7aUH3{I2_dd&++>9QQ z+4PAPQsxK-hmYB0BdV5Rt8`NOlwMv#Qr#iC;@#)J>!&Yh{?bobGw(Dx=UdR7H}ax` zdvkA+zq!eiY1>`Bd+{&(+Z!9x8~OiFKbBnBYGk9^8mOCD_wIHlS-h-h=QE@9q}_(; z`T3E2gtIE2$3lnCUPZ6ahci4t%(6@-v#if+<`*<^r!X|JzuawMsxLN^ZWrz}^ZBME zh`;@u7-{dH#39SYSaEN$sWV#a-<<3yI!RG%oE_a!6z0I&qmLC*8IptGtJ3ljxH?Wj=A=%(R{8km+WsPU9chr`y>T+a_TvEv z2}qJ{e97pTb;Q4;=->8xpSXF$>#k*Q0A!WGyaVO^EqAz*Nd@5cH#Wu{EjTi)pmD8L zzW8nuS*}q&PgvWW;E+kyID^ANi~%sBi@+m}5uM{FRJB7-1w^5%fivbWxFsLtaV&H? zLAv^{x%Qs>8<#x4`aY{`8k~V?xv%+pf;U-P>tv8L6!D{y6wEB#2I4jYOUNe_I#U9( z2ssj>tRPV1jgle>*T^6s8xeGhT2MJHO_ATOG--)qke*W7a{Z)<%8(ZJ5`=L5e|Y5i zKh(d`XG&*sqFKy#CW?^)yZgvuXB zbjF*wQ#zAfGW4cfvp^R+T@h~Ld7}ZYqH%ctE8B|=sA+*~q6w~vrl>iU?P9+3tnoQ~ zq!`EJNq2nHTxi3EViwP3t&PnI^y4x!+Ud1v5Z)f{OzfNKw(t;`sX=JD3w^;`m>Cr_ zU>iRGHM5;w7lg^Z;w{73(mOm&ANGyR?w@bB@K6SK7hq^!-NnNZ{9Sm~QU~8hzn%OW@jlIQF}tN#j4U9> z^A|7*$Suw1qDkE@@C|4Z;Vz69z2X8%j}w;Wk#;9tY%PYJ^jT*F3Xn6j;co7b=)B%2T?`o0EpfE4Z{kAY)7iZdBDD^Xa{A zp_I#DoEqp3{ZxP^{yTo@Bipa&f6qZzskLMWvw*Gv)b$PeWQsg-vT#(uP+t;zViMWF z7Ryx$8hQyak|Ka@Xw@J!5VM7$G)x_qEK^=wiE@CMi8;)W*364+IKeQqP(qy)jkID0 zbzjuJ2Y=xI`^0NcJ@=gY4_$25$cuuQPV8r-Xz=dAo#S%`vpoLLrRnFN*WBJB#vJY; zF+KW3Kqu2`d5JPqriB4%#;9MSkp$RQfg77NdO}S=bVh?#vc(CY*>*BUAw0@3`=V3a z6imD#7rXGx{;7*U+ke^fgdjwj0(eeC-K9PLoE8Dtn!KEQ(Uu{UTY=n80Af5Y;=0zTL-hAN_wQdf z`djkg7la5lQJiCs+A+Z=lvW*xq^0n7OhB!KovqiGK4{wXd+MZRf%1h#X$mC0(j zsfYN9s%5^P!T>{uy8V;lj&dSuSWEIv#T)MYxz9E(xxf0xkG(^L7V%u7_eqH%i>4AU zMZ}N>JeL@fB!^^mfOEQXqf^;?aNI$k6o-PPzG0KD+3N7?3&&LE5xTkQu0`Tze&+^H(hc za%KNXVzv9WZurF7JYwg(=YKqSZ07?P4qY^zr>rer5IlpjN-D!T{#|cKM5&0nFlj4< zIAIcTuvUw|^laVO`M-1L%lkY1|LD!E!#p%&7B}@LMO|5_;TNA9^#8bOOy)Sg>d?~; zJ-f3J^lClzj&TelzmoaB^C;-cW@0vOc2?o^O3#O zgtZT=BOkG$b(#cUH5noU!Dzx961x?@gcS3^0;Ql*^a95)qhh zYTUJ~sHA0S(jrX$T3=wix5f~^l0R5E2l^cZuT0N3*#~=$rlQu9Yk_ls+fuCVz zOc$=WpHLH#Zjcph=h9R(+xe;Z;lE^wVivk!VUII8_Tu|0TR~a>y>Gki?fp&HC=2O} z&2Y4U5m{jhU@a?wlSiSIH(R;;2JOHPg#iGI3{JZqZ(csy%W6Z1D**i*d%1c?erg*5 z1X#3S0--budon;!3x5u}vo=v&pa&#x-237c93AqacRO{pI(C`C%UwYOP2Ly5Q#1!b z9)AKES+0N%rElh;SG|?ah+Vs5Djy7mL1Q*vct(IbUB#j+8R2u19RKazH}$8dqAo!_ z)DR0F&N#nq)|VLBsVRE@6%D*Vrohyfb`E&~d0G+)-WVP;{tu((6FmG8)QE}+VXcea z9h#HCSCyq{b(m%&xc!ZfUjA48M~+9NDw?07d96|_EsHDG3=*22D(?}-c+^}?Cbzo? zw4H|5uwg5^i9s-iNEl=>huX~t&SzhI^&g%3f@jtqi)2ladmL)0ShOu;C*T5y&k0Nf zR=viwI4ZZM&xO2!4cEh!`yD@T)^7;3D%-ej@N9w8ZyZYLLoMj?dcqbgan}gz1H8fW zIMy48HL-G19voemz*YqsmMi3yuPD$Td>1Wh%pdDz@gNhO?V^$;3@VTeTu<3`^JgBN z`|4zusPijpLKb3%Y_FjM&FQ34$OAZKakQjl%DHuA>e=H}Rk~8K~T6nXg z6knahaoJ5mFU=SyQ~?;S@-^%bU;&l`xMBK@@R}yXYhhEDj*SDyeP@x{BWu2R7-k!vU2 zj+%@3rca1S(oQhIC9=3vQ^}#GH`NqO$(#35J-~bnT9Y;Or*zu z3B$Ee-QkNNIiZo+A`0-tN>4fIq;J}?ijfp<&Z+6;xFqn|{KDg~-3lS$dws%4Dl};_#?(!hJX|*= z#-&ka2m-KxEm=~_D`rkPY$ViRmriQ$=&_rBMnjGT@ajMZ)PAkDSVew{ z=353>n3Mj@(j$#4KI0#f=&J;yy=aPWY>7|o4+yCdGn<-3=VA@8VU-r$1rib*?{z2)5Jo$}n>uD4oqE0P4j4H*S?hdcx$Akw(EYd+hk;&#_<#eAkJ zx~6WkC0|mhM!!`kNw2uyBCQ%O0;ffNq^adxlw$4R(@qHzHbt6&cJJpu{c}&b zp{8}3-9b_x!ZXE5RRZ#ZX0Xc!plm0)xWNGA zb*VrngUXxaWLjcw(gZwiHjIJul>ABZGcSMN^ZSp!S8%z=jPiWCKIIMKWQ<)$)5phS z6J6y+)>O!k3dvVgY19;{$&!e+Sl9cUE~qo^THTR&c!PZ`e3GL;=)ds(_kZ;Co3AY& z1~IyLI+oplF)$t)lHsH+wMq&a;+}cnpN>R#@Eh{Iz?p>fkO@4NE!%LQ6Lw9HCU7~J z6ScT-=Y!=gWi@|%B7)c0p9s2B+UP|O2g2JW1MV2s0>;Bb4T8 zGk|uoN%?7`tBg!$$r}5@)0!y^Dj0|~;sDJ^oK?*?I)tb)k^l-LjEY~8cA)NMU{QjF ztcoRq{uO_8#k-#RmtS;o^URxCi?Dl6~>Ve2jKy?g_!YS$JO z4T9~E6u~oz_H+2j9qZ|uJ5>!9wAica&zr*8zW(US`;OfEr%!b`<%-uY4Krlaop45s zjd{ZnH#KCEt=kC5l+0{4*@v15)DY0nNQBu(NbdwNi9vZDW0&pY`YEDI70Yr3Vv4C1 zj0Bp|h$fKuY|ZfB#F#2_UmRXmE$0#{Gx?ury=f(Zgp! z)@A~8TwLc2u{{YpGxiV>leL*iTvi!Te}=rZ;E((A1q&>g=<+NfpLb;Hz!=glQ%W`m z&JY+y0xeA1l+9mO82CT~dS@Ugv=JUk3)5bgOW0gIwF{+`q!#iM1rEk(yb)O5G1y2A zb3mhn0)qP#UW=lnFCIw4V)~{&HPajpDEELI|lxVqU45}K;uFTOAJy!uL?7@ zi3~>$j2u`|#1z5`*hM$w_(Ft%6{NX{kBS@UF!k;dE%_Ah{Q4H*f5P z>s_V@a=U~{Is`-7IS5Sc&ENIVbr<#j<$6h8lHeGC7gbJE*o<=u{6q?`^<;{r^G;I@c}OL@QkHb)9E5FV$loE`?*Wd)k-E z2^3ZZ_i%niaFb^}Y}WHAc%B9h%6R!cIWOboA2>%^Gjbfoc}th>KKcP3nz5Ts-gLPg zLt&>{mq(D>8$-r3?$fle*;kBHX0lJ(; zaY*y`+CzGv$6d!RI68+D6=sgESqvaSU!x&Y$r5&~6^^@S%m9-U%|s9LG-_{XQO;p{G&sbPAq7!DAk_;c$=NUe9q9 zx7u+OJch!Lqo9{Z(2kFzD0mzNygba~D7Nq3eleVS-;vv9V|t*P{K)A1aQ`AKQNR$MiIcBl~WezxL=`kLYO>OFWI@@`Jbh#<7DdS3TUn z;puiWZ7te*phH$Prl%*GJkO!S^BgYh>1h@!9U-*8cJ|jivdbb8pv=(Np1$+6C%g(gJq1Vdq`Q9L7@Mo}D@@4f4+&;1off6hi9>npbo2W}-; zZ?XQ$W|MI5kjD~dKn;>C^CV$m2QOq)2de_Iq$=nx4WcrD7}Uwe0fKyDR_?&Wy@HBm zCuAQqyA5tvW`kP<8Rbw?RpS1P?_N(_NHmU6$gm*$4gd3Yx3 zO15MeDa6S@WpMso$5&o=(*yhD!-!BMTX3G{m@oNJ4{C9fkIV8rr-Lq3D8Yj<)G?y) zhcP_xU@l3<_yEmMbn>L4$YFFDZZfc)dXFtcPd zU;@9f!Ab!uEj$3`%|$-Kamw*IhT+r9(4_HcnS(1?V}bzsG}8`0FL?j_7e3SNf8<^4 z13;U^4aYd*=AWE*V#AE#K#w)VI&l2Q3B`~>;zR<7FyfbCmkGwu_-+!ktv$h5%(+_k)mTA-2MR`Lc<^TsY6H>RzD z$tD58V3#@PR69lQl`C>BZk%g2#-R z>#gOZi>ZUBV0i_TNhOOK)B%{BlC%HntIqw0Gd^+ND7yq;#BM_I3d^552%;!3-^hhH zm}ZKhOS}`JqP#ySL9Z0^Fx61F5w%HiNEadl+;vA9!+MEsGbp`XY7kjPx=0o=0P+w) zNKinK58;tvH_q$d@|ExC_HS?%dPD|~YPhgBGm7&srY8!Xe=(NfL=2uafnzhyn!8|p z)6O}ZByn+jdAhy$w)v~%w24`qiE)3y!zJ*fu#e|Y?3~x*CR*)j9yc+KGcG1u$wdb` zAn0imc1#9-G=J6+oSU(?*oMF&hq>kh3z5%<*iDrk<%(n5b3-)dq-MF*61*df2aE#`1tAiln?`7Rd zgz(mjz|~!R`jNTu`EX#yv+l%`RA-`f0OxxwG~0`FAL=d5Exs9{E}mIAGGlz{@BF9| z2GMQLZfT7-7H|p)PRzg{G^Q7p4(N#)om?nI@B6!xogR+IXcfgAPAVySKhWJWzI2xy zm@$n5GcMiI`_J9h{`uD2#$GWu-0$FqY>7%XF0$QskQA+Wk} zGuXg+V>s76@G1}JxG%z%BQswXLC}}6vgy_=%P?NH$!EffawbBTm?ob1R!#~x;?fqr zMsh6|C-la{eMeJz=P5gG!ewm8i>KnZkOX*%tN0=h1hP#*AaCyV`w#uNYpI(zI9F3y zK7eBh;jcBsf-N!ak6*Cz`BRVo;3&HR&<;1bWM~@XZjSb%p&OIzu6kz*%IyfQii6xc z87B8vSxh7#dn93=l*$nBEdp&{3d6tR5=c{nm{>Yngq;z~mqgHr+8@)9 zoaQ1v;0fn0QkkL+& zT-Y5IZ!p{2ToZ9HV;gs65BK1wd(Z+$TD>mRGqX5fd3OJ0dGow+b>`a3XOgRCuWcsR zj>YG6;M3`J{^sJ8T{ti#*WBPXoWKIMvBC2?km4@>(daV%sYy!@3u$-SIgTqi_YXe* zI{e)GK1(`Zr*QjYejw$XE|?tvAuU?QF^7;sU7HiGD!L0`3R9Ns1z$;YUh#81*APy` z%7Zr6I0jF4fLrC_Co5MlU}It{Bqli((E|wU%%hKHm*0WS7Jb08HvQx}mhico{5Yy| zxeJRjKlKq@JirC|runpumlOzXfG=SS;B4(e7o@r%Q&T%xdCQmDKi>cS`&}MRnJW;b zi%gT;F>n$12585G(}v|wwgB9nyv-33oCnz2%`wn9%9y}XeNQQGVM{%xIQ8(}6~i1o zx_~6h0Iu?);>n|R4kwKAHARyr3O!AWr{I50m?8MjrL@7+V1vLaK;sgrFrk6m%Yw+4 zF=Va@dVk^lKY4BcFAj(-{^8S*<20r-9;boRGH{BAoXT+xPU&bYc5qU~-Zqa1nVZJ> z897h5h|bffoc?i*oc^(4ws!gl&h2O}^2Cd-oZCS)V>mQ~=Uebpkujbk0s;=aIPl80 zp8vs9G{7-<07x-YI{;*!4&o>cJFaA6R4nZ!0cUb_o~37U;Mfj?Fi!&9SiAtogS-+y z9hL)2wjAtC@3?z^$4@N5p&Wh$h-5>L0NE>tf{2&%`*= zp=nbT4Y2Tz0F6tHaO!>(31KC%m8c}jizugUsSo$GJPd$D=xQZb?r;o^Yl!dJXy|MQ z3HOx36~FoLW#7_&&qLOfy9GvZXK)G7`?WDmly{@7xM4Yn?`gZi5FK2nGUF!?mKb?z zlSQER04e($gJNQEyJKBoLz;&`V&=*vBVM)0O$GoRgCe4`uIPa1lCiwk*Bf>tEd9EH z1y~?{faD(o!7$d!ahz6V)qo(ss!2BSux`ow>^tATXY`(5lr*b034n>?UPYhy{Y+DV zwJxL)e$&~IQA#8Xrn1^1b?Cs8H~+9KdF0DP`RrY$&ceoCByRW`3j@9>h0)+9!X#r~ zfIR?QW`1>Pr$?Gp{2>*O-!9}fFMsLdpMK!#z{A@az;oIP`Ar3o zE}e%ixzX`7D#L_-;alKH5H1^d62!ykD1)>#^JF-#8L~7nGw3T&x8yVs#)hX*crQPq zMXvGC38TwEDfB~W-NOmRr zkw)|+b2^tW-N2a7HD&vzyKo3*!~tA+xBy7B*-l>f{F}dL^_O}QO|q;cCY@6pa}Tj(7>0#08P-{&L8B+7))P0y-9U)- zug{|(`rI#G{e{NO*ZM1}9Lgc<)du|BCLek#34VOSE-Vo89&`?HI^F8v-^SoybmJb9 zp6SjsrZ#s6{taxyG+6i<7Q(VTaYMQ0ZlLVIb~3#Te9H#>U%Im~2@|utwa8X+rEPmk zCa06co>Wdqfm7-V6x2PzZsM+7m46d97x(3~tJr1EoVMk(?lQf}&zj$`cXqEHRs!ec zuoC`W2>7XcF?;5U##Q-gdu4IS8&~ary^^sSL*c30PQ{u6{OQFPzw5JC9Ne%n?%#}L zsJO@IG~!mRqsNzc9U+_4;da8T#^V_Kh{RSF ztvvtq>t7OnY#a6RPgXi0y!z0DwbD81Dm>A_cVftyhM4osfj$k13$mb^!@{l;q6|Ta zGJk^pGIf}KxLHC6?^XqPjC~ehuIYGtOL|tG^XLzKxWC)~X*Si^ZP1b_)0NQjLR8XZ z-rxynhy%MdK1In1Xe~X>L}Nghb2CsQX`0SP5xD|Bd*BR{i+Iw-WE;moK-;o7mh~Ev zUHA$bEJ_U$jxv!P$dRzo^9MR;oX+BC5(wm2Hm9+y^|*halg|!qJ^Kuwxw6VxCX(x> zZLT#dca=elUvE*p)tI(D8)*u6ad4e4h-xs$3RL(yVFy_JtX( z{J!7&m(QR1{@3dbq}}0K-s*4?5A;-G5yPC&=m*IXG2CHB(8d*Wj*%K5gAM%$De_em zR0#>Zpci~&#+K#EC?gFMW@Q1W(k>a8W2G+hJtUDQLii=JJP`;ti!sT@Kp{$XE4nd0 zd&|HzJ9B1C3JTr?JMc@5W8MBIlE zL}UI^^8khkGYx5VO_dmr>%=nF0m(BPCc1pD<)m$0{H7m2e&uuhdBIIolnHU;$fS2_ zEumFOVn;;9C5&#+lj~VELa#@MOfYuN4s7-{m4i(Ymj?>%gGewl$PJ1|@0~iwKYHWs zKh}J~3wVT_0A?=Kl=khGMjy8em4Sz93Y5quQz1skB}jA|m;%}`5!#5P*#pQmL)xfb zMI}j?$4HdQ$_ER!yH)10g)_&LiB8#L64R_deaS!n(2v~n@YDX~cS`|cWdZ_SZ(F1w z_+fXlbBIHB-+`$O6NC@x13;9da~S6TcJ{xZ5XA0Tmkw3OKTSa3S& zlQh1h2q#`*ATm<^-!8eL(6g~gG*a!6SR1apsL&VJds zm^)a7SNK|jX9%D+b@->7X{uTJpMTXq`Xj^u{K^8@h=)Vk!+*%Y7Dz9HkYJjqOK=EZ zL#RyyU>_DFd{u-`vNPD5hGs{y%^d11W_BncxdMm$)!i}~Ed}6bC!XKLCy~I9D7jSP z+nII2QqAwO^-V(NyssM&EN3NE9d{n zm9H2zO>I@hL*k^-{2joD2gfLJ!@JSx7|+`ro_to>!mx%$^J8a-3!cJHazcAr9MX zCOA;jIa$wIBMwAK)a?;#xat66*2#kI(gLUqSCoS)!jN`jmWq5>^r99PP-DP4dQl(b zs=9D$eMi-jpXmTy)t>)jU;5ag{;{6Pg#87*k7i4oJ5-yNyQxA2lMY7yjkOk$lEO^>1 z1)(>@&6@%1aRhPvN)E!#g}Ys>40hlpOK)ap_1aA2&7^<+bB_OB zFDn)ozyRJq9Vm+Ab9c6qRv5|rl)Z=(e*?nO1`!S#!TOh}g=5LtWuNmgk!%4YKVDLG z>!@T>gt{^yCciApv_Dhm4I!4~5@u`3YTem}L$9rW+i@ zRKtKhiKvtN#E4ZZUP?Uwe?9%z`k$yBAP>c5&`5!rDF>bY`D_qgWEnKS$zh}H9W)Ng zVC2z^@aRDjH=?eJvdBlA**gGTQhaRV%@^eJ$5zIc`sYLks+XfIYtppY)|jz0v0q<@ zY?5n)@FBi!Wu=rf40T!}V~-*bj#5T?rOIvKTedYUNHA+@8@a_8htH0nO+ zQm0%uPhR~e8;(B*18G2JNdljF%K5?GGB?W0ULQf_^p^I^HBvF8w{#6*Sgee}A(AGk zWO9ZuH-hpmyKKCvK2jH~<&7(keEEC-ul|4f>!62ejFQc!{2{hr*bpSaK}I1kdk+Y3 zV%nH|;c~x%ZSTilPQj0YaB-GBcgHsSB7e=Hu$kD#;g(^Ts0(o15jT_wrNhsopzQ#@Mr$fvIfo`Psi4sOvH!4u#KvEZ~* zxI>T9N~J-T9W^eJY{nB+$oXcCukCq*UHOPJM6&(Q{Mz-u-u#*Gc9BqP+-Sn#$OZ4$ zFho(Dd~wm)Jye&e)D(rJk6M`+;erZL3#QP6yI#R%$N|{clrM&Yhf7!jJ?6os@Ai*B za@WKC){nc4yRF-K-k9V>&?QW}u=UGxzSu`_mPT^}ZTZwob^6)KqpRk@q%ae0){A|_ zW^5j%q+Mw=C^J`^NW`*WriuzmDO#NtopLFc0BGS`P*@zLXWQrA@~Yc!`KBvgTlt7S zY4RK8JER8)1!{)=l=C*^O=)GbS9%d)k<$@XQTCPcpfSv00_Ku90u~=+(P9yIAlHov zf`?20CGWiAn$eY=Va(8DPxc*?kLi{ckx`H*FUdF(qm+z=Z2`H0GCVS? zPX!omUb%bv^1J`pNNqjkqCcZpZHEB?gYZ(B{hyL{hScwC3NVd$MA_NEKAucz>&pl@#&%_u0-uFKE+UMT=D>W63 zW3I!l703004zIxXODFjal6V8X1G{;%wRX7)krt@JaY^d~?(|3iWcz4T84z}j>YA!wosNkrHMv)qS|E#(O?O=L#w_+3>0L?_4|JEAKW$kPp1?khn8*L zL%;{T$i;eD9`|PZ$$mLlzIyp;Tho^K#TmbFgBrnfC99fKKH=LHa(OnPvmm%&sx#R*jd8LRrh1E0I|^zc*Z z*9AAfcl+DiF&ZoG7>(15c8tbm&ZLN@@9Ws@16$54?pd7nw^h!=Sl}>?hd9$iH_ja4 zER8?R-9E};6m}4aj?myJ4;`Vgl>}z(xkrgV!+|1?&Ov4OGmAgI z=nf%48asu=OVvuHOOHvhb4boO=|)o8u_>HGa(@5m>kjSah>9PugGkOF9%8)r?#G0}u+Yu^zs;=mtCa^8+c zxogqk*Y&~sraN{L2`7-)NhF*|qLW-MbrMN}Y-f?}FrrT1cYm_iklXes2!f>D&ur6u zb*npzWbY%}9#wD)hkKmax3Kp#!L#5<(1he95^8=QhjsX{?nnH|B<@b_>rjsm5#Qy6 zlCEm~+_pn|{TUzN`LXkng46dMIJB1oXYMT8w&ie#+e) zMG_wF9O3J%gS}RBKAa`X{xCWA1G%F}I_+}1a%CqNlRg~Weh~4O8&jRtIUSQyjyQ;9 znIlx{ohHJ6lv3P5Dvi~9>>!m+t3E$PDKDLBB-_07$<*<{AL8K-BH=gX_g1F|yAa+V zL=yK8-qdQ>!ulPX+b3FGeq|o<57&=K{3$-8NW#O5$;bIrcdCZ`15PI4ES1G%ETVsnn>pEdpx*i$I2&Ks$yFIo=NLI0V+|x8sxv#v#R?te?wYt9OuJiRaUq{a!?nm~8I=}gwgc0e@XrS~a;SOPb z!nQq_tLo!)K0Mc#(X0JZ=)X;`#`RT_`F6cgN%Ubl7TBow74FXsLVh<_VSUiuiRT98 zsR5t2hb2Ddu7>(Zeb9PFqE6Z8=n|a|!X=x&JRg^pugp79lJqKLAEGa=@+Ez+9F9Ii zkESwl_e9NE40|Lm5eT$s0gF`3eo&r^2c}Nm{HV-GeLk zYs$M@Yn^Vr*QYmW*IG-*?Q^P5w^0t38hkO;a-UP}4nuyZJ-DKuT;IFGKBsD2(O+#` z5j9TtlF3fBeJ)vP%)XOe!od%9l>_^sx9k^YX& z-IXxro3nePwZR>m^)1$^DB#zu9~y-EZRk5pjYSSVvTwJf2V72U4({P=uIa{>pn7Fz z`&{s%Hu=fv)dajg9@VBDIq#xFwxb4l=yKf(@!L{N+J1xTHY6*%sHgT_>$tw%xKJ$I2Kw`xr%WdDbH=r|b`tQob6l+!vkT|)YpoiF+7BTo(g{r9_|UD4C+MQ~$rEkK%h@!6H~ zU73W;&1#jYbS@(pB$d&bzVJx(wmd031RRyE#~r=PP<9NB8WJ!l84|vPw8+t;4=dku zQ!b|{NLb#;7#SeuTXzX|-v9MK`J3Ujf0V{+BS9`_4${F}h*i2HvE??Uu)dY($l+81 zC;XNrC6pyy+@;cAJe62i`Ebj595PuMu%E4kv6tNtNH0VjTq9T+x3k%wTcPepMQ(IyY_$PS*^Aw5U|NG|T92Tm*#dG`*s(!^Y7W7eO%Y zab+mhVGb$4Tm*$I)2PtAZ}|Ifz3r~bl`kHPb)~1uG}X1aQixh}y+T@)<)UN+G3SeO zF{YhMx^O0Il$J-lTw_qs;wfkZfoCsnDKqnoYtF6-jyz84QKw+NLqr;$$Rh;JnEavm zKK?TgJl4PLwtqHuB2P&yWdL&473lYiB`S!hDAL77H>bYIFebQdQ+iWLcj-rJ8{g3- z$4VbJnsY4iQl8@2Cryi!hrT?abfXersYgOfbJMNDH4lSNb*A!o9{`ZfY0cGO@ZBUOQf}I1xNMRLpBG(XS*>QCQ~^iru1;U_xrQ(@hZIiFP1FwU z91fJ161ZXj0FPk6nex^vgoI*nQCGRqC8Jq3dU(>|7azav!3{hAI(whDDIjpt698b% z)meiZG%1Vn#VQr!Lb;t_mhLnV$BVeMsfZzZ2|H!Q?>M+D2AI+_&y3`9L8G*i(!Mdg z5QQ`fet5^7;WhmDOCRVz|CWC_{vM7K-k>l=4HZK`4cH#m3IXAOlle7#O5fQnLZe3Ud+PEL}{LsSZbrE)=G*CM!T2X#JUnQh5? z(%_ckU;E&141f1fnpG9=_?wn`brfZqB)jPXVP8*a;WkbxyCPgaki$Vqsi~UZE*=N3 zg9|wrNX`=RUmRt?C1EsIFrH&DfIw;zu=6h}Mm|buB0w?kf@}WqCw}Yl|NfdZyl$k_ z+!5h$zGPm&jm;Ju zye3!%N+x((2zMuB%7u{A%|&xH4vs!caX|St=(sB_B~48MHPr?z^9Y4eP(BBR#c_G~ z+}A$yTf^Hwl!nv0E6`b-J;%GSWALO%qXG>RD|u`L^UC_lOL=p5A`ivz( zVNfVq%C90Iu<}GT!XVe|q`p**x#LL(2*qUWz+rLKRe#&QY53Ljn{z0fy95N;%sDMM z6(tM%2n##a#}zW>9+7l(NYj0EDgpPWQ{M_0!y#47YS^kD1`+@9b4z1rXDJ9q`S8@2 z!$*csX1`IK_6EQyujU479F&&%D3rKVaeS$mVr|Ze_3R)>u~J@y%rt|c0i^VCPe$O1 zK~}`@m1~+^)CN2ZMj%lwJp8$BcRo@6`Qs+LB2ycARv0LECX}~K7tX{^3vhQ=@934K zryi+<-!yZyDLSL>LNO^pR;=$2Q`Jp9>8eq|n?RN2!WS!n<*Ra`GLVJlbFaRsZ-)&n+m?-prtf7KCH6=S4_4_g}DR3@g#LL zJ~}jVLj%cH(|QEF;IhtVg0I_FXvL2|eD`B7f8Nf&O@C!Xlu}@PM38AXfD}KPI-8=( zFus^n*yd19DX#0FFswvGJgGR8@MLbFTCf#H`AmRWiE53R2J7x7r*P~n&X zH+b{CCxmfTL>IbN{F^IJeCIC@-}}NeO^riJjs{9`=B!q3&M+tt0wQr#w(bbwp1!C3 zCj^kq*wrbV=1{JYb7`pxE}qY)@#LqEV~_RIm6Urqf~@e6#;!;L>39i~{3gQ!F__6b zG6N4+fFaD)J7Vtq z0hboz?=ZnRopePnq6~Ydq^I-3yEw;I??E^jxQ_53L*nZy4@YJi8OywfH#mOppZ?KH zhA;X2SiGw!7vYR#gacBN-1O8=JBkJ;RgD)(ue=Cw#|V#{(KxTaIvhv=J2E?h#K@hF zo-Wr!R3l@&RH({H8%TZ^()tTt_bI8rz+G|*flWNH^NCOH9{%OsM(8dkzt`0doI-*P z2Siq55fnM;4FnS?WiyThbtv}?k?@_xIJb)<;c#?d3!4-Z#ixUaH3s*(llwM2vb4|y za=og&^0neq-~T(4m)|`n+{|gYZA@Lz!D9BBH4d#cogCf{eI@y9%Hm=yBHeuP{6{yj z03LNid7H4thiQz&a9f=QCh-)Int^dfa8}0Lp3_W>C3&xWlJgg<; zEp?2u>EXi867V~;(9b$y*Y@}g7$4Rx8=Zs#1t6a#yEOSTiE}`RJd~bb7H@L<)APz? z&W$3YQ1AzD{`KeI{g1|G6{fZbn*2wwn7%0!MdehnF;p66NuC9SzAHTk66VBIcFgsy~1K`!BoZ2G_e1HP%%~dBHwD-IO5T z*e*nc1B~=3;WGilH5v?0nxVV{U5qY`g&>5~m8T-zNGfY^O#%xr(@3!pJ7*Ry-ojj3 zr3b(8_}9OCc<|aZMy)_1m<>pV%o_Zzj7e&9uuM|qKpH2GJXD{hW%4QR0_Th>jdm@< z4Wn+N=~L3?p(30CIMOs@23R_Dq`FIA2ZE74-E`u{1CRgw+?(ES)#vy&b-M@#qkbaW zuyq;I%E&;;tbueVu|eah?MAdf;O0^Dlhw5gC{qv;aU#_tZd@G7X}N?vu%^4ObX#=D zHmWiMm*UrF;-QFE>Bl~L%iQJv;d_m#B7JwDoL6BPthTOIG5)3@PAWAVV%{&Uz=5BoDU;h4v z2mX86#a*m#XbKR@dO8@CJCn<|Y8TGxIxWE6{ou*XN`}gLzCq96jlr=t{l^QwG!E$M z%pf%fj|RD&HT>YOKlSP7{X{!2BzimRLN@0~Z57mk1t<7P@?F3vyW*YdX?1%$9g(c_ zc}^B9|D~Lj<`W$pE`aj+EFNOyu#{Z+qXLG%@@|e}+4)bhXE&yos|@(L9V%2I$2fH);YzayMq^|)8j&QG?ah3pMJ^nU zw3c25*YJCfT)X21PyP8A;I3lFc{;y)h?lCFN__#H$#u!pF>M1R{otbl>W8FyvSEg%NvwX%RUd`KbG5`BgE^y0Oa??M9>=ZC z@hjBD1fO7Z6s5;``l>=RXe)T5I}4NZ<4GWc9iyw6(T1;Nuw%=&T&&0~0<)+c49kgnBhxZtxw>b968! zpIJoRa<@DmKLtf_yGrJ~K07r*bR``P zVz^e~uR8G#ztDm!GKv$ct20|bJVI-$zq zij{msMa&MOtURP?>#eql>O>`;tCp7Obu>F`^;BfYH#?}XAo&}7g`(Vs)s#CFLzH~j zv$?bj-Adt1>F)lQUi`7)dv6xuxU;F4BCM6JVIt@7iF&#_^uN+)7Wnu{xwfn$82QG~1@SN{5d74`H*pq3NJJTc14frfLV0*3QH@v2k9fBV;I zibRktO!RfGh)y50{x@z&q%C~yCPGfm)P$XvB(3eSYC-hSsS9i6Cn7~;K*J)&g5>I; zqi$m4NbDMwl-~~MB(K~>-oZ>twi)Qer%_Q(T!YPQO*iix^VwjsI!i~OnxS!61u>j% zGUk!P0_hRP-XV2%>U03JB)Ic6fBi=rUwKQ)^#8~AYj=F^UGINi&)bOgak9ZOO`U#3 zii5X1A%=y?8np#(eD4@noHYQjdMLU^SDnhh*uagkLAGEHR{YV43299?t#32-q_2@k zf2#RM+~X(evrKr#SSXs2g+)DOx~~d}NvV|za~TB&CkhUHu+N%Bp*ZeR32%#k@np3$ zP$v8A(|UrG)$$LcQ&9S&dw%=x4gdNpj)rVNf?aASTae&ar!3>P1SPt1oR5whZ5<)< zFtDmOS4^5NcxN?=aKTyWK3QAIgi)4+z`-vHH+~C65=>jt`R)^xjEQS(#z`!3DUl1Q z78L1(n6Y$m;!H9jFvv3S0jN750oqV`}kum&J z$EeyJ9f2sbFz3|8%jlk;`4Z#%FB`y8KK?F{#+_AWIsvtj+OQK#ulYE&{HEe45~^_w zOQnDKiq~E<{QBrT43TQ6^$y)4@5MgM-6WASm!|q^%Hp4~N7D^Dy2R`bOL8XTLgP$! zacHoiX{EbbQC_(eWu3V_<_y}C3DZbNHkO1J9e?ia57b}q&R6(&&6td#XQzDwuk(zz zHtaLi9fKnu^AuZSDqpJv6_*Q~=VBc}mgpk060&&jAz@VcUQL%2Sx!q##d8Tv7fpl` z6C?ExOo1R!R4OxcseCSluL$1vqA&i}e=_`Mzv0Vuv_ilNUH5IeYp){|##+5nwbcgH(tV#H#N9#_?EVCj=jJOql;LumD`MKdQy@5P( z45PDRW!+Di@=-;ayRo6l+?|;ea!W%5W*$y!GB0<10PhqubvRzZG!ZpI!OVWlnnI+% zoT2MZG2F+-I#A ztE7vi)-H%dPLN1^Jcx5njI2VAh3JJD1l6;2BmS1LW!GVS=R1F5_#^jayvD{4i_7WE z3G*(SC-=CfnYY^5qe#{^*=Ufay8F1?Cedt8z42tK#@D`Q;d(HhN33_*R^IxAi-w)l zS2e!YxZ~tM$Tqt?sfz^ zC)CX`^BRtwdt=mD^mvZ3%;KJzgxZJbq=|JC)-1BBkqT-hN)~~0^eP0RmU>`(YBzQ( zbJPf<&F5};^Ml)Julg=e?en+_XljCqQM$>dO*cs&uL!FeH}53HiqsgE+Hj63fvlRx zYuF;w98%x{M=#(y0ZXw`z`)(5km-||M~bAda!_Op$%6WsBY4XzKJ%H%EuT&c4MEhp zGdpo6KH73`0wJBn`T^4+JZ|aMH5y;1A{o4{CV|cUtqhF_5-=4qB_qOWHWfs?GAPUh z%nDpnP$In>QwJmQrr>SDNYDePR8M1iW466ub zx;Oi_Wvkh`_N(MH#SvRAet}O0vZd-)&?B%#V3Lh$Tt&E?BeIMLJ|jHH2p0S?_V{5y z1>vX*Q^bWVa)h&IoANO(j*u&ggNTWw36=>G!a&q91|bMC;;fau`O_c$_2F0F=o8SC zYHVv15_QNn90%>lOB`FM)%f7mDo9jXa-@=YBy8%S;_6k>jm|N46^}p5kYeWxRuQfS zDVpW1qP@5dm@!Z?ji7OfMvKA-7U4JXEe=3jL7L~-iYpS;0Ki3QZ>}My8EP<#Cm6T&xYibmS9hmM49?2jpZr1F2swHN+c31!K?2{Q#8Do!I6Y( z*>oiyv(}{waIXnq`}qiQRX$UO6!WXAwYqR&r;Ah9Rl1KKyJf{XBxVPkiQss7l|4|z zIaMvMc(U-w#kqvBM&Lj*)nVfJ^d9Rz{>QKTv%f#~!#-G+?J7)En?T3a80q4wLd6C% zTvVuj28Im13TUfEI<6v?gF-}j*g`PhID$%8GW&9jQIPD}(36@wagK@T<>HO5?MMb? zK_Jbu{ppXk;G)oQtdC%zBv@+ATMoOhca4iT5RY(cn2zsdJ43y!A)Za3uLMO z(57Bhh65~RF%&aa4?Br=zUWWi{2dSc zhg7oTE}8vMEs@YG8``~8`pHK|4qG(4m;a~;Uys_Z!e#QiUc$6DfIze+f)RycGIA0! z2z{hA>`}BW^wb4pba{3&vMx_<0|sZsZSpgptkPT-83ct;x$tTUtoZT94?eiNcITI! zj7HYs>Nc^&I1WiN^G;-r_%$zx7-I}pF*3mz2W3nUxQ9jd@W7x+0dRqlVpf>7N_;H~ zWfu*?rdAeXrKO>`>U@+Y;d1?hOQQp0dsVGN9m9f=$CWhf%1gOm_VE`UeB&((HQqVmLH2VeidF-jV#qyi61kEMlvVOx}YQQ-{1=*^U^12xIu+UH2i=9G#E@speXm(!3 zbhi#JM&%oXa*MIZRET$`l=p*(bKptlst@TDIlNS}44P*!wl4wbZezkzk*s;@CgNMA zdFG;bzw^o8zJBlk(Pz0*Ii@6M- zQKBbRiprNu>)I-51Pn@ut*bgy(x^+NH|_ZHtL}NzPtXULOEC4g+>FbNnp-qRsjuDD z*AdGtJ!yz$8CYNyadHqdj3_7_k9)m7JwXufKiIIPO=Jxrm>nEd_9WoRt29nnE~u4C z23moMtPULIC48cF5+uSx-6ctCA#6Qij6~=$20};;PO8$X&>aX#9N7tF5a3c^6)It)(-dfwiQg+Lr&I=5| z^7V0VH!YytPIh;MaRA1Z1%@x-St-o}aLA_p2F5aNtWj)8nTV!&8&71QPxKZ5n$V5Y zT@b7BNml0{3~4N!F$(2?8mLs62AM-fxfDyzK}cQUCCK2Ujrj-<+Rq>oc*GUElx}4j z2Rj9kYXL>O+APK95paR`Bgj&UkD)}jx}&w+i6?uT;?oIRd`W+kDusz6y;X?p6@r-5 zt*z35-su5}U;KlwJ)CTKRk{OsGO2WQx-1r1y1B)%psk7i!A7uz`GxWR^2y}(Q?$f| zpxxWOpS>Y|W&Y*}`;{e4N5OQowpk*wat)c{CH3mk?MEXNJ@`{*ZPix5fl3%eauoQ% zO#s{IPcr>EKrQvzKf(f8KDhq^P_WB_Q~_8$2rki6QD=6snvj`7sR$7QF_lCvk z`=&SVo4?|mo!QB`mpTknM~O~1_C*}M`AG$Pc0#8eDcay*$reF(KcoAVI=It?_iR74 z`0B;!4ndtJx;p7@FLby1jw8u*XX=z4)_DcDW2dh>)8jsOIy@9|$mHhqNYOKk5@cm- zdPwJ$3y6t87UsU!9WA>0dXprYawm$uz3Jp6$VsM)D@}JwC&9A{ZsC;9u~Sd&d{Lc) z$?2y$uCr^Wp6Wc&&eNSI8t&CGm@DC4J5F?~N%F@!KJ>n6P7_T9+_&Hmq>%eKn^k9? zN+g|ms{85eetzyxEIhhPR!+g3JEMC7b$aK})4LLPq$nqip5cVnyZ)V>%zA$AJUDW8 z=G^)4&<#4Q)1N4M7iXYyIOkn6|O714Q3& z-W@A?-yM72ArbGIfAkFJvfeds=d$WpQGncb*K35_{U6vdf2HoLJ3#XO^!@?P55*Rd zmE%NvA6iv1!AH0KNpihT7u{p0it02`f@kjEvo+x4&~0av7rEPAn{^QCjw3BQNp#RX zz3uFeol1f;9D8~yIsB6Q_Z-|YXrJD8Xlloi_UY(~NB7@#^?|boPW2C8ec({Neb?0w zU2*W<_k8~QzkBD6n;!mAzae*WZcyQH&kEw6I=aZbGOg{zx8yL#bNk8>Ay>mbglEB5s57|~E? zik|EbPA3PqcA81Jwt1EVKkXpS-PgWZ3Wt;Sui$jX zdc1Jo7^(?#wI=^!KB+NJ*+<|u7MAteoKT(Yvo$$J=CvTYd#0lI$4q0t->C5_3bAHQQL z_NkhIm@|2ZwXsA4l^<3tQR9p8P%4uP74*3$x9$Ad=UwyX={HZz*p@0c>rsx1EhoGB zY$Q*&f*F2%+1{W8S!NoQuyiu1-W<(dzUA`HS_4XkL1pFbQsxrTatBzM3^LX!5O35z zI#kR)8Lx3RdD3gD`nfFTF2aOCpAns6jDSa>{A0*f4AVHqXN}OX@kCOO7*_>pC4y(5 zAK-%0XiZpgXVT)HTxx144Zya{ERDG%0S5Lea`S`inIm?FVI94Yp9~uSfYZ~de&vRn z77${;p)_BjSoiO#Q(t}e{^9Gd^K779V-mzJe~lCB8$1=>m7oW6ls+#GkEkb)6^8vt#47X ztM^!mpF!^BPK(xE!C!$13CxR1%X^kPfJ~#)42!vX)QXR_T0l4ZsZjSBbIs0Uj>IA?->iiZgr_2 zvgipUF7vgGlx`1+QUe57vq?bjF{$I1-E7wjkH8S3OfY4fH1`-jRF5G_NI66#J2XU4 z(wT3HDNRKLnpm2N;sd?~qmJM%8*@hKfR4-9D$_(Q$=EsAh{=hnG#@7`9cGryWH$h0 zr^VD$B`)vLYYm2|shji@5LIExji34aU;V>B`=QL#XY>mPbWzfzw6)f*A~SPnSq}Bz zl!;L+#%^Auz#GQ>Q~Uz^j)-0PxX({AK*RQQ$C_tqbP~}PIR4kv4IPJ3%!?B$(aJ;- zE6vEo31=qB9bM>16l29;AkL*-wJ4>pVWwQMU--Bv6$wL(%QX_x7bmL`bo`}-gmh0p z1++T?8evk26IyI3x%-#?^Iexe{L|U?wD6RI5rwb?*Az{E2*&lB!IM&~b_0gLKAR^gb%4KAjUz z-dPlqq|OXWNFv|Tq%0_YF24ajFdhTiN9_dgB)mKo#kCViKnomv*Q=lU)lHB6lIOY{ zE`;sInciHqeLiU=Yf*df_VCtDyRqjjyN)F{w_5GnkIl3Xys-C*)$79_864fdbSkMV z-Tsk))5v?>>sBYjHzcQy9S>f=boN;9Bj3|L+8J2xe$ZJ8mlk`sADra8>IKfiZYRCu z=nqUCpP5;@{Z#MmeL863P9;hBt}uz~XL_qE(Ng_*qsa)gbv4wn&vib*P|Qpc9IsnM z`(U_K?+Y%E@!)u}bud?3I@ss9`0E;zjq-6m(D+C& zle90h)3-U&di&wcYcs8-mHvXAznu)i<3YE-c>A$dbHPsF_NQ9k&Z*XK@3%U$tNoy~ z_^xn?(ognQ`=xM^7!Ivo4NEg2BnwHGW2I*Yry_}eYdAI8*D==3^kC~3uHMs}dId2Y zN*x^FVEAYzJhFUK(w#iqAZBTCu)o34(d*8(enZeGf0UEN`v}$^R2CLjKNjvy{&>5h zddD~w{?`uw1%h<@$v=*kCX@Zlx|$~jpB5SLZtp~c<3VfCoO)OP(~HT{%3N?DIX&oq z49zdQ^2BX#`{K(!Fh2C~~&n`x*Q#>ILW@0}3*tn&}Vqd)x1Hr~% zd2Wq~UvQlL5siHtm#Um7PBM*WUVU|-WL=iX-B`GTT?fsE>FGVFfX~3j_+${d>4XOkWK}`@bKRAp z%G3l=>H17aliE5c;IQG)u^C5|?oiS~fDGwy)B;RZ6*4Xut_Zxb)ZOHO-KZ+1CnDdB zMr~RL^MqFX+#}1!;{*LFfXA18Fuwc*Qwv$&Ab##S>&0YiOV3^U+m&Cq_C)#Nf0y=r zR3}m}R%mV~2vq6nv!h)JR*576e6|*`)u#6}G|$&E!AR7t*V&QMP-DF#aIr&as!IiI z&}>E%1pMA%i5k#^oT8b1xvt*dM5Vl34N!U5OEuP>qamhIz&Te2R;Yp7I%Bj_5=uF7 z2r|IIuu?ig7e3E32DtL(VhuZGG`Cm=MF^7kxyg6`{%!BM?6F_XmINk%3Cyy9I@PcT z`*iI@DQ&Qst#wTB5X)lNpgi{NY7zszrX&0UK6 z+ylFJUi*T_zD%My*7KU=Zz#2Un$q;jO9}71*&O@!-dmU^B~g5|HE)xCHXcg*n3v98 ze#PaTlVP2$;Zl8Tt-DgkK6!(ALk-| z`UHSh$zL-rZ?CpDE^V5AW3#okxx)jx1AFG?4drlBC~HDu-dzt=8kDvfPX-e4a!@oaF~uZ0gFM>W(0!)h9bz{J_ClYwL;Djjw*{ zWmgUFai9KJZBMs&GBi#hB)w*Vj1W-tr4++u+c-_8WRTYdxm;PKg|u(}=NTZ?$1 zw;$F5#szhX5f}&_dE;z#(Cx8@t=(VzcpTZLjcmaB(sS5qS9ur5E43SgA=IJ zL+OJooK^&?5Baq|&|Mu61DOxl&_hWqJ?Mktst7RDQMb9au;y&qgiM!Q0hFOp&9Jay zan<7UNP5Z3jvz=f$>2jZF)f{~?Ev}yT+J4-tRg1ap{@wn($4Sv`rm$V_}26tdCIh9 zYBF1+OF_?F`-3K80xRk@(`6T{e>Mj8SKp9?%-O=^XanI94J?4gWYnrl%LM|q=+a;g zYTD|zS9XOSEM?)sM}9Y&!$9h%&phyH)#W-#q@vUCsL?<5%ML(c?UrIT3(z1S9@GL> zteyHY^Hc}x2v^Dpz;yutP5O<(GE}a3IBGVE;#gPIHPMo9HkjJ02|U?lhyBKM48#35ZtbB7VY%^yK!i3T?U5 zUJYl0?JpBDVGV<#0J<|8O~+;mOMY;TkL9Z1g=$PG{j`KVpKnf!yS3*Yt}eu;EuuYUDx` z{{tW$eurZwp_~~A1|s0cL9UA$D>u!|B5@yy5A)b(@$#wt$0Twb&PT+={I-S{d0~xT zc3DB@MahgD{CWvL$WdP)dbMZFk$FB^?zMtmcp^g2DiL&ngZ-(>t2d=muO5qLc5M&q zErg-o*r+ZLA$;^(AGh!R1K|G{SghPcqOg8p?WTp9T}#Vk zyydsPzWX_m>&1f5Uq#IYWg<=Tk44M&^~spP|$W&Adbx~_(>c}CPCQ4}$$bEFn!Uf)`j zY!gMX)hxo^Y>F)(Or$N1fOVph-O!1@bk)J9{`FPEqaDv3N;V{{10cie+05Z{6Z&Sh z)K2!RwnVVa96k?MXMHohb+BdWXd~#LsLi9eGgH*_ZT8~mIPq&Q$t@9RjG>;$t_>)U z#_s0xc*td)igh)T1reMS^3q!=13r2}TD$z}T)dZ?_l@O3O&6Q8A&*5-11gQ4hjjTt z3gqhgD3-5T`7Yk&RCgFns5@aLpx&fPew%bKucvEa0A#py+MP`L^wY`g2e&=-x*vPf z-t0pj#%4f}xCSQsr)7ajk7TO>)?YB0;foh0yVDUHW5^otNO$;y{4X zH)?sZl^zFH zE)l8euc=O4RU8%^ZxSW)Nl(kfoR^tCX)1vg7c_3gC9y*dbD*iuLnFL#SvzEGO>59& zEgDzQRfIcQtsVNo%DZ3umB0AK;l1B&rNPsz({{q)jCBHNuVOO^0A17kfSCk*FirqY zs>gR7TN~M?RGE*raB`#7z3y+SC`(r?@Pb@<>8GxU4bf6v;HP> z@rr>NVO}=auW!oTW-3g7{w9iIWnq6HOR$MjE(a-MQFyW ztJ&f5oPTQVJVm)1m@a-oQ&;fLyX{%_TtJJSzp+H=XKoA*p? z(qe%lXl_6FI!@TxU*CT!S>%a?4y9>t;s_qa9Pgbyu9)W#vw!z1g4ZWRiRd|3-n#s{ z<<|vUlRER>siVR2FT~GT+SJ|807nF$Pu?2dy4*>+Y%24L(wbuCc}T!4Et%P>6*cz2 zw2e8jt*sy8anp?KiKW|2z^h$!1BpGpJUp3TigY=2!*skot^9)6ieO5>wqc*m$Z&uv z8je^EmW@e^gL!Oe6C_jg_Ij||b(Dm{Rw<#EXL+fIgBuv5S!%4|yET4+0t}9~pO}fC zbE^%MylJ+y;nw9h$JOmsy`1*K{)UCl0*k`!TFPvgiNABOiAfR>jhGGkSf}%Jd3T}r z2td81|D1*RJG!;7wIk5q(pygVp7Uv5!6SyxMq4{>ZQV);illX*d`A#}SMo&T5C7^P z43GY%uhMu^bE2}N!)H<$882uv)8(BmHfR~lSvJ=7CY_#DZc-W*G8T+?vqM0`*|eZJ zueOAY%uol!vNqjR1B_@G8qLNY7n|V=ZfCWE(?rp36}>IyXfqeUrozmtNOcncr)EQ> z%+`Ei%~}$9Eloz8lz>_jBfPV=sx7IZBd2PD-6C>Wx@IFP(8MeO7tuVq135M`$_p`s z1|!b^;!P*$+n6mUtx{|42)Yb*vFwP;3lBc^h41{8;TL}z&e-RiAv7w0;sD>fkpyW>cE1=lvzF5r>nR-_DQOX^1eDc0-&`gc1oEeH z*(`y?P}pPCNdt|qA9QsGn7ZV zu`MUdVS?zUUc^n1)1Y)Qvw~+04Th26tLMzjp+^Jn`qTEBxaH%F|B9R((`$(T_HE=Y>P}C zDTLsPWf?~W@z|=F={c}N&5)$tkOctbt(Xm7XBTvTOZI({3#PknOoSC-24zgM3(-np z4YV*@(`&?P1a1OOG`%JfW+J{jqWbs|XksYex;GYbPz;tCMwavxjUKk9?iB*AOEqH- z3#iKP`^&F?^$*|oc>3@{9I&Re(`cd>*2HYvzRH$~vr93t$w^HLf*NNwhh0Mv_(a^w7t|Jh|4Nwrh>G`u@l{MdQt-|nlkf3fj!EM=44Rr$RJ_- zC`-qVvZokD3J~&rxQf&1N3%5}pq_9o!-WV9Ie{MgM8|JU*p|48ZUok{4` z8%skHU&>hIrMwb0OljIw5h#!#sSlf&lrL*c zomV~MnR-$&jn3)iu40#}Y05((i!lec;TJ!A_ssL}{)pj2q!pHNOYHf)Gf|gimM^H_ zCkps#q3(Fa=-~w=ZpMfm=n@eNmJsZNXujjC*m5$xwKS4EBMizT;3L$@m~*%=TeVMl z-2RT0!N!Cmppew3{S=eYQo78;F0(W@R@k#B$JL4Er8+?Oae$9Nj^Dcd^2fe-xu@Wk z)sYHR8K#h>cig9DMj}AGi|p<&;5n*=#;ekC5Gy&Cj}XWz&Xt!{L`q<^T*eZ76a_i% zUINEh82G%I$;;!!8so~e(io8tmVWA*zxRTNUwWBEm^j2X6=KJPtX4lwH#oS`ERlAl zZ}#b{Bz(;3!?M`so7x-+^o3UW5+O~5*cGh^E8ZKq^-M700s2IB#v#Jo#yUth%McrS zNM%%!bd~rd9a9Sr23zFnKyhqeMY^XhuF`su3)|#F42alIb+{@;{VRzKCGfM|Fd=m9 z>+U=AzSZ>GD#;BZ6is!c;|IGbP2cl2;UbIA8~{O@n!nzDWUWW4lT{cwN0FHsDaNNu zvy8%f+)cx@&*Gb!cCS-hAN$7~_xvBO1XVCX|-S<6aoF0(6Pr|IzpFe!M2;_07=b|nQ_)*v=co;7vEBPXP&2%n8amPzP zeEsl&2eXv4y4UG#7deH9dec?wwHT>tPmH6C9#FuPz+%DWqnVO{9W6(=h-uang z`C=ldiTIJ()I=QKp%53#mGak6%PtBGMQnWO1z6$u@xk@rt+Yg@pzQ3p5X*m`BTcpW zYSxZNQ_VD;dp4~J$(uriclg1@JFnh!+n#jWbu5ebW=O2BHPw!Bx6?9MN} zS#;)!#~`(NQ&x@RWImGlzN=!TjpTKdS~ zvUxVejcJt6#$H{@@7dhP_+32Pv$L!bkN17{i$D6yCqHzNx*gFxBcIg#hElHMl!syLK6sDR&Q_;WHmTT{tp&IN{V-T8^|&)9bQhVB{a zJ2u#SLzdrOg5lfV^VuK2?5f|$?R9@UMYtG(>ud62G~bMjSB0N@=im$e}2TT*MfIXX_olamOw1tnM6)Z6IBg z#YLscOW{byO!pbq>@!g1;-z~*?e(+Kg%dz7szDn0rXPFawbu{lzm$gkok_Ch#5^}r zXYHn`c8#s`c2}cyW@J}HPl(f#9A(lR_U}Jelx$Kbp1LJ)I#iS6l0_ zSmG=EN@;tQ{j(O2?rY1Tv=8bf^0fGtupaWJk~|Z8dVK$1>abOC#bBjhs&_avPI>C( zcy)8BY0L*?YDQ#P3aW7>VpFm{Q3<~ZiQ*H;9`LqFFeptmlG-IjYDcwQyu9RPTC6T_ z4tl9jgPuvXHi%+<{$K5^4Z?|m6KlEOD|Lc+vf_XmOf)8IAQiVOXk%gvzE?pE8pL;X;vJ?J#T)ya0R+S#7;RwwIGJ4{w5JG`o}I=MaBgEo9f*qqwa zS?lnwMpB+i4u%1*l66<9<6!IHRByEzHyUSnJvmImD5BPYw-UDa z*sr&|`Prz^j-um(?R~yU9O_U=AhMn$6OqBR#%q!a`GaIEFPx@+Vz7@6W(Xu z-D&fkVYD?$_`C9ca`)*m*~zQCqJ}_gt?UUQt7*R%FUVhd1+# z`LGn3t94KJg4JHqOu8$Zx7U)TLI3dP=Ab)wg36#u2Hj(WL6Ee%EB&xNKd?&S1^D)f z&Fz6IrGL1;Sna7+R@#k0v?pp$9q#je zj&U?f1snw&IRtWn!a52#atP!Cg>@8gz~B7bvWwfFp-ME>KuU0Y?sjT%fRy0*)L4xjNM*&9;fn1=ljslJx0=Yn89R(aY1ag7G zItn;)2;>5Vbrf*q5Xc1z>nPyJA&?6c)=|KbLm(F@tfPPtu#N(b z90IvOVI2h=IRtWn!a52#atP!Cg>@8gz~B7bvWwfFp-ME>KuU0Y?sjT%fRy0*)L4xjNM*&9;fn1=ljslJx0=Yn89R(aY1ag7G zItn;)2;>5Vbrf*q5Xc1z>nPyJA&?6c)=|KbLm(F@tfPPtu#N(b z90IvOVI2h=IRtWn!a52#atP!Cg>@8gz~B7bvWwfFp-ME>KuU0Y?sjT%fRy0*)L4xjNM*&9;fn1=ljslJx0=Yn89R(aY1ag7G zItn;)2;>5Vbrf*q5Xc1z>nPyJA&?6c)=|KbLm(F@tfPPtu#N(b z90IvOVI2h=IRtWn!a52#atP!Cg>@8gz~B7bvWwfFp-ME>KuU0Y?sjT%fRy0*)L4xjNM*&9;fn1=ljslJx0=Yn89R(aY1ag7G zItn;)2;>5Vbrf*q5Xc1z>nPyJA&?6c)=|KbLm(F@tfPPD zwVP8M3@(kp@c;R)Yu-`$!4E&3OzW|}1npof{uyPt5VL2LEi2~PSMJHzJ^rWH4sZDR zjK$MZJg@chsN;8(i8uD_(XHO^k?n= zR*UNqypZkR5!(O#%h&$u@MS;sto8d}FT=GvKKHKozpuA$M)W^ikMP1O8+T8UeN#KH(KcPR^Gg#>9O&twFH={ts? zW5zYge9kkKkgJL{pXuckdlsAu3q(t%A>ejKYB(3972K4A=MjH2em!En`+US)$);LF2iG^DBB(Cu11RkZPTuEB0 zBs4yf%r9;mlDJG|Q(p-cI1`|(u^LkcS=4}AA{0KZwR^6}Ll&})Wia4dYsx?@CHg#) zU1?(s$hR?4i7;93JV$a#7eJ0HkbdF!=dXF=b0541rsl=~v2doh%WiyC)k^dnjm}*Z zLtTRX*uZElAwW#y6;~{qp#ow)pRcWv*gie(k&?;~SI3IV%rQ$fnT(|qj08V+jkh$T zQc~F}pAtXYeyaJU;rINNXC4^CiK+o@}1`}Ewg@@k!yJ~L{_%Ue62+s z6msN}$3O{7>JD(OabP_7txU^fN&aFKu6jeqVT731wl`7hZtQL(L&$#+N@(%c&J?yX zB6*}Rt=pNL6^9;(r3}t_anxfBfAHL^j{Mne>3GlyN*&P%f|*nf-&J(zC6tx~@u{TJ z5lzZa(YU}QTZ<@)yvq#(5c6{?OS`zdM03C{;$B!oLqix_hhm}{(vkvK*CV4;>a&Z(W21eSiAp%J2|Xt&O<$&jENypqn?g>jES1tc;1<=Qpb>5k8b>=L z4CGaJ!!2;xeC;Za)aIt%id*W8tfwj)Ij5A@Z7fE+eAY&SunPRVAMl+8amJ|@F>7WplS?!?Q|oA~n7zj*BN=Uw&Kb5hE* z4%RRmp*4HCdIITan2mK?jt9Dp4YHn#$dl6AkFGV)$NJBdtq8oSfN9&N5Ht_<$Ott< zs>5dX@{R$Rnwl;admxdR5(ql82^H!baglX3Ch;gz!a5gFf|X?EtP6R@ zTozJ);kk@4GjEV+Xr>&^hAl(aD%FW7;WSKA&Umx5GQ8o)A2S+gensCR=UW%ufTjfT z#?pcql;X#4`O4itx#_{59-ntW-myw{I1}8iswAp8TWii;$z~sx@w{X`X^ME=kFv@smr^dNC~G$%N?7{?fnd*1qqwqvbl$uhRq1 zYL+-r?UZOa%DQ2u+0hGb5pr_(%ODq@@EDMQaLw5r_B*1N;UlX!b)y$&Ecdkdsc_7=O_; zmCm&mc#@~8j2I6@kw$f@K?UOpCTj5{sJ!LV*S`EaZc8o``N%oNO_5pgZCa8v9n*-Q zZ|thz86(N0@GZw8$1iFA5us0Qso#*e29F}c*?}aLiaoArPK!z}O0bF<4aiZNW;Vw( z&V?oXs0vjDat~bdupG9OQC1gH8cqTJGt3EuiE6NGAZ9I>n!Cm}Gi3fZD*J#F6EaCk zc}NveBt2-0skSij^IkEeyPeQ*4Q)```H{2#ebY7jB#>OkuB3>NWbCYIlpSW}v)Bd$ z1~j`8`NteM($A@jtemEk*R6F_LXfO^DfYC^oowBjd}wtr?hjcorbnQih|B zM%5JYA3a^g9ys&H&;P|IhLgAXbO)M;KA0tEM^POVauTI=F?An|Bs(sO6RE9d9@VRtD(aSiER?aEfforiMuP<=G1I+2wGZ- zjeCL^QnQhfcq5#;T z^{figHAa>_uG)J5L^?hnv_&!IBl&o83jcnL@I#1RVcKV^w^!B zKlsQnyvayM7tElk&_sn@A8Vd$O;~<1V{%pS#z#Ri7&bTtWyWP!0mLFLYJ?(irBbQl zqFpoZyeE~(kWhX%Kaskg)~ryh#KGe6FVB0%qVusa8`f#Mq(X0;$;1#Gv-Ak*&lqPc z-cn!-C5+b)C$0{UeE*$4yYa>!L=5NXsDeP7f%KVle&O2puvxNe{~AK7jWlh(*oyl- zcDy>v4Ytx?*JZ1#GK1cbh^kvg?IiApwHZohte>qBg*DnFBCUrbi#Dw{ z^whRkov|Fi)&;0E0XWJgrAPkNN%rH7ZuuJolMxvy& zs~@yZ9;1+sW@pXWWcP8>*IKhxl4V}WT1#A*K2jM>#sU`10UATX;%Qehk+6t5nG6gN zHL}3)EF&%&Q-?umfQ4ZbGgxG=PglcEqv5rr>SCKsO0=l1q+T_Gew_&c#GybB5T3S4 z(CYML!q!X=Yq%o_bfe1>@T`@V!E8pg5Zj~|n>)F*ksh=|2gEFTqQ)Gr)U7VoG!%x* z!LFq`q-0y(vli8aqjkzjzNRT+-B`hE%ke{=Mo07iv^izloa6b zIE&N`{v-i$phmM)q2r4YM~wh{;*H7L3{64+Q#bviEdp$fQnZ@8g!(9R>0bSER`y}7 zr)p=`$ht&bBc3%~qj=*Y`!*Zt`;XF7yhc)Y%XeU*-HlXB4|}HBfEO@}H#M+hrp5mJ zyey_$VIN>QSSIG9jD9f#??Q`ag>-M3tFaPbKxG%Cb#hRJ76-t*VTKu&7Ge+z3A?Lytuk``o8JLzG&|wbMKtwc6#oUbEg(po71b)d-g35 zd}zU@7Ik5^}cQ#RQ z>TGhpfBL#Z;f^C)K6Txh9>KZO;i26(ADP}fb+&i**!j7Y@XC1v*__FDw)e=~tLOI3 z?~A7I+j7Rl)a~`tiAn1OdV7-~Vj_v|E$(NgJ9gir`#wq7*>~iIb8}}9?fl|tcTc!q zM_Bjp%;L6lbF0YqhSS&S_WDnSx=sJU)aq7~@XX?wkDZ@;TX+IWq!bdr{^A}%tt6w_tQOz%zg3v+^4epSqq;5+w;WR9c(1)#|P7$mm_+Y z;B{w`^9h+l?)%T1kkjvdc}K9$oex)UK+5~3&MXSYyLRuDba&mL+qUzIhY;@mgnB)* z?fkZL5^~!o=iL2K!h06)U%mhMzJ+})?j3hG;EvpHK<+zo{~qve?LEKkEM|d_qx-f~ ziytTXL)3Mb=q@@W=eHf&z2nHuM85-BKXyJkv==1bd*IMs$#~$<4VdBw4j|Nfr|)}6 zvQ6K&V}42!pHEi9`|q1hc0^MqVzS!2{{srv?_Zrhvja=q_UPQFlIsz8de4p)f}Oda z`;|vNWOoTl_=pM2eTM|^xckf3-LE7p5vLHbe{LHFnA~;m9a!o9yY4-3cJXZAZmajU z?|RL?sD1eT|M&}^eSG+~bSGpwX)TAHEez|OUCB%^Rc+V0r+S?;bDbawtKI7SRI+lc z-PqIHUOyIvQK!|4f_itd-&k#SegvAMjn)-|)%w(6@@-)_+u74wt_Q89mEFOhTiM&# z(+_8(PIP$l^44&A(As)9?6kw6y1f$j58l*j*TVYt$z!c>Hkljr>IXNs2dhb46iJts z76ns-mB}caU7bvB3OcPFKM=Kh=lYYU!^R_XbJgRW=JM4i!zvmCdpnH^8U)gybGX0U znCh%vpM*h&erPppwU-)=k2cyzqj0{{N>HHH?lo3>otGxzT7za4O&#nlNr5AsUA?d# zwvwr&=Y#oC znU7`z5|{eNRS#2*GyULuI<=*v?6P!G9BAqas+19!JpjlRmUFtmmB`0f0D2q zPBbQ0so*4J!?ZnE30s|JSf9m^`n|cs{fXXOW3tf;J3%#Qk-pkfdQ3P;dUHWP87RFU zb|S)+=G1Dx)tPPd%d@K?};P4(E9Wo944>qAoS|)*6iU%`#?p)EmpR#Hjp{#uJ+?&(e?)H!qv`H zZM_16C`fiw;uZ5@bAXP!vDoz*Ob@Qa@)pNcSX{k#sv6ue(qV0IhbeI?3K04sr^Ou! zxE)@k+oY5b9k1`h1wHNw2hm867bS;V(~Tr-Kh)__5$`zU6q$^o)&7CS${piXafZ0K zzdP!#_G0?x_8^&~lSJ}EjbxBk2KGknD0Q`wOsF#UM9cjht!}+GJy=TWjhbrX@!;{R z&OQH@>9qgw_V9PP4P55a<>BhMBrS{#UmHC1|*&woQ@l6$_c5Uu!ec6E#| z!Jdv>a`&E=zgTHcB$a+xf8w?`SMR<(-IHdyGfO|unw6CgzW7v!<-hrx_TXZoqG)yy z;1gHem15nWX-1-zLZq!wMc8M_Z$-=?ofa{ye)W{sFmnoeu@*`!qu`wG6ff~eB(7*} zXMgbW8*ZhkJa z?gW!K1kirI@42_TbJ&$Ay9%~2^p{vNBBBlg3ukb9zu|~J9`@LFt%YXRb zU%l{ue_U{Q*TG1Z$lIy;Q3mWd6#0UwLPi3wN?1;!EYWA3N+35SQ zk8Ncs9Qk9s8dQPIiW)%VQ}dTGgL!l*t;XV290_buk!-eP@xlZ7M8V45!`R#1}~T8=uWd_oF8;7Pt*$gnZDi*@@% zfG<2zhp47gU(YoBbM;9Ckcp$ps9E-w8nXja+KHpLJt3{krIJSC|J zp&oup2^s<#YXoQj%JyF%i!v*O3PIFmxs3jHs{kqqf-{_@mVx4SsYq%P9An9HiviLO ztl=txFv+&1h>>quVcnx!@A>gtUi!ihJq^T#+l?Tt`Dkq}VeHvRD^LXRMoAPG`D_3x zh)cKuL*{R!8a)peqDe8)C;(C}0Y<3AhogYPLxv?vp>g6zN)9=ZPJb%goFRy^w8lm` zK*H}fhIW#ug%ko5h6DjzAx!#^Xw(>=)_8KX8c+_ob@cl2t7U{8z?;O zSs<{1v0dU{(hHyi7$X90j$-;J z;{PmB$9qgKgrtsW==zHf{K5mj%o_$2}o<6&j}); zy^SHf9&JTy)%=L&0wf_~Lm6wZLk%i{ysh}=3~az@C0g}~`%zyC*eV6fw6Ub2 zqORgdulSX3tv&Y0&Q49trqWV zcqeENv8~DENSqde(H` z?>_x=^-tVr^iN_OOrB)P^Mu=DzPV=$CB{Fe@_^AOvqC` z1JWZ*guBh1Jlj?>=?plqWTP!cTT)S!Lk(7%wZG6Msefkzrz9nN+BN3rGzm06$M$N{ zRao+ZPwZ*y&pz~@eq`%AzQ-W2pUyX6Okxj-3@KPJ6M+hy2u>6GLJ>o!L^S=RSR>@N zc}AcPg4BnIyzNM(IkhdH=}fJSYw7?`A`#`NCgBAFDU1Ojh)|^wqk{_JFvM@OW9Uc& ziDK{xr6QwJUs8EssV9kMf(=|n1I}GgBZ~eIQo=vx3C>uT8I`gx{_rb5@h#WfcXY@8 zD1PL}RYJpM5C9NqO&!sSS(RcnT!`7$YG{H`b~Uc7t4S#Ng`Zz>CmQAf^8#$Fso9JN0vsc`S|6OL!IO{xTIqi<~NW*(~TeTkhegVrh2Br8C`)^ivn2! zi0W*LvIy4Jy?u#zygrUX1a58Xo&V~->uL{tZpZcpXb83;^;AKVolT;h)JcRKCsTOQ zE6pp&f-((7(wwLsWbv!LHY3KJH1>8`mxL3=8U!Frvk{W}Yv7gSVFggR` zwla;gE@cc2oP?uw6-}KCJBjqniI9Rgl4&n|`p3We!*_1}J?$!;*P-;rs-hWlr9_!&03AUy zA4DGQSHCe{e3OL*Whq#${M%M0m{HpjLnoF}=Q{2^x0bq&h zgeHmtO(ycjY)=&w=dl!(JX}~LZIotT{L6p;>t~<3iPVLYl<#<8THf$&1FzF(evY%9 z$!az}In`(kNX@5%^-vLDZXH4!5q6mPLTk_ydb@ax(ts$n-m~+oxD!ofn4ysG!3WaN z6L>}>_NsyAf^-GU5Ow&u6b0IZ9q}ZiEoxt+7o|^?B9E$lc^VP4L_$u=feJMybAmSb6Q!{W zm8h%=pGO`Pjt!zF@tpB+nl7p$PI{10pKoT{nu}kr#L4FgiV!~&jzv3PKlU6D2`I`l z>_B*sgq#uh4iDd%w**E_C5dGwmW(Bl$?CF!#Ok~SmIf!%OCjHFaH@tkeCF>z`N&rP zcB@c7nhNu9@_L0yM8zP4D5L@!o_w^SNrZ(1)?H{)=X>%&!ht3((jdg>vHdUTPoPW? zl3R#E@Tl-@^~nN@l9>t{#u$|1O2+&V;rP6UkP9Xgg_+kiuTq~1+Y=oF*u}_$bg~+I zZBZ3cDjChyB)_miO;XFh?X|ZY8TrIl#cIq+DbQ57pcS=F6y>QxUFzvc9cxKw3|>R5 zV^jDJJ*l*;P@sfIkGZy0;wgcwcy^|EzAMDc!46qyx4bIH`#c}9@kTJr%SZ7Piu7N| zX?O-jIf);lpa&cq49~9Ak{z`l=wSuxT|dj>Sd9AG4I($PiaIT5yqjO z{+56IyYa0re@+FMvwkn^0Svh9>9FR(IEpN>BHDx=6w1bRC{htZ4jz+wctu7ahOuD| zZjHAHv7AOkild!nua>KHAZsWZ5+5%Zlo+{kiKZxQEBVFFtLK9o)25FZ$L7&oN}lc5-k-e&(Y}sf`eR&)Xy(``ZZgtpWxNI ze~zZ49pL!2CL7YgiZ#-(LWne*=OHRt#+kLM7a+5%=!*Omitrqf!DWo^Dhu$oCIv0n zh*TCEEJ79l?8X&wHCkKfQT`ZjJ; z*e9it)saVjZ+7eMcd8b1^NCRm{=(BzF#0Q*q(9k6moO}bjb-wI<`wbKDi}B!#J~0D zaYYe0r3GpHdSdc<=>t)fkC$peq))Ff0I2ihk%2(Pkxj48NA2{R3NM{cPic~*D$SE) zUdHb{DgLSd_~nm3uyxP>yDP9(uxxMDRSBFKDsg~1MR9Gg;#;G9R-q~>VDR;cV{#nQ zH`H2A(wMNk;9tg+$UV;C9v@FyOKv|Na=gZ;REPfO`n7nNw^dx$Do6}p^5BdU`0U%6 zhzE6skpdl%l>%_az<%@Dr{BEihMDKw3`1;eGk(i#ssDu^50y`_jsCXYiIt|UwxC`@eq@U?OPQ2b>s55;+ z2FKRhE3eE(W@h9zv2BfVRT6+-xkY&`_(1_e2Nm> zaW}qJf(xY@w497PNxF=a6>+%SU+8c4M^36e96OAbxpQSOaejgAWvViOFj|SH)Wuxnj!4v(QzusGV*UXMC%@2xzQ&aax_rK}nFTCoh z2MZ%a$5mVKC%VX?j9|p%enM*pb|FMBRP@V zhcNDNBGEBq*`~$41HHJ9$b_~VZo=qf35l8y!k z-5PT}CSZ)h4BT}!2T-F{uOe(~tw0!ZR1#*)vB6MFhhl#4IP?#{7&qN8)J@A`qeZH*6~MP0bWnnqd|TaD3)m2*m~q5 zP~l&4Vpch}dT0s$M!6AZ1hX%n{@t5zu72=+JHxMoLDt;7_@y}o7%zjDdY3$B%obU^ zFd<2qQ>jsl{ebmZ|G8hYC_Y~#tmCTu+sx(p5?k1AQKta)!|79otQ41EmLsVu9aEpGpcH9eJxA6Y#YngfLk1KzhtW8%ngl@! z9DixndCDp%9HI6*@>kRgXsbL@d{$tKe&m#T)|{wyXo?h3GB)Z%h7cK7-stsLjHdL9 z^Th;{Kq848q0VB^Vk%aRc}?B>f9-4M9@zTyF-1SWQzQO|a9iK~vWM>&efTQ{4T9Z{ zbqNfJ)50_{<@C7mH>qx3HTP*CkkP>i%ooS89P3~$c;KX9aa!5t^@?SohzKi>s3HZn zE;wq%4b`3WCxVimFb9nydyO!Pxj+I`xNsAqajK7(qA1`HiEv8+9Z#Hy0^_EV%V`;< za)OpD4i_T<36Bp}plhUvU715GQArsZ{Y+YVP3t1oa`KwBG$bkcl^B|G4;*^-vA^0{ zf2l7%7*1vEzL`fZ?ZeE;z~dla#h44{scWE7jiSv^H1@r*AW>ORnu0fxIT9`vny*1k zvSBi8cKZH$wM7jAGK!T@HG{^mY|Rh*Gw`w^M&hGqB#@4ik;QDbt^tm1SiUkokoo=jj`O8{;D4kOn;LN z+;E_u^Z&Gvo^ym1^kV5nG#&!IDgk_kmH{o5s)^>TIFM@iSBNOYke;hsyvuCQoDf>L zGQw&QIKn;-Z(dyWYwu+7m8k^vf`tZTh=SYy;@^k0D=#i|Aw{qpQ{aJw9crWZArGKQ z#Mhv!>1xZDpt6wX+aldUDIM6e+6*^YmJSXs(hzp6a%+SLGf3tWFTb-&3a*PDEIdHM z5T^SG=D}FdR8XUdf-OQ7aRJ*^7)^?U%-K$2h|h*h}?+k;2q8Kb(A8O|wW zKr%I#QbOIRpvj(%`2pD&R16_-0c+CUX$s0JZQ7`!szDnZM%o}{J*_Prv_b-kY%10} z-L$};K(vY%hn!V14N&YUV*!c*XX*8$Rt#07mQ%g+_@zONxdKUwkTR+gR;E^_1Q~t+ zSXxA>0&xFjoX8-In*_c!QL z&sh#D!LE>A(tB2;Cc-irV+r1Q`@i}8Q~yti)>g1`qjbOy(FrT&Sud`)7+WmX)fsp$lT(HB7`{Q?B#KDs9ED%d`OPXEjFh2z|zdGBu7=GhyV4 z8*LJDL9~?FmJWpEUbatH*~;NZEp=S^SO562TerUD)s${d&4!#*iyMNu0cIxp12TnJ zfHGU?f@c%jK*QV>!sUoQ)F6PZgNOL&?-|*NMJ7TDapX>D8>%x@jF>~a<8OpIVjr(W z!z9y68YPHLdJ#YoDglWpwDY2R#P?N8NIL1E%!UIBRAjE?6q{z(z`hvCAZSl2JYjqx z3-_KV84kKK(gM9?BG>vb%|vo67`vXj?ZmN({)BDK(nVti2}QZ;gGa9XWAaE#&9NaE;ZN*Dq ztHe|h38%Jsl=>W(Y$9T?3J*mZk`$=&0aAcz zoCcPMmD0BJF!RZI6T_5bG!{K40SZA#AMxd)ruwWTHI^o}P{72HL9xnxUBV6B3*+NK zc0-Gza_;l_;!8jFaBt+lmKwTBWB}8D*$B*LqBC|L>a{j22My9pFpJrrp~X)z65iD* zkge)q$l7QKpnon1ns>t`5Mte{w3gm~ghABBCWFNc%Z6T#|wuDB8xuFfIzRhl_LsE$${ zVmfrJX4s}usYy{>l9!bth*6nwxig*x;ZONCV$5#8z z4?HmX*lWuJLNJVk@wP$YMs;8P?tU(*P0{e7qa8F)l@5^mYIEr80@|QZi?~Z=w{at@ zcKXbQY)rLDb%=h3$^Zw`o#RpHGioT%GPxj7&WLuqWVP6;pk9w1$|z%VLZDvw^WkR%lviw^gdENbD{#3Q=x9*leNPS z^xppD)(6`v7&n~an%pqh5IoaWNTtTsSD}G-f!T)Dl0tcP!>#q623?Om18CwTB8<#r zu#TrE6{0~KP=~?Ia3NYX@Gc~1o8O)ksFE_6|?rghwbM*K=KAIKMZ_=H)r{re*E$ z_$9@wcQRUy)@2Y;1$_pHi~N^)#P+o)WrSbpRfIHw2!&wlXOqufsNDVwJLf#MC7~b| z2RdpvQAQheDg(rEaUVhP7}y$46=49NDLEt8eBxQkX38xwDo~DC@^+La35GXua8!PW zl2)Xc)0hO?WKV=jRR{QGe%^7AgCJ0u+c6O@h6ehcIQXwp;-marsIZoM{Yo`3_{4YR zNN-39f}4N%pT6(X)*nv$aKUNTlR|STfncTB5=i*~L30$B6mb-_-B!pC+AiU+R$E8W za_=a9J8=Y4rum4PEqqCw)JL^=&MZDt_YT?K%I zlO};%X(EQyptA2`HAL*#1E!~)=hw8Z7%CQ{?3|=gjd&SVxz$am_zX#)QH`D)za$-1 z#KCaULuiHq_H~-Gfoi2ld#?rS0tX)JaYYg}vTcM+P29E5J424D^)vCzPo!6V-~|N& z4UrxcO1#4yEPxh!_0#!&P?WI6xEfNeFQ={d?Mkh82$0FLz)SW_Ywd>n#_oDm zu?}nlMVXXpzDt8COQp3s5P}??Vh*5oJ7X0aRJCDzfdS2c^7=_a{u<5EXdl`!1ryWW zD5VCHfE08yMeFHNRvfqX@=YnE(fGzVJ>%h$PYJnfGm^lrjSOrWvV&{khAe^@YP5N* zHOqqeq3<$UYGIaY>)-w2tH-y_?K-V07NOjQ-U3CD0~KIKdWm7e^rFqReSM|2zlrZ*nppGS~*W5k|xtI8DnYXqXoUkdX8u)QLZ@b<#(I?a6O>{=X%yu0 zV_nRo0a(onC|yw*>W>XNwSP%?%JHR2L_L}ps5nY67Hlodm@s6|TseQka{WV3l!Avj zOJDtBqgxv4Tm?9rV@-YAmP@jz#v+5%T?0XnRVUoHUL~4;RLK!^DBK(-Qq~e~1 zhfT$0a*Z7yL9VQ*Smmg|)Y8juAMK)O2V>`bs2GDBIqXvz8@X$G{MyGpRh;sJI=L*c zoAH4mY@QOTSU$-V&fm)J8q9nx%4&>mSbtNSnLsvO1xA5sasvRIrb}RiAB{3Pj5(i$ zF#!-X)DUHVzldwX?&pTNRZC4l#Ke!9t*mERI`YK4fVdcYaLKF=yJRdGm3I<;m1u+XEtAtr-5C}+~ZVsyH zuuYk>70fMYH!!bwh;}mDJF5X7t;{iudo}d?SV8~*)-mjGPtfS&l{DJA?GOI&z}9~` z1YqW{`GwkG6bm=)4oz5};^xmOxDC7q_R7wqDT-}{Fq-|`&cS?Xx_Z>kQ;L1hgWK~X zLR~mK02zS|z@4ognp&A6sb+z(F<#Ae`ba4{>LyZyHVs4+Cv9&DI)k{r!M94e+j$B! zFg1laQFgxmDyah+Sn~zlG(T%&6=$DOjP*EazEkk%+=JvKy%AFXrCy37zTX0h_h z0AG ziE7EF>#-eZWdig5twTCEVYF4-^T)Gl%mwLg^VSLoy;~vz9EUVn27U<0v4xB4_w|+T|iT`*<-Og#r5@w?PxQ}*O|bH%VM`<7-#u~KBXUv z=~o$OWw)rJHiRoTtsGtfF^^Z6zC*Gp17i^uFk6c@83+8=b}-gKF&@1U;#eQvPY7EV45TakN0?m0%sXxLR~eLp-j{y& z*Pj03wQnk!>Ak-(w;FQ^Hjf$ZbpF@@ZkXmu?71iGO6~po#I@kose44eb=Ssho<&(>GkrH8y>oQ1>HsW{T~%n?#Z*O z@sW$izrU+%ySb;E2e(X59ntmN(*PIq@YkNd%s;;Q3BmO4mf`Nq9d|B)LLO1^xUbB1;f3I%q=9caS?!e}D^COpU`*Zqyb(yQL{p%%OAL5nR_Y$k?*dKC_9=3bLdF85e zAiPcYu;1JFS9ITc*G`{pp7mL7aa~pLqn})_U*z+JlGgYK{HzpO}0Ig8g=* zb+gJAQLfc(x3+J$?mGC)pf-Kl-)sJw}L{N&X1@HT4ys`^0q* zcL?OyeUfWuJ9BFj`Lu4@-S2{TBx}8VcKmYMi~C%}9lx(Wdn!KJeBWH?E~K!^FtsKu zH$SEu#XEgn{%rSfbD_AuhkG*bPprn&Rdd-X#0K|pbKP&ezrVhm)(6}Jd?w)~diY2F zaqa_K``blt!u8&un2yZGd>KoVj_YMO8GtsjVq`y9|0c>}lOY^#6_G0|x6#f2od zP2Z5M(81?a{HK#csr7u;W<%I>3H>I_EZ1!mtO0(e)@JYnF9m0qwE;(0ikfMx#fA= z@c^pp)4dBltlXN)YkNma)JgGLUk(|n*q)rb;mX%{4; zUSxzY-fgPJtg!xgMcXyqP^^H>R^U*WTGISB9xj69(IqmAgDuh&YWAdz`ss#HiSn3% z5ua3S)YpOJm&R`XghQ7d^q%O`Oo%(5aI3;}r@poHsXzIitzWybK(i`qaaNPz%NKTN zE_$=VFcfF9rGq;9zNO8ZK8G+RwVYuN`Qs9woCzi)3#4eE!Z-L6uEauY@sBLbewAJ% z7dS1wCvX9k?>OaY$!IEt(i39xywE1FDT5NIreBOJ(?SPUu-xRJ$0*ptEbhK1NV=Ywkt61f29sHa7j(yY9Yc)%v zA5a7StWEM3=xc?{RgIAZ#Ljn-AVO0%4nmAl6AedTkqa%@9wD|CwfAS&0j`N?GI5=4N z=wRV^dtaTeNW3l9S0rB1nY(caH71Ib)`_*SOwYw;{&?o@1FoX}mBlg%0@Qr_NM z8l0L+_BY{_lWS9HJD!~A-FikLZTRT8zUpvMen!shaWb^qZB*E@xHVv2ciY>=Ou znsgI#2uQ7+R^z_y}5}~2WZxv{V*9^NTBKV`M0eu zPM$eHx;1)hu#hay9XtD~*4**_!RAXY9`7$~xbwY@Fyf0Pzr=?#LVb*aZ%-_QZNB32 z_Fk~QtPel%F^I`p_Tsg8`plAh{EqZ}m5=ln&P{H#)4_``=1p326AE3l+`o`smmha8 zU0ZKW(!%AnCLc(-&_A6Yx<4JfbmQ}UOXKm0&~XxJJ?yv9U+)Rm?go0d9t9`E>He`b zAe}tCJb%u89F{$@e5Qv93J~HW`X0q>wXJ@+zdy_OSKl+mW9gXij7k+$> zvrfH@c68#!t4F8%uS>(|p8ksm6aBY0^{I+?PX1c5^(Wu%=>p=xFtCpUNiB#B+NlC< zk27ncoB87yqkE@rv_*tQ_3rvUx4@S>pf`jAD;KCaa6#kR>=P`OxM4z=c{7CT6uSq} z;_L%>N_(g&nSr>HeuS7t1EEg5Ub>oo(u@0SsvUzUkOah{l+@-%$R<7{M(@z1{1`*- zv)q_S1hAU|c4phS7;Y-i7UQ(57vTyp(aK)gwop)DFG|3%GnhT>0y&3x+%p&*jOG}G zWG50&GV?p5&>9+?M3M2fY^)99G3`tn4zLwPa4rt4Y&v%~MUUYxV-T`2A?BYr-zWb5 zOCS7iTX(G%=$4#`*y{tfRTCI?;8%i>1b5ewWz{(}N4+(UuipeqVMB}db)xPfFi;hx z9d`J{$vB(|mL*lu@ST92LT5q5c~uee*Lhtyhcrjny4oXE(d&srt-@;2s58bMHbP-2 z5)cvtQb4JkQc-+NB4IR_HUs_;7$)?@+tdm=R}3!3D@Jw#&OdAFB0@pDOKKi`O{N?6 z=O@D@pqBIH`@>3WE4Qc~-R_Y9lagSkIk|Wr< z>2o*##W&sl!R_1N;PKEgMoiB@kzPz74Eh1MuvMm@rAWjA)FEl0Sxf>_wFknZ*OpEt zDnS{k5ET--36OxcI_)=+0AptE!yjGYnKETaI7(KVI52aW6~TKV0V0;}OHfVxSEuJn zu4Wt8M>6W&WUHPr@2DLp$_tuY}U#XX()$*A>0y{GX0Tg#Vty(+P;wc zZvV&pk*zoUm_l)?mZ_9(U83|xmAN{4MCN65hmm7KPg+*#-~0f$T~F3y;CkA|^34b(&D4d7w%oSansDL|X=I_UEM} zeMl2E`_r^d1$fluO3JZG-oY?FrNhH~hA?z#4=W$ZAssZTQ0S1qMPzFS(JC3P@-nv6 zMz{a=Z~fg1ZvJ9j5a4EGrzybzo9BRI7HIpNvbl%NWm)z7Xf%9dD%RL!%C#{yWFs_6 z>wMlg9*@koWsdL7&MwOpGsrsqj`k2&be@QwRtE) zqmJv5%bAXhFiQo8AZcYS3I==5Fj)I_m})=Img_=lqdr}UhjT04;nHUJCDr*fIWf*& z-Gy$N9b8*NXMAzUCebioY^;UwWtEK0cVsD*q1TPlop6oWJ&P+0g_BX^1t+SfR+5#& z(V#Z#R&R>de|7fyUs*U%u>^Jy2&QsBa8}Ln?P}7HjSl%8BGAk)ZSA%fZg+& zgo}?c|Cr%`FcT1@6XaV(2HFubqF^I)MlNESEWVi3Lz*zZ0{iPz!SI0QEeIJph$?0E zhxlW!aZ&{kiuXfip(Y%(=mHwkl#aQHjOh@Sd;;Oe+|rcGA+~WQJ>}dIFVzWu*(fpM zD$+(Z80e@I6^{Lig*dHYv{}SW0x@Nk-PYvPttRuF@m5-p{BxHpdN%2Dv|hAINQ4b0(4#n zgqyGvMX*%&xGk5Uap0G%%uN?rQpbP{7Be_Kr=cMER!JouXEj%auZbIp%w#YbfnFIB z@cMunZ6vEd*c+;HR+yPkF2?6pkE3<61o94 z*|AB|PkO z&%M{3kI$u~*~>TLsL+Q@4?Y^Yyft}zVv*01wZnYn_!65bfbWZU{n9PJ`@-A*P*x*z zaf9*KKnzHzHc-Y}LyZ8WTZ_4XMgx?rc>n@if>>-3O2pbKDUa%jL>BeH2qZ>jbztmh zTuC?blWc`cUMEnn1$UhClLOuhQ%ClYA1j1-mnj&kZrhwpebTpJcwSwzM9Lhi;9Zkx zI}9t!l9?b*l#}TkeF*#M9`q*-oSdv^N{w1>EKXAi_G{P%bvT+eLak&9ji^WV^9jB? zT!XFZIk0IuZ8PfoKKqr+|L4|Me}}^4q_P}eI3DinFZ5_7dP#L3Qzxus;x0lbNSxN} zNqckDqP0z?_2BqB>_q4aq;*c{TD`4j(4tCpNm^l%DUj=Y#*wne)&gVHkYg3Wk@ zUhyHORO$tZ6VudLCIn>)6?&BDZMHLp@n=;V!APK|Ap zG6lf~Uy;C2ZO8&%*FlwRzr4s4i9L5I8x>2F@o=!`&?1Vy@iAFBB)N1%kRrxU)bf?2 z(Of{OHvvMP5wuo#8T=72p(R1F%s;Axb8)IiH;A~Ew&(@Rn*FN#N<~$NT8;4At zx*6FH%?+nA1jxKZx%GvA6QGe~f*n9HfeZE-D+m+Kqk3#si3hQ!S3-TPo(Zs9O7{q~ ztAbvlN-|QBb?LEn^oQ*kZCgcFxQrW0Q1?rNN1A9hzy*aGOZItDfG~ z1;6>ZwQJw}W?>&kCkxP{9R`IOl~wMpAJr}f(8oTu+THcmX17N#s8vCWb3QkP``82` zif16A6OFW)WilYZdS)HK*UJ;et0xWgC$@mlG|`E6Jm^d2bdR=0fb|upm;tiBg1$r@ zm`*4)?(e%wpv7svuYk> zFVs{n=;suNPh7iEo8A-5VTcJ@xh%CSb2ci2JZE~qvgo{HTfgz{C|n9snur6ZK{Re^ zlxD*OTE&_T&-SXZ3%0)PPp?1!zipo)C5xX~Dznhk(o;Z~NB(WTqnI71i3Co#Dg$Hh z@sI%be~Jl*r1+*(SvVjB>`_r zYh`U$VZ#uvDt|5r;dc=&D4)5WbK6{=I2{&}9B27H9zFz3N4y3&gFC@SN>vFCI9TDc5K z+u4_&Lk%UGw-f9Ti)f&5Tc>{D7q4u6p#1#A%8lG_rpwG0Hj10e!fB-EQ7$+u?=rjJ z?lQYI+(!r(oUyIXZZ|8gKx1>+u+4>G$|b#JxOZ}Wua1Jt%AtVpeC2$l9k&}?wZ)0{ znX&Wv`d%b}q{z(Rj*a1~{B>sZ-^_pu)?Rhy{0MU$)>Ria<~N4A>}+midgpz5y`6QP z$%t?U8#3T%^-;zQZeug}?uXr)5=D~=hzWs2b%|REu;l@~!T3760u5dkhglx(v$?Ip zjckpizR5E1fDLQ9;0!BfR{Kc*4tsBB*F03c2kB38y{UazSY%BDy9E)RNmhlUc;0-95mQd!8;zh$O#%kg)c2Oa{B@L)8 z+LvD@9rIJYE0*zehaSc=D-+hEb$6={mf_!gb*fun3KEN|>;S?=XPRnQ-FAr?mSb^+ zWt%Kl5geKhbD<831NYMsCGEcO&-XjJkS$e?F*igUE5q1&r+=2Zmc%dCxy_81(c;BL zg9>O5f_3Hz{hs+LlCQX+dn|qMlQ(?(*v;MT^OHrF#DF}BpP#+D%DV+cp&lUM0 zc@*R$%OC|ij|WSq^9o2-ip5e+u9SpaTy7X(>Q$%^N-D`Q031@0{p)hn@z!CC^Xi4dU@}ywRuy$kmA7eZnPN8J6vj~aK zq|9=%+)qMEQmuwUVWYuiXLdrC;(5)^s%@Dlxl_;THe%q`gayBXxe_0{8oI8gi)BSf z(#I^PcCKVKw&kM82js@BFt5{NimeTBgjyUC*`KI2upGOs*R($LuV3)sT-}oX|LzAO z_{QDSGtazzZR?GXmpPyWp;X+k%R-wLc~~;=MY@#$Umrk5E~C?j1*_n>@3 zo4!LB0d}q*vgVE$(s^g8v=@m2MZ_poGCRPTE0m~ClM<)?bwmpSubo?=y4#C6gz}M7 z8TfIzNEm|GEZ@TUQD&yNOm*ma^71RnM+aAm8f?>vdNB(aU}QZp5(y?8!ezF~Fog9= zPh3=(Ic7o6{4ekNH+$cI(f}Z=1;MeFT0J^1%ph=xfa=+$Y`!w^uhJx`1Z0Hz^>itRf`L1z2AW|{^Z zvea;t^$KKLQyHo{m!;i$q+&Rv;uSg(LDQ(;5N2G@@CC#%>9WyWk`3E}A&-Lv1X=_w zIe~;hQc3S++T%N$uVeukP)nl4@-n4S6xD%#_!V97;P3zKU;W0`r_23bplpgPtm-qK zHN#fhb~zf0b1XQ?V{xEENb`vR&`3dW(Q|5#j{pOVdUC08IOP`u2WSPG*c(Q{rsK=F zlto7CNEIt^<+AD`%bPMWks<~HQ3mO>%YbOfQnDFji6!TU4)^rq10XEuTG;lE%AqIx z%pNN(deod?!)3j^`)u;^54~c~gSQ~mcR9m4)UaJna8KnP07mWW)K_kFkQ-&NZXRt2 zNl=hEnUD%}P@!X)Ucm-Dm=ydwuz`{S@=nO!WL|wbMx~b8ln+%4B1Oy88;vNy)*H<( z9dq<--9`~zPHRhGb}*w&Y(R``h%;?%5C$!Ae4~hKanuh*) zEKg>Wuz~BdQiz9Lz-wS|`JT3WoNROAggRs6JOolAUo3((S)EFm8sf<`g2@>J@(HR{ z(?Sg(`%yKx%(EyO zgEvaVhrzdCyAW|&~w=sK=m}7i#tA~~JuAl#hH|*Q$ zKTu>FHWPI-rf}w1@Fz^*oz$JWkzO3>)G(&@Va8}Rj4sA3X8>Da=iGrt*TGB^afPs* zfCGlNgh-71f(%#)9A`ZovQk4~dqZq@2Pl%oHcX<}1ks#Ep)xvCXbE+H^N=P6ZYHTS zlr<0&DYFq4F)5TWn+PaaI-+3e<;SkU2pKqV=wxHXRLi%(E9GHSVg|cmEjt_C@}vLo(uJ)jE|FAD=2`U}lBwMp+lLXe#qFpd zE}22w!vH(dQX8?2f|NC zYu_e$oE;UggW!a1C($XiDEO00S1#9YD8Hr%7U*_LqG8~VrP^+@7O*>lQq=-<>K5Ru z4skSHc&eK?rC0=*b)h{<$SNI2V9DDc2Fhe=Od1(g^-807Ya_&{2p7}6Rw{D_^kp^` z036|3P?ra@GzmdX2vJl~oT{o(@%F2xQmdJ~tQf*ODSe;%WJ=^T???m3t{7*zfPuje zj#!)4p#sZDkns}7a+^)sc}rb?aw;NCDM;6U$vDuKq zXgash87qhM{Op6_ro+Alai_jPnuJD5U}WsMwgUBtwFirYEakMRKSd+4=4kS7iS|LW zjNwdly`hjozREK|Kd|GYLWN_mof^hKa+CxrzztMMm&w1!-e+%3Q&8;^M~*W$twfF? z<12#ifN~XpGl_hHH_`>t%=mR6kL7`AQ@Xa{OL4(nzkg+7@0Kf7G|%YaMSjen-a{sc zC+*o}11vaj{4-25EFG2^D`n?LgGA8jwkc{<_d^*pK|Sw={Lr6->qjHn9BoE;0Y0Z1 zWQYNIlwmveX^fxDmyLtzNgOC2U7Pa|(u;zEbD6(Z$SB7zC!~@AZL5bLltQZ;Fr>M{ zku|Mur2Q&on6konj0A65WKs65AOFF-9^P}`kCqp)YBa^*s@hVbPQ68$)_rD?o@W|L_UsY~|gr{r%k$_U?u<2J?fSOg=zXfGeSYuSfkQQ!sE5aaTOgeR9 zB6wl0eyo#vkjE^GYY~(50G0s|Gb!4wMs<=pfAj!@1v7)wE=oGaNRSLDITDNpdxyh* z*+@iajVDmS5=7*-1%UQC5|h6|P)4Z~%JAmk^)Slb(iJf@+(AiYh0_H*W7VJl3$zxh zJh}$_7~V;WL==K0iy3wN;L>0PIl;Jajc4Bb^FQ{?)(6WCk;)GO_9>YIM%qO2DK{YX zAghE!Dq=Yj5ZcxSuwwUgG`%IpZrMPKBN+7|QDqvyqCu&a+RG#L$|`RIw#K68%sw+Y z5Mb4fPW?Pugyw*_*~*gek_@MmT6qD6g7pK8@*xTgcfuGSzf?RUVU*L;?UHm*K9D|e zcW^_lSZL!1a?CcMJZMnDGy-8Mq2e915>(*~zof}k6?7Cw(NC=3clVwfK37w8=~|$y z!=`0)IR#-?MwY22BqF>o(Y4W<_j#w%{Rq&LDl+=g0_V6SLPNlu>Q=8G!u;VJxB@8= zPm)_LJ7~~Q5rCG>$AR0nz48+iXDO^;5CK(`d@F6h)`bM$9+b8@?~T<};2ceej-w}n zkCTy&bDcD-<=_#+Gbz?7I;Z?)NiO&spdYYBFtN*zMFVK&G`c9od*#5z0KDWYSnx4toh} zI8Q;iit!aiJZlU>oc#p!HGWH=KvN4WNN+w#@uXUspITZK>U~NkNN#!ZZzmtxy7W_e z$9ck|*~V|c8Xn(n_;}GAP@UKd5vC@nxwJ*>#@ih_a2gF)%ge)wSRoQafB{D=xZqkU zy%B>%5N_~y>i{N-H1LW_9lR<-c@(>*Xg&!`b&#aM6Fc5%vFJhc0>R@!e&I;$%f)ZJ z6sbZjmPv8j9jpFv&hi8gp8ncjpL*(jN+)N0hi41oNRkKx7tXMS%{(#Y3Quo!lA1~+ zO05}2R7^{xwD2#BYt{>1{4tI+w?qFClLs2HBZMN|EaFd;jd1eA)F?EoL<})nEeu)F z!0mXKX@Jp3la(Y4mSAR4P8yMnFF=UbD9H^X(ItErUdzQF>?|Rx2m{{SCKE9zu4E+Z z=>3%I6b7K=8c>A7Yl_Xqtw^`^)$hLLbM@PQ&;k`f4@vTX%3ZkdUd76Zd?f=Dy;u~D z=}>~7XoFB@U9e-t#xyY^&5Tt*CX5dr0u380f>=ag6?7SbQ!0=MSmd2DY&Zg`Q5eA# zp^f)AGVtQ7p?T5^MX9WH1+SJuN-?JMB%#y`IjbM-5ic9OEy$>bSPS$a z{AL=*;)Oxhue!dV=vyQnG;Vo8V-Q>xe+nP|`)7aYN4Ea!U6z8Mj+)_LtVS=dX%4xa zr*X}GEfG-rH0l!Thq4q!E6ViOz-2;{T=6i!5{S<9B8Y{AB_$vn?=ENX=o@rC)+Y3x zZPk>j0N3;rpDTiID6Rcq*K-u7 zTZ^b5%pAtlP7Ufp>4QMj2p}6KYU3O_(QwKS{#YnVRAg!?gfw#`%+)>gv|zneEisMQ zkx^R*MXebemU_inF_IKKt0+Ji$=JAE58jK%RyNGMi)f)G5fxV~`QE;bL#@mt$+@`OAX>2># zFoc3=}6=Zn6roQ;vh3lKO1HOuTl*Ll}qQr6Vuf^bSt zoPuemQ4Y0Y@Ky*C$JX{=OS7;@qd0RfD04P zNS}S_zR&;2%eQ{8{8YQN;2855Ms;^o=SKI{q4MA;^V5JmqzTQw_f_sF+QDW58BJGX zHw^)F#^^g_rIa$+jWihre{BF69PFoOng%819qcD536m^IB^$DXd|VKI>XwF)OM%w` zm)mf`;2`!V2a4RR&Q&llhxlQ08;ndWZS)KVzVp@DJ?bN@mgou45_NL{7uzAFda3E` ztHew^dp2aA7v>I9!K8hY=2#$+(PMj6E5YMcRGi4=NMfMKSx>04**OJ<@nD%Np2wMh z%T&YxEU`Iho7xcG?Q1lCoRQszKa6$Gq1g_GQdyVNaEt?l>B<|_wV}&b-pE$o&$Ii* zMg5@j?8fmce|+s@3({I~9lC5jafxfOAE(nlcy0<*U&Gn5hrw-!!X>x zHz46$WnXQYPGDA=U@z*p%6R}fUxmxLhFfPQtG&`0N7v?bBnq}!8|3S$8+@2ep!Z9& z#@3g(L4{ta&PZ$EBa?0}KXn*1%#O@(!I+!7CUWOT=?S*SZziL`c{YwkbgnKo!)Cw^ zUyvOg+6yqVT?muK*y_pw0=W@|`wh}?2~|JaldY!=o58WOD0GmA_HDUPJGih?sC(J% zJWSb3<(8s37G3BXxM1fD!fF|HA;RorJwe zoeTpuwqq$~;mFO@&w%@gd*cqV8@o}H63m9*{!m}ObSsO9e2l29a;yR_orLio0{z?X ze942qckNyON6|AuYnUV;vC80O8#Px0HN*2&PSVWf)uY3`8M}Dn#%P=Mk%Nc31C9}P z&rG2*vFO!WnVMUNzlI#p$-0LbInX;Jb$FA`b0#wSa9T0xA7cq)c7{cXEID^ToPl%n zi*B%dYHFo9$Va8z%?$EAhuSWM0`{;f!Uo;cMKptb0Bo7(8^>dir`B46LvQG~3yu>F zQF{*aX^jtl$Z9_fU9`lZ-}a`Y=AvZT+-RF~_HOvo*>R3>RpApg3BT|VDi7=^`%_pD z6Vr1MHVO`DJGyVPPkHyVc5(P2y&juHv#K_E#T@R6xpx0VEvN4E@&Hyad#FFg=p4MJzH->CZ~yK6O&+U{_(yO5;UjO~H+{K#df%N<`FPhIN1j+-Jv+UoFt_#|e%HE3 z9-5loNRE6gn!b2&?LC9l?yHkoy~Jzpo?bmTx%Te;(RW?UPrqANvMt>6WS48>E_L~{KkV%=m)Bj+pX{E#V0&J0dY&FX)W7G+ zgL>?L_p1+IcbR+So{Ue=+}q#pCQmQyAMoH}w(jNI&b(gN>2XJ#E@uTorfEt zyU>n1;Er%X9Ip?(TNm2RzLmFwm$t8q8}J%)i(C&7kId?E>BJ>><`H1Lbo`-5PFy;9 zsi(*C=||ot*rw0?!PCpn3~t)`+7&+@g6T6ia@PnVoD;JB7q23sb!pj37v923)aiJz zdX@uojb0Op=F&z!@kF=Ttb7-;Y@fR$Psb-?^)Q*w(@E~2d&M|4 zC3Z<1U+?VutL(Vd4hF}4ahtvR%$cJcM~v$y55QYa9bMs8y9?>+YNqpbS-5>WTsPoy zxU|0(f&s9znDV9Jg|y?=URK^~x0t30x0vj$&T)>ZUoCEjTTHp?D?gR4ycNhVrl;P@ zocv^ynax$V!x1tAR|W5D`7&4Bahi6ZOYZvIdZNk@4mteJ0M z9aA_CWg=ER%7VTtMO7~H4^4W^u>#}ORc`e);}~U;o0#;$kz0zg#DF+%Qz_oasfAuG)$@=TRb6C?6;ZHr=&$qBEGRnB=$&mfcu%h^k~VXDU1bjhqbiu}ujBP0=#b10Lpq51CRT1Ci^kQ zg%Ie0k7%cN$4o!~5)T0^ePOZe#^_PUX_QQd&B}5CSrAbV zka7)9fl3aj2~-7?$Rq$@mXmsk&O6dzx<6jec?Z~AZhqzi`PP^Jsp#OCJBJvm@#J!~ zv9^lx+QNsPHBQ=Ox*iQ22YRc?Y_k#$nlvnOjnzDwk2xV4hu3icHy>~HqfYa>-dgjz zwE0BN8OD{~V4{}nyPP|=>~e)_uQK~Yk16!pjgz(E)a)vg(Rli;H8;o2jAZ4ca~?K( zu6xe4#-qNDLWhkeQTx)`=e< zs}IvTfbPX>@IDVU=dOV|ysqi`26pYb#Tc-|WMR5rzzrb*_iD3qu_wR}rz45c2ztO9?lY;%sGR!3n1NwI#r;zix-uTO0AK#5alSI0<>dBy3hi-H zIu*dD%NBt6We#rZ@U@!Y8p1q4_qdTF-|U@(?DCbElZZF}`kP+1=gO12cj6aa|3BJe z>rbaXF@5bfr`zrFeAa%&((w2=3(@Da@r)}qqt@92{tVkS?#lGU7eqi-m)96F<{YMa zvg&jw(w5H4C@Y-VsL!TCtnkP_+zoqXaxJ3*HKE~K;r6S-@$@a5g=n<{Anbuf28*y6 zW-0YSZr;`31sv@oq?-^%f7ka6;bIKG~WZUc6+YKOUu+HaOF%}H<> zHw+3;Rh^stk-Gg?UsJ93st!5g)c%ZD{aTV%A{q^%6;#+>&f5qRUe} zAThk_FP~XB_0$K8zEpQ3l-ZC0C@vud_@fc1IIWCJGHGGb;+RzpwE(RQzoF3lG(!mA z$kgKrdH{%E7Af&Z1Jf)HYnblvGRMnm8%lsJ4jk*A0KVUs0Rsj+Rca z9D*e3Bv9R4MREtk8dj;R7o(d3rgqNuFlw=rbDJ7v!7y-)7~5(WyJQK&0+F)m-8($w zRQIFUG5hyu5TzOx7dhge6XjB?&b&rG@$a!xpe9JAO}MZ?gTTG0Xd z{Ku;+8MI*tB=SWwQ6?=$#LFvu$ZCfq1ufauvV1(j+d2v-ddA9dKS$Sh*) z)(ce918D7Rqom4P!!eE7rAXr~UvY-aPaOE-+U2dYjOWsUCcwqvffq4+HLzKjuyM^o zGvimE0~W%lR%a)yG06^Rq$L&K7>dxS5*Fv`8P=tm&<6@Q)}2+L2%5f_2)p=siX2I= zK7%xk9974}L89?a3HoEKTDRcS8}$W!#Dsv-r}b=Hs|q+I$S*pPc>s6K{p#!P z`tIt@5AC5s?=+MRk%m3dq{n0fiUX~vVAw|KHpv?)_*(Imw`OEmFi2{lB`mmiXbPY~ z3GhzGjS-$w;smV59Hd~(Kr=Hej{-Ss_qE+a+bBjP8PKFEV|WP!!!46xO6esUQyK=9 zZ!^f6sD<7Djr|&QW_aW-bnbqTxDh30HOHJ*n1n+z<|)3%bjb$1z=cBU&gD=V;AVIs zOQ8}NC2Wi=M>WE8!=)Aq)Di#qJ2(H|BOm%PP!=*LxdFcomdMq9)|3WN4LRb3#X0dDylgs=KrXrBEH7{exD@q*S15>P@DKtCf*opg zFRMab^fwo@Ko&NdwP~U)G9(4^oBznz|Bt!%kB{U&>pZJlCAnjUpq6{G)!7;Bp0rHK zj7Y{9Xx}-Ps#a-Sn(M)mEwdU(E}6t$aP0M z_s8=*-{<)}&-WKpv?7@!N7`b+DU;-_92SufsOeu|m^7iS zmwo3y`wq;K;~4;%2Qi@LP3<+X6Qd&Voc@1bVT@4aHNew4ywOlIlq#;mo}!aW*aH;2;O(2%K~!ojV*^ z>RfS(HWCs`Q|KjKN#fkIL7DbqbfrUiCZ{Q4tLNwO+z*KQr9b`3iwpZ-_%B7x{KAUZ zUOv>7m;lIZJHD3*eiv#qg7ezs&&Y5?Oo=F8B2?&spKXO!x>EX<_Q-?}06{sPr2CVa z&yr6hSiZL4B;PIl4$!34ShCzhXenaKXO!h$wJgo`W#S^H1qS*cKJ$Szls`g2j)nv6 zG*RS;YVsrF4Ka~W#Fc&GI>JC|zVBGE)F(P6|LGeYQ8_4ec+Z)Sy&M5Gb6VS%^y2;x zJ@@?9%U^s(49zd_A(D7aYkn&sd+cl|%fKLPE}f#Erlca85EK_ig5*Thg9mU7?P%u; z&E*|khgG;Dneb#P)OUuu(@kKm-bIyAG0SfAk+TOU{*ii@KO2-o3q$LblT<&&QX zvf!dNd3R{UaZ*Lf2DEdbrRTSyD=HlLlOsyL@o1g$!I};=ACi-?bA2_Uod?}*LB~VHXblI&S`q-+#i(F>6<)SIg zIYg9H0tJ9AKyxB{l1(V;($#x+41*aMBKkVCuo7vcc&)_}G_t){9o^!}TvJKe94Jpg z^i>+5U=##Lh0zD0T)q_SdSKZR`{+2Lu4N_VSb3DILr6GrF;obr=%`E(PRT4^q(9LL z7X;48YN0BKi9cyW<$6O`E z2PtKwkxBt|nTr8Qob^Kv{oYyJWn82ops8<&Axl%5C|iADx|7u_$R(iDZXS}87J6IE z#0(ow8gZ>Ay+&G)0Cl8TSZ4*(d+Jj!-1_DHPrNc0Q>oAZ+$PTh$|92N_6%tylNtb4 zw8&ym>rg^ufzTTA6%Bo%z>=3xt4~%?amC0^fjFVBB(vQg3QZm>LYh#J7E7(kO_x(7 z)MP<6Tc?J&byV1D)ec7}B0`B9LISH1)a4nr6Uq>URY?&Tjp`=~^MRqhjlvzbO*IPZ z6o#+vtP4u5$tcP0TY;3ft}+dxL#9xe3r5+`ke*&Kd8m^V+Ro7EUmx}Wlqj4@<4Yka z9q-jY@s$m;|3km6O!6zL;j7RpOJ7{e76CDW9rEF2^<}N)U*;io*{#6MVGPEKI>-&6 zHk!VVS^yeSR}r=iEL9V%g|a9shpxZ7j76yvO3*TR24jm*LqH(*Tg8Ctq#6*W4?QT@l?|g3qVhx^Di?SV=b%8kVMOF%_!BuQ zEy(R~9{z=IeCqQ4Z~kdcWc^0>WX3R^^c^$>43*D>^ydx$8p)De zPL+)}$wMV}CtwgmW++SITpyHUd8phTYFuwPxIqf^D(MANga*V#l%?1`!Un1b+pO42 z1S6kSkO34HwXYGir(UW+sM3&!W2k^m!oB(5edQ0|vj5zbJPZAXsI&?QWGq$L!x-a) zum*!l4Ub|(*BwDFpn)FNoQ%P8EiZL3fkm-df;^Nm0Ij7g($5aKR;{9Mb@ZLA3}VcF z6qbmzi=st0*+Oek1zbhrPI(l|V@6~L;*J8$3ds^g$$bJjTe0+=vXx;O+B5tEQJe`& z7_^+cRypV!yckgw$<_2ws}QIIf&h6Xd0gxhhX=qnGGfXAI>5%G2()VWXh>b@+YxoC zlC%FW-}TmCF5L6x1ILx9p4GQdIft^M5_Fk|wu;$12~(e_4kFtpXs>UGRTS(V$gD`4 zhgF!yT)L)nv5^On0P7%tHDWKqYS`F)?rX{CBKN=sBC^6zZW$?3J5d5w|La3;Q zTyU*Mu!1|%2qU#yFhjHeb)aL?N9)Qg=gzF~0i&Om#Ep^Ol@YQ*eXATKz}I;VLt`!U zM<4QsanxM#iX`e|68GVV9i>@aIdk#?jV>xO!@ z;TOO{B84HxD;U9DOJukm3>`8+1I)8V?mEywxYHHf?biVWh|EjiE(k)A1H=}kZYT_U z7o$7LTGXO6M&@N%pevXGH$?*cjJCa1uz>rDwdy%mES7EnZP8L!qj*v~ic)LIFzuJX zx)y|`LlBk-GBhj*^T1~o=c+OgcNk~2K-cni6~(Jb1=g6+ObwbyG58SL@P_K5NGtE| ze|Y7W-m(ABUJ`r}4!aI82D$!IDAe^`mv{nHvNNMq{ zyj=OQG>SVm0EsChCoH9iYImJz*g!#6Omd<^Vk6+vEUh?DMUv|CG8zJdr2fKXL)U18 zCK|!o-^}f(O2P+nm6BqgN~>_aq!*kI{NZ1mKEMB}|5~r-*GNjywfJGyDZ@v|J%I5Gu%0NXZ9EI&f$$@+86OZzG`po^BxMQ=0G?Jx7tb#Ws}+qXF*CR`Suq-`Ob|PD?dw#SX#=M$!p6N8$;>v*L-k;TH9eE28WSKmm%vAVl8ivxG2^LZw*%ixBH| zKvPjnU7B9wi=+t4wRnLAmqQ3E%8DtD;gdkLrKpX*%wd&weICmJYpU;GQ=$L~b@v1G zirk@Z7(5XWIAjY4ym}*&4nr^w9346cAU?;A+*8vxz3uLI?r;CwAvxvN<_>~FFjAUm zQ;fZv6cxb6?V+q85U3H^v0)h5tRZ@}9bO$pp)ERq0?{^ZAi>l2?>QAC>=t)a#lY3_ z*dcs{$$59nMU;mEQF*UV3fLejqt0b<7b9a7p@6F>54~ev22NSUiiz}zr5)(dYlADo znUoD@@`x)e92d-j!U9pEHj-vLu{eVisuaU)h$3=qk*m3`yAyP^$W{H_I3a1B{U1L0 z>hHbr;Y=;I*Gm9E5mGtVL)Ys(f*b+NGd2Rv|1Pp3hbYnmNsS>Al4{4|a`1{xLK}#% z#axNz^C75;6;uIz$Zx|u1_^+$a!}BE2ZUW!lZS+5&_#`+RGtqZ7Czn?15(u*9)XXWHYwX-~8$qzT@4$ zaVV$jbUQvBU0hk=NG8(A) zJm>;N#CQ*uOE@64H4ZRB(#nHX?kfb;ixEr!tNQ=9;#IxN%zvp=q!!zxv6kF4*})bW z{GQON70JZVw?`<-Mz_Ve19Kmgcs1 zGNdZ~2hfiZ!_cdbU#C@bH9&ix-eNDkcDsdg{ste*Ms^uW11)g5uDO zJbPJ|=uk9ykfjb8TvFo^%W|#zW(3{$%;6qXG$4oDy=c;g)dz1+1DTC0l z_FOjs)gB_Qv1;>pB5ZoZ{O1Xm}k^a&&{g``?^?{PF!i`;+0V zXl7#O+zYv5R3XDj(b>h$+K!jpu-c8x!ocUOhtB2Q zvB&R9zU$oZ&Y`EXtDUvWol!G*O9x8m4(+%Ykx_Ophe*(lbk0!2z6t%`^%gUZh{$g0 z6n)R05)oeIoPu+TN9RKAfQKeY{ z9Sv4=OoL8HXxbYgtCKl)2y7D7NI8Fn`BL@}r_+AqV4Ya4UD0wAM1dQc&}n2gQdkw4@JiR~$q%(;o%n)h57XnJ4(KT%Kx zZo0>2y;(^nSZGX`o5R03$}ughV)orI zD|4a*U?+K+k8Afw--nM$FGcaKx@q+Ey6nEi*pcE}i^^YG zFX`{WGps`Hc4G=aL_8v}VYiJ?vQfDs6@`PI8xB1jUaDVy?ca3&>t0p(;-^P;tVRZG zV8z4HOWc8S!r8T?$OM$U8WgM#aXg$$z!x?P$r96dm47a@038_q3?T?(~j<=8!UTQe|`QU0rSTxni7B ziZj}3xyu|9R^5^xdoC>B;*|7gBpglmYv(;PCKZ3cs-o!Pu*SLJVNkOLvF=oWe!~59qM4KKBIE>VC1H$3=MFxXIu%sq z3OQ*+d$J25im&j@APK;|CcYC1d?KeDDOUn=T5LBtzg-5B83$8YoOcI!FCfQ|w2d6~ z(c`=ZzMQ|}$K7Re2wd$c6m_R?HYkUl#mz)6Grc#%AG^d!eApugJ7Vj^(~{Gt=QyjR zV8pP^pd`(4m?<}@m`z4>oQwJtjpi(7Y%SIX5&DRW<|wYSjrj3=uOA&evCI#vdpkvD z$E#%QgO*~E<9cVQb5Hi=yI=nN|2R@mcIpfj9ni5*NIH%bM<@a#TbRt!-AOi=C;EVF z)@a&k9rD29?2!GzH9(dBNN@!`8%%8|(SIWjx%D{J5yL|lfB^Jpa$)b3MOpyH)_frd zzy|xJTDNHc+fqkxuFXng>R=KMlz|{v-L$A?@D{t4)OpK+HN4$OOzP@zPmP-98`n`n zMorB*HnXA6k#ZNmu+w(g_{fE=WJ5jKMP;pN^%m|fo2byOESGR^D+1rT=$B7p>$#6O zu!k0J(dTKJY$UbjcoC`SP;*Tle)`jc;)_2hhS`hPA~)iVq=*Yc)8&O|J7BNHX=3b` zT=W9$I3(#=iO?|#Lruo}ViU9iE!a4WU1i3`Je(H)kc8IG49?|L4B@p6~gN9~*5fjqb%9(&ubZ zeni)R=2Lu|91E7Au?&I)Fl#qUsxANN(zaLI}5&%JY>-?UYId+bP0da?sbMny@<$u(#^(tWk(j^S5JH0x+ zQ+I5CgSIkPsv`gCP$CvtQwgi}N7*E)Xs0J2NZ27s*F|Hwo_hW-A9?@&+oV)yVkdLngioQZi!D|b&%<~l#|6%Kh1<-OA$QtJLYcw5 zAOYs#$4U2D+hUXg#jZfRRq6tHRA+IOanY>sEE9mZ(`HagBt^o32B;ffnbY&epf$9o zN1x*uUqE&0%1UB>wKb2_L7Ug%I;WtzD}a(X8F%(K|NGy0$NqD#Q?0m?BDlt?Hrq>u z{n`Hvnx>q^4wlcE5Q;d^RyDLjW0i<~zkuvJxpt=_A~?69G#mw_^RZvhJ^E`Eq$YIIc(~{59W|7KL0?wG53^a7Oi|yQ zdUS0h)b3%b8jQ|wqME=Q%p69?!oNv(zxvPK{ej{ee||I$O$)KLw!*+9Y+p2aGLE)c zg16$;FuUlvVEYGA>1$ZbU5_o$tnD0dDCa_on%pZy*07@M?!s`>y8^__3Zn_!?Bs48 zRga`eVaH~s!1x6|(ilp+a4~gT_`wt_PiIx)nVgK>Sx$f`ovxdK`Unqu_#SQMUZ95p zgj9^Wsj#<(kWASwN*nR4GRen9SyH+st9B>YTyPIH)6?#1M(!q-1L^<8f@ z!@NXdYYb?BjsaJ&kgf}bd7(&e;<1*M0o@4`>mX53aOPuJ=5qhG=*KxEc^APDpi_>M%xfzVIE6?OgRni z6S7|8gc*_81@+QVr-aq3q)2R zo~k{pFj~+OgnO0}m?FpsO<2xr;#^HZPuI|xSdyk(D5|SGMJ`betA})pXuP0i+A<*7 z!USlsr~TnYE3)ys5pi}EVJ&s2{9p!$TUTr+MkPR+gc-KB-8{7PBEpf=AhRT)P?w_Z z6}Yy#a`s5lTLsa`+KXNkD1oOw{^ZyH;I${Ki}K@?`lFb7IvmlO?oqFf<%h>{;?nieI6B^^Bn zMBpX8BKv0HXHwX2eBr?b#p|BiX$6GJyakUB!IF++37ohcuRwvgpN}kk98kjSTB<9sDovI zchEKRrw@td)E^!}e=ezG=&kJaJt@p?WBB+B<;s(V`9m#ZMMiXxae+ppB?n7Q-auFC zBg1?3u7hNV%O+T% zXhe~L5qZ}X5%*%eo5d#UE|6L-{gRst2?N?e-a%(-!eqh*ls27}MGS0!9>yd;AskDI zDY`P+jyMuP6Y#(}xqP(LMwRj@9D0NFA zs2fOt`)F-7E@%-xob0S^#(M1R@4or3ChmFcV0xGgE?QK7H|ixn$H!`5UVIRz~#s;dUr)fo&ks7IF%dDxH_46kN6#z5t8alKc!J;&&T zkCu8JTcc9zWQrJXTAb9Ze9e%mNn&!93n`F4RHwMvQ|6PvCuqri^h%9-(%t#REiU#0 z4sG~|^SSr}ov1&V@uLf+&BkMqdR;EXG%Mh9{@9K@l1j`|YG}+vGtYbDzxeAPXP3Kc zaZ}#mv8|xeN&N}xaf?^%`+QUyn@;(Wp^>E7R69A_=~dB=HoUIg0}&M0k{w>>pGqszLVBpV+$RWq;PkgN7hU#XF_A%rJx3hM z&zNBiLsc}{iJd23{5LQE#IFoH8WNyN&>%6=UWy}478>|F%xFqGIGI0cNpV zQPM7hPX{eOJ<$N$g$b01QcTmgKyKsq1l z;43BD#7?MMsy%#V4rWQ;i2Lx1aEx~LwwEPoYn-aEOv+Z&F^Nn3pUT3K6$UCM$3S#p zDVbnWPLsPNQyY<^_ZHf zOksuuCvW&(jR%I?a61=}#41zXhAX4Id3BXE&g|69pPKm0f1&b_dMNpP*bzHnNpf$R&`R>Omxu;YEhrF&+Y>!%PVt6@jVHy=JpI%w z3)eRI12qKv%gaI>$;1BcmZ4=pzPctMJUlE=h!U{LdHz6qvLl3x&0Y*OWYZcZuW>Fb zl*%ii{p}1z)R~!}f}oHQWU zQmDKGHz|^>Yys4@wV^2dm3%i?)~Z`+rDmDV>(wjy73G8(ef6E$AA9&`Zak`H*o$0j zogI3AufZ))yX1sx*c%;ZU?8vnAS_qn>Om6O*hsbEHkwB-!4Q;S?xJv8R)jaHwx?cl zF>?7WQlF3#?S)>6_+AtO&<%`RtPC>T zYH$D%NN7uiV%5gJ8(aJx3kHiMRKnIDF(nb7>6QRtTO)dJt~2Pqgfo%+fAl*KfBEHa zYz+M!YZ#-zrbSWFg2{0*jE1z5OehH;u_`-e47p%`D8+U~)i|#;cZL_qQ1iL)&=2S{9yZ_V)DZ86o7g8_RZ}4?r~M+QiASsM5s2eZ?dm>BBk3@FnSb%yFE&cQHws4BI;9~c zD1zn8(}DOD;8c@66H!!($Ry%X!5Z|Fq2?O}&Y(58_+-1dYR0;7+Q}WN0QSYa=U3Tq z+iFUEx04s)7J0(K$zqENz#kIl>3!vIc;uX*I>hoX^^1`na$l}emp2bCC|HFy;+k#Y zP?iQN2BFb|0OdrE@-Rc{Whsmf!Ik2!m|$f+8Edo9yX33{pMK)&@493E>Ct`yc%&I~ z$tZl9XjZLTNB>sXQ{gV@2n?PCwSn+{!4#|Epw5#z%GvGt@W-VMNP5z|I#-xsHyAWI zRk_#RytQoQk1v`hWtgaN~0Gu$t`8*b?TAL<;B!@RtX2w zsaXQ+JpO>V4X^zbh@8?vQQWixi)$v&rxVPYn`n)N2rp{F@nWwvo)uT&=c>2rN4*xE zu+Q)T{bIs~bUEdgQzF`lQ7DA*r9b_l7ne6b`R^xkmSX^jn55yMRr%i&}Vikj7kOW(qb4jVAE-Mp})Rq^p1GiE{6pPW{?!RWp%8DLbW*W&JqgY2$ur6 z5yBW4&aBw2B+>TmiyGo+k8^rqXMm7TPRy{bhLc_V$(g$)Pfo@ zsIy)pD=u=>ifMm99l{fcu$uG4K&W-&ZVc_YFg;lJe-Vj zcd2^}7kn+ne{xO3^AGb@+fCZc9q=3UFTZyrIMizI)P28^T;M?Og72T^L=xsA()}4q z*u0hLiY&V8ReGx#0~Q=+tO?cN14DYdiZDZQY2=nMVc4TA~qtI@wcQ)gm_qreY z>bw4Qe_^yt$wVwCM)`U3EDFquoL!S`Oeci_F_{Kj%#HhrnN$iCK0U%AvL zrr*FPgHwcEdaDg$i!IZSv!6w3;=wceJ-sw* z?C-(s@*Di6*}-h2KOEfghL0}Ia5~5OE4P{)+Y!!e-FN0k4Zj!kduid7TXWSXo}AvE zI~p&%l4C=*C_OxLrTN%q$YB#ta(2n+4`+u&oNA)qIzi;dGg}YNnl5$W_k;Rfv*(A@ z&P;u-`TnUhQ$4FRcaTJ z^JnP|ADz828|8nN&uo5VcDcprC7f3>^Tax5fGiLH+_`1H-MM9SmPvKX{AA~~%lw(; z&(W2I?eysKnT_)^+u@l@?AKqtzs=bw=FI);{MkD5If}Z=nN;9oZ33GaP>S#a4al*{+Z9mI*DWFeJg+P#CgsI*}9+OL4NH~xMDv3Z$idWt|biDIgpT@{3XR@~L0^{K8g^8nK5Kv3q{mESX5+d8K{!~813`S9 zun|_$3Vo#*PZnxA9)y|SiH@hJmQEavfbmP`%b^br?1Y?7G3`~{z@7$jG41Fu5O5Vk z34Zr%w#nfd{W_tENZzqd0-3KAlhQ{`+~TMXOjzXTAdqBh${wn5c!H33eh!E?tND-1 zO~zN&@lTAI`KK)k8lNLBAHa8$x}rM-?d+K9uCl@`iN@$A4M zTh0#iVt?jPSZ2%oiuqhzNLZUeQ>rWR54hpQxXrmMM=KqUb_hG`EblO1Gx)j8T+@!k2)x^4B<@V6rgnF2QE(nGe=AXIwyc!AW0J zbIcOXSEp8-EE4)LWiUxHjCRif4XrDhp_Kyh^@dl4t%>9wcCZ$E6KRlHvp2S2XK;;a>DV|?pbdJuVXq}+UYHW z`c_PA43zKTn?Y{3>N2H-(`lN^&5PmK(TV|Hguru&YF9yHurR}x$ z96p+1wq@UkZ~|XOC^Sn$-7(Mq`B%RA4?p?h!Ga*hf(lxRfDGH(nE6h>p1`hRYi_$@ zJcj5wmne!XyYP+}_@E{Ym}5N7I9hKrA*|-j06^s$+m=9ZciLsf3E-OCXL!zy2=E{u ze8QJwfYcRM6j*AfOnF*pGXrfLj=8JM0-8xL0k@7W^R4@!=U+_0^3#X#fWpo=f=VRB zbWgyp(42`tdxOes9b|X3-n+w8!|lU(TZk+X%(>2Zl{F68X4rs6tkaw}XDd zy3Sru?_I`lQUqD9u82<+G!VQVYYdtNlGU{b;C9`x~ zECaX_9%FrmIOZB-P>-!*!)w6}b2`p;aF5bv)?Vx10hyl$V`b*T@di5YQV| zmB2uw0imFCfp6iT{pr_Ud13!g{-ZOz^8S^DhaBR^I3tF!hrJZmQk*zgiO{R`A=|ys zDny&o~I4dz!7o)#gmMIpjF1FJ1 za3mR|p@4;O8`V4x)8a|^KFb(lFJcz)MD_e7W=$2RX%=0KIVbcmVjW4L+T4!JnE}(R z%*HW}yrPHES;FnIKfO!zy+h!O160P(tZ&Xkum&!fq8S&%z8{;adCsIe%x&>F7N|j>ki$MM0LX?<~XO z6&h|ts(Mmr5ch&ZR02oRwA*kEe}YamXD&caBpG1O0-TsG2I=|7bK)WNx1?}$_3Qt5 zYyW?L-;iOzaSR2Do+yZC-8P8spld^PHn!hRoNf{8;|iqqWi85R0DC~FqM!=Vg)_2aFFVbO{fU;R5JHrMH z>QFLxF<*&ED=wTc`IkoyK!KZ6qcoErd(=%_Sv7~!)hgVa*G{wa2S&}hWv#tlsG$+L8J1aQ(RM?OeqY}tIZ!_xCBU?)bPQPSc zCMLm!bjWpR2<}+9i)}J;R|6z%tRA`Yi5G4>{fJU>aVA%7;nLbO-t2Mj!R+209dmUw z_6N0j3>`2r-MP!p-m}@dx82}gWqvu@+o(r`6z-aN_U+Z}JAix@H_9$W>EI53Z)2+U zNN4W-Q{fN9D`D0@9y4W)qnTzqjVP!zy~5sRn5|t-3$Ip_!?q<(D zJ@EI^&oq2oh_}sL4V&)ZwS(+J?iv*A0_;;3e8>j2%TI~zoOn*7+kQS7^=dGJQ zv5&R2%_)vgTV2oGna)P+wc|zuFX5~ArSI6-|Ba1Yg81!CcP^#rQVK3;p-BZ$!X)h< zXBXPmTnD={8C9ZaQ1Nv`z|bLN3h=0SjU13+#pofLK3b@8%CM%~E~S&;jvD*wovt7y zgoCEBW3zQ{wvO4xH;WBDbQS%%4P?4%Fm0GQQ%>6iH?VCwIMxD?q`c!fob$C}jxKl4 zCNgG({jmFm7Dj=7DchbEtL=>wrredKG6}7@)C7WfN9(F!A5V<=c^NZ?#;Ws}`=fDo z*_aD{!^hyy07J^z<CCR8T~FvlNrur@ z(8Mu_Ede)q)OehL4g^rGR`|z!M6d`QK1tV8X7m6@4FOti_3H`BCu_!6joCR49O>VI zqQ%#Vcm3o-y}^x2exqd6M2xRMDW$O{wFK%ZeBz$3e&o;g&Bw3t@xjtGYx0%|ccW@m zZ_uOPJD#ld>*O2)9z&ph)GD?BJ|8Tzu}ejB8C%CFsx`NP!8lwx3q;M3}J?bub&4+a7@}j#{=1huyL6!Arug^H&YiT~YbX z-3rk&Q2EtxygIR(BTBa0@DdEZgO<$sxwZkMoSawA(|7>IqZO2{n#Ej$9ww@h%x^Dc zm)8Zpso_}nc3g?WIGaZ!{|(GoCRir1Ks$3|!GcKib^%CP4w#@EBaJy1Lr;JPJ_=KY zOtkCiYcj#86(gkplr#ciPOQo+3D_kNKElNXcb;7mB`cWBrXV8$)6&3)v2>CqTc$x{V)E=JNLgXYnorgUTYdFq_x-@`3kbdd;*^I zDiK{%#sP#PYonn;BR`mrzzEC|hw2eSV5pI?XS)!jg!?L^uen}0%fe%fXMj{Jx?ydz zU<)DXX}8Lp)GCST{z6CrZ&*(l?-_w8#KvIA7Mtn}fDa0jO(ka#G-i#!_AypoPPUuw z86#&H<63nY#7Jm6O)Jv~4Vwd)@W1qhDkUyM@p6V&?6`>|^O}F8n;6;c1)?)pY4YO{ z_(R5-Rz}nxOV5YAQCLoD0?O(Mc!6v@^Xk*z-1_|fUp=3bRYPKeA6gwwVjT4_iYzr0 zbBLm(i1Y81qW}-j^)b4P!A1?cx_7Ly7|8)ELlcdh5`IgRMa% z)Cuf@#F7(K2|z=P9zomgJj#&*_`&N!L#hp8$vD(t2Ty7tI7qodK?P>7I#qE@;H^hw)3*^l+h+ zZFAA?FFy+4+-k%GDX<{3K4W-|F2B>0;O>tZ}9gESqS)6v2NOL_}u0JSY#AP;vyG#)xFVVKfKI*TXLssF0^i zC<97p6`i6<1fsM~HJdPuta0u;2(-fC>nq(i!}b~IW4+@fx@ufvP#ec|x9`<1hV#2o zGI53&$TS0I(O{jPM!s0Fd(~1fP;C#fD#KUth+3}@Es>#775W;bs8{uo)DDwHo0)z zhpq(ng3fv~-j(~@CtB3QeP-E|`nn%F8=i_;rLHtg2N^jR`L>m)5BVw=AL@KTYUk0)cMPQ53K; znY)m4m#$C5l41Fl0*u6~C}J8^L(l2VcXH+;mM|B1I=_8?wiCHPg}VvXFsLq!NKN=*N#o{x2;DZ1D|!5yk3`Vxd-a zv-6v8CKh5%K65)_R6fvRDc0HAAYIGr9o=?yB5rm~3c-$f;g0f#27wE83 z$8I*;NVvbCD%6Qw!Dg^}iAWY~tt)VH2RIQEN%O?iE^ICWIe?IqLjdXD{mx&0>TUb? z{D)!B4LN2v3y*BQrD386w^Bc79eHoqF!M($qIr2MO)eaX&XyaC(R`)Q*jtKbw$C>9 z!peKw{^DSsMQ7}LQd?~d2DMIgE`EJE>Q-HTZKRB{A*D&P1+Vck7Xz*?s_)6ug>0Er|AGANym_M@B?lsI=)!qzF zaAfq{5z`qoOi1Oa)cNhVW%otlO!f?Ppvbkb#oHGe!PX96mUg>meUDS6iGS@b?f&fh z&-T2hsWG-9BuCGzAK483?7rQwYMyD>W0$j~-CCJFffygj&KIDvxy+m0_PGp0M=5Mz zaF%U~I`gLU8EP?;oloHcm0RRc?DJ^$hqCi?D|<8qs=$|?xBmV#`AlQIveow+-aP)D zzegFJhKlVF$C-zAJ4e=!r0htueq;;j9-G`e>$lh8!v(M1O-a*MJHGg#Z~nv^_rJC^ z(%k|oCbFX-!b%Q39DAm52Vyl&*vbcFh^t4gj*0<(BKF|KvKbCU_;f2!IsqHtV~s(X zkn>0csG0ZyAR(57mXS}O#Z0(C;F1~8CWBL8VvrI)fLK9Q4Tlg!DuGG?Nra~+n}qFo z(}v2J6p5c>VIX(}D>Vw(5Wrz8@@rq&sghn9M4c|aK*)iCsShB)xftOCS(;gGW}0ygKgx0rU1 zU2GQ7pSZs<>b01iN4*wLS1_L!&C5=&Tug7oe|xN)Zfr66!_82x7|I!@b9AS=ONsT} zKs%s*EGN#}NVlpq1{G5I<7QzUj6>XZ*5`+j2A_NI3lBGUz8jcnMg139+l< zGUx{5*#cmo?W92&q%)Vb(-lzEpD!uAsWQsgPo5ip<~;Uuj1^57K~y5)WpHwIG46YK zh$987zyxl*jHom$S6jvb)8E-y#;`7|Z&nOc$0O|d@ln9Jsv;nA;4 zg>w0=w28R3V719`V9>FwSx31>9m*%P&0c`7e)q$-z5JeEIXEpm0dLOiR3bQx3!*-? zXj<(i9`qR47jGjN8c}Ps*;rZ7h{y%nz0hiIm*Mddcx)YDMwU8?w%{_ebe)w(FqidS z@DA=WS^`F9P=RpiHTD+SCb!K_xu@CJgA_CLuyPTIjzr)B0x=l8>rN>kGR`oJ9XNnM zODRCkZAG2&6*C>LfP=+ekP+b)*-o%9a@&|G=B5*YD;h@T;bpSc9y_CW%NuN>EL{Vg z%vj#`<)*h>Y^UWeu4Q)lw7Cq==Q|u)!Ys}P9r(PyDbtCOkP8nyV%#Hffxj@dnO(49E<(UKnZ#Wf$7|6I zz?^)i2YHXSH*k7l#sX1p*wN&L@A>(6e)Hn;L9jd7sC(H?Wzb@ZTLCW#&uKo6b}Iv~ zI#wN9fU7SVV|A)wD_%xJQo#yHtXl8@M$2t#W|FZ+cgoBFg1rLWL^GOf&_#QssM9Lk zFk6=^14_y}EppbpDy|Yk`%ZP*;w&K*k3A%S#Xw>~B6j>ZmNAG|BNW1@Yjpw-fsU({ zl*pC4k_-VacQ+t=p-iVdjmu!3OVj6w@q|Snk)VY`_rFZ1p_+8t@ex~X?4_wT(_@LE z6&v(gqAN_(_@gKjQ!_9G4yd{;N|*oi*L30pu-MWQ~Teza$pJR6N~{zE<@f0Sn6bqS}+rVrKT~uInW3ObFJ}g zG?^908aK9VB27kKDE6cei8Z+nn<*qr?$pME3dCSHh{Ple=)^|q9&7S!g@GSzhuju! zRaoQ32)qUiotdd3D07Pe2v!Kv_yWw2uq3AKYEY1gaKos~N<5DZLsCGTjE`bTrWmlt zb)R%s%EsE%hamaD@uOs`PP16NBf_|A3wG=O;}T)fH~HUP<a10IXD_*Uc5Rw? z{we}BdSjFnxZ~{q#n;~Yt2cb&6(dVQ6$UED{t$=rT%+WKSM#@m5`F@YT_~iv%T8dJ z5s!nDr(;x3;W1)m4x4?5lq3dnBg<-&!nZI&6IsX;>_(f(pBCz3M4JqGWu>Xm5=H49 zCMFbl8C95sZ2y)Jr^pF`*lL=#-8)V>upNzkog9q+Xr3i60#~>*BDJPLQKBw|{)9Fo zHfCbdJlC*|IiGB$+PdYv_0j+Jfzk&aI8eNBOv&?0b^Nv~wCz5)9Ugo-_>fBp>C|F- zMfsoWCch6Kd>iA2_y3+h!~CwLx>nTiUNoZo@cXF!`g-)!Pd#|(&%Zo;(mlo|r>{Rb zc#x4GySeCCwzgsK&9|23*>TjcLu#XUu3L+$J4f!1UO&%`>~rimI@XAoDOMZIvvFl~ zbzrwrZCq^6ZIQBhXPPU| zD5!JFrTZ51GXsyG(?|HxW~4XVIdSJR zM}B6&57Tn9&v5gG?C!0%M0XCn2lc~Ue*A3xa$9LfclS0<(4h6rw_RMD_*stW!a;33 zeuSTF^KGa7>J4Y2?fLA|9{Y=C7mhUc3e_8`pYiR@rDwAHo@r!j7u1fgn4gWd@6P5J zNo+iR*QX!1Z8I^DAlz%LXBQYP9BbV$b2qSW;0-dy_8K!68r{`s)yyt4<1xE$zz^Qr z4&dh%+iy0*Ixn*oYwvUMZeMfec7aocXLd zE4`x)6=I_=fTpC-NEl1-P9iT!SkkZ?Chsi!trCL9kR|S&fOBfZ@WGgK=ja>nVfXKJ zPq1#G9PQF*K)Ia&=5C8c7(hrXACe7HE2tLrQ>-4mRR6y}z zg^ba2jFqi(t|)^;yp>QdRaT#J3tk{ePB#WQxPS{0CMm>FuyQBH6K*r`VNHl$B;&xY z^5iAbgTFL}vWhhX3UDuR^Rh9;LNpDggCvC4cn_qb{Q1<-pTs4#Z!3xD+l7ntFm1_>vxp{R- zz*6o^ftfr=49k9dErzC&V(7Cp81MkFNXHo8>9by^TW8rg`@yw4JB&HMlpo71up3&^U9nLz|1mU2rAiRfY5~TmUbbEs8u6mQI=*s(!cOYR5+ET z`D}5JD1t|t$%)&D7LMV6X;yCmVjy(odN#ql8eTW_mlDxadTfJOL*)1a zr=z5ZU@|L}`GXK14{%oCAe?X!mr^n4mPdqwPmNclHVQ7$n@_9+Ms#n?P{&1z`@bGNyoj+l(GpP%An1-39MqE8mvUEW9Iy}>tk7MxiI zULh8S%ypQp30Yt$U8)#TqZQ4TK*fX*6C(E_Gi^5N(46q0>%>Prznq25-DbkOPGgD1 zPrQHl(9so$a@JcVGT`23Sfj)|jUFYl!k>AP#4MBfqV*^=Yn`4=N@#90g$16_FBjQ+ z<;k>2)CwvR>S{x@&>wi;$79^EG$k6;azg}y4TG5MN^|MPLD8xE%tC5>?<=1Ab@u}s zL!TgtOVwi3t2GkdatB{CpD@o$zwSj!LpK-FkA+f z=G6lvdj;+jRw6ur+{}c<`V5>vE)&%V`6d1)yCugzcKkf2$-*$x_AP}eiec_2ZV5YL zq49{Kj4{pV9J4&|>xV_-?2D=rFc`geWY~6G|IgPda&8~7!*pZ#EaLu zSj$nDTp+`mNnmHKh!uJ-aEYoaYi_WXAmp)u!NdtpnWg4yPO=h~>^jUfKegjGF=`BS zN)4h2o_zMLzxDFZzV?uc-~ttsjWM%z++s*Vz|kS9AFz~xR>_#rFRa;(qKF{8x-BBY zegQb(v>ih9>yU$J6&0=s2{6FohD?JS(*!Fvd@+8np0qC+-hy<7baWJteH)hpB45Gw zv8)f(_|g2H36udeR&#J0`o~c)`8Hc)0BwWXi zuOa?2Zwuxo#QaE&B|^D})FU}rf~mczOKwOIQb$ABGZN**=Y=$VVPWOr{`hB^LY-eV zct-3^@g^=%3Wd^GFE;$5ztN!Sl7V1rpf8_o(x?#)NkDrzI(z`gxVEJfM1-ApVIl0Y zp%~ug1(Bys99QoZu?5%~OW=H8vAke@t62-A2_2^ag$nGIqt33Yp(^QvYOA%s#um9y zWKjj(1Fj>)3of744k&EIGo{D6QA;|nz1U_aaUJ%X(+lbr2GvebRF7juqn!i*)ySWz ziH{azzEG$AU;W0zk9^0&zj9-qk8}D6o#d93@RHLzzF(gTz;Eo_0GfmE1p}CXuSifYW$>|_ruZd;81Bgj%w8wO58G>4} z4su}o^ph+;VXG={aVIc_CB=mA8BobKr-F$Zyps*S6@KGTVpv_s9hg3vHfDo!balqc zK;Q}OpBWomJUPAqUM-ZF0!q}fxm`b=a@sfHZ}(^=IJ8#?UsHdL4-pt;bA8r{_2OHK z$2|J<@zDL??f!IU4UR!e(8!q^yGP6g3C{I*LrMqb__LHhQ;>eNRe4 zmUSdQ~*^ zM85wTrr)LOV_>>o1HRK0(y>9t3YphL&L`hY3GX?^QY40alC)X!jxD0mU-psZQg3WgJ5==#SJ7a^0jiD@JqULG6Zik?fn z0Ts1#tftUI!%OUhOUFAUHTJ<(otXw*ktcjA-uIrs7OKZf^_|>3f>2H0_r>D7m&cTvV{?9aRW*g7#(U{v##{AZSiPC0(r@oNdG zm5yIH0gu1y#XDdA?teNuP6k*^{dkLvqYjA*Mc!aK)!d7{Sp5fq{9Xp^@Ko(KOVa8fU{5`b$MM|?m$4XIB`#A z$6R*qu~1Mc$eq{V>reg37vE9*;^Bi3LE@Pb`W`sgJMMt6I*jXQ#g_HtAXBhQEm{l` zsOv$TU?sJPL{){7Ie_JXhtE##a3v|8ZUh~Uu!=|sfWo_yAd1uY3ffQ~XNge|I;yIL z+Jl>Xhy?Gz5(TD)(N{@CZoHb}mybCOKcp34an>>=X@TjOwkT$hC506wWKS2M5F$m7 zIP_?7y~J7rC}v%~g<_a6ZE~%^^ns*6s&pq#m}iZ#kX(Z0=~a-FjD5p=+#BmUeFF#q z;9BEF#uSSTJ7YU1I-jh6=c6vLoSE7N*?+Vsx^R$E!Mpjt`uZ<_c>nQ%t&M&~5`7Ur z?EArZh4v?XdcV(_W}QkG#LRi@-=UOmYO?qIF%lSuO33AaUu5hheWt++AJhMseyhpd zJRwd<#3kz8Av?w!1F=T&Cy0We%aztgu>;qySLdC17cgQNHr;5Vi%W)wF=WLzWTNy~ zoNo{nAmYq>B(a~kn4>xhQWatTE+VLoThJV@llvc4ZAXG~j7B4hZcN&m{ z?ZSeDxFE~U{FEw7$0-+SH!ueAW2z5xdT(V4r&URTHF_mvC+1_T8J~)ax1kweOt6hg zfzs4no3$BcXRh)^r4&SZ#<|o9XeYsd1`>1i6$rN<3neb+DM4V-etVT8EbL^rp2(3-##OEloFYkC|h@ zU$3GVJ)9}KOo=m`$LIwc$4r3ab3v)vEr3qV^zyt}gtdlsVYP{Gs5-1Sk)eh7uZ>$U zP1d!a2qfQUSdWud;))Y8Ly2l?_e@j`G6_7S9c2_PnAE;FNNjf-b5^-yoLh>G#W1l3k#BT9TwVmFN!KO^xlqrLqcLC-0Y?bZ z1RZFAnCdysEtVmticQwVa!RoG!%AYaC-m%^>68X1$_0%Kp{?YHe`Jd3d z{3>IQ0Ka|*E0C1?s5q!;g4izxw9mU5aV)Rf$9FiI_ zr_8DAx#w*8JYrG@sZ^O-g#apur`0YvCzN9t!iNMi7AvR4D2O1X1QPMyil~KA2AEcs zbP?+zPn(jGqo)e!SMs%@{hAi1vV3EB4TO&`g z8J?f6E4}lJJH3izdbhwbV&=uw$kDnhjg zxJ7!I$J#Z)KnE&^v<2n!cvZ?)8il*0ND$LRSw{(AyM%xfkfL+NJuo&1NM+WNG1+j# zirpgH%Y}sPXrJFI+LV*OYv33h;KYsZlONrmjsWpHR7mR z2g0dATnuh}(@95N^i^cC8YnxJL=SQUVB2kx_cGp63C)l0-~3C@-!uNM?;YldZlfIj zi(K^7t)#hJ3(`(=06r_+lj1SqNhk?5qRaH?Db6j;FzRu6-Y)ijO39liI+kulK6OLG%H53Fp{#e*Del- zK%%-y{c@dtob=>oW_YA5WQhe8IVANt7Fam)OD@F6&Y@|0x+^b^+|mRnZfH+VgB`bV zbA1|_;Dorj&HX+rXnX&-pL_nfgOFxtXP$Xpe$Vgy#UR{8Q_f0Z$492dqiH}3Yv|cw z@-#LJ@C47LgY45f_?^+S7K{y2F48I(Jv%r9UzdtCBs7=}=%NEt-vHw&={D0AG6WV* zG7ur-l)Iz}T2-5KWh>yUDSOy#Q6eC`UefU@+8?yI`{X`?qk)A`I=q`h%@b*-XnLxJ z1Yw(!lTexg(B@kEW_iFy*BSvssf73A;?EDfy>R6f`DPB*d~1ej&oEOo>HsLsEY;#p z;(IRmG$>VDH3rL}z?Wo(8AEL|)5q+3L#_pyd4BmcvUmnb%GR<{%C;6;grY!V$n7X^ zV)~f18X{C&c4i13)j)xu2RRw+k_4b2gWLcNga&XyC_!4`&StP2M@?LpFK1y>(EVDo zaGhu^cu?t(M8aR(H=YVLl=IIe$f={U28JSNTDIq(GUWpb3ZZUVksHBDF5LRH@7!_I z9eZw=OoZ&#Ejll;iwsn%_Z5pf#X!Q6fU8IXudpfUGwObytU5fvN1fmm;ExXw%H=>* z!WVM$pj%Kru_Tx5kljUluX9%oB4tmY9?}Xga3o@6Qfd%_q3AW0vkxoEHE1@CDs53h z>KJN^8P+jRTpj9=s8J3CY6S#INJ#*g8YVZGdM#RHfHdYql1sUj&~3{pZ6R4*Lbk@I z(9g#(FR6q%=qeT$)_WF|47h^_m5EhDwVY7~M8F@}fPu0SfO#lb8fFt7tYJx8`0>o= zPW-zEhpy|H!eBh%kK82XJ=BZ7lL(Xe=mnACRpqrtH4L=XX3C#uWdf(WHoxq!#T9|z z*D#9&D3+2J%JB_&l6jCrka7F+2$%XmfvBA`P5hP4ZaIh+pI9V$MJic&hdhxN<2ooN z{_QnqH^!X=Drg=a5N@uH=9#24Vz9Dc4Ah_<;w`T-Ps}^a$E4&4l_B{t)D&DbIdQ5h z_}#sTHziys?TaJPB*3)Fb7xt5r0$BPCLf^MF9#$}86ffS%45-!f0q1jALYv8QKa2} z8KJAuZ`-$;RY%v@vce}bp@WpEDXllxhTe>T@7JDOw0^*+!pcbG3wO$O)C(wlIC1=7&Xtkl>wfsYJ08EjVMEKk=(4zWO6yT^N^~`}JxV?BiSBJ0t_3!Y z|1{$)qXi+iMSYUXK!}q(Wi9d+a;ROl1U2YuZJ1K_ScERd0xRlf>v$Y+m79`X;3uev z6snG-r>-1-3vvho@e&$wk{h_HY_s{rPC=vTf%%5m-8?G8czGKw@zJ>yEpg%bni&BC zj(j&t)vAL+UYeXv*<7!&RWwt32BA)3Yr3Cs=A?#&XQG;xW7(Z z0=-Q4t8xM$U(IYTm#)-cK21O%jmeL4kvYOTUt)eb3qoVCLyMTrmt@qF@Yxi=6(dxH zU`K}OAlt!;peSPp3MV0N59zaPiblfPrb^-41X9w1+Qk;B!rY*+xU5Kx@A8rkyBbo0 zGdM$G{Uro}hSd#@7ZZj{=bCz*q+xMWJ1iEO$ROq|@-s9~b<}3HP^?OI4UC-tOxKz50(}jQ$rm*G6PSxreg_=MhVv1>m(?u8>&}4(-$i~34^ei?3{hHdYHe@`a zefieGxLE~+YaNxJ<(HufjFx?vSX*8Q94#C+8AhPkQM1Ha%6ilGa4@Meiwl?Tzr%mu zx(`4%YsZR8)i17)NzRJPDDeNCaew*bxe&oLL)jLUAkya2(3Q8IG*T&2q`08@qL?<`?bdgUoHovu+}z| z2S7$ziQL0|iOJb1Frw^~Y*X(8E} zrAJJ)gpuQT-oCBXO5;jnIO2F_8nRNVe1K?W;XGn$_~^&O=DD~ss~no`!1`gL1i$TW zyURY;=8l*Y_^-!^CeTY<+;a{Y2w=Un}(toxy(*rK!lV+%5Cz znR7We+tXLP=tpV)(wrEI2mL2VgD9Mv!X=%UK>c7__hb($s-j2)gtD}V*UpR&39Hiz z)lt!D2SIk*Kxv8$(7}dsb}~md*2YzPSB$$%UI^tc)!#}ODg0H$W9!YbE^fCjdx_<0 z6Pt=;x#fbRy4kHU(f&)CS_vAN$(kwm^jhLa&&BTHkCw9*=~N)K>B$YEFq0iD4#v~g z;H!@RLXVeK*X+qX;`PsE#G1I5f`9AGIv+oU_KCUtdULh`uZu6c#m*gJbhz)-s8DC0 zd?h-();0&9n(Qfl!A})W2k(6DA0PaaaC7Nloot$eX=nb4 zfoN=4lm(r(L|5y;`E;UO8mJ7c&XhY!N3C5Ks@p7Rkg|PF-5z_IzD+N5*+F|H>n{+& zT5V1B&TMRqynI|m6KIgr`ym5y>RVyL%#I8U#p_!pGmX`vs4pH`A^K1trM*HV2698k z&IxaSqHiMaNirlhC);|zoGu;OI7t09BBcD@Y$e%I33E-7O{R^MDaV(LVDH^|=@e zF@9de7mwo&7nGI~k2f(CotqO!(!uQ(Sy5!tUeV@xS{s4y;=CJG1LD#Pu|q6*IdJ^P z%mdosx2C;QmPVH4U+MD2!7)dBwXVr>DCN?Uymu*<;B&of)yHENKbLGk^?fc^XQbH* zl}}6>G9>_P^ee*;83?;wmVbMP2(0u#<yZ`0l*`@zwuGrS&37bHj(?N70TH4u8 z@h^3?_v9Tv{ZA(rJ`Po@9S@#)!TZTG-p*&Q4tJc?uYAqh-hOr1I+?$6!rRU@>!kh@ z&ThMUpLNoIhqGtCaovy(aJ<|Rhx4rXH|ITMN_MgnZd*p%b&%Dro>ArW5m|MU0 z+{82dz30SpuY4`Pv+a?QZ?>O)_UdcqJuOdNdDh?A^4^Gf{UpEksrPDE^2Sr&eD3PV z@$E-8K6~TW)6e~Mwx7QbKl9VCdB1()BgTJh z|300aSy%taGgnUZugiVrzK6edWt@}u`Zs*{+3mAG9iBOZ zKYdU8_Wf7;#aHjX=eB$HpY*S_kL-Nzkt6T*i<86e9%;YlYbSfJwWoJJ^T=!OwTrK2 zI2rj&`_*UDJ3Hmci?i>(cKn_bU-iCl-_DlLjQrlSS7#Z~XY!mp~rAMZ&(e=Bp zGV%LQ=C8HqcD7x)XrH|Mnk~=rvnTKV1!vE^apJx9@yGAG`da%(j-MQUc=p|qXFn33 z9NzHk&J#b{{MfUb`TJfzI(grV&%HD9?Diwqp7l?*zmtEicJ?@D&pdeK+H?Ms@@ySv zy-z+X&+4x|)BFAQckkxxy=S~9pM7`uYacnrXped8M&2u&_e{inkx z9?yUJ#FZDllOyj1N93q}+W*qy`p+d`UF|>e_=;;Uc?>K6b3593+s7Eqr|ox+?7ndF zZu!^zn``Z_jRRM!$62W2$j;6yBMji(Vt!}md-Ck1;yWY9cW!>~*^zzMfFw@xa*=*i zzj(6w`Uzj$ee7iaOT~Bd$F`5WH=F;10!vc=&DnPkdMt@N8NctrkssCnAt(KE7}0my z-vz)p8{f`Zz*%tQ&i{MR?HzvhqKF;I%vZ zKK%3kBPWNqOmX4vpWErJZQG-354`sIOzouowZ~U&xOiv8FlODJm-P4AN1nT{=Ux5S z$@^Y9usOdy&0zj$@k0N*&t z^HmSlUmG6(!hL_fYTXDYj~{qRTpb=iIdb~>#gqJ}d#}9p{Q5oD_kYWqzW2g@Kffy4 zwrbx{V2b`Z{SSiH>;o&dWe!YbJ6*BWe8{%mh^&d1B5`;w*lNc69*Jk%+;MMQ?B2ht ze`V2II~(LO>7&aJ=gj-Y`ZuQIm0nZvE_1_yyrqx#K9bIEGAehOw?->%vvivGjq85H z_pH%qS1j(dR&5;5bQb%Etpom}8Mj-{>|gtX=(siTPGq0T%<5Z><=+d2Gq>2=%!dN8 zd)#Z^Q1RM|=dJ9+!NrXA+NR@i)c-(qdH7Itmth>pZ_>xbXympI1$P-M?9*l?y3I1y z1bXjKV6E^snS6Ze;b$XzJ2(>+Pkd-7lZS|+E#PH*3Daj z-R+wqyYrA7_vgJYrdR1RwQ)CpAnJc4HVRg$5ZtbRDKPJ|8Tf%0jYCoI;pG#^GjChFqc!$Srtz9@S*ruLbAQEJ5zJ&tU-!)o;~P7p{twR_=zTL?d{{Tn2c{f* zcJH@)sk|D_B=KN@}B*N1aY9Uh;VSy8N}8{X1~GtUlf zdZG|Cr{BobhCUPAmT5fgW!?z%SH{P+720i?{a^PsX20lXJIDLgKj`-lMvFslcV{#gOF*?S6%eRzM}mx?p1;)mj61(%_3IP5`d z#=>7ec^wROJC!?QIDs$Rm0n4$rylS?+>;(TCSh`El8?T>mhWE%$Qz$n#m>6 zeWRb3*_v>x8`70~{j};jnjj@tLh17pgS=FBBdrID-lmc48NWVUt#oBb=Oy^j$Kwg5 zfYcRG-5q6}fx@^&yVoaqrBDip3GyQ?x}?0VY2t=Il@wh#E9>bN3TNkO^F(W{Ue>YPg!s9f4Tv`23V4q1bqv#d!E>d}n# z`9oqVS9D9&4sx4QEiygT=NIC06Iy2nI(Y<-rcF=ixvYP$5POS}Op7ocjaPz(3ZCr< z9@w8NHW~HYqdgrLdvZr}*8RQ=x3&tMGGhH=kGR;QZPN$$oC9E4(o&3P?2>!Dhb*l% z=(b2?w0p2Gwd6nPsb#Q?qD&g*rINw#BbfN!x}7n)5>)%RJRBu{-<``__5Pe^Sp$bm zUkp5K`gv9%U-pqF7a_wqWhB0wXlGxMTC*j&P7v3vuJP30*)(W8WW?S9?`Aod?Q^j` z?O8IxZy_pv!I~At{qfON)@J{2dMfSpRkL2aH51Rb7jK;?e(c&mJ^jmn|Go!@r5cT+ z95r}pcW5f#H2>PlWPU)(#=^?{U zpK;sCom?;60X)%hV|md?q^qbm=j(+pVEYec5Ez#O`nu3_^J#poc6m^noHnEjL8LJO z`*}A@g0WGgzFa?wk}+Jf++-pBL|#nldWn#0A8yyza-tegV-&|Uon+T@g-%`Y)1;R! z0t$&ColV)YOt9*ME_DU&_4|UMiJ+S8>{3M4_Yb7?}`o9whmV}8-y_nP}M0|`id z;TI-C2?&t{1ew%qJ`iXYS@tPPjZgK6+kM17;9wiE01^&bioij>hj$O6rwo$#sM)C{ z_1Zn&bmk!|c+5(Y$87hx9`z;vQji$YO1Yy*dn^;4e?S6YGBlZ+bZdZsBx+c`HIU1= zDlRW+FYgVI7}B?z@*P#ze6o{NGSMN@iFh(OVN*?N&fG5 zE&_qlc+}uW&$*aXM*%|pA)^{KRQ8t-ii-+)!DPmPHQvk7>I`s@fAQiJnjSw`<3(2u zy;0N6s(X=bM>es7Uoe9PP`N}0^P~rHgF_MwQWYo#S}!*k!X2;i^;o^t12BfrH%Lf` z{J<@axCO96oOa!tS*}PB!CX30U#iEm>7q!q`R8MD4}fq2HyFXsF>;FOxwKK5qHs-y zH9ZqF<@L1Q=MBX=f|8SL%7YXRpu7>#u*JLNqxDSrWY`2`kQuMz1?~Onx!Cof-2g_RHEm>pMHF@@o-Etr( z&fD4km*f7P<2Bq+C86r<<09@a7US8BwP9vUr9J4#M4*P?z+=0MV-uhI;m_KBF!_V) zFp;W^V*^7!9g?uWQ!!Bl!Gd|LPryrbrYzUrK3iHxVV5f%MYYs zb{i%{u22oN7Fqe2FAZ?DpK=pWd^Dpvj+nW|$PMPxZNe``LQlX=5Fk~=LMM|XjI%N_ zOF1cw22CZ~0pf08*AgtJy3{xl*w9b}o*UQL-jil2mu#s9vYN%c{Ac&cZJVCXV9_X` zrYp-PRcbVlfDTe!QvHzI+{vLq(m!CCFtAcu(CiHM1ix*GGnKI*Wo}U%%b?k&0jmKH zC4sw6Dt?1x0DSDy2k~X}ZZ;s=Epu_dik~u7iGo->Agr*+?OvvWLt;^xDSD#y+W$EA zoeRJA8{fFTNN`YY0@Hajo!S8Zlt|~{5PT)urR(WNf*mU3WYU?}^CY_ElHE9yNx@sC zt2#_d!Pm=fL&DJ`?qDUx-Du9m4uW?xmW=-`EY| z?hI5!RFu2yL4c=OFm$V47R4)20au8hmdr`1_=1$3uv-?Yz^n>`nMv4I8c$MLRx4`- zp?g3>)g<7tY=?a9GxUW;$;wsh(yis9=-+41y%_?qg5*F&uG>s)-IBAt$*|~UD1ZTc zI0ur>e0-br_-~H<`-Pot*H>*#_CvKkrE%N3yY#Nx z`+xZI?_U`BZhH3p2Xme2+)ll9M{rAHuJrocu}9zk#PApW`QL0kIIv~N|I}~I9eKOr zz8$iA3@M*J2rMpc3bPg9iye6 z>Dey#FB(@Ky>rvVJLY4#!-ny};Fj#(3-h@*#1Ep;c>GfIi(L2ex8fnI{?+C3yU~N$ zPiF2KTNk|^UyLfRu6}f7wtZN?-QBi)P4Vv!RXPf}XCJ+_(*9`rQs$cb=*pvg-v3yU zfAPci(6?7zw2p7;?CxF@UC8{g`$#nV==jBzdF!+DrJ--HxYT-FU*|owXHDfVGk@)V zH~M4uujcd1bAR)tx8w6?_e7txgRbuWzmNVhGxOLJ&p&!_U_At2ixO`tIW!kePbF@Q+;le-{@C6 z$Rs89lC&B=w3cKI`$@fM9FN7zASRJk8izz9$as!4pv%>jo&aqNDKJ!tUOw-}SfEFQ zOEI{Px-lGw;XCVua|jj_?!&8$kw_avNb(1Y4rWW$Amzd^B9_32mR|EJ@SgC5Dff`u zSg{-7D09V;Int-XpdQtyNR10_JMYES4svhi-OxRnADj@Mlv%lGcxuBrIMRF11g_YN zj6~clSZ^Qwu8Ah~WCevGbwPDgCJbq?0fsas)!2w8Ek((N^ib7_iq0h1lp%$KF$qxH zyth2}G0Pu|7pwq|RA!dzv<7p6WR`t(M4piOTh=gv9Uq`KqUm4x5Rh4uKjT{s-eK}m zgfVsWAYF9>{$ZxBmS0R3K!JKScpJf>N4?T;EcpzH6i7DL0_(-pT#Fy=GU~Q zdgl5*>^1qzU`eaHJO|bcE?>_LNNKfr!X#WyBP9~)zCHLPPK)LUt6jsgz_vQ+) zLKFdjA+5ni0Zs-}ij-B{;uQHcJUG!U+WoMj;*bo~TohM;joYa)gIq~$s)UWnwU|1@ zR!`jHiFU0EAXqGAGub%U2f^)2bdGV8N&03Iz2^LDRv_-JlcKAj!c;Bw*?lhXVRiU% zuZH7P3sIJ#wt5&A;(CrU$gZTr?TL2x66C$5_<{#xeQFfY=y}ZW3Px$JpC26l5nV5P z-dBdG<1`#0w)7VPjAx>w_Dq|bnKRSRdlD+{YOevtZu`lv|NPZ=7Jm1=>wu9u6DcC! z7$+RGDpGf(6n<^%Ad7}v79(`6^M-c^=$ZDfV$_iLXnak3L ze+nWv6Ie%Vf@qfTjNk!TN(sJ}m@OXX-nhz_aI^B;IKhU8H$@LY<8dMtYp@nFuULw3 z7&uj0le{gxgYkrYoHBNSz?xAP5!I+Eh9-w#RHJ_Q8Fe4bD&9|4eLQP92Tprx z>osr3nlGupymB3lE16VPG{WC4Y63PHay_uc3LlQN3$597X3+2z%f}T3_u!OUC-re~ z*627KZIDGM$q1+AxaZa}Uzk|oZQ=0I>`DC{IwiaVMpR!ajLJ5?<%mm>uc6W7lT_(R zrtXGLPmz+j){u+Ha$!m}p492NiAkJfZhVN)C$?!bG+K(!(7i^D9B)h;aY{uT6<7#2 zBt{I-U|%)(1rIHNkMCF@=iWsX=m8gMh>J-8ge)rd&@HACC(!M&#%TFinPUp?p7uym zjVEb}_yd1>SYhL6Qn809H0{+2UC(gWdiD&{!OAF?h3ZdR)7~H~radG5r9u@AAcCE6 z;y<&e(e0fw>I|IvoC60`vuNMn|Ky+4eXjdP0LPta|K-Y5X>RJ^mV^1$s@~ODSmPZ+ zUUyHooG0qD*jJtE@qGWy;nu_H1>@1uFN}=2()1^O;0>rd)QP(Esbl78BeC3T8l6|( zoXA(oI!Xaj;jT3Ii25Dl{x-Y*6-3>h7h0EW5Wf+-X)z*aY@4mWzaYBo1;Y}{-E8hH z*K~tdvyB(x-C(`!9scnRTh#kA_DW0Nwo1P%(_681yI60DxuE_;b;M6J&Nt{|tPfOzoko^V5hFU zXM=KZZcay#_ixJ>w`CUE@-2@V{@n1ML+FDp9ylMM7`!+ay<_+hTA}3^W)BUO`*)%8 znfA=p<|%vM%y8@R%tP_4*OI(d1mCtV`|6szcH3Rvg5lY>2L~=37v6EZ$?iC|(P~(- z8g0U`1t`@YcyFM+1AWjzyW@0+db@w_%pt2@TzI`Y+xwN7=i|3Ne?hzzU->_Ny7O$^ zpT7V4E)P%Z>hkDbG4N%p(2BkXsNe^MWkW^iX9Hq8eU!1M46yuM5s0z|f;+1%PF({V zJ1yGXU#${7;V)~a)&TJ3kYh9QOCB=ZlD3}iwWro1S)-NDC0mhD)K>g|K-vxvq<7l< zWN)|lIS1Yz1%9SFa*-D;9Z(za6p8Zg)HZ@=%42#PmpUz>MHiYvYqs9p#lrely{G!d z4UHi=@-Mg)lR7%&s59Uud$P@1ZAzLf>HS0AvXN@=0YDaiF z9e39s%|$n5^NWl-8o{IWlj%|rkki4JX+~h(OHh1%{5$=AKj+u2^w1n9g(E>>S+%U= zFq0L_J)gAmd4bk<Ie)+V*TOvnzbkd`UXtQQBf&hH0inRFqq!3e)TGgE{a#e7(BY(* z9Af?`x}6)E&}+4LY#9iIN7>*^xu3vXBj_%$)^O)TQY9FRiX|1x15s5ki8BFy{Dd69 z7qmr3$O|hjdj3)0!h?zE*CS@Z2nM9t;9gwEgscQ8mmm6ZswMH8Xb4$;)PwQTKd~ln zI|sL=ZG~Ge)GP-r8bvv|(tw7rOb}vi`I(6|p0?7noWpL`@X1q5vGbaO5a3SFG}O%y z`i=V2YWJjy(821!pxjFBOi-xeb=ZcZRc5opUK*4Yf%ieKpQw;{(!$WorFZ`$m z19ow(O47FotA#h)TLdcL&EJ~1@}2g_jhlY_vARVVNaa_qp5J&&Hh0mw7PpUW?wc%4Rk#Nqzq>G2&VFZpO3`7Ilwc4KHB z#Y6uaak{Xlt$Wn0j_+8x-1Z7*b1&?(-Xsat-otT2>l@L~e9Ny#-RAh++&#T^@@uo^cZ)33<-FGTbyJI;mE?#Dp` zn;(vjnJa=F^6k5$L8~)by~n&I>vy^ z#D4sAX57EH;*T+EuVMn2m(QmQAM332V`Cl)K3iEGw97HnreMk5zsekS&3`Yu!1d#q zGdrvg1}Hr;e>a?2J!bPN{r%AcU(K9h5}udW_pW#$dRi_(-fB4Q@&$vgec_(kH)Fj& zTliSx>CxkvYVN}F=L0k2=f1J;X^TI9g+`&3#s40cnS#45MqDz6TG2sRyQ1-n%k9}c z+3_9L7W>T!W9VaC-qZia%R|BDB@cXcCc&dL~XA8mQ+6LJa03}*VNjpL0MfBpHl zey2OL2h9Snsf~a2p7!Oz#f{Iu#rnThT+RLQJ72l*xhH?+$vdv2CuNm7zOR69(l}nu30=%Mbz+yNOlPE2;KG9uBZLIt!_)hYjHiO9Hz>9X+qWx*Yn8+Z z7E!6Gfyv5^fz%3R5_~BO3b=V0vxTA=)>M<(e+w{#FuAb8$w|UV8n_QnU62d$)+j%T z{w@d76bIs8i(b#fRMF$38JOyICpJQ&J5WhyUePnLR5$@gPirX}>f@avPt zpqHvcnJlDi0_SO@@KklDhie*8DItJ7Cx_&nGO)Q>YV||!FliZOm~&YNQDkSNiTP%O zdywpLNh44t=}VKhm7X59>Q%#@NyT1rz&&nFrtwSVYipN)H|4pqXDc(aN-ITuzW=kI zf6QKZpcY;Mk~mc#cc+i)kcrV@smhTIgUkg|Etj0C<$%tXz?c>cmZUUuHn`K@=Krei z__Gi@;4$K9)YOrmwG|joVmt5+{QTx`a)lku7Jb__}2t-;ZLbpaJ z8hUFsAfi@d66)s;jj(jNLDd_7z0>xt3c$#qOcCp=SmqBPTd%3OpxfI6mScM#FKm>4XTma3L4g8gqR3I8r?1q9u64?|GxQ z=kSoVI%C)0+|*xgpY1&`OY5m6Tg0$ocZffeSFV{h1mle#{_K@MS-3E^NGz07X|*Rh zugCY+RDE@*`c`L*qi*uM@9H66j(;LnBSY^!!U+JGm)!FThnUv)^}-h~DW z2GZRzPF8kVeqnlJ*u#RMD0#zO?1Z9e1|B{d_q$?I7qu~sjyhL$cAOqt@q0PJG z3BBi%uZ;+D&-KOmxF&K)Hlm@fDPJb;Rf0wnz7IG#Z1n~OJmX+ohOY!Ta*2ZyG%m+= z(i(}GQP!0%%d*2w)XxiR9tmsVB!P@wX!X1cMz2oo;_Es-*oX%I=+NNt!Q*ftbAZMq zZU`Enr*#JC_!hhlYmJ{+(+eXhc}WQv2j=WWz?ieF2LA;^GLpl`W}lBAm_f;R+Jukz zpa)=FFeGfC`pV3Lt|j8xl6EwvT@V*aE|3RyzNKET&C($}~)9 z!4=M{Sy2Ox8m_qA8YIfytz>iy{!ps;KotV%5D2=d93WZD0v9)MMI>GppHMxR3rI>Z9aNmE}_|LDFPIoK0h@X22L3&z=HK)kVdk&$D8yo$9PR8 zp$n5ugMILs+ezecU9kuHaJ20)j3p{KAf!#bEwdiKZMGjc0GQC{us-KO7XTdBzT%1? zEwRNw4eTb3dIAqTKtejDsQj!!=JWuE+#^O@Lls`p3+6UiU7IYB8NgsS_0P_L7LK+T z+ay~lF$H3Ugb)c0yX`yf{6*Bd@YVEnOp*H4RWTmsjdN+!(QRsYr4!kQta;&7#(csy zE_=qX(H#4@qfZ1rk)vX0IupBjXDC9)geD8^-cXba>fJe__0YE0iVBeZA0zcmyW(a- zh`jwlLWmWz!tjT^RHD}(GVl)b5}~Pu@qmAm-bg6|iTeG}L#yjfE*B(Mg2wBHfvV4+ z8gjHR`=|**NP`yecocN#8F-M4uvhE0lRk*3TVB<8;(&Mod~gY%BE_tOM#y>8QCYzT=O6`Np?T zjor}xDfr_lj;0U^hF)*+;0kKJ+5rbt`zwQ;;9ZoOnHA1~iw0a155gHKix&ud;>4Gs zeFkR^dW!^M*u4Ux9%#^bEGyiwi`IMTr~x61$gFfC99jV~A1QwHcQHuP_Q^WF6yhV!py zJXLFV@o5>hESHTt==G9lu=Z>fZ5X?-E-)(p4j_sY7LypX7Bot-taBAVe4Pt>fgIo?0t)x1Jop#|4`%9!+O(@ z%+;Tp+Dp*^N(?ksyY;3=^(|YEZsj^P28ODQXS!P|-TIbSa$9;YZOvWUUMo;AQ0b;x z-O!f1vs-!#TeF`M=ijW`{)Su0$`-ct9{OnTsW;=Hk5h6%7EWlaKGyhVaqFRv@>QXi zK~Q1g_2Nb8e)=u9=`l(Uu6-rD*U!FEID0-ilf^;BYuI{WU+>|M%X`xkmBvD;(%FIF3avsjlu|Dw@*=~ip#*1^9o4L=<`J{Mgb>po??Z}pXPw`!mD z2EW}~`1ZN^eb?*{adA!NeN)+h!U--CizvzCk(%tqt zs`RzJ-&pJa?MHJLf4iD}GyCS{cu80HCk}md{7WCTeqG({UwW(V@i(G3v5v}WjD>0TCIX09QCF*HtKFVF)H>>xW&3=)#l?NY~pj-y=t{k z^9gU9a`m+Mq{lK5hehPg~8!e?Z+C(F~k8r&nUO9v%N5eHN!i!U0ATCszYq>+Z zb#6#$IqDvWo`gO|Uc-GuR_y_SnKq*4k*rma7JjL^N~b&}UYN3$feV)ImP$2rajzhI z`k-6{=LT(buvJDvlEATDZGg@Eq&N66L0z-hQn>(UKS-2ZAs9sOG;P+@g`s&-BTi)TB2Pouh`+}AT0 z*n324@wkVXXirDBXO+4KPS=Q^T`|3k+z|fBjP}fs#C5M2no<_{P!xEv5whx_D_W zK6L|6XF+w>$+G+c+_(6RM1ub>N9_hQ8?`4Ff5|5UFDV}~L7pduSidir>kQU~$<4-s1?KlIcBaZAnH2 z29PVYz8gHreUfM8v;5NLOAcC*oiU*DiN&$fp%8~d)ycxGl3oB~u)I&6)!r*fc6M3T-=W;0 z+j0yxK8N%#$^V3~Y~`NAzx>-@`_m_xh1yYe_r*ynj)j+e@204XV_^cFnV&9>H70$b zv{vw;fYYAI6nlb*q+Ud(Lz8>xB&zs9sqwzoFiEEJ_Vqv=j^y`^We z>FJG1s*-Mw)V_Ul7{k^RZ_XRYmo!pGGZg8WmAT#1O}0|#{vRR!~8zIPqhzJ0jdT~c^(D773yi#z&_5D zN&VVr$d)IQ@q|cZvJDj8)5-&>V{W@TYAb2_wY0P>nrsbC@JNvyRCQu~YnV9b5AK)d z=p_QE@RGL&h9A!9PDUNqh?rguVAxR`3OvFyGOR6(l3@m?0{XAKqS_ePmkg-Zgh_R9 z&9_?P40)&qRA)HuINBGAjONUBtal$W)zs8jiU96Ez50`X{=~w@E!UUk|HnV!zrfi4 z>Pr?O_W$E<=Hq|$SeW>)5B~RGx$}ldNUSn!ydZ~)NNI3#q^?s-35VPTA%C-jRa~r4 zskT$mz{sN9+^;%mO(}WUXYF9KWZcNn<7_a?)+sZ>W;^6&&GnSKUT+3x6NXbwyOhkR zBdrJH2zV(<78ED&+Vv4m>o{p}UB{mn*h0TM;HG<*t7Yu>!Qyz>W~?%gsd&nGRAo~J zCkAmTMkfpb1b4YIR!RDJgzs|_(nl9>gg_xs+?|AV7BT~p)N@(gxc;*rCvz#6sC3j% zrNm=&hRy09a5LKT``lzlqLmCX!2yYT0pf(I2!;jcE!_&$s zuTKsn?r#kRST)Ay1FIuV}fxa?_b6RUeBt;sz~K)4Sa{!mY-GTn>@M6Xz>SiH{{%rJT{ z5qgm(f*>UT1bPGu4|%3ALy%0>k@w8C6yK8K-#|5R$O>RMh)%3PSaBCI;kL}6g$MFY zs7svWe&H_l9Wqa<&axgdh0tVHF&EMAwAt*WH92KT$RmYPg!r>sQRO{A>^=5PL(f(Aje7lq% zpVtU=0)u=Yl$66Fe}igHj(z@1|L0H6y>=r9lN_Bxc|xdC5V*KAl`$?0@;8!KB&!-l z(0Mn6gVmPA88ib3N(z;LNce#TASpV<4HA|B#uRQ)&f&&0cnti=IsRa&r8%OAW}2mZ zx8AxOv)}};K`5A5T-2;)LBfPk4U@7?L(hCMrVR|4v}dDK!n?+A7|xpENjV+*xeRYx%3NS>9@iYz79F01un{6#{QC_aLoY|-R-cs7Ji*GdjciFV z*$E-DL{z|pS_n0a->fYAlNkd``r1HGRj*w!CO@2QUG_Y-9pIRhugPMK1`~x=L>C3p zRR%MP(yV!5V&NbE@J~N>(;eSLAgvu;G6S;$-Z%C7rL9YRrRX;U$<69*rlVP+$r9_J zBrE(qrr&8^_F}wuWZS05OmEC)YFtyZ%Fc3ws8`cSCfsThznvaE)I%(A` zM{AL_Pt5h1W-0s1G)4?YD01Iouuqt!gb1y1D`CK>@OCAKYR7lAEz zVKCW6BzZ&bdm2%!L6cY7By&tb*nvTju#~iAa9+-gQRKxrA82lhX_wOrehC(NA(;wk zANji3&mHQ3oLt-ImQ*qVo5l&rDnygJ*YoNiOF7uJS})1uWdl8$x!!M9b4in!M!8RS z$uJ4ES>=&!tG53z`MJ0LRlZNJPuF&|gbp$h*_16xK-0;wqdXA>IJRbKXj`@vk?x(r z*#X_AJ_=0*X^D*GAS9PE=mj}4s2gB%xIfrWo{9Y zybB^ygiHenqaf{g!qLk3!SNOLHf9B80ZW<&6rd2rQ0Ajd1xZASoVK?V$FYj`MZu7l z=!7SUh9Y(v(MejV4xG|QvqFealRuKY!LRf!AXmPcvH7zoyi6b{D@S#s@&t z5^D%Pc1h-x72%@%%LnF9=9tD{hJDfJw?sjU!a+)-_?iPr9E_Qt#dirg!8C{y42vwU zNzJT$sbV$*RK&)x7X&kB%altJQgOml@P0_J-Iz{p;r8<4Fl*(EB9#V}0XBy@ZPr?n z_=%p_Q2=s`%Ywy^(c`E?n=Y=dEj9wNUuXr8)RcRFuTmJAq3p4U6?9;k<(bD`dqCk7qG5|?eq;bVYXW$2W^z;-o z8xMc6sV~vhQMMX2B5Lb3qocA%E?|jGqjnQ_OC*c1OeGaZbB$co33Te%<55s=*^y=T zxxgzfY4?Y+GW#T*HGP?#X_zY^XM2cZE>Cx5OVPwm@e3|7ZItGu& z&U1sRu2VchY9`=7(vDhorT43?hT17zbrR09=Hz4=CoWhC#bl8>{Wx7N$afJBMr(S9 z)}gs_k;n?oS%2#(YZ1`~v@D+%DYqH~1~{wiDdQm6o2a#b0VuFs$(2?d zk{e@dwp>dIrgu}R0tet^PD8Q^W^8ytz@H87kvKgTvRXK4g}e~Dn^NncUF+K{OHxAJ zXM<#sE&8Ey2GqctM4u39{a!)fLn-3pmLgg~lvxEBQ||cEFV-Gg_{NQ_){^8YyV$ml zo4}nBCkIl2!PPQ=HZ=q(pgqAtre`xmqwzi!I%vaRId)(r~$ zE(5xn+yngJX%)I+iGsf{isNd!kG51FwAC!Riv-IgOJ(p94oCMP9%-j84Yr`^q>}Pu zZ9o6WZRXh7M9a--dt0`zodjN-v9WDdnLQq9^bnUQeu?4wFK!7Ir@Jxsyw`U%bwqpfN~N zS&DR*9@DVGA9W>K9`I~0xv)`ht_Wa$%0eq4oSF1FpEsAYN-F>oMkUcFWFf^eSZDK$~~azyN*wR*&xisKCm~izSQ&}%p5F)RAl&rTs1_P_AAz4>}Wx`73V|dnXJVF zJmNrI9L-T3&sSaQS)he)br}=%25E@-0);gfVMZg3 z6i}HloM0|cYNP>;nFhD#WzBO@^mR}3CSeu#scV_LFZi3-7t<`#tpL8+>~}Nq`{1eI z*>DT;-x>YU=dRuSoe$o~s>oU-h0>g*vqc^x2O*;)awVxazY4QkTB7iC3$U9(lEbsa z8)6Yct!Cy?B>w`1wdk{RbA1vkb+kko;~Gq!ObwZAO9){CWxHG@HG%yPWuFG;lT^mA z&v{2pWD?0g_>S)q9>A`3=m(T3p@fGZxB6guaudm~y1|T*>!(#vKp})h!z)liHXBM3 zWAe09-c7NpFp2bAg_i0TYa{r?mcWsTA<9jIX8?D^Tnt5A7gCld*)0@n8i9($%y7ecc>lPmVrfj8l6#312 zT>b(dElHOlxe47buXR*aR7@r!)N~P&V1kvR11J%gmrPVK#hVgn9eF#m zhAh_xb^{bS7IlzW5HbDmK?|}2zDhn{`LzgDe3_Kg&7e%W46`qviCF@iwQQt*)pC-T z&0Y#P@bVf5Gmi7C&*JiJGLqGAY;hMrYEWv105&>c3WSfYkrze%xYLqS#*Pc|GBZkcM+0B$eSsrNzAR{ohrMYy64ES(kWmgd@ zy^N%Wp&`?y7)~8-Xcd@J*{Ebh*YYxH)P_5^k9vUwB|lhgg1@tJzC+c|u1IEg5e-24 z&(!;1Xg6i43qin2TD{ZDI&XMOWiswX9*!6%2N8%VM;}@5QyI7=Im3&X^*Bxh+X_s< zT6MVxj_OF<-W%59DLOR8ibzLHvw4RAv3z!6=ON@jAfMOHLg1$c+eA z_7#GxwEzO_z_TGu3N{#%;wG9woN5mDJS!CXD?P?k4d0>|s}~vy5*0;j!ll#-Wp_hA zlh|sW0^x%X;QoU?<`r;qElYSw`pNsx0#eMa>M2dv1F zaW?_&iO z85MR2iu@Opb`q?8&}0E-lUX2F{bm-aag`V9%%4d)s?PPqbYe{o_Y}yr}85YI^qOS>Dn2PsrVEv zQTGfaQfe!z2(~XU#hh@6P*Wy~T5~tZ^~NC+^=8o8D9yM&urqiE!jaFAIJl6Obc2Ik zqw}s1QYUNlf${*yHr)O)0#INfn>@BZj2U>bna)7^9aTs?FDJ!?^hh-@4bg4C)^~za zHRlkWt5G-l$v$+oFb%2!I)pO0R=$^8Y?`XIrEJQ#5 z**{#~rpbroVep#7B7t!57?v*p5Wo;jv?CHwF-I75(a}&w@TIRb2epS+XuO|&6ei9l zxR--(jRV4CWdmUWR`tOlQ+87B6s3gfvUXQE8gT+o1{}#{kp!$pLU4LjpaUETO%M-8 zkd}bAE0$owaA4SI%Yun;GB^OK7X7>s`CWzZ@zZL#egc4gCfn*Ir0}w!LZV8eT zSx*|GbaqtPj~N3qNmF9;GF}||8rU!hK8jArpER1|#MBB^=KTidc7u;$-^n`yXgYKk z;Q+fBq&|IRaq#?Jk+CMVjR;FuRv06Nt$pjmc${@jbV=usel~0r%W`haRx#q%L0>7 zER?`+0Etz42B@Y{@Uak*!v^cXpQS}KIr_){P)+`F_rI{M7~thJD1H&tr=e1Tk5$&2 zv77{g5r3mTH;b6^pKb0I^AXz@j27)P{53pwOArfSlM-U6%4@ZZe%(LJvSO zgGC3}yP1-#U-Opjmu8Fb_kzQZV8&nA=a;LK)kq25|fei)i zxE_I~a7nt<{j9fGT+5eTLbl*FwBv39-CMFnM;dSfh3qVwDD1?3hOy%^5W)jSvnqsb znM&x#Jl-%zNJ&P%Q}L(Gus2P%^<|D~MabXWEl@(HlAcuOu~oqOPEija?4H~gEnJZ_ z2)K!CW#P{rc=Cm%PyUDNMhq@f+lY>tMaaxr)$%1ENIx;!YNFg&?J#N8mS<(ifjo2Q z6SzKRP9(}EMI3p}brw=_;~J1M!Im0IG%WcR7Di@@RxBTJ(0bnBeM%@qm8GF`JX}!Z zN^sy$&u@oSV5D*#J2Y4VdBdQ|bvYE}*4?_3=8QeGjIl}$NT{8stFJ4A$Ji~Vn$u8A zjcZCIB05IRW*#l#Mr{>%9P}YuAt)oc53I&{*HBd;Q@|9ot zDQ^@?7iXI#fH~lO8r0qdo&myJ0;h_$oyh}+n_a$A03}}KD;AT2q!=j8u@3(Z-0<46 z9%52UG^>6%;i@unoEON4TQy5I4esMHvEE!SB|_#zc1hr+>M_quq@%Lw5O);Zib-^D zalfR_EG5KfSBwr{-Uk`x!GC)oyF}AE7qgNU2TIxJ+i9zI3;RQk$q29h_h+7bMLT(~ zT-oaf#v@%RgYAGyF5|c$Und{-O*$4cQgTK^yzG<#Zz4kUS5iNeQk!Wq2+yFTTU5gM zftYqvOO^kdvA2(p;yTZUXNG~U{kpAYH4-Cf0nKPujFuH3A{;rv&dkwSF3`4q>4461T_JfcC833+NG`o^+mATTZumUB22gR4*UlmvyaYon(g5tv>;h|&R zk5&f-R7_$swywdEXgy?OaPdv!K5ZE*hxIafsexzKz$j#ze>K7{rO?G<8#y>n6u02hjF79O_KQ|5I8Wunp2& z___Xp;|azaOdYfv_Tmxoe^kVs;Om;;r59)jFA96{z_879lubBtx@iUEz<@!4Ic@2I zuJ-PKt#HS`eTILTFD7~*#5_$DJRba60!s(B8MsY5vw%C95bV%J3JFg;W=TM|8N6TO zOSJ)>x;p5}rSsHcqEPBaIH4_7Q}`kIyF$J;9=;vZU49g%X#7F=?cyQLT1XlO;1W9q zl&NGx`M}x<-;TEs5~0=bls*$J-mAEQ0o#{%mxzdK2uu+6_@-d+>*=6U!Jj~xD|SFQ zDULHRN5rL|B?!h3{>FH;2DNAmTBL?dL0dvwL!}6+hqIMl1ZK{qfmpQpg?M+bl_|s1 zrnycOgl$ZCt?@$ck3WAmPFGr*5SK0Y-L@?>Q)48iD>3K5eN_~ZX^sb7JgzmG8H{F1 zCX#1M;F*HkAPrBu4Q@F7KZrRwDvI7V zJQ>!ys~Z<+Op}*_M@-DIRe3q;%w9Ay=9Ro8EUjiAH;=2Lj_e@os$vN{l)z&k+**n# zvD<8Q_>)!AVm+HI0HG)7E(Ly_JY}V+bB18fJ*+fSw>}YA*WJUIi4tO!ZJ`SQF-ElI zq*-VLBt)Sr)NGh6o2+*q1C!)}^qf)2gbFf^A?*MJ-EO&$utpS&z()$#!{Q$$hZ%CzwLNNU|fJwG$^z0EL}*S<)7i*A}bolXc8<-mAmK4^-I+tpI&^vW{jXZ^mVKYSyq& zVF^FUiJo0@hpSGJgycp?39}|Dq%W}5G5A>6-UYy40U*7oxh86n+>`Arc>4ym;Xj}I z&edlNH`|z|Kjt&ardYMK-k{EEeJiRkL+x&?kf{Qx`FRwiHzhC;QHsHgsa3LRG=7CE z+Qg;Z{0_a=!;S77GSUJ?? ztJGiX>UsC>Xm+gpYB06GeW|*-lAT@f3GXXf)#XfAzf1ktke5SFTBJLZ4cx6BuaKJ9 zM$*yBJ|Nwr3Mh-Jj^EIGo2%)$F%katnVv!C_4vl#Z3cTxjxDMvc3Q)aPcEVAS-5|2 zW0)aii`F`we9_Pvn@#f-f>gvIypK8$OfsssI^LL z0^EYy27++6gYKIKN1kHt?ev~7h8y5KGWDoIJKeJOVCF>YdF1%*Xl0YS{O4U}`tby7 zCRtH+O`@%(Vs~#1uO!kEAZ2!A=cYWRsyf#)+Sx_KXbR!iT zx}h5h1y#9+M1XvOMmNU}EQ6T1EVX;j}12`E_r1J0pgVRAsflNq6<^ ziE`0&S5`9Jw|55RyDnu|F15@699LHD)*6FaE4dczyjrfh5i)y<0ko_utVPbWQ*C14 z9dAK|$upi@U8u_DH9N1dIzRuIsXa4$s_leMPpXbzbUy8^^9CQ+QBZjNeNy$pBBbO6dMM`s7}!G^rEzNZWT$!9*S4YxhRV%N=j zc+M7p5CgGN_Q5qX+?aK~}#@%_ei-Zk2XiG`*SAZBJE)l-6n2{IP|k=aJCNskV`Z!$ByZbN-oX zqvLz*Nq8r zX`(FHD=jVz_e6Vm$>OV0$I#@)$7dY!gP}ax3%K5pxi18n%bo|U&9F7m3;jLg59ZMq zzGF+$eU z436QCwY3jo4cm6b-wku(i~DoWcRgs#4LthN%cT_-c`5h2`e5B0R@gE1-HM(~N7ux^ zntV{dUW|O@t?G9xj7_GcSG$py&;)sMv|hd8H& zicQ~2&2J)ePjqeye}36kZipwle%Tn`fMAY=S6Al(GtT2o@x|pyW`;J*tGY0 zoPE`KaK*1!dzHm7+*LmdF=96E2+`EC5ieDZ9djK9H-t^#$kB{8A{|Kk+ zcyGkwWD3fk4K2f+zkKYzrkDB3=&}1=K6oAbx_%qk{6NF9eb*m7_+%$GB|&iUTWj-! zd#`UkdW`%U&#;e^UUXi=+Q57BYh8Tpg=6=h$h^Fnuf$KhaC7C_3uuH*2j6>9{nGuV zm6u8@AARAqN3Xq*+HeG97LT5oc=xTDoA5|zj&FVS z8tdcDG4en)$VKkY9qYR5$O9ikV~~R%{^r47#o4N^mX{xBKm&BX^76@pXp*i68Xjmo z*5*g(`OSOZxw&#;!~BXnhLsnN;UT;Y@l7vWzkl*c^;K|NL|&smzwedF(#n;t zS4ZbYjbn6rp!L_Ik=NSXrqNAf?>$;n*Y92W;xY0I?b>+@8}JxO+=q%ylm5G1M>m}S z&C5%8pPavfe#^xQ_$%mZ)@0XvUAXJHygk6ka+9$453Gq z3uY4_I3v!B&DPWAfuWv_!5Y_Vbat51fLU;RQdR5#Njz>EE!J|ay335HnVyX6EAimC z8 z>FoY}LI-OFCv-S-4qO)1yHu&4Q(3Ie#}D}KMt_G(^-rlU_yeGG2!y~Oq2S`JNmsAb z9u5xV%%ImUY%S~`%mnZ!Q`+p zSe|mh-eG71Kq7G;9_uX6092&8#N?n=%aNoT?b)jiHE|k?G1tiqsNH*=7nP&tVsG#S zSS&!_0kR6PSgcl@njq*qDqDbklG$LI8(ilZ4NtpL1A9l^&H-ZTffx_aDKVxQgyRq)D8cC6O!~=mvpBe_CL@4Ff z^?2R&%9Z9GZ)h}_A^LObTb(H|cgS_p3bX&BYn}rL(drD{H|A|Jnl#VI=FH<6G;Et{ zUU2hyv}?V2$ukFYKtC_6HvK(h@Q4!|C+?2XOb)qNbw^7N`_SGJSII6AS16f@;B}Ai zXElS4fhVt=aMK^4#|PB&2ehrZO1GEulms`p!G;&j|NHIV{@t5b&tJc3uEGV%xI@O6 z;>i&){M@edi3jp&;TDr90@5Ntq{|#kk4x!{z6NI~_Q2U%VgjauFa&=g>OH|?jbQB% zlXSldL3{_LxUHh=S92T@fQ=w~8ID>$F@m$4RR*fWY6P4yqk`kXtp$>Z5QE<(knkAw zoS>sfY5a@@qpCATkSvD61K=rRO5Iro1a-uyk#~}IB$P-vrML-3S>tf0EpLGbnj&8W zRo{S+w+}fs4ZzjJF#`265!RnF;HowEg^dI*K_nb9P(1?lZ5jpF3xoHVG)R>=ftUPMMPbuR#?`3YvLTz4*LrN^{{ zxFk5E!&@-q(4q+_0oaPFy)L_G(yWmg*AjIBAM6EAm#zwxMvDRXm9VKTpgdQn zcDHdw>+*-xuefUw6ajcAa005w+*RHsZ8A8XTAM@Al0y`jaQMH{Y#!Y!k#OMgH_pH#QLBW_p+9hdzK;}z?Jj8dUe}H!cIk3C8A17+9LCfQTnuJEIp>lE zrmYdhzeb|gSEJE6t2sL9o{CqUj#tH=1~y7yPjQEvAjKdxZ37-1)w>G+ncEak)1xFS zO(1>43iU8`g|UNNsQAmTN&o!9&0e}1$S(!vgtW_UcVQdxflvS-N~CM3bxs!>+8K0d z^a?=^r3xI2L&{c{^m#r_Ty%ha2)w;!ph{q7QR{5v03*7;(j4-PqrpLobdAx)-qvm} z4YAp;tXSi}pZIr)6>Tku&s1O1K4oNj{h`N=9J~NaD(8h~skYx)<&8sv##4%aH-sk$ zoH@3>ZZx|cAJMTn`zc*o+>^arNAGGz=k0?VD0>8`P{HgR&=+fh#}zUQ>G5Zc zf>s9!LJJ=5Jg&6Oh8H2pW1|59N-Zw{>2csPiH#&Dx5N}_J4&DY=(~Dzbfjsro&M0I zTl~>R(oq0aW=+s6p(X!X?_`aH!x4wstWOFmm!g_Z=!q?eS^*+qeeV0CYy1H#nkee{Y(}t8jd@)1793 zOOp0gQ?qYaYHmHSXk#}3eTL*5ZErz&!B4u{^8`4vY%wWw`UjJKDCvW}W2ceW)j;uc zz?nqUXp67yi_R3t0n2>CFpXxVtk9q%!%JIUj9#P#@})Z`CUrpigZ1T~0I}hAOe4iL z+63j3GnmV!l&rJ|iMY}eCd0&~Xt_Cimia$rWY(AJe)akP{7K87K07k+1xCb6&y;(C ztyR5lJ?#YwF;_lH+WC|^?QI{|z~K@MM8-JwJ|w3m_@h4Wd~m4Sp-asfXG|+6zvj?u za0;lB_3er$0!Tdb=~Ewy?)#r7xb zGtG4nHi#4;FQJmOAt=0(V9l!}?IV@i#>&x+oueB*>}PwmrS8ydt8u8VV|#XInEXo} zP%Tz@iWpcR^c$7bG8C(mc75A@%vh zqZrgz5N20xK=Ms^xN?EL(hU)25Sst0b3ZwjrJoKV0wDD}&IPsCupL!BO|?eh|j z8GvkYRAa|-7WzSKIHZGKBBjI9?b8Ppaj8X>^tfiQ+Q2psN!m-Tgs3)*BfZjW(OIQj zLB@1JeLJ%qWA%PupeNu3QIX=V>O+@3-^saEJ~GN-p~X@;wE>sYeUKe*CLXn%5rTwP z+XJD-ZQydj$#D9pW&*riWMKegJUP$&RGCIE$jJem>1WegeZ2$VxekdmxgwUYf!eUX=o zwuyiNM&eqM0276D;Q8g4%T1DGd|2OM$;rb60|!!Ul5s(p>^`o?T(~Eh<^d}lSquo9 z<5z7#20pUzXNa>#FLS}DWJK@9@_gRtB5& zL6If52H1Mc$HI(!)1)xuruZIL|38KaaiQWo7 z#J<=+&NmDyfIF@zAQRP8*9-x;dcULCRKq*Rjf@2W9!QiPt;%=g&HhD_*K%rV$b=0y zsCbIB*oZ}pAY>BME5hxq!js4i<*(~9^1q76Uv013 zy`9q)ZJ#ZF$p3=ARN2$LOnYbSV(6d!ix!wZR!lFZd%MB|TR&WX!2`9+vO`7fdro7^ zCTp(0Z^iVI-ux@-O5zZ8GOi_9roIWNU8z1A)3 zf3i5){OO~W$-h|YHm;1nRmk^nf{))g>f)oD%nx7K{^8u+L(e3CUYYtCSyi}b{;Da| zcxoAW^Tcnq@7lNib03cV@b5t6ac|{?qO`L4-kzoF8e8{29(}d@jVq%cj$HsP$?V5^ zy~ldA$WPV33!V#3_P=%V)z))Y&Oa1;>yuZE+4f##-%9Y4{8W8z&AQ34x7NJ+vGdm4 zax(DNhkoJDepMd$Yj3Cdb9FShvGs#);~R~1V)G~Vsh>I${IgT_JFUO=W?8{$+#UO6 ze_x~Wn)@?v_Aff8|D9xa-Tezl`QzTd434`iQ?WPt|27C_l&_n;b4TgK zME$;d_1J|2eg42Nyo<$4+G*|HrWMN@PJHDp^J;ZL&5mmkW7-^S(S4)1*eg~@*+Ruq zYrhhK`Hrn@E#0k16=xJ^Prv>O%=e>i`8co{G4X@>zEm5{j=7C6vl^|T^UgTb=uQM+ zf}<<%XVGw`S8Fg+twW*s{_sIk$$UXU#$?;@nWQl9jc@TCHe}m~yif zAObburjMP}W3%D5uPbMep}o;a)n|MCd0w@y<}J=hvg0{5z1g2K-KtY$N%Lq72w@k- zVZXz8FPNO-Fu!3*=R7mSb}1`SV0=f5%~8OZCs`HP2Mi1rD{#Sy^R1`j74k>gKslI? zfCq|^6Gnl2kZ|MuK#cvk4MqUBtTJjLxVA_@>9AdUia2p@y=U8I{gP$nlHEY8+&H@4 zPg59H*)u`lW1G1>ggr?d*zPQa^yMP#su4@u!<_-UVV^n8eMlG!XJEWPU%)KzdINo% z&@W*cNZSM9z!9L;Mo;L4;64*3*f@EH1R5A@sOzp3o$FSk-Ixi}mpVs3?qWnQ9V|wB z+a}BcLF}3B0Pk1UKS2txm@ya1xw#6OVHX)eG_dXrFy}Y@?Rz_eSFfMGIRuBa*ofYR zRFL}12=w+rv_|39qN(w-eaQ4R+zA+1h;!5gAz7ke7o$VYgtnv^Q~lNYD5&r3UN4ci z5_uCPO+MrY_EE6{KAfd^r$b6fp6Uj7*U1%&dND3s(a!sr^5OUWWT?3gAb}9eqsl0s z3^t5IriMoKp*O)gv*;t0Y?BweGQM3~(d{?X2ave0#r$5(1buo#br0)sC6oa%G%LcF z;4bUuzm7+)DZtMMYnkV~VmR0JuEWXZDhQJd&;!$_^RmQE_NS7QRbtpx{5OfenZT96 zy$S6OXbmtE#GEe>2J&B?8|@AT&#Ks#aRwtzj~-cLwm?Eo$5UnE5&~(;!k6H#FhI9Q z0V3MD9sY!pIF$_e=wt)HAL+Sv`NwqBZU;gkKsQZD)7oM%sl6esjDrTUfsXWG8W^2z zC#e`HL0xwX!<;WW2yCKRLOx^BE5O)fu|r+h>V`%l+ATBve#e%9-5x7V12a1fJ`?ok z5ep$XP5{GuM<$v#qdM_vKLiv{XYI4JCz*el<_SdfOUY&z{5o6M)p&G=TMV|*U2c)I zmPARo*HQ0ZCT}C|K_gO-niq*um3+cWeL0nsk4xaNJ>1E1+(f3nK$)2?IRuf&WOD|SJ`d?K0;-A}R2O41 zPj%!m!Qf7hI#X&6#u#$*U>HTgujT})h+f_x3%Utjk}{DqkD!@RiZS3w!%3kGSs=qk zEnIk2FuDPe4%S;-1`a_A8&705uo9(kksuKm&kl+cIh_Pip@hWNn8@vI7>2k_RFw+g zfp-jx42W#4j>DG7f+$A298N2#<>Hu+VNz*Yk(Ru z&GBroGVxwZIL_x8wqLYpnT#AJd~|MncGL48xcZI1xz)D=!d4_&qd5TgOhg8gZ=1&* zo_x~ej0N!~80U|>NW?0Fk6i*wIPzia75s>3qhuA<^Iq>jY94APDt%~2|u!dt( z+<}W%AEp|D?3!%AP2J!tuFIM%Mv=g1ZUOTuqyyD-Sna6 ztpJ8|wmu!&+f5P|3H)xVw^DtkCA{xxjc!7eV0|4ND;NFef;B<-8sIkQ#+o{Kl%$=r zUHdI;^RA7lh+a7O+3XF*;`EGKF`?DxU{RJ^M#ia3Iu%4Y-{f4Fu~UI&n_TNA@R|dz%h58$*+I1^4}}D1KeqT={KnbZN`}Zn%7_xXTyZC4U9~T(Ud+ zkU6@NjNZRJ)X)oUJ@m8@AJO5r8#})q!@uc1^BZ#myew@OM~VtsJ$o?tOxT}m>Uw7G zeW|NT-_`QR^aej~o^3K3F;Rb_HT*wy`9VE4`f-pZ&Sswivg_r7_YOG-Ga&Yj@IkFA zHqxfm`3H^Eik_9+5qxmxt2t6X6#IsM*&l@~c>6S@B04vw?kD(*$(8m<=Hq0>K;L8i zaKJ1n?FNkV=IUg4#_ZI&n>jjZ7Tgb!)A7$2lI$bE&2~pO8ZmB@uFyBONBlXxcVe=M z-tU+XIz66!Tj-3n)M4&Zx$cqNmk&&w+$c`ai!3?{`0VJRI&v53tcYu|3%O!uU2GNr z${!2O#tXr4v3h&4<}}@H;s*tMjfn=B1}_vsdq^Xkdu;FKOQ1I0;`~hmU}9bv(b6Nq z=uW-MDn}IJyrqa3o9d*q(kk+>VVQ{nrf(Us?ux(2YK-~oi+&$soR-7n0I$H!hA4p1g)Wi#?ZmKtW(gI^*H}B7WE9+9j-v;mAWxL1=G4Oitqyf8j^{L zBxMmUTk!RiBun!c4aTCD#yt;QnHqpIe;B zv9jVA8OgJaHx7iaQe>Q#mduudr$CMlIvV#D!c z69r{rTwBg#4@cdmp{`b#n{X6QYYa1(ThWJx@l-=W+k`09rXJ_lW_)z1>qDAWd8Sr( zs4m+ab~hK=CyLJc@vFhUw>`N*(o?wcFro_HY5Xo+(x>95(a=m*M*^%SnXBn+hB&7wZ@jj5q7^RQw{T)>qD>;yXghzmQXbm9O$h&%FR&jEe^w5 zJeqS^2y!(Nl_6BQAFGfcH4EDifTU7j1^5!Ny_}r_gGYJQ(K|b) zHx4Q!`%@>`+i<8meyIS;jW@s-3pSL;RX1CwsN?SIB<1QuAaCj9d@K8%>_ZL>pXkr6 zL)Jj}@BCLBqtm5pf9W|O_PFBrxk(E0F)~y{p@qW zd$8mE%QW_|57Ltlx;}_q>g!(d*u(t;p?~+BM~%)au>+2ueaPD$1mDQxcc!Mzs#l%m zyR?+K#3|?WF=jI;PkQ3+m#v2*XA^EjIdjeXsFuJ=wi)zg@-d6?6#eB8mM z>XMJe*7U~<_$o+J%Gpoz$t&ScdSj1glUHI-d4!Y8^fvZa<$7^*_r0%b;?9-Y>HC@+ z^PCZ;E<X4oa9S`gF}-uGEkTuqFyh7*{>n|6DH!U5v(4rS0^s^3Qr>Yl5c}{2uTc zz})g`cP==Px^nla#hTIa3*20ef_7kK_ntHNcmpXD6tF9`dFGYK zCC}-?n~m2wcq%Rjd%Vky`61Thfw|>@$4F#qf9{{;)T&6!{$>M)bqIJz@riiH`~g zZNQW&hfL^VBu^ko9Z|YI4<<3Dt;mHnY?4CE4)!hPxR#001a;uZ$PQ@yka5SaeR6dtSB%9GeS-B3!j?D#Q(%XgmRXv|p5pLeyNs>IlnmMB z7{~<7oj^H)*#qi32bhjem=57NT_C=5TbuKgbCPV#e7CU~*IDDFW7T4V3`dFFhEiOH zi4>+;czmR1;4IuMXK57OU3%j`ZcJZQk~cL<=#Y-VYBUYNqk3Eh<4+`?0Vzik!&Cv` z398%RUJzmOoX|bE+}P9rqs+boBnong1;U|m`Z`9&ViZyGdA~?GkCMaWnINYvHPQ{( zopNJ0NL8f@-?=@-eJSMO5?m$43^V()FlW9I)%r&L>FCU_odGM-{S%XZgaJc1QPk&R1 zy%BD^UeTjQr3t^ckgCW0YyjlEuzM7Bdpv2lAodEwy#dly=i9;2sIz5U{jZQF_mH$M zGfuZI=^WiosurD<68>d!iX={9jN+=jf?Uw$s1)UmGbjBxkT19x-FhsE$g0$nR-;Gkps&E#r>`F`RKo!!p^614;q>M3K2Thd&j?(UjUTYs<}iDBvl$@8!|eqcv4n9{+GFs5%C&4s%Bkm`4} zN4wk{9E;x#suS|W@8oHC1v^OZkB!32GO>|+akPB5r*iV3PLPz=5fw+@J8+6jb70~O2#Uw*z=%I0xY^UIJWR8ny6 z#6fJ{5vNE!-$N(lC`1VkDLCHXR>Ty-yo*Z`5A%;|0o=AJfbT+-h3{m1Ka?)$hNfl~mJvy0lOQHlpZp5AON zXb8P-ZoAP8>eD!;{trW7FI~ylAemV5#)w(iOO;%6^5k! zo=CYLB+ydkn_Nv$mR(4)#nIJLh0!4JJWJNzuAXFw7C~%HBHVlTaj4n@t zPR1F^Ta7?%v5pn}bFZHRB3g8=q??B1->D`zak(Ei?nD{9$u8GTvzd}WLGHfjWHH;H z*G`bCM(d;3K0bN1;>DZlsqDL+H5E(*Y6(>>DUsKJXM5+gr%&|>!rMfbLK&~uSB3p> zjH0we?aVa^x=MgVfCL8V<*iFslxR1IVE-rnwU+w&-rB5IK(VJh5; zfl3-g8ikHJc<7UeBe_)-BJgtIiyk&zIxg|<$f+=~$e3wmXfCOSVkwhvfM)OuN6-7whWZkA2_$qwoL4qWRC; zvhQceeiF{iW72g*xr zUck!FKi_sZi!Cu+0STfOa1I!Xsb$9RI4)zG&3gP=iPYl6jZ*KX66#LFaK;ye<)vk+wU#dee)4-t(11620AUGU|2Rw(ue=?GVIa?P^yj6Xuj(3 zHG}WsD_A(x%KQ($%s)dwaF)^!|8Vmop5`O}_=!&kesbT<7jZcAL1XJHb!2O-_~scc z_C0M=KJVS5WmdK%p4OjC9n$Hid$P$#7^41P8Oz+$5}Mwfx$9EukdaWj{ff5frKx+C z?)UC#$?R_#*1M`MxlUUG+%?XXQ{CD@@wwWbwls`!$VrluA$MLV3+wPBkH2TTh-6VGx-K~C4TYoWh*?S}SPXDRa5B7X^^r4wY=nps@W1S$?MaQ$_I4fMsW?3htfD{`#jLYQF2t{h#{Tcyc}8%K3Nr z=8Hq~d#bmesoq`$UC&r*Q^C17{twPFfBk`nn(yw>z)-Ti?dOGA?{Wc=*zRdxCS% zw7j$b&FTJYee0TWj;c*RTuy(8cX9e_>O1>qr~7|xm9{Sna#orzt{**pRy&=&X0>Qf z`mMjzA2&a^3-9QQ>$6F0KdY>?Zt~TMSB1jZUpSkru0TlN1QPj1M5_-q!p4R1#%_t|C;*9dxYBDQ`_E)8i_|CK~g*b#_+2;^)2U!hkiX zwr+Kx_`18+`h^0-)pPO(aV{W8XaX?@bmbMp=QP-Ux%B}H1dINU^az#n19<|Kd^L_+x z&Ov!E2$YBmp5s(yAksRv#;u~~>S%z)2D?42a@xT`pmlD|-6h9JsuwtX*}M~hHyws^ zXB~?bHD{{&ZM;HD?L#@|TFzmUq;HR-W+%kjJP^lpVp2`Bn<<`?9|vX|%)Y|~Emm~t z+dg8XZdKb;-5mzM4c0Y%I9OX~#TL-lu|GgV?Zo|V7jC!F!Q+L z+rDHqgYKp^<+1_PvFCN%Cn#^qPX*Uf&Aky-TUdxK{0r-FZ*x-={+I;&2LhfZM|*p4 zQB7~NuIUWXCX2=q z7@&N!E&tcf->uXC+Q!#_%R0ZIc3$!RZm)?AX`G<+MZUtdyv+}?Zz^mkb%sxT6aN0; zlK%a(p*AMKM+#HR7jlo2ClmsEozrY7j{@0qnq0;}j@6r=XdM(f` zFqm`e#YTjj9|trB*fXVvF)?t-0Pn!&(z`$``{tvXCf~*v7l0lZ`bELvn-Ey8k_~*s z1#pWnbO53!Ap02TIvh`hpANV{z?KALN68Msw>)gZcd-BvNr+3hja=yy|1Zs?uRir) z{U2{yc?(BtZNSS~5?F6i6uveM+#!PTHXJJHVg|@oz5#nhN#`?zvH;u-q|+N2F)LQk zfNxU95>lDd=V~Uhkqk}NJMzr(g$9Mn71QtrZu83YLu-T%M*u>*wK$)aH>kc|CNkC_ zYNU8oq1k|MbtJdp=0CQeTE?V=vvVW>$gP;w=Y2{tWKh1_b@MJAMrD`K9&`g!010#s zBLzfsT{|cN;lfHGC*Xj>e6^iQ9OKUN8?{>LBNVtFVTq-sL@*z$B@*Tr-9X6#Rut7O9$a~Q!wlyhq%m4L_(wNmMAZprBUMzrnkmgDAU zK6l%bZ`{;e98Qqc`hgJO8XdV-lQfJ;BVjek*o5v+gD#^MX)KtwX2miYwL>mV0Vc?P zMI{+Ah*)*KF9H@7@RWc+LeB$2lmru4Ov44ztqFC~;(h@XEy1#%X-#X=fZk)Mi_37O zVhMg2N$+=H*5H^90Cdm;gK6Oxn;wzpM@dD`r6NJNBuvTuqLg=g=6=s zX{tuLM+5SFTBK<)iogU?&OA@z(*Ua(nfD!en~1BCWiPX4s#Z#ks@X2)a!%Sg)a>%A zRY$`e0{9S6GtMDLMQ%LA4QGkA5m!Q+4VR-pN(HdHteflovRKfIQ6eSiK?kUFwNfm@ z0D;DYFyUV_8O5Yb)lG}*<@=FGG}9}MA!B2t4=Bh`-(?HFYMHjw;iriNJTX(KfnUN( zEMiC$Do&rt;Sc^06=8%)GZDRNLGR;tRUJ7qn$eOm?Ygb3C5fE{4SIq6LjDPBq(7)R9Xa ztfOm2m2e0~0&y?kf+4V&)%pA@wyXg)L{NN6IoV3O#MpobDO+R!ARQTYU?vv~%_x(r z#MBf?dqF2)QI>XSlNqX@ErtesPKNh9ubqIr=Zu&EB1AuE;kz_q&gOv>hJ&^fg@GW!lhMUydB|2;Y(dWSl)t%Le`#Cf##tAvNZQnDJ{_%Un=sa+bapo!e30ZLAQn; zpZ2l)szu(E?*7sIS%AC*ys>mkCL;(KoU%T+93ag)z7CcJtD{^MDrCGOXj_|K7&LEF zD&*8k!v#|7P_a_nD*{AX0}L-_{|jw?r_7=uyb~3#p+iw)3!`Fh8lDLaJ=zTxR^6-n9U}zA1!E-UU+`H_!$Hgf+jx1rN z-JqtL!5c&9)2%(E46y|jFtX49RJA=QVYkfCB-|X%nWnd8lRj?TuMI#i+tJJ-#@wkE zmUVD-fHd-jf#xf~xLjo+63`1co|Z`o1W8+jscJi5P4$%_Y{acHVVLItxie${-#2Xs z>KZSJmy>!vWlVC@3mpLnddYd_DX9+)@o7&&(Kf6pep!64RT>C5fCrpP zS&Fqq>@zLA3<0_vam+CF76ISQHxY)CaIEzC!c+za_f1jUEk{db zpekbk`qm)KQO`h+#jEqZ>-oR^?Ne7D`W<%;O!?aRLi;JaTohfEZY6_W$*oSjXx=-~ z#AuPy(ulD`O^XR&`ti?rGkgd2?FWlwTb7N-9AM=~Vg3Kugsm2cT3c7tlC&|8!Z`XQNY_E3+VSS+ViuOCx zPQffLSrY;@b?6`-L!hBqD#awb*$nBf>0@Tlp`rfveQ=vsiS=zoqXQ^41_gZL2Hl5I zi=1g@Ag5I{%_?WX4pUxlSXIar=qroq1YJav7q2N3m#V6LrP~ol6P_-8Om@%8*`iYG z9Cg$W6OEoUV-g|@F)+r}I--U`^&Sj@Yj&9T7F@d!w6ef5!}XP!O26}|sZN+SDLrRv zd1K0g>BQPeA%ZA6?WcPkX-ko(-c zxYyhle7k4Bmj@&(mnEHk=zxy!82T7S4L0Sz>I9sYm^>gSikL_)vC72uMZ%L18k;#% zu4vM<{DhHSxMB@B2Mfj#h8zJeMXli3BJ}!L$R~>1kLgq}F{-@HFcP94rq39A^y4l8 z5yYvW2dspbXotTI7c=6Fur={Aa+GF-&dk-nzP{>zB2QqxB_X~LjV{aqs6h`~EChJY z)kwjZQd*@L-1KRQWu|;Yw;7-=;lXntvwq0KbO7VPh(IkBx(O*BsvQW4NGq06TG=ic zEUk$3lA@_<+7nHUsv2;T|15LWaBKVcfJt4u*LmCMbz1;DYNKn5h!J#AXsfieS`SI; zWAZ10Vi=faDkw{Wu5P=#4KYHAC~PVKowkUwK!moeEZ7T+K|Sq2A!r&9?%`{urqI}2 zCNYo~Fl~nV9;{$1TQE&`8$sdsV@}c&X2OzNR&?v-ekoc4YLU(C(3M5J#lLbk=NQ7D#-9-&%%1D)21@K7*pLJTEsk-!c;;OZ` z{LsC;_rcy#wwbsVq5Nd*)Lunvb!*f}<^HergiO0W>&45$sHz4MM}x@MYq1q^Yx zr-UO;Rl;U2^?Ovg0New3AzPGuMR68k>_rxkF&yS9hfgqI^>PGT0jcK!dpg2!7cfHkLkqAgiOGD&|fHy4x-xW_8l&mS*(JKg>n%?^J zKY8h+^L;>Ij@{NEV&;oW?x+A%Cl=gDLZljOB4MLZhFNM}w_$DZo`Hchh&;P85f+Q% zU^WG^DrQhr3Q@JJ-B}>u9mSlYidU-{fQZ$mlzLHE9E2YMuMySgLND;mBisNI>xqh9 zkCt)4c592Z7(MVu6-G;g9tsmmO$+pHz{>Mi!$U^3Fxy2JmIlTH6DPz(P%iU4x!qT# zb`ka^PAJeO!5veTS}6@Pz}gX=Hqo0Sgc~dtl#q_MBH8j3>{X6`o(86@i$}F3yzdUw zjUm>;7Yh%-Hwn}g4jTeBv;?|f8Y2er(O4_&On2iris4Pl3u6{Q`X?Xb90zz z4GSav$-!FGVudad*u?@`9|b1~%o)%~F*ix!h5|d9fv%8;oPge3O32fAcYDdKg(stZ zFtEt&_U*85X8c8{tg2uo^A1#4VHtx0+5zq?+>KBk@X+mTl(KZR0<0rU$9rpOkx~jc z9haK{_{p^szhL2Oht1j|8h}Z|CGqkw2SU&t!m`ACw&BLPVw3%N8-!)_LR)%88vr-^C6-U6*Z-+kL#RvrrEaG#v#;w(rP&=|DaHIUOc; zLO!jHa3pc*O)nJmY(82tYmq0uhQDFlJbX!Ms!Mx)*~P2IfjasC{-IUVU=4r~7?p8m zY}(|@Y1}FRd?jurwg`uNxIRuSQqr?u`DM0e_yE3LS~621jCoKOdwkH+S*r(%`fw#g z>#X9)Wo;=~UKJ8!2B4_n7@1Zb)xpDYb6u(1F%FyZDvez(*+0BJw)7LEE3L=K*%E! zcbjyXLM;gl_o{+}^vEdRSqQfCW^s8FK4CB@^t8l#T0(AEB<#j)Qf3S?f)3zWu>i9$KdY1bWl;WLni0W! zx86P=KIzJ~WRt+#CTVgoY@^L2V5m!R2|<9*Z~2ce+C3kvN(j0H1ocw?TCrhuFT4A1zqQqgPGYWh)qn+9}-F9+3? zm3aM0@EBJR59Vs#Sgm75sK^Yh4xA-J*%-DsFMR@(EtppVh^uw%0(j97Eu{nG#b^ws49H`|2)T*L&6Z7t~j zG8{5oNVmHIN=yAS1U-bAKWDk&3pD;A_$YM@186Zw42(VK2Jp)Ws$t7;q4DX6T)Igd zvrvGnxlmA0YY;T(B)nIMb`x+T;Q3~793 zX2RhnuwfM*E7<&aBA{pUv)D2YEpw`2Ktgpm{Ozc6TEvv8%ykw)0aO(o&4iwYRaD{1 zWiTU)I3a(Sy9m0lg$`sB#3;-%&k*eeDDefM1DK!`#<;&E$Za5@nbxBEPdbcP34B0- z8aUptpDQx00VCaw|9kJTZ~pP;zj14Xg=GQtgoTd~G)6^eFZdHPf}ILeSf{YU1+KKY zj+K3W|I;eBBLv6BlqAhT;RJ_|{(_D}hVXLmq8lmtqSnjpM9!gu?oGMb3GaQGj3JM@ z3CXk>9^M-q)$Kr<`kfvwvNq-}`Dm9GE;@+hyRg03;0#&J6l$sVGA~G^2an;djQED2aZd$gCWrJjqC=8we!3p{C zq^nd7Ex7>+go88A4Z@Ox0~v#Zb8+S;>ZZZ6LlT5#hs^UNKx~JZ$;<_eGhE+H^1dTM zW-{xp_0}sIb#?uob86Q^F6zm?e#ue6$wdtVC z^ah*pE+CS)3Xj}jw8IAep_Ht=?0rZHQ0wCOboffLgLpEg#2Db%ql8!)l%l#YA3f{< z-2ke=K;3;P8}yHJSZj0F{?)(#{DbRH9m4hQF4Y3;Cnjom=q!4I+qe!4XIP02?l8Tu zx**~MB|WTiC;FIJVkr?yE!|>oD#}MqAo-O#sEUSNOOdZ4;yK}Iqy!5_kR_NdE{~IZ zdI~FejUiGluF7KUDR4O=g5 zPy)>?mK0MsGbXTdcsxlQP6X5ki--SN>Pxvkt6FgIgHhY_5H;Ky?S%~`whw#!XcN_HJlR15EG(J)G~$U z3>v}6;EgJ7hF(Og_7^#n=^Y4;F#SAP|Bdp*(HfjJEwPvxz}Yy|E}=dsZX8A-eX9u` zINmW+7Qmkk(83GY>*-2csg4qIDY&E@H_A$rf?bODAz<;n?B{g9u54tF0{eWT=|j%a zum$R7$Aw(UeqSxCdcTLigUz@IE1Kcq+NlI(?Slw5zR;WkH_FU3EKoTpD$`FTF1!fF zDqhX2i0_fih)$9D1J%Rn5`+y5V7yLEVX2MNN}7u)(WPV8V_I)UW;nIz^3zeC%JmB%Or=KBBjyc!MpenFE9j^Kw7X>rXekDa5EH_Ta zYhR73BPVedg4)1h8o{fAlA%Z`6+C$*ebv27dGFnnd~K}BJ6>FQwulZCVAxl1+1{yB3ohz*$f@SY5kwhZc!ngv-# z*#r~5F3fdsQgNQ#pmS-TUoaKkV#5J&r+8K8Faj{7p+vThTIiViT&ym|u#W~s;!#!} z&*A7uHG*cm+NS92RYu=o=u}00Q^GiAX!)SEicvxC7gv7&7YDAt+Bw~%_+tu@Vw05% z?*PwLW7>Vn-KpaNKsK2g!yc57@f#S}rXr5UO48)1OC5A4*ao8(N8F3RGoE;LF>F;0 z4T{JO!QE<^nFbfzgkb_hk&S0ToKu#MneLp~ieDBQ3q~NswaJ2~1#g}6JY;Cir~xMQ z_>X&RBxbQ*%?whg-VhN|)DbufHv&Oo8z!O`GXaU9e_`^*l%R)uq%e4f#|KT#^+MEB z5?)Z;lO=$mClyQ~%foQNyN3!3&@UV}2JhTNd>aor2G!|{c`iFaLa10t6>)}xXNIS} zHhlAke{=nK0lV0O;3`56Iv&roI;leB!GOIZ<5XxLG@dp6caKh84lFAO1i{>@#&)(~ zRKx)vP_e1FDC?lUv72Mf-@wUkHS>S!n$cx=Xg{+@#U3Fn;2E2OY?L6bjUg;7xGh5U z=#OP_l>IU+jNR1E;k;DQxTtRNu>(*L!Gky&hY5=tln~34+-5w9Wyk>6{XT8b!f+UZ z4SEUjituzXG6Iv}oM@i_b zmaSIb>0Tg@zUd7qh!(X{Xc11YhRiX&%MN7PXZnCP6)!lhfmnbHuLh0Tg;x$m#bb9^ zP?<>pWt|Z41ej{$q!J6=5*Cwn3I@JveHP;FKDg4*C#?0*iK|TYwfamCDgw7N+25H3 z-6qaU`Isk#4gtmRY%3ty&BhP>g8QL9-W)j>@jT^hybFuDy~#uiM6X)&?H^`W8GpqJ8c8sCdb+g{M+ zO*|n)d7vnSlrSSjoY8=n9Qm+tmGwq$B*mi%C^u}QpM;)631d9Gp{6zuH^%u{u{ecC z!HjGUzK3bQ8**+LUCJ~FmIPpbf(!)lqVQLBrEy8g?OS zfhNJtEl6)p<2cz{%K!eUPsdYd1vIaBmHlFkQ=Mf~o+~Y1}qFBZ?&~$O|Ea zgqrNJX(nG~o7T}_AadJ~Iyy zr7$*FmsQO=BI-l=5g)DdahNE;$vTGtLBA!Wc$M|R7-vzjU&Z?f5UOcjDHIxFq*v!P z+}c0{mc0jPqBhrt;i#2lSjS_cTWyOl+Xv-0@oWmpnl8OksAb$Cue|KQ~ ziJ22|aV;a$#T6ONXcbyXw{&!`Zjzl&W`L(|I%C_7j^dyDdQK_l!z5XkBGi|j;~;+W zI?wImoi=-y*9=%CUWti+C>H=KEn(l_B4C&Er9C&vR5n(NO_TDi<+1*>ZUmo?H0 zO*GHS8t!c{vK%rpVRGX|1j>g1pg!Dm+3K1|`&^SuwyGVy^4HW8HA1CwedJ@Xj{nja z44UqwpAYj9UwJbyID^FlV3ApRs=9cddcL7{Fqj>RZ&c_C+R#7;Fm>wTqS74TF{WC4 z!P#~6rbsSJbVwYeN&u>;O-+#o6{AvNvOZ#mDSSG+xhR6Ln_`<2mIcN`%k?!iwa*1W zmkM0jm6HuZFq&VHTqJD`?#f}HGqzouTmKMdd|x=?8&}%TN}-4yZ6Ko|w?Q*f2gCrG z8$K&84kZ_N3>$hVr&iI}z_>0D}gu1kXpYoZ|DoPKwb-|q!cb=RmFwO*&0x|?AOCN zqa+8`o?%eZP!GWeNThM1W_C(+i+b#~MH{uLJ=#`LDDy2++bp|mqUV4sk<#M%x?W~~ z8;R7H)jVd6=k;WT_jrVUQxn9%Nhzl`V6Yap+TK$U! z>E2aV>}%Qu$D6WR{MyUZ_`;R_k8X8<(=@)P?Sr zsUVqjURz<6oVjmJk6zyxc-+;g{F%JGMzIk{UPJUOq9i?avupBA@uuZMA?x_=6{_@6 zo7NSUjn_OOgZ}GV?l=WFSIe&xAcOiYSx@z@?0asrn3H1Zp%!YkPAu#4#!JtiD|I}( zB=RHrZk65kfOmZM!GdOC4CrryzCCi_nHT`*ij?*VfamTp0#e_QVT^aE&+YF*4qVN1 z*2MO5%b88XztL>{;KXu7JkOLqt(A~}a`FLHr%BIviTHj{pmSnJ$X2QNJGEiU&f86o z=`>BO#Pe`&a*OFo@mlKkLBvNp3LaT}CCp<8LY=0mc416HC~32q2YjWw=cn4I45 ztq5D$;e8a97e2V**beVD=5!`+9o)Psb8NUC^f}uLr#D|pfEZT-|K!~~ zme`9859r?vedv)t8*91sVq)#lQ;9E;TPQtNRzy+w;pn2VV=`8}&1?m%Kc4+ktBsFjIDb$imz8nUyYvLyyIZg&`a{Gp&bWLPu|?@JWU?z zuN-@+?B5OgP#spJ+nMA;-&v6UC?qmkqJag@mqI5qSegIgOBFXVpe(uu;u)Z;-eQ}M zRlH>1N)9~Mf2?93Rx+T;Id-!DRPuIW&ksT;U;J>IcIHLthwDF^22T;_evYnRlD^jd zr5CRbypp))U-6y4iY`h&F!JW+Z{y2(XyALN*I$!&j$M2D<>)`+ySM+?@B;@Qdit5$ z(V@Q{Vnj|Aw)q(2|ZP-@4tNdHyQseli=< zXn7Pnv*FfXxkx0Mf|Nil9>5mfWee(Z# z^T{vduN$}Tyvu5|`Q?mnOgtp_qM=R1tbU&D2%6s+Yqu97d0>#fMReV<`zjcsyc^a5K z9_C4Qj!LxFK23#3fJkK|^?}(nR+B9CYiA6`c(dzescwg?y<-DUOkZjnj~P+EG(7Cm zHLkdi@(1`kWEyb;6k|s9dNpTzcHAckI?fPG3@b zu%j_#k9uXro!}Bu)q(cLfKpthT$L=n#{!>`yGU2}(yoAFcjuOBPEDh-%Nuf|!U21# zLct@A+gi2PkkMW=hUI~z9hlpU=UMwtPEQN4JnI;dQIoOjij&kse!IK>u;MOtcLC_D z!*19gK`nbc@EFOCEp;1_ypwMElw)aDOSiMj%Q>s{rD>}^lZ$ja6eLE?Iw(5p`=d7( ze|pKaKl!RP>yBCBfQ&mMz%c_Z3{b<_e@-`j0IP9^Uh zkyLnOi2497a;e%zmOAj69HF)tK~ht}#T7O}CQ=n12~ueelf&vD(w~u!G7GsOA)k@7 zk)Y#Cy@!|rgQuaO%s`~T83Yfi)wci2)K7-A~oDUY+0xJxr zelr##Q4Y<*(H=Z-q#s$rVWL|pYG*KV55`&nLw?AGL+BO3W8;MC8yUsOmlslN1JCN2EMii%b49(f;zT;vSE6a~GfepBtzN3=-S5lxj;~^#5z`WxJ;hUt4S}9VrnWL8>=P z=aGq@$fU7P(G*t>`Bpd6x|Xr7k~3uucBy+Zh!nIDE7_Z@z+{A2oY-rLg9it`lwf2E z)ICC4lT`3175eupiKocx33Gp!8Kx@)SatqLfX*?*_b|RVb_1k8e}YRrm{a zYdRQ<#-vM7mgNQcWH!FWn|#it{q!IbLC5u;@8}-YDegrN(F+c8@&>g|F{&VC8>lja zYAP=qoje9223vKEwd!pe4Z6uF4bI(705juK*!1Qwxj@J*qAR;wlm(Pnc=QWZZtHsQ zNbtI?rv&?i>bdlkSP=WpHo))mhLCN**kzW9NRCs}HC{uvLjL;5{jV1;VBJU3&C*ou9EC%JJjyzwIm1GSB zMLvT$hHE6yyPRyKC-uld0$C|LBR2p_uf)2dQk6J#xEt9!NdkbPju z>ySsJgdjW&y*YeK1nM_=QzvNgU}i>6ASB^otMSo9V|m1~lNv>Ehd@RumoSfSLsKWGC&?}Amp=HrRaWCbrWFs#vfV+(Lj7@p@ma$K}t)z8+gv4J`A zmYbIwK=P{mNckEW4j1ZHxyd>LAu8wqj_9Ba82nPY(7Q$nBpg}=-@_FN<~6udj)Xi{ zDBtDeWejO{6b$&wK!ho$5kZX=jI9zSzTE_M%oJ2ivz=3~$F?WDE7Uz{5crUT#0YyY zCj{d%Aurp4c$l0&VjZ>u%K$;HEUHy%eD-K1DY4dDO$jB{K$M!B(Yl}fe(q0PM6lSB zYVrqm`tw6sVNFP>#aMHxQ0_oz90*Nw4m0?22Av;vW9}8=Duw>N(r|MwBW+cDWf}OC zR?)-!!&cA8#taSulg~I{XNs8Yh)ahM*+aN%xzF!g$FJj8s{u9V2h|TPB{Cncwy&wy zh)8R!LlUV=9>22za?CN-eriM*;7 z!u59S;%Gq+p2r7}F=rTTOtUtuP1TdYMVEScJ)2L2&LpO_%>H)jf5Uhfaj+QhJr?24 z1hmkj_Y;T-Q!|AItI2@U^Q-zd37u-Dms$(PLGXbX7M>+O;r3=GKo#?}<6;h~W;hf% z+nWR^{OXu^2BPB~$k(ma=&Sm)veEbGTPCAqXBhNih2BS%ES=D+dOP=bfh@!i7g$ky zwea`Uf?DqG??O@%KER$2PIRN%Wqdit5rZU>rv@D>uBC(?C32{MwCiVy0V(=i)B^~O z6vOLX>L#?9>oa2e4SnB(hFWR#5#1`8q( zuVukN=8r3cto4AgK5LA|JdfZYz1$s@%)F&}qqtd?P}l`yl5U+)(+RJqiUjgT4@REB z+(YzAg8k6!skoQKEGIe!2qz;Acq+r}z%XntXqkhB?ov-BD=c;o90fXXagK;lvN(Gz z(;MLE_X)d!#czvQ5|hz3Ad+$Uf@+uM(U}xf1EJ-n4zC1UG2S}+f{FnteW_+=h3AQ| zk#LB37^z`m7_oRX^Ut?N-afPM2Fr0id5474EQZtIz?t-*u#PogAxNKod zijPx_4$;Fk_{n2%2+xs|LGgoRiV`B@iE=9hJXD#PdyMWe#4n?&jI=AH#v{8r0XAum z9)Omk2^Hf>uIG(vly#^o*MY+s>kefAhB3axb$BUdjc8m_ZS!c*1N9@b1eKmg39~J6 z$*c?80H$i>F+FK#6QdBF6p+IMh~~nmvEPtW1*0RxgLErSEs9u5#HRVKtg9nYyt$Gf zhZOHFRnAUyr6RV7`TsN-EwsA{+dJ#dMoEEHhmuF<15-Df$OLrveU}`B%;aU~UBCNr zY#g;i-Z>*#N74TFyH@XR0)xXA1H15m8`T)^sXJ3b0IY0X#vpi;T&q~^^$cg_u+?kk zNm4b5?4C0WZKV&qJOXSUsMj&?h}N{50NbUTqcCmhh@lyMqz@QM0xd5XWf?JZb+@Y_ z{|}k1<(}s7#`Y#nuX$Jc?aud3{O>z2>vbphP)+O3d2xNi(f5a54`<`=Mw`PoRi*B9 z*G(ta6uVS9*|XC*>VT6cu=dK4#%$jQs!?~^`oQU5pucH%%v&=sZzS-=z@Iy7uW0XD z&+Any>n>Seb2fz6*-wd)?$e9q-B-$PWAJKzBVbm=t9Ba1JNCz<9i=1E*Q~N$Yp>N5 z-7f)H6}YW>I$5(7JKnq^-ca;Pdv!zf$g;1TblxUSR(eM;VShplO^$(Q+dApolBJeY zQhdjKt@Yl$g}{>+?RaUZt8cNmkDPQyx6`J`|Ll9P`+oaVSDt*^jz1p$g7{a7eO&-c z{qyc!r=)c~_wJYO>zyBXqIOR*JhEfH5;|Fa(5ZZKLC5g6$WO&WDOhHzy80(|wr{bN z&E?jEWXG`T)yTi4d&@fW=XccpRnNlQVzMCj*0SGPJqwzKw>3Tyk8JPjw%&U`H~GR< z`lj1_v!SWJZ}aDz8=Jb*|EG4{nuSlj@y?q+em9q>eV}oX6lEMdlcBeUuIU$>Zq82Y9DtG+j-u`f+LvZH^vrS;;xUz5pyd^eY`-5Xq7@j%z2ntJQL z&Gq^FTi!l;tER@YxD)mcl9gs*QAxNJU`X_+h)3l{JwiCb8*8pck*8f zO_5t5b-GHuH+w+gv;7;ZkGC(`Q}N!FBilZ4ZU2@0EvGJ<57sMd7T%wEd;3ZE{gKJf zUOd{kSFL1rT>v~^#S$$i+SUSVSQ(hm=CSQnRZ}&Hy zDedoC-#7BzTP{kSJO0!ti*GJ_2dy}~BD_O6l<(g4e0TcyS}yXJXWm)&#{89^?s=f` zJB<%W^TYM~_mP4VO6*)Ht*NcgEpFTcBcv-f+|+WlFQM(5UwC@+gV*Y<$ZtzuU%c`g zvH5k6h4)4tXo`-2i02>QmQHs)IN{Ih_lwuu@0O1??4|=_{^&{KoP7S4*zo&J5$%((8Rb?3@Hq4$W2f7cE*Zz0q@9|ku`=VkQm z==RcprFeMOipX$RvK;f$U}3*Sz=IZkmqB7S_R8fguui9T<>|t_4a=vB!fb{Q)>xGQ zmP`Byd@x2@QVBMhW%33satytlJymZvsj;}*20&l=xEJ|cFki3Bn+Ez|yXv97v1Rt^ zM0l72pdKmb0qc$6aR&7n7zHq6&DrSvj4?BNkrtSRU0R6O8=cFw@Kkew-ba{;eKA5i zMzaD;V<0(-Z#;PNxOl$er{uYd9{oqRpw}CLgd3i0&Xkdn+%d26$SboBiv|&W!s_8V`S(@dy@gPv1#5-C@UC$i$l5)h|KOgle)-NM`Ee(uI2kx= z!ju_%S>;Os59%E9ciI!_RSr0uz{@LCt{7~1?zTEj!(&f4TnyQkmCG)Z=51r-WYB6K zO|C-18$B$IgRbMm2xg>JTgX;ta<#N(E092a?Q}?oP@!9eNj@?N9w&6jCUfc=`>3jv zJF2j@CNh#pwH)m3DJR1<$^tD%=4k=XJEhYRj9LMt5srOF4AS&S;&6hNw+veWz7xa8 z&RJPsoU|7-M-FtQ&WUS6pwo>3@I1*Juo<5|a)8RgCH=X>WQ|s}pp*6VL2XdmG8BRwRs2XkzO9~#P+jB=wJxv1 zhZEnBKA|6%UtfRlTx%r%87ttP3)Z!~9TocX(R3k7J%kdFhG$PY@G%tNtdC^nXax`3 z17HU5IfgW|xWElsVUpKu_P%IzEDNhr&NLdjeToe&)dh=z3nN3!DO`8+_N!`x5|#=wsgf*DcKF*D9?hqCjZiY3UN$EL9X#-NMYalKMGgJX^QAq*0kqYuY_7T3Fj8vFWq}fn5O$q{n*cPVb zAZQnamq$w=EJ(tt7C697W1=@qsp;4pn~)fq)odLkDdK|-4Dw3V4*ASkhw<(ct^*l3 zl?jewmZj;qv&;es&7ufSI4(#@>)al*C?Nl#xMS%JRi! z+d$yXNX;1D6`tqwQa(??gX_>t51_G#uem&w!K}9E^!2`OaUPO^K~9h896%6d+e2i| zU|5Sn2k3InTA1gI-)*4ZN!lKx-a+<+%VRn=c$I-gfchdCP^c|NZiSu_su7}t>zOA= zwn%|XNIe`ZAun65MPVaRwVKL8i^GH1+UFq%Nl6wHYo8 zTQV3Q_F$izX;n~`sz*67WA-|xZWqT?yy~!}xkxl=j~f8LE*D&+fO!ZgdT!bmK=_5t zg+)A7X_F2sZDgxMY!5+HFIlf59ma#Ngj^~!!i$uHEo5KB5lio7Mch@40r9uSCR^HPxd;SV7g<6S1G6Jn(> zC<*)&j}(I+8m`c+coJJCWNLVTPDcE6)S_th7!S_}lNMP7^#YFejl(ZNY;36tx995- z)0Yy^fXosO()Fr>2!bVdFbAh3hr|icViu4jZ5TKNev0i`mZ%AzfzbQaK%IO>m z$A}9E9nMz5n;iuA@uiL+4Q-+P+3$UK$AABcdj}_D+^JedpUn@4^9QpB6vSB5CspzE zNN!}^*H7=2&ff+zKyS@nxp0~2e{b)Z}&>?@e_vqr>DBTl|-O7Z=^$V>vh`+R@ zcO|{HYrB%KyPY+czPR1#5O-Z_ux9&xgSsDd4&{wch!-p#BsYrH;XLO^9{EsG*Hi_q zTaI2>Xq`y&3)IIkQ#hOp%4O7QwC3xjnaPN=jnbi{yt*Bl8sXMwmcQ2%Ul)#Vdtm>g zGU&msiPZB23Vy`mlueE`tBT5B^i>gBMeF6D6Hj0mTT+hSDo+M~j&O*7$InP4=l{;V zduZ@%vc9~de9D-z=+D%t(?gMDz1_L3b|M)(pIk!T)oy^3B8QM%Fj4#UWbCF(7H?S- zjjhYaKIhsu)y5MekDmrT$FuRNd*8iu5u?=l-o`2;3|+rKOQ@^K=mxD&o1Mz#?M`4g z|0xT)tsJV=? zpeAGavOT)@gghMaF6PeGJz;lVbn?MqXW~WD9z7o?L3r*5r@9kXV1Gk$C<%*Xav*Mx z#iriKNzYChq)=B$_AJt;mZ*iQg*Ax9-C7aT9E1s1dOa`Of$jURUHrIY%-3T#59xN= z+u`&mW~p^=>E8Na=B89TaI?|~A2jSLE$rbXEYyzcl?ctzuPjqKb`OW!%a8}Tsl$^D z|3uS+hZanKyIW`nUV@+ z8SA`UxL}QdP$UbZ^it5W-*6)K)C8HD5cV{-waR))q}@Ye-P}E4cTdpmY`!FRW&Bp7 zLtSJ{=Kuu)fdny)pLAH5A7OOHrC3~o6TYL*_b@-tkk_hw*uvx{nTk|YHrV_IVx5#{ zwMJf%T86r}#Mf5KO-y61o-w06dB=}ceh$Zu}w+Ok)EZ0+OHQytN^A}$z zgxA=y16pjIi|}LRvf&Mybs+xE#Uq8_X9{vQ-}e+CS(c$-`MrA3@)kcMK2fhPXu9(B4Rh< zjTMx!g65|;RT==%ZdYK^MWnfSY(gG8uYCif3Zvn|B5`V=I;_%tj_@r@Pa|&kH0>|c zNu7x!#y)^Z?6X|z74$|^w0;JgW|3vQVH8u7PF#JHDd z>rys>05Et|U{!1*x8MEkPcF^*$HDto-%Mf znRBZeF@+Wa=0L_eynxMQEIDzZmH&n;M~E1SM1wP8r(No(xzs^AU~WQSXlXIBsjZwi zC=Qll97YVF8%B1MKWHT_8uZ1{+5K->x~y88L|TT4pfco(e<&)q&RQ)d>sr$JvS6-k z`B|y`oYd|!RoEqR-8mV#gb6n;D{I6PqOa1Dt4OlE;1A-mPTFyDQPA;}M@l0H^yF~z ziMm)a5sUOsSp_&c!&PMXVcPyea??Z-)-9+YuQ2&)gqQOyJr5lghJs7DkS`25HABap zS}dJ9)e)2OJ0rn1g0 zb%(5IVj`XVc$E`9BF#|sJf1r%UsYZR?*X@tl&RE1aXYf3Z^Ty0VB#!LMs+0H?RP61 z!AjFs3PPOc#Wejl5BdmW5baHPGwK1K>aMKaq<_{5(i>dbG0GrD-A`upD?poxTGpIFoTwKN|i=6n;CmChY;-<5Y_0;DsyT8nd$z=mCG=5S^OS?{Yy|Ct1fOTi#>=~SF|Rc38K+^7B{8o#d*JV)Q}o4Fg~F(N;>)Hi1>{zOLt~a90RbZ zJ(2JA>4m2A@lVw|P@AtU(<;RnA^D)RoK0xYstNBeUrosChzGV5)SB!bGC8v9dSX<#_L1 z1P4#;b|v=nk8M#5h{S`9A2Z%{K!Q2k06Uy?Sw6=Ku{&pd!r5!hSIRnVbwOY>*%zPC>-*52eb(Eh zM|&$q#Prmlrs$1%K)bQuh>a{wnns7EcaiWT@ud@=|FKIrocfc%n` zY76$f!o@EW9zz1Wku>+KZ3!K`Fh0z@Ffc%Xpbx+_Smc{Jh#AZ1Kw0D)6IB$nmhpBy1{WONN-gBS)tI^g|cq(t#}Bu3yO2yIIk`CT9E zFzq?;Y-U2;QQg{VfCv-*7AtgJUUob{fWc=4y%39Z!$~Ruf|rBanQx%fUKx?+%!i+7 zItX)Ph$1JC0qMWpM)=;=F;?z@dTLHtMz&oS6QN|Q*NKU?>d3`FS15+-Y4Bck8qxC& zTYguu?!@~4Y&lhFofDzhM99o`<-l-yIENl>&nibb@8-hj(=J$jmx4LxQRzAR zjZ7puV>*4K@j`3!wlv8}$z22+ZDEgop`&Qea&&4l{hA2tX;R|r)smtH)~_i>0CBcp zPL}C%nzSyc{G+T_yCF--GS;_Yw4mrAay=-Y&{-7Ei4J%7d?JWXIBtdGT>vK3(cK-? zU?d^-7E}U`1?%aANQV%@yVJEfP8xJ-qm^P~D}b1jYY>ZyQ5a7@LceywqK6_(3?flj zPH*M&$$GdY7#E%l(hq`(sVAaSFp%&7VVfh$sajtSk`IE?JBb&jHZiNI(NLN&HaggT z0(}~~Kn#lp!};KGP`t?I%^C`$y%1VMk0XNDUg{XKu*#!>opCPdovAdSHZGzAAC@1Ym zUvR90T}iQXDAXyw0dt92ObAVGS1Ee5{VG_G(XT0EnK(=qM}L+^$pC#yBKX{@Fz6x` zvmYA~f_ZM4^v-r^LSAC!<(I5{B9=!^SW%)N8ZRVcM+cpt-?1N;lHjmz{T>USB&Uo+P7!9uG<(z&Q+a?y#wA$i^iRP*=VMGRu*(r3mXiyor3-eGGa2DmC*;-Z zkb5!KwPkW0c{`q${O2UGO_#$MRHnE_f|=nt5vlqQ!*UvA(j^D-FwZ;cUQC~G+0-gVr6wk{HF zg@1Tg$fk$VJ7P%Pu`W5(Z@uLd{3FQ`m`xt2e2`#r(Zb6Xka8eQN8-sgBO4#k9pl+T zNFNPjh!8S{2_3g2LpLP^i2Dk-TV0KHs)F2-bmr*MM!RtwCV63r<2$Ctwo92QCS=)y z74{YU69^J_S`*9r((Ot|+RD&@f>BO2rwiH(mQw?HsrmPBp1;24hj&B_1gx;kJ2QDN zEY$AlVj@-!`3h8=&6G`Knf^MW!1d#+Nn-piDWMX?Cp5;BBZPQb;(b1;3Orqf_P9}aQ-Bv6WZ%xA7DulFjnN4V%~DX?TciNR%( z3*nP^-7tR76dO}uR_skT--OHFx^91Q)z-%D7q3d-|hZ~~H59)CkgXMw|4wMaki zCMRd?@g+Ioc}pm<`{>h!`kGwbLI=7GR(c1laoT7WL7CadEn}e*d$}S{`rULsYKIF} z?4}4_R>)Ltd7l?yit7;ZY{NXt6xV~0DJZU+UtG2J{{O!3^;vi1YA9m>PcQ?5nqumR zDMxhXc&qv{X0F#n-bPH7W+~a^XvVyfAxXfTAYSPg22^{F8F!$jR>H*bWaN~I<}A#Q z6`sJje{e1wXj!zt?LNgKmJ1PjZ5n>mmAQ@aAaBHk66XrFM2s{n#bh&IMK?vVs@rds zS~<%kJ_MFw=madEJlMD1Ac3f(!Ejy9A-&A1@O6k0ghN;6QP5-;fP_Mb zUIOqoW|3!sTuZ-Y9VW=v`um_K6!bD#7;i)v)9nKNx|}&rh~E_+kb^$)5*>v@i?QyEgqAL4d=L(S52eYFH{s@ z=5UT?I)&acK*W6=vL|5PpnN%_S+e`GNRni{ro)Un9@0aoy;6vY#Sv$g7c6FR&4>mw z3{mLo-WT@u|F^F;72kQfcfZ^_D~O{b@c%~(=FYP8)j!&N_g4z$Cw8Zh$BSVF4xi~s zmw$Br-5;2xiLR7c_gg>mk^j6 zJ&3LQaFC7psvK9Hvp5;((hTkd1G{EI@)}K_`a68th! zn(OfFX_&i!>L;>-Wbg_QRDGfopwz*9M9zjbx>9KECpN ze2cO#e@k#%oPc|aG`ZZFy-FvFJ@DzDxn|w}L z)zuL?6JK%0T0nN+s@eALQ_VOnJF_SD9`aP)bI&y2FP&SpKx+B<7wFrc^|pa1Xzdl} zefLb);-;@0d_4Wr(w4tixazSlWZ!((xv49?Gi*TE`qR>L4?OwHtMM-|Iv`_hKBq3; z8F+tS)xR}&?N}hUJl68-_@}ZT=z+aE*XEt~UwEx+!LC)$Jig---H1+{kGF(>m7jEe zmCtomZbug6s-M=hyuI*TU=wP(_uq`b&VBjZ=F07B9o$F-*PkGno;*q=1EfF)_wy)A#Ss3q}d+0Q9^w<&B#Z$-;@n_Irud@lCN`&Z*^ z#{)Z?e%$pJy_fg2yxiRKO7ppjvDeDRc0Z~7I`jFa?7QE3OF0w<|>_C zzb}_-+II#lNuOT%a(wpv!!5sA1%{gS_;l>f?c9Cl`1iWLMk{yx;>#cOY`gyCxjXU= zlAxtd&peFHwd@S+vOuWgthlOV$mbo56L@FOHNDm~4hotp%25PAke@=uYXuag^&O3frP7M$7LMx0fzjFJE%OMg6wUJ3 z5I7j!NEgwMsXm(u&9H=wfnhRFeauXAQ=FBKq3(0}z9t4{8Y`hmR#oZ2AEWP}^ z>1y?6)8svjH#_(=rHOI9;9kgT3lAE)C^86pb);I{v9XTo~c4pQX z%Z)|(~aCYf_(uSW?EtE)zdnCdJB3?EZFj&wf}!8ZaTdie@t|ich+G- z-QCK*&AZ$GaO@v-2RaVHZU6Y3yXT=dH>dme=?y3qHvHmmZ~pA9>koX7ZJJ)#sVP=L z6Im4;%^3K}N}!{QnGOQNl5+9eVF$8w3t*lA?E&4T1yhLKKgHS)_&Qw5gI~s#`BENl zx+phlKYb}nSMh_vZXg@L1~3QqaVC{`52!X^UEm_FuUar258F-3%naMsDC@|2aRqiT zpwPI~E+2;HFjuOV^KhpUS1^mQ6Xld)a^oOi00!W)A@zbw7o$2QyodXHKyRAqD?MGc zIj36S9Nd8;_&>c&L**W(CK4;~*a7H@8?x(}bGhq%Re%20^`?Kmd#Kmv7GDr~F9T3) zN6}OFT-Joez)A|&f-C*H3KLw3AnCet9eX-EE=>9mr?b)LsK5Ihh&|?`I~qG3e_)E=M$=QOGTs^8a2gbS{U zNMtPO>gD`uG)1i2E%6z9b(BFY@e&$1Z7ts#3==O_Y&Z~tZM5b9(&o>KjxV;X7W^Sr zA*_O&Vz*V|czFuG(i|L{vf|h?dU$`UJWivmmKpt^&&qllwGY^_=d=`wi+bAgtPYKn z$E{Yu3X8&!7x5taHc$hQpKlP{mml?f^)9sv_dSUChdK#SXoycM5RA`Q2uh<)Q({j1-b``N`1;6Gme zlPP~^N9OJUbXxB2{$k%V8z4S^SpLf)kf1*-+RWMvX4&1X>@`c>Ip2hoO&fQ2cmChL zS?<&Szhy>oaj3@qU%d5;pIwmemdPt|q$`;7!i?*8)I8WH{61P;+ADZ%I2Sx3VyGh zc39{UQ#pCy9t6x4eu*WtHot4(eY7FOhb3fjfm;RtC^S}!pj;KGAzDBsk61$AN-VBB8awB~=6fMn~wV5yTFl(P!Oe0aGwJJDZj;z~c$2 zBWj6DfHS1@(+;ELbwlE|Dzw=2t%myZ()Nl9uIFPDR*&L#Qrm}sIiSPra1VXZSM4(l z?r(qhtKVM#3RAgkQN&&L9C$K(M&>BAheDraFo0GyAcmYn%%Rr6&T=FZ!K?;_ruc9( zZ+0oWpb5kAoUD5(9^k)7B=RbX92w|g8!_K7C1@t5uWGya5?&ib7{uhg6kX=%aLi^S zphuy_Q^>3Ma(mVa`$<*t&d9- zJZCN%kdtj1@`(oKejxA5r`Do>Ng?2$A>|maq8Bng2f8f9gL)+;v{^`z!lYDZP($vN zb0I^D<$4KS7Y45^bR;S!iq76c(K%goc9A(D$~S2-Bx=Rxn#EO)O4F=m}2_ZapN`V&G9G&&e~$!pwbS z*Ec1ffrrSc)7@kdJHQ3Vm^T;(5FXDpm1M-?e)d=aD95|iiVxSV_MwxU(RX;!#qsHy zqq`*n0t24zv>h_>WX2&iOmMJ71(r1mWc0(hD>8snjsRJK)qwhu-W9~VU&9V$ z3$WA#=xYvnZ#V?T7F3tza@EDz;tXp~6YmIznxFtds0^$H1kK~L9)`FW;RC!zYY30> zX&9nJi~?sU{tI2|^M)#6`Y<`KSu!^;BE9Z4fQMF*r)I>vDg2_8283%DDLqKEeeL}hL zF_x$)mdrslvR14(#ZN!sh@j&NvQ{nNM3_O;gnor$z_kS#wWX9GZ;;&u=}!1Nj>A11 zh;dCui-GZRD&}LQ6cJ4Hx8g!=!RmqhnkQCYI?;~ zlWVP62;8LNu$lo%5acLu(g4(&zGuuATr*3SlU&eJ=G174Y6yNI%rp8KyjiZrjf?nz z5`l~Pg1$xNCG?U5Qg9DOvkvHP*kiKAd!=X`Ppc+}sKFpRhiEhy$2NOUytGN7n2l9yl> z>aED9R>m8_6Bi_8LWDT#bX>CGMW6|6h_)W2$hj@?h3Wp7Z0ML1s$B4LHfN1GkU$Th zyJ+lc!OT;ATpKscBO2z&&o?}-hOgs6Ljfv#pn5u}00hPq(2ETb9a7B^Malw1)TS8^ zBEeTcI!5(W5m%2M4S6aw<)eD~(*L;q#j5KKr`Q8wOEo6`15yu?#nEZxRE|4@)}+&K zU@=!h=i(iJk&PpOhnm3)nMK#!XR0^>&l;9|HGz~t+oSQ? zoN8B}etD>3bHg0fp`wgxpER!9#zqJ>GyFNO1sxK;Qt?b9cm4gbukQSBzxoHZ9gB+_ z;~nXDiy_1tB^ch8vPOn20xN^}`(l>gax5JHka{Mq?NoiW7RZY%p;kzptj&w>;mzr9 zPS6WA)=uMErojNqiHH_UrUXzUmKOzy2;;jXc&MzznpCYwF}KPo;me_ARG028$F$0E z|Gj;@_hmvY%;ZEKBHuW!$~8z}u;~%;u(T0)VMuNMldfSAfM1Qeht73^;1aW!aeA$F z@uE*v9@PeG@#+x%)O@i~_G&XozSleIfSm~84Op(53n`Y)QDk{5df1T!n7aPrDp`+E zp*Kjg>BKx4_!cdRc_L{O>K%`dojwkBO z^I9B)T(ep+BS14cf?A9)1;h1*5-#i*p+}5OW(Z70RqJUpfD$$r zsWeVOs}Llmj?9JwrJfNrWnr+%Hd>0INEB0ZzDwX3EY!i}Np4lCayloK`C^{LbMZm# ze|`UzM`msKLxP^NxMo+myicz<9jZ)poa)H3#^f9#vS`n9fG&Wh36;R0*3Dpw-F<5K1PT_Ya@m3g5rFmWgqpSr3+WBb^SA)inT3TLc*BQPrWHZ7pd2Tn4kc?liuf=A0!hM=if9wZ21|mo7Q>-syJ3gyiNb2E znE`_lq$_VTs4O&knC58VKnKLrKpZUs2R-U4$foBuMQu@$u(nM0$E7}GQq59P8| zv4KVUpq)@KSRJ$I)-*tep^b6^RGyWh`$TvNqd#>IQLKollb1 zFlZNk`NTgx{PCat>}sCA5ZD+x9aNj3XdS!K*q6X@Ph3>c20p`l zlA+rLV#8t~P~pgj0$3jOJ~2}^p>gUsU{5gx;#G9RT3#U32ePls)0$}UJ5-D+U&c_A z_C?@SE>vk9#5g`Vqn=u2%7zY(^ za9&Y}&<8&TGu%Y5O$Z2PoHSD~<6<8bREFCfQ4JIdn1bD**m&iy-uc-b*FL)as>I?c z+Rmaf?}Uyph)LZE5UuR)?i9oIwp?#SLgc9l2P0nDw1_u4jUvAcOz~%fi;P;V2rWT`z0ZqP3W8W3}=YSCc+T| z?-Mw(aYW^~%@Jr2fT4u2r5u=_jg(Km={|vt4b5jCMwL&ZMZe-SE(y^X9?f$$N|>1l zA4lxbpgeSB@CdQoBbbQe58z_KCI5i9@Xe8*J^S%BJFbGZpp+w#3~Mwah$RSQ|G_A1 zKwIw9`w&N58w-$l*MM3CVW^OnxcCWO4!Tk;%8jB-w88Wd>hsoWiLa4Di%0kbS(04osynWbEzpyz|7MuX!pgMRQ^y8Sp{Z}H) z^Lc*Aq8*_yJ%qFjdCE|YK~ABYB`{w~SRQ1}IuPDjKpOR6?Ri3m-%uH+Jjx;k=>WxR z2zD6wa$4>{{L|xo938}VFohbGngSdaQX`RrnERA`P4G;h6FAYxZ7$-A2+&amvQvV2 zQrd7Pu`t zhZIjW>MK>YBl}USScRY~uI%81op6Fy7$Y)_5w2QISnm)+@#_f?VX>-7v4U_%Y_YS+=C%x&(z`C>EJ;~J3(;@ z&QYU;scK+N$*^O=ooE)NvksuzHQ~-!b4z#m~WKvN0Y4K`U z`FhlR#bEW|!ItAoT-eG&Ak@Nu0o8(&=TFBK^$3ADunuMo*wi3V9>G*rm0-XIv9EC% z#^p5n34uopFnqw9!Ec(tXpLJ}3mX`*N1!R0*aZWf!9Q+Bp@}i8kUh4qz&|u0U{q%O zJ%PT{zzH8=rKX`rU{csiG}6FVI7~DFxq(TrzamQU5yQd|8+voinE;i5vD1QZa<3m5 zd+3v3wO~HoT11?1mLOJUi?$OgQV(?{TW*y0o7&Oh`CgeGA$Tfc3?KnJAPHU#aMLBC zYmk@AORZyPBe!0M-ci}0t1Fvhf(Q|gGl~dhiL@K;HA$#r6A#fFA$w3Dif2ZIwM`gA z@C|wtbxBhM(z$pK9eCTCGp0=73TPjkgCWiHArLnI6RqwEL;=h;unGmu11wv}ud_UU zLKVmGuu<8DFw2K6VS*1HsthrL*}`q5XcfQb;$A2wF56`?3s8FO>i1Bg=uo&2h3CI? zdkHDo5g&JA3=tEYjw~5qoXb9cV?M{iRW$ryyF~44Y=s*!(CN5P>|+pjbS{+HBG9e4 zg(VJeE5Cj0i;=G_ySi?hyJ~`m=uSm{@*0B)Cz??G62oOS{~h21Tz_;f0Sb$6 z3=vNhI?4S{Xd@8}yrN*wJ2-*@LgR8}EO>4&^4i0E7VV?lF1Rfvs(YXel%kOa;#zckl;yUQ0bW zv1B+@L@!tDBTQK6ed1>iU32T9s|&O+y*NUpd{IGV7BSgJhD4l)mf+ju_^ zP+ZiAErESi@C?1unN16`WD15L-l`b4LXo#yMbh{cC@(r^4;zFAh06CP)LHZ&gMsS? z58-WuhzX+Sb~R=opEMDYmf+fBe2h91d5_nH?k(w{P?L*Ih=Uv%zZpRW*jl^|wY5o9 z0pmT;oHbAhyd!whLBjP3p9M-H^r}!(cno@h$cLB34KI!`QDX$IDs}|CIUWD+Jg{pxA#NW{n zfCjaAfP0~ZqJ(aU7#0*EMFe8u^5mb1x8DDI{9b(H^@7cp0E@Tvm4fZb-gF0=sN1S00h zg15w}$P$JPj3@noE)*QbUj=s&V7kHfiHo?}#*Q?99TbKiU#b-zVVR?8-Ko8DJn*} zMpyJ;*YW*0XcOE79sKcg1MihrPV|ypS@n33d}M zMZ2IABGiVaj7nKl0IyLfSNOS1LYw3MP)c@*04Ozw8$wywvhB?G;!*~o^JE*3Wx^!C z7qC+0QxRbg9!V;qVrz3Xg+<}P!`#X>nAV7)qF`#mf8rXLUyh^vKHP#N#$cs&Y%0Sj zqKx(hIOPb7N(DDW)+kQ%V4(3@_kzoxc>mbW-}~al4_qU`T-M*gZ_1#+qaq6gtx>vK zWq25W2*LHDY2!7WiZt+|%D7qOAa()^OhtR5NLJVgb=XYj8Jq5j-5g)W|k$C=+el(%2B12i|1%OHgHKWpO(JD*8^Z-Lrfv{R7LPAD7 zz-7F5RPm_@hoJtwlABRMPXk|UE!~I0tOcs39F+}%2cepHT?)}*5smNRRWhUeJKt;{ zLkv_f^bo!!N+?!{fs0BW9*bTKgOG0s6bOx1cK+yV5B#TZvwwH(ae$yIELeqzydhx% zmI7+(^gfYj**?<~`BfYx3|kF`SP7ay*=TV8=S;<>iMdOm|U3*YA; z1deypMic_2gBQVvF|-h8BlO|;i%-pI>Jd9IS$HrY{XMKMZ#Ye z3P%?)Wa!x;o@mQ>0{kehFo}>UGGX_7 z@3-Ik=KR&F1Z}8VG(&E92`O|~)Eo5RV$U^sC#>gnR=Epq)KM8Suv^A?7@M%m7P+iM zbm^iH!(Cv~)>h%sj=BUx4_XF@E)3I`aE{;fsniGmD8|u{@d(ZXhMF^dSTKes zo3j`upcl57_=FpkVBtMT5jX=mN2)F|=afTt6LMk1|6NA*He78ZVC z-Fm-#Y=5LuSiC4+-r+V!(GgVsZn&wLVf<*3s|y>gE@OA2#PAq~r=#s~O`0$<46!0XRC}?_k!=M{*&Q~S~B@Zvp%Z^EW_0fRW^?Wk}YRYer#w6uieGGtEW`)hYY%K!ud;{rgwg0;jda3FA)ykFz6G) z)*65YLvvtW4V6(VE$0!-w8SvhM*SI8C~h>PRRq|*UqE71{s^D-+JUikjSAmlHP(hn zFEmvHVp zi^J@zm(w6(lpKu21)uuj1JZIj2GC{M{uK=|XG$z~A68oAhag4nr`p(^v6QeAxg0y_ z*QvgorW&exiFR7+G-0EzZlAT7lX8!MOs_iHne*A6M(IJl4UQG5OTG7=q@2!l7xsl)KPyV%D0Ceke5 z;><$j*kyB-YQNf^kXOOR)Txl@4|Sn1gc&L$v3HISYA5?hK&V`^0gh7 zb@~;iUE1`kH6tIrb>r2TwcRa$(yVic6=Yd4yX?nWxcCrdnm5OW zn8WVO3fhX=v3$ds8o2@g`ZYJ-MSonww2?hAaV5xop!K&%UE-&lsAIsPxX($MJtxRq zZP&b_u=^N5Etg_&%s;fAn3;Lji)n{VU9$iW37Fam@^8e8$5IS)3`mwO?MynLIfKp6 zOjZAc!Bn?B&Nk%qL~w>OmF**up9IPh0a-JQ&8uz6>@vNcbw(1>N+$U|rB7$VhKhPpYB4kG;ECN750(IC*%|L=2iZR4`cbW4eS{DL%Y#}h zs9z=PlUq#T^suxpbattj6l9M@YL?KRHh{~TxfzxWsC$ED9SiTRYhi0?&-Jd3iAtu; zY2gC3;$NmcQ*^9&V*Dd}Y_Sb(>>Po8)2EX+ z2b%QixcTEcsx-Y~z$K{}0BCBUvp=E}%52jPUu>4*RH4}z16qH69o7meaw@35=djBf z4;wp5xv|dUhBI%5y2rM%S#w7gOZxU@Ogntu{D`BkRQ+=*1r$mbBlH22g&l|L0OtLU zVSKNog$@+lkdVI*%B{3lYh%_ICIF09R;=i-gUuI6>!8_Hhw=*^j|oa6-zrHCy}G6 z4Vf!;W*F9qD{o;+4M@lbeVU&Fs!}HS!udcpGE)o)QmLor)tK~1GBcWw%Vh9qSuOO_ z<%8rFx2MfbI&#YpTQfC({Q;>ycn7nYkH*82Nt#1383fLdxsr^ibE(HENMNnULgcY; zjLXSyVwL*5@*II^_0h)Z_R`l5yqi3V5`>}TecqwX4Z z^7eOPxAR@(8FKg3l^5J&?DxCzp#=JxoAKe|fy>>~f6DHDl79$~b-r7>>rX&v^Ijr< z_vD2~F7E=*&bzgVyR2iK|H^k=&Vx$mUq?ZlQu%a+e|n$q`}a@X&x4i+j5e1O>@Ryi zIQVdGbLF(|=MTJ_pTWUr*b}{*3%gEzd)M>eg_+rQ_>Cd{~!@*}NukuL#?q_~I zfmivl`|e}AHuG1(uBR@aLt%f4U5UGS5y5KndSYeaWa0|QY@T~RJ9CUa52Bc-R~EkY z^pzRB+}nlspJtDCW7l0X$GWe~Y`gn~w+olCEAejr={1Fu&s>?In+tEBI{DPTr!MDb z?y{cf{z~FAg{NarbbtN*ZO`4_{?y3(xu>3qz4l-I_j8lS(hnSc(EnEM{qEE!N0&bJ z%+X_P&(Q}<-@5%@T&=PLZ?flw2TSjFhmW#%AG4M|b&UPQy@U_X9qW92+1&>&XGfoT z<03`274c_g8;T5ao_A+Jc=PsS?>)2aQ4rnC+~q&f{X^^BZ8LXGKGFT?%)2@M;r1`x zz9#*C@8sX!z8Sg-d-NijVe%Mux!9$>x2tsb z!~06_b^FKE-@Gui@~O++;7_^xz^~6Fj^*FV@$x_SzQYI(L5jiFtfPlsk@#!*8M^eC0_H`dr#*dh9tfH`g=2rA0B&g z=7od&9sGy8H}-z!)Z4Y+nt49FlAGa-H_uN)esU)^k5)cV{^9xOZ-1Yb@L}T5Zhu?* z&9u9*`7ftGUE2Kc^AjgGzNP)!1m6)hJT&p*#N|H-dp8`oWAa$%e_Q-Z|9a-#bJiV` z&*UCnwz=@Ft?wuD{KNbC$z$&GGnXLgweOFzztq7h#CKg8Rq;uie8zp4@4|;(-V5GR z-XG09aXbI;t>O#Mf@$bF|KZ*rj=q~axJG%g_`=b5K{2Gfc<=>q4NX5+T6xdEwB56C z;km25J~o{qPq=LIKuPltOsZjb)#GG*lx|X&yM+lFnifWmqCzSfPi26-1z+{GYD|*T(-)7dm=wA%{_3U^7 zWIa7YoWkZsW}YaJGrvN~g|Fu_z~?p?bB~ZWeO2DitZi1#*?if((4FP)I^!-^K^U~|qNRnsLu9GHU}%ePI}eHi_I#+#A1F`P zT?;asjYPe}Ra=VPxp1`eqT*Uc$-4TsOV%h>N~`&*)#6`gCEb0lKTx2Fo66lkRwG@- z2VK@*Kqk%fbY1bHy2#m+*EnZSFAx{p+l;zr!BDiG8l1GJ*X=7GHGA>13nt@qKWfRpeGQk@<36eLg4Wz=1@563{HO43Rv< zh7%&La~P*fhQHK+;$^r$5NcLma2nZNQOOnfF?cbWm_i>`Bas2AJG&G4U6&0=~jMB*42dL0Jko9Jn|Lu3>W907zQGkd_lq zRuEjX)FMS-4jT;<4mbjkKLqOmfmXz^kvl(O{@{=Q^3cM6d77Vst(a{%Od9lgrOS-y z@oE-;`3CJd>!*LNx>LH9aQu=ndcx>v1HLB0$VUJz0<4#sDIKgOcdFVQDge+N_%5K# z!4L4F4R8qie&B;|!W?Zgk2e{5l@dJ#*uFmGW+N>NIYJ=o;dv2M9MOgqXGYaGsuR6q zd0;dYUIyX|NNQBQ-YIDd1Z~Xxm$jJO92ES}e?AsIA4``oYsxrlh2HG9nM6Mhi=2(` z>`^*H$zTRaq{o%9ytX~9QJC7XPH&V)B}`It4|+tINU^dI*^3* zm`s$nNZXkf`jU6aY&&jN-I^0`Mss2n0QIF+2wmKSDH7B>a;_QJjDbASre~v@N=(~G zfkaU@;`#baZ`9gr$s2raL!iYXv7!U}Fe(>BkUr1Cgwv1GteMDCq(exldKv^39t=2T zdcifN64v2inG`5C%FQhH9kpJng)1}WSg!SKcs2-L3+T!Ff=dn|;60f)4u*5!19@f2 zEWDx~2o#r3CS?59HqvtsNu00(rCX)r6k$6|U(gc+!6j;ayX&22nitl6py;(Ma9+zL zGHxz&Vt-Ga3$*Mz8Kan{&XZUl*f6Cl`ttT7);$`IXirv}fAkXIpyKQj;jPV^pXr_v zoTtWNp1pvaUJTbtbpLX*2vo_&?Ugp?{a_>qybAYqcY`7;G${8 zQc7)8PU{6I)5Jhe2|4>giDQbNAkG<*E-Z0@iU9D}&1yvq3eU%?fvJjQ0m!3r+;k2* zM^w_)d1#OUX~@J~4L~=OUTwR)J*_OkI*kbvEIyEe`t)#mq7za8;0zQW@cnow+XPtT zh>-~pmDs3~?Q9~=wu9UY0ociQa*GB>B!^fR$gOn*uPLC9_ch5v0l8g>xPBf?=Vd}UFI}^}!#7Fv7F{_QCH8sT}xkN+OG<`?{rg%v`Ef4gZ z8K)fot_X-=Dj#5qbJk$_AfM_fCr_($>f?ZP8go)Bfa@28L3sAn;2jFcbE1EZ(nF3N z01D7Z0voNk*JTvuy#!wJkiMlp;LfG?PbUB-X~=EFAcFAhoYDD;vL=+)gj4T-@xNd5 znb#{RInW1LjTBRQ+5myZPNP*DZ`F$FIlne=tH@}X0IjutO0OS&F(v|Z+ZD;E5&$@J zDdiGzI_8{+p{YX$|BOHk62^;M8Jtp*bBfh)$uvd*rDGbsDq`@3EYY1EVvoq0=)NX# zySPFH;!l^@OkYs_Jb9X36FJ7fWAOh!PMJ@C*kgI~HIHQtYQeW*>)Iu$s;=FgoNMRN3Aw}!e?qd_3 zfD1FRo)^y?&%*^j7qW8!l|9sBS2b4*6X_j3sK8E`^n_W3lwG)h4yk3(4K&5qCR|ya z9=ws-az!j;W-;L1-xOrinN1Li62lJ5ME&a}b65iWdI%mSpa*5$Bw~RDu}iLJWvZH*|e9CAo<-e?AD zRkziWv>u%YHZ=TAK)?fPvSFOlF1_YXwfo63i6dqq+N^lizX;hFeQoA~I!RiUCZHpC z%$ovhpsyOwQm6`!#qy(XfMf5spZZ{qW2+=MMJ;G_V%C(>BW?{onjy9k(epul;3Fny z+JTF&v6$}n(@YG5C5Z_7pr9``1q26d)$!+4p~b++&O^UjB`-^uCo%&aFDn3*E+$$w z@TW28i@iWpmS;gyi4}#SIFE2_+VD z#(|XRak?Cb8A1@aYHOr_dsn4k#fM@8h7detGGVCPMA3FovSJGhHK2TadqX+vPk zD+8=8K&lc(Zs4WM%VG3-czw*xuo$vx3mg<26Zf8}Uel;Xpp68K<3+_q)+z7i8J01C zD4oaXZu+>wW>_SX3ix_+z+Yy7$BG=z|V0^NYz1w zlqiULhR6|hkRU+qE@_~zs6<;0Y{z1TV$EQ*Y*;q9Af#|*_vP&7h1TK9;LcM!wpM9s z+C+1iWo@L*2=vT4+d${b2NuTbk&=N{**fg{m0eyx9Z^K=s6w+KA$HWDPQP9wY3O&T zd6*pyfDTmc0BRFC9?WTj{?5d(&V+a(`j}QPLAeL${9d&kG7&I2wSkX&AIb3vVV*`h ziDYDO;)$%DZBcu0Gf?%}CylgE$J6@|{$hE=RP8CM3DC&mEYbkHNi{iPXuZ+2&jarQ z5)-SPF}${c&vwb-YYaUHO>aQ)r<4pOSsQCiEMd?fH5f7o;;aZZh77LvSfZ1T8<_-IM zK*YhSKz0b(&ICKG!3<2Y0=wSfE3<$_er+s7Rvl}CE|-{MV+ni10G9ru=`T{i4})ol8gwuaUI%Ffr6bH+>IEoyqN zAM`$W9r#aPeJM5ij`E4--}I-HyW?Bj&#RjPz&#dz;b-@~dY(>xV(ClGzcJVf|Bf39 zS5~R%T*^Fk(a$n)Vszi*H=kcNU0fdD@2*qwH=2+AvgBOUe_=kETBWooEA>AM-lIn0 zoayB2%)*rN2wC3Ss@|5;zW{L1<_GUl9$W?boEr1aW!m?(+Z>Z^@juN{LSR+?&@56yu(@4SUr$XAZay?g|29|uSN;F&v*kH3-LNae&UFp_2QI~Hx*t&QGgk(uhIfJLX8AyR zOWh{z=ApVfJHMB`;Wm^!e!0yBn+;G>w{Lh|&F@>P*KO^-Zb$m(?2ww|Ts42)&#_7i zKU$g{+1z7!tmMl;+Or6e^|I;X47-uNt}6g5Q{%nx5HQMRYyl&+_`P& zkMiuHa^g(a#gh1?Y~ttI$@bUO6T@$qFLvaH)^)zIf$SZ@$z;57JsBJw$t2S*1wNkLwJ~Tv(-}b%+P;c z_HX9?f%C}+R=lEopViFl9K9H9(QcV(QNj3g-7n4#IX@?R^%?ai6aL1*FF7mCPiiZE zp1;+)Sk5N>Q&TBW{;2cdf*rkLnCUY$x9_`k=3f8cT*EJ(PSp*XUn#c)w~;S(tT6Z8 z;-^11yvr#J`Tqd2pXWZYP!Fb>48olqYU?^X{wtb2aNYXOe_ZxIzJ9*$`rFs2 zC%*gT;8wQHT?clQ{jKeVUn-Z~)-UycdRg~ns%tm*{L_{9rXE`O{=HW_LD5!DDI}9x z)}I?U;Y7n2Ic=2vuCkvhrh~G<4U(1gNxgR7zeB~Ggw}v@Xw(V!7}GFGj>jArsG0-f zR?nH{?nzwSf>lFU>Ska?6>O5&q~2WBq98Oaz&KR^kHx_X*NHc(rwQP=N?5Q7JXBa- z0A!nJ>N7Eh!BR-33!ULSay*RFhF_}XHtS}y8eR&Ivum(NxQWUQ5+ltG_q-MjE+Ny3 z6BfWAg@wA4-wuplIGdZO32vZP$DG;#n$PH6pFG;0>T*h3^IdF$Axnd-Z=`W?u`ZicQ*mdsZ5@j0~=hYijQ$8lk&Zd0SLs#xO!S9CkT@E+^m;h4FE9+Q27 zr8k~XEQBPkpTpcXj?#~4#oK|?nda_vd!I7NePKz~qo(^9!Qrh;izeSq$ zK{PN5DOgDZII?%B+_6mKYEeJJC8M>L&t7uJRm7E96*iuvBlS$4h1+UlMpBJdt%H%8 zhTr0g@M7Vgu$zK5(r0>UKOHW*ts-pG6}WXy>q?g>99J2@g4{seOs`s~fS0YG$MPim zK~sd+ip*trfGPtBVLz9Lip!E<5UQ@UBO0y-3pZI9o@j&9Qc@rgk3k@!66E;=gewcz z_1uUov{=YVxr2_SF)db)H?oeK!=?7I8nRAC1~B|^E)Ov$)in4`JZrp%%R@7jS=;^D zj-CiH{SQI}m?A_V`qtavZ@LSweeRy^%%uNCI5N?X}H86C$ z5{67bO&SNM+ryrhl8tPNV5J0Xc=k$aKWSaJpXkj~z^-g&xehBiZw}64F=5PYqyPBO zXa4${KbX9#C8F~_Hwq2RUg-!V>Gqs2z)%73F~UYd1FTOrhWJi2jTj1|N|i8DRIcG^ zY`6}VDAKSIF>y3cVH&sf5JJi#iiFq?%ok9>L}eJFE|TJT&PR1`l$E#vX@gIw5<=p( z0&ax(3JgqyjleX57!rd`BMUG{kt`a7ST_dCwGu;e1s+~PX>yq`%CSm#{OAboh}Yp% zH?T|v+s6%JJYoc1BHI`SC*oqv$14?>q?wJVX`nfLYZhjf=kJu3s6=p4c5|{df$BH66cEpS$BLm8fR3`L~;PZfwXi)H(~!TvMs_JM53io&-)$# z1lS~C?OsPx2H6OJR4$B;8x)&zv}1VpW9z)s<#7n68+$QQfV zRuz6hAq*VO3=?Ii9HgIlQmaNPyxSkd^AIyb3=eSFJi{V^AkP%{9Jz&w_?c-tXjY$W zm;KB%>WIOrnYxn`GBoeZFQQb%k>UG1!!mO49%yyJGGl?+%GR&May+ z`m`Dfh~&U6(xeb+1qXTf6L}eVURM7?2%C1?Kxsw83e8E20sx~!)$|~s zQmrIRA0dhU;0U?(txI=~Ed1e?#pV$j-m6u64kwFF@%wFlezta*lS1t^44DUf|CNrz z@v0qCt7EQ6y-5o{H70|a;KA_c>JBZVx+B#!U|+sR?}FajYW4y!0*EcGOW{#1Z6{FL z6@HjC!9D9cP+`I6g0$-7j)sntzR=s&zDZxDvYY59YNFyYQv`%TgF2wR>9%$J@!1** z&;DduY|UxAcII39SxbMLw?xq$0yI zOoWlsQd(l3IYi&g88a9{6+=Bzn_NK2FXo~i6^a&nM5Xa#svbG2~{XRy?^B94n; zoV~76=R6$ik#jXtt2(CeF}O9yTAYe}8IY|7L&Y$Rz)^KFJu#pS0b~H6((e+b7ttdl zL^wgodjK*=Ou0qTo22^cdgsufHq>)Qs~}Cs%lRe%&|}QT3Z{O#<9E`aP%!PnJG!g({h5&K@E=Y802uX9!* z@Qc5pNh!P!vL7+)OdR@QGI=vot`a!y#BUka_D9C3CJB?FhInN=n_q|cPFmzCY=m{#*+p!0|cQF zXKcEdJ0DJ|Pk~dAs#TuqP-)t_ErBSKc_F;~`RBft_}CBs;cAk}tiLtrH5#y5aJyz# zts`6cX$<2n-B) zkdCo){0FTVoHs=jpp-w7(}sW`4f2(;(F+5=OHA--h+0R^W5oGDVi2*ELEO#N5NilN zYnJnIkxNYVc2?R71FZIC$YIZ8X7XJFX>c9ijIoo1y$kLXH+2xuO` z4;RtL5F!)MvsyY=3+pb6nGtW&)SEj_ayaR62g5jI2GPgCn<;~JSA8Y}wS#H_aJ`09 zF-I>$Vi0*8}QM*(qK|#93@FP=A1h@pMtVU?VliK zQgN{tWW_BAKwhLLL6iIBMe{uLQYV+3lg2zb81gt|f7rSX6ImzRDfJmb3{o3P_&+dh zJ!@V@Ao4cr*!=r1DQ_OVy22!yU$vqPZkBVY7yW6XhUu>ayUcsa?6YT;gH?q$QV;r* z1SBSd%`?Qh4g@KyYA0{V+`nm9p^1Kf=a+-}X>tRITh1yo2!?D+X)boBwJAPPT+pV9 zyP9&Y6MNE4+~W_%E)Dm0Pt_Fi?aecB(;o!eivvQE`w`5*_*=-wo7eZ7VIdFF79yS6 zw(nM*Ot&KtvAS3vzX0}@bqJLtR^^7$zaDn*nDWk=sUhozUUw(RS^m&0zzLNft z3M;&>f%CGEy56Ck{)^7naU<4J9-VH#t|597R5-t%bxBLG>q*rgyv1McCYqGU2UXBA zT=R9c&^z=H_M7^t93mMs@zNp#Oae?QLp$*YDBj^2WswL>2PVFBqY`ebL z{q^=jjLb&Z?v-_?|LW9Q5nlGx&+ z7Dm6Ws)gUf?m7K)sn6fA@OWosEJT`gBoo7bV#}t=)?&6S6GNi3jm5bds7??vT|6it zzRbS?-$-IYz!3Qs5o<+GE|U3MF!`)j3}Y%bQcM~1*ec9q>VtbFCL)%}zneCwQ-nP7 zreiR*6UY-rNn6jrMyWup;- zNUO|wSFXwGK7hbHV5S*~#c#})4^m|L;$WJGSv}c8*u9zNt*A6C+3kja@kk4tZf(?w zz)8V!O?X;MiUVKEU=aep9$4?{hM^wN+%ts0HfDkBtzz62MTzC}eX#LV|< zZZS}JnanPla=4a0`rxns=lX^02iV(17%Z^{wv~>SVGJ9f9!S1m&?!ppplp+apIHoC^aAa`4=1A|>3qOiU`Jr^fRSU7 ztUVqyI0DJ9rbLAF6Jk1@a;7)w?RVC3mJlaQVa+7cLgYG8AcT1fh<+B5_0 z+$5})5@aN2uvm9~YQ^ICa~5ecNxw4w% zCs)_K&HAL6McxErO`xA6mkdpfvyxIw`Vq*>W{bu(l~zl!Et3`!c6pd@0GG006t zYHot(x6*XZo7G%sI1vMC@pvlVluGyvjls1gVbEEg^`(>XVRsnRhA!A{8ODisDV zPur*-(zd@``zdf9YI88LSzPQrZpd6{GIjZ#eqQBbqgu%r{U&51#$Jcn0^_A(x%5=E zrcy9mV%%`q8CevVBd{4A@=28&E|@dZo5d#SX25z15E#s(nQNN{Yos&LYHsI-RM!7u zuI>b~DY(1{V`f76pC-hm1PjK|mN7)4z>A_ihZJn-6cUBE%a|`+0%HrdN;8)g6Vd{_ z1uiTt3HB__kMh}4r6MhqTQ5^cqORB~R{1gi-(|)!EQm6vME{( z`IyXwi}KN5Q7Xq{n1$1zQ@Y>^jlm~SuS&;8MA4y9^7TDnl|d8~=y8tkSBzMv)K9wR zYJnRHl>+c9b1VyO3x?OObha*2hp;Z!C_aV{bgb$-C_EwjK%ul4T#2Uc$fcI&76X=; zWe4J32NEQ>P3wtB^f+M-BSwDQ6t9PSVCe`-*-i>r(^UP~cA3k^go(VNhn0=6a51D{ z#dPx^{fi4!`L62gC9Ol+=)jbPLK%dlH_WMNq!=wKl=@BtS1mX}O_B+1f*1vgbX7i- zYm^Um8Ekrm#%aGRrtIT1V3eLa$?_+A9_T)BnKswAbtT(e`1-9dWnC-wbUUP@JJ{ob za2BJ|a*CgfZyn?w(1n~+EF}^pjA`pYo*B?3&?3}a74D|*J!t*xH`3kTU2@e-I2A-Z z-*pTr8c}PatTeYikV!c_c&- zK7}b<-?56Ky#=ADG`$mwxu*^D=avS($qZ2eXG8ccDZVGtk$gkw4*<#2drHNQ20oXn zV?+j_NhPA$RBfMg<`oRMS+!XV?P)~k4)E`Kz9Aq~_7Mw1nv1@cXfZ$R%;$*EsLF{@ z!dabW65H=zBLE{O$AAn?Lmdv=a|`h*z8OKm4(;21WRRt1GMc zN5+4B_!xF9{!|WBZigsyWkW(BU(ki~DyIgzim)QBnHG@P_B>1F|${_QLu#0adrsi;w=g1*mgh#6Rz07z80TCBre;=vMZow-65G1l-S|$SMxIfOfBes~r9c_6Y5I0qy`O`1{#m67sSh@f2{=)k%ZoG=H z;buZ3F6OVZxcy)D@UOqSeMnM%_kb<(oBoFjKDhDkp8Ws#ZLx$`i}$-{E#6vdtW@9c z9>TYUZ{@$;RQ0vG5A3GlmFk6|7ma~Qr|$NLmhI8Lu59j~98LUOooP@0M7dlXt~d9r z`nvMDy@@k}lj>#)0te(C?*DPk1^sZ7{@H2uv->Z>LESu1Iq-DVErxc}l)iO;HqR&7 zPLO`RwLMtgt^uELg#l*q>>nm4)#WB#2 zv(BA2Vz>TZ+D83JJ<){Ik@cuOy`IY{`olb7s0?~ubfpdOp!zJUtk`?`69br4gon^JPq5gb; z3BwI1jSXiGb^d7S%NpwC4KTR)mn=Pn^obKj=eecq@0QMM-(TIc=ekG1oUq4oPZ~>> z59A-}sQVEP{Ng*QUp%WmIya?0`ZE1yf9Hw*+g@MFezbIu{^B1xvp-1edGOisM}Gu< zh|Wt!KY7Sue{?aor{Npw-<(fevJlp>=-F)NrKbKtUPT>=>|2TKOlxf`@V5_2x2hmk z>3rjQcJ}im_g3P}4BpM0GVecAgZzX3!9Q=mKl}MacF5d6)o>vQE(G@u+^Ti{b4UN+ z3v+cZ{Av6C3yIHJuNt2ovVJf`aOBTBemRg$B(u8`4_MFs{{G-LAvV$16`7R_O z*4V>bI^+a`+?c4ZM`D$#r$X zuN(4CXGfh5--FDwA8FS>Q@WyK9*sSRbrgswBd4+CuoWHAB~FhMiugL&ep+E?YnTSs zH=f9qc*#l7%T3PUEl!xmG^kg05_3)ieWQkLtBHnLSY-+9qJ_>Jrjg59THHX7sBZ=x zK0DPx^a2rQ-OVkmD_wBV&#(v^IbkwjLshuR9B(UWl}6jr34IqTBg8wsU_L z#ef)X`LNcj45uI7@jIVCtacZ5>f+(b{txZ=@OdA) z!Q$vt(YP4FKCF)agM$CyD#AYa#Q$P&`v0{pEZw{L4?ezf>(y*fTf!1=Pt5Rg;l&p% zoxtOx(`W=og2h3VKN5%_{13n#>VgkOB&7CcA8* zRGDGnknLXzO}sWoQ3+ZVLC@kXGULnm~x<^-9P_elC_aArDKMx#`LJEVjhfipE)Aa+pMlYQVPimoOk z)FP7`6s$(QY$(FmAYN6Ai(WVZFJmL}39z074Ksoa1G|()v9Pq(P;`O>kieJw`&3xZ zNP%$bm-wN!n}~H-cYef#TBt3GbqE+5n3AH=kuz>mMI<0GP^WnFA&5Kln1pJ>s%#i? zC?3lU!iqB$Kt5P;R#d8dWF5^Zr%Q4{%2;iKXv8GF0ZB(=ZuAurb90J0EI(oYl5j@_)Ma|Kl;cQsV!ci-1D&!FIa% z>(}~smp(}7j>jUqiK)x2u&h_AsC^|6^Z-V$4+uYdXHnm+Tr4(=N+TLcGYJ+ZwL*(< zMbabLFPKsT9Lri@&!CSqclc6|I2a9mM`lSUMj8D1m_Hb}^G8hYB}|mXP`-qyk2x5Q zkZ}Y63=yeoXADHKC8QUzGJ{ux44$y1M%yl}P%m&G9`-9e{WZWmi!@kLv*Uz{WM3Q?;{b?bf;|toV%n)832I5^ zFcxL$<$R3QUVD?A_Q4?&LAWnj4HU###UOrC0luX%Xyq*+9z-K;Q5k^+ye3@21_P05 zfK;kOs$oZ(B-^CSJ<}zvu(U_qjFOpwf>5=v(W#CC&mv+KT~Aha?6r_l^Js|t7r-`0 zDXNHcQ=@pEP$M#k&eVm;#Pv`R9-XsnmJ5D1_|N_7!u@xA&}>oo&r}g>J4G9nEHExS z=_<$bQ60pL0NsXgzr?b!9~*p^b>`x=YsuPJ25>)3KoBLoouDVTzN`zIu*3|>?@EZd zQ*>S)lfY~rDi_MqcidR)SHH6-EU1+H6gfdQ1F_M^+^Jd-gE=~KZ5c> z26S7I9i-_;5GAq)Xc`&kA+w=jdswFfomHAOJsx^Cn75_);sIGuQa*73%PM(oNU@?K zLH1O$FA^c-1?a(I9b~Lg?KV_O#>%)~8~N?8Zd&-;ZeB2Knd!h2_Z;VW!O0X~vE~Lzx zD+EdlmJdKXR|ZOtYf~X6;Zjdxo+%5Iv3fdBGDg&`5>nkXi}WR57Y!XZig*zZSczhL zR8~>k3TzA>h`XWw`RIgVn_9@Wb{FYS2}U~?$V-B<)@hUxrRNm_JbRf03JG73B#Mv91b^49h6C|?Le&Wqr>R>WvT|H4=# zSm@s3LhTpUOnmI__77rP?R;3|+u|P>nfgbOALgJAeB5mkzB3NlVk56pC?77^0=L+0I`%q ztSCkA2!ta%84>Cb&0w1D=65gu@h=zt`2*I{VjY)@urU(WKw7Ytz<$X+(u+RBD@SPT zg#gMnpvA+aXqRBo@K~FSsHmd=QK$-aZeu;fUUh zn_@Om76@RQwi3Jt-=gzCzJ`&Jc5;}TEDz#^(Gyd`po4>m#K$B@NKU9@>NFIC~)~@mK+|$CJ$ODKV%+j0rrGH73~uleY9Q5;F-Z4GqLV2o=QwODPk8$B%@t^^95M zDmKcfb%%q3hT%c!v@dr9tQ>8tMEq#v5$Z|F%d7tAGxvS`i|4O~B?Pn<-vR-B3+q|{ z+DjlPys87fUm%DAp%0>F&=mO3_st^JP{VIt>`Ghr3qZr?nmEYfN?U?_0mjm)NTb8y z8DZ!W4rC3L=iq+$f?BmPfr|2S;4wkSVmDfZZy~|XD8Ch#SP`?IhcDtR75Yr!*xCPe{?zWDTm_WH@BqMK081V>MEfw_Pq!gpHZ0V*tg<+D3V@~T0gV+{ZsWWU z5eti;_32<*1TE-^bwPHDn2mG!Seb|+C3~*C)M%71YVj}^G|FDP z%ea~Z&w+hS3$dCQ3&lpjM-?U0g7vU(<^Q^@EWFWQ*HSHaO`IW&?GO(XTJI6p z?@%Jcn8zV@KeQo`wrs<31Bkpwui;2+SWF=bJACk}G;ll5VJR^5_?WjpsEb~N&DIL( zm-WFYkFulT6Y#u@|IOR`K<8PW>7Abxk)zPrttDhzFbVo&ITiv(nBs+`O)V*(L1>f& z8w)ecOazoJl(s|2Lc^xrwLbZC@?qo9##4Ibnz8v>Th?U1zpa@9%o<`+48z{r<_$_N)${B)^hn@x1T#T-SB~dsbCOI@y<} zO4Z7$=^J~e>5cB{DGwj#q3obcn+afD6l3>&>0DsZ zCO_QOfBjd6%9Ed;(){cG>hWH1H~i|SppUUmJ!B;+4!RdUh1cqtUKn9J>xO%VX8Dzd zc*KvBogZ1>eMP0Z2nVhDE7y=k_zgx8{BEU_+-`ZOdjCS#)kBeyPRM z#H)QD8JUpwt=xLuU7HrVuIN0@5dW!F(+t91)qO?RH6Iuq9^5`z9(@JozHIX4;f|S( z@@VDw$im`eZK`{CVsA%v9ZiSRUB`z@<-sqL!z-2khPThdUq^>|y*!2(}f4dPd6 ze;B!!Ur-Y?t7w;MiPIyrl?-p=MEcc)<$1f6hl1Z-&j~T_ZoWF$QL21%Wb`J6i!&hk zgP-ZWwv5XzRiMz2rr<-Z>-gxJt~FKu4qF%&_vpxfJn#=sU-J$9M0@Lnb+w_FN^7?D zl!i-NKd4hjCVHkSm2UpGN+bN6fg0IgC;C1(Jkha0(+=|Z`7WI^|YH^LFj3eaCFjj%em^5Sir_VOJ~YHY zxKcmmI@=ejyKFI@yR!bhlbO?I!g=7<-x^{!HOOR{>nu6h%m(Nnn+}#t+~T>^nZf594j( zQhv(9A~%FbkRQ7+^$Vq~<^B%7e7u*R!U$yh#xR_DqKn6#f4kH(Qo5dRXZT5fX*E@? zokM8%{?bj|J);%=503N9@_RCSbc$aE*5`XWhIRYC`t+&a{?LQ}kRPnKh3?YC2iNdZ z7H{ZT)EIEI(%lmsL*FDO_O-sjPNX-vwvMUV#FKp^e0SgI*Z*s5@8l~(Kn$HWHaR+l ze=2>dV^7D;jPquldtSM>gohg9mmInmDcp|+Ug}y^>AQp55_m?NS zhJ=0gp1T37-4NXXzOd&*3w_vnITqjY!A>HGV{_3E9CZ$^4vmG3+)PagPaZTy?^^Yy?XJPn1 z8e6P%*JdiC)e3**+OhtPQs6+boN_P)-|BGo(lX(30pZwilIQBnl6W1FPI(sKN zt9&*{a+M9KYl?q#O_v^09=WcG=THh0y|47V0>4~)PnmBVEmbQM#8)M@F^&ABO+5Jb za63K)oRC0 z)5BeTpYQA5(>3|K_fx_+$-N=cfyUyfkSa1C<58We@=x*~|33d$Jrf^dztYCayzI}T z>n8iF)dhZmenQOU(q$cc@DTiz{iA~n3!a$jy!Nr$Wd9rdU$DjU_e-Vc_}e4mtI|3S z2x3uT@rlV=N8bW=2?DB>`fdbK3yYih|DL#mw)O7*8AhtJ#V=I4h6X$Ly#Mfj`;*_l z=&t1IP>>-jaRzs^p1S$GsEWx!wE1WUhCnw;&Jc=gHB@ml4M-aCfx>M51c zTSE)WJ1(nUe|LFkkZr2gHQP7cHMlsp$Png^xkV1&>DO`18Zg~op1pB&cJ+xGaK3hg zEobD`>TC~cmb+K(D!smK(<|3>tohWFJ%dxDookp2)W1YDqB>G3hnqfJI(<)X`K8|D z>tMveju$%De~5p6;>pXdEtgrjscLC`wR_cx>T#x+bRia>96sK&w5_L%nhO7S$9wvZ z*Y58BO79)CDzfhYsM_kkve5s5h0%`5JGK(0eR6cw_gM5--a?gkz48j9PjC9r z9&XT0T~p=1H&yOfUAwX8YolMgY_Nkf!pej(`zEgGTIiX+kp)`cy=MA1=^M9_PDSTo?*Aqy5{z_l9N*+Fx4;q;-M0fd(7gMD!wVG- z)2dFC!Qx}gU76@EZ^d;0hst7S&y5TH%ZC`=`PZhuIsDd5Q_#u(G&S8R-}k3eXKvi| z;9p*Haz+N_Zxvf^{Yuj1=6hf0YjlmuP?1TMu_G=-%-B1jJ72Ivh5M=H$2F zyZJxY8-Ld4RU{ueEexCw*Q=HA)h=;lzc!6hKQS!6qqM}|)W`TXtUpyHYC0D9cK)EB z&B{%)lg)PU$ohBIB-JOng7WZ7eC=yj@Xh=M-X{7xZF)Ta;=-^gbAGCRvUZ-*kzMa? z`1hyh?)AT%e^A7z!jDHR*-t8!o|!23bBDNwDCQCE5vQ~7mTXP@?`FRnf1cu1E`92f zDwyI^Ey%*?Bqdlw`pKo6_{p>EWSkpV)t@W8q;c{$)+hdfkWu)QRp?ycr&-)!LR{`$hw1Yp{=`W>c_$T?r2fO(Wtpv=%&nXR3)Arue zfAiGd5B{fD^p)(5|AR6w^hixVhMid}QPJ0@OGErz{>RJ1S`L}PA z@HP_uoe6@YJWHHtG0Oku;G~vlgb98;IR0Dcd-WE6nTam_WZuf9nU3RF+ZxF=NZf5LC9AH!46>h$T? z&>K&Ci)s=jkjKSVczxA1)O&i**jp}z!wAw2jO%6x+qFdww#^Fja1llp7=18)d1z6K}q z=fSQJap13L>#_U6I?i^kn&hke1Nyfnx>*E%JN_1VuRz~nLSw!a!ygRfUWPZwg4f2?CcF|5*a6El6wWssy_J^Z7kg;)D; z;#aA$4!vJvnfQf9yKX^1kg2cgo7f@v8xvg<y9WF9Q|u=&t5>=I3xIxPq3vEy!}|(gMH3LgxZHnybD1`+W$JZnBj8)%9E>5zrO3 zDSj-G*znfhzhP>SzsIiBgTmrq6QbkX%3=N`f`z9y?fdMPKk(aMwr}SDYWi(*x;{VE^=wzUii|AH{_882pX{?GTk4p7s=qo!W9qAYOC1XpLN$Ynmn>aRLa-&Z^7hgz zq+D;D9Gtv=q&8KZ{QM4bcKi?bZ+#4^?q3|8WT}>+JSLxAGIZ@!c}MxCj-m2RScnr`k(>#}@!Nt{;k*U5{ z%O!TU-|D?}NHGv)Q5GH=BJg?X$dbg;>h7f}r1oSt69T7+B^>|oWgVX$UYPoO&sTfi z8bS!&d1C3##g1F6-(3Hv)y2{3XxC(a>B+m0q3`Tiyo$fp*;l)wbN!o>uY%>FyUGaD zn=tF;Rj>82oc((!o4=*20way~z5ep(GP11t0!ihomis5Bt3%VHwZApB)ca~5VdlLZ z`#7q&69cJ=foJ>iILT9XNgEj(GD1K}u~3YYG1?pclLQD=_rb zbl0A)i68e?z|P0G~WEzXs@JbX*Jvm%VK+S8nMUmC=CEKYSI zM2MI5RM#wW8c^55bT^DSC7|v2YXKFG=!;J7poP*MJ2)_Pu9xi-hO;B z2B7KhHd&n>>93VLE}z77myee#tG?dDJRMG2n4}(v2uAg9wNol+vRv0S z_1JWIr1F7RBPS}OBYV5n_wq5&lK~dhF4L~^jvS50OZJGt@j|MFq2(t zx`!*Hy?d*Z&+zN6>Ycvl|LbpF+tWq2`0hg^RhmggyDsm0rLy9${^Vkn|KrKtss77q z|9EktciS|h1`EG>tuj=d9Ge{Zai!Jo{-}--8{=(Fb?H^wLqpy_r%|83jr~h5=^8S5&>+jwEc;9&M4`1oOadDi91OK}J zeesx+*4V7N9Dnh z-z$G%`;SH*UGs03&y`0mTi!VS-2MAMJ^ZPWANKrc`O)$_<^N%%as7UO&zY%_D{E`+ zu70LE^V8m;jr-TJXum#k)BD4Jd-RDl=h6jyZ>qZfdp*DTkEY*z_4i-ZV;lm^6mZ!gbuDtj1dpEL#kA3tvMt-q8 zF!ZC^!__;UyGAQ`<<~#;!ehU-?wa>{uJRT9svf}i%C)WU^&I30tZD_{+rFqL@O4(O zR}bKokJYc>6Z_xU|LF8BFW>o3t{?CDS-Cd*Z~EVBT*BvmeS~R!+dt?_c;(Pl&n)ii z;Zpg}wtso~v9FZ({PUTAHvO~3{U82Wji+$t@xH5jKeM!FQ+Nu$amT(Vcg()WQ+VC~ zIQ7wO_7J{(|J}V$Ouzpx)*Rud&cb$jJO1YQ_T?SFy8Pym?aOaIyLfJF_3U3>wR-mC zw&fiMzOcOGJHw~P*36#0nvUbiHR;Nd#(1|(xcn{xVCon=Xt;L=+g9SdjIHLhu+`z z$F=pZ)i#`6di3^7ZvTGmzLQILEb{sHm+qS@-+c1*M?d%drRQI*9XYwYbYyPw$8*a| zqnp8et6@{>n)Ee;jF*3Le{;Yh5D*5)I9VX6GeF0T93-F3e5OKY!v?UbWvjQJX({f|WYG?dqj-b5}3%E&9M(>H02S8@aN5eCg5c zmwav`pKVck0x3_Qh zXD{~6zA?GnckF@Xz8l6)?_D!{=J7S*$`-DCXYBN0t{maY*5$ra?=JW4Jbe1l6|-md zT`{}AXZB3xiq{`{VdkB~%l-2&EcgFnPyfJ+-|ZiGVd|a3C;I1KJkfty<;?!ErJue$ zw)CUJCpbdn#OP(04EzqC@%rl6(t9VzmadyS&HKOL_3oh)hxnF5e9QBlrSpXJ90^Yp zkTA*(zuJ(nr2z>8+}j(5-{SrG|Fi%xd?={0SJ0;K)4SeY`^5@lY&5P{j0SNKw$gUhj)B`>02jXzhm#xxjR3? zJzib@+-iMzz5lfuc=%0TeV^l=eTjRSy3N9u z=om}H)-cRwu`b^%*gkZ{H;efnE$`TQ@GX{S-j;|Daf#wy@rn4{pWQsRw0SkK5GDkT z>G^M+n7(a~9{=~Zja7e#3t+-7{6{Xv=YCsw?)B_DG;X_OKtKR184$WYd-6o>!S8Wp z6hK__`lGjR{V{kr!s{ij-1#?b!8Y?@^Xp$9=E`Q@I==hl_|ES>`QmWx$W7mUl2r@O z{R4e*4Ud$$!qfgEt{kk5&j5iLLjs_9cJH~vthgg#%cJ#35H=hM-%5~hC?Me_kg$68 z%<~}Ov6*v+u2?$r2Uje;yqX996H8~F8moSLOdpmutp*z>Zk#`KVw5ZIosAFvd*1^a zT$~3Hw{^|)`19EzupvZzV(aOxW2Mu7Bc3SGWWzhajgK4NQ0K?EsaM%;780H|P8c^% z$ZxZdaCrd4ukJip1sivqvJFrBUf=-U>n`*Dkp6jaZRr_qESzv> zD^3t9iku)+I7_zVgsb6%t6OkF+$}c33F`wVtcMdIl8tb}#sY0_&Y=Jsut=f?hr&P( zg}D|`fDIlsDCp@I6ac_&mk1Xb6h6k5(e=4&1cAT_5Ayuqx3vs7mVWZR1PXoS&j||G z*F)h*0)?A0C|tgHZUzWUIj?>uP{3iX@bH6$pTPzn-&;F!=kk-s?p*GJGtWG}cJ`rX zJI8taMFzU^;+lBnJXc`RGyATbeQ4jM--Z+R7!vk@gncvTY9QecK|)XE%*!BQzagPA zw$!ud%rkJp9_NJk+y?}R69B|@TTk=;FL*^x02Xr6bS1& zpWx{i0{EQ;h)1pp&{$s&gaLq%Q-XkS00jJsm_GtxX9k3zl^%X1Jo(#DNv(ijVhDX? zTFHQLLk5HmjX*#mwWEYU^-c+a0P+nkl7vK2MhPZ`kVDNWL9FR&G0~4s3BFgDeiS7f zuq9%pL#UK@U_SZw_lO~VVtKwilb}l#nJfI z?=D?+0un8XqcImpeX~C-BZ+uD14%#tLI#ihyFB)bffB~2m-~K|FMt5VktpGD#L+f; z`oA-J`e0EUA(wQ;#nJpbK^)aw96<>$7$pb@O(_8&AdI3on*X*4AQeXqKoC3dEdb&F zeA%>7slW)M1qpmr*zN>`W4r_e1OOZ05&l%%?&`$R4@?|=5^=QJTtc7#`2$=6UZGwb z%{6lg83pVNE+KG3a0xpTmynC2``U;j{6U>K`a+aKnZ#`_jtmJc#gQW+5l31o$40`M z?xdU&%t^^6oXU}41Q56Yo3OcP6M`#fX%mD5w+TQ%aw$hbq=ehC3AdX%I%(?Y_Dmf$ zqXg6uKS$~)kZ7)sZbuzCCCsdzy?pPv2Y^5{4xht(p@p0hc>ehm;~=*XD1nC>bMVlM zMhW-VQ^GE%ggt>0o;ZwS;PuPP9RIld;hl%8PaImt9GFjd;ky`wsdo;YkSvNm0i6_m z0^$&6;EB(Cf^h<>NSt6$5GQQe>4~J{Z$8m#$CC(tI=F%@2^7`^D4gO7JmzjNfxpK;1fVZ(I-F??i0!%YsLz;2gbli zE`oJ`#R_NuXN6r3g^igA-e@9teJ+CiKFcy2E5HZ0C9JTM*ii@;J$xao05^E-$XG#^ z`S!#z=TP|b2Fu*Y3bM?mk0KPfn-_1H1qFZbi%?L+En$V77GFz@!upvQJaT=Mu)=M| z3I>k%ABnLd%yR4CQBfZ?29KJs0$8}+u<$t-NZ-q%M<}CKSh(Jvd|`o|#G^+pkX|!i zfKiq}QuIgy$vyMxAdrrIDf7&rLh&RShGO(c0_g|lnG>h5CwB^X=BLavV*}hX2Q0kU z&NE*UJTuBjp4qT4hiCqm_heWYZWSanEJzPUEO5W;6jB}}bS!KH3w8H-*%T4)We0ih zp7}omE66inR2;SFnW2KPqZQ+*TutJrW7w#+OJqE`CD|_QO1fQG95vZ4>Xzuc?vR5( z`p*D`v85a5f_Ese!s#8vQE#_6YVgc+jh>l!n}?4Y1=7{pJDj5JbYfu)j&OcavBM~OmGsNrJ6N0vcwg)~6;2=^c#y>l!mr17^= zNLvFIV*Ci(Ob$lzqa#h?M`jkb=Vn3iBd~BJngyQs8JH9$!OBJ7ELu3&CaHjLc3Mb$ z^D$81zS%>m!8ac|E#LgSB^92*H$R^x6{L`oqymWrk_u0G07-#U`R0Iy0XGZ6!d&wJ z(obITdV~TNc3XNaiI_iafm08q9^ejR3S|=;l(4Yi_j#w81%-~lf}$kBCK(-Cz@Wr|al4HR_sVyT&N)|0!vIqd=W`R3dXBN;*Sp%<0_muQQVF7N>M^qb3=}y%6U+jS|9cpQ zEU9pb5(*MY5=d`g7Pg(1KsxneCXjr~Q!I6~hKbIysM_+b3b9l{KxRR))O8`2nh4<} z(d-fP^%gN#2&q25hFKtxl!uTk(cH=`*rN{`NHXNe$jw51e(m=nL=WtZ)+Bu1RM%;K_SUE z-{!tqtYE$wG$_BO2-5bgKZXzr5hMf>NZ3wNp(v2jq=GgNkwRY@K~i*85v1C=gAzzN z687d1B$q?>+;4H)jAbCE)F_aYRCvKSVPB4f-?F5Fknpl0VSh-k%^$`#lVuhX5JA^X zDz98fuNABUU;G3Ta;)^$-Sq(^K>$uj63xegK2lowSOSEr0}wXmNd*Uj%izX}ipD!F)U<{d(*^Dl-_>b$EXVn;mwiXXjj z;zok184%`9v+HL-Q2eMs3Gjsh;q)K8nNdPvzY`u}dd*aD{cSdqI0ZJ~v9orY6-s5J z(|&h={cdd@N)5r0sE*cRntPfhnw#d=!~xqv8o}~wS(f38rj7`uZU~{&90}W-Q-UKw zd1gm~YLB>yjg*ie0on8>-^22>MuL{;>JVGr;+sW|g!8^c7FN&_IVGH8iJrD4Iu!+E zMhOa{7AfJOEPm9k_{if&krG1jk^I802!)VUNQ;jwzb2#blcHw6I{o5p8*>;EiF+3w3y&Var(oVU)&F#R~0XsV0wLf|hl7%CMzaQ29}- zSZeAN6iXdbu~C**00kaP1q7K>;Cohb3dB<73jl#?6_0@czfzEp$~6OmXr?gD%DlA1 z!lwER+e-4N4hzVmZ6U32TZ3ti0i*;A(KIJcp&`STU?BvMq>sWPD!Twd1T4JE6|x9m zA;waL1uF4CPEvnFvUx99fDYcuSnAHhZygG$HD%ZikXCs5Q1#p7n*Xp+euNsr zFsSI_DLnIjOR&i^UlwxBc!Pu|pn_P4C&K_w5I@@WztU`>x8tcH+}+@rzY`K{y1ltk z5Krvl6eRSC#itt(& z;z0#oeKZdTD8U9D2pTd9hJ**-R`^H>wg=Hj!6+!fRt|-DZGjMY6rXI>M}ZVP$}olY z!9+_JB}oNk7N~^l0u<4JN3*;ux(Q{c5|x$2q-wx`-~J!FQrf@l0qA+(9|;v3cMl|)&kl>~{slm6~EJx^ZR4YkUdM$Md zq}MJYjw*Htz_=lcqt=(C5+Wy#+DaXbHxy?}9ifE+vBM48;jjn1GIhk2cIv2cv)IDp z@7srmnpKHc+$InlLD+PeG-4f`XUgk!kim1$PP#1@{hu!V#;^_Dr)< z3UUfWUj+pZq$W^sr+_GOdGwUYqXE)uP6`e3C?N&p5%ouZ|Kkw}al^~wsL?cADW1fT z?r)SwR+HKwg5mtAj$8yMNced&3NV2eSy=f|JrY9sQ8Cd>jb&3L;FhVxtM>`vxzCUQ zHCU$TO>S$31a34)aN5+T#m&M3Y$UB_1S#;U$5Hv( z-a?`|$tXPAkWl~-#8FkQy^9x`J7g4|zf_fY7=*sdm-`0f6AouS0Zvex0-W$|IN@dE z1dpR~C1ez~hVaoF1x`pZ3IKxgqe(3D|Glvu39!K@$3jLSMS=y3A`)`Te2P0BjY6Sg z2U{2`@#F^s_s8&&NWp3@F0?$`#a5>Wa;MM^3PuWg`ZH1pP~bvN3W}sYh+BwG zLFGqvkyLg2HEmvVeWd0!wvD2qlzY~dad-e@01iS-eVxZ0{SofN<0$)`38m#c( zZ?{P*Bz>F+BpHKs78^OhjfVXtnOqAr>Wfk)FwHE0$2%)ZL$J1-v)H>G;0HReuC@HHjd||Ovfk4dJ7)#xFr9y0qrLs}P z_>sp_GwQ7O3Y+ry(IcUe6C>QRLR$|#CK;WSr4@o?;_u|VpjfK)DtIHOd4-^mVl4GS z;z#0zJilh5GAl`X%@h(rBgImaT0Ejnj~8n3q=#O#_>n6l*#}ohr-&aBOO-;}V`f3I z)O}Wq_i`RU%83D{AmRK|DI~JZLIJc$E@8lnF7OO3J2~(7sf~pS?cJ7OD_}thHen#% zXA7>L=St)SyUz#m`@A-f6M9-9Hw%sZYwZe<>iXBrEVSi?n^#CRdjv^&1)g(Zfmht* z&_Dbs&9HGrSQu*;K`Is?KTaw?YU==c#>I2dB7v6s{9Qa!IAw;QHD@j9{=9HW`Rh$&GF$lIH70l5%VYhEyc2+^zsOWbF!k zenTRX)UJ@{6S&)?#Mn=)Du z26h){K{2GYCXtfc%#D|5N}RI?NEAaNRH)m$u~=0Q?Lv-(3u)YuBr;k^k$_#OM}jG& z`?AKJ<}svZNZ`58!XNN~<=hG}By-LefrMjh5sr-{hV+Bb;6DH>{IZp$I&%)h%_2j> z02u|MsY1eL8+9RtWZj(Y3NM@lc=)~LKbB~FUg0d!RFI%i7Zyz&MsYCuy8?UiX6->9OepW2uLu=L?kIT?mz|JxUE7;D{3fqe_U)qO|?d8j~M!rScOC$ z?Ke(18e&K^vV~f_TpqoFJmTSxIk#XQ3V8)(<4dQ%^Cy`+0t2}`N}-@=swInr0eJ<* zkgg7e7^k?Bdj+MB1O-nYxouW_q(0e$W~b&42CIN$h*er{o9pHu z73I+*D`H^)+w7#^Sm1-FpSSQeVc~YG#sdp6hO|9tVQXLo@9_r`87ssXl32le{3$*f zs)Z6Hm0j?>zngJDEV}>}$~N=0XqyQhVGQVFW*O;dn`IRay>-~SISHrEixdt8 zQrK^#pt97XMhf_4Na1~JapaNJXJZgTFjYXl|zWf#&%&IxW5q>tK{ zU3e%}4}M}4D7)Z7>|YB=Fw2~mUBvKFU9vfE+DV38B&B$)OkjWqc+80@uyWL1gk-aa zkMIR?C|;tEJd_G26z9GulnIJo@#!BN7_JgwZKjvRRYByp>b8+huSv0LjZPlIohPS~u-j zRv~u^ZKgx=(DUdE09mhsS?GK^WN-?(JTj;7t%e4FOE%X#1#FRSqE`&y3%IT0iBkX- zZk<|MW_Jqm1)g}(5`D+EkH+9p;uMl(b7Lg6kZiudNNS;#69x%-Nfk(WRqBSVZ$Su| zI#Sb4V=Z2uZ1$mefkw$B)FqqIJ1~Kg&3rcHa*6geIN>l?4i;J!lx!x;5Zc!QCn&Yt z*t8Ql;Uzd>-=z$Bkt|ZOSw*R9E!liD&ncjeV1Q77#7sOmA+Ef58CH^a&yIY8=b4|f+!_T)Q5~U)eEt#aP*;?i zsH4fi33Ks`_b?Z-=m(4HNRg2PzTqjiW{KwcWWy^A0kwoe*0WOx9>ED|&4mSzRG!^5 zj>r{9*Gsxp!a^bNf*4bNj^!yV?RqSYYp=GBoc0|k0VJpQWp>TlM5$Y(GAE{G8 zot!=tk8VyMo((8M@F-*y#0T?yhAogvYSO6?a%=NU|bRg%q%WO`}Kh%tIFj1-K!`Q31!#>6xtv<9uPaNTNrmq!>pXXzGeZ!mXI>0yXne-Xk5r&--XXTH!3Q|x!)@cJ?}YX>u%PIX;;2@ZDl8l@eWb4D zdAfG;0g*?&{3w>SnPd|3rI&0Dy; zu)nSp9ATW2?omQdqDmlv1>NrE0tqZwuR_zV=754QKD!PJU(5tj8a}$OO`ch%nY>b6 zS!z)r!37ozDO6}*m_SM*Y+51~O_C`|#d}=A(=HpKh4qEFLS3&yq5LQjNZVReXiFfO zX-)(Z-eC@_5L-FVHk2QU7i@m^k%$E^#cMiBK6TA5Dt*lmN&y}0{XYu4Kt7>Oehn;m z-wx6!Y2_3z#Q4#>DnAl00D>gZtX9t7vPf!Dee`_jRoL$(7a0`NL^A*|8=bXsQk7~} z;otomLjq%ihb>^PUIiWw0FgRE+u%e83KQDQm$dk3poLo0?-WexP?H_!stcR>v?y>|O0kU$ndvbn*9X{otwR(h@O ze38afGri18uZb3%C~}EJx;d*#wZ5GfEtINL6_7}J@Er;gO->Y^UJHFYR+TEZ;C(w@ zm8uAmXBFHn>&fAqYrSSe>p3ziG9uLO35NfB$+MM9B3jrX=koQg*KW<5!EDu#OH;Rc5Xfy zE3{YQh1Uv|cwdM%Ior{4Uf{;ob?ziG5(JHb4i7CzMmh_yHgz5TiE%E*o5c%ByxBW< zEQ=spamq7(h4)VL;?$#YsW&c3(dyKOEeX*AX*qOTHu2^cYlsQjf^<;>EvOVv3MrqVtx`OlFp^J8tyf67b507h6SqKtb_NBD93^=Lm9AJY^)Om# zZ{EbVH}5_TUpaQVlAWAwuEV5Ka|1&htW4o>5+5Pv~I-12PK=B2jh`jI)os zka13v&Gof-HV*7$L$cWg5?}BUNI!iy6G%M$&BLifp%(86p8sRKa)G2P=Xvo<`#7*< zltUx=Yubekez9;WGAS2G7e4q!(#S|6g@OcB0Vc)-?aH<=sv5Y1f z4VBnHOVr9NBuk`lYLbN{;+(W|Zfc>A=GqK?@h6|BUi_fM0w9R`$dk=y%{M1a{?@jW zwkqUaK_@GaVrx>07Ynp4a3m-wv%o8B=QKHlB#JY%VFhItC{$&ELS}&qBp&*hZGO?f z(Ex>S7km8og|dtJa$Y7J?djuZRRtAYG)g3n9Uh&CmTG&5QuW-64Ro7TmD*}ns@D`45|WX)l1F(2DQ#e*7LNiX~K8(IVnH`S&EH#(a&9W(bg$gxuVPzu37S^7;tW0pzZSL zp&*ZVw%Z0%i}EOk#uhLUT{AuY#knu67e2ZeO!cY3I0eL&3XqEOC>x;7B2I;%o4j*e z#1nx6LI7#ToI;XV@B*Z!t{ESlIEAEtEt!k=OvB)pqghodV}q%~yOG+9L?0o6GJT|4 zyh7cD^pQs6lunPmmqCH8PNbj^Qe#4~c~|f)oT&({ZWFH@9SkP1`k zdkbwl)a0f4W^)EI(BcWP!i&KxM1k~@d4b$vUnqNy#haL-Bt$>RvVUGSl0#QB&rC-l%HnrgMX^EnpQ z=Dpt``BEs+ZcMUSVQRZ1TLTu{HhVQ*n2cu~Y{?X)4NVfxd0%s}9B`^lDxteuDC+- z6x;l}S&GeE^MFb(EP(W~r4{x=3b{b?ww?X%kp%>smYTHfG=x%ZM&wVP%z8Pw)iFA< zyAU$>P^w}fjiJ=W0FoD`Dmr45@%%Q+D+EClLa9H`!Bc6rx!@JjZ1aW{vd!idpogrP zbF5IJ{eTJIB!DC&@ICF2pa9Z$EL@a$g=R=d=Yd%{UcpXfoFF7zEGH;{1Sg=4VzYwM z3|4p%14yBPEi`jJ_&rBL5Ho4{%hag>_d1RGb$Td5&%12w@&R(t@EEJ}S6u^em zkOD}%EtX0Usi=>30Scr>IITJF+fghPeMBr(M{~w`@-JioB-v)0Cm&;}XM;Y%8LNXQ zY3599Ghgt&o&V*Dj1)Y8Wco;VK9Yj^v#tum(xYuwy4g~xr`Y_WJ}MkACfn?#_}!v?&j!K9c$7R>4$-jn)>j&2yn3FJ%RJg<`hZde}5N z_$RUOB1tQ>JGeaRqp7fDs!$DAP(>%WayZB#6(Io(O#+KWNcd*WeX+*oz2wtCMJ&8< zo^V#s3?!SO?XlE(LBTR?NfA=iM|KDslo0fhW*}w5E@BZ9uxL`G9YzN~_`heg&~S2j zgo1g(G?pqTm~GzWP%zsZi_MDcf56y3rv(+{r3X)4Xgg;{3qXU4-#%ouD zWJTH{h`dOfKSWm8&NMJu{7`_7rO^UQ31q&dp+~IFezLCP(Kni+aXPP%;m8p2Zo11lWax>$(Q%L}6T~6(~ znO3BYD2m;jTv3PrFjsgL6EAVI$PXDg#@aykUYT-)KQ(R^j)YTru34K!krdo2Y%Y>Q z`zmcc|4s@XK-!j_I~7gy+1S@S9`%v>nyu<07HQ|jc+HEnDNGHsz@le18kH_`@9?e_ zy9k+wL&VyO~LLV`}DwOFd2dq;vh1$hUrx=<{2r=2nKl2sr*bH(cqyLV-0 zcPO-T%~`)f4h0)0->L$s9tsvq&F8+3?Bcahc9D`o$RcF7QToX83SeNzX8?fd zBesgxq#%8C!wOzOgI|)$RBu>FDpM6%$XQ`imSJ;N7%*0tYg2(_X#~k6X9X!Ez_Bf_ zyHJn650o#~UDOYh$14y=CAHS98ZS1nS?>;BSzdwdBWBprx{Ex+W{N2bAmJ4rFC?2^ z46)QE0VF74-fgqRQbh}=@+xibSddpBfV3wGASsPdn1KW)iUP?>kOl}Ko%%|Bm9~Tc zyZ|I3FC1tvgcyKE$@Laz?*QQFl(8eZMh$z59Y;A7f1snX*5J9rm<~!{?LNzSZMUaT49`Qp( z*etvRiC9udHmd~5lFewM7)u2TN;XeplBqF$kyxrVt;J;Xvkg$#m!%aBm_kx4Rkqn1 zI=y*k-WwM3YP_Q+h~yQDlV1dd!sHi0!D6WcTeAb3-7A0rOyU!XZB{I`I3m)r&AQDg zE!b@yI2a;@62iq&GkJyZ=!Xze-Qfx=&byE#GOwUyTkr~B%)CM&-Mm8cPVtzLq>rr# z1#WMI0=yrGAh9^jB~oLK4g2hqqgq0NrE1c=V=O?rEt`zzMM#faP&8F6P^i-Ov!{Gs zst#<9<#;|B&k8T_4@*btG?E5hY|hSMOY+TVBsH?JNrc!bOXoA?XKX*wWW05>>Od5S z4GTa*Mml0ag%<$}syI5v3sreWSZFNAV=`Xu76zaNuS`{50W2hysR$#v1*OVi*LSkVG603VY3L5jCA8|1_KJ3AILqSB1mo)n&uT`7B2jd z+MU8g`)a&a88&256SLsl?nvP7dSoy)3r-3ULu(|g3j<}3u_!VNjig|ag`@;Y0VJD@ zcdEfF%;&+>1PB*hjn{ApThK>^3T?|OfPwn>QPaUMNq&tTBIef=a>FY`*Zi)#nBb`MB4wAA|JEImv zvVeRhYPS7OgJ0O^Vu7~1<|M1&GS~;d$SNd-_$oBZQq7rFFm<#-Yjef{ zK%k(Ga@Tw@R^h}2RcMO`cx6@r^8icoikTOn0YO9ssrV6Ap?Uns6=Y%+Jd|o_g{;fp zi}CEiry5m3HZg-+h50;y)Jh(C76DDg6ks! zN%5Q!W!Q>s{x63TZI~hB1en0v{L>*wg$NSg;?;P+a#eFI=+4LRh~=8c+3n(vC+;^R zT_lAh*=!;6tVG+fkfjw!HfIqeOE$MlE0|L-EUe8)p?RBsUYFY76r2>)=I;?CIR&2T z2Xq&m*&9efuvlkL{tBcZ!5EiFq_8gJVs>#gMiz3XKrFSnJetpIv^~YT=O$U z*KAf{z_ZPnV9FXgkx3Y9T=T!Y_rjoH_ z=D-UAN9!TA2-X+coX+Q>JH7EB_Y=Sq}FmVD6?d1ApGmEz6r7K{XfTWEC> z+qO2r)WS(@!Uhrn&#;SEV1=ykB1^IX1#4|?VVoOVo6{s4&-oOEse8}C4MAqgKj*{o zVgL!^*jp$}-EF~C?6WMipwOt06ih8Z;Z)PS!n~)O^TJeAl6Ao!A z>QebN;Z!p`dy^JBKY9k4I~Bddf&%c;P8F>MsiOyL17-+j!F+RUS8!G^vykQ$o-MR1I4c~^hk_XtH2g*BX7|lUZDcCS zNUb|wdGT$M%x8md#vs%Uyx{SNCPFOrjo_OVL;Agc6`}ASEI#rC`e=8d@Vf~e}J|IV4p(zrQe$LH=kba&sn~U=ZIC&AR-81QPm7)`axi@n57 z8?8c&roO8h?GR0U#wJBRe}yV9WEDcim*0_^yc=^cG;wdAZR>-5N#Ez_8A(clvkw@*3 zKDl(=pm4*f4=ji}5aQWa@YlOeJi-QZSXRAu&^;2ES4WrbaUb5MYLAn&qM} z&2>hB08*V%Xn)|2#E_o*B!HBq6=HtvY>cI*>d2;O7t~SSwu4bfQq2y8tZfG(n8}Z9 z&MAS%ey>vk-@>O-M@f1u*FrIVq=-_H5)?`$z2=ml3hl^NT+%nIz-64)nS$YjA z5N8MLW`_sgn-w(oC7m6NIBGigg~#9XX=a(T8VtA0p(-_>`_isiK|m;G6~5FE_;?^* zDNMV#XdrAcAhfJXWr-k$Se5EE>{2j9||_QKL|c2LuESFcE9!2 zuN9GiHZsE;U4nNtpCrBZJ+IG}Hfo6kDlUq#BhNHv+Q=xuiWl=Rs+j^pMdLGhhriDP zBh##^RBW;%!L^a7p$QVwW2Zz3#E#?=j#^P_GDQ33aO@QCvqnyWM*QEm3mwTX-xe|o z13%6NAQdTLj3>bxQk)VLI&w-+oDGQ7MzyQwsS0<73* zXCjUGJSopk=O5*@M@@l1LP3$EMw7s!pG1xlAjl*B$XVBvOoZ-$H*M13)f97VgFtEKZmg016>v=Ob7+IlX$6NU=0W$?TJm6P2Ysb%3IBZ#FR8dSPpq5mSDo?PxaIS*6 z1f>&FB<#yv0&_0rRgjvGhg3mo?h=Fqvdk6d1Y)T8;!y&mypKr8W2j&v9z|%J@Zg_k z&1=pHPnb;@%aNeUnzao!;c1H;xfxVCA@9s`4NTTZoDk!KS@98e8BQn!j@nn@SymZH zxLr>B6s$Bm4;-oBqScw@nxOq!q4-EPA+)Mxt?IA=R4+vY8HC~^uB>##$QG7}ts(Kt zqD`(OHo=@!*3(QnK~TuszCE#)K!L;>)W9nn57{0HG6(LLBNVKUlk2-6hS=TTaIgZT zpcra;J}pq7MWIQ-MKUz_9((W=LuK;_P+&Vz>y8~ewHKN=oM+Y&!|YHXhKfeo!o!c` zZjw&e11S`sfL(~BpgKH3!8254sV6TnnY3p1wL;WbWuMO zucAc%EY}Kmo0@QjR&Tw*U$_2Vk(pp%7Y{L%l^jv|RNTP16ZE6qHVYQPX3m9@uP4 zraYRl0*sK2hjb`##i1Zp01B!-n$B6l2D}vY(RjiN&zn9vY>k|8$}RHJqlUzq>m!xn6`g{hz$>U+zpq7o z#HKgQ71pMmQ)o=A=}HQPd;o%zLgRQyuSkUs8pmf}X5+J4<(L&bDxO8?G=V_!V-+Nj zHf&9cvrQls8g{&qGasMb7)4d(5fI2uVikCb4(}j#JfSp zBE;a)4K@TOj(mA1q!Vg+<%jFso|C~kNmR$h#v3JDfF zdZ=yeNJucFkVR3=Lf?=fVZ&U#QD{EqqPaX$L0Q<@Ld`vZXfo!4?`fA#Xe*Bj3Nn*N zWL)yi;#3T;wc&(^LJc1Kd)t$m8`25vB9cv!6Kv$m=QeVBd9htbVboZ7q%jwsPiQsf zA`PP=lf3X~#yvCjsI;yfgcBA`9*GkUTRvgNIRVe?P63G&<#U`#9A6XT7eUgN6k3_ zF;vG1T&a^sEjd9;Wb#P6gyhlHK_1mdk4zpZz=k|hSb<^-?G}Q9JB6Y=+FW!B7j#r} zqdZESLYQ-5=Zl=QIBMwPY&GYiMY+Y8ms=EEGwYR!Oz9)T!d`1ra4aOX*@_lD9-e#! zP;)Fay5?`^9Xl^T3O*@SfmA1jr>xxK`K(PLVu78XHU&7K^`un3=;w=+^U9;-Mi-OJ zh6Nde^hR5f;S^V+4$kA{(1LU@H#)jzFSoGXwXC7plFVvTXw%(~6f!{s3cO_}Ew_+s z-hN5FYi^lR@Y3wYlmd6MITqlI$dkzuAqe1!=%y@^swaO7FJVCv(vl3je2F$@6((~ls5gTWX?eFO$P@BFxpeA&`anJq-PK01P8+KNAT zHzwD}s)a}@te}Qwm80g7RMp_gH0P1jmx-jxDJXtqPJz$zNUHP^uc(hKest=;${L!v zvq@)`BB@E5d96i@5`pC55-&$paKwf~v)9F{n)=&ZvT z34DmASvD$Y$V?#3n`y3Nh4v#~lK2tKkQ~e@B)|+=lforoes*%ah#?_{QdNUzV=j_V zDw)ZKh8;tK#$2p}CXhqgP82_qK-z2l%!P&>6cm2~$ z9`WeQ59abHtvj;lQKSS#kFM^NU~+ks1PL|cq7Wn;h&MUn00j6Du*@>I$tdJ3GrBH%5;HQ=oNS(KV z!Dymbg6B>_NU+02V1T5dxvm7y&T2lHmEg7X%rb=Tkew0^+>`BqNr!?rG$*r<{62ru z%kML%U=7VU1ye`LGymsMN9n|1siSt$qeLAMA%NyHjhjc0Kt(Le_9((wtLRaqQ^?iP zc~&bIkjk!kthugUx3NQ^kY^sqOOIMbj~dFdg$SUqP3g6~7_~|C$c;iWCe?BZG75F- zNCWX)9l-+0vE?%?;*6PQ&A31e$uu7}qi{G6q*9(5=e=N&G0bTo)k3T1VG5Sa6U{OT zNipgkJ6t3|f~zCzTYHM=5wX;)S*JlA*|?Xej^GFDP|zD>RlKi50%paJooiHR=~42Ncv% z;E9YCz=>zq+Nz@)Y>9wCojPj1Td+h11x*Y-5Q($?OwNl^NB-ce8nuvJBjl9%1bJq% zYdI;5ixi6LNQq_}7_97CU1z^%*W!s&C?h!p)RDH6DK}e|Qdr~)5K!ORUJD% z6FgMxP>_i(hL21g2?^f8Da&k};1w5Xa?SG0`$59XP60L~m5@=)D4dMxwqhJry*fXc z&hpGp55hgh|_)WRlC`B#>G}g4)&^Ng=h&O%lyb!$-&>jDg-K*|oKVSJTdZ z2%+E;Zf;hEr<8(c*PIl*o0;vuE~UVIjoCGLUsZU+T;bI`rC?D7S!S(`EVIH#SBC*G zySO4!*cdFcNWmqfkWknxlH{8EgiXbgiJ?Gvl)d%9`VIbY*jt#TYvZq<`lBpBLJaL zi5#=16dVaj?U5rv*l0vTGRtJ+OkqTNdroNA*Kdv)HlUXoNEDnxb|7c&6mH+zQXMq{ zf&Wm=$JQZY>y0uhEL6&LV<9Pvb)nTm@SL4s+aV}+DLiUe`Op5T}(`H)l}e3Z|H^!`mAe^uc<1t%PJ zbp#uDD>I)JV@Dt$sXZdMHvgrJ6I>lR5_ID|c4S83EpBMs@2ub=4VT+~r`tTh%Ww0} zwo%lK609DzWvfp1t0A)~;J6(uzF37%0%C;=ou0P!Zu_&E}|8Z!!f z4|LF;670F(!ZL{x%qNWVrxXd+$?Wy0IVC8n&=d#>B|Nes5a!Jlh!SGxsDTo0M;vW0 zgpLFR>Ma_N;{*t@2>^i)h4xM56E^271_`h}Q>@{P*#tjr3PqFx;cy|hCLkCkq(FGF zaKw&@qp#-qgndxLGuau0R353P-wiWIuElcHmrWcENF0SCyeN(^2Uuv{M{%Tb3$TJX zdT=@$keUEtcf)uqq>w0qjZPX^ciW9aViP_R9fpDPJ(Qxa&6l{W?eqLD+HI(HQY{CTuQQamaOXOFY+XT-t7sQd8){2zS zfQ0!KDvuh{3B{>L4>rV(qD@c{UNM~j3KAqBEVIfZA>n#Mf}~JF362DtdbG#_ANI_e ziKCPf%qBnw#UN@*2`>e4B%APj4OMvZ2^W%DYf1`YNnXw6k=Cd&&1^m)lETK!CwL}aR?16{)UBiJ zW8TxhIrObbBn^bJyy+x(G}m^#g}6a4Z&Fa=sJ`HWplLn~FO0Vc6Tq4z6kvuX^2nR| z@5vJi&*Y^?0N`Dod{S#FJ(|u>oASAkewqRx@I)F0At^mNOmFkI^3)nLIrScpf{z5y0Otmr*H%dk+$C3uHDkYB+vTPw2_q$H+S$F-F-xu05hqlth+C3%Nr=;fN5%@$N1j?M zvI2lOnz;=Fub3f}o)G9H@bV zMMMx@m-iZr*sKcgFfdUSo{rcdR7ytSVBXa4R}v^B^S|~OE$qt#l8)G^6G&v5yh_#V5Qme1rZ4{gvAz4?Rdrto_Qj zsm==eKw1?T?BcVeOF?CLg)B4RXx7b~M2~{GB4lKzafTjF*OU*0w*GrC27DH>%!(d) zM!_e&;1@wD}Dej_hE^5_xIKLUwK!8Z<& zT$4aL8w3)M|9dA3q`>13K0+BDUvN_Rf(xW3;iDF%{)HK_b zG=BST~DTU^)IY}vKBQa9ovru~U8lx^ieot=TOi``-~J4eIzJQiLHv%qgI-|-vX(sxbQ$K&$;KBi%?L-g;%5s z3fqD{`f&~g?se3`cE(PGg0Vs}I9rH#+IGAokm}^`I#@eiLm+hpB(!wR)}_GHZ$lxC z6q+Mp1EkOb333V^KJq37WfY1?fC*yw2zY~KzJhnfy1VL_xHMEMgbOxHF&%2 zz9(^1*Sr{n6;r5wo7V$`x?bJJ@KL6Y+E9WlLE6o1aaG=bG4sszHF#uAn;L~Y%M3e& z0|+h4ta}-@Gj1K?*Lyg@M4eG+sg6A9B3l3g;u4{b5~FbHN3l%N1*9l}GDQ{a#*&nx zIQn_&EsEVb$Rc+Raen;SaO~R2+%o5*UXFl?mqw{v_oFy{_!ls0-`9^MQd@_rQJoS_ z1fQTx8YM?z)QcUvb{GNmxK|$Wu={|E7YmkI&LL95JK-o!KrnD9t4578v%TJeZe|5i z38Df4ol2|JnpYmZodJR8y$%R2jsyhjQ8@Wj6h~fpBvs@3q%(I+%dDdYz<*E!}oPEfrC zUK!40ouW_h+#0PqkrVcUjlRGV<43pynQ(4mqHDm>ax9= zIo4(86SH9lRURp&fE`x71+H1fL5{h2RyoulBgKS^v(2*1Kq1L89{>tG_%eS<5#G~w zrEs5Bbc{bxT{in(oahs8b6SH}KkKDU4W2n<;USA1S<*Q#w@7nqkO8?h-Zw{rQl@!E zp*bb6!BJwt>tZP323wDW5*!IF4Rg+#5=Sj#N1HCRt>48_nq&?wouTjuOoX!RFdDT! zc656fdQ{+q)#cBvI1the^OSLd)gbk8Vq*xSQjIE3pt>R+#aTNC9Fcf{W0sW0l!QVh^VeN2M}*yY+CY zn>ko3CZhV>BTA20tF)V05mj~T@Vx&hSmvOQ@CDcgeM&g#Fkh2C(os`ZnJqPhXQ+#; zdP>16v)@7=&GP~a$fVfADaY(%f}b+S{Ja?j=_4k+=*h<-xMO}J(MN@ukU+v5^Y8vn zR&e1eSWtMj5F->Ru;nF1cn1s$Qo+gCBWu<d%Yp3!xq9~<#52rxjeQOCVw6DSwEz~8NZNvrFcY%s5j%q!e-?QkE z8vAW{d`1iT3C(``U=ynV6k-(~OQ&{bEuzO!Ez!IeeMEJ3^vp$l#PjbhoLgKU!47qv z`K2t;{6Zc)+GEKzp9(3@oX1gn_Jq@Q_UHPD=H(=#VA$Y&EVl^A91&17*#Ps&nPs9!Xs@P`;kS|RKf_4X2Bz? z!uz5@AuGAqaB}I6MYZi*MDdYBfd@Z@!ny#Cx;QE@XdOqj=#gSY5eiplan$p^MjPwb zNZUnHhQ}HuanykpP(bapoc1zrP)M?Cgi{GP=z4^Lw=Qve8|I6ImJJ5!{6A>KS-*!9?d83RZ~UZ|5ufI$+;rLe&8oiG?O z-sl_*^9Qp+JdcjZEEG;%Yod^B2w1B`v+)3UC=3C!M04|Y=H_h*mT6Aif_$^3*APO1 z+}Yi{c?~|Oa|>(~F~-Kd7dnzmGt?=f1OzdF^c}mBxP_cL$tkc>v7LE7?iVXGakf8; zQ_sA|iwY&FD$Vn8FJXFoICX72vVsmEY%~kjy5<5&tk6Ut`EVC75Noro2t%$}*)@=` z*O0&mx#rlVAlDossVmO_GuNysHQVP;XZWTh(l+Z^$Di{DrAAtvLaMDLyiJfcEgdY3h zR{E$FDM%m1y&@-t0oyC;fIvpB9qyWmq!LXH-r?Qw+>aAJ zRU}nT!Fo6k=aEzejodZwE;xn5c_cNsW-C5=DMvzHlKLxFk~-j&U=zS9AmJ&~M^Z+i zdAUja$X&B?Y_|n{G`^v;IVI@Edrn~>j~_MecS&+BfdZCLal#hKwVh4V%vgmBO|GGj zz{d@lKC;0_ITG5KX41?ML)`>0p82ehCO6HF1a7!YGbs4^>$r9!vHoCB!t={JD%A&;rT3*s%~bFqz+g& zGi4TZGjoPQR&a3!&pdg0IVrdhG;Hosl2foO^PZi}IYE9Qa)LHIo9rS{BtvLbc*;As z1cH^|*N2a+an0r)A(2u}XxXKJKd>jioj9sLZ>?n{^|de{6?RCHYdq_9$u(|nA(D!I zVnN1RX`?Od6(}Le$7HW?wUp3iVFt*72A|NjHrptH-M{4oFli&6`y`Uer}7CfM)V2l zQYf}?5;CGo;j?5G3eh9PQ9cVV5l1RLQsbI9!5M%ZLvm7_;PIr_xNKijQ6w?ZU^TC81P=k%v+}zc#S)kPEZO2`lJRoC88C)kpW4K00aPquVhGgpbt3 z86&C1X?XnQB$Aqz;pIjlnysjhj1>??Xr!Qzun1xW^ijmZqZt++Z(s$Fq-yTb&clkN zM$2r|@RU_J<(65QX7rJ;04o$T%{=pUeG0}3FaqE>1ULik967u^2oxb ze274pw=RWw8*#C1#c40%1|h(^6rw!xD!j8gW-84ojEfbTv@<&^*tC~ABsePs4$#tN zXDK}3fm9oDvB-13n71<%JVGUfS;1Il9)A_2!VU5aNR4Qs`O|q`3LZUg!6T5MoWkXW zf>d=W_$)jEsXWx8120I8Rd~1o?^58itmdMSQxFnt+DmPBbA2R0qyh7F!67Fb9@t2b zka%VlAGuL*&+IZ->9tHBK?+bq2&_(97pKN%Hw_-udFC7$d8Rq_%=cxr+23kWbWtBX zV#BW^1#4d8Y6u=s$YUpg1UE_gojRfo0`A%Ms3Jt{G zHS5<&ox-}#C*b>m#3@+&?kTRw5ZaEHw5^}Yb+FhVghq<#HJtMW4GWeMN;~^4@tk{R zx)iJquaHw{S%+6Fy2!(*afjo%ZyH7w5{|U83XMn*Ik-G>tB^>@q$1TCc23z6$tsu_ z;zO2Q^NLhi1q-9DP?4G-K~}+LTtus&0rK0sJ_`(raa2nw_~0YeX16R!)wmaW*EANA zwF*rMY$S|@B(V?^%_j&S!2v*F+>0)9)9g@?MZRI|^db*_Q64Gvd<4P7SV)=Xo#CXZ z`9oQvnJ$H|QjzMUpg8JLBZZ@Z6l9ts6wU;B1PrqCXo;+bd|M`uU<+^K{KQ8hDR?2C z*r4bXB#*eMl1H9hJHTze!LGPzPHwX{JST;u8N~;rTFr$y1>WbT*=jDDl0p;HoDN8} znu~&Iw(_GtZ@~$uq^zO&3-P(nj6$}$3)s>a0qb8}fHbAITN1_O;z-Vrnb9K~+1X<=24d?3wgPb8joKUpP7mkGC+%o^a z%)Nh%-q&^J=eSn4&7v(*%S*)B^$Sz0$fiOM*m}xE{^&qz6bn-W#>k<#$u@aWcLN1% zv5L}Fl?1^KM4E*(G))K%L8RSuAkwU$2&v4WPtel{XXC4JkNQ~xx<`L?IUlk(Pj?WY$;}A zfFu;g4rU(nQ7Z#TEVz$KbBX_00}Lr}fqV2wS^(Bx_VOcP6<%EcHZZNzKcXBPRY36K z=nZQqglT32LKMu#2wPJ?NP^jHR5cXX5OWgq$X4O`2xpApF~W&?1To|u^E{bHGLG^H zC!jz$Km)}*LO9bD?Z`&Q*{c~k2 zWPn0T3aXCw83lyuh;LLc^{5}CT(_BDo$c|p%WTC_(@~hNT{dlcq86qLLUffGWSDxHo>`| z$=nu4ZIih_!I^?bmbSe}lG&@*FIgXl}%slHDMxMc2_iD*EX7hL0N52L@fP>41 zd<>_a`V(o%k@Nzu4!4f9>}8V=ua0+5VjW#f`@fzyO1J_Jo=*LQPVA`hP;pa}UY1C( zJ;AXy8gP!Z-{Rqannglxpuz>5G9|5$^|I}^(93O`k6w4`tTky1)kc945DDg?7OT98 z9Tglbm9i!iT=H9PAbKm#?r*Pnm5YnjrGUJ7o(-!tkHc{^k2Wx(b zAWxt6&Ws>Sp@)M`Af+`?o1y+$HBrZEBXtvOT1VxO*G9w*LT%Jrj+#V*@Ba$5kr9Gg z%!mZFm`4af`4k)0d64IwPhwTYjx2z;<*}m{2t4E`3`!&y zb{Pntq{ZBxJZQYHOwF86=KbDGKUy$Uz#@dW8?{l(6S1QXAq=f?24F9rfF4-b~;PVFL;&l?@xDB&wjHjgZzvb4CCU%HLrmr7gk! z{+jJ`4mb>nqb^F0uX)%=Wl&# zIZEgw!Hy!_^V@9iyI`SuX`~8xmi@uJ-9oV=TbSMHs}07ER0~B5waDkgC3e)T|0;89 z%gALJNBfiMk?yOB1((ZwQ<@3>l%5!QJ8k;@X$A$C+v5#D$6iCzK= zUhZ&n{M4vUnok%yc<`$|2X&dK1=KJAgaavRvD-Kb2Ox?2Kl0fd8!UGL2roB4xW*-N zXapd5{U~p(L=;o~s5nZy2k#J^&?}CX-~?+Os2(cCkt(Ik3F(BXyVOf40lX5mcsmdE z_oApBm2f}r1ysVW2P+=rg^$&iqo}-1ZWaolrT;Ptc8Q|CsOo4gx$M;u4}QlvvM4Im(V73Pc&ILyB@kLD zTr;_>*PF{_-DjX6x$He7IY;J{gMlCV;ohhYZM8YnkeUbKG+N^XTM0Q8MeQ7-U?J_N z0w=Ub>r5R{PF)b13H`R3pumG45_m{w8qC08VOuS5f-Vu@=r{`Yw$LT=w*|&gEFgzu zf;mZPBP2*TvXB#m0zLd7LBDWL_?f$EX-#nIs-X|+#-jzti42g!vDK8Z$X?q$l$c%~ zskDO^csaLynG26f;DowoKOI^kEW zn{c)2gtL&s*cnqmphF5cMli{r5>%zFMmOP|-S5w&(4SApSqo)RKbiJe>HbPFOAgvM zdwer06oNtMP)HIvKp_c-zYP@F^fCnnlgJcCaph5kLepU`!`9LCppKsTo`;(IYG{Tszu9(} z>wrS`j;2<Z4tY9U%|Wqz-?vWs+I-5j4Rwl$@edNg%gS zkW$D{IBie>2Ba($wh$Dkj|7FUnNoNOC=ffM8q(xuK1IRnqjwVr@U)l4+F*V3KwAFw z!tZsVP|c$Vg(h~i&GQfW_Zn-ted?ruWR_4Uw|SZrj!c|8IE93?5%MR0sGKKa$I%XE zEyj=l1(c=`H`MDRzFl@?EeHkP5@BR5Ai?}KU7~G1?IqgITB@XuJZrJqrjDkw7ITo$ zc9@|M#j^Q6H`bDQl$OUoVoHI?g-+H%MYmB@j~&&a{xsag;~!$#u9>Nia8V;ENGaGx zNYIc-fvdV>Gi&P+33~3=_+)Ifq#*OiT-1wJ9=$+$#HJU{9rXDGbrWWuIIg}&MWs^GBv%WEO8j%EPCsXxs0d$z3K zVOACFE^0B4EPrQF3(Mb)uD2)>8SUJhMcZ{zM2@z$LmMo1|IUwZVc`KVW`kBWUHQn+aKkm$J7qS@=C*Gd+3@2Nrx`)dNvItrN-)KM@}aPAit934$#t%UDO7B!zG_GeHEAiz6m zRvr~-9PXsDD-?+M37zCv|;QxH%E$(6!< z?zWigdJ9M)KtZH1*kbNMVLma_ukr{|5ESUHDT=yLccb=?)~RcPWgqoV6rr2oE#?uW zz(q>=J1`)nKo!I%*+-$H;4S8&qEmTIbH(bKiZY;g;5LyTMWd(0_rvG-)51xn#Opm4(S_-))mWw4X~c7;Ol zj{+_9%@GeCSptvta*SmwZZX|twz0K+g%+${8jfXKb8UE5M+H(FJgQDAk9?v9ZZHKB zkZ2-!d~;_~!D&H6(GR0Kb>5ps6q?sXp#>F49=A9YH-JrH!D%6MnSq7&1S@V4_5?Gb zprZ%9KvD#6L3d49*zKGtvRYI#?2xd)E1x1MVZq`SJAA`O1=1E+KsBqW5UkWw=@8Dg zsSvGHlL~4os6g`LXrH%LFE3TqeAQS15Xf5%1yV^KjrvDmgyfM5q{shCSpXI)B%lzi zRMo+7fP{gwf^M_3LIZ`4RB+K;*uNjkj-nZZYBTNtVx3fCDG+LXBG_-t1;kSF2KZ zBBinggt54VfY4V8mPK9T?`jrRPAU?i`bYf%1yp5MHc6Q10kTJy3)&s#4jsnN=RWl(t)3bs!*{_4w0UL???E zzD&JDl|++)swqeC_zMTZ+K>N5E04;_gHVHv)C1KppBWIu2|l!T&48fyT>wIBn42|{ z40CTC)d-#iF8FDI3ya`QNdcTqhB^j;9nAfhv>!#6Gryn^h%EhL&>whls|P5-75%|%RciE4GE zON3GgqdIdi;2AvYJpZvs;Z8Gn)I|y-0ftj?CzoBrsIfZoBg&6` z+5#5pAn@Ud;WA~V;700sD~oan4^mKdBqJ52AYEW)QLc{aH(4ndDWn5MPz&BuKq<&b zRraVy3NlhJF`?i)vv2X>Z>0SeuTAw7(teAd{H-#{?9~y!@~BQD6yhPA5`;F!wil?s zW{>bjFbjK2-ZBy_aly|zv}Tjc3#ub3qBzNXxOCT=mVzz98$?1KP>4uC0|X-#esCo4 zZ81{mqfY4rA>nX?1o5ULAv7SJH$zLIGveAtE}HeIv*l*`o1NJ+o`03WLq=*|nH_XO z8@T`pKB}`4bV5Xe(I}pg7QN&?Gmrlp#tDq-RwNEL%qE#T3h)`+5r>-()&LeddjnJ<_O-%p)FuiXn9rD2O`ao1VDfpZLi-|Ho=E zkDU6gqoDg9t&w(oQ%JBhQbxkTlC|`^tbuhOP*8Q$jOti*gl>-2kp`KMtUs*2f(z)M zJ952w@*#(23!YU+Wk8`jy*b=lGr^pJAi-?CHE5v-=CL_uE=tF1_QXX10##AyD2PV` z5UdmL9RE9f)7ILJNAi#y2)j1C zsZkxF0+U5C@Z36jDJf=trrsK8n5F1ZS1~s-L5dksjZBzdEyYp)g%@N3Jg=MTFT5GId7qg{ z;e{8N-)rE5wisP$Dd?1`Fw$>(@Ip%=U9#0?l9{JJc|}}4FOR&rW~{(bYh{vIBmG_; z*%_Rv82UsK$X*_a6$YAXJ32=JI*?A-R`#gs1fZb6g+t-2_14e{Igt8p7RV)A zA7d$HkHiYL=jF)HXI2P-)Dw-1y3K9o!50+T6rL1w{}=_8N3NLb8!yShObVtGpawsq zoam8}!l+K@D`xQVRM82x@yL2>kELOq@qWVfCWU9^Q5Ok)QlMa3QYVD+$Vs75%-Lvm zDHV+7#G8c_1Oaa|dq3fcrEFB5``AyYr_oX{WgGR86u5Am068d{{ka&p@UgYlMosO= z61YgwBY%0wJi>O6c-A+N!*#yddWIJB&+FhpnMeE)B<%2a3Z!Ze9_A6%(D5o1`bf}j z)T1`a{A^`~r_D!I_Q;3&LxChasY+&pf|LTEVWl7_&~o9twcjnhwKL5dFEkVa`MZz0 zmRLa|dXGTPCY37M+VJbJV_MIjeR;S5em1shYKGMZR#p=$;Jq?x%wU*I{VsimL-$rom$nF$|hs$Xqp4+H&o0$~a5l*V5&IqUG)VBRTg9tRU8b=ul(#&>5xk#bkWp4JolrD1&A5Cdy zqyaLa)<^xJevNR(#Kp3#ARjexK#AeWJxYF3kqUf+k1AH+stk+f;rhs{%D@WViFe|x zfzA_%B%ns&|UE3YM!z<=|ja;A=0u)XZWgt4pTH!)7#A!yV+RQ%9Z1&N6m)uBot#CFDah`N2 zki+xDg<1-|?ixB;IXu-#pare)*>Z-$=xq-5kt@O(7~nPsZ$xR!>Ww%l?5ly)ME;o+ zB$_{>fVS61PcE?$@@Nsw!bI#cr*oM@AQic69fe{0=z4F_3)CJ&vyi}ZAMzGL0%%!; z1garj5WhqshqgWnO_v~=?_F2kVwQb{QXdHkh~`68G(Wj)eI$+SNH}8aEwGRBA)K<0 zY$N0&-}j~8IiAFG9$gzorPwvW&ZVgMCIIH+*Kx-+Z3anURwR8H8jK&p2XPL<ff@nS+rfp!9Y=cJimOHL{WGr#jQcaN7x zxusx({VIm^rsID`+Hhgx%(usG^L8zRo%?mSt<5aa+;LJrKR&OM=paOo%uZ@VbJJWi zCv^}Cc&Ish6r_TR+zJKgz~hw>3jCV`fP>F);-V%}^EIka$k*uJR6^#FZ-^5_WVd-{ zP>@tGwpbVMW){s{ z%U8;iucm?y6rnE4_K|njsEH8G=Ml{pEOD{MH`qrzHE|IZW*Zb{n%B9M=9xtbXl5T> zg95bNLZfSe6exj+X7jZFQ40l1qG%sI^p2qLf3FoNzytXIagNcFen$DPd^sZ*<5#6G}oIv_&0$!+jy25kX9b;^*A921=q|^mhxz9H>!jJnpr?_ z&AgGK*&+!)S?6(aLbLr#I)RgQ0Kskt2wHkn$8{b-0vsvsk)lWWit!rJxDEi|N+nLP zWHv;Q2iJCzos?P%>roWMaUJmRgvo?h9o3~rDCUz?N36JzOwf#i0|8DD5H6sRY&{2Ggn7JC!82c9?3Ng^E%W^a#ll2!F0mj`NI5e5{eRB zCm1D2Cv>W#2}(dHcQ;%#Iw1|NbqD(gcfIiRcaE6SjKV!NG@~Tt7$fXoWFDDSv=&|! z_Ra0^s<2%zDvo~G2ELI}pZe&RZuvyhY8$uc9jx==lYh*k&1byL+%^-n3OJjyabl+bQH8fmRj8~rc;RXK|m1jr$DAROQg7-BX1h6J;K5GWxKKdrUST~_G0 zbFL1(=2{zVq!Y>qYa>(0{Dd3^Y9mV?wJz#NL%~%-XEmyG0tm28u!ID& zt_Yu8J^~+J8Cgj!BbaOX=+;q)t_ujh>%~eTZ!)Vy3P4z*$=vRG0S}53bU5KdKgI-S zw2s;^s(?_J1W)8Gs&(|d*>6q~Z$JrKDP6&%Upi~esXEtq`bi#%08WjG1Z~UagsEp7 z2u=x{Fr`yuAVMFIAlpeEyU>hN0ZPaXpL_t{c=qLYX0Rs261B8%8J)BOR z-G&Jym(?}0;87%gb48#6b&d8aBg`u!qz7M~(Vsys3lYgfbw((MGCy`B9m>4GL&Y_m z3?5PJ8b=gH01u103D+>!phy*q=%=X&UP@(q+Cn11+VHcUNO0rm5XMo{SmW)!%&1N) z5@Z~iT2ANCHpWp>%N{)HGXkv8X(o8^=nJbw6J!q+MnE{Hmx(-7hWgPB&InsYKj#&} z(ggI?aE)?bt*;VJ;~ZT~&XLjE$@SnTjJzqs9S+x(UxYffvZ#KgRQ)GkE+l7e|ysu;_z4`0Fm1 zZAszU5b2+2#@50sFSLz#391P8^2j=C>6I6-5Q5oFlevWO zy5-SeFuQ{V5aIKj-3=Euz$q+PdDQDCczG212`-txz)j*{wt2H@y-6J@<=AC ztw)Wo3zN*7yg+^wE>(GCk{QYrbIt~_a3~Efr}Aj%426va$?Qflt1#k5QzWfL$^0R5 zMm3L`yd&!|x3qvr@VLcF7*WVV0W2J|`baJVSm3`hE%<)a<9u_x_Lz6-t`|xjwbmBV z!bND|blR95l1Hb_JkqcZJ!ZM6P77B{Lt!3oZysFsI$ytc~sHDD-A8w zAq8$|vQYtncbWO7F7$Hf(?U>F{k%ozr^NQwq(=I&zO5NDYOb`N|L! zY)T<3LNyfHU3d};)>PdKP^d1Uiv?W5yaBASk0ci2s$c@CW~44i;lU4O7v6YpZDIph zzoQ^1B(tbQkB|l(C;*N{VnGg@^JIX+;hxuQ4jXik^;D>kC|*4nPm>%3L+s0!f$1=&X!sUdmftbix_?$ebO*qSXP^;YtaZghHU z%@O6+QqVyPtEUSTytihoa3+`|wS~Iote_O09i-reaE%^0`SU9u8{M#{3KpIR3n$G%a1H8`0`&_D*%b#rWD>kr4?kQ_O*f$=WQ;Nv_iEOWTiS3tUlV#CR@o{ z$V2rMp4UfDmgv#gvKOz9V%{R+?Eq@D0iUD#%`{&Fkzq5|~oB_R}SBaoLcN+|_>I;!>Q~(Ta;pX~l&%73Lse zW=#bIf=(!>yT+$<*V3e#2AhYwYcPiI3jVR*9zw!_0VJ$&L$C1}mI@{bgM)N$b&zuF zs5BK23H{MEMY9K+3WHKXBvHqiQ{dvhj+Z)YAR!k6DGUcLj1;)hNhtsd4_u%YhDjlm zM}ZV5k9ys;98~mog;$XBQmG&n!s{oG8YIjoyi`5$P(UwmaRdV?9Ls!P@={kQkx~dR z?T>Fnvt|^UV7Bt89Rn$yMe9uk$|GC_DTOb%jILfP5+N%E3?y~eD42MJ-jz}~v6O+N z?wXfJ7omhJHE~fzv&y5ZwLJ1Zvnd5o@JBrG2?=tP?ot9Tr|_f{jwGe<{Pzwaq4iSr z!u#Y0g#?klkihNc6&N`|NU-Qp=pEf_L!90_l9y^5Qq4aqqS-d2jv}GsABiI3VYG@K z#ghkX9(9Zp=;T1cM%P9D`c0m@uv0a$)n7;WmJMNVk^BhltL^HM{3NE3;J5Q0c$*0UHq%$~Udu?zN9wGtXC{OE9R7NYca~Lh02@13T zDS2?U&kPF)30tO_30{=00!TRZ!I(XQ8lJe2u#q+Mm5+UvJZkPUyHH>gp3a&2#oARk zTSgS}((GU#wJR=?w<`NoA0;lt38tCv{kJm`e1=m6G5@=C-$SGMoaHOR4Cl+K;}-9- z6-V6OtOt*pWcC-HesznZWj5jI?H^B4C=~HjNnBVQ)%$D9At8Aoh6LVcy!Nw`%5$IN zsK=T{^ZrHEQ9HRNBv`$)2^w;BWD`y5uMLm6Httay%zkpI5MIj(N2rc`>yabD!bjqcnZ(MNA4cEPT0*lK}=zd3 zHES8(tnLaH7JP`)8*EoYIn*@Rq?vnLF2tK3{J=lCJ`zdo(L!7SW<#8j{H;F9O@(@& zW8QL1DOi1^Uh|+*pgyvgMTCO5qBa#$ebgw0&(LLCqCWC@ojxnT2vIY`9J(Md!&Lle zm&aca$R(ulL}Z1^oPLRLQe`#=D6~>RP_T;0m*LHj3RBr^cZ-_Xg|tIwbWN**D-_7G z%RbtT_K`usrxZF+xa?5KnN*&0#HDtCxe0fZZ_Yo1jao#rXu$$Vd4oJ4z&P#D0^fA( zBM%@2t?+!BXWjz}`DkW`!V5_>hu8%oVNn3-Mv@Ae?Ej^5)Re#R#0n>xaCWc>y+GRL zc6-UxIH{%8?DNbn6>=RMq0sHG*-4yZP?+kkjqU*Ji)Qr{uJ=SUHxX`!-xIfk0b_e5 z@QP^W-%OE$F45s8lDbw&q3@)6fh6J#m&liZnMM{J__`N&Qs=e|Z)2j>%p*@NIY%Gp zqox97ku?=I`9e~`&zgEQG!a7{bJPm^X)J%bXk<(yH5IabL=p4` zNH}ix5#6*puM-L+*+-59G(y^shqc-^6_Sx^XDK)mPNSMFlj=yw1(HaCA_-DB8&)4t z8qsN2fy4)8kPcVqEs!Uxs8iQ&{{_H*fE7fOx;A13(+c8=O+L~J z)mZ3hh3!HA$hCs|M^7ZJAX1oeQd_M6ZiEd0vF2Lgk=kDa4l?R$CW(#0&BbNE>OHG2teQyH_@^_HbBK1HIySwXM7 zeT`PIx%G}uh&dwi*L`*<49n&x^Xj9~olHWz{WNs?h zH+hOvP`I$5K9qA zHPGBWVu!O7n*Lf?oV}V3Xzmn9Su40oJ_ZR;GKm)ao9leDW4d|WXrXQa^Zr_*g(jih z*Uj2})b`g-LJOWi3Ui##nT2#VZNz&XTA=Hkb+gk#Pd5XTblMb7l4*s#zHc0bpQ)a3kxiy_Kclj zvB3X+kdd*ly95?&RzW17_e7?JeuK@-)RsD0%isF40v*?lx=rrNN= zHNVSJ%^&}uXrh0Z!YAwMBd>#HAPuBav60L`vel5IT?L+bQ_U#lCZSzba~x$eKSo^ge;mCbS_13Sr=|$)B=Rc+`e=d@&?XzjMNF2MDc~nkq_6qj~@#7btDN z!#|P&Zxc5LJ*Fp^ong=HpN<+;!fu9shDw!%LbUMu# zgK|=PlL|N>dEJX^=1?5zHd5*W0GAHAIO3bEnW2GUC)I>PS2LTFn%@@HY<8hQjg+T$ zLcuesW1VIdM@CdfTHXQCi< zn*EzT_4j9XGWD1CnjwLoNkTuY>d1`LK_ryS1yBD-b+qjKnx(U8t(D>apUTBhaZ*(t zC7u{4k6?!3_F9lqULJ`R4mYfz7NloVRY5|WDv$b3s4YUh7mbrDC>*sw zQeK>$Xdx{Dd)4eC3*uQk+ZSicKC1a6w~sOw{9KWgKQdXc0v3=~>aS&Vw6tI@l00M#j`Dcbp7FC zABA`}r81CcCl$_cbFcA{9_;tmtU${BweM~=T+Pitn(-@DMEuN?3MF>&;j{&8)IW-g zE($iDDzOV&oxONy$0{UlYJ&xwk02Gen=Tb{g~T^56-Kcjslbyj6TvGaU8hRZJ<9x{fd)RCmIr z*Te}t_E{=iNZGvG4umTJ;YyMU4g_iDeU{Evdrgb8HK$Oe0xMs%`>09cQ4}>R)&{NWZWO#cMb%-@0=3!E7e0`Ou;B&+D5e}Uq6uy zWq1u@cxt%2X716bQfPO`_ge}93Eb&$DD45vB0f_}LC?LoK(r|&v`V2zo4Q7?8z<}; zZT92Yt2J{WPS}7C7G^FG44D(mSQQ{P`IJzq9jD-#3xh(_QV6Pf@GMTxT!4YpoHzSO zn<3LT0N|A*lHO zqj-Mq8f(CG0HK#hJm)r`qdr@SXIpvX3-PF(eAUG-|Dz0r@%wB`Qllc&eYVlgObVt5 zHK-8EVE2zap52J%n7Od{(Ug&DnTvg+q%dftes$?h7kd2pgv?<6$_s67~vdxgH98&|b_(xL9-;zf2U)wPMs4jiEufO!A-3;kK@N-3mGpUc(93E^y zLm~01O*E$k^43srPS^q&Tc#5{hbK-j2FRRnp_EIJ6DW@GP$2{5@WctMNL3DR+rmfU zgqekp)KI8vz);bt&79f?rOk|Xrjv$H)`w2?pZ;3mgpc+nntAVeRh)H#+RQeo)_>vc zHPo-_$ctdT@XoahO~y2H1;RviBy~`LV6vezvE%9N+Gg&#M~G#uhD0qaHKzaq@)|Je zC9cc(yTZo%;=6)6a-cf0Q4W7sXf4iYM*%YM*4o_0I3<}ExJQTs3P%+~b3TNR^vB^g zv&tiDDaby;Zi|P~hVsaC!btcC2&9loEswZl=^G-cp1M1ZlUgOSoYZwMhSH!yH=bio=|rLB)P`Gy-C`Yzs75EeoMvhSoeZRRDFLeD;uQP`G8 zKHdMS*+*Ih_NWE%ek2@A>-G^?7`Bg;KEg0cU1h_9Xkp#aVd*1q@FzQlg)Nf`(#%c^ z8ehAdgh8JcG8QBiPMTBz575F~?KNn@&)6Z8nv!_F6wgMQuX=wC(agJ_B%Y+R{saqz zBwpw$m}vgoR~C;dY@-!iG<#QJo4f1m@15r06S|jru-<4{=3UiHfrOWuu(4PR7~K=M>7Z;RB4 z0Svq?_^$*8wVdUpZoMZkP#h_Ww_`1~;H6$LVt@iN7%rz8DQ-%=m<*&B(F)I-R=D!f z-*|$2wni1|g2-GVfdyX~>_g4Bl2*837)V+{j#6W#0twD&))x8y;mN`a`@5PjC-KDp zwnhG$zw^ZZw&@}?Qr$8SQ1IIv8f-SoN!;Sjw1V-#z5)fKiB5@BL#Z%6{ zw6&{{k-*EX(^cRbuNhm5?LZA(NGter&!x#)p+$m)6;p)Wr(J~vFOj^#CIiX43WrjI zO@?Yf0wt1=Fx6l)TF6KM5Jn4Y{3)yEN8%`_(nmRnmwU}2h*!t^eQ3vf&1HKw4?7Uh zB@+TXhVcsDpbdOdVKAR9|CBWL@pgc%&1a`W2&I+{NJbiTSV6jr&F+XD+Hr?lNH0{1-mQz&#_gR^OQB4>I z*m5H^_L}=p(A3VLT7VBC6aa)*Oce^o3Uz>O#7lLx(4T7NX&5>&l=RR6Ufrnp4q2k%?e7{8s;%%k| zKuJq1+~%V~xQYc-f<_gjn_Hu>iUsx8Of1Avg(BR1gFL{-t4=B1{d~h`*i7w1LD#51)?9_N4>q~U<{_=H3d~qRMv}9_Y;iuj zFPxDHSSB#SX2S}fyFtyvCm%TVD0_qZP@q22sKNjg+NmA&6{wH6WVx@f>$9AI@~bEm7UqtHgCEPgF5DmqS|Q{vN&+def^rwr z3nF0!As`h<#tQmbccu2XzDPIsMimeU`FN30-Rw{R90LiYQ7D*)q}Rn-bBXlLbf}{P3yWj^qT7c+qiD#B86Tv znmH}IPVPQIh6tQqLRY<}@t&n14VZuZ53aR6#`Wub6S|^RitDuo>#@x-*gSV(ERZXt)ozasLuhiYxy@aGg3dXFZ+6d|GA#T7Lg8(6 zLp+CYFrh86aKAEIbQaWN0|1mpd1~he?3VmTWk`PUxDlU8J$ z7CxRb1eq2rf}~*u52i{KwoxB8=LOalc zPq6LQ6-W*R>LIs7VuiE_3bl%iv|trdriIF!uA76M>JCz`LXvKFT9{jFfrookH`fYj z=CnYCq}D=pkaV(wpHBN|Z7pbQ2OKn5xI1mT2nP|maE{Xo-frfdp))yEAsJD)gQO>) zPiQT~2vV|BMFMSw6lvjfNnWTzqP3t3iD`vSg>=@Y6}&L(;fmlZbeNMX)nU%zG+uC1TboT-2rc>k zjQ?0N^~lHso3PM?kW?v27S`6nqlA!ba3`$L&bm1SQ>{Y6MeTML!pRE9n$E(y5k%>- zSqN#XClNup%B;~DC9UEw^;>} ziG{KQDIp^@7AE3&JoHDCSct43eAEJ|YaxvstRPnS_?KAkv!LM&2k?p;5DPr~;{}p& zKz>^cH=M0N^0x(7D(*n?0?9}q7f6R{f%HTPrj9Ls5f`|HMEdCKZ~@rBLJ}*49g&Z* zH@J@OtWX*O1+hYRhE3b#SBK`BFY~Sl`@q%{D+mgFl6+``siqmEo8#z?i3RCq9(-P~ z$wF!y&gv^T6fTt+wxhNK$vvbwA*2~iHm$oDhJp<&Gm*ZMEU3wLE-k{FIV-3@vXUu7p?XLT1>I)~;Q$3}k_HL@!k|zKq(L{euz*3qNJ2lW zZtg;1#7*rNNItp4gTK&10tSn;g5DMx3T7ci-K+wsY6Z91&ee?e_bgZk_GE&>lvZ#k z@cid>V1U4(kXvlh3WFp5Dv(Ay3!M>vpisnuUAnvj$>oFP@id)~XLqy%Y3se6AQo(# zb8D)z5YFX%)_QEG>9L)z`%*cf_H6Z#G_OFDP2mgQm-_ouNOrOUPk-=`@Q>u9(rZXL zq;x{(4w^#6r(QqBIgMNH@1)ff^`oiM(L6078Op-amx}U7|iM zw7S{Ef{Ms(KIrCoeO=_1d~G+w2dujY9+Jeu676Q2VpC-#4~f!0kWQf&|wJ z{mz1&F(Q%dz0_^qe)QNhz!2s+dneSsUK7ZP{BufsU~p$*2U2ALDkW0dvQ<;P^wh-Q z&eU1W!9WTjZNQKXB!Iww#rlYECV^1>=1dA!ABiS5`B3+I2q_y#kOFwf2GVvlkV1V# zG!;C=7Te;}b`Z%iq-`xWSmN_`u7d4|{KgIX3J!#P9$}}iU613H@$!nCDCe(xsHqexc?ru9S?n zXOO%+f(R5%6%agk@ou4n*BT%MO5iVYM*A-nARMqVSU_kG+tF<{U660HalfF^G@CW9 zzOuJFVXXYCxN9D)@J5cqQhf=(D&oV%!+nL_FAALCV3H8bsm zlF_yqf1IS0Kmrt85E*KGLIKJ3%9?qN0upao-FGfcnDGw@q+qf6GO)g84!Mifk=(@w z{?V9b_TdERz$sx45ooLB6V;Isf!jyxjeT^S3+$A@ zF9`)T*qSt6vX5LS;HZ+%(>IwCPD2S7(+X`3D=_Wz0>zOHE6j`$@>)D!`r^Y1e(Kb( zB_oxe4I>N~sdA4lex?9{cV5yH)Adr!8v_}bDBv`K* zBrwZ4-D?&x6eO60K3piF38voB+7}^#r@S|<050ytJ#r*;+#|+@m0wg#?q#w?Tv4BO!rYD#Z~Fs*F_p)Z`x3TxvRC#3gge;)xR| zlTzO3Rx(l%$K&G)R8900R2=>CBV8yMC+HQ}%7imK^qCVx{X;S#*TAj^fr2D+jucEu z=7p!0%R?$Xg(wqj@5^UyAQqBLs6Bzi8vnJTu;s|DFiz7<@(eB!e=e{kDAP^a=9Zq;O9kr9Iqcq{~ zyHZ0$+l^FG7v5?{W2JKyG}cV&BAwRkMydypxQOfS9#Ih8^Gr&mwxl4PK)s}C&Qtc_ z1BEpwg$s!kR`{=Fd4zE4 zmq+?0kb+66z4Niroc*jtm+s-w8+qB=)QOt1yPe5?xQmJ&e7!l@l8 zDRYkUyJA={*M>rsQh_x)GC{U#6U6fgwrQE5!bk|fIT9HF1i+I8v)as$9f^YZ(RxyI zoZ4x6YjIE^pVW+CKIQ~q*+oE5=6I~3pz4USD72ZS6TG)}A+?!B0CCer+fe8M;c0;I zv;pC3MhODKRckW?0e}D;zR92RrVBcYQ!=Q}l}ze{PS_`f@EsKiMhW~p90u6ha|j=KNXLux zDM9NYUuibUS4w~cl47ouz&AlLixT)uDrV^fAP^L@C?O1Uyna5I3U~{-5no;w<@hy4 zEqtokgoB@{z{5Sd^FvN7Gf2>!vvdNVycCbTMOgYmRYdeia|%p0|IXGc&+NWh7J-eJsFDeA0xyk} zt}sqGCL~nv2${g+pN=et8UTd6qmW27QINbNq=L#NebeSGYLj^nnZP7xR?J~~?J`Yf zKV1X^$)=iTzUe~dkxe!8r{TuhYeg~ton8vBj|2_)+d+ggua3n1_orOmrdLNYkDA>+ z2dgoXN3)7zrlt1zG{|X9W;NC(0;$$NfCM5E#1S=b5gTjwfq^MfxIS>^lpcRR#YVO0 z(Mm%KdN=SHCIv~U!^VU9UGNFg?sBY3NgIZG@+wT0@EC!vo^CB-o}C$ zUb{0GaI~E@9WT;AA?t*JyoD!H+f}Kq6IKE#00QX*p7>)G3g`qhLZ0IU6@o%K?ylQ21(3GTZuWxS{OCt3E0Zeg_JGBh^RTU+*ZaOhLh~h+m_% zdX1X;C{1#TIDvv*7e4GNgRM>B2@1_jv!JjkYf;*{+_@`IXp+FhyaKhih5HJt6c zQax{R1*!0YGA&E5J;6&IM6$EDt*&wDNM4$8m|kWpbO%x;82*nL>hJtfmH0HLyPkkVudl) zOj)FQh^JnklD7~P)*K2tX~*&wj{}Ev(vEgrJfxOFagW;OS|19RJ%#5`_ySPilI5Xh z*x?m3i$a^ZMvnvqPUXDDo8RXYPT8D-Bm>`^uTb#QMV?{2|B7|jo(BrvX7=&^P#_@{ ztj(MYq&F#$3<(Pgqz6F4uUDynb=ua!Q7YIle|Y2VYqmIu{7n%ClkoK#!qZ)jN`c`u zs-#K^(|J^T@&SXBf^`()lmgv^W{z`Wx<3M;c9~&-!U;n*>Ld_U9yuojARM+U)Nq0{ zv)YgJTxMwIaD|lEZD-e->PR-~g5iGQpxvI$(~md8&y0hyU^XOCaZrc*{Y1_I7xmF! zFXtz$8xCx?IZg1~b+`vnT-^ zcnHHW=*)a~mP7W3tMZF%os>6nfqbX`!J6} z+yV$lGI#dK+wvoq%(78e+7rug)+l=2b55J)1!qF zqIp!asBz21l#jZY6KJI281X4Ofog#3vN8q*=Y&pi1SfQgBe$B}U{i6l#O|Y6U5dAa zPUuNy`AO6_F_>*w@TGXt%oz)AAKkE>!NartzC1f(A!YF5p42yLam16Khd7-S$l&S7 za!A2TAuo0`y zPOXk6M*BNZkYMQME&AikqomMw6s$VpnJ*_Q9OEVqApsOjBf+2hwmRw|LDiA!N2;T_ zbrjTF%l=xej#i6c4nXkgXiO#agGcBCo&>6+Y@?>?=q?Fn08o}(JhDXGBGKq7sYT)z z`8>|rj^t=s;J`VAsXBV2R7coFcPor)f_V!!DTh&c>|gGkLFl?63+A^{btIK=vQ|e7 zDClsJU$EYq1{7X0!AwoW7I{GM&69x>dT|Q_0$@mEYt~zX6V99~$Lxd`9_CR1f>%c! z^Qe8{^<;wIW&#*lFwaVtd9=4S7`K25ytf7<%JOW?)u)PJZZddafVjnAM}fQ98BiE* zGt)nyChBw)_VW!_rBzb7qtGAi0}-@gVk6#O7K)^BaRi0!wm!mCm=Qgi*VRXDee`4* z)>&}mRIHDZgihuWs7U6KeAK(tQV1iQxup=6T#PP<%urB$$3^7?tqg8Qb>2+H5Mo(nQL&C}jXYccNr)Q0 z|ADj*@9yI_kTq3Leor8nlj(1w}EpoKS^Acv*O}%?JBJb>yDHHLesd3kd~R%;v6T z#Z2CUD>W_@=GJ9C)DCbiB^3HyW{RWE0A~;iwYQe@7Hx6V+4kZ<$UDHa+XZQGkL>_^ z5b2Odb*P0T6l(AYp`hN{x(fyJ7A_R1ld^QM-dYw4ClLx)zEi=Y)0GpRH51hv3RjI2 zc&N1wPaA`2C}ish3^3OJS_cWe#YY#7@K_&o#>Eh^R69oYXd=nJ2 zSkn@CbFL6T*aiq~NU;+}rOCWnf$-$QWq9(45Cs7U=!1@8zQulvMkTBO1WhvY>utny zHc~A*M8R<=VS!ADlyI?lsClR# zN|?D!sK?T}cQj)$q;12S2bo~U(t34-oF;jsxW(%yxdZN`~reoM`8wUa{z+9 z?@HH*2ws>&5fYTNESx~lqKgER2@{jd5(|YBqD(NwTuoGvFqTEN;8CQ6Dibm#KmgWX zXaqB6`4ke?5K@kWAQM_7=n}PpS(hl-YyB|l`x{V@ED$KXo1iF?I3XmD9#RIcbQ4kr zFKs;n4G9S~c;qwv9T)X}UKOFoyl$Ibc*-C2YN;-f7bTd5B=0Cwg3j1U!J~eUIeJGI z3njc@lyDj#*r-m&I?{FvYbJ!Y+O5<~5F_x|XD^A#CF&x5a&4sZCO+`aZ~XgRAgDHK z+iEI-n`VND-<+e{{0Y0OzZFvNI~YMKL7|#n0`DVAq%IZ8*2~`>{EkXE98`i5cy)?- zENoFJA*nxZkeR4}pb1-8H({lrgoQvjYy{wxu*QY)Zw5_NM8eD{L3%mAD$vWGwSWtJ zirG{{4rTL9Pp&*_*1X`jW{wC6JYRVf6L`wirZ$ zq;kqu)Z!>2VW^#88;=HO*4m9n?i}%~$7Chyk8kosKa8OPh5d`1qkGcsWL+A)EX+At z;lFP4(aYi>9haI#^#EQo!V!$4Sx+xNS!BY3g-0@u_|z<_;IQV#(Id$?LKKwLk!IF9 zCaMeO772+)SItD#reOYf%%6KG)lF2bgydR^6Ly|ife6%M&L*lkN2k1-zyptoI_Vsx zsKuos6M&DR7EJ1BC1jgAl3;$x1hdK`!l-=nM{g!l;Gr)k5Yky_%Oh$hQb*~Co&T|r zLdaUQ<&o{S=#qk&N%=mTLpVtajZXM{CyY9w69&Aa{%KQneDksCEiWw1rb^0NUIG-3 z`5TV=+Cl+tSO^7+W$VGeHVOq@qNe$1jWq?c_AHj&QOtO#huZPYr4AqrP~eY>ApwI; zhl2VEkF?{PNhhQOnsY9@LP1Nj@s7Hr5SC`kDZ)SEk^zh|11q6m)zEPh3R~7>&f}Y& z!fq!NL=)}Mnn=M;o0=IZ5YNt&%&ru2+`^RtP3Grd1(-p?K&(L81i9QcnE^-ctj%Br zhyzwwEkkQ(tbxj}P8d}d;XW&aeO5=en{PU8Bj_;97bM#!e0V3Jw=gh5sS3jIBJVud~w_$DkoIxxiwbwVLR!J_N=Z6Q`LD1_}6 z_gY?8t+gS^EOMCDnSNSp8xvBYw$>z@T{8111SnVlPund*i}^lgbz~l8$?U-+t-OK8-tn|)2M1@k-}entV;^kPl!svW_5OX z{I~s$C#7(In%?m$*gV2y9(gR=s^I30m*+RtS^J2#y>vD6;7R4C4D^$yzjW5XLq)=4 zN7_9vW1ThR!N5jHqkwTFs6M)|^vdkDh7@$sA`)tSR7PA=B1K5>RJL!oSS_O2kuYDJ z%61L_1#TV*1DHpkCpQ%Gp(1K1_(@Yd|DCjjhIJOLk53H+=TRdCU{ETicK25c1uCX= zLUU3I-Srkm3Rx+bdqlWG=dInXVVyQ^p$wj~s4kjqZ0%{63O>s089YxOK?eqoLJB~F zK0KuGxj!k(QJob8f)mY%f)t@!Az^}(Z^R1y5d~+3gM}5;UT#>yu&}SN!jnG5KRnc* zP>?1#%|9~fz|W_Oe`K@F)jyh+3ZXvQtt+zwDe&M+Dzu~^slaEd$*c!ILjfD9GtVSa zFev!jLRY9K73{%BD3`IdFu-Z8wXq(vm_RY3A*nD?A1Re>=h9|U@KkoY8@1n2NM;c) zey$ayuE5GJXY5PqnU+-OKDbzDk&X6Nbo2( znPndtDL@5Eqn-o_XT3a9MO~zFEdS@^^*1N7uMEFWb8!@TOOgDvw+=yL+TYyproRd30zbc{EiXRZ{TsNZcT7 zw4`uff8`O$BTaCIjoG#aZ{YaB9Jg4tic$~0*+(J;Dy7tA_Bg7s!9acFQ0Ui3?am|B zM_1DJuV-tQnW_G8j)Lr?tG3?ax!Ps+J$Sb=1$24}5P=||`iMrfpFjAszdBSO4T)yG z@n(EvjtB~E22XFigYmqKz1l=oQ{j8mD2fG=EstMzR;Pmn3u=3T#8Fdm!Nq-LR_Cid zCv_PtKn3okW-RaxSXhB9AFSCyGMOMyj+!zdUO8;606fbUH1B-1a?qwaY9{aLIhpdugf5%rpOq%n67F zH&XdiS$UMIqqW=rS~gNcb>wxi$7)m^`CSfgyu%Atpn*5WI%${vinD&KAPT*nmHiMC{+Ile#jX-JBl+a1)EVIq57rW zSRVle>Z4I8G+Tme;=*P0&Gh7Bqbh2V+H1tyU~hDJ3je;)42Uc6ta4C+yBQM{$0G zd%V_=f@osS=SPcU9`3V9A#|D{1>Nq{PfOcTwWXukQqAff zwe2;mR2bp$SDh8GQXk>`LFRRSBos(J)y#_|ZNgK5sX$URo36qO2?{xnsy)H(AJJv@%*7>|3ceoo_fvgD z2_y)F%tfe=UQ2mY`A0wg^SM469qSkO!vUeaw#{um*QX3qBcxylYujT@2v<&tFsTU{^ zP2Bd|d~Z<-ew#%KuN(QR3?3l`J7#KnQLsqCTFa)I`AO%QpH2#?sZdq3l)`lUD5~a~ z!^^i-s@XCZ6h=ukgOg=uIK5(YrErZ4j8%nN4A zn+nDWIfv)%wG+K#rutIBW;oSU(BPUD1=|9!9K;J#{RV}zK;fiAAvczr`p6Qg84Bhf z0fjUF;lGlhKmi~{h-8qHs&`{le!Nx`jD zheFz!t&-BHK&qKPxoXxpvsAO{BI`8sEAPT{)vUfUP=FA!YSuS>C|pcCvjqj#9tjHj z?0Dv@b=3?0(TjvGo-XTAL4!y^`oJ5_K`Hc*pa$dzKXCBzTpne^yg#mE$Hpj|9q#hW z290o@NGqBT;-uO>Xi>idA;pdS7=;RiA`~VD*Tf9Q3Ef6>I;gw~g(*%L777OjmdC>f zC7W$R0m{5n_Xr^9?Gb>`>ePo#GsZB3*)C4`oO`pi%QFN=I2t%@U_`UgFlU7Kr83BtjSMYDy2 z63tdAw8jUQ;awF+Ee=#186||4LT8rQDM805&|C{+{Q`n=cu6v=PLgCsDAQcyXKt>6 z743us2%G=>-^i2z7X*_KJmduzGqaB*6nsiyyHbB23DSeuMbE8@GfKcF@EEGf!d?S+NGu2&- zLV+sD?W0&h8g1^u3#7C8l?Qg_gXNJMsSbrFmKx#gK;eF!%?yvUQwp}?A~c#ko!#LC zZ?Cmj7%GpbeR!X!z2L^fD|~Z4B~VG@b&`0Oed!VDY-Tuj+JT*RhEsF>M|aX(|D{wO z?OA#BB0;>DY?@i?zs_1u0g2$pt>qxzyFB?1q{%g&{xZYa%qj2}q_eg3=)bF(i{?J7 zNQyI@c51>549F(5%*7f0YmZMAgdvD0zr1x)6~ybTxQLn5Q7FIyCZ96U6G8lvoww%Ti1m^6*KU}7^oWvpW*_Aw-ZG&Jt+>e5P#R}m z;U}5AL=@Lyf#Wv2=1}lK1>QL^lxnkUC#sX`g9`4X+Ws#=VaA8@NKhc1{pAXUvp~TI z`%fAa$fW9+DUpDnaO54?N3R7aG~>+tr5`C0jw#LX8?^;m&+LYEaLGO48?s!-@I0PC-~_zcpyw?Cfezcbh$G8aG~F21d-03sH$f(7x! z3i%R=74B(v$VyC^eYAbPE1F9U+1N)zqFDvfSm;8}zl1@rK;nzsUVF1_%?{^GdHg8P zGY2G)N&Vz2On}$LNBw0lyhO4Gw{8_u+M3PT%u)&#x^ShSOe)w=Jydl;s}xi--R8p! z_T4K~NGH=g^9$BfkbT6C3w4^GGgeTi`MI*=;?PG_C;c@(2?_uJDDbmD!Bn)IR6d|3 zP4?ST$SdU#PIppwdHGQes6Yyu`Q^0iCEjLhG|vMm)M$;j*BlAiFE6BENGR>KrRJGs z8WmFLr?cx6XEjpCkf2EFk8sP5z~|Op0|mK0;<;DDjc+>bwf%h4@TM+Qo@%ORO|1FL z!s;Vo;-6&~aoI!Oo!_s~moAlNToj+X}ekqQz97P*L0!JO4i z2ZE%+m6Sf(c1}<@+uS2{n)5C^%i+;T@D&%aJhDjY4d(;_!8pNz07@v2)Kd8R=Y}WyED&BF(B>GbdK^)pVlPQ`z{H>*j($3ahiEFsG0XkEl+GmE#?tm;4oTg=CS6Q z5*OE-6&LbRQ`V@|xIn`I9&N4jYfv2-~qf)4c>wu#$&@3pRnq{PBC;$L?&*~-k;-i~M zDXb92X5&#(3UxhdRtoq=G@6fBr65SObDS!Vjy9)oYG&toYc%_k3rU5mQ7V9lat!D1 z7pXuQ6r@6@y=EiL|K;D!SZGOs_g^Lj?FUC>^lFw0@- zqwupR2mG`zusg;n7byq@UjeqUkQ7`fh!k8XWGGM``ABoS_b6p9V1~|?3qP4z z@uSvAEwlaN(*y-61>g{s0`ee3q0L<6O~Ic?dx5Ex(t13g(2C|gpx~K{E7oWh6iDLb z9blTGH0M4at@~aSxGerrsgKM*5)vks;gxn;MMA8PN~5`16?|t(0V;@% zX6hpz|5zVUFzVgFXV^cIQZQX`jkkn+1rX8kkL(f!UqPDLSwWh)9aK0p6uJ1YjqFU< zN2-myKGH8z`21W06uGBARzV^68y#orEoYYh1uwBRvFw(W@%(6D1|N(h+Ke& zhy%$yIh`(1Sti>M*Ff565Kt~CF<-y zXi4ECB)0B^6g0fnE=cA1*E~wynw^H%+VGJgsjYj|?f`SmoM?3QvwxB`Gk=5((z0OK zfR{&lozzS!Qeg`W9QW=TRJ&tcg@^6IKT)JYh63CG6cob9n%SW6<#v1g)0RoK;WeGj z9ER6uDqI8!&si~)hWkfyc#uTS;n8foT6x8VdsLcGnk0;b?v@g4@_}_Y38nb zbbqrJQk+mVGqf2rvpB)$6jn!0*Kwt=fsZ=P33DhwANi>Kayuz*d}%eaVtBS8HOKJk zM6<8Ckb4x7(8lm^PqTXj8j=O)Yc3!KY@@v90wiSj2+@41oIZGsXFvN%EfP*9(fpz# zq3n+@a|&J^xsghB#25T5`{Pr4jo1Eo;zC7|-W4DGz`y)t)(M&V)n~RN*P=D@$#hdA z6588roS;N1Ws#~QilltBUJ%Xc(f3C4(K5$rjpiehiHk%9d5)8A8@l0eCy{ER`LQIL zmqfy33=cGDpcxgBNfI=SS4Vb1#xIeOV6^ECNO6L9UEFH!2!-Zw9U+10=*R>TdYm9O zAWr}uHu==*h+3%Z0Mj{~nG?c-R063-G|f49G_!UE(@}6vkV5#lHP=MqTJ#18OzHtB@7`m<{U zQoT9~oS;-T|MU4dYZ}e)!JpDqD{~4T($ehN50)uT=LA(pCz|Zh%yfd(pL-+QlmXaB z`le?e2?;-JNbro=cD0WT2^wDOWV08Z!ygTe3wVK(D)U@Wp z4_M>s$&OZ^IWNS66?UGHk-D-z7P+7(!YdL7oT`0h|0c7-TL}ulU}jLD-JFh6U~Try zHM5k0??_EO1wnz&Cjf_9YBtGVprD>Y4+;;Y)sX-3tP2IzM|Mnkj$BkI%=|X1&unWh z`aY_U>q;ru!WWfC2&7MXQrpnJz&S`qYLs*F zVUus*(bQ)qk-Afc`{xD)vBFtn1^K9FOCps%bAkeq3qgTKfi#Y zF@;0jHDDC~qlt?d&%bvNawL@;9&OZ69^JCUMP2wJBh^qUwzZ5V1V6V#w!pR05ovYBPHbul37?gwkfFrBINtpt;tG z;eiJ)m#UH4neBgUq|Mw%f{m_~n`qM6LKw1*Qsjav2~JqKGfvPY0vkPBp>*QgOXOR? zLV2`Wgu6cosOVDa-lP-qa;PMwn&PM(Qg|{ADWHKziz7Yu zP5>x|x-M9#*vvp!VVcACX7`2^8pUioE_^X$f89%o9`TZ=NFs%YL@3a(Y3B1h_k2>9 z8E7CA)KFM=QIO{P)kupnVQgSWikTTsekqy#A~HeABlQoE3C;*lmm!55w|JN5{(-a@ z5;YKH0$l_+BE>Bv6KqJ~D<2<1LfcWW+pL?Kksz61E!2FQ4}MH`xjaIdM_vRUt+^WS zG8amS$!tp=jdqy_C}DVUwso18>#g~Au zLcvHurzzkX2?~2a;haIieN-uCpnyJBS)^uL+gtM!X&X*}844$W2=W$i!tI|f+k#yu z@GEx|f=+Ov_v%Q9*k@&NqZ7iYE`W%=wMp}6ncmtyHJ4LIp~!}(277Bl!Zas@#Ye$K z9Yw-QZ76_-T0iPSWloTH)UJ>>+SKdgHlNH1^=0wh)^x!|%}7Y5LPH85L5kUYRUhn^ zVxHO|Pg7a_gN76!l7fUsLBgX63HYaJ2bjin*a1e7RPv~GF{Gl|KFyqH^w$Zqr@{U- z&FnTRbRd%fOk~OYhH(Hjk(z7TAz#a*%Z3Cmh9;4anroLrMB|q#@3?|F4of^1YC?%baCGwT@=o)cnHxcw81NHR#om zVl`d^2aC}27KIZ`ChSXxDZHOFs(=yGsI@whcVsIr`ii+mvs=Z?!(O~25aBw3Z$mU& zI)TrycN7#eWDw^157hRf#Zi+^@M~ltyy5al{%KntJ+W|xQ)LiHkUq|w&^vVPO$p{S z!x{Ew6T*wfim0{bYmaEHA(&S}-om}3W6}xLJEFCQTFCtbQG)doD2P&**?^EJA#4CU zkPcHgQ3W$PK@vI(=C|l4STNgl!t>~aXV>4N%dEB8c~`J`M{~R*l1D~!Dgm4&dYsT!NBM=<;{+R0 zFc;N0VdMJLu3$a-=A!a*vb9D-;m;DxHYBJd%1GcFg4wz*lSnvhBpHyvB^pM88_k1A zm^W*WR);uYY;H|RKqy2`C@yLUWSh^`$7o_gn_L`%eNB(5F8r)=A-+} z0)o>fwpz|*dj<~((1@2>aO-HcT=J-yTN5;R-T2a9KTZ{#58@n# zg1Ek2n~g&npde1zKd|*^AtyKkAP`g?=}G|wxu|_8cy(mvQQ8XGhXM+Lc$SK!J`^@a zrgdP0HkfTtm;-}Nv_f@JKL-@DPDqN`;;5ameueP(bb{HTwZ>~Btp)}Plo7z7G~2W` zd+WU|zHun<$LtcATs>ap~8aa;o6D4@$-qAIfz`dg^6jUD72~Llr zvNoIG(cIT&6Fl;x6kq}k>%4?exah8_t<4TiW))0LLm>%;B$@Z#_zMF<;l$9`nuLOz zM}kDV3h!QQ)Mlp-w>z3gI3r3PB@*Cgj-#4Tu=;3BC|G@@pJpBzNAUBh(G1>Vq0rVx zkrb>x;+xW1;~StLQs6Tznb)kztOwsoL6^wEF-!{W>q4s!+8G65!FIje87VXwJgg?Q z*7%u8!KZal36Jy13*;Yd&r;Bgg4?J@3S;$=_tuOQcx9C2kqxeGsii=D#4orZ4)#;~ zTuw6zv88Z?;Wh(#(HD=~IJ(Rt58c6qLd90nT?5DbO@f&LVUa zLU|-oFs1N&|5GWCsEdY8LSuzp?(H}$SVtiYWhr>%SppwLY09HvR+#9m$vq9_k&scF z%*G0JZp~PsUmux!G+iGF3aMghH1iUy;2aQG0Vo7kFo#WQN);p>g?Uv|dQGIaMdPF5 z9v!Nh`H6BC=a^pQ9Hu8m>Aq=I2VD6nZ}!-7pS%So->wTYfWn@81j1`0m&!Y+)%A+3m((jyy3#gE^LZMgW&dMa(W&269AdI~~< z*GFsIao&MKf+sGjf8=$r-gszc8L8X(jhFqSqoqEI=j%+@M@RMihjAV1qr;^>ibpBj zR|eO5!_2TjUH}%Rby^@uH6Q@*5D0o#SaU4`!A99OxmdClDsQ@d6nN7&LrE&QeFPg| zAKjT$kY;Y}BMKvz3Ne@s5NaHiGAYgV^J}*Qgio_Z-lRe&aUoI=5S$d&i&RM8@c7^4 zoAas7tmaxP6_h<{C)Z9jJq5LyGby~)UG{PXBwREkxRa{-sJr(l@4_?D9Gz6!3qGSj zjns0&@BP2s`pBGA6~?WTDzj*tk5n@?fa~bn&3)#<&oi8X{1wTD{Pip4Pm@%LJ%wVW z4xYs+66h?Dw|MGP!Af0jfxJ}nD+7y<^!%@Qf{cQ%`cw_-yIJAAWMPZim*AqA}q7Ae?}!Xzn}RM3zD9p<~)3z@nKmdy^QO-VMpR*-mr z6@pf1kEInBn!S(!#nVSm{8+)lflB_y3fV!Dm1=%b#)7O=Tbeo#STNbV4IZ#k`6XJA zJ>rs3TEVsjW2I6b@iRf=;RWfV(oX{vBhl=r6^s^!H^>_nqE=8Mwe?burEfq-M=MOq z=HMWC4Y|gJaV+#@v-)c;n?0-Oys%meq{<5}o9DI!YzhmN7eayLSctsP4(tdE17g9F zcwzHVCv@?HULfI@A{KmgHdikcNZ=ryreMElKFdhD=2(CXp16=!TBx&@(b39g6-ef# zp03&KS|E9=S+r2kDt{UW>1=S2dP^=wR><%D{o)|GJ#q#@z(E2SaT>)Hpx@^i_xYUl zQHSsIa0b7Gvpa2tqh<5an44<7<)Z-${5hm9Qd_}0Y_t_{kUm49G&s=QKdhV*i947# zA3+bpB@zYXbS8Bui6`~2$wwuUv_kW`nDunCl6YpGrrw$-@k0K{l6YhJBLTpld{CiK zs*-pc-!bF+H5j6k#Jgb@lD5dZg_L=r7rThOpoK45bFo^x2wXFpQ%K|rI9^GH5t=zI z0Sm+Z{GIYgYBozZ+de!PVtBY;Njx@ZLkSG6i59k*UDL>p+|*hk`N9{-z*j@&66ww4 zouUWI7-ub!TsDgqj=b{_9k#9C&b08)%qeszP$=cp#WqeM55A;<+avzU3$l5b{%v+m zV!@luW~Q20=r)_j#DX4r>!?LD6|Q({utIulS}gRDfHa^6%1D3?Tt^S6X5J6OCYy-` znQXc=Dk6Dl4DJ9^5eWox5At=>Q}bLz76(Z(p>>d+Ecv4`B;5jt$>7Xf_UfCoB}h=Nh>IS#402K!ShE31Stat!a!RAAkbELrp_r`L@S&& z1L+rQuNec0x?kstXtp2OtX}hrW}#vry~dyT7c5e+?s9REOg0}bq|kMcMy%9b8`6gL038_woM=VnQ^k93nQbg}I>xibG=xXC@g+}mqe4)!IpF~S0wAT9`} ziWn^PGqx0(Rl%4ck_kO0)o}nZW7 zQIrY7K^@p}S7Bc>rVvizRB_}o!MxQprZ9azvlmB^5^P|HqN(jPhm$y0%t`I8xM+qr zW24zsLLB0RPzh(_Awi1aa1FzGE#rKbk{CdBb9#J`D&!5c^%7Kc%%6W z#SzoYS{3{?LxOM377|`c-8K3N#XY)}WJ0&6&`<(=;hpBMesh=-Q~+csSWiJk@XVoL z?vcK^9iU)x&?#XXO7J3hI~Tz%B}gY&Q^B0nF`cllR6|847&M+LlrRuV{WD2sV~GwH z_Ai#qdh*x&8i^C`Ps^e5HIigDEX>arhwWVBu!R89p>F6x?vbyYxIOSy=GJN7pT4p~Xibo?V4Pjb~2^1@AO#pxGz; zPlJW04GUf#sndMbSmAl=G_y7vH#G@`cM}$P+_m^6q%NR>+-bg%B(v7N-1A-+3)WSL z<&km!8Se2lzt6&g?TXyvo6P-23rbw}!!^w8bUV$+g)S`&3I(HuNudx=*eQbwUmaO; zAtRMf%4h#n5(>Qdn|$^GNrxtXw14Rh@-7sFh{FR0TaK_3y3pIAEg(DQk(Wnq9zBsl z7b=g&B(s}Gtz=fm4JfR^3~ea2)JG|wo$8}bf32R++zDM=Mq5cJc%zx(Qrap^DwugB zUBI+L>95)P;8SKEi5C1Y1q!2NCs8Lcv(xFXy`F~GXeQ+P=v=Ljm{k)iyktl?X{?}5 zvxicR6?oW7{%Ek%d?YPC`qjD)kGEcqXY(iop-`*fZAU^akTwGnj1~Nix5s_%vVUZS zxDM}$$t7T_g`#@|CXOZveb`u`y9CVg*@LX03aJfUs6v7RR3Y(6c6iS|@(M|;;Ma&k zsZ&H&`{-J8jl>i28rj=IxfI?O_kQ#@d{3H)6N9az6#50y1}b4%DY%c?R|<6pm>tHs zf?6m^JYNjiU-vS;81mC*qe>yCf#y;maVc*$q@XcQg;F_l2N5kKs6hIO^xP|cL02Pwi&uG>a6TQ0F+?={2wsr2_pnrq@o~(Mjc= zxzNq_7hb=M>YXFq<$Kpl7nQ(e?XHo}{(M;XvOp?O74hWjXXz*yFlrJn9zgh5@=?ck zfLW&*Oq8LWL;b|N7O}Oj#KVYlh6_=@Rm>#PcMr=3ho~DI|@rn z1t*0d75Jk_0YWIGpo!+YKKCl3IYPk~XZykz?}K{lC6HWEPMe9{_+r~@;X`P zIfoz83K+$Yo_X&$sMzs67p9ukU4tg1nom{L3@Wl}w(i;{sG!tH>+r55`)JQtfnTYm z02V?^!8^^U1O>FOwpd8M=_e?M((nQ(uxws4-G7(%1^?Z$1Z>fL)?E$c-**Y?@x$C_ zxM8%>{4Ih)9aS(W#Kqa;P`Ex4y5QkY>+ralqfmek$tRNq$t&cjpkHC*)^A(c{p{IaU__FW0 zIGJXe&(=mWuY4Iu0SQf`S)*+H6Ob@Jv>Yus2{;r)3x1!yrw|PD5GV)^(zk;a-X9kF z0VHcGWGrxh2e4pTVH68%bRhkT1T1jXI<(NdE<_8jH>z2g3nKx3j%^ak#BsHlkSiuh#(Z-i!9zg{JI7n)*xoUo+7Dz!VR0nBPHMdZhzm*Ckwbwjz zAt;<~pm4RS=BuU^bl8-uW@{?k2wEYzt5VFu0QgCVamsA|z~B3?%fTX(w|Ni>;Wn$$ z?CrGxg>Q3(^!}i5eZefJppd}Ppixe}Exy%I zfE-!_$u?)F0*NB2XoWr$>XuYzg%KzKgBA1w{&Ogh{9M{CN~Rq|Gr#!bz|@W%$0<5! z3#8k8qXNnMYnPA>J0_d!>g+J!uL6nukunz>`dI?nfo(R!KRuW3a^&T#ee#X zT?6SrPZCNtk7a9abI19Ax)VQcB;lTUsp=tFdrg^(sG6r!sa@4vw8K-wUg`qXOz1-W zwG=DkE~1*bi#-0h@P!=wo9w0X&2Li*b6uuYvpJ`N0QXh3q+hg6zeLqbg$}Y<0167R z>*9P{#KM6j7O0LkK}DxRx)HFjgl^7aA)hxDXaPdt3Wci}&uBI*014Gh5)140stVDkQIm+6t+o z7Fy~w3+dac7K|78xf#{MhZxc+-R6N2e{U?faAw3`jfKn$am3#n3&lf1F(k=#ohSc% zN?FKF%^uR$ds|#`R|~EU&Z8EP&_O@QP0bz>C6W&|hZ1RUT0yjcZgyH=b2jDAAKl6- zd7Ks~pE!!s#*9=E&GKRQ_YNB+(W^sjdFpAWI1X-?hOy6wUe+TsEp z{vw=_20bVMgFCH|ysm6Kq%^G%g!8@Yc^BBXg%t15Gx*O=-O4 zX+b0q%mv3nFc9RR5Brw>aQzjSWr@rnHZR;)QRD~=T z%uhY*ek$Cc-a;DGDKR8N2X#@?TS%uW-2OZ7S2}w|Fj^xW?7M{}hxGq57(@(-@RzKS zsDr&m8m%MUMN%CZYNVHY(bSOM^`^WL!?#f{S>-~v%-s^grnz&CFsVvwV{LXDIsI<4azQ`$xYlUO)vDeb04O2;Z(?PXK1 zrfu@V0-qGMNT+hjO^uGKMe;yJK2`xSjib8q*}IGw{_%JOdDt!FKKE+jV39x%IfwM; zM>_+6d;nXzvD~}Cjx%Z+GKkq!l;QpBZ+PPOp>Kb*p^IL5r!3%@Ug;#@I zU|`|VcKOTXaGgPDaF zk}QK+)>SXA+0@XV%p7eJRsqtJO4@DCx2ipdpUfct!m01 ziSBdFAQu~{k%fO=Xo333Ms>MUKWpsXsgX=C#2U#Q)lumj996H8B(45G_TB}&ZtK1i zJOCl~+Eu$3AV`A}69eEO4KcJt(sV{{oC$DvNJH0*MAEdwxNc0*w5xH_`cY@b>DS!= zAg%(@v`r~;M$=3ilBN^cj_XIAZQ67bBFC&dMFfNt^xs zfqNxNc2ajX{o2`Y@R4{N0O#?4KhD9esf8b@I{%T?Lg6paiiNXZy!iRzix+jZu*pQ) z>@S>E3z+47o?56)L;?@wE>q)oEJr+h-xk6e3lhHR78=^&9l|q1^n0!7$W~97+FZgw4?L#Z0BkP%Ci-}JN0iH z-jP;-J+#RbuAzC8R-ioFx!QkIgrsf?|I@R=+kXftC;anVXJGlvoIGfV+Q)<6iG{R@ z6#zA|na**YH_gebMHl{2BdTXvp*9g|lk2?6Tfo}p^DU%e9UFL{{&~Dj-U3)5|2$qT ztp+BbP#n3=wGSb!LBcF$n3{TKdTPyE0K3!{bk^qNofk!d>r5q&7c-Fx*O?Y{){_f` zR=~>t&0i0$dkcspVfICJlZ8aQa8Aw{e!_V_JavW_-hJB{&lwiL51)}=tV1ClpvXBz zk&2SKR-nlFTeQM?67Qcpxj+UIrsQo}yhF(a7(XEP`l1D>f?7%4Ktc&67XY3gom}{F zfavX(HWxYQcd%xGrd-tAWXwRye{bi^M5J@#sl`Mj7)g1ajSQr7f2^6}skM|dVyfrG zQ|pTs`p--|+65lK>^elsN$YD=4E&c;(~oUqAn z{?PG!X>*|zX!XvA3j1hNYTD)eAD#Qbi%s!VoSs?8R;=i(eG%-f6SX)0STpP+ zQVN?`;Z&{^i2jjS%UPlLy&ZBMh!yJ7Q@zbUuJ8dk32$YE;&;oz1Djk0TG3fszVkpa z`GQ=9FP)uy0pkc3Q*A{j=>LqXP-uzsmMjeBtNaf>b4DrrP*ylJfuO!wYZ{$ZbB47YfR+YXwmLd0K&Z0nY$F{}8PJu~7>`*Li^y zXR&;~zG9>q# zp$TYyDoXI5Prm?n%obll3X7EUOp$U10}vBHeo&5qlF+!S`_0wDZw4dOETlZ1`bhpe zY_$+ljTy*UK;Q^pip1wG&P>06Q(Sy5_zW|gorwg700-qWk%~N9_J?Pf0VcrPTS#a9 z<~lPFqTjl9_brG%Z<@_Ny|eJvmHtJ_nUn!YKG*KR=6PQQL&@Klawfm|hdNZ}=+4b~ zwoMLIJs0`oRt(^Pw}~OW!&!Nha>oDLOhu~wN-a@-ErwLA>jWSR6DdzE?80OVN-fk) zq$0II&I0s8Ew%8-*_88F->Mh>{QQ*jL)*^(=tV7tw22pJD$+TM0UU8oo^8wKS$WVJ z$T{QlFSq}1?`(qVZxxO+6vC!o4|t2?e4dSTUa0V&o)zBSZ-#aUE7Y+#^%hn@$vey} z5J1ia(RqIJIrCF%elukv>!F2z1Wq_F%eKjHJ~y*~@X=q_O(aS=*FJi2)^Dz57HS{8 zIJ1@wk{|k@W+LVC1SM-ZE6}_nN;%g*gmexo)h9xqU?IcM6@b**^MVQ}SRKy#u!ydZAdf0M|KR>raeuuG>t$Lb1Mildtg4$!*^C z$7g2b{dY#l6?>r){(r&SP&6`50^<;BB zl#1^l!BK!m4CPRF6p&y`P?8i`h1s)?0wPM3RUk)U=A5j;gSn%y`SUO2C{!=J4@(wm zpOmk{II3>`p%MBWwz@_@Bo*`VNF&sKe2O$eF-;q1n=}Hn!MPd%w$T&cc*jWvQuF^^ zBaGjW&&sPi(eG&OVh5cgPIG+*d%XohuBRu#PjZlP+exybq zcln)b1d1H}JsJUz6yEa2@sHLbM|0CIvrHCtsto&TqWFp%a^@?3h>~!{;%w4jbAf8w z>WU>;==y8LVclxdqG{Z7v=!Oe5II_OSLZ;<8Y)G1xigBbxnV~G!~O9-TVwtWeJm>Z zH@J-X!QDcQ;u4?pG#s3DLCtv@yFAd+AvGFpVw2ofE?3x4qKwc5!#?Fq{tLZ+@Kx5X zph>;Q$onG=mNscVS6GwATGXgFh!oDyL&K*FCOIoB{?9bD^ah`b(C{2PCSh25h^F%Hbgnl;9v53i!H z(FFF#!su>&E3+(i(Q3wSjg{N=VN>Z+Sj(^$(%}MmqAS+5mQwVelUT78dBTkXPgyz9 ziHhPA=*No1aA14UpbT+kd6~@EPHQe!$A`6(NsysG(JP7KjetaUw&6aDUU65gxwVw7 z$a{<^DV5j40d+lN&P10gv(AzevX(TYgUr%-m-$*ccPu}oSEx+-B@bkANfsrc7EER- zYSis8!&Psy7oOmmQEo{5)GGC!%oKE{cQW%)d+%g28O~*i)sUt#QXM}GwN@NT9r8FT z-0FWhRyj+XOS3?!zOcJ2t?y(X{pSCqeY?NrHrJ5zUwg=EFGeK>7}P!>aHcZj%-P$Y zl!3s1(B{;huK&Df+0jr({p#(j+W3p3KbZT8AN(;OK%0MlCsAfoKd7^tPEe_>_*zkf zyB2OU3=(8k${&sKlAZ4qj^Z>}H#uw_J31z-&qMZ8*i^0^WmQR{!Q9ZLu zG`t9bl|aCu6Ua@*VG?Qx4X{zN|9z-=VRdvqLr1bq~yfov-;St~mST!>|8k`^Nik!3Ax8T8fl{ z+B3olcBvATBw&^KTBMjM6#)H&9V%tgjBxEMIQ4@P?wHIb6@<&YjCLurpcts;0$Y(1 z;8|RvI-asN1s(D0ySx#8W{+{829O9IM0@!Tz&8Nd9Q}SV4ive#N7bDzk4kh^5Nl3a z#7>(|a0kjHQvs4lfO+N}JWtofj(I6wh*T)6=U)Bg(?9jqmul&I#st-Jorc?!vWy|p z9#Q4!W8cz{8S|FG1tjp(+j7165Jq=ti*>uTVE}23oD}d_{(5 zuce=1h<-xk8qr`g{6}F16lPRaz5~6Y0lG^?`IGq$=P8xWoq4eYhKfqITGWMG#g_M_ zI3)_cZSKwOLnrU4gCnAThxo?{nxY-fCHjytfIe@Px{PPiWAxB5mWI?qeHYS8=qav4 z>PkwZsC6|zK|OV;j@!7oX{_`@=1~#R6HdzN=BuJOzk%ENR)6r!8^y_7?fv>2^~Z}N z#K4(q&vb!+#k`IEw|=7&Mq# z!&uZsmup4rbH?vv%{X;yjGb3?*dD^c9YV zNc`4%o7lLiO@(C*SB1acnnrT%Jg!eGETgJfxr=m2Fl;Ey!>hV>{|@3 zEx0{prelH|NcKAUP#jQ4gch)EEdRw{{@%t#gLFR2Zqd>A+y>a=g|C*x+?o z1vacV0@(Y)NWD1AyX@znfmEPpXv+;NS)2n)o*E=B6;pp=&OE=NKc^T09}!$GiYLnf zVF+8Kz&59j`&-dB+$V_;5lnCV=Em>*0X;>V-+TL>GzCJaHONhFgDcvq$%G*CfV4Mt2`@=`^efe*|<_;LCI~>FcFyfRoCk(9KGOR{CMHMi20o39{s_lklPW=>sU?U$YiE^sgse_U* z-2s^oESBt&@0482O%rR4B(jZK^3hULOnC0IYL7q{0Y+iVzz7TlbexW)Vv;)qK1p&B z(U)b`CBg%)>kgIxW-HP#NIhM$6D?BdT46n$s&swD^)HYsCeWQi4PXe4Ng0%bC1IyB z-U5(NCx8!-vyfm2*s-(;TlL)%48&|e^X54SRIZWdM;P|G)WF{u00$@+3<80}S-Vsx z`L2KU=IZv1!4Fa$*uY)ohRapy$6;EUHvqP10^>GNhz0JY`Vyw@3$`6r1m}l|5_vorQ2q%3{%FpD;SqCK86Io1qMOVf!>&FbC(p-%LvFd{HJ5ic02;cbgEV|ihOKcL z>4DKus+_(R>4}1^9c2pFze1zA~sp3U|s`n3N=V zRRcvQw|io@H!Ob7^W{(S)Xy};GCd+{oI_q`k*ie_7i8!WZv$P-Kixb0*drTv9V-yQ zEO!p_3g}xg&{b^laA^b*h?tVOpa6hw3xEzeXyd*ENspQs+$ucKt|GKbt`jNvn=~G2 z2)3cqfb;|j`oL~P6|8t?Ud{u1WMCnPutVFUbt<4kHVBzpmH@rsZ^bRNTUMJD&heUm z0gqw@l&vv{pLR44%0P!mCTnbh9QNF&EN9B3@So+82xA#*)lw=kRvxW#@7dh9FPFS1 zC2u({XKFVFkfI9dMPs4oA92};SuVAyE8N$Bq?25&sPTO030qr3d+0M7iyC$dNN{N0 zBtbs}%DojA(7FHc_xRU0Za9ce(Y9c?qeWB@JZxn*rg9Zb?xgX0>e zz*lm^m|?bO$^^t`%#*Ech8D^I@oX}Z_fPwV3L+}2JA-sqyH-g?Oh3EJRaRPzp;WB# z@&z5*V#qu$tctpaYYU;RRn&Isgbg{HMV6Qmi|)KQnWRBU55e-oqefdS#&d%%NC(zO zFEOm4zznqVmOUV|4ynjqce`T+o$hKJjOZ&)c_0;y<^8UH@UR3R0l5_;(qHj{t_eP@ z^hh}LJXHKdicpD!zLq+Pdr-5Ca%mdzVRL0XQp#b;d)Ktb_B0H->4W@I$MV&=an5cy zB8HRYq&p=+`ofkx_A1^Pl@YB15f0L=^o zwW*b=wi+Vtqk&djU-TwDDfr1r7i7ezOkWR76@c(62xS@(+F_C7nt`k8azOJ$%xZL5z1uAfWLpBr;ZJC#%$mr!v`aKRxa0DWER zz5-roZ=e^^7^EL)*c=f3oDve$0%L%UvBl-1JzV%s!V|7ej{BvGmg-@1U`|WZ8wihk z7!iqS2x4W*YbYX(*ujT0naE_Hy2Iuk+; z2HdSA9nc0_AVH`FR|{c__@{sOJv)PqKdc-5hOID>z!pF)!q?H9522Od1#+Rlrv3h9 zX*!9KTGA0#%0Yz)b^+A{St#rRUKj`gnwh96jQU;H~200G`N_{1DMsz~3Ye`$})O?t% zbQ?w;OnnTR+6UyZ;i?*_`6&S>futjj1gF`d6UK=3qB)Z#A9RvIB~I83hdA^V5VM8w z4-7XE!khp^Nq~xB1^NsCVvZb=rBt}Kkgk-PDKX|hJ$Rd|?CUQYW094hBR#y#`Bdr) z(FC(64hNI*P7Fh&>JDW;(mjJC^NjKCeC)Q`h0aB044`n>-@IdMyCT_0Gr2`jXo&Sf znmTO0lLr{jpwf8(Gi>d8fH_+uAIa)c2UOE{`hpyUu{Q67VBCzCmF5QK>kYkTzyk^l zfM?iAQ}HD{1%@7D7Y}7?CWXx)zfxOzTZ7y0D>);u)GuHTAP27|QXMmLw>nYJ&2J|wa3w_e`19b$$a_p%wba(_KMYSv&RM^exg2^BV zz_GxAYfKxrs5=53vVq19qbCH=z@}>GU$~?3DEucF+F(W>=D)34_N*qEf7n4ROm+QW zM(VO}5W+lwo2o$$+bPGnxMIq5%3G*EkgbY6B4Xm*7We^3-nO8#iG%csZGL! zk5w+kR)CJ#>K^Hq7%W;r2xXB}R`#2~@M1g=PIknC0bI8ai!c?;oA zYr%lGMd)VhD`5Z)Zbq6E3zBSi0-LYy&_dUCRbS0~b+{yh5zmV41f(@r6_q2+s2&p+ZC1>fYv{hj%KjGw$~A|A3hS zrWRQEwO8{*>yqeJ+uigOcj5saUqI(0%Q`P)m7G|r*KfHLY?T=Q+Gfei~{al zKq@AX==$&$X_-wWUBa@l7EQlZ#ngZhstvCNrteZfo0TPnTYML&B+j9%h2J979@ z*96wPBe@_s)(UXLp4Z8wQ~<&~Qbk^31QHnbCm;iON*`u=m-3vU+Au;^7i22r6zXIg zo8=)Q39)Kxcx5hLH&}-X?ZF0v)xchr;XLmIQ@CI|?EvU0g&#U(C6-W3*cD>83)Et} zSw-idCAu_>NNNlUX5h{%-w1<^-y5L&*vgtInkgn!Rv{>DZC-Cvklf>V&vN0$xPytV zEf}4y2Kq*{$%ICo)1<#>x?U7Js>5MROaX%XAv#^?0G;v3+|pa-5Ef1k<{LB$qIrPM zE(MJ108?rMjwGznNwV&+-9%*Lm@xi?UDA1OnMDfk(xOd&CSC%6yIkomT+t5P_)BA*8C3 zq)yqjP~{4oRdftH2pO=Z42QHxnrZ~w4W!MaNSt&5#*gL$$+0DF{MrXTyz#xi!sE21 zP76?8PV~40L>mnL0>j)3Eg$M-X({VO=bdGcCnP!^)LiUsxz(a0S^&|2UfpF-0-^wr zIdf`v%+VREQ{|8WWkC?JAwJL-V5*6m0(VpN4N@cDJQ|V)Qb0u^N8>jrxjhEJHDuJ@nR<7_XQBSnX7q#046QRD_#R+r^dt z=L`Sq#*@E@7in`581tL(4rnvRp}Pc@Ch$iXEGH60*90KRDzG9UdC{IT?zjlG(94}_ z-DbsHj3v{L3Cw9UZs2`@9S!UKcm<}hi{7vV0I^H1BwLSO?}0a*lNYX7LY*W(7X!Xo zfhh#B7MV&Cf^(9OX_-g9s{&9B#ikP5YAk~+hHgRi1S7nym9rBV?FIL8w&JlY#x3;F zWnLGE$+hqlL@FE=$t`UmnFNA-XBo}H=Hi|@ zWp95(f%%|g6fn=6p18akm>j$>862jS7PAM&g0eE5b1pQE zhN{{wN-^lJ!-(2&yo+|J2JVYej|&Neck#H!Sw{fhjn0Xuh%h4+oZ>;Ec=M9b-C(Qi zGL20!$tct3&?KiG#}CrASf7U>bB2Ule z6;f4c4;%3^SP30QcwCbS1TqI0G`7MMf)H#k<~kT5i86_IbsyTzJg6b^P{{ROC+~ipEtT5@-xOa-|ud+su`b26F~) z5}^leJXJvVnDI#CgZNh=?Q;_;FsD}b+ftEkIGAbC8oBIvHv~5M7ct!==<$0Ww$! zKA8a6_*^L@K>%I`vBBz1VM)LkfQ7VMcpL74pj04c-#_k@7X z%5+#3CNvWVUkF&0XoQsqJ$06Aw%}^YWTe6zg9Kx2-o*|qp3F~8rWtySNP(@fXjybm zB;Z3INW2}Dx5G}I%pw(#3fU#FY!8;~^p05tSk+RDKA#ei+M4eGN8wH*@_@07g(HYb zG4?LBQeH|hdRC4tmBlOt{i(R)0L&m>mO*f?36_%J&NnY16byp`_L5m)vBA^7`L{o~ zs^Q+NY7f8(28LN5)S$+1EiGUUEx?7>Bc2$l0Lpqe`HkH!;;VtQ4h#wf&m&NWfNG+Z z_ZtkDwHt}HEC*c}B~aL^bRqpADVZtCL#alg2!I9h2cY#3R$(7?CxH{8F*}5adAv0#hC}pgYV4R^3Ew)4T zd-ouz0G|rhkm_Fp%gmS#gU)YRnqW^znW&)^bI&rRb5Q9%L@k~7aUI#W&%Nawu} zVh2M&OdB`{QWXG)3+hK?!B;{N_{=V`|M>MEJgVLQgSxK-f#igd3!2M`0u~7v6=PK; zY)#M-=qkArG#jc(!*7pHb26Z7RXj7-l%g|@2T%?r^mN_?O?MB`@Sh5*+Ec#S08ia?w@ z()vT_Ky)1K=xjcKP429r%P!lWn<-;KZY-jMfjaNm?uF=SfcIVMjHQ^}8US(-;4)N1 zH-g;bmgutPq}V4?gV}{VNtwi01vE^pfN>T~2xXn^lHWW2{Kot0=6bd;1u2TSQrh7n zX2HpP>|OWOG(sgTKy-1fjUY$h#UHp1JI}wHgGT+k9d(ilX>$>$N&{PS%K}K^&8lEw z*SZD&s027ffdXNQhF~qH2pH1vQCHedIYM-fh@qS!^x`pw$PQx*q=qGP&@vMURN+0+ zeLh6&0=JV37+kHMtSsD2nH)m2SoP%=)@{L6LcJPxAk!=@UkJo3z;mN(kZCEhv_S|S zFsg|sUGQPB6?}yehL9H{$dMs}CG7n92!@j6czR>-R;m@- za^Qb0XpO~GqO-j)jT@nB-er`NtwVi|aI#3@m$-95T(bNz=hhu^;=Lp8URM`4eM3Zj z?oKPHn8;MkwWwz2OJ)$LJKg6DrFG33K$d9R%gfNfe6I@wL0keOvwf+>|JQ+fbrN1= zjBvp&O(y&HS_^J(_wv*idmVAJ5Np@2bKNSvOB!RJ|%~O z=D}HEtjSKLDI0I$qjQ(LL)x6P=7F@`p7jHh@+P%aY>|lEHk~l{2qTDvF8c$77Fg1) zjbCC->`UZpaz}YBZP)f0YXLrQ{(Q@rg=GC4KBa$q)4ni|0cOv_^Y9uNw@IBQKR#m zoc7p<*AmnHaOaV3xJ3s-ezN7MSby32ca_N9_L;alu@bqM1m)Gk_M5W3%X-C{=1FWi zu0E@C_z7*-_9a*IWS6=AK#(-6K_Xu2okd=&!L-`7iY#T5V?o;}2)MH?xxhb_S=!08 zcR>1Y47hS=*>Wc3oVj*1w$o-u`|F3k?|o_GUA+bJSsL}Xe{px`oUR5xV=X1_^59au zMs~Q zgW!~%{9Q)RK}`9Y^Yg}b zv9q^ze|m{4uQrEg;=A~&8Gh`pfmQuIL-WFFTHpJ=WLmcd*9KRl+kIz;+L}6*Z8BXq zGG=Wb?r)lczFy|sO%Xp9SGq%YxqHlk-WjtOI%NKm@O_;XBWQ@$25-{Zy>!TE{8#Jd z&$c{qiMD+&-;Ruexm{#kvfphxEs^p*QN1k@PTDWrPl%5XW&JZd!?lSWYhQQE@!^}h zoo7WyrcJaZSMLAV(+AYc#Fv)Vwhv_!Lp?7~bjrJCPsF`^pLI}2AOAzP9=zWhe&HIm zd3CLM>w?j-Zafqo3C(n8%Ym$-R-YZH9{8Cn*3!Q`@Z2@&9dh`tfFIyHlf7X$lrD04 z=oUlI^zKp9^2|wjHQ#BruAAI#R$5Q()n`v|`H53wyG3V~c+=aSaGbUH8ciJhX{$r3 znRmkjA`Cu%Z=dr~$@RI`{kMceLE^}&ELn@JvtRB#75J~9molCFm|lM6gwD-17t%p= zOo_vvw;bz*ul&s~ePQFG->wnL-qiUSEhu-q@*z1t_ncGv1n2X5(i zQ~#H^+cIz&pXv~o4a}L^+tMVR z>JQ9dW5(mxXqS5Cfz0fml5OkX2%bCgjde4UAMcFg#@~13`{l=eSFGy?2d`~DajWP{ zhp%wT-`>ycZ=We*VDN2QJG!@ z8-8W?;_c#ZTFAic<)nPuX*Fwe0SV?_`5j%S@p>Ob${jK54>7E za{c|4*PFACcn`mReEi16SF2CW(utFw9IBsWz)Y| z3_f+}$$P)l@@nwZq1W!6*oA^Vboq57zJKtkdrw!xUHThg|F^T#Db8LBU#o`u4xQc> z-!E}?J<7ayq;2M*WR(?+cat zJ#_oF>Yb0C&c^oXcbmWRaDMXY*ZUs+ruTYF{1N`yZToPN6(^^S3?q2#dH%HV#zg;( zv#+J%J?Qo?J@m#=@hDF2z{%9(!AsZU#B?7^A0NNtORw(uR^^S#wI4e4>+WOK$8h{( z_tE6>5U}oevnzgV{6mL6vV;LuUVqX1$kKz~s=R)!_wJ=Hh9TomnUzWd?R zkB!~-z?(+=*~+&cd424$UHX?Fe*K~AcMYQGkG9=-{PfsEmmdB$Mo>YKIE=9ztvvcr z!qMsYlbwC%*K?QTNgGr5o@08#+$hcE)TysJBs7GA4a!o2O{N%A2YXK4^n>M z`bzD1Ykq9LKK$A1e_sE{VtnK5$Boy<7OQVOG;xXkc=NXJKNR9`S+f!qluGM6wQ6h$d0DBhst$#!&a)M z2jUgI^;L7sm>oY_wp{%dqpG!ZA2Zs%ER0j3`Jd!i$PL+USbf$-p|#_9|3(&;tv6C* z=J{~Zs15Ej=6&J4<}Op-y{vvpxES9=Q-+56`N6wA{ZuU7v2YSY!uT$+!adnUsDCCr zwQcl3VY#70XassjIXcODa#rsoF8hn@ZK`IPfeFWdcMOqfEC@HmG(j zaukN(Dk?O)M#B~>T{bFHu`|0KR}2evQen6p;!(rd9$t#lP@q)zM#Jq?YH=zR@!(k4 zK|D}>I_B;&b>#&klM}o;Zn!PS4HT!z@{z&5xMMMFLGjVVqvHO!vJ`fqN2r{NWil0a z>BnO99+e0MrItCt>Dd)3q+tdq3{f@m{02INaiT}4*`PrsiGo5JC|Vvo5}zIEOJMf6 zf^LrTHna?&Q2$#d3>xcL=meL>G}zKCAmHlMf7Brb4n}Om#bBR6sfYelsWi1v>WVHM z>~MCh83D!%yY&A0P))T3h3FA#4qC0JVssOdM6_fyPz+yRkDowc5D&W3aaVAH3SD%E z28v0F!f2X`G0>&Zlb6P$O&)-ciDi>06A5~b2U{}*&=Xxs3r3mdV-GOMNg5;WY#yT0 zQbJh`ndkzv`0l^^>p%U;UurCfs{DfSS}bQoIL<#iamWpOmHyc9yxZEIbN_qsccs(Gz3`!v5puR!pGdtD>um&W_jr??)DAGsL48W;`v_C5R3 zM1P5Y>xlP|kycNm^Lt#Y`T_?%px`RLOP}Ra@xA;KC>9S$yoxvB)puuucZ$W(Yx!=N zIskvyhbIP&#c-$I@?q}a!As&Q2xKqcsV@$SC*#wuc}W~>#Bz8lUL0JD@8P?I5?rcZ z9QJ!Hq51To2RtMFpmFKpN}p%QON`G>ct#xxZ*Z~8@U(3&gyUzxa5P>p-W^`$T^bV{ zJ{5Kx1`3S_?n2Hb2LuMb%r9Dez^p^!MdNsQwQZbf6z^{#iT$*vx7zp9syqxRQK$ zB4|B+1`whSh&FxOdOUju4nxyt;1F0Z7=K1^C@Ixcd){LKxhxUmrScukuqafE@z>Ef+c$ zXVR?=|A^_oaO6a7@Z+iV$?){gnH$|N7bN=sX^((jo{c?INnUW~>L2HX5+evdp55|- zvzO_HQ+-jpjIf1LP;Um zm(pac2r=ROP}6A8Rw&4IAnl!8ry}$ySW zI}cc%X$AGO3TeZ<8IRO;-hhYfny=;!QNoSqEg_zZX$3T*ys40Mn}-$=^+hWYE^!k> z%5a95Wy+qr;&1zJ+}QmR^$A-!-kJvG2A}3^=&Z$(MuVTln98V|B1NJ=U^NZKtg|^? zb9#8{JIm5XzM&I2cIjHw(H){M*ohfj!gX2GG)J02Lv@kT6GW4TXKspz>t;T3{ZP>tE_!LWaq%$83i&Bt8NC0>;;8&zgCG?@9^42s{ zgK4Be7P3mB@?Kd{{gwoAa>1sZ>_B<2ktPyE1V`0%ya1C>Jv?AJhBOn^l9}*y1f16~ zKrd1}J>2*O=LcUcef58-Cvo)<05BW;32wTP!k~^gpucLgm26=KO1fe=g3tAG)8+`o z6I#T8C?VU8PCIVEhO$KiXrak!%~J_;kUuN0BI1ncuIbH7(q+5}cGs^4mVX0Th4XGx{`^m3hhY6HM?A_>R;l4f5k0*HGb@vFEXqut7ZE zm^sdUd7aUPY#0pGmL$_gIWoO0N(eW`0pS4tcB*nGYl7LNfmo>qq-D~Wh*SbMPt3ml z;vLWZ9kQyl`F&2?)|8hMm;>NWUop7s#f(&Bjmm*i9yDEv`Vrd)<$^9dOQsO`_)8O4 z*^mc5#e5j?OMxhjbPDG8274k@HFlz!QEv&+ngEm@aRLkQ0p5F0Ho>10z;p*-*)q z&cd|oOGw3q=^jUVS<_Z213S?(d~U@>f_)3SxdgTWMshwGIe{Ek!6ur+Mt}}KodTCs z)H;_4kL7H^-xYXqIX#r9^8v!DAlxpM%>o*m_(h` z)^i@=ZC{ST1RVt;ZJHEC8^+yhRz8Lx%ml-$o-HAfrCEON|1 zr)e%3w1-;3E&=*OFv^a#q$yR(SkY6JPp%4An2DuH*--*nU+Hc2h7l03swF2}=&KIv zN=4|63&umwaEH*D%uZg#6o`h1W6IP#F^g7N>hu%LPxG$}Jbxl2Zt;!%Rz;NL zq8DK%GLvxPv}>h|)j8+}u9X`wmQHht2fzVr1JW&99l@&FLS40BG)%uwZ2acX#ourE zs(D7Wv}p{Y84flQ?gwRVq9DIA%{!A4o?U> zv}!Z&);Y*AD~*s86}61v@5KB`NHXr{oD(;qzQtkm42+{yv?h3+z|dA$UZ`w)H+SXA zOfV8k2eQ0>4cbLC5g#R5*EJ{l!v#KmbD(yOJ_9A?rTsbpFa2cM1%6^E6Amp_jtkwg z)A185P1c%IHIlwn6FFV zvYM8V-i6i*heAA~^DPr82F zK@FlJ6gda^TOo@I{*hV=TbGB>X6&*OM4ZMR(MZo+=4oJS@N^0p*8tVO1Q55EfFMX{ za1WselSm3Za{yvZtu&rhGdq&qfhA#ZjfUCwZWv@`tt!V8Tdhi`;2r3hMDuE_quOK7 zay72Vi9xL8oy$=% zqG!-3gql~9(Xb6dl0o6DmX}~>g!XdIKUhr*{)zg6S?xdn-7o&y6AwbP(^g;xVH3*^ zNaH}lYX~4<3PIW(7d$lLKtJ=&-7tb7-3sgwI+l%T2Tn%LM7{!9;+V~@Is!GrNW66n z7>h>EMy@*4mm_Ev6PG%cWVDHo+F*F~gKwY}$r`9}5h1CjdWebIAwJQwfohH;MiQ<+ z0Tb!OL^MOF#zZys6F0&fz-_`4n5eNytmoPXb7>^dWDCu#vyhpykYY(ZW2MO;h~yH?_$5glk6gtf-P1onU=JcY}%q10*jKd_;6hg5FnnwOAT$-Ed$xjEi{Ha_G4MJB4vz0UlGQ_|UP@zn%v-gE8#X~^} z78{dInCXUE}@J16&3JacyzNcuZ^2R@G?9bD26S7^FTrZPAc-;_$DJw9}7>eJ^4TWoW{^^?`v^1vhZJg9M9SKeXTB^i5Kv5+Tp*ax4Z*aU6Yk>Gk zRMvJJrkhkcOa3Be`-~fH$4Ld{{tYm5sbe;6#cE7jWiZ{;Axu^w)I>qp8)MNZx|Bi$ zu618&DI#}npnisvv5f19AXJFbpnIGj_mgSMlQ1p2RG-6g!=2oMpHX2PsoY7#h@3WI z9=u`!H;pjK27xK}q*e05X{W8!t&@8bbSZ6w$;4W$`8Qr_6#k739ZA0DG2{NP{nTwO zH3OmU;4Jk`#w)9Ks-P+(x2X%R$t`MtooqQwmg+PMgSzJAl&1=V8t$#Y5V8KMxzgGlRaBN=rQ zVi?m7oX)SW$H1tWdAUXHBc&8_(_Gm$NrU1?g-E?)koA6R+opJ!HU@FOdo$`Rf(TX4k6pm=_>o`Nlv7A5GJpDXH z*osk1phJz66j}zVjRab*bI#%hrkhMO8)kJL6Ck_5B^u>I1fsu zp$7bfFc7qbzTveQ-PSq+b)-VP(-(4m)|2K?vJPRERFVsMcraG|HR7G+Y{6x%%h`K) zS?kT+9=NK#1@{n+Ucssn;K;WIv4TwCssgviFjtJY6HDMNe^CONaC}B3)PD-@f#;)> z=d%V;2ifz@_kQ=cnxA;J{(UnYB7X!C2evb?p-IMV1-d1LCV~H(HVbGR5@%!@uw|In z5N>1|z-l5iWl%X4vfBiT5t#vLLF1TYw@tVRT*38W&T{Lr;or~+CV}s>4q1+X8V}(a z!gfoENEIMSK7QCnXTV_3;} zD7i3#ZNNf!KRi2SU_BOO*w{dqnpT$)9fRhv1f=n7p?N05l~{~m4T85~#RnaZma@A4 z(>W1hc7DwP8Y&_Gmq7R!t5}D>2FLMbPy4}v)1P-Ye*KlY0$N@5OR{4Tble3EbOuGR z*C6u!35OIALYp=cO%49_XK^&`V6}^MumYDw{SF2T4djzqVCs7XgBR45Gm_h-zzkTS3}FL)Z;AcfnR8&a^FEL*`s%`eVG)Q~{KNt#XSy7ks%b2b_(N zosgT{f#JZE6E*@)P|VAumu?2F`w3#6ZH+J@h_6Wa!9>XIZIH;300wa(`?Os4K{3sU z!kFtF#~M~hKgjUTupfNIV9L3Xn#UCCYH2!jr#phhkHHI%>wL9_MO2a)OF}WJw~N4l zV?@y&;;WRrR;4;z^ICJh;^Z2setKsZ9zmE5Pb39r!KCvOVy(7i7ra%1AWC4vU01Ny zY(&}#UjQK*OhMkp_o{J2`AWn@p-O|G;76Mpl6*G%f0G?Q!XW$#QRr?e)NA9(lH^4j)+ZXApNt zk<#5bc<--&VdK?bKO-7riU&RTUhF$bW3`o9N)U%|Ko+>mA#}-*DKZcEju$*hq#ior zK0dd_Ugj2e%mpKmeD495nUSHiA<|8*(}UBHiDv7Pbmb*5Zqh*%Af6a@HFOLd3%~~n zPi8P7%O1L+k0a&{G_u`-&%y*8gb&qkn<)wEaMD<3?Z^9BFyZcX{5uy{gLW;Dmq1gL z*8{hrhEQzeTkuE;y^1Q^!$nCxE*8zej$ani!32J=)yf1Jhhby3eR@upnyp5#=Yv$V z&nXgN{BUu&o2%{XFcua65Qp&rR4=&0mUs$ZW7=ajM$exBLsCizGceZ5+VGM=C@sN& zYu=B}a2OQ&K}VX}70X7Ita(I6npan0fk-n}*nM!L@a=rAA#l^Kj&z6cea#t98y!}B zVRgfPM<{L%D_leX?FPtF?r49qDm%c0vxuE|&$K9x4O=k)A{DRcm2PeC|NZ!PfBKup zFRWowZ`*3H-dh`5EbhWqED&jHQCvbWz(`8uX0c9BUEn@q?{kXVvB(G3@O7R6>P9=aoaxji!ORyakML-7KpGy#Vbgv0(>h}Ro9 z9Igft<0wu5U8$j>&u#3NIX-vtEfX}ScpAz*yLUStDe5wMoX z_)`SIv6C%kMNOs&Z-hTaX(i8G!{U7S!{K6g=p(CyUc_=RCIp&IbIY!zF!52iUeBLc zL&~Wlf&d{G$W=mM6>^mF5@UMjIOUdrL0e;2@Ud)!C$~-+gufjsTw_*#Hb)<#>?53l zf1}+e2!CraeGAV=a&Z>U@pzNTVhIEyZea?H6z*}CUPAJa@K;&FG;iTTXPV313kJeW zzb`i09^N&&b=Nkvz#yr-$(T8}s+hGFBX*(Us#hT4LK8%6QJ`@4VXQwI)7!oXCje?BXF-3g z2_L9YdkKZJ-5Tqq*oSmH7=K%#CzUXb@d+r35iTIX%cI>vr!_q8?)B`6FcZ(TPzD6w z#&!xGobJAT&&P)@{Pw@xWV6^xdC7$=?ZS6q6erKDJ6fcWECn3}Fnc?_q=dS${+$sA zo=U)S2+h_ph~yLlo=o!BZk}=B07M)yRZ36wRXSZ2V96PftFpu8NdpDk!GB=C9DNUl zp}S5Zl-pY9=BltW(0VYn6pUQ3pTi_16|k4f&+(f4EZFZ1`fTW^Wij2`mI)P$#(C&F zDWMNun?%LupihF~YWSNj{5SY>R@$F)paY?P6xkEP-*!ZvqzMdGw<5RO)f;j+X%)5L zK$gJuHxyrct|@21S#Qd~o%?bb3ac$=LLl(q7JN;EY?)KmR+d0PLBb|tGZO-Z5W+Cq zi3c&~tj>dCwh{6grjA_b#>9yx;IHrW&xI%dU5x>mPReh@fDA1`7y2*7&sEZ^H$y6xxIM<=TL)_Da0)y(KO-M9q-4o)vhJZF4~5S z&h0afRuiEJ%?H!Of-3<b@7A8IRqC>-O0hjpRXA?46^t>+vFFNvw^VkTP?0c0FDTS(4X8 zArvGb6UFsS3~^H0CShhYl1IWe*fFV}^aV?nso{a}Qn;6=mo}0RRH3;E5JG9%+t|iQ zD9xu8#!d|3HurmGWdli{zn-zRJ3FuEoZtJ)`JERvOag(lZbhLFs5F=d3JzXmH`FK8 zN7cR|qal@^tHX?7ZODWLShu9i>*2v-$SWCvLhZnX1sRA5Z-V}$ssv0qlU4rtg8FxB zx4tU>&|8e40D8;86epm`WC(PJL;#|8g4B=*Kn6c!H3%uASd;?tqe21-pUf0Z!jO46 zk+wuSI*2L(E>Xaukiw#Yee$ZOJ|RG%iRR^OJ3?MO3k7GR2ogh8Mc_Uv3h=>k0up40 zE=j;EBJM6vAA28qn3l}fzYjfO@EwByoJ*irC*mhJBpQtEHAA0FVqXG!PM`vMCw5_; zZvs6p?Y^Qbvl5OA;DzweG}x&CC;f}^4}QtG`v@{NMwSclw_W!^867H!&lR3~#-%Fs z;1JP5__taS2rCj$p42es3gty#BF$8RH+me>j~=%`d6Po?-GJ1TG^*<$N9{xm@7H=6 z&_kYSmG%-1W+MPO1Le?0R(g~Y@T1cZ*i}2?1@(_^_+jsF{&0TLjRNu4usk8ZMfnGc z0{JaL#pQ&1E;{ew1Q7BNDhx&&0BoP^xd_38g@OPH0Sn!L8exJ0cO1J2#7Ytj^FV(7D0Sc@L3Y6x+olsH}7GFYvG?^$4B_ih{sJs!s5++*TU?|cx@cDg^i4K2= z{)7yKnmGr@>`}y)g$AR>L*67ejFsS_&{~9p#Q+3nLxwae$qbGzN8+zp{aX1R?*@C&m*_ zTS4rwN`ePw05t>FySoc+=+hyh%;1>trt*h10Y@PQ<1$r+7z7-LIWSD?a&>^JY(GbiF0e&O{Xp%n@RN*K=5f$zhz%dbn2^gVa0?bu9 z)VL72L=YnR&wzMQ8Aa?lVWh%}zeI}6$hL=(2Ji_$zE6wrJiRXt6G(!=+%XXtinAy9 zAT5GnAw#GE$_yD4VNPu@D@z2k{Q=3CK|@vALlxc^0ZHN8G%}$K^H3x?HQCD%;Yk3g za-$##QiLF+RY6z?&BKBcI}W)3W7Z96&pelWfbo4PI4^|(^w4qS3DEUcqKT56OdHOa zPcra$jZ~=-Mn~@l;3)MCWoMv_&ecJcxk!#P2!URt$GL!sR1TJqV**BdY6x)&2J=Vw z%mf&}`{(bzQ@;>g%AcHpVF-HyNl(J9iE>bhUFf91PJtz;jGiW(5a_^y8f&D7;U%;a zZKfPT&4JY8voI&1ytY}6yUl_V2JCZEcY@PY=y{6dctN6%LfP9emFS~hK3Gx^`e=3u zemAIoBNvodAs?_NPU>vAP-oH+ovm7gu9I7THk}$%61NAiMsEIX*S{;IwB7n`ML=n}#!%jZ; zA9r52&~Z$vZt0mBD5A&e`ht@>Y%o0Cfl-e_2^V39vV4R<4^2QfmFdxKOP46mG1@1%ln@@w_%k6iylVU{@*Jo%LJD$W)`N$> zFskxt5hXP;3OFc&N`TFx6{w|ZQi6dB8&J6jHCLp6fbcqCBntf#lp#!b*nCm~G!8~l zwcvA5VWNcY5))98)>|kj#f+-*3G=}M^Xx`JVF%3f4HLCPK!v{Msh7Y8nmek`IFk_W zu|3t1IMN)hzMv3ahnxDYBX7OAcHw)sEJ7`Dq)FC*fZB2qUF!=Ry-|hBbCKdCuua&1 z7oi62Zjs<*E4^p{irhB8PR_cB#ev{pKj7|PvHw7CQPuvtNN-17 zLd}`jm3CFE00+}g36N1s5t&03(JHZ}63b77voAx=!Aw)b#sG$&PkUaF61(r9AT^Y1 z&2fb0hE))h%|&WRV)eoC0;^$MSbeRC&WS*2)n?$9&^sFtIR-L8v#IF9>^l+rA?ol% z0na1?&nQE4Sr%)Fz=Pgt0&ctDm~3%j_Z_Wjp3f`yKl&d#UtahH`vBl{$%4dln`a0h z2XBjjoJi?3s4Y`2$wR`%LUxz&0=zE14XFXamWIjhA!3IJP}S*zl9@8$4m@TbfE$;E zxhHt!u!^i5uKo(#P#s(t>%!Q3S)1|_hYO^fNIqDE+k}AIff)&KgRTM>I$I<+fDlC@ z7s-uJ!24Mjrt;cyxLnL2X5)w%iSX(oz4hA*$M^pE122B&Vhc(NYBTL?)In7#5WjP~9?k z!H|np4(AdHN8w*XDSaf3P;VJB6$G+F5dqbSm=W|4$?~MCx!1ztFpZfw9tN^)#uMhA zCMOOTXL%BKfWdH4#0k1vH1}vYrU<%|=-R5k4DL>2yucEo3nmi*XMtC~uW62!5)DO% zh}#EdnZ%Id#NMkCUhFI2mKTK_w4iawIII{_HTU$1j)iwOeRqxg=0)VjkcyAuPU2TBd+syd?4=+ICkZU2URdLejND z(hVXj`h(zuy(bb+1o$v0iiq$*(hWk=!TeiWgxLuJ#k3&8 zs=?Q*3%408KB{D)t|UGeb)yLQmA1DblJ2N56sm$RG1`>~eouf{gdW}pp%8qF79Zpu za{QdS#NI>G25STXChnF15FBichdw}n;5!rHst^FV(wT!D$jevtsVGn?p`=z>fQ)INjxLf~(?#6AZTi~Y3OB>XLg zB;aSmZ5$j3;BiqBV{eF60oV{zbF> zVeKt}zKLiN*l1$xeV7arAt=mt{~{SKTJ3_3%8O*Eg28VHU>HEUH_br+=|;0(GHCi^8Qo`B|Dwe=E{J&}Y- zdPL%RftOBsWbLD4sUJSPY!Qe)6qR4wq7NK#z`By{(vEad^}%6Z!G|MDQU+IvoFK6s zrO8+FGfWbN#OcL7%o0ep=|Fr%Mudumi}zJe-~v1lw@n8jj)?nx{E7Q6zE~U+n|Seu zw%A6xB>t+Gi|=2%MDiAL2Y>kLZ{7cO(R6Xe60t^<f* z{bf>@&K>MWt}RVl1Zin%m$6TghA=1qsmpzNNP7byl`_=2 zjL_(e;#1F3C_GD&)C&{}spBDQ!&mJxcmXoBRLNiFxC9dh5K~bzd}(GL9Vgf~oPNwY z5^ak;JOdZ|{S2$O$_4DXk*iA6%vlmkuCt#n_ieU>`YFjlbOLS**uZ#)gqBH|UO+vh zFQ6D4MfEd$#Kf6lj^d~=egKQvP(qffi>m+tN1<5d$5maA#WqTLt2E*fM}wE+A~ix5 z8Jwxww=3ChuSJp}hotA2@>15x*`y#g^Oz zD}X&>JjA)EI=51M;t!iEKG2<{fys_I05wt#lO1uYdQtKdAJzLV{u1B5fCx5T{rXQo znUr8Y&Ml0(ck$&{FZOVHu4Z<4egCQR{WIHN-#dJ2?>73`Q|8WZ==+~vKl8V(t5)4! z*SqGk8@K2?-==!!sr=L#vTI}ewQ#oSUwF2@`?I~d$qk!G=gjHOQv-XhG3Yf$bA9&p z)7^Fdwvl`m@o;x#UHO5!!gU4qYU8AyJsoz}tsdQbYV^3?*}gK@X|2rdxvRilz8dHL zb+$XVlT6+~wifO*0;Xg{>qnG^R?Mi ztb0TGxKTdVcI}h>bL}hnp1U^kU+!g{O*>|%4vEZ1K8P{O#A>!JnIRUzjk=^0uhc zz3mNyyn5%kXRSRSvv;-b9lX6v$R7HJ@#E2-7?XuPAKNwfv0WIGnY#58d-4;7ExPe< zLk(v}OK(5hkCVH)>mbvUeL%KzMMy7tML@64>+Rrv${_bbknwtc6$@S}&% z?#C&w>Aa5SkHc+E2l~rr%!lac&)fS)zh5&rdwymW&V6DiU-Q$3hjxAER2f}1 z`1y7>cSCct@uLU6^4!!HXTEdliZcxl@Li}=*YR}wY1S=HojI`L#8*bnH2sY``O}qj z*PWYYqibk$!;jt!yFdHpC%iXnF3g>-nR>Y9oc8zsOJDfO?<|tUwYzkBjXwC-HFY=A zI&X4AaWa>mnIZdMG6vVr=+}_Cuh3a@6WKYdmnT`n@|$d~zfLMwf4jTT+)JUeghSEbMYQ)K6vx_V0BaJ2AyZ2hrME1;oxl3VA$~V z%=5#a+J#_Ud$YR&wuJQuhSa;slmSLB2vJ2xZ5cXH@A+Qm@l6; z-y5JfNHZ;8VX*Y=5n3V#8owIWSW`8^2VZty@1+ zcTG?9+^qSxB+sJo$7T~ev;1f6R`U(({}vJ3aC?(ISkAp+o*0DA0?eq(PU+80*3Xnn zQ@d7Bls1SixMa}c*$4FJPEU4wFO<$SA!&y;ZA5Y*tNggRVFUrJsa<^QzGY1t-5>tq z=NJBD;hl@gOc@5&>)?+-A|?NUoxd*q6O?6(h%3HKaTjjD=BrXB5hvKGZeF5xEdIb3 zWHJ7O=i@ye+DP^I2X6e8S0@7JL$}~Z^|hh_zjB7+$fXBlR0$<}s#iGJN8=Wr{pz}p zFZt$c7wuv3sErb2ut@X92tXuD&y2f?L|c zJx6&)Nm~ebV?`UWkT_BlaKDrZ(nIFy$a2kxwS&{; zP)ux9QRhDpQ;YP6jeE&_1R!%U6pEDJg_Xov@Pv zyQ81Nx06v>NEjhnqku=R>eMH+AC_9u!C8CnFhHN5IU$h3}iwqB3(if~D=@6L= zoH2_^T1SCN%o(1Gtn>g~fuI21Lp7f-g)4H2(+yCBX^kk;hQ=%-knYtv@{`yImX?Jh z4)cc*ghI^+m0)}d==ivbc<>!08pLl~T|^lb3vLD7oxuy?UKcu3nQ{5v=udWK zJQHiYTyd{=6dv*hO%CdeP{#x4;l{w31n7Oh>kqb7e2YV3Ln?92k)@x&l3T zMDY)~*?^dXY^~~>DU_Zjt@}{7$9&Sp6rp{x;bw?Fqm{WC>54HK7_Ns1{aU*|28LuN z`K)B+w50+3Czce?u#*(=17(CZaFvY2{hVb`QOV7vN~yg^epp=gxkw``T3tf75>PI1SUXZ^|@($gtNd zqG5-Np~{hugM39cpwpb(XH1vewEG)Ijq0~Co>z$D*6^aMFDsZ<1D73BX|1pfuQ@|y z?s5(3P<_PCDOuU6)R+TOCeooQ6TgE6Fe3`x+9N`64_Nvmr_LYCaUIk-%^>uA{G zQWuN+^k=+62wu`J(P>?B!CsyS6c+n%qj;F{NK1S}=qn&Tq*a($YBxo+G=GUOIX!D6 zwqQrhmo>R=7hPv_~gj74lQWmHYcCe${y?^|@3AS*}0dz=g zEn!y!m;vmq*uuO43BEleqZ<7YY%93zS)ZO^MD3y;Os5^P8%_6b9^e=Y!~YH9Vll1cZpN_m z@r){&?O~CbvfEI>aacgy8IwbLrQJd^fUfPhFV|veJ;m^|cp`&?7>mpT1AHxfB>-!6 zmQjFU)D0|Hx;BUB4NQ4$sBv)C5PToi&$$#gGL>&u$CZ-mU~v)Ik=HU$VlIOQ_e6`P$b(t8KZ~SreG;9j}6eJ(}=Vz*#l5`b|yr1_XbNP zabt+NGZFi?j7%%!uIT%g!n1s@EwMiCcxqq|N`2hJ>}KBL-TlLV`i<59d@TE7&KUnNdA(19hJ~A;8TJ zjvrzZq7J+~tNJ(~mK@`FRI=zEm0WQF-b;lI8({{Cr>A^ePaVn>uxq^8sly+pz+uqP zST1FlB|3|OL!$P(c!xvOQO1_}Ogukj!REzOc+u!UiUV;e6a$m8ySBac>USS|b!l=0 z?~5coAr$CUbEF}XVUgNce85MoyQXg|tTyn*T zanX8g7&v9LAB)HlX;T6J`EiE*?*EKh>$IF~BW&>&0w3Z`L+7vQ9XWqh#MU9uUpC?m%1 zBujgUg%vX52B`zgOEg*`l3^NAw6C9dU~>;~F_sC6V2BN+U$kpE+6y)!G>!DKAfuK7 z8HkFJjwO~+9W{f8NQ_B$-T2lok1zaPSbec%2);%KGiK=q5^4s8uP4@GKh@zfJ-FQh zra6jKYwxizFH~|37Ytd3j~RvbQ=vo;!wFOgBj-*s6Y_XX+l$;a=B$PpYVc{@iR31k zG@vj2EjdJ3B)*0??9Rq{FWQF%=S;%{ca|FDH1D>&?Mm&8SCqNQJ7j*cV(<#>^ex(F#i z2IxqzWKtrO9Rqc**itG<84l29ly>$T_yHheI}D;rE6no;aR~pXH3x5<*1%>I7XZcF z0ePDH;z>>(L)EB&y#i2G1hRb#}QhFXNS@idl77Dh(+rDIj{36$H=6=7?w( zjimIq%#mlgBppN^2^ZbL5}H$e5EBk!{4EgUf}cd-R#=vYK$7V`SPWLYSmLu(Ud}0@ zpOV0Lp&f+Xj0@QSdH`*h3-5h$|K}I#JH-)f5kwE38d9l`2tGNkBD60~I2bA16Uky9 z&q8<6C0E7sZ5#;{N6sWC#c}*rA*_L8V<=Z4O-E@)6+cWtXGc3=t6)H}Wf-z7d<+_% z2ZF>mIw5|cJNWO*V9;n$B(4qd=c5IXeAsY%a#Qjq;ciZ@k+@jmq{=qM-OxyItp=;a zLogk?;x{U=fzedY;3YJTbwkBvPRdC^xv!o;m&6!lG~GIP?c3LJ_0NBSpJLlOIdCw2 zyY?3Bt}SFuAgwsKm4|Bk9z7MV3*O~eSa9%QxS+>(Q|AeO8Vf7GrH$Q9CDc^ZEZyp4k(h zBf8x}{)|ia^YcWP){zS__b+VbTXg3wa_F9T`R@2hDnCZgk9pGGxLKFB=qoonPmaAp zlm&uaY31hY2~3&$WA(9vd-yDc59g0#>Hc^RR~ERwVhp>lQ3Yk;-_ow|pFD{D1)5)R zP+FmF6}x23*kXUT(mM{N77oQ*x$+plL%R&SNr%sB8eh27;mgqBt(+<7yq-djUlYBg z>*`VqB-k%He@;IrtAD*99(|VX@y?P%(i$DzKeu_$I&#@= zayAzIN6NLaj=Z(ci+7{orL^T`^rV?SAV?n_nF6G-j@zbS|@16)mk6NrrpVi9XO3E>Ac&)^zE(s2?5 zlQ696F+pPZeTgt7WVTpbdc-P z1QFp8GOSqfB5Zhfv3gXn0<n#n--9X$V^!k3$5ViDy8M{_)@Cm4_12LY z>oFqs|BSB_RDI|kk4CR;21zztAo@KqFdL)_q6Ds@fObNkt2e8UjR9AsW?k$aJV&ux zCD3!wI?)T@+*o-lm0LLI^UvbzA%!;4)dy*6WdLHnKEL{)x?8X#axc9^o?GbGQs6<0 z)VVgbE&zJcEp)Z!s;l2e)z#WNyo#%1z`ZIzI!myxqs!9ud>sfIluApfu_|?r?59ElfAh4ed0uq^YYQf4h!nczjctiAiZ@7OS;tMb>wW|fjw=d zuDT_m&Or3}F%IesrqSulS+0vt*C*5|pj;O9Hc?{O!;N)YFTm`0BY4y<2w7(jk325sv1COinNiENe|U*4?V``|DC zecAP=s(2@j$);~Ds;L+=?mfA9-RJd~A4DBwkW=^42mmdoNdDD~GjM-`f?*a9rB z<;x(P;9ij0;+vqm9%aIe`L(V33gp{kkyP=3qn3|X;f;D#h9)<}zjj;l9?=yn4vQB- zQ-KbH&iGK1v3wi8|C3wLCD5kWsy#waGV)!k-`;q9fuC5sK3-2Mjn^)xTWl#$Q#ngh z8K=fk4FaHzT6m@Ze#SfDm>uqeZs zr1wHK4&`<)42)&YwwzH6)W|r3gt}IeeqLW)hZkuQZBLCZ@gpuqGCXKCX*2bd*AN|U zm7+{@&x>b3Wiv)(1Z3&j$=MpUK^R8F;BEPaCbq{4F_~i%<+Qix8dk49s;k5N8mwlc zNY|6FNK6-2!nD@JdfP^kru;3mTDnR0rgeszLQI|Ov)7QqaEX)fw5R62X2;GUH)=19 zMMI?7u*#`2R-|Ke+VgmEf*WOHa@OiRRHLq-9jJdbCph@$>@W6S_GtT}W7=6l?G~e+ z_8;o2m0YYmB{{S9G|aqGx8^je4JeNU@uW4@6*a|iWr~H0M^$OCfsBUBfUgY&jBH@S%C@N{F=#3xhJ~CoAH##W zL&!R*u+d&zr39gGToyDe&lO5}EM_Z36H??%F*YDMljBklQrx5R-GdVziio;*ymQw_ zmVfvDMVfRlkBx>or6nS;MpMl7+HDx%en}3mEpP~NVY@iOD1?S!OK6i+$*2v9!5aEX zC^douxvbbvCrc#N9;#S_O{HRW&rlkWjGPQ!0^dB+dLhzzI7$^^&%1UJb{U%PQVD~s zmJ}zXsnCN(In5hgJhGEZV#~q!aV4N3F);B+X#0`S4{l{LDm9iAFKG}W0VrdjTPVIK zRQ1deBfZ>N?x!N$fL23?&@aah1v`vky263tV#RgWb9(5gewm|$d6y`Ci3VfgVg(n9 zcXt@6>W&mbcZ72jMuZ7<$+08sRwEZ&bON3oZW$LoKKR`~RPUcz#CZ6RD3vo*K5F|y z?K(-h?9_+=L}*)*O|U#ChBIl_G?6lRVkQwyzF`t) zAoe}A1E6-fV?YUnOA#-t8m<)mVDf!4ct^1@<)P+B)QjIzrd__YvD!xH2BW=Rvn5ZMy#!}}Rhhv0cFG1MS;+=C)_7I|`JtAjxi zJu-a*RM*|%&WI&JF{Bf4l4lj~I+Qxl5$MO&0zop zlBQt1XJtzgDn2^v1k0$^p+>%?B4xO4Kt>6`gCp1)l>0?AiD>#i@w3Z@odnvPMQt%vHqX7-c;Ey{PW0yt}v>3z@A`;;#^T0?r zJ4j}L9xThAv^h|BxvmB0jW2ho-iTb2Y6TD+V>#Gg5z}(HN|7olg9Gtt(~WX~q!R>6 z?AWs&h{|C~l;QoJ1nmn*jYfveIqLr9_H+R6Hl&^v8m`8*r5F&;qKCX1o60^>`F^E>3%Ld^7WDr5M3_@4#is(^8YD|R&HZHX* zS|&t!P%Ev#K^qzUl+YT)0DyS1eUs{h1v&_D0L|PiLxg5?bRoDEK4qN&F`Pphua%oZ zH;ltn%Sh$~uT8<>BfuvQ`bK1joWWZJ=m3?0c}+4VJ(}rR3}^%=3}Z^r(H%>pDcU|D zI4df=ju(hWLNF#Fy&SN|Z2%2YbA2<9JR03DS`N0|gh3V1@yNSR343?C`f6Y9uZ$`gvROm;c~=w~=VDyrKS zpd1%k>r%y{1f4KN@eEh$g8Nj6i`dPCGWAmpF239h7{GE|MbkE0RX&ugymN2;+pEBMB{!GMF5JyKK5EJ$?vBA-?Py)?Tm<{N)A;v>% zl4%HCEu%o71#%`;iJ>aASj}Kj3 zA-NH_FVIFD7n}IiB;zsA=zNudPb)@C|_du+*2J30f=zC-7ye022N(Lre@o zPT1pNf(7EyP5{L@Oq|LNWin=q`V{c3ZVg2=Ky02+P$X#+usnI2BR;Vk;0yGSNon|z zVGJ5KmQIskbqVNN9JvHy^t%w;N+n)-M@a&f;w)y$1__=h6xYn*NsTl`MN0?ZJBR)y zyl^7C?uu7u6iMVI=a#V`UNHB3Zb<#(KgMCP5s+b^*e-T~X)veC46-Wbu40EC+K&c0 z0kxM2-1U_fQQz882f*+clSc=1U-2jd6dZY=9cTkOy$!0VTe65Q`%AElF-efb*F)9m z*HI>3Npnm=3lx^YKxt*hFhfI1Q$hd|gj%%DL2!sZo>9}w?9Q^5@t`zGc_20m@1+vn zP9O;#tEUb%D)OmFY6Ug|M7?0PAX?wUkQsRcDN-CnhyCUd?Umw#Qj;2iQcx5K!7(>Q z1Sl|c)Cs$5Y5j zjvx#)@CbOi7k2gTp8x$%lM8?N03IVYo#1_v?${UtJQ@pcV_9sco~0aFnzjwR3UU#T z%d0I@5jf*004wdoU&a%?!Mq@-^-%L=E2DryB?;`!g?Pz6gRP2dhRgscyzEsRda5S{e}RwED{dZZ7-*a&P?(Cu+? z4x@_cgXkux)@?a~#)3;2pb01fzqU4lqrsaHdq9wz|LSli#JO7)OX+h*@JH`d@C=0i486;LgW&$ zL9H2#ku(%`Ao&6TcF|&J*&ZlHJk&upKW0-~98tVL&2xs5kt&{zrw`z@xCj+~m`v~( zA)^2V@GT@-NR1)HwJT+2OD=-QdVh}MaY;Y=j9QuORAJQ%#Yu1tU*?42=Cul#Qj?)V zu(y_=_JWc>sIh4>2)eeshVuT|{=isDSsMl4l;-D9?U=MCO;z}bEic;1ZG&+70 z;uszg*@0pQzUN9_PL|lZrgP&zT=@GjyjE-(bh>5;1Sq(yq+1et1sq#uL_k>N^Vz@% z&p>EPT#RR-KV23@Z$LHz+5)TzLLpZGjvI_m0fg4ujccK6s^S8SKB^7xQv}szR1QSX zU{oRC1d5@1Ogt3QO>!bI23(YEwlnJr&V);FwFI>(Apy#Rw3`^Fz+KB>DzFHT)n%I> zMUIGrSBlrbSjCe$$d-zi2@Zo#yfp>tmcSUeF9V}RmI4Uh2YuplYB3ii6N_<0Gri$( zxde-sF~?FvAkL>h^WEP`edT)b9Bf#nTYR|;rlu;GlNb*tR2~+5&tc+y=sWu;)Q`C_&-cqm#RMZY30(p|dg>fdp ze;-H$ueV6b1*U_Aq%5c(nG}ftPmcnz(=%MM93^l_FX2)y#3RL+;Q2r|PjW|5EjSh} zMr%V{C^C6n;3^g49ZN<8VIzzO=F1rsnOQC#5AsgudcbK6lm7b`fA;E)3rC(5O~#gS zQygE&2qF%bGaxt&TtRngJySjFFxgpx5@&{rG%uRm1)LFETAjp&VuJ?^Dg{_? zODu#-kf=EGmN*rS$jLVz3@3m%f@x>K{zgblz)F^+ImwEtIAak4xFOgQsDyaXVO=3B(5uKFOvGB!!Za*DCK})fI+X+#J0=u5E2Bs*1<51n5A8ss z45$qnaw!Sup(Q|evKZmyEr0;*F;5~)JQBYgxiLhL2jf62A0zB2z8MBcne)M_NskBVuD->6Xr$eZJ!W$?Q4F_6R8aWzx7%msM`!tFUwjD<6`SYg+9o==yF0Xib)ysX z(`I@iH!3?fAhA%(rR=cN+b$D()T$KhY1&6Wp*wPI$SvjDP&7&V{6J0)?S8ycrgLF4 zcx84bUkmG+mY($t+hW(4Iiid%K`_KB2I`BAcAab>xZ)XS3{cSZ!MAxoxpkHmUFzv` z+-knV%9Qm5D} zjK7YGliaoAL9?Xp)7>>G+VLcT(1pupfY-W9yc(sy19}(xJ>uP}G!QZl1Z(D-^t`ET z`lvVBs85Eq2$W26yTb#8_u0EP2HpfIq*Id~^ijiWoHhJCc^L?_>;JVChr2^|^S48K z{MqqZg>(!G=0D8}>CGwcV6T+BmAUYuc}gx753@mXh3aKIi@g+Jj7Min-u+rrMA z<@s$B`wouuu9rt$thLvn-u7@jRC|ivJ~G2H)MJXBe#~Hu;$y^2P#+F%C$)8 zZKIu<)r4YP#*{%g&G(yR+ARhor5P6M-dG#zbFN*|=TIkh(Bwp_tey2--d`Fp%@yWj z7TDHE!&Rx#Q*?a}RTo`mrL6cPR{FVkg>JU)p1hTe21dyXmU}BqCvfG)*~pszYHXBB z@>jz@7#fXR; zYNhkp+1?#Xq;@qMe1XV8=+^eq!S?7fI#4zvV^+7Cu0Lg0>QNN7tVOMi<;a~3B*>_@ zW0GYjEA4d1U~6)0Z(%;ypQl~TA76FbvE;B}XcrIf5N%am-G@QS2P8J%F#t#6#+ z%o=(iH_N|Z^`MFeby`VD@!Hw?kQHww{oaZ;ue)WkAk_@%TE`wbQKCSd+#SKGSB&S~ z)>7Nlmvq{rN+6`){r}0az)&RY>Fj?Z0d%`pHO9nVyC$Aab zMs`KY3PL|KU}z@^G298_Z6Dy%?x$f(?R(gsB6*V+`$@a^-%!zF(?;4p5Z0tVO`sq& zov?XBSQ}IfIIY}Wspe9xJVUOYEseT%UjHvM9dJ>{@Nb`lPi`&IJ?8#t^PC%h(_|$% z1go~VuyS&z5u3dJP1`*cqWT1o!y6e09er>-tL&Kde09aVJG%Uc zV@`R;S!wcxY`^U`d%1~T)V2(RT{6uM%)`nHX;Up3pk8*;ARdiRHP4>p-EE%R;&q1Y zbB1w1r@P5SoMn6Xgw8t5__w{=xNLM>ahmngUgLqfhbxV9-_Gper#|-H?;Tng`*sye zq|aPnSaG?zy!Ks>{$usK@G0?q!7F^q`(Qc_RN0<@NWiK7Q!yk5sn3v)z7B{M>r{Q2nFcQ?(Z=`A3Y! zokzX5#w(u+wvL<~H@=yivmf;1iCr{}xzc|8(`dbWzaM~i3oWAB_E-NWDB-+RDY=ZYrxZhi1vJq|rSa_+vJk6@>D z8#aLdSFjpG1%bK+6&T#O?(+y9Swk9WRy;%58U)A4y@;&UTU-2J%N+4@}D*xkKb zwKtzTJEq@_rr%8Ow@=0A>qf-RkI>waM~hGFKOcDOx-Z;VxW#@;?7dqqe8OHmcCLQn zQU2BlTRrx(`o|v?UC``DaOn2?&K|TMys)!!%UbL_65PYi-$z#OKbsF8Wl!CAw)?~* z7k3_ft^CyYPanUr9^K2{{LmvswEy_c4?WuZig$kdCb|%)1 z{NdeC+UF}1>z@0=yAStnt$nv=>W_#1vG;Rg=YIR#Sns;+Zx-JjW2@uyJ;!gJ`rd^J z4@dYP?SFIpTu-+1@GU3K+b}z>Kd3)9Ub$ue>5&_OJLkV|-+baYFy@w# zH>(Fk^C!NEZajn&=f*0xJcTREf6}}4zIS^7DD2d}`P>h@C&$o&-Gk&Px0NRWG{R3lba@2pAb!dviR=7@}t{N^M9B+cW~#UwXgGkh|V3% zf73Y4|G>C#U;e)vov&;S&fbS3^RH~NZh7$R&fuo=M*fzGcXuAd4p}|%ZvNnb?OQCd zqhV)4?6~W^^Ty<=haNT0g_W(=o579s*LhDFZwB@64p+8nr$_4F4U+G#*RKS^oPO>H z`NxCvhIRAQ*yAJT>%{lDk=}LMo5intw*cWMZl0RC1^6@3`Q*C4du!!K7M}X+MN+;h zDlZvB;9y=4_8Vr@5j;Ld4~-9O#uC|qnhU!vy&(=-XUc~{Z?pNhr;+W(k&$R9=ryl+ z!{}j1%h_*aRt+`hq%etV{TqmJ28!^Xgf5syqw)ukHn8Y>HVdbeo~ z1eP&!#@IP?uYT>*Og|g&9rMwMs&fn79(JRb^b>{0#`xhlFz*gJEOw$`1~1mzuZUj8 z9YZ9}p_c=_{>ys2hki5|9xzvV#Ys4!zLpx7?KS4OaX1*$8aESf^bRd`MR0^#t8F9d zwT}j_IZf(PN%tNbIUMaf(onQr?j51JtD|>kzcRM^@NeC}dQp9FFdITsTzH+NmI;JC z?TST;OwFrIs`2EO$e6a>bO=)wi}#ou)1**M5O@fG9sH`Wt7IvXx+C~K;7JoFND~DomZ0pd^c+zVHEwXo+yos6J8gBgC$u z*f1pF(hC`kH;Ke{%LL+RT6&QAu>w~}OVEYC#J=j)>13CgNoCNG7_Qr{`Uu8tj99Y7 zVE7R!vBdC|G}kwYf+?j#k%IuW5+|+3)mYXhMzCW-_@ZI6nTmLtu%0a^l$lg@_(`$I z4H#7%7shI2Q`Bet$>A$+Sop!?;#zFXE$D`2xOyXLB~6%iS~G8LXIGEpYM1pR)Rpe1 z;bGU?SVp6nwbp0e}w{VjIG|?TS+yYVCEWN$nYOJM5szlFM4dQfo*pZZ#oWuB-=2napQH z(=dG5T%%(Jq<+kJ>u%7V*IXo9PSWXtlZMiy7ngGQAW#@Iqtw{&DO%|tvxDSCojqYG zdDc3D)lNTc8@HycbZF0p_U_~E9g*D4yYs2oj;(yJo_>~P%1?X~Ie#&KTJ+v5eE}o8z4nVNh8ZdI^T)h^#5oQIY^1UVvqISfwM@;g`ink680Yh!uVT&hiy%``lscKva6`KicE6v|d2cicC4E%4j3n9%~O7o4R$(prMd2g16 z4Lw$x6_+%Iw-eW9dcU!qVMR3v+McA%hD`VU*& z&cCG3_N*k{O0ql4)_S*(vMZi9tn}<5l3{IAQTyeXV0ruymV7&e8cljv4eItg`p9MJ zsnCk8jB@O9soiEor-z`Dv#*gR;A1e=J|9oVZUL`I5BHP{Cx`MDrno z44=mAH-wKlb;9m8lAUCYr(Vx;2xu8^-e|jcA8BWwcnO zHmmeeI<;+fZ84~#0ysf>#zWd562DoaZ73&+nj`F^6H_%i=W5~MfH@1dC~&1U!vF;Q z=+jAFMU`EvlpmVXa#swZ$h{ciCU>SM8?**Zt;Y>=*sVAQtJLI5rzQ)u`NrbuXwWWw zhOovV-stt{@K#QdeR5PYJ5+Pp=&>-5qNBU5l2sbRZXNHAv{FrfL2!WD9ifE@SR~B7 zd02VojuE)fdXW%RmYXb~4Bf^)!fwhn8*9aC!ul2AQx@Ae64Aqr-fxeZR);2Tp4wKv zbIQGQgxxtZdC0#kUpomK*FZ!{^|dMe=xk%yt9ySrUa3zn&-74-93r`j-gL0Bsk$&^X*irMJG|iJI3KYStQJdJxB32wTk4>5rh}sE$ zPz*m=mp6ax)dDL7OTaPAncWe1){XU}mHH+l6;MZUlzwtdJvOHgG_@l6!=M$yc1#`~ z=Ei)_@Z9WPBWx!dX~|H57{h}sc<73UW+%pt0oy{_$mC&{v4^fWUAA8d-+5}!!kWKI z7zA8>cq5T4LUa_=Bui;G3Z`MPZN#>a7%|mdrXi*e#){|Y0reCwWD@>6N?x6kR^*ve zL1q`lKMP(iECwY<(#a5jN7k+L(LgM=WaU+J8lLEuKnP<)0nA0+w;Kx{QhFgFjWlbY z=y6smHM2IJ)@fNBt1HQvTbR02RIuhTx`)_7&Pws9HKzKH6$SpGrZ z9W=s+jX-6W-eAba)CzOpWGH7QOT?LJ*Y>&Yoxy}o#8i0r0o|JZ*{pkGHm}}>>Si_y z6?m*aw4$Tz7}D6kaH#!AXJP@xh${PhFRE!j&2XMc|aLz6yzf+ABh&%;)r(?Q7mdSV>*BF*p0-@*aSId zJvwkK^-y-!JnCgqT{O-Hcz7=|d2qQ42~Pmbhfs&JNevky*UEDtatV5end0Fm>RjWu zt&SV>p%D^H>n#if&Bn-NbhI4AP_Cuyk^%_`E!$J&=`j0N554Z#vd_J@my=`r4sz@!;ThW%#t_2~0$Z$!6SZ#?-lPPe<83fb@N zc`IP6w84(zWTCBd;AfHx!Y}R+)s$JQGUO(}M@$ws$*15Gq;mk+7y_Gkj*xOh2 z=AP^7U(q*~$M#&g&0A~t?C%;{S>8l$dy>3O!|Tjf+l~xO{dMF1x`}4}?}O%e6TQ!!KJfb=ePf)@f2$nsp*{4!4qqSsk+uj$=?6N+53REab0(!Gh;}F)uazI7(!#3v1cwWpfLWQwq&Gj-<%8l9!~I;gEtDTCNl-)u!H>fGCBQWqac$*}k{k4GGh!>Sniz>*VF7 zZyS+TT-DocWW~-pPTRcS1?i;Q?|a{V-y2cn%$=D#_nv$1`FGDf$J_j3(VuQke!{z_ za%6ltH}tXpwD-ra^?kqHdsO>D<_?#p2S+!L=U>@W8>sw|_Tz^7jM8`L==kO@js@Q) z6T34zMn2&`tR`Ncke_??nONV-(Gy#G{$uU3_RffLbaa!Fdo_8*v0wkQq0yKBX;c~e zeEU}$|M&%aOV2+t;|YY(EWAoC!rppxd$Ra>tDW0d+XX?-!&QjzfP?&q&~9q z!K_~@_bYcg#`eR+ORg9hW9HJFQub|ip8D--(1g#t^g>q`VHIMUxp=Cc+xfZn-lirw%4o8rej_fYeH|Tty+5$bgcfE56Yf zk^9VO(`akbs5_8}G@+*iaVg5e>adz`w$Z&}Z=$J^G?}NQFlOGaIPZUTpQLI=m(e#k zJR=u=J28{U?TSHeWi!N0ap83)TFagd{Qe{XLrX4`2bH;V;*R!UXE-m>l-*#nCl_3K zu6xdgLYuli^$4je39oeHft0v2tSgi?{Dkp}BK>>qq3^ag+rOKZFLGg}S8E1|<%;~f zEV0~BpB+2}aRpkZ(W$7(*h+1enu3r-!RPfsqMcoy!i+!DaEIqD*w|@ppLfG$SH1|{ zOs$2|VJ;4TE7%8i)~TLd9JFA0W>^k@4x<_VnI$$Js<_m(8Fk9V53*u+@wh)bbX1)j zRQ;q~f}oswkQRr`srQq*ZyX1_ZJH;CoW_^(e#c7jhC_3|c=zj9pE|vUAK8wAN26f_>Mzh?T7-nH*z!nrvMIym z8B1pA

Sp+(lx2!1)~lk0%;kp&`iNGaJqR7#7|(8xUP3lirB!QWI)4i~%4*^$JqU zB;hA}wrirxTOfp{!WY%Rm_F>=;W@iD>)R>W-$o)|$le+eb75R3v0uYKacjDJ{DOS3 z{kzlQX)a>)x`x7b-_UvAiB5MhuuxPD3rV)9shwJmX(Kh*LrDF!AxvjekU=8|D^V+J z&=x#+)Ifik4qwpb{Bk6zTw&^zm=*=-FXh0{;#e1Q$0^=WLgh#Ud9-AyP(RK5yx|%p zh|tbT;cj1TxQS&`C2($`_5r6clV5RrSns{cmXH7Ax#HDxA6^@DnsZx5A4sVfG)pV1 zy5h7oAkN8*1OR{2wACsM8(t_F=z!FQT*X-Nu)88IWE3U{wYts`2pk|y zD_p{-AVrhFSGn(i=@?b`nZ9Hp9m849rTt)e2^+Iu*P*7>3Y+2*To966{)r z9!lVO*g!x7K{D8sXc<_iml$pfmrQs9*l=p>g-Pz_|MBzqYgd(PYalL4bifjA1%f46 z*Hss~0w-Zej!JauXFYT;7gnbsR+>7Is+1emRsv;&8T=aLm$~*~uM!})oRq>!vlwMi zNbN$H*aa~~K|=8qm5UOA2oLR{ln{Ll!rB}%i#mp6?NS72RMbux{vg$T2`ZqJ3{lV_ zK#y_l0U&D(lA@&J{fNCwf&7<%Tw0X6>ZaA>VWw2YY6D&<1w-;n!X+k4JbJigFsu|4 zbxEy;hlFa@gC!0(#j2m+tqiLNJa{kEstMn<$%ce|$df$GuTU*v6ELi~Nx$2K0t87? z?Xo)&LkM+JkV^gmH#{Y~S^$R_3fqw_CF<=S)6GTzGaRn59rb)d@+OI7wL2jYaI!(K zm{n7PauZlwDG2EyV6VeRiqH@lhL?-xI3$!BFxhN7gh!FUqy{2Pp}f&%uu0wW;1ADj zxa*(SuMXO9_P4cS<^%oecRCJYXM(atSvI!S$GhuYXP=~nKtlY3Irhl1skyR)V`I=M_JA#a?f%_8YbcmJ2P(Mc04Mc4ovY$ItqLKofS1DE}c zOOuUc{#u#n6~8k_g4^1IJtud}4bSbU?Z19U%dsYJ8b?8-1CbO9tu4I0f4-DV;NI<^73evQOzdxr21+&Y-3(-WJM*o%Aj;-*t83gW@GJsbVP z;3fqebeV3t=91{kx01&{ywP+v+k4BIq3W`7Ik~P_XMMTG{xT`~sS-B6-qIM{qOFjx z8V#j!JeMm*9r@!O<0WQ4n$m(@F=H63a$mk&)Xwm*@&_@Sen({8iY z=l8*Q_ygq%xmO+=h^Bb|qY`!VFMhIovb(LRF|9e-L+5sog8K1Zm=!kB<1<@>(O7Nc_UV#( zp+rZ9o%~AShQHrGV4nY-FF$wkrNv^hT-$Uq=P>rh%$E)%=%M9(`>w#`$ynW&TQz;Ffrg*+- z$en89MR}i>uLBkPDi8zeeJT26W}-jih&O2BDC3)3GdTH+@u^h zFYc250C{AI-RW#LQhOEWS!3iY+J%D`n(axfxC8rw1RRVM%({Uaryrp!r27^ZVg-0% zClr&|#PU?P`P|^dqKj?AFjyhT^cm%BuUlru`4SM(I6g>@GeVORa%kk#iVIwWSWro?1ENjCqF726RR4plPc^1K z5u^K;v2uh6R}c!}Yg8CAA6CcbzC2O?;aU3#S)M;k45vcr*aw}lZs)nBO|jIc$(!?k z`+I-%TTlEhm>WMXWiwtnb0RsQKvRI7^HUtx>h0U>h3<*MR*&Ri3SUJx7^rD<^lLlu zbI}C0jRV`3Nr;dqX)$#L*fx{#Q%VEkJ+^u?`!i=3iyPYupYT@ajrTe%WRWl0O?AYGE^N>=%C zcF^dQ_bs+1USsFwq}V^W#9fqA_2B=9H_bJ4ngy=O)n>+9@rx zOK0b3gQH#Q248LtCYQ;&^x?X9H~>0rM7B5l>D;AGT3D^*Q3*tGNHZ z-TjKzzqx-i0VZ`W0h@t*-)U#Nl?w;wn(aGMLB0t?r;8PpP6duM1MQtdd&q@@2?@{l zhMh~~UhN_I%K2^P@gZPd&d*W{8qPouP;Ba8stzq=o>t~bT3hn%)BDbx+_&OBl3I2T zrpo3x=`n$Kk;{-dYU+7V#*zZGgZY=>AB@baRIZz0VL_<`tEi{$cR=Qh-Vd_lgZr1w zPsEP9xt00DwCvc05`8%E9#$tBKRjFiGDd!rGI<2Z$5`V_HgNC!r^#~hvz0f!zxd?R zZ~djeX2|KMTi;nMXOeCydxt%ij1O$z+`O^#GZk+HPtS+)W+q8M?CX1#i0IYBj813@S*&d#xJIpUmQqn_5py;A040QJFz%Ml)dzJH0(}oLPGIpkB)o$UhA1p zCfyxj`^9B}e8{>vAXJ3A(3 zcuzk+K5#MdrvKttL$$t7=D$4#5KQ9xZ=6v+ad+YUKl$qQYqU`%Fpjnnqzi5^a-Wn| zmsPCdss>hLi3BPw7Yx>(7fqomxwujr`0p37z&(qb)ogtZN(>XI36?Cn(G3ROW5S7_ zOZPHV@C`vOvrgX2=(#|nC@#^A+!vRVZTknyolYD=@_pNlk5xDqSXPyNN|}_20V_xb z7Oe`5WMA9aG#0R4&qpyGN@pi#qHm~RZ=@!rq)v8;K=hBkT-=%B>f6qmG{%}Xx{-}f zXU8$ZK^v1tVwV)UqGXASrQ)quAV>8P_`G*WowhEew~eRyk{yLA^E$o6j^QiouI_n9*)l|MoMlBb^up65R87~0K_P6LBm>Qf+;Zf^(TN%Esll<<5J!IW9cR7 zds3dT6`12Xmu_jQPs6dYsr(s14E$*bQa~7^20ieNihQN<$mSLQk+ff;E_D`y1#aP; zSg!5rcy8!L@G=NH*q%1fj-Tg-U{Hg=I8RsRA-(7Ebo_G=E&o>>jTRsbleuIC-o~Y5AEbHbh851uUfI9QmmP~q z1JYFJ;hBlXm&WI&>gPMgYVl?velE&pO$mKUl(trZ%x|My^JjcltfJ3FbCvT z;=cNuXCR-$if6-W*THe?p|ASzFSu~fRa22z*pXQQM3$qp(aS6=7+GWNK zw#&t~73^-{GI|TKl0d5^JlxGD)h4UbZ@J{cVM;mdb&hQ?bz=IxLF!_}7tSMf@~$Uc}I0A8_j zdzK`#1i&;v-id6=u(F0YRuu>VSuiUBd^?s}Se42eoh;g9kj)zuDaQ>im_qbEc2@ePkdd6+yWWqTcTw*P<5{ zxliHLj4+4W`C|_-Iem~~u8rt8E;$39tu_l?HAkfXE>qb`k&laS-54gc`Gd;p~-mO6N|c)WINN&%b%{G8mlPOV~eWj!MN^%isg&<~K-g{^@MCbzZ`?0KldiLb(V6|oDjrZSz zkPuYrbd25(_6?t9rlx^V?MGV(MY+L$R_T67{<}u^EuGpp(1}401ffz}glc}EIUiNZtOx_UF{2%5nVnL8Y=LY{*k~3dmGGr>+2*s#x*RWU!14qXnu-n1 zr+{xz^`Wf{bilITw1w8v(`Nt&{{3P;QL~q>P6}&#~HSDx>EIeh#SIlvNvZVd8};((C%u+t@k18<0O?V zW%_#Uqe`T4A8{rQ)`;X?kb^MEfh3&=d?zKnLIg7Huq^X^`27X2x4Wb%#A(*;oBKQyxX z{(>!_CI=sJvD73|OA6pvh)vZzC|E?I(>V2U!x72>MLiu7jKmJacHSvl55xbdN+fK0 zu}2mF1xcJ*V%7FV9h>>}a30oj*D|=t)^|84OzfVVgfHPRho;WT+KAy;Ow6Iq z1s_3R*7MF((>~whOmzs@I_|8VQNJemC?*1}zRy8}EFa4iVSz4LVF%9&P#6l58sM)V zwnRb&obz%OD<2pR9^yl-p$GgC)Q{G{la=oTwj^9>1a4AprPp+DRfW{;R?Pw&Qd^^( zHm^gIfULuMgA$4<$fv?cgB8Ve--9#Z|oUukgS?iCg78!~?DS z{FEP-ROQXWfogb1c@e*Gd0Fe=FaP=gQt*e~J9K~}#NS`_&h47Y7j>UcxU3 zE;(dZpIhq~@8NrghlGbi%Kf))xc@)maegf1Zfk$&@R_plm=^o&6U#^0%F%18GL~G4 zC7b!%w8ybIGWPkeytaJs=xdXM^kH)c4CtiTV5QqMp4_T*TXOHlht1si{X0?xIMz0t z+qA>jPq}-0a_{zsVIw)dofh|}`pO$qc;j%}1K4Nf?|bcB@>-d}eg&avdmZ&0eyk^n zjY@mJF_vtAiGC#du2YE?A3K`+{Lu%R`yOb1ynAd@V|QwWX6t=9nCbWQ#P)7Q#=2#H zXKXCd*k8d)J_M|{9@8%0rgf(Gt$ZtbZg;Z&dJ^t3FSCv9mmll7{FwRhX8YleeB)8_ za2cGlp1lp_+R|gA4?`%Nj9%Wo>4i$7ncMpE4t}F&>8DpFk*H6*dpXvE#-0zGkMFok zW1s(uedH*Ae)3c3ZfZrHs~}z7;hVMQ-bY?*$bUO&yfOL6+MQJP!)EC&4em;r&YSkV zHknvCz75H(Qpir1YC;`vPTtkSeVLG&?zM(-%@`sVZ%n2C)NA^H?UAFeHCtKho*5j6 zg4ujI`sJl)@lg(x*Vw?Fse?Dw`He4-^quSmw50E_Zgkghr&#-*BaUn>m$UF<}MX zm;2cMPM)Z1ApH-o{=1dU4L81GI`;0^C0vhJ3hHdP4Bw1Q~U851ywzgZhX7)a{Al6^av}j{P;D0;LfqOzdyb$ z{qkt?<bJ=!Yt@=)2w;26%tEHBy}oy%AJ zd;<&byvT3mUrXMHOz?9fq?lxeyVV=nq&bNPuo@nQg>ytHtAU6dFAjEuW8SRYXpSW8Ql?cZx?IZV$g|qB*L*0s z9xqJycyLWAZAZR6*fv{bz}e`Qejm8mq#7$ezW zUv4k7Ls-bRtX1@Fz+>A{(G#%zRU~tC7(I4 zf^SEvWR>O$Eo#m0uHI=;QfrNJwu%X7 zT_E9Zi|V4t<+Rx0kL!4D68jl=A?KMbt_ix|I>i-uS?eW=z3=~urh|w7x};Sje;w7l z_iZr6RsmV7Smj{{lZ4{`1IPlE8QoZ(-};jlL)LvpfIdJLi96tq5)a~)gAWXAqvR=JRFtkAzmwwWk-ht!aD`g4fRk_I_3})xpLrd3I7OecL=N1hJr9c7Vo7V;!ofV!JQCD5Yf|68(M`Ss-iAI z@Od*Jj|c|7ZU_R8KZ1kTY@ugLI1vw1553?m_E1st>i);?S{8p&UVTtNOgZ;OBAOjW z>^d3?kH@atq)p4zV26xlM`5*)&EPnI?I5jbmGWCR3rhS{)h3a*|t zG`P7)i1$<_u9&d3McMDq2&es|CS&;!F5O=ZB-;{$BsK%}D<4thnja+aAX!8{2}Q~q zlAx&8VgoU9SbwZq>#12-o~uJg@-*C4JlRCp7G0Vgz%Uq^?k++6(+v1-*cgo|Y$>N2 zR2mw&-P9GNGeI0{LaN`Tp$W;L2Jy72BhLCeO#eloOVtc5`uHP@J7|+y2B8X~mT<82 z$NVht(Ca7Pa^w)P_QpPU$4~Z$?w@{7=xdEIeyw5v5b0kWF3_We82_T||L3Xq|M6Z6 zF@Jr}{`KjCqlt!?EH44`ftYT6D}vfZ-a=ECw)Ub=V5 zga?ujj~pS|Bo=H|@S7n8#EK+3;%LKnKdqc|;4UPoNHhlha#}L26j0ZRhYv>9wT#!8 zlSJ^lyaP2UDM3$lNCd`9L^|X22Qh6TPQoEg#w?LitCvZ9CQkZg6H}>)8HLDS>tx3c zvY2jd;tdQFEr5B~M3kG5V8N2?xGmK%y^L61h@D=}TJn-_SEamY9rQ#?wCtiJ&k6E^ z;Sz`EW~n;ZA1V=m^g!Sr30SyhDU3&Jkt2%^@(szp2w=>*7PHq=bHSihq($o%`9QP<} zAIJ$_6$OVy3TSP=)9-G!x4iuREl1WcuNoroPnRMdW)pg7hp3+lbrPzAASM{%fQEHD zBM&PiUvVZq{;()0kqRQ;NIH=KF8HMyg&Yses)o+lwwTO`I_kEh8B4JZCL&%coWZiP zvquh~p@CL9I;dDpO*l48a{+O945_NK$l5%Sb`v#=z$=IcCRi09gH!eSUJUFEC=5_+ zR}=~{$z}pUK$@ah0BFfA5)V8RMm~-jT|jfTvJuFHEkgegg+VN1V9y>Zz*qZKopF+l z;C5kWL9J3>#Dy?gMf|A{J_edQ?D9t@6{h;oI&myG2^+j*ArOQ`ejSnWej8&V_tTfu z>2AuH&qgc~+z_^Ci)9Eo>cGJ&!XssS+C;+<7}D1$NaD8sm&RQeuD*3UuV?kZw#l$X zdVEKCAS~<*dz>NyIsh*AWC|R6B+PyR-SMQLiW^|dz!t=*qy{1b@&};}7olBZ?aJBM z&er&3={RU9MB3isJVsNeAKndnR+5pMgOM z4EQqg=_inCfTjuq5!f|U9p7vnk@bRSiD(HTAmTB*dYynk)>i8_LNIjo3hb(R>?i-{ z`oB!Q7sDJj2ci>E@slA7e=G@JHgyucUO@aMURCP=96q*!(jHkR;X*yvJBAr9F& zem4S-amL+cbbv1(^bM&XbMe6{sj3aqqpA^GG^3J%O`5X|QTVu?-5MJVL6FqS{;V_W z;9HXeN#T=Xw4YVHZ(Bk7`3;eu0kVN+Bkuu;_&8O9BgM2=IXOa7o@F_)Q4 zDk4-#DF^rsJ1T+)A?(vOF%RsWK1j!%oCz1$>jtK~eO1_soU7Om6A=+>RR!_xio+dL zm)a`9LT?-EZQ9YMVTo`D65uw90LQ8?EKP#UjP|GrcF>pXB3+WJvdyG2#lj?vq7Dg+ z(7vWzM)&xPDPP3i;_k?Gs79cc59?v5KNbnOt{Z`wQe03lK?FwQLD=#|gp2D>2*N{V zh&d3!tmYt+`2k^7&^Ls!8oT<^^-xOT)>eZ-Xa91nP4)Xs*4iO>SZ$_pQ0>*Jxkls`22);o_} z`lq%0zXB6<&=R4GM=P84(Fx2-5T^(okxL66b_9?t(8{zC<5NOr+a@Mp2;$0hGNQ)P zsyIVcY+@pYI}Dr?x~QwFae#nRQ}~HPmTK9RB@zp(2;2q~F}etmi6!b7 z8Q>L!Ha-bh5o3-xh7a0~q(MeZN+}6bn!s?*aSKNZtRB(f@k$NBw`@QV*;C<}3}}}D zS1UsV3s8V3FMl3*&k+(FjUQ+jr^S{NmeZh83%-m=gc3`|m%+-Yh2?P0KzVuq3{8lu z6E^SzkvaLqYaN#2hR`If3i2&Ib@`{U=VnW*cZ5hCy2^+e_^~bi`kUgI4|*7%PlFJK z^bJO&>?3k8qFasxxl!LQ$d_ZZd5b?9uK|5`)`C;iRn2Y_S>=ZpXMuDRq9 zi#Y~~y#gtPVqyKFW68G2*}*~6iyUL3jli=Hg_b6lX{gBKKReK&%>EAOYw9Agoe4v7 zJ=f#@NyCa2nv$kNQ}R-;D)jeQA_Y>ZwGxn^iHsuZl%&o=A#snA{vJfGM}TYuwI2@+ zI;{EtwpxP(y7SE@h~kAU=AVb>5klp2zQAkI4hKBLwwC`D58SS!Pb z&k!yUP%40DBI|`2xRasIW+ISlHrT^AfA&lJ$5$WxT@LqO9mF72> z5d{^p0DRghpbF9~L5{HkHbPK`4#6_VWDjwzeXz$W116*AT+GD#EqMY>aG1lnpXGrx z7!WNmCmirmJYWG2B>o0Jht#1X*NTTQs6Yf9i-KcgV!)Gr_2BQy_~zQxs#OD-C-Vi6Y)Dk(;(d#V{arXsmCurINwmbkp&|K|Hssv?#KaMYP)`D79 zBjB(j7-dNJ)CYqHP-GXXIC_xEo)k<7ECd_IY}GIgka?d&tRkpi043EC4+KzvLC zniK^Bff|ongLnY|6m&u$Xc2&eg9T;>fk#w`j3BaahyXNzHHQ?qTO{PUdN>(E^)^6> zV2%q66(iK4p)?pOT|Mv)G#(5+m;+}dc*UvX9SZ_tScnIqDJWs66@cPjm;6~qh2MMb zXU?Br-FR)a3SdoD6h34aanJR!=p|YR^iJJiQSAUEBBHLWvoVYLjE+kTDYDQHHXC5= zN)lw#Qk&Fgg061J#~p&+R}oWh7nG<16o+sZa@a&F#DX7llY@r16d)mL4eo+y-i?x$f|S21QsO`k~&5y;i-@|h8gxIF>Zb1=%gYQ z6Ua6wZIuD|5h>1O+a7`73$d3Y2A;7p7{fp^83MHAmU0WI-R85LQx%LOS}0Y;h(vVB zf)2#N3;s|D194!!lAt)FriiCrFL)y;!=cHDe}mdv^uHVOjwKq}FyrIEkCq5dDe`?m zl>`3qnZu_;zpBAj)_MdlCneSypn=FAtz)Ps>0NVgndh$F_Vd;Qs0FR$l|{oowM0xP zo-I-ia$$hjlT0uI$Lp!5%m($r#lUPXBcuSc4J>h@M*~s3G%5M`F2@xqj-5crud|(0EeqpwgB0gf59Nb4G>>ki-y4B%tY4=F^39sNN`I`-UuM3u9hictO!mO zmJ|uK$b6`Q&dGu}fC-LaZvj{6-C)(>HYrtAae&gaQgoV03>LKtJfpP$Ub^63Vj)Z# z3)2ylfMYU-oQ^EmFigy91~>v1eo=LRS%{dv3k*%r!~Qk_I$z;x2Squfsiy2+unkh z&ui5gpNJtSVjO_{K!U>p;w`tPDo{5CGB+Lq#|PRct`iCbq0(8hLYXBx7NwZEUX2M& z;!uW>)R$a_u>%4F53Zg)_{qOn|5S8M-PU=V^*A34eA=frWT#+(2nfpn%Q!x7;-%J% zsY-xwh|6t4JS-zCfq{1E;Q`avud^gH-2xB8H0Lj&PGsBgal(`be2fNawjkqDj7&;0 zeXhkKv(?1(R8=Texo1pdMk5Db$zyrs^ zu}?Q8)x)>PT@eC16&4({01x3pSfKebu@UG(@E7sv2~2fZKY%h^4|Y(S2s~B|f+A$| zSd~1$(8vfw2^ha)D>Vp)RksYuLk}>zlPG}XVF)@bb65ZTkM2*0?*HpBp2ks?0#p~} zH~>&800FNUU(vi(!3I_020R?V)O`q`upzd09OO}O9-!U%}J=YX|B zUV-Gw9|E)@txcW$+0_$1?!18(R3rQX&N^W9y^cgV^RF(!cb0%TW#(^vJ`^Z(uM@D*RDl0E7iEBX5+4wLE?C_jOk1Ga{5gJ`^YUt# z8B?r)eAV=7M8vtj8gbwh09eG8o62xW>MGL|I@dy4$oM!6*zksaL0x-v6K+}?j zVM7M8e8+fm`afTN4e)9mE`IB%xF9Mrz{F#cWBE_0Vsdg^*EvoJ#MVUt(+Lj(A}Z8A z$p@HpMnzthg0Q=QzP8|x`Y?eobng35DdakYX;1_32Q=OTVZ|i2#I(fMJ)yO6yn+70 zryHV!W3zl*LMwD1EyD95%c$W@1(raefiM8JXY-sprqSXmb{aXNF)p}`--0(}p$%1V z5&k-i*u-M1Eps^GYdypJh!e18rz#!?gpfl3=)jxaqV_Gx9gnPHH*f_nc$h`sS^QMG5|8NS9@ zjZjTW2DA9Wiw_aA_1J1x1j17TVoH1N0=4*D)OlhV0Ux4R@a4Do0r>@e;m0Kn)<_5i zKow)Pgx}$76(Nqo=sYZZl2zb!@^OOXdG-H!_eVdJo_L&_e&0KwEOC7vhmZCVfJewl zV63b6i4auLQ6E>FwxAyd*8w3YpkX3D44NvKc@b0^>BB>MC?%naD(0Qt#j(fbzhF!t z7!bg%%<+BY&)F`wG?%&>tkmiCmP02`Rq5N-0ld>TrMo z=pO%8>+tjt-nx1BTYunO`uSQ}HKdS1AFam|vZ5#)KPU%!5e?%g#p$1f?xPk3MjtFM zWKJ-k#p;1^0u<2`*};n{5COE%=#^&V))N4&Q0066`SgZzjE~|C2&%ktRNCqUugQXm z5Z_pP0N7TQVEv)~D2PIfLs!>BIRH`O4@sEF3j_?%QWynmH5_OarVYqknu+|{!usU(yvu&jnqXjE2n%V4*(!ri^3Pfl1lulyr;B!#uUf!bwP@5bJQL9pEJZrvNyhyCFe7fZp2t%W_C4 zBZn0_praqEZ=!Yho*_7Z0^|-4rk*YjVB;i=cb1c0%a#OU$vjsvV9S+R!ogtSvzTTQ z8p4mNNEc8sh!5^zCbxRw2$a@gmv3om!-HAIt0W=f`8slmagvOg3DhxCU{~ypPd|0^ z{de8_-a3d1tdxNPA}~$e!Bc#qQ&9ae^jPo8^NCDg8RRnxR%0Ln_zXY}sPgqNG*)F8 z79bt71K+iXxWMqFfVqnGQ=k^q69WSQL%nr9s{+LaKmg=`KO;jWgpF_&0=%ba=C2OK z9znID!Oc|=^47`$FwWO-YxMxk(J&51OX89(4%31_$tMj`%DLd=o-pYELoM9&FiY_` z?nNZFdInJzpFxM>(5NjDamM)43;|FWD25<>r}o&-{W*It%=J^r_WzBr&Ws53aQJHZh_{nQx)sxGI4x)h-yZt?AvK$}`^ z84+@jkx(me0$wI5jDCotjty&CL>kc14T9Bk8?yrko)L6{vKBwE0cb8H3&H|v-9o93 zoaL%P0VIgI_#nt#>tRk1__KspgQLc~-#SAnD#R#5F;Qo+jL5I7ZWq5{9^m)9E(TVF z)Ttm~sF}g2T*O_p5OSMGgsTrG@A~cEy!n^!aRJf}+4?Ys$|?s7Hc0hC(eIbljT*J5 zC2Cz~!u|)MYj?)0685ZgVk)P}itiW*=|kXMM;p|(u!lRQuTUk9ph4lP)X5N?a~eq@ zuSA) zUk9g%k@s8I5fH{%wok-5h;j^fE)qkvl=pROCx9lGkm9M?q~N2G@NmYGhA2toL|^R{ zr$Ub5TQ)56s;_p+*ioshnApNDQ9mJ0VCCLYR*t|{cFqB(t{iVP?=B{3;h z)|h=0qI|#)g%$?kbg)6VKy#Xy!Mc%SzKr>xs?$u2**!Fc;JxyGB*qn$VJ-0KZS9x> z2rVomy^QC;Rj=a^sS||~VcJ<%V|IvfL)%jBL1w206~rU<%Y&P=j?9Es}^m$DnL_52=41w?tZwg#T7Ma7^?^#$9F6_OMgCSM10&&XWwFvGQsj)@bLwE(zG2oVxu%-06$r3S#AzMt?gXVDtVZMB1!I>z- zJ7xqEGJ8}_W{a?NXmMw!mNJt`nswEqD%gUGm68=#9%V45pB42D{xGG4x^X9jNKY7Z zL!0lVPu>61!EawZ_Fm-oOw^MO81)_1tXCmPb3Pw65XN_hOme2k%jlAml8Kl@qjQavR3H!f7I{N~-a3ilBG@$srD?sNJYjCoJi$-!p#xAhr17#ncN~CN?j}5BC z=sJ^<96NRRM4j0k%)Y}LV`VjJGSPCq%!FFq?ibLuyK@(5cfq(=Ans0Pgg0sX~I!i!70yu3UjQ=VuZfSpPJfIw7h}40DfWmP^B^unOD*y&k8vjOSVz-<%}_2yYJ# zJwB+Ee7fA_bs8%DlsTxGpPG{3U!PPK4Wl!g`yqFY$-kkIuiX)V7pfIQHh* z`)>7~FTL>io2QDm)}Jr^@#Aj>trMg~m?=KvwUT0-8hg6ci&JCIpz+DH&ei>}PK3V2USw>~rU?0Y9jJJB|O z!t-mLAu|HM1aEy(i0Tm8wI7ryXj4Xu9HN&lh7J2Kz5dJ?OBjQ*i^^ZeVfX`Bq* zeEuzE{)t`4?@>pqpV;-&2@Jy5ly}^1dulg7^H#g}MCstfJ4iAi|H5tCQ~RUTvtLEY zsVh&P{PGhev=ap<9^ZBUv6W}9rB0y1$F2>WfA+nTr++@hyMPiIw|7+-&P zN=7!4UGpD%`Wfx1U!9D;UE(D}PpzK(haof^CC`4-d=n{DCf?Zf?lI*r&9`?y{jsx8 znQzwa+j6Q^bo{<8ZSM}9{gJth>=^YYO22p<{cD~59KCrOIX<2*eY({N_1)qr^y}%L z6)|L=KK0It)HA`e-$SGM3Gc?W@BZrK{L?=edizxB=Ckc@488q5{`XzKbpNyHL>*Ay zb)FXhwa&ir_4aq4;eSuHzx(uV{`br6Po>^2o!_!{GQZ_}U)Fd@>jW6Idw$EV_IJ+S z_etadIqThj{;k1hpV-y@k7tWpcD+0F_53^ha}4P|o-h2seS5}4nvY`8+dBDS@ycq+eMP_$UC*#N9ezsP@Nn0&c)m%c#U*TD4T1= z!C-3rCi&NyJ~r0OTRoQRUOc8$yd8#i)ES;&8X~XUQkx07+ynxyjNj|dw~}BK73^`7 zkpiQvO*nS?v{JiuHPeSjW4$wqXN({8f)jr6x<7RL5e9fQ&4;Fa(R`)doI&@FE!sh= zd&u+Qp?{k_7s0rZ^x`I$Y7;@_m^#(%6%Y9ya$tD!mt6Gk9Np+mo_Mc^c8BJ+dU%Ca zyy!*VMfwrfep2fl^N`KtPaM*XP9o7qaO3DD*&Q{M$KT8J;a^i$yZMT81>1}cxItxt zosM3ZyQTIjJ?)J<<%w*~DUNy76G--9OqH@7tz;klZl4i*->t2#-t4O1AJmXY1zAo0 zgk>}bVH8?px#W2tRmQ*T+O2dSYlAtlv>5ClSmDay1)zyW$uTti)>Th67ulr`-3Cn|n~53{?oetAQaD!mttO?f{fe zC~^7**xDfFB@BsSA(Ahf=n}LZ8S6A%{;HDG3ik*F3qm-w3JZ?>&}JY7BMxXp^dNfU z9L_8<*AOk+hH@^WE6~K6KC~y?ueOXPkP&@L1dr#-!FW=FJ`6?4f|wpx$vsHSH;>SF)Jx+oI<~ zxfQZhH8e5`Sy-cb-_e{*xcZ$n&F0t{;F6MInk19W$a86@hDmK$)?1 zahUprOuev`&gC|!Y7SoH*vwubJUnuc8w+v|26hEVFic3W%l=Hg9QcKvQ)6T~CLwwt ziL=3ISDfv1Gi?>SOHCqNAEKH$h^r89ns#AB!KhPRVIfEESJ*JM5vf774l0;MgVAIu zilN=P5@Z5Cyfi)vm)igxl2h7DcBv*OHpOoG#{Exh_`M3qU~B9%C(Nk9iILG{GRAf$H#(DZd(;`5PiBIxLm2(ShvyEc zi$<(YVqQgFozuA@;%emnE;k!X%dkouL^@V5OLj+t9P3FG%qtuR=oKg9 zBTR$J_~b^6sGXHk^hya4kSl}g+UzcvtCM?|QY!bVO$X{UVqVw#420_NlciX)q*`T| z6MzAJVQWz6t~*A5EX9_Y1S$pnb0=&g2p7A}@1(=bg2^izbWJ#LR_u_H>yn5O5|_4y zw_b#HmVtI;6f4(k|of3KI<2bv&G3{4(nLQt zXz=RC_Ow7~^ug6l$MeJ*QuVO_X{icEnb>NgOmY%va$N^|QUbeVkPIA;s4vZdumcIP zc*!gbu_1wAVh2ox$~qfr(?_v~EpCRuw6G&~pV&}AYhkIkY(rWy^wA{&GhIM+E>H$7 zM6-$#v7LknmmumRG0y~=2q#{}G!GNO>r6mu+d%*_!+b5+S&uYShn>|8|aPL4nt#+H-r+}6OhB#q#784xgh+)R- zm)QVfccrlV!RJc>`jWzpUZmR;FkqnAVi#2Cd+ztd0{ zh;289vokDUG$r6b!&x5LSyO6Q>p+w%8$r}= z8nLzUM#k0w!Zse7ZF$5d<7gZY!?F&$163zBhi$+L4R=Tm43^0fqR2Jim|pDqoC~;W}wwn&l(#L>flU|l~KLxGM(q@umTWRv1rDj?U3YBkg<+;1vl z-R1#SHi>1gFN(+-a!!Q<%a);^{k-SWlhW!?UiBV$;iK_QH|#(njge^SCU*xJy=08| z2)0OX{?i#+xIdQv@I>rL$B4JXFtt81`400d8~^kpokvR_S3VlwC~JQBQg@|1j)y+~11c6qI zqGiRZsxE-#Hbe;z(u^X<=q5riy%-gwiO%s2ep`b_?99{foA!H7&A2lVgF z?`iJ1=fyV{Yjf9^4onY@d@?ikQtpL;+;{y0daJhnp3O%t>DqYBm!?h|2M*qD-FdKD zeqrzPxg%n8dWZPzw~E`A*LPgfeXw+MrthWoCyk?fpYQ8DtuNd!r| z-yLe#W{wqK8Bf3PZ0k$ba{tSEwMMH9Z95%)zHpzoHFH+neqZv1w_0ww=4ZAa;M#$2 zU2(a&VwUKY1s(>&1iY)FfJR=+M!ev?0*JTp0X`9ZPgv^el9CuMVH=JKF&35yGi}d>f8w9c{DXLDVkyi&duZ(W(&UXFc=5o7@7eCzZO5#` z<@}JbIlQjzT6^r32_olTJfJTZYT=g5bHV9tC&UP8J3cX4O&|S-=LfrAd_`Zj?;xXx zy>HtsV(MSTWZz$R1|yYAJO0tS#kkz)x+C+BAg2ceHX(+sYsUMh&U~$R;Fgifvbf`J z@J%m0v+ZpAP>{Rbe^s}4jenq{fBK6-tGM-P@y7Sa=W(|EK(l|3wK?3U+jj(wqegdW zi?L|Df5%hpZy$f(xx>G5p1+l%Yk=c*UAN`Vy5dp~v4aWZits_V!NgM~DUm>KMOrb+ zEJ3$$7!*vl50)$MKf2>GxBs%sL@ST-q0B$xZks}1_*kQSwq4sV)XtiYf`{a84PQoH zgmP7akdsb=oYCIa&K(71aKAqGptG)~GmAxIX^Bj>!_1Z#^BsE4yRs^-bgwq4%ljHT zE-R0ZoEj-c`CY(&c^ZP?@Z1=x2@rH`K*z%nC+-YGqVo|ZGFAbO~q*fr}QOHVg5vV zk;dTsYCLm<(4wA6nb1KIE+yq%HS&*CB%*PH#YznL5;EcAgKb^u#4DOoh9RnX{kvrG z5M`nNrHSDjo=6IhF?17t7H9N%yRO~j)x4?D6&V|JCwQDw_6Cc2HG{?9oYv3UT9@ao zO3_ZW;HU(J20Gk=b?#w;9?8{^S&dG=Xm_c~s8IU-T0aPbCbL?Q-Ditw%>!KU2D{tv z#6hD_ZMX7O+vrCKLo)LxYRg`)_l+OE-ll%}zg!>)iKT&?C$m#fw?Jjv;BIi=i!Ux} zOB-;4;DlKS>o|5a<j)l45uOi-q{ylR#YQ)>jVY8X zl8CMLFbk0q!P+U!^h6fg3aQgrJqJ`nC*Pd4XuT2%&A|h_M*5L2BCX~1`Ljelb227zD<*DsIABxIsfO;au4q1D49nbU&-FL?1vL+A4h}mB)OYMA(!U221a*m*tQ|eU3YByy!1{s(B~AkC z;HYC}rDZ2xf=5zG1w>8JODw%2E$XZ5NCo)vsiBokV(+P^300P^iqaE8zI#6d)8b`5 z5~s;|3j!E1v&ga30aH%A=V*%ONUP2$Rb)*Zc{t&eJaKO8UtD|r+Ku;|k8s3rq#DB2 zje;dJcT_a80~z^kh7%?b`O_ZZc8V*MSS5I(E=~7|2WOdF>)&ROrNc2K zhGL>&Vq9>9ogm)|E&|AUiJ)!2p&;4{H#O%;AAVdCa;hsxC_>9N_oN!Vkxir>#1)6>);jnOw z-N>?%O>ZWV(kxH0$j?#V=6&aTZ~kBJJ2yEjJB`h|xaxm~j8QLVdhL9x+?}rUw(jX` zd%aOS`l$w)bl)-D?#y;P7=vziADK4iyd541Ib6GZtVSea{;V*TMJYU78D6Rkdzsgo z#YW9~U0?K!VBIUNiQHna{^}it+uTeQAm>$L(*xF?Xkv0PxN7D@*6=ZF=hqJn`o6oyb1SR_&s*huVxUGIyL}|#2zD+{cf5vy zX2;p>8UKNSS_ah_Pl{cF$Sectp&45wl_x z4X-V)y~4JSiJaKbsfl%ZuXP)UyzA0AeZtfV{z~0T7~9uB*X%!AxZ7_L7dkRs_JzNH+A8PJnK|p4oJ?k?yAVG=T+B1XqS7X&bQz!Bo}f zX%WIXuF{oz^=iW{6iEX#?-||x0{?Pm!gD=Qfi(|!w0quP3*jWwDeQrkHA+q; z@PYkY%geQh5GHQX^LAoRLDOcA?J5Ob)(Plj)HgX{VH2G9CLxu>o-yNB_nd=Reo^R{Hlh9$)nh{rpnuQ+ z595(UV)lpt$owm2B#jifk5qf4qzEt)lkToRV`_GJ+4K2XBwJ~)36CBxQb1*s94DVZ zM3N*DQL`Z0FiKMvuon=Mej&Oe?h!5u0tq(x~4mNc}TbJw+1Dp zD6khuHWYSf*bWiScNUM2Y5yY!A!a5^LK?gyL{fU08>yy3( zy_^vf0bGTjsxKLfHP(O7n%Nc{ABTumXh!slF{|)C@A!Z8-uUKUeDYfD`VUBnhb=WR z`SfC5lno38wjj&sWsi63jT1L#F8R2vf6XOrLpaTH=_|s1+{*7BznN9kJb5Fmb!wqH z$?4|&zQ)wA>lZ)X-7QZ~hmYu6Gsfx6{J#9|lY7JXv@z0#;#-~cO>!2H#$lv**`F@Y z6~i0aF2Sfd9Q@Jb{JsJ?D=zDLq}Z6cshyM!nHR|Q;O?K-8+$*qG-K@xrzWPK4rR&; zVMT zTX#3fSMlN!E5|oyHg@D|q2KrP z*cWb;p_7BmP}KAH!A`2``R;^uP*LqX`7o5SLJ8tsQJEP zn0r}&ZjsNnwq(f4AwPWV{Xu0qz5D9T&({jW&8e5yzZ1G-s~9Q0Kd5D>Qn88cV(P%; z8}yA$Qj9B_jq2plq2kPZ?O-^?^0-^!J$;{d83 zZh!5E(V}O!?NJRH)qArup8MuJ;sp)%li+E#!VuqI` zGAZ&Uxet_F$Q=!r&?k50kW_HE;~_9wR-`#z@<>D_>oifB>tUU4z1(l{|nMW zYZyY{SPHX|E5I1QgITK%3o`-nkqg2tBt$JTL=R4QS}LLjiZPc`@%OUyh}tR$*ltR7 z#e$rc3?yL8*Hlhs%#fya?Wn7Vx-ILDJ`&xqA)5@bT1weg6D=!^e_jXv&MLVx_&>9* zsm&ySjqqG^$VR#il?aj6$hCBtiej~m#wV}t)P?0wwJJ(D6VE#%x`VElo%c`$Iue*b zr6w23V=3uchJ%aul;(-BDFt8E^0J=hfexK}#H3kjcu}QjdG3Jb zqlvfib1&fWLEDNv5)BYWJ}%{vkhvxwZY@=|KFx9@DLTi8%>23h%%g43PltKy9 z&2Uu8r9!enA(fm$USP_>))U$hbF+?=bq2YSZwV*n7QH{#yF{RWPu`mKus*3@boGk< zi!5l#3CFbK>86*t#!Jg-fOt!U66PCwXXeSF7h2=9;|r$M;fW!e3FpQQOgM5`${<-v zv3p%E+L<{#VjdQ=c384lBimVI%6ZZckB?*ydqAhH%r{_e?veA&ku$kAgSS&W=}AlG_elkr>sbn8U& z_j4;F94CjgFvM(GO0g|>jx+!WC_7laz1vV%L=n+Xb_zc-HvGL2GOl2|!^UXFGRk>L z){8LzK{!rrl(G<*$~{{x65)_(lkZuolzfUsa}b-hhqj z^%X|(-wL$o(^p&l#RhBi^CGKtd#6O=@lx(_l0k?dgHdBm!Cw~WC*_ls?fMR~5+X;8 z>WW<3zPEHFxPqJ`5X*jjK93`?2qBm&!x4F7V>DU--#;Fpi~ck}FdE#2%ECBdDWl$% zrvBZ?SmvjZKZ_DAxy;AlGKsda%mY+2M8J}u^WOot1?;-lCYF#f1bm@P|$k{S^(3rr0+u( z6GFFHkJ*dVdOlCe$~J2fXP0hs0q%me#>%NJ%eC$YMV`fRNhnX}huXTmm%5BY?G1Ds z<&+rAkLqR826fz-4;2xdq7R!M_sKAVVQdnJ@Fp>1( zEU>>>W-m-EU=-(#{T{UoR#*x=Vue1AobdWvUKlf!QGe98_Kit?G6O%c=L7Sn{G?_T z{-f9W9D4C%fB*GWpQ@?n8Or^NAkJS1-3aG~7BW~vMx*j7BM2N;x~xsZsh-9~B zF^ElBwWh0hcnOsXiTS=Tv9W=jFIXj%Dy!I0K<)=6{UK~&KD4cEN(UrplU`!cC_^wY zz~pILSQZu6S4R7dRBOq}OpRrj0sXp=l0&zv^o2%e$?(^mU~Sn+7qN$#V^Kqyv=g5; zP+%1EP^snBd#AkYRtvTeNLR6}NY47M6AB#9aS0pD9=9DcnHHvlk;)C)9x&aWkakt7 zg@i-z67#ql)9S0lGi^#^9Q(9wwVgDTEEY!FRC)pif0HcdkybOUbfF_a_>%D?xbJw& zScm&s0ldX&Xd*Ov=CDIz_X^a)B4~?&V;pE|_5zDELd&%(LF!n5xl#$7oqBdW79bpN z$<4wl+ZgeqG@~+;@SFrXh8H%=z{?yX#?~qNp0m{KoZoQn=D9z7p!G#F13-iGL z_rDjo!oPnKQ*ykyKevNLmW>lDJM6~>+xR|yxhp#t9=LG&fA-hW{%3c{>))B4_&fEf zpT}Wtke!%?4ry+rK5~!R$h}HF-c=M28zzrBYCVxPtuTJiIGzCV(|rEZ9h%eO`)*Rg znQ+cU(3Bykbd5QHRaa=7wj7MLI;R|L%t}@!j#%(yOcihDd5=aBoY&&ZB9KQVF3Nhz zjq+qX^@aVo$--=8Q65ib>ekZvcH@3brSjD3mAhqtsk{e#5|;w7wi?ZJ5@uWvTvf@0 zG808~5!J4{kvty}fz(h~Vduh0q5R>_f0;XQ?)Tn3UzkNvRC>X!vvxtL6j;|*I#3?Q zJ&AlAzcGF!{s?E)xZ=b@Du@4r9Sx@onkarieg`0|i8>x6afxsUO`c>>#lJ6<&3FB5 zlb0k-{kNM#!SS|IH1Cd2aP-qFzPx_nNCtWXN*_RV(g)q;rQSeGr!}Bk2Tq z{Y!h7qXX@&efoZ}z1Zr&;&=N&_je|jmx}G(U3*&lwzeKA;{C&g6C`-}MCO*wW$I(> z->P?$$YG+ji00jpS9afG>wLiSuKb%qUOBSpU$sF#^T!$R^dB&21AcycVsemNzWygR zeEjw!t^91hJU2!ziU19k7@CidtVf(#H! zJI+kiUHc<5KR4F)I>}@wt_ZF=$Sjs0`Rx9!Hb2)CTi5N8i7ebtPFB6ws@^}Q3vI^^ z+#}OZTvH+iXQurV2baCUOS?<2wGPZ4nC!ozbAMQ$T~`-|ZGH~BA_}JO@~U@lGCsbu*xjB(4=CJe*E(un zcb7hXx3@U83Du~W-&Ndi9J_S#bjNu9>x=6xd1abZ4I@{Jqt)*4^^*N!7l|59M4OC( zyZgyzwa3dnx+6S2NydlkyR5hR-~W{Np0E7d`H{ci<=xvu_wKN2y6xMH{n{;N-Fn_L zWH=@Sy4z@!TlrIlh%D70h|OB(?v_hb6|qzm9>II1b*@*9+q-JfRoF5no(`sJs^M z7O&$G0Ud_cQd#u0ZVTN@_nmMHq9uwIdFr;7dR69(+kj|VI8nu?Cf(A(d1W^5p3gTi zAx~KH1Qm8g$>GGvdOXUkiiq-vrnpwL`KV=95w!MkL5|6`V4Y{k(8DNy+Q@soEzaQD zrwdnvl{^oTW@4BG^Zs5_C!0c)j}j$PVuvGp-H~>3DHJE+!p;?~QkpZyBgmy!*ukmH zMWwW5VB#ZlLXj`#;tXi4w}py8iG9GIv*zcf;trq+6Bb^ zj8)5c6Y`!+NgNcJS${NB>#+R~<63~RKupe!%nmGsaXN-YBL}r{>ZaL&x;;H^jpZiM z2YgYqUtIlluWtX#b&p%$mLPCz*^^HjE4LPF*X> zJK)4HzLn=h)>{=9geyGLPF!R*W~VNX*AtwiGCTL$P7?4Y zEL({Nv%I3zWI-#}q~{N6nIDK^EqWw9Au}EtI{g;`D~{ z>GPZC_#!Fa>B|#Y9^*zKTbalMMev+L+OYU2OGE{C$Q!fF@@#olu;U$tzgxciZ{NQ2 z+~0Nn^hBsD9j2kW4L8gt?oB7MV!x$)&`$znLb(f`An#p6c4$_M98rr{GtM8e6wv5; z1wEflx{5O%DZ)<~IJ3F~LIWG15GACXRHx@XVk~IWtfjV{q?~Ef3Nnd0i}^I|l|**> z=|tq^(wgu1YG-m%t3MOD_#r7%zG;LifHK&Hl7X@V4u+Pc)Qy_o%S&kiB@3(&h;$B1 z=Bra`fG0res8#iet#1Qs$8_5Q++CHdyNU)*cl9=P#ogv;K9RGNO#*j)w^r8%GHbFV za1SHLu<+a=$6Bi5sea@N<+jMxoJ2}wlGz9F)Xyk4*r@BRObCMAlBh3wk%RNf96q># z$@78EqDu-%#372|ZXXx^O4s znY^o7n=Vc*d3qqS0rpVIky434TM@R2yF+pzz?d+{AVhz|_B*dAS42gV*bv4B!SmJ* z&*`=L-_s)n++2uq+Mi7XeQHkf1Zx2mo%_^YOqGa*Y$k}WU@Ix<004VKGFK(_OY)vH zju^QRXIK|Bs9;g)nNN9U(?r}qKD17xkGrnn;`WgC65YBB3Jd1I)Jffls+QYSLWc4} z+K6ViNuJ}W&4m!(mnF3E8sCxi;mQQbz@0&v=%E>~q;nD;qfV7j~ukBM*S@i4~!k75Ll?{i_x|it`q4 z;XeaP&TEz|M$f8rw5wSCYJIoSK|SJXsd2Sd$RK_SC;S;zR+I0f$XFp_Kh-c!2t3Dt zJ(6>eyrf98(#mEibxL2^n)PHQSyRsa<@i%?{KEQY&Y#_yw6khfjh~AgHR5!gZ;q%Q zg;OBUue_DuJmLWBuuoe)TaO2yBv<*2Vk~&B@5s->Q;B0!o{Sqj-id!<*N+RAK3~yb z{2(w>Oc;rhyzcTpZf3b-j~Z}z#yh?0$Df?KFP@qERZLV7Oq+fu=s;GJr6t-=K5KC# zznIT)FbQIsk-L)I&~I51kR&Ew;;fNv{rJ+;9HgSI(^Y z!#gfGl!09i@}b83CDgi+1otGVILZ0?d%FOSn^NnZ3hP-EE?6=VCbdA>qnZ6lZ^4ZU zxukKgt2*K$Wy!+p6)UL0QIKd%ds^OOAU_;E?9?)W-f-5Yv^$#S5^HD5?(_h1Q0Sut z&_7_?2gRm3G5H56Z)#;C2lj_bX?a}i2(GO z{3AK)IG{)#PX%cye96+FTyQfIsYKM32qLa^>4)gdx~3e`>TuH*T%b#ZDsqwQv3AF6 zrnl)MuCYhu9@`8S0y6`@2#qQ4BF9bIbvN>4yM~TBrJ8YFvmqlsnd&z*y3h09+;H=E zPG0omAII1Dm0#&IK0hi^1Cf^e&QZ-KFW?Yk;3UF}o&ZNx_Fl?Q^7mqmFNsHD3Pr$k z6AdYi(L0u+2MR`>D7Bh96y+vuH{*nk$H-ZyVhwK6B$dmH3`ce)eR>n?IYKmyY4Mn09!th zJ%&~}=PbIB>=aLN4X16fGYua7(nDiJ=$r z^B29`vX$^$CFScPlekh6t>sev2rMR;PF+{s9-%}>mjfMy6qpmOH)lq(mT4GG*9zgk zV+($I0BnCHG7UH5O8$kxEHM^lV3c(_3sK^QWlKNlF8K0Lnybh6!MNPOf<;W5elI|J z8JjE!Nea=MnyWMnU%s$J<&Y(o$G#b@#=5iy3!en9SLE~x}&;V zk%E3bkv9peba`SSX2+1Is|rWWE}3|X8lwV6;dbkFXhX4?wzJKAB$7_jquCP5I+v+2 z>C?C=&CS|f-Y>#3~^h;9=+H4XRfZDz&rEp66|+3=ht zSj?F9Skj_aX(^0#j?31BAMO|0tc7S@^P%CqXeM|7Hfyitme~Lq3zv(KvT~oC+7n?;;C=^_@SY5 z_k5Qcu55apMqxL*M%G=4GRSt4rJ3k8j>GZk@*E2eV@+2 zhcEJ86A)myhC@0x^L**>g=~U-o_FAc%=z&oCvkt3K{*-ITnQFWnzSGNBX5nTFva&M z0;EcLJ2hmpltJVtO=8(WmnMzLCh6KZ;mce22uHJ!9pX1QE6P9j$D7aXlBD7}Or<(X zpX$mh>`7a;qk8g)VAKw~SPrdgM0;3Q?gIFd6K7E zvVG(%4uB!AW*|FjQe<0@A3&SAipQvxQU)K+>ku=YMErHKGIdT{EUL-8GiqO`G2e5m zi#rDlJWScB6pFIwj|N!;VJoAK3f@S~92iYfR>4sP>IMX6gi3#6oMVnSjK6etW%W(5 zAST7*9xg3}ky3*mVG+W4kFT8jQU6nY7d>`?$O5I`O=c7LV9$Dv3^Y{IO{xaQqM1sj zQx~NhrfoKu6A%V^qkC0Q+i1ic`lwM?1wFhF)V1!SA_{6Y;UF!rDycSR^(tRwHeA8o z5TNfqVAMlbLJ%v;d`wOupX01zv?Q68`HBV;o2|IC=^T)8RFxlkhMaOJSWjF`0L z#1F+AG^atG>Uy;HVKWsZ8}-bL1R^$#S@O1F^~&(1zw%@~NceZx*QA)GJtqOnY@VBX z>oJQEgO#mOr;>7GTqy!(+of`lO2{foknVUe-)o%kT(7Pv=A zTF;ED1H?MQ`onZl2VKyLvwG9GJmN2S*#v(j9Z+Y!AymX@KLha1T_5%?V)d{3R3AhKQjjGfi=?)qpq*WE4^Wk)P{&U@)hH><@h9ML;BETB#2kx z%Lr}J4Jl+n4$j&Jb8Rwk`c$+t-L9{iNuG3Y0^q|eIfFoXei&G(rk^x1{*jodIV2*w z+p4EgI6VgRLNui=7;Yia45QPv)n_6T}Ezq!XbkZ&^ ziG|dyiHq7|s|3hugSdy2@aC=@+m1BU>W27PvDZ2}q zB5Syk0!j_4t4+e)+5uLWKq z(V=$j-aw!EiPTBo^Sut40#%MNTpF?rM^5EcwwW=vv0MsNk6rzfOV|G3p*834uXDZvsbQce^(kW4#L9&QhD~N= zX4^I^y)1zL=A-3oCrObWlDEr&$%w+##3e_E3o+KR+Jc*f(C(=1 z@a=*o8MT?SWA&Jp&ZrFQl{Yi8F?g~sUl+mEQqdY=QUL~~LpDfW2Q#21)2djRC`0*y{le2JYg~Rn>LPx@x3mh%CI$PvC#WYPWx+F}x&{NJnvUj3S07V`x^a}i z5OER~eUTjwKtf(KlpDGa@`NsVE70imgdSmB*4#?Mic)5B z`Ck|oU41RaqeTIsrX*H7Ijw!^~rM}Aje2r1|l^dE(?~TH6uH# zd2TG**bL8T!CMq^Gz(dh9F<;{xJX6bOYg`wl;z9k9F>yADZz~I%U#*=0{oYVi`tT; zLzy3e$^7>|{?y2OH~#j8FjxHUxPea1lKE2+j85cbxw$E@+(~CyS9t+dz?Q85WWw8# zJ;@|aV=_~aic6+OqkaR$IiB)eS%w3M%d97J#q>0!!BLeXRyZm*2qD$x2%~&TE>1vZ z)DRO%Zv%mMMf9Z@S-KQgfaGX)VB2aL5Q`iUf~&UIDSg z5+ZIM1fRU-)%5_cc1z<8ary(aB;L%7Th}bODIA7DEtNkL(#5_+@w6%H26ZWCA_;0V z94*~la}akl&uG>WrpS9omHd!mfAE2y{QZe@$NS_rtZZ_?5m_1^*p3GA#O+y+&j=S{ zLwb@|gDf8?iHN4xJJv8&VTDpfj#lEOoEGw~_~vZBE=yr zWm?c;5JF91S4mbh9-xV7GxAm1X=S4>^wf%w2bCnD1yS$tC0onVs5GwD?a{(CM3Buy zC`;MFjkO2UEDe4dyw1WSy0{+#UzdwT6RqeK}w#2l_5@? zr~a6;^YW4vj|YdAksFWkEhbu5k{hG6yqHb)sg%tf^-}1l*u_=^dS}s8vfCzkgr>=x ziKZO6sfN&K>^iJ3u|5+sbX%U!Mx0UQ4oyYL$a9iCLQ?V&q0Y4>M`PdOrt{mlEJyN5 z{>-f0n5;`Oz=hbP%d#lrE3<^01K8@eyjo9eod5or#I1YJ2g+s9jzm%DS%D*(mPNUh zk^+O2X+~NJK;<_4M25ALx=IBZ+RO%d*#IzIT@tKp>RElZpGB%QLehpDZSk!%D;>|0 zZp`R-JL8v>5`1M=Rz9$Des|K_YWtD>jEf+XxCP+lSxIg8K5=^izk(rqU9D)s0xye>6p4I89#UNdb#vuavu%Eb(07D^H#Oc;l1h=ElDzCCiVe@ueKa zlWf@Ng=tcj89(LHXgx3`Zj-l%oM)Ty zS&UWX9>vHBl(|B~FvoGL0nu}(={deyrxw|S7jWGJ^Z1^NfAEvlU%5uAB65RQ%igvZ zT-dzL1Q_#zxDDjxNcO3`;pestX}?5#je;p$a&|^&8bVQevru_zRXS24-$}@aJv93=4mbRTv=i^kQqEs zBIMUa@&)u7pDs7Pl+9Vg->gPa5CU&zhjx;uOqnN$6N0{wcXBGA3-a;+M*oAS-`x1+ zbI<%{e2LP`tHm(_5{i!?VMNM!IZEhQ%JHT;R&ja1)|C!bKdp=_#498)SdODDk7ckn z^rsv9GE9XP9S8kj9Who376fRlHWmk%SsRIbDGcz$uuu7=h(Jk0bBqSQ&l;$8N-8Is zewa_DD^^oi3B#HuVFXzh5TwST*Xh=NSBc8WS*uUosVbx_t`z5wC+t2mmZwc(jw6^> zN?jLX-qlyR#}k0ZR*6ZTofC>zj@G2|J6hwBp%6D+CohVrhY17%-<@{V^_j0qEJ|po z&t2tDS2OjZnR-uM2j9S}?r=PJotwZklZZ}%n7~X_PFq76bjC))Vnxoqp@|^&*+|JPd#qgWd~}fjmZeLNF6xeE$4&u-nyl;w zsG(N>rAqQJ`n1Ip+4*~oTmR;bUw-@Cp0AznBeG@-mPp#p=C)o{5w&#I5CkEe*7eh- zo-oH9Jx2tCnmvj7kr`we&l@EAB<)3`X^bIEF;PHfq8ki?u(L#HmvYLunQa2l7um|_ z2-Hs8b|szYJXVsHeJvY|w6nIML|&)&U?W(s7uL-waUE9s@^ueD6ljbbGG!n$7U0WF03YM z=UmM=EL?An2^!*?F)%SjqnQf2T~yzN7h&_jWJ|OqtEm@+VGW-aLURC@5jSV7FSf=8 zEsAYh`+0qbw>?AZPTNkVzH65brB>zDJI1|e+{H?=qqeAwS4k`tcC~-Zo+V~HamuRc z)?$=LQkWTGY-X>vSm0Qy89V$1kAzx7*nQRnx%;a|;7)6YYjVsQGuk?R?G5JCA_m#k zj70`4U+i5LYdphp2Qc3I3l>(B3~^5<-2je5L{T*Ph-d8YIN|q)+xiPea^XaI;(z_| zKmG2x%6;cMx1d*l)yCEHydrO zz&-2(37J=Y(LF+PhJta%P=iSHExKhP>~?i_?86yR3?2Y)|MtjCFi_@hNaw9({myB? zB)j~UaeLuPz#F?=ci^S;S;6vHTBQ5GU>y@5&IIPiiFF$k(MYc$^E#i>NjgA_M%87Gdr~`fZJ6AqZP37_~yxZcDZu_Z+ol!duTVK$WVd*B&r$$fa8UAJ_xjxg~uUxrkxjUk^IWap^FXe(P z{>z3~F7>r)VWAyA_|d|YDfD!bb+|5Lqo-M6J~2M!GOz}WF#*_++*Jxg8v=;aflh_J zBp?99>MopO`iJ!97AIdFkj|Q~RHI_NjQMz|OAQ*S#C#@{ioPvIC@jYXz2H?#w^%x%dQN`~bp# zxOF`{Z-5NnddDw3F(M)CV^se0dodV)d`|8?vFmzn1F8R;d{u6KB z)BgK%#|M@F+e5dq^UR@dKJm7GFX;TcKXT(1_njd3cbSh=mJdHvD9t-M54o7aDls)B4EzBBR|Nd*qYdlK4y{Oxszu78M&5`zEGtq)QC zmAx0hSeHoshqk=%%%QiNL$}`l&Jb|?hi|;FQ`vI=J2&S3Zuc)&wxr*=@yd@jUuwOj zgIa&b)H~_QQ|WgqRD5IWUp71>0s7BA`tprG8ejL}L%{Jr^r>Adxcm=&YUu5C_WxdZ zYUoGy&X0x?hJWSM#-o3GLx20BZ(bI|*}qGY1R?i8=9jq^bwHjn+_-W_`4K4aqrg#M4Ne8=Z9 zA3eVELCv>8jhNFM>##H5U^NBCs8oqJY;yHBDmF=<^;e8|n!h3k1k!fTy_kVh( zcAYNK`Zv3c?ILr~!}nx&8o2%mOG3O$Jo~;S(jrYKXVNW+*Wai8cX<8Jdz|b)kj^}q zUbGtP?R&%LeC<~aKlAV5`Y-MuOE^)CEC2(_iseN6P z>HisC|AUQ-GrRR&!Q=<$tqWg@jL@7iYN6TTa`K|f!sk5w&CsuIo?7`-^>S-cExZ(` zUPx??;rbWp%*teM6S)4rvYrlK4PMd*?zW<;cPg}|SL3@>E{2l_qUCVJ$^h8koJR_c zRz9?PsBbPa76bM#h}>Ht*>HB-R(qzAJ|WtZ_o^S%el2h}A6o2-(-J&v>8_q@z8U`h zNB{hnwj5H=6P8oNOM6JtaFw;sj!rSYY}P{8js%@crKvh2HFm~QX3+Jk~5|8&7l~9fi#<# z#^nR~UU5uN`=wpSBtmo6#)7EMrB=_%LaAaJwa`;WWj%6C{~9$7+#kT2fiVjOI$ck=oUyNe#`H&*ZO<{S+Baex|etm@~NR zB|B(_b--w&F2$M}k&~*_q;lxqV$|>yzyGCA{Ak;U&VBMZc?X;2_B2G*s6Jo@=3%le zh&cj)tzo;^Zn!gPO@C4C$M;)zSNkrW0<*EHENjKBIjzolvdQJzUD#!~#VHgXE0Mt@ zU|MFsmbDFQjc?M_YsLu9aVZG9tVUpo)k~9y2~Uy8h)EeVV)fyphg`T8If?icLPfc) zE0GOQrEHA`HFtRFegIC0QO90M+%To2d(57k)rPn2-sM1xXyKWX*>kiD2p+0+${y3B zQ5zwOJ5)3XymvO~{8*bdSXb$GMDQwZMWgzt?jIzi1{?)-R%F+vYIYQvJ&m42ie2^$ z&CIu#^-evf#|CmoCFj-{8j%GkyGphzS3O8wusO*%XMd+bfc{Be8q`z{iIC6l-av`j zOt6ZOc~6xt2iXlL%Xk&<$kFb3BRPtrT0n)pQ@gZ|B(eA{>0dQ#ooY`S-hjPt$oN$8 z>%-?B{U-Ow%_zHoe~^;EHAUxX(|X-3wyg5W&cU8`Ag4N8`mE75H;}a;eBZg!@Eyyv zqtzf4B|yVsjUwCfL}2tZMmKn1#F>fgGRP4O6H^Y8wnq)eTy*Ob!bL=_S#_{c_OtK_ z`+Fl`B?%=Xd6~7H+zB)w>MwZ^9P@y1MH0v; z*?T57@0LN6D5}_UY8GJf*05L1;k8hW%*dQeANJb3BHcNU?WwNU3i)Na zv}-IAtwX;~cQZyLpk=3a74WPTy-y@v;R46ts9*5BMKPQVF`X+SOZb@GvR+A+iA`jr zn)YbzN_XgzyuO*Zs(N0l~K(gyO0I@gnVcVv) zdFJbeB}$-XMU26mx}5>k6K2<9p9Z58=nRUJMt|xD%BjFmq0#A;Qb;Lf5Ytj?_M(l( zX&&fstt^LcH83N_)p7w(n)2E*Afs*pe4QX)Wd&kp;wb%12>K}&d(AviI#+Gz>Expa z<@miV##H!Yl2LfYL)P<2hA<09#b)%hHC!n^frp(mJLlU!sDDh9YvL76jF(}T0Pg4Y zn%J%%_MV?3t&Z&WQ5{7P?GUaZ0Hkn;g#c%g(Tt)kQBoMrG{Xkw5KSgv=;VW3b6aJm z7+AGOisRRmEPfc(BUN(U)jH1zYiVh64dAlCttD=mpKNRkvUB7wL@TsBT)*N0-mG

Bm*c~6*rs>&nBRX~MjnQF){+OweFMi4OdtY&OsJ$XoXqNpoT*_Itf)PW3`eGPYao9PQyLR8 zb7^R4ZZyYKWoOr-97Bh3!Ws#wpC)MoWYf0R(G#*DRcV2QN1zK+N|sedtVWYE6h=;| z)~GkN7^THz&2s6~I@K=2yDS$GfC*j?)H$Z~0hW*q24+3shtlpWz0~7k6Foo^SPP+(G&;{j)|>j@{KUWL zQ^oTm^HhgW2bu2l*&X@@vAnI+`nu@=FR17l&UnScZuC`CD+jB4j7+v`GPftQ;La&V zR4c1l>xfr07F=-jir~Tp0`!(V2FhxyFn1nO? zX3tbj2vqp2_hH>g(^a&Cpm0x=I??%AnbzE%Ru-0T(Ko5Ne)7D71R;8+EI?e9n(&l4 z4|~2YWaq7s$&N%%gVBq0a}fxy$zTqv>?yEOOL{kpzaTN5+%249=q>tKW;| zHMi(RsfsuzaAAYuMr~!v)mKl>iN$OrFbvXZE>Mn~a4~iWmLLV|wU*H510(~dY|_$m zu;$W&>1ZR0gKuyF`;w!|ZVOX0blWuvj1P_*>NbfkYCZOJr*HNHzl-Zl!Ft4-T$=Pc ztbUI!ZtGZTlVf>AeSn zJ3l`-HoUm*Ywo3)?dD7?UD+31{&3;d^yB%dJ0H2-zvIDWwr zeZ<|obo$W5BR>qRy~|eltT8;W@zVCOq04T!zBu`+_ivN#UrZc45KL?`C!Ri;meB9> z;-&}nzS}1UYwzd7uDZ{^;~otf0j%$lkog9R zoAmcrHiy@?4+U2hKK}ChX77C)hWtzRe@L(V1HiT5;}^UBAo$m-@5}!nbF%om&4T-E zXo;_&xiRp4!K)@wPW(e zYxW=5cCy$wJh%V!w*1Sbm-XEfH0(~!CB0&_I)u>%T2LkDCI-w<-JP|gQlrBvlpaKa%$hh~A*IfN(_A(Q zORXaBce|T(!b=Zys>2`D7t?x04LX+wbE?@jwxI$j=&5#I49W|j2V++*`n~hT zr?VhjQLRl zyA$2ORa-NL2X?;YsU=~6;iVrJ^WrFS=~w|dv{bI)HCpYd2=j(a_foCPCrHE|^=I>5 zcP>2s+je-7BPC=n?q%;5vpny0es#+H3j8RDzA%QxKuFX z)o46m1JYIz_S)KQepLs3E=aqo?~a_pZL^-3LAbE#8BeMo!CaO-eEucJUi7ZY+%~BW zqB5d;rXvJO5Ba`ls$biOV@-v6 zT+Un@8Pg*9nPjlQ6lta zAKo%eZJhHQ4C)BDbYwWqHK_=)Xq2iIkXqalUE05Hjd_dJY92JKIbZs~!TiA$z&i!Q%%~)0X;?|2h6&d7*suhjY^%KS{$e);DB7Aq6q)f_Mv2cu>mn@sw z4wE{X(yf`)Q6PZ`6PZVvmE?FC!@U>a{vL@LI^_wvg`-qUH*qSG-i8URBUBlyNg}cx z2`!qJ9-<`1G7~)wpYIY7hfIY@u<&?x zW9OJc0_js{3SByJ-bbvVlk}z`Ww}>%b5qH6QpfGK z`#nR-NxS>k-ajrxk-!0Pa9*Bso|p5S-($PflAWl~2gN`gSh5#OuJ!t7AGrFe#QO)N zy@g}KzGZE{jHfnu_^R1o5smAN7mcqV~KVTh%RB_!IV(&ZsvSoiRGjjKPiiuL8-) zA8XiSx@%31GxhZz*-`Ic?bzHKFHXh7b<@Pkbxpbmo6}&GH;3lk#AX@VH@jb;{*MOP z)F?QdKl7*BoM)r5{rt4=1rKhArml@{h(0<6dZ6`?-L~m^Z(EM(ZmTgxOC0fr{V~xI z?ThRFo;4pp>izMW0FxA}fP>n*?z>A{s7d{eCJlK{kbmX>!gDWmO-EJj_ zLV80qM07@PK|54r-_mY(do@He>wnBfm6|m20Ue#3+dpR&A1)Qly%w`ZF4e%fVSA7H zh&=|YeWjy&%@k{f-s@Srz|)I;QUwd+rq(-PfwkEjydklp47@sy3=;6t%!2epI3CMb z6M9Jy9<60ugKc7$W+vEH9Rj2eB~Vyy-Oqv{3q47Zs2|pulLewwQ>(14lrS=kAkpmV zz%+vfWdTf)9V}$sXtX0|Hbiz!n38PPZ7!S3`2@iR^OJdznRKMsMT`=KVX&lLT%0$TOSw8Ao;lw*DJFam8zKLgF)%$)%h-Z4a9Z$P&90>5 zQrXXzOPR|aWxI8c1S@CFJ$+^{eFFCu=)ok7e|wkcisN^t8})fCdlN89=9k=Jse9@U zf9u=N{rTJe=HHXOJXUROxH|VEp8BpCUH#3%@h%eG6j11cq-m>T0Olz@)11e z9HO;WwFONqb}Ama`LJb_3P)Me2TwML#@p|UFu6Tux2+kVRRPS(h+s~UIG}WUVUB2+ zd*z&B^^RCQrq*7!TODPbHP^vgdLX)7)7Vkx2V1gHx8vb*1{&%P zN2O%NZbF1HC*@=eyfl!Sc2SzB)L~&=1)E<6x->uv4iIwA*&S;(aJXUwa_C?x$(G?2 z7}cQ&+p%_;Lu4>&fH%)95*L?j%y65%{AKyeTB5QmPWaFSq~_o=Dv5%qSno(8+J)$fCt8sVnW$18H;r>{{1+Icg!;Pwon{ z-xObLHj2@dM3H|q1-K?C@`bd-$?sVzR_8u2|8#S6dTx9i?cPtH-19B*#mJtD=5BAh zGIU4}2%(UEXV;!FRN*`j?;R4wz66l`4a-A7rsc9AxtB=4-M(VEC!b0OPe=3RS?~8} ztCOI(Ki|C4&iC)OKbXF9XkvC?Jowf0(xg!x_*UVI9uW4S{5lx+Lm=rn zcTexxzK%=(E47BvO1@(0o}DBgZoV3i40+c_=Oj>m_K|P~0R4{m3uOsyPf)z+JT=c= z0FOU65@x?u_`+J83V#|$SA#BJ2yDK7PdeK3t-?)Sx;ppMS<>x>5e!fVQ0yty7b08M zh1F$P{J>6nW9RN7pUDI3-@!nLC5C;pKn-6Q6|~si13cZruut7-cP)pMs(C*0Uj0Bi zz1v=R-0rImeA8GC#m;biipOoL{_zu~nAP9w$wheM_LlT%dTY<$#_>9QeH8QMcgJs! zPRHfv2VRTgaHdtFQ_hSxKGn5+GQG3wJ7W3gsr}>RHN2MI86K6`^?PSW!s1qE*`86q zVbl%+-5>nxp_%x?|M?f6-gMoebwWhqW5Em{szqOPN+(&aC9Z3v=J8;}B&>{u1SP^z zZ&ORq2SgZyBQi5yp1aun1!q!*nT*zLcYXm2aGEX7yIa>TUTsK}RZRlMH_^8k*HSpu zr7B>jhERyv1z6I;nDx5QS1mjk6~4s`k6qZ(99aOYpaGVCebL9k(q6V%tcB%x{BKF5 z!j@r~khZCS4Zc2G#{jU`mKO;cgj@(T0oGkaP`-t&QDr(~wJwjWOI@X!QqzR1A|F$0 z7HuoI{JYZ7DAgs$3o9s9K4!&%dMR4>RX0WCa={9Mf)k_a29e(4CTI%TddSiss!Sz} zw4BaF-V#{@3;xikF8V7m1u`){XSCt^VkxS%5bNb-DZk{eRJ&jQ?4LdKCGG3?Cf56A zwP>(*kJZ6w^ou{V&tyB+uH9K57D$j|j<5Bw1(L* z?~8a2Mw8;zA-_pL*1__m*<-%oBU*F>sT0-&Ast84$H%)GFVsUXMnja6XT3C6FNuZC za1jMZ+`t?Pnn8<)p#8Ek0WsjfrmssDrRWahN!vVRQ-cYCtTBPr*=)>Pd#hIO3A49_ zO5YQ#1sYt$TD?61wmkyILQoG)xQM;@s6TVrlP9~+j`qC%2fzN}Yv*@fG`S2KYeg22 zh4E-f{Gt9?OkLNDSCI@6(GWJp-SyI9r?p^4n+OBokDbb{*sI|s3);e_up;el4ClWx zrHrv5Z{8P0CPD@x=dhGF;rj4nD4}M)Y#Ya*5R7;?n4z^hi!=t3>#&eAr^#a3MqGnn zholjIOol&K<>C)S)3JR>(#N8|YHluxMEA7W9nzWV00bh*BjvEC$Y}T5?^)m?UnFB#)AjMZA}WIH*G)XWL`KoEs&+Qe8@OP(njw&{2}}#-j}@--*20 z5Qls=RZ788(#AEiLSCW4l4IK`Bo}F$lae+Ii&N?Q9*Jb|%8TNKRe}}V7fC6DcU{Kx z?Wx=#&?*GvLcFld%xGuMaPH`WHa3I{O+Xd7x5H-{k?B#XUEnLFO13TcU3%K0;epm(5q z>9lqA&;IUDPM&{sYGYO(?jD#_z~*YZ#dRSc%k zLGF|~NZ;Ze8O@9Via*jNX~HLrmLTX}VqQJs_y1J~g4n7NNa<|b`kX<3)OQ*)1v8zE zQbaGHxe#N07mEnwz+m@C+dpfW*>#ONC|JY& zwSs&JYm>piHYNuJ0kd+4aR|21ni{y4TE}86XNFUzZK87eObg27>R_S~E$mJsnJyq% zvZ9_}dUVmZo@}1qSNIQq@{RXyNS1ElV?=mK$JTLMs0W-jv8g9@%+3^w^C`e%2%u`| zA|6zyCw4D7@sJwBx?vUz1=i*KHq1-i5W1P#PLS>*oN=TBRvE+Qwd93Bz;>$`^njOd zbE+CjjDj~+-CwaK=D)ppEWAV+x0Jo6m8{1s$JK3jN9-$>i$Tt|*hv*S69^8LJBq_c z-BzB*q<9NMT#)dflstM;ub7(X*D`THFQj~tqqNfq1ThBXgb;QLXJ#)Mcb0`^+YP}6 ztW=QlG{xLgM*_j4$2DFe2RE$yBBM4OC;5VvG3*heQSn(Q_P0e9w)n7{47ua-zj##i+Des|<@amrH!6T-XzNe8+V32F`{&O8&g3t?^42-U=a9v} zc&w-VLYhoy<-Pvd^=F-nkN^Ddzr0bA$>x~C5ethHd;-8;C^S^%J z7d};My;IS*4qPa9p8xR7Miz(qZ+LaO_((_LKu6)B-!7QH4OINz!jH>>8*kM78>X!X z&RN?J%yidx_P^Yfdt~UwDd&diz8h-oulT8BI}0;AiZ6PF)46x;hynnm2kQLX)Bnic z{+CVrb5m{ax_+fMiM!U6ArS&-7t47TAL zG1Gg7=qHEzw{%XuBhAm=tS5oog{+XjrSlMB9H%~*p8DYK8Ew+rJ0-3gCjA|qhXz~e z_6AD)jNRBP4!!3c>4!c92i-T@G(MP~G3=f8a9O-q&QCe-kSO;OC;s*=GX;BQr+qrt z7;5mno)68I^LzNIPxd$V_BVdiSh%T9O^fg7Lv9-F*gGk%?#-R)+F3u;-B#K+>pgIQ zDp{ivE&kP=&Wp6dNh7hQ@^eau{mAZ)X1?Lc1l=El%KIE_Q zzd3lUJbA1xo^MP(f2OPVFS~NXAM~5EAjaQ*6+bgOdtTky^J01O#kICClltKg`FH!T zSff|{cyhL}7cBYSzr3mU%LlG8@BGkUtGcf|wzqZTGd({&`TXSH{K1>u|M-pn`?7Uf zT}>lX%-T1gRiu`3K(w!=?KA0C+?rX#OG`j@8%Ldqv|E@BQfV)*mSlK?yVI`4J}@(% zLS&mNlyd!;a3fdUV`1rQU2l(ytlNO2F4&$cQ~bBU*6Rk^VXhGnIU&3OMY#1)VKKnJ z@nVYEC@khGHj)h~`yzadO{|f(f+NE5SmnpQn z&*v#&-dN79cC}hv`t~OE=8Trt4tcB8LN4qlFXs&hVp>f*$PiOmH4;rnlyYa%&dJE< zncEG~6wQ(>bJs=^rfpVUm+uv)b0;GICP%I;qhsJ9L=yf!{zHHCz;9i)_05e{qxCtB z$?~m}i?iXz47YJPz3~^OvVO)cxwn!wPB#9u7!l{7yZrMTlA+0CBZthztRxfrXGaEZ zNa#ymfOG?Pk$g_;*TDD+SR=%SkT=CnE`PI5! zcg2z;1%E+&tfiuHFqj{s|*rwDMWvfnX%}b0d`lGlt($STDeAC zVQrBj1%+@`@>vC=jp-@#I7ERy$&vW$2i3ZxiDWD4`?MnWeH`_^tEKo_G3Wp zm2K15yl8=jzrCV+sH7Mb^cCFs1b|WOtx!Gbv+O8iiHh&<6Ug+bYk(AzinZq`Ra?oa zyAaS%g_!0tYE;p37U8^{?RH#|o(|o?lp(H2#F<#%D=J0}8>6qL;%-ga&%wmQ% zU-oH6wsyO^I93m%WHq+v24pO2AyviYrMn?Ap9~e^1ZqNw@Z#6vd27iQ_X+4>%8{Yb z*u@zwOwxXIyy(Hh24~LsB28VzKh|sn!gJLxJFk7{kAGNt+Yi6_|6L4+JpMNh@h{$S zCAGF_@2wl_Nv%tsZpp!K-Me@~S6)2*U;MRxo_6aG|HBW|tADm3i7Or$XrX~+umvU* zdbmD7`%uV2O6_kr%zg4zrc$zC6nN0)Eox>I7#NJEF}gB4S4d|RVO+t_A_cma%3k<+mpo?P47Nc1BZEKfx#IUf z`pcwoVD-_GLRB1*qXrSG&v@ zS6+4tpys+Zv_@9<^EeS3a>Ca_6T&DyhVQkH7CVa z*qCmdW!E}RG0=q~CYTu+hDjYW!Vo)wll_*jD&c@-)WwAFYTJ5%7cdK zo<}HkML9jF;v=&ZyE@)ynYTIAvZ9&MP2^lK5$PZ50po1V8@hE z5g8qCwe#=%{y#mn`H9c3-v!%J9nWl%@1%}oRQN^}+l%Cj075NjlEk}Zt#se=-NaE( z8orahUbU2Js}Td2(vG`my=m7D8H_ZR&g1No*cQv7SkX}76RpSCw&KfAFuXFlYeCOa z`KLt?cH$u|<7spmql`{Sd6x&^3!Mn9uq-D+Pf1?48_O|ZjueU8s-&D4*x8W3g3rRt zA>-DgunFPOuCi!K94WDfV_ZercI2x|KC=}ki9@Ul2{%Dgkxo0(L~dXQ?SNZUWeP3K z;mFElglY(eF7KUx@YBCH_O|ywB}*-jI8#e3Bb6Gk8*>%x&nQr{aZBKk)lWv0up$dW zDJyzjB70X|wYman=2WK}cek=p3D(A^(s|8a`OW)}rjnC}vWSTezS!$44M&NCl#tci zu3+cP(DSBr!~-}wWV077I1sD0oo4Lvk;Qxlyh)ZD0CEIdXeDK)i$xLG+sfN8jd&H` ztJ@CVZU`=>-`tf>GJqBxdtvZIRMBgcxTaJtk0W@4V%F1EF12LPj5+!$iJ9Xg*;ch=$T7b=at+&)De_ocmNd`dW%rct7Dbd+2VZW)UUC_i6p#{eNH3|0cbO z+~tvhu;g?E*<@6Ub6bKqb08<`5ER{+p`I*sl13jC<1ix#$FXuP1;iIHdBV1YYgTCh zIglCi z6Ldykksy(30~*J!V9GLM6-d@ed|&XI@#s08uOyb`pPH? zx{i5OEmm~=eDb=oEsd4ilFM9RxP)vx)Z;FxZ-$@X8* zVd0(ESrT8EpZdwCRfBjHcZt#Zf9jq}j?up9rijI3+XM zlw$UDB%)ZcaIiJb!1WiAr~H+(6GyEs^NgK1H8I6=YEG@f4;SObCl|ws9#{3zSw{1T zFTL>hL$94bd}ph76s0c)1u_F#3EbM&9HVPTm#l;<FUG3HHuk?9*zFxjvBij~naS})v3vFI;JeK{=yo}9(>j%$yY##MkLsZ}=H{H+wL zIIAKP=zJw@iDlna!NwNIUl|(4*mMH`kxc*10g-pY?Xe;RlXgb%w@;`a;VZZ6eX5ll#CV$fsV>-b_-#sEBpnGg zR1*YSIOQ)sD#jJ2of^tz_^t;&CeA5-W_ku$8CUaIffF!$YD%@DW>nrwIsA&jXwwm8Ih6-uolq1RMnEEF z@jn%}gU2kh=O(%H!HUWpR!KnlLq;UM+!1;i@hL4W-JTuV96=zDaFTxEyQR2GW{trC$&Lzw(` zV#SPDtu6D36dZK zxN0mr!l8*;w-t&%q{}qARvwu|6%i;=(Z62!+3kPvjeQ#`!(!`pMy<8g<1LW368f;I zOsr=%`;zK#M(<+Yrquw4PPsud?jE#bQm>NQJ|@VIg+fR^NXNzx~RE^Qk`#EnAviePICdOYCy z=mrux46Q1eHQ7*nOQ7A{Cke#^XR03ch_dxbMph<~QQ@BzTSal5lKWV<8Pf0nsJork zq6d{#K*J%W&{8MpI=V;_wMJDcdaVK-iu1+a{m!LdI&)DAUc846P~8|wK*`&I9<9 zR4e2piOu9)PU1>X_g$lm38c#OP1%O@jOJ}?6U^6?Mzd|6_RV<-ga>6XNC)w*kTfpq zBS)ZAR((%oHk)qQXc^Z`NxzCU#UGE?nFG;LF85q5LzjAra-Z#8G#oN>S2krd2neqt z#R?G{&?hMwY!ph&=q*)YqAI_I!iBDEQ;^nFRU>CTFR=-J@2~&q-RI7~^HcJMJYqT< zKhFg6Vp$4BX=QO7D1IX_0wn5+F~vTgT6}Lp#Cfg5uGyeBB=DqxXLKjbjB|Nfxgjh& z_<^{LZCPm(yW5b^JmP?O#>vnvrUY{Uj$}@TNlC9Nd7)R>A&^OUs7gui9)P510?RKW zF;yUX0~>=dbqrBV$i8_QZWuIW%0}49s3idtb8tAQ8g@C&hzAT--Iap7PDZ#~dmb)b z>q3Cyj--I=W0@b(N1&_m!DPZ~AWXZdOCo!fC1J189H-$Y7(hpzMy3`Ux~Y6d4NbGv z#ZYF&Ot{l)Vkw=|gS0S~uSp+dk&u4LtX1`D z6uJp^!7-uKl=I__zZv^iSKn~Sdb1Pu4R|xYE4M=6VQwXi9Q(-|(b3f~~h&qPg2sI<+t(`A^mRjFx$DpAo6P-7xVz+16212BfSDG2^{u*@}ltLNd5?$SnJ= z7O;k{FHj;;ReHr30|ldOtn6xIPNKW>8X^FYwh&Q2#IH{b5UBWgW#5DR@G3FTjm6Tf9a?+DRSEMN=8jlJg28QssnjS`Qa==OVZ|R)6O`X*s zD?Q9y#%4LsBHAR4WK7qr7<3TL@$v!6Vi2l4v(9UbrTv?~Qrc+y zZBYhxLmUg*U!{7~K4!#9=tQg}Qt#s0=9_Yk%+Q5Qgc1iI5{Pj`h4l=8+UrKD^eSiW zs|aAHRX~a6> zzHTvMw2(mWC}u^=glIQ#0osgV1I_bAW^hEDz{PaVe-c;tg6uF_OB&E;NmPVVg7`pi zjbg4iTJj4bTp~d5%Bk`zlGK=yQjm6kb%?rD`V z$z0qbkaT2Y%4?N^)=KIzmrXgXFWPZ6!&Wk$Vm8-Z)zx599Ka3AuSI~$Se%5Z>UvJR zXgS>SAtV@)e3a_=TuducmsV1;&Ez2`8nOP8ob5c`#OZ(nQH)m8@lF`E9+kiNwEETs zC-M5F*m%N`Pbl}LThBnn6MO`1N+x1AGLp4Kl_xWn&M%%3Nk3GX9JQ#r8vgx@_nhzk zvyIG|)?^#Il4?0Bc*w$eNrP8ZxyGy~T9OU@MPkhFfpS>U2G{GVDANcbfJ4fc$>bLg z$xldZ{SG`@w{>`~#bfjcgf0`x46oLE72hMV#avq$+SE$E>=x%qV;7q2yIpC!i5CRV z$pKG7auX8{nk>64d~f~pLv)+WN4_jtG~s$S!pwT^QfM+0MsFZ1nW0rGl4mQ{L9IrH ztwVnJum7(v-F)fq{di+-MUFbk&l~9#+fAgUiX+pKKvl__&`u+1r@zS!p~!i0rBC69 z@(IOEyE1+hgMYVdUWTT5P|sXi*&H)xMoC{P;D{EwfPUZ_NV-IcQeD_&289=cY6wA9 zQ=uH~EdeJ`T!XsE?_xFd7#7JBw1I+^0am*ma{{k0mrOto%oRRR53(tCrTJ5oa%OD8 zBvQN5@+CRyD(1DcoSjLG^O{_0BOiF8ym`RLOvWTiV&unA9HWYCkl~8Cvm#VU!V?k- zAELv499m`ho>il%+;UYpZ}#nd^8EY$Nan?nnf5Yjb;N<MHe!nfdX4-1@}{EYy|*LHal1iymC7YDf5Np~zQRW`l$M4|^Vq@7N-U{&rDXO2ca2@j z!Vtl1HW4bukVBRVqlX#yhm?wg|}?IvzBq44kK^Xi`O_K;z_gQWc?V zYgkjHOshsRasquKJBC^YQf`rwQ2LZ5XHXipf~<;|X!!}pf+I0E${C18hfNCJ3zdlH zxTft8|EpLzkQY&)iHsg#&6%iXrRejCX?AJ5HhP9Y?{cb zE4Ji?c)mbjo1`kllaj)c2^m%C61vv(0;=g+WTPZcS}~T!koig|+nmr7F1x-p--C)W zVzUcZ=GjbG#>~z!jgiTd1#2C$v518!$2fCA&Qa+tbQ(QVpRY?-KgdMG;A}b?>fUE> zxoeC5t3PeE5;>X?>KTD7(X=Xtr8<#}H6?o`qEIp{QV$}r>m}%4W+qlcE@8^T9_&ak zZ|DtKTN-FHiJpKg$%#IZn??jGP2zD_goWzQ(9x@u5p4y-0D>$VoRz9YX)&eBrem12 z(+`S|dRu{T)J%&zRy432d^$;z;-U{h^KqBOM4F0*beSVs21n0#squhUq(PI!}&CcayNV!_S1Ib{S{Y$=DW^%|t@$P*3M6u=A4BD#hGa?V5aA31V3eNWfwEtBy>HhY)*hPo^f&0+}6U7qnVLnxhn95unDE z%n3?&h31+=>n}#@)(svBGDO5-97Re@{ba6gf?x8;KxTnFfh5t61pG0PeB;j^{Q6&B zx^>5fg`KBT^sB*??)9+r4eiL;pN^wrss9FTFOdtr$tX22SK36Wtn)~|W&uZzl_<*8 z3|5rn=jdH(PFRdyd6K zi>q2mIknI{On*RXBxp>^9!eU8Ex2-OrlVV8w;h4EAm8U$?+uW^L_)sISd^cxaQC3J z5z6Kkk}er7m9*w2hD4-er{OxV{PX|xyYK(3e%I87bJgmMg;z-Gs**C{9q!qz^xCtQ zL#&9l7kqX%F~`JSk6LxjW^klOJE$e=wwK1$&Ngz>tV>TDkM>oQr_7afb79b%P7mYL z&|}}C9c+IzZS_p1Pqd@j-#?_|owqWX*?ncze32;dYE-hl%NItC>WTm&wmk}(4*255 z)Q}c-M@F!_gUw9`&3<#p{C}!iFt$9Y+@@N?IFqHXHzSNac_Zr3vyt9w*G1}UFzye` zHf{Qn+42G6jNl+MJcYJ*U)3{Z)QS5=w5y#-K$SaVnI!rhZAcd@-gX?DrX~5CXUBbJ zP$tHDDTPLH>VZ9GTJWl`3+NqH>Vl+Y@;hKu)v=-E1TIJvFYQO%n$R} zX4HPunV3FcjL&My3ygIz=%7NSBz(PVvoin7HFMarb{X@QYAirXDv;gGUapl6e+yIn zi2*bgQT8jiap0EWA85;)jIl5(74tQtD=}0wlp*^>Ravgq^lU`&>{HQXL2U=I%DTo8cko{7`vP)30o6C_{t)*+em-x&i+D|^Q z&FK`&s?@(oa*VQ=eo6srPpOPlAWt{y>a97FFts_{8KrgIZmgts-612C|A8B zspQnh+N}1bSS(IN88n*Y01IKI)C;2-d##!RXYw}Jmy+1FvE8vtB%=-b)7AKc~{=jKOKyV`RJwg@2;77mHI z@=~TS2lB&wvozwEUo+XdbP{x-z}2TyL>(L7q72(BIq-DHQ$ZP;@ElP4^BuN6RE!*J zY9K1iP7PRv+CoQAh)=R^n|BtSSjkK>euWTbAe7#6Ru#SMOr!b^@E}%S+H?a|WSUcKkdF-n^lvXZ zZn>?u2S?eedDJ*Q=p}kREdAl^nHbjH3?^bLXZq<=w^%v7wp!DlT*l8Yo@04o)acUg zI{v{OiC;gl-uKFHer)UbGmotu|MrnLO4&c}yt?si;|+huT?-eoV61H&f8f{~+0ql7 z+@Jk!{X3mM^V{DO|J(c%ho8EA`;ND_{_bdR{T!B|CI5wJTUyN zljFefpW#;OsXKnseq1J9I6i(?{oJ$P?35?gxucwXj+0l99_jqj%umcmhOd3>!eh7J zntH>(_P<=HkIIwl|C<4Nx)}{;KXoBH`hHTfpZZDmj;-?KKaJki_=!OopLv2(Z%w`F z?~oOF-KcLJfBG00@K2@Aaq{|(nI{fEG`>B1m#oNi``F(;Oa&eqeQw9=hhp$0i?%4M`FF51B9=-Q-Po?Ea{k_+L!C!i= z{moGc#y|6u_UOIWaw5yR_2FkeD#71Vum0&XAl8rGdboA+1W5enZX@N`9q)f>{RAZb zH$mbD4qg`ew!fWgoyq2(d*fLN#ZR->Zhh>hozKw`b8ndWC!QlB!o%|9;in`P|E+b< z`STkX_Ok6In*H%7UV2L6^Akg$^JnzJoJ^9vaNDv>l8rz2=J@AGD#@gW-&`2^()!sS zF8t(kx05jb7@-sBiHG03eHo~Js_^ieqmO@Sx>XtA_kVBt0=0?cnIj?jIXlK#o!AJR zeeVL0{N5X-=YG)Yjp|e5-#d0;d+Br0Q^BttyZVt&eEO;2w+J;rh=kJ7_dIrW{m7@U z|2Am$sr(ZXj{mXOMmTw59en?>AKdYihw}jKk36;eCx5zrLU@GZt?&Y%@kbJkzg@<8 zIL<>RWo)fY1WpsoEc_Ja}Yww@?!v#rC(Hplv@esw7XQT4$7?pTq^q4%mHj^BFhHDV>0zdHSs@#|!W1PRUm@N2hk#2B!)zVQ8-3lEOo+Wwlq z^s$Z~I?vtyCMU)Zm!BJbb^QAj`i|?e!^i%_xNG^@(KF+JfAVWvpSb+4=cRzh@eN}G zul~Ds>Xe!H66udS-;{Xuzh-{d2mp7y-?2}GBHw=4zCH^3jqMJI{Qf}0kcj;G)YAbd zLqPIJ+dlzB!pQWl==ZI|(XF=ew~;^Kr@|H{zfx^K6E~yx+5ge=vRB->WCXqGs<&;f zaQ%a&(dw^l1}0b{)xR8R>6EiIh54`TGmdGjBl0Km+u3=?w{J54MMs8;JZ{!u(6d7s5;aQ@E>>paZiKr#^kLiVG5^ ze!Y(RRn$>p@;6x_p4}I(Nuc_<>g0oqovD(nqF0NyceJWl+Lu}muQaY;4=a@ftbW?w z5_wmo&H*;jc8+?!%eJosvA)(^>KHniuHI5e-zHk9{GTodTT|im#qa|cA|c}s+-$WS zb*`O`dTQmsxjpg8Ej{mAy0-RhyVe(G%TaOY*TUtF+R4=0<6$dHQ_p@k1e(8`o(sy& z@Y-g4U8~C98BK?i&EQ(qG7bg#!*QwqnFoV!cYZRY&M(O@1hY@q^q*t%Up^3*{gqJc z4xQ_(fStDWIo-?NKs->LtSy56fDAowgdhanBld##sNJ5pLLC;?)y}vrt1Geje?)D2 zPNq#NE8+QT&4IjE^$5Gbe$p?5uRZ(uFMUA$dP6FV9B4Y5Dk(j4S*M0Er#hktB*pau z0~~?xFvV_M+g=heL~w;FV1^T_8w)AR0nkyc!YMo5hFEn{4(yQ3eL3#a^09c8@ zRYTW{ijk|10WyI|>ZXX{WU>7?;W-tYBEuBonH))OJ6b13{fcqYLm|UN34lN({i)PI zYNck3HdRBt)(|$4>lW-7iI8RU1wFYOqKsmkcU5d2vh*gZc4E=zjjF3xC;W`w(!dt& zipp1$`)>T%`~LX+n;+R|F=s3>rs7znDp!eAr_ppq9>>Wfsjrx`z_+oqYHT97VAN|? zQgs82a9VC#6&pFCTu!qGtn{AhSeVXgzHuCUIc@u{Hl86ILBF-zh}mu2oxZy|0zPA( znNg8OjQM>JdL~K01Eh7N7^Pd?9&bNrz7VDk?yMfPYXw%}*jUsIy@UF2ICcs@Cia8_ zjeR0q2`f3A%N!7ZFjWR?KK_%#emorkxR0<^_6JBhb2&1mYhM z4<2$`8r7`{DLO(T|0ff3bsyROq*XD4cFhVR`lPuqo?ZZ&imb7F#Y9-&%mR&qPr3z+ zy!@GsZIm(dq!JwpqF5}L;iXlVHQ2S17NGCc%v0gYE$*dKs|UqcUWGaD@~>%u(Q6yR zs2b!1b)0aWm1x4a*u{eVcdBv}bueJ(iIWEWr|MoRk>4e*LcZuMtaq~GT`FePC~wDH zn+NR^J?`b$J-kgdE2ka`t*SUkM=Lq?)JijZ;agw-@f+vgcQJ%29qqTt0eoppNB0vop?_-Z_Gw~Bx4GAlw9JWW~wbTEYz|YB#dX2fJ|DNPTLl zv8+2-2IsXMUZ>Z|JZByn&z3{k-7zK)Ppe`s?p_P&@O>ZM7|iFYhTbn>vW5ykDwLfa z=v0rJFHCy}?NhcDNJud|+w{F$X{`z&Y<6NN#&hqW-W#skn;FCm;r`IP2h0nJq_Sq~ z;m0M^Pb9&)7}k0(lwdCh>%$sQ$EKb2%rhuR#A7U0!SV^>z#9T}$Hv#ZHLz**O}W;< zj`l~u$*JJ|F5}U77P!2DmEe(6gR_Zd@}H0E18MsuR!k}dn-vR@8NGsD&lT*h&0Xfn zEPN>JIOX@p06RF|G?*E8@;yP%+l^4bG$sgFV1_xMb1`ZQjNs!P-nE`N9b&?2gwavv z=8kAG^`yO8@<{<~Tn_O>RjxVKiVg&EP(L_joLsRdd?RODMw~uVGtboQ6V8e=VXRnm zf7!@hSUUN`cfReKa~ne)c+c4g6JiD}yw3&3O{u7{5k$bWrb1@#e*6vGV$Ei3kHnP% ztG1cW(68SS**MTfRi$m&HhK*uTh6n;!A@0O!?K%c56mS;r6=1|x3g}$iNIR0!D?VT zn!d#UDxByv9yniS33TbUNM~6pV5dmZmmXky;CfY$g%Y8dp?moTY7;&U0aK+L&}Vpv zN1AX0F2PQYd{-<76)j{D;+iyCv1=R)<78kbCQ7cax`xh@_Y~u7vx!m6ZThjYZ4NQO zT=ZR&L7z;Fu&5Y#(dJ$0o?Jp{ja}Ub>TM824-MNd>sSn1Eu$$bmKUs8oWvqvi)?`L zU%;k;d?3xWe8<~kD9p%Mb6wRjK={`nR7UP!16f*VRT}4n z0}sv-l1DWT{p0X|J%8P;7w2N3f}xe3@G?D-@aQ17!_zZOGdf|Ewo_Zbb?uo>k5y#i ziKkLQ>=;9-nyB9~>wy>37H$sOPB})e39{C48|LVzf~?n3t{Ul#9c`N0NVp2=XwgP$ zxE-`%e4x(KPrWRmEof78B*MnoRJei+;J7^IOT&cYp15nR)1wS`YWVgaPyWEMHt&7Q*qvy@)d>dl6l9%%So^VbH$Hc zwV!cE%njdFDVLcT5wwF-v3*#syz8*nGNXwAw>Y1b4b0W$J1!YkbOkdwgZj+`a=ZO-)|WTLkdGr@y)XqiuT&N4NGpTRYqL#TUN0T$~;F z@Rqf~2R?Q7D`oG=AYZ@7x~_CJsPzBPZ+*;f_xH7}J-Yo0~+s{=;!mDfcnW5K3YT$M5&i%^S<^2c7*wlT`huUioq+f4N-*RH= zy0%-xeY5w+|9N(5ZO^xs&9BUCiF$X>y&g@M&ViA2+zQ}uacIx>(7o2d<^V8QH-a9&fuJ~ln)sFpX_LARBfPksyz}XYy z#a_FkKKZ*3ZY@4(U)}Qub7z9lwwn>Oc8>3U=g`2*gI^}xLA15l^Wo+*FA#fRHudc- zwUON&ckUdd^m`|_L|Y4=@!o#o*LyxTcuo4<_Pe8@`)gCrd%aWnI^ckXL*7m2x<*5J z>;36d=2ya>9Sk}+KFc*%G@@~(gW^f#xc`i5RR5cNIpj165mlV7|2%c!2%mT`x_^*P4gCAC2EMx4+@-`(o_@u>7kh_N2i8yk_5( z;m$j=4^0-Y$=@@(TgFHL<$wOA{YRqgA3Qj<_QJQO_d74!`--(KUx=Qx5ADgnwEsku z`}~7b-)ep|{E9feudh~)53S8KriFKXbaR1b`gjojyFzJSA)1=KzBzN|lU4r*#_ng^ zeq-do$dRvDr;nr;_NCv5quG0EGo#<#YJ7M9YpLkY`_r%d@xHE?hmWLZKF~)Pg#5{` z&WxVA#u#`tb?(Uh>9bLxEB|b|e$RoAU++ECdGf1!t&a^^1OH$|yvLy~Lu(yxiquX2@QC+2@4wZ!{6F8cF(90_x;=Kv z^aAe_dWZg5k#eNOQ8hf=dSiOxdIOg>-Q;q|o--k4HK)>_!!2-&XRHe~vp@*7UmnFyt3 z047Md!@F^AF#Uq#9W0phrglwg-t51!p#HddwwgONJr>#_ zLIOeqFk{Uy+nkI`C>xO-=K{|>D+LU5dKMs4s|b#13Rg^XNT!7;q)jBFK_NY7u+wT)dpHlYht+Pw}!y>v#{P}x+__+S{TP|6r zh)SW|X_Evo5l-B)%8pMfB^Ag4=%GpPN9;mBEK%B0fvX3z(e`vt>cN!P2SLb|Td`-G z#o0CCtvR=)=Z)a9lVfWq3x|hIu*j2*PV?Y+TXlPNtXyqV@&1jiSW2PynlCSDgK6e` z2Njdx4cmM6&w8K~r{@GZ$2BR|@gRnAh@pv2X`h;olW`%IJufxL)vA52x-%MLgDm~l zq6CPlt(FS~)Q}rDgH=fjmZSxCM9n4Pid>Tz!pbDNSzBm+*&aX?8ZsIv9jF~O>eA9I zSA9*97JrrJ*cy{DW8j=L6P(XE2EH;2n;5rA=6`>9UG0Zj3oyNV^^AsDuPi^XYnOgkhq0{ z?Z%8NCKjfalqu~!J{3aBb}a}_&G>SiTv=v~9x>)u@BZEof9Xr7H@pcJZAysY>$rZ0 z)&q>1dt-zzzY-e0Y;qe{i#{`55s^ACMe`BG??*cju9oz)^-9EA^!c4k#HJgI*X3i?fyl zUxY@v^{O^l7;_0ntu3AmyWwjrmx zRwvF{vaz$47G&$b@DVLFx*eN}KO5_cGG5VwIkmz%T17|T$D^Qj8GG)zU^fW`D<$x9 zSkSBJs$g|!3t7$j;jORz^iS{mFPD)G$09KV0^?&TJ^j&J7QOU)_oW^Jr*)}Ne`x83 zh=js!WA{h<_Zq3e7P7vxbFO-%H|&pYNPpCfI|IM<|l(s%cuqTjZ*)Ft)t;Zp;a z*+2s*Shm$$Du2oxn&5XG@KxX#}T13Ze;OIeIKcP~%wDf?D$(0wj%{uMDB5BY5< zZy?Uk+vj}$OvzXidavL9O{*ATsPT73Z@1f~N4+hDRU`PT!njFdw7>eZK%la|r`8H9 zfRV2Ig8l9Z=Q`)mP}^6SB3IAZrsneX&gf&=DNlk?WIJwVyMg3)DWI#|ip zdgmW54?esm_V?7k{4M6zt`FPgacdA9p!R7$YP@`=6BWN_U}?%4(wyvmft$)y$-K_5 zbbQy}4Af`)v|;65lB*d;9x=6KJrlxsA5<$R36oI{Kk7}2(zDJCoj@!@w)?MqwrvSjohzEPhTfAj8+fgsm(X>um0`QjI#zHYI zk@+tjBY;uZXIA^8?s^|`!J3nL5U+y~r{5|b?W?4wg|zyOx6d2psz;~Ks3k4m-nfHl z;$_F|?}UCz+c6;>3iw%1yn88@)K*<_u>CFUH`bi}(VAnvZ>ep1X{2flJKlXp-LdQ) zWoJ8vpwh_jbpN@kse@NDEdZB4(=bn#yl|}6p|{G*+AHw*NTl|Fnw6Ag69K^FM~Yp=YJf5DoNr9>Os|hAiCxAd zK~WQ<$Y;H<<#xk#6n$wT#Vm98quo+DH z34g+{L{37^`m>Dy8?u7bVFa@tQxewz^Q%LXsi33mcSP6-rB&!N%uQB3o{c(T)OA0? zPNaVgg6XZ!Hs=->EXr8JC>xse$6`zrg;Tk;&YQ&h{^TS7{cShTT%;AioC^^vBA?bj zt-p6Nbw>xZ!?=htYJYwAY<;&eY#jDekV;{$+KvysaLlO2#WpQ8VhyCC5{Z(N)K!$Cpxrot7O*A^uD_0t72$^zu?6VuSZV%?Cg< zz9x0Z|NJ>;|7=-O%-D2wwOTM^%jx!vyB+!k>)|U^^W?P0(vsaG8RYKLz*@ts?yMqm zF*5-g>@a+o*0XDn%{F5+B;i;=cFhNS z_{;{~j8V-H(t&WaUK^ew1NBIu9tkhk66fl^DHjQXvMr^-E--PKgG>fFM002mx~Xk@ z@E#S)L3v;WA((6W2SCN`87w@}g{w!uuVXbFO^Jt_{qDxtCH)~lTnT3DE|w@b8^L5^_?}}u{s+IR%@;anvR>uslD}8<0kPWK*>-2@WKy% z`@WySB;}FZKl^kucP0X-{>pG+Gpm``KYyi7#DaaK&x`xh<96Hf^#5S(ZQ$%Et^?oh zRwK6*IeTyGYPgJMQQxLDZViLJB4e%N#J5{La%(*3%Of%&Y&4?`-iaQIft5dYpEvIA z=^3tuK}bY6WJ8ua^2iwkSm4D;Ht~i#GETHC3z*>ioXze-A|%WDCGkjx1n@e3|5JTO z5=q{BzxRGyzxz>LU0>(asZ*y;ovP{_Nx%8>=B+{hCmQHEHl_V%s@zThC-^WgE@tEL z)`=niwqx_po!CtHf$CV#`SJ3tOyj@%GmVM8_7Uy~xMS-C7Z=P7@Fu8yb$s@xOGEC4 ztzQpb%gQKKRu6o5raTd$)_5)}4|Q+Y`jOz^wxPKXajAeiy+;oI_a0xF-}e3N8>{03 z9mNZOTHR3~7XtMCi|pT}IVbqrzm?8<>#N_aY#D#<%l3`MIaQDWcsP9c)bO*O?x#1iAC%W%RN7p`;=I$rrKFpCm zS?!SUm5-yN82dmK4!3n;F#4%9>=~J-ZsS~Gz>80V2d*&SKAQ$r=o;KSHQP<_NY`)A zOYobh@PnR_Z*Yl0sxC1g$LCH|($Njox6_fH+9w9Ktd0*(at*=7>>FpQ6GQQ*s&CJa zxIKh$GsE_3{>?w!{CFJRGd^+X9>mzPVW9~8d$XX&C;6>$c$U39aUre9NN4~*L z2CL)#1LG5eTdtY&`d8k{Ed!u!JfO|{KRKTEy;gm^o7MLlsF_@3uti;DuzSl5=|Oi? zE;2Y0_^77(KAX;Xog=|FU$*^O@5Z6{hIDeq+sccV%X7V*TxRfxc4Kz*#-X!o=jZ!R zZ05z8^o?pq^;Y{xaPTwLp|iEF$7vmKc0+oW_|dxG9-qZ*@Yc;6s`4Uz$v!(@rC)xZ z>m9yqKePXD{`>!2cz#1csq9wUm}*r=pE5hKsh;te7+|rSPI)u3)5Nw+d7_8*5Gv1J?hcsEkd=AQm8FPSDFLWj z;cQKI(IQ%7%T_2_wd>-rX3TQHy;8GM5d_iQtgfJBRaY%!QN<0olg{j4RI?JmR3TJC zwZ>?-HbrtxjUE$m-s6PhjO(}9l%e#jeR@_J4eL7V%nW&Tom!Qitu;f9X(BnJ>6cTs zi6H9W>c$+A*Jk0)C^W6**u`dY=S@MXct8DTHU=cGEe=aL%7&TRP0dYyfJbhWNaeN4J$WL$_Ff)~7s0A{8hnT)-%7^ zU!LxGc1(;w8JmXPwTw%zpNP_@a}KX>HvE;o+;<=X&7iHur5gc=%Mq1^0jZ`v4&8Wo z=K;CQ0b>wWxkf@6oI;sRu^@(C$vx|>o%b+3Jmb~A5|;TWfKzta%J|e{c=Zsa6PAal zGq&W#_=LKlm+_7M_K7(b6gjTtb#k?%^JAmcBikp@l=Ql9aAjr(!&Wmyrf$rK6Wk4U z(ECRJCXXTNR)b}+!m}Pk84BjZw4@y@z_|!)+&`;JKw-xHG(W*iMm8 zvhmDC6D2AOZiI5%%b%1Mc-Q6G4FL;nDOpmjJl`18lk7( zeHekp32HMZ#*uOmaC%TiMDuY)DI;W@nmKc>lclf-nHV!||D3&C2CC1y=NYWloch6k zern;5-Yw`!gL?Ye$5EOs=;?f|0~s$xT2%x!o~|A7j_qVVws``YLMpbWexmBzQ{{El zl!isCcUag#kAbGLI~^Na!a$jdCS_Fy=z(F6oT3=qH(B*2|Yg5+1|5V92dlV%FlxK^=a_>ryDHv0~lcVR5X;5p(rB?Qt{>u9PU@Sv4 z=4N~72n~Qxk|LvS1o<%}k;-V;cU}?8&hVFu+n2a$bvW$fR#hRPor+W-A;Z6oqg6#P z4(&x5M(!e!8#OVcu+--5(E;`WyMrT2(9F(-0sl7IcF9gtnX7I4&4ee@{w}V zPnKWrC`ij3otzK3vZ0`$iaTI*g^*8oM`MfEi)?(O7jJuQkdtuGV~(PJ?EOlJh|@6} zB~Y51c9;DR`=_?}V{Tzj(H)G~HT02ODL)gr{T{p~>InL3zLIhvp$fcArLaJ4|v=0(ioZ;+|{1e0fIC;eb`XdGQ8QZh#+K|XLJlxNK3kJ!hi%Bn4AJUe`V zLuw0Vw0B~}zq&fhH5oorrE)*Kh+7Qj}S@E$~SUMu-%!s7BhuH zB$l`Y1QwHbWq8r1of#z4vCLoRo8CICrXPQ$@&;^ZOFp*J%KBZQo(zR|4ITCyGJ}%K zR8payb4uZ@h^HbmpkCvW>XW-qkdVbbM87SyKN(^UzeqXEs!}Xy_^kKNg@!lmqUhP2 z`-sdF1^0o`$m9z;k*i}ir--c3&bhsn*J7a^)Zc7raMi?$3s_LBwvdi*A4EWYJQV&@ z*>}Xh%3u)_tbN?8@e< zz?rZ+Wd^UPN2_~5gt0=^*%XYsm_}4~?|}hT+p9_2D z>9H$LU1C0U%NJef2kcW@+zq2Y-1FGNpKNXuPw5FSNp+-xg+^Gu#dv(vM8DxINoE6< zyJsp`gd-$u;k=>;I1nb)(WyBfVS8B3sDH_p@qA5=h7Lu7b{lsI{SUtqSl*s(UaCJ^ z%a}4937eij%UD_WYp5rgTbIKS?t`+l=G5Rl<+JEtN2}W{&R5dBR#5LxQF0E)AzH)- zLalbYtg~;vFLWNLL;L#fSRbXDD;t@?jfajs$^g^ySV9R8 zz=~#A&<|4MlL!~tc!v)rt^LQp_-_6}c07 z;#lm4iLN=@P^5N79L})CceSKD=+m>^)eH?@o|s4cx<0p3PwOYbG)D@tqSgtUss>Y) zIDV98ZO3v{&ZoSKzw+SvV|T9pv3A3~=P!^a*&FpnXwskpGJ74tz8xu`S7Ne-A_eA`MQ(qC~kt08R`Id#BySW_{ z(>XZMq*2q^7%&|3FrTOF3pBJyvT|m|*rbKG6j!G?btltU#nFN+b@b+#_$x@!?Bj|v zC$2|}$JVhx zRL$ysfTtb#OS345c4NL{h=S;_Fg{mp2M?wmb))8%yi6f{$ z3z2Q{N+KVxa;~#YZ=k2AHZH3{s#+y$bC;#v^!w{yuD4HSs$Xhv zy5JSa|6g5R#7M5dJ4jP5k+L7z_15t>7ykH9+F_HM4$y zu@??-wEcK+=$`Xu_FTKZ`e%=RethOo`oh@Cx1W_azY=`@m**>gHedbk<>zj!KKGl| z6H)mEw99g5!{@ompfkPu+L=4X`AjIa^O*P9>a!oJuJ8TR^V#NWzk74_;I-Ha!pmkq z&AkWbf8YL#N&E3nrgw~pB3kT1iU0a%hwkvxJN)@OMxQ*ewD-`xa?#c6g#Qg!GjLzQ z%qN?lY!P%H-_g%jZ@=sQneKqg8Tyy@PmYd#s5;4}!0n$NIq>P3?(w+;^HWR5G7jG7 z^W~eb<aNx<>(k>A{XSK5}Ea zi&uxFW?W>^)qSXob~tbtq5Zp+E$Qd)o){VV8D3o5v-jGA9dn-?|9x(62v#?^rs2@1 z5eL8Go+tRv$2osL+*9V9{+m1QSUbOd?L2oZ{8erIwXLH}#y`M~h(UC+o7)@S;GTxp z0{2MTeLlWjE(jg${A6{m`|$bBoYr~wH$y2pP0E^f-*T)o2|AMgItt}h3Z z!AM+rez4kotAw4Oym4z+_n%g~cLei!<;z1=KI`N0^HVo&ec}A(7v@*a!~VB)-`dIN zug1pDA0d2Z^9$STf$Euw+eXfu9LY{T`b+kAKeY9Q|KWc8`E#3p^x7{j%>7cEIHy5a)X4$qhWBHPqO$n7>$V{`#tWqsHD zdg6`R&vn=Q9a~bbQa^vD{KnL#s*p2>U+<^{p?(`-bJcMIUO1p3I;X6r-8NrIH&&lp z`a;MFKMazc+lM-$aam&@IOm(0#F`z+M=rgy-SY>HI59D%8T|=NrFl}%qtZXBr4_+Jqu=0=26h53q+){Nx!yprcikrTcPA%>74s2Q3Pn4|TF>K7-$)Bj9GZ@)knRU}sw%@BRXwdtDirMUD;&cQm znRhE(X@!aU9X@-?Ur5~}0r$;5%Teyo3>PPDej#utb!t<|)9$T)zx$=J&6Bk=X}wRc zbXVWVD2Pj4zLC0J7U!zj-PN&d{KW0;pg34%tQ|R%_H6Q>gT%ZuGwutY`Q91xSKB;V z5d))C@n1rA*BO;yoL1tpIvWw5YFO(kR@!926Hmypb;C;y4|YvdP>cFk4THkSJpws% zfa}GHtGJ@1$rs0hf?vX)m4|;gu#98>5T{<`$r(8)=Q{0d#J25{3oiNaFha?w%dPho&17XO$hp&K3eummQ!JbLq5b zWfG0Gj2MxiTZS@0oNUwJgxV!&uTsgw5AyE>|PtiQWH z6rBZZdXGvRhOmO$P*OdL?u9;W*^@FI1Gd{oi$U{qKeV(ccS_03rU%f9#t} z-~RlK3!nZsMKI^`4JCTNsfEEd`htc5IwxN=$GqhsMA?ohb`&5%igxJuoecT18ghjpwU`ParB~^)?kd$DtFd&dXEO{NkDUk zVVq)hb(68av%dG566e$c^zdfwTXj9fg2b$w(C4@nY@GIlNp(k-b0CX{IpaBsbovZO zzKBHbSGtz=Af+#lsio-;Z?6Y4VG`+3@bffmCFLdt&8_R}nHmZ&gA$s(m_p3>t?BU{ zdSjgG)UBSX*-DGH_~`GQ|G2*9y7s`3EVHR_H7!}C%HZZZGh@4+HKTHgE}Hh$j(Ii* zcxt2U8FLs7OpKl&=FGAE4!D&cTMoQ|>_f-*E1_!%TD?~1f?m|LK4I_`vlZ1M4h}=vb8DqEX;D3mkXlCH zFEe)ev^3<*$tjZ-ek~HN#t|JxHsc3bd3`Ox%pdg8o6B2jr9fxb7Nl7>inL(qb@o$8 z{~2U@HKe9HF{j4roR*VdNM>zkCd3)?1{qT|xm+WIwxcw!FZE!UAi$Vr-wmv|wWC?7 zg|%rN%s0dFfMU>g%nbeXe_6Qx58BjxKW9*a<$=nXXvEiO2#4D?qt>$yY}cyKG=#%o zm81_>Y_AScY0^?L)BZ5s?3g`QbwOM-(3$zLtCCu@PFOJ#J~T;Y!Z`<6Ou>eoqBSTX z#M79Wsxq1rqoPi^X&zvIQxBUsHhPLiS4>yUdchAk$a6NO2Gq%onA-JPOx|FS`o>5L z&?PjQjgq;;Y$Pk(W=M`^kQ`Zw!S%MH0|z4Jzu;#%xb`Ha*%{i9tPsuGi!@ z$h1`B{Gx_&mQ^(lg@DR+&C#`644=Jz<>{qx{?dur09k^eKi9P3ibI!+qDaFEj!eN5 z{kg)%jdE!u7!F`*4x1@ctwXnky|K&9hYWLvy40%Llu@46ABM*SC=e5KD2Q7~Eu3Hu z(K_rv>U52u)7DqIL~#Jm@XBKCrhU~}l56!P-Z@(4us+Q}oWpjxn}xtQDW^Qub($Oq zjTm91RAa-W%Z*EQ(`$i<^a~$)_iM*rdR_<%m-trJ2;ggA=Eva%jAz{JFcDPIgz&a% zj`-?VK;sys%&gY@# zr-xQEmi^#34Zv7F?WTUsaBC$C*6(_T+olk)1#6{O3>Zm)hY($cA#YG4-^~ zN@F`$l5e9X-3a7bAwr%*+nw`-2?mO#ao`dbpxVm+7?D;^bVI<*Dkh^8vT>**t%3CN;4WObNo3vUg-?P-ffhgLeIA;0)B&gah=9; zL=a}NlRz(xTDqqka0!ylXsMN0aogf)H6k}u#u1ZA8CtwR&PlBYVIY)1r=Zrg(WV@| zM$L4`(wu5axpI5(FL+uDy*3?>+h6DhiBZ+y-cUeoIoyL0>=l|iO|{B!7fcL9T9Z|a zlj^MobcVc?!mKNaIkjXf$g~>6a6mAy{i=GPLlCl$lkn)mnGLV5U;gUiH6tY5HWp~f zvMF7o5d^y~@;G%38PObzHf2(1Z8xB zOt!8=Q-GXc3@sR?PNud;aA@nBw2UnENOri-msV(H($!folv)wd;dpG*4FD0FSssf9 zpEBqmTlr>E70I7|MU`M>bSH_(gS;UDL8*th${Ny|L|JK4|kE=j>3^fn6;Yfyw z?IzS0OI1WEi~a8`{K>d4Pppy>H6kq&A%`g< z`oQzJs9RzrRDxvDD;;%2C|8pD+!h89^IphGhet>;E(m|JJH zR*l2;S74mAq*5`vI-ZS#TTQJ4 zNhxB$n=~i%#-77nvoV}Hc(Sp48|rWvV<~g3=2!;LXuzS$d0ILfGZK`wo$;PYE9$FR z$D#dfxLVGl2_ug>i5IaYaa;%6jdN$MjDBv}P`9>nYa=_t60+s_K)vR*i?f{zR}TmV zaK6^89ra!ct&zk+Ku9nsr80B2T3JId)t&3s;agK^Plw4QBtvmVo9ovl~S zq>6c;lQUE^CYV|)548Jo?vk*!BYKkD>{}k~_P}(7U8MwcfjJya>}%(`tlu|i0O1ej zaJA`|8};)19BL?I3M1sEPmkOEotLJK0itx8P{Fu<*hHd*a$C%Gaz+hBX4}E#QCsV( zMmoesG5o?tnFzriU9IJ(0aKRYG(b)tUmkN@fqo>CDl`WY8HEu=;af?E4xU?$vVYX8 zm%qih+DPnqmZf+!ZVG{=KJpNqM}r0@jDoSF29Oy(t;B$5#>1V>Ox8A15AdFO`kk?^ zgNOo?g#+{_CU%tw!iU9yLP zP`{0}(ipXu&OXdpo@MwkBep;qImVYwuB3-Aluf^Pm3i1ePRR|QA>r7G8d=CBM|0T! zFR5EOD5%fmQ9hGKX<9OwenfDVX+VKrn%qx@R8aTynx+jU??=366G+Kg_|1uDesB5y zP?zj*iEGw5$w2s6s}^<|>tn*I9;ATtWI~m&cf#N-Pi6?Tc&crj0wKHz*iynBK+xg} zc!6tjpsd_xDGvJ;ZO;_7!6h{GOkcDoDrY>|viaXJ>1K{=G|F=;4K0W?r{YHQS+ewb z3+luKOv{J6vXbE})k+6IJw-=``iEmNSk|mFF72_DT^9&rTYZ=S)YEG+Hn_=%Pczno zKu#RyAnCeAu^jiwQIH4;af-nOMcCK4I{mt2&@xWV+vGh?{fP)YS8I`8FNb=gF0e?; zuz5ttEfPkl)f|C}!L2INhcX%E_k3p5b&OEaF<9CfToiLGtdLlUE) z7sx1&Z@~OOUQsKgY%PsbDouIY865j9ShS%f+1XmJ)w=?kV921d(l%@~q7WfZzLA`- z;WmYnkxhJ6G%U#HEL@s|sxn}t8fcD1H(F6fNT{r@xaj9AZ9cJp-H5qm4*0d2a^rKuqbrpSF>sbNQiR;${%emGM zXmMptjOKbRbPgJ05q))81)U4^J63-`5ci=VHCeN!?8ICT%Ik)=aL3@)Pb~c6XH*9K z00n$m#7sOm0mslXY3sVl^PB|Yinl2U1QR%=YLpn@ZkR2L)KGOL`4?oRiB4A3F(WC3 zgz`|=y=Fsj$f-97n@IEo42jRSOM5pc}dQ~Q0u%CCkN0@pq>`LAXDxZOenu} zES8(RWR!->>N3n~zxScP_P_hmZ?ty~5-PbYqKhsB%sACIl}{lEpHqOL!v5Y5SrnL&qNxECD8TTP zw397n!%NRG+w^uhpEhBt0Eml7e5HjJhXx9Os4l}_Bn7ZmP1vy%LnSEBT12#JTdHxK z-bj~k*F)lDiGKQz-}zO0;f-ID$HJ*(c%|YEc!H)_RgsBK-h{*9C9Z%{Fe4c*77Nrp zsJ@P_30fB{E}}A%B-GxN--lsZQdPQQ#`M!4E)Z*>2FIgu7A0VDpXM>+gV~v>ON?zAwDz^$Bs(jg4RntyGB;R zJBh@*zu(y<&r5Zc2XW1!VZ}@3hi$xHttt!Lih{`hlGm5moHV;g@|LDUITh zd=eDd3Ru8dbfGHQY(Mra(pitFLkN`Vj`jz){`!%HT@PMPLTyy1R<#Nj!;AmAD6jb` zT-5#t*WwbZzC^1uX6Y}*i%SvJW1AIA=l3O`fEuDn7V{&pqVihISf%5~xgrMSEHqa# z5yfOYxD2hf%@qE+Q5sZHWg8I1b}mO0n!D1~O>NiBug@&mf8&)V1r)Hz+LZ8EkaEE! zBsHm|A766KMxr;aAcz7eZiZAb1OOGnPbi&65yB-Dkd-50Y7l{_xRX>RQ<6~O`}@B_ zA3}rjCnMvfQN&kqWdH>N`4cByv#ew=^(fQR#O#qmT?wFqr3>TRKHB|{PG7fN#Sqpz z=OAVAPw!R##R~zv-5(a&O>L16a~+&g4TXzQh2U|F-x(;ogfYMk>j0TkEmhyT%tfq{ z&dMk2AVnguyhyTFG@A5^5;rfkdxy$iegqYgW#J0xKs|4_;#T8mu=oaeaEmno)AwMQ zE1dHRmzdgNQ+wv^cR%`TPyVaRLu%26i=AKb{>y+~P7a_az^GIR=d|nO75+pX8(MuJ(zxcyn+pzG3SJcCMf9MtkZbZar z6z`}^(ZxVi;nMd1;-6w?yYqr8ECx#If=vLda=!dJs2c@|y@hp>1gQeVqa2t<4%J%r zBC6Zr3JGLYbc-U8$DsXM4SkBP+X1Tf2t&j{I?5#!n2tn?)cn7l`QGfZPu*RBE0g9v z<9H&HU8}Y+=OU6RBikKncV?z`ecsH0JuE@bte-JB>_$$`hbhe<>$T=}%Og>*(_a!j zbynQ_kYn=Ewi{UPutuK`Zzj59_33n(Xm?(p_8B<^(VnwH>$f~vE3!V$Xb|o`?wEP2 zrpTrtm+P>gI!~;DD%R&PpE^f80LX-*kHfl{{1k1?G`(KY%giEKYfH6eRVHm^C92l# zfMfCWKCAB4}gYU^X<`MSyaC9nxPs^xp*h2Z;-{IjcGM7&h) z$!IxDvVjU&gO24kcORtpg8-R;56EO$ln{&Ey>70BUN*X-szK5l zouh#qb3hN94>{IDl51V%0a>a!aUZh)w90~0;8c#P?u2_zLj=sLr;UCKjev;8R##^Y zcGNjfg=oUr2K@_ncEdzhV6RsdFcn?^-LL zPyN~QPn~RkcAd0#ea+hSw6*JD<@uWR;s>q!KWLraw2aRNK6fp{Mod2Ybou;@e7>hX zr@yVsr%ylqP5t!G>ZkYU_seI={dVzT6=3lbF1tTmw*HIf4#>~JWnZbB>(}q;zjMxf zaZ3MBolic_&%&H7p9Y_mZU1lE=dRaxUAII&zhGb3vcCM{m+T84=_$W>ddZ8A@mYD{ z>mM$+|8_lAzVP&i%e(GfzU$s41@ybVw0zf>IxkdCaDVH$wVmhJc3v1fQQjqgk1q_) zEku_-k1j;&GkAD`&#lK6ZcP`4j`2CSYRS*9y0dcC$L_jw@T!mPTR3!b;n2jw?XwG? zpI!Le*B3tj^@Yzpz3{o?3vWNT@VQm(kH2c+(r2u^AfGQTj2&P6HUzo0xUyRF7HCA0{>@DB#7k>xK7v?(3_ZNS=_?zu0?>eaO`Yxw*>woat z!e4xN;qediTYm8?D=+-d-!8v+|LP0Jx0YW#y!yh^bKnA`U0((bKYi-lm+bQ=JI|j~ zgdlhTC*@t=#78{&dz`=Og~9vEyN)Yjc+lGQp!MRa<@fU`{}`WZKX`7>l3jZY`Rp@3 zwhx5x{|AE$18W!Jf4mU?)WT3@Vdx_Z-}&Ie(BkKFo67fJz4F4?o`tP@%J+9%#pk1g zZ(c|j{(4J6rrLy=%Ji@*D>LHZPdWf!x)X6SmRvT&QJ6${s`KVBvp&nwCCKj}3gUwS zYv30pWUf_0lmiTXuo7ZaYMPvuiL0B6-wsd~W3nqjiKn_DJt&h$%Bs6$I0+{%uR@4J zlB<~YAz{nHID87NW6#^HDG84G97+~Mi^P&~pI=$bj7T;}VQVFgmMWV!JOz9rzPPF| z8Q!Nv9pE4sc@)neCjbg>V5bxkh*X+8CV&0c9 z2B;sb;)uX%DWL&?7GspJfv2$jqf)eg>Woa(nIC0TqkiySj-uM4XpqZ+%p-^*KLO`l zkgfcPQ`#E!Qz*Wb3b%MwycZ>N8<3_XG~7gLD$*f>v-*+ozEI67D6Rx$;oz5cy|H}5 z?0aU2D*6BIPyBb@I1~q73U?)-Dn#CTi*GM`6*eygUlHL_Sm6P~ZI>>3uKfRd#T73X zb9WTl+xS>a_v#a$IkMt+A8kL{8>`xGR=Y}JyNQzHjTVFVl;J>qG7C_Sjv)qtE&?5y zV_Xms%+<*>%1g18lLLTO>i;BEmLBMy4MsmLbq^a@nV(TvC}Pquym&~^RjDOIy z=n%f>YOp*LGC(R(P3E`4#JHW&*2tR-niD3f=SHgmfh+llWxX;sNJRzt4a9mto-#^d ziH-_d8Cej91y^I~7}nfkkD`bxG4t}X$FO6xWDTpl!`i`ZRY0udj(&qaWrTb%X%i|h zV@)ZAY76I|f2Q*v?K-rvdpBrw>?3)x>< zOe$DRZ8Yjd3Qwz7%>;~sQ>x!~B1B1#!ZJd4BpQv2hRg(E$|0Id-hR;qrD3RY#H*qj ztfm#~41{FLE=OJ|P_a@cYvZy1wBfe*eRS0d9&nCQr~$ptrwCHNb&=MkJ3G3z7p1l+ zeG%UfLk379^i)JMD7wCETJKT|?g-?J%JGI3m&NoSRg8OqB{0|SH7x7+O|ae$US zNdI*u^MDLP(_IVyA5k6e{H94HZJl2hfH$9K?0I&b^-ubq$Q~ zR9S6K_7IVJ=~fHhtA1+!$6x)$OPH>kTGgvE+lfr@2v-UQbk4FQ<3t1jMlgC;9tgos zTe(!S6q{kHv~mc>dR43_s9VB;m6d=Qo;FdoQcv6Mm;8P!ccq3hNy1^!&qPs55xSLU zF-bwpℜ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%0Dh{o?`2HGHqghT6&T>w1siDqE% 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

  • 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 z�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

    DnHTkUPXbW5runK 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

  • =_p3@*+`Qlc$^pm7|PGcp}a~dltFRq_@t6ljej-0lZ zmhg0KzI&J|Io~}Dm7MP$W=hU?4K zO`-30tT=spwXAoVlk)Xpl%#xpm?SA*9|lRv*M~Wh^7UbiBz&oV=d@%BzVoa+o^RKm zds;C$-#u-ZoFD6;Ui(~Y+mCh7B>Y$hO~Q|L&?Nj=2le>gYQM8(pT2b2{m15;ht0|O zPVu-vC*zxky~+6IVQpf*w4eJdE{<>4U#x>#<+J&*4w{4?>!3;au@0JqAM2n=_+AI4 zkJ!$Ww^z@xhile&w)wG#V@dh?;Z_oU?BP^GzSOrq{gRZgPp>59>(eJTKW^=yw0#tV1W^$2xQpeyl^s_(@I=*nJ@pomk&{xROZ6 zj!UfXJv^~x6VZwFV~c<1nv_V-#3j*>J^V0o$^1n6(m(axK~Cw5zInQzEL{_Cr61q_ z^tOwUOXerl*H7n@>6v&--|oNO1Yrb|_(}A=2_%W0iB76-CKw}_#80B{O+ZQXOth!( z-5qweSPxf>U=lyEzV+}ViJpm0q%Zx)?2e`DfXVb_f|1>?T=jd+({q#2B)*k?eE&7u zVoCH&bZUL)meq(R^ponFr`rj&yhuym?*HD?Yfm&Gl|(<|2{eg*#uI1~{fsBjWcry- zpb7P*1DmJA32V)Z^z`HQ1zPsSp8k5WiKq?wvHMZ;bT^Tf7ne%keR}K3CZa5TyZ>Z7 zfh5t-cmnbClRjNdl8FuRTYeacy1KV3?vpX}*Q?CDWr1F`%k(~mtJN~>?TU&a;arSGlZ?eUXt z8qQQdSr?4yJKOixe!@;~=8MTloHpdeIgeqSWx5yV&04XzYuv{&BIw1rRTdX_tvBLg za&BD0A~f*Ir~`+N$}6h2U(H9o4<2@2FSPII{@V82BipxIpD(XX^mG3d`VXwve;~m# zcw4{RO~3cSL+u%7BAtG^Oj!CmO4+46dZd>}r3^owX>}esqIbm;_g#s#^~-pB*Wp8$ zIMR8jy|YCQN2ax5>t7SEfAmlW78-7kTq7UR4R`L`-`39Wy(CY!N6Puky7L06Yq=AV zPxeau?H%AC;QLXuP3gY24(CN<2PK|xyYtpDd2N*&<`oQl9(Y~Y`3z%iduShTKM|Yg zIdZZ1?TO+aNFq;sOrDpA$w!8@A&g7^vEv@lak4qq?$)d$!!b_IAvvuj;T>`wru|q% z=iITgLznHrLv7uibYxe~Ew3Agana>GXxl;Fo+eFC@tipOm1HI^+&R~zdE6|PO zFI#-wj5-^C+GPSPECn2ZIwgv zx!%5%KcW2u6_c=164{qGFPid-eLWhVwESE4o%|=VpJV=ya=gwS3}m0BO02co+ql`( z*VK*i?sb*T0XCx#cE}4-kII>RsUqy~!qeC_pAo1HCFMCo*3pw|=zi%$2M-@YF&x%9 z-dZG9+h*zE=q2R4OOPb|*wQ6A-_tK|X|Yn!1u_|+yh-@6HBcgcECWgOV{0g>)Adet zV)GO8L-K1-;wd7DeuAEqc#1&(I(_{k>FhI*Oh3~Mc=|FR&L{nN{mj$f!5Y?GeYWi* z3vDv*vBZ`EgS$PFjBon-j;rOiz+KUf5TK%0)=H2nFX=hAdt20&G z?p}9eVSODY>|Ac$g5Dm9h24Vbbctsok=fmuy%SEmscu9qeQA<}`U%=9Hf?KtW=}W$ zMAK#l>5IOTej@$U=`%bz!r#^#p)bU4+k`fkPp1Oyuv8#nGXWcZENoXWa^~`uQw7`l zxm2*x&$WVW{ah;e_6XAtmz^*-$%(qU!Ax~%O8rULyc=D@D|t<-q?UL8gD{AKg8U{v+zfCf z_yG_GQ61+n^q<*hHmPxRR)E^gw?sey%oCmltMHdVGMB#PY&>##Ql{lfnIP^4F0V>2dc!`SwapU+U#09`K^a=<=M}d0Q z#(WGu7kltlgkMkjK>*AXo(2=}M?f++EBeTXK@_Y2HlWlz{xn#Hzm!5hzmWVQ9{_&n z5C}s@K`Zni7>Aw)Bha&81zPRl9sJPZ{Ls_S4yXm-FAg|y@~4FO(Ve^1An5-@@^3WD zH$NAVnE=P{3aJy|cx1OKIl5b&!5_k31<70h{rqc?K|fJCHSmM*w}JKc^N;OTVGw#C zx&0>e2heR!pg)1$)PuX#!t0akx1v9R?l4$+!)|pB6n}QNI(urjngi)v82v?bXTVf+ zw>k~7(eFdwcP(k7zlQFXH)f|V-{D+Fe-=pnp3=U__aOYTa_SeX!4v)}FzzJ$0eE2$ z0>TgC8#fAnp70bH*8Cxhe+qulb-PtQSke4ti$4WF0~g77ft*ZhdZKL_9U3i3|etme;Hd|xBq zq=8=nwgItUfN$JZ_@jgeL0I!UEdDn5tArQ9l;%%Z{9^dQ3i1x}f!O!q8&?K@h;Tn> z*8C=mAArA1covLn{;0(d!7sakyn{8(U$yvq;SazIgAkDPgZRdEz@H~P1%@?$$l~|F zFS?PugB8tRw)p+#UFxSa1(haZc+2+E&d4n4)`HZ z0>pk1zH#I5CkPLNe$9_q{7Lw}0C^{FR`X{p{tWyk_!VFq5c>uA#?8SWB|Hein%`mZ z7vZlGUIbH`KVk9DzzwT8(fnnLUjaV?uNhPTv0sL7 zTn+pg!sB32^9L+`6a0c8c_(gB^XDyoEBp@lAy5Luei6QLVfYh-he5yQM=X9HeBaIF zow!-epRxD@@SEUQfNenR7vLLr0{$rBK@isb4vRkwf0ghen9}?Si$4ZGxQo1ld?5CH z_{L4ZA0pfjnl-=4;!ne0COiwqHGkCN&%!Ueg}j3`&0n?n3-AZvg+T~N`ayi-mf_D6 zo&v*~KV*z@H#I4Ei-cV)4u2`*xFe;$}5}#^MLzH^Hv}+kn_Fz&EZD z{wU!=5Z3$-i{A`?mGB~%()7!Q9XGFE1JJ-@u%QN z;5CB^Aok1fjXMp0hVVET)cgU9KM%j4fxHv9sQL32e+hmE{17MsV!sIAxE1&lgoi=D z=0`04IrzRkuA#%+Z^N_Y^2HNV5+Z-c)|co9r#{)ELZ zh97Js?;szDeILGYW$=dx_k(85Z?gCS_{)T6!MNs+TKo|FvRlbJSkwGfi@z8C0K6~= z0ZBiIZ(IlbdBRg*So4Q0eh>Vj+sHdu(fnnL-w!_muNhPTv0sL7+;R9bgvY_4<_}o> zA@~KilXv14HGkgXkHGJM9|9#n>=)r1Hx7S-@G$7t{D{S$gzsx2@5Ie&{*1++f!_qb z0&D|fzX0F3IryW52SHf#J1qVp{8hq>U`q2REdCkz!8^!1$OmHIhi}{}{2{{qpjq>q zEWT=@{Rz*4am^pK`1$b5?j-MEP4ibRej)q;cwrC%l70~1xFY!Tgr~r;<_}r?Qusx8 zk$147`O6l+0)7NuGpGP!zYO2F8u&AW$H5>F{s6vlP4El$l6T@3HGkgXx5Dp$9|9#n z^o#I~3&WovJPi6ZKVtFw;QQ_-@5Ie&{*1*RfZqha0&D|fzX0F36Yxg~4}!4fcUb&k z_^X5$!Ib7tSo|^g!F$L%$OmHIhi}{j{2{{qpjq>qEdDh7Wx}&yT=PdQ{w(~mSCV(I zrunNDe*yjgyf6p>Nk52h+%o)m!c$;a^M@?{S@=cGf5zem;Wxpr0Na4rFTgjh5&kIQK@isb4vXImf0ghen9}?Si{Ax5*h1bxJ`npp zeB&bUhY0tBX3cN1_)+-FglECH=8szZL9yS8eXyqas}}zx{Ju|DtK&f22w~r+s#O6H zC*M?_c~+(Be>Px$VeoZTYNo$Rt-ZENEk2`C`JU; zaue8Jx-6j10e^8|gNS^WxhxV;TaN}D+htc&s)d(Vs-Y4$T}jWN^vX)rR9dO>@k3Wt zsx!!jg+A=+ou@Mn-)?-oS=Q5v-sK6zkDNo@1>P$8Y}@j{e_oRs*|7<_(8Jt7hYPaMnEg@1KVxI{?`8$ zP?I3|y+B<3uKayK4S^6)AW{8pLqGpVm8u9d{4;t`&WCtV)%D6Mc#Ecjl;H;I62c$}W9DXsF1lgoNCgty7{srgS;?tkMubS&V zaV^Z#AXWMS_}N^aLdc7okn+EfYsZVY4m>|T{pfS6)i_uN6ChRkXW@sz8px*n)1*Iq z73C|Xj<1MMf8_FNH4A(%=h}szD*dg<3?j1)Kb!PtNx$ixRcap04aWDsnzu9NKo~TF zRO$D@&!+wdkQcW=`u)eNRMFe2)YiAgr$6(SDs>i|1B)P4`aX2CN#CqbmPx<)7nN!h z^#5D@_+4aPlJ!{-o|#`7p|hD^&SHO1QMQZ7-{!>gR|LMXAB9e2KTLcgw}$=l=h8l) zm1~GSf0_LI;TiiS(249PyS{C?i|@3*jI@iHgD+2Pe-gg2KM$Ra{Q~Sy-dd%$+(sMM zC$>LBysRc(_uX!nf-;6a8}Z zyP}mU3JO5B`a$#;-p4xe&sjfyAbxy|5q}CygGrETe9XeP$47*4ChPY`(hpzEy!6y+ zHR_9>pB65vR!g8@Q?)vSpDO(TGLn8Pem3({GwH8f%l$!lwVEr7Prrh2AD9GDkShHd z_>%q*wz5gTi}dH(S>J(ez-~V?zI?=+{<#&}?w@A;v9>R9|BPUN<{*6^%pOQ=e}Z^p ze;PWG{bb`eiv60y%nhKgC$arfc*cGObT;+}u|IGXI-s#EvHdVSW4}*it@UXkVHv+2 z_=(&}?9bL#sbw%#m)QP<@US84t7&N4zN!CY^)rh76L)cc0A}w=Y`+hlu|EK9+dp%s zoBtl-6S-5^A8W5$xh`1qMJ5NR|Ex_>Cab z^oNlZcaHQ|Kg9SS=Kk!1@z;-L!X2Owgh8tG2jJ&Ye&1fsU;Syd+6&5G5?_8F;e6l+ z1t3-WCGc}ee=F(t{SntE0oO3Q{!bDf0jI$jNR|G)$XV?lA)M;^xddO_Hqu|~s8R); z)OC{ieHp%)U(Q0?^GmwZJH!=hfl_QNywk3(l;zYO~)|DF4Du=lr# z?MLAm`-9Ng*biWT;CtjBbj&5T-}o)helv77_CwhBJ%?*Is3=H0zZVg2@?Q#_js3mY z54@N49jJLveEu_8A9kQ$@sldm1QvfBKR!nZkAo>N0aEqP)9~&7nQnfbM_ybH>90Ii zrF@@b4w{Hhe~~?jRZv5G5lEGO2mEZ(H}_xtq`$Vr`1l#+|7m>sjf9863>XEe(w~E$ zOZvx2f9C&UoB4A1xAEzZ{f2$pRo32M89G(^jmX&P_aUEZelX=9BK?s(?(y@v7Ck+F zep-GSa}vDcpcSM_e+a&ve!BKI>5q`UZ#(-2p!w?f^vl?j=m+Cq0HjKP626`OEa6n; zpMfuKobvn zRO#2i&!zk|q`&xV_O1)6Rnv3g)9)vK0?dFZkShH-__?ItMEZRn;ocJzemK7Udmd(g z2Poo~@KdFqk4!G0G)iosh)rLVLx2NJrwA8Sz`N5@QnRdXk&jXbEd4X%ZN+1KQMs(rEA!O1|`=g zwto_yu|EoJ?4N?}0;%$U0{iEx*&hy8sgr@k_M^lb`-9Lk$Y**!U>N)3(Q35<`d**@ z`L{U>(1WbFG4$2jD^&m#ye<3rc>?{&dq@{Ff^6r+k8#H34Dh`!d;JphOUJpl z1(To7e*BlCzjlIa_`9ps0)DpRKZyQ`cd<4DVUVqUBl_cIoS)js9xTXKzZv~A@8fK>f=6n-xKw~O@qNc#ksdT)ICLE=K76*PfV>4)Ll=?5}= z{u3eniE8G~AornF@#9w!t^qxu5u{4LAHJP_s`cqoCF?DHek@A*Th3M~KN$W$@#T;H zZ^{JDf;o^X{WXzg{xbWgpSmuB2Lb~EDf`^*XLhKh_l@k`hy?f86H@#-%6b52k?!45wz`2OZ_Z!Mg|Q1 zJidK`ghL<#nn1Gpk@GWA_;&x;N;uX2#UOlf^Q0eq8F?>euLRilZ;h95eg^b_evm5t z-%35ank?F@J;_K zhPK@{^rv6JnOZOevc0|(qd)Y1)_e(|5v&wvkPs~~@@j==dxo!C7{-^`};C{~jfpq%kI@upVZUx`y_n<%UF4lw~oqh*0 zGaxLoKwLli6@SCIZLpkV|8$mkGrks}6OFGK;uE>!*k9(^%o;fP!}#&F$og2$N6o^E z*@w36cl{&t1#-#muZOUI_Koo0l)n5jeoK*CK;G2f2>Qog&G}@I$@;hhIopk+UwS9H zAd~g++8y!wljw(D$J_(bwV&jF5V-&_`JX|*|251VAQSy58{`eVr1t_c0$zgDScF!Jy5^YajE z;ssCwZwpA(zUA=k_D$EnO#7CS{>VqU_XO$2M+GuVpcI(#QGtH=!_2!NoxY6EapYQo z(XT;&iM^wKey@`1e7xB=v+GXiM)YeQ;`{>;x0kT*5zadRajk@hNOu{C4g2|teSTc% zMC+F>^jpVxJ_p405Dqr-8ys-@rhpTd>Q5i?liU|IUFrV5#a_RfG8sQv`x?G!Upu`h z_5+__egNW*6ZZcFa{&-{f^cyM@5gE9w_A7BtG>JI)!BRNReo!|I(T0i7GZKd% z+}5D__SLIx&Go9Lt=`ceMnBlayJimX8?xSdwfAT}zw@bAtFNtBqpz-4&2PXb?hO8k zKW$Lq*Q3{0ugYHM>W`sc(9Q4H!u@cdNjQ8`y8;T|M{n`!oDu z{1CiGd~p-#5BKa=5wQA_2DL&O{zK@33ha(w+Mpu%1BZ93Cj2t|1^jdH#Z9BXgzhBR z_S-rqPX5di?|(IN#8f@gN8Gt5o_InLSN6d@su-*i7D(JI;YlEFi}P10zvzE0q{@Kk3M6h7 zxg{;DMdLh4OI$g!!DZ41Yv>9jZrg|Us4XCsYm{_~>eVb*`-oRhMkfk?zPMf;2Lm6a zjX=)`ztO~>0Ye}H7Kl3y*1HkWFF{}MaoPh!K1SW+p9UvEA6O)A7OZ#E=r5Gkt3kmd z^efOeN*}_X1;d~pED<*c*1IM27t83of=|F7L;f%5f6#Ma1Vq6yar0ng8LEMP%nsqYnl_9|(f{Ioj#F#N+#cxJL9(HPAM| z&VMuUXNfxv0#>=Yh>z^4S0P}_M@%5?|g}ueJia9tMf;BCZk4TK3nM@g#EL z`|H)YSJme8`O7)oQ z*ZNb$=YP0fZF!h}r1d4P1Kqt~09}E^h0)!s_09Znn)ubP*Q+UD<_C!zLN2Ohby9Jj znID#r9ayIRftep9ZVKJ86#9;_7WN;`)T`xR#*q%#a z-_&m*vd90kUXA^Zeu%C>;_`?0sBP*$^wg#0{X^lR{st^&!{s z>;_cwnE zg9?E~WPLxy#?L(YVff>P4XOjo5zhIRGlc#4;%3nwznb)bq(4>6dgihQ6)kboU%SdpzqHg%e~hrC zAHBlWUl9EO`asfe-ih8d$X@5Bf2P7s-+zOf{s3V~KYYEbzl{E5RRhlmSX+InPW6K^ zVBA^wb3xJs;ZN788V~`-t-;@NOM_b4)u778>r@c*!ygBWmYk7a?{8`4I#AP~PJ_O` ztW(FqG&arxKXf`*fPS>LLG1d7b>l)M+(D7?8K1lp5aihTQkB!9F z+)6)bblatw@Z4V3ra)X5;pMyOA0Y0!NPNe=jBg+=N_ef6xdwZ4IJdn%!YZU!ZCwT(7tiMi4{tl2okjwgO3jOAT^gWQv`s+0MbB7yL7Z5j3c>WlD z9f(^ZTo`43c!L{Wk@ViiSUXOdjs(|h;v(;%54@Xl5a(P&i5ueDa2(7s-wQ-;oca2s zp0ka<}hV1YcnXjfi zeTj>p+nPdO(heZE_sfi3V6G3D`l8>8{z-Iua@3Eazku$kH2RWOA~%A5;WXnuNBwE^ zOTSLNeT_2Yu)beHfBu_XPe3l~`xW$0J;8McL{vHE5HxNKtWs*O1r@+aF>QwVv>eLXJ1^I79 z=goC$8+0kWL@t1Sx3x$pns2Adoem(_t&oz66IauM$ntTgn1I=vVIsxzvN}? zW4v@vPV0wh^yknY1G%gpme6l4Mi=C=eo*bKf6zS*?Da!F@zKk;R|EF?p^*3m;!c6W z-*|0WMEt>wqBf)5M(wrB4s3XkN(CZxs0(*bbl{@E7pRNlW`Dzkq^pA!9#`=1&(j~Xb{ zx);5sF{Cc)-*PdtKBGO~=R1B;5j;PT_u^lQ@9fo7K4Z(9H&s3TDZz&}?|r=TYY3`h zcr}2RKC9bAuKcg}C`+#QX|7;po>HmO^P?+h!cGBxTzZX8QqFog2(OEGz)6~MGB-cu zd&}l#Qv14-v8udgLn_gcy{;~7KlE($YRF?S{~~qE)~9Sbs&+kd^U1br@ z#hZ@yZGGydqy3vN+59v_D#gk-f)uqn&yS56u=28ilh?TPo83HSQpWt^@OFw{GrsO8E_^oVVn;W&TDbS^V0~c@1$q6B6Dnd7BzF(-qwmiVNOh zg=+GO$ipm<_s*qif4K)(mHb{FP#0~Mx_#7Zf1TgWcU)xUs?xDtOxc>Q2yARe`qmqC z-xAx6$PFX+E9gXZu_)GtM6aih+rhb$!qsvo%}Fnn!5y^(r|E5A->8+;!;|8)WNT%kd1+(Y_7 z5&UxaFMy8Y-{p=Kk*Psu0GVeX5GSM42_O?jX6S~1+9CBsIF^o<+4QKD|C{qR9n?YT z<~7uTAC*(snCE%vCD3s;THL%yJUIlxI)~klJQJNY zOUJa~OE0#RD)VH%tU%}Fo`Cw)`n=Hh4CH}T7@wQ$PD8?y$0c+oZ{;@_q61=ee&5q1d)0Y&N$tA*E1z+{ zitN+T@hxt&zxh(TA6Mr2F&B`zf-|i`$Jx(dd=;T1dZp-Z=v&m`ZPxrD*9kd0TaF)> z4stScN@0R|4Uaq1Co*DNt`&0bc0*r5=WcCV1fI;JbI5%{F@2jmED$50pv^RA4PZSYevY@(fx4KS1g@i z-lhk2P+HOSwFoxk4Dw6xwjh|~L_O)P&REAwp4ed%Q@ zkX=M}2-*AA+tvBF%_>S&o|BHd%t2o2dK>diVN1Zd&iKBapf3K|GN9Y15uJ)w&eP-j z{%NDm=3C<1N75NU_V~VlY7w2n&w1n5%<*}f;u7+sGl}eKM?k$0I<8IcmJvW6h+jlz zxHF*Mv|h%vLziVXn77Mq6&bO*{LG;x`vdB2qJN8(FQfk|OP}(~T-1op3_87{v)9sb z=OXtCr{^M(k0M`wAfPtWR=%zc^6r&GKd^NV)KAg zXZOeYzvN*Q1d$!a_f4+P!zOo;?Up~~{gCuKKUl)n55?A!Wy`d$TZ8V60EJ35S4ug= z-b`5Er$NV;W0TXrBx@oY0`mI^Y155m4#&z|1Yhb$-V=T8dRgZ2ZhgHJn&0?Cv4V9QuZG7`(7Pj z4{TjIXm`2ul=i90lhwEk@=E9aWfYw`bRJ)?WBT+hR-(*VlFtQnITsT@%`mUtiMQI z$+cw)*`D>Xx~`7J)m7JqHVvX*@<2d+Jc<4$yRxY-KXQHO%%LN6T>dgx%ZrZSEcylb zar*1_ePAb+s^rN13yrSYUI*Mh727-MKy8IQ z{NJaLho-;v`i2>gFSf_yuDndzWcjBTu1(Hi`{Whmbu>XHF z)$vy1#qp@Ee+%=}@r&GfO3FEfUM;@a?stZZyE!exrBb$4zOEMxsp=(&4L^|gF|^{x z<%2mWOf!kWV4e&Z2qs!tCb$&KRw2-nIj0NAZ+@;{Z^y~pVabq~a?+D=c^cV*^|Jc9 zQ$+kEkl(>2+T(epUfTwcSpxD~xvz*n`bDpwn6WOKAKqkdmR6E;Mu(esS(~25MvvI| zoMl7S6Vf}~T6NZf&f0WqrFv9kzi!Do<+SFBsyz3`M^a*@lsXzDofUN3MHj>xkaWCt zn|qHc`#JJkVwv~jWOcbrK_qLp~`)blE`9msMiPau0=OxC#uvBo=r?2YSXO+8yREAnz5KZpE=ey-)Y z?=rp3sYAJs&;OH3PRXpxif&B+j4u)`-xo_I!(zhuEom|t$)8*c<=bRGh4#HALH^ztUk9SI7ajSo z*~R$2lL>Up(=o{|^(H!UEtGGfIq7^lfzG;gwxT1>UJptAOPdz%;J5PlW-OSg_2cnb zO*uCF=nGDkC7-LLUj~7^_ox})H*Mvcekn^0DWW`-DT3bv>V?V*yIvwZ)cwa}Eqyu7&BJ;GapJ3i@J*(`Ghh&l9%+r4KkAoq;xgd00{b$h5q9d3}k`|OkSu{ltV{l`SF*vgBkGkYUS zUr&70?^$#{B|1S%$L)LWDAj#0fJ_!AIkOTPnLI=PAmjiU53xhM72@Gge+db(`!dwA|X z!T>tQ(fPjU&TVY-&7UIag}zbDXnY-2ipt~YCY zSkH+LWr|%xOk4fN>X3Rp(S%Oft(9sg_d~uvBuJ;wepc+3=Qujyrb_inN$0AscyonL zXS0gWo1d&qp>z6<^XuDZ&@aGNT-o#uf$7`wKAauvWputey&>(aGa|^zdv;P?W2B$R zwW0^Pd)C`!Zsfksog6FkLS|#f%werYTl`|KiDG(U2uK`HO05jxIx z7T2>z^wX77-jS0@IVX_Iq@3rFbILiEc{!)ieHzL)(WnJcdO>c(;ZRD0ZWu<-}lhFlKl86rdi~~W!s)Ichq3txi7rR%8Qx%d##GqYo>B^iaRUa zXQz8D9rxPoEztD1?LvMQc|ZBfcHGMREPC?JIoX4c(|6Ll%gLa7)pYLz8Szr?CvtcZ-l+0{$-Emxdpgf7<&2JtvCYE!b;C z&e;zcv+TO{>ORue1uaBgT%x@dQ)lv?zi!E+2%4L9$JQY`i%uS;&g9*J7qZUeor9+& zKl4`E+&cShEJO4$Q)kD+l^f6Q$+fe_tu#|-i^#dpQ)j%f7qE2PI&dFd z=zilzM*3OD;oQcf=nIC>Pc|=_dXjg&UC4SmgZ+<_7hjiE<}~#**rV&I-_l7@Pr+B8 zUp+<8PghU!&c_Q`Pp7f()YGU{<|OqbeNg&S_(-MuyOPNSI`%bQ&++;6sXpGT?3eZc zvH2#0wOKjhejx88{DE$cf8#4k)26hp_ML zW8{C$o6}62CD_MkMJIGj?@tw5I&R<2cz;T+i+&*AP`VdCt}Pu~ZLuk}GVhSNEq3PY zy~xY=m(um+D01SmtrwZ!j${9=_`XJ~jHX^{taj$wD|6!t*xIM-rNh$6v0mic%ePAU zAij^<_2N7qmHrj07x`}Ug{+qV_TM4-8nnu2>O~%Qn@uV9XH31!qT|d9BbJU^FL7(Q zLMbaQ(ON_1dOwi&zNRamw70ly+FkM*1@gYwA^N!Qw3SzP?XVE*kjw{?A6cI@_E)Ow z@Z;KvvD{;=w-(?JBKOxKch<7&)`7PPoM!D{>OkI|dm-yU-nn~H>Y(uJ-kjjp!H;5f zpx2yI2SsnltPWa{bLt>q+0C*J%)BAr2G3=D$alrl)m@Y_iOZ({$n{L-jWO&yio$ypaZ!M@4!F*#DyF6!i%Zejwk+JdI6Xk7di$=TcmKI{Rf!=*YJW{JqilD&b>`3l$~yUH`WfStrQ_CL+%v{h{n4y5(L_W^mS8%T``fthM&OJF|7h5OU5sBmcBFj@&xPc&%mnkbI;1x3q;$0h&wT6r;jD8U$%KGZR!$6&vuljRunlcu2X zeaZJFWX=i#`5ui^U!zuf3F@l{S@~{Fy81eaoVaYq+#EWC*mur{Ojvm_^<_>!$e7dj zH$LjC{Ll6JZO+nh>&u%U^&UbQ@{7p71>bkhlGlC8Y#O-3dh?%}Cl;jWY$AlnV;{Qm z?Vc%U-__sr`nb-gdxz+5LuC3~-~WN!_EgMzJb->K>+x~)(#AedxkBY1nrq>4mI^6-+10|f9TlSXWdFUKNXcGj@`%0_n|Ljy+pC^ z)XR`nM$^xe)Jy)bu9q=OC(C*<^Xe&VNnegzQ!wVG@49`T^W092xa)YCR|_6aUnlb1 zP+YcsWdfZF>^pltb5{9Gog~=vIfKp&I>Y$BWlP7clZ^Mm%=K2jxsk5TrCj2&DW9yZ zqCmdYF(mU&{Q~+5*~e8)@Peyf+3+rX>#&)klIeQn*|_D{qC=&$d? zI7>ku;AhW|8g~L<8=Kr*#Xy1?eYr}?n(bD2$6c$S=?DL};^`h4`qgpFJkE_iYYlKm zNX|zaoL`fs^v-N-&@|T>W2HP}FZxc5>0{w#B#vck1dcLTI)#sU_w5b>C;DaehJ3QV zSo?OXz-t<*^0o$t`@p<>Ic!o@OY9$919tBA2Ind~EvzcLy)8j6h)C-)uM+rT#m5^0 z?`qIzeW5ZZ4s0E;9l$;q8M!@1Ih60)_d2DbMQ<>@KNYP5k0J0F_+*3Aj?b37&>4Fa zlq?Z#Ql)H&UZ7ghF#o1(F(keZ??UQq$}gK7eCs}C(Sj)%7q==w--E>W>V^3>abrkB zz%}6MEdyo+GqHtj@-lFrCT`J?N!tAt!Yh?A!^+1zV@PwK&MzB%as#+ReA4}l^2r^a zY?e>bR?|rHz)#?5m06TUUj4+PB%+d(c1)?O^rW|$-^;z82jG=jYH+>`pKwdovh`N` z(<`-=$T=nMi>Ly&^mD=GV^opI>>1E7y~dC~QzQ75;c1mi?R$*l`xFx271~NUs|-0+ z9g~+eNZ&%p{;RO7XKrg0Jm&sgjT0|0c);(y>!$RZJz(>V6SsilA8l^Q9ui|&=gUxz zl4W&<=?YsGMhNPVb%H(=2et#)@7@!6yxhPl8(H^1AW+0WGXR>JubgZ=Rtb9Y=mmW} zo>sY_tCtz|i{+jHPOSeP8nVgymA#8dwcUfjcipMxr0_Y@?&`9ft1Ks-=n}(@=po7V zZ}t<)*8=vc$~@cjgei5mi!=c2uQA8!#=h$J?^V;k8=`UGE1X5b<-xr!MZqi`=vTl1*&=V_$kjRxmp>KUIic7?xiii?cdhS4T$FZqtr z|G?A2>b}B^&lTbPd1z_F}W`H-)-Pcj6Y=#xwvWs*9!;(rXhrje?)8vOSws=GVm_fYK+zSwQNif<&*t0a?<-++mZha@L~0{ z5*Ws|72texSg^af4{#c|@}H=EfW6-Q)d)jXm^iTONISs46K8 z?Ep^fuRQYRAFS8deuGm-y;gla>jydX`j#Ae?fe7Y(+(Z`efqBJm3|dN8vbKpac34d z)-_8O_@6hnZviJ_d!JEm8F#GM&KNe0Gg2F@2_paXOMq#yF_0{3}5-Fc%-QU}%r7WD0Dq`4!7-wMaafn}ZT|10{m-ukB7 zxMvzV!zICZm5rVDWDm^8Ux1J9GR|8zW_&EjK2ymjF*BN#%n=o)G2Os{0?PHt0N1~wq-a2r;v%|Dgi!>8;#QIQGoN&I5r#oiID|I?1 zO00Am17;fO5csq3v~+YaLDD}~@LTn3+WdBZuEemt+(oLmXTo_9Xxv33U!`l=36fpy zMAV!+Nkog@s+A@iEBm6Fu>WM6*aI8Y-76vQU4>aHEgDQyJ%e7g{;H-)p78PA=Q^9&Yetr>s zrc)|E;<;)gGjCM!fZ#IfJ78#oF{Bi5EQi-tX5V}PzYhQ>`sStI$i`k-AFRH4A$7I= zf%#=)n>7d=OU$Qjf!5!x5Zb*qM`xQub~@#F9vmk#)CX|km?_jaK416yJ+O8 z<32A=)BBqnqFVKegVaG4?etK{K^{n%xTMB;1^FB33(?~saL@MU!?pn@eN8>C1NSxJ z){QbrJ-*4*V<#}vOtFOXC*qMZ^6U1~9CRk4vacn(EeX$UV`B50{7H^Y*)~s|nQ&f3 z8yy+4$a$4{A&d0Y$juqSQqdUb>Y&&1%Dbl55zrT+*E!&P_mM%bxH+C`&CIcE0e358 zbIZT!jWO0*zH&iCmbaRaY>D`*ac{qUZLCH_z6K%A<=bWjD{qmaMl1JD6( zQ?_)_3EV7kT}GLtZ*loU?(jwIsRU*k$@#~G^9Ve=d@m)}JEWhi;`eIc?oC~d7<{Fl z+>zm%ipo4x4HU5#H1!Yv|A}u);9H3Q>;U)ZfHLBCU`u!9k4VV-K&Fi{O5J5AGN3!{ zKP$jS;JFNJD`TexhmupLn?n%B5)4~=l7^695E1nL)oT)&8K^gK~{jP$J5dg{MMZJ z<`~4ONyvHc9iyC5_tv~O^Ik(*1pXZy50rc>Ti2Cd%;8`%s#nVBl*wq(tk#)y(suBo z4cluI&I7$|mCQe#@o(K}maHPL6+iHwR8*cumOm7t>)yu)#59p#_Kro?QI>Z;2y4VY z;;8FG;PTmox{f^|f4^u2xK7|izo_2OvDAsxFNy4;_c1)(VM8afJXdD?3Na-P4C8EXeZtwN4rdK~unu1y5e%|(6e-Y`K!=@AOE{w6 zga0!zM&@byvb^cs@4lh>>;lUe(qug0RI~oA_~ne~1w`^rM0Hq_Ata(VZOXc$X1!%0 zRBRmv|CMBL%+_m*4N+XCOcub>b_+&t@N%Qy z&ic2oeYUC4Ye0;1#m~$?hq(`26>zoWi8!jwil|H_`aUwf&bCHm;olPK;~o488@9Yv(TeztvqF<%=Oz zT%M5kVRRTWY5yNl4F=8Hka@SO^8W0;zg_Ui*M5#6uhJg$o#QT$M3zseSo+LpKNl^6LqEf*wet3T!A$l zv>EP_f!F%|ilN_RG}5B})e6@2rsoC!Kek^3-$Tl_?U$|S-DaImMy2Aj{eQ-#9;B@o z=GQN6@4hI1+e+Kl0VmqlBSR)>`-0onD)5OR?SfYtPp`iP%`x;{nZFzZ;57kU(7E%M z8h$bb+&XaLo|(%3^u`c*TbuF|w(o05BYna8q26Uw&F;&L1Mk3Yi=erhF*$AIp?xc9 zIa5)oX->>}7gBe+ugb3z)}7HDIK4*2I?uW@58Taox&wy1(zbFGr*uN!nnr5xPdE=F z9?9&F;dBs@P8?saA`Jp}BmH>F;H%rFr`QFTgZZo|lywCQ?In);$1MuE#0hxdV-2d)-RuU@_V+#TRV zUEDCra>BYeadqK!vHIot`|GTWY2d^-0H00&;G6mAAoM%d#VO#ZANR;tj@OG?qWmrn z4C`XgE6|?PhWMP}tJgr@pz4*R5d$+W3(=wo`{JIcQqYbMCY&OUbE-D8^Fn^^V#E@oQod|y4GG)F)Vj6*42d)fHtDI`@Hsews(h)FU zB&Odeht|bKRyneB)kBKrO@+~HfdAMvissh*G%?_dspHoqM0qXw3%Co6^i1=h4=aBP zm=$2oKwj>OA(yt}ZASTFeDWMb+P?N=a?xMOV{tfftTSD;*Cm{DL1*a!@d0lErNu>` zi*gMC_c`K@jIzl3ET;xkJ)rGpk?LQI_{*~6bEY2XvVYeoJKB>fKsbNX^E$+0JS`f? zaw*`7z1Y)4`yB%NVzytvXZUO1((MV^tXUiDT6FyIu zYi7gXU-^b`87qOItx~|H@U-MWxnFJgz&d^(1y0<{(Qf1|eL&9kDIl-+;oe+Fq2*hM_8a%&&D z)i8iMr@0C2_*g>p9V{Bit?x-CZwEGA2kx~wcn8_G7Bn4iPB_D)nKjA^-r`0<<$#s= zy&KpKU{C6Qg8lpatpR0kbyz#E~4>0=I^=1nfu-U7JmFGHUNq)mww;j!%ykRjJiu+EVDf3OwWQ2$*jZa%9&G z%OL~*g7!MHJTat!oP4mGKvrd;$272;z`h7iOQ#}FxxP$!(bR~!L(Xre-WhIh){z;c z9^jtl@pXB_DX3d(e0B`zmn4 zS9%Q@0(>P*C-vYHLn^;H;apsRPO|k_)&$nEZluBYslC_ZhAfbot0B^4vd)YFy9R7n zn^OtQ0@5CE4S0I>V4l(4!tXWH33*0$+Q?h#q2M#Rv}=s%{c3&`pS|_T+ul;n4y48p z>8|<8ldTZw>xbDj270FXTXK&tSYJ~}E5Q5~ zPfISLKe@$FT3YVu831l^CL!7h_rND#cHUma1D2!ngUU}!z8f0TXoC%;1K{`YwB*q- z=PEnqkcR#E?OPL~tq!CaG-xn@Z3j&~X+DH{1_HO%kW1yGcN597M}Dq2utH-~O_e!` z!sbB41;)Orxr8%t5AYl`c)-PG`aUp^_v%38XAJ{{J?ZP?pHh3DtG2Sft8|vV9gA8^i1+8sf@bV9 z%HKN-8d)Z*4QK4!M5b(r}N_kn3X!<{waQ@D@qamXVDjykybRXLD78CD&mya5rgu2I=vqt`(PdL}%vsDhMqwGaH z=!CNjN5CHdUk)d5|J{&B)vKb)dl(fWBQWs=C4~ZM>DIDxcjZM&h!^$uKF~`)$od{8#?{K7nbUjS~3xGG=S ztojvJwlwHtNL$~>9zOV&m8UA3zCeIg@Z8MQIRC>G>9XP1YFytBeq}$%U)D+B>VeB= z$7SGpffIIY_m#C^J2KA1kV=1;Ydn=52hrx#%>=M7%b^#046V<6NWCzxF{I+1g!587 z-9bZc*ixJckqQ;<-y$$Wz~<`@ZUZ+3TpUl!R^X}UOsG%x1-5__{xNFg9T0!R{G$@Q zVn|&-$=?TU1a2BQaZk*=FHfrvO1^{S`_u5VinPNt(mZe-h*4IVm4DiH=&@oT?XZpH z{yZVpz1%HBF4`duIPK6V`ynOJ+W@d(b|^?+zsT?Z)Yk}b`S#ecJ}m+_$8zi&@=IIF z;vmq*v zOMnY^z7?XE*nVMpX#|dbY{>$9nem-^830bih4Sx*#&`O`G*ZQH^3UlIyM~ko_Mh;y zWDxqu&bv_Ghe$)fJ~&65i0HOo*@*hC26pPV3Fp58`CIzV_5&~wZ(_qjeSZqY&zU|I>qtsg5!!=&!8zbWT#5U1ZnZmcU}umTf1hxk<<*TI z3rt(p)q5OFtc~u1$J8I-H(nl)jhd2b6+6WEQS{SA`GH^gBh~~!@Aew9vP{oVgjj?S zTJTV+R&{8P|#C-A;GK*e9YVMf9Q{{i49fsg0lkMkrMd1!+f;5UI!d1IgAU-TO@ z_Q|`7HbJv|)au;CJf;mDDVmH^(tzhi?a6Y`Fy9K~SMgVzNqLqV|7T)?Du;Qn0_MI^n_KD? za)G2BJo@gQl=}sSeDY=c%qUMK@Wa5@-Xj^>?}-673tR_q{A}sCfN>)8A>9Dz&-T(o z57?p3B8Yt(jEB3xy&3sg`6wO81BcR<*sgcI@#b{Hupc0HR3hgnAG=TX~`k}4a!=WUqZP=hJz=rh+S+*mj;!~3%9#}Gir+F^E5@o6bPVDoZHu9FflbzFt zLln}+Pe+r^rO4Y|HFzOUcFt5WWE)3JN&a#S09OfIns}s)|4}zd$&)_DHl-gp(Y9D;aoKM5Iv(i+&{YWuIyo*q`8O$)M~ndq~>;=GY7Nev9D^@b54k(rz)N z)M?4QbL{lVQQ*Y*#`!@uKFIP0j&D+>$BjB+UJ&4ORb}D%ktcnw5x8#hY`1xOWA8LDv%m_!>o%|f ze#drf9VvDHB<|1g_>%5}zDxNFD+~OOG%m0m4@io4#s~SIJW!|GlJNG6{9;H)4@}DS z416~06vLCun&*D_NuC?&0BpKE8T>x+^RxAEh`fOl`WOw@2kY$|(&Xt$C*swI)Zc>8 zh7?1@;w|8(9+Y&7i#+;Mbul7a6S?s&d;0)6pfaATl#Bm(NzadUYbF1u?YRaq^Wda2 zjL+`8AwT_B_tRCMsTbJFhlKl6nE$d4$B+iW!?)I|%47Bn8ltift{acY&9WOu=_z|3 zQqMzGtX#2W*JBgC&uJ3ad0_LkBg??819uLdmhV9y=04tC{C)_W*c-B8J zeSR3YLe>%IfSX~Nk9<11G~?@e+S*Fc$B<^uPCCyeFC?=LN7R90>X1I>R3_#6MCA{? z?Zk~{p2QC#ZEAdbIG%c)MVdb+>0FpYuSJj4b&ORoDc0Rthl?MU3_X)ie`efE0Y_hP zhYVR*7oQHv$x`);YJlmg3is!F@azO`2)NTYj==vJy(vF1XYBM{%Q~`#`B*Jj#gHl< zkrZvH#T)Ww<7$LE7%4fTyY#b8JeNS1#?wn@_Hl;sdvUdjtrLbm0@@ntZysp|_^;sU z<;z186oPvs+wnVX(*MY$^N%_7;yv?bUDef~?%dFU3A~s;Z8G(!q;oYsyGw?=v>z`> zFznX_Y*|gX{lfIm{9;IJ;Nd$HFZA<52219c>3>!{I)B|}UmyjXZ;k+EF!u>f0XG61 zpYEDb)&SeE-mD?T9+PyQh;m!D(fxosp&va)N57FY4zOL1O*(JHM~mi#r%HdiLOc`E zm!g!Ilnc`r>p~1^y*BB5K8MX;Y>1GEn*TLK>F?c06HiDw^j}LJQD$?h5W7Q^?rEn< zq&?7yKHGtzE9lhQXIlZbt}fg!sGB{cPT+j|sOW3lI6##&L~)n2Z~-wcjX|HApb<86 zf8>pg)_hc$E*UptNCQtyI)BB}(uMAq>}SnM9k9-oJUQtkiLW;DhP<4aP*p?t>Jah3 z=4-2Gfa?b?-#H}u-W+h^98$fJxAfJ1VRj0j=4+0C@2*eE_r&0HCT411-7p*lz8VLF zb^qWgNimOM=|kj^oo`91H9TgA4jL}vlT*rJ`fddO7}CO1lg@wRY4KP3mYZI5K#E*v zN!XgT1#Q=dH2$=t^AayFA*Fh6Hm%}wt5WxF(xS6K@GykRsrnA(?dk8BcfKCI~xH&xCWg~BC7dfO?bs$VHy4_zq_hjvU=XpuzV#5DT>NqHYY=}tE8vfLcZlCzp47y`DsIo$4H_K6`+ zrV;Qc!_(5UI@82DokE%f<}zZcJTmDX8!8j^OTRq=R@kG?zy{Q5;-`@&(*fgct>2rn zN{R!!j#S^0bbifx)@|@tc+Wn#Rm(b{twG{iNOha)J74eT5&5KH8SLq)1WhAoQtjco zjse#XTn}*kZ0WOrdDk>(NLO-x(m4fuEc!y?$c$ZD)<4>#^qEQF_wKAwR``={OBWYy0Dl?z0e-pz~zf6jNN6=(lN!5@$H;(XFw7a~NFrhZ z_l7K7n3Ve%OMh&~f(DQpZ2-^Fly`>PD=Zdhy>5d?zCIH5T5*x;BgG84q%D1YB)LaY&g+U`yGA1q)vxL^NYFR>fT2h%GrY<87mM*fwf+^l<=RdA z#Y(qV8T=V%J-V%<9e@q13x(*md)hUuO98WL3MzK zJ^*M~orvT27}7d;=UPuO_ju#(t%sSjW$ZA~Zaqj{S0%K;HH5SdB(%@WIY%} zs=q3LudWB+tvjLgky)fk;Hj%XU%l3dC#Vl;;I@#e`jgIgy)i=NVYh)rYub)7RLJRX zJsPD=tKoC*%aZawxL%`-@O`~j%JYuY8|N&Sfeo{1DRBHd#W`iD7@3ZOCWilMlYP)W z9#6fU2U+NA?C~xM=nkoBAnBZGV4lbNf&ck?7g9Rp_aXe=AM*PYexJzkJIl9(w20r^ z@zgTP>yHvT^on}0gWrp7vW7f+iwv`*6gF{CB%xi56&4ja1H{_+FE{%C`O zbXx%))b0Aq<+wu2qlOehZ*}-R^$OWf*1xMRav)Fo1$p*>=AR&&rjb?cmzj2m9a!S{ z7j(u_w+$16N$2^%xZ_3{1v5FzO%rP$qwbG@5A!j~H;7d6%78T)I90cpe!K%3lW}VX z&$3q)hFu4?3t0Lo{mw2tZXi+fhhgQ8fsAPaeDaO;W`TJsu>86`sX zyTFF&g=3IOB>pub`Q;DZI~NC*)wL z1npxO^UHslZFg1B;ar~%I?1T)C+bNO?;X#qJCtQ^Soz(f4SoTBHwEk-u=)IM1vvg4 z$M0%@KSCw^{qCQQ!l5G)rYn{$hI9aaqE2-i`~u2G-PXP~ylmt-fYbq; zSpV&}dFuWl+*ph$rh%OTmU?rC4eT-dDLQuczb@&#hrEz74k>wM?=ME?)MYzT>Getf zeaBjt|83|}ou3*3P2CMi=YFU!?yMoNrn%jqK}0P?|NWy$Cjq|hqQMXP=e(>L)2ROi zV8eWi<)Z#KfV-AFR}G$8#tuV9rHff$JKmuDYAb-oJokxm#em;JDt}|rIUP?+-_NGh z;cXr1nQB4L*kRGD08)wXQ%K#woa4nnKYA^nai$N6f5)j$ao}f=M#29Nc)G>A*;t`< zrRPamq=b6YxSk^c4ddG`((s#996!V0Q9vB$KEB2=^r7fa;FIxLmA|{@3|=|PQvbHX%F+d#D9f15GpH<6z>2a=8Q6fb z(01!cwKtxuKC!Nl#~A3t>I!kJBMZRsv*mNti!tBRkKZ?edoOV-KKZi?Yz5k4>g~!F zdj_u@w%7u;5WhMCPT1ne<{4y*`Uz!=lAmSkd4MensUubI)OEz*m7^@Zz!p-LQQ$;b zQZ~<^vaA9t>xh9pVOb__(sjh(m7^>hz!p-L1K^%VzZtW6>M^oe-#aGNn%9(pm1VK+ z2#tXs>qzmtPF6=q&y)sz-ZlrAM*!=sANu}S)*ZGvi@=5HgYEGI(k5`%;pwgzWz=nq z-uuY72F0*1vx?O9?xcLD%!WZD^&*#&R2+-}dx%v0o|DCW(lfSVW$aNISs!?r|18vv(v>Co4#0Q%WaCKAo^@DMy>Ce{ul)GVn1x zU8GFgTEKc2X_)pvpGzk!X9~%AZ@90-0HLo`19vYxEm@vHBg!%BIDYE@CQN6{a}jAM z2hQBvxeeS5a5v-WR{q=@^W@}~;X|dTpgcF9Okec#7*Y@Dzr%Hrw2`0o^I4Q&QKAzo`#kzXG0mOc}#x<}r%zsUQ74!j$d?iu^n9+dME2u`y~@KD+W{FdqdHyj3S^v)|4H!%JED$=r%$BA}_u0=WMlQ{G%;t^VCdu3}HQ? z&3k|oXZ5-a-9iCecu}DvGvBrdY#KCfpN(Y)Qe%VkUjZ8GzkgQxz1FiH)ARQ_q@52- zKheMI`7zS+FKB*C>v!idO*z+)BcC=DoQPVJ_OyRD()^>FoX5adE&FI6TQTV2W2Bit zN`JV``5Et$88Y;t<^#;|i_jr_fbnA0 z0BHieFTqn|mHy0W8!oX3elvKEg7?LKyzD#Z$$Po-rL~V7sTSn^1!?a+&@VhLw=Tl` zn)Nt_H2S_K@wEK%d@;Go>MrU#bx|?VB; zm*pc`A8$5lbuuc)#KxQi^)U|~N71{+;{ZIi%HV@J>>n}DBj=E#4t;^0Q%}x=J~ad$ zooBSm51Q`#6i!2(?SQ7|L3d4ORWMjz>B)JpynW!Y|IilaJ-PJWVA)^9 zl4;N^oY~^v!y)<|;)FY^wTMA$z*hb?9r!NN2wsgwU?t=@0B-e{>CktUGrm{c4fE}P zOUpGY{GSQja$F!w-@Ey!@oDvimdO$n=Fl;D^s@@%Kk{EHGD56wMrHs?Kil=b>qI z#GvqsW*an92kB$wQ-=Oj-S5-R=e=do`MkmQQBqF&kj2;2;CgWw&8qYP`n75^dad?beqo-Hq8o!u!$JA<~>XE*qPo~Lh!UW@`m zr&y$WCO%QUT#sbGFb?`{)RAs)o?Xg6o_ne!yih%XqrVJ-t_Sh+3NM}Xm$=X{GlH^M zwprj)hw0q0BW2h`^^dneQ}@TTxHG`22ilJI&S4=}={-@NKc)R=pM+djX2jyX476b! z_%YO@DsMTcKdCB#>jiEJu`kSqd962JRW|*WJgPA1nciq(hASFH~3YY(&9f`Ds+jrF{ynd z)xeGcJBnMT8gt~0cO>WU;SR%ALErS?I!+NiaEtgM4Mz;`HzhM;57qYi#cS|!qDOf|AJ-< zG}{;t7D|%>@6yu{yKZU<=*MxE?DA8!I+M7&TL-{ov@!D;Rnv)sPbc^+yr(Jm*zYYy zanJKiet@2JVG2BYZf+8D2bRxjUrZYIP;q1(G@GFD>s*&!B?&xTWyB_cn>Kd0;;F zhEpM19cT_g(?@zFZ#@@wbEIZU)3J&)jYeaJ8VBy1q@){G>3NUeK(Kv^ig8 zdw38)^A5w7D103GOp)fnEzYkg8rE&unn3jNvio8EW;ZR*qarV_-gTs6tkLzo5j6b! z5mJzB5xMJ4_jkNq8eyw3@JRnGePSMAb9r&d6+_xNtQS zlCW}=fmaM^={;=@Oe=MbC%>;ls_=YYiSOExifh{(n#i(EQ+5nX+#piw;rVgXz;*1j z_}BIjlk`3PlxG!bHb9 zbBgi1>>{WRV-iuT}~Wc`oQ^8DzgK_l(KZ4McGP=DLNPp=1znFapZ z3_KYX2L-4WG1e|GLQFp<9oMGXLDvI&UB)sYW$dqXX|B8^qIhei?$`iI`f<=ZC!~*q zbRF~?UrRez!v5~Ap&ylh+_n2-4==~({wR3 zk52H|gn!>e9$f)Et~TVrBIt=0Ih|; zP?%NpLH6;(@Nk>|?i^J%y*Z8)Y}l#OO3dF?w6-}b(5*WaP!@Ytsi-<)7lwY=3m$W? zY4e}=MpTr|6S6;?Sb<=~uT-}lnandGqA!9-`4@t zxT*BM5s*&-wi^PEif<|&Rr~((=HbB@u?!x2KWuT{Kv{*?c@T65Yc0++c(`MR+yU+L46r?4Z;|cu zl7Uq*tC0427d$4u+9KQMT|bYY_PGLccq3nHakeRA#czD}32L9)K{NQH7I{xm+Mtp4 zklQ5aMz9CJg>*uL(AZU^~Y=FLy(GGF^#gEnFK zg!FOb*$?`T^%mJacNzN8ZEFGT^8$Db+}Yw>!?txIfXACu`y=%n(KiR`wv}=mf=Bs} zTV(sZ5x^r)`&p4+9Z`cd$W=Px2@x&M~qpxerai^5@Hd!Qj z-o`A?DrmRQZ*#b2>z4i2=c^G<8(k96MweiY&$+J6zg8)HQRd0~ac4C9ZOmT8kre2b zU)v_v3&A4e!_OyL_91$K=>+c=i2hK3e4n&zCdU<-mQK#k%z?)?^wWkcy!y_Z=~wOI zCa~4tZE=3U{H6l(`>~N9npRJfCfe2t%;}Z>kK(a^G9KOFG5qZo=Vz27^*g^^er?Es z<|s&x8SpsxUW@Z5@|XHw95W}myI3tU|s0{u%$)H&}U=4GSmP&1MD-w-yO2CT$V9q;9jL+lucmA za%0(E@htZ)^!#b^Mask$efU|1C8=q=2gMvv(oU`o9mLKWSlyP{^WRj1o~5Sg#2!FA0{3}V;`b(??fO75HEQihnrnZ$FrCIF|`*%fXX&nnDe`No^iwCB2Zf!qJbHvjo% zgCFNmxOckvF>Q{x4|zF2pPx50h&WH06lfM8tDyN>ej4hPb5G-sZ1dkU_go=2rym7x z&ONOG_i>JC@Lk6DlzoeCvd0o^!#6u?qNG{f+->%25V zFX~uWF`jyYmIrp>xobMdJ!H>2&1a9QX zZO+|ktNj35ebLqdX{w>%swXL$zvZW)+})t5d_sOd9|f)(xEo;`eDwK2(WL3;()LT_ z{rhJB{nW5My`1JqMY&g>{?ZVoe{=3>6?5Zl_-y4P>?q#~Lb{}&lO0T$RMf?4%-=YV zSN>h{hirSO{l??pjOE>+S%8ebJ8>Z+$9vL0Wy~7`b`;ou^vZUL9TOISD~E4=!i&># zyxz7Q{g-o3H7Iu>{#y<_|AO}ZSK#{?l6y&;(21o(e9zzGNM#q~{=FN&k3T#2@5A_g zDF=NFzfB{}T-YYpxMGGKgbk&9E5KA-q%e;T#;{H3y;NZm!5H3qH2)lhc~&rn{f@rp zDojr>rURH-=uE83T^)>Jo6y~3&_i3cpA)7_ z#_t%?QdO(-De^$dC`8AN86$2$A8|lBkcJ=G>To~2Tlz;|%wvCDcPO!jdaaJqRELh6 zli<R z-)H0tVatF^fo6Hizt+m}!t}e_986uwGT_NPcus#|sx|kXg`50&%z|bkAP-S*1M=WH z;?!qbbMEW0-btp)Q3AaUz+cQYW6I0%!uUs9oqyNm&}a@qyu<$ z;QN6ak7wUe(98wccN*VM1lV^G-={u!Je%x+=E#!=?aR5Y!M7dH=j%W->EXq?(2nm% z1LW<+_nQmHvpd%j>jLz(Cm8TW!W9{an>H)>WFdJKlx)u&(Q8e|1(QqBH?Bke6f&aNpeww0xGGo(uVw^GsnkvNJ8<8i(_s3q-zm;t3pqad- zRqneQ^5+woGs=THA?%N}xSi=%@$MG)tpPN9ewsSa#6HmKT#Y#6-r}bzDmKd_``&$^ zDSlt8vqhSv0GbO;ng*eRY0!*(M(OQ40W<-6+W^hL&BxPQG1lK)_~$pN>*7OSn-zJ# zUkCM|>AJmD-mQK{0L>5lH2t6%{dlYMD(c`-0W^O#XfWQTeR#HE{I*u-PSP~`X^Nia z*V`s&8kd#cE(@Ru&|66{;={*|r#GH$NRQ*)l9X-2pHIY|^OWr$Xm-b1o$E<6=cg$; z$6p?vZRmfC@|`aR&|L1P;n{}yH?}%YV4d3upqVvkq>u7!!}2GU-rPU={2-{Fra)7H ze2!C3xsJH{)K)o`e!M@Qh-X|#KbQke_fr&2sxX>u(4-fzKbAUprk|$h3R4F%?v$a! zvQpdXypweS$=Bzz*O-J&8@WFB5fyhv{P_gMogvUvf4J3oD*fQ50GeMJbwS0ddC>Iz zi;6oR@zWGV&GN_?vICmN4?#BOvl2klWztALD989<^|MNE-wU7#&|4Zb^S2&PZ^NJ| zMt?}eozg%1{4FT%a2>JxQ?2qo(z63-e&p91&o+#Gy44w?4xSJ|^LIZ@MG0vBt=0Jk zY1;iXMM+a{QrGRI`MlEGivnl@^fm&TgHIk$Z;Q<5-74-(`SS^iJA0rhyQx*o&ASVJ znj-5aUs;|Q*5jro(U+qRz7|09Qd0*>(PnjkW^JO?IgfR2FMwvjq>=tM3L5uQN^d29 z@%ceeJ>}VkTI5q`JuPIcm#SzDyfdF`(Hu45{aSMDi?G0$#IfG^S-~`yD4GTj%_wMg z&u(>Ijb~7NxyEos&M`BeC8WM%(9{FJk2Lz=)|_{3Uu)#k5EbuaS39_5o}8m82mOn| zr%*Y2K(qXiR(Uoj?ziKRktfSm4c?QWS$|NgxYHmgA9WE1)i3Z|8!9_Pt+9dL8=uWH zFx1^4@UyUM8lNrxnAFgAZHVH&9gze2oWOC8rWfUSl$S=|Rd7B>>vDd8W4$%Z&7JAR zstbuJ1NV$ppQH4WE=(`;peaAIaJ_5;-vxY=R}M8!_3EV*S25~M> z&KFQGDbTD}7N(beVE04x5>_88kyi|9xVuT7ck48C7RhePjsw$()b))frv!aI_k{*d zmAmNMuJStC44VebLq)jTl72CU)Vqni;4AK+pGV|vmg6=W3>z|c5t2RH=}z$4LYn+a zt8*oume0LZ%sr)|Nwo$3Jn_UmAo-qIf2)Ixy}xS}YbF-&Zt1|Z6X#y`e~Z4KH~$uu z|7DV29KUm|w&pjj&h0Gwgum=XR{x;U_X2nN_Zn!2)>|DHHg{J7c&zJisHMv>w;zu~hx>hw!ggo^_+kF<05Hu2tacOroIlEFI_<-D!lD$TGhV@Dzpkbaj2UN@9#`OL z)k)|*v&RXVBeocF#1I=OzlFV0tyx_n>n3Hd1$OvbN+(N(ECD(x#0NXy*XBHwdZ_jk0zcG$wh04|e0U^}%yEVz+bjVeR^AHy9z*KDy+*{j3kFa8&)?%n z{R3)!c*XyFH-7H}{X_6{H~ha3L-SD^r9xYmj<7GF$wR9*J}jC z(^qC*QW!o4>@d<6&I_E4r{!apP?OR|Gx)9K`MJ(1$VQTA+9(d}22#yUZO-pmFOH1z z>ODQ@ikc)1i-nEMaszm9vqTK^<*;wfNN%}UKk9+$>J8qXX`TTJ({UO2Fu#fS*z@`P zz7FZ&-S+pD_>MZRz`%5(j1u`03B4od%TA(yc06 zX0tQxk&2o(2;i-PQa@a~=~_BDk9zQ_MgMH(<7wwx`0O4Ua>K^FpO#fsUe-ZD5>f5~ z;&&*9h|>e0uluAre_D+yqu0VfpLxG^LzJg8G?~!x9OxGQL)o_5pws2I2ctsA+m!Y5 zY3J{hb;6*LI+iPCDnPMLmqM{Cx2K)&5x?fe%iXoIRFQ-*sgjU-NrQH0J}vua&M8*8 zC>rT7j?WZ}ZKW;APieS~C^fzZVwu={g3J4|2bHLzM2p9S7{v~o=Dk#9A4$u3_UV8;mW@160hvcTXy*Qg}4+B5*v9$AG zmSe-ngTBBrs4`Q(bHJ|Lrm$|r(r-j>Ji?w}w)NC&D%zqxHAF@ELGOMsE$-!WYYlqo z3(|X-A1Y`Z`Bh*Ir1nc`d4F54f!8{|-Y9<}s;js*so>EK9{sCn@h&5GCVSR1(#pu7?s(5Ukj7JZ6luRogW$uae!L^&QS;eFMWIXo3W9q|-$Johu)L<>7 z{uae!^<+E-z@y^*iidl*6X}EZQdNII@ra*{#}RlO-K=;F9iIndN*wDVRbOb4?^Ihf zc*vL{cc`nnRSA4Q*IvGq{|w$FaOpg_D)3tdu5!7>zps+@x*=Pys-u5ZXX#cA zSyjC(q;JGCVATuiEZu>hM^N9W2Q(GPcN;ReRd@HM(Ua4{YkT7Uv(xKW*@rHj;Lg zo+0`{x{}a0_dwe>-y+Wm3>mb{hkXbslhJ>=7+*?e^bei^8$(Pwz-M>PpqF|3`cGZJ zFRiM(Yqt%&)WL);m_!`?3^UI}Yf4*FYF zDf$xcXp=Fl*Wf|jwJP1=aAZbdpot@OgRc7RZO)@G?s6v$I;{hHZ&c(uFfj9`&1b-4 z^PML<8@dhJj@cI37uyNQzkt42CGK{r{Gj3yJJoN40(kIVs@hu>kFJyPm;;a0hZK*= zlkwOGkDY17W8-8zYVV8K^I^rKGjfP3#CZ?<{6 zMunS1lzmGVZNdcP7IV$`-)yJ!3p|Lc2Cn|Ha2(qUo}D-ZZVI2>MMGW{yX5Sfo(I!G zK(-g8p8);zrHcM5$EV)_eV5LE>-hAX$8&Z5zd9a0eWnBS6WV8-du9FF<1@6^FtAfO z?DcHrGs!4*B=ti(EP!Sn{*cdJTflW*5sst2xo%npe!^a*hP(yZi|g`B&sX$k9iM&# z^n;L7N#=+-IJreyKd9ar; z0J{L*34_YRYMB3`3|&a8&u(!ZgD1qv(#rQ(q@owm{&M|b6hHU9=4AP-fOh7kE&hE* zI-lpreB!|EBlTY1BJT~u=S+EYA4I>1Lb_(ND3h$#V*V%&60RY3UE3nocKJ|6AhF$f+j7ojf)e-7kvgOzjSC+c5{1zo??_?OfDn4Fb+24=2qaW2Zm)9zzN z^tL|o#B~YpGk9jo8UwG2u9lqlhkEvLaFS6^hh^s3d%(jPylXsW!DAnG`!^^nNMH7} zU(wI>iZaVa1;ru49(e4+Zg&>O<2OM(YEUoNU#Q;6(QDKzZF{X$IeyT$xJqw=43vX& z{oGgPu0FFxv|$!j%lvV}Y8dCS-j@T|cxj8n zJ!=+?9N)+jMba6cFQ{dC9mf9-5Okj3;=II5tJgKZY~%;y#6iQexAPaaIA8G6C>iZ* zTOw16Lq@NR`D@@&`8?PcpDmdc4|AK+xzWgV+0liJK_!?IKSI0`>j=C003G=g>x_TbuKP~P?x21KDCd-8<^Wb@n*?Y7)U*Y$A z0eM_**jVMk^BP@K_Bt_njo|z3{T64Fydw9`_ARu$=EfJrYY{X%9(k#!b$oyLq88a- zEjM^Ur`~?$5wMMKYjMO`ohk#X^VJcNMpyaPU>?23lP~qed*9*#dg{ja8+TXxvEu=G znB#4g#{_5^1N1b9?;YrA8xQw_0AA+#9mQ)KH0vIDsq;g8U((&;JUNHIMm}uV4{JcA zsV+wLs9$Fwjt2R7WXqsIy(UdJXnKB)_s>w~7YE3EsX>EQhcpwQ8QyD=?@@kT0F8M@ z6f|+rtb%6nmo3h3na_IzXk_n1chL1TYbJh>M+xS@H-Cn^Td0$T03LSv0(rE9N8hiM z>|YDuF=>=H6}(P1!TJ1OC^>!{z~g%ckAO8J>TnZ07Jt*?%u^qK58&YmNTex2C12TX z@vn)Z?lAtc8k`r!=!sebo-}dLR6=K$GasZ(e+o2%il)&+GXR=V&^#r8<^n~7dqJ#x zW}vejZ!k(G^j0+z`Oy>jsYozZ|r0 z40GuN#jVZ+HI948Se{P= zl*eovl^<1No_unw#Yr$Od?$eBe{3DZ!MhVQTW`iYv`F)Z02;Fol*0$6IIsVP7Uv!0 zaeArG=ZiddczT_Ya%_V~#aopePxSMM+-b?~Wg%iK=lqY}*y6m4a&-B56x~Pnlo=uX zg`pqyf=A=qTVOBn81nOoTw}>0V#^e0I!9alcL*W2urDW@Wjh|NgJuCVzI`2_;p#kT zp6-c9F6P9`pyxvUh65ww|Dt@}G4Gh{};HV#Ov6yx1%z&{twm_dUpahue?Y$DKY z5O(YVkIEMxZ#*ywnz5I)IA6|@FWVy>cF-RW91m=PNAW99J|3vR{P-s36~uU8-mp&r z54d1XBu6~4`^$o+A2cP9S&RqX5g>EGcwh!JRexv^@1=J? z5QV!LIBM>4Vr*HbR6ZYxIf0|zf=A2tpFZ*`r+i!4IX8OYCQ0V z03K!^G{<;g20YdeTAT}Ln|s~YU$?f6vIOv;t#-kq`!8xd@UQ?Lo`6J}iU*+G{%vqu z%J>^J9%u*6Drk<=j~f9^HS}C)`%BptLDPkLB*p_z3@A^)cwi4S^ChivpF~Rl&ASaf zDnE)n5PiRUsqw%I0%!^t5A=XX^{J{K{+a+DdHUgTly??92JfxL1Cs$f3K$RUfk$7o zRrX_V3*hk$qx}AEoT$GwSTGp9j~WkrIeW4q%e*QXKz<6K| zJYw%q{qP1qk9_@b`q4gkY`t5_ajBn2A>)BsybxgNol1@oKaZmOnd1Tfz>@WM5Il;p z#x2GJGkzXHYJ35=MX>#t1 zxUIMK>#l@3+`)Q|ZuQu0hR0wI9jOy(;T28J-O#>z=!+hsRZI$WfaL~!z2wB6jqV*| z6L^FCkI)!+&Led_KKJ|StMU5=($XuNoYOIv?9IC-Vz9?NUr_n$K+p0!&%^m9JUl!i zZ!uWlti1Y97N4{%{~>7a8KApagI4ZqXIUk!$P=_ddmk$CeGIAp-&+g1OL)HkTtE2L zRpq~PcoMiy-2HnFp4Qk4{ZPErnoX%VZ@P@%H@fr7w+mbv=S}nRP+vssvojx@RaLUvbrcC$d~tMtu}`9C9WH|*hia1Tj;gp^9?(W0=GYxAICchra#n_ zm)|CE>jmJPBCG`$fa6`lQygpOOBaBf25z|ky{rN^bZdV3_JJFm$&cfD zX6*~}+cyqe^$YUjc>i2+bAH@7aJ$b4$FaWf4Aap=+vGjMyN17_zHlkctS>vjPN8m{ z2RipK99xR`J(|MZF~k;^W&0fgeCvT-2llDNmfKiwo#p*=bL9$K6^@+%wg*@tL!FH^ z%T|eemw_GVRQK}Z|4hRHc_Xb-55(;PH-Bxb|12bN&&lFS?~ZZpXgH4Xg6o+_DK+=f zXviqzg`Cz>MyLV47xiaO5H${NZ!da1)AlZCg&>DWw+DFLv;#l z8hQ5**E83C(ByoRG!p?dopwI#ckn${buDeq5BS-XO?N)HM^|?b(04Ew!s&}C(AU0@bNOAv$3CSN4e7cZh&@4&n!z8(Os12HHcZVI?E z#K?TO72x*s@QWc|o?(guhbbLfzBURc`#QXTt~vx$1=?C*>S~n@_idec?cEJ*&0`hz zC>%Qm>?p9p-o^K~VvpC}Ji|2n7=q2e{4x{9+8aaYJQqH@)-k7#}%#e3~%QHvi8?;NT0lsAyN;C;Jb1RL>}wl zG4y=JM0&e^t)cXmR zjItvB^CT02I-d3eJAIDAu7+c|p1BWfEA!v5u~&Kct^(_5>~=Wz0N6O>6@2%?u`#R< zwrjqJxv|t&8rVtn_4C!=0pOMjz;QiuI}eWaa|O8F^RY&NK91`?&{uDYYVG`QDuX7DRFCz+x~D51{6)>qGw|8#W082)$7g}7 zer|r;I&dom;0}S?eolUVT+bXVfL|kUrCs^?^#j*c0FLXK69ve(4BSxx`r8Gru>gLh zSo`ZKfL|SO6Sp)6&Up=}*g*Ss1J^gxEZ&>rweQOe+$eCfd2oz1^T6!@cdpl8M8Er0 z3}BhKv;}PS2Mfa%W8H59<;lmFag=A6Dj-9vR|XwN)%+O+p$>Y0?*wnr*T(;59Mw8t z*~WmI!I(n!qmB9$(2rgOb~2&+(c#z~VE2KQ{b(EO?N^nev#=A_{pj4-8pvA@Y-6%T z+;!(}8d$9d-Yb!fA#yzrH1!RN<}g1E_09FnH9a>|UY?C_0dq5yYXkW1UpLG9^zeU1 z-%75cXP9Fkd4Cw!Gs`eO^VwA9A#Q`x_N)bV;OF`4dKYk21>i=2+xc34esjRpeLX*J z1Gwcp`O@ExfLp>GLL8snDnqaEw@W?kYt{W>H;t_g$94caq_OdE>@cuL4^c9tb7NVL z=73%MmuBZ_lou&uSIB!cjdO<_V{QO9qUQ%YZJy@5M4UXZ#OZT`nF5bG&13lZJZOti@F+c3&5ukPJWw`MX2y^OU@I`EIZByl4Xlz`pC+S9 z5+0FBe*pT4`ziWQ9gm)})?!_-3-d{F=KmFgKEQ9ff!&KJ?00fwY2Ptmhkx4Sf6pHH zzQC~W0&tbCn*aTw&C}Es<=X~!>4D0=zcsMOux}+63Cc8&Q%}#vp8|PMXT9LDr{}-U zGI)6GOFc{gd+_pr_sK>YGcV2|ZV9-VSLDa-0M{{?A6J64zOq;6$8kM#;g$JuUBI~o z;6{L(xH>;Su4mR4fZG6Ws=SbfIQ3XF|D*BW@|pPqZ>ST+t`^}yDA ztjYNu`IbM(7Z*&?u&O%ZZ9AxwVer^|PqTAJkw-RdyN{TQr}ABp3!rJ7Xm;+*MRU7J zBj;mwK{GJk>^#s*qji71sry7U2H7eejF|l4W;wr)|1-LO6_qV*8V9EA&CSlmx%l4d z=Q{wJbRNEwzzn>x*?DgcyBEFBLB(|%tO7e+4+puzS=);G5N}~^c|!D z-=}){qOHSS@`5?_Fa+G-7Xr@di+U-QK(O9!$57G`O$%-Cb3z@JmEX%cxelHq=p&0g zxX2^pvpQbb`(`3{Sh_`w14&s7ZR=N?orihXYUEhpPlAMkArP<*r-1J(Pdi00h8y?C zfufJyL**igNHYkU;(Mo^%P~jmP6yEZ%+#w~+nEDRd1YGM)9D@t&;-0cVjDEO=cJuR zmZkU%UyQQe?*VU$J1GB|$mgfc&b_=g*M9$X+wY5t^#9TlEMF&h?0>u2d14M9FS@V4 zd}E-g`$n_#ACwh5GPcvc_HLaI^(b|+44R{FHaoxd=A-R>i=}#DuLICjZ#IiNeFF2b z-v5&l_a9cBg?fEwv%Ck#lui1CyqQS(1bwIz__ejd@YL5R@MGsUJO9Z!_6PdyRCKdh zcG(Urfu`!xW+zU4CHyqjJA9O{?t^Cc5=C=*O6Gn$>Bu{>A# zX^Q4e`=>;EGX|QYo@W1ib0kj93fs*C)7^l1r(*DZtHD?M$UFRecR;h4hi`Eu=CB{z z?0gUFr|xYAU+wd!n|$S*K|N?@F_-r$*w6AK=@VC(?M*MRHF;zh17`6YCBxVA%Me4p z%aq~raGmV{)BmJqXP;&JbpYQAvux59<>#QC$|G+*Fq75I&L7D4vtqZ?5ZAhfTsT$ZSoyRjR7>CGxDO2gJ!C!&1qsj-2pV8HDVQFG2_S*QVs6H ze;l4JQYI#zdp+)PzxY%=y#}#D?_-Axh;mM+TSE7M#er)?Dh6&6Pj@gtPJ2IqZ%(8h zbYn<+Uuu%;sQ8?bTiMXuZk>p}IBPLLNxz1)v3fFk40pv}kiE4Y<_p-XM?KUOfa?ct z_F>_B+?X%*xmv*9zh&U+pBKIdi2QbumhP56U+(Ff!h8v;mF+|5kC}T3xu6^SI|K2sH z2!2)oj(hqV3&3$t-@pg*=gU2P6YtNDn+9&B037%9r3%1tPhbCZ{(QNouM&F$!u*Ez zjRRM4d43%C^bI!U$8k?zXMubAYEcKygADGH;jgGKdhQ`JrvaV^rzq@NIF@_*(hpGk z>9)eL+|xG!tf+^3HrAY5Wu4`ozQu&X9))AMr>`GaQMQr?XZs4CvQ>gF_w?ZPham<;d}LnxTnuW>^s}5N9e)3r!S2dln=)} zeI=_^GWo6p|d)3=w0Ukv$jPhUN7VfN;pzN!!m$0FR*H-`P~KSywIiyxAW z$2xWm7a4<*?4G{yenm5ppC*ocxTi05nc4>zd#EoT@#ZQ$h)G3r?&<5hRPlJ?$#`&2 zU%E%}c;?A?a8KU=`UT%cx!fy{&x3x$J$=>D!uIrSo*Is0o5ekS0}ngip1vC3Q!E2g zW?Y7N=H1g*cedK6H)50(xS&0Kjb|zBcsQ1O`X+%D`z)qxY|x&**)tV(HXO@6eY=|P zLO3>ty>Ew_?{aP|?ZrKP9XNlIul{mR-(Uea?&+J#gJb>Vp1vKN7wLhK+%-c+T|aZ| z=_|+h02%U$31-|56LgzBygz$%;lW#yx!%7*kwGzWqjh3g}03PhaVi6m}>a%RPO)z>0p= zsEzgZtGK7Ht4?7ja${>CBlq+zgD>A->rNY3t%n?Y`WC=n&@AVtp}x7NFZC2PH?wWf z1kBA)F7D|o`32S>I0nN18K2Yf@NxDSh!oWo8`Zp1y_qsy%uA23E;j$ezAxO@H0-=qW4r^etdM zDUQ$XjRt*yeYvMErLi~X#?rpr)7Srl!uIqHMb!N7zt}uYT~R*n>6^K~vhSx2>@n=i zJ$*;mLwPI9`_1F?pw76bZ$r>=ZxzI1_m`i=^~aZle;o;_rg zk9+#M3fQa1J$-Wp>?P!$z8$>VSF}&ypNZF=J&fGbH&y_Sd-{g1$sEa8KVF#)B`zXBR1BCq;9uF$<7uPhY$$?Oefjc_tvwVY6M9^9bD2SF_ye zJUK^O{%R{v^wlBO259!s?@M^)6m5BS4__R=^X1a1k2cBofNl6?^6bm=%{fs2De$Oz zWwWzc6s(t`_nT|maxcmtX!>8;>}-2!^xW=;Od4skInZps82dzW=%VQ5rv4Jq7-ZW9 zO$qj;`Sw>C`|@1uZ<~Knv-3!=EZP^Wy)=?<9cb3B59iwjOkHoYGnh->H<|LveR<=c zsd-&t`|_56oq!BaKshacH1_3f12g*kX6LqCGF)QIK%JF61o16|Z#yt`z)V8Ub}wIL zzX%&5Jy(Tu@V`|5a-#vRvg|Vc<#N2(uQCRn?N0NiZ9FG zEWYRGhUi7q6F)j}@E8ZbG4yeN?p^axz8LwU(j1vWuYd60>^a&%2Fs%>~dr z-1J3R=chqabFZ|#zkbP26M4O%k7QKna04{kUuqWbsj+OL>+`>v`7}g}PSyWQi%=)! zXJX!WvDrB%hkqCSRnt(BQYUH941S{7`6$Z=9^Uq$$Wz~$&oF4J{T{E@;X>hW)wtY|%)c_>$0~@(JS0&%)TKKs;q? z1U`MAX6H*-YjD5fw^LEV+*dDcI|Q1}vznbBQl|S<`g|y};neWedC&};sc0Tr7|jl7 z>d#g*k1UL){A}cNPqoMJ$p($qv1hM&3}r}@27A&{EDut~{>GlXeqcsV!G21t!MRri z@SQR1T7ziAW zR9B+UR2g2rc3>88E=kC7YkoP%cLX%CJbY(?srU=_KeK#a4B&g3Sw5+^Ezs=c;mZvU zmA`6oUQfP13E+FSpKmQ_dP4ZNqfDK^tU$LPjesxy&-jAYt-e>4Atw{9{(O_@1L%9;&_wa}2N{@fPXV)t0hdB5zOG5^VK=ZZkWknFzxN`o z4(G<8J0?fkz?rT5BqLF^bDlo*VEf84Z((I*cLJoQHcGnMakK$0bUU?4%HzMoP8f zeoA6%Z7g5bqh%*{km;gUiH(P2XMinkQ+(6m*mYpXG`2Gwdj#yvPgU7^Y^=9zRi~i; z^>igezm4^ltpnJO(^c7q!m-1^c4K`;=xj7Mwh%k@ovzl-CTu=tS;F{KLLV`t@$n|{ zbn!Xk#PXeHqCZMpBU1lJld!vmyC`$C(5WE?X=ErZ-s5NCbnLA*D|brtFK0lr_RneO zS$JAB@assE^rK2*kSaRU!SC!nPvR)U0aEPEY3Fg!wZ%`#V2|Tuf1CDRx~_1VIP&1U zb>~~sPC7?Ek$0gI=pDtld{g#x^{Zh}_rYTtv!@js_OBi zn^Ymjb*V8980rxHtZc3PgoGtzV~p3U-M7}-Z-03ERzJjm#wfuAg*c#4Lku{sD1xXS zmpJ^D7!M}k5``$K+GrY=dZ;IH6DCztm%6DN`knjU)!z5Cs{l@C+JZ*ky!-Au=iGD7 zJ@4H6e)ip6=O^P7WQ=_2{A4UaZmu0XKN%)uOy8~3@0Ih1_uXdsCJ`qq%vK$L@H>q| z1Lr5>3}ig>1)Z)er^gYuUpPTw0T`v1#CzY|FRLnWPT&6CWpEtsgp7sv>hv1QrQ*>0 zSk;NcL*NGa)l?R;5j2bqcO;dR&c8oINd5B6uqN!K3V<4xhuo!~hNAN+y8 z9rQt$(*=TV1au~3&qc>NjDv1|w@%;p%X4*TSJZ}k#B+8mkVG{YTTMR?bSTaf!bX*P!!UbgbL+khceVe$lU|Yuir6v~V!y?s0d7gYr?O z(>cyueF5%itxoH7Um1CL#G;;)o0Pq^!L^Eb1lMNB*bI4zj85Mvm*<>Ye)4|J%uhxg z4ZXvzCQl$&VeZ@KA%AnOM80?Jmy6TNz6yb78a&IvvlL}dJS3UQ>CZ~^>vHJ5!cT+# zOu7BZ{$CBcLy+~jpH9Y>^OIu7zHpFVwU@KKdVdG7J^W7N1pL3XoIL4cRuw*80=lE% zS&ZD!=I4Q~@_kjFv@q?P*zUo&Q0J!=aor<_C_!7j0OJT~n@ZB&Iz!9thCzF(pwkY_ zGXh7Iu}S(Np+pL9Xv=Y)yAspheTrXTm2w? zex7u(Z>K>s3SF=A)4*RjrEjZozwi`fJ?p2FHaWMbNkjL}3GHv%2&q9%-UIKjpHhrxOz2;5)bH$=Nn179@od36dr zCaw$LDNh(Y)p+M`3iF;>I*W6Kukf9@UtQ1%Zl~jm-w@zHu7#Yf{O;gTbNMxozpBIv zzB8g;1FmuPAAt<>OU={+d7hjlW6?K;vCUK9IR&13%kik$8wrAW7A!;#x~G}!ay&fv zOXq@zW3?7Mgm$+3d7OD)!;GWcc@n?VIKEY61*2Ue&6}YF!|lW-S1rn`~47POyipQN9=dN-@m1iT!QbPDPdnV>X-QBay;?6^3(ftx(DR|U0l4!F3&G@?t+BGJPGj3|Elh+ z@%-TuJl{~xN$_x<+zXz8hjjWfxAO^w$H|i^!J*`_HqJ2p6$-u7>zm#-Sg&); z^It8FEzKo(O4za-xoF|J7N?yXOYr#GVOtX58TwU=V@p=yDPzkp=mXH}Ew*Jqp_jHi z?X_jD7!E-Oqw>mT`XsiV91wTrd3-z!EKW7gen(ep7DOv?oMZU#qph?FehUmMdhxg- z7j~@+^7|LgR2B3b}0PaOmx8 zsTteAq#^@4@)aE$!}DLJ<+Z1Fa3(^(^;{mzIN3l{*5O&Co&620mFl zN1%hBb^^4Opk2dqE4{Q*UpcPx^Oj}MLC}WE)6V51j>i!2QmDi_6HYujmkMkU8fHJW z0h9O*Qa!eTW!`q>JrC*AouJtbTH({xURs{`s(u;;ZFNnnv(7ilGh-9SQ@=~>>M)7J z%kXUnp@Z&~>(_yE+DUv@TKk>7>>OXvEv;&|$f%PkdzGGe;{Q8c8b`NNUzR!DU{rXOUb_(mD2)W~4 zTEEzi*uasZ84Yp~1CPMvqwj}*3 zQ&(2L0_CWrUFU7?j7MR};rUB9Fla|81D&Nj`RZIXhoZb+;l}P>(4Q$p=;{*mOXn5I zc?^9CSl$~EYgYSYYp08(VqQB9+WGwvG5$;1Eh61F1RK~M9A|y`TB-?jFQY8!Tzxfp z1A@;UzW=rgG)Df+G(_^n+R-0>m)*jNS96O+I4@-gJ%JHL(Xi$@pC3kcpp z@JxO-BJORJyqTZ6b9ClW3cAd2t8Gr-g%-0?eHqG zq9x)N^qeD4fETY5&-mm>petYZhOTID6#QrJjZmG^9&(a%<;4Aucea_GpILCMO#!QiBh*-q{?#J=O3=;+ z-QZUubb~@KE(4r<^4udcnsGbqJZ`5J^e69+&{YZ_Pum|AE{0<1VmnNq1Kr}iv*{m` z^mt6D+OZ$>8y}cuhxVkTH;eS#CljFG|6oLXZ&vo3+b{Cz0^5SYe9V(lYQVbyv9@(z zM0}4*^0v64qPsE4Hmn5QZqRMPR?^A7U!?XuI-^v4vA;RK#vX}?=f_fp@V9e+nOl=z z1Yma{gE?bZ8}sguc*eK-I|84txIvi1d`&^|+h|8&wrdb*0?)^>m2GtjyBdOGxJG>l z7z0euU5c%wLtly~e8*77vL=9ipjoQWM1`z+kF2veejIe4QRpD6m$hP9e2y(fU(Nqo zgz)phnfBTpwZ*x=8plI8-l80b3`g~24M9^xijyb0LAx8Y>%6qLIAPKdT;tM)aC{iF zle6V&jjnQhzCHt*ngbEKRgvdh7CR4dn6zFz)pvea5e}~BY{Y#fp6{Op{|NYXg&(@} z0}y6y5YK&?Ivm8Rn1W5%%=eY1!FQvVZ{|F|&9$RcTy=nl<4XV2hMcez3PHM&10CRkTN`YpbiG)u=nYqDVK4y5Ub1 z_h%YHVFLB913!00JT6fupZb1bO9#N2kZidfct@mfl=T|;CbL> zU;;P+oCbaYoC7ZSH2eiD0&0LufmJ{)&cg~4YtG1E zr?Ib&9^?J%3Wn9+88Zt8SK$u6Aa9Cg5~e|SQiEm0Y-3HzH0tmcle5=uq+_}6tc5E2 z9)%6lu#E;QWvAjXv)zc>scZ&MU&BUEDsDuw4cUxsWlegM8Z)+G`3dQF<~8=E>^3VK zH}ZLW;dhN?7<#J9idp@1WZqiCZYWrmk(r@*VRl_4fv;K?DLcBMbb{#EtU3_Vueer^ zO%zOF=C!f3v4QBr#ahP~u(gisSkbyf!eV8yj)q%#YktZel%#HiLeq)hP z^5Oc1b{+jv-)|$-h%T+bUeBxs>9Ptv8%wwm0Iy$#eVAKkLI8OL!pdMR1=CJ(10C57sf5wc9kVE1!6DBCpw7YjkojPR2>Uj}N@lHeEE6|`!widl zP_Z8I9LpOsK~B^VK!+(2WApy?8JLW7Bmv`%9LGGGfTw66&~6$=j_wO|n0Z(0VJ-`u zzrrQ%6h7nVe%^yHXKy5MeFkTiV$rt(ohigd%tX}LIJ1aekTt>pqE`YNVkvt~)@p}k zxRuPV@ifkZG(~%n641hx6lEdl zSSk~dtNl>R6a3}n{wJchO)G6krwSup{KSZeXP}DU0Jk! zt%fuy+HONBn?fely7ETMig#1HhWHiH+o{3r@g1~Tb7-Sl((Q*XEtxb6dE7iPv?Sb> zr|nu&_<4tx%vq_7og@>bf*q%{*ybsxB}EV1%v*S(pe02Y^=e7mFiq;$l5QW|szD?? zN_0DydgFAjmdf|Kwm+glDI}D5mMKQGw5#o?mNwGyZsf?vMTz_M2~o=R6Mdaa>1>Zd zf1$Yw(l<0#kk7iqTtaU7CU4Q+vzmp|h3GjADhp>E)!HAzZ z5$g2UT*`3BPC6y9{VkW!aTZN+3I9Yt;*yPF3~MrpQo*FZ=TcwNO4C1Tj@%z>Aj$S3 z3;YD7LN15WX_R`MO8O@*JJs}4t$>t??nKrUC3xvgtw(k?{j=619YFu4^~UpYw(TsJ zTr2*A%fgBaDo_%d{2i?|>^h9WJ;sJqCXwx>lU&mf%h?4BmcQZbSs2K&dHNTzXQpyp z*_f4R?ae^nfA!RHGD0Q&yQnQ#`K-l^^h@3k8~Gh}Hs>}(8jq}NvT+_$=5slcLFe-* zV_-!i?6+W;jBPVmz!GI&3~%&DT*IllLFyyrUd~6{34&9{GI^G91s_2sEEsYuLz3g` zRTp*P&bqe9wJ5HDpCLc3F{iyU)!j|z63%8e@kHByFohN6Sr)Kdo_4Jz;D(E zs(;(y-}i#++Z)#xdzgFqfA()+U4&|Z5B}bN9{Am@owOJ@{?Sefv~|A!9PmE3_#)VU NsnH!xTDS_P{{~%mpcw!F literal 0 HcmV?d00001 diff --git a/ROMS/Z80/BASMON.HEX b/ROMS/Z80/BASMON.HEX index 4855d59..7344ae9 100644 --- a/ROMS/Z80/BASMON.HEX +++ b/ROMS/Z80/BASMON.HEX @@ -1,345 +1,343 @@ -:0430060000000000C6 -:18000000F3C3A40000000000C332000000000000C31B000000000000BB -:18001800C36C003A0030FE002008CD730028FBDB81C9CD7A0028FBDB44 -:1800300083C9F53A0030FE00200D1801F5CD600028FBF1D381C9F5CDB4 -:18004800660028FBF1D383C9F5CD66002004F1E600C9F1D383F6FFC916 -:18006000DB800FCB47C9DB820FCB47C93A0030FE002007DB80E601FE2D -:1800780000C9DB82E601FE00C9D7FE0A28FBFE1B20023E03C9FE0D2822 -:180090000AFE0C2804FE203801CFC93E0DCF3E0ACF3E0DC9312A303E1B -:1800A80095D380D3823E00320030218103CD37012181032204302A0490 -:1800C000307EB7280CCD5000280723220430C3BE00CD7300280F3E0094 -:1800D800320030CD1B00FE20C2D1001812CD7A0028D43E01320030CD3A -:1800F0001B00FE20C2BE003E0CCD3C00CD5000CD3E0121B202CD3701E9 -:18010800210801E5CD3E013E3ECFCD8100FE2038F9FE3ACAB501CD8DCA -:1801200000E65FFE42CAF601FE47CAAF01FE58CA0D023E3FCF18D57EDC -:18013800B7C8CF2318F93E0DCF3E0ACFC9CD8100FE03C8FE2038F6C907 -:18015000CD450147CD45014FCD8F014F7B915F79C9210000CDA801FEED -:180168000D200E37C9210000CDA801FE0DC8FE2CC8FE0328EE29292956 -:1801800029D630FE0A3802D607E60F856F18E178D630FE0A3802D6079A -:18019800070707074779D630FE0A3802D60780C9CD8100CD8D00C9CDC7 -:1801B0006101D8E5C91E00CD500157CD500167CD50016FCD5001FE018D -:1801C8002009CD50017BA7281E18157AA7280BCD500177233E2ECF15E7 -:1801E00018F1CD50017BA7C8217003CD3701C921AB03CD3701C9215E78 -:1801F80003CD3701CD4501C8E65FFE43CAB603FE57CAB903C9211F021D -:18021000CD3701CD4501C8E65FFE59CA4002C90D0A426F6F7420435027 -:180228002F4D3F000D0A4C6F6164696E672043502F4D2E2E2E0D0A005E -:18024000212C02CD370106183E0032063032073032083032093021002F -:18025800D0220230CD8A021100022A0230192202303A06303C32063021 -:1802700010EA3A0030F52AFEFFE93A0830D38C3A0730D38B3A0630D32A -:180288008AC9F5C5E5DB89FE8020FACD7A023E00D3890E040680DB8991 -:1802A000FEE020FADB8877230520F30D20EEE1C1F1C943502F4D204251 -:1802B8006F6F7420524F4D20322E3020627920472E20536561726C6512 -:1802D0000D0A0D0A4243206F72204257202D20524F4D204241534943CC -:1802E80020436F6C642F5761726D0D0A5820202020202020202D204298 -:180300006F6F742043502F4D20286C6F61642024443030302D24464687 -:180318004646290D0A3A6E6E6E6E2E2E2E202D204C6F616420496E744D -:18033000656C2D4865782066696C65207265636F72640D0A476E6E6E8B -:180348006E202020202D2052756E206C6F63206E6E6E6E0D0A000D0AC9 -:18036000436F6C64206F72207761726D3F0D0A00436865636B73756DA2 -:18037800206572726F720D0A000C5072657373205B73706163655D20EF -:18039000746F2061637469766174652074686520636F6E736F6C652E5F -:1803A8000D0A00436F6D706C6574650D0A00C3BC03C35A04DD21000035 -:1803C000C3C7036D0CE31321B030F9C30220119406066321B0301A77A4 -:1803D800231305C2D603F9CD9508CD630E325A3132A93121A904CD0131 -:1803F00015CDB208CDBB0BB7C21004210D32237CB5CA22047E472F772A -:18040800BE70CAFE03C32204CD870CB7C26307EB2B3ED94677BE70C2DD -:18042000EB032B110C32CD2B0ADAEB0311CEFF225F3119220A31CD704F -:18043800082A0A3111EFFF1911A9317D936F7C9A67E5217204CD0115E1 -:18045000E1CDA41B216304CD0115311631CD9508C3AE072042797465AE -:180468007320667265650D0A00005A383020424153494320566572207F -:18048000342E37620D0A436F70797269676874202843292031393738EC -:18049800206279204D6963726F736F66740D0A00004D656D6F727920CB -:1804B000746F7000191ADD1A2F1AB330C1134617EF13A31C821DBE1824 -:1804C800F11CF71DFD1D5E1E731E9A17DE1E013173168B140D17821611 -:1804E0009316001F931FA316D316DD16C54E44C64F52CE455854C44173 -:1804F8005441C94E505554C4494DD2454144CC4554C74F544FD2554EBE -:18051000C946D24553544F5245C74F535542D2455455524ED2454DD389 -:18052800544F50CF5554CF4ECE554C4CD7414954C44546D04F4B45C401 -:180540004F4B45D3435245454ECC494E4553C34C53D749445448CD4F0B -:180558004E49544F52D34554D245534554D052494E54C34F4E54CC49BA -:180570005354C34C454152C34C4F4144C353415645CE4557D441422827 -:18058800D44FC64ED3504328D448454ECE4F54D3544550ABADAAAFDE2B -:1805A000C14E44CF52BEBDBCD3474EC94E54C14253D55352C65245C9CF -:1805B8004E50D04F53D35152D24E44CC4F47C55850C34F53D3494ED4CF -:1805D000414EC1544ED045454BC445454BD04F494E54CC454ED3545201 -:1805E80024D6414CC15343C3485224C8455824C2494E24CC45465424C7 -:18060000D24947485424CD49442480050C020BDD0F520DE40E19121329 -:180618000F690D0F0DF20CE10DCB0BFE0C2D0D540D030C5217C30D4436 -:180630000C5817F713A117E91E540DCF1EC21EC71EFF1F0431073105CB -:180648000E310C770AAC0C540D540D6F08798B1B79BF177CFD187C5E04 -:18066000197FAC1C5072114671114E46534E52474F4446434F564F4D5C -:18067800554C425344442F304944544D4F534C535354434E55464D4F6F -:180690004858424EC35A04C3820CD300C9D6006F7CDE006778DE004771 -:1806A8003E00C9000000354ACA99391C76982295B3980ADD479853D102 -:1806C00099990A1A9F9865BCCD98D6773E9852C74F80DB00C901FF1C44 -:1806D80000001400140000000000C3A809C30000C30000C300000D32E6 -:1806F000FEFFAA31204572726F720020696E20004F6B0D0A0000427254 -:1807080065616B00210400397E23FE81C04E234623E569607AB3EBCA00 -:180720002607EBCD2B0A010D00E1C809C31007CD4907C5E3C1CD2B0A85 -:180738007E02C80B2BC33507E52A8A31060009093EE53ED0956F3EFFD8 -:180750009CDA58076739E1D81E0CC377072A7931220C311E02011E1472 -:18076800011E00011E12011E22011E0A011E18CD950832F530CD560E96 -:18078000216A06573E3FCD3C0A197ECD3C0ACDBB0BCD3C0A21F406CDB1 -:1807980001152A0C3111FEFFCD2B0ACAC7037CA53CC49C1B3EC1AF3270 -:1807B000F530CD560E210007CD011521FFFF220C31CDA809DABB07CD6B -:1807C800BB0B3C3DCABB07F5CD870CD5CDBF0847D1F1D29B0BD5C5AFC6 -:1807E000327C31CDBB0BB7F5CD4F08DAF407F1F5CA280DB7C5D20B08A4 -:1807F800EB2A86311A020313CD2B0AC2FC076069228631D1F1CA3208BC -:180810002A8631E3C109E5CD2F07E1228631EB74D123237323722311EE -:1808280011311A772313B7C22A08CD7B0823EB626B7E23B6CABB0723D3 -:180840002323AFBE23C24308EB732372C337082A0E31444D7E23B62B4C -:18085800C823237E23666FCD2B0A60697E23666F3FC83FD0C35208C0D0 -:180870002A0E31AF772377232286312A0E312B227E312A5F3122733166 -:18088800AFCDCB0B2A8631228831228A31C12A0A31F9216331226131E5 -:1808A000AF6F67228431327B31228E31E5C52A7E31C93E3FCD3C0A3E0B -:1808B80020CD3C0AC3FE30AF325E310E051111317EFE20CA470947FE33 -:1808D00022CA6709B7CA6E093A5E31B77EC24709FE3F3E9ECA47097EFB -:1808E800FE30DAF208FE3CDA4709D511EB04C5014309C5067F7EFE6184 -:18090000DA0B09FE7BD20B09E65F774EEB23B6F20D09047EE67FC8B954 -:18091800C20D09EBE5131AB7FA3F094F78FE88C22E09CDBB0B2B237E54 -:18093000FE61DA3709E65FB9CA1D09E1C30B0948F1EBC9EB79C1D1238A -:1809480012130CD63ACA5509FE49C25809325E31D654C2C808477EB7CB -:18096000CA6E09B8CA470923120C13C35E092110311213121312C93A2D -:18097800F430B73E0032F430C28B0905CAA809CD3C0A3E052BCA9F092F -:180990007ECD3C0AC3B109052BCD3C0AC2B109CD3C0ACD630EC3A809BD -:1809A8002111310601AF32F430CD660A4FFE7FCA77093AF430B7CACACC -:1809C000093E00CD3C0AAF32F43079FE07CA0E0AFE03CC630E37C8FE25 -:1809D8000DCA5E0EFE15CAA209FE40CA9F09FE5FCA9709FE08CA970955 -:1809F000FE12C2090AC5D5E53600CD1320211131CD0115E1D1C1C3B128 -:180A080009FE20DAB10978FE493E07D2230A7971327C312304CD3C0A15 -:180A2000C3B109CD3C0A3E08C31D0A7C92C07D93C97EE3BE23E3CABBAD -:180A38000BC36307F53AF530B7C23615F1C5F5FE20DA600A3AF23047A6 -:180A50003A5B3104CA5C0A05B8CC630E3C325B31F1C1CDFC1FC9CDC0B0 -:180A68001EE67FFE0FC03AF5302F32F530AFC9CD870CC0C1CD4F08C5FF -:180A8000CDCD0AE14E23462378B1CAAE07CDD60ACDE60BC5CD630E5E8B -:180A9800235623E5EBCDA41B3E20E1CD3C0A7EB723CA830AF2A30AD6D8 -:180AB0007F4F11EC041A13B7F2B50A0DC2B50AE67FCD3C0A1A13B7F2EE -:180AC800BF0AC3A60AE52AF83022F630E1C9E5D52AF63011FFFFED5A51 -:180AE00022F630D1E1F0E52AF83022F630CDC01EFE03CAF90AE1C3D6A2 -:180AF8000A2AF83022F630C35D043E64327B31CD690DC1E5CD520D2267 -:180B1000773121020039CD1007D1C2320B09D52B562B5E2323E52A7761 -:180B280031CD2B0AE1C2160BD1F9EB0E08CD4007E52A7731E3E52A0C2A -:180B400031E3CD2B10CD310AA6CD2810E5CD561AE1C5D5010081515A04 -:180B58007EFEAB3E01C26E0BCDBB0BCD2810E5CD561ACD0A1AE1C5D5BE -:180B7000F533E52A7E31E30681C533CDE60B227E317EFE3ACA9B0BB7B9 -:180B8800C26307237E23B6CA0D0C235E2356EB220C31EBCDBB0B117B7E -:180BA0000BD5C8D680DA690DFE25D26307074F0600EB210B06094E239D -:180BB80046C5EB237EFE3AD0FE20CABB0BFE303F3C3DC9EB2A0E31CA0B -:180BD000E00BEBCD870CE5CD4F086069D1D2280D2B228C31EBC9DFC8C8 -:180BE800D7FE1B2811FE03280DFE13C0D7FE11C8FE03280718F63EFF9C -:180C000032FD30C0F6C0227E3121F6FFC12A0C31F57DA43CCA200C228E -:180C180082312A7E31228431AF32F530CD560EF1210607C29707C3AE3A -:180C3000072A84317CB51E20CA7707EB2A8231220C31EBC9CD8917C007 -:180C480032F130C9E52AFA3006004F0922FA30E1C97EFE41D8FE5B3FBE -:180C6000C9CDBB0BCD2810CD0A1AFA820C3A9731FE90DAB21A0180905B -:180C7800110000E5CD851AE151C81E08C377072B110000CDBB0BD0E51D -:180C9000F5219819CD2B0ADA6307626B19291929F1D6305F160019EB7E -:180CA800E1C38B0CCA7F08CD640C2BCDBB0BE52A5F31CACF0CE1CD318A -:180CC0000A2CD5CD640C2BCDBB0BC26307E3EB7D935F7C9A57DA580707 -:180CD800E52A863101280009CD2B0AD25807EB220A31E1225F31E1C35A -:180CF0007F08CA7B08CD7F08017B0BC30E0D0E03CD4007C1E5E52A0C79 -:180D080031E33E8CF533C5CD870CCD540DE52A0C31CD2B0AE123DC52FA -:180D200008D44F0860692BD81E0EC37707C016FFCD0C07F9FE8C1E04F5 -:180D3800C27707E1220C31237CB5C24C0D3A7C31B7C2AD07217B0BE316 -:180D50003EE1013A0E0006007948477EB7C8B8C823FE22CA580DC35B08 -:180D68000DCD1E12CD310AB4D53A5D31F5CD3A10F1E3227E311FCD2D46 -:180D800010CABC0DE52A9431E523235E23562A0E31CD2B0AD2AB0D2AC3 -:180D98000A31CD2B0AD1D2B30D216F31CD2B0AD2B30D3ED1CD6216EB0F -:180DB000CD9B14CD6216E1CD651AE1C9E5CD621AD1E1C9CD89177E47B8 -:180DC800FE8CCAD20DCD310A882B4B0D78CAA30BCD880CFE2CC0C3D3FC -:180DE0000DCD3A107EFE88CAEF0DCD310AA92BCD2B10CD0A1ACA540D0D -:180DF800CDBB0BDA0F0DC3A20B2BCDBB0BCA630EC8FEA5CA960EFEA872 -:180E1000CA960EE5FE2CCA7F0EFE3BCAB90EC1CD3A10E53A5D31B7C22E -:180E28004F0ECDAF1BCDBF1436202A9431342A94313AF2304704CA4BFA -:180E40000E043A5B31863DB8D4630ECD0415AFC40415E1C3010E3A5B48 -:180E580031B7C8C3630E36002110313E0DCD3C0A3E0ACD3C0AAF325B11 -:180E7000313AF1303DC8F5AFCD3C0AF1C3740E3AF330473A5B31B8D4F6 -:180E8800630ED2B90ED60ED28D0E2FC3AE0EF5CD8617CD310A292BF19D -:180EA000D6A8E5CAA90E3A5B312F83D2B90E3C473E20CD3C0A05C2B2D8 -:180EB8000EE1CDBB0BC3080E3F5265646F2066726F6D207374617274DC -:180ED0000D0A003A7D31B7C25D07C121C00ECD0115C3AE08CD6C147E57 -:180EE800FE223E0032F530C2FE0ECDC014CD310A3BE5CD04153EE5CDD0 -:180F0000B208C1DA0A0C237EB72BC5CA510D362CC3180FE52A8C31F6F0 -:180F1800AF327D31E3C3240FCD310A2CCD1E12E3D57EFE2CCA4C0F3A69 -:180F30007D31B7C2B90F3E3FCD3C0ACDB208D1C1DA0A0C237EB72BC5D9 -:180F4800CA510DD53A5D31B7CA760FCDBB0B5747FE22CA6A0F3A7D314A -:180F6000B757CA670F163A062C2BCDC314EB21810FE3D5C3840DCDBBAA -:180F78000BCD111BE3CD621AE12BCDBB0BCA8D0FFE2CC2D30EE32BCD84 -:180F9000BB0BC2200FD13A7D31B7EBC2E10BD5B621A80FC40115E1C9A2 -:180FA8003F45787472612069676E6F7265640D0A00CD520DB7C2D20F49 -:180FC000237E23B61E06CA7707235E2356EB227931EBCDBB0BFE83C2C1 -:180FD800B90FC34C0F110000C41E12227E31CD0C07C26907F9D57E23C4 -:180FF000F5D5CD481AE3E5CDB517E1CD621AE1CD591AE5CD851AE1C151 -:1810080090CD591ACA1810EB220C316960C3770BF92A7E317EFE2CC27A -:181020007B0BCDBB0BCDE00FCD3A10F6373A5D318FB7E8C37507CD316C -:181038000A282B1600D50E01CD4007CDB1102280312A8031C178FE784A -:18105000D42B107E1600D6B3DA7210FE03D27210FE0117AABA57DA639D -:1810680007227531CDBB0BC356107AB7C299117E227531D6ACD8FE07A3 -:18108000D05F3A5D313DB37BCAF71507835F215506197856BAD023CD5A -:181098002B10C5014910C5434ACD3B1A58514E234623C52A7531C33D5A -:1810B00010AF325D31CDBB0B1E24CA7707DA111BCD590CD21811FE2635 -:1810C8002012CDBB0BFE48CA551FFE42CAC51F1E02CA7707FEACCAB14C -:1810E00010FE2ECA111BFEADCA0711FE22CAC014FEAACAF911FEA7CA90 -:1810F8002414D6B6D22911CD3610CD310A29C9167DCD3D102A8031E596 -:18111000CD331ACD2B10E1C9CD1E12E5EB2294313A5D31B7CC481AE1B9 -:18112800C90600074FC5CDBB0B79FE31DA5011CD3610CD310A2CCD2C0F -:1811400010EB2A9431E3E5EBCD8917EBE3C35811CDFF10E3111311D5CA -:1811580001B404094E236669E915FEADC8FE2DC814FE2BC8FEACC82B77 -:18117000C9F6AFF5CD2B10CD6D0CF1EBC1E3EBCD4B1AF5CD6D0CF1C12C -:181188007921E213C29411A34F78A2E9B34F78B2E921AB113A5D311F8B -:1811A0007A175F166478BAD0C39A10AD1179B71FC1D1F5CD2D1021EFB0 -:1811B80011E5CA851AAF325D31D5CD44167E23234E2346D1C5F5CD483A -:1811D00016CD591AF157E17BB2C87AD601D8AFBB3CD0151D0ABE2303D4 -:1811E800CAD7113FC3151A3C8FC1A0C6FF9FC31C1A165ACD3D10CD2B01 -:1812000010CD6D0C7B2F4F7A2FCDE213C1C349102BCDBB0BC8CD310AB1 -:181218002C011012C5F6AF325C3146CD590CDA6307AF4F325D31CDBB44 -:181230000BDA3A12CD590CDA47124FCDBB0BDA3B12CD590CD23B12D6E0 -:1812480024C256123C325D310F814FCDBB0B3A7B313DCA0313F2661265 -:181260007ED628CADB12AF327B31E550592A8E31CD2B0A119031CA4B56 -:18127800192A8831EB2A8631CD2B0ACA9912799623C28E12789623CA90 -:18129000CD1223232323C38012E1E3D5111B11CD2B0AD1CAD012E3E569 -:1812A800C50106002A8A31E509C1E5CD2F07E1228A3160692288312B59 -:1812C0003600CD2B0AC2BF12D173237223EBE1C932973121FF062294E4 -:1812D80031E1C9E52A5C31E357D5C5CD610CC1F1EBE3E5EB3C577EFE1A -:1812F0002CCAE112CD310A29228031E1225C311E00D511E5F52A8831A8 -:181308003E19EB2A8A31EBCD2B0ACA3B137EB923C21D137EB8235E237B -:181320005623C209133A5C31B7C26C07F1444DCA4B1996CA99131E10C1 -:18133800C37707110400F1CA820C712370234FCD4007232322753171F5 -:18135000233A5C311779010B00D25E13C10371237023F5E5CDF61AEB2F -:18136800E1F13DC25613F5424BEB19DA5807CD4907228A312B3600CD4C -:181380002B0AC27C1303572A75315EEB2909EB2B2B73237223F1DABD36 -:1813980013474F7E2316E15E235623E3F5CD2B0AD23613E5CDF61AD17A -:1813B00019F13D444DC29E132929C109EB2A8031C92A8A31EB2100003E -:1813C800393A5D31B7CADD13CD4416CD44152A0A31EB2A73317D934FD1 -:1813E0007C9A41501E00215D31730690C3211A3A5B3147AFC3E313CD38 -:1813F8007A14CD6C1401520DC5D5CD310A28CD1E12E5EB2B562B5EE120 -:18141000CD2B10CD310A29CD310AB4444DE3712370C3B914CD7A14D597 -:18142800CDFF10CD2B10E35E2356237AB3CA6F077E23666FE52A8E313A -:18144000E3228E312A9231E52A9031E5219031D5CD621AE1CD28102B1D -:18145800CDBB0BC26307E1229031E1229231E1228E31E1C9E52A0C317B -:18147000237CB5E1C01E16C37707CD310AA73E80327B31B647CD2312B0 -:18148800C32B10CD2B10CDAF1BCDBF14CD4416019F16C57E2323E5CDF7 -:1814A0001A15E14E2346CDB314E56FCD3716D1C9CD1A15216F31E577B8 -:1814B8002323732372E1C92B062250E50EFF237E0CB7CAD514BACAD51F -:1814D00014B8C2C614FE22CCBB0BE323EB79CDB314116F312A6131225D -:1814E80094313E01325D31CD651ACD2B0A226131E17EC01E1EC377078A -:1815000023CDBF14CD4416CD591A1C1DC80ACD3C0AFE0DCC6D0E03C373 -:181518000B15B70EF1F52A0A31EB2A73312F4F06FF0923CD2B0ADA380F -:181530001522733123EBF1C9F11E1ACA7707BFF5011C15C52A5F312208 -:181548007331210000E52A0A31E5216331EB2A6131EBCD2B0A015515E3 -:18156000C2A9152A8631EB2A8831EBCD2B0ACA7C157E2323B7CDAC15F3 -:18157800C36615C1EB2A8A31EBCD2B0ACAD215CD591A7BE509B7F27B21 -:1815900015227531E14E0600090923EB2A7531EBCD2B0ACA7C15019B5D -:1815A80015C5F6807E23235E235623F0B7C8444D2A7331CD2B0A606984 -:1815C000D8E1E3CD2B0AE3E56069D0C1F1F1E5D5C5C9D1E17DB4C82B53 -:1815D800462B4EE52B2B6E26000950592B444D2A7331CD3207E17123B6 -:1815F0007069602BC34715C5E52A9431E3CDB110E3CD2C107EE52A9449 -:1816080031E5861E1CDA7707CDB014D1CD4816E3CD4716E52A7131EB66 -:18162000CD2E16CD2E16214610E3E5C3E114E1E37E23234E23466F2CBF -:181638002DC80A120313C33816CD2C102A9431EBCD6216EBC0D5505911 -:181650001B4E2A7331CD2B0AC260164709227331E1C92A61312B462BF9 -:181668004E2B2BCD2B0AC0226131C901F213C5CD4116AF57325D317E54 -:18168000B7C901F213C5CD7716CA820C23235E23561AC93E01CDB01485 -:18169800CD8C172A713173C1C3E114CD3C17AFE34FE57EB8DAB11678DD -:1816B000110E00C5CD1A15C1E1E5232346236668060009444DCDB3140A -:1816C8006FCD3716D1CD4816C3E114CD3C17D1D51A90C3A716EB7ECDA7 -:1816E00041170405CA820CC51EFFFE29CAF616CD310A2CCD8917CD31BB -:1816F8000A29F1E301A916C53DBE0600D04F7E91BB47D843C9CD7716DF -:18171000CA2A185F23237E23666FE5194672E3C57EFE24C22B17CD5576 -:181728001F180DFE25C23517CDC51F1803CD111BC1E170C9EBCD310AA1 -:1817400029C1D1C543C9CD8C1732EF30CDEE30C3F213CD7617C3B6308E -:18175800CD7617F51E002BCDBB0BCA6C17CD310A2CCD8917C1CDEE30B4 -:18177000ABA0CA6D17C9CD891732EF3032B730CD310A2CC38917CDBB09 -:181788000BCD2810CD670C7AB7C2820C2BCDBB0B7BC9CD6D0C1AC3F261 -:1817A00013CD2810CD6D0CD5CD310A2CCD8917D112C921881CCD591AAC -:1817B800C3C417CD591A21C1D1CD331A78B7C83A9731B7CA4B1A90D22D -:1817D000DE172F3CEBCD3B1AEBCD4B1AC1D1FE19D0F5CD701A67F1CD8D -:1817E8008918B4219431F20418CD6918D24A182334CA72072E01CD9FE9 -:1818000018C34A18AF90477E9B5F237E9A57237E994FDC75186863AF97 -:181818004779B7C237184A54656F78D608FEE0C21818AF329731C90521 -:18183000297A1757798F4FF22F18785C45B7CA4A182197318677D22A21 -:1818480018C878219731B7FC5C1846237EE680A94FC34B1A1CC014C003 -:181860000CC00E8034C0C372077E835F237E8A57237E894FC9219831D8 -:181878007E2F77AF6F90477D9B5F7D9A577D994FC90600D608DA9818BE -:18189000435A510E00C38B18C6096FAF2DC8791F4F7A1F577B1F5F78B4 -:1818A8001F47C39B180000008103AA561980F122768045AA3882CD0AA6 -:1818C0001AB7EA820C2197317E01358011F30490F570D5C5CDC417C1AA -:1818D800D104CD601921AD18CDBB1721B118CD521D018080110000CD53 -:1818F000C417F1CD851B01318011187221C1D1CD0A1AC82E00CDC81912 -:181908007932A631EB22A7310100005058211518E5212119E5E52194AA -:18192000317E23B7CA4D19E52E081F6779D23B19E52AA73119EBE13AB0 -:18193800A631891F4F7A1F577B1F5F781F472D7CC22A19E1C9435A51BC -:181950004FC9CD3B1A012084110000CD4B1AC1D1CD0A1ACA66072EFF76 -:18196800CDC81934342B7E32C2302B7E32BE302B7E32BA3041EBAF4FCC -:18198000575F32C530E5C57DCDB930DE003FD2981932C530F1F137D2E3 -:18199800C1E1793C3D1FFA4B18177B175F7A175779174F297817473A1F -:1819B000C5301732C53079B2B3C28519E521973135E1C28519C372072E -:1819C80078B7CAEC197D219731AE80471FA878F2EB19C68077CA4B190E -:1819E000CD701A772BC9CD0A1A2FE1B7E1F22A18C37207CD561A78B7B8 -:1819F800C8C602DA720747CDC41721973134C0C372073A9731B7C83A31 -:181A10009631FE2F179FC03CC9CD0A1A06881100002197314F70060011 -:181A280023368017C31218CD0A1AF02196317EEE8077C9EB2A9431E317 -:181A4000E52A9631E3E5EBC9CD591AEB2294316069229631EBC921940F -:181A5800315E2356234E234623C911943106041A77132305C2671AC9F0 -:181A70002196317E07371F773F1F2323777907371F4F1FAEC978B7CA55 -:181A88000A1A21131AE5CD0A1A79C8219631AE79F8CD9F1A1FA9C9237C -:181AA00078BEC02B79BEC02B7ABEC02B7B96C0E1E1C9474F575FB7C8A1 -:181AB800E5CD561ACD701AAE67FCD61A3E9890CD89187C17DC5C1806DF -:181AD00000DC7518E1C91B7AA33CC00BC92197317EFE983A9431D07E99 -:181AE800CDB21A36987BF57917CD1218F1C921000078B1C83E1029DA6B -:181B00003613EB29EBD20C1B09DA36133DC2FE1AC9FE2DF5CA1D1BFE60 -:181B18002BCA1D1B2BCD2A1847575F2F4FCDBB0BDA6E1BFE2ECA491B83 -:181B3000FE45C24D1BCDBB0BCD6111CDBB0BDA901B14C24D1BAF935F67 -:181B48000C0CCA251BE57B90F4661BF25C1BF5CD5219F13CC2501BD13D -:181B6000F1CC331AEBC9C8F5CDF319F13DC9D557788947C5E5D5CDF36F -:181B780019F1D630CD851BE1C1D1C3251BCD3B1ACD1C1AC1D1C3C4170D -:181B90007B0707830786D6305FC33B1BE521FB06CD0115E1EBAF069823 -:181BA800CD211A210015E5219931E5CD0A1A3620F2BD1B362D23363035 -:181BC000CA731CE5FC331AAFF5CD791C01439111F84FCD851AB7E2EA64 -:181BD8001BF1CD671BF5C3CC1BCD5219F13CF5CD791CCDB2173CCDB2EE -:181BF0001ACD4B1A010603F1813CFA061CFE08D2061C3C473E023D3D86 -:181C0800E1F5118C1C05C2171C362E2336302305362ECC601AC5E5D5FD -:181C2000CD561AE1062F047B965F237A9E5723799E4F2B2BD2261CCD93 -:181C3800691823CD4B1AEBE17023C10DC2171C05CA571C2B7EFE30CAB9 -:181C50004B1CFE2EC4601AF1CA761C364523362BF2671C362D2F3C0616 -:181C68002F04D60AD2691CC63A237023772371E1C901749411F723CD8E -:181C8000851AB7E1E2E11BE900000080A08601102700E8030064000021 -:181C98000A000001000021331AE3E9CD3B1A21881CCD481AC1D1CD0A70 -:181CB0001A78CAF11CF2BC1CB7CA6607B7CA2B18D5C579F67FCD561A72 -:181CC800F2D91CD5C5CDDD1AC1D1F5CD851AE17C1FE1229631E12294EF -:181CE00031DC9E1CCC331AD5C5CDBE18C1D1CDFF18CD3B1A013881116C -:181CF8003BAACDFF183A9731FE88D2E619CDDD1AC680C602DAE619F512 -:181D100021AD18CDB517CDF618F1C1D1F5CDC117CD331A21311DCD618D -:181D28001D110000C14AC3FF1808402E9474704F2E776E02887AE6A0B6 -:181D40002A7C50AAAA7EFFFF7F7F0000808100000081CD3B1A11FD18FD -:181D5800D5E5CD561ACDFF18E1CD3B1A7E23CD481A06F1C1D13DC8D562 -:181D7000C5F5E5CDFF18E1CD591AE5CDC417E1C36A1DCD0A1A21C930F4 -:181D8800FAE31D21EA30CD481A21C930C886E6070600772387874F0984 -:181DA000CD591ACDFF183AC8303CE6030600FE018832C83021E71D874D -:181DB800874F09CDB517CD561A7B59EE4F4F36802B46368021C73034D5 -:181DD0007ED6ABC2DA1D770C151CCD151821EA30C3621A772B772B7760 -:181DE800C3BE1D68B1466899E9926910D1756821411ECDB517CD3B1A08 -:181E000001498311DB0FCD4B1AC1D1CD6019CD3B1ACDDD1AC1D1CDC1F2 -:181E18001721451ECDBB17CD0A1A37F22D1ECDB217CD0A1AB7F5F433B9 -:181E30001A21451ECDB517F1D4331A21491EC3521DDB0F4981000000E3 -:181E48007F05BAD71E866426998758342387E05DA586DA0F4983CD3BC4 -:181E60001ACDFD1DC1E1CD3B1AEBCD4B1ACDF71DC35E19CD0A1AFC9EE2 -:181E78001CFC331A3A9731FE81DA901E0100815159CD601921BB17E59A -:181E9000219A1ECD521D21411EC9094AD73B78026E847BFEC12F7C74B2 -:181EA800319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F00000081C9FA -:181EC000D7C93E0CC3FC1FCD89177B32F230C9CD2810CD6D0CED53F6BC -:181ED80030ED53F830C9CD6D0CD5E146237EC3E313CD2810CD6D0CD5D5 -:181EF000CD310A2CCD2810CD6D0CE3732372E1C9CD2B10CD6D0CC52192 -:181F080099317AFE00280CCD381F78FE302802702371237BCD381F7A17 -:181F2000FE00200578FE30280270237123AF772377C1219931C39114BB -:181F380047E60FFE0A3802C607C6304F780F0F0F0FE60FFE0A3802C650 -:181F500007C63047C9EB210000CD6E1FDA8E1F1805CD6E1F381F29295F -:181F68002929B56F18F3131AFE20CA6E1FD630D8FE0A3805D607FE0A36 -:181F8000D8FE103FC9EB7A4BE5CDE213E1C91E26C37707CD2B10CD6D93 -:181F98000CC521993106110578FE012808CB13CB1230F41804CB13CB0E -:181FB000123E30CE0077230520F3AF772377C1219931C39114EB210039 -:181FC80000CDE21FDAF01FD63029B56FCDE21F30F6EB7A4BE5CDE213AC -:181FE000E1C9131AFE20CAE21FFE30D8FE323FC91E28C37707DD21FF67 -:181FF800FFC3C703C30800C300003E0032FD30C3CE03ED45F5A0C1B846 -:092010003E00C9CD3C0AC3630E79 -:00000001FF +:0430040000000000C8 +:18000000F3C3940000000000C332000000000000C31B000000000000CB +:18001800C35C003A0030FE002008CD630028FBDB81C9CD6A0028FBDB74 +:1800300083C9F53A0030FE00200D1801F5CD500028FBF1D381C9F5CDC4 +:18004800560028FBF1D383C9DB800FCB47C9DB820FCB47C93A0030FE23 +:18006000002007DB80E601FE00C9DB82E601FE00C9D7FE0A28FBFE1B32 +:1800780020023E03C9FE0D280AFE0C2804FE203801CFC93E0DCF3E0A80 +:18009000CF3E0DC93128303E95D380D3823E00320030216503CD1B015F +:1800A8003E01320030216503CD1B01CD6300280F3E00320030CD1B003E +:1800C000FE20C2B3001814CD6A0028E73E01320030CD1B00FE20C2B307 +:1800D8000018003E0CCD3C00CD4600CD2201219602CD1B0121EC00E50E +:1800F000CD22013E3ECFCD7100FE2038F9FE3ACA9901CD7D00E65FFE07 +:1801080042CADA01FE47CA9301FE58CAF1013E3FCF18D57EB7C8CF231B +:1801200018F93E0DCF3E0ACFC9CD7100FE03C8FE2038F6C9CD29014762 +:18013800CD29014FCD73014F7B915F79C9210000CD8C01FE0D200E3741 +:18015000C9210000CD8C01FE0DC8FE2CC8FE0328EE29292929D630FECF +:180168000A3802D607E60F856F18E178D630FE0A3802D60707070707C3 +:180180004779D630FE0A3802D60780C9CD7100CD7D00C9CD4501D8E518 +:18019800C91E00CD340157CD340167CD34016FCD3401FE012009CD340A +:1801B000017BA7281E18157AA7280BCD340177233E2ECF1518F1CD3457 +:1801C800017BA7C8215403CD1B01C9218A03CD1B01C9214203CD1B015B +:1801E000CD2901C8E65FFE43CA9503FE57CA9803C9210302CD1B01CD01 +:1801F8002901C8E65FFE59CA2402C90D0A426F6F742043502F4D3F008F +:180210000D0A4C6F6164696E672043502F4D2E2E2E0D0A00211002CD31 +:180228001B0106183E003204303205303206303207302100D022023063 +:18024000CD6E021100022A0230192202303A04303C32043010EA3A0049 +:1802580030F52AFEFFE93A0630D38C3A0530D38B3A0430D38AC9F5C56F +:18027000E5DB89FE8020FACD5E023E00D3890E040680DB89FEE020FADA +:18028800DB8877230520F30D20EEE1C1F1C943502F4D20426F6F7420EF +:1802A000524F4D20322E3020627920472E20536561726C650D0A0D0A6E +:1802B8004243206F72204257202D20524F4D20424153494320436F6CD4 +:1802D000642F5761726D0D0A5820202020202020202D20426F6F74207C +:1802E80043502F4D20286C6F61642024443030302D2446464646290D50 +:180300000A3A6E6E6E6E2E2E2E202D204C6F616420496E74656C2D48E1 +:1803180065782066696C65207265636F72640D0A476E6E6E6E2020201B +:18033000202D2052756E206C6F63206E6E6E6E0D0A000D0A436F6C642D +:18034800206F72207761726D3F0D0A00436865636B73756D20657272D3 +:180360006F720D0A000C5072657373205B53504143455D20746F2061AC +:180378006374697661746520636F6E736F6C650D0A00436F6D706C65F3 +:1803900074650D0A00C39B03C33904DD210000C3A6034C0CC21321B09C +:1803A80030F9C3E11F117306066321B0301A77231305C2B503F9CD74DD +:1803C00008CD420E325A3132A931218804CDE014CD9108CD9A0BB7C278 +:1803D800EF03210D32237CB5CA01047E472F77BE70CADD03C30104CDC0 +:1803F000660CB7C24207EB2B3ED94677BE70C2CA032B110C32CD0A0ABF +:18040800DACA0311CEFF225F3119220A31CD4F082A0A3111EFFF19117D +:18042000A9317D936F7C9A67E5215104CDE014E1CD831B214204CDE072 +:1804380014311631CD7408C38D0720427974657320667265650D0A0080 +:18045000005A38302042415349432056657220342E37620D0A436F70AF +:18046800797269676874202843292031393738206279204D6963726F23 +:18048000736F66740D0A00004D656D6F727920746F7000F819BC1A0EB0 +:180498001AB330A0132517CE13821C611D9D18D01CD61DDC1D3D1E5229 +:1804B0001E7917BD1E013152166A14EC1661167216DF1E721F8216B2BA +:1804C80016BC16C54E44C64F52CE455854C4415441C94E505554C44900 +:1804E0004DD2454144CC4554C74F544FD2554EC946D24553544F5245D5 +:1804F800C74F535542D2455455524ED2454DD3544F50CF5554CF4ECEFF +:18051000554C4CD7414954C44546D04F4B45C44F4B45D3435245454E50 +:18052800CC494E4553C34C53D749445448CD4F4E49544F52D34554D278 +:1805400045534554D052494E54C34F4E54CC495354C34C454152C34CFF +:180558004F4144C353415645CE4557D4414228D44FC64ED3504328D443 +:1805700048454ECE4F54D3544550ABADAAAFDEC14E44CF52BEBDBCD35E +:18058800474EC94E54C14253D55352C65245C94E50D04F53D35152D20D +:1805A0004E44CC4F47C55850C34F53D3494ED4414EC1544ED045454BA8 +:1805B800C445454BD04F494E54CC454ED3545224D6414CC15343C348C7 +:1805D0005224C8455824C2494E24CC45465424D24947485424CD49444C +:1805E8002480E40BE10ABC0F310DC30EF811F20E480DEE0CD10CC00DA1 +:18060000AA0BDD0C0C0D330DE20B3117A20D230C3717D6138017C81E24 +:18061800330DAE1EA11EA61EDE1F04310731E40D100C560A8B0C330D8D +:18063000330D4E08796A1B799E177CDC187C3D197F8B1C505111465040 +:18064800114E46534E52474F4446434F564F4D554C425344442F3049F8 +:1806600044544D4F534C535354434E55464D4F4858424EC33904C36199 +:180678000CD300C9D6006F7CDE006778DE00473E00C9000000354ACACF +:1806900099391C76982295B3980ADD479853D199990A1A9F9865BCCDEF +:1806A80098D6773E9852C74F80DB00C901FF1C000014001400000000AF +:1806C00000C38709C30000C30000C300000D32FEFFAA31204572726FB7 +:1806D800720020696E20004F6B0D0A0000427265616B00210400397EEF +:1806F00023FE81C04E234623E569607AB3EBCA0507EBCD0A0A010D0040 +:18070800E1C809C3EF06CD2807C5E3C1CD0A0A7E02C80B2BC31407E5E8 +:180720002A8A31060009093EE53ED0956F3EFF9CDA37076739E1D81E27 +:180738000CC356072A7931220C311E02011E14011E00011E12011E2266 +:18075000011E0A011E18CD740832F530CD350E214906573E3FCD1B0A4B +:18076800197ECD1B0ACD9A0BCD1B0A21D306CDE0142A0C3111FEFFCD8F +:180780000A0ACAA6037CA53CC47B1B3EC1AF32F530CD350E21DF06CD3B +:18079800E01421FFFF220C31CD8709DA9A07CD9A0B3C3DCA9A07F5CDE7 +:1807B000660CD5CD9E0847D1F1D27A0BD5C5AF327C31CD9A0BB7F5CD04 +:1807C8002E08DAD307F1F5CA070DB7C5D2EA07EB2A86311A020313CD61 +:1807E0000A0AC2DB076069228631D1F1CA11082A8631E3C109E5CD0EB4 +:1807F80007E1228631EB74D12323732372231111311A772313B7C209EB +:1808100008CD5A0823EB626B7E23B6CA9A07232323AFBE23C22208EB2C +:18082800732372C316082A0E31444D7E23B62BC823237E23666FCD0AF8 +:180840000A60697E23666F3FC83FD0C33108C02A0E31AF772377232217 +:1808580086312A0E312B227E312A5F31227331AFCDAA0B2A8631228830 +:1808700031228A31C12A0A31F9216331226131AF6F67228431327B31A0 +:18088800228E31E5C52A7E31C93E3FCD1B0A3E20CD1B0AC3FE30AF329A +:1808A0005E310E051111317EFE20CA260947FE22CA4609B7CA4D093A25 +:1808B8005E31B77EC22609FE3F3E9ECA26097EFE30DAD108FE3CDA26C8 +:1808D00009D511CA04C5012209C5067F7EFE61DAEA08FE7BD2EA08E64C +:1808E8005F774EEB23B6F2EC08047EE67FC8B9C2EC08EBE5131AB7FA5E +:180900001E094F78FE88C20D09CD9A0B2B237EFE61DA1609E65FB9CA35 +:18091800FC08E1C3EA0848F1EBC9EB79C1D12312130CD63ACA3409FEE1 +:1809300049C23709325E31D654C2A708477EB7CA4D09B8CA2609231286 +:180948000C13C33D092110311213121312C93AF430B73E0032F430C27D +:180960006A0905CA8709CD1B0A3E052BCA7E097ECD1B0AC39009052B00 +:18097800CD1B0AC29009CD1B0ACD420EC387092111310601AF32F43049 +:18099000CD450A4FFE7FCA56093AF430B7CAA9093E00CD1B0AAF32F4A8 +:1809A8003079FE07CAED09FE03CC420E37C8FE0DCA3D0EFE15CA810926 +:1809C000FE40CA7E09FE5FCA7609FE08CA7609FE12C2E809C5D5E53623 +:1809D80000CDF21F211131CDE014E1D1C1C39009FE20DA900978FE49E6 +:1809F0003E07D2020A7971327C312304CD1B0AC39009CD1B0A3E08C393 +:180A0800FC097C92C07D93C97EE3BE23E3CA9A0BC34207F53AF530B77F +:180A2000C21515F1C5F5FE20DA3F0A3AF230473A5B3104CA3B0A05B8AD +:180A3800CC420E3C325B31F1C1CDDB1FC9CD9F1EE67FFE0FC03AF53033 +:180A50002F32F530AFC9CD660CC0C1CD2E08C5CDAC0AE14E2346237852 +:180A6800B1CA8D07CDB50ACDC50BC5CD420E5E235623E5EBCD831B3EE9 +:180A800020E1CD1B0A7EB723CA620AF2820AD67F4F11CB041A13B7F205 +:180A9800940A0DC2940AE67FCD1B0A1A13B7F29E0AC3850AE52AF830DD +:180AB00022F630E1C9E5D52AF63011FFFFED5A22F630D1E1F0E52AF8EB +:180AC8003022F630CD9F1EFE03CAD80AE1C3B50A2AF83022F630C33C6B +:180AE000043E64327B31CD480DC1E5CD310D22773121020039CDEF06BF +:180AF800D1C2110B09D52B562B5E2323E52A7731CD0A0AE1C2F50AD1FE +:180B1000F9EB0E08CD1F07E52A7731E3E52A0C31E3CD0A10CD100AA6A3 +:180B2800CD0710E5CD351AE1C5D5010081515A7EFEAB3E01C24D0BCDDB +:180B40009A0BCD0710E5CD351ACDE919E1C5D5F533E52A7E31E3068179 +:180B5800C533CDC50B227E317EFE3ACA7A0BB7C24207237E23B6CAEC28 +:180B70000B235E2356EB220C31EBCD9A0B115A0BD5C8D680DA480DFE2B +:180B880025D24207074F0600EB21EA05094E2346C5EB237EFE3AD0FEA7 +:180BA00020CA9A0BFE303F3C3DC9EB2A0E31CABF0BEBCD660CE5CD2E0D +:180BB800086069D1D2070D2B228C31EBC9DFC8D7FE1B2811FE03280DD9 +:180BD000FE13C0D7FE11C8FE03280718F63EFF32FD30C0F6C0227E316D +:180BE80021F6FFC12A0C31F57DA43CCAFF0B2282312A7E31228431AF5D +:180C000032F530CD350EF121E506C27607C38D072A84317CB51E20CACA +:180C18005607EB2A8231220C31EBC9CD6817C032F130C9E52AFA300625 +:180C3000004F0922FA30E1C97EFE41D8FE5B3FC9CD9A0BCD0710CDE95C +:180C480019FA610C3A9731FE90DA911A018090110000E5CD641AE1517B +:180C6000C81E08C356072B110000CD9A0BD0E5F5219819CD0A0ADA4247 +:180C780007626B19291929F1D6305F160019EBE1C36A0CCA5E08CD4342 +:180C90000C2BCD9A0BE52A5F31CAAE0CE1CD100A2CD5CD430C2BCD9A09 +:180CA8000BC24207E3EB7D935F7C9A57DA3707E52A863101280009CD97 +:180CC0000A0AD23707EB220A31E1225F31E1C35E08CA5A08CD5E0801B3 +:180CD8005A0BC3ED0C0E03CD1F07C1E5E52A0C31E33E8CF533C5CD6620 +:180CF0000CCD330DE52A0C31CD0A0AE123DC3108D42E0860692BD81E99 +:180D08000EC35607C016FFCDEB06F9FE8C1E04C25607E1220C31237C6F +:180D2000B5C22B0D3A7C31B7C28C07215A0BE33EE1013A0E00060079C9 +:180D380048477EB7C8B8C823FE22CA370DC33A0DCDFD11CD100AB4D5F1 +:180D50003A5D31F5CD1910F1E3227E311FCD0C10CA9B0DE52A9431E500 +:180D680023235E23562A0E31CD0A0AD28A0D2A0A31CD0A0AD1D2920D1B +:180D8000216F31CD0A0AD2920D3ED1CD4116EBCD7A14CD4116E1CD44B9 +:180D98001AE1C9E5CD411AD1E1C9CD68177E47FE8CCAB10DCD100A8865 +:180DB0002B4B0D78CA820BCD670CFE2CC0C3B20DCD19107EFE88CACE9B +:180DC8000DCD100AA92BCD0A10CDE919CA330DCD9A0BDAEE0CC3810BF6 +:180DE0002BCD9A0BCA420EC8FEA5CA750EFEA8CA750EE5FE2CCA5E0E54 +:180DF800FE3BCA980EC1CD1910E53A5D31B7C22E0ECD8E1BCD9E1436F6 +:180E1000202A9431342A94313AF2304704CA2A0E043A5B31863DB8D4D6 +:180E2800420ECDE314AFC4E314E1C3E00D3A5B31B7C8C3420E360021F4 +:180E400010313E0DCD1B0A3E0ACD1B0AAF325B313AF1303DC8F5AFCDA4 +:180E58001B0AF1C3530E3AF330473A5B31B8D4420ED2980ED60ED26C68 +:180E70000E2FC38D0EF5CD6517CD100A292BF1D6A8E5CA880E3A5B31DC +:180E88002F83D2980E3C473E20CD1B0A05C2910EE1CD9A0BC3E70D3FA6 +:180EA0005265646F2066726F6D2073746172740D0A003A7D31B7C23CDA +:180EB80007C1219F0ECDE014C38D08CD4B147EFE223E0032F530C2DD75 +:180ED0000ECD9F14CD100A3BE5CDE3143EE5CD9108C1DAE90B237EB741 +:180EE8002BC5CA300D362CC3F70EE52A8C31F6AF327D31E3C3030FCDFB +:180F0000100A2CCDFD11E3D57EFE2CCA2B0F3A7D31B7C2980F3E3FCD02 +:180F18001B0ACD9108D1C1DAE90B237EB72BC5CA300DD53A5D31B7CA69 +:180F3000550FCD9A0B5747FE22CA490F3A7D31B757CA460F163A062C5C +:180F48002BCDA214EB21600FE3D5C3630DCD9A0BCDF01AE3CD411AE148 +:180F60002BCD9A0BCA6C0FFE2CC2B20EE32BCD9A0BC2FF0ED13A7D31E3 +:180F7800B7EBC2C00BD5B621870FC4E014E1C93F45787472612069675B +:180F90006E6F7265640D0A00CD310DB7C2B10F237E23B61E06CA560711 +:180FA800235E2356EB227931EBCD9A0BFE83C2980FC32B0F110000C467 +:180FC000FD11227E31CDEB06C24807F9D57E23F5D5CD271AE3E5CD94FB +:180FD80017E1CD411AE1CD381AE5CD641AE1C190CD381ACAF70FEB2283 +:180FF0000C316960C3560BF92A7E317EFE2CC25A0BCD9A0BCDBF0FCD44 +:181008001910F6373A5D318FB7E8C35407CD100A282B1600D50E01CD65 +:181020001F07CD90102280312A8031C178FE78D40A107E1600D6B3DAE3 +:181038005110FE03D25110FE0117AABA57DA4207227531CD9A0BC335E5 +:18105000107AB7C278117E227531D6ACD8FE07D05F3A5D313DB37BCA2B +:18106800D61507835F213406197856BAD023CD0A10C5012810C5434A76 +:18108000CD1A1A58514E234623C52A7531C31C10AF325D31CD9A0B1E51 +:1810980024CA5607DAF01ACD380CD2F710FE262012CD9A0BFE48CA341B +:1810B0001FFE42CAA41F1E02CA5607FEACCA9010FE2ECAF01AFEADCA6C +:1810C800E610FE22CA9F14FEAACAD811FEA7CA0314D6B6D20811CD1543 +:1810E00010CD100A29C9167DCD1C102A8031E5CD121ACD0A10E1C9CD6C +:1810F800FD11E5EB2294313A5D31B7CC271AE1C90600074FC5CD9A0B52 +:1811100079FE31DA2F11CD1510CD100A2CCD0B10EB2A9431E3E5EBCDBE +:181128006817EBE3C33711CDDE10E311F210D5019304094E236669E907 +:1811400015FEADC8FE2DC814FE2BC8FEACC82BC9F6AFF5CD0A10CD4C17 +:181158000CF1EBC1E3EBCD2A1AF5CD4C0CF1C17921C113C27311A34F85 +:1811700078A2E9B34F78B2E9218A113A5D311F7A175F166478BAD0C37D +:1811880079108C1179B71FC1D1F5CD0C1021CE11E5CA641AAF325D31CE +:1811A000D5CD23167E23234E2346D1C5F5CD2716CD381AF157E17BB2D7 +:1811B800C87AD601D8AFBB3CD0151D0ABE2303CAB6113FC3F4193C8F2D +:1811D000C1A0C6FF9FC3FB19165ACD1C10CD0A10CD4C0C7B2F4F7A2F54 +:1811E800CDC113C1C328102BCD9A0BC8CD100A2C01EF11C5F6AF325C21 +:181200003146CD380CDA4207AF4F325D31CD9A0BDA1912CD380CDA26E5 +:18121800124FCD9A0BDA1A12CD380CD21A12D624C235123C325D310FC8 +:18123000814FCD9A0B3A7B313DCAE212F245127ED628CABA12AF327BCC +:1812480031E550592A8E31CD0A0A119031CA2A192A8831EB2A8631CDAA +:181260000A0ACA7812799623C26D12789623CAAC1223232323C35F1222 +:18127800E1E3D511FA10CD0A0AD1CAAF12E3E5C50106002A8A31E50906 +:18129000C1E5CD0E07E1228A3160692288312B3600CD0A0AC29E12D1D7 +:1812A80073237223EBE1C932973121DE06229431E1C9E52A5C31E35708 +:1812C000D5C5CD400CC1F1EBE3E5EB3C577EFE2CCAC012CD100A29220A +:1812D8008031E1225C311E00D511E5F52A88313E19EB2A8A31EBCD0A13 +:1812F0000ACA1A137EB923C2FC127EB8235E235623C2E8123A5C31B72E +:18130800C24B07F1444DCA2A1996CA78131E10C35607110400F1CA61C0 +:181320000C712370234FCD1F07232322753171233A5C311779010B003B +:18133800D23D13C10371237023F5E5CDD51AEBE1F13DC23513F5424B74 +:18135000EB19DA3707CD2807228A312B3600CD0A0AC25B1303572A7525 +:18136800315EEB2909EB2B2B73237223F1DA9C13474F7E2316E15E232C +:181380005623E3F5CD0A0AD21513E5CDD51AD119F13D444DC27D132964 +:1813980029C109EB2A8031C92A8A31EB210000393A5D31B7CABC13CDAC +:1813B0002316CD23152A0A31EB2A73317D934F7C9A41501E00215D31F6 +:1813C800730690C3001A3A5B3147AFC3C213CD5914CD4B1401310DC569 +:1813E000D5CD100A28CDFD11E5EB2B562B5EE1CD0A10CD100A29CD10A7 +:1813F8000AB4444DE3712370C39814CD5914D5CDDE10CD0A10E35E2323 +:1814100056237AB3CA4E077E23666FE52A8E31E3228E312A9231E52AFB +:181428009031E5219031D5CD411AE1CD07102BCD9A0BC24207E1229027 +:1814400031E1229231E1228E31E1C9E52A0C31237CB5E1C01E16C356A3 +:1814580007CD100AA73E80327B31B647CD0212C30A10CD0A10CD8E1B33 +:18147000CD9E14CD2316017E16C57E2323E5CDF914E14E2346CD9214F7 +:18148800E56FCD1616D1C9CDF914216F31E5772323732372E1C92B0645 +:1814A0002250E50EFF237E0CB7CAB414BACAB414B8C2A514FE22CC9AD5 +:1814B8000BE323EB79CD9214116F312A61312294313E01325D31CD44D0 +:1814D0001ACD0A0A226131E17EC01E1EC3560723CD9E14CD2316CD382D +:1814E8001A1C1DC80ACD1B0AFE0DCC4C0E03C3EA14B70EF1F52A0A31D0 +:18150000EB2A73312F4F06FF0923CD0A0ADA171522733123EBF1C9F105 +:181518001E1ACA5607BFF501FB14C52A5F31227331210000E52A0A31E8 +:18153000E5216331EB2A6131EBCD0A0A013415C288152A8631EB2A886F +:1815480031EBCD0A0ACA5B157E2323B7CD8B15C34515C1EB2A8A31EBD3 +:18156000CD0A0ACAB115CD381A7BE509B7F25A15227531E14E0600095C +:181578000923EB2A7531EBCD0A0ACA5B15017A15C5F6807E23235E235E +:181590005623F0B7C8444D2A7331CD0A0A6069D8E1E3CD0A0AE3E560AD +:1815A80069D0C1F1F1E5D5C5C9D1E17DB4C82B462B4EE52B2B6E2600A3 +:1815C0000950592B444D2A7331CD1107E171237069602BC32615C5E571 +:1815D8002A9431E3CD9010E3CD0B107EE52A9431E5861E1CDA5607CDF6 +:1815F0008F14D1CD2716E3CD2616E52A7131EBCD0D16CD0D16212510A7 +:18160800E3E5C3C014E1E37E23234E23466F2C2DC80A120313C317167A +:18162000CD0B102A9431EBCD4116EBC0D550591B4E2A7331CD0A0AC2C9 +:181638003F164709227331E1C92A61312B462B4E2B2BCD0A0AC0226165 +:1816500031C901D113C5CD2016AF57325D317EB7C901D113C5CD561634 +:18166800CA610C23235E23561AC93E01CD8F14CD6B172A713173C1C372 +:18168000C014CD1B17AFE34FE57EB8DA901678110E00C5CDF914C1E12B +:18169800E5232346236668060009444DCD92146FCD1616D1CD2716C3BF +:1816B000C014CD1B17D1D51A90C38616EB7ECD20170405CA610CC51E10 +:1816C800FFFE29CAD516CD100A2CCD6817CD100A29F1E3018816C53D4B +:1816E000BE0600D04F7E91BB47D843C9CD5616CA09185F23237E23664A +:1816F8006FE5194672E3C57EFE24C20A17CD341F180DFE25C21417CD68 +:18171000A41F1803CDF01AC1E170C9EBCD100A29C1D1C543C9CD6B1784 +:1817280032EF30CDEE30C3D113CD5517C3B630CD5517F51E002BCD9A06 +:181740000BCA4B17CD100A2CCD6817C1CDEE30ABA0CA4C17C9CD6817C2 +:1817580032EF3032B730CD100A2CC36817CD9A0BCD0710CD460C7AB714 +:18177000C2610C2BCD9A0B7BC9CD4C0C1AC3D113CD0710CD4C0CD5CDC0 +:18178800100A2CCD6817D112C921671CCD381AC3A317CD381A21C1D1F9 +:1817A000CD121A78B7C83A9731B7CA2A1A90D2BD172F3CEBCD1A1AEB02 +:1817B800CD2A1AC1D1FE19D0F5CD4F1A67F1CD6818B4219431F2E31739 +:1817D000CD4818D229182334CA51072E01CD7E18C32918AF90477E9B13 +:1817E8005F237E9A57237E994FDC54186863AF4779B7C216184A546543 +:181800006F78D608FEE0C2F717AF329731C905297A1757798F4FF20E7E +:1818180018785C45B7CA29182197318677D20918C878219731B7FC3BD5 +:181830001846237EE680A94FC32A1A1CC014C00CC00E8034C0C3510723 +:181848007E835F237E8A57237E894FC92198317E2F77AF6F90477D9B49 +:181860005F7D9A577D994FC90600D608DA7718435A510E00C36A18C621 +:18187800096FAF2DC8791F4F7A1F577B1F5F781F47C37A1800000081B8 +:1818900003AA561980F122768045AA3882CDE919B7EA610C2197317EAE +:1818A80001358011F30490F570D5C5CDA317C1D104CD3F19218C18CD07 +:1818C0009A17219018CD311D018080110000CDA317F1CD641B013180F3 +:1818D80011187221C1D1CDE919C82E00CDA7197932A631EB22A73101F0 +:1818F0000000505821F417E5210019E5E52194317E23B7CA2C19E52EC3 +:18190800081F6779D21A19E52AA73119EBE13AA631891F4F7A1F577B7C +:181920001F5F781F472D7CC20919E1C9435A514FC9CD1A1A012084115F +:181938000000CD2A1AC1D1CDE919CA45072EFFCDA71934342B7E32C250 +:18195000302B7E32BE302B7E32BA3041EBAF4F575F32C530E5C57DCDC6 +:18196800B930DE003FD2771932C530F1F137D2C1E1793C3D1FFA2A18FE +:18198000177B175F7A175779174F297817473AC5301732C53079B2B336 +:18199800C26419E521973135E1C26419C3510778B7CACB197D21973177 +:1819B000AE80471FA878F2CA19C68077CA2A19CD4F1A772BC9CDE9195C +:1819C8002FE1B7E1F20918C35107CD351A78B7C8C602DA510747CDA36D +:1819E0001721973134C0C351073A9731B7C83A9631FE2F179FC03CC9B6 +:1819F800CDE91906881100002197314F70060023368017C3F117CDE94A +:181A100019F02196317EEE8077C9EB2A9431E3E52A9631E3E5EBC9CDC5 +:181A2800381AEB2294316069229631EBC92194315E2356234E23462362 +:181A4000C911943106041A77132305C2461AC92196317E07371F773FB5 +:181A58001F2323777907371F4F1FAEC978B7CAE91921F219E5CDE91904 +:181A700079C8219631AE79F8CD7E1A1FA9C92378BEC02B79BEC02B7A40 +:181A8800BEC02B7B96C0E1E1C9474F575FB7C8E5CD351ACD4F1AAE672A +:181AA000FCB51A3E9890CD68187C17DC3B180600DC5418E1C91B7AA3BE +:181AB8003CC00BC92197317EFE983A9431D07ECD911A36987BF57917B6 +:181AD000CDF117F1C921000078B1C83E1029DA1513EB29EBD2EB1A0905 +:181AE800DA15133DC2DD1AC9FE2DF5CAFC1AFE2BCAFC1A2BCD091847BC +:181B0000575F2F4FCD9A0BDA4D1BFE2ECA281BFE45C22C1BCD9A0BCD21 +:181B18004011CD9A0BDA6F1B14C22C1BAF935F0C0CCA041BE57B90F4EB +:181B3000451BF23B1BF5CD3119F13CC22F1BD1F1CC121AEBC9C8F5CDB8 +:181B4800D219F13DC9D557788947C5E5D5CDD219F1D630CD641BE1C113 +:181B6000D1C3041BCD1A1ACDFB19C1D1C3A3177B0707830786D6305FCB +:181B7800C31A1BE521DA06CDE014E1EBAF0698CD001A21DF14E5219903 +:181B900031E5CDE9193620F29C1B362D233630CA521CE5FC121AAFF584 +:181BA800CD581C01439111F84FCD641AB7E2C91BF1CD461BF5C3AB1B52 +:181BC000CD3119F13CF5CD581CCD91173CCD911ACD2A1A010603F181DD +:181BD8003CFAE51BFE08D2E51B3C473E023D3DE1F5116B1C05C2F61B64 +:181BF000362E2336302305362ECC3F1AC5E5D5CD351AE1062F047B9679 +:181C08005F237A9E5723799E4F2B2BD2051CCD481823CD2A1AEBE17064 +:181C200023C10DC2F61B05CA361C2B7EFE30CA2A1CFE2EC43F1AF1CADC +:181C3800551C364523362BF2461C362D2F3C062F04D60AD2481CC63AB3 +:181C5000237023772371E1C901749411F723CD641AB7E1E2C01BE90054 +:181C6800000080A08601102700E803006400000A000001000021121ADF +:181C8000E3E9CD1A1A21671CCD271AC1D1CDE91978CAD01CF29B1CB7DE +:181C9800CA4507B7CA0A18D5C579F67FCD351AF2B81CD5C5CDBC1AC113 +:181CB000D1F5CD641AE17C1FE1229631E1229431DC7D1CCC121AD5C5F6 +:181CC800CD9D18C1D1CDDE18CD1A1A013881113BAACDDE183A9731FEB9 +:181CE00088D2C519CDBC1AC680C602DAC519F5218C18CD9417CDD5185F +:181CF800F1C1D1F5CDA017CD121A21101DCD401D110000C14AC3DE1892 +:181D100008402E9474704F2E776E02887AE6A02A7C50AAAA7EFFFF7F9C +:181D28007F0000808100000081CD1A1A11DC18D5E5CD351ACDDE18E122 +:181D4000CD1A1A7E23CD271A06F1C1D13DC8D5C5F5E5CDDE18E1CD3830 +:181D58001AE5CDA317E1C3491DCDE91921C930FAC21D21EA30CD271AD8 +:181D700021C930C886E6070600772387874F09CD381ACDDE183AC830EC +:181D88003CE6030600FE018832C83021C61D87874F09CD9417CD351A69 +:181DA0007B59EE4F4F36802B46368021C730347ED6ABC2B91D770C1573 +:181DB8001CCDF41721EA30C3411A772B772B77C39D1D68B1466899E945 +:181DD000926910D1756821201ECD9417CD1A1A01498311DB0FCD2A1A91 +:181DE800C1D1CD3F19CD1A1ACDBC1AC1D1CDA01721241ECD9A17CDE9DB +:181E00001937F20C1ECD9117CDE919B7F5F4121A21241ECD9417F1D4AE +:181E1800121A21281EC3311DDB0F49810000007F05BAD71E866426997E +:181E30008758342387E05DA586DA0F4983CD1A1ACDDC1DC1E1CD1A1A56 +:181E4800EBCD2A1ACDD61DC33D19CDE919FC7D1CFC121A3A9731FE81A0 +:181E6000DA6F1E0100815159CD3F19219A17E521791ECD311D21201EC9 +:181E7800C9094AD73B78026E847BFEC12F7C74319A7D843D5A7DC87F38 +:181E9000917EE4BB4C7E6CAAAA7F00000081C9D7C93E0CC3DB1FCD685D +:181EA800177B32F230C9CD0710CD4C0CED53F630ED53F830C9CD4C0CAE +:181EC000D5E146237EC3C213CD0710CD4C0CD5CD100A2CCD0710CD4CE7 +:181ED8000CE3732372E1C9CD0A10CD4C0CC52199317AFE00280CCD1705 +:181EF0001F78FE302802702371237BCD171F7AFE00200578FE302802D9 +:181F080070237123AF772377C1219931C3701447E60FFE0A3802C6079C +:181F2000C6304F780F0F0F0FE60FFE0A3802C607C63047C9EB2100009A +:181F3800CD4D1FDA6D1F1805CD4D1F381F29292929B56F18F3131AFE47 +:181F500020CA4D1FD630D8FE0A3805D607FE0AD8FE103FC9EB7A4BE598 +:181F6800CDC113E1C91E26C35607CD0A10CD4C0CC52199310611057862 +:181F8000FE012808CB13CB1230F41804CB13CB123E30CE007723052069 +:181F9800F3AF772377C1219931C37014EB210000CDC11FDACF1FD63004 +:181FB00029B56FCDC11F30F6EB7A4BE5CDC113E1C9131AFE20CAC11F24 +:181FC800FE30D8FE323FC91E28C35607DD21FFFFC3A603C30800C30067 +:181FE000003E0032FD30C3AD03ED45F5A0C1B83E00C9CD1B0AC3420E8D +:00000001FF diff --git a/ROMS/Z80/Z80_CPM_BASIC_ROM.vhd b/ROMS/Z80/Z80_CPM_BASIC_ROM.vhd index a7c8021..fdb46d9 100644 --- a/ROMS/Z80/Z80_CPM_BASIC_ROM.vhd +++ b/ROMS/Z80/Z80_CPM_BASIC_ROM.vhd @@ -1,144 +1,144 @@ --- megafunction wizard: %ROM: 1-PORT% --- GENERATION: STANDARD --- VERSION: WM1.0 --- MODULE: altsyncram - --- ============================================================ --- File Name: Z80_CPM_BASIC_ROM.vhd --- Megafunction Name(s): --- altsyncram --- --- Simulation Library Files(s): --- altera_mf --- ============================================================ --- ************************************************************ --- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! --- --- 17.0.0 Build 595 04/25/2017 SJ Lite Edition --- ************************************************************ - - ---Copyright (C) 2017 Intel Corporation. All rights reserved. ---Your use of Intel Corporation's design tools, logic functions ---and other software and tools, and its AMPP partner logic ---functions, and any output files from any of the foregoing ---(including device programming or simulation files), and any ---associated documentation or information are expressly subject ---to the terms and conditions of the Intel Program License ---Subscription Agreement, the Intel Quartus Prime License Agreement, ---the Intel MegaCore Function License Agreement, or other ---applicable license agreement, including, without limitation, ---that your use is for the sole purpose of programming logic ---devices manufactured by Intel and sold by Intel or its ---authorized distributors. Please refer to the applicable ---agreement for further details. - - -LIBRARY ieee; -USE ieee.std_logic_1164.all; - -LIBRARY altera_mf; -USE altera_mf.altera_mf_components.all; - -ENTITY Z80_CPM_BASIC_ROM IS - PORT - ( - address : IN STD_LOGIC_VECTOR (12 DOWNTO 0); - clock : IN STD_LOGIC := '1'; - q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) - ); -END Z80_CPM_BASIC_ROM; - - -ARCHITECTURE SYN OF z80_cpm_basic_rom IS - - SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); - -BEGIN - q <= sub_wire0(7 DOWNTO 0); - - altsyncram_component : altsyncram - GENERIC MAP ( - address_aclr_a => "NONE", - clock_enable_input_a => "BYPASS", - clock_enable_output_a => "BYPASS", - init_file => "./ROMS/Z80/BASMON.HEX", - intended_device_family => "Cyclone V", - lpm_hint => "ENABLE_RUNTIME_MOD=NO", - lpm_type => "altsyncram", - numwords_a => 8192, - operation_mode => "ROM", - outdata_aclr_a => "NONE", - outdata_reg_a => "UNREGISTERED", - widthad_a => 13, - width_a => 8, - width_byteena_a => 1 - ) - PORT MAP ( - address_a => address, - clock0 => clock, - q_a => sub_wire0 - ); - - - -END SYN; - --- ============================================================ --- CNX file retrieval info --- ============================================================ --- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" --- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" --- Retrieval info: PRIVATE: AclrByte NUMERIC "0" --- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" --- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" --- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" --- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" --- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" --- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" --- Retrieval info: PRIVATE: Clken NUMERIC "0" --- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" --- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" --- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" --- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone V" --- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" --- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" --- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" --- Retrieval info: PRIVATE: MIFfilename STRING "./ROMS/Z80/CPM_BASIC.HEX" --- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192" --- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" --- Retrieval info: PRIVATE: RegAddr NUMERIC "1" --- Retrieval info: PRIVATE: RegOutput NUMERIC "0" --- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" --- Retrieval info: PRIVATE: SingleClock NUMERIC "1" --- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" --- Retrieval info: PRIVATE: WidthAddr NUMERIC "13" --- Retrieval info: PRIVATE: WidthData NUMERIC "8" --- Retrieval info: PRIVATE: rden NUMERIC "0" --- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all --- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" --- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" --- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" --- Retrieval info: CONSTANT: INIT_FILE STRING "./ROMS/Z80/CPM_BASIC.HEX" --- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone V" --- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" --- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" --- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192" --- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" --- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" --- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" --- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" --- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" --- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" --- Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" --- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" --- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" --- Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 --- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 --- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 --- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.vhd TRUE --- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.inc FALSE --- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.cmp TRUE --- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.bsf FALSE --- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM_inst.vhd FALSE --- Retrieval info: LIB_FILE: altera_mf +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: Z80_CPM_BASIC_ROM.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 17.0.0 Build 595 04/25/2017 SJ Lite Edition +-- ************************************************************ + + +--Copyright (C) 2017 Intel Corporation. All rights reserved. +--Your use of Intel Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files from any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Intel Program License +--Subscription Agreement, the Intel Quartus Prime License Agreement, +--the Intel MegaCore Function License Agreement, or other +--applicable license agreement, including, without limitation, +--that your use is for the sole purpose of programming logic +--devices manufactured by Intel and sold by Intel or its +--authorized distributors. Please refer to the applicable +--agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY Z80_CPM_BASIC_ROM IS + PORT + ( + address : IN STD_LOGIC_VECTOR (12 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END Z80_CPM_BASIC_ROM; + + +ARCHITECTURE SYN OF z80_cpm_basic_rom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "./ROMS/Z80/intMon.hex", + intended_device_family => "Cyclone V", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 8192, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + widthad_a => 13, + width_a => 8, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone V" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "./ROMS/Z80/CPM_BASIC.HEX" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "0" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "13" +-- Retrieval info: PRIVATE: WidthData NUMERIC "8" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "./ROMS/Z80/CPM_BASIC.HEX" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone V" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "8192" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "13" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 13 0 INPUT NODEFVAL "address[12..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" +-- Retrieval info: CONNECT: @address_a 0 0 13 0 address 0 0 13 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.cmp TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL Z80_CPM_BASIC_ROM_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/ROMS/Z80/intMon.hex b/ROMS/Z80/intMon.hex new file mode 100644 index 0000000..dc90ff2 --- /dev/null +++ b/ROMS/Z80/intMon.hex @@ -0,0 +1,341 @@ +:0430060000000000C6 +:18000000F3C3A40000000000C332000000000000C31B000000000000BB +:18001800C36C003A0030FE002008CD730028FBDB81C9CD7A0028FBDB44 +:1800300083C9F53A0030FE00200D1801F5CD600028FBF1D381C9F5CDB4 +:18004800660028FBF1D383C9F5CD66002004F1E600C9F1D383F6FFC916 +:18006000DB800FCB47C9DB820FCB47C93A0030FE002007DB80E601FE2D +:1800780000C9DB82E601FE00C9D7FE0A28FBFE1B20023E03C9FE0D2822 +:180090000AFE0C2804FE203801CFC93E0DCF3E0ACF3E0DC9312A303E1B +:1800A80095D380D3823E00320030210E03CD3701210E032204302A0476 +:1800C000307EB7280CCD5000280723220430C3BE00CD7300280F3E0094 +:1800D800320030CD1B00FE20C2D1001812CD7A0028D43E01320030CD3A +:1800F0001B00FE20C2BE003E0CCD3C00CD5000CD3E01219C02CD3701FF +:18010800210801E5CD3E013E3ECFCD8100FE2038F9FE3ACAB501CD8DCA +:1801200000E65FFE49CAF601FE47CAAF01FE58CAFA013E3FCF18D57EE9 +:18013800B7C8CF2318F93E0DCF3E0ACFC9CD8100FE03C8FE2038F6C907 +:18015000CD450147CD45014FCD8F014F7B915F79C9210000CDA801FEED +:180168000D200E37C9210000CDA801FE0DC8FE2CC8FE0328EE29292956 +:1801800029D630FE0A3802D607E60F856F18E178D630FE0A3802D6079A +:18019800070707074779D630FE0A3802D60780C9CD8100CD8D00C9CDC7 +:1801B0006101D8E5C91E00CD500157CD500167CD50016FCD5001FE018D +:1801C8002009CD50017BA7281E18157AA7280BCD500177233E2ECF15E7 +:1801E00018F1CD50017BA7C821FD02CD3701C9213403CD3701C9C33FE0 +:1801F80003C9210C02CD3701CD4501C8E65FFE59CA2A02C90D0A426FF1 +:180210006F742043502F4D3F000D0A4C6F6164696E672043502F4D0D74 +:180228000A00211902CD370106183E0032063032073032083032093071 +:180240002100D0220230CD74021100022A0230192202303A06303C3264 +:18025800063010EA3A0030F52AFEFFE93A0830D38C3A0730D38B3A060F +:1802700030D38AC9F5C5E5DB89FE8020FACD64023E00D3890E04068020 +:18028800DB89FEE020FADB8877230520F30D20EEE1C1F1C943502F4D67 +:1802A00020426F6F7420524F4D20322E300D0A492D5374727420496EC3 +:1802B8007472700D0A582D426F6F742043502F4D0D0A3A6E6E6E6E2D43 +:1802D0004C6F6164204920726372640D0A476E6E6E6E2D52206C6F636F +:1802E8000D0A000D0A436F6C64206F72207761726D3F0D0A0043686510 +:18030000636B73756D206572726F720D0A000C5072657373205B7370EA +:180318006163655D20746F20616374697661746520636F6E736F6C65C0 +:180330002E0D0A00436F6D706C6574650D0A0021EB02CD3701CD4501FA +:18034800C8E65FFE43CA5603FE57CA5903C9C35C03C3FA03DD21000008 +:18036000C367030D0C831321B030F9C3A21F113406066321B0301A77E5 +:18037800231305C27603F9CD3508CD030E325A3132A931214904CDA171 +:1803900014CD5208CD5B0BB7C2B003210D32237CB5CAC2037E472F770D +:1803A800BE70CA9E03C3C203CD270CB7C20307EB2B3ED94677BE70C2BF +:1803C0008B032B110C32CDCB09DA8B0311CEFF225F3119220A31CD1031 +:1803D800082A0A3111EFFF1911A9317D936F7C9A67E5211204CDA11403 +:1803F000E1CD441B210304CDA114311631CD3508C34E072042797465F0 +:180408007320667265650D0A00005A38302042415349432056657220DF +:18042000342E37620D0A436F707972696768742028432920313937384C +:18043800206279204D6963726F736F66740D0A00004D656D6F7279202B +:18045000746F7000B9197D1ACF19B3306113E6168F13431C221D5E18E7 +:18046800911C971D9D1DFE1D131E3A177E1E013113162B14AD16221693 +:180480003316A01E331F431673167D16C54E44C64F52CE455854C44114 +:180498005441C94E505554C4494DD2454144CC4554C74F544FD2554E1E +:1804B000C946D24553544F5245C74F535542D2455455524ED2454DD3EA +:1804C800544F50CF5554CF4ECE554C4CD7414954C44546D04F4B45C462 +:1804E0004F4B45D3435245454ECC494E4553C34C53D749445448CD4F6C +:1804F8004E49544F52D34554D245534554D052494E54C34F4E54CC491B +:180510005354C34C454152C34C4F4144C353415645CE4557D441422887 +:18052800D44FC64ED3504328D448454ECE4F54D3544550ABADAAAFDE8B +:18054000C14E44CF52BEBDBCD3474EC94E54C14253D55352C65245C92F +:180558004E50D04F53D35152D24E44CC4F47C55850C34F53D3494ED42F +:18057000414EC1544ED045454BC445454BD04F494E54CC454ED3545261 +:1805880024D6414CC15343C3485224C8455824C2494E24CC4546542427 +:1805A000D24947485424CD49442480A50BA20A7D0FF20C840EB911B32E +:1805B8000E090DAF0C920C810D6B0B9E0CCD0CF40CA30BF216630DE41D +:1805D0000BF81697134117891EF40C6F1E621E671E9F1F04310731A5EF +:1805E8000DD10B170A4C0CF40CF40C0F08792B1B795F177C9D187CFE29 +:18060000187F4C1C5012114611114E46534E52474F4446434F564F4DDD +:18061800554C425344442F304944544D4F534C535354434E55464D4FCF +:180630004858424EC3FA03C3220CD300C9D6006F7CDE006778DE004792 +:180648003E00C9000000354ACA99391C76982295B3980ADD479853D162 +:1806600099990A1A9F9865BCCD98D6773E9852C74F80DB00C901FF1CA4 +:1806780000001400140000000000C34809C30000C30000C300000D32A6 +:18069000FEFFAA31204572726F720020696E20004F6B0D0A00004272B4 +:1806A80065616B00210400397E23FE81C04E234623E569607AB3EBCA61 +:1806C000C606EBCDCB09010D00E1C809C3B006CDE906C5E3C1CDCB09CB +:1806D8007E02C80B2BC3D506E52A8A31060009093EE53ED0956F3EFF9A +:1806F0009CDAF8066739E1D81E0CC317072A7931220C311E02011E1494 +:18070800011E00011E12011E22011E0A011E18CD350832F530CDF60DB7 +:18072000210A06573E3FCDDC09197ECDDC09CD5B0BCDDC09219406CD54 +:18073800A1142A0C3111FEFFCDCB09CA67037CA53CC43C1B3EC1AF3252 +:18075000F530CDF60D21A006CDA11421FFFF220C31CD4809DA5B07CDAE +:180768005B0B3C3DCA5B07F5CD270CD5CD5F0847D1F1D23B0BD5C5AF06 +:18078000327C31CD5B0BB7F5CDEF07DA9407F1F5CAC80CB7C5D2AB07E7 +:18079800EB2A86311A020313CDCB09C29C076069228631D1F1CAD2073E +:1807B0002A8631E3C109E5CDCF06E1228631EB74D123237323722311B0 +:1807C80011311A772313B7C2CA07CD1B0823EB626B7E23B6CA5B072355 +:1807E0002323AFBE23C2E307EB732372C3D7072A0E31444D7E23B62B6F +:1807F800C823237E23666FCDCB0960697E23666F3FC83FD0C3F207C0F3 +:180810002A0E31AF772377232286312A0E312B227E312A5F31227331C6 +:18082800AFCD6B0B2A8631228831228A31C12A0A31F9216331226131A5 +:18084000AF6F67228431327B31228E31E5C52A7E31C93E3FCDDC093ECC +:1808580020CDDC09C3FE30AF325E310E051111317EFE20CAE70847FE55 +:1808700022CA0709B7CA0E093A5E31B77EC2E708FE3F3E9ECAE7087EDD +:18088800FE30DA9208FE3CDAE708D5118B04C501E308C5067F7EFE6166 +:1808A000DAAB08FE7BD2AB08E65F774EEB23B6F2AD08047EE67FC8B9D8 +:1808B800C2AD08EBE5131AB7FADF084F78FE88C2CE08CD5B0B2B237E38 +:1808D000FE61DAD708E65FB9CABD08E1C3AB0848F1EBC9EB79C1D1230E +:1808E80012130CD63ACAF508FE49C2F808325E31D654C26808477EB74E +:18090000CA0E09B8CAE70823120C13C3FE082110311213121312C93AAF +:18091800F430B73E0032F430C22B0905CA4809CDDC093E052BCA3F0910 +:180930007ECDDC09C35109052BCDDC09C25109CDDC09CD030EC34809C0 +:180948002111310601AF32F430CD060A4FFE7FCA17093AF430B7CA6A4C +:18096000093E00CDDC09AF32F43079FE07CAAE09FE03CC030E37C8FEA7 +:180978000DCAFE0DFE15CA4209FE40CA3F09FE5FCA3709FE08CA370996 +:18099000FE12C2A909C5D5E53600CDB31F211131CDA114E1D1C1C3510B +:1809A80009FE20DA510978FE493E07D2C3097971327C312304CDDC0998 +:1809C000C35109CDDC093E08C3BD097C92C07D93C97EE3BE23E3CA5B90 +:1809D8000BC30307F53AF530B7C2D614F1C5F5FE20DA000A3AF2304728 +:1809F0003A5B3104CAFC0905B8CC030E3C325B31F1C1CD9C1FC9CD6092 +:180A08001EE67FFE0FC03AF5302F32F530AFC9CD270CC0C1CDEF07C520 +:180A2000CD6D0AE14E23462378B1CA4E07CD760ACD860BC5CD030E5ECB +:180A3800235623E5EBCD441B3E20E1CDDC097EB723CA230AF2430AD6B9 +:180A50007F4F118C041A13B7F2550A0DC2550AE67FCDDC091A13B7F2CF +:180A68005F0AC3460AE52AF83022F630E1C9E5D52AF63011FFFFED5A71 +:180A800022F630D1E1F0E52AF83022F630CD601EFE03CA990AE1C37622 +:180A98000A2AF83022F630C3FD033E64327B31CD090DC1E5CDF20C22E9 +:180AB000773121020039CDB006D1C2D20A09D52B562B5E2323E52A7784 +:180AC80031CDCB09E1C2B60AD1F9EB0E08CDE006E52A7731E3E52A0CAE +:180AE00031E3CDCB0FCDD109A6CDC80FE5CDF619E1C5D5010081515AE9 +:180AF8007EFEAB3E01C20E0BCD5B0BCDC80FE5CDF619CDAA19E1C5D502 +:180B1000F533E52A7E31E30681C533CD860B227E317EFE3ACA3B0BB7D9 +:180B2800C20307237E23B6CAAD0B235E2356EB220C31EBCD5B0B111B5F +:180B40000BD5C8D680DA090DFE25D20307074F0600EB21AB05094E231E +:180B580046C5EB237EFE3AD0FE20CA5B0BFE303F3C3DC9EB2A0E31CACB +:180B7000800BEBCD270CE5CDEF076069D1D2C80C2B228C31EBC9DFC8AA +:180B8800D7FE1B2811FE03280DFE13C0D7FE11C8FE03280718F63EFFFC +:180BA00032FD30C0F6C0227E3121F6FFC12A0C31F57DA43CCAC00B2250 +:180BB80082312A7E31228431AF32F530CDF60DF121A606C23707C34E1D +:180BD000072A84317CB51E20CA1707EB2A8231220C31EBC9CD2917C028 +:180BE80032F130C9E52AFA3006004F0922FA30E1C97EFE41D8FE5B3F1F +:180C0000C9CD5B0BCDC80FCDAA19FA220C3A9731FE90DA521A0180909D +:180C1800110000E5CD251AE151C81E08C317072B110000CD5B0BD0E59D +:180C3000F5219819CDCB09DA0307626B19291929F1D6305F160019EB9F +:180C4800E1C32B0CCA1F08CD040C2BCD5B0BE52A5F31CA6F0CE1CDD12A +:180C6000092CD5CD040C2BCD5B0BC20307E3EB7D935F7C9A57DAF806E9 +:180C7800E52A863101280009CDCB09D2F806EB220A31E1225F31E1C37C +:180C90001F08CA1B08CD1F08011B0BC3AE0C0E03CDE006C1E5E52A0C1B +:180CA80031E33E8CF533C5CD270CCDF40CE52A0C31CDCB09E123DCF2DD +:180CC00007D4EF0760692BD81E0EC31707C016FFCDAC06F9FE8C1E0479 +:180CD800C21707E1220C31237CB5C2EC0C3A7C31B7C24D07211B0BE3F8 +:180CF0003EE1013A0E0006007948477EB7C8B8C823FE22CAF80CC3FB2A +:180D08000CCDBE11CDD109B4D53A5D31F5CDDA0FF1E3227E311FCDCD2A +:180D20000FCA5C0DE52A9431E523235E23562A0E31CDCB09D24B0D2A45 +:180D38000A31CDCB09D1D2530D216F31CDCB09D2530D3ED1CD0216EB51 +:180D5000CD3B14CD0216E1CD051AE1C9E5CD021AD1E1C9CD29177E47F8 +:180D6800FE8CCA720DCDD109882B4B0D78CA430BCD280CFE2CC0C3733D +:180D80000DCDDA0F7EFE88CA8F0DCDD109A92BCDCB0FCDAA19CAF40CB2 +:180D9800CD5B0BDAAF0CC3420B2BCD5B0BCA030EC8FEA5CA360EFEA813 +:180DB000CA360EE5FE2CCA1F0EFE3BCA590EC1CDDA0FE53A5D31B7C210 +:180DC800EF0DCD4F1BCD5F1436202A9431342A94313AF2304704CAEBDC +:180DE0000D043A5B31863DB8D4030ECDA414AFC4A414E1C3A10D3A5B2D +:180DF80031B7C8C3030E36002110313E0DCDDC093E0ACDDC09AF325B94 +:180E1000313AF1303DC8F5AFCDDC09F1C3140E3AF330473A5B31B8D417 +:180E2800030ED2590ED60ED22D0E2FC34E0EF5CD2617CDD109292BF13E +:180E4000D6A8E5CA490E3A5B312F83D2590E3C473E20CDDC0905C252B9 +:180E58000EE1CD5B0BC3A80D3F5265646F2066726F6D207374617274FD +:180E70000D0A003A7D31B7C2FD06C121600ECDA114C34E08CD0C147E99 +:180E8800FE223E0032F530C29E0ECD6014CDD1093BE5CDA4143EE5CDB2 +:180EA0005208C1DAAA0B237EB72BC5CAF10C362CC3B80EE52A8C31F6D4 +:180EB800AF327D31E3C3C40ECDD1092CCDBE11E3D57EFE2CCAEC0E3A4E +:180ED0007D31B7C2590F3E3FCDDC09CD5208D1C1DAAA0B237EB72BC5BC +:180EE800CAF10CD53A5D31B7CA160FCD5B0B5747FE22CA0A0F3A7D312C +:180F0000B757CA070F163A062C2BCD6314EB21210FE3D5C3240DCD5BEA +:180F18000BCDB11AE3CD021AE12BCD5B0BCA2D0FFE2CC2730EE32BCDC5 +:180F30005B0BC2C00ED13A7D31B7EBC2810BD5B621480FC4A114E1C9E4 +:180F48003F45787472612069676E6F7265640D0A00CDF20CB7C2720F6A +:180F6000237E23B61E06CA1707235E2356EB227931EBCD5B0BFE83C2E1 +:180F7800590FC3EC0E110000C4BE11227E31CDAC06C20907F9D57E2307 +:180F9000F5D5CDE819E3E5CD5517E1CD021AE1CDF919E5CD251AE1C193 +:180FA80090CDF919CAB80FEB220C316960C3170BF92A7E317EFE2CC2FD +:180FC0001B0BCD5B0BCD800FCDDA0FF6373A5D318FB7E8C31507CDD10E +:180FD80009282B1600D50E01CDE006CD51102280312A8031C178FE786D +:180FF000D4CB0F7E1600D6B3DA1210FE03D21210FE0117AABA57DA037F +:1810080007227531CD5B0BC3F60F7AB7C239117E227531D6ACD8FE0724 +:18102000D05F3A5D313DB37BCA971507835F21F505197856BAD023CD7B +:18103800CB0FC501E90FC5434ACDDB1958514E234623C52A7531C3DD3D +:181050000FAF325D31CD5B0B1E24CA1707DAB11ACDF90BD2B810FE2679 +:181068002012CD5B0BFE48CAF51EFE42CA651F1E02CA1707FEACCA518D +:1810800010FE2ECAB11AFEADCAA710FE22CA6014FEAACA9911FEA7CA72 +:18109800C413D6B6D2C910CDD60FCDD10929C9167DCDDD0F2A8031E5DB +:1810B000CDD319CDCB0FE1C9CDBE11E5EB2294313A5D31B7CCE819E19E +:1810C800C90600074FC5CD5B0B79FE31DAF010CDD60FCDD1092CCDCC53 +:1810E0000FEB2A9431E3E5EBCD2917EBE3C3F810CD9F10E311B310D5AE +:1810F800015404094E236669E915FEADC8FE2DC814FE2BC8FEACC82B38 +:18111000C9F6AFF5CDCB0FCD0D0CF1EBC1E3EBCDEB19F5CD0D0CF1C10E +:1811280079218213C23411A34F78A2E9B34F78B2E9214B113A5D311F0B +:181140007A175F166478BAD0C33A104D1179B71FC1D1F5CDCD0F218F91 +:1811580011E5CA251AAF325D31D5CDE4157E23234E2346D1C5F5CDE8BB +:1811700015CDF919F157E17BB2C87AD601D8AFBB3CD0151D0ABE230396 +:18118800CA77113FC3B5193C8FC1A0C6FF9FC3BC19165ACDDD0FCDCB44 +:1811A0000FCD0D0C7B2F4F7A2FCD8213C1C3E90F2BCD5B0BC8CDD109F5 +:1811B8002C01B011C5F6AF325C3146CDF90BDA0307AF4F325D31CD5B27 +:1811D0000BDADA11CDF90BDAE7114FCD5B0BDADB11CDF90BD2DB11D6E7 +:1811E80024C2F6113C325D310F814FCD5B0B3A7B313DCAA312F2061248 +:181200007ED628CA7B12AF327B31E550592A8E31CDCB09119031CAEBD7 +:18121800182A8831EB2A8631CDCB09CA3912799623C22E12789623CA12 +:181230006D1223232323C32012E1E3D511BB10CDCB09D1CA7012E3E5AB +:18124800C50106002A8A31E509C1E5CDCF06E1228A3160692288312B1A +:181260003600CDCB09C25F12D173237223EBE1C9329731219F06229465 +:1812780031E1C9E52A5C31E357D5C5CD010CC1F1EBE3E5EB3C577EFEDA +:181290002CCA8112CDD10929228031E1225C311E00D511E5F52A8831C9 +:1812A8003E19EB2A8A31EBCDCB09CADB127EB923C2BD127EB8235E23FF +:1812C0005623C2A9123A5C31B7C20C07F1444DCAEB1896CA39131E10A4 +:1812D800C31707110400F1CA220C712370234FCDE00623232275317177 +:1812F000233A5C311779010B00D2FE12C10371237023F5E5CD961AEB51 +:18130800E1F13DC2F612F5424BEB19DAF806CDE906228A312B3600CDCF +:18132000CB09C21C1303572A75315EEB2909EB2B2B73237223F1DA5DB7 +:1813380013474F7E2316E15E235623E3F5CDCB09D2D612E5CD961AD1FC +:1813500019F13D444DC23E132929C109EB2A8031C92A8A31EB210000FE +:18136800393A5D31B7CA7D13CDE415CDE4142A0A31EB2A73317D934F53 +:181380007C9A41501E00215D31730690C3C1193A5B3147AFC38313CD59 +:181398001A14CD0C1401F20CC5D5CDD10928CDBE11E5EB2B562B5EE163 +:1813B000CDCB0FCDD10929CDD109B4444DE3712370C35914CD1A14D5DB +:1813C800CD9F10CDCB0FE35E2356237AB3CA0F077E23666FE52A8E31BC +:1813E000E3228E312A9231E52A9031E5219031D5CD021AE1CDC80F2B3F +:1813F800CD5B0BC20307E1229031E1229231E1228E31E1C9E52A0C319C +:18141000237CB5E1C01E16C31707CDD109A73E80327B31B647CDC31132 +:18142800C3CB0FCDCB0FCD4F1BCD5F14CDE415013F16C57E2323E5CD9A +:18144000BA14E14E2346CD5314E56FCDD715D1C9CDBA14216F31E5779B +:181458002323732372E1C92B062250E50EFF237E0CB7CA7514BACA753F +:1814700014B8C26614FE22CC5B0BE323EB79CD5314116F312A613122DD +:1814880094313E01325D31CD051ACDCB09226131E17EC01E1EC317070B +:1814A00023CD5F14CDE415CDF9191C1DC80ACDDC09FE0DCC0D0E03C3B7 +:1814B800AB14B70EF1F52A0A31EB2A73312F4F06FF0923CDCB09DAD892 +:1814D0001422733123EBF1C9F11E1ACA1707BFF501BC14C52A5F31222B +:1814E8007331210000E52A0A31E5216331EB2A6131EBCDCB0901F51406 +:18150000C249152A8631EB2A8831EBCDCB09CA1C157E2323B7CD4C15D4 +:18151800C30615C1EB2A8A31EBCDCB09CA7215CDF9197BE509B7F21B63 +:1815300015227531E14E0600090923EB2A7531EBCDCB09CA1C15013BDE +:1815480015C5F6807E23235E235623F0B7C8444D2A7331CDCB09606945 +:18156000D8E1E3CDCB09E3E56069D0C1F1F1E5D5C5C9D1E17DB4C82B14 +:18157800462B4EE52B2B6E26000950592B444D2A7331CDD206E1712377 +:181590007069602BC3E714C5E52A9431E3CD5110E3CDCC0F7EE52A94CB +:1815A80031E5861E1CDA1707CD5014D1CDE815E3CDE715E52A7131EB49 +:1815C000CDCE15CDCE1521E60FE3E5C38114E1E37E23234E23466F2CA3 +:1815D8002DC80A120313C3D815CDCC0F2A9431EBCD0216EBC0D5505994 +:1815F0001B4E2A7331CDCB09C200164709227331E1C92A61312B462B1B +:181608004E2B2BCDCB09C0226131C9019213C5CDE115AF57325D317ED6 +:18162000B7C9019213C5CD1716CA220C23235E23561AC93E01CD501465 +:18163800CD2C172A713173C1C38114CDDC16AFE34FE57EB8DA511678BE +:18165000110E00C5CDBA14C1E1E5232346236668060009444DCD53142B +:181668006FCDD715D1CDE815C38114CDDC16D1D51A90C34716EB7ECDEA +:18168000E1160405CA220CC51EFFFE29CA9616CDD1092CCD2917CDD15D +:181698000929F1E3014916C53DBE0600D04F7E91BB47D843C9CD171600 +:1816B000CACA175F23237E23666FE5194672E3C57EFE24C2CB16CDF5F9 +:1816C8001E180DFE25C2D516CD651F1803CDB11AC1E170C9EBCDD10986 +:1816E00029C1D1C543C9CD2C1732EF30CDEE30C39213CD1617C3B6300F +:1816F800CD1617F51E002BCD5B0BCA0C17CDD1092CCD2917C1CDEE30F6 +:18171000ABA0CA0D17C9CD291732EF3032B730CDD1092CC32917CD5B4A +:181728000BCDC80FCD070C7AB7C2220C2BCD5B0B7BC9CD0D0C1AC39202 +:1817400013CDC80FCD0D0CD5CDD1092CCD2917D112C921281CCDF9194F +:18175800C36417CDF91921C1D1CDD31978B7C83A9731B7CAEB1990D210 +:181770007E172F3CEBCDDB19EBCDEB19C1D1FE19D0F5CD101A67F1CD6F +:181788002918B4219431F2A417CD0918D2EA172334CA12072E01CD3F8B +:1817A00018C3EA17AF90477E9B5F237E9A57237E994FDC15186863AFB9 +:1817B8004779B7C2D7174A54656F78D608FEE0C2B817AF329731C90544 +:1817D000297A1757798F4FF2CF17785C45B7CAEA172197318677D2CAA4 +:1817E80017C878219731B7FCFC1746237EE680A94FC3EB191CC014C027 +:181800000CC00E8034C0C312077E835F237E8A57237E894FC921983198 +:181818007E2F77AF6F90477D9B5F7D9A577D994FC90600D608DA38187E +:18183000435A510E00C32B18C6096FAF2DC8791F4F7A1F577B1F5F7874 +:181848001F47C33B180000008103AA561980F122768045AA3882CDAAC6 +:1818600019B7EA220C2197317E01358011F30490F570D5C5CD6417C1CB +:18187800D104CD0019214D18CD5B17215118CDF21C018080110000CD94 +:181890006417F1CD251B01318011187221C1D1CDAA19C82E00CD6819F3 +:1818A8007932A631EB22A731010000505821B517E521C118E5E52194CD +:1818C000317E23B7CAED18E52E081F6779D2DB18E52AA73119EBE13AD3 +:1818D800A631891F4F7A1F577B1F5F781F472D7CC2CA18E1C9435A517E +:1818F0004FC9CDDB19012084110000CDEB19C1D1CDAA19CA06072EFF5A +:18190800CD681934342B7E32C2302B7E32BE302B7E32BA3041EBAF4F8C +:18192000575F32C530E5C57DCDB930DE003FD2381932C530F1F137D2A3 +:18193800C1E1793C3D1FFAEB17177B175F7A175779174F297817473AE0 +:18195000C5301732C53079B2B3C22519E521973135E1C22519C31207AE +:1819680078B7CA8C197D219731AE80471FA878F28B19C68077CAEB188F +:18198000CD101A772BC9CDAA192FE1B7E1F2CA17C31207CDF61978B7FB +:18199800C8C602DA120747CD641721973134C0C312073A9731B7C83AB1 +:1819B0009631FE2F179FC03CC9CDAA1906881100002197314F700600D3 +:1819C80023368017C3B217CDAA19F02196317EEE8077C9EB2A9431E33A +:1819E000E52A9631E3E5EBC9CDF919EB2294316069229631EBC92194D1 +:1819F800315E2356234E234623C911943106041A77132305C2071AC9B1 +:181A10002196317E07371F773F1F2323777907371F4F1FAEC978B7CAB5 +:181A2800AA1921B319E5CDAA1979C8219631AE79F8CD3F1A1FA9C9235F +:181A400078BEC02B79BEC02B7ABEC02B7B96C0E1E1C9474F575FB7C801 +:181A5800E5CDF619CD101AAE67FC761A3E9890CD29187C17DCFC170621 +:181A700000DC1518E1C91B7AA33CC00BC92197317EFE983A9431D07E59 +:181A8800CD521A36987BF57917CDB217F1C921000078B1C83E1029DA8C +:181AA000D612EB29EBD2AC1A09DAD6123DC29E1AC9FE2DF5CABD1AFEA5 +:181AB8002BCABD1A2BCDCA1747575F2F4FCD5B0BDA0E1BFE2ECAE91AC7 +:181AD000FE45C2ED1ACD5B0BCD0111CD5B0BDA301B14C2ED1AAF935F0A +:181AE8000C0CCAC51AE57B90F4061BF2FC1AF5CDF218F13CC2F01AD182 +:181B0000F1CCD319EBC9C8F5CD9319F13DC9D557788947C5E5D5CD93F0 +:181B180019F1D630CD251BE1C1D1C3C51ACDDB19CDBC19C1D1C3641750 +:181B30007B0707830786D6305FC3DB1AE5219B06CDA114E1EBAF0698A5 +:181B4800CDC11921A014E5219931E5CDAA193620F25D1B362D23363018 +:181B6000CA131CE5FCD319AFF5CD191C01439111F84FCD251AB7E28AA5 +:181B78001BF1CD071BF5C36C1BCDF218F13CF5CD191CCD52173CCD528F +:181B90001ACDEB19010603F1813CFAA61BFE08D2A61B3C473E023D3D09 +:181BA800E1F5112C1C05C2B71B362E2336302305362ECC001AC5E5D57F +:181BC000CDF619E1062F047B965F237A9E5723799E4F2B2BD2C61BCDB6 +:181BD800091823CDEB19EBE17023C10DC2B71B05CAF71B2B7EFE30CA9D +:181BF000EB1BFE2EC4001AF1CA161C364523362BF2071C362D2F3C06F8 +:181C08002F04D60AD2091CC63A237023772371E1C901749411F723CD4E +:181C2000251AB7E1E2811BE900000080A08601102700E8030064000041 +:181C38000A000001000021D319E3E9CDDB1921281CCDE819C1D1CDAAB3 +:181C50001978CA911CF25C1CB7CA0607B7CACB17D5C579F67FCDF619B5 +:181C6800F2791CD5C5CD7D1AC1D1F5CD251AE17C1FE1229631E122946F +:181C800031DC3E1CCCD319D5C5CD5E18C1D1CD9F18CDDB1901388111AE +:181C98003BAACD9F183A9731FE88D28619CD7D1AC680C602DA8619F5F2 +:181CB000214D18CD5517CD9618F1C1D1F5CD6117CDD31921D11CCD0190 +:181CC8001D110000C14AC39F1808402E9474704F2E776E02887AE6A077 +:181CE0002A7C50AAAA7EFFFF7F7F0000808100000081CDDB19119D181F +:181CF800D5E5CDF619CD9F18E1CDDB197E23CDE81906F1C1D13DC8D546 +:181D1000C5F5E5CD9F18E1CDF919E5CD6417E1C30A1DCDAA1921C93036 +:181D2800FA831D21EA30CDE81921C930C886E6070600772387874F09A5 +:181D4000CDF919CD9F183AC8303CE6030600FE018832C83021871D87CE +:181D5800874F09CD5517CDF6197B59EE4F4F36802B46368021C73034F6 +:181D70007ED6ABC27A1D770C151CCDB51721EA30C3021A772B772B77E1 +:181D8800C35E1D68B1466899E9926910D1756821E11DCD5517CDDB19EA +:181DA00001498311DB0FCDEB19C1D1CD0019CDDB19CD7D1AC1D1CD6135 +:181DB8001721E51DCD5B17CDAA1937F2CD1DCD5217CDAA19B7F5F4D3BE +:181DD0001921E51DCD5517F1D4D31921E91DC3F21CDB0F498100000029 +:181DE8007F05BAD71E866426998758342387E05DA586DA0F4983CDDB85 +:181E000019CD9D1DC1E1CDDB19EBCDEB19CD971DC3FE18CDAA19FC3EE7 +:181E18001CFCD3193A9731FE81DA301E0100815159CD0019215B17E57B +:181E3000213A1ECDF21C21E11DC9094AD73B78026E847BFEC12F7C7434 +:181E4800319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F00000081C95A +:181E6000D7C93E0CC39C1FCD29177B32F230C9CDC80FCD0D0CED53F69D +:181E780030ED53F830C9CD0D0CD5E146237EC38313CDC80FCD0D0CD5B6 +:181E9000CDD1092CCDC80FCD0D0CE3732372E1C9CDCB0FCD0D0CC521D5 +:181EA80099317AFE00280CCDD81E78FE302802702371237BCDD81E7A3A +:181EC000FE00200578FE30280270237123AF772377C1219931C331147C +:181ED80047E60FFE0A3802C607C6304F780F0F0F0FE60FFE0A3802C6B1 +:181EF00007C63047C9EB210000CD0E1FDA2E1F1805CD0E1F381F2929E0 +:181F08002929B56F18F3131AFE20CA0E1FD630D8FE0A3805D607FE0AF6 +:181F2000D8FE103FC9EB7A4BE5CD8213E1C91E26C31707CDCB0FCD0D74 +:181F38000CC521993106110578FE012808CB13CB1230F41804CB13CB6E +:181F5000123E30CE0077230520F3AF772377C1219931C33114EB2100F9 +:181F680000CD821FDA901FD63029B56FCD821F30F6EB7A4BE5CD82138C +:181F8000E1C9131AFE20CA821FFE30D8FE323FC91E28C31707DD21FF87 +:181F9800FFC36703C30800C300003E0032FD30C36E03ED45F5A0C1B866 +:091FB0003E00C9CDDC09C3030E9B +:00000001FF diff --git a/Z80 CPM and bootloader (basmon)/Z80-dis-asm.py b/Z80 CPM and bootloader (basmon)/Z80-dis-asm.py new file mode 100644 index 0000000..d2cda6e --- /dev/null +++ b/Z80 CPM and bootloader (basmon)/Z80-dis-asm.py @@ -0,0 +1,431 @@ +import sys +from typing import Dict, List, Tuple + +class Z80Disassembler: + def __init__(self): + # Complete Z80 instruction set + self.instructions = { + # 8-bit load group + 0x40: ("LD B,B", 1), + 0x41: ("LD B,C", 1), + 0x42: ("LD B,D", 1), + 0x43: ("LD B,E", 1), + 0x44: ("LD B,H", 1), + 0x45: ("LD B,L", 1), + 0x46: ("LD B,(HL)", 1), + 0x47: ("LD B,A", 1), + 0x48: ("LD C,B", 1), + 0x49: ("LD C,C", 1), + 0x4A: ("LD C,D", 1), + 0x4B: ("LD C,E", 1), + 0x4C: ("LD C,H", 1), + 0x4D: ("LD C,L", 1), + 0x4E: ("LD C,(HL)", 1), + 0x4F: ("LD C,A", 1), + 0x50: ("LD D,B", 1), + 0x51: ("LD D,C", 1), + 0x52: ("LD D,D", 1), + 0x53: ("LD D,E", 1), + 0x54: ("LD D,H", 1), + 0x55: ("LD D,L", 1), + 0x56: ("LD D,(HL)", 1), + 0x57: ("LD D,A", 1), + 0x58: ("LD E,B", 1), + 0x59: ("LD E,C", 1), + 0x5A: ("LD E,D", 1), + 0x5B: ("LD E,E", 1), + 0x5C: ("LD E,H", 1), + 0x5D: ("LD E,L", 1), + 0x5E: ("LD E,(HL)", 1), + 0x5F: ("LD E,A", 1), + 0x60: ("LD H,B", 1), + 0x61: ("LD H,C", 1), + 0x62: ("LD H,D", 1), + 0x63: ("LD H,E", 1), + 0x64: ("LD H,H", 1), + 0x65: ("LD H,L", 1), + 0x66: ("LD H,(HL)", 1), + 0x67: ("LD H,A", 1), + 0x68: ("LD L,B", 1), + 0x69: ("LD L,C", 1), + 0x6A: ("LD L,D", 1), + 0x6B: ("LD L,E", 1), + 0x6C: ("LD L,H", 1), + 0x6D: ("LD L,L", 1), + 0x6E: ("LD L,(HL)", 1), + 0x6F: ("LD L,A", 1), + 0x70: ("LD (HL),B", 1), + 0x71: ("LD (HL),C", 1), + 0x72: ("LD (HL),D", 1), + 0x73: ("LD (HL),E", 1), + 0x74: ("LD (HL),H", 1), + 0x75: ("LD (HL),L", 1), + 0x76: ("HALT", 1), + 0x77: ("LD (HL),A", 1), + 0x78: ("LD A,B", 1), + 0x79: ("LD A,C", 1), + 0x7A: ("LD A,D", 1), + 0x7B: ("LD A,E", 1), + 0x7C: ("LD A,H", 1), + 0x7D: ("LD A,L", 1), + 0x7E: ("LD A,(HL)", 1), + 0x7F: ("LD A,A", 1), + + # 16-bit load group + 0x01: ("LD BC,", 3), + 0x11: ("LD DE,", 3), + 0x21: ("LD HL,", 3), + 0x31: ("LD SP,", 3), + 0x2A: ("LD HL,(", 3), + 0x22: ("LD (", 3), # LD (nn),HL + 0xF9: ("LD SP,HL", 1), + 0xC5: ("PUSH BC", 1), + 0xD5: ("PUSH DE", 1), + 0xE5: ("PUSH HL", 1), + 0xF5: ("PUSH AF", 1), + 0xC1: ("POP BC", 1), + 0xD1: ("POP DE", 1), + 0xE1: ("POP HL", 1), + 0xF1: ("POP AF", 1), + + # Exchange group + 0xEB: ("EX DE,HL", 1), + 0x08: ("EX AF,AF'", 1), + 0xE3: ("EX (SP),HL", 1), + 0xD9: ("EXX", 1), + + # 8-bit arithmetic/logical group + 0x80: ("ADD A,B", 1), + 0x81: ("ADD A,C", 1), + 0x82: ("ADD A,D", 1), + 0x83: ("ADD A,E", 1), + 0x84: ("ADD A,H", 1), + 0x85: ("ADD A,L", 1), + 0x86: ("ADD A,(HL)", 1), + 0x87: ("ADD A,A", 1), + 0x88: ("ADC A,B", 1), + 0x89: ("ADC A,C", 1), + 0x8A: ("ADC A,D", 1), + 0x8B: ("ADC A,E", 1), + 0x8C: ("ADC A,H", 1), + 0x8D: ("ADC A,L", 1), + 0x8E: ("ADC A,(HL)", 1), + 0x8F: ("ADC A,A", 1), + 0x90: ("SUB B", 1), + 0x91: ("SUB C", 1), + 0x92: ("SUB D", 1), + 0x93: ("SUB E", 1), + 0x94: ("SUB H", 1), + 0x95: ("SUB L", 1), + 0x96: ("SUB (HL)", 1), + 0x97: ("SUB A", 1), + 0x98: ("SBC A,B", 1), + 0x99: ("SBC A,C", 1), + 0x9A: ("SBC A,D", 1), + 0x9B: ("SBC A,E", 1), + 0x9C: ("SBC A,H", 1), + 0x9D: ("SBC A,L", 1), + 0x9E: ("SBC A,(HL)", 1), + 0x9F: ("SBC A,A", 1), + 0xA0: ("AND B", 1), + 0xA1: ("AND C", 1), + 0xA2: ("AND D", 1), + 0xA3: ("AND E", 1), + 0xA4: ("AND H", 1), + 0xA5: ("AND L", 1), + 0xA6: ("AND (HL)", 1), + 0xA7: ("AND A", 1), + 0xA8: ("XOR B", 1), + 0xA9: ("XOR C", 1), + 0xAA: ("XOR D", 1), + 0xAB: ("XOR E", 1), + 0xAC: ("XOR H", 1), + 0xAD: ("XOR L", 1), + 0xAE: ("XOR (HL)", 1), + 0xAF: ("XOR A", 1), + 0xB0: ("OR B", 1), + 0xB1: ("OR C", 1), + 0xB2: ("OR D", 1), + 0xB3: ("OR E", 1), + 0xB4: ("OR H", 1), + 0xB5: ("OR L", 1), + 0xB6: ("OR (HL)", 1), + 0xB7: ("OR A", 1), + 0xB8: ("CP B", 1), + 0xB9: ("CP C", 1), + 0xBA: ("CP D", 1), + 0xBB: ("CP E", 1), + 0xBC: ("CP H", 1), + 0xBD: ("CP L", 1), + 0xBE: ("CP (HL)", 1), + 0xBF: ("CP A", 1), + 0x04: ("INC B", 1), + 0x0C: ("INC C", 1), + 0x14: ("INC D", 1), + 0x1C: ("INC E", 1), + 0x24: ("INC H", 1), + 0x2C: ("INC L", 1), + 0x34: ("INC (HL)", 1), + 0x3C: ("INC A", 1), + 0x05: ("DEC B", 1), + 0x0D: ("DEC C", 1), + 0x15: ("DEC D", 1), + 0x1D: ("DEC E", 1), + 0x25: ("DEC H", 1), + 0x2D: ("DEC L", 1), + 0x35: ("DEC (HL)", 1), + 0x3D: ("DEC A", 1), + + # General purpose arithmetic and control groups + 0x27: ("DAA", 1), + 0x2F: ("CPL", 1), + 0x37: ("SCF", 1), + 0x3F: ("CCF", 1), + 0x00: ("NOP", 1), + 0x76: ("HALT", 1), + 0xF3: ("DI", 1), + 0xFB: ("EI", 1), + + # 16-bit arithmetic group + 0x09: ("ADD HL,BC", 1), + 0x19: ("ADD HL,DE", 1), + 0x29: ("ADD HL,HL", 1), + 0x39: ("ADD HL,SP", 1), + 0x03: ("INC BC", 1), + 0x13: ("INC DE", 1), + 0x23: ("INC HL", 1), + 0x33: ("INC SP", 1), + 0x0B: ("DEC BC", 1), + 0x1B: ("DEC DE", 1), + 0x2B: ("DEC HL", 1), + 0x3B: ("DEC SP", 1), + + # Rotate and shift group + 0x07: ("RLCA", 1), + 0x17: ("RLA", 1), + 0x0F: ("RRCA", 1), + 0x1F: ("RRA", 1), + + # Jump group + 0xC3: ("JP", 3), + 0xDA: ("JP C,", 3), + 0xD2: ("JP NC,", 3), + 0xCA: ("JP Z,", 3), + 0xC2: ("JP NZ,", 3), + 0xFA: ("JP M,", 3), + 0xF2: ("JP P,", 3), + 0xEA: ("JP PE,", 3), + 0xE2: ("JP PO,", 3), + 0x18: ("JR", 2), + 0x38: ("JR C,", 2), + 0x30: ("JR NC,", 2), + 0x28: ("JR Z,", 2), + 0x20: ("JR NZ,", 2), + 0xE9: ("JP (HL)", 1), + 0x10: ("DJNZ", 2), + + # Call and return group + 0xCD: ("CALL", 3), + 0xDC: ("CALL C,", 3), + 0xD4: ("CALL NC,", 3), + 0xCC: ("CALL Z,", 3), + 0xC4: ("CALL NZ,", 3), + 0xFC: ("CALL M,", 3), + 0xF4: ("CALL P,", 3), + 0xEC: ("CALL PE,", 3), + 0xE4: ("CALL PO,", 3), + 0xC9: ("RET", 1), + 0xD8: ("RET C", 1), + 0xD0: ("RET NC", 1), + 0xC8: ("RET Z", 1), + 0xC0: ("RET NZ", 1), + 0xF8: ("RET M", 1), + 0xF0: ("RET P", 1), + 0xE8: ("RET PE", 1), + 0xE0: ("RET PO", 1), + 0xC7: ("RST 00H", 1), + 0xCF: ("RST 08H", 1), + 0xD7: ("RST 10H", 1), + 0xDF: ("RST 18H", 1), + 0xE7: ("RST 20H", 1), + 0xEF: ("RST 28H", 1), + 0xF7: ("RST 30H", 1), + 0xFF: ("RST 38H", 1), + + # Input and output group + 0xDB: ("IN A,(", 2), + 0xD3: ("OUT (", 2), + + # Additional load instructions + 0x3E: ("LD A,", 2), + 0x06: ("LD B,", 2), + 0x0E: ("LD C,", 2), + 0x16: ("LD D,", 2), + 0x1E: ("LD E,", 2), + 0x26: ("LD H,", 2), + 0x2E: ("LD L,", 2), + 0x36: ("LD (HL),", 2), + 0x32: ("LD (", 3), # LD (nn),A + 0x3A: ("LD A,(", 3), # LD A,(nn) + } + + def parse_hex_file(self, hex_content: str) -> Dict[int, int]: + memory = {} + for line in hex_content.splitlines(): + if not line.startswith(':'): + continue + + # Remove the starting ':' + line = line[1:] + +# Parse the Intel HEX record + byte_count = int(line[0:2], 16) + address = int(line[2:6], 16) + record_type = int(line[6:8], 16) + data = line[8:8+byte_count*2] + + if record_type == 0: # Data record + for i in range(0, len(data), 2): + byte = int(data[i:i+2], 16) + memory[address + (i//2)] = byte + + return memory + + def disassemble(self, memory: Dict[int, int], start_address: int = 0) -> List[str]: + output = [] + current_address = start_address + + while current_address in memory: + opcode = memory[current_address] + + # Check for CB prefix (bit instructions) + if opcode == 0xCB and (current_address + 1) in memory: + cb_opcode = memory[current_address + 1] + instruction = self.decode_cb_instruction(cb_opcode) + if instruction: + output.append(f"{current_address:04X}: {instruction}") + current_address += 2 + continue + + # Check for ED prefix + if opcode == 0xED and (current_address + 1) in memory: + ed_opcode = memory[current_address + 1] + instruction = self.decode_ed_instruction(ed_opcode) + if instruction: + output.append(f"{current_address:04X}: {instruction}") + current_address += 2 + continue + + # Check for DD/FD prefix (IX/IY instructions) + if opcode in [0xDD, 0xFD]: + prefix = "IX" if opcode == 0xDD else "IY" + if (current_address + 1) in memory: + ix_opcode = memory[current_address + 1] + instruction = self.decode_indexed_instruction(ix_opcode, prefix) + if instruction: + output.append(f"{current_address:04X}: {instruction}") + current_address += 2 + continue + + instruction_info = self.instructions.get(opcode) + + if instruction_info: + mnemonic, length = instruction_info + operand_bytes = [] + + # Get operand bytes if any + for i in range(1, length): + if current_address + i in memory: + operand_bytes.append(memory[current_address + i]) + + # Format the instruction + if length == 1: + line = f"{current_address:04X}: {mnemonic}" + elif length == 2: + if len(operand_bytes) >= 1: + line = f"{current_address:04X}: {mnemonic}{operand_bytes[0]:02X}H" + elif length == 3: + if len(operand_bytes) >= 2: + value = operand_bytes[0] + (operand_bytes[1] << 8) + if mnemonic.endswith("("): + line = f"{current_address:04X}: {mnemonic}{value:04X}H),A" + else: + line = f"{current_address:04X}: {mnemonic}{value:04X}H" + + output.append(line) + current_address += length + else: + # Unknown opcode + output.append(f"{current_address:04X}: DB {opcode:02X}H ; Unknown opcode") + current_address += 1 + + return output + + def decode_cb_instruction(self, opcode: int) -> str: + """Decode CB-prefixed bit manipulation instructions""" + op_type = opcode >> 6 + bit_num = (opcode >> 3) & 0x07 + reg = opcode & 0x07 + + reg_names = ['B', 'C', 'D', 'E', 'H', 'L', '(HL)', 'A'] + + if op_type == 0: # Rotates and shifts + operations = ['RLC', 'RRC', 'RL', 'RR', 'SLA', 'SRA', 'SLL', 'SRL'] + return f"{operations[bit_num]} {reg_names[reg]}" + elif op_type == 1: # BIT + return f"BIT {bit_num},{reg_names[reg]}" + elif op_type == 2: # RES + return f"RES {bit_num},{reg_names[reg]}" + elif op_type == 3: # SET + return f"SET {bit_num},{reg_names[reg]}" + + return None + + def decode_ed_instruction(self, opcode: int) -> str: + """Decode ED-prefixed instructions""" + ed_instructions = { + 0x40: "IN B,(C)", + 0x41: "OUT (C),B", + 0x42: "SBC HL,BC", + 0x43: "LD (nn),BC", + 0x44: "NEG", + 0x45: "RETN", + 0x46: "IM 0", + 0x47: "LD I,A", + # Add more ED instructions as needed + } + return ed_instructions.get(opcode) + + def decode_indexed_instruction(self, opcode: int, prefix: str) -> str: + """Decode IX/IY indexed instructions""" + if opcode == 0x21: # LD IX/IY,nn + return f"LD {prefix}," + elif opcode == 0x22: # LD (nn),IX/IY + return f"LD (,{prefix})" + elif opcode == 0x2A: # LD IX/IY,(nn) + return f"LD {prefix},(" + # Add more indexed instructions as needed + return None + +def main(hex_file_path: str): + try: + with open(hex_file_path, 'r') as f: + hex_content = f.read() + + disassembler = Z80Disassembler() + memory = disassembler.parse_hex_file(hex_content) + disassembly = disassembler.disassemble(memory) + + for line in disassembly: + print(line) + + except FileNotFoundError: + print(f"Error: Could not find file {hex_file_path}") + except Exception as e: + print(f"Error: {str(e)}") + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python z80_disassembler.py ") + else: + main(sys.argv[1]) \ No newline at end of file diff --git a/Z80 CPM and bootloader (basmon)/_ASSEMBLE.BAT b/Z80 CPM and bootloader (basmon)/_ASSEMBLE.BAT index c7b6ace..6ca3346 100644 --- a/Z80 CPM and bootloader (basmon)/_ASSEMBLE.BAT +++ b/Z80 CPM and bootloader (basmon)/_ASSEMBLE.BAT @@ -1,3 +1,4 @@ +tasm -80 source\mon.asm hexFiles\intMon.hex tasm -80 source\basMon.asm hexFiles\basMon.hex tasm -80 source\cbios128.asm hexFiles\cbios128.hex tasm -80 source\cpm22.asm hexFiles\cpm22.hex diff --git a/Z80 CPM and bootloader (basmon)/hexFiles/BASMON.HEX b/Z80 CPM and bootloader (basmon)/hexFiles/BASMON.HEX index 4855d59..7344ae9 100644 --- a/Z80 CPM and bootloader (basmon)/hexFiles/BASMON.HEX +++ b/Z80 CPM and bootloader (basmon)/hexFiles/BASMON.HEX @@ -1,345 +1,343 @@ -:0430060000000000C6 -:18000000F3C3A40000000000C332000000000000C31B000000000000BB -:18001800C36C003A0030FE002008CD730028FBDB81C9CD7A0028FBDB44 -:1800300083C9F53A0030FE00200D1801F5CD600028FBF1D381C9F5CDB4 -:18004800660028FBF1D383C9F5CD66002004F1E600C9F1D383F6FFC916 -:18006000DB800FCB47C9DB820FCB47C93A0030FE002007DB80E601FE2D -:1800780000C9DB82E601FE00C9D7FE0A28FBFE1B20023E03C9FE0D2822 -:180090000AFE0C2804FE203801CFC93E0DCF3E0ACF3E0DC9312A303E1B -:1800A80095D380D3823E00320030218103CD37012181032204302A0490 -:1800C000307EB7280CCD5000280723220430C3BE00CD7300280F3E0094 -:1800D800320030CD1B00FE20C2D1001812CD7A0028D43E01320030CD3A -:1800F0001B00FE20C2BE003E0CCD3C00CD5000CD3E0121B202CD3701E9 -:18010800210801E5CD3E013E3ECFCD8100FE2038F9FE3ACAB501CD8DCA -:1801200000E65FFE42CAF601FE47CAAF01FE58CA0D023E3FCF18D57EDC -:18013800B7C8CF2318F93E0DCF3E0ACFC9CD8100FE03C8FE2038F6C907 -:18015000CD450147CD45014FCD8F014F7B915F79C9210000CDA801FEED -:180168000D200E37C9210000CDA801FE0DC8FE2CC8FE0328EE29292956 -:1801800029D630FE0A3802D607E60F856F18E178D630FE0A3802D6079A -:18019800070707074779D630FE0A3802D60780C9CD8100CD8D00C9CDC7 -:1801B0006101D8E5C91E00CD500157CD500167CD50016FCD5001FE018D -:1801C8002009CD50017BA7281E18157AA7280BCD500177233E2ECF15E7 -:1801E00018F1CD50017BA7C8217003CD3701C921AB03CD3701C9215E78 -:1801F80003CD3701CD4501C8E65FFE43CAB603FE57CAB903C9211F021D -:18021000CD3701CD4501C8E65FFE59CA4002C90D0A426F6F7420435027 -:180228002F4D3F000D0A4C6F6164696E672043502F4D2E2E2E0D0A005E -:18024000212C02CD370106183E0032063032073032083032093021002F -:18025800D0220230CD8A021100022A0230192202303A06303C32063021 -:1802700010EA3A0030F52AFEFFE93A0830D38C3A0730D38B3A0630D32A -:180288008AC9F5C5E5DB89FE8020FACD7A023E00D3890E040680DB8991 -:1802A000FEE020FADB8877230520F30D20EEE1C1F1C943502F4D204251 -:1802B8006F6F7420524F4D20322E3020627920472E20536561726C6512 -:1802D0000D0A0D0A4243206F72204257202D20524F4D204241534943CC -:1802E80020436F6C642F5761726D0D0A5820202020202020202D204298 -:180300006F6F742043502F4D20286C6F61642024443030302D24464687 -:180318004646290D0A3A6E6E6E6E2E2E2E202D204C6F616420496E744D -:18033000656C2D4865782066696C65207265636F72640D0A476E6E6E8B -:180348006E202020202D2052756E206C6F63206E6E6E6E0D0A000D0AC9 -:18036000436F6C64206F72207761726D3F0D0A00436865636B73756DA2 -:18037800206572726F720D0A000C5072657373205B73706163655D20EF -:18039000746F2061637469766174652074686520636F6E736F6C652E5F -:1803A8000D0A00436F6D706C6574650D0A00C3BC03C35A04DD21000035 -:1803C000C3C7036D0CE31321B030F9C30220119406066321B0301A77A4 -:1803D800231305C2D603F9CD9508CD630E325A3132A93121A904CD0131 -:1803F00015CDB208CDBB0BB7C21004210D32237CB5CA22047E472F772A -:18040800BE70CAFE03C32204CD870CB7C26307EB2B3ED94677BE70C2DD -:18042000EB032B110C32CD2B0ADAEB0311CEFF225F3119220A31CD704F -:18043800082A0A3111EFFF1911A9317D936F7C9A67E5217204CD0115E1 -:18045000E1CDA41B216304CD0115311631CD9508C3AE072042797465AE -:180468007320667265650D0A00005A383020424153494320566572207F -:18048000342E37620D0A436F70797269676874202843292031393738EC -:18049800206279204D6963726F736F66740D0A00004D656D6F727920CB -:1804B000746F7000191ADD1A2F1AB330C1134617EF13A31C821DBE1824 -:1804C800F11CF71DFD1D5E1E731E9A17DE1E013173168B140D17821611 -:1804E0009316001F931FA316D316DD16C54E44C64F52CE455854C44173 -:1804F8005441C94E505554C4494DD2454144CC4554C74F544FD2554EBE -:18051000C946D24553544F5245C74F535542D2455455524ED2454DD389 -:18052800544F50CF5554CF4ECE554C4CD7414954C44546D04F4B45C401 -:180540004F4B45D3435245454ECC494E4553C34C53D749445448CD4F0B -:180558004E49544F52D34554D245534554D052494E54C34F4E54CC49BA -:180570005354C34C454152C34C4F4144C353415645CE4557D441422827 -:18058800D44FC64ED3504328D448454ECE4F54D3544550ABADAAAFDE2B -:1805A000C14E44CF52BEBDBCD3474EC94E54C14253D55352C65245C9CF -:1805B8004E50D04F53D35152D24E44CC4F47C55850C34F53D3494ED4CF -:1805D000414EC1544ED045454BC445454BD04F494E54CC454ED3545201 -:1805E80024D6414CC15343C3485224C8455824C2494E24CC45465424C7 -:18060000D24947485424CD49442480050C020BDD0F520DE40E19121329 -:180618000F690D0F0DF20CE10DCB0BFE0C2D0D540D030C5217C30D4436 -:180630000C5817F713A117E91E540DCF1EC21EC71EFF1F0431073105CB -:180648000E310C770AAC0C540D540D6F08798B1B79BF177CFD187C5E04 -:18066000197FAC1C5072114671114E46534E52474F4446434F564F4D5C -:18067800554C425344442F304944544D4F534C535354434E55464D4F6F -:180690004858424EC35A04C3820CD300C9D6006F7CDE006778DE004771 -:1806A8003E00C9000000354ACA99391C76982295B3980ADD479853D102 -:1806C00099990A1A9F9865BCCD98D6773E9852C74F80DB00C901FF1C44 -:1806D80000001400140000000000C3A809C30000C30000C300000D32E6 -:1806F000FEFFAA31204572726F720020696E20004F6B0D0A0000427254 -:1807080065616B00210400397E23FE81C04E234623E569607AB3EBCA00 -:180720002607EBCD2B0A010D00E1C809C31007CD4907C5E3C1CD2B0A85 -:180738007E02C80B2BC33507E52A8A31060009093EE53ED0956F3EFFD8 -:180750009CDA58076739E1D81E0CC377072A7931220C311E02011E1472 -:18076800011E00011E12011E22011E0A011E18CD950832F530CD560E96 -:18078000216A06573E3FCD3C0A197ECD3C0ACDBB0BCD3C0A21F406CDB1 -:1807980001152A0C3111FEFFCD2B0ACAC7037CA53CC49C1B3EC1AF3270 -:1807B000F530CD560E210007CD011521FFFF220C31CDA809DABB07CD6B -:1807C800BB0B3C3DCABB07F5CD870CD5CDBF0847D1F1D29B0BD5C5AFC6 -:1807E000327C31CDBB0BB7F5CD4F08DAF407F1F5CA280DB7C5D20B08A4 -:1807F800EB2A86311A020313CD2B0AC2FC076069228631D1F1CA3208BC -:180810002A8631E3C109E5CD2F07E1228631EB74D123237323722311EE -:1808280011311A772313B7C22A08CD7B0823EB626B7E23B6CABB0723D3 -:180840002323AFBE23C24308EB732372C337082A0E31444D7E23B62B4C -:18085800C823237E23666FCD2B0A60697E23666F3FC83FD0C35208C0D0 -:180870002A0E31AF772377232286312A0E312B227E312A5F3122733166 -:18088800AFCDCB0B2A8631228831228A31C12A0A31F9216331226131E5 -:1808A000AF6F67228431327B31228E31E5C52A7E31C93E3FCD3C0A3E0B -:1808B80020CD3C0AC3FE30AF325E310E051111317EFE20CA470947FE33 -:1808D00022CA6709B7CA6E093A5E31B77EC24709FE3F3E9ECA47097EFB -:1808E800FE30DAF208FE3CDA4709D511EB04C5014309C5067F7EFE6184 -:18090000DA0B09FE7BD20B09E65F774EEB23B6F20D09047EE67FC8B954 -:18091800C20D09EBE5131AB7FA3F094F78FE88C22E09CDBB0B2B237E54 -:18093000FE61DA3709E65FB9CA1D09E1C30B0948F1EBC9EB79C1D1238A -:1809480012130CD63ACA5509FE49C25809325E31D654C2C808477EB7CB -:18096000CA6E09B8CA470923120C13C35E092110311213121312C93A2D -:18097800F430B73E0032F430C28B0905CAA809CD3C0A3E052BCA9F092F -:180990007ECD3C0AC3B109052BCD3C0AC2B109CD3C0ACD630EC3A809BD -:1809A8002111310601AF32F430CD660A4FFE7FCA77093AF430B7CACACC -:1809C000093E00CD3C0AAF32F43079FE07CA0E0AFE03CC630E37C8FE25 -:1809D8000DCA5E0EFE15CAA209FE40CA9F09FE5FCA9709FE08CA970955 -:1809F000FE12C2090AC5D5E53600CD1320211131CD0115E1D1C1C3B128 -:180A080009FE20DAB10978FE493E07D2230A7971327C312304CD3C0A15 -:180A2000C3B109CD3C0A3E08C31D0A7C92C07D93C97EE3BE23E3CABBAD -:180A38000BC36307F53AF530B7C23615F1C5F5FE20DA600A3AF23047A6 -:180A50003A5B3104CA5C0A05B8CC630E3C325B31F1C1CDFC1FC9CDC0B0 -:180A68001EE67FFE0FC03AF5302F32F530AFC9CD870CC0C1CD4F08C5FF -:180A8000CDCD0AE14E23462378B1CAAE07CDD60ACDE60BC5CD630E5E8B -:180A9800235623E5EBCDA41B3E20E1CD3C0A7EB723CA830AF2A30AD6D8 -:180AB0007F4F11EC041A13B7F2B50A0DC2B50AE67FCD3C0A1A13B7F2EE -:180AC800BF0AC3A60AE52AF83022F630E1C9E5D52AF63011FFFFED5A51 -:180AE00022F630D1E1F0E52AF83022F630CDC01EFE03CAF90AE1C3D6A2 -:180AF8000A2AF83022F630C35D043E64327B31CD690DC1E5CD520D2267 -:180B1000773121020039CD1007D1C2320B09D52B562B5E2323E52A7761 -:180B280031CD2B0AE1C2160BD1F9EB0E08CD4007E52A7731E3E52A0C2A -:180B400031E3CD2B10CD310AA6CD2810E5CD561AE1C5D5010081515A04 -:180B58007EFEAB3E01C26E0BCDBB0BCD2810E5CD561ACD0A1AE1C5D5BE -:180B7000F533E52A7E31E30681C533CDE60B227E317EFE3ACA9B0BB7B9 -:180B8800C26307237E23B6CA0D0C235E2356EB220C31EBCDBB0B117B7E -:180BA0000BD5C8D680DA690DFE25D26307074F0600EB210B06094E239D -:180BB80046C5EB237EFE3AD0FE20CABB0BFE303F3C3DC9EB2A0E31CA0B -:180BD000E00BEBCD870CE5CD4F086069D1D2280D2B228C31EBC9DFC8C8 -:180BE800D7FE1B2811FE03280DFE13C0D7FE11C8FE03280718F63EFF9C -:180C000032FD30C0F6C0227E3121F6FFC12A0C31F57DA43CCA200C228E -:180C180082312A7E31228431AF32F530CD560EF1210607C29707C3AE3A -:180C3000072A84317CB51E20CA7707EB2A8231220C31EBC9CD8917C007 -:180C480032F130C9E52AFA3006004F0922FA30E1C97EFE41D8FE5B3FBE -:180C6000C9CDBB0BCD2810CD0A1AFA820C3A9731FE90DAB21A0180905B -:180C7800110000E5CD851AE151C81E08C377072B110000CDBB0BD0E51D -:180C9000F5219819CD2B0ADA6307626B19291929F1D6305F160019EB7E -:180CA800E1C38B0CCA7F08CD640C2BCDBB0BE52A5F31CACF0CE1CD318A -:180CC0000A2CD5CD640C2BCDBB0BC26307E3EB7D935F7C9A57DA580707 -:180CD800E52A863101280009CD2B0AD25807EB220A31E1225F31E1C35A -:180CF0007F08CA7B08CD7F08017B0BC30E0D0E03CD4007C1E5E52A0C79 -:180D080031E33E8CF533C5CD870CCD540DE52A0C31CD2B0AE123DC52FA -:180D200008D44F0860692BD81E0EC37707C016FFCD0C07F9FE8C1E04F5 -:180D3800C27707E1220C31237CB5C24C0D3A7C31B7C2AD07217B0BE316 -:180D50003EE1013A0E0006007948477EB7C8B8C823FE22CA580DC35B08 -:180D68000DCD1E12CD310AB4D53A5D31F5CD3A10F1E3227E311FCD2D46 -:180D800010CABC0DE52A9431E523235E23562A0E31CD2B0AD2AB0D2AC3 -:180D98000A31CD2B0AD1D2B30D216F31CD2B0AD2B30D3ED1CD6216EB0F -:180DB000CD9B14CD6216E1CD651AE1C9E5CD621AD1E1C9CD89177E47B8 -:180DC800FE8CCAD20DCD310A882B4B0D78CAA30BCD880CFE2CC0C3D3FC -:180DE0000DCD3A107EFE88CAEF0DCD310AA92BCD2B10CD0A1ACA540D0D -:180DF800CDBB0BDA0F0DC3A20B2BCDBB0BCA630EC8FEA5CA960EFEA872 -:180E1000CA960EE5FE2CCA7F0EFE3BCAB90EC1CD3A10E53A5D31B7C22E -:180E28004F0ECDAF1BCDBF1436202A9431342A94313AF2304704CA4BFA -:180E40000E043A5B31863DB8D4630ECD0415AFC40415E1C3010E3A5B48 -:180E580031B7C8C3630E36002110313E0DCD3C0A3E0ACD3C0AAF325B11 -:180E7000313AF1303DC8F5AFCD3C0AF1C3740E3AF330473A5B31B8D4F6 -:180E8800630ED2B90ED60ED28D0E2FC3AE0EF5CD8617CD310A292BF19D -:180EA000D6A8E5CAA90E3A5B312F83D2B90E3C473E20CD3C0A05C2B2D8 -:180EB8000EE1CDBB0BC3080E3F5265646F2066726F6D207374617274DC -:180ED0000D0A003A7D31B7C25D07C121C00ECD0115C3AE08CD6C147E57 -:180EE800FE223E0032F530C2FE0ECDC014CD310A3BE5CD04153EE5CDD0 -:180F0000B208C1DA0A0C237EB72BC5CA510D362CC3180FE52A8C31F6F0 -:180F1800AF327D31E3C3240FCD310A2CCD1E12E3D57EFE2CCA4C0F3A69 -:180F30007D31B7C2B90F3E3FCD3C0ACDB208D1C1DA0A0C237EB72BC5D9 -:180F4800CA510DD53A5D31B7CA760FCDBB0B5747FE22CA6A0F3A7D314A -:180F6000B757CA670F163A062C2BCDC314EB21810FE3D5C3840DCDBBAA -:180F78000BCD111BE3CD621AE12BCDBB0BCA8D0FFE2CC2D30EE32BCD84 -:180F9000BB0BC2200FD13A7D31B7EBC2E10BD5B621A80FC40115E1C9A2 -:180FA8003F45787472612069676E6F7265640D0A00CD520DB7C2D20F49 -:180FC000237E23B61E06CA7707235E2356EB227931EBCDBB0BFE83C2C1 -:180FD800B90FC34C0F110000C41E12227E31CD0C07C26907F9D57E23C4 -:180FF000F5D5CD481AE3E5CDB517E1CD621AE1CD591AE5CD851AE1C151 -:1810080090CD591ACA1810EB220C316960C3770BF92A7E317EFE2CC27A -:181020007B0BCDBB0BCDE00FCD3A10F6373A5D318FB7E8C37507CD316C -:181038000A282B1600D50E01CD4007CDB1102280312A8031C178FE784A -:18105000D42B107E1600D6B3DA7210FE03D27210FE0117AABA57DA639D -:1810680007227531CDBB0BC356107AB7C299117E227531D6ACD8FE07A3 -:18108000D05F3A5D313DB37BCAF71507835F215506197856BAD023CD5A -:181098002B10C5014910C5434ACD3B1A58514E234623C52A7531C33D5A -:1810B00010AF325D31CDBB0B1E24CA7707DA111BCD590CD21811FE2635 -:1810C8002012CDBB0BFE48CA551FFE42CAC51F1E02CA7707FEACCAB14C -:1810E00010FE2ECA111BFEADCA0711FE22CAC014FEAACAF911FEA7CA90 -:1810F8002414D6B6D22911CD3610CD310A29C9167DCD3D102A8031E596 -:18111000CD331ACD2B10E1C9CD1E12E5EB2294313A5D31B7CC481AE1B9 -:18112800C90600074FC5CDBB0B79FE31DA5011CD3610CD310A2CCD2C0F -:1811400010EB2A9431E3E5EBCD8917EBE3C35811CDFF10E3111311D5CA -:1811580001B404094E236669E915FEADC8FE2DC814FE2BC8FEACC82B77 -:18117000C9F6AFF5CD2B10CD6D0CF1EBC1E3EBCD4B1AF5CD6D0CF1C12C -:181188007921E213C29411A34F78A2E9B34F78B2E921AB113A5D311F8B -:1811A0007A175F166478BAD0C39A10AD1179B71FC1D1F5CD2D1021EFB0 -:1811B80011E5CA851AAF325D31D5CD44167E23234E2346D1C5F5CD483A -:1811D00016CD591AF157E17BB2C87AD601D8AFBB3CD0151D0ABE2303D4 -:1811E800CAD7113FC3151A3C8FC1A0C6FF9FC31C1A165ACD3D10CD2B01 -:1812000010CD6D0C7B2F4F7A2FCDE213C1C349102BCDBB0BC8CD310AB1 -:181218002C011012C5F6AF325C3146CD590CDA6307AF4F325D31CDBB44 -:181230000BDA3A12CD590CDA47124FCDBB0BDA3B12CD590CD23B12D6E0 -:1812480024C256123C325D310F814FCDBB0B3A7B313DCA0313F2661265 -:181260007ED628CADB12AF327B31E550592A8E31CD2B0A119031CA4B56 -:18127800192A8831EB2A8631CD2B0ACA9912799623C28E12789623CA90 -:18129000CD1223232323C38012E1E3D5111B11CD2B0AD1CAD012E3E569 -:1812A800C50106002A8A31E509C1E5CD2F07E1228A3160692288312B59 -:1812C0003600CD2B0AC2BF12D173237223EBE1C932973121FF062294E4 -:1812D80031E1C9E52A5C31E357D5C5CD610CC1F1EBE3E5EB3C577EFE1A -:1812F0002CCAE112CD310A29228031E1225C311E00D511E5F52A8831A8 -:181308003E19EB2A8A31EBCD2B0ACA3B137EB923C21D137EB8235E237B -:181320005623C209133A5C31B7C26C07F1444DCA4B1996CA99131E10C1 -:18133800C37707110400F1CA820C712370234FCD4007232322753171F5 -:18135000233A5C311779010B00D25E13C10371237023F5E5CDF61AEB2F -:18136800E1F13DC25613F5424BEB19DA5807CD4907228A312B3600CD4C -:181380002B0AC27C1303572A75315EEB2909EB2B2B73237223F1DABD36 -:1813980013474F7E2316E15E235623E3F5CD2B0AD23613E5CDF61AD17A -:1813B00019F13D444DC29E132929C109EB2A8031C92A8A31EB2100003E -:1813C800393A5D31B7CADD13CD4416CD44152A0A31EB2A73317D934FD1 -:1813E0007C9A41501E00215D31730690C3211A3A5B3147AFC3E313CD38 -:1813F8007A14CD6C1401520DC5D5CD310A28CD1E12E5EB2B562B5EE120 -:18141000CD2B10CD310A29CD310AB4444DE3712370C3B914CD7A14D597 -:18142800CDFF10CD2B10E35E2356237AB3CA6F077E23666FE52A8E313A -:18144000E3228E312A9231E52A9031E5219031D5CD621AE1CD28102B1D -:18145800CDBB0BC26307E1229031E1229231E1228E31E1C9E52A0C317B -:18147000237CB5E1C01E16C37707CD310AA73E80327B31B647CD2312B0 -:18148800C32B10CD2B10CDAF1BCDBF14CD4416019F16C57E2323E5CDF7 -:1814A0001A15E14E2346CDB314E56FCD3716D1C9CD1A15216F31E577B8 -:1814B8002323732372E1C92B062250E50EFF237E0CB7CAD514BACAD51F -:1814D00014B8C2C614FE22CCBB0BE323EB79CDB314116F312A6131225D -:1814E80094313E01325D31CD651ACD2B0A226131E17EC01E1EC377078A -:1815000023CDBF14CD4416CD591A1C1DC80ACD3C0AFE0DCC6D0E03C373 -:181518000B15B70EF1F52A0A31EB2A73312F4F06FF0923CD2B0ADA380F -:181530001522733123EBF1C9F11E1ACA7707BFF5011C15C52A5F312208 -:181548007331210000E52A0A31E5216331EB2A6131EBCD2B0A015515E3 -:18156000C2A9152A8631EB2A8831EBCD2B0ACA7C157E2323B7CDAC15F3 -:18157800C36615C1EB2A8A31EBCD2B0ACAD215CD591A7BE509B7F27B21 -:1815900015227531E14E0600090923EB2A7531EBCD2B0ACA7C15019B5D -:1815A80015C5F6807E23235E235623F0B7C8444D2A7331CD2B0A606984 -:1815C000D8E1E3CD2B0AE3E56069D0C1F1F1E5D5C5C9D1E17DB4C82B53 -:1815D800462B4EE52B2B6E26000950592B444D2A7331CD3207E17123B6 -:1815F0007069602BC34715C5E52A9431E3CDB110E3CD2C107EE52A9449 -:1816080031E5861E1CDA7707CDB014D1CD4816E3CD4716E52A7131EB66 -:18162000CD2E16CD2E16214610E3E5C3E114E1E37E23234E23466F2CBF -:181638002DC80A120313C33816CD2C102A9431EBCD6216EBC0D5505911 -:181650001B4E2A7331CD2B0AC260164709227331E1C92A61312B462BF9 -:181668004E2B2BCD2B0AC0226131C901F213C5CD4116AF57325D317E54 -:18168000B7C901F213C5CD7716CA820C23235E23561AC93E01CDB01485 -:18169800CD8C172A713173C1C3E114CD3C17AFE34FE57EB8DAB11678DD -:1816B000110E00C5CD1A15C1E1E5232346236668060009444DCDB3140A -:1816C8006FCD3716D1CD4816C3E114CD3C17D1D51A90C3A716EB7ECDA7 -:1816E00041170405CA820CC51EFFFE29CAF616CD310A2CCD8917CD31BB -:1816F8000A29F1E301A916C53DBE0600D04F7E91BB47D843C9CD7716DF -:18171000CA2A185F23237E23666FE5194672E3C57EFE24C22B17CD5576 -:181728001F180DFE25C23517CDC51F1803CD111BC1E170C9EBCD310AA1 -:1817400029C1D1C543C9CD8C1732EF30CDEE30C3F213CD7617C3B6308E -:18175800CD7617F51E002BCDBB0BCA6C17CD310A2CCD8917C1CDEE30B4 -:18177000ABA0CA6D17C9CD891732EF3032B730CD310A2CC38917CDBB09 -:181788000BCD2810CD670C7AB7C2820C2BCDBB0B7BC9CD6D0C1AC3F261 -:1817A00013CD2810CD6D0CD5CD310A2CCD8917D112C921881CCD591AAC -:1817B800C3C417CD591A21C1D1CD331A78B7C83A9731B7CA4B1A90D22D -:1817D000DE172F3CEBCD3B1AEBCD4B1AC1D1FE19D0F5CD701A67F1CD8D -:1817E8008918B4219431F20418CD6918D24A182334CA72072E01CD9FE9 -:1818000018C34A18AF90477E9B5F237E9A57237E994FDC75186863AF97 -:181818004779B7C237184A54656F78D608FEE0C21818AF329731C90521 -:18183000297A1757798F4FF22F18785C45B7CA4A182197318677D22A21 -:1818480018C878219731B7FC5C1846237EE680A94FC34B1A1CC014C003 -:181860000CC00E8034C0C372077E835F237E8A57237E894FC9219831D8 -:181878007E2F77AF6F90477D9B5F7D9A577D994FC90600D608DA9818BE -:18189000435A510E00C38B18C6096FAF2DC8791F4F7A1F577B1F5F78B4 -:1818A8001F47C39B180000008103AA561980F122768045AA3882CD0AA6 -:1818C0001AB7EA820C2197317E01358011F30490F570D5C5CDC417C1AA -:1818D800D104CD601921AD18CDBB1721B118CD521D018080110000CD53 -:1818F000C417F1CD851B01318011187221C1D1CD0A1AC82E00CDC81912 -:181908007932A631EB22A7310100005058211518E5212119E5E52194AA -:18192000317E23B7CA4D19E52E081F6779D23B19E52AA73119EBE13AB0 -:18193800A631891F4F7A1F577B1F5F781F472D7CC22A19E1C9435A51BC -:181950004FC9CD3B1A012084110000CD4B1AC1D1CD0A1ACA66072EFF76 -:18196800CDC81934342B7E32C2302B7E32BE302B7E32BA3041EBAF4FCC -:18198000575F32C530E5C57DCDB930DE003FD2981932C530F1F137D2E3 -:18199800C1E1793C3D1FFA4B18177B175F7A175779174F297817473A1F -:1819B000C5301732C53079B2B3C28519E521973135E1C28519C372072E -:1819C80078B7CAEC197D219731AE80471FA878F2EB19C68077CA4B190E -:1819E000CD701A772BC9CD0A1A2FE1B7E1F22A18C37207CD561A78B7B8 -:1819F800C8C602DA720747CDC41721973134C0C372073A9731B7C83A31 -:181A10009631FE2F179FC03CC9CD0A1A06881100002197314F70060011 -:181A280023368017C31218CD0A1AF02196317EEE8077C9EB2A9431E317 -:181A4000E52A9631E3E5EBC9CD591AEB2294316069229631EBC921940F -:181A5800315E2356234E234623C911943106041A77132305C2671AC9F0 -:181A70002196317E07371F773F1F2323777907371F4F1FAEC978B7CA55 -:181A88000A1A21131AE5CD0A1A79C8219631AE79F8CD9F1A1FA9C9237C -:181AA00078BEC02B79BEC02B7ABEC02B7B96C0E1E1C9474F575FB7C8A1 -:181AB800E5CD561ACD701AAE67FCD61A3E9890CD89187C17DC5C1806DF -:181AD00000DC7518E1C91B7AA33CC00BC92197317EFE983A9431D07E99 -:181AE800CDB21A36987BF57917CD1218F1C921000078B1C83E1029DA6B -:181B00003613EB29EBD20C1B09DA36133DC2FE1AC9FE2DF5CA1D1BFE60 -:181B18002BCA1D1B2BCD2A1847575F2F4FCDBB0BDA6E1BFE2ECA491B83 -:181B3000FE45C24D1BCDBB0BCD6111CDBB0BDA901B14C24D1BAF935F67 -:181B48000C0CCA251BE57B90F4661BF25C1BF5CD5219F13CC2501BD13D -:181B6000F1CC331AEBC9C8F5CDF319F13DC9D557788947C5E5D5CDF36F -:181B780019F1D630CD851BE1C1D1C3251BCD3B1ACD1C1AC1D1C3C4170D -:181B90007B0707830786D6305FC33B1BE521FB06CD0115E1EBAF069823 -:181BA800CD211A210015E5219931E5CD0A1A3620F2BD1B362D23363035 -:181BC000CA731CE5FC331AAFF5CD791C01439111F84FCD851AB7E2EA64 -:181BD8001BF1CD671BF5C3CC1BCD5219F13CF5CD791CCDB2173CCDB2EE -:181BF0001ACD4B1A010603F1813CFA061CFE08D2061C3C473E023D3D86 -:181C0800E1F5118C1C05C2171C362E2336302305362ECC601AC5E5D5FD -:181C2000CD561AE1062F047B965F237A9E5723799E4F2B2BD2261CCD93 -:181C3800691823CD4B1AEBE17023C10DC2171C05CA571C2B7EFE30CAB9 -:181C50004B1CFE2EC4601AF1CA761C364523362BF2671C362D2F3C0616 -:181C68002F04D60AD2691CC63A237023772371E1C901749411F723CD8E -:181C8000851AB7E1E2E11BE900000080A08601102700E8030064000021 -:181C98000A000001000021331AE3E9CD3B1A21881CCD481AC1D1CD0A70 -:181CB0001A78CAF11CF2BC1CB7CA6607B7CA2B18D5C579F67FCD561A72 -:181CC800F2D91CD5C5CDDD1AC1D1F5CD851AE17C1FE1229631E12294EF -:181CE00031DC9E1CCC331AD5C5CDBE18C1D1CDFF18CD3B1A013881116C -:181CF8003BAACDFF183A9731FE88D2E619CDDD1AC680C602DAE619F512 -:181D100021AD18CDB517CDF618F1C1D1F5CDC117CD331A21311DCD618D -:181D28001D110000C14AC3FF1808402E9474704F2E776E02887AE6A0B6 -:181D40002A7C50AAAA7EFFFF7F7F0000808100000081CD3B1A11FD18FD -:181D5800D5E5CD561ACDFF18E1CD3B1A7E23CD481A06F1C1D13DC8D562 -:181D7000C5F5E5CDFF18E1CD591AE5CDC417E1C36A1DCD0A1A21C930F4 -:181D8800FAE31D21EA30CD481A21C930C886E6070600772387874F0984 -:181DA000CD591ACDFF183AC8303CE6030600FE018832C83021E71D874D -:181DB800874F09CDB517CD561A7B59EE4F4F36802B46368021C73034D5 -:181DD0007ED6ABC2DA1D770C151CCD151821EA30C3621A772B772B7760 -:181DE800C3BE1D68B1466899E9926910D1756821411ECDB517CD3B1A08 -:181E000001498311DB0FCD4B1AC1D1CD6019CD3B1ACDDD1AC1D1CDC1F2 -:181E18001721451ECDBB17CD0A1A37F22D1ECDB217CD0A1AB7F5F433B9 -:181E30001A21451ECDB517F1D4331A21491EC3521DDB0F4981000000E3 -:181E48007F05BAD71E866426998758342387E05DA586DA0F4983CD3BC4 -:181E60001ACDFD1DC1E1CD3B1AEBCD4B1ACDF71DC35E19CD0A1AFC9EE2 -:181E78001CFC331A3A9731FE81DA901E0100815159CD601921BB17E59A -:181E9000219A1ECD521D21411EC9094AD73B78026E847BFEC12F7C74B2 -:181EA800319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F00000081C9FA -:181EC000D7C93E0CC3FC1FCD89177B32F230C9CD2810CD6D0CED53F6BC -:181ED80030ED53F830C9CD6D0CD5E146237EC3E313CD2810CD6D0CD5D5 -:181EF000CD310A2CCD2810CD6D0CE3732372E1C9CD2B10CD6D0CC52192 -:181F080099317AFE00280CCD381F78FE302802702371237BCD381F7A17 -:181F2000FE00200578FE30280270237123AF772377C1219931C39114BB -:181F380047E60FFE0A3802C607C6304F780F0F0F0FE60FFE0A3802C650 -:181F500007C63047C9EB210000CD6E1FDA8E1F1805CD6E1F381F29295F -:181F68002929B56F18F3131AFE20CA6E1FD630D8FE0A3805D607FE0A36 -:181F8000D8FE103FC9EB7A4BE5CDE213E1C91E26C37707CD2B10CD6D93 -:181F98000CC521993106110578FE012808CB13CB1230F41804CB13CB0E -:181FB000123E30CE0077230520F3AF772377C1219931C39114EB210039 -:181FC80000CDE21FDAF01FD63029B56FCDE21F30F6EB7A4BE5CDE213AC -:181FE000E1C9131AFE20CAE21FFE30D8FE323FC91E28C37707DD21FF67 -:181FF800FFC3C703C30800C300003E0032FD30C3CE03ED45F5A0C1B846 -:092010003E00C9CD3C0AC3630E79 -:00000001FF +:0430040000000000C8 +:18000000F3C3940000000000C332000000000000C31B000000000000CB +:18001800C35C003A0030FE002008CD630028FBDB81C9CD6A0028FBDB74 +:1800300083C9F53A0030FE00200D1801F5CD500028FBF1D381C9F5CDC4 +:18004800560028FBF1D383C9DB800FCB47C9DB820FCB47C93A0030FE23 +:18006000002007DB80E601FE00C9DB82E601FE00C9D7FE0A28FBFE1B32 +:1800780020023E03C9FE0D280AFE0C2804FE203801CFC93E0DCF3E0A80 +:18009000CF3E0DC93128303E95D380D3823E00320030216503CD1B015F +:1800A8003E01320030216503CD1B01CD6300280F3E00320030CD1B003E +:1800C000FE20C2B3001814CD6A0028E73E01320030CD1B00FE20C2B307 +:1800D8000018003E0CCD3C00CD4600CD2201219602CD1B0121EC00E50E +:1800F000CD22013E3ECFCD7100FE2038F9FE3ACA9901CD7D00E65FFE07 +:1801080042CADA01FE47CA9301FE58CAF1013E3FCF18D57EB7C8CF231B +:1801200018F93E0DCF3E0ACFC9CD7100FE03C8FE2038F6C9CD29014762 +:18013800CD29014FCD73014F7B915F79C9210000CD8C01FE0D200E3741 +:18015000C9210000CD8C01FE0DC8FE2CC8FE0328EE29292929D630FECF +:180168000A3802D607E60F856F18E178D630FE0A3802D60707070707C3 +:180180004779D630FE0A3802D60780C9CD7100CD7D00C9CD4501D8E518 +:18019800C91E00CD340157CD340167CD34016FCD3401FE012009CD340A +:1801B000017BA7281E18157AA7280BCD340177233E2ECF1518F1CD3457 +:1801C800017BA7C8215403CD1B01C9218A03CD1B01C9214203CD1B015B +:1801E000CD2901C8E65FFE43CA9503FE57CA9803C9210302CD1B01CD01 +:1801F8002901C8E65FFE59CA2402C90D0A426F6F742043502F4D3F008F +:180210000D0A4C6F6164696E672043502F4D2E2E2E0D0A00211002CD31 +:180228001B0106183E003204303205303206303207302100D022023063 +:18024000CD6E021100022A0230192202303A04303C32043010EA3A0049 +:1802580030F52AFEFFE93A0630D38C3A0530D38B3A0430D38AC9F5C56F +:18027000E5DB89FE8020FACD5E023E00D3890E040680DB89FEE020FADA +:18028800DB8877230520F30D20EEE1C1F1C943502F4D20426F6F7420EF +:1802A000524F4D20322E3020627920472E20536561726C650D0A0D0A6E +:1802B8004243206F72204257202D20524F4D20424153494320436F6CD4 +:1802D000642F5761726D0D0A5820202020202020202D20426F6F74207C +:1802E80043502F4D20286C6F61642024443030302D2446464646290D50 +:180300000A3A6E6E6E6E2E2E2E202D204C6F616420496E74656C2D48E1 +:1803180065782066696C65207265636F72640D0A476E6E6E6E2020201B +:18033000202D2052756E206C6F63206E6E6E6E0D0A000D0A436F6C642D +:18034800206F72207761726D3F0D0A00436865636B73756D20657272D3 +:180360006F720D0A000C5072657373205B53504143455D20746F2061AC +:180378006374697661746520636F6E736F6C650D0A00436F6D706C65F3 +:1803900074650D0A00C39B03C33904DD210000C3A6034C0CC21321B09C +:1803A80030F9C3E11F117306066321B0301A77231305C2B503F9CD74DD +:1803C00008CD420E325A3132A931218804CDE014CD9108CD9A0BB7C278 +:1803D800EF03210D32237CB5CA01047E472F77BE70CADD03C30104CDC0 +:1803F000660CB7C24207EB2B3ED94677BE70C2CA032B110C32CD0A0ABF +:18040800DACA0311CEFF225F3119220A31CD4F082A0A3111EFFF19117D +:18042000A9317D936F7C9A67E5215104CDE014E1CD831B214204CDE072 +:1804380014311631CD7408C38D0720427974657320667265650D0A0080 +:18045000005A38302042415349432056657220342E37620D0A436F70AF +:18046800797269676874202843292031393738206279204D6963726F23 +:18048000736F66740D0A00004D656D6F727920746F7000F819BC1A0EB0 +:180498001AB330A0132517CE13821C611D9D18D01CD61DDC1D3D1E5229 +:1804B0001E7917BD1E013152166A14EC1661167216DF1E721F8216B2BA +:1804C80016BC16C54E44C64F52CE455854C4415441C94E505554C44900 +:1804E0004DD2454144CC4554C74F544FD2554EC946D24553544F5245D5 +:1804F800C74F535542D2455455524ED2454DD3544F50CF5554CF4ECEFF +:18051000554C4CD7414954C44546D04F4B45C44F4B45D3435245454E50 +:18052800CC494E4553C34C53D749445448CD4F4E49544F52D34554D278 +:1805400045534554D052494E54C34F4E54CC495354C34C454152C34CFF +:180558004F4144C353415645CE4557D4414228D44FC64ED3504328D443 +:1805700048454ECE4F54D3544550ABADAAAFDEC14E44CF52BEBDBCD35E +:18058800474EC94E54C14253D55352C65245C94E50D04F53D35152D20D +:1805A0004E44CC4F47C55850C34F53D3494ED4414EC1544ED045454BA8 +:1805B800C445454BD04F494E54CC454ED3545224D6414CC15343C348C7 +:1805D0005224C8455824C2494E24CC45465424D24947485424CD49444C +:1805E8002480E40BE10ABC0F310DC30EF811F20E480DEE0CD10CC00DA1 +:18060000AA0BDD0C0C0D330DE20B3117A20D230C3717D6138017C81E24 +:18061800330DAE1EA11EA61EDE1F04310731E40D100C560A8B0C330D8D +:18063000330D4E08796A1B799E177CDC187C3D197F8B1C505111465040 +:18064800114E46534E52474F4446434F564F4D554C425344442F3049F8 +:1806600044544D4F534C535354434E55464D4F4858424EC33904C36199 +:180678000CD300C9D6006F7CDE006778DE00473E00C9000000354ACACF +:1806900099391C76982295B3980ADD479853D199990A1A9F9865BCCDEF +:1806A80098D6773E9852C74F80DB00C901FF1C000014001400000000AF +:1806C00000C38709C30000C30000C300000D32FEFFAA31204572726FB7 +:1806D800720020696E20004F6B0D0A0000427265616B00210400397EEF +:1806F00023FE81C04E234623E569607AB3EBCA0507EBCD0A0A010D0040 +:18070800E1C809C3EF06CD2807C5E3C1CD0A0A7E02C80B2BC31407E5E8 +:180720002A8A31060009093EE53ED0956F3EFF9CDA37076739E1D81E27 +:180738000CC356072A7931220C311E02011E14011E00011E12011E2266 +:18075000011E0A011E18CD740832F530CD350E214906573E3FCD1B0A4B +:18076800197ECD1B0ACD9A0BCD1B0A21D306CDE0142A0C3111FEFFCD8F +:180780000A0ACAA6037CA53CC47B1B3EC1AF32F530CD350E21DF06CD3B +:18079800E01421FFFF220C31CD8709DA9A07CD9A0B3C3DCA9A07F5CDE7 +:1807B000660CD5CD9E0847D1F1D27A0BD5C5AF327C31CD9A0BB7F5CD04 +:1807C8002E08DAD307F1F5CA070DB7C5D2EA07EB2A86311A020313CD61 +:1807E0000A0AC2DB076069228631D1F1CA11082A8631E3C109E5CD0EB4 +:1807F80007E1228631EB74D12323732372231111311A772313B7C209EB +:1808100008CD5A0823EB626B7E23B6CA9A07232323AFBE23C22208EB2C +:18082800732372C316082A0E31444D7E23B62BC823237E23666FCD0AF8 +:180840000A60697E23666F3FC83FD0C33108C02A0E31AF772377232217 +:1808580086312A0E312B227E312A5F31227331AFCDAA0B2A8631228830 +:1808700031228A31C12A0A31F9216331226131AF6F67228431327B31A0 +:18088800228E31E5C52A7E31C93E3FCD1B0A3E20CD1B0AC3FE30AF329A +:1808A0005E310E051111317EFE20CA260947FE22CA4609B7CA4D093A25 +:1808B8005E31B77EC22609FE3F3E9ECA26097EFE30DAD108FE3CDA26C8 +:1808D00009D511CA04C5012209C5067F7EFE61DAEA08FE7BD2EA08E64C +:1808E8005F774EEB23B6F2EC08047EE67FC8B9C2EC08EBE5131AB7FA5E +:180900001E094F78FE88C20D09CD9A0B2B237EFE61DA1609E65FB9CA35 +:18091800FC08E1C3EA0848F1EBC9EB79C1D12312130CD63ACA3409FEE1 +:1809300049C23709325E31D654C2A708477EB7CA4D09B8CA2609231286 +:180948000C13C33D092110311213121312C93AF430B73E0032F430C27D +:180960006A0905CA8709CD1B0A3E052BCA7E097ECD1B0AC39009052B00 +:18097800CD1B0AC29009CD1B0ACD420EC387092111310601AF32F43049 +:18099000CD450A4FFE7FCA56093AF430B7CAA9093E00CD1B0AAF32F4A8 +:1809A8003079FE07CAED09FE03CC420E37C8FE0DCA3D0EFE15CA810926 +:1809C000FE40CA7E09FE5FCA7609FE08CA7609FE12C2E809C5D5E53623 +:1809D80000CDF21F211131CDE014E1D1C1C39009FE20DA900978FE49E6 +:1809F0003E07D2020A7971327C312304CD1B0AC39009CD1B0A3E08C393 +:180A0800FC097C92C07D93C97EE3BE23E3CA9A0BC34207F53AF530B77F +:180A2000C21515F1C5F5FE20DA3F0A3AF230473A5B3104CA3B0A05B8AD +:180A3800CC420E3C325B31F1C1CDDB1FC9CD9F1EE67FFE0FC03AF53033 +:180A50002F32F530AFC9CD660CC0C1CD2E08C5CDAC0AE14E2346237852 +:180A6800B1CA8D07CDB50ACDC50BC5CD420E5E235623E5EBCD831B3EE9 +:180A800020E1CD1B0A7EB723CA620AF2820AD67F4F11CB041A13B7F205 +:180A9800940A0DC2940AE67FCD1B0A1A13B7F29E0AC3850AE52AF830DD +:180AB00022F630E1C9E5D52AF63011FFFFED5A22F630D1E1F0E52AF8EB +:180AC8003022F630CD9F1EFE03CAD80AE1C3B50A2AF83022F630C33C6B +:180AE000043E64327B31CD480DC1E5CD310D22773121020039CDEF06BF +:180AF800D1C2110B09D52B562B5E2323E52A7731CD0A0AE1C2F50AD1FE +:180B1000F9EB0E08CD1F07E52A7731E3E52A0C31E3CD0A10CD100AA6A3 +:180B2800CD0710E5CD351AE1C5D5010081515A7EFEAB3E01C24D0BCDDB +:180B40009A0BCD0710E5CD351ACDE919E1C5D5F533E52A7E31E3068179 +:180B5800C533CDC50B227E317EFE3ACA7A0BB7C24207237E23B6CAEC28 +:180B70000B235E2356EB220C31EBCD9A0B115A0BD5C8D680DA480DFE2B +:180B880025D24207074F0600EB21EA05094E2346C5EB237EFE3AD0FEA7 +:180BA00020CA9A0BFE303F3C3DC9EB2A0E31CABF0BEBCD660CE5CD2E0D +:180BB800086069D1D2070D2B228C31EBC9DFC8D7FE1B2811FE03280DD9 +:180BD000FE13C0D7FE11C8FE03280718F63EFF32FD30C0F6C0227E316D +:180BE80021F6FFC12A0C31F57DA43CCAFF0B2282312A7E31228431AF5D +:180C000032F530CD350EF121E506C27607C38D072A84317CB51E20CACA +:180C18005607EB2A8231220C31EBC9CD6817C032F130C9E52AFA300625 +:180C3000004F0922FA30E1C97EFE41D8FE5B3FC9CD9A0BCD0710CDE95C +:180C480019FA610C3A9731FE90DA911A018090110000E5CD641AE1517B +:180C6000C81E08C356072B110000CD9A0BD0E5F5219819CD0A0ADA4247 +:180C780007626B19291929F1D6305F160019EBE1C36A0CCA5E08CD4342 +:180C90000C2BCD9A0BE52A5F31CAAE0CE1CD100A2CD5CD430C2BCD9A09 +:180CA8000BC24207E3EB7D935F7C9A57DA3707E52A863101280009CD97 +:180CC0000A0AD23707EB220A31E1225F31E1C35E08CA5A08CD5E0801B3 +:180CD8005A0BC3ED0C0E03CD1F07C1E5E52A0C31E33E8CF533C5CD6620 +:180CF0000CCD330DE52A0C31CD0A0AE123DC3108D42E0860692BD81E99 +:180D08000EC35607C016FFCDEB06F9FE8C1E04C25607E1220C31237C6F +:180D2000B5C22B0D3A7C31B7C28C07215A0BE33EE1013A0E00060079C9 +:180D380048477EB7C8B8C823FE22CA370DC33A0DCDFD11CD100AB4D5F1 +:180D50003A5D31F5CD1910F1E3227E311FCD0C10CA9B0DE52A9431E500 +:180D680023235E23562A0E31CD0A0AD28A0D2A0A31CD0A0AD1D2920D1B +:180D8000216F31CD0A0AD2920D3ED1CD4116EBCD7A14CD4116E1CD44B9 +:180D98001AE1C9E5CD411AD1E1C9CD68177E47FE8CCAB10DCD100A8865 +:180DB0002B4B0D78CA820BCD670CFE2CC0C3B20DCD19107EFE88CACE9B +:180DC8000DCD100AA92BCD0A10CDE919CA330DCD9A0BDAEE0CC3810BF6 +:180DE0002BCD9A0BCA420EC8FEA5CA750EFEA8CA750EE5FE2CCA5E0E54 +:180DF800FE3BCA980EC1CD1910E53A5D31B7C22E0ECD8E1BCD9E1436F6 +:180E1000202A9431342A94313AF2304704CA2A0E043A5B31863DB8D4D6 +:180E2800420ECDE314AFC4E314E1C3E00D3A5B31B7C8C3420E360021F4 +:180E400010313E0DCD1B0A3E0ACD1B0AAF325B313AF1303DC8F5AFCDA4 +:180E58001B0AF1C3530E3AF330473A5B31B8D4420ED2980ED60ED26C68 +:180E70000E2FC38D0EF5CD6517CD100A292BF1D6A8E5CA880E3A5B31DC +:180E88002F83D2980E3C473E20CD1B0A05C2910EE1CD9A0BC3E70D3FA6 +:180EA0005265646F2066726F6D2073746172740D0A003A7D31B7C23CDA +:180EB80007C1219F0ECDE014C38D08CD4B147EFE223E0032F530C2DD75 +:180ED0000ECD9F14CD100A3BE5CDE3143EE5CD9108C1DAE90B237EB741 +:180EE8002BC5CA300D362CC3F70EE52A8C31F6AF327D31E3C3030FCDFB +:180F0000100A2CCDFD11E3D57EFE2CCA2B0F3A7D31B7C2980F3E3FCD02 +:180F18001B0ACD9108D1C1DAE90B237EB72BC5CA300DD53A5D31B7CA69 +:180F3000550FCD9A0B5747FE22CA490F3A7D31B757CA460F163A062C5C +:180F48002BCDA214EB21600FE3D5C3630DCD9A0BCDF01AE3CD411AE148 +:180F60002BCD9A0BCA6C0FFE2CC2B20EE32BCD9A0BC2FF0ED13A7D31E3 +:180F7800B7EBC2C00BD5B621870FC4E014E1C93F45787472612069675B +:180F90006E6F7265640D0A00CD310DB7C2B10F237E23B61E06CA560711 +:180FA800235E2356EB227931EBCD9A0BFE83C2980FC32B0F110000C467 +:180FC000FD11227E31CDEB06C24807F9D57E23F5D5CD271AE3E5CD94FB +:180FD80017E1CD411AE1CD381AE5CD641AE1C190CD381ACAF70FEB2283 +:180FF0000C316960C3560BF92A7E317EFE2CC25A0BCD9A0BCDBF0FCD44 +:181008001910F6373A5D318FB7E8C35407CD100A282B1600D50E01CD65 +:181020001F07CD90102280312A8031C178FE78D40A107E1600D6B3DAE3 +:181038005110FE03D25110FE0117AABA57DA4207227531CD9A0BC335E5 +:18105000107AB7C278117E227531D6ACD8FE07D05F3A5D313DB37BCA2B +:18106800D61507835F213406197856BAD023CD0A10C5012810C5434A76 +:18108000CD1A1A58514E234623C52A7531C31C10AF325D31CD9A0B1E51 +:1810980024CA5607DAF01ACD380CD2F710FE262012CD9A0BFE48CA341B +:1810B0001FFE42CAA41F1E02CA5607FEACCA9010FE2ECAF01AFEADCA6C +:1810C800E610FE22CA9F14FEAACAD811FEA7CA0314D6B6D20811CD1543 +:1810E00010CD100A29C9167DCD1C102A8031E5CD121ACD0A10E1C9CD6C +:1810F800FD11E5EB2294313A5D31B7CC271AE1C90600074FC5CD9A0B52 +:1811100079FE31DA2F11CD1510CD100A2CCD0B10EB2A9431E3E5EBCDBE +:181128006817EBE3C33711CDDE10E311F210D5019304094E236669E907 +:1811400015FEADC8FE2DC814FE2BC8FEACC82BC9F6AFF5CD0A10CD4C17 +:181158000CF1EBC1E3EBCD2A1AF5CD4C0CF1C17921C113C27311A34F85 +:1811700078A2E9B34F78B2E9218A113A5D311F7A175F166478BAD0C37D +:1811880079108C1179B71FC1D1F5CD0C1021CE11E5CA641AAF325D31CE +:1811A000D5CD23167E23234E2346D1C5F5CD2716CD381AF157E17BB2D7 +:1811B800C87AD601D8AFBB3CD0151D0ABE2303CAB6113FC3F4193C8F2D +:1811D000C1A0C6FF9FC3FB19165ACD1C10CD0A10CD4C0C7B2F4F7A2F54 +:1811E800CDC113C1C328102BCD9A0BC8CD100A2C01EF11C5F6AF325C21 +:181200003146CD380CDA4207AF4F325D31CD9A0BDA1912CD380CDA26E5 +:18121800124FCD9A0BDA1A12CD380CD21A12D624C235123C325D310FC8 +:18123000814FCD9A0B3A7B313DCAE212F245127ED628CABA12AF327BCC +:1812480031E550592A8E31CD0A0A119031CA2A192A8831EB2A8631CDAA +:181260000A0ACA7812799623C26D12789623CAAC1223232323C35F1222 +:18127800E1E3D511FA10CD0A0AD1CAAF12E3E5C50106002A8A31E50906 +:18129000C1E5CD0E07E1228A3160692288312B3600CD0A0AC29E12D1D7 +:1812A80073237223EBE1C932973121DE06229431E1C9E52A5C31E35708 +:1812C000D5C5CD400CC1F1EBE3E5EB3C577EFE2CCAC012CD100A29220A +:1812D8008031E1225C311E00D511E5F52A88313E19EB2A8A31EBCD0A13 +:1812F0000ACA1A137EB923C2FC127EB8235E235623C2E8123A5C31B72E +:18130800C24B07F1444DCA2A1996CA78131E10C35607110400F1CA61C0 +:181320000C712370234FCD1F07232322753171233A5C311779010B003B +:18133800D23D13C10371237023F5E5CDD51AEBE1F13DC23513F5424B74 +:18135000EB19DA3707CD2807228A312B3600CD0A0AC25B1303572A7525 +:18136800315EEB2909EB2B2B73237223F1DA9C13474F7E2316E15E232C +:181380005623E3F5CD0A0AD21513E5CDD51AD119F13D444DC27D132964 +:1813980029C109EB2A8031C92A8A31EB210000393A5D31B7CABC13CDAC +:1813B0002316CD23152A0A31EB2A73317D934F7C9A41501E00215D31F6 +:1813C800730690C3001A3A5B3147AFC3C213CD5914CD4B1401310DC569 +:1813E000D5CD100A28CDFD11E5EB2B562B5EE1CD0A10CD100A29CD10A7 +:1813F8000AB4444DE3712370C39814CD5914D5CDDE10CD0A10E35E2323 +:1814100056237AB3CA4E077E23666FE52A8E31E3228E312A9231E52AFB +:181428009031E5219031D5CD411AE1CD07102BCD9A0BC24207E1229027 +:1814400031E1229231E1228E31E1C9E52A0C31237CB5E1C01E16C356A3 +:1814580007CD100AA73E80327B31B647CD0212C30A10CD0A10CD8E1B33 +:18147000CD9E14CD2316017E16C57E2323E5CDF914E14E2346CD9214F7 +:18148800E56FCD1616D1C9CDF914216F31E5772323732372E1C92B0645 +:1814A0002250E50EFF237E0CB7CAB414BACAB414B8C2A514FE22CC9AD5 +:1814B8000BE323EB79CD9214116F312A61312294313E01325D31CD44D0 +:1814D0001ACD0A0A226131E17EC01E1EC3560723CD9E14CD2316CD382D +:1814E8001A1C1DC80ACD1B0AFE0DCC4C0E03C3EA14B70EF1F52A0A31D0 +:18150000EB2A73312F4F06FF0923CD0A0ADA171522733123EBF1C9F105 +:181518001E1ACA5607BFF501FB14C52A5F31227331210000E52A0A31E8 +:18153000E5216331EB2A6131EBCD0A0A013415C288152A8631EB2A886F +:1815480031EBCD0A0ACA5B157E2323B7CD8B15C34515C1EB2A8A31EBD3 +:18156000CD0A0ACAB115CD381A7BE509B7F25A15227531E14E0600095C +:181578000923EB2A7531EBCD0A0ACA5B15017A15C5F6807E23235E235E +:181590005623F0B7C8444D2A7331CD0A0A6069D8E1E3CD0A0AE3E560AD +:1815A80069D0C1F1F1E5D5C5C9D1E17DB4C82B462B4EE52B2B6E2600A3 +:1815C0000950592B444D2A7331CD1107E171237069602BC32615C5E571 +:1815D8002A9431E3CD9010E3CD0B107EE52A9431E5861E1CDA5607CDF6 +:1815F0008F14D1CD2716E3CD2616E52A7131EBCD0D16CD0D16212510A7 +:18160800E3E5C3C014E1E37E23234E23466F2C2DC80A120313C317167A +:18162000CD0B102A9431EBCD4116EBC0D550591B4E2A7331CD0A0AC2C9 +:181638003F164709227331E1C92A61312B462B4E2B2BCD0A0AC0226165 +:1816500031C901D113C5CD2016AF57325D317EB7C901D113C5CD561634 +:18166800CA610C23235E23561AC93E01CD8F14CD6B172A713173C1C372 +:18168000C014CD1B17AFE34FE57EB8DA901678110E00C5CDF914C1E12B +:18169800E5232346236668060009444DCD92146FCD1616D1CD2716C3BF +:1816B000C014CD1B17D1D51A90C38616EB7ECD20170405CA610CC51E10 +:1816C800FFFE29CAD516CD100A2CCD6817CD100A29F1E3018816C53D4B +:1816E000BE0600D04F7E91BB47D843C9CD5616CA09185F23237E23664A +:1816F8006FE5194672E3C57EFE24C20A17CD341F180DFE25C21417CD68 +:18171000A41F1803CDF01AC1E170C9EBCD100A29C1D1C543C9CD6B1784 +:1817280032EF30CDEE30C3D113CD5517C3B630CD5517F51E002BCD9A06 +:181740000BCA4B17CD100A2CCD6817C1CDEE30ABA0CA4C17C9CD6817C2 +:1817580032EF3032B730CD100A2CC36817CD9A0BCD0710CD460C7AB714 +:18177000C2610C2BCD9A0B7BC9CD4C0C1AC3D113CD0710CD4C0CD5CDC0 +:18178800100A2CCD6817D112C921671CCD381AC3A317CD381A21C1D1F9 +:1817A000CD121A78B7C83A9731B7CA2A1A90D2BD172F3CEBCD1A1AEB02 +:1817B800CD2A1AC1D1FE19D0F5CD4F1A67F1CD6818B4219431F2E31739 +:1817D000CD4818D229182334CA51072E01CD7E18C32918AF90477E9B13 +:1817E8005F237E9A57237E994FDC54186863AF4779B7C216184A546543 +:181800006F78D608FEE0C2F717AF329731C905297A1757798F4FF20E7E +:1818180018785C45B7CA29182197318677D20918C878219731B7FC3BD5 +:181830001846237EE680A94FC32A1A1CC014C00CC00E8034C0C3510723 +:181848007E835F237E8A57237E894FC92198317E2F77AF6F90477D9B49 +:181860005F7D9A577D994FC90600D608DA7718435A510E00C36A18C621 +:18187800096FAF2DC8791F4F7A1F577B1F5F781F47C37A1800000081B8 +:1818900003AA561980F122768045AA3882CDE919B7EA610C2197317EAE +:1818A80001358011F30490F570D5C5CDA317C1D104CD3F19218C18CD07 +:1818C0009A17219018CD311D018080110000CDA317F1CD641B013180F3 +:1818D80011187221C1D1CDE919C82E00CDA7197932A631EB22A73101F0 +:1818F0000000505821F417E5210019E5E52194317E23B7CA2C19E52EC3 +:18190800081F6779D21A19E52AA73119EBE13AA631891F4F7A1F577B7C +:181920001F5F781F472D7CC20919E1C9435A514FC9CD1A1A012084115F +:181938000000CD2A1AC1D1CDE919CA45072EFFCDA71934342B7E32C250 +:18195000302B7E32BE302B7E32BA3041EBAF4F575F32C530E5C57DCDC6 +:18196800B930DE003FD2771932C530F1F137D2C1E1793C3D1FFA2A18FE +:18198000177B175F7A175779174F297817473AC5301732C53079B2B336 +:18199800C26419E521973135E1C26419C3510778B7CACB197D21973177 +:1819B000AE80471FA878F2CA19C68077CA2A19CD4F1A772BC9CDE9195C +:1819C8002FE1B7E1F20918C35107CD351A78B7C8C602DA510747CDA36D +:1819E0001721973134C0C351073A9731B7C83A9631FE2F179FC03CC9B6 +:1819F800CDE91906881100002197314F70060023368017C3F117CDE94A +:181A100019F02196317EEE8077C9EB2A9431E3E52A9631E3E5EBC9CDC5 +:181A2800381AEB2294316069229631EBC92194315E2356234E23462362 +:181A4000C911943106041A77132305C2461AC92196317E07371F773FB5 +:181A58001F2323777907371F4F1FAEC978B7CAE91921F219E5CDE91904 +:181A700079C8219631AE79F8CD7E1A1FA9C92378BEC02B79BEC02B7A40 +:181A8800BEC02B7B96C0E1E1C9474F575FB7C8E5CD351ACD4F1AAE672A +:181AA000FCB51A3E9890CD68187C17DC3B180600DC5418E1C91B7AA3BE +:181AB8003CC00BC92197317EFE983A9431D07ECD911A36987BF57917B6 +:181AD000CDF117F1C921000078B1C83E1029DA1513EB29EBD2EB1A0905 +:181AE800DA15133DC2DD1AC9FE2DF5CAFC1AFE2BCAFC1A2BCD091847BC +:181B0000575F2F4FCD9A0BDA4D1BFE2ECA281BFE45C22C1BCD9A0BCD21 +:181B18004011CD9A0BDA6F1B14C22C1BAF935F0C0CCA041BE57B90F4EB +:181B3000451BF23B1BF5CD3119F13CC22F1BD1F1CC121AEBC9C8F5CDB8 +:181B4800D219F13DC9D557788947C5E5D5CDD219F1D630CD641BE1C113 +:181B6000D1C3041BCD1A1ACDFB19C1D1C3A3177B0707830786D6305FCB +:181B7800C31A1BE521DA06CDE014E1EBAF0698CD001A21DF14E5219903 +:181B900031E5CDE9193620F29C1B362D233630CA521CE5FC121AAFF584 +:181BA800CD581C01439111F84FCD641AB7E2C91BF1CD461BF5C3AB1B52 +:181BC000CD3119F13CF5CD581CCD91173CCD911ACD2A1A010603F181DD +:181BD8003CFAE51BFE08D2E51B3C473E023D3DE1F5116B1C05C2F61B64 +:181BF000362E2336302305362ECC3F1AC5E5D5CD351AE1062F047B9679 +:181C08005F237A9E5723799E4F2B2BD2051CCD481823CD2A1AEBE17064 +:181C200023C10DC2F61B05CA361C2B7EFE30CA2A1CFE2EC43F1AF1CADC +:181C3800551C364523362BF2461C362D2F3C062F04D60AD2481CC63AB3 +:181C5000237023772371E1C901749411F723CD641AB7E1E2C01BE90054 +:181C6800000080A08601102700E803006400000A000001000021121ADF +:181C8000E3E9CD1A1A21671CCD271AC1D1CDE91978CAD01CF29B1CB7DE +:181C9800CA4507B7CA0A18D5C579F67FCD351AF2B81CD5C5CDBC1AC113 +:181CB000D1F5CD641AE17C1FE1229631E1229431DC7D1CCC121AD5C5F6 +:181CC800CD9D18C1D1CDDE18CD1A1A013881113BAACDDE183A9731FEB9 +:181CE00088D2C519CDBC1AC680C602DAC519F5218C18CD9417CDD5185F +:181CF800F1C1D1F5CDA017CD121A21101DCD401D110000C14AC3DE1892 +:181D100008402E9474704F2E776E02887AE6A02A7C50AAAA7EFFFF7F9C +:181D28007F0000808100000081CD1A1A11DC18D5E5CD351ACDDE18E122 +:181D4000CD1A1A7E23CD271A06F1C1D13DC8D5C5F5E5CDDE18E1CD3830 +:181D58001AE5CDA317E1C3491DCDE91921C930FAC21D21EA30CD271AD8 +:181D700021C930C886E6070600772387874F09CD381ACDDE183AC830EC +:181D88003CE6030600FE018832C83021C61D87874F09CD9417CD351A69 +:181DA0007B59EE4F4F36802B46368021C730347ED6ABC2B91D770C1573 +:181DB8001CCDF41721EA30C3411A772B772B77C39D1D68B1466899E945 +:181DD000926910D1756821201ECD9417CD1A1A01498311DB0FCD2A1A91 +:181DE800C1D1CD3F19CD1A1ACDBC1AC1D1CDA01721241ECD9A17CDE9DB +:181E00001937F20C1ECD9117CDE919B7F5F4121A21241ECD9417F1D4AE +:181E1800121A21281EC3311DDB0F49810000007F05BAD71E866426997E +:181E30008758342387E05DA586DA0F4983CD1A1ACDDC1DC1E1CD1A1A56 +:181E4800EBCD2A1ACDD61DC33D19CDE919FC7D1CFC121A3A9731FE81A0 +:181E6000DA6F1E0100815159CD3F19219A17E521791ECD311D21201EC9 +:181E7800C9094AD73B78026E847BFEC12F7C74319A7D843D5A7DC87F38 +:181E9000917EE4BB4C7E6CAAAA7F00000081C9D7C93E0CC3DB1FCD685D +:181EA800177B32F230C9CD0710CD4C0CED53F630ED53F830C9CD4C0CAE +:181EC000D5E146237EC3C213CD0710CD4C0CD5CD100A2CCD0710CD4CE7 +:181ED8000CE3732372E1C9CD0A10CD4C0CC52199317AFE00280CCD1705 +:181EF0001F78FE302802702371237BCD171F7AFE00200578FE302802D9 +:181F080070237123AF772377C1219931C3701447E60FFE0A3802C6079C +:181F2000C6304F780F0F0F0FE60FFE0A3802C607C63047C9EB2100009A +:181F3800CD4D1FDA6D1F1805CD4D1F381F29292929B56F18F3131AFE47 +:181F500020CA4D1FD630D8FE0A3805D607FE0AD8FE103FC9EB7A4BE598 +:181F6800CDC113E1C91E26C35607CD0A10CD4C0CC52199310611057862 +:181F8000FE012808CB13CB1230F41804CB13CB123E30CE007723052069 +:181F9800F3AF772377C1219931C37014EB210000CDC11FDACF1FD63004 +:181FB00029B56FCDC11F30F6EB7A4BE5CDC113E1C9131AFE20CAC11F24 +:181FC800FE30D8FE323FC91E28C35607DD21FFFFC3A603C30800C30067 +:181FE000003E0032FD30C3AD03ED45F5A0C1B83E00C9CD1B0AC3420E8D +:00000001FF diff --git a/Z80 CPM and bootloader (basmon)/hexFiles/intMon.hex b/Z80 CPM and bootloader (basmon)/hexFiles/intMon.hex new file mode 100644 index 0000000..dc90ff2 --- /dev/null +++ b/Z80 CPM and bootloader (basmon)/hexFiles/intMon.hex @@ -0,0 +1,341 @@ +:0430060000000000C6 +:18000000F3C3A40000000000C332000000000000C31B000000000000BB +:18001800C36C003A0030FE002008CD730028FBDB81C9CD7A0028FBDB44 +:1800300083C9F53A0030FE00200D1801F5CD600028FBF1D381C9F5CDB4 +:18004800660028FBF1D383C9F5CD66002004F1E600C9F1D383F6FFC916 +:18006000DB800FCB47C9DB820FCB47C93A0030FE002007DB80E601FE2D +:1800780000C9DB82E601FE00C9D7FE0A28FBFE1B20023E03C9FE0D2822 +:180090000AFE0C2804FE203801CFC93E0DCF3E0ACF3E0DC9312A303E1B +:1800A80095D380D3823E00320030210E03CD3701210E032204302A0476 +:1800C000307EB7280CCD5000280723220430C3BE00CD7300280F3E0094 +:1800D800320030CD1B00FE20C2D1001812CD7A0028D43E01320030CD3A +:1800F0001B00FE20C2BE003E0CCD3C00CD5000CD3E01219C02CD3701FF +:18010800210801E5CD3E013E3ECFCD8100FE2038F9FE3ACAB501CD8DCA +:1801200000E65FFE49CAF601FE47CAAF01FE58CAFA013E3FCF18D57EE9 +:18013800B7C8CF2318F93E0DCF3E0ACFC9CD8100FE03C8FE2038F6C907 +:18015000CD450147CD45014FCD8F014F7B915F79C9210000CDA801FEED +:180168000D200E37C9210000CDA801FE0DC8FE2CC8FE0328EE29292956 +:1801800029D630FE0A3802D607E60F856F18E178D630FE0A3802D6079A +:18019800070707074779D630FE0A3802D60780C9CD8100CD8D00C9CDC7 +:1801B0006101D8E5C91E00CD500157CD500167CD50016FCD5001FE018D +:1801C8002009CD50017BA7281E18157AA7280BCD500177233E2ECF15E7 +:1801E00018F1CD50017BA7C821FD02CD3701C9213403CD3701C9C33FE0 +:1801F80003C9210C02CD3701CD4501C8E65FFE59CA2A02C90D0A426FF1 +:180210006F742043502F4D3F000D0A4C6F6164696E672043502F4D0D74 +:180228000A00211902CD370106183E0032063032073032083032093071 +:180240002100D0220230CD74021100022A0230192202303A06303C3264 +:18025800063010EA3A0030F52AFEFFE93A0830D38C3A0730D38B3A060F +:1802700030D38AC9F5C5E5DB89FE8020FACD64023E00D3890E04068020 +:18028800DB89FEE020FADB8877230520F30D20EEE1C1F1C943502F4D67 +:1802A00020426F6F7420524F4D20322E300D0A492D5374727420496EC3 +:1802B8007472700D0A582D426F6F742043502F4D0D0A3A6E6E6E6E2D43 +:1802D0004C6F6164204920726372640D0A476E6E6E6E2D52206C6F636F +:1802E8000D0A000D0A436F6C64206F72207761726D3F0D0A0043686510 +:18030000636B73756D206572726F720D0A000C5072657373205B7370EA +:180318006163655D20746F20616374697661746520636F6E736F6C65C0 +:180330002E0D0A00436F6D706C6574650D0A0021EB02CD3701CD4501FA +:18034800C8E65FFE43CA5603FE57CA5903C9C35C03C3FA03DD21000008 +:18036000C367030D0C831321B030F9C3A21F113406066321B0301A77E5 +:18037800231305C27603F9CD3508CD030E325A3132A931214904CDA171 +:1803900014CD5208CD5B0BB7C2B003210D32237CB5CAC2037E472F770D +:1803A800BE70CA9E03C3C203CD270CB7C20307EB2B3ED94677BE70C2BF +:1803C0008B032B110C32CDCB09DA8B0311CEFF225F3119220A31CD1031 +:1803D800082A0A3111EFFF1911A9317D936F7C9A67E5211204CDA11403 +:1803F000E1CD441B210304CDA114311631CD3508C34E072042797465F0 +:180408007320667265650D0A00005A38302042415349432056657220DF +:18042000342E37620D0A436F707972696768742028432920313937384C +:18043800206279204D6963726F736F66740D0A00004D656D6F7279202B +:18045000746F7000B9197D1ACF19B3306113E6168F13431C221D5E18E7 +:18046800911C971D9D1DFE1D131E3A177E1E013113162B14AD16221693 +:180480003316A01E331F431673167D16C54E44C64F52CE455854C44114 +:180498005441C94E505554C4494DD2454144CC4554C74F544FD2554E1E +:1804B000C946D24553544F5245C74F535542D2455455524ED2454DD3EA +:1804C800544F50CF5554CF4ECE554C4CD7414954C44546D04F4B45C462 +:1804E0004F4B45D3435245454ECC494E4553C34C53D749445448CD4F6C +:1804F8004E49544F52D34554D245534554D052494E54C34F4E54CC491B +:180510005354C34C454152C34C4F4144C353415645CE4557D441422887 +:18052800D44FC64ED3504328D448454ECE4F54D3544550ABADAAAFDE8B +:18054000C14E44CF52BEBDBCD3474EC94E54C14253D55352C65245C92F +:180558004E50D04F53D35152D24E44CC4F47C55850C34F53D3494ED42F +:18057000414EC1544ED045454BC445454BD04F494E54CC454ED3545261 +:1805880024D6414CC15343C3485224C8455824C2494E24CC4546542427 +:1805A000D24947485424CD49442480A50BA20A7D0FF20C840EB911B32E +:1805B8000E090DAF0C920C810D6B0B9E0CCD0CF40CA30BF216630DE41D +:1805D0000BF81697134117891EF40C6F1E621E671E9F1F04310731A5EF +:1805E8000DD10B170A4C0CF40CF40C0F08792B1B795F177C9D187CFE29 +:18060000187F4C1C5012114611114E46534E52474F4446434F564F4DDD +:18061800554C425344442F304944544D4F534C535354434E55464D4FCF +:180630004858424EC3FA03C3220CD300C9D6006F7CDE006778DE004792 +:180648003E00C9000000354ACA99391C76982295B3980ADD479853D162 +:1806600099990A1A9F9865BCCD98D6773E9852C74F80DB00C901FF1CA4 +:1806780000001400140000000000C34809C30000C30000C300000D32A6 +:18069000FEFFAA31204572726F720020696E20004F6B0D0A00004272B4 +:1806A80065616B00210400397E23FE81C04E234623E569607AB3EBCA61 +:1806C000C606EBCDCB09010D00E1C809C3B006CDE906C5E3C1CDCB09CB +:1806D8007E02C80B2BC3D506E52A8A31060009093EE53ED0956F3EFF9A +:1806F0009CDAF8066739E1D81E0CC317072A7931220C311E02011E1494 +:18070800011E00011E12011E22011E0A011E18CD350832F530CDF60DB7 +:18072000210A06573E3FCDDC09197ECDDC09CD5B0BCDDC09219406CD54 +:18073800A1142A0C3111FEFFCDCB09CA67037CA53CC43C1B3EC1AF3252 +:18075000F530CDF60D21A006CDA11421FFFF220C31CD4809DA5B07CDAE +:180768005B0B3C3DCA5B07F5CD270CD5CD5F0847D1F1D23B0BD5C5AF06 +:18078000327C31CD5B0BB7F5CDEF07DA9407F1F5CAC80CB7C5D2AB07E7 +:18079800EB2A86311A020313CDCB09C29C076069228631D1F1CAD2073E +:1807B0002A8631E3C109E5CDCF06E1228631EB74D123237323722311B0 +:1807C80011311A772313B7C2CA07CD1B0823EB626B7E23B6CA5B072355 +:1807E0002323AFBE23C2E307EB732372C3D7072A0E31444D7E23B62B6F +:1807F800C823237E23666FCDCB0960697E23666F3FC83FD0C3F207C0F3 +:180810002A0E31AF772377232286312A0E312B227E312A5F31227331C6 +:18082800AFCD6B0B2A8631228831228A31C12A0A31F9216331226131A5 +:18084000AF6F67228431327B31228E31E5C52A7E31C93E3FCDDC093ECC +:1808580020CDDC09C3FE30AF325E310E051111317EFE20CAE70847FE55 +:1808700022CA0709B7CA0E093A5E31B77EC2E708FE3F3E9ECAE7087EDD +:18088800FE30DA9208FE3CDAE708D5118B04C501E308C5067F7EFE6166 +:1808A000DAAB08FE7BD2AB08E65F774EEB23B6F2AD08047EE67FC8B9D8 +:1808B800C2AD08EBE5131AB7FADF084F78FE88C2CE08CD5B0B2B237E38 +:1808D000FE61DAD708E65FB9CABD08E1C3AB0848F1EBC9EB79C1D1230E +:1808E80012130CD63ACAF508FE49C2F808325E31D654C26808477EB74E +:18090000CA0E09B8CAE70823120C13C3FE082110311213121312C93AAF +:18091800F430B73E0032F430C22B0905CA4809CDDC093E052BCA3F0910 +:180930007ECDDC09C35109052BCDDC09C25109CDDC09CD030EC34809C0 +:180948002111310601AF32F430CD060A4FFE7FCA17093AF430B7CA6A4C +:18096000093E00CDDC09AF32F43079FE07CAAE09FE03CC030E37C8FEA7 +:180978000DCAFE0DFE15CA4209FE40CA3F09FE5FCA3709FE08CA370996 +:18099000FE12C2A909C5D5E53600CDB31F211131CDA114E1D1C1C3510B +:1809A80009FE20DA510978FE493E07D2C3097971327C312304CDDC0998 +:1809C000C35109CDDC093E08C3BD097C92C07D93C97EE3BE23E3CA5B90 +:1809D8000BC30307F53AF530B7C2D614F1C5F5FE20DA000A3AF2304728 +:1809F0003A5B3104CAFC0905B8CC030E3C325B31F1C1CD9C1FC9CD6092 +:180A08001EE67FFE0FC03AF5302F32F530AFC9CD270CC0C1CDEF07C520 +:180A2000CD6D0AE14E23462378B1CA4E07CD760ACD860BC5CD030E5ECB +:180A3800235623E5EBCD441B3E20E1CDDC097EB723CA230AF2430AD6B9 +:180A50007F4F118C041A13B7F2550A0DC2550AE67FCDDC091A13B7F2CF +:180A68005F0AC3460AE52AF83022F630E1C9E5D52AF63011FFFFED5A71 +:180A800022F630D1E1F0E52AF83022F630CD601EFE03CA990AE1C37622 +:180A98000A2AF83022F630C3FD033E64327B31CD090DC1E5CDF20C22E9 +:180AB000773121020039CDB006D1C2D20A09D52B562B5E2323E52A7784 +:180AC80031CDCB09E1C2B60AD1F9EB0E08CDE006E52A7731E3E52A0CAE +:180AE00031E3CDCB0FCDD109A6CDC80FE5CDF619E1C5D5010081515AE9 +:180AF8007EFEAB3E01C20E0BCD5B0BCDC80FE5CDF619CDAA19E1C5D502 +:180B1000F533E52A7E31E30681C533CD860B227E317EFE3ACA3B0BB7D9 +:180B2800C20307237E23B6CAAD0B235E2356EB220C31EBCD5B0B111B5F +:180B40000BD5C8D680DA090DFE25D20307074F0600EB21AB05094E231E +:180B580046C5EB237EFE3AD0FE20CA5B0BFE303F3C3DC9EB2A0E31CACB +:180B7000800BEBCD270CE5CDEF076069D1D2C80C2B228C31EBC9DFC8AA +:180B8800D7FE1B2811FE03280DFE13C0D7FE11C8FE03280718F63EFFFC +:180BA00032FD30C0F6C0227E3121F6FFC12A0C31F57DA43CCAC00B2250 +:180BB80082312A7E31228431AF32F530CDF60DF121A606C23707C34E1D +:180BD000072A84317CB51E20CA1707EB2A8231220C31EBC9CD2917C028 +:180BE80032F130C9E52AFA3006004F0922FA30E1C97EFE41D8FE5B3F1F +:180C0000C9CD5B0BCDC80FCDAA19FA220C3A9731FE90DA521A0180909D +:180C1800110000E5CD251AE151C81E08C317072B110000CD5B0BD0E59D +:180C3000F5219819CDCB09DA0307626B19291929F1D6305F160019EB9F +:180C4800E1C32B0CCA1F08CD040C2BCD5B0BE52A5F31CA6F0CE1CDD12A +:180C6000092CD5CD040C2BCD5B0BC20307E3EB7D935F7C9A57DAF806E9 +:180C7800E52A863101280009CDCB09D2F806EB220A31E1225F31E1C37C +:180C90001F08CA1B08CD1F08011B0BC3AE0C0E03CDE006C1E5E52A0C1B +:180CA80031E33E8CF533C5CD270CCDF40CE52A0C31CDCB09E123DCF2DD +:180CC00007D4EF0760692BD81E0EC31707C016FFCDAC06F9FE8C1E0479 +:180CD800C21707E1220C31237CB5C2EC0C3A7C31B7C24D07211B0BE3F8 +:180CF0003EE1013A0E0006007948477EB7C8B8C823FE22CAF80CC3FB2A +:180D08000CCDBE11CDD109B4D53A5D31F5CDDA0FF1E3227E311FCDCD2A +:180D20000FCA5C0DE52A9431E523235E23562A0E31CDCB09D24B0D2A45 +:180D38000A31CDCB09D1D2530D216F31CDCB09D2530D3ED1CD0216EB51 +:180D5000CD3B14CD0216E1CD051AE1C9E5CD021AD1E1C9CD29177E47F8 +:180D6800FE8CCA720DCDD109882B4B0D78CA430BCD280CFE2CC0C3733D +:180D80000DCDDA0F7EFE88CA8F0DCDD109A92BCDCB0FCDAA19CAF40CB2 +:180D9800CD5B0BDAAF0CC3420B2BCD5B0BCA030EC8FEA5CA360EFEA813 +:180DB000CA360EE5FE2CCA1F0EFE3BCA590EC1CDDA0FE53A5D31B7C210 +:180DC800EF0DCD4F1BCD5F1436202A9431342A94313AF2304704CAEBDC +:180DE0000D043A5B31863DB8D4030ECDA414AFC4A414E1C3A10D3A5B2D +:180DF80031B7C8C3030E36002110313E0DCDDC093E0ACDDC09AF325B94 +:180E1000313AF1303DC8F5AFCDDC09F1C3140E3AF330473A5B31B8D417 +:180E2800030ED2590ED60ED22D0E2FC34E0EF5CD2617CDD109292BF13E +:180E4000D6A8E5CA490E3A5B312F83D2590E3C473E20CDDC0905C252B9 +:180E58000EE1CD5B0BC3A80D3F5265646F2066726F6D207374617274FD +:180E70000D0A003A7D31B7C2FD06C121600ECDA114C34E08CD0C147E99 +:180E8800FE223E0032F530C29E0ECD6014CDD1093BE5CDA4143EE5CDB2 +:180EA0005208C1DAAA0B237EB72BC5CAF10C362CC3B80EE52A8C31F6D4 +:180EB800AF327D31E3C3C40ECDD1092CCDBE11E3D57EFE2CCAEC0E3A4E +:180ED0007D31B7C2590F3E3FCDDC09CD5208D1C1DAAA0B237EB72BC5BC +:180EE800CAF10CD53A5D31B7CA160FCD5B0B5747FE22CA0A0F3A7D312C +:180F0000B757CA070F163A062C2BCD6314EB21210FE3D5C3240DCD5BEA +:180F18000BCDB11AE3CD021AE12BCD5B0BCA2D0FFE2CC2730EE32BCDC5 +:180F30005B0BC2C00ED13A7D31B7EBC2810BD5B621480FC4A114E1C9E4 +:180F48003F45787472612069676E6F7265640D0A00CDF20CB7C2720F6A +:180F6000237E23B61E06CA1707235E2356EB227931EBCD5B0BFE83C2E1 +:180F7800590FC3EC0E110000C4BE11227E31CDAC06C20907F9D57E2307 +:180F9000F5D5CDE819E3E5CD5517E1CD021AE1CDF919E5CD251AE1C193 +:180FA80090CDF919CAB80FEB220C316960C3170BF92A7E317EFE2CC2FD +:180FC0001B0BCD5B0BCD800FCDDA0FF6373A5D318FB7E8C31507CDD10E +:180FD80009282B1600D50E01CDE006CD51102280312A8031C178FE786D +:180FF000D4CB0F7E1600D6B3DA1210FE03D21210FE0117AABA57DA037F +:1810080007227531CD5B0BC3F60F7AB7C239117E227531D6ACD8FE0724 +:18102000D05F3A5D313DB37BCA971507835F21F505197856BAD023CD7B +:18103800CB0FC501E90FC5434ACDDB1958514E234623C52A7531C3DD3D +:181050000FAF325D31CD5B0B1E24CA1707DAB11ACDF90BD2B810FE2679 +:181068002012CD5B0BFE48CAF51EFE42CA651F1E02CA1707FEACCA518D +:1810800010FE2ECAB11AFEADCAA710FE22CA6014FEAACA9911FEA7CA72 +:18109800C413D6B6D2C910CDD60FCDD10929C9167DCDDD0F2A8031E5DB +:1810B000CDD319CDCB0FE1C9CDBE11E5EB2294313A5D31B7CCE819E19E +:1810C800C90600074FC5CD5B0B79FE31DAF010CDD60FCDD1092CCDCC53 +:1810E0000FEB2A9431E3E5EBCD2917EBE3C3F810CD9F10E311B310D5AE +:1810F800015404094E236669E915FEADC8FE2DC814FE2BC8FEACC82B38 +:18111000C9F6AFF5CDCB0FCD0D0CF1EBC1E3EBCDEB19F5CD0D0CF1C10E +:1811280079218213C23411A34F78A2E9B34F78B2E9214B113A5D311F0B +:181140007A175F166478BAD0C33A104D1179B71FC1D1F5CDCD0F218F91 +:1811580011E5CA251AAF325D31D5CDE4157E23234E2346D1C5F5CDE8BB +:1811700015CDF919F157E17BB2C87AD601D8AFBB3CD0151D0ABE230396 +:18118800CA77113FC3B5193C8FC1A0C6FF9FC3BC19165ACDDD0FCDCB44 +:1811A0000FCD0D0C7B2F4F7A2FCD8213C1C3E90F2BCD5B0BC8CDD109F5 +:1811B8002C01B011C5F6AF325C3146CDF90BDA0307AF4F325D31CD5B27 +:1811D0000BDADA11CDF90BDAE7114FCD5B0BDADB11CDF90BD2DB11D6E7 +:1811E80024C2F6113C325D310F814FCD5B0B3A7B313DCAA312F2061248 +:181200007ED628CA7B12AF327B31E550592A8E31CDCB09119031CAEBD7 +:18121800182A8831EB2A8631CDCB09CA3912799623C22E12789623CA12 +:181230006D1223232323C32012E1E3D511BB10CDCB09D1CA7012E3E5AB +:18124800C50106002A8A31E509C1E5CDCF06E1228A3160692288312B1A +:181260003600CDCB09C25F12D173237223EBE1C9329731219F06229465 +:1812780031E1C9E52A5C31E357D5C5CD010CC1F1EBE3E5EB3C577EFEDA +:181290002CCA8112CDD10929228031E1225C311E00D511E5F52A8831C9 +:1812A8003E19EB2A8A31EBCDCB09CADB127EB923C2BD127EB8235E23FF +:1812C0005623C2A9123A5C31B7C20C07F1444DCAEB1896CA39131E10A4 +:1812D800C31707110400F1CA220C712370234FCDE00623232275317177 +:1812F000233A5C311779010B00D2FE12C10371237023F5E5CD961AEB51 +:18130800E1F13DC2F612F5424BEB19DAF806CDE906228A312B3600CDCF +:18132000CB09C21C1303572A75315EEB2909EB2B2B73237223F1DA5DB7 +:1813380013474F7E2316E15E235623E3F5CDCB09D2D612E5CD961AD1FC +:1813500019F13D444DC23E132929C109EB2A8031C92A8A31EB210000FE +:18136800393A5D31B7CA7D13CDE415CDE4142A0A31EB2A73317D934F53 +:181380007C9A41501E00215D31730690C3C1193A5B3147AFC38313CD59 +:181398001A14CD0C1401F20CC5D5CDD10928CDBE11E5EB2B562B5EE163 +:1813B000CDCB0FCDD10929CDD109B4444DE3712370C35914CD1A14D5DB +:1813C800CD9F10CDCB0FE35E2356237AB3CA0F077E23666FE52A8E31BC +:1813E000E3228E312A9231E52A9031E5219031D5CD021AE1CDC80F2B3F +:1813F800CD5B0BC20307E1229031E1229231E1228E31E1C9E52A0C319C +:18141000237CB5E1C01E16C31707CDD109A73E80327B31B647CDC31132 +:18142800C3CB0FCDCB0FCD4F1BCD5F14CDE415013F16C57E2323E5CD9A +:18144000BA14E14E2346CD5314E56FCDD715D1C9CDBA14216F31E5779B +:181458002323732372E1C92B062250E50EFF237E0CB7CA7514BACA753F +:1814700014B8C26614FE22CC5B0BE323EB79CD5314116F312A613122DD +:1814880094313E01325D31CD051ACDCB09226131E17EC01E1EC317070B +:1814A00023CD5F14CDE415CDF9191C1DC80ACDDC09FE0DCC0D0E03C3B7 +:1814B800AB14B70EF1F52A0A31EB2A73312F4F06FF0923CDCB09DAD892 +:1814D0001422733123EBF1C9F11E1ACA1707BFF501BC14C52A5F31222B +:1814E8007331210000E52A0A31E5216331EB2A6131EBCDCB0901F51406 +:18150000C249152A8631EB2A8831EBCDCB09CA1C157E2323B7CD4C15D4 +:18151800C30615C1EB2A8A31EBCDCB09CA7215CDF9197BE509B7F21B63 +:1815300015227531E14E0600090923EB2A7531EBCDCB09CA1C15013BDE +:1815480015C5F6807E23235E235623F0B7C8444D2A7331CDCB09606945 +:18156000D8E1E3CDCB09E3E56069D0C1F1F1E5D5C5C9D1E17DB4C82B14 +:18157800462B4EE52B2B6E26000950592B444D2A7331CDD206E1712377 +:181590007069602BC3E714C5E52A9431E3CD5110E3CDCC0F7EE52A94CB +:1815A80031E5861E1CDA1707CD5014D1CDE815E3CDE715E52A7131EB49 +:1815C000CDCE15CDCE1521E60FE3E5C38114E1E37E23234E23466F2CA3 +:1815D8002DC80A120313C3D815CDCC0F2A9431EBCD0216EBC0D5505994 +:1815F0001B4E2A7331CDCB09C200164709227331E1C92A61312B462B1B +:181608004E2B2BCDCB09C0226131C9019213C5CDE115AF57325D317ED6 +:18162000B7C9019213C5CD1716CA220C23235E23561AC93E01CD501465 +:18163800CD2C172A713173C1C38114CDDC16AFE34FE57EB8DA511678BE +:18165000110E00C5CDBA14C1E1E5232346236668060009444DCD53142B +:181668006FCDD715D1CDE815C38114CDDC16D1D51A90C34716EB7ECDEA +:18168000E1160405CA220CC51EFFFE29CA9616CDD1092CCD2917CDD15D +:181698000929F1E3014916C53DBE0600D04F7E91BB47D843C9CD171600 +:1816B000CACA175F23237E23666FE5194672E3C57EFE24C2CB16CDF5F9 +:1816C8001E180DFE25C2D516CD651F1803CDB11AC1E170C9EBCDD10986 +:1816E00029C1D1C543C9CD2C1732EF30CDEE30C39213CD1617C3B6300F +:1816F800CD1617F51E002BCD5B0BCA0C17CDD1092CCD2917C1CDEE30F6 +:18171000ABA0CA0D17C9CD291732EF3032B730CDD1092CC32917CD5B4A +:181728000BCDC80FCD070C7AB7C2220C2BCD5B0B7BC9CD0D0C1AC39202 +:1817400013CDC80FCD0D0CD5CDD1092CCD2917D112C921281CCDF9194F +:18175800C36417CDF91921C1D1CDD31978B7C83A9731B7CAEB1990D210 +:181770007E172F3CEBCDDB19EBCDEB19C1D1FE19D0F5CD101A67F1CD6F +:181788002918B4219431F2A417CD0918D2EA172334CA12072E01CD3F8B +:1817A00018C3EA17AF90477E9B5F237E9A57237E994FDC15186863AFB9 +:1817B8004779B7C2D7174A54656F78D608FEE0C2B817AF329731C90544 +:1817D000297A1757798F4FF2CF17785C45B7CAEA172197318677D2CAA4 +:1817E80017C878219731B7FCFC1746237EE680A94FC3EB191CC014C027 +:181800000CC00E8034C0C312077E835F237E8A57237E894FC921983198 +:181818007E2F77AF6F90477D9B5F7D9A577D994FC90600D608DA38187E +:18183000435A510E00C32B18C6096FAF2DC8791F4F7A1F577B1F5F7874 +:181848001F47C33B180000008103AA561980F122768045AA3882CDAAC6 +:1818600019B7EA220C2197317E01358011F30490F570D5C5CD6417C1CB +:18187800D104CD0019214D18CD5B17215118CDF21C018080110000CD94 +:181890006417F1CD251B01318011187221C1D1CDAA19C82E00CD6819F3 +:1818A8007932A631EB22A731010000505821B517E521C118E5E52194CD +:1818C000317E23B7CAED18E52E081F6779D2DB18E52AA73119EBE13AD3 +:1818D800A631891F4F7A1F577B1F5F781F472D7CC2CA18E1C9435A517E +:1818F0004FC9CDDB19012084110000CDEB19C1D1CDAA19CA06072EFF5A +:18190800CD681934342B7E32C2302B7E32BE302B7E32BA3041EBAF4F8C +:18192000575F32C530E5C57DCDB930DE003FD2381932C530F1F137D2A3 +:18193800C1E1793C3D1FFAEB17177B175F7A175779174F297817473AE0 +:18195000C5301732C53079B2B3C22519E521973135E1C22519C31207AE +:1819680078B7CA8C197D219731AE80471FA878F28B19C68077CAEB188F +:18198000CD101A772BC9CDAA192FE1B7E1F2CA17C31207CDF61978B7FB +:18199800C8C602DA120747CD641721973134C0C312073A9731B7C83AB1 +:1819B0009631FE2F179FC03CC9CDAA1906881100002197314F700600D3 +:1819C80023368017C3B217CDAA19F02196317EEE8077C9EB2A9431E33A +:1819E000E52A9631E3E5EBC9CDF919EB2294316069229631EBC92194D1 +:1819F800315E2356234E234623C911943106041A77132305C2071AC9B1 +:181A10002196317E07371F773F1F2323777907371F4F1FAEC978B7CAB5 +:181A2800AA1921B319E5CDAA1979C8219631AE79F8CD3F1A1FA9C9235F +:181A400078BEC02B79BEC02B7ABEC02B7B96C0E1E1C9474F575FB7C801 +:181A5800E5CDF619CD101AAE67FC761A3E9890CD29187C17DCFC170621 +:181A700000DC1518E1C91B7AA33CC00BC92197317EFE983A9431D07E59 +:181A8800CD521A36987BF57917CDB217F1C921000078B1C83E1029DA8C +:181AA000D612EB29EBD2AC1A09DAD6123DC29E1AC9FE2DF5CABD1AFEA5 +:181AB8002BCABD1A2BCDCA1747575F2F4FCD5B0BDA0E1BFE2ECAE91AC7 +:181AD000FE45C2ED1ACD5B0BCD0111CD5B0BDA301B14C2ED1AAF935F0A +:181AE8000C0CCAC51AE57B90F4061BF2FC1AF5CDF218F13CC2F01AD182 +:181B0000F1CCD319EBC9C8F5CD9319F13DC9D557788947C5E5D5CD93F0 +:181B180019F1D630CD251BE1C1D1C3C51ACDDB19CDBC19C1D1C3641750 +:181B30007B0707830786D6305FC3DB1AE5219B06CDA114E1EBAF0698A5 +:181B4800CDC11921A014E5219931E5CDAA193620F25D1B362D23363018 +:181B6000CA131CE5FCD319AFF5CD191C01439111F84FCD251AB7E28AA5 +:181B78001BF1CD071BF5C36C1BCDF218F13CF5CD191CCD52173CCD528F +:181B90001ACDEB19010603F1813CFAA61BFE08D2A61B3C473E023D3D09 +:181BA800E1F5112C1C05C2B71B362E2336302305362ECC001AC5E5D57F +:181BC000CDF619E1062F047B965F237A9E5723799E4F2B2BD2C61BCDB6 +:181BD800091823CDEB19EBE17023C10DC2B71B05CAF71B2B7EFE30CA9D +:181BF000EB1BFE2EC4001AF1CA161C364523362BF2071C362D2F3C06F8 +:181C08002F04D60AD2091CC63A237023772371E1C901749411F723CD4E +:181C2000251AB7E1E2811BE900000080A08601102700E8030064000041 +:181C38000A000001000021D319E3E9CDDB1921281CCDE819C1D1CDAAB3 +:181C50001978CA911CF25C1CB7CA0607B7CACB17D5C579F67FCDF619B5 +:181C6800F2791CD5C5CD7D1AC1D1F5CD251AE17C1FE1229631E122946F +:181C800031DC3E1CCCD319D5C5CD5E18C1D1CD9F18CDDB1901388111AE +:181C98003BAACD9F183A9731FE88D28619CD7D1AC680C602DA8619F5F2 +:181CB000214D18CD5517CD9618F1C1D1F5CD6117CDD31921D11CCD0190 +:181CC8001D110000C14AC39F1808402E9474704F2E776E02887AE6A077 +:181CE0002A7C50AAAA7EFFFF7F7F0000808100000081CDDB19119D181F +:181CF800D5E5CDF619CD9F18E1CDDB197E23CDE81906F1C1D13DC8D546 +:181D1000C5F5E5CD9F18E1CDF919E5CD6417E1C30A1DCDAA1921C93036 +:181D2800FA831D21EA30CDE81921C930C886E6070600772387874F09A5 +:181D4000CDF919CD9F183AC8303CE6030600FE018832C83021871D87CE +:181D5800874F09CD5517CDF6197B59EE4F4F36802B46368021C73034F6 +:181D70007ED6ABC27A1D770C151CCDB51721EA30C3021A772B772B77E1 +:181D8800C35E1D68B1466899E9926910D1756821E11DCD5517CDDB19EA +:181DA00001498311DB0FCDEB19C1D1CD0019CDDB19CD7D1AC1D1CD6135 +:181DB8001721E51DCD5B17CDAA1937F2CD1DCD5217CDAA19B7F5F4D3BE +:181DD0001921E51DCD5517F1D4D31921E91DC3F21CDB0F498100000029 +:181DE8007F05BAD71E866426998758342387E05DA586DA0F4983CDDB85 +:181E000019CD9D1DC1E1CDDB19EBCDEB19CD971DC3FE18CDAA19FC3EE7 +:181E18001CFCD3193A9731FE81DA301E0100815159CD0019215B17E57B +:181E3000213A1ECDF21C21E11DC9094AD73B78026E847BFEC12F7C7434 +:181E4800319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F00000081C95A +:181E6000D7C93E0CC39C1FCD29177B32F230C9CDC80FCD0D0CED53F69D +:181E780030ED53F830C9CD0D0CD5E146237EC38313CDC80FCD0D0CD5B6 +:181E9000CDD1092CCDC80FCD0D0CE3732372E1C9CDCB0FCD0D0CC521D5 +:181EA80099317AFE00280CCDD81E78FE302802702371237BCDD81E7A3A +:181EC000FE00200578FE30280270237123AF772377C1219931C331147C +:181ED80047E60FFE0A3802C607C6304F780F0F0F0FE60FFE0A3802C6B1 +:181EF00007C63047C9EB210000CD0E1FDA2E1F1805CD0E1F381F2929E0 +:181F08002929B56F18F3131AFE20CA0E1FD630D8FE0A3805D607FE0AF6 +:181F2000D8FE103FC9EB7A4BE5CD8213E1C91E26C31707CDCB0FCD0D74 +:181F38000CC521993106110578FE012808CB13CB1230F41804CB13CB6E +:181F5000123E30CE0077230520F3AF772377C1219931C33114EB2100F9 +:181F680000CD821FDA901FD63029B56FCD821F30F6EB7A4BE5CD82138C +:181F8000E1C9131AFE20CA821FFE30D8FE323FC91E28C31707DD21FF87 +:181F9800FFC36703C30800C300003E0032FD30C36E03ED45F5A0C1B866 +:091FB0003E00C9CDDC09C3030E9B +:00000001FF diff --git a/Z80 CPM and bootloader (basmon)/source/BASMON.LST b/Z80 CPM and bootloader (basmon)/source/BASMON.LST index bee9f7c..75b4060 100644 --- a/Z80 CPM and bootloader (basmon)/source/BASMON.LST +++ b/Z80 CPM and bootloader (basmon)/source/BASMON.LST @@ -1,5127 +1,5015 @@ -0001 0000 ;================================================================================== -0002 0000 ; The updates to the original BASIC within this file are copyright Grant Searle -0003 0000 ; -0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY -0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. -0006 0000 ; -0007 0000 ; http://searle.hostei.com/grant/index.html -0008 0000 ; -0009 0000 ; eMail: home.micros01@btinternet.com -0010 0000 ; -0011 0000 ; If the above don't work, please perform an Internet search to see if I have -0012 0000 ; updated the web page hosting service. -0013 0000 ; -0014 0000 ;================================================================================== -0015 0000 -0016 0000 -0017 0000 ;================================================================================== -0018 0000 ; Contents of this file are copyright Grant Searle -0019 0000 ; HEX routines from Joel Owens. -0020 0000 ; -0021 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY -0022 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. -0023 0000 ; -0024 0000 ; http://searle.hostei.com/grant/index.html -0025 0000 ; -0026 0000 ; eMail: home.micros01@btinternet.com -0027 0000 ; -0028 0000 ; If the above don't work, please perform an Internet search to see if I have -0029 0000 ; updated the web page hosting service. -0030 0000 ; -0031 0000 ;================================================================================== -0032 0000 -0033 0000 ;------------------------------------------------------------------------------ -0034 0000 ; -0035 0000 ; Z80 Monitor Rom -0036 0000 ; -0037 0000 ;------------------------------------------------------------------------------ -0038 0000 ; General Equates -0039 0000 ;------------------------------------------------------------------------------ -0040 0000 -0041 0000 ;CR .EQU 0DH -0042 0000 ;LF .EQU 0AH -0043 0000 ;ESC .EQU 1BH -0044 0000 ;CTRLC .EQU 03H -0045 0000 M_CLS .EQU 0CH -0046 0000 -0047 0000 -0048 0000 loadAddr .EQU 0D000h ; CP/M load address -0049 0000 numSecs .EQU 24 ; Number of 512 sectors to be loaded -0050 0000 -0051 0000 -0052 0000 RTS_HIGH .EQU 0D5H -0053 0000 RTS_LOW .EQU 095H -0054 0000 -0055 0000 ACIA0_D .EQU $81 -0056 0000 ACIA0_C .EQU $80 -0057 0000 ACIA1_D .EQU $83 -0058 0000 ACIA1_C .EQU $82 -0059 0000 -0060 0000 SD_DATA .EQU 088H -0061 0000 SD_CONTROL .EQU 089H -0062 0000 SD_STATUS .EQU 089H -0063 0000 SD_LBA0 .EQU 08AH -0064 0000 SD_LBA1 .EQU 08BH -0065 0000 SD_LBA2 .EQU 08CH -0066 0000 -0067 3000 .ORG $3000 -0068 3000 -0069 3000 primaryIO .ds 1 -0070 3001 secNo .ds 1 -0071 3002 dmaAddr .ds 2 -0072 3004 InitTxtB .ds 2 -0073 3006 -0074 3006 00 lba0 .DB 00h -0075 3007 00 lba1 .DB 00h -0076 3008 00 lba2 .DB 00h -0077 3009 00 lba3 .DB 00h -0078 300A -0079 300A stackSpace .ds 32 -0080 302A M_STACK .EQU $ ; Stack top -0081 302A -0082 302A -0083 302A ;------------------------------------------------------------------------------ -0084 302A ; START OF MONITOR ROM -0085 302A ;------------------------------------------------------------------------------ -0086 302A -0087 0000 MON .ORG $0000 ; MONITOR ROM RESET VECTOR -0088 0000 ;------------------------------------------------------------------------------ -0089 0000 ; Reset -0090 0000 ;------------------------------------------------------------------------------ -0091 0000 F3 RST00 DI ;Disable INTerrupts -0092 0001 C3 A4 00 JP M_INIT ;Initialize Hardware and go -0093 0004 00 NOP -0094 0005 00 NOP -0095 0006 00 NOP -0096 0007 00 NOP -0097 0008 ;------------------------------------------------------------------------------ -0098 0008 ; TX a character over RS232 wait for TXDONE first. -0099 0008 ;------------------------------------------------------------------------------ -0100 0008 C3 32 00 RST08 JP conout -0101 000B 00 NOP -0102 000C 00 NOP -0103 000D 00 NOP -0104 000E 00 NOP -0105 000F 00 NOP -0106 0010 ;------------------------------------------------------------------------------ -0107 0010 ; RX a character from buffer wait until char ready. -0108 0010 ;------------------------------------------------------------------------------ -0109 0010 C3 1B 00 RST10 JP conin -0110 0013 00 NOP -0111 0014 00 NOP -0112 0015 00 NOP -0113 0016 00 NOP -0114 0017 00 NOP -0115 0018 ;------------------------------------------------------------------------------ -0116 0018 ; Check input buffer status -0117 0018 ;------------------------------------------------------------------------------ -0118 0018 C3 6C 00 RST18 JP CKINCHAR -0119 001B -0120 001B -0121 001B ;------------------------------------------------------------------------------ -0122 001B ; Console input routine -0123 001B ; Use the "primaryIO" flag to determine which input port to monitor. -0124 001B ;------------------------------------------------------------------------------ -0125 001B conin: -0126 001B 3A 00 30 LD A,(primaryIO) -0127 001E FE 00 CP 0 -0128 0020 20 08 JR NZ,coninB -0129 0022 coninA: -0130 0022 -0131 0022 waitForCharA: -0132 0022 CD 73 00 call ckincharA -0133 0025 28 FB JR Z, waitForCharA -0134 0027 DB 81 IN A,(ACIA0_D) -0135 0029 C9 RET ; Char ready in A -0136 002A -0137 002A coninB: -0138 002A -0139 002A waitForCharB: -0140 002A CD 7A 00 call ckincharB -0141 002D 28 FB JR Z, waitForCharB -0142 002F DB 83 IN A,(ACIA1_D) -0143 0031 C9 RET ; Char ready in A -0144 0032 -0145 0032 ;------------------------------------------------------------------------------ -0146 0032 ; Console output routine -0147 0032 ; Use the "primaryIO" flag to determine which output port to send a character. -0148 0032 ;------------------------------------------------------------------------------ -0149 0032 F5 conout: PUSH AF ; Store character -0150 0033 3A 00 30 LD A,(primaryIO) -0151 0036 FE 00 CP 0 -0152 0038 20 0D JR NZ,conoutB1 -0153 003A 18 01 JR conoutA1 -0154 003C conoutA: -0155 003C F5 PUSH AF -0156 003D -0157 003D CD 60 00 conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting -0158 0040 28 FB JR Z,conoutA1 ; Loop until ACIA flag signals ready -0159 0042 F1 POP AF ; RETrieve character -0160 0043 D3 81 OUT (ACIA0_D),A ; OUTput the character -0161 0045 C9 RET -0162 0046 -0163 0046 conoutB: -0164 0046 F5 PUSH AF -0165 0047 -0166 0047 CD 66 00 conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting -0167 004A 28 FB JR Z,conoutB1 ; Loop until ACIA flag signals ready -0168 004C F1 POP AF ; RETrieve character -0169 004D D3 83 OUT (ACIA1_D),A ; OUTput the character -0170 004F C9 RET -0171 0050 -0172 0050 ;------------------------------------------------------------------------------ -0173 0050 ; Non blocking console output routine -0174 0050 ; On return Z flag is 0, if the character could be written, else 1 -0175 0050 ; Use the "primaryIO" flag to determine which output port to send a character. -0176 0050 ;------------------------------------------------------------------------------ -0177 0050 nbconoutB: -0178 0050 F5 PUSH AF -0179 0051 -0180 0051 CD 66 00 nbconoutB1: CALL CKACIA1 ; See if ACIA channel B has finished transmitting -0181 0054 20 04 JR NZ, nbconoutB2 ; Ready to write -0182 0056 F1 POP AF ; Remove the parameter we don't need -0183 0057 E6 00 AND $00 ; Indicate failure -0184 0059 C9 RET ; Return if ACIA flag signals not ready -0185 005A nbconoutB2: -0186 005A F1 POP AF ; RETrieve character -0187 005B D3 83 OUT (ACIA1_D),A ; OUTput the character -0188 005D F6 FF OR $ff ; Indicate success -0189 005F C9 RET -0190 0060 -0191 0060 ;------------------------------------------------------------------------------ -0192 0060 ; I/O status check routine -0193 0060 ; Use the "primaryIO" flag to determine which port to check. -0194 0060 ;------------------------------------------------------------------------------ -0195 0060 CKACIA0 -0196 0060 DB 80 IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready -0197 0062 0F RRCA ; Rotates RX status into Carry Flag, -0198 0063 CB 47 BIT 0,A ; Set Zero flag if still transmitting character -0199 0065 C9 RET -0200 0066 -0201 0066 CKACIA1 -0202 0066 DB 82 IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready -0203 0068 0F RRCA ; Rotates RX status into Carry Flag, -0204 0069 CB 47 BIT 0,A ; Set Zero flag if still transmitting character -0205 006B C9 RET -0206 006C -0207 006C ;------------------------------------------------------------------------------ -0208 006C ; Check if there is a character in the input buffer -0209 006C ; Use the "primaryIO" flag to determine which port to check. -0210 006C ;------------------------------------------------------------------------------ -0211 006C CKINCHAR -0212 006C 3A 00 30 LD A,(primaryIO) -0213 006F FE 00 CP 0 -0214 0071 20 07 JR NZ,ckincharB -0215 0073 -0216 0073 ckincharA: -0217 0073 -0218 0073 DB 80 IN A,(ACIA0_C) ; Status byte -0219 0075 E6 01 AND $01 -0220 0077 FE 00 CP $0 ; Z flag set if no char -0221 0079 C9 RET -0222 007A -0223 007A ckincharB: -0224 007A -0225 007A DB 82 IN A,(ACIA1_C) ; Status byte -0226 007C E6 01 AND $01 -0227 007E FE 00 CP $0 ; Z flag set if no char -0228 0080 C9 RET -0229 0081 -0230 0081 ;------------------------------------------------------------------------------ -0231 0081 ; Filtered Character I/O -0232 0081 ;------------------------------------------------------------------------------ -0233 0081 -0234 0081 D7 RDCHR RST 10H -0235 0082 FE 0A CP LF -0236 0084 28 FB JR Z,RDCHR ; Ignore LF -0237 0086 FE 1B CP ESC -0238 0088 20 02 JR NZ,RDCHR1 -0239 008A 3E 03 LD A,CTRLC ; Change ESC to CTRL-C -0240 008C C9 RDCHR1 RET -0241 008D -0242 008D FE 0D WRCHR CP CR -0243 008F 28 0A JR Z,WRCRLF ; When CR, write CRLF -0244 0091 FE 0C CP M_CLS -0245 0093 28 04 JR Z,WR ; Allow write of "CLS" -0246 0095 FE 20 CP ' ' ; Don't write out any other control codes -0247 0097 38 01 JR C,NOWR ; ie. < space -0248 0099 CF WR RST 08H -0249 009A C9 NOWR RET -0250 009B -0251 009B 3E 0D WRCRLF LD A,CR -0252 009D CF RST 08H -0253 009E 3E 0A LD A,LF -0254 00A0 CF RST 08H -0255 00A1 3E 0D LD A,CR -0256 00A3 C9 RET -0257 00A4 -0258 00A4 -0259 00A4 ;------------------------------------------------------------------------------ -0260 00A4 ; Initialise hardware and start main loop -0261 00A4 ;------------------------------------------------------------------------------ -0262 00A4 31 2A 30 M_INIT LD SP,M_STACK ; Set the Stack Pointer -0263 00A7 -0264 00A7 3E 95 LD A,RTS_LOW -0265 00A9 D3 80 OUT (ACIA0_C),A ; Initialise ACIA0 -0266 00AB D3 82 OUT (ACIA1_C),A ; Initialise ACIA1 -0267 00AD ; Display the "Press space to start" message on both consoles -0268 00AD 3E 00 LD A,$00 -0269 00AF 32 00 30 LD (primaryIO),A -0270 00B2 21 81 03 LD HL,INITTXT -0271 00B5 CD 37 01 CALL M_PRINT -0272 00B8 ; On Display B we need to take care that it does not hang. -0273 00B8 21 81 03 LD HL,INITTXT -0274 00BB 22 04 30 LD (InitTxtB),HL -0275 00BE -0276 00BE 2A 04 30 printInitB: LD HL,(InitTxtB) -0277 00C1 7E LD A,(HL) ; Get character -0278 00C2 B7 OR A ; Is it $00 ? -0279 00C3 28 0C JR Z, waitForSpace -0280 00C5 CD 50 00 CALL nbconoutB ; Print it -0281 00C8 28 07 JR Z, waitForSpace ; If we can't write, don't increment -0282 00CA 23 INC HL -0283 00CB 22 04 30 LD (InitTxtB),HL ; Store pointer into message for next round -0284 00CE C3 BE 00 JP printInitB -0285 00D1 ; Wait until space is in one of the buffers to determine the active console -0286 00D1 -0287 00D1 waitForSpace: -0288 00D1 -0289 00D1 CD 73 00 CALL ckincharA -0290 00D4 28 0F JR Z,chkSpaceB -0291 00D6 3E 00 LD A,$00 -0292 00D8 32 00 30 LD (primaryIO),A -0293 00DB CD 1B 00 CALL conin -0294 00DE FE 20 CP ' ' -0295 00E0 C2 D1 00 JP NZ, waitForSpace -0296 00E3 18 12 JR spacePressed -0297 00E5 -0298 00E5 chkSpaceB: -0299 00E5 CD 7A 00 CALL ckincharB -0300 00E8 28 D4 JR Z,printInitB ; If no key pressed, try to continue writing the init message on B -0301 00EA 3E 01 LD A,$01 -0302 00EC 32 00 30 LD (primaryIO),A -0303 00EF CD 1B 00 CALL conin -0304 00F2 FE 20 CP ' ' -0305 00F4 C2 BE 00 JP NZ, printInitB ; If space not pressed, try to continue writing the init message on B -0306 00F7 -0307 00F7 spacePressed: -0308 00F7 -0309 00F7 ; Clear message on both consoles -0310 00F7 3E 0C LD A,$0C -0311 00F9 CD 3C 00 CALL conoutA -0312 00FC CD 50 00 CALL nbconoutB -0313 00FF -0314 00FF ;; We only clear the message on the active console, -0315 00FF ;; because trying to write on a console not connected could -0316 00FF ;; make the system freeze. -0317 00FF -0318 00FF ; primaryIO is now set to the channel where SPACE was pressed -0319 00FF -0320 00FF -0321 00FF CD 3E 01 CALL TXCRLF ; TXCRLF -0322 0102 21 B2 02 LD HL,M_SIGNON ; Print SIGNON message -0323 0105 CD 37 01 CALL M_PRINT -0324 0108 -0325 0108 ;------------------------------------------------------------------------------ -0326 0108 ; Monitor command loop -0327 0108 ;------------------------------------------------------------------------------ -0328 0108 21 08 01 MAIN LD HL,MAIN ; Save entry point for Monitor -0329 010B E5 PUSH HL ; This is the return address -0330 010C CD 3E 01 MAIN0 CALL TXCRLF ; Entry point for Monitor, Normal -0331 010F 3E 3E LD A,'>' ; Get a ">" -0332 0111 CF RST 08H ; print it -0333 0112 -0334 0112 CD 81 00 MAIN1 CALL RDCHR ; Get a character from the input port -0335 0115 FE 20 CP ' ' ; or less? -0336 0117 38 F9 JR C,MAIN1 ; Go back -0337 0119 -0338 0119 FE 3A CP ':' ; ":"? -0339 011B CA B5 01 JP Z,LOAD ; First character of a HEX load -0340 011E -0341 011E CD 8D 00 CALL WRCHR ; Print char on console -0342 0121 -0343 0121 E6 5F AND $5F ; Make character uppercase -0344 0123 -0345 0123 FE 42 CP 'B' -0346 0125 CA F6 01 JP Z,BASIC -0347 0128 -0348 0128 FE 47 CP 'G' -0349 012A CA AF 01 JP Z,M_GOTO -0350 012D -0351 012D FE 58 CP 'X' -0352 012F CA 0D 02 JP Z,CPMLOAD -0353 0132 -0354 0132 3E 3F LD A,'?' ; Get a "?" -0355 0134 CF RST 08H ; Print it -0356 0135 18 D5 JR MAIN0 -0357 0137 -0358 0137 ;------------------------------------------------------------------------------ -0359 0137 ; Print string of characters to Serial A until byte=$00, WITH CR, LF -0360 0137 ;------------------------------------------------------------------------------ -0361 0137 7E M_PRINT LD A,(HL) ; Get character -0362 0138 B7 OR A ; Is it $00 ? -0363 0139 C8 RET Z ; Then RETurn on terminator -0364 013A CF RST 08H ; Print it -0365 013B 23 INC HL ; Next Character -0366 013C 18 F9 JR M_PRINT ; Continue until $00 -0367 013E -0368 013E -0369 013E 3E 0D TXCRLF LD A,$0D ; -0370 0140 CF RST 08H ; Print character -0371 0141 3E 0A LD A,$0A ; -0372 0143 CF RST 08H ; Print character -0373 0144 C9 RET -0374 0145 -0375 0145 ;------------------------------------------------------------------------------ -0376 0145 ; Get a character from the console, must be $20-$7F to be valid (no control characters) -0377 0145 ; and breaks with the Zero Flag set -0378 0145 ;------------------------------------------------------------------------------ -0379 0145 CD 81 00 M_GETCHR CALL RDCHR ; RX a Character -0380 0148 FE 03 CP $03 ; User break? -0381 014A C8 RET Z -0382 014B FE 20 CP $20 ; or better? -0383 014D 38 F6 JR C,M_GETCHR ; Do it again until we get something usable -0384 014F C9 RET -0385 0150 ;------------------------------------------------------------------------------ -0386 0150 ; Gets two ASCII characters from the console (assuming them to be HEX 0-9 A-F) -0387 0150 ; Moves them into B and C, converts them into a byte value in A and updates a -0388 0150 ; Checksum value in E -0389 0150 ;------------------------------------------------------------------------------ -0390 0150 CD 45 01 GET2 CALL M_GETCHR ; Get us a valid character to work with -0391 0153 47 LD B,A ; Load it in B -0392 0154 CD 45 01 CALL M_GETCHR ; Get us another character -0393 0157 4F LD C,A ; load it in C -0394 0158 CD 8F 01 CALL BCTOA ; Convert ASCII to byte -0395 015B 4F LD C,A ; Build the checksum -0396 015C 7B LD A,E -0397 015D 91 SUB C ; The checksum should always equal zero when checked -0398 015E 5F LD E,A ; Save the checksum back where it came from -0399 015F 79 LD A,C ; Retrieve the byte and go back -0400 0160 C9 RET -0401 0161 ;------------------------------------------------------------------------------ -0402 0161 ; Gets four Hex characters from the console, converts them to values in HL -0403 0161 ;------------------------------------------------------------------------------ -0404 0161 21 00 00 GETHL LD HL,$0000 ; Gets xxxx but sets Carry Flag on any Terminator -0405 0164 CD A8 01 CALL ECHO ; RX a Character -0406 0167 FE 0D CP $0D ; ? -0407 0169 20 0E JR NZ,GETX2 ; other key -0408 016B 37 SETCY SCF ; Set Carry Flag -0409 016C C9 RET ; and Return to main program -0410 016D ;------------------------------------------------------------------------------ -0411 016D ; This routine converts last four hex characters (0-9 A-F) user types into a value in HL -0412 016D ; Rotates the old out and replaces with the new until the user hits a terminating character -0413 016D ;------------------------------------------------------------------------------ -0414 016D 21 00 00 GETX LD HL,$0000 ; CLEAR HL -0415 0170 CD A8 01 GETX1 CALL ECHO ; RX a character from the console -0416 0173 FE 0D CP $0D ; -0417 0175 C8 RET Z ; quit -0418 0176 FE 2C CP $2C ; <,> can be used to safely quit for multiple entries -0419 0178 C8 RET Z ; (Like filling both DE and HL from the user) -0420 0179 FE 03 GETX2 CP $03 ; Likewise, a will terminate clean, too, but -0421 017B 28 EE JR Z,SETCY ; It also sets the Carry Flag for testing later. -0422 017D 29 ADD HL,HL ; Otherwise, rotate the previous low nibble to high -0423 017E 29 ADD HL,HL ; rather slowly -0424 017F 29 ADD HL,HL ; until we get to the top -0425 0180 29 ADD HL,HL ; and then we can continue on. -0426 0181 D6 30 SUB $30 ; Convert ASCII to byte value -0427 0183 FE 0A CP $0A ; Are we in the 0-9 range? -0428 0185 38 02 JR C,GETX3 ; Then we just need to sub $30, but if it is A-F -0429 0187 D6 07 SUB $07 ; We need to take off 7 more to get the value down to -0430 0189 E6 0F GETX3 AND $0F ; to the right hex value -0431 018B 85 ADD A,L ; Add the high nibble to the low -0432 018C 6F LD L,A ; Move the byte back to A -0433 018D 18 E1 JR GETX1 ; and go back for next character until he terminates -0434 018F ;------------------------------------------------------------------------------ -0435 018F ; Convert ASCII characters in B C registers to a byte value in A -0436 018F ;------------------------------------------------------------------------------ -0437 018F 78 BCTOA LD A,B ; Move the hi order byte to A -0438 0190 D6 30 SUB $30 ; Take it down from Ascii -0439 0192 FE 0A CP $0A ; Are we in the 0-9 range here? -0440 0194 38 02 JR C,BCTOA1 ; If so, get the next nybble -0441 0196 D6 07 SUB $07 ; But if A-F, take it down some more -0442 0198 07 BCTOA1 RLCA ; Rotate the nybble from low to high -0443 0199 07 RLCA ; One bit at a time -0444 019A 07 RLCA ; Until we -0445 019B 07 RLCA ; Get there with it -0446 019C 47 LD B,A ; Save the converted high nybble -0447 019D 79 LD A,C ; Now get the low order byte -0448 019E D6 30 SUB $30 ; Convert it down from Ascii -0449 01A0 FE 0A CP $0A ; 0-9 at this point? -0450 01A2 38 02 JR C,BCTOA2 ; Good enough then, but -0451 01A4 D6 07 SUB $07 ; Take off 7 more if it's A-F -0452 01A6 80 BCTOA2 ADD A,B ; Add in the high order nybble -0453 01A7 C9 RET -0454 01A8 -0455 01A8 ;------------------------------------------------------------------------------ -0456 01A8 ; Get a character and echo it back to the user -0457 01A8 ;------------------------------------------------------------------------------ -0458 01A8 CD 81 00 ECHO CALL RDCHR -0459 01AB CD 8D 00 CALL WRCHR -0460 01AE C9 RET -0461 01AF -0462 01AF ;------------------------------------------------------------------------------ -0463 01AF ; GOTO command -0464 01AF ;------------------------------------------------------------------------------ -0465 01AF CD 61 01 M_GOTO CALL GETHL ; ENTRY POINT FOR oto addr. Get XXXX from user. -0466 01B2 D8 RET C ; Return if invalid -0467 01B3 E5 PUSH HL -0468 01B4 C9 RET ; Jump to HL address value -0469 01B5 -0470 01B5 ;------------------------------------------------------------------------------ -0471 01B5 ; LOAD Intel Hex format file from the console. -0472 01B5 ; [Intel Hex Format is: -0473 01B5 ; 1) Colon (Frame 0) -0474 01B5 ; 2) Record Length Field (Frames 1 and 2) -0475 01B5 ; 3) Load Address Field (Frames 3,4,5,6) -0476 01B5 ; 4) Record Type Field (Frames 7 and 8) -0477 01B5 ; 5) Data Field (Frames 9 to 9+2*(Record Length)-1 -0478 01B5 ; 6) Checksum Field - Sum of all byte values from Record Length to and -0479 01B5 ; including Checksum Field = 0 ] -0480 01B5 ;------------------------------------------------------------------------------ -0481 01B5 1E 00 LOAD LD E,0 ; First two Characters is the Record Length Field -0482 01B7 CD 50 01 CALL GET2 ; Get us two characters into BC, convert it to a byte -0483 01BA 57 LD D,A ; Load Record Length count into D -0484 01BB CD 50 01 CALL GET2 ; Get next two characters, Memory Load Address -0485 01BE 67 LD H,A ; put value in H register. -0486 01BF CD 50 01 CALL GET2 ; Get next two characters, Memory Load Address -0487 01C2 6F LD L,A ; put value in L register. -0488 01C3 CD 50 01 CALL GET2 ; Get next two characters, Record Field Type -0489 01C6 FE 01 CP $01 ; Record Field Type 00 is Data, 01 is End of File -0490 01C8 20 09 JR NZ,LOAD2 ; Must be the end of that file -0491 01CA CD 50 01 CALL GET2 ; Get next two characters, assemble into byte -0492 01CD 7B LD A,E ; Recall the Checksum byte -0493 01CE A7 AND A ; Is it Zero? -0494 01CF 28 1E JR Z,LOAD00 ; Print footer reached message -0495 01D1 18 15 JR LOADERR ; Checksums don't add up, Error out -0496 01D3 -0497 01D3 7A LOAD2 LD A,D ; Retrieve line character counter -0498 01D4 A7 AND A ; Are we done with this line? -0499 01D5 28 0B JR Z,LOAD3 ; Get two more ascii characters, build a byte and checksum -0500 01D7 CD 50 01 CALL GET2 ; Get next two chars, convert to byte in A, checksum it -0501 01DA 77 LD (HL),A ; Move converted byte in A to memory location -0502 01DB 23 INC HL ; Increment pointer to next memory location -0503 01DC 3E 2E LD A,'.' ; Print out a "." for every byte loaded -0504 01DE CF RST 08H ; -0505 01DF 15 DEC D ; Decrement line character counter -0506 01E0 18 F1 JR LOAD2 ; and keep loading into memory until line is complete -0507 01E2 -0508 01E2 CD 50 01 LOAD3 CALL GET2 ; Get two chars, build byte and checksum -0509 01E5 7B LD A,E ; Check the checksum value -0510 01E6 A7 AND A ; Is it zero? -0511 01E7 C8 RET Z -0512 01E8 -0513 01E8 21 70 03 LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message -0514 01EB CD 37 01 CALL M_PRINT ; Print Message from (HL) and terminate the load -0515 01EE C9 RET -0516 01EF -0517 01EF 21 AB 03 LOAD00 LD HL,LDETXT ; Print load complete message -0518 01F2 CD 37 01 CALL M_PRINT -0519 01F5 C9 RET -0520 01F6 -0521 01F6 ;------------------------------------------------------------------------------ -0522 01F6 ; Start BASIC command -0523 01F6 ;------------------------------------------------------------------------------ -0524 01F6 BASIC -0525 01F6 21 5E 03 LD HL,M_BASTXT -0526 01F9 CD 37 01 CALL M_PRINT -0527 01FC CD 45 01 CALL M_GETCHR -0528 01FF C8 RET Z ; Cancel if CTRL-C -0529 0200 E6 5F AND $5F ; uppercase -0530 0202 FE 43 CP 'C' -0531 0204 CA B6 03 JP Z,COLD -0532 0207 FE 57 CP 'W' -0533 0209 CA B9 03 JP Z,WARM -0534 020C C9 RET -0535 020D -0536 020D ;------------------------------------------------------------------------------ -0537 020D ; CP/M load command -0538 020D ;------------------------------------------------------------------------------ -0539 020D CPMLOAD -0540 020D -0541 020D 21 1F 02 LD HL,CPMTXT -0542 0210 CD 37 01 CALL M_PRINT -0543 0213 CD 45 01 CALL M_GETCHR -0544 0216 C8 RET Z ; Cancel if CTRL-C -0545 0217 E6 5F AND $5F ; uppercase -0546 0219 FE 59 CP 'Y' -0547 021B CA 40 02 JP Z,CPMLOAD2 -0548 021E C9 RET -0549 021F CPMTXT -0550 021F 0D 0A .BYTE $0D,$0A -0551 0221 42 6F 6F 74 .TEXT "Boot CP/M?" -0551 0225 20 43 50 2F -0551 0229 4D 3F -0552 022B 00 .BYTE $00 -0553 022C -0554 022C CPMTXT2 -0555 022C 0D 0A .BYTE $0D,$0A -0556 022E 4C 6F 61 64 .TEXT "Loading CP/M..." -0556 0232 69 6E 67 20 -0556 0236 43 50 2F 4D -0556 023A 2E 2E 2E -0557 023D 0D 0A 00 .BYTE $0D,$0A,$00 -0558 0240 -0559 0240 CPMLOAD2 -0560 0240 21 2C 02 LD HL,CPMTXT2 -0561 0243 CD 37 01 CALL M_PRINT -0562 0246 -0563 0246 06 18 LD B,numSecs -0564 0248 -0565 0248 3E 00 LD A,0 -0566 024A 32 06 30 LD (lba0),A -0567 024D 32 07 30 ld (lba1),A -0568 0250 32 08 30 ld (lba2),A -0569 0253 32 09 30 ld (lba3),A -0570 0256 -0571 0256 21 00 D0 LD HL,loadAddr -0572 0259 22 02 30 LD (dmaAddr),HL -0573 025C processSectors: -0574 025C -0575 025C CD 8A 02 call readhst -0576 025F -0577 025F 11 00 02 LD DE,0200H -0578 0262 2A 02 30 LD HL,(dmaAddr) -0579 0265 19 ADD HL,DE -0580 0266 22 02 30 LD (dmaAddr),HL -0581 0269 3A 06 30 LD A,(lba0) -0582 026C 3C INC A -0583 026D 32 06 30 LD (lba0),A -0584 0270 -0585 0270 10 EA djnz processSectors -0586 0272 -0587 0272 ; Start CP/M using entry at top of BIOS -0588 0272 ; The current active console stream ID is pushed onto the stack -0589 0272 ; to allow the CBIOS to pick it up -0590 0272 ; 0 = ACIA0, 1 = ACIA1 -0591 0272 -0592 0272 3A 00 30 ld A,(primaryIO) -0593 0275 F5 PUSH AF -0594 0276 2A FE FF ld HL,($FFFE) -0595 0279 E9 jp (HL) -0596 027A -0597 027A -0598 027A ;------------------------------------------------------------------------------ -0599 027A ; ROUTINES AS USED IN BIOS -0600 027A ;------------------------------------------------------------------------------ -0601 027A -0602 027A ;================================================================================================ -0603 027A ; Convert track/head/sector into LBA for physical access to the disk -0604 027A ;================================================================================================ -0605 027A setLBAaddr: -0606 027A ; Transfer LBA to disk (LBA3 not used on SD card) -0607 027A 3A 08 30 LD A,(lba2) -0608 027D D3 8C OUT (SD_LBA2),A -0609 027F 3A 07 30 LD A,(lba1) -0610 0282 D3 8B OUT (SD_LBA1),A -0611 0284 3A 06 30 LD A,(lba0) -0612 0287 D3 8A OUT (SD_LBA0),A -0613 0289 C9 RET -0614 028A -0615 028A ;================================================================================================ -0616 028A ; Read physical sector from host -0617 028A ;================================================================================================ -0618 028A -0619 028A readhst: -0620 028A F5 PUSH AF -0621 028B C5 PUSH BC -0622 028C E5 PUSH HL -0623 028D -0624 028D DB 89 rdWait1: IN A,(SD_STATUS) -0625 028F FE 80 CP 128 -0626 0291 20 FA JR NZ,rdWait1 -0627 0293 -0628 0293 CD 7A 02 CALL setLBAaddr -0629 0296 -0630 0296 3E 00 LD A,$00 ; 00 = Read block -0631 0298 D3 89 OUT (SD_CONTROL),A -0632 029A -0633 029A 0E 04 LD c,4 -0634 029C ; LD HL,hstbuf -0635 029C rd4secs: -0636 029C 06 80 LD b,128 -0637 029E rdByte: -0638 029E -0639 029E DB 89 rdWait2: IN A,(SD_STATUS) -0640 02A0 FE E0 CP 224 ; Read byte waiting -0641 02A2 20 FA JR NZ,rdWait2 -0642 02A4 -0643 02A4 DB 88 IN A,(SD_DATA) -0644 02A6 -0645 02A6 77 LD (HL),A -0646 02A7 23 INC HL -0647 02A8 05 dec b -0648 02A9 20 F3 JR NZ, rdByte -0649 02AB 0D dec c -0650 02AC 20 EE JR NZ,rd4secs -0651 02AE -0652 02AE E1 POP HL -0653 02AF C1 POP BC -0654 02B0 F1 POP AF -0655 02B1 -0656 02B1 ; XOR a -0657 02B1 ; ld (erflag),a -0658 02B1 C9 RET -0659 02B2 -0660 02B2 ;------------------------------------------------------------------------------ -0661 02B2 ; END OF ROUTINES AS USED IN BIOS -0662 02B2 ;------------------------------------------------------------------------------ -0663 02B2 -0664 02B2 -0665 02B2 43 50 2F 4D M_SIGNON .BYTE "CP/M Boot ROM 2.0" -0665 02B6 20 42 6F 6F -0665 02BA 74 20 52 4F -0665 02BE 4D 20 32 2E -0665 02C2 30 -0666 02C3 20 62 79 20 .BYTE " by G. Searle" -0666 02C7 47 2E 20 53 -0666 02CB 65 61 72 6C -0666 02CF 65 -0667 02D0 0D 0A .BYTE $0D,$0A -0668 02D2 0D 0A .BYTE $0D,$0A -0669 02D4 42 43 20 6F .TEXT "BC or BW - ROM BASIC Cold/Warm" -0669 02D8 72 20 42 57 -0669 02DC 20 2D 20 52 -0669 02E0 4F 4D 20 42 -0669 02E4 41 53 49 43 -0669 02E8 20 43 6F 6C -0669 02EC 64 2F 57 61 -0669 02F0 72 6D -0670 02F2 0D 0A .BYTE $0D,$0A -0671 02F4 58 20 20 20 .TEXT "X - Boot CP/M (load $D000-$FFFF)" -0671 02F8 20 20 20 20 -0671 02FC 20 2D 20 42 -0671 0300 6F 6F 74 20 -0671 0304 43 50 2F 4D -0671 0308 20 28 6C 6F -0671 030C 61 64 20 24 -0671 0310 44 30 30 30 -0671 0314 2D 24 46 46 -0671 0318 46 46 29 -0672 031B 0D 0A .BYTE $0D,$0A -0673 031D 3A 6E 6E 6E .TEXT ":nnnn... - Load Intel-Hex file record" -0673 0321 6E 2E 2E 2E -0673 0325 20 2D 20 4C -0673 0329 6F 61 64 20 -0673 032D 49 6E 74 65 -0673 0331 6C 2D 48 65 -0673 0335 78 20 66 69 -0673 0339 6C 65 20 72 -0673 033D 65 63 6F 72 -0673 0341 64 -0674 0342 0D 0A .BYTE $0D,$0A -0675 0344 47 6E 6E 6E .TEXT "Gnnnn - Run loc nnnn" -0675 0348 6E 20 20 20 -0675 034C 20 2D 20 52 -0675 0350 75 6E 20 6C -0675 0354 6F 63 20 6E -0675 0358 6E 6E 6E -0676 035B 0D 0A .BYTE $0D,$0A -0677 035D 00 .BYTE $00 -0678 035E -0679 035E M_BASTXT -0680 035E 0D 0A .BYTE $0D,$0A -0681 0360 43 6F 6C 64 .TEXT "Cold or warm?" -0681 0364 20 6F 72 20 -0681 0368 77 61 72 6D -0681 036C 3F -0682 036D 0D 0A 00 .BYTE $0D,$0A,$00 -0683 0370 -0684 0370 43 68 65 63 CKSUMERR .BYTE "Checksum error" -0684 0374 6B 73 75 6D -0684 0378 20 65 72 72 -0684 037C 6F 72 -0685 037E 0D 0A 00 .BYTE $0D,$0A,$00 -0686 0381 -0687 0381 INITTXT -0688 0381 0C .BYTE $0C -0689 0382 50 72 65 73 .TEXT "Press [space] to activate the console." -0689 0386 73 20 5B 73 -0689 038A 70 61 63 65 -0689 038E 5D 20 74 6F -0689 0392 20 61 63 74 -0689 0396 69 76 61 74 -0689 039A 65 20 74 68 -0689 039E 65 20 63 6F -0689 03A2 6E 73 6F 6C -0689 03A6 65 2E -0690 03A8 0D 0A 00 .BYTE $0D,$0A, $00 -0691 03AB -0692 03AB LDETXT -0693 03AB 43 6F 6D 70 .TEXT "Complete" -0693 03AF 6C 65 74 65 -0694 03B3 0D 0A 00 .BYTE $0D,$0A, $00 -0695 03B6 -0696 03B6 ;=========================================================================================================================== -0697 03B6 -0698 03B6 ; NASCOM ROM BASIC Ver 4.7, (C) 1978 Microsoft -0699 03B6 ; Scanned from source published in 80-BUS NEWS from Vol 2, Issue 3 -0700 03B6 ; (May-June 1983) to Vol 3, Issue 3 (May-June 1984) -0701 03B6 ; Adapted for the freeware Zilog Macro Assembler 2.10 to produce -0702 03B6 ; the original ROM code (checksum A934H). PA -0703 03B6 -0704 03B6 ; GENERAL EQUATES -0705 03B6 -0706 03B6 CTRLC .EQU 03H ; Control "C" -0707 03B6 CTRLG .EQU 07H ; Control "G" -0708 03B6 BKSP .EQU 08H ; Back space -0709 03B6 LF .EQU 0AH ; Line feed -0710 03B6 CS .EQU 0CH ; Clear screen -0711 03B6 CR .EQU 0DH ; Carriage return -0712 03B6 CTRLO .EQU 0FH ; Control "O" -0713 03B6 CTRLQ .EQU 11H ; Control "Q" -0714 03B6 CTRLR .EQU 12H ; Control "R" -0715 03B6 CTRLS .EQU 13H ; Control "S" -0716 03B6 CTRLU .EQU 15H ; Control "U" -0717 03B6 ESC .EQU 1BH ; Escape -0718 03B6 DEL .EQU 7FH ; Delete -0719 03B6 -0720 03B6 ; BASIC WORK SPACE LOCATIONS -0721 03B6 -0722 03B6 WRKSPC .EQU 30B0H ; BASIC Work space -0723 03B6 USR .EQU WRKSPC+3H ; "USR (x)" jump -0724 03B6 OUTSUB .EQU WRKSPC+6H ; "OUT p,n" -0725 03B6 OTPORT .EQU WRKSPC+7H ; Port (p) -0726 03B6 DIVSUP .EQU WRKSPC+9H ; Division support routine -0727 03B6 DIV1 .EQU WRKSPC+0AH ; <- Values -0728 03B6 DIV2 .EQU WRKSPC+0EH ; <- to -0729 03B6 DIV3 .EQU WRKSPC+12H ; <- be -0730 03B6 DIV4 .EQU WRKSPC+15H ; <-inserted -0731 03B6 SEED .EQU WRKSPC+17H ; Random number seed -0732 03B6 LSTRND .EQU WRKSPC+3AH ; Last random number -0733 03B6 INPSUB .EQU WRKSPC+3EH ; #INP (x)" Routine -0734 03B6 INPORT .EQU WRKSPC+3FH ; PORT (x) -0735 03B6 NULLS .EQU WRKSPC+41H ; Number of nulls -0736 03B6 LWIDTH .EQU WRKSPC+42H ; Terminal width -0737 03B6 COMMAN .EQU WRKSPC+43H ; Width for commas -0738 03B6 NULFLG .EQU WRKSPC+44H ; Null after input byte flag -0739 03B6 CTLOFG .EQU WRKSPC+45H ; Control "O" flag -0740 03B6 LINESC .EQU WRKSPC+46H ; Lines counter -0741 03B6 LINESN .EQU WRKSPC+48H ; Lines number -0742 03B6 CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum -0743 03B6 NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine -0744 03B6 BRKFLG .EQU WRKSPC+4DH ; Break flag -0745 03B6 RINPUT .EQU WRKSPC+4EH ; Input reflection -0746 03B6 POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) -0747 03B6 PSET .EQU WRKSPC+54H ; "SET" reflection -0748 03B6 RESET .EQU WRKSPC+57H ; "RESET" reflection -0749 03B6 STRSPC .EQU WRKSPC+5AH ; Bottom of string space -0750 03B6 LINEAT .EQU WRKSPC+5CH ; Current line number -0751 03B6 BASTXT .EQU WRKSPC+5EH ; Pointer to start of program -0752 03B6 BUFFER .EQU WRKSPC+61H ; Input buffer -0753 03B6 STACK .EQU WRKSPC+66H ; Initial stack -0754 03B6 CURPOS .EQU WRKSPC+0ABH ; Character position on line -0755 03B6 LCRFLG .EQU WRKSPC+0ACH ; Locate/Create flag -0756 03B6 TYPE .EQU WRKSPC+0ADH ; Data type flag -0757 03B6 DATFLG .EQU WRKSPC+0AEH ; Literal statement flag -0758 03B6 LSTRAM .EQU WRKSPC+0AFH ; Last available RAM -0759 03B6 TMSTPT .EQU WRKSPC+0B1H ; Temporary string pointer -0760 03B6 TMSTPL .EQU WRKSPC+0B3H ; Temporary string pool -0761 03B6 TMPSTR .EQU WRKSPC+0BFH ; Temporary string -0762 03B6 STRBOT .EQU WRKSPC+0C3H ; Bottom of string space -0763 03B6 CUROPR .EQU WRKSPC+0C5H ; Current operator in EVAL -0764 03B6 LOOPST .EQU WRKSPC+0C7H ; First statement of loop -0765 03B6 DATLIN .EQU WRKSPC+0C9H ; Line of current DATA item -0766 03B6 FORFLG .EQU WRKSPC+0CBH ; "FOR" loop flag -0767 03B6 LSTBIN .EQU WRKSPC+0CCH ; Last byte entered -0768 03B6 READFG .EQU WRKSPC+0CDH ; Read/Input flag -0769 03B6 BRKLIN .EQU WRKSPC+0CEH ; Line of break -0770 03B6 NXTOPR .EQU WRKSPC+0D0H ; Next operator in EVAL -0771 03B6 ERRLIN .EQU WRKSPC+0D2H ; Line of error -0772 03B6 CONTAD .EQU WRKSPC+0D4H ; Where to CONTinue -0773 03B6 PROGND .EQU WRKSPC+0D6H ; End of program -0774 03B6 VAREND .EQU WRKSPC+0D8H ; End of variables -0775 03B6 ARREND .EQU WRKSPC+0DAH ; End of arrays -0776 03B6 NXTDAT .EQU WRKSPC+0DCH ; Next data item -0777 03B6 FNRGNM .EQU WRKSPC+0DEH ; Name of FN argument -0778 03B6 FNARG .EQU WRKSPC+0E0H ; FN argument value -0779 03B6 FPREG .EQU WRKSPC+0E4H ; Floating point register -0780 03B6 FPEXP .EQU FPREG+3 ; Floating point exponent -0781 03B6 SGNRES .EQU WRKSPC+0E8H ; Sign of result -0782 03B6 PBUFF .EQU WRKSPC+0E9H ; Number print buffer -0783 03B6 MULVAL .EQU WRKSPC+0F6H ; Multiplier -0784 03B6 PROGST .EQU WRKSPC+0F9H ; Start of program text area -0785 03B6 STLOOK .EQU WRKSPC+15DH ; Start of memory test -0786 03B6 -0787 03B6 ; BASIC ERROR CODE VALUES -0788 03B6 -0789 03B6 NF .EQU 00H ; NEXT without FOR -0790 03B6 SN .EQU 02H ; Syntax error -0791 03B6 RG .EQU 04H ; RETURN without GOSUB -0792 03B6 OD .EQU 06H ; Out of DATA -0793 03B6 FC .EQU 08H ; Function call error -0794 03B6 OV .EQU 0AH ; Overflow -0795 03B6 OM .EQU 0CH ; Out of memory -0796 03B6 UL .EQU 0EH ; Undefined line number -0797 03B6 BS .EQU 10H ; Bad subscript -0798 03B6 DD .EQU 12H ; Re-DIMensioned array -0799 03B6 DZ .EQU 14H ; Division by zero (/0) -0800 03B6 ID .EQU 16H ; Illegal direct -0801 03B6 TM .EQU 18H ; Type miss-match -0802 03B6 OS .EQU 1AH ; Out of string space -0803 03B6 LS .EQU 1CH ; String too long -0804 03B6 ST .EQU 1EH ; String formula too complex -0805 03B6 CN .EQU 20H ; Can't CONTinue -0806 03B6 UF .EQU 22H ; UnDEFined FN function -0807 03B6 MO .EQU 24H ; Missing operand -0808 03B6 HX .EQU 26H ; HEX error -0809 03B6 BN .EQU 28H ; BIN error -0810 03B6 -0811 03B6 ; .ORG 00396H -0812 03B6 -0813 03B6 C3 BC 03 COLD: JP STARTB ; Jump for cold start -0814 03B9 C3 5A 04 WARM: JP WARMST ; Jump for warm start -0815 03BC STARTB: -0816 03BC DD 21 00 00 LD IX,0 ; Flag cold start -0817 03C0 C3 C7 03 JP CSTART ; Jump to initialise -0818 03C3 -0819 03C3 6D 0C .WORD DEINT ; Get integer -32768 to 32767 -0820 03C5 E3 13 .WORD ABPASS ; Return integer in AB -0821 03C7 -0822 03C7 -0823 03C7 21 B0 30 CSTART: LD HL,WRKSPC ; Start of workspace RAM -0824 03CA F9 LD SP,HL ; Set up a temporary stack -0825 03CB C3 02 20 JP INITST ; Go to initialise -0826 03CE -0827 03CE 11 94 06 INIT: LD DE,INITAB ; Initialise workspace -0828 03D1 06 63 LD B,INITBE-INITAB+3; Bytes to copy -0829 03D3 21 B0 30 LD HL,WRKSPC ; Into workspace RAM -0830 03D6 1A COPY: LD A,(DE) ; Get source -0831 03D7 77 LD (HL),A ; To destination -0832 03D8 23 INC HL ; Next destination -0833 03D9 13 INC DE ; Next source -0834 03DA 05 DEC B ; Count bytes -0835 03DB C2 D6 03 JP NZ,COPY ; More to move -0836 03DE F9 LD SP,HL ; Temporary stack -0837 03DF CD 95 08 CALL CLREG ; Clear registers and stack -0838 03E2 CD 63 0E CALL PRNTCRLF ; Output CRLF -0839 03E5 32 5A 31 LD (BUFFER+72+1),A ; Mark end of buffer -0840 03E8 32 A9 31 LD (PROGST),A ; Initialise program area -0841 03EB 21 A9 04 MSIZE: LD HL,MEMMSG ; Point to message -0842 03EE CD 01 15 CALL PRS ; Output "Memory size" -0843 03F1 CD B2 08 CALL PROMPT ; Get input with '?' -0844 03F4 CD BB 0B CALL GETCHR ; Get next character -0845 03F7 B7 OR A ; Set flags -0846 03F8 C2 10 04 JP NZ,TSTMEM ; If number - Test if RAM there -0847 03FB 21 0D 32 LD HL,STLOOK ; Point to start of RAM -0848 03FE 23 MLOOP: INC HL ; Next byte -0849 03FF 7C LD A,H ; Above address FFFF ? -0850 0400 B5 OR L -0851 0401 CA 22 04 JP Z,SETTOP ; Yes - 64K RAM -0852 0404 7E LD A,(HL) ; Get contents -0853 0405 47 LD B,A ; Save it -0854 0406 2F CPL ; Flip all bits -0855 0407 77 LD (HL),A ; Put it back -0856 0408 BE CP (HL) ; RAM there if same -0857 0409 70 LD (HL),B ; Restore old contents -0858 040A CA FE 03 JP Z,MLOOP ; If RAM - test next byte -0859 040D C3 22 04 JP SETTOP ; Top of RAM found -0860 0410 -0861 0410 CD 87 0C TSTMEM: CALL ATOH ; Get high memory into DE -0862 0413 B7 OR A ; Set flags on last byte -0863 0414 C2 63 07 JP NZ,SNERR ; ?SN Error if bad character -0864 0417 EB EX DE,HL ; Address into HL -0865 0418 2B DEC HL ; Back one byte -0866 0419 3E D9 LD A,11011001B ; Test byte -0867 041B 46 LD B,(HL) ; Get old contents -0868 041C 77 LD (HL),A ; Load test byte -0869 041D BE CP (HL) ; RAM there if same -0870 041E 70 LD (HL),B ; Restore old contents -0871 041F C2 EB 03 JP NZ,MSIZE ; Ask again if no RAM -0872 0422 -0873 0422 2B SETTOP: DEC HL ; Back one byte -0874 0423 11 0C 32 LD DE,STLOOK-1 ; See if enough RAM -0875 0426 CD 2B 0A CALL CPDEHL ; Compare DE with HL -0876 0429 DA EB 03 JP C,MSIZE ; Ask again if not enough RAM -0877 042C 11 CE FF LD DE,0-50 ; 50 Bytes string space -0878 042F 22 5F 31 LD (LSTRAM),HL ; Save last available RAM -0879 0432 19 ADD HL,DE ; Allocate string space -0880 0433 22 0A 31 LD (STRSPC),HL ; Save string space -0881 0436 CD 70 08 CALL CLRPTR ; Clear program area -0882 0439 2A 0A 31 LD HL,(STRSPC) ; Get end of memory -0883 043C 11 EF FF LD DE,0-17 ; Offset for free bytes -0884 043F 19 ADD HL,DE ; Adjust HL -0885 0440 11 A9 31 LD DE,PROGST ; Start of program text -0886 0443 7D LD A,L ; Get LSB -0887 0444 93 SUB E ; Adjust it -0888 0445 6F LD L,A ; Re-save -0889 0446 7C LD A,H ; Get MSB -0890 0447 9A SBC A,D ; Adjust it -0891 0448 67 LD H,A ; Re-save -0892 0449 E5 PUSH HL ; Save bytes free -0893 044A 21 72 04 LD HL,SIGNON ; Sign-on message -0894 044D CD 01 15 CALL PRS ; Output string -0895 0450 E1 POP HL ; Get bytes free back -0896 0451 CD A4 1B CALL PRNTHL ; Output amount of free memory -0897 0454 21 63 04 LD HL,BFREE ; " Bytes free" message -0898 0457 CD 01 15 CALL PRS ; Output string -0899 045A -0900 045A 31 16 31 WARMST: LD SP,STACK ; Temporary stack -0901 045D CD 95 08 BRKRET: CALL CLREG ; Clear registers and stack -0902 0460 C3 AE 07 JP PRNTOK ; Go to get command line -0903 0463 -0904 0463 20 42 79 74 BFREE: .BYTE " Bytes free",CR,LF,0,0 -0904 0467 65 73 20 66 -0904 046B 72 65 65 0D -0904 046F 0A 00 00 -0905 0472 -0906 0472 5A 38 30 20 SIGNON: .BYTE "Z80 BASIC Ver 4.7b",CR,LF -0906 0476 42 41 53 49 -0906 047A 43 20 56 65 -0906 047E 72 20 34 2E -0906 0482 37 62 0D 0A -0907 0486 43 6F 70 79 .BYTE "Copyright ",40,"C",41 -0907 048A 72 69 67 68 -0907 048E 74 20 28 43 -0907 0492 29 -0908 0493 20 31 39 37 .BYTE " 1978 by Microsoft",CR,LF,0,0 -0908 0497 38 20 62 79 -0908 049B 20 4D 69 63 -0908 049F 72 6F 73 6F -0908 04A3 66 74 0D 0A -0908 04A7 00 00 -0909 04A9 -0910 04A9 4D 65 6D 6F MEMMSG: .BYTE "Memory top",0 -0910 04AD 72 79 20 74 -0910 04B1 6F 70 00 -0911 04B4 -0912 04B4 ; FUNCTION ADDRESS TABLE -0913 04B4 -0914 04B4 19 1A FNCTAB: .WORD SGN -0915 04B6 DD 1A .WORD INT -0916 04B8 2F 1A .WORD ABS -0917 04BA B3 30 .WORD USR -0918 04BC C1 13 .WORD FRE -0919 04BE 46 17 .WORD INP -0920 04C0 EF 13 .WORD POS -0921 04C2 A3 1C .WORD SQR -0922 04C4 82 1D .WORD RND -0923 04C6 BE 18 .WORD LOG -0924 04C8 F1 1C .WORD EXP -0925 04CA F7 1D .WORD COS -0926 04CC FD 1D .WORD SIN -0927 04CE 5E 1E .WORD TAN -0928 04D0 73 1E .WORD ATN -0929 04D2 9A 17 .WORD PEEK -0930 04D4 DE 1E .WORD DEEK -0931 04D6 01 31 .WORD POINT -0932 04D8 73 16 .WORD LEN -0933 04DA 8B 14 .WORD STR -0934 04DC 0D 17 .WORD VAL -0935 04DE 82 16 .WORD ASC -0936 04E0 93 16 .WORD CHR -0937 04E2 00 1F .WORD HEX -0938 04E4 93 1F .WORD BIN -0939 04E6 A3 16 .WORD LEFT -0940 04E8 D3 16 .WORD RIGHT -0941 04EA DD 16 .WORD MID -0942 04EC -0943 04EC ; RESERVED WORD LIST -0944 04EC -0945 04EC C5 4E 44 WORDS: .BYTE 'E'+80H,"ND" -0946 04EF C6 4F 52 .BYTE 'F'+80H,"OR" -0947 04F2 CE 45 58 54 .BYTE 'N'+80H,"EXT" -0948 04F6 C4 41 54 41 .BYTE 'D'+80H,"ATA" -0949 04FA C9 4E 50 55 .BYTE 'I'+80H,"NPUT" -0949 04FE 54 -0950 04FF C4 49 4D .BYTE 'D'+80H,"IM" -0951 0502 D2 45 41 44 .BYTE 'R'+80H,"EAD" -0952 0506 CC 45 54 .BYTE 'L'+80H,"ET" -0953 0509 C7 4F 54 4F .BYTE 'G'+80H,"OTO" -0954 050D D2 55 4E .BYTE 'R'+80H,"UN" -0955 0510 C9 46 .BYTE 'I'+80H,"F" -0956 0512 D2 45 53 54 .BYTE 'R'+80H,"ESTORE" -0956 0516 4F 52 45 -0957 0519 C7 4F 53 55 .BYTE 'G'+80H,"OSUB" -0957 051D 42 -0958 051E D2 45 54 55 .BYTE 'R'+80H,"ETURN" -0958 0522 52 4E -0959 0524 D2 45 4D .BYTE 'R'+80H,"EM" -0960 0527 D3 54 4F 50 .BYTE 'S'+80H,"TOP" -0961 052B CF 55 54 .BYTE 'O'+80H,"UT" -0962 052E CF 4E .BYTE 'O'+80H,"N" -0963 0530 CE 55 4C 4C .BYTE 'N'+80H,"ULL" -0964 0534 D7 41 49 54 .BYTE 'W'+80H,"AIT" -0965 0538 C4 45 46 .BYTE 'D'+80H,"EF" -0966 053B D0 4F 4B 45 .BYTE 'P'+80H,"OKE" -0967 053F C4 4F 4B 45 .BYTE 'D'+80H,"OKE" -0968 0543 D3 43 52 45 .BYTE 'S'+80H,"CREEN" -0968 0547 45 4E -0969 0549 CC 49 4E 45 .BYTE 'L'+80H,"INES" -0969 054D 53 -0970 054E C3 4C 53 .BYTE 'C'+80H,"LS" -0971 0551 D7 49 44 54 .BYTE 'W'+80H,"IDTH" -0971 0555 48 -0972 0556 CD 4F 4E 49 .BYTE 'M'+80H,"ONITOR" -0972 055A 54 4F 52 -0973 055D D3 45 54 .BYTE 'S'+80H,"ET" -0974 0560 D2 45 53 45 .BYTE 'R'+80H,"ESET" -0974 0564 54 -0975 0565 D0 52 49 4E .BYTE 'P'+80H,"RINT" -0975 0569 54 -0976 056A C3 4F 4E 54 .BYTE 'C'+80H,"ONT" -0977 056E CC 49 53 54 .BYTE 'L'+80H,"IST" -0978 0572 C3 4C 45 41 .BYTE 'C'+80H,"LEAR" -0978 0576 52 -0979 0577 C3 4C 4F 41 .BYTE 'C'+80H,"LOAD" -0979 057B 44 -0980 057C C3 53 41 56 .BYTE 'C'+80H,"SAVE" -0980 0580 45 -0981 0581 CE 45 57 .BYTE 'N'+80H,"EW" -0982 0584 -0983 0584 D4 41 42 28 .BYTE 'T'+80H,"AB(" -0984 0588 D4 4F .BYTE 'T'+80H,"O" -0985 058A C6 4E .BYTE 'F'+80H,"N" -0986 058C D3 50 43 28 .BYTE 'S'+80H,"PC(" -0987 0590 D4 48 45 4E .BYTE 'T'+80H,"HEN" -0988 0594 CE 4F 54 .BYTE 'N'+80H,"OT" -0989 0597 D3 54 45 50 .BYTE 'S'+80H,"TEP" -0990 059B -0991 059B AB .BYTE '+'+80H -0992 059C AD .BYTE '-'+80H -0993 059D AA .BYTE '*'+80H -0994 059E AF .BYTE '/'+80H -0995 059F DE .BYTE '^'+80H -0996 05A0 C1 4E 44 .BYTE 'A'+80H,"ND" -0997 05A3 CF 52 .BYTE 'O'+80H,"R" -0998 05A5 BE .BYTE '>'+80H -0999 05A6 BD .BYTE '='+80H -1000 05A7 BC .BYTE '<'+80H -1001 05A8 -1002 05A8 D3 47 4E .BYTE 'S'+80H,"GN" -1003 05AB C9 4E 54 .BYTE 'I'+80H,"NT" -1004 05AE C1 42 53 .BYTE 'A'+80H,"BS" -1005 05B1 D5 53 52 .BYTE 'U'+80H,"SR" -1006 05B4 C6 52 45 .BYTE 'F'+80H,"RE" -1007 05B7 C9 4E 50 .BYTE 'I'+80H,"NP" -1008 05BA D0 4F 53 .BYTE 'P'+80H,"OS" -1009 05BD D3 51 52 .BYTE 'S'+80H,"QR" -1010 05C0 D2 4E 44 .BYTE 'R'+80H,"ND" -1011 05C3 CC 4F 47 .BYTE 'L'+80H,"OG" -1012 05C6 C5 58 50 .BYTE 'E'+80H,"XP" -1013 05C9 C3 4F 53 .BYTE 'C'+80H,"OS" -1014 05CC D3 49 4E .BYTE 'S'+80H,"IN" -1015 05CF D4 41 4E .BYTE 'T'+80H,"AN" -1016 05D2 C1 54 4E .BYTE 'A'+80H,"TN" -1017 05D5 D0 45 45 4B .BYTE 'P'+80H,"EEK" -1018 05D9 C4 45 45 4B .BYTE 'D'+80H,"EEK" -1019 05DD D0 4F 49 4E .BYTE 'P'+80H,"OINT" -1019 05E1 54 -1020 05E2 CC 45 4E .BYTE 'L'+80H,"EN" -1021 05E5 D3 54 52 24 .BYTE 'S'+80H,"TR$" -1022 05E9 D6 41 4C .BYTE 'V'+80H,"AL" -1023 05EC C1 53 43 .BYTE 'A'+80H,"SC" -1024 05EF C3 48 52 24 .BYTE 'C'+80H,"HR$" -1025 05F3 C8 45 58 24 .BYTE 'H'+80H,"EX$" -1026 05F7 C2 49 4E 24 .BYTE 'B'+80H,"IN$" -1027 05FB CC 45 46 54 .BYTE 'L'+80H,"EFT$" -1027 05FF 24 -1028 0600 D2 49 47 48 .BYTE 'R'+80H,"IGHT$" -1028 0604 54 24 -1029 0606 CD 49 44 24 .BYTE 'M'+80H,"ID$" -1030 060A 80 .BYTE 80H ; End of list marker -1031 060B -1032 060B ; KEYWORD ADDRESS TABLE -1033 060B -1034 060B 05 0C WORDTB: .WORD PEND -1035 060D 02 0B .WORD FOR -1036 060F DD 0F .WORD NEXT -1037 0611 52 0D .WORD DATA -1038 0613 E4 0E .WORD INPUT -1039 0615 19 12 .WORD DIM -1040 0617 13 0F .WORD READ -1041 0619 69 0D .WORD LET -1042 061B 0F 0D .WORD GOTO -1043 061D F2 0C .WORD RUN -1044 061F E1 0D .WORD IF -1045 0621 CB 0B .WORD RESTOR -1046 0623 FE 0C .WORD GOSUB -1047 0625 2D 0D .WORD RETURN -1048 0627 54 0D .WORD REM -1049 0629 03 0C .WORD STOP -1050 062B 52 17 .WORD POUT -1051 062D C3 0D .WORD ON -1052 062F 44 0C .WORD NULL -1053 0631 58 17 .WORD WAIT -1054 0633 F7 13 .WORD DEF -1055 0635 A1 17 .WORD POKE -1056 0637 E9 1E .WORD DOKE -1057 0639 54 0D .WORD REM -1058 063B CF 1E .WORD LINES -1059 063D C2 1E .WORD CLS -1060 063F C7 1E .WORD WIDTH -1061 0641 FF 1F .WORD MONITR -1062 0643 04 31 .WORD PSET -1063 0645 07 31 .WORD RESET -1064 0647 05 0E .WORD PRINT -1065 0649 31 0C .WORD CONT -1066 064B 77 0A .WORD LIST -1067 064D AC 0C .WORD CLEAR -1068 064F 54 0D .WORD REM -1069 0651 54 0D .WORD REM -1070 0653 6F 08 .WORD NEW -1071 0655 -1072 0655 ; RESERVED WORD TOKEN VALUES -1073 0655 -1074 0655 ZEND .EQU 080H ; END -1075 0655 ZFOR .EQU 081H ; FOR -1076 0655 ZDATA .EQU 083H ; DATA -1077 0655 ZGOTO .EQU 088H ; GOTO -1078 0655 ZGOSUB .EQU 08CH ; GOSUB -1079 0655 ZREM .EQU 08EH ; REM -1080 0655 ZPRINT .EQU 09EH ; PRINT -1081 0655 ZNEW .EQU 0A4H ; NEW -1082 0655 -1083 0655 ZTAB .EQU 0A5H ; TAB -1084 0655 ZTO .EQU 0A6H ; TO -1085 0655 ZFN .EQU 0A7H ; FN -1086 0655 ZSPC .EQU 0A8H ; SPC -1087 0655 ZTHEN .EQU 0A9H ; THEN -1088 0655 ZNOT .EQU 0AAH ; NOT -1089 0655 ZSTEP .EQU 0ABH ; STEP -1090 0655 -1091 0655 ZPLUS .EQU 0ACH ; + -1092 0655 ZMINUS .EQU 0ADH ; - -1093 0655 ZTIMES .EQU 0AEH ; * -1094 0655 ZDIV .EQU 0AFH ; / -1095 0655 ZOR .EQU 0B2H ; OR -1096 0655 ZGTR .EQU 0B3H ; > -1097 0655 ZEQUAL .EQU 0B4H ; M -1098 0655 ZLTH .EQU 0B5H ; < -1099 0655 ZSGN .EQU 0B6H ; SGN -1100 0655 ZPOINT .EQU 0C7H ; POINT -1101 0655 ZLEFT .EQU 0CDH +2 ; LEFT$ -1102 0655 -1103 0655 ; ARITHMETIC PRECEDENCE TABLE -1104 0655 -1105 0655 79 PRITAB: .BYTE 79H ; Precedence value -1106 0656 8B 1B .WORD PADD ; FPREG = + FPREG -1107 0658 -1108 0658 79 .BYTE 79H ; Precedence value -1109 0659 BF 17 .WORD PSUB ; FPREG = - FPREG -1110 065B -1111 065B 7C .BYTE 7CH ; Precedence value -1112 065C FD 18 .WORD MULT ; PPREG = * FPREG -1113 065E -1114 065E 7C .BYTE 7CH ; Precedence value -1115 065F 5E 19 .WORD DIV ; FPREG = / FPREG -1116 0661 -1117 0661 7F .BYTE 7FH ; Precedence value -1118 0662 AC 1C .WORD POWER ; FPREG = ^ FPREG -1119 0664 -1120 0664 50 .BYTE 50H ; Precedence value -1121 0665 72 11 .WORD PAND ; FPREG = AND FPREG -1122 0667 -1123 0667 46 .BYTE 46H ; Precedence value -1124 0668 71 11 .WORD POR ; FPREG = OR FPREG -1125 066A -1126 066A ; BASIC ERROR CODE LIST -1127 066A -1128 066A 4E 46 ERRORS: .BYTE "NF" ; NEXT without FOR -1129 066C 53 4E .BYTE "SN" ; Syntax error -1130 066E 52 47 .BYTE "RG" ; RETURN without GOSUB -1131 0670 4F 44 .BYTE "OD" ; Out of DATA -1132 0672 46 43 .BYTE "FC" ; Illegal function call -1133 0674 4F 56 .BYTE "OV" ; Overflow error -1134 0676 4F 4D .BYTE "OM" ; Out of memory -1135 0678 55 4C .BYTE "UL" ; Undefined line -1136 067A 42 53 .BYTE "BS" ; Bad subscript -1137 067C 44 44 .BYTE "DD" ; Re-DIMensioned array -1138 067E 2F 30 .BYTE "/0" ; Division by zero -1139 0680 49 44 .BYTE "ID" ; Illegal direct -1140 0682 54 4D .BYTE "TM" ; Type mis-match -1141 0684 4F 53 .BYTE "OS" ; Out of string space -1142 0686 4C 53 .BYTE "LS" ; String too long -1143 0688 53 54 .BYTE "ST" ; String formula too complex -1144 068A 43 4E .BYTE "CN" ; Can't CONTinue -1145 068C 55 46 .BYTE "UF" ; Undefined FN function -1146 068E 4D 4F .BYTE "MO" ; Missing operand -1147 0690 48 58 .BYTE "HX" ; HEX error -1148 0692 42 4E .BYTE "BN" ; BIN error -1149 0694 -1150 0694 ; INITIALISATION TABLE ------------------------------------------------------- -1151 0694 -1152 0694 C3 5A 04 INITAB: JP WARMST ; Warm start jump -1153 0697 C3 82 0C JP FCERR ; "USR (X)" jump (Set to Error) -1154 069A D3 00 OUT (0),A ; "OUT p,n" skeleton -1155 069C C9 RET -1156 069D D6 00 SUB 0 ; Division support routine -1157 069F 6F LD L,A -1158 06A0 7C LD A,H -1159 06A1 DE 00 SBC A,0 -1160 06A3 67 LD H,A -1161 06A4 78 LD A,B -1162 06A5 DE 00 SBC A,0 -1163 06A7 47 LD B,A -1164 06A8 3E 00 LD A,0 -1165 06AA C9 RET -1166 06AB 00 00 00 .BYTE 0,0,0 ; Random number seed table used by RND -1167 06AE 35 4A CA 99 .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07 -1168 06B2 39 1C 76 98 .BYTE 039H,01CH,076H,098H ; 1.61291E+07 -1169 06B6 22 95 B3 98 .BYTE 022H,095H,0B3H,098H ;-1.17691E+07 -1170 06BA 0A DD 47 98 .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07 -1171 06BE 53 D1 99 99 .BYTE 053H,0D1H,099H,099H ;-2-01612E+07 -1172 06C2 0A 1A 9F 98 .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07 -1173 06C6 65 BC CD 98 .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07 -1174 06CA D6 77 3E 98 .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07 -1175 06CE 52 C7 4F 80 .BYTE 052H,0C7H,04FH,080H ; Last random number -1176 06D2 DB 00 IN A,(0) ; INP (x) skeleton -1177 06D4 C9 RET -1178 06D5 01 .BYTE 1 ; POS (x) number (1) -1179 06D6 FF .BYTE 255 ; Terminal width (255 = no auto CRLF) -1180 06D7 1C .BYTE 28 ; Width for commas (3 columns) -1181 06D8 00 .BYTE 0 ; No nulls after input bytes -1182 06D9 00 .BYTE 0 ; Output enabled (^O off) -1183 06DA 14 00 .WORD 20 ; Initial lines counter -1184 06DC 14 00 .WORD 20 ; Initial lines number -1185 06DE 00 00 .WORD 0 ; Array load/save check sum -1186 06E0 00 .BYTE 0 ; Break not by NMI -1187 06E1 00 .BYTE 0 ; Break flag -1188 06E2 C3 A8 09 JP TTYLIN ; Input reflection (set to TTY) -1189 06E5 C3 00 00 JP $0000 ; POINT reflection unused -1190 06E8 C3 00 00 JP $0000 ; SET reflection -1191 06EB C3 00 00 JP $0000 ; RESET reflection -1192 06EE 0D 32 .WORD STLOOK ; Temp string space -1193 06F0 FE FF .WORD -2 ; Current line number (cold) -1194 06F2 AA 31 .WORD PROGST+1 ; Start of program text -1195 06F4 INITBE: -1196 06F4 -1197 06F4 ; END OF INITIALISATION TABLE --------------------------------------------------- -1198 06F4 -1199 06F4 20 45 72 72 ERRMSG: .BYTE " Error",0 -1199 06F8 6F 72 00 -1200 06FB 20 69 6E 20 INMSG: .BYTE " in ",0 -1200 06FF 00 -1201 0700 ZERBYT .EQU $-1 ; A zero byte -1202 0700 4F 6B 0D 0A OKMSG: .BYTE "Ok",CR,LF,0,0 -1202 0704 00 00 -1203 0706 42 72 65 61 BRKMSG: .BYTE "Break",0 -1203 070A 6B 00 -1204 070C -1205 070C 21 04 00 BAKSTK: LD HL,4 ; Look for "FOR" block with -1206 070F 39 ADD HL,SP ; same index as specified -1207 0710 7E LOKFOR: LD A,(HL) ; Get block ID -1208 0711 23 INC HL ; Point to index address -1209 0712 FE 81 CP ZFOR ; Is it a "FOR" token -1210 0714 C0 RET NZ ; No - exit -1211 0715 4E LD C,(HL) ; BC = Address of "FOR" index -1212 0716 23 INC HL -1213 0717 46 LD B,(HL) -1214 0718 23 INC HL ; Point to sign of STEP -1215 0719 E5 PUSH HL ; Save pointer to sign -1216 071A 69 LD L,C ; HL = address of "FOR" index -1217 071B 60 LD H,B -1218 071C 7A LD A,D ; See if an index was specified -1219 071D B3 OR E ; DE = 0 if no index specified -1220 071E EB EX DE,HL ; Specified index into HL -1221 071F CA 26 07 JP Z,INDFND ; Skip if no index given -1222 0722 EB EX DE,HL ; Index back into DE -1223 0723 CD 2B 0A CALL CPDEHL ; Compare index with one given -1224 0726 01 0D 00 INDFND: LD BC,16-3 ; Offset to next block -1225 0729 E1 POP HL ; Restore pointer to sign -1226 072A C8 RET Z ; Return if block found -1227 072B 09 ADD HL,BC ; Point to next block -1228 072C C3 10 07 JP LOKFOR ; Keep on looking -1229 072F -1230 072F CD 49 07 MOVUP: CALL ENFMEM ; See if enough memory -1231 0732 C5 MOVSTR: PUSH BC ; Save end of source -1232 0733 E3 EX (SP),HL ; Swap source and dest" end -1233 0734 C1 POP BC ; Get end of destination -1234 0735 CD 2B 0A MOVLP: CALL CPDEHL ; See if list moved -1235 0738 7E LD A,(HL) ; Get byte -1236 0739 02 LD (BC),A ; Move it -1237 073A C8 RET Z ; Exit if all done -1238 073B 0B DEC BC ; Next byte to move to -1239 073C 2B DEC HL ; Next byte to move -1240 073D C3 35 07 JP MOVLP ; Loop until all bytes moved -1241 0740 -1242 0740 E5 CHKSTK: PUSH HL ; Save code string address -1243 0741 2A 8A 31 LD HL,(ARREND) ; Lowest free memory -1244 0744 06 00 LD B,0 ; BC = Number of levels to test -1245 0746 09 ADD HL,BC ; 2 Bytes for each level -1246 0747 09 ADD HL,BC -1247 0748 3E .BYTE 3EH ; Skip "PUSH HL" -1248 0749 E5 ENFMEM: PUSH HL ; Save code string address -1249 074A 3E D0 LD A,0D0H ;LOW -48 ; 48 Bytes minimum RAM -1250 074C 95 SUB L -1251 074D 6F LD L,A -1252 074E 3E FF LD A,0FFH; HIGH (-48) ; 48 Bytes minimum RAM -1253 0750 9C SBC A,H -1254 0751 DA 58 07 JP C,OMERR ; Not enough - ?OM Error -1255 0754 67 LD H,A -1256 0755 39 ADD HL,SP ; Test if stack is overflowed -1257 0756 E1 POP HL ; Restore code string address -1258 0757 D8 RET C ; Return if enough mmory -1259 0758 1E 0C OMERR: LD E,OM ; ?OM Error -1260 075A C3 77 07 JP ERROR -1261 075D -1262 075D 2A 79 31 DATSNR: LD HL,(DATLIN) ; Get line of current DATA item -1263 0760 22 0C 31 LD (LINEAT),HL ; Save as current line -1264 0763 1E 02 SNERR: LD E,SN ; ?SN Error -1265 0765 01 .BYTE 01H ; Skip "LD E,DZ" -1266 0766 1E 14 DZERR: LD E,DZ ; ?/0 Error -1267 0768 01 .BYTE 01H ; Skip "LD E,NF" -1268 0769 1E 00 NFERR: LD E,NF ; ?NF Error -1269 076B 01 .BYTE 01H ; Skip "LD E,DD" -1270 076C 1E 12 DDERR: LD E,DD ; ?DD Error -1271 076E 01 .BYTE 01H ; Skip "LD E,UF" -1272 076F 1E 22 UFERR: LD E,UF ; ?UF Error -1273 0771 01 .BYTE 01H ; Skip "LD E,OV -1274 0772 1E 0A OVERR: LD E,OV ; ?OV Error -1275 0774 01 .BYTE 01H ; Skip "LD E,TM" -1276 0775 1E 18 TMERR: LD E,TM ; ?TM Error -1277 0777 -1278 0777 CD 95 08 ERROR: CALL CLREG ; Clear registers and stack -1279 077A 32 F5 30 LD (CTLOFG),A ; Enable output (A is 0) -1280 077D CD 56 0E CALL STTLIN ; Start new line -1281 0780 21 6A 06 LD HL,ERRORS ; Point to error codes -1282 0783 57 LD D,A ; D = 0 (A is 0) -1283 0784 3E 3F LD A,'?' -1284 0786 CD 3C 0A CALL OUTC ; Output '?' -1285 0789 19 ADD HL,DE ; Offset to correct error code -1286 078A 7E LD A,(HL) ; First character -1287 078B CD 3C 0A CALL OUTC ; Output it -1288 078E CD BB 0B CALL GETCHR ; Get next character -1289 0791 CD 3C 0A CALL OUTC ; Output it -1290 0794 21 F4 06 LD HL,ERRMSG ; "Error" message -1291 0797 CD 01 15 ERRIN: CALL PRS ; Output message -1292 079A 2A 0C 31 LD HL,(LINEAT) ; Get line of error -1293 079D 11 FE FF LD DE,-2 ; Cold start error if -2 -1294 07A0 CD 2B 0A CALL CPDEHL ; See if cold start error -1295 07A3 CA C7 03 JP Z,CSTART ; Cold start error - Restart -1296 07A6 7C LD A,H ; Was it a direct error? -1297 07A7 A5 AND L ; Line = -1 if direct error -1298 07A8 3C INC A -1299 07A9 C4 9C 1B CALL NZ,LINEIN ; No - output line of error -1300 07AC 3E .BYTE 3EH ; Skip "POP BC" -1301 07AD C1 POPNOK: POP BC ; Drop address in input buffer -1302 07AE -1303 07AE AF PRNTOK: XOR A ; Output "Ok" and get command -1304 07AF 32 F5 30 LD (CTLOFG),A ; Enable output -1305 07B2 CD 56 0E CALL STTLIN ; Start new line -1306 07B5 21 00 07 LD HL,OKMSG ; "Ok" message -1307 07B8 CD 01 15 CALL PRS ; Output "Ok" -1308 07BB 21 FF FF GETCMD: LD HL,-1 ; Flag direct mode -1309 07BE 22 0C 31 LD (LINEAT),HL ; Save as current line -1310 07C1 CD A8 09 CALL GETLIN ; Get an input line -1311 07C4 DA BB 07 JP C,GETCMD ; Get line again if break -1312 07C7 CD BB 0B CALL GETCHR ; Get first character -1313 07CA 3C INC A ; Test if end of line -1314 07CB 3D DEC A ; Without affecting Carry -1315 07CC CA BB 07 JP Z,GETCMD ; Nothing entered - Get another -1316 07CF F5 PUSH AF ; Save Carry status -1317 07D0 CD 87 0C CALL ATOH ; Get line number into DE -1318 07D3 D5 PUSH DE ; Save line number -1319 07D4 CD BF 08 CALL CRUNCH ; Tokenise rest of line -1320 07D7 47 LD B,A ; Length of tokenised line -1321 07D8 D1 POP DE ; Restore line number -1322 07D9 F1 POP AF ; Restore Carry -1323 07DA D2 9B 0B JP NC,EXCUTE ; No line number - Direct mode -1324 07DD D5 PUSH DE ; Save line number -1325 07DE C5 PUSH BC ; Save length of tokenised line -1326 07DF AF XOR A -1327 07E0 32 7C 31 LD (LSTBIN),A ; Clear last byte input -1328 07E3 CD BB 0B CALL GETCHR ; Get next character -1329 07E6 B7 OR A ; Set flags -1330 07E7 F5 PUSH AF ; And save them -1331 07E8 CD 4F 08 CALL SRCHLN ; Search for line number in DE -1332 07EB DA F4 07 JP C,LINFND ; Jump if line found -1333 07EE F1 POP AF ; Get status -1334 07EF F5 PUSH AF ; And re-save -1335 07F0 CA 28 0D JP Z,ULERR ; Nothing after number - Error -1336 07F3 B7 OR A ; Clear Carry -1337 07F4 C5 LINFND: PUSH BC ; Save address of line in prog -1338 07F5 D2 0B 08 JP NC,INEWLN ; Line not found - Insert new -1339 07F8 EB EX DE,HL ; Next line address in DE -1340 07F9 2A 86 31 LD HL,(PROGND) ; End of program -1341 07FC 1A SFTPRG: LD A,(DE) ; Shift rest of program down -1342 07FD 02 LD (BC),A -1343 07FE 03 INC BC ; Next destination -1344 07FF 13 INC DE ; Next source -1345 0800 CD 2B 0A CALL CPDEHL ; All done? -1346 0803 C2 FC 07 JP NZ,SFTPRG ; More to do -1347 0806 60 LD H,B ; HL - New end of program -1348 0807 69 LD L,C -1349 0808 22 86 31 LD (PROGND),HL ; Update end of program -1350 080B -1351 080B D1 INEWLN: POP DE ; Get address of line, -1352 080C F1 POP AF ; Get status -1353 080D CA 32 08 JP Z,SETPTR ; No text - Set up pointers -1354 0810 2A 86 31 LD HL,(PROGND) ; Get end of program -1355 0813 E3 EX (SP),HL ; Get length of input line -1356 0814 C1 POP BC ; End of program to BC -1357 0815 09 ADD HL,BC ; Find new end -1358 0816 E5 PUSH HL ; Save new end -1359 0817 CD 2F 07 CALL MOVUP ; Make space for line -1360 081A E1 POP HL ; Restore new end -1361 081B 22 86 31 LD (PROGND),HL ; Update end of program pointer -1362 081E EB EX DE,HL ; Get line to move up in HL -1363 081F 74 LD (HL),H ; Save MSB -1364 0820 D1 POP DE ; Get new line number -1365 0821 23 INC HL ; Skip pointer -1366 0822 23 INC HL -1367 0823 73 LD (HL),E ; Save LSB of line number -1368 0824 23 INC HL -1369 0825 72 LD (HL),D ; Save MSB of line number -1370 0826 23 INC HL ; To first byte in line -1371 0827 11 11 31 LD DE,BUFFER ; Copy buffer to program -1372 082A 1A MOVBUF: LD A,(DE) ; Get source -1373 082B 77 LD (HL),A ; Save destinations -1374 082C 23 INC HL ; Next source -1375 082D 13 INC DE ; Next destination -1376 082E B7 OR A ; Done? -1377 082F C2 2A 08 JP NZ,MOVBUF ; No - Repeat -1378 0832 CD 7B 08 SETPTR: CALL RUNFST ; Set line pointers -1379 0835 23 INC HL ; To LSB of pointer -1380 0836 EB EX DE,HL ; Address to DE -1381 0837 62 PTRLP: LD H,D ; Address to HL -1382 0838 6B LD L,E -1383 0839 7E LD A,(HL) ; Get LSB of pointer -1384 083A 23 INC HL ; To MSB of pointer -1385 083B B6 OR (HL) ; Compare with MSB pointer -1386 083C CA BB 07 JP Z,GETCMD ; Get command line if end -1387 083F 23 INC HL ; To LSB of line number -1388 0840 23 INC HL ; Skip line number -1389 0841 23 INC HL ; Point to first byte in line -1390 0842 AF XOR A ; Looking for 00 byte -1391 0843 BE FNDEND: CP (HL) ; Found end of line? -1392 0844 23 INC HL ; Move to next byte -1393 0845 C2 43 08 JP NZ,FNDEND ; No - Keep looking -1394 0848 EB EX DE,HL ; Next line address to HL -1395 0849 73 LD (HL),E ; Save LSB of pointer -1396 084A 23 INC HL -1397 084B 72 LD (HL),D ; Save MSB of pointer -1398 084C C3 37 08 JP PTRLP ; Do next line -1399 084F -1400 084F 2A 0E 31 SRCHLN: LD HL,(BASTXT) ; Start of program text -1401 0852 44 SRCHLP: LD B,H ; BC = Address to look at -1402 0853 4D LD C,L -1403 0854 7E LD A,(HL) ; Get address of next line -1404 0855 23 INC HL -1405 0856 B6 OR (HL) ; End of program found? -1406 0857 2B DEC HL -1407 0858 C8 RET Z ; Yes - Line not found -1408 0859 23 INC HL -1409 085A 23 INC HL -1410 085B 7E LD A,(HL) ; Get LSB of line number -1411 085C 23 INC HL -1412 085D 66 LD H,(HL) ; Get MSB of line number -1413 085E 6F LD L,A -1414 085F CD 2B 0A CALL CPDEHL ; Compare with line in DE -1415 0862 60 LD H,B ; HL = Start of this line -1416 0863 69 LD L,C -1417 0864 7E LD A,(HL) ; Get LSB of next line address -1418 0865 23 INC HL -1419 0866 66 LD H,(HL) ; Get MSB of next line address -1420 0867 6F LD L,A ; Next line to HL -1421 0868 3F CCF -1422 0869 C8 RET Z ; Lines found - Exit -1423 086A 3F CCF -1424 086B D0 RET NC ; Line not found,at line after -1425 086C C3 52 08 JP SRCHLP ; Keep looking -1426 086F -1427 086F C0 NEW: RET NZ ; Return if any more on line -1428 0870 2A 0E 31 CLRPTR: LD HL,(BASTXT) ; Point to start of program -1429 0873 AF XOR A ; Set program area to empty -1430 0874 77 LD (HL),A ; Save LSB = 00 -1431 0875 23 INC HL -1432 0876 77 LD (HL),A ; Save MSB = 00 -1433 0877 23 INC HL -1434 0878 22 86 31 LD (PROGND),HL ; Set program end -1435 087B -1436 087B 2A 0E 31 RUNFST: LD HL,(BASTXT) ; Clear all variables -1437 087E 2B DEC HL -1438 087F -1439 087F 22 7E 31 INTVAR: LD (BRKLIN),HL ; Initialise RUN variables -1440 0882 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM -1441 0885 22 73 31 LD (STRBOT),HL ; Clear string space -1442 0888 AF XOR A -1443 0889 CD CB 0B CALL RESTOR ; Reset DATA pointers -1444 088C 2A 86 31 LD HL,(PROGND) ; Get end of program -1445 088F 22 88 31 LD (VAREND),HL ; Clear variables -1446 0892 22 8A 31 LD (ARREND),HL ; Clear arrays -1447 0895 -1448 0895 C1 CLREG: POP BC ; Save return address -1449 0896 2A 0A 31 LD HL,(STRSPC) ; Get end of working RAN -1450 0899 F9 LD SP,HL ; Set stack -1451 089A 21 63 31 LD HL,TMSTPL ; Temporary string pool -1452 089D 22 61 31 LD (TMSTPT),HL ; Reset temporary string ptr -1453 08A0 AF XOR A ; A = 00 -1454 08A1 6F LD L,A ; HL = 0000 -1455 08A2 67 LD H,A -1456 08A3 22 84 31 LD (CONTAD),HL ; No CONTinue -1457 08A6 32 7B 31 LD (FORFLG),A ; Clear FOR flag -1458 08A9 22 8E 31 LD (FNRGNM),HL ; Clear FN argument -1459 08AC E5 PUSH HL ; HL = 0000 -1460 08AD C5 PUSH BC ; Put back return -1461 08AE 2A 7E 31 DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN -1462 08B1 C9 RET ; Return to execution driver -1463 08B2 -1464 08B2 3E 3F PROMPT: LD A,'?' ; '?' -1465 08B4 CD 3C 0A CALL OUTC ; Output character -1466 08B7 3E 20 LD A,' ' ; Space -1467 08B9 CD 3C 0A CALL OUTC ; Output character -1468 08BC C3 FE 30 JP RINPUT ; Get input line -1469 08BF -1470 08BF AF CRUNCH: XOR A ; Tokenise line @ HL to BUFFER -1471 08C0 32 5E 31 LD (DATFLG),A ; Reset literal flag -1472 08C3 0E 05 LD C,2+3 ; 2 byte number and 3 nulls -1473 08C5 11 11 31 LD DE,BUFFER ; Start of input buffer -1474 08C8 7E CRNCLP: LD A,(HL) ; Get byte -1475 08C9 FE 20 CP ' ' ; Is it a space? -1476 08CB CA 47 09 JP Z,MOVDIR ; Yes - Copy direct -1477 08CE 47 LD B,A ; Save character -1478 08CF FE 22 CP '"' ; Is it a quote? -1479 08D1 CA 67 09 JP Z,CPYLIT ; Yes - Copy literal string -1480 08D4 B7 OR A ; Is it end of buffer? -1481 08D5 CA 6E 09 JP Z,ENDBUF ; Yes - End buffer -1482 08D8 3A 5E 31 LD A,(DATFLG) ; Get data type -1483 08DB B7 OR A ; Literal? -1484 08DC 7E LD A,(HL) ; Get byte to copy -1485 08DD C2 47 09 JP NZ,MOVDIR ; Literal - Copy direct -1486 08E0 FE 3F CP '?' ; Is it '?' short for PRINT -1487 08E2 3E 9E LD A,ZPRINT ; "PRINT" token -1488 08E4 CA 47 09 JP Z,MOVDIR ; Yes - replace it -1489 08E7 7E LD A,(HL) ; Get byte again -1490 08E8 FE 30 CP '0' ; Is it less than '0' -1491 08EA DA F2 08 JP C,FNDWRD ; Yes - Look for reserved words -1492 08ED FE 3C CP 60; ";"+1 ; Is it "0123456789:;" ? -1493 08EF DA 47 09 JP C,MOVDIR ; Yes - copy it direct -1494 08F2 D5 FNDWRD: PUSH DE ; Look for reserved words -1495 08F3 11 EB 04 LD DE,WORDS-1 ; Point to table -1496 08F6 C5 PUSH BC ; Save count -1497 08F7 01 43 09 LD BC,RETNAD ; Where to return to -1498 08FA C5 PUSH BC ; Save return address -1499 08FB 06 7F LD B,ZEND-1 ; First token value -1 -1500 08FD 7E LD A,(HL) ; Get byte -1501 08FE FE 61 CP 'a' ; Less than 'a' ? -1502 0900 DA 0B 09 JP C,SEARCH ; Yes - search for words -1503 0903 FE 7B CP 'z'+1 ; Greater than 'z' ? -1504 0905 D2 0B 09 JP NC,SEARCH ; Yes - search for words -1505 0908 E6 5F AND 01011111B ; Force upper case -1506 090A 77 LD (HL),A ; Replace byte -1507 090B 4E SEARCH: LD C,(HL) ; Search for a word -1508 090C EB EX DE,HL -1509 090D 23 GETNXT: INC HL ; Get next reserved word -1510 090E B6 OR (HL) ; Start of word? -1511 090F F2 0D 09 JP P,GETNXT ; No - move on -1512 0912 04 INC B ; Increment token value -1513 0913 7E LD A, (HL) ; Get byte from table -1514 0914 E6 7F AND 01111111B ; Strip bit 7 -1515 0916 C8 RET Z ; Return if end of list -1516 0917 B9 CP C ; Same character as in buffer? -1517 0918 C2 0D 09 JP NZ,GETNXT ; No - get next word -1518 091B EB EX DE,HL -1519 091C E5 PUSH HL ; Save start of word -1520 091D -1521 091D 13 NXTBYT: INC DE ; Look through rest of word -1522 091E 1A LD A,(DE) ; Get byte from table -1523 091F B7 OR A ; End of word ? -1524 0920 FA 3F 09 JP M,MATCH ; Yes - Match found -1525 0923 4F LD C,A ; Save it -1526 0924 78 LD A,B ; Get token value -1527 0925 FE 88 CP ZGOTO ; Is it "GOTO" token ? -1528 0927 C2 2E 09 JP NZ,NOSPC ; No - Don't allow spaces -1529 092A CD BB 0B CALL GETCHR ; Get next character -1530 092D 2B DEC HL ; Cancel increment from GETCHR -1531 092E 23 NOSPC: INC HL ; Next byte -1532 092F 7E LD A,(HL) ; Get byte -1533 0930 FE 61 CP 'a' ; Less than 'a' ? -1534 0932 DA 37 09 JP C,NOCHNG ; Yes - don't change -1535 0935 E6 5F AND 01011111B ; Make upper case -1536 0937 B9 NOCHNG: CP C ; Same as in buffer ? -1537 0938 CA 1D 09 JP Z,NXTBYT ; Yes - keep testing -1538 093B E1 POP HL ; Get back start of word -1539 093C C3 0B 09 JP SEARCH ; Look at next word -1540 093F -1541 093F 48 MATCH: LD C,B ; Word found - Save token value -1542 0940 F1 POP AF ; Throw away return -1543 0941 EB EX DE,HL -1544 0942 C9 RET ; Return to "RETNAD" -1545 0943 EB RETNAD: EX DE,HL ; Get address in string -1546 0944 79 LD A,C ; Get token value -1547 0945 C1 POP BC ; Restore buffer length -1548 0946 D1 POP DE ; Get destination address -1549 0947 23 MOVDIR: INC HL ; Next source in buffer -1550 0948 12 LD (DE),A ; Put byte in buffer -1551 0949 13 INC DE ; Move up buffer -1552 094A 0C INC C ; Increment length of buffer -1553 094B D6 3A SUB ':' ; End of statement? -1554 094D CA 55 09 JP Z,SETLIT ; Jump if multi-statement line -1555 0950 FE 49 CP ZDATA-3AH ; Is it DATA statement ? -1556 0952 C2 58 09 JP NZ,TSTREM ; No - see if REM -1557 0955 32 5E 31 SETLIT: LD (DATFLG),A ; Set literal flag -1558 0958 D6 54 TSTREM: SUB ZREM-3AH ; Is it REM? -1559 095A C2 C8 08 JP NZ,CRNCLP ; No - Leave flag -1560 095D 47 LD B,A ; Copy rest of buffer -1561 095E 7E NXTCHR: LD A,(HL) ; Get byte -1562 095F B7 OR A ; End of line ? -1563 0960 CA 6E 09 JP Z,ENDBUF ; Yes - Terminate buffer -1564 0963 B8 CP B ; End of statement ? -1565 0964 CA 47 09 JP Z,MOVDIR ; Yes - Get next one -1566 0967 23 CPYLIT: INC HL ; Move up source string -1567 0968 12 LD (DE),A ; Save in destination -1568 0969 0C INC C ; Increment length -1569 096A 13 INC DE ; Move up destination -1570 096B C3 5E 09 JP NXTCHR ; Repeat -1571 096E -1572 096E 21 10 31 ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer -1573 0971 12 LD (DE),A ; Mark end of buffer (A = 00) -1574 0972 13 INC DE -1575 0973 12 LD (DE),A ; A = 00 -1576 0974 13 INC DE -1577 0975 12 LD (DE),A ; A = 00 -1578 0976 C9 RET -1579 0977 -1580 0977 3A F4 30 DODEL: LD A,(NULFLG) ; Get null flag status -1581 097A B7 OR A ; Is it zero? -1582 097B 3E 00 LD A,0 ; Zero A - Leave flags -1583 097D 32 F4 30 LD (NULFLG),A ; Zero null flag -1584 0980 C2 8B 09 JP NZ,ECHDEL ; Set - Echo it -1585 0983 05 DEC B ; Decrement length -1586 0984 CA A8 09 JP Z,GETLIN ; Get line again if empty -1587 0987 CD 3C 0A CALL OUTC ; Output null character -1588 098A 3E .BYTE 3EH ; Skip "DEC B" -1589 098B 05 ECHDEL: DEC B ; Count bytes in buffer -1590 098C 2B DEC HL ; Back space buffer -1591 098D CA 9F 09 JP Z,OTKLN ; No buffer - Try again -1592 0990 7E LD A,(HL) ; Get deleted byte -1593 0991 CD 3C 0A CALL OUTC ; Echo it -1594 0994 C3 B1 09 JP MORINP ; Get more input -1595 0997 -1596 0997 05 DELCHR: DEC B ; Count bytes in buffer -1597 0998 2B DEC HL ; Back space buffer -1598 0999 CD 3C 0A CALL OUTC ; Output character in A -1599 099C C2 B1 09 JP NZ,MORINP ; Not end - Get more -1600 099F CD 3C 0A OTKLN: CALL OUTC ; Output character in A -1601 09A2 CD 63 0E KILIN: CALL PRNTCRLF ; Output CRLF -1602 09A5 C3 A8 09 JP TTYLIN ; Get line again -1603 09A8 -1604 09A8 GETLIN: -1605 09A8 21 11 31 TTYLIN: LD HL,BUFFER ; Get a line by character -1606 09AB 06 01 LD B,1 ; Set buffer as empty -1607 09AD AF XOR A -1608 09AE 32 F4 30 LD (NULFLG),A ; Clear null flag -1609 09B1 CD 66 0A MORINP: CALL CLOTST ; Get character and test ^O -1610 09B4 4F LD C,A ; Save character in C -1611 09B5 FE 7F CP DEL ; Delete character? -1612 09B7 CA 77 09 JP Z,DODEL ; Yes - Process it -1613 09BA 3A F4 30 LD A,(NULFLG) ; Get null flag -1614 09BD B7 OR A ; Test null flag status -1615 09BE CA CA 09 JP Z,PROCES ; Reset - Process character -1616 09C1 3E 00 LD A,0 ; Set a null -1617 09C3 CD 3C 0A CALL OUTC ; Output null -1618 09C6 AF XOR A ; Clear A -1619 09C7 32 F4 30 LD (NULFLG),A ; Reset null flag -1620 09CA 79 PROCES: LD A,C ; Get character -1621 09CB FE 07 CP CTRLG ; Bell? -1622 09CD CA 0E 0A JP Z,PUTCTL ; Yes - Save it -1623 09D0 FE 03 CP CTRLC ; Is it control "C"? -1624 09D2 CC 63 0E CALL Z,PRNTCRLF ; Yes - Output CRLF -1625 09D5 37 SCF ; Flag break -1626 09D6 C8 RET Z ; Return if control "C" -1627 09D7 FE 0D CP CR ; Is it enter? -1628 09D9 CA 5E 0E JP Z,ENDINP ; Yes - Terminate input -1629 09DC FE 15 CP CTRLU ; Is it control "U"? -1630 09DE CA A2 09 JP Z,KILIN ; Yes - Get another line -1631 09E1 FE 40 CP '@' ; Is it "kill line"? -1632 09E3 CA 9F 09 JP Z,OTKLN ; Yes - Kill line -1633 09E6 FE 5F CP '_' ; Is it delete? -1634 09E8 CA 97 09 JP Z,DELCHR ; Yes - Delete character -1635 09EB FE 08 CP BKSP ; Is it backspace? -1636 09ED CA 97 09 JP Z,DELCHR ; Yes - Delete character -1637 09F0 FE 12 CP CTRLR ; Is it control "R"? -1638 09F2 C2 09 0A JP NZ,PUTBUF ; No - Put in buffer -1639 09F5 C5 PUSH BC ; Save buffer length -1640 09F6 D5 PUSH DE ; Save DE -1641 09F7 E5 PUSH HL ; Save buffer address -1642 09F8 36 00 LD (HL),0 ; Mark end of buffer -1643 09FA CD 13 20 CALL OUTNCR ; Output and do CRLF -1644 09FD 21 11 31 LD HL,BUFFER ; Point to buffer start -1645 0A00 CD 01 15 CALL PRS ; Output buffer -1646 0A03 E1 POP HL ; Restore buffer address -1647 0A04 D1 POP DE ; Restore DE -1648 0A05 C1 POP BC ; Restore buffer length -1649 0A06 C3 B1 09 JP MORINP ; Get another character -1650 0A09 -1651 0A09 FE 20 PUTBUF: CP ' ' ; Is it a control code? -1652 0A0B DA B1 09 JP C,MORINP ; Yes - Ignore -1653 0A0E 78 PUTCTL: LD A,B ; Get number of bytes in buffer -1654 0A0F FE 49 CP 72+1 ; Test for line overflow -1655 0A11 3E 07 LD A,CTRLG ; Set a bell -1656 0A13 D2 23 0A JP NC,OUTNBS ; Ring bell if buffer full -1657 0A16 79 LD A,C ; Get character -1658 0A17 71 LD (HL),C ; Save in buffer -1659 0A18 32 7C 31 LD (LSTBIN),A ; Save last input byte -1660 0A1B 23 INC HL ; Move up buffer -1661 0A1C 04 INC B ; Increment length -1662 0A1D CD 3C 0A OUTIT: CALL OUTC ; Output the character entered -1663 0A20 C3 B1 09 JP MORINP ; Get another character -1664 0A23 -1665 0A23 CD 3C 0A OUTNBS: CALL OUTC ; Output bell and back over it -1666 0A26 3E 08 LD A,BKSP ; Set back space -1667 0A28 C3 1D 0A JP OUTIT ; Output it and get more -1668 0A2B -1669 0A2B 7C CPDEHL: LD A,H ; Get H -1670 0A2C 92 SUB D ; Compare with D -1671 0A2D C0 RET NZ ; Different - Exit -1672 0A2E 7D LD A,L ; Get L -1673 0A2F 93 SUB E ; Compare with E -1674 0A30 C9 RET ; Return status -1675 0A31 -1676 0A31 7E CHKSYN: LD A,(HL) ; Check syntax of character -1677 0A32 E3 EX (SP),HL ; Address of test byte -1678 0A33 BE CP (HL) ; Same as in code string? -1679 0A34 23 INC HL ; Return address -1680 0A35 E3 EX (SP),HL ; Put it back -1681 0A36 CA BB 0B JP Z,GETCHR ; Yes - Get next character -1682 0A39 C3 63 07 JP SNERR ; Different - ?SN Error -1683 0A3C -1684 0A3C F5 OUTC: PUSH AF ; Save character -1685 0A3D 3A F5 30 LD A,(CTLOFG) ; Get control "O" flag -1686 0A40 B7 OR A ; Is it set? -1687 0A41 C2 36 15 JP NZ,POPAF ; Yes - don't output -1688 0A44 F1 POP AF ; Restore character -1689 0A45 C5 PUSH BC ; Save buffer length -1690 0A46 F5 PUSH AF ; Save character -1691 0A47 FE 20 CP ' ' ; Is it a control code? -1692 0A49 DA 60 0A JP C,DINPOS ; Yes - Don't INC POS(X) -1693 0A4C 3A F2 30 LD A,(LWIDTH) ; Get line width -1694 0A4F 47 LD B,A ; To B -1695 0A50 3A 5B 31 LD A,(CURPOS) ; Get cursor position -1696 0A53 04 INC B ; Width 255? -1697 0A54 CA 5C 0A JP Z,INCLEN ; Yes - No width limit -1698 0A57 05 DEC B ; Restore width -1699 0A58 B8 CP B ; At end of line? -1700 0A59 CC 63 0E CALL Z,PRNTCRLF ; Yes - output CRLF -1701 0A5C 3C INCLEN: INC A ; Move on one character -1702 0A5D 32 5B 31 LD (CURPOS),A ; Save new position -1703 0A60 F1 DINPOS: POP AF ; Restore character -1704 0A61 C1 POP BC ; Restore buffer length -1705 0A62 CD FC 1F CALL MONOUT ; Send it -1706 0A65 C9 RET -1707 0A66 -1708 0A66 CD C0 1E CLOTST: CALL GETINP ; Get input character -1709 0A69 E6 7F AND 01111111B ; Strip bit 7 -1710 0A6B FE 0F CP CTRLO ; Is it control "O"? -1711 0A6D C0 RET NZ ; No don't flip flag -1712 0A6E 3A F5 30 LD A,(CTLOFG) ; Get flag -1713 0A71 2F CPL ; Flip it -1714 0A72 32 F5 30 LD (CTLOFG),A ; Put it back -1715 0A75 AF XOR A ; Null character -1716 0A76 C9 RET -1717 0A77 -1718 0A77 CD 87 0C LIST: CALL ATOH ; ASCII number to DE -1719 0A7A C0 RET NZ ; Return if anything extra -1720 0A7B C1 POP BC ; Rubbish - Not needed -1721 0A7C CD 4F 08 CALL SRCHLN ; Search for line number in DE -1722 0A7F C5 PUSH BC ; Save address of line -1723 0A80 CD CD 0A CALL SETLIN ; Set up lines counter -1724 0A83 E1 LISTLP: POP HL ; Restore address of line -1725 0A84 4E LD C,(HL) ; Get LSB of next line -1726 0A85 23 INC HL -1727 0A86 46 LD B,(HL) ; Get MSB of next line -1728 0A87 23 INC HL -1729 0A88 78 LD A,B ; BC = 0 (End of program)? -1730 0A89 B1 OR C -1731 0A8A CA AE 07 JP Z,PRNTOK ; Yes - Go to command mode -1732 0A8D CD D6 0A CALL COUNT ; Count lines -1733 0A90 CD E6 0B CALL TSTBRK ; Test for break key -1734 0A93 C5 PUSH BC ; Save address of next line -1735 0A94 CD 63 0E CALL PRNTCRLF ; Output CRLF -1736 0A97 5E LD E,(HL) ; Get LSB of line number -1737 0A98 23 INC HL -1738 0A99 56 LD D,(HL) ; Get MSB of line number -1739 0A9A 23 INC HL -1740 0A9B E5 PUSH HL ; Save address of line start -1741 0A9C EB EX DE,HL ; Line number to HL -1742 0A9D CD A4 1B CALL PRNTHL ; Output line number in decimal -1743 0AA0 3E 20 LD A,' ' ; Space after line number -1744 0AA2 E1 POP HL ; Restore start of line address -1745 0AA3 CD 3C 0A LSTLP2: CALL OUTC ; Output character in A -1746 0AA6 7E LSTLP3: LD A,(HL) ; Get next byte in line -1747 0AA7 B7 OR A ; End of line? -1748 0AA8 23 INC HL ; To next byte in line -1749 0AA9 CA 83 0A JP Z,LISTLP ; Yes - get next line -1750 0AAC F2 A3 0A JP P,LSTLP2 ; No token - output it -1751 0AAF D6 7F SUB ZEND-1 ; Find and output word -1752 0AB1 4F LD C,A ; Token offset+1 to C -1753 0AB2 11 EC 04 LD DE,WORDS ; Reserved word list -1754 0AB5 1A FNDTOK: LD A,(DE) ; Get character in list -1755 0AB6 13 INC DE ; Move on to next -1756 0AB7 B7 OR A ; Is it start of word? -1757 0AB8 F2 B5 0A JP P,FNDTOK ; No - Keep looking for word -1758 0ABB 0D DEC C ; Count words -1759 0ABC C2 B5 0A JP NZ,FNDTOK ; Not there - keep looking -1760 0ABF E6 7F OUTWRD: AND 01111111B ; Strip bit 7 -1761 0AC1 CD 3C 0A CALL OUTC ; Output first character -1762 0AC4 1A LD A,(DE) ; Get next character -1763 0AC5 13 INC DE ; Move on to next -1764 0AC6 B7 OR A ; Is it end of word? -1765 0AC7 F2 BF 0A JP P,OUTWRD ; No - output the rest -1766 0ACA C3 A6 0A JP LSTLP3 ; Next byte in line -1767 0ACD -1768 0ACD E5 SETLIN: PUSH HL ; Set up LINES counter -1769 0ACE 2A F8 30 LD HL,(LINESN) ; Get LINES number -1770 0AD1 22 F6 30 LD (LINESC),HL ; Save in LINES counter -1771 0AD4 E1 POP HL -1772 0AD5 C9 RET -1773 0AD6 -1774 0AD6 E5 COUNT: PUSH HL ; Save code string address -1775 0AD7 D5 PUSH DE -1776 0AD8 2A F6 30 LD HL,(LINESC) ; Get LINES counter -1777 0ADB 11 FF FF LD DE,-1 -1778 0ADE ED 5A ADC HL,DE ; Decrement -1779 0AE0 22 F6 30 LD (LINESC),HL ; Put it back -1780 0AE3 D1 POP DE -1781 0AE4 E1 POP HL ; Restore code string address -1782 0AE5 F0 RET P ; Return if more lines to go -1783 0AE6 E5 PUSH HL ; Save code string address -1784 0AE7 2A F8 30 LD HL,(LINESN) ; Get LINES number -1785 0AEA 22 F6 30 LD (LINESC),HL ; Reset LINES counter -1786 0AED CD C0 1E CALL GETINP ; Get input character -1787 0AF0 FE 03 CP CTRLC ; Is it control "C"? -1788 0AF2 CA F9 0A JP Z,RSLNBK ; Yes - Reset LINES and break -1789 0AF5 E1 POP HL ; Restore code string address -1790 0AF6 C3 D6 0A JP COUNT ; Keep on counting -1791 0AF9 -1792 0AF9 2A F8 30 RSLNBK: LD HL,(LINESN) ; Get LINES number -1793 0AFC 22 F6 30 LD (LINESC),HL ; Reset LINES counter -1794 0AFF C3 5D 04 JP BRKRET ; Go and output "Break" -1795 0B02 -1796 0B02 3E 64 FOR: LD A,64H ; Flag "FOR" assignment -1797 0B04 32 7B 31 LD (FORFLG),A ; Save "FOR" flag -1798 0B07 CD 69 0D CALL LET ; Set up initial index -1799 0B0A C1 POP BC ; Drop RETurn address -1800 0B0B E5 PUSH HL ; Save code string address -1801 0B0C CD 52 0D CALL DATA ; Get next statement address -1802 0B0F 22 77 31 LD (LOOPST),HL ; Save it for start of loop -1803 0B12 21 02 00 LD HL,2 ; Offset for "FOR" block -1804 0B15 39 ADD HL,SP ; Point to it -1805 0B16 CD 10 07 FORSLP: CALL LOKFOR ; Look for existing "FOR" block -1806 0B19 D1 POP DE ; Get code string address -1807 0B1A C2 32 0B JP NZ,FORFND ; No nesting found -1808 0B1D 09 ADD HL,BC ; Move into "FOR" block -1809 0B1E D5 PUSH DE ; Save code string address -1810 0B1F 2B DEC HL -1811 0B20 56 LD D,(HL) ; Get MSB of loop statement -1812 0B21 2B DEC HL -1813 0B22 5E LD E,(HL) ; Get LSB of loop statement -1814 0B23 23 INC HL -1815 0B24 23 INC HL -1816 0B25 E5 PUSH HL ; Save block address -1817 0B26 2A 77 31 LD HL,(LOOPST) ; Get address of loop statement -1818 0B29 CD 2B 0A CALL CPDEHL ; Compare the FOR loops -1819 0B2C E1 POP HL ; Restore block address -1820 0B2D C2 16 0B JP NZ,FORSLP ; Different FORs - Find another -1821 0B30 D1 POP DE ; Restore code string address -1822 0B31 F9 LD SP,HL ; Remove all nested loops -1823 0B32 -1824 0B32 EB FORFND: EX DE,HL ; Code string address to HL -1825 0B33 0E 08 LD C,8 -1826 0B35 CD 40 07 CALL CHKSTK ; Check for 8 levels of stack -1827 0B38 E5 PUSH HL ; Save code string address -1828 0B39 2A 77 31 LD HL,(LOOPST) ; Get first statement of loop -1829 0B3C E3 EX (SP),HL ; Save and restore code string -1830 0B3D E5 PUSH HL ; Re-save code string address -1831 0B3E 2A 0C 31 LD HL,(LINEAT) ; Get current line number -1832 0B41 E3 EX (SP),HL ; Save and restore code string -1833 0B42 CD 2B 10 CALL TSTNUM ; Make sure it's a number -1834 0B45 CD 31 0A CALL CHKSYN ; Make sure "TO" is next -1835 0B48 A6 .BYTE ZTO ; "TO" token -1836 0B49 CD 28 10 CALL GETNUM ; Get "TO" expression value -1837 0B4C E5 PUSH HL ; Save code string address -1838 0B4D CD 56 1A CALL BCDEFP ; Move "TO" value to BCDE -1839 0B50 E1 POP HL ; Restore code string address -1840 0B51 C5 PUSH BC ; Save "TO" value in block -1841 0B52 D5 PUSH DE -1842 0B53 01 00 81 LD BC,8100H ; BCDE - 1 (default STEP) -1843 0B56 51 LD D,C ; C=0 -1844 0B57 5A LD E,D ; D=0 -1845 0B58 7E LD A,(HL) ; Get next byte in code string -1846 0B59 FE AB CP ZSTEP ; See if "STEP" is stated -1847 0B5B 3E 01 LD A,1 ; Sign of step = 1 -1848 0B5D C2 6E 0B JP NZ,SAVSTP ; No STEP given - Default to 1 -1849 0B60 CD BB 0B CALL GETCHR ; Jump over "STEP" token -1850 0B63 CD 28 10 CALL GETNUM ; Get step value -1851 0B66 E5 PUSH HL ; Save code string address -1852 0B67 CD 56 1A CALL BCDEFP ; Move STEP to BCDE -1853 0B6A CD 0A 1A CALL TSTSGN ; Test sign of FPREG -1854 0B6D E1 POP HL ; Restore code string address -1855 0B6E C5 SAVSTP: PUSH BC ; Save the STEP value in block -1856 0B6F D5 PUSH DE -1857 0B70 F5 PUSH AF ; Save sign of STEP -1858 0B71 33 INC SP ; Don't save flags -1859 0B72 E5 PUSH HL ; Save code string address -1860 0B73 2A 7E 31 LD HL,(BRKLIN) ; Get address of index variable -1861 0B76 E3 EX (SP),HL ; Save and restore code string -1862 0B77 06 81 PUTFID: LD B,ZFOR ; "FOR" block marker -1863 0B79 C5 PUSH BC ; Save it -1864 0B7A 33 INC SP ; Don't save C -1865 0B7B -1866 0B7B CD E6 0B RUNCNT: CALL TSTBRK ; Execution driver - Test break -1867 0B7E 22 7E 31 LD (BRKLIN),HL ; Save code address for break -1868 0B81 7E LD A,(HL) ; Get next byte in code string -1869 0B82 FE 3A CP ':' ; Multi statement line? -1870 0B84 CA 9B 0B JP Z,EXCUTE ; Yes - Execute it -1871 0B87 B7 OR A ; End of line? -1872 0B88 C2 63 07 JP NZ,SNERR ; No - Syntax error -1873 0B8B 23 INC HL ; Point to address of next line -1874 0B8C 7E LD A,(HL) ; Get LSB of line pointer -1875 0B8D 23 INC HL -1876 0B8E B6 OR (HL) ; Is it zero (End of prog)? -1877 0B8F CA 0D 0C JP Z,ENDPRG ; Yes - Terminate execution -1878 0B92 23 INC HL ; Point to line number -1879 0B93 5E LD E,(HL) ; Get LSB of line number -1880 0B94 23 INC HL -1881 0B95 56 LD D,(HL) ; Get MSB of line number -1882 0B96 EB EX DE,HL ; Line number to HL -1883 0B97 22 0C 31 LD (LINEAT),HL ; Save as current line number -1884 0B9A EB EX DE,HL ; Line number back to DE -1885 0B9B CD BB 0B EXCUTE: CALL GETCHR ; Get key word -1886 0B9E 11 7B 0B LD DE,RUNCNT ; Where to RETurn to -1887 0BA1 D5 PUSH DE ; Save for RETurn -1888 0BA2 C8 IFJMP: RET Z ; Go to RUNCNT if end of STMT -1889 0BA3 D6 80 ONJMP: SUB ZEND ; Is it a token? -1890 0BA5 DA 69 0D JP C,LET ; No - try to assign it -1891 0BA8 FE 25 CP ZNEW+1-ZEND ; END to NEW ? -1892 0BAA D2 63 07 JP NC,SNERR ; Not a key word - ?SN Error -1893 0BAD 07 RLCA ; Double it -1894 0BAE 4F LD C,A ; BC = Offset into table -1895 0BAF 06 00 LD B,0 -1896 0BB1 EB EX DE,HL ; Save code string address -1897 0BB2 21 0B 06 LD HL,WORDTB ; Keyword address table -1898 0BB5 09 ADD HL,BC ; Point to routine address -1899 0BB6 4E LD C,(HL) ; Get LSB of routine address -1900 0BB7 23 INC HL -1901 0BB8 46 LD B,(HL) ; Get MSB of routine address -1902 0BB9 C5 PUSH BC ; Save routine address -1903 0BBA EB EX DE,HL ; Restore code string address -1904 0BBB -1905 0BBB 23 GETCHR: INC HL ; Point to next character -1906 0BBC 7E LD A,(HL) ; Get next code string byte -1907 0BBD FE 3A CP ':' ; Z if ':' -1908 0BBF D0 RET NC ; NC if > "9" -1909 0BC0 FE 20 CP ' ' -1910 0BC2 CA BB 0B JP Z,GETCHR ; Skip over spaces -1911 0BC5 FE 30 CP '0' -1912 0BC7 3F CCF ; NC if < '0' -1913 0BC8 3C INC A ; Test for zero - Leave carry -1914 0BC9 3D DEC A ; Z if Null -1915 0BCA C9 RET -1916 0BCB -1917 0BCB EB RESTOR: EX DE,HL ; Save code string address -1918 0BCC 2A 0E 31 LD HL,(BASTXT) ; Point to start of program -1919 0BCF CA E0 0B JP Z,RESTNL ; Just RESTORE - reset pointer -1920 0BD2 EB EX DE,HL ; Restore code string address -1921 0BD3 CD 87 0C CALL ATOH ; Get line number to DE -1922 0BD6 E5 PUSH HL ; Save code string address -1923 0BD7 CD 4F 08 CALL SRCHLN ; Search for line number in DE -1924 0BDA 60 LD H,B ; HL = Address of line -1925 0BDB 69 LD L,C -1926 0BDC D1 POP DE ; Restore code string address -1927 0BDD D2 28 0D JP NC,ULERR ; ?UL Error if not found -1928 0BE0 2B RESTNL: DEC HL ; Byte before DATA statement -1929 0BE1 22 8C 31 UPDATA: LD (NXTDAT),HL ; Update DATA pointer -1930 0BE4 EB EX DE,HL ; Restore code string address -1931 0BE5 C9 RET -1932 0BE6 -1933 0BE6 -1934 0BE6 DF TSTBRK: RST 18H ; Check input status -1935 0BE7 C8 RET Z ; No key, go back -1936 0BE8 D7 RST 10H ; Get the key into A -1937 0BE9 FE 1B CP ESC ; Escape key? -1938 0BEB 28 11 JR Z,BRK ; Yes, break -1939 0BED FE 03 CP CTRLC ; -1940 0BEF 28 0D JR Z,BRK ; Yes, break -1941 0BF1 FE 13 CP CTRLS ; Stop scrolling? -1942 0BF3 C0 RET NZ ; Other key, ignore -1943 0BF4 -1944 0BF4 -1945 0BF4 D7 STALL: RST 10H ; Wait for key -1946 0BF5 FE 11 CP CTRLQ ; Resume scrolling? -1947 0BF7 C8 RET Z ; Release the chokehold -1948 0BF8 FE 03 CP CTRLC ; Second break? -1949 0BFA 28 07 JR Z,STOP ; Break during hold exits prog -1950 0BFC 18 F6 JR STALL ; Loop until or -1951 0BFE -1952 0BFE 3E FF BRK LD A,$FF ; Set BRKFLG -1953 0C00 32 FD 30 LD (BRKFLG),A ; Store it -1954 0C03 -1955 0C03 -1956 0C03 C0 STOP: RET NZ ; Exit if anything else -1957 0C04 F6 .BYTE 0F6H ; Flag "STOP" -1958 0C05 C0 PEND: RET NZ ; Exit if anything else -1959 0C06 22 7E 31 LD (BRKLIN),HL ; Save point of break -1960 0C09 21 .BYTE 21H ; Skip "OR 11111111B" -1961 0C0A F6 FF INPBRK: OR 11111111B ; Flag "Break" wanted -1962 0C0C C1 POP BC ; Return not needed and more -1963 0C0D 2A 0C 31 ENDPRG: LD HL,(LINEAT) ; Get current line number -1964 0C10 F5 PUSH AF ; Save STOP / END status -1965 0C11 7D LD A,L ; Is it direct break? -1966 0C12 A4 AND H -1967 0C13 3C INC A ; Line is -1 if direct break -1968 0C14 CA 20 0C JP Z,NOLIN ; Yes - No line number -1969 0C17 22 82 31 LD (ERRLIN),HL ; Save line of break -1970 0C1A 2A 7E 31 LD HL,(BRKLIN) ; Get point of break -1971 0C1D 22 84 31 LD (CONTAD),HL ; Save point to CONTinue -1972 0C20 AF NOLIN: XOR A -1973 0C21 32 F5 30 LD (CTLOFG),A ; Enable output -1974 0C24 CD 56 0E CALL STTLIN ; Start a new line -1975 0C27 F1 POP AF ; Restore STOP / END status -1976 0C28 21 06 07 LD HL,BRKMSG ; "Break" message -1977 0C2B C2 97 07 JP NZ,ERRIN ; "in line" wanted? -1978 0C2E C3 AE 07 JP PRNTOK ; Go to command mode -1979 0C31 -1980 0C31 2A 84 31 CONT: LD HL,(CONTAD) ; Get CONTinue address -1981 0C34 7C LD A,H ; Is it zero? -1982 0C35 B5 OR L -1983 0C36 1E 20 LD E,CN ; ?CN Error -1984 0C38 CA 77 07 JP Z,ERROR ; Yes - output "?CN Error" -1985 0C3B EB EX DE,HL ; Save code string address -1986 0C3C 2A 82 31 LD HL,(ERRLIN) ; Get line of last break -1987 0C3F 22 0C 31 LD (LINEAT),HL ; Set up current line number -1988 0C42 EB EX DE,HL ; Restore code string address -1989 0C43 C9 RET ; CONTinue where left off -1990 0C44 -1991 0C44 CD 89 17 NULL: CALL GETINT ; Get integer 0-255 -1992 0C47 C0 RET NZ ; Return if bad value -1993 0C48 32 F1 30 LD (NULLS),A ; Set nulls number -1994 0C4B C9 RET -1995 0C4C -1996 0C4C -1997 0C4C E5 ACCSUM: PUSH HL ; Save address in array -1998 0C4D 2A FA 30 LD HL,(CHKSUM) ; Get check sum -1999 0C50 06 00 LD B,0 ; BC - Value of byte -2000 0C52 4F LD C,A -2001 0C53 09 ADD HL,BC ; Add byte to check sum -2002 0C54 22 FA 30 LD (CHKSUM),HL ; Re-save check sum -2003 0C57 E1 POP HL ; Restore address in array -2004 0C58 C9 RET -2005 0C59 -2006 0C59 7E CHKLTR: LD A,(HL) ; Get byte -2007 0C5A FE 41 CP 'A' ; < 'a' ? -2008 0C5C D8 RET C ; Carry set if not letter -2009 0C5D FE 5B CP 'Z'+1 ; > 'z' ? -2010 0C5F 3F CCF -2011 0C60 C9 RET ; Carry set if not letter -2012 0C61 -2013 0C61 CD BB 0B FPSINT: CALL GETCHR ; Get next character -2014 0C64 CD 28 10 POSINT: CALL GETNUM ; Get integer 0 to 32767 -2015 0C67 CD 0A 1A DEPINT: CALL TSTSGN ; Test sign of FPREG -2016 0C6A FA 82 0C JP M,FCERR ; Negative - ?FC Error -2017 0C6D 3A 97 31 DEINT: LD A,(FPEXP) ; Get integer value to DE -2018 0C70 FE 90 CP 80H+16 ; Exponent in range (16 bits)? -2019 0C72 DA B2 1A JP C,FPINT ; Yes - convert it -2020 0C75 01 80 90 LD BC,9080H ; BCDE = -32768 -2021 0C78 11 00 00 LD DE,0000 -2022 0C7B E5 PUSH HL ; Save code string address -2023 0C7C CD 85 1A CALL CMPNUM ; Compare FPREG with BCDE -2024 0C7F E1 POP HL ; Restore code string address -2025 0C80 51 LD D,C ; MSB to D -2026 0C81 C8 RET Z ; Return if in range -2027 0C82 1E 08 FCERR: LD E,FC ; ?FC Error -2028 0C84 C3 77 07 JP ERROR ; Output error- -2029 0C87 -2030 0C87 2B ATOH: DEC HL ; ASCII number to DE binary -2031 0C88 11 00 00 GETLN: LD DE,0 ; Get number to DE -2032 0C8B CD BB 0B GTLNLP: CALL GETCHR ; Get next character -2033 0C8E D0 RET NC ; Exit if not a digit -2034 0C8F E5 PUSH HL ; Save code string address -2035 0C90 F5 PUSH AF ; Save digit -2036 0C91 21 98 19 LD HL,65529/10 ; Largest number 65529 -2037 0C94 CD 2B 0A CALL CPDEHL ; Number in range? -2038 0C97 DA 63 07 JP C,SNERR ; No - ?SN Error -2039 0C9A 62 LD H,D ; HL = Number -2040 0C9B 6B LD L,E -2041 0C9C 19 ADD HL,DE ; Times 2 -2042 0C9D 29 ADD HL,HL ; Times 4 -2043 0C9E 19 ADD HL,DE ; Times 5 -2044 0C9F 29 ADD HL,HL ; Times 10 -2045 0CA0 F1 POP AF ; Restore digit -2046 0CA1 D6 30 SUB '0' ; Make it 0 to 9 -2047 0CA3 5F LD E,A ; DE = Value of digit -2048 0CA4 16 00 LD D,0 -2049 0CA6 19 ADD HL,DE ; Add to number -2050 0CA7 EB EX DE,HL ; Number to DE -2051 0CA8 E1 POP HL ; Restore code string address -2052 0CA9 C3 8B 0C JP GTLNLP ; Go to next character -2053 0CAC -2054 0CAC CA 7F 08 CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters -2055 0CAF CD 64 0C CALL POSINT ; Get integer 0 to 32767 to DE -2056 0CB2 2B DEC HL ; Cancel increment -2057 0CB3 CD BB 0B CALL GETCHR ; Get next character -2058 0CB6 E5 PUSH HL ; Save code string address -2059 0CB7 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM -2060 0CBA CA CF 0C JP Z,STORED ; No value given - Use stored -2061 0CBD E1 POP HL ; Restore code string address -2062 0CBE CD 31 0A CALL CHKSYN ; Check for comma -2063 0CC1 2C .BYTE ',' -2064 0CC2 D5 PUSH DE ; Save number -2065 0CC3 CD 64 0C CALL POSINT ; Get integer 0 to 32767 -2066 0CC6 2B DEC HL ; Cancel increment -2067 0CC7 CD BB 0B CALL GETCHR ; Get next character -2068 0CCA C2 63 07 JP NZ,SNERR ; ?SN Error if more on line -2069 0CCD E3 EX (SP),HL ; Save code string address -2070 0CCE EB EX DE,HL ; Number to DE -2071 0CCF 7D STORED: LD A,L ; Get LSB of new RAM top -2072 0CD0 93 SUB E ; Subtract LSB of string space -2073 0CD1 5F LD E,A ; Save LSB -2074 0CD2 7C LD A,H ; Get MSB of new RAM top -2075 0CD3 9A SBC A,D ; Subtract MSB of string space -2076 0CD4 57 LD D,A ; Save MSB -2077 0CD5 DA 58 07 JP C,OMERR ; ?OM Error if not enough mem -2078 0CD8 E5 PUSH HL ; Save RAM top -2079 0CD9 2A 86 31 LD HL,(PROGND) ; Get program end -2080 0CDC 01 28 00 LD BC,40 ; 40 Bytes minimum working RAM -2081 0CDF 09 ADD HL,BC ; Get lowest address -2082 0CE0 CD 2B 0A CALL CPDEHL ; Enough memory? -2083 0CE3 D2 58 07 JP NC,OMERR ; No - ?OM Error -2084 0CE6 EB EX DE,HL ; RAM top to HL -2085 0CE7 22 0A 31 LD (STRSPC),HL ; Set new string space -2086 0CEA E1 POP HL ; End of memory to use -2087 0CEB 22 5F 31 LD (LSTRAM),HL ; Set new top of RAM -2088 0CEE E1 POP HL ; Restore code string address -2089 0CEF C3 7F 08 JP INTVAR ; Initialise variables -2090 0CF2 -2091 0CF2 CA 7B 08 RUN: JP Z,RUNFST ; RUN from start if just RUN -2092 0CF5 CD 7F 08 CALL INTVAR ; Initialise variables -2093 0CF8 01 7B 0B LD BC,RUNCNT ; Execution driver loop -2094 0CFB C3 0E 0D JP RUNLIN ; RUN from line number -2095 0CFE -2096 0CFE 0E 03 GOSUB: LD C,3 ; 3 Levels of stack needed -2097 0D00 CD 40 07 CALL CHKSTK ; Check for 3 levels of stack -2098 0D03 C1 POP BC ; Get return address -2099 0D04 E5 PUSH HL ; Save code string for RETURN -2100 0D05 E5 PUSH HL ; And for GOSUB routine -2101 0D06 2A 0C 31 LD HL,(LINEAT) ; Get current line -2102 0D09 E3 EX (SP),HL ; Into stack - Code string out -2103 0D0A 3E 8C LD A,ZGOSUB ; "GOSUB" token -2104 0D0C F5 PUSH AF ; Save token -2105 0D0D 33 INC SP ; Don't save flags -2106 0D0E -2107 0D0E C5 RUNLIN: PUSH BC ; Save return address -2108 0D0F CD 87 0C GOTO: CALL ATOH ; ASCII number to DE binary -2109 0D12 CD 54 0D CALL REM ; Get end of line -2110 0D15 E5 PUSH HL ; Save end of line -2111 0D16 2A 0C 31 LD HL,(LINEAT) ; Get current line -2112 0D19 CD 2B 0A CALL CPDEHL ; Line after current? -2113 0D1C E1 POP HL ; Restore end of line -2114 0D1D 23 INC HL ; Start of next line -2115 0D1E DC 52 08 CALL C,SRCHLP ; Line is after current line -2116 0D21 D4 4F 08 CALL NC,SRCHLN ; Line is before current line -2117 0D24 60 LD H,B ; Set up code string address -2118 0D25 69 LD L,C -2119 0D26 2B DEC HL ; Incremented after -2120 0D27 D8 RET C ; Line found -2121 0D28 1E 0E ULERR: LD E,UL ; ?UL Error -2122 0D2A C3 77 07 JP ERROR ; Output error message -2123 0D2D -2124 0D2D C0 RETURN: RET NZ ; Return if not just RETURN -2125 0D2E 16 FF LD D,-1 ; Flag "GOSUB" search -2126 0D30 CD 0C 07 CALL BAKSTK ; Look "GOSUB" block -2127 0D33 F9 LD SP,HL ; Kill all FORs in subroutine -2128 0D34 FE 8C CP ZGOSUB ; Test for "GOSUB" token -2129 0D36 1E 04 LD E,RG ; ?RG Error -2130 0D38 C2 77 07 JP NZ,ERROR ; Error if no "GOSUB" found -2131 0D3B E1 POP HL ; Get RETURN line number -2132 0D3C 22 0C 31 LD (LINEAT),HL ; Save as current -2133 0D3F 23 INC HL ; Was it from direct statement? -2134 0D40 7C LD A,H -2135 0D41 B5 OR L ; Return to line -2136 0D42 C2 4C 0D JP NZ,RETLIN ; No - Return to line -2137 0D45 3A 7C 31 LD A,(LSTBIN) ; Any INPUT in subroutine? -2138 0D48 B7 OR A ; If so buffer is corrupted -2139 0D49 C2 AD 07 JP NZ,POPNOK ; Yes - Go to command mode -2140 0D4C 21 7B 0B RETLIN: LD HL,RUNCNT ; Execution driver loop -2141 0D4F E3 EX (SP),HL ; Into stack - Code string out -2142 0D50 3E .BYTE 3EH ; Skip "POP HL" -2143 0D51 E1 NXTDTA: POP HL ; Restore code string address -2144 0D52 -2145 0D52 01 3A DATA: .BYTE 01H,3AH ; ':' End of statement -2146 0D54 0E 00 REM: LD C,0 ; 00 End of statement -2147 0D56 06 00 LD B,0 -2148 0D58 79 NXTSTL: LD A,C ; Statement and byte -2149 0D59 48 LD C,B -2150 0D5A 47 LD B,A ; Statement end byte -2151 0D5B 7E NXTSTT: LD A,(HL) ; Get byte -2152 0D5C B7 OR A ; End of line? -2153 0D5D C8 RET Z ; Yes - Exit -2154 0D5E B8 CP B ; End of statement? -2155 0D5F C8 RET Z ; Yes - Exit -2156 0D60 23 INC HL ; Next byte -2157 0D61 FE 22 CP '"' ; Literal string? -2158 0D63 CA 58 0D JP Z,NXTSTL ; Yes - Look for another '"' -2159 0D66 C3 5B 0D JP NXTSTT ; Keep looking -2160 0D69 -2161 0D69 CD 1E 12 LET: CALL GETVAR ; Get variable name -2162 0D6C CD 31 0A CALL CHKSYN ; Make sure "=" follows -2163 0D6F B4 .BYTE ZEQUAL ; "=" token -2164 0D70 D5 PUSH DE ; Save address of variable -2165 0D71 3A 5D 31 LD A,(TYPE) ; Get data type -2166 0D74 F5 PUSH AF ; Save type -2167 0D75 CD 3A 10 CALL EVAL ; Evaluate expression -2168 0D78 F1 POP AF ; Restore type -2169 0D79 E3 EX (SP),HL ; Save code - Get var addr -2170 0D7A 22 7E 31 LD (BRKLIN),HL ; Save address of variable -2171 0D7D 1F RRA ; Adjust type -2172 0D7E CD 2D 10 CALL CHKTYP ; Check types are the same -2173 0D81 CA BC 0D JP Z,LETNUM ; Numeric - Move value -2174 0D84 E5 LETSTR: PUSH HL ; Save address of string var -2175 0D85 2A 94 31 LD HL,(FPREG) ; Pointer to string entry -2176 0D88 E5 PUSH HL ; Save it on stack -2177 0D89 23 INC HL ; Skip over length -2178 0D8A 23 INC HL -2179 0D8B 5E LD E,(HL) ; LSB of string address -2180 0D8C 23 INC HL -2181 0D8D 56 LD D,(HL) ; MSB of string address -2182 0D8E 2A 0E 31 LD HL,(BASTXT) ; Point to start of program -2183 0D91 CD 2B 0A CALL CPDEHL ; Is string before program? -2184 0D94 D2 AB 0D JP NC,CRESTR ; Yes - Create string entry -2185 0D97 2A 0A 31 LD HL,(STRSPC) ; Point to string space -2186 0D9A CD 2B 0A CALL CPDEHL ; Is string literal in program? -2187 0D9D D1 POP DE ; Restore address of string -2188 0D9E D2 B3 0D JP NC,MVSTPT ; Yes - Set up pointer -2189 0DA1 21 6F 31 LD HL,TMPSTR ; Temporary string pool -2190 0DA4 CD 2B 0A CALL CPDEHL ; Is string in temporary pool? -2191 0DA7 D2 B3 0D JP NC,MVSTPT ; No - Set up pointer -2192 0DAA 3E .BYTE 3EH ; Skip "POP DE" -2193 0DAB D1 CRESTR: POP DE ; Restore address of string -2194 0DAC CD 62 16 CALL BAKTMP ; Back to last tmp-str entry -2195 0DAF EB EX DE,HL ; Address of string entry -2196 0DB0 CD 9B 14 CALL SAVSTR ; Save string in string area -2197 0DB3 CD 62 16 MVSTPT: CALL BAKTMP ; Back to last tmp-str entry -2198 0DB6 E1 POP HL ; Get string pointer -2199 0DB7 CD 65 1A CALL DETHL4 ; Move string pointer to var -2200 0DBA E1 POP HL ; Restore code string address -2201 0DBB C9 RET -2202 0DBC -2203 0DBC E5 LETNUM: PUSH HL ; Save address of variable -2204 0DBD CD 62 1A CALL FPTHL ; Move value to variable -2205 0DC0 D1 POP DE ; Restore address of variable -2206 0DC1 E1 POP HL ; Restore code string address -2207 0DC2 C9 RET -2208 0DC3 -2209 0DC3 CD 89 17 ON: CALL GETINT ; Get integer 0-255 -2210 0DC6 7E LD A,(HL) ; Get "GOTO" or "GOSUB" token -2211 0DC7 47 LD B,A ; Save in B -2212 0DC8 FE 8C CP ZGOSUB ; "GOSUB" token? -2213 0DCA CA D2 0D JP Z,ONGO ; Yes - Find line number -2214 0DCD CD 31 0A CALL CHKSYN ; Make sure it's "GOTO" -2215 0DD0 88 .BYTE ZGOTO ; "GOTO" token -2216 0DD1 2B DEC HL ; Cancel increment -2217 0DD2 4B ONGO: LD C,E ; Integer of branch value -2218 0DD3 0D ONGOLP: DEC C ; Count branches -2219 0DD4 78 LD A,B ; Get "GOTO" or "GOSUB" token -2220 0DD5 CA A3 0B JP Z,ONJMP ; Go to that line if right one -2221 0DD8 CD 88 0C CALL GETLN ; Get line number to DE -2222 0DDB FE 2C CP ',' ; Another line number? -2223 0DDD C0 RET NZ ; No - Drop through -2224 0DDE C3 D3 0D JP ONGOLP ; Yes - loop -2225 0DE1 -2226 0DE1 CD 3A 10 IF: CALL EVAL ; Evaluate expression -2227 0DE4 7E LD A,(HL) ; Get token -2228 0DE5 FE 88 CP ZGOTO ; "GOTO" token? -2229 0DE7 CA EF 0D JP Z,IFGO ; Yes - Get line -2230 0DEA CD 31 0A CALL CHKSYN ; Make sure it's "THEN" -2231 0DED A9 .BYTE ZTHEN ; "THEN" token -2232 0DEE 2B DEC HL ; Cancel increment -2233 0DEF CD 2B 10 IFGO: CALL TSTNUM ; Make sure it's numeric -2234 0DF2 CD 0A 1A CALL TSTSGN ; Test state of expression -2235 0DF5 CA 54 0D JP Z,REM ; False - Drop through -2236 0DF8 CD BB 0B CALL GETCHR ; Get next character -2237 0DFB DA 0F 0D JP C,GOTO ; Number - GOTO that line -2238 0DFE C3 A2 0B JP IFJMP ; Otherwise do statement -2239 0E01 -2240 0E01 2B MRPRNT: DEC HL ; DEC 'cos GETCHR INCs -2241 0E02 CD BB 0B CALL GETCHR ; Get next character -2242 0E05 CA 63 0E PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT -2243 0E08 C8 PRNTLP: RET Z ; End of list - Exit -2244 0E09 FE A5 CP ZTAB ; "TAB(" token? -2245 0E0B CA 96 0E JP Z,DOTAB ; Yes - Do TAB routine -2246 0E0E FE A8 CP ZSPC ; "SPC(" token? -2247 0E10 CA 96 0E JP Z,DOTAB ; Yes - Do SPC routine -2248 0E13 E5 PUSH HL ; Save code string address -2249 0E14 FE 2C CP ',' ; Comma? -2250 0E16 CA 7F 0E JP Z,DOCOM ; Yes - Move to next zone -2251 0E19 FE 3B CP 59 ;";" ; Semi-colon? -2252 0E1B CA B9 0E JP Z,NEXITM ; Do semi-colon routine -2253 0E1E C1 POP BC ; Code string address to BC -2254 0E1F CD 3A 10 CALL EVAL ; Evaluate expression -2255 0E22 E5 PUSH HL ; Save code string address -2256 0E23 3A 5D 31 LD A,(TYPE) ; Get variable type -2257 0E26 B7 OR A ; Is it a string variable? -2258 0E27 C2 4F 0E JP NZ,PRNTST ; Yes - Output string contents -2259 0E2A CD AF 1B CALL NUMASC ; Convert number to text -2260 0E2D CD BF 14 CALL CRTST ; Create temporary string -2261 0E30 36 20 LD (HL),' ' ; Followed by a space -2262 0E32 2A 94 31 LD HL,(FPREG) ; Get length of output -2263 0E35 34 INC (HL) ; Plus 1 for the space -2264 0E36 2A 94 31 LD HL,(FPREG) ; < Not needed > -2265 0E39 3A F2 30 LD A,(LWIDTH) ; Get width of line -2266 0E3C 47 LD B,A ; To B -2267 0E3D 04 INC B ; Width 255 (No limit)? -2268 0E3E CA 4B 0E JP Z,PRNTNB ; Yes - Output number string -2269 0E41 04 INC B ; Adjust it -2270 0E42 3A 5B 31 LD A,(CURPOS) ; Get cursor position -2271 0E45 86 ADD A,(HL) ; Add length of string -2272 0E46 3D DEC A ; Adjust it -2273 0E47 B8 CP B ; Will output fit on this line? -2274 0E48 D4 63 0E CALL NC,PRNTCRLF ; No - CRLF first -2275 0E4B CD 04 15 PRNTNB: CALL PRS1 ; Output string at (HL) -2276 0E4E AF XOR A ; Skip CALL by setting 'z' flag -2277 0E4F C4 04 15 PRNTST: CALL NZ,PRS1 ; Output string at (HL) -2278 0E52 E1 POP HL ; Restore code string address -2279 0E53 C3 01 0E JP MRPRNT ; See if more to PRINT -2280 0E56 -2281 0E56 3A 5B 31 STTLIN: LD A,(CURPOS) ; Make sure on new line -2282 0E59 B7 OR A ; Already at start? -2283 0E5A C8 RET Z ; Yes - Do nothing -2284 0E5B C3 63 0E JP PRNTCRLF ; Start a new line -2285 0E5E -2286 0E5E 36 00 ENDINP: LD (HL),0 ; Mark end of buffer -2287 0E60 21 10 31 LD HL,BUFFER-1 ; Point to buffer -2288 0E63 3E 0D PRNTCRLF: LD A,CR ; Load a CR -2289 0E65 CD 3C 0A CALL OUTC ; Output character -2290 0E68 3E 0A LD A,LF ; Load a LF -2291 0E6A CD 3C 0A CALL OUTC ; Output character -2292 0E6D AF DONULL: XOR A ; Set to position 0 -2293 0E6E 32 5B 31 LD (CURPOS),A ; Store it -2294 0E71 3A F1 30 LD A,(NULLS) ; Get number of nulls -2295 0E74 3D NULLP: DEC A ; Count them -2296 0E75 C8 RET Z ; Return if done -2297 0E76 F5 PUSH AF ; Save count -2298 0E77 AF XOR A ; Load a null -2299 0E78 CD 3C 0A CALL OUTC ; Output it -2300 0E7B F1 POP AF ; Restore count -2301 0E7C C3 74 0E JP NULLP ; Keep counting -2302 0E7F -2303 0E7F 3A F3 30 DOCOM: LD A,(COMMAN) ; Get comma width -2304 0E82 47 LD B,A ; Save in B -2305 0E83 3A 5B 31 LD A,(CURPOS) ; Get current position -2306 0E86 B8 CP B ; Within the limit? -2307 0E87 D4 63 0E CALL NC,PRNTCRLF ; No - output CRLF -2308 0E8A D2 B9 0E JP NC,NEXITM ; Get next item -2309 0E8D D6 0E ZONELP: SUB 14 ; Next zone of 14 characters -2310 0E8F D2 8D 0E JP NC,ZONELP ; Repeat if more zones -2311 0E92 2F CPL ; Number of spaces to output -2312 0E93 C3 AE 0E JP ASPCS ; Output them -2313 0E96 -2314 0E96 F5 DOTAB: PUSH AF ; Save token -2315 0E97 CD 86 17 CALL FNDNUM ; Evaluate expression -2316 0E9A CD 31 0A CALL CHKSYN ; Make sure ")" follows -2317 0E9D 29 .BYTE ")" -2318 0E9E 2B DEC HL ; Back space on to ")" -2319 0E9F F1 POP AF ; Restore token -2320 0EA0 D6 A8 SUB ZSPC ; Was it "SPC(" ? -2321 0EA2 E5 PUSH HL ; Save code string address -2322 0EA3 CA A9 0E JP Z,DOSPC ; Yes - Do 'E' spaces -2323 0EA6 3A 5B 31 LD A,(CURPOS) ; Get current position -2324 0EA9 2F DOSPC: CPL ; Number of spaces to print to -2325 0EAA 83 ADD A,E ; Total number to print -2326 0EAB D2 B9 0E JP NC,NEXITM ; TAB < Current POS(X) -2327 0EAE 3C ASPCS: INC A ; Output A spaces -2328 0EAF 47 LD B,A ; Save number to print -2329 0EB0 3E 20 LD A,' ' ; Space -2330 0EB2 CD 3C 0A SPCLP: CALL OUTC ; Output character in A -2331 0EB5 05 DEC B ; Count them -2332 0EB6 C2 B2 0E JP NZ,SPCLP ; Repeat if more -2333 0EB9 E1 NEXITM: POP HL ; Restore code string address -2334 0EBA CD BB 0B CALL GETCHR ; Get next character -2335 0EBD C3 08 0E JP PRNTLP ; More to print -2336 0EC0 -2337 0EC0 3F 52 65 64 REDO: .BYTE "?Redo from start",CR,LF,0 -2337 0EC4 6F 20 66 72 -2337 0EC8 6F 6D 20 73 -2337 0ECC 74 61 72 74 -2337 0ED0 0D 0A 00 -2338 0ED3 -2339 0ED3 3A 7D 31 BADINP: LD A,(READFG) ; READ or INPUT? -2340 0ED6 B7 OR A -2341 0ED7 C2 5D 07 JP NZ,DATSNR ; READ - ?SN Error -2342 0EDA C1 POP BC ; Throw away code string addr -2343 0EDB 21 C0 0E LD HL,REDO ; "Redo from start" message -2344 0EDE CD 01 15 CALL PRS ; Output string -2345 0EE1 C3 AE 08 JP DOAGN ; Do last INPUT again -2346 0EE4 -2347 0EE4 CD 6C 14 INPUT: CALL IDTEST ; Test for illegal direct -2348 0EE7 7E LD A,(HL) ; Get character after "INPUT" -2349 0EE8 FE 22 CP '"' ; Is there a prompt string? -2350 0EEA 3E 00 LD A,0 ; Clear A and leave flags -2351 0EEC 32 F5 30 LD (CTLOFG),A ; Enable output -2352 0EEF C2 FE 0E JP NZ,NOPMPT ; No prompt - get input -2353 0EF2 CD C0 14 CALL QTSTR ; Get string terminated by '"' -2354 0EF5 CD 31 0A CALL CHKSYN ; Check for ';' after prompt -2355 0EF8 3B .BYTE ';' -2356 0EF9 E5 PUSH HL ; Save code string address -2357 0EFA CD 04 15 CALL PRS1 ; Output prompt string -2358 0EFD 3E .BYTE 3EH ; Skip "PUSH HL" -2359 0EFE E5 NOPMPT: PUSH HL ; Save code string address -2360 0EFF CD B2 08 CALL PROMPT ; Get input with "? " prompt -2361 0F02 C1 POP BC ; Restore code string address -2362 0F03 DA 0A 0C JP C,INPBRK ; Break pressed - Exit -2363 0F06 23 INC HL ; Next byte -2364 0F07 7E LD A,(HL) ; Get it -2365 0F08 B7 OR A ; End of line? -2366 0F09 2B DEC HL ; Back again -2367 0F0A C5 PUSH BC ; Re-save code string address -2368 0F0B CA 51 0D JP Z,NXTDTA ; Yes - Find next DATA stmt -2369 0F0E 36 2C LD (HL),',' ; Store comma as separator -2370 0F10 C3 18 0F JP NXTITM ; Get next item -2371 0F13 -2372 0F13 E5 READ: PUSH HL ; Save code string address -2373 0F14 2A 8C 31 LD HL,(NXTDAT) ; Next DATA statement -2374 0F17 F6 .BYTE 0F6H ; Flag "READ" -2375 0F18 AF NXTITM: XOR A ; Flag "INPUT" -2376 0F19 32 7D 31 LD (READFG),A ; Save "READ"/"INPUT" flag -2377 0F1C E3 EX (SP),HL ; Get code str' , Save pointer -2378 0F1D C3 24 0F JP GTVLUS ; Get values -2379 0F20 -2380 0F20 CD 31 0A NEDMOR: CALL CHKSYN ; Check for comma between items -2381 0F23 2C .BYTE ',' -2382 0F24 CD 1E 12 GTVLUS: CALL GETVAR ; Get variable name -2383 0F27 E3 EX (SP),HL ; Save code str" , Get pointer -2384 0F28 D5 PUSH DE ; Save variable address -2385 0F29 7E LD A,(HL) ; Get next "INPUT"/"DATA" byte -2386 0F2A FE 2C CP ',' ; Comma? -2387 0F2C CA 4C 0F JP Z,ANTVLU ; Yes - Get another value -2388 0F2F 3A 7D 31 LD A,(READFG) ; Is it READ? -2389 0F32 B7 OR A -2390 0F33 C2 B9 0F JP NZ,FDTLP ; Yes - Find next DATA stmt -2391 0F36 3E 3F LD A,'?' ; More INPUT needed -2392 0F38 CD 3C 0A CALL OUTC ; Output character -2393 0F3B CD B2 08 CALL PROMPT ; Get INPUT with prompt -2394 0F3E D1 POP DE ; Variable address -2395 0F3F C1 POP BC ; Code string address -2396 0F40 DA 0A 0C JP C,INPBRK ; Break pressed -2397 0F43 23 INC HL ; Point to next DATA byte -2398 0F44 7E LD A,(HL) ; Get byte -2399 0F45 B7 OR A ; Is it zero (No input) ? -2400 0F46 2B DEC HL ; Back space INPUT pointer -2401 0F47 C5 PUSH BC ; Save code string address -2402 0F48 CA 51 0D JP Z,NXTDTA ; Find end of buffer -2403 0F4B D5 PUSH DE ; Save variable address -2404 0F4C 3A 5D 31 ANTVLU: LD A,(TYPE) ; Check data type -2405 0F4F B7 OR A ; Is it numeric? -2406 0F50 CA 76 0F JP Z,INPBIN ; Yes - Convert to binary -2407 0F53 CD BB 0B CALL GETCHR ; Get next character -2408 0F56 57 LD D,A ; Save input character -2409 0F57 47 LD B,A ; Again -2410 0F58 FE 22 CP '"' ; Start of literal sting? -2411 0F5A CA 6A 0F JP Z,STRENT ; Yes - Create string entry -2412 0F5D 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? -2413 0F60 B7 OR A -2414 0F61 57 LD D,A ; Save 00 if "INPUT" -2415 0F62 CA 67 0F JP Z,ITMSEP ; "INPUT" - End with 00 -2416 0F65 16 3A LD D,':' ; "DATA" - End with 00 or ':' -2417 0F67 06 2C ITMSEP: LD B,',' ; Item separator -2418 0F69 2B DEC HL ; Back space for DTSTR -2419 0F6A CD C3 14 STRENT: CALL DTSTR ; Get string terminated by D -2420 0F6D EB EX DE,HL ; String address to DE -2421 0F6E 21 81 0F LD HL,LTSTND ; Where to go after LETSTR -2422 0F71 E3 EX (SP),HL ; Save HL , get input pointer -2423 0F72 D5 PUSH DE ; Save address of string -2424 0F73 C3 84 0D JP LETSTR ; Assign string to variable -2425 0F76 -2426 0F76 CD BB 0B INPBIN: CALL GETCHR ; Get next character -2427 0F79 CD 11 1B CALL ASCTFP ; Convert ASCII to FP number -2428 0F7C E3 EX (SP),HL ; Save input ptr, Get var addr -2429 0F7D CD 62 1A CALL FPTHL ; Move FPREG to variable -2430 0F80 E1 POP HL ; Restore input pointer -2431 0F81 2B LTSTND: DEC HL ; DEC 'cos GETCHR INCs -2432 0F82 CD BB 0B CALL GETCHR ; Get next character -2433 0F85 CA 8D 0F JP Z,MORDT ; End of line - More needed? -2434 0F88 FE 2C CP ',' ; Another value? -2435 0F8A C2 D3 0E JP NZ,BADINP ; No - Bad input -2436 0F8D E3 MORDT: EX (SP),HL ; Get code string address -2437 0F8E 2B DEC HL ; DEC 'cos GETCHR INCs -2438 0F8F CD BB 0B CALL GETCHR ; Get next character -2439 0F92 C2 20 0F JP NZ,NEDMOR ; More needed - Get it -2440 0F95 D1 POP DE ; Restore DATA pointer -2441 0F96 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? -2442 0F99 B7 OR A -2443 0F9A EB EX DE,HL ; DATA pointer to HL -2444 0F9B C2 E1 0B JP NZ,UPDATA ; Update DATA pointer if "READ" -2445 0F9E D5 PUSH DE ; Save code string address -2446 0F9F B6 OR (HL) ; More input given? -2447 0FA0 21 A8 0F LD HL,EXTIG ; "?Extra ignored" message -2448 0FA3 C4 01 15 CALL NZ,PRS ; Output string if extra given -2449 0FA6 E1 POP HL ; Restore code string address -2450 0FA7 C9 RET -2451 0FA8 -2452 0FA8 3F 45 78 74 EXTIG: .BYTE "?Extra ignored",CR,LF,0 -2452 0FAC 72 61 20 69 -2452 0FB0 67 6E 6F 72 -2452 0FB4 65 64 0D 0A -2452 0FB8 00 -2453 0FB9 -2454 0FB9 CD 52 0D FDTLP: CALL DATA ; Get next statement -2455 0FBC B7 OR A ; End of line? -2456 0FBD C2 D2 0F JP NZ,FANDT ; No - See if DATA statement -2457 0FC0 23 INC HL -2458 0FC1 7E LD A,(HL) ; End of program? -2459 0FC2 23 INC HL -2460 0FC3 B6 OR (HL) ; 00 00 Ends program -2461 0FC4 1E 06 LD E,OD ; ?OD Error -2462 0FC6 CA 77 07 JP Z,ERROR ; Yes - Out of DATA -2463 0FC9 23 INC HL -2464 0FCA 5E LD E,(HL) ; LSB of line number -2465 0FCB 23 INC HL -2466 0FCC 56 LD D,(HL) ; MSB of line number -2467 0FCD EB EX DE,HL -2468 0FCE 22 79 31 LD (DATLIN),HL ; Set line of current DATA item -2469 0FD1 EB EX DE,HL -2470 0FD2 CD BB 0B FANDT: CALL GETCHR ; Get next character -2471 0FD5 FE 83 CP ZDATA ; "DATA" token -2472 0FD7 C2 B9 0F JP NZ,FDTLP ; No "DATA" - Keep looking -2473 0FDA C3 4C 0F JP ANTVLU ; Found - Convert input -2474 0FDD -2475 0FDD 11 00 00 NEXT: LD DE,0 ; In case no index given -2476 0FE0 C4 1E 12 NEXT1: CALL NZ,GETVAR ; Get index address -2477 0FE3 22 7E 31 LD (BRKLIN),HL ; Save code string address -2478 0FE6 CD 0C 07 CALL BAKSTK ; Look for "FOR" block -2479 0FE9 C2 69 07 JP NZ,NFERR ; No "FOR" - ?NF Error -2480 0FEC F9 LD SP,HL ; Clear nested loops -2481 0FED D5 PUSH DE ; Save index address -2482 0FEE 7E LD A,(HL) ; Get sign of STEP -2483 0FEF 23 INC HL -2484 0FF0 F5 PUSH AF ; Save sign of STEP -2485 0FF1 D5 PUSH DE ; Save index address -2486 0FF2 CD 48 1A CALL PHLTFP ; Move index value to FPREG -2487 0FF5 E3 EX (SP),HL ; Save address of TO value -2488 0FF6 E5 PUSH HL ; Save address of index -2489 0FF7 CD B5 17 CALL ADDPHL ; Add STEP to index value -2490 0FFA E1 POP HL ; Restore address of index -2491 0FFB CD 62 1A CALL FPTHL ; Move value to index variable -2492 0FFE E1 POP HL ; Restore address of TO value -2493 0FFF CD 59 1A CALL LOADFP ; Move TO value to BCDE -2494 1002 E5 PUSH HL ; Save address of line of FOR -2495 1003 CD 85 1A CALL CMPNUM ; Compare index with TO value -2496 1006 E1 POP HL ; Restore address of line num -2497 1007 C1 POP BC ; Address of sign of STEP -2498 1008 90 SUB B ; Compare with expected sign -2499 1009 CD 59 1A CALL LOADFP ; BC = Loop stmt,DE = Line num -2500 100C CA 18 10 JP Z,KILFOR ; Loop finished - Terminate it -2501 100F EB EX DE,HL ; Loop statement line number -2502 1010 22 0C 31 LD (LINEAT),HL ; Set loop line number -2503 1013 69 LD L,C ; Set code string to loop -2504 1014 60 LD H,B -2505 1015 C3 77 0B JP PUTFID ; Put back "FOR" and continue -2506 1018 -2507 1018 F9 KILFOR: LD SP,HL ; Remove "FOR" block -2508 1019 2A 7E 31 LD HL,(BRKLIN) ; Code string after "NEXT" -2509 101C 7E LD A,(HL) ; Get next byte in code string -2510 101D FE 2C CP ',' ; More NEXTs ? -2511 101F C2 7B 0B JP NZ,RUNCNT ; No - Do next statement -2512 1022 CD BB 0B CALL GETCHR ; Position to index name -2513 1025 CD E0 0F CALL NEXT1 ; Re-enter NEXT routine -2514 1028 ; < will not RETurn to here , Exit to RUNCNT or Loop > -2515 1028 -2516 1028 CD 3A 10 GETNUM: CALL EVAL ; Get a numeric expression -2517 102B F6 TSTNUM: .BYTE 0F6H ; Clear carry (numeric) -2518 102C 37 TSTSTR: SCF ; Set carry (string) -2519 102D 3A 5D 31 CHKTYP: LD A,(TYPE) ; Check types match -2520 1030 8F ADC A,A ; Expected + actual -2521 1031 B7 OR A ; Clear carry , set parity -2522 1032 E8 RET PE ; Even parity - Types match -2523 1033 C3 75 07 JP TMERR ; Different types - Error -2524 1036 -2525 1036 CD 31 0A OPNPAR: CALL CHKSYN ; Make sure "(" follows -2526 1039 28 .BYTE "(" -2527 103A 2B EVAL: DEC HL ; Evaluate expression & save -2528 103B 16 00 LD D,0 ; Precedence value -2529 103D D5 EVAL1: PUSH DE ; Save precedence -2530 103E 0E 01 LD C,1 -2531 1040 CD 40 07 CALL CHKSTK ; Check for 1 level of stack -2532 1043 CD B1 10 CALL OPRND ; Get next expression value -2533 1046 22 80 31 EVAL2: LD (NXTOPR),HL ; Save address of next operator -2534 1049 2A 80 31 EVAL3: LD HL,(NXTOPR) ; Restore address of next opr -2535 104C C1 POP BC ; Precedence value and operator -2536 104D 78 LD A,B ; Get precedence value -2537 104E FE 78 CP 78H ; "AND" or "OR" ? -2538 1050 D4 2B 10 CALL NC,TSTNUM ; No - Make sure it's a number -2539 1053 7E LD A,(HL) ; Get next operator / function -2540 1054 16 00 LD D,0 ; Clear Last relation -2541 1056 D6 B3 RLTLP: SUB ZGTR ; ">" Token -2542 1058 DA 72 10 JP C,FOPRND ; + - * / ^ AND OR - Test it -2543 105B FE 03 CP ZLTH+1-ZGTR ; < = > -2544 105D D2 72 10 JP NC,FOPRND ; Function - Call it -2545 1060 FE 01 CP ZEQUAL-ZGTR ; "=" -2546 1062 17 RLA ; <- Test for legal -2547 1063 AA XOR D ; <- combinations of < = > -2548 1064 BA CP D ; <- by combining last token -2549 1065 57 LD D,A ; <- with current one -2550 1066 DA 63 07 JP C,SNERR ; Error if "<<' '==" or ">>" -2551 1069 22 75 31 LD (CUROPR),HL ; Save address of current token -2552 106C CD BB 0B CALL GETCHR ; Get next character -2553 106F C3 56 10 JP RLTLP ; Treat the two as one -2554 1072 -2555 1072 7A FOPRND: LD A,D ; < = > found ? -2556 1073 B7 OR A -2557 1074 C2 99 11 JP NZ,TSTRED ; Yes - Test for reduction -2558 1077 7E LD A,(HL) ; Get operator token -2559 1078 22 75 31 LD (CUROPR),HL ; Save operator address -2560 107B D6 AC SUB ZPLUS ; Operator or function? -2561 107D D8 RET C ; Neither - Exit -2562 107E FE 07 CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ? -2563 1080 D0 RET NC ; No - Exit -2564 1081 5F LD E,A ; Coded operator -2565 1082 3A 5D 31 LD A,(TYPE) ; Get data type -2566 1085 3D DEC A ; FF = numeric , 00 = string -2567 1086 B3 OR E ; Combine with coded operator -2568 1087 7B LD A,E ; Get coded operator -2569 1088 CA F7 15 JP Z,CONCAT ; String concatenation -2570 108B 07 RLCA ; Times 2 -2571 108C 83 ADD A,E ; Times 3 -2572 108D 5F LD E,A ; To DE (D is 0) -2573 108E 21 55 06 LD HL,PRITAB ; Precedence table -2574 1091 19 ADD HL,DE ; To the operator concerned -2575 1092 78 LD A,B ; Last operator precedence -2576 1093 56 LD D,(HL) ; Get evaluation precedence -2577 1094 BA CP D ; Compare with eval precedence -2578 1095 D0 RET NC ; Exit if higher precedence -2579 1096 23 INC HL ; Point to routine address -2580 1097 CD 2B 10 CALL TSTNUM ; Make sure it's a number -2581 109A -2582 109A C5 STKTHS: PUSH BC ; Save last precedence & token -2583 109B 01 49 10 LD BC,EVAL3 ; Where to go on prec' break -2584 109E C5 PUSH BC ; Save on stack for return -2585 109F 43 LD B,E ; Save operator -2586 10A0 4A LD C,D ; Save precedence -2587 10A1 CD 3B 1A CALL STAKFP ; Move value to stack -2588 10A4 58 LD E,B ; Restore operator -2589 10A5 51 LD D,C ; Restore precedence -2590 10A6 4E LD C,(HL) ; Get LSB of routine address -2591 10A7 23 INC HL -2592 10A8 46 LD B,(HL) ; Get MSB of routine address -2593 10A9 23 INC HL -2594 10AA C5 PUSH BC ; Save routine address -2595 10AB 2A 75 31 LD HL,(CUROPR) ; Address of current operator -2596 10AE C3 3D 10 JP EVAL1 ; Loop until prec' break -2597 10B1 -2598 10B1 AF OPRND: XOR A ; Get operand routine -2599 10B2 32 5D 31 LD (TYPE),A ; Set numeric expected -2600 10B5 CD BB 0B CALL GETCHR ; Get next character -2601 10B8 1E 24 LD E,MO ; ?MO Error -2602 10BA CA 77 07 JP Z,ERROR ; No operand - Error -2603 10BD DA 11 1B JP C,ASCTFP ; Number - Get value -2604 10C0 CD 59 0C CALL CHKLTR ; See if a letter -2605 10C3 D2 18 11 JP NC,CONVAR ; Letter - Find variable -2606 10C6 FE 26 CP '&' ; &H = HEX, &B = BINARY -2607 10C8 20 12 JR NZ, NOTAMP -2608 10CA CD BB 0B CALL GETCHR ; Get next character -2609 10CD FE 48 CP 'H' ; Hex number indicated? [function added] -2610 10CF CA 55 1F JP Z,HEXTFP ; Convert Hex to FPREG -2611 10D2 FE 42 CP 'B' ; Binary number indicated? [function added] -2612 10D4 CA C5 1F JP Z,BINTFP ; Convert Bin to FPREG -2613 10D7 1E 02 LD E,SN ; If neither then a ?SN Error -2614 10D9 CA 77 07 JP Z,ERROR ; -2615 10DC FE AC NOTAMP: CP ZPLUS ; '+' Token ? -2616 10DE CA B1 10 JP Z,OPRND ; Yes - Look for operand -2617 10E1 FE 2E CP '.' ; '.' ? -2618 10E3 CA 11 1B JP Z,ASCTFP ; Yes - Create FP number -2619 10E6 FE AD CP ZMINUS ; '-' Token ? -2620 10E8 CA 07 11 JP Z,MINUS ; Yes - Do minus -2621 10EB FE 22 CP '"' ; Literal string ? -2622 10ED CA C0 14 JP Z,QTSTR ; Get string terminated by '"' -2623 10F0 FE AA CP ZNOT ; "NOT" Token ? -2624 10F2 CA F9 11 JP Z,EVNOT ; Yes - Eval NOT expression -2625 10F5 FE A7 CP ZFN ; "FN" Token ? -2626 10F7 CA 24 14 JP Z,DOFN ; Yes - Do FN routine -2627 10FA D6 B6 SUB ZSGN ; Is it a function? -2628 10FC D2 29 11 JP NC,FNOFST ; Yes - Evaluate function -2629 10FF CD 36 10 EVLPAR: CALL OPNPAR ; Evaluate expression in "()" -2630 1102 CD 31 0A CALL CHKSYN ; Make sure ")" follows -2631 1105 29 .BYTE ")" -2632 1106 C9 RET -2633 1107 -2634 1107 16 7D MINUS: LD D,7DH ; '-' precedence -2635 1109 CD 3D 10 CALL EVAL1 ; Evaluate until prec' break -2636 110C 2A 80 31 LD HL,(NXTOPR) ; Get next operator address -2637 110F E5 PUSH HL ; Save next operator address -2638 1110 CD 33 1A CALL INVSGN ; Negate value -2639 1113 CD 2B 10 RETNUM: CALL TSTNUM ; Make sure it's a number -2640 1116 E1 POP HL ; Restore next operator address -2641 1117 C9 RET -2642 1118 -2643 1118 CD 1E 12 CONVAR: CALL GETVAR ; Get variable address to DE -2644 111B E5 FRMEVL: PUSH HL ; Save code string address -2645 111C EB EX DE,HL ; Variable address to HL -2646 111D 22 94 31 LD (FPREG),HL ; Save address of variable -2647 1120 3A 5D 31 LD A,(TYPE) ; Get type -2648 1123 B7 OR A ; Numeric? -2649 1124 CC 48 1A CALL Z,PHLTFP ; Yes - Move contents to FPREG -2650 1127 E1 POP HL ; Restore code string address -2651 1128 C9 RET -2652 1129 -2653 1129 06 00 FNOFST: LD B,0 ; Get address of function -2654 112B 07 RLCA ; Double function offset -2655 112C 4F LD C,A ; BC = Offset in function table -2656 112D C5 PUSH BC ; Save adjusted token value -2657 112E CD BB 0B CALL GETCHR ; Get next character -2658 1131 79 LD A,C ; Get adjusted token value -2659 1132 FE 31 CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? -2660 1134 DA 50 11 JP C,FNVAL ; No - Do function -2661 1137 CD 36 10 CALL OPNPAR ; Evaluate expression (X,... -2662 113A CD 31 0A CALL CHKSYN ; Make sure ',' follows -2663 113D 2C .BYTE ',' -2664 113E CD 2C 10 CALL TSTSTR ; Make sure it's a string -2665 1141 EB EX DE,HL ; Save code string address -2666 1142 2A 94 31 LD HL,(FPREG) ; Get address of string -2667 1145 E3 EX (SP),HL ; Save address of string -2668 1146 E5 PUSH HL ; Save adjusted token value -2669 1147 EB EX DE,HL ; Restore code string address -2670 1148 CD 89 17 CALL GETINT ; Get integer 0-255 -2671 114B EB EX DE,HL ; Save code string address -2672 114C E3 EX (SP),HL ; Save integer,HL = adj' token -2673 114D C3 58 11 JP GOFUNC ; Jump to string function -2674 1150 -2675 1150 CD FF 10 FNVAL: CALL EVLPAR ; Evaluate expression -2676 1153 E3 EX (SP),HL ; HL = Adjusted token value -2677 1154 11 13 11 LD DE,RETNUM ; Return number from function -2678 1157 D5 PUSH DE ; Save on stack -2679 1158 01 B4 04 GOFUNC: LD BC,FNCTAB ; Function routine addresses -2680 115B 09 ADD HL,BC ; Point to right address -2681 115C 4E LD C,(HL) ; Get LSB of address -2682 115D 23 INC HL ; -2683 115E 66 LD H,(HL) ; Get MSB of address -2684 115F 69 LD L,C ; Address to HL -2685 1160 E9 JP (HL) ; Jump to function -2686 1161 -2687 1161 15 SGNEXP: DEC D ; Dee to flag negative exponent -2688 1162 FE AD CP ZMINUS ; '-' token ? -2689 1164 C8 RET Z ; Yes - Return -2690 1165 FE 2D CP '-' ; '-' ASCII ? -2691 1167 C8 RET Z ; Yes - Return -2692 1168 14 INC D ; Inc to flag positive exponent -2693 1169 FE 2B CP '+' ; '+' ASCII ? -2694 116B C8 RET Z ; Yes - Return -2695 116C FE AC CP ZPLUS ; '+' token ? -2696 116E C8 RET Z ; Yes - Return -2697 116F 2B DEC HL ; DEC 'cos GETCHR INCs -2698 1170 C9 RET ; Return "NZ" -2699 1171 -2700 1171 F6 POR: .BYTE 0F6H ; Flag "OR" -2701 1172 AF PAND: XOR A ; Flag "AND" -2702 1173 F5 PUSH AF ; Save "AND" / "OR" flag -2703 1174 CD 2B 10 CALL TSTNUM ; Make sure it's a number -2704 1177 CD 6D 0C CALL DEINT ; Get integer -32768 to 32767 -2705 117A F1 POP AF ; Restore "AND" / "OR" flag -2706 117B EB EX DE,HL ; <- Get last -2707 117C C1 POP BC ; <- value -2708 117D E3 EX (SP),HL ; <- from -2709 117E EB EX DE,HL ; <- stack -2710 117F CD 4B 1A CALL FPBCDE ; Move last value to FPREG -2711 1182 F5 PUSH AF ; Save "AND" / "OR" flag -2712 1183 CD 6D 0C CALL DEINT ; Get integer -32768 to 32767 -2713 1186 F1 POP AF ; Restore "AND" / "OR" flag -2714 1187 C1 POP BC ; Get value -2715 1188 79 LD A,C ; Get LSB -2716 1189 21 E2 13 LD HL,ACPASS ; Address of save AC as current -2717 118C C2 94 11 JP NZ,POR1 ; Jump if OR -2718 118F A3 AND E ; "AND" LSBs -2719 1190 4F LD C,A ; Save LSB -2720 1191 78 LD A,B ; Get MBS -2721 1192 A2 AND D ; "AND" MSBs -2722 1193 E9 JP (HL) ; Save AC as current (ACPASS) -2723 1194 -2724 1194 B3 POR1: OR E ; "OR" LSBs -2725 1195 4F LD C,A ; Save LSB -2726 1196 78 LD A,B ; Get MSB -2727 1197 B2 OR D ; "OR" MSBs -2728 1198 E9 JP (HL) ; Save AC as current (ACPASS) -2729 1199 -2730 1199 21 AB 11 TSTRED: LD HL,CMPLOG ; Logical compare routine -2731 119C 3A 5D 31 LD A,(TYPE) ; Get data type -2732 119F 1F RRA ; Carry set = string -2733 11A0 7A LD A,D ; Get last precedence value -2734 11A1 17 RLA ; Times 2 plus carry -2735 11A2 5F LD E,A ; To E -2736 11A3 16 64 LD D,64H ; Relational precedence -2737 11A5 78 LD A,B ; Get current precedence -2738 11A6 BA CP D ; Compare with last -2739 11A7 D0 RET NC ; Eval if last was rel' or log' -2740 11A8 C3 9A 10 JP STKTHS ; Stack this one and get next -2741 11AB -2742 11AB AD 11 CMPLOG: .WORD CMPLG1 ; Compare two values / strings -2743 11AD 79 CMPLG1: LD A,C ; Get data type -2744 11AE B7 OR A -2745 11AF 1F RRA -2746 11B0 C1 POP BC ; Get last expression to BCDE -2747 11B1 D1 POP DE -2748 11B2 F5 PUSH AF ; Save status -2749 11B3 CD 2D 10 CALL CHKTYP ; Check that types match -2750 11B6 21 EF 11 LD HL,CMPRES ; Result to comparison -2751 11B9 E5 PUSH HL ; Save for RETurn -2752 11BA CA 85 1A JP Z,CMPNUM ; Compare values if numeric -2753 11BD AF XOR A ; Compare two strings -2754 11BE 32 5D 31 LD (TYPE),A ; Set type to numeric -2755 11C1 D5 PUSH DE ; Save string name -2756 11C2 CD 44 16 CALL GSTRCU ; Get current string -2757 11C5 7E LD A,(HL) ; Get length of string -2758 11C6 23 INC HL -2759 11C7 23 INC HL -2760 11C8 4E LD C,(HL) ; Get LSB of address -2761 11C9 23 INC HL -2762 11CA 46 LD B,(HL) ; Get MSB of address -2763 11CB D1 POP DE ; Restore string name -2764 11CC C5 PUSH BC ; Save address of string -2765 11CD F5 PUSH AF ; Save length of string -2766 11CE CD 48 16 CALL GSTRDE ; Get second string -2767 11D1 CD 59 1A CALL LOADFP ; Get address of second string -2768 11D4 F1 POP AF ; Restore length of string 1 -2769 11D5 57 LD D,A ; Length to D -2770 11D6 E1 POP HL ; Restore address of string 1 -2771 11D7 7B CMPSTR: LD A,E ; Bytes of string 2 to do -2772 11D8 B2 OR D ; Bytes of string 1 to do -2773 11D9 C8 RET Z ; Exit if all bytes compared -2774 11DA 7A LD A,D ; Get bytes of string 1 to do -2775 11DB D6 01 SUB 1 -2776 11DD D8 RET C ; Exit if end of string 1 -2777 11DE AF XOR A -2778 11DF BB CP E ; Bytes of string 2 to do -2779 11E0 3C INC A -2780 11E1 D0 RET NC ; Exit if end of string 2 -2781 11E2 15 DEC D ; Count bytes in string 1 -2782 11E3 1D DEC E ; Count bytes in string 2 -2783 11E4 0A LD A,(BC) ; Byte in string 2 -2784 11E5 BE CP (HL) ; Compare to byte in string 1 -2785 11E6 23 INC HL ; Move up string 1 -2786 11E7 03 INC BC ; Move up string 2 -2787 11E8 CA D7 11 JP Z,CMPSTR ; Same - Try next bytes -2788 11EB 3F CCF ; Flag difference (">" or "<") -2789 11EC C3 15 1A JP FLGDIF ; "<" gives -1 , ">" gives +1 -2790 11EF -2791 11EF 3C CMPRES: INC A ; Increment current value -2792 11F0 8F ADC A,A ; Double plus carry -2793 11F1 C1 POP BC ; Get other value -2794 11F2 A0 AND B ; Combine them -2795 11F3 C6 FF ADD A,-1 ; Carry set if different -2796 11F5 9F SBC A,A ; 00 - Equal , FF - Different -2797 11F6 C3 1C 1A JP FLGREL ; Set current value & continue -2798 11F9 -2799 11F9 16 5A EVNOT: LD D,5AH ; Precedence value for "NOT" -2800 11FB CD 3D 10 CALL EVAL1 ; Eval until precedence break -2801 11FE CD 2B 10 CALL TSTNUM ; Make sure it's a number -2802 1201 CD 6D 0C CALL DEINT ; Get integer -32768 - 32767 -2803 1204 7B LD A,E ; Get LSB -2804 1205 2F CPL ; Invert LSB -2805 1206 4F LD C,A ; Save "NOT" of LSB -2806 1207 7A LD A,D ; Get MSB -2807 1208 2F CPL ; Invert MSB -2808 1209 CD E2 13 CALL ACPASS ; Save AC as current -2809 120C C1 POP BC ; Clean up stack -2810 120D C3 49 10 JP EVAL3 ; Continue evaluation -2811 1210 -2812 1210 2B DIMRET: DEC HL ; DEC 'cos GETCHR INCs -2813 1211 CD BB 0B CALL GETCHR ; Get next character -2814 1214 C8 RET Z ; End of DIM statement -2815 1215 CD 31 0A CALL CHKSYN ; Make sure ',' follows -2816 1218 2C .BYTE ',' -2817 1219 01 10 12 DIM: LD BC,DIMRET ; Return to "DIMRET" -2818 121C C5 PUSH BC ; Save on stack -2819 121D F6 .BYTE 0F6H ; Flag "Create" variable -2820 121E AF GETVAR: XOR A ; Find variable address,to DE -2821 121F 32 5C 31 LD (LCRFLG),A ; Set locate / create flag -2822 1222 46 LD B,(HL) ; Get First byte of name -2823 1223 CD 59 0C GTFNAM: CALL CHKLTR ; See if a letter -2824 1226 DA 63 07 JP C,SNERR ; ?SN Error if not a letter -2825 1229 AF XOR A -2826 122A 4F LD C,A ; Clear second byte of name -2827 122B 32 5D 31 LD (TYPE),A ; Set type to numeric -2828 122E CD BB 0B CALL GETCHR ; Get next character -2829 1231 DA 3A 12 JP C,SVNAM2 ; Numeric - Save in name -2830 1234 CD 59 0C CALL CHKLTR ; See if a letter -2831 1237 DA 47 12 JP C,CHARTY ; Not a letter - Check type -2832 123A 4F SVNAM2: LD C,A ; Save second byte of name -2833 123B CD BB 0B ENDNAM: CALL GETCHR ; Get next character -2834 123E DA 3B 12 JP C,ENDNAM ; Numeric - Get another -2835 1241 CD 59 0C CALL CHKLTR ; See if a letter -2836 1244 D2 3B 12 JP NC,ENDNAM ; Letter - Get another -2837 1247 D6 24 CHARTY: SUB '$' ; String variable? -2838 1249 C2 56 12 JP NZ,NOTSTR ; No - Numeric variable -2839 124C 3C INC A ; A = 1 (string type) -2840 124D 32 5D 31 LD (TYPE),A ; Set type to string -2841 1250 0F RRCA ; A = 80H , Flag for string -2842 1251 81 ADD A,C ; 2nd byte of name has bit 7 on -2843 1252 4F LD C,A ; Resave second byte on name -2844 1253 CD BB 0B CALL GETCHR ; Get next character -2845 1256 3A 7B 31 NOTSTR: LD A,(FORFLG) ; Array name needed ? -2846 1259 3D DEC A -2847 125A CA 03 13 JP Z,ARLDSV ; Yes - Get array name -2848 125D F2 66 12 JP P,NSCFOR ; No array with "FOR" or "FN" -2849 1260 7E LD A,(HL) ; Get byte again -2850 1261 D6 28 SUB '(' ; Subscripted variable? -2851 1263 CA DB 12 JP Z,SBSCPT ; Yes - Sort out subscript -2852 1266 -2853 1266 AF NSCFOR: XOR A ; Simple variable -2854 1267 32 7B 31 LD (FORFLG),A ; Clear "FOR" flag -2855 126A E5 PUSH HL ; Save code string address -2856 126B 50 LD D,B ; DE = Variable name to find -2857 126C 59 LD E,C -2858 126D 2A 8E 31 LD HL,(FNRGNM) ; FN argument name -2859 1270 CD 2B 0A CALL CPDEHL ; Is it the FN argument? -2860 1273 11 90 31 LD DE,FNARG ; Point to argument value -2861 1276 CA 4B 19 JP Z,POPHRT ; Yes - Return FN argument value -2862 1279 2A 88 31 LD HL,(VAREND) ; End of variables -2863 127C EB EX DE,HL ; Address of end of search -2864 127D 2A 86 31 LD HL,(PROGND) ; Start of variables address -2865 1280 CD 2B 0A FNDVAR: CALL CPDEHL ; End of variable list table? -2866 1283 CA 99 12 JP Z,CFEVAL ; Yes - Called from EVAL? -2867 1286 79 LD A,C ; Get second byte of name -2868 1287 96 SUB (HL) ; Compare with name in list -2869 1288 23 INC HL ; Move on to first byte -2870 1289 C2 8E 12 JP NZ,FNTHR ; Different - Find another -2871 128C 78 LD A,B ; Get first byte of name -2872 128D 96 SUB (HL) ; Compare with name in list -2873 128E 23 FNTHR: INC HL ; Move on to LSB of value -2874 128F CA CD 12 JP Z,RETADR ; Found - Return address -2875 1292 23 INC HL ; <- Skip -2876 1293 23 INC HL ; <- over -2877 1294 23 INC HL ; <- F.P. -2878 1295 23 INC HL ; <- value -2879 1296 C3 80 12 JP FNDVAR ; Keep looking -2880 1299 -2881 1299 E1 CFEVAL: POP HL ; Restore code string address -2882 129A E3 EX (SP),HL ; Get return address -2883 129B D5 PUSH DE ; Save address of variable -2884 129C 11 1B 11 LD DE,FRMEVL ; Return address in EVAL -2885 129F CD 2B 0A CALL CPDEHL ; Called from EVAL ? -2886 12A2 D1 POP DE ; Restore address of variable -2887 12A3 CA D0 12 JP Z,RETNUL ; Yes - Return null variable -2888 12A6 E3 EX (SP),HL ; Put back return -2889 12A7 E5 PUSH HL ; Save code string address -2890 12A8 C5 PUSH BC ; Save variable name -2891 12A9 01 06 00 LD BC,6 ; 2 byte name plus 4 byte data -2892 12AC 2A 8A 31 LD HL,(ARREND) ; End of arrays -2893 12AF E5 PUSH HL ; Save end of arrays -2894 12B0 09 ADD HL,BC ; Move up 6 bytes -2895 12B1 C1 POP BC ; Source address in BC -2896 12B2 E5 PUSH HL ; Save new end address -2897 12B3 CD 2F 07 CALL MOVUP ; Move arrays up -2898 12B6 E1 POP HL ; Restore new end address -2899 12B7 22 8A 31 LD (ARREND),HL ; Set new end address -2900 12BA 60 LD H,B ; End of variables to HL -2901 12BB 69 LD L,C -2902 12BC 22 88 31 LD (VAREND),HL ; Set new end address -2903 12BF -2904 12BF 2B ZEROLP: DEC HL ; Back through to zero variable -2905 12C0 36 00 LD (HL),0 ; Zero byte in variable -2906 12C2 CD 2B 0A CALL CPDEHL ; Done them all? -2907 12C5 C2 BF 12 JP NZ,ZEROLP ; No - Keep on going -2908 12C8 D1 POP DE ; Get variable name -2909 12C9 73 LD (HL),E ; Store second character -2910 12CA 23 INC HL -2911 12CB 72 LD (HL),D ; Store first character -2912 12CC 23 INC HL -2913 12CD EB RETADR: EX DE,HL ; Address of variable in DE -2914 12CE E1 POP HL ; Restore code string address -2915 12CF C9 RET -2916 12D0 -2917 12D0 32 97 31 RETNUL: LD (FPEXP),A ; Set result to zero -2918 12D3 21 FF 06 LD HL,ZERBYT ; Also set a null string -2919 12D6 22 94 31 LD (FPREG),HL ; Save for EVAL -2920 12D9 E1 POP HL ; Restore code string address -2921 12DA C9 RET -2922 12DB -2923 12DB E5 SBSCPT: PUSH HL ; Save code string address -2924 12DC 2A 5C 31 LD HL,(LCRFLG) ; Locate/Create and Type -2925 12DF E3 EX (SP),HL ; Save and get code string -2926 12E0 57 LD D,A ; Zero number of dimensions -2927 12E1 D5 SCPTLP: PUSH DE ; Save number of dimensions -2928 12E2 C5 PUSH BC ; Save array name -2929 12E3 CD 61 0C CALL FPSINT ; Get subscript (0-32767) -2930 12E6 C1 POP BC ; Restore array name -2931 12E7 F1 POP AF ; Get number of dimensions -2932 12E8 EB EX DE,HL -2933 12E9 E3 EX (SP),HL ; Save subscript value -2934 12EA E5 PUSH HL ; Save LCRFLG and TYPE -2935 12EB EB EX DE,HL -2936 12EC 3C INC A ; Count dimensions -2937 12ED 57 LD D,A ; Save in D -2938 12EE 7E LD A,(HL) ; Get next byte in code string -2939 12EF FE 2C CP ',' ; Comma (more to come)? -2940 12F1 CA E1 12 JP Z,SCPTLP ; Yes - More subscripts -2941 12F4 CD 31 0A CALL CHKSYN ; Make sure ")" follows -2942 12F7 29 .BYTE ")" -2943 12F8 22 80 31 LD (NXTOPR),HL ; Save code string address -2944 12FB E1 POP HL ; Get LCRFLG and TYPE -2945 12FC 22 5C 31 LD (LCRFLG),HL ; Restore Locate/create & type -2946 12FF 1E 00 LD E,0 ; Flag not CSAVE* or CLOAD* -2947 1301 D5 PUSH DE ; Save number of dimensions (D) -2948 1302 11 .BYTE 11H ; Skip "PUSH HL" and "PUSH AF' -2949 1303 -2950 1303 E5 ARLDSV: PUSH HL ; Save code string address -2951 1304 F5 PUSH AF ; A = 00 , Flags set = Z,N -2952 1305 2A 88 31 LD HL,(VAREND) ; Start of arrays -2953 1308 3E .BYTE 3EH ; Skip "ADD HL,DE" -2954 1309 19 FNDARY: ADD HL,DE ; Move to next array start -2955 130A EB EX DE,HL -2956 130B 2A 8A 31 LD HL,(ARREND) ; End of arrays -2957 130E EB EX DE,HL ; Current array pointer -2958 130F CD 2B 0A CALL CPDEHL ; End of arrays found? -2959 1312 CA 3B 13 JP Z,CREARY ; Yes - Create array -2960 1315 7E LD A,(HL) ; Get second byte of name -2961 1316 B9 CP C ; Compare with name given -2962 1317 23 INC HL ; Move on -2963 1318 C2 1D 13 JP NZ,NXTARY ; Different - Find next array -2964 131B 7E LD A,(HL) ; Get first byte of name -2965 131C B8 CP B ; Compare with name given -2966 131D 23 NXTARY: INC HL ; Move on -2967 131E 5E LD E,(HL) ; Get LSB of next array address -2968 131F 23 INC HL -2969 1320 56 LD D,(HL) ; Get MSB of next array address -2970 1321 23 INC HL -2971 1322 C2 09 13 JP NZ,FNDARY ; Not found - Keep looking -2972 1325 3A 5C 31 LD A,(LCRFLG) ; Found Locate or Create it? -2973 1328 B7 OR A -2974 1329 C2 6C 07 JP NZ,DDERR ; Create - ?DD Error -2975 132C F1 POP AF ; Locate - Get number of dim'ns -2976 132D 44 LD B,H ; BC Points to array dim'ns -2977 132E 4D LD C,L -2978 132F CA 4B 19 JP Z,POPHRT ; Jump if array load/save -2979 1332 96 SUB (HL) ; Same number of dimensions? -2980 1333 CA 99 13 JP Z,FINDEL ; Yes - Find element -2981 1336 1E 10 BSERR: LD E,BS ; ?BS Error -2982 1338 C3 77 07 JP ERROR ; Output error -2983 133B -2984 133B 11 04 00 CREARY: LD DE,4 ; 4 Bytes per entry -2985 133E F1 POP AF ; Array to save or 0 dim'ns? -2986 133F CA 82 0C JP Z,FCERR ; Yes - ?FC Error -2987 1342 71 LD (HL),C ; Save second byte of name -2988 1343 23 INC HL -2989 1344 70 LD (HL),B ; Save first byte of name -2990 1345 23 INC HL -2991 1346 4F LD C,A ; Number of dimensions to C -2992 1347 CD 40 07 CALL CHKSTK ; Check if enough memory -2993 134A 23 INC HL ; Point to number of dimensions -2994 134B 23 INC HL -2995 134C 22 75 31 LD (CUROPR),HL ; Save address of pointer -2996 134F 71 LD (HL),C ; Set number of dimensions -2997 1350 23 INC HL -2998 1351 3A 5C 31 LD A,(LCRFLG) ; Locate of Create? -2999 1354 17 RLA ; Carry set = Create -3000 1355 79 LD A,C ; Get number of dimensions -3001 1356 01 0B 00 CRARLP: LD BC,10+1 ; Default dimension size 10 -3002 1359 D2 5E 13 JP NC,DEFSIZ ; Locate - Set default size -3003 135C C1 POP BC ; Get specified dimension size -3004 135D 03 INC BC ; Include zero element -3005 135E 71 DEFSIZ: LD (HL),C ; Save LSB of dimension size -3006 135F 23 INC HL -3007 1360 70 LD (HL),B ; Save MSB of dimension size -3008 1361 23 INC HL -3009 1362 F5 PUSH AF ; Save num' of dim'ns an status -3010 1363 E5 PUSH HL ; Save address of dim'n size -3011 1364 CD F6 1A CALL MLDEBC ; Multiply DE by BC to find -3012 1367 EB EX DE,HL ; amount of mem needed (to DE) -3013 1368 E1 POP HL ; Restore address of dimension -3014 1369 F1 POP AF ; Restore number of dimensions -3015 136A 3D DEC A ; Count them -3016 136B C2 56 13 JP NZ,CRARLP ; Do next dimension if more -3017 136E F5 PUSH AF ; Save locate/create flag -3018 136F 42 LD B,D ; MSB of memory needed -3019 1370 4B LD C,E ; LSB of memory needed -3020 1371 EB EX DE,HL -3021 1372 19 ADD HL,DE ; Add bytes to array start -3022 1373 DA 58 07 JP C,OMERR ; Too big - Error -3023 1376 CD 49 07 CALL ENFMEM ; See if enough memory -3024 1379 22 8A 31 LD (ARREND),HL ; Save new end of array -3025 137C -3026 137C 2B ZERARY: DEC HL ; Back through array data -3027 137D 36 00 LD (HL),0 ; Set array element to zero -3028 137F CD 2B 0A CALL CPDEHL ; All elements zeroed? -3029 1382 C2 7C 13 JP NZ,ZERARY ; No - Keep on going -3030 1385 03 INC BC ; Number of bytes + 1 -3031 1386 57 LD D,A ; A=0 -3032 1387 2A 75 31 LD HL,(CUROPR) ; Get address of array -3033 138A 5E LD E,(HL) ; Number of dimensions -3034 138B EB EX DE,HL ; To HL -3035 138C 29 ADD HL,HL ; Two bytes per dimension size -3036 138D 09 ADD HL,BC ; Add number of bytes -3037 138E EB EX DE,HL ; Bytes needed to DE -3038 138F 2B DEC HL -3039 1390 2B DEC HL -3040 1391 73 LD (HL),E ; Save LSB of bytes needed -3041 1392 23 INC HL -3042 1393 72 LD (HL),D ; Save MSB of bytes needed -3043 1394 23 INC HL -3044 1395 F1 POP AF ; Locate / Create? -3045 1396 DA BD 13 JP C,ENDDIM ; A is 0 , End if create -3046 1399 47 FINDEL: LD B,A ; Find array element -3047 139A 4F LD C,A -3048 139B 7E LD A,(HL) ; Number of dimensions -3049 139C 23 INC HL -3050 139D 16 .BYTE 16H ; Skip "POP HL" -3051 139E E1 FNDELP: POP HL ; Address of next dim' size -3052 139F 5E LD E,(HL) ; Get LSB of dim'n size -3053 13A0 23 INC HL -3054 13A1 56 LD D,(HL) ; Get MSB of dim'n size -3055 13A2 23 INC HL -3056 13A3 E3 EX (SP),HL ; Save address - Get index -3057 13A4 F5 PUSH AF ; Save number of dim'ns -3058 13A5 CD 2B 0A CALL CPDEHL ; Dimension too large? -3059 13A8 D2 36 13 JP NC,BSERR ; Yes - ?BS Error -3060 13AB E5 PUSH HL ; Save index -3061 13AC CD F6 1A CALL MLDEBC ; Multiply previous by size -3062 13AF D1 POP DE ; Index supplied to DE -3063 13B0 19 ADD HL,DE ; Add index to pointer -3064 13B1 F1 POP AF ; Number of dimensions -3065 13B2 3D DEC A ; Count them -3066 13B3 44 LD B,H ; MSB of pointer -3067 13B4 4D LD C,L ; LSB of pointer -3068 13B5 C2 9E 13 JP NZ,FNDELP ; More - Keep going -3069 13B8 29 ADD HL,HL ; 4 Bytes per element -3070 13B9 29 ADD HL,HL -3071 13BA C1 POP BC ; Start of array -3072 13BB 09 ADD HL,BC ; Point to element -3073 13BC EB EX DE,HL ; Address of element to DE -3074 13BD 2A 80 31 ENDDIM: LD HL,(NXTOPR) ; Got code string address -3075 13C0 C9 RET -3076 13C1 -3077 13C1 2A 8A 31 FRE: LD HL,(ARREND) ; Start of free memory -3078 13C4 EB EX DE,HL ; To DE -3079 13C5 21 00 00 LD HL,0 ; End of free memory -3080 13C8 39 ADD HL,SP ; Current stack value -3081 13C9 3A 5D 31 LD A,(TYPE) ; Dummy argument type -3082 13CC B7 OR A -3083 13CD CA DD 13 JP Z,FRENUM ; Numeric - Free variable space -3084 13D0 CD 44 16 CALL GSTRCU ; Current string to pool -3085 13D3 CD 44 15 CALL GARBGE ; Garbage collection -3086 13D6 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use -3087 13D9 EB EX DE,HL ; To DE -3088 13DA 2A 73 31 LD HL,(STRBOT) ; Bottom of string space -3089 13DD 7D FRENUM: LD A,L ; Get LSB of end -3090 13DE 93 SUB E ; Subtract LSB of beginning -3091 13DF 4F LD C,A ; Save difference if C -3092 13E0 7C LD A,H ; Get MSB of end -3093 13E1 9A SBC A,D ; Subtract MSB of beginning -3094 13E2 41 ACPASS: LD B,C ; Return integer AC -3095 13E3 50 ABPASS: LD D,B ; Return integer AB -3096 13E4 1E 00 LD E,0 -3097 13E6 21 5D 31 LD HL,TYPE ; Point to type -3098 13E9 73 LD (HL),E ; Set type to numeric -3099 13EA 06 90 LD B,80H+16 ; 16 bit integer -3100 13EC C3 21 1A JP RETINT ; Return the integr -3101 13EF -3102 13EF 3A 5B 31 POS: LD A,(CURPOS) ; Get cursor position -3103 13F2 47 PASSA: LD B,A ; Put A into AB -3104 13F3 AF XOR A ; Zero A -3105 13F4 C3 E3 13 JP ABPASS ; Return integer AB -3106 13F7 -3107 13F7 CD 7A 14 DEF: CALL CHEKFN ; Get "FN" and name -3108 13FA CD 6C 14 CALL IDTEST ; Test for illegal direct -3109 13FD 01 52 0D LD BC,DATA ; To get next statement -3110 1400 C5 PUSH BC ; Save address for RETurn -3111 1401 D5 PUSH DE ; Save address of function ptr -3112 1402 CD 31 0A CALL CHKSYN ; Make sure "(" follows -3113 1405 28 .BYTE "(" -3114 1406 CD 1E 12 CALL GETVAR ; Get argument variable name -3115 1409 E5 PUSH HL ; Save code string address -3116 140A EB EX DE,HL ; Argument address to HL -3117 140B 2B DEC HL -3118 140C 56 LD D,(HL) ; Get first byte of arg name -3119 140D 2B DEC HL -3120 140E 5E LD E,(HL) ; Get second byte of arg name -3121 140F E1 POP HL ; Restore code string address -3122 1410 CD 2B 10 CALL TSTNUM ; Make sure numeric argument -3123 1413 CD 31 0A CALL CHKSYN ; Make sure ")" follows -3124 1416 29 .BYTE ")" -3125 1417 CD 31 0A CALL CHKSYN ; Make sure "=" follows -3126 141A B4 .BYTE ZEQUAL ; "=" token -3127 141B 44 LD B,H ; Code string address to BC -3128 141C 4D LD C,L -3129 141D E3 EX (SP),HL ; Save code str , Get FN ptr -3130 141E 71 LD (HL),C ; Save LSB of FN code string -3131 141F 23 INC HL -3132 1420 70 LD (HL),B ; Save MSB of FN code string -3133 1421 C3 B9 14 JP SVSTAD ; Save address and do function -3134 1424 -3135 1424 CD 7A 14 DOFN: CALL CHEKFN ; Make sure FN follows -3136 1427 D5 PUSH DE ; Save function pointer address -3137 1428 CD FF 10 CALL EVLPAR ; Evaluate expression in "()" -3138 142B CD 2B 10 CALL TSTNUM ; Make sure numeric result -3139 142E E3 EX (SP),HL ; Save code str , Get FN ptr -3140 142F 5E LD E,(HL) ; Get LSB of FN code string -3141 1430 23 INC HL -3142 1431 56 LD D,(HL) ; Get MSB of FN code string -3143 1432 23 INC HL -3144 1433 7A LD A,D ; And function DEFined? -3145 1434 B3 OR E -3146 1435 CA 6F 07 JP Z,UFERR ; No - ?UF Error -3147 1438 7E LD A,(HL) ; Get LSB of argument address -3148 1439 23 INC HL -3149 143A 66 LD H,(HL) ; Get MSB of argument address -3150 143B 6F LD L,A ; HL = Arg variable address -3151 143C E5 PUSH HL ; Save it -3152 143D 2A 8E 31 LD HL,(FNRGNM) ; Get old argument name -3153 1440 E3 EX (SP),HL ; ; Save old , Get new -3154 1441 22 8E 31 LD (FNRGNM),HL ; Set new argument name -3155 1444 2A 92 31 LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value -3156 1447 E5 PUSH HL ; Save it -3157 1448 2A 90 31 LD HL,(FNARG) ; Get MSB,EXP of old arg value -3158 144B E5 PUSH HL ; Save it -3159 144C 21 90 31 LD HL,FNARG ; HL = Value of argument -3160 144F D5 PUSH DE ; Save FN code string address -3161 1450 CD 62 1A CALL FPTHL ; Move FPREG to argument -3162 1453 E1 POP HL ; Get FN code string address -3163 1454 CD 28 10 CALL GETNUM ; Get value from function -3164 1457 2B DEC HL ; DEC 'cos GETCHR INCs -3165 1458 CD BB 0B CALL GETCHR ; Get next character -3166 145B C2 63 07 JP NZ,SNERR ; Bad character in FN - Error -3167 145E E1 POP HL ; Get MSB,EXP of old arg -3168 145F 22 90 31 LD (FNARG),HL ; Restore it -3169 1462 E1 POP HL ; Get LSB,NLSB of old arg -3170 1463 22 92 31 LD (FNARG+2),HL ; Restore it -3171 1466 E1 POP HL ; Get name of old arg -3172 1467 22 8E 31 LD (FNRGNM),HL ; Restore it -3173 146A E1 POP HL ; Restore code string address -3174 146B C9 RET -3175 146C -3176 146C E5 IDTEST: PUSH HL ; Save code string address -3177 146D 2A 0C 31 LD HL,(LINEAT) ; Get current line number -3178 1470 23 INC HL ; -1 means direct statement -3179 1471 7C LD A,H -3180 1472 B5 OR L -3181 1473 E1 POP HL ; Restore code string address -3182 1474 C0 RET NZ ; Return if in program -3183 1475 1E 16 LD E,ID ; ?ID Error -3184 1477 C3 77 07 JP ERROR -3185 147A -3186 147A CD 31 0A CHEKFN: CALL CHKSYN ; Make sure FN follows -3187 147D A7 .BYTE ZFN ; "FN" token -3188 147E 3E 80 LD A,80H -3189 1480 32 7B 31 LD (FORFLG),A ; Flag FN name to find -3190 1483 B6 OR (HL) ; FN name has bit 7 set -3191 1484 47 LD B,A ; in first byte of name -3192 1485 CD 23 12 CALL GTFNAM ; Get FN name -3193 1488 C3 2B 10 JP TSTNUM ; Make sure numeric function -3194 148B -3195 148B CD 2B 10 STR: CALL TSTNUM ; Make sure it's a number -3196 148E CD AF 1B CALL NUMASC ; Turn number into text -3197 1491 CD BF 14 STR1: CALL CRTST ; Create string entry for it -3198 1494 CD 44 16 CALL GSTRCU ; Current string to pool -3199 1497 01 9F 16 LD BC,TOPOOL ; Save in string pool -3200 149A C5 PUSH BC ; Save address on stack -3201 149B -3202 149B 7E SAVSTR: LD A,(HL) ; Get string length -3203 149C 23 INC HL -3204 149D 23 INC HL -3205 149E E5 PUSH HL ; Save pointer to string -3206 149F CD 1A 15 CALL TESTR ; See if enough string space -3207 14A2 E1 POP HL ; Restore pointer to string -3208 14A3 4E LD C,(HL) ; Get LSB of address -3209 14A4 23 INC HL -3210 14A5 46 LD B,(HL) ; Get MSB of address -3211 14A6 CD B3 14 CALL CRTMST ; Create string entry -3212 14A9 E5 PUSH HL ; Save pointer to MSB of addr -3213 14AA 6F LD L,A ; Length of string -3214 14AB CD 37 16 CALL TOSTRA ; Move to string area -3215 14AE D1 POP DE ; Restore pointer to MSB -3216 14AF C9 RET -3217 14B0 -3218 14B0 CD 1A 15 MKTMST: CALL TESTR ; See if enough string space -3219 14B3 21 6F 31 CRTMST: LD HL,TMPSTR ; Temporary string -3220 14B6 E5 PUSH HL ; Save it -3221 14B7 77 LD (HL),A ; Save length of string -3222 14B8 23 INC HL -3223 14B9 23 SVSTAD: INC HL -3224 14BA 73 LD (HL),E ; Save LSB of address -3225 14BB 23 INC HL -3226 14BC 72 LD (HL),D ; Save MSB of address -3227 14BD E1 POP HL ; Restore pointer -3228 14BE C9 RET -3229 14BF -3230 14BF 2B CRTST: DEC HL ; DEC - INCed after -3231 14C0 06 22 QTSTR: LD B,'"' ; Terminating quote -3232 14C2 50 LD D,B ; Quote to D -3233 14C3 E5 DTSTR: PUSH HL ; Save start -3234 14C4 0E FF LD C,-1 ; Set counter to -1 -3235 14C6 23 QTSTLP: INC HL ; Move on -3236 14C7 7E LD A,(HL) ; Get byte -3237 14C8 0C INC C ; Count bytes -3238 14C9 B7 OR A ; End of line? -3239 14CA CA D5 14 JP Z,CRTSTE ; Yes - Create string entry -3240 14CD BA CP D ; Terminator D found? -3241 14CE CA D5 14 JP Z,CRTSTE ; Yes - Create string entry -3242 14D1 B8 CP B ; Terminator B found? -3243 14D2 C2 C6 14 JP NZ,QTSTLP ; No - Keep looking -3244 14D5 FE 22 CRTSTE: CP '"' ; End with '"'? -3245 14D7 CC BB 0B CALL Z,GETCHR ; Yes - Get next character -3246 14DA E3 EX (SP),HL ; Starting quote -3247 14DB 23 INC HL ; First byte of string -3248 14DC EB EX DE,HL ; To DE -3249 14DD 79 LD A,C ; Get length -3250 14DE CD B3 14 CALL CRTMST ; Create string entry -3251 14E1 11 6F 31 TSTOPL: LD DE,TMPSTR ; Temporary string -3252 14E4 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer -3253 14E7 22 94 31 LD (FPREG),HL ; Save address of string ptr -3254 14EA 3E 01 LD A,1 -3255 14EC 32 5D 31 LD (TYPE),A ; Set type to string -3256 14EF CD 65 1A CALL DETHL4 ; Move string to pool -3257 14F2 CD 2B 0A CALL CPDEHL ; Out of string pool? -3258 14F5 22 61 31 LD (TMSTPT),HL ; Save new pointer -3259 14F8 E1 POP HL ; Restore code string address -3260 14F9 7E LD A,(HL) ; Get next code byte -3261 14FA C0 RET NZ ; Return if pool OK -3262 14FB 1E 1E LD E,ST ; ?ST Error -3263 14FD C3 77 07 JP ERROR ; String pool overflow -3264 1500 -3265 1500 23 PRNUMS: INC HL ; Skip leading space -3266 1501 CD BF 14 PRS: CALL CRTST ; Create string entry for it -3267 1504 CD 44 16 PRS1: CALL GSTRCU ; Current string to pool -3268 1507 CD 59 1A CALL LOADFP ; Move string block to BCDE -3269 150A 1C INC E ; Length + 1 -3270 150B 1D PRSLP: DEC E ; Count characters -3271 150C C8 RET Z ; End of string -3272 150D 0A LD A,(BC) ; Get byte to output -3273 150E CD 3C 0A CALL OUTC ; Output character in A -3274 1511 FE 0D CP CR ; Return? -3275 1513 CC 6D 0E CALL Z,DONULL ; Yes - Do nulls -3276 1516 03 INC BC ; Next byte in string -3277 1517 C3 0B 15 JP PRSLP ; More characters to output -3278 151A -3279 151A B7 TESTR: OR A ; Test if enough room -3280 151B 0E .BYTE 0EH ; No garbage collection done -3281 151C F1 GRBDON: POP AF ; Garbage collection done -3282 151D F5 PUSH AF ; Save status -3283 151E 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use -3284 1521 EB EX DE,HL ; To DE -3285 1522 2A 73 31 LD HL,(STRBOT) ; Bottom of string area -3286 1525 2F CPL ; Negate length (Top down) -3287 1526 4F LD C,A ; -Length to BC -3288 1527 06 FF LD B,-1 ; BC = -ve length of string -3289 1529 09 ADD HL,BC ; Add to bottom of space in use -3290 152A 23 INC HL ; Plus one for 2's complement -3291 152B CD 2B 0A CALL CPDEHL ; Below string RAM area? -3292 152E DA 38 15 JP C,TESTOS ; Tidy up if not done else err -3293 1531 22 73 31 LD (STRBOT),HL ; Save new bottom of area -3294 1534 23 INC HL ; Point to first byte of string -3295 1535 EB EX DE,HL ; Address to DE -3296 1536 F1 POPAF: POP AF ; Throw away status push -3297 1537 C9 RET -3298 1538 -3299 1538 F1 TESTOS: POP AF ; Garbage collect been done? -3300 1539 1E 1A LD E,OS ; ?OS Error -3301 153B CA 77 07 JP Z,ERROR ; Yes - Not enough string apace -3302 153E BF CP A ; Flag garbage collect done -3303 153F F5 PUSH AF ; Save status -3304 1540 01 1C 15 LD BC,GRBDON ; Garbage collection done -3305 1543 C5 PUSH BC ; Save for RETurn -3306 1544 2A 5F 31 GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer -3307 1547 22 73 31 GARBLP: LD (STRBOT),HL ; Reset string pointer -3308 154A 21 00 00 LD HL,0 -3309 154D E5 PUSH HL ; Flag no string found -3310 154E 2A 0A 31 LD HL,(STRSPC) ; Get bottom of string space -3311 1551 E5 PUSH HL ; Save bottom of string space -3312 1552 21 63 31 LD HL,TMSTPL ; Temporary string pool -3313 1555 EB GRBLP: EX DE,HL -3314 1556 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer -3315 1559 EB EX DE,HL -3316 155A CD 2B 0A CALL CPDEHL ; Temporary string pool done? -3317 155D 01 55 15 LD BC,GRBLP ; Loop until string pool done -3318 1560 C2 A9 15 JP NZ,STPOOL ; No - See if in string area -3319 1563 2A 86 31 LD HL,(PROGND) ; Start of simple variables -3320 1566 EB SMPVAR: EX DE,HL -3321 1567 2A 88 31 LD HL,(VAREND) ; End of simple variables -3322 156A EB EX DE,HL -3323 156B CD 2B 0A CALL CPDEHL ; All simple strings done? -3324 156E CA 7C 15 JP Z,ARRLP ; Yes - Do string arrays -3325 1571 7E LD A,(HL) ; Get type of variable -3326 1572 23 INC HL -3327 1573 23 INC HL -3328 1574 B7 OR A ; "S" flag set if string -3329 1575 CD AC 15 CALL STRADD ; See if string in string area -3330 1578 C3 66 15 JP SMPVAR ; Loop until simple ones done -3331 157B -3332 157B C1 GNXARY: POP BC ; Scrap address of this array -3333 157C EB ARRLP: EX DE,HL -3334 157D 2A 8A 31 LD HL,(ARREND) ; End of string arrays -3335 1580 EB EX DE,HL -3336 1581 CD 2B 0A CALL CPDEHL ; All string arrays done? -3337 1584 CA D2 15 JP Z,SCNEND ; Yes - Move string if found -3338 1587 CD 59 1A CALL LOADFP ; Get array name to BCDE -3339 158A 7B LD A,E ; Get type of array -3340 158B E5 PUSH HL ; Save address of num of dim'ns -3341 158C 09 ADD HL,BC ; Start of next array -3342 158D B7 OR A ; Test type of array -3343 158E F2 7B 15 JP P,GNXARY ; Numeric array - Ignore it -3344 1591 22 75 31 LD (CUROPR),HL ; Save address of next array -3345 1594 E1 POP HL ; Get address of num of dim'ns -3346 1595 4E LD C,(HL) ; BC = Number of dimensions -3347 1596 06 00 LD B,0 -3348 1598 09 ADD HL,BC ; Two bytes per dimension size -3349 1599 09 ADD HL,BC -3350 159A 23 INC HL ; Plus one for number of dim'ns -3351 159B EB GRBARY: EX DE,HL -3352 159C 2A 75 31 LD HL,(CUROPR) ; Get address of next array -3353 159F EB EX DE,HL -3354 15A0 CD 2B 0A CALL CPDEHL ; Is this array finished? -3355 15A3 CA 7C 15 JP Z,ARRLP ; Yes - Get next one -3356 15A6 01 9B 15 LD BC,GRBARY ; Loop until array all done -3357 15A9 C5 STPOOL: PUSH BC ; Save return address -3358 15AA F6 80 OR 80H ; Flag string type -3359 15AC 7E STRADD: LD A,(HL) ; Get string length -3360 15AD 23 INC HL -3361 15AE 23 INC HL -3362 15AF 5E LD E,(HL) ; Get LSB of string address -3363 15B0 23 INC HL -3364 15B1 56 LD D,(HL) ; Get MSB of string address -3365 15B2 23 INC HL -3366 15B3 F0 RET P ; Not a string - Return -3367 15B4 B7 OR A ; Set flags on string length -3368 15B5 C8 RET Z ; Null string - Return -3369 15B6 44 LD B,H ; Save variable pointer -3370 15B7 4D LD C,L -3371 15B8 2A 73 31 LD HL,(STRBOT) ; Bottom of new area -3372 15BB CD 2B 0A CALL CPDEHL ; String been done? -3373 15BE 60 LD H,B ; Restore variable pointer -3374 15BF 69 LD L,C -3375 15C0 D8 RET C ; String done - Ignore -3376 15C1 E1 POP HL ; Return address -3377 15C2 E3 EX (SP),HL ; Lowest available string area -3378 15C3 CD 2B 0A CALL CPDEHL ; String within string area? -3379 15C6 E3 EX (SP),HL ; Lowest available string area -3380 15C7 E5 PUSH HL ; Re-save return address -3381 15C8 60 LD H,B ; Restore variable pointer -3382 15C9 69 LD L,C -3383 15CA D0 RET NC ; Outside string area - Ignore -3384 15CB C1 POP BC ; Get return , Throw 2 away -3385 15CC F1 POP AF ; -3386 15CD F1 POP AF ; -3387 15CE E5 PUSH HL ; Save variable pointer -3388 15CF D5 PUSH DE ; Save address of current -3389 15D0 C5 PUSH BC ; Put back return address -3390 15D1 C9 RET ; Go to it -3391 15D2 -3392 15D2 D1 SCNEND: POP DE ; Addresses of strings -3393 15D3 E1 POP HL ; -3394 15D4 7D LD A,L ; HL = 0 if no more to do -3395 15D5 B4 OR H -3396 15D6 C8 RET Z ; No more to do - Return -3397 15D7 2B DEC HL -3398 15D8 46 LD B,(HL) ; MSB of address of string -3399 15D9 2B DEC HL -3400 15DA 4E LD C,(HL) ; LSB of address of string -3401 15DB E5 PUSH HL ; Save variable address -3402 15DC 2B DEC HL -3403 15DD 2B DEC HL -3404 15DE 6E LD L,(HL) ; HL = Length of string -3405 15DF 26 00 LD H,0 -3406 15E1 09 ADD HL,BC ; Address of end of string+1 -3407 15E2 50 LD D,B ; String address to DE -3408 15E3 59 LD E,C -3409 15E4 2B DEC HL ; Last byte in string -3410 15E5 44 LD B,H ; Address to BC -3411 15E6 4D LD C,L -3412 15E7 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area -3413 15EA CD 32 07 CALL MOVSTR ; Move string to new address -3414 15ED E1 POP HL ; Restore variable address -3415 15EE 71 LD (HL),C ; Save new LSB of address -3416 15EF 23 INC HL -3417 15F0 70 LD (HL),B ; Save new MSB of address -3418 15F1 69 LD L,C ; Next string area+1 to HL -3419 15F2 60 LD H,B -3420 15F3 2B DEC HL ; Next string area address -3421 15F4 C3 47 15 JP GARBLP ; Look for more strings -3422 15F7 -3423 15F7 C5 CONCAT: PUSH BC ; Save prec' opr & code string -3424 15F8 E5 PUSH HL ; -3425 15F9 2A 94 31 LD HL,(FPREG) ; Get first string -3426 15FC E3 EX (SP),HL ; Save first string -3427 15FD CD B1 10 CALL OPRND ; Get second string -3428 1600 E3 EX (SP),HL ; Restore first string -3429 1601 CD 2C 10 CALL TSTSTR ; Make sure it's a string -3430 1604 7E LD A,(HL) ; Get length of second string -3431 1605 E5 PUSH HL ; Save first string -3432 1606 2A 94 31 LD HL,(FPREG) ; Get second string -3433 1609 E5 PUSH HL ; Save second string -3434 160A 86 ADD A,(HL) ; Add length of second string -3435 160B 1E 1C LD E,LS ; ?LS Error -3436 160D DA 77 07 JP C,ERROR ; String too long - Error -3437 1610 CD B0 14 CALL MKTMST ; Make temporary string -3438 1613 D1 POP DE ; Get second string to DE -3439 1614 CD 48 16 CALL GSTRDE ; Move to string pool if needed -3440 1617 E3 EX (SP),HL ; Get first string -3441 1618 CD 47 16 CALL GSTRHL ; Move to string pool if needed -3442 161B E5 PUSH HL ; Save first string -3443 161C 2A 71 31 LD HL,(TMPSTR+2) ; Temporary string address -3444 161F EB EX DE,HL ; To DE -3445 1620 CD 2E 16 CALL SSTSA ; First string to string area -3446 1623 CD 2E 16 CALL SSTSA ; Second string to string area -3447 1626 21 46 10 LD HL,EVAL2 ; Return to evaluation loop -3448 1629 E3 EX (SP),HL ; Save return,get code string -3449 162A E5 PUSH HL ; Save code string address -3450 162B C3 E1 14 JP TSTOPL ; To temporary string to pool -3451 162E -3452 162E E1 SSTSA: POP HL ; Return address -3453 162F E3 EX (SP),HL ; Get string block,save return -3454 1630 7E LD A,(HL) ; Get length of string -3455 1631 23 INC HL -3456 1632 23 INC HL -3457 1633 4E LD C,(HL) ; Get LSB of string address -3458 1634 23 INC HL -3459 1635 46 LD B,(HL) ; Get MSB of string address -3460 1636 6F LD L,A ; Length to L -3461 1637 2C TOSTRA: INC L ; INC - DECed after -3462 1638 2D TSALP: DEC L ; Count bytes moved -3463 1639 C8 RET Z ; End of string - Return -3464 163A 0A LD A,(BC) ; Get source -3465 163B 12 LD (DE),A ; Save destination -3466 163C 03 INC BC ; Next source -3467 163D 13 INC DE ; Next destination -3468 163E C3 38 16 JP TSALP ; Loop until string moved -3469 1641 -3470 1641 CD 2C 10 GETSTR: CALL TSTSTR ; Make sure it's a string -3471 1644 2A 94 31 GSTRCU: LD HL,(FPREG) ; Get current string -3472 1647 EB GSTRHL: EX DE,HL ; Save DE -3473 1648 CD 62 16 GSTRDE: CALL BAKTMP ; Was it last tmp-str? -3474 164B EB EX DE,HL ; Restore DE -3475 164C C0 RET NZ ; No - Return -3476 164D D5 PUSH DE ; Save string -3477 164E 50 LD D,B ; String block address to DE -3478 164F 59 LD E,C -3479 1650 1B DEC DE ; Point to length -3480 1651 4E LD C,(HL) ; Get string length -3481 1652 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area -3482 1655 CD 2B 0A CALL CPDEHL ; Last one in string area? -3483 1658 C2 60 16 JP NZ,POPHL ; No - Return -3484 165B 47 LD B,A ; Clear B (A=0) -3485 165C 09 ADD HL,BC ; Remove string from str' area -3486 165D 22 73 31 LD (STRBOT),HL ; Save new bottom of str' area -3487 1660 E1 POPHL: POP HL ; Restore string -3488 1661 C9 RET -3489 1662 -3490 1662 2A 61 31 BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top -3491 1665 2B DEC HL ; Back -3492 1666 46 LD B,(HL) ; Get MSB of address -3493 1667 2B DEC HL ; Back -3494 1668 4E LD C,(HL) ; Get LSB of address -3495 1669 2B DEC HL ; Back -3496 166A 2B DEC HL ; Back -3497 166B CD 2B 0A CALL CPDEHL ; String last in string pool? -3498 166E C0 RET NZ ; Yes - Leave it -3499 166F 22 61 31 LD (TMSTPT),HL ; Save new string pool top -3500 1672 C9 RET -3501 1673 -3502 1673 01 F2 13 LEN: LD BC,PASSA ; To return integer A -3503 1676 C5 PUSH BC ; Save address -3504 1677 CD 41 16 GETLEN: CALL GETSTR ; Get string and its length -3505 167A AF XOR A -3506 167B 57 LD D,A ; Clear D -3507 167C 32 5D 31 LD (TYPE),A ; Set type to numeric -3508 167F 7E LD A,(HL) ; Get length of string -3509 1680 B7 OR A ; Set status flags -3510 1681 C9 RET -3511 1682 -3512 1682 01 F2 13 ASC: LD BC,PASSA ; To return integer A -3513 1685 C5 PUSH BC ; Save address -3514 1686 CD 77 16 GTFLNM: CALL GETLEN ; Get length of string -3515 1689 CA 82 0C JP Z,FCERR ; Null string - Error -3516 168C 23 INC HL -3517 168D 23 INC HL -3518 168E 5E LD E,(HL) ; Get LSB of address -3519 168F 23 INC HL -3520 1690 56 LD D,(HL) ; Get MSB of address -3521 1691 1A LD A,(DE) ; Get first byte of string -3522 1692 C9 RET -3523 1693 -3524 1693 3E 01 CHR: LD A,1 ; One character string -3525 1695 CD B0 14 CALL MKTMST ; Make a temporary string -3526 1698 CD 8C 17 CALL MAKINT ; Make it integer A -3527 169B 2A 71 31 LD HL,(TMPSTR+2) ; Get address of string -3528 169E 73 LD (HL),E ; Save character -3529 169F C1 TOPOOL: POP BC ; Clean up stack -3530 16A0 C3 E1 14 JP TSTOPL ; Temporary string to pool -3531 16A3 -3532 16A3 CD 3C 17 LEFT: CALL LFRGNM ; Get number and ending ")" -3533 16A6 AF XOR A ; Start at first byte in string -3534 16A7 E3 RIGHT1: EX (SP),HL ; Save code string,Get string -3535 16A8 4F LD C,A ; Starting position in string -3536 16A9 E5 MID1: PUSH HL ; Save string block address -3537 16AA 7E LD A,(HL) ; Get length of string -3538 16AB B8 CP B ; Compare with number given -3539 16AC DA B1 16 JP C,ALLFOL ; All following bytes required -3540 16AF 78 LD A,B ; Get new length -3541 16B0 11 .BYTE 11H ; Skip "LD C,0" -3542 16B1 0E 00 ALLFOL: LD C,0 ; First byte of string -3543 16B3 C5 PUSH BC ; Save position in string -3544 16B4 CD 1A 15 CALL TESTR ; See if enough string space -3545 16B7 C1 POP BC ; Get position in string -3546 16B8 E1 POP HL ; Restore string block address -3547 16B9 E5 PUSH HL ; And re-save it -3548 16BA 23 INC HL -3549 16BB 23 INC HL -3550 16BC 46 LD B,(HL) ; Get LSB of address -3551 16BD 23 INC HL -3552 16BE 66 LD H,(HL) ; Get MSB of address -3553 16BF 68 LD L,B ; HL = address of string -3554 16C0 06 00 LD B,0 ; BC = starting address -3555 16C2 09 ADD HL,BC ; Point to that byte -3556 16C3 44 LD B,H ; BC = source string -3557 16C4 4D LD C,L -3558 16C5 CD B3 14 CALL CRTMST ; Create a string entry -3559 16C8 6F LD L,A ; Length of new string -3560 16C9 CD 37 16 CALL TOSTRA ; Move string to string area -3561 16CC D1 POP DE ; Clear stack -3562 16CD CD 48 16 CALL GSTRDE ; Move to string pool if needed -3563 16D0 C3 E1 14 JP TSTOPL ; Temporary string to pool -3564 16D3 -3565 16D3 CD 3C 17 RIGHT: CALL LFRGNM ; Get number and ending ")" -3566 16D6 D1 POP DE ; Get string length -3567 16D7 D5 PUSH DE ; And re-save -3568 16D8 1A LD A,(DE) ; Get length -3569 16D9 90 SUB B ; Move back N bytes -3570 16DA C3 A7 16 JP RIGHT1 ; Go and get sub-string -3571 16DD -3572 16DD EB MID: EX DE,HL ; Get code string address -3573 16DE 7E LD A,(HL) ; Get next byte ',' or ")" -3574 16DF CD 41 17 CALL MIDNUM ; Get number supplied -3575 16E2 04 INC B ; Is it character zero? -3576 16E3 05 DEC B -3577 16E4 CA 82 0C JP Z,FCERR ; Yes - Error -3578 16E7 C5 PUSH BC ; Save starting position -3579 16E8 1E FF LD E,255 ; All of string -3580 16EA FE 29 CP ')' ; Any length given? -3581 16EC CA F6 16 JP Z,RSTSTR ; No - Rest of string -3582 16EF CD 31 0A CALL CHKSYN ; Make sure ',' follows -3583 16F2 2C .BYTE ',' -3584 16F3 CD 89 17 CALL GETINT ; Get integer 0-255 -3585 16F6 CD 31 0A RSTSTR: CALL CHKSYN ; Make sure ")" follows -3586 16F9 29 .BYTE ")" -3587 16FA F1 POP AF ; Restore starting position -3588 16FB E3 EX (SP),HL ; Get string,8ave code string -3589 16FC 01 A9 16 LD BC,MID1 ; Continuation of MID$ routine -3590 16FF C5 PUSH BC ; Save for return -3591 1700 3D DEC A ; Starting position-1 -3592 1701 BE CP (HL) ; Compare with length -3593 1702 06 00 LD B,0 ; Zero bytes length -3594 1704 D0 RET NC ; Null string if start past end -3595 1705 4F LD C,A ; Save starting position-1 -3596 1706 7E LD A,(HL) ; Get length of string -3597 1707 91 SUB C ; Subtract start -3598 1708 BB CP E ; Enough string for it? -3599 1709 47 LD B,A ; Save maximum length available -3600 170A D8 RET C ; Truncate string if needed -3601 170B 43 LD B,E ; Set specified length -3602 170C C9 RET ; Go and create string -3603 170D -3604 170D CD 77 16 VAL: CALL GETLEN ; Get length of string -3605 1710 CA 2A 18 JP Z,RESZER ; Result zero -3606 1713 5F LD E,A ; Save length -3607 1714 23 INC HL -3608 1715 23 INC HL -3609 1716 7E LD A,(HL) ; Get LSB of address -3610 1717 23 INC HL -3611 1718 66 LD H,(HL) ; Get MSB of address -3612 1719 6F LD L,A ; HL = String address -3613 171A E5 PUSH HL ; Save string address -3614 171B 19 ADD HL,DE -3615 171C 46 LD B,(HL) ; Get end of string+1 byte -3616 171D 72 LD (HL),D ; Zero it to terminate -3617 171E E3 EX (SP),HL ; Save string end,get start -3618 171F C5 PUSH BC ; Save end+1 byte -3619 1720 7E LD A,(HL) ; Get starting byte -3620 1721 FE 24 CP '$' ; Hex number indicated? [function added] -3621 1723 C2 2B 17 JP NZ,VAL1 -3622 1726 CD 55 1F CALL HEXTFP ; Convert Hex to FPREG -3623 1729 18 0D JR VAL3 -3624 172B FE 25 VAL1: CP '%' ; Binary number indicated? [function added] -3625 172D C2 35 17 JP NZ,VAL2 -3626 1730 CD C5 1F CALL BINTFP ; Convert Bin to FPREG -3627 1733 18 03 JR VAL3 -3628 1735 CD 11 1B VAL2: CALL ASCTFP ; Convert ASCII string to FP -3629 1738 C1 VAL3: POP BC ; Restore end+1 byte -3630 1739 E1 POP HL ; Restore end+1 address -3631 173A 70 LD (HL),B ; Put back original byte -3632 173B C9 RET -3633 173C -3634 173C EB LFRGNM: EX DE,HL ; Code string address to HL -3635 173D CD 31 0A CALL CHKSYN ; Make sure ")" follows -3636 1740 29 .BYTE ")" -3637 1741 C1 MIDNUM: POP BC ; Get return address -3638 1742 D1 POP DE ; Get number supplied -3639 1743 C5 PUSH BC ; Re-save return address -3640 1744 43 LD B,E ; Number to B -3641 1745 C9 RET -3642 1746 -3643 1746 CD 8C 17 INP: CALL MAKINT ; Make it integer A -3644 1749 32 EF 30 LD (INPORT),A ; Set input port -3645 174C CD EE 30 CALL INPSUB ; Get input from port -3646 174F C3 F2 13 JP PASSA ; Return integer A -3647 1752 -3648 1752 CD 76 17 POUT: CALL SETIO ; Set up port number -3649 1755 C3 B6 30 JP OUTSUB ; Output data and return -3650 1758 -3651 1758 CD 76 17 WAIT: CALL SETIO ; Set up port number -3652 175B F5 PUSH AF ; Save AND mask -3653 175C 1E 00 LD E,0 ; Assume zero if none given -3654 175E 2B DEC HL ; DEC 'cos GETCHR INCs -3655 175F CD BB 0B CALL GETCHR ; Get next character -3656 1762 CA 6C 17 JP Z,NOXOR ; No XOR byte given -3657 1765 CD 31 0A CALL CHKSYN ; Make sure ',' follows -3658 1768 2C .BYTE ',' -3659 1769 CD 89 17 CALL GETINT ; Get integer 0-255 to XOR with -3660 176C C1 NOXOR: POP BC ; Restore AND mask -3661 176D CD EE 30 WAITLP: CALL INPSUB ; Get input -3662 1770 AB XOR E ; Flip selected bits -3663 1771 A0 AND B ; Result non-zero? -3664 1772 CA 6D 17 JP Z,WAITLP ; No = keep waiting -3665 1775 C9 RET -3666 1776 -3667 1776 CD 89 17 SETIO: CALL GETINT ; Get integer 0-255 -3668 1779 32 EF 30 LD (INPORT),A ; Set input port -3669 177C 32 B7 30 LD (OTPORT),A ; Set output port -3670 177F CD 31 0A CALL CHKSYN ; Make sure ',' follows -3671 1782 2C .BYTE ',' -3672 1783 C3 89 17 JP GETINT ; Get integer 0-255 and return -3673 1786 -3674 1786 CD BB 0B FNDNUM: CALL GETCHR ; Get next character -3675 1789 CD 28 10 GETINT: CALL GETNUM ; Get a number from 0 to 255 -3676 178C CD 67 0C MAKINT: CALL DEPINT ; Make sure value 0 - 255 -3677 178F 7A LD A,D ; Get MSB of number -3678 1790 B7 OR A ; Zero? -3679 1791 C2 82 0C JP NZ,FCERR ; No - Error -3680 1794 2B DEC HL ; DEC 'cos GETCHR INCs -3681 1795 CD BB 0B CALL GETCHR ; Get next character -3682 1798 7B LD A,E ; Get number to A -3683 1799 C9 RET -3684 179A -3685 179A CD 6D 0C PEEK: CALL DEINT ; Get memory address -3686 179D 1A LD A,(DE) ; Get byte in memory -3687 179E C3 F2 13 JP PASSA ; Return integer A -3688 17A1 -3689 17A1 CD 28 10 POKE: CALL GETNUM ; Get memory address -3690 17A4 CD 6D 0C CALL DEINT ; Get integer -32768 to 3276 -3691 17A7 D5 PUSH DE ; Save memory address -3692 17A8 CD 31 0A CALL CHKSYN ; Make sure ',' follows -3693 17AB 2C .BYTE ',' -3694 17AC CD 89 17 CALL GETINT ; Get integer 0-255 -3695 17AF D1 POP DE ; Restore memory address -3696 17B0 12 LD (DE),A ; Load it into memory -3697 17B1 C9 RET -3698 17B2 -3699 17B2 21 88 1C ROUND: LD HL,HALF ; Add 0.5 to FPREG -3700 17B5 CD 59 1A ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE -3701 17B8 C3 C4 17 JP FPADD ; Add BCDE to FPREG -3702 17BB -3703 17BB CD 59 1A SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL -3704 17BE 21 .BYTE 21H ; Skip "POP BC" and "POP DE" -3705 17BF C1 PSUB: POP BC ; Get FP number from stack -3706 17C0 D1 POP DE -3707 17C1 CD 33 1A SUBCDE: CALL INVSGN ; Negate FPREG -3708 17C4 78 FPADD: LD A,B ; Get FP exponent -3709 17C5 B7 OR A ; Is number zero? -3710 17C6 C8 RET Z ; Yes - Nothing to add -3711 17C7 3A 97 31 LD A,(FPEXP) ; Get FPREG exponent -3712 17CA B7 OR A ; Is this number zero? -3713 17CB CA 4B 1A JP Z,FPBCDE ; Yes - Move BCDE to FPREG -3714 17CE 90 SUB B ; BCDE number larger? -3715 17CF D2 DE 17 JP NC,NOSWAP ; No - Don't swap them -3716 17D2 2F CPL ; Two's complement -3717 17D3 3C INC A ; FP exponent -3718 17D4 EB EX DE,HL -3719 17D5 CD 3B 1A CALL STAKFP ; Put FPREG on stack -3720 17D8 EB EX DE,HL -3721 17D9 CD 4B 1A CALL FPBCDE ; Move BCDE to FPREG -3722 17DC C1 POP BC ; Restore number from stack -3723 17DD D1 POP DE -3724 17DE FE 19 NOSWAP: CP 24+1 ; Second number insignificant? -3725 17E0 D0 RET NC ; Yes - First number is result -3726 17E1 F5 PUSH AF ; Save number of bits to scale -3727 17E2 CD 70 1A CALL SIGNS ; Set MSBs & sign of result -3728 17E5 67 LD H,A ; Save sign of result -3729 17E6 F1 POP AF ; Restore scaling factor -3730 17E7 CD 89 18 CALL SCALE ; Scale BCDE to same exponent -3731 17EA B4 OR H ; Result to be positive? -3732 17EB 21 94 31 LD HL,FPREG ; Point to FPREG -3733 17EE F2 04 18 JP P,MINCDE ; No - Subtract FPREG from CDE -3734 17F1 CD 69 18 CALL PLUCDE ; Add FPREG to CDE -3735 17F4 D2 4A 18 JP NC,RONDUP ; No overflow - Round it up -3736 17F7 23 INC HL ; Point to exponent -3737 17F8 34 INC (HL) ; Increment it -3738 17F9 CA 72 07 JP Z,OVERR ; Number overflowed - Error -3739 17FC 2E 01 LD L,1 ; 1 bit to shift right -3740 17FE CD 9F 18 CALL SHRT1 ; Shift result right -3741 1801 C3 4A 18 JP RONDUP ; Round it up -3742 1804 -3743 1804 AF MINCDE: XOR A ; Clear A and carry -3744 1805 90 SUB B ; Negate exponent -3745 1806 47 LD B,A ; Re-save exponent -3746 1807 7E LD A,(HL) ; Get LSB of FPREG -3747 1808 9B SBC A, E ; Subtract LSB of BCDE -3748 1809 5F LD E,A ; Save LSB of BCDE -3749 180A 23 INC HL -3750 180B 7E LD A,(HL) ; Get NMSB of FPREG -3751 180C 9A SBC A,D ; Subtract NMSB of BCDE -3752 180D 57 LD D,A ; Save NMSB of BCDE -3753 180E 23 INC HL -3754 180F 7E LD A,(HL) ; Get MSB of FPREG -3755 1810 99 SBC A,C ; Subtract MSB of BCDE -3756 1811 4F LD C,A ; Save MSB of BCDE -3757 1812 DC 75 18 CONPOS: CALL C,COMPL ; Overflow - Make it positive -3758 1815 -3759 1815 68 BNORM: LD L,B ; L = Exponent -3760 1816 63 LD H,E ; H = LSB -3761 1817 AF XOR A -3762 1818 47 BNRMLP: LD B,A ; Save bit count -3763 1819 79 LD A,C ; Get MSB -3764 181A B7 OR A ; Is it zero? -3765 181B C2 37 18 JP NZ,PNORM ; No - Do it bit at a time -3766 181E 4A LD C,D ; MSB = NMSB -3767 181F 54 LD D,H ; NMSB= LSB -3768 1820 65 LD H,L ; LSB = VLSB -3769 1821 6F LD L,A ; VLSB= 0 -3770 1822 78 LD A,B ; Get exponent -3771 1823 D6 08 SUB 8 ; Count 8 bits -3772 1825 FE E0 CP -24-8 ; Was number zero? -3773 1827 C2 18 18 JP NZ,BNRMLP ; No - Keep normalising -3774 182A AF RESZER: XOR A ; Result is zero -3775 182B 32 97 31 SAVEXP: LD (FPEXP),A ; Save result as zero -3776 182E C9 RET -3777 182F -3778 182F 05 NORMAL: DEC B ; Count bits -3779 1830 29 ADD HL,HL ; Shift HL left -3780 1831 7A LD A,D ; Get NMSB -3781 1832 17 RLA ; Shift left with last bit -3782 1833 57 LD D,A ; Save NMSB -3783 1834 79 LD A,C ; Get MSB -3784 1835 8F ADC A,A ; Shift left with last bit -3785 1836 4F LD C,A ; Save MSB -3786 1837 F2 2F 18 PNORM: JP P,NORMAL ; Not done - Keep going -3787 183A 78 LD A,B ; Number of bits shifted -3788 183B 5C LD E,H ; Save HL in EB -3789 183C 45 LD B,L -3790 183D B7 OR A ; Any shifting done? -3791 183E CA 4A 18 JP Z,RONDUP ; No - Round it up -3792 1841 21 97 31 LD HL,FPEXP ; Point to exponent -3793 1844 86 ADD A,(HL) ; Add shifted bits -3794 1845 77 LD (HL),A ; Re-save exponent -3795 1846 D2 2A 18 JP NC,RESZER ; Underflow - Result is zero -3796 1849 C8 RET Z ; Result is zero -3797 184A 78 RONDUP: LD A,B ; Get VLSB of number -3798 184B 21 97 31 RONDB: LD HL,FPEXP ; Point to exponent -3799 184E B7 OR A ; Any rounding? -3800 184F FC 5C 18 CALL M,FPROND ; Yes - Round number up -3801 1852 46 LD B,(HL) ; B = Exponent -3802 1853 23 INC HL -3803 1854 7E LD A,(HL) ; Get sign of result -3804 1855 E6 80 AND 10000000B ; Only bit 7 needed -3805 1857 A9 XOR C ; Set correct sign -3806 1858 4F LD C,A ; Save correct sign in number -3807 1859 C3 4B 1A JP FPBCDE ; Move BCDE to FPREG -3808 185C -3809 185C 1C FPROND: INC E ; Round LSB -3810 185D C0 RET NZ ; Return if ok -3811 185E 14 INC D ; Round NMSB -3812 185F C0 RET NZ ; Return if ok -3813 1860 0C INC C ; Round MSB -3814 1861 C0 RET NZ ; Return if ok -3815 1862 0E 80 LD C,80H ; Set normal value -3816 1864 34 INC (HL) ; Increment exponent -3817 1865 C0 RET NZ ; Return if ok -3818 1866 C3 72 07 JP OVERR ; Overflow error -3819 1869 -3820 1869 7E PLUCDE: LD A,(HL) ; Get LSB of FPREG -3821 186A 83 ADD A,E ; Add LSB of BCDE -3822 186B 5F LD E,A ; Save LSB of BCDE -3823 186C 23 INC HL -3824 186D 7E LD A,(HL) ; Get NMSB of FPREG -3825 186E 8A ADC A,D ; Add NMSB of BCDE -3826 186F 57 LD D,A ; Save NMSB of BCDE -3827 1870 23 INC HL -3828 1871 7E LD A,(HL) ; Get MSB of FPREG -3829 1872 89 ADC A,C ; Add MSB of BCDE -3830 1873 4F LD C,A ; Save MSB of BCDE -3831 1874 C9 RET -3832 1875 -3833 1875 21 98 31 COMPL: LD HL,SGNRES ; Sign of result -3834 1878 7E LD A,(HL) ; Get sign of result -3835 1879 2F CPL ; Negate it -3836 187A 77 LD (HL),A ; Put it back -3837 187B AF XOR A -3838 187C 6F LD L,A ; Set L to zero -3839 187D 90 SUB B ; Negate exponent,set carry -3840 187E 47 LD B,A ; Re-save exponent -3841 187F 7D LD A,L ; Load zero -3842 1880 9B SBC A,E ; Negate LSB -3843 1881 5F LD E,A ; Re-save LSB -3844 1882 7D LD A,L ; Load zero -3845 1883 9A SBC A,D ; Negate NMSB -3846 1884 57 LD D,A ; Re-save NMSB -3847 1885 7D LD A,L ; Load zero -3848 1886 99 SBC A,C ; Negate MSB -3849 1887 4F LD C,A ; Re-save MSB -3850 1888 C9 RET -3851 1889 -3852 1889 06 00 SCALE: LD B,0 ; Clear underflow -3853 188B D6 08 SCALLP: SUB 8 ; 8 bits (a whole byte)? -3854 188D DA 98 18 JP C,SHRITE ; No - Shift right A bits -3855 1890 43 LD B,E ; <- Shift -3856 1891 5A LD E,D ; <- right -3857 1892 51 LD D,C ; <- eight -3858 1893 0E 00 LD C,0 ; <- bits -3859 1895 C3 8B 18 JP SCALLP ; More bits to shift -3860 1898 -3861 1898 C6 09 SHRITE: ADD A,8+1 ; Adjust count -3862 189A 6F LD L,A ; Save bits to shift -3863 189B AF SHRLP: XOR A ; Flag for all done -3864 189C 2D DEC L ; All shifting done? -3865 189D C8 RET Z ; Yes - Return -3866 189E 79 LD A,C ; Get MSB -3867 189F 1F SHRT1: RRA ; Shift it right -3868 18A0 4F LD C,A ; Re-save -3869 18A1 7A LD A,D ; Get NMSB -3870 18A2 1F RRA ; Shift right with last bit -3871 18A3 57 LD D,A ; Re-save it -3872 18A4 7B LD A,E ; Get LSB -3873 18A5 1F RRA ; Shift right with last bit -3874 18A6 5F LD E,A ; Re-save it -3875 18A7 78 LD A,B ; Get underflow -3876 18A8 1F RRA ; Shift right with last bit -3877 18A9 47 LD B,A ; Re-save underflow -3878 18AA C3 9B 18 JP SHRLP ; More bits to do -3879 18AD -3880 18AD 00 00 00 81 UNITY: .BYTE 000H,000H,000H,081H ; 1.00000 -3881 18B1 -3882 18B1 03 LOGTAB: .BYTE 3 ; Table used by LOG -3883 18B2 AA 56 19 80 .BYTE 0AAH,056H,019H,080H ; 0.59898 -3884 18B6 F1 22 76 80 .BYTE 0F1H,022H,076H,080H ; 0.96147 -3885 18BA 45 AA 38 82 .BYTE 045H,0AAH,038H,082H ; 2.88539 -3886 18BE -3887 18BE CD 0A 1A LOG: CALL TSTSGN ; Test sign of value -3888 18C1 B7 OR A -3889 18C2 EA 82 0C JP PE,FCERR ; ?FC Error if <= zero -3890 18C5 21 97 31 LD HL,FPEXP ; Point to exponent -3891 18C8 7E LD A,(HL) ; Get exponent -3892 18C9 01 35 80 LD BC,8035H ; BCDE = SQR(1/2) -3893 18CC 11 F3 04 LD DE,04F3H -3894 18CF 90 SUB B ; Scale value to be < 1 -3895 18D0 F5 PUSH AF ; Save scale factor -3896 18D1 70 LD (HL),B ; Save new exponent -3897 18D2 D5 PUSH DE ; Save SQR(1/2) -3898 18D3 C5 PUSH BC -3899 18D4 CD C4 17 CALL FPADD ; Add SQR(1/2) to value -3900 18D7 C1 POP BC ; Restore SQR(1/2) -3901 18D8 D1 POP DE -3902 18D9 04 INC B ; Make it SQR(2) -3903 18DA CD 60 19 CALL DVBCDE ; Divide by SQR(2) -3904 18DD 21 AD 18 LD HL,UNITY ; Point to 1. -3905 18E0 CD BB 17 CALL SUBPHL ; Subtract FPREG from 1 -3906 18E3 21 B1 18 LD HL,LOGTAB ; Coefficient table -3907 18E6 CD 52 1D CALL SUMSER ; Evaluate sum of series -3908 18E9 01 80 80 LD BC,8080H ; BCDE = -0.5 -3909 18EC 11 00 00 LD DE,0000H -3910 18EF CD C4 17 CALL FPADD ; Subtract 0.5 from FPREG -3911 18F2 F1 POP AF ; Restore scale factor -3912 18F3 CD 85 1B CALL RSCALE ; Re-scale number -3913 18F6 01 31 80 MULLN2: LD BC,8031H ; BCDE = Ln(2) -3914 18F9 11 18 72 LD DE,7218H -3915 18FC 21 .BYTE 21H ; Skip "POP BC" and "POP DE" -3916 18FD -3917 18FD C1 MULT: POP BC ; Get number from stack -3918 18FE D1 POP DE -3919 18FF CD 0A 1A FPMULT: CALL TSTSGN ; Test sign of FPREG -3920 1902 C8 RET Z ; Return zero if zero -3921 1903 2E 00 LD L,0 ; Flag add exponents -3922 1905 CD C8 19 CALL ADDEXP ; Add exponents -3923 1908 79 LD A,C ; Get MSB of multiplier -3924 1909 32 A6 31 LD (MULVAL),A ; Save MSB of multiplier -3925 190C EB EX DE,HL -3926 190D 22 A7 31 LD (MULVAL+1),HL ; Save rest of multiplier -3927 1910 01 00 00 LD BC,0 ; Partial product (BCDE) = zero -3928 1913 50 LD D,B -3929 1914 58 LD E,B -3930 1915 21 15 18 LD HL,BNORM ; Address of normalise -3931 1918 E5 PUSH HL ; Save for return -3932 1919 21 21 19 LD HL,MULT8 ; Address of 8 bit multiply -3933 191C E5 PUSH HL ; Save for NMSB,MSB -3934 191D E5 PUSH HL ; -3935 191E 21 94 31 LD HL,FPREG ; Point to number -3936 1921 7E MULT8: LD A,(HL) ; Get LSB of number -3937 1922 23 INC HL ; Point to NMSB -3938 1923 B7 OR A ; Test LSB -3939 1924 CA 4D 19 JP Z,BYTSFT ; Zero - shift to next byte -3940 1927 E5 PUSH HL ; Save address of number -3941 1928 2E 08 LD L,8 ; 8 bits to multiply by -3942 192A 1F MUL8LP: RRA ; Shift LSB right -3943 192B 67 LD H,A ; Save LSB -3944 192C 79 LD A,C ; Get MSB -3945 192D D2 3B 19 JP NC,NOMADD ; Bit was zero - Don't add -3946 1930 E5 PUSH HL ; Save LSB and count -3947 1931 2A A7 31 LD HL,(MULVAL+1) ; Get LSB and NMSB -3948 1934 19 ADD HL,DE ; Add NMSB and LSB -3949 1935 EB EX DE,HL ; Leave sum in DE -3950 1936 E1 POP HL ; Restore MSB and count -3951 1937 3A A6 31 LD A,(MULVAL) ; Get MSB of multiplier -3952 193A 89 ADC A,C ; Add MSB -3953 193B 1F NOMADD: RRA ; Shift MSB right -3954 193C 4F LD C,A ; Re-save MSB -3955 193D 7A LD A,D ; Get NMSB -3956 193E 1F RRA ; Shift NMSB right -3957 193F 57 LD D,A ; Re-save NMSB -3958 1940 7B LD A,E ; Get LSB -3959 1941 1F RRA ; Shift LSB right -3960 1942 5F LD E,A ; Re-save LSB -3961 1943 78 LD A,B ; Get VLSB -3962 1944 1F RRA ; Shift VLSB right -3963 1945 47 LD B,A ; Re-save VLSB -3964 1946 2D DEC L ; Count bits multiplied -3965 1947 7C LD A,H ; Get LSB of multiplier -3966 1948 C2 2A 19 JP NZ,MUL8LP ; More - Do it -3967 194B E1 POPHRT: POP HL ; Restore address of number -3968 194C C9 RET -3969 194D -3970 194D 43 BYTSFT: LD B,E ; Shift partial product left -3971 194E 5A LD E,D -3972 194F 51 LD D,C -3973 1950 4F LD C,A -3974 1951 C9 RET -3975 1952 -3976 1952 CD 3B 1A DIV10: CALL STAKFP ; Save FPREG on stack -3977 1955 01 20 84 LD BC,8420H ; BCDE = 10. -3978 1958 11 00 00 LD DE,0000H -3979 195B CD 4B 1A CALL FPBCDE ; Move 10 to FPREG -3980 195E -3981 195E C1 DIV: POP BC ; Get number from stack -3982 195F D1 POP DE -3983 1960 CD 0A 1A DVBCDE: CALL TSTSGN ; Test sign of FPREG -3984 1963 CA 66 07 JP Z,DZERR ; Error if division by zero -3985 1966 2E FF LD L,-1 ; Flag subtract exponents -3986 1968 CD C8 19 CALL ADDEXP ; Subtract exponents -3987 196B 34 INC (HL) ; Add 2 to exponent to adjust -3988 196C 34 INC (HL) -3989 196D 2B DEC HL ; Point to MSB -3990 196E 7E LD A,(HL) ; Get MSB of dividend -3991 196F 32 C2 30 LD (DIV3),A ; Save for subtraction -3992 1972 2B DEC HL -3993 1973 7E LD A,(HL) ; Get NMSB of dividend -3994 1974 32 BE 30 LD (DIV2),A ; Save for subtraction -3995 1977 2B DEC HL -3996 1978 7E LD A,(HL) ; Get MSB of dividend -3997 1979 32 BA 30 LD (DIV1),A ; Save for subtraction -3998 197C 41 LD B,C ; Get MSB -3999 197D EB EX DE,HL ; NMSB,LSB to HL -4000 197E AF XOR A -4001 197F 4F LD C,A ; Clear MSB of quotient -4002 1980 57 LD D,A ; Clear NMSB of quotient -4003 1981 5F LD E,A ; Clear LSB of quotient -4004 1982 32 C5 30 LD (DIV4),A ; Clear overflow count -4005 1985 E5 DIVLP: PUSH HL ; Save divisor -4006 1986 C5 PUSH BC -4007 1987 7D LD A,L ; Get LSB of number -4008 1988 CD B9 30 CALL DIVSUP ; Subt' divisor from dividend -4009 198B DE 00 SBC A,0 ; Count for overflows -4010 198D 3F CCF -4011 198E D2 98 19 JP NC,RESDIV ; Restore divisor if borrow -4012 1991 32 C5 30 LD (DIV4),A ; Re-save overflow count -4013 1994 F1 POP AF ; Scrap divisor -4014 1995 F1 POP AF -4015 1996 37 SCF ; Set carry to -4016 1997 D2 .BYTE 0D2H ; Skip "POP BC" and "POP HL" -4017 1998 -4018 1998 C1 RESDIV: POP BC ; Restore divisor -4019 1999 E1 POP HL -4020 199A 79 LD A,C ; Get MSB of quotient -4021 199B 3C INC A -4022 199C 3D DEC A -4023 199D 1F RRA ; Bit 0 to bit 7 -4024 199E FA 4B 18 JP M,RONDB ; Done - Normalise result -4025 19A1 17 RLA ; Restore carry -4026 19A2 7B LD A,E ; Get LSB of quotient -4027 19A3 17 RLA ; Double it -4028 19A4 5F LD E,A ; Put it back -4029 19A5 7A LD A,D ; Get NMSB of quotient -4030 19A6 17 RLA ; Double it -4031 19A7 57 LD D,A ; Put it back -4032 19A8 79 LD A,C ; Get MSB of quotient -4033 19A9 17 RLA ; Double it -4034 19AA 4F LD C,A ; Put it back -4035 19AB 29 ADD HL,HL ; Double NMSB,LSB of divisor -4036 19AC 78 LD A,B ; Get MSB of divisor -4037 19AD 17 RLA ; Double it -4038 19AE 47 LD B,A ; Put it back -4039 19AF 3A C5 30 LD A,(DIV4) ; Get VLSB of quotient -4040 19B2 17 RLA ; Double it -4041 19B3 32 C5 30 LD (DIV4),A ; Put it back -4042 19B6 79 LD A,C ; Get MSB of quotient -4043 19B7 B2 OR D ; Merge NMSB -4044 19B8 B3 OR E ; Merge LSB -4045 19B9 C2 85 19 JP NZ,DIVLP ; Not done - Keep dividing -4046 19BC E5 PUSH HL ; Save divisor -4047 19BD 21 97 31 LD HL,FPEXP ; Point to exponent -4048 19C0 35 DEC (HL) ; Divide by 2 -4049 19C1 E1 POP HL ; Restore divisor -4050 19C2 C2 85 19 JP NZ,DIVLP ; Ok - Keep going -4051 19C5 C3 72 07 JP OVERR ; Overflow error -4052 19C8 -4053 19C8 78 ADDEXP: LD A,B ; Get exponent of dividend -4054 19C9 B7 OR A ; Test it -4055 19CA CA EC 19 JP Z,OVTST3 ; Zero - Result zero -4056 19CD 7D LD A,L ; Get add/subtract flag -4057 19CE 21 97 31 LD HL,FPEXP ; Point to exponent -4058 19D1 AE XOR (HL) ; Add or subtract it -4059 19D2 80 ADD A,B ; Add the other exponent -4060 19D3 47 LD B,A ; Save new exponent -4061 19D4 1F RRA ; Test exponent for overflow -4062 19D5 A8 XOR B -4063 19D6 78 LD A,B ; Get exponent -4064 19D7 F2 EB 19 JP P,OVTST2 ; Positive - Test for overflow -4065 19DA C6 80 ADD A,80H ; Add excess 128 -4066 19DC 77 LD (HL),A ; Save new exponent -4067 19DD CA 4B 19 JP Z,POPHRT ; Zero - Result zero -4068 19E0 CD 70 1A CALL SIGNS ; Set MSBs and sign of result -4069 19E3 77 LD (HL),A ; Save new exponent -4070 19E4 2B DEC HL ; Point to MSB -4071 19E5 C9 RET -4072 19E6 -4073 19E6 CD 0A 1A OVTST1: CALL TSTSGN ; Test sign of FPREG -4074 19E9 2F CPL ; Invert sign -4075 19EA E1 POP HL ; Clean up stack -4076 19EB B7 OVTST2: OR A ; Test if new exponent zero -4077 19EC E1 OVTST3: POP HL ; Clear off return address -4078 19ED F2 2A 18 JP P,RESZER ; Result zero -4079 19F0 C3 72 07 JP OVERR ; Overflow error -4080 19F3 -4081 19F3 CD 56 1A MLSP10: CALL BCDEFP ; Move FPREG to BCDE -4082 19F6 78 LD A,B ; Get exponent -4083 19F7 B7 OR A ; Is it zero? -4084 19F8 C8 RET Z ; Yes - Result is zero -4085 19F9 C6 02 ADD A,2 ; Multiply by 4 -4086 19FB DA 72 07 JP C,OVERR ; Overflow - ?OV Error -4087 19FE 47 LD B,A ; Re-save exponent -4088 19FF CD C4 17 CALL FPADD ; Add BCDE to FPREG (Times 5) -4089 1A02 21 97 31 LD HL,FPEXP ; Point to exponent -4090 1A05 34 INC (HL) ; Double number (Times 10) -4091 1A06 C0 RET NZ ; Ok - Return -4092 1A07 C3 72 07 JP OVERR ; Overflow error -4093 1A0A -4094 1A0A 3A 97 31 TSTSGN: LD A,(FPEXP) ; Get sign of FPREG -4095 1A0D B7 OR A -4096 1A0E C8 RET Z ; RETurn if number is zero -4097 1A0F 3A 96 31 LD A,(FPREG+2) ; Get MSB of FPREG -4098 1A12 FE .BYTE 0FEH ; Test sign -4099 1A13 2F RETREL: CPL ; Invert sign -4100 1A14 17 RLA ; Sign bit to carry -4101 1A15 9F FLGDIF: SBC A,A ; Carry to all bits of A -4102 1A16 C0 RET NZ ; Return -1 if negative -4103 1A17 3C INC A ; Bump to +1 -4104 1A18 C9 RET ; Positive - Return +1 -4105 1A19 -4106 1A19 CD 0A 1A SGN: CALL TSTSGN ; Test sign of FPREG -4107 1A1C 06 88 FLGREL: LD B,80H+8 ; 8 bit integer in exponent -4108 1A1E 11 00 00 LD DE,0 ; Zero NMSB and LSB -4109 1A21 21 97 31 RETINT: LD HL,FPEXP ; Point to exponent -4110 1A24 4F LD C,A ; CDE = MSB,NMSB and LSB -4111 1A25 70 LD (HL),B ; Save exponent -4112 1A26 06 00 LD B,0 ; CDE = integer to normalise -4113 1A28 23 INC HL ; Point to sign of result -4114 1A29 36 80 LD (HL),80H ; Set sign of result -4115 1A2B 17 RLA ; Carry = sign of integer -4116 1A2C C3 12 18 JP CONPOS ; Set sign of result -4117 1A2F -4118 1A2F CD 0A 1A ABS: CALL TSTSGN ; Test sign of FPREG -4119 1A32 F0 RET P ; Return if positive -4120 1A33 21 96 31 INVSGN: LD HL,FPREG+2 ; Point to MSB -4121 1A36 7E LD A,(HL) ; Get sign of mantissa -4122 1A37 EE 80 XOR 80H ; Invert sign of mantissa -4123 1A39 77 LD (HL),A ; Re-save sign of mantissa -4124 1A3A C9 RET -4125 1A3B -4126 1A3B EB STAKFP: EX DE,HL ; Save code string address -4127 1A3C 2A 94 31 LD HL,(FPREG) ; LSB,NLSB of FPREG -4128 1A3F E3 EX (SP),HL ; Stack them,get return -4129 1A40 E5 PUSH HL ; Re-save return -4130 1A41 2A 96 31 LD HL,(FPREG+2) ; MSB and exponent of FPREG -4131 1A44 E3 EX (SP),HL ; Stack them,get return -4132 1A45 E5 PUSH HL ; Re-save return -4133 1A46 EB EX DE,HL ; Restore code string address -4134 1A47 C9 RET -4135 1A48 -4136 1A48 CD 59 1A PHLTFP: CALL LOADFP ; Number at HL to BCDE -4137 1A4B EB FPBCDE: EX DE,HL ; Save code string address -4138 1A4C 22 94 31 LD (FPREG),HL ; Save LSB,NLSB of number -4139 1A4F 60 LD H,B ; Exponent of number -4140 1A50 69 LD L,C ; MSB of number -4141 1A51 22 96 31 LD (FPREG+2),HL ; Save MSB and exponent -4142 1A54 EB EX DE,HL ; Restore code string address -4143 1A55 C9 RET -4144 1A56 -4145 1A56 21 94 31 BCDEFP: LD HL,FPREG ; Point to FPREG -4146 1A59 5E LOADFP: LD E,(HL) ; Get LSB of number -4147 1A5A 23 INC HL -4148 1A5B 56 LD D,(HL) ; Get NMSB of number -4149 1A5C 23 INC HL -4150 1A5D 4E LD C,(HL) ; Get MSB of number -4151 1A5E 23 INC HL -4152 1A5F 46 LD B,(HL) ; Get exponent of number -4153 1A60 23 INCHL: INC HL ; Used for conditional "INC HL" -4154 1A61 C9 RET -4155 1A62 -4156 1A62 11 94 31 FPTHL: LD DE,FPREG ; Point to FPREG -4157 1A65 06 04 DETHL4: LD B,4 ; 4 bytes to move -4158 1A67 1A DETHLB: LD A,(DE) ; Get source -4159 1A68 77 LD (HL),A ; Save destination -4160 1A69 13 INC DE ; Next source -4161 1A6A 23 INC HL ; Next destination -4162 1A6B 05 DEC B ; Count bytes -4163 1A6C C2 67 1A JP NZ,DETHLB ; Loop if more -4164 1A6F C9 RET -4165 1A70 -4166 1A70 21 96 31 SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG -4167 1A73 7E LD A,(HL) ; Get MSB -4168 1A74 07 RLCA ; Old sign to carry -4169 1A75 37 SCF ; Set MSBit -4170 1A76 1F RRA ; Set MSBit of MSB -4171 1A77 77 LD (HL),A ; Save new MSB -4172 1A78 3F CCF ; Complement sign -4173 1A79 1F RRA ; Old sign to carry -4174 1A7A 23 INC HL -4175 1A7B 23 INC HL -4176 1A7C 77 LD (HL),A ; Set sign of result -4177 1A7D 79 LD A,C ; Get MSB -4178 1A7E 07 RLCA ; Old sign to carry -4179 1A7F 37 SCF ; Set MSBit -4180 1A80 1F RRA ; Set MSBit of MSB -4181 1A81 4F LD C,A ; Save MSB -4182 1A82 1F RRA -4183 1A83 AE XOR (HL) ; New sign of result -4184 1A84 C9 RET -4185 1A85 -4186 1A85 78 CMPNUM: LD A,B ; Get exponent of number -4187 1A86 B7 OR A -4188 1A87 CA 0A 1A JP Z,TSTSGN ; Zero - Test sign of FPREG -4189 1A8A 21 13 1A LD HL,RETREL ; Return relation routine -4190 1A8D E5 PUSH HL ; Save for return -4191 1A8E CD 0A 1A CALL TSTSGN ; Test sign of FPREG -4192 1A91 79 LD A,C ; Get MSB of number -4193 1A92 C8 RET Z ; FPREG zero - Number's MSB -4194 1A93 21 96 31 LD HL,FPREG+2 ; MSB of FPREG -4195 1A96 AE XOR (HL) ; Combine signs -4196 1A97 79 LD A,C ; Get MSB of number -4197 1A98 F8 RET M ; Exit if signs different -4198 1A99 CD 9F 1A CALL CMPFP ; Compare FP numbers -4199 1A9C 1F RRA ; Get carry to sign -4200 1A9D A9 XOR C ; Combine with MSB of number -4201 1A9E C9 RET -4202 1A9F -4203 1A9F 23 CMPFP: INC HL ; Point to exponent -4204 1AA0 78 LD A,B ; Get exponent -4205 1AA1 BE CP (HL) ; Compare exponents -4206 1AA2 C0 RET NZ ; Different -4207 1AA3 2B DEC HL ; Point to MBS -4208 1AA4 79 LD A,C ; Get MSB -4209 1AA5 BE CP (HL) ; Compare MSBs -4210 1AA6 C0 RET NZ ; Different -4211 1AA7 2B DEC HL ; Point to NMSB -4212 1AA8 7A LD A,D ; Get NMSB -4213 1AA9 BE CP (HL) ; Compare NMSBs -4214 1AAA C0 RET NZ ; Different -4215 1AAB 2B DEC HL ; Point to LSB -4216 1AAC 7B LD A,E ; Get LSB -4217 1AAD 96 SUB (HL) ; Compare LSBs -4218 1AAE C0 RET NZ ; Different -4219 1AAF E1 POP HL ; Drop RETurn -4220 1AB0 E1 POP HL ; Drop another RETurn -4221 1AB1 C9 RET -4222 1AB2 -4223 1AB2 47 FPINT: LD B,A ; <- Move -4224 1AB3 4F LD C,A ; <- exponent -4225 1AB4 57 LD D,A ; <- to all -4226 1AB5 5F LD E,A ; <- bits -4227 1AB6 B7 OR A ; Test exponent -4228 1AB7 C8 RET Z ; Zero - Return zero -4229 1AB8 E5 PUSH HL ; Save pointer to number -4230 1AB9 CD 56 1A CALL BCDEFP ; Move FPREG to BCDE -4231 1ABC CD 70 1A CALL SIGNS ; Set MSBs & sign of result -4232 1ABF AE XOR (HL) ; Combine with sign of FPREG -4233 1AC0 67 LD H,A ; Save combined signs -4234 1AC1 FC D6 1A CALL M,DCBCDE ; Negative - Decrement BCDE -4235 1AC4 3E 98 LD A,80H+24 ; 24 bits -4236 1AC6 90 SUB B ; Bits to shift -4237 1AC7 CD 89 18 CALL SCALE ; Shift BCDE -4238 1ACA 7C LD A,H ; Get combined sign -4239 1ACB 17 RLA ; Sign to carry -4240 1ACC DC 5C 18 CALL C,FPROND ; Negative - Round number up -4241 1ACF 06 00 LD B,0 ; Zero exponent -4242 1AD1 DC 75 18 CALL C,COMPL ; If negative make positive -4243 1AD4 E1 POP HL ; Restore pointer to number -4244 1AD5 C9 RET -4245 1AD6 -4246 1AD6 1B DCBCDE: DEC DE ; Decrement BCDE -4247 1AD7 7A LD A,D ; Test LSBs -4248 1AD8 A3 AND E -4249 1AD9 3C INC A -4250 1ADA C0 RET NZ ; Exit if LSBs not FFFF -4251 1ADB 0B DEC BC ; Decrement MSBs -4252 1ADC C9 RET -4253 1ADD -4254 1ADD 21 97 31 INT: LD HL,FPEXP ; Point to exponent -4255 1AE0 7E LD A,(HL) ; Get exponent -4256 1AE1 FE 98 CP 80H+24 ; Integer accuracy only? -4257 1AE3 3A 94 31 LD A,(FPREG) ; Get LSB -4258 1AE6 D0 RET NC ; Yes - Already integer -4259 1AE7 7E LD A,(HL) ; Get exponent -4260 1AE8 CD B2 1A CALL FPINT ; F.P to integer -4261 1AEB 36 98 LD (HL),80H+24 ; Save 24 bit integer -4262 1AED 7B LD A,E ; Get LSB of number -4263 1AEE F5 PUSH AF ; Save LSB -4264 1AEF 79 LD A,C ; Get MSB of number -4265 1AF0 17 RLA ; Sign to carry -4266 1AF1 CD 12 18 CALL CONPOS ; Set sign of result -4267 1AF4 F1 POP AF ; Restore LSB of number -4268 1AF5 C9 RET -4269 1AF6 -4270 1AF6 21 00 00 MLDEBC: LD HL,0 ; Clear partial product -4271 1AF9 78 LD A,B ; Test multiplier -4272 1AFA B1 OR C -4273 1AFB C8 RET Z ; Return zero if zero -4274 1AFC 3E 10 LD A,16 ; 16 bits -4275 1AFE 29 MLDBLP: ADD HL,HL ; Shift P.P left -4276 1AFF DA 36 13 JP C,BSERR ; ?BS Error if overflow -4277 1B02 EB EX DE,HL -4278 1B03 29 ADD HL,HL ; Shift multiplier left -4279 1B04 EB EX DE,HL -4280 1B05 D2 0C 1B JP NC,NOMLAD ; Bit was zero - No add -4281 1B08 09 ADD HL,BC ; Add multiplicand -4282 1B09 DA 36 13 JP C,BSERR ; ?BS Error if overflow -4283 1B0C 3D NOMLAD: DEC A ; Count bits -4284 1B0D C2 FE 1A JP NZ,MLDBLP ; More -4285 1B10 C9 RET -4286 1B11 -4287 1B11 FE 2D ASCTFP: CP '-' ; Negative? -4288 1B13 F5 PUSH AF ; Save it and flags -4289 1B14 CA 1D 1B JP Z,CNVNUM ; Yes - Convert number -4290 1B17 FE 2B CP '+' ; Positive? -4291 1B19 CA 1D 1B JP Z,CNVNUM ; Yes - Convert number -4292 1B1C 2B DEC HL ; DEC 'cos GETCHR INCs -4293 1B1D CD 2A 18 CNVNUM: CALL RESZER ; Set result to zero -4294 1B20 47 LD B,A ; Digits after point counter -4295 1B21 57 LD D,A ; Sign of exponent -4296 1B22 5F LD E,A ; Exponent of ten -4297 1B23 2F CPL -4298 1B24 4F LD C,A ; Before or after point flag -4299 1B25 CD BB 0B MANLP: CALL GETCHR ; Get next character -4300 1B28 DA 6E 1B JP C,ADDIG ; Digit - Add to number -4301 1B2B FE 2E CP '.' -4302 1B2D CA 49 1B JP Z,DPOINT ; '.' - Flag point -4303 1B30 FE 45 CP 'E' -4304 1B32 C2 4D 1B JP NZ,CONEXP ; Not 'E' - Scale number -4305 1B35 CD BB 0B CALL GETCHR ; Get next character -4306 1B38 CD 61 11 CALL SGNEXP ; Get sign of exponent -4307 1B3B CD BB 0B EXPLP: CALL GETCHR ; Get next character -4308 1B3E DA 90 1B JP C,EDIGIT ; Digit - Add to exponent -4309 1B41 14 INC D ; Is sign negative? -4310 1B42 C2 4D 1B JP NZ,CONEXP ; No - Scale number -4311 1B45 AF XOR A -4312 1B46 93 SUB E ; Negate exponent -4313 1B47 5F LD E,A ; And re-save it -4314 1B48 0C INC C ; Flag end of number -4315 1B49 0C DPOINT: INC C ; Flag point passed -4316 1B4A CA 25 1B JP Z,MANLP ; Zero - Get another digit -4317 1B4D E5 CONEXP: PUSH HL ; Save code string address -4318 1B4E 7B LD A,E ; Get exponent -4319 1B4F 90 SUB B ; Subtract digits after point -4320 1B50 F4 66 1B SCALMI: CALL P,SCALPL ; Positive - Multiply number -4321 1B53 F2 5C 1B JP P,ENDCON ; Positive - All done -4322 1B56 F5 PUSH AF ; Save number of times to /10 -4323 1B57 CD 52 19 CALL DIV10 ; Divide by 10 -4324 1B5A F1 POP AF ; Restore count -4325 1B5B 3C INC A ; Count divides -4326 1B5C -4327 1B5C C2 50 1B ENDCON: JP NZ,SCALMI ; More to do -4328 1B5F D1 POP DE ; Restore code string address -4329 1B60 F1 POP AF ; Restore sign of number -4330 1B61 CC 33 1A CALL Z,INVSGN ; Negative - Negate number -4331 1B64 EB EX DE,HL ; Code string address to HL -4332 1B65 C9 RET -4333 1B66 -4334 1B66 C8 SCALPL: RET Z ; Exit if no scaling needed -4335 1B67 F5 MULTEN: PUSH AF ; Save count -4336 1B68 CD F3 19 CALL MLSP10 ; Multiply number by 10 -4337 1B6B F1 POP AF ; Restore count -4338 1B6C 3D DEC A ; Count multiplies -4339 1B6D C9 RET -4340 1B6E -4341 1B6E D5 ADDIG: PUSH DE ; Save sign of exponent -4342 1B6F 57 LD D,A ; Save digit -4343 1B70 78 LD A,B ; Get digits after point -4344 1B71 89 ADC A,C ; Add one if after point -4345 1B72 47 LD B,A ; Re-save counter -4346 1B73 C5 PUSH BC ; Save point flags -4347 1B74 E5 PUSH HL ; Save code string address -4348 1B75 D5 PUSH DE ; Save digit -4349 1B76 CD F3 19 CALL MLSP10 ; Multiply number by 10 -4350 1B79 F1 POP AF ; Restore digit -4351 1B7A D6 30 SUB '0' ; Make it absolute -4352 1B7C CD 85 1B CALL RSCALE ; Re-scale number -4353 1B7F E1 POP HL ; Restore code string address -4354 1B80 C1 POP BC ; Restore point flags -4355 1B81 D1 POP DE ; Restore sign of exponent -4356 1B82 C3 25 1B JP MANLP ; Get another digit -4357 1B85 -4358 1B85 CD 3B 1A RSCALE: CALL STAKFP ; Put number on stack -4359 1B88 CD 1C 1A CALL FLGREL ; Digit to add to FPREG -4360 1B8B C1 PADD: POP BC ; Restore number -4361 1B8C D1 POP DE -4362 1B8D C3 C4 17 JP FPADD ; Add BCDE to FPREG and return -4363 1B90 -4364 1B90 7B EDIGIT: LD A,E ; Get digit -4365 1B91 07 RLCA ; Times 2 -4366 1B92 07 RLCA ; Times 4 -4367 1B93 83 ADD A,E ; Times 5 -4368 1B94 07 RLCA ; Times 10 -4369 1B95 86 ADD A,(HL) ; Add next digit -4370 1B96 D6 30 SUB '0' ; Make it absolute -4371 1B98 5F LD E,A ; Save new digit -4372 1B99 C3 3B 1B JP EXPLP ; Look for another digit -4373 1B9C -4374 1B9C E5 LINEIN: PUSH HL ; Save code string address -4375 1B9D 21 FB 06 LD HL,INMSG ; Output " in " -4376 1BA0 CD 01 15 CALL PRS ; Output string at HL -4377 1BA3 E1 POP HL ; Restore code string address -4378 1BA4 EB PRNTHL: EX DE,HL ; Code string address to DE -4379 1BA5 AF XOR A -4380 1BA6 06 98 LD B,80H+24 ; 24 bits -4381 1BA8 CD 21 1A CALL RETINT ; Return the integer -4382 1BAB 21 00 15 LD HL,PRNUMS ; Print number string -4383 1BAE E5 PUSH HL ; Save for return -4384 1BAF 21 99 31 NUMASC: LD HL,PBUFF ; Convert number to ASCII -4385 1BB2 E5 PUSH HL ; Save for return -4386 1BB3 CD 0A 1A CALL TSTSGN ; Test sign of FPREG -4387 1BB6 36 20 LD (HL),' ' ; Space at start -4388 1BB8 F2 BD 1B JP P,SPCFST ; Positive - Space to start -4389 1BBB 36 2D LD (HL),'-' ; '-' sign at start -4390 1BBD 23 SPCFST: INC HL ; First byte of number -4391 1BBE 36 30 LD (HL),'0' ; '0' if zero -4392 1BC0 CA 73 1C JP Z,JSTZER ; Return '0' if zero -4393 1BC3 E5 PUSH HL ; Save buffer address -4394 1BC4 FC 33 1A CALL M,INVSGN ; Negate FPREG if negative -4395 1BC7 AF XOR A ; Zero A -4396 1BC8 F5 PUSH AF ; Save it -4397 1BC9 CD 79 1C CALL RNGTST ; Test number is in range -4398 1BCC 01 43 91 SIXDIG: LD BC,9143H ; BCDE - 99999.9 -4399 1BCF 11 F8 4F LD DE,4FF8H -4400 1BD2 CD 85 1A CALL CMPNUM ; Compare numbers -4401 1BD5 B7 OR A -4402 1BD6 E2 EA 1B JP PO,INRNG ; > 99999.9 - Sort it out -4403 1BD9 F1 POP AF ; Restore count -4404 1BDA CD 67 1B CALL MULTEN ; Multiply by ten -4405 1BDD F5 PUSH AF ; Re-save count -4406 1BDE C3 CC 1B JP SIXDIG ; Test it again -4407 1BE1 -4408 1BE1 CD 52 19 GTSIXD: CALL DIV10 ; Divide by 10 -4409 1BE4 F1 POP AF ; Get count -4410 1BE5 3C INC A ; Count divides -4411 1BE6 F5 PUSH AF ; Re-save count -4412 1BE7 CD 79 1C CALL RNGTST ; Test number is in range -4413 1BEA CD B2 17 INRNG: CALL ROUND ; Add 0.5 to FPREG -4414 1BED 3C INC A -4415 1BEE CD B2 1A CALL FPINT ; F.P to integer -4416 1BF1 CD 4B 1A CALL FPBCDE ; Move BCDE to FPREG -4417 1BF4 01 06 03 LD BC,0306H ; 1E+06 to 1E-03 range -4418 1BF7 F1 POP AF ; Restore count -4419 1BF8 81 ADD A,C ; 6 digits before point -4420 1BF9 3C INC A ; Add one -4421 1BFA FA 06 1C JP M,MAKNUM ; Do it in 'E' form if < 1E-02 -4422 1BFD FE 08 CP 6+1+1 ; More than 999999 ? -4423 1BFF D2 06 1C JP NC,MAKNUM ; Yes - Do it in 'E' form -4424 1C02 3C INC A ; Adjust for exponent -4425 1C03 47 LD B,A ; Exponent of number -4426 1C04 3E 02 LD A,2 ; Make it zero after -4427 1C06 -4428 1C06 3D MAKNUM: DEC A ; Adjust for digits to do -4429 1C07 3D DEC A -4430 1C08 E1 POP HL ; Restore buffer address -4431 1C09 F5 PUSH AF ; Save count -4432 1C0A 11 8C 1C LD DE,POWERS ; Powers of ten -4433 1C0D 05 DEC B ; Count digits before point -4434 1C0E C2 17 1C JP NZ,DIGTXT ; Not zero - Do number -4435 1C11 36 2E LD (HL),'.' ; Save point -4436 1C13 23 INC HL ; Move on -4437 1C14 36 30 LD (HL),'0' ; Save zero -4438 1C16 23 INC HL ; Move on -4439 1C17 05 DIGTXT: DEC B ; Count digits before point -4440 1C18 36 2E LD (HL),'.' ; Save point in case -4441 1C1A CC 60 1A CALL Z,INCHL ; Last digit - move on -4442 1C1D C5 PUSH BC ; Save digits before point -4443 1C1E E5 PUSH HL ; Save buffer address -4444 1C1F D5 PUSH DE ; Save powers of ten -4445 1C20 CD 56 1A CALL BCDEFP ; Move FPREG to BCDE -4446 1C23 E1 POP HL ; Powers of ten table -4447 1C24 06 2F LD B, '0'-1 ; ASCII '0' - 1 -4448 1C26 04 TRYAGN: INC B ; Count subtractions -4449 1C27 7B LD A,E ; Get LSB -4450 1C28 96 SUB (HL) ; Subtract LSB -4451 1C29 5F LD E,A ; Save LSB -4452 1C2A 23 INC HL -4453 1C2B 7A LD A,D ; Get NMSB -4454 1C2C 9E SBC A,(HL) ; Subtract NMSB -4455 1C2D 57 LD D,A ; Save NMSB -4456 1C2E 23 INC HL -4457 1C2F 79 LD A,C ; Get MSB -4458 1C30 9E SBC A,(HL) ; Subtract MSB -4459 1C31 4F LD C,A ; Save MSB -4460 1C32 2B DEC HL ; Point back to start -4461 1C33 2B DEC HL -4462 1C34 D2 26 1C JP NC,TRYAGN ; No overflow - Try again -4463 1C37 CD 69 18 CALL PLUCDE ; Restore number -4464 1C3A 23 INC HL ; Start of next number -4465 1C3B CD 4B 1A CALL FPBCDE ; Move BCDE to FPREG -4466 1C3E EB EX DE,HL ; Save point in table -4467 1C3F E1 POP HL ; Restore buffer address -4468 1C40 70 LD (HL),B ; Save digit in buffer -4469 1C41 23 INC HL ; And move on -4470 1C42 C1 POP BC ; Restore digit count -4471 1C43 0D DEC C ; Count digits -4472 1C44 C2 17 1C JP NZ,DIGTXT ; More - Do them -4473 1C47 05 DEC B ; Any decimal part? -4474 1C48 CA 57 1C JP Z,DOEBIT ; No - Do 'E' bit -4475 1C4B 2B SUPTLZ: DEC HL ; Move back through buffer -4476 1C4C 7E LD A,(HL) ; Get character -4477 1C4D FE 30 CP '0' ; '0' character? -4478 1C4F CA 4B 1C JP Z,SUPTLZ ; Yes - Look back for more -4479 1C52 FE 2E CP '.' ; A decimal point? -4480 1C54 C4 60 1A CALL NZ,INCHL ; Move back over digit -4481 1C57 -4482 1C57 F1 DOEBIT: POP AF ; Get 'E' flag -4483 1C58 CA 76 1C JP Z,NOENED ; No 'E' needed - End buffer -4484 1C5B 36 45 LD (HL),'E' ; Put 'E' in buffer -4485 1C5D 23 INC HL ; And move on -4486 1C5E 36 2B LD (HL),'+' ; Put '+' in buffer -4487 1C60 F2 67 1C JP P,OUTEXP ; Positive - Output exponent -4488 1C63 36 2D LD (HL),'-' ; Put '-' in buffer -4489 1C65 2F CPL ; Negate exponent -4490 1C66 3C INC A -4491 1C67 06 2F OUTEXP: LD B,'0'-1 ; ASCII '0' - 1 -4492 1C69 04 EXPTEN: INC B ; Count subtractions -4493 1C6A D6 0A SUB 10 ; Tens digit -4494 1C6C D2 69 1C JP NC,EXPTEN ; More to do -4495 1C6F C6 3A ADD A,'0'+10 ; Restore and make ASCII -4496 1C71 23 INC HL ; Move on -4497 1C72 70 LD (HL),B ; Save MSB of exponent -4498 1C73 23 JSTZER: INC HL ; -4499 1C74 77 LD (HL),A ; Save LSB of exponent -4500 1C75 23 INC HL -4501 1C76 71 NOENED: LD (HL),C ; Mark end of buffer -4502 1C77 E1 POP HL ; Restore code string address -4503 1C78 C9 RET -4504 1C79 -4505 1C79 01 74 94 RNGTST: LD BC,9474H ; BCDE = 999999. -4506 1C7C 11 F7 23 LD DE,23F7H -4507 1C7F CD 85 1A CALL CMPNUM ; Compare numbers -4508 1C82 B7 OR A -4509 1C83 E1 POP HL ; Return address to HL -4510 1C84 E2 E1 1B JP PO,GTSIXD ; Too big - Divide by ten -4511 1C87 E9 JP (HL) ; Otherwise return to caller -4512 1C88 -4513 1C88 00 00 00 80 HALF: .BYTE 00H,00H,00H,80H ; 0.5 -4514 1C8C -4515 1C8C A0 86 01 POWERS: .BYTE 0A0H,086H,001H ; 100000 -4516 1C8F 10 27 00 .BYTE 010H,027H,000H ; 10000 -4517 1C92 E8 03 00 .BYTE 0E8H,003H,000H ; 1000 -4518 1C95 64 00 00 .BYTE 064H,000H,000H ; 100 -4519 1C98 0A 00 00 .BYTE 00AH,000H,000H ; 10 -4520 1C9B 01 00 00 .BYTE 001H,000H,000H ; 1 -4521 1C9E -4522 1C9E 21 33 1A NEGAFT: LD HL,INVSGN ; Negate result -4523 1CA1 E3 EX (SP),HL ; To be done after caller -4524 1CA2 E9 JP (HL) ; Return to caller -4525 1CA3 -4526 1CA3 CD 3B 1A SQR: CALL STAKFP ; Put value on stack -4527 1CA6 21 88 1C LD HL,HALF ; Set power to 1/2 -4528 1CA9 CD 48 1A CALL PHLTFP ; Move 1/2 to FPREG -4529 1CAC -4530 1CAC C1 POWER: POP BC ; Get base -4531 1CAD D1 POP DE -4532 1CAE CD 0A 1A CALL TSTSGN ; Test sign of power -4533 1CB1 78 LD A,B ; Get exponent of base -4534 1CB2 CA F1 1C JP Z,EXP ; Make result 1 if zero -4535 1CB5 F2 BC 1C JP P,POWER1 ; Positive base - Ok -4536 1CB8 B7 OR A ; Zero to negative power? -4537 1CB9 CA 66 07 JP Z,DZERR ; Yes - ?/0 Error -4538 1CBC B7 POWER1: OR A ; Base zero? -4539 1CBD CA 2B 18 JP Z,SAVEXP ; Yes - Return zero -4540 1CC0 D5 PUSH DE ; Save base -4541 1CC1 C5 PUSH BC -4542 1CC2 79 LD A,C ; Get MSB of base -4543 1CC3 F6 7F OR 01111111B ; Get sign status -4544 1CC5 CD 56 1A CALL BCDEFP ; Move power to BCDE -4545 1CC8 F2 D9 1C JP P,POWER2 ; Positive base - Ok -4546 1CCB D5 PUSH DE ; Save power -4547 1CCC C5 PUSH BC -4548 1CCD CD DD 1A CALL INT ; Get integer of power -4549 1CD0 C1 POP BC ; Restore power -4550 1CD1 D1 POP DE -4551 1CD2 F5 PUSH AF ; MSB of base -4552 1CD3 CD 85 1A CALL CMPNUM ; Power an integer? -4553 1CD6 E1 POP HL ; Restore MSB of base -4554 1CD7 7C LD A,H ; but don't affect flags -4555 1CD8 1F RRA ; Exponent odd or even? -4556 1CD9 E1 POWER2: POP HL ; Restore MSB and exponent -4557 1CDA 22 96 31 LD (FPREG+2),HL ; Save base in FPREG -4558 1CDD E1 POP HL ; LSBs of base -4559 1CDE 22 94 31 LD (FPREG),HL ; Save in FPREG -4560 1CE1 DC 9E 1C CALL C,NEGAFT ; Odd power - Negate result -4561 1CE4 CC 33 1A CALL Z,INVSGN ; Negative base - Negate it -4562 1CE7 D5 PUSH DE ; Save power -4563 1CE8 C5 PUSH BC -4564 1CE9 CD BE 18 CALL LOG ; Get LOG of base -4565 1CEC C1 POP BC ; Restore power -4566 1CED D1 POP DE -4567 1CEE CD FF 18 CALL FPMULT ; Multiply LOG by power -4568 1CF1 -4569 1CF1 CD 3B 1A EXP: CALL STAKFP ; Put value on stack -4570 1CF4 01 38 81 LD BC,08138H ; BCDE = 1/Ln(2) -4571 1CF7 11 3B AA LD DE,0AA3BH -4572 1CFA CD FF 18 CALL FPMULT ; Multiply value by 1/LN(2) -4573 1CFD 3A 97 31 LD A,(FPEXP) ; Get exponent -4574 1D00 FE 88 CP 80H+8 ; Is it in range? -4575 1D02 D2 E6 19 JP NC,OVTST1 ; No - Test for overflow -4576 1D05 CD DD 1A CALL INT ; Get INT of FPREG -4577 1D08 C6 80 ADD A,80H ; For excess 128 -4578 1D0A C6 02 ADD A,2 ; Exponent > 126? -4579 1D0C DA E6 19 JP C,OVTST1 ; Yes - Test for overflow -4580 1D0F F5 PUSH AF ; Save scaling factor -4581 1D10 21 AD 18 LD HL,UNITY ; Point to 1. -4582 1D13 CD B5 17 CALL ADDPHL ; Add 1 to FPREG -4583 1D16 CD F6 18 CALL MULLN2 ; Multiply by LN(2) -4584 1D19 F1 POP AF ; Restore scaling factor -4585 1D1A C1 POP BC ; Restore exponent -4586 1D1B D1 POP DE -4587 1D1C F5 PUSH AF ; Save scaling factor -4588 1D1D CD C1 17 CALL SUBCDE ; Subtract exponent from FPREG -4589 1D20 CD 33 1A CALL INVSGN ; Negate result -4590 1D23 21 31 1D LD HL,EXPTAB ; Coefficient table -4591 1D26 CD 61 1D CALL SMSER1 ; Sum the series -4592 1D29 11 00 00 LD DE,0 ; Zero LSBs -4593 1D2C C1 POP BC ; Scaling factor -4594 1D2D 4A LD C,D ; Zero MSB -4595 1D2E C3 FF 18 JP FPMULT ; Scale result to correct value -4596 1D31 -4597 1D31 08 EXPTAB: .BYTE 8 ; Table used by EXP -4598 1D32 40 2E 94 74 .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040) -4599 1D36 70 4F 2E 77 .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720) -4600 1D3A 6E 02 88 7A .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120) -4601 1D3E E6 A0 2A 7C .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24) -4602 1D42 50 AA AA 7E .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6) -4603 1D46 FF FF 7F 7F .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2) -4604 1D4A 00 00 80 81 .BYTE 000H,000H,080H,081H ; -1/1! (-1/1) -4605 1D4E 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1) -4606 1D52 -4607 1D52 CD 3B 1A SUMSER: CALL STAKFP ; Put FPREG on stack -4608 1D55 11 FD 18 LD DE,MULT ; Multiply by "X" -4609 1D58 D5 PUSH DE ; To be done after -4610 1D59 E5 PUSH HL ; Save address of table -4611 1D5A CD 56 1A CALL BCDEFP ; Move FPREG to BCDE -4612 1D5D CD FF 18 CALL FPMULT ; Square the value -4613 1D60 E1 POP HL ; Restore address of table -4614 1D61 CD 3B 1A SMSER1: CALL STAKFP ; Put value on stack -4615 1D64 7E LD A,(HL) ; Get number of coefficients -4616 1D65 23 INC HL ; Point to start of table -4617 1D66 CD 48 1A CALL PHLTFP ; Move coefficient to FPREG -4618 1D69 06 .BYTE 06H ; Skip "POP AF" -4619 1D6A F1 SUMLP: POP AF ; Restore count -4620 1D6B C1 POP BC ; Restore number -4621 1D6C D1 POP DE -4622 1D6D 3D DEC A ; Cont coefficients -4623 1D6E C8 RET Z ; All done -4624 1D6F D5 PUSH DE ; Save number -4625 1D70 C5 PUSH BC -4626 1D71 F5 PUSH AF ; Save count -4627 1D72 E5 PUSH HL ; Save address in table -4628 1D73 CD FF 18 CALL FPMULT ; Multiply FPREG by BCDE -4629 1D76 E1 POP HL ; Restore address in table -4630 1D77 CD 59 1A CALL LOADFP ; Number at HL to BCDE -4631 1D7A E5 PUSH HL ; Save address in table -4632 1D7B CD C4 17 CALL FPADD ; Add coefficient to FPREG -4633 1D7E E1 POP HL ; Restore address in table -4634 1D7F C3 6A 1D JP SUMLP ; More coefficients -4635 1D82 -4636 1D82 CD 0A 1A RND: CALL TSTSGN ; Test sign of FPREG -4637 1D85 21 C9 30 LD HL,SEED+2 ; Random number seed -4638 1D88 FA E3 1D JP M,RESEED ; Negative - Re-seed -4639 1D8B 21 EA 30 LD HL,LSTRND ; Last random number -4640 1D8E CD 48 1A CALL PHLTFP ; Move last RND to FPREG -4641 1D91 21 C9 30 LD HL,SEED+2 ; Random number seed -4642 1D94 C8 RET Z ; Return if RND(0) -4643 1D95 86 ADD A,(HL) ; Add (SEED)+2) -4644 1D96 E6 07 AND 00000111B ; 0 to 7 -4645 1D98 06 00 LD B,0 -4646 1D9A 77 LD (HL),A ; Re-save seed -4647 1D9B 23 INC HL ; Move to coefficient table -4648 1D9C 87 ADD A,A ; 4 bytes -4649 1D9D 87 ADD A,A ; per entry -4650 1D9E 4F LD C,A ; BC = Offset into table -4651 1D9F 09 ADD HL,BC ; Point to coefficient -4652 1DA0 CD 59 1A CALL LOADFP ; Coefficient to BCDE -4653 1DA3 CD FF 18 CALL FPMULT ; ; Multiply FPREG by coefficient -4654 1DA6 3A C8 30 LD A,(SEED+1) ; Get (SEED+1) -4655 1DA9 3C INC A ; Add 1 -4656 1DAA E6 03 AND 00000011B ; 0 to 3 -4657 1DAC 06 00 LD B,0 -4658 1DAE FE 01 CP 1 ; Is it zero? -4659 1DB0 88 ADC A,B ; Yes - Make it 1 -4660 1DB1 32 C8 30 LD (SEED+1),A ; Re-save seed -4661 1DB4 21 E7 1D LD HL,RNDTAB-4 ; Addition table -4662 1DB7 87 ADD A,A ; 4 bytes -4663 1DB8 87 ADD A,A ; per entry -4664 1DB9 4F LD C,A ; BC = Offset into table -4665 1DBA 09 ADD HL,BC ; Point to value -4666 1DBB CD B5 17 CALL ADDPHL ; Add value to FPREG -4667 1DBE CD 56 1A RND1: CALL BCDEFP ; Move FPREG to BCDE -4668 1DC1 7B LD A,E ; Get LSB -4669 1DC2 59 LD E,C ; LSB = MSB -4670 1DC3 EE 4F XOR 01001111B ; Fiddle around -4671 1DC5 4F LD C,A ; New MSB -4672 1DC6 36 80 LD (HL),80H ; Set exponent -4673 1DC8 2B DEC HL ; Point to MSB -4674 1DC9 46 LD B,(HL) ; Get MSB -4675 1DCA 36 80 LD (HL),80H ; Make value -0.5 -4676 1DCC 21 C7 30 LD HL,SEED ; Random number seed -4677 1DCF 34 INC (HL) ; Count seed -4678 1DD0 7E LD A,(HL) ; Get seed -4679 1DD1 D6 AB SUB 171 ; Do it modulo 171 -4680 1DD3 C2 DA 1D JP NZ,RND2 ; Non-zero - Ok -4681 1DD6 77 LD (HL),A ; Zero seed -4682 1DD7 0C INC C ; Fillde about -4683 1DD8 15 DEC D ; with the -4684 1DD9 1C INC E ; number -4685 1DDA CD 15 18 RND2: CALL BNORM ; Normalise number -4686 1DDD 21 EA 30 LD HL,LSTRND ; Save random number -4687 1DE0 C3 62 1A JP FPTHL ; Move FPREG to last and return -4688 1DE3 -4689 1DE3 77 RESEED: LD (HL),A ; Re-seed random numbers -4690 1DE4 2B DEC HL -4691 1DE5 77 LD (HL),A -4692 1DE6 2B DEC HL -4693 1DE7 77 LD (HL),A -4694 1DE8 C3 BE 1D JP RND1 ; Return RND seed -4695 1DEB -4696 1DEB 68 B1 46 68 RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND -4697 1DEF 99 E9 92 69 .BYTE 099H,0E9H,092H,069H -4698 1DF3 10 D1 75 68 .BYTE 010H,0D1H,075H,068H -4699 1DF7 -4700 1DF7 21 41 1E COS: LD HL,HALFPI ; Point to PI/2 -4701 1DFA CD B5 17 CALL ADDPHL ; Add it to PPREG -4702 1DFD CD 3B 1A SIN: CALL STAKFP ; Put angle on stack -4703 1E00 01 49 83 LD BC,8349H ; BCDE = 2 PI -4704 1E03 11 DB 0F LD DE,0FDBH -4705 1E06 CD 4B 1A CALL FPBCDE ; Move 2 PI to FPREG -4706 1E09 C1 POP BC ; Restore angle -4707 1E0A D1 POP DE -4708 1E0B CD 60 19 CALL DVBCDE ; Divide angle by 2 PI -4709 1E0E CD 3B 1A CALL STAKFP ; Put it on stack -4710 1E11 CD DD 1A CALL INT ; Get INT of result -4711 1E14 C1 POP BC ; Restore number -4712 1E15 D1 POP DE -4713 1E16 CD C1 17 CALL SUBCDE ; Make it 0 <= value < 1 -4714 1E19 21 45 1E LD HL,QUARTR ; Point to 0.25 -4715 1E1C CD BB 17 CALL SUBPHL ; Subtract value from 0.25 -4716 1E1F CD 0A 1A CALL TSTSGN ; Test sign of value -4717 1E22 37 SCF ; Flag positive -4718 1E23 F2 2D 1E JP P,SIN1 ; Positive - Ok -4719 1E26 CD B2 17 CALL ROUND ; Add 0.5 to value -4720 1E29 CD 0A 1A CALL TSTSGN ; Test sign of value -4721 1E2C B7 OR A ; Flag negative -4722 1E2D F5 SIN1: PUSH AF ; Save sign -4723 1E2E F4 33 1A CALL P,INVSGN ; Negate value if positive -4724 1E31 21 45 1E LD HL,QUARTR ; Point to 0.25 -4725 1E34 CD B5 17 CALL ADDPHL ; Add 0.25 to value -4726 1E37 F1 POP AF ; Restore sign -4727 1E38 D4 33 1A CALL NC,INVSGN ; Negative - Make positive -4728 1E3B 21 49 1E LD HL,SINTAB ; Coefficient table -4729 1E3E C3 52 1D JP SUMSER ; Evaluate sum of series -4730 1E41 -4731 1E41 DB 0F 49 81 HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2) -4732 1E45 -4733 1E45 00 00 00 7F QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25 -4734 1E49 -4735 1E49 05 SINTAB: .BYTE 5 ; Table used by SIN -4736 1E4A BA D7 1E 86 .BYTE 0BAH,0D7H,01EH,086H ; 39.711 -4737 1E4E 64 26 99 87 .BYTE 064H,026H,099H,087H ;-76.575 -4738 1E52 58 34 23 87 .BYTE 058H,034H,023H,087H ; 81.602 -4739 1E56 E0 5D A5 86 .BYTE 0E0H,05DH,0A5H,086H ;-41.342 -4740 1E5A DA 0F 49 83 .BYTE 0DAH,00FH,049H,083H ; 6.2832 -4741 1E5E -4742 1E5E CD 3B 1A TAN: CALL STAKFP ; Put angle on stack -4743 1E61 CD FD 1D CALL SIN ; Get SIN of angle -4744 1E64 C1 POP BC ; Restore angle -4745 1E65 E1 POP HL -4746 1E66 CD 3B 1A CALL STAKFP ; Save SIN of angle -4747 1E69 EB EX DE,HL ; BCDE = Angle -4748 1E6A CD 4B 1A CALL FPBCDE ; Angle to FPREG -4749 1E6D CD F7 1D CALL COS ; Get COS of angle -4750 1E70 C3 5E 19 JP DIV ; TAN = SIN / COS -4751 1E73 -4752 1E73 CD 0A 1A ATN: CALL TSTSGN ; Test sign of value -4753 1E76 FC 9E 1C CALL M,NEGAFT ; Negate result after if -ve -4754 1E79 FC 33 1A CALL M,INVSGN ; Negate value if -ve -4755 1E7C 3A 97 31 LD A,(FPEXP) ; Get exponent -4756 1E7F FE 81 CP 81H ; Number less than 1? -4757 1E81 DA 90 1E JP C,ATN1 ; Yes - Get arc tangnt -4758 1E84 01 00 81 LD BC,8100H ; BCDE = 1 -4759 1E87 51 LD D,C -4760 1E88 59 LD E,C -4761 1E89 CD 60 19 CALL DVBCDE ; Get reciprocal of number -4762 1E8C 21 BB 17 LD HL,SUBPHL ; Sub angle from PI/2 -4763 1E8F E5 PUSH HL ; Save for angle > 1 -4764 1E90 21 9A 1E ATN1: LD HL,ATNTAB ; Coefficient table -4765 1E93 CD 52 1D CALL SUMSER ; Evaluate sum of series -4766 1E96 21 41 1E LD HL,HALFPI ; PI/2 - angle in case > 1 -4767 1E99 C9 RET ; Number > 1 - Sub from PI/2 -4768 1E9A -4769 1E9A 09 ATNTAB: .BYTE 9 ; Table used by ATN -4770 1E9B 4A D7 3B 78 .BYTE 04AH,0D7H,03BH,078H ; 1/17 -4771 1E9F 02 6E 84 7B .BYTE 002H,06EH,084H,07BH ;-1/15 -4772 1EA3 FE C1 2F 7C .BYTE 0FEH,0C1H,02FH,07CH ; 1/13 -4773 1EA7 74 31 9A 7D .BYTE 074H,031H,09AH,07DH ;-1/11 -4774 1EAB 84 3D 5A 7D .BYTE 084H,03DH,05AH,07DH ; 1/9 -4775 1EAF C8 7F 91 7E .BYTE 0C8H,07FH,091H,07EH ;-1/7 -4776 1EB3 E4 BB 4C 7E .BYTE 0E4H,0BBH,04CH,07EH ; 1/5 -4777 1EB7 6C AA AA 7F .BYTE 06CH,0AAH,0AAH,07FH ;-1/3 -4778 1EBB 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/1 -4779 1EBF -4780 1EBF -4781 1EBF C9 ARET: RET ; A RETurn instruction -4782 1EC0 -4783 1EC0 D7 GETINP: RST 10H ;input a character -4784 1EC1 C9 RET -4785 1EC2 -4786 1EC2 CLS: -4787 1EC2 3E 0C LD A,CS ; ASCII Clear screen -4788 1EC4 C3 FC 1F JP MONOUT ; Output character -4789 1EC7 -4790 1EC7 CD 89 17 WIDTH: CALL GETINT ; Get integer 0-255 -4791 1ECA 7B LD A,E ; Width to A -4792 1ECB 32 F2 30 LD (LWIDTH),A ; Set width -4793 1ECE C9 RET -4794 1ECF -4795 1ECF CD 28 10 LINES: CALL GETNUM ; Get a number -4796 1ED2 CD 6D 0C CALL DEINT ; Get integer -32768 to 32767 -4797 1ED5 ED 53 F6 30 LD (LINESC),DE ; Set lines counter -4798 1ED9 ED 53 F8 30 LD (LINESN),DE ; Set lines number -4799 1EDD C9 RET -4800 1EDE -4801 1EDE CD 6D 0C DEEK: CALL DEINT ; Get integer -32768 to 32767 -4802 1EE1 D5 PUSH DE ; Save number -4803 1EE2 E1 POP HL ; Number to HL -4804 1EE3 46 LD B,(HL) ; Get LSB of contents -4805 1EE4 23 INC HL -4806 1EE5 7E LD A,(HL) ; Get MSB of contents -4807 1EE6 C3 E3 13 JP ABPASS ; Return integer AB -4808 1EE9 -4809 1EE9 CD 28 10 DOKE: CALL GETNUM ; Get a number -4810 1EEC CD 6D 0C CALL DEINT ; Get integer -32768 to 32767 -4811 1EEF D5 PUSH DE ; Save address -4812 1EF0 CD 31 0A CALL CHKSYN ; Make sure ',' follows -4813 1EF3 2C .BYTE ',' -4814 1EF4 CD 28 10 CALL GETNUM ; Get a number -4815 1EF7 CD 6D 0C CALL DEINT ; Get integer -32768 to 32767 -4816 1EFA E3 EX (SP),HL ; Save value,get address -4817 1EFB 73 LD (HL),E ; Save LSB of value -4818 1EFC 23 INC HL -4819 1EFD 72 LD (HL),D ; Save MSB of value -4820 1EFE E1 POP HL ; Restore code string address -4821 1EFF C9 RET -4822 1F00 -4823 1F00 -4824 1F00 ; HEX$(nn) Convert 16 bit number to Hexadecimal string -4825 1F00 -4826 1F00 CD 2B 10 HEX: CALL TSTNUM ; Verify it's a number -4827 1F03 CD 6D 0C CALL DEINT ; Get integer -32768 to 32767 -4828 1F06 C5 PUSH BC ; Save contents of BC -4829 1F07 21 99 31 LD HL,PBUFF -4830 1F0A 7A LD A,D ; Get high order into A -4831 1F0B FE 00 CP $0 -4832 1F0D 28 0C JR Z,HEX2 ; Skip output if both high digits are zero -4833 1F0F CD 38 1F CALL BYT2ASC ; Convert D to ASCII -4834 1F12 78 LD A,B -4835 1F13 FE 30 CP '0' -4836 1F15 28 02 JR Z,HEX1 ; Don't store high digit if zero -4837 1F17 70 LD (HL),B ; Store it to PBUFF -4838 1F18 23 INC HL ; Next location -4839 1F19 71 HEX1: LD (HL),C ; Store C to PBUFF+1 -4840 1F1A 23 INC HL ; Next location -4841 1F1B 7B HEX2: LD A,E ; Get lower byte -4842 1F1C CD 38 1F CALL BYT2ASC ; Convert E to ASCII -4843 1F1F 7A LD A,D -4844 1F20 FE 00 CP $0 -4845 1F22 20 05 JR NZ,HEX3 ; If upper byte was not zero then always print lower byte -4846 1F24 78 LD A,B -4847 1F25 FE 30 CP '0' ; If high digit of lower byte is zero then don't print -4848 1F27 28 02 JR Z,HEX4 -4849 1F29 70 HEX3: LD (HL),B ; to PBUFF+2 -4850 1F2A 23 INC HL ; Next location -4851 1F2B 71 HEX4: LD (HL),C ; to PBUFF+3 -4852 1F2C 23 INC HL ; PBUFF+4 to zero -4853 1F2D AF XOR A ; Terminating character -4854 1F2E 77 LD (HL),A ; Store zero to terminate -4855 1F2F 23 INC HL ; Make sure PBUFF is terminated -4856 1F30 77 LD (HL),A ; Store the double zero there -4857 1F31 C1 POP BC ; Get BC back -4858 1F32 21 99 31 LD HL,PBUFF ; Reset to start of PBUFF -4859 1F35 C3 91 14 JP STR1 ; Convert the PBUFF to a string and return it -4860 1F38 -4861 1F38 47 BYT2ASC LD B,A ; Save original value -4862 1F39 E6 0F AND $0F ; Strip off upper nybble -4863 1F3B FE 0A CP $0A ; 0-9? -4864 1F3D 38 02 JR C,ADD30 ; If A-F, add 7 more -4865 1F3F C6 07 ADD A,$07 ; Bring value up to ASCII A-F -4866 1F41 C6 30 ADD30 ADD A,$30 ; And make ASCII -4867 1F43 4F LD C,A ; Save converted char to C -4868 1F44 78 LD A,B ; Retrieve original value -4869 1F45 0F RRCA ; and Rotate it right -4870 1F46 0F RRCA -4871 1F47 0F RRCA -4872 1F48 0F RRCA -4873 1F49 E6 0F AND $0F ; Mask off upper nybble -4874 1F4B FE 0A CP $0A ; 0-9? < A hex? -4875 1F4D 38 02 JR C,ADD301 ; Skip Add 7 -4876 1F4F C6 07 ADD A,$07 ; Bring it up to ASCII A-F -4877 1F51 C6 30 ADD301 ADD A,$30 ; And make it full ASCII -4878 1F53 47 LD B,A ; Store high order byte -4879 1F54 C9 RET -4880 1F55 -4881 1F55 ; Convert "&Hnnnn" to FPREG -4882 1F55 ; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" -4883 1F55 ; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 -4884 1F55 EB HEXTFP EX DE,HL ; Move code string pointer to DE -4885 1F56 21 00 00 LD HL,$0000 ; Zero out the value -4886 1F59 CD 6E 1F CALL GETHEX ; Check the number for valid hex -4887 1F5C DA 8E 1F JP C,HXERR ; First value wasn't hex, HX error -4888 1F5F 18 05 JR HEXLP1 ; Convert first character -4889 1F61 CD 6E 1F HEXLP CALL GETHEX ; Get second and addtional characters -4890 1F64 38 1F JR C,HEXIT ; Exit if not a hex character -4891 1F66 29 HEXLP1 ADD HL,HL ; Rotate 4 bits to the left -4892 1F67 29 ADD HL,HL -4893 1F68 29 ADD HL,HL -4894 1F69 29 ADD HL,HL -4895 1F6A B5 OR L ; Add in D0-D3 into L -4896 1F6B 6F LD L,A ; Save new value -4897 1F6C 18 F3 JR HEXLP ; And continue until all hex characters are in -4898 1F6E -4899 1F6E 13 GETHEX INC DE ; Next location -4900 1F6F 1A LD A,(DE) ; Load character at pointer -4901 1F70 FE 20 CP ' ' -4902 1F72 CA 6E 1F JP Z,GETHEX ; Skip spaces -4903 1F75 D6 30 SUB $30 ; Get absolute value -4904 1F77 D8 RET C ; < "0", error -4905 1F78 FE 0A CP $0A -4906 1F7A 38 05 JR C,NOSUB7 ; Is already in the range 0-9 -4907 1F7C D6 07 SUB $07 ; Reduce to A-F -4908 1F7E FE 0A CP $0A ; Value should be $0A-$0F at this point -4909 1F80 D8 RET C ; CY set if was : ; < = > ? @ -4910 1F81 FE 10 NOSUB7 CP $10 ; > Greater than "F"? -4911 1F83 3F CCF -4912 1F84 C9 RET ; CY set if it wasn't valid hex -4913 1F85 -4914 1F85 EB HEXIT EX DE,HL ; Value into DE, Code string into HL -4915 1F86 7A LD A,D ; Load DE into AC -4916 1F87 4B LD C,E ; For prep to -4917 1F88 E5 PUSH HL -4918 1F89 CD E2 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG -4919 1F8C E1 POP HL -4920 1F8D C9 RET -4921 1F8E -4922 1F8E 1E 26 HXERR: LD E,HX ; ?HEX Error -4923 1F90 C3 77 07 JP ERROR -4924 1F93 -4925 1F93 ; BIN$(NN) Convert integer to a 1-16 char binary string -4926 1F93 CD 2B 10 BIN: CALL TSTNUM ; Verify it's a number -4927 1F96 CD 6D 0C CALL DEINT ; Get integer -32768 to 32767 -4928 1F99 C5 BIN2: PUSH BC ; Save contents of BC -4929 1F9A 21 99 31 LD HL,PBUFF -4930 1F9D 06 11 LD B,17 ; One higher than max char count -4931 1F9F ZEROSUP: ; Suppress leading zeros -4932 1F9F 05 DEC B ; Max 16 chars -4933 1FA0 78 LD A,B -4934 1FA1 FE 01 CP $01 -4935 1FA3 28 08 JR Z,BITOUT ; Always output at least one character -4936 1FA5 CB 13 RL E -4937 1FA7 CB 12 RL D -4938 1FA9 30 F4 JR NC,ZEROSUP -4939 1FAB 18 04 JR BITOUT2 -4940 1FAD BITOUT: -4941 1FAD CB 13 RL E -4942 1FAF CB 12 RL D ; Top bit now in carry -4943 1FB1 BITOUT2: -4944 1FB1 3E 30 LD A,'0' ; Char for '0' -4945 1FB3 CE 00 ADC A,0 ; If carry set then '0' --> '1' -4946 1FB5 77 LD (HL),A -4947 1FB6 23 INC HL -4948 1FB7 05 DEC B -4949 1FB8 20 F3 JR NZ,BITOUT -4950 1FBA AF XOR A ; Terminating character -4951 1FBB 77 LD (HL),A ; Store zero to terminate -4952 1FBC 23 INC HL ; Make sure PBUFF is terminated -4953 1FBD 77 LD (HL),A ; Store the double zero there -4954 1FBE C1 POP BC -4955 1FBF 21 99 31 LD HL,PBUFF -4956 1FC2 C3 91 14 JP STR1 -4957 1FC5 -4958 1FC5 ; Convert "&Bnnnn" to FPREG -4959 1FC5 ; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" -4960 1FC5 EB BINTFP: EX DE,HL ; Move code string pointer to DE -4961 1FC6 21 00 00 LD HL,$0000 ; Zero out the value -4962 1FC9 CD E2 1F CALL CHKBIN ; Check the number for valid bin -4963 1FCC DA F0 1F JP C,BINERR ; First value wasn't bin, HX error -4964 1FCF D6 30 BINIT: SUB '0' -4965 1FD1 29 ADD HL,HL ; Rotate HL left -4966 1FD2 B5 OR L -4967 1FD3 6F LD L,A -4968 1FD4 CD E2 1F CALL CHKBIN ; Get second and addtional characters -4969 1FD7 30 F6 JR NC,BINIT ; Process if a bin character -4970 1FD9 EB EX DE,HL ; Value into DE, Code string into HL -4971 1FDA 7A LD A,D ; Load DE into AC -4972 1FDB 4B LD C,E ; For prep to -4973 1FDC E5 PUSH HL -4974 1FDD CD E2 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG -4975 1FE0 E1 POP HL -4976 1FE1 C9 RET -4977 1FE2 -4978 1FE2 ; Char is in A, NC if char is 0 or 1 -4979 1FE2 13 CHKBIN: INC DE -4980 1FE3 1A LD A,(DE) -4981 1FE4 FE 20 CP ' ' -4982 1FE6 CA E2 1F JP Z,CHKBIN ; Skip spaces -4983 1FE9 FE 30 CP '0' ; Set C if < '0' -4984 1FEB D8 RET C -4985 1FEC FE 32 CP '2' -4986 1FEE 3F CCF ; Set C if > '1' -4987 1FEF C9 RET -4988 1FF0 -4989 1FF0 1E 28 BINERR: LD E,BN ; ?BIN Error -4990 1FF2 C3 77 07 JP ERROR -4991 1FF5 -4992 1FF5 -4993 1FF5 JJUMP1: -4994 1FF5 DD 21 FF FF LD IX,-1 ; Flag cold start -4995 1FF9 C3 C7 03 JP CSTART ; Go and initialise -4996 1FFC -4997 1FFC MONOUT: -4998 1FFC C3 08 00 JP $0008 ; output a char -4999 1FFF -5000 1FFF -5001 1FFF MONITR: -5002 1FFF C3 00 00 JP $0000 ; Restart (Normally Monitor Start) -5003 2002 -5004 2002 -5005 2002 3E 00 INITST: LD A,0 ; Clear break flag -5006 2004 32 FD 30 LD (BRKFLG),A -5007 2007 C3 CE 03 JP INIT -5008 200A -5009 200A ED 45 ARETN: RETN ; Return from NMI -5010 200C -5011 200C -5012 200C F5 TSTBIT: PUSH AF ; Save bit mask -5013 200D A0 AND B ; Get common bits -5014 200E C1 POP BC ; Restore bit mask -5015 200F B8 CP B ; Same bit set? -5016 2010 3E 00 LD A,0 ; Return 0 in A -5017 2012 C9 RET -5018 2013 -5019 2013 CD 3C 0A OUTNCR: CALL OUTC ; Output character in A -5020 2016 C3 63 0E JP PRNTCRLF ; Output CRLF -5021 2019 -5022 2019 .end -5023 2019 -tasm: Number of errors = 0 +0001 0000 ;================================================================================== +0002 0000 ; The updates to the original BASIC within this file are copyright Grant Searle +0003 0000 ; +0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0006 0000 ; +0007 0000 ; http://searle.hostei.com/grant/index.html +0008 0000 ; +0009 0000 ; eMail: home.micros01@btinternet.com +0010 0000 ; +0011 0000 ; If the above don't work, please perform an Internet search to see if I have +0012 0000 ; updated the web page hosting service. +0013 0000 ; +0014 0000 ;================================================================================== +0015 0000 +0016 0000 +0017 0000 ;================================================================================== +0018 0000 ; Contents of this file are copyright Grant Searle +0019 0000 ; HEX routines from Joel Owens. +0020 0000 ; +0021 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0022 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0023 0000 ; +0024 0000 ; http://searle.hostei.com/grant/index.html +0025 0000 ; +0026 0000 ; eMail: home.micros01@btinternet.com +0027 0000 ; +0028 0000 ; If the above don't work, please perform an Internet search to see if I have +0029 0000 ; updated the web page hosting service. +0030 0000 ; +0031 0000 ;================================================================================== +0032 0000 +0033 0000 ;------------------------------------------------------------------------------ +0034 0000 ; +0035 0000 ; Z80 Monitor Rom +0036 0000 ; +0037 0000 ;------------------------------------------------------------------------------ +0038 0000 ; General Equates +0039 0000 ;------------------------------------------------------------------------------ +0040 0000 +0041 0000 ;CR .EQU 0DH +0042 0000 ;LF .EQU 0AH +0043 0000 ;ESC .EQU 1BH +0044 0000 ;CTRLC .EQU 03H +0045 0000 M_CLS .EQU 0CH +0046 0000 +0047 0000 +0048 0000 loadAddr .EQU 0D000h ; CP/M load address +0049 0000 numSecs .EQU 24 ; Number of 512 sectors to be loaded +0050 0000 +0051 0000 +0052 0000 RTS_HIGH .EQU 0D5H +0053 0000 RTS_LOW .EQU 095H +0054 0000 +0055 0000 ACIA0_D .EQU $81 +0056 0000 ACIA0_C .EQU $80 +0057 0000 ACIA1_D .EQU $83 +0058 0000 ACIA1_C .EQU $82 +0059 0000 +0060 0000 SD_DATA .EQU 088H +0061 0000 SD_CONTROL .EQU 089H +0062 0000 SD_STATUS .EQU 089H +0063 0000 SD_LBA0 .EQU 08AH +0064 0000 SD_LBA1 .EQU 08BH +0065 0000 SD_LBA2 .EQU 08CH +0066 0000 +0067 3000 .ORG $3000 +0068 3000 +0069 3000 primaryIO .ds 1 +0070 3001 secNo .ds 1 +0071 3002 dmaAddr .ds 2 +0072 3004 +0073 3004 00 lba0 .DB 00h +0074 3005 00 lba1 .DB 00h +0075 3006 00 lba2 .DB 00h +0076 3007 00 lba3 .DB 00h +0077 3008 +0078 3008 stackSpace .ds 32 +0079 3028 M_STACK .EQU $ ; Stack top +0080 3028 +0081 3028 +0082 3028 ;------------------------------------------------------------------------------ +0083 3028 ; START OF MONITOR ROM +0084 3028 ;------------------------------------------------------------------------------ +0085 3028 +0086 0000 MON .ORG $0000 ; MONITOR ROM RESET VECTOR +0087 0000 ;------------------------------------------------------------------------------ +0088 0000 ; Reset +0089 0000 ;------------------------------------------------------------------------------ +0090 0000 F3 RST00 DI ;Disable INTerrupts +0091 0001 C3 94 00 JP M_INIT ;Initialize Hardware and go +0092 0004 00 NOP +0093 0005 00 NOP +0094 0006 00 NOP +0095 0007 00 NOP +0096 0008 ;------------------------------------------------------------------------------ +0097 0008 ; TX a character over RS232 wait for TXDONE first. +0098 0008 ;------------------------------------------------------------------------------ +0099 0008 C3 32 00 RST08 JP conout +0100 000B 00 NOP +0101 000C 00 NOP +0102 000D 00 NOP +0103 000E 00 NOP +0104 000F 00 NOP +0105 0010 ;------------------------------------------------------------------------------ +0106 0010 ; RX a character from buffer wait until char ready. +0107 0010 ;------------------------------------------------------------------------------ +0108 0010 C3 1B 00 RST10 JP conin +0109 0013 00 NOP +0110 0014 00 NOP +0111 0015 00 NOP +0112 0016 00 NOP +0113 0017 00 NOP +0114 0018 ;------------------------------------------------------------------------------ +0115 0018 ; Check input buffer status +0116 0018 ;------------------------------------------------------------------------------ +0117 0018 C3 5C 00 RST18 JP CKINCHAR +0118 001B +0119 001B +0120 001B ;------------------------------------------------------------------------------ +0121 001B ; Console input routine +0122 001B ; Use the "primaryIO" flag to determine which input port to monitor. +0123 001B ;------------------------------------------------------------------------------ +0124 001B conin: +0125 001B 3A 00 30 LD A,(primaryIO) +0126 001E FE 00 CP 0 +0127 0020 20 08 JR NZ,coninB +0128 0022 coninA: +0129 0022 +0130 0022 waitForCharA: +0131 0022 CD 63 00 call ckincharA +0132 0025 28 FB JR Z, waitForCharA +0133 0027 DB 81 IN A,(ACIA0_D) +0134 0029 C9 RET ; Char ready in A +0135 002A +0136 002A coninB: +0137 002A +0138 002A waitForCharB: +0139 002A CD 6A 00 call ckincharB +0140 002D 28 FB JR Z, waitForCharB +0141 002F DB 83 IN A,(ACIA1_D) +0142 0031 C9 RET ; Char ready in A +0143 0032 +0144 0032 ;------------------------------------------------------------------------------ +0145 0032 ; Console output routine +0146 0032 ; Use the "primaryIO" flag to determine which output port to send a character. +0147 0032 ;------------------------------------------------------------------------------ +0148 0032 F5 conout: PUSH AF ; Store character +0149 0033 3A 00 30 LD A,(primaryIO) +0150 0036 FE 00 CP 0 +0151 0038 20 0D JR NZ,conoutB1 +0152 003A 18 01 JR conoutA1 +0153 003C conoutA: +0154 003C F5 PUSH AF +0155 003D +0156 003D CD 50 00 conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting +0157 0040 28 FB JR Z,conoutA1 ; Loop until ACIA flag signals ready +0158 0042 F1 POP AF ; RETrieve character +0159 0043 D3 81 OUT (ACIA0_D),A ; OUTput the character +0160 0045 C9 RET +0161 0046 +0162 0046 conoutB: +0163 0046 F5 PUSH AF +0164 0047 +0165 0047 CD 56 00 conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting +0166 004A 28 FB JR Z,conoutB1 ; Loop until ACIA flag signals ready +0167 004C F1 POP AF ; RETrieve character +0168 004D D3 83 OUT (ACIA1_D),A ; OUTput the character +0169 004F C9 RET +0170 0050 +0171 0050 ;------------------------------------------------------------------------------ +0172 0050 ; I/O status check routine +0173 0050 ; Use the "primaryIO" flag to determine which port to check. +0174 0050 ;------------------------------------------------------------------------------ +0175 0050 CKACIA0 +0176 0050 DB 80 IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready +0177 0052 0F RRCA ; Rotates RX status into Carry Flag, +0178 0053 CB 47 BIT 0,A ; Set Zero flag if still transmitting character +0179 0055 C9 RET +0180 0056 +0181 0056 CKACIA1 +0182 0056 DB 82 IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready +0183 0058 0F RRCA ; Rotates RX status into Carry Flag, +0184 0059 CB 47 BIT 0,A ; Set Zero flag if still transmitting character +0185 005B C9 RET +0186 005C +0187 005C ;------------------------------------------------------------------------------ +0188 005C ; Check if there is a character in the input buffer +0189 005C ; Use the "primaryIO" flag to determine which port to check. +0190 005C ;------------------------------------------------------------------------------ +0191 005C CKINCHAR +0192 005C 3A 00 30 LD A,(primaryIO) +0193 005F FE 00 CP 0 +0194 0061 20 07 JR NZ,ckincharB +0195 0063 +0196 0063 ckincharA: +0197 0063 +0198 0063 DB 80 IN A,(ACIA0_C) ; Status byte +0199 0065 E6 01 AND $01 +0200 0067 FE 00 CP $0 ; Z flag set if no char +0201 0069 C9 RET +0202 006A +0203 006A ckincharB: +0204 006A +0205 006A DB 82 IN A,(ACIA1_C) ; Status byte +0206 006C E6 01 AND $01 +0207 006E FE 00 CP $0 ; Z flag set if no char +0208 0070 C9 RET +0209 0071 +0210 0071 ;------------------------------------------------------------------------------ +0211 0071 ; Filtered Character I/O +0212 0071 ;------------------------------------------------------------------------------ +0213 0071 +0214 0071 D7 RDCHR RST 10H +0215 0072 FE 0A CP LF +0216 0074 28 FB JR Z,RDCHR ; Ignore LF +0217 0076 FE 1B CP ESC +0218 0078 20 02 JR NZ,RDCHR1 +0219 007A 3E 03 LD A,CTRLC ; Change ESC to CTRL-C +0220 007C C9 RDCHR1 RET +0221 007D +0222 007D FE 0D WRCHR CP CR +0223 007F 28 0A JR Z,WRCRLF ; When CR, write CRLF +0224 0081 FE 0C CP M_CLS +0225 0083 28 04 JR Z,WR ; Allow write of "CLS" +0226 0085 FE 20 CP ' ' ; Don't write out any other control codes +0227 0087 38 01 JR C,NOWR ; ie. < space +0228 0089 CF WR RST 08H +0229 008A C9 NOWR RET +0230 008B +0231 008B 3E 0D WRCRLF LD A,CR +0232 008D CF RST 08H +0233 008E 3E 0A LD A,LF +0234 0090 CF RST 08H +0235 0091 3E 0D LD A,CR +0236 0093 C9 RET +0237 0094 +0238 0094 +0239 0094 ;------------------------------------------------------------------------------ +0240 0094 ; Initialise hardware and start main loop +0241 0094 ;------------------------------------------------------------------------------ +0242 0094 31 28 30 M_INIT LD SP,M_STACK ; Set the Stack Pointer +0243 0097 +0244 0097 3E 95 LD A,RTS_LOW +0245 0099 D3 80 OUT (ACIA0_C),A ; Initialise ACIA0 +0246 009B D3 82 OUT (ACIA1_C),A ; Initialise ACIA1 +0247 009D ; Display the "Press space to start" message on both consoles +0248 009D 3E 00 LD A,$00 +0249 009F 32 00 30 LD (primaryIO),A +0250 00A2 21 65 03 LD HL,INITTXT +0251 00A5 CD 1B 01 CALL M_PRINT +0252 00A8 3E 01 LD A,$01 +0253 00AA 32 00 30 LD (primaryIO),A +0254 00AD 21 65 03 LD HL,INITTXT +0255 00B0 CD 1B 01 CALL M_PRINT +0256 00B3 +0257 00B3 ; Wait until space is in one of the buffers to determine the active console +0258 00B3 +0259 00B3 waitForSpace: +0260 00B3 +0261 00B3 CD 63 00 CALL ckincharA +0262 00B6 28 0F jr Z,notInA +0263 00B8 3E 00 LD A,$00 +0264 00BA 32 00 30 LD (primaryIO),A +0265 00BD CD 1B 00 CALL conin +0266 00C0 FE 20 CP ' ' +0267 00C2 C2 B3 00 JP NZ, waitForSpace +0268 00C5 18 14 JR spacePressed +0269 00C7 +0270 00C7 notInA: +0271 00C7 CD 6A 00 CALL ckincharB +0272 00CA 28 E7 JR Z,waitForSpace +0273 00CC 3E 01 LD A,$01 +0274 00CE 32 00 30 LD (primaryIO),A +0275 00D1 CD 1B 00 CALL conin +0276 00D4 FE 20 CP ' ' +0277 00D6 C2 B3 00 JP NZ, waitForSpace +0278 00D9 18 00 JR spacePressed +0279 00DB +0280 00DB spacePressed: +0281 00DB +0282 00DB ; Clear message on both consoles +0283 00DB 3E 0C LD A,$0C +0284 00DD CD 3C 00 CALL conoutA +0285 00E0 CD 46 00 CALL conoutB +0286 00E3 +0287 00E3 ; primaryIO is now set to the channel where SPACE was pressed +0288 00E3 +0289 00E3 +0290 00E3 CD 22 01 CALL TXCRLF ; TXCRLF +0291 00E6 21 96 02 LD HL,M_SIGNON ; Print SIGNON message +0292 00E9 CD 1B 01 CALL M_PRINT +0293 00EC +0294 00EC ;------------------------------------------------------------------------------ +0295 00EC ; Monitor command loop +0296 00EC ;------------------------------------------------------------------------------ +0297 00EC 21 EC 00 MAIN LD HL,MAIN ; Save entry point for Monitor +0298 00EF E5 PUSH HL ; This is the return address +0299 00F0 CD 22 01 MAIN0 CALL TXCRLF ; Entry point for Monitor, Normal +0300 00F3 3E 3E LD A,'>' ; Get a ">" +0301 00F5 CF RST 08H ; print it +0302 00F6 +0303 00F6 CD 71 00 MAIN1 CALL RDCHR ; Get a character from the input port +0304 00F9 FE 20 CP ' ' ; or less? +0305 00FB 38 F9 JR C,MAIN1 ; Go back +0306 00FD +0307 00FD FE 3A CP ':' ; ":"? +0308 00FF CA 99 01 JP Z,LOAD ; First character of a HEX load +0309 0102 +0310 0102 CD 7D 00 CALL WRCHR ; Print char on console +0311 0105 +0312 0105 E6 5F AND $5F ; Make character uppercase +0313 0107 +0314 0107 FE 42 CP 'B' +0315 0109 CA DA 01 JP Z,BASIC +0316 010C +0317 010C FE 47 CP 'G' +0318 010E CA 93 01 JP Z,M_GOTO +0319 0111 +0320 0111 FE 58 CP 'X' +0321 0113 CA F1 01 JP Z,CPMLOAD +0322 0116 +0323 0116 3E 3F LD A,'?' ; Get a "?" +0324 0118 CF RST 08H ; Print it +0325 0119 18 D5 JR MAIN0 +0326 011B +0327 011B ;------------------------------------------------------------------------------ +0328 011B ; Print string of characters to Serial A until byte=$00, WITH CR, LF +0329 011B ;------------------------------------------------------------------------------ +0330 011B 7E M_PRINT LD A,(HL) ; Get character +0331 011C B7 OR A ; Is it $00 ? +0332 011D C8 RET Z ; Then RETurn on terminator +0333 011E CF RST 08H ; Print it +0334 011F 23 INC HL ; Next Character +0335 0120 18 F9 JR M_PRINT ; Continue until $00 +0336 0122 +0337 0122 +0338 0122 3E 0D TXCRLF LD A,$0D ; +0339 0124 CF RST 08H ; Print character +0340 0125 3E 0A LD A,$0A ; +0341 0127 CF RST 08H ; Print character +0342 0128 C9 RET +0343 0129 +0344 0129 ;------------------------------------------------------------------------------ +0345 0129 ; Get a character from the console, must be $20-$7F to be valid (no control characters) +0346 0129 ; and breaks with the Zero Flag set +0347 0129 ;------------------------------------------------------------------------------ +0348 0129 CD 71 00 M_GETCHR CALL RDCHR ; RX a Character +0349 012C FE 03 CP $03 ; User break? +0350 012E C8 RET Z +0351 012F FE 20 CP $20 ; or better? +0352 0131 38 F6 JR C,M_GETCHR ; Do it again until we get something usable +0353 0133 C9 RET +0354 0134 ;------------------------------------------------------------------------------ +0355 0134 ; Gets two ASCII characters from the console (assuming them to be HEX 0-9 A-F) +0356 0134 ; Moves them into B and C, converts them into a byte value in A and updates a +0357 0134 ; Checksum value in E +0358 0134 ;------------------------------------------------------------------------------ +0359 0134 CD 29 01 GET2 CALL M_GETCHR ; Get us a valid character to work with +0360 0137 47 LD B,A ; Load it in B +0361 0138 CD 29 01 CALL M_GETCHR ; Get us another character +0362 013B 4F LD C,A ; load it in C +0363 013C CD 73 01 CALL BCTOA ; Convert ASCII to byte +0364 013F 4F LD C,A ; Build the checksum +0365 0140 7B LD A,E +0366 0141 91 SUB C ; The checksum should always equal zero when checked +0367 0142 5F LD E,A ; Save the checksum back where it came from +0368 0143 79 LD A,C ; Retrieve the byte and go back +0369 0144 C9 RET +0370 0145 ;------------------------------------------------------------------------------ +0371 0145 ; Gets four Hex characters from the console, converts them to values in HL +0372 0145 ;------------------------------------------------------------------------------ +0373 0145 21 00 00 GETHL LD HL,$0000 ; Gets xxxx but sets Carry Flag on any Terminator +0374 0148 CD 8C 01 CALL ECHO ; RX a Character +0375 014B FE 0D CP $0D ; ? +0376 014D 20 0E JR NZ,GETX2 ; other key +0377 014F 37 SETCY SCF ; Set Carry Flag +0378 0150 C9 RET ; and Return to main program +0379 0151 ;------------------------------------------------------------------------------ +0380 0151 ; This routine converts last four hex characters (0-9 A-F) user types into a value in HL +0381 0151 ; Rotates the old out and replaces with the new until the user hits a terminating character +0382 0151 ;------------------------------------------------------------------------------ +0383 0151 21 00 00 GETX LD HL,$0000 ; CLEAR HL +0384 0154 CD 8C 01 GETX1 CALL ECHO ; RX a character from the console +0385 0157 FE 0D CP $0D ; +0386 0159 C8 RET Z ; quit +0387 015A FE 2C CP $2C ; <,> can be used to safely quit for multiple entries +0388 015C C8 RET Z ; (Like filling both DE and HL from the user) +0389 015D FE 03 GETX2 CP $03 ; Likewise, a will terminate clean, too, but +0390 015F 28 EE JR Z,SETCY ; It also sets the Carry Flag for testing later. +0391 0161 29 ADD HL,HL ; Otherwise, rotate the previous low nibble to high +0392 0162 29 ADD HL,HL ; rather slowly +0393 0163 29 ADD HL,HL ; until we get to the top +0394 0164 29 ADD HL,HL ; and then we can continue on. +0395 0165 D6 30 SUB $30 ; Convert ASCII to byte value +0396 0167 FE 0A CP $0A ; Are we in the 0-9 range? +0397 0169 38 02 JR C,GETX3 ; Then we just need to sub $30, but if it is A-F +0398 016B D6 07 SUB $07 ; We need to take off 7 more to get the value down to +0399 016D E6 0F GETX3 AND $0F ; to the right hex value +0400 016F 85 ADD A,L ; Add the high nibble to the low +0401 0170 6F LD L,A ; Move the byte back to A +0402 0171 18 E1 JR GETX1 ; and go back for next character until he terminates +0403 0173 ;------------------------------------------------------------------------------ +0404 0173 ; Convert ASCII characters in B C registers to a byte value in A +0405 0173 ;------------------------------------------------------------------------------ +0406 0173 78 BCTOA LD A,B ; Move the hi order byte to A +0407 0174 D6 30 SUB $30 ; Take it down from Ascii +0408 0176 FE 0A CP $0A ; Are we in the 0-9 range here? +0409 0178 38 02 JR C,BCTOA1 ; If so, get the next nybble +0410 017A D6 07 SUB $07 ; But if A-F, take it down some more +0411 017C 07 BCTOA1 RLCA ; Rotate the nybble from low to high +0412 017D 07 RLCA ; One bit at a time +0413 017E 07 RLCA ; Until we +0414 017F 07 RLCA ; Get there with it +0415 0180 47 LD B,A ; Save the converted high nybble +0416 0181 79 LD A,C ; Now get the low order byte +0417 0182 D6 30 SUB $30 ; Convert it down from Ascii +0418 0184 FE 0A CP $0A ; 0-9 at this point? +0419 0186 38 02 JR C,BCTOA2 ; Good enough then, but +0420 0188 D6 07 SUB $07 ; Take off 7 more if it's A-F +0421 018A 80 BCTOA2 ADD A,B ; Add in the high order nybble +0422 018B C9 RET +0423 018C +0424 018C ;------------------------------------------------------------------------------ +0425 018C ; Get a character and echo it back to the user +0426 018C ;------------------------------------------------------------------------------ +0427 018C CD 71 00 ECHO CALL RDCHR +0428 018F CD 7D 00 CALL WRCHR +0429 0192 C9 RET +0430 0193 +0431 0193 ;------------------------------------------------------------------------------ +0432 0193 ; GOTO command +0433 0193 ;------------------------------------------------------------------------------ +0434 0193 CD 45 01 M_GOTO CALL GETHL ; ENTRY POINT FOR oto addr. Get XXXX from user. +0435 0196 D8 RET C ; Return if invalid +0436 0197 E5 PUSH HL +0437 0198 C9 RET ; Jump to HL address value +0438 0199 +0439 0199 ;------------------------------------------------------------------------------ +0440 0199 ; LOAD Intel Hex format file from the console. +0441 0199 ; [Intel Hex Format is: +0442 0199 ; 1) Colon (Frame 0) +0443 0199 ; 2) Record Length Field (Frames 1 and 2) +0444 0199 ; 3) Load Address Field (Frames 3,4,5,6) +0445 0199 ; 4) Record Type Field (Frames 7 and 8) +0446 0199 ; 5) Data Field (Frames 9 to 9+2*(Record Length)-1 +0447 0199 ; 6) Checksum Field - Sum of all byte values from Record Length to and +0448 0199 ; including Checksum Field = 0 ] +0449 0199 ;------------------------------------------------------------------------------ +0450 0199 1E 00 LOAD LD E,0 ; First two Characters is the Record Length Field +0451 019B CD 34 01 CALL GET2 ; Get us two characters into BC, convert it to a byte +0452 019E 57 LD D,A ; Load Record Length count into D +0453 019F CD 34 01 CALL GET2 ; Get next two characters, Memory Load Address +0454 01A2 67 LD H,A ; put value in H register. +0455 01A3 CD 34 01 CALL GET2 ; Get next two characters, Memory Load Address +0456 01A6 6F LD L,A ; put value in L register. +0457 01A7 CD 34 01 CALL GET2 ; Get next two characters, Record Field Type +0458 01AA FE 01 CP $01 ; Record Field Type 00 is Data, 01 is End of File +0459 01AC 20 09 JR NZ,LOAD2 ; Must be the end of that file +0460 01AE CD 34 01 CALL GET2 ; Get next two characters, assemble into byte +0461 01B1 7B LD A,E ; Recall the Checksum byte +0462 01B2 A7 AND A ; Is it Zero? +0463 01B3 28 1E JR Z,LOAD00 ; Print footer reached message +0464 01B5 18 15 JR LOADERR ; Checksums don't add up, Error out +0465 01B7 +0466 01B7 7A LOAD2 LD A,D ; Retrieve line character counter +0467 01B8 A7 AND A ; Are we done with this line? +0468 01B9 28 0B JR Z,LOAD3 ; Get two more ascii characters, build a byte and checksum +0469 01BB CD 34 01 CALL GET2 ; Get next two chars, convert to byte in A, checksum it +0470 01BE 77 LD (HL),A ; Move converted byte in A to memory location +0471 01BF 23 INC HL ; Increment pointer to next memory location +0472 01C0 3E 2E LD A,'.' ; Print out a "." for every byte loaded +0473 01C2 CF RST 08H ; +0474 01C3 15 DEC D ; Decrement line character counter +0475 01C4 18 F1 JR LOAD2 ; and keep loading into memory until line is complete +0476 01C6 +0477 01C6 CD 34 01 LOAD3 CALL GET2 ; Get two chars, build byte and checksum +0478 01C9 7B LD A,E ; Check the checksum value +0479 01CA A7 AND A ; Is it zero? +0480 01CB C8 RET Z +0481 01CC +0482 01CC 21 54 03 LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message +0483 01CF CD 1B 01 CALL M_PRINT ; Print Message from (HL) and terminate the load +0484 01D2 C9 RET +0485 01D3 +0486 01D3 21 8A 03 LOAD00 LD HL,LDETXT ; Print load complete message +0487 01D6 CD 1B 01 CALL M_PRINT +0488 01D9 C9 RET +0489 01DA +0490 01DA ;------------------------------------------------------------------------------ +0491 01DA ; Start BASIC command +0492 01DA ;------------------------------------------------------------------------------ +0493 01DA BASIC +0494 01DA 21 42 03 LD HL,M_BASTXT +0495 01DD CD 1B 01 CALL M_PRINT +0496 01E0 CD 29 01 CALL M_GETCHR +0497 01E3 C8 RET Z ; Cancel if CTRL-C +0498 01E4 E6 5F AND $5F ; uppercase +0499 01E6 FE 43 CP 'C' +0500 01E8 CA 95 03 JP Z,COLD +0501 01EB FE 57 CP 'W' +0502 01ED CA 98 03 JP Z,WARM +0503 01F0 C9 RET +0504 01F1 +0505 01F1 ;------------------------------------------------------------------------------ +0506 01F1 ; CP/M load command +0507 01F1 ;------------------------------------------------------------------------------ +0508 01F1 CPMLOAD +0509 01F1 +0510 01F1 21 03 02 LD HL,CPMTXT +0511 01F4 CD 1B 01 CALL M_PRINT +0512 01F7 CD 29 01 CALL M_GETCHR +0513 01FA C8 RET Z ; Cancel if CTRL-C +0514 01FB E6 5F AND $5F ; uppercase +0515 01FD FE 59 CP 'Y' +0516 01FF CA 24 02 JP Z,CPMLOAD2 +0517 0202 C9 RET +0518 0203 CPMTXT +0519 0203 0D 0A .BYTE $0D,$0A +0520 0205 426F6F742043 .TEXT "Boot CP/M?" +0520 020B 502F4D3F +0521 020F 00 .BYTE $00 +0522 0210 +0523 0210 CPMTXT2 +0524 0210 0D 0A .BYTE $0D,$0A +0525 0212 4C6F6164696E .TEXT "Loading CP/M..." +0525 0218 672043502F4D2E2E2E +0526 0221 0D 0A 00 .BYTE $0D,$0A,$00 +0527 0224 +0528 0224 CPMLOAD2 +0529 0224 21 10 02 LD HL,CPMTXT2 +0530 0227 CD 1B 01 CALL M_PRINT +0531 022A +0532 022A 06 18 LD B,numSecs +0533 022C +0534 022C 3E 00 LD A,0 +0535 022E 32 04 30 LD (lba0),A +0536 0231 32 05 30 ld (lba1),A +0537 0234 32 06 30 ld (lba2),A +0538 0237 32 07 30 ld (lba3),A +0539 023A +0540 023A 21 00 D0 LD HL,loadAddr +0541 023D 22 02 30 LD (dmaAddr),HL +0542 0240 processSectors: +0543 0240 +0544 0240 CD 6E 02 call readhst +0545 0243 +0546 0243 11 00 02 LD DE,0200H +0547 0246 2A 02 30 LD HL,(dmaAddr) +0548 0249 19 ADD HL,DE +0549 024A 22 02 30 LD (dmaAddr),HL +0550 024D 3A 04 30 LD A,(lba0) +0551 0250 3C INC A +0552 0251 32 04 30 LD (lba0),A +0553 0254 +0554 0254 10 EA djnz processSectors +0555 0256 +0556 0256 ; Start CP/M using entry at top of BIOS +0557 0256 ; The current active console stream ID is pushed onto the stack +0558 0256 ; to allow the CBIOS to pick it up +0559 0256 ; 0 = ACIA0, 1 = ACIA1 +0560 0256 +0561 0256 3A 00 30 ld A,(primaryIO) +0562 0259 F5 PUSH AF +0563 025A 2A FE FF ld HL,($FFFE) +0564 025D E9 jp (HL) +0565 025E +0566 025E +0567 025E ;------------------------------------------------------------------------------ +0568 025E ; ROUTINES AS USED IN BIOS +0569 025E ;------------------------------------------------------------------------------ +0570 025E +0571 025E ;================================================================================================ +0572 025E ; Convert track/head/sector into LBA for physical access to the disk +0573 025E ;================================================================================================ +0574 025E setLBAaddr: +0575 025E ; Transfer LBA to disk (LBA3 not used on SD card) +0576 025E 3A 06 30 LD A,(lba2) +0577 0261 D3 8C OUT (SD_LBA2),A +0578 0263 3A 05 30 LD A,(lba1) +0579 0266 D3 8B OUT (SD_LBA1),A +0580 0268 3A 04 30 LD A,(lba0) +0581 026B D3 8A OUT (SD_LBA0),A +0582 026D C9 RET +0583 026E +0584 026E ;================================================================================================ +0585 026E ; Read physical sector from host +0586 026E ;================================================================================================ +0587 026E +0588 026E readhst: +0589 026E F5 PUSH AF +0590 026F C5 PUSH BC +0591 0270 E5 PUSH HL +0592 0271 +0593 0271 DB 89 rdWait1: IN A,(SD_STATUS) +0594 0273 FE 80 CP 128 +0595 0275 20 FA JR NZ,rdWait1 +0596 0277 +0597 0277 CD 5E 02 CALL setLBAaddr +0598 027A +0599 027A 3E 00 LD A,$00 ; 00 = Read block +0600 027C D3 89 OUT (SD_CONTROL),A +0601 027E +0602 027E 0E 04 LD c,4 +0603 0280 ; LD HL,hstbuf +0604 0280 rd4secs: +0605 0280 06 80 LD b,128 +0606 0282 rdByte: +0607 0282 +0608 0282 DB 89 rdWait2: IN A,(SD_STATUS) +0609 0284 FE E0 CP 224 ; Read byte waiting +0610 0286 20 FA JR NZ,rdWait2 +0611 0288 +0612 0288 DB 88 IN A,(SD_DATA) +0613 028A +0614 028A 77 LD (HL),A +0615 028B 23 INC HL +0616 028C 05 dec b +0617 028D 20 F3 JR NZ, rdByte +0618 028F 0D dec c +0619 0290 20 EE JR NZ,rd4secs +0620 0292 +0621 0292 E1 POP HL +0622 0293 C1 POP BC +0623 0294 F1 POP AF +0624 0295 +0625 0295 ; XOR a +0626 0295 ; ld (erflag),a +0627 0295 C9 RET +0628 0296 +0629 0296 ;------------------------------------------------------------------------------ +0630 0296 ; END OF ROUTINES AS USED IN BIOS +0631 0296 ;------------------------------------------------------------------------------ +0632 0296 +0633 0296 +0634 0296 43502F4D2042M_SIGNON .BYTE "CP/M Boot ROM 2.0" +0634 029C 6F6F7420524F4D20322E30 +0635 02A7 20627920472E .BYTE " by G. Searle" +0635 02AD 20536561726C65 +0636 02B4 0D 0A .BYTE $0D,$0A +0637 02B6 0D 0A .BYTE $0D,$0A +0638 02B8 4243206F7220 .TEXT "BC or BW - ROM BASIC Cold/Warm" +0638 02BE 4257202D20524F4D20424153494320436F6C642F5761726D +0639 02D6 0D 0A .BYTE $0D,$0A +0640 02D8 582020202020 .TEXT "X - Boot CP/M (load $D000-$FFFF)" +0640 02DE 2020202D20426F6F742043502F4D20286C6F61642024443030302D244646464629 +0641 02FF 0D 0A .BYTE $0D,$0A +0642 0301 3A6E6E6E6E2E .TEXT ":nnnn... - Load Intel-Hex file record" +0642 0307 2E2E202D204C6F616420496E74656C2D4865782066696C65207265636F7264 +0643 0326 0D 0A .BYTE $0D,$0A +0644 0328 476E6E6E6E20 .TEXT "Gnnnn - Run loc nnnn" +0644 032E 2020202D2052756E206C6F63206E6E6E6E +0645 033F 0D 0A .BYTE $0D,$0A +0646 0341 00 .BYTE $00 +0647 0342 +0648 0342 M_BASTXT +0649 0342 0D 0A .BYTE $0D,$0A +0650 0344 436F6C64206F .TEXT "Cold or warm?" +0650 034A 72207761726D3F +0651 0351 0D 0A 00 .BYTE $0D,$0A,$00 +0652 0354 +0653 0354 436865636B73CKSUMERR .BYTE "Checksum error" +0653 035A 756D206572726F72 +0654 0362 0D 0A 00 .BYTE $0D,$0A,$00 +0655 0365 +0656 0365 INITTXT +0657 0365 0C .BYTE $0C +0658 0366 507265737320 .TEXT "Press [SPACE] to activate console" +0658 036C 5B53504143455D20746F20616374697661746520636F6E736F6C65 +0659 0387 0D 0A 00 .BYTE $0D,$0A, $00 +0660 038A +0661 038A LDETXT +0662 038A 436F6D706C65 .TEXT "Complete" +0662 0390 7465 +0663 0392 0D 0A 00 .BYTE $0D,$0A, $00 +0664 0395 +0665 0395 ;=========================================================================================================================== +0666 0395 +0667 0395 ; NASCOM ROM BASIC Ver 4.7, (C) 1978 Microsoft +0668 0395 ; Scanned from source published in 80-BUS NEWS from Vol 2, Issue 3 +0669 0395 ; (May-June 1983) to Vol 3, Issue 3 (May-June 1984) +0670 0395 ; Adapted for the freeware Zilog Macro Assembler 2.10 to produce +0671 0395 ; the original ROM code (checksum A934H). PA +0672 0395 +0673 0395 ; GENERAL EQUATES +0674 0395 +0675 0395 CTRLC .EQU 03H ; Control "C" +0676 0395 CTRLG .EQU 07H ; Control "G" +0677 0395 BKSP .EQU 08H ; Back space +0678 0395 LF .EQU 0AH ; Line feed +0679 0395 CS .EQU 0CH ; Clear screen +0680 0395 CR .EQU 0DH ; Carriage return +0681 0395 CTRLO .EQU 0FH ; Control "O" +0682 0395 CTRLQ .EQU 11H ; Control "Q" +0683 0395 CTRLR .EQU 12H ; Control "R" +0684 0395 CTRLS .EQU 13H ; Control "S" +0685 0395 CTRLU .EQU 15H ; Control "U" +0686 0395 ESC .EQU 1BH ; Escape +0687 0395 DEL .EQU 7FH ; Delete +0688 0395 +0689 0395 ; BASIC WORK SPACE LOCATIONS +0690 0395 +0691 0395 WRKSPC .EQU 30B0H ; BASIC Work space +0692 0395 USR .EQU WRKSPC+3H ; "USR (x)" jump +0693 0395 OUTSUB .EQU WRKSPC+6H ; "OUT p,n" +0694 0395 OTPORT .EQU WRKSPC+7H ; Port (p) +0695 0395 DIVSUP .EQU WRKSPC+9H ; Division support routine +0696 0395 DIV1 .EQU WRKSPC+0AH ; <- Values +0697 0395 DIV2 .EQU WRKSPC+0EH ; <- to +0698 0395 DIV3 .EQU WRKSPC+12H ; <- be +0699 0395 DIV4 .EQU WRKSPC+15H ; <-inserted +0700 0395 SEED .EQU WRKSPC+17H ; Random number seed +0701 0395 LSTRND .EQU WRKSPC+3AH ; Last random number +0702 0395 INPSUB .EQU WRKSPC+3EH ; #INP (x)" Routine +0703 0395 INPORT .EQU WRKSPC+3FH ; PORT (x) +0704 0395 NULLS .EQU WRKSPC+41H ; Number of nulls +0705 0395 LWIDTH .EQU WRKSPC+42H ; Terminal width +0706 0395 COMMAN .EQU WRKSPC+43H ; Width for commas +0707 0395 NULFLG .EQU WRKSPC+44H ; Null after input byte flag +0708 0395 CTLOFG .EQU WRKSPC+45H ; Control "O" flag +0709 0395 LINESC .EQU WRKSPC+46H ; Lines counter +0710 0395 LINESN .EQU WRKSPC+48H ; Lines number +0711 0395 CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum +0712 0395 NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine +0713 0395 BRKFLG .EQU WRKSPC+4DH ; Break flag +0714 0395 RINPUT .EQU WRKSPC+4EH ; Input reflection +0715 0395 POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) +0716 0395 PSET .EQU WRKSPC+54H ; "SET" reflection +0717 0395 RESET .EQU WRKSPC+57H ; "RESET" reflection +0718 0395 STRSPC .EQU WRKSPC+5AH ; Bottom of string space +0719 0395 LINEAT .EQU WRKSPC+5CH ; Current line number +0720 0395 BASTXT .EQU WRKSPC+5EH ; Pointer to start of program +0721 0395 BUFFER .EQU WRKSPC+61H ; Input buffer +0722 0395 STACK .EQU WRKSPC+66H ; Initial stack +0723 0395 CURPOS .EQU WRKSPC+0ABH ; Character position on line +0724 0395 LCRFLG .EQU WRKSPC+0ACH ; Locate/Create flag +0725 0395 TYPE .EQU WRKSPC+0ADH ; Data type flag +0726 0395 DATFLG .EQU WRKSPC+0AEH ; Literal statement flag +0727 0395 LSTRAM .EQU WRKSPC+0AFH ; Last available RAM +0728 0395 TMSTPT .EQU WRKSPC+0B1H ; Temporary string pointer +0729 0395 TMSTPL .EQU WRKSPC+0B3H ; Temporary string pool +0730 0395 TMPSTR .EQU WRKSPC+0BFH ; Temporary string +0731 0395 STRBOT .EQU WRKSPC+0C3H ; Bottom of string space +0732 0395 CUROPR .EQU WRKSPC+0C5H ; Current operator in EVAL +0733 0395 LOOPST .EQU WRKSPC+0C7H ; First statement of loop +0734 0395 DATLIN .EQU WRKSPC+0C9H ; Line of current DATA item +0735 0395 FORFLG .EQU WRKSPC+0CBH ; "FOR" loop flag +0736 0395 LSTBIN .EQU WRKSPC+0CCH ; Last byte entered +0737 0395 READFG .EQU WRKSPC+0CDH ; Read/Input flag +0738 0395 BRKLIN .EQU WRKSPC+0CEH ; Line of break +0739 0395 NXTOPR .EQU WRKSPC+0D0H ; Next operator in EVAL +0740 0395 ERRLIN .EQU WRKSPC+0D2H ; Line of error +0741 0395 CONTAD .EQU WRKSPC+0D4H ; Where to CONTinue +0742 0395 PROGND .EQU WRKSPC+0D6H ; End of program +0743 0395 VAREND .EQU WRKSPC+0D8H ; End of variables +0744 0395 ARREND .EQU WRKSPC+0DAH ; End of arrays +0745 0395 NXTDAT .EQU WRKSPC+0DCH ; Next data item +0746 0395 FNRGNM .EQU WRKSPC+0DEH ; Name of FN argument +0747 0395 FNARG .EQU WRKSPC+0E0H ; FN argument value +0748 0395 FPREG .EQU WRKSPC+0E4H ; Floating point register +0749 0395 FPEXP .EQU FPREG+3 ; Floating point exponent +0750 0395 SGNRES .EQU WRKSPC+0E8H ; Sign of result +0751 0395 PBUFF .EQU WRKSPC+0E9H ; Number print buffer +0752 0395 MULVAL .EQU WRKSPC+0F6H ; Multiplier +0753 0395 PROGST .EQU WRKSPC+0F9H ; Start of program text area +0754 0395 STLOOK .EQU WRKSPC+15DH ; Start of memory test +0755 0395 +0756 0395 ; BASIC ERROR CODE VALUES +0757 0395 +0758 0395 NF .EQU 00H ; NEXT without FOR +0759 0395 SN .EQU 02H ; Syntax error +0760 0395 RG .EQU 04H ; RETURN without GOSUB +0761 0395 OD .EQU 06H ; Out of DATA +0762 0395 FC .EQU 08H ; Function call error +0763 0395 OV .EQU 0AH ; Overflow +0764 0395 OM .EQU 0CH ; Out of memory +0765 0395 UL .EQU 0EH ; Undefined line number +0766 0395 BS .EQU 10H ; Bad subscript +0767 0395 DD .EQU 12H ; Re-DIMensioned array +0768 0395 DZ .EQU 14H ; Division by zero (/0) +0769 0395 ID .EQU 16H ; Illegal direct +0770 0395 TM .EQU 18H ; Type miss-match +0771 0395 OS .EQU 1AH ; Out of string space +0772 0395 LS .EQU 1CH ; String too long +0773 0395 ST .EQU 1EH ; String formula too complex +0774 0395 CN .EQU 20H ; Can't CONTinue +0775 0395 UF .EQU 22H ; UnDEFined FN function +0776 0395 MO .EQU 24H ; Missing operand +0777 0395 HX .EQU 26H ; HEX error +0778 0395 BN .EQU 28H ; BIN error +0779 0395 +0780 0395 ; .ORG 00396H +0781 0395 +0782 0395 C3 9B 03 COLD: JP STARTB ; Jump for cold start +0783 0398 C3 39 04 WARM: JP WARMST ; Jump for warm start +0784 039B STARTB: +0785 039B DD 21 00 00 LD IX,0 ; Flag cold start +0786 039F C3 A6 03 JP CSTART ; Jump to initialise +0787 03A2 +0788 03A2 4C 0C .WORD DEINT ; Get integer -32768 to 32767 +0789 03A4 C2 13 .WORD ABPASS ; Return integer in AB +0790 03A6 +0791 03A6 +0792 03A6 21 B0 30 CSTART: LD HL,WRKSPC ; Start of workspace RAM +0793 03A9 F9 LD SP,HL ; Set up a temporary stack +0794 03AA C3 E1 1F JP INITST ; Go to initialise +0795 03AD +0796 03AD 11 73 06 INIT: LD DE,INITAB ; Initialise workspace +0797 03B0 06 63 LD B,INITBE-INITAB+3; Bytes to copy +0798 03B2 21 B0 30 LD HL,WRKSPC ; Into workspace RAM +0799 03B5 1A COPY: LD A,(DE) ; Get source +0800 03B6 77 LD (HL),A ; To destination +0801 03B7 23 INC HL ; Next destination +0802 03B8 13 INC DE ; Next source +0803 03B9 05 DEC B ; Count bytes +0804 03BA C2 B5 03 JP NZ,COPY ; More to move +0805 03BD F9 LD SP,HL ; Temporary stack +0806 03BE CD 74 08 CALL CLREG ; Clear registers and stack +0807 03C1 CD 42 0E CALL PRNTCRLF ; Output CRLF +0808 03C4 32 5A 31 LD (BUFFER+72+1),A ; Mark end of buffer +0809 03C7 32 A9 31 LD (PROGST),A ; Initialise program area +0810 03CA 21 88 04 MSIZE: LD HL,MEMMSG ; Point to message +0811 03CD CD E0 14 CALL PRS ; Output "Memory size" +0812 03D0 CD 91 08 CALL PROMPT ; Get input with '?' +0813 03D3 CD 9A 0B CALL GETCHR ; Get next character +0814 03D6 B7 OR A ; Set flags +0815 03D7 C2 EF 03 JP NZ,TSTMEM ; If number - Test if RAM there +0816 03DA 21 0D 32 LD HL,STLOOK ; Point to start of RAM +0817 03DD 23 MLOOP: INC HL ; Next byte +0818 03DE 7C LD A,H ; Above address FFFF ? +0819 03DF B5 OR L +0820 03E0 CA 01 04 JP Z,SETTOP ; Yes - 64K RAM +0821 03E3 7E LD A,(HL) ; Get contents +0822 03E4 47 LD B,A ; Save it +0823 03E5 2F CPL ; Flip all bits +0824 03E6 77 LD (HL),A ; Put it back +0825 03E7 BE CP (HL) ; RAM there if same +0826 03E8 70 LD (HL),B ; Restore old contents +0827 03E9 CA DD 03 JP Z,MLOOP ; If RAM - test next byte +0828 03EC C3 01 04 JP SETTOP ; Top of RAM found +0829 03EF +0830 03EF CD 66 0C TSTMEM: CALL ATOH ; Get high memory into DE +0831 03F2 B7 OR A ; Set flags on last byte +0832 03F3 C2 42 07 JP NZ,SNERR ; ?SN Error if bad character +0833 03F6 EB EX DE,HL ; Address into HL +0834 03F7 2B DEC HL ; Back one byte +0835 03F8 3E D9 LD A,11011001B ; Test byte +0836 03FA 46 LD B,(HL) ; Get old contents +0837 03FB 77 LD (HL),A ; Load test byte +0838 03FC BE CP (HL) ; RAM there if same +0839 03FD 70 LD (HL),B ; Restore old contents +0840 03FE C2 CA 03 JP NZ,MSIZE ; Ask again if no RAM +0841 0401 +0842 0401 2B SETTOP: DEC HL ; Back one byte +0843 0402 11 0C 32 LD DE,STLOOK-1 ; See if enough RAM +0844 0405 CD 0A 0A CALL CPDEHL ; Compare DE with HL +0845 0408 DA CA 03 JP C,MSIZE ; Ask again if not enough RAM +0846 040B 11 CE FF LD DE,0-50 ; 50 Bytes string space +0847 040E 22 5F 31 LD (LSTRAM),HL ; Save last available RAM +0848 0411 19 ADD HL,DE ; Allocate string space +0849 0412 22 0A 31 LD (STRSPC),HL ; Save string space +0850 0415 CD 4F 08 CALL CLRPTR ; Clear program area +0851 0418 2A 0A 31 LD HL,(STRSPC) ; Get end of memory +0852 041B 11 EF FF LD DE,0-17 ; Offset for free bytes +0853 041E 19 ADD HL,DE ; Adjust HL +0854 041F 11 A9 31 LD DE,PROGST ; Start of program text +0855 0422 7D LD A,L ; Get LSB +0856 0423 93 SUB E ; Adjust it +0857 0424 6F LD L,A ; Re-save +0858 0425 7C LD A,H ; Get MSB +0859 0426 9A SBC A,D ; Adjust it +0860 0427 67 LD H,A ; Re-save +0861 0428 E5 PUSH HL ; Save bytes free +0862 0429 21 51 04 LD HL,SIGNON ; Sign-on message +0863 042C CD E0 14 CALL PRS ; Output string +0864 042F E1 POP HL ; Get bytes free back +0865 0430 CD 83 1B CALL PRNTHL ; Output amount of free memory +0866 0433 21 42 04 LD HL,BFREE ; " Bytes free" message +0867 0436 CD E0 14 CALL PRS ; Output string +0868 0439 +0869 0439 31 16 31 WARMST: LD SP,STACK ; Temporary stack +0870 043C CD 74 08 BRKRET: CALL CLREG ; Clear registers and stack +0871 043F C3 8D 07 JP PRNTOK ; Go to get command line +0872 0442 +0873 0442 204279746573BFREE: .BYTE " Bytes free",CR,LF,0,0 +0873 0448 20667265650D0A0000 +0874 0451 +0875 0451 5A3830204241SIGNON: .BYTE "Z80 BASIC Ver 4.7b",CR,LF +0875 0457 5349432056657220342E37620D0A +0876 0465 436F70797269 .BYTE "Copyright ",40,"C",41 +0876 046B 67687420284329 +0877 0472 203139373820 .BYTE " 1978 by Microsoft",CR,LF,0,0 +0877 0478 6279204D6963726F736F66740D0A0000 +0878 0488 +0879 0488 4D656D6F7279MEMMSG: .BYTE "Memory top",0 +0879 048E 20746F7000 +0880 0493 +0881 0493 ; FUNCTION ADDRESS TABLE +0882 0493 +0883 0493 F8 19 FNCTAB: .WORD SGN +0884 0495 BC 1A .WORD INT +0885 0497 0E 1A .WORD ABS +0886 0499 B3 30 .WORD USR +0887 049B A0 13 .WORD FRE +0888 049D 25 17 .WORD INP +0889 049F CE 13 .WORD POS +0890 04A1 82 1C .WORD SQR +0891 04A3 61 1D .WORD RND +0892 04A5 9D 18 .WORD LOG +0893 04A7 D0 1C .WORD EXP +0894 04A9 D6 1D .WORD COS +0895 04AB DC 1D .WORD SIN +0896 04AD 3D 1E .WORD TAN +0897 04AF 52 1E .WORD ATN +0898 04B1 79 17 .WORD PEEK +0899 04B3 BD 1E .WORD DEEK +0900 04B5 01 31 .WORD POINT +0901 04B7 52 16 .WORD LEN +0902 04B9 6A 14 .WORD STR +0903 04BB EC 16 .WORD VAL +0904 04BD 61 16 .WORD ASC +0905 04BF 72 16 .WORD CHR +0906 04C1 DF 1E .WORD HEX +0907 04C3 72 1F .WORD BIN +0908 04C5 82 16 .WORD LEFT +0909 04C7 B2 16 .WORD RIGHT +0910 04C9 BC 16 .WORD MID +0911 04CB +0912 04CB ; RESERVED WORD LIST +0913 04CB +0914 04CB C5 4E 44 WORDS: .BYTE 'E'+80H,"ND" +0915 04CE C6 4F 52 .BYTE 'F'+80H,"OR" +0916 04D1 CE 45 58 54 .BYTE 'N'+80H,"EXT" +0917 04D5 C4 41 54 41 .BYTE 'D'+80H,"ATA" +0918 04D9 C94E505554 .BYTE 'I'+80H,"NPUT" +0919 04DE C4 49 4D .BYTE 'D'+80H,"IM" +0920 04E1 D2 45 41 44 .BYTE 'R'+80H,"EAD" +0921 04E5 CC 45 54 .BYTE 'L'+80H,"ET" +0922 04E8 C7 4F 54 4F .BYTE 'G'+80H,"OTO" +0923 04EC D2 55 4E .BYTE 'R'+80H,"UN" +0924 04EF C9 46 .BYTE 'I'+80H,"F" +0925 04F1 D24553544F52 .BYTE 'R'+80H,"ESTORE" +0925 04F7 45 +0926 04F8 C74F535542 .BYTE 'G'+80H,"OSUB" +0927 04FD D2455455524E .BYTE 'R'+80H,"ETURN" +0928 0503 D2 45 4D .BYTE 'R'+80H,"EM" +0929 0506 D3 54 4F 50 .BYTE 'S'+80H,"TOP" +0930 050A CF 55 54 .BYTE 'O'+80H,"UT" +0931 050D CF 4E .BYTE 'O'+80H,"N" +0932 050F CE 55 4C 4C .BYTE 'N'+80H,"ULL" +0933 0513 D7 41 49 54 .BYTE 'W'+80H,"AIT" +0934 0517 C4 45 46 .BYTE 'D'+80H,"EF" +0935 051A D0 4F 4B 45 .BYTE 'P'+80H,"OKE" +0936 051E C4 4F 4B 45 .BYTE 'D'+80H,"OKE" +0937 0522 D3435245454E .BYTE 'S'+80H,"CREEN" +0938 0528 CC494E4553 .BYTE 'L'+80H,"INES" +0939 052D C3 4C 53 .BYTE 'C'+80H,"LS" +0940 0530 D749445448 .BYTE 'W'+80H,"IDTH" +0941 0535 CD4F4E49544F .BYTE 'M'+80H,"ONITOR" +0941 053B 52 +0942 053C D3 45 54 .BYTE 'S'+80H,"ET" +0943 053F D245534554 .BYTE 'R'+80H,"ESET" +0944 0544 D052494E54 .BYTE 'P'+80H,"RINT" +0945 0549 C3 4F 4E 54 .BYTE 'C'+80H,"ONT" +0946 054D CC 49 53 54 .BYTE 'L'+80H,"IST" +0947 0551 C34C454152 .BYTE 'C'+80H,"LEAR" +0948 0556 C34C4F4144 .BYTE 'C'+80H,"LOAD" +0949 055B C353415645 .BYTE 'C'+80H,"SAVE" +0950 0560 CE 45 57 .BYTE 'N'+80H,"EW" +0951 0563 +0952 0563 D4 41 42 28 .BYTE 'T'+80H,"AB(" +0953 0567 D4 4F .BYTE 'T'+80H,"O" +0954 0569 C6 4E .BYTE 'F'+80H,"N" +0955 056B D3 50 43 28 .BYTE 'S'+80H,"PC(" +0956 056F D4 48 45 4E .BYTE 'T'+80H,"HEN" +0957 0573 CE 4F 54 .BYTE 'N'+80H,"OT" +0958 0576 D3 54 45 50 .BYTE 'S'+80H,"TEP" +0959 057A +0960 057A AB .BYTE '+'+80H +0961 057B AD .BYTE '-'+80H +0962 057C AA .BYTE '*'+80H +0963 057D AF .BYTE '/'+80H +0964 057E DE .BYTE '^'+80H +0965 057F C1 4E 44 .BYTE 'A'+80H,"ND" +0966 0582 CF 52 .BYTE 'O'+80H,"R" +0967 0584 BE .BYTE '>'+80H +0968 0585 BD .BYTE '='+80H +0969 0586 BC .BYTE '<'+80H +0970 0587 +0971 0587 D3 47 4E .BYTE 'S'+80H,"GN" +0972 058A C9 4E 54 .BYTE 'I'+80H,"NT" +0973 058D C1 42 53 .BYTE 'A'+80H,"BS" +0974 0590 D5 53 52 .BYTE 'U'+80H,"SR" +0975 0593 C6 52 45 .BYTE 'F'+80H,"RE" +0976 0596 C9 4E 50 .BYTE 'I'+80H,"NP" +0977 0599 D0 4F 53 .BYTE 'P'+80H,"OS" +0978 059C D3 51 52 .BYTE 'S'+80H,"QR" +0979 059F D2 4E 44 .BYTE 'R'+80H,"ND" +0980 05A2 CC 4F 47 .BYTE 'L'+80H,"OG" +0981 05A5 C5 58 50 .BYTE 'E'+80H,"XP" +0982 05A8 C3 4F 53 .BYTE 'C'+80H,"OS" +0983 05AB D3 49 4E .BYTE 'S'+80H,"IN" +0984 05AE D4 41 4E .BYTE 'T'+80H,"AN" +0985 05B1 C1 54 4E .BYTE 'A'+80H,"TN" +0986 05B4 D0 45 45 4B .BYTE 'P'+80H,"EEK" +0987 05B8 C4 45 45 4B .BYTE 'D'+80H,"EEK" +0988 05BC D04F494E54 .BYTE 'P'+80H,"OINT" +0989 05C1 CC 45 4E .BYTE 'L'+80H,"EN" +0990 05C4 D3 54 52 24 .BYTE 'S'+80H,"TR$" +0991 05C8 D6 41 4C .BYTE 'V'+80H,"AL" +0992 05CB C1 53 43 .BYTE 'A'+80H,"SC" +0993 05CE C3 48 52 24 .BYTE 'C'+80H,"HR$" +0994 05D2 C8 45 58 24 .BYTE 'H'+80H,"EX$" +0995 05D6 C2 49 4E 24 .BYTE 'B'+80H,"IN$" +0996 05DA CC45465424 .BYTE 'L'+80H,"EFT$" +0997 05DF D24947485424 .BYTE 'R'+80H,"IGHT$" +0998 05E5 CD 49 44 24 .BYTE 'M'+80H,"ID$" +0999 05E9 80 .BYTE 80H ; End of list marker +1000 05EA +1001 05EA ; KEYWORD ADDRESS TABLE +1002 05EA +1003 05EA E4 0B WORDTB: .WORD PEND +1004 05EC E1 0A .WORD FOR +1005 05EE BC 0F .WORD NEXT +1006 05F0 31 0D .WORD DATA +1007 05F2 C3 0E .WORD INPUT +1008 05F4 F8 11 .WORD DIM +1009 05F6 F2 0E .WORD READ +1010 05F8 48 0D .WORD LET +1011 05FA EE 0C .WORD GOTO +1012 05FC D1 0C .WORD RUN +1013 05FE C0 0D .WORD IF +1014 0600 AA 0B .WORD RESTOR +1015 0602 DD 0C .WORD GOSUB +1016 0604 0C 0D .WORD RETURN +1017 0606 33 0D .WORD REM +1018 0608 E2 0B .WORD STOP +1019 060A 31 17 .WORD POUT +1020 060C A2 0D .WORD ON +1021 060E 23 0C .WORD NULL +1022 0610 37 17 .WORD WAIT +1023 0612 D6 13 .WORD DEF +1024 0614 80 17 .WORD POKE +1025 0616 C8 1E .WORD DOKE +1026 0618 33 0D .WORD REM +1027 061A AE 1E .WORD LINES +1028 061C A1 1E .WORD CLS +1029 061E A6 1E .WORD WIDTH +1030 0620 DE 1F .WORD MONITR +1031 0622 04 31 .WORD PSET +1032 0624 07 31 .WORD RESET +1033 0626 E4 0D .WORD PRINT +1034 0628 10 0C .WORD CONT +1035 062A 56 0A .WORD LIST +1036 062C 8B 0C .WORD CLEAR +1037 062E 33 0D .WORD REM +1038 0630 33 0D .WORD REM +1039 0632 4E 08 .WORD NEW +1040 0634 +1041 0634 ; RESERVED WORD TOKEN VALUES +1042 0634 +1043 0634 ZEND .EQU 080H ; END +1044 0634 ZFOR .EQU 081H ; FOR +1045 0634 ZDATA .EQU 083H ; DATA +1046 0634 ZGOTO .EQU 088H ; GOTO +1047 0634 ZGOSUB .EQU 08CH ; GOSUB +1048 0634 ZREM .EQU 08EH ; REM +1049 0634 ZPRINT .EQU 09EH ; PRINT +1050 0634 ZNEW .EQU 0A4H ; NEW +1051 0634 +1052 0634 ZTAB .EQU 0A5H ; TAB +1053 0634 ZTO .EQU 0A6H ; TO +1054 0634 ZFN .EQU 0A7H ; FN +1055 0634 ZSPC .EQU 0A8H ; SPC +1056 0634 ZTHEN .EQU 0A9H ; THEN +1057 0634 ZNOT .EQU 0AAH ; NOT +1058 0634 ZSTEP .EQU 0ABH ; STEP +1059 0634 +1060 0634 ZPLUS .EQU 0ACH ; + +1061 0634 ZMINUS .EQU 0ADH ; - +1062 0634 ZTIMES .EQU 0AEH ; * +1063 0634 ZDIV .EQU 0AFH ; / +1064 0634 ZOR .EQU 0B2H ; OR +1065 0634 ZGTR .EQU 0B3H ; > +1066 0634 ZEQUAL .EQU 0B4H ; M +1067 0634 ZLTH .EQU 0B5H ; < +1068 0634 ZSGN .EQU 0B6H ; SGN +1069 0634 ZPOINT .EQU 0C7H ; POINT +1070 0634 ZLEFT .EQU 0CDH +2 ; LEFT$ +1071 0634 +1072 0634 ; ARITHMETIC PRECEDENCE TABLE +1073 0634 +1074 0634 79 PRITAB: .BYTE 79H ; Precedence value +1075 0635 6A 1B .WORD PADD ; FPREG = + FPREG +1076 0637 +1077 0637 79 .BYTE 79H ; Precedence value +1078 0638 9E 17 .WORD PSUB ; FPREG = - FPREG +1079 063A +1080 063A 7C .BYTE 7CH ; Precedence value +1081 063B DC 18 .WORD MULT ; PPREG = * FPREG +1082 063D +1083 063D 7C .BYTE 7CH ; Precedence value +1084 063E 3D 19 .WORD DIV ; FPREG = / FPREG +1085 0640 +1086 0640 7F .BYTE 7FH ; Precedence value +1087 0641 8B 1C .WORD POWER ; FPREG = ^ FPREG +1088 0643 +1089 0643 50 .BYTE 50H ; Precedence value +1090 0644 51 11 .WORD PAND ; FPREG = AND FPREG +1091 0646 +1092 0646 46 .BYTE 46H ; Precedence value +1093 0647 50 11 .WORD POR ; FPREG = OR FPREG +1094 0649 +1095 0649 ; BASIC ERROR CODE LIST +1096 0649 +1097 0649 4E 46 ERRORS: .BYTE "NF" ; NEXT without FOR +1098 064B 53 4E .BYTE "SN" ; Syntax error +1099 064D 52 47 .BYTE "RG" ; RETURN without GOSUB +1100 064F 4F 44 .BYTE "OD" ; Out of DATA +1101 0651 46 43 .BYTE "FC" ; Illegal function call +1102 0653 4F 56 .BYTE "OV" ; Overflow error +1103 0655 4F 4D .BYTE "OM" ; Out of memory +1104 0657 55 4C .BYTE "UL" ; Undefined line +1105 0659 42 53 .BYTE "BS" ; Bad subscript +1106 065B 44 44 .BYTE "DD" ; Re-DIMensioned array +1107 065D 2F 30 .BYTE "/0" ; Division by zero +1108 065F 49 44 .BYTE "ID" ; Illegal direct +1109 0661 54 4D .BYTE "TM" ; Type mis-match +1110 0663 4F 53 .BYTE "OS" ; Out of string space +1111 0665 4C 53 .BYTE "LS" ; String too long +1112 0667 53 54 .BYTE "ST" ; String formula too complex +1113 0669 43 4E .BYTE "CN" ; Can't CONTinue +1114 066B 55 46 .BYTE "UF" ; Undefined FN function +1115 066D 4D 4F .BYTE "MO" ; Missing operand +1116 066F 48 58 .BYTE "HX" ; HEX error +1117 0671 42 4E .BYTE "BN" ; BIN error +1118 0673 +1119 0673 ; INITIALISATION TABLE ------------------------------------------------------- +1120 0673 +1121 0673 C3 39 04 INITAB: JP WARMST ; Warm start jump +1122 0676 C3 61 0C JP FCERR ; "USR (X)" jump (Set to Error) +1123 0679 D3 00 OUT (0),A ; "OUT p,n" skeleton +1124 067B C9 RET +1125 067C D6 00 SUB 0 ; Division support routine +1126 067E 6F LD L,A +1127 067F 7C LD A,H +1128 0680 DE 00 SBC A,0 +1129 0682 67 LD H,A +1130 0683 78 LD A,B +1131 0684 DE 00 SBC A,0 +1132 0686 47 LD B,A +1133 0687 3E 00 LD A,0 +1134 0689 C9 RET +1135 068A 00 00 00 .BYTE 0,0,0 ; Random number seed table used by RND +1136 068D 35 4A CA 99 .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07 +1137 0691 39 1C 76 98 .BYTE 039H,01CH,076H,098H ; 1.61291E+07 +1138 0695 22 95 B3 98 .BYTE 022H,095H,0B3H,098H ;-1.17691E+07 +1139 0699 0A DD 47 98 .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07 +1140 069D 53 D1 99 99 .BYTE 053H,0D1H,099H,099H ;-2-01612E+07 +1141 06A1 0A 1A 9F 98 .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07 +1142 06A5 65 BC CD 98 .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07 +1143 06A9 D6 77 3E 98 .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07 +1144 06AD 52 C7 4F 80 .BYTE 052H,0C7H,04FH,080H ; Last random number +1145 06B1 DB 00 IN A,(0) ; INP (x) skeleton +1146 06B3 C9 RET +1147 06B4 01 .BYTE 1 ; POS (x) number (1) +1148 06B5 FF .BYTE 255 ; Terminal width (255 = no auto CRLF) +1149 06B6 1C .BYTE 28 ; Width for commas (3 columns) +1150 06B7 00 .BYTE 0 ; No nulls after input bytes +1151 06B8 00 .BYTE 0 ; Output enabled (^O off) +1152 06B9 14 00 .WORD 20 ; Initial lines counter +1153 06BB 14 00 .WORD 20 ; Initial lines number +1154 06BD 00 00 .WORD 0 ; Array load/save check sum +1155 06BF 00 .BYTE 0 ; Break not by NMI +1156 06C0 00 .BYTE 0 ; Break flag +1157 06C1 C3 87 09 JP TTYLIN ; Input reflection (set to TTY) +1158 06C4 C3 00 00 JP $0000 ; POINT reflection unused +1159 06C7 C3 00 00 JP $0000 ; SET reflection +1160 06CA C3 00 00 JP $0000 ; RESET reflection +1161 06CD 0D 32 .WORD STLOOK ; Temp string space +1162 06CF FE FF .WORD -2 ; Current line number (cold) +1163 06D1 AA 31 .WORD PROGST+1 ; Start of program text +1164 06D3 INITBE: +1165 06D3 +1166 06D3 ; END OF INITIALISATION TABLE --------------------------------------------------- +1167 06D3 +1168 06D3 204572726F72ERRMSG: .BYTE " Error",0 +1168 06D9 00 +1169 06DA 20696E2000 INMSG: .BYTE " in ",0 +1170 06DF ZERBYT .EQU $-1 ; A zero byte +1171 06DF 4F6B0D0A0000OKMSG: .BYTE "Ok",CR,LF,0,0 +1172 06E5 427265616B00BRKMSG: .BYTE "Break",0 +1173 06EB +1174 06EB 21 04 00 BAKSTK: LD HL,4 ; Look for "FOR" block with +1175 06EE 39 ADD HL,SP ; same index as specified +1176 06EF 7E LOKFOR: LD A,(HL) ; Get block ID +1177 06F0 23 INC HL ; Point to index address +1178 06F1 FE 81 CP ZFOR ; Is it a "FOR" token +1179 06F3 C0 RET NZ ; No - exit +1180 06F4 4E LD C,(HL) ; BC = Address of "FOR" index +1181 06F5 23 INC HL +1182 06F6 46 LD B,(HL) +1183 06F7 23 INC HL ; Point to sign of STEP +1184 06F8 E5 PUSH HL ; Save pointer to sign +1185 06F9 69 LD L,C ; HL = address of "FOR" index +1186 06FA 60 LD H,B +1187 06FB 7A LD A,D ; See if an index was specified +1188 06FC B3 OR E ; DE = 0 if no index specified +1189 06FD EB EX DE,HL ; Specified index into HL +1190 06FE CA 05 07 JP Z,INDFND ; Skip if no index given +1191 0701 EB EX DE,HL ; Index back into DE +1192 0702 CD 0A 0A CALL CPDEHL ; Compare index with one given +1193 0705 01 0D 00 INDFND: LD BC,16-3 ; Offset to next block +1194 0708 E1 POP HL ; Restore pointer to sign +1195 0709 C8 RET Z ; Return if block found +1196 070A 09 ADD HL,BC ; Point to next block +1197 070B C3 EF 06 JP LOKFOR ; Keep on looking +1198 070E +1199 070E CD 28 07 MOVUP: CALL ENFMEM ; See if enough memory +1200 0711 C5 MOVSTR: PUSH BC ; Save end of source +1201 0712 E3 EX (SP),HL ; Swap source and dest" end +1202 0713 C1 POP BC ; Get end of destination +1203 0714 CD 0A 0A MOVLP: CALL CPDEHL ; See if list moved +1204 0717 7E LD A,(HL) ; Get byte +1205 0718 02 LD (BC),A ; Move it +1206 0719 C8 RET Z ; Exit if all done +1207 071A 0B DEC BC ; Next byte to move to +1208 071B 2B DEC HL ; Next byte to move +1209 071C C3 14 07 JP MOVLP ; Loop until all bytes moved +1210 071F +1211 071F E5 CHKSTK: PUSH HL ; Save code string address +1212 0720 2A 8A 31 LD HL,(ARREND) ; Lowest free memory +1213 0723 06 00 LD B,0 ; BC = Number of levels to test +1214 0725 09 ADD HL,BC ; 2 Bytes for each level +1215 0726 09 ADD HL,BC +1216 0727 3E .BYTE 3EH ; Skip "PUSH HL" +1217 0728 E5 ENFMEM: PUSH HL ; Save code string address +1218 0729 3E D0 LD A,0D0H ;LOW -48 ; 48 Bytes minimum RAM +1219 072B 95 SUB L +1220 072C 6F LD L,A +1221 072D 3E FF LD A,0FFH; HIGH (-48) ; 48 Bytes minimum RAM +1222 072F 9C SBC A,H +1223 0730 DA 37 07 JP C,OMERR ; Not enough - ?OM Error +1224 0733 67 LD H,A +1225 0734 39 ADD HL,SP ; Test if stack is overflowed +1226 0735 E1 POP HL ; Restore code string address +1227 0736 D8 RET C ; Return if enough mmory +1228 0737 1E 0C OMERR: LD E,OM ; ?OM Error +1229 0739 C3 56 07 JP ERROR +1230 073C +1231 073C 2A 79 31 DATSNR: LD HL,(DATLIN) ; Get line of current DATA item +1232 073F 22 0C 31 LD (LINEAT),HL ; Save as current line +1233 0742 1E 02 SNERR: LD E,SN ; ?SN Error +1234 0744 01 .BYTE 01H ; Skip "LD E,DZ" +1235 0745 1E 14 DZERR: LD E,DZ ; ?/0 Error +1236 0747 01 .BYTE 01H ; Skip "LD E,NF" +1237 0748 1E 00 NFERR: LD E,NF ; ?NF Error +1238 074A 01 .BYTE 01H ; Skip "LD E,DD" +1239 074B 1E 12 DDERR: LD E,DD ; ?DD Error +1240 074D 01 .BYTE 01H ; Skip "LD E,UF" +1241 074E 1E 22 UFERR: LD E,UF ; ?UF Error +1242 0750 01 .BYTE 01H ; Skip "LD E,OV +1243 0751 1E 0A OVERR: LD E,OV ; ?OV Error +1244 0753 01 .BYTE 01H ; Skip "LD E,TM" +1245 0754 1E 18 TMERR: LD E,TM ; ?TM Error +1246 0756 +1247 0756 CD 74 08 ERROR: CALL CLREG ; Clear registers and stack +1248 0759 32 F5 30 LD (CTLOFG),A ; Enable output (A is 0) +1249 075C CD 35 0E CALL STTLIN ; Start new line +1250 075F 21 49 06 LD HL,ERRORS ; Point to error codes +1251 0762 57 LD D,A ; D = 0 (A is 0) +1252 0763 3E 3F LD A,'?' +1253 0765 CD 1B 0A CALL OUTC ; Output '?' +1254 0768 19 ADD HL,DE ; Offset to correct error code +1255 0769 7E LD A,(HL) ; First character +1256 076A CD 1B 0A CALL OUTC ; Output it +1257 076D CD 9A 0B CALL GETCHR ; Get next character +1258 0770 CD 1B 0A CALL OUTC ; Output it +1259 0773 21 D3 06 LD HL,ERRMSG ; "Error" message +1260 0776 CD E0 14 ERRIN: CALL PRS ; Output message +1261 0779 2A 0C 31 LD HL,(LINEAT) ; Get line of error +1262 077C 11 FE FF LD DE,-2 ; Cold start error if -2 +1263 077F CD 0A 0A CALL CPDEHL ; See if cold start error +1264 0782 CA A6 03 JP Z,CSTART ; Cold start error - Restart +1265 0785 7C LD A,H ; Was it a direct error? +1266 0786 A5 AND L ; Line = -1 if direct error +1267 0787 3C INC A +1268 0788 C4 7B 1B CALL NZ,LINEIN ; No - output line of error +1269 078B 3E .BYTE 3EH ; Skip "POP BC" +1270 078C C1 POPNOK: POP BC ; Drop address in input buffer +1271 078D +1272 078D AF PRNTOK: XOR A ; Output "Ok" and get command +1273 078E 32 F5 30 LD (CTLOFG),A ; Enable output +1274 0791 CD 35 0E CALL STTLIN ; Start new line +1275 0794 21 DF 06 LD HL,OKMSG ; "Ok" message +1276 0797 CD E0 14 CALL PRS ; Output "Ok" +1277 079A 21 FF FF GETCMD: LD HL,-1 ; Flag direct mode +1278 079D 22 0C 31 LD (LINEAT),HL ; Save as current line +1279 07A0 CD 87 09 CALL GETLIN ; Get an input line +1280 07A3 DA 9A 07 JP C,GETCMD ; Get line again if break +1281 07A6 CD 9A 0B CALL GETCHR ; Get first character +1282 07A9 3C INC A ; Test if end of line +1283 07AA 3D DEC A ; Without affecting Carry +1284 07AB CA 9A 07 JP Z,GETCMD ; Nothing entered - Get another +1285 07AE F5 PUSH AF ; Save Carry status +1286 07AF CD 66 0C CALL ATOH ; Get line number into DE +1287 07B2 D5 PUSH DE ; Save line number +1288 07B3 CD 9E 08 CALL CRUNCH ; Tokenise rest of line +1289 07B6 47 LD B,A ; Length of tokenised line +1290 07B7 D1 POP DE ; Restore line number +1291 07B8 F1 POP AF ; Restore Carry +1292 07B9 D2 7A 0B JP NC,EXCUTE ; No line number - Direct mode +1293 07BC D5 PUSH DE ; Save line number +1294 07BD C5 PUSH BC ; Save length of tokenised line +1295 07BE AF XOR A +1296 07BF 32 7C 31 LD (LSTBIN),A ; Clear last byte input +1297 07C2 CD 9A 0B CALL GETCHR ; Get next character +1298 07C5 B7 OR A ; Set flags +1299 07C6 F5 PUSH AF ; And save them +1300 07C7 CD 2E 08 CALL SRCHLN ; Search for line number in DE +1301 07CA DA D3 07 JP C,LINFND ; Jump if line found +1302 07CD F1 POP AF ; Get status +1303 07CE F5 PUSH AF ; And re-save +1304 07CF CA 07 0D JP Z,ULERR ; Nothing after number - Error +1305 07D2 B7 OR A ; Clear Carry +1306 07D3 C5 LINFND: PUSH BC ; Save address of line in prog +1307 07D4 D2 EA 07 JP NC,INEWLN ; Line not found - Insert new +1308 07D7 EB EX DE,HL ; Next line address in DE +1309 07D8 2A 86 31 LD HL,(PROGND) ; End of program +1310 07DB 1A SFTPRG: LD A,(DE) ; Shift rest of program down +1311 07DC 02 LD (BC),A +1312 07DD 03 INC BC ; Next destination +1313 07DE 13 INC DE ; Next source +1314 07DF CD 0A 0A CALL CPDEHL ; All done? +1315 07E2 C2 DB 07 JP NZ,SFTPRG ; More to do +1316 07E5 60 LD H,B ; HL - New end of program +1317 07E6 69 LD L,C +1318 07E7 22 86 31 LD (PROGND),HL ; Update end of program +1319 07EA +1320 07EA D1 INEWLN: POP DE ; Get address of line, +1321 07EB F1 POP AF ; Get status +1322 07EC CA 11 08 JP Z,SETPTR ; No text - Set up pointers +1323 07EF 2A 86 31 LD HL,(PROGND) ; Get end of program +1324 07F2 E3 EX (SP),HL ; Get length of input line +1325 07F3 C1 POP BC ; End of program to BC +1326 07F4 09 ADD HL,BC ; Find new end +1327 07F5 E5 PUSH HL ; Save new end +1328 07F6 CD 0E 07 CALL MOVUP ; Make space for line +1329 07F9 E1 POP HL ; Restore new end +1330 07FA 22 86 31 LD (PROGND),HL ; Update end of program pointer +1331 07FD EB EX DE,HL ; Get line to move up in HL +1332 07FE 74 LD (HL),H ; Save MSB +1333 07FF D1 POP DE ; Get new line number +1334 0800 23 INC HL ; Skip pointer +1335 0801 23 INC HL +1336 0802 73 LD (HL),E ; Save LSB of line number +1337 0803 23 INC HL +1338 0804 72 LD (HL),D ; Save MSB of line number +1339 0805 23 INC HL ; To first byte in line +1340 0806 11 11 31 LD DE,BUFFER ; Copy buffer to program +1341 0809 1A MOVBUF: LD A,(DE) ; Get source +1342 080A 77 LD (HL),A ; Save destinations +1343 080B 23 INC HL ; Next source +1344 080C 13 INC DE ; Next destination +1345 080D B7 OR A ; Done? +1346 080E C2 09 08 JP NZ,MOVBUF ; No - Repeat +1347 0811 CD 5A 08 SETPTR: CALL RUNFST ; Set line pointers +1348 0814 23 INC HL ; To LSB of pointer +1349 0815 EB EX DE,HL ; Address to DE +1350 0816 62 PTRLP: LD H,D ; Address to HL +1351 0817 6B LD L,E +1352 0818 7E LD A,(HL) ; Get LSB of pointer +1353 0819 23 INC HL ; To MSB of pointer +1354 081A B6 OR (HL) ; Compare with MSB pointer +1355 081B CA 9A 07 JP Z,GETCMD ; Get command line if end +1356 081E 23 INC HL ; To LSB of line number +1357 081F 23 INC HL ; Skip line number +1358 0820 23 INC HL ; Point to first byte in line +1359 0821 AF XOR A ; Looking for 00 byte +1360 0822 BE FNDEND: CP (HL) ; Found end of line? +1361 0823 23 INC HL ; Move to next byte +1362 0824 C2 22 08 JP NZ,FNDEND ; No - Keep looking +1363 0827 EB EX DE,HL ; Next line address to HL +1364 0828 73 LD (HL),E ; Save LSB of pointer +1365 0829 23 INC HL +1366 082A 72 LD (HL),D ; Save MSB of pointer +1367 082B C3 16 08 JP PTRLP ; Do next line +1368 082E +1369 082E 2A 0E 31 SRCHLN: LD HL,(BASTXT) ; Start of program text +1370 0831 44 SRCHLP: LD B,H ; BC = Address to look at +1371 0832 4D LD C,L +1372 0833 7E LD A,(HL) ; Get address of next line +1373 0834 23 INC HL +1374 0835 B6 OR (HL) ; End of program found? +1375 0836 2B DEC HL +1376 0837 C8 RET Z ; Yes - Line not found +1377 0838 23 INC HL +1378 0839 23 INC HL +1379 083A 7E LD A,(HL) ; Get LSB of line number +1380 083B 23 INC HL +1381 083C 66 LD H,(HL) ; Get MSB of line number +1382 083D 6F LD L,A +1383 083E CD 0A 0A CALL CPDEHL ; Compare with line in DE +1384 0841 60 LD H,B ; HL = Start of this line +1385 0842 69 LD L,C +1386 0843 7E LD A,(HL) ; Get LSB of next line address +1387 0844 23 INC HL +1388 0845 66 LD H,(HL) ; Get MSB of next line address +1389 0846 6F LD L,A ; Next line to HL +1390 0847 3F CCF +1391 0848 C8 RET Z ; Lines found - Exit +1392 0849 3F CCF +1393 084A D0 RET NC ; Line not found,at line after +1394 084B C3 31 08 JP SRCHLP ; Keep looking +1395 084E +1396 084E C0 NEW: RET NZ ; Return if any more on line +1397 084F 2A 0E 31 CLRPTR: LD HL,(BASTXT) ; Point to start of program +1398 0852 AF XOR A ; Set program area to empty +1399 0853 77 LD (HL),A ; Save LSB = 00 +1400 0854 23 INC HL +1401 0855 77 LD (HL),A ; Save MSB = 00 +1402 0856 23 INC HL +1403 0857 22 86 31 LD (PROGND),HL ; Set program end +1404 085A +1405 085A 2A 0E 31 RUNFST: LD HL,(BASTXT) ; Clear all variables +1406 085D 2B DEC HL +1407 085E +1408 085E 22 7E 31 INTVAR: LD (BRKLIN),HL ; Initialise RUN variables +1409 0861 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM +1410 0864 22 73 31 LD (STRBOT),HL ; Clear string space +1411 0867 AF XOR A +1412 0868 CD AA 0B CALL RESTOR ; Reset DATA pointers +1413 086B 2A 86 31 LD HL,(PROGND) ; Get end of program +1414 086E 22 88 31 LD (VAREND),HL ; Clear variables +1415 0871 22 8A 31 LD (ARREND),HL ; Clear arrays +1416 0874 +1417 0874 C1 CLREG: POP BC ; Save return address +1418 0875 2A 0A 31 LD HL,(STRSPC) ; Get end of working RAN +1419 0878 F9 LD SP,HL ; Set stack +1420 0879 21 63 31 LD HL,TMSTPL ; Temporary string pool +1421 087C 22 61 31 LD (TMSTPT),HL ; Reset temporary string ptr +1422 087F AF XOR A ; A = 00 +1423 0880 6F LD L,A ; HL = 0000 +1424 0881 67 LD H,A +1425 0882 22 84 31 LD (CONTAD),HL ; No CONTinue +1426 0885 32 7B 31 LD (FORFLG),A ; Clear FOR flag +1427 0888 22 8E 31 LD (FNRGNM),HL ; Clear FN argument +1428 088B E5 PUSH HL ; HL = 0000 +1429 088C C5 PUSH BC ; Put back return +1430 088D 2A 7E 31 DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN +1431 0890 C9 RET ; Return to execution driver +1432 0891 +1433 0891 3E 3F PROMPT: LD A,'?' ; '?' +1434 0893 CD 1B 0A CALL OUTC ; Output character +1435 0896 3E 20 LD A,' ' ; Space +1436 0898 CD 1B 0A CALL OUTC ; Output character +1437 089B C3 FE 30 JP RINPUT ; Get input line +1438 089E +1439 089E AF CRUNCH: XOR A ; Tokenise line @ HL to BUFFER +1440 089F 32 5E 31 LD (DATFLG),A ; Reset literal flag +1441 08A2 0E 05 LD C,2+3 ; 2 byte number and 3 nulls +1442 08A4 11 11 31 LD DE,BUFFER ; Start of input buffer +1443 08A7 7E CRNCLP: LD A,(HL) ; Get byte +1444 08A8 FE 20 CP ' ' ; Is it a space? +1445 08AA CA 26 09 JP Z,MOVDIR ; Yes - Copy direct +1446 08AD 47 LD B,A ; Save character +1447 08AE FE 22 CP '"' ; Is it a quote? +1448 08B0 CA 46 09 JP Z,CPYLIT ; Yes - Copy literal string +1449 08B3 B7 OR A ; Is it end of buffer? +1450 08B4 CA 4D 09 JP Z,ENDBUF ; Yes - End buffer +1451 08B7 3A 5E 31 LD A,(DATFLG) ; Get data type +1452 08BA B7 OR A ; Literal? +1453 08BB 7E LD A,(HL) ; Get byte to copy +1454 08BC C2 26 09 JP NZ,MOVDIR ; Literal - Copy direct +1455 08BF FE 3F CP '?' ; Is it '?' short for PRINT +1456 08C1 3E 9E LD A,ZPRINT ; "PRINT" token +1457 08C3 CA 26 09 JP Z,MOVDIR ; Yes - replace it +1458 08C6 7E LD A,(HL) ; Get byte again +1459 08C7 FE 30 CP '0' ; Is it less than '0' +1460 08C9 DA D1 08 JP C,FNDWRD ; Yes - Look for reserved words +1461 08CC FE 3C CP 60; ";"+1 ; Is it "0123456789:;" ? +1462 08CE DA 26 09 JP C,MOVDIR ; Yes - copy it direct +1463 08D1 D5 FNDWRD: PUSH DE ; Look for reserved words +1464 08D2 11 CA 04 LD DE,WORDS-1 ; Point to table +1465 08D5 C5 PUSH BC ; Save count +1466 08D6 01 22 09 LD BC,RETNAD ; Where to return to +1467 08D9 C5 PUSH BC ; Save return address +1468 08DA 06 7F LD B,ZEND-1 ; First token value -1 +1469 08DC 7E LD A,(HL) ; Get byte +1470 08DD FE 61 CP 'a' ; Less than 'a' ? +1471 08DF DA EA 08 JP C,SEARCH ; Yes - search for words +1472 08E2 FE 7B CP 'z'+1 ; Greater than 'z' ? +1473 08E4 D2 EA 08 JP NC,SEARCH ; Yes - search for words +1474 08E7 E6 5F AND 01011111B ; Force upper case +1475 08E9 77 LD (HL),A ; Replace byte +1476 08EA 4E SEARCH: LD C,(HL) ; Search for a word +1477 08EB EB EX DE,HL +1478 08EC 23 GETNXT: INC HL ; Get next reserved word +1479 08ED B6 OR (HL) ; Start of word? +1480 08EE F2 EC 08 JP P,GETNXT ; No - move on +1481 08F1 04 INC B ; Increment token value +1482 08F2 7E LD A, (HL) ; Get byte from table +1483 08F3 E6 7F AND 01111111B ; Strip bit 7 +1484 08F5 C8 RET Z ; Return if end of list +1485 08F6 B9 CP C ; Same character as in buffer? +1486 08F7 C2 EC 08 JP NZ,GETNXT ; No - get next word +1487 08FA EB EX DE,HL +1488 08FB E5 PUSH HL ; Save start of word +1489 08FC +1490 08FC 13 NXTBYT: INC DE ; Look through rest of word +1491 08FD 1A LD A,(DE) ; Get byte from table +1492 08FE B7 OR A ; End of word ? +1493 08FF FA 1E 09 JP M,MATCH ; Yes - Match found +1494 0902 4F LD C,A ; Save it +1495 0903 78 LD A,B ; Get token value +1496 0904 FE 88 CP ZGOTO ; Is it "GOTO" token ? +1497 0906 C2 0D 09 JP NZ,NOSPC ; No - Don't allow spaces +1498 0909 CD 9A 0B CALL GETCHR ; Get next character +1499 090C 2B DEC HL ; Cancel increment from GETCHR +1500 090D 23 NOSPC: INC HL ; Next byte +1501 090E 7E LD A,(HL) ; Get byte +1502 090F FE 61 CP 'a' ; Less than 'a' ? +1503 0911 DA 16 09 JP C,NOCHNG ; Yes - don't change +1504 0914 E6 5F AND 01011111B ; Make upper case +1505 0916 B9 NOCHNG: CP C ; Same as in buffer ? +1506 0917 CA FC 08 JP Z,NXTBYT ; Yes - keep testing +1507 091A E1 POP HL ; Get back start of word +1508 091B C3 EA 08 JP SEARCH ; Look at next word +1509 091E +1510 091E 48 MATCH: LD C,B ; Word found - Save token value +1511 091F F1 POP AF ; Throw away return +1512 0920 EB EX DE,HL +1513 0921 C9 RET ; Return to "RETNAD" +1514 0922 EB RETNAD: EX DE,HL ; Get address in string +1515 0923 79 LD A,C ; Get token value +1516 0924 C1 POP BC ; Restore buffer length +1517 0925 D1 POP DE ; Get destination address +1518 0926 23 MOVDIR: INC HL ; Next source in buffer +1519 0927 12 LD (DE),A ; Put byte in buffer +1520 0928 13 INC DE ; Move up buffer +1521 0929 0C INC C ; Increment length of buffer +1522 092A D6 3A SUB ':' ; End of statement? +1523 092C CA 34 09 JP Z,SETLIT ; Jump if multi-statement line +1524 092F FE 49 CP ZDATA-3AH ; Is it DATA statement ? +1525 0931 C2 37 09 JP NZ,TSTREM ; No - see if REM +1526 0934 32 5E 31 SETLIT: LD (DATFLG),A ; Set literal flag +1527 0937 D6 54 TSTREM: SUB ZREM-3AH ; Is it REM? +1528 0939 C2 A7 08 JP NZ,CRNCLP ; No - Leave flag +1529 093C 47 LD B,A ; Copy rest of buffer +1530 093D 7E NXTCHR: LD A,(HL) ; Get byte +1531 093E B7 OR A ; End of line ? +1532 093F CA 4D 09 JP Z,ENDBUF ; Yes - Terminate buffer +1533 0942 B8 CP B ; End of statement ? +1534 0943 CA 26 09 JP Z,MOVDIR ; Yes - Get next one +1535 0946 23 CPYLIT: INC HL ; Move up source string +1536 0947 12 LD (DE),A ; Save in destination +1537 0948 0C INC C ; Increment length +1538 0949 13 INC DE ; Move up destination +1539 094A C3 3D 09 JP NXTCHR ; Repeat +1540 094D +1541 094D 21 10 31 ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer +1542 0950 12 LD (DE),A ; Mark end of buffer (A = 00) +1543 0951 13 INC DE +1544 0952 12 LD (DE),A ; A = 00 +1545 0953 13 INC DE +1546 0954 12 LD (DE),A ; A = 00 +1547 0955 C9 RET +1548 0956 +1549 0956 3A F4 30 DODEL: LD A,(NULFLG) ; Get null flag status +1550 0959 B7 OR A ; Is it zero? +1551 095A 3E 00 LD A,0 ; Zero A - Leave flags +1552 095C 32 F4 30 LD (NULFLG),A ; Zero null flag +1553 095F C2 6A 09 JP NZ,ECHDEL ; Set - Echo it +1554 0962 05 DEC B ; Decrement length +1555 0963 CA 87 09 JP Z,GETLIN ; Get line again if empty +1556 0966 CD 1B 0A CALL OUTC ; Output null character +1557 0969 3E .BYTE 3EH ; Skip "DEC B" +1558 096A 05 ECHDEL: DEC B ; Count bytes in buffer +1559 096B 2B DEC HL ; Back space buffer +1560 096C CA 7E 09 JP Z,OTKLN ; No buffer - Try again +1561 096F 7E LD A,(HL) ; Get deleted byte +1562 0970 CD 1B 0A CALL OUTC ; Echo it +1563 0973 C3 90 09 JP MORINP ; Get more input +1564 0976 +1565 0976 05 DELCHR: DEC B ; Count bytes in buffer +1566 0977 2B DEC HL ; Back space buffer +1567 0978 CD 1B 0A CALL OUTC ; Output character in A +1568 097B C2 90 09 JP NZ,MORINP ; Not end - Get more +1569 097E CD 1B 0A OTKLN: CALL OUTC ; Output character in A +1570 0981 CD 42 0E KILIN: CALL PRNTCRLF ; Output CRLF +1571 0984 C3 87 09 JP TTYLIN ; Get line again +1572 0987 +1573 0987 GETLIN: +1574 0987 21 11 31 TTYLIN: LD HL,BUFFER ; Get a line by character +1575 098A 06 01 LD B,1 ; Set buffer as empty +1576 098C AF XOR A +1577 098D 32 F4 30 LD (NULFLG),A ; Clear null flag +1578 0990 CD 45 0A MORINP: CALL CLOTST ; Get character and test ^O +1579 0993 4F LD C,A ; Save character in C +1580 0994 FE 7F CP DEL ; Delete character? +1581 0996 CA 56 09 JP Z,DODEL ; Yes - Process it +1582 0999 3A F4 30 LD A,(NULFLG) ; Get null flag +1583 099C B7 OR A ; Test null flag status +1584 099D CA A9 09 JP Z,PROCES ; Reset - Process character +1585 09A0 3E 00 LD A,0 ; Set a null +1586 09A2 CD 1B 0A CALL OUTC ; Output null +1587 09A5 AF XOR A ; Clear A +1588 09A6 32 F4 30 LD (NULFLG),A ; Reset null flag +1589 09A9 79 PROCES: LD A,C ; Get character +1590 09AA FE 07 CP CTRLG ; Bell? +1591 09AC CA ED 09 JP Z,PUTCTL ; Yes - Save it +1592 09AF FE 03 CP CTRLC ; Is it control "C"? +1593 09B1 CC 42 0E CALL Z,PRNTCRLF ; Yes - Output CRLF +1594 09B4 37 SCF ; Flag break +1595 09B5 C8 RET Z ; Return if control "C" +1596 09B6 FE 0D CP CR ; Is it enter? +1597 09B8 CA 3D 0E JP Z,ENDINP ; Yes - Terminate input +1598 09BB FE 15 CP CTRLU ; Is it control "U"? +1599 09BD CA 81 09 JP Z,KILIN ; Yes - Get another line +1600 09C0 FE 40 CP '@' ; Is it "kill line"? +1601 09C2 CA 7E 09 JP Z,OTKLN ; Yes - Kill line +1602 09C5 FE 5F CP '_' ; Is it delete? +1603 09C7 CA 76 09 JP Z,DELCHR ; Yes - Delete character +1604 09CA FE 08 CP BKSP ; Is it backspace? +1605 09CC CA 76 09 JP Z,DELCHR ; Yes - Delete character +1606 09CF FE 12 CP CTRLR ; Is it control "R"? +1607 09D1 C2 E8 09 JP NZ,PUTBUF ; No - Put in buffer +1608 09D4 C5 PUSH BC ; Save buffer length +1609 09D5 D5 PUSH DE ; Save DE +1610 09D6 E5 PUSH HL ; Save buffer address +1611 09D7 36 00 LD (HL),0 ; Mark end of buffer +1612 09D9 CD F2 1F CALL OUTNCR ; Output and do CRLF +1613 09DC 21 11 31 LD HL,BUFFER ; Point to buffer start +1614 09DF CD E0 14 CALL PRS ; Output buffer +1615 09E2 E1 POP HL ; Restore buffer address +1616 09E3 D1 POP DE ; Restore DE +1617 09E4 C1 POP BC ; Restore buffer length +1618 09E5 C3 90 09 JP MORINP ; Get another character +1619 09E8 +1620 09E8 FE 20 PUTBUF: CP ' ' ; Is it a control code? +1621 09EA DA 90 09 JP C,MORINP ; Yes - Ignore +1622 09ED 78 PUTCTL: LD A,B ; Get number of bytes in buffer +1623 09EE FE 49 CP 72+1 ; Test for line overflow +1624 09F0 3E 07 LD A,CTRLG ; Set a bell +1625 09F2 D2 02 0A JP NC,OUTNBS ; Ring bell if buffer full +1626 09F5 79 LD A,C ; Get character +1627 09F6 71 LD (HL),C ; Save in buffer +1628 09F7 32 7C 31 LD (LSTBIN),A ; Save last input byte +1629 09FA 23 INC HL ; Move up buffer +1630 09FB 04 INC B ; Increment length +1631 09FC CD 1B 0A OUTIT: CALL OUTC ; Output the character entered +1632 09FF C3 90 09 JP MORINP ; Get another character +1633 0A02 +1634 0A02 CD 1B 0A OUTNBS: CALL OUTC ; Output bell and back over it +1635 0A05 3E 08 LD A,BKSP ; Set back space +1636 0A07 C3 FC 09 JP OUTIT ; Output it and get more +1637 0A0A +1638 0A0A 7C CPDEHL: LD A,H ; Get H +1639 0A0B 92 SUB D ; Compare with D +1640 0A0C C0 RET NZ ; Different - Exit +1641 0A0D 7D LD A,L ; Get L +1642 0A0E 93 SUB E ; Compare with E +1643 0A0F C9 RET ; Return status +1644 0A10 +1645 0A10 7E CHKSYN: LD A,(HL) ; Check syntax of character +1646 0A11 E3 EX (SP),HL ; Address of test byte +1647 0A12 BE CP (HL) ; Same as in code string? +1648 0A13 23 INC HL ; Return address +1649 0A14 E3 EX (SP),HL ; Put it back +1650 0A15 CA 9A 0B JP Z,GETCHR ; Yes - Get next character +1651 0A18 C3 42 07 JP SNERR ; Different - ?SN Error +1652 0A1B +1653 0A1B F5 OUTC: PUSH AF ; Save character +1654 0A1C 3A F5 30 LD A,(CTLOFG) ; Get control "O" flag +1655 0A1F B7 OR A ; Is it set? +1656 0A20 C2 15 15 JP NZ,POPAF ; Yes - don't output +1657 0A23 F1 POP AF ; Restore character +1658 0A24 C5 PUSH BC ; Save buffer length +1659 0A25 F5 PUSH AF ; Save character +1660 0A26 FE 20 CP ' ' ; Is it a control code? +1661 0A28 DA 3F 0A JP C,DINPOS ; Yes - Don't INC POS(X) +1662 0A2B 3A F2 30 LD A,(LWIDTH) ; Get line width +1663 0A2E 47 LD B,A ; To B +1664 0A2F 3A 5B 31 LD A,(CURPOS) ; Get cursor position +1665 0A32 04 INC B ; Width 255? +1666 0A33 CA 3B 0A JP Z,INCLEN ; Yes - No width limit +1667 0A36 05 DEC B ; Restore width +1668 0A37 B8 CP B ; At end of line? +1669 0A38 CC 42 0E CALL Z,PRNTCRLF ; Yes - output CRLF +1670 0A3B 3C INCLEN: INC A ; Move on one character +1671 0A3C 32 5B 31 LD (CURPOS),A ; Save new position +1672 0A3F F1 DINPOS: POP AF ; Restore character +1673 0A40 C1 POP BC ; Restore buffer length +1674 0A41 CD DB 1F CALL MONOUT ; Send it +1675 0A44 C9 RET +1676 0A45 +1677 0A45 CD 9F 1E CLOTST: CALL GETINP ; Get input character +1678 0A48 E6 7F AND 01111111B ; Strip bit 7 +1679 0A4A FE 0F CP CTRLO ; Is it control "O"? +1680 0A4C C0 RET NZ ; No don't flip flag +1681 0A4D 3A F5 30 LD A,(CTLOFG) ; Get flag +1682 0A50 2F CPL ; Flip it +1683 0A51 32 F5 30 LD (CTLOFG),A ; Put it back +1684 0A54 AF XOR A ; Null character +1685 0A55 C9 RET +1686 0A56 +1687 0A56 CD 66 0C LIST: CALL ATOH ; ASCII number to DE +1688 0A59 C0 RET NZ ; Return if anything extra +1689 0A5A C1 POP BC ; Rubbish - Not needed +1690 0A5B CD 2E 08 CALL SRCHLN ; Search for line number in DE +1691 0A5E C5 PUSH BC ; Save address of line +1692 0A5F CD AC 0A CALL SETLIN ; Set up lines counter +1693 0A62 E1 LISTLP: POP HL ; Restore address of line +1694 0A63 4E LD C,(HL) ; Get LSB of next line +1695 0A64 23 INC HL +1696 0A65 46 LD B,(HL) ; Get MSB of next line +1697 0A66 23 INC HL +1698 0A67 78 LD A,B ; BC = 0 (End of program)? +1699 0A68 B1 OR C +1700 0A69 CA 8D 07 JP Z,PRNTOK ; Yes - Go to command mode +1701 0A6C CD B5 0A CALL COUNT ; Count lines +1702 0A6F CD C5 0B CALL TSTBRK ; Test for break key +1703 0A72 C5 PUSH BC ; Save address of next line +1704 0A73 CD 42 0E CALL PRNTCRLF ; Output CRLF +1705 0A76 5E LD E,(HL) ; Get LSB of line number +1706 0A77 23 INC HL +1707 0A78 56 LD D,(HL) ; Get MSB of line number +1708 0A79 23 INC HL +1709 0A7A E5 PUSH HL ; Save address of line start +1710 0A7B EB EX DE,HL ; Line number to HL +1711 0A7C CD 83 1B CALL PRNTHL ; Output line number in decimal +1712 0A7F 3E 20 LD A,' ' ; Space after line number +1713 0A81 E1 POP HL ; Restore start of line address +1714 0A82 CD 1B 0A LSTLP2: CALL OUTC ; Output character in A +1715 0A85 7E LSTLP3: LD A,(HL) ; Get next byte in line +1716 0A86 B7 OR A ; End of line? +1717 0A87 23 INC HL ; To next byte in line +1718 0A88 CA 62 0A JP Z,LISTLP ; Yes - get next line +1719 0A8B F2 82 0A JP P,LSTLP2 ; No token - output it +1720 0A8E D6 7F SUB ZEND-1 ; Find and output word +1721 0A90 4F LD C,A ; Token offset+1 to C +1722 0A91 11 CB 04 LD DE,WORDS ; Reserved word list +1723 0A94 1A FNDTOK: LD A,(DE) ; Get character in list +1724 0A95 13 INC DE ; Move on to next +1725 0A96 B7 OR A ; Is it start of word? +1726 0A97 F2 94 0A JP P,FNDTOK ; No - Keep looking for word +1727 0A9A 0D DEC C ; Count words +1728 0A9B C2 94 0A JP NZ,FNDTOK ; Not there - keep looking +1729 0A9E E6 7F OUTWRD: AND 01111111B ; Strip bit 7 +1730 0AA0 CD 1B 0A CALL OUTC ; Output first character +1731 0AA3 1A LD A,(DE) ; Get next character +1732 0AA4 13 INC DE ; Move on to next +1733 0AA5 B7 OR A ; Is it end of word? +1734 0AA6 F2 9E 0A JP P,OUTWRD ; No - output the rest +1735 0AA9 C3 85 0A JP LSTLP3 ; Next byte in line +1736 0AAC +1737 0AAC E5 SETLIN: PUSH HL ; Set up LINES counter +1738 0AAD 2A F8 30 LD HL,(LINESN) ; Get LINES number +1739 0AB0 22 F6 30 LD (LINESC),HL ; Save in LINES counter +1740 0AB3 E1 POP HL +1741 0AB4 C9 RET +1742 0AB5 +1743 0AB5 E5 COUNT: PUSH HL ; Save code string address +1744 0AB6 D5 PUSH DE +1745 0AB7 2A F6 30 LD HL,(LINESC) ; Get LINES counter +1746 0ABA 11 FF FF LD DE,-1 +1747 0ABD ED 5A ADC HL,DE ; Decrement +1748 0ABF 22 F6 30 LD (LINESC),HL ; Put it back +1749 0AC2 D1 POP DE +1750 0AC3 E1 POP HL ; Restore code string address +1751 0AC4 F0 RET P ; Return if more lines to go +1752 0AC5 E5 PUSH HL ; Save code string address +1753 0AC6 2A F8 30 LD HL,(LINESN) ; Get LINES number +1754 0AC9 22 F6 30 LD (LINESC),HL ; Reset LINES counter +1755 0ACC CD 9F 1E CALL GETINP ; Get input character +1756 0ACF FE 03 CP CTRLC ; Is it control "C"? +1757 0AD1 CA D8 0A JP Z,RSLNBK ; Yes - Reset LINES and break +1758 0AD4 E1 POP HL ; Restore code string address +1759 0AD5 C3 B5 0A JP COUNT ; Keep on counting +1760 0AD8 +1761 0AD8 2A F8 30 RSLNBK: LD HL,(LINESN) ; Get LINES number +1762 0ADB 22 F6 30 LD (LINESC),HL ; Reset LINES counter +1763 0ADE C3 3C 04 JP BRKRET ; Go and output "Break" +1764 0AE1 +1765 0AE1 3E 64 FOR: LD A,64H ; Flag "FOR" assignment +1766 0AE3 32 7B 31 LD (FORFLG),A ; Save "FOR" flag +1767 0AE6 CD 48 0D CALL LET ; Set up initial index +1768 0AE9 C1 POP BC ; Drop RETurn address +1769 0AEA E5 PUSH HL ; Save code string address +1770 0AEB CD 31 0D CALL DATA ; Get next statement address +1771 0AEE 22 77 31 LD (LOOPST),HL ; Save it for start of loop +1772 0AF1 21 02 00 LD HL,2 ; Offset for "FOR" block +1773 0AF4 39 ADD HL,SP ; Point to it +1774 0AF5 CD EF 06 FORSLP: CALL LOKFOR ; Look for existing "FOR" block +1775 0AF8 D1 POP DE ; Get code string address +1776 0AF9 C2 11 0B JP NZ,FORFND ; No nesting found +1777 0AFC 09 ADD HL,BC ; Move into "FOR" block +1778 0AFD D5 PUSH DE ; Save code string address +1779 0AFE 2B DEC HL +1780 0AFF 56 LD D,(HL) ; Get MSB of loop statement +1781 0B00 2B DEC HL +1782 0B01 5E LD E,(HL) ; Get LSB of loop statement +1783 0B02 23 INC HL +1784 0B03 23 INC HL +1785 0B04 E5 PUSH HL ; Save block address +1786 0B05 2A 77 31 LD HL,(LOOPST) ; Get address of loop statement +1787 0B08 CD 0A 0A CALL CPDEHL ; Compare the FOR loops +1788 0B0B E1 POP HL ; Restore block address +1789 0B0C C2 F5 0A JP NZ,FORSLP ; Different FORs - Find another +1790 0B0F D1 POP DE ; Restore code string address +1791 0B10 F9 LD SP,HL ; Remove all nested loops +1792 0B11 +1793 0B11 EB FORFND: EX DE,HL ; Code string address to HL +1794 0B12 0E 08 LD C,8 +1795 0B14 CD 1F 07 CALL CHKSTK ; Check for 8 levels of stack +1796 0B17 E5 PUSH HL ; Save code string address +1797 0B18 2A 77 31 LD HL,(LOOPST) ; Get first statement of loop +1798 0B1B E3 EX (SP),HL ; Save and restore code string +1799 0B1C E5 PUSH HL ; Re-save code string address +1800 0B1D 2A 0C 31 LD HL,(LINEAT) ; Get current line number +1801 0B20 E3 EX (SP),HL ; Save and restore code string +1802 0B21 CD 0A 10 CALL TSTNUM ; Make sure it's a number +1803 0B24 CD 10 0A CALL CHKSYN ; Make sure "TO" is next +1804 0B27 A6 .BYTE ZTO ; "TO" token +1805 0B28 CD 07 10 CALL GETNUM ; Get "TO" expression value +1806 0B2B E5 PUSH HL ; Save code string address +1807 0B2C CD 35 1A CALL BCDEFP ; Move "TO" value to BCDE +1808 0B2F E1 POP HL ; Restore code string address +1809 0B30 C5 PUSH BC ; Save "TO" value in block +1810 0B31 D5 PUSH DE +1811 0B32 01 00 81 LD BC,8100H ; BCDE - 1 (default STEP) +1812 0B35 51 LD D,C ; C=0 +1813 0B36 5A LD E,D ; D=0 +1814 0B37 7E LD A,(HL) ; Get next byte in code string +1815 0B38 FE AB CP ZSTEP ; See if "STEP" is stated +1816 0B3A 3E 01 LD A,1 ; Sign of step = 1 +1817 0B3C C2 4D 0B JP NZ,SAVSTP ; No STEP given - Default to 1 +1818 0B3F CD 9A 0B CALL GETCHR ; Jump over "STEP" token +1819 0B42 CD 07 10 CALL GETNUM ; Get step value +1820 0B45 E5 PUSH HL ; Save code string address +1821 0B46 CD 35 1A CALL BCDEFP ; Move STEP to BCDE +1822 0B49 CD E9 19 CALL TSTSGN ; Test sign of FPREG +1823 0B4C E1 POP HL ; Restore code string address +1824 0B4D C5 SAVSTP: PUSH BC ; Save the STEP value in block +1825 0B4E D5 PUSH DE +1826 0B4F F5 PUSH AF ; Save sign of STEP +1827 0B50 33 INC SP ; Don't save flags +1828 0B51 E5 PUSH HL ; Save code string address +1829 0B52 2A 7E 31 LD HL,(BRKLIN) ; Get address of index variable +1830 0B55 E3 EX (SP),HL ; Save and restore code string +1831 0B56 06 81 PUTFID: LD B,ZFOR ; "FOR" block marker +1832 0B58 C5 PUSH BC ; Save it +1833 0B59 33 INC SP ; Don't save C +1834 0B5A +1835 0B5A CD C5 0B RUNCNT: CALL TSTBRK ; Execution driver - Test break +1836 0B5D 22 7E 31 LD (BRKLIN),HL ; Save code address for break +1837 0B60 7E LD A,(HL) ; Get next byte in code string +1838 0B61 FE 3A CP ':' ; Multi statement line? +1839 0B63 CA 7A 0B JP Z,EXCUTE ; Yes - Execute it +1840 0B66 B7 OR A ; End of line? +1841 0B67 C2 42 07 JP NZ,SNERR ; No - Syntax error +1842 0B6A 23 INC HL ; Point to address of next line +1843 0B6B 7E LD A,(HL) ; Get LSB of line pointer +1844 0B6C 23 INC HL +1845 0B6D B6 OR (HL) ; Is it zero (End of prog)? +1846 0B6E CA EC 0B JP Z,ENDPRG ; Yes - Terminate execution +1847 0B71 23 INC HL ; Point to line number +1848 0B72 5E LD E,(HL) ; Get LSB of line number +1849 0B73 23 INC HL +1850 0B74 56 LD D,(HL) ; Get MSB of line number +1851 0B75 EB EX DE,HL ; Line number to HL +1852 0B76 22 0C 31 LD (LINEAT),HL ; Save as current line number +1853 0B79 EB EX DE,HL ; Line number back to DE +1854 0B7A CD 9A 0B EXCUTE: CALL GETCHR ; Get key word +1855 0B7D 11 5A 0B LD DE,RUNCNT ; Where to RETurn to +1856 0B80 D5 PUSH DE ; Save for RETurn +1857 0B81 C8 IFJMP: RET Z ; Go to RUNCNT if end of STMT +1858 0B82 D6 80 ONJMP: SUB ZEND ; Is it a token? +1859 0B84 DA 48 0D JP C,LET ; No - try to assign it +1860 0B87 FE 25 CP ZNEW+1-ZEND ; END to NEW ? +1861 0B89 D2 42 07 JP NC,SNERR ; Not a key word - ?SN Error +1862 0B8C 07 RLCA ; Double it +1863 0B8D 4F LD C,A ; BC = Offset into table +1864 0B8E 06 00 LD B,0 +1865 0B90 EB EX DE,HL ; Save code string address +1866 0B91 21 EA 05 LD HL,WORDTB ; Keyword address table +1867 0B94 09 ADD HL,BC ; Point to routine address +1868 0B95 4E LD C,(HL) ; Get LSB of routine address +1869 0B96 23 INC HL +1870 0B97 46 LD B,(HL) ; Get MSB of routine address +1871 0B98 C5 PUSH BC ; Save routine address +1872 0B99 EB EX DE,HL ; Restore code string address +1873 0B9A +1874 0B9A 23 GETCHR: INC HL ; Point to next character +1875 0B9B 7E LD A,(HL) ; Get next code string byte +1876 0B9C FE 3A CP ':' ; Z if ':' +1877 0B9E D0 RET NC ; NC if > "9" +1878 0B9F FE 20 CP ' ' +1879 0BA1 CA 9A 0B JP Z,GETCHR ; Skip over spaces +1880 0BA4 FE 30 CP '0' +1881 0BA6 3F CCF ; NC if < '0' +1882 0BA7 3C INC A ; Test for zero - Leave carry +1883 0BA8 3D DEC A ; Z if Null +1884 0BA9 C9 RET +1885 0BAA +1886 0BAA EB RESTOR: EX DE,HL ; Save code string address +1887 0BAB 2A 0E 31 LD HL,(BASTXT) ; Point to start of program +1888 0BAE CA BF 0B JP Z,RESTNL ; Just RESTORE - reset pointer +1889 0BB1 EB EX DE,HL ; Restore code string address +1890 0BB2 CD 66 0C CALL ATOH ; Get line number to DE +1891 0BB5 E5 PUSH HL ; Save code string address +1892 0BB6 CD 2E 08 CALL SRCHLN ; Search for line number in DE +1893 0BB9 60 LD H,B ; HL = Address of line +1894 0BBA 69 LD L,C +1895 0BBB D1 POP DE ; Restore code string address +1896 0BBC D2 07 0D JP NC,ULERR ; ?UL Error if not found +1897 0BBF 2B RESTNL: DEC HL ; Byte before DATA statement +1898 0BC0 22 8C 31 UPDATA: LD (NXTDAT),HL ; Update DATA pointer +1899 0BC3 EB EX DE,HL ; Restore code string address +1900 0BC4 C9 RET +1901 0BC5 +1902 0BC5 +1903 0BC5 DF TSTBRK: RST 18H ; Check input status +1904 0BC6 C8 RET Z ; No key, go back +1905 0BC7 D7 RST 10H ; Get the key into A +1906 0BC8 FE 1B CP ESC ; Escape key? +1907 0BCA 28 11 JR Z,BRK ; Yes, break +1908 0BCC FE 03 CP CTRLC ; +1909 0BCE 28 0D JR Z,BRK ; Yes, break +1910 0BD0 FE 13 CP CTRLS ; Stop scrolling? +1911 0BD2 C0 RET NZ ; Other key, ignore +1912 0BD3 +1913 0BD3 +1914 0BD3 D7 STALL: RST 10H ; Wait for key +1915 0BD4 FE 11 CP CTRLQ ; Resume scrolling? +1916 0BD6 C8 RET Z ; Release the chokehold +1917 0BD7 FE 03 CP CTRLC ; Second break? +1918 0BD9 28 07 JR Z,STOP ; Break during hold exits prog +1919 0BDB 18 F6 JR STALL ; Loop until or +1920 0BDD +1921 0BDD 3E FF BRK LD A,$FF ; Set BRKFLG +1922 0BDF 32 FD 30 LD (BRKFLG),A ; Store it +1923 0BE2 +1924 0BE2 +1925 0BE2 C0 STOP: RET NZ ; Exit if anything else +1926 0BE3 F6 .BYTE 0F6H ; Flag "STOP" +1927 0BE4 C0 PEND: RET NZ ; Exit if anything else +1928 0BE5 22 7E 31 LD (BRKLIN),HL ; Save point of break +1929 0BE8 21 .BYTE 21H ; Skip "OR 11111111B" +1930 0BE9 F6 FF INPBRK: OR 11111111B ; Flag "Break" wanted +1931 0BEB C1 POP BC ; Return not needed and more +1932 0BEC 2A 0C 31 ENDPRG: LD HL,(LINEAT) ; Get current line number +1933 0BEF F5 PUSH AF ; Save STOP / END status +1934 0BF0 7D LD A,L ; Is it direct break? +1935 0BF1 A4 AND H +1936 0BF2 3C INC A ; Line is -1 if direct break +1937 0BF3 CA FF 0B JP Z,NOLIN ; Yes - No line number +1938 0BF6 22 82 31 LD (ERRLIN),HL ; Save line of break +1939 0BF9 2A 7E 31 LD HL,(BRKLIN) ; Get point of break +1940 0BFC 22 84 31 LD (CONTAD),HL ; Save point to CONTinue +1941 0BFF AF NOLIN: XOR A +1942 0C00 32 F5 30 LD (CTLOFG),A ; Enable output +1943 0C03 CD 35 0E CALL STTLIN ; Start a new line +1944 0C06 F1 POP AF ; Restore STOP / END status +1945 0C07 21 E5 06 LD HL,BRKMSG ; "Break" message +1946 0C0A C2 76 07 JP NZ,ERRIN ; "in line" wanted? +1947 0C0D C3 8D 07 JP PRNTOK ; Go to command mode +1948 0C10 +1949 0C10 2A 84 31 CONT: LD HL,(CONTAD) ; Get CONTinue address +1950 0C13 7C LD A,H ; Is it zero? +1951 0C14 B5 OR L +1952 0C15 1E 20 LD E,CN ; ?CN Error +1953 0C17 CA 56 07 JP Z,ERROR ; Yes - output "?CN Error" +1954 0C1A EB EX DE,HL ; Save code string address +1955 0C1B 2A 82 31 LD HL,(ERRLIN) ; Get line of last break +1956 0C1E 22 0C 31 LD (LINEAT),HL ; Set up current line number +1957 0C21 EB EX DE,HL ; Restore code string address +1958 0C22 C9 RET ; CONTinue where left off +1959 0C23 +1960 0C23 CD 68 17 NULL: CALL GETINT ; Get integer 0-255 +1961 0C26 C0 RET NZ ; Return if bad value +1962 0C27 32 F1 30 LD (NULLS),A ; Set nulls number +1963 0C2A C9 RET +1964 0C2B +1965 0C2B +1966 0C2B E5 ACCSUM: PUSH HL ; Save address in array +1967 0C2C 2A FA 30 LD HL,(CHKSUM) ; Get check sum +1968 0C2F 06 00 LD B,0 ; BC - Value of byte +1969 0C31 4F LD C,A +1970 0C32 09 ADD HL,BC ; Add byte to check sum +1971 0C33 22 FA 30 LD (CHKSUM),HL ; Re-save check sum +1972 0C36 E1 POP HL ; Restore address in array +1973 0C37 C9 RET +1974 0C38 +1975 0C38 7E CHKLTR: LD A,(HL) ; Get byte +1976 0C39 FE 41 CP 'A' ; < 'a' ? +1977 0C3B D8 RET C ; Carry set if not letter +1978 0C3C FE 5B CP 'Z'+1 ; > 'z' ? +1979 0C3E 3F CCF +1980 0C3F C9 RET ; Carry set if not letter +1981 0C40 +1982 0C40 CD 9A 0B FPSINT: CALL GETCHR ; Get next character +1983 0C43 CD 07 10 POSINT: CALL GETNUM ; Get integer 0 to 32767 +1984 0C46 CD E9 19 DEPINT: CALL TSTSGN ; Test sign of FPREG +1985 0C49 FA 61 0C JP M,FCERR ; Negative - ?FC Error +1986 0C4C 3A 97 31 DEINT: LD A,(FPEXP) ; Get integer value to DE +1987 0C4F FE 90 CP 80H+16 ; Exponent in range (16 bits)? +1988 0C51 DA 91 1A JP C,FPINT ; Yes - convert it +1989 0C54 01 80 90 LD BC,9080H ; BCDE = -32768 +1990 0C57 11 00 00 LD DE,0000 +1991 0C5A E5 PUSH HL ; Save code string address +1992 0C5B CD 64 1A CALL CMPNUM ; Compare FPREG with BCDE +1993 0C5E E1 POP HL ; Restore code string address +1994 0C5F 51 LD D,C ; MSB to D +1995 0C60 C8 RET Z ; Return if in range +1996 0C61 1E 08 FCERR: LD E,FC ; ?FC Error +1997 0C63 C3 56 07 JP ERROR ; Output error- +1998 0C66 +1999 0C66 2B ATOH: DEC HL ; ASCII number to DE binary +2000 0C67 11 00 00 GETLN: LD DE,0 ; Get number to DE +2001 0C6A CD 9A 0B GTLNLP: CALL GETCHR ; Get next character +2002 0C6D D0 RET NC ; Exit if not a digit +2003 0C6E E5 PUSH HL ; Save code string address +2004 0C6F F5 PUSH AF ; Save digit +2005 0C70 21 98 19 LD HL,65529/10 ; Largest number 65529 +2006 0C73 CD 0A 0A CALL CPDEHL ; Number in range? +2007 0C76 DA 42 07 JP C,SNERR ; No - ?SN Error +2008 0C79 62 LD H,D ; HL = Number +2009 0C7A 6B LD L,E +2010 0C7B 19 ADD HL,DE ; Times 2 +2011 0C7C 29 ADD HL,HL ; Times 4 +2012 0C7D 19 ADD HL,DE ; Times 5 +2013 0C7E 29 ADD HL,HL ; Times 10 +2014 0C7F F1 POP AF ; Restore digit +2015 0C80 D6 30 SUB '0' ; Make it 0 to 9 +2016 0C82 5F LD E,A ; DE = Value of digit +2017 0C83 16 00 LD D,0 +2018 0C85 19 ADD HL,DE ; Add to number +2019 0C86 EB EX DE,HL ; Number to DE +2020 0C87 E1 POP HL ; Restore code string address +2021 0C88 C3 6A 0C JP GTLNLP ; Go to next character +2022 0C8B +2023 0C8B CA 5E 08 CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters +2024 0C8E CD 43 0C CALL POSINT ; Get integer 0 to 32767 to DE +2025 0C91 2B DEC HL ; Cancel increment +2026 0C92 CD 9A 0B CALL GETCHR ; Get next character +2027 0C95 E5 PUSH HL ; Save code string address +2028 0C96 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM +2029 0C99 CA AE 0C JP Z,STORED ; No value given - Use stored +2030 0C9C E1 POP HL ; Restore code string address +2031 0C9D CD 10 0A CALL CHKSYN ; Check for comma +2032 0CA0 2C .BYTE ',' +2033 0CA1 D5 PUSH DE ; Save number +2034 0CA2 CD 43 0C CALL POSINT ; Get integer 0 to 32767 +2035 0CA5 2B DEC HL ; Cancel increment +2036 0CA6 CD 9A 0B CALL GETCHR ; Get next character +2037 0CA9 C2 42 07 JP NZ,SNERR ; ?SN Error if more on line +2038 0CAC E3 EX (SP),HL ; Save code string address +2039 0CAD EB EX DE,HL ; Number to DE +2040 0CAE 7D STORED: LD A,L ; Get LSB of new RAM top +2041 0CAF 93 SUB E ; Subtract LSB of string space +2042 0CB0 5F LD E,A ; Save LSB +2043 0CB1 7C LD A,H ; Get MSB of new RAM top +2044 0CB2 9A SBC A,D ; Subtract MSB of string space +2045 0CB3 57 LD D,A ; Save MSB +2046 0CB4 DA 37 07 JP C,OMERR ; ?OM Error if not enough mem +2047 0CB7 E5 PUSH HL ; Save RAM top +2048 0CB8 2A 86 31 LD HL,(PROGND) ; Get program end +2049 0CBB 01 28 00 LD BC,40 ; 40 Bytes minimum working RAM +2050 0CBE 09 ADD HL,BC ; Get lowest address +2051 0CBF CD 0A 0A CALL CPDEHL ; Enough memory? +2052 0CC2 D2 37 07 JP NC,OMERR ; No - ?OM Error +2053 0CC5 EB EX DE,HL ; RAM top to HL +2054 0CC6 22 0A 31 LD (STRSPC),HL ; Set new string space +2055 0CC9 E1 POP HL ; End of memory to use +2056 0CCA 22 5F 31 LD (LSTRAM),HL ; Set new top of RAM +2057 0CCD E1 POP HL ; Restore code string address +2058 0CCE C3 5E 08 JP INTVAR ; Initialise variables +2059 0CD1 +2060 0CD1 CA 5A 08 RUN: JP Z,RUNFST ; RUN from start if just RUN +2061 0CD4 CD 5E 08 CALL INTVAR ; Initialise variables +2062 0CD7 01 5A 0B LD BC,RUNCNT ; Execution driver loop +2063 0CDA C3 ED 0C JP RUNLIN ; RUN from line number +2064 0CDD +2065 0CDD 0E 03 GOSUB: LD C,3 ; 3 Levels of stack needed +2066 0CDF CD 1F 07 CALL CHKSTK ; Check for 3 levels of stack +2067 0CE2 C1 POP BC ; Get return address +2068 0CE3 E5 PUSH HL ; Save code string for RETURN +2069 0CE4 E5 PUSH HL ; And for GOSUB routine +2070 0CE5 2A 0C 31 LD HL,(LINEAT) ; Get current line +2071 0CE8 E3 EX (SP),HL ; Into stack - Code string out +2072 0CE9 3E 8C LD A,ZGOSUB ; "GOSUB" token +2073 0CEB F5 PUSH AF ; Save token +2074 0CEC 33 INC SP ; Don't save flags +2075 0CED +2076 0CED C5 RUNLIN: PUSH BC ; Save return address +2077 0CEE CD 66 0C GOTO: CALL ATOH ; ASCII number to DE binary +2078 0CF1 CD 33 0D CALL REM ; Get end of line +2079 0CF4 E5 PUSH HL ; Save end of line +2080 0CF5 2A 0C 31 LD HL,(LINEAT) ; Get current line +2081 0CF8 CD 0A 0A CALL CPDEHL ; Line after current? +2082 0CFB E1 POP HL ; Restore end of line +2083 0CFC 23 INC HL ; Start of next line +2084 0CFD DC 31 08 CALL C,SRCHLP ; Line is after current line +2085 0D00 D4 2E 08 CALL NC,SRCHLN ; Line is before current line +2086 0D03 60 LD H,B ; Set up code string address +2087 0D04 69 LD L,C +2088 0D05 2B DEC HL ; Incremented after +2089 0D06 D8 RET C ; Line found +2090 0D07 1E 0E ULERR: LD E,UL ; ?UL Error +2091 0D09 C3 56 07 JP ERROR ; Output error message +2092 0D0C +2093 0D0C C0 RETURN: RET NZ ; Return if not just RETURN +2094 0D0D 16 FF LD D,-1 ; Flag "GOSUB" search +2095 0D0F CD EB 06 CALL BAKSTK ; Look "GOSUB" block +2096 0D12 F9 LD SP,HL ; Kill all FORs in subroutine +2097 0D13 FE 8C CP ZGOSUB ; Test for "GOSUB" token +2098 0D15 1E 04 LD E,RG ; ?RG Error +2099 0D17 C2 56 07 JP NZ,ERROR ; Error if no "GOSUB" found +2100 0D1A E1 POP HL ; Get RETURN line number +2101 0D1B 22 0C 31 LD (LINEAT),HL ; Save as current +2102 0D1E 23 INC HL ; Was it from direct statement? +2103 0D1F 7C LD A,H +2104 0D20 B5 OR L ; Return to line +2105 0D21 C2 2B 0D JP NZ,RETLIN ; No - Return to line +2106 0D24 3A 7C 31 LD A,(LSTBIN) ; Any INPUT in subroutine? +2107 0D27 B7 OR A ; If so buffer is corrupted +2108 0D28 C2 8C 07 JP NZ,POPNOK ; Yes - Go to command mode +2109 0D2B 21 5A 0B RETLIN: LD HL,RUNCNT ; Execution driver loop +2110 0D2E E3 EX (SP),HL ; Into stack - Code string out +2111 0D2F 3E .BYTE 3EH ; Skip "POP HL" +2112 0D30 E1 NXTDTA: POP HL ; Restore code string address +2113 0D31 +2114 0D31 01 3A DATA: .BYTE 01H,3AH ; ':' End of statement +2115 0D33 0E 00 REM: LD C,0 ; 00 End of statement +2116 0D35 06 00 LD B,0 +2117 0D37 79 NXTSTL: LD A,C ; Statement and byte +2118 0D38 48 LD C,B +2119 0D39 47 LD B,A ; Statement end byte +2120 0D3A 7E NXTSTT: LD A,(HL) ; Get byte +2121 0D3B B7 OR A ; End of line? +2122 0D3C C8 RET Z ; Yes - Exit +2123 0D3D B8 CP B ; End of statement? +2124 0D3E C8 RET Z ; Yes - Exit +2125 0D3F 23 INC HL ; Next byte +2126 0D40 FE 22 CP '"' ; Literal string? +2127 0D42 CA 37 0D JP Z,NXTSTL ; Yes - Look for another '"' +2128 0D45 C3 3A 0D JP NXTSTT ; Keep looking +2129 0D48 +2130 0D48 CD FD 11 LET: CALL GETVAR ; Get variable name +2131 0D4B CD 10 0A CALL CHKSYN ; Make sure "=" follows +2132 0D4E B4 .BYTE ZEQUAL ; "=" token +2133 0D4F D5 PUSH DE ; Save address of variable +2134 0D50 3A 5D 31 LD A,(TYPE) ; Get data type +2135 0D53 F5 PUSH AF ; Save type +2136 0D54 CD 19 10 CALL EVAL ; Evaluate expression +2137 0D57 F1 POP AF ; Restore type +2138 0D58 E3 EX (SP),HL ; Save code - Get var addr +2139 0D59 22 7E 31 LD (BRKLIN),HL ; Save address of variable +2140 0D5C 1F RRA ; Adjust type +2141 0D5D CD 0C 10 CALL CHKTYP ; Check types are the same +2142 0D60 CA 9B 0D JP Z,LETNUM ; Numeric - Move value +2143 0D63 E5 LETSTR: PUSH HL ; Save address of string var +2144 0D64 2A 94 31 LD HL,(FPREG) ; Pointer to string entry +2145 0D67 E5 PUSH HL ; Save it on stack +2146 0D68 23 INC HL ; Skip over length +2147 0D69 23 INC HL +2148 0D6A 5E LD E,(HL) ; LSB of string address +2149 0D6B 23 INC HL +2150 0D6C 56 LD D,(HL) ; MSB of string address +2151 0D6D 2A 0E 31 LD HL,(BASTXT) ; Point to start of program +2152 0D70 CD 0A 0A CALL CPDEHL ; Is string before program? +2153 0D73 D2 8A 0D JP NC,CRESTR ; Yes - Create string entry +2154 0D76 2A 0A 31 LD HL,(STRSPC) ; Point to string space +2155 0D79 CD 0A 0A CALL CPDEHL ; Is string literal in program? +2156 0D7C D1 POP DE ; Restore address of string +2157 0D7D D2 92 0D JP NC,MVSTPT ; Yes - Set up pointer +2158 0D80 21 6F 31 LD HL,TMPSTR ; Temporary string pool +2159 0D83 CD 0A 0A CALL CPDEHL ; Is string in temporary pool? +2160 0D86 D2 92 0D JP NC,MVSTPT ; No - Set up pointer +2161 0D89 3E .BYTE 3EH ; Skip "POP DE" +2162 0D8A D1 CRESTR: POP DE ; Restore address of string +2163 0D8B CD 41 16 CALL BAKTMP ; Back to last tmp-str entry +2164 0D8E EB EX DE,HL ; Address of string entry +2165 0D8F CD 7A 14 CALL SAVSTR ; Save string in string area +2166 0D92 CD 41 16 MVSTPT: CALL BAKTMP ; Back to last tmp-str entry +2167 0D95 E1 POP HL ; Get string pointer +2168 0D96 CD 44 1A CALL DETHL4 ; Move string pointer to var +2169 0D99 E1 POP HL ; Restore code string address +2170 0D9A C9 RET +2171 0D9B +2172 0D9B E5 LETNUM: PUSH HL ; Save address of variable +2173 0D9C CD 41 1A CALL FPTHL ; Move value to variable +2174 0D9F D1 POP DE ; Restore address of variable +2175 0DA0 E1 POP HL ; Restore code string address +2176 0DA1 C9 RET +2177 0DA2 +2178 0DA2 CD 68 17 ON: CALL GETINT ; Get integer 0-255 +2179 0DA5 7E LD A,(HL) ; Get "GOTO" or "GOSUB" token +2180 0DA6 47 LD B,A ; Save in B +2181 0DA7 FE 8C CP ZGOSUB ; "GOSUB" token? +2182 0DA9 CA B1 0D JP Z,ONGO ; Yes - Find line number +2183 0DAC CD 10 0A CALL CHKSYN ; Make sure it's "GOTO" +2184 0DAF 88 .BYTE ZGOTO ; "GOTO" token +2185 0DB0 2B DEC HL ; Cancel increment +2186 0DB1 4B ONGO: LD C,E ; Integer of branch value +2187 0DB2 0D ONGOLP: DEC C ; Count branches +2188 0DB3 78 LD A,B ; Get "GOTO" or "GOSUB" token +2189 0DB4 CA 82 0B JP Z,ONJMP ; Go to that line if right one +2190 0DB7 CD 67 0C CALL GETLN ; Get line number to DE +2191 0DBA FE 2C CP ',' ; Another line number? +2192 0DBC C0 RET NZ ; No - Drop through +2193 0DBD C3 B2 0D JP ONGOLP ; Yes - loop +2194 0DC0 +2195 0DC0 CD 19 10 IF: CALL EVAL ; Evaluate expression +2196 0DC3 7E LD A,(HL) ; Get token +2197 0DC4 FE 88 CP ZGOTO ; "GOTO" token? +2198 0DC6 CA CE 0D JP Z,IFGO ; Yes - Get line +2199 0DC9 CD 10 0A CALL CHKSYN ; Make sure it's "THEN" +2200 0DCC A9 .BYTE ZTHEN ; "THEN" token +2201 0DCD 2B DEC HL ; Cancel increment +2202 0DCE CD 0A 10 IFGO: CALL TSTNUM ; Make sure it's numeric +2203 0DD1 CD E9 19 CALL TSTSGN ; Test state of expression +2204 0DD4 CA 33 0D JP Z,REM ; False - Drop through +2205 0DD7 CD 9A 0B CALL GETCHR ; Get next character +2206 0DDA DA EE 0C JP C,GOTO ; Number - GOTO that line +2207 0DDD C3 81 0B JP IFJMP ; Otherwise do statement +2208 0DE0 +2209 0DE0 2B MRPRNT: DEC HL ; DEC 'cos GETCHR INCs +2210 0DE1 CD 9A 0B CALL GETCHR ; Get next character +2211 0DE4 CA 42 0E PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT +2212 0DE7 C8 PRNTLP: RET Z ; End of list - Exit +2213 0DE8 FE A5 CP ZTAB ; "TAB(" token? +2214 0DEA CA 75 0E JP Z,DOTAB ; Yes - Do TAB routine +2215 0DED FE A8 CP ZSPC ; "SPC(" token? +2216 0DEF CA 75 0E JP Z,DOTAB ; Yes - Do SPC routine +2217 0DF2 E5 PUSH HL ; Save code string address +2218 0DF3 FE 2C CP ',' ; Comma? +2219 0DF5 CA 5E 0E JP Z,DOCOM ; Yes - Move to next zone +2220 0DF8 FE 3B CP 59 ;";" ; Semi-colon? +2221 0DFA CA 98 0E JP Z,NEXITM ; Do semi-colon routine +2222 0DFD C1 POP BC ; Code string address to BC +2223 0DFE CD 19 10 CALL EVAL ; Evaluate expression +2224 0E01 E5 PUSH HL ; Save code string address +2225 0E02 3A 5D 31 LD A,(TYPE) ; Get variable type +2226 0E05 B7 OR A ; Is it a string variable? +2227 0E06 C2 2E 0E JP NZ,PRNTST ; Yes - Output string contents +2228 0E09 CD 8E 1B CALL NUMASC ; Convert number to text +2229 0E0C CD 9E 14 CALL CRTST ; Create temporary string +2230 0E0F 36 20 LD (HL),' ' ; Followed by a space +2231 0E11 2A 94 31 LD HL,(FPREG) ; Get length of output +2232 0E14 34 INC (HL) ; Plus 1 for the space +2233 0E15 2A 94 31 LD HL,(FPREG) ; < Not needed > +2234 0E18 3A F2 30 LD A,(LWIDTH) ; Get width of line +2235 0E1B 47 LD B,A ; To B +2236 0E1C 04 INC B ; Width 255 (No limit)? +2237 0E1D CA 2A 0E JP Z,PRNTNB ; Yes - Output number string +2238 0E20 04 INC B ; Adjust it +2239 0E21 3A 5B 31 LD A,(CURPOS) ; Get cursor position +2240 0E24 86 ADD A,(HL) ; Add length of string +2241 0E25 3D DEC A ; Adjust it +2242 0E26 B8 CP B ; Will output fit on this line? +2243 0E27 D4 42 0E CALL NC,PRNTCRLF ; No - CRLF first +2244 0E2A CD E3 14 PRNTNB: CALL PRS1 ; Output string at (HL) +2245 0E2D AF XOR A ; Skip CALL by setting 'z' flag +2246 0E2E C4 E3 14 PRNTST: CALL NZ,PRS1 ; Output string at (HL) +2247 0E31 E1 POP HL ; Restore code string address +2248 0E32 C3 E0 0D JP MRPRNT ; See if more to PRINT +2249 0E35 +2250 0E35 3A 5B 31 STTLIN: LD A,(CURPOS) ; Make sure on new line +2251 0E38 B7 OR A ; Already at start? +2252 0E39 C8 RET Z ; Yes - Do nothing +2253 0E3A C3 42 0E JP PRNTCRLF ; Start a new line +2254 0E3D +2255 0E3D 36 00 ENDINP: LD (HL),0 ; Mark end of buffer +2256 0E3F 21 10 31 LD HL,BUFFER-1 ; Point to buffer +2257 0E42 3E 0D PRNTCRLF: LD A,CR ; Load a CR +2258 0E44 CD 1B 0A CALL OUTC ; Output character +2259 0E47 3E 0A LD A,LF ; Load a LF +2260 0E49 CD 1B 0A CALL OUTC ; Output character +2261 0E4C AF DONULL: XOR A ; Set to position 0 +2262 0E4D 32 5B 31 LD (CURPOS),A ; Store it +2263 0E50 3A F1 30 LD A,(NULLS) ; Get number of nulls +2264 0E53 3D NULLP: DEC A ; Count them +2265 0E54 C8 RET Z ; Return if done +2266 0E55 F5 PUSH AF ; Save count +2267 0E56 AF XOR A ; Load a null +2268 0E57 CD 1B 0A CALL OUTC ; Output it +2269 0E5A F1 POP AF ; Restore count +2270 0E5B C3 53 0E JP NULLP ; Keep counting +2271 0E5E +2272 0E5E 3A F3 30 DOCOM: LD A,(COMMAN) ; Get comma width +2273 0E61 47 LD B,A ; Save in B +2274 0E62 3A 5B 31 LD A,(CURPOS) ; Get current position +2275 0E65 B8 CP B ; Within the limit? +2276 0E66 D4 42 0E CALL NC,PRNTCRLF ; No - output CRLF +2277 0E69 D2 98 0E JP NC,NEXITM ; Get next item +2278 0E6C D6 0E ZONELP: SUB 14 ; Next zone of 14 characters +2279 0E6E D2 6C 0E JP NC,ZONELP ; Repeat if more zones +2280 0E71 2F CPL ; Number of spaces to output +2281 0E72 C3 8D 0E JP ASPCS ; Output them +2282 0E75 +2283 0E75 F5 DOTAB: PUSH AF ; Save token +2284 0E76 CD 65 17 CALL FNDNUM ; Evaluate expression +2285 0E79 CD 10 0A CALL CHKSYN ; Make sure ")" follows +2286 0E7C 29 .BYTE ")" +2287 0E7D 2B DEC HL ; Back space on to ")" +2288 0E7E F1 POP AF ; Restore token +2289 0E7F D6 A8 SUB ZSPC ; Was it "SPC(" ? +2290 0E81 E5 PUSH HL ; Save code string address +2291 0E82 CA 88 0E JP Z,DOSPC ; Yes - Do 'E' spaces +2292 0E85 3A 5B 31 LD A,(CURPOS) ; Get current position +2293 0E88 2F DOSPC: CPL ; Number of spaces to print to +2294 0E89 83 ADD A,E ; Total number to print +2295 0E8A D2 98 0E JP NC,NEXITM ; TAB < Current POS(X) +2296 0E8D 3C ASPCS: INC A ; Output A spaces +2297 0E8E 47 LD B,A ; Save number to print +2298 0E8F 3E 20 LD A,' ' ; Space +2299 0E91 CD 1B 0A SPCLP: CALL OUTC ; Output character in A +2300 0E94 05 DEC B ; Count them +2301 0E95 C2 91 0E JP NZ,SPCLP ; Repeat if more +2302 0E98 E1 NEXITM: POP HL ; Restore code string address +2303 0E99 CD 9A 0B CALL GETCHR ; Get next character +2304 0E9C C3 E7 0D JP PRNTLP ; More to print +2305 0E9F +2306 0E9F 3F5265646F20REDO: .BYTE "?Redo from start",CR,LF,0 +2306 0EA5 66726F6D2073746172740D0A00 +2307 0EB2 +2308 0EB2 3A 7D 31 BADINP: LD A,(READFG) ; READ or INPUT? +2309 0EB5 B7 OR A +2310 0EB6 C2 3C 07 JP NZ,DATSNR ; READ - ?SN Error +2311 0EB9 C1 POP BC ; Throw away code string addr +2312 0EBA 21 9F 0E LD HL,REDO ; "Redo from start" message +2313 0EBD CD E0 14 CALL PRS ; Output string +2314 0EC0 C3 8D 08 JP DOAGN ; Do last INPUT again +2315 0EC3 +2316 0EC3 CD 4B 14 INPUT: CALL IDTEST ; Test for illegal direct +2317 0EC6 7E LD A,(HL) ; Get character after "INPUT" +2318 0EC7 FE 22 CP '"' ; Is there a prompt string? +2319 0EC9 3E 00 LD A,0 ; Clear A and leave flags +2320 0ECB 32 F5 30 LD (CTLOFG),A ; Enable output +2321 0ECE C2 DD 0E JP NZ,NOPMPT ; No prompt - get input +2322 0ED1 CD 9F 14 CALL QTSTR ; Get string terminated by '"' +2323 0ED4 CD 10 0A CALL CHKSYN ; Check for ';' after prompt +2324 0ED7 3B .BYTE ';' +2325 0ED8 E5 PUSH HL ; Save code string address +2326 0ED9 CD E3 14 CALL PRS1 ; Output prompt string +2327 0EDC 3E .BYTE 3EH ; Skip "PUSH HL" +2328 0EDD E5 NOPMPT: PUSH HL ; Save code string address +2329 0EDE CD 91 08 CALL PROMPT ; Get input with "? " prompt +2330 0EE1 C1 POP BC ; Restore code string address +2331 0EE2 DA E9 0B JP C,INPBRK ; Break pressed - Exit +2332 0EE5 23 INC HL ; Next byte +2333 0EE6 7E LD A,(HL) ; Get it +2334 0EE7 B7 OR A ; End of line? +2335 0EE8 2B DEC HL ; Back again +2336 0EE9 C5 PUSH BC ; Re-save code string address +2337 0EEA CA 30 0D JP Z,NXTDTA ; Yes - Find next DATA stmt +2338 0EED 36 2C LD (HL),',' ; Store comma as separator +2339 0EEF C3 F7 0E JP NXTITM ; Get next item +2340 0EF2 +2341 0EF2 E5 READ: PUSH HL ; Save code string address +2342 0EF3 2A 8C 31 LD HL,(NXTDAT) ; Next DATA statement +2343 0EF6 F6 .BYTE 0F6H ; Flag "READ" +2344 0EF7 AF NXTITM: XOR A ; Flag "INPUT" +2345 0EF8 32 7D 31 LD (READFG),A ; Save "READ"/"INPUT" flag +2346 0EFB E3 EX (SP),HL ; Get code str' , Save pointer +2347 0EFC C3 03 0F JP GTVLUS ; Get values +2348 0EFF +2349 0EFF CD 10 0A NEDMOR: CALL CHKSYN ; Check for comma between items +2350 0F02 2C .BYTE ',' +2351 0F03 CD FD 11 GTVLUS: CALL GETVAR ; Get variable name +2352 0F06 E3 EX (SP),HL ; Save code str" , Get pointer +2353 0F07 D5 PUSH DE ; Save variable address +2354 0F08 7E LD A,(HL) ; Get next "INPUT"/"DATA" byte +2355 0F09 FE 2C CP ',' ; Comma? +2356 0F0B CA 2B 0F JP Z,ANTVLU ; Yes - Get another value +2357 0F0E 3A 7D 31 LD A,(READFG) ; Is it READ? +2358 0F11 B7 OR A +2359 0F12 C2 98 0F JP NZ,FDTLP ; Yes - Find next DATA stmt +2360 0F15 3E 3F LD A,'?' ; More INPUT needed +2361 0F17 CD 1B 0A CALL OUTC ; Output character +2362 0F1A CD 91 08 CALL PROMPT ; Get INPUT with prompt +2363 0F1D D1 POP DE ; Variable address +2364 0F1E C1 POP BC ; Code string address +2365 0F1F DA E9 0B JP C,INPBRK ; Break pressed +2366 0F22 23 INC HL ; Point to next DATA byte +2367 0F23 7E LD A,(HL) ; Get byte +2368 0F24 B7 OR A ; Is it zero (No input) ? +2369 0F25 2B DEC HL ; Back space INPUT pointer +2370 0F26 C5 PUSH BC ; Save code string address +2371 0F27 CA 30 0D JP Z,NXTDTA ; Find end of buffer +2372 0F2A D5 PUSH DE ; Save variable address +2373 0F2B 3A 5D 31 ANTVLU: LD A,(TYPE) ; Check data type +2374 0F2E B7 OR A ; Is it numeric? +2375 0F2F CA 55 0F JP Z,INPBIN ; Yes - Convert to binary +2376 0F32 CD 9A 0B CALL GETCHR ; Get next character +2377 0F35 57 LD D,A ; Save input character +2378 0F36 47 LD B,A ; Again +2379 0F37 FE 22 CP '"' ; Start of literal sting? +2380 0F39 CA 49 0F JP Z,STRENT ; Yes - Create string entry +2381 0F3C 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? +2382 0F3F B7 OR A +2383 0F40 57 LD D,A ; Save 00 if "INPUT" +2384 0F41 CA 46 0F JP Z,ITMSEP ; "INPUT" - End with 00 +2385 0F44 16 3A LD D,':' ; "DATA" - End with 00 or ':' +2386 0F46 06 2C ITMSEP: LD B,',' ; Item separator +2387 0F48 2B DEC HL ; Back space for DTSTR +2388 0F49 CD A2 14 STRENT: CALL DTSTR ; Get string terminated by D +2389 0F4C EB EX DE,HL ; String address to DE +2390 0F4D 21 60 0F LD HL,LTSTND ; Where to go after LETSTR +2391 0F50 E3 EX (SP),HL ; Save HL , get input pointer +2392 0F51 D5 PUSH DE ; Save address of string +2393 0F52 C3 63 0D JP LETSTR ; Assign string to variable +2394 0F55 +2395 0F55 CD 9A 0B INPBIN: CALL GETCHR ; Get next character +2396 0F58 CD F0 1A CALL ASCTFP ; Convert ASCII to FP number +2397 0F5B E3 EX (SP),HL ; Save input ptr, Get var addr +2398 0F5C CD 41 1A CALL FPTHL ; Move FPREG to variable +2399 0F5F E1 POP HL ; Restore input pointer +2400 0F60 2B LTSTND: DEC HL ; DEC 'cos GETCHR INCs +2401 0F61 CD 9A 0B CALL GETCHR ; Get next character +2402 0F64 CA 6C 0F JP Z,MORDT ; End of line - More needed? +2403 0F67 FE 2C CP ',' ; Another value? +2404 0F69 C2 B2 0E JP NZ,BADINP ; No - Bad input +2405 0F6C E3 MORDT: EX (SP),HL ; Get code string address +2406 0F6D 2B DEC HL ; DEC 'cos GETCHR INCs +2407 0F6E CD 9A 0B CALL GETCHR ; Get next character +2408 0F71 C2 FF 0E JP NZ,NEDMOR ; More needed - Get it +2409 0F74 D1 POP DE ; Restore DATA pointer +2410 0F75 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? +2411 0F78 B7 OR A +2412 0F79 EB EX DE,HL ; DATA pointer to HL +2413 0F7A C2 C0 0B JP NZ,UPDATA ; Update DATA pointer if "READ" +2414 0F7D D5 PUSH DE ; Save code string address +2415 0F7E B6 OR (HL) ; More input given? +2416 0F7F 21 87 0F LD HL,EXTIG ; "?Extra ignored" message +2417 0F82 C4 E0 14 CALL NZ,PRS ; Output string if extra given +2418 0F85 E1 POP HL ; Restore code string address +2419 0F86 C9 RET +2420 0F87 +2421 0F87 3F4578747261EXTIG: .BYTE "?Extra ignored",CR,LF,0 +2421 0F8D 2069676E6F7265640D0A00 +2422 0F98 +2423 0F98 CD 31 0D FDTLP: CALL DATA ; Get next statement +2424 0F9B B7 OR A ; End of line? +2425 0F9C C2 B1 0F JP NZ,FANDT ; No - See if DATA statement +2426 0F9F 23 INC HL +2427 0FA0 7E LD A,(HL) ; End of program? +2428 0FA1 23 INC HL +2429 0FA2 B6 OR (HL) ; 00 00 Ends program +2430 0FA3 1E 06 LD E,OD ; ?OD Error +2431 0FA5 CA 56 07 JP Z,ERROR ; Yes - Out of DATA +2432 0FA8 23 INC HL +2433 0FA9 5E LD E,(HL) ; LSB of line number +2434 0FAA 23 INC HL +2435 0FAB 56 LD D,(HL) ; MSB of line number +2436 0FAC EB EX DE,HL +2437 0FAD 22 79 31 LD (DATLIN),HL ; Set line of current DATA item +2438 0FB0 EB EX DE,HL +2439 0FB1 CD 9A 0B FANDT: CALL GETCHR ; Get next character +2440 0FB4 FE 83 CP ZDATA ; "DATA" token +2441 0FB6 C2 98 0F JP NZ,FDTLP ; No "DATA" - Keep looking +2442 0FB9 C3 2B 0F JP ANTVLU ; Found - Convert input +2443 0FBC +2444 0FBC 11 00 00 NEXT: LD DE,0 ; In case no index given +2445 0FBF C4 FD 11 NEXT1: CALL NZ,GETVAR ; Get index address +2446 0FC2 22 7E 31 LD (BRKLIN),HL ; Save code string address +2447 0FC5 CD EB 06 CALL BAKSTK ; Look for "FOR" block +2448 0FC8 C2 48 07 JP NZ,NFERR ; No "FOR" - ?NF Error +2449 0FCB F9 LD SP,HL ; Clear nested loops +2450 0FCC D5 PUSH DE ; Save index address +2451 0FCD 7E LD A,(HL) ; Get sign of STEP +2452 0FCE 23 INC HL +2453 0FCF F5 PUSH AF ; Save sign of STEP +2454 0FD0 D5 PUSH DE ; Save index address +2455 0FD1 CD 27 1A CALL PHLTFP ; Move index value to FPREG +2456 0FD4 E3 EX (SP),HL ; Save address of TO value +2457 0FD5 E5 PUSH HL ; Save address of index +2458 0FD6 CD 94 17 CALL ADDPHL ; Add STEP to index value +2459 0FD9 E1 POP HL ; Restore address of index +2460 0FDA CD 41 1A CALL FPTHL ; Move value to index variable +2461 0FDD E1 POP HL ; Restore address of TO value +2462 0FDE CD 38 1A CALL LOADFP ; Move TO value to BCDE +2463 0FE1 E5 PUSH HL ; Save address of line of FOR +2464 0FE2 CD 64 1A CALL CMPNUM ; Compare index with TO value +2465 0FE5 E1 POP HL ; Restore address of line num +2466 0FE6 C1 POP BC ; Address of sign of STEP +2467 0FE7 90 SUB B ; Compare with expected sign +2468 0FE8 CD 38 1A CALL LOADFP ; BC = Loop stmt,DE = Line num +2469 0FEB CA F7 0F JP Z,KILFOR ; Loop finished - Terminate it +2470 0FEE EB EX DE,HL ; Loop statement line number +2471 0FEF 22 0C 31 LD (LINEAT),HL ; Set loop line number +2472 0FF2 69 LD L,C ; Set code string to loop +2473 0FF3 60 LD H,B +2474 0FF4 C3 56 0B JP PUTFID ; Put back "FOR" and continue +2475 0FF7 +2476 0FF7 F9 KILFOR: LD SP,HL ; Remove "FOR" block +2477 0FF8 2A 7E 31 LD HL,(BRKLIN) ; Code string after "NEXT" +2478 0FFB 7E LD A,(HL) ; Get next byte in code string +2479 0FFC FE 2C CP ',' ; More NEXTs ? +2480 0FFE C2 5A 0B JP NZ,RUNCNT ; No - Do next statement +2481 1001 CD 9A 0B CALL GETCHR ; Position to index name +2482 1004 CD BF 0F CALL NEXT1 ; Re-enter NEXT routine +2483 1007 ; < will not RETurn to here , Exit to RUNCNT or Loop > +2484 1007 +2485 1007 CD 19 10 GETNUM: CALL EVAL ; Get a numeric expression +2486 100A F6 TSTNUM: .BYTE 0F6H ; Clear carry (numeric) +2487 100B 37 TSTSTR: SCF ; Set carry (string) +2488 100C 3A 5D 31 CHKTYP: LD A,(TYPE) ; Check types match +2489 100F 8F ADC A,A ; Expected + actual +2490 1010 B7 OR A ; Clear carry , set parity +2491 1011 E8 RET PE ; Even parity - Types match +2492 1012 C3 54 07 JP TMERR ; Different types - Error +2493 1015 +2494 1015 CD 10 0A OPNPAR: CALL CHKSYN ; Make sure "(" follows +2495 1018 28 .BYTE "(" +2496 1019 2B EVAL: DEC HL ; Evaluate expression & save +2497 101A 16 00 LD D,0 ; Precedence value +2498 101C D5 EVAL1: PUSH DE ; Save precedence +2499 101D 0E 01 LD C,1 +2500 101F CD 1F 07 CALL CHKSTK ; Check for 1 level of stack +2501 1022 CD 90 10 CALL OPRND ; Get next expression value +2502 1025 22 80 31 EVAL2: LD (NXTOPR),HL ; Save address of next operator +2503 1028 2A 80 31 EVAL3: LD HL,(NXTOPR) ; Restore address of next opr +2504 102B C1 POP BC ; Precedence value and operator +2505 102C 78 LD A,B ; Get precedence value +2506 102D FE 78 CP 78H ; "AND" or "OR" ? +2507 102F D4 0A 10 CALL NC,TSTNUM ; No - Make sure it's a number +2508 1032 7E LD A,(HL) ; Get next operator / function +2509 1033 16 00 LD D,0 ; Clear Last relation +2510 1035 D6 B3 RLTLP: SUB ZGTR ; ">" Token +2511 1037 DA 51 10 JP C,FOPRND ; + - * / ^ AND OR - Test it +2512 103A FE 03 CP ZLTH+1-ZGTR ; < = > +2513 103C D2 51 10 JP NC,FOPRND ; Function - Call it +2514 103F FE 01 CP ZEQUAL-ZGTR ; "=" +2515 1041 17 RLA ; <- Test for legal +2516 1042 AA XOR D ; <- combinations of < = > +2517 1043 BA CP D ; <- by combining last token +2518 1044 57 LD D,A ; <- with current one +2519 1045 DA 42 07 JP C,SNERR ; Error if "<<' '==" or ">>" +2520 1048 22 75 31 LD (CUROPR),HL ; Save address of current token +2521 104B CD 9A 0B CALL GETCHR ; Get next character +2522 104E C3 35 10 JP RLTLP ; Treat the two as one +2523 1051 +2524 1051 7A FOPRND: LD A,D ; < = > found ? +2525 1052 B7 OR A +2526 1053 C2 78 11 JP NZ,TSTRED ; Yes - Test for reduction +2527 1056 7E LD A,(HL) ; Get operator token +2528 1057 22 75 31 LD (CUROPR),HL ; Save operator address +2529 105A D6 AC SUB ZPLUS ; Operator or function? +2530 105C D8 RET C ; Neither - Exit +2531 105D FE 07 CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ? +2532 105F D0 RET NC ; No - Exit +2533 1060 5F LD E,A ; Coded operator +2534 1061 3A 5D 31 LD A,(TYPE) ; Get data type +2535 1064 3D DEC A ; FF = numeric , 00 = string +2536 1065 B3 OR E ; Combine with coded operator +2537 1066 7B LD A,E ; Get coded operator +2538 1067 CA D6 15 JP Z,CONCAT ; String concatenation +2539 106A 07 RLCA ; Times 2 +2540 106B 83 ADD A,E ; Times 3 +2541 106C 5F LD E,A ; To DE (D is 0) +2542 106D 21 34 06 LD HL,PRITAB ; Precedence table +2543 1070 19 ADD HL,DE ; To the operator concerned +2544 1071 78 LD A,B ; Last operator precedence +2545 1072 56 LD D,(HL) ; Get evaluation precedence +2546 1073 BA CP D ; Compare with eval precedence +2547 1074 D0 RET NC ; Exit if higher precedence +2548 1075 23 INC HL ; Point to routine address +2549 1076 CD 0A 10 CALL TSTNUM ; Make sure it's a number +2550 1079 +2551 1079 C5 STKTHS: PUSH BC ; Save last precedence & token +2552 107A 01 28 10 LD BC,EVAL3 ; Where to go on prec' break +2553 107D C5 PUSH BC ; Save on stack for return +2554 107E 43 LD B,E ; Save operator +2555 107F 4A LD C,D ; Save precedence +2556 1080 CD 1A 1A CALL STAKFP ; Move value to stack +2557 1083 58 LD E,B ; Restore operator +2558 1084 51 LD D,C ; Restore precedence +2559 1085 4E LD C,(HL) ; Get LSB of routine address +2560 1086 23 INC HL +2561 1087 46 LD B,(HL) ; Get MSB of routine address +2562 1088 23 INC HL +2563 1089 C5 PUSH BC ; Save routine address +2564 108A 2A 75 31 LD HL,(CUROPR) ; Address of current operator +2565 108D C3 1C 10 JP EVAL1 ; Loop until prec' break +2566 1090 +2567 1090 AF OPRND: XOR A ; Get operand routine +2568 1091 32 5D 31 LD (TYPE),A ; Set numeric expected +2569 1094 CD 9A 0B CALL GETCHR ; Get next character +2570 1097 1E 24 LD E,MO ; ?MO Error +2571 1099 CA 56 07 JP Z,ERROR ; No operand - Error +2572 109C DA F0 1A JP C,ASCTFP ; Number - Get value +2573 109F CD 38 0C CALL CHKLTR ; See if a letter +2574 10A2 D2 F7 10 JP NC,CONVAR ; Letter - Find variable +2575 10A5 FE 26 CP '&' ; &H = HEX, &B = BINARY +2576 10A7 20 12 JR NZ, NOTAMP +2577 10A9 CD 9A 0B CALL GETCHR ; Get next character +2578 10AC FE 48 CP 'H' ; Hex number indicated? [function added] +2579 10AE CA 34 1F JP Z,HEXTFP ; Convert Hex to FPREG +2580 10B1 FE 42 CP 'B' ; Binary number indicated? [function added] +2581 10B3 CA A4 1F JP Z,BINTFP ; Convert Bin to FPREG +2582 10B6 1E 02 LD E,SN ; If neither then a ?SN Error +2583 10B8 CA 56 07 JP Z,ERROR ; +2584 10BB FE AC NOTAMP: CP ZPLUS ; '+' Token ? +2585 10BD CA 90 10 JP Z,OPRND ; Yes - Look for operand +2586 10C0 FE 2E CP '.' ; '.' ? +2587 10C2 CA F0 1A JP Z,ASCTFP ; Yes - Create FP number +2588 10C5 FE AD CP ZMINUS ; '-' Token ? +2589 10C7 CA E6 10 JP Z,MINUS ; Yes - Do minus +2590 10CA FE 22 CP '"' ; Literal string ? +2591 10CC CA 9F 14 JP Z,QTSTR ; Get string terminated by '"' +2592 10CF FE AA CP ZNOT ; "NOT" Token ? +2593 10D1 CA D8 11 JP Z,EVNOT ; Yes - Eval NOT expression +2594 10D4 FE A7 CP ZFN ; "FN" Token ? +2595 10D6 CA 03 14 JP Z,DOFN ; Yes - Do FN routine +2596 10D9 D6 B6 SUB ZSGN ; Is it a function? +2597 10DB D2 08 11 JP NC,FNOFST ; Yes - Evaluate function +2598 10DE CD 15 10 EVLPAR: CALL OPNPAR ; Evaluate expression in "()" +2599 10E1 CD 10 0A CALL CHKSYN ; Make sure ")" follows +2600 10E4 29 .BYTE ")" +2601 10E5 C9 RET +2602 10E6 +2603 10E6 16 7D MINUS: LD D,7DH ; '-' precedence +2604 10E8 CD 1C 10 CALL EVAL1 ; Evaluate until prec' break +2605 10EB 2A 80 31 LD HL,(NXTOPR) ; Get next operator address +2606 10EE E5 PUSH HL ; Save next operator address +2607 10EF CD 12 1A CALL INVSGN ; Negate value +2608 10F2 CD 0A 10 RETNUM: CALL TSTNUM ; Make sure it's a number +2609 10F5 E1 POP HL ; Restore next operator address +2610 10F6 C9 RET +2611 10F7 +2612 10F7 CD FD 11 CONVAR: CALL GETVAR ; Get variable address to DE +2613 10FA E5 FRMEVL: PUSH HL ; Save code string address +2614 10FB EB EX DE,HL ; Variable address to HL +2615 10FC 22 94 31 LD (FPREG),HL ; Save address of variable +2616 10FF 3A 5D 31 LD A,(TYPE) ; Get type +2617 1102 B7 OR A ; Numeric? +2618 1103 CC 27 1A CALL Z,PHLTFP ; Yes - Move contents to FPREG +2619 1106 E1 POP HL ; Restore code string address +2620 1107 C9 RET +2621 1108 +2622 1108 06 00 FNOFST: LD B,0 ; Get address of function +2623 110A 07 RLCA ; Double function offset +2624 110B 4F LD C,A ; BC = Offset in function table +2625 110C C5 PUSH BC ; Save adjusted token value +2626 110D CD 9A 0B CALL GETCHR ; Get next character +2627 1110 79 LD A,C ; Get adjusted token value +2628 1111 FE 31 CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? +2629 1113 DA 2F 11 JP C,FNVAL ; No - Do function +2630 1116 CD 15 10 CALL OPNPAR ; Evaluate expression (X,... +2631 1119 CD 10 0A CALL CHKSYN ; Make sure ',' follows +2632 111C 2C .BYTE ',' +2633 111D CD 0B 10 CALL TSTSTR ; Make sure it's a string +2634 1120 EB EX DE,HL ; Save code string address +2635 1121 2A 94 31 LD HL,(FPREG) ; Get address of string +2636 1124 E3 EX (SP),HL ; Save address of string +2637 1125 E5 PUSH HL ; Save adjusted token value +2638 1126 EB EX DE,HL ; Restore code string address +2639 1127 CD 68 17 CALL GETINT ; Get integer 0-255 +2640 112A EB EX DE,HL ; Save code string address +2641 112B E3 EX (SP),HL ; Save integer,HL = adj' token +2642 112C C3 37 11 JP GOFUNC ; Jump to string function +2643 112F +2644 112F CD DE 10 FNVAL: CALL EVLPAR ; Evaluate expression +2645 1132 E3 EX (SP),HL ; HL = Adjusted token value +2646 1133 11 F2 10 LD DE,RETNUM ; Return number from function +2647 1136 D5 PUSH DE ; Save on stack +2648 1137 01 93 04 GOFUNC: LD BC,FNCTAB ; Function routine addresses +2649 113A 09 ADD HL,BC ; Point to right address +2650 113B 4E LD C,(HL) ; Get LSB of address +2651 113C 23 INC HL ; +2652 113D 66 LD H,(HL) ; Get MSB of address +2653 113E 69 LD L,C ; Address to HL +2654 113F E9 JP (HL) ; Jump to function +2655 1140 +2656 1140 15 SGNEXP: DEC D ; Dee to flag negative exponent +2657 1141 FE AD CP ZMINUS ; '-' token ? +2658 1143 C8 RET Z ; Yes - Return +2659 1144 FE 2D CP '-' ; '-' ASCII ? +2660 1146 C8 RET Z ; Yes - Return +2661 1147 14 INC D ; Inc to flag positive exponent +2662 1148 FE 2B CP '+' ; '+' ASCII ? +2663 114A C8 RET Z ; Yes - Return +2664 114B FE AC CP ZPLUS ; '+' token ? +2665 114D C8 RET Z ; Yes - Return +2666 114E 2B DEC HL ; DEC 'cos GETCHR INCs +2667 114F C9 RET ; Return "NZ" +2668 1150 +2669 1150 F6 POR: .BYTE 0F6H ; Flag "OR" +2670 1151 AF PAND: XOR A ; Flag "AND" +2671 1152 F5 PUSH AF ; Save "AND" / "OR" flag +2672 1153 CD 0A 10 CALL TSTNUM ; Make sure it's a number +2673 1156 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +2674 1159 F1 POP AF ; Restore "AND" / "OR" flag +2675 115A EB EX DE,HL ; <- Get last +2676 115B C1 POP BC ; <- value +2677 115C E3 EX (SP),HL ; <- from +2678 115D EB EX DE,HL ; <- stack +2679 115E CD 2A 1A CALL FPBCDE ; Move last value to FPREG +2680 1161 F5 PUSH AF ; Save "AND" / "OR" flag +2681 1162 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +2682 1165 F1 POP AF ; Restore "AND" / "OR" flag +2683 1166 C1 POP BC ; Get value +2684 1167 79 LD A,C ; Get LSB +2685 1168 21 C1 13 LD HL,ACPASS ; Address of save AC as current +2686 116B C2 73 11 JP NZ,POR1 ; Jump if OR +2687 116E A3 AND E ; "AND" LSBs +2688 116F 4F LD C,A ; Save LSB +2689 1170 78 LD A,B ; Get MBS +2690 1171 A2 AND D ; "AND" MSBs +2691 1172 E9 JP (HL) ; Save AC as current (ACPASS) +2692 1173 +2693 1173 B3 POR1: OR E ; "OR" LSBs +2694 1174 4F LD C,A ; Save LSB +2695 1175 78 LD A,B ; Get MSB +2696 1176 B2 OR D ; "OR" MSBs +2697 1177 E9 JP (HL) ; Save AC as current (ACPASS) +2698 1178 +2699 1178 21 8A 11 TSTRED: LD HL,CMPLOG ; Logical compare routine +2700 117B 3A 5D 31 LD A,(TYPE) ; Get data type +2701 117E 1F RRA ; Carry set = string +2702 117F 7A LD A,D ; Get last precedence value +2703 1180 17 RLA ; Times 2 plus carry +2704 1181 5F LD E,A ; To E +2705 1182 16 64 LD D,64H ; Relational precedence +2706 1184 78 LD A,B ; Get current precedence +2707 1185 BA CP D ; Compare with last +2708 1186 D0 RET NC ; Eval if last was rel' or log' +2709 1187 C3 79 10 JP STKTHS ; Stack this one and get next +2710 118A +2711 118A 8C 11 CMPLOG: .WORD CMPLG1 ; Compare two values / strings +2712 118C 79 CMPLG1: LD A,C ; Get data type +2713 118D B7 OR A +2714 118E 1F RRA +2715 118F C1 POP BC ; Get last expression to BCDE +2716 1190 D1 POP DE +2717 1191 F5 PUSH AF ; Save status +2718 1192 CD 0C 10 CALL CHKTYP ; Check that types match +2719 1195 21 CE 11 LD HL,CMPRES ; Result to comparison +2720 1198 E5 PUSH HL ; Save for RETurn +2721 1199 CA 64 1A JP Z,CMPNUM ; Compare values if numeric +2722 119C AF XOR A ; Compare two strings +2723 119D 32 5D 31 LD (TYPE),A ; Set type to numeric +2724 11A0 D5 PUSH DE ; Save string name +2725 11A1 CD 23 16 CALL GSTRCU ; Get current string +2726 11A4 7E LD A,(HL) ; Get length of string +2727 11A5 23 INC HL +2728 11A6 23 INC HL +2729 11A7 4E LD C,(HL) ; Get LSB of address +2730 11A8 23 INC HL +2731 11A9 46 LD B,(HL) ; Get MSB of address +2732 11AA D1 POP DE ; Restore string name +2733 11AB C5 PUSH BC ; Save address of string +2734 11AC F5 PUSH AF ; Save length of string +2735 11AD CD 27 16 CALL GSTRDE ; Get second string +2736 11B0 CD 38 1A CALL LOADFP ; Get address of second string +2737 11B3 F1 POP AF ; Restore length of string 1 +2738 11B4 57 LD D,A ; Length to D +2739 11B5 E1 POP HL ; Restore address of string 1 +2740 11B6 7B CMPSTR: LD A,E ; Bytes of string 2 to do +2741 11B7 B2 OR D ; Bytes of string 1 to do +2742 11B8 C8 RET Z ; Exit if all bytes compared +2743 11B9 7A LD A,D ; Get bytes of string 1 to do +2744 11BA D6 01 SUB 1 +2745 11BC D8 RET C ; Exit if end of string 1 +2746 11BD AF XOR A +2747 11BE BB CP E ; Bytes of string 2 to do +2748 11BF 3C INC A +2749 11C0 D0 RET NC ; Exit if end of string 2 +2750 11C1 15 DEC D ; Count bytes in string 1 +2751 11C2 1D DEC E ; Count bytes in string 2 +2752 11C3 0A LD A,(BC) ; Byte in string 2 +2753 11C4 BE CP (HL) ; Compare to byte in string 1 +2754 11C5 23 INC HL ; Move up string 1 +2755 11C6 03 INC BC ; Move up string 2 +2756 11C7 CA B6 11 JP Z,CMPSTR ; Same - Try next bytes +2757 11CA 3F CCF ; Flag difference (">" or "<") +2758 11CB C3 F4 19 JP FLGDIF ; "<" gives -1 , ">" gives +1 +2759 11CE +2760 11CE 3C CMPRES: INC A ; Increment current value +2761 11CF 8F ADC A,A ; Double plus carry +2762 11D0 C1 POP BC ; Get other value +2763 11D1 A0 AND B ; Combine them +2764 11D2 C6 FF ADD A,-1 ; Carry set if different +2765 11D4 9F SBC A,A ; 00 - Equal , FF - Different +2766 11D5 C3 FB 19 JP FLGREL ; Set current value & continue +2767 11D8 +2768 11D8 16 5A EVNOT: LD D,5AH ; Precedence value for "NOT" +2769 11DA CD 1C 10 CALL EVAL1 ; Eval until precedence break +2770 11DD CD 0A 10 CALL TSTNUM ; Make sure it's a number +2771 11E0 CD 4C 0C CALL DEINT ; Get integer -32768 - 32767 +2772 11E3 7B LD A,E ; Get LSB +2773 11E4 2F CPL ; Invert LSB +2774 11E5 4F LD C,A ; Save "NOT" of LSB +2775 11E6 7A LD A,D ; Get MSB +2776 11E7 2F CPL ; Invert MSB +2777 11E8 CD C1 13 CALL ACPASS ; Save AC as current +2778 11EB C1 POP BC ; Clean up stack +2779 11EC C3 28 10 JP EVAL3 ; Continue evaluation +2780 11EF +2781 11EF 2B DIMRET: DEC HL ; DEC 'cos GETCHR INCs +2782 11F0 CD 9A 0B CALL GETCHR ; Get next character +2783 11F3 C8 RET Z ; End of DIM statement +2784 11F4 CD 10 0A CALL CHKSYN ; Make sure ',' follows +2785 11F7 2C .BYTE ',' +2786 11F8 01 EF 11 DIM: LD BC,DIMRET ; Return to "DIMRET" +2787 11FB C5 PUSH BC ; Save on stack +2788 11FC F6 .BYTE 0F6H ; Flag "Create" variable +2789 11FD AF GETVAR: XOR A ; Find variable address,to DE +2790 11FE 32 5C 31 LD (LCRFLG),A ; Set locate / create flag +2791 1201 46 LD B,(HL) ; Get First byte of name +2792 1202 CD 38 0C GTFNAM: CALL CHKLTR ; See if a letter +2793 1205 DA 42 07 JP C,SNERR ; ?SN Error if not a letter +2794 1208 AF XOR A +2795 1209 4F LD C,A ; Clear second byte of name +2796 120A 32 5D 31 LD (TYPE),A ; Set type to numeric +2797 120D CD 9A 0B CALL GETCHR ; Get next character +2798 1210 DA 19 12 JP C,SVNAM2 ; Numeric - Save in name +2799 1213 CD 38 0C CALL CHKLTR ; See if a letter +2800 1216 DA 26 12 JP C,CHARTY ; Not a letter - Check type +2801 1219 4F SVNAM2: LD C,A ; Save second byte of name +2802 121A CD 9A 0B ENDNAM: CALL GETCHR ; Get next character +2803 121D DA 1A 12 JP C,ENDNAM ; Numeric - Get another +2804 1220 CD 38 0C CALL CHKLTR ; See if a letter +2805 1223 D2 1A 12 JP NC,ENDNAM ; Letter - Get another +2806 1226 D6 24 CHARTY: SUB '$' ; String variable? +2807 1228 C2 35 12 JP NZ,NOTSTR ; No - Numeric variable +2808 122B 3C INC A ; A = 1 (string type) +2809 122C 32 5D 31 LD (TYPE),A ; Set type to string +2810 122F 0F RRCA ; A = 80H , Flag for string +2811 1230 81 ADD A,C ; 2nd byte of name has bit 7 on +2812 1231 4F LD C,A ; Resave second byte on name +2813 1232 CD 9A 0B CALL GETCHR ; Get next character +2814 1235 3A 7B 31 NOTSTR: LD A,(FORFLG) ; Array name needed ? +2815 1238 3D DEC A +2816 1239 CA E2 12 JP Z,ARLDSV ; Yes - Get array name +2817 123C F2 45 12 JP P,NSCFOR ; No array with "FOR" or "FN" +2818 123F 7E LD A,(HL) ; Get byte again +2819 1240 D6 28 SUB '(' ; Subscripted variable? +2820 1242 CA BA 12 JP Z,SBSCPT ; Yes - Sort out subscript +2821 1245 +2822 1245 AF NSCFOR: XOR A ; Simple variable +2823 1246 32 7B 31 LD (FORFLG),A ; Clear "FOR" flag +2824 1249 E5 PUSH HL ; Save code string address +2825 124A 50 LD D,B ; DE = Variable name to find +2826 124B 59 LD E,C +2827 124C 2A 8E 31 LD HL,(FNRGNM) ; FN argument name +2828 124F CD 0A 0A CALL CPDEHL ; Is it the FN argument? +2829 1252 11 90 31 LD DE,FNARG ; Point to argument value +2830 1255 CA 2A 19 JP Z,POPHRT ; Yes - Return FN argument value +2831 1258 2A 88 31 LD HL,(VAREND) ; End of variables +2832 125B EB EX DE,HL ; Address of end of search +2833 125C 2A 86 31 LD HL,(PROGND) ; Start of variables address +2834 125F CD 0A 0A FNDVAR: CALL CPDEHL ; End of variable list table? +2835 1262 CA 78 12 JP Z,CFEVAL ; Yes - Called from EVAL? +2836 1265 79 LD A,C ; Get second byte of name +2837 1266 96 SUB (HL) ; Compare with name in list +2838 1267 23 INC HL ; Move on to first byte +2839 1268 C2 6D 12 JP NZ,FNTHR ; Different - Find another +2840 126B 78 LD A,B ; Get first byte of name +2841 126C 96 SUB (HL) ; Compare with name in list +2842 126D 23 FNTHR: INC HL ; Move on to LSB of value +2843 126E CA AC 12 JP Z,RETADR ; Found - Return address +2844 1271 23 INC HL ; <- Skip +2845 1272 23 INC HL ; <- over +2846 1273 23 INC HL ; <- F.P. +2847 1274 23 INC HL ; <- value +2848 1275 C3 5F 12 JP FNDVAR ; Keep looking +2849 1278 +2850 1278 E1 CFEVAL: POP HL ; Restore code string address +2851 1279 E3 EX (SP),HL ; Get return address +2852 127A D5 PUSH DE ; Save address of variable +2853 127B 11 FA 10 LD DE,FRMEVL ; Return address in EVAL +2854 127E CD 0A 0A CALL CPDEHL ; Called from EVAL ? +2855 1281 D1 POP DE ; Restore address of variable +2856 1282 CA AF 12 JP Z,RETNUL ; Yes - Return null variable +2857 1285 E3 EX (SP),HL ; Put back return +2858 1286 E5 PUSH HL ; Save code string address +2859 1287 C5 PUSH BC ; Save variable name +2860 1288 01 06 00 LD BC,6 ; 2 byte name plus 4 byte data +2861 128B 2A 8A 31 LD HL,(ARREND) ; End of arrays +2862 128E E5 PUSH HL ; Save end of arrays +2863 128F 09 ADD HL,BC ; Move up 6 bytes +2864 1290 C1 POP BC ; Source address in BC +2865 1291 E5 PUSH HL ; Save new end address +2866 1292 CD 0E 07 CALL MOVUP ; Move arrays up +2867 1295 E1 POP HL ; Restore new end address +2868 1296 22 8A 31 LD (ARREND),HL ; Set new end address +2869 1299 60 LD H,B ; End of variables to HL +2870 129A 69 LD L,C +2871 129B 22 88 31 LD (VAREND),HL ; Set new end address +2872 129E +2873 129E 2B ZEROLP: DEC HL ; Back through to zero variable +2874 129F 36 00 LD (HL),0 ; Zero byte in variable +2875 12A1 CD 0A 0A CALL CPDEHL ; Done them all? +2876 12A4 C2 9E 12 JP NZ,ZEROLP ; No - Keep on going +2877 12A7 D1 POP DE ; Get variable name +2878 12A8 73 LD (HL),E ; Store second character +2879 12A9 23 INC HL +2880 12AA 72 LD (HL),D ; Store first character +2881 12AB 23 INC HL +2882 12AC EB RETADR: EX DE,HL ; Address of variable in DE +2883 12AD E1 POP HL ; Restore code string address +2884 12AE C9 RET +2885 12AF +2886 12AF 32 97 31 RETNUL: LD (FPEXP),A ; Set result to zero +2887 12B2 21 DE 06 LD HL,ZERBYT ; Also set a null string +2888 12B5 22 94 31 LD (FPREG),HL ; Save for EVAL +2889 12B8 E1 POP HL ; Restore code string address +2890 12B9 C9 RET +2891 12BA +2892 12BA E5 SBSCPT: PUSH HL ; Save code string address +2893 12BB 2A 5C 31 LD HL,(LCRFLG) ; Locate/Create and Type +2894 12BE E3 EX (SP),HL ; Save and get code string +2895 12BF 57 LD D,A ; Zero number of dimensions +2896 12C0 D5 SCPTLP: PUSH DE ; Save number of dimensions +2897 12C1 C5 PUSH BC ; Save array name +2898 12C2 CD 40 0C CALL FPSINT ; Get subscript (0-32767) +2899 12C5 C1 POP BC ; Restore array name +2900 12C6 F1 POP AF ; Get number of dimensions +2901 12C7 EB EX DE,HL +2902 12C8 E3 EX (SP),HL ; Save subscript value +2903 12C9 E5 PUSH HL ; Save LCRFLG and TYPE +2904 12CA EB EX DE,HL +2905 12CB 3C INC A ; Count dimensions +2906 12CC 57 LD D,A ; Save in D +2907 12CD 7E LD A,(HL) ; Get next byte in code string +2908 12CE FE 2C CP ',' ; Comma (more to come)? +2909 12D0 CA C0 12 JP Z,SCPTLP ; Yes - More subscripts +2910 12D3 CD 10 0A CALL CHKSYN ; Make sure ")" follows +2911 12D6 29 .BYTE ")" +2912 12D7 22 80 31 LD (NXTOPR),HL ; Save code string address +2913 12DA E1 POP HL ; Get LCRFLG and TYPE +2914 12DB 22 5C 31 LD (LCRFLG),HL ; Restore Locate/create & type +2915 12DE 1E 00 LD E,0 ; Flag not CSAVE* or CLOAD* +2916 12E0 D5 PUSH DE ; Save number of dimensions (D) +2917 12E1 11 .BYTE 11H ; Skip "PUSH HL" and "PUSH AF' +2918 12E2 +2919 12E2 E5 ARLDSV: PUSH HL ; Save code string address +2920 12E3 F5 PUSH AF ; A = 00 , Flags set = Z,N +2921 12E4 2A 88 31 LD HL,(VAREND) ; Start of arrays +2922 12E7 3E .BYTE 3EH ; Skip "ADD HL,DE" +2923 12E8 19 FNDARY: ADD HL,DE ; Move to next array start +2924 12E9 EB EX DE,HL +2925 12EA 2A 8A 31 LD HL,(ARREND) ; End of arrays +2926 12ED EB EX DE,HL ; Current array pointer +2927 12EE CD 0A 0A CALL CPDEHL ; End of arrays found? +2928 12F1 CA 1A 13 JP Z,CREARY ; Yes - Create array +2929 12F4 7E LD A,(HL) ; Get second byte of name +2930 12F5 B9 CP C ; Compare with name given +2931 12F6 23 INC HL ; Move on +2932 12F7 C2 FC 12 JP NZ,NXTARY ; Different - Find next array +2933 12FA 7E LD A,(HL) ; Get first byte of name +2934 12FB B8 CP B ; Compare with name given +2935 12FC 23 NXTARY: INC HL ; Move on +2936 12FD 5E LD E,(HL) ; Get LSB of next array address +2937 12FE 23 INC HL +2938 12FF 56 LD D,(HL) ; Get MSB of next array address +2939 1300 23 INC HL +2940 1301 C2 E8 12 JP NZ,FNDARY ; Not found - Keep looking +2941 1304 3A 5C 31 LD A,(LCRFLG) ; Found Locate or Create it? +2942 1307 B7 OR A +2943 1308 C2 4B 07 JP NZ,DDERR ; Create - ?DD Error +2944 130B F1 POP AF ; Locate - Get number of dim'ns +2945 130C 44 LD B,H ; BC Points to array dim'ns +2946 130D 4D LD C,L +2947 130E CA 2A 19 JP Z,POPHRT ; Jump if array load/save +2948 1311 96 SUB (HL) ; Same number of dimensions? +2949 1312 CA 78 13 JP Z,FINDEL ; Yes - Find element +2950 1315 1E 10 BSERR: LD E,BS ; ?BS Error +2951 1317 C3 56 07 JP ERROR ; Output error +2952 131A +2953 131A 11 04 00 CREARY: LD DE,4 ; 4 Bytes per entry +2954 131D F1 POP AF ; Array to save or 0 dim'ns? +2955 131E CA 61 0C JP Z,FCERR ; Yes - ?FC Error +2956 1321 71 LD (HL),C ; Save second byte of name +2957 1322 23 INC HL +2958 1323 70 LD (HL),B ; Save first byte of name +2959 1324 23 INC HL +2960 1325 4F LD C,A ; Number of dimensions to C +2961 1326 CD 1F 07 CALL CHKSTK ; Check if enough memory +2962 1329 23 INC HL ; Point to number of dimensions +2963 132A 23 INC HL +2964 132B 22 75 31 LD (CUROPR),HL ; Save address of pointer +2965 132E 71 LD (HL),C ; Set number of dimensions +2966 132F 23 INC HL +2967 1330 3A 5C 31 LD A,(LCRFLG) ; Locate of Create? +2968 1333 17 RLA ; Carry set = Create +2969 1334 79 LD A,C ; Get number of dimensions +2970 1335 01 0B 00 CRARLP: LD BC,10+1 ; Default dimension size 10 +2971 1338 D2 3D 13 JP NC,DEFSIZ ; Locate - Set default size +2972 133B C1 POP BC ; Get specified dimension size +2973 133C 03 INC BC ; Include zero element +2974 133D 71 DEFSIZ: LD (HL),C ; Save LSB of dimension size +2975 133E 23 INC HL +2976 133F 70 LD (HL),B ; Save MSB of dimension size +2977 1340 23 INC HL +2978 1341 F5 PUSH AF ; Save num' of dim'ns an status +2979 1342 E5 PUSH HL ; Save address of dim'n size +2980 1343 CD D5 1A CALL MLDEBC ; Multiply DE by BC to find +2981 1346 EB EX DE,HL ; amount of mem needed (to DE) +2982 1347 E1 POP HL ; Restore address of dimension +2983 1348 F1 POP AF ; Restore number of dimensions +2984 1349 3D DEC A ; Count them +2985 134A C2 35 13 JP NZ,CRARLP ; Do next dimension if more +2986 134D F5 PUSH AF ; Save locate/create flag +2987 134E 42 LD B,D ; MSB of memory needed +2988 134F 4B LD C,E ; LSB of memory needed +2989 1350 EB EX DE,HL +2990 1351 19 ADD HL,DE ; Add bytes to array start +2991 1352 DA 37 07 JP C,OMERR ; Too big - Error +2992 1355 CD 28 07 CALL ENFMEM ; See if enough memory +2993 1358 22 8A 31 LD (ARREND),HL ; Save new end of array +2994 135B +2995 135B 2B ZERARY: DEC HL ; Back through array data +2996 135C 36 00 LD (HL),0 ; Set array element to zero +2997 135E CD 0A 0A CALL CPDEHL ; All elements zeroed? +2998 1361 C2 5B 13 JP NZ,ZERARY ; No - Keep on going +2999 1364 03 INC BC ; Number of bytes + 1 +3000 1365 57 LD D,A ; A=0 +3001 1366 2A 75 31 LD HL,(CUROPR) ; Get address of array +3002 1369 5E LD E,(HL) ; Number of dimensions +3003 136A EB EX DE,HL ; To HL +3004 136B 29 ADD HL,HL ; Two bytes per dimension size +3005 136C 09 ADD HL,BC ; Add number of bytes +3006 136D EB EX DE,HL ; Bytes needed to DE +3007 136E 2B DEC HL +3008 136F 2B DEC HL +3009 1370 73 LD (HL),E ; Save LSB of bytes needed +3010 1371 23 INC HL +3011 1372 72 LD (HL),D ; Save MSB of bytes needed +3012 1373 23 INC HL +3013 1374 F1 POP AF ; Locate / Create? +3014 1375 DA 9C 13 JP C,ENDDIM ; A is 0 , End if create +3015 1378 47 FINDEL: LD B,A ; Find array element +3016 1379 4F LD C,A +3017 137A 7E LD A,(HL) ; Number of dimensions +3018 137B 23 INC HL +3019 137C 16 .BYTE 16H ; Skip "POP HL" +3020 137D E1 FNDELP: POP HL ; Address of next dim' size +3021 137E 5E LD E,(HL) ; Get LSB of dim'n size +3022 137F 23 INC HL +3023 1380 56 LD D,(HL) ; Get MSB of dim'n size +3024 1381 23 INC HL +3025 1382 E3 EX (SP),HL ; Save address - Get index +3026 1383 F5 PUSH AF ; Save number of dim'ns +3027 1384 CD 0A 0A CALL CPDEHL ; Dimension too large? +3028 1387 D2 15 13 JP NC,BSERR ; Yes - ?BS Error +3029 138A E5 PUSH HL ; Save index +3030 138B CD D5 1A CALL MLDEBC ; Multiply previous by size +3031 138E D1 POP DE ; Index supplied to DE +3032 138F 19 ADD HL,DE ; Add index to pointer +3033 1390 F1 POP AF ; Number of dimensions +3034 1391 3D DEC A ; Count them +3035 1392 44 LD B,H ; MSB of pointer +3036 1393 4D LD C,L ; LSB of pointer +3037 1394 C2 7D 13 JP NZ,FNDELP ; More - Keep going +3038 1397 29 ADD HL,HL ; 4 Bytes per element +3039 1398 29 ADD HL,HL +3040 1399 C1 POP BC ; Start of array +3041 139A 09 ADD HL,BC ; Point to element +3042 139B EB EX DE,HL ; Address of element to DE +3043 139C 2A 80 31 ENDDIM: LD HL,(NXTOPR) ; Got code string address +3044 139F C9 RET +3045 13A0 +3046 13A0 2A 8A 31 FRE: LD HL,(ARREND) ; Start of free memory +3047 13A3 EB EX DE,HL ; To DE +3048 13A4 21 00 00 LD HL,0 ; End of free memory +3049 13A7 39 ADD HL,SP ; Current stack value +3050 13A8 3A 5D 31 LD A,(TYPE) ; Dummy argument type +3051 13AB B7 OR A +3052 13AC CA BC 13 JP Z,FRENUM ; Numeric - Free variable space +3053 13AF CD 23 16 CALL GSTRCU ; Current string to pool +3054 13B2 CD 23 15 CALL GARBGE ; Garbage collection +3055 13B5 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use +3056 13B8 EB EX DE,HL ; To DE +3057 13B9 2A 73 31 LD HL,(STRBOT) ; Bottom of string space +3058 13BC 7D FRENUM: LD A,L ; Get LSB of end +3059 13BD 93 SUB E ; Subtract LSB of beginning +3060 13BE 4F LD C,A ; Save difference if C +3061 13BF 7C LD A,H ; Get MSB of end +3062 13C0 9A SBC A,D ; Subtract MSB of beginning +3063 13C1 41 ACPASS: LD B,C ; Return integer AC +3064 13C2 50 ABPASS: LD D,B ; Return integer AB +3065 13C3 1E 00 LD E,0 +3066 13C5 21 5D 31 LD HL,TYPE ; Point to type +3067 13C8 73 LD (HL),E ; Set type to numeric +3068 13C9 06 90 LD B,80H+16 ; 16 bit integer +3069 13CB C3 00 1A JP RETINT ; Return the integr +3070 13CE +3071 13CE 3A 5B 31 POS: LD A,(CURPOS) ; Get cursor position +3072 13D1 47 PASSA: LD B,A ; Put A into AB +3073 13D2 AF XOR A ; Zero A +3074 13D3 C3 C2 13 JP ABPASS ; Return integer AB +3075 13D6 +3076 13D6 CD 59 14 DEF: CALL CHEKFN ; Get "FN" and name +3077 13D9 CD 4B 14 CALL IDTEST ; Test for illegal direct +3078 13DC 01 31 0D LD BC,DATA ; To get next statement +3079 13DF C5 PUSH BC ; Save address for RETurn +3080 13E0 D5 PUSH DE ; Save address of function ptr +3081 13E1 CD 10 0A CALL CHKSYN ; Make sure "(" follows +3082 13E4 28 .BYTE "(" +3083 13E5 CD FD 11 CALL GETVAR ; Get argument variable name +3084 13E8 E5 PUSH HL ; Save code string address +3085 13E9 EB EX DE,HL ; Argument address to HL +3086 13EA 2B DEC HL +3087 13EB 56 LD D,(HL) ; Get first byte of arg name +3088 13EC 2B DEC HL +3089 13ED 5E LD E,(HL) ; Get second byte of arg name +3090 13EE E1 POP HL ; Restore code string address +3091 13EF CD 0A 10 CALL TSTNUM ; Make sure numeric argument +3092 13F2 CD 10 0A CALL CHKSYN ; Make sure ")" follows +3093 13F5 29 .BYTE ")" +3094 13F6 CD 10 0A CALL CHKSYN ; Make sure "=" follows +3095 13F9 B4 .BYTE ZEQUAL ; "=" token +3096 13FA 44 LD B,H ; Code string address to BC +3097 13FB 4D LD C,L +3098 13FC E3 EX (SP),HL ; Save code str , Get FN ptr +3099 13FD 71 LD (HL),C ; Save LSB of FN code string +3100 13FE 23 INC HL +3101 13FF 70 LD (HL),B ; Save MSB of FN code string +3102 1400 C3 98 14 JP SVSTAD ; Save address and do function +3103 1403 +3104 1403 CD 59 14 DOFN: CALL CHEKFN ; Make sure FN follows +3105 1406 D5 PUSH DE ; Save function pointer address +3106 1407 CD DE 10 CALL EVLPAR ; Evaluate expression in "()" +3107 140A CD 0A 10 CALL TSTNUM ; Make sure numeric result +3108 140D E3 EX (SP),HL ; Save code str , Get FN ptr +3109 140E 5E LD E,(HL) ; Get LSB of FN code string +3110 140F 23 INC HL +3111 1410 56 LD D,(HL) ; Get MSB of FN code string +3112 1411 23 INC HL +3113 1412 7A LD A,D ; And function DEFined? +3114 1413 B3 OR E +3115 1414 CA 4E 07 JP Z,UFERR ; No - ?UF Error +3116 1417 7E LD A,(HL) ; Get LSB of argument address +3117 1418 23 INC HL +3118 1419 66 LD H,(HL) ; Get MSB of argument address +3119 141A 6F LD L,A ; HL = Arg variable address +3120 141B E5 PUSH HL ; Save it +3121 141C 2A 8E 31 LD HL,(FNRGNM) ; Get old argument name +3122 141F E3 EX (SP),HL ; ; Save old , Get new +3123 1420 22 8E 31 LD (FNRGNM),HL ; Set new argument name +3124 1423 2A 92 31 LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value +3125 1426 E5 PUSH HL ; Save it +3126 1427 2A 90 31 LD HL,(FNARG) ; Get MSB,EXP of old arg value +3127 142A E5 PUSH HL ; Save it +3128 142B 21 90 31 LD HL,FNARG ; HL = Value of argument +3129 142E D5 PUSH DE ; Save FN code string address +3130 142F CD 41 1A CALL FPTHL ; Move FPREG to argument +3131 1432 E1 POP HL ; Get FN code string address +3132 1433 CD 07 10 CALL GETNUM ; Get value from function +3133 1436 2B DEC HL ; DEC 'cos GETCHR INCs +3134 1437 CD 9A 0B CALL GETCHR ; Get next character +3135 143A C2 42 07 JP NZ,SNERR ; Bad character in FN - Error +3136 143D E1 POP HL ; Get MSB,EXP of old arg +3137 143E 22 90 31 LD (FNARG),HL ; Restore it +3138 1441 E1 POP HL ; Get LSB,NLSB of old arg +3139 1442 22 92 31 LD (FNARG+2),HL ; Restore it +3140 1445 E1 POP HL ; Get name of old arg +3141 1446 22 8E 31 LD (FNRGNM),HL ; Restore it +3142 1449 E1 POP HL ; Restore code string address +3143 144A C9 RET +3144 144B +3145 144B E5 IDTEST: PUSH HL ; Save code string address +3146 144C 2A 0C 31 LD HL,(LINEAT) ; Get current line number +3147 144F 23 INC HL ; -1 means direct statement +3148 1450 7C LD A,H +3149 1451 B5 OR L +3150 1452 E1 POP HL ; Restore code string address +3151 1453 C0 RET NZ ; Return if in program +3152 1454 1E 16 LD E,ID ; ?ID Error +3153 1456 C3 56 07 JP ERROR +3154 1459 +3155 1459 CD 10 0A CHEKFN: CALL CHKSYN ; Make sure FN follows +3156 145C A7 .BYTE ZFN ; "FN" token +3157 145D 3E 80 LD A,80H +3158 145F 32 7B 31 LD (FORFLG),A ; Flag FN name to find +3159 1462 B6 OR (HL) ; FN name has bit 7 set +3160 1463 47 LD B,A ; in first byte of name +3161 1464 CD 02 12 CALL GTFNAM ; Get FN name +3162 1467 C3 0A 10 JP TSTNUM ; Make sure numeric function +3163 146A +3164 146A CD 0A 10 STR: CALL TSTNUM ; Make sure it's a number +3165 146D CD 8E 1B CALL NUMASC ; Turn number into text +3166 1470 CD 9E 14 STR1: CALL CRTST ; Create string entry for it +3167 1473 CD 23 16 CALL GSTRCU ; Current string to pool +3168 1476 01 7E 16 LD BC,TOPOOL ; Save in string pool +3169 1479 C5 PUSH BC ; Save address on stack +3170 147A +3171 147A 7E SAVSTR: LD A,(HL) ; Get string length +3172 147B 23 INC HL +3173 147C 23 INC HL +3174 147D E5 PUSH HL ; Save pointer to string +3175 147E CD F9 14 CALL TESTR ; See if enough string space +3176 1481 E1 POP HL ; Restore pointer to string +3177 1482 4E LD C,(HL) ; Get LSB of address +3178 1483 23 INC HL +3179 1484 46 LD B,(HL) ; Get MSB of address +3180 1485 CD 92 14 CALL CRTMST ; Create string entry +3181 1488 E5 PUSH HL ; Save pointer to MSB of addr +3182 1489 6F LD L,A ; Length of string +3183 148A CD 16 16 CALL TOSTRA ; Move to string area +3184 148D D1 POP DE ; Restore pointer to MSB +3185 148E C9 RET +3186 148F +3187 148F CD F9 14 MKTMST: CALL TESTR ; See if enough string space +3188 1492 21 6F 31 CRTMST: LD HL,TMPSTR ; Temporary string +3189 1495 E5 PUSH HL ; Save it +3190 1496 77 LD (HL),A ; Save length of string +3191 1497 23 INC HL +3192 1498 23 SVSTAD: INC HL +3193 1499 73 LD (HL),E ; Save LSB of address +3194 149A 23 INC HL +3195 149B 72 LD (HL),D ; Save MSB of address +3196 149C E1 POP HL ; Restore pointer +3197 149D C9 RET +3198 149E +3199 149E 2B CRTST: DEC HL ; DEC - INCed after +3200 149F 06 22 QTSTR: LD B,'"' ; Terminating quote +3201 14A1 50 LD D,B ; Quote to D +3202 14A2 E5 DTSTR: PUSH HL ; Save start +3203 14A3 0E FF LD C,-1 ; Set counter to -1 +3204 14A5 23 QTSTLP: INC HL ; Move on +3205 14A6 7E LD A,(HL) ; Get byte +3206 14A7 0C INC C ; Count bytes +3207 14A8 B7 OR A ; End of line? +3208 14A9 CA B4 14 JP Z,CRTSTE ; Yes - Create string entry +3209 14AC BA CP D ; Terminator D found? +3210 14AD CA B4 14 JP Z,CRTSTE ; Yes - Create string entry +3211 14B0 B8 CP B ; Terminator B found? +3212 14B1 C2 A5 14 JP NZ,QTSTLP ; No - Keep looking +3213 14B4 FE 22 CRTSTE: CP '"' ; End with '"'? +3214 14B6 CC 9A 0B CALL Z,GETCHR ; Yes - Get next character +3215 14B9 E3 EX (SP),HL ; Starting quote +3216 14BA 23 INC HL ; First byte of string +3217 14BB EB EX DE,HL ; To DE +3218 14BC 79 LD A,C ; Get length +3219 14BD CD 92 14 CALL CRTMST ; Create string entry +3220 14C0 11 6F 31 TSTOPL: LD DE,TMPSTR ; Temporary string +3221 14C3 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer +3222 14C6 22 94 31 LD (FPREG),HL ; Save address of string ptr +3223 14C9 3E 01 LD A,1 +3224 14CB 32 5D 31 LD (TYPE),A ; Set type to string +3225 14CE CD 44 1A CALL DETHL4 ; Move string to pool +3226 14D1 CD 0A 0A CALL CPDEHL ; Out of string pool? +3227 14D4 22 61 31 LD (TMSTPT),HL ; Save new pointer +3228 14D7 E1 POP HL ; Restore code string address +3229 14D8 7E LD A,(HL) ; Get next code byte +3230 14D9 C0 RET NZ ; Return if pool OK +3231 14DA 1E 1E LD E,ST ; ?ST Error +3232 14DC C3 56 07 JP ERROR ; String pool overflow +3233 14DF +3234 14DF 23 PRNUMS: INC HL ; Skip leading space +3235 14E0 CD 9E 14 PRS: CALL CRTST ; Create string entry for it +3236 14E3 CD 23 16 PRS1: CALL GSTRCU ; Current string to pool +3237 14E6 CD 38 1A CALL LOADFP ; Move string block to BCDE +3238 14E9 1C INC E ; Length + 1 +3239 14EA 1D PRSLP: DEC E ; Count characters +3240 14EB C8 RET Z ; End of string +3241 14EC 0A LD A,(BC) ; Get byte to output +3242 14ED CD 1B 0A CALL OUTC ; Output character in A +3243 14F0 FE 0D CP CR ; Return? +3244 14F2 CC 4C 0E CALL Z,DONULL ; Yes - Do nulls +3245 14F5 03 INC BC ; Next byte in string +3246 14F6 C3 EA 14 JP PRSLP ; More characters to output +3247 14F9 +3248 14F9 B7 TESTR: OR A ; Test if enough room +3249 14FA 0E .BYTE 0EH ; No garbage collection done +3250 14FB F1 GRBDON: POP AF ; Garbage collection done +3251 14FC F5 PUSH AF ; Save status +3252 14FD 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use +3253 1500 EB EX DE,HL ; To DE +3254 1501 2A 73 31 LD HL,(STRBOT) ; Bottom of string area +3255 1504 2F CPL ; Negate length (Top down) +3256 1505 4F LD C,A ; -Length to BC +3257 1506 06 FF LD B,-1 ; BC = -ve length of string +3258 1508 09 ADD HL,BC ; Add to bottom of space in use +3259 1509 23 INC HL ; Plus one for 2's complement +3260 150A CD 0A 0A CALL CPDEHL ; Below string RAM area? +3261 150D DA 17 15 JP C,TESTOS ; Tidy up if not done else err +3262 1510 22 73 31 LD (STRBOT),HL ; Save new bottom of area +3263 1513 23 INC HL ; Point to first byte of string +3264 1514 EB EX DE,HL ; Address to DE +3265 1515 F1 POPAF: POP AF ; Throw away status push +3266 1516 C9 RET +3267 1517 +3268 1517 F1 TESTOS: POP AF ; Garbage collect been done? +3269 1518 1E 1A LD E,OS ; ?OS Error +3270 151A CA 56 07 JP Z,ERROR ; Yes - Not enough string apace +3271 151D BF CP A ; Flag garbage collect done +3272 151E F5 PUSH AF ; Save status +3273 151F 01 FB 14 LD BC,GRBDON ; Garbage collection done +3274 1522 C5 PUSH BC ; Save for RETurn +3275 1523 2A 5F 31 GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer +3276 1526 22 73 31 GARBLP: LD (STRBOT),HL ; Reset string pointer +3277 1529 21 00 00 LD HL,0 +3278 152C E5 PUSH HL ; Flag no string found +3279 152D 2A 0A 31 LD HL,(STRSPC) ; Get bottom of string space +3280 1530 E5 PUSH HL ; Save bottom of string space +3281 1531 21 63 31 LD HL,TMSTPL ; Temporary string pool +3282 1534 EB GRBLP: EX DE,HL +3283 1535 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer +3284 1538 EB EX DE,HL +3285 1539 CD 0A 0A CALL CPDEHL ; Temporary string pool done? +3286 153C 01 34 15 LD BC,GRBLP ; Loop until string pool done +3287 153F C2 88 15 JP NZ,STPOOL ; No - See if in string area +3288 1542 2A 86 31 LD HL,(PROGND) ; Start of simple variables +3289 1545 EB SMPVAR: EX DE,HL +3290 1546 2A 88 31 LD HL,(VAREND) ; End of simple variables +3291 1549 EB EX DE,HL +3292 154A CD 0A 0A CALL CPDEHL ; All simple strings done? +3293 154D CA 5B 15 JP Z,ARRLP ; Yes - Do string arrays +3294 1550 7E LD A,(HL) ; Get type of variable +3295 1551 23 INC HL +3296 1552 23 INC HL +3297 1553 B7 OR A ; "S" flag set if string +3298 1554 CD 8B 15 CALL STRADD ; See if string in string area +3299 1557 C3 45 15 JP SMPVAR ; Loop until simple ones done +3300 155A +3301 155A C1 GNXARY: POP BC ; Scrap address of this array +3302 155B EB ARRLP: EX DE,HL +3303 155C 2A 8A 31 LD HL,(ARREND) ; End of string arrays +3304 155F EB EX DE,HL +3305 1560 CD 0A 0A CALL CPDEHL ; All string arrays done? +3306 1563 CA B1 15 JP Z,SCNEND ; Yes - Move string if found +3307 1566 CD 38 1A CALL LOADFP ; Get array name to BCDE +3308 1569 7B LD A,E ; Get type of array +3309 156A E5 PUSH HL ; Save address of num of dim'ns +3310 156B 09 ADD HL,BC ; Start of next array +3311 156C B7 OR A ; Test type of array +3312 156D F2 5A 15 JP P,GNXARY ; Numeric array - Ignore it +3313 1570 22 75 31 LD (CUROPR),HL ; Save address of next array +3314 1573 E1 POP HL ; Get address of num of dim'ns +3315 1574 4E LD C,(HL) ; BC = Number of dimensions +3316 1575 06 00 LD B,0 +3317 1577 09 ADD HL,BC ; Two bytes per dimension size +3318 1578 09 ADD HL,BC +3319 1579 23 INC HL ; Plus one for number of dim'ns +3320 157A EB GRBARY: EX DE,HL +3321 157B 2A 75 31 LD HL,(CUROPR) ; Get address of next array +3322 157E EB EX DE,HL +3323 157F CD 0A 0A CALL CPDEHL ; Is this array finished? +3324 1582 CA 5B 15 JP Z,ARRLP ; Yes - Get next one +3325 1585 01 7A 15 LD BC,GRBARY ; Loop until array all done +3326 1588 C5 STPOOL: PUSH BC ; Save return address +3327 1589 F6 80 OR 80H ; Flag string type +3328 158B 7E STRADD: LD A,(HL) ; Get string length +3329 158C 23 INC HL +3330 158D 23 INC HL +3331 158E 5E LD E,(HL) ; Get LSB of string address +3332 158F 23 INC HL +3333 1590 56 LD D,(HL) ; Get MSB of string address +3334 1591 23 INC HL +3335 1592 F0 RET P ; Not a string - Return +3336 1593 B7 OR A ; Set flags on string length +3337 1594 C8 RET Z ; Null string - Return +3338 1595 44 LD B,H ; Save variable pointer +3339 1596 4D LD C,L +3340 1597 2A 73 31 LD HL,(STRBOT) ; Bottom of new area +3341 159A CD 0A 0A CALL CPDEHL ; String been done? +3342 159D 60 LD H,B ; Restore variable pointer +3343 159E 69 LD L,C +3344 159F D8 RET C ; String done - Ignore +3345 15A0 E1 POP HL ; Return address +3346 15A1 E3 EX (SP),HL ; Lowest available string area +3347 15A2 CD 0A 0A CALL CPDEHL ; String within string area? +3348 15A5 E3 EX (SP),HL ; Lowest available string area +3349 15A6 E5 PUSH HL ; Re-save return address +3350 15A7 60 LD H,B ; Restore variable pointer +3351 15A8 69 LD L,C +3352 15A9 D0 RET NC ; Outside string area - Ignore +3353 15AA C1 POP BC ; Get return , Throw 2 away +3354 15AB F1 POP AF ; +3355 15AC F1 POP AF ; +3356 15AD E5 PUSH HL ; Save variable pointer +3357 15AE D5 PUSH DE ; Save address of current +3358 15AF C5 PUSH BC ; Put back return address +3359 15B0 C9 RET ; Go to it +3360 15B1 +3361 15B1 D1 SCNEND: POP DE ; Addresses of strings +3362 15B2 E1 POP HL ; +3363 15B3 7D LD A,L ; HL = 0 if no more to do +3364 15B4 B4 OR H +3365 15B5 C8 RET Z ; No more to do - Return +3366 15B6 2B DEC HL +3367 15B7 46 LD B,(HL) ; MSB of address of string +3368 15B8 2B DEC HL +3369 15B9 4E LD C,(HL) ; LSB of address of string +3370 15BA E5 PUSH HL ; Save variable address +3371 15BB 2B DEC HL +3372 15BC 2B DEC HL +3373 15BD 6E LD L,(HL) ; HL = Length of string +3374 15BE 26 00 LD H,0 +3375 15C0 09 ADD HL,BC ; Address of end of string+1 +3376 15C1 50 LD D,B ; String address to DE +3377 15C2 59 LD E,C +3378 15C3 2B DEC HL ; Last byte in string +3379 15C4 44 LD B,H ; Address to BC +3380 15C5 4D LD C,L +3381 15C6 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area +3382 15C9 CD 11 07 CALL MOVSTR ; Move string to new address +3383 15CC E1 POP HL ; Restore variable address +3384 15CD 71 LD (HL),C ; Save new LSB of address +3385 15CE 23 INC HL +3386 15CF 70 LD (HL),B ; Save new MSB of address +3387 15D0 69 LD L,C ; Next string area+1 to HL +3388 15D1 60 LD H,B +3389 15D2 2B DEC HL ; Next string area address +3390 15D3 C3 26 15 JP GARBLP ; Look for more strings +3391 15D6 +3392 15D6 C5 CONCAT: PUSH BC ; Save prec' opr & code string +3393 15D7 E5 PUSH HL ; +3394 15D8 2A 94 31 LD HL,(FPREG) ; Get first string +3395 15DB E3 EX (SP),HL ; Save first string +3396 15DC CD 90 10 CALL OPRND ; Get second string +3397 15DF E3 EX (SP),HL ; Restore first string +3398 15E0 CD 0B 10 CALL TSTSTR ; Make sure it's a string +3399 15E3 7E LD A,(HL) ; Get length of second string +3400 15E4 E5 PUSH HL ; Save first string +3401 15E5 2A 94 31 LD HL,(FPREG) ; Get second string +3402 15E8 E5 PUSH HL ; Save second string +3403 15E9 86 ADD A,(HL) ; Add length of second string +3404 15EA 1E 1C LD E,LS ; ?LS Error +3405 15EC DA 56 07 JP C,ERROR ; String too long - Error +3406 15EF CD 8F 14 CALL MKTMST ; Make temporary string +3407 15F2 D1 POP DE ; Get second string to DE +3408 15F3 CD 27 16 CALL GSTRDE ; Move to string pool if needed +3409 15F6 E3 EX (SP),HL ; Get first string +3410 15F7 CD 26 16 CALL GSTRHL ; Move to string pool if needed +3411 15FA E5 PUSH HL ; Save first string +3412 15FB 2A 71 31 LD HL,(TMPSTR+2) ; Temporary string address +3413 15FE EB EX DE,HL ; To DE +3414 15FF CD 0D 16 CALL SSTSA ; First string to string area +3415 1602 CD 0D 16 CALL SSTSA ; Second string to string area +3416 1605 21 25 10 LD HL,EVAL2 ; Return to evaluation loop +3417 1608 E3 EX (SP),HL ; Save return,get code string +3418 1609 E5 PUSH HL ; Save code string address +3419 160A C3 C0 14 JP TSTOPL ; To temporary string to pool +3420 160D +3421 160D E1 SSTSA: POP HL ; Return address +3422 160E E3 EX (SP),HL ; Get string block,save return +3423 160F 7E LD A,(HL) ; Get length of string +3424 1610 23 INC HL +3425 1611 23 INC HL +3426 1612 4E LD C,(HL) ; Get LSB of string address +3427 1613 23 INC HL +3428 1614 46 LD B,(HL) ; Get MSB of string address +3429 1615 6F LD L,A ; Length to L +3430 1616 2C TOSTRA: INC L ; INC - DECed after +3431 1617 2D TSALP: DEC L ; Count bytes moved +3432 1618 C8 RET Z ; End of string - Return +3433 1619 0A LD A,(BC) ; Get source +3434 161A 12 LD (DE),A ; Save destination +3435 161B 03 INC BC ; Next source +3436 161C 13 INC DE ; Next destination +3437 161D C3 17 16 JP TSALP ; Loop until string moved +3438 1620 +3439 1620 CD 0B 10 GETSTR: CALL TSTSTR ; Make sure it's a string +3440 1623 2A 94 31 GSTRCU: LD HL,(FPREG) ; Get current string +3441 1626 EB GSTRHL: EX DE,HL ; Save DE +3442 1627 CD 41 16 GSTRDE: CALL BAKTMP ; Was it last tmp-str? +3443 162A EB EX DE,HL ; Restore DE +3444 162B C0 RET NZ ; No - Return +3445 162C D5 PUSH DE ; Save string +3446 162D 50 LD D,B ; String block address to DE +3447 162E 59 LD E,C +3448 162F 1B DEC DE ; Point to length +3449 1630 4E LD C,(HL) ; Get string length +3450 1631 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area +3451 1634 CD 0A 0A CALL CPDEHL ; Last one in string area? +3452 1637 C2 3F 16 JP NZ,POPHL ; No - Return +3453 163A 47 LD B,A ; Clear B (A=0) +3454 163B 09 ADD HL,BC ; Remove string from str' area +3455 163C 22 73 31 LD (STRBOT),HL ; Save new bottom of str' area +3456 163F E1 POPHL: POP HL ; Restore string +3457 1640 C9 RET +3458 1641 +3459 1641 2A 61 31 BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top +3460 1644 2B DEC HL ; Back +3461 1645 46 LD B,(HL) ; Get MSB of address +3462 1646 2B DEC HL ; Back +3463 1647 4E LD C,(HL) ; Get LSB of address +3464 1648 2B DEC HL ; Back +3465 1649 2B DEC HL ; Back +3466 164A CD 0A 0A CALL CPDEHL ; String last in string pool? +3467 164D C0 RET NZ ; Yes - Leave it +3468 164E 22 61 31 LD (TMSTPT),HL ; Save new string pool top +3469 1651 C9 RET +3470 1652 +3471 1652 01 D1 13 LEN: LD BC,PASSA ; To return integer A +3472 1655 C5 PUSH BC ; Save address +3473 1656 CD 20 16 GETLEN: CALL GETSTR ; Get string and its length +3474 1659 AF XOR A +3475 165A 57 LD D,A ; Clear D +3476 165B 32 5D 31 LD (TYPE),A ; Set type to numeric +3477 165E 7E LD A,(HL) ; Get length of string +3478 165F B7 OR A ; Set status flags +3479 1660 C9 RET +3480 1661 +3481 1661 01 D1 13 ASC: LD BC,PASSA ; To return integer A +3482 1664 C5 PUSH BC ; Save address +3483 1665 CD 56 16 GTFLNM: CALL GETLEN ; Get length of string +3484 1668 CA 61 0C JP Z,FCERR ; Null string - Error +3485 166B 23 INC HL +3486 166C 23 INC HL +3487 166D 5E LD E,(HL) ; Get LSB of address +3488 166E 23 INC HL +3489 166F 56 LD D,(HL) ; Get MSB of address +3490 1670 1A LD A,(DE) ; Get first byte of string +3491 1671 C9 RET +3492 1672 +3493 1672 3E 01 CHR: LD A,1 ; One character string +3494 1674 CD 8F 14 CALL MKTMST ; Make a temporary string +3495 1677 CD 6B 17 CALL MAKINT ; Make it integer A +3496 167A 2A 71 31 LD HL,(TMPSTR+2) ; Get address of string +3497 167D 73 LD (HL),E ; Save character +3498 167E C1 TOPOOL: POP BC ; Clean up stack +3499 167F C3 C0 14 JP TSTOPL ; Temporary string to pool +3500 1682 +3501 1682 CD 1B 17 LEFT: CALL LFRGNM ; Get number and ending ")" +3502 1685 AF XOR A ; Start at first byte in string +3503 1686 E3 RIGHT1: EX (SP),HL ; Save code string,Get string +3504 1687 4F LD C,A ; Starting position in string +3505 1688 E5 MID1: PUSH HL ; Save string block address +3506 1689 7E LD A,(HL) ; Get length of string +3507 168A B8 CP B ; Compare with number given +3508 168B DA 90 16 JP C,ALLFOL ; All following bytes required +3509 168E 78 LD A,B ; Get new length +3510 168F 11 .BYTE 11H ; Skip "LD C,0" +3511 1690 0E 00 ALLFOL: LD C,0 ; First byte of string +3512 1692 C5 PUSH BC ; Save position in string +3513 1693 CD F9 14 CALL TESTR ; See if enough string space +3514 1696 C1 POP BC ; Get position in string +3515 1697 E1 POP HL ; Restore string block address +3516 1698 E5 PUSH HL ; And re-save it +3517 1699 23 INC HL +3518 169A 23 INC HL +3519 169B 46 LD B,(HL) ; Get LSB of address +3520 169C 23 INC HL +3521 169D 66 LD H,(HL) ; Get MSB of address +3522 169E 68 LD L,B ; HL = address of string +3523 169F 06 00 LD B,0 ; BC = starting address +3524 16A1 09 ADD HL,BC ; Point to that byte +3525 16A2 44 LD B,H ; BC = source string +3526 16A3 4D LD C,L +3527 16A4 CD 92 14 CALL CRTMST ; Create a string entry +3528 16A7 6F LD L,A ; Length of new string +3529 16A8 CD 16 16 CALL TOSTRA ; Move string to string area +3530 16AB D1 POP DE ; Clear stack +3531 16AC CD 27 16 CALL GSTRDE ; Move to string pool if needed +3532 16AF C3 C0 14 JP TSTOPL ; Temporary string to pool +3533 16B2 +3534 16B2 CD 1B 17 RIGHT: CALL LFRGNM ; Get number and ending ")" +3535 16B5 D1 POP DE ; Get string length +3536 16B6 D5 PUSH DE ; And re-save +3537 16B7 1A LD A,(DE) ; Get length +3538 16B8 90 SUB B ; Move back N bytes +3539 16B9 C3 86 16 JP RIGHT1 ; Go and get sub-string +3540 16BC +3541 16BC EB MID: EX DE,HL ; Get code string address +3542 16BD 7E LD A,(HL) ; Get next byte ',' or ")" +3543 16BE CD 20 17 CALL MIDNUM ; Get number supplied +3544 16C1 04 INC B ; Is it character zero? +3545 16C2 05 DEC B +3546 16C3 CA 61 0C JP Z,FCERR ; Yes - Error +3547 16C6 C5 PUSH BC ; Save starting position +3548 16C7 1E FF LD E,255 ; All of string +3549 16C9 FE 29 CP ')' ; Any length given? +3550 16CB CA D5 16 JP Z,RSTSTR ; No - Rest of string +3551 16CE CD 10 0A CALL CHKSYN ; Make sure ',' follows +3552 16D1 2C .BYTE ',' +3553 16D2 CD 68 17 CALL GETINT ; Get integer 0-255 +3554 16D5 CD 10 0A RSTSTR: CALL CHKSYN ; Make sure ")" follows +3555 16D8 29 .BYTE ")" +3556 16D9 F1 POP AF ; Restore starting position +3557 16DA E3 EX (SP),HL ; Get string,8ave code string +3558 16DB 01 88 16 LD BC,MID1 ; Continuation of MID$ routine +3559 16DE C5 PUSH BC ; Save for return +3560 16DF 3D DEC A ; Starting position-1 +3561 16E0 BE CP (HL) ; Compare with length +3562 16E1 06 00 LD B,0 ; Zero bytes length +3563 16E3 D0 RET NC ; Null string if start past end +3564 16E4 4F LD C,A ; Save starting position-1 +3565 16E5 7E LD A,(HL) ; Get length of string +3566 16E6 91 SUB C ; Subtract start +3567 16E7 BB CP E ; Enough string for it? +3568 16E8 47 LD B,A ; Save maximum length available +3569 16E9 D8 RET C ; Truncate string if needed +3570 16EA 43 LD B,E ; Set specified length +3571 16EB C9 RET ; Go and create string +3572 16EC +3573 16EC CD 56 16 VAL: CALL GETLEN ; Get length of string +3574 16EF CA 09 18 JP Z,RESZER ; Result zero +3575 16F2 5F LD E,A ; Save length +3576 16F3 23 INC HL +3577 16F4 23 INC HL +3578 16F5 7E LD A,(HL) ; Get LSB of address +3579 16F6 23 INC HL +3580 16F7 66 LD H,(HL) ; Get MSB of address +3581 16F8 6F LD L,A ; HL = String address +3582 16F9 E5 PUSH HL ; Save string address +3583 16FA 19 ADD HL,DE +3584 16FB 46 LD B,(HL) ; Get end of string+1 byte +3585 16FC 72 LD (HL),D ; Zero it to terminate +3586 16FD E3 EX (SP),HL ; Save string end,get start +3587 16FE C5 PUSH BC ; Save end+1 byte +3588 16FF 7E LD A,(HL) ; Get starting byte +3589 1700 FE 24 CP '$' ; Hex number indicated? [function added] +3590 1702 C2 0A 17 JP NZ,VAL1 +3591 1705 CD 34 1F CALL HEXTFP ; Convert Hex to FPREG +3592 1708 18 0D JR VAL3 +3593 170A FE 25 VAL1: CP '%' ; Binary number indicated? [function added] +3594 170C C2 14 17 JP NZ,VAL2 +3595 170F CD A4 1F CALL BINTFP ; Convert Bin to FPREG +3596 1712 18 03 JR VAL3 +3597 1714 CD F0 1A VAL2: CALL ASCTFP ; Convert ASCII string to FP +3598 1717 C1 VAL3: POP BC ; Restore end+1 byte +3599 1718 E1 POP HL ; Restore end+1 address +3600 1719 70 LD (HL),B ; Put back original byte +3601 171A C9 RET +3602 171B +3603 171B EB LFRGNM: EX DE,HL ; Code string address to HL +3604 171C CD 10 0A CALL CHKSYN ; Make sure ")" follows +3605 171F 29 .BYTE ")" +3606 1720 C1 MIDNUM: POP BC ; Get return address +3607 1721 D1 POP DE ; Get number supplied +3608 1722 C5 PUSH BC ; Re-save return address +3609 1723 43 LD B,E ; Number to B +3610 1724 C9 RET +3611 1725 +3612 1725 CD 6B 17 INP: CALL MAKINT ; Make it integer A +3613 1728 32 EF 30 LD (INPORT),A ; Set input port +3614 172B CD EE 30 CALL INPSUB ; Get input from port +3615 172E C3 D1 13 JP PASSA ; Return integer A +3616 1731 +3617 1731 CD 55 17 POUT: CALL SETIO ; Set up port number +3618 1734 C3 B6 30 JP OUTSUB ; Output data and return +3619 1737 +3620 1737 CD 55 17 WAIT: CALL SETIO ; Set up port number +3621 173A F5 PUSH AF ; Save AND mask +3622 173B 1E 00 LD E,0 ; Assume zero if none given +3623 173D 2B DEC HL ; DEC 'cos GETCHR INCs +3624 173E CD 9A 0B CALL GETCHR ; Get next character +3625 1741 CA 4B 17 JP Z,NOXOR ; No XOR byte given +3626 1744 CD 10 0A CALL CHKSYN ; Make sure ',' follows +3627 1747 2C .BYTE ',' +3628 1748 CD 68 17 CALL GETINT ; Get integer 0-255 to XOR with +3629 174B C1 NOXOR: POP BC ; Restore AND mask +3630 174C CD EE 30 WAITLP: CALL INPSUB ; Get input +3631 174F AB XOR E ; Flip selected bits +3632 1750 A0 AND B ; Result non-zero? +3633 1751 CA 4C 17 JP Z,WAITLP ; No = keep waiting +3634 1754 C9 RET +3635 1755 +3636 1755 CD 68 17 SETIO: CALL GETINT ; Get integer 0-255 +3637 1758 32 EF 30 LD (INPORT),A ; Set input port +3638 175B 32 B7 30 LD (OTPORT),A ; Set output port +3639 175E CD 10 0A CALL CHKSYN ; Make sure ',' follows +3640 1761 2C .BYTE ',' +3641 1762 C3 68 17 JP GETINT ; Get integer 0-255 and return +3642 1765 +3643 1765 CD 9A 0B FNDNUM: CALL GETCHR ; Get next character +3644 1768 CD 07 10 GETINT: CALL GETNUM ; Get a number from 0 to 255 +3645 176B CD 46 0C MAKINT: CALL DEPINT ; Make sure value 0 - 255 +3646 176E 7A LD A,D ; Get MSB of number +3647 176F B7 OR A ; Zero? +3648 1770 C2 61 0C JP NZ,FCERR ; No - Error +3649 1773 2B DEC HL ; DEC 'cos GETCHR INCs +3650 1774 CD 9A 0B CALL GETCHR ; Get next character +3651 1777 7B LD A,E ; Get number to A +3652 1778 C9 RET +3653 1779 +3654 1779 CD 4C 0C PEEK: CALL DEINT ; Get memory address +3655 177C 1A LD A,(DE) ; Get byte in memory +3656 177D C3 D1 13 JP PASSA ; Return integer A +3657 1780 +3658 1780 CD 07 10 POKE: CALL GETNUM ; Get memory address +3659 1783 CD 4C 0C CALL DEINT ; Get integer -32768 to 3276 +3660 1786 D5 PUSH DE ; Save memory address +3661 1787 CD 10 0A CALL CHKSYN ; Make sure ',' follows +3662 178A 2C .BYTE ',' +3663 178B CD 68 17 CALL GETINT ; Get integer 0-255 +3664 178E D1 POP DE ; Restore memory address +3665 178F 12 LD (DE),A ; Load it into memory +3666 1790 C9 RET +3667 1791 +3668 1791 21 67 1C ROUND: LD HL,HALF ; Add 0.5 to FPREG +3669 1794 CD 38 1A ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE +3670 1797 C3 A3 17 JP FPADD ; Add BCDE to FPREG +3671 179A +3672 179A CD 38 1A SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL +3673 179D 21 .BYTE 21H ; Skip "POP BC" and "POP DE" +3674 179E C1 PSUB: POP BC ; Get FP number from stack +3675 179F D1 POP DE +3676 17A0 CD 12 1A SUBCDE: CALL INVSGN ; Negate FPREG +3677 17A3 78 FPADD: LD A,B ; Get FP exponent +3678 17A4 B7 OR A ; Is number zero? +3679 17A5 C8 RET Z ; Yes - Nothing to add +3680 17A6 3A 97 31 LD A,(FPEXP) ; Get FPREG exponent +3681 17A9 B7 OR A ; Is this number zero? +3682 17AA CA 2A 1A JP Z,FPBCDE ; Yes - Move BCDE to FPREG +3683 17AD 90 SUB B ; BCDE number larger? +3684 17AE D2 BD 17 JP NC,NOSWAP ; No - Don't swap them +3685 17B1 2F CPL ; Two's complement +3686 17B2 3C INC A ; FP exponent +3687 17B3 EB EX DE,HL +3688 17B4 CD 1A 1A CALL STAKFP ; Put FPREG on stack +3689 17B7 EB EX DE,HL +3690 17B8 CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG +3691 17BB C1 POP BC ; Restore number from stack +3692 17BC D1 POP DE +3693 17BD FE 19 NOSWAP: CP 24+1 ; Second number insignificant? +3694 17BF D0 RET NC ; Yes - First number is result +3695 17C0 F5 PUSH AF ; Save number of bits to scale +3696 17C1 CD 4F 1A CALL SIGNS ; Set MSBs & sign of result +3697 17C4 67 LD H,A ; Save sign of result +3698 17C5 F1 POP AF ; Restore scaling factor +3699 17C6 CD 68 18 CALL SCALE ; Scale BCDE to same exponent +3700 17C9 B4 OR H ; Result to be positive? +3701 17CA 21 94 31 LD HL,FPREG ; Point to FPREG +3702 17CD F2 E3 17 JP P,MINCDE ; No - Subtract FPREG from CDE +3703 17D0 CD 48 18 CALL PLUCDE ; Add FPREG to CDE +3704 17D3 D2 29 18 JP NC,RONDUP ; No overflow - Round it up +3705 17D6 23 INC HL ; Point to exponent +3706 17D7 34 INC (HL) ; Increment it +3707 17D8 CA 51 07 JP Z,OVERR ; Number overflowed - Error +3708 17DB 2E 01 LD L,1 ; 1 bit to shift right +3709 17DD CD 7E 18 CALL SHRT1 ; Shift result right +3710 17E0 C3 29 18 JP RONDUP ; Round it up +3711 17E3 +3712 17E3 AF MINCDE: XOR A ; Clear A and carry +3713 17E4 90 SUB B ; Negate exponent +3714 17E5 47 LD B,A ; Re-save exponent +3715 17E6 7E LD A,(HL) ; Get LSB of FPREG +3716 17E7 9B SBC A, E ; Subtract LSB of BCDE +3717 17E8 5F LD E,A ; Save LSB of BCDE +3718 17E9 23 INC HL +3719 17EA 7E LD A,(HL) ; Get NMSB of FPREG +3720 17EB 9A SBC A,D ; Subtract NMSB of BCDE +3721 17EC 57 LD D,A ; Save NMSB of BCDE +3722 17ED 23 INC HL +3723 17EE 7E LD A,(HL) ; Get MSB of FPREG +3724 17EF 99 SBC A,C ; Subtract MSB of BCDE +3725 17F0 4F LD C,A ; Save MSB of BCDE +3726 17F1 DC 54 18 CONPOS: CALL C,COMPL ; Overflow - Make it positive +3727 17F4 +3728 17F4 68 BNORM: LD L,B ; L = Exponent +3729 17F5 63 LD H,E ; H = LSB +3730 17F6 AF XOR A +3731 17F7 47 BNRMLP: LD B,A ; Save bit count +3732 17F8 79 LD A,C ; Get MSB +3733 17F9 B7 OR A ; Is it zero? +3734 17FA C2 16 18 JP NZ,PNORM ; No - Do it bit at a time +3735 17FD 4A LD C,D ; MSB = NMSB +3736 17FE 54 LD D,H ; NMSB= LSB +3737 17FF 65 LD H,L ; LSB = VLSB +3738 1800 6F LD L,A ; VLSB= 0 +3739 1801 78 LD A,B ; Get exponent +3740 1802 D6 08 SUB 8 ; Count 8 bits +3741 1804 FE E0 CP -24-8 ; Was number zero? +3742 1806 C2 F7 17 JP NZ,BNRMLP ; No - Keep normalising +3743 1809 AF RESZER: XOR A ; Result is zero +3744 180A 32 97 31 SAVEXP: LD (FPEXP),A ; Save result as zero +3745 180D C9 RET +3746 180E +3747 180E 05 NORMAL: DEC B ; Count bits +3748 180F 29 ADD HL,HL ; Shift HL left +3749 1810 7A LD A,D ; Get NMSB +3750 1811 17 RLA ; Shift left with last bit +3751 1812 57 LD D,A ; Save NMSB +3752 1813 79 LD A,C ; Get MSB +3753 1814 8F ADC A,A ; Shift left with last bit +3754 1815 4F LD C,A ; Save MSB +3755 1816 F2 0E 18 PNORM: JP P,NORMAL ; Not done - Keep going +3756 1819 78 LD A,B ; Number of bits shifted +3757 181A 5C LD E,H ; Save HL in EB +3758 181B 45 LD B,L +3759 181C B7 OR A ; Any shifting done? +3760 181D CA 29 18 JP Z,RONDUP ; No - Round it up +3761 1820 21 97 31 LD HL,FPEXP ; Point to exponent +3762 1823 86 ADD A,(HL) ; Add shifted bits +3763 1824 77 LD (HL),A ; Re-save exponent +3764 1825 D2 09 18 JP NC,RESZER ; Underflow - Result is zero +3765 1828 C8 RET Z ; Result is zero +3766 1829 78 RONDUP: LD A,B ; Get VLSB of number +3767 182A 21 97 31 RONDB: LD HL,FPEXP ; Point to exponent +3768 182D B7 OR A ; Any rounding? +3769 182E FC 3B 18 CALL M,FPROND ; Yes - Round number up +3770 1831 46 LD B,(HL) ; B = Exponent +3771 1832 23 INC HL +3772 1833 7E LD A,(HL) ; Get sign of result +3773 1834 E6 80 AND 10000000B ; Only bit 7 needed +3774 1836 A9 XOR C ; Set correct sign +3775 1837 4F LD C,A ; Save correct sign in number +3776 1838 C3 2A 1A JP FPBCDE ; Move BCDE to FPREG +3777 183B +3778 183B 1C FPROND: INC E ; Round LSB +3779 183C C0 RET NZ ; Return if ok +3780 183D 14 INC D ; Round NMSB +3781 183E C0 RET NZ ; Return if ok +3782 183F 0C INC C ; Round MSB +3783 1840 C0 RET NZ ; Return if ok +3784 1841 0E 80 LD C,80H ; Set normal value +3785 1843 34 INC (HL) ; Increment exponent +3786 1844 C0 RET NZ ; Return if ok +3787 1845 C3 51 07 JP OVERR ; Overflow error +3788 1848 +3789 1848 7E PLUCDE: LD A,(HL) ; Get LSB of FPREG +3790 1849 83 ADD A,E ; Add LSB of BCDE +3791 184A 5F LD E,A ; Save LSB of BCDE +3792 184B 23 INC HL +3793 184C 7E LD A,(HL) ; Get NMSB of FPREG +3794 184D 8A ADC A,D ; Add NMSB of BCDE +3795 184E 57 LD D,A ; Save NMSB of BCDE +3796 184F 23 INC HL +3797 1850 7E LD A,(HL) ; Get MSB of FPREG +3798 1851 89 ADC A,C ; Add MSB of BCDE +3799 1852 4F LD C,A ; Save MSB of BCDE +3800 1853 C9 RET +3801 1854 +3802 1854 21 98 31 COMPL: LD HL,SGNRES ; Sign of result +3803 1857 7E LD A,(HL) ; Get sign of result +3804 1858 2F CPL ; Negate it +3805 1859 77 LD (HL),A ; Put it back +3806 185A AF XOR A +3807 185B 6F LD L,A ; Set L to zero +3808 185C 90 SUB B ; Negate exponent,set carry +3809 185D 47 LD B,A ; Re-save exponent +3810 185E 7D LD A,L ; Load zero +3811 185F 9B SBC A,E ; Negate LSB +3812 1860 5F LD E,A ; Re-save LSB +3813 1861 7D LD A,L ; Load zero +3814 1862 9A SBC A,D ; Negate NMSB +3815 1863 57 LD D,A ; Re-save NMSB +3816 1864 7D LD A,L ; Load zero +3817 1865 99 SBC A,C ; Negate MSB +3818 1866 4F LD C,A ; Re-save MSB +3819 1867 C9 RET +3820 1868 +3821 1868 06 00 SCALE: LD B,0 ; Clear underflow +3822 186A D6 08 SCALLP: SUB 8 ; 8 bits (a whole byte)? +3823 186C DA 77 18 JP C,SHRITE ; No - Shift right A bits +3824 186F 43 LD B,E ; <- Shift +3825 1870 5A LD E,D ; <- right +3826 1871 51 LD D,C ; <- eight +3827 1872 0E 00 LD C,0 ; <- bits +3828 1874 C3 6A 18 JP SCALLP ; More bits to shift +3829 1877 +3830 1877 C6 09 SHRITE: ADD A,8+1 ; Adjust count +3831 1879 6F LD L,A ; Save bits to shift +3832 187A AF SHRLP: XOR A ; Flag for all done +3833 187B 2D DEC L ; All shifting done? +3834 187C C8 RET Z ; Yes - Return +3835 187D 79 LD A,C ; Get MSB +3836 187E 1F SHRT1: RRA ; Shift it right +3837 187F 4F LD C,A ; Re-save +3838 1880 7A LD A,D ; Get NMSB +3839 1881 1F RRA ; Shift right with last bit +3840 1882 57 LD D,A ; Re-save it +3841 1883 7B LD A,E ; Get LSB +3842 1884 1F RRA ; Shift right with last bit +3843 1885 5F LD E,A ; Re-save it +3844 1886 78 LD A,B ; Get underflow +3845 1887 1F RRA ; Shift right with last bit +3846 1888 47 LD B,A ; Re-save underflow +3847 1889 C3 7A 18 JP SHRLP ; More bits to do +3848 188C +3849 188C 00 00 00 81 UNITY: .BYTE 000H,000H,000H,081H ; 1.00000 +3850 1890 +3851 1890 03 LOGTAB: .BYTE 3 ; Table used by LOG +3852 1891 AA 56 19 80 .BYTE 0AAH,056H,019H,080H ; 0.59898 +3853 1895 F1 22 76 80 .BYTE 0F1H,022H,076H,080H ; 0.96147 +3854 1899 45 AA 38 82 .BYTE 045H,0AAH,038H,082H ; 2.88539 +3855 189D +3856 189D CD E9 19 LOG: CALL TSTSGN ; Test sign of value +3857 18A0 B7 OR A +3858 18A1 EA 61 0C JP PE,FCERR ; ?FC Error if <= zero +3859 18A4 21 97 31 LD HL,FPEXP ; Point to exponent +3860 18A7 7E LD A,(HL) ; Get exponent +3861 18A8 01 35 80 LD BC,8035H ; BCDE = SQR(1/2) +3862 18AB 11 F3 04 LD DE,04F3H +3863 18AE 90 SUB B ; Scale value to be < 1 +3864 18AF F5 PUSH AF ; Save scale factor +3865 18B0 70 LD (HL),B ; Save new exponent +3866 18B1 D5 PUSH DE ; Save SQR(1/2) +3867 18B2 C5 PUSH BC +3868 18B3 CD A3 17 CALL FPADD ; Add SQR(1/2) to value +3869 18B6 C1 POP BC ; Restore SQR(1/2) +3870 18B7 D1 POP DE +3871 18B8 04 INC B ; Make it SQR(2) +3872 18B9 CD 3F 19 CALL DVBCDE ; Divide by SQR(2) +3873 18BC 21 8C 18 LD HL,UNITY ; Point to 1. +3874 18BF CD 9A 17 CALL SUBPHL ; Subtract FPREG from 1 +3875 18C2 21 90 18 LD HL,LOGTAB ; Coefficient table +3876 18C5 CD 31 1D CALL SUMSER ; Evaluate sum of series +3877 18C8 01 80 80 LD BC,8080H ; BCDE = -0.5 +3878 18CB 11 00 00 LD DE,0000H +3879 18CE CD A3 17 CALL FPADD ; Subtract 0.5 from FPREG +3880 18D1 F1 POP AF ; Restore scale factor +3881 18D2 CD 64 1B CALL RSCALE ; Re-scale number +3882 18D5 01 31 80 MULLN2: LD BC,8031H ; BCDE = Ln(2) +3883 18D8 11 18 72 LD DE,7218H +3884 18DB 21 .BYTE 21H ; Skip "POP BC" and "POP DE" +3885 18DC +3886 18DC C1 MULT: POP BC ; Get number from stack +3887 18DD D1 POP DE +3888 18DE CD E9 19 FPMULT: CALL TSTSGN ; Test sign of FPREG +3889 18E1 C8 RET Z ; Return zero if zero +3890 18E2 2E 00 LD L,0 ; Flag add exponents +3891 18E4 CD A7 19 CALL ADDEXP ; Add exponents +3892 18E7 79 LD A,C ; Get MSB of multiplier +3893 18E8 32 A6 31 LD (MULVAL),A ; Save MSB of multiplier +3894 18EB EB EX DE,HL +3895 18EC 22 A7 31 LD (MULVAL+1),HL ; Save rest of multiplier +3896 18EF 01 00 00 LD BC,0 ; Partial product (BCDE) = zero +3897 18F2 50 LD D,B +3898 18F3 58 LD E,B +3899 18F4 21 F4 17 LD HL,BNORM ; Address of normalise +3900 18F7 E5 PUSH HL ; Save for return +3901 18F8 21 00 19 LD HL,MULT8 ; Address of 8 bit multiply +3902 18FB E5 PUSH HL ; Save for NMSB,MSB +3903 18FC E5 PUSH HL ; +3904 18FD 21 94 31 LD HL,FPREG ; Point to number +3905 1900 7E MULT8: LD A,(HL) ; Get LSB of number +3906 1901 23 INC HL ; Point to NMSB +3907 1902 B7 OR A ; Test LSB +3908 1903 CA 2C 19 JP Z,BYTSFT ; Zero - shift to next byte +3909 1906 E5 PUSH HL ; Save address of number +3910 1907 2E 08 LD L,8 ; 8 bits to multiply by +3911 1909 1F MUL8LP: RRA ; Shift LSB right +3912 190A 67 LD H,A ; Save LSB +3913 190B 79 LD A,C ; Get MSB +3914 190C D2 1A 19 JP NC,NOMADD ; Bit was zero - Don't add +3915 190F E5 PUSH HL ; Save LSB and count +3916 1910 2A A7 31 LD HL,(MULVAL+1) ; Get LSB and NMSB +3917 1913 19 ADD HL,DE ; Add NMSB and LSB +3918 1914 EB EX DE,HL ; Leave sum in DE +3919 1915 E1 POP HL ; Restore MSB and count +3920 1916 3A A6 31 LD A,(MULVAL) ; Get MSB of multiplier +3921 1919 89 ADC A,C ; Add MSB +3922 191A 1F NOMADD: RRA ; Shift MSB right +3923 191B 4F LD C,A ; Re-save MSB +3924 191C 7A LD A,D ; Get NMSB +3925 191D 1F RRA ; Shift NMSB right +3926 191E 57 LD D,A ; Re-save NMSB +3927 191F 7B LD A,E ; Get LSB +3928 1920 1F RRA ; Shift LSB right +3929 1921 5F LD E,A ; Re-save LSB +3930 1922 78 LD A,B ; Get VLSB +3931 1923 1F RRA ; Shift VLSB right +3932 1924 47 LD B,A ; Re-save VLSB +3933 1925 2D DEC L ; Count bits multiplied +3934 1926 7C LD A,H ; Get LSB of multiplier +3935 1927 C2 09 19 JP NZ,MUL8LP ; More - Do it +3936 192A E1 POPHRT: POP HL ; Restore address of number +3937 192B C9 RET +3938 192C +3939 192C 43 BYTSFT: LD B,E ; Shift partial product left +3940 192D 5A LD E,D +3941 192E 51 LD D,C +3942 192F 4F LD C,A +3943 1930 C9 RET +3944 1931 +3945 1931 CD 1A 1A DIV10: CALL STAKFP ; Save FPREG on stack +3946 1934 01 20 84 LD BC,8420H ; BCDE = 10. +3947 1937 11 00 00 LD DE,0000H +3948 193A CD 2A 1A CALL FPBCDE ; Move 10 to FPREG +3949 193D +3950 193D C1 DIV: POP BC ; Get number from stack +3951 193E D1 POP DE +3952 193F CD E9 19 DVBCDE: CALL TSTSGN ; Test sign of FPREG +3953 1942 CA 45 07 JP Z,DZERR ; Error if division by zero +3954 1945 2E FF LD L,-1 ; Flag subtract exponents +3955 1947 CD A7 19 CALL ADDEXP ; Subtract exponents +3956 194A 34 INC (HL) ; Add 2 to exponent to adjust +3957 194B 34 INC (HL) +3958 194C 2B DEC HL ; Point to MSB +3959 194D 7E LD A,(HL) ; Get MSB of dividend +3960 194E 32 C2 30 LD (DIV3),A ; Save for subtraction +3961 1951 2B DEC HL +3962 1952 7E LD A,(HL) ; Get NMSB of dividend +3963 1953 32 BE 30 LD (DIV2),A ; Save for subtraction +3964 1956 2B DEC HL +3965 1957 7E LD A,(HL) ; Get MSB of dividend +3966 1958 32 BA 30 LD (DIV1),A ; Save for subtraction +3967 195B 41 LD B,C ; Get MSB +3968 195C EB EX DE,HL ; NMSB,LSB to HL +3969 195D AF XOR A +3970 195E 4F LD C,A ; Clear MSB of quotient +3971 195F 57 LD D,A ; Clear NMSB of quotient +3972 1960 5F LD E,A ; Clear LSB of quotient +3973 1961 32 C5 30 LD (DIV4),A ; Clear overflow count +3974 1964 E5 DIVLP: PUSH HL ; Save divisor +3975 1965 C5 PUSH BC +3976 1966 7D LD A,L ; Get LSB of number +3977 1967 CD B9 30 CALL DIVSUP ; Subt' divisor from dividend +3978 196A DE 00 SBC A,0 ; Count for overflows +3979 196C 3F CCF +3980 196D D2 77 19 JP NC,RESDIV ; Restore divisor if borrow +3981 1970 32 C5 30 LD (DIV4),A ; Re-save overflow count +3982 1973 F1 POP AF ; Scrap divisor +3983 1974 F1 POP AF +3984 1975 37 SCF ; Set carry to +3985 1976 D2 .BYTE 0D2H ; Skip "POP BC" and "POP HL" +3986 1977 +3987 1977 C1 RESDIV: POP BC ; Restore divisor +3988 1978 E1 POP HL +3989 1979 79 LD A,C ; Get MSB of quotient +3990 197A 3C INC A +3991 197B 3D DEC A +3992 197C 1F RRA ; Bit 0 to bit 7 +3993 197D FA 2A 18 JP M,RONDB ; Done - Normalise result +3994 1980 17 RLA ; Restore carry +3995 1981 7B LD A,E ; Get LSB of quotient +3996 1982 17 RLA ; Double it +3997 1983 5F LD E,A ; Put it back +3998 1984 7A LD A,D ; Get NMSB of quotient +3999 1985 17 RLA ; Double it +4000 1986 57 LD D,A ; Put it back +4001 1987 79 LD A,C ; Get MSB of quotient +4002 1988 17 RLA ; Double it +4003 1989 4F LD C,A ; Put it back +4004 198A 29 ADD HL,HL ; Double NMSB,LSB of divisor +4005 198B 78 LD A,B ; Get MSB of divisor +4006 198C 17 RLA ; Double it +4007 198D 47 LD B,A ; Put it back +4008 198E 3A C5 30 LD A,(DIV4) ; Get VLSB of quotient +4009 1991 17 RLA ; Double it +4010 1992 32 C5 30 LD (DIV4),A ; Put it back +4011 1995 79 LD A,C ; Get MSB of quotient +4012 1996 B2 OR D ; Merge NMSB +4013 1997 B3 OR E ; Merge LSB +4014 1998 C2 64 19 JP NZ,DIVLP ; Not done - Keep dividing +4015 199B E5 PUSH HL ; Save divisor +4016 199C 21 97 31 LD HL,FPEXP ; Point to exponent +4017 199F 35 DEC (HL) ; Divide by 2 +4018 19A0 E1 POP HL ; Restore divisor +4019 19A1 C2 64 19 JP NZ,DIVLP ; Ok - Keep going +4020 19A4 C3 51 07 JP OVERR ; Overflow error +4021 19A7 +4022 19A7 78 ADDEXP: LD A,B ; Get exponent of dividend +4023 19A8 B7 OR A ; Test it +4024 19A9 CA CB 19 JP Z,OVTST3 ; Zero - Result zero +4025 19AC 7D LD A,L ; Get add/subtract flag +4026 19AD 21 97 31 LD HL,FPEXP ; Point to exponent +4027 19B0 AE XOR (HL) ; Add or subtract it +4028 19B1 80 ADD A,B ; Add the other exponent +4029 19B2 47 LD B,A ; Save new exponent +4030 19B3 1F RRA ; Test exponent for overflow +4031 19B4 A8 XOR B +4032 19B5 78 LD A,B ; Get exponent +4033 19B6 F2 CA 19 JP P,OVTST2 ; Positive - Test for overflow +4034 19B9 C6 80 ADD A,80H ; Add excess 128 +4035 19BB 77 LD (HL),A ; Save new exponent +4036 19BC CA 2A 19 JP Z,POPHRT ; Zero - Result zero +4037 19BF CD 4F 1A CALL SIGNS ; Set MSBs and sign of result +4038 19C2 77 LD (HL),A ; Save new exponent +4039 19C3 2B DEC HL ; Point to MSB +4040 19C4 C9 RET +4041 19C5 +4042 19C5 CD E9 19 OVTST1: CALL TSTSGN ; Test sign of FPREG +4043 19C8 2F CPL ; Invert sign +4044 19C9 E1 POP HL ; Clean up stack +4045 19CA B7 OVTST2: OR A ; Test if new exponent zero +4046 19CB E1 OVTST3: POP HL ; Clear off return address +4047 19CC F2 09 18 JP P,RESZER ; Result zero +4048 19CF C3 51 07 JP OVERR ; Overflow error +4049 19D2 +4050 19D2 CD 35 1A MLSP10: CALL BCDEFP ; Move FPREG to BCDE +4051 19D5 78 LD A,B ; Get exponent +4052 19D6 B7 OR A ; Is it zero? +4053 19D7 C8 RET Z ; Yes - Result is zero +4054 19D8 C6 02 ADD A,2 ; Multiply by 4 +4055 19DA DA 51 07 JP C,OVERR ; Overflow - ?OV Error +4056 19DD 47 LD B,A ; Re-save exponent +4057 19DE CD A3 17 CALL FPADD ; Add BCDE to FPREG (Times 5) +4058 19E1 21 97 31 LD HL,FPEXP ; Point to exponent +4059 19E4 34 INC (HL) ; Double number (Times 10) +4060 19E5 C0 RET NZ ; Ok - Return +4061 19E6 C3 51 07 JP OVERR ; Overflow error +4062 19E9 +4063 19E9 3A 97 31 TSTSGN: LD A,(FPEXP) ; Get sign of FPREG +4064 19EC B7 OR A +4065 19ED C8 RET Z ; RETurn if number is zero +4066 19EE 3A 96 31 LD A,(FPREG+2) ; Get MSB of FPREG +4067 19F1 FE .BYTE 0FEH ; Test sign +4068 19F2 2F RETREL: CPL ; Invert sign +4069 19F3 17 RLA ; Sign bit to carry +4070 19F4 9F FLGDIF: SBC A,A ; Carry to all bits of A +4071 19F5 C0 RET NZ ; Return -1 if negative +4072 19F6 3C INC A ; Bump to +1 +4073 19F7 C9 RET ; Positive - Return +1 +4074 19F8 +4075 19F8 CD E9 19 SGN: CALL TSTSGN ; Test sign of FPREG +4076 19FB 06 88 FLGREL: LD B,80H+8 ; 8 bit integer in exponent +4077 19FD 11 00 00 LD DE,0 ; Zero NMSB and LSB +4078 1A00 21 97 31 RETINT: LD HL,FPEXP ; Point to exponent +4079 1A03 4F LD C,A ; CDE = MSB,NMSB and LSB +4080 1A04 70 LD (HL),B ; Save exponent +4081 1A05 06 00 LD B,0 ; CDE = integer to normalise +4082 1A07 23 INC HL ; Point to sign of result +4083 1A08 36 80 LD (HL),80H ; Set sign of result +4084 1A0A 17 RLA ; Carry = sign of integer +4085 1A0B C3 F1 17 JP CONPOS ; Set sign of result +4086 1A0E +4087 1A0E CD E9 19 ABS: CALL TSTSGN ; Test sign of FPREG +4088 1A11 F0 RET P ; Return if positive +4089 1A12 21 96 31 INVSGN: LD HL,FPREG+2 ; Point to MSB +4090 1A15 7E LD A,(HL) ; Get sign of mantissa +4091 1A16 EE 80 XOR 80H ; Invert sign of mantissa +4092 1A18 77 LD (HL),A ; Re-save sign of mantissa +4093 1A19 C9 RET +4094 1A1A +4095 1A1A EB STAKFP: EX DE,HL ; Save code string address +4096 1A1B 2A 94 31 LD HL,(FPREG) ; LSB,NLSB of FPREG +4097 1A1E E3 EX (SP),HL ; Stack them,get return +4098 1A1F E5 PUSH HL ; Re-save return +4099 1A20 2A 96 31 LD HL,(FPREG+2) ; MSB and exponent of FPREG +4100 1A23 E3 EX (SP),HL ; Stack them,get return +4101 1A24 E5 PUSH HL ; Re-save return +4102 1A25 EB EX DE,HL ; Restore code string address +4103 1A26 C9 RET +4104 1A27 +4105 1A27 CD 38 1A PHLTFP: CALL LOADFP ; Number at HL to BCDE +4106 1A2A EB FPBCDE: EX DE,HL ; Save code string address +4107 1A2B 22 94 31 LD (FPREG),HL ; Save LSB,NLSB of number +4108 1A2E 60 LD H,B ; Exponent of number +4109 1A2F 69 LD L,C ; MSB of number +4110 1A30 22 96 31 LD (FPREG+2),HL ; Save MSB and exponent +4111 1A33 EB EX DE,HL ; Restore code string address +4112 1A34 C9 RET +4113 1A35 +4114 1A35 21 94 31 BCDEFP: LD HL,FPREG ; Point to FPREG +4115 1A38 5E LOADFP: LD E,(HL) ; Get LSB of number +4116 1A39 23 INC HL +4117 1A3A 56 LD D,(HL) ; Get NMSB of number +4118 1A3B 23 INC HL +4119 1A3C 4E LD C,(HL) ; Get MSB of number +4120 1A3D 23 INC HL +4121 1A3E 46 LD B,(HL) ; Get exponent of number +4122 1A3F 23 INCHL: INC HL ; Used for conditional "INC HL" +4123 1A40 C9 RET +4124 1A41 +4125 1A41 11 94 31 FPTHL: LD DE,FPREG ; Point to FPREG +4126 1A44 06 04 DETHL4: LD B,4 ; 4 bytes to move +4127 1A46 1A DETHLB: LD A,(DE) ; Get source +4128 1A47 77 LD (HL),A ; Save destination +4129 1A48 13 INC DE ; Next source +4130 1A49 23 INC HL ; Next destination +4131 1A4A 05 DEC B ; Count bytes +4132 1A4B C2 46 1A JP NZ,DETHLB ; Loop if more +4133 1A4E C9 RET +4134 1A4F +4135 1A4F 21 96 31 SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG +4136 1A52 7E LD A,(HL) ; Get MSB +4137 1A53 07 RLCA ; Old sign to carry +4138 1A54 37 SCF ; Set MSBit +4139 1A55 1F RRA ; Set MSBit of MSB +4140 1A56 77 LD (HL),A ; Save new MSB +4141 1A57 3F CCF ; Complement sign +4142 1A58 1F RRA ; Old sign to carry +4143 1A59 23 INC HL +4144 1A5A 23 INC HL +4145 1A5B 77 LD (HL),A ; Set sign of result +4146 1A5C 79 LD A,C ; Get MSB +4147 1A5D 07 RLCA ; Old sign to carry +4148 1A5E 37 SCF ; Set MSBit +4149 1A5F 1F RRA ; Set MSBit of MSB +4150 1A60 4F LD C,A ; Save MSB +4151 1A61 1F RRA +4152 1A62 AE XOR (HL) ; New sign of result +4153 1A63 C9 RET +4154 1A64 +4155 1A64 78 CMPNUM: LD A,B ; Get exponent of number +4156 1A65 B7 OR A +4157 1A66 CA E9 19 JP Z,TSTSGN ; Zero - Test sign of FPREG +4158 1A69 21 F2 19 LD HL,RETREL ; Return relation routine +4159 1A6C E5 PUSH HL ; Save for return +4160 1A6D CD E9 19 CALL TSTSGN ; Test sign of FPREG +4161 1A70 79 LD A,C ; Get MSB of number +4162 1A71 C8 RET Z ; FPREG zero - Number's MSB +4163 1A72 21 96 31 LD HL,FPREG+2 ; MSB of FPREG +4164 1A75 AE XOR (HL) ; Combine signs +4165 1A76 79 LD A,C ; Get MSB of number +4166 1A77 F8 RET M ; Exit if signs different +4167 1A78 CD 7E 1A CALL CMPFP ; Compare FP numbers +4168 1A7B 1F RRA ; Get carry to sign +4169 1A7C A9 XOR C ; Combine with MSB of number +4170 1A7D C9 RET +4171 1A7E +4172 1A7E 23 CMPFP: INC HL ; Point to exponent +4173 1A7F 78 LD A,B ; Get exponent +4174 1A80 BE CP (HL) ; Compare exponents +4175 1A81 C0 RET NZ ; Different +4176 1A82 2B DEC HL ; Point to MBS +4177 1A83 79 LD A,C ; Get MSB +4178 1A84 BE CP (HL) ; Compare MSBs +4179 1A85 C0 RET NZ ; Different +4180 1A86 2B DEC HL ; Point to NMSB +4181 1A87 7A LD A,D ; Get NMSB +4182 1A88 BE CP (HL) ; Compare NMSBs +4183 1A89 C0 RET NZ ; Different +4184 1A8A 2B DEC HL ; Point to LSB +4185 1A8B 7B LD A,E ; Get LSB +4186 1A8C 96 SUB (HL) ; Compare LSBs +4187 1A8D C0 RET NZ ; Different +4188 1A8E E1 POP HL ; Drop RETurn +4189 1A8F E1 POP HL ; Drop another RETurn +4190 1A90 C9 RET +4191 1A91 +4192 1A91 47 FPINT: LD B,A ; <- Move +4193 1A92 4F LD C,A ; <- exponent +4194 1A93 57 LD D,A ; <- to all +4195 1A94 5F LD E,A ; <- bits +4196 1A95 B7 OR A ; Test exponent +4197 1A96 C8 RET Z ; Zero - Return zero +4198 1A97 E5 PUSH HL ; Save pointer to number +4199 1A98 CD 35 1A CALL BCDEFP ; Move FPREG to BCDE +4200 1A9B CD 4F 1A CALL SIGNS ; Set MSBs & sign of result +4201 1A9E AE XOR (HL) ; Combine with sign of FPREG +4202 1A9F 67 LD H,A ; Save combined signs +4203 1AA0 FC B5 1A CALL M,DCBCDE ; Negative - Decrement BCDE +4204 1AA3 3E 98 LD A,80H+24 ; 24 bits +4205 1AA5 90 SUB B ; Bits to shift +4206 1AA6 CD 68 18 CALL SCALE ; Shift BCDE +4207 1AA9 7C LD A,H ; Get combined sign +4208 1AAA 17 RLA ; Sign to carry +4209 1AAB DC 3B 18 CALL C,FPROND ; Negative - Round number up +4210 1AAE 06 00 LD B,0 ; Zero exponent +4211 1AB0 DC 54 18 CALL C,COMPL ; If negative make positive +4212 1AB3 E1 POP HL ; Restore pointer to number +4213 1AB4 C9 RET +4214 1AB5 +4215 1AB5 1B DCBCDE: DEC DE ; Decrement BCDE +4216 1AB6 7A LD A,D ; Test LSBs +4217 1AB7 A3 AND E +4218 1AB8 3C INC A +4219 1AB9 C0 RET NZ ; Exit if LSBs not FFFF +4220 1ABA 0B DEC BC ; Decrement MSBs +4221 1ABB C9 RET +4222 1ABC +4223 1ABC 21 97 31 INT: LD HL,FPEXP ; Point to exponent +4224 1ABF 7E LD A,(HL) ; Get exponent +4225 1AC0 FE 98 CP 80H+24 ; Integer accuracy only? +4226 1AC2 3A 94 31 LD A,(FPREG) ; Get LSB +4227 1AC5 D0 RET NC ; Yes - Already integer +4228 1AC6 7E LD A,(HL) ; Get exponent +4229 1AC7 CD 91 1A CALL FPINT ; F.P to integer +4230 1ACA 36 98 LD (HL),80H+24 ; Save 24 bit integer +4231 1ACC 7B LD A,E ; Get LSB of number +4232 1ACD F5 PUSH AF ; Save LSB +4233 1ACE 79 LD A,C ; Get MSB of number +4234 1ACF 17 RLA ; Sign to carry +4235 1AD0 CD F1 17 CALL CONPOS ; Set sign of result +4236 1AD3 F1 POP AF ; Restore LSB of number +4237 1AD4 C9 RET +4238 1AD5 +4239 1AD5 21 00 00 MLDEBC: LD HL,0 ; Clear partial product +4240 1AD8 78 LD A,B ; Test multiplier +4241 1AD9 B1 OR C +4242 1ADA C8 RET Z ; Return zero if zero +4243 1ADB 3E 10 LD A,16 ; 16 bits +4244 1ADD 29 MLDBLP: ADD HL,HL ; Shift P.P left +4245 1ADE DA 15 13 JP C,BSERR ; ?BS Error if overflow +4246 1AE1 EB EX DE,HL +4247 1AE2 29 ADD HL,HL ; Shift multiplier left +4248 1AE3 EB EX DE,HL +4249 1AE4 D2 EB 1A JP NC,NOMLAD ; Bit was zero - No add +4250 1AE7 09 ADD HL,BC ; Add multiplicand +4251 1AE8 DA 15 13 JP C,BSERR ; ?BS Error if overflow +4252 1AEB 3D NOMLAD: DEC A ; Count bits +4253 1AEC C2 DD 1A JP NZ,MLDBLP ; More +4254 1AEF C9 RET +4255 1AF0 +4256 1AF0 FE 2D ASCTFP: CP '-' ; Negative? +4257 1AF2 F5 PUSH AF ; Save it and flags +4258 1AF3 CA FC 1A JP Z,CNVNUM ; Yes - Convert number +4259 1AF6 FE 2B CP '+' ; Positive? +4260 1AF8 CA FC 1A JP Z,CNVNUM ; Yes - Convert number +4261 1AFB 2B DEC HL ; DEC 'cos GETCHR INCs +4262 1AFC CD 09 18 CNVNUM: CALL RESZER ; Set result to zero +4263 1AFF 47 LD B,A ; Digits after point counter +4264 1B00 57 LD D,A ; Sign of exponent +4265 1B01 5F LD E,A ; Exponent of ten +4266 1B02 2F CPL +4267 1B03 4F LD C,A ; Before or after point flag +4268 1B04 CD 9A 0B MANLP: CALL GETCHR ; Get next character +4269 1B07 DA 4D 1B JP C,ADDIG ; Digit - Add to number +4270 1B0A FE 2E CP '.' +4271 1B0C CA 28 1B JP Z,DPOINT ; '.' - Flag point +4272 1B0F FE 45 CP 'E' +4273 1B11 C2 2C 1B JP NZ,CONEXP ; Not 'E' - Scale number +4274 1B14 CD 9A 0B CALL GETCHR ; Get next character +4275 1B17 CD 40 11 CALL SGNEXP ; Get sign of exponent +4276 1B1A CD 9A 0B EXPLP: CALL GETCHR ; Get next character +4277 1B1D DA 6F 1B JP C,EDIGIT ; Digit - Add to exponent +4278 1B20 14 INC D ; Is sign negative? +4279 1B21 C2 2C 1B JP NZ,CONEXP ; No - Scale number +4280 1B24 AF XOR A +4281 1B25 93 SUB E ; Negate exponent +4282 1B26 5F LD E,A ; And re-save it +4283 1B27 0C INC C ; Flag end of number +4284 1B28 0C DPOINT: INC C ; Flag point passed +4285 1B29 CA 04 1B JP Z,MANLP ; Zero - Get another digit +4286 1B2C E5 CONEXP: PUSH HL ; Save code string address +4287 1B2D 7B LD A,E ; Get exponent +4288 1B2E 90 SUB B ; Subtract digits after point +4289 1B2F F4 45 1B SCALMI: CALL P,SCALPL ; Positive - Multiply number +4290 1B32 F2 3B 1B JP P,ENDCON ; Positive - All done +4291 1B35 F5 PUSH AF ; Save number of times to /10 +4292 1B36 CD 31 19 CALL DIV10 ; Divide by 10 +4293 1B39 F1 POP AF ; Restore count +4294 1B3A 3C INC A ; Count divides +4295 1B3B +4296 1B3B C2 2F 1B ENDCON: JP NZ,SCALMI ; More to do +4297 1B3E D1 POP DE ; Restore code string address +4298 1B3F F1 POP AF ; Restore sign of number +4299 1B40 CC 12 1A CALL Z,INVSGN ; Negative - Negate number +4300 1B43 EB EX DE,HL ; Code string address to HL +4301 1B44 C9 RET +4302 1B45 +4303 1B45 C8 SCALPL: RET Z ; Exit if no scaling needed +4304 1B46 F5 MULTEN: PUSH AF ; Save count +4305 1B47 CD D2 19 CALL MLSP10 ; Multiply number by 10 +4306 1B4A F1 POP AF ; Restore count +4307 1B4B 3D DEC A ; Count multiplies +4308 1B4C C9 RET +4309 1B4D +4310 1B4D D5 ADDIG: PUSH DE ; Save sign of exponent +4311 1B4E 57 LD D,A ; Save digit +4312 1B4F 78 LD A,B ; Get digits after point +4313 1B50 89 ADC A,C ; Add one if after point +4314 1B51 47 LD B,A ; Re-save counter +4315 1B52 C5 PUSH BC ; Save point flags +4316 1B53 E5 PUSH HL ; Save code string address +4317 1B54 D5 PUSH DE ; Save digit +4318 1B55 CD D2 19 CALL MLSP10 ; Multiply number by 10 +4319 1B58 F1 POP AF ; Restore digit +4320 1B59 D6 30 SUB '0' ; Make it absolute +4321 1B5B CD 64 1B CALL RSCALE ; Re-scale number +4322 1B5E E1 POP HL ; Restore code string address +4323 1B5F C1 POP BC ; Restore point flags +4324 1B60 D1 POP DE ; Restore sign of exponent +4325 1B61 C3 04 1B JP MANLP ; Get another digit +4326 1B64 +4327 1B64 CD 1A 1A RSCALE: CALL STAKFP ; Put number on stack +4328 1B67 CD FB 19 CALL FLGREL ; Digit to add to FPREG +4329 1B6A C1 PADD: POP BC ; Restore number +4330 1B6B D1 POP DE +4331 1B6C C3 A3 17 JP FPADD ; Add BCDE to FPREG and return +4332 1B6F +4333 1B6F 7B EDIGIT: LD A,E ; Get digit +4334 1B70 07 RLCA ; Times 2 +4335 1B71 07 RLCA ; Times 4 +4336 1B72 83 ADD A,E ; Times 5 +4337 1B73 07 RLCA ; Times 10 +4338 1B74 86 ADD A,(HL) ; Add next digit +4339 1B75 D6 30 SUB '0' ; Make it absolute +4340 1B77 5F LD E,A ; Save new digit +4341 1B78 C3 1A 1B JP EXPLP ; Look for another digit +4342 1B7B +4343 1B7B E5 LINEIN: PUSH HL ; Save code string address +4344 1B7C 21 DA 06 LD HL,INMSG ; Output " in " +4345 1B7F CD E0 14 CALL PRS ; Output string at HL +4346 1B82 E1 POP HL ; Restore code string address +4347 1B83 EB PRNTHL: EX DE,HL ; Code string address to DE +4348 1B84 AF XOR A +4349 1B85 06 98 LD B,80H+24 ; 24 bits +4350 1B87 CD 00 1A CALL RETINT ; Return the integer +4351 1B8A 21 DF 14 LD HL,PRNUMS ; Print number string +4352 1B8D E5 PUSH HL ; Save for return +4353 1B8E 21 99 31 NUMASC: LD HL,PBUFF ; Convert number to ASCII +4354 1B91 E5 PUSH HL ; Save for return +4355 1B92 CD E9 19 CALL TSTSGN ; Test sign of FPREG +4356 1B95 36 20 LD (HL),' ' ; Space at start +4357 1B97 F2 9C 1B JP P,SPCFST ; Positive - Space to start +4358 1B9A 36 2D LD (HL),'-' ; '-' sign at start +4359 1B9C 23 SPCFST: INC HL ; First byte of number +4360 1B9D 36 30 LD (HL),'0' ; '0' if zero +4361 1B9F CA 52 1C JP Z,JSTZER ; Return '0' if zero +4362 1BA2 E5 PUSH HL ; Save buffer address +4363 1BA3 FC 12 1A CALL M,INVSGN ; Negate FPREG if negative +4364 1BA6 AF XOR A ; Zero A +4365 1BA7 F5 PUSH AF ; Save it +4366 1BA8 CD 58 1C CALL RNGTST ; Test number is in range +4367 1BAB 01 43 91 SIXDIG: LD BC,9143H ; BCDE - 99999.9 +4368 1BAE 11 F8 4F LD DE,4FF8H +4369 1BB1 CD 64 1A CALL CMPNUM ; Compare numbers +4370 1BB4 B7 OR A +4371 1BB5 E2 C9 1B JP PO,INRNG ; > 99999.9 - Sort it out +4372 1BB8 F1 POP AF ; Restore count +4373 1BB9 CD 46 1B CALL MULTEN ; Multiply by ten +4374 1BBC F5 PUSH AF ; Re-save count +4375 1BBD C3 AB 1B JP SIXDIG ; Test it again +4376 1BC0 +4377 1BC0 CD 31 19 GTSIXD: CALL DIV10 ; Divide by 10 +4378 1BC3 F1 POP AF ; Get count +4379 1BC4 3C INC A ; Count divides +4380 1BC5 F5 PUSH AF ; Re-save count +4381 1BC6 CD 58 1C CALL RNGTST ; Test number is in range +4382 1BC9 CD 91 17 INRNG: CALL ROUND ; Add 0.5 to FPREG +4383 1BCC 3C INC A +4384 1BCD CD 91 1A CALL FPINT ; F.P to integer +4385 1BD0 CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG +4386 1BD3 01 06 03 LD BC,0306H ; 1E+06 to 1E-03 range +4387 1BD6 F1 POP AF ; Restore count +4388 1BD7 81 ADD A,C ; 6 digits before point +4389 1BD8 3C INC A ; Add one +4390 1BD9 FA E5 1B JP M,MAKNUM ; Do it in 'E' form if < 1E-02 +4391 1BDC FE 08 CP 6+1+1 ; More than 999999 ? +4392 1BDE D2 E5 1B JP NC,MAKNUM ; Yes - Do it in 'E' form +4393 1BE1 3C INC A ; Adjust for exponent +4394 1BE2 47 LD B,A ; Exponent of number +4395 1BE3 3E 02 LD A,2 ; Make it zero after +4396 1BE5 +4397 1BE5 3D MAKNUM: DEC A ; Adjust for digits to do +4398 1BE6 3D DEC A +4399 1BE7 E1 POP HL ; Restore buffer address +4400 1BE8 F5 PUSH AF ; Save count +4401 1BE9 11 6B 1C LD DE,POWERS ; Powers of ten +4402 1BEC 05 DEC B ; Count digits before point +4403 1BED C2 F6 1B JP NZ,DIGTXT ; Not zero - Do number +4404 1BF0 36 2E LD (HL),'.' ; Save point +4405 1BF2 23 INC HL ; Move on +4406 1BF3 36 30 LD (HL),'0' ; Save zero +4407 1BF5 23 INC HL ; Move on +4408 1BF6 05 DIGTXT: DEC B ; Count digits before point +4409 1BF7 36 2E LD (HL),'.' ; Save point in case +4410 1BF9 CC 3F 1A CALL Z,INCHL ; Last digit - move on +4411 1BFC C5 PUSH BC ; Save digits before point +4412 1BFD E5 PUSH HL ; Save buffer address +4413 1BFE D5 PUSH DE ; Save powers of ten +4414 1BFF CD 35 1A CALL BCDEFP ; Move FPREG to BCDE +4415 1C02 E1 POP HL ; Powers of ten table +4416 1C03 06 2F LD B, '0'-1 ; ASCII '0' - 1 +4417 1C05 04 TRYAGN: INC B ; Count subtractions +4418 1C06 7B LD A,E ; Get LSB +4419 1C07 96 SUB (HL) ; Subtract LSB +4420 1C08 5F LD E,A ; Save LSB +4421 1C09 23 INC HL +4422 1C0A 7A LD A,D ; Get NMSB +4423 1C0B 9E SBC A,(HL) ; Subtract NMSB +4424 1C0C 57 LD D,A ; Save NMSB +4425 1C0D 23 INC HL +4426 1C0E 79 LD A,C ; Get MSB +4427 1C0F 9E SBC A,(HL) ; Subtract MSB +4428 1C10 4F LD C,A ; Save MSB +4429 1C11 2B DEC HL ; Point back to start +4430 1C12 2B DEC HL +4431 1C13 D2 05 1C JP NC,TRYAGN ; No overflow - Try again +4432 1C16 CD 48 18 CALL PLUCDE ; Restore number +4433 1C19 23 INC HL ; Start of next number +4434 1C1A CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG +4435 1C1D EB EX DE,HL ; Save point in table +4436 1C1E E1 POP HL ; Restore buffer address +4437 1C1F 70 LD (HL),B ; Save digit in buffer +4438 1C20 23 INC HL ; And move on +4439 1C21 C1 POP BC ; Restore digit count +4440 1C22 0D DEC C ; Count digits +4441 1C23 C2 F6 1B JP NZ,DIGTXT ; More - Do them +4442 1C26 05 DEC B ; Any decimal part? +4443 1C27 CA 36 1C JP Z,DOEBIT ; No - Do 'E' bit +4444 1C2A 2B SUPTLZ: DEC HL ; Move back through buffer +4445 1C2B 7E LD A,(HL) ; Get character +4446 1C2C FE 30 CP '0' ; '0' character? +4447 1C2E CA 2A 1C JP Z,SUPTLZ ; Yes - Look back for more +4448 1C31 FE 2E CP '.' ; A decimal point? +4449 1C33 C4 3F 1A CALL NZ,INCHL ; Move back over digit +4450 1C36 +4451 1C36 F1 DOEBIT: POP AF ; Get 'E' flag +4452 1C37 CA 55 1C JP Z,NOENED ; No 'E' needed - End buffer +4453 1C3A 36 45 LD (HL),'E' ; Put 'E' in buffer +4454 1C3C 23 INC HL ; And move on +4455 1C3D 36 2B LD (HL),'+' ; Put '+' in buffer +4456 1C3F F2 46 1C JP P,OUTEXP ; Positive - Output exponent +4457 1C42 36 2D LD (HL),'-' ; Put '-' in buffer +4458 1C44 2F CPL ; Negate exponent +4459 1C45 3C INC A +4460 1C46 06 2F OUTEXP: LD B,'0'-1 ; ASCII '0' - 1 +4461 1C48 04 EXPTEN: INC B ; Count subtractions +4462 1C49 D6 0A SUB 10 ; Tens digit +4463 1C4B D2 48 1C JP NC,EXPTEN ; More to do +4464 1C4E C6 3A ADD A,'0'+10 ; Restore and make ASCII +4465 1C50 23 INC HL ; Move on +4466 1C51 70 LD (HL),B ; Save MSB of exponent +4467 1C52 23 JSTZER: INC HL ; +4468 1C53 77 LD (HL),A ; Save LSB of exponent +4469 1C54 23 INC HL +4470 1C55 71 NOENED: LD (HL),C ; Mark end of buffer +4471 1C56 E1 POP HL ; Restore code string address +4472 1C57 C9 RET +4473 1C58 +4474 1C58 01 74 94 RNGTST: LD BC,9474H ; BCDE = 999999. +4475 1C5B 11 F7 23 LD DE,23F7H +4476 1C5E CD 64 1A CALL CMPNUM ; Compare numbers +4477 1C61 B7 OR A +4478 1C62 E1 POP HL ; Return address to HL +4479 1C63 E2 C0 1B JP PO,GTSIXD ; Too big - Divide by ten +4480 1C66 E9 JP (HL) ; Otherwise return to caller +4481 1C67 +4482 1C67 00 00 00 80 HALF: .BYTE 00H,00H,00H,80H ; 0.5 +4483 1C6B +4484 1C6B A0 86 01 POWERS: .BYTE 0A0H,086H,001H ; 100000 +4485 1C6E 10 27 00 .BYTE 010H,027H,000H ; 10000 +4486 1C71 E8 03 00 .BYTE 0E8H,003H,000H ; 1000 +4487 1C74 64 00 00 .BYTE 064H,000H,000H ; 100 +4488 1C77 0A 00 00 .BYTE 00AH,000H,000H ; 10 +4489 1C7A 01 00 00 .BYTE 001H,000H,000H ; 1 +4490 1C7D +4491 1C7D 21 12 1A NEGAFT: LD HL,INVSGN ; Negate result +4492 1C80 E3 EX (SP),HL ; To be done after caller +4493 1C81 E9 JP (HL) ; Return to caller +4494 1C82 +4495 1C82 CD 1A 1A SQR: CALL STAKFP ; Put value on stack +4496 1C85 21 67 1C LD HL,HALF ; Set power to 1/2 +4497 1C88 CD 27 1A CALL PHLTFP ; Move 1/2 to FPREG +4498 1C8B +4499 1C8B C1 POWER: POP BC ; Get base +4500 1C8C D1 POP DE +4501 1C8D CD E9 19 CALL TSTSGN ; Test sign of power +4502 1C90 78 LD A,B ; Get exponent of base +4503 1C91 CA D0 1C JP Z,EXP ; Make result 1 if zero +4504 1C94 F2 9B 1C JP P,POWER1 ; Positive base - Ok +4505 1C97 B7 OR A ; Zero to negative power? +4506 1C98 CA 45 07 JP Z,DZERR ; Yes - ?/0 Error +4507 1C9B B7 POWER1: OR A ; Base zero? +4508 1C9C CA 0A 18 JP Z,SAVEXP ; Yes - Return zero +4509 1C9F D5 PUSH DE ; Save base +4510 1CA0 C5 PUSH BC +4511 1CA1 79 LD A,C ; Get MSB of base +4512 1CA2 F6 7F OR 01111111B ; Get sign status +4513 1CA4 CD 35 1A CALL BCDEFP ; Move power to BCDE +4514 1CA7 F2 B8 1C JP P,POWER2 ; Positive base - Ok +4515 1CAA D5 PUSH DE ; Save power +4516 1CAB C5 PUSH BC +4517 1CAC CD BC 1A CALL INT ; Get integer of power +4518 1CAF C1 POP BC ; Restore power +4519 1CB0 D1 POP DE +4520 1CB1 F5 PUSH AF ; MSB of base +4521 1CB2 CD 64 1A CALL CMPNUM ; Power an integer? +4522 1CB5 E1 POP HL ; Restore MSB of base +4523 1CB6 7C LD A,H ; but don't affect flags +4524 1CB7 1F RRA ; Exponent odd or even? +4525 1CB8 E1 POWER2: POP HL ; Restore MSB and exponent +4526 1CB9 22 96 31 LD (FPREG+2),HL ; Save base in FPREG +4527 1CBC E1 POP HL ; LSBs of base +4528 1CBD 22 94 31 LD (FPREG),HL ; Save in FPREG +4529 1CC0 DC 7D 1C CALL C,NEGAFT ; Odd power - Negate result +4530 1CC3 CC 12 1A CALL Z,INVSGN ; Negative base - Negate it +4531 1CC6 D5 PUSH DE ; Save power +4532 1CC7 C5 PUSH BC +4533 1CC8 CD 9D 18 CALL LOG ; Get LOG of base +4534 1CCB C1 POP BC ; Restore power +4535 1CCC D1 POP DE +4536 1CCD CD DE 18 CALL FPMULT ; Multiply LOG by power +4537 1CD0 +4538 1CD0 CD 1A 1A EXP: CALL STAKFP ; Put value on stack +4539 1CD3 01 38 81 LD BC,08138H ; BCDE = 1/Ln(2) +4540 1CD6 11 3B AA LD DE,0AA3BH +4541 1CD9 CD DE 18 CALL FPMULT ; Multiply value by 1/LN(2) +4542 1CDC 3A 97 31 LD A,(FPEXP) ; Get exponent +4543 1CDF FE 88 CP 80H+8 ; Is it in range? +4544 1CE1 D2 C5 19 JP NC,OVTST1 ; No - Test for overflow +4545 1CE4 CD BC 1A CALL INT ; Get INT of FPREG +4546 1CE7 C6 80 ADD A,80H ; For excess 128 +4547 1CE9 C6 02 ADD A,2 ; Exponent > 126? +4548 1CEB DA C5 19 JP C,OVTST1 ; Yes - Test for overflow +4549 1CEE F5 PUSH AF ; Save scaling factor +4550 1CEF 21 8C 18 LD HL,UNITY ; Point to 1. +4551 1CF2 CD 94 17 CALL ADDPHL ; Add 1 to FPREG +4552 1CF5 CD D5 18 CALL MULLN2 ; Multiply by LN(2) +4553 1CF8 F1 POP AF ; Restore scaling factor +4554 1CF9 C1 POP BC ; Restore exponent +4555 1CFA D1 POP DE +4556 1CFB F5 PUSH AF ; Save scaling factor +4557 1CFC CD A0 17 CALL SUBCDE ; Subtract exponent from FPREG +4558 1CFF CD 12 1A CALL INVSGN ; Negate result +4559 1D02 21 10 1D LD HL,EXPTAB ; Coefficient table +4560 1D05 CD 40 1D CALL SMSER1 ; Sum the series +4561 1D08 11 00 00 LD DE,0 ; Zero LSBs +4562 1D0B C1 POP BC ; Scaling factor +4563 1D0C 4A LD C,D ; Zero MSB +4564 1D0D C3 DE 18 JP FPMULT ; Scale result to correct value +4565 1D10 +4566 1D10 08 EXPTAB: .BYTE 8 ; Table used by EXP +4567 1D11 40 2E 94 74 .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040) +4568 1D15 70 4F 2E 77 .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720) +4569 1D19 6E 02 88 7A .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120) +4570 1D1D E6 A0 2A 7C .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24) +4571 1D21 50 AA AA 7E .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6) +4572 1D25 FF FF 7F 7F .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2) +4573 1D29 00 00 80 81 .BYTE 000H,000H,080H,081H ; -1/1! (-1/1) +4574 1D2D 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1) +4575 1D31 +4576 1D31 CD 1A 1A SUMSER: CALL STAKFP ; Put FPREG on stack +4577 1D34 11 DC 18 LD DE,MULT ; Multiply by "X" +4578 1D37 D5 PUSH DE ; To be done after +4579 1D38 E5 PUSH HL ; Save address of table +4580 1D39 CD 35 1A CALL BCDEFP ; Move FPREG to BCDE +4581 1D3C CD DE 18 CALL FPMULT ; Square the value +4582 1D3F E1 POP HL ; Restore address of table +4583 1D40 CD 1A 1A SMSER1: CALL STAKFP ; Put value on stack +4584 1D43 7E LD A,(HL) ; Get number of coefficients +4585 1D44 23 INC HL ; Point to start of table +4586 1D45 CD 27 1A CALL PHLTFP ; Move coefficient to FPREG +4587 1D48 06 .BYTE 06H ; Skip "POP AF" +4588 1D49 F1 SUMLP: POP AF ; Restore count +4589 1D4A C1 POP BC ; Restore number +4590 1D4B D1 POP DE +4591 1D4C 3D DEC A ; Cont coefficients +4592 1D4D C8 RET Z ; All done +4593 1D4E D5 PUSH DE ; Save number +4594 1D4F C5 PUSH BC +4595 1D50 F5 PUSH AF ; Save count +4596 1D51 E5 PUSH HL ; Save address in table +4597 1D52 CD DE 18 CALL FPMULT ; Multiply FPREG by BCDE +4598 1D55 E1 POP HL ; Restore address in table +4599 1D56 CD 38 1A CALL LOADFP ; Number at HL to BCDE +4600 1D59 E5 PUSH HL ; Save address in table +4601 1D5A CD A3 17 CALL FPADD ; Add coefficient to FPREG +4602 1D5D E1 POP HL ; Restore address in table +4603 1D5E C3 49 1D JP SUMLP ; More coefficients +4604 1D61 +4605 1D61 CD E9 19 RND: CALL TSTSGN ; Test sign of FPREG +4606 1D64 21 C9 30 LD HL,SEED+2 ; Random number seed +4607 1D67 FA C2 1D JP M,RESEED ; Negative - Re-seed +4608 1D6A 21 EA 30 LD HL,LSTRND ; Last random number +4609 1D6D CD 27 1A CALL PHLTFP ; Move last RND to FPREG +4610 1D70 21 C9 30 LD HL,SEED+2 ; Random number seed +4611 1D73 C8 RET Z ; Return if RND(0) +4612 1D74 86 ADD A,(HL) ; Add (SEED)+2) +4613 1D75 E6 07 AND 00000111B ; 0 to 7 +4614 1D77 06 00 LD B,0 +4615 1D79 77 LD (HL),A ; Re-save seed +4616 1D7A 23 INC HL ; Move to coefficient table +4617 1D7B 87 ADD A,A ; 4 bytes +4618 1D7C 87 ADD A,A ; per entry +4619 1D7D 4F LD C,A ; BC = Offset into table +4620 1D7E 09 ADD HL,BC ; Point to coefficient +4621 1D7F CD 38 1A CALL LOADFP ; Coefficient to BCDE +4622 1D82 CD DE 18 CALL FPMULT ; ; Multiply FPREG by coefficient +4623 1D85 3A C8 30 LD A,(SEED+1) ; Get (SEED+1) +4624 1D88 3C INC A ; Add 1 +4625 1D89 E6 03 AND 00000011B ; 0 to 3 +4626 1D8B 06 00 LD B,0 +4627 1D8D FE 01 CP 1 ; Is it zero? +4628 1D8F 88 ADC A,B ; Yes - Make it 1 +4629 1D90 32 C8 30 LD (SEED+1),A ; Re-save seed +4630 1D93 21 C6 1D LD HL,RNDTAB-4 ; Addition table +4631 1D96 87 ADD A,A ; 4 bytes +4632 1D97 87 ADD A,A ; per entry +4633 1D98 4F LD C,A ; BC = Offset into table +4634 1D99 09 ADD HL,BC ; Point to value +4635 1D9A CD 94 17 CALL ADDPHL ; Add value to FPREG +4636 1D9D CD 35 1A RND1: CALL BCDEFP ; Move FPREG to BCDE +4637 1DA0 7B LD A,E ; Get LSB +4638 1DA1 59 LD E,C ; LSB = MSB +4639 1DA2 EE 4F XOR 01001111B ; Fiddle around +4640 1DA4 4F LD C,A ; New MSB +4641 1DA5 36 80 LD (HL),80H ; Set exponent +4642 1DA7 2B DEC HL ; Point to MSB +4643 1DA8 46 LD B,(HL) ; Get MSB +4644 1DA9 36 80 LD (HL),80H ; Make value -0.5 +4645 1DAB 21 C7 30 LD HL,SEED ; Random number seed +4646 1DAE 34 INC (HL) ; Count seed +4647 1DAF 7E LD A,(HL) ; Get seed +4648 1DB0 D6 AB SUB 171 ; Do it modulo 171 +4649 1DB2 C2 B9 1D JP NZ,RND2 ; Non-zero - Ok +4650 1DB5 77 LD (HL),A ; Zero seed +4651 1DB6 0C INC C ; Fillde about +4652 1DB7 15 DEC D ; with the +4653 1DB8 1C INC E ; number +4654 1DB9 CD F4 17 RND2: CALL BNORM ; Normalise number +4655 1DBC 21 EA 30 LD HL,LSTRND ; Save random number +4656 1DBF C3 41 1A JP FPTHL ; Move FPREG to last and return +4657 1DC2 +4658 1DC2 77 RESEED: LD (HL),A ; Re-seed random numbers +4659 1DC3 2B DEC HL +4660 1DC4 77 LD (HL),A +4661 1DC5 2B DEC HL +4662 1DC6 77 LD (HL),A +4663 1DC7 C3 9D 1D JP RND1 ; Return RND seed +4664 1DCA +4665 1DCA 68 B1 46 68 RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND +4666 1DCE 99 E9 92 69 .BYTE 099H,0E9H,092H,069H +4667 1DD2 10 D1 75 68 .BYTE 010H,0D1H,075H,068H +4668 1DD6 +4669 1DD6 21 20 1E COS: LD HL,HALFPI ; Point to PI/2 +4670 1DD9 CD 94 17 CALL ADDPHL ; Add it to PPREG +4671 1DDC CD 1A 1A SIN: CALL STAKFP ; Put angle on stack +4672 1DDF 01 49 83 LD BC,8349H ; BCDE = 2 PI +4673 1DE2 11 DB 0F LD DE,0FDBH +4674 1DE5 CD 2A 1A CALL FPBCDE ; Move 2 PI to FPREG +4675 1DE8 C1 POP BC ; Restore angle +4676 1DE9 D1 POP DE +4677 1DEA CD 3F 19 CALL DVBCDE ; Divide angle by 2 PI +4678 1DED CD 1A 1A CALL STAKFP ; Put it on stack +4679 1DF0 CD BC 1A CALL INT ; Get INT of result +4680 1DF3 C1 POP BC ; Restore number +4681 1DF4 D1 POP DE +4682 1DF5 CD A0 17 CALL SUBCDE ; Make it 0 <= value < 1 +4683 1DF8 21 24 1E LD HL,QUARTR ; Point to 0.25 +4684 1DFB CD 9A 17 CALL SUBPHL ; Subtract value from 0.25 +4685 1DFE CD E9 19 CALL TSTSGN ; Test sign of value +4686 1E01 37 SCF ; Flag positive +4687 1E02 F2 0C 1E JP P,SIN1 ; Positive - Ok +4688 1E05 CD 91 17 CALL ROUND ; Add 0.5 to value +4689 1E08 CD E9 19 CALL TSTSGN ; Test sign of value +4690 1E0B B7 OR A ; Flag negative +4691 1E0C F5 SIN1: PUSH AF ; Save sign +4692 1E0D F4 12 1A CALL P,INVSGN ; Negate value if positive +4693 1E10 21 24 1E LD HL,QUARTR ; Point to 0.25 +4694 1E13 CD 94 17 CALL ADDPHL ; Add 0.25 to value +4695 1E16 F1 POP AF ; Restore sign +4696 1E17 D4 12 1A CALL NC,INVSGN ; Negative - Make positive +4697 1E1A 21 28 1E LD HL,SINTAB ; Coefficient table +4698 1E1D C3 31 1D JP SUMSER ; Evaluate sum of series +4699 1E20 +4700 1E20 DB 0F 49 81 HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2) +4701 1E24 +4702 1E24 00 00 00 7F QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25 +4703 1E28 +4704 1E28 05 SINTAB: .BYTE 5 ; Table used by SIN +4705 1E29 BA D7 1E 86 .BYTE 0BAH,0D7H,01EH,086H ; 39.711 +4706 1E2D 64 26 99 87 .BYTE 064H,026H,099H,087H ;-76.575 +4707 1E31 58 34 23 87 .BYTE 058H,034H,023H,087H ; 81.602 +4708 1E35 E0 5D A5 86 .BYTE 0E0H,05DH,0A5H,086H ;-41.342 +4709 1E39 DA 0F 49 83 .BYTE 0DAH,00FH,049H,083H ; 6.2832 +4710 1E3D +4711 1E3D CD 1A 1A TAN: CALL STAKFP ; Put angle on stack +4712 1E40 CD DC 1D CALL SIN ; Get SIN of angle +4713 1E43 C1 POP BC ; Restore angle +4714 1E44 E1 POP HL +4715 1E45 CD 1A 1A CALL STAKFP ; Save SIN of angle +4716 1E48 EB EX DE,HL ; BCDE = Angle +4717 1E49 CD 2A 1A CALL FPBCDE ; Angle to FPREG +4718 1E4C CD D6 1D CALL COS ; Get COS of angle +4719 1E4F C3 3D 19 JP DIV ; TAN = SIN / COS +4720 1E52 +4721 1E52 CD E9 19 ATN: CALL TSTSGN ; Test sign of value +4722 1E55 FC 7D 1C CALL M,NEGAFT ; Negate result after if -ve +4723 1E58 FC 12 1A CALL M,INVSGN ; Negate value if -ve +4724 1E5B 3A 97 31 LD A,(FPEXP) ; Get exponent +4725 1E5E FE 81 CP 81H ; Number less than 1? +4726 1E60 DA 6F 1E JP C,ATN1 ; Yes - Get arc tangnt +4727 1E63 01 00 81 LD BC,8100H ; BCDE = 1 +4728 1E66 51 LD D,C +4729 1E67 59 LD E,C +4730 1E68 CD 3F 19 CALL DVBCDE ; Get reciprocal of number +4731 1E6B 21 9A 17 LD HL,SUBPHL ; Sub angle from PI/2 +4732 1E6E E5 PUSH HL ; Save for angle > 1 +4733 1E6F 21 79 1E ATN1: LD HL,ATNTAB ; Coefficient table +4734 1E72 CD 31 1D CALL SUMSER ; Evaluate sum of series +4735 1E75 21 20 1E LD HL,HALFPI ; PI/2 - angle in case > 1 +4736 1E78 C9 RET ; Number > 1 - Sub from PI/2 +4737 1E79 +4738 1E79 09 ATNTAB: .BYTE 9 ; Table used by ATN +4739 1E7A 4A D7 3B 78 .BYTE 04AH,0D7H,03BH,078H ; 1/17 +4740 1E7E 02 6E 84 7B .BYTE 002H,06EH,084H,07BH ;-1/15 +4741 1E82 FE C1 2F 7C .BYTE 0FEH,0C1H,02FH,07CH ; 1/13 +4742 1E86 74 31 9A 7D .BYTE 074H,031H,09AH,07DH ;-1/11 +4743 1E8A 84 3D 5A 7D .BYTE 084H,03DH,05AH,07DH ; 1/9 +4744 1E8E C8 7F 91 7E .BYTE 0C8H,07FH,091H,07EH ;-1/7 +4745 1E92 E4 BB 4C 7E .BYTE 0E4H,0BBH,04CH,07EH ; 1/5 +4746 1E96 6C AA AA 7F .BYTE 06CH,0AAH,0AAH,07FH ;-1/3 +4747 1E9A 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/1 +4748 1E9E +4749 1E9E +4750 1E9E C9 ARET: RET ; A RETurn instruction +4751 1E9F +4752 1E9F D7 GETINP: RST 10H ;input a character +4753 1EA0 C9 RET +4754 1EA1 +4755 1EA1 CLS: +4756 1EA1 3E 0C LD A,CS ; ASCII Clear screen +4757 1EA3 C3 DB 1F JP MONOUT ; Output character +4758 1EA6 +4759 1EA6 CD 68 17 WIDTH: CALL GETINT ; Get integer 0-255 +4760 1EA9 7B LD A,E ; Width to A +4761 1EAA 32 F2 30 LD (LWIDTH),A ; Set width +4762 1EAD C9 RET +4763 1EAE +4764 1EAE CD 07 10 LINES: CALL GETNUM ; Get a number +4765 1EB1 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4766 1EB4 ED 53 F6 30 LD (LINESC),DE ; Set lines counter +4767 1EB8 ED 53 F8 30 LD (LINESN),DE ; Set lines number +4768 1EBC C9 RET +4769 1EBD +4770 1EBD CD 4C 0C DEEK: CALL DEINT ; Get integer -32768 to 32767 +4771 1EC0 D5 PUSH DE ; Save number +4772 1EC1 E1 POP HL ; Number to HL +4773 1EC2 46 LD B,(HL) ; Get LSB of contents +4774 1EC3 23 INC HL +4775 1EC4 7E LD A,(HL) ; Get MSB of contents +4776 1EC5 C3 C2 13 JP ABPASS ; Return integer AB +4777 1EC8 +4778 1EC8 CD 07 10 DOKE: CALL GETNUM ; Get a number +4779 1ECB CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4780 1ECE D5 PUSH DE ; Save address +4781 1ECF CD 10 0A CALL CHKSYN ; Make sure ',' follows +4782 1ED2 2C .BYTE ',' +4783 1ED3 CD 07 10 CALL GETNUM ; Get a number +4784 1ED6 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4785 1ED9 E3 EX (SP),HL ; Save value,get address +4786 1EDA 73 LD (HL),E ; Save LSB of value +4787 1EDB 23 INC HL +4788 1EDC 72 LD (HL),D ; Save MSB of value +4789 1EDD E1 POP HL ; Restore code string address +4790 1EDE C9 RET +4791 1EDF +4792 1EDF +4793 1EDF ; HEX$(nn) Convert 16 bit number to Hexadecimal string +4794 1EDF +4795 1EDF CD 0A 10 HEX: CALL TSTNUM ; Verify it's a number +4796 1EE2 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4797 1EE5 C5 PUSH BC ; Save contents of BC +4798 1EE6 21 99 31 LD HL,PBUFF +4799 1EE9 7A LD A,D ; Get high order into A +4800 1EEA FE 00 CP $0 +4801 1EEC 28 0C JR Z,HEX2 ; Skip output if both high digits are zero +4802 1EEE CD 17 1F CALL BYT2ASC ; Convert D to ASCII +4803 1EF1 78 LD A,B +4804 1EF2 FE 30 CP '0' +4805 1EF4 28 02 JR Z,HEX1 ; Don't store high digit if zero +4806 1EF6 70 LD (HL),B ; Store it to PBUFF +4807 1EF7 23 INC HL ; Next location +4808 1EF8 71 HEX1: LD (HL),C ; Store C to PBUFF+1 +4809 1EF9 23 INC HL ; Next location +4810 1EFA 7B HEX2: LD A,E ; Get lower byte +4811 1EFB CD 17 1F CALL BYT2ASC ; Convert E to ASCII +4812 1EFE 7A LD A,D +4813 1EFF FE 00 CP $0 +4814 1F01 20 05 JR NZ,HEX3 ; If upper byte was not zero then always print lower byte +4815 1F03 78 LD A,B +4816 1F04 FE 30 CP '0' ; If high digit of lower byte is zero then don't print +4817 1F06 28 02 JR Z,HEX4 +4818 1F08 70 HEX3: LD (HL),B ; to PBUFF+2 +4819 1F09 23 INC HL ; Next location +4820 1F0A 71 HEX4: LD (HL),C ; to PBUFF+3 +4821 1F0B 23 INC HL ; PBUFF+4 to zero +4822 1F0C AF XOR A ; Terminating character +4823 1F0D 77 LD (HL),A ; Store zero to terminate +4824 1F0E 23 INC HL ; Make sure PBUFF is terminated +4825 1F0F 77 LD (HL),A ; Store the double zero there +4826 1F10 C1 POP BC ; Get BC back +4827 1F11 21 99 31 LD HL,PBUFF ; Reset to start of PBUFF +4828 1F14 C3 70 14 JP STR1 ; Convert the PBUFF to a string and return it +4829 1F17 +4830 1F17 47 BYT2ASC LD B,A ; Save original value +4831 1F18 E6 0F AND $0F ; Strip off upper nybble +4832 1F1A FE 0A CP $0A ; 0-9? +4833 1F1C 38 02 JR C,ADD30 ; If A-F, add 7 more +4834 1F1E C6 07 ADD A,$07 ; Bring value up to ASCII A-F +4835 1F20 C6 30 ADD30 ADD A,$30 ; And make ASCII +4836 1F22 4F LD C,A ; Save converted char to C +4837 1F23 78 LD A,B ; Retrieve original value +4838 1F24 0F RRCA ; and Rotate it right +4839 1F25 0F RRCA +4840 1F26 0F RRCA +4841 1F27 0F RRCA +4842 1F28 E6 0F AND $0F ; Mask off upper nybble +4843 1F2A FE 0A CP $0A ; 0-9? < A hex? +4844 1F2C 38 02 JR C,ADD301 ; Skip Add 7 +4845 1F2E C6 07 ADD A,$07 ; Bring it up to ASCII A-F +4846 1F30 C6 30 ADD301 ADD A,$30 ; And make it full ASCII +4847 1F32 47 LD B,A ; Store high order byte +4848 1F33 C9 RET +4849 1F34 +4850 1F34 ; Convert "&Hnnnn" to FPREG +4851 1F34 ; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" +4852 1F34 ; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 +4853 1F34 EB HEXTFP EX DE,HL ; Move code string pointer to DE +4854 1F35 21 00 00 LD HL,$0000 ; Zero out the value +4855 1F38 CD 4D 1F CALL GETHEX ; Check the number for valid hex +4856 1F3B DA 6D 1F JP C,HXERR ; First value wasn't hex, HX error +4857 1F3E 18 05 JR HEXLP1 ; Convert first character +4858 1F40 CD 4D 1F HEXLP CALL GETHEX ; Get second and addtional characters +4859 1F43 38 1F JR C,HEXIT ; Exit if not a hex character +4860 1F45 29 HEXLP1 ADD HL,HL ; Rotate 4 bits to the left +4861 1F46 29 ADD HL,HL +4862 1F47 29 ADD HL,HL +4863 1F48 29 ADD HL,HL +4864 1F49 B5 OR L ; Add in D0-D3 into L +4865 1F4A 6F LD L,A ; Save new value +4866 1F4B 18 F3 JR HEXLP ; And continue until all hex characters are in +4867 1F4D +4868 1F4D 13 GETHEX INC DE ; Next location +4869 1F4E 1A LD A,(DE) ; Load character at pointer +4870 1F4F FE 20 CP ' ' +4871 1F51 CA 4D 1F JP Z,GETHEX ; Skip spaces +4872 1F54 D6 30 SUB $30 ; Get absolute value +4873 1F56 D8 RET C ; < "0", error +4874 1F57 FE 0A CP $0A +4875 1F59 38 05 JR C,NOSUB7 ; Is already in the range 0-9 +4876 1F5B D6 07 SUB $07 ; Reduce to A-F +4877 1F5D FE 0A CP $0A ; Value should be $0A-$0F at this point +4878 1F5F D8 RET C ; CY set if was : ; < = > ? @ +4879 1F60 FE 10 NOSUB7 CP $10 ; > Greater than "F"? +4880 1F62 3F CCF +4881 1F63 C9 RET ; CY set if it wasn't valid hex +4882 1F64 +4883 1F64 EB HEXIT EX DE,HL ; Value into DE, Code string into HL +4884 1F65 7A LD A,D ; Load DE into AC +4885 1F66 4B LD C,E ; For prep to +4886 1F67 E5 PUSH HL +4887 1F68 CD C1 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG +4888 1F6B E1 POP HL +4889 1F6C C9 RET +4890 1F6D +4891 1F6D 1E 26 HXERR: LD E,HX ; ?HEX Error +4892 1F6F C3 56 07 JP ERROR +4893 1F72 +4894 1F72 ; BIN$(NN) Convert integer to a 1-16 char binary string +4895 1F72 CD 0A 10 BIN: CALL TSTNUM ; Verify it's a number +4896 1F75 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4897 1F78 C5 BIN2: PUSH BC ; Save contents of BC +4898 1F79 21 99 31 LD HL,PBUFF +4899 1F7C 06 11 LD B,17 ; One higher than max char count +4900 1F7E ZEROSUP: ; Suppress leading zeros +4901 1F7E 05 DEC B ; Max 16 chars +4902 1F7F 78 LD A,B +4903 1F80 FE 01 CP $01 +4904 1F82 28 08 JR Z,BITOUT ; Always output at least one character +4905 1F84 CB 13 RL E +4906 1F86 CB 12 RL D +4907 1F88 30 F4 JR NC,ZEROSUP +4908 1F8A 18 04 JR BITOUT2 +4909 1F8C BITOUT: +4910 1F8C CB 13 RL E +4911 1F8E CB 12 RL D ; Top bit now in carry +4912 1F90 BITOUT2: +4913 1F90 3E 30 LD A,'0' ; Char for '0' +4914 1F92 CE 00 ADC A,0 ; If carry set then '0' --> '1' +4915 1F94 77 LD (HL),A +4916 1F95 23 INC HL +4917 1F96 05 DEC B +4918 1F97 20 F3 JR NZ,BITOUT +4919 1F99 AF XOR A ; Terminating character +4920 1F9A 77 LD (HL),A ; Store zero to terminate +4921 1F9B 23 INC HL ; Make sure PBUFF is terminated +4922 1F9C 77 LD (HL),A ; Store the double zero there +4923 1F9D C1 POP BC +4924 1F9E 21 99 31 LD HL,PBUFF +4925 1FA1 C3 70 14 JP STR1 +4926 1FA4 +4927 1FA4 ; Convert "&Bnnnn" to FPREG +4928 1FA4 ; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" +4929 1FA4 EB BINTFP: EX DE,HL ; Move code string pointer to DE +4930 1FA5 21 00 00 LD HL,$0000 ; Zero out the value +4931 1FA8 CD C1 1F CALL CHKBIN ; Check the number for valid bin +4932 1FAB DA CF 1F JP C,BINERR ; First value wasn't bin, HX error +4933 1FAE D6 30 BINIT: SUB '0' +4934 1FB0 29 ADD HL,HL ; Rotate HL left +4935 1FB1 B5 OR L +4936 1FB2 6F LD L,A +4937 1FB3 CD C1 1F CALL CHKBIN ; Get second and addtional characters +4938 1FB6 30 F6 JR NC,BINIT ; Process if a bin character +4939 1FB8 EB EX DE,HL ; Value into DE, Code string into HL +4940 1FB9 7A LD A,D ; Load DE into AC +4941 1FBA 4B LD C,E ; For prep to +4942 1FBB E5 PUSH HL +4943 1FBC CD C1 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG +4944 1FBF E1 POP HL +4945 1FC0 C9 RET +4946 1FC1 +4947 1FC1 ; Char is in A, NC if char is 0 or 1 +4948 1FC1 13 CHKBIN: INC DE +4949 1FC2 1A LD A,(DE) +4950 1FC3 FE 20 CP ' ' +4951 1FC5 CA C1 1F JP Z,CHKBIN ; Skip spaces +4952 1FC8 FE 30 CP '0' ; Set C if < '0' +4953 1FCA D8 RET C +4954 1FCB FE 32 CP '2' +4955 1FCD 3F CCF ; Set C if > '1' +4956 1FCE C9 RET +4957 1FCF +4958 1FCF 1E 28 BINERR: LD E,BN ; ?BIN Error +4959 1FD1 C3 56 07 JP ERROR +4960 1FD4 +4961 1FD4 +4962 1FD4 JJUMP1: +4963 1FD4 DD 21 FF FF LD IX,-1 ; Flag cold start +4964 1FD8 C3 A6 03 JP CSTART ; Go and initialise +4965 1FDB +4966 1FDB MONOUT: +4967 1FDB C3 08 00 JP $0008 ; output a char +4968 1FDE +4969 1FDE +4970 1FDE MONITR: +4971 1FDE C3 00 00 JP $0000 ; Restart (Normally Monitor Start) +4972 1FE1 +4973 1FE1 +4974 1FE1 3E 00 INITST: LD A,0 ; Clear break flag +4975 1FE3 32 FD 30 LD (BRKFLG),A +4976 1FE6 C3 AD 03 JP INIT +4977 1FE9 +4978 1FE9 ED 45 ARETN: RETN ; Return from NMI +4979 1FEB +4980 1FEB +4981 1FEB F5 TSTBIT: PUSH AF ; Save bit mask +4982 1FEC A0 AND B ; Get common bits +4983 1FED C1 POP BC ; Restore bit mask +4984 1FEE B8 CP B ; Same bit set? +4985 1FEF 3E 00 LD A,0 ; Return 0 in A +4986 1FF1 C9 RET +4987 1FF2 +4988 1FF2 CD 1B 0A OUTNCR: CALL OUTC ; Output character in A +4989 1FF5 C3 42 0E JP PRNTCRLF ; Output CRLF +4990 1FF8 +4991 1FF8 .end +4992 1FF8 +tasm: Number of errors = 0 diff --git a/Z80 CPM and bootloader (basmon)/source/basMon.asm b/Z80 CPM and bootloader (basmon)/source/basMon.asm index 7ae9cb5..fb36b2e 100644 --- a/Z80 CPM and bootloader (basmon)/source/basMon.asm +++ b/Z80 CPM and bootloader (basmon)/source/basMon.asm @@ -69,7 +69,6 @@ SD_LBA2 .EQU 08CH primaryIO .ds 1 secNo .ds 1 dmaAddr .ds 2 -InitTxtB .ds 2 lba0 .DB 00h lba1 .DB 00h @@ -169,25 +168,6 @@ conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting OUT (ACIA1_D),A ; OUTput the character RET -;------------------------------------------------------------------------------ -; Non blocking console output routine -; On return Z flag is 0, if the character could be written, else 1 -; Use the "primaryIO" flag to determine which output port to send a character. -;------------------------------------------------------------------------------ -nbconoutB: - PUSH AF - -nbconoutB1: CALL CKACIA1 ; See if ACIA channel B has finished transmitting - JR NZ, nbconoutB2 ; Ready to write - POP AF ; Remove the parameter we don't need - AND $00 ; Indicate failure - RET ; Return if ACIA flag signals not ready -nbconoutB2: - POP AF ; RETrieve character - OUT (ACIA1_D),A ; OUTput the character - OR $ff ; Indicate success - RET - ;------------------------------------------------------------------------------ ; I/O status check routine ; Use the "primaryIO" flag to determine which port to check. @@ -269,25 +249,17 @@ M_INIT LD SP,M_STACK ; Set the Stack Pointer LD (primaryIO),A LD HL,INITTXT CALL M_PRINT - ; On Display B we need to take care that it does not hang. + LD A,$01 + LD (primaryIO),A LD HL,INITTXT - LD (InitTxtB),HL + CALL M_PRINT -printInitB: LD HL,(InitTxtB) - LD A,(HL) ; Get character - OR A ; Is it $00 ? - JR Z, waitForSpace - CALL nbconoutB ; Print it - JR Z, waitForSpace ; If we can't write, don't increment - INC HL - LD (InitTxtB),HL ; Store pointer into message for next round - JP printInitB ; Wait until space is in one of the buffers to determine the active console waitForSpace: CALL ckincharA - JR Z,chkSpaceB + jr Z,notInA LD A,$00 LD (primaryIO),A CALL conin @@ -295,25 +267,22 @@ waitForSpace: JP NZ, waitForSpace JR spacePressed -chkSpaceB: +notInA: CALL ckincharB - JR Z,printInitB ; If no key pressed, try to continue writing the init message on B + JR Z,waitForSpace LD A,$01 LD (primaryIO),A CALL conin CP ' ' - JP NZ, printInitB ; If space not pressed, try to continue writing the init message on B + JP NZ, waitForSpace + JR spacePressed spacePressed: ; Clear message on both consoles LD A,$0C CALL conoutA - CALL nbconoutB - - ;; We only clear the message on the active console, - ;; because trying to write on a console not connected could - ;; make the system freeze. + CALL conoutB ; primaryIO is now set to the channel where SPACE was pressed @@ -686,7 +655,7 @@ CKSUMERR .BYTE "Checksum error" INITTXT .BYTE $0C - .TEXT "Press [space] to activate the console." + .TEXT "Press [SPACE] to activate console" .BYTE $0D,$0A, $00 LDETXT diff --git a/Z80 CPM and bootloader (basmon)/source/intprt.asm b/Z80 CPM and bootloader (basmon)/source/intprt.asm new file mode 100644 index 0000000..c07de7f --- /dev/null +++ b/Z80 CPM and bootloader (basmon)/source/intprt.asm @@ -0,0 +1,4317 @@ +;------------------------------------------------------------------------------ +; Start BASIC command +;------------------------------------------------------------------------------ +BASIC + LD HL,M_BASTXT + CALL M_PRINT + CALL M_GETCHR + RET Z ; Cancel if CTRL-C + AND $5F ; uppercase + CP 'C' + JP Z,COLD + CP 'W' + JP Z,WARM + RET + +; BASIC WORK SPACE LOCATIONS + +WRKSPC .EQU 30B0H ; BASIC Work space +USR .EQU WRKSPC+3H ; "USR (x)" jump +OUTSUB .EQU WRKSPC+6H ; "OUT p,n" +OTPORT .EQU WRKSPC+7H ; Port (p) +DIVSUP .EQU WRKSPC+9H ; Division support routine +DIV1 .EQU WRKSPC+0AH ; <- Values +DIV2 .EQU WRKSPC+0EH ; <- to +DIV3 .EQU WRKSPC+12H ; <- be +DIV4 .EQU WRKSPC+15H ; <-inserted +SEED .EQU WRKSPC+17H ; Random number seed +LSTRND .EQU WRKSPC+3AH ; Last random number +INPSUB .EQU WRKSPC+3EH ; #INP (x)" Routine +INPORT .EQU WRKSPC+3FH ; PORT (x) +NULLS .EQU WRKSPC+41H ; Number of nulls +LWIDTH .EQU WRKSPC+42H ; Terminal width +COMMAN .EQU WRKSPC+43H ; Width for commas +NULFLG .EQU WRKSPC+44H ; Null after input byte flag +CTLOFG .EQU WRKSPC+45H ; Control "O" flag +LINESC .EQU WRKSPC+46H ; Lines counter +LINESN .EQU WRKSPC+48H ; Lines number +CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum +NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine +BRKFLG .EQU WRKSPC+4DH ; Break flag +RINPUT .EQU WRKSPC+4EH ; Input reflection +POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) +PSET .EQU WRKSPC+54H ; "SET" reflection +RESET .EQU WRKSPC+57H ; "RESET" reflection +STRSPC .EQU WRKSPC+5AH ; Bottom of string space +LINEAT .EQU WRKSPC+5CH ; Current line number +BASTXT .EQU WRKSPC+5EH ; Pointer to start of program +BUFFER .EQU WRKSPC+61H ; Input buffer +STACK .EQU WRKSPC+66H ; Initial stack +CURPOS .EQU WRKSPC+0ABH ; Character position on line +LCRFLG .EQU WRKSPC+0ACH ; Locate/Create flag +TYPE .EQU WRKSPC+0ADH ; Data type flag +DATFLG .EQU WRKSPC+0AEH ; Literal statement flag +LSTRAM .EQU WRKSPC+0AFH ; Last available RAM +TMSTPT .EQU WRKSPC+0B1H ; Temporary string pointer +TMSTPL .EQU WRKSPC+0B3H ; Temporary string pool +TMPSTR .EQU WRKSPC+0BFH ; Temporary string +STRBOT .EQU WRKSPC+0C3H ; Bottom of string space +CUROPR .EQU WRKSPC+0C5H ; Current operator in EVAL +LOOPST .EQU WRKSPC+0C7H ; First statement of loop +DATLIN .EQU WRKSPC+0C9H ; Line of current DATA item +FORFLG .EQU WRKSPC+0CBH ; "FOR" loop flag +LSTBIN .EQU WRKSPC+0CCH ; Last byte entered +READFG .EQU WRKSPC+0CDH ; Read/Input flag +BRKLIN .EQU WRKSPC+0CEH ; Line of break +NXTOPR .EQU WRKSPC+0D0H ; Next operator in EVAL +ERRLIN .EQU WRKSPC+0D2H ; Line of error +CONTAD .EQU WRKSPC+0D4H ; Where to CONTinue +PROGND .EQU WRKSPC+0D6H ; End of program +VAREND .EQU WRKSPC+0D8H ; End of variables +ARREND .EQU WRKSPC+0DAH ; End of arrays +NXTDAT .EQU WRKSPC+0DCH ; Next data item +FNRGNM .EQU WRKSPC+0DEH ; Name of FN argument +FNARG .EQU WRKSPC+0E0H ; FN argument value +FPREG .EQU WRKSPC+0E4H ; Floating point register +FPEXP .EQU FPREG+3 ; Floating point exponent +SGNRES .EQU WRKSPC+0E8H ; Sign of result +PBUFF .EQU WRKSPC+0E9H ; Number print buffer +MULVAL .EQU WRKSPC+0F6H ; Multiplier +PROGST .EQU WRKSPC+0F9H ; Start of program text area +STLOOK .EQU WRKSPC+15DH ; Start of memory test + +; BASIC ERROR CODE VALUES + +NF .EQU 00H ; NEXT without FOR +SN .EQU 02H ; Syntax error +RG .EQU 04H ; RETURN without GOSUB +OD .EQU 06H ; Out of DATA +FC .EQU 08H ; Function call error +OV .EQU 0AH ; Overflow +OM .EQU 0CH ; Out of memory +UL .EQU 0EH ; Undefined line number +BS .EQU 10H ; Bad subscript +DD .EQU 12H ; Re-DIMensioned array +DZ .EQU 14H ; Division by zero (/0) +ID .EQU 16H ; Illegal direct +TM .EQU 18H ; Type miss-match +OS .EQU 1AH ; Out of string space +LS .EQU 1CH ; String too long +ST .EQU 1EH ; String formula too complex +CN .EQU 20H ; Can't CONTinue +UF .EQU 22H ; UnDEFined FN function +MO .EQU 24H ; Missing operand +HX .EQU 26H ; HEX error +BN .EQU 28H ; BIN error + +; .ORG 00396H + +COLD: JP STARTB ; Jump for cold start +WARM: JP WARMST ; Jump for warm start +STARTB: + LD IX,0 ; Flag cold start + JP CSTART ; Jump to initialise + + .WORD DEINT ; Get integer -32768 to 32767 + .WORD ABPASS ; Return integer in AB + + +CSTART: LD HL,WRKSPC ; Start of workspace RAM + LD SP,HL ; Set up a temporary stack + JP INITST ; Go to initialise + +INIT: LD DE,INITAB ; Initialise workspace + LD B,INITBE-INITAB+3; Bytes to copy + LD HL,WRKSPC ; Into workspace RAM +COPY: LD A,(DE) ; Get source + LD (HL),A ; To destination + INC HL ; Next destination + INC DE ; Next source + DEC B ; Count bytes + JP NZ,COPY ; More to move + LD SP,HL ; Temporary stack + CALL CLREG ; Clear registers and stack + CALL PRNTCRLF ; Output CRLF + LD (BUFFER+72+1),A ; Mark end of buffer + LD (PROGST),A ; Initialise program area +MSIZE: LD HL,MEMMSG ; Point to message + CALL PRS ; Output "Memory size" + CALL PROMPT ; Get input with '?' + CALL GETCHR ; Get next character + OR A ; Set flags + JP NZ,TSTMEM ; If number - Test if RAM there + LD HL,STLOOK ; Point to start of RAM +MLOOP: INC HL ; Next byte + LD A,H ; Above address FFFF ? + OR L + JP Z,SETTOP ; Yes - 64K RAM + LD A,(HL) ; Get contents + LD B,A ; Save it + CPL ; Flip all bits + LD (HL),A ; Put it back + CP (HL) ; RAM there if same + LD (HL),B ; Restore old contents + JP Z,MLOOP ; If RAM - test next byte + JP SETTOP ; Top of RAM found + +TSTMEM: CALL ATOH ; Get high memory into DE + OR A ; Set flags on last byte + JP NZ,SNERR ; ?SN Error if bad character + EX DE,HL ; Address into HL + DEC HL ; Back one byte + LD A,11011001B ; Test byte + LD B,(HL) ; Get old contents + LD (HL),A ; Load test byte + CP (HL) ; RAM there if same + LD (HL),B ; Restore old contents + JP NZ,MSIZE ; Ask again if no RAM + +SETTOP: DEC HL ; Back one byte + LD DE,STLOOK-1 ; See if enough RAM + CALL CPDEHL ; Compare DE with HL + JP C,MSIZE ; Ask again if not enough RAM + LD DE,0-50 ; 50 Bytes string space + LD (LSTRAM),HL ; Save last available RAM + ADD HL,DE ; Allocate string space + LD (STRSPC),HL ; Save string space + CALL CLRPTR ; Clear program area + LD HL,(STRSPC) ; Get end of memory + LD DE,0-17 ; Offset for free bytes + ADD HL,DE ; Adjust HL + LD DE,PROGST ; Start of program text + LD A,L ; Get LSB + SUB E ; Adjust it + LD L,A ; Re-save + LD A,H ; Get MSB + SBC A,D ; Adjust it + LD H,A ; Re-save + PUSH HL ; Save bytes free + LD HL,SIGNON ; Sign-on message + CALL PRS ; Output string + POP HL ; Get bytes free back + CALL PRNTHL ; Output amount of free memory + LD HL,BFREE ; " Bytes free" message + CALL PRS ; Output string + +WARMST: LD SP,STACK ; Temporary stack +BRKRET: CALL CLREG ; Clear registers and stack + JP PRNTOK ; Go to get command line + +BFREE: .BYTE " Bytes free",CR,LF,0,0 + +SIGNON: .BYTE "Z80 BASIC Ver 4.7b",CR,LF + .BYTE "Copyright ",40,"C",41 + .BYTE " 1978 by Microsoft",CR,LF,0,0 + +MEMMSG: .BYTE "Memory top",0 + +; FUNCTION ADDRESS TABLE + +FNCTAB: .WORD SGN + .WORD INT + .WORD ABS + .WORD USR + .WORD FRE + .WORD INP + .WORD POS + .WORD SQR + .WORD RND + .WORD LOG + .WORD EXP + .WORD COS + .WORD SIN + .WORD TAN + .WORD ATN + .WORD PEEK + .WORD DEEK + .WORD POINT + .WORD LEN + .WORD STR + .WORD VAL + .WORD ASC + .WORD CHR + .WORD HEX + .WORD BIN + .WORD LEFT + .WORD RIGHT + .WORD MID + +; RESERVED WORD LIST + +WORDS: .BYTE 'E'+80H,"ND" + .BYTE 'F'+80H,"OR" + .BYTE 'N'+80H,"EXT" + .BYTE 'D'+80H,"ATA" + .BYTE 'I'+80H,"NPUT" + .BYTE 'D'+80H,"IM" + .BYTE 'R'+80H,"EAD" + .BYTE 'L'+80H,"ET" + .BYTE 'G'+80H,"OTO" + .BYTE 'R'+80H,"UN" + .BYTE 'I'+80H,"F" + .BYTE 'R'+80H,"ESTORE" + .BYTE 'G'+80H,"OSUB" + .BYTE 'R'+80H,"ETURN" + .BYTE 'R'+80H,"EM" + .BYTE 'S'+80H,"TOP" + .BYTE 'O'+80H,"UT" + .BYTE 'O'+80H,"N" + .BYTE 'N'+80H,"ULL" + .BYTE 'W'+80H,"AIT" + .BYTE 'D'+80H,"EF" + .BYTE 'P'+80H,"OKE" + .BYTE 'D'+80H,"OKE" + .BYTE 'S'+80H,"CREEN" + .BYTE 'L'+80H,"INES" + .BYTE 'C'+80H,"LS" + .BYTE 'W'+80H,"IDTH" + .BYTE 'M'+80H,"ONITOR" + .BYTE 'S'+80H,"ET" + .BYTE 'R'+80H,"ESET" + .BYTE 'P'+80H,"RINT" + .BYTE 'C'+80H,"ONT" + .BYTE 'L'+80H,"IST" + .BYTE 'C'+80H,"LEAR" + .BYTE 'C'+80H,"LOAD" + .BYTE 'C'+80H,"SAVE" + .BYTE 'N'+80H,"EW" + + .BYTE 'T'+80H,"AB(" + .BYTE 'T'+80H,"O" + .BYTE 'F'+80H,"N" + .BYTE 'S'+80H,"PC(" + .BYTE 'T'+80H,"HEN" + .BYTE 'N'+80H,"OT" + .BYTE 'S'+80H,"TEP" + + .BYTE '+'+80H + .BYTE '-'+80H + .BYTE '*'+80H + .BYTE '/'+80H + .BYTE '^'+80H + .BYTE 'A'+80H,"ND" + .BYTE 'O'+80H,"R" + .BYTE '>'+80H + .BYTE '='+80H + .BYTE '<'+80H + + .BYTE 'S'+80H,"GN" + .BYTE 'I'+80H,"NT" + .BYTE 'A'+80H,"BS" + .BYTE 'U'+80H,"SR" + .BYTE 'F'+80H,"RE" + .BYTE 'I'+80H,"NP" + .BYTE 'P'+80H,"OS" + .BYTE 'S'+80H,"QR" + .BYTE 'R'+80H,"ND" + .BYTE 'L'+80H,"OG" + .BYTE 'E'+80H,"XP" + .BYTE 'C'+80H,"OS" + .BYTE 'S'+80H,"IN" + .BYTE 'T'+80H,"AN" + .BYTE 'A'+80H,"TN" + .BYTE 'P'+80H,"EEK" + .BYTE 'D'+80H,"EEK" + .BYTE 'P'+80H,"OINT" + .BYTE 'L'+80H,"EN" + .BYTE 'S'+80H,"TR$" + .BYTE 'V'+80H,"AL" + .BYTE 'A'+80H,"SC" + .BYTE 'C'+80H,"HR$" + .BYTE 'H'+80H,"EX$" + .BYTE 'B'+80H,"IN$" + .BYTE 'L'+80H,"EFT$" + .BYTE 'R'+80H,"IGHT$" + .BYTE 'M'+80H,"ID$" + .BYTE 80H ; End of list marker + +; KEYWORD ADDRESS TABLE + +WORDTB: .WORD PEND + .WORD FOR + .WORD NEXT + .WORD DATA + .WORD INPUT + .WORD DIM + .WORD READ + .WORD LET + .WORD GOTO + .WORD RUN + .WORD IF + .WORD RESTOR + .WORD GOSUB + .WORD RETURN + .WORD REM + .WORD STOP + .WORD POUT + .WORD ON + .WORD NULL + .WORD WAIT + .WORD DEF + .WORD POKE + .WORD DOKE + .WORD REM + .WORD LINES + .WORD CLS + .WORD WIDTH + .WORD MONITR + .WORD PSET + .WORD RESET + .WORD PRINT + .WORD CONT + .WORD LIST + .WORD CLEAR + .WORD REM + .WORD REM + .WORD NEW + +; RESERVED WORD TOKEN VALUES + +ZEND .EQU 080H ; END +ZFOR .EQU 081H ; FOR +ZDATA .EQU 083H ; DATA +ZGOTO .EQU 088H ; GOTO +ZGOSUB .EQU 08CH ; GOSUB +ZREM .EQU 08EH ; REM +ZPRINT .EQU 09EH ; PRINT +ZNEW .EQU 0A4H ; NEW + +ZTAB .EQU 0A5H ; TAB +ZTO .EQU 0A6H ; TO +ZFN .EQU 0A7H ; FN +ZSPC .EQU 0A8H ; SPC +ZTHEN .EQU 0A9H ; THEN +ZNOT .EQU 0AAH ; NOT +ZSTEP .EQU 0ABH ; STEP + +ZPLUS .EQU 0ACH ; + +ZMINUS .EQU 0ADH ; - +ZTIMES .EQU 0AEH ; * +ZDIV .EQU 0AFH ; / +ZOR .EQU 0B2H ; OR +ZGTR .EQU 0B3H ; > +ZEQUAL .EQU 0B4H ; M +ZLTH .EQU 0B5H ; < +ZSGN .EQU 0B6H ; SGN +ZPOINT .EQU 0C7H ; POINT +ZLEFT .EQU 0CDH +2 ; LEFT$ + +; ARITHMETIC PRECEDENCE TABLE + +PRITAB: .BYTE 79H ; Precedence value + .WORD PADD ; FPREG = + FPREG + + .BYTE 79H ; Precedence value + .WORD PSUB ; FPREG = - FPREG + + .BYTE 7CH ; Precedence value + .WORD MULT ; PPREG = * FPREG + + .BYTE 7CH ; Precedence value + .WORD DIV ; FPREG = / FPREG + + .BYTE 7FH ; Precedence value + .WORD POWER ; FPREG = ^ FPREG + + .BYTE 50H ; Precedence value + .WORD PAND ; FPREG = AND FPREG + + .BYTE 46H ; Precedence value + .WORD POR ; FPREG = OR FPREG + +; BASIC ERROR CODE LIST + +ERRORS: .BYTE "NF" ; NEXT without FOR + .BYTE "SN" ; Syntax error + .BYTE "RG" ; RETURN without GOSUB + .BYTE "OD" ; Out of DATA + .BYTE "FC" ; Illegal function call + .BYTE "OV" ; Overflow error + .BYTE "OM" ; Out of memory + .BYTE "UL" ; Undefined line + .BYTE "BS" ; Bad subscript + .BYTE "DD" ; Re-DIMensioned array + .BYTE "/0" ; Division by zero + .BYTE "ID" ; Illegal direct + .BYTE "TM" ; Type mis-match + .BYTE "OS" ; Out of string space + .BYTE "LS" ; String too long + .BYTE "ST" ; String formula too complex + .BYTE "CN" ; Can't CONTinue + .BYTE "UF" ; Undefined FN function + .BYTE "MO" ; Missing operand + .BYTE "HX" ; HEX error + .BYTE "BN" ; BIN error + +; INITIALISATION TABLE ------------------------------------------------------- + +INITAB: JP WARMST ; Warm start jump + JP FCERR ; "USR (X)" jump (Set to Error) + OUT (0),A ; "OUT p,n" skeleton + RET + SUB 0 ; Division support routine + LD L,A + LD A,H + SBC A,0 + LD H,A + LD A,B + SBC A,0 + LD B,A + LD A,0 + RET + .BYTE 0,0,0 ; Random number seed table used by RND + .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07 + .BYTE 039H,01CH,076H,098H ; 1.61291E+07 + .BYTE 022H,095H,0B3H,098H ;-1.17691E+07 + .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07 + .BYTE 053H,0D1H,099H,099H ;-2-01612E+07 + .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07 + .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07 + .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07 + .BYTE 052H,0C7H,04FH,080H ; Last random number + IN A,(0) ; INP (x) skeleton + RET + .BYTE 1 ; POS (x) number (1) + .BYTE 255 ; Terminal width (255 = no auto CRLF) + .BYTE 28 ; Width for commas (3 columns) + .BYTE 0 ; No nulls after input bytes + .BYTE 0 ; Output enabled (^O off) + .WORD 20 ; Initial lines counter + .WORD 20 ; Initial lines number + .WORD 0 ; Array load/save check sum + .BYTE 0 ; Break not by NMI + .BYTE 0 ; Break flag + JP TTYLIN ; Input reflection (set to TTY) + JP $0000 ; POINT reflection unused + JP $0000 ; SET reflection + JP $0000 ; RESET reflection + .WORD STLOOK ; Temp string space + .WORD -2 ; Current line number (cold) + .WORD PROGST+1 ; Start of program text +INITBE: + +; END OF INITIALISATION TABLE --------------------------------------------------- + +ERRMSG: .BYTE " Error",0 +INMSG: .BYTE " in ",0 +ZERBYT .EQU $-1 ; A zero byte +OKMSG: .BYTE "Ok",CR,LF,0,0 +BRKMSG: .BYTE "Break",0 + +BAKSTK: LD HL,4 ; Look for "FOR" block with + ADD HL,SP ; same index as specified +LOKFOR: LD A,(HL) ; Get block ID + INC HL ; Point to index address + CP ZFOR ; Is it a "FOR" token + RET NZ ; No - exit + LD C,(HL) ; BC = Address of "FOR" index + INC HL + LD B,(HL) + INC HL ; Point to sign of STEP + PUSH HL ; Save pointer to sign + LD L,C ; HL = address of "FOR" index + LD H,B + LD A,D ; See if an index was specified + OR E ; DE = 0 if no index specified + EX DE,HL ; Specified index into HL + JP Z,INDFND ; Skip if no index given + EX DE,HL ; Index back into DE + CALL CPDEHL ; Compare index with one given +INDFND: LD BC,16-3 ; Offset to next block + POP HL ; Restore pointer to sign + RET Z ; Return if block found + ADD HL,BC ; Point to next block + JP LOKFOR ; Keep on looking + +MOVUP: CALL ENFMEM ; See if enough memory +MOVSTR: PUSH BC ; Save end of source + EX (SP),HL ; Swap source and dest" end + POP BC ; Get end of destination +MOVLP: CALL CPDEHL ; See if list moved + LD A,(HL) ; Get byte + LD (BC),A ; Move it + RET Z ; Exit if all done + DEC BC ; Next byte to move to + DEC HL ; Next byte to move + JP MOVLP ; Loop until all bytes moved + +CHKSTK: PUSH HL ; Save code string address + LD HL,(ARREND) ; Lowest free memory + LD B,0 ; BC = Number of levels to test + ADD HL,BC ; 2 Bytes for each level + ADD HL,BC + .BYTE 3EH ; Skip "PUSH HL" +ENFMEM: PUSH HL ; Save code string address + LD A,0D0H ;LOW -48 ; 48 Bytes minimum RAM + SUB L + LD L,A + LD A,0FFH; HIGH (-48) ; 48 Bytes minimum RAM + SBC A,H + JP C,OMERR ; Not enough - ?OM Error + LD H,A + ADD HL,SP ; Test if stack is overflowed + POP HL ; Restore code string address + RET C ; Return if enough mmory +OMERR: LD E,OM ; ?OM Error + JP ERROR + +DATSNR: LD HL,(DATLIN) ; Get line of current DATA item + LD (LINEAT),HL ; Save as current line +SNERR: LD E,SN ; ?SN Error + .BYTE 01H ; Skip "LD E,DZ" +DZERR: LD E,DZ ; ?/0 Error + .BYTE 01H ; Skip "LD E,NF" +NFERR: LD E,NF ; ?NF Error + .BYTE 01H ; Skip "LD E,DD" +DDERR: LD E,DD ; ?DD Error + .BYTE 01H ; Skip "LD E,UF" +UFERR: LD E,UF ; ?UF Error + .BYTE 01H ; Skip "LD E,OV +OVERR: LD E,OV ; ?OV Error + .BYTE 01H ; Skip "LD E,TM" +TMERR: LD E,TM ; ?TM Error + +ERROR: CALL CLREG ; Clear registers and stack + LD (CTLOFG),A ; Enable output (A is 0) + CALL STTLIN ; Start new line + LD HL,ERRORS ; Point to error codes + LD D,A ; D = 0 (A is 0) + LD A,'?' + CALL OUTC ; Output '?' + ADD HL,DE ; Offset to correct error code + LD A,(HL) ; First character + CALL OUTC ; Output it + CALL GETCHR ; Get next character + CALL OUTC ; Output it + LD HL,ERRMSG ; "Error" message +ERRIN: CALL PRS ; Output message + LD HL,(LINEAT) ; Get line of error + LD DE,-2 ; Cold start error if -2 + CALL CPDEHL ; See if cold start error + JP Z,CSTART ; Cold start error - Restart + LD A,H ; Was it a direct error? + AND L ; Line = -1 if direct error + INC A + CALL NZ,LINEIN ; No - output line of error + .BYTE 3EH ; Skip "POP BC" +POPNOK: POP BC ; Drop address in input buffer + +PRNTOK: XOR A ; Output "Ok" and get command + LD (CTLOFG),A ; Enable output + CALL STTLIN ; Start new line + LD HL,OKMSG ; "Ok" message + CALL PRS ; Output "Ok" +GETCMD: LD HL,-1 ; Flag direct mode + LD (LINEAT),HL ; Save as current line + CALL GETLIN ; Get an input line + JP C,GETCMD ; Get line again if break + CALL GETCHR ; Get first character + INC A ; Test if end of line + DEC A ; Without affecting Carry + JP Z,GETCMD ; Nothing entered - Get another + PUSH AF ; Save Carry status + CALL ATOH ; Get line number into DE + PUSH DE ; Save line number + CALL CRUNCH ; Tokenise rest of line + LD B,A ; Length of tokenised line + POP DE ; Restore line number + POP AF ; Restore Carry + JP NC,EXCUTE ; No line number - Direct mode + PUSH DE ; Save line number + PUSH BC ; Save length of tokenised line + XOR A + LD (LSTBIN),A ; Clear last byte input + CALL GETCHR ; Get next character + OR A ; Set flags + PUSH AF ; And save them + CALL SRCHLN ; Search for line number in DE + JP C,LINFND ; Jump if line found + POP AF ; Get status + PUSH AF ; And re-save + JP Z,ULERR ; Nothing after number - Error + OR A ; Clear Carry +LINFND: PUSH BC ; Save address of line in prog + JP NC,INEWLN ; Line not found - Insert new + EX DE,HL ; Next line address in DE + LD HL,(PROGND) ; End of program +SFTPRG: LD A,(DE) ; Shift rest of program down + LD (BC),A + INC BC ; Next destination + INC DE ; Next source + CALL CPDEHL ; All done? + JP NZ,SFTPRG ; More to do + LD H,B ; HL - New end of program + LD L,C + LD (PROGND),HL ; Update end of program + +INEWLN: POP DE ; Get address of line, + POP AF ; Get status + JP Z,SETPTR ; No text - Set up pointers + LD HL,(PROGND) ; Get end of program + EX (SP),HL ; Get length of input line + POP BC ; End of program to BC + ADD HL,BC ; Find new end + PUSH HL ; Save new end + CALL MOVUP ; Make space for line + POP HL ; Restore new end + LD (PROGND),HL ; Update end of program pointer + EX DE,HL ; Get line to move up in HL + LD (HL),H ; Save MSB + POP DE ; Get new line number + INC HL ; Skip pointer + INC HL + LD (HL),E ; Save LSB of line number + INC HL + LD (HL),D ; Save MSB of line number + INC HL ; To first byte in line + LD DE,BUFFER ; Copy buffer to program +MOVBUF: LD A,(DE) ; Get source + LD (HL),A ; Save destinations + INC HL ; Next source + INC DE ; Next destination + OR A ; Done? + JP NZ,MOVBUF ; No - Repeat +SETPTR: CALL RUNFST ; Set line pointers + INC HL ; To LSB of pointer + EX DE,HL ; Address to DE +PTRLP: LD H,D ; Address to HL + LD L,E + LD A,(HL) ; Get LSB of pointer + INC HL ; To MSB of pointer + OR (HL) ; Compare with MSB pointer + JP Z,GETCMD ; Get command line if end + INC HL ; To LSB of line number + INC HL ; Skip line number + INC HL ; Point to first byte in line + XOR A ; Looking for 00 byte +FNDEND: CP (HL) ; Found end of line? + INC HL ; Move to next byte + JP NZ,FNDEND ; No - Keep looking + EX DE,HL ; Next line address to HL + LD (HL),E ; Save LSB of pointer + INC HL + LD (HL),D ; Save MSB of pointer + JP PTRLP ; Do next line + +SRCHLN: LD HL,(BASTXT) ; Start of program text +SRCHLP: LD B,H ; BC = Address to look at + LD C,L + LD A,(HL) ; Get address of next line + INC HL + OR (HL) ; End of program found? + DEC HL + RET Z ; Yes - Line not found + INC HL + INC HL + LD A,(HL) ; Get LSB of line number + INC HL + LD H,(HL) ; Get MSB of line number + LD L,A + CALL CPDEHL ; Compare with line in DE + LD H,B ; HL = Start of this line + LD L,C + LD A,(HL) ; Get LSB of next line address + INC HL + LD H,(HL) ; Get MSB of next line address + LD L,A ; Next line to HL + CCF + RET Z ; Lines found - Exit + CCF + RET NC ; Line not found,at line after + JP SRCHLP ; Keep looking + +NEW: RET NZ ; Return if any more on line +CLRPTR: LD HL,(BASTXT) ; Point to start of program + XOR A ; Set program area to empty + LD (HL),A ; Save LSB = 00 + INC HL + LD (HL),A ; Save MSB = 00 + INC HL + LD (PROGND),HL ; Set program end + +RUNFST: LD HL,(BASTXT) ; Clear all variables + DEC HL + +INTVAR: LD (BRKLIN),HL ; Initialise RUN variables + LD HL,(LSTRAM) ; Get end of RAM + LD (STRBOT),HL ; Clear string space + XOR A + CALL RESTOR ; Reset DATA pointers + LD HL,(PROGND) ; Get end of program + LD (VAREND),HL ; Clear variables + LD (ARREND),HL ; Clear arrays + +CLREG: POP BC ; Save return address + LD HL,(STRSPC) ; Get end of working RAN + LD SP,HL ; Set stack + LD HL,TMSTPL ; Temporary string pool + LD (TMSTPT),HL ; Reset temporary string ptr + XOR A ; A = 00 + LD L,A ; HL = 0000 + LD H,A + LD (CONTAD),HL ; No CONTinue + LD (FORFLG),A ; Clear FOR flag + LD (FNRGNM),HL ; Clear FN argument + PUSH HL ; HL = 0000 + PUSH BC ; Put back return +DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN + RET ; Return to execution driver + +PROMPT: LD A,'?' ; '?' + CALL OUTC ; Output character + LD A,' ' ; Space + CALL OUTC ; Output character + JP RINPUT ; Get input line + +CRUNCH: XOR A ; Tokenise line @ HL to BUFFER + LD (DATFLG),A ; Reset literal flag + LD C,2+3 ; 2 byte number and 3 nulls + LD DE,BUFFER ; Start of input buffer +CRNCLP: LD A,(HL) ; Get byte + CP ' ' ; Is it a space? + JP Z,MOVDIR ; Yes - Copy direct + LD B,A ; Save character + CP '"' ; Is it a quote? + JP Z,CPYLIT ; Yes - Copy literal string + OR A ; Is it end of buffer? + JP Z,ENDBUF ; Yes - End buffer + LD A,(DATFLG) ; Get data type + OR A ; Literal? + LD A,(HL) ; Get byte to copy + JP NZ,MOVDIR ; Literal - Copy direct + CP '?' ; Is it '?' short for PRINT + LD A,ZPRINT ; "PRINT" token + JP Z,MOVDIR ; Yes - replace it + LD A,(HL) ; Get byte again + CP '0' ; Is it less than '0' + JP C,FNDWRD ; Yes - Look for reserved words + CP 60; ";"+1 ; Is it "0123456789:;" ? + JP C,MOVDIR ; Yes - copy it direct +FNDWRD: PUSH DE ; Look for reserved words + LD DE,WORDS-1 ; Point to table + PUSH BC ; Save count + LD BC,RETNAD ; Where to return to + PUSH BC ; Save return address + LD B,ZEND-1 ; First token value -1 + LD A,(HL) ; Get byte + CP 'a' ; Less than 'a' ? + JP C,SEARCH ; Yes - search for words + CP 'z'+1 ; Greater than 'z' ? + JP NC,SEARCH ; Yes - search for words + AND 01011111B ; Force upper case + LD (HL),A ; Replace byte +SEARCH: LD C,(HL) ; Search for a word + EX DE,HL +GETNXT: INC HL ; Get next reserved word + OR (HL) ; Start of word? + JP P,GETNXT ; No - move on + INC B ; Increment token value + LD A, (HL) ; Get byte from table + AND 01111111B ; Strip bit 7 + RET Z ; Return if end of list + CP C ; Same character as in buffer? + JP NZ,GETNXT ; No - get next word + EX DE,HL + PUSH HL ; Save start of word + +NXTBYT: INC DE ; Look through rest of word + LD A,(DE) ; Get byte from table + OR A ; End of word ? + JP M,MATCH ; Yes - Match found + LD C,A ; Save it + LD A,B ; Get token value + CP ZGOTO ; Is it "GOTO" token ? + JP NZ,NOSPC ; No - Don't allow spaces + CALL GETCHR ; Get next character + DEC HL ; Cancel increment from GETCHR +NOSPC: INC HL ; Next byte + LD A,(HL) ; Get byte + CP 'a' ; Less than 'a' ? + JP C,NOCHNG ; Yes - don't change + AND 01011111B ; Make upper case +NOCHNG: CP C ; Same as in buffer ? + JP Z,NXTBYT ; Yes - keep testing + POP HL ; Get back start of word + JP SEARCH ; Look at next word + +MATCH: LD C,B ; Word found - Save token value + POP AF ; Throw away return + EX DE,HL + RET ; Return to "RETNAD" +RETNAD: EX DE,HL ; Get address in string + LD A,C ; Get token value + POP BC ; Restore buffer length + POP DE ; Get destination address +MOVDIR: INC HL ; Next source in buffer + LD (DE),A ; Put byte in buffer + INC DE ; Move up buffer + INC C ; Increment length of buffer + SUB ':' ; End of statement? + JP Z,SETLIT ; Jump if multi-statement line + CP ZDATA-3AH ; Is it DATA statement ? + JP NZ,TSTREM ; No - see if REM +SETLIT: LD (DATFLG),A ; Set literal flag +TSTREM: SUB ZREM-3AH ; Is it REM? + JP NZ,CRNCLP ; No - Leave flag + LD B,A ; Copy rest of buffer +NXTCHR: LD A,(HL) ; Get byte + OR A ; End of line ? + JP Z,ENDBUF ; Yes - Terminate buffer + CP B ; End of statement ? + JP Z,MOVDIR ; Yes - Get next one +CPYLIT: INC HL ; Move up source string + LD (DE),A ; Save in destination + INC C ; Increment length + INC DE ; Move up destination + JP NXTCHR ; Repeat + +ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer + LD (DE),A ; Mark end of buffer (A = 00) + INC DE + LD (DE),A ; A = 00 + INC DE + LD (DE),A ; A = 00 + RET + +DODEL: LD A,(NULFLG) ; Get null flag status + OR A ; Is it zero? + LD A,0 ; Zero A - Leave flags + LD (NULFLG),A ; Zero null flag + JP NZ,ECHDEL ; Set - Echo it + DEC B ; Decrement length + JP Z,GETLIN ; Get line again if empty + CALL OUTC ; Output null character + .BYTE 3EH ; Skip "DEC B" +ECHDEL: DEC B ; Count bytes in buffer + DEC HL ; Back space buffer + JP Z,OTKLN ; No buffer - Try again + LD A,(HL) ; Get deleted byte + CALL OUTC ; Echo it + JP MORINP ; Get more input + +DELCHR: DEC B ; Count bytes in buffer + DEC HL ; Back space buffer + CALL OUTC ; Output character in A + JP NZ,MORINP ; Not end - Get more +OTKLN: CALL OUTC ; Output character in A +KILIN: CALL PRNTCRLF ; Output CRLF + JP TTYLIN ; Get line again + +GETLIN: +TTYLIN: LD HL,BUFFER ; Get a line by character + LD B,1 ; Set buffer as empty + XOR A + LD (NULFLG),A ; Clear null flag +MORINP: CALL CLOTST ; Get character and test ^O + LD C,A ; Save character in C + CP DEL ; Delete character? + JP Z,DODEL ; Yes - Process it + LD A,(NULFLG) ; Get null flag + OR A ; Test null flag status + JP Z,PROCES ; Reset - Process character + LD A,0 ; Set a null + CALL OUTC ; Output null + XOR A ; Clear A + LD (NULFLG),A ; Reset null flag +PROCES: LD A,C ; Get character + CP CTRLG ; Bell? + JP Z,PUTCTL ; Yes - Save it + CP CTRLC ; Is it control "C"? + CALL Z,PRNTCRLF ; Yes - Output CRLF + SCF ; Flag break + RET Z ; Return if control "C" + CP CR ; Is it enter? + JP Z,ENDINP ; Yes - Terminate input + CP CTRLU ; Is it control "U"? + JP Z,KILIN ; Yes - Get another line + CP '@' ; Is it "kill line"? + JP Z,OTKLN ; Yes - Kill line + CP '_' ; Is it delete? + JP Z,DELCHR ; Yes - Delete character + CP BKSP ; Is it backspace? + JP Z,DELCHR ; Yes - Delete character + CP CTRLR ; Is it control "R"? + JP NZ,PUTBUF ; No - Put in buffer + PUSH BC ; Save buffer length + PUSH DE ; Save DE + PUSH HL ; Save buffer address + LD (HL),0 ; Mark end of buffer + CALL OUTNCR ; Output and do CRLF + LD HL,BUFFER ; Point to buffer start + CALL PRS ; Output buffer + POP HL ; Restore buffer address + POP DE ; Restore DE + POP BC ; Restore buffer length + JP MORINP ; Get another character + +PUTBUF: CP ' ' ; Is it a control code? + JP C,MORINP ; Yes - Ignore +PUTCTL: LD A,B ; Get number of bytes in buffer + CP 72+1 ; Test for line overflow + LD A,CTRLG ; Set a bell + JP NC,OUTNBS ; Ring bell if buffer full + LD A,C ; Get character + LD (HL),C ; Save in buffer + LD (LSTBIN),A ; Save last input byte + INC HL ; Move up buffer + INC B ; Increment length +OUTIT: CALL OUTC ; Output the character entered + JP MORINP ; Get another character + +OUTNBS: CALL OUTC ; Output bell and back over it + LD A,BKSP ; Set back space + JP OUTIT ; Output it and get more + +CPDEHL: LD A,H ; Get H + SUB D ; Compare with D + RET NZ ; Different - Exit + LD A,L ; Get L + SUB E ; Compare with E + RET ; Return status + +CHKSYN: LD A,(HL) ; Check syntax of character + EX (SP),HL ; Address of test byte + CP (HL) ; Same as in code string? + INC HL ; Return address + EX (SP),HL ; Put it back + JP Z,GETCHR ; Yes - Get next character + JP SNERR ; Different - ?SN Error + +OUTC: PUSH AF ; Save character + LD A,(CTLOFG) ; Get control "O" flag + OR A ; Is it set? + JP NZ,POPAF ; Yes - don't output + POP AF ; Restore character + PUSH BC ; Save buffer length + PUSH AF ; Save character + CP ' ' ; Is it a control code? + JP C,DINPOS ; Yes - Don't INC POS(X) + LD A,(LWIDTH) ; Get line width + LD B,A ; To B + LD A,(CURPOS) ; Get cursor position + INC B ; Width 255? + JP Z,INCLEN ; Yes - No width limit + DEC B ; Restore width + CP B ; At end of line? + CALL Z,PRNTCRLF ; Yes - output CRLF +INCLEN: INC A ; Move on one character + LD (CURPOS),A ; Save new position +DINPOS: POP AF ; Restore character + POP BC ; Restore buffer length + CALL MONOUT ; Send it + RET + +CLOTST: CALL GETINP ; Get input character + AND 01111111B ; Strip bit 7 + CP CTRLO ; Is it control "O"? + RET NZ ; No don't flip flag + LD A,(CTLOFG) ; Get flag + CPL ; Flip it + LD (CTLOFG),A ; Put it back + XOR A ; Null character + RET + +LIST: CALL ATOH ; ASCII number to DE + RET NZ ; Return if anything extra + POP BC ; Rubbish - Not needed + CALL SRCHLN ; Search for line number in DE + PUSH BC ; Save address of line + CALL SETLIN ; Set up lines counter +LISTLP: POP HL ; Restore address of line + LD C,(HL) ; Get LSB of next line + INC HL + LD B,(HL) ; Get MSB of next line + INC HL + LD A,B ; BC = 0 (End of program)? + OR C + JP Z,PRNTOK ; Yes - Go to command mode + CALL COUNT ; Count lines + CALL TSTBRK ; Test for break key + PUSH BC ; Save address of next line + CALL PRNTCRLF ; Output CRLF + LD E,(HL) ; Get LSB of line number + INC HL + LD D,(HL) ; Get MSB of line number + INC HL + PUSH HL ; Save address of line start + EX DE,HL ; Line number to HL + CALL PRNTHL ; Output line number in decimal + LD A,' ' ; Space after line number + POP HL ; Restore start of line address +LSTLP2: CALL OUTC ; Output character in A +LSTLP3: LD A,(HL) ; Get next byte in line + OR A ; End of line? + INC HL ; To next byte in line + JP Z,LISTLP ; Yes - get next line + JP P,LSTLP2 ; No token - output it + SUB ZEND-1 ; Find and output word + LD C,A ; Token offset+1 to C + LD DE,WORDS ; Reserved word list +FNDTOK: LD A,(DE) ; Get character in list + INC DE ; Move on to next + OR A ; Is it start of word? + JP P,FNDTOK ; No - Keep looking for word + DEC C ; Count words + JP NZ,FNDTOK ; Not there - keep looking +OUTWRD: AND 01111111B ; Strip bit 7 + CALL OUTC ; Output first character + LD A,(DE) ; Get next character + INC DE ; Move on to next + OR A ; Is it end of word? + JP P,OUTWRD ; No - output the rest + JP LSTLP3 ; Next byte in line + +SETLIN: PUSH HL ; Set up LINES counter + LD HL,(LINESN) ; Get LINES number + LD (LINESC),HL ; Save in LINES counter + POP HL + RET + +COUNT: PUSH HL ; Save code string address + PUSH DE + LD HL,(LINESC) ; Get LINES counter + LD DE,-1 + ADC HL,DE ; Decrement + LD (LINESC),HL ; Put it back + POP DE + POP HL ; Restore code string address + RET P ; Return if more lines to go + PUSH HL ; Save code string address + LD HL,(LINESN) ; Get LINES number + LD (LINESC),HL ; Reset LINES counter + CALL GETINP ; Get input character + CP CTRLC ; Is it control "C"? + JP Z,RSLNBK ; Yes - Reset LINES and break + POP HL ; Restore code string address + JP COUNT ; Keep on counting + +RSLNBK: LD HL,(LINESN) ; Get LINES number + LD (LINESC),HL ; Reset LINES counter + JP BRKRET ; Go and output "Break" + +FOR: LD A,64H ; Flag "FOR" assignment + LD (FORFLG),A ; Save "FOR" flag + CALL LET ; Set up initial index + POP BC ; Drop RETurn address + PUSH HL ; Save code string address + CALL DATA ; Get next statement address + LD (LOOPST),HL ; Save it for start of loop + LD HL,2 ; Offset for "FOR" block + ADD HL,SP ; Point to it +FORSLP: CALL LOKFOR ; Look for existing "FOR" block + POP DE ; Get code string address + JP NZ,FORFND ; No nesting found + ADD HL,BC ; Move into "FOR" block + PUSH DE ; Save code string address + DEC HL + LD D,(HL) ; Get MSB of loop statement + DEC HL + LD E,(HL) ; Get LSB of loop statement + INC HL + INC HL + PUSH HL ; Save block address + LD HL,(LOOPST) ; Get address of loop statement + CALL CPDEHL ; Compare the FOR loops + POP HL ; Restore block address + JP NZ,FORSLP ; Different FORs - Find another + POP DE ; Restore code string address + LD SP,HL ; Remove all nested loops + +FORFND: EX DE,HL ; Code string address to HL + LD C,8 + CALL CHKSTK ; Check for 8 levels of stack + PUSH HL ; Save code string address + LD HL,(LOOPST) ; Get first statement of loop + EX (SP),HL ; Save and restore code string + PUSH HL ; Re-save code string address + LD HL,(LINEAT) ; Get current line number + EX (SP),HL ; Save and restore code string + CALL TSTNUM ; Make sure it's a number + CALL CHKSYN ; Make sure "TO" is next + .BYTE ZTO ; "TO" token + CALL GETNUM ; Get "TO" expression value + PUSH HL ; Save code string address + CALL BCDEFP ; Move "TO" value to BCDE + POP HL ; Restore code string address + PUSH BC ; Save "TO" value in block + PUSH DE + LD BC,8100H ; BCDE - 1 (default STEP) + LD D,C ; C=0 + LD E,D ; D=0 + LD A,(HL) ; Get next byte in code string + CP ZSTEP ; See if "STEP" is stated + LD A,1 ; Sign of step = 1 + JP NZ,SAVSTP ; No STEP given - Default to 1 + CALL GETCHR ; Jump over "STEP" token + CALL GETNUM ; Get step value + PUSH HL ; Save code string address + CALL BCDEFP ; Move STEP to BCDE + CALL TSTSGN ; Test sign of FPREG + POP HL ; Restore code string address +SAVSTP: PUSH BC ; Save the STEP value in block + PUSH DE + PUSH AF ; Save sign of STEP + INC SP ; Don't save flags + PUSH HL ; Save code string address + LD HL,(BRKLIN) ; Get address of index variable + EX (SP),HL ; Save and restore code string +PUTFID: LD B,ZFOR ; "FOR" block marker + PUSH BC ; Save it + INC SP ; Don't save C + +RUNCNT: CALL TSTBRK ; Execution driver - Test break + LD (BRKLIN),HL ; Save code address for break + LD A,(HL) ; Get next byte in code string + CP ':' ; Multi statement line? + JP Z,EXCUTE ; Yes - Execute it + OR A ; End of line? + JP NZ,SNERR ; No - Syntax error + INC HL ; Point to address of next line + LD A,(HL) ; Get LSB of line pointer + INC HL + OR (HL) ; Is it zero (End of prog)? + JP Z,ENDPRG ; Yes - Terminate execution + INC HL ; Point to line number + LD E,(HL) ; Get LSB of line number + INC HL + LD D,(HL) ; Get MSB of line number + EX DE,HL ; Line number to HL + LD (LINEAT),HL ; Save as current line number + EX DE,HL ; Line number back to DE +EXCUTE: CALL GETCHR ; Get key word + LD DE,RUNCNT ; Where to RETurn to + PUSH DE ; Save for RETurn +IFJMP: RET Z ; Go to RUNCNT if end of STMT +ONJMP: SUB ZEND ; Is it a token? + JP C,LET ; No - try to assign it + CP ZNEW+1-ZEND ; END to NEW ? + JP NC,SNERR ; Not a key word - ?SN Error + RLCA ; Double it + LD C,A ; BC = Offset into table + LD B,0 + EX DE,HL ; Save code string address + LD HL,WORDTB ; Keyword address table + ADD HL,BC ; Point to routine address + LD C,(HL) ; Get LSB of routine address + INC HL + LD B,(HL) ; Get MSB of routine address + PUSH BC ; Save routine address + EX DE,HL ; Restore code string address + +GETCHR: INC HL ; Point to next character + LD A,(HL) ; Get next code string byte + CP ':' ; Z if ':' + RET NC ; NC if > "9" + CP ' ' + JP Z,GETCHR ; Skip over spaces + CP '0' + CCF ; NC if < '0' + INC A ; Test for zero - Leave carry + DEC A ; Z if Null + RET + +RESTOR: EX DE,HL ; Save code string address + LD HL,(BASTXT) ; Point to start of program + JP Z,RESTNL ; Just RESTORE - reset pointer + EX DE,HL ; Restore code string address + CALL ATOH ; Get line number to DE + PUSH HL ; Save code string address + CALL SRCHLN ; Search for line number in DE + LD H,B ; HL = Address of line + LD L,C + POP DE ; Restore code string address + JP NC,ULERR ; ?UL Error if not found +RESTNL: DEC HL ; Byte before DATA statement +UPDATA: LD (NXTDAT),HL ; Update DATA pointer + EX DE,HL ; Restore code string address + RET + + +TSTBRK: RST 18H ; Check input status + RET Z ; No key, go back + RST 10H ; Get the key into A + CP ESC ; Escape key? + JR Z,BRK ; Yes, break + CP CTRLC ; + JR Z,BRK ; Yes, break + CP CTRLS ; Stop scrolling? + RET NZ ; Other key, ignore + + +STALL: RST 10H ; Wait for key + CP CTRLQ ; Resume scrolling? + RET Z ; Release the chokehold + CP CTRLC ; Second break? + JR Z,STOP ; Break during hold exits prog + JR STALL ; Loop until or + +BRK LD A,$FF ; Set BRKFLG + LD (BRKFLG),A ; Store it + + +STOP: RET NZ ; Exit if anything else + .BYTE 0F6H ; Flag "STOP" +PEND: RET NZ ; Exit if anything else + LD (BRKLIN),HL ; Save point of break + .BYTE 21H ; Skip "OR 11111111B" +INPBRK: OR 11111111B ; Flag "Break" wanted + POP BC ; Return not needed and more +ENDPRG: LD HL,(LINEAT) ; Get current line number + PUSH AF ; Save STOP / END status + LD A,L ; Is it direct break? + AND H + INC A ; Line is -1 if direct break + JP Z,NOLIN ; Yes - No line number + LD (ERRLIN),HL ; Save line of break + LD HL,(BRKLIN) ; Get point of break + LD (CONTAD),HL ; Save point to CONTinue +NOLIN: XOR A + LD (CTLOFG),A ; Enable output + CALL STTLIN ; Start a new line + POP AF ; Restore STOP / END status + LD HL,BRKMSG ; "Break" message + JP NZ,ERRIN ; "in line" wanted? + JP PRNTOK ; Go to command mode + +CONT: LD HL,(CONTAD) ; Get CONTinue address + LD A,H ; Is it zero? + OR L + LD E,CN ; ?CN Error + JP Z,ERROR ; Yes - output "?CN Error" + EX DE,HL ; Save code string address + LD HL,(ERRLIN) ; Get line of last break + LD (LINEAT),HL ; Set up current line number + EX DE,HL ; Restore code string address + RET ; CONTinue where left off + +NULL: CALL GETINT ; Get integer 0-255 + RET NZ ; Return if bad value + LD (NULLS),A ; Set nulls number + RET + + +ACCSUM: PUSH HL ; Save address in array + LD HL,(CHKSUM) ; Get check sum + LD B,0 ; BC - Value of byte + LD C,A + ADD HL,BC ; Add byte to check sum + LD (CHKSUM),HL ; Re-save check sum + POP HL ; Restore address in array + RET + +CHKLTR: LD A,(HL) ; Get byte + CP 'A' ; < 'a' ? + RET C ; Carry set if not letter + CP 'Z'+1 ; > 'z' ? + CCF + RET ; Carry set if not letter + +FPSINT: CALL GETCHR ; Get next character +POSINT: CALL GETNUM ; Get integer 0 to 32767 +DEPINT: CALL TSTSGN ; Test sign of FPREG + JP M,FCERR ; Negative - ?FC Error +DEINT: LD A,(FPEXP) ; Get integer value to DE + CP 80H+16 ; Exponent in range (16 bits)? + JP C,FPINT ; Yes - convert it + LD BC,9080H ; BCDE = -32768 + LD DE,0000 + PUSH HL ; Save code string address + CALL CMPNUM ; Compare FPREG with BCDE + POP HL ; Restore code string address + LD D,C ; MSB to D + RET Z ; Return if in range +FCERR: LD E,FC ; ?FC Error + JP ERROR ; Output error- + +ATOH: DEC HL ; ASCII number to DE binary +GETLN: LD DE,0 ; Get number to DE +GTLNLP: CALL GETCHR ; Get next character + RET NC ; Exit if not a digit + PUSH HL ; Save code string address + PUSH AF ; Save digit + LD HL,65529/10 ; Largest number 65529 + CALL CPDEHL ; Number in range? + JP C,SNERR ; No - ?SN Error + LD H,D ; HL = Number + LD L,E + ADD HL,DE ; Times 2 + ADD HL,HL ; Times 4 + ADD HL,DE ; Times 5 + ADD HL,HL ; Times 10 + POP AF ; Restore digit + SUB '0' ; Make it 0 to 9 + LD E,A ; DE = Value of digit + LD D,0 + ADD HL,DE ; Add to number + EX DE,HL ; Number to DE + POP HL ; Restore code string address + JP GTLNLP ; Go to next character + +CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters + CALL POSINT ; Get integer 0 to 32767 to DE + DEC HL ; Cancel increment + CALL GETCHR ; Get next character + PUSH HL ; Save code string address + LD HL,(LSTRAM) ; Get end of RAM + JP Z,STORED ; No value given - Use stored + POP HL ; Restore code string address + CALL CHKSYN ; Check for comma + .BYTE ',' + PUSH DE ; Save number + CALL POSINT ; Get integer 0 to 32767 + DEC HL ; Cancel increment + CALL GETCHR ; Get next character + JP NZ,SNERR ; ?SN Error if more on line + EX (SP),HL ; Save code string address + EX DE,HL ; Number to DE +STORED: LD A,L ; Get LSB of new RAM top + SUB E ; Subtract LSB of string space + LD E,A ; Save LSB + LD A,H ; Get MSB of new RAM top + SBC A,D ; Subtract MSB of string space + LD D,A ; Save MSB + JP C,OMERR ; ?OM Error if not enough mem + PUSH HL ; Save RAM top + LD HL,(PROGND) ; Get program end + LD BC,40 ; 40 Bytes minimum working RAM + ADD HL,BC ; Get lowest address + CALL CPDEHL ; Enough memory? + JP NC,OMERR ; No - ?OM Error + EX DE,HL ; RAM top to HL + LD (STRSPC),HL ; Set new string space + POP HL ; End of memory to use + LD (LSTRAM),HL ; Set new top of RAM + POP HL ; Restore code string address + JP INTVAR ; Initialise variables + +RUN: JP Z,RUNFST ; RUN from start if just RUN + CALL INTVAR ; Initialise variables + LD BC,RUNCNT ; Execution driver loop + JP RUNLIN ; RUN from line number + +GOSUB: LD C,3 ; 3 Levels of stack needed + CALL CHKSTK ; Check for 3 levels of stack + POP BC ; Get return address + PUSH HL ; Save code string for RETURN + PUSH HL ; And for GOSUB routine + LD HL,(LINEAT) ; Get current line + EX (SP),HL ; Into stack - Code string out + LD A,ZGOSUB ; "GOSUB" token + PUSH AF ; Save token + INC SP ; Don't save flags + +RUNLIN: PUSH BC ; Save return address +GOTO: CALL ATOH ; ASCII number to DE binary + CALL REM ; Get end of line + PUSH HL ; Save end of line + LD HL,(LINEAT) ; Get current line + CALL CPDEHL ; Line after current? + POP HL ; Restore end of line + INC HL ; Start of next line + CALL C,SRCHLP ; Line is after current line + CALL NC,SRCHLN ; Line is before current line + LD H,B ; Set up code string address + LD L,C + DEC HL ; Incremented after + RET C ; Line found +ULERR: LD E,UL ; ?UL Error + JP ERROR ; Output error message + +RETURN: RET NZ ; Return if not just RETURN + LD D,-1 ; Flag "GOSUB" search + CALL BAKSTK ; Look "GOSUB" block + LD SP,HL ; Kill all FORs in subroutine + CP ZGOSUB ; Test for "GOSUB" token + LD E,RG ; ?RG Error + JP NZ,ERROR ; Error if no "GOSUB" found + POP HL ; Get RETURN line number + LD (LINEAT),HL ; Save as current + INC HL ; Was it from direct statement? + LD A,H + OR L ; Return to line + JP NZ,RETLIN ; No - Return to line + LD A,(LSTBIN) ; Any INPUT in subroutine? + OR A ; If so buffer is corrupted + JP NZ,POPNOK ; Yes - Go to command mode +RETLIN: LD HL,RUNCNT ; Execution driver loop + EX (SP),HL ; Into stack - Code string out + .BYTE 3EH ; Skip "POP HL" +NXTDTA: POP HL ; Restore code string address + +DATA: .BYTE 01H,3AH ; ':' End of statement +REM: LD C,0 ; 00 End of statement + LD B,0 +NXTSTL: LD A,C ; Statement and byte + LD C,B + LD B,A ; Statement end byte +NXTSTT: LD A,(HL) ; Get byte + OR A ; End of line? + RET Z ; Yes - Exit + CP B ; End of statement? + RET Z ; Yes - Exit + INC HL ; Next byte + CP '"' ; Literal string? + JP Z,NXTSTL ; Yes - Look for another '"' + JP NXTSTT ; Keep looking + +LET: CALL GETVAR ; Get variable name + CALL CHKSYN ; Make sure "=" follows + .BYTE ZEQUAL ; "=" token + PUSH DE ; Save address of variable + LD A,(TYPE) ; Get data type + PUSH AF ; Save type + CALL EVAL ; Evaluate expression + POP AF ; Restore type + EX (SP),HL ; Save code - Get var addr + LD (BRKLIN),HL ; Save address of variable + RRA ; Adjust type + CALL CHKTYP ; Check types are the same + JP Z,LETNUM ; Numeric - Move value +LETSTR: PUSH HL ; Save address of string var + LD HL,(FPREG) ; Pointer to string entry + PUSH HL ; Save it on stack + INC HL ; Skip over length + INC HL + LD E,(HL) ; LSB of string address + INC HL + LD D,(HL) ; MSB of string address + LD HL,(BASTXT) ; Point to start of program + CALL CPDEHL ; Is string before program? + JP NC,CRESTR ; Yes - Create string entry + LD HL,(STRSPC) ; Point to string space + CALL CPDEHL ; Is string literal in program? + POP DE ; Restore address of string + JP NC,MVSTPT ; Yes - Set up pointer + LD HL,TMPSTR ; Temporary string pool + CALL CPDEHL ; Is string in temporary pool? + JP NC,MVSTPT ; No - Set up pointer + .BYTE 3EH ; Skip "POP DE" +CRESTR: POP DE ; Restore address of string + CALL BAKTMP ; Back to last tmp-str entry + EX DE,HL ; Address of string entry + CALL SAVSTR ; Save string in string area +MVSTPT: CALL BAKTMP ; Back to last tmp-str entry + POP HL ; Get string pointer + CALL DETHL4 ; Move string pointer to var + POP HL ; Restore code string address + RET + +LETNUM: PUSH HL ; Save address of variable + CALL FPTHL ; Move value to variable + POP DE ; Restore address of variable + POP HL ; Restore code string address + RET + +ON: CALL GETINT ; Get integer 0-255 + LD A,(HL) ; Get "GOTO" or "GOSUB" token + LD B,A ; Save in B + CP ZGOSUB ; "GOSUB" token? + JP Z,ONGO ; Yes - Find line number + CALL CHKSYN ; Make sure it's "GOTO" + .BYTE ZGOTO ; "GOTO" token + DEC HL ; Cancel increment +ONGO: LD C,E ; Integer of branch value +ONGOLP: DEC C ; Count branches + LD A,B ; Get "GOTO" or "GOSUB" token + JP Z,ONJMP ; Go to that line if right one + CALL GETLN ; Get line number to DE + CP ',' ; Another line number? + RET NZ ; No - Drop through + JP ONGOLP ; Yes - loop + +IF: CALL EVAL ; Evaluate expression + LD A,(HL) ; Get token + CP ZGOTO ; "GOTO" token? + JP Z,IFGO ; Yes - Get line + CALL CHKSYN ; Make sure it's "THEN" + .BYTE ZTHEN ; "THEN" token + DEC HL ; Cancel increment +IFGO: CALL TSTNUM ; Make sure it's numeric + CALL TSTSGN ; Test state of expression + JP Z,REM ; False - Drop through + CALL GETCHR ; Get next character + JP C,GOTO ; Number - GOTO that line + JP IFJMP ; Otherwise do statement + +MRPRNT: DEC HL ; DEC 'cos GETCHR INCs + CALL GETCHR ; Get next character +PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT +PRNTLP: RET Z ; End of list - Exit + CP ZTAB ; "TAB(" token? + JP Z,DOTAB ; Yes - Do TAB routine + CP ZSPC ; "SPC(" token? + JP Z,DOTAB ; Yes - Do SPC routine + PUSH HL ; Save code string address + CP ',' ; Comma? + JP Z,DOCOM ; Yes - Move to next zone + CP 59 ;";" ; Semi-colon? + JP Z,NEXITM ; Do semi-colon routine + POP BC ; Code string address to BC + CALL EVAL ; Evaluate expression + PUSH HL ; Save code string address + LD A,(TYPE) ; Get variable type + OR A ; Is it a string variable? + JP NZ,PRNTST ; Yes - Output string contents + CALL NUMASC ; Convert number to text + CALL CRTST ; Create temporary string + LD (HL),' ' ; Followed by a space + LD HL,(FPREG) ; Get length of output + INC (HL) ; Plus 1 for the space + LD HL,(FPREG) ; < Not needed > + LD A,(LWIDTH) ; Get width of line + LD B,A ; To B + INC B ; Width 255 (No limit)? + JP Z,PRNTNB ; Yes - Output number string + INC B ; Adjust it + LD A,(CURPOS) ; Get cursor position + ADD A,(HL) ; Add length of string + DEC A ; Adjust it + CP B ; Will output fit on this line? + CALL NC,PRNTCRLF ; No - CRLF first +PRNTNB: CALL PRS1 ; Output string at (HL) + XOR A ; Skip CALL by setting 'z' flag +PRNTST: CALL NZ,PRS1 ; Output string at (HL) + POP HL ; Restore code string address + JP MRPRNT ; See if more to PRINT + +STTLIN: LD A,(CURPOS) ; Make sure on new line + OR A ; Already at start? + RET Z ; Yes - Do nothing + JP PRNTCRLF ; Start a new line + +ENDINP: LD (HL),0 ; Mark end of buffer + LD HL,BUFFER-1 ; Point to buffer +PRNTCRLF: LD A,CR ; Load a CR + CALL OUTC ; Output character + LD A,LF ; Load a LF + CALL OUTC ; Output character +DONULL: XOR A ; Set to position 0 + LD (CURPOS),A ; Store it + LD A,(NULLS) ; Get number of nulls +NULLP: DEC A ; Count them + RET Z ; Return if done + PUSH AF ; Save count + XOR A ; Load a null + CALL OUTC ; Output it + POP AF ; Restore count + JP NULLP ; Keep counting + +DOCOM: LD A,(COMMAN) ; Get comma width + LD B,A ; Save in B + LD A,(CURPOS) ; Get current position + CP B ; Within the limit? + CALL NC,PRNTCRLF ; No - output CRLF + JP NC,NEXITM ; Get next item +ZONELP: SUB 14 ; Next zone of 14 characters + JP NC,ZONELP ; Repeat if more zones + CPL ; Number of spaces to output + JP ASPCS ; Output them + +DOTAB: PUSH AF ; Save token + CALL FNDNUM ; Evaluate expression + CALL CHKSYN ; Make sure ")" follows + .BYTE ")" + DEC HL ; Back space on to ")" + POP AF ; Restore token + SUB ZSPC ; Was it "SPC(" ? + PUSH HL ; Save code string address + JP Z,DOSPC ; Yes - Do 'E' spaces + LD A,(CURPOS) ; Get current position +DOSPC: CPL ; Number of spaces to print to + ADD A,E ; Total number to print + JP NC,NEXITM ; TAB < Current POS(X) +ASPCS: INC A ; Output A spaces + LD B,A ; Save number to print + LD A,' ' ; Space +SPCLP: CALL OUTC ; Output character in A + DEC B ; Count them + JP NZ,SPCLP ; Repeat if more +NEXITM: POP HL ; Restore code string address + CALL GETCHR ; Get next character + JP PRNTLP ; More to print + +REDO: .BYTE "?Redo from start",CR,LF,0 + +BADINP: LD A,(READFG) ; READ or INPUT? + OR A + JP NZ,DATSNR ; READ - ?SN Error + POP BC ; Throw away code string addr + LD HL,REDO ; "Redo from start" message + CALL PRS ; Output string + JP DOAGN ; Do last INPUT again + +INPUT: CALL IDTEST ; Test for illegal direct + LD A,(HL) ; Get character after "INPUT" + CP '"' ; Is there a prompt string? + LD A,0 ; Clear A and leave flags + LD (CTLOFG),A ; Enable output + JP NZ,NOPMPT ; No prompt - get input + CALL QTSTR ; Get string terminated by '"' + CALL CHKSYN ; Check for ';' after prompt + .BYTE ';' + PUSH HL ; Save code string address + CALL PRS1 ; Output prompt string + .BYTE 3EH ; Skip "PUSH HL" +NOPMPT: PUSH HL ; Save code string address + CALL PROMPT ; Get input with "? " prompt + POP BC ; Restore code string address + JP C,INPBRK ; Break pressed - Exit + INC HL ; Next byte + LD A,(HL) ; Get it + OR A ; End of line? + DEC HL ; Back again + PUSH BC ; Re-save code string address + JP Z,NXTDTA ; Yes - Find next DATA stmt + LD (HL),',' ; Store comma as separator + JP NXTITM ; Get next item + +READ: PUSH HL ; Save code string address + LD HL,(NXTDAT) ; Next DATA statement + .BYTE 0F6H ; Flag "READ" +NXTITM: XOR A ; Flag "INPUT" + LD (READFG),A ; Save "READ"/"INPUT" flag + EX (SP),HL ; Get code str' , Save pointer + JP GTVLUS ; Get values + +NEDMOR: CALL CHKSYN ; Check for comma between items + .BYTE ',' +GTVLUS: CALL GETVAR ; Get variable name + EX (SP),HL ; Save code str" , Get pointer + PUSH DE ; Save variable address + LD A,(HL) ; Get next "INPUT"/"DATA" byte + CP ',' ; Comma? + JP Z,ANTVLU ; Yes - Get another value + LD A,(READFG) ; Is it READ? + OR A + JP NZ,FDTLP ; Yes - Find next DATA stmt + LD A,'?' ; More INPUT needed + CALL OUTC ; Output character + CALL PROMPT ; Get INPUT with prompt + POP DE ; Variable address + POP BC ; Code string address + JP C,INPBRK ; Break pressed + INC HL ; Point to next DATA byte + LD A,(HL) ; Get byte + OR A ; Is it zero (No input) ? + DEC HL ; Back space INPUT pointer + PUSH BC ; Save code string address + JP Z,NXTDTA ; Find end of buffer + PUSH DE ; Save variable address +ANTVLU: LD A,(TYPE) ; Check data type + OR A ; Is it numeric? + JP Z,INPBIN ; Yes - Convert to binary + CALL GETCHR ; Get next character + LD D,A ; Save input character + LD B,A ; Again + CP '"' ; Start of literal sting? + JP Z,STRENT ; Yes - Create string entry + LD A,(READFG) ; "READ" or "INPUT" ? + OR A + LD D,A ; Save 00 if "INPUT" + JP Z,ITMSEP ; "INPUT" - End with 00 + LD D,':' ; "DATA" - End with 00 or ':' +ITMSEP: LD B,',' ; Item separator + DEC HL ; Back space for DTSTR +STRENT: CALL DTSTR ; Get string terminated by D + EX DE,HL ; String address to DE + LD HL,LTSTND ; Where to go after LETSTR + EX (SP),HL ; Save HL , get input pointer + PUSH DE ; Save address of string + JP LETSTR ; Assign string to variable + +INPBIN: CALL GETCHR ; Get next character + CALL ASCTFP ; Convert ASCII to FP number + EX (SP),HL ; Save input ptr, Get var addr + CALL FPTHL ; Move FPREG to variable + POP HL ; Restore input pointer +LTSTND: DEC HL ; DEC 'cos GETCHR INCs + CALL GETCHR ; Get next character + JP Z,MORDT ; End of line - More needed? + CP ',' ; Another value? + JP NZ,BADINP ; No - Bad input +MORDT: EX (SP),HL ; Get code string address + DEC HL ; DEC 'cos GETCHR INCs + CALL GETCHR ; Get next character + JP NZ,NEDMOR ; More needed - Get it + POP DE ; Restore DATA pointer + LD A,(READFG) ; "READ" or "INPUT" ? + OR A + EX DE,HL ; DATA pointer to HL + JP NZ,UPDATA ; Update DATA pointer if "READ" + PUSH DE ; Save code string address + OR (HL) ; More input given? + LD HL,EXTIG ; "?Extra ignored" message + CALL NZ,PRS ; Output string if extra given + POP HL ; Restore code string address + RET + +EXTIG: .BYTE "?Extra ignored",CR,LF,0 + +FDTLP: CALL DATA ; Get next statement + OR A ; End of line? + JP NZ,FANDT ; No - See if DATA statement + INC HL + LD A,(HL) ; End of program? + INC HL + OR (HL) ; 00 00 Ends program + LD E,OD ; ?OD Error + JP Z,ERROR ; Yes - Out of DATA + INC HL + LD E,(HL) ; LSB of line number + INC HL + LD D,(HL) ; MSB of line number + EX DE,HL + LD (DATLIN),HL ; Set line of current DATA item + EX DE,HL +FANDT: CALL GETCHR ; Get next character + CP ZDATA ; "DATA" token + JP NZ,FDTLP ; No "DATA" - Keep looking + JP ANTVLU ; Found - Convert input + +NEXT: LD DE,0 ; In case no index given +NEXT1: CALL NZ,GETVAR ; Get index address + LD (BRKLIN),HL ; Save code string address + CALL BAKSTK ; Look for "FOR" block + JP NZ,NFERR ; No "FOR" - ?NF Error + LD SP,HL ; Clear nested loops + PUSH DE ; Save index address + LD A,(HL) ; Get sign of STEP + INC HL + PUSH AF ; Save sign of STEP + PUSH DE ; Save index address + CALL PHLTFP ; Move index value to FPREG + EX (SP),HL ; Save address of TO value + PUSH HL ; Save address of index + CALL ADDPHL ; Add STEP to index value + POP HL ; Restore address of index + CALL FPTHL ; Move value to index variable + POP HL ; Restore address of TO value + CALL LOADFP ; Move TO value to BCDE + PUSH HL ; Save address of line of FOR + CALL CMPNUM ; Compare index with TO value + POP HL ; Restore address of line num + POP BC ; Address of sign of STEP + SUB B ; Compare with expected sign + CALL LOADFP ; BC = Loop stmt,DE = Line num + JP Z,KILFOR ; Loop finished - Terminate it + EX DE,HL ; Loop statement line number + LD (LINEAT),HL ; Set loop line number + LD L,C ; Set code string to loop + LD H,B + JP PUTFID ; Put back "FOR" and continue + +KILFOR: LD SP,HL ; Remove "FOR" block + LD HL,(BRKLIN) ; Code string after "NEXT" + LD A,(HL) ; Get next byte in code string + CP ',' ; More NEXTs ? + JP NZ,RUNCNT ; No - Do next statement + CALL GETCHR ; Position to index name + CALL NEXT1 ; Re-enter NEXT routine +; < will not RETurn to here , Exit to RUNCNT or Loop > + +GETNUM: CALL EVAL ; Get a numeric expression +TSTNUM: .BYTE 0F6H ; Clear carry (numeric) +TSTSTR: SCF ; Set carry (string) +CHKTYP: LD A,(TYPE) ; Check types match + ADC A,A ; Expected + actual + OR A ; Clear carry , set parity + RET PE ; Even parity - Types match + JP TMERR ; Different types - Error + +OPNPAR: CALL CHKSYN ; Make sure "(" follows + .BYTE "(" +EVAL: DEC HL ; Evaluate expression & save + LD D,0 ; Precedence value +EVAL1: PUSH DE ; Save precedence + LD C,1 + CALL CHKSTK ; Check for 1 level of stack + CALL OPRND ; Get next expression value +EVAL2: LD (NXTOPR),HL ; Save address of next operator +EVAL3: LD HL,(NXTOPR) ; Restore address of next opr + POP BC ; Precedence value and operator + LD A,B ; Get precedence value + CP 78H ; "AND" or "OR" ? + CALL NC,TSTNUM ; No - Make sure it's a number + LD A,(HL) ; Get next operator / function + LD D,0 ; Clear Last relation +RLTLP: SUB ZGTR ; ">" Token + JP C,FOPRND ; + - * / ^ AND OR - Test it + CP ZLTH+1-ZGTR ; < = > + JP NC,FOPRND ; Function - Call it + CP ZEQUAL-ZGTR ; "=" + RLA ; <- Test for legal + XOR D ; <- combinations of < = > + CP D ; <- by combining last token + LD D,A ; <- with current one + JP C,SNERR ; Error if "<<' '==" or ">>" + LD (CUROPR),HL ; Save address of current token + CALL GETCHR ; Get next character + JP RLTLP ; Treat the two as one + +FOPRND: LD A,D ; < = > found ? + OR A + JP NZ,TSTRED ; Yes - Test for reduction + LD A,(HL) ; Get operator token + LD (CUROPR),HL ; Save operator address + SUB ZPLUS ; Operator or function? + RET C ; Neither - Exit + CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ? + RET NC ; No - Exit + LD E,A ; Coded operator + LD A,(TYPE) ; Get data type + DEC A ; FF = numeric , 00 = string + OR E ; Combine with coded operator + LD A,E ; Get coded operator + JP Z,CONCAT ; String concatenation + RLCA ; Times 2 + ADD A,E ; Times 3 + LD E,A ; To DE (D is 0) + LD HL,PRITAB ; Precedence table + ADD HL,DE ; To the operator concerned + LD A,B ; Last operator precedence + LD D,(HL) ; Get evaluation precedence + CP D ; Compare with eval precedence + RET NC ; Exit if higher precedence + INC HL ; Point to routine address + CALL TSTNUM ; Make sure it's a number + +STKTHS: PUSH BC ; Save last precedence & token + LD BC,EVAL3 ; Where to go on prec' break + PUSH BC ; Save on stack for return + LD B,E ; Save operator + LD C,D ; Save precedence + CALL STAKFP ; Move value to stack + LD E,B ; Restore operator + LD D,C ; Restore precedence + LD C,(HL) ; Get LSB of routine address + INC HL + LD B,(HL) ; Get MSB of routine address + INC HL + PUSH BC ; Save routine address + LD HL,(CUROPR) ; Address of current operator + JP EVAL1 ; Loop until prec' break + +OPRND: XOR A ; Get operand routine + LD (TYPE),A ; Set numeric expected + CALL GETCHR ; Get next character + LD E,MO ; ?MO Error + JP Z,ERROR ; No operand - Error + JP C,ASCTFP ; Number - Get value + CALL CHKLTR ; See if a letter + JP NC,CONVAR ; Letter - Find variable + CP '&' ; &H = HEX, &B = BINARY + JR NZ, NOTAMP + CALL GETCHR ; Get next character + CP 'H' ; Hex number indicated? [function added] + JP Z,HEXTFP ; Convert Hex to FPREG + CP 'B' ; Binary number indicated? [function added] + JP Z,BINTFP ; Convert Bin to FPREG + LD E,SN ; If neither then a ?SN Error + JP Z,ERROR ; +NOTAMP: CP ZPLUS ; '+' Token ? + JP Z,OPRND ; Yes - Look for operand + CP '.' ; '.' ? + JP Z,ASCTFP ; Yes - Create FP number + CP ZMINUS ; '-' Token ? + JP Z,MINUS ; Yes - Do minus + CP '"' ; Literal string ? + JP Z,QTSTR ; Get string terminated by '"' + CP ZNOT ; "NOT" Token ? + JP Z,EVNOT ; Yes - Eval NOT expression + CP ZFN ; "FN" Token ? + JP Z,DOFN ; Yes - Do FN routine + SUB ZSGN ; Is it a function? + JP NC,FNOFST ; Yes - Evaluate function +EVLPAR: CALL OPNPAR ; Evaluate expression in "()" + CALL CHKSYN ; Make sure ")" follows + .BYTE ")" + RET + +MINUS: LD D,7DH ; '-' precedence + CALL EVAL1 ; Evaluate until prec' break + LD HL,(NXTOPR) ; Get next operator address + PUSH HL ; Save next operator address + CALL INVSGN ; Negate value +RETNUM: CALL TSTNUM ; Make sure it's a number + POP HL ; Restore next operator address + RET + +CONVAR: CALL GETVAR ; Get variable address to DE +FRMEVL: PUSH HL ; Save code string address + EX DE,HL ; Variable address to HL + LD (FPREG),HL ; Save address of variable + LD A,(TYPE) ; Get type + OR A ; Numeric? + CALL Z,PHLTFP ; Yes - Move contents to FPREG + POP HL ; Restore code string address + RET + +FNOFST: LD B,0 ; Get address of function + RLCA ; Double function offset + LD C,A ; BC = Offset in function table + PUSH BC ; Save adjusted token value + CALL GETCHR ; Get next character + LD A,C ; Get adjusted token value + CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? + JP C,FNVAL ; No - Do function + CALL OPNPAR ; Evaluate expression (X,... + CALL CHKSYN ; Make sure ',' follows + .BYTE ',' + CALL TSTSTR ; Make sure it's a string + EX DE,HL ; Save code string address + LD HL,(FPREG) ; Get address of string + EX (SP),HL ; Save address of string + PUSH HL ; Save adjusted token value + EX DE,HL ; Restore code string address + CALL GETINT ; Get integer 0-255 + EX DE,HL ; Save code string address + EX (SP),HL ; Save integer,HL = adj' token + JP GOFUNC ; Jump to string function + +FNVAL: CALL EVLPAR ; Evaluate expression + EX (SP),HL ; HL = Adjusted token value + LD DE,RETNUM ; Return number from function + PUSH DE ; Save on stack +GOFUNC: LD BC,FNCTAB ; Function routine addresses + ADD HL,BC ; Point to right address + LD C,(HL) ; Get LSB of address + INC HL ; + LD H,(HL) ; Get MSB of address + LD L,C ; Address to HL + JP (HL) ; Jump to function + +SGNEXP: DEC D ; Dee to flag negative exponent + CP ZMINUS ; '-' token ? + RET Z ; Yes - Return + CP '-' ; '-' ASCII ? + RET Z ; Yes - Return + INC D ; Inc to flag positive exponent + CP '+' ; '+' ASCII ? + RET Z ; Yes - Return + CP ZPLUS ; '+' token ? + RET Z ; Yes - Return + DEC HL ; DEC 'cos GETCHR INCs + RET ; Return "NZ" + +POR: .BYTE 0F6H ; Flag "OR" +PAND: XOR A ; Flag "AND" + PUSH AF ; Save "AND" / "OR" flag + CALL TSTNUM ; Make sure it's a number + CALL DEINT ; Get integer -32768 to 32767 + POP AF ; Restore "AND" / "OR" flag + EX DE,HL ; <- Get last + POP BC ; <- value + EX (SP),HL ; <- from + EX DE,HL ; <- stack + CALL FPBCDE ; Move last value to FPREG + PUSH AF ; Save "AND" / "OR" flag + CALL DEINT ; Get integer -32768 to 32767 + POP AF ; Restore "AND" / "OR" flag + POP BC ; Get value + LD A,C ; Get LSB + LD HL,ACPASS ; Address of save AC as current + JP NZ,POR1 ; Jump if OR + AND E ; "AND" LSBs + LD C,A ; Save LSB + LD A,B ; Get MBS + AND D ; "AND" MSBs + JP (HL) ; Save AC as current (ACPASS) + +POR1: OR E ; "OR" LSBs + LD C,A ; Save LSB + LD A,B ; Get MSB + OR D ; "OR" MSBs + JP (HL) ; Save AC as current (ACPASS) + +TSTRED: LD HL,CMPLOG ; Logical compare routine + LD A,(TYPE) ; Get data type + RRA ; Carry set = string + LD A,D ; Get last precedence value + RLA ; Times 2 plus carry + LD E,A ; To E + LD D,64H ; Relational precedence + LD A,B ; Get current precedence + CP D ; Compare with last + RET NC ; Eval if last was rel' or log' + JP STKTHS ; Stack this one and get next + +CMPLOG: .WORD CMPLG1 ; Compare two values / strings +CMPLG1: LD A,C ; Get data type + OR A + RRA + POP BC ; Get last expression to BCDE + POP DE + PUSH AF ; Save status + CALL CHKTYP ; Check that types match + LD HL,CMPRES ; Result to comparison + PUSH HL ; Save for RETurn + JP Z,CMPNUM ; Compare values if numeric + XOR A ; Compare two strings + LD (TYPE),A ; Set type to numeric + PUSH DE ; Save string name + CALL GSTRCU ; Get current string + LD A,(HL) ; Get length of string + INC HL + INC HL + LD C,(HL) ; Get LSB of address + INC HL + LD B,(HL) ; Get MSB of address + POP DE ; Restore string name + PUSH BC ; Save address of string + PUSH AF ; Save length of string + CALL GSTRDE ; Get second string + CALL LOADFP ; Get address of second string + POP AF ; Restore length of string 1 + LD D,A ; Length to D + POP HL ; Restore address of string 1 +CMPSTR: LD A,E ; Bytes of string 2 to do + OR D ; Bytes of string 1 to do + RET Z ; Exit if all bytes compared + LD A,D ; Get bytes of string 1 to do + SUB 1 + RET C ; Exit if end of string 1 + XOR A + CP E ; Bytes of string 2 to do + INC A + RET NC ; Exit if end of string 2 + DEC D ; Count bytes in string 1 + DEC E ; Count bytes in string 2 + LD A,(BC) ; Byte in string 2 + CP (HL) ; Compare to byte in string 1 + INC HL ; Move up string 1 + INC BC ; Move up string 2 + JP Z,CMPSTR ; Same - Try next bytes + CCF ; Flag difference (">" or "<") + JP FLGDIF ; "<" gives -1 , ">" gives +1 + +CMPRES: INC A ; Increment current value + ADC A,A ; Double plus carry + POP BC ; Get other value + AND B ; Combine them + ADD A,-1 ; Carry set if different + SBC A,A ; 00 - Equal , FF - Different + JP FLGREL ; Set current value & continue + +EVNOT: LD D,5AH ; Precedence value for "NOT" + CALL EVAL1 ; Eval until precedence break + CALL TSTNUM ; Make sure it's a number + CALL DEINT ; Get integer -32768 - 32767 + LD A,E ; Get LSB + CPL ; Invert LSB + LD C,A ; Save "NOT" of LSB + LD A,D ; Get MSB + CPL ; Invert MSB + CALL ACPASS ; Save AC as current + POP BC ; Clean up stack + JP EVAL3 ; Continue evaluation + +DIMRET: DEC HL ; DEC 'cos GETCHR INCs + CALL GETCHR ; Get next character + RET Z ; End of DIM statement + CALL CHKSYN ; Make sure ',' follows + .BYTE ',' +DIM: LD BC,DIMRET ; Return to "DIMRET" + PUSH BC ; Save on stack + .BYTE 0F6H ; Flag "Create" variable +GETVAR: XOR A ; Find variable address,to DE + LD (LCRFLG),A ; Set locate / create flag + LD B,(HL) ; Get First byte of name +GTFNAM: CALL CHKLTR ; See if a letter + JP C,SNERR ; ?SN Error if not a letter + XOR A + LD C,A ; Clear second byte of name + LD (TYPE),A ; Set type to numeric + CALL GETCHR ; Get next character + JP C,SVNAM2 ; Numeric - Save in name + CALL CHKLTR ; See if a letter + JP C,CHARTY ; Not a letter - Check type +SVNAM2: LD C,A ; Save second byte of name +ENDNAM: CALL GETCHR ; Get next character + JP C,ENDNAM ; Numeric - Get another + CALL CHKLTR ; See if a letter + JP NC,ENDNAM ; Letter - Get another +CHARTY: SUB '$' ; String variable? + JP NZ,NOTSTR ; No - Numeric variable + INC A ; A = 1 (string type) + LD (TYPE),A ; Set type to string + RRCA ; A = 80H , Flag for string + ADD A,C ; 2nd byte of name has bit 7 on + LD C,A ; Resave second byte on name + CALL GETCHR ; Get next character +NOTSTR: LD A,(FORFLG) ; Array name needed ? + DEC A + JP Z,ARLDSV ; Yes - Get array name + JP P,NSCFOR ; No array with "FOR" or "FN" + LD A,(HL) ; Get byte again + SUB '(' ; Subscripted variable? + JP Z,SBSCPT ; Yes - Sort out subscript + +NSCFOR: XOR A ; Simple variable + LD (FORFLG),A ; Clear "FOR" flag + PUSH HL ; Save code string address + LD D,B ; DE = Variable name to find + LD E,C + LD HL,(FNRGNM) ; FN argument name + CALL CPDEHL ; Is it the FN argument? + LD DE,FNARG ; Point to argument value + JP Z,POPHRT ; Yes - Return FN argument value + LD HL,(VAREND) ; End of variables + EX DE,HL ; Address of end of search + LD HL,(PROGND) ; Start of variables address +FNDVAR: CALL CPDEHL ; End of variable list table? + JP Z,CFEVAL ; Yes - Called from EVAL? + LD A,C ; Get second byte of name + SUB (HL) ; Compare with name in list + INC HL ; Move on to first byte + JP NZ,FNTHR ; Different - Find another + LD A,B ; Get first byte of name + SUB (HL) ; Compare with name in list +FNTHR: INC HL ; Move on to LSB of value + JP Z,RETADR ; Found - Return address + INC HL ; <- Skip + INC HL ; <- over + INC HL ; <- F.P. + INC HL ; <- value + JP FNDVAR ; Keep looking + +CFEVAL: POP HL ; Restore code string address + EX (SP),HL ; Get return address + PUSH DE ; Save address of variable + LD DE,FRMEVL ; Return address in EVAL + CALL CPDEHL ; Called from EVAL ? + POP DE ; Restore address of variable + JP Z,RETNUL ; Yes - Return null variable + EX (SP),HL ; Put back return + PUSH HL ; Save code string address + PUSH BC ; Save variable name + LD BC,6 ; 2 byte name plus 4 byte data + LD HL,(ARREND) ; End of arrays + PUSH HL ; Save end of arrays + ADD HL,BC ; Move up 6 bytes + POP BC ; Source address in BC + PUSH HL ; Save new end address + CALL MOVUP ; Move arrays up + POP HL ; Restore new end address + LD (ARREND),HL ; Set new end address + LD H,B ; End of variables to HL + LD L,C + LD (VAREND),HL ; Set new end address + +ZEROLP: DEC HL ; Back through to zero variable + LD (HL),0 ; Zero byte in variable + CALL CPDEHL ; Done them all? + JP NZ,ZEROLP ; No - Keep on going + POP DE ; Get variable name + LD (HL),E ; Store second character + INC HL + LD (HL),D ; Store first character + INC HL +RETADR: EX DE,HL ; Address of variable in DE + POP HL ; Restore code string address + RET + +RETNUL: LD (FPEXP),A ; Set result to zero + LD HL,ZERBYT ; Also set a null string + LD (FPREG),HL ; Save for EVAL + POP HL ; Restore code string address + RET + +SBSCPT: PUSH HL ; Save code string address + LD HL,(LCRFLG) ; Locate/Create and Type + EX (SP),HL ; Save and get code string + LD D,A ; Zero number of dimensions +SCPTLP: PUSH DE ; Save number of dimensions + PUSH BC ; Save array name + CALL FPSINT ; Get subscript (0-32767) + POP BC ; Restore array name + POP AF ; Get number of dimensions + EX DE,HL + EX (SP),HL ; Save subscript value + PUSH HL ; Save LCRFLG and TYPE + EX DE,HL + INC A ; Count dimensions + LD D,A ; Save in D + LD A,(HL) ; Get next byte in code string + CP ',' ; Comma (more to come)? + JP Z,SCPTLP ; Yes - More subscripts + CALL CHKSYN ; Make sure ")" follows + .BYTE ")" + LD (NXTOPR),HL ; Save code string address + POP HL ; Get LCRFLG and TYPE + LD (LCRFLG),HL ; Restore Locate/create & type + LD E,0 ; Flag not CSAVE* or CLOAD* + PUSH DE ; Save number of dimensions (D) + .BYTE 11H ; Skip "PUSH HL" and "PUSH AF' + +ARLDSV: PUSH HL ; Save code string address + PUSH AF ; A = 00 , Flags set = Z,N + LD HL,(VAREND) ; Start of arrays + .BYTE 3EH ; Skip "ADD HL,DE" +FNDARY: ADD HL,DE ; Move to next array start + EX DE,HL + LD HL,(ARREND) ; End of arrays + EX DE,HL ; Current array pointer + CALL CPDEHL ; End of arrays found? + JP Z,CREARY ; Yes - Create array + LD A,(HL) ; Get second byte of name + CP C ; Compare with name given + INC HL ; Move on + JP NZ,NXTARY ; Different - Find next array + LD A,(HL) ; Get first byte of name + CP B ; Compare with name given +NXTARY: INC HL ; Move on + LD E,(HL) ; Get LSB of next array address + INC HL + LD D,(HL) ; Get MSB of next array address + INC HL + JP NZ,FNDARY ; Not found - Keep looking + LD A,(LCRFLG) ; Found Locate or Create it? + OR A + JP NZ,DDERR ; Create - ?DD Error + POP AF ; Locate - Get number of dim'ns + LD B,H ; BC Points to array dim'ns + LD C,L + JP Z,POPHRT ; Jump if array load/save + SUB (HL) ; Same number of dimensions? + JP Z,FINDEL ; Yes - Find element +BSERR: LD E,BS ; ?BS Error + JP ERROR ; Output error + +CREARY: LD DE,4 ; 4 Bytes per entry + POP AF ; Array to save or 0 dim'ns? + JP Z,FCERR ; Yes - ?FC Error + LD (HL),C ; Save second byte of name + INC HL + LD (HL),B ; Save first byte of name + INC HL + LD C,A ; Number of dimensions to C + CALL CHKSTK ; Check if enough memory + INC HL ; Point to number of dimensions + INC HL + LD (CUROPR),HL ; Save address of pointer + LD (HL),C ; Set number of dimensions + INC HL + LD A,(LCRFLG) ; Locate of Create? + RLA ; Carry set = Create + LD A,C ; Get number of dimensions +CRARLP: LD BC,10+1 ; Default dimension size 10 + JP NC,DEFSIZ ; Locate - Set default size + POP BC ; Get specified dimension size + INC BC ; Include zero element +DEFSIZ: LD (HL),C ; Save LSB of dimension size + INC HL + LD (HL),B ; Save MSB of dimension size + INC HL + PUSH AF ; Save num' of dim'ns an status + PUSH HL ; Save address of dim'n size + CALL MLDEBC ; Multiply DE by BC to find + EX DE,HL ; amount of mem needed (to DE) + POP HL ; Restore address of dimension + POP AF ; Restore number of dimensions + DEC A ; Count them + JP NZ,CRARLP ; Do next dimension if more + PUSH AF ; Save locate/create flag + LD B,D ; MSB of memory needed + LD C,E ; LSB of memory needed + EX DE,HL + ADD HL,DE ; Add bytes to array start + JP C,OMERR ; Too big - Error + CALL ENFMEM ; See if enough memory + LD (ARREND),HL ; Save new end of array + +ZERARY: DEC HL ; Back through array data + LD (HL),0 ; Set array element to zero + CALL CPDEHL ; All elements zeroed? + JP NZ,ZERARY ; No - Keep on going + INC BC ; Number of bytes + 1 + LD D,A ; A=0 + LD HL,(CUROPR) ; Get address of array + LD E,(HL) ; Number of dimensions + EX DE,HL ; To HL + ADD HL,HL ; Two bytes per dimension size + ADD HL,BC ; Add number of bytes + EX DE,HL ; Bytes needed to DE + DEC HL + DEC HL + LD (HL),E ; Save LSB of bytes needed + INC HL + LD (HL),D ; Save MSB of bytes needed + INC HL + POP AF ; Locate / Create? + JP C,ENDDIM ; A is 0 , End if create +FINDEL: LD B,A ; Find array element + LD C,A + LD A,(HL) ; Number of dimensions + INC HL + .BYTE 16H ; Skip "POP HL" +FNDELP: POP HL ; Address of next dim' size + LD E,(HL) ; Get LSB of dim'n size + INC HL + LD D,(HL) ; Get MSB of dim'n size + INC HL + EX (SP),HL ; Save address - Get index + PUSH AF ; Save number of dim'ns + CALL CPDEHL ; Dimension too large? + JP NC,BSERR ; Yes - ?BS Error + PUSH HL ; Save index + CALL MLDEBC ; Multiply previous by size + POP DE ; Index supplied to DE + ADD HL,DE ; Add index to pointer + POP AF ; Number of dimensions + DEC A ; Count them + LD B,H ; MSB of pointer + LD C,L ; LSB of pointer + JP NZ,FNDELP ; More - Keep going + ADD HL,HL ; 4 Bytes per element + ADD HL,HL + POP BC ; Start of array + ADD HL,BC ; Point to element + EX DE,HL ; Address of element to DE +ENDDIM: LD HL,(NXTOPR) ; Got code string address + RET + +FRE: LD HL,(ARREND) ; Start of free memory + EX DE,HL ; To DE + LD HL,0 ; End of free memory + ADD HL,SP ; Current stack value + LD A,(TYPE) ; Dummy argument type + OR A + JP Z,FRENUM ; Numeric - Free variable space + CALL GSTRCU ; Current string to pool + CALL GARBGE ; Garbage collection + LD HL,(STRSPC) ; Bottom of string space in use + EX DE,HL ; To DE + LD HL,(STRBOT) ; Bottom of string space +FRENUM: LD A,L ; Get LSB of end + SUB E ; Subtract LSB of beginning + LD C,A ; Save difference if C + LD A,H ; Get MSB of end + SBC A,D ; Subtract MSB of beginning +ACPASS: LD B,C ; Return integer AC +ABPASS: LD D,B ; Return integer AB + LD E,0 + LD HL,TYPE ; Point to type + LD (HL),E ; Set type to numeric + LD B,80H+16 ; 16 bit integer + JP RETINT ; Return the integr + +POS: LD A,(CURPOS) ; Get cursor position +PASSA: LD B,A ; Put A into AB + XOR A ; Zero A + JP ABPASS ; Return integer AB + +DEF: CALL CHEKFN ; Get "FN" and name + CALL IDTEST ; Test for illegal direct + LD BC,DATA ; To get next statement + PUSH BC ; Save address for RETurn + PUSH DE ; Save address of function ptr + CALL CHKSYN ; Make sure "(" follows + .BYTE "(" + CALL GETVAR ; Get argument variable name + PUSH HL ; Save code string address + EX DE,HL ; Argument address to HL + DEC HL + LD D,(HL) ; Get first byte of arg name + DEC HL + LD E,(HL) ; Get second byte of arg name + POP HL ; Restore code string address + CALL TSTNUM ; Make sure numeric argument + CALL CHKSYN ; Make sure ")" follows + .BYTE ")" + CALL CHKSYN ; Make sure "=" follows + .BYTE ZEQUAL ; "=" token + LD B,H ; Code string address to BC + LD C,L + EX (SP),HL ; Save code str , Get FN ptr + LD (HL),C ; Save LSB of FN code string + INC HL + LD (HL),B ; Save MSB of FN code string + JP SVSTAD ; Save address and do function + +DOFN: CALL CHEKFN ; Make sure FN follows + PUSH DE ; Save function pointer address + CALL EVLPAR ; Evaluate expression in "()" + CALL TSTNUM ; Make sure numeric result + EX (SP),HL ; Save code str , Get FN ptr + LD E,(HL) ; Get LSB of FN code string + INC HL + LD D,(HL) ; Get MSB of FN code string + INC HL + LD A,D ; And function DEFined? + OR E + JP Z,UFERR ; No - ?UF Error + LD A,(HL) ; Get LSB of argument address + INC HL + LD H,(HL) ; Get MSB of argument address + LD L,A ; HL = Arg variable address + PUSH HL ; Save it + LD HL,(FNRGNM) ; Get old argument name + EX (SP),HL ; ; Save old , Get new + LD (FNRGNM),HL ; Set new argument name + LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value + PUSH HL ; Save it + LD HL,(FNARG) ; Get MSB,EXP of old arg value + PUSH HL ; Save it + LD HL,FNARG ; HL = Value of argument + PUSH DE ; Save FN code string address + CALL FPTHL ; Move FPREG to argument + POP HL ; Get FN code string address + CALL GETNUM ; Get value from function + DEC HL ; DEC 'cos GETCHR INCs + CALL GETCHR ; Get next character + JP NZ,SNERR ; Bad character in FN - Error + POP HL ; Get MSB,EXP of old arg + LD (FNARG),HL ; Restore it + POP HL ; Get LSB,NLSB of old arg + LD (FNARG+2),HL ; Restore it + POP HL ; Get name of old arg + LD (FNRGNM),HL ; Restore it + POP HL ; Restore code string address + RET + +IDTEST: PUSH HL ; Save code string address + LD HL,(LINEAT) ; Get current line number + INC HL ; -1 means direct statement + LD A,H + OR L + POP HL ; Restore code string address + RET NZ ; Return if in program + LD E,ID ; ?ID Error + JP ERROR + +CHEKFN: CALL CHKSYN ; Make sure FN follows + .BYTE ZFN ; "FN" token + LD A,80H + LD (FORFLG),A ; Flag FN name to find + OR (HL) ; FN name has bit 7 set + LD B,A ; in first byte of name + CALL GTFNAM ; Get FN name + JP TSTNUM ; Make sure numeric function + +STR: CALL TSTNUM ; Make sure it's a number + CALL NUMASC ; Turn number into text +STR1: CALL CRTST ; Create string entry for it + CALL GSTRCU ; Current string to pool + LD BC,TOPOOL ; Save in string pool + PUSH BC ; Save address on stack + +SAVSTR: LD A,(HL) ; Get string length + INC HL + INC HL + PUSH HL ; Save pointer to string + CALL TESTR ; See if enough string space + POP HL ; Restore pointer to string + LD C,(HL) ; Get LSB of address + INC HL + LD B,(HL) ; Get MSB of address + CALL CRTMST ; Create string entry + PUSH HL ; Save pointer to MSB of addr + LD L,A ; Length of string + CALL TOSTRA ; Move to string area + POP DE ; Restore pointer to MSB + RET + +MKTMST: CALL TESTR ; See if enough string space +CRTMST: LD HL,TMPSTR ; Temporary string + PUSH HL ; Save it + LD (HL),A ; Save length of string + INC HL +SVSTAD: INC HL + LD (HL),E ; Save LSB of address + INC HL + LD (HL),D ; Save MSB of address + POP HL ; Restore pointer + RET + +CRTST: DEC HL ; DEC - INCed after +QTSTR: LD B,'"' ; Terminating quote + LD D,B ; Quote to D +DTSTR: PUSH HL ; Save start + LD C,-1 ; Set counter to -1 +QTSTLP: INC HL ; Move on + LD A,(HL) ; Get byte + INC C ; Count bytes + OR A ; End of line? + JP Z,CRTSTE ; Yes - Create string entry + CP D ; Terminator D found? + JP Z,CRTSTE ; Yes - Create string entry + CP B ; Terminator B found? + JP NZ,QTSTLP ; No - Keep looking +CRTSTE: CP '"' ; End with '"'? + CALL Z,GETCHR ; Yes - Get next character + EX (SP),HL ; Starting quote + INC HL ; First byte of string + EX DE,HL ; To DE + LD A,C ; Get length + CALL CRTMST ; Create string entry +TSTOPL: LD DE,TMPSTR ; Temporary string + LD HL,(TMSTPT) ; Temporary string pool pointer + LD (FPREG),HL ; Save address of string ptr + LD A,1 + LD (TYPE),A ; Set type to string + CALL DETHL4 ; Move string to pool + CALL CPDEHL ; Out of string pool? + LD (TMSTPT),HL ; Save new pointer + POP HL ; Restore code string address + LD A,(HL) ; Get next code byte + RET NZ ; Return if pool OK + LD E,ST ; ?ST Error + JP ERROR ; String pool overflow + +PRNUMS: INC HL ; Skip leading space +PRS: CALL CRTST ; Create string entry for it +PRS1: CALL GSTRCU ; Current string to pool + CALL LOADFP ; Move string block to BCDE + INC E ; Length + 1 +PRSLP: DEC E ; Count characters + RET Z ; End of string + LD A,(BC) ; Get byte to output + CALL OUTC ; Output character in A + CP CR ; Return? + CALL Z,DONULL ; Yes - Do nulls + INC BC ; Next byte in string + JP PRSLP ; More characters to output + +TESTR: OR A ; Test if enough room + .BYTE 0EH ; No garbage collection done +GRBDON: POP AF ; Garbage collection done + PUSH AF ; Save status + LD HL,(STRSPC) ; Bottom of string space in use + EX DE,HL ; To DE + LD HL,(STRBOT) ; Bottom of string area + CPL ; Negate length (Top down) + LD C,A ; -Length to BC + LD B,-1 ; BC = -ve length of string + ADD HL,BC ; Add to bottom of space in use + INC HL ; Plus one for 2's complement + CALL CPDEHL ; Below string RAM area? + JP C,TESTOS ; Tidy up if not done else err + LD (STRBOT),HL ; Save new bottom of area + INC HL ; Point to first byte of string + EX DE,HL ; Address to DE +POPAF: POP AF ; Throw away status push + RET + +TESTOS: POP AF ; Garbage collect been done? + LD E,OS ; ?OS Error + JP Z,ERROR ; Yes - Not enough string apace + CP A ; Flag garbage collect done + PUSH AF ; Save status + LD BC,GRBDON ; Garbage collection done + PUSH BC ; Save for RETurn +GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer +GARBLP: LD (STRBOT),HL ; Reset string pointer + LD HL,0 + PUSH HL ; Flag no string found + LD HL,(STRSPC) ; Get bottom of string space + PUSH HL ; Save bottom of string space + LD HL,TMSTPL ; Temporary string pool +GRBLP: EX DE,HL + LD HL,(TMSTPT) ; Temporary string pool pointer + EX DE,HL + CALL CPDEHL ; Temporary string pool done? + LD BC,GRBLP ; Loop until string pool done + JP NZ,STPOOL ; No - See if in string area + LD HL,(PROGND) ; Start of simple variables +SMPVAR: EX DE,HL + LD HL,(VAREND) ; End of simple variables + EX DE,HL + CALL CPDEHL ; All simple strings done? + JP Z,ARRLP ; Yes - Do string arrays + LD A,(HL) ; Get type of variable + INC HL + INC HL + OR A ; "S" flag set if string + CALL STRADD ; See if string in string area + JP SMPVAR ; Loop until simple ones done + +GNXARY: POP BC ; Scrap address of this array +ARRLP: EX DE,HL + LD HL,(ARREND) ; End of string arrays + EX DE,HL + CALL CPDEHL ; All string arrays done? + JP Z,SCNEND ; Yes - Move string if found + CALL LOADFP ; Get array name to BCDE + LD A,E ; Get type of array + PUSH HL ; Save address of num of dim'ns + ADD HL,BC ; Start of next array + OR A ; Test type of array + JP P,GNXARY ; Numeric array - Ignore it + LD (CUROPR),HL ; Save address of next array + POP HL ; Get address of num of dim'ns + LD C,(HL) ; BC = Number of dimensions + LD B,0 + ADD HL,BC ; Two bytes per dimension size + ADD HL,BC + INC HL ; Plus one for number of dim'ns +GRBARY: EX DE,HL + LD HL,(CUROPR) ; Get address of next array + EX DE,HL + CALL CPDEHL ; Is this array finished? + JP Z,ARRLP ; Yes - Get next one + LD BC,GRBARY ; Loop until array all done +STPOOL: PUSH BC ; Save return address + OR 80H ; Flag string type +STRADD: LD A,(HL) ; Get string length + INC HL + INC HL + LD E,(HL) ; Get LSB of string address + INC HL + LD D,(HL) ; Get MSB of string address + INC HL + RET P ; Not a string - Return + OR A ; Set flags on string length + RET Z ; Null string - Return + LD B,H ; Save variable pointer + LD C,L + LD HL,(STRBOT) ; Bottom of new area + CALL CPDEHL ; String been done? + LD H,B ; Restore variable pointer + LD L,C + RET C ; String done - Ignore + POP HL ; Return address + EX (SP),HL ; Lowest available string area + CALL CPDEHL ; String within string area? + EX (SP),HL ; Lowest available string area + PUSH HL ; Re-save return address + LD H,B ; Restore variable pointer + LD L,C + RET NC ; Outside string area - Ignore + POP BC ; Get return , Throw 2 away + POP AF ; + POP AF ; + PUSH HL ; Save variable pointer + PUSH DE ; Save address of current + PUSH BC ; Put back return address + RET ; Go to it + +SCNEND: POP DE ; Addresses of strings + POP HL ; + LD A,L ; HL = 0 if no more to do + OR H + RET Z ; No more to do - Return + DEC HL + LD B,(HL) ; MSB of address of string + DEC HL + LD C,(HL) ; LSB of address of string + PUSH HL ; Save variable address + DEC HL + DEC HL + LD L,(HL) ; HL = Length of string + LD H,0 + ADD HL,BC ; Address of end of string+1 + LD D,B ; String address to DE + LD E,C + DEC HL ; Last byte in string + LD B,H ; Address to BC + LD C,L + LD HL,(STRBOT) ; Current bottom of string area + CALL MOVSTR ; Move string to new address + POP HL ; Restore variable address + LD (HL),C ; Save new LSB of address + INC HL + LD (HL),B ; Save new MSB of address + LD L,C ; Next string area+1 to HL + LD H,B + DEC HL ; Next string area address + JP GARBLP ; Look for more strings + +CONCAT: PUSH BC ; Save prec' opr & code string + PUSH HL ; + LD HL,(FPREG) ; Get first string + EX (SP),HL ; Save first string + CALL OPRND ; Get second string + EX (SP),HL ; Restore first string + CALL TSTSTR ; Make sure it's a string + LD A,(HL) ; Get length of second string + PUSH HL ; Save first string + LD HL,(FPREG) ; Get second string + PUSH HL ; Save second string + ADD A,(HL) ; Add length of second string + LD E,LS ; ?LS Error + JP C,ERROR ; String too long - Error + CALL MKTMST ; Make temporary string + POP DE ; Get second string to DE + CALL GSTRDE ; Move to string pool if needed + EX (SP),HL ; Get first string + CALL GSTRHL ; Move to string pool if needed + PUSH HL ; Save first string + LD HL,(TMPSTR+2) ; Temporary string address + EX DE,HL ; To DE + CALL SSTSA ; First string to string area + CALL SSTSA ; Second string to string area + LD HL,EVAL2 ; Return to evaluation loop + EX (SP),HL ; Save return,get code string + PUSH HL ; Save code string address + JP TSTOPL ; To temporary string to pool + +SSTSA: POP HL ; Return address + EX (SP),HL ; Get string block,save return + LD A,(HL) ; Get length of string + INC HL + INC HL + LD C,(HL) ; Get LSB of string address + INC HL + LD B,(HL) ; Get MSB of string address + LD L,A ; Length to L +TOSTRA: INC L ; INC - DECed after +TSALP: DEC L ; Count bytes moved + RET Z ; End of string - Return + LD A,(BC) ; Get source + LD (DE),A ; Save destination + INC BC ; Next source + INC DE ; Next destination + JP TSALP ; Loop until string moved + +GETSTR: CALL TSTSTR ; Make sure it's a string +GSTRCU: LD HL,(FPREG) ; Get current string +GSTRHL: EX DE,HL ; Save DE +GSTRDE: CALL BAKTMP ; Was it last tmp-str? + EX DE,HL ; Restore DE + RET NZ ; No - Return + PUSH DE ; Save string + LD D,B ; String block address to DE + LD E,C + DEC DE ; Point to length + LD C,(HL) ; Get string length + LD HL,(STRBOT) ; Current bottom of string area + CALL CPDEHL ; Last one in string area? + JP NZ,POPHL ; No - Return + LD B,A ; Clear B (A=0) + ADD HL,BC ; Remove string from str' area + LD (STRBOT),HL ; Save new bottom of str' area +POPHL: POP HL ; Restore string + RET + +BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top + DEC HL ; Back + LD B,(HL) ; Get MSB of address + DEC HL ; Back + LD C,(HL) ; Get LSB of address + DEC HL ; Back + DEC HL ; Back + CALL CPDEHL ; String last in string pool? + RET NZ ; Yes - Leave it + LD (TMSTPT),HL ; Save new string pool top + RET + +LEN: LD BC,PASSA ; To return integer A + PUSH BC ; Save address +GETLEN: CALL GETSTR ; Get string and its length + XOR A + LD D,A ; Clear D + LD (TYPE),A ; Set type to numeric + LD A,(HL) ; Get length of string + OR A ; Set status flags + RET + +ASC: LD BC,PASSA ; To return integer A + PUSH BC ; Save address +GTFLNM: CALL GETLEN ; Get length of string + JP Z,FCERR ; Null string - Error + INC HL + INC HL + LD E,(HL) ; Get LSB of address + INC HL + LD D,(HL) ; Get MSB of address + LD A,(DE) ; Get first byte of string + RET + +CHR: LD A,1 ; One character string + CALL MKTMST ; Make a temporary string + CALL MAKINT ; Make it integer A + LD HL,(TMPSTR+2) ; Get address of string + LD (HL),E ; Save character +TOPOOL: POP BC ; Clean up stack + JP TSTOPL ; Temporary string to pool + +LEFT: CALL LFRGNM ; Get number and ending ")" + XOR A ; Start at first byte in string +RIGHT1: EX (SP),HL ; Save code string,Get string + LD C,A ; Starting position in string +MID1: PUSH HL ; Save string block address + LD A,(HL) ; Get length of string + CP B ; Compare with number given + JP C,ALLFOL ; All following bytes required + LD A,B ; Get new length + .BYTE 11H ; Skip "LD C,0" +ALLFOL: LD C,0 ; First byte of string + PUSH BC ; Save position in string + CALL TESTR ; See if enough string space + POP BC ; Get position in string + POP HL ; Restore string block address + PUSH HL ; And re-save it + INC HL + INC HL + LD B,(HL) ; Get LSB of address + INC HL + LD H,(HL) ; Get MSB of address + LD L,B ; HL = address of string + LD B,0 ; BC = starting address + ADD HL,BC ; Point to that byte + LD B,H ; BC = source string + LD C,L + CALL CRTMST ; Create a string entry + LD L,A ; Length of new string + CALL TOSTRA ; Move string to string area + POP DE ; Clear stack + CALL GSTRDE ; Move to string pool if needed + JP TSTOPL ; Temporary string to pool + +RIGHT: CALL LFRGNM ; Get number and ending ")" + POP DE ; Get string length + PUSH DE ; And re-save + LD A,(DE) ; Get length + SUB B ; Move back N bytes + JP RIGHT1 ; Go and get sub-string + +MID: EX DE,HL ; Get code string address + LD A,(HL) ; Get next byte ',' or ")" + CALL MIDNUM ; Get number supplied + INC B ; Is it character zero? + DEC B + JP Z,FCERR ; Yes - Error + PUSH BC ; Save starting position + LD E,255 ; All of string + CP ')' ; Any length given? + JP Z,RSTSTR ; No - Rest of string + CALL CHKSYN ; Make sure ',' follows + .BYTE ',' + CALL GETINT ; Get integer 0-255 +RSTSTR: CALL CHKSYN ; Make sure ")" follows + .BYTE ")" + POP AF ; Restore starting position + EX (SP),HL ; Get string,8ave code string + LD BC,MID1 ; Continuation of MID$ routine + PUSH BC ; Save for return + DEC A ; Starting position-1 + CP (HL) ; Compare with length + LD B,0 ; Zero bytes length + RET NC ; Null string if start past end + LD C,A ; Save starting position-1 + LD A,(HL) ; Get length of string + SUB C ; Subtract start + CP E ; Enough string for it? + LD B,A ; Save maximum length available + RET C ; Truncate string if needed + LD B,E ; Set specified length + RET ; Go and create string + +VAL: CALL GETLEN ; Get length of string + JP Z,RESZER ; Result zero + LD E,A ; Save length + INC HL + INC HL + LD A,(HL) ; Get LSB of address + INC HL + LD H,(HL) ; Get MSB of address + LD L,A ; HL = String address + PUSH HL ; Save string address + ADD HL,DE + LD B,(HL) ; Get end of string+1 byte + LD (HL),D ; Zero it to terminate + EX (SP),HL ; Save string end,get start + PUSH BC ; Save end+1 byte + LD A,(HL) ; Get starting byte + CP '$' ; Hex number indicated? [function added] + JP NZ,VAL1 + CALL HEXTFP ; Convert Hex to FPREG + JR VAL3 +VAL1: CP '%' ; Binary number indicated? [function added] + JP NZ,VAL2 + CALL BINTFP ; Convert Bin to FPREG + JR VAL3 +VAL2: CALL ASCTFP ; Convert ASCII string to FP +VAL3: POP BC ; Restore end+1 byte + POP HL ; Restore end+1 address + LD (HL),B ; Put back original byte + RET + +LFRGNM: EX DE,HL ; Code string address to HL + CALL CHKSYN ; Make sure ")" follows + .BYTE ")" +MIDNUM: POP BC ; Get return address + POP DE ; Get number supplied + PUSH BC ; Re-save return address + LD B,E ; Number to B + RET + +INP: CALL MAKINT ; Make it integer A + LD (INPORT),A ; Set input port + CALL INPSUB ; Get input from port + JP PASSA ; Return integer A + +POUT: CALL SETIO ; Set up port number + JP OUTSUB ; Output data and return + +WAIT: CALL SETIO ; Set up port number + PUSH AF ; Save AND mask + LD E,0 ; Assume zero if none given + DEC HL ; DEC 'cos GETCHR INCs + CALL GETCHR ; Get next character + JP Z,NOXOR ; No XOR byte given + CALL CHKSYN ; Make sure ',' follows + .BYTE ',' + CALL GETINT ; Get integer 0-255 to XOR with +NOXOR: POP BC ; Restore AND mask +WAITLP: CALL INPSUB ; Get input + XOR E ; Flip selected bits + AND B ; Result non-zero? + JP Z,WAITLP ; No = keep waiting + RET + +SETIO: CALL GETINT ; Get integer 0-255 + LD (INPORT),A ; Set input port + LD (OTPORT),A ; Set output port + CALL CHKSYN ; Make sure ',' follows + .BYTE ',' + JP GETINT ; Get integer 0-255 and return + +FNDNUM: CALL GETCHR ; Get next character +GETINT: CALL GETNUM ; Get a number from 0 to 255 +MAKINT: CALL DEPINT ; Make sure value 0 - 255 + LD A,D ; Get MSB of number + OR A ; Zero? + JP NZ,FCERR ; No - Error + DEC HL ; DEC 'cos GETCHR INCs + CALL GETCHR ; Get next character + LD A,E ; Get number to A + RET + +PEEK: CALL DEINT ; Get memory address + LD A,(DE) ; Get byte in memory + JP PASSA ; Return integer A + +POKE: CALL GETNUM ; Get memory address + CALL DEINT ; Get integer -32768 to 3276 + PUSH DE ; Save memory address + CALL CHKSYN ; Make sure ',' follows + .BYTE ',' + CALL GETINT ; Get integer 0-255 + POP DE ; Restore memory address + LD (DE),A ; Load it into memory + RET + +ROUND: LD HL,HALF ; Add 0.5 to FPREG +ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE + JP FPADD ; Add BCDE to FPREG + +SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL + .BYTE 21H ; Skip "POP BC" and "POP DE" +PSUB: POP BC ; Get FP number from stack + POP DE +SUBCDE: CALL INVSGN ; Negate FPREG +FPADD: LD A,B ; Get FP exponent + OR A ; Is number zero? + RET Z ; Yes - Nothing to add + LD A,(FPEXP) ; Get FPREG exponent + OR A ; Is this number zero? + JP Z,FPBCDE ; Yes - Move BCDE to FPREG + SUB B ; BCDE number larger? + JP NC,NOSWAP ; No - Don't swap them + CPL ; Two's complement + INC A ; FP exponent + EX DE,HL + CALL STAKFP ; Put FPREG on stack + EX DE,HL + CALL FPBCDE ; Move BCDE to FPREG + POP BC ; Restore number from stack + POP DE +NOSWAP: CP 24+1 ; Second number insignificant? + RET NC ; Yes - First number is result + PUSH AF ; Save number of bits to scale + CALL SIGNS ; Set MSBs & sign of result + LD H,A ; Save sign of result + POP AF ; Restore scaling factor + CALL SCALE ; Scale BCDE to same exponent + OR H ; Result to be positive? + LD HL,FPREG ; Point to FPREG + JP P,MINCDE ; No - Subtract FPREG from CDE + CALL PLUCDE ; Add FPREG to CDE + JP NC,RONDUP ; No overflow - Round it up + INC HL ; Point to exponent + INC (HL) ; Increment it + JP Z,OVERR ; Number overflowed - Error + LD L,1 ; 1 bit to shift right + CALL SHRT1 ; Shift result right + JP RONDUP ; Round it up + +MINCDE: XOR A ; Clear A and carry + SUB B ; Negate exponent + LD B,A ; Re-save exponent + LD A,(HL) ; Get LSB of FPREG + SBC A, E ; Subtract LSB of BCDE + LD E,A ; Save LSB of BCDE + INC HL + LD A,(HL) ; Get NMSB of FPREG + SBC A,D ; Subtract NMSB of BCDE + LD D,A ; Save NMSB of BCDE + INC HL + LD A,(HL) ; Get MSB of FPREG + SBC A,C ; Subtract MSB of BCDE + LD C,A ; Save MSB of BCDE +CONPOS: CALL C,COMPL ; Overflow - Make it positive + +BNORM: LD L,B ; L = Exponent + LD H,E ; H = LSB + XOR A +BNRMLP: LD B,A ; Save bit count + LD A,C ; Get MSB + OR A ; Is it zero? + JP NZ,PNORM ; No - Do it bit at a time + LD C,D ; MSB = NMSB + LD D,H ; NMSB= LSB + LD H,L ; LSB = VLSB + LD L,A ; VLSB= 0 + LD A,B ; Get exponent + SUB 8 ; Count 8 bits + CP -24-8 ; Was number zero? + JP NZ,BNRMLP ; No - Keep normalising +RESZER: XOR A ; Result is zero +SAVEXP: LD (FPEXP),A ; Save result as zero + RET + +NORMAL: DEC B ; Count bits + ADD HL,HL ; Shift HL left + LD A,D ; Get NMSB + RLA ; Shift left with last bit + LD D,A ; Save NMSB + LD A,C ; Get MSB + ADC A,A ; Shift left with last bit + LD C,A ; Save MSB +PNORM: JP P,NORMAL ; Not done - Keep going + LD A,B ; Number of bits shifted + LD E,H ; Save HL in EB + LD B,L + OR A ; Any shifting done? + JP Z,RONDUP ; No - Round it up + LD HL,FPEXP ; Point to exponent + ADD A,(HL) ; Add shifted bits + LD (HL),A ; Re-save exponent + JP NC,RESZER ; Underflow - Result is zero + RET Z ; Result is zero +RONDUP: LD A,B ; Get VLSB of number +RONDB: LD HL,FPEXP ; Point to exponent + OR A ; Any rounding? + CALL M,FPROND ; Yes - Round number up + LD B,(HL) ; B = Exponent + INC HL + LD A,(HL) ; Get sign of result + AND 10000000B ; Only bit 7 needed + XOR C ; Set correct sign + LD C,A ; Save correct sign in number + JP FPBCDE ; Move BCDE to FPREG + +FPROND: INC E ; Round LSB + RET NZ ; Return if ok + INC D ; Round NMSB + RET NZ ; Return if ok + INC C ; Round MSB + RET NZ ; Return if ok + LD C,80H ; Set normal value + INC (HL) ; Increment exponent + RET NZ ; Return if ok + JP OVERR ; Overflow error + +PLUCDE: LD A,(HL) ; Get LSB of FPREG + ADD A,E ; Add LSB of BCDE + LD E,A ; Save LSB of BCDE + INC HL + LD A,(HL) ; Get NMSB of FPREG + ADC A,D ; Add NMSB of BCDE + LD D,A ; Save NMSB of BCDE + INC HL + LD A,(HL) ; Get MSB of FPREG + ADC A,C ; Add MSB of BCDE + LD C,A ; Save MSB of BCDE + RET + +COMPL: LD HL,SGNRES ; Sign of result + LD A,(HL) ; Get sign of result + CPL ; Negate it + LD (HL),A ; Put it back + XOR A + LD L,A ; Set L to zero + SUB B ; Negate exponent,set carry + LD B,A ; Re-save exponent + LD A,L ; Load zero + SBC A,E ; Negate LSB + LD E,A ; Re-save LSB + LD A,L ; Load zero + SBC A,D ; Negate NMSB + LD D,A ; Re-save NMSB + LD A,L ; Load zero + SBC A,C ; Negate MSB + LD C,A ; Re-save MSB + RET + +SCALE: LD B,0 ; Clear underflow +SCALLP: SUB 8 ; 8 bits (a whole byte)? + JP C,SHRITE ; No - Shift right A bits + LD B,E ; <- Shift + LD E,D ; <- right + LD D,C ; <- eight + LD C,0 ; <- bits + JP SCALLP ; More bits to shift + +SHRITE: ADD A,8+1 ; Adjust count + LD L,A ; Save bits to shift +SHRLP: XOR A ; Flag for all done + DEC L ; All shifting done? + RET Z ; Yes - Return + LD A,C ; Get MSB +SHRT1: RRA ; Shift it right + LD C,A ; Re-save + LD A,D ; Get NMSB + RRA ; Shift right with last bit + LD D,A ; Re-save it + LD A,E ; Get LSB + RRA ; Shift right with last bit + LD E,A ; Re-save it + LD A,B ; Get underflow + RRA ; Shift right with last bit + LD B,A ; Re-save underflow + JP SHRLP ; More bits to do + +UNITY: .BYTE 000H,000H,000H,081H ; 1.00000 + +LOGTAB: .BYTE 3 ; Table used by LOG + .BYTE 0AAH,056H,019H,080H ; 0.59898 + .BYTE 0F1H,022H,076H,080H ; 0.96147 + .BYTE 045H,0AAH,038H,082H ; 2.88539 + +LOG: CALL TSTSGN ; Test sign of value + OR A + JP PE,FCERR ; ?FC Error if <= zero + LD HL,FPEXP ; Point to exponent + LD A,(HL) ; Get exponent + LD BC,8035H ; BCDE = SQR(1/2) + LD DE,04F3H + SUB B ; Scale value to be < 1 + PUSH AF ; Save scale factor + LD (HL),B ; Save new exponent + PUSH DE ; Save SQR(1/2) + PUSH BC + CALL FPADD ; Add SQR(1/2) to value + POP BC ; Restore SQR(1/2) + POP DE + INC B ; Make it SQR(2) + CALL DVBCDE ; Divide by SQR(2) + LD HL,UNITY ; Point to 1. + CALL SUBPHL ; Subtract FPREG from 1 + LD HL,LOGTAB ; Coefficient table + CALL SUMSER ; Evaluate sum of series + LD BC,8080H ; BCDE = -0.5 + LD DE,0000H + CALL FPADD ; Subtract 0.5 from FPREG + POP AF ; Restore scale factor + CALL RSCALE ; Re-scale number +MULLN2: LD BC,8031H ; BCDE = Ln(2) + LD DE,7218H + .BYTE 21H ; Skip "POP BC" and "POP DE" + +MULT: POP BC ; Get number from stack + POP DE +FPMULT: CALL TSTSGN ; Test sign of FPREG + RET Z ; Return zero if zero + LD L,0 ; Flag add exponents + CALL ADDEXP ; Add exponents + LD A,C ; Get MSB of multiplier + LD (MULVAL),A ; Save MSB of multiplier + EX DE,HL + LD (MULVAL+1),HL ; Save rest of multiplier + LD BC,0 ; Partial product (BCDE) = zero + LD D,B + LD E,B + LD HL,BNORM ; Address of normalise + PUSH HL ; Save for return + LD HL,MULT8 ; Address of 8 bit multiply + PUSH HL ; Save for NMSB,MSB + PUSH HL ; + LD HL,FPREG ; Point to number +MULT8: LD A,(HL) ; Get LSB of number + INC HL ; Point to NMSB + OR A ; Test LSB + JP Z,BYTSFT ; Zero - shift to next byte + PUSH HL ; Save address of number + LD L,8 ; 8 bits to multiply by +MUL8LP: RRA ; Shift LSB right + LD H,A ; Save LSB + LD A,C ; Get MSB + JP NC,NOMADD ; Bit was zero - Don't add + PUSH HL ; Save LSB and count + LD HL,(MULVAL+1) ; Get LSB and NMSB + ADD HL,DE ; Add NMSB and LSB + EX DE,HL ; Leave sum in DE + POP HL ; Restore MSB and count + LD A,(MULVAL) ; Get MSB of multiplier + ADC A,C ; Add MSB +NOMADD: RRA ; Shift MSB right + LD C,A ; Re-save MSB + LD A,D ; Get NMSB + RRA ; Shift NMSB right + LD D,A ; Re-save NMSB + LD A,E ; Get LSB + RRA ; Shift LSB right + LD E,A ; Re-save LSB + LD A,B ; Get VLSB + RRA ; Shift VLSB right + LD B,A ; Re-save VLSB + DEC L ; Count bits multiplied + LD A,H ; Get LSB of multiplier + JP NZ,MUL8LP ; More - Do it +POPHRT: POP HL ; Restore address of number + RET + +BYTSFT: LD B,E ; Shift partial product left + LD E,D + LD D,C + LD C,A + RET + +DIV10: CALL STAKFP ; Save FPREG on stack + LD BC,8420H ; BCDE = 10. + LD DE,0000H + CALL FPBCDE ; Move 10 to FPREG + +DIV: POP BC ; Get number from stack + POP DE +DVBCDE: CALL TSTSGN ; Test sign of FPREG + JP Z,DZERR ; Error if division by zero + LD L,-1 ; Flag subtract exponents + CALL ADDEXP ; Subtract exponents + INC (HL) ; Add 2 to exponent to adjust + INC (HL) + DEC HL ; Point to MSB + LD A,(HL) ; Get MSB of dividend + LD (DIV3),A ; Save for subtraction + DEC HL + LD A,(HL) ; Get NMSB of dividend + LD (DIV2),A ; Save for subtraction + DEC HL + LD A,(HL) ; Get MSB of dividend + LD (DIV1),A ; Save for subtraction + LD B,C ; Get MSB + EX DE,HL ; NMSB,LSB to HL + XOR A + LD C,A ; Clear MSB of quotient + LD D,A ; Clear NMSB of quotient + LD E,A ; Clear LSB of quotient + LD (DIV4),A ; Clear overflow count +DIVLP: PUSH HL ; Save divisor + PUSH BC + LD A,L ; Get LSB of number + CALL DIVSUP ; Subt' divisor from dividend + SBC A,0 ; Count for overflows + CCF + JP NC,RESDIV ; Restore divisor if borrow + LD (DIV4),A ; Re-save overflow count + POP AF ; Scrap divisor + POP AF + SCF ; Set carry to + .BYTE 0D2H ; Skip "POP BC" and "POP HL" + +RESDIV: POP BC ; Restore divisor + POP HL + LD A,C ; Get MSB of quotient + INC A + DEC A + RRA ; Bit 0 to bit 7 + JP M,RONDB ; Done - Normalise result + RLA ; Restore carry + LD A,E ; Get LSB of quotient + RLA ; Double it + LD E,A ; Put it back + LD A,D ; Get NMSB of quotient + RLA ; Double it + LD D,A ; Put it back + LD A,C ; Get MSB of quotient + RLA ; Double it + LD C,A ; Put it back + ADD HL,HL ; Double NMSB,LSB of divisor + LD A,B ; Get MSB of divisor + RLA ; Double it + LD B,A ; Put it back + LD A,(DIV4) ; Get VLSB of quotient + RLA ; Double it + LD (DIV4),A ; Put it back + LD A,C ; Get MSB of quotient + OR D ; Merge NMSB + OR E ; Merge LSB + JP NZ,DIVLP ; Not done - Keep dividing + PUSH HL ; Save divisor + LD HL,FPEXP ; Point to exponent + DEC (HL) ; Divide by 2 + POP HL ; Restore divisor + JP NZ,DIVLP ; Ok - Keep going + JP OVERR ; Overflow error + +ADDEXP: LD A,B ; Get exponent of dividend + OR A ; Test it + JP Z,OVTST3 ; Zero - Result zero + LD A,L ; Get add/subtract flag + LD HL,FPEXP ; Point to exponent + XOR (HL) ; Add or subtract it + ADD A,B ; Add the other exponent + LD B,A ; Save new exponent + RRA ; Test exponent for overflow + XOR B + LD A,B ; Get exponent + JP P,OVTST2 ; Positive - Test for overflow + ADD A,80H ; Add excess 128 + LD (HL),A ; Save new exponent + JP Z,POPHRT ; Zero - Result zero + CALL SIGNS ; Set MSBs and sign of result + LD (HL),A ; Save new exponent + DEC HL ; Point to MSB + RET + +OVTST1: CALL TSTSGN ; Test sign of FPREG + CPL ; Invert sign + POP HL ; Clean up stack +OVTST2: OR A ; Test if new exponent zero +OVTST3: POP HL ; Clear off return address + JP P,RESZER ; Result zero + JP OVERR ; Overflow error + +MLSP10: CALL BCDEFP ; Move FPREG to BCDE + LD A,B ; Get exponent + OR A ; Is it zero? + RET Z ; Yes - Result is zero + ADD A,2 ; Multiply by 4 + JP C,OVERR ; Overflow - ?OV Error + LD B,A ; Re-save exponent + CALL FPADD ; Add BCDE to FPREG (Times 5) + LD HL,FPEXP ; Point to exponent + INC (HL) ; Double number (Times 10) + RET NZ ; Ok - Return + JP OVERR ; Overflow error + +TSTSGN: LD A,(FPEXP) ; Get sign of FPREG + OR A + RET Z ; RETurn if number is zero + LD A,(FPREG+2) ; Get MSB of FPREG + .BYTE 0FEH ; Test sign +RETREL: CPL ; Invert sign + RLA ; Sign bit to carry +FLGDIF: SBC A,A ; Carry to all bits of A + RET NZ ; Return -1 if negative + INC A ; Bump to +1 + RET ; Positive - Return +1 + +SGN: CALL TSTSGN ; Test sign of FPREG +FLGREL: LD B,80H+8 ; 8 bit integer in exponent + LD DE,0 ; Zero NMSB and LSB +RETINT: LD HL,FPEXP ; Point to exponent + LD C,A ; CDE = MSB,NMSB and LSB + LD (HL),B ; Save exponent + LD B,0 ; CDE = integer to normalise + INC HL ; Point to sign of result + LD (HL),80H ; Set sign of result + RLA ; Carry = sign of integer + JP CONPOS ; Set sign of result + +ABS: CALL TSTSGN ; Test sign of FPREG + RET P ; Return if positive +INVSGN: LD HL,FPREG+2 ; Point to MSB + LD A,(HL) ; Get sign of mantissa + XOR 80H ; Invert sign of mantissa + LD (HL),A ; Re-save sign of mantissa + RET + +STAKFP: EX DE,HL ; Save code string address + LD HL,(FPREG) ; LSB,NLSB of FPREG + EX (SP),HL ; Stack them,get return + PUSH HL ; Re-save return + LD HL,(FPREG+2) ; MSB and exponent of FPREG + EX (SP),HL ; Stack them,get return + PUSH HL ; Re-save return + EX DE,HL ; Restore code string address + RET + +PHLTFP: CALL LOADFP ; Number at HL to BCDE +FPBCDE: EX DE,HL ; Save code string address + LD (FPREG),HL ; Save LSB,NLSB of number + LD H,B ; Exponent of number + LD L,C ; MSB of number + LD (FPREG+2),HL ; Save MSB and exponent + EX DE,HL ; Restore code string address + RET + +BCDEFP: LD HL,FPREG ; Point to FPREG +LOADFP: LD E,(HL) ; Get LSB of number + INC HL + LD D,(HL) ; Get NMSB of number + INC HL + LD C,(HL) ; Get MSB of number + INC HL + LD B,(HL) ; Get exponent of number +INCHL: INC HL ; Used for conditional "INC HL" + RET + +FPTHL: LD DE,FPREG ; Point to FPREG +DETHL4: LD B,4 ; 4 bytes to move +DETHLB: LD A,(DE) ; Get source + LD (HL),A ; Save destination + INC DE ; Next source + INC HL ; Next destination + DEC B ; Count bytes + JP NZ,DETHLB ; Loop if more + RET + +SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG + LD A,(HL) ; Get MSB + RLCA ; Old sign to carry + SCF ; Set MSBit + RRA ; Set MSBit of MSB + LD (HL),A ; Save new MSB + CCF ; Complement sign + RRA ; Old sign to carry + INC HL + INC HL + LD (HL),A ; Set sign of result + LD A,C ; Get MSB + RLCA ; Old sign to carry + SCF ; Set MSBit + RRA ; Set MSBit of MSB + LD C,A ; Save MSB + RRA + XOR (HL) ; New sign of result + RET + +CMPNUM: LD A,B ; Get exponent of number + OR A + JP Z,TSTSGN ; Zero - Test sign of FPREG + LD HL,RETREL ; Return relation routine + PUSH HL ; Save for return + CALL TSTSGN ; Test sign of FPREG + LD A,C ; Get MSB of number + RET Z ; FPREG zero - Number's MSB + LD HL,FPREG+2 ; MSB of FPREG + XOR (HL) ; Combine signs + LD A,C ; Get MSB of number + RET M ; Exit if signs different + CALL CMPFP ; Compare FP numbers + RRA ; Get carry to sign + XOR C ; Combine with MSB of number + RET + +CMPFP: INC HL ; Point to exponent + LD A,B ; Get exponent + CP (HL) ; Compare exponents + RET NZ ; Different + DEC HL ; Point to MBS + LD A,C ; Get MSB + CP (HL) ; Compare MSBs + RET NZ ; Different + DEC HL ; Point to NMSB + LD A,D ; Get NMSB + CP (HL) ; Compare NMSBs + RET NZ ; Different + DEC HL ; Point to LSB + LD A,E ; Get LSB + SUB (HL) ; Compare LSBs + RET NZ ; Different + POP HL ; Drop RETurn + POP HL ; Drop another RETurn + RET + +FPINT: LD B,A ; <- Move + LD C,A ; <- exponent + LD D,A ; <- to all + LD E,A ; <- bits + OR A ; Test exponent + RET Z ; Zero - Return zero + PUSH HL ; Save pointer to number + CALL BCDEFP ; Move FPREG to BCDE + CALL SIGNS ; Set MSBs & sign of result + XOR (HL) ; Combine with sign of FPREG + LD H,A ; Save combined signs + CALL M,DCBCDE ; Negative - Decrement BCDE + LD A,80H+24 ; 24 bits + SUB B ; Bits to shift + CALL SCALE ; Shift BCDE + LD A,H ; Get combined sign + RLA ; Sign to carry + CALL C,FPROND ; Negative - Round number up + LD B,0 ; Zero exponent + CALL C,COMPL ; If negative make positive + POP HL ; Restore pointer to number + RET + +DCBCDE: DEC DE ; Decrement BCDE + LD A,D ; Test LSBs + AND E + INC A + RET NZ ; Exit if LSBs not FFFF + DEC BC ; Decrement MSBs + RET + +INT: LD HL,FPEXP ; Point to exponent + LD A,(HL) ; Get exponent + CP 80H+24 ; Integer accuracy only? + LD A,(FPREG) ; Get LSB + RET NC ; Yes - Already integer + LD A,(HL) ; Get exponent + CALL FPINT ; F.P to integer + LD (HL),80H+24 ; Save 24 bit integer + LD A,E ; Get LSB of number + PUSH AF ; Save LSB + LD A,C ; Get MSB of number + RLA ; Sign to carry + CALL CONPOS ; Set sign of result + POP AF ; Restore LSB of number + RET + +MLDEBC: LD HL,0 ; Clear partial product + LD A,B ; Test multiplier + OR C + RET Z ; Return zero if zero + LD A,16 ; 16 bits +MLDBLP: ADD HL,HL ; Shift P.P left + JP C,BSERR ; ?BS Error if overflow + EX DE,HL + ADD HL,HL ; Shift multiplier left + EX DE,HL + JP NC,NOMLAD ; Bit was zero - No add + ADD HL,BC ; Add multiplicand + JP C,BSERR ; ?BS Error if overflow +NOMLAD: DEC A ; Count bits + JP NZ,MLDBLP ; More + RET + +ASCTFP: CP '-' ; Negative? + PUSH AF ; Save it and flags + JP Z,CNVNUM ; Yes - Convert number + CP '+' ; Positive? + JP Z,CNVNUM ; Yes - Convert number + DEC HL ; DEC 'cos GETCHR INCs +CNVNUM: CALL RESZER ; Set result to zero + LD B,A ; Digits after point counter + LD D,A ; Sign of exponent + LD E,A ; Exponent of ten + CPL + LD C,A ; Before or after point flag +MANLP: CALL GETCHR ; Get next character + JP C,ADDIG ; Digit - Add to number + CP '.' + JP Z,DPOINT ; '.' - Flag point + CP 'E' + JP NZ,CONEXP ; Not 'E' - Scale number + CALL GETCHR ; Get next character + CALL SGNEXP ; Get sign of exponent +EXPLP: CALL GETCHR ; Get next character + JP C,EDIGIT ; Digit - Add to exponent + INC D ; Is sign negative? + JP NZ,CONEXP ; No - Scale number + XOR A + SUB E ; Negate exponent + LD E,A ; And re-save it + INC C ; Flag end of number +DPOINT: INC C ; Flag point passed + JP Z,MANLP ; Zero - Get another digit +CONEXP: PUSH HL ; Save code string address + LD A,E ; Get exponent + SUB B ; Subtract digits after point +SCALMI: CALL P,SCALPL ; Positive - Multiply number + JP P,ENDCON ; Positive - All done + PUSH AF ; Save number of times to /10 + CALL DIV10 ; Divide by 10 + POP AF ; Restore count + INC A ; Count divides + +ENDCON: JP NZ,SCALMI ; More to do + POP DE ; Restore code string address + POP AF ; Restore sign of number + CALL Z,INVSGN ; Negative - Negate number + EX DE,HL ; Code string address to HL + RET + +SCALPL: RET Z ; Exit if no scaling needed +MULTEN: PUSH AF ; Save count + CALL MLSP10 ; Multiply number by 10 + POP AF ; Restore count + DEC A ; Count multiplies + RET + +ADDIG: PUSH DE ; Save sign of exponent + LD D,A ; Save digit + LD A,B ; Get digits after point + ADC A,C ; Add one if after point + LD B,A ; Re-save counter + PUSH BC ; Save point flags + PUSH HL ; Save code string address + PUSH DE ; Save digit + CALL MLSP10 ; Multiply number by 10 + POP AF ; Restore digit + SUB '0' ; Make it absolute + CALL RSCALE ; Re-scale number + POP HL ; Restore code string address + POP BC ; Restore point flags + POP DE ; Restore sign of exponent + JP MANLP ; Get another digit + +RSCALE: CALL STAKFP ; Put number on stack + CALL FLGREL ; Digit to add to FPREG +PADD: POP BC ; Restore number + POP DE + JP FPADD ; Add BCDE to FPREG and return + +EDIGIT: LD A,E ; Get digit + RLCA ; Times 2 + RLCA ; Times 4 + ADD A,E ; Times 5 + RLCA ; Times 10 + ADD A,(HL) ; Add next digit + SUB '0' ; Make it absolute + LD E,A ; Save new digit + JP EXPLP ; Look for another digit + +LINEIN: PUSH HL ; Save code string address + LD HL,INMSG ; Output " in " + CALL PRS ; Output string at HL + POP HL ; Restore code string address +PRNTHL: EX DE,HL ; Code string address to DE + XOR A + LD B,80H+24 ; 24 bits + CALL RETINT ; Return the integer + LD HL,PRNUMS ; Print number string + PUSH HL ; Save for return +NUMASC: LD HL,PBUFF ; Convert number to ASCII + PUSH HL ; Save for return + CALL TSTSGN ; Test sign of FPREG + LD (HL),' ' ; Space at start + JP P,SPCFST ; Positive - Space to start + LD (HL),'-' ; '-' sign at start +SPCFST: INC HL ; First byte of number + LD (HL),'0' ; '0' if zero + JP Z,JSTZER ; Return '0' if zero + PUSH HL ; Save buffer address + CALL M,INVSGN ; Negate FPREG if negative + XOR A ; Zero A + PUSH AF ; Save it + CALL RNGTST ; Test number is in range +SIXDIG: LD BC,9143H ; BCDE - 99999.9 + LD DE,4FF8H + CALL CMPNUM ; Compare numbers + OR A + JP PO,INRNG ; > 99999.9 - Sort it out + POP AF ; Restore count + CALL MULTEN ; Multiply by ten + PUSH AF ; Re-save count + JP SIXDIG ; Test it again + +GTSIXD: CALL DIV10 ; Divide by 10 + POP AF ; Get count + INC A ; Count divides + PUSH AF ; Re-save count + CALL RNGTST ; Test number is in range +INRNG: CALL ROUND ; Add 0.5 to FPREG + INC A + CALL FPINT ; F.P to integer + CALL FPBCDE ; Move BCDE to FPREG + LD BC,0306H ; 1E+06 to 1E-03 range + POP AF ; Restore count + ADD A,C ; 6 digits before point + INC A ; Add one + JP M,MAKNUM ; Do it in 'E' form if < 1E-02 + CP 6+1+1 ; More than 999999 ? + JP NC,MAKNUM ; Yes - Do it in 'E' form + INC A ; Adjust for exponent + LD B,A ; Exponent of number + LD A,2 ; Make it zero after + +MAKNUM: DEC A ; Adjust for digits to do + DEC A + POP HL ; Restore buffer address + PUSH AF ; Save count + LD DE,POWERS ; Powers of ten + DEC B ; Count digits before point + JP NZ,DIGTXT ; Not zero - Do number + LD (HL),'.' ; Save point + INC HL ; Move on + LD (HL),'0' ; Save zero + INC HL ; Move on +DIGTXT: DEC B ; Count digits before point + LD (HL),'.' ; Save point in case + CALL Z,INCHL ; Last digit - move on + PUSH BC ; Save digits before point + PUSH HL ; Save buffer address + PUSH DE ; Save powers of ten + CALL BCDEFP ; Move FPREG to BCDE + POP HL ; Powers of ten table + LD B, '0'-1 ; ASCII '0' - 1 +TRYAGN: INC B ; Count subtractions + LD A,E ; Get LSB + SUB (HL) ; Subtract LSB + LD E,A ; Save LSB + INC HL + LD A,D ; Get NMSB + SBC A,(HL) ; Subtract NMSB + LD D,A ; Save NMSB + INC HL + LD A,C ; Get MSB + SBC A,(HL) ; Subtract MSB + LD C,A ; Save MSB + DEC HL ; Point back to start + DEC HL + JP NC,TRYAGN ; No overflow - Try again + CALL PLUCDE ; Restore number + INC HL ; Start of next number + CALL FPBCDE ; Move BCDE to FPREG + EX DE,HL ; Save point in table + POP HL ; Restore buffer address + LD (HL),B ; Save digit in buffer + INC HL ; And move on + POP BC ; Restore digit count + DEC C ; Count digits + JP NZ,DIGTXT ; More - Do them + DEC B ; Any decimal part? + JP Z,DOEBIT ; No - Do 'E' bit +SUPTLZ: DEC HL ; Move back through buffer + LD A,(HL) ; Get character + CP '0' ; '0' character? + JP Z,SUPTLZ ; Yes - Look back for more + CP '.' ; A decimal point? + CALL NZ,INCHL ; Move back over digit + +DOEBIT: POP AF ; Get 'E' flag + JP Z,NOENED ; No 'E' needed - End buffer + LD (HL),'E' ; Put 'E' in buffer + INC HL ; And move on + LD (HL),'+' ; Put '+' in buffer + JP P,OUTEXP ; Positive - Output exponent + LD (HL),'-' ; Put '-' in buffer + CPL ; Negate exponent + INC A +OUTEXP: LD B,'0'-1 ; ASCII '0' - 1 +EXPTEN: INC B ; Count subtractions + SUB 10 ; Tens digit + JP NC,EXPTEN ; More to do + ADD A,'0'+10 ; Restore and make ASCII + INC HL ; Move on + LD (HL),B ; Save MSB of exponent +JSTZER: INC HL ; + LD (HL),A ; Save LSB of exponent + INC HL +NOENED: LD (HL),C ; Mark end of buffer + POP HL ; Restore code string address + RET + +RNGTST: LD BC,9474H ; BCDE = 999999. + LD DE,23F7H + CALL CMPNUM ; Compare numbers + OR A + POP HL ; Return address to HL + JP PO,GTSIXD ; Too big - Divide by ten + JP (HL) ; Otherwise return to caller + +HALF: .BYTE 00H,00H,00H,80H ; 0.5 + +POWERS: .BYTE 0A0H,086H,001H ; 100000 + .BYTE 010H,027H,000H ; 10000 + .BYTE 0E8H,003H,000H ; 1000 + .BYTE 064H,000H,000H ; 100 + .BYTE 00AH,000H,000H ; 10 + .BYTE 001H,000H,000H ; 1 + +NEGAFT: LD HL,INVSGN ; Negate result + EX (SP),HL ; To be done after caller + JP (HL) ; Return to caller + +SQR: CALL STAKFP ; Put value on stack + LD HL,HALF ; Set power to 1/2 + CALL PHLTFP ; Move 1/2 to FPREG + +POWER: POP BC ; Get base + POP DE + CALL TSTSGN ; Test sign of power + LD A,B ; Get exponent of base + JP Z,EXP ; Make result 1 if zero + JP P,POWER1 ; Positive base - Ok + OR A ; Zero to negative power? + JP Z,DZERR ; Yes - ?/0 Error +POWER1: OR A ; Base zero? + JP Z,SAVEXP ; Yes - Return zero + PUSH DE ; Save base + PUSH BC + LD A,C ; Get MSB of base + OR 01111111B ; Get sign status + CALL BCDEFP ; Move power to BCDE + JP P,POWER2 ; Positive base - Ok + PUSH DE ; Save power + PUSH BC + CALL INT ; Get integer of power + POP BC ; Restore power + POP DE + PUSH AF ; MSB of base + CALL CMPNUM ; Power an integer? + POP HL ; Restore MSB of base + LD A,H ; but don't affect flags + RRA ; Exponent odd or even? +POWER2: POP HL ; Restore MSB and exponent + LD (FPREG+2),HL ; Save base in FPREG + POP HL ; LSBs of base + LD (FPREG),HL ; Save in FPREG + CALL C,NEGAFT ; Odd power - Negate result + CALL Z,INVSGN ; Negative base - Negate it + PUSH DE ; Save power + PUSH BC + CALL LOG ; Get LOG of base + POP BC ; Restore power + POP DE + CALL FPMULT ; Multiply LOG by power + +EXP: CALL STAKFP ; Put value on stack + LD BC,08138H ; BCDE = 1/Ln(2) + LD DE,0AA3BH + CALL FPMULT ; Multiply value by 1/LN(2) + LD A,(FPEXP) ; Get exponent + CP 80H+8 ; Is it in range? + JP NC,OVTST1 ; No - Test for overflow + CALL INT ; Get INT of FPREG + ADD A,80H ; For excess 128 + ADD A,2 ; Exponent > 126? + JP C,OVTST1 ; Yes - Test for overflow + PUSH AF ; Save scaling factor + LD HL,UNITY ; Point to 1. + CALL ADDPHL ; Add 1 to FPREG + CALL MULLN2 ; Multiply by LN(2) + POP AF ; Restore scaling factor + POP BC ; Restore exponent + POP DE + PUSH AF ; Save scaling factor + CALL SUBCDE ; Subtract exponent from FPREG + CALL INVSGN ; Negate result + LD HL,EXPTAB ; Coefficient table + CALL SMSER1 ; Sum the series + LD DE,0 ; Zero LSBs + POP BC ; Scaling factor + LD C,D ; Zero MSB + JP FPMULT ; Scale result to correct value + +EXPTAB: .BYTE 8 ; Table used by EXP + .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040) + .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720) + .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120) + .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24) + .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6) + .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2) + .BYTE 000H,000H,080H,081H ; -1/1! (-1/1) + .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1) + +SUMSER: CALL STAKFP ; Put FPREG on stack + LD DE,MULT ; Multiply by "X" + PUSH DE ; To be done after + PUSH HL ; Save address of table + CALL BCDEFP ; Move FPREG to BCDE + CALL FPMULT ; Square the value + POP HL ; Restore address of table +SMSER1: CALL STAKFP ; Put value on stack + LD A,(HL) ; Get number of coefficients + INC HL ; Point to start of table + CALL PHLTFP ; Move coefficient to FPREG + .BYTE 06H ; Skip "POP AF" +SUMLP: POP AF ; Restore count + POP BC ; Restore number + POP DE + DEC A ; Cont coefficients + RET Z ; All done + PUSH DE ; Save number + PUSH BC + PUSH AF ; Save count + PUSH HL ; Save address in table + CALL FPMULT ; Multiply FPREG by BCDE + POP HL ; Restore address in table + CALL LOADFP ; Number at HL to BCDE + PUSH HL ; Save address in table + CALL FPADD ; Add coefficient to FPREG + POP HL ; Restore address in table + JP SUMLP ; More coefficients + +RND: CALL TSTSGN ; Test sign of FPREG + LD HL,SEED+2 ; Random number seed + JP M,RESEED ; Negative - Re-seed + LD HL,LSTRND ; Last random number + CALL PHLTFP ; Move last RND to FPREG + LD HL,SEED+2 ; Random number seed + RET Z ; Return if RND(0) + ADD A,(HL) ; Add (SEED)+2) + AND 00000111B ; 0 to 7 + LD B,0 + LD (HL),A ; Re-save seed + INC HL ; Move to coefficient table + ADD A,A ; 4 bytes + ADD A,A ; per entry + LD C,A ; BC = Offset into table + ADD HL,BC ; Point to coefficient + CALL LOADFP ; Coefficient to BCDE + CALL FPMULT ; ; Multiply FPREG by coefficient + LD A,(SEED+1) ; Get (SEED+1) + INC A ; Add 1 + AND 00000011B ; 0 to 3 + LD B,0 + CP 1 ; Is it zero? + ADC A,B ; Yes - Make it 1 + LD (SEED+1),A ; Re-save seed + LD HL,RNDTAB-4 ; Addition table + ADD A,A ; 4 bytes + ADD A,A ; per entry + LD C,A ; BC = Offset into table + ADD HL,BC ; Point to value + CALL ADDPHL ; Add value to FPREG +RND1: CALL BCDEFP ; Move FPREG to BCDE + LD A,E ; Get LSB + LD E,C ; LSB = MSB + XOR 01001111B ; Fiddle around + LD C,A ; New MSB + LD (HL),80H ; Set exponent + DEC HL ; Point to MSB + LD B,(HL) ; Get MSB + LD (HL),80H ; Make value -0.5 + LD HL,SEED ; Random number seed + INC (HL) ; Count seed + LD A,(HL) ; Get seed + SUB 171 ; Do it modulo 171 + JP NZ,RND2 ; Non-zero - Ok + LD (HL),A ; Zero seed + INC C ; Fillde about + DEC D ; with the + INC E ; number +RND2: CALL BNORM ; Normalise number + LD HL,LSTRND ; Save random number + JP FPTHL ; Move FPREG to last and return + +RESEED: LD (HL),A ; Re-seed random numbers + DEC HL + LD (HL),A + DEC HL + LD (HL),A + JP RND1 ; Return RND seed + +RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND + .BYTE 099H,0E9H,092H,069H + .BYTE 010H,0D1H,075H,068H + +COS: LD HL,HALFPI ; Point to PI/2 + CALL ADDPHL ; Add it to PPREG +SIN: CALL STAKFP ; Put angle on stack + LD BC,8349H ; BCDE = 2 PI + LD DE,0FDBH + CALL FPBCDE ; Move 2 PI to FPREG + POP BC ; Restore angle + POP DE + CALL DVBCDE ; Divide angle by 2 PI + CALL STAKFP ; Put it on stack + CALL INT ; Get INT of result + POP BC ; Restore number + POP DE + CALL SUBCDE ; Make it 0 <= value < 1 + LD HL,QUARTR ; Point to 0.25 + CALL SUBPHL ; Subtract value from 0.25 + CALL TSTSGN ; Test sign of value + SCF ; Flag positive + JP P,SIN1 ; Positive - Ok + CALL ROUND ; Add 0.5 to value + CALL TSTSGN ; Test sign of value + OR A ; Flag negative +SIN1: PUSH AF ; Save sign + CALL P,INVSGN ; Negate value if positive + LD HL,QUARTR ; Point to 0.25 + CALL ADDPHL ; Add 0.25 to value + POP AF ; Restore sign + CALL NC,INVSGN ; Negative - Make positive + LD HL,SINTAB ; Coefficient table + JP SUMSER ; Evaluate sum of series + +HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2) + +QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25 + +SINTAB: .BYTE 5 ; Table used by SIN + .BYTE 0BAH,0D7H,01EH,086H ; 39.711 + .BYTE 064H,026H,099H,087H ;-76.575 + .BYTE 058H,034H,023H,087H ; 81.602 + .BYTE 0E0H,05DH,0A5H,086H ;-41.342 + .BYTE 0DAH,00FH,049H,083H ; 6.2832 + +TAN: CALL STAKFP ; Put angle on stack + CALL SIN ; Get SIN of angle + POP BC ; Restore angle + POP HL + CALL STAKFP ; Save SIN of angle + EX DE,HL ; BCDE = Angle + CALL FPBCDE ; Angle to FPREG + CALL COS ; Get COS of angle + JP DIV ; TAN = SIN / COS + +ATN: CALL TSTSGN ; Test sign of value + CALL M,NEGAFT ; Negate result after if -ve + CALL M,INVSGN ; Negate value if -ve + LD A,(FPEXP) ; Get exponent + CP 81H ; Number less than 1? + JP C,ATN1 ; Yes - Get arc tangnt + LD BC,8100H ; BCDE = 1 + LD D,C + LD E,C + CALL DVBCDE ; Get reciprocal of number + LD HL,SUBPHL ; Sub angle from PI/2 + PUSH HL ; Save for angle > 1 +ATN1: LD HL,ATNTAB ; Coefficient table + CALL SUMSER ; Evaluate sum of series + LD HL,HALFPI ; PI/2 - angle in case > 1 + RET ; Number > 1 - Sub from PI/2 + +ATNTAB: .BYTE 9 ; Table used by ATN + .BYTE 04AH,0D7H,03BH,078H ; 1/17 + .BYTE 002H,06EH,084H,07BH ;-1/15 + .BYTE 0FEH,0C1H,02FH,07CH ; 1/13 + .BYTE 074H,031H,09AH,07DH ;-1/11 + .BYTE 084H,03DH,05AH,07DH ; 1/9 + .BYTE 0C8H,07FH,091H,07EH ;-1/7 + .BYTE 0E4H,0BBH,04CH,07EH ; 1/5 + .BYTE 06CH,0AAH,0AAH,07FH ;-1/3 + .BYTE 000H,000H,000H,081H ; 1/1 + + +ARET: RET ; A RETurn instruction + +GETINP: RST 10H ;input a character + RET + +CLS: + LD A,CS ; ASCII Clear screen + JP MONOUT ; Output character + +WIDTH: CALL GETINT ; Get integer 0-255 + LD A,E ; Width to A + LD (LWIDTH),A ; Set width + RET + +LINES: CALL GETNUM ; Get a number + CALL DEINT ; Get integer -32768 to 32767 + LD (LINESC),DE ; Set lines counter + LD (LINESN),DE ; Set lines number + RET + +DEEK: CALL DEINT ; Get integer -32768 to 32767 + PUSH DE ; Save number + POP HL ; Number to HL + LD B,(HL) ; Get LSB of contents + INC HL + LD A,(HL) ; Get MSB of contents + JP ABPASS ; Return integer AB + +DOKE: CALL GETNUM ; Get a number + CALL DEINT ; Get integer -32768 to 32767 + PUSH DE ; Save address + CALL CHKSYN ; Make sure ',' follows + .BYTE ',' + CALL GETNUM ; Get a number + CALL DEINT ; Get integer -32768 to 32767 + EX (SP),HL ; Save value,get address + LD (HL),E ; Save LSB of value + INC HL + LD (HL),D ; Save MSB of value + POP HL ; Restore code string address + RET + + +; HEX$(nn) Convert 16 bit number to Hexadecimal string + +HEX: CALL TSTNUM ; Verify it's a number + CALL DEINT ; Get integer -32768 to 32767 + PUSH BC ; Save contents of BC + LD HL,PBUFF + LD A,D ; Get high order into A + CP $0 + JR Z,HEX2 ; Skip output if both high digits are zero + CALL BYT2ASC ; Convert D to ASCII + LD A,B + CP '0' + JR Z,HEX1 ; Don't store high digit if zero + LD (HL),B ; Store it to PBUFF + INC HL ; Next location +HEX1: LD (HL),C ; Store C to PBUFF+1 + INC HL ; Next location +HEX2: LD A,E ; Get lower byte + CALL BYT2ASC ; Convert E to ASCII + LD A,D + CP $0 + JR NZ,HEX3 ; If upper byte was not zero then always print lower byte + LD A,B + CP '0' ; If high digit of lower byte is zero then don't print + JR Z,HEX4 +HEX3: LD (HL),B ; to PBUFF+2 + INC HL ; Next location +HEX4: LD (HL),C ; to PBUFF+3 + INC HL ; PBUFF+4 to zero + XOR A ; Terminating character + LD (HL),A ; Store zero to terminate + INC HL ; Make sure PBUFF is terminated + LD (HL),A ; Store the double zero there + POP BC ; Get BC back + LD HL,PBUFF ; Reset to start of PBUFF + JP STR1 ; Convert the PBUFF to a string and return it + +BYT2ASC LD B,A ; Save original value + AND $0F ; Strip off upper nybble + CP $0A ; 0-9? + JR C,ADD30 ; If A-F, add 7 more + ADD A,$07 ; Bring value up to ASCII A-F +ADD30 ADD A,$30 ; And make ASCII + LD C,A ; Save converted char to C + LD A,B ; Retrieve original value + RRCA ; and Rotate it right + RRCA + RRCA + RRCA + AND $0F ; Mask off upper nybble + CP $0A ; 0-9? < A hex? + JR C,ADD301 ; Skip Add 7 + ADD A,$07 ; Bring it up to ASCII A-F +ADD301 ADD A,$30 ; And make it full ASCII + LD B,A ; Store high order byte + RET + +; Convert "&Hnnnn" to FPREG +; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" +; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 +HEXTFP EX DE,HL ; Move code string pointer to DE + LD HL,$0000 ; Zero out the value + CALL GETHEX ; Check the number for valid hex + JP C,HXERR ; First value wasn't hex, HX error + JR HEXLP1 ; Convert first character +HEXLP CALL GETHEX ; Get second and addtional characters + JR C,HEXIT ; Exit if not a hex character +HEXLP1 ADD HL,HL ; Rotate 4 bits to the left + ADD HL,HL + ADD HL,HL + ADD HL,HL + OR L ; Add in D0-D3 into L + LD L,A ; Save new value + JR HEXLP ; And continue until all hex characters are in + +GETHEX INC DE ; Next location + LD A,(DE) ; Load character at pointer + CP ' ' + JP Z,GETHEX ; Skip spaces + SUB $30 ; Get absolute value + RET C ; < "0", error + CP $0A + JR C,NOSUB7 ; Is already in the range 0-9 + SUB $07 ; Reduce to A-F + CP $0A ; Value should be $0A-$0F at this point + RET C ; CY set if was : ; < = > ? @ +NOSUB7 CP $10 ; > Greater than "F"? + CCF + RET ; CY set if it wasn't valid hex + +HEXIT EX DE,HL ; Value into DE, Code string into HL + LD A,D ; Load DE into AC + LD C,E ; For prep to + PUSH HL + CALL ACPASS ; ACPASS to set AC as integer into FPREG + POP HL + RET + +HXERR: LD E,HX ; ?HEX Error + JP ERROR + +; BIN$(NN) Convert integer to a 1-16 char binary string +BIN: CALL TSTNUM ; Verify it's a number + CALL DEINT ; Get integer -32768 to 32767 +BIN2: PUSH BC ; Save contents of BC + LD HL,PBUFF + LD B,17 ; One higher than max char count +ZEROSUP: ; Suppress leading zeros + DEC B ; Max 16 chars + LD A,B + CP $01 + JR Z,BITOUT ; Always output at least one character + RL E + RL D + JR NC,ZEROSUP + JR BITOUT2 +BITOUT: + RL E + RL D ; Top bit now in carry +BITOUT2: + LD A,'0' ; Char for '0' + ADC A,0 ; If carry set then '0' --> '1' + LD (HL),A + INC HL + DEC B + JR NZ,BITOUT + XOR A ; Terminating character + LD (HL),A ; Store zero to terminate + INC HL ; Make sure PBUFF is terminated + LD (HL),A ; Store the double zero there + POP BC + LD HL,PBUFF + JP STR1 + +; Convert "&Bnnnn" to FPREG +; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" +BINTFP: EX DE,HL ; Move code string pointer to DE + LD HL,$0000 ; Zero out the value + CALL CHKBIN ; Check the number for valid bin + JP C,BINERR ; First value wasn't bin, HX error +BINIT: SUB '0' + ADD HL,HL ; Rotate HL left + OR L + LD L,A + CALL CHKBIN ; Get second and addtional characters + JR NC,BINIT ; Process if a bin character + EX DE,HL ; Value into DE, Code string into HL + LD A,D ; Load DE into AC + LD C,E ; For prep to + PUSH HL + CALL ACPASS ; ACPASS to set AC as integer into FPREG + POP HL + RET + +; Char is in A, NC if char is 0 or 1 +CHKBIN: INC DE + LD A,(DE) + CP ' ' + JP Z,CHKBIN ; Skip spaces + CP '0' ; Set C if < '0' + RET C + CP '2' + CCF ; Set C if > '1' + RET + +BINERR: LD E,BN ; ?BIN Error + JP ERROR + + +JJUMP1: + LD IX,-1 ; Flag cold start + JP CSTART ; Go and initialise + +MONOUT: + JP $0008 ; output a char + + +MONITR: + JP $0000 ; Restart (Normally Monitor Start) + + +INITST: LD A,0 ; Clear break flag + LD (BRKFLG),A + JP INIT + +ARETN: RETN ; Return from NMI + + +TSTBIT: PUSH AF ; Save bit mask + AND B ; Get common bits + POP BC ; Restore bit mask + CP B ; Same bit set? + LD A,0 ; Return 0 in A + RET + +OUTNCR: CALL OUTC ; Output character in A + JP PRNTCRLF ; Output CRLF + diff --git a/Z80 CPM and bootloader (basmon)/source/mon.asm b/Z80 CPM and bootloader (basmon)/source/mon.asm new file mode 100644 index 0000000..81f0c86 --- /dev/null +++ b/Z80 CPM and bootloader (basmon)/source/mon.asm @@ -0,0 +1,693 @@ +;================================================================================== +; Contents of this file are copyright Grant Searle +; HEX routines from Joel Owens. +; +; You have permission to use this for NON COMMERCIAL USE ONLY +; If you wish to use it elsewhere, please include an acknowledgement to myself. +; +; http://searle.hostei.com/grant/index.html +; +; eMail: home.micros01@btinternet.com +; +; If the above don't work, please perform an Internet search to see if I have +; updated the web page hosting service. +; +;================================================================================== + +;------------------------------------------------------------------------------ +; +; Z80 Monitor Rom +; +;------------------------------------------------------------------------------ +; General Equates +;------------------------------------------------------------------------------ + +;CR .EQU 0DH +;LF .EQU 0AH +;ESC .EQU 1BH +;CTRLC .EQU 03H +M_CLS .EQU 0CH + + +loadAddr .EQU 0D000h ; CP/M load address +numSecs .EQU 24 ; Number of 512 sectors to be loaded + + +RTS_HIGH .EQU 0D5H +RTS_LOW .EQU 095H + +ACIA0_D .EQU $81 +ACIA0_C .EQU $80 +ACIA1_D .EQU $83 +ACIA1_C .EQU $82 + +SD_DATA .EQU 088H +SD_CONTROL .EQU 089H +SD_STATUS .EQU 089H +SD_LBA0 .EQU 08AH +SD_LBA1 .EQU 08BH +SD_LBA2 .EQU 08CH + + .ORG $3000 + +primaryIO .ds 1 +secNo .ds 1 +dmaAddr .ds 2 +InitTxtB .ds 2 + +lba0 .DB 00h +lba1 .DB 00h +lba2 .DB 00h +lba3 .DB 00h + +stackSpace .ds 32 +M_STACK .EQU $ ; Stack top + + +;------------------------------------------------------------------------------ +; START OF MONITOR ROM +;------------------------------------------------------------------------------ + +MON .ORG $0000 ; MONITOR ROM RESET VECTOR +;------------------------------------------------------------------------------ +; Reset +;------------------------------------------------------------------------------ +RST00 DI ;Disable INTerrupts + JP M_INIT ;Initialize Hardware and go + NOP + NOP + NOP + NOP +;------------------------------------------------------------------------------ +; TX a character over RS232 wait for TXDONE first. +;------------------------------------------------------------------------------ +RST08 JP conout + NOP + NOP + NOP + NOP + NOP +;------------------------------------------------------------------------------ +; RX a character from buffer wait until char ready. +;------------------------------------------------------------------------------ +RST10 JP conin + NOP + NOP + NOP + NOP + NOP +;------------------------------------------------------------------------------ +; Check input buffer status +;------------------------------------------------------------------------------ +RST18 JP CKINCHAR + + +;------------------------------------------------------------------------------ +; Console input routine +; Use the "primaryIO" flag to determine which input port to monitor. +;------------------------------------------------------------------------------ +conin: + LD A,(primaryIO) + CP 0 + JR NZ,coninB +coninA: + +waitForCharA: + call ckincharA + JR Z, waitForCharA + IN A,(ACIA0_D) + RET ; Char ready in A + +coninB: + +waitForCharB: + call ckincharB + JR Z, waitForCharB + IN A,(ACIA1_D) + RET ; Char ready in A + +;------------------------------------------------------------------------------ +; Console output routine +; Use the "primaryIO" flag to determine which output port to send a character. +;------------------------------------------------------------------------------ +conout: PUSH AF ; Store character + LD A,(primaryIO) + CP 0 + JR NZ,conoutB1 + JR conoutA1 +conoutA: + PUSH AF + +conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting + JR Z,conoutA1 ; Loop until ACIA flag signals ready + POP AF ; RETrieve character + OUT (ACIA0_D),A ; OUTput the character + RET + +conoutB: + PUSH AF + +conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting + JR Z,conoutB1 ; Loop until ACIA flag signals ready + POP AF ; RETrieve character + OUT (ACIA1_D),A ; OUTput the character + RET + +;------------------------------------------------------------------------------ +; Non blocking console output routine +; On return Z flag is 0, if the character could be written, else 1 +; Use the "primaryIO" flag to determine which output port to send a character. +;------------------------------------------------------------------------------ +nbconoutB: + PUSH AF + +nbconoutB1: CALL CKACIA1 ; See if ACIA channel B has finished transmitting + JR NZ, nbconoutB2 ; Ready to write + POP AF ; Remove the parameter we don't need + AND $00 ; Indicate failure + RET ; Return if ACIA flag signals not ready +nbconoutB2: + POP AF ; RETrieve character + OUT (ACIA1_D),A ; OUTput the character + OR $ff ; Indicate success + RET + +;------------------------------------------------------------------------------ +; I/O status check routine +; Use the "primaryIO" flag to determine which port to check. +;------------------------------------------------------------------------------ +CKACIA0 + IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready + RRCA ; Rotates RX status into Carry Flag, + BIT 0,A ; Set Zero flag if still transmitting character + RET + +CKACIA1 + IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready + RRCA ; Rotates RX status into Carry Flag, + BIT 0,A ; Set Zero flag if still transmitting character + RET + +;------------------------------------------------------------------------------ +; Check if there is a character in the input buffer +; Use the "primaryIO" flag to determine which port to check. +;------------------------------------------------------------------------------ +CKINCHAR + LD A,(primaryIO) + CP 0 + JR NZ,ckincharB + +ckincharA: + + IN A,(ACIA0_C) ; Status byte + AND $01 + CP $0 ; Z flag set if no char + RET + +ckincharB: + + IN A,(ACIA1_C) ; Status byte + AND $01 + CP $0 ; Z flag set if no char + RET + +;------------------------------------------------------------------------------ +; Filtered Character I/O +;------------------------------------------------------------------------------ + +RDCHR RST 10H + CP LF + JR Z,RDCHR ; Ignore LF + CP ESC + JR NZ,RDCHR1 + LD A,CTRLC ; Change ESC to CTRL-C +RDCHR1 RET + +WRCHR CP CR + JR Z,WRCRLF ; When CR, write CRLF + CP M_CLS + JR Z,WR ; Allow write of "CLS" + CP ' ' ; Don't write out any other control codes + JR C,NOWR ; ie. < space +WR RST 08H +NOWR RET + +WRCRLF LD A,CR + RST 08H + LD A,LF + RST 08H + LD A,CR + RET + + +;------------------------------------------------------------------------------ +; Initialise hardware and start main loop +;------------------------------------------------------------------------------ +M_INIT LD SP,M_STACK ; Set the Stack Pointer + + LD A,RTS_LOW + OUT (ACIA0_C),A ; Initialise ACIA0 + OUT (ACIA1_C),A ; Initialise ACIA1 + ; Display the "Press space to start" message on both consoles + LD A,$00 + LD (primaryIO),A + LD HL,INITTXT + CALL M_PRINT + ; On Display B we need to take care that it does not hang. + LD HL,INITTXT + LD (InitTxtB),HL + +printInitB: LD HL,(InitTxtB) + LD A,(HL) ; Get character + OR A ; Is it $00 ? + JR Z, waitForSpace + CALL nbconoutB ; Print it + JR Z, waitForSpace ; If we can't write, don't increment + INC HL + LD (InitTxtB),HL ; Store pointer into message for next round + JP printInitB + ; Wait until space is in one of the buffers to determine the active console +waitForSpace: + CALL ckincharA + JR Z,chkSpaceB + LD A,$00 + LD (primaryIO),A + CALL conin + CP ' ' + JP NZ, waitForSpace + JR spacePressed + +chkSpaceB: + CALL ckincharB + JR Z,printInitB ; If no key pressed, try to continue writing the init message on B + LD A,$01 + LD (primaryIO),A + CALL conin + CP ' ' + JP NZ, printInitB ; If space not pressed, try to continue writing the init message on B + +spacePressed: + + ; Clear message on both consoles + LD A,$0C + CALL conoutA + CALL nbconoutB + + ;; We only clear the message on the active console, + ;; because trying to write on a console not connected could + ;; make the system freeze. + + ; primaryIO is now set to the channel where SPACE was pressed + CALL TXCRLF ; TXCRLF + LD HL,M_SIGNON ; Print SIGNON message + CALL M_PRINT + +;------------------------------------------------------------------------------ +; Monitor command loop +;------------------------------------------------------------------------------ +MAIN LD HL,MAIN ; Save entry point for Monitor + PUSH HL ; This is the return address +MAIN0 CALL TXCRLF ; Entry point for Monitor, Normal + LD A,'>' ; Get a ">" + RST 08H ; print it + +MAIN1 CALL RDCHR ; Get a character from the input port + CP ' ' ; or less? + JR C,MAIN1 ; Go back + + CP ':' ; ":"? + JP Z,LOAD ; First character of a HEX load + + CALL WRCHR ; Print char on console + + AND $5F ; Make character uppercase + + CP 'I' + JP Z,INTERPRT + + CP 'G' + JP Z,M_GOTO + + CP 'X' + JP Z,CPMLOAD + + LD A,'?' ; Get a "?" + RST 08H ; Print it + JR MAIN0 + +;------------------------------------------------------------------------------ +; Print string of characters to Serial A until byte=$00, WITH CR, LF +;------------------------------------------------------------------------------ +M_PRINT LD A,(HL) ; Get character + OR A ; Is it $00 ? + RET Z ; Then RETurn on terminator + RST 08H ; Print it + INC HL ; Next Character + JR M_PRINT ; Continue until $00 + + +TXCRLF LD A,$0D ; + RST 08H ; Print character + LD A,$0A ; + RST 08H ; Print character + RET + +;------------------------------------------------------------------------------ +; Get a character from the console, must be $20-$7F to be valid (no control characters) +; and breaks with the Zero Flag set +;------------------------------------------------------------------------------ +M_GETCHR CALL RDCHR ; RX a Character + CP $03 ; User break? + RET Z + CP $20 ; or better? + JR C,M_GETCHR ; Do it again until we get something usable + RET +;------------------------------------------------------------------------------ +; Gets two ASCII characters from the console (assuming them to be HEX 0-9 A-F) +; Moves them into B and C, converts them into a byte value in A and updates a +; Checksum value in E +;------------------------------------------------------------------------------ +GET2 CALL M_GETCHR ; Get us a valid character to work with + LD B,A ; Load it in B + CALL M_GETCHR ; Get us another character + LD C,A ; load it in C + CALL BCTOA ; Convert ASCII to byte + LD C,A ; Build the checksum + LD A,E + SUB C ; The checksum should always equal zero when checked + LD E,A ; Save the checksum back where it came from + LD A,C ; Retrieve the byte and go back + RET +;------------------------------------------------------------------------------ +; Gets four Hex characters from the console, converts them to values in HL +;------------------------------------------------------------------------------ +GETHL LD HL,$0000 ; Gets xxxx but sets Carry Flag on any Terminator + CALL ECHO ; RX a Character + CP $0D ; ? + JR NZ,GETX2 ; other key +SETCY SCF ; Set Carry Flag + RET ; and Return to main program +;------------------------------------------------------------------------------ +; This routine converts last four hex characters (0-9 A-F) user types into a value in HL +; Rotates the old out and replaces with the new until the user hits a terminating character +;------------------------------------------------------------------------------ +GETX LD HL,$0000 ; CLEAR HL +GETX1 CALL ECHO ; RX a character from the console + CP $0D ; + RET Z ; quit + CP $2C ; <,> can be used to safely quit for multiple entries + RET Z ; (Like filling both DE and HL from the user) +GETX2 CP $03 ; Likewise, a will terminate clean, too, but + JR Z,SETCY ; It also sets the Carry Flag for testing later. + ADD HL,HL ; Otherwise, rotate the previous low nibble to high + ADD HL,HL ; rather slowly + ADD HL,HL ; until we get to the top + ADD HL,HL ; and then we can continue on. + SUB $30 ; Convert ASCII to byte value + CP $0A ; Are we in the 0-9 range? + JR C,GETX3 ; Then we just need to sub $30, but if it is A-F + SUB $07 ; We need to take off 7 more to get the value down to +GETX3 AND $0F ; to the right hex value + ADD A,L ; Add the high nibble to the low + LD L,A ; Move the byte back to A + JR GETX1 ; and go back for next character until he terminates +;------------------------------------------------------------------------------ +; Convert ASCII characters in B C registers to a byte value in A +;------------------------------------------------------------------------------ +BCTOA LD A,B ; Move the hi order byte to A + SUB $30 ; Take it down from Ascii + CP $0A ; Are we in the 0-9 range here? + JR C,BCTOA1 ; If so, get the next nybble + SUB $07 ; But if A-F, take it down some more +BCTOA1 RLCA ; Rotate the nybble from low to high + RLCA ; One bit at a time + RLCA ; Until we + RLCA ; Get there with it + LD B,A ; Save the converted high nybble + LD A,C ; Now get the low order byte + SUB $30 ; Convert it down from Ascii + CP $0A ; 0-9 at this point? + JR C,BCTOA2 ; Good enough then, but + SUB $07 ; Take off 7 more if it's A-F +BCTOA2 ADD A,B ; Add in the high order nybble + RET + +;------------------------------------------------------------------------------ +; Get a character and echo it back to the user +;------------------------------------------------------------------------------ +ECHO CALL RDCHR + CALL WRCHR + RET + +;------------------------------------------------------------------------------ +; GOTO command +;------------------------------------------------------------------------------ +M_GOTO CALL GETHL ; ENTRY POINT FOR oto addr. Get XXXX from user. + RET C ; Return if invalid + PUSH HL + RET ; Jump to HL address value + +;------------------------------------------------------------------------------ +; LOAD Intel Hex format file from the console. +; [Intel Hex Format is: +; 1) Colon (Frame 0) +; 2) Record Length Field (Frames 1 and 2) +; 3) Load Address Field (Frames 3,4,5,6) +; 4) Record Type Field (Frames 7 and 8) +; 5) Data Field (Frames 9 to 9+2*(Record Length)-1 +; 6) Checksum Field - Sum of all byte values from Record Length to and +; including Checksum Field = 0 ] +;------------------------------------------------------------------------------ +LOAD LD E,0 ; First two Characters is the Record Length Field + CALL GET2 ; Get us two characters into BC, convert it to a byte + LD D,A ; Load Record Length count into D + CALL GET2 ; Get next two characters, Memory Load Address + LD H,A ; put value in H register. + CALL GET2 ; Get next two characters, Memory Load Address + LD L,A ; put value in L register. + CALL GET2 ; Get next two characters, Record Field Type + CP $01 ; Record Field Type 00 is Data, 01 is End of File + JR NZ,LOAD2 ; Must be the end of that file + CALL GET2 ; Get next two characters, assemble into byte + LD A,E ; Recall the Checksum byte + AND A ; Is it Zero? + JR Z,LOAD00 ; Print footer reached message + JR LOADERR ; Checksums don't add up, Error out + +LOAD2 LD A,D ; Retrieve line character counter + AND A ; Are we done with this line? + JR Z,LOAD3 ; Get two more ascii characters, build a byte and checksum + CALL GET2 ; Get next two chars, convert to byte in A, checksum it + LD (HL),A ; Move converted byte in A to memory location + INC HL ; Increment pointer to next memory location + LD A,'.' ; Print out a "." for every byte loaded + RST 08H ; + DEC D ; Decrement line character counter + JR LOAD2 ; and keep loading into memory until line is complete + +LOAD3 CALL GET2 ; Get two chars, build byte and checksum + LD A,E ; Check the checksum value + AND A ; Is it zero? + RET Z + +LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message + CALL M_PRINT ; Print Message from (HL) and terminate the load + RET + +LOAD00 LD HL,LDETXT ; Print load complete message + CALL M_PRINT + RET + +;------------------------------------------------------------------------------ +; Start Interpreter +;------------------------------------------------------------------------------ +INTERPRT + JP STARTINT + RET + +;------------------------------------------------------------------------------ +; CP/M load command +;------------------------------------------------------------------------------ +CPMLOAD + + LD HL,CPMTXT + CALL M_PRINT + CALL M_GETCHR + RET Z ; Cancel if CTRL-C + AND $5F ; uppercase + CP 'Y' + JP Z,CPMLOAD2 + RET +CPMTXT + .BYTE $0D,$0A + .TEXT "Boot CP/M?" + .BYTE $00 + +CPMTXT2 + .BYTE $0D,$0A + .TEXT "Loading CP/M" + .BYTE $0D,$0A,$00 + +CPMLOAD2 + LD HL,CPMTXT2 + CALL M_PRINT + + LD B,numSecs + + LD A,0 + LD (lba0),A + ld (lba1),A + ld (lba2),A + ld (lba3),A + + LD HL,loadAddr + LD (dmaAddr),HL +processSectors: + + call readhst + + LD DE,0200H + LD HL,(dmaAddr) + ADD HL,DE + LD (dmaAddr),HL + LD A,(lba0) + INC A + LD (lba0),A + + djnz processSectors + +; Start CP/M using entry at top of BIOS +; The current active console stream ID is pushed onto the stack +; to allow the CBIOS to pick it up +; 0 = ACIA0, 1 = ACIA1 + + ld A,(primaryIO) + PUSH AF + ld HL,($FFFE) + jp (HL) + + +;------------------------------------------------------------------------------ +; ROUTINES AS USED IN BIOS +;------------------------------------------------------------------------------ + +;================================================================================================ +; Convert track/head/sector into LBA for physical access to the disk +;================================================================================================ +setLBAaddr: + ; Transfer LBA to disk (LBA3 not used on SD card) + LD A,(lba2) + OUT (SD_LBA2),A + LD A,(lba1) + OUT (SD_LBA1),A + LD A,(lba0) + OUT (SD_LBA0),A + RET + +;================================================================================================ +; Read physical sector from host +;================================================================================================ + +readhst: + PUSH AF + PUSH BC + PUSH HL + +rdWait1: IN A,(SD_STATUS) + CP 128 + JR NZ,rdWait1 + + CALL setLBAaddr + + LD A,$00 ; 00 = Read block + OUT (SD_CONTROL),A + + LD c,4 +; LD HL,hstbuf +rd4secs: + LD b,128 +rdByte: + +rdWait2: IN A,(SD_STATUS) + CP 224 ; Read byte waiting + JR NZ,rdWait2 + + IN A,(SD_DATA) + + LD (HL),A + INC HL + dec b + JR NZ, rdByte + dec c + JR NZ,rd4secs + + POP HL + POP BC + POP AF + +; XOR a +; ld (erflag),a + RET + +;------------------------------------------------------------------------------ +; END OF ROUTINES AS USED IN BIOS +;------------------------------------------------------------------------------ + + +M_SIGNON .BYTE "CP/M Boot ROM 2.0" +; .BYTE " based on design by G. Searle" +; .BYTE $0D,$0A + .BYTE $0D,$0A + .TEXT "I-Strt Intrp" + .BYTE $0D,$0A + .TEXT "X-Boot CP/M" + .BYTE $0D,$0A + .TEXT ":nnnn-Load I rcrd" + .BYTE $0D,$0A + .TEXT "Gnnnn-R loc" + .BYTE $0D,$0A + .BYTE $00 + +M_BASTXT + .BYTE $0D,$0A + .TEXT "Cold or warm?" + .BYTE $0D,$0A,$00 + +CKSUMERR .BYTE "Checksum error" + .BYTE $0D,$0A,$00 + +INITTXT + .BYTE $0C + .TEXT "Press [space] to activate console." + .BYTE $0D,$0A, $00 + +LDETXT + .TEXT "Complete" + .BYTE $0D,$0A, $00 + +; ========================================================================================================================== +; GENERAL EQUATES + +CTRLC .EQU 03H ; Control "C" +CTRLG .EQU 07H ; Control "G" +BKSP .EQU 08H ; Back space +LF .EQU 0AH ; Line feed +CS .EQU 0CH ; Clear screen +CR .EQU 0DH ; Carriage return +CTRLO .EQU 0FH ; Control "O" +CTRLQ .EQU 11H ; Control "Q" +CTRLR .EQU 12H ; Control "R" +CTRLS .EQU 13H ; Control "S" +CTRLU .EQU 15H ; Control "U" +ESC .EQU 1BH ; Escape +DEL .EQU 7FH ; Delete + + +;=========================================================================================================================== + +; NASCOM ROM BASIC Ver 4.7, +; used to be here, removed to get rid of the '(C) 1978 Microsoft' + +STARTINT: +#INCLUDE "SOURCE\\INTPRT.ASM" +.end diff --git a/Z80 CPM and bootloader (basmon)/source/mon.lst b/Z80 CPM and bootloader (basmon)/source/mon.lst new file mode 100644 index 0000000..69d66b0 --- /dev/null +++ b/Z80 CPM and bootloader (basmon)/source/mon.lst @@ -0,0 +1,5089 @@ +0001 0000 ;================================================================================== +0002 0000 ; Contents of this file are copyright Grant Searle +0003 0000 ; HEX routines from Joel Owens. +0004 0000 ; +0005 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0006 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0007 0000 ; +0008 0000 ; http://searle.hostei.com/grant/index.html +0009 0000 ; +0010 0000 ; eMail: home.micros01@btinternet.com +0011 0000 ; +0012 0000 ; If the above don't work, please perform an Internet search to see if I have +0013 0000 ; updated the web page hosting service. +0014 0000 ; +0015 0000 ;================================================================================== +0016 0000 +0017 0000 ;------------------------------------------------------------------------------ +0018 0000 ; +0019 0000 ; Z80 Monitor Rom +0020 0000 ; +0021 0000 ;------------------------------------------------------------------------------ +0022 0000 ; General Equates +0023 0000 ;------------------------------------------------------------------------------ +0024 0000 +0025 0000 ;CR .EQU 0DH +0026 0000 ;LF .EQU 0AH +0027 0000 ;ESC .EQU 1BH +0028 0000 ;CTRLC .EQU 03H +0029 0000 M_CLS .EQU 0CH +0030 0000 +0031 0000 +0032 0000 loadAddr .EQU 0D000h ; CP/M load address +0033 0000 numSecs .EQU 24 ; Number of 512 sectors to be loaded +0034 0000 +0035 0000 +0036 0000 RTS_HIGH .EQU 0D5H +0037 0000 RTS_LOW .EQU 095H +0038 0000 +0039 0000 ACIA0_D .EQU $81 +0040 0000 ACIA0_C .EQU $80 +0041 0000 ACIA1_D .EQU $83 +0042 0000 ACIA1_C .EQU $82 +0043 0000 +0044 0000 SD_DATA .EQU 088H +0045 0000 SD_CONTROL .EQU 089H +0046 0000 SD_STATUS .EQU 089H +0047 0000 SD_LBA0 .EQU 08AH +0048 0000 SD_LBA1 .EQU 08BH +0049 0000 SD_LBA2 .EQU 08CH +0050 0000 +0051 3000 .ORG $3000 +0052 3000 +0053 3000 primaryIO .ds 1 +0054 3001 secNo .ds 1 +0055 3002 dmaAddr .ds 2 +0056 3004 InitTxtB .ds 2 +0057 3006 +0058 3006 00 lba0 .DB 00h +0059 3007 00 lba1 .DB 00h +0060 3008 00 lba2 .DB 00h +0061 3009 00 lba3 .DB 00h +0062 300A +0063 300A stackSpace .ds 32 +0064 302A M_STACK .EQU $ ; Stack top +0065 302A +0066 302A +0067 302A ;------------------------------------------------------------------------------ +0068 302A ; START OF MONITOR ROM +0069 302A ;------------------------------------------------------------------------------ +0070 302A +0071 0000 MON .ORG $0000 ; MONITOR ROM RESET VECTOR +0072 0000 ;------------------------------------------------------------------------------ +0073 0000 ; Reset +0074 0000 ;------------------------------------------------------------------------------ +0075 0000 F3 RST00 DI ;Disable INTerrupts +0076 0001 C3 A4 00 JP M_INIT ;Initialize Hardware and go +0077 0004 00 NOP +0078 0005 00 NOP +0079 0006 00 NOP +0080 0007 00 NOP +0081 0008 ;------------------------------------------------------------------------------ +0082 0008 ; TX a character over RS232 wait for TXDONE first. +0083 0008 ;------------------------------------------------------------------------------ +0084 0008 C3 32 00 RST08 JP conout +0085 000B 00 NOP +0086 000C 00 NOP +0087 000D 00 NOP +0088 000E 00 NOP +0089 000F 00 NOP +0090 0010 ;------------------------------------------------------------------------------ +0091 0010 ; RX a character from buffer wait until char ready. +0092 0010 ;------------------------------------------------------------------------------ +0093 0010 C3 1B 00 RST10 JP conin +0094 0013 00 NOP +0095 0014 00 NOP +0096 0015 00 NOP +0097 0016 00 NOP +0098 0017 00 NOP +0099 0018 ;------------------------------------------------------------------------------ +0100 0018 ; Check input buffer status +0101 0018 ;------------------------------------------------------------------------------ +0102 0018 C3 6C 00 RST18 JP CKINCHAR +0103 001B +0104 001B +0105 001B ;------------------------------------------------------------------------------ +0106 001B ; Console input routine +0107 001B ; Use the "primaryIO" flag to determine which input port to monitor. +0108 001B ;------------------------------------------------------------------------------ +0109 001B conin: +0110 001B 3A 00 30 LD A,(primaryIO) +0111 001E FE 00 CP 0 +0112 0020 20 08 JR NZ,coninB +0113 0022 coninA: +0114 0022 +0115 0022 waitForCharA: +0116 0022 CD 73 00 call ckincharA +0117 0025 28 FB JR Z, waitForCharA +0118 0027 DB 81 IN A,(ACIA0_D) +0119 0029 C9 RET ; Char ready in A +0120 002A +0121 002A coninB: +0122 002A +0123 002A waitForCharB: +0124 002A CD 7A 00 call ckincharB +0125 002D 28 FB JR Z, waitForCharB +0126 002F DB 83 IN A,(ACIA1_D) +0127 0031 C9 RET ; Char ready in A +0128 0032 +0129 0032 ;------------------------------------------------------------------------------ +0130 0032 ; Console output routine +0131 0032 ; Use the "primaryIO" flag to determine which output port to send a character. +0132 0032 ;------------------------------------------------------------------------------ +0133 0032 F5 conout: PUSH AF ; Store character +0134 0033 3A 00 30 LD A,(primaryIO) +0135 0036 FE 00 CP 0 +0136 0038 20 0D JR NZ,conoutB1 +0137 003A 18 01 JR conoutA1 +0138 003C conoutA: +0139 003C F5 PUSH AF +0140 003D +0141 003D CD 60 00 conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting +0142 0040 28 FB JR Z,conoutA1 ; Loop until ACIA flag signals ready +0143 0042 F1 POP AF ; RETrieve character +0144 0043 D3 81 OUT (ACIA0_D),A ; OUTput the character +0145 0045 C9 RET +0146 0046 +0147 0046 conoutB: +0148 0046 F5 PUSH AF +0149 0047 +0150 0047 CD 66 00 conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting +0151 004A 28 FB JR Z,conoutB1 ; Loop until ACIA flag signals ready +0152 004C F1 POP AF ; RETrieve character +0153 004D D3 83 OUT (ACIA1_D),A ; OUTput the character +0154 004F C9 RET +0155 0050 +0156 0050 ;------------------------------------------------------------------------------ +0157 0050 ; Non blocking console output routine +0158 0050 ; On return Z flag is 0, if the character could be written, else 1 +0159 0050 ; Use the "primaryIO" flag to determine which output port to send a character. +0160 0050 ;------------------------------------------------------------------------------ +0161 0050 nbconoutB: +0162 0050 F5 PUSH AF +0163 0051 +0164 0051 CD 66 00 nbconoutB1: CALL CKACIA1 ; See if ACIA channel B has finished transmitting +0165 0054 20 04 JR NZ, nbconoutB2 ; Ready to write +0166 0056 F1 POP AF ; Remove the parameter we don't need +0167 0057 E6 00 AND $00 ; Indicate failure +0168 0059 C9 RET ; Return if ACIA flag signals not ready +0169 005A nbconoutB2: +0170 005A F1 POP AF ; RETrieve character +0171 005B D3 83 OUT (ACIA1_D),A ; OUTput the character +0172 005D F6 FF OR $ff ; Indicate success +0173 005F C9 RET +0174 0060 +0175 0060 ;------------------------------------------------------------------------------ +0176 0060 ; I/O status check routine +0177 0060 ; Use the "primaryIO" flag to determine which port to check. +0178 0060 ;------------------------------------------------------------------------------ +0179 0060 CKACIA0 +0180 0060 DB 80 IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready +0181 0062 0F RRCA ; Rotates RX status into Carry Flag, +0182 0063 CB 47 BIT 0,A ; Set Zero flag if still transmitting character +0183 0065 C9 RET +0184 0066 +0185 0066 CKACIA1 +0186 0066 DB 82 IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready +0187 0068 0F RRCA ; Rotates RX status into Carry Flag, +0188 0069 CB 47 BIT 0,A ; Set Zero flag if still transmitting character +0189 006B C9 RET +0190 006C +0191 006C ;------------------------------------------------------------------------------ +0192 006C ; Check if there is a character in the input buffer +0193 006C ; Use the "primaryIO" flag to determine which port to check. +0194 006C ;------------------------------------------------------------------------------ +0195 006C CKINCHAR +0196 006C 3A 00 30 LD A,(primaryIO) +0197 006F FE 00 CP 0 +0198 0071 20 07 JR NZ,ckincharB +0199 0073 +0200 0073 ckincharA: +0201 0073 +0202 0073 DB 80 IN A,(ACIA0_C) ; Status byte +0203 0075 E6 01 AND $01 +0204 0077 FE 00 CP $0 ; Z flag set if no char +0205 0079 C9 RET +0206 007A +0207 007A ckincharB: +0208 007A +0209 007A DB 82 IN A,(ACIA1_C) ; Status byte +0210 007C E6 01 AND $01 +0211 007E FE 00 CP $0 ; Z flag set if no char +0212 0080 C9 RET +0213 0081 +0214 0081 ;------------------------------------------------------------------------------ +0215 0081 ; Filtered Character I/O +0216 0081 ;------------------------------------------------------------------------------ +0217 0081 +0218 0081 D7 RDCHR RST 10H +0219 0082 FE 0A CP LF +0220 0084 28 FB JR Z,RDCHR ; Ignore LF +0221 0086 FE 1B CP ESC +0222 0088 20 02 JR NZ,RDCHR1 +0223 008A 3E 03 LD A,CTRLC ; Change ESC to CTRL-C +0224 008C C9 RDCHR1 RET +0225 008D +0226 008D FE 0D WRCHR CP CR +0227 008F 28 0A JR Z,WRCRLF ; When CR, write CRLF +0228 0091 FE 0C CP M_CLS +0229 0093 28 04 JR Z,WR ; Allow write of "CLS" +0230 0095 FE 20 CP ' ' ; Don't write out any other control codes +0231 0097 38 01 JR C,NOWR ; ie. < space +0232 0099 CF WR RST 08H +0233 009A C9 NOWR RET +0234 009B +0235 009B 3E 0D WRCRLF LD A,CR +0236 009D CF RST 08H +0237 009E 3E 0A LD A,LF +0238 00A0 CF RST 08H +0239 00A1 3E 0D LD A,CR +0240 00A3 C9 RET +0241 00A4 +0242 00A4 +0243 00A4 ;------------------------------------------------------------------------------ +0244 00A4 ; Initialise hardware and start main loop +0245 00A4 ;------------------------------------------------------------------------------ +0246 00A4 31 2A 30 M_INIT LD SP,M_STACK ; Set the Stack Pointer +0247 00A7 +0248 00A7 3E 95 LD A,RTS_LOW +0249 00A9 D3 80 OUT (ACIA0_C),A ; Initialise ACIA0 +0250 00AB D3 82 OUT (ACIA1_C),A ; Initialise ACIA1 +0251 00AD ; Display the "Press space to start" message on both consoles +0252 00AD 3E 00 LD A,$00 +0253 00AF 32 00 30 LD (primaryIO),A +0254 00B2 21 0E 03 LD HL,INITTXT +0255 00B5 CD 37 01 CALL M_PRINT +0256 00B8 ; On Display B we need to take care that it does not hang. +0257 00B8 21 0E 03 LD HL,INITTXT +0258 00BB 22 04 30 LD (InitTxtB),HL +0259 00BE +0260 00BE 2A 04 30 printInitB: LD HL,(InitTxtB) +0261 00C1 7E LD A,(HL) ; Get character +0262 00C2 B7 OR A ; Is it $00 ? +0263 00C3 28 0C JR Z, waitForSpace +0264 00C5 CD 50 00 CALL nbconoutB ; Print it +0265 00C8 28 07 JR Z, waitForSpace ; If we can't write, don't increment +0266 00CA 23 INC HL +0267 00CB 22 04 30 LD (InitTxtB),HL ; Store pointer into message for next round +0268 00CE C3 BE 00 JP printInitB +0269 00D1 ; Wait until space is in one of the buffers to determine the active console +0270 00D1 waitForSpace: +0271 00D1 CD 73 00 CALL ckincharA +0272 00D4 28 0F JR Z,chkSpaceB +0273 00D6 3E 00 LD A,$00 +0274 00D8 32 00 30 LD (primaryIO),A +0275 00DB CD 1B 00 CALL conin +0276 00DE FE 20 CP ' ' +0277 00E0 C2 D1 00 JP NZ, waitForSpace +0278 00E3 18 12 JR spacePressed +0279 00E5 +0280 00E5 chkSpaceB: +0281 00E5 CD 7A 00 CALL ckincharB +0282 00E8 28 D4 JR Z,printInitB ; If no key pressed, try to continue writing the init message on B +0283 00EA 3E 01 LD A,$01 +0284 00EC 32 00 30 LD (primaryIO),A +0285 00EF CD 1B 00 CALL conin +0286 00F2 FE 20 CP ' ' +0287 00F4 C2 BE 00 JP NZ, printInitB ; If space not pressed, try to continue writing the init message on B +0288 00F7 +0289 00F7 spacePressed: +0290 00F7 +0291 00F7 ; Clear message on both consoles +0292 00F7 3E 0C LD A,$0C +0293 00F9 CD 3C 00 CALL conoutA +0294 00FC CD 50 00 CALL nbconoutB +0295 00FF +0296 00FF ;; We only clear the message on the active console, +0297 00FF ;; because trying to write on a console not connected could +0298 00FF ;; make the system freeze. +0299 00FF +0300 00FF ; primaryIO is now set to the channel where SPACE was pressed +0301 00FF CD 3E 01 CALL TXCRLF ; TXCRLF +0302 0102 21 9C 02 LD HL,M_SIGNON ; Print SIGNON message +0303 0105 CD 37 01 CALL M_PRINT +0304 0108 +0305 0108 ;------------------------------------------------------------------------------ +0306 0108 ; Monitor command loop +0307 0108 ;------------------------------------------------------------------------------ +0308 0108 21 08 01 MAIN LD HL,MAIN ; Save entry point for Monitor +0309 010B E5 PUSH HL ; This is the return address +0310 010C CD 3E 01 MAIN0 CALL TXCRLF ; Entry point for Monitor, Normal +0311 010F 3E 3E LD A,'>' ; Get a ">" +0312 0111 CF RST 08H ; print it +0313 0112 +0314 0112 CD 81 00 MAIN1 CALL RDCHR ; Get a character from the input port +0315 0115 FE 20 CP ' ' ; or less? +0316 0117 38 F9 JR C,MAIN1 ; Go back +0317 0119 +0318 0119 FE 3A CP ':' ; ":"? +0319 011B CA B5 01 JP Z,LOAD ; First character of a HEX load +0320 011E +0321 011E CD 8D 00 CALL WRCHR ; Print char on console +0322 0121 +0323 0121 E6 5F AND $5F ; Make character uppercase +0324 0123 +0325 0123 FE 49 CP 'I' +0326 0125 CA F6 01 JP Z,INTERPRT +0327 0128 +0328 0128 FE 47 CP 'G' +0329 012A CA AF 01 JP Z,M_GOTO +0330 012D +0331 012D FE 58 CP 'X' +0332 012F CA FA 01 JP Z,CPMLOAD +0333 0132 +0334 0132 3E 3F LD A,'?' ; Get a "?" +0335 0134 CF RST 08H ; Print it +0336 0135 18 D5 JR MAIN0 +0337 0137 +0338 0137 ;------------------------------------------------------------------------------ +0339 0137 ; Print string of characters to Serial A until byte=$00, WITH CR, LF +0340 0137 ;------------------------------------------------------------------------------ +0341 0137 7E M_PRINT LD A,(HL) ; Get character +0342 0138 B7 OR A ; Is it $00 ? +0343 0139 C8 RET Z ; Then RETurn on terminator +0344 013A CF RST 08H ; Print it +0345 013B 23 INC HL ; Next Character +0346 013C 18 F9 JR M_PRINT ; Continue until $00 +0347 013E +0348 013E +0349 013E 3E 0D TXCRLF LD A,$0D ; +0350 0140 CF RST 08H ; Print character +0351 0141 3E 0A LD A,$0A ; +0352 0143 CF RST 08H ; Print character +0353 0144 C9 RET +0354 0145 +0355 0145 ;------------------------------------------------------------------------------ +0356 0145 ; Get a character from the console, must be $20-$7F to be valid (no control characters) +0357 0145 ; and breaks with the Zero Flag set +0358 0145 ;------------------------------------------------------------------------------ +0359 0145 CD 81 00 M_GETCHR CALL RDCHR ; RX a Character +0360 0148 FE 03 CP $03 ; User break? +0361 014A C8 RET Z +0362 014B FE 20 CP $20 ; or better? +0363 014D 38 F6 JR C,M_GETCHR ; Do it again until we get something usable +0364 014F C9 RET +0365 0150 ;------------------------------------------------------------------------------ +0366 0150 ; Gets two ASCII characters from the console (assuming them to be HEX 0-9 A-F) +0367 0150 ; Moves them into B and C, converts them into a byte value in A and updates a +0368 0150 ; Checksum value in E +0369 0150 ;------------------------------------------------------------------------------ +0370 0150 CD 45 01 GET2 CALL M_GETCHR ; Get us a valid character to work with +0371 0153 47 LD B,A ; Load it in B +0372 0154 CD 45 01 CALL M_GETCHR ; Get us another character +0373 0157 4F LD C,A ; load it in C +0374 0158 CD 8F 01 CALL BCTOA ; Convert ASCII to byte +0375 015B 4F LD C,A ; Build the checksum +0376 015C 7B LD A,E +0377 015D 91 SUB C ; The checksum should always equal zero when checked +0378 015E 5F LD E,A ; Save the checksum back where it came from +0379 015F 79 LD A,C ; Retrieve the byte and go back +0380 0160 C9 RET +0381 0161 ;------------------------------------------------------------------------------ +0382 0161 ; Gets four Hex characters from the console, converts them to values in HL +0383 0161 ;------------------------------------------------------------------------------ +0384 0161 21 00 00 GETHL LD HL,$0000 ; Gets xxxx but sets Carry Flag on any Terminator +0385 0164 CD A8 01 CALL ECHO ; RX a Character +0386 0167 FE 0D CP $0D ; ? +0387 0169 20 0E JR NZ,GETX2 ; other key +0388 016B 37 SETCY SCF ; Set Carry Flag +0389 016C C9 RET ; and Return to main program +0390 016D ;------------------------------------------------------------------------------ +0391 016D ; This routine converts last four hex characters (0-9 A-F) user types into a value in HL +0392 016D ; Rotates the old out and replaces with the new until the user hits a terminating character +0393 016D ;------------------------------------------------------------------------------ +0394 016D 21 00 00 GETX LD HL,$0000 ; CLEAR HL +0395 0170 CD A8 01 GETX1 CALL ECHO ; RX a character from the console +0396 0173 FE 0D CP $0D ; +0397 0175 C8 RET Z ; quit +0398 0176 FE 2C CP $2C ; <,> can be used to safely quit for multiple entries +0399 0178 C8 RET Z ; (Like filling both DE and HL from the user) +0400 0179 FE 03 GETX2 CP $03 ; Likewise, a will terminate clean, too, but +0401 017B 28 EE JR Z,SETCY ; It also sets the Carry Flag for testing later. +0402 017D 29 ADD HL,HL ; Otherwise, rotate the previous low nibble to high +0403 017E 29 ADD HL,HL ; rather slowly +0404 017F 29 ADD HL,HL ; until we get to the top +0405 0180 29 ADD HL,HL ; and then we can continue on. +0406 0181 D6 30 SUB $30 ; Convert ASCII to byte value +0407 0183 FE 0A CP $0A ; Are we in the 0-9 range? +0408 0185 38 02 JR C,GETX3 ; Then we just need to sub $30, but if it is A-F +0409 0187 D6 07 SUB $07 ; We need to take off 7 more to get the value down to +0410 0189 E6 0F GETX3 AND $0F ; to the right hex value +0411 018B 85 ADD A,L ; Add the high nibble to the low +0412 018C 6F LD L,A ; Move the byte back to A +0413 018D 18 E1 JR GETX1 ; and go back for next character until he terminates +0414 018F ;------------------------------------------------------------------------------ +0415 018F ; Convert ASCII characters in B C registers to a byte value in A +0416 018F ;------------------------------------------------------------------------------ +0417 018F 78 BCTOA LD A,B ; Move the hi order byte to A +0418 0190 D6 30 SUB $30 ; Take it down from Ascii +0419 0192 FE 0A CP $0A ; Are we in the 0-9 range here? +0420 0194 38 02 JR C,BCTOA1 ; If so, get the next nybble +0421 0196 D6 07 SUB $07 ; But if A-F, take it down some more +0422 0198 07 BCTOA1 RLCA ; Rotate the nybble from low to high +0423 0199 07 RLCA ; One bit at a time +0424 019A 07 RLCA ; Until we +0425 019B 07 RLCA ; Get there with it +0426 019C 47 LD B,A ; Save the converted high nybble +0427 019D 79 LD A,C ; Now get the low order byte +0428 019E D6 30 SUB $30 ; Convert it down from Ascii +0429 01A0 FE 0A CP $0A ; 0-9 at this point? +0430 01A2 38 02 JR C,BCTOA2 ; Good enough then, but +0431 01A4 D6 07 SUB $07 ; Take off 7 more if it's A-F +0432 01A6 80 BCTOA2 ADD A,B ; Add in the high order nybble +0433 01A7 C9 RET +0434 01A8 +0435 01A8 ;------------------------------------------------------------------------------ +0436 01A8 ; Get a character and echo it back to the user +0437 01A8 ;------------------------------------------------------------------------------ +0438 01A8 CD 81 00 ECHO CALL RDCHR +0439 01AB CD 8D 00 CALL WRCHR +0440 01AE C9 RET +0441 01AF +0442 01AF ;------------------------------------------------------------------------------ +0443 01AF ; GOTO command +0444 01AF ;------------------------------------------------------------------------------ +0445 01AF CD 61 01 M_GOTO CALL GETHL ; ENTRY POINT FOR oto addr. Get XXXX from user. +0446 01B2 D8 RET C ; Return if invalid +0447 01B3 E5 PUSH HL +0448 01B4 C9 RET ; Jump to HL address value +0449 01B5 +0450 01B5 ;------------------------------------------------------------------------------ +0451 01B5 ; LOAD Intel Hex format file from the console. +0452 01B5 ; [Intel Hex Format is: +0453 01B5 ; 1) Colon (Frame 0) +0454 01B5 ; 2) Record Length Field (Frames 1 and 2) +0455 01B5 ; 3) Load Address Field (Frames 3,4,5,6) +0456 01B5 ; 4) Record Type Field (Frames 7 and 8) +0457 01B5 ; 5) Data Field (Frames 9 to 9+2*(Record Length)-1 +0458 01B5 ; 6) Checksum Field - Sum of all byte values from Record Length to and +0459 01B5 ; including Checksum Field = 0 ] +0460 01B5 ;------------------------------------------------------------------------------ +0461 01B5 1E 00 LOAD LD E,0 ; First two Characters is the Record Length Field +0462 01B7 CD 50 01 CALL GET2 ; Get us two characters into BC, convert it to a byte +0463 01BA 57 LD D,A ; Load Record Length count into D +0464 01BB CD 50 01 CALL GET2 ; Get next two characters, Memory Load Address +0465 01BE 67 LD H,A ; put value in H register. +0466 01BF CD 50 01 CALL GET2 ; Get next two characters, Memory Load Address +0467 01C2 6F LD L,A ; put value in L register. +0468 01C3 CD 50 01 CALL GET2 ; Get next two characters, Record Field Type +0469 01C6 FE 01 CP $01 ; Record Field Type 00 is Data, 01 is End of File +0470 01C8 20 09 JR NZ,LOAD2 ; Must be the end of that file +0471 01CA CD 50 01 CALL GET2 ; Get next two characters, assemble into byte +0472 01CD 7B LD A,E ; Recall the Checksum byte +0473 01CE A7 AND A ; Is it Zero? +0474 01CF 28 1E JR Z,LOAD00 ; Print footer reached message +0475 01D1 18 15 JR LOADERR ; Checksums don't add up, Error out +0476 01D3 +0477 01D3 7A LOAD2 LD A,D ; Retrieve line character counter +0478 01D4 A7 AND A ; Are we done with this line? +0479 01D5 28 0B JR Z,LOAD3 ; Get two more ascii characters, build a byte and checksum +0480 01D7 CD 50 01 CALL GET2 ; Get next two chars, convert to byte in A, checksum it +0481 01DA 77 LD (HL),A ; Move converted byte in A to memory location +0482 01DB 23 INC HL ; Increment pointer to next memory location +0483 01DC 3E 2E LD A,'.' ; Print out a "." for every byte loaded +0484 01DE CF RST 08H ; +0485 01DF 15 DEC D ; Decrement line character counter +0486 01E0 18 F1 JR LOAD2 ; and keep loading into memory until line is complete +0487 01E2 +0488 01E2 CD 50 01 LOAD3 CALL GET2 ; Get two chars, build byte and checksum +0489 01E5 7B LD A,E ; Check the checksum value +0490 01E6 A7 AND A ; Is it zero? +0491 01E7 C8 RET Z +0492 01E8 +0493 01E8 21 FD 02 LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message +0494 01EB CD 37 01 CALL M_PRINT ; Print Message from (HL) and terminate the load +0495 01EE C9 RET +0496 01EF +0497 01EF 21 34 03 LOAD00 LD HL,LDETXT ; Print load complete message +0498 01F2 CD 37 01 CALL M_PRINT +0499 01F5 C9 RET +0500 01F6 +0501 01F6 ;------------------------------------------------------------------------------ +0502 01F6 ; Start Interpreter +0503 01F6 ;------------------------------------------------------------------------------ +0504 01F6 INTERPRT +0505 01F6 C3 3F 03 JP STARTINT +0506 01F9 C9 RET +0507 01FA +0508 01FA ;------------------------------------------------------------------------------ +0509 01FA ; CP/M load command +0510 01FA ;------------------------------------------------------------------------------ +0511 01FA CPMLOAD +0512 01FA +0513 01FA 21 0C 02 LD HL,CPMTXT +0514 01FD CD 37 01 CALL M_PRINT +0515 0200 CD 45 01 CALL M_GETCHR +0516 0203 C8 RET Z ; Cancel if CTRL-C +0517 0204 E6 5F AND $5F ; uppercase +0518 0206 FE 59 CP 'Y' +0519 0208 CA 2A 02 JP Z,CPMLOAD2 +0520 020B C9 RET +0521 020C CPMTXT +0522 020C 0D 0A .BYTE $0D,$0A +0523 020E 42 6F 6F 74 .TEXT "Boot CP/M?" +0523 0212 20 43 50 2F +0523 0216 4D 3F +0524 0218 00 .BYTE $00 +0525 0219 +0526 0219 CPMTXT2 +0527 0219 0D 0A .BYTE $0D,$0A +0528 021B 4C 6F 61 64 .TEXT "Loading CP/M" +0528 021F 69 6E 67 20 +0528 0223 43 50 2F 4D +0529 0227 0D 0A 00 .BYTE $0D,$0A,$00 +0530 022A +0531 022A CPMLOAD2 +0532 022A 21 19 02 LD HL,CPMTXT2 +0533 022D CD 37 01 CALL M_PRINT +0534 0230 +0535 0230 06 18 LD B,numSecs +0536 0232 +0537 0232 3E 00 LD A,0 +0538 0234 32 06 30 LD (lba0),A +0539 0237 32 07 30 ld (lba1),A +0540 023A 32 08 30 ld (lba2),A +0541 023D 32 09 30 ld (lba3),A +0542 0240 +0543 0240 21 00 D0 LD HL,loadAddr +0544 0243 22 02 30 LD (dmaAddr),HL +0545 0246 processSectors: +0546 0246 +0547 0246 CD 74 02 call readhst +0548 0249 +0549 0249 11 00 02 LD DE,0200H +0550 024C 2A 02 30 LD HL,(dmaAddr) +0551 024F 19 ADD HL,DE +0552 0250 22 02 30 LD (dmaAddr),HL +0553 0253 3A 06 30 LD A,(lba0) +0554 0256 3C INC A +0555 0257 32 06 30 LD (lba0),A +0556 025A +0557 025A 10 EA djnz processSectors +0558 025C +0559 025C ; Start CP/M using entry at top of BIOS +0560 025C ; The current active console stream ID is pushed onto the stack +0561 025C ; to allow the CBIOS to pick it up +0562 025C ; 0 = ACIA0, 1 = ACIA1 +0563 025C +0564 025C 3A 00 30 ld A,(primaryIO) +0565 025F F5 PUSH AF +0566 0260 2A FE FF ld HL,($FFFE) +0567 0263 E9 jp (HL) +0568 0264 +0569 0264 +0570 0264 ;------------------------------------------------------------------------------ +0571 0264 ; ROUTINES AS USED IN BIOS +0572 0264 ;------------------------------------------------------------------------------ +0573 0264 +0574 0264 ;================================================================================================ +0575 0264 ; Convert track/head/sector into LBA for physical access to the disk +0576 0264 ;================================================================================================ +0577 0264 setLBAaddr: +0578 0264 ; Transfer LBA to disk (LBA3 not used on SD card) +0579 0264 3A 08 30 LD A,(lba2) +0580 0267 D3 8C OUT (SD_LBA2),A +0581 0269 3A 07 30 LD A,(lba1) +0582 026C D3 8B OUT (SD_LBA1),A +0583 026E 3A 06 30 LD A,(lba0) +0584 0271 D3 8A OUT (SD_LBA0),A +0585 0273 C9 RET +0586 0274 +0587 0274 ;================================================================================================ +0588 0274 ; Read physical sector from host +0589 0274 ;================================================================================================ +0590 0274 +0591 0274 readhst: +0592 0274 F5 PUSH AF +0593 0275 C5 PUSH BC +0594 0276 E5 PUSH HL +0595 0277 +0596 0277 DB 89 rdWait1: IN A,(SD_STATUS) +0597 0279 FE 80 CP 128 +0598 027B 20 FA JR NZ,rdWait1 +0599 027D +0600 027D CD 64 02 CALL setLBAaddr +0601 0280 +0602 0280 3E 00 LD A,$00 ; 00 = Read block +0603 0282 D3 89 OUT (SD_CONTROL),A +0604 0284 +0605 0284 0E 04 LD c,4 +0606 0286 ; LD HL,hstbuf +0607 0286 rd4secs: +0608 0286 06 80 LD b,128 +0609 0288 rdByte: +0610 0288 +0611 0288 DB 89 rdWait2: IN A,(SD_STATUS) +0612 028A FE E0 CP 224 ; Read byte waiting +0613 028C 20 FA JR NZ,rdWait2 +0614 028E +0615 028E DB 88 IN A,(SD_DATA) +0616 0290 +0617 0290 77 LD (HL),A +0618 0291 23 INC HL +0619 0292 05 dec b +0620 0293 20 F3 JR NZ, rdByte +0621 0295 0D dec c +0622 0296 20 EE JR NZ,rd4secs +0623 0298 +0624 0298 E1 POP HL +0625 0299 C1 POP BC +0626 029A F1 POP AF +0627 029B +0628 029B ; XOR a +0629 029B ; ld (erflag),a +0630 029B C9 RET +0631 029C +0632 029C ;------------------------------------------------------------------------------ +0633 029C ; END OF ROUTINES AS USED IN BIOS +0634 029C ;------------------------------------------------------------------------------ +0635 029C +0636 029C +0637 029C 43 50 2F 4D M_SIGNON .BYTE "CP/M Boot ROM 2.0" +0637 02A0 20 42 6F 6F +0637 02A4 74 20 52 4F +0637 02A8 4D 20 32 2E +0637 02AC 30 +0638 02AD ; .BYTE " based on design by G. Searle" +0639 02AD ; .BYTE $0D,$0A +0640 02AD 0D 0A .BYTE $0D,$0A +0641 02AF 49 2D 53 74 .TEXT "I-Strt Intrp" +0641 02B3 72 74 20 49 +0641 02B7 6E 74 72 70 +0642 02BB 0D 0A .BYTE $0D,$0A +0643 02BD 58 2D 42 6F .TEXT "X-Boot CP/M" +0643 02C1 6F 74 20 43 +0643 02C5 50 2F 4D +0644 02C8 0D 0A .BYTE $0D,$0A +0645 02CA 3A 6E 6E 6E .TEXT ":nnnn-Load I rcrd" +0645 02CE 6E 2D 4C 6F +0645 02D2 61 64 20 49 +0645 02D6 20 72 63 72 +0645 02DA 64 +0646 02DB 0D 0A .BYTE $0D,$0A +0647 02DD 47 6E 6E 6E .TEXT "Gnnnn-R loc" +0647 02E1 6E 2D 52 20 +0647 02E5 6C 6F 63 +0648 02E8 0D 0A .BYTE $0D,$0A +0649 02EA 00 .BYTE $00 +0650 02EB +0651 02EB M_BASTXT +0652 02EB 0D 0A .BYTE $0D,$0A +0653 02ED 43 6F 6C 64 .TEXT "Cold or warm?" +0653 02F1 20 6F 72 20 +0653 02F5 77 61 72 6D +0653 02F9 3F +0654 02FA 0D 0A 00 .BYTE $0D,$0A,$00 +0655 02FD +0656 02FD 43 68 65 63 CKSUMERR .BYTE "Checksum error" +0656 0301 6B 73 75 6D +0656 0305 20 65 72 72 +0656 0309 6F 72 +0657 030B 0D 0A 00 .BYTE $0D,$0A,$00 +0658 030E +0659 030E INITTXT +0660 030E 0C .BYTE $0C +0661 030F 50 72 65 73 .TEXT "Press [space] to activate console." +0661 0313 73 20 5B 73 +0661 0317 70 61 63 65 +0661 031B 5D 20 74 6F +0661 031F 20 61 63 74 +0661 0323 69 76 61 74 +0661 0327 65 20 63 6F +0661 032B 6E 73 6F 6C +0661 032F 65 2E +0662 0331 0D 0A 00 .BYTE $0D,$0A, $00 +0663 0334 +0664 0334 LDETXT +0665 0334 43 6F 6D 70 .TEXT "Complete" +0665 0338 6C 65 74 65 +0666 033C 0D 0A 00 .BYTE $0D,$0A, $00 +0667 033F +0668 033F ; ========================================================================================================================== +0669 033F ; GENERAL EQUATES +0670 033F +0671 033F CTRLC .EQU 03H ; Control "C" +0672 033F CTRLG .EQU 07H ; Control "G" +0673 033F BKSP .EQU 08H ; Back space +0674 033F LF .EQU 0AH ; Line feed +0675 033F CS .EQU 0CH ; Clear screen +0676 033F CR .EQU 0DH ; Carriage return +0677 033F CTRLO .EQU 0FH ; Control "O" +0678 033F CTRLQ .EQU 11H ; Control "Q" +0679 033F CTRLR .EQU 12H ; Control "R" +0680 033F CTRLS .EQU 13H ; Control "S" +0681 033F CTRLU .EQU 15H ; Control "U" +0682 033F ESC .EQU 1BH ; Escape +0683 033F DEL .EQU 7FH ; Delete +0684 033F +0685 033F +0686 033F ;=========================================================================================================================== +0687 033F +0688 033F ; NASCOM ROM BASIC Ver 4.7, +0689 033F ; used to be here, removed to get rid of the '(C) 1978 Microsoft' +0690 033F +0691 033F STARTINT: +0692 033F #INCLUDE "SOURCE\\INTPRT.ASM" +0001+ 033F ;------------------------------------------------------------------------------ +0002+ 033F ; Start BASIC command +0003+ 033F ;------------------------------------------------------------------------------ +0004+ 033F BASIC +0005+ 033F 21 EB 02 LD HL,M_BASTXT +0006+ 0342 CD 37 01 CALL M_PRINT +0007+ 0345 CD 45 01 CALL M_GETCHR +0008+ 0348 C8 RET Z ; Cancel if CTRL-C +0009+ 0349 E6 5F AND $5F ; uppercase +0010+ 034B FE 43 CP 'C' +0011+ 034D CA 56 03 JP Z,COLD +0012+ 0350 FE 57 CP 'W' +0013+ 0352 CA 59 03 JP Z,WARM +0014+ 0355 C9 RET +0015+ 0356 +0016+ 0356 ; BASIC WORK SPACE LOCATIONS +0017+ 0356 +0018+ 0356 WRKSPC .EQU 30B0H ; BASIC Work space +0019+ 0356 USR .EQU WRKSPC+3H ; "USR (x)" jump +0020+ 0356 OUTSUB .EQU WRKSPC+6H ; "OUT p,n" +0021+ 0356 OTPORT .EQU WRKSPC+7H ; Port (p) +0022+ 0356 DIVSUP .EQU WRKSPC+9H ; Division support routine +0023+ 0356 DIV1 .EQU WRKSPC+0AH ; <- Values +0024+ 0356 DIV2 .EQU WRKSPC+0EH ; <- to +0025+ 0356 DIV3 .EQU WRKSPC+12H ; <- be +0026+ 0356 DIV4 .EQU WRKSPC+15H ; <-inserted +0027+ 0356 SEED .EQU WRKSPC+17H ; Random number seed +0028+ 0356 LSTRND .EQU WRKSPC+3AH ; Last random number +0029+ 0356 INPSUB .EQU WRKSPC+3EH ; #INP (x)" Routine +0030+ 0356 INPORT .EQU WRKSPC+3FH ; PORT (x) +0031+ 0356 NULLS .EQU WRKSPC+41H ; Number of nulls +0032+ 0356 LWIDTH .EQU WRKSPC+42H ; Terminal width +0033+ 0356 COMMAN .EQU WRKSPC+43H ; Width for commas +0034+ 0356 NULFLG .EQU WRKSPC+44H ; Null after input byte flag +0035+ 0356 CTLOFG .EQU WRKSPC+45H ; Control "O" flag +0036+ 0356 LINESC .EQU WRKSPC+46H ; Lines counter +0037+ 0356 LINESN .EQU WRKSPC+48H ; Lines number +0038+ 0356 CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum +0039+ 0356 NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine +0040+ 0356 BRKFLG .EQU WRKSPC+4DH ; Break flag +0041+ 0356 RINPUT .EQU WRKSPC+4EH ; Input reflection +0042+ 0356 POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) +0043+ 0356 PSET .EQU WRKSPC+54H ; "SET" reflection +0044+ 0356 RESET .EQU WRKSPC+57H ; "RESET" reflection +0045+ 0356 STRSPC .EQU WRKSPC+5AH ; Bottom of string space +0046+ 0356 LINEAT .EQU WRKSPC+5CH ; Current line number +0047+ 0356 BASTXT .EQU WRKSPC+5EH ; Pointer to start of program +0048+ 0356 BUFFER .EQU WRKSPC+61H ; Input buffer +0049+ 0356 STACK .EQU WRKSPC+66H ; Initial stack +0050+ 0356 CURPOS .EQU WRKSPC+0ABH ; Character position on line +0051+ 0356 LCRFLG .EQU WRKSPC+0ACH ; Locate/Create flag +0052+ 0356 TYPE .EQU WRKSPC+0ADH ; Data type flag +0053+ 0356 DATFLG .EQU WRKSPC+0AEH ; Literal statement flag +0054+ 0356 LSTRAM .EQU WRKSPC+0AFH ; Last available RAM +0055+ 0356 TMSTPT .EQU WRKSPC+0B1H ; Temporary string pointer +0056+ 0356 TMSTPL .EQU WRKSPC+0B3H ; Temporary string pool +0057+ 0356 TMPSTR .EQU WRKSPC+0BFH ; Temporary string +0058+ 0356 STRBOT .EQU WRKSPC+0C3H ; Bottom of string space +0059+ 0356 CUROPR .EQU WRKSPC+0C5H ; Current operator in EVAL +0060+ 0356 LOOPST .EQU WRKSPC+0C7H ; First statement of loop +0061+ 0356 DATLIN .EQU WRKSPC+0C9H ; Line of current DATA item +0062+ 0356 FORFLG .EQU WRKSPC+0CBH ; "FOR" loop flag +0063+ 0356 LSTBIN .EQU WRKSPC+0CCH ; Last byte entered +0064+ 0356 READFG .EQU WRKSPC+0CDH ; Read/Input flag +0065+ 0356 BRKLIN .EQU WRKSPC+0CEH ; Line of break +0066+ 0356 NXTOPR .EQU WRKSPC+0D0H ; Next operator in EVAL +0067+ 0356 ERRLIN .EQU WRKSPC+0D2H ; Line of error +0068+ 0356 CONTAD .EQU WRKSPC+0D4H ; Where to CONTinue +0069+ 0356 PROGND .EQU WRKSPC+0D6H ; End of program +0070+ 0356 VAREND .EQU WRKSPC+0D8H ; End of variables +0071+ 0356 ARREND .EQU WRKSPC+0DAH ; End of arrays +0072+ 0356 NXTDAT .EQU WRKSPC+0DCH ; Next data item +0073+ 0356 FNRGNM .EQU WRKSPC+0DEH ; Name of FN argument +0074+ 0356 FNARG .EQU WRKSPC+0E0H ; FN argument value +0075+ 0356 FPREG .EQU WRKSPC+0E4H ; Floating point register +0076+ 0356 FPEXP .EQU FPREG+3 ; Floating point exponent +0077+ 0356 SGNRES .EQU WRKSPC+0E8H ; Sign of result +0078+ 0356 PBUFF .EQU WRKSPC+0E9H ; Number print buffer +0079+ 0356 MULVAL .EQU WRKSPC+0F6H ; Multiplier +0080+ 0356 PROGST .EQU WRKSPC+0F9H ; Start of program text area +0081+ 0356 STLOOK .EQU WRKSPC+15DH ; Start of memory test +0082+ 0356 +0083+ 0356 ; BASIC ERROR CODE VALUES +0084+ 0356 +0085+ 0356 NF .EQU 00H ; NEXT without FOR +0086+ 0356 SN .EQU 02H ; Syntax error +0087+ 0356 RG .EQU 04H ; RETURN without GOSUB +0088+ 0356 OD .EQU 06H ; Out of DATA +0089+ 0356 FC .EQU 08H ; Function call error +0090+ 0356 OV .EQU 0AH ; Overflow +0091+ 0356 OM .EQU 0CH ; Out of memory +0092+ 0356 UL .EQU 0EH ; Undefined line number +0093+ 0356 BS .EQU 10H ; Bad subscript +0094+ 0356 DD .EQU 12H ; Re-DIMensioned array +0095+ 0356 DZ .EQU 14H ; Division by zero (/0) +0096+ 0356 ID .EQU 16H ; Illegal direct +0097+ 0356 TM .EQU 18H ; Type miss-match +0098+ 0356 OS .EQU 1AH ; Out of string space +0099+ 0356 LS .EQU 1CH ; String too long +0100+ 0356 ST .EQU 1EH ; String formula too complex +0101+ 0356 CN .EQU 20H ; Can't CONTinue +0102+ 0356 UF .EQU 22H ; UnDEFined FN function +0103+ 0356 MO .EQU 24H ; Missing operand +0104+ 0356 HX .EQU 26H ; HEX error +0105+ 0356 BN .EQU 28H ; BIN error +0106+ 0356 +0107+ 0356 ; .ORG 00396H +0108+ 0356 +0109+ 0356 C3 5C 03 COLD: JP STARTB ; Jump for cold start +0110+ 0359 C3 FA 03 WARM: JP WARMST ; Jump for warm start +0111+ 035C STARTB: +0112+ 035C DD 21 00 00 LD IX,0 ; Flag cold start +0113+ 0360 C3 67 03 JP CSTART ; Jump to initialise +0114+ 0363 +0115+ 0363 0D 0C .WORD DEINT ; Get integer -32768 to 32767 +0116+ 0365 83 13 .WORD ABPASS ; Return integer in AB +0117+ 0367 +0118+ 0367 +0119+ 0367 21 B0 30 CSTART: LD HL,WRKSPC ; Start of workspace RAM +0120+ 036A F9 LD SP,HL ; Set up a temporary stack +0121+ 036B C3 A2 1F JP INITST ; Go to initialise +0122+ 036E +0123+ 036E 11 34 06 INIT: LD DE,INITAB ; Initialise workspace +0124+ 0371 06 63 LD B,INITBE-INITAB+3; Bytes to copy +0125+ 0373 21 B0 30 LD HL,WRKSPC ; Into workspace RAM +0126+ 0376 1A COPY: LD A,(DE) ; Get source +0127+ 0377 77 LD (HL),A ; To destination +0128+ 0378 23 INC HL ; Next destination +0129+ 0379 13 INC DE ; Next source +0130+ 037A 05 DEC B ; Count bytes +0131+ 037B C2 76 03 JP NZ,COPY ; More to move +0132+ 037E F9 LD SP,HL ; Temporary stack +0133+ 037F CD 35 08 CALL CLREG ; Clear registers and stack +0134+ 0382 CD 03 0E CALL PRNTCRLF ; Output CRLF +0135+ 0385 32 5A 31 LD (BUFFER+72+1),A ; Mark end of buffer +0136+ 0388 32 A9 31 LD (PROGST),A ; Initialise program area +0137+ 038B 21 49 04 MSIZE: LD HL,MEMMSG ; Point to message +0138+ 038E CD A1 14 CALL PRS ; Output "Memory size" +0139+ 0391 CD 52 08 CALL PROMPT ; Get input with '?' +0140+ 0394 CD 5B 0B CALL GETCHR ; Get next character +0141+ 0397 B7 OR A ; Set flags +0142+ 0398 C2 B0 03 JP NZ,TSTMEM ; If number - Test if RAM there +0143+ 039B 21 0D 32 LD HL,STLOOK ; Point to start of RAM +0144+ 039E 23 MLOOP: INC HL ; Next byte +0145+ 039F 7C LD A,H ; Above address FFFF ? +0146+ 03A0 B5 OR L +0147+ 03A1 CA C2 03 JP Z,SETTOP ; Yes - 64K RAM +0148+ 03A4 7E LD A,(HL) ; Get contents +0149+ 03A5 47 LD B,A ; Save it +0150+ 03A6 2F CPL ; Flip all bits +0151+ 03A7 77 LD (HL),A ; Put it back +0152+ 03A8 BE CP (HL) ; RAM there if same +0153+ 03A9 70 LD (HL),B ; Restore old contents +0154+ 03AA CA 9E 03 JP Z,MLOOP ; If RAM - test next byte +0155+ 03AD C3 C2 03 JP SETTOP ; Top of RAM found +0156+ 03B0 +0157+ 03B0 CD 27 0C TSTMEM: CALL ATOH ; Get high memory into DE +0158+ 03B3 B7 OR A ; Set flags on last byte +0159+ 03B4 C2 03 07 JP NZ,SNERR ; ?SN Error if bad character +0160+ 03B7 EB EX DE,HL ; Address into HL +0161+ 03B8 2B DEC HL ; Back one byte +0162+ 03B9 3E D9 LD A,11011001B ; Test byte +0163+ 03BB 46 LD B,(HL) ; Get old contents +0164+ 03BC 77 LD (HL),A ; Load test byte +0165+ 03BD BE CP (HL) ; RAM there if same +0166+ 03BE 70 LD (HL),B ; Restore old contents +0167+ 03BF C2 8B 03 JP NZ,MSIZE ; Ask again if no RAM +0168+ 03C2 +0169+ 03C2 2B SETTOP: DEC HL ; Back one byte +0170+ 03C3 11 0C 32 LD DE,STLOOK-1 ; See if enough RAM +0171+ 03C6 CD CB 09 CALL CPDEHL ; Compare DE with HL +0172+ 03C9 DA 8B 03 JP C,MSIZE ; Ask again if not enough RAM +0173+ 03CC 11 CE FF LD DE,0-50 ; 50 Bytes string space +0174+ 03CF 22 5F 31 LD (LSTRAM),HL ; Save last available RAM +0175+ 03D2 19 ADD HL,DE ; Allocate string space +0176+ 03D3 22 0A 31 LD (STRSPC),HL ; Save string space +0177+ 03D6 CD 10 08 CALL CLRPTR ; Clear program area +0178+ 03D9 2A 0A 31 LD HL,(STRSPC) ; Get end of memory +0179+ 03DC 11 EF FF LD DE,0-17 ; Offset for free bytes +0180+ 03DF 19 ADD HL,DE ; Adjust HL +0181+ 03E0 11 A9 31 LD DE,PROGST ; Start of program text +0182+ 03E3 7D LD A,L ; Get LSB +0183+ 03E4 93 SUB E ; Adjust it +0184+ 03E5 6F LD L,A ; Re-save +0185+ 03E6 7C LD A,H ; Get MSB +0186+ 03E7 9A SBC A,D ; Adjust it +0187+ 03E8 67 LD H,A ; Re-save +0188+ 03E9 E5 PUSH HL ; Save bytes free +0189+ 03EA 21 12 04 LD HL,SIGNON ; Sign-on message +0190+ 03ED CD A1 14 CALL PRS ; Output string +0191+ 03F0 E1 POP HL ; Get bytes free back +0192+ 03F1 CD 44 1B CALL PRNTHL ; Output amount of free memory +0193+ 03F4 21 03 04 LD HL,BFREE ; " Bytes free" message +0194+ 03F7 CD A1 14 CALL PRS ; Output string +0195+ 03FA +0196+ 03FA 31 16 31 WARMST: LD SP,STACK ; Temporary stack +0197+ 03FD CD 35 08 BRKRET: CALL CLREG ; Clear registers and stack +0198+ 0400 C3 4E 07 JP PRNTOK ; Go to get command line +0199+ 0403 +0200+ 0403 20 42 79 74 BFREE: .BYTE " Bytes free",CR,LF,0,0 +0200+ 0407 65 73 20 66 +0200+ 040B 72 65 65 0D +0200+ 040F 0A 00 00 +0201+ 0412 +0202+ 0412 5A 38 30 20 SIGNON: .BYTE "Z80 BASIC Ver 4.7b",CR,LF +0202+ 0416 42 41 53 49 +0202+ 041A 43 20 56 65 +0202+ 041E 72 20 34 2E +0202+ 0422 37 62 0D 0A +0203+ 0426 43 6F 70 79 .BYTE "Copyright ",40,"C",41 +0203+ 042A 72 69 67 68 +0203+ 042E 74 20 28 43 +0203+ 0432 29 +0204+ 0433 20 31 39 37 .BYTE " 1978 by Microsoft",CR,LF,0,0 +0204+ 0437 38 20 62 79 +0204+ 043B 20 4D 69 63 +0204+ 043F 72 6F 73 6F +0204+ 0443 66 74 0D 0A +0204+ 0447 00 00 +0205+ 0449 +0206+ 0449 4D 65 6D 6F MEMMSG: .BYTE "Memory top",0 +0206+ 044D 72 79 20 74 +0206+ 0451 6F 70 00 +0207+ 0454 +0208+ 0454 ; FUNCTION ADDRESS TABLE +0209+ 0454 +0210+ 0454 B9 19 FNCTAB: .WORD SGN +0211+ 0456 7D 1A .WORD INT +0212+ 0458 CF 19 .WORD ABS +0213+ 045A B3 30 .WORD USR +0214+ 045C 61 13 .WORD FRE +0215+ 045E E6 16 .WORD INP +0216+ 0460 8F 13 .WORD POS +0217+ 0462 43 1C .WORD SQR +0218+ 0464 22 1D .WORD RND +0219+ 0466 5E 18 .WORD LOG +0220+ 0468 91 1C .WORD EXP +0221+ 046A 97 1D .WORD COS +0222+ 046C 9D 1D .WORD SIN +0223+ 046E FE 1D .WORD TAN +0224+ 0470 13 1E .WORD ATN +0225+ 0472 3A 17 .WORD PEEK +0226+ 0474 7E 1E .WORD DEEK +0227+ 0476 01 31 .WORD POINT +0228+ 0478 13 16 .WORD LEN +0229+ 047A 2B 14 .WORD STR +0230+ 047C AD 16 .WORD VAL +0231+ 047E 22 16 .WORD ASC +0232+ 0480 33 16 .WORD CHR +0233+ 0482 A0 1E .WORD HEX +0234+ 0484 33 1F .WORD BIN +0235+ 0486 43 16 .WORD LEFT +0236+ 0488 73 16 .WORD RIGHT +0237+ 048A 7D 16 .WORD MID +0238+ 048C +0239+ 048C ; RESERVED WORD LIST +0240+ 048C +0241+ 048C C5 4E 44 WORDS: .BYTE 'E'+80H,"ND" +0242+ 048F C6 4F 52 .BYTE 'F'+80H,"OR" +0243+ 0492 CE 45 58 54 .BYTE 'N'+80H,"EXT" +0244+ 0496 C4 41 54 41 .BYTE 'D'+80H,"ATA" +0245+ 049A C9 4E 50 55 .BYTE 'I'+80H,"NPUT" +0245+ 049E 54 +0246+ 049F C4 49 4D .BYTE 'D'+80H,"IM" +0247+ 04A2 D2 45 41 44 .BYTE 'R'+80H,"EAD" +0248+ 04A6 CC 45 54 .BYTE 'L'+80H,"ET" +0249+ 04A9 C7 4F 54 4F .BYTE 'G'+80H,"OTO" +0250+ 04AD D2 55 4E .BYTE 'R'+80H,"UN" +0251+ 04B0 C9 46 .BYTE 'I'+80H,"F" +0252+ 04B2 D2 45 53 54 .BYTE 'R'+80H,"ESTORE" +0252+ 04B6 4F 52 45 +0253+ 04B9 C7 4F 53 55 .BYTE 'G'+80H,"OSUB" +0253+ 04BD 42 +0254+ 04BE D2 45 54 55 .BYTE 'R'+80H,"ETURN" +0254+ 04C2 52 4E +0255+ 04C4 D2 45 4D .BYTE 'R'+80H,"EM" +0256+ 04C7 D3 54 4F 50 .BYTE 'S'+80H,"TOP" +0257+ 04CB CF 55 54 .BYTE 'O'+80H,"UT" +0258+ 04CE CF 4E .BYTE 'O'+80H,"N" +0259+ 04D0 CE 55 4C 4C .BYTE 'N'+80H,"ULL" +0260+ 04D4 D7 41 49 54 .BYTE 'W'+80H,"AIT" +0261+ 04D8 C4 45 46 .BYTE 'D'+80H,"EF" +0262+ 04DB D0 4F 4B 45 .BYTE 'P'+80H,"OKE" +0263+ 04DF C4 4F 4B 45 .BYTE 'D'+80H,"OKE" +0264+ 04E3 D3 43 52 45 .BYTE 'S'+80H,"CREEN" +0264+ 04E7 45 4E +0265+ 04E9 CC 49 4E 45 .BYTE 'L'+80H,"INES" +0265+ 04ED 53 +0266+ 04EE C3 4C 53 .BYTE 'C'+80H,"LS" +0267+ 04F1 D7 49 44 54 .BYTE 'W'+80H,"IDTH" +0267+ 04F5 48 +0268+ 04F6 CD 4F 4E 49 .BYTE 'M'+80H,"ONITOR" +0268+ 04FA 54 4F 52 +0269+ 04FD D3 45 54 .BYTE 'S'+80H,"ET" +0270+ 0500 D2 45 53 45 .BYTE 'R'+80H,"ESET" +0270+ 0504 54 +0271+ 0505 D0 52 49 4E .BYTE 'P'+80H,"RINT" +0271+ 0509 54 +0272+ 050A C3 4F 4E 54 .BYTE 'C'+80H,"ONT" +0273+ 050E CC 49 53 54 .BYTE 'L'+80H,"IST" +0274+ 0512 C3 4C 45 41 .BYTE 'C'+80H,"LEAR" +0274+ 0516 52 +0275+ 0517 C3 4C 4F 41 .BYTE 'C'+80H,"LOAD" +0275+ 051B 44 +0276+ 051C C3 53 41 56 .BYTE 'C'+80H,"SAVE" +0276+ 0520 45 +0277+ 0521 CE 45 57 .BYTE 'N'+80H,"EW" +0278+ 0524 +0279+ 0524 D4 41 42 28 .BYTE 'T'+80H,"AB(" +0280+ 0528 D4 4F .BYTE 'T'+80H,"O" +0281+ 052A C6 4E .BYTE 'F'+80H,"N" +0282+ 052C D3 50 43 28 .BYTE 'S'+80H,"PC(" +0283+ 0530 D4 48 45 4E .BYTE 'T'+80H,"HEN" +0284+ 0534 CE 4F 54 .BYTE 'N'+80H,"OT" +0285+ 0537 D3 54 45 50 .BYTE 'S'+80H,"TEP" +0286+ 053B +0287+ 053B AB .BYTE '+'+80H +0288+ 053C AD .BYTE '-'+80H +0289+ 053D AA .BYTE '*'+80H +0290+ 053E AF .BYTE '/'+80H +0291+ 053F DE .BYTE '^'+80H +0292+ 0540 C1 4E 44 .BYTE 'A'+80H,"ND" +0293+ 0543 CF 52 .BYTE 'O'+80H,"R" +0294+ 0545 BE .BYTE '>'+80H +0295+ 0546 BD .BYTE '='+80H +0296+ 0547 BC .BYTE '<'+80H +0297+ 0548 +0298+ 0548 D3 47 4E .BYTE 'S'+80H,"GN" +0299+ 054B C9 4E 54 .BYTE 'I'+80H,"NT" +0300+ 054E C1 42 53 .BYTE 'A'+80H,"BS" +0301+ 0551 D5 53 52 .BYTE 'U'+80H,"SR" +0302+ 0554 C6 52 45 .BYTE 'F'+80H,"RE" +0303+ 0557 C9 4E 50 .BYTE 'I'+80H,"NP" +0304+ 055A D0 4F 53 .BYTE 'P'+80H,"OS" +0305+ 055D D3 51 52 .BYTE 'S'+80H,"QR" +0306+ 0560 D2 4E 44 .BYTE 'R'+80H,"ND" +0307+ 0563 CC 4F 47 .BYTE 'L'+80H,"OG" +0308+ 0566 C5 58 50 .BYTE 'E'+80H,"XP" +0309+ 0569 C3 4F 53 .BYTE 'C'+80H,"OS" +0310+ 056C D3 49 4E .BYTE 'S'+80H,"IN" +0311+ 056F D4 41 4E .BYTE 'T'+80H,"AN" +0312+ 0572 C1 54 4E .BYTE 'A'+80H,"TN" +0313+ 0575 D0 45 45 4B .BYTE 'P'+80H,"EEK" +0314+ 0579 C4 45 45 4B .BYTE 'D'+80H,"EEK" +0315+ 057D D0 4F 49 4E .BYTE 'P'+80H,"OINT" +0315+ 0581 54 +0316+ 0582 CC 45 4E .BYTE 'L'+80H,"EN" +0317+ 0585 D3 54 52 24 .BYTE 'S'+80H,"TR$" +0318+ 0589 D6 41 4C .BYTE 'V'+80H,"AL" +0319+ 058C C1 53 43 .BYTE 'A'+80H,"SC" +0320+ 058F C3 48 52 24 .BYTE 'C'+80H,"HR$" +0321+ 0593 C8 45 58 24 .BYTE 'H'+80H,"EX$" +0322+ 0597 C2 49 4E 24 .BYTE 'B'+80H,"IN$" +0323+ 059B CC 45 46 54 .BYTE 'L'+80H,"EFT$" +0323+ 059F 24 +0324+ 05A0 D2 49 47 48 .BYTE 'R'+80H,"IGHT$" +0324+ 05A4 54 24 +0325+ 05A6 CD 49 44 24 .BYTE 'M'+80H,"ID$" +0326+ 05AA 80 .BYTE 80H ; End of list marker +0327+ 05AB +0328+ 05AB ; KEYWORD ADDRESS TABLE +0329+ 05AB +0330+ 05AB A5 0B WORDTB: .WORD PEND +0331+ 05AD A2 0A .WORD FOR +0332+ 05AF 7D 0F .WORD NEXT +0333+ 05B1 F2 0C .WORD DATA +0334+ 05B3 84 0E .WORD INPUT +0335+ 05B5 B9 11 .WORD DIM +0336+ 05B7 B3 0E .WORD READ +0337+ 05B9 09 0D .WORD LET +0338+ 05BB AF 0C .WORD GOTO +0339+ 05BD 92 0C .WORD RUN +0340+ 05BF 81 0D .WORD IF +0341+ 05C1 6B 0B .WORD RESTOR +0342+ 05C3 9E 0C .WORD GOSUB +0343+ 05C5 CD 0C .WORD RETURN +0344+ 05C7 F4 0C .WORD REM +0345+ 05C9 A3 0B .WORD STOP +0346+ 05CB F2 16 .WORD POUT +0347+ 05CD 63 0D .WORD ON +0348+ 05CF E4 0B .WORD NULL +0349+ 05D1 F8 16 .WORD WAIT +0350+ 05D3 97 13 .WORD DEF +0351+ 05D5 41 17 .WORD POKE +0352+ 05D7 89 1E .WORD DOKE +0353+ 05D9 F4 0C .WORD REM +0354+ 05DB 6F 1E .WORD LINES +0355+ 05DD 62 1E .WORD CLS +0356+ 05DF 67 1E .WORD WIDTH +0357+ 05E1 9F 1F .WORD MONITR +0358+ 05E3 04 31 .WORD PSET +0359+ 05E5 07 31 .WORD RESET +0360+ 05E7 A5 0D .WORD PRINT +0361+ 05E9 D1 0B .WORD CONT +0362+ 05EB 17 0A .WORD LIST +0363+ 05ED 4C 0C .WORD CLEAR +0364+ 05EF F4 0C .WORD REM +0365+ 05F1 F4 0C .WORD REM +0366+ 05F3 0F 08 .WORD NEW +0367+ 05F5 +0368+ 05F5 ; RESERVED WORD TOKEN VALUES +0369+ 05F5 +0370+ 05F5 ZEND .EQU 080H ; END +0371+ 05F5 ZFOR .EQU 081H ; FOR +0372+ 05F5 ZDATA .EQU 083H ; DATA +0373+ 05F5 ZGOTO .EQU 088H ; GOTO +0374+ 05F5 ZGOSUB .EQU 08CH ; GOSUB +0375+ 05F5 ZREM .EQU 08EH ; REM +0376+ 05F5 ZPRINT .EQU 09EH ; PRINT +0377+ 05F5 ZNEW .EQU 0A4H ; NEW +0378+ 05F5 +0379+ 05F5 ZTAB .EQU 0A5H ; TAB +0380+ 05F5 ZTO .EQU 0A6H ; TO +0381+ 05F5 ZFN .EQU 0A7H ; FN +0382+ 05F5 ZSPC .EQU 0A8H ; SPC +0383+ 05F5 ZTHEN .EQU 0A9H ; THEN +0384+ 05F5 ZNOT .EQU 0AAH ; NOT +0385+ 05F5 ZSTEP .EQU 0ABH ; STEP +0386+ 05F5 +0387+ 05F5 ZPLUS .EQU 0ACH ; + +0388+ 05F5 ZMINUS .EQU 0ADH ; - +0389+ 05F5 ZTIMES .EQU 0AEH ; * +0390+ 05F5 ZDIV .EQU 0AFH ; / +0391+ 05F5 ZOR .EQU 0B2H ; OR +0392+ 05F5 ZGTR .EQU 0B3H ; > +0393+ 05F5 ZEQUAL .EQU 0B4H ; M +0394+ 05F5 ZLTH .EQU 0B5H ; < +0395+ 05F5 ZSGN .EQU 0B6H ; SGN +0396+ 05F5 ZPOINT .EQU 0C7H ; POINT +0397+ 05F5 ZLEFT .EQU 0CDH +2 ; LEFT$ +0398+ 05F5 +0399+ 05F5 ; ARITHMETIC PRECEDENCE TABLE +0400+ 05F5 +0401+ 05F5 79 PRITAB: .BYTE 79H ; Precedence value +0402+ 05F6 2B 1B .WORD PADD ; FPREG = + FPREG +0403+ 05F8 +0404+ 05F8 79 .BYTE 79H ; Precedence value +0405+ 05F9 5F 17 .WORD PSUB ; FPREG = - FPREG +0406+ 05FB +0407+ 05FB 7C .BYTE 7CH ; Precedence value +0408+ 05FC 9D 18 .WORD MULT ; PPREG = * FPREG +0409+ 05FE +0410+ 05FE 7C .BYTE 7CH ; Precedence value +0411+ 05FF FE 18 .WORD DIV ; FPREG = / FPREG +0412+ 0601 +0413+ 0601 7F .BYTE 7FH ; Precedence value +0414+ 0602 4C 1C .WORD POWER ; FPREG = ^ FPREG +0415+ 0604 +0416+ 0604 50 .BYTE 50H ; Precedence value +0417+ 0605 12 11 .WORD PAND ; FPREG = AND FPREG +0418+ 0607 +0419+ 0607 46 .BYTE 46H ; Precedence value +0420+ 0608 11 11 .WORD POR ; FPREG = OR FPREG +0421+ 060A +0422+ 060A ; BASIC ERROR CODE LIST +0423+ 060A +0424+ 060A 4E 46 ERRORS: .BYTE "NF" ; NEXT without FOR +0425+ 060C 53 4E .BYTE "SN" ; Syntax error +0426+ 060E 52 47 .BYTE "RG" ; RETURN without GOSUB +0427+ 0610 4F 44 .BYTE "OD" ; Out of DATA +0428+ 0612 46 43 .BYTE "FC" ; Illegal function call +0429+ 0614 4F 56 .BYTE "OV" ; Overflow error +0430+ 0616 4F 4D .BYTE "OM" ; Out of memory +0431+ 0618 55 4C .BYTE "UL" ; Undefined line +0432+ 061A 42 53 .BYTE "BS" ; Bad subscript +0433+ 061C 44 44 .BYTE "DD" ; Re-DIMensioned array +0434+ 061E 2F 30 .BYTE "/0" ; Division by zero +0435+ 0620 49 44 .BYTE "ID" ; Illegal direct +0436+ 0622 54 4D .BYTE "TM" ; Type mis-match +0437+ 0624 4F 53 .BYTE "OS" ; Out of string space +0438+ 0626 4C 53 .BYTE "LS" ; String too long +0439+ 0628 53 54 .BYTE "ST" ; String formula too complex +0440+ 062A 43 4E .BYTE "CN" ; Can't CONTinue +0441+ 062C 55 46 .BYTE "UF" ; Undefined FN function +0442+ 062E 4D 4F .BYTE "MO" ; Missing operand +0443+ 0630 48 58 .BYTE "HX" ; HEX error +0444+ 0632 42 4E .BYTE "BN" ; BIN error +0445+ 0634 +0446+ 0634 ; INITIALISATION TABLE ------------------------------------------------------- +0447+ 0634 +0448+ 0634 C3 FA 03 INITAB: JP WARMST ; Warm start jump +0449+ 0637 C3 22 0C JP FCERR ; "USR (X)" jump (Set to Error) +0450+ 063A D3 00 OUT (0),A ; "OUT p,n" skeleton +0451+ 063C C9 RET +0452+ 063D D6 00 SUB 0 ; Division support routine +0453+ 063F 6F LD L,A +0454+ 0640 7C LD A,H +0455+ 0641 DE 00 SBC A,0 +0456+ 0643 67 LD H,A +0457+ 0644 78 LD A,B +0458+ 0645 DE 00 SBC A,0 +0459+ 0647 47 LD B,A +0460+ 0648 3E 00 LD A,0 +0461+ 064A C9 RET +0462+ 064B 00 00 00 .BYTE 0,0,0 ; Random number seed table used by RND +0463+ 064E 35 4A CA 99 .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07 +0464+ 0652 39 1C 76 98 .BYTE 039H,01CH,076H,098H ; 1.61291E+07 +0465+ 0656 22 95 B3 98 .BYTE 022H,095H,0B3H,098H ;-1.17691E+07 +0466+ 065A 0A DD 47 98 .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07 +0467+ 065E 53 D1 99 99 .BYTE 053H,0D1H,099H,099H ;-2-01612E+07 +0468+ 0662 0A 1A 9F 98 .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07 +0469+ 0666 65 BC CD 98 .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07 +0470+ 066A D6 77 3E 98 .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07 +0471+ 066E 52 C7 4F 80 .BYTE 052H,0C7H,04FH,080H ; Last random number +0472+ 0672 DB 00 IN A,(0) ; INP (x) skeleton +0473+ 0674 C9 RET +0474+ 0675 01 .BYTE 1 ; POS (x) number (1) +0475+ 0676 FF .BYTE 255 ; Terminal width (255 = no auto CRLF) +0476+ 0677 1C .BYTE 28 ; Width for commas (3 columns) +0477+ 0678 00 .BYTE 0 ; No nulls after input bytes +0478+ 0679 00 .BYTE 0 ; Output enabled (^O off) +0479+ 067A 14 00 .WORD 20 ; Initial lines counter +0480+ 067C 14 00 .WORD 20 ; Initial lines number +0481+ 067E 00 00 .WORD 0 ; Array load/save check sum +0482+ 0680 00 .BYTE 0 ; Break not by NMI +0483+ 0681 00 .BYTE 0 ; Break flag +0484+ 0682 C3 48 09 JP TTYLIN ; Input reflection (set to TTY) +0485+ 0685 C3 00 00 JP $0000 ; POINT reflection unused +0486+ 0688 C3 00 00 JP $0000 ; SET reflection +0487+ 068B C3 00 00 JP $0000 ; RESET reflection +0488+ 068E 0D 32 .WORD STLOOK ; Temp string space +0489+ 0690 FE FF .WORD -2 ; Current line number (cold) +0490+ 0692 AA 31 .WORD PROGST+1 ; Start of program text +0491+ 0694 INITBE: +0492+ 0694 +0493+ 0694 ; END OF INITIALISATION TABLE --------------------------------------------------- +0494+ 0694 +0495+ 0694 20 45 72 72 ERRMSG: .BYTE " Error",0 +0495+ 0698 6F 72 00 +0496+ 069B 20 69 6E 20 INMSG: .BYTE " in ",0 +0496+ 069F 00 +0497+ 06A0 ZERBYT .EQU $-1 ; A zero byte +0498+ 06A0 4F 6B 0D 0A OKMSG: .BYTE "Ok",CR,LF,0,0 +0498+ 06A4 00 00 +0499+ 06A6 42 72 65 61 BRKMSG: .BYTE "Break",0 +0499+ 06AA 6B 00 +0500+ 06AC +0501+ 06AC 21 04 00 BAKSTK: LD HL,4 ; Look for "FOR" block with +0502+ 06AF 39 ADD HL,SP ; same index as specified +0503+ 06B0 7E LOKFOR: LD A,(HL) ; Get block ID +0504+ 06B1 23 INC HL ; Point to index address +0505+ 06B2 FE 81 CP ZFOR ; Is it a "FOR" token +0506+ 06B4 C0 RET NZ ; No - exit +0507+ 06B5 4E LD C,(HL) ; BC = Address of "FOR" index +0508+ 06B6 23 INC HL +0509+ 06B7 46 LD B,(HL) +0510+ 06B8 23 INC HL ; Point to sign of STEP +0511+ 06B9 E5 PUSH HL ; Save pointer to sign +0512+ 06BA 69 LD L,C ; HL = address of "FOR" index +0513+ 06BB 60 LD H,B +0514+ 06BC 7A LD A,D ; See if an index was specified +0515+ 06BD B3 OR E ; DE = 0 if no index specified +0516+ 06BE EB EX DE,HL ; Specified index into HL +0517+ 06BF CA C6 06 JP Z,INDFND ; Skip if no index given +0518+ 06C2 EB EX DE,HL ; Index back into DE +0519+ 06C3 CD CB 09 CALL CPDEHL ; Compare index with one given +0520+ 06C6 01 0D 00 INDFND: LD BC,16-3 ; Offset to next block +0521+ 06C9 E1 POP HL ; Restore pointer to sign +0522+ 06CA C8 RET Z ; Return if block found +0523+ 06CB 09 ADD HL,BC ; Point to next block +0524+ 06CC C3 B0 06 JP LOKFOR ; Keep on looking +0525+ 06CF +0526+ 06CF CD E9 06 MOVUP: CALL ENFMEM ; See if enough memory +0527+ 06D2 C5 MOVSTR: PUSH BC ; Save end of source +0528+ 06D3 E3 EX (SP),HL ; Swap source and dest" end +0529+ 06D4 C1 POP BC ; Get end of destination +0530+ 06D5 CD CB 09 MOVLP: CALL CPDEHL ; See if list moved +0531+ 06D8 7E LD A,(HL) ; Get byte +0532+ 06D9 02 LD (BC),A ; Move it +0533+ 06DA C8 RET Z ; Exit if all done +0534+ 06DB 0B DEC BC ; Next byte to move to +0535+ 06DC 2B DEC HL ; Next byte to move +0536+ 06DD C3 D5 06 JP MOVLP ; Loop until all bytes moved +0537+ 06E0 +0538+ 06E0 E5 CHKSTK: PUSH HL ; Save code string address +0539+ 06E1 2A 8A 31 LD HL,(ARREND) ; Lowest free memory +0540+ 06E4 06 00 LD B,0 ; BC = Number of levels to test +0541+ 06E6 09 ADD HL,BC ; 2 Bytes for each level +0542+ 06E7 09 ADD HL,BC +0543+ 06E8 3E .BYTE 3EH ; Skip "PUSH HL" +0544+ 06E9 E5 ENFMEM: PUSH HL ; Save code string address +0545+ 06EA 3E D0 LD A,0D0H ;LOW -48 ; 48 Bytes minimum RAM +0546+ 06EC 95 SUB L +0547+ 06ED 6F LD L,A +0548+ 06EE 3E FF LD A,0FFH; HIGH (-48) ; 48 Bytes minimum RAM +0549+ 06F0 9C SBC A,H +0550+ 06F1 DA F8 06 JP C,OMERR ; Not enough - ?OM Error +0551+ 06F4 67 LD H,A +0552+ 06F5 39 ADD HL,SP ; Test if stack is overflowed +0553+ 06F6 E1 POP HL ; Restore code string address +0554+ 06F7 D8 RET C ; Return if enough mmory +0555+ 06F8 1E 0C OMERR: LD E,OM ; ?OM Error +0556+ 06FA C3 17 07 JP ERROR +0557+ 06FD +0558+ 06FD 2A 79 31 DATSNR: LD HL,(DATLIN) ; Get line of current DATA item +0559+ 0700 22 0C 31 LD (LINEAT),HL ; Save as current line +0560+ 0703 1E 02 SNERR: LD E,SN ; ?SN Error +0561+ 0705 01 .BYTE 01H ; Skip "LD E,DZ" +0562+ 0706 1E 14 DZERR: LD E,DZ ; ?/0 Error +0563+ 0708 01 .BYTE 01H ; Skip "LD E,NF" +0564+ 0709 1E 00 NFERR: LD E,NF ; ?NF Error +0565+ 070B 01 .BYTE 01H ; Skip "LD E,DD" +0566+ 070C 1E 12 DDERR: LD E,DD ; ?DD Error +0567+ 070E 01 .BYTE 01H ; Skip "LD E,UF" +0568+ 070F 1E 22 UFERR: LD E,UF ; ?UF Error +0569+ 0711 01 .BYTE 01H ; Skip "LD E,OV +0570+ 0712 1E 0A OVERR: LD E,OV ; ?OV Error +0571+ 0714 01 .BYTE 01H ; Skip "LD E,TM" +0572+ 0715 1E 18 TMERR: LD E,TM ; ?TM Error +0573+ 0717 +0574+ 0717 CD 35 08 ERROR: CALL CLREG ; Clear registers and stack +0575+ 071A 32 F5 30 LD (CTLOFG),A ; Enable output (A is 0) +0576+ 071D CD F6 0D CALL STTLIN ; Start new line +0577+ 0720 21 0A 06 LD HL,ERRORS ; Point to error codes +0578+ 0723 57 LD D,A ; D = 0 (A is 0) +0579+ 0724 3E 3F LD A,'?' +0580+ 0726 CD DC 09 CALL OUTC ; Output '?' +0581+ 0729 19 ADD HL,DE ; Offset to correct error code +0582+ 072A 7E LD A,(HL) ; First character +0583+ 072B CD DC 09 CALL OUTC ; Output it +0584+ 072E CD 5B 0B CALL GETCHR ; Get next character +0585+ 0731 CD DC 09 CALL OUTC ; Output it +0586+ 0734 21 94 06 LD HL,ERRMSG ; "Error" message +0587+ 0737 CD A1 14 ERRIN: CALL PRS ; Output message +0588+ 073A 2A 0C 31 LD HL,(LINEAT) ; Get line of error +0589+ 073D 11 FE FF LD DE,-2 ; Cold start error if -2 +0590+ 0740 CD CB 09 CALL CPDEHL ; See if cold start error +0591+ 0743 CA 67 03 JP Z,CSTART ; Cold start error - Restart +0592+ 0746 7C LD A,H ; Was it a direct error? +0593+ 0747 A5 AND L ; Line = -1 if direct error +0594+ 0748 3C INC A +0595+ 0749 C4 3C 1B CALL NZ,LINEIN ; No - output line of error +0596+ 074C 3E .BYTE 3EH ; Skip "POP BC" +0597+ 074D C1 POPNOK: POP BC ; Drop address in input buffer +0598+ 074E +0599+ 074E AF PRNTOK: XOR A ; Output "Ok" and get command +0600+ 074F 32 F5 30 LD (CTLOFG),A ; Enable output +0601+ 0752 CD F6 0D CALL STTLIN ; Start new line +0602+ 0755 21 A0 06 LD HL,OKMSG ; "Ok" message +0603+ 0758 CD A1 14 CALL PRS ; Output "Ok" +0604+ 075B 21 FF FF GETCMD: LD HL,-1 ; Flag direct mode +0605+ 075E 22 0C 31 LD (LINEAT),HL ; Save as current line +0606+ 0761 CD 48 09 CALL GETLIN ; Get an input line +0607+ 0764 DA 5B 07 JP C,GETCMD ; Get line again if break +0608+ 0767 CD 5B 0B CALL GETCHR ; Get first character +0609+ 076A 3C INC A ; Test if end of line +0610+ 076B 3D DEC A ; Without affecting Carry +0611+ 076C CA 5B 07 JP Z,GETCMD ; Nothing entered - Get another +0612+ 076F F5 PUSH AF ; Save Carry status +0613+ 0770 CD 27 0C CALL ATOH ; Get line number into DE +0614+ 0773 D5 PUSH DE ; Save line number +0615+ 0774 CD 5F 08 CALL CRUNCH ; Tokenise rest of line +0616+ 0777 47 LD B,A ; Length of tokenised line +0617+ 0778 D1 POP DE ; Restore line number +0618+ 0779 F1 POP AF ; Restore Carry +0619+ 077A D2 3B 0B JP NC,EXCUTE ; No line number - Direct mode +0620+ 077D D5 PUSH DE ; Save line number +0621+ 077E C5 PUSH BC ; Save length of tokenised line +0622+ 077F AF XOR A +0623+ 0780 32 7C 31 LD (LSTBIN),A ; Clear last byte input +0624+ 0783 CD 5B 0B CALL GETCHR ; Get next character +0625+ 0786 B7 OR A ; Set flags +0626+ 0787 F5 PUSH AF ; And save them +0627+ 0788 CD EF 07 CALL SRCHLN ; Search for line number in DE +0628+ 078B DA 94 07 JP C,LINFND ; Jump if line found +0629+ 078E F1 POP AF ; Get status +0630+ 078F F5 PUSH AF ; And re-save +0631+ 0790 CA C8 0C JP Z,ULERR ; Nothing after number - Error +0632+ 0793 B7 OR A ; Clear Carry +0633+ 0794 C5 LINFND: PUSH BC ; Save address of line in prog +0634+ 0795 D2 AB 07 JP NC,INEWLN ; Line not found - Insert new +0635+ 0798 EB EX DE,HL ; Next line address in DE +0636+ 0799 2A 86 31 LD HL,(PROGND) ; End of program +0637+ 079C 1A SFTPRG: LD A,(DE) ; Shift rest of program down +0638+ 079D 02 LD (BC),A +0639+ 079E 03 INC BC ; Next destination +0640+ 079F 13 INC DE ; Next source +0641+ 07A0 CD CB 09 CALL CPDEHL ; All done? +0642+ 07A3 C2 9C 07 JP NZ,SFTPRG ; More to do +0643+ 07A6 60 LD H,B ; HL - New end of program +0644+ 07A7 69 LD L,C +0645+ 07A8 22 86 31 LD (PROGND),HL ; Update end of program +0646+ 07AB +0647+ 07AB D1 INEWLN: POP DE ; Get address of line, +0648+ 07AC F1 POP AF ; Get status +0649+ 07AD CA D2 07 JP Z,SETPTR ; No text - Set up pointers +0650+ 07B0 2A 86 31 LD HL,(PROGND) ; Get end of program +0651+ 07B3 E3 EX (SP),HL ; Get length of input line +0652+ 07B4 C1 POP BC ; End of program to BC +0653+ 07B5 09 ADD HL,BC ; Find new end +0654+ 07B6 E5 PUSH HL ; Save new end +0655+ 07B7 CD CF 06 CALL MOVUP ; Make space for line +0656+ 07BA E1 POP HL ; Restore new end +0657+ 07BB 22 86 31 LD (PROGND),HL ; Update end of program pointer +0658+ 07BE EB EX DE,HL ; Get line to move up in HL +0659+ 07BF 74 LD (HL),H ; Save MSB +0660+ 07C0 D1 POP DE ; Get new line number +0661+ 07C1 23 INC HL ; Skip pointer +0662+ 07C2 23 INC HL +0663+ 07C3 73 LD (HL),E ; Save LSB of line number +0664+ 07C4 23 INC HL +0665+ 07C5 72 LD (HL),D ; Save MSB of line number +0666+ 07C6 23 INC HL ; To first byte in line +0667+ 07C7 11 11 31 LD DE,BUFFER ; Copy buffer to program +0668+ 07CA 1A MOVBUF: LD A,(DE) ; Get source +0669+ 07CB 77 LD (HL),A ; Save destinations +0670+ 07CC 23 INC HL ; Next source +0671+ 07CD 13 INC DE ; Next destination +0672+ 07CE B7 OR A ; Done? +0673+ 07CF C2 CA 07 JP NZ,MOVBUF ; No - Repeat +0674+ 07D2 CD 1B 08 SETPTR: CALL RUNFST ; Set line pointers +0675+ 07D5 23 INC HL ; To LSB of pointer +0676+ 07D6 EB EX DE,HL ; Address to DE +0677+ 07D7 62 PTRLP: LD H,D ; Address to HL +0678+ 07D8 6B LD L,E +0679+ 07D9 7E LD A,(HL) ; Get LSB of pointer +0680+ 07DA 23 INC HL ; To MSB of pointer +0681+ 07DB B6 OR (HL) ; Compare with MSB pointer +0682+ 07DC CA 5B 07 JP Z,GETCMD ; Get command line if end +0683+ 07DF 23 INC HL ; To LSB of line number +0684+ 07E0 23 INC HL ; Skip line number +0685+ 07E1 23 INC HL ; Point to first byte in line +0686+ 07E2 AF XOR A ; Looking for 00 byte +0687+ 07E3 BE FNDEND: CP (HL) ; Found end of line? +0688+ 07E4 23 INC HL ; Move to next byte +0689+ 07E5 C2 E3 07 JP NZ,FNDEND ; No - Keep looking +0690+ 07E8 EB EX DE,HL ; Next line address to HL +0691+ 07E9 73 LD (HL),E ; Save LSB of pointer +0692+ 07EA 23 INC HL +0693+ 07EB 72 LD (HL),D ; Save MSB of pointer +0694+ 07EC C3 D7 07 JP PTRLP ; Do next line +0695+ 07EF +0696+ 07EF 2A 0E 31 SRCHLN: LD HL,(BASTXT) ; Start of program text +0697+ 07F2 44 SRCHLP: LD B,H ; BC = Address to look at +0698+ 07F3 4D LD C,L +0699+ 07F4 7E LD A,(HL) ; Get address of next line +0700+ 07F5 23 INC HL +0701+ 07F6 B6 OR (HL) ; End of program found? +0702+ 07F7 2B DEC HL +0703+ 07F8 C8 RET Z ; Yes - Line not found +0704+ 07F9 23 INC HL +0705+ 07FA 23 INC HL +0706+ 07FB 7E LD A,(HL) ; Get LSB of line number +0707+ 07FC 23 INC HL +0708+ 07FD 66 LD H,(HL) ; Get MSB of line number +0709+ 07FE 6F LD L,A +0710+ 07FF CD CB 09 CALL CPDEHL ; Compare with line in DE +0711+ 0802 60 LD H,B ; HL = Start of this line +0712+ 0803 69 LD L,C +0713+ 0804 7E LD A,(HL) ; Get LSB of next line address +0714+ 0805 23 INC HL +0715+ 0806 66 LD H,(HL) ; Get MSB of next line address +0716+ 0807 6F LD L,A ; Next line to HL +0717+ 0808 3F CCF +0718+ 0809 C8 RET Z ; Lines found - Exit +0719+ 080A 3F CCF +0720+ 080B D0 RET NC ; Line not found,at line after +0721+ 080C C3 F2 07 JP SRCHLP ; Keep looking +0722+ 080F +0723+ 080F C0 NEW: RET NZ ; Return if any more on line +0724+ 0810 2A 0E 31 CLRPTR: LD HL,(BASTXT) ; Point to start of program +0725+ 0813 AF XOR A ; Set program area to empty +0726+ 0814 77 LD (HL),A ; Save LSB = 00 +0727+ 0815 23 INC HL +0728+ 0816 77 LD (HL),A ; Save MSB = 00 +0729+ 0817 23 INC HL +0730+ 0818 22 86 31 LD (PROGND),HL ; Set program end +0731+ 081B +0732+ 081B 2A 0E 31 RUNFST: LD HL,(BASTXT) ; Clear all variables +0733+ 081E 2B DEC HL +0734+ 081F +0735+ 081F 22 7E 31 INTVAR: LD (BRKLIN),HL ; Initialise RUN variables +0736+ 0822 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM +0737+ 0825 22 73 31 LD (STRBOT),HL ; Clear string space +0738+ 0828 AF XOR A +0739+ 0829 CD 6B 0B CALL RESTOR ; Reset DATA pointers +0740+ 082C 2A 86 31 LD HL,(PROGND) ; Get end of program +0741+ 082F 22 88 31 LD (VAREND),HL ; Clear variables +0742+ 0832 22 8A 31 LD (ARREND),HL ; Clear arrays +0743+ 0835 +0744+ 0835 C1 CLREG: POP BC ; Save return address +0745+ 0836 2A 0A 31 LD HL,(STRSPC) ; Get end of working RAN +0746+ 0839 F9 LD SP,HL ; Set stack +0747+ 083A 21 63 31 LD HL,TMSTPL ; Temporary string pool +0748+ 083D 22 61 31 LD (TMSTPT),HL ; Reset temporary string ptr +0749+ 0840 AF XOR A ; A = 00 +0750+ 0841 6F LD L,A ; HL = 0000 +0751+ 0842 67 LD H,A +0752+ 0843 22 84 31 LD (CONTAD),HL ; No CONTinue +0753+ 0846 32 7B 31 LD (FORFLG),A ; Clear FOR flag +0754+ 0849 22 8E 31 LD (FNRGNM),HL ; Clear FN argument +0755+ 084C E5 PUSH HL ; HL = 0000 +0756+ 084D C5 PUSH BC ; Put back return +0757+ 084E 2A 7E 31 DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN +0758+ 0851 C9 RET ; Return to execution driver +0759+ 0852 +0760+ 0852 3E 3F PROMPT: LD A,'?' ; '?' +0761+ 0854 CD DC 09 CALL OUTC ; Output character +0762+ 0857 3E 20 LD A,' ' ; Space +0763+ 0859 CD DC 09 CALL OUTC ; Output character +0764+ 085C C3 FE 30 JP RINPUT ; Get input line +0765+ 085F +0766+ 085F AF CRUNCH: XOR A ; Tokenise line @ HL to BUFFER +0767+ 0860 32 5E 31 LD (DATFLG),A ; Reset literal flag +0768+ 0863 0E 05 LD C,2+3 ; 2 byte number and 3 nulls +0769+ 0865 11 11 31 LD DE,BUFFER ; Start of input buffer +0770+ 0868 7E CRNCLP: LD A,(HL) ; Get byte +0771+ 0869 FE 20 CP ' ' ; Is it a space? +0772+ 086B CA E7 08 JP Z,MOVDIR ; Yes - Copy direct +0773+ 086E 47 LD B,A ; Save character +0774+ 086F FE 22 CP '"' ; Is it a quote? +0775+ 0871 CA 07 09 JP Z,CPYLIT ; Yes - Copy literal string +0776+ 0874 B7 OR A ; Is it end of buffer? +0777+ 0875 CA 0E 09 JP Z,ENDBUF ; Yes - End buffer +0778+ 0878 3A 5E 31 LD A,(DATFLG) ; Get data type +0779+ 087B B7 OR A ; Literal? +0780+ 087C 7E LD A,(HL) ; Get byte to copy +0781+ 087D C2 E7 08 JP NZ,MOVDIR ; Literal - Copy direct +0782+ 0880 FE 3F CP '?' ; Is it '?' short for PRINT +0783+ 0882 3E 9E LD A,ZPRINT ; "PRINT" token +0784+ 0884 CA E7 08 JP Z,MOVDIR ; Yes - replace it +0785+ 0887 7E LD A,(HL) ; Get byte again +0786+ 0888 FE 30 CP '0' ; Is it less than '0' +0787+ 088A DA 92 08 JP C,FNDWRD ; Yes - Look for reserved words +0788+ 088D FE 3C CP 60; ";"+1 ; Is it "0123456789:;" ? +0789+ 088F DA E7 08 JP C,MOVDIR ; Yes - copy it direct +0790+ 0892 D5 FNDWRD: PUSH DE ; Look for reserved words +0791+ 0893 11 8B 04 LD DE,WORDS-1 ; Point to table +0792+ 0896 C5 PUSH BC ; Save count +0793+ 0897 01 E3 08 LD BC,RETNAD ; Where to return to +0794+ 089A C5 PUSH BC ; Save return address +0795+ 089B 06 7F LD B,ZEND-1 ; First token value -1 +0796+ 089D 7E LD A,(HL) ; Get byte +0797+ 089E FE 61 CP 'a' ; Less than 'a' ? +0798+ 08A0 DA AB 08 JP C,SEARCH ; Yes - search for words +0799+ 08A3 FE 7B CP 'z'+1 ; Greater than 'z' ? +0800+ 08A5 D2 AB 08 JP NC,SEARCH ; Yes - search for words +0801+ 08A8 E6 5F AND 01011111B ; Force upper case +0802+ 08AA 77 LD (HL),A ; Replace byte +0803+ 08AB 4E SEARCH: LD C,(HL) ; Search for a word +0804+ 08AC EB EX DE,HL +0805+ 08AD 23 GETNXT: INC HL ; Get next reserved word +0806+ 08AE B6 OR (HL) ; Start of word? +0807+ 08AF F2 AD 08 JP P,GETNXT ; No - move on +0808+ 08B2 04 INC B ; Increment token value +0809+ 08B3 7E LD A, (HL) ; Get byte from table +0810+ 08B4 E6 7F AND 01111111B ; Strip bit 7 +0811+ 08B6 C8 RET Z ; Return if end of list +0812+ 08B7 B9 CP C ; Same character as in buffer? +0813+ 08B8 C2 AD 08 JP NZ,GETNXT ; No - get next word +0814+ 08BB EB EX DE,HL +0815+ 08BC E5 PUSH HL ; Save start of word +0816+ 08BD +0817+ 08BD 13 NXTBYT: INC DE ; Look through rest of word +0818+ 08BE 1A LD A,(DE) ; Get byte from table +0819+ 08BF B7 OR A ; End of word ? +0820+ 08C0 FA DF 08 JP M,MATCH ; Yes - Match found +0821+ 08C3 4F LD C,A ; Save it +0822+ 08C4 78 LD A,B ; Get token value +0823+ 08C5 FE 88 CP ZGOTO ; Is it "GOTO" token ? +0824+ 08C7 C2 CE 08 JP NZ,NOSPC ; No - Don't allow spaces +0825+ 08CA CD 5B 0B CALL GETCHR ; Get next character +0826+ 08CD 2B DEC HL ; Cancel increment from GETCHR +0827+ 08CE 23 NOSPC: INC HL ; Next byte +0828+ 08CF 7E LD A,(HL) ; Get byte +0829+ 08D0 FE 61 CP 'a' ; Less than 'a' ? +0830+ 08D2 DA D7 08 JP C,NOCHNG ; Yes - don't change +0831+ 08D5 E6 5F AND 01011111B ; Make upper case +0832+ 08D7 B9 NOCHNG: CP C ; Same as in buffer ? +0833+ 08D8 CA BD 08 JP Z,NXTBYT ; Yes - keep testing +0834+ 08DB E1 POP HL ; Get back start of word +0835+ 08DC C3 AB 08 JP SEARCH ; Look at next word +0836+ 08DF +0837+ 08DF 48 MATCH: LD C,B ; Word found - Save token value +0838+ 08E0 F1 POP AF ; Throw away return +0839+ 08E1 EB EX DE,HL +0840+ 08E2 C9 RET ; Return to "RETNAD" +0841+ 08E3 EB RETNAD: EX DE,HL ; Get address in string +0842+ 08E4 79 LD A,C ; Get token value +0843+ 08E5 C1 POP BC ; Restore buffer length +0844+ 08E6 D1 POP DE ; Get destination address +0845+ 08E7 23 MOVDIR: INC HL ; Next source in buffer +0846+ 08E8 12 LD (DE),A ; Put byte in buffer +0847+ 08E9 13 INC DE ; Move up buffer +0848+ 08EA 0C INC C ; Increment length of buffer +0849+ 08EB D6 3A SUB ':' ; End of statement? +0850+ 08ED CA F5 08 JP Z,SETLIT ; Jump if multi-statement line +0851+ 08F0 FE 49 CP ZDATA-3AH ; Is it DATA statement ? +0852+ 08F2 C2 F8 08 JP NZ,TSTREM ; No - see if REM +0853+ 08F5 32 5E 31 SETLIT: LD (DATFLG),A ; Set literal flag +0854+ 08F8 D6 54 TSTREM: SUB ZREM-3AH ; Is it REM? +0855+ 08FA C2 68 08 JP NZ,CRNCLP ; No - Leave flag +0856+ 08FD 47 LD B,A ; Copy rest of buffer +0857+ 08FE 7E NXTCHR: LD A,(HL) ; Get byte +0858+ 08FF B7 OR A ; End of line ? +0859+ 0900 CA 0E 09 JP Z,ENDBUF ; Yes - Terminate buffer +0860+ 0903 B8 CP B ; End of statement ? +0861+ 0904 CA E7 08 JP Z,MOVDIR ; Yes - Get next one +0862+ 0907 23 CPYLIT: INC HL ; Move up source string +0863+ 0908 12 LD (DE),A ; Save in destination +0864+ 0909 0C INC C ; Increment length +0865+ 090A 13 INC DE ; Move up destination +0866+ 090B C3 FE 08 JP NXTCHR ; Repeat +0867+ 090E +0868+ 090E 21 10 31 ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer +0869+ 0911 12 LD (DE),A ; Mark end of buffer (A = 00) +0870+ 0912 13 INC DE +0871+ 0913 12 LD (DE),A ; A = 00 +0872+ 0914 13 INC DE +0873+ 0915 12 LD (DE),A ; A = 00 +0874+ 0916 C9 RET +0875+ 0917 +0876+ 0917 3A F4 30 DODEL: LD A,(NULFLG) ; Get null flag status +0877+ 091A B7 OR A ; Is it zero? +0878+ 091B 3E 00 LD A,0 ; Zero A - Leave flags +0879+ 091D 32 F4 30 LD (NULFLG),A ; Zero null flag +0880+ 0920 C2 2B 09 JP NZ,ECHDEL ; Set - Echo it +0881+ 0923 05 DEC B ; Decrement length +0882+ 0924 CA 48 09 JP Z,GETLIN ; Get line again if empty +0883+ 0927 CD DC 09 CALL OUTC ; Output null character +0884+ 092A 3E .BYTE 3EH ; Skip "DEC B" +0885+ 092B 05 ECHDEL: DEC B ; Count bytes in buffer +0886+ 092C 2B DEC HL ; Back space buffer +0887+ 092D CA 3F 09 JP Z,OTKLN ; No buffer - Try again +0888+ 0930 7E LD A,(HL) ; Get deleted byte +0889+ 0931 CD DC 09 CALL OUTC ; Echo it +0890+ 0934 C3 51 09 JP MORINP ; Get more input +0891+ 0937 +0892+ 0937 05 DELCHR: DEC B ; Count bytes in buffer +0893+ 0938 2B DEC HL ; Back space buffer +0894+ 0939 CD DC 09 CALL OUTC ; Output character in A +0895+ 093C C2 51 09 JP NZ,MORINP ; Not end - Get more +0896+ 093F CD DC 09 OTKLN: CALL OUTC ; Output character in A +0897+ 0942 CD 03 0E KILIN: CALL PRNTCRLF ; Output CRLF +0898+ 0945 C3 48 09 JP TTYLIN ; Get line again +0899+ 0948 +0900+ 0948 GETLIN: +0901+ 0948 21 11 31 TTYLIN: LD HL,BUFFER ; Get a line by character +0902+ 094B 06 01 LD B,1 ; Set buffer as empty +0903+ 094D AF XOR A +0904+ 094E 32 F4 30 LD (NULFLG),A ; Clear null flag +0905+ 0951 CD 06 0A MORINP: CALL CLOTST ; Get character and test ^O +0906+ 0954 4F LD C,A ; Save character in C +0907+ 0955 FE 7F CP DEL ; Delete character? +0908+ 0957 CA 17 09 JP Z,DODEL ; Yes - Process it +0909+ 095A 3A F4 30 LD A,(NULFLG) ; Get null flag +0910+ 095D B7 OR A ; Test null flag status +0911+ 095E CA 6A 09 JP Z,PROCES ; Reset - Process character +0912+ 0961 3E 00 LD A,0 ; Set a null +0913+ 0963 CD DC 09 CALL OUTC ; Output null +0914+ 0966 AF XOR A ; Clear A +0915+ 0967 32 F4 30 LD (NULFLG),A ; Reset null flag +0916+ 096A 79 PROCES: LD A,C ; Get character +0917+ 096B FE 07 CP CTRLG ; Bell? +0918+ 096D CA AE 09 JP Z,PUTCTL ; Yes - Save it +0919+ 0970 FE 03 CP CTRLC ; Is it control "C"? +0920+ 0972 CC 03 0E CALL Z,PRNTCRLF ; Yes - Output CRLF +0921+ 0975 37 SCF ; Flag break +0922+ 0976 C8 RET Z ; Return if control "C" +0923+ 0977 FE 0D CP CR ; Is it enter? +0924+ 0979 CA FE 0D JP Z,ENDINP ; Yes - Terminate input +0925+ 097C FE 15 CP CTRLU ; Is it control "U"? +0926+ 097E CA 42 09 JP Z,KILIN ; Yes - Get another line +0927+ 0981 FE 40 CP '@' ; Is it "kill line"? +0928+ 0983 CA 3F 09 JP Z,OTKLN ; Yes - Kill line +0929+ 0986 FE 5F CP '_' ; Is it delete? +0930+ 0988 CA 37 09 JP Z,DELCHR ; Yes - Delete character +0931+ 098B FE 08 CP BKSP ; Is it backspace? +0932+ 098D CA 37 09 JP Z,DELCHR ; Yes - Delete character +0933+ 0990 FE 12 CP CTRLR ; Is it control "R"? +0934+ 0992 C2 A9 09 JP NZ,PUTBUF ; No - Put in buffer +0935+ 0995 C5 PUSH BC ; Save buffer length +0936+ 0996 D5 PUSH DE ; Save DE +0937+ 0997 E5 PUSH HL ; Save buffer address +0938+ 0998 36 00 LD (HL),0 ; Mark end of buffer +0939+ 099A CD B3 1F CALL OUTNCR ; Output and do CRLF +0940+ 099D 21 11 31 LD HL,BUFFER ; Point to buffer start +0941+ 09A0 CD A1 14 CALL PRS ; Output buffer +0942+ 09A3 E1 POP HL ; Restore buffer address +0943+ 09A4 D1 POP DE ; Restore DE +0944+ 09A5 C1 POP BC ; Restore buffer length +0945+ 09A6 C3 51 09 JP MORINP ; Get another character +0946+ 09A9 +0947+ 09A9 FE 20 PUTBUF: CP ' ' ; Is it a control code? +0948+ 09AB DA 51 09 JP C,MORINP ; Yes - Ignore +0949+ 09AE 78 PUTCTL: LD A,B ; Get number of bytes in buffer +0950+ 09AF FE 49 CP 72+1 ; Test for line overflow +0951+ 09B1 3E 07 LD A,CTRLG ; Set a bell +0952+ 09B3 D2 C3 09 JP NC,OUTNBS ; Ring bell if buffer full +0953+ 09B6 79 LD A,C ; Get character +0954+ 09B7 71 LD (HL),C ; Save in buffer +0955+ 09B8 32 7C 31 LD (LSTBIN),A ; Save last input byte +0956+ 09BB 23 INC HL ; Move up buffer +0957+ 09BC 04 INC B ; Increment length +0958+ 09BD CD DC 09 OUTIT: CALL OUTC ; Output the character entered +0959+ 09C0 C3 51 09 JP MORINP ; Get another character +0960+ 09C3 +0961+ 09C3 CD DC 09 OUTNBS: CALL OUTC ; Output bell and back over it +0962+ 09C6 3E 08 LD A,BKSP ; Set back space +0963+ 09C8 C3 BD 09 JP OUTIT ; Output it and get more +0964+ 09CB +0965+ 09CB 7C CPDEHL: LD A,H ; Get H +0966+ 09CC 92 SUB D ; Compare with D +0967+ 09CD C0 RET NZ ; Different - Exit +0968+ 09CE 7D LD A,L ; Get L +0969+ 09CF 93 SUB E ; Compare with E +0970+ 09D0 C9 RET ; Return status +0971+ 09D1 +0972+ 09D1 7E CHKSYN: LD A,(HL) ; Check syntax of character +0973+ 09D2 E3 EX (SP),HL ; Address of test byte +0974+ 09D3 BE CP (HL) ; Same as in code string? +0975+ 09D4 23 INC HL ; Return address +0976+ 09D5 E3 EX (SP),HL ; Put it back +0977+ 09D6 CA 5B 0B JP Z,GETCHR ; Yes - Get next character +0978+ 09D9 C3 03 07 JP SNERR ; Different - ?SN Error +0979+ 09DC +0980+ 09DC F5 OUTC: PUSH AF ; Save character +0981+ 09DD 3A F5 30 LD A,(CTLOFG) ; Get control "O" flag +0982+ 09E0 B7 OR A ; Is it set? +0983+ 09E1 C2 D6 14 JP NZ,POPAF ; Yes - don't output +0984+ 09E4 F1 POP AF ; Restore character +0985+ 09E5 C5 PUSH BC ; Save buffer length +0986+ 09E6 F5 PUSH AF ; Save character +0987+ 09E7 FE 20 CP ' ' ; Is it a control code? +0988+ 09E9 DA 00 0A JP C,DINPOS ; Yes - Don't INC POS(X) +0989+ 09EC 3A F2 30 LD A,(LWIDTH) ; Get line width +0990+ 09EF 47 LD B,A ; To B +0991+ 09F0 3A 5B 31 LD A,(CURPOS) ; Get cursor position +0992+ 09F3 04 INC B ; Width 255? +0993+ 09F4 CA FC 09 JP Z,INCLEN ; Yes - No width limit +0994+ 09F7 05 DEC B ; Restore width +0995+ 09F8 B8 CP B ; At end of line? +0996+ 09F9 CC 03 0E CALL Z,PRNTCRLF ; Yes - output CRLF +0997+ 09FC 3C INCLEN: INC A ; Move on one character +0998+ 09FD 32 5B 31 LD (CURPOS),A ; Save new position +0999+ 0A00 F1 DINPOS: POP AF ; Restore character +1000+ 0A01 C1 POP BC ; Restore buffer length +1001+ 0A02 CD 9C 1F CALL MONOUT ; Send it +1002+ 0A05 C9 RET +1003+ 0A06 +1004+ 0A06 CD 60 1E CLOTST: CALL GETINP ; Get input character +1005+ 0A09 E6 7F AND 01111111B ; Strip bit 7 +1006+ 0A0B FE 0F CP CTRLO ; Is it control "O"? +1007+ 0A0D C0 RET NZ ; No don't flip flag +1008+ 0A0E 3A F5 30 LD A,(CTLOFG) ; Get flag +1009+ 0A11 2F CPL ; Flip it +1010+ 0A12 32 F5 30 LD (CTLOFG),A ; Put it back +1011+ 0A15 AF XOR A ; Null character +1012+ 0A16 C9 RET +1013+ 0A17 +1014+ 0A17 CD 27 0C LIST: CALL ATOH ; ASCII number to DE +1015+ 0A1A C0 RET NZ ; Return if anything extra +1016+ 0A1B C1 POP BC ; Rubbish - Not needed +1017+ 0A1C CD EF 07 CALL SRCHLN ; Search for line number in DE +1018+ 0A1F C5 PUSH BC ; Save address of line +1019+ 0A20 CD 6D 0A CALL SETLIN ; Set up lines counter +1020+ 0A23 E1 LISTLP: POP HL ; Restore address of line +1021+ 0A24 4E LD C,(HL) ; Get LSB of next line +1022+ 0A25 23 INC HL +1023+ 0A26 46 LD B,(HL) ; Get MSB of next line +1024+ 0A27 23 INC HL +1025+ 0A28 78 LD A,B ; BC = 0 (End of program)? +1026+ 0A29 B1 OR C +1027+ 0A2A CA 4E 07 JP Z,PRNTOK ; Yes - Go to command mode +1028+ 0A2D CD 76 0A CALL COUNT ; Count lines +1029+ 0A30 CD 86 0B CALL TSTBRK ; Test for break key +1030+ 0A33 C5 PUSH BC ; Save address of next line +1031+ 0A34 CD 03 0E CALL PRNTCRLF ; Output CRLF +1032+ 0A37 5E LD E,(HL) ; Get LSB of line number +1033+ 0A38 23 INC HL +1034+ 0A39 56 LD D,(HL) ; Get MSB of line number +1035+ 0A3A 23 INC HL +1036+ 0A3B E5 PUSH HL ; Save address of line start +1037+ 0A3C EB EX DE,HL ; Line number to HL +1038+ 0A3D CD 44 1B CALL PRNTHL ; Output line number in decimal +1039+ 0A40 3E 20 LD A,' ' ; Space after line number +1040+ 0A42 E1 POP HL ; Restore start of line address +1041+ 0A43 CD DC 09 LSTLP2: CALL OUTC ; Output character in A +1042+ 0A46 7E LSTLP3: LD A,(HL) ; Get next byte in line +1043+ 0A47 B7 OR A ; End of line? +1044+ 0A48 23 INC HL ; To next byte in line +1045+ 0A49 CA 23 0A JP Z,LISTLP ; Yes - get next line +1046+ 0A4C F2 43 0A JP P,LSTLP2 ; No token - output it +1047+ 0A4F D6 7F SUB ZEND-1 ; Find and output word +1048+ 0A51 4F LD C,A ; Token offset+1 to C +1049+ 0A52 11 8C 04 LD DE,WORDS ; Reserved word list +1050+ 0A55 1A FNDTOK: LD A,(DE) ; Get character in list +1051+ 0A56 13 INC DE ; Move on to next +1052+ 0A57 B7 OR A ; Is it start of word? +1053+ 0A58 F2 55 0A JP P,FNDTOK ; No - Keep looking for word +1054+ 0A5B 0D DEC C ; Count words +1055+ 0A5C C2 55 0A JP NZ,FNDTOK ; Not there - keep looking +1056+ 0A5F E6 7F OUTWRD: AND 01111111B ; Strip bit 7 +1057+ 0A61 CD DC 09 CALL OUTC ; Output first character +1058+ 0A64 1A LD A,(DE) ; Get next character +1059+ 0A65 13 INC DE ; Move on to next +1060+ 0A66 B7 OR A ; Is it end of word? +1061+ 0A67 F2 5F 0A JP P,OUTWRD ; No - output the rest +1062+ 0A6A C3 46 0A JP LSTLP3 ; Next byte in line +1063+ 0A6D +1064+ 0A6D E5 SETLIN: PUSH HL ; Set up LINES counter +1065+ 0A6E 2A F8 30 LD HL,(LINESN) ; Get LINES number +1066+ 0A71 22 F6 30 LD (LINESC),HL ; Save in LINES counter +1067+ 0A74 E1 POP HL +1068+ 0A75 C9 RET +1069+ 0A76 +1070+ 0A76 E5 COUNT: PUSH HL ; Save code string address +1071+ 0A77 D5 PUSH DE +1072+ 0A78 2A F6 30 LD HL,(LINESC) ; Get LINES counter +1073+ 0A7B 11 FF FF LD DE,-1 +1074+ 0A7E ED 5A ADC HL,DE ; Decrement +1075+ 0A80 22 F6 30 LD (LINESC),HL ; Put it back +1076+ 0A83 D1 POP DE +1077+ 0A84 E1 POP HL ; Restore code string address +1078+ 0A85 F0 RET P ; Return if more lines to go +1079+ 0A86 E5 PUSH HL ; Save code string address +1080+ 0A87 2A F8 30 LD HL,(LINESN) ; Get LINES number +1081+ 0A8A 22 F6 30 LD (LINESC),HL ; Reset LINES counter +1082+ 0A8D CD 60 1E CALL GETINP ; Get input character +1083+ 0A90 FE 03 CP CTRLC ; Is it control "C"? +1084+ 0A92 CA 99 0A JP Z,RSLNBK ; Yes - Reset LINES and break +1085+ 0A95 E1 POP HL ; Restore code string address +1086+ 0A96 C3 76 0A JP COUNT ; Keep on counting +1087+ 0A99 +1088+ 0A99 2A F8 30 RSLNBK: LD HL,(LINESN) ; Get LINES number +1089+ 0A9C 22 F6 30 LD (LINESC),HL ; Reset LINES counter +1090+ 0A9F C3 FD 03 JP BRKRET ; Go and output "Break" +1091+ 0AA2 +1092+ 0AA2 3E 64 FOR: LD A,64H ; Flag "FOR" assignment +1093+ 0AA4 32 7B 31 LD (FORFLG),A ; Save "FOR" flag +1094+ 0AA7 CD 09 0D CALL LET ; Set up initial index +1095+ 0AAA C1 POP BC ; Drop RETurn address +1096+ 0AAB E5 PUSH HL ; Save code string address +1097+ 0AAC CD F2 0C CALL DATA ; Get next statement address +1098+ 0AAF 22 77 31 LD (LOOPST),HL ; Save it for start of loop +1099+ 0AB2 21 02 00 LD HL,2 ; Offset for "FOR" block +1100+ 0AB5 39 ADD HL,SP ; Point to it +1101+ 0AB6 CD B0 06 FORSLP: CALL LOKFOR ; Look for existing "FOR" block +1102+ 0AB9 D1 POP DE ; Get code string address +1103+ 0ABA C2 D2 0A JP NZ,FORFND ; No nesting found +1104+ 0ABD 09 ADD HL,BC ; Move into "FOR" block +1105+ 0ABE D5 PUSH DE ; Save code string address +1106+ 0ABF 2B DEC HL +1107+ 0AC0 56 LD D,(HL) ; Get MSB of loop statement +1108+ 0AC1 2B DEC HL +1109+ 0AC2 5E LD E,(HL) ; Get LSB of loop statement +1110+ 0AC3 23 INC HL +1111+ 0AC4 23 INC HL +1112+ 0AC5 E5 PUSH HL ; Save block address +1113+ 0AC6 2A 77 31 LD HL,(LOOPST) ; Get address of loop statement +1114+ 0AC9 CD CB 09 CALL CPDEHL ; Compare the FOR loops +1115+ 0ACC E1 POP HL ; Restore block address +1116+ 0ACD C2 B6 0A JP NZ,FORSLP ; Different FORs - Find another +1117+ 0AD0 D1 POP DE ; Restore code string address +1118+ 0AD1 F9 LD SP,HL ; Remove all nested loops +1119+ 0AD2 +1120+ 0AD2 EB FORFND: EX DE,HL ; Code string address to HL +1121+ 0AD3 0E 08 LD C,8 +1122+ 0AD5 CD E0 06 CALL CHKSTK ; Check for 8 levels of stack +1123+ 0AD8 E5 PUSH HL ; Save code string address +1124+ 0AD9 2A 77 31 LD HL,(LOOPST) ; Get first statement of loop +1125+ 0ADC E3 EX (SP),HL ; Save and restore code string +1126+ 0ADD E5 PUSH HL ; Re-save code string address +1127+ 0ADE 2A 0C 31 LD HL,(LINEAT) ; Get current line number +1128+ 0AE1 E3 EX (SP),HL ; Save and restore code string +1129+ 0AE2 CD CB 0F CALL TSTNUM ; Make sure it's a number +1130+ 0AE5 CD D1 09 CALL CHKSYN ; Make sure "TO" is next +1131+ 0AE8 A6 .BYTE ZTO ; "TO" token +1132+ 0AE9 CD C8 0F CALL GETNUM ; Get "TO" expression value +1133+ 0AEC E5 PUSH HL ; Save code string address +1134+ 0AED CD F6 19 CALL BCDEFP ; Move "TO" value to BCDE +1135+ 0AF0 E1 POP HL ; Restore code string address +1136+ 0AF1 C5 PUSH BC ; Save "TO" value in block +1137+ 0AF2 D5 PUSH DE +1138+ 0AF3 01 00 81 LD BC,8100H ; BCDE - 1 (default STEP) +1139+ 0AF6 51 LD D,C ; C=0 +1140+ 0AF7 5A LD E,D ; D=0 +1141+ 0AF8 7E LD A,(HL) ; Get next byte in code string +1142+ 0AF9 FE AB CP ZSTEP ; See if "STEP" is stated +1143+ 0AFB 3E 01 LD A,1 ; Sign of step = 1 +1144+ 0AFD C2 0E 0B JP NZ,SAVSTP ; No STEP given - Default to 1 +1145+ 0B00 CD 5B 0B CALL GETCHR ; Jump over "STEP" token +1146+ 0B03 CD C8 0F CALL GETNUM ; Get step value +1147+ 0B06 E5 PUSH HL ; Save code string address +1148+ 0B07 CD F6 19 CALL BCDEFP ; Move STEP to BCDE +1149+ 0B0A CD AA 19 CALL TSTSGN ; Test sign of FPREG +1150+ 0B0D E1 POP HL ; Restore code string address +1151+ 0B0E C5 SAVSTP: PUSH BC ; Save the STEP value in block +1152+ 0B0F D5 PUSH DE +1153+ 0B10 F5 PUSH AF ; Save sign of STEP +1154+ 0B11 33 INC SP ; Don't save flags +1155+ 0B12 E5 PUSH HL ; Save code string address +1156+ 0B13 2A 7E 31 LD HL,(BRKLIN) ; Get address of index variable +1157+ 0B16 E3 EX (SP),HL ; Save and restore code string +1158+ 0B17 06 81 PUTFID: LD B,ZFOR ; "FOR" block marker +1159+ 0B19 C5 PUSH BC ; Save it +1160+ 0B1A 33 INC SP ; Don't save C +1161+ 0B1B +1162+ 0B1B CD 86 0B RUNCNT: CALL TSTBRK ; Execution driver - Test break +1163+ 0B1E 22 7E 31 LD (BRKLIN),HL ; Save code address for break +1164+ 0B21 7E LD A,(HL) ; Get next byte in code string +1165+ 0B22 FE 3A CP ':' ; Multi statement line? +1166+ 0B24 CA 3B 0B JP Z,EXCUTE ; Yes - Execute it +1167+ 0B27 B7 OR A ; End of line? +1168+ 0B28 C2 03 07 JP NZ,SNERR ; No - Syntax error +1169+ 0B2B 23 INC HL ; Point to address of next line +1170+ 0B2C 7E LD A,(HL) ; Get LSB of line pointer +1171+ 0B2D 23 INC HL +1172+ 0B2E B6 OR (HL) ; Is it zero (End of prog)? +1173+ 0B2F CA AD 0B JP Z,ENDPRG ; Yes - Terminate execution +1174+ 0B32 23 INC HL ; Point to line number +1175+ 0B33 5E LD E,(HL) ; Get LSB of line number +1176+ 0B34 23 INC HL +1177+ 0B35 56 LD D,(HL) ; Get MSB of line number +1178+ 0B36 EB EX DE,HL ; Line number to HL +1179+ 0B37 22 0C 31 LD (LINEAT),HL ; Save as current line number +1180+ 0B3A EB EX DE,HL ; Line number back to DE +1181+ 0B3B CD 5B 0B EXCUTE: CALL GETCHR ; Get key word +1182+ 0B3E 11 1B 0B LD DE,RUNCNT ; Where to RETurn to +1183+ 0B41 D5 PUSH DE ; Save for RETurn +1184+ 0B42 C8 IFJMP: RET Z ; Go to RUNCNT if end of STMT +1185+ 0B43 D6 80 ONJMP: SUB ZEND ; Is it a token? +1186+ 0B45 DA 09 0D JP C,LET ; No - try to assign it +1187+ 0B48 FE 25 CP ZNEW+1-ZEND ; END to NEW ? +1188+ 0B4A D2 03 07 JP NC,SNERR ; Not a key word - ?SN Error +1189+ 0B4D 07 RLCA ; Double it +1190+ 0B4E 4F LD C,A ; BC = Offset into table +1191+ 0B4F 06 00 LD B,0 +1192+ 0B51 EB EX DE,HL ; Save code string address +1193+ 0B52 21 AB 05 LD HL,WORDTB ; Keyword address table +1194+ 0B55 09 ADD HL,BC ; Point to routine address +1195+ 0B56 4E LD C,(HL) ; Get LSB of routine address +1196+ 0B57 23 INC HL +1197+ 0B58 46 LD B,(HL) ; Get MSB of routine address +1198+ 0B59 C5 PUSH BC ; Save routine address +1199+ 0B5A EB EX DE,HL ; Restore code string address +1200+ 0B5B +1201+ 0B5B 23 GETCHR: INC HL ; Point to next character +1202+ 0B5C 7E LD A,(HL) ; Get next code string byte +1203+ 0B5D FE 3A CP ':' ; Z if ':' +1204+ 0B5F D0 RET NC ; NC if > "9" +1205+ 0B60 FE 20 CP ' ' +1206+ 0B62 CA 5B 0B JP Z,GETCHR ; Skip over spaces +1207+ 0B65 FE 30 CP '0' +1208+ 0B67 3F CCF ; NC if < '0' +1209+ 0B68 3C INC A ; Test for zero - Leave carry +1210+ 0B69 3D DEC A ; Z if Null +1211+ 0B6A C9 RET +1212+ 0B6B +1213+ 0B6B EB RESTOR: EX DE,HL ; Save code string address +1214+ 0B6C 2A 0E 31 LD HL,(BASTXT) ; Point to start of program +1215+ 0B6F CA 80 0B JP Z,RESTNL ; Just RESTORE - reset pointer +1216+ 0B72 EB EX DE,HL ; Restore code string address +1217+ 0B73 CD 27 0C CALL ATOH ; Get line number to DE +1218+ 0B76 E5 PUSH HL ; Save code string address +1219+ 0B77 CD EF 07 CALL SRCHLN ; Search for line number in DE +1220+ 0B7A 60 LD H,B ; HL = Address of line +1221+ 0B7B 69 LD L,C +1222+ 0B7C D1 POP DE ; Restore code string address +1223+ 0B7D D2 C8 0C JP NC,ULERR ; ?UL Error if not found +1224+ 0B80 2B RESTNL: DEC HL ; Byte before DATA statement +1225+ 0B81 22 8C 31 UPDATA: LD (NXTDAT),HL ; Update DATA pointer +1226+ 0B84 EB EX DE,HL ; Restore code string address +1227+ 0B85 C9 RET +1228+ 0B86 +1229+ 0B86 +1230+ 0B86 DF TSTBRK: RST 18H ; Check input status +1231+ 0B87 C8 RET Z ; No key, go back +1232+ 0B88 D7 RST 10H ; Get the key into A +1233+ 0B89 FE 1B CP ESC ; Escape key? +1234+ 0B8B 28 11 JR Z,BRK ; Yes, break +1235+ 0B8D FE 03 CP CTRLC ; +1236+ 0B8F 28 0D JR Z,BRK ; Yes, break +1237+ 0B91 FE 13 CP CTRLS ; Stop scrolling? +1238+ 0B93 C0 RET NZ ; Other key, ignore +1239+ 0B94 +1240+ 0B94 +1241+ 0B94 D7 STALL: RST 10H ; Wait for key +1242+ 0B95 FE 11 CP CTRLQ ; Resume scrolling? +1243+ 0B97 C8 RET Z ; Release the chokehold +1244+ 0B98 FE 03 CP CTRLC ; Second break? +1245+ 0B9A 28 07 JR Z,STOP ; Break during hold exits prog +1246+ 0B9C 18 F6 JR STALL ; Loop until or +1247+ 0B9E +1248+ 0B9E 3E FF BRK LD A,$FF ; Set BRKFLG +1249+ 0BA0 32 FD 30 LD (BRKFLG),A ; Store it +1250+ 0BA3 +1251+ 0BA3 +1252+ 0BA3 C0 STOP: RET NZ ; Exit if anything else +1253+ 0BA4 F6 .BYTE 0F6H ; Flag "STOP" +1254+ 0BA5 C0 PEND: RET NZ ; Exit if anything else +1255+ 0BA6 22 7E 31 LD (BRKLIN),HL ; Save point of break +1256+ 0BA9 21 .BYTE 21H ; Skip "OR 11111111B" +1257+ 0BAA F6 FF INPBRK: OR 11111111B ; Flag "Break" wanted +1258+ 0BAC C1 POP BC ; Return not needed and more +1259+ 0BAD 2A 0C 31 ENDPRG: LD HL,(LINEAT) ; Get current line number +1260+ 0BB0 F5 PUSH AF ; Save STOP / END status +1261+ 0BB1 7D LD A,L ; Is it direct break? +1262+ 0BB2 A4 AND H +1263+ 0BB3 3C INC A ; Line is -1 if direct break +1264+ 0BB4 CA C0 0B JP Z,NOLIN ; Yes - No line number +1265+ 0BB7 22 82 31 LD (ERRLIN),HL ; Save line of break +1266+ 0BBA 2A 7E 31 LD HL,(BRKLIN) ; Get point of break +1267+ 0BBD 22 84 31 LD (CONTAD),HL ; Save point to CONTinue +1268+ 0BC0 AF NOLIN: XOR A +1269+ 0BC1 32 F5 30 LD (CTLOFG),A ; Enable output +1270+ 0BC4 CD F6 0D CALL STTLIN ; Start a new line +1271+ 0BC7 F1 POP AF ; Restore STOP / END status +1272+ 0BC8 21 A6 06 LD HL,BRKMSG ; "Break" message +1273+ 0BCB C2 37 07 JP NZ,ERRIN ; "in line" wanted? +1274+ 0BCE C3 4E 07 JP PRNTOK ; Go to command mode +1275+ 0BD1 +1276+ 0BD1 2A 84 31 CONT: LD HL,(CONTAD) ; Get CONTinue address +1277+ 0BD4 7C LD A,H ; Is it zero? +1278+ 0BD5 B5 OR L +1279+ 0BD6 1E 20 LD E,CN ; ?CN Error +1280+ 0BD8 CA 17 07 JP Z,ERROR ; Yes - output "?CN Error" +1281+ 0BDB EB EX DE,HL ; Save code string address +1282+ 0BDC 2A 82 31 LD HL,(ERRLIN) ; Get line of last break +1283+ 0BDF 22 0C 31 LD (LINEAT),HL ; Set up current line number +1284+ 0BE2 EB EX DE,HL ; Restore code string address +1285+ 0BE3 C9 RET ; CONTinue where left off +1286+ 0BE4 +1287+ 0BE4 CD 29 17 NULL: CALL GETINT ; Get integer 0-255 +1288+ 0BE7 C0 RET NZ ; Return if bad value +1289+ 0BE8 32 F1 30 LD (NULLS),A ; Set nulls number +1290+ 0BEB C9 RET +1291+ 0BEC +1292+ 0BEC +1293+ 0BEC E5 ACCSUM: PUSH HL ; Save address in array +1294+ 0BED 2A FA 30 LD HL,(CHKSUM) ; Get check sum +1295+ 0BF0 06 00 LD B,0 ; BC - Value of byte +1296+ 0BF2 4F LD C,A +1297+ 0BF3 09 ADD HL,BC ; Add byte to check sum +1298+ 0BF4 22 FA 30 LD (CHKSUM),HL ; Re-save check sum +1299+ 0BF7 E1 POP HL ; Restore address in array +1300+ 0BF8 C9 RET +1301+ 0BF9 +1302+ 0BF9 7E CHKLTR: LD A,(HL) ; Get byte +1303+ 0BFA FE 41 CP 'A' ; < 'a' ? +1304+ 0BFC D8 RET C ; Carry set if not letter +1305+ 0BFD FE 5B CP 'Z'+1 ; > 'z' ? +1306+ 0BFF 3F CCF +1307+ 0C00 C9 RET ; Carry set if not letter +1308+ 0C01 +1309+ 0C01 CD 5B 0B FPSINT: CALL GETCHR ; Get next character +1310+ 0C04 CD C8 0F POSINT: CALL GETNUM ; Get integer 0 to 32767 +1311+ 0C07 CD AA 19 DEPINT: CALL TSTSGN ; Test sign of FPREG +1312+ 0C0A FA 22 0C JP M,FCERR ; Negative - ?FC Error +1313+ 0C0D 3A 97 31 DEINT: LD A,(FPEXP) ; Get integer value to DE +1314+ 0C10 FE 90 CP 80H+16 ; Exponent in range (16 bits)? +1315+ 0C12 DA 52 1A JP C,FPINT ; Yes - convert it +1316+ 0C15 01 80 90 LD BC,9080H ; BCDE = -32768 +1317+ 0C18 11 00 00 LD DE,0000 +1318+ 0C1B E5 PUSH HL ; Save code string address +1319+ 0C1C CD 25 1A CALL CMPNUM ; Compare FPREG with BCDE +1320+ 0C1F E1 POP HL ; Restore code string address +1321+ 0C20 51 LD D,C ; MSB to D +1322+ 0C21 C8 RET Z ; Return if in range +1323+ 0C22 1E 08 FCERR: LD E,FC ; ?FC Error +1324+ 0C24 C3 17 07 JP ERROR ; Output error- +1325+ 0C27 +1326+ 0C27 2B ATOH: DEC HL ; ASCII number to DE binary +1327+ 0C28 11 00 00 GETLN: LD DE,0 ; Get number to DE +1328+ 0C2B CD 5B 0B GTLNLP: CALL GETCHR ; Get next character +1329+ 0C2E D0 RET NC ; Exit if not a digit +1330+ 0C2F E5 PUSH HL ; Save code string address +1331+ 0C30 F5 PUSH AF ; Save digit +1332+ 0C31 21 98 19 LD HL,65529/10 ; Largest number 65529 +1333+ 0C34 CD CB 09 CALL CPDEHL ; Number in range? +1334+ 0C37 DA 03 07 JP C,SNERR ; No - ?SN Error +1335+ 0C3A 62 LD H,D ; HL = Number +1336+ 0C3B 6B LD L,E +1337+ 0C3C 19 ADD HL,DE ; Times 2 +1338+ 0C3D 29 ADD HL,HL ; Times 4 +1339+ 0C3E 19 ADD HL,DE ; Times 5 +1340+ 0C3F 29 ADD HL,HL ; Times 10 +1341+ 0C40 F1 POP AF ; Restore digit +1342+ 0C41 D6 30 SUB '0' ; Make it 0 to 9 +1343+ 0C43 5F LD E,A ; DE = Value of digit +1344+ 0C44 16 00 LD D,0 +1345+ 0C46 19 ADD HL,DE ; Add to number +1346+ 0C47 EB EX DE,HL ; Number to DE +1347+ 0C48 E1 POP HL ; Restore code string address +1348+ 0C49 C3 2B 0C JP GTLNLP ; Go to next character +1349+ 0C4C +1350+ 0C4C CA 1F 08 CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters +1351+ 0C4F CD 04 0C CALL POSINT ; Get integer 0 to 32767 to DE +1352+ 0C52 2B DEC HL ; Cancel increment +1353+ 0C53 CD 5B 0B CALL GETCHR ; Get next character +1354+ 0C56 E5 PUSH HL ; Save code string address +1355+ 0C57 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM +1356+ 0C5A CA 6F 0C JP Z,STORED ; No value given - Use stored +1357+ 0C5D E1 POP HL ; Restore code string address +1358+ 0C5E CD D1 09 CALL CHKSYN ; Check for comma +1359+ 0C61 2C .BYTE ',' +1360+ 0C62 D5 PUSH DE ; Save number +1361+ 0C63 CD 04 0C CALL POSINT ; Get integer 0 to 32767 +1362+ 0C66 2B DEC HL ; Cancel increment +1363+ 0C67 CD 5B 0B CALL GETCHR ; Get next character +1364+ 0C6A C2 03 07 JP NZ,SNERR ; ?SN Error if more on line +1365+ 0C6D E3 EX (SP),HL ; Save code string address +1366+ 0C6E EB EX DE,HL ; Number to DE +1367+ 0C6F 7D STORED: LD A,L ; Get LSB of new RAM top +1368+ 0C70 93 SUB E ; Subtract LSB of string space +1369+ 0C71 5F LD E,A ; Save LSB +1370+ 0C72 7C LD A,H ; Get MSB of new RAM top +1371+ 0C73 9A SBC A,D ; Subtract MSB of string space +1372+ 0C74 57 LD D,A ; Save MSB +1373+ 0C75 DA F8 06 JP C,OMERR ; ?OM Error if not enough mem +1374+ 0C78 E5 PUSH HL ; Save RAM top +1375+ 0C79 2A 86 31 LD HL,(PROGND) ; Get program end +1376+ 0C7C 01 28 00 LD BC,40 ; 40 Bytes minimum working RAM +1377+ 0C7F 09 ADD HL,BC ; Get lowest address +1378+ 0C80 CD CB 09 CALL CPDEHL ; Enough memory? +1379+ 0C83 D2 F8 06 JP NC,OMERR ; No - ?OM Error +1380+ 0C86 EB EX DE,HL ; RAM top to HL +1381+ 0C87 22 0A 31 LD (STRSPC),HL ; Set new string space +1382+ 0C8A E1 POP HL ; End of memory to use +1383+ 0C8B 22 5F 31 LD (LSTRAM),HL ; Set new top of RAM +1384+ 0C8E E1 POP HL ; Restore code string address +1385+ 0C8F C3 1F 08 JP INTVAR ; Initialise variables +1386+ 0C92 +1387+ 0C92 CA 1B 08 RUN: JP Z,RUNFST ; RUN from start if just RUN +1388+ 0C95 CD 1F 08 CALL INTVAR ; Initialise variables +1389+ 0C98 01 1B 0B LD BC,RUNCNT ; Execution driver loop +1390+ 0C9B C3 AE 0C JP RUNLIN ; RUN from line number +1391+ 0C9E +1392+ 0C9E 0E 03 GOSUB: LD C,3 ; 3 Levels of stack needed +1393+ 0CA0 CD E0 06 CALL CHKSTK ; Check for 3 levels of stack +1394+ 0CA3 C1 POP BC ; Get return address +1395+ 0CA4 E5 PUSH HL ; Save code string for RETURN +1396+ 0CA5 E5 PUSH HL ; And for GOSUB routine +1397+ 0CA6 2A 0C 31 LD HL,(LINEAT) ; Get current line +1398+ 0CA9 E3 EX (SP),HL ; Into stack - Code string out +1399+ 0CAA 3E 8C LD A,ZGOSUB ; "GOSUB" token +1400+ 0CAC F5 PUSH AF ; Save token +1401+ 0CAD 33 INC SP ; Don't save flags +1402+ 0CAE +1403+ 0CAE C5 RUNLIN: PUSH BC ; Save return address +1404+ 0CAF CD 27 0C GOTO: CALL ATOH ; ASCII number to DE binary +1405+ 0CB2 CD F4 0C CALL REM ; Get end of line +1406+ 0CB5 E5 PUSH HL ; Save end of line +1407+ 0CB6 2A 0C 31 LD HL,(LINEAT) ; Get current line +1408+ 0CB9 CD CB 09 CALL CPDEHL ; Line after current? +1409+ 0CBC E1 POP HL ; Restore end of line +1410+ 0CBD 23 INC HL ; Start of next line +1411+ 0CBE DC F2 07 CALL C,SRCHLP ; Line is after current line +1412+ 0CC1 D4 EF 07 CALL NC,SRCHLN ; Line is before current line +1413+ 0CC4 60 LD H,B ; Set up code string address +1414+ 0CC5 69 LD L,C +1415+ 0CC6 2B DEC HL ; Incremented after +1416+ 0CC7 D8 RET C ; Line found +1417+ 0CC8 1E 0E ULERR: LD E,UL ; ?UL Error +1418+ 0CCA C3 17 07 JP ERROR ; Output error message +1419+ 0CCD +1420+ 0CCD C0 RETURN: RET NZ ; Return if not just RETURN +1421+ 0CCE 16 FF LD D,-1 ; Flag "GOSUB" search +1422+ 0CD0 CD AC 06 CALL BAKSTK ; Look "GOSUB" block +1423+ 0CD3 F9 LD SP,HL ; Kill all FORs in subroutine +1424+ 0CD4 FE 8C CP ZGOSUB ; Test for "GOSUB" token +1425+ 0CD6 1E 04 LD E,RG ; ?RG Error +1426+ 0CD8 C2 17 07 JP NZ,ERROR ; Error if no "GOSUB" found +1427+ 0CDB E1 POP HL ; Get RETURN line number +1428+ 0CDC 22 0C 31 LD (LINEAT),HL ; Save as current +1429+ 0CDF 23 INC HL ; Was it from direct statement? +1430+ 0CE0 7C LD A,H +1431+ 0CE1 B5 OR L ; Return to line +1432+ 0CE2 C2 EC 0C JP NZ,RETLIN ; No - Return to line +1433+ 0CE5 3A 7C 31 LD A,(LSTBIN) ; Any INPUT in subroutine? +1434+ 0CE8 B7 OR A ; If so buffer is corrupted +1435+ 0CE9 C2 4D 07 JP NZ,POPNOK ; Yes - Go to command mode +1436+ 0CEC 21 1B 0B RETLIN: LD HL,RUNCNT ; Execution driver loop +1437+ 0CEF E3 EX (SP),HL ; Into stack - Code string out +1438+ 0CF0 3E .BYTE 3EH ; Skip "POP HL" +1439+ 0CF1 E1 NXTDTA: POP HL ; Restore code string address +1440+ 0CF2 +1441+ 0CF2 01 3A DATA: .BYTE 01H,3AH ; ':' End of statement +1442+ 0CF4 0E 00 REM: LD C,0 ; 00 End of statement +1443+ 0CF6 06 00 LD B,0 +1444+ 0CF8 79 NXTSTL: LD A,C ; Statement and byte +1445+ 0CF9 48 LD C,B +1446+ 0CFA 47 LD B,A ; Statement end byte +1447+ 0CFB 7E NXTSTT: LD A,(HL) ; Get byte +1448+ 0CFC B7 OR A ; End of line? +1449+ 0CFD C8 RET Z ; Yes - Exit +1450+ 0CFE B8 CP B ; End of statement? +1451+ 0CFF C8 RET Z ; Yes - Exit +1452+ 0D00 23 INC HL ; Next byte +1453+ 0D01 FE 22 CP '"' ; Literal string? +1454+ 0D03 CA F8 0C JP Z,NXTSTL ; Yes - Look for another '"' +1455+ 0D06 C3 FB 0C JP NXTSTT ; Keep looking +1456+ 0D09 +1457+ 0D09 CD BE 11 LET: CALL GETVAR ; Get variable name +1458+ 0D0C CD D1 09 CALL CHKSYN ; Make sure "=" follows +1459+ 0D0F B4 .BYTE ZEQUAL ; "=" token +1460+ 0D10 D5 PUSH DE ; Save address of variable +1461+ 0D11 3A 5D 31 LD A,(TYPE) ; Get data type +1462+ 0D14 F5 PUSH AF ; Save type +1463+ 0D15 CD DA 0F CALL EVAL ; Evaluate expression +1464+ 0D18 F1 POP AF ; Restore type +1465+ 0D19 E3 EX (SP),HL ; Save code - Get var addr +1466+ 0D1A 22 7E 31 LD (BRKLIN),HL ; Save address of variable +1467+ 0D1D 1F RRA ; Adjust type +1468+ 0D1E CD CD 0F CALL CHKTYP ; Check types are the same +1469+ 0D21 CA 5C 0D JP Z,LETNUM ; Numeric - Move value +1470+ 0D24 E5 LETSTR: PUSH HL ; Save address of string var +1471+ 0D25 2A 94 31 LD HL,(FPREG) ; Pointer to string entry +1472+ 0D28 E5 PUSH HL ; Save it on stack +1473+ 0D29 23 INC HL ; Skip over length +1474+ 0D2A 23 INC HL +1475+ 0D2B 5E LD E,(HL) ; LSB of string address +1476+ 0D2C 23 INC HL +1477+ 0D2D 56 LD D,(HL) ; MSB of string address +1478+ 0D2E 2A 0E 31 LD HL,(BASTXT) ; Point to start of program +1479+ 0D31 CD CB 09 CALL CPDEHL ; Is string before program? +1480+ 0D34 D2 4B 0D JP NC,CRESTR ; Yes - Create string entry +1481+ 0D37 2A 0A 31 LD HL,(STRSPC) ; Point to string space +1482+ 0D3A CD CB 09 CALL CPDEHL ; Is string literal in program? +1483+ 0D3D D1 POP DE ; Restore address of string +1484+ 0D3E D2 53 0D JP NC,MVSTPT ; Yes - Set up pointer +1485+ 0D41 21 6F 31 LD HL,TMPSTR ; Temporary string pool +1486+ 0D44 CD CB 09 CALL CPDEHL ; Is string in temporary pool? +1487+ 0D47 D2 53 0D JP NC,MVSTPT ; No - Set up pointer +1488+ 0D4A 3E .BYTE 3EH ; Skip "POP DE" +1489+ 0D4B D1 CRESTR: POP DE ; Restore address of string +1490+ 0D4C CD 02 16 CALL BAKTMP ; Back to last tmp-str entry +1491+ 0D4F EB EX DE,HL ; Address of string entry +1492+ 0D50 CD 3B 14 CALL SAVSTR ; Save string in string area +1493+ 0D53 CD 02 16 MVSTPT: CALL BAKTMP ; Back to last tmp-str entry +1494+ 0D56 E1 POP HL ; Get string pointer +1495+ 0D57 CD 05 1A CALL DETHL4 ; Move string pointer to var +1496+ 0D5A E1 POP HL ; Restore code string address +1497+ 0D5B C9 RET +1498+ 0D5C +1499+ 0D5C E5 LETNUM: PUSH HL ; Save address of variable +1500+ 0D5D CD 02 1A CALL FPTHL ; Move value to variable +1501+ 0D60 D1 POP DE ; Restore address of variable +1502+ 0D61 E1 POP HL ; Restore code string address +1503+ 0D62 C9 RET +1504+ 0D63 +1505+ 0D63 CD 29 17 ON: CALL GETINT ; Get integer 0-255 +1506+ 0D66 7E LD A,(HL) ; Get "GOTO" or "GOSUB" token +1507+ 0D67 47 LD B,A ; Save in B +1508+ 0D68 FE 8C CP ZGOSUB ; "GOSUB" token? +1509+ 0D6A CA 72 0D JP Z,ONGO ; Yes - Find line number +1510+ 0D6D CD D1 09 CALL CHKSYN ; Make sure it's "GOTO" +1511+ 0D70 88 .BYTE ZGOTO ; "GOTO" token +1512+ 0D71 2B DEC HL ; Cancel increment +1513+ 0D72 4B ONGO: LD C,E ; Integer of branch value +1514+ 0D73 0D ONGOLP: DEC C ; Count branches +1515+ 0D74 78 LD A,B ; Get "GOTO" or "GOSUB" token +1516+ 0D75 CA 43 0B JP Z,ONJMP ; Go to that line if right one +1517+ 0D78 CD 28 0C CALL GETLN ; Get line number to DE +1518+ 0D7B FE 2C CP ',' ; Another line number? +1519+ 0D7D C0 RET NZ ; No - Drop through +1520+ 0D7E C3 73 0D JP ONGOLP ; Yes - loop +1521+ 0D81 +1522+ 0D81 CD DA 0F IF: CALL EVAL ; Evaluate expression +1523+ 0D84 7E LD A,(HL) ; Get token +1524+ 0D85 FE 88 CP ZGOTO ; "GOTO" token? +1525+ 0D87 CA 8F 0D JP Z,IFGO ; Yes - Get line +1526+ 0D8A CD D1 09 CALL CHKSYN ; Make sure it's "THEN" +1527+ 0D8D A9 .BYTE ZTHEN ; "THEN" token +1528+ 0D8E 2B DEC HL ; Cancel increment +1529+ 0D8F CD CB 0F IFGO: CALL TSTNUM ; Make sure it's numeric +1530+ 0D92 CD AA 19 CALL TSTSGN ; Test state of expression +1531+ 0D95 CA F4 0C JP Z,REM ; False - Drop through +1532+ 0D98 CD 5B 0B CALL GETCHR ; Get next character +1533+ 0D9B DA AF 0C JP C,GOTO ; Number - GOTO that line +1534+ 0D9E C3 42 0B JP IFJMP ; Otherwise do statement +1535+ 0DA1 +1536+ 0DA1 2B MRPRNT: DEC HL ; DEC 'cos GETCHR INCs +1537+ 0DA2 CD 5B 0B CALL GETCHR ; Get next character +1538+ 0DA5 CA 03 0E PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT +1539+ 0DA8 C8 PRNTLP: RET Z ; End of list - Exit +1540+ 0DA9 FE A5 CP ZTAB ; "TAB(" token? +1541+ 0DAB CA 36 0E JP Z,DOTAB ; Yes - Do TAB routine +1542+ 0DAE FE A8 CP ZSPC ; "SPC(" token? +1543+ 0DB0 CA 36 0E JP Z,DOTAB ; Yes - Do SPC routine +1544+ 0DB3 E5 PUSH HL ; Save code string address +1545+ 0DB4 FE 2C CP ',' ; Comma? +1546+ 0DB6 CA 1F 0E JP Z,DOCOM ; Yes - Move to next zone +1547+ 0DB9 FE 3B CP 59 ;";" ; Semi-colon? +1548+ 0DBB CA 59 0E JP Z,NEXITM ; Do semi-colon routine +1549+ 0DBE C1 POP BC ; Code string address to BC +1550+ 0DBF CD DA 0F CALL EVAL ; Evaluate expression +1551+ 0DC2 E5 PUSH HL ; Save code string address +1552+ 0DC3 3A 5D 31 LD A,(TYPE) ; Get variable type +1553+ 0DC6 B7 OR A ; Is it a string variable? +1554+ 0DC7 C2 EF 0D JP NZ,PRNTST ; Yes - Output string contents +1555+ 0DCA CD 4F 1B CALL NUMASC ; Convert number to text +1556+ 0DCD CD 5F 14 CALL CRTST ; Create temporary string +1557+ 0DD0 36 20 LD (HL),' ' ; Followed by a space +1558+ 0DD2 2A 94 31 LD HL,(FPREG) ; Get length of output +1559+ 0DD5 34 INC (HL) ; Plus 1 for the space +1560+ 0DD6 2A 94 31 LD HL,(FPREG) ; < Not needed > +1561+ 0DD9 3A F2 30 LD A,(LWIDTH) ; Get width of line +1562+ 0DDC 47 LD B,A ; To B +1563+ 0DDD 04 INC B ; Width 255 (No limit)? +1564+ 0DDE CA EB 0D JP Z,PRNTNB ; Yes - Output number string +1565+ 0DE1 04 INC B ; Adjust it +1566+ 0DE2 3A 5B 31 LD A,(CURPOS) ; Get cursor position +1567+ 0DE5 86 ADD A,(HL) ; Add length of string +1568+ 0DE6 3D DEC A ; Adjust it +1569+ 0DE7 B8 CP B ; Will output fit on this line? +1570+ 0DE8 D4 03 0E CALL NC,PRNTCRLF ; No - CRLF first +1571+ 0DEB CD A4 14 PRNTNB: CALL PRS1 ; Output string at (HL) +1572+ 0DEE AF XOR A ; Skip CALL by setting 'z' flag +1573+ 0DEF C4 A4 14 PRNTST: CALL NZ,PRS1 ; Output string at (HL) +1574+ 0DF2 E1 POP HL ; Restore code string address +1575+ 0DF3 C3 A1 0D JP MRPRNT ; See if more to PRINT +1576+ 0DF6 +1577+ 0DF6 3A 5B 31 STTLIN: LD A,(CURPOS) ; Make sure on new line +1578+ 0DF9 B7 OR A ; Already at start? +1579+ 0DFA C8 RET Z ; Yes - Do nothing +1580+ 0DFB C3 03 0E JP PRNTCRLF ; Start a new line +1581+ 0DFE +1582+ 0DFE 36 00 ENDINP: LD (HL),0 ; Mark end of buffer +1583+ 0E00 21 10 31 LD HL,BUFFER-1 ; Point to buffer +1584+ 0E03 3E 0D PRNTCRLF: LD A,CR ; Load a CR +1585+ 0E05 CD DC 09 CALL OUTC ; Output character +1586+ 0E08 3E 0A LD A,LF ; Load a LF +1587+ 0E0A CD DC 09 CALL OUTC ; Output character +1588+ 0E0D AF DONULL: XOR A ; Set to position 0 +1589+ 0E0E 32 5B 31 LD (CURPOS),A ; Store it +1590+ 0E11 3A F1 30 LD A,(NULLS) ; Get number of nulls +1591+ 0E14 3D NULLP: DEC A ; Count them +1592+ 0E15 C8 RET Z ; Return if done +1593+ 0E16 F5 PUSH AF ; Save count +1594+ 0E17 AF XOR A ; Load a null +1595+ 0E18 CD DC 09 CALL OUTC ; Output it +1596+ 0E1B F1 POP AF ; Restore count +1597+ 0E1C C3 14 0E JP NULLP ; Keep counting +1598+ 0E1F +1599+ 0E1F 3A F3 30 DOCOM: LD A,(COMMAN) ; Get comma width +1600+ 0E22 47 LD B,A ; Save in B +1601+ 0E23 3A 5B 31 LD A,(CURPOS) ; Get current position +1602+ 0E26 B8 CP B ; Within the limit? +1603+ 0E27 D4 03 0E CALL NC,PRNTCRLF ; No - output CRLF +1604+ 0E2A D2 59 0E JP NC,NEXITM ; Get next item +1605+ 0E2D D6 0E ZONELP: SUB 14 ; Next zone of 14 characters +1606+ 0E2F D2 2D 0E JP NC,ZONELP ; Repeat if more zones +1607+ 0E32 2F CPL ; Number of spaces to output +1608+ 0E33 C3 4E 0E JP ASPCS ; Output them +1609+ 0E36 +1610+ 0E36 F5 DOTAB: PUSH AF ; Save token +1611+ 0E37 CD 26 17 CALL FNDNUM ; Evaluate expression +1612+ 0E3A CD D1 09 CALL CHKSYN ; Make sure ")" follows +1613+ 0E3D 29 .BYTE ")" +1614+ 0E3E 2B DEC HL ; Back space on to ")" +1615+ 0E3F F1 POP AF ; Restore token +1616+ 0E40 D6 A8 SUB ZSPC ; Was it "SPC(" ? +1617+ 0E42 E5 PUSH HL ; Save code string address +1618+ 0E43 CA 49 0E JP Z,DOSPC ; Yes - Do 'E' spaces +1619+ 0E46 3A 5B 31 LD A,(CURPOS) ; Get current position +1620+ 0E49 2F DOSPC: CPL ; Number of spaces to print to +1621+ 0E4A 83 ADD A,E ; Total number to print +1622+ 0E4B D2 59 0E JP NC,NEXITM ; TAB < Current POS(X) +1623+ 0E4E 3C ASPCS: INC A ; Output A spaces +1624+ 0E4F 47 LD B,A ; Save number to print +1625+ 0E50 3E 20 LD A,' ' ; Space +1626+ 0E52 CD DC 09 SPCLP: CALL OUTC ; Output character in A +1627+ 0E55 05 DEC B ; Count them +1628+ 0E56 C2 52 0E JP NZ,SPCLP ; Repeat if more +1629+ 0E59 E1 NEXITM: POP HL ; Restore code string address +1630+ 0E5A CD 5B 0B CALL GETCHR ; Get next character +1631+ 0E5D C3 A8 0D JP PRNTLP ; More to print +1632+ 0E60 +1633+ 0E60 3F 52 65 64 REDO: .BYTE "?Redo from start",CR,LF,0 +1633+ 0E64 6F 20 66 72 +1633+ 0E68 6F 6D 20 73 +1633+ 0E6C 74 61 72 74 +1633+ 0E70 0D 0A 00 +1634+ 0E73 +1635+ 0E73 3A 7D 31 BADINP: LD A,(READFG) ; READ or INPUT? +1636+ 0E76 B7 OR A +1637+ 0E77 C2 FD 06 JP NZ,DATSNR ; READ - ?SN Error +1638+ 0E7A C1 POP BC ; Throw away code string addr +1639+ 0E7B 21 60 0E LD HL,REDO ; "Redo from start" message +1640+ 0E7E CD A1 14 CALL PRS ; Output string +1641+ 0E81 C3 4E 08 JP DOAGN ; Do last INPUT again +1642+ 0E84 +1643+ 0E84 CD 0C 14 INPUT: CALL IDTEST ; Test for illegal direct +1644+ 0E87 7E LD A,(HL) ; Get character after "INPUT" +1645+ 0E88 FE 22 CP '"' ; Is there a prompt string? +1646+ 0E8A 3E 00 LD A,0 ; Clear A and leave flags +1647+ 0E8C 32 F5 30 LD (CTLOFG),A ; Enable output +1648+ 0E8F C2 9E 0E JP NZ,NOPMPT ; No prompt - get input +1649+ 0E92 CD 60 14 CALL QTSTR ; Get string terminated by '"' +1650+ 0E95 CD D1 09 CALL CHKSYN ; Check for ';' after prompt +1651+ 0E98 3B .BYTE ';' +1652+ 0E99 E5 PUSH HL ; Save code string address +1653+ 0E9A CD A4 14 CALL PRS1 ; Output prompt string +1654+ 0E9D 3E .BYTE 3EH ; Skip "PUSH HL" +1655+ 0E9E E5 NOPMPT: PUSH HL ; Save code string address +1656+ 0E9F CD 52 08 CALL PROMPT ; Get input with "? " prompt +1657+ 0EA2 C1 POP BC ; Restore code string address +1658+ 0EA3 DA AA 0B JP C,INPBRK ; Break pressed - Exit +1659+ 0EA6 23 INC HL ; Next byte +1660+ 0EA7 7E LD A,(HL) ; Get it +1661+ 0EA8 B7 OR A ; End of line? +1662+ 0EA9 2B DEC HL ; Back again +1663+ 0EAA C5 PUSH BC ; Re-save code string address +1664+ 0EAB CA F1 0C JP Z,NXTDTA ; Yes - Find next DATA stmt +1665+ 0EAE 36 2C LD (HL),',' ; Store comma as separator +1666+ 0EB0 C3 B8 0E JP NXTITM ; Get next item +1667+ 0EB3 +1668+ 0EB3 E5 READ: PUSH HL ; Save code string address +1669+ 0EB4 2A 8C 31 LD HL,(NXTDAT) ; Next DATA statement +1670+ 0EB7 F6 .BYTE 0F6H ; Flag "READ" +1671+ 0EB8 AF NXTITM: XOR A ; Flag "INPUT" +1672+ 0EB9 32 7D 31 LD (READFG),A ; Save "READ"/"INPUT" flag +1673+ 0EBC E3 EX (SP),HL ; Get code str' , Save pointer +1674+ 0EBD C3 C4 0E JP GTVLUS ; Get values +1675+ 0EC0 +1676+ 0EC0 CD D1 09 NEDMOR: CALL CHKSYN ; Check for comma between items +1677+ 0EC3 2C .BYTE ',' +1678+ 0EC4 CD BE 11 GTVLUS: CALL GETVAR ; Get variable name +1679+ 0EC7 E3 EX (SP),HL ; Save code str" , Get pointer +1680+ 0EC8 D5 PUSH DE ; Save variable address +1681+ 0EC9 7E LD A,(HL) ; Get next "INPUT"/"DATA" byte +1682+ 0ECA FE 2C CP ',' ; Comma? +1683+ 0ECC CA EC 0E JP Z,ANTVLU ; Yes - Get another value +1684+ 0ECF 3A 7D 31 LD A,(READFG) ; Is it READ? +1685+ 0ED2 B7 OR A +1686+ 0ED3 C2 59 0F JP NZ,FDTLP ; Yes - Find next DATA stmt +1687+ 0ED6 3E 3F LD A,'?' ; More INPUT needed +1688+ 0ED8 CD DC 09 CALL OUTC ; Output character +1689+ 0EDB CD 52 08 CALL PROMPT ; Get INPUT with prompt +1690+ 0EDE D1 POP DE ; Variable address +1691+ 0EDF C1 POP BC ; Code string address +1692+ 0EE0 DA AA 0B JP C,INPBRK ; Break pressed +1693+ 0EE3 23 INC HL ; Point to next DATA byte +1694+ 0EE4 7E LD A,(HL) ; Get byte +1695+ 0EE5 B7 OR A ; Is it zero (No input) ? +1696+ 0EE6 2B DEC HL ; Back space INPUT pointer +1697+ 0EE7 C5 PUSH BC ; Save code string address +1698+ 0EE8 CA F1 0C JP Z,NXTDTA ; Find end of buffer +1699+ 0EEB D5 PUSH DE ; Save variable address +1700+ 0EEC 3A 5D 31 ANTVLU: LD A,(TYPE) ; Check data type +1701+ 0EEF B7 OR A ; Is it numeric? +1702+ 0EF0 CA 16 0F JP Z,INPBIN ; Yes - Convert to binary +1703+ 0EF3 CD 5B 0B CALL GETCHR ; Get next character +1704+ 0EF6 57 LD D,A ; Save input character +1705+ 0EF7 47 LD B,A ; Again +1706+ 0EF8 FE 22 CP '"' ; Start of literal sting? +1707+ 0EFA CA 0A 0F JP Z,STRENT ; Yes - Create string entry +1708+ 0EFD 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? +1709+ 0F00 B7 OR A +1710+ 0F01 57 LD D,A ; Save 00 if "INPUT" +1711+ 0F02 CA 07 0F JP Z,ITMSEP ; "INPUT" - End with 00 +1712+ 0F05 16 3A LD D,':' ; "DATA" - End with 00 or ':' +1713+ 0F07 06 2C ITMSEP: LD B,',' ; Item separator +1714+ 0F09 2B DEC HL ; Back space for DTSTR +1715+ 0F0A CD 63 14 STRENT: CALL DTSTR ; Get string terminated by D +1716+ 0F0D EB EX DE,HL ; String address to DE +1717+ 0F0E 21 21 0F LD HL,LTSTND ; Where to go after LETSTR +1718+ 0F11 E3 EX (SP),HL ; Save HL , get input pointer +1719+ 0F12 D5 PUSH DE ; Save address of string +1720+ 0F13 C3 24 0D JP LETSTR ; Assign string to variable +1721+ 0F16 +1722+ 0F16 CD 5B 0B INPBIN: CALL GETCHR ; Get next character +1723+ 0F19 CD B1 1A CALL ASCTFP ; Convert ASCII to FP number +1724+ 0F1C E3 EX (SP),HL ; Save input ptr, Get var addr +1725+ 0F1D CD 02 1A CALL FPTHL ; Move FPREG to variable +1726+ 0F20 E1 POP HL ; Restore input pointer +1727+ 0F21 2B LTSTND: DEC HL ; DEC 'cos GETCHR INCs +1728+ 0F22 CD 5B 0B CALL GETCHR ; Get next character +1729+ 0F25 CA 2D 0F JP Z,MORDT ; End of line - More needed? +1730+ 0F28 FE 2C CP ',' ; Another value? +1731+ 0F2A C2 73 0E JP NZ,BADINP ; No - Bad input +1732+ 0F2D E3 MORDT: EX (SP),HL ; Get code string address +1733+ 0F2E 2B DEC HL ; DEC 'cos GETCHR INCs +1734+ 0F2F CD 5B 0B CALL GETCHR ; Get next character +1735+ 0F32 C2 C0 0E JP NZ,NEDMOR ; More needed - Get it +1736+ 0F35 D1 POP DE ; Restore DATA pointer +1737+ 0F36 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? +1738+ 0F39 B7 OR A +1739+ 0F3A EB EX DE,HL ; DATA pointer to HL +1740+ 0F3B C2 81 0B JP NZ,UPDATA ; Update DATA pointer if "READ" +1741+ 0F3E D5 PUSH DE ; Save code string address +1742+ 0F3F B6 OR (HL) ; More input given? +1743+ 0F40 21 48 0F LD HL,EXTIG ; "?Extra ignored" message +1744+ 0F43 C4 A1 14 CALL NZ,PRS ; Output string if extra given +1745+ 0F46 E1 POP HL ; Restore code string address +1746+ 0F47 C9 RET +1747+ 0F48 +1748+ 0F48 3F 45 78 74 EXTIG: .BYTE "?Extra ignored",CR,LF,0 +1748+ 0F4C 72 61 20 69 +1748+ 0F50 67 6E 6F 72 +1748+ 0F54 65 64 0D 0A +1748+ 0F58 00 +1749+ 0F59 +1750+ 0F59 CD F2 0C FDTLP: CALL DATA ; Get next statement +1751+ 0F5C B7 OR A ; End of line? +1752+ 0F5D C2 72 0F JP NZ,FANDT ; No - See if DATA statement +1753+ 0F60 23 INC HL +1754+ 0F61 7E LD A,(HL) ; End of program? +1755+ 0F62 23 INC HL +1756+ 0F63 B6 OR (HL) ; 00 00 Ends program +1757+ 0F64 1E 06 LD E,OD ; ?OD Error +1758+ 0F66 CA 17 07 JP Z,ERROR ; Yes - Out of DATA +1759+ 0F69 23 INC HL +1760+ 0F6A 5E LD E,(HL) ; LSB of line number +1761+ 0F6B 23 INC HL +1762+ 0F6C 56 LD D,(HL) ; MSB of line number +1763+ 0F6D EB EX DE,HL +1764+ 0F6E 22 79 31 LD (DATLIN),HL ; Set line of current DATA item +1765+ 0F71 EB EX DE,HL +1766+ 0F72 CD 5B 0B FANDT: CALL GETCHR ; Get next character +1767+ 0F75 FE 83 CP ZDATA ; "DATA" token +1768+ 0F77 C2 59 0F JP NZ,FDTLP ; No "DATA" - Keep looking +1769+ 0F7A C3 EC 0E JP ANTVLU ; Found - Convert input +1770+ 0F7D +1771+ 0F7D 11 00 00 NEXT: LD DE,0 ; In case no index given +1772+ 0F80 C4 BE 11 NEXT1: CALL NZ,GETVAR ; Get index address +1773+ 0F83 22 7E 31 LD (BRKLIN),HL ; Save code string address +1774+ 0F86 CD AC 06 CALL BAKSTK ; Look for "FOR" block +1775+ 0F89 C2 09 07 JP NZ,NFERR ; No "FOR" - ?NF Error +1776+ 0F8C F9 LD SP,HL ; Clear nested loops +1777+ 0F8D D5 PUSH DE ; Save index address +1778+ 0F8E 7E LD A,(HL) ; Get sign of STEP +1779+ 0F8F 23 INC HL +1780+ 0F90 F5 PUSH AF ; Save sign of STEP +1781+ 0F91 D5 PUSH DE ; Save index address +1782+ 0F92 CD E8 19 CALL PHLTFP ; Move index value to FPREG +1783+ 0F95 E3 EX (SP),HL ; Save address of TO value +1784+ 0F96 E5 PUSH HL ; Save address of index +1785+ 0F97 CD 55 17 CALL ADDPHL ; Add STEP to index value +1786+ 0F9A E1 POP HL ; Restore address of index +1787+ 0F9B CD 02 1A CALL FPTHL ; Move value to index variable +1788+ 0F9E E1 POP HL ; Restore address of TO value +1789+ 0F9F CD F9 19 CALL LOADFP ; Move TO value to BCDE +1790+ 0FA2 E5 PUSH HL ; Save address of line of FOR +1791+ 0FA3 CD 25 1A CALL CMPNUM ; Compare index with TO value +1792+ 0FA6 E1 POP HL ; Restore address of line num +1793+ 0FA7 C1 POP BC ; Address of sign of STEP +1794+ 0FA8 90 SUB B ; Compare with expected sign +1795+ 0FA9 CD F9 19 CALL LOADFP ; BC = Loop stmt,DE = Line num +1796+ 0FAC CA B8 0F JP Z,KILFOR ; Loop finished - Terminate it +1797+ 0FAF EB EX DE,HL ; Loop statement line number +1798+ 0FB0 22 0C 31 LD (LINEAT),HL ; Set loop line number +1799+ 0FB3 69 LD L,C ; Set code string to loop +1800+ 0FB4 60 LD H,B +1801+ 0FB5 C3 17 0B JP PUTFID ; Put back "FOR" and continue +1802+ 0FB8 +1803+ 0FB8 F9 KILFOR: LD SP,HL ; Remove "FOR" block +1804+ 0FB9 2A 7E 31 LD HL,(BRKLIN) ; Code string after "NEXT" +1805+ 0FBC 7E LD A,(HL) ; Get next byte in code string +1806+ 0FBD FE 2C CP ',' ; More NEXTs ? +1807+ 0FBF C2 1B 0B JP NZ,RUNCNT ; No - Do next statement +1808+ 0FC2 CD 5B 0B CALL GETCHR ; Position to index name +1809+ 0FC5 CD 80 0F CALL NEXT1 ; Re-enter NEXT routine +1810+ 0FC8 ; < will not RETurn to here , Exit to RUNCNT or Loop > +1811+ 0FC8 +1812+ 0FC8 CD DA 0F GETNUM: CALL EVAL ; Get a numeric expression +1813+ 0FCB F6 TSTNUM: .BYTE 0F6H ; Clear carry (numeric) +1814+ 0FCC 37 TSTSTR: SCF ; Set carry (string) +1815+ 0FCD 3A 5D 31 CHKTYP: LD A,(TYPE) ; Check types match +1816+ 0FD0 8F ADC A,A ; Expected + actual +1817+ 0FD1 B7 OR A ; Clear carry , set parity +1818+ 0FD2 E8 RET PE ; Even parity - Types match +1819+ 0FD3 C3 15 07 JP TMERR ; Different types - Error +1820+ 0FD6 +1821+ 0FD6 CD D1 09 OPNPAR: CALL CHKSYN ; Make sure "(" follows +1822+ 0FD9 28 .BYTE "(" +1823+ 0FDA 2B EVAL: DEC HL ; Evaluate expression & save +1824+ 0FDB 16 00 LD D,0 ; Precedence value +1825+ 0FDD D5 EVAL1: PUSH DE ; Save precedence +1826+ 0FDE 0E 01 LD C,1 +1827+ 0FE0 CD E0 06 CALL CHKSTK ; Check for 1 level of stack +1828+ 0FE3 CD 51 10 CALL OPRND ; Get next expression value +1829+ 0FE6 22 80 31 EVAL2: LD (NXTOPR),HL ; Save address of next operator +1830+ 0FE9 2A 80 31 EVAL3: LD HL,(NXTOPR) ; Restore address of next opr +1831+ 0FEC C1 POP BC ; Precedence value and operator +1832+ 0FED 78 LD A,B ; Get precedence value +1833+ 0FEE FE 78 CP 78H ; "AND" or "OR" ? +1834+ 0FF0 D4 CB 0F CALL NC,TSTNUM ; No - Make sure it's a number +1835+ 0FF3 7E LD A,(HL) ; Get next operator / function +1836+ 0FF4 16 00 LD D,0 ; Clear Last relation +1837+ 0FF6 D6 B3 RLTLP: SUB ZGTR ; ">" Token +1838+ 0FF8 DA 12 10 JP C,FOPRND ; + - * / ^ AND OR - Test it +1839+ 0FFB FE 03 CP ZLTH+1-ZGTR ; < = > +1840+ 0FFD D2 12 10 JP NC,FOPRND ; Function - Call it +1841+ 1000 FE 01 CP ZEQUAL-ZGTR ; "=" +1842+ 1002 17 RLA ; <- Test for legal +1843+ 1003 AA XOR D ; <- combinations of < = > +1844+ 1004 BA CP D ; <- by combining last token +1845+ 1005 57 LD D,A ; <- with current one +1846+ 1006 DA 03 07 JP C,SNERR ; Error if "<<' '==" or ">>" +1847+ 1009 22 75 31 LD (CUROPR),HL ; Save address of current token +1848+ 100C CD 5B 0B CALL GETCHR ; Get next character +1849+ 100F C3 F6 0F JP RLTLP ; Treat the two as one +1850+ 1012 +1851+ 1012 7A FOPRND: LD A,D ; < = > found ? +1852+ 1013 B7 OR A +1853+ 1014 C2 39 11 JP NZ,TSTRED ; Yes - Test for reduction +1854+ 1017 7E LD A,(HL) ; Get operator token +1855+ 1018 22 75 31 LD (CUROPR),HL ; Save operator address +1856+ 101B D6 AC SUB ZPLUS ; Operator or function? +1857+ 101D D8 RET C ; Neither - Exit +1858+ 101E FE 07 CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ? +1859+ 1020 D0 RET NC ; No - Exit +1860+ 1021 5F LD E,A ; Coded operator +1861+ 1022 3A 5D 31 LD A,(TYPE) ; Get data type +1862+ 1025 3D DEC A ; FF = numeric , 00 = string +1863+ 1026 B3 OR E ; Combine with coded operator +1864+ 1027 7B LD A,E ; Get coded operator +1865+ 1028 CA 97 15 JP Z,CONCAT ; String concatenation +1866+ 102B 07 RLCA ; Times 2 +1867+ 102C 83 ADD A,E ; Times 3 +1868+ 102D 5F LD E,A ; To DE (D is 0) +1869+ 102E 21 F5 05 LD HL,PRITAB ; Precedence table +1870+ 1031 19 ADD HL,DE ; To the operator concerned +1871+ 1032 78 LD A,B ; Last operator precedence +1872+ 1033 56 LD D,(HL) ; Get evaluation precedence +1873+ 1034 BA CP D ; Compare with eval precedence +1874+ 1035 D0 RET NC ; Exit if higher precedence +1875+ 1036 23 INC HL ; Point to routine address +1876+ 1037 CD CB 0F CALL TSTNUM ; Make sure it's a number +1877+ 103A +1878+ 103A C5 STKTHS: PUSH BC ; Save last precedence & token +1879+ 103B 01 E9 0F LD BC,EVAL3 ; Where to go on prec' break +1880+ 103E C5 PUSH BC ; Save on stack for return +1881+ 103F 43 LD B,E ; Save operator +1882+ 1040 4A LD C,D ; Save precedence +1883+ 1041 CD DB 19 CALL STAKFP ; Move value to stack +1884+ 1044 58 LD E,B ; Restore operator +1885+ 1045 51 LD D,C ; Restore precedence +1886+ 1046 4E LD C,(HL) ; Get LSB of routine address +1887+ 1047 23 INC HL +1888+ 1048 46 LD B,(HL) ; Get MSB of routine address +1889+ 1049 23 INC HL +1890+ 104A C5 PUSH BC ; Save routine address +1891+ 104B 2A 75 31 LD HL,(CUROPR) ; Address of current operator +1892+ 104E C3 DD 0F JP EVAL1 ; Loop until prec' break +1893+ 1051 +1894+ 1051 AF OPRND: XOR A ; Get operand routine +1895+ 1052 32 5D 31 LD (TYPE),A ; Set numeric expected +1896+ 1055 CD 5B 0B CALL GETCHR ; Get next character +1897+ 1058 1E 24 LD E,MO ; ?MO Error +1898+ 105A CA 17 07 JP Z,ERROR ; No operand - Error +1899+ 105D DA B1 1A JP C,ASCTFP ; Number - Get value +1900+ 1060 CD F9 0B CALL CHKLTR ; See if a letter +1901+ 1063 D2 B8 10 JP NC,CONVAR ; Letter - Find variable +1902+ 1066 FE 26 CP '&' ; &H = HEX, &B = BINARY +1903+ 1068 20 12 JR NZ, NOTAMP +1904+ 106A CD 5B 0B CALL GETCHR ; Get next character +1905+ 106D FE 48 CP 'H' ; Hex number indicated? [function added] +1906+ 106F CA F5 1E JP Z,HEXTFP ; Convert Hex to FPREG +1907+ 1072 FE 42 CP 'B' ; Binary number indicated? [function added] +1908+ 1074 CA 65 1F JP Z,BINTFP ; Convert Bin to FPREG +1909+ 1077 1E 02 LD E,SN ; If neither then a ?SN Error +1910+ 1079 CA 17 07 JP Z,ERROR ; +1911+ 107C FE AC NOTAMP: CP ZPLUS ; '+' Token ? +1912+ 107E CA 51 10 JP Z,OPRND ; Yes - Look for operand +1913+ 1081 FE 2E CP '.' ; '.' ? +1914+ 1083 CA B1 1A JP Z,ASCTFP ; Yes - Create FP number +1915+ 1086 FE AD CP ZMINUS ; '-' Token ? +1916+ 1088 CA A7 10 JP Z,MINUS ; Yes - Do minus +1917+ 108B FE 22 CP '"' ; Literal string ? +1918+ 108D CA 60 14 JP Z,QTSTR ; Get string terminated by '"' +1919+ 1090 FE AA CP ZNOT ; "NOT" Token ? +1920+ 1092 CA 99 11 JP Z,EVNOT ; Yes - Eval NOT expression +1921+ 1095 FE A7 CP ZFN ; "FN" Token ? +1922+ 1097 CA C4 13 JP Z,DOFN ; Yes - Do FN routine +1923+ 109A D6 B6 SUB ZSGN ; Is it a function? +1924+ 109C D2 C9 10 JP NC,FNOFST ; Yes - Evaluate function +1925+ 109F CD D6 0F EVLPAR: CALL OPNPAR ; Evaluate expression in "()" +1926+ 10A2 CD D1 09 CALL CHKSYN ; Make sure ")" follows +1927+ 10A5 29 .BYTE ")" +1928+ 10A6 C9 RET +1929+ 10A7 +1930+ 10A7 16 7D MINUS: LD D,7DH ; '-' precedence +1931+ 10A9 CD DD 0F CALL EVAL1 ; Evaluate until prec' break +1932+ 10AC 2A 80 31 LD HL,(NXTOPR) ; Get next operator address +1933+ 10AF E5 PUSH HL ; Save next operator address +1934+ 10B0 CD D3 19 CALL INVSGN ; Negate value +1935+ 10B3 CD CB 0F RETNUM: CALL TSTNUM ; Make sure it's a number +1936+ 10B6 E1 POP HL ; Restore next operator address +1937+ 10B7 C9 RET +1938+ 10B8 +1939+ 10B8 CD BE 11 CONVAR: CALL GETVAR ; Get variable address to DE +1940+ 10BB E5 FRMEVL: PUSH HL ; Save code string address +1941+ 10BC EB EX DE,HL ; Variable address to HL +1942+ 10BD 22 94 31 LD (FPREG),HL ; Save address of variable +1943+ 10C0 3A 5D 31 LD A,(TYPE) ; Get type +1944+ 10C3 B7 OR A ; Numeric? +1945+ 10C4 CC E8 19 CALL Z,PHLTFP ; Yes - Move contents to FPREG +1946+ 10C7 E1 POP HL ; Restore code string address +1947+ 10C8 C9 RET +1948+ 10C9 +1949+ 10C9 06 00 FNOFST: LD B,0 ; Get address of function +1950+ 10CB 07 RLCA ; Double function offset +1951+ 10CC 4F LD C,A ; BC = Offset in function table +1952+ 10CD C5 PUSH BC ; Save adjusted token value +1953+ 10CE CD 5B 0B CALL GETCHR ; Get next character +1954+ 10D1 79 LD A,C ; Get adjusted token value +1955+ 10D2 FE 31 CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? +1956+ 10D4 DA F0 10 JP C,FNVAL ; No - Do function +1957+ 10D7 CD D6 0F CALL OPNPAR ; Evaluate expression (X,... +1958+ 10DA CD D1 09 CALL CHKSYN ; Make sure ',' follows +1959+ 10DD 2C .BYTE ',' +1960+ 10DE CD CC 0F CALL TSTSTR ; Make sure it's a string +1961+ 10E1 EB EX DE,HL ; Save code string address +1962+ 10E2 2A 94 31 LD HL,(FPREG) ; Get address of string +1963+ 10E5 E3 EX (SP),HL ; Save address of string +1964+ 10E6 E5 PUSH HL ; Save adjusted token value +1965+ 10E7 EB EX DE,HL ; Restore code string address +1966+ 10E8 CD 29 17 CALL GETINT ; Get integer 0-255 +1967+ 10EB EB EX DE,HL ; Save code string address +1968+ 10EC E3 EX (SP),HL ; Save integer,HL = adj' token +1969+ 10ED C3 F8 10 JP GOFUNC ; Jump to string function +1970+ 10F0 +1971+ 10F0 CD 9F 10 FNVAL: CALL EVLPAR ; Evaluate expression +1972+ 10F3 E3 EX (SP),HL ; HL = Adjusted token value +1973+ 10F4 11 B3 10 LD DE,RETNUM ; Return number from function +1974+ 10F7 D5 PUSH DE ; Save on stack +1975+ 10F8 01 54 04 GOFUNC: LD BC,FNCTAB ; Function routine addresses +1976+ 10FB 09 ADD HL,BC ; Point to right address +1977+ 10FC 4E LD C,(HL) ; Get LSB of address +1978+ 10FD 23 INC HL ; +1979+ 10FE 66 LD H,(HL) ; Get MSB of address +1980+ 10FF 69 LD L,C ; Address to HL +1981+ 1100 E9 JP (HL) ; Jump to function +1982+ 1101 +1983+ 1101 15 SGNEXP: DEC D ; Dee to flag negative exponent +1984+ 1102 FE AD CP ZMINUS ; '-' token ? +1985+ 1104 C8 RET Z ; Yes - Return +1986+ 1105 FE 2D CP '-' ; '-' ASCII ? +1987+ 1107 C8 RET Z ; Yes - Return +1988+ 1108 14 INC D ; Inc to flag positive exponent +1989+ 1109 FE 2B CP '+' ; '+' ASCII ? +1990+ 110B C8 RET Z ; Yes - Return +1991+ 110C FE AC CP ZPLUS ; '+' token ? +1992+ 110E C8 RET Z ; Yes - Return +1993+ 110F 2B DEC HL ; DEC 'cos GETCHR INCs +1994+ 1110 C9 RET ; Return "NZ" +1995+ 1111 +1996+ 1111 F6 POR: .BYTE 0F6H ; Flag "OR" +1997+ 1112 AF PAND: XOR A ; Flag "AND" +1998+ 1113 F5 PUSH AF ; Save "AND" / "OR" flag +1999+ 1114 CD CB 0F CALL TSTNUM ; Make sure it's a number +2000+ 1117 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 +2001+ 111A F1 POP AF ; Restore "AND" / "OR" flag +2002+ 111B EB EX DE,HL ; <- Get last +2003+ 111C C1 POP BC ; <- value +2004+ 111D E3 EX (SP),HL ; <- from +2005+ 111E EB EX DE,HL ; <- stack +2006+ 111F CD EB 19 CALL FPBCDE ; Move last value to FPREG +2007+ 1122 F5 PUSH AF ; Save "AND" / "OR" flag +2008+ 1123 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 +2009+ 1126 F1 POP AF ; Restore "AND" / "OR" flag +2010+ 1127 C1 POP BC ; Get value +2011+ 1128 79 LD A,C ; Get LSB +2012+ 1129 21 82 13 LD HL,ACPASS ; Address of save AC as current +2013+ 112C C2 34 11 JP NZ,POR1 ; Jump if OR +2014+ 112F A3 AND E ; "AND" LSBs +2015+ 1130 4F LD C,A ; Save LSB +2016+ 1131 78 LD A,B ; Get MBS +2017+ 1132 A2 AND D ; "AND" MSBs +2018+ 1133 E9 JP (HL) ; Save AC as current (ACPASS) +2019+ 1134 +2020+ 1134 B3 POR1: OR E ; "OR" LSBs +2021+ 1135 4F LD C,A ; Save LSB +2022+ 1136 78 LD A,B ; Get MSB +2023+ 1137 B2 OR D ; "OR" MSBs +2024+ 1138 E9 JP (HL) ; Save AC as current (ACPASS) +2025+ 1139 +2026+ 1139 21 4B 11 TSTRED: LD HL,CMPLOG ; Logical compare routine +2027+ 113C 3A 5D 31 LD A,(TYPE) ; Get data type +2028+ 113F 1F RRA ; Carry set = string +2029+ 1140 7A LD A,D ; Get last precedence value +2030+ 1141 17 RLA ; Times 2 plus carry +2031+ 1142 5F LD E,A ; To E +2032+ 1143 16 64 LD D,64H ; Relational precedence +2033+ 1145 78 LD A,B ; Get current precedence +2034+ 1146 BA CP D ; Compare with last +2035+ 1147 D0 RET NC ; Eval if last was rel' or log' +2036+ 1148 C3 3A 10 JP STKTHS ; Stack this one and get next +2037+ 114B +2038+ 114B 4D 11 CMPLOG: .WORD CMPLG1 ; Compare two values / strings +2039+ 114D 79 CMPLG1: LD A,C ; Get data type +2040+ 114E B7 OR A +2041+ 114F 1F RRA +2042+ 1150 C1 POP BC ; Get last expression to BCDE +2043+ 1151 D1 POP DE +2044+ 1152 F5 PUSH AF ; Save status +2045+ 1153 CD CD 0F CALL CHKTYP ; Check that types match +2046+ 1156 21 8F 11 LD HL,CMPRES ; Result to comparison +2047+ 1159 E5 PUSH HL ; Save for RETurn +2048+ 115A CA 25 1A JP Z,CMPNUM ; Compare values if numeric +2049+ 115D AF XOR A ; Compare two strings +2050+ 115E 32 5D 31 LD (TYPE),A ; Set type to numeric +2051+ 1161 D5 PUSH DE ; Save string name +2052+ 1162 CD E4 15 CALL GSTRCU ; Get current string +2053+ 1165 7E LD A,(HL) ; Get length of string +2054+ 1166 23 INC HL +2055+ 1167 23 INC HL +2056+ 1168 4E LD C,(HL) ; Get LSB of address +2057+ 1169 23 INC HL +2058+ 116A 46 LD B,(HL) ; Get MSB of address +2059+ 116B D1 POP DE ; Restore string name +2060+ 116C C5 PUSH BC ; Save address of string +2061+ 116D F5 PUSH AF ; Save length of string +2062+ 116E CD E8 15 CALL GSTRDE ; Get second string +2063+ 1171 CD F9 19 CALL LOADFP ; Get address of second string +2064+ 1174 F1 POP AF ; Restore length of string 1 +2065+ 1175 57 LD D,A ; Length to D +2066+ 1176 E1 POP HL ; Restore address of string 1 +2067+ 1177 7B CMPSTR: LD A,E ; Bytes of string 2 to do +2068+ 1178 B2 OR D ; Bytes of string 1 to do +2069+ 1179 C8 RET Z ; Exit if all bytes compared +2070+ 117A 7A LD A,D ; Get bytes of string 1 to do +2071+ 117B D6 01 SUB 1 +2072+ 117D D8 RET C ; Exit if end of string 1 +2073+ 117E AF XOR A +2074+ 117F BB CP E ; Bytes of string 2 to do +2075+ 1180 3C INC A +2076+ 1181 D0 RET NC ; Exit if end of string 2 +2077+ 1182 15 DEC D ; Count bytes in string 1 +2078+ 1183 1D DEC E ; Count bytes in string 2 +2079+ 1184 0A LD A,(BC) ; Byte in string 2 +2080+ 1185 BE CP (HL) ; Compare to byte in string 1 +2081+ 1186 23 INC HL ; Move up string 1 +2082+ 1187 03 INC BC ; Move up string 2 +2083+ 1188 CA 77 11 JP Z,CMPSTR ; Same - Try next bytes +2084+ 118B 3F CCF ; Flag difference (">" or "<") +2085+ 118C C3 B5 19 JP FLGDIF ; "<" gives -1 , ">" gives +1 +2086+ 118F +2087+ 118F 3C CMPRES: INC A ; Increment current value +2088+ 1190 8F ADC A,A ; Double plus carry +2089+ 1191 C1 POP BC ; Get other value +2090+ 1192 A0 AND B ; Combine them +2091+ 1193 C6 FF ADD A,-1 ; Carry set if different +2092+ 1195 9F SBC A,A ; 00 - Equal , FF - Different +2093+ 1196 C3 BC 19 JP FLGREL ; Set current value & continue +2094+ 1199 +2095+ 1199 16 5A EVNOT: LD D,5AH ; Precedence value for "NOT" +2096+ 119B CD DD 0F CALL EVAL1 ; Eval until precedence break +2097+ 119E CD CB 0F CALL TSTNUM ; Make sure it's a number +2098+ 11A1 CD 0D 0C CALL DEINT ; Get integer -32768 - 32767 +2099+ 11A4 7B LD A,E ; Get LSB +2100+ 11A5 2F CPL ; Invert LSB +2101+ 11A6 4F LD C,A ; Save "NOT" of LSB +2102+ 11A7 7A LD A,D ; Get MSB +2103+ 11A8 2F CPL ; Invert MSB +2104+ 11A9 CD 82 13 CALL ACPASS ; Save AC as current +2105+ 11AC C1 POP BC ; Clean up stack +2106+ 11AD C3 E9 0F JP EVAL3 ; Continue evaluation +2107+ 11B0 +2108+ 11B0 2B DIMRET: DEC HL ; DEC 'cos GETCHR INCs +2109+ 11B1 CD 5B 0B CALL GETCHR ; Get next character +2110+ 11B4 C8 RET Z ; End of DIM statement +2111+ 11B5 CD D1 09 CALL CHKSYN ; Make sure ',' follows +2112+ 11B8 2C .BYTE ',' +2113+ 11B9 01 B0 11 DIM: LD BC,DIMRET ; Return to "DIMRET" +2114+ 11BC C5 PUSH BC ; Save on stack +2115+ 11BD F6 .BYTE 0F6H ; Flag "Create" variable +2116+ 11BE AF GETVAR: XOR A ; Find variable address,to DE +2117+ 11BF 32 5C 31 LD (LCRFLG),A ; Set locate / create flag +2118+ 11C2 46 LD B,(HL) ; Get First byte of name +2119+ 11C3 CD F9 0B GTFNAM: CALL CHKLTR ; See if a letter +2120+ 11C6 DA 03 07 JP C,SNERR ; ?SN Error if not a letter +2121+ 11C9 AF XOR A +2122+ 11CA 4F LD C,A ; Clear second byte of name +2123+ 11CB 32 5D 31 LD (TYPE),A ; Set type to numeric +2124+ 11CE CD 5B 0B CALL GETCHR ; Get next character +2125+ 11D1 DA DA 11 JP C,SVNAM2 ; Numeric - Save in name +2126+ 11D4 CD F9 0B CALL CHKLTR ; See if a letter +2127+ 11D7 DA E7 11 JP C,CHARTY ; Not a letter - Check type +2128+ 11DA 4F SVNAM2: LD C,A ; Save second byte of name +2129+ 11DB CD 5B 0B ENDNAM: CALL GETCHR ; Get next character +2130+ 11DE DA DB 11 JP C,ENDNAM ; Numeric - Get another +2131+ 11E1 CD F9 0B CALL CHKLTR ; See if a letter +2132+ 11E4 D2 DB 11 JP NC,ENDNAM ; Letter - Get another +2133+ 11E7 D6 24 CHARTY: SUB '$' ; String variable? +2134+ 11E9 C2 F6 11 JP NZ,NOTSTR ; No - Numeric variable +2135+ 11EC 3C INC A ; A = 1 (string type) +2136+ 11ED 32 5D 31 LD (TYPE),A ; Set type to string +2137+ 11F0 0F RRCA ; A = 80H , Flag for string +2138+ 11F1 81 ADD A,C ; 2nd byte of name has bit 7 on +2139+ 11F2 4F LD C,A ; Resave second byte on name +2140+ 11F3 CD 5B 0B CALL GETCHR ; Get next character +2141+ 11F6 3A 7B 31 NOTSTR: LD A,(FORFLG) ; Array name needed ? +2142+ 11F9 3D DEC A +2143+ 11FA CA A3 12 JP Z,ARLDSV ; Yes - Get array name +2144+ 11FD F2 06 12 JP P,NSCFOR ; No array with "FOR" or "FN" +2145+ 1200 7E LD A,(HL) ; Get byte again +2146+ 1201 D6 28 SUB '(' ; Subscripted variable? +2147+ 1203 CA 7B 12 JP Z,SBSCPT ; Yes - Sort out subscript +2148+ 1206 +2149+ 1206 AF NSCFOR: XOR A ; Simple variable +2150+ 1207 32 7B 31 LD (FORFLG),A ; Clear "FOR" flag +2151+ 120A E5 PUSH HL ; Save code string address +2152+ 120B 50 LD D,B ; DE = Variable name to find +2153+ 120C 59 LD E,C +2154+ 120D 2A 8E 31 LD HL,(FNRGNM) ; FN argument name +2155+ 1210 CD CB 09 CALL CPDEHL ; Is it the FN argument? +2156+ 1213 11 90 31 LD DE,FNARG ; Point to argument value +2157+ 1216 CA EB 18 JP Z,POPHRT ; Yes - Return FN argument value +2158+ 1219 2A 88 31 LD HL,(VAREND) ; End of variables +2159+ 121C EB EX DE,HL ; Address of end of search +2160+ 121D 2A 86 31 LD HL,(PROGND) ; Start of variables address +2161+ 1220 CD CB 09 FNDVAR: CALL CPDEHL ; End of variable list table? +2162+ 1223 CA 39 12 JP Z,CFEVAL ; Yes - Called from EVAL? +2163+ 1226 79 LD A,C ; Get second byte of name +2164+ 1227 96 SUB (HL) ; Compare with name in list +2165+ 1228 23 INC HL ; Move on to first byte +2166+ 1229 C2 2E 12 JP NZ,FNTHR ; Different - Find another +2167+ 122C 78 LD A,B ; Get first byte of name +2168+ 122D 96 SUB (HL) ; Compare with name in list +2169+ 122E 23 FNTHR: INC HL ; Move on to LSB of value +2170+ 122F CA 6D 12 JP Z,RETADR ; Found - Return address +2171+ 1232 23 INC HL ; <- Skip +2172+ 1233 23 INC HL ; <- over +2173+ 1234 23 INC HL ; <- F.P. +2174+ 1235 23 INC HL ; <- value +2175+ 1236 C3 20 12 JP FNDVAR ; Keep looking +2176+ 1239 +2177+ 1239 E1 CFEVAL: POP HL ; Restore code string address +2178+ 123A E3 EX (SP),HL ; Get return address +2179+ 123B D5 PUSH DE ; Save address of variable +2180+ 123C 11 BB 10 LD DE,FRMEVL ; Return address in EVAL +2181+ 123F CD CB 09 CALL CPDEHL ; Called from EVAL ? +2182+ 1242 D1 POP DE ; Restore address of variable +2183+ 1243 CA 70 12 JP Z,RETNUL ; Yes - Return null variable +2184+ 1246 E3 EX (SP),HL ; Put back return +2185+ 1247 E5 PUSH HL ; Save code string address +2186+ 1248 C5 PUSH BC ; Save variable name +2187+ 1249 01 06 00 LD BC,6 ; 2 byte name plus 4 byte data +2188+ 124C 2A 8A 31 LD HL,(ARREND) ; End of arrays +2189+ 124F E5 PUSH HL ; Save end of arrays +2190+ 1250 09 ADD HL,BC ; Move up 6 bytes +2191+ 1251 C1 POP BC ; Source address in BC +2192+ 1252 E5 PUSH HL ; Save new end address +2193+ 1253 CD CF 06 CALL MOVUP ; Move arrays up +2194+ 1256 E1 POP HL ; Restore new end address +2195+ 1257 22 8A 31 LD (ARREND),HL ; Set new end address +2196+ 125A 60 LD H,B ; End of variables to HL +2197+ 125B 69 LD L,C +2198+ 125C 22 88 31 LD (VAREND),HL ; Set new end address +2199+ 125F +2200+ 125F 2B ZEROLP: DEC HL ; Back through to zero variable +2201+ 1260 36 00 LD (HL),0 ; Zero byte in variable +2202+ 1262 CD CB 09 CALL CPDEHL ; Done them all? +2203+ 1265 C2 5F 12 JP NZ,ZEROLP ; No - Keep on going +2204+ 1268 D1 POP DE ; Get variable name +2205+ 1269 73 LD (HL),E ; Store second character +2206+ 126A 23 INC HL +2207+ 126B 72 LD (HL),D ; Store first character +2208+ 126C 23 INC HL +2209+ 126D EB RETADR: EX DE,HL ; Address of variable in DE +2210+ 126E E1 POP HL ; Restore code string address +2211+ 126F C9 RET +2212+ 1270 +2213+ 1270 32 97 31 RETNUL: LD (FPEXP),A ; Set result to zero +2214+ 1273 21 9F 06 LD HL,ZERBYT ; Also set a null string +2215+ 1276 22 94 31 LD (FPREG),HL ; Save for EVAL +2216+ 1279 E1 POP HL ; Restore code string address +2217+ 127A C9 RET +2218+ 127B +2219+ 127B E5 SBSCPT: PUSH HL ; Save code string address +2220+ 127C 2A 5C 31 LD HL,(LCRFLG) ; Locate/Create and Type +2221+ 127F E3 EX (SP),HL ; Save and get code string +2222+ 1280 57 LD D,A ; Zero number of dimensions +2223+ 1281 D5 SCPTLP: PUSH DE ; Save number of dimensions +2224+ 1282 C5 PUSH BC ; Save array name +2225+ 1283 CD 01 0C CALL FPSINT ; Get subscript (0-32767) +2226+ 1286 C1 POP BC ; Restore array name +2227+ 1287 F1 POP AF ; Get number of dimensions +2228+ 1288 EB EX DE,HL +2229+ 1289 E3 EX (SP),HL ; Save subscript value +2230+ 128A E5 PUSH HL ; Save LCRFLG and TYPE +2231+ 128B EB EX DE,HL +2232+ 128C 3C INC A ; Count dimensions +2233+ 128D 57 LD D,A ; Save in D +2234+ 128E 7E LD A,(HL) ; Get next byte in code string +2235+ 128F FE 2C CP ',' ; Comma (more to come)? +2236+ 1291 CA 81 12 JP Z,SCPTLP ; Yes - More subscripts +2237+ 1294 CD D1 09 CALL CHKSYN ; Make sure ")" follows +2238+ 1297 29 .BYTE ")" +2239+ 1298 22 80 31 LD (NXTOPR),HL ; Save code string address +2240+ 129B E1 POP HL ; Get LCRFLG and TYPE +2241+ 129C 22 5C 31 LD (LCRFLG),HL ; Restore Locate/create & type +2242+ 129F 1E 00 LD E,0 ; Flag not CSAVE* or CLOAD* +2243+ 12A1 D5 PUSH DE ; Save number of dimensions (D) +2244+ 12A2 11 .BYTE 11H ; Skip "PUSH HL" and "PUSH AF' +2245+ 12A3 +2246+ 12A3 E5 ARLDSV: PUSH HL ; Save code string address +2247+ 12A4 F5 PUSH AF ; A = 00 , Flags set = Z,N +2248+ 12A5 2A 88 31 LD HL,(VAREND) ; Start of arrays +2249+ 12A8 3E .BYTE 3EH ; Skip "ADD HL,DE" +2250+ 12A9 19 FNDARY: ADD HL,DE ; Move to next array start +2251+ 12AA EB EX DE,HL +2252+ 12AB 2A 8A 31 LD HL,(ARREND) ; End of arrays +2253+ 12AE EB EX DE,HL ; Current array pointer +2254+ 12AF CD CB 09 CALL CPDEHL ; End of arrays found? +2255+ 12B2 CA DB 12 JP Z,CREARY ; Yes - Create array +2256+ 12B5 7E LD A,(HL) ; Get second byte of name +2257+ 12B6 B9 CP C ; Compare with name given +2258+ 12B7 23 INC HL ; Move on +2259+ 12B8 C2 BD 12 JP NZ,NXTARY ; Different - Find next array +2260+ 12BB 7E LD A,(HL) ; Get first byte of name +2261+ 12BC B8 CP B ; Compare with name given +2262+ 12BD 23 NXTARY: INC HL ; Move on +2263+ 12BE 5E LD E,(HL) ; Get LSB of next array address +2264+ 12BF 23 INC HL +2265+ 12C0 56 LD D,(HL) ; Get MSB of next array address +2266+ 12C1 23 INC HL +2267+ 12C2 C2 A9 12 JP NZ,FNDARY ; Not found - Keep looking +2268+ 12C5 3A 5C 31 LD A,(LCRFLG) ; Found Locate or Create it? +2269+ 12C8 B7 OR A +2270+ 12C9 C2 0C 07 JP NZ,DDERR ; Create - ?DD Error +2271+ 12CC F1 POP AF ; Locate - Get number of dim'ns +2272+ 12CD 44 LD B,H ; BC Points to array dim'ns +2273+ 12CE 4D LD C,L +2274+ 12CF CA EB 18 JP Z,POPHRT ; Jump if array load/save +2275+ 12D2 96 SUB (HL) ; Same number of dimensions? +2276+ 12D3 CA 39 13 JP Z,FINDEL ; Yes - Find element +2277+ 12D6 1E 10 BSERR: LD E,BS ; ?BS Error +2278+ 12D8 C3 17 07 JP ERROR ; Output error +2279+ 12DB +2280+ 12DB 11 04 00 CREARY: LD DE,4 ; 4 Bytes per entry +2281+ 12DE F1 POP AF ; Array to save or 0 dim'ns? +2282+ 12DF CA 22 0C JP Z,FCERR ; Yes - ?FC Error +2283+ 12E2 71 LD (HL),C ; Save second byte of name +2284+ 12E3 23 INC HL +2285+ 12E4 70 LD (HL),B ; Save first byte of name +2286+ 12E5 23 INC HL +2287+ 12E6 4F LD C,A ; Number of dimensions to C +2288+ 12E7 CD E0 06 CALL CHKSTK ; Check if enough memory +2289+ 12EA 23 INC HL ; Point to number of dimensions +2290+ 12EB 23 INC HL +2291+ 12EC 22 75 31 LD (CUROPR),HL ; Save address of pointer +2292+ 12EF 71 LD (HL),C ; Set number of dimensions +2293+ 12F0 23 INC HL +2294+ 12F1 3A 5C 31 LD A,(LCRFLG) ; Locate of Create? +2295+ 12F4 17 RLA ; Carry set = Create +2296+ 12F5 79 LD A,C ; Get number of dimensions +2297+ 12F6 01 0B 00 CRARLP: LD BC,10+1 ; Default dimension size 10 +2298+ 12F9 D2 FE 12 JP NC,DEFSIZ ; Locate - Set default size +2299+ 12FC C1 POP BC ; Get specified dimension size +2300+ 12FD 03 INC BC ; Include zero element +2301+ 12FE 71 DEFSIZ: LD (HL),C ; Save LSB of dimension size +2302+ 12FF 23 INC HL +2303+ 1300 70 LD (HL),B ; Save MSB of dimension size +2304+ 1301 23 INC HL +2305+ 1302 F5 PUSH AF ; Save num' of dim'ns an status +2306+ 1303 E5 PUSH HL ; Save address of dim'n size +2307+ 1304 CD 96 1A CALL MLDEBC ; Multiply DE by BC to find +2308+ 1307 EB EX DE,HL ; amount of mem needed (to DE) +2309+ 1308 E1 POP HL ; Restore address of dimension +2310+ 1309 F1 POP AF ; Restore number of dimensions +2311+ 130A 3D DEC A ; Count them +2312+ 130B C2 F6 12 JP NZ,CRARLP ; Do next dimension if more +2313+ 130E F5 PUSH AF ; Save locate/create flag +2314+ 130F 42 LD B,D ; MSB of memory needed +2315+ 1310 4B LD C,E ; LSB of memory needed +2316+ 1311 EB EX DE,HL +2317+ 1312 19 ADD HL,DE ; Add bytes to array start +2318+ 1313 DA F8 06 JP C,OMERR ; Too big - Error +2319+ 1316 CD E9 06 CALL ENFMEM ; See if enough memory +2320+ 1319 22 8A 31 LD (ARREND),HL ; Save new end of array +2321+ 131C +2322+ 131C 2B ZERARY: DEC HL ; Back through array data +2323+ 131D 36 00 LD (HL),0 ; Set array element to zero +2324+ 131F CD CB 09 CALL CPDEHL ; All elements zeroed? +2325+ 1322 C2 1C 13 JP NZ,ZERARY ; No - Keep on going +2326+ 1325 03 INC BC ; Number of bytes + 1 +2327+ 1326 57 LD D,A ; A=0 +2328+ 1327 2A 75 31 LD HL,(CUROPR) ; Get address of array +2329+ 132A 5E LD E,(HL) ; Number of dimensions +2330+ 132B EB EX DE,HL ; To HL +2331+ 132C 29 ADD HL,HL ; Two bytes per dimension size +2332+ 132D 09 ADD HL,BC ; Add number of bytes +2333+ 132E EB EX DE,HL ; Bytes needed to DE +2334+ 132F 2B DEC HL +2335+ 1330 2B DEC HL +2336+ 1331 73 LD (HL),E ; Save LSB of bytes needed +2337+ 1332 23 INC HL +2338+ 1333 72 LD (HL),D ; Save MSB of bytes needed +2339+ 1334 23 INC HL +2340+ 1335 F1 POP AF ; Locate / Create? +2341+ 1336 DA 5D 13 JP C,ENDDIM ; A is 0 , End if create +2342+ 1339 47 FINDEL: LD B,A ; Find array element +2343+ 133A 4F LD C,A +2344+ 133B 7E LD A,(HL) ; Number of dimensions +2345+ 133C 23 INC HL +2346+ 133D 16 .BYTE 16H ; Skip "POP HL" +2347+ 133E E1 FNDELP: POP HL ; Address of next dim' size +2348+ 133F 5E LD E,(HL) ; Get LSB of dim'n size +2349+ 1340 23 INC HL +2350+ 1341 56 LD D,(HL) ; Get MSB of dim'n size +2351+ 1342 23 INC HL +2352+ 1343 E3 EX (SP),HL ; Save address - Get index +2353+ 1344 F5 PUSH AF ; Save number of dim'ns +2354+ 1345 CD CB 09 CALL CPDEHL ; Dimension too large? +2355+ 1348 D2 D6 12 JP NC,BSERR ; Yes - ?BS Error +2356+ 134B E5 PUSH HL ; Save index +2357+ 134C CD 96 1A CALL MLDEBC ; Multiply previous by size +2358+ 134F D1 POP DE ; Index supplied to DE +2359+ 1350 19 ADD HL,DE ; Add index to pointer +2360+ 1351 F1 POP AF ; Number of dimensions +2361+ 1352 3D DEC A ; Count them +2362+ 1353 44 LD B,H ; MSB of pointer +2363+ 1354 4D LD C,L ; LSB of pointer +2364+ 1355 C2 3E 13 JP NZ,FNDELP ; More - Keep going +2365+ 1358 29 ADD HL,HL ; 4 Bytes per element +2366+ 1359 29 ADD HL,HL +2367+ 135A C1 POP BC ; Start of array +2368+ 135B 09 ADD HL,BC ; Point to element +2369+ 135C EB EX DE,HL ; Address of element to DE +2370+ 135D 2A 80 31 ENDDIM: LD HL,(NXTOPR) ; Got code string address +2371+ 1360 C9 RET +2372+ 1361 +2373+ 1361 2A 8A 31 FRE: LD HL,(ARREND) ; Start of free memory +2374+ 1364 EB EX DE,HL ; To DE +2375+ 1365 21 00 00 LD HL,0 ; End of free memory +2376+ 1368 39 ADD HL,SP ; Current stack value +2377+ 1369 3A 5D 31 LD A,(TYPE) ; Dummy argument type +2378+ 136C B7 OR A +2379+ 136D CA 7D 13 JP Z,FRENUM ; Numeric - Free variable space +2380+ 1370 CD E4 15 CALL GSTRCU ; Current string to pool +2381+ 1373 CD E4 14 CALL GARBGE ; Garbage collection +2382+ 1376 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use +2383+ 1379 EB EX DE,HL ; To DE +2384+ 137A 2A 73 31 LD HL,(STRBOT) ; Bottom of string space +2385+ 137D 7D FRENUM: LD A,L ; Get LSB of end +2386+ 137E 93 SUB E ; Subtract LSB of beginning +2387+ 137F 4F LD C,A ; Save difference if C +2388+ 1380 7C LD A,H ; Get MSB of end +2389+ 1381 9A SBC A,D ; Subtract MSB of beginning +2390+ 1382 41 ACPASS: LD B,C ; Return integer AC +2391+ 1383 50 ABPASS: LD D,B ; Return integer AB +2392+ 1384 1E 00 LD E,0 +2393+ 1386 21 5D 31 LD HL,TYPE ; Point to type +2394+ 1389 73 LD (HL),E ; Set type to numeric +2395+ 138A 06 90 LD B,80H+16 ; 16 bit integer +2396+ 138C C3 C1 19 JP RETINT ; Return the integr +2397+ 138F +2398+ 138F 3A 5B 31 POS: LD A,(CURPOS) ; Get cursor position +2399+ 1392 47 PASSA: LD B,A ; Put A into AB +2400+ 1393 AF XOR A ; Zero A +2401+ 1394 C3 83 13 JP ABPASS ; Return integer AB +2402+ 1397 +2403+ 1397 CD 1A 14 DEF: CALL CHEKFN ; Get "FN" and name +2404+ 139A CD 0C 14 CALL IDTEST ; Test for illegal direct +2405+ 139D 01 F2 0C LD BC,DATA ; To get next statement +2406+ 13A0 C5 PUSH BC ; Save address for RETurn +2407+ 13A1 D5 PUSH DE ; Save address of function ptr +2408+ 13A2 CD D1 09 CALL CHKSYN ; Make sure "(" follows +2409+ 13A5 28 .BYTE "(" +2410+ 13A6 CD BE 11 CALL GETVAR ; Get argument variable name +2411+ 13A9 E5 PUSH HL ; Save code string address +2412+ 13AA EB EX DE,HL ; Argument address to HL +2413+ 13AB 2B DEC HL +2414+ 13AC 56 LD D,(HL) ; Get first byte of arg name +2415+ 13AD 2B DEC HL +2416+ 13AE 5E LD E,(HL) ; Get second byte of arg name +2417+ 13AF E1 POP HL ; Restore code string address +2418+ 13B0 CD CB 0F CALL TSTNUM ; Make sure numeric argument +2419+ 13B3 CD D1 09 CALL CHKSYN ; Make sure ")" follows +2420+ 13B6 29 .BYTE ")" +2421+ 13B7 CD D1 09 CALL CHKSYN ; Make sure "=" follows +2422+ 13BA B4 .BYTE ZEQUAL ; "=" token +2423+ 13BB 44 LD B,H ; Code string address to BC +2424+ 13BC 4D LD C,L +2425+ 13BD E3 EX (SP),HL ; Save code str , Get FN ptr +2426+ 13BE 71 LD (HL),C ; Save LSB of FN code string +2427+ 13BF 23 INC HL +2428+ 13C0 70 LD (HL),B ; Save MSB of FN code string +2429+ 13C1 C3 59 14 JP SVSTAD ; Save address and do function +2430+ 13C4 +2431+ 13C4 CD 1A 14 DOFN: CALL CHEKFN ; Make sure FN follows +2432+ 13C7 D5 PUSH DE ; Save function pointer address +2433+ 13C8 CD 9F 10 CALL EVLPAR ; Evaluate expression in "()" +2434+ 13CB CD CB 0F CALL TSTNUM ; Make sure numeric result +2435+ 13CE E3 EX (SP),HL ; Save code str , Get FN ptr +2436+ 13CF 5E LD E,(HL) ; Get LSB of FN code string +2437+ 13D0 23 INC HL +2438+ 13D1 56 LD D,(HL) ; Get MSB of FN code string +2439+ 13D2 23 INC HL +2440+ 13D3 7A LD A,D ; And function DEFined? +2441+ 13D4 B3 OR E +2442+ 13D5 CA 0F 07 JP Z,UFERR ; No - ?UF Error +2443+ 13D8 7E LD A,(HL) ; Get LSB of argument address +2444+ 13D9 23 INC HL +2445+ 13DA 66 LD H,(HL) ; Get MSB of argument address +2446+ 13DB 6F LD L,A ; HL = Arg variable address +2447+ 13DC E5 PUSH HL ; Save it +2448+ 13DD 2A 8E 31 LD HL,(FNRGNM) ; Get old argument name +2449+ 13E0 E3 EX (SP),HL ; ; Save old , Get new +2450+ 13E1 22 8E 31 LD (FNRGNM),HL ; Set new argument name +2451+ 13E4 2A 92 31 LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value +2452+ 13E7 E5 PUSH HL ; Save it +2453+ 13E8 2A 90 31 LD HL,(FNARG) ; Get MSB,EXP of old arg value +2454+ 13EB E5 PUSH HL ; Save it +2455+ 13EC 21 90 31 LD HL,FNARG ; HL = Value of argument +2456+ 13EF D5 PUSH DE ; Save FN code string address +2457+ 13F0 CD 02 1A CALL FPTHL ; Move FPREG to argument +2458+ 13F3 E1 POP HL ; Get FN code string address +2459+ 13F4 CD C8 0F CALL GETNUM ; Get value from function +2460+ 13F7 2B DEC HL ; DEC 'cos GETCHR INCs +2461+ 13F8 CD 5B 0B CALL GETCHR ; Get next character +2462+ 13FB C2 03 07 JP NZ,SNERR ; Bad character in FN - Error +2463+ 13FE E1 POP HL ; Get MSB,EXP of old arg +2464+ 13FF 22 90 31 LD (FNARG),HL ; Restore it +2465+ 1402 E1 POP HL ; Get LSB,NLSB of old arg +2466+ 1403 22 92 31 LD (FNARG+2),HL ; Restore it +2467+ 1406 E1 POP HL ; Get name of old arg +2468+ 1407 22 8E 31 LD (FNRGNM),HL ; Restore it +2469+ 140A E1 POP HL ; Restore code string address +2470+ 140B C9 RET +2471+ 140C +2472+ 140C E5 IDTEST: PUSH HL ; Save code string address +2473+ 140D 2A 0C 31 LD HL,(LINEAT) ; Get current line number +2474+ 1410 23 INC HL ; -1 means direct statement +2475+ 1411 7C LD A,H +2476+ 1412 B5 OR L +2477+ 1413 E1 POP HL ; Restore code string address +2478+ 1414 C0 RET NZ ; Return if in program +2479+ 1415 1E 16 LD E,ID ; ?ID Error +2480+ 1417 C3 17 07 JP ERROR +2481+ 141A +2482+ 141A CD D1 09 CHEKFN: CALL CHKSYN ; Make sure FN follows +2483+ 141D A7 .BYTE ZFN ; "FN" token +2484+ 141E 3E 80 LD A,80H +2485+ 1420 32 7B 31 LD (FORFLG),A ; Flag FN name to find +2486+ 1423 B6 OR (HL) ; FN name has bit 7 set +2487+ 1424 47 LD B,A ; in first byte of name +2488+ 1425 CD C3 11 CALL GTFNAM ; Get FN name +2489+ 1428 C3 CB 0F JP TSTNUM ; Make sure numeric function +2490+ 142B +2491+ 142B CD CB 0F STR: CALL TSTNUM ; Make sure it's a number +2492+ 142E CD 4F 1B CALL NUMASC ; Turn number into text +2493+ 1431 CD 5F 14 STR1: CALL CRTST ; Create string entry for it +2494+ 1434 CD E4 15 CALL GSTRCU ; Current string to pool +2495+ 1437 01 3F 16 LD BC,TOPOOL ; Save in string pool +2496+ 143A C5 PUSH BC ; Save address on stack +2497+ 143B +2498+ 143B 7E SAVSTR: LD A,(HL) ; Get string length +2499+ 143C 23 INC HL +2500+ 143D 23 INC HL +2501+ 143E E5 PUSH HL ; Save pointer to string +2502+ 143F CD BA 14 CALL TESTR ; See if enough string space +2503+ 1442 E1 POP HL ; Restore pointer to string +2504+ 1443 4E LD C,(HL) ; Get LSB of address +2505+ 1444 23 INC HL +2506+ 1445 46 LD B,(HL) ; Get MSB of address +2507+ 1446 CD 53 14 CALL CRTMST ; Create string entry +2508+ 1449 E5 PUSH HL ; Save pointer to MSB of addr +2509+ 144A 6F LD L,A ; Length of string +2510+ 144B CD D7 15 CALL TOSTRA ; Move to string area +2511+ 144E D1 POP DE ; Restore pointer to MSB +2512+ 144F C9 RET +2513+ 1450 +2514+ 1450 CD BA 14 MKTMST: CALL TESTR ; See if enough string space +2515+ 1453 21 6F 31 CRTMST: LD HL,TMPSTR ; Temporary string +2516+ 1456 E5 PUSH HL ; Save it +2517+ 1457 77 LD (HL),A ; Save length of string +2518+ 1458 23 INC HL +2519+ 1459 23 SVSTAD: INC HL +2520+ 145A 73 LD (HL),E ; Save LSB of address +2521+ 145B 23 INC HL +2522+ 145C 72 LD (HL),D ; Save MSB of address +2523+ 145D E1 POP HL ; Restore pointer +2524+ 145E C9 RET +2525+ 145F +2526+ 145F 2B CRTST: DEC HL ; DEC - INCed after +2527+ 1460 06 22 QTSTR: LD B,'"' ; Terminating quote +2528+ 1462 50 LD D,B ; Quote to D +2529+ 1463 E5 DTSTR: PUSH HL ; Save start +2530+ 1464 0E FF LD C,-1 ; Set counter to -1 +2531+ 1466 23 QTSTLP: INC HL ; Move on +2532+ 1467 7E LD A,(HL) ; Get byte +2533+ 1468 0C INC C ; Count bytes +2534+ 1469 B7 OR A ; End of line? +2535+ 146A CA 75 14 JP Z,CRTSTE ; Yes - Create string entry +2536+ 146D BA CP D ; Terminator D found? +2537+ 146E CA 75 14 JP Z,CRTSTE ; Yes - Create string entry +2538+ 1471 B8 CP B ; Terminator B found? +2539+ 1472 C2 66 14 JP NZ,QTSTLP ; No - Keep looking +2540+ 1475 FE 22 CRTSTE: CP '"' ; End with '"'? +2541+ 1477 CC 5B 0B CALL Z,GETCHR ; Yes - Get next character +2542+ 147A E3 EX (SP),HL ; Starting quote +2543+ 147B 23 INC HL ; First byte of string +2544+ 147C EB EX DE,HL ; To DE +2545+ 147D 79 LD A,C ; Get length +2546+ 147E CD 53 14 CALL CRTMST ; Create string entry +2547+ 1481 11 6F 31 TSTOPL: LD DE,TMPSTR ; Temporary string +2548+ 1484 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer +2549+ 1487 22 94 31 LD (FPREG),HL ; Save address of string ptr +2550+ 148A 3E 01 LD A,1 +2551+ 148C 32 5D 31 LD (TYPE),A ; Set type to string +2552+ 148F CD 05 1A CALL DETHL4 ; Move string to pool +2553+ 1492 CD CB 09 CALL CPDEHL ; Out of string pool? +2554+ 1495 22 61 31 LD (TMSTPT),HL ; Save new pointer +2555+ 1498 E1 POP HL ; Restore code string address +2556+ 1499 7E LD A,(HL) ; Get next code byte +2557+ 149A C0 RET NZ ; Return if pool OK +2558+ 149B 1E 1E LD E,ST ; ?ST Error +2559+ 149D C3 17 07 JP ERROR ; String pool overflow +2560+ 14A0 +2561+ 14A0 23 PRNUMS: INC HL ; Skip leading space +2562+ 14A1 CD 5F 14 PRS: CALL CRTST ; Create string entry for it +2563+ 14A4 CD E4 15 PRS1: CALL GSTRCU ; Current string to pool +2564+ 14A7 CD F9 19 CALL LOADFP ; Move string block to BCDE +2565+ 14AA 1C INC E ; Length + 1 +2566+ 14AB 1D PRSLP: DEC E ; Count characters +2567+ 14AC C8 RET Z ; End of string +2568+ 14AD 0A LD A,(BC) ; Get byte to output +2569+ 14AE CD DC 09 CALL OUTC ; Output character in A +2570+ 14B1 FE 0D CP CR ; Return? +2571+ 14B3 CC 0D 0E CALL Z,DONULL ; Yes - Do nulls +2572+ 14B6 03 INC BC ; Next byte in string +2573+ 14B7 C3 AB 14 JP PRSLP ; More characters to output +2574+ 14BA +2575+ 14BA B7 TESTR: OR A ; Test if enough room +2576+ 14BB 0E .BYTE 0EH ; No garbage collection done +2577+ 14BC F1 GRBDON: POP AF ; Garbage collection done +2578+ 14BD F5 PUSH AF ; Save status +2579+ 14BE 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use +2580+ 14C1 EB EX DE,HL ; To DE +2581+ 14C2 2A 73 31 LD HL,(STRBOT) ; Bottom of string area +2582+ 14C5 2F CPL ; Negate length (Top down) +2583+ 14C6 4F LD C,A ; -Length to BC +2584+ 14C7 06 FF LD B,-1 ; BC = -ve length of string +2585+ 14C9 09 ADD HL,BC ; Add to bottom of space in use +2586+ 14CA 23 INC HL ; Plus one for 2's complement +2587+ 14CB CD CB 09 CALL CPDEHL ; Below string RAM area? +2588+ 14CE DA D8 14 JP C,TESTOS ; Tidy up if not done else err +2589+ 14D1 22 73 31 LD (STRBOT),HL ; Save new bottom of area +2590+ 14D4 23 INC HL ; Point to first byte of string +2591+ 14D5 EB EX DE,HL ; Address to DE +2592+ 14D6 F1 POPAF: POP AF ; Throw away status push +2593+ 14D7 C9 RET +2594+ 14D8 +2595+ 14D8 F1 TESTOS: POP AF ; Garbage collect been done? +2596+ 14D9 1E 1A LD E,OS ; ?OS Error +2597+ 14DB CA 17 07 JP Z,ERROR ; Yes - Not enough string apace +2598+ 14DE BF CP A ; Flag garbage collect done +2599+ 14DF F5 PUSH AF ; Save status +2600+ 14E0 01 BC 14 LD BC,GRBDON ; Garbage collection done +2601+ 14E3 C5 PUSH BC ; Save for RETurn +2602+ 14E4 2A 5F 31 GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer +2603+ 14E7 22 73 31 GARBLP: LD (STRBOT),HL ; Reset string pointer +2604+ 14EA 21 00 00 LD HL,0 +2605+ 14ED E5 PUSH HL ; Flag no string found +2606+ 14EE 2A 0A 31 LD HL,(STRSPC) ; Get bottom of string space +2607+ 14F1 E5 PUSH HL ; Save bottom of string space +2608+ 14F2 21 63 31 LD HL,TMSTPL ; Temporary string pool +2609+ 14F5 EB GRBLP: EX DE,HL +2610+ 14F6 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer +2611+ 14F9 EB EX DE,HL +2612+ 14FA CD CB 09 CALL CPDEHL ; Temporary string pool done? +2613+ 14FD 01 F5 14 LD BC,GRBLP ; Loop until string pool done +2614+ 1500 C2 49 15 JP NZ,STPOOL ; No - See if in string area +2615+ 1503 2A 86 31 LD HL,(PROGND) ; Start of simple variables +2616+ 1506 EB SMPVAR: EX DE,HL +2617+ 1507 2A 88 31 LD HL,(VAREND) ; End of simple variables +2618+ 150A EB EX DE,HL +2619+ 150B CD CB 09 CALL CPDEHL ; All simple strings done? +2620+ 150E CA 1C 15 JP Z,ARRLP ; Yes - Do string arrays +2621+ 1511 7E LD A,(HL) ; Get type of variable +2622+ 1512 23 INC HL +2623+ 1513 23 INC HL +2624+ 1514 B7 OR A ; "S" flag set if string +2625+ 1515 CD 4C 15 CALL STRADD ; See if string in string area +2626+ 1518 C3 06 15 JP SMPVAR ; Loop until simple ones done +2627+ 151B +2628+ 151B C1 GNXARY: POP BC ; Scrap address of this array +2629+ 151C EB ARRLP: EX DE,HL +2630+ 151D 2A 8A 31 LD HL,(ARREND) ; End of string arrays +2631+ 1520 EB EX DE,HL +2632+ 1521 CD CB 09 CALL CPDEHL ; All string arrays done? +2633+ 1524 CA 72 15 JP Z,SCNEND ; Yes - Move string if found +2634+ 1527 CD F9 19 CALL LOADFP ; Get array name to BCDE +2635+ 152A 7B LD A,E ; Get type of array +2636+ 152B E5 PUSH HL ; Save address of num of dim'ns +2637+ 152C 09 ADD HL,BC ; Start of next array +2638+ 152D B7 OR A ; Test type of array +2639+ 152E F2 1B 15 JP P,GNXARY ; Numeric array - Ignore it +2640+ 1531 22 75 31 LD (CUROPR),HL ; Save address of next array +2641+ 1534 E1 POP HL ; Get address of num of dim'ns +2642+ 1535 4E LD C,(HL) ; BC = Number of dimensions +2643+ 1536 06 00 LD B,0 +2644+ 1538 09 ADD HL,BC ; Two bytes per dimension size +2645+ 1539 09 ADD HL,BC +2646+ 153A 23 INC HL ; Plus one for number of dim'ns +2647+ 153B EB GRBARY: EX DE,HL +2648+ 153C 2A 75 31 LD HL,(CUROPR) ; Get address of next array +2649+ 153F EB EX DE,HL +2650+ 1540 CD CB 09 CALL CPDEHL ; Is this array finished? +2651+ 1543 CA 1C 15 JP Z,ARRLP ; Yes - Get next one +2652+ 1546 01 3B 15 LD BC,GRBARY ; Loop until array all done +2653+ 1549 C5 STPOOL: PUSH BC ; Save return address +2654+ 154A F6 80 OR 80H ; Flag string type +2655+ 154C 7E STRADD: LD A,(HL) ; Get string length +2656+ 154D 23 INC HL +2657+ 154E 23 INC HL +2658+ 154F 5E LD E,(HL) ; Get LSB of string address +2659+ 1550 23 INC HL +2660+ 1551 56 LD D,(HL) ; Get MSB of string address +2661+ 1552 23 INC HL +2662+ 1553 F0 RET P ; Not a string - Return +2663+ 1554 B7 OR A ; Set flags on string length +2664+ 1555 C8 RET Z ; Null string - Return +2665+ 1556 44 LD B,H ; Save variable pointer +2666+ 1557 4D LD C,L +2667+ 1558 2A 73 31 LD HL,(STRBOT) ; Bottom of new area +2668+ 155B CD CB 09 CALL CPDEHL ; String been done? +2669+ 155E 60 LD H,B ; Restore variable pointer +2670+ 155F 69 LD L,C +2671+ 1560 D8 RET C ; String done - Ignore +2672+ 1561 E1 POP HL ; Return address +2673+ 1562 E3 EX (SP),HL ; Lowest available string area +2674+ 1563 CD CB 09 CALL CPDEHL ; String within string area? +2675+ 1566 E3 EX (SP),HL ; Lowest available string area +2676+ 1567 E5 PUSH HL ; Re-save return address +2677+ 1568 60 LD H,B ; Restore variable pointer +2678+ 1569 69 LD L,C +2679+ 156A D0 RET NC ; Outside string area - Ignore +2680+ 156B C1 POP BC ; Get return , Throw 2 away +2681+ 156C F1 POP AF ; +2682+ 156D F1 POP AF ; +2683+ 156E E5 PUSH HL ; Save variable pointer +2684+ 156F D5 PUSH DE ; Save address of current +2685+ 1570 C5 PUSH BC ; Put back return address +2686+ 1571 C9 RET ; Go to it +2687+ 1572 +2688+ 1572 D1 SCNEND: POP DE ; Addresses of strings +2689+ 1573 E1 POP HL ; +2690+ 1574 7D LD A,L ; HL = 0 if no more to do +2691+ 1575 B4 OR H +2692+ 1576 C8 RET Z ; No more to do - Return +2693+ 1577 2B DEC HL +2694+ 1578 46 LD B,(HL) ; MSB of address of string +2695+ 1579 2B DEC HL +2696+ 157A 4E LD C,(HL) ; LSB of address of string +2697+ 157B E5 PUSH HL ; Save variable address +2698+ 157C 2B DEC HL +2699+ 157D 2B DEC HL +2700+ 157E 6E LD L,(HL) ; HL = Length of string +2701+ 157F 26 00 LD H,0 +2702+ 1581 09 ADD HL,BC ; Address of end of string+1 +2703+ 1582 50 LD D,B ; String address to DE +2704+ 1583 59 LD E,C +2705+ 1584 2B DEC HL ; Last byte in string +2706+ 1585 44 LD B,H ; Address to BC +2707+ 1586 4D LD C,L +2708+ 1587 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area +2709+ 158A CD D2 06 CALL MOVSTR ; Move string to new address +2710+ 158D E1 POP HL ; Restore variable address +2711+ 158E 71 LD (HL),C ; Save new LSB of address +2712+ 158F 23 INC HL +2713+ 1590 70 LD (HL),B ; Save new MSB of address +2714+ 1591 69 LD L,C ; Next string area+1 to HL +2715+ 1592 60 LD H,B +2716+ 1593 2B DEC HL ; Next string area address +2717+ 1594 C3 E7 14 JP GARBLP ; Look for more strings +2718+ 1597 +2719+ 1597 C5 CONCAT: PUSH BC ; Save prec' opr & code string +2720+ 1598 E5 PUSH HL ; +2721+ 1599 2A 94 31 LD HL,(FPREG) ; Get first string +2722+ 159C E3 EX (SP),HL ; Save first string +2723+ 159D CD 51 10 CALL OPRND ; Get second string +2724+ 15A0 E3 EX (SP),HL ; Restore first string +2725+ 15A1 CD CC 0F CALL TSTSTR ; Make sure it's a string +2726+ 15A4 7E LD A,(HL) ; Get length of second string +2727+ 15A5 E5 PUSH HL ; Save first string +2728+ 15A6 2A 94 31 LD HL,(FPREG) ; Get second string +2729+ 15A9 E5 PUSH HL ; Save second string +2730+ 15AA 86 ADD A,(HL) ; Add length of second string +2731+ 15AB 1E 1C LD E,LS ; ?LS Error +2732+ 15AD DA 17 07 JP C,ERROR ; String too long - Error +2733+ 15B0 CD 50 14 CALL MKTMST ; Make temporary string +2734+ 15B3 D1 POP DE ; Get second string to DE +2735+ 15B4 CD E8 15 CALL GSTRDE ; Move to string pool if needed +2736+ 15B7 E3 EX (SP),HL ; Get first string +2737+ 15B8 CD E7 15 CALL GSTRHL ; Move to string pool if needed +2738+ 15BB E5 PUSH HL ; Save first string +2739+ 15BC 2A 71 31 LD HL,(TMPSTR+2) ; Temporary string address +2740+ 15BF EB EX DE,HL ; To DE +2741+ 15C0 CD CE 15 CALL SSTSA ; First string to string area +2742+ 15C3 CD CE 15 CALL SSTSA ; Second string to string area +2743+ 15C6 21 E6 0F LD HL,EVAL2 ; Return to evaluation loop +2744+ 15C9 E3 EX (SP),HL ; Save return,get code string +2745+ 15CA E5 PUSH HL ; Save code string address +2746+ 15CB C3 81 14 JP TSTOPL ; To temporary string to pool +2747+ 15CE +2748+ 15CE E1 SSTSA: POP HL ; Return address +2749+ 15CF E3 EX (SP),HL ; Get string block,save return +2750+ 15D0 7E LD A,(HL) ; Get length of string +2751+ 15D1 23 INC HL +2752+ 15D2 23 INC HL +2753+ 15D3 4E LD C,(HL) ; Get LSB of string address +2754+ 15D4 23 INC HL +2755+ 15D5 46 LD B,(HL) ; Get MSB of string address +2756+ 15D6 6F LD L,A ; Length to L +2757+ 15D7 2C TOSTRA: INC L ; INC - DECed after +2758+ 15D8 2D TSALP: DEC L ; Count bytes moved +2759+ 15D9 C8 RET Z ; End of string - Return +2760+ 15DA 0A LD A,(BC) ; Get source +2761+ 15DB 12 LD (DE),A ; Save destination +2762+ 15DC 03 INC BC ; Next source +2763+ 15DD 13 INC DE ; Next destination +2764+ 15DE C3 D8 15 JP TSALP ; Loop until string moved +2765+ 15E1 +2766+ 15E1 CD CC 0F GETSTR: CALL TSTSTR ; Make sure it's a string +2767+ 15E4 2A 94 31 GSTRCU: LD HL,(FPREG) ; Get current string +2768+ 15E7 EB GSTRHL: EX DE,HL ; Save DE +2769+ 15E8 CD 02 16 GSTRDE: CALL BAKTMP ; Was it last tmp-str? +2770+ 15EB EB EX DE,HL ; Restore DE +2771+ 15EC C0 RET NZ ; No - Return +2772+ 15ED D5 PUSH DE ; Save string +2773+ 15EE 50 LD D,B ; String block address to DE +2774+ 15EF 59 LD E,C +2775+ 15F0 1B DEC DE ; Point to length +2776+ 15F1 4E LD C,(HL) ; Get string length +2777+ 15F2 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area +2778+ 15F5 CD CB 09 CALL CPDEHL ; Last one in string area? +2779+ 15F8 C2 00 16 JP NZ,POPHL ; No - Return +2780+ 15FB 47 LD B,A ; Clear B (A=0) +2781+ 15FC 09 ADD HL,BC ; Remove string from str' area +2782+ 15FD 22 73 31 LD (STRBOT),HL ; Save new bottom of str' area +2783+ 1600 E1 POPHL: POP HL ; Restore string +2784+ 1601 C9 RET +2785+ 1602 +2786+ 1602 2A 61 31 BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top +2787+ 1605 2B DEC HL ; Back +2788+ 1606 46 LD B,(HL) ; Get MSB of address +2789+ 1607 2B DEC HL ; Back +2790+ 1608 4E LD C,(HL) ; Get LSB of address +2791+ 1609 2B DEC HL ; Back +2792+ 160A 2B DEC HL ; Back +2793+ 160B CD CB 09 CALL CPDEHL ; String last in string pool? +2794+ 160E C0 RET NZ ; Yes - Leave it +2795+ 160F 22 61 31 LD (TMSTPT),HL ; Save new string pool top +2796+ 1612 C9 RET +2797+ 1613 +2798+ 1613 01 92 13 LEN: LD BC,PASSA ; To return integer A +2799+ 1616 C5 PUSH BC ; Save address +2800+ 1617 CD E1 15 GETLEN: CALL GETSTR ; Get string and its length +2801+ 161A AF XOR A +2802+ 161B 57 LD D,A ; Clear D +2803+ 161C 32 5D 31 LD (TYPE),A ; Set type to numeric +2804+ 161F 7E LD A,(HL) ; Get length of string +2805+ 1620 B7 OR A ; Set status flags +2806+ 1621 C9 RET +2807+ 1622 +2808+ 1622 01 92 13 ASC: LD BC,PASSA ; To return integer A +2809+ 1625 C5 PUSH BC ; Save address +2810+ 1626 CD 17 16 GTFLNM: CALL GETLEN ; Get length of string +2811+ 1629 CA 22 0C JP Z,FCERR ; Null string - Error +2812+ 162C 23 INC HL +2813+ 162D 23 INC HL +2814+ 162E 5E LD E,(HL) ; Get LSB of address +2815+ 162F 23 INC HL +2816+ 1630 56 LD D,(HL) ; Get MSB of address +2817+ 1631 1A LD A,(DE) ; Get first byte of string +2818+ 1632 C9 RET +2819+ 1633 +2820+ 1633 3E 01 CHR: LD A,1 ; One character string +2821+ 1635 CD 50 14 CALL MKTMST ; Make a temporary string +2822+ 1638 CD 2C 17 CALL MAKINT ; Make it integer A +2823+ 163B 2A 71 31 LD HL,(TMPSTR+2) ; Get address of string +2824+ 163E 73 LD (HL),E ; Save character +2825+ 163F C1 TOPOOL: POP BC ; Clean up stack +2826+ 1640 C3 81 14 JP TSTOPL ; Temporary string to pool +2827+ 1643 +2828+ 1643 CD DC 16 LEFT: CALL LFRGNM ; Get number and ending ")" +2829+ 1646 AF XOR A ; Start at first byte in string +2830+ 1647 E3 RIGHT1: EX (SP),HL ; Save code string,Get string +2831+ 1648 4F LD C,A ; Starting position in string +2832+ 1649 E5 MID1: PUSH HL ; Save string block address +2833+ 164A 7E LD A,(HL) ; Get length of string +2834+ 164B B8 CP B ; Compare with number given +2835+ 164C DA 51 16 JP C,ALLFOL ; All following bytes required +2836+ 164F 78 LD A,B ; Get new length +2837+ 1650 11 .BYTE 11H ; Skip "LD C,0" +2838+ 1651 0E 00 ALLFOL: LD C,0 ; First byte of string +2839+ 1653 C5 PUSH BC ; Save position in string +2840+ 1654 CD BA 14 CALL TESTR ; See if enough string space +2841+ 1657 C1 POP BC ; Get position in string +2842+ 1658 E1 POP HL ; Restore string block address +2843+ 1659 E5 PUSH HL ; And re-save it +2844+ 165A 23 INC HL +2845+ 165B 23 INC HL +2846+ 165C 46 LD B,(HL) ; Get LSB of address +2847+ 165D 23 INC HL +2848+ 165E 66 LD H,(HL) ; Get MSB of address +2849+ 165F 68 LD L,B ; HL = address of string +2850+ 1660 06 00 LD B,0 ; BC = starting address +2851+ 1662 09 ADD HL,BC ; Point to that byte +2852+ 1663 44 LD B,H ; BC = source string +2853+ 1664 4D LD C,L +2854+ 1665 CD 53 14 CALL CRTMST ; Create a string entry +2855+ 1668 6F LD L,A ; Length of new string +2856+ 1669 CD D7 15 CALL TOSTRA ; Move string to string area +2857+ 166C D1 POP DE ; Clear stack +2858+ 166D CD E8 15 CALL GSTRDE ; Move to string pool if needed +2859+ 1670 C3 81 14 JP TSTOPL ; Temporary string to pool +2860+ 1673 +2861+ 1673 CD DC 16 RIGHT: CALL LFRGNM ; Get number and ending ")" +2862+ 1676 D1 POP DE ; Get string length +2863+ 1677 D5 PUSH DE ; And re-save +2864+ 1678 1A LD A,(DE) ; Get length +2865+ 1679 90 SUB B ; Move back N bytes +2866+ 167A C3 47 16 JP RIGHT1 ; Go and get sub-string +2867+ 167D +2868+ 167D EB MID: EX DE,HL ; Get code string address +2869+ 167E 7E LD A,(HL) ; Get next byte ',' or ")" +2870+ 167F CD E1 16 CALL MIDNUM ; Get number supplied +2871+ 1682 04 INC B ; Is it character zero? +2872+ 1683 05 DEC B +2873+ 1684 CA 22 0C JP Z,FCERR ; Yes - Error +2874+ 1687 C5 PUSH BC ; Save starting position +2875+ 1688 1E FF LD E,255 ; All of string +2876+ 168A FE 29 CP ')' ; Any length given? +2877+ 168C CA 96 16 JP Z,RSTSTR ; No - Rest of string +2878+ 168F CD D1 09 CALL CHKSYN ; Make sure ',' follows +2879+ 1692 2C .BYTE ',' +2880+ 1693 CD 29 17 CALL GETINT ; Get integer 0-255 +2881+ 1696 CD D1 09 RSTSTR: CALL CHKSYN ; Make sure ")" follows +2882+ 1699 29 .BYTE ")" +2883+ 169A F1 POP AF ; Restore starting position +2884+ 169B E3 EX (SP),HL ; Get string,8ave code string +2885+ 169C 01 49 16 LD BC,MID1 ; Continuation of MID$ routine +2886+ 169F C5 PUSH BC ; Save for return +2887+ 16A0 3D DEC A ; Starting position-1 +2888+ 16A1 BE CP (HL) ; Compare with length +2889+ 16A2 06 00 LD B,0 ; Zero bytes length +2890+ 16A4 D0 RET NC ; Null string if start past end +2891+ 16A5 4F LD C,A ; Save starting position-1 +2892+ 16A6 7E LD A,(HL) ; Get length of string +2893+ 16A7 91 SUB C ; Subtract start +2894+ 16A8 BB CP E ; Enough string for it? +2895+ 16A9 47 LD B,A ; Save maximum length available +2896+ 16AA D8 RET C ; Truncate string if needed +2897+ 16AB 43 LD B,E ; Set specified length +2898+ 16AC C9 RET ; Go and create string +2899+ 16AD +2900+ 16AD CD 17 16 VAL: CALL GETLEN ; Get length of string +2901+ 16B0 CA CA 17 JP Z,RESZER ; Result zero +2902+ 16B3 5F LD E,A ; Save length +2903+ 16B4 23 INC HL +2904+ 16B5 23 INC HL +2905+ 16B6 7E LD A,(HL) ; Get LSB of address +2906+ 16B7 23 INC HL +2907+ 16B8 66 LD H,(HL) ; Get MSB of address +2908+ 16B9 6F LD L,A ; HL = String address +2909+ 16BA E5 PUSH HL ; Save string address +2910+ 16BB 19 ADD HL,DE +2911+ 16BC 46 LD B,(HL) ; Get end of string+1 byte +2912+ 16BD 72 LD (HL),D ; Zero it to terminate +2913+ 16BE E3 EX (SP),HL ; Save string end,get start +2914+ 16BF C5 PUSH BC ; Save end+1 byte +2915+ 16C0 7E LD A,(HL) ; Get starting byte +2916+ 16C1 FE 24 CP '$' ; Hex number indicated? [function added] +2917+ 16C3 C2 CB 16 JP NZ,VAL1 +2918+ 16C6 CD F5 1E CALL HEXTFP ; Convert Hex to FPREG +2919+ 16C9 18 0D JR VAL3 +2920+ 16CB FE 25 VAL1: CP '%' ; Binary number indicated? [function added] +2921+ 16CD C2 D5 16 JP NZ,VAL2 +2922+ 16D0 CD 65 1F CALL BINTFP ; Convert Bin to FPREG +2923+ 16D3 18 03 JR VAL3 +2924+ 16D5 CD B1 1A VAL2: CALL ASCTFP ; Convert ASCII string to FP +2925+ 16D8 C1 VAL3: POP BC ; Restore end+1 byte +2926+ 16D9 E1 POP HL ; Restore end+1 address +2927+ 16DA 70 LD (HL),B ; Put back original byte +2928+ 16DB C9 RET +2929+ 16DC +2930+ 16DC EB LFRGNM: EX DE,HL ; Code string address to HL +2931+ 16DD CD D1 09 CALL CHKSYN ; Make sure ")" follows +2932+ 16E0 29 .BYTE ")" +2933+ 16E1 C1 MIDNUM: POP BC ; Get return address +2934+ 16E2 D1 POP DE ; Get number supplied +2935+ 16E3 C5 PUSH BC ; Re-save return address +2936+ 16E4 43 LD B,E ; Number to B +2937+ 16E5 C9 RET +2938+ 16E6 +2939+ 16E6 CD 2C 17 INP: CALL MAKINT ; Make it integer A +2940+ 16E9 32 EF 30 LD (INPORT),A ; Set input port +2941+ 16EC CD EE 30 CALL INPSUB ; Get input from port +2942+ 16EF C3 92 13 JP PASSA ; Return integer A +2943+ 16F2 +2944+ 16F2 CD 16 17 POUT: CALL SETIO ; Set up port number +2945+ 16F5 C3 B6 30 JP OUTSUB ; Output data and return +2946+ 16F8 +2947+ 16F8 CD 16 17 WAIT: CALL SETIO ; Set up port number +2948+ 16FB F5 PUSH AF ; Save AND mask +2949+ 16FC 1E 00 LD E,0 ; Assume zero if none given +2950+ 16FE 2B DEC HL ; DEC 'cos GETCHR INCs +2951+ 16FF CD 5B 0B CALL GETCHR ; Get next character +2952+ 1702 CA 0C 17 JP Z,NOXOR ; No XOR byte given +2953+ 1705 CD D1 09 CALL CHKSYN ; Make sure ',' follows +2954+ 1708 2C .BYTE ',' +2955+ 1709 CD 29 17 CALL GETINT ; Get integer 0-255 to XOR with +2956+ 170C C1 NOXOR: POP BC ; Restore AND mask +2957+ 170D CD EE 30 WAITLP: CALL INPSUB ; Get input +2958+ 1710 AB XOR E ; Flip selected bits +2959+ 1711 A0 AND B ; Result non-zero? +2960+ 1712 CA 0D 17 JP Z,WAITLP ; No = keep waiting +2961+ 1715 C9 RET +2962+ 1716 +2963+ 1716 CD 29 17 SETIO: CALL GETINT ; Get integer 0-255 +2964+ 1719 32 EF 30 LD (INPORT),A ; Set input port +2965+ 171C 32 B7 30 LD (OTPORT),A ; Set output port +2966+ 171F CD D1 09 CALL CHKSYN ; Make sure ',' follows +2967+ 1722 2C .BYTE ',' +2968+ 1723 C3 29 17 JP GETINT ; Get integer 0-255 and return +2969+ 1726 +2970+ 1726 CD 5B 0B FNDNUM: CALL GETCHR ; Get next character +2971+ 1729 CD C8 0F GETINT: CALL GETNUM ; Get a number from 0 to 255 +2972+ 172C CD 07 0C MAKINT: CALL DEPINT ; Make sure value 0 - 255 +2973+ 172F 7A LD A,D ; Get MSB of number +2974+ 1730 B7 OR A ; Zero? +2975+ 1731 C2 22 0C JP NZ,FCERR ; No - Error +2976+ 1734 2B DEC HL ; DEC 'cos GETCHR INCs +2977+ 1735 CD 5B 0B CALL GETCHR ; Get next character +2978+ 1738 7B LD A,E ; Get number to A +2979+ 1739 C9 RET +2980+ 173A +2981+ 173A CD 0D 0C PEEK: CALL DEINT ; Get memory address +2982+ 173D 1A LD A,(DE) ; Get byte in memory +2983+ 173E C3 92 13 JP PASSA ; Return integer A +2984+ 1741 +2985+ 1741 CD C8 0F POKE: CALL GETNUM ; Get memory address +2986+ 1744 CD 0D 0C CALL DEINT ; Get integer -32768 to 3276 +2987+ 1747 D5 PUSH DE ; Save memory address +2988+ 1748 CD D1 09 CALL CHKSYN ; Make sure ',' follows +2989+ 174B 2C .BYTE ',' +2990+ 174C CD 29 17 CALL GETINT ; Get integer 0-255 +2991+ 174F D1 POP DE ; Restore memory address +2992+ 1750 12 LD (DE),A ; Load it into memory +2993+ 1751 C9 RET +2994+ 1752 +2995+ 1752 21 28 1C ROUND: LD HL,HALF ; Add 0.5 to FPREG +2996+ 1755 CD F9 19 ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE +2997+ 1758 C3 64 17 JP FPADD ; Add BCDE to FPREG +2998+ 175B +2999+ 175B CD F9 19 SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL +3000+ 175E 21 .BYTE 21H ; Skip "POP BC" and "POP DE" +3001+ 175F C1 PSUB: POP BC ; Get FP number from stack +3002+ 1760 D1 POP DE +3003+ 1761 CD D3 19 SUBCDE: CALL INVSGN ; Negate FPREG +3004+ 1764 78 FPADD: LD A,B ; Get FP exponent +3005+ 1765 B7 OR A ; Is number zero? +3006+ 1766 C8 RET Z ; Yes - Nothing to add +3007+ 1767 3A 97 31 LD A,(FPEXP) ; Get FPREG exponent +3008+ 176A B7 OR A ; Is this number zero? +3009+ 176B CA EB 19 JP Z,FPBCDE ; Yes - Move BCDE to FPREG +3010+ 176E 90 SUB B ; BCDE number larger? +3011+ 176F D2 7E 17 JP NC,NOSWAP ; No - Don't swap them +3012+ 1772 2F CPL ; Two's complement +3013+ 1773 3C INC A ; FP exponent +3014+ 1774 EB EX DE,HL +3015+ 1775 CD DB 19 CALL STAKFP ; Put FPREG on stack +3016+ 1778 EB EX DE,HL +3017+ 1779 CD EB 19 CALL FPBCDE ; Move BCDE to FPREG +3018+ 177C C1 POP BC ; Restore number from stack +3019+ 177D D1 POP DE +3020+ 177E FE 19 NOSWAP: CP 24+1 ; Second number insignificant? +3021+ 1780 D0 RET NC ; Yes - First number is result +3022+ 1781 F5 PUSH AF ; Save number of bits to scale +3023+ 1782 CD 10 1A CALL SIGNS ; Set MSBs & sign of result +3024+ 1785 67 LD H,A ; Save sign of result +3025+ 1786 F1 POP AF ; Restore scaling factor +3026+ 1787 CD 29 18 CALL SCALE ; Scale BCDE to same exponent +3027+ 178A B4 OR H ; Result to be positive? +3028+ 178B 21 94 31 LD HL,FPREG ; Point to FPREG +3029+ 178E F2 A4 17 JP P,MINCDE ; No - Subtract FPREG from CDE +3030+ 1791 CD 09 18 CALL PLUCDE ; Add FPREG to CDE +3031+ 1794 D2 EA 17 JP NC,RONDUP ; No overflow - Round it up +3032+ 1797 23 INC HL ; Point to exponent +3033+ 1798 34 INC (HL) ; Increment it +3034+ 1799 CA 12 07 JP Z,OVERR ; Number overflowed - Error +3035+ 179C 2E 01 LD L,1 ; 1 bit to shift right +3036+ 179E CD 3F 18 CALL SHRT1 ; Shift result right +3037+ 17A1 C3 EA 17 JP RONDUP ; Round it up +3038+ 17A4 +3039+ 17A4 AF MINCDE: XOR A ; Clear A and carry +3040+ 17A5 90 SUB B ; Negate exponent +3041+ 17A6 47 LD B,A ; Re-save exponent +3042+ 17A7 7E LD A,(HL) ; Get LSB of FPREG +3043+ 17A8 9B SBC A, E ; Subtract LSB of BCDE +3044+ 17A9 5F LD E,A ; Save LSB of BCDE +3045+ 17AA 23 INC HL +3046+ 17AB 7E LD A,(HL) ; Get NMSB of FPREG +3047+ 17AC 9A SBC A,D ; Subtract NMSB of BCDE +3048+ 17AD 57 LD D,A ; Save NMSB of BCDE +3049+ 17AE 23 INC HL +3050+ 17AF 7E LD A,(HL) ; Get MSB of FPREG +3051+ 17B0 99 SBC A,C ; Subtract MSB of BCDE +3052+ 17B1 4F LD C,A ; Save MSB of BCDE +3053+ 17B2 DC 15 18 CONPOS: CALL C,COMPL ; Overflow - Make it positive +3054+ 17B5 +3055+ 17B5 68 BNORM: LD L,B ; L = Exponent +3056+ 17B6 63 LD H,E ; H = LSB +3057+ 17B7 AF XOR A +3058+ 17B8 47 BNRMLP: LD B,A ; Save bit count +3059+ 17B9 79 LD A,C ; Get MSB +3060+ 17BA B7 OR A ; Is it zero? +3061+ 17BB C2 D7 17 JP NZ,PNORM ; No - Do it bit at a time +3062+ 17BE 4A LD C,D ; MSB = NMSB +3063+ 17BF 54 LD D,H ; NMSB= LSB +3064+ 17C0 65 LD H,L ; LSB = VLSB +3065+ 17C1 6F LD L,A ; VLSB= 0 +3066+ 17C2 78 LD A,B ; Get exponent +3067+ 17C3 D6 08 SUB 8 ; Count 8 bits +3068+ 17C5 FE E0 CP -24-8 ; Was number zero? +3069+ 17C7 C2 B8 17 JP NZ,BNRMLP ; No - Keep normalising +3070+ 17CA AF RESZER: XOR A ; Result is zero +3071+ 17CB 32 97 31 SAVEXP: LD (FPEXP),A ; Save result as zero +3072+ 17CE C9 RET +3073+ 17CF +3074+ 17CF 05 NORMAL: DEC B ; Count bits +3075+ 17D0 29 ADD HL,HL ; Shift HL left +3076+ 17D1 7A LD A,D ; Get NMSB +3077+ 17D2 17 RLA ; Shift left with last bit +3078+ 17D3 57 LD D,A ; Save NMSB +3079+ 17D4 79 LD A,C ; Get MSB +3080+ 17D5 8F ADC A,A ; Shift left with last bit +3081+ 17D6 4F LD C,A ; Save MSB +3082+ 17D7 F2 CF 17 PNORM: JP P,NORMAL ; Not done - Keep going +3083+ 17DA 78 LD A,B ; Number of bits shifted +3084+ 17DB 5C LD E,H ; Save HL in EB +3085+ 17DC 45 LD B,L +3086+ 17DD B7 OR A ; Any shifting done? +3087+ 17DE CA EA 17 JP Z,RONDUP ; No - Round it up +3088+ 17E1 21 97 31 LD HL,FPEXP ; Point to exponent +3089+ 17E4 86 ADD A,(HL) ; Add shifted bits +3090+ 17E5 77 LD (HL),A ; Re-save exponent +3091+ 17E6 D2 CA 17 JP NC,RESZER ; Underflow - Result is zero +3092+ 17E9 C8 RET Z ; Result is zero +3093+ 17EA 78 RONDUP: LD A,B ; Get VLSB of number +3094+ 17EB 21 97 31 RONDB: LD HL,FPEXP ; Point to exponent +3095+ 17EE B7 OR A ; Any rounding? +3096+ 17EF FC FC 17 CALL M,FPROND ; Yes - Round number up +3097+ 17F2 46 LD B,(HL) ; B = Exponent +3098+ 17F3 23 INC HL +3099+ 17F4 7E LD A,(HL) ; Get sign of result +3100+ 17F5 E6 80 AND 10000000B ; Only bit 7 needed +3101+ 17F7 A9 XOR C ; Set correct sign +3102+ 17F8 4F LD C,A ; Save correct sign in number +3103+ 17F9 C3 EB 19 JP FPBCDE ; Move BCDE to FPREG +3104+ 17FC +3105+ 17FC 1C FPROND: INC E ; Round LSB +3106+ 17FD C0 RET NZ ; Return if ok +3107+ 17FE 14 INC D ; Round NMSB +3108+ 17FF C0 RET NZ ; Return if ok +3109+ 1800 0C INC C ; Round MSB +3110+ 1801 C0 RET NZ ; Return if ok +3111+ 1802 0E 80 LD C,80H ; Set normal value +3112+ 1804 34 INC (HL) ; Increment exponent +3113+ 1805 C0 RET NZ ; Return if ok +3114+ 1806 C3 12 07 JP OVERR ; Overflow error +3115+ 1809 +3116+ 1809 7E PLUCDE: LD A,(HL) ; Get LSB of FPREG +3117+ 180A 83 ADD A,E ; Add LSB of BCDE +3118+ 180B 5F LD E,A ; Save LSB of BCDE +3119+ 180C 23 INC HL +3120+ 180D 7E LD A,(HL) ; Get NMSB of FPREG +3121+ 180E 8A ADC A,D ; Add NMSB of BCDE +3122+ 180F 57 LD D,A ; Save NMSB of BCDE +3123+ 1810 23 INC HL +3124+ 1811 7E LD A,(HL) ; Get MSB of FPREG +3125+ 1812 89 ADC A,C ; Add MSB of BCDE +3126+ 1813 4F LD C,A ; Save MSB of BCDE +3127+ 1814 C9 RET +3128+ 1815 +3129+ 1815 21 98 31 COMPL: LD HL,SGNRES ; Sign of result +3130+ 1818 7E LD A,(HL) ; Get sign of result +3131+ 1819 2F CPL ; Negate it +3132+ 181A 77 LD (HL),A ; Put it back +3133+ 181B AF XOR A +3134+ 181C 6F LD L,A ; Set L to zero +3135+ 181D 90 SUB B ; Negate exponent,set carry +3136+ 181E 47 LD B,A ; Re-save exponent +3137+ 181F 7D LD A,L ; Load zero +3138+ 1820 9B SBC A,E ; Negate LSB +3139+ 1821 5F LD E,A ; Re-save LSB +3140+ 1822 7D LD A,L ; Load zero +3141+ 1823 9A SBC A,D ; Negate NMSB +3142+ 1824 57 LD D,A ; Re-save NMSB +3143+ 1825 7D LD A,L ; Load zero +3144+ 1826 99 SBC A,C ; Negate MSB +3145+ 1827 4F LD C,A ; Re-save MSB +3146+ 1828 C9 RET +3147+ 1829 +3148+ 1829 06 00 SCALE: LD B,0 ; Clear underflow +3149+ 182B D6 08 SCALLP: SUB 8 ; 8 bits (a whole byte)? +3150+ 182D DA 38 18 JP C,SHRITE ; No - Shift right A bits +3151+ 1830 43 LD B,E ; <- Shift +3152+ 1831 5A LD E,D ; <- right +3153+ 1832 51 LD D,C ; <- eight +3154+ 1833 0E 00 LD C,0 ; <- bits +3155+ 1835 C3 2B 18 JP SCALLP ; More bits to shift +3156+ 1838 +3157+ 1838 C6 09 SHRITE: ADD A,8+1 ; Adjust count +3158+ 183A 6F LD L,A ; Save bits to shift +3159+ 183B AF SHRLP: XOR A ; Flag for all done +3160+ 183C 2D DEC L ; All shifting done? +3161+ 183D C8 RET Z ; Yes - Return +3162+ 183E 79 LD A,C ; Get MSB +3163+ 183F 1F SHRT1: RRA ; Shift it right +3164+ 1840 4F LD C,A ; Re-save +3165+ 1841 7A LD A,D ; Get NMSB +3166+ 1842 1F RRA ; Shift right with last bit +3167+ 1843 57 LD D,A ; Re-save it +3168+ 1844 7B LD A,E ; Get LSB +3169+ 1845 1F RRA ; Shift right with last bit +3170+ 1846 5F LD E,A ; Re-save it +3171+ 1847 78 LD A,B ; Get underflow +3172+ 1848 1F RRA ; Shift right with last bit +3173+ 1849 47 LD B,A ; Re-save underflow +3174+ 184A C3 3B 18 JP SHRLP ; More bits to do +3175+ 184D +3176+ 184D 00 00 00 81 UNITY: .BYTE 000H,000H,000H,081H ; 1.00000 +3177+ 1851 +3178+ 1851 03 LOGTAB: .BYTE 3 ; Table used by LOG +3179+ 1852 AA 56 19 80 .BYTE 0AAH,056H,019H,080H ; 0.59898 +3180+ 1856 F1 22 76 80 .BYTE 0F1H,022H,076H,080H ; 0.96147 +3181+ 185A 45 AA 38 82 .BYTE 045H,0AAH,038H,082H ; 2.88539 +3182+ 185E +3183+ 185E CD AA 19 LOG: CALL TSTSGN ; Test sign of value +3184+ 1861 B7 OR A +3185+ 1862 EA 22 0C JP PE,FCERR ; ?FC Error if <= zero +3186+ 1865 21 97 31 LD HL,FPEXP ; Point to exponent +3187+ 1868 7E LD A,(HL) ; Get exponent +3188+ 1869 01 35 80 LD BC,8035H ; BCDE = SQR(1/2) +3189+ 186C 11 F3 04 LD DE,04F3H +3190+ 186F 90 SUB B ; Scale value to be < 1 +3191+ 1870 F5 PUSH AF ; Save scale factor +3192+ 1871 70 LD (HL),B ; Save new exponent +3193+ 1872 D5 PUSH DE ; Save SQR(1/2) +3194+ 1873 C5 PUSH BC +3195+ 1874 CD 64 17 CALL FPADD ; Add SQR(1/2) to value +3196+ 1877 C1 POP BC ; Restore SQR(1/2) +3197+ 1878 D1 POP DE +3198+ 1879 04 INC B ; Make it SQR(2) +3199+ 187A CD 00 19 CALL DVBCDE ; Divide by SQR(2) +3200+ 187D 21 4D 18 LD HL,UNITY ; Point to 1. +3201+ 1880 CD 5B 17 CALL SUBPHL ; Subtract FPREG from 1 +3202+ 1883 21 51 18 LD HL,LOGTAB ; Coefficient table +3203+ 1886 CD F2 1C CALL SUMSER ; Evaluate sum of series +3204+ 1889 01 80 80 LD BC,8080H ; BCDE = -0.5 +3205+ 188C 11 00 00 LD DE,0000H +3206+ 188F CD 64 17 CALL FPADD ; Subtract 0.5 from FPREG +3207+ 1892 F1 POP AF ; Restore scale factor +3208+ 1893 CD 25 1B CALL RSCALE ; Re-scale number +3209+ 1896 01 31 80 MULLN2: LD BC,8031H ; BCDE = Ln(2) +3210+ 1899 11 18 72 LD DE,7218H +3211+ 189C 21 .BYTE 21H ; Skip "POP BC" and "POP DE" +3212+ 189D +3213+ 189D C1 MULT: POP BC ; Get number from stack +3214+ 189E D1 POP DE +3215+ 189F CD AA 19 FPMULT: CALL TSTSGN ; Test sign of FPREG +3216+ 18A2 C8 RET Z ; Return zero if zero +3217+ 18A3 2E 00 LD L,0 ; Flag add exponents +3218+ 18A5 CD 68 19 CALL ADDEXP ; Add exponents +3219+ 18A8 79 LD A,C ; Get MSB of multiplier +3220+ 18A9 32 A6 31 LD (MULVAL),A ; Save MSB of multiplier +3221+ 18AC EB EX DE,HL +3222+ 18AD 22 A7 31 LD (MULVAL+1),HL ; Save rest of multiplier +3223+ 18B0 01 00 00 LD BC,0 ; Partial product (BCDE) = zero +3224+ 18B3 50 LD D,B +3225+ 18B4 58 LD E,B +3226+ 18B5 21 B5 17 LD HL,BNORM ; Address of normalise +3227+ 18B8 E5 PUSH HL ; Save for return +3228+ 18B9 21 C1 18 LD HL,MULT8 ; Address of 8 bit multiply +3229+ 18BC E5 PUSH HL ; Save for NMSB,MSB +3230+ 18BD E5 PUSH HL ; +3231+ 18BE 21 94 31 LD HL,FPREG ; Point to number +3232+ 18C1 7E MULT8: LD A,(HL) ; Get LSB of number +3233+ 18C2 23 INC HL ; Point to NMSB +3234+ 18C3 B7 OR A ; Test LSB +3235+ 18C4 CA ED 18 JP Z,BYTSFT ; Zero - shift to next byte +3236+ 18C7 E5 PUSH HL ; Save address of number +3237+ 18C8 2E 08 LD L,8 ; 8 bits to multiply by +3238+ 18CA 1F MUL8LP: RRA ; Shift LSB right +3239+ 18CB 67 LD H,A ; Save LSB +3240+ 18CC 79 LD A,C ; Get MSB +3241+ 18CD D2 DB 18 JP NC,NOMADD ; Bit was zero - Don't add +3242+ 18D0 E5 PUSH HL ; Save LSB and count +3243+ 18D1 2A A7 31 LD HL,(MULVAL+1) ; Get LSB and NMSB +3244+ 18D4 19 ADD HL,DE ; Add NMSB and LSB +3245+ 18D5 EB EX DE,HL ; Leave sum in DE +3246+ 18D6 E1 POP HL ; Restore MSB and count +3247+ 18D7 3A A6 31 LD A,(MULVAL) ; Get MSB of multiplier +3248+ 18DA 89 ADC A,C ; Add MSB +3249+ 18DB 1F NOMADD: RRA ; Shift MSB right +3250+ 18DC 4F LD C,A ; Re-save MSB +3251+ 18DD 7A LD A,D ; Get NMSB +3252+ 18DE 1F RRA ; Shift NMSB right +3253+ 18DF 57 LD D,A ; Re-save NMSB +3254+ 18E0 7B LD A,E ; Get LSB +3255+ 18E1 1F RRA ; Shift LSB right +3256+ 18E2 5F LD E,A ; Re-save LSB +3257+ 18E3 78 LD A,B ; Get VLSB +3258+ 18E4 1F RRA ; Shift VLSB right +3259+ 18E5 47 LD B,A ; Re-save VLSB +3260+ 18E6 2D DEC L ; Count bits multiplied +3261+ 18E7 7C LD A,H ; Get LSB of multiplier +3262+ 18E8 C2 CA 18 JP NZ,MUL8LP ; More - Do it +3263+ 18EB E1 POPHRT: POP HL ; Restore address of number +3264+ 18EC C9 RET +3265+ 18ED +3266+ 18ED 43 BYTSFT: LD B,E ; Shift partial product left +3267+ 18EE 5A LD E,D +3268+ 18EF 51 LD D,C +3269+ 18F0 4F LD C,A +3270+ 18F1 C9 RET +3271+ 18F2 +3272+ 18F2 CD DB 19 DIV10: CALL STAKFP ; Save FPREG on stack +3273+ 18F5 01 20 84 LD BC,8420H ; BCDE = 10. +3274+ 18F8 11 00 00 LD DE,0000H +3275+ 18FB CD EB 19 CALL FPBCDE ; Move 10 to FPREG +3276+ 18FE +3277+ 18FE C1 DIV: POP BC ; Get number from stack +3278+ 18FF D1 POP DE +3279+ 1900 CD AA 19 DVBCDE: CALL TSTSGN ; Test sign of FPREG +3280+ 1903 CA 06 07 JP Z,DZERR ; Error if division by zero +3281+ 1906 2E FF LD L,-1 ; Flag subtract exponents +3282+ 1908 CD 68 19 CALL ADDEXP ; Subtract exponents +3283+ 190B 34 INC (HL) ; Add 2 to exponent to adjust +3284+ 190C 34 INC (HL) +3285+ 190D 2B DEC HL ; Point to MSB +3286+ 190E 7E LD A,(HL) ; Get MSB of dividend +3287+ 190F 32 C2 30 LD (DIV3),A ; Save for subtraction +3288+ 1912 2B DEC HL +3289+ 1913 7E LD A,(HL) ; Get NMSB of dividend +3290+ 1914 32 BE 30 LD (DIV2),A ; Save for subtraction +3291+ 1917 2B DEC HL +3292+ 1918 7E LD A,(HL) ; Get MSB of dividend +3293+ 1919 32 BA 30 LD (DIV1),A ; Save for subtraction +3294+ 191C 41 LD B,C ; Get MSB +3295+ 191D EB EX DE,HL ; NMSB,LSB to HL +3296+ 191E AF XOR A +3297+ 191F 4F LD C,A ; Clear MSB of quotient +3298+ 1920 57 LD D,A ; Clear NMSB of quotient +3299+ 1921 5F LD E,A ; Clear LSB of quotient +3300+ 1922 32 C5 30 LD (DIV4),A ; Clear overflow count +3301+ 1925 E5 DIVLP: PUSH HL ; Save divisor +3302+ 1926 C5 PUSH BC +3303+ 1927 7D LD A,L ; Get LSB of number +3304+ 1928 CD B9 30 CALL DIVSUP ; Subt' divisor from dividend +3305+ 192B DE 00 SBC A,0 ; Count for overflows +3306+ 192D 3F CCF +3307+ 192E D2 38 19 JP NC,RESDIV ; Restore divisor if borrow +3308+ 1931 32 C5 30 LD (DIV4),A ; Re-save overflow count +3309+ 1934 F1 POP AF ; Scrap divisor +3310+ 1935 F1 POP AF +3311+ 1936 37 SCF ; Set carry to +3312+ 1937 D2 .BYTE 0D2H ; Skip "POP BC" and "POP HL" +3313+ 1938 +3314+ 1938 C1 RESDIV: POP BC ; Restore divisor +3315+ 1939 E1 POP HL +3316+ 193A 79 LD A,C ; Get MSB of quotient +3317+ 193B 3C INC A +3318+ 193C 3D DEC A +3319+ 193D 1F RRA ; Bit 0 to bit 7 +3320+ 193E FA EB 17 JP M,RONDB ; Done - Normalise result +3321+ 1941 17 RLA ; Restore carry +3322+ 1942 7B LD A,E ; Get LSB of quotient +3323+ 1943 17 RLA ; Double it +3324+ 1944 5F LD E,A ; Put it back +3325+ 1945 7A LD A,D ; Get NMSB of quotient +3326+ 1946 17 RLA ; Double it +3327+ 1947 57 LD D,A ; Put it back +3328+ 1948 79 LD A,C ; Get MSB of quotient +3329+ 1949 17 RLA ; Double it +3330+ 194A 4F LD C,A ; Put it back +3331+ 194B 29 ADD HL,HL ; Double NMSB,LSB of divisor +3332+ 194C 78 LD A,B ; Get MSB of divisor +3333+ 194D 17 RLA ; Double it +3334+ 194E 47 LD B,A ; Put it back +3335+ 194F 3A C5 30 LD A,(DIV4) ; Get VLSB of quotient +3336+ 1952 17 RLA ; Double it +3337+ 1953 32 C5 30 LD (DIV4),A ; Put it back +3338+ 1956 79 LD A,C ; Get MSB of quotient +3339+ 1957 B2 OR D ; Merge NMSB +3340+ 1958 B3 OR E ; Merge LSB +3341+ 1959 C2 25 19 JP NZ,DIVLP ; Not done - Keep dividing +3342+ 195C E5 PUSH HL ; Save divisor +3343+ 195D 21 97 31 LD HL,FPEXP ; Point to exponent +3344+ 1960 35 DEC (HL) ; Divide by 2 +3345+ 1961 E1 POP HL ; Restore divisor +3346+ 1962 C2 25 19 JP NZ,DIVLP ; Ok - Keep going +3347+ 1965 C3 12 07 JP OVERR ; Overflow error +3348+ 1968 +3349+ 1968 78 ADDEXP: LD A,B ; Get exponent of dividend +3350+ 1969 B7 OR A ; Test it +3351+ 196A CA 8C 19 JP Z,OVTST3 ; Zero - Result zero +3352+ 196D 7D LD A,L ; Get add/subtract flag +3353+ 196E 21 97 31 LD HL,FPEXP ; Point to exponent +3354+ 1971 AE XOR (HL) ; Add or subtract it +3355+ 1972 80 ADD A,B ; Add the other exponent +3356+ 1973 47 LD B,A ; Save new exponent +3357+ 1974 1F RRA ; Test exponent for overflow +3358+ 1975 A8 XOR B +3359+ 1976 78 LD A,B ; Get exponent +3360+ 1977 F2 8B 19 JP P,OVTST2 ; Positive - Test for overflow +3361+ 197A C6 80 ADD A,80H ; Add excess 128 +3362+ 197C 77 LD (HL),A ; Save new exponent +3363+ 197D CA EB 18 JP Z,POPHRT ; Zero - Result zero +3364+ 1980 CD 10 1A CALL SIGNS ; Set MSBs and sign of result +3365+ 1983 77 LD (HL),A ; Save new exponent +3366+ 1984 2B DEC HL ; Point to MSB +3367+ 1985 C9 RET +3368+ 1986 +3369+ 1986 CD AA 19 OVTST1: CALL TSTSGN ; Test sign of FPREG +3370+ 1989 2F CPL ; Invert sign +3371+ 198A E1 POP HL ; Clean up stack +3372+ 198B B7 OVTST2: OR A ; Test if new exponent zero +3373+ 198C E1 OVTST3: POP HL ; Clear off return address +3374+ 198D F2 CA 17 JP P,RESZER ; Result zero +3375+ 1990 C3 12 07 JP OVERR ; Overflow error +3376+ 1993 +3377+ 1993 CD F6 19 MLSP10: CALL BCDEFP ; Move FPREG to BCDE +3378+ 1996 78 LD A,B ; Get exponent +3379+ 1997 B7 OR A ; Is it zero? +3380+ 1998 C8 RET Z ; Yes - Result is zero +3381+ 1999 C6 02 ADD A,2 ; Multiply by 4 +3382+ 199B DA 12 07 JP C,OVERR ; Overflow - ?OV Error +3383+ 199E 47 LD B,A ; Re-save exponent +3384+ 199F CD 64 17 CALL FPADD ; Add BCDE to FPREG (Times 5) +3385+ 19A2 21 97 31 LD HL,FPEXP ; Point to exponent +3386+ 19A5 34 INC (HL) ; Double number (Times 10) +3387+ 19A6 C0 RET NZ ; Ok - Return +3388+ 19A7 C3 12 07 JP OVERR ; Overflow error +3389+ 19AA +3390+ 19AA 3A 97 31 TSTSGN: LD A,(FPEXP) ; Get sign of FPREG +3391+ 19AD B7 OR A +3392+ 19AE C8 RET Z ; RETurn if number is zero +3393+ 19AF 3A 96 31 LD A,(FPREG+2) ; Get MSB of FPREG +3394+ 19B2 FE .BYTE 0FEH ; Test sign +3395+ 19B3 2F RETREL: CPL ; Invert sign +3396+ 19B4 17 RLA ; Sign bit to carry +3397+ 19B5 9F FLGDIF: SBC A,A ; Carry to all bits of A +3398+ 19B6 C0 RET NZ ; Return -1 if negative +3399+ 19B7 3C INC A ; Bump to +1 +3400+ 19B8 C9 RET ; Positive - Return +1 +3401+ 19B9 +3402+ 19B9 CD AA 19 SGN: CALL TSTSGN ; Test sign of FPREG +3403+ 19BC 06 88 FLGREL: LD B,80H+8 ; 8 bit integer in exponent +3404+ 19BE 11 00 00 LD DE,0 ; Zero NMSB and LSB +3405+ 19C1 21 97 31 RETINT: LD HL,FPEXP ; Point to exponent +3406+ 19C4 4F LD C,A ; CDE = MSB,NMSB and LSB +3407+ 19C5 70 LD (HL),B ; Save exponent +3408+ 19C6 06 00 LD B,0 ; CDE = integer to normalise +3409+ 19C8 23 INC HL ; Point to sign of result +3410+ 19C9 36 80 LD (HL),80H ; Set sign of result +3411+ 19CB 17 RLA ; Carry = sign of integer +3412+ 19CC C3 B2 17 JP CONPOS ; Set sign of result +3413+ 19CF +3414+ 19CF CD AA 19 ABS: CALL TSTSGN ; Test sign of FPREG +3415+ 19D2 F0 RET P ; Return if positive +3416+ 19D3 21 96 31 INVSGN: LD HL,FPREG+2 ; Point to MSB +3417+ 19D6 7E LD A,(HL) ; Get sign of mantissa +3418+ 19D7 EE 80 XOR 80H ; Invert sign of mantissa +3419+ 19D9 77 LD (HL),A ; Re-save sign of mantissa +3420+ 19DA C9 RET +3421+ 19DB +3422+ 19DB EB STAKFP: EX DE,HL ; Save code string address +3423+ 19DC 2A 94 31 LD HL,(FPREG) ; LSB,NLSB of FPREG +3424+ 19DF E3 EX (SP),HL ; Stack them,get return +3425+ 19E0 E5 PUSH HL ; Re-save return +3426+ 19E1 2A 96 31 LD HL,(FPREG+2) ; MSB and exponent of FPREG +3427+ 19E4 E3 EX (SP),HL ; Stack them,get return +3428+ 19E5 E5 PUSH HL ; Re-save return +3429+ 19E6 EB EX DE,HL ; Restore code string address +3430+ 19E7 C9 RET +3431+ 19E8 +3432+ 19E8 CD F9 19 PHLTFP: CALL LOADFP ; Number at HL to BCDE +3433+ 19EB EB FPBCDE: EX DE,HL ; Save code string address +3434+ 19EC 22 94 31 LD (FPREG),HL ; Save LSB,NLSB of number +3435+ 19EF 60 LD H,B ; Exponent of number +3436+ 19F0 69 LD L,C ; MSB of number +3437+ 19F1 22 96 31 LD (FPREG+2),HL ; Save MSB and exponent +3438+ 19F4 EB EX DE,HL ; Restore code string address +3439+ 19F5 C9 RET +3440+ 19F6 +3441+ 19F6 21 94 31 BCDEFP: LD HL,FPREG ; Point to FPREG +3442+ 19F9 5E LOADFP: LD E,(HL) ; Get LSB of number +3443+ 19FA 23 INC HL +3444+ 19FB 56 LD D,(HL) ; Get NMSB of number +3445+ 19FC 23 INC HL +3446+ 19FD 4E LD C,(HL) ; Get MSB of number +3447+ 19FE 23 INC HL +3448+ 19FF 46 LD B,(HL) ; Get exponent of number +3449+ 1A00 23 INCHL: INC HL ; Used for conditional "INC HL" +3450+ 1A01 C9 RET +3451+ 1A02 +3452+ 1A02 11 94 31 FPTHL: LD DE,FPREG ; Point to FPREG +3453+ 1A05 06 04 DETHL4: LD B,4 ; 4 bytes to move +3454+ 1A07 1A DETHLB: LD A,(DE) ; Get source +3455+ 1A08 77 LD (HL),A ; Save destination +3456+ 1A09 13 INC DE ; Next source +3457+ 1A0A 23 INC HL ; Next destination +3458+ 1A0B 05 DEC B ; Count bytes +3459+ 1A0C C2 07 1A JP NZ,DETHLB ; Loop if more +3460+ 1A0F C9 RET +3461+ 1A10 +3462+ 1A10 21 96 31 SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG +3463+ 1A13 7E LD A,(HL) ; Get MSB +3464+ 1A14 07 RLCA ; Old sign to carry +3465+ 1A15 37 SCF ; Set MSBit +3466+ 1A16 1F RRA ; Set MSBit of MSB +3467+ 1A17 77 LD (HL),A ; Save new MSB +3468+ 1A18 3F CCF ; Complement sign +3469+ 1A19 1F RRA ; Old sign to carry +3470+ 1A1A 23 INC HL +3471+ 1A1B 23 INC HL +3472+ 1A1C 77 LD (HL),A ; Set sign of result +3473+ 1A1D 79 LD A,C ; Get MSB +3474+ 1A1E 07 RLCA ; Old sign to carry +3475+ 1A1F 37 SCF ; Set MSBit +3476+ 1A20 1F RRA ; Set MSBit of MSB +3477+ 1A21 4F LD C,A ; Save MSB +3478+ 1A22 1F RRA +3479+ 1A23 AE XOR (HL) ; New sign of result +3480+ 1A24 C9 RET +3481+ 1A25 +3482+ 1A25 78 CMPNUM: LD A,B ; Get exponent of number +3483+ 1A26 B7 OR A +3484+ 1A27 CA AA 19 JP Z,TSTSGN ; Zero - Test sign of FPREG +3485+ 1A2A 21 B3 19 LD HL,RETREL ; Return relation routine +3486+ 1A2D E5 PUSH HL ; Save for return +3487+ 1A2E CD AA 19 CALL TSTSGN ; Test sign of FPREG +3488+ 1A31 79 LD A,C ; Get MSB of number +3489+ 1A32 C8 RET Z ; FPREG zero - Number's MSB +3490+ 1A33 21 96 31 LD HL,FPREG+2 ; MSB of FPREG +3491+ 1A36 AE XOR (HL) ; Combine signs +3492+ 1A37 79 LD A,C ; Get MSB of number +3493+ 1A38 F8 RET M ; Exit if signs different +3494+ 1A39 CD 3F 1A CALL CMPFP ; Compare FP numbers +3495+ 1A3C 1F RRA ; Get carry to sign +3496+ 1A3D A9 XOR C ; Combine with MSB of number +3497+ 1A3E C9 RET +3498+ 1A3F +3499+ 1A3F 23 CMPFP: INC HL ; Point to exponent +3500+ 1A40 78 LD A,B ; Get exponent +3501+ 1A41 BE CP (HL) ; Compare exponents +3502+ 1A42 C0 RET NZ ; Different +3503+ 1A43 2B DEC HL ; Point to MBS +3504+ 1A44 79 LD A,C ; Get MSB +3505+ 1A45 BE CP (HL) ; Compare MSBs +3506+ 1A46 C0 RET NZ ; Different +3507+ 1A47 2B DEC HL ; Point to NMSB +3508+ 1A48 7A LD A,D ; Get NMSB +3509+ 1A49 BE CP (HL) ; Compare NMSBs +3510+ 1A4A C0 RET NZ ; Different +3511+ 1A4B 2B DEC HL ; Point to LSB +3512+ 1A4C 7B LD A,E ; Get LSB +3513+ 1A4D 96 SUB (HL) ; Compare LSBs +3514+ 1A4E C0 RET NZ ; Different +3515+ 1A4F E1 POP HL ; Drop RETurn +3516+ 1A50 E1 POP HL ; Drop another RETurn +3517+ 1A51 C9 RET +3518+ 1A52 +3519+ 1A52 47 FPINT: LD B,A ; <- Move +3520+ 1A53 4F LD C,A ; <- exponent +3521+ 1A54 57 LD D,A ; <- to all +3522+ 1A55 5F LD E,A ; <- bits +3523+ 1A56 B7 OR A ; Test exponent +3524+ 1A57 C8 RET Z ; Zero - Return zero +3525+ 1A58 E5 PUSH HL ; Save pointer to number +3526+ 1A59 CD F6 19 CALL BCDEFP ; Move FPREG to BCDE +3527+ 1A5C CD 10 1A CALL SIGNS ; Set MSBs & sign of result +3528+ 1A5F AE XOR (HL) ; Combine with sign of FPREG +3529+ 1A60 67 LD H,A ; Save combined signs +3530+ 1A61 FC 76 1A CALL M,DCBCDE ; Negative - Decrement BCDE +3531+ 1A64 3E 98 LD A,80H+24 ; 24 bits +3532+ 1A66 90 SUB B ; Bits to shift +3533+ 1A67 CD 29 18 CALL SCALE ; Shift BCDE +3534+ 1A6A 7C LD A,H ; Get combined sign +3535+ 1A6B 17 RLA ; Sign to carry +3536+ 1A6C DC FC 17 CALL C,FPROND ; Negative - Round number up +3537+ 1A6F 06 00 LD B,0 ; Zero exponent +3538+ 1A71 DC 15 18 CALL C,COMPL ; If negative make positive +3539+ 1A74 E1 POP HL ; Restore pointer to number +3540+ 1A75 C9 RET +3541+ 1A76 +3542+ 1A76 1B DCBCDE: DEC DE ; Decrement BCDE +3543+ 1A77 7A LD A,D ; Test LSBs +3544+ 1A78 A3 AND E +3545+ 1A79 3C INC A +3546+ 1A7A C0 RET NZ ; Exit if LSBs not FFFF +3547+ 1A7B 0B DEC BC ; Decrement MSBs +3548+ 1A7C C9 RET +3549+ 1A7D +3550+ 1A7D 21 97 31 INT: LD HL,FPEXP ; Point to exponent +3551+ 1A80 7E LD A,(HL) ; Get exponent +3552+ 1A81 FE 98 CP 80H+24 ; Integer accuracy only? +3553+ 1A83 3A 94 31 LD A,(FPREG) ; Get LSB +3554+ 1A86 D0 RET NC ; Yes - Already integer +3555+ 1A87 7E LD A,(HL) ; Get exponent +3556+ 1A88 CD 52 1A CALL FPINT ; F.P to integer +3557+ 1A8B 36 98 LD (HL),80H+24 ; Save 24 bit integer +3558+ 1A8D 7B LD A,E ; Get LSB of number +3559+ 1A8E F5 PUSH AF ; Save LSB +3560+ 1A8F 79 LD A,C ; Get MSB of number +3561+ 1A90 17 RLA ; Sign to carry +3562+ 1A91 CD B2 17 CALL CONPOS ; Set sign of result +3563+ 1A94 F1 POP AF ; Restore LSB of number +3564+ 1A95 C9 RET +3565+ 1A96 +3566+ 1A96 21 00 00 MLDEBC: LD HL,0 ; Clear partial product +3567+ 1A99 78 LD A,B ; Test multiplier +3568+ 1A9A B1 OR C +3569+ 1A9B C8 RET Z ; Return zero if zero +3570+ 1A9C 3E 10 LD A,16 ; 16 bits +3571+ 1A9E 29 MLDBLP: ADD HL,HL ; Shift P.P left +3572+ 1A9F DA D6 12 JP C,BSERR ; ?BS Error if overflow +3573+ 1AA2 EB EX DE,HL +3574+ 1AA3 29 ADD HL,HL ; Shift multiplier left +3575+ 1AA4 EB EX DE,HL +3576+ 1AA5 D2 AC 1A JP NC,NOMLAD ; Bit was zero - No add +3577+ 1AA8 09 ADD HL,BC ; Add multiplicand +3578+ 1AA9 DA D6 12 JP C,BSERR ; ?BS Error if overflow +3579+ 1AAC 3D NOMLAD: DEC A ; Count bits +3580+ 1AAD C2 9E 1A JP NZ,MLDBLP ; More +3581+ 1AB0 C9 RET +3582+ 1AB1 +3583+ 1AB1 FE 2D ASCTFP: CP '-' ; Negative? +3584+ 1AB3 F5 PUSH AF ; Save it and flags +3585+ 1AB4 CA BD 1A JP Z,CNVNUM ; Yes - Convert number +3586+ 1AB7 FE 2B CP '+' ; Positive? +3587+ 1AB9 CA BD 1A JP Z,CNVNUM ; Yes - Convert number +3588+ 1ABC 2B DEC HL ; DEC 'cos GETCHR INCs +3589+ 1ABD CD CA 17 CNVNUM: CALL RESZER ; Set result to zero +3590+ 1AC0 47 LD B,A ; Digits after point counter +3591+ 1AC1 57 LD D,A ; Sign of exponent +3592+ 1AC2 5F LD E,A ; Exponent of ten +3593+ 1AC3 2F CPL +3594+ 1AC4 4F LD C,A ; Before or after point flag +3595+ 1AC5 CD 5B 0B MANLP: CALL GETCHR ; Get next character +3596+ 1AC8 DA 0E 1B JP C,ADDIG ; Digit - Add to number +3597+ 1ACB FE 2E CP '.' +3598+ 1ACD CA E9 1A JP Z,DPOINT ; '.' - Flag point +3599+ 1AD0 FE 45 CP 'E' +3600+ 1AD2 C2 ED 1A JP NZ,CONEXP ; Not 'E' - Scale number +3601+ 1AD5 CD 5B 0B CALL GETCHR ; Get next character +3602+ 1AD8 CD 01 11 CALL SGNEXP ; Get sign of exponent +3603+ 1ADB CD 5B 0B EXPLP: CALL GETCHR ; Get next character +3604+ 1ADE DA 30 1B JP C,EDIGIT ; Digit - Add to exponent +3605+ 1AE1 14 INC D ; Is sign negative? +3606+ 1AE2 C2 ED 1A JP NZ,CONEXP ; No - Scale number +3607+ 1AE5 AF XOR A +3608+ 1AE6 93 SUB E ; Negate exponent +3609+ 1AE7 5F LD E,A ; And re-save it +3610+ 1AE8 0C INC C ; Flag end of number +3611+ 1AE9 0C DPOINT: INC C ; Flag point passed +3612+ 1AEA CA C5 1A JP Z,MANLP ; Zero - Get another digit +3613+ 1AED E5 CONEXP: PUSH HL ; Save code string address +3614+ 1AEE 7B LD A,E ; Get exponent +3615+ 1AEF 90 SUB B ; Subtract digits after point +3616+ 1AF0 F4 06 1B SCALMI: CALL P,SCALPL ; Positive - Multiply number +3617+ 1AF3 F2 FC 1A JP P,ENDCON ; Positive - All done +3618+ 1AF6 F5 PUSH AF ; Save number of times to /10 +3619+ 1AF7 CD F2 18 CALL DIV10 ; Divide by 10 +3620+ 1AFA F1 POP AF ; Restore count +3621+ 1AFB 3C INC A ; Count divides +3622+ 1AFC +3623+ 1AFC C2 F0 1A ENDCON: JP NZ,SCALMI ; More to do +3624+ 1AFF D1 POP DE ; Restore code string address +3625+ 1B00 F1 POP AF ; Restore sign of number +3626+ 1B01 CC D3 19 CALL Z,INVSGN ; Negative - Negate number +3627+ 1B04 EB EX DE,HL ; Code string address to HL +3628+ 1B05 C9 RET +3629+ 1B06 +3630+ 1B06 C8 SCALPL: RET Z ; Exit if no scaling needed +3631+ 1B07 F5 MULTEN: PUSH AF ; Save count +3632+ 1B08 CD 93 19 CALL MLSP10 ; Multiply number by 10 +3633+ 1B0B F1 POP AF ; Restore count +3634+ 1B0C 3D DEC A ; Count multiplies +3635+ 1B0D C9 RET +3636+ 1B0E +3637+ 1B0E D5 ADDIG: PUSH DE ; Save sign of exponent +3638+ 1B0F 57 LD D,A ; Save digit +3639+ 1B10 78 LD A,B ; Get digits after point +3640+ 1B11 89 ADC A,C ; Add one if after point +3641+ 1B12 47 LD B,A ; Re-save counter +3642+ 1B13 C5 PUSH BC ; Save point flags +3643+ 1B14 E5 PUSH HL ; Save code string address +3644+ 1B15 D5 PUSH DE ; Save digit +3645+ 1B16 CD 93 19 CALL MLSP10 ; Multiply number by 10 +3646+ 1B19 F1 POP AF ; Restore digit +3647+ 1B1A D6 30 SUB '0' ; Make it absolute +3648+ 1B1C CD 25 1B CALL RSCALE ; Re-scale number +3649+ 1B1F E1 POP HL ; Restore code string address +3650+ 1B20 C1 POP BC ; Restore point flags +3651+ 1B21 D1 POP DE ; Restore sign of exponent +3652+ 1B22 C3 C5 1A JP MANLP ; Get another digit +3653+ 1B25 +3654+ 1B25 CD DB 19 RSCALE: CALL STAKFP ; Put number on stack +3655+ 1B28 CD BC 19 CALL FLGREL ; Digit to add to FPREG +3656+ 1B2B C1 PADD: POP BC ; Restore number +3657+ 1B2C D1 POP DE +3658+ 1B2D C3 64 17 JP FPADD ; Add BCDE to FPREG and return +3659+ 1B30 +3660+ 1B30 7B EDIGIT: LD A,E ; Get digit +3661+ 1B31 07 RLCA ; Times 2 +3662+ 1B32 07 RLCA ; Times 4 +3663+ 1B33 83 ADD A,E ; Times 5 +3664+ 1B34 07 RLCA ; Times 10 +3665+ 1B35 86 ADD A,(HL) ; Add next digit +3666+ 1B36 D6 30 SUB '0' ; Make it absolute +3667+ 1B38 5F LD E,A ; Save new digit +3668+ 1B39 C3 DB 1A JP EXPLP ; Look for another digit +3669+ 1B3C +3670+ 1B3C E5 LINEIN: PUSH HL ; Save code string address +3671+ 1B3D 21 9B 06 LD HL,INMSG ; Output " in " +3672+ 1B40 CD A1 14 CALL PRS ; Output string at HL +3673+ 1B43 E1 POP HL ; Restore code string address +3674+ 1B44 EB PRNTHL: EX DE,HL ; Code string address to DE +3675+ 1B45 AF XOR A +3676+ 1B46 06 98 LD B,80H+24 ; 24 bits +3677+ 1B48 CD C1 19 CALL RETINT ; Return the integer +3678+ 1B4B 21 A0 14 LD HL,PRNUMS ; Print number string +3679+ 1B4E E5 PUSH HL ; Save for return +3680+ 1B4F 21 99 31 NUMASC: LD HL,PBUFF ; Convert number to ASCII +3681+ 1B52 E5 PUSH HL ; Save for return +3682+ 1B53 CD AA 19 CALL TSTSGN ; Test sign of FPREG +3683+ 1B56 36 20 LD (HL),' ' ; Space at start +3684+ 1B58 F2 5D 1B JP P,SPCFST ; Positive - Space to start +3685+ 1B5B 36 2D LD (HL),'-' ; '-' sign at start +3686+ 1B5D 23 SPCFST: INC HL ; First byte of number +3687+ 1B5E 36 30 LD (HL),'0' ; '0' if zero +3688+ 1B60 CA 13 1C JP Z,JSTZER ; Return '0' if zero +3689+ 1B63 E5 PUSH HL ; Save buffer address +3690+ 1B64 FC D3 19 CALL M,INVSGN ; Negate FPREG if negative +3691+ 1B67 AF XOR A ; Zero A +3692+ 1B68 F5 PUSH AF ; Save it +3693+ 1B69 CD 19 1C CALL RNGTST ; Test number is in range +3694+ 1B6C 01 43 91 SIXDIG: LD BC,9143H ; BCDE - 99999.9 +3695+ 1B6F 11 F8 4F LD DE,4FF8H +3696+ 1B72 CD 25 1A CALL CMPNUM ; Compare numbers +3697+ 1B75 B7 OR A +3698+ 1B76 E2 8A 1B JP PO,INRNG ; > 99999.9 - Sort it out +3699+ 1B79 F1 POP AF ; Restore count +3700+ 1B7A CD 07 1B CALL MULTEN ; Multiply by ten +3701+ 1B7D F5 PUSH AF ; Re-save count +3702+ 1B7E C3 6C 1B JP SIXDIG ; Test it again +3703+ 1B81 +3704+ 1B81 CD F2 18 GTSIXD: CALL DIV10 ; Divide by 10 +3705+ 1B84 F1 POP AF ; Get count +3706+ 1B85 3C INC A ; Count divides +3707+ 1B86 F5 PUSH AF ; Re-save count +3708+ 1B87 CD 19 1C CALL RNGTST ; Test number is in range +3709+ 1B8A CD 52 17 INRNG: CALL ROUND ; Add 0.5 to FPREG +3710+ 1B8D 3C INC A +3711+ 1B8E CD 52 1A CALL FPINT ; F.P to integer +3712+ 1B91 CD EB 19 CALL FPBCDE ; Move BCDE to FPREG +3713+ 1B94 01 06 03 LD BC,0306H ; 1E+06 to 1E-03 range +3714+ 1B97 F1 POP AF ; Restore count +3715+ 1B98 81 ADD A,C ; 6 digits before point +3716+ 1B99 3C INC A ; Add one +3717+ 1B9A FA A6 1B JP M,MAKNUM ; Do it in 'E' form if < 1E-02 +3718+ 1B9D FE 08 CP 6+1+1 ; More than 999999 ? +3719+ 1B9F D2 A6 1B JP NC,MAKNUM ; Yes - Do it in 'E' form +3720+ 1BA2 3C INC A ; Adjust for exponent +3721+ 1BA3 47 LD B,A ; Exponent of number +3722+ 1BA4 3E 02 LD A,2 ; Make it zero after +3723+ 1BA6 +3724+ 1BA6 3D MAKNUM: DEC A ; Adjust for digits to do +3725+ 1BA7 3D DEC A +3726+ 1BA8 E1 POP HL ; Restore buffer address +3727+ 1BA9 F5 PUSH AF ; Save count +3728+ 1BAA 11 2C 1C LD DE,POWERS ; Powers of ten +3729+ 1BAD 05 DEC B ; Count digits before point +3730+ 1BAE C2 B7 1B JP NZ,DIGTXT ; Not zero - Do number +3731+ 1BB1 36 2E LD (HL),'.' ; Save point +3732+ 1BB3 23 INC HL ; Move on +3733+ 1BB4 36 30 LD (HL),'0' ; Save zero +3734+ 1BB6 23 INC HL ; Move on +3735+ 1BB7 05 DIGTXT: DEC B ; Count digits before point +3736+ 1BB8 36 2E LD (HL),'.' ; Save point in case +3737+ 1BBA CC 00 1A CALL Z,INCHL ; Last digit - move on +3738+ 1BBD C5 PUSH BC ; Save digits before point +3739+ 1BBE E5 PUSH HL ; Save buffer address +3740+ 1BBF D5 PUSH DE ; Save powers of ten +3741+ 1BC0 CD F6 19 CALL BCDEFP ; Move FPREG to BCDE +3742+ 1BC3 E1 POP HL ; Powers of ten table +3743+ 1BC4 06 2F LD B, '0'-1 ; ASCII '0' - 1 +3744+ 1BC6 04 TRYAGN: INC B ; Count subtractions +3745+ 1BC7 7B LD A,E ; Get LSB +3746+ 1BC8 96 SUB (HL) ; Subtract LSB +3747+ 1BC9 5F LD E,A ; Save LSB +3748+ 1BCA 23 INC HL +3749+ 1BCB 7A LD A,D ; Get NMSB +3750+ 1BCC 9E SBC A,(HL) ; Subtract NMSB +3751+ 1BCD 57 LD D,A ; Save NMSB +3752+ 1BCE 23 INC HL +3753+ 1BCF 79 LD A,C ; Get MSB +3754+ 1BD0 9E SBC A,(HL) ; Subtract MSB +3755+ 1BD1 4F LD C,A ; Save MSB +3756+ 1BD2 2B DEC HL ; Point back to start +3757+ 1BD3 2B DEC HL +3758+ 1BD4 D2 C6 1B JP NC,TRYAGN ; No overflow - Try again +3759+ 1BD7 CD 09 18 CALL PLUCDE ; Restore number +3760+ 1BDA 23 INC HL ; Start of next number +3761+ 1BDB CD EB 19 CALL FPBCDE ; Move BCDE to FPREG +3762+ 1BDE EB EX DE,HL ; Save point in table +3763+ 1BDF E1 POP HL ; Restore buffer address +3764+ 1BE0 70 LD (HL),B ; Save digit in buffer +3765+ 1BE1 23 INC HL ; And move on +3766+ 1BE2 C1 POP BC ; Restore digit count +3767+ 1BE3 0D DEC C ; Count digits +3768+ 1BE4 C2 B7 1B JP NZ,DIGTXT ; More - Do them +3769+ 1BE7 05 DEC B ; Any decimal part? +3770+ 1BE8 CA F7 1B JP Z,DOEBIT ; No - Do 'E' bit +3771+ 1BEB 2B SUPTLZ: DEC HL ; Move back through buffer +3772+ 1BEC 7E LD A,(HL) ; Get character +3773+ 1BED FE 30 CP '0' ; '0' character? +3774+ 1BEF CA EB 1B JP Z,SUPTLZ ; Yes - Look back for more +3775+ 1BF2 FE 2E CP '.' ; A decimal point? +3776+ 1BF4 C4 00 1A CALL NZ,INCHL ; Move back over digit +3777+ 1BF7 +3778+ 1BF7 F1 DOEBIT: POP AF ; Get 'E' flag +3779+ 1BF8 CA 16 1C JP Z,NOENED ; No 'E' needed - End buffer +3780+ 1BFB 36 45 LD (HL),'E' ; Put 'E' in buffer +3781+ 1BFD 23 INC HL ; And move on +3782+ 1BFE 36 2B LD (HL),'+' ; Put '+' in buffer +3783+ 1C00 F2 07 1C JP P,OUTEXP ; Positive - Output exponent +3784+ 1C03 36 2D LD (HL),'-' ; Put '-' in buffer +3785+ 1C05 2F CPL ; Negate exponent +3786+ 1C06 3C INC A +3787+ 1C07 06 2F OUTEXP: LD B,'0'-1 ; ASCII '0' - 1 +3788+ 1C09 04 EXPTEN: INC B ; Count subtractions +3789+ 1C0A D6 0A SUB 10 ; Tens digit +3790+ 1C0C D2 09 1C JP NC,EXPTEN ; More to do +3791+ 1C0F C6 3A ADD A,'0'+10 ; Restore and make ASCII +3792+ 1C11 23 INC HL ; Move on +3793+ 1C12 70 LD (HL),B ; Save MSB of exponent +3794+ 1C13 23 JSTZER: INC HL ; +3795+ 1C14 77 LD (HL),A ; Save LSB of exponent +3796+ 1C15 23 INC HL +3797+ 1C16 71 NOENED: LD (HL),C ; Mark end of buffer +3798+ 1C17 E1 POP HL ; Restore code string address +3799+ 1C18 C9 RET +3800+ 1C19 +3801+ 1C19 01 74 94 RNGTST: LD BC,9474H ; BCDE = 999999. +3802+ 1C1C 11 F7 23 LD DE,23F7H +3803+ 1C1F CD 25 1A CALL CMPNUM ; Compare numbers +3804+ 1C22 B7 OR A +3805+ 1C23 E1 POP HL ; Return address to HL +3806+ 1C24 E2 81 1B JP PO,GTSIXD ; Too big - Divide by ten +3807+ 1C27 E9 JP (HL) ; Otherwise return to caller +3808+ 1C28 +3809+ 1C28 00 00 00 80 HALF: .BYTE 00H,00H,00H,80H ; 0.5 +3810+ 1C2C +3811+ 1C2C A0 86 01 POWERS: .BYTE 0A0H,086H,001H ; 100000 +3812+ 1C2F 10 27 00 .BYTE 010H,027H,000H ; 10000 +3813+ 1C32 E8 03 00 .BYTE 0E8H,003H,000H ; 1000 +3814+ 1C35 64 00 00 .BYTE 064H,000H,000H ; 100 +3815+ 1C38 0A 00 00 .BYTE 00AH,000H,000H ; 10 +3816+ 1C3B 01 00 00 .BYTE 001H,000H,000H ; 1 +3817+ 1C3E +3818+ 1C3E 21 D3 19 NEGAFT: LD HL,INVSGN ; Negate result +3819+ 1C41 E3 EX (SP),HL ; To be done after caller +3820+ 1C42 E9 JP (HL) ; Return to caller +3821+ 1C43 +3822+ 1C43 CD DB 19 SQR: CALL STAKFP ; Put value on stack +3823+ 1C46 21 28 1C LD HL,HALF ; Set power to 1/2 +3824+ 1C49 CD E8 19 CALL PHLTFP ; Move 1/2 to FPREG +3825+ 1C4C +3826+ 1C4C C1 POWER: POP BC ; Get base +3827+ 1C4D D1 POP DE +3828+ 1C4E CD AA 19 CALL TSTSGN ; Test sign of power +3829+ 1C51 78 LD A,B ; Get exponent of base +3830+ 1C52 CA 91 1C JP Z,EXP ; Make result 1 if zero +3831+ 1C55 F2 5C 1C JP P,POWER1 ; Positive base - Ok +3832+ 1C58 B7 OR A ; Zero to negative power? +3833+ 1C59 CA 06 07 JP Z,DZERR ; Yes - ?/0 Error +3834+ 1C5C B7 POWER1: OR A ; Base zero? +3835+ 1C5D CA CB 17 JP Z,SAVEXP ; Yes - Return zero +3836+ 1C60 D5 PUSH DE ; Save base +3837+ 1C61 C5 PUSH BC +3838+ 1C62 79 LD A,C ; Get MSB of base +3839+ 1C63 F6 7F OR 01111111B ; Get sign status +3840+ 1C65 CD F6 19 CALL BCDEFP ; Move power to BCDE +3841+ 1C68 F2 79 1C JP P,POWER2 ; Positive base - Ok +3842+ 1C6B D5 PUSH DE ; Save power +3843+ 1C6C C5 PUSH BC +3844+ 1C6D CD 7D 1A CALL INT ; Get integer of power +3845+ 1C70 C1 POP BC ; Restore power +3846+ 1C71 D1 POP DE +3847+ 1C72 F5 PUSH AF ; MSB of base +3848+ 1C73 CD 25 1A CALL CMPNUM ; Power an integer? +3849+ 1C76 E1 POP HL ; Restore MSB of base +3850+ 1C77 7C LD A,H ; but don't affect flags +3851+ 1C78 1F RRA ; Exponent odd or even? +3852+ 1C79 E1 POWER2: POP HL ; Restore MSB and exponent +3853+ 1C7A 22 96 31 LD (FPREG+2),HL ; Save base in FPREG +3854+ 1C7D E1 POP HL ; LSBs of base +3855+ 1C7E 22 94 31 LD (FPREG),HL ; Save in FPREG +3856+ 1C81 DC 3E 1C CALL C,NEGAFT ; Odd power - Negate result +3857+ 1C84 CC D3 19 CALL Z,INVSGN ; Negative base - Negate it +3858+ 1C87 D5 PUSH DE ; Save power +3859+ 1C88 C5 PUSH BC +3860+ 1C89 CD 5E 18 CALL LOG ; Get LOG of base +3861+ 1C8C C1 POP BC ; Restore power +3862+ 1C8D D1 POP DE +3863+ 1C8E CD 9F 18 CALL FPMULT ; Multiply LOG by power +3864+ 1C91 +3865+ 1C91 CD DB 19 EXP: CALL STAKFP ; Put value on stack +3866+ 1C94 01 38 81 LD BC,08138H ; BCDE = 1/Ln(2) +3867+ 1C97 11 3B AA LD DE,0AA3BH +3868+ 1C9A CD 9F 18 CALL FPMULT ; Multiply value by 1/LN(2) +3869+ 1C9D 3A 97 31 LD A,(FPEXP) ; Get exponent +3870+ 1CA0 FE 88 CP 80H+8 ; Is it in range? +3871+ 1CA2 D2 86 19 JP NC,OVTST1 ; No - Test for overflow +3872+ 1CA5 CD 7D 1A CALL INT ; Get INT of FPREG +3873+ 1CA8 C6 80 ADD A,80H ; For excess 128 +3874+ 1CAA C6 02 ADD A,2 ; Exponent > 126? +3875+ 1CAC DA 86 19 JP C,OVTST1 ; Yes - Test for overflow +3876+ 1CAF F5 PUSH AF ; Save scaling factor +3877+ 1CB0 21 4D 18 LD HL,UNITY ; Point to 1. +3878+ 1CB3 CD 55 17 CALL ADDPHL ; Add 1 to FPREG +3879+ 1CB6 CD 96 18 CALL MULLN2 ; Multiply by LN(2) +3880+ 1CB9 F1 POP AF ; Restore scaling factor +3881+ 1CBA C1 POP BC ; Restore exponent +3882+ 1CBB D1 POP DE +3883+ 1CBC F5 PUSH AF ; Save scaling factor +3884+ 1CBD CD 61 17 CALL SUBCDE ; Subtract exponent from FPREG +3885+ 1CC0 CD D3 19 CALL INVSGN ; Negate result +3886+ 1CC3 21 D1 1C LD HL,EXPTAB ; Coefficient table +3887+ 1CC6 CD 01 1D CALL SMSER1 ; Sum the series +3888+ 1CC9 11 00 00 LD DE,0 ; Zero LSBs +3889+ 1CCC C1 POP BC ; Scaling factor +3890+ 1CCD 4A LD C,D ; Zero MSB +3891+ 1CCE C3 9F 18 JP FPMULT ; Scale result to correct value +3892+ 1CD1 +3893+ 1CD1 08 EXPTAB: .BYTE 8 ; Table used by EXP +3894+ 1CD2 40 2E 94 74 .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040) +3895+ 1CD6 70 4F 2E 77 .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720) +3896+ 1CDA 6E 02 88 7A .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120) +3897+ 1CDE E6 A0 2A 7C .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24) +3898+ 1CE2 50 AA AA 7E .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6) +3899+ 1CE6 FF FF 7F 7F .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2) +3900+ 1CEA 00 00 80 81 .BYTE 000H,000H,080H,081H ; -1/1! (-1/1) +3901+ 1CEE 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1) +3902+ 1CF2 +3903+ 1CF2 CD DB 19 SUMSER: CALL STAKFP ; Put FPREG on stack +3904+ 1CF5 11 9D 18 LD DE,MULT ; Multiply by "X" +3905+ 1CF8 D5 PUSH DE ; To be done after +3906+ 1CF9 E5 PUSH HL ; Save address of table +3907+ 1CFA CD F6 19 CALL BCDEFP ; Move FPREG to BCDE +3908+ 1CFD CD 9F 18 CALL FPMULT ; Square the value +3909+ 1D00 E1 POP HL ; Restore address of table +3910+ 1D01 CD DB 19 SMSER1: CALL STAKFP ; Put value on stack +3911+ 1D04 7E LD A,(HL) ; Get number of coefficients +3912+ 1D05 23 INC HL ; Point to start of table +3913+ 1D06 CD E8 19 CALL PHLTFP ; Move coefficient to FPREG +3914+ 1D09 06 .BYTE 06H ; Skip "POP AF" +3915+ 1D0A F1 SUMLP: POP AF ; Restore count +3916+ 1D0B C1 POP BC ; Restore number +3917+ 1D0C D1 POP DE +3918+ 1D0D 3D DEC A ; Cont coefficients +3919+ 1D0E C8 RET Z ; All done +3920+ 1D0F D5 PUSH DE ; Save number +3921+ 1D10 C5 PUSH BC +3922+ 1D11 F5 PUSH AF ; Save count +3923+ 1D12 E5 PUSH HL ; Save address in table +3924+ 1D13 CD 9F 18 CALL FPMULT ; Multiply FPREG by BCDE +3925+ 1D16 E1 POP HL ; Restore address in table +3926+ 1D17 CD F9 19 CALL LOADFP ; Number at HL to BCDE +3927+ 1D1A E5 PUSH HL ; Save address in table +3928+ 1D1B CD 64 17 CALL FPADD ; Add coefficient to FPREG +3929+ 1D1E E1 POP HL ; Restore address in table +3930+ 1D1F C3 0A 1D JP SUMLP ; More coefficients +3931+ 1D22 +3932+ 1D22 CD AA 19 RND: CALL TSTSGN ; Test sign of FPREG +3933+ 1D25 21 C9 30 LD HL,SEED+2 ; Random number seed +3934+ 1D28 FA 83 1D JP M,RESEED ; Negative - Re-seed +3935+ 1D2B 21 EA 30 LD HL,LSTRND ; Last random number +3936+ 1D2E CD E8 19 CALL PHLTFP ; Move last RND to FPREG +3937+ 1D31 21 C9 30 LD HL,SEED+2 ; Random number seed +3938+ 1D34 C8 RET Z ; Return if RND(0) +3939+ 1D35 86 ADD A,(HL) ; Add (SEED)+2) +3940+ 1D36 E6 07 AND 00000111B ; 0 to 7 +3941+ 1D38 06 00 LD B,0 +3942+ 1D3A 77 LD (HL),A ; Re-save seed +3943+ 1D3B 23 INC HL ; Move to coefficient table +3944+ 1D3C 87 ADD A,A ; 4 bytes +3945+ 1D3D 87 ADD A,A ; per entry +3946+ 1D3E 4F LD C,A ; BC = Offset into table +3947+ 1D3F 09 ADD HL,BC ; Point to coefficient +3948+ 1D40 CD F9 19 CALL LOADFP ; Coefficient to BCDE +3949+ 1D43 CD 9F 18 CALL FPMULT ; ; Multiply FPREG by coefficient +3950+ 1D46 3A C8 30 LD A,(SEED+1) ; Get (SEED+1) +3951+ 1D49 3C INC A ; Add 1 +3952+ 1D4A E6 03 AND 00000011B ; 0 to 3 +3953+ 1D4C 06 00 LD B,0 +3954+ 1D4E FE 01 CP 1 ; Is it zero? +3955+ 1D50 88 ADC A,B ; Yes - Make it 1 +3956+ 1D51 32 C8 30 LD (SEED+1),A ; Re-save seed +3957+ 1D54 21 87 1D LD HL,RNDTAB-4 ; Addition table +3958+ 1D57 87 ADD A,A ; 4 bytes +3959+ 1D58 87 ADD A,A ; per entry +3960+ 1D59 4F LD C,A ; BC = Offset into table +3961+ 1D5A 09 ADD HL,BC ; Point to value +3962+ 1D5B CD 55 17 CALL ADDPHL ; Add value to FPREG +3963+ 1D5E CD F6 19 RND1: CALL BCDEFP ; Move FPREG to BCDE +3964+ 1D61 7B LD A,E ; Get LSB +3965+ 1D62 59 LD E,C ; LSB = MSB +3966+ 1D63 EE 4F XOR 01001111B ; Fiddle around +3967+ 1D65 4F LD C,A ; New MSB +3968+ 1D66 36 80 LD (HL),80H ; Set exponent +3969+ 1D68 2B DEC HL ; Point to MSB +3970+ 1D69 46 LD B,(HL) ; Get MSB +3971+ 1D6A 36 80 LD (HL),80H ; Make value -0.5 +3972+ 1D6C 21 C7 30 LD HL,SEED ; Random number seed +3973+ 1D6F 34 INC (HL) ; Count seed +3974+ 1D70 7E LD A,(HL) ; Get seed +3975+ 1D71 D6 AB SUB 171 ; Do it modulo 171 +3976+ 1D73 C2 7A 1D JP NZ,RND2 ; Non-zero - Ok +3977+ 1D76 77 LD (HL),A ; Zero seed +3978+ 1D77 0C INC C ; Fillde about +3979+ 1D78 15 DEC D ; with the +3980+ 1D79 1C INC E ; number +3981+ 1D7A CD B5 17 RND2: CALL BNORM ; Normalise number +3982+ 1D7D 21 EA 30 LD HL,LSTRND ; Save random number +3983+ 1D80 C3 02 1A JP FPTHL ; Move FPREG to last and return +3984+ 1D83 +3985+ 1D83 77 RESEED: LD (HL),A ; Re-seed random numbers +3986+ 1D84 2B DEC HL +3987+ 1D85 77 LD (HL),A +3988+ 1D86 2B DEC HL +3989+ 1D87 77 LD (HL),A +3990+ 1D88 C3 5E 1D JP RND1 ; Return RND seed +3991+ 1D8B +3992+ 1D8B 68 B1 46 68 RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND +3993+ 1D8F 99 E9 92 69 .BYTE 099H,0E9H,092H,069H +3994+ 1D93 10 D1 75 68 .BYTE 010H,0D1H,075H,068H +3995+ 1D97 +3996+ 1D97 21 E1 1D COS: LD HL,HALFPI ; Point to PI/2 +3997+ 1D9A CD 55 17 CALL ADDPHL ; Add it to PPREG +3998+ 1D9D CD DB 19 SIN: CALL STAKFP ; Put angle on stack +3999+ 1DA0 01 49 83 LD BC,8349H ; BCDE = 2 PI +4000+ 1DA3 11 DB 0F LD DE,0FDBH +4001+ 1DA6 CD EB 19 CALL FPBCDE ; Move 2 PI to FPREG +4002+ 1DA9 C1 POP BC ; Restore angle +4003+ 1DAA D1 POP DE +4004+ 1DAB CD 00 19 CALL DVBCDE ; Divide angle by 2 PI +4005+ 1DAE CD DB 19 CALL STAKFP ; Put it on stack +4006+ 1DB1 CD 7D 1A CALL INT ; Get INT of result +4007+ 1DB4 C1 POP BC ; Restore number +4008+ 1DB5 D1 POP DE +4009+ 1DB6 CD 61 17 CALL SUBCDE ; Make it 0 <= value < 1 +4010+ 1DB9 21 E5 1D LD HL,QUARTR ; Point to 0.25 +4011+ 1DBC CD 5B 17 CALL SUBPHL ; Subtract value from 0.25 +4012+ 1DBF CD AA 19 CALL TSTSGN ; Test sign of value +4013+ 1DC2 37 SCF ; Flag positive +4014+ 1DC3 F2 CD 1D JP P,SIN1 ; Positive - Ok +4015+ 1DC6 CD 52 17 CALL ROUND ; Add 0.5 to value +4016+ 1DC9 CD AA 19 CALL TSTSGN ; Test sign of value +4017+ 1DCC B7 OR A ; Flag negative +4018+ 1DCD F5 SIN1: PUSH AF ; Save sign +4019+ 1DCE F4 D3 19 CALL P,INVSGN ; Negate value if positive +4020+ 1DD1 21 E5 1D LD HL,QUARTR ; Point to 0.25 +4021+ 1DD4 CD 55 17 CALL ADDPHL ; Add 0.25 to value +4022+ 1DD7 F1 POP AF ; Restore sign +4023+ 1DD8 D4 D3 19 CALL NC,INVSGN ; Negative - Make positive +4024+ 1DDB 21 E9 1D LD HL,SINTAB ; Coefficient table +4025+ 1DDE C3 F2 1C JP SUMSER ; Evaluate sum of series +4026+ 1DE1 +4027+ 1DE1 DB 0F 49 81 HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2) +4028+ 1DE5 +4029+ 1DE5 00 00 00 7F QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25 +4030+ 1DE9 +4031+ 1DE9 05 SINTAB: .BYTE 5 ; Table used by SIN +4032+ 1DEA BA D7 1E 86 .BYTE 0BAH,0D7H,01EH,086H ; 39.711 +4033+ 1DEE 64 26 99 87 .BYTE 064H,026H,099H,087H ;-76.575 +4034+ 1DF2 58 34 23 87 .BYTE 058H,034H,023H,087H ; 81.602 +4035+ 1DF6 E0 5D A5 86 .BYTE 0E0H,05DH,0A5H,086H ;-41.342 +4036+ 1DFA DA 0F 49 83 .BYTE 0DAH,00FH,049H,083H ; 6.2832 +4037+ 1DFE +4038+ 1DFE CD DB 19 TAN: CALL STAKFP ; Put angle on stack +4039+ 1E01 CD 9D 1D CALL SIN ; Get SIN of angle +4040+ 1E04 C1 POP BC ; Restore angle +4041+ 1E05 E1 POP HL +4042+ 1E06 CD DB 19 CALL STAKFP ; Save SIN of angle +4043+ 1E09 EB EX DE,HL ; BCDE = Angle +4044+ 1E0A CD EB 19 CALL FPBCDE ; Angle to FPREG +4045+ 1E0D CD 97 1D CALL COS ; Get COS of angle +4046+ 1E10 C3 FE 18 JP DIV ; TAN = SIN / COS +4047+ 1E13 +4048+ 1E13 CD AA 19 ATN: CALL TSTSGN ; Test sign of value +4049+ 1E16 FC 3E 1C CALL M,NEGAFT ; Negate result after if -ve +4050+ 1E19 FC D3 19 CALL M,INVSGN ; Negate value if -ve +4051+ 1E1C 3A 97 31 LD A,(FPEXP) ; Get exponent +4052+ 1E1F FE 81 CP 81H ; Number less than 1? +4053+ 1E21 DA 30 1E JP C,ATN1 ; Yes - Get arc tangnt +4054+ 1E24 01 00 81 LD BC,8100H ; BCDE = 1 +4055+ 1E27 51 LD D,C +4056+ 1E28 59 LD E,C +4057+ 1E29 CD 00 19 CALL DVBCDE ; Get reciprocal of number +4058+ 1E2C 21 5B 17 LD HL,SUBPHL ; Sub angle from PI/2 +4059+ 1E2F E5 PUSH HL ; Save for angle > 1 +4060+ 1E30 21 3A 1E ATN1: LD HL,ATNTAB ; Coefficient table +4061+ 1E33 CD F2 1C CALL SUMSER ; Evaluate sum of series +4062+ 1E36 21 E1 1D LD HL,HALFPI ; PI/2 - angle in case > 1 +4063+ 1E39 C9 RET ; Number > 1 - Sub from PI/2 +4064+ 1E3A +4065+ 1E3A 09 ATNTAB: .BYTE 9 ; Table used by ATN +4066+ 1E3B 4A D7 3B 78 .BYTE 04AH,0D7H,03BH,078H ; 1/17 +4067+ 1E3F 02 6E 84 7B .BYTE 002H,06EH,084H,07BH ;-1/15 +4068+ 1E43 FE C1 2F 7C .BYTE 0FEH,0C1H,02FH,07CH ; 1/13 +4069+ 1E47 74 31 9A 7D .BYTE 074H,031H,09AH,07DH ;-1/11 +4070+ 1E4B 84 3D 5A 7D .BYTE 084H,03DH,05AH,07DH ; 1/9 +4071+ 1E4F C8 7F 91 7E .BYTE 0C8H,07FH,091H,07EH ;-1/7 +4072+ 1E53 E4 BB 4C 7E .BYTE 0E4H,0BBH,04CH,07EH ; 1/5 +4073+ 1E57 6C AA AA 7F .BYTE 06CH,0AAH,0AAH,07FH ;-1/3 +4074+ 1E5B 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/1 +4075+ 1E5F +4076+ 1E5F +4077+ 1E5F C9 ARET: RET ; A RETurn instruction +4078+ 1E60 +4079+ 1E60 D7 GETINP: RST 10H ;input a character +4080+ 1E61 C9 RET +4081+ 1E62 +4082+ 1E62 CLS: +4083+ 1E62 3E 0C LD A,CS ; ASCII Clear screen +4084+ 1E64 C3 9C 1F JP MONOUT ; Output character +4085+ 1E67 +4086+ 1E67 CD 29 17 WIDTH: CALL GETINT ; Get integer 0-255 +4087+ 1E6A 7B LD A,E ; Width to A +4088+ 1E6B 32 F2 30 LD (LWIDTH),A ; Set width +4089+ 1E6E C9 RET +4090+ 1E6F +4091+ 1E6F CD C8 0F LINES: CALL GETNUM ; Get a number +4092+ 1E72 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 +4093+ 1E75 ED 53 F6 30 LD (LINESC),DE ; Set lines counter +4094+ 1E79 ED 53 F8 30 LD (LINESN),DE ; Set lines number +4095+ 1E7D C9 RET +4096+ 1E7E +4097+ 1E7E CD 0D 0C DEEK: CALL DEINT ; Get integer -32768 to 32767 +4098+ 1E81 D5 PUSH DE ; Save number +4099+ 1E82 E1 POP HL ; Number to HL +4100+ 1E83 46 LD B,(HL) ; Get LSB of contents +4101+ 1E84 23 INC HL +4102+ 1E85 7E LD A,(HL) ; Get MSB of contents +4103+ 1E86 C3 83 13 JP ABPASS ; Return integer AB +4104+ 1E89 +4105+ 1E89 CD C8 0F DOKE: CALL GETNUM ; Get a number +4106+ 1E8C CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 +4107+ 1E8F D5 PUSH DE ; Save address +4108+ 1E90 CD D1 09 CALL CHKSYN ; Make sure ',' follows +4109+ 1E93 2C .BYTE ',' +4110+ 1E94 CD C8 0F CALL GETNUM ; Get a number +4111+ 1E97 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 +4112+ 1E9A E3 EX (SP),HL ; Save value,get address +4113+ 1E9B 73 LD (HL),E ; Save LSB of value +4114+ 1E9C 23 INC HL +4115+ 1E9D 72 LD (HL),D ; Save MSB of value +4116+ 1E9E E1 POP HL ; Restore code string address +4117+ 1E9F C9 RET +4118+ 1EA0 +4119+ 1EA0 +4120+ 1EA0 ; HEX$(nn) Convert 16 bit number to Hexadecimal string +4121+ 1EA0 +4122+ 1EA0 CD CB 0F HEX: CALL TSTNUM ; Verify it's a number +4123+ 1EA3 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 +4124+ 1EA6 C5 PUSH BC ; Save contents of BC +4125+ 1EA7 21 99 31 LD HL,PBUFF +4126+ 1EAA 7A LD A,D ; Get high order into A +4127+ 1EAB FE 00 CP $0 +4128+ 1EAD 28 0C JR Z,HEX2 ; Skip output if both high digits are zero +4129+ 1EAF CD D8 1E CALL BYT2ASC ; Convert D to ASCII +4130+ 1EB2 78 LD A,B +4131+ 1EB3 FE 30 CP '0' +4132+ 1EB5 28 02 JR Z,HEX1 ; Don't store high digit if zero +4133+ 1EB7 70 LD (HL),B ; Store it to PBUFF +4134+ 1EB8 23 INC HL ; Next location +4135+ 1EB9 71 HEX1: LD (HL),C ; Store C to PBUFF+1 +4136+ 1EBA 23 INC HL ; Next location +4137+ 1EBB 7B HEX2: LD A,E ; Get lower byte +4138+ 1EBC CD D8 1E CALL BYT2ASC ; Convert E to ASCII +4139+ 1EBF 7A LD A,D +4140+ 1EC0 FE 00 CP $0 +4141+ 1EC2 20 05 JR NZ,HEX3 ; If upper byte was not zero then always print lower byte +4142+ 1EC4 78 LD A,B +4143+ 1EC5 FE 30 CP '0' ; If high digit of lower byte is zero then don't print +4144+ 1EC7 28 02 JR Z,HEX4 +4145+ 1EC9 70 HEX3: LD (HL),B ; to PBUFF+2 +4146+ 1ECA 23 INC HL ; Next location +4147+ 1ECB 71 HEX4: LD (HL),C ; to PBUFF+3 +4148+ 1ECC 23 INC HL ; PBUFF+4 to zero +4149+ 1ECD AF XOR A ; Terminating character +4150+ 1ECE 77 LD (HL),A ; Store zero to terminate +4151+ 1ECF 23 INC HL ; Make sure PBUFF is terminated +4152+ 1ED0 77 LD (HL),A ; Store the double zero there +4153+ 1ED1 C1 POP BC ; Get BC back +4154+ 1ED2 21 99 31 LD HL,PBUFF ; Reset to start of PBUFF +4155+ 1ED5 C3 31 14 JP STR1 ; Convert the PBUFF to a string and return it +4156+ 1ED8 +4157+ 1ED8 47 BYT2ASC LD B,A ; Save original value +4158+ 1ED9 E6 0F AND $0F ; Strip off upper nybble +4159+ 1EDB FE 0A CP $0A ; 0-9? +4160+ 1EDD 38 02 JR C,ADD30 ; If A-F, add 7 more +4161+ 1EDF C6 07 ADD A,$07 ; Bring value up to ASCII A-F +4162+ 1EE1 C6 30 ADD30 ADD A,$30 ; And make ASCII +4163+ 1EE3 4F LD C,A ; Save converted char to C +4164+ 1EE4 78 LD A,B ; Retrieve original value +4165+ 1EE5 0F RRCA ; and Rotate it right +4166+ 1EE6 0F RRCA +4167+ 1EE7 0F RRCA +4168+ 1EE8 0F RRCA +4169+ 1EE9 E6 0F AND $0F ; Mask off upper nybble +4170+ 1EEB FE 0A CP $0A ; 0-9? < A hex? +4171+ 1EED 38 02 JR C,ADD301 ; Skip Add 7 +4172+ 1EEF C6 07 ADD A,$07 ; Bring it up to ASCII A-F +4173+ 1EF1 C6 30 ADD301 ADD A,$30 ; And make it full ASCII +4174+ 1EF3 47 LD B,A ; Store high order byte +4175+ 1EF4 C9 RET +4176+ 1EF5 +4177+ 1EF5 ; Convert "&Hnnnn" to FPREG +4178+ 1EF5 ; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" +4179+ 1EF5 ; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 +4180+ 1EF5 EB HEXTFP EX DE,HL ; Move code string pointer to DE +4181+ 1EF6 21 00 00 LD HL,$0000 ; Zero out the value +4182+ 1EF9 CD 0E 1F CALL GETHEX ; Check the number for valid hex +4183+ 1EFC DA 2E 1F JP C,HXERR ; First value wasn't hex, HX error +4184+ 1EFF 18 05 JR HEXLP1 ; Convert first character +4185+ 1F01 CD 0E 1F HEXLP CALL GETHEX ; Get second and addtional characters +4186+ 1F04 38 1F JR C,HEXIT ; Exit if not a hex character +4187+ 1F06 29 HEXLP1 ADD HL,HL ; Rotate 4 bits to the left +4188+ 1F07 29 ADD HL,HL +4189+ 1F08 29 ADD HL,HL +4190+ 1F09 29 ADD HL,HL +4191+ 1F0A B5 OR L ; Add in D0-D3 into L +4192+ 1F0B 6F LD L,A ; Save new value +4193+ 1F0C 18 F3 JR HEXLP ; And continue until all hex characters are in +4194+ 1F0E +4195+ 1F0E 13 GETHEX INC DE ; Next location +4196+ 1F0F 1A LD A,(DE) ; Load character at pointer +4197+ 1F10 FE 20 CP ' ' +4198+ 1F12 CA 0E 1F JP Z,GETHEX ; Skip spaces +4199+ 1F15 D6 30 SUB $30 ; Get absolute value +4200+ 1F17 D8 RET C ; < "0", error +4201+ 1F18 FE 0A CP $0A +4202+ 1F1A 38 05 JR C,NOSUB7 ; Is already in the range 0-9 +4203+ 1F1C D6 07 SUB $07 ; Reduce to A-F +4204+ 1F1E FE 0A CP $0A ; Value should be $0A-$0F at this point +4205+ 1F20 D8 RET C ; CY set if was : ; < = > ? @ +4206+ 1F21 FE 10 NOSUB7 CP $10 ; > Greater than "F"? +4207+ 1F23 3F CCF +4208+ 1F24 C9 RET ; CY set if it wasn't valid hex +4209+ 1F25 +4210+ 1F25 EB HEXIT EX DE,HL ; Value into DE, Code string into HL +4211+ 1F26 7A LD A,D ; Load DE into AC +4212+ 1F27 4B LD C,E ; For prep to +4213+ 1F28 E5 PUSH HL +4214+ 1F29 CD 82 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG +4215+ 1F2C E1 POP HL +4216+ 1F2D C9 RET +4217+ 1F2E +4218+ 1F2E 1E 26 HXERR: LD E,HX ; ?HEX Error +4219+ 1F30 C3 17 07 JP ERROR +4220+ 1F33 +4221+ 1F33 ; BIN$(NN) Convert integer to a 1-16 char binary string +4222+ 1F33 CD CB 0F BIN: CALL TSTNUM ; Verify it's a number +4223+ 1F36 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 +4224+ 1F39 C5 BIN2: PUSH BC ; Save contents of BC +4225+ 1F3A 21 99 31 LD HL,PBUFF +4226+ 1F3D 06 11 LD B,17 ; One higher than max char count +4227+ 1F3F ZEROSUP: ; Suppress leading zeros +4228+ 1F3F 05 DEC B ; Max 16 chars +4229+ 1F40 78 LD A,B +4230+ 1F41 FE 01 CP $01 +4231+ 1F43 28 08 JR Z,BITOUT ; Always output at least one character +4232+ 1F45 CB 13 RL E +4233+ 1F47 CB 12 RL D +4234+ 1F49 30 F4 JR NC,ZEROSUP +4235+ 1F4B 18 04 JR BITOUT2 +4236+ 1F4D BITOUT: +4237+ 1F4D CB 13 RL E +4238+ 1F4F CB 12 RL D ; Top bit now in carry +4239+ 1F51 BITOUT2: +4240+ 1F51 3E 30 LD A,'0' ; Char for '0' +4241+ 1F53 CE 00 ADC A,0 ; If carry set then '0' --> '1' +4242+ 1F55 77 LD (HL),A +4243+ 1F56 23 INC HL +4244+ 1F57 05 DEC B +4245+ 1F58 20 F3 JR NZ,BITOUT +4246+ 1F5A AF XOR A ; Terminating character +4247+ 1F5B 77 LD (HL),A ; Store zero to terminate +4248+ 1F5C 23 INC HL ; Make sure PBUFF is terminated +4249+ 1F5D 77 LD (HL),A ; Store the double zero there +4250+ 1F5E C1 POP BC +4251+ 1F5F 21 99 31 LD HL,PBUFF +4252+ 1F62 C3 31 14 JP STR1 +4253+ 1F65 +4254+ 1F65 ; Convert "&Bnnnn" to FPREG +4255+ 1F65 ; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" +4256+ 1F65 EB BINTFP: EX DE,HL ; Move code string pointer to DE +4257+ 1F66 21 00 00 LD HL,$0000 ; Zero out the value +4258+ 1F69 CD 82 1F CALL CHKBIN ; Check the number for valid bin +4259+ 1F6C DA 90 1F JP C,BINERR ; First value wasn't bin, HX error +4260+ 1F6F D6 30 BINIT: SUB '0' +4261+ 1F71 29 ADD HL,HL ; Rotate HL left +4262+ 1F72 B5 OR L +4263+ 1F73 6F LD L,A +4264+ 1F74 CD 82 1F CALL CHKBIN ; Get second and addtional characters +4265+ 1F77 30 F6 JR NC,BINIT ; Process if a bin character +4266+ 1F79 EB EX DE,HL ; Value into DE, Code string into HL +4267+ 1F7A 7A LD A,D ; Load DE into AC +4268+ 1F7B 4B LD C,E ; For prep to +4269+ 1F7C E5 PUSH HL +4270+ 1F7D CD 82 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG +4271+ 1F80 E1 POP HL +4272+ 1F81 C9 RET +4273+ 1F82 +4274+ 1F82 ; Char is in A, NC if char is 0 or 1 +4275+ 1F82 13 CHKBIN: INC DE +4276+ 1F83 1A LD A,(DE) +4277+ 1F84 FE 20 CP ' ' +4278+ 1F86 CA 82 1F JP Z,CHKBIN ; Skip spaces +4279+ 1F89 FE 30 CP '0' ; Set C if < '0' +4280+ 1F8B D8 RET C +4281+ 1F8C FE 32 CP '2' +4282+ 1F8E 3F CCF ; Set C if > '1' +4283+ 1F8F C9 RET +4284+ 1F90 +4285+ 1F90 1E 28 BINERR: LD E,BN ; ?BIN Error +4286+ 1F92 C3 17 07 JP ERROR +4287+ 1F95 +4288+ 1F95 +4289+ 1F95 JJUMP1: +4290+ 1F95 DD 21 FF FF LD IX,-1 ; Flag cold start +4291+ 1F99 C3 67 03 JP CSTART ; Go and initialise +4292+ 1F9C +4293+ 1F9C MONOUT: +4294+ 1F9C C3 08 00 JP $0008 ; output a char +4295+ 1F9F +4296+ 1F9F +4297+ 1F9F MONITR: +4298+ 1F9F C3 00 00 JP $0000 ; Restart (Normally Monitor Start) +4299+ 1FA2 +4300+ 1FA2 +4301+ 1FA2 3E 00 INITST: LD A,0 ; Clear break flag +4302+ 1FA4 32 FD 30 LD (BRKFLG),A +4303+ 1FA7 C3 6E 03 JP INIT +4304+ 1FAA +4305+ 1FAA ED 45 ARETN: RETN ; Return from NMI +4306+ 1FAC +4307+ 1FAC +4308+ 1FAC F5 TSTBIT: PUSH AF ; Save bit mask +4309+ 1FAD A0 AND B ; Get common bits +4310+ 1FAE C1 POP BC ; Restore bit mask +4311+ 1FAF B8 CP B ; Same bit set? +4312+ 1FB0 3E 00 LD A,0 ; Return 0 in A +4313+ 1FB2 C9 RET +4314+ 1FB3 +4315+ 1FB3 CD DC 09 OUTNCR: CALL OUTC ; Output character in A +4316+ 1FB6 C3 03 0E JP PRNTCRLF ; Output CRLF +4317+ 1FB9 +0693 1FB9 .end +tasm: Number of errors = 0 diff --git a/Z80 CPM and bootloader (basmon)/tasm manual.pdf b/Z80 CPM and bootloader (basmon)/tasm manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4ff25867146a95a753f3fb8524c3be94b5fcfe84 GIT binary patch literal 487449 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%0AoIhHXws%7vMwPbnLt^CvOwB!EAft=!-zr@b? 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%0Agf;sBn0zOZtSk;NV9QV8XF?(|{Q=A_%* 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%0DE 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