OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 19 to Rev 20
    Reverse comparison

Rev 19 → Rev 20

/trunk/rtl/Spartan3/sys09bug_s3e_rom2k_b16.vhd
0,0 → 1,117
--
-- SYS09BUG MONITOR ROM FOR SYSTEM09 SPARTAN3E
-- John Kent
-- 8th January 2008
--
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
library unisim;
use unisim.vcomponents.all;
 
entity mon_rom is
Port (
clk : in std_logic;
rst : in std_logic;
cs : in std_logic;
rw : in std_logic;
addr : in std_logic_vector (10 downto 0);
rdata : out std_logic_vector (7 downto 0);
wdata : in std_logic_vector (7 downto 0)
);
end mon_rom;
 
architecture rtl of mon_rom is
 
signal we : std_logic;
signal dp : std_logic;
 
begin
 
MON_ROM : RAMB16_S9
generic map (
INIT_00 => x"A780A610C6C07F8E1067FE8EE8FE0DFB11FB82FBC1FCACFC8EFC94FC4BF814F8",
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC6450117D07FBF00E08EF9265AA0",
INIT_02 => x"092C2081891FF1270D817F84400417BC02179CFE8EDE01173A031777FE8E9204",
INIT_03 => x"FE8C02300F2780E12EFE8E20C0022F60C1500417550417408B981F5C04175E86",
INIT_04 => x"1F6E0217A4FE8E121F2D297403173B341FBC2094ADC020F902179EFE8EF52667",
INIT_05 => x"17275E81DD271881E12708811128670317100417AE0317A4A6180417AE031721",
INIT_06 => x"321FAB0217BE203F31C2202131EE03173F86F103170827A4A1A4A7390F260D81",
INIT_07 => x"F0C4201F0634F0C41000C3101F390124E1AC2034062914031705201F30C07F8E",
INIT_08 => x"10C69F0317370317E4AEF70117A4FE8E10343962320327A303170527E4AC011F",
INIT_09 => x"03172E8602237E810425208180A610C6E1AE8F0317F5265A97031735031780A6",
INIT_0a => x"273F8184A60F2710355B8DFFFF8E10341A24C07F8C1E29C00217BC20EE265A80",
INIT_0b => x"431F39FB265A1E8D08C6D37F8E104F03163F865203173984A73F86A4AFA0A709",
INIT_0c => x"A60A24C07F8C21AEB3FE16ED7FBF00008E5102170C8D4AAF04272C8D1F304AAE",
INIT_0d => x"265A0427A1ACA0A608C6D37F8E1039A0A7A0A7A0A7FF8684A7A4A604263F8184",
INIT_0e => x"7FBFE7F98EEB7FBFC07FBEED7FBF1429390217F202171C295F0117393D3139F7",
INIT_0f => x"27ED7FBE24273F8184A64AAEEC011770E0B671E0B73686431F392020450017C0",
INIT_10 => x"3B71E0B73F8673E0B7368670E0B671E0B7368670E0B70D86341FED7FBF1F301F",
INIT_11 => x"B7368672E0B7008670E0B7FF8673E0B73A8671E0B7328622FE16C07FBFEB7FBE",
INIT_12 => x"812A0217D27F7F6802171186D6FCBD8435FD265A20C604343973E0B73E8671E0",
INIT_13 => x"E0EBE0E61034212991011726290234A80117F12631813D273981230217F92653",
INIT_14 => x"FFC102355FEB2080A70527E46AE0EB02340C2904358E01170434E46AE46AE4EB",
INIT_15 => x"E4AF0130492562AC4D2930344A0117E26F1202161386D27F731A02173F86BA27",
INIT_16 => x"03CB2F0017E5FE8E64E720C6022320008310062762A3E4ECF901171286D6FCBD",
INIT_17 => x"AF5B0117981F53F526646A65011780A684EB63EB62EB68011762AE750117981F",
INIT_18 => x"0016A10116903569001796FE8E10347120028D396532B701171486C326E4AC62",
INIT_19 => x"8DDC8D728D3948AF0229EB8DE78D618D394AAF0229F68DF28D910017E50016F8",
INIT_1a => x"BB8D6C8D3943A70229C78DC68D498D3944AF0229D58DD18D5E8D3946AF0229E0",
INIT_1b => x"1739C4A7808A0429A68DA58D5F8D3941A70229B18DB08D588D3942A70229BC8D",
INIT_1c => x"8DC6FE8EF42048AEEA8DB4FE8EBF0016311FF48DA8FE8E39F726048180A63F01",
INIT_1d => x"204AAEC58DAEFE8ED82046AECE8DBAFE8EE12044AED78DC0FE8EB4001643A6E1",
INIT_1e => x"900016DDFE8EC4A6AA8DD6FE8ED02042A6B38DD1FE8ED92041A6BC8DCCFE8ECF",
INIT_1f => x"098DD520CE8DC78DC08D17FF17A4FE8EBF8DB88DB08DA98DA18D27FF17A4FE8E",
INIT_20 => x"4848483229118D903561A710343C29088D011F42290E8DB800172D86121F4D29",
INIT_21 => x"22468112254181393080032239811D2530815B8D39E0AB04342829078D891F48",
INIT_22 => x"4444444402340235028D0235103439021A395780032266810725618139378003",
INIT_23 => x"3F8D438D2D860225E46880A608C602345120078B022F3981308B0F840235048D",
INIT_24 => x"8E0926018584A6D07FBE10342D207F84048D0627D27F7D00F09F6E8235F1265A",
INIT_25 => x"86008D8235018520E0B605260185D07F9FA60234903501A6EE27018584A620E0",
INIT_26 => x"A7118684A70386D07FBE138D903501A70235FA27028584A6D07FBE1234458D20",
INIT_27 => x"7F01E702C6F17FFD04E703E702A7EF7FFD0000CC30E08E39D27FB7FF86016D84",
INIT_28 => x"84A70520098D042420810D20748D0427F27F7D30E08E16345986028D1B86F27F",
INIT_29 => x"100D814500271016818E0027101A816C0027101B814100271008819635C50017",
INIT_2a => x"9900168300261019C15CEF7FFC51260A81110027100B812C0027100C81990027",
INIT_2b => x"162500271050814CEF7FB66800164A3327EF7FB67400165A3C0027105DEF7FFC",
INIT_2c => x"F27FB704263D81312754816E002710598116273DC1F27FF65800160000CC5B00",
INIT_2d => x"C120C0F17F7FF17FF6ED224F812080F27F7F39F17FB70426F17F7D39F27F7F39",
INIT_2e => x"F07FF64F39F27F7FF726508102A74C84E720C6EF7FB6168D0000CC1B20E12218",
INIT_2f => x"012519C15C04E6E78D5AEA2619C15C4FF02650814CEF7FFC3903E702A7EF7FFD",
INIT_30 => x"E7F07FF7082719C15CF07FF6F42650C15C84A702E7EF7FF72086EF7FF604E75F",
INIT_31 => x"30FB1524FB1051FB0472FB035CFB0267FB0139F27FF702E7EF7FF75FE4205F03",
INIT_32 => x"F958DBF853E0FB5292F84DAFFA5051FA4C8FF847E7F84546F9423BFB1946FB18",
INIT_33 => x"305359530000000A0DFFFFFFFF7EF991F891F891F891F87EF9C5F95485FC5572",
INIT_34 => x"4857043E040000000A0D4B04202D202045335320524F4620332E312047554239",
INIT_35 => x"043D59492020043D53552020043D43502020043D5053202004202D20043F5441",
INIT_36 => x"48464504203A43432020043D422020043D412020043D50442020043D58492020",
INIT_37 => x"7F9F6EC47F9F6EC07F9F6E1FF916D27FF7535FC07FCE103904315343565A4E49",
INIT_38 => x"7FBC8B300F27FFFF8CCC7FBE49584F4AAF80E64AAE431FCA7F9F6EC87F9F6EC6",
INIT_39 => x"00000000000000000000000000C27F9F6E42EE1F37F16E44AEC4EC10340822CE",
INIT_3a => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3b => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3c => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3d => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3e => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3f => x"E9FEF5FE05FF01FFFDFEF9FE09FFF5FE00000000000000000000000000000000"
)
 
port map (
do => rdata,
dop(0) => dp,
addr => addr,
clk => clk,
di => wdata,
dip(0) => dp,
en => cs,
ssr => rst,
we => we
);
 
my_sbug : process ( rw )
begin
we <= not rw;
end process;
 
end architecture rtl;
 
/trunk/rtl/Spartan3/sbug_rom2k_b16.vhd
7,7 → 7,7
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
library unisim;
use unisim.all;
use unisim.vcomponents.all;
 
entity mon_rom is
Port (
23,39 → 23,6
 
architecture rtl of mon_rom is
 
component RAMB16_S9
generic (
INIT_00, INIT_01, INIT_02, INIT_03,
INIT_04, INIT_05, INIT_06, INIT_07,
INIT_08, INIT_09, INIT_0A, INIT_0B,
INIT_0C, INIT_0D, INIT_0E, INIT_0F,
INIT_10, INIT_11, INIT_12, INIT_13,
INIT_14, INIT_15, INIT_16, INIT_17,
INIT_18, INIT_19, INIT_1A, INIT_1B,
INIT_1C, INIT_1D, INIT_1E, INIT_1F,
INIT_20, INIT_21, INIT_22, INIT_23,
INIT_24, INIT_25, INIT_26, INIT_27,
INIT_28, INIT_29, INIT_2A, INIT_2B,
INIT_2C, INIT_2D, INIT_2E, INIT_2F,
INIT_30, INIT_31, INIT_32, INIT_33,
INIT_34, INIT_35, INIT_36, INIT_37,
INIT_38, INIT_39, INIT_3A, INIT_3B,
INIT_3C, INIT_3D, INIT_3E, INIT_3F : bit_vector (255 downto 0)
);
 
port (
do : out std_logic_vector(7 downto 0);
dop0 : out std_logic;
addr : in std_logic_vector(10 downto 0);
clk : in std_logic;
di : in std_logic_vector(7 downto 0);
dip0 : in std_logic;
en : in std_logic;
ssr : in std_logic;
we : in std_logic
);
end component RAMB16_S9;
 
signal we : std_logic;
signal dp : std_logic;
 
131,11 → 98,11
 
port map (
do => rdata,
dop0 => dp,
dop(0) => dp,
addr => addr,
clk => clk,
di => wdata,
dip0 => dp,
dip(0) => dp,
en => cs,
ssr => rst,
we => we
/trunk/rtl/System09_Digilent_3S500E/System09_Digilent_3S500E.ucf
138,8 → 138,8
NET "LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
# ==== PS/2 Mouse/Keyboard Port (PS2) ====
#-NET "PS2_CLK" LOC = "G14" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW
#-NET "PS2_DATA" LOC = "G13" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW
NET "PS2_CLK" LOC = "G14" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "PS2_DATA" LOC = "G13" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
# ==== Rotary Pushbutton Switch (ROT) ====
#-NET "ROT_A" LOC = "K18" | IOSTANDARD = LVTTL | PULLUP
#-NET "ROT_B" LOC = "G18" | IOSTANDARD = LVTTL | PULLUP
259,11 → 259,11
#-NET "SW<2>" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP
#-NET "SW<3>" LOC = "N17" | IOSTANDARD = LVTTL | PULLUP
# ==== VGA Port (VGA) ====
#-NET "VGA_BLUE" LOC = "G15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST
#-NET "VGA_GREEN" LOC = "H15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST
#-NET "VGA_HSYNC" LOC = "F15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST
#-NET "VGA_RED" LOC = "H14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST
#-NET "VGA_VSYNC" LOC = "F14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST
NET "VGA_BLUE" LOC = "G15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
NET "VGA_GREEN" LOC = "H15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
NET "VGA_HSYNC" LOC = "F15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
NET "VGA_RED" LOC = "H14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
NET "VGA_VSYNC" LOC = "F14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
# ==== Xilinx CPLD (XC) ====
#-NET "XC_CMD<0>" LOC = "P18" | IOSTANDARD = LVTTL | DRIVE = 4 | SLEW = SLOW
#-NET "XC_CMD<1>" LOC = "N18" | IOSTANDARD = LVTTL | DRIVE = 4 | SLEW = SLOW
/trunk/rtl/System09_Digilent_3S500E/System09_Digilent_3S500E.ise Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
trunk/rtl/System09_Digilent_3S500E/System09_Digilent_3S500E.ise Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: trunk/rtl/System09_Digilent_3S500E/System09_Digilent_3S500E.vhd =================================================================== --- trunk/rtl/System09_Digilent_3S500E/System09_Digilent_3S500E.vhd (revision 19) +++ trunk/rtl/System09_Digilent_3S500E/System09_Digilent_3S500E.vhd (revision 20) @@ -1,4 +1,4 @@ --- $Id: System09_Digilent_3S500E.vhd,v 1.1 2007-12-09 16:06:02 dilbert57 Exp $ +-- $Id: System09_Digilent_3S500E.vhd,v 1.2 2008-01-08 01:59:09 dilbert57 Exp $ --===========================================================================---- -- -- S Y N T H E Z I A B L E System09 - SOC. @@ -67,6 +67,20 @@ -- Removed keyboard, vdu, timer, and trap logic -- added PIA with counters attached. -- Uses 32Kbytes of internal Block RAM +-- +-- Version 4.0 - 8th April 2007 - John kent +-- Added VDU and PS/2 keyboard +-- Updated miniUART to ACIA6850 +-- Reduce monitor ROM to 2KB +-- Re-assigned I/O port assignments so it is possible to run KBUG9 +-- $E000 - ACIA +-- $E020 - Keyboard +-- $E030 - VDU +-- $E040 - Compact Flash (not implemented) +-- $E050 - Timer +-- $E060 - Bus trap +-- $E070 - Parallel I/O +-- --===========================================================================-- library ieee; use ieee.std_logic_1164.all; @@ -79,6 +93,17 @@ CLK_50MHZ : in Std_Logic; -- System Clock input BTN_SOUTH : in Std_Logic; + -- PS/2 Keyboard + PS2_CLK : inout Std_logic; + PS2_DATA : inout Std_Logic; + + -- CRTC output signals + VGA_VSYNC : out Std_Logic; + VGA_HSYNC : out Std_Logic; + VGA_BLUE : out std_logic; + VGA_GREEN : out std_logic; + VGA_RED : out std_logic; + -- Uart Interface RS232_DCE_RXD : in std_logic; RS232_DCE_TXD : out std_logic; @@ -93,27 +118,58 @@ ------------------------------------------------------------------------------- architecture my_computer of My_System09 is ----------------------------------------------------------------------------- + -- constants + ----------------------------------------------------------------------------- + constant SYS_Clock_Frequency : integer := 50000000; -- FPGA System Clock + constant PIX_Clock_Frequency : integer := 25000000; -- VGA Pixel Clock + constant CPU_Clock_Frequency : integer := 25000000; -- CPU Clock + constant BAUD_Rate : integer := 57600; -- Baud Rate + constant ACIA_Clock_Frequency : integer := BAUD_Rate * 16; + + ----------------------------------------------------------------------------- -- Signals ----------------------------------------------------------------------------- -- BOOT ROM - signal rom_cs : Std_logic; - signal rom_data_out : Std_Logic_Vector(7 downto 0); + signal rom_cs : Std_logic; + signal rom_data_out : Std_Logic_Vector(7 downto 0); -- UART Interface signals - signal uart_data_out : Std_Logic_Vector(7 downto 0); - signal uart_cs : Std_Logic; - signal uart_irq : Std_Logic; - signal baudclk : Std_Logic; - signal DCD_n : Std_Logic; - signal RTS_n : Std_Logic; - signal CTS_n : Std_Logic; + signal uart_data_out : Std_Logic_Vector(7 downto 0); + signal uart_cs : Std_Logic; + signal uart_irq : Std_Logic; + signal uart_clk : Std_Logic; + signal rxbit : Std_Logic; + signal txbit : Std_Logic; + signal DCD_n : Std_Logic; + signal RTS_n : Std_Logic; + signal CTS_n : Std_Logic; + -- timer + signal timer_data_out : std_logic_vector(7 downto 0); + signal timer_cs : std_logic; + signal timer_irq : std_logic; + + -- trap + signal trap_cs : std_logic; + signal trap_data_out : std_logic_vector(7 downto 0); + signal trap_irq : std_logic; + -- PIA Interface signals - signal pia_data_out : Std_Logic_Vector(7 downto 0); - signal pia_cs : Std_Logic; - signal pia_irq_a : Std_Logic; - signal pia_irq_b : Std_Logic; + signal pia_data_out : Std_Logic_Vector(7 downto 0); + signal pia_cs : Std_Logic; + signal pia_irq_a : Std_Logic; + signal pia_irq_b : Std_Logic; + -- keyboard port + signal keyboard_data_out : std_logic_vector(7 downto 0); + signal keyboard_cs : std_logic; + signal keyboard_irq : std_logic; + + -- Video Display Unit + signal pix_clk : std_logic; + signal vdu_cs : std_logic; + signal vdu_data_out : std_logic_vector(7 downto 0); + -- RAM signal ram_cs : std_logic; -- memory chip select signal ram_data_out : std_logic_vector(7 downto 0); @@ -132,10 +188,11 @@ signal cpu_data_in : std_logic_vector(7 downto 0); signal cpu_data_out : std_logic_vector(7 downto 0); - signal BaudCount : std_logic_vector(6 downto 0); + -- CLK_50MHZ clock divide by 2 + signal clock_div : std_logic_vector(1 downto 0); + signal SysClk : std_logic; + signal Reset_n : std_logic; signal CountL : std_logic_vector(23 downto 0); - -- CLK_50MHZ clock divide by 4 - signal prescale : std_logic_vector(1 downto 0); ----------------------------------------------------------------- -- @@ -166,13 +223,13 @@ -- Block RAM Monitor ROM -- ---------------------------------------- -component rom_8k +component mon_rom Port ( clk : in std_logic; rst : in std_logic; cs : in std_logic; rw : in std_logic; - addr : in std_logic_vector (12 downto 0); + addr : in std_logic_vector (10 downto 0); rdata : out std_logic_vector (7 downto 0); wdata : in std_logic_vector (7 downto 0) ); @@ -215,13 +272,14 @@ ); end component; + ----------------------------------------------------------------- -- --- 6850 compatible UART (ACIA) +-- 6850 ACIA/UART -- ----------------------------------------------------------------- -component miniUART +component ACIA_6850 port ( clk : in Std_Logic; -- System Clock rst : in Std_Logic; -- Reset input (active high) @@ -240,7 +298,129 @@ RTS_n : out Std_Logic ); -- Request To send end component; +----------------------------------------------------------------- +-- +-- ACIA Clock divider +-- +----------------------------------------------------------------- +component ACIA_Clock + generic ( + SYS_Clock_Frequency : integer := SYS_Clock_Frequency; + ACIA_Clock_Frequency : integer := ACIA_Clock_Frequency + ); + port ( + clk : in Std_Logic; -- System Clock Input + ACIA_clk : out Std_logic -- ACIA Clock output + ); +end component; + +---------------------------------------- +-- +-- Timer module +-- +---------------------------------------- + +component timer + port ( + clk : in std_logic; + rst : in std_logic; + cs : in std_logic; + rw : in std_logic; + addr : in std_logic; + data_in : in std_logic_vector(7 downto 0); + data_out : out std_logic_vector(7 downto 0); + irq : out std_logic; + timer_in : in std_logic; + timer_out : out std_logic + ); +end component; + +------------------------------------------------------------ +-- +-- Bus Trap logic +-- +------------------------------------------------------------ + +component trap + port ( + clk : in std_logic; + rst : in std_logic; + cs : in std_logic; + rw : in std_logic; + vma : in std_logic; + addr : in std_logic_vector(15 downto 0); + data_in : in std_logic_vector(7 downto 0); + data_out : out std_logic_vector(7 downto 0); + irq : out std_logic + ); +end component; + +---------------------------------------- +-- +-- PS/2 Keyboard +-- +---------------------------------------- + +component keyboard + generic( + KBD_Clock_Frequency : integer := CPU_Clock_Frequency + ); + port( + clk : in std_logic; + rst : in std_logic; + cs : in std_logic; + rw : in std_logic; + addr : in std_logic; + data_in : in std_logic_vector(7 downto 0); + data_out : out std_logic_vector(7 downto 0); + irq : out std_logic; + kbd_clk : inout std_logic; + kbd_data : inout std_logic + ); +end component; + +---------------------------------------- +-- +-- Video Display Unit. +-- +---------------------------------------- +component vdu8 + generic( + VDU_CLOCK_FREQUENCY : integer := CPU_Clock_Frequency; -- HZ + VGA_CLOCK_FREQUENCY : integer := PIX_Clock_Frequency; -- HZ + VGA_HOR_CHARS : integer := 80; -- CHARACTERS + VGA_VER_CHARS : integer := 25; -- CHARACTERS + VGA_PIXELS_PER_CHAR : integer := 8; -- PIXELS + VGA_LINES_PER_CHAR : integer := 16; -- LINES + VGA_HOR_BACK_PORCH : integer := 40; -- PIXELS + VGA_HOR_SYNC : integer := 96; -- PIXELS + VGA_HOR_FRONT_PORCH : integer := 24; -- PIXELS + VGA_VER_BACK_PORCH : integer := 13; -- LINES + VGA_VER_SYNC : integer := 1; -- LINES + VGA_VER_FRONT_PORCH : integer := 36 -- LINES + ); + port( + -- control register interface + vdu_clk : in std_logic; -- CPU Clock - 12.5MHz + vdu_rst : in std_logic; + vdu_cs : in std_logic; + vdu_rw : in std_logic; + vdu_addr : in std_logic_vector(2 downto 0); + vdu_data_in : in std_logic_vector(7 downto 0); + vdu_data_out : out std_logic_vector(7 downto 0); + + -- vga port connections + vga_clk : in std_logic; -- VGA Pixel Clock - 25 MHz + vga_red_o : out std_logic; + vga_green_o : out std_logic; + vga_blue_o : out std_logic; + vga_hsync_o : out std_logic; + vga_vsync_o : out std_logic + ); +end component; + + component BUFG port ( i: in std_logic; @@ -268,12 +448,12 @@ firq => cpu_firq ); -my_rom : rom_8k port map ( +my_rom : mon_rom port map ( clk => cpu_clk, rst => cpu_reset, cs => rom_cs, rw => '1', - addr => cpu_addr(12 downto 0), + addr => cpu_addr(10 downto 0), rdata => rom_data_out, wdata => cpu_data_out ); @@ -300,7 +480,13 @@ irqb => pia_irq_b ); -my_uart : miniUART port map ( + +---------------------------------------- +-- +-- ACIA/UART Serial interface +-- +---------------------------------------- +my_ACIA : ACIA_6850 port map ( clk => cpu_clk, rst => cpu_reset, cs => uart_cs, @@ -309,19 +495,144 @@ Addr => cpu_addr(0), Datain => cpu_data_out, DataOut => uart_data_out, - RxC => baudclk, - TxC => baudclk, - RxD => RS232_DCE_RXD, - TxD => RS232_DCE_TXD, + RxC => uart_clk, + TxC => uart_clk, + RxD => rxbit, + TxD => txbit, DCD_n => dcd_n, CTS_n => cts_n, RTS_n => rts_n ); +---------------------------------------- +-- +-- ACIA Clock +-- +---------------------------------------- +my_ACIA_Clock : ACIA_Clock + generic map( + SYS_Clock_Frequency => SYS_Clock_Frequency, + ACIA_Clock_Frequency => ACIA_Clock_Frequency + ) + port map( + clk => SysClk, + acia_clk => uart_clk + ); -clk_buffer : BUFG port map( - i => prescale(1), + + +---------------------------------------- +-- +-- PS/2 Keyboard Interface +-- +---------------------------------------- +my_keyboard : keyboard + generic map ( + KBD_Clock_Frequency => CPU_Clock_frequency + ) + port map( + clk => cpu_clk, + rst => cpu_reset, + cs => keyboard_cs, + rw => cpu_rw, + addr => cpu_addr(0), + data_in => cpu_data_out(7 downto 0), + data_out => keyboard_data_out(7 downto 0), + irq => keyboard_irq, + kbd_clk => PS2_CLK, + kbd_data => PS2_DATA + ); + +---------------------------------------- +-- +-- Video Display Unit instantiation +-- +---------------------------------------- +my_vdu : vdu8 + generic map( + VDU_CLOCK_FREQUENCY => CPU_Clock_Frequency, -- HZ + VGA_CLOCK_FREQUENCY => PIX_Clock_Frequency, -- HZ + VGA_HOR_CHARS => 80, -- CHARACTERS + VGA_VER_CHARS => 25, -- CHARACTERS + VGA_PIXELS_PER_CHAR => 8, -- PIXELS + VGA_LINES_PER_CHAR => 16, -- LINES + VGA_HOR_BACK_PORCH => 40, -- PIXELS + VGA_HOR_SYNC => 96, -- PIXELS + VGA_HOR_FRONT_PORCH => 24, -- PIXELS + VGA_VER_BACK_PORCH => 13, -- LINES + VGA_VER_SYNC => 1, -- LINES + VGA_VER_FRONT_PORCH => 36 -- LINES + ) + port map( + + -- Control Registers + vdu_clk => cpu_clk, -- 25 MHz System Clock in + vdu_rst => cpu_reset, + vdu_cs => vdu_cs, + vdu_rw => cpu_rw, + vdu_addr => cpu_addr(2 downto 0), + vdu_data_in => cpu_data_out, + vdu_data_out => vdu_data_out, + + -- vga port connections + vga_clk => pix_clk, -- 25 MHz VDU pixel clock + vga_red_o => vga_red, + vga_green_o => vga_green, + vga_blue_o => vga_blue, + vga_hsync_o => vga_hsync, + vga_vsync_o => vga_vsync + ); + + +---------------------------------------- +-- +-- Timer Module +-- +---------------------------------------- +my_timer : timer port map ( + clk => cpu_clk, + rst => cpu_reset, + cs => timer_cs, + rw => cpu_rw, + addr => cpu_addr(0), + data_in => cpu_data_out, + data_out => timer_data_out, + irq => timer_irq, + timer_in => CountL(5) +-- timer_out => timer_out + ); + +---------------------------------------- +-- +-- Bus Trap Interrupt logic +-- +---------------------------------------- +my_trap : trap port map ( + clk => cpu_clk, + rst => cpu_reset, + cs => trap_cs, + rw => cpu_rw, + vma => cpu_vma, + addr => cpu_addr, + data_in => cpu_data_out, + data_out => trap_data_out, + irq => trap_irq + ); + +-- +-- 25 MHz CPU clock +-- +cpu_clk_buffer : BUFG port map( + i => clock_div(0), o => cpu_clk + ); + +-- +-- 25 MHz VGA Pixel clock +-- +vga_clk_buffer : BUFG port map( + i => clock_div(0), + o => pix_clk ); ---------------------------------------------------------------------- @@ -330,51 +641,164 @@ -- ---------------------------------------------------------------------- -mem_decode: process( cpu_clk, BTN_SOUTH, +mem_decode: process( cpu_clk, Reset_n, cpu_addr, cpu_rw, cpu_vma, - rom_data_out, + rom_data_out, ram_data_out, + timer_data_out, + trap_data_out, + pia_data_out, uart_data_out, - pia_data_out ) + keyboard_data_out, + vdu_data_out ) +variable decode_addr : std_logic_vector(3 downto 0); begin - case cpu_addr(15 downto 14) is +-- decode_addr := dat_addr(3 downto 0) & cpu_addr(11); + decode_addr := cpu_addr(15 downto 12); + + case decode_addr is -- - -- Monitor ROM $C000 - $FFFF + -- SBUG/KBUG/SYS09BUG Monitor ROM $F800 - $FFFF -- - when "11" => -- $C000 - $FFFF + when "1111" => -- $F000 - $FFFF cpu_data_in <= rom_data_out; - rom_cs <= cpu_vma; + rom_cs <= cpu_vma; -- read ROM ram_cs <= '0'; uart_cs <= '0'; + timer_cs <= '0'; + trap_cs <= '0'; pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; + -- - -- IO Devices $8000 - $BFFF + -- IO Devices $E000 - $EFFF -- - when "10" => -- $8000 - $BFFF + when "1110" => -- $E000 - $E7FF rom_cs <= '0'; ram_cs <= '0'; - case cpu_addr(3 downto 2) is + case cpu_addr(7 downto 4) is -- - -- PIA TIMER $8004 + -- UART / ACIA $E000 -- - when "01" => -- $8004 - cpu_data_in <= pia_data_out; + when "0000" => -- $E000 + cpu_data_in <= uart_data_out; + uart_cs <= cpu_vma; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; + + -- + -- WD1771 FDC sites at $E010-$E01F + -- + when "0001" => -- $E010 + cpu_data_in <= (others => '0'); uart_cs <= '0'; - pia_cs <= cpu_vma; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; + + -- + -- Keyboard port $E020 - $E02F -- - -- UART / ACIA $8008 + when "0010" => -- $E020 + cpu_data_in <= keyboard_data_out; + uart_cs <= '0'; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= cpu_vma; + vdu_cs <= '0'; + + -- + -- VDU port $E030 - $E03F -- - when "10" => -- $8008 - cpu_data_in <= uart_data_out; - uart_cs <= cpu_vma; - pia_cs <= '0'; + when "0011" => -- $E030 + cpu_data_in <= vdu_data_out; + uart_cs <= '0'; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= cpu_vma; - when others => - cpu_data_in <= "11111111"; + -- + -- Compact Flash $E040 - $E04F + -- + when "0100" => -- $E040 + cpu_data_in <= (others => '0'); uart_cs <= '0'; - pia_cs <= '0'; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; + + -- + -- Timer $E050 - $E05F + -- + when "0101" => -- $E050 + cpu_data_in <= timer_data_out; + uart_cs <= '0'; + timer_cs <= cpu_vma; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; + + -- + -- Bus Trap Logic $E060 - $E06F + -- + when "0110" => -- $E060 + cpu_data_in <= trap_data_out; + uart_cs <= '0'; + timer_cs <= '0'; + trap_cs <= cpu_vma; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; + + -- + -- I/O port $E070 - $E07F + -- + when "0111" => -- $E070 + cpu_data_in <= pia_data_out; + uart_cs <= '0'; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= cpu_vma; + keyboard_cs <= '0'; + vdu_cs <= '0'; + + when others => -- $E080 to $E7FF + cpu_data_in <= (others => '0'); + uart_cs <= '0'; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; end case; + -- + -- $8000 to $DFFF = null + -- + when "1101" | "1100" | "1011" | "1010" | + "1001" | "1000" => + cpu_data_in <= (others => '0'); + rom_cs <= '0'; + ram_cs <= '0'; + uart_cs <= '0'; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; + -- -- Everything else is RAM -- when others => @@ -382,67 +806,57 @@ rom_cs <= '0'; ram_cs <= cpu_vma; uart_cs <= '0'; - pia_cs <= '0'; - end case; + timer_cs <= '0'; + trap_cs <= '0'; + pia_cs <= '0'; + keyboard_cs <= '0'; + vdu_cs <= '0'; + end case; end process; -- -- Interrupts and other bus control signals -- -interrupts : process( BTN_SOUTH, uart_irq, - pia_irq_a, pia_irq_b +interrupts : process( Reset_n, + pia_irq_a, pia_irq_b, uart_irq, trap_irq, timer_irq, keyboard_irq ) begin - cpu_reset <= BTN_SOUTH; -- CPU reset is active high - cpu_irq <= uart_irq; - cpu_nmi <= pia_irq_a; - cpu_firq <= pia_irq_b; + cpu_reset <= not Reset_n; -- CPU reset is active high + cpu_irq <= uart_irq or keyboard_irq; + cpu_nmi <= pia_irq_a or trap_irq; + cpu_firq <= pia_irq_b or timer_irq; cpu_halt <= '0'; cpu_hold <= '0'; end process; -my_cpu_clock: process( CLK_50MHZ, prescale ) -begin - if(CLK_50MHZ'event and CLK_50MHZ = '0') then - prescale <= prescale + "01"; - end if; -end process; - -- --- Baud rate clock --- 50 MHz / 81.38 = ~614.4 KHz (38400 * 16) -- -my_baud: process( CLK_50MHZ ) +my_led_flasher: process( SysClk, Reset_n, CountL ) begin - if(CLK_50MHZ'event and CLK_50MHZ = '0') then - if( BaudCount = 81 ) then - BaudCount <= "0000000"; - baudclk <= '0'; - else - BaudCount <= BaudCount + 1; - if BaudCount = 40 then - baudclk <= '1'; - else - baudclk <= baudclk; - end if; - end if; + if Reset_n = '0' then + CountL <= "000000000000000000000000"; + elsif(SysClk'event and SysClk = '0') then + CountL <= CountL + 1; end if; + LED(7 downto 0) <= CountL(23 downto 16); end process; -- +-- Clock divider -- -my_led_flasher: process( CLK_50MHZ, BTN_SOUTH, CountL ) +my_clock_divider: process( SysClk ) begin - if BTN_SOUTH = '1' then - CountL <= "000000000000000000000000"; - elsif(CLK_50MHZ'event and CLK_50MHZ = '0') then - CountL <= CountL + 1; - end if; - LED(7 downto 0) <= CountL(23 downto 16); + if SysClk'event and SysClk='0' then + clock_div <= clock_div + "01"; + end if; end process; DCD_n <= '0'; CTS_n <= '0'; +Reset_n <= not BTN_SOUTH; -- CPU reset is active high +SysClk <= CLK_50MHZ; +rxbit <= RS232_DCE_RXD; +RS232_DCE_TXD <= txbit; end my_computer; --===================== End of architecture =======================--
/trunk/rtl/System09_Digilent_3S500E/system09_digilent_3s500e.mcs Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
trunk/rtl/System09_Digilent_3S500E/system09_digilent_3s500e.mcs Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: trunk/src/sys09bug/sys09bug_fpga.lst =================================================================== --- trunk/src/sys09bug/sys09bug_fpga.lst (revision 19) +++ trunk/src/sys09bug/sys09bug_fpga.lst (revision 20) @@ -42,2342 +42,2537 @@ 0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION 0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD 0040 * -0041 * *** COMMANDS *** -0042 * -0043 * CONTROL A = ALTER THE "A" ACCUMULATOR -0044 * CONTROL B = ALTER THE "B" ACCUMULATOR -0045 * CONTROL C = ALTER THE CONDITION CODE REGISTER -0046 * CONTROL D = ALTER THE DIRECT PAGE REGISTER -0047 * CONTROL P = ALTER THE PROGRAM COUNTER -0048 * CONTROL U = ALTER USER STACK POINTER -0049 * CONTROL X = ALTER "X" INDEX REGISTER -0050 * CONTROL Y = ALTER "Y" INDEX REGISTER -0051 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh -0052 * D = 5.25" MINIFLOPPY BOOT -0053 * E ssss-eeee = EXAMINE MEMORY -0054 * FROM STARTING ADDRESS ssss -0055 * TO ENDING ADDRESS eeee. -0056 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI -0057 * L = LOAD TAPE -0058 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh -0059 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. -0060 * R = DISPLAY REGISTER CONTENTS -0061 * S = DISPLAY STACK FROM ssss TO $DFC0 -0062 * U = 8" DMAF2 FLOPPY BOOT -0063 * U = USER EXTENSION COMMANDS AT $F000 -0064 * X = REMOVE ALL BREAKPOINTS -0065 * -0066 * -0067 * -0068 *************************************************** -0069 * OPTION SWITCHES -0070 *************************************************** -0071 * -0072 * -0073 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE -0074 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET -0075 ** FOR LOADING AND SAVING S1 RECORDS -0076 * -0077 00FF FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD -0078 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY -0079 *SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT -0080 * -0081 *************************************************** -0082 * MEMORY MAP EQUATES * -0083 *************************************************** -0084 E000 MONIO EQU $E000 I/O SPACE -0085 DFC0 MONRAM EQU $DFC0 STACK SPACE -0086 F800 MONROM EQU $F800 START OF ROM -0087 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS -0088 0000 EXTCMD EQU $00 EXTENDED OFFSET +0041 * Modified to SYS09BUG VER 1.3 +0042 * FOR: SYSTEM09 FPGA SYSTEM +0043 * BY: JOHN KENT +0044 * DATE: 8TH JAN 2008 +0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD +0046 * WITH ONLY 32K OF RAM +0047 * +0048 * *** COMMANDS *** +0049 * +0050 * CONTROL A = ALTER THE "A" ACCUMULATOR +0051 * CONTROL B = ALTER THE "B" ACCUMULATOR +0052 * CONTROL C = ALTER THE CONDITION CODE REGISTER +0053 * CONTROL D = ALTER THE DIRECT PAGE REGISTER +0054 * CONTROL P = ALTER THE PROGRAM COUNTER +0055 * CONTROL U = ALTER USER STACK POINTER +0056 * CONTROL X = ALTER "X" INDEX REGISTER +0057 * CONTROL Y = ALTER "Y" INDEX REGISTER +0058 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh +0059 * D = 5.25" MINIFLOPPY BOOT +0060 * E ssss-eeee = EXAMINE MEMORY +0061 * FROM STARTING ADDRESS ssss +0062 * TO ENDING ADDRESS eeee. +0063 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI +0064 * L = LOAD TAPE +0065 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh +0066 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. +0067 * R = DISPLAY REGISTER CONTENTS +0068 * S = DISPLAY STACK FROM ssss TO $DFC0 +0069 * U = 8" DMAF2 FLOPPY BOOT +0070 * U = USER EXTENSION COMMANDS AT $F000 +0071 * X = REMOVE ALL BREAKPOINTS +0072 * +0073 * +0074 * +0075 *************************************************** +0076 * OPTION SWITCHES +0077 *************************************************** +0078 * +0079 * +0080 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE +0081 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET +0082 ** FOR LOADING AND SAVING S1 RECORDS +0083 * +0084 *S3EOPT EQU $FF SPARTAN3E STARTER +0085 00FF FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD +0086 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY +0087 *SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT +0088 * 0089 *************************************************** -0090 IFD FPGAOPT -0091 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION -0092 ENDIF FPGAOPT -0093 * -0094 IFD ADSOPT -0095 *RTCOPT EQU $FF REAL TIME CLOCK -0096 PRTOPT EQU $FF PRINTER DRIVERS -0097 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT -0098 ENDIF ADSOPT -0098 ENDIF ADSOPT -0099 * -0100 IFD SWTPOPT -0101 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT -0102 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT -0103 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION -0104 ENDIF -0104 ENDIF -0105 * -0106 *************************************************** -0107 * SYS09BUG VARIABLE SPACE -0108 *************************************************** -0109 * -0110 DFC0 ORG MONRAM -0111 DFC0 STACK RMB 2 TOP OF INTERNAL STACK / USER VECTOR -0112 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 -0113 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 -0114 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR -0115 DFC8 IRQ RMB 2 INTERRUPT VECTOR -0116 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR -0117 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN -0118 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT -0119 IFD DATOPT -0120 DFD0 LRARAM RMB 16 LRA ADDRESSES -0121 ENDIF DATOPT -0122 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT -0123 DFE2 ECHO RMB 1 ECHO FLAG -0124 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR -0125 * -0126 IFD SWTPOPT -0127 * -0128 *************************************************** -0129 * SERIAL PORT * +0090 * MEMORY MAP EQUATES * +0091 *************************************************** +0092 E000 MONIO EQU $E000 I/O SPACE +0093 IFD S3EOPT +0094 MONRAM EQU $7FC0 +0095 ELSE +0096 DFC0 MONRAM EQU $DFC0 STACK SPACE +0097 ENDIF S3EOPT +0098 F800 MONROM EQU $F800 START OF ROM +0099 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS +0100 0000 EXTCMD EQU $00 EXTENDED OFFSET +0101 *************************************************** +0102 IFD S3EOPT +0103 ACIAOPT EQU $FF ACIA AT PORT 0 +0104 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 +0105 VDUOPT EQU $FF VDU AT $E030 +0106 TRAOPT EQU $FF PIA TRACE TIMER +0107 ENDIF S3EOPT +0107 ENDIF S3EOPT +0108 IFD FPGAOPT +0109 00FF ACIAOPT EQU $FF ACIA AT PORT 0 +0110 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020 +0111 00FF VDUOPT EQU $FF VDU AT $E030 +0112 00FF CFOPT EQU $FF COMPACT FLASH AT $E040 +0113 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION +0114 ENDIF FPGAOPT +0115 * +0116 IFD ADSOPT +0117 DG640OPT EQU $FF DG640 VDU AT $E800 +0118 *RTCOPT EQU $FF REAL TIME CLOCK +0119 PRTOPT EQU $FF PRINTER DRIVERS +0120 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT +0121 ENDIF ADSOPT +0121 ENDIF ADSOPT +0122 * +0123 IFD SWTPOPT +0124 ACIAOPT EQU $FF ACIA AT PORT 0 +0125 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT +0126 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT +0127 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION +0128 ENDIF +0128 ENDIF +0129 * 0130 *************************************************** -0131 * -0132 ** ACIA SITS ON PORT 0 -0133 * -0134 ACIAS EQU MONIO+$00 CONTROL PORT -0135 * -0136 ENDIF SWTPOPT -0136 ENDIF SWTPOPT -0137 IFD MFDCOPT -0138 * -0139 *************************************************** -0140 * MINIFLOPPY DRIVE * -0141 *************************************************** -0142 * -0143 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 -0144 * -0145 DRVFDC EQU MONIO+$14 -0146 CMDFDC EQU MONIO+$18 -0147 SECFDC EQU MONIO+$1A -0148 DATFDC EQU MONIO+$1B -0149 ENDIF MFDCOPT -0149 ENDIF MFDCOPT -0150 IFD FPGAOPT -0151 * -0152 *************************************************** -0153 * SERIAL PORT * -0154 *************************************************** -0155 * -0156 ** ACIA SITS ON PORT 0 -0157 * -0158 E000 ACIAS EQU MONIO+$00 CONTROL PORT -0159 * -0160 * -0161 *************************************************** -0162 * VDU8 PS/2 KEYBOARD PORT * -0163 *************************************************** +0131 * SYS09BUG VARIABLE SPACE +0132 *************************************************** +0133 * +0134 DFC0 ORG MONRAM +0135 DFC0 STACK EQU * TOP OF INTERNAL STACK +0136 DFC0 NMI RMB 2 USER NMI VECTOR +0137 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 +0138 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 +0139 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR +0140 DFC8 IRQ RMB 2 INTERRUPT VECTOR +0141 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR +0142 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN +0143 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT +0144 IFD DATOPT +0145 DFD0 LRARAM RMB 16 LRA ADDRESSES +0146 ENDIF DATOPT +0147 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT +0148 DFE2 ECHO RMB 1 ECHO FLAG +0149 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR +0150 IFD TRAOPT +0151 NMISAV RMB 2 NMI Jump Vector Backup +0152 TRACNT RMB 2 Trace Count +0153 ENDIF TRAOPT +0153 ENDIF TRAOPT +0154 * +0155 IFD ACIAOPT +0156 * +0157 *************************************************** +0158 * SERIAL PORT * +0159 *************************************************** +0160 * +0161 ** ACIA SITS ON PORT 0 +0162 * +0163 E000 ACIAS EQU MONIO+$00 CONTROL PORT 0164 * -0165 ** KEYBOARD SITS ON PORT 2 -0166 * -0167 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT -0168 * -0169 *************************************************** -0170 * VDU8 DISPLAY DRIVER EQUATES * -0171 *************************************************** -0172 * -0173 ** VDU8 DISPLAY SITS ON PORT 3 -0174 * -0175 E030 VDU EQU MONIO+$30 -0176 0000 VDUCHR EQU 0 CHARACTER REGISTER -0177 0001 VDUATT EQU 1 ATTRIBUTE REGISTER -0178 0002 VDUCOL EQU 2 CURSOR COLUMN -0179 0003 VDUROW EQU 3 CURSOR ROW -0180 0004 VDUOFF EQU 4 ROW OFFSET -0181 * -0182 0050 LINLEN EQU 80 LENGTH OF A LINE -0183 0019 NUMLIN EQU 25 NUMBER OF LINES +0165 ENDIF ACIAOPT +0166 IFD MFDCOPT +0167 * +0168 *************************************************** +0169 * MINIFLOPPY DRIVE * +0170 *************************************************** +0171 * +0172 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 +0173 * +0174 DRVFDC EQU MONIO+$14 +0175 CMDFDC EQU MONIO+$18 +0176 SECFDC EQU MONIO+$1A +0177 DATFDC EQU MONIO+$1B +0178 ENDIF MFDCOPT +0178 ENDIF MFDCOPT +0179 IFD PS2OPT +0180 * +0181 *************************************************** +0182 * VDU8 PS/2 KEYBOARD PORT * +0183 *************************************************** 0184 * -0185 ************************************************** -0186 * VDU8 DISPLAY DRIVER VARIABLES * -0187 ************************************************** -0188 * -0189 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** -0190 DFFB COLADX RMB 1 CURSOR COLUMN -0191 DFFC ROWADX RMB 1 CURSOR ROW -0192 ************************************************** -0193 * -0194 DFFD NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE -0195 DFFE ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE -0196 * -0197 *************************************************** -0198 * COMPACT FLASH EQUATES * -0199 *************************************************** -0200 * -0201 E040 CF_BASE EQU MONIO+$40 -0202 E040 CF_DATA EQU CF_BASE+0 -0203 E041 CF_ERROR EQU CF_BASE+1 ; read error -0204 E041 CF_FEATURE EQU CF_BASE+1 ; write feature -0205 E042 CF_SECCNT EQU CF_BASE+2 -0206 E043 CF_SECNUM EQU CF_BASE+3 -0207 E044 CF_CYLLO EQU CF_BASE+4 -0208 E045 CF_CYLHI EQU CF_BASE+5 -0209 E046 CF_HEAD EQU CF_BASE+6 -0210 E047 CF_STATUS EQU CF_BASE+7 ; read status -0211 E047 CF_COMAND EQU CF_BASE+7 ; write command -0212 * -0213 * Command Equates -0214 * -0215 0020 CMDREAD EQU $20 ; Read Single sector -0216 0030 CMDWRITE EQU $30 ; Write Single sector -0217 00EF CMDFEATURE EQU $EF -0218 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers -0219 00E0 HEADLBA EQU $E0 -0220 * -0221 * Status bit equates -0222 * -0223 0080 BUSY EQU $80 -0224 0040 DRDY EQU $40 -0225 0008 DRQ EQU $08 -0226 0001 ERR EQU $01 -0227 * -0228 ENDIF FPGAOPT -0229 * -0230 IFD RTCOPT -0231 * -0232 ************************************************** -0233 * MM58167A REAL TIME CLOCK MEMORY MAP: -0234 ************************************************** -0235 * -0236 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 -0237 * -0238 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS -0239 * -0240 * COUNTER AND COMPARITOR REGISTERS: -0241 * -0242 * Both the Clock Counter and Clock Comparitor -0243 * consist of 8 registers for holding the time. -0244 * The register offsets from the Counter and -0245 * Comparitor registers are listed above. +0185 ** KEYBOARD SITS ON PORT 2 +0186 * +0187 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT +0188 ENDIF PS2OPT +0189 IFD VDUOPT +0190 * +0191 *************************************************** +0192 * VDU8 DISPLAY DRIVER EQUATES * +0193 *************************************************** +0194 * +0195 ** VDU8 DISPLAY SITS ON PORT 3 +0196 * +0197 E030 VDU EQU MONIO+$30 +0198 0000 VDUCHR EQU 0 CHARACTER REGISTER +0199 0001 VDUATT EQU 1 ATTRIBUTE REGISTER +0200 0002 VDUCOL EQU 2 CURSOR COLUMN +0201 0003 VDUROW EQU 3 CURSOR ROW +0202 0004 VDUOFF EQU 4 ROW OFFSET +0203 * +0204 0050 LINLEN EQU 80 LENGTH OF A LINE +0205 0019 NUMLIN EQU 25 NUMBER OF LINES +0206 * +0207 ************************************************** +0208 * VDU8 DISPLAY DRIVER VARIABLES * +0209 ************************************************** +0210 * +0211 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** +0212 DFFB COLADX RMB 1 CURSOR COLUMN +0213 DFFC ROWADX RMB 1 CURSOR ROW +0214 ************************************************** +0215 * +0216 DFFD NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE +0217 DFFE ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE +0218 ENDIF VDUOPT +0219 IFD CFOPT +0220 * +0221 *************************************************** +0222 * COMPACT FLASH EQUATES * +0223 *************************************************** +0224 * +0225 ** COMPACT FLASH SITS AT PORT 4 +0226 * +0227 E040 CF_BASE EQU MONIO+$40 +0228 E040 CF_DATA EQU CF_BASE+0 +0229 E041 CF_ERROR EQU CF_BASE+1 ; read error +0230 E041 CF_FEATURE EQU CF_BASE+1 ; write feature +0231 E042 CF_SECCNT EQU CF_BASE+2 +0232 E043 CF_SECNUM EQU CF_BASE+3 +0233 E044 CF_CYLLO EQU CF_BASE+4 +0234 E045 CF_CYLHI EQU CF_BASE+5 +0235 E046 CF_HEAD EQU CF_BASE+6 +0236 E047 CF_STATUS EQU CF_BASE+7 ; read status +0237 E047 CF_COMAND EQU CF_BASE+7 ; write command +0238 * +0239 * Command Equates +0240 * +0241 0020 CMDREAD EQU $20 ; Read Single sector +0242 0030 CMDWRITE EQU $30 ; Write Single sector +0243 00EF CMDFEATURE EQU $EF +0244 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers +0245 00E0 HEADLBA EQU $E0 0246 * -0247 COUNTR EQU CLOCK+0 -0248 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS -0249 * -0250 * CLOCK REGISTER OFFSETS: -0251 * These register offsets are used for the CLOCK -0252 * and comparitor ram CMPRAM. +0247 * Status bit equates +0248 * +0249 0080 BUSY EQU $80 +0250 0040 DRDY EQU $40 +0251 0008 DRQ EQU $08 +0252 0001 ERR EQU $01 0253 * -0254 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS -0255 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS -0256 SECOND EQU 2 -0257 MINUIT EQU 3 -0258 HOUR EQU 4 -0259 WKDAY EQU 5 -0260 MTHDAY EQU 6 -0261 MONTH EQU 7 -0262 * -0263 * INTERRUPT OUTPUT REGISTERS: -0264 * -0265 * An interrupt output may be generated at the -0266 * following rates by setting the appropriate bit -0267 * in the Interrupt Control Register (CINTCR). -0268 * The Interrupt Status Register (CINTSR) must be -0269 * read to clear the interrupt and will return -0270 * the source of the interrupt. -0271 * -0272 * 1/Month Bit 7 -0273 * 1/Week Bit 6 -0274 * 1/Day Bit 5 -0275 * 1/Hour Bit 4 -0276 * 1/Minuite Bit 3 -0277 * 1/Second Bit 2 -0278 * 10/Second Bit 1 -0279 * Comparitor Bit 0 -0280 * -0281 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER -0282 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER -0283 * -0284 * COUNTER AND RAM RESETS; GO COMMAND. -0285 * -0286 * The counter and comparitor may be reset -0287 * by writing $FF into CTRRES and CMPRES -0288 * respectivly. -0289 * A write to the Go command register (GOCMND) -0290 * will reset the 1/1000ths, 1/100ths and 1/10ths -0291 * of a second counter. -0292 * -0293 CTRRES EQU CLOCK+18 COUNTER RESET -0294 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET -0295 GOCMND EQU CLOCK+21 GO COMMAND -0296 * -0297 * CLOCK STATUS REGISTER. -0298 * -0299 * The counter takes 61 usec. to rollover for -0300 * every 1KHz clock pulse. If the Status bit is -0301 * set after reading the counter, the counter -0302 * should be re-read to ensure the time is correct. -0303 * -0304 CLKSTA EQU CLOCK+20 STATUS BIT -0305 SBYINT EQU CLOCK+22 STANDBY INTERRUPT -0306 TSTMOD EQU CLOCK+31 TEST MODE REGISTER -0307 ENDIF RTCOPT -0307 ENDIF RTCOPT -0308 * -0309 IFD ADSOPT -0310 * -0311 *************************************************** -0312 * SERIAL PORT FOR DG640 * -0313 *************************************************** -0314 * -0315 ** SET UP FOR ACKERMAN DIGITAL ADS6809 -0316 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA -0317 * -0318 ACIAS EQU MONIO+$400 CONTROL PORT -0319 * -0320 * -0321 *************************************************** -0322 * PRINTER INTERFACE * -0323 *************************************************** +0254 ENDIF CFOPT +0255 * +0256 IFD RTCOPT +0257 * +0258 ************************************************** +0259 * MM58167A REAL TIME CLOCK MEMORY MAP: +0260 ************************************************** +0261 * +0262 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 +0263 * +0264 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS +0265 * +0266 * COUNTER AND COMPARITOR REGISTERS: +0267 * +0268 * Both the Clock Counter and Clock Comparitor +0269 * consist of 8 registers for holding the time. +0270 * The register offsets from the Counter and +0271 * Comparitor registers are listed above. +0272 * +0273 COUNTR EQU CLOCK+0 +0274 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS +0275 * +0276 * CLOCK REGISTER OFFSETS: +0277 * These register offsets are used for the CLOCK +0278 * and comparitor ram CMPRAM. +0279 * +0280 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS +0281 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS +0282 SECOND EQU 2 +0283 MINUIT EQU 3 +0284 HOUR EQU 4 +0285 WKDAY EQU 5 +0286 MTHDAY EQU 6 +0287 MONTH EQU 7 +0288 * +0289 * INTERRUPT OUTPUT REGISTERS: +0290 * +0291 * An interrupt output may be generated at the +0292 * following rates by setting the appropriate bit +0293 * in the Interrupt Control Register (CINTCR). +0294 * The Interrupt Status Register (CINTSR) must be +0295 * read to clear the interrupt and will return +0296 * the source of the interrupt. +0297 * +0298 * 1/Month Bit 7 +0299 * 1/Week Bit 6 +0300 * 1/Day Bit 5 +0301 * 1/Hour Bit 4 +0302 * 1/Minuite Bit 3 +0303 * 1/Second Bit 2 +0304 * 10/Second Bit 1 +0305 * Comparitor Bit 0 +0306 * +0307 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER +0308 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER +0309 * +0310 * COUNTER AND RAM RESETS; GO COMMAND. +0311 * +0312 * The counter and comparitor may be reset +0313 * by writing $FF into CTRRES and CMPRES +0314 * respectivly. +0315 * A write to the Go command register (GOCMND) +0316 * will reset the 1/1000ths, 1/100ths and 1/10ths +0317 * of a second counter. +0318 * +0319 CTRRES EQU CLOCK+18 COUNTER RESET +0320 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET +0321 GOCMND EQU CLOCK+21 GO COMMAND +0322 * +0323 * CLOCK STATUS REGISTER. 0324 * -0325 PADATA EQU MONIO+$404 -0326 PACTRL EQU MONIO+$405 -0327 PBDATA EQU MONIO+$406 -0328 PBCTRL EQU MONIO+$407 +0325 * The counter takes 61 usec. to rollover for +0326 * every 1KHz clock pulse. If the Status bit is +0327 * set after reading the counter, the counter +0328 * should be re-read to ensure the time is correct. 0329 * -0330 ** CB1 ACK. I/P -0331 ** CB2 STB. O/P -0332 ** PB0 - PB7 DATA 1 - 8 O/P -0333 ** PORT A BIT ASSIGNMENT -0334 * -0335 PBUSY EQU $80 I/P -0336 PEMPTY EQU $40 I/P -0337 SELECT EQU $20 I/P -0338 PERROR EQU $10 I/P -0339 PRESET EQU %00000100 O/P PA3 = 0 -0340 AUTOFD EQU %00001000 O/P PA2 = 0 -0341 DIRMSK EQU %00001100 +0330 CLKSTA EQU CLOCK+20 STATUS BIT +0331 SBYINT EQU CLOCK+22 STANDBY INTERRUPT +0332 TSTMOD EQU CLOCK+31 TEST MODE REGISTER +0333 ENDIF RTCOPT +0333 ENDIF RTCOPT +0334 * +0335 IFD TRAOPT +0336 * +0337 ************************************************** +0338 * PIA INTERRUPT TIMER +0339 ************************************************** +0340 * +0341 ** PIA INTERRUPT TIMER SITS ON PORT 7 0342 * -0343 *************************************************** -0344 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * -0345 *************************************************** -0346 * -0347 ** VIDEO DISPLAY DEFINITIONS -0348 * -0349 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY -0350 LINLEN EQU 64 LENGTH OF A LINE -0351 NUMLIN EQU 16 NUMBER OF LINES -0352 SCNLEN EQU $400 LENGTH OF SCREEN -0353 * -0354 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** -0355 COLADX RMB 1 CURSOR COLUMN -0356 ROWADX RMB 1 CURSOR ROW -0357 ************************************************* -0358 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS -0359 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE -0360 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE -0361 ENDIF ADSOPT -0361 ENDIF ADSOPT -0362 * -0363 IFD DMAFOPT -0364 * -0365 *************************************************** -0366 * DMAF2 8" DRIVE * -0367 *************************************************** -0368 * -0369 ADDREG EQU $F000 ADDRESS REGISTER -0370 CNTREG EQU $F002 COUNT REGISTER -0371 CCREG EQU $F010 CHANNEL CONTROL REGISTER -0372 PRIREG EQU $F014 DMA PRIORITY REGISTER -0373 AAAREG EQU $F015 ??? -0374 BBBREG EQU $F016 ??? -0375 COMREG EQU $F020 1791 COMMAND REGISTER -0376 SECREG EQU $F022 SECTOR REGISTER -0377 DRVREG EQU $F024 DRIVE SELECT LATCH -0378 CCCREG EQU $F040 ??? -0379 ENDIF DMAFOPT -0379 ENDIF DMAFOPT -0380 IFD DATOPT -0381 ************************************************** -0382 * DYNAMIC ADDRESS TRANSLATION REGISTERS * -0383 ************************************************** -0384 * -0385 FFF0 IC11 EQU $FFF0 DAT RAM CHIP -0386 55AA TSTPAT EQU $55AA TEST PATTERN -0387 ENDIF DATOPT -0388 * -0389 *************************************************** -0390 * START OF ROM * -0391 *************************************************** -0392 * -0393 F800 ORG MONROM -0394 F800 F8 14 FDB MONITOR -0395 F802 F8 61 FDB NEXTCMD -0396 F804 FC A1 FDB INCH -0397 F806 FC 9B FDB INCHE -0398 F808 FC B9 FDB INCHEK -0399 F80A FC CE FDB OUTCH -0400 F80C FB 8F FDB PDATA -0401 F80E FB 1E FDB PCRLF -0402 F810 FB 1A FDB PSTRNG -0403 F812 FA 2E FDB LRA -0404 * -0405 IFD ADSOPT -0406 FDB PCHK CHECK FOR PRINTER INPUT -0407 FDB PINIZ INITIATE PRINTER -0408 FDB POUTCH OUTPUT CH. TO PRINTER -0409 FDB VINIZ -0410 FDB VOUTCH -0411 FDB ACINIZ -0412 FDB AOUTCH -0413 ENDIF ADSOPT -0413 ENDIF ADSOPT -0414 * -0415 * MONITOR -0416 * -0417 * VECTOR ADDRESS STRING IS..... -0418 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF -0419 * -0420 F814 8E FE 74 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING -0421 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION -0422 F81B C6 10 LDB #$10 BYTES TO MOVE = 16 -0423 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE -0424 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF -0425 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE -0426 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED -0427 * -0428 * CONTENTS FROM TO FUNCTION -0429 * $F8A1 $FE40 $DFC0 USER-V -0430 * $F8A1 $FE42 $DFC2 SWI3-V -0431 * $F8A1 $FE44 $DFC4 SWI2-V -0432 * $F8A1 $FE46 $DFC6 FIRQ-V -0433 * $F8A1 $FE48 $DFC8 IRQ-V -0434 * $FAB0 $FE4A $DFCA SWI-V -0435 * $FFFF $FE4C $DFCC SVC-VO -0436 * $FFFF $FE4E $DFCE SVC-VL -0437 * -0438 F824 8E E0 00 LDX #ACIAS -0439 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM -0440 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS -0441 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK -0442 F82F 6F E2 CLRSTK CLR ,-S -0443 F831 5A DECB -0444 F832 26 FB BNE CLRSTK -0445 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY -0446 F837 AF 6A STX 10,S ON STACK -0447 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK -0448 F83B A7 E4 STA ,S -0449 F83D 1F 43 TFR S,U -0450 F83F 17 04 9F LBSR IOINIZ INITIALIZE CONTROL PORT -0451 F842 8E FE 84 LDX #MSG1 POINT TO MONITOR MESSAGE -0452 F845 17 03 47 LBSR PDATA PRINT MSG -0453 * -0454 IFD DATOPT -0455 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA -0456 F84B 4F CLRA START TOTAL AT ZERO -0457 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY -0458 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC. -0459 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC. -0460 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL -0461 F854 19 DAA ADJ. TOTAL FOR DECIMAL -0462 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST -0463 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM -0464 F858 17 04 0C LBSR OUT2H OUTPUT HEX BYTE AS ASCII -0465 F85B 8E FE A3 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS -0466 F85E 17 03 2E LBSR PDATA PRINT MSG -0467 ENDIF DATOPT -0468 * -0469 ***** NEXTCMD ***** -0470 * -0471 F861 8E FE AA NEXTCMD LDX #MSG3 POINT TO MSG ">" -0472 F864 17 02 B3 LBSR PSTRNG PRINT MSG -0473 F867 17 04 37 LBSR INCH GET ONE CHAR. FROM TERMINAL -0474 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR. -0475 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ? -0476 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. -0477 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM. -0478 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ? -0479 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT -0480 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO... -0481 F878 17 04 53 LBSR OUTCH PRINT "^" -0482 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR -0483 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER -0484 F87F 17 04 4C PRTCMD LBSR OUTCH PRNT CMD CHAR -0485 F882 17 04 47 LBSR OUT1S PRNT SPACE -0486 F885 C1 60 CMPB #$60 -0487 F887 2F 02 BLE NXTCH0 -0488 F889 C0 20 SUBB #$20 -0489 * -0490 ***** DO TABLE LOOKUP ***** -0491 * FOR COMMAND FUNCTIONS +0343 ** PIA TIMER FOR SINGLE STEP / TRACE +0344 * +0345 * TADATA = Output = Timer preset register +0346 * TACTRL - CA1 = input = rising edge = NMI +0347 * - CA2 = Output = Timer Reset (Active High) +0348 * TBDATA = Input = Timer read back register +0349 * TBCTRL - CB1 = input = rising edge = FIRQ +0350 * - CB2 = output = strobe low on write to TBDATA = Timer Preset +0351 * +0352 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB +0353 * CRA1 = 1 CA1 Rising edge IRQ +0354 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register +0355 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 +0356 * CRA4 = 1 ] CA2 = Set/Reset output +0357 * CRA5 = 1 ] +0358 * CRA6 = X CA2 Input Interrupt Flag +0359 * CRA7 = X CA1 Interrupt Flag +0360 * +0361 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB +0362 * CRB1 = 1 CB1 Rising edge IRQ +0363 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register +0364 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 +0365 * CRB4 = 1 ] CB2 = Set/Reset output +0366 * CRB5 = 1 ] +0367 * CRB6 = X CB2 Input Interrupt Flag +0368 * CRB7 = X CB1 Interrupt Flag +0369 * +0370 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output +0371 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output +0372 * +0373 TADATA EQU MONIO+$70 Timer preset port +0374 TACTRL EQU MONIO+$71 +0375 TBDATA EQU MONIO+$72 Timer read back port +0376 TBCTRL EQU MONIO+$73 +0377 * +0378 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) +0379 * +0380 ENDIF TRAOPT +0380 ENDIF TRAOPT +0381 IFD ADSOPT +0382 * +0383 *************************************************** +0384 * SERIAL PORT FOR DG640 * +0385 *************************************************** +0386 * +0387 ** SET UP FOR ACKERMAN DIGITAL ADS6809 +0388 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA +0389 * +0390 ACIAS EQU MONIO+$400 CONTROL PORT +0391 * +0392 ENDIF ADSOPT +0392 ENDIF ADSOPT +0393 IFD PRTOPT +0394 * +0395 *************************************************** +0396 * PRINTER INTERFACE * +0397 *************************************************** +0398 * +0399 PADATA EQU MONIO+$404 +0400 PACTRL EQU MONIO+$405 +0401 PBDATA EQU MONIO+$406 +0402 PBCTRL EQU MONIO+$407 +0403 * +0404 ** CB1 ACK. I/P +0405 ** CB2 STB. O/P +0406 ** PB0 - PB7 DATA 1 - 8 O/P +0407 ** PORT A BIT ASSIGNMENT +0408 * +0409 PBUSY EQU $80 I/P +0410 PEMPTY EQU $40 I/P +0411 SELECT EQU $20 I/P +0412 PERROR EQU $10 I/P +0413 PRESET EQU %00000100 O/P PA3 = 0 +0414 AUTOFD EQU %00001000 O/P PA2 = 0 +0415 DIRMSK EQU %00001100 +0416 ENDIF PRTOPT +0416 ENDIF PRTOPT +0417 IFD DG640OPT +0418 * +0419 *************************************************** +0420 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * +0421 *************************************************** +0422 * +0423 ** VIDEO DISPLAY DEFINITIONS +0424 * +0425 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY +0426 LINLEN EQU 64 LENGTH OF A LINE +0427 NUMLIN EQU 16 NUMBER OF LINES +0428 SCNLEN EQU $400 LENGTH OF SCREEN +0429 * +0430 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** +0431 COLADX RMB 1 CURSOR COLUMN +0432 ROWADX RMB 1 CURSOR ROW +0433 ************************************************* +0434 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS +0435 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE +0436 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE +0437 ENDIF DG640OPT +0437 ENDIF DG640OPT +0438 * +0439 IFD DMAFOPT +0440 * +0441 *************************************************** +0442 * DMAF2 8" DRIVE * +0443 *************************************************** +0444 * +0445 ADDREG EQU $F000 ADDRESS REGISTER +0446 CNTREG EQU $F002 COUNT REGISTER +0447 CCREG EQU $F010 CHANNEL CONTROL REGISTER +0448 PRIREG EQU $F014 DMA PRIORITY REGISTER +0449 AAAREG EQU $F015 ??? +0450 BBBREG EQU $F016 ??? +0451 COMREG EQU $F020 1791 COMMAND REGISTER +0452 SECREG EQU $F022 SECTOR REGISTER +0453 DRVREG EQU $F024 DRIVE SELECT LATCH +0454 CCCREG EQU $F040 ??? +0455 ENDIF DMAFOPT +0455 ENDIF DMAFOPT +0456 IFD DATOPT +0457 ************************************************** +0458 * DYNAMIC ADDRESS TRANSLATION REGISTERS * +0459 ************************************************** +0460 * +0461 FFF0 IC11 EQU $FFF0 DAT RAM CHIP +0462 55AA TSTPAT EQU $55AA TEST PATTERN +0463 ENDIF DATOPT +0464 * +0465 *************************************************** +0466 * START OF ROM * +0467 *************************************************** +0468 * +0469 F800 ORG MONROM +0470 F800 F8 14 FDB MONITOR +0471 F802 F8 61 FDB NEXTCMD +0472 F804 FC A1 FDB INCH +0473 F806 FC 9B FDB INCHE +0474 F808 FC B9 FDB INCHEK +0475 F80A FC CE FDB OUTCH +0476 F80C FB 8F FDB PDATA +0477 F80E FB 1E FDB PCRLF +0478 F810 FB 1A FDB PSTRNG +0479 F812 FA 2E FDB LRA +0480 * +0481 IFD ADSOPT +0482 FDB PCHK CHECK FOR PRINTER INPUT +0483 FDB PINIZ INITIATE PRINTER +0484 FDB POUTCH OUTPUT CH. TO PRINTER +0485 FDB VINIZ +0486 FDB VOUTCH +0487 FDB ACINIZ +0488 FDB AOUTCH +0489 ENDIF ADSOPT +0489 ENDIF ADSOPT +0490 * +0491 * MONITOR 0492 * -0493 F88B 8E FE 3B NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE -0494 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? -0495 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND -0496 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE -0497 F894 8C FE 74 CMPX #TABEND REACHED END OF TABLE YET ? -0498 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY -0499 F899 8E FE AC LDX #MSG4 POINT TO MSG "WHAT?" -0500 F89C 17 02 F0 LBSR PDATA PRINT MSG -0501 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD -0502 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE -0503 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND -0504 * -0505 * "G" GO OR CONTINUE -0506 * -0507 F8A5 1F 34 GO TFR U,S -0508 F8A7 3B RTI RTI -0509 * -0510 ***** "M" MEMORY EXAMINE AND CHANGE ***** -0511 * -0512 F8A8 17 03 6B MEMCHG LBSR IN1ADR INPUT ADDRESS -0513 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN -0514 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y" -0515 F8AF 8E FE B2 MEMC2 LDX #MSG5 POINT TO MSG " - " -0516 F8B2 17 02 65 LBSR PSTRNG PRINT MSG -0517 F8B5 1F 21 TFR Y,X FETCH ADDRESS -0518 F8B7 17 03 A5 LBSR OUT4H PRINT ADDR IN HEX -0519 F8BA 17 04 0F LBSR OUT1S OUTPUT SPACE -0520 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR. -0521 F8BF 17 03 A5 LBSR OUT2H OUTPUT CONTENTS IN ASCII -0522 F8C2 17 04 07 LBSR OUT1S OUTPUT SPACE -0523 F8C5 17 03 5E LBSR BYTE LOOP WAITING FOR OPERATOR INPUT -0524 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. -0525 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? -0526 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN -0527 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? -0528 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN -0529 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW? -0530 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE -0531 F8D6 81 0D CMPA #$D IS IT A CR? -0532 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE -0533 F8DA 39 CHRTN RTS EXIT ROUTINE -0534 * -0535 * -0536 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY -0537 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE? -0538 F8DF 27 08 BEQ FORWRD $F972 -0539 F8E1 17 03 E8 LBSR OUT1S OUTPUT SPACE -0540 F8E4 86 3F LDA #'? LOAD QUESTION MARK -0541 F8E6 17 03 E5 LBSR OUTCH PRINT IT -0542 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION -0543 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS -0544 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION -0545 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS -0546 * -0547 * "S" DISPLAY STACK -0548 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM -0549 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. +0493 * VECTOR ADDRESS STRING IS..... +0494 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF +0495 * +0496 F814 8E FE 74 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING +0497 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION +0498 F81B C6 10 LDB #$10 BYTES TO MOVE = 16 +0499 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE +0500 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF +0501 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE +0502 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED +0503 * +0504 * CONTENTS FROM TO FUNCTION +0505 * $F8A1 $FE40 $DFC0 USER-V +0506 * $F8A1 $FE42 $DFC2 SWI3-V +0507 * $F8A1 $FE44 $DFC4 SWI2-V +0508 * $F8A1 $FE46 $DFC6 FIRQ-V +0509 * $F8A1 $FE48 $DFC8 IRQ-V +0510 * $FAB0 $FE4A $DFCA SWI-V +0511 * $FFFF $FE4C $DFCC SVC-VO +0512 * $FFFF $FE4E $DFCE SVC-VL +0513 * +0514 F824 8E E0 00 LDX #ACIAS +0515 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM +0516 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS +0517 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK +0518 F82F 6F E2 CLRSTK CLR ,-S +0519 F831 5A DECB +0520 F832 26 FB BNE CLRSTK +0521 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY +0522 F837 AF 6A STX 10,S ON STACK +0523 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK +0524 F83B A7 E4 STA ,S +0525 F83D 1F 43 TFR S,U +0526 F83F 17 04 9F LBSR IOINIZ INITIALIZE CONTROL PORT +0527 F842 8E FE 84 LDX #MSG1 POINT TO MONITOR MESSAGE +0528 F845 17 03 47 LBSR PDATA PRINT MSG +0529 * +0530 IFD DATOPT +0531 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA +0532 F84B 4F CLRA START TOTAL AT ZERO +0533 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY +0534 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC. +0535 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC. +0536 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL +0537 F854 19 DAA ADJ. TOTAL FOR DECIMAL +0538 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST +0539 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM +0540 F858 17 04 0C LBSR OUT2H OUTPUT HEX BYTE AS ASCII +0541 F85B 8E FE A3 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS +0542 F85E 17 03 2E LBSR PDATA PRINT MSG +0543 ENDIF DATOPT +0544 * +0545 IFD TRAOPT +0546 LBSR TRAINZ +0547 ENDIF TRAOPT +0547 ENDIF TRAOPT +0548 * +0549 ***** NEXTCMD ***** 0550 * -0551 F8F1 17 02 A2 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER -0552 F8F4 1F 32 TFR U,Y -0553 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT -0554 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK -0555 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS -0556 * -0557 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII -0558 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. -0559 * UPPER ADDRESS IN X-REG. -0560 * IF HEX ADDRESSES ARE INVALID (V)=1. -0561 * -0562 F8FD 17 03 0B MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES -0563 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX -0564 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS -0565 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? -0566 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII -0567 F908 39 EDPRTN RTS ; -0568 * -0569 * ADJUST LOWER AND UPPER ADDRESS LIMITS -0570 * TO EVEN 16 BYTE BOUNDRIES. -0571 * -0572 * IF LOWER ADDR = $4532 -0573 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. -0574 * -0575 * IF UPPER ADDR = $4567 -0576 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. -0577 * -0578 * ENTER WITH LOWER ADDRESS IN X-REG. -0579 * -UPPER ADDRESS ON TOP OF STACK. -0580 * -0581 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG -0582 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS -0583 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY -0584 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT -0585 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG -0586 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY -0587 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT -0588 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT -0589 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP -0590 F91C 17 03 9A LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD -0591 F91F 27 03 BEQ EDUMP -0592 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING -0593 F923 39 RTS ; -0594 * -0595 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS -0596 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. -0597 * -0598 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK -0599 F926 8E FE B2 LDX #MSG5 POINT TO MSG " - " -0600 F929 17 01 EE LBSR PSTRNG PRINT MSG -0601 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK -0602 F92E 17 03 2E LBSR OUT4H PRINT THE ADDRESS -0603 F931 17 03 96 LBSR OUT2S 2 SPACES -0604 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP -0605 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT -0606 F938 17 03 2C LBSR OUT2H OUTPUT HEX BYTE AS ASCII -0607 F93B 17 03 8E LBSR OUT1S OUTPUT SPACE -0608 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT -0609 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED -0610 * -0611 * PRINT 16 ASCII CHARACTERS -0612 * IF NOT PRINTABLE OR NOT VALID -0613 * ASCII PRINT A PERIOD (.) -0614 F941 17 03 86 LBSR OUT2S 2 SPACES -0615 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK -0616 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 -0617 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY -0618 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? -0619 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD -0620 F94E 81 7E CMPA #$7E IS IT VALID ASCII? -0621 F950 23 02 BLS PRASC IF SO PRINT IT -0622 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.) -0623 F954 17 03 77 PRASC LBSR OUTCH PRINT ASCII CHARACTER -0624 F957 5A DECB DECREMENT COUNT -0625 F958 26 EE BNE EDPASC -0626 F95A 20 BC BRA NXTLIN -0627 * -0628 ***** "B" SET BREAKPOINT ***** -0629 * -0630 F95C 17 02 B7 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS -0631 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR. -0632 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 -0633 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT -0634 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK -0635 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE -0636 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE -0637 F96D 35 10 PULS X POP BP ADDRESS FROM STACK -0638 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE -0639 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS -0640 F973 81 3F CMPA #$3F IS IT A SWI? -0641 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR -0642 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE -0643 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE -0644 F97B 86 3F LDA #$3F LOAD A SWI ($3F) -0645 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS -0646 F97F 39 EXITBP RTS ; -0647 * -0648 * INDICATE ERROR SETTING BREAKPOINT -0649 * -0650 F980 17 03 49 BPERR LBSR OUT1S OUTPUT SPACE -0651 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR -0652 F985 16 03 46 LBRA OUTCH PRINT "?" -0653 * -0654 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** -0655 * -0656 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE -0657 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER -0658 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE -0659 F990 5A DECB $FAAC DECREMENT BP COUNTER -0660 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE? -0661 F993 39 RTS -0662 * -0663 ***** SWI ENTRY POINT ***** -0664 * -0665 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER -0666 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG -0667 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE. -0668 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE -0669 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR -0670 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK -0671 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA -0672 F9A2 17 02 48 REGPR LBSR REGSTR GO PRINT REGISTERS -0673 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND -0674 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE -0675 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY -0676 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S -0677 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS -0678 F9B1 81 3F CMPA #$3F IS IT SWI? -0679 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S -0680 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE -0681 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS -0682 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC -0683 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S -0684 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S -0685 F9BF A7 A0 STA ,Y+ -0686 F9C1 39 RTS -0687 * -0688 ** SEARCH BREAKPOINT TABLE FOR MATCH ** -0689 * -0690 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE -0691 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER -0692 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE -0693 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? -0694 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY -0695 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER -0696 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH -0697 F9D1 39 RTS ; -0698 * -0699 * -0700 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY -0701 F9D4 39 RTS -0702 * -0703 IFD MFDCOPT -0704 * -0705 ** "U" MINI DISK BOOT -0706 * -0707 MINBOOT TST CMDFDC -0708 CLR DRVFDC -0709 LDX #$0000 -0710 LOOP LEAX $01,X -0711 CMPX #$0000 -0712 BNE LOOP -0713 LDA #$0F -0714 STA CMDFDC -0715 BSR DELAY -0716 LOOP1 LDB CMDFDC -0717 BITB #$01 -0718 BNE LOOP1 -0719 LDA #$01 -0720 STA SECFDC -0721 BSR DELAY -0722 LDA #$8C -0723 STA CMDFDC -0724 BSR DELAY -0725 LDX #$C000 -0726 BRA LOOP3 -0727 LOOP2 BITB #$02 -0728 BEQ LOOP3 -0729 LDA DATFDC -0730 STA ,X+ -0731 LOOP3 LDB CMDFDC -0732 BITB #$01 -0733 BNE LOOP2 -0734 BITB #$2C -0735 BEQ LOOP4 -0736 RTS -0737 * -0738 LOOP4 LDX #$C000 -0739 STX $0A,U -0740 TFR U,S -0741 RTI -0742 * -0743 DELAY LDB #$04 -0744 LOOP5 DECB -0745 BNE LOOP5 -0746 RTS -0747 ENDIF MFDCOPT -0747 ENDIF MFDCOPT -0748 * -0749 IFD DMAFOPT -0750 * -0751 *** "D" DISK BOOT FOR DMAF2 *** -0752 * -0753 DBOOT LDA #$DE -0754 STA DRVREG -0755 LDA #$FF -0756 STA PRIREG $FAF8 -0757 STA CCREG -0758 STA AAAREG -0759 STA BBBREG -0760 TST CCREG -0761 LDA #$D8 -0762 STA COMREG -0763 LBSR DLY -0764 DBOOT0 LDA COMREG -0765 BMI DBOOT0 -0766 LDA #$09 -0767 STA COMREG -0768 LBSR DLY -0769 * -0770 DISKWT LDA COMREG FETCH DRIVE STATUS -0771 BITA #1 TEST BUSY BIT -0772 BNE DISKWT LOOP UNTIL NOT BUSY -0773 * -0774 BITA #$10 -0775 BNE DBOOT +0551 F861 8E FE AA NEXTCMD LDX #MSG3 POINT TO MSG ">" +0552 F864 17 02 B3 LBSR PSTRNG PRINT MSG +0553 F867 17 04 37 LBSR INCH GET ONE CHAR. FROM TERMINAL +0554 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR. +0555 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ? +0556 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. +0557 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM. +0558 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ? +0559 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT +0560 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO... +0561 F878 17 04 53 LBSR OUTCH PRINT "^" +0562 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR +0563 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER +0564 F87F 17 04 4C PRTCMD LBSR OUTCH PRNT CMD CHAR +0565 F882 17 04 47 LBSR OUT1S PRNT SPACE +0566 F885 C1 60 CMPB #$60 +0567 F887 2F 02 BLE NXTCH0 +0568 F889 C0 20 SUBB #$20 +0569 * +0570 ***** DO TABLE LOOKUP ***** +0571 * FOR COMMAND FUNCTIONS +0572 * +0573 F88B 8E FE 3B NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE +0574 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? +0575 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND +0576 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE +0577 F894 8C FE 74 CMPX #TABEND REACHED END OF TABLE YET ? +0578 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY +0579 F899 8E FE AC LDX #MSG4 POINT TO MSG "WHAT?" +0580 F89C 17 02 F0 LBSR PDATA PRINT MSG +0581 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD +0582 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE +0583 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND +0584 * +0585 * "G" GO OR CONTINUE +0586 * +0587 F8A5 1F 34 GO TFR U,S +0588 F8A7 3B RTI RTI +0589 * +0590 ***** "M" MEMORY EXAMINE AND CHANGE ***** +0591 * +0592 F8A8 17 03 6B MEMCHG LBSR IN1ADR INPUT ADDRESS +0593 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN +0594 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y" +0595 F8AF 8E FE B2 MEMC2 LDX #MSG5 POINT TO MSG " - " +0596 F8B2 17 02 65 LBSR PSTRNG PRINT MSG +0597 F8B5 1F 21 TFR Y,X FETCH ADDRESS +0598 F8B7 17 03 A5 LBSR OUT4H PRINT ADDR IN HEX +0599 F8BA 17 04 0F LBSR OUT1S OUTPUT SPACE +0600 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR. +0601 F8BF 17 03 A5 LBSR OUT2H OUTPUT CONTENTS IN ASCII +0602 F8C2 17 04 07 LBSR OUT1S OUTPUT SPACE +0603 F8C5 17 03 5E LBSR BYTE LOOP WAITING FOR OPERATOR INPUT +0604 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. +0605 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? +0606 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN +0607 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? +0608 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN +0609 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW? +0610 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE +0611 F8D6 81 0D CMPA #$D IS IT A CR? +0612 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE +0613 F8DA 39 CHRTN RTS EXIT ROUTINE +0614 * +0615 * +0616 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY +0617 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE? +0618 F8DF 27 08 BEQ FORWRD $F972 +0619 F8E1 17 03 E8 LBSR OUT1S OUTPUT SPACE +0620 F8E4 86 3F LDA #'? LOAD QUESTION MARK +0621 F8E6 17 03 E5 LBSR OUTCH PRINT IT +0622 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION +0623 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS +0624 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION +0625 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS +0626 * +0627 * "S" DISPLAY STACK +0628 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM +0629 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. +0630 * +0631 F8F1 17 02 A2 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER +0632 F8F4 1F 32 TFR U,Y +0633 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT +0634 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK +0635 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS +0636 * +0637 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII +0638 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. +0639 * UPPER ADDRESS IN X-REG. +0640 * IF HEX ADDRESSES ARE INVALID (V)=1. +0641 * +0642 F8FD 17 03 0B MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES +0643 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX +0644 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS +0645 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? +0646 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII +0647 F908 39 EDPRTN RTS ; +0648 * +0649 * ADJUST LOWER AND UPPER ADDRESS LIMITS +0650 * TO EVEN 16 BYTE BOUNDRIES. +0651 * +0652 * IF LOWER ADDR = $4532 +0653 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. +0654 * +0655 * IF UPPER ADDR = $4567 +0656 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. +0657 * +0658 * ENTER WITH LOWER ADDRESS IN X-REG. +0659 * -UPPER ADDRESS ON TOP OF STACK. +0660 * +0661 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG +0662 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS +0663 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY +0664 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT +0665 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG +0666 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY +0667 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT +0668 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT +0669 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP +0670 F91C 17 03 9A LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD +0671 F91F 27 03 BEQ EDUMP +0672 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING +0673 F923 39 RTS ; +0674 * +0675 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS +0676 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. +0677 * +0678 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK +0679 F926 8E FE B2 LDX #MSG5 POINT TO MSG " - " +0680 F929 17 01 EE LBSR PSTRNG PRINT MSG +0681 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK +0682 F92E 17 03 2E LBSR OUT4H PRINT THE ADDRESS +0683 F931 17 03 96 LBSR OUT2S 2 SPACES +0684 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP +0685 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT +0686 F938 17 03 2C LBSR OUT2H OUTPUT HEX BYTE AS ASCII +0687 F93B 17 03 8E LBSR OUT1S OUTPUT SPACE +0688 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT +0689 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED +0690 * +0691 * PRINT 16 ASCII CHARACTERS +0692 * IF NOT PRINTABLE OR NOT VALID +0693 * ASCII PRINT A PERIOD (.) +0694 F941 17 03 86 LBSR OUT2S 2 SPACES +0695 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK +0696 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 +0697 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY +0698 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? +0699 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD +0700 F94E 81 7E CMPA #$7E IS IT VALID ASCII? +0701 F950 23 02 BLS PRASC IF SO PRINT IT +0702 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.) +0703 F954 17 03 77 PRASC LBSR OUTCH PRINT ASCII CHARACTER +0704 F957 5A DECB DECREMENT COUNT +0705 F958 26 EE BNE EDPASC +0706 F95A 20 BC BRA NXTLIN +0707 * +0708 ***** "B" SET BREAKPOINT ***** +0709 * +0710 F95C 17 02 B7 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS +0711 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR. +0712 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 +0713 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT +0714 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK +0715 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE +0716 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE +0717 F96D 35 10 PULS X POP BP ADDRESS FROM STACK +0718 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE +0719 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS +0720 F973 81 3F CMPA #$3F IS IT A SWI? +0721 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR +0722 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE +0723 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE +0724 F97B 86 3F LDA #$3F LOAD A SWI ($3F) +0725 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS +0726 F97F 39 EXITBP RTS ; +0727 * +0728 * INDICATE ERROR SETTING BREAKPOINT +0729 * +0730 F980 17 03 49 BPERR LBSR OUT1S OUTPUT SPACE +0731 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR +0732 F985 16 03 46 LBRA OUTCH PRINT "?" +0733 * +0734 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** +0735 * +0736 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE +0737 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER +0738 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE +0739 F990 5A DECB $FAAC DECREMENT BP COUNTER +0740 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE? +0741 F993 39 RTS +0742 * +0743 ***** SWI ENTRY POINT ***** +0744 * +0745 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER +0746 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG +0747 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE. +0748 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE +0749 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR +0750 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK +0751 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA +0752 F9A2 17 02 48 REGPR LBSR REGSTR GO PRINT REGISTERS +0753 * +0754 IFD TRAOPT +0755 LDX #0 +0756 STX TRACNT +0757 ENDIF TRAOPT +0757 ENDIF TRAOPT +0758 * +0759 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND +0760 * +0761 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE +0762 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY +0763 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S +0764 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS +0765 F9B1 81 3F CMPA #$3F IS IT SWI? +0766 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S +0767 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE +0768 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS +0769 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC +0770 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S +0771 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S +0772 F9BF A7 A0 STA ,Y+ +0773 F9C1 39 RTS +0774 * +0775 ** SEARCH BREAKPOINT TABLE FOR MATCH ** 0776 * -0777 LDX #$C000 LOGICAL ADDR. = $C000 -0778 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. -0779 ORA #$10 -0780 STA CCCREG -0781 TFR X,D -0782 COMA ; -0783 COMB ; -0784 STD ADDREG -0785 LDX #$FEFF LOAD DMA BYTE COUNT = $100 -0786 STX CNTREG STORE IN COUNT REGISTER -0787 LDA #$FF LOAD THE CHANNEL REGISTER -0788 STA CCREG -0789 LDA #$FE SET CHANNEL 0 -0790 STA PRIREG -0791 LDA #1 SET SECTOR TO "1" -0792 STA SECREG ISSUE COMMAND -0793 LDA #$8C SET SINGLE SECTOR READ -0794 STA COMREG ISSUE COMMAND -0795 BSR DLY -0796 * -0797 * THE FOLLOWING CODE TESTS THE STATUS OF THE -0798 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT -0799 * ZERO THEN IT WILL LOOP WAITING FOR "D7" -0800 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT -0801 * IS STILL A ONE THE BOOT OPERATION WILL -0802 * BE STARTED OVER FROM THE BEGINING. -0803 * -0804 CLRB ; -0805 DBOOT1 PSHS B $FB55 -0806 CLRB ; -0807 DBOOT2 TST CCREG -0808 BPL DBOOT3 -0809 DECB ; -0810 BNE DBOOT2 -0811 PULS B -0812 DECB -0813 BNE DBOOT1 -0814 BRA DBOOT -0815 DBOOT3 PULS B -0816 LDA COMREG -0817 BITA #$1C -0818 BEQ DBOOT4 -0819 RTS ; -0820 * -0821 * -0822 DBOOT4 LDB #$DE -0823 STB DRVREG -0824 LDX #$C000 -0825 STX 10,U -0826 TFR U,S $FB7B -0827 RTI ; -0828 ENDIF DMAFOPT -0828 ENDIF DMAFOPT +0777 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE +0778 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER +0779 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE +0780 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? +0781 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY +0782 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER +0783 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH +0784 F9D1 39 RTS ; +0785 * +0786 * +0787 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY +0788 F9D4 39 RTS +0789 * +0790 IFD TRAOPT +0791 * +0792 ** TRACE from address AAAA BB bytes +0793 * +0794 TRACE LBSR ALTPC1 SET UP NEW PC +0795 BVS TREXIT ADDRESS ERROR, EXIT +0796 LBSR OUT1S +0797 LBSR IN1ADR Fetch Byte Count +0798 BVS TREXIT Byte Count error, EXIT +0799 STX TRACNT +0800 * +0801 LDX NMI Save NMI Vector +0802 STX NMISAV +0803 LDX #NMIE Set up NMI for Tracing +0804 STX NMI +0805 LBSR TRAINZ Initialise Hardware +0806 BRA TRACEG Start Trace +0807 TREXIT RTS +0808 * +0809 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB +0810 * CRA1 = 1 CA1 Rising edge IRQ +0811 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register +0812 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 +0813 * CRA4 = 1 ] CA2 = Set/Reset output +0814 * CRA5 = 1 ] +0815 * CRA6 = X CA2 Input Interrupt Flag +0816 * CRA7 = X CA1 Interrupt Flag +0817 * +0818 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB +0819 * CRB1 = 1 CB1 Rising edge IRQ +0820 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register +0821 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 +0822 * CRB4 = 1 ] CB2 = Set/Reset output +0823 * CRB5 = 1 ] +0824 * CRB6 = X CB2 Input Interrupt Flag +0825 * CRB7 = X CB1 Interrupt Flag +0826 * +0827 * +0828 ** TRACE NMI ENTRY POINT 0829 * -0830 IFD FPGAOPT -0831 * -0832 * COMPACT FLASH BOOT -0833 * -0834 F9D5 8D 40 CFBOOT BSR WAITRDY -0835 F9D7 86 E0 LDA #HEADLBA -0836 F9D9 B7 E0 46 STA CF_HEAD -0837 F9DC 8D 39 BSR WAITRDY -0838 F9DE 86 01 LDA #FEAT8BIT -0839 F9E0 B7 E0 41 STA CF_FEATURE -0840 F9E3 86 EF LDA #CMDFEATURE -0841 F9E5 B7 E0 47 STA CF_COMAND -0842 F9E8 8D 2D BSR WAITRDY -0843 * -0844 * READ SECTORS FROM CF -0845 * -0846 F9EA 86 01 CFREAD LDA #$01 -0847 F9EC B7 E0 42 STA CF_SECCNT -0848 F9EF 4F CLRA -0849 F9F0 B7 E0 43 STA CF_SECNUM -0850 F9F3 B7 E0 44 STA CF_CYLLO -0851 F9F6 B7 E0 45 STA CF_CYLHI -0852 * -0853 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE -0854 F9FB B7 E0 47 STA CF_COMAND -0855 F9FE 8D 17 BSR WAITRDY -0856 FA00 8E C0 00 LDX #$C000 -0857 * -0858 * READ LOOP -0859 * -0860 FA03 8D 21 RDLOOP BSR WAITDRQ -0861 FA05 B6 E0 40 LDA CF_DATA -0862 FA08 A7 80 STA ,X+ -0863 FA0A 8C C2 00 CMPX #$C200 -0864 FA0D 26 F4 BNE RDLOOP -0865 * -0866 FA0F 8E C0 00 LDX #$C000 -0867 FA12 AF 4A STX $0A,U -0868 FA14 1F 34 TFR U,S -0869 FA16 3B RTI -0870 * -0871 * WAIT UNTIL READY -0872 * -0873 FA17 B6 E0 47 WAITRDY LDA CF_STATUS -0874 FA1A 85 80 BITA #BUSY -0875 FA1C 26 F9 BNE WAITRDY -0876 FA1E B6 E0 47 LDA CF_STATUS -0877 FA21 85 40 BITA #DRDY -0878 FA23 27 F2 BEQ WAITRDY -0879 FA25 39 RTS +0830 NMIE TFR S,U +0831 LDA #$36 Disable Interrupt, CA2 Low +0832 STA TACTRL +0833 LDA TADATA Clear Interrupt flag by reading data port +0834 * +0835 LBSR REGSTR DUMP REGISTERS +0836 * +0837 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI +0838 LDA ,X +0839 CMPA #$3F +0840 BEQ TRACEX EXIT ON SWI +0841 * +0842 LDX TRACNT CHECK IF TRACE COUNT EXPIRED +0843 BEQ TRACEX YES, GO BACK TO THE MONITOR +0844 LEAX -1,X DECREMENT TRACE COUNT +0845 STX TRACNT +0846 * +0847 ** TRACE GO (RESUME SINGLE STEP) +0848 * +0849 TRACEG TFR U,S SET UP PROGRAM STACK POINTER +0850 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) +0851 STA TADATA +0852 LDA #$36 LOAD STROBE LOW +0853 STA TACTRL +0854 LDA TADATA CLEAR INTERRUPT +0855 LDA #$36 RELEASE RESET +0856 STA TBCTRL +0857 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE +0858 STA TACTRL +0859 RTI GO EXECUTE INSTRUCTION +0860 * +0861 TRACEX LDX NMISAV Restore NMI vector +0862 STX NMI +0863 LBRA NEXTCMD Jump back to the command loop. +0864 * +0865 ** TRACE HARDWARE INITIALISATION +0866 * +0867 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED +0868 STA TACTRL +0869 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED +0870 STA TBCTRL +0871 LDA #$FF PORTA = OUTPUT +0872 STA TADATA +0873 LDA #$00 PORTB = INPUT +0874 STA TBDATA +0875 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW +0876 STA TACTRL +0877 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH +0878 STA TBCTRL +0879 RTS 0880 * -0881 * WAIT FOR DATA REQUEST -0882 * -0883 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS -0884 FA29 85 08 BITA #DRQ -0885 FA2B 27 F9 BEQ WAITDRQ -0886 FA2D 39 RTS -0887 ENDIF FPGAOPT -0888 * -0889 IFD RTCOPT -0890 * -0891 * CLOCK INTER FACE UTILITY -0892 * -0893 * TIME -0894 * If no argument is specified, the current time -0895 * will be displayed. -0896 * -0897 * READ A REGISTER FROM THE COUNTER. -0898 * The X Index rgister points to the register -0899 * to be read. The Status Register is checked -0900 * before and after the register is read before -0901 * returning a value in accumulator A -0902 * -0903 RDCLK TST CLKSTA -0904 BNE RDCLK -0905 RDCLK1 LDA 0,X -0906 TST CLKSTA -0907 BNE RDCLK1 -0908 RTS -0909 * -0910 * MAIN PROGRAM: -0911 * -0912 TIMSET LDX #COUNTR POINT TO TIMER -0913 LBSR BYTE READ HOURS -0914 BVS SHOWTM NO ARG, DISP TIME -0915 STA HOUR,X -0916 LBSR OUT1S -0917 LBSR BYTE READ MINUITES -0918 BVS SHOWTM -0919 STA MINUIT,X -0920 LBSR OUT1S -0921 LBSR BYTE SECONDS. -0922 BVS SHOWTM -0923 STA SECOND,X -0924 * -0925 * DISPLAY CURRENT TIME -0926 * -0927 SHOWTM LBSR PCRLF -0928 LDX #COUNTR+HOUR -0929 LDB #3 -0930 SHOWLP BSR RDCLK -0931 LBSR OUT2H -0932 LDA #': -0933 LBSR OUTCH -0934 LEAX -1,X -0935 DECB -0936 BNE SHOWLP -0937 RTS -0938 * -0939 * INITIATE CLOCK. -0940 * MASK INTERRUPTS. -0941 * -0942 CLKINZ CLR CINTCR MASK ALL INTERRUPTS -0943 TST CINTSR CLEAR ANY INTERRUPTS -0944 RTS -0945 ENDIF RTCOPT -0945 ENDIF RTCOPT -0946 IFD DATOPT -0947 * -0948 ***** LRA LOAD REAL ADDRESS ***** -0949 * -0950 * THE FOLLOWING CODE LOADS THE 20-BIT -0951 * PHYSICAL ADDRESS OF A MEMORY BYTE -0952 * INTO THE "A" AND "X" REGISTERS. THIS -0953 * ROUTINE IS ENTERED WITH THE LOGICAL -0954 * ADDRESS OF A MEMORY BYTE IN THE "IX" -0955 * REGISTER. EXIT IS MADE WITH THE HIGH- -0956 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL -0957 * ADDRESS IN THE "A" REGISTER, AND THE -0958 * LOW-ORDER 16-BITS OF THE 20-BIT -0959 * PHYSICAL ADDRESS IN THE "IX" REGISTER. -0960 * ALL OTHER REGISTERS ARE PRESERVED. -0961 * THIS ROUTINE IS REQUIRED SINCE THE -0962 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST -0963 * PRESENT PHYSICAL ADDRESSES ON THE -0964 * SYSTEM BUS. -0965 * -0966 FA2E 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK -0967 FA30 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK -0968 FA32 44 LSRA ; -0969 FA33 44 LSRA ADJ FOR INDEXED INTO -0970 FA34 44 LSRA CORRESPONDING LOCATION -0971 FA35 44 LSRA IN LRA TABLE -0972 FA36 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS -0973 FA3A E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE -0974 FA3C 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED -0975 FA3D 54 LSRB PHYSICAL ADDRESS. -0976 FA3E 54 LSRB EXTENDED MS 4-BITS ARE RETURNED -0977 FA3F 54 LSRB IN THE "A" ACCUMULATOR -0978 FA40 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK -0979 FA42 E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE -0980 FA44 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG -0981 FA45 58 ASLB ADJ DATA FOR RELOCATION IN X REG -0982 FA46 58 ASLB ; -0983 FA47 58 ASLB $FB97 -0984 FA48 58 ASLB ; -0985 FA49 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR. -0986 FA4B 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS -0987 FA4D A7 62 STA 2,S SAVE IT IN X REG ON STACK -0988 FA4F EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. -0989 * -0990 * PLUS LS NIBBLE OF LOGICAL ADDRESS -0991 FA51 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG -0992 * ON STACK -0993 FA53 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK -0994 ENDIF DATOPT -0995 * -0996 * DELAY LOOP -0997 * -0998 FA55 34 04 DLY PSHS B SAVE CONTENTS OF "B" -0999 FA57 C6 20 LDB #$20 GET LOOP DELAY VALUE -1000 FA59 5A SUB1 DECB SUBTRACT ONE FROM VALUE -1001 FA5A 26 FD BNE SUB1 LOOP UNTIL ZERO -1002 FA5C 35 84 PULS B,PC RESTORE CONTENTS OF "B" -1003 * RTS ; -1004 * -1005 ***** "L" LOAD MIKBUG TAPE ***** -1006 * -1007 FA5E BD FC E3 LOAD JSR ACINIZ -1008 FA61 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE -1009 FA63 17 02 68 LBSR OUTCH OUTPUT IT TO TERMINAL PORT -1010 FA66 7F DF E2 CLR ECHO TURN OFF ECHO FLAG -1011 FA69 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO -1012 FA6C 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? -1013 FA6E 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. -1014 FA70 17 02 23 LBSR ECHON -1015 FA73 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ? -1016 FA75 27 3D BEQ LOAD21 IF SO, EXIT LOAD -1017 FA77 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? -1018 FA79 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR. -1019 FA7B 17 01 A8 LBSR BYTE INPUT BYTE COUNT -1020 FA7E 34 02 PSHS A PUSH COUNT ON STACK -1021 FA80 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX -1022 FA82 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS -1023 FA85 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX -1024 FA87 34 10 PSHS X PUSH ADDR ON STACK -1025 FA89 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE -1026 FA8B EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM -1027 FA8D EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM -1028 FA8F 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS -1029 FA91 6A E4 DEC ,S ADDRESS BYTES. -1030 FA93 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK -1031 FA95 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) -1032 FA98 35 04 PULS B POP CHECKSUM FROM STACK -1033 FA9A 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX -1034 FA9C 34 02 PSHS A PUSH DATA BYTE ON STACK -1035 FA9E EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK -1036 FAA0 6A E4 DEC ,S DECREMENT BYTE COUNT 1 -1037 FAA2 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM -1038 FAA4 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY -1039 FAA6 20 EB BRA LOAD10 GET NEXT DATA BYTE -1040 FAA8 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; -1041 FAA9 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) -1042 FAAB C1 FF CMPB #$FF CHECKSUM OK? -1043 FAAD 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE -1044 FAAF 86 3F LDA #'? LOAD (?) ERROR INDICATOR -1045 FAB1 17 02 1A LBSR OUTCH OUTPUT IT TO TERMINAL -1046 FAB4 73 DF E2 LOAD21 COM ECHO TURN ECHO ON -1047 FAB7 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE -1048 FAB9 16 02 12 LBRA OUTCH OUTPUT IT -1049 * -1050 ***** "P" PUNCH MIKBUG TAPE ***** -1051 * -1052 FABC 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK -1053 FABE 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS -1054 FAC1 34 30 PSHS X,Y SAVE ADDRESSES ON STACK -1055 FAC3 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH -1056 FAC5 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR -1057 FAC7 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH -1058 FAC9 30 01 LEAX 1,X INCREMENT END ADDRESS -1059 FACB AF E4 STX ,S STORE END ADDR ON STACK -1060 FACD BD FC E3 JSR ACINIZ -1061 FAD0 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE -1062 FAD2 17 01 F9 LBSR OUTCH OUTPUT IT TO TERMINAL -1063 FAD5 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC -1064 FAD7 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END -1065 FAD9 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT -1066 FADB 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES? -1067 FADF 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES -1068 FAE1 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. -1069 FAE3 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT -1070 FAE5 8E FE F3 LDX #MSG20 POINT TO MSG "S1" -1071 FAE8 17 00 2F LBSR PSTRNG PRINT MSG -1072 FAEB CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT -1073 FAED 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH -1074 FAEF 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT -1075 FAF2 AE 62 LDX 2,S LOAD BEGIN ADDRESS -1076 FAF4 17 01 68 LBSR OUT4H PUNCH ADDRESS -1077 FAF7 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM -1078 FAF9 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM -1079 FAFB EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM -1080 FAFD A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH -1081 FAFF 17 01 65 LBSR OUT2H OUTPUT DATA BYTE -1082 FB02 6A 64 DEC 4,S DECREMENT BYTE COUNT -1083 FB04 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE -1084 FB06 53 COMB 1's COMPLIMENT CHECKSUM BYTE -1085 FB07 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH -1086 FB09 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE -1087 FB0C AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR -1088 FB0E AC E4 CMPX ,S COMPARE IT TO END ADDR -1089 FB10 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. -1090 FB12 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE -1091 FB14 17 01 B7 LBSR OUTCH OUTPUT IT -1092 FB17 32 65 LEAS 5,S READJUST STACK POINTER -1093 FB19 39 RTS ; -1094 * -1095 * PRINT STRING PRECEEDED BY A CR & LF. -1096 * -1097 FB1A 8D 02 PSTRNG BSR PCRLF PRINT CR/LF -1098 FB1C 20 71 BRA PDATA PRINT STRING POINTED TO BY IX -1099 * -1100 * PCRLF -1101 * -1102 FB1E 34 10 PCRLF PSHS X SAVE IX -1103 FB20 8E FE A4 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS -1104 FB23 17 00 69 LBSR PDATA PRINT MSG -1105 FB26 35 90 PULS X,PC RESTORE IX & RETURN -1106 * -1107 * LONG BRANCHES TO COMMON ROUTINES -1108 * -1109 FB28 16 01 A1 JOUT1S LBRA OUT1S -1110 FB2B 16 00 F8 JBYTE LBRA BYTE -1111 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR -1112 * -1113 * ALTER "PC" PROGRAM COUNTER -1114 * -1115 FB31 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " -1116 FB34 8D F2 BSR JOUT1S OUTPUT SPACE -1117 FB36 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC" -1118 FB38 29 02 BVS ALTPCD EXIT IF INVALID HEX -1119 FB3A AF 4A STX 10,U POKE IN NEW CONTENTS -1120 FB3C 39 ALTPCD RTS ; -1121 * -1122 * ALTER "U" USER STACK POINTER -1123 * -1124 FB3D 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = " -1125 FB3F 8D E7 BSR JOUT1S OUTPUT SPACE -1126 FB41 8D EB BSR JIN1ADR -1127 FB43 29 02 BVS ALTUD -1128 FB45 AF 48 STX 8,U -1129 FB47 39 ALTUD RTS ; -1130 * -1131 * ALTER "Y" INDEX REGISTER -1132 * -1133 FB48 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = " -1134 FB4A 8D DC BSR JOUT1S OUTPUT SPACE -1135 FB4C 8D E0 BSR JIN1ADR -1136 FB4E 29 02 BVS ALTYD -1137 FB50 AF 46 STX 6,U $F8F0 -1138 FB52 39 ALTYD RTS ; -1139 * -1140 * ALTER "X" INDEX REGISTER -1141 * -1142 FB53 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " -1143 FB55 8D D1 BSR JOUT1S OUTPUT SPACE -1144 FB57 8D D5 BSR JIN1ADR -1145 FB59 29 02 BVS ALTXD -1146 FB5B AF 44 STX 4,U -1147 FB5D 39 ALTXD RTS ; -1148 * -1149 * ALTER "DP" DIRECT PAGE REGISTER -1150 * -1151 FB5E 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " -1152 FB60 8D C6 BSR JOUT1S OUTPUT SPACE -1153 FB62 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR) -1154 FB64 29 02 BVS ALTDPD -1155 FB66 A7 43 STA 3,U -1156 FB68 39 ALTDPD RTS ; -1157 * -1158 * ALTER "B" ACCUMULATOR -1159 * -1160 FB69 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = " -1161 FB6B 8D BB BSR JOUT1S OUTPUT SPACE -1162 FB6D 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR) -1163 FB6F 29 02 BVS ALTBD -1164 FB71 A7 42 STA 2,U -1165 FB73 39 ALTBD RTS $F91C -1166 * -1167 * ALTER "A" ACCUMULATOR +0881 ENDIF TRAOPT +0881 ENDIF TRAOPT +0882 IFD MFDCOPT +0883 * +0884 ** "U" MINI DISK BOOT +0885 * +0886 MINBOOT TST CMDFDC +0887 CLR DRVFDC +0888 LDX #$0000 +0889 LOOP LEAX $01,X +0890 CMPX #$0000 +0891 BNE LOOP +0892 LDA #$0F +0893 STA CMDFDC +0894 BSR DELAY +0895 LOOP1 LDB CMDFDC +0896 BITB #$01 +0897 BNE LOOP1 +0898 LDA #$01 +0899 STA SECFDC +0900 BSR DELAY +0901 LDA #$8C +0902 STA CMDFDC +0903 BSR DELAY +0904 LDX #$C000 +0905 BRA LOOP3 +0906 LOOP2 BITB #$02 +0907 BEQ LOOP3 +0908 LDA DATFDC +0909 STA ,X+ +0910 LOOP3 LDB CMDFDC +0911 BITB #$01 +0912 BNE LOOP2 +0913 BITB #$2C +0914 BEQ LOOP4 +0915 RTS +0916 * +0917 LOOP4 LDX #$C000 +0918 STX $0A,U +0919 TFR U,S +0920 RTI +0921 * +0922 DELAY LDB #$04 +0923 LOOP5 DECB +0924 BNE LOOP5 +0925 RTS +0926 ENDIF MFDCOPT +0926 ENDIF MFDCOPT +0927 * +0928 IFD DMAFOPT +0929 * +0930 *** "D" DISK BOOT FOR DMAF2 *** +0931 * +0932 DBOOT LDA #$DE +0933 STA DRVREG +0934 LDA #$FF +0935 STA PRIREG $FAF8 +0936 STA CCREG +0937 STA AAAREG +0938 STA BBBREG +0939 TST CCREG +0940 LDA #$D8 +0941 STA COMREG +0942 LBSR DLY +0943 DBOOT0 LDA COMREG +0944 BMI DBOOT0 +0945 LDA #$09 +0946 STA COMREG +0947 LBSR DLY +0948 * +0949 DISKWT LDA COMREG FETCH DRIVE STATUS +0950 BITA #1 TEST BUSY BIT +0951 BNE DISKWT LOOP UNTIL NOT BUSY +0952 * +0953 BITA #$10 +0954 BNE DBOOT +0955 * +0956 LDX #$C000 LOGICAL ADDR. = $C000 +0957 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. +0958 ORA #$10 +0959 STA CCCREG +0960 TFR X,D +0961 COMA ; +0962 COMB ; +0963 STD ADDREG +0964 LDX #$FEFF LOAD DMA BYTE COUNT = $100 +0965 STX CNTREG STORE IN COUNT REGISTER +0966 LDA #$FF LOAD THE CHANNEL REGISTER +0967 STA CCREG +0968 LDA #$FE SET CHANNEL 0 +0969 STA PRIREG +0970 LDA #1 SET SECTOR TO "1" +0971 STA SECREG ISSUE COMMAND +0972 LDA #$8C SET SINGLE SECTOR READ +0973 STA COMREG ISSUE COMMAND +0974 BSR DLY +0975 * +0976 * THE FOLLOWING CODE TESTS THE STATUS OF THE +0977 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT +0978 * ZERO THEN IT WILL LOOP WAITING FOR "D7" +0979 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT +0980 * IS STILL A ONE THE BOOT OPERATION WILL +0981 * BE STARTED OVER FROM THE BEGINING. +0982 * +0983 CLRB ; +0984 DBOOT1 PSHS B $FB55 +0985 CLRB ; +0986 DBOOT2 TST CCREG +0987 BPL DBOOT3 +0988 DECB ; +0989 BNE DBOOT2 +0990 PULS B +0991 DECB +0992 BNE DBOOT1 +0993 BRA DBOOT +0994 DBOOT3 PULS B +0995 LDA COMREG +0996 BITA #$1C +0997 BEQ DBOOT4 +0998 RTS ; +0999 * +1000 * +1001 DBOOT4 LDB #$DE +1002 STB DRVREG +1003 LDX #$C000 +1004 STX 10,U +1005 TFR U,S $FB7B +1006 RTI ; +1007 ENDIF DMAFOPT +1007 ENDIF DMAFOPT +1008 * +1009 IFD CFOPT +1010 * +1011 * COMPACT FLASH BOOT +1012 * +1013 F9D5 8D 40 CFBOOT BSR WAITRDY +1014 F9D7 86 E0 LDA #HEADLBA +1015 F9D9 B7 E0 46 STA CF_HEAD +1016 F9DC 8D 39 BSR WAITRDY +1017 F9DE 86 01 LDA #FEAT8BIT +1018 F9E0 B7 E0 41 STA CF_FEATURE +1019 F9E3 86 EF LDA #CMDFEATURE +1020 F9E5 B7 E0 47 STA CF_COMAND +1021 F9E8 8D 2D BSR WAITRDY +1022 * +1023 * READ SECTORS FROM CF +1024 * +1025 F9EA 86 01 CFREAD LDA #$01 +1026 F9EC B7 E0 42 STA CF_SECCNT +1027 F9EF 4F CLRA +1028 F9F0 B7 E0 43 STA CF_SECNUM +1029 F9F3 B7 E0 44 STA CF_CYLLO +1030 F9F6 B7 E0 45 STA CF_CYLHI +1031 * +1032 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE +1033 F9FB B7 E0 47 STA CF_COMAND +1034 F9FE 8D 17 BSR WAITRDY +1035 FA00 8E C0 00 LDX #$C000 +1036 * +1037 * READ LOOP +1038 * +1039 FA03 8D 21 RDLOOP BSR WAITDRQ +1040 FA05 B6 E0 40 LDA CF_DATA +1041 FA08 A7 80 STA ,X+ +1042 FA0A 8C C2 00 CMPX #$C200 +1043 FA0D 26 F4 BNE RDLOOP +1044 * +1045 FA0F 8E C0 00 LDX #$C000 +1046 FA12 AF 4A STX $0A,U +1047 FA14 1F 34 TFR U,S +1048 FA16 3B RTI +1049 * +1050 * WAIT UNTIL READY +1051 * +1052 FA17 B6 E0 47 WAITRDY LDA CF_STATUS +1053 FA1A 85 80 BITA #BUSY +1054 FA1C 26 F9 BNE WAITRDY +1055 FA1E B6 E0 47 LDA CF_STATUS +1056 FA21 85 40 BITA #DRDY +1057 FA23 27 F2 BEQ WAITRDY +1058 FA25 39 RTS +1059 * +1060 * WAIT FOR DATA REQUEST +1061 * +1062 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS +1063 FA29 85 08 BITA #DRQ +1064 FA2B 27 F9 BEQ WAITDRQ +1065 FA2D 39 RTS +1066 ENDIF CFOPT +1067 * +1068 IFD RTCOPT +1069 * +1070 * CLOCK INTER FACE UTILITY +1071 * +1072 * TIME +1073 * If no argument is specified, the current time +1074 * will be displayed. +1075 * +1076 * READ A REGISTER FROM THE COUNTER. +1077 * The X Index rgister points to the register +1078 * to be read. The Status Register is checked +1079 * before and after the register is read before +1080 * returning a value in accumulator A +1081 * +1082 RDCLK TST CLKSTA +1083 BNE RDCLK +1084 RDCLK1 LDA 0,X +1085 TST CLKSTA +1086 BNE RDCLK1 +1087 RTS +1088 * +1089 * MAIN PROGRAM: +1090 * +1091 TIMSET LDX #COUNTR POINT TO TIMER +1092 LBSR BYTE READ HOURS +1093 BVS SHOWTM NO ARG, DISP TIME +1094 STA HOUR,X +1095 LBSR OUT1S +1096 LBSR BYTE READ MINUITES +1097 BVS SHOWTM +1098 STA MINUIT,X +1099 LBSR OUT1S +1100 LBSR BYTE SECONDS. +1101 BVS SHOWTM +1102 STA SECOND,X +1103 * +1104 * DISPLAY CURRENT TIME +1105 * +1106 SHOWTM LBSR PCRLF +1107 LDX #COUNTR+HOUR +1108 LDB #3 +1109 SHOWLP BSR RDCLK +1110 LBSR OUT2H +1111 LDA #': +1112 LBSR OUTCH +1113 LEAX -1,X +1114 DECB +1115 BNE SHOWLP +1116 RTS +1117 * +1118 * INITIATE CLOCK. +1119 * MASK INTERRUPTS. +1120 * +1121 CLKINZ CLR CINTCR MASK ALL INTERRUPTS +1122 TST CINTSR CLEAR ANY INTERRUPTS +1123 RTS +1124 ENDIF RTCOPT +1124 ENDIF RTCOPT +1125 IFD DATOPT +1126 * +1127 ***** LRA LOAD REAL ADDRESS ***** +1128 * +1129 * THE FOLLOWING CODE LOADS THE 20-BIT +1130 * PHYSICAL ADDRESS OF A MEMORY BYTE +1131 * INTO THE "A" AND "X" REGISTERS. THIS +1132 * ROUTINE IS ENTERED WITH THE LOGICAL +1133 * ADDRESS OF A MEMORY BYTE IN THE "IX" +1134 * REGISTER. EXIT IS MADE WITH THE HIGH- +1135 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL +1136 * ADDRESS IN THE "A" REGISTER, AND THE +1137 * LOW-ORDER 16-BITS OF THE 20-BIT +1138 * PHYSICAL ADDRESS IN THE "IX" REGISTER. +1139 * ALL OTHER REGISTERS ARE PRESERVED. +1140 * THIS ROUTINE IS REQUIRED SINCE THE +1141 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST +1142 * PRESENT PHYSICAL ADDRESSES ON THE +1143 * SYSTEM BUS. +1144 * +1145 FA2E 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK +1146 FA30 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK +1147 FA32 44 LSRA ; +1148 FA33 44 LSRA ADJ FOR INDEXED INTO +1149 FA34 44 LSRA CORRESPONDING LOCATION +1150 FA35 44 LSRA IN LRA TABLE +1151 FA36 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS +1152 FA3A E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE +1153 FA3C 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED +1154 FA3D 54 LSRB PHYSICAL ADDRESS. +1155 FA3E 54 LSRB EXTENDED MS 4-BITS ARE RETURNED +1156 FA3F 54 LSRB IN THE "A" ACCUMULATOR +1157 FA40 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK +1158 FA42 E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE +1159 FA44 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG +1160 FA45 58 ASLB ADJ DATA FOR RELOCATION IN X REG +1161 FA46 58 ASLB ; +1162 FA47 58 ASLB $FB97 +1163 FA48 58 ASLB ; +1164 FA49 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR. +1165 FA4B 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS +1166 FA4D A7 62 STA 2,S SAVE IT IN X REG ON STACK +1167 FA4F EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. 1168 * -1169 FB74 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = " -1170 FB76 8D B0 BSR JOUT1S OUTPUT SPACE -1171 FB78 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR) -1172 FB7A 29 02 BVS ALTAD -1173 FB7C A7 41 STA 1,U -1174 FB7E 39 ALTAD RTS ; -1175 * -1176 * ALTER "CC" REGISTER -1177 * -1178 FB7F 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " -1179 FB81 8D A5 BSR JOUT1S OUTPUT SPACE -1180 FB83 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR) -1181 FB85 29 04 BVS ALTCCD -1182 FB87 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST -1183 FB89 A7 C4 STA ,U -1184 FB8B 39 ALTCCD RTS ; +1169 * PLUS LS NIBBLE OF LOGICAL ADDRESS +1170 FA51 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG +1171 * ON STACK +1172 FA53 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK +1173 ENDIF DATOPT +1174 * +1175 * DELAY LOOP +1176 * +1177 FA55 34 04 DLY PSHS B SAVE CONTENTS OF "B" +1178 FA57 C6 20 LDB #$20 GET LOOP DELAY VALUE +1179 FA59 5A SUB1 DECB SUBTRACT ONE FROM VALUE +1180 FA5A 26 FD BNE SUB1 LOOP UNTIL ZERO +1181 FA5C 35 84 PULS B,PC RESTORE CONTENTS OF "B" +1182 * RTS ; +1183 * +1184 ***** "L" LOAD MIKBUG TAPE ***** 1185 * -1186 * PDATA -1187 * -1188 FB8C 17 01 3F PRINT LBSR OUTCH -1189 FB8F A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT -1190 FB91 81 04 CMPA #4 IS IT EOT? -1191 FB93 26 F7 BNE PRINT IF NOT EOT PRINT IT -1192 FB95 39 RTS ; -1193 * -1194 * PRINT REGISTERS -1195 * -1196 FB96 8E FE B6 PRTSP LDX #MSG10 POINT TO MSG "SP=" -1197 FB99 8D F4 BSR PDATA PRINT MSG -1198 FB9B 1F 31 TFR U,X -1199 FB9D 16 00 BF JOUT4H LBRA OUT4H -1200 * -1201 FBA0 8E FE C2 PRTUS LDX #MSG12 POINT TO MSG "US=" -1202 FBA3 8D EA BSR PDATA PRINT MSG -1203 FBA5 AE 48 LDX 8,U -1204 FBA7 20 F4 BRA JOUT4H -1205 * -1206 FBA9 8E FE D4 PRTDP LDX #MSG15 POINT TO MSG "DP=" -1207 FBAC 8D E1 BSR PDATA PRINT MSG -1208 FBAE A6 43 LDA 3,U -1209 FBB0 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII -1210 * -1211 FBB3 8E FE CE PRTIX LDX #MSG14 POINT TO MSG "IX=" -1212 FBB6 8D D7 BSR PDATA PRINT MSG -1213 FBB8 AE 44 LDX 4,U $FCE6 -1214 FBBA 20 E1 BRA JOUT4H -1215 * -1216 FBBC 8E FE C8 PRTIY LDX #MSG13 POINT TO MSG "IY=" -1217 FBBF 8D CE BSR PDATA PRINT MSG -1218 FBC1 AE 46 LDX 6,U -1219 FBC3 20 D8 BRA JOUT4H -1220 * -1221 FBC5 8E FE BC PRTPC LDX #MSG11 POINT TO MSG "PC=" -1222 FBC8 8D C5 BSR PDATA PRINT MSG -1223 FBCA AE 4A LDX 10,U -1224 FBCC 20 CF BRA JOUT4H -1225 * -1226 FBCE 8E FE DA PRTA LDX #MSG16 POINT TO MSG "A=" -1227 FBD1 8D BC BSR PDATA PRINT MSG -1228 FBD3 A6 41 LDA 1,U -1229 FBD5 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII -1230 * -1231 FBD7 8E FE DF PRTB LDX #MSG17 POINT TO MSG "B=" -1232 FBDA 8D B3 BSR PDATA PRINT MSG -1233 FBDC A6 42 LDA 2,U -1234 FBDE 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII -1235 * -1236 FBE0 8E FE E4 PRTCC LDX #MSG18 POINT TO MSG "CC:" -1237 FBE3 8D AA BSR PDATA PRINT MSG -1238 FBE5 A6 C4 LDA ,U -1239 FBE7 8E FE EB LDX #MSG19 POINT TO MSG "EFHINZVC" -1240 FBEA 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT -1241 * -1242 * "R" DISPLAY REGISTERS -1243 * -1244 FBED 8E FE B2 REGSTR LDX #MSG5 POINT TO MSG " - " -1245 FBF0 17 FF 27 LBSR PSTRNG PRINT MSG -1246 FBF3 8D A1 BSR PRTSP $FCBF -1247 FBF5 8D A9 BSR PRTUS $FCCA -1248 FBF7 8D B0 BSR PRTDP $FCD5 -1249 FBF9 8D B8 BSR PRTIX $FCE0 -1250 FBFB 8D BF BSR PRTIY $FCEB -1251 FBFD 8E FE B2 LDX #MSG5 POINT TO MSG " - " -1252 FC00 17 FF 17 LBSR PSTRNG PRINT MSG -1253 FC03 8D C0 BSR PRTPC $FCF5 -1254 FC05 8D C7 BSR PRTA $FCFF -1255 FC07 8D CE BSR PRTB $FD09 -1256 FC09 20 D5 BRA PRTCC $FD13 -1257 * -1258 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE -1259 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. -1260 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". -1261 * THE SECOND IS RETURNED IN "IX". THE "V" BIT -1262 * IN THE C-CODE REG. IS SET IF AN INVALID HEX -1263 * ADDRESS IS INPUT. -1264 * -1265 FC0B 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS -1266 FC0D 29 4D BVS NOTHEX EXIT IF NOT VALID HEX -1267 FC0F 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY" -1268 FC11 86 2D LDA #'- -1269 FC13 17 00 B8 LBSR OUTCH PRINT " - " -1270 * -1271 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE -1272 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE -1273 * ADDRESS IS RETURNED IN THE "X" REGISTER. -1274 * -1275 FC16 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) -1276 FC18 29 42 BVS NOTHEX EXIT IF NOT VALID HEX -1277 FC1A 1F 01 TFR D,X -1278 FC1C 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) -1279 FC1E 29 3C BVS NOTHEX -1280 FC20 34 10 PSHS X -1281 FC22 A7 61 STA 1,S -1282 FC24 35 90 PULS X,PC -1283 * -1284 ***** INPUT BYTE (2 HEX CHAR.) ***** -1285 * -1286 FC26 8D 11 BYTE BSR INHEX GET HEX LEFT -1287 FC28 29 32 BVS NOTHEX EXIT IF NOT VALID HEX -1288 FC2A 48 ASLA ; -1289 FC2B 48 ASLA ; -1290 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE -1291 FC2D 48 ASLA ; -1292 FC2E 1F 89 TFR A,B PUT HEXL IN "B" -1293 FC30 8D 07 BSR INHEX GET HEX RIGHT -1294 FC32 29 28 BVS NOTHEX EXIT IF NOT VALID HEX -1295 FC34 34 04 PSHS B PUSH HEXL ON STACK -1296 FC36 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK -1297 FC38 39 RTS RETURN WITH HEX L&R IN "A" -1298 * -1299 * -1300 FC39 8D 5B INHEX BSR ECHON INPUT ASCII CHAR. -1301 FC3B 81 30 CMPA #'0 IS IT > OR = "0" ? -1302 FC3D 25 1D BCS NOTHEX IF LESS IT AIN'T HEX -1303 FC3F 81 39 CMPA #'9 IS IT < OR = "9" ? -1304 FC41 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA -1305 FC43 80 30 SUBA #$30 ASCII ADJ. NUMERIC -1306 FC45 39 RTS ; -1307 * -1308 * -1309 FC46 81 41 INHEXA CMPA #'A IS IT > OR = "A" -1310 FC48 25 12 BCS NOTHEX IF LESS IT AIN'T HEX -1311 FC4A 81 46 CMPA #'F IS IT < OR = "F" ? -1312 FC4C 22 03 BHI INHEXL IF > IT AIN'T HEX -1313 FC4E 80 37 SUBA #$37 ASCII ADJ. ALPHA -1314 FC50 39 RTS ; -1315 * -1316 FC51 81 61 INHEXL CMPA #'a IS IT > OR = "a" -1317 FC53 25 07 BCS NOTHEX IF LESS IT AIN'T HEX -1318 FC55 81 66 CMPA #'f IS IT < "f" -1319 FC57 22 03 BHI NOTHEX IF > IT AIN'T HEX -1320 FC59 80 57 SUBA #$57 ADJUST TO LOWER CASE -1321 FC5B 39 RTS ; -1322 * -1323 * -1324 FC5C 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER -1325 FC5E 39 RTS ; -1326 * +1186 FA5E BD FC E3 LOAD JSR ACINIZ +1187 FA61 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE +1188 FA63 17 02 68 LBSR OUTCH OUTPUT IT TO TERMINAL PORT +1189 FA66 7F DF E2 CLR ECHO TURN OFF ECHO FLAG +1190 FA69 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO +1191 FA6C 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? +1192 FA6E 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. +1193 FA70 17 02 23 LBSR ECHON +1194 FA73 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ? +1195 FA75 27 3D BEQ LOAD21 IF SO, EXIT LOAD +1196 FA77 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? +1197 FA79 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR. +1198 FA7B 17 01 A8 LBSR BYTE INPUT BYTE COUNT +1199 FA7E 34 02 PSHS A PUSH COUNT ON STACK +1200 FA80 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX +1201 FA82 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS +1202 FA85 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX +1203 FA87 34 10 PSHS X PUSH ADDR ON STACK +1204 FA89 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE +1205 FA8B EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM +1206 FA8D EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM +1207 FA8F 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS +1208 FA91 6A E4 DEC ,S ADDRESS BYTES. +1209 FA93 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK +1210 FA95 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) +1211 FA98 35 04 PULS B POP CHECKSUM FROM STACK +1212 FA9A 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX +1213 FA9C 34 02 PSHS A PUSH DATA BYTE ON STACK +1214 FA9E EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK +1215 FAA0 6A E4 DEC ,S DECREMENT BYTE COUNT 1 +1216 FAA2 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM +1217 FAA4 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY +1218 FAA6 20 EB BRA LOAD10 GET NEXT DATA BYTE +1219 FAA8 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; +1220 FAA9 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) +1221 FAAB C1 FF CMPB #$FF CHECKSUM OK? +1222 FAAD 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE +1223 FAAF 86 3F LDA #'? LOAD (?) ERROR INDICATOR +1224 FAB1 17 02 1A LBSR OUTCH OUTPUT IT TO TERMINAL +1225 FAB4 73 DF E2 LOAD21 COM ECHO TURN ECHO ON +1226 FAB7 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE +1227 FAB9 16 02 12 LBRA OUTCH OUTPUT IT +1228 * +1229 ***** "P" PUNCH MIKBUG TAPE ***** +1230 * +1231 FABC 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK +1232 FABE 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS +1233 FAC1 34 30 PSHS X,Y SAVE ADDRESSES ON STACK +1234 FAC3 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH +1235 FAC5 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR +1236 FAC7 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH +1237 FAC9 30 01 LEAX 1,X INCREMENT END ADDRESS +1238 FACB AF E4 STX ,S STORE END ADDR ON STACK +1239 FACD BD FC E3 JSR ACINIZ +1240 FAD0 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE +1241 FAD2 17 01 F9 LBSR OUTCH OUTPUT IT TO TERMINAL +1242 FAD5 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC +1243 FAD7 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END +1244 FAD9 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT +1245 FADB 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES? +1246 FADF 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES +1247 FAE1 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. +1248 FAE3 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT +1249 FAE5 8E FE F3 LDX #MSG20 POINT TO MSG "S1" +1250 FAE8 17 00 2F LBSR PSTRNG PRINT MSG +1251 FAEB CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT +1252 FAED 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH +1253 FAEF 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT +1254 FAF2 AE 62 LDX 2,S LOAD BEGIN ADDRESS +1255 FAF4 17 01 68 LBSR OUT4H PUNCH ADDRESS +1256 FAF7 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM +1257 FAF9 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM +1258 FAFB EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM +1259 FAFD A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH +1260 FAFF 17 01 65 LBSR OUT2H OUTPUT DATA BYTE +1261 FB02 6A 64 DEC 4,S DECREMENT BYTE COUNT +1262 FB04 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE +1263 FB06 53 COMB 1's COMPLIMENT CHECKSUM BYTE +1264 FB07 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH +1265 FB09 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE +1266 FB0C AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR +1267 FB0E AC E4 CMPX ,S COMPARE IT TO END ADDR +1268 FB10 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. +1269 FB12 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE +1270 FB14 17 01 B7 LBSR OUTCH OUTPUT IT +1271 FB17 32 65 LEAS 5,S READJUST STACK POINTER +1272 FB19 39 RTS ; +1273 * +1274 * PRINT STRING PRECEEDED BY A CR & LF. +1275 * +1276 FB1A 8D 02 PSTRNG BSR PCRLF PRINT CR/LF +1277 FB1C 20 71 BRA PDATA PRINT STRING POINTED TO BY IX +1278 * +1279 * PCRLF +1280 * +1281 FB1E 34 10 PCRLF PSHS X SAVE IX +1282 FB20 8E FE A4 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS +1283 FB23 17 00 69 LBSR PDATA PRINT MSG +1284 FB26 35 90 PULS X,PC RESTORE IX & RETURN +1285 * +1286 * LONG BRANCHES TO COMMON ROUTINES +1287 * +1288 FB28 16 01 A1 JOUT1S LBRA OUT1S +1289 FB2B 16 00 F8 JBYTE LBRA BYTE +1290 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR +1291 * +1292 * ALTER "PC" PROGRAM COUNTER +1293 * +1294 FB31 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " +1295 FB34 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE +1296 FB36 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC" +1297 FB38 29 02 BVS ALTPCD EXIT IF INVALID HEX +1298 FB3A AF 4A STX 10,U POKE IN NEW CONTENTS +1299 FB3C 39 ALTPCD RTS ; +1300 * +1301 * ALTER "U" USER STACK POINTER +1302 * +1303 FB3D 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = " +1304 FB3F 8D E7 BSR JOUT1S OUTPUT SPACE +1305 FB41 8D EB BSR JIN1ADR +1306 FB43 29 02 BVS ALTUD +1307 FB45 AF 48 STX 8,U +1308 FB47 39 ALTUD RTS ; +1309 * +1310 * ALTER "Y" INDEX REGISTER +1311 * +1312 FB48 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = " +1313 FB4A 8D DC BSR JOUT1S OUTPUT SPACE +1314 FB4C 8D E0 BSR JIN1ADR +1315 FB4E 29 02 BVS ALTYD +1316 FB50 AF 46 STX 6,U $F8F0 +1317 FB52 39 ALTYD RTS ; +1318 * +1319 * ALTER "X" INDEX REGISTER +1320 * +1321 FB53 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " +1322 FB55 8D D1 BSR JOUT1S OUTPUT SPACE +1323 FB57 8D D5 BSR JIN1ADR +1324 FB59 29 02 BVS ALTXD +1325 FB5B AF 44 STX 4,U +1326 FB5D 39 ALTXD RTS ; 1327 * -1328 FC5F 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK -1329 FC61 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. -1330 FC63 8D 02 BSR OUTHL OUTPUT HEX LEFT -1331 FC65 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. -1332 FC67 OUTHL EQU * -1333 FC67 34 02 OUT2H PSHS A SAVE IT BACK ON STACK -1334 FC69 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII -1335 FC6A 44 LSRA ; -1336 FC6B 44 LSRA ; -1337 FC6C 44 LSRA ; -1338 FC6D 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII -1339 FC6F 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII -1340 FC71 84 0F ANDA #$0F STRIP LEFT NIBBLE -1341 FC73 8B 30 XASCII ADDA #$30 ASCII ADJ -1342 FC75 81 39 CMPA #$39 IS IT < OR = "9" ? -1343 FC77 2F 02 BLE OUTC IF LESS, OUTPUT IT -1344 FC79 8B 07 ADDA #7 IF > MAKE ASCII LETTER -1345 FC7B 20 51 OUTC BRA OUTCH OUTPUT CHAR -1346 * -1347 * BINARY / ASCII --- THIS ROUTINE -1348 * OUTPUTS A BYTE IN ENHANCED -1349 * BINARY FORMAT. THE ENHANCEMENT -1350 * IS DONE BY SUBSTITUTING ASCII -1351 * LETTERS FOR THE ONES IN THE BYTE. -1352 * THE ASCII ENHANCEMENT LETTERS -1353 * ARE OBTAINED FROM THE STRING -1354 * POINTED TO BY THE INDEX REG. "X". -1355 * -1356 FC7D 34 02 BIASCI PSHS A SAVE "A" ON STACK -1357 FC7F C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE -1358 FC81 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING -1359 FC83 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 -1360 FC85 25 02 BCS PRTBA IF ONE PRINT LETTER -1361 FC87 86 2D LDA #'- IF ZERO PRINT "-" -1362 FC89 8D 43 PRTBA BSR OUTCH PRINT IT -1363 FC8B 8D 3F BSR OUT1S PRINT SPACE -1364 FC8D 5A DECB SUB 1 FROM #BITS YET TO PRINT -1365 FC8E 26 F1 BNE OUTBA -1366 FC90 35 82 PULS A,PC -1367 * -1368 * EXTENDED USER COMMANDS -1369 * -1370 FC92 6E 9F F0 00 EXTEND JMP [MONEXT+EXTCMD] -1371 * -1372 * -1373 FC96 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ? -1374 FC99 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR -1375 * -1376 * INCHE -1377 * -1378 * ---GETS CHARACTER FROM TERMINAL AND -1379 * ECHOS SAME. THE CHARACTER IS RETURNED -1380 * IN THE "A" ACCUMULATOR WITH THE PARITY -1381 * BIT MASKED OFF. ALL OTHER REGISTERS -1382 * ARE PRESERVED. -1383 * -1384 FC9B 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL -1385 FC9D 84 7F ANDA #$7F STRIP PARITY FROM CHAR. -1386 FC9F 20 2D BRA OUTCH ECHO CHAR TO TERMINAL -1387 * -1388 * INCH -1389 * -1390 * GET CHARACTER FROM TERMINAL. RETURN -1391 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE -1392 * ALL OTHER REGISTERS. THE INPUT CHARACTER -1393 * IS 8 BITS AND IS NOT ECHOED. -1394 * -1395 * -1396 FCA1 34 10 INCH PSHS X SAVE IX -1397 FCA3 BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT -1398 FCA6 A6 84 LDA ,X FETCH PORT STATUS -1399 FCA8 85 01 BITA #1 TEST READY BIT, RDRF ? -1400 IFD FPGAOPT -1401 FCAA 26 09 BNE GETST1 -1402 FCAC 8E E0 20 LDX #PS2KBD -1403 FCAF A6 84 LDA ,X -1404 FCB1 85 01 BITA #1 -1405 ENDIF FPGAOPT -1406 FCB3 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN -1407 FCB5 A6 01 GETST1 LDA 1,X FETCH CHAR -1408 FCB7 35 90 PULS X,PC RESTORE IX -1409 * -1410 * INCHEK -1411 * -1412 * CHECK FOR A CHARACTER AVAILABLE FROM -1413 * THE TERMINAL. THE SERIAL PORT IS CHECKED -1414 * FOR READ READY. ALL REGISTERS ARE -1415 * PRESERVED, AND THE "Z" BIT WILL BE -1416 * CLEAR IF A CHARACTER CAN BE READ. -1417 * -1418 * -1419 FCB9 34 02 INCHEK PSHS A SAVE A ACCUM. -1420 FCBB A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS -1421 FCBF 85 01 BITA #1 TEST READY BIT, RDRF ? -1422 IFD FPGAOPT -1423 FCC1 26 05 BNE INCHEK1 -1424 FCC3 B6 E0 20 LDA PS2KBD -1425 FCC6 85 01 BITA #1 TEST READY BIT< RDRF ? -1426 ENDIF FPGAOPT -1427 FCC8 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. -1428 * -1429 FCCA 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES -1430 FCCC 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE -1431 * -1432 * -1433 * OUTCH -1434 * -1435 * OUTPUT CHARACTER TO TERMINAL. -1436 * THE CHAR. TO BE OUTPUT IS -1437 * PASSED IN THE A REGISTER. -1438 * ALL REGISTERS ARE PRESERVED. -1439 * -1440 OUTCH IFD FPGAOPT -1441 FCCE 8D 45 BSR VOUTCH -1442 ENDIF FPGAOPT -1443 IFD ADSOPT -1444 BSR VOUTCH -1445 ENDIF ADSOPT -1445 ENDIF ADSOPT -1446 FCD0 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX -1447 FCD2 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL -1448 FCD5 A6 84 FETSTA LDA ,X FETCH PORT STATUS -1449 FCD7 85 02 BITA #2 TEST TDRE, OK TO XMIT ? -1450 FCD9 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY -1451 FCDB 35 02 PULS A GET CHAR. FOR XMIT -1452 FCDD A7 01 STA 1,X XMIT CHAR. -1453 FCDF 35 90 PULS X,PC RESTORE IX -1454 * -1455 * IO INITIALIZATION -1456 * -1457 FCE1 IOINIZ EQU * -1458 IFD FPGAOPT -1459 FCE1 8D 13 BSR VINIZ -1460 ENDIF FPGAOPT -1461 IFD ADSOPT -1462 BSR VINIZ -1463 ENDIF ADSOPT -1463 ENDIF ADSOPT -1464 FCE3 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS -1465 FCE6 86 03 LDA #3 RESET ACIA PORT CODE -1466 FCE8 A7 84 STA ,X STORE IN CONTROL REGISTER -1467 FCEA 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY -1468 FCEC A7 84 STA ,X STORE IN CONTROL REGISTER -1469 FCEE 6D 01 TST 1,X ANYTHING IN DATA REGISTER? -1470 FCF0 86 FF LDA #$FF TURN ON ECHO FLAG -1471 FCF2 B7 DF E2 STA ECHO -1472 FCF5 39 RTS -1473 * -1474 IFD FPGAOPT -1475 * -1476 *************************************************** -1477 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * -1478 * * -1479 * 80 x 25 Characters -1480 * -1481 *************************************************** -1482 * -1483 *************************************************** -1484 * INITIALIZE EMULATOR * -1485 *************************************************** -1486 * -1487 FCF6 8E E0 30 VINIZ LDX #VDU -1488 FCF9 CC 00 00 LDD #0 -1489 FCFC FD DF FB STD COLADX AND ROWADX -1490 FCFF A7 02 STA VDUCOL,X -1491 FD01 E7 03 STB VDUROW,X -1492 FD03 E7 04 STB VDUOFF,X -1493 FD05 FD DF FD STD NEWROW AND ESCFLG -1494 FD08 C6 02 LDB #$02 -1495 FD0A E7 01 STB VDUATT,X -1496 FD0C 7F DF FE CLR ESCFLG -1497 FD0F 86 1B LDA #$1B SEND ESCAPE -1498 FD11 8D 02 BSR VOUTCH -1499 FD13 86 59 LDA #'Y CLEAR TO END OF SCREEN -1500 * -1501 ** VIDEO OUTPUT ROUTINE -1502 * -1503 FD15 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS -1504 FD17 8E E0 30 LDX #VDU POINT TO VDU REGISTERS -1505 * -1506 ** CHECK FOR ESCAPE SEQUENCE -1507 * -1508 FD1A 7D DF FE TST ESCFLG ESCAPE ACTIVE? -1509 FD1D 27 04 BEQ SOROU1 BRANCH IF NOT -1510 FD1F 8D 74 BSR ESCAPE ELSE DO ESCAPE -1511 FD21 20 0D BRA RETURN AND RETURN -1512 * -1513 ** CHECK FOR CONTROL CHARACTERS -1514 * -1515 FD23 81 20 SOROU1 CMPA #$20 CONTROL CODES? -1516 FD25 24 04 BHS SOROU2 -1517 FD27 8D 09 BSR CONTRL BRANCH IF SO -1518 FD29 20 05 BRA RETURN -1519 * -1520 ** OUTPUT TEXT CHARACTER -1521 * -1522 FD2B A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER -1523 FD2D 17 00 C5 LBSR NEWCOL UPDATE COLUMN -1524 * -1525 ** DISPLAY CURSOR AND RETURN -1526 * -1527 FD30 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN -1528 * -1529 *************************************************** -1530 * CONTROL CODE HANDLERS * -1531 *************************************************** -1532 * -1533 FD32 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ? -1534 FD34 10 27 00 41 LBEQ BACKSP -1535 FD38 81 1B CMPA #$1B ESCAPE SEQUENCE? -1536 FD3A 10 27 00 6C LBEQ SETESC -1537 FD3E 81 1A CMPA #$1A CTRL Z - Clear Screen -1538 FD40 10 27 00 8E LBEQ CLRSCR -1539 FD44 81 16 CMPA #$16 CTRL ^ - Home -1540 FD46 10 27 00 45 LBEQ HOME -1541 FD4A 81 0D CMPA #$D CTRL M - RETURN? -1542 FD4C 10 27 00 99 LBEQ CRETN -1543 FD50 81 0C CMPA #$0C CTRL L - CHAR RIGHT -1544 FD52 10 27 00 2C LBEQ CHRIGHT -1545 FD56 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE -1546 FD58 10 27 00 11 LBEQ LINEUP -1547 FD5C 81 0A CMPA #$0A CTRL J - LINE FEED -1548 FD5E 26 51 BNE RETESC NONE OF THESE, RETURN -1549 * -1550 ***************************************** LINE FEED -1551 * -1552 FD60 FC DF FB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW -1553 FD63 5C INCB BUMP ROW -1554 FD64 C1 19 CMPB #NUMLIN SCROLL TIME? -1555 FD66 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT -1556 FD6A 16 00 99 LBRA SCROLL ELSE SCROLL IT -1557 * -1558 ***************************************** LINE FEED -1559 * -1560 FD6D FC DF FB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW -1561 FD70 5D TSTB AT TOP OF SCREEN ? -1562 FD71 10 27 00 3C LBEQ RETESC Yes, Ignore -1563 FD75 5A DECB No, Decrement ROW -1564 FD76 16 00 74 LBRA NEWCUR POSITION CURSOR -1565 * -1566 *********************************** BACK SPACE -1567 * -1568 FD79 B6 DF FB BACKSP LDA COLADX -1569 FD7C 27 33 BEQ RETESC RETURN -1570 FD7E 4A DECA -1571 FD7F 16 00 68 LBRA POSCOL POSITION CURSOR -1572 * -1573 *********************************** CURSOR RIGHT -1574 * -1575 FD82 B6 DF FB CHRIGHT LDA COLADX -1576 FD85 4C INCA -1577 FD86 81 50 CMPA #LINLEN -1578 FD88 10 27 00 25 LBEQ RETESC -1579 FD8C 16 00 5B LBRA POSCOL -1580 * -1581 *********************************** CURSOR RIGHT -1582 * -1583 FD8F CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN -1584 FD92 16 00 58 LBRA NEWCUR -1585 * -1586 *************************************************** -1587 * ESCAPE HANDLERS * -1588 *************************************************** -1589 * -1590 FD95 F6 DF FE ESCAPE LDAB ESCFLG GET FLAG -1591 FD98 C1 3D CMPB #'= SETTING CURSOR? -1592 FD9A 27 16 BEQ ESCCUR BRANCH IF SO -1593 FD9C 81 59 CMPA #'Y CLEAR TO END OF SCREEN? -1594 FD9E 10 27 00 6E LBEQ ESCCLS -1595 FDA2 81 54 CMPA #'T CLEAR TO END OF LINE? -1596 FDA4 27 31 BEQ ESCCLL -1597 FDA6 81 3D CMPA #'= STARTING CURSOR SET? -1598 FDA8 26 04 BNE CLRESC BRANCH IF NOT -1599 * -1600 ***************************** START ESCAPE SEQUENCE -1601 * -1602 FDAA B7 DF FE SETESC STAA ESCFLG ELSE START CURSORING -1603 FDAD 39 RTS AND RETURN -1604 * -1605 FDAE 7F DF FE CLRESC CLR ESCFLG NO OTHERS SUPPORTED -1606 FDB1 39 RETESC RTS SO RETURN -1607 * -1608 ********************************* SET SCREEN CURSOR -1609 * -1610 FDB2 7D DF FD ESCCUR TST NEWROW ROW SET? -1611 FDB5 26 04 BNE ESCCU1 BRANCH IF SO -1612 FDB7 B7 DF FD STAA NEWROW ELSE SET NEW ROW -1613 FDBA 39 RTS AND RETURN -1614 * -1615 FDBB 7F DF FE ESCCU1 CLR ESCFLG -1616 FDBE 80 20 SUBA #$20 ADJUST COLUMN ADDRESS -1617 FDC0 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM -1618 FDC2 22 ED BHI RETESC NOT OK, DO NOTHING -1619 * -1620 FDC4 F6 DF FD ESCCU2 LDAB NEWROW -1621 FDC7 7F DF FD CLR NEWROW -1622 FDCA C0 20 SUBB #$20 ADJUST TO ROW ADDRESS -1623 FDCC C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW -1624 FDCE 22 E1 BHI RETESC ELSE RETURN DOING NOTHING -1625 FDD0 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO -1626 * -1627 ****************** CLEAR FROM CURSOR TO END OF LINE -1628 FDD2 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN -1629 FDD5 8D 16 BSR NEWCUR -1630 FDD7 B6 DF FB ESCCLL LDA COLADX -1631 FDDA C6 20 LDB #$20 AND CLEAR CHAR -1632 FDDC E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT -1633 FDDE 4C INCA -1634 FDDF A7 02 STA VDUCOL,X -1635 FDE1 81 50 CMPA #LINLEN UNTIL END OF LINE -1636 FDE3 26 F7 BNE ESCCL1 -1637 FDE5 7F DF FE CLR ESCFLG -1638 FDE8 39 RTS -1639 * -1640 *********************************** CARRIAGE RETURN -1641 * -1642 FDE9 4F CRETN CLRA SET COLUMN ZERO -1643 FDEA F6 DF FC POSCOL LDB ROWADX GET CURRENT ROW -1644 * -1645 *********** GENERATE NEW CURSOR POSITION AND RETURN -1646 * -1647 FDED FD DF FB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN -1648 FDF0 A7 02 STA VDUCOL,X SET NEW COLUMN -1649 FDF2 E7 03 STB VDUROW,X SET NEW ROW -1650 FDF4 39 RTS AND RETURN -1651 * -1652 ********************* UPDATE CURRENT COLUMN AND ROW -1653 * -1654 FDF5 FC DF FB NEWCOL LDD COLADX GET ROW AND COLUMN -1655 FDF8 4C INCA BUMP COLUMN -1656 FDF9 81 50 CMPA #LINLEN ROLL? -1657 FDFB 26 F0 BNE NEWCUR BRANCH IF NOT -1658 FDFD 4F CLRA ELSE RESET TO ZERO -1659 FDFE 5C INCB AND BUMP ROW -1660 FDFF C1 19 CMPB #NUMLIN -1661 FE01 26 EA BNE NEWCUR -1662 FE03 5A DECB BOTTOM ROW -1663 FE04 8D E7 BSR NEWCUR -1664 * -1665 ********************************* SCROLL THE SCREEN -1666 * -1667 FE06 E6 04 SCROLL LDB VDUOFF,X -1668 FE08 5C INCB -1669 FE09 C1 19 CMPB #NUMLIN -1670 FE0B 25 01 BLO SCROL1 -1671 FE0D 5F CLRB -1672 FE0E E7 04 SCROL1 STB VDUOFF,X -1673 * -1674 **************** CLEAR FROM CURSOR TO END OF SCREEN -1675 * -1676 FE10 F6 DF FB ESCCLS LDB COLADX GET CURSOR -1677 FE13 86 20 LDA #$20 GET A SPACE -1678 FE15 F7 DF FB ESCCLS1 STB COLADX -1679 FE18 E7 02 STB VDUCOL,X -1680 FE1A A7 84 STA VDUCHR,X -1681 FE1C 5C INCB -1682 FE1D C1 50 CMPB #LINLEN -1683 FE1F 26 F4 BNE ESCCLS1 +1328 * ALTER "DP" DIRECT PAGE REGISTER +1329 * +1330 FB5E 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " +1331 FB60 8D C6 BSR JOUT1S OUTPUT SPACE +1332 FB62 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR) +1333 FB64 29 02 BVS ALTDPD +1334 FB66 A7 43 STA 3,U +1335 FB68 39 ALTDPD RTS ; +1336 * +1337 * ALTER "B" ACCUMULATOR +1338 * +1339 FB69 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = " +1340 FB6B 8D BB BSR JOUT1S OUTPUT SPACE +1341 FB6D 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR) +1342 FB6F 29 02 BVS ALTBD +1343 FB71 A7 42 STA 2,U +1344 FB73 39 ALTBD RTS $F91C +1345 * +1346 * ALTER "A" ACCUMULATOR +1347 * +1348 FB74 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = " +1349 FB76 8D B0 BSR JOUT1S OUTPUT SPACE +1350 FB78 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR) +1351 FB7A 29 02 BVS ALTAD +1352 FB7C A7 41 STA 1,U +1353 FB7E 39 ALTAD RTS ; +1354 * +1355 * ALTER "CC" REGISTER +1356 * +1357 FB7F 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " +1358 FB81 8D A5 BSR JOUT1S OUTPUT SPACE +1359 FB83 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR) +1360 FB85 29 04 BVS ALTCCD +1361 FB87 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST +1362 FB89 A7 C4 STA ,U +1363 FB8B 39 ALTCCD RTS ; +1364 * +1365 * PDATA +1366 * +1367 FB8C 17 01 3F PRINT LBSR OUTCH +1368 FB8F A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT +1369 FB91 81 04 CMPA #4 IS IT EOT? +1370 FB93 26 F7 BNE PRINT IF NOT EOT PRINT IT +1371 FB95 39 RTS ; +1372 * +1373 * PRINT REGISTERS +1374 * +1375 FB96 8E FE B6 PRTSP LDX #MSG10 POINT TO MSG "SP=" +1376 FB99 8D F4 BSR PDATA PRINT MSG +1377 FB9B 1F 31 TFR U,X +1378 FB9D 16 00 BF JOUT4H LBRA OUT4H +1379 * +1380 FBA0 8E FE C2 PRTUS LDX #MSG12 POINT TO MSG "US=" +1381 FBA3 8D EA BSR PDATA PRINT MSG +1382 FBA5 AE 48 LDX 8,U +1383 FBA7 20 F4 BRA JOUT4H +1384 * +1385 FBA9 8E FE D4 PRTDP LDX #MSG15 POINT TO MSG "DP=" +1386 FBAC 8D E1 BSR PDATA PRINT MSG +1387 FBAE A6 43 LDA 3,U +1388 FBB0 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII +1389 * +1390 FBB3 8E FE CE PRTIX LDX #MSG14 POINT TO MSG "IX=" +1391 FBB6 8D D7 BSR PDATA PRINT MSG +1392 FBB8 AE 44 LDX 4,U $FCE6 +1393 FBBA 20 E1 BRA JOUT4H +1394 * +1395 FBBC 8E FE C8 PRTIY LDX #MSG13 POINT TO MSG "IY=" +1396 FBBF 8D CE BSR PDATA PRINT MSG +1397 FBC1 AE 46 LDX 6,U +1398 FBC3 20 D8 BRA JOUT4H +1399 * +1400 FBC5 8E FE BC PRTPC LDX #MSG11 POINT TO MSG "PC=" +1401 FBC8 8D C5 BSR PDATA PRINT MSG +1402 FBCA AE 4A LDX 10,U +1403 FBCC 20 CF BRA JOUT4H +1404 * +1405 FBCE 8E FE DA PRTA LDX #MSG16 POINT TO MSG "A=" +1406 FBD1 8D BC BSR PDATA PRINT MSG +1407 FBD3 A6 41 LDA 1,U +1408 FBD5 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII +1409 * +1410 FBD7 8E FE DF PRTB LDX #MSG17 POINT TO MSG "B=" +1411 FBDA 8D B3 BSR PDATA PRINT MSG +1412 FBDC A6 42 LDA 2,U +1413 FBDE 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII +1414 * +1415 FBE0 8E FE E4 PRTCC LDX #MSG18 POINT TO MSG "CC:" +1416 FBE3 8D AA BSR PDATA PRINT MSG +1417 FBE5 A6 C4 LDA ,U +1418 FBE7 8E FE EB LDX #MSG19 POINT TO MSG "EFHINZVC" +1419 FBEA 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT +1420 * +1421 * "R" DISPLAY REGISTERS +1422 * +1423 FBED 8E FE B2 REGSTR LDX #MSG5 POINT TO MSG " - " +1424 FBF0 17 FF 27 LBSR PSTRNG PRINT MSG +1425 FBF3 8D A1 BSR PRTSP $FCBF +1426 FBF5 8D A9 BSR PRTUS $FCCA +1427 FBF7 8D B0 BSR PRTDP $FCD5 +1428 FBF9 8D B8 BSR PRTIX $FCE0 +1429 FBFB 8D BF BSR PRTIY $FCEB +1430 FBFD 8E FE B2 LDX #MSG5 POINT TO MSG " - " +1431 FC00 17 FF 17 LBSR PSTRNG PRINT MSG +1432 FC03 8D C0 BSR PRTPC $FCF5 +1433 FC05 8D C7 BSR PRTA $FCFF +1434 FC07 8D CE BSR PRTB $FD09 +1435 FC09 20 D5 BRA PRTCC $FD13 +1436 * +1437 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE +1438 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. +1439 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". +1440 * THE SECOND IS RETURNED IN "IX". THE "V" BIT +1441 * IN THE C-CODE REG. IS SET IF AN INVALID HEX +1442 * ADDRESS IS INPUT. +1443 * +1444 FC0B 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS +1445 FC0D 29 4D BVS NOTHEX EXIT IF NOT VALID HEX +1446 FC0F 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY" +1447 FC11 86 2D LDA #'- +1448 FC13 17 00 B8 LBSR OUTCH PRINT " - " +1449 * +1450 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE +1451 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE +1452 * ADDRESS IS RETURNED IN THE "X" REGISTER. +1453 * +1454 FC16 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) +1455 FC18 29 42 BVS NOTHEX EXIT IF NOT VALID HEX +1456 FC1A 1F 01 TFR D,X +1457 FC1C 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) +1458 FC1E 29 3C BVS NOTHEX +1459 FC20 34 10 PSHS X +1460 FC22 A7 61 STA 1,S +1461 FC24 35 90 PULS X,PC +1462 * +1463 ***** INPUT BYTE (2 HEX CHAR.) ***** +1464 * +1465 FC26 8D 11 BYTE BSR INHEX GET HEX LEFT +1466 FC28 29 32 BVS NOTHEX EXIT IF NOT VALID HEX +1467 FC2A 48 ASLA ; +1468 FC2B 48 ASLA ; +1469 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE +1470 FC2D 48 ASLA ; +1471 FC2E 1F 89 TFR A,B PUT HEXL IN "B" +1472 FC30 8D 07 BSR INHEX GET HEX RIGHT +1473 FC32 29 28 BVS NOTHEX EXIT IF NOT VALID HEX +1474 FC34 34 04 PSHS B PUSH HEXL ON STACK +1475 FC36 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK +1476 FC38 39 RTS RETURN WITH HEX L&R IN "A" +1477 * +1478 * +1479 FC39 8D 5B INHEX BSR ECHON INPUT ASCII CHAR. +1480 FC3B 81 30 CMPA #'0 IS IT > OR = "0" ? +1481 FC3D 25 1D BCS NOTHEX IF LESS IT AIN'T HEX +1482 FC3F 81 39 CMPA #'9 IS IT < OR = "9" ? +1483 FC41 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA +1484 FC43 80 30 SUBA #$30 ASCII ADJ. NUMERIC +1485 FC45 39 RTS ; +1486 * +1487 * +1488 FC46 81 41 INHEXA CMPA #'A IS IT > OR = "A" +1489 FC48 25 12 BCS NOTHEX IF LESS IT AIN'T HEX +1490 FC4A 81 46 CMPA #'F IS IT < OR = "F" ? +1491 FC4C 22 03 BHI INHEXL IF > IT AIN'T HEX +1492 FC4E 80 37 SUBA #$37 ASCII ADJ. ALPHA +1493 FC50 39 RTS ; +1494 * +1495 FC51 81 61 INHEXL CMPA #'a IS IT > OR = "a" +1496 FC53 25 07 BCS NOTHEX IF LESS IT AIN'T HEX +1497 FC55 81 66 CMPA #'f IS IT < "f" +1498 FC57 22 03 BHI NOTHEX IF > IT AIN'T HEX +1499 FC59 80 57 SUBA #$57 ADJUST TO LOWER CASE +1500 FC5B 39 RTS ; +1501 * +1502 * +1503 FC5C 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER +1504 FC5E 39 RTS ; +1505 * +1506 * +1507 FC5F 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK +1508 FC61 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. +1509 FC63 8D 02 BSR OUTHL OUTPUT HEX LEFT +1510 FC65 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. +1511 FC67 OUTHL EQU * +1512 FC67 34 02 OUT2H PSHS A SAVE IT BACK ON STACK +1513 FC69 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII +1514 FC6A 44 LSRA ; +1515 FC6B 44 LSRA ; +1516 FC6C 44 LSRA ; +1517 FC6D 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII +1518 FC6F 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII +1519 FC71 84 0F ANDA #$0F STRIP LEFT NIBBLE +1520 FC73 8B 30 XASCII ADDA #$30 ASCII ADJ +1521 FC75 81 39 CMPA #$39 IS IT < OR = "9" ? +1522 FC77 2F 02 BLE OUTC IF LESS, OUTPUT IT +1523 FC79 8B 07 ADDA #7 IF > MAKE ASCII LETTER +1524 FC7B 20 51 OUTC BRA OUTCH OUTPUT CHAR +1525 * +1526 * BINARY / ASCII --- THIS ROUTINE +1527 * OUTPUTS A BYTE IN ENHANCED +1528 * BINARY FORMAT. THE ENHANCEMENT +1529 * IS DONE BY SUBSTITUTING ASCII +1530 * LETTERS FOR THE ONES IN THE BYTE. +1531 * THE ASCII ENHANCEMENT LETTERS +1532 * ARE OBTAINED FROM THE STRING +1533 * POINTED TO BY THE INDEX REG. "X". +1534 * +1535 FC7D 34 02 BIASCI PSHS A SAVE "A" ON STACK +1536 FC7F C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE +1537 FC81 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING +1538 FC83 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 +1539 FC85 25 02 BCS PRTBA IF ONE PRINT LETTER +1540 FC87 86 2D LDA #'- IF ZERO PRINT "-" +1541 FC89 8D 43 PRTBA BSR OUTCH PRINT IT +1542 FC8B 8D 3F BSR OUT1S PRINT SPACE +1543 FC8D 5A DECB SUB 1 FROM #BITS YET TO PRINT +1544 FC8E 26 F1 BNE OUTBA +1545 FC90 35 82 PULS A,PC +1546 * +1547 * EXTENDED USER COMMANDS +1548 * +1549 FC92 6E 9F F0 00 EXTEND JMP [MONEXT+EXTCMD] +1550 * +1551 * +1552 FC96 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ? +1553 FC99 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR +1554 * +1555 * INCHE +1556 * +1557 * ---GETS CHARACTER FROM TERMINAL AND +1558 * ECHOS SAME. THE CHARACTER IS RETURNED +1559 * IN THE "A" ACCUMULATOR WITH THE PARITY +1560 * BIT MASKED OFF. ALL OTHER REGISTERS +1561 * ARE PRESERVED. +1562 * +1563 FC9B 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL +1564 FC9D 84 7F ANDA #$7F STRIP PARITY FROM CHAR. +1565 FC9F 20 2D BRA OUTCH ECHO CHAR TO TERMINAL +1566 * +1567 * INCH +1568 * +1569 * GET CHARACTER FROM TERMINAL. RETURN +1570 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE +1571 * ALL OTHER REGISTERS. THE INPUT CHARACTER +1572 * IS 8 BITS AND IS NOT ECHOED. +1573 * +1574 * +1575 FCA1 34 10 INCH PSHS X SAVE IX +1576 FCA3 BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT +1577 FCA6 A6 84 LDA ,X FETCH PORT STATUS +1578 FCA8 85 01 BITA #1 TEST READY BIT, RDRF ? +1579 IFD PS2OPT +1580 FCAA 26 09 BNE GETST1 +1581 FCAC 8E E0 20 LDX #PS2KBD +1582 FCAF A6 84 LDA ,X +1583 FCB1 85 01 BITA #1 +1584 ENDIF PS2OPT +1585 FCB3 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN +1586 FCB5 A6 01 GETST1 LDA 1,X FETCH CHAR +1587 FCB7 35 90 PULS X,PC RESTORE IX +1588 * +1589 * INCHEK +1590 * +1591 * CHECK FOR A CHARACTER AVAILABLE FROM +1592 * THE TERMINAL. THE SERIAL PORT IS CHECKED +1593 * FOR READ READY. ALL REGISTERS ARE +1594 * PRESERVED, AND THE "Z" BIT WILL BE +1595 * CLEAR IF A CHARACTER CAN BE READ. +1596 * +1597 * +1598 FCB9 34 02 INCHEK PSHS A SAVE A ACCUM. +1599 FCBB A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS +1600 FCBF 85 01 BITA #1 TEST READY BIT, RDRF ? +1601 IFD PS2OPT +1602 FCC1 26 05 BNE INCHEK1 +1603 FCC3 B6 E0 20 LDA PS2KBD +1604 FCC6 85 01 BITA #1 TEST READY BIT< RDRF ? +1605 ENDIF PS2OPT +1606 FCC8 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. +1607 * +1608 FCCA 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES +1609 FCCC 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE +1610 * +1611 * +1612 * OUTCH +1613 * +1614 * OUTPUT CHARACTER TO TERMINAL. +1615 * THE CHAR. TO BE OUTPUT IS +1616 * PASSED IN THE A REGISTER. +1617 * ALL REGISTERS ARE PRESERVED. +1618 * +1619 OUTCH IFD VDUOPT +1620 FCCE 8D 45 BSR VOUTCH +1621 ENDIF VDUOPT +1622 IFD DG640OPT +1623 BSR VOUTCH +1624 ENDIF DG640OPT +1624 ENDIF DG640OPT +1625 FCD0 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX +1626 FCD2 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL +1627 FCD5 A6 84 FETSTA LDA ,X FETCH PORT STATUS +1628 FCD7 85 02 BITA #2 TEST TDRE, OK TO XMIT ? +1629 FCD9 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY +1630 FCDB 35 02 PULS A GET CHAR. FOR XMIT +1631 FCDD A7 01 STA 1,X XMIT CHAR. +1632 FCDF 35 90 PULS X,PC RESTORE IX +1633 * +1634 * IO INITIALIZATION +1635 * +1636 FCE1 IOINIZ EQU * +1637 IFD VDUOPT +1638 FCE1 8D 13 BSR VINIZ +1639 ENDIF VDUOPT +1640 IFD DG640OPT +1641 BSR VINIZ +1642 ENDIF DG640OPT +1642 ENDIF DG640OPT +1643 FCE3 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS +1644 FCE6 86 03 LDA #3 RESET ACIA PORT CODE +1645 FCE8 A7 84 STA ,X STORE IN CONTROL REGISTER +1646 FCEA 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY +1647 FCEC A7 84 STA ,X STORE IN CONTROL REGISTER +1648 FCEE 6D 01 TST 1,X ANYTHING IN DATA REGISTER? +1649 FCF0 86 FF LDA #$FF TURN ON ECHO FLAG +1650 FCF2 B7 DF E2 STA ECHO +1651 FCF5 39 RTS +1652 * +1653 IFD VDUOPT +1654 * +1655 *************************************************** +1656 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * +1657 * * +1658 * 80 x 25 Characters +1659 * +1660 *************************************************** +1661 * +1662 *************************************************** +1663 * INITIALIZE EMULATOR * +1664 *************************************************** +1665 * +1666 FCF6 8E E0 30 VINIZ LDX #VDU +1667 FCF9 CC 00 00 LDD #0 +1668 FCFC FD DF FB STD COLADX AND ROWADX +1669 FCFF A7 02 STA VDUCOL,X +1670 FD01 E7 03 STB VDUROW,X +1671 FD03 E7 04 STB VDUOFF,X +1672 FD05 FD DF FD STD NEWROW AND ESCFLG +1673 FD08 C6 02 LDB #$02 +1674 FD0A E7 01 STB VDUATT,X +1675 FD0C 7F DF FE CLR ESCFLG +1676 FD0F 86 1B LDA #$1B SEND ESCAPE +1677 FD11 8D 02 BSR VOUTCH +1678 FD13 86 59 LDA #'Y CLEAR TO END OF SCREEN +1679 * +1680 ** VIDEO OUTPUT ROUTINE +1681 * +1682 FD15 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS +1683 FD17 8E E0 30 LDX #VDU POINT TO VDU REGISTERS 1684 * -1685 FE21 F6 DF FC LDB ROWADX -1686 FE24 5C INCB -1687 FE25 C1 19 CMPB #NUMLIN -1688 FE27 27 08 BEQ ESCCLS2 -1689 FE29 F7 DF FC STB ROWADX -1690 FE2C E7 03 STB VDUROW,X -1691 FE2E 5F CLRB -1692 FE2F 20 E4 BRA ESCCLS1 +1685 ** CHECK FOR ESCAPE SEQUENCE +1686 * +1687 FD1A 7D DF FE TST ESCFLG ESCAPE ACTIVE? +1688 FD1D 27 04 BEQ SOROU1 BRANCH IF NOT +1689 FD1F 8D 74 BSR ESCAPE ELSE DO ESCAPE +1690 FD21 20 0D BRA RETURN AND RETURN +1691 * +1692 ** CHECK FOR CONTROL CHARACTERS 1693 * -1694 FE31 5F ESCCLS2 CLRB -1695 FE32 F7 DF FB STB COLADX -1696 FE35 E7 02 STB VDUCOL,X -1697 FE37 F7 DF FE STB ESCFLG -1698 FE3A 39 RTS -1699 ENDIF FPGAOPT -1700 * -1701 IFD ADSOPT -1702 *************************************************** -1703 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * -1704 * * -1705 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * -1706 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * -1707 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * -1708 * 16x64 BOARD). * -1709 *************************************************** -1710 -1711 *************************************************** -1712 * INITIALIZE EMULATOR * -1713 *************************************************** -1714 -1715 VINIZ LDX #0 -1716 STX COLADX AND ROWADX -1717 STX NEWROW AND ESCFLG -1718 LDX #SCREEN POINT TO SCREEN -1719 STX CURSOR SET PROGRAM CURSOR -1720 LDA #$1B SEND ESCAPE -1721 BSR VOUTCH -1722 LDA #'Y CLEAR TO END OF SCREEN -1723 * -1724 ** VIDEO OUTPUT ROUTINE -1725 * -1726 VOUTCH PSHS A,B,X SAVE REGISTERS -1727 * -1728 ** CLEAR CURSOR -1729 LDX CURSOR -1730 LDB 0,X -1731 ANDB #$7F -1732 STB 0,X -1733 * -1734 ** CHECK FOR ESCAPE SEQUENCE -1735 TST ESCFLG ESCAPE ACTIVE? -1736 BEQ SOROU1 BRANCH IF NOT -1737 BSR ESCAPE ELSE DO ESCAPE -1738 BRA RETURN AND RETURN -1739 * -1740 ** CHECK FOR CONTROL CHARACTERS -1741 SOROU1 CMPA #$20 CONTROL CODES? -1742 BHS SOROU2 -1743 BSR CONTRL BRANCH IF SO -1744 BRA RETURN -1745 * -1746 ** OUTPUT TEXT CHARACTER -1747 SOROU2 LDX CURSOR ELSE GET CURSOR -1748 STAA 0,X DISPLAY CHARACTER -1749 LBSR NEWCOL UPDATE COLUMN -1750 * -1751 ** DISPLAY CURSOR AND RETURN -1752 RETURN LDX CURSOR AND DISPLAY IT -1753 LDB ,X -1754 ORAB #$80 WITH REVID -1755 STB ,X -1756 PULS A,B,X,PC RESTORE REGISTERS AND RETURN -1757 -1758 *************************************************** -1759 * CONTROL CODE HANDLERS * -1760 *************************************************** -1761 -1762 CONTRL CMPA #$08 CTRL H - BACKSPACE ? -1763 LBEQ BACKSP -1764 CMPA #$1B ESCAPE SEQUENCE? -1765 LBEQ SETESC -1766 CMPA #$D CTRL M - RETURN? -1767 LBEQ CRETN -1768 CMPA #$0A CTRL J - LINE FEED -1769 BNE RETESC NONE OF THESE, RETURN -1770 -1771 ***************************************** LINE FEED -1772 -1773 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW -1774 INCB BUMP ROW -1775 CMPB #NUMLIN SCROLL TIME? -1776 LBNE NEWCUR POSITION CURSOR IF NOT -1777 LBRA SCROLL ELSE SCROLL IT -1778 -1779 ***************************************** LINE FEED -1780 -1781 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW -1782 TSTB AT TOP OF SCREEN ? -1783 BEQ RETESC Yes, Ignore -1784 DECB No, Decrement ROW -1785 LBRA NEWCUR POSITION CURSOR -1786 -1787 -1788 *********************************** BACK SPACE -1789 -1790 BACKSP LDA COLADX -1791 BEQ RETESC RETURN -1792 DECA -1793 LBRA POSCOL POSITION CURSOR -1794 -1795 *********************************** CURSOR RIGHT -1796 -1797 CHRIGHT LDA COLADX -1798 INCA -1799 CMPA #LINLEN -1800 BEQ RETESC -1801 LBRA POSCOL -1802 -1803 *************************************************** -1804 * ESCAPE HANDLERS * -1805 *************************************************** -1806 -1807 ESCAPE LDAB ESCFLG GET FLAG -1808 CMPB #'= SETTING CURSOR? -1809 BEQ ESCCUR BRANCH IF SO -1810 CMPA #'Y CLEAR TO END OF SCREEN? -1811 LBEQ ESCCLS -1812 CMPA #'T CLEAR TO END OF LINE? -1813 BEQ ESCCLL -1814 CMPA #'E INSERT LINE? -1815 BEQ ESCINL -1816 CMPA #'R DELETE LINE? -1817 BEQ ESCDLL -1818 CMPA #'= STARTING CURSOR SET? -1819 BNE CLRESC BRANCH IF NOT -1820 -1821 ***************************** START ESCAPE SEQUENCE -1822 -1823 SETESC STAA ESCFLG ELSE START CURSORING -1824 RTS AND RETURN -1825 -1826 CLRESC CLR ESCFLG NO OTHERS SUPPORTED -1827 RETESC RTS SO RETURN -1828 -1829 ********************************* SET SCREEN CURSOR -1830 -1831 ESCCUR TST NEWROW ROW SET? -1832 BNE ESCCU1 BRANCH IF SO -1833 STAA NEWROW ELSE SET NEW ROW -1834 RTS AND RETURN -1835 -1836 ESCCU1 CLR ESCFLG -1837 SUBA #$20 ADJUST COLUMN ADDRESS -1838 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM -1839 BHI RETESC NOT OK, DO NOTHING -1840 -1841 ESCCU2 LDAB NEWROW -1842 CLR NEWROW -1843 SUBB #$20 ADJUST TO ROW ADDRESS -1844 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW -1845 BHI RETESC ELSE RETURN DOING NOTHING -1846 BRA NEWCUR GO SET NEW CURSOR IF SO -1847 * -1848 *************************** DELETE LINE FROM SCREEN -1849 -1850 ESCDLL BSR CRETN GO COL. ZERO -1851 LDB ROWADX -1852 CMPB #NUMLIN-1 -1853 BEQ SCROL3 -1854 BRA SCROL1 AND DELETE THIS LINE -1855 -1856 *************************** INSERT LINE INTO SCREEN -1857 -1858 ESCINL BSR CRETN GO TO COL. ZERO -1859 LDAB ROWADX -1860 CMPB #NUMLIN-1 -1861 BEQ ESCCLL -1862 * -1863 ** SCROLL SCREEN DOWN FROM CURSOR -1864 * -1865 LDX #SCREEN+SCNLEN-LINLEN -1866 ESCIN0 LDAA 0,-X -1867 STAA LINLEN,X -1868 LDA SCNLEN,X -1869 STA SCNLEN+LINLEN,X -1870 CPX CURSOR -1871 BNE ESCIN0 -1872 -1873 ****************** CLEAR FROM CURSOR TO END OF LINE -1874 -1875 ESCCLL LDA COLADX GET CURRENT COLUMN -1876 LDX CURSOR GET CURSOR -1877 LDB #$20 AND CLEAR CHAR -1878 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE -1879 STB ,X+ CLEAR TEXT -1880 INCA -1881 CMPA #LINLEN UNTIL END OF LINE -1882 BNE ESCLL1 -1883 CLR ESCFLG -1884 RTS -1885 -1886 *********************************** CARRIAGE RETURN -1887 -1888 CRETN CLRA SET COLUMN ZERO -1889 POSCOL LDB ROWADX GET CURRENT ROW -1890 -1891 *********** GENERATE NEW CURSOR POSITION AND RETURN -1892 -1893 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN -1894 LDA #LINLEN ELSE ADD A LINE -1895 MUL LINLEN * ROWADX -1896 ADDB COLADX -1897 ADCA #0 -1898 ADDD #SCREEN ADD SCREEN BASE. -1899 STD CURSOR SAVE NEW CURSOR -1900 TFR D,X GET CURSOR IN X -1901 RTS AND RETURN -1902 -1903 ********************* UPDATE CURRENT COLUMN AND ROW -1904 -1905 NEWCOL LDD COLADX GET ROW AND COLUMN -1906 INCA BUMP COLUMN -1907 CMPA #LINLEN ROLL? -1908 BNE NEWCUR BRANCH IF NOT -1909 CLRA ELSE RESET TO ZERO -1910 INCB AND BUMP ROW -1911 CMPB #NUMLIN -1912 BNE NEWCUR -1913 DECB BOTTOM ROW -1914 BSR NEWCUR -1915 -1916 ********************************* SCROLL THE SCREEN -1917 -1918 SCROLL LDX #SCREEN POINT TO SCREEN -1919 SCROL1 LDA SCNLEN+LINLEN,X -1920 STA SCNLEN,X -1921 LDAA LINLEN,X MOVE TWO BYTES -1922 STAA 0,X+ UP ONE LINE -1923 CMPX #SCREEN+SCNLEN-LINLEN -1924 BNE SCROL1 LOOP UNTIL DONE -1925 BRA SCROL3 -1926 -1927 **************** CLEAR FROM CURSOR TO END OF SCREEN -1928 -1929 ESCCLS LDX CURSOR GET CURSOR -1930 SCROL3 LDAA #$20 GET A SPACE -1931 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES -1932 STA ,X+ AND TEXT -1933 CMPX #SCREEN+SCNLEN -1934 BNE SCROL2 UNTIL DONE -1935 CLR ESCFLG -1936 RTS -1937 ENDIF ADSOPT -1937 ENDIF ADSOPT -1938 * -1939 IFD PRTOPT -1940 ************************************* -1941 * -1942 ** PRINTER DRIVER ROUTINES -1943 * -1944 ************************************* -1945 * -1946 ** PINIZ - INITIATE PRINTER PORT -1947 * -1948 PINIZ PSHS B -1949 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 -1950 STD PADATA SET DDR AND SELECT DATA -1951 * -1952 ** RESET PRINTER -1953 LDB #PRESET -1954 STAB PADATA -1955 RESTLP INCB DELAY FOR RESET -1956 BNE RESTLP -1957 STAA PADATA ACCA=DIRMSK -1958 * -1959 ** INITALIZE PORT B (DATA PORT) -1960 LDAA #$2A -1961 STAA PBCTRL -1962 LDD #$FF2E ACCA=$FF ACCB =%00101110 -1963 STD PBDATA PBDREG PBCTRL -1964 * -1965 ** SELECT 66 LINES/PAGE -1966 LDAA #$1B -1967 BSR POUTCH -1968 LDAA #'C -1969 BSR POUTCH -1970 LDAA #66 -1971 PULS B -1972 ************************************* -1973 * -1974 ** OUTPUT A CHARACTER TO THE PRINTER -1975 * -1976 ************************************* -1977 POUTCH PSHS B -1978 LDAB PBDATA CLEAR INTERRUPT BIT -1979 * -1980 ** WAIT TILL NOT BUSY -1981 BUSYLP LDAB PADATA -1982 BITB #PERROR -1983 BEQ PEXIT -1984 TSTB -1985 BMI BUSYLP -1986 * -1987 ** NOW OUTPUT CHARACTER -1988 STAA PBDATA -1989 PEXIT PULS B,PC -1990 ************************************* -1991 * -1992 ** PCHK TEST IFD PRINTER READY -1993 * -1994 ************************************* -1995 PCHK TST PBCTRL TEST STATE OF CRB7 -1996 RTS SET ON ACKNOWLEDGE -1997 ENDIF PRTOPT -1997 ENDIF PRTOPT -1998 ************************************* -1999 * -2000 * MONITOR KEYBOARD COMMAND JUMP TABLE -2001 * -2002 ************************************* -2003 * -2004 FE3B JMPTAB EQU * -2005 FE3B 01 FCB 1 " ^A " -2006 FE3C FB 74 FDB ALTRA -2007 FE3E 02 FCB 2 " ^B " -2008 FE3F FB 69 FDB ALTRB -2009 FE41 03 FCB 3 " ^C " -2010 FE42 FB 7F FDB ALTRCC -2011 FE44 04 FCB 4 " ^D " -2012 FE45 FB 5E FDB ALTRDP -2013 FE47 10 FCB $10 " ^P " -2014 FE48 FB 31 FDB ALTRPC -2015 FE4A 15 FCB $15 " ^U " -2016 FE4B FB 3D FDB ALTRU -2017 FE4D 18 FCB $18 " ^X " -2018 FE4E FB 53 FDB ALTRX -2019 FE50 19 FCB $19 " ^Y " -2020 FE51 FB 48 FDB ALTRY -2021 * -2022 FE53 42 FCC 'B' -2023 FE54 F9 5C FDB BRKPNT -2024 FE56 45 FCC 'E' -2025 FE57 F8 FD FDB MEMDUMP -2026 FE59 47 FCC 'G' -2027 FE5A F8 A5 FDB GO -2028 FE5C 4C FCC 'L' -2029 FE5D FA 5E FDB LOAD -2030 FE5F 50 FCC 'P' -2031 FE60 FA BC FDB PUNCH -2032 FE62 4D FCC 'M' -2033 FE63 F8 A8 FDB MEMCHG -2034 FE65 52 FCC 'R' -2035 FE66 FB ED FDB REGSTR -2036 FE68 53 FCC 'S' -2037 FE69 F8 F1 FDB DISSTK -2038 FE6B 58 FCC 'X' -2039 FE6C F9 88 FDB XBKPNT -2040 IFD MFDCOPT -2041 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT -2042 FDB MINBOOT -2043 ENDIF MFDCOPT -2043 ENDIF MFDCOPT -2044 IFD FPGAOPT -2045 FE6E 44 FCC 'D' *** FPGA USES 'D' FOR CFBOOT -2046 FE6F F9 D5 FDB CFBOOT -2047 ENDIF FPGAOPT -2048 IFD DMAFOPT -2049 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT -2050 FDB DBOOT -2051 ELSE -2052 FE71 55 FCC 'U' *** IF NOT DMAF2, 'U' IS FOR USER -2053 FE72 FC 92 FDB EXTEND -2054 ENDIF DMAFOPT -2055 IFD RTCOPT -2056 FCC 'T' -2057 FDB TIMSET -2058 ENDIF RTCOPT -2058 ENDIF RTCOPT -2059 * -2060 FE74 TABEND EQU * -2061 * -2062 * ** 6809 VECTOR ADDRESSES ** -2063 * -2064 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES -2065 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY -2066 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE -2067 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO -2068 * HIS OWN ROUTINES IF HE SO DESIRES. -2069 * -2070 * -2071 FE74 F9 94 RAMVEC FDB SWIE USER-V -2072 FE76 F8 A7 FDB RTI SWI3-V -2073 FE78 F8 A7 FDB RTI SWI2-V -2074 FE7A F8 A7 FDB RTI FIRQ-V -2075 FE7C F8 A7 FDB RTI IRQ-V -2076 FE7E F9 94 FDB SWIE SWI-V -2077 FE80 FF FF FDB $FFFF SVC-VO -2078 FE82 FF FF FDB $FFFF SVC-VL -2079 * -2080 * PRINTABLE MESSAGE STRINGS -2081 * -2082 FE84 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 -2083 FE89 53 59 53 30 39 42 FCC 'SYS09BUG 1.2 FOR ' - 55 47 20 31 2E 32 +1694 FD23 81 20 SOROU1 CMPA #$20 CONTROL CODES? +1695 FD25 24 04 BHS SOROU2 +1696 FD27 8D 09 BSR CONTRL BRANCH IF SO +1697 FD29 20 05 BRA RETURN +1698 * +1699 ** OUTPUT TEXT CHARACTER +1700 * +1701 FD2B A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER +1702 FD2D 17 00 C5 LBSR NEWCOL UPDATE COLUMN +1703 * +1704 ** DISPLAY CURSOR AND RETURN +1705 * +1706 FD30 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN +1707 * +1708 *************************************************** +1709 * CONTROL CODE HANDLERS * +1710 *************************************************** +1711 * +1712 FD32 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ? +1713 FD34 10 27 00 41 LBEQ BACKSP +1714 FD38 81 1B CMPA #$1B ESCAPE SEQUENCE? +1715 FD3A 10 27 00 6C LBEQ SETESC +1716 FD3E 81 1A CMPA #$1A CTRL Z - Clear Screen +1717 FD40 10 27 00 8E LBEQ CLRSCR +1718 FD44 81 16 CMPA #$16 CTRL ^ - Home +1719 FD46 10 27 00 45 LBEQ HOME +1720 FD4A 81 0D CMPA #$D CTRL M - RETURN? +1721 FD4C 10 27 00 99 LBEQ CRETN +1722 FD50 81 0C CMPA #$0C CTRL L - CHAR RIGHT +1723 FD52 10 27 00 2C LBEQ CHRIGHT +1724 FD56 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE +1725 FD58 10 27 00 11 LBEQ LINEUP +1726 FD5C 81 0A CMPA #$0A CTRL J - LINE FEED +1727 FD5E 26 51 BNE RETESC NONE OF THESE, RETURN +1728 * +1729 ***************************************** LINE FEED +1730 * +1731 FD60 FC DF FB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW +1732 FD63 5C INCB BUMP ROW +1733 FD64 C1 19 CMPB #NUMLIN SCROLL TIME? +1734 FD66 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT +1735 FD6A 16 00 99 LBRA SCROLL ELSE SCROLL IT +1736 * +1737 ***************************************** LINE FEED +1738 * +1739 FD6D FC DF FB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW +1740 FD70 5D TSTB AT TOP OF SCREEN ? +1741 FD71 10 27 00 3C LBEQ RETESC Yes, Ignore +1742 FD75 5A DECB No, Decrement ROW +1743 FD76 16 00 74 LBRA NEWCUR POSITION CURSOR +1744 * +1745 *********************************** BACK SPACE +1746 * +1747 FD79 B6 DF FB BACKSP LDA COLADX +1748 FD7C 27 33 BEQ RETESC RETURN +1749 FD7E 4A DECA +1750 FD7F 16 00 68 LBRA POSCOL POSITION CURSOR +1751 * +1752 *********************************** CURSOR RIGHT +1753 * +1754 FD82 B6 DF FB CHRIGHT LDA COLADX +1755 FD85 4C INCA +1756 FD86 81 50 CMPA #LINLEN +1757 FD88 10 27 00 25 LBEQ RETESC +1758 FD8C 16 00 5B LBRA POSCOL +1759 * +1760 *********************************** CURSOR RIGHT +1761 * +1762 FD8F CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN +1763 FD92 16 00 58 LBRA NEWCUR +1764 * +1765 *************************************************** +1766 * ESCAPE HANDLERS * +1767 *************************************************** +1768 * +1769 FD95 F6 DF FE ESCAPE LDAB ESCFLG GET FLAG +1770 FD98 C1 3D CMPB #'= SETTING CURSOR? +1771 FD9A 27 16 BEQ ESCCUR BRANCH IF SO +1772 FD9C 81 59 CMPA #'Y CLEAR TO END OF SCREEN? +1773 FD9E 10 27 00 6E LBEQ ESCCLS +1774 FDA2 81 54 CMPA #'T CLEAR TO END OF LINE? +1775 FDA4 27 31 BEQ ESCCLL +1776 FDA6 81 3D CMPA #'= STARTING CURSOR SET? +1777 FDA8 26 04 BNE CLRESC BRANCH IF NOT +1778 * +1779 ***************************** START ESCAPE SEQUENCE +1780 * +1781 FDAA B7 DF FE SETESC STAA ESCFLG ELSE START CURSORING +1782 FDAD 39 RTS AND RETURN +1783 * +1784 FDAE 7F DF FE CLRESC CLR ESCFLG NO OTHERS SUPPORTED +1785 FDB1 39 RETESC RTS SO RETURN +1786 * +1787 ********************************* SET SCREEN CURSOR +1788 * +1789 FDB2 7D DF FD ESCCUR TST NEWROW ROW SET? +1790 FDB5 26 04 BNE ESCCU1 BRANCH IF SO +1791 FDB7 B7 DF FD STAA NEWROW ELSE SET NEW ROW +1792 FDBA 39 RTS AND RETURN +1793 * +1794 FDBB 7F DF FE ESCCU1 CLR ESCFLG +1795 FDBE 80 20 SUBA #$20 ADJUST COLUMN ADDRESS +1796 FDC0 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM +1797 FDC2 22 ED BHI RETESC NOT OK, DO NOTHING +1798 * +1799 FDC4 F6 DF FD ESCCU2 LDAB NEWROW +1800 FDC7 7F DF FD CLR NEWROW +1801 FDCA C0 20 SUBB #$20 ADJUST TO ROW ADDRESS +1802 FDCC C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW +1803 FDCE 22 E1 BHI RETESC ELSE RETURN DOING NOTHING +1804 FDD0 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO +1805 * +1806 ****************** CLEAR FROM CURSOR TO END OF LINE +1807 FDD2 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN +1808 FDD5 8D 16 BSR NEWCUR +1809 FDD7 B6 DF FB ESCCLL LDA COLADX +1810 FDDA C6 20 LDB #$20 AND CLEAR CHAR +1811 FDDC E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT +1812 FDDE 4C INCA +1813 FDDF A7 02 STA VDUCOL,X +1814 FDE1 81 50 CMPA #LINLEN UNTIL END OF LINE +1815 FDE3 26 F7 BNE ESCCL1 +1816 FDE5 7F DF FE CLR ESCFLG +1817 FDE8 39 RTS +1818 * +1819 *********************************** CARRIAGE RETURN +1820 * +1821 FDE9 4F CRETN CLRA SET COLUMN ZERO +1822 FDEA F6 DF FC POSCOL LDB ROWADX GET CURRENT ROW +1823 * +1824 *********** GENERATE NEW CURSOR POSITION AND RETURN +1825 * +1826 FDED FD DF FB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN +1827 FDF0 A7 02 STA VDUCOL,X SET NEW COLUMN +1828 FDF2 E7 03 STB VDUROW,X SET NEW ROW +1829 FDF4 39 RTS AND RETURN +1830 * +1831 ********************* UPDATE CURRENT COLUMN AND ROW +1832 * +1833 FDF5 FC DF FB NEWCOL LDD COLADX GET ROW AND COLUMN +1834 FDF8 4C INCA BUMP COLUMN +1835 FDF9 81 50 CMPA #LINLEN ROLL? +1836 FDFB 26 F0 BNE NEWCUR BRANCH IF NOT +1837 FDFD 4F CLRA ELSE RESET TO ZERO +1838 FDFE 5C INCB AND BUMP ROW +1839 FDFF C1 19 CMPB #NUMLIN +1840 FE01 26 EA BNE NEWCUR +1841 FE03 5A DECB BOTTOM ROW +1842 FE04 8D E7 BSR NEWCUR +1843 * +1844 ********************************* SCROLL THE SCREEN +1845 * +1846 FE06 E6 04 SCROLL LDB VDUOFF,X +1847 FE08 5C INCB +1848 FE09 C1 19 CMPB #NUMLIN +1849 FE0B 25 01 BLO SCROL1 +1850 FE0D 5F CLRB +1851 FE0E E7 04 SCROL1 STB VDUOFF,X +1852 * +1853 **************** CLEAR FROM CURSOR TO END OF SCREEN +1854 * +1855 FE10 F6 DF FB ESCCLS LDB COLADX GET CURSOR +1856 FE13 86 20 LDA #$20 GET A SPACE +1857 FE15 F7 DF FB ESCCLS1 STB COLADX +1858 FE18 E7 02 STB VDUCOL,X +1859 FE1A A7 84 STA VDUCHR,X +1860 FE1C 5C INCB +1861 FE1D C1 50 CMPB #LINLEN +1862 FE1F 26 F4 BNE ESCCLS1 +1863 * +1864 FE21 F6 DF FC LDB ROWADX +1865 FE24 5C INCB +1866 FE25 C1 19 CMPB #NUMLIN +1867 FE27 27 08 BEQ ESCCLS2 +1868 FE29 F7 DF FC STB ROWADX +1869 FE2C E7 03 STB VDUROW,X +1870 FE2E 5F CLRB +1871 FE2F 20 E4 BRA ESCCLS1 +1872 * +1873 FE31 5F ESCCLS2 CLRB +1874 FE32 F7 DF FB STB COLADX +1875 FE35 E7 02 STB VDUCOL,X +1876 FE37 F7 DF FE STB ESCFLG +1877 FE3A 39 RTS +1878 ENDIF VDUOPT +1879 * +1880 IFD DG640OPT +1881 *************************************************** +1882 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * +1883 * * +1884 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * +1885 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * +1886 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * +1887 * 16x64 BOARD). * +1888 *************************************************** +1889 +1890 *************************************************** +1891 * INITIALIZE EMULATOR * +1892 *************************************************** +1893 +1894 VINIZ LDX #0 +1895 STX COLADX AND ROWADX +1896 STX NEWROW AND ESCFLG +1897 LDX #SCREEN POINT TO SCREEN +1898 STX CURSOR SET PROGRAM CURSOR +1899 LDA #$1B SEND ESCAPE +1900 BSR VOUTCH +1901 LDA #'Y CLEAR TO END OF SCREEN +1902 * +1903 ** VIDEO OUTPUT ROUTINE +1904 * +1905 VOUTCH PSHS A,B,X SAVE REGISTERS +1906 * +1907 ** CLEAR CURSOR +1908 LDX CURSOR +1909 LDB 0,X +1910 ANDB #$7F +1911 STB 0,X +1912 * +1913 ** CHECK FOR ESCAPE SEQUENCE +1914 TST ESCFLG ESCAPE ACTIVE? +1915 BEQ SOROU1 BRANCH IF NOT +1916 BSR ESCAPE ELSE DO ESCAPE +1917 BRA RETURN AND RETURN +1918 * +1919 ** CHECK FOR CONTROL CHARACTERS +1920 SOROU1 CMPA #$20 CONTROL CODES? +1921 BHS SOROU2 +1922 BSR CONTRL BRANCH IF SO +1923 BRA RETURN +1924 * +1925 ** OUTPUT TEXT CHARACTER +1926 SOROU2 LDX CURSOR ELSE GET CURSOR +1927 STAA 0,X DISPLAY CHARACTER +1928 LBSR NEWCOL UPDATE COLUMN +1929 * +1930 ** DISPLAY CURSOR AND RETURN +1931 RETURN LDX CURSOR AND DISPLAY IT +1932 LDB ,X +1933 ORAB #$80 WITH REVID +1934 STB ,X +1935 PULS A,B,X,PC RESTORE REGISTERS AND RETURN +1936 +1937 *************************************************** +1938 * CONTROL CODE HANDLERS * +1939 *************************************************** +1940 +1941 CONTRL CMPA #$08 CTRL H - BACKSPACE ? +1942 LBEQ BACKSP +1943 CMPA #$1B ESCAPE SEQUENCE? +1944 LBEQ SETESC +1945 CMPA #$D CTRL M - RETURN? +1946 LBEQ CRETN +1947 CMPA #$0A CTRL J - LINE FEED +1948 BNE RETESC NONE OF THESE, RETURN +1949 +1950 ***************************************** LINE FEED +1951 +1952 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW +1953 INCB BUMP ROW +1954 CMPB #NUMLIN SCROLL TIME? +1955 LBNE NEWCUR POSITION CURSOR IF NOT +1956 LBRA SCROLL ELSE SCROLL IT +1957 +1958 ***************************************** LINE FEED +1959 +1960 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW +1961 TSTB AT TOP OF SCREEN ? +1962 BEQ RETESC Yes, Ignore +1963 DECB No, Decrement ROW +1964 LBRA NEWCUR POSITION CURSOR +1965 +1966 +1967 *********************************** BACK SPACE +1968 +1969 BACKSP LDA COLADX +1970 BEQ RETESC RETURN +1971 DECA +1972 LBRA POSCOL POSITION CURSOR +1973 +1974 *********************************** CURSOR RIGHT +1975 +1976 CHRIGHT LDA COLADX +1977 INCA +1978 CMPA #LINLEN +1979 BEQ RETESC +1980 LBRA POSCOL +1981 +1982 *************************************************** +1983 * ESCAPE HANDLERS * +1984 *************************************************** +1985 +1986 ESCAPE LDAB ESCFLG GET FLAG +1987 CMPB #'= SETTING CURSOR? +1988 BEQ ESCCUR BRANCH IF SO +1989 CMPA #'Y CLEAR TO END OF SCREEN? +1990 LBEQ ESCCLS +1991 CMPA #'T CLEAR TO END OF LINE? +1992 BEQ ESCCLL +1993 CMPA #'E INSERT LINE? +1994 BEQ ESCINL +1995 CMPA #'R DELETE LINE? +1996 BEQ ESCDLL +1997 CMPA #'= STARTING CURSOR SET? +1998 BNE CLRESC BRANCH IF NOT +1999 +2000 ***************************** START ESCAPE SEQUENCE +2001 +2002 SETESC STAA ESCFLG ELSE START CURSORING +2003 RTS AND RETURN +2004 +2005 CLRESC CLR ESCFLG NO OTHERS SUPPORTED +2006 RETESC RTS SO RETURN +2007 +2008 ********************************* SET SCREEN CURSOR +2009 +2010 ESCCUR TST NEWROW ROW SET? +2011 BNE ESCCU1 BRANCH IF SO +2012 STAA NEWROW ELSE SET NEW ROW +2013 RTS AND RETURN +2014 +2015 ESCCU1 CLR ESCFLG +2016 SUBA #$20 ADJUST COLUMN ADDRESS +2017 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM +2018 BHI RETESC NOT OK, DO NOTHING +2019 +2020 ESCCU2 LDAB NEWROW +2021 CLR NEWROW +2022 SUBB #$20 ADJUST TO ROW ADDRESS +2023 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW +2024 BHI RETESC ELSE RETURN DOING NOTHING +2025 BRA NEWCUR GO SET NEW CURSOR IF SO +2026 * +2027 *************************** DELETE LINE FROM SCREEN +2028 +2029 ESCDLL BSR CRETN GO COL. ZERO +2030 LDB ROWADX +2031 CMPB #NUMLIN-1 +2032 BEQ SCROL3 +2033 BRA SCROL1 AND DELETE THIS LINE +2034 +2035 *************************** INSERT LINE INTO SCREEN +2036 +2037 ESCINL BSR CRETN GO TO COL. ZERO +2038 LDAB ROWADX +2039 CMPB #NUMLIN-1 +2040 BEQ ESCCLL +2041 * +2042 ** SCROLL SCREEN DOWN FROM CURSOR +2043 * +2044 LDX #SCREEN+SCNLEN-LINLEN +2045 ESCIN0 LDAA 0,-X +2046 STAA LINLEN,X +2047 LDA SCNLEN,X +2048 STA SCNLEN+LINLEN,X +2049 CPX CURSOR +2050 BNE ESCIN0 +2051 +2052 ****************** CLEAR FROM CURSOR TO END OF LINE +2053 +2054 ESCCLL LDA COLADX GET CURRENT COLUMN +2055 LDX CURSOR GET CURSOR +2056 LDB #$20 AND CLEAR CHAR +2057 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE +2058 STB ,X+ CLEAR TEXT +2059 INCA +2060 CMPA #LINLEN UNTIL END OF LINE +2061 BNE ESCLL1 +2062 CLR ESCFLG +2063 RTS +2064 +2065 *********************************** CARRIAGE RETURN +2066 +2067 CRETN CLRA SET COLUMN ZERO +2068 POSCOL LDB ROWADX GET CURRENT ROW +2069 +2070 *********** GENERATE NEW CURSOR POSITION AND RETURN +2071 +2072 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN +2073 LDA #LINLEN ELSE ADD A LINE +2074 MUL LINLEN * ROWADX +2075 ADDB COLADX +2076 ADCA #0 +2077 ADDD #SCREEN ADD SCREEN BASE. +2078 STD CURSOR SAVE NEW CURSOR +2079 TFR D,X GET CURSOR IN X +2080 RTS AND RETURN +2081 +2082 ********************* UPDATE CURRENT COLUMN AND ROW +2083 +2084 NEWCOL LDD COLADX GET ROW AND COLUMN +2085 INCA BUMP COLUMN +2086 CMPA #LINLEN ROLL? +2087 BNE NEWCUR BRANCH IF NOT +2088 CLRA ELSE RESET TO ZERO +2089 INCB AND BUMP ROW +2090 CMPB #NUMLIN +2091 BNE NEWCUR +2092 DECB BOTTOM ROW +2093 BSR NEWCUR +2094 +2095 ********************************* SCROLL THE SCREEN +2096 +2097 SCROLL LDX #SCREEN POINT TO SCREEN +2098 SCROL1 LDA SCNLEN+LINLEN,X +2099 STA SCNLEN,X +2100 LDAA LINLEN,X MOVE TWO BYTES +2101 STAA 0,X+ UP ONE LINE +2102 CMPX #SCREEN+SCNLEN-LINLEN +2103 BNE SCROL1 LOOP UNTIL DONE +2104 BRA SCROL3 +2105 +2106 **************** CLEAR FROM CURSOR TO END OF SCREEN +2107 +2108 ESCCLS LDX CURSOR GET CURSOR +2109 SCROL3 LDAA #$20 GET A SPACE +2110 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES +2111 STA ,X+ AND TEXT +2112 CMPX #SCREEN+SCNLEN +2113 BNE SCROL2 UNTIL DONE +2114 CLR ESCFLG +2115 RTS +2116 ENDIF DG640OPT +2116 ENDIF DG640OPT +2117 * +2118 IFD PRTOPT +2119 ************************************* +2120 * +2121 ** PRINTER DRIVER ROUTINES +2122 * +2123 ************************************* +2124 * +2125 ** PINIZ - INITIATE PRINTER PORT +2126 * +2127 PINIZ PSHS B +2128 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 +2129 STD PADATA SET DDR AND SELECT DATA +2130 * +2131 ** RESET PRINTER +2132 LDB #PRESET +2133 STAB PADATA +2134 RESTLP INCB DELAY FOR RESET +2135 BNE RESTLP +2136 STAA PADATA ACCA=DIRMSK +2137 * +2138 ** INITALIZE PORT B (DATA PORT) +2139 LDAA #$2A +2140 STAA PBCTRL +2141 LDD #$FF2E ACCA=$FF ACCB =%00101110 +2142 STD PBDATA PBDREG PBCTRL +2143 * +2144 ** SELECT 66 LINES/PAGE +2145 LDAA #$1B +2146 BSR POUTCH +2147 LDAA #'C +2148 BSR POUTCH +2149 LDAA #66 +2150 PULS B +2151 ************************************* +2152 * +2153 ** OUTPUT A CHARACTER TO THE PRINTER +2154 * +2155 ************************************* +2156 POUTCH PSHS B +2157 LDAB PBDATA CLEAR INTERRUPT BIT +2158 * +2159 ** WAIT TILL NOT BUSY +2160 BUSYLP LDAB PADATA +2161 BITB #PERROR +2162 BEQ PEXIT +2163 TSTB +2164 BMI BUSYLP +2165 * +2166 ** NOW OUTPUT CHARACTER +2167 STAA PBDATA +2168 PEXIT PULS B,PC +2169 ************************************* +2170 * +2171 ** PCHK TEST IFD PRINTER READY +2172 * +2173 ************************************* +2174 PCHK TST PBCTRL TEST STATE OF CRB7 +2175 RTS SET ON ACKNOWLEDGE +2176 ENDIF PRTOPT +2176 ENDIF PRTOPT +2177 ************************************* +2178 * +2179 * MONITOR KEYBOARD COMMAND JUMP TABLE +2180 * +2181 ************************************* +2182 * +2183 FE3B JMPTAB EQU * +2184 FE3B 01 FCB 1 " ^A " +2185 FE3C FB 74 FDB ALTRA +2186 FE3E 02 FCB 2 " ^B " +2187 FE3F FB 69 FDB ALTRB +2188 FE41 03 FCB 3 " ^C " +2189 FE42 FB 7F FDB ALTRCC +2190 FE44 04 FCB 4 " ^D " +2191 FE45 FB 5E FDB ALTRDP +2192 FE47 10 FCB $10 " ^P " +2193 FE48 FB 31 FDB ALTRPC +2194 FE4A 15 FCB $15 " ^U " +2195 FE4B FB 3D FDB ALTRU +2196 FE4D 18 FCB $18 " ^X " +2197 FE4E FB 53 FDB ALTRX +2198 FE50 19 FCB $19 " ^Y " +2199 FE51 FB 48 FDB ALTRY +2200 * +2201 FE53 42 FCC 'B' +2202 FE54 F9 5C FDB BRKPNT +2203 FE56 45 FCC 'E' +2204 FE57 F8 FD FDB MEMDUMP +2205 FE59 47 FCC 'G' +2206 FE5A F8 A5 FDB GO +2207 FE5C 4C FCC 'L' +2208 FE5D FA 5E FDB LOAD +2209 FE5F 50 FCC 'P' +2210 FE60 FA BC FDB PUNCH +2211 FE62 4D FCC 'M' +2212 FE63 F8 A8 FDB MEMCHG +2213 FE65 52 FCC 'R' +2214 FE66 FB ED FDB REGSTR +2215 FE68 53 FCC 'S' +2216 FE69 F8 F1 FDB DISSTK +2217 FE6B 58 FCC 'X' +2218 FE6C F9 88 FDB XBKPNT +2219 IFD MFDCOPT +2220 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT +2221 FDB MINBOOT +2222 ENDIF MFDCOPT +2222 ENDIF MFDCOPT +2223 IFD CFOPT +2224 FE6E 44 FCC 'D' *** FPGA USES 'D' FOR CFBOOT +2225 FE6F F9 D5 FDB CFBOOT +2226 ENDIF CFOPT +2227 IFD DMAFOPT +2228 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT +2229 FDB DBOOT +2230 ELSE +2231 FE71 55 FCC 'U' *** IF NOT DMAF2, 'U' IS FOR USER +2232 FE72 FC 92 FDB EXTEND +2233 ENDIF DMAFOPT +2234 IFD RTCOPT +2235 FCC 'T' +2236 FDB TIMSET +2237 ENDIF RTCOPT +2237 ENDIF RTCOPT +2238 IFD TRAOPT +2239 FCC "T" +2240 FDB TRACE +2241 ENDIF TRAOPT +2241 ENDIF TRAOPT +2242 * +2243 FE74 TABEND EQU * +2244 * +2245 * ** 6809 VECTOR ADDRESSES ** +2246 * +2247 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES +2248 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY +2249 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE +2250 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO +2251 * HIS OWN ROUTINES IF HE SO DESIRES. +2252 * +2253 * +2254 FE74 F9 94 RAMVEC FDB SWIE USER-V +2255 FE76 F8 A7 FDB RTI SWI3-V +2256 FE78 F8 A7 FDB RTI SWI2-V +2257 FE7A F8 A7 FDB RTI FIRQ-V +2258 FE7C F8 A7 FDB RTI IRQ-V +2259 FE7E F9 94 FDB SWIE SWI-V +2260 FE80 FF FF FDB $FFFF SVC-VO +2261 FE82 FF FF FDB $FFFF SVC-VL +2262 * +2263 * PRINTABLE MESSAGE STRINGS +2264 * +2265 FE84 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 +2266 FE89 53 59 53 30 39 42 FCC 'SYS09BUG 1.3 FOR ' + 55 47 20 31 2E 33 20 46 4F 52 20 -2084 IFD FPGAOPT` -2085 FE9A 46 50 47 41 20 FCC 'FPGA ' -2086 ENDIF FPGAOPT -2087 IFD ADSOPT -2088 FCC 'ADS6809 ' -2089 ENDIF ADSOPT -2089 ENDIF ADSOPT -2090 IFD SWTPOPT` -2091 FCC 'SWTPC ' -2092 ENDIF SWTPOPT -2092 ENDIF SWTPOPT -2093 FE9F 20 2D 20 FCC ' - ' -2094 FEA2 04 FCB 4 -2095 FEA3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS +2267 IFD S3EOPT +2268 FCC 'S3E ' +2269 ENDIF S3EOPT +2269 ENDIF S3EOPT +2270 IFD FPGAOPT +2271 FE9A 46 50 47 41 20 FCC 'FPGA ' +2272 ENDIF FPGAOPT +2273 IFD ADSOPT +2274 FCC 'ADS6809 ' +2275 ENDIF ADSOPT +2275 ENDIF ADSOPT +2276 IFD SWTPOPT` +2277 FCC 'SWTPC ' +2278 ENDIF SWTPOPT +2278 ENDIF SWTPOPT +2279 FE9F 20 2D 20 FCC ' - ' +2280 FEA2 04 FCB 4 +2281 FEA3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS 04 -2096 FEAA 3E MSG3 FCC '>' -2097 FEAB 04 FCB 4 -2098 FEAC 57 48 41 54 3F MSG4 FCC 'WHAT?' -2099 FEB1 04 FCB 4 -2100 FEB2 20 2D 20 MSG5 FCC ' - ' -2101 FEB5 04 FCB 4' -2102 FEB6 20 20 53 50 3D MSG10 FCC ' SP=' -2103 FEBB 04 FCB 4 -2104 FEBC 20 20 50 43 3D MSG11 FCC ' PC=' -2105 FEC1 04 FCB 4 -2106 FEC2 20 20 55 53 3D MSG12 FCC ' US=' -2107 FEC7 04 FCB 4 -2108 FEC8 20 20 49 59 3D MSG13 FCC ' IY=' -2109 FECD 04 FCB 4 -2110 FECE 20 20 49 58 3D MSG14 FCC ' IX=' -2111 FED3 04 FCB 4 -2112 FED4 20 20 44 50 3D MSG15 FCC ' DP=' -2113 FED9 04 FCB 4 -2114 FEDA 20 20 41 3D MSG16 FCC ' A=' -2115 FEDE 04 FCB 4 -2116 FEDF 20 20 42 3D MSG17 FCC ' B=' -2117 FEE3 04 FCB 4 -2118 FEE4 20 20 43 43 3A 20 MSG18 FCC ' CC: ' -2119 FEEA 04 FCB 4 -2120 FEEB 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' +2282 FEAA 3E MSG3 FCC '>' +2283 FEAB 04 FCB 4 +2284 FEAC 57 48 41 54 3F MSG4 FCC 'WHAT?' +2285 FEB1 04 FCB 4 +2286 FEB2 20 2D 20 MSG5 FCC ' - ' +2287 FEB5 04 FCB 4' +2288 FEB6 20 20 53 50 3D MSG10 FCC ' SP=' +2289 FEBB 04 FCB 4 +2290 FEBC 20 20 50 43 3D MSG11 FCC ' PC=' +2291 FEC1 04 FCB 4 +2292 FEC2 20 20 55 53 3D MSG12 FCC ' US=' +2293 FEC7 04 FCB 4 +2294 FEC8 20 20 49 59 3D MSG13 FCC ' IY=' +2295 FECD 04 FCB 4 +2296 FECE 20 20 49 58 3D MSG14 FCC ' IX=' +2297 FED3 04 FCB 4 +2298 FED4 20 20 44 50 3D MSG15 FCC ' DP=' +2299 FED9 04 FCB 4 +2300 FEDA 20 20 41 3D MSG16 FCC ' A=' +2301 FEDE 04 FCB 4 +2302 FEDF 20 20 42 3D MSG17 FCC ' B=' +2303 FEE3 04 FCB 4 +2304 FEE4 20 20 43 43 3A 20 MSG18 FCC ' CC: ' +2305 FEEA 04 FCB 4 +2306 FEEB 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' 56 43 -2121 FEF3 53 31 MSG20 FCC 'S1' -2122 FEF5 04 FCB 4 -2123 IFD DATOPT -2124 * -2125 * POWER UP/ RESET/ NMI ENTRY POINT -2126 * -2127 FF00 ORG $FF00 -2128 * -2129 * -2130 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11 -2131 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO -2132 * -2133 * -2134 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F -2135 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS -2136 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE -2137 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA -2138 * STORED IN IT. -2139 * -2140 * -2141 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION -2142 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION -2143 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ? -2144 * -2145 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER -2146 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL -2147 * PHYSICAL ADDRESSES. -2148 * -2149 FF0A 86 F0 LDA #$F0 -2150 FF0C A7 84 STA ,X STORE $F0 AT $FFFF -2151 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF -2152 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" -2153 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION -2154 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0 -2155 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ? -2156 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP -2157 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER -2158 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? -2159 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM -2160 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN -2161 * -2162 * -2163 * THE FOLLOWING CODE STORES THE COMPLEMENT OF -2164 * THE MS CHARACTER OF THE FOUR CHARACTER HEX -2165 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED -2166 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT -2167 * IS STORED IN RAM IN THE LOCATION THAT IS -2168 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, -2169 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND -2170 * WHEN TESTING LOCATION $70A0, MEANING THERE -2171 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE -2172 * $8000-$DFFF, THEN THE COMPLEMENT OF THE -2173 * "7" IN THE $70A0 WILL BE STORED IN -2174 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS -2175 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND -2176 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE -2177 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE -2178 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- -2179 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT -2180 * IS AT $D--- SINCE THAT IS THE ADDRESS THE -2181 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK -2182 * OF RAM RESPONDS. -2183 * -2184 * -2185 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION -2186 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D -2187 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS -2188 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN -2189 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING -2190 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS -2191 FF32 44 LSRA TRANSLATION RAM. -2192 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D" -2193 * -2194 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER -2195 * -2196 * -2197 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES -2198 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK -2199 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS -2200 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION -2201 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF -2202 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO -2203 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... -2204 * -2205 * 0 1 2 3 4 5 6 7 8 9 A B C D E F -2206 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- -2207 * -2208 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE -2209 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... -2210 * -2211 * 0 1 2 3 4 5 6 7 8 9 A B C D E F -2212 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 -2213 * -2214 * -2215 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF -2216 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL -2217 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK -2218 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT -2219 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 -2220 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 -2221 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE -2222 * MEMORY ADDRESSED AS FOLLOWS.... -2223 * -2224 * 0 1 2 3 4 5 6 7 8 9 A B C D E F -2225 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- -2226 * -2227 * -2228 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE -2229 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD -2230 FF40 6F 2E CLR 14,Y CLEAR $DFDE -2231 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? -2232 FF44 A7 2F STA 15,Y STORE AT $DFDF -2233 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR -2234 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 -2235 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR -2236 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING -2237 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM -2238 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO -2239 FF54 27 22 BEQ FINTAB SKIP IF FINISHED -2240 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION -2241 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. -2242 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC. -2243 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION -2244 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER -2245 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION -2246 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE -2247 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D -2248 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 -2249 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM. -2250 FF6E 44 LSRA -2251 FF6F 44 LSRA -2252 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE -2253 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK -2254 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE -2255 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK -2256 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? -2257 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE -2258 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE -2259 * -2260 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF -2261 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES -2262 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT -2263 * LOGICALLY RESPONDS TO THE ADDRESS $C---. -2264 * -2265 * -2266 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C" -2267 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE -2268 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. -2269 FF86 4A DECA ELSE POINT 4K LOWER -2270 FF87 2A F9 BPL FINDC GO TRY AGAIN -2271 FF89 20 14 BRA XFERTF -2272 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND -2273 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- -2274 * -2275 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION -2276 * FACTORS SUCH THAT ALL REMAINING RAM WILL -2277 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL -2278 * ADDRESSES FROM $0000 AND UP.... -2279 * -2280 FF8F 4F CLRA START AT ZERO -2281 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. -2282 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE -2283 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP -2284 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE -2285 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP -2286 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY -2287 FF9B 81 0C CMPA #$0C LAST ENTRY YET ? -2288 FF9D 2D F3 BLT COMPRS -2289 * -2290 * THE FOLLOWING CODE TRANSFER THE TRANSLATION -2291 * FACTORS FROM THE LRARAM TABLE TO IC11 ON -2292 * THE MP-09 CPU CARD. -2293 * -2294 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11 -2295 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE -2296 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT -2297 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11 -2298 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE -2299 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED -2300 * -2301 ELSE -2302 LRA RTS -2303 START LDS #STACK INITIALIZE STACK POINTER -2304 CLRB -2305 ENDIF DATOPT -2305 ENDIF DATOPT -2306 * -2307 FFAB 53 COMB SET "B" NON-ZERO -2308 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG -2309 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE +2307 FEF3 53 31 MSG20 FCC 'S1' +2308 FEF5 04 FCB 4 +2309 IFD DATOPT 2310 * -2311 ** INTERRUPT JUMP VECTORS -2312 * -2313 FFB2 6E 9F DF C0 V1 JMP [STACK] -2314 FFB6 6E 9F DF C4 V2 JMP [SWI2] -2315 FFBA 6E 9F DF C6 V3 JMP [FIRQ] -2316 FFBE 6E 9F DF C8 V4 JMP [IRQ] -2317 FFC2 6E 9F DF CA V5 JMP [SWI] +2311 * POWER UP/ RESET/ NMI ENTRY POINT +2312 * +2313 FF00 ORG $FF00 +2314 * +2315 * +2316 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11 +2317 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO 2318 * -2319 * SWI3 ENTRY POINT -2320 * -2321 FFC6 1F 43 SWI3E TFR S,U -2322 FFC8 AE 4A LDX 10,U *$FFC8 -2323 FFCA E6 80 LDB ,X+ -2324 FFCC AF 4A STX 10,U -2325 FFCE 4F CLRA -2326 FFCF 58 ASLB -2327 FFD0 49 ROLA -2328 FFD1 BE DF CC LDX SVCVO -2329 FFD4 8C FF FF CMPX #$FFFF -2330 FFD7 27 0F BEQ SWI3Z -2331 FFD9 30 8B LEAX D,X -2332 FFDB BC DF CE CMPX SVCVL -2333 FFDE 22 08 BHI SWI3Z -2334 FFE0 34 10 PSHS X -2335 FFE2 EC C4 LDD ,U -2336 FFE4 AE 44 LDX 4,U -2337 FFE6 6E F1 JMP [,S++] -2338 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP -2339 FFEA EE 42 LDU 2,U -2340 FFEC 6E 9F DF C2 JMP [SWI3] -2341 * -2342 * 6809 VECTORS -2343 * -2344 FFF0 ORG $FFF0 -2345 FFF0 FF B2 FDB V1 USER-V -2346 FFF2 FF C6 FDB SWI3E SWI3-V -2347 FFF4 FF B6 FDB V2 SWI2-V -2348 FFF6 FF BA FDB V3 FIRQ-V -2349 FFF8 FF BE FDB V4 IRQ-V -2350 FFFA FF C2 FDB V5 SWI-V -2351 FFFC FF B2 FDB V1 NMI-V -2352 FFFE FF 00 FDB START RESTART-V -2353 END START +2319 * +2320 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F +2321 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS +2322 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE +2323 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA +2324 * STORED IN IT. +2325 * +2326 * +2327 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION +2328 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION +2329 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ? +2330 * +2331 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER +2332 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL +2333 * PHYSICAL ADDRESSES. +2334 * +2335 FF0A 86 F0 LDA #$F0 +2336 FF0C A7 84 STA ,X STORE $F0 AT $FFFF +2337 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF +2338 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" +2339 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION +2340 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0 +2341 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ? +2342 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP +2343 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER +2344 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? +2345 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM +2346 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN +2347 * +2348 * +2349 * THE FOLLOWING CODE STORES THE COMPLEMENT OF +2350 * THE MS CHARACTER OF THE FOUR CHARACTER HEX +2351 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED +2352 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT +2353 * IS STORED IN RAM IN THE LOCATION THAT IS +2354 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, +2355 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND +2356 * WHEN TESTING LOCATION $70A0, MEANING THERE +2357 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE +2358 * $8000-$DFFF, THEN THE COMPLEMENT OF THE +2359 * "7" IN THE $70A0 WILL BE STORED IN +2360 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS +2361 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND +2362 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE +2363 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE +2364 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- +2365 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT +2366 * IS AT $D--- SINCE THAT IS THE ADDRESS THE +2367 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK +2368 * OF RAM RESPONDS. +2369 * +2370 * +2371 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION +2372 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D +2373 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS +2374 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN +2375 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING +2376 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS +2377 FF32 44 LSRA TRANSLATION RAM. +2378 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D" +2379 * +2380 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER +2381 * +2382 * +2383 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES +2384 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK +2385 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS +2386 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION +2387 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF +2388 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO +2389 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... +2390 * +2391 * 0 1 2 3 4 5 6 7 8 9 A B C D E F +2392 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- +2393 * +2394 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE +2395 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... +2396 * +2397 * 0 1 2 3 4 5 6 7 8 9 A B C D E F +2398 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 +2399 * +2400 * +2401 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF +2402 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL +2403 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK +2404 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT +2405 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 +2406 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 +2407 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE +2408 * MEMORY ADDRESSED AS FOLLOWS.... +2409 * +2410 * 0 1 2 3 4 5 6 7 8 9 A B C D E F +2411 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- +2412 * +2413 * +2414 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE +2415 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD +2416 FF40 6F 2E CLR 14,Y CLEAR $DFDE +2417 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? +2418 FF44 A7 2F STA 15,Y STORE AT $DFDF +2419 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR +2420 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 +2421 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR +2422 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING +2423 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM +2424 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO +2425 FF54 27 22 BEQ FINTAB SKIP IF FINISHED +2426 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION +2427 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. +2428 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC. +2429 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION +2430 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER +2431 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION +2432 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE +2433 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D +2434 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 +2435 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM. +2436 FF6E 44 LSRA +2437 FF6F 44 LSRA +2438 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE +2439 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK +2440 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE +2441 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK +2442 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? +2443 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE +2444 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE +2445 * +2446 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF +2447 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES +2448 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT +2449 * LOGICALLY RESPONDS TO THE ADDRESS $C---. +2450 * +2451 * +2452 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C" +2453 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE +2454 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. +2455 FF86 4A DECA ELSE POINT 4K LOWER +2456 FF87 2A F9 BPL FINDC GO TRY AGAIN +2457 FF89 20 14 BRA XFERTF +2458 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND +2459 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- +2460 * +2461 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION +2462 * FACTORS SUCH THAT ALL REMAINING RAM WILL +2463 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL +2464 * ADDRESSES FROM $0000 AND UP.... +2465 * +2466 FF8F 4F CLRA START AT ZERO +2467 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. +2468 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE +2469 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP +2470 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE +2471 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP +2472 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY +2473 FF9B 81 0C CMPA #$0C LAST ENTRY YET ? +2474 FF9D 2D F3 BLT COMPRS +2475 * +2476 * THE FOLLOWING CODE TRANSFER THE TRANSLATION +2477 * FACTORS FROM THE LRARAM TABLE TO IC11 ON +2478 * THE MP-09 CPU CARD. +2479 * +2480 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11 +2481 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE +2482 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT +2483 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11 +2484 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE +2485 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED +2486 * +2487 ELSE +2488 LRA RTS +2489 START LDS #STACK INITIALIZE STACK POINTER +2490 CLRB +2491 ENDIF DATOPT +2491 ENDIF DATOPT +2492 * +2493 FFAB 53 COMB SET "B" NON-ZERO +2494 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG +2495 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE +2496 * +2497 ** INTERRUPT JUMP VECTORS +2498 * +2499 FFB2 6E 9F DF C0 V1 JMP [STACK] +2500 FFB6 6E 9F DF C4 V2 JMP [SWI2] +2501 FFBA 6E 9F DF C6 V3 JMP [FIRQ] +2502 FFBE 6E 9F DF C8 V4 JMP [IRQ] +2503 FFC2 6E 9F DF CA V5 JMP [SWI] +2504 * +2505 * SWI3 ENTRY POINT +2506 * +2507 FFC6 1F 43 SWI3E TFR S,U +2508 FFC8 AE 4A LDX 10,U *$FFC8 +2509 FFCA E6 80 LDB ,X+ +2510 FFCC AF 4A STX 10,U +2511 FFCE 4F CLRA +2512 FFCF 58 ASLB +2513 FFD0 49 ROLA +2514 FFD1 BE DF CC LDX SVCVO +2515 FFD4 8C FF FF CMPX #$FFFF +2516 FFD7 27 0F BEQ SWI3Z +2517 FFD9 30 8B LEAX D,X +2518 FFDB BC DF CE CMPX SVCVL +2519 FFDE 22 08 BHI SWI3Z +2520 FFE0 34 10 PSHS X +2521 FFE2 EC C4 LDD ,U +2522 FFE4 AE 44 LDX 4,U +2523 FFE6 6E F1 JMP [,S++] +2524 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP +2525 FFEA EE 42 LDU 2,U +2526 FFEC 6E 9F DF C2 JMP [SWI3] +2527 * +2528 * 6809 VECTORS +2529 * +2530 FFF0 ORG $FFF0 +2531 FFF0 FF B2 FDB V1 USER-V +2532 FFF2 FF C6 FDB SWI3E SWI3-V +2533 FFF4 FF B6 FDB V2 SWI2-V +2534 FFF6 FF BA FDB V3 FIRQ-V +2535 FFF8 FF BE FDB V4 IRQ-V +2536 FFFA FF C2 FDB V5 SWI-V +2537 FFFC FF B2 FDB V1 NMI-V +2538 FFFE FF 00 FDB START RESTART-V +2539 END START Program + Init Data = 2038 bytes Error count = 0 Index: trunk/src/sys09bug/sys09bugvhd.aux =================================================================== --- trunk/src/sys09bug/sys09bugvhd.aux (revision 19) +++ trunk/src/sys09bug/sys09bugvhd.aux (revision 20) @@ -1,10 +1,10 @@ t m l sys09bug_fpga.s19 t h -s sys09bug_b16.vhd f800 ffff -s sys09bug_b4_0.vhd f800 f9ff -s sys09bug_b4_1.vhd fa00 fbff -s sys09bug_b4_2.vhd fc00 fdff -s sys09bug_b4_3.vhd fe00 ffff +s sys09bug_fpga_b16.vhd f800 ffff +s sys09bug_fpga_b4_0.vhd f800 f9ff +s sys09bug_fpga_b4_1.vhd fa00 fbff +s sys09bug_fpga_b4_2.vhd fc00 fdff +s sys09bug_fpga_b4_3.vhd fe00 ffff q
/trunk/src/sys09bug/sys09bug_s3e_b16.vhd
0,0 → 1,64
INIT_00 => x"A780A610C6C07F8E1067FE8EE8FE0DFB11FB82FBC1FCACFC8EFC94FC4BF814F8",
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC6450117D07FBF00E08EF9265AA0",
INIT_02 => x"092C2081891FF1270D817F84400417BC02179CFE8EDE01173A031777FE8E9204",
INIT_03 => x"FE8C02300F2780E12EFE8E20C0022F60C1500417550417408B981F5C04175E86",
INIT_04 => x"1F6E0217A4FE8E121F2D297403173B341FBC2094ADC020F902179EFE8EF52667",
INIT_05 => x"17275E81DD271881E12708811128670317100417AE0317A4A6180417AE031721",
INIT_06 => x"321FAB0217BE203F31C2202131EE03173F86F103170827A4A1A4A7390F260D81",
INIT_07 => x"F0C4201F0634F0C41000C3101F390124E1AC2034062914031705201F30C07F8E",
INIT_08 => x"10C69F0317370317E4AEF70117A4FE8E10343962320327A303170527E4AC011F",
INIT_09 => x"03172E8602237E810425208180A610C6E1AE8F0317F5265A97031735031780A6",
INIT_0a => x"273F8184A60F2710355B8DFFFF8E10341A24C07F8C1E29C00217BC20EE265A80",
INIT_0b => x"431F39FB265A1E8D08C6D37F8E104F03163F865203173984A73F86A4AFA0A709",
INIT_0c => x"A60A24C07F8C21AEB3FE16ED7FBF00008E5102170C8D4AAF04272C8D1F304AAE",
INIT_0d => x"265A0427A1ACA0A608C6D37F8E1039A0A7A0A7A0A7FF8684A7A4A604263F8184",
INIT_0e => x"7FBFE7F98EEB7FBFC07FBEED7FBF1429390217F202171C295F0117393D3139F7",
INIT_0f => x"27ED7FBE24273F8184A64AAEEC011770E0B671E0B73686431F392020450017C0",
INIT_10 => x"3B71E0B73F8673E0B7368670E0B671E0B7368670E0B70D86341FED7FBF1F301F",
INIT_11 => x"B7368672E0B7008670E0B7FF8673E0B73A8671E0B7328622FE16C07FBFEB7FBE",
INIT_12 => x"812A0217D27F7F6802171186D6FCBD8435FD265A20C604343973E0B73E8671E0",
INIT_13 => x"E0EBE0E61034212991011726290234A80117F12631813D273981230217F92653",
INIT_14 => x"FFC102355FEB2080A70527E46AE0EB02340C2904358E01170434E46AE46AE4EB",
INIT_15 => x"E4AF0130492562AC4D2930344A0117E26F1202161386D27F731A02173F86BA27",
INIT_16 => x"03CB2F0017E5FE8E64E720C6022320008310062762A3E4ECF901171286D6FCBD",
INIT_17 => x"AF5B0117981F53F526646A65011780A684EB63EB62EB68011762AE750117981F",
INIT_18 => x"0016A10116903569001796FE8E10347120028D396532B701171486C326E4AC62",
INIT_19 => x"8DDC8D728D3948AF0229EB8DE78D618D394AAF0229F68DF28D910017E50016F8",
INIT_1a => x"BB8D6C8D3943A70229C78DC68D498D3944AF0229D58DD18D5E8D3946AF0229E0",
INIT_1b => x"1739C4A7808A0429A68DA58D5F8D3941A70229B18DB08D588D3942A70229BC8D",
INIT_1c => x"8DC6FE8EF42048AEEA8DB4FE8EBF0016311FF48DA8FE8E39F726048180A63F01",
INIT_1d => x"204AAEC58DAEFE8ED82046AECE8DBAFE8EE12044AED78DC0FE8EB4001643A6E1",
INIT_1e => x"900016DDFE8EC4A6AA8DD6FE8ED02042A6B38DD1FE8ED92041A6BC8DCCFE8ECF",
INIT_1f => x"098DD520CE8DC78DC08D17FF17A4FE8EBF8DB88DB08DA98DA18D27FF17A4FE8E",
INIT_20 => x"4848483229118D903561A710343C29088D011F42290E8DB800172D86121F4D29",
INIT_21 => x"22468112254181393080032239811D2530815B8D39E0AB04342829078D891F48",
INIT_22 => x"4444444402340235028D0235103439021A395780032266810725618139378003",
INIT_23 => x"3F8D438D2D860225E46880A608C602345120078B022F3981308B0F840235048D",
INIT_24 => x"8E0926018584A6D07FBE10342D207F84048D0627D27F7D00F09F6E8235F1265A",
INIT_25 => x"86008D8235018520E0B605260185D07F9FA60234903501A6EE27018584A620E0",
INIT_26 => x"A7118684A70386D07FBE138D903501A70235FA27028584A6D07FBE1234458D20",
INIT_27 => x"7F01E702C6F17FFD04E703E702A7EF7FFD0000CC30E08E39D27FB7FF86016D84",
INIT_28 => x"84A70520098D042420810D20748D0427F27F7D30E08E16345986028D1B86F27F",
INIT_29 => x"100D814500271016818E0027101A816C0027101B814100271008819635C50017",
INIT_2a => x"9900168300261019C15CEF7FFC51260A81110027100B812C0027100C81990027",
INIT_2b => x"162500271050814CEF7FB66800164A3327EF7FB67400165A3C0027105DEF7FFC",
INIT_2c => x"F27FB704263D81312754816E002710598116273DC1F27FF65800160000CC5B00",
INIT_2d => x"C120C0F17F7FF17FF6ED224F812080F27F7F39F17FB70426F17F7D39F27F7F39",
INIT_2e => x"F07FF64F39F27F7FF726508102A74C84E720C6EF7FB6168D0000CC1B20E12218",
INIT_2f => x"012519C15C04E6E78D5AEA2619C15C4FF02650814CEF7FFC3903E702A7EF7FFD",
INIT_30 => x"E7F07FF7082719C15CF07FF6F42650C15C84A702E7EF7FF72086EF7FF604E75F",
INIT_31 => x"30FB1524FB1051FB0472FB035CFB0267FB0139F27FF702E7EF7FF75FE4205F03",
INIT_32 => x"F958DBF853E0FB5292F84DAFFA5051FA4C8FF847E7F84546F9423BFB1946FB18",
INIT_33 => x"305359530000000A0DFFFFFFFF7EF991F891F891F891F87EF9C5F95485FC5572",
INIT_34 => x"4857043E040000000A0D4B04202D202045335320524F4620332E312047554239",
INIT_35 => x"043D59492020043D53552020043D43502020043D5053202004202D20043F5441",
INIT_36 => x"48464504203A43432020043D422020043D412020043D50442020043D58492020",
INIT_37 => x"7F9F6EC47F9F6EC07F9F6E1FF916D27FF7535FC07FCE103904315343565A4E49",
INIT_38 => x"7FBC8B300F27FFFF8CCC7FBE49584F4AAF80E64AAE431FCA7F9F6EC87F9F6EC6",
INIT_39 => x"00000000000000000000000000C27F9F6E42EE1F37F16E44AEC4EC10340822CE",
INIT_3a => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3b => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3c => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3d => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3e => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3f => x"E9FEF5FE05FF01FFFDFEF9FE09FFF5FE00000000000000000000000000000000"
/trunk/src/sys09bug/sys09bug_ads.s19
51,7 → 51,7
S123FE401027065D2BF6B7E40635847DE4073901FB3D02FB3203FB4804FB2710FAFA15FB00
S123FE600618FB1C19FB1142F95145F8F247F89A4CFA2750FA854DF89D52FBB653F8E658E6
S123FE80F97D44F9CA55FC5BF989F89CF89CF89CF89CF989FFFFFFFF0D0A000000535953CF
S123FEA0303942554720312E3220464F52204144533638303920202D20044B0D0A0000007D
S123FEA0303942554720312E3320464F52204144533638303920202D20044B0D0A0000007C
S123FEC0043E04574841543F04202D2004202053503D04202050433D04202055533D04206F
S123FEE02049593D04202049583D04202044503D042020413D042020423D04202043433A3F
S123FF002004454648494E5A56435331043910CEDFC05F53F7DFD216F9086E9FDFC06E9FF4
/trunk/src/sys09bug/sys09bug_fpga.s19
50,7 → 50,7
S123FE20F4F6DFFC5CC1192708F7DFFCE7035F20E45FF7DFFBE702F7DFFE3901FB7402FBE2
S123FE406903FB7F04FB5E10FB3115FB3D18FB5319FB4842F95C45F8FD47F8A54CFA5E5067
S123FE60FABC4DF8A852FBED53F8F158F98844F9D555FC92F994F8A7F8A7F8A7F8A7F99401
S123FE80FFFFFFFF0D0A000000535953303942554720312E3220464F5220465047412020CF
S123FE80FFFFFFFF0D0A000000535953303942554720312E3320464F5220465047412020CE
S123FEA02D20044B0D0A000000043E04574841543F04202D2004202053503D042020504366
S123FEC03D04202055533D04202049593D04202049583D04202044503D042020413D042078
S119FEE020423D04202043433A2004454648494E5A56435331045C
/trunk/src/sys09bug/sys09bug_s3e.lst
0,0 → 1,2579
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR
0002 OPT l
 
sys09bug.txt page 2
0004 *
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007 *
0008 * ALLEN CLARK WALLACE WATSON
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
0011 * PH. 813-977-0347 PH. 813-985-1359
0012 *
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
0014 * 2561 NANTUCKET DR APT. E
0015 * ATLANTA, GA 30345
0016 * PH. 404-320-1043
0017 *
0018 * MODIFIED TO SYS09BUG VER 1.0
0019 * FOR: SYSTEM09 FPGA SYSTEM
0020 * BY: JOHN KENT
0021 * DATE: 21ST NOVEMBER 2006
0022 * REMOVED: DISK BOOTS
0023 * MEMORY TEST
0024 * ADDED: ADM3A VDU DRIVER
0025 *
0026 * MODIFIED TO SYS09BUG VER 1.1
0027 * FOR: SYSTEM09 FPGA SYSTEM
0028 * BY: JOHN KENT
0029 * DATE: 7TH JANUARY 2007
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0032 * AND REALTIME CLOCK
0033 *
0034 * MODIFIED TO SYS09BUG VER 1.2
0035 * FOR: SYSTEM09 FPGA SYSTEM
0036 * BY: JOHN KENT
0037 * DATE: 21ST MAY 2007
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * *** COMMANDS ***
0049 *
0050 * CONTROL A = ALTER THE "A" ACCUMULATOR
0051 * CONTROL B = ALTER THE "B" ACCUMULATOR
0052 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0053 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0054 * CONTROL P = ALTER THE PROGRAM COUNTER
0055 * CONTROL U = ALTER USER STACK POINTER
0056 * CONTROL X = ALTER "X" INDEX REGISTER
0057 * CONTROL Y = ALTER "Y" INDEX REGISTER
0058 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0059 * D = 5.25" MINIFLOPPY BOOT
0060 * E ssss-eeee = EXAMINE MEMORY
0061 * FROM STARTING ADDRESS ssss
0062 * TO ENDING ADDRESS eeee.
0063 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0064 * L = LOAD TAPE
0065 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0066 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0067 * R = DISPLAY REGISTER CONTENTS
0068 * S = DISPLAY STACK FROM ssss TO $DFC0
0069 * U = 8" DMAF2 FLOPPY BOOT
0070 * U = USER EXTENSION COMMANDS AT $F000
0071 * X = REMOVE ALL BREAKPOINTS
0072 *
0073 *
0074 *
0075 ***************************************************
0076 * OPTION SWITCHES
0077 ***************************************************
0078 *
0079 *
0080 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0081 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0082 ** FOR LOADING AND SAVING S1 RECORDS
0083 *
0084 00FF S3EOPT EQU $FF SPARTAN3E STARTER
0085 *FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD
0086 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0087 *SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0088 *
0089 ***************************************************
0090 * MEMORY MAP EQUATES *
0091 ***************************************************
0092 E000 MONIO EQU $E000 I/O SPACE
0093 IFD S3EOPT
0094 7FC0 MONRAM EQU $7FC0
0095 ELSE
0096 MONRAM EQU $DFC0 STACK SPACE
0097 ENDIF S3EOPT
0097 ENDIF S3EOPT
0098 F800 MONROM EQU $F800 START OF ROM
0099 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0100 0000 EXTCMD EQU $00 EXTENDED OFFSET
0101 ***************************************************
0102 IFD S3EOPT
0103 00FF ACIAOPT EQU $FF ACIA AT PORT 0
0104 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0105 00FF VDUOPT EQU $FF VDU AT $E030
0106 00FF TRAOPT EQU $FF PIA TRACE TIMER
0107 ENDIF S3EOPT
0108 IFD FPGAOPT
0109 ACIAOPT EQU $FF ACIA AT PORT 0
0110 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0111 VDUOPT EQU $FF VDU AT $E030
0112 CFOPT EQU $FF COMPACT FLASH AT $E040
0113 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0114 ENDIF FPGAOPT
0114 ENDIF FPGAOPT
0115 *
0116 IFD ADSOPT
0117 DG640OPT EQU $FF DG640 VDU AT $E800
0118 *RTCOPT EQU $FF REAL TIME CLOCK
0119 PRTOPT EQU $FF PRINTER DRIVERS
0120 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0121 ENDIF ADSOPT
0121 ENDIF ADSOPT
0122 *
0123 IFD SWTPOPT
0124 ACIAOPT EQU $FF ACIA AT PORT 0
0125 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0126 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0127 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0128 ENDIF
0128 ENDIF
0129 *
0130 ***************************************************
0131 * SYS09BUG VARIABLE SPACE
0132 ***************************************************
0133 *
0134 7FC0 ORG MONRAM
0135 7FC0 STACK EQU * TOP OF INTERNAL STACK
0136 7FC0 NMI RMB 2 USER NMI VECTOR
0137 7FC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0138 7FC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0139 7FC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0140 7FC8 IRQ RMB 2 INTERRUPT VECTOR
0141 7FCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0142 7FCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0143 7FCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0144 IFD DATOPT
0145 LRARAM RMB 16 LRA ADDRESSES
0146 ENDIF DATOPT
0146 ENDIF DATOPT
0147 7FD0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0148 7FD2 ECHO RMB 1 ECHO FLAG
0149 7FD3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0150 IFD TRAOPT
0151 7FEB NMISAV RMB 2 NMI Jump Vector Backup
0152 7FED TRACNT RMB 2 Trace Count
0153 ENDIF TRAOPT
0154 *
0155 IFD ACIAOPT
0156 *
0157 ***************************************************
0158 * SERIAL PORT *
0159 ***************************************************
0160 *
0161 ** ACIA SITS ON PORT 0
0162 *
0163 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0164 *
0165 ENDIF ACIAOPT
0166 IFD MFDCOPT
0167 *
0168 ***************************************************
0169 * MINIFLOPPY DRIVE *
0170 ***************************************************
0171 *
0172 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0173 *
0174 DRVFDC EQU MONIO+$14
0175 CMDFDC EQU MONIO+$18
0176 SECFDC EQU MONIO+$1A
0177 DATFDC EQU MONIO+$1B
0178 ENDIF MFDCOPT
0178 ENDIF MFDCOPT
0179 IFD PS2OPT
0180 *
0181 ***************************************************
0182 * VDU8 PS/2 KEYBOARD PORT *
0183 ***************************************************
0184 *
0185 ** KEYBOARD SITS ON PORT 2
0186 *
0187 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0188 ENDIF PS2OPT
0189 IFD VDUOPT
0190 *
0191 ***************************************************
0192 * VDU8 DISPLAY DRIVER EQUATES *
0193 ***************************************************
0194 *
0195 ** VDU8 DISPLAY SITS ON PORT 3
0196 *
0197 E030 VDU EQU MONIO+$30
0198 0000 VDUCHR EQU 0 CHARACTER REGISTER
0199 0001 VDUATT EQU 1 ATTRIBUTE REGISTER
0200 0002 VDUCOL EQU 2 CURSOR COLUMN
0201 0003 VDUROW EQU 3 CURSOR ROW
0202 0004 VDUOFF EQU 4 ROW OFFSET
0203 *
0204 0050 LINLEN EQU 80 LENGTH OF A LINE
0205 0019 NUMLIN EQU 25 NUMBER OF LINES
0206 *
0207 **************************************************
0208 * VDU8 DISPLAY DRIVER VARIABLES *
0209 **************************************************
0210 *
0211 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0212 7FEF COLADX RMB 1 CURSOR COLUMN
0213 7FF0 ROWADX RMB 1 CURSOR ROW
0214 **************************************************
0215 *
0216 7FF1 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0217 7FF2 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0218 ENDIF VDUOPT
0219 IFD CFOPT
0220 *
0221 ***************************************************
0222 * COMPACT FLASH EQUATES *
0223 ***************************************************
0224 *
0225 ** COMPACT FLASH SITS AT PORT 4
0226 *
0227 CF_BASE EQU MONIO+$40
0228 CF_DATA EQU CF_BASE+0
0229 CF_ERROR EQU CF_BASE+1 ; read error
0230 CF_FEATURE EQU CF_BASE+1 ; write feature
0231 CF_SECCNT EQU CF_BASE+2
0232 CF_SECNUM EQU CF_BASE+3
0233 CF_CYLLO EQU CF_BASE+4
0234 CF_CYLHI EQU CF_BASE+5
0235 CF_HEAD EQU CF_BASE+6
0236 CF_STATUS EQU CF_BASE+7 ; read status
0237 CF_COMAND EQU CF_BASE+7 ; write command
0238 *
0239 * Command Equates
0240 *
0241 CMDREAD EQU $20 ; Read Single sector
0242 CMDWRITE EQU $30 ; Write Single sector
0243 CMDFEATURE EQU $EF
0244 FEAT8BIT EQU $01 ; enable 8 bit transfers
0245 HEADLBA EQU $E0
0246 *
0247 * Status bit equates
0248 *
0249 BUSY EQU $80
0250 DRDY EQU $40
0251 DRQ EQU $08
0252 ERR EQU $01
0253 *
0254 ENDIF CFOPT
0254 ENDIF CFOPT
0255 *
0256 IFD RTCOPT
0257 *
0258 **************************************************
0259 * MM58167A REAL TIME CLOCK MEMORY MAP:
0260 **************************************************
0261 *
0262 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0263 *
0264 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0265 *
0266 * COUNTER AND COMPARITOR REGISTERS:
0267 *
0268 * Both the Clock Counter and Clock Comparitor
0269 * consist of 8 registers for holding the time.
0270 * The register offsets from the Counter and
0271 * Comparitor registers are listed above.
0272 *
0273 COUNTR EQU CLOCK+0
0274 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0275 *
0276 * CLOCK REGISTER OFFSETS:
0277 * These register offsets are used for the CLOCK
0278 * and comparitor ram CMPRAM.
0279 *
0280 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0281 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0282 SECOND EQU 2
0283 MINUIT EQU 3
0284 HOUR EQU 4
0285 WKDAY EQU 5
0286 MTHDAY EQU 6
0287 MONTH EQU 7
0288 *
0289 * INTERRUPT OUTPUT REGISTERS:
0290 *
0291 * An interrupt output may be generated at the
0292 * following rates by setting the appropriate bit
0293 * in the Interrupt Control Register (CINTCR).
0294 * The Interrupt Status Register (CINTSR) must be
0295 * read to clear the interrupt and will return
0296 * the source of the interrupt.
0297 *
0298 * 1/Month Bit 7
0299 * 1/Week Bit 6
0300 * 1/Day Bit 5
0301 * 1/Hour Bit 4
0302 * 1/Minuite Bit 3
0303 * 1/Second Bit 2
0304 * 10/Second Bit 1
0305 * Comparitor Bit 0
0306 *
0307 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0308 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0309 *
0310 * COUNTER AND RAM RESETS; GO COMMAND.
0311 *
0312 * The counter and comparitor may be reset
0313 * by writing $FF into CTRRES and CMPRES
0314 * respectivly.
0315 * A write to the Go command register (GOCMND)
0316 * will reset the 1/1000ths, 1/100ths and 1/10ths
0317 * of a second counter.
0318 *
0319 CTRRES EQU CLOCK+18 COUNTER RESET
0320 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0321 GOCMND EQU CLOCK+21 GO COMMAND
0322 *
0323 * CLOCK STATUS REGISTER.
0324 *
0325 * The counter takes 61 usec. to rollover for
0326 * every 1KHz clock pulse. If the Status bit is
0327 * set after reading the counter, the counter
0328 * should be re-read to ensure the time is correct.
0329 *
0330 CLKSTA EQU CLOCK+20 STATUS BIT
0331 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0332 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0333 ENDIF RTCOPT
0333 ENDIF RTCOPT
0334 *
0335 IFD TRAOPT
0336 *
0337 **************************************************
0338 * PIA INTERRUPT TIMER
0339 **************************************************
0340 *
0341 ** PIA INTERRUPT TIMER SITS ON PORT 7
0342 *
0343 ** PIA TIMER FOR SINGLE STEP / TRACE
0344 *
0345 * TADATA = Output = Timer preset register
0346 * TACTRL - CA1 = input = rising edge = NMI
0347 * - CA2 = Output = Timer Reset (Active High)
0348 * TBDATA = Input = Timer read back register
0349 * TBCTRL - CB1 = input = rising edge = FIRQ
0350 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0351 *
0352 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0353 * CRA1 = 1 CA1 Rising edge IRQ
0354 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0355 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0356 * CRA4 = 1 ] CA2 = Set/Reset output
0357 * CRA5 = 1 ]
0358 * CRA6 = X CA2 Input Interrupt Flag
0359 * CRA7 = X CA1 Interrupt Flag
0360 *
0361 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0362 * CRB1 = 1 CB1 Rising edge IRQ
0363 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0364 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0365 * CRB4 = 1 ] CB2 = Set/Reset output
0366 * CRB5 = 1 ]
0367 * CRB6 = X CB2 Input Interrupt Flag
0368 * CRB7 = X CB1 Interrupt Flag
0369 *
0370 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0371 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0372 *
0373 E070 TADATA EQU MONIO+$70 Timer preset port
0374 E071 TACTRL EQU MONIO+$71
0375 E072 TBDATA EQU MONIO+$72 Timer read back port
0376 E073 TBCTRL EQU MONIO+$73
0377 *
0378 000D TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0379 *
0380 ENDIF TRAOPT
0381 IFD ADSOPT
0382 *
0383 ***************************************************
0384 * SERIAL PORT FOR DG640 *
0385 ***************************************************
0386 *
0387 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0388 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0389 *
0390 ACIAS EQU MONIO+$400 CONTROL PORT
0391 *
0392 ENDIF ADSOPT
0392 ENDIF ADSOPT
0393 IFD PRTOPT
0394 *
0395 ***************************************************
0396 * PRINTER INTERFACE *
0397 ***************************************************
0398 *
0399 PADATA EQU MONIO+$404
0400 PACTRL EQU MONIO+$405
0401 PBDATA EQU MONIO+$406
0402 PBCTRL EQU MONIO+$407
0403 *
0404 ** CB1 ACK. I/P
0405 ** CB2 STB. O/P
0406 ** PB0 - PB7 DATA 1 - 8 O/P
0407 ** PORT A BIT ASSIGNMENT
0408 *
0409 PBUSY EQU $80 I/P
0410 PEMPTY EQU $40 I/P
0411 SELECT EQU $20 I/P
0412 PERROR EQU $10 I/P
0413 PRESET EQU %00000100 O/P PA3 = 0
0414 AUTOFD EQU %00001000 O/P PA2 = 0
0415 DIRMSK EQU %00001100
0416 ENDIF PRTOPT
0416 ENDIF PRTOPT
0417 IFD DG640OPT
0418 *
0419 ***************************************************
0420 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0421 ***************************************************
0422 *
0423 ** VIDEO DISPLAY DEFINITIONS
0424 *
0425 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0426 LINLEN EQU 64 LENGTH OF A LINE
0427 NUMLIN EQU 16 NUMBER OF LINES
0428 SCNLEN EQU $400 LENGTH OF SCREEN
0429 *
0430 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0431 COLADX RMB 1 CURSOR COLUMN
0432 ROWADX RMB 1 CURSOR ROW
0433 *************************************************
0434 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0435 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0436 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0437 ENDIF DG640OPT
0437 ENDIF DG640OPT
0438 *
0439 IFD DMAFOPT
0440 *
0441 ***************************************************
0442 * DMAF2 8" DRIVE *
0443 ***************************************************
0444 *
0445 ADDREG EQU $F000 ADDRESS REGISTER
0446 CNTREG EQU $F002 COUNT REGISTER
0447 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0448 PRIREG EQU $F014 DMA PRIORITY REGISTER
0449 AAAREG EQU $F015 ???
0450 BBBREG EQU $F016 ???
0451 COMREG EQU $F020 1791 COMMAND REGISTER
0452 SECREG EQU $F022 SECTOR REGISTER
0453 DRVREG EQU $F024 DRIVE SELECT LATCH
0454 CCCREG EQU $F040 ???
0455 ENDIF DMAFOPT
0455 ENDIF DMAFOPT
0456 IFD DATOPT
0457 **************************************************
0458 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0459 **************************************************
0460 *
0461 IC11 EQU $FFF0 DAT RAM CHIP
0462 TSTPAT EQU $55AA TEST PATTERN
0463 ENDIF DATOPT
0463 ENDIF DATOPT
0464 *
0465 ***************************************************
0466 * START OF ROM *
0467 ***************************************************
0468 *
0469 F800 ORG MONROM
0470 F800 F8 14 FDB MONITOR
0471 F802 F8 4B FDB NEXTCMD
0472 F804 FC 94 FDB INCH
0473 F806 FC 8E FDB INCHE
0474 F808 FC AC FDB INCHEK
0475 F80A FC C1 FDB OUTCH
0476 F80C FB 82 FDB PDATA
0477 F80E FB 11 FDB PCRLF
0478 F810 FB 0D FDB PSTRNG
0479 F812 FE E8 FDB LRA
0480 *
0481 IFD ADSOPT
0482 FDB PCHK CHECK FOR PRINTER INPUT
0483 FDB PINIZ INITIATE PRINTER
0484 FDB POUTCH OUTPUT CH. TO PRINTER
0485 FDB VINIZ
0486 FDB VOUTCH
0487 FDB ACINIZ
0488 FDB AOUTCH
0489 ENDIF ADSOPT
0489 ENDIF ADSOPT
0490 *
0491 * MONITOR
0492 *
0493 * VECTOR ADDRESS STRING IS.....
0494 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0495 *
0496 F814 8E FE 67 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0497 F817 10 8E 7F C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0498 F81B C6 10 LDB #$10 BYTES TO MOVE = 16
0499 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0500 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0501 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0502 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0503 *
0504 * CONTENTS FROM TO FUNCTION
0505 * $F8A1 $FE40 $DFC0 USER-V
0506 * $F8A1 $FE42 $DFC2 SWI3-V
0507 * $F8A1 $FE44 $DFC4 SWI2-V
0508 * $F8A1 $FE46 $DFC6 FIRQ-V
0509 * $F8A1 $FE48 $DFC8 IRQ-V
0510 * $FAB0 $FE4A $DFCA SWI-V
0511 * $FFFF $FE4C $DFCC SVC-VO
0512 * $FFFF $FE4E $DFCE SVC-VL
0513 *
0514 F824 8E E0 00 LDX #ACIAS
0515 F827 BF 7F D0 STX CPORT STORE ADDR. IN RAM
0516 F82A 17 01 45 LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0517 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0518 F82F 6F E2 CLRSTK CLR ,-S
0519 F831 5A DECB
0520 F832 26 FB BNE CLRSTK
0521 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0522 F837 AF 6A STX 10,S ON STACK
0523 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0524 F83B A7 E4 STA ,S
0525 F83D 1F 43 TFR S,U
0526 F83F 17 04 92 LBSR IOINIZ INITIALIZE CONTROL PORT
0527 F842 8E FE 77 LDX #MSG1 POINT TO MONITOR MESSAGE
0528 F845 17 03 3A LBSR PDATA PRINT MSG
0529 *
0530 IFD DATOPT
0531 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0532 CLRA START TOTAL AT ZERO
0533 LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0534 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0535 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0536 ADDA #4 ELSE ADD 4K TO TOTAL
0537 DAA ADJ. TOTAL FOR DECIMAL
0538 RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0539 BPL FNDREL PRINT TOTAL OF RAM
0540 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0541 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0542 LBSR PDATA PRINT MSG
0543 ENDIF DATOPT
0543 ENDIF DATOPT
0544 *
0545 IFD TRAOPT
0546 F848 17 01 DE LBSR TRAINZ
0547 ENDIF TRAOPT
0548 *
0549 ***** NEXTCMD *****
0550 *
0551 F84B 8E FE 9C NEXTCMD LDX #MSG3 POINT TO MSG ">"
0552 F84E 17 02 BC LBSR PSTRNG PRINT MSG
0553 F851 17 04 40 LBSR INCH GET ONE CHAR. FROM TERMINAL
0554 F854 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0555 F856 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0556 F858 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0557 F85A 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0558 F85C 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0559 F85E 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0560 F860 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0561 F862 17 04 5C LBSR OUTCH PRINT "^"
0562 F865 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0563 F867 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0564 F869 17 04 55 PRTCMD LBSR OUTCH PRNT CMD CHAR
0565 F86C 17 04 50 LBSR OUT1S PRNT SPACE
0566 F86F C1 60 CMPB #$60
0567 F871 2F 02 BLE NXTCH0
0568 F873 C0 20 SUBB #$20
0569 *
0570 ***** DO TABLE LOOKUP *****
0571 * FOR COMMAND FUNCTIONS
0572 *
0573 F875 8E FE 2E NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0574 F878 E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0575 F87A 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0576 F87C 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0577 F87E 8C FE 67 CMPX #TABEND REACHED END OF TABLE YET ?
0578 F881 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0579 F883 8E FE 9E LDX #MSG4 POINT TO MSG "WHAT?"
0580 F886 17 02 F9 LBSR PDATA PRINT MSG
0581 F889 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0582 F88B AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0583 F88D 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0584 *
0585 * "G" GO OR CONTINUE
0586 *
0587 F88F 1F 34 GO TFR U,S
0588 F891 3B RTI RTI
0589 *
0590 ***** "M" MEMORY EXAMINE AND CHANGE *****
0591 *
0592 F892 17 03 74 MEMCHG LBSR IN1ADR INPUT ADDRESS
0593 F895 29 2D BVS CHRTN IF NOT HEX, RETURN
0594 F897 1F 12 TFR X,Y SAVE ADDR IN "Y"
0595 F899 8E FE A4 MEMC2 LDX #MSG5 POINT TO MSG " - "
0596 F89C 17 02 6E LBSR PSTRNG PRINT MSG
0597 F89F 1F 21 TFR Y,X FETCH ADDRESS
0598 F8A1 17 03 AE LBSR OUT4H PRINT ADDR IN HEX
0599 F8A4 17 04 18 LBSR OUT1S OUTPUT SPACE
0600 F8A7 A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0601 F8A9 17 03 AE LBSR OUT2H OUTPUT CONTENTS IN ASCII
0602 F8AC 17 04 10 LBSR OUT1S OUTPUT SPACE
0603 F8AF 17 03 67 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0604 F8B2 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0605 F8B4 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0606 F8B6 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0607 F8B8 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0608 F8BA 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0609 F8BC 81 5E CMPA #'^ IS IT AN UP ARROW?
0610 F8BE 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0611 F8C0 81 0D CMPA #$D IS IT A CR?
0612 F8C2 26 0F BNE FORWRD DISPLAY NEXT BYTE
0613 F8C4 39 CHRTN RTS EXIT ROUTINE
0614 *
0615 *
0616 F8C5 A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0617 F8C7 A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0618 F8C9 27 08 BEQ FORWRD $F972
0619 F8CB 17 03 F1 LBSR OUT1S OUTPUT SPACE
0620 F8CE 86 3F LDA #'? LOAD QUESTION MARK
0621 F8D0 17 03 EE LBSR OUTCH PRINT IT
0622 F8D3 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0623 F8D5 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0624 F8D7 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0625 F8D9 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0626 *
0627 * "S" DISPLAY STACK
0628 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0629 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0630 *
0631 F8DB 17 02 AB DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0632 F8DE 1F 32 TFR U,Y
0633 F8E0 8E 7F C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0634 F8E3 30 1F LEAX -1,X POINT TO CURRENT STACK
0635 F8E5 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0636 *
0637 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0638 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0639 * UPPER ADDRESS IN X-REG.
0640 * IF HEX ADDRESSES ARE INVALID (V)=1.
0641 *
0642 F8E7 17 03 14 MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0643 F8EA 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0644 F8EC 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0645 F8EE AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0646 F8F0 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0647 F8F2 39 EDPRTN RTS ;
0648 *
0649 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0650 * TO EVEN 16 BYTE BOUNDRIES.
0651 *
0652 * IF LOWER ADDR = $4532
0653 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0654 *
0655 * IF UPPER ADDR = $4567
0656 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0657 *
0658 * ENTER WITH LOWER ADDRESS IN X-REG.
0659 * -UPPER ADDRESS ON TOP OF STACK.
0660 *
0661 F8F3 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0662 F8F5 C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0663 F8F8 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0664 F8FA 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0665 F8FC 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0666 F8FE C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0667 F900 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0668 F902 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0669 F904 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0670 F906 17 03 A3 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0671 F909 27 03 BEQ EDUMP
0672 F90B 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0673 F90D 39 RTS ;
0674 *
0675 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0676 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0677 *
0678 F90E 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0679 F910 8E FE A4 LDX #MSG5 POINT TO MSG " - "
0680 F913 17 01 F7 LBSR PSTRNG PRINT MSG
0681 F916 AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0682 F918 17 03 37 LBSR OUT4H PRINT THE ADDRESS
0683 F91B 17 03 9F LBSR OUT2S 2 SPACES
0684 F91E C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0685 F920 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0686 F922 17 03 35 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0687 F925 17 03 97 LBSR OUT1S OUTPUT SPACE
0688 F928 5A DECB $F9D1 DECREMENT BYTE COUNT
0689 F929 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0690 *
0691 * PRINT 16 ASCII CHARACTERS
0692 * IF NOT PRINTABLE OR NOT VALID
0693 * ASCII PRINT A PERIOD (.)
0694 F92B 17 03 8F LBSR OUT2S 2 SPACES
0695 F92E AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0696 F930 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0697 F932 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0698 F934 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0699 F936 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0700 F938 81 7E CMPA #$7E IS IT VALID ASCII?
0701 F93A 23 02 BLS PRASC IF SO PRINT IT
0702 F93C 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0703 F93E 17 03 80 PRASC LBSR OUTCH PRINT ASCII CHARACTER
0704 F941 5A DECB DECREMENT COUNT
0705 F942 26 EE BNE EDPASC
0706 F944 20 BC BRA NXTLIN
0707 *
0708 ***** "B" SET BREAKPOINT *****
0709 *
0710 F946 17 02 C0 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0711 F949 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0712 F94B 8C 7F C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0713 F94E 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0714 F950 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0715 F952 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0716 F955 8D 5B BSR BPTEST TEST BP TABLE FOR FREE SPACE
0717 F957 35 10 PULS X POP BP ADDRESS FROM STACK
0718 F959 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0719 F95B A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0720 F95D 81 3F CMPA #$3F IS IT A SWI?
0721 F95F 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0722 F961 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0723 F963 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0724 F965 86 3F LDA #$3F LOAD A SWI ($3F)
0725 F967 A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0726 F969 39 EXITBP RTS ;
0727 *
0728 * INDICATE ERROR SETTING BREAKPOINT
0729 *
0730 F96A 17 03 52 BPERR LBSR OUT1S OUTPUT SPACE
0731 F96D 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0732 F96F 16 03 4F LBRA OUTCH PRINT "?"
0733 *
0734 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0735 *
0736 F972 10 8E 7F D3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0737 F976 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0738 F978 8D 1E XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0739 F97A 5A DECB $FAAC DECREMENT BP COUNTER
0740 F97B 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0741 F97D 39 RTS
0742 *
0743 ***** SWI ENTRY POINT *****
0744 *
0745 F97E 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0746 F980 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0747 F982 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0748 F984 8D 2C BSR BPTEST FIND BREAKPOINT IN BP TABLE
0749 F986 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0750 F988 AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0751 F98A 8D 0C BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0752 F98C 17 02 51 REGPR LBSR REGSTR GO PRINT REGISTERS
0753 *
0754 IFD TRAOPT
0755 F98F 8E 00 00 LDX #0
0756 F992 BF 7F ED STX TRACNT
0757 ENDIF TRAOPT
0758 *
0759 F995 16 FE B3 LBRA NEXTCMD GET NEXT COMMAND
0760 *
0761 F998 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0762 F99A 8C 7F C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0763 F99D 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0764 F99F A6 84 LDA ,X GET DATA FROM BP ADDRESS
0765 F9A1 81 3F CMPA #$3F IS IT SWI?
0766 F9A3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0767 F9A5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0768 F9A7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0769 F9A9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0770 F9AB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0771 F9AD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0772 F9AF A7 A0 STA ,Y+
0773 F9B1 39 RTS
0774 *
0775 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0776 *
0777 F9B2 10 8E 7F D3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0778 F9B6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0779 F9B8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0780 F9BA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0781 F9BC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0782 F9BE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0783 F9BF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0784 F9C1 39 RTS ;
0785 *
0786 *
0787 F9C2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0788 F9C4 39 RTS
0789 *
0790 IFD TRAOPT
0791 *
0792 ** TRACE from address AAAA BB bytes
0793 *
0794 F9C5 17 01 5F TRACE LBSR ALTPC1 SET UP NEW PC
0795 F9C8 29 1C BVS TREXIT ADDRESS ERROR, EXIT
0796 F9CA 17 02 F2 LBSR OUT1S
0797 F9CD 17 02 39 LBSR IN1ADR Fetch Byte Count
0798 F9D0 29 14 BVS TREXIT Byte Count error, EXIT
0799 F9D2 BF 7F ED STX TRACNT
0800 *
0801 F9D5 BE 7F C0 LDX NMI Save NMI Vector
0802 F9D8 BF 7F EB STX NMISAV
0803 F9DB 8E F9 E7 LDX #NMIE Set up NMI for Tracing
0804 F9DE BF 7F C0 STX NMI
0805 F9E1 17 00 45 LBSR TRAINZ Initialise Hardware
0806 F9E4 20 20 BRA TRACEG Start Trace
0807 F9E6 39 TREXIT RTS
0808 *
0809 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0810 * CRA1 = 1 CA1 Rising edge IRQ
0811 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0812 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0813 * CRA4 = 1 ] CA2 = Set/Reset output
0814 * CRA5 = 1 ]
0815 * CRA6 = X CA2 Input Interrupt Flag
0816 * CRA7 = X CA1 Interrupt Flag
0817 *
0818 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0819 * CRB1 = 1 CB1 Rising edge IRQ
0820 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0821 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0822 * CRB4 = 1 ] CB2 = Set/Reset output
0823 * CRB5 = 1 ]
0824 * CRB6 = X CB2 Input Interrupt Flag
0825 * CRB7 = X CB1 Interrupt Flag
0826 *
0827 *
0828 ** TRACE NMI ENTRY POINT
0829 *
0830 F9E7 1F 43 NMIE TFR S,U
0831 F9E9 86 36 LDA #$36 Disable Interrupt, CA2 Low
0832 F9EB B7 E0 71 STA TACTRL
0833 F9EE B6 E0 70 LDA TADATA Clear Interrupt flag by reading data port
0834 *
0835 F9F1 17 01 EC LBSR REGSTR DUMP REGISTERS
0836 *
0837 F9F4 AE 4A LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0838 F9F6 A6 84 LDA ,X
0839 F9F8 81 3F CMPA #$3F
0840 F9FA 27 24 BEQ TRACEX EXIT ON SWI
0841 *
0842 F9FC BE 7F ED LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0843 F9FF 27 1F BEQ TRACEX YES, GO BACK TO THE MONITOR
0844 FA01 30 1F LEAX -1,X DECREMENT TRACE COUNT
0845 FA03 BF 7F ED STX TRACNT
0846 *
0847 ** TRACE GO (RESUME SINGLE STEP)
0848 *
0849 FA06 1F 34 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0850 FA08 86 0D LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0851 FA0A B7 E0 70 STA TADATA
0852 FA0D 86 36 LDA #$36 LOAD STROBE LOW
0853 FA0F B7 E0 71 STA TACTRL
0854 FA12 B6 E0 70 LDA TADATA CLEAR INTERRUPT
0855 FA15 86 36 LDA #$36 RELEASE RESET
0856 FA17 B7 E0 73 STA TBCTRL
0857 FA1A 86 3F LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0858 FA1C B7 E0 71 STA TACTRL
0859 FA1F 3B RTI GO EXECUTE INSTRUCTION
0860 *
0861 FA20 BE 7F EB TRACEX LDX NMISAV Restore NMI vector
0862 FA23 BF 7F C0 STX NMI
0863 FA26 16 FE 22 LBRA NEXTCMD Jump back to the command loop.
0864 *
0865 ** TRACE HARDWARE INITIALISATION
0866 *
0867 FA29 86 32 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0868 FA2B B7 E0 71 STA TACTRL
0869 FA2E 86 3A LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0870 FA30 B7 E0 73 STA TBCTRL
0871 FA33 86 FF LDA #$FF PORTA = OUTPUT
0872 FA35 B7 E0 70 STA TADATA
0873 FA38 86 00 LDA #$00 PORTB = INPUT
0874 FA3A B7 E0 72 STA TBDATA
0875 FA3D 86 36 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0876 FA3F B7 E0 71 STA TACTRL
0877 FA42 86 3E LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0878 FA44 B7 E0 73 STA TBCTRL
0879 FA47 39 RTS
0880 *
0881 ENDIF TRAOPT
0882 IFD MFDCOPT
0883 *
0884 ** "U" MINI DISK BOOT
0885 *
0886 MINBOOT TST CMDFDC
0887 CLR DRVFDC
0888 LDX #$0000
0889 LOOP LEAX $01,X
0890 CMPX #$0000
0891 BNE LOOP
0892 LDA #$0F
0893 STA CMDFDC
0894 BSR DELAY
0895 LOOP1 LDB CMDFDC
0896 BITB #$01
0897 BNE LOOP1
0898 LDA #$01
0899 STA SECFDC
0900 BSR DELAY
0901 LDA #$8C
0902 STA CMDFDC
0903 BSR DELAY
0904 LDX #$C000
0905 BRA LOOP3
0906 LOOP2 BITB #$02
0907 BEQ LOOP3
0908 LDA DATFDC
0909 STA ,X+
0910 LOOP3 LDB CMDFDC
0911 BITB #$01
0912 BNE LOOP2
0913 BITB #$2C
0914 BEQ LOOP4
0915 RTS
0916 *
0917 LOOP4 LDX #$C000
0918 STX $0A,U
0919 TFR U,S
0920 RTI
0921 *
0922 DELAY LDB #$04
0923 LOOP5 DECB
0924 BNE LOOP5
0925 RTS
0926 ENDIF MFDCOPT
0926 ENDIF MFDCOPT
0927 *
0928 IFD DMAFOPT
0929 *
0930 *** "D" DISK BOOT FOR DMAF2 ***
0931 *
0932 DBOOT LDA #$DE
0933 STA DRVREG
0934 LDA #$FF
0935 STA PRIREG $FAF8
0936 STA CCREG
0937 STA AAAREG
0938 STA BBBREG
0939 TST CCREG
0940 LDA #$D8
0941 STA COMREG
0942 LBSR DLY
0943 DBOOT0 LDA COMREG
0944 BMI DBOOT0
0945 LDA #$09
0946 STA COMREG
0947 LBSR DLY
0948 *
0949 DISKWT LDA COMREG FETCH DRIVE STATUS
0950 BITA #1 TEST BUSY BIT
0951 BNE DISKWT LOOP UNTIL NOT BUSY
0952 *
0953 BITA #$10
0954 BNE DBOOT
0955 *
0956 LDX #$C000 LOGICAL ADDR. = $C000
0957 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0958 ORA #$10
0959 STA CCCREG
0960 TFR X,D
0961 COMA ;
0962 COMB ;
0963 STD ADDREG
0964 LDX #$FEFF LOAD DMA BYTE COUNT = $100
0965 STX CNTREG STORE IN COUNT REGISTER
0966 LDA #$FF LOAD THE CHANNEL REGISTER
0967 STA CCREG
0968 LDA #$FE SET CHANNEL 0
0969 STA PRIREG
0970 LDA #1 SET SECTOR TO "1"
0971 STA SECREG ISSUE COMMAND
0972 LDA #$8C SET SINGLE SECTOR READ
0973 STA COMREG ISSUE COMMAND
0974 BSR DLY
0975 *
0976 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0977 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0978 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0979 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0980 * IS STILL A ONE THE BOOT OPERATION WILL
0981 * BE STARTED OVER FROM THE BEGINING.
0982 *
0983 CLRB ;
0984 DBOOT1 PSHS B $FB55
0985 CLRB ;
0986 DBOOT2 TST CCREG
0987 BPL DBOOT3
0988 DECB ;
0989 BNE DBOOT2
0990 PULS B
0991 DECB
0992 BNE DBOOT1
0993 BRA DBOOT
0994 DBOOT3 PULS B
0995 LDA COMREG
0996 BITA #$1C
0997 BEQ DBOOT4
0998 RTS ;
0999 *
1000 *
1001 DBOOT4 LDB #$DE
1002 STB DRVREG
1003 LDX #$C000
1004 STX 10,U
1005 TFR U,S $FB7B
1006 RTI ;
1007 ENDIF DMAFOPT
1007 ENDIF DMAFOPT
1008 *
1009 IFD CFOPT
1010 *
1011 * COMPACT FLASH BOOT
1012 *
1013 CFBOOT BSR WAITRDY
1014 LDA #HEADLBA
1015 STA CF_HEAD
1016 BSR WAITRDY
1017 LDA #FEAT8BIT
1018 STA CF_FEATURE
1019 LDA #CMDFEATURE
1020 STA CF_COMAND
1021 BSR WAITRDY
1022 *
1023 * READ SECTORS FROM CF
1024 *
1025 CFREAD LDA #$01
1026 STA CF_SECCNT
1027 CLRA
1028 STA CF_SECNUM
1029 STA CF_CYLLO
1030 STA CF_CYLHI
1031 *
1032 LDA #CMDREAD ; IDE READ MULTIPLE
1033 STA CF_COMAND
1034 BSR WAITRDY
1035 LDX #$C000
1036 *
1037 * READ LOOP
1038 *
1039 RDLOOP BSR WAITDRQ
1040 LDA CF_DATA
1041 STA ,X+
1042 CMPX #$C200
1043 BNE RDLOOP
1044 *
1045 LDX #$C000
1046 STX $0A,U
1047 TFR U,S
1048 RTI
1049 *
1050 * WAIT UNTIL READY
1051 *
1052 WAITRDY LDA CF_STATUS
1053 BITA #BUSY
1054 BNE WAITRDY
1055 LDA CF_STATUS
1056 BITA #DRDY
1057 BEQ WAITRDY
1058 RTS
1059 *
1060 * WAIT FOR DATA REQUEST
1061 *
1062 WAITDRQ LDA CF_STATUS
1063 BITA #DRQ
1064 BEQ WAITDRQ
1065 RTS
1066 ENDIF CFOPT
1066 ENDIF CFOPT
1067 *
1068 IFD RTCOPT
1069 *
1070 * CLOCK INTER FACE UTILITY
1071 *
1072 * TIME <Hours> <Minuits> <Seconds>
1073 * If no argument is specified, the current time
1074 * will be displayed.
1075 *
1076 * READ A REGISTER FROM THE COUNTER.
1077 * The X Index rgister points to the register
1078 * to be read. The Status Register is checked
1079 * before and after the register is read before
1080 * returning a value in accumulator A
1081 *
1082 RDCLK TST CLKSTA
1083 BNE RDCLK
1084 RDCLK1 LDA 0,X
1085 TST CLKSTA
1086 BNE RDCLK1
1087 RTS
1088 *
1089 * MAIN PROGRAM:
1090 *
1091 TIMSET LDX #COUNTR POINT TO TIMER
1092 LBSR BYTE READ HOURS
1093 BVS SHOWTM NO ARG, DISP TIME
1094 STA HOUR,X
1095 LBSR OUT1S
1096 LBSR BYTE READ MINUITES
1097 BVS SHOWTM
1098 STA MINUIT,X
1099 LBSR OUT1S
1100 LBSR BYTE SECONDS.
1101 BVS SHOWTM
1102 STA SECOND,X
1103 *
1104 * DISPLAY CURRENT TIME
1105 *
1106 SHOWTM LBSR PCRLF
1107 LDX #COUNTR+HOUR
1108 LDB #3
1109 SHOWLP BSR RDCLK
1110 LBSR OUT2H
1111 LDA #':
1112 LBSR OUTCH
1113 LEAX -1,X
1114 DECB
1115 BNE SHOWLP
1116 RTS
1117 *
1118 * INITIATE CLOCK.
1119 * MASK INTERRUPTS.
1120 *
1121 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
1122 TST CINTSR CLEAR ANY INTERRUPTS
1123 RTS
1124 ENDIF RTCOPT
1124 ENDIF RTCOPT
1125 IFD DATOPT
1126 *
1127 ***** LRA LOAD REAL ADDRESS *****
1128 *
1129 * THE FOLLOWING CODE LOADS THE 20-BIT
1130 * PHYSICAL ADDRESS OF A MEMORY BYTE
1131 * INTO THE "A" AND "X" REGISTERS. THIS
1132 * ROUTINE IS ENTERED WITH THE LOGICAL
1133 * ADDRESS OF A MEMORY BYTE IN THE "IX"
1134 * REGISTER. EXIT IS MADE WITH THE HIGH-
1135 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
1136 * ADDRESS IN THE "A" REGISTER, AND THE
1137 * LOW-ORDER 16-BITS OF THE 20-BIT
1138 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
1139 * ALL OTHER REGISTERS ARE PRESERVED.
1140 * THIS ROUTINE IS REQUIRED SINCE THE
1141 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
1142 * PRESENT PHYSICAL ADDRESSES ON THE
1143 * SYSTEM BUS.
1144 *
1145 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
1146 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
1147 LSRA ;
1148 LSRA ADJ FOR INDEXED INTO
1149 LSRA CORRESPONDING LOCATION
1150 LSRA IN LRA TABLE
1151 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
1152 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
1153 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
1154 LSRB PHYSICAL ADDRESS.
1155 LSRB EXTENDED MS 4-BITS ARE RETURNED
1156 LSRB IN THE "A" ACCUMULATOR
1157 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
1158 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
1159 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
1160 ASLB ADJ DATA FOR RELOCATION IN X REG
1161 ASLB ;
1162 ASLB $FB97
1163 ASLB ;
1164 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
1165 ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
1166 STA 2,S SAVE IT IN X REG ON STACK
1167 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
1168 *
1169 * PLUS LS NIBBLE OF LOGICAL ADDRESS
1170 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
1171 * ON STACK
1172 PULS A,B,X,Y,PC POP REGS. FROM STACK
1173 ENDIF DATOPT
1173 ENDIF DATOPT
1174 *
1175 * DELAY LOOP
1176 *
1177 FA48 34 04 DLY PSHS B SAVE CONTENTS OF "B"
1178 FA4A C6 20 LDB #$20 GET LOOP DELAY VALUE
1179 FA4C 5A SUB1 DECB SUBTRACT ONE FROM VALUE
1180 FA4D 26 FD BNE SUB1 LOOP UNTIL ZERO
1181 FA4F 35 84 PULS B,PC RESTORE CONTENTS OF "B"
1182 * RTS ;
1183 *
1184 ***** "L" LOAD MIKBUG TAPE *****
1185 *
1186 FA51 BD FC D6 LOAD JSR ACINIZ
1187 FA54 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
1188 FA56 17 02 68 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
1189 FA59 7F 7F D2 CLR ECHO TURN OFF ECHO FLAG
1190 FA5C 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
1191 FA5F 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
1192 FA61 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
1193 FA63 17 02 23 LBSR ECHON
1194 FA66 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
1195 FA68 27 3D BEQ LOAD21 IF SO, EXIT LOAD
1196 FA6A 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
1197 FA6C 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
1198 FA6E 17 01 A8 LBSR BYTE INPUT BYTE COUNT
1199 FA71 34 02 PSHS A PUSH COUNT ON STACK
1200 FA73 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
1201 FA75 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
1202 FA78 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
1203 FA7A 34 10 PSHS X PUSH ADDR ON STACK
1204 FA7C E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
1205 FA7E EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
1206 FA80 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
1207 FA82 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
1208 FA84 6A E4 DEC ,S ADDRESS BYTES.
1209 FA86 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
1210 FA88 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
1211 FA8B 35 04 PULS B POP CHECKSUM FROM STACK
1212 FA8D 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
1213 FA8F 34 02 PSHS A PUSH DATA BYTE ON STACK
1214 FA91 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
1215 FA93 6A E4 DEC ,S DECREMENT BYTE COUNT 1
1216 FA95 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
1217 FA97 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
1218 FA99 20 EB BRA LOAD10 GET NEXT DATA BYTE
1219 FA9B 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
1220 FA9C 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
1221 FA9E C1 FF CMPB #$FF CHECKSUM OK?
1222 FAA0 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
1223 FAA2 86 3F LDA #'? LOAD (?) ERROR INDICATOR
1224 FAA4 17 02 1A LBSR OUTCH OUTPUT IT TO TERMINAL
1225 FAA7 73 7F D2 LOAD21 COM ECHO TURN ECHO ON
1226 FAAA 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
1227 FAAC 16 02 12 LBRA OUTCH OUTPUT IT
1228 *
1229 ***** "P" PUNCH MIKBUG TAPE *****
1230 *
1231 FAAF 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
1232 FAB1 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
1233 FAB4 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
1234 FAB6 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
1235 FAB8 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
1236 FABA 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
1237 FABC 30 01 LEAX 1,X INCREMENT END ADDRESS
1238 FABE AF E4 STX ,S STORE END ADDR ON STACK
1239 FAC0 BD FC D6 JSR ACINIZ
1240 FAC3 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
1241 FAC5 17 01 F9 LBSR OUTCH OUTPUT IT TO TERMINAL
1242 FAC8 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
1243 FACA A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
1244 FACC 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
1245 FACE 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
1246 FAD2 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
1247 FAD4 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
1248 FAD6 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
1249 FAD8 8E FE E5 LDX #MSG20 POINT TO MSG "S1"
1250 FADB 17 00 2F LBSR PSTRNG PRINT MSG
1251 FADE CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
1252 FAE0 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
1253 FAE2 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
1254 FAE5 AE 62 LDX 2,S LOAD BEGIN ADDRESS
1255 FAE7 17 01 68 LBSR OUT4H PUNCH ADDRESS
1256 FAEA EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
1257 FAEC EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
1258 FAEE EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
1259 FAF0 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
1260 FAF2 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
1261 FAF5 6A 64 DEC 4,S DECREMENT BYTE COUNT
1262 FAF7 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
1263 FAF9 53 COMB 1's COMPLIMENT CHECKSUM BYTE
1264 FAFA 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
1265 FAFC 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
1266 FAFF AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
1267 FB01 AC E4 CMPX ,S COMPARE IT TO END ADDR
1268 FB03 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
1269 FB05 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
1270 FB07 17 01 B7 LBSR OUTCH OUTPUT IT
1271 FB0A 32 65 LEAS 5,S READJUST STACK POINTER
1272 FB0C 39 RTS ;
1273 *
1274 * PRINT STRING PRECEEDED BY A CR & LF.
1275 *
1276 FB0D 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1277 FB0F 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1278 *
1279 * PCRLF
1280 *
1281 FB11 34 10 PCRLF PSHS X SAVE IX
1282 FB13 8E FE 96 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1283 FB16 17 00 69 LBSR PDATA PRINT MSG
1284 FB19 35 90 PULS X,PC RESTORE IX & RETURN
1285 *
1286 * LONG BRANCHES TO COMMON ROUTINES
1287 *
1288 FB1B 16 01 A1 JOUT1S LBRA OUT1S
1289 FB1E 16 00 F8 JBYTE LBRA BYTE
1290 FB21 16 00 E5 JIN1ADR LBRA IN1ADR
1291 *
1292 * ALTER "PC" PROGRAM COUNTER
1293 *
1294 FB24 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1295 FB27 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1296 FB29 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1297 FB2B 29 02 BVS ALTPCD EXIT IF INVALID HEX
1298 FB2D AF 4A STX 10,U POKE IN NEW CONTENTS
1299 FB2F 39 ALTPCD RTS ;
1300 *
1301 * ALTER "U" USER STACK POINTER
1302 *
1303 FB30 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1304 FB32 8D E7 BSR JOUT1S OUTPUT SPACE
1305 FB34 8D EB BSR JIN1ADR
1306 FB36 29 02 BVS ALTUD
1307 FB38 AF 48 STX 8,U
1308 FB3A 39 ALTUD RTS ;
1309 *
1310 * ALTER "Y" INDEX REGISTER
1311 *
1312 FB3B 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1313 FB3D 8D DC BSR JOUT1S OUTPUT SPACE
1314 FB3F 8D E0 BSR JIN1ADR
1315 FB41 29 02 BVS ALTYD
1316 FB43 AF 46 STX 6,U $F8F0
1317 FB45 39 ALTYD RTS ;
1318 *
1319 * ALTER "X" INDEX REGISTER
1320 *
1321 FB46 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1322 FB48 8D D1 BSR JOUT1S OUTPUT SPACE
1323 FB4A 8D D5 BSR JIN1ADR
1324 FB4C 29 02 BVS ALTXD
1325 FB4E AF 44 STX 4,U
1326 FB50 39 ALTXD RTS ;
1327 *
1328 * ALTER "DP" DIRECT PAGE REGISTER
1329 *
1330 FB51 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1331 FB53 8D C6 BSR JOUT1S OUTPUT SPACE
1332 FB55 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1333 FB57 29 02 BVS ALTDPD
1334 FB59 A7 43 STA 3,U
1335 FB5B 39 ALTDPD RTS ;
1336 *
1337 * ALTER "B" ACCUMULATOR
1338 *
1339 FB5C 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1340 FB5E 8D BB BSR JOUT1S OUTPUT SPACE
1341 FB60 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1342 FB62 29 02 BVS ALTBD
1343 FB64 A7 42 STA 2,U
1344 FB66 39 ALTBD RTS $F91C
1345 *
1346 * ALTER "A" ACCUMULATOR
1347 *
1348 FB67 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1349 FB69 8D B0 BSR JOUT1S OUTPUT SPACE
1350 FB6B 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1351 FB6D 29 02 BVS ALTAD
1352 FB6F A7 41 STA 1,U
1353 FB71 39 ALTAD RTS ;
1354 *
1355 * ALTER "CC" REGISTER
1356 *
1357 FB72 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1358 FB74 8D A5 BSR JOUT1S OUTPUT SPACE
1359 FB76 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1360 FB78 29 04 BVS ALTCCD
1361 FB7A 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1362 FB7C A7 C4 STA ,U
1363 FB7E 39 ALTCCD RTS ;
1364 *
1365 * PDATA
1366 *
1367 FB7F 17 01 3F PRINT LBSR OUTCH
1368 FB82 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1369 FB84 81 04 CMPA #4 IS IT EOT?
1370 FB86 26 F7 BNE PRINT IF NOT EOT PRINT IT
1371 FB88 39 RTS ;
1372 *
1373 * PRINT REGISTERS
1374 *
1375 FB89 8E FE A8 PRTSP LDX #MSG10 POINT TO MSG "SP="
1376 FB8C 8D F4 BSR PDATA PRINT MSG
1377 FB8E 1F 31 TFR U,X
1378 FB90 16 00 BF JOUT4H LBRA OUT4H
1379 *
1380 FB93 8E FE B4 PRTUS LDX #MSG12 POINT TO MSG "US="
1381 FB96 8D EA BSR PDATA PRINT MSG
1382 FB98 AE 48 LDX 8,U
1383 FB9A 20 F4 BRA JOUT4H
1384 *
1385 FB9C 8E FE C6 PRTDP LDX #MSG15 POINT TO MSG "DP="
1386 FB9F 8D E1 BSR PDATA PRINT MSG
1387 FBA1 A6 43 LDA 3,U
1388 FBA3 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1389 *
1390 FBA6 8E FE C0 PRTIX LDX #MSG14 POINT TO MSG "IX="
1391 FBA9 8D D7 BSR PDATA PRINT MSG
1392 FBAB AE 44 LDX 4,U $FCE6
1393 FBAD 20 E1 BRA JOUT4H
1394 *
1395 FBAF 8E FE BA PRTIY LDX #MSG13 POINT TO MSG "IY="
1396 FBB2 8D CE BSR PDATA PRINT MSG
1397 FBB4 AE 46 LDX 6,U
1398 FBB6 20 D8 BRA JOUT4H
1399 *
1400 FBB8 8E FE AE PRTPC LDX #MSG11 POINT TO MSG "PC="
1401 FBBB 8D C5 BSR PDATA PRINT MSG
1402 FBBD AE 4A LDX 10,U
1403 FBBF 20 CF BRA JOUT4H
1404 *
1405 FBC1 8E FE CC PRTA LDX #MSG16 POINT TO MSG "A="
1406 FBC4 8D BC BSR PDATA PRINT MSG
1407 FBC6 A6 41 LDA 1,U
1408 FBC8 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1409 *
1410 FBCA 8E FE D1 PRTB LDX #MSG17 POINT TO MSG "B="
1411 FBCD 8D B3 BSR PDATA PRINT MSG
1412 FBCF A6 42 LDA 2,U
1413 FBD1 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1414 *
1415 FBD3 8E FE D6 PRTCC LDX #MSG18 POINT TO MSG "CC:"
1416 FBD6 8D AA BSR PDATA PRINT MSG
1417 FBD8 A6 C4 LDA ,U
1418 FBDA 8E FE DD LDX #MSG19 POINT TO MSG "EFHINZVC"
1419 FBDD 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1420 *
1421 * "R" DISPLAY REGISTERS
1422 *
1423 FBE0 8E FE A4 REGSTR LDX #MSG5 POINT TO MSG " - "
1424 FBE3 17 FF 27 LBSR PSTRNG PRINT MSG
1425 FBE6 8D A1 BSR PRTSP $FCBF
1426 FBE8 8D A9 BSR PRTUS $FCCA
1427 FBEA 8D B0 BSR PRTDP $FCD5
1428 FBEC 8D B8 BSR PRTIX $FCE0
1429 FBEE 8D BF BSR PRTIY $FCEB
1430 FBF0 8E FE A4 LDX #MSG5 POINT TO MSG " - "
1431 FBF3 17 FF 17 LBSR PSTRNG PRINT MSG
1432 FBF6 8D C0 BSR PRTPC $FCF5
1433 FBF8 8D C7 BSR PRTA $FCFF
1434 FBFA 8D CE BSR PRTB $FD09
1435 FBFC 20 D5 BRA PRTCC $FD13
1436 *
1437 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1438 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1439 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1440 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1441 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1442 * ADDRESS IS INPUT.
1443 *
1444 FBFE 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1445 FC00 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1446 FC02 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1447 FC04 86 2D LDA #'-
1448 FC06 17 00 B8 LBSR OUTCH PRINT " - "
1449 *
1450 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1451 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1452 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1453 *
1454 FC09 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1455 FC0B 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1456 FC0D 1F 01 TFR D,X
1457 FC0F 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1458 FC11 29 3C BVS NOTHEX
1459 FC13 34 10 PSHS X
1460 FC15 A7 61 STA 1,S
1461 FC17 35 90 PULS X,PC
1462 *
1463 ***** INPUT BYTE (2 HEX CHAR.) *****
1464 *
1465 FC19 8D 11 BYTE BSR INHEX GET HEX LEFT
1466 FC1B 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1467 FC1D 48 ASLA ;
1468 FC1E 48 ASLA ;
1469 FC1F 48 ASLA ; SHIFT INTO LEFT NIBBLE
1470 FC20 48 ASLA ;
1471 FC21 1F 89 TFR A,B PUT HEXL IN "B"
1472 FC23 8D 07 BSR INHEX GET HEX RIGHT
1473 FC25 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1474 FC27 34 04 PSHS B PUSH HEXL ON STACK
1475 FC29 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1476 FC2B 39 RTS RETURN WITH HEX L&R IN "A"
1477 *
1478 *
1479 FC2C 8D 5B INHEX BSR ECHON INPUT ASCII CHAR.
1480 FC2E 81 30 CMPA #'0 IS IT > OR = "0" ?
1481 FC30 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1482 FC32 81 39 CMPA #'9 IS IT < OR = "9" ?
1483 FC34 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1484 FC36 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1485 FC38 39 RTS ;
1486 *
1487 *
1488 FC39 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1489 FC3B 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1490 FC3D 81 46 CMPA #'F IS IT < OR = "F" ?
1491 FC3F 22 03 BHI INHEXL IF > IT AIN'T HEX
1492 FC41 80 37 SUBA #$37 ASCII ADJ. ALPHA
1493 FC43 39 RTS ;
1494 *
1495 FC44 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1496 FC46 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1497 FC48 81 66 CMPA #'f IS IT < "f"
1498 FC4A 22 03 BHI NOTHEX IF > IT AIN'T HEX
1499 FC4C 80 57 SUBA #$57 ADJUST TO LOWER CASE
1500 FC4E 39 RTS ;
1501 *
1502 *
1503 FC4F 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1504 FC51 39 RTS ;
1505 *
1506 *
1507 FC52 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1508 FC54 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1509 FC56 8D 02 BSR OUTHL OUTPUT HEX LEFT
1510 FC58 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1511 FC5A OUTHL EQU *
1512 FC5A 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1513 FC5C 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1514 FC5D 44 LSRA ;
1515 FC5E 44 LSRA ;
1516 FC5F 44 LSRA ;
1517 FC60 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1518 FC62 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1519 FC64 84 0F ANDA #$0F STRIP LEFT NIBBLE
1520 FC66 8B 30 XASCII ADDA #$30 ASCII ADJ
1521 FC68 81 39 CMPA #$39 IS IT < OR = "9" ?
1522 FC6A 2F 02 BLE OUTC IF LESS, OUTPUT IT
1523 FC6C 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1524 FC6E 20 51 OUTC BRA OUTCH OUTPUT CHAR
1525 *
1526 * BINARY / ASCII --- THIS ROUTINE
1527 * OUTPUTS A BYTE IN ENHANCED
1528 * BINARY FORMAT. THE ENHANCEMENT
1529 * IS DONE BY SUBSTITUTING ASCII
1530 * LETTERS FOR THE ONES IN THE BYTE.
1531 * THE ASCII ENHANCEMENT LETTERS
1532 * ARE OBTAINED FROM THE STRING
1533 * POINTED TO BY THE INDEX REG. "X".
1534 *
1535 FC70 34 02 BIASCI PSHS A SAVE "A" ON STACK
1536 FC72 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1537 FC74 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1538 FC76 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1539 FC78 25 02 BCS PRTBA IF ONE PRINT LETTER
1540 FC7A 86 2D LDA #'- IF ZERO PRINT "-"
1541 FC7C 8D 43 PRTBA BSR OUTCH PRINT IT
1542 FC7E 8D 3F BSR OUT1S PRINT SPACE
1543 FC80 5A DECB SUB 1 FROM #BITS YET TO PRINT
1544 FC81 26 F1 BNE OUTBA
1545 FC83 35 82 PULS A,PC
1546 *
1547 * EXTENDED USER COMMANDS
1548 *
1549 FC85 6E 9F F0 00 EXTEND JMP [MONEXT+EXTCMD]
1550 *
1551 *
1552 FC89 7D 7F D2 ECHON TST ECHO IS ECHO REQUIRED ?
1553 FC8C 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1554 *
1555 * INCHE
1556 *
1557 * ---GETS CHARACTER FROM TERMINAL AND
1558 * ECHOS SAME. THE CHARACTER IS RETURNED
1559 * IN THE "A" ACCUMULATOR WITH THE PARITY
1560 * BIT MASKED OFF. ALL OTHER REGISTERS
1561 * ARE PRESERVED.
1562 *
1563 FC8E 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1564 FC90 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1565 FC92 20 2D BRA OUTCH ECHO CHAR TO TERMINAL
1566 *
1567 * INCH
1568 *
1569 * GET CHARACTER FROM TERMINAL. RETURN
1570 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1571 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1572 * IS 8 BITS AND IS NOT ECHOED.
1573 *
1574 *
1575 FC94 34 10 INCH PSHS X SAVE IX
1576 FC96 BE 7F D0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1577 FC99 A6 84 LDA ,X FETCH PORT STATUS
1578 FC9B 85 01 BITA #1 TEST READY BIT, RDRF ?
1579 IFD PS2OPT
1580 FC9D 26 09 BNE GETST1
1581 FC9F 8E E0 20 LDX #PS2KBD
1582 FCA2 A6 84 LDA ,X
1583 FCA4 85 01 BITA #1
1584 ENDIF PS2OPT
1585 FCA6 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1586 FCA8 A6 01 GETST1 LDA 1,X FETCH CHAR
1587 FCAA 35 90 PULS X,PC RESTORE IX
1588 *
1589 * INCHEK
1590 *
1591 * CHECK FOR A CHARACTER AVAILABLE FROM
1592 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1593 * FOR READ READY. ALL REGISTERS ARE
1594 * PRESERVED, AND THE "Z" BIT WILL BE
1595 * CLEAR IF A CHARACTER CAN BE READ.
1596 *
1597 *
1598 FCAC 34 02 INCHEK PSHS A SAVE A ACCUM.
1599 FCAE A6 9F 7F D0 LDA [CPORT] FETCH PORT STATUS
1600 FCB2 85 01 BITA #1 TEST READY BIT, RDRF ?
1601 IFD PS2OPT
1602 FCB4 26 05 BNE INCHEK1
1603 FCB6 B6 E0 20 LDA PS2KBD
1604 FCB9 85 01 BITA #1 TEST READY BIT< RDRF ?
1605 ENDIF PS2OPT
1606 FCBB 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1607 *
1608 FCBD 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1609 FCBF 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1610 *
1611 *
1612 * OUTCH
1613 *
1614 * OUTPUT CHARACTER TO TERMINAL.
1615 * THE CHAR. TO BE OUTPUT IS
1616 * PASSED IN THE A REGISTER.
1617 * ALL REGISTERS ARE PRESERVED.
1618 *
1619 OUTCH IFD VDUOPT
1620 FCC1 8D 45 BSR VOUTCH
1621 ENDIF VDUOPT
1622 IFD DG640OPT
1623 BSR VOUTCH
1624 ENDIF DG640OPT
1624 ENDIF DG640OPT
1625 FCC3 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1626 FCC5 BE 7F D0 LDX CPORT GET ADDR. OF TERMINAL
1627 FCC8 A6 84 FETSTA LDA ,X FETCH PORT STATUS
1628 FCCA 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1629 FCCC 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1630 FCCE 35 02 PULS A GET CHAR. FOR XMIT
1631 FCD0 A7 01 STA 1,X XMIT CHAR.
1632 FCD2 35 90 PULS X,PC RESTORE IX
1633 *
1634 * IO INITIALIZATION
1635 *
1636 FCD4 IOINIZ EQU *
1637 IFD VDUOPT
1638 FCD4 8D 13 BSR VINIZ
1639 ENDIF VDUOPT
1640 IFD DG640OPT
1641 BSR VINIZ
1642 ENDIF DG640OPT
1642 ENDIF DG640OPT
1643 FCD6 BE 7F D0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1644 FCD9 86 03 LDA #3 RESET ACIA PORT CODE
1645 FCDB A7 84 STA ,X STORE IN CONTROL REGISTER
1646 FCDD 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1647 FCDF A7 84 STA ,X STORE IN CONTROL REGISTER
1648 FCE1 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1649 FCE3 86 FF LDA #$FF TURN ON ECHO FLAG
1650 FCE5 B7 7F D2 STA ECHO
1651 FCE8 39 RTS
1652 *
1653 IFD VDUOPT
1654 *
1655 ***************************************************
1656 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1657 * *
1658 * 80 x 25 Characters
1659 *
1660 ***************************************************
1661 *
1662 ***************************************************
1663 * INITIALIZE EMULATOR *
1664 ***************************************************
1665 *
1666 FCE9 8E E0 30 VINIZ LDX #VDU
1667 FCEC CC 00 00 LDD #0
1668 FCEF FD 7F EF STD COLADX AND ROWADX
1669 FCF2 A7 02 STA VDUCOL,X
1670 FCF4 E7 03 STB VDUROW,X
1671 FCF6 E7 04 STB VDUOFF,X
1672 FCF8 FD 7F F1 STD NEWROW AND ESCFLG
1673 FCFB C6 02 LDB #$02
1674 FCFD E7 01 STB VDUATT,X
1675 FCFF 7F 7F F2 CLR ESCFLG
1676 FD02 86 1B LDA #$1B SEND ESCAPE
1677 FD04 8D 02 BSR VOUTCH
1678 FD06 86 59 LDA #'Y CLEAR TO END OF SCREEN
1679 *
1680 ** VIDEO OUTPUT ROUTINE
1681 *
1682 FD08 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS
1683 FD0A 8E E0 30 LDX #VDU POINT TO VDU REGISTERS
1684 *
1685 ** CHECK FOR ESCAPE SEQUENCE
1686 *
1687 FD0D 7D 7F F2 TST ESCFLG ESCAPE ACTIVE?
1688 FD10 27 04 BEQ SOROU1 BRANCH IF NOT
1689 FD12 8D 74 BSR ESCAPE ELSE DO ESCAPE
1690 FD14 20 0D BRA RETURN AND RETURN
1691 *
1692 ** CHECK FOR CONTROL CHARACTERS
1693 *
1694 FD16 81 20 SOROU1 CMPA #$20 CONTROL CODES?
1695 FD18 24 04 BHS SOROU2
1696 FD1A 8D 09 BSR CONTRL BRANCH IF SO
1697 FD1C 20 05 BRA RETURN
1698 *
1699 ** OUTPUT TEXT CHARACTER
1700 *
1701 FD1E A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1702 FD20 17 00 C5 LBSR NEWCOL UPDATE COLUMN
1703 *
1704 ** DISPLAY CURSOR AND RETURN
1705 *
1706 FD23 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1707 *
1708 ***************************************************
1709 * CONTROL CODE HANDLERS *
1710 ***************************************************
1711 *
1712 FD25 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1713 FD27 10 27 00 41 LBEQ BACKSP
1714 FD2B 81 1B CMPA #$1B ESCAPE SEQUENCE?
1715 FD2D 10 27 00 6C LBEQ SETESC
1716 FD31 81 1A CMPA #$1A CTRL Z - Clear Screen
1717 FD33 10 27 00 8E LBEQ CLRSCR
1718 FD37 81 16 CMPA #$16 CTRL ^ - Home
1719 FD39 10 27 00 45 LBEQ HOME
1720 FD3D 81 0D CMPA #$D CTRL M - RETURN?
1721 FD3F 10 27 00 99 LBEQ CRETN
1722 FD43 81 0C CMPA #$0C CTRL L - CHAR RIGHT
1723 FD45 10 27 00 2C LBEQ CHRIGHT
1724 FD49 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE
1725 FD4B 10 27 00 11 LBEQ LINEUP
1726 FD4F 81 0A CMPA #$0A CTRL J - LINE FEED
1727 FD51 26 51 BNE RETESC NONE OF THESE, RETURN
1728 *
1729 ***************************************** LINE FEED
1730 *
1731 FD53 FC 7F EF LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1732 FD56 5C INCB BUMP ROW
1733 FD57 C1 19 CMPB #NUMLIN SCROLL TIME?
1734 FD59 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT
1735 FD5D 16 00 99 LBRA SCROLL ELSE SCROLL IT
1736 *
1737 ***************************************** LINE FEED
1738 *
1739 FD60 FC 7F EF LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1740 FD63 5D TSTB AT TOP OF SCREEN ?
1741 FD64 10 27 00 3C LBEQ RETESC Yes, Ignore
1742 FD68 5A DECB No, Decrement ROW
1743 FD69 16 00 74 LBRA NEWCUR POSITION CURSOR
1744 *
1745 *********************************** BACK SPACE
1746 *
1747 FD6C B6 7F EF BACKSP LDA COLADX
1748 FD6F 27 33 BEQ RETESC RETURN
1749 FD71 4A DECA
1750 FD72 16 00 68 LBRA POSCOL POSITION CURSOR
1751 *
1752 *********************************** CURSOR RIGHT
1753 *
1754 FD75 B6 7F EF CHRIGHT LDA COLADX
1755 FD78 4C INCA
1756 FD79 81 50 CMPA #LINLEN
1757 FD7B 10 27 00 25 LBEQ RETESC
1758 FD7F 16 00 5B LBRA POSCOL
1759 *
1760 *********************************** CURSOR RIGHT
1761 *
1762 FD82 CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1763 FD85 16 00 58 LBRA NEWCUR
1764 *
1765 ***************************************************
1766 * ESCAPE HANDLERS *
1767 ***************************************************
1768 *
1769 FD88 F6 7F F2 ESCAPE LDAB ESCFLG GET FLAG
1770 FD8B C1 3D CMPB #'= SETTING CURSOR?
1771 FD8D 27 16 BEQ ESCCUR BRANCH IF SO
1772 FD8F 81 59 CMPA #'Y CLEAR TO END OF SCREEN?
1773 FD91 10 27 00 6E LBEQ ESCCLS
1774 FD95 81 54 CMPA #'T CLEAR TO END OF LINE?
1775 FD97 27 31 BEQ ESCCLL
1776 FD99 81 3D CMPA #'= STARTING CURSOR SET?
1777 FD9B 26 04 BNE CLRESC BRANCH IF NOT
1778 *
1779 ***************************** START ESCAPE SEQUENCE
1780 *
1781 FD9D B7 7F F2 SETESC STAA ESCFLG ELSE START CURSORING
1782 FDA0 39 RTS AND RETURN
1783 *
1784 FDA1 7F 7F F2 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1785 FDA4 39 RETESC RTS SO RETURN
1786 *
1787 ********************************* SET SCREEN CURSOR
1788 *
1789 FDA5 7D 7F F1 ESCCUR TST NEWROW ROW SET?
1790 FDA8 26 04 BNE ESCCU1 BRANCH IF SO
1791 FDAA B7 7F F1 STAA NEWROW ELSE SET NEW ROW
1792 FDAD 39 RTS AND RETURN
1793 *
1794 FDAE 7F 7F F2 ESCCU1 CLR ESCFLG
1795 FDB1 80 20 SUBA #$20 ADJUST COLUMN ADDRESS
1796 FDB3 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1797 FDB5 22 ED BHI RETESC NOT OK, DO NOTHING
1798 *
1799 FDB7 F6 7F F1 ESCCU2 LDAB NEWROW
1800 FDBA 7F 7F F1 CLR NEWROW
1801 FDBD C0 20 SUBB #$20 ADJUST TO ROW ADDRESS
1802 FDBF C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1803 FDC1 22 E1 BHI RETESC ELSE RETURN DOING NOTHING
1804 FDC3 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO
1805 *
1806 ****************** CLEAR FROM CURSOR TO END OF LINE
1807 FDC5 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1808 FDC8 8D 16 BSR NEWCUR
1809 FDCA B6 7F EF ESCCLL LDA COLADX
1810 FDCD C6 20 LDB #$20 AND CLEAR CHAR
1811 FDCF E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1812 FDD1 4C INCA
1813 FDD2 A7 02 STA VDUCOL,X
1814 FDD4 81 50 CMPA #LINLEN UNTIL END OF LINE
1815 FDD6 26 F7 BNE ESCCL1
1816 FDD8 7F 7F F2 CLR ESCFLG
1817 FDDB 39 RTS
1818 *
1819 *********************************** CARRIAGE RETURN
1820 *
1821 FDDC 4F CRETN CLRA SET COLUMN ZERO
1822 FDDD F6 7F F0 POSCOL LDB ROWADX GET CURRENT ROW
1823 *
1824 *********** GENERATE NEW CURSOR POSITION AND RETURN
1825 *
1826 FDE0 FD 7F EF NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1827 FDE3 A7 02 STA VDUCOL,X SET NEW COLUMN
1828 FDE5 E7 03 STB VDUROW,X SET NEW ROW
1829 FDE7 39 RTS AND RETURN
1830 *
1831 ********************* UPDATE CURRENT COLUMN AND ROW
1832 *
1833 FDE8 FC 7F EF NEWCOL LDD COLADX GET ROW AND COLUMN
1834 FDEB 4C INCA BUMP COLUMN
1835 FDEC 81 50 CMPA #LINLEN ROLL?
1836 FDEE 26 F0 BNE NEWCUR BRANCH IF NOT
1837 FDF0 4F CLRA ELSE RESET TO ZERO
1838 FDF1 5C INCB AND BUMP ROW
1839 FDF2 C1 19 CMPB #NUMLIN
1840 FDF4 26 EA BNE NEWCUR
1841 FDF6 5A DECB BOTTOM ROW
1842 FDF7 8D E7 BSR NEWCUR
1843 *
1844 ********************************* SCROLL THE SCREEN
1845 *
1846 FDF9 E6 04 SCROLL LDB VDUOFF,X
1847 FDFB 5C INCB
1848 FDFC C1 19 CMPB #NUMLIN
1849 FDFE 25 01 BLO SCROL1
1850 FE00 5F CLRB
1851 FE01 E7 04 SCROL1 STB VDUOFF,X
1852 *
1853 **************** CLEAR FROM CURSOR TO END OF SCREEN
1854 *
1855 FE03 F6 7F EF ESCCLS LDB COLADX GET CURSOR
1856 FE06 86 20 LDA #$20 GET A SPACE
1857 FE08 F7 7F EF ESCCLS1 STB COLADX
1858 FE0B E7 02 STB VDUCOL,X
1859 FE0D A7 84 STA VDUCHR,X
1860 FE0F 5C INCB
1861 FE10 C1 50 CMPB #LINLEN
1862 FE12 26 F4 BNE ESCCLS1
1863 *
1864 FE14 F6 7F F0 LDB ROWADX
1865 FE17 5C INCB
1866 FE18 C1 19 CMPB #NUMLIN
1867 FE1A 27 08 BEQ ESCCLS2
1868 FE1C F7 7F F0 STB ROWADX
1869 FE1F E7 03 STB VDUROW,X
1870 FE21 5F CLRB
1871 FE22 20 E4 BRA ESCCLS1
1872 *
1873 FE24 5F ESCCLS2 CLRB
1874 FE25 F7 7F EF STB COLADX
1875 FE28 E7 02 STB VDUCOL,X
1876 FE2A F7 7F F2 STB ESCFLG
1877 FE2D 39 RTS
1878 ENDIF VDUOPT
1879 *
1880 IFD DG640OPT
1881 ***************************************************
1882 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1883 * *
1884 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1885 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1886 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1887 * 16x64 BOARD). *
1888 ***************************************************
1889
1890 ***************************************************
1891 * INITIALIZE EMULATOR *
1892 ***************************************************
1893
1894 VINIZ LDX #0
1895 STX COLADX AND ROWADX
1896 STX NEWROW AND ESCFLG
1897 LDX #SCREEN POINT TO SCREEN
1898 STX CURSOR SET PROGRAM CURSOR
1899 LDA #$1B SEND ESCAPE
1900 BSR VOUTCH
1901 LDA #'Y CLEAR TO END OF SCREEN
1902 *
1903 ** VIDEO OUTPUT ROUTINE
1904 *
1905 VOUTCH PSHS A,B,X SAVE REGISTERS
1906 *
1907 ** CLEAR CURSOR
1908 LDX CURSOR
1909 LDB 0,X
1910 ANDB #$7F
1911 STB 0,X
1912 *
1913 ** CHECK FOR ESCAPE SEQUENCE
1914 TST ESCFLG ESCAPE ACTIVE?
1915 BEQ SOROU1 BRANCH IF NOT
1916 BSR ESCAPE ELSE DO ESCAPE
1917 BRA RETURN AND RETURN
1918 *
1919 ** CHECK FOR CONTROL CHARACTERS
1920 SOROU1 CMPA #$20 CONTROL CODES?
1921 BHS SOROU2
1922 BSR CONTRL BRANCH IF SO
1923 BRA RETURN
1924 *
1925 ** OUTPUT TEXT CHARACTER
1926 SOROU2 LDX CURSOR ELSE GET CURSOR
1927 STAA 0,X DISPLAY CHARACTER
1928 LBSR NEWCOL UPDATE COLUMN
1929 *
1930 ** DISPLAY CURSOR AND RETURN
1931 RETURN LDX CURSOR AND DISPLAY IT
1932 LDB ,X
1933 ORAB #$80 WITH REVID
1934 STB ,X
1935 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1936
1937 ***************************************************
1938 * CONTROL CODE HANDLERS *
1939 ***************************************************
1940
1941 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1942 LBEQ BACKSP
1943 CMPA #$1B ESCAPE SEQUENCE?
1944 LBEQ SETESC
1945 CMPA #$D CTRL M - RETURN?
1946 LBEQ CRETN
1947 CMPA #$0A CTRL J - LINE FEED
1948 BNE RETESC NONE OF THESE, RETURN
1949
1950 ***************************************** LINE FEED
1951
1952 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1953 INCB BUMP ROW
1954 CMPB #NUMLIN SCROLL TIME?
1955 LBNE NEWCUR POSITION CURSOR IF NOT
1956 LBRA SCROLL ELSE SCROLL IT
1957
1958 ***************************************** LINE FEED
1959
1960 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1961 TSTB AT TOP OF SCREEN ?
1962 BEQ RETESC Yes, Ignore
1963 DECB No, Decrement ROW
1964 LBRA NEWCUR POSITION CURSOR
1965
1966
1967 *********************************** BACK SPACE
1968
1969 BACKSP LDA COLADX
1970 BEQ RETESC RETURN
1971 DECA
1972 LBRA POSCOL POSITION CURSOR
1973
1974 *********************************** CURSOR RIGHT
1975
1976 CHRIGHT LDA COLADX
1977 INCA
1978 CMPA #LINLEN
1979 BEQ RETESC
1980 LBRA POSCOL
1981
1982 ***************************************************
1983 * ESCAPE HANDLERS *
1984 ***************************************************
1985
1986 ESCAPE LDAB ESCFLG GET FLAG
1987 CMPB #'= SETTING CURSOR?
1988 BEQ ESCCUR BRANCH IF SO
1989 CMPA #'Y CLEAR TO END OF SCREEN?
1990 LBEQ ESCCLS
1991 CMPA #'T CLEAR TO END OF LINE?
1992 BEQ ESCCLL
1993 CMPA #'E INSERT LINE?
1994 BEQ ESCINL
1995 CMPA #'R DELETE LINE?
1996 BEQ ESCDLL
1997 CMPA #'= STARTING CURSOR SET?
1998 BNE CLRESC BRANCH IF NOT
1999
2000 ***************************** START ESCAPE SEQUENCE
2001
2002 SETESC STAA ESCFLG ELSE START CURSORING
2003 RTS AND RETURN
2004
2005 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
2006 RETESC RTS SO RETURN
2007
2008 ********************************* SET SCREEN CURSOR
2009
2010 ESCCUR TST NEWROW ROW SET?
2011 BNE ESCCU1 BRANCH IF SO
2012 STAA NEWROW ELSE SET NEW ROW
2013 RTS AND RETURN
2014
2015 ESCCU1 CLR ESCFLG
2016 SUBA #$20 ADJUST COLUMN ADDRESS
2017 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
2018 BHI RETESC NOT OK, DO NOTHING
2019
2020 ESCCU2 LDAB NEWROW
2021 CLR NEWROW
2022 SUBB #$20 ADJUST TO ROW ADDRESS
2023 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
2024 BHI RETESC ELSE RETURN DOING NOTHING
2025 BRA NEWCUR GO SET NEW CURSOR IF SO
2026 *
2027 *************************** DELETE LINE FROM SCREEN
2028
2029 ESCDLL BSR CRETN GO COL. ZERO
2030 LDB ROWADX
2031 CMPB #NUMLIN-1
2032 BEQ SCROL3
2033 BRA SCROL1 AND DELETE THIS LINE
2034
2035 *************************** INSERT LINE INTO SCREEN
2036
2037 ESCINL BSR CRETN GO TO COL. ZERO
2038 LDAB ROWADX
2039 CMPB #NUMLIN-1
2040 BEQ ESCCLL
2041 *
2042 ** SCROLL SCREEN DOWN FROM CURSOR
2043 *
2044 LDX #SCREEN+SCNLEN-LINLEN
2045 ESCIN0 LDAA 0,-X
2046 STAA LINLEN,X
2047 LDA SCNLEN,X
2048 STA SCNLEN+LINLEN,X
2049 CPX CURSOR
2050 BNE ESCIN0
2051
2052 ****************** CLEAR FROM CURSOR TO END OF LINE
2053
2054 ESCCLL LDA COLADX GET CURRENT COLUMN
2055 LDX CURSOR GET CURSOR
2056 LDB #$20 AND CLEAR CHAR
2057 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
2058 STB ,X+ CLEAR TEXT
2059 INCA
2060 CMPA #LINLEN UNTIL END OF LINE
2061 BNE ESCLL1
2062 CLR ESCFLG
2063 RTS
2064
2065 *********************************** CARRIAGE RETURN
2066
2067 CRETN CLRA SET COLUMN ZERO
2068 POSCOL LDB ROWADX GET CURRENT ROW
2069
2070 *********** GENERATE NEW CURSOR POSITION AND RETURN
2071
2072 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
2073 LDA #LINLEN ELSE ADD A LINE
2074 MUL LINLEN * ROWADX
2075 ADDB COLADX
2076 ADCA #0
2077 ADDD #SCREEN ADD SCREEN BASE.
2078 STD CURSOR SAVE NEW CURSOR
2079 TFR D,X GET CURSOR IN X
2080 RTS AND RETURN
2081
2082 ********************* UPDATE CURRENT COLUMN AND ROW
2083
2084 NEWCOL LDD COLADX GET ROW AND COLUMN
2085 INCA BUMP COLUMN
2086 CMPA #LINLEN ROLL?
2087 BNE NEWCUR BRANCH IF NOT
2088 CLRA ELSE RESET TO ZERO
2089 INCB AND BUMP ROW
2090 CMPB #NUMLIN
2091 BNE NEWCUR
2092 DECB BOTTOM ROW
2093 BSR NEWCUR
2094
2095 ********************************* SCROLL THE SCREEN
2096
2097 SCROLL LDX #SCREEN POINT TO SCREEN
2098 SCROL1 LDA SCNLEN+LINLEN,X
2099 STA SCNLEN,X
2100 LDAA LINLEN,X MOVE TWO BYTES
2101 STAA 0,X+ UP ONE LINE
2102 CMPX #SCREEN+SCNLEN-LINLEN
2103 BNE SCROL1 LOOP UNTIL DONE
2104 BRA SCROL3
2105
2106 **************** CLEAR FROM CURSOR TO END OF SCREEN
2107
2108 ESCCLS LDX CURSOR GET CURSOR
2109 SCROL3 LDAA #$20 GET A SPACE
2110 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
2111 STA ,X+ AND TEXT
2112 CMPX #SCREEN+SCNLEN
2113 BNE SCROL2 UNTIL DONE
2114 CLR ESCFLG
2115 RTS
2116 ENDIF DG640OPT
2116 ENDIF DG640OPT
2117 *
2118 IFD PRTOPT
2119 *************************************
2120 *
2121 ** PRINTER DRIVER ROUTINES
2122 *
2123 *************************************
2124 *
2125 ** PINIZ - INITIATE PRINTER PORT
2126 *
2127 PINIZ PSHS B
2128 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
2129 STD PADATA SET DDR AND SELECT DATA
2130 *
2131 ** RESET PRINTER
2132 LDB #PRESET
2133 STAB PADATA
2134 RESTLP INCB DELAY FOR RESET
2135 BNE RESTLP
2136 STAA PADATA ACCA=DIRMSK
2137 *
2138 ** INITALIZE PORT B (DATA PORT)
2139 LDAA #$2A
2140 STAA PBCTRL
2141 LDD #$FF2E ACCA=$FF ACCB =%00101110
2142 STD PBDATA PBDREG PBCTRL
2143 *
2144 ** SELECT 66 LINES/PAGE
2145 LDAA #$1B
2146 BSR POUTCH
2147 LDAA #'C
2148 BSR POUTCH
2149 LDAA #66
2150 PULS B
2151 *************************************
2152 *
2153 ** OUTPUT A CHARACTER TO THE PRINTER
2154 *
2155 *************************************
2156 POUTCH PSHS B
2157 LDAB PBDATA CLEAR INTERRUPT BIT
2158 *
2159 ** WAIT TILL NOT BUSY
2160 BUSYLP LDAB PADATA
2161 BITB #PERROR
2162 BEQ PEXIT
2163 TSTB
2164 BMI BUSYLP
2165 *
2166 ** NOW OUTPUT CHARACTER
2167 STAA PBDATA
2168 PEXIT PULS B,PC
2169 *************************************
2170 *
2171 ** PCHK TEST IFD PRINTER READY
2172 *
2173 *************************************
2174 PCHK TST PBCTRL TEST STATE OF CRB7
2175 RTS SET ON ACKNOWLEDGE
2176 ENDIF PRTOPT
2176 ENDIF PRTOPT
2177 *************************************
2178 *
2179 * MONITOR KEYBOARD COMMAND JUMP TABLE
2180 *
2181 *************************************
2182 *
2183 FE2E JMPTAB EQU *
2184 FE2E 01 FCB 1 " ^A "
2185 FE2F FB 67 FDB ALTRA
2186 FE31 02 FCB 2 " ^B "
2187 FE32 FB 5C FDB ALTRB
2188 FE34 03 FCB 3 " ^C "
2189 FE35 FB 72 FDB ALTRCC
2190 FE37 04 FCB 4 " ^D "
2191 FE38 FB 51 FDB ALTRDP
2192 FE3A 10 FCB $10 " ^P "
2193 FE3B FB 24 FDB ALTRPC
2194 FE3D 15 FCB $15 " ^U "
2195 FE3E FB 30 FDB ALTRU
2196 FE40 18 FCB $18 " ^X "
2197 FE41 FB 46 FDB ALTRX
2198 FE43 19 FCB $19 " ^Y "
2199 FE44 FB 3B FDB ALTRY
2200 *
2201 FE46 42 FCC 'B'
2202 FE47 F9 46 FDB BRKPNT
2203 FE49 45 FCC 'E'
2204 FE4A F8 E7 FDB MEMDUMP
2205 FE4C 47 FCC 'G'
2206 FE4D F8 8F FDB GO
2207 FE4F 4C FCC 'L'
2208 FE50 FA 51 FDB LOAD
2209 FE52 50 FCC 'P'
2210 FE53 FA AF FDB PUNCH
2211 FE55 4D FCC 'M'
2212 FE56 F8 92 FDB MEMCHG
2213 FE58 52 FCC 'R'
2214 FE59 FB E0 FDB REGSTR
2215 FE5B 53 FCC 'S'
2216 FE5C F8 DB FDB DISSTK
2217 FE5E 58 FCC 'X'
2218 FE5F F9 72 FDB XBKPNT
2219 IFD MFDCOPT
2220 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
2221 FDB MINBOOT
2222 ENDIF MFDCOPT
2222 ENDIF MFDCOPT
2223 IFD CFOPT
2224 FCC 'D' *** FPGA USES 'D' FOR CFBOOT
2225 FDB CFBOOT
2226 ENDIF CFOPT
2226 ENDIF CFOPT
2227 IFD DMAFOPT
2228 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
2229 FDB DBOOT
2230 ELSE
2231 FE61 55 FCC 'U' *** IF NOT DMAF2, 'U' IS FOR USER
2232 FE62 FC 85 FDB EXTEND
2233 ENDIF DMAFOPT
2234 IFD RTCOPT
2235 FCC 'T'
2236 FDB TIMSET
2237 ENDIF RTCOPT
2237 ENDIF RTCOPT
2238 IFD TRAOPT
2239 FE64 54 FCC "T"
2240 FE65 F9 C5 FDB TRACE
2241 ENDIF TRAOPT
2242 *
2243 FE67 TABEND EQU *
2244 *
2245 * ** 6809 VECTOR ADDRESSES **
2246 *
2247 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
2248 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
2249 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
2250 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
2251 * HIS OWN ROUTINES IF HE SO DESIRES.
2252 *
2253 *
2254 FE67 F9 7E RAMVEC FDB SWIE USER-V
2255 FE69 F8 91 FDB RTI SWI3-V
2256 FE6B F8 91 FDB RTI SWI2-V
2257 FE6D F8 91 FDB RTI FIRQ-V
2258 FE6F F8 91 FDB RTI IRQ-V
2259 FE71 F9 7E FDB SWIE SWI-V
2260 FE73 FF FF FDB $FFFF SVC-VO
2261 FE75 FF FF FDB $FFFF SVC-VL
2262 *
2263 * PRINTABLE MESSAGE STRINGS
2264 *
2265 FE77 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2266 FE7C 53 59 53 30 39 42 FCC 'SYS09BUG 1.3 FOR '
55 47 20 31 2E 33
20 46 4F 52 20
2267 IFD S3EOPT
2268 FE8D 53 33 45 20 FCC 'S3E '
2269 ENDIF S3EOPT
2270 IFD FPGAOPT
2271 FCC 'FPGA '
2272 ENDIF FPGAOPT
2272 ENDIF FPGAOPT
2273 IFD ADSOPT
2274 FCC 'ADS6809 '
2275 ENDIF ADSOPT
2275 ENDIF ADSOPT
2276 IFD SWTPOPT`
2277 FCC 'SWTPC '
2278 ENDIF SWTPOPT
2278 ENDIF SWTPOPT
2279 FE91 20 2D 20 FCC ' - '
2280 FE94 04 FCB 4
2281 FE95 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2282 FE9C 3E MSG3 FCC '>'
2283 FE9D 04 FCB 4
2284 FE9E 57 48 41 54 3F MSG4 FCC 'WHAT?'
2285 FEA3 04 FCB 4
2286 FEA4 20 2D 20 MSG5 FCC ' - '
2287 FEA7 04 FCB 4'
2288 FEA8 20 20 53 50 3D MSG10 FCC ' SP='
2289 FEAD 04 FCB 4
2290 FEAE 20 20 50 43 3D MSG11 FCC ' PC='
2291 FEB3 04 FCB 4
2292 FEB4 20 20 55 53 3D MSG12 FCC ' US='
2293 FEB9 04 FCB 4
2294 FEBA 20 20 49 59 3D MSG13 FCC ' IY='
2295 FEBF 04 FCB 4
2296 FEC0 20 20 49 58 3D MSG14 FCC ' IX='
2297 FEC5 04 FCB 4
2298 FEC6 20 20 44 50 3D MSG15 FCC ' DP='
2299 FECB 04 FCB 4
2300 FECC 20 20 41 3D MSG16 FCC ' A='
2301 FED0 04 FCB 4
2302 FED1 20 20 42 3D MSG17 FCC ' B='
2303 FED5 04 FCB 4
2304 FED6 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2305 FEDC 04 FCB 4
2306 FEDD 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2307 FEE5 53 31 MSG20 FCC 'S1'
2308 FEE7 04 FCB 4
2309 IFD DATOPT
2310 *
2311 * POWER UP/ RESET/ NMI ENTRY POINT
2312 *
2313 ORG $FF00
2314 *
2315 *
2316 START LDX #IC11 POINT TO DAT RAM IC11
2317 LDA #$F GET COMPLIMENT OF ZERO
2318 *
2319 *
2320 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2321 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2322 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2323 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2324 * STORED IN IT.
2325 *
2326 *
2327 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2328 DECA GET COMP. VALUE FOR NEXT LOCATION
2329 BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2330 *
2331 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2332 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2333 * PHYSICAL ADDRESSES.
2334 *
2335 LDA #$F0
2336 STA ,X STORE $F0 AT $FFFF
2337 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2338 LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2339 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2340 STY ,X STORE TEST PATTERN AT $D0A0
2341 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2342 BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2343 LEAX -$1000,X ELSE POINT 4K LOWER
2344 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2345 BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2346 BRA START ELSE START ALL OVER AGAIN
2347 *
2348 *
2349 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2350 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2351 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2352 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2353 * IS STORED IN RAM IN THE LOCATION THAT IS
2354 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2355 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2356 * WHEN TESTING LOCATION $70A0, MEANING THERE
2357 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2358 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2359 * "7" IN THE $70A0 WILL BE STORED IN
2360 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2361 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2362 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2363 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2364 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2365 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2366 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2367 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2368 * OF RAM RESPONDS.
2369 *
2370 *
2371 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2372 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2373 COMA COMPLEMENT MSB OF THAT ADDRESS
2374 LSRA PUT MS 4 BITS OF ADDRESS IN
2375 LSRA LOCATION D0-D3 TO ALLOW STORING
2376 LSRA IT IN THE DYNAMIC ADDRESS
2377 LSRA TRANSLATION RAM.
2378 STA $FFFD STORE XLATION FACTOR IN DAT "D"
2379 *
2380 LDS #STACK INITIALIZE STACK POINTER
2381 *
2382 *
2383 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2384 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2385 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2386 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2387 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2388 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2389 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2390 *
2391 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2392 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2393 *
2394 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2395 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2396 *
2397 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2398 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2399 *
2400 *
2401 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2402 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2403 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2404 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2405 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2406 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2407 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2408 * MEMORY ADDRESSED AS FOLLOWS....
2409 *
2410 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2411 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2412 *
2413 *
2414 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2415 STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2416 CLR 14,Y CLEAR $DFDE
2417 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2418 STA 15,Y STORE AT $DFDF
2419 LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2420 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2421 DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2422 BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2423 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2424 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2425 BEQ FINTAB SKIP IF FINISHED
2426 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2427 LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2428 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2429 CMPY ,X VERIFY RAM AT TEST LOCATION
2430 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2431 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2432 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2433 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2434 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2435 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2436 LSRA
2437 LSRA
2438 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2439 EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2440 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2441 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2442 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2443 LDY #LRARAM POINT TO LRARAM TABLE
2444 STA 14,Y STORE $F1 AT $DFCE
2445 *
2446 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2447 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2448 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2449 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2450 *
2451 *
2452 LDA #$0C PRESET NUMBER HEX "C"
2453 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2454 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2455 DECA ELSE POINT 4K LOWER
2456 BPL FINDC GO TRY AGAIN
2457 BRA XFERTF
2458 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2459 STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2460 *
2461 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2462 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2463 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2464 * ADDRESSES FROM $0000 AND UP....
2465 *
2466 CLRA START AT ZERO
2467 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2468 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2469 BEQ PNTNXT IF IT'S ZER0 SKIP
2470 CLR A,Y ELSE ERASE FROM TABLE
2471 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2472 PNTNXT INCA GET OFFSET TO NEXT ENTRY
2473 CMPA #$0C LAST ENTRY YET ?
2474 BLT COMPRS
2475 *
2476 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2477 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2478 * THE MP-09 CPU CARD.
2479 *
2480 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2481 LDB #$10 GET NO. OF BYTES TO MOVE
2482 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2483 STA ,X+ POKE XLATION FACTOR IN IC11
2484 DECB SUB 1 FROM BYTES TO MOVE
2485 BNE FETCH CONTINUE UNTIL 16 MOVED
2486 *
2487 ELSE
2488 FEE8 39 LRA RTS
2489 FEE9 10 CE 7F C0 START LDS #STACK INITIALIZE STACK POINTER
2490 FEED 5F CLRB
2491 ENDIF DATOPT
2492 *
2493 FEEE 53 COMB SET "B" NON-ZERO
2494 FEEF F7 7F D2 STB ECHO TURN ON ECHO FLAG
2495 FEF2 16 F9 1F LBRA MONITOR INITIALIZATION IS COMPLETE
2496 *
2497 ** INTERRUPT JUMP VECTORS
2498 *
2499 FEF5 6E 9F 7F C0 V1 JMP [STACK]
2500 FEF9 6E 9F 7F C4 V2 JMP [SWI2]
2501 FEFD 6E 9F 7F C6 V3 JMP [FIRQ]
2502 FF01 6E 9F 7F C8 V4 JMP [IRQ]
2503 FF05 6E 9F 7F CA V5 JMP [SWI]
2504 *
2505 * SWI3 ENTRY POINT
2506 *
2507 FF09 1F 43 SWI3E TFR S,U
2508 FF0B AE 4A LDX 10,U *$FFC8
2509 FF0D E6 80 LDB ,X+
2510 FF0F AF 4A STX 10,U
2511 FF11 4F CLRA
2512 FF12 58 ASLB
2513 FF13 49 ROLA
2514 FF14 BE 7F CC LDX SVCVO
2515 FF17 8C FF FF CMPX #$FFFF
2516 FF1A 27 0F BEQ SWI3Z
2517 FF1C 30 8B LEAX D,X
2518 FF1E BC 7F CE CMPX SVCVL
2519 FF21 22 08 BHI SWI3Z
2520 FF23 34 10 PSHS X
2521 FF25 EC C4 LDD ,U
2522 FF27 AE 44 LDX 4,U
2523 FF29 6E F1 JMP [,S++]
2524 FF2B 37 1F SWI3Z PULU A,B,X,CC,DP
2525 FF2D EE 42 LDU 2,U
2526 FF2F 6E 9F 7F C2 JMP [SWI3]
2527 *
2528 * 6809 VECTORS
2529 *
2530 FFF0 ORG $FFF0
2531 FFF0 FE F5 FDB V1 USER-V
2532 FFF2 FF 09 FDB SWI3E SWI3-V
2533 FFF4 FE F9 FDB V2 SWI2-V
2534 FFF6 FE FD FDB V3 FIRQ-V
2535 FFF8 FF 01 FDB V4 IRQ-V
2536 FFFA FF 05 FDB V5 SWI-V
2537 FFFC FE F5 FDB V1 NMI-V
2538 FFFE FE E9 FDB START RESTART-V
2539 END START
Program + Init Data = 1859 bytes
Error count = 0
/trunk/src/sys09bug/sys09bug.txt
38,6 → 38,13
* ADDED: COMPACT FLASH BOOT TO FPGA VERSION
* REMOVED PORT REDIRECTION ON PUNCH & LOAD
*
* Modified to SYS09BUG VER 1.3
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 8TH JAN 2008
* ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
* WITH ONLY 32K OF RAM
*
* *** COMMANDS ***
*
* CONTROL A = ALTER THE "A" ACCUMULATOR
74,24 → 81,40
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
** FOR LOADING AND SAVING S1 RECORDS
*
FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD
*S3EOPT EQU $FF SPARTAN3E STARTER
*FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
*SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
*
***************************************************
* MEMORY MAP EQUATES *
***************************************************
MONIO EQU $E000 I/O SPACE
IFD S3EOPT
MONRAM EQU $7FC0
ELSE
MONRAM EQU $DFC0 STACK SPACE
ENDIF S3EOPT
MONROM EQU $F800 START OF ROM
MONEXT EQU $F000 START OF EXTENDED COMMANDS
EXTCMD EQU $00 EXTENDED OFFSET
***************************************************
IFD S3EOPT
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
VDUOPT EQU $FF VDU AT $E030
TRAOPT EQU $FF PIA TRACE TIMER
ENDIF S3EOPT
IFD FPGAOPT
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
VDUOPT EQU $FF VDU AT $E030
CFOPT EQU $FF COMPACT FLASH AT $E040
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
ENDIF FPGAOPT
*
IFD ADSOPT
DG640OPT EQU $FF DG640 VDU AT $E800
*RTCOPT EQU $FF REAL TIME CLOCK
PRTOPT EQU $FF PRINTER DRIVERS
MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
98,6 → 121,7
ENDIF ADSOPT
*
IFD SWTPOPT
ACIAOPT EQU $FF ACIA AT PORT 0
DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
108,7 → 132,8
***************************************************
*
ORG MONRAM
STACK RMB 2 TOP OF INTERNAL STACK / USER VECTOR
STACK EQU * TOP OF INTERNAL STACK
NMI RMB 2 USER NMI VECTOR
SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
FIRQ RMB 2 FAST INTERRUPT VECTOR
122,8 → 147,12
CPORT RMB 2 RE-VECTORABLE CONTROL PORT
ECHO RMB 1 ECHO FLAG
BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
IFD TRAOPT
NMISAV RMB 2 NMI Jump Vector Backup
TRACNT RMB 2 Trace Count
ENDIF TRAOPT
*
IFD SWTPOPT
IFD ACIAOPT
*
***************************************************
* SERIAL PORT *
133,7 → 162,7
*
ACIAS EQU MONIO+$00 CONTROL PORT
*
ENDIF SWTPOPT
ENDIF ACIAOPT
IFD MFDCOPT
*
***************************************************
147,18 → 176,9
SECFDC EQU MONIO+$1A
DATFDC EQU MONIO+$1B
ENDIF MFDCOPT
IFD FPGAOPT
IFD PS2OPT
*
***************************************************
* SERIAL PORT *
***************************************************
*
** ACIA SITS ON PORT 0
*
ACIAS EQU MONIO+$00 CONTROL PORT
*
*
***************************************************
* VDU8 PS/2 KEYBOARD PORT *
***************************************************
*
165,6 → 185,8
** KEYBOARD SITS ON PORT 2
*
PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
ENDIF PS2OPT
IFD VDUOPT
*
***************************************************
* VDU8 DISPLAY DRIVER EQUATES *
193,11 → 215,15
*
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
ENDIF VDUOPT
IFD CFOPT
*
***************************************************
* COMPACT FLASH EQUATES *
***************************************************
*
** COMPACT FLASH SITS AT PORT 4
*
CF_BASE EQU MONIO+$40
CF_DATA EQU CF_BASE+0
CF_ERROR EQU CF_BASE+1 ; read error
225,7 → 251,7
DRQ EQU $08
ERR EQU $01
*
ENDIF FPGAOPT
ENDIF CFOPT
*
IFD RTCOPT
*
306,6 → 332,52
TSTMOD EQU CLOCK+31 TEST MODE REGISTER
ENDIF RTCOPT
*
IFD TRAOPT
*
**************************************************
* PIA INTERRUPT TIMER
**************************************************
*
** PIA INTERRUPT TIMER SITS ON PORT 7
*
** PIA TIMER FOR SINGLE STEP / TRACE
*
* TADATA = Output = Timer preset register
* TACTRL - CA1 = input = rising edge = NMI
* - CA2 = Output = Timer Reset (Active High)
* TBDATA = Input = Timer read back register
* TBCTRL - CB1 = input = rising edge = FIRQ
* - CB2 = output = strobe low on write to TBDATA = Timer Preset
*
* CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
* CRA1 = 1 CA1 Rising edge IRQ
* CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
* CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
* CRA4 = 1 ] CA2 = Set/Reset output
* CRA5 = 1 ]
* CRA6 = X CA2 Input Interrupt Flag
* CRA7 = X CA1 Interrupt Flag
*
* CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
* CRB1 = 1 CB1 Rising edge IRQ
* CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
* CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
* CRB4 = 1 ] CB2 = Set/Reset output
* CRB5 = 1 ]
* CRB6 = X CB2 Input Interrupt Flag
* CRB7 = X CB1 Interrupt Flag
*
* DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
* DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
*
TADATA EQU MONIO+$70 Timer preset port
TACTRL EQU MONIO+$71
TBDATA EQU MONIO+$72 Timer read back port
TBCTRL EQU MONIO+$73
*
TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
*
ENDIF TRAOPT
IFD ADSOPT
*
***************************************************
317,6 → 389,8
*
ACIAS EQU MONIO+$400 CONTROL PORT
*
ENDIF ADSOPT
IFD PRTOPT
*
***************************************************
* PRINTER INTERFACE *
339,6 → 413,8
PRESET EQU %00000100 O/P PA3 = 0
AUTOFD EQU %00001000 O/P PA2 = 0
DIRMSK EQU %00001100
ENDIF PRTOPT
IFD DG640OPT
*
***************************************************
* DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
358,7 → 434,7
CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
ENDIF ADSOPT
ENDIF DG640OPT
*
IFD DMAFOPT
*
465,6 → 541,10
LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
LBSR PDATA PRINT MSG
ENDIF DATOPT
*
IFD TRAOPT
LBSR TRAINZ
ENDIF TRAOPT
*
***** NEXTCMD *****
*
670,7 → 750,14
STX 10,U SAVE BREAKPOINT ADDR IN STACK
BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
REGPR LBSR REGSTR GO PRINT REGISTERS
*
IFD TRAOPT
LDX #0
STX TRACNT
ENDIF TRAOPT
*
LBRA NEXTCMD GET NEXT COMMAND
*
RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
700,6 → 787,98
BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
RTS
*
IFD TRAOPT
*
** TRACE from address AAAA BB bytes
*
TRACE LBSR ALTPC1 SET UP NEW PC
BVS TREXIT ADDRESS ERROR, EXIT
LBSR OUT1S
LBSR IN1ADR Fetch Byte Count
BVS TREXIT Byte Count error, EXIT
STX TRACNT
*
LDX NMI Save NMI Vector
STX NMISAV
LDX #NMIE Set up NMI for Tracing
STX NMI
LBSR TRAINZ Initialise Hardware
BRA TRACEG Start Trace
TREXIT RTS
*
* CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
* CRA1 = 1 CA1 Rising edge IRQ
* CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
* CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
* CRA4 = 1 ] CA2 = Set/Reset output
* CRA5 = 1 ]
* CRA6 = X CA2 Input Interrupt Flag
* CRA7 = X CA1 Interrupt Flag
*
* CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
* CRB1 = 1 CB1 Rising edge IRQ
* CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
* CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
* CRB4 = 1 ] CB2 = Set/Reset output
* CRB5 = 1 ]
* CRB6 = X CB2 Input Interrupt Flag
* CRB7 = X CB1 Interrupt Flag
*
*
** TRACE NMI ENTRY POINT
*
NMIE TFR S,U
LDA #$36 Disable Interrupt, CA2 Low
STA TACTRL
LDA TADATA Clear Interrupt flag by reading data port
*
LBSR REGSTR DUMP REGISTERS
*
LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
LDA ,X
CMPA #$3F
BEQ TRACEX EXIT ON SWI
*
LDX TRACNT CHECK IF TRACE COUNT EXPIRED
BEQ TRACEX YES, GO BACK TO THE MONITOR
LEAX -1,X DECREMENT TRACE COUNT
STX TRACNT
*
** TRACE GO (RESUME SINGLE STEP)
*
TRACEG TFR U,S SET UP PROGRAM STACK POINTER
LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
STA TADATA
LDA #$36 LOAD STROBE LOW
STA TACTRL
LDA TADATA CLEAR INTERRUPT
LDA #$36 RELEASE RESET
STA TBCTRL
LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
STA TACTRL
RTI GO EXECUTE INSTRUCTION
*
TRACEX LDX NMISAV Restore NMI vector
STX NMI
LBRA NEXTCMD Jump back to the command loop.
*
** TRACE HARDWARE INITIALISATION
*
TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
STA TACTRL
LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
STA TBCTRL
LDA #$FF PORTA = OUTPUT
STA TADATA
LDA #$00 PORTB = INPUT
STA TBDATA
LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
STA TACTRL
LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
STA TBCTRL
RTS
*
ENDIF TRAOPT
IFD MFDCOPT
*
** "U" MINI DISK BOOT
827,7 → 1006,7
RTI ;
ENDIF DMAFOPT
*
IFD FPGAOPT
IFD CFOPT
*
* COMPACT FLASH BOOT
*
884,7 → 1063,7
BITA #DRQ
BEQ WAITDRQ
RTS
ENDIF FPGAOPT
ENDIF CFOPT
*
IFD RTCOPT
*
1113,7 → 1292,7
* ALTER "PC" PROGRAM COUNTER
*
ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
BSR JOUT1S OUTPUT SPACE
ALTPC1 BSR JOUT1S OUTPUT SPACE
BSR JIN1ADR GET NEW CONTENTS FOR "PC"
BVS ALTPCD EXIT IF INVALID HEX
STX 10,U POKE IN NEW CONTENTS
1397,12 → 1576,12
GETSTA LDX CPORT POINT TO TERMINAL PORT
LDA ,X FETCH PORT STATUS
BITA #1 TEST READY BIT, RDRF ?
IFD FPGAOPT
IFD PS2OPT
BNE GETST1
LDX #PS2KBD
LDA ,X
BITA #1
ENDIF FPGAOPT
ENDIF PS2OPT
BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
GETST1 LDA 1,X FETCH CHAR
PULS X,PC RESTORE IX
1419,11 → 1598,11
INCHEK PSHS A SAVE A ACCUM.
LDA [CPORT] FETCH PORT STATUS
BITA #1 TEST READY BIT, RDRF ?
IFD FPGAOPT
IFD PS2OPT
BNE INCHEK1
LDA PS2KBD
BITA #1 TEST READY BIT< RDRF ?
ENDIF FPGAOPT
ENDIF PS2OPT
INCHEK1 PULS A,PC RESTORE A ACCUM.
*
OUT2S BSR OUT1S OUTPUT 2 SPACES
1437,12 → 1616,12
* PASSED IN THE A REGISTER.
* ALL REGISTERS ARE PRESERVED.
*
OUTCH IFD FPGAOPT
OUTCH IFD VDUOPT
BSR VOUTCH
ENDIF FPGAOPT
IFD ADSOPT
ENDIF VDUOPT
IFD DG640OPT
BSR VOUTCH
ENDIF ADSOPT
ENDIF DG640OPT
AOUTCH PSHS A,X SAVE A ACCUM AND IX
LDX CPORT GET ADDR. OF TERMINAL
FETSTA LDA ,X FETCH PORT STATUS
1455,12 → 1634,12
* IO INITIALIZATION
*
IOINIZ EQU *
IFD FPGAOPT
IFD VDUOPT
BSR VINIZ
ENDIF FPGAOPT
IFD ADSOPT
ENDIF VDUOPT
IFD DG640OPT
BSR VINIZ
ENDIF ADSOPT
ENDIF DG640OPT
ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
LDA #3 RESET ACIA PORT CODE
STA ,X STORE IN CONTROL REGISTER
1471,7 → 1650,7
STA ECHO
RTS
*
IFD FPGAOPT
IFD VDUOPT
*
***************************************************
* VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1696,9 → 1875,9
STB VDUCOL,X
STB ESCFLG
RTS
ENDIF FPGAOPT
ENDIF VDUOPT
*
IFD ADSOPT
IFD DG640OPT
***************************************************
* TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
* *
1934,7 → 2113,7
BNE SCROL2 UNTIL DONE
CLR ESCFLG
RTS
ENDIF ADSOPT
ENDIF DG640OPT
*
IFD PRTOPT
*************************************
2041,10 → 2220,10
FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
FDB MINBOOT
ENDIF MFDCOPT
IFD FPGAOPT
IFD CFOPT
FCC 'D' *** FPGA USES 'D' FOR CFBOOT
FDB CFBOOT
ENDIF FPGAOPT
ENDIF CFOPT
IFD DMAFOPT
FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
FDB DBOOT
2056,6 → 2235,10
FCC 'T'
FDB TIMSET
ENDIF RTCOPT
IFD TRAOPT
FCC "T"
FDB TRACE
ENDIF TRAOPT
*
TABEND EQU *
*
2080,8 → 2263,11
* PRINTABLE MESSAGE STRINGS
*
MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
FCC 'SYS09BUG 1.2 FOR '
IFD FPGAOPT`
FCC 'SYS09BUG 1.3 FOR '
IFD S3EOPT
FCC 'S3E '
ENDIF S3EOPT
IFD FPGAOPT
FCC 'FPGA '
ENDIF FPGAOPT
IFD ADSOPT
/trunk/src/sys09bug/sys09bug_swtp.lst
42,2345 → 42,2543
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * *** COMMANDS ***
0042 *
0043 * CONTROL A = ALTER THE "A" ACCUMULATOR
0044 * CONTROL B = ALTER THE "B" ACCUMULATOR
0045 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0046 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0047 * CONTROL P = ALTER THE PROGRAM COUNTER
0048 * CONTROL U = ALTER USER STACK POINTER
0049 * CONTROL X = ALTER "X" INDEX REGISTER
0050 * CONTROL Y = ALTER "Y" INDEX REGISTER
0051 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0052 * D = 5.25" MINIFLOPPY BOOT
0053 * E ssss-eeee = EXAMINE MEMORY
0054 * FROM STARTING ADDRESS ssss
0055 * TO ENDING ADDRESS eeee.
0056 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0057 * L = LOAD TAPE
0058 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0059 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0060 * R = DISPLAY REGISTER CONTENTS
0061 * S = DISPLAY STACK FROM ssss TO $DFC0
0062 * U = 8" DMAF2 FLOPPY BOOT
0063 * U = USER EXTENSION COMMANDS AT $F000
0064 * X = REMOVE ALL BREAKPOINTS
0065 *
0066 *
0067 *
0068 ***************************************************
0069 * OPTION SWITCHES
0070 ***************************************************
0071 *
0072 *
0073 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0074 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0075 ** FOR LOADING AND SAVING S1 RECORDS
0076 *
0077 *FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD
0078 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0079 00FF SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0080 *
0081 ***************************************************
0082 * MEMORY MAP EQUATES *
0083 ***************************************************
0084 E000 MONIO EQU $E000 I/O SPACE
0085 DFC0 MONRAM EQU $DFC0 STACK SPACE
0086 F800 MONROM EQU $F800 START OF ROM
0087 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0088 0000 EXTCMD EQU $00 EXTENDED OFFSET
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * *** COMMANDS ***
0049 *
0050 * CONTROL A = ALTER THE "A" ACCUMULATOR
0051 * CONTROL B = ALTER THE "B" ACCUMULATOR
0052 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0053 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0054 * CONTROL P = ALTER THE PROGRAM COUNTER
0055 * CONTROL U = ALTER USER STACK POINTER
0056 * CONTROL X = ALTER "X" INDEX REGISTER
0057 * CONTROL Y = ALTER "Y" INDEX REGISTER
0058 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0059 * D = 5.25" MINIFLOPPY BOOT
0060 * E ssss-eeee = EXAMINE MEMORY
0061 * FROM STARTING ADDRESS ssss
0062 * TO ENDING ADDRESS eeee.
0063 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0064 * L = LOAD TAPE
0065 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0066 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0067 * R = DISPLAY REGISTER CONTENTS
0068 * S = DISPLAY STACK FROM ssss TO $DFC0
0069 * U = 8" DMAF2 FLOPPY BOOT
0070 * U = USER EXTENSION COMMANDS AT $F000
0071 * X = REMOVE ALL BREAKPOINTS
0072 *
0073 *
0074 *
0075 ***************************************************
0076 * OPTION SWITCHES
0077 ***************************************************
0078 *
0079 *
0080 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0081 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0082 ** FOR LOADING AND SAVING S1 RECORDS
0083 *
0084 *S3EOPT EQU $FF SPARTAN3E STARTER
0085 *FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD
0086 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0087 00FF SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0088 *
0089 ***************************************************
0090 IFD FPGAOPT
0091 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0092 ENDIF FPGAOPT
0092 ENDIF FPGAOPT
0093 *
0094 IFD ADSOPT
0095 *RTCOPT EQU $FF REAL TIME CLOCK
0096 PRTOPT EQU $FF PRINTER DRIVERS
0097 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0098 ENDIF ADSOPT
0098 ENDIF ADSOPT
0099 *
0100 IFD SWTPOPT
0101 00FF DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0102 00FF MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0103 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0104 ENDIF
0105 *
0106 ***************************************************
0107 * SYS09BUG VARIABLE SPACE
0108 ***************************************************
0109 *
0110 DFC0 ORG MONRAM
0111 DFC0 STACK RMB 2 TOP OF INTERNAL STACK / USER VECTOR
0112 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0113 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0114 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0115 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0116 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0117 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0118 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0119 IFD DATOPT
0120 DFD0 LRARAM RMB 16 LRA ADDRESSES
0121 ENDIF DATOPT
0122 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0123 DFE2 ECHO RMB 1 ECHO FLAG
0124 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0125 *
0126 IFD SWTPOPT
0127 *
0128 ***************************************************
0129 * SERIAL PORT *
0090 * MEMORY MAP EQUATES *
0091 ***************************************************
0092 E000 MONIO EQU $E000 I/O SPACE
0093 IFD S3EOPT
0094 MONRAM EQU $7FC0
0095 ELSE
0096 DFC0 MONRAM EQU $DFC0 STACK SPACE
0097 ENDIF S3EOPT
0098 F800 MONROM EQU $F800 START OF ROM
0099 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0100 0000 EXTCMD EQU $00 EXTENDED OFFSET
0101 ***************************************************
0102 IFD S3EOPT
0103 ACIAOPT EQU $FF ACIA AT PORT 0
0104 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0105 VDUOPT EQU $FF VDU AT $E030
0106 TRAOPT EQU $FF PIA TRACE TIMER
0107 ENDIF S3EOPT
0107 ENDIF S3EOPT
0108 IFD FPGAOPT
0109 ACIAOPT EQU $FF ACIA AT PORT 0
0110 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0111 VDUOPT EQU $FF VDU AT $E030
0112 CFOPT EQU $FF COMPACT FLASH AT $E040
0113 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0114 ENDIF FPGAOPT
0114 ENDIF FPGAOPT
0115 *
0116 IFD ADSOPT
0117 DG640OPT EQU $FF DG640 VDU AT $E800
0118 *RTCOPT EQU $FF REAL TIME CLOCK
0119 PRTOPT EQU $FF PRINTER DRIVERS
0120 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0121 ENDIF ADSOPT
0121 ENDIF ADSOPT
0122 *
0123 IFD SWTPOPT
0124 00FF ACIAOPT EQU $FF ACIA AT PORT 0
0125 00FF DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0126 00FF MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0127 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0128 ENDIF
0129 *
0130 ***************************************************
0131 *
0132 ** ACIA SITS ON PORT 0
0133 *
0134 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0135 *
0136 ENDIF SWTPOPT
0137 IFD MFDCOPT
0138 *
0139 ***************************************************
0140 * MINIFLOPPY DRIVE *
0141 ***************************************************
0142 *
0143 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0144 *
0145 E014 DRVFDC EQU MONIO+$14
0146 E018 CMDFDC EQU MONIO+$18
0147 E01A SECFDC EQU MONIO+$1A
0148 E01B DATFDC EQU MONIO+$1B
0149 ENDIF MFDCOPT
0150 IFD FPGAOPT
0151 *
0152 ***************************************************
0153 * SERIAL PORT *
0154 ***************************************************
0155 *
0156 ** ACIA SITS ON PORT 0
0157 *
0158 ACIAS EQU MONIO+$00 CONTROL PORT
0159 *
0160 *
0161 ***************************************************
0162 * VDU8 PS/2 KEYBOARD PORT *
0163 ***************************************************
0131 * SYS09BUG VARIABLE SPACE
0132 ***************************************************
0133 *
0134 DFC0 ORG MONRAM
0135 DFC0 STACK EQU * TOP OF INTERNAL STACK
0136 DFC0 NMI RMB 2 USER NMI VECTOR
0137 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0138 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0139 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0140 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0141 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0142 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0143 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0144 IFD DATOPT
0145 DFD0 LRARAM RMB 16 LRA ADDRESSES
0146 ENDIF DATOPT
0147 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0148 DFE2 ECHO RMB 1 ECHO FLAG
0149 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0150 IFD TRAOPT
0151 NMISAV RMB 2 NMI Jump Vector Backup
0152 TRACNT RMB 2 Trace Count
0153 ENDIF TRAOPT
0153 ENDIF TRAOPT
0154 *
0155 IFD ACIAOPT
0156 *
0157 ***************************************************
0158 * SERIAL PORT *
0159 ***************************************************
0160 *
0161 ** ACIA SITS ON PORT 0
0162 *
0163 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0164 *
0165 ** KEYBOARD SITS ON PORT 2
0166 *
0167 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0168 *
0169 ***************************************************
0170 * VDU8 DISPLAY DRIVER EQUATES *
0171 ***************************************************
0172 *
0173 ** VDU8 DISPLAY SITS ON PORT 3
0174 *
0175 VDU EQU MONIO+$30
0176 VDUCHR EQU 0 CHARACTER REGISTER
0177 VDUATT EQU 1 ATTRIBUTE REGISTER
0178 VDUCOL EQU 2 CURSOR COLUMN
0179 VDUROW EQU 3 CURSOR ROW
0180 VDUOFF EQU 4 ROW OFFSET
0181 *
0182 LINLEN EQU 80 LENGTH OF A LINE
0183 NUMLIN EQU 25 NUMBER OF LINES
0165 ENDIF ACIAOPT
0166 IFD MFDCOPT
0167 *
0168 ***************************************************
0169 * MINIFLOPPY DRIVE *
0170 ***************************************************
0171 *
0172 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0173 *
0174 E014 DRVFDC EQU MONIO+$14
0175 E018 CMDFDC EQU MONIO+$18
0176 E01A SECFDC EQU MONIO+$1A
0177 E01B DATFDC EQU MONIO+$1B
0178 ENDIF MFDCOPT
0179 IFD PS2OPT
0180 *
0181 ***************************************************
0182 * VDU8 PS/2 KEYBOARD PORT *
0183 ***************************************************
0184 *
0185 **************************************************
0186 * VDU8 DISPLAY DRIVER VARIABLES *
0187 **************************************************
0188 *
0189 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0190 COLADX RMB 1 CURSOR COLUMN
0191 ROWADX RMB 1 CURSOR ROW
0192 **************************************************
0193 *
0194 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0195 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0196 *
0197 ***************************************************
0198 * COMPACT FLASH EQUATES *
0199 ***************************************************
0200 *
0201 CF_BASE EQU MONIO+$40
0202 CF_DATA EQU CF_BASE+0
0203 CF_ERROR EQU CF_BASE+1 ; read error
0204 CF_FEATURE EQU CF_BASE+1 ; write feature
0205 CF_SECCNT EQU CF_BASE+2
0206 CF_SECNUM EQU CF_BASE+3
0207 CF_CYLLO EQU CF_BASE+4
0208 CF_CYLHI EQU CF_BASE+5
0209 CF_HEAD EQU CF_BASE+6
0210 CF_STATUS EQU CF_BASE+7 ; read status
0211 CF_COMAND EQU CF_BASE+7 ; write command
0212 *
0213 * Command Equates
0214 *
0215 CMDREAD EQU $20 ; Read Single sector
0216 CMDWRITE EQU $30 ; Write Single sector
0217 CMDFEATURE EQU $EF
0218 FEAT8BIT EQU $01 ; enable 8 bit transfers
0219 HEADLBA EQU $E0
0220 *
0221 * Status bit equates
0222 *
0223 BUSY EQU $80
0224 DRDY EQU $40
0225 DRQ EQU $08
0226 ERR EQU $01
0227 *
0228 ENDIF FPGAOPT
0228 ENDIF FPGAOPT
0229 *
0230 IFD RTCOPT
0231 *
0232 **************************************************
0233 * MM58167A REAL TIME CLOCK MEMORY MAP:
0234 **************************************************
0235 *
0236 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0237 *
0238 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0239 *
0240 * COUNTER AND COMPARITOR REGISTERS:
0241 *
0242 * Both the Clock Counter and Clock Comparitor
0243 * consist of 8 registers for holding the time.
0244 * The register offsets from the Counter and
0245 * Comparitor registers are listed above.
0185 ** KEYBOARD SITS ON PORT 2
0186 *
0187 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0188 ENDIF PS2OPT
0188 ENDIF PS2OPT
0189 IFD VDUOPT
0190 *
0191 ***************************************************
0192 * VDU8 DISPLAY DRIVER EQUATES *
0193 ***************************************************
0194 *
0195 ** VDU8 DISPLAY SITS ON PORT 3
0196 *
0197 VDU EQU MONIO+$30
0198 VDUCHR EQU 0 CHARACTER REGISTER
0199 VDUATT EQU 1 ATTRIBUTE REGISTER
0200 VDUCOL EQU 2 CURSOR COLUMN
0201 VDUROW EQU 3 CURSOR ROW
0202 VDUOFF EQU 4 ROW OFFSET
0203 *
0204 LINLEN EQU 80 LENGTH OF A LINE
0205 NUMLIN EQU 25 NUMBER OF LINES
0206 *
0207 **************************************************
0208 * VDU8 DISPLAY DRIVER VARIABLES *
0209 **************************************************
0210 *
0211 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0212 COLADX RMB 1 CURSOR COLUMN
0213 ROWADX RMB 1 CURSOR ROW
0214 **************************************************
0215 *
0216 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0217 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0218 ENDIF VDUOPT
0218 ENDIF VDUOPT
0219 IFD CFOPT
0220 *
0221 ***************************************************
0222 * COMPACT FLASH EQUATES *
0223 ***************************************************
0224 *
0225 ** COMPACT FLASH SITS AT PORT 4
0226 *
0227 CF_BASE EQU MONIO+$40
0228 CF_DATA EQU CF_BASE+0
0229 CF_ERROR EQU CF_BASE+1 ; read error
0230 CF_FEATURE EQU CF_BASE+1 ; write feature
0231 CF_SECCNT EQU CF_BASE+2
0232 CF_SECNUM EQU CF_BASE+3
0233 CF_CYLLO EQU CF_BASE+4
0234 CF_CYLHI EQU CF_BASE+5
0235 CF_HEAD EQU CF_BASE+6
0236 CF_STATUS EQU CF_BASE+7 ; read status
0237 CF_COMAND EQU CF_BASE+7 ; write command
0238 *
0239 * Command Equates
0240 *
0241 CMDREAD EQU $20 ; Read Single sector
0242 CMDWRITE EQU $30 ; Write Single sector
0243 CMDFEATURE EQU $EF
0244 FEAT8BIT EQU $01 ; enable 8 bit transfers
0245 HEADLBA EQU $E0
0246 *
0247 COUNTR EQU CLOCK+0
0248 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0249 *
0250 * CLOCK REGISTER OFFSETS:
0251 * These register offsets are used for the CLOCK
0252 * and comparitor ram CMPRAM.
0247 * Status bit equates
0248 *
0249 BUSY EQU $80
0250 DRDY EQU $40
0251 DRQ EQU $08
0252 ERR EQU $01
0253 *
0254 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0255 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0256 SECOND EQU 2
0257 MINUIT EQU 3
0258 HOUR EQU 4
0259 WKDAY EQU 5
0260 MTHDAY EQU 6
0261 MONTH EQU 7
0262 *
0263 * INTERRUPT OUTPUT REGISTERS:
0264 *
0265 * An interrupt output may be generated at the
0266 * following rates by setting the appropriate bit
0267 * in the Interrupt Control Register (CINTCR).
0268 * The Interrupt Status Register (CINTSR) must be
0269 * read to clear the interrupt and will return
0270 * the source of the interrupt.
0271 *
0272 * 1/Month Bit 7
0273 * 1/Week Bit 6
0274 * 1/Day Bit 5
0275 * 1/Hour Bit 4
0276 * 1/Minuite Bit 3
0277 * 1/Second Bit 2
0278 * 10/Second Bit 1
0279 * Comparitor Bit 0
0280 *
0281 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0282 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0283 *
0284 * COUNTER AND RAM RESETS; GO COMMAND.
0285 *
0286 * The counter and comparitor may be reset
0287 * by writing $FF into CTRRES and CMPRES
0288 * respectivly.
0289 * A write to the Go command register (GOCMND)
0290 * will reset the 1/1000ths, 1/100ths and 1/10ths
0291 * of a second counter.
0292 *
0293 CTRRES EQU CLOCK+18 COUNTER RESET
0294 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0295 GOCMND EQU CLOCK+21 GO COMMAND
0296 *
0297 * CLOCK STATUS REGISTER.
0298 *
0299 * The counter takes 61 usec. to rollover for
0300 * every 1KHz clock pulse. If the Status bit is
0301 * set after reading the counter, the counter
0302 * should be re-read to ensure the time is correct.
0303 *
0304 CLKSTA EQU CLOCK+20 STATUS BIT
0305 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0306 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0307 ENDIF RTCOPT
0307 ENDIF RTCOPT
0308 *
0309 IFD ADSOPT
0310 *
0311 ***************************************************
0312 * SERIAL PORT FOR DG640 *
0313 ***************************************************
0314 *
0315 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0316 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0317 *
0318 ACIAS EQU MONIO+$400 CONTROL PORT
0319 *
0320 *
0321 ***************************************************
0322 * PRINTER INTERFACE *
0323 ***************************************************
0254 ENDIF CFOPT
0254 ENDIF CFOPT
0255 *
0256 IFD RTCOPT
0257 *
0258 **************************************************
0259 * MM58167A REAL TIME CLOCK MEMORY MAP:
0260 **************************************************
0261 *
0262 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0263 *
0264 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0265 *
0266 * COUNTER AND COMPARITOR REGISTERS:
0267 *
0268 * Both the Clock Counter and Clock Comparitor
0269 * consist of 8 registers for holding the time.
0270 * The register offsets from the Counter and
0271 * Comparitor registers are listed above.
0272 *
0273 COUNTR EQU CLOCK+0
0274 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0275 *
0276 * CLOCK REGISTER OFFSETS:
0277 * These register offsets are used for the CLOCK
0278 * and comparitor ram CMPRAM.
0279 *
0280 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0281 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0282 SECOND EQU 2
0283 MINUIT EQU 3
0284 HOUR EQU 4
0285 WKDAY EQU 5
0286 MTHDAY EQU 6
0287 MONTH EQU 7
0288 *
0289 * INTERRUPT OUTPUT REGISTERS:
0290 *
0291 * An interrupt output may be generated at the
0292 * following rates by setting the appropriate bit
0293 * in the Interrupt Control Register (CINTCR).
0294 * The Interrupt Status Register (CINTSR) must be
0295 * read to clear the interrupt and will return
0296 * the source of the interrupt.
0297 *
0298 * 1/Month Bit 7
0299 * 1/Week Bit 6
0300 * 1/Day Bit 5
0301 * 1/Hour Bit 4
0302 * 1/Minuite Bit 3
0303 * 1/Second Bit 2
0304 * 10/Second Bit 1
0305 * Comparitor Bit 0
0306 *
0307 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0308 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0309 *
0310 * COUNTER AND RAM RESETS; GO COMMAND.
0311 *
0312 * The counter and comparitor may be reset
0313 * by writing $FF into CTRRES and CMPRES
0314 * respectivly.
0315 * A write to the Go command register (GOCMND)
0316 * will reset the 1/1000ths, 1/100ths and 1/10ths
0317 * of a second counter.
0318 *
0319 CTRRES EQU CLOCK+18 COUNTER RESET
0320 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0321 GOCMND EQU CLOCK+21 GO COMMAND
0322 *
0323 * CLOCK STATUS REGISTER.
0324 *
0325 PADATA EQU MONIO+$404
0326 PACTRL EQU MONIO+$405
0327 PBDATA EQU MONIO+$406
0328 PBCTRL EQU MONIO+$407
0325 * The counter takes 61 usec. to rollover for
0326 * every 1KHz clock pulse. If the Status bit is
0327 * set after reading the counter, the counter
0328 * should be re-read to ensure the time is correct.
0329 *
0330 ** CB1 ACK. I/P
0331 ** CB2 STB. O/P
0332 ** PB0 - PB7 DATA 1 - 8 O/P
0333 ** PORT A BIT ASSIGNMENT
0334 *
0335 PBUSY EQU $80 I/P
0336 PEMPTY EQU $40 I/P
0337 SELECT EQU $20 I/P
0338 PERROR EQU $10 I/P
0339 PRESET EQU %00000100 O/P PA3 = 0
0340 AUTOFD EQU %00001000 O/P PA2 = 0
0341 DIRMSK EQU %00001100
0330 CLKSTA EQU CLOCK+20 STATUS BIT
0331 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0332 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0333 ENDIF RTCOPT
0333 ENDIF RTCOPT
0334 *
0335 IFD TRAOPT
0336 *
0337 **************************************************
0338 * PIA INTERRUPT TIMER
0339 **************************************************
0340 *
0341 ** PIA INTERRUPT TIMER SITS ON PORT 7
0342 *
0343 ***************************************************
0344 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0345 ***************************************************
0346 *
0347 ** VIDEO DISPLAY DEFINITIONS
0348 *
0349 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0350 LINLEN EQU 64 LENGTH OF A LINE
0351 NUMLIN EQU 16 NUMBER OF LINES
0352 SCNLEN EQU $400 LENGTH OF SCREEN
0353 *
0354 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0355 COLADX RMB 1 CURSOR COLUMN
0356 ROWADX RMB 1 CURSOR ROW
0357 *************************************************
0358 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0359 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0360 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0361 ENDIF ADSOPT
0361 ENDIF ADSOPT
0362 *
0363 IFD DMAFOPT
0364 *
0365 ***************************************************
0366 * DMAF2 8" DRIVE *
0367 ***************************************************
0368 *
0369 F000 ADDREG EQU $F000 ADDRESS REGISTER
0370 F002 CNTREG EQU $F002 COUNT REGISTER
0371 F010 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0372 F014 PRIREG EQU $F014 DMA PRIORITY REGISTER
0373 F015 AAAREG EQU $F015 ???
0374 F016 BBBREG EQU $F016 ???
0375 F020 COMREG EQU $F020 1791 COMMAND REGISTER
0376 F022 SECREG EQU $F022 SECTOR REGISTER
0377 F024 DRVREG EQU $F024 DRIVE SELECT LATCH
0378 F040 CCCREG EQU $F040 ???
0379 ENDIF DMAFOPT
0380 IFD DATOPT
0381 **************************************************
0382 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0383 **************************************************
0384 *
0385 FFF0 IC11 EQU $FFF0 DAT RAM CHIP
0386 55AA TSTPAT EQU $55AA TEST PATTERN
0387 ENDIF DATOPT
0388 *
0389 ***************************************************
0390 * START OF ROM *
0391 ***************************************************
0392 *
0393 F800 ORG MONROM
0394 F800 F8 14 FDB MONITOR
0395 F802 F8 61 FDB NEXTCMD
0396 F804 FD 29 FDB INCH
0397 F806 FD 23 FDB INCHE
0398 F808 FD 38 FDB INCHEK
0399 F80A FD 46 FDB OUTCH
0400 F80C FC 17 FDB PDATA
0401 F80E FB A6 FDB PCRLF
0402 F810 FB A2 FDB PSTRNG
0403 F812 FA B6 FDB LRA
0404 *
0405 IFD ADSOPT
0406 FDB PCHK CHECK FOR PRINTER INPUT
0407 FDB PINIZ INITIATE PRINTER
0408 FDB POUTCH OUTPUT CH. TO PRINTER
0409 FDB VINIZ
0410 FDB VOUTCH
0411 FDB ACINIZ
0412 FDB AOUTCH
0413 ENDIF ADSOPT
0413 ENDIF ADSOPT
0414 *
0415 * MONITOR
0416 *
0417 * VECTOR ADDRESS STRING IS.....
0418 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0419 *
0420 F814 8E FD A3 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0421 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0422 F81B C6 10 LDB #$10 BYTES TO MOVE = 16
0423 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0424 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0425 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0426 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0427 *
0428 * CONTENTS FROM TO FUNCTION
0429 * $F8A1 $FE40 $DFC0 USER-V
0430 * $F8A1 $FE42 $DFC2 SWI3-V
0431 * $F8A1 $FE44 $DFC4 SWI2-V
0432 * $F8A1 $FE46 $DFC6 FIRQ-V
0433 * $F8A1 $FE48 $DFC8 IRQ-V
0434 * $FAB0 $FE4A $DFCA SWI-V
0435 * $FFFF $FE4C $DFCC SVC-VO
0436 * $FFFF $FE4E $DFCE SVC-VL
0437 *
0438 F824 8E E0 00 LDX #ACIAS
0439 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM
0440 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0441 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0442 F82F 6F E2 CLRSTK CLR ,-S
0443 F831 5A DECB
0444 F832 26 FB BNE CLRSTK
0445 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0446 F837 AF 6A STX 10,S ON STACK
0447 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0448 F83B A7 E4 STA ,S
0449 F83D 1F 43 TFR S,U
0450 F83F 17 05 15 LBSR IOINIZ INITIALIZE CONTROL PORT
0451 F842 8E FD B3 LDX #MSG1 POINT TO MONITOR MESSAGE
0452 F845 17 03 CF LBSR PDATA PRINT MSG
0453 *
0454 IFD DATOPT
0455 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0456 F84B 4F CLRA START TOTAL AT ZERO
0457 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0458 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0459 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0460 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL
0461 F854 19 DAA ADJ. TOTAL FOR DECIMAL
0462 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0463 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM
0464 F858 17 04 94 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0465 F85B 8E FD D3 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0466 F85E 17 03 B6 LBSR PDATA PRINT MSG
0467 ENDIF DATOPT
0468 *
0469 ***** NEXTCMD *****
0470 *
0471 F861 8E FD DA NEXTCMD LDX #MSG3 POINT TO MSG ">"
0472 F864 17 03 3B LBSR PSTRNG PRINT MSG
0473 F867 17 04 BF LBSR INCH GET ONE CHAR. FROM TERMINAL
0474 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0475 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0476 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0477 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0478 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0479 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0480 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0481 F878 17 04 CB LBSR OUTCH PRINT "^"
0482 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0483 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0484 F87F 17 04 C4 PRTCMD LBSR OUTCH PRNT CMD CHAR
0485 F882 17 04 BF LBSR OUT1S PRNT SPACE
0486 F885 C1 60 CMPB #$60
0487 F887 2F 02 BLE NXTCH0
0488 F889 C0 20 SUBB #$20
0489 *
0490 ***** DO TABLE LOOKUP *****
0491 * FOR COMMAND FUNCTIONS
0343 ** PIA TIMER FOR SINGLE STEP / TRACE
0344 *
0345 * TADATA = Output = Timer preset register
0346 * TACTRL - CA1 = input = rising edge = NMI
0347 * - CA2 = Output = Timer Reset (Active High)
0348 * TBDATA = Input = Timer read back register
0349 * TBCTRL - CB1 = input = rising edge = FIRQ
0350 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0351 *
0352 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0353 * CRA1 = 1 CA1 Rising edge IRQ
0354 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0355 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0356 * CRA4 = 1 ] CA2 = Set/Reset output
0357 * CRA5 = 1 ]
0358 * CRA6 = X CA2 Input Interrupt Flag
0359 * CRA7 = X CA1 Interrupt Flag
0360 *
0361 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0362 * CRB1 = 1 CB1 Rising edge IRQ
0363 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0364 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0365 * CRB4 = 1 ] CB2 = Set/Reset output
0366 * CRB5 = 1 ]
0367 * CRB6 = X CB2 Input Interrupt Flag
0368 * CRB7 = X CB1 Interrupt Flag
0369 *
0370 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0371 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0372 *
0373 TADATA EQU MONIO+$70 Timer preset port
0374 TACTRL EQU MONIO+$71
0375 TBDATA EQU MONIO+$72 Timer read back port
0376 TBCTRL EQU MONIO+$73
0377 *
0378 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0379 *
0380 ENDIF TRAOPT
0380 ENDIF TRAOPT
0381 IFD ADSOPT
0382 *
0383 ***************************************************
0384 * SERIAL PORT FOR DG640 *
0385 ***************************************************
0386 *
0387 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0388 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0389 *
0390 ACIAS EQU MONIO+$400 CONTROL PORT
0391 *
0392 ENDIF ADSOPT
0392 ENDIF ADSOPT
0393 IFD PRTOPT
0394 *
0395 ***************************************************
0396 * PRINTER INTERFACE *
0397 ***************************************************
0398 *
0399 PADATA EQU MONIO+$404
0400 PACTRL EQU MONIO+$405
0401 PBDATA EQU MONIO+$406
0402 PBCTRL EQU MONIO+$407
0403 *
0404 ** CB1 ACK. I/P
0405 ** CB2 STB. O/P
0406 ** PB0 - PB7 DATA 1 - 8 O/P
0407 ** PORT A BIT ASSIGNMENT
0408 *
0409 PBUSY EQU $80 I/P
0410 PEMPTY EQU $40 I/P
0411 SELECT EQU $20 I/P
0412 PERROR EQU $10 I/P
0413 PRESET EQU %00000100 O/P PA3 = 0
0414 AUTOFD EQU %00001000 O/P PA2 = 0
0415 DIRMSK EQU %00001100
0416 ENDIF PRTOPT
0416 ENDIF PRTOPT
0417 IFD DG640OPT
0418 *
0419 ***************************************************
0420 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0421 ***************************************************
0422 *
0423 ** VIDEO DISPLAY DEFINITIONS
0424 *
0425 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0426 LINLEN EQU 64 LENGTH OF A LINE
0427 NUMLIN EQU 16 NUMBER OF LINES
0428 SCNLEN EQU $400 LENGTH OF SCREEN
0429 *
0430 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0431 COLADX RMB 1 CURSOR COLUMN
0432 ROWADX RMB 1 CURSOR ROW
0433 *************************************************
0434 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0435 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0436 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0437 ENDIF DG640OPT
0437 ENDIF DG640OPT
0438 *
0439 IFD DMAFOPT
0440 *
0441 ***************************************************
0442 * DMAF2 8" DRIVE *
0443 ***************************************************
0444 *
0445 F000 ADDREG EQU $F000 ADDRESS REGISTER
0446 F002 CNTREG EQU $F002 COUNT REGISTER
0447 F010 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0448 F014 PRIREG EQU $F014 DMA PRIORITY REGISTER
0449 F015 AAAREG EQU $F015 ???
0450 F016 BBBREG EQU $F016 ???
0451 F020 COMREG EQU $F020 1791 COMMAND REGISTER
0452 F022 SECREG EQU $F022 SECTOR REGISTER
0453 F024 DRVREG EQU $F024 DRIVE SELECT LATCH
0454 F040 CCCREG EQU $F040 ???
0455 ENDIF DMAFOPT
0456 IFD DATOPT
0457 **************************************************
0458 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0459 **************************************************
0460 *
0461 FFF0 IC11 EQU $FFF0 DAT RAM CHIP
0462 55AA TSTPAT EQU $55AA TEST PATTERN
0463 ENDIF DATOPT
0464 *
0465 ***************************************************
0466 * START OF ROM *
0467 ***************************************************
0468 *
0469 F800 ORG MONROM
0470 F800 F8 14 FDB MONITOR
0471 F802 F8 61 FDB NEXTCMD
0472 F804 FD 29 FDB INCH
0473 F806 FD 23 FDB INCHE
0474 F808 FD 38 FDB INCHEK
0475 F80A FD 46 FDB OUTCH
0476 F80C FC 17 FDB PDATA
0477 F80E FB A6 FDB PCRLF
0478 F810 FB A2 FDB PSTRNG
0479 F812 FA B6 FDB LRA
0480 *
0481 IFD ADSOPT
0482 FDB PCHK CHECK FOR PRINTER INPUT
0483 FDB PINIZ INITIATE PRINTER
0484 FDB POUTCH OUTPUT CH. TO PRINTER
0485 FDB VINIZ
0486 FDB VOUTCH
0487 FDB ACINIZ
0488 FDB AOUTCH
0489 ENDIF ADSOPT
0489 ENDIF ADSOPT
0490 *
0491 * MONITOR
0492 *
0493 F88B 8E FD 6A NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0494 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0495 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0496 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0497 F894 8C FD A3 CMPX #TABEND REACHED END OF TABLE YET ?
0498 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0499 F899 8E FD DC LDX #MSG4 POINT TO MSG "WHAT?"
0500 F89C 17 03 78 LBSR PDATA PRINT MSG
0501 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0502 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0503 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0504 *
0505 * "G" GO OR CONTINUE
0506 *
0507 F8A5 1F 34 GO TFR U,S
0508 F8A7 3B RTI RTI
0509 *
0510 ***** "M" MEMORY EXAMINE AND CHANGE *****
0511 *
0512 F8A8 17 03 F3 MEMCHG LBSR IN1ADR INPUT ADDRESS
0513 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN
0514 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y"
0515 F8AF 8E FD E2 MEMC2 LDX #MSG5 POINT TO MSG " - "
0516 F8B2 17 02 ED LBSR PSTRNG PRINT MSG
0517 F8B5 1F 21 TFR Y,X FETCH ADDRESS
0518 F8B7 17 04 2D LBSR OUT4H PRINT ADDR IN HEX
0519 F8BA 17 04 87 LBSR OUT1S OUTPUT SPACE
0520 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0521 F8BF 17 04 2D LBSR OUT2H OUTPUT CONTENTS IN ASCII
0522 F8C2 17 04 7F LBSR OUT1S OUTPUT SPACE
0523 F8C5 17 03 E6 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0524 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0525 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0526 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0527 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0528 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0529 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW?
0530 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0531 F8D6 81 0D CMPA #$D IS IT A CR?
0532 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE
0533 F8DA 39 CHRTN RTS EXIT ROUTINE
0534 *
0535 *
0536 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0537 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0538 F8DF 27 08 BEQ FORWRD $F972
0539 F8E1 17 04 60 LBSR OUT1S OUTPUT SPACE
0540 F8E4 86 3F LDA #'? LOAD QUESTION MARK
0541 F8E6 17 04 5D LBSR OUTCH PRINT IT
0542 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0543 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0544 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0545 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0546 *
0547 * "S" DISPLAY STACK
0548 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0549 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0493 * VECTOR ADDRESS STRING IS.....
0494 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0495 *
0496 F814 8E FD A3 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0497 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0498 F81B C6 10 LDB #$10 BYTES TO MOVE = 16
0499 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0500 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0501 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0502 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0503 *
0504 * CONTENTS FROM TO FUNCTION
0505 * $F8A1 $FE40 $DFC0 USER-V
0506 * $F8A1 $FE42 $DFC2 SWI3-V
0507 * $F8A1 $FE44 $DFC4 SWI2-V
0508 * $F8A1 $FE46 $DFC6 FIRQ-V
0509 * $F8A1 $FE48 $DFC8 IRQ-V
0510 * $FAB0 $FE4A $DFCA SWI-V
0511 * $FFFF $FE4C $DFCC SVC-VO
0512 * $FFFF $FE4E $DFCE SVC-VL
0513 *
0514 F824 8E E0 00 LDX #ACIAS
0515 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM
0516 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0517 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0518 F82F 6F E2 CLRSTK CLR ,-S
0519 F831 5A DECB
0520 F832 26 FB BNE CLRSTK
0521 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0522 F837 AF 6A STX 10,S ON STACK
0523 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0524 F83B A7 E4 STA ,S
0525 F83D 1F 43 TFR S,U
0526 F83F 17 05 15 LBSR IOINIZ INITIALIZE CONTROL PORT
0527 F842 8E FD B3 LDX #MSG1 POINT TO MONITOR MESSAGE
0528 F845 17 03 CF LBSR PDATA PRINT MSG
0529 *
0530 IFD DATOPT
0531 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0532 F84B 4F CLRA START TOTAL AT ZERO
0533 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0534 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0535 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0536 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL
0537 F854 19 DAA ADJ. TOTAL FOR DECIMAL
0538 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0539 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM
0540 F858 17 04 94 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0541 F85B 8E FD D3 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0542 F85E 17 03 B6 LBSR PDATA PRINT MSG
0543 ENDIF DATOPT
0544 *
0545 IFD TRAOPT
0546 LBSR TRAINZ
0547 ENDIF TRAOPT
0547 ENDIF TRAOPT
0548 *
0549 ***** NEXTCMD *****
0550 *
0551 F8F1 17 03 2A DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0552 F8F4 1F 32 TFR U,Y
0553 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0554 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK
0555 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0556 *
0557 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0558 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0559 * UPPER ADDRESS IN X-REG.
0560 * IF HEX ADDRESSES ARE INVALID (V)=1.
0561 *
0562 F8FD 17 03 93 MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0563 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0564 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0565 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0566 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0567 F908 39 EDPRTN RTS ;
0568 *
0569 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0570 * TO EVEN 16 BYTE BOUNDRIES.
0571 *
0572 * IF LOWER ADDR = $4532
0573 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0574 *
0575 * IF UPPER ADDR = $4567
0576 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0577 *
0578 * ENTER WITH LOWER ADDRESS IN X-REG.
0579 * -UPPER ADDRESS ON TOP OF STACK.
0580 *
0581 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0582 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0583 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0584 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0585 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0586 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0587 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0588 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0589 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0590 F91C 17 04 19 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0591 F91F 27 03 BEQ EDUMP
0592 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0593 F923 39 RTS ;
0594 *
0595 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0596 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0597 *
0598 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0599 F926 8E FD E2 LDX #MSG5 POINT TO MSG " - "
0600 F929 17 02 76 LBSR PSTRNG PRINT MSG
0601 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0602 F92E 17 03 B6 LBSR OUT4H PRINT THE ADDRESS
0603 F931 17 04 0E LBSR OUT2S 2 SPACES
0604 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0605 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0606 F938 17 03 B4 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0607 F93B 17 04 06 LBSR OUT1S OUTPUT SPACE
0608 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT
0609 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0610 *
0611 * PRINT 16 ASCII CHARACTERS
0612 * IF NOT PRINTABLE OR NOT VALID
0613 * ASCII PRINT A PERIOD (.)
0614 F941 17 03 FE LBSR OUT2S 2 SPACES
0615 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0616 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0617 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0618 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0619 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0620 F94E 81 7E CMPA #$7E IS IT VALID ASCII?
0621 F950 23 02 BLS PRASC IF SO PRINT IT
0622 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0623 F954 17 03 EF PRASC LBSR OUTCH PRINT ASCII CHARACTER
0624 F957 5A DECB DECREMENT COUNT
0625 F958 26 EE BNE EDPASC
0626 F95A 20 BC BRA NXTLIN
0627 *
0628 ***** "B" SET BREAKPOINT *****
0629 *
0630 F95C 17 03 3F BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0631 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0632 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0633 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0634 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0635 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0636 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0637 F96D 35 10 PULS X POP BP ADDRESS FROM STACK
0638 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0639 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0640 F973 81 3F CMPA #$3F IS IT A SWI?
0641 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0642 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0643 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0644 F97B 86 3F LDA #$3F LOAD A SWI ($3F)
0645 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0646 F97F 39 EXITBP RTS ;
0647 *
0648 * INDICATE ERROR SETTING BREAKPOINT
0649 *
0650 F980 17 03 C1 BPERR LBSR OUT1S OUTPUT SPACE
0651 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0652 F985 16 03 BE LBRA OUTCH PRINT "?"
0653 *
0654 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0655 *
0656 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0657 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0658 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0659 F990 5A DECB $FAAC DECREMENT BP COUNTER
0660 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0661 F993 39 RTS
0662 *
0663 ***** SWI ENTRY POINT *****
0664 *
0665 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0666 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0667 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0668 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0669 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0670 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0671 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0672 F9A2 17 02 D0 REGPR LBSR REGSTR GO PRINT REGISTERS
0673 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0674 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0675 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0676 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0677 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS
0678 F9B1 81 3F CMPA #$3F IS IT SWI?
0679 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0680 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0681 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0682 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0683 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0684 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0685 F9BF A7 A0 STA ,Y+
0686 F9C1 39 RTS
0687 *
0688 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0689 *
0690 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0691 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0692 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0693 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0694 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0695 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0696 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0697 F9D1 39 RTS ;
0698 *
0699 *
0700 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0701 F9D4 39 RTS
0702 *
0703 IFD MFDCOPT
0704 *
0705 ** "U" MINI DISK BOOT
0706 *
0707 F9D5 7D E0 18 MINBOOT TST CMDFDC
0708 F9D8 7F E0 14 CLR DRVFDC
0709 F9DB 8E 00 00 LDX #$0000
0710 F9DE 30 01 LOOP LEAX $01,X
0711 F9E0 8C 00 00 CMPX #$0000
0712 F9E3 26 F9 BNE LOOP
0713 F9E5 86 0F LDA #$0F
0714 F9E7 B7 E0 18 STA CMDFDC
0715 F9EA 8D 37 BSR DELAY
0716 F9EC F6 E0 18 LOOP1 LDB CMDFDC
0717 F9EF C5 01 BITB #$01
0718 F9F1 26 F9 BNE LOOP1
0719 F9F3 86 01 LDA #$01
0720 F9F5 B7 E0 1A STA SECFDC
0721 F9F8 8D 29 BSR DELAY
0722 F9FA 86 8C LDA #$8C
0723 F9FC B7 E0 18 STA CMDFDC
0724 F9FF 8D 22 BSR DELAY
0725 FA01 8E C0 00 LDX #$C000
0726 FA04 20 09 BRA LOOP3
0727 FA06 C5 02 LOOP2 BITB #$02
0728 FA08 27 05 BEQ LOOP3
0729 FA0A B6 E0 1B LDA DATFDC
0730 FA0D A7 80 STA ,X+
0731 FA0F F6 E0 18 LOOP3 LDB CMDFDC
0732 FA12 C5 01 BITB #$01
0733 FA14 26 F0 BNE LOOP2
0734 FA16 C5 2C BITB #$2C
0735 FA18 27 01 BEQ LOOP4
0736 FA1A 39 RTS
0737 *
0738 FA1B 8E C0 00 LOOP4 LDX #$C000
0739 FA1E AF 4A STX $0A,U
0740 FA20 1F 34 TFR U,S
0741 FA22 3B RTI
0742 *
0743 FA23 C6 04 DELAY LDB #$04
0744 FA25 5A LOOP5 DECB
0745 FA26 26 FD BNE LOOP5
0746 FA28 39 RTS
0747 ENDIF MFDCOPT
0748 *
0749 IFD DMAFOPT
0750 *
0751 *** "D" DISK BOOT FOR DMAF2 ***
0752 *
0753 FA29 86 DE DBOOT LDA #$DE
0754 FA2B B7 F0 24 STA DRVREG
0755 FA2E 86 FF LDA #$FF
0756 FA30 B7 F0 14 STA PRIREG $FAF8
0757 FA33 B7 F0 10 STA CCREG
0758 FA36 B7 F0 15 STA AAAREG
0759 FA39 B7 F0 16 STA BBBREG
0760 FA3C 7D F0 10 TST CCREG
0761 FA3F 86 D8 LDA #$D8
0762 FA41 B7 F0 20 STA COMREG
0763 FA44 17 00 96 LBSR DLY
0764 FA47 B6 F0 20 DBOOT0 LDA COMREG
0765 FA4A 2B FB BMI DBOOT0
0766 FA4C 86 09 LDA #$09
0767 FA4E B7 F0 20 STA COMREG
0768 FA51 17 00 89 LBSR DLY
0769 *
0770 FA54 B6 F0 20 DISKWT LDA COMREG FETCH DRIVE STATUS
0771 FA57 85 01 BITA #1 TEST BUSY BIT
0772 FA59 26 F9 BNE DISKWT LOOP UNTIL NOT BUSY
0773 *
0774 FA5B 85 10 BITA #$10
0775 FA5D 26 CA BNE DBOOT
0551 F861 8E FD DA NEXTCMD LDX #MSG3 POINT TO MSG ">"
0552 F864 17 03 3B LBSR PSTRNG PRINT MSG
0553 F867 17 04 BF LBSR INCH GET ONE CHAR. FROM TERMINAL
0554 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0555 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0556 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0557 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0558 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0559 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0560 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0561 F878 17 04 CB LBSR OUTCH PRINT "^"
0562 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0563 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0564 F87F 17 04 C4 PRTCMD LBSR OUTCH PRNT CMD CHAR
0565 F882 17 04 BF LBSR OUT1S PRNT SPACE
0566 F885 C1 60 CMPB #$60
0567 F887 2F 02 BLE NXTCH0
0568 F889 C0 20 SUBB #$20
0569 *
0570 ***** DO TABLE LOOKUP *****
0571 * FOR COMMAND FUNCTIONS
0572 *
0573 F88B 8E FD 6A NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0574 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0575 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0576 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0577 F894 8C FD A3 CMPX #TABEND REACHED END OF TABLE YET ?
0578 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0579 F899 8E FD DC LDX #MSG4 POINT TO MSG "WHAT?"
0580 F89C 17 03 78 LBSR PDATA PRINT MSG
0581 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0582 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0583 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0584 *
0585 * "G" GO OR CONTINUE
0586 *
0587 F8A5 1F 34 GO TFR U,S
0588 F8A7 3B RTI RTI
0589 *
0590 ***** "M" MEMORY EXAMINE AND CHANGE *****
0591 *
0592 F8A8 17 03 F3 MEMCHG LBSR IN1ADR INPUT ADDRESS
0593 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN
0594 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y"
0595 F8AF 8E FD E2 MEMC2 LDX #MSG5 POINT TO MSG " - "
0596 F8B2 17 02 ED LBSR PSTRNG PRINT MSG
0597 F8B5 1F 21 TFR Y,X FETCH ADDRESS
0598 F8B7 17 04 2D LBSR OUT4H PRINT ADDR IN HEX
0599 F8BA 17 04 87 LBSR OUT1S OUTPUT SPACE
0600 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0601 F8BF 17 04 2D LBSR OUT2H OUTPUT CONTENTS IN ASCII
0602 F8C2 17 04 7F LBSR OUT1S OUTPUT SPACE
0603 F8C5 17 03 E6 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0604 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0605 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0606 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0607 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0608 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0609 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW?
0610 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0611 F8D6 81 0D CMPA #$D IS IT A CR?
0612 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE
0613 F8DA 39 CHRTN RTS EXIT ROUTINE
0614 *
0615 *
0616 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0617 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0618 F8DF 27 08 BEQ FORWRD $F972
0619 F8E1 17 04 60 LBSR OUT1S OUTPUT SPACE
0620 F8E4 86 3F LDA #'? LOAD QUESTION MARK
0621 F8E6 17 04 5D LBSR OUTCH PRINT IT
0622 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0623 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0624 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0625 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0626 *
0627 * "S" DISPLAY STACK
0628 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0629 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0630 *
0631 F8F1 17 03 2A DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0632 F8F4 1F 32 TFR U,Y
0633 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0634 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK
0635 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0636 *
0637 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0638 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0639 * UPPER ADDRESS IN X-REG.
0640 * IF HEX ADDRESSES ARE INVALID (V)=1.
0641 *
0642 F8FD 17 03 93 MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0643 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0644 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0645 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0646 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0647 F908 39 EDPRTN RTS ;
0648 *
0649 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0650 * TO EVEN 16 BYTE BOUNDRIES.
0651 *
0652 * IF LOWER ADDR = $4532
0653 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0654 *
0655 * IF UPPER ADDR = $4567
0656 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0657 *
0658 * ENTER WITH LOWER ADDRESS IN X-REG.
0659 * -UPPER ADDRESS ON TOP OF STACK.
0660 *
0661 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0662 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0663 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0664 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0665 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0666 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0667 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0668 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0669 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0670 F91C 17 04 19 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0671 F91F 27 03 BEQ EDUMP
0672 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0673 F923 39 RTS ;
0674 *
0675 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0676 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0677 *
0678 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0679 F926 8E FD E2 LDX #MSG5 POINT TO MSG " - "
0680 F929 17 02 76 LBSR PSTRNG PRINT MSG
0681 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0682 F92E 17 03 B6 LBSR OUT4H PRINT THE ADDRESS
0683 F931 17 04 0E LBSR OUT2S 2 SPACES
0684 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0685 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0686 F938 17 03 B4 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0687 F93B 17 04 06 LBSR OUT1S OUTPUT SPACE
0688 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT
0689 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0690 *
0691 * PRINT 16 ASCII CHARACTERS
0692 * IF NOT PRINTABLE OR NOT VALID
0693 * ASCII PRINT A PERIOD (.)
0694 F941 17 03 FE LBSR OUT2S 2 SPACES
0695 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0696 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0697 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0698 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0699 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0700 F94E 81 7E CMPA #$7E IS IT VALID ASCII?
0701 F950 23 02 BLS PRASC IF SO PRINT IT
0702 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0703 F954 17 03 EF PRASC LBSR OUTCH PRINT ASCII CHARACTER
0704 F957 5A DECB DECREMENT COUNT
0705 F958 26 EE BNE EDPASC
0706 F95A 20 BC BRA NXTLIN
0707 *
0708 ***** "B" SET BREAKPOINT *****
0709 *
0710 F95C 17 03 3F BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0711 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0712 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0713 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0714 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0715 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0716 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0717 F96D 35 10 PULS X POP BP ADDRESS FROM STACK
0718 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0719 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0720 F973 81 3F CMPA #$3F IS IT A SWI?
0721 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0722 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0723 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0724 F97B 86 3F LDA #$3F LOAD A SWI ($3F)
0725 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0726 F97F 39 EXITBP RTS ;
0727 *
0728 * INDICATE ERROR SETTING BREAKPOINT
0729 *
0730 F980 17 03 C1 BPERR LBSR OUT1S OUTPUT SPACE
0731 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0732 F985 16 03 BE LBRA OUTCH PRINT "?"
0733 *
0734 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0735 *
0736 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0737 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0738 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0739 F990 5A DECB $FAAC DECREMENT BP COUNTER
0740 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0741 F993 39 RTS
0742 *
0743 ***** SWI ENTRY POINT *****
0744 *
0745 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0746 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0747 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0748 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0749 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0750 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0751 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0752 F9A2 17 02 D0 REGPR LBSR REGSTR GO PRINT REGISTERS
0753 *
0754 IFD TRAOPT
0755 LDX #0
0756 STX TRACNT
0757 ENDIF TRAOPT
0757 ENDIF TRAOPT
0758 *
0759 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0760 *
0761 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0762 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0763 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0764 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS
0765 F9B1 81 3F CMPA #$3F IS IT SWI?
0766 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0767 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0768 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0769 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0770 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0771 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0772 F9BF A7 A0 STA ,Y+
0773 F9C1 39 RTS
0774 *
0775 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0776 *
0777 FA5F 8E C0 00 LDX #$C000 LOGICAL ADDR. = $C000
0778 FA62 8D 52 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0779 FA64 8A 10 ORA #$10
0780 FA66 B7 F0 40 STA CCCREG
0781 FA69 1F 10 TFR X,D
0782 FA6B 43 COMA ;
0783 FA6C 53 COMB ;
0784 FA6D FD F0 00 STD ADDREG
0785 FA70 8E FE FF LDX #$FEFF LOAD DMA BYTE COUNT = $100
0786 FA73 BF F0 02 STX CNTREG STORE IN COUNT REGISTER
0787 FA76 86 FF LDA #$FF LOAD THE CHANNEL REGISTER
0788 FA78 B7 F0 10 STA CCREG
0789 FA7B 86 FE LDA #$FE SET CHANNEL 0
0790 FA7D B7 F0 14 STA PRIREG
0791 FA80 86 01 LDA #1 SET SECTOR TO "1"
0792 FA82 B7 F0 22 STA SECREG ISSUE COMMAND
0793 FA85 86 8C LDA #$8C SET SINGLE SECTOR READ
0794 FA87 B7 F0 20 STA COMREG ISSUE COMMAND
0795 FA8A 8D 51 BSR DLY
0796 *
0797 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0798 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0799 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0800 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0801 * IS STILL A ONE THE BOOT OPERATION WILL
0802 * BE STARTED OVER FROM THE BEGINING.
0803 *
0804 FA8C 5F CLRB ;
0805 FA8D 34 04 DBOOT1 PSHS B $FB55
0806 FA8F 5F CLRB ;
0807 FA90 7D F0 10 DBOOT2 TST CCREG
0808 FA93 2A 0A BPL DBOOT3
0809 FA95 5A DECB ;
0810 FA96 26 F8 BNE DBOOT2
0811 FA98 35 04 PULS B
0812 FA9A 5A DECB
0813 FA9B 26 F0 BNE DBOOT1
0814 FA9D 20 8A BRA DBOOT
0815 FA9F 35 04 DBOOT3 PULS B
0816 FAA1 B6 F0 20 LDA COMREG
0817 FAA4 85 1C BITA #$1C
0818 FAA6 27 01 BEQ DBOOT4
0819 FAA8 39 RTS ;
0820 *
0821 *
0822 FAA9 C6 DE DBOOT4 LDB #$DE
0823 FAAB F7 F0 24 STB DRVREG
0824 FAAE 8E C0 00 LDX #$C000
0825 FAB1 AF 4A STX 10,U
0826 FAB3 1F 34 TFR U,S $FB7B
0827 FAB5 3B RTI ;
0828 ENDIF DMAFOPT
0777 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0778 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0779 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0780 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0781 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0782 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0783 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0784 F9D1 39 RTS ;
0785 *
0786 *
0787 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0788 F9D4 39 RTS
0789 *
0790 IFD TRAOPT
0791 *
0792 ** TRACE from address AAAA BB bytes
0793 *
0794 TRACE LBSR ALTPC1 SET UP NEW PC
0795 BVS TREXIT ADDRESS ERROR, EXIT
0796 LBSR OUT1S
0797 LBSR IN1ADR Fetch Byte Count
0798 BVS TREXIT Byte Count error, EXIT
0799 STX TRACNT
0800 *
0801 LDX NMI Save NMI Vector
0802 STX NMISAV
0803 LDX #NMIE Set up NMI for Tracing
0804 STX NMI
0805 LBSR TRAINZ Initialise Hardware
0806 BRA TRACEG Start Trace
0807 TREXIT RTS
0808 *
0809 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0810 * CRA1 = 1 CA1 Rising edge IRQ
0811 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0812 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0813 * CRA4 = 1 ] CA2 = Set/Reset output
0814 * CRA5 = 1 ]
0815 * CRA6 = X CA2 Input Interrupt Flag
0816 * CRA7 = X CA1 Interrupt Flag
0817 *
0818 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0819 * CRB1 = 1 CB1 Rising edge IRQ
0820 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0821 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0822 * CRB4 = 1 ] CB2 = Set/Reset output
0823 * CRB5 = 1 ]
0824 * CRB6 = X CB2 Input Interrupt Flag
0825 * CRB7 = X CB1 Interrupt Flag
0826 *
0827 *
0828 ** TRACE NMI ENTRY POINT
0829 *
0830 IFD FPGAOPT
0831 *
0832 * COMPACT FLASH BOOT
0833 *
0834 CFBOOT BSR WAITRDY
0835 LDA #HEADLBA
0836 STA CF_HEAD
0837 BSR WAITRDY
0838 LDA #FEAT8BIT
0839 STA CF_FEATURE
0840 LDA #CMDFEATURE
0841 STA CF_COMAND
0842 BSR WAITRDY
0843 *
0844 * READ SECTORS FROM CF
0845 *
0846 CFREAD LDA #$01
0847 STA CF_SECCNT
0848 CLRA
0849 STA CF_SECNUM
0850 STA CF_CYLLO
0851 STA CF_CYLHI
0852 *
0853 LDA #CMDREAD ; IDE READ MULTIPLE
0854 STA CF_COMAND
0855 BSR WAITRDY
0856 LDX #$C000
0857 *
0858 * READ LOOP
0859 *
0860 RDLOOP BSR WAITDRQ
0861 LDA CF_DATA
0862 STA ,X+
0863 CMPX #$C200
0864 BNE RDLOOP
0865 *
0866 LDX #$C000
0867 STX $0A,U
0868 TFR U,S
0869 RTI
0870 *
0871 * WAIT UNTIL READY
0872 *
0873 WAITRDY LDA CF_STATUS
0874 BITA #BUSY
0875 BNE WAITRDY
0876 LDA CF_STATUS
0877 BITA #DRDY
0878 BEQ WAITRDY
0830 NMIE TFR S,U
0831 LDA #$36 Disable Interrupt, CA2 Low
0832 STA TACTRL
0833 LDA TADATA Clear Interrupt flag by reading data port
0834 *
0835 LBSR REGSTR DUMP REGISTERS
0836 *
0837 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0838 LDA ,X
0839 CMPA #$3F
0840 BEQ TRACEX EXIT ON SWI
0841 *
0842 LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0843 BEQ TRACEX YES, GO BACK TO THE MONITOR
0844 LEAX -1,X DECREMENT TRACE COUNT
0845 STX TRACNT
0846 *
0847 ** TRACE GO (RESUME SINGLE STEP)
0848 *
0849 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0850 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0851 STA TADATA
0852 LDA #$36 LOAD STROBE LOW
0853 STA TACTRL
0854 LDA TADATA CLEAR INTERRUPT
0855 LDA #$36 RELEASE RESET
0856 STA TBCTRL
0857 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0858 STA TACTRL
0859 RTI GO EXECUTE INSTRUCTION
0860 *
0861 TRACEX LDX NMISAV Restore NMI vector
0862 STX NMI
0863 LBRA NEXTCMD Jump back to the command loop.
0864 *
0865 ** TRACE HARDWARE INITIALISATION
0866 *
0867 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0868 STA TACTRL
0869 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0870 STA TBCTRL
0871 LDA #$FF PORTA = OUTPUT
0872 STA TADATA
0873 LDA #$00 PORTB = INPUT
0874 STA TBDATA
0875 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0876 STA TACTRL
0877 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0878 STA TBCTRL
0879 RTS
0880 *
0881 * WAIT FOR DATA REQUEST
0882 *
0883 WAITDRQ LDA CF_STATUS
0884 BITA #DRQ
0885 BEQ WAITDRQ
0886 RTS
0887 ENDIF FPGAOPT
0887 ENDIF FPGAOPT
0888 *
0889 IFD RTCOPT
0890 *
0891 * CLOCK INTER FACE UTILITY
0892 *
0893 * TIME <Hours> <Minuits> <Seconds>
0894 * If no argument is specified, the current time
0895 * will be displayed.
0896 *
0897 * READ A REGISTER FROM THE COUNTER.
0898 * The X Index rgister points to the register
0899 * to be read. The Status Register is checked
0900 * before and after the register is read before
0901 * returning a value in accumulator A
0902 *
0903 RDCLK TST CLKSTA
0904 BNE RDCLK
0905 RDCLK1 LDA 0,X
0906 TST CLKSTA
0907 BNE RDCLK1
0908 RTS
0909 *
0910 * MAIN PROGRAM:
0911 *
0912 TIMSET LDX #COUNTR POINT TO TIMER
0913 LBSR BYTE READ HOURS
0914 BVS SHOWTM NO ARG, DISP TIME
0915 STA HOUR,X
0916 LBSR OUT1S
0917 LBSR BYTE READ MINUITES
0918 BVS SHOWTM
0919 STA MINUIT,X
0920 LBSR OUT1S
0921 LBSR BYTE SECONDS.
0922 BVS SHOWTM
0923 STA SECOND,X
0924 *
0925 * DISPLAY CURRENT TIME
0926 *
0927 SHOWTM LBSR PCRLF
0928 LDX #COUNTR+HOUR
0929 LDB #3
0930 SHOWLP BSR RDCLK
0931 LBSR OUT2H
0932 LDA #':
0933 LBSR OUTCH
0934 LEAX -1,X
0935 DECB
0936 BNE SHOWLP
0937 RTS
0938 *
0939 * INITIATE CLOCK.
0940 * MASK INTERRUPTS.
0941 *
0942 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
0943 TST CINTSR CLEAR ANY INTERRUPTS
0944 RTS
0945 ENDIF RTCOPT
0945 ENDIF RTCOPT
0946 IFD DATOPT
0947 *
0948 ***** LRA LOAD REAL ADDRESS *****
0949 *
0950 * THE FOLLOWING CODE LOADS THE 20-BIT
0951 * PHYSICAL ADDRESS OF A MEMORY BYTE
0952 * INTO THE "A" AND "X" REGISTERS. THIS
0953 * ROUTINE IS ENTERED WITH THE LOGICAL
0954 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0955 * REGISTER. EXIT IS MADE WITH THE HIGH-
0956 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0957 * ADDRESS IN THE "A" REGISTER, AND THE
0958 * LOW-ORDER 16-BITS OF THE 20-BIT
0959 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0960 * ALL OTHER REGISTERS ARE PRESERVED.
0961 * THIS ROUTINE IS REQUIRED SINCE THE
0962 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0963 * PRESENT PHYSICAL ADDRESSES ON THE
0964 * SYSTEM BUS.
0965 *
0966 FAB6 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
0967 FAB8 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
0968 FABA 44 LSRA ;
0969 FABB 44 LSRA ADJ FOR INDEXED INTO
0970 FABC 44 LSRA CORRESPONDING LOCATION
0971 FABD 44 LSRA IN LRA TABLE
0972 FABE 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
0973 FAC2 E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
0974 FAC4 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
0975 FAC5 54 LSRB PHYSICAL ADDRESS.
0976 FAC6 54 LSRB EXTENDED MS 4-BITS ARE RETURNED
0977 FAC7 54 LSRB IN THE "A" ACCUMULATOR
0978 FAC8 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
0979 FACA E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
0980 FACC 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0981 FACD 58 ASLB ADJ DATA FOR RELOCATION IN X REG
0982 FACE 58 ASLB ;
0983 FACF 58 ASLB $FB97
0984 FAD0 58 ASLB ;
0985 FAD1 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
0986 FAD3 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
0987 FAD5 A7 62 STA 2,S SAVE IT IN X REG ON STACK
0988 FAD7 EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
0989 *
0990 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0991 FAD9 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
0992 * ON STACK
0993 FADB 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK
0994 ENDIF DATOPT
0995 *
0996 * DELAY LOOP
0997 *
0998 FADD 34 04 DLY PSHS B SAVE CONTENTS OF "B"
0999 FADF C6 20 LDB #$20 GET LOOP DELAY VALUE
1000 FAE1 5A SUB1 DECB SUBTRACT ONE FROM VALUE
1001 FAE2 26 FD BNE SUB1 LOOP UNTIL ZERO
1002 FAE4 35 84 PULS B,PC RESTORE CONTENTS OF "B"
1003 * RTS ;
1004 *
1005 ***** "L" LOAD MIKBUG TAPE *****
1006 *
1007 FAE6 BD FD 57 LOAD JSR ACINIZ
1008 FAE9 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
1009 FAEB 17 02 58 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
1010 FAEE 7F DF E2 CLR ECHO TURN OFF ECHO FLAG
1011 FAF1 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
1012 FAF4 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
1013 FAF6 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
1014 FAF8 17 02 23 LBSR ECHON
1015 FAFB 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
1016 FAFD 27 3D BEQ LOAD21 IF SO, EXIT LOAD
1017 FAFF 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
1018 FB01 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
1019 FB03 17 01 A8 LBSR BYTE INPUT BYTE COUNT
1020 FB06 34 02 PSHS A PUSH COUNT ON STACK
1021 FB08 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
1022 FB0A 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
1023 FB0D 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
1024 FB0F 34 10 PSHS X PUSH ADDR ON STACK
1025 FB11 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
1026 FB13 EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
1027 FB15 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
1028 FB17 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
1029 FB19 6A E4 DEC ,S ADDRESS BYTES.
1030 FB1B 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
1031 FB1D 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
1032 FB20 35 04 PULS B POP CHECKSUM FROM STACK
1033 FB22 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
1034 FB24 34 02 PSHS A PUSH DATA BYTE ON STACK
1035 FB26 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
1036 FB28 6A E4 DEC ,S DECREMENT BYTE COUNT 1
1037 FB2A 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
1038 FB2C A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
1039 FB2E 20 EB BRA LOAD10 GET NEXT DATA BYTE
1040 FB30 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
1041 FB31 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
1042 FB33 C1 FF CMPB #$FF CHECKSUM OK?
1043 FB35 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
1044 FB37 86 3F LDA #'? LOAD (?) ERROR INDICATOR
1045 FB39 17 02 0A LBSR OUTCH OUTPUT IT TO TERMINAL
1046 FB3C 73 DF E2 LOAD21 COM ECHO TURN ECHO ON
1047 FB3F 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
1048 FB41 16 02 02 LBRA OUTCH OUTPUT IT
1049 *
1050 ***** "P" PUNCH MIKBUG TAPE *****
1051 *
1052 FB44 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
1053 FB46 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
1054 FB49 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
1055 FB4B 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
1056 FB4D AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
1057 FB4F 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
1058 FB51 30 01 LEAX 1,X INCREMENT END ADDRESS
1059 FB53 AF E4 STX ,S STORE END ADDR ON STACK
1060 FB55 BD FD 57 JSR ACINIZ
1061 FB58 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
1062 FB5A 17 01 E9 LBSR OUTCH OUTPUT IT TO TERMINAL
1063 FB5D EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
1064 FB5F A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
1065 FB61 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
1066 FB63 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
1067 FB67 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
1068 FB69 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
1069 FB6B E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
1070 FB6D 8E FE 23 LDX #MSG20 POINT TO MSG "S1"
1071 FB70 17 00 2F LBSR PSTRNG PRINT MSG
1072 FB73 CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
1073 FB75 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
1074 FB77 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
1075 FB7A AE 62 LDX 2,S LOAD BEGIN ADDRESS
1076 FB7C 17 01 68 LBSR OUT4H PUNCH ADDRESS
1077 FB7F EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
1078 FB81 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
1079 FB83 EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
1080 FB85 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
1081 FB87 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
1082 FB8A 6A 64 DEC 4,S DECREMENT BYTE COUNT
1083 FB8C 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
1084 FB8E 53 COMB 1's COMPLIMENT CHECKSUM BYTE
1085 FB8F 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
1086 FB91 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
1087 FB94 AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
1088 FB96 AC E4 CMPX ,S COMPARE IT TO END ADDR
1089 FB98 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
1090 FB9A 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
1091 FB9C 17 01 A7 LBSR OUTCH OUTPUT IT
1092 FB9F 32 65 LEAS 5,S READJUST STACK POINTER
1093 FBA1 39 RTS ;
1094 *
1095 * PRINT STRING PRECEEDED BY A CR & LF.
1096 *
1097 FBA2 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1098 FBA4 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1099 *
1100 * PCRLF
1101 *
1102 FBA6 34 10 PCRLF PSHS X SAVE IX
1103 FBA8 8E FD D4 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1104 FBAB 17 00 69 LBSR PDATA PRINT MSG
1105 FBAE 35 90 PULS X,PC RESTORE IX & RETURN
1106 *
1107 * LONG BRANCHES TO COMMON ROUTINES
1108 *
1109 FBB0 16 01 91 JOUT1S LBRA OUT1S
1110 FBB3 16 00 F8 JBYTE LBRA BYTE
1111 FBB6 16 00 E5 JIN1ADR LBRA IN1ADR
1112 *
1113 * ALTER "PC" PROGRAM COUNTER
1114 *
1115 FBB9 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1116 FBBC 8D F2 BSR JOUT1S OUTPUT SPACE
1117 FBBE 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1118 FBC0 29 02 BVS ALTPCD EXIT IF INVALID HEX
1119 FBC2 AF 4A STX 10,U POKE IN NEW CONTENTS
1120 FBC4 39 ALTPCD RTS ;
1121 *
1122 * ALTER "U" USER STACK POINTER
1123 *
1124 FBC5 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1125 FBC7 8D E7 BSR JOUT1S OUTPUT SPACE
1126 FBC9 8D EB BSR JIN1ADR
1127 FBCB 29 02 BVS ALTUD
1128 FBCD AF 48 STX 8,U
1129 FBCF 39 ALTUD RTS ;
1130 *
1131 * ALTER "Y" INDEX REGISTER
1132 *
1133 FBD0 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1134 FBD2 8D DC BSR JOUT1S OUTPUT SPACE
1135 FBD4 8D E0 BSR JIN1ADR
1136 FBD6 29 02 BVS ALTYD
1137 FBD8 AF 46 STX 6,U $F8F0
1138 FBDA 39 ALTYD RTS ;
1139 *
1140 * ALTER "X" INDEX REGISTER
1141 *
1142 FBDB 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1143 FBDD 8D D1 BSR JOUT1S OUTPUT SPACE
1144 FBDF 8D D5 BSR JIN1ADR
1145 FBE1 29 02 BVS ALTXD
1146 FBE3 AF 44 STX 4,U
1147 FBE5 39 ALTXD RTS ;
1148 *
1149 * ALTER "DP" DIRECT PAGE REGISTER
1150 *
1151 FBE6 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1152 FBE8 8D C6 BSR JOUT1S OUTPUT SPACE
1153 FBEA 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1154 FBEC 29 02 BVS ALTDPD
1155 FBEE A7 43 STA 3,U
1156 FBF0 39 ALTDPD RTS ;
1157 *
1158 * ALTER "B" ACCUMULATOR
1159 *
1160 FBF1 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1161 FBF3 8D BB BSR JOUT1S OUTPUT SPACE
1162 FBF5 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1163 FBF7 29 02 BVS ALTBD
1164 FBF9 A7 42 STA 2,U
1165 FBFB 39 ALTBD RTS $F91C
1166 *
1167 * ALTER "A" ACCUMULATOR
0881 ENDIF TRAOPT
0881 ENDIF TRAOPT
0882 IFD MFDCOPT
0883 *
0884 ** "U" MINI DISK BOOT
0885 *
0886 F9D5 7D E0 18 MINBOOT TST CMDFDC
0887 F9D8 7F E0 14 CLR DRVFDC
0888 F9DB 8E 00 00 LDX #$0000
0889 F9DE 30 01 LOOP LEAX $01,X
0890 F9E0 8C 00 00 CMPX #$0000
0891 F9E3 26 F9 BNE LOOP
0892 F9E5 86 0F LDA #$0F
0893 F9E7 B7 E0 18 STA CMDFDC
0894 F9EA 8D 37 BSR DELAY
0895 F9EC F6 E0 18 LOOP1 LDB CMDFDC
0896 F9EF C5 01 BITB #$01
0897 F9F1 26 F9 BNE LOOP1
0898 F9F3 86 01 LDA #$01
0899 F9F5 B7 E0 1A STA SECFDC
0900 F9F8 8D 29 BSR DELAY
0901 F9FA 86 8C LDA #$8C
0902 F9FC B7 E0 18 STA CMDFDC
0903 F9FF 8D 22 BSR DELAY
0904 FA01 8E C0 00 LDX #$C000
0905 FA04 20 09 BRA LOOP3
0906 FA06 C5 02 LOOP2 BITB #$02
0907 FA08 27 05 BEQ LOOP3
0908 FA0A B6 E0 1B LDA DATFDC
0909 FA0D A7 80 STA ,X+
0910 FA0F F6 E0 18 LOOP3 LDB CMDFDC
0911 FA12 C5 01 BITB #$01
0912 FA14 26 F0 BNE LOOP2
0913 FA16 C5 2C BITB #$2C
0914 FA18 27 01 BEQ LOOP4
0915 FA1A 39 RTS
0916 *
0917 FA1B 8E C0 00 LOOP4 LDX #$C000
0918 FA1E AF 4A STX $0A,U
0919 FA20 1F 34 TFR U,S
0920 FA22 3B RTI
0921 *
0922 FA23 C6 04 DELAY LDB #$04
0923 FA25 5A LOOP5 DECB
0924 FA26 26 FD BNE LOOP5
0925 FA28 39 RTS
0926 ENDIF MFDCOPT
0927 *
0928 IFD DMAFOPT
0929 *
0930 *** "D" DISK BOOT FOR DMAF2 ***
0931 *
0932 FA29 86 DE DBOOT LDA #$DE
0933 FA2B B7 F0 24 STA DRVREG
0934 FA2E 86 FF LDA #$FF
0935 FA30 B7 F0 14 STA PRIREG $FAF8
0936 FA33 B7 F0 10 STA CCREG
0937 FA36 B7 F0 15 STA AAAREG
0938 FA39 B7 F0 16 STA BBBREG
0939 FA3C 7D F0 10 TST CCREG
0940 FA3F 86 D8 LDA #$D8
0941 FA41 B7 F0 20 STA COMREG
0942 FA44 17 00 96 LBSR DLY
0943 FA47 B6 F0 20 DBOOT0 LDA COMREG
0944 FA4A 2B FB BMI DBOOT0
0945 FA4C 86 09 LDA #$09
0946 FA4E B7 F0 20 STA COMREG
0947 FA51 17 00 89 LBSR DLY
0948 *
0949 FA54 B6 F0 20 DISKWT LDA COMREG FETCH DRIVE STATUS
0950 FA57 85 01 BITA #1 TEST BUSY BIT
0951 FA59 26 F9 BNE DISKWT LOOP UNTIL NOT BUSY
0952 *
0953 FA5B 85 10 BITA #$10
0954 FA5D 26 CA BNE DBOOT
0955 *
0956 FA5F 8E C0 00 LDX #$C000 LOGICAL ADDR. = $C000
0957 FA62 8D 52 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0958 FA64 8A 10 ORA #$10
0959 FA66 B7 F0 40 STA CCCREG
0960 FA69 1F 10 TFR X,D
0961 FA6B 43 COMA ;
0962 FA6C 53 COMB ;
0963 FA6D FD F0 00 STD ADDREG
0964 FA70 8E FE FF LDX #$FEFF LOAD DMA BYTE COUNT = $100
0965 FA73 BF F0 02 STX CNTREG STORE IN COUNT REGISTER
0966 FA76 86 FF LDA #$FF LOAD THE CHANNEL REGISTER
0967 FA78 B7 F0 10 STA CCREG
0968 FA7B 86 FE LDA #$FE SET CHANNEL 0
0969 FA7D B7 F0 14 STA PRIREG
0970 FA80 86 01 LDA #1 SET SECTOR TO "1"
0971 FA82 B7 F0 22 STA SECREG ISSUE COMMAND
0972 FA85 86 8C LDA #$8C SET SINGLE SECTOR READ
0973 FA87 B7 F0 20 STA COMREG ISSUE COMMAND
0974 FA8A 8D 51 BSR DLY
0975 *
0976 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0977 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0978 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0979 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0980 * IS STILL A ONE THE BOOT OPERATION WILL
0981 * BE STARTED OVER FROM THE BEGINING.
0982 *
0983 FA8C 5F CLRB ;
0984 FA8D 34 04 DBOOT1 PSHS B $FB55
0985 FA8F 5F CLRB ;
0986 FA90 7D F0 10 DBOOT2 TST CCREG
0987 FA93 2A 0A BPL DBOOT3
0988 FA95 5A DECB ;
0989 FA96 26 F8 BNE DBOOT2
0990 FA98 35 04 PULS B
0991 FA9A 5A DECB
0992 FA9B 26 F0 BNE DBOOT1
0993 FA9D 20 8A BRA DBOOT
0994 FA9F 35 04 DBOOT3 PULS B
0995 FAA1 B6 F0 20 LDA COMREG
0996 FAA4 85 1C BITA #$1C
0997 FAA6 27 01 BEQ DBOOT4
0998 FAA8 39 RTS ;
0999 *
1000 *
1001 FAA9 C6 DE DBOOT4 LDB #$DE
1002 FAAB F7 F0 24 STB DRVREG
1003 FAAE 8E C0 00 LDX #$C000
1004 FAB1 AF 4A STX 10,U
1005 FAB3 1F 34 TFR U,S $FB7B
1006 FAB5 3B RTI ;
1007 ENDIF DMAFOPT
1008 *
1009 IFD CFOPT
1010 *
1011 * COMPACT FLASH BOOT
1012 *
1013 CFBOOT BSR WAITRDY
1014 LDA #HEADLBA
1015 STA CF_HEAD
1016 BSR WAITRDY
1017 LDA #FEAT8BIT
1018 STA CF_FEATURE
1019 LDA #CMDFEATURE
1020 STA CF_COMAND
1021 BSR WAITRDY
1022 *
1023 * READ SECTORS FROM CF
1024 *
1025 CFREAD LDA #$01
1026 STA CF_SECCNT
1027 CLRA
1028 STA CF_SECNUM
1029 STA CF_CYLLO
1030 STA CF_CYLHI
1031 *
1032 LDA #CMDREAD ; IDE READ MULTIPLE
1033 STA CF_COMAND
1034 BSR WAITRDY
1035 LDX #$C000
1036 *
1037 * READ LOOP
1038 *
1039 RDLOOP BSR WAITDRQ
1040 LDA CF_DATA
1041 STA ,X+
1042 CMPX #$C200
1043 BNE RDLOOP
1044 *
1045 LDX #$C000
1046 STX $0A,U
1047 TFR U,S
1048 RTI
1049 *
1050 * WAIT UNTIL READY
1051 *
1052 WAITRDY LDA CF_STATUS
1053 BITA #BUSY
1054 BNE WAITRDY
1055 LDA CF_STATUS
1056 BITA #DRDY
1057 BEQ WAITRDY
1058 RTS
1059 *
1060 * WAIT FOR DATA REQUEST
1061 *
1062 WAITDRQ LDA CF_STATUS
1063 BITA #DRQ
1064 BEQ WAITDRQ
1065 RTS
1066 ENDIF CFOPT
1066 ENDIF CFOPT
1067 *
1068 IFD RTCOPT
1069 *
1070 * CLOCK INTER FACE UTILITY
1071 *
1072 * TIME <Hours> <Minuits> <Seconds>
1073 * If no argument is specified, the current time
1074 * will be displayed.
1075 *
1076 * READ A REGISTER FROM THE COUNTER.
1077 * The X Index rgister points to the register
1078 * to be read. The Status Register is checked
1079 * before and after the register is read before
1080 * returning a value in accumulator A
1081 *
1082 RDCLK TST CLKSTA
1083 BNE RDCLK
1084 RDCLK1 LDA 0,X
1085 TST CLKSTA
1086 BNE RDCLK1
1087 RTS
1088 *
1089 * MAIN PROGRAM:
1090 *
1091 TIMSET LDX #COUNTR POINT TO TIMER
1092 LBSR BYTE READ HOURS
1093 BVS SHOWTM NO ARG, DISP TIME
1094 STA HOUR,X
1095 LBSR OUT1S
1096 LBSR BYTE READ MINUITES
1097 BVS SHOWTM
1098 STA MINUIT,X
1099 LBSR OUT1S
1100 LBSR BYTE SECONDS.
1101 BVS SHOWTM
1102 STA SECOND,X
1103 *
1104 * DISPLAY CURRENT TIME
1105 *
1106 SHOWTM LBSR PCRLF
1107 LDX #COUNTR+HOUR
1108 LDB #3
1109 SHOWLP BSR RDCLK
1110 LBSR OUT2H
1111 LDA #':
1112 LBSR OUTCH
1113 LEAX -1,X
1114 DECB
1115 BNE SHOWLP
1116 RTS
1117 *
1118 * INITIATE CLOCK.
1119 * MASK INTERRUPTS.
1120 *
1121 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
1122 TST CINTSR CLEAR ANY INTERRUPTS
1123 RTS
1124 ENDIF RTCOPT
1124 ENDIF RTCOPT
1125 IFD DATOPT
1126 *
1127 ***** LRA LOAD REAL ADDRESS *****
1128 *
1129 * THE FOLLOWING CODE LOADS THE 20-BIT
1130 * PHYSICAL ADDRESS OF A MEMORY BYTE
1131 * INTO THE "A" AND "X" REGISTERS. THIS
1132 * ROUTINE IS ENTERED WITH THE LOGICAL
1133 * ADDRESS OF A MEMORY BYTE IN THE "IX"
1134 * REGISTER. EXIT IS MADE WITH THE HIGH-
1135 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
1136 * ADDRESS IN THE "A" REGISTER, AND THE
1137 * LOW-ORDER 16-BITS OF THE 20-BIT
1138 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
1139 * ALL OTHER REGISTERS ARE PRESERVED.
1140 * THIS ROUTINE IS REQUIRED SINCE THE
1141 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
1142 * PRESENT PHYSICAL ADDRESSES ON THE
1143 * SYSTEM BUS.
1144 *
1145 FAB6 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
1146 FAB8 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
1147 FABA 44 LSRA ;
1148 FABB 44 LSRA ADJ FOR INDEXED INTO
1149 FABC 44 LSRA CORRESPONDING LOCATION
1150 FABD 44 LSRA IN LRA TABLE
1151 FABE 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
1152 FAC2 E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
1153 FAC4 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
1154 FAC5 54 LSRB PHYSICAL ADDRESS.
1155 FAC6 54 LSRB EXTENDED MS 4-BITS ARE RETURNED
1156 FAC7 54 LSRB IN THE "A" ACCUMULATOR
1157 FAC8 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
1158 FACA E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
1159 FACC 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
1160 FACD 58 ASLB ADJ DATA FOR RELOCATION IN X REG
1161 FACE 58 ASLB ;
1162 FACF 58 ASLB $FB97
1163 FAD0 58 ASLB ;
1164 FAD1 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
1165 FAD3 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
1166 FAD5 A7 62 STA 2,S SAVE IT IN X REG ON STACK
1167 FAD7 EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
1168 *
1169 FBFC 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1170 FBFE 8D B0 BSR JOUT1S OUTPUT SPACE
1171 FC00 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1172 FC02 29 02 BVS ALTAD
1173 FC04 A7 41 STA 1,U
1174 FC06 39 ALTAD RTS ;
1175 *
1176 * ALTER "CC" REGISTER
1177 *
1178 FC07 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1179 FC09 8D A5 BSR JOUT1S OUTPUT SPACE
1180 FC0B 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1181 FC0D 29 04 BVS ALTCCD
1182 FC0F 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1183 FC11 A7 C4 STA ,U
1184 FC13 39 ALTCCD RTS ;
1169 * PLUS LS NIBBLE OF LOGICAL ADDRESS
1170 FAD9 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
1171 * ON STACK
1172 FADB 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK
1173 ENDIF DATOPT
1174 *
1175 * DELAY LOOP
1176 *
1177 FADD 34 04 DLY PSHS B SAVE CONTENTS OF "B"
1178 FADF C6 20 LDB #$20 GET LOOP DELAY VALUE
1179 FAE1 5A SUB1 DECB SUBTRACT ONE FROM VALUE
1180 FAE2 26 FD BNE SUB1 LOOP UNTIL ZERO
1181 FAE4 35 84 PULS B,PC RESTORE CONTENTS OF "B"
1182 * RTS ;
1183 *
1184 ***** "L" LOAD MIKBUG TAPE *****
1185 *
1186 * PDATA
1187 *
1188 FC14 17 01 2F PRINT LBSR OUTCH
1189 FC17 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1190 FC19 81 04 CMPA #4 IS IT EOT?
1191 FC1B 26 F7 BNE PRINT IF NOT EOT PRINT IT
1192 FC1D 39 RTS ;
1193 *
1194 * PRINT REGISTERS
1195 *
1196 FC1E 8E FD E6 PRTSP LDX #MSG10 POINT TO MSG "SP="
1197 FC21 8D F4 BSR PDATA PRINT MSG
1198 FC23 1F 31 TFR U,X
1199 FC25 16 00 BF JOUT4H LBRA OUT4H
1200 *
1201 FC28 8E FD F2 PRTUS LDX #MSG12 POINT TO MSG "US="
1202 FC2B 8D EA BSR PDATA PRINT MSG
1203 FC2D AE 48 LDX 8,U
1204 FC2F 20 F4 BRA JOUT4H
1205 *
1206 FC31 8E FE 04 PRTDP LDX #MSG15 POINT TO MSG "DP="
1207 FC34 8D E1 BSR PDATA PRINT MSG
1208 FC36 A6 43 LDA 3,U
1209 FC38 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1210 *
1211 FC3B 8E FD FE PRTIX LDX #MSG14 POINT TO MSG "IX="
1212 FC3E 8D D7 BSR PDATA PRINT MSG
1213 FC40 AE 44 LDX 4,U $FCE6
1214 FC42 20 E1 BRA JOUT4H
1215 *
1216 FC44 8E FD F8 PRTIY LDX #MSG13 POINT TO MSG "IY="
1217 FC47 8D CE BSR PDATA PRINT MSG
1218 FC49 AE 46 LDX 6,U
1219 FC4B 20 D8 BRA JOUT4H
1220 *
1221 FC4D 8E FD EC PRTPC LDX #MSG11 POINT TO MSG "PC="
1222 FC50 8D C5 BSR PDATA PRINT MSG
1223 FC52 AE 4A LDX 10,U
1224 FC54 20 CF BRA JOUT4H
1225 *
1226 FC56 8E FE 0A PRTA LDX #MSG16 POINT TO MSG "A="
1227 FC59 8D BC BSR PDATA PRINT MSG
1228 FC5B A6 41 LDA 1,U
1229 FC5D 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1230 *
1231 FC5F 8E FE 0F PRTB LDX #MSG17 POINT TO MSG "B="
1232 FC62 8D B3 BSR PDATA PRINT MSG
1233 FC64 A6 42 LDA 2,U
1234 FC66 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1235 *
1236 FC68 8E FE 14 PRTCC LDX #MSG18 POINT TO MSG "CC:"
1237 FC6B 8D AA BSR PDATA PRINT MSG
1238 FC6D A6 C4 LDA ,U
1239 FC6F 8E FE 1B LDX #MSG19 POINT TO MSG "EFHINZVC"
1240 FC72 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1241 *
1242 * "R" DISPLAY REGISTERS
1243 *
1244 FC75 8E FD E2 REGSTR LDX #MSG5 POINT TO MSG " - "
1245 FC78 17 FF 27 LBSR PSTRNG PRINT MSG
1246 FC7B 8D A1 BSR PRTSP $FCBF
1247 FC7D 8D A9 BSR PRTUS $FCCA
1248 FC7F 8D B0 BSR PRTDP $FCD5
1249 FC81 8D B8 BSR PRTIX $FCE0
1250 FC83 8D BF BSR PRTIY $FCEB
1251 FC85 8E FD E2 LDX #MSG5 POINT TO MSG " - "
1252 FC88 17 FF 17 LBSR PSTRNG PRINT MSG
1253 FC8B 8D C0 BSR PRTPC $FCF5
1254 FC8D 8D C7 BSR PRTA $FCFF
1255 FC8F 8D CE BSR PRTB $FD09
1256 FC91 20 D5 BRA PRTCC $FD13
1257 *
1258 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1259 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1260 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1261 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1262 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1263 * ADDRESS IS INPUT.
1264 *
1265 FC93 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1266 FC95 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1267 FC97 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1268 FC99 86 2D LDA #'-
1269 FC9B 17 00 A8 LBSR OUTCH PRINT " - "
1270 *
1271 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1272 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1273 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1274 *
1275 FC9E 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1276 FCA0 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1277 FCA2 1F 01 TFR D,X
1278 FCA4 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1279 FCA6 29 3C BVS NOTHEX
1280 FCA8 34 10 PSHS X
1281 FCAA A7 61 STA 1,S
1282 FCAC 35 90 PULS X,PC
1283 *
1284 ***** INPUT BYTE (2 HEX CHAR.) *****
1285 *
1286 FCAE 8D 11 BYTE BSR INHEX GET HEX LEFT
1287 FCB0 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1288 FCB2 48 ASLA ;
1289 FCB3 48 ASLA ;
1290 FCB4 48 ASLA ; SHIFT INTO LEFT NIBBLE
1291 FCB5 48 ASLA ;
1292 FCB6 1F 89 TFR A,B PUT HEXL IN "B"
1293 FCB8 8D 07 BSR INHEX GET HEX RIGHT
1294 FCBA 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1295 FCBC 34 04 PSHS B PUSH HEXL ON STACK
1296 FCBE AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1297 FCC0 39 RTS RETURN WITH HEX L&R IN "A"
1298 *
1299 *
1300 FCC1 8D 5B INHEX BSR ECHON INPUT ASCII CHAR.
1301 FCC3 81 30 CMPA #'0 IS IT > OR = "0" ?
1302 FCC5 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1303 FCC7 81 39 CMPA #'9 IS IT < OR = "9" ?
1304 FCC9 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1305 FCCB 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1306 FCCD 39 RTS ;
1307 *
1308 *
1309 FCCE 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1310 FCD0 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1311 FCD2 81 46 CMPA #'F IS IT < OR = "F" ?
1312 FCD4 22 03 BHI INHEXL IF > IT AIN'T HEX
1313 FCD6 80 37 SUBA #$37 ASCII ADJ. ALPHA
1314 FCD8 39 RTS ;
1315 *
1316 FCD9 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1317 FCDB 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1318 FCDD 81 66 CMPA #'f IS IT < "f"
1319 FCDF 22 03 BHI NOTHEX IF > IT AIN'T HEX
1320 FCE1 80 57 SUBA #$57 ADJUST TO LOWER CASE
1321 FCE3 39 RTS ;
1322 *
1323 *
1324 FCE4 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1325 FCE6 39 RTS ;
1326 *
1186 FAE6 BD FD 57 LOAD JSR ACINIZ
1187 FAE9 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
1188 FAEB 17 02 58 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
1189 FAEE 7F DF E2 CLR ECHO TURN OFF ECHO FLAG
1190 FAF1 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
1191 FAF4 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
1192 FAF6 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
1193 FAF8 17 02 23 LBSR ECHON
1194 FAFB 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
1195 FAFD 27 3D BEQ LOAD21 IF SO, EXIT LOAD
1196 FAFF 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
1197 FB01 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
1198 FB03 17 01 A8 LBSR BYTE INPUT BYTE COUNT
1199 FB06 34 02 PSHS A PUSH COUNT ON STACK
1200 FB08 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
1201 FB0A 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
1202 FB0D 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
1203 FB0F 34 10 PSHS X PUSH ADDR ON STACK
1204 FB11 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
1205 FB13 EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
1206 FB15 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
1207 FB17 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
1208 FB19 6A E4 DEC ,S ADDRESS BYTES.
1209 FB1B 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
1210 FB1D 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
1211 FB20 35 04 PULS B POP CHECKSUM FROM STACK
1212 FB22 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
1213 FB24 34 02 PSHS A PUSH DATA BYTE ON STACK
1214 FB26 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
1215 FB28 6A E4 DEC ,S DECREMENT BYTE COUNT 1
1216 FB2A 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
1217 FB2C A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
1218 FB2E 20 EB BRA LOAD10 GET NEXT DATA BYTE
1219 FB30 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
1220 FB31 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
1221 FB33 C1 FF CMPB #$FF CHECKSUM OK?
1222 FB35 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
1223 FB37 86 3F LDA #'? LOAD (?) ERROR INDICATOR
1224 FB39 17 02 0A LBSR OUTCH OUTPUT IT TO TERMINAL
1225 FB3C 73 DF E2 LOAD21 COM ECHO TURN ECHO ON
1226 FB3F 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
1227 FB41 16 02 02 LBRA OUTCH OUTPUT IT
1228 *
1229 ***** "P" PUNCH MIKBUG TAPE *****
1230 *
1231 FB44 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
1232 FB46 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
1233 FB49 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
1234 FB4B 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
1235 FB4D AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
1236 FB4F 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
1237 FB51 30 01 LEAX 1,X INCREMENT END ADDRESS
1238 FB53 AF E4 STX ,S STORE END ADDR ON STACK
1239 FB55 BD FD 57 JSR ACINIZ
1240 FB58 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
1241 FB5A 17 01 E9 LBSR OUTCH OUTPUT IT TO TERMINAL
1242 FB5D EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
1243 FB5F A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
1244 FB61 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
1245 FB63 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
1246 FB67 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
1247 FB69 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
1248 FB6B E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
1249 FB6D 8E FE 23 LDX #MSG20 POINT TO MSG "S1"
1250 FB70 17 00 2F LBSR PSTRNG PRINT MSG
1251 FB73 CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
1252 FB75 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
1253 FB77 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
1254 FB7A AE 62 LDX 2,S LOAD BEGIN ADDRESS
1255 FB7C 17 01 68 LBSR OUT4H PUNCH ADDRESS
1256 FB7F EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
1257 FB81 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
1258 FB83 EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
1259 FB85 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
1260 FB87 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
1261 FB8A 6A 64 DEC 4,S DECREMENT BYTE COUNT
1262 FB8C 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
1263 FB8E 53 COMB 1's COMPLIMENT CHECKSUM BYTE
1264 FB8F 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
1265 FB91 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
1266 FB94 AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
1267 FB96 AC E4 CMPX ,S COMPARE IT TO END ADDR
1268 FB98 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
1269 FB9A 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
1270 FB9C 17 01 A7 LBSR OUTCH OUTPUT IT
1271 FB9F 32 65 LEAS 5,S READJUST STACK POINTER
1272 FBA1 39 RTS ;
1273 *
1274 * PRINT STRING PRECEEDED BY A CR & LF.
1275 *
1276 FBA2 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1277 FBA4 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1278 *
1279 * PCRLF
1280 *
1281 FBA6 34 10 PCRLF PSHS X SAVE IX
1282 FBA8 8E FD D4 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1283 FBAB 17 00 69 LBSR PDATA PRINT MSG
1284 FBAE 35 90 PULS X,PC RESTORE IX & RETURN
1285 *
1286 * LONG BRANCHES TO COMMON ROUTINES
1287 *
1288 FBB0 16 01 91 JOUT1S LBRA OUT1S
1289 FBB3 16 00 F8 JBYTE LBRA BYTE
1290 FBB6 16 00 E5 JIN1ADR LBRA IN1ADR
1291 *
1292 * ALTER "PC" PROGRAM COUNTER
1293 *
1294 FBB9 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1295 FBBC 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1296 FBBE 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1297 FBC0 29 02 BVS ALTPCD EXIT IF INVALID HEX
1298 FBC2 AF 4A STX 10,U POKE IN NEW CONTENTS
1299 FBC4 39 ALTPCD RTS ;
1300 *
1301 * ALTER "U" USER STACK POINTER
1302 *
1303 FBC5 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1304 FBC7 8D E7 BSR JOUT1S OUTPUT SPACE
1305 FBC9 8D EB BSR JIN1ADR
1306 FBCB 29 02 BVS ALTUD
1307 FBCD AF 48 STX 8,U
1308 FBCF 39 ALTUD RTS ;
1309 *
1310 * ALTER "Y" INDEX REGISTER
1311 *
1312 FBD0 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1313 FBD2 8D DC BSR JOUT1S OUTPUT SPACE
1314 FBD4 8D E0 BSR JIN1ADR
1315 FBD6 29 02 BVS ALTYD
1316 FBD8 AF 46 STX 6,U $F8F0
1317 FBDA 39 ALTYD RTS ;
1318 *
1319 * ALTER "X" INDEX REGISTER
1320 *
1321 FBDB 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1322 FBDD 8D D1 BSR JOUT1S OUTPUT SPACE
1323 FBDF 8D D5 BSR JIN1ADR
1324 FBE1 29 02 BVS ALTXD
1325 FBE3 AF 44 STX 4,U
1326 FBE5 39 ALTXD RTS ;
1327 *
1328 FCE7 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1329 FCE9 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1330 FCEB 8D 02 BSR OUTHL OUTPUT HEX LEFT
1331 FCED 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1332 FCEF OUTHL EQU *
1333 FCEF 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1334 FCF1 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1335 FCF2 44 LSRA ;
1336 FCF3 44 LSRA ;
1337 FCF4 44 LSRA ;
1338 FCF5 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1339 FCF7 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1340 FCF9 84 0F ANDA #$0F STRIP LEFT NIBBLE
1341 FCFB 8B 30 XASCII ADDA #$30 ASCII ADJ
1342 FCFD 81 39 CMPA #$39 IS IT < OR = "9" ?
1343 FCFF 2F 02 BLE OUTC IF LESS, OUTPUT IT
1344 FD01 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1345 FD03 20 41 OUTC BRA OUTCH OUTPUT CHAR
1346 *
1347 * BINARY / ASCII --- THIS ROUTINE
1348 * OUTPUTS A BYTE IN ENHANCED
1349 * BINARY FORMAT. THE ENHANCEMENT
1350 * IS DONE BY SUBSTITUTING ASCII
1351 * LETTERS FOR THE ONES IN THE BYTE.
1352 * THE ASCII ENHANCEMENT LETTERS
1353 * ARE OBTAINED FROM THE STRING
1354 * POINTED TO BY THE INDEX REG. "X".
1355 *
1356 FD05 34 02 BIASCI PSHS A SAVE "A" ON STACK
1357 FD07 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1358 FD09 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1359 FD0B 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1360 FD0D 25 02 BCS PRTBA IF ONE PRINT LETTER
1361 FD0F 86 2D LDA #'- IF ZERO PRINT "-"
1362 FD11 8D 33 PRTBA BSR OUTCH PRINT IT
1363 FD13 8D 2F BSR OUT1S PRINT SPACE
1364 FD15 5A DECB SUB 1 FROM #BITS YET TO PRINT
1365 FD16 26 F1 BNE OUTBA
1366 FD18 35 82 PULS A,PC
1367 *
1368 * EXTENDED USER COMMANDS
1369 *
1370 FD1A 6E 9F F0 00 EXTEND JMP [MONEXT+EXTCMD]
1371 *
1372 *
1373 FD1E 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ?
1374 FD21 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1375 *
1376 * INCHE
1377 *
1378 * ---GETS CHARACTER FROM TERMINAL AND
1379 * ECHOS SAME. THE CHARACTER IS RETURNED
1380 * IN THE "A" ACCUMULATOR WITH THE PARITY
1381 * BIT MASKED OFF. ALL OTHER REGISTERS
1382 * ARE PRESERVED.
1383 *
1384 FD23 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1385 FD25 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1386 FD27 20 1D BRA OUTCH ECHO CHAR TO TERMINAL
1387 *
1388 * INCH
1389 *
1390 * GET CHARACTER FROM TERMINAL. RETURN
1391 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1392 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1393 * IS 8 BITS AND IS NOT ECHOED.
1394 *
1395 *
1396 FD29 34 10 INCH PSHS X SAVE IX
1397 FD2B BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1398 FD2E A6 84 LDA ,X FETCH PORT STATUS
1399 FD30 85 01 BITA #1 TEST READY BIT, RDRF ?
1400 IFD FPGAOPT
1401 BNE GETST1
1402 LDX #ACIAS
1403 LDA ,X
1404 BITA #1
1405 ENDIF FPGAOPT
1405 ENDIF FPGAOPT
1406 FD32 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1407 FD34 A6 01 GETST1 LDA 1,X FETCH CHAR
1408 FD36 35 90 PULS X,PC RESTORE IX
1409 *
1410 * INCHEK
1411 *
1412 * CHECK FOR A CHARACTER AVAILABLE FROM
1413 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1414 * FOR READ READY. ALL REGISTERS ARE
1415 * PRESERVED, AND THE "Z" BIT WILL BE
1416 * CLEAR IF A CHARACTER CAN BE READ.
1417 *
1418 *
1419 FD38 34 02 INCHEK PSHS A SAVE A ACCUM.
1420 FD3A A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS
1421 FD3E 85 01 BITA #1 TEST READY BIT, RDRF ?
1422 IFD FPGAOPT
1423 BNE INCHEK1
1424 LDA ACIAS
1425 BITA #1 TEST READY BIT< RDRF ?
1426 ENDIF FPGAOPT
1426 ENDIF FPGAOPT
1427 FD40 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1428 *
1429 FD42 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1430 FD44 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1431 *
1432 *
1433 * OUTCH
1434 *
1435 * OUTPUT CHARACTER TO TERMINAL.
1436 * THE CHAR. TO BE OUTPUT IS
1437 * PASSED IN THE A REGISTER.
1438 * ALL REGISTERS ARE PRESERVED.
1439 *
1440 OUTCH IFD FPGAOPT
1441 BSR VOUTCH
1442 ENDIF FPGAOPT
1442 ENDIF FPGAOPT
1443 IFD ADSOPT
1444 BSR VOUTCH
1445 ENDIF ADSOPT
1445 ENDIF ADSOPT
1446 FD46 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1447 FD48 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL
1448 FD4B A6 84 FETSTA LDA ,X FETCH PORT STATUS
1449 FD4D 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1450 FD4F 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1451 FD51 35 02 PULS A GET CHAR. FOR XMIT
1452 FD53 A7 01 STA 1,X XMIT CHAR.
1453 FD55 35 90 PULS X,PC RESTORE IX
1454 *
1455 * IO INITIALIZATION
1456 *
1457 FD57 IOINIZ EQU *
1458 IFD FPGAOPT
1459 BSR VINIZ
1460 ENDIF FPGAOPT
1460 ENDIF FPGAOPT
1461 IFD ADSOPT
1462 BSR VINIZ
1463 ENDIF ADSOPT
1463 ENDIF ADSOPT
1464 FD57 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1465 FD5A 86 03 LDA #3 RESET ACIA PORT CODE
1466 FD5C A7 84 STA ,X STORE IN CONTROL REGISTER
1467 FD5E 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1468 FD60 A7 84 STA ,X STORE IN CONTROL REGISTER
1469 FD62 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1470 FD64 86 FF LDA #$FF TURN ON ECHO FLAG
1471 FD66 B7 DF E2 STA ECHO
1472 FD69 39 RTS
1473 *
1474 IFD FPGAOPT
1475 *
1476 ***************************************************
1477 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1478 * *
1479 * 80 x 25 Characters
1480 *
1481 ***************************************************
1482 *
1483 ***************************************************
1484 * INITIALIZE EMULATOR *
1485 ***************************************************
1486 *
1487 VINIZ LDX #VDU
1488 LDD #0
1489 STD COLADX AND ROWADX
1490 STA VDUCOL,X
1491 STB VDUROW,X
1492 STB VDUOFF,X
1493 STD NEWROW AND ESCFLG
1494 LDB #$02
1495 STB VDUATT,X
1496 CLR ESCFLG
1497 LDA #$1B SEND ESCAPE
1498 BSR VOUTCH
1499 LDA #'Y CLEAR TO END OF SCREEN
1500 *
1501 ** VIDEO OUTPUT ROUTINE
1502 *
1503 VOUTCH PSHS A,B,X SAVE REGISTERS
1504 LDX #VDU POINT TO VDU REGISTERS
1505 *
1506 ** CHECK FOR ESCAPE SEQUENCE
1507 *
1508 TST ESCFLG ESCAPE ACTIVE?
1509 BEQ SOROU1 BRANCH IF NOT
1510 BSR ESCAPE ELSE DO ESCAPE
1511 BRA RETURN AND RETURN
1512 *
1513 ** CHECK FOR CONTROL CHARACTERS
1514 *
1515 SOROU1 CMPA #$20 CONTROL CODES?
1516 BHS SOROU2
1517 BSR CONTRL BRANCH IF SO
1518 BRA RETURN
1519 *
1520 ** OUTPUT TEXT CHARACTER
1521 *
1522 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1523 LBSR NEWCOL UPDATE COLUMN
1524 *
1525 ** DISPLAY CURSOR AND RETURN
1526 *
1527 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1528 *
1529 ***************************************************
1530 * CONTROL CODE HANDLERS *
1531 ***************************************************
1532 *
1533 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1534 LBEQ BACKSP
1535 CMPA #$1B ESCAPE SEQUENCE?
1536 LBEQ SETESC
1537 CMPA #$1A CTRL Z - Clear Screen
1538 LBEQ CLRSCR
1539 CMPA #$16 CTRL ^ - Home
1540 LBEQ HOME
1541 CMPA #$D CTRL M - RETURN?
1542 LBEQ CRETN
1543 CMPA #$0C CTRL L - CHAR RIGHT
1544 LBEQ CHRIGHT
1545 CMPA #$0B CTRL K - MOVE UP ONE LINE
1546 LBEQ LINEUP
1547 CMPA #$0A CTRL J - LINE FEED
1548 BNE RETESC NONE OF THESE, RETURN
1549 *
1550 ***************************************** LINE FEED
1551 *
1552 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1553 INCB BUMP ROW
1554 CMPB #NUMLIN SCROLL TIME?
1555 LBNE NEWCUR POSITION CURSOR IF NOT
1556 LBRA SCROLL ELSE SCROLL IT
1557 *
1558 ***************************************** LINE FEED
1559 *
1560 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1561 TSTB AT TOP OF SCREEN ?
1562 LBEQ RETESC Yes, Ignore
1563 DECB No, Decrement ROW
1564 LBRA NEWCUR POSITION CURSOR
1565 *
1566 *********************************** BACK SPACE
1567 *
1568 BACKSP LDA COLADX
1569 BEQ RETESC RETURN
1570 DECA
1571 LBRA POSCOL POSITION CURSOR
1572 *
1573 *********************************** CURSOR RIGHT
1574 *
1575 CHRIGHT LDA COLADX
1576 INCA
1577 CMPA #LINLEN
1578 LBEQ RETESC
1579 LBRA POSCOL
1580 *
1581 *********************************** CURSOR RIGHT
1582 *
1583 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1584 LBRA NEWCUR
1585 *
1586 ***************************************************
1587 * ESCAPE HANDLERS *
1588 ***************************************************
1589 *
1590 ESCAPE LDAB ESCFLG GET FLAG
1591 CMPB #'= SETTING CURSOR?
1592 BEQ ESCCUR BRANCH IF SO
1593 CMPA #'Y CLEAR TO END OF SCREEN?
1594 LBEQ ESCCLS
1595 CMPA #'T CLEAR TO END OF LINE?
1596 BEQ ESCCLL
1597 CMPA #'= STARTING CURSOR SET?
1598 BNE CLRESC BRANCH IF NOT
1599 *
1600 ***************************** START ESCAPE SEQUENCE
1601 *
1602 SETESC STAA ESCFLG ELSE START CURSORING
1603 RTS AND RETURN
1604 *
1605 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1606 RETESC RTS SO RETURN
1607 *
1608 ********************************* SET SCREEN CURSOR
1609 *
1610 ESCCUR TST NEWROW ROW SET?
1611 BNE ESCCU1 BRANCH IF SO
1612 STAA NEWROW ELSE SET NEW ROW
1613 RTS AND RETURN
1614 *
1615 ESCCU1 CLR ESCFLG
1616 SUBA #$20 ADJUST COLUMN ADDRESS
1617 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1618 BHI RETESC NOT OK, DO NOTHING
1619 *
1620 ESCCU2 LDAB NEWROW
1621 CLR NEWROW
1622 SUBB #$20 ADJUST TO ROW ADDRESS
1623 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1624 BHI RETESC ELSE RETURN DOING NOTHING
1625 BRA NEWCUR GO SET NEW CURSOR IF SO
1626 *
1627 ****************** CLEAR FROM CURSOR TO END OF LINE
1628 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1629 BSR NEWCUR
1630 ESCCLL LDA COLADX
1631 LDB #$20 AND CLEAR CHAR
1632 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1633 INCA
1634 STA VDUCOL,X
1635 CMPA #LINLEN UNTIL END OF LINE
1636 BNE ESCCL1
1637 CLR ESCFLG
1638 RTS
1639 *
1640 *********************************** CARRIAGE RETURN
1641 *
1642 CRETN CLRA SET COLUMN ZERO
1643 POSCOL LDB ROWADX GET CURRENT ROW
1644 *
1645 *********** GENERATE NEW CURSOR POSITION AND RETURN
1646 *
1647 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1648 STA VDUCOL,X SET NEW COLUMN
1649 STB VDUROW,X SET NEW ROW
1650 RTS AND RETURN
1651 *
1652 ********************* UPDATE CURRENT COLUMN AND ROW
1653 *
1654 NEWCOL LDD COLADX GET ROW AND COLUMN
1655 INCA BUMP COLUMN
1656 CMPA #LINLEN ROLL?
1657 BNE NEWCUR BRANCH IF NOT
1658 CLRA ELSE RESET TO ZERO
1659 INCB AND BUMP ROW
1660 CMPB #NUMLIN
1661 BNE NEWCUR
1662 DECB BOTTOM ROW
1663 BSR NEWCUR
1664 *
1665 ********************************* SCROLL THE SCREEN
1666 *
1667 SCROLL LDB VDUOFF,X
1668 INCB
1669 CMPB #NUMLIN
1670 BLO SCROL1
1671 CLRB
1672 SCROL1 STB VDUOFF,X
1673 *
1674 **************** CLEAR FROM CURSOR TO END OF SCREEN
1675 *
1676 ESCCLS LDB COLADX GET CURSOR
1677 LDA #$20 GET A SPACE
1678 ESCCLS1 STB COLADX
1679 STB VDUCOL,X
1680 STA VDUCHR,X
1681 INCB
1682 CMPB #LINLEN
1683 BNE ESCCLS1
1328 * ALTER "DP" DIRECT PAGE REGISTER
1329 *
1330 FBE6 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1331 FBE8 8D C6 BSR JOUT1S OUTPUT SPACE
1332 FBEA 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1333 FBEC 29 02 BVS ALTDPD
1334 FBEE A7 43 STA 3,U
1335 FBF0 39 ALTDPD RTS ;
1336 *
1337 * ALTER "B" ACCUMULATOR
1338 *
1339 FBF1 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1340 FBF3 8D BB BSR JOUT1S OUTPUT SPACE
1341 FBF5 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1342 FBF7 29 02 BVS ALTBD
1343 FBF9 A7 42 STA 2,U
1344 FBFB 39 ALTBD RTS $F91C
1345 *
1346 * ALTER "A" ACCUMULATOR
1347 *
1348 FBFC 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1349 FBFE 8D B0 BSR JOUT1S OUTPUT SPACE
1350 FC00 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1351 FC02 29 02 BVS ALTAD
1352 FC04 A7 41 STA 1,U
1353 FC06 39 ALTAD RTS ;
1354 *
1355 * ALTER "CC" REGISTER
1356 *
1357 FC07 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1358 FC09 8D A5 BSR JOUT1S OUTPUT SPACE
1359 FC0B 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1360 FC0D 29 04 BVS ALTCCD
1361 FC0F 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1362 FC11 A7 C4 STA ,U
1363 FC13 39 ALTCCD RTS ;
1364 *
1365 * PDATA
1366 *
1367 FC14 17 01 2F PRINT LBSR OUTCH
1368 FC17 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1369 FC19 81 04 CMPA #4 IS IT EOT?
1370 FC1B 26 F7 BNE PRINT IF NOT EOT PRINT IT
1371 FC1D 39 RTS ;
1372 *
1373 * PRINT REGISTERS
1374 *
1375 FC1E 8E FD E6 PRTSP LDX #MSG10 POINT TO MSG "SP="
1376 FC21 8D F4 BSR PDATA PRINT MSG
1377 FC23 1F 31 TFR U,X
1378 FC25 16 00 BF JOUT4H LBRA OUT4H
1379 *
1380 FC28 8E FD F2 PRTUS LDX #MSG12 POINT TO MSG "US="
1381 FC2B 8D EA BSR PDATA PRINT MSG
1382 FC2D AE 48 LDX 8,U
1383 FC2F 20 F4 BRA JOUT4H
1384 *
1385 FC31 8E FE 04 PRTDP LDX #MSG15 POINT TO MSG "DP="
1386 FC34 8D E1 BSR PDATA PRINT MSG
1387 FC36 A6 43 LDA 3,U
1388 FC38 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1389 *
1390 FC3B 8E FD FE PRTIX LDX #MSG14 POINT TO MSG "IX="
1391 FC3E 8D D7 BSR PDATA PRINT MSG
1392 FC40 AE 44 LDX 4,U $FCE6
1393 FC42 20 E1 BRA JOUT4H
1394 *
1395 FC44 8E FD F8 PRTIY LDX #MSG13 POINT TO MSG "IY="
1396 FC47 8D CE BSR PDATA PRINT MSG
1397 FC49 AE 46 LDX 6,U
1398 FC4B 20 D8 BRA JOUT4H
1399 *
1400 FC4D 8E FD EC PRTPC LDX #MSG11 POINT TO MSG "PC="
1401 FC50 8D C5 BSR PDATA PRINT MSG
1402 FC52 AE 4A LDX 10,U
1403 FC54 20 CF BRA JOUT4H
1404 *
1405 FC56 8E FE 0A PRTA LDX #MSG16 POINT TO MSG "A="
1406 FC59 8D BC BSR PDATA PRINT MSG
1407 FC5B A6 41 LDA 1,U
1408 FC5D 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1409 *
1410 FC5F 8E FE 0F PRTB LDX #MSG17 POINT TO MSG "B="
1411 FC62 8D B3 BSR PDATA PRINT MSG
1412 FC64 A6 42 LDA 2,U
1413 FC66 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1414 *
1415 FC68 8E FE 14 PRTCC LDX #MSG18 POINT TO MSG "CC:"
1416 FC6B 8D AA BSR PDATA PRINT MSG
1417 FC6D A6 C4 LDA ,U
1418 FC6F 8E FE 1B LDX #MSG19 POINT TO MSG "EFHINZVC"
1419 FC72 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1420 *
1421 * "R" DISPLAY REGISTERS
1422 *
1423 FC75 8E FD E2 REGSTR LDX #MSG5 POINT TO MSG " - "
1424 FC78 17 FF 27 LBSR PSTRNG PRINT MSG
1425 FC7B 8D A1 BSR PRTSP $FCBF
1426 FC7D 8D A9 BSR PRTUS $FCCA
1427 FC7F 8D B0 BSR PRTDP $FCD5
1428 FC81 8D B8 BSR PRTIX $FCE0
1429 FC83 8D BF BSR PRTIY $FCEB
1430 FC85 8E FD E2 LDX #MSG5 POINT TO MSG " - "
1431 FC88 17 FF 17 LBSR PSTRNG PRINT MSG
1432 FC8B 8D C0 BSR PRTPC $FCF5
1433 FC8D 8D C7 BSR PRTA $FCFF
1434 FC8F 8D CE BSR PRTB $FD09
1435 FC91 20 D5 BRA PRTCC $FD13
1436 *
1437 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1438 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1439 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1440 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1441 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1442 * ADDRESS IS INPUT.
1443 *
1444 FC93 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1445 FC95 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1446 FC97 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1447 FC99 86 2D LDA #'-
1448 FC9B 17 00 A8 LBSR OUTCH PRINT " - "
1449 *
1450 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1451 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1452 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1453 *
1454 FC9E 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1455 FCA0 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1456 FCA2 1F 01 TFR D,X
1457 FCA4 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1458 FCA6 29 3C BVS NOTHEX
1459 FCA8 34 10 PSHS X
1460 FCAA A7 61 STA 1,S
1461 FCAC 35 90 PULS X,PC
1462 *
1463 ***** INPUT BYTE (2 HEX CHAR.) *****
1464 *
1465 FCAE 8D 11 BYTE BSR INHEX GET HEX LEFT
1466 FCB0 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1467 FCB2 48 ASLA ;
1468 FCB3 48 ASLA ;
1469 FCB4 48 ASLA ; SHIFT INTO LEFT NIBBLE
1470 FCB5 48 ASLA ;
1471 FCB6 1F 89 TFR A,B PUT HEXL IN "B"
1472 FCB8 8D 07 BSR INHEX GET HEX RIGHT
1473 FCBA 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1474 FCBC 34 04 PSHS B PUSH HEXL ON STACK
1475 FCBE AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1476 FCC0 39 RTS RETURN WITH HEX L&R IN "A"
1477 *
1478 *
1479 FCC1 8D 5B INHEX BSR ECHON INPUT ASCII CHAR.
1480 FCC3 81 30 CMPA #'0 IS IT > OR = "0" ?
1481 FCC5 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1482 FCC7 81 39 CMPA #'9 IS IT < OR = "9" ?
1483 FCC9 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1484 FCCB 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1485 FCCD 39 RTS ;
1486 *
1487 *
1488 FCCE 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1489 FCD0 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1490 FCD2 81 46 CMPA #'F IS IT < OR = "F" ?
1491 FCD4 22 03 BHI INHEXL IF > IT AIN'T HEX
1492 FCD6 80 37 SUBA #$37 ASCII ADJ. ALPHA
1493 FCD8 39 RTS ;
1494 *
1495 FCD9 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1496 FCDB 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1497 FCDD 81 66 CMPA #'f IS IT < "f"
1498 FCDF 22 03 BHI NOTHEX IF > IT AIN'T HEX
1499 FCE1 80 57 SUBA #$57 ADJUST TO LOWER CASE
1500 FCE3 39 RTS ;
1501 *
1502 *
1503 FCE4 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1504 FCE6 39 RTS ;
1505 *
1506 *
1507 FCE7 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1508 FCE9 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1509 FCEB 8D 02 BSR OUTHL OUTPUT HEX LEFT
1510 FCED 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1511 FCEF OUTHL EQU *
1512 FCEF 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1513 FCF1 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1514 FCF2 44 LSRA ;
1515 FCF3 44 LSRA ;
1516 FCF4 44 LSRA ;
1517 FCF5 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1518 FCF7 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1519 FCF9 84 0F ANDA #$0F STRIP LEFT NIBBLE
1520 FCFB 8B 30 XASCII ADDA #$30 ASCII ADJ
1521 FCFD 81 39 CMPA #$39 IS IT < OR = "9" ?
1522 FCFF 2F 02 BLE OUTC IF LESS, OUTPUT IT
1523 FD01 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1524 FD03 20 41 OUTC BRA OUTCH OUTPUT CHAR
1525 *
1526 * BINARY / ASCII --- THIS ROUTINE
1527 * OUTPUTS A BYTE IN ENHANCED
1528 * BINARY FORMAT. THE ENHANCEMENT
1529 * IS DONE BY SUBSTITUTING ASCII
1530 * LETTERS FOR THE ONES IN THE BYTE.
1531 * THE ASCII ENHANCEMENT LETTERS
1532 * ARE OBTAINED FROM THE STRING
1533 * POINTED TO BY THE INDEX REG. "X".
1534 *
1535 FD05 34 02 BIASCI PSHS A SAVE "A" ON STACK
1536 FD07 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1537 FD09 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1538 FD0B 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1539 FD0D 25 02 BCS PRTBA IF ONE PRINT LETTER
1540 FD0F 86 2D LDA #'- IF ZERO PRINT "-"
1541 FD11 8D 33 PRTBA BSR OUTCH PRINT IT
1542 FD13 8D 2F BSR OUT1S PRINT SPACE
1543 FD15 5A DECB SUB 1 FROM #BITS YET TO PRINT
1544 FD16 26 F1 BNE OUTBA
1545 FD18 35 82 PULS A,PC
1546 *
1547 * EXTENDED USER COMMANDS
1548 *
1549 FD1A 6E 9F F0 00 EXTEND JMP [MONEXT+EXTCMD]
1550 *
1551 *
1552 FD1E 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ?
1553 FD21 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1554 *
1555 * INCHE
1556 *
1557 * ---GETS CHARACTER FROM TERMINAL AND
1558 * ECHOS SAME. THE CHARACTER IS RETURNED
1559 * IN THE "A" ACCUMULATOR WITH THE PARITY
1560 * BIT MASKED OFF. ALL OTHER REGISTERS
1561 * ARE PRESERVED.
1562 *
1563 FD23 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1564 FD25 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1565 FD27 20 1D BRA OUTCH ECHO CHAR TO TERMINAL
1566 *
1567 * INCH
1568 *
1569 * GET CHARACTER FROM TERMINAL. RETURN
1570 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1571 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1572 * IS 8 BITS AND IS NOT ECHOED.
1573 *
1574 *
1575 FD29 34 10 INCH PSHS X SAVE IX
1576 FD2B BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1577 FD2E A6 84 LDA ,X FETCH PORT STATUS
1578 FD30 85 01 BITA #1 TEST READY BIT, RDRF ?
1579 IFD PS2OPT
1580 BNE GETST1
1581 LDX #PS2KBD
1582 LDA ,X
1583 BITA #1
1584 ENDIF PS2OPT
1584 ENDIF PS2OPT
1585 FD32 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1586 FD34 A6 01 GETST1 LDA 1,X FETCH CHAR
1587 FD36 35 90 PULS X,PC RESTORE IX
1588 *
1589 * INCHEK
1590 *
1591 * CHECK FOR A CHARACTER AVAILABLE FROM
1592 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1593 * FOR READ READY. ALL REGISTERS ARE
1594 * PRESERVED, AND THE "Z" BIT WILL BE
1595 * CLEAR IF A CHARACTER CAN BE READ.
1596 *
1597 *
1598 FD38 34 02 INCHEK PSHS A SAVE A ACCUM.
1599 FD3A A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS
1600 FD3E 85 01 BITA #1 TEST READY BIT, RDRF ?
1601 IFD PS2OPT
1602 BNE INCHEK1
1603 LDA PS2KBD
1604 BITA #1 TEST READY BIT< RDRF ?
1605 ENDIF PS2OPT
1605 ENDIF PS2OPT
1606 FD40 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1607 *
1608 FD42 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1609 FD44 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1610 *
1611 *
1612 * OUTCH
1613 *
1614 * OUTPUT CHARACTER TO TERMINAL.
1615 * THE CHAR. TO BE OUTPUT IS
1616 * PASSED IN THE A REGISTER.
1617 * ALL REGISTERS ARE PRESERVED.
1618 *
1619 OUTCH IFD VDUOPT
1620 BSR VOUTCH
1621 ENDIF VDUOPT
1621 ENDIF VDUOPT
1622 IFD DG640OPT
1623 BSR VOUTCH
1624 ENDIF DG640OPT
1624 ENDIF DG640OPT
1625 FD46 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1626 FD48 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL
1627 FD4B A6 84 FETSTA LDA ,X FETCH PORT STATUS
1628 FD4D 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1629 FD4F 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1630 FD51 35 02 PULS A GET CHAR. FOR XMIT
1631 FD53 A7 01 STA 1,X XMIT CHAR.
1632 FD55 35 90 PULS X,PC RESTORE IX
1633 *
1634 * IO INITIALIZATION
1635 *
1636 FD57 IOINIZ EQU *
1637 IFD VDUOPT
1638 BSR VINIZ
1639 ENDIF VDUOPT
1639 ENDIF VDUOPT
1640 IFD DG640OPT
1641 BSR VINIZ
1642 ENDIF DG640OPT
1642 ENDIF DG640OPT
1643 FD57 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1644 FD5A 86 03 LDA #3 RESET ACIA PORT CODE
1645 FD5C A7 84 STA ,X STORE IN CONTROL REGISTER
1646 FD5E 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1647 FD60 A7 84 STA ,X STORE IN CONTROL REGISTER
1648 FD62 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1649 FD64 86 FF LDA #$FF TURN ON ECHO FLAG
1650 FD66 B7 DF E2 STA ECHO
1651 FD69 39 RTS
1652 *
1653 IFD VDUOPT
1654 *
1655 ***************************************************
1656 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1657 * *
1658 * 80 x 25 Characters
1659 *
1660 ***************************************************
1661 *
1662 ***************************************************
1663 * INITIALIZE EMULATOR *
1664 ***************************************************
1665 *
1666 VINIZ LDX #VDU
1667 LDD #0
1668 STD COLADX AND ROWADX
1669 STA VDUCOL,X
1670 STB VDUROW,X
1671 STB VDUOFF,X
1672 STD NEWROW AND ESCFLG
1673 LDB #$02
1674 STB VDUATT,X
1675 CLR ESCFLG
1676 LDA #$1B SEND ESCAPE
1677 BSR VOUTCH
1678 LDA #'Y CLEAR TO END OF SCREEN
1679 *
1680 ** VIDEO OUTPUT ROUTINE
1681 *
1682 VOUTCH PSHS A,B,X SAVE REGISTERS
1683 LDX #VDU POINT TO VDU REGISTERS
1684 *
1685 LDB ROWADX
1686 INCB
1687 CMPB #NUMLIN
1688 BEQ ESCCLS2
1689 STB ROWADX
1690 STB VDUROW,X
1691 CLRB
1692 BRA ESCCLS1
1685 ** CHECK FOR ESCAPE SEQUENCE
1686 *
1687 TST ESCFLG ESCAPE ACTIVE?
1688 BEQ SOROU1 BRANCH IF NOT
1689 BSR ESCAPE ELSE DO ESCAPE
1690 BRA RETURN AND RETURN
1691 *
1692 ** CHECK FOR CONTROL CHARACTERS
1693 *
1694 ESCCLS2 CLRB
1695 STB COLADX
1696 STB VDUCOL,X
1697 STB ESCFLG
1698 RTS
1699 ENDIF FPGAOPT
1699 ENDIF FPGAOPT
1700 *
1701 IFD ADSOPT
1702 ***************************************************
1703 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1704 * *
1705 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1706 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1707 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1708 * 16x64 BOARD). *
1709 ***************************************************
1710
1711 ***************************************************
1712 * INITIALIZE EMULATOR *
1713 ***************************************************
1714
1715 VINIZ LDX #0
1716 STX COLADX AND ROWADX
1717 STX NEWROW AND ESCFLG
1718 LDX #SCREEN POINT TO SCREEN
1719 STX CURSOR SET PROGRAM CURSOR
1720 LDA #$1B SEND ESCAPE
1721 BSR VOUTCH
1722 LDA #'Y CLEAR TO END OF SCREEN
1723 *
1724 ** VIDEO OUTPUT ROUTINE
1725 *
1726 VOUTCH PSHS A,B,X SAVE REGISTERS
1727 *
1728 ** CLEAR CURSOR
1729 LDX CURSOR
1730 LDB 0,X
1731 ANDB #$7F
1732 STB 0,X
1733 *
1734 ** CHECK FOR ESCAPE SEQUENCE
1735 TST ESCFLG ESCAPE ACTIVE?
1736 BEQ SOROU1 BRANCH IF NOT
1737 BSR ESCAPE ELSE DO ESCAPE
1738 BRA RETURN AND RETURN
1739 *
1740 ** CHECK FOR CONTROL CHARACTERS
1741 SOROU1 CMPA #$20 CONTROL CODES?
1742 BHS SOROU2
1743 BSR CONTRL BRANCH IF SO
1744 BRA RETURN
1745 *
1746 ** OUTPUT TEXT CHARACTER
1747 SOROU2 LDX CURSOR ELSE GET CURSOR
1748 STAA 0,X DISPLAY CHARACTER
1749 LBSR NEWCOL UPDATE COLUMN
1750 *
1751 ** DISPLAY CURSOR AND RETURN
1752 RETURN LDX CURSOR AND DISPLAY IT
1753 LDB ,X
1754 ORAB #$80 WITH REVID
1755 STB ,X
1756 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1757
1758 ***************************************************
1759 * CONTROL CODE HANDLERS *
1760 ***************************************************
1761
1762 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1763 LBEQ BACKSP
1764 CMPA #$1B ESCAPE SEQUENCE?
1765 LBEQ SETESC
1766 CMPA #$D CTRL M - RETURN?
1767 LBEQ CRETN
1768 CMPA #$0A CTRL J - LINE FEED
1769 BNE RETESC NONE OF THESE, RETURN
1770
1771 ***************************************** LINE FEED
1772
1773 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1774 INCB BUMP ROW
1775 CMPB #NUMLIN SCROLL TIME?
1776 LBNE NEWCUR POSITION CURSOR IF NOT
1777 LBRA SCROLL ELSE SCROLL IT
1778
1779 ***************************************** LINE FEED
1780
1781 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1782 TSTB AT TOP OF SCREEN ?
1783 BEQ RETESC Yes, Ignore
1784 DECB No, Decrement ROW
1785 LBRA NEWCUR POSITION CURSOR
1786
1787
1788 *********************************** BACK SPACE
1789
1790 BACKSP LDA COLADX
1791 BEQ RETESC RETURN
1792 DECA
1793 LBRA POSCOL POSITION CURSOR
1794
1795 *********************************** CURSOR RIGHT
1796
1797 CHRIGHT LDA COLADX
1798 INCA
1799 CMPA #LINLEN
1800 BEQ RETESC
1801 LBRA POSCOL
1802
1803 ***************************************************
1804 * ESCAPE HANDLERS *
1805 ***************************************************
1806
1807 ESCAPE LDAB ESCFLG GET FLAG
1808 CMPB #'= SETTING CURSOR?
1809 BEQ ESCCUR BRANCH IF SO
1810 CMPA #'Y CLEAR TO END OF SCREEN?
1811 LBEQ ESCCLS
1812 CMPA #'T CLEAR TO END OF LINE?
1813 BEQ ESCCLL
1814 CMPA #'E INSERT LINE?
1815 BEQ ESCINL
1816 CMPA #'R DELETE LINE?
1817 BEQ ESCDLL
1818 CMPA #'= STARTING CURSOR SET?
1819 BNE CLRESC BRANCH IF NOT
1820
1821 ***************************** START ESCAPE SEQUENCE
1822
1823 SETESC STAA ESCFLG ELSE START CURSORING
1824 RTS AND RETURN
1825
1826 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1827 RETESC RTS SO RETURN
1828
1829 ********************************* SET SCREEN CURSOR
1830
1831 ESCCUR TST NEWROW ROW SET?
1832 BNE ESCCU1 BRANCH IF SO
1833 STAA NEWROW ELSE SET NEW ROW
1834 RTS AND RETURN
1835
1836 ESCCU1 CLR ESCFLG
1837 SUBA #$20 ADJUST COLUMN ADDRESS
1838 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1839 BHI RETESC NOT OK, DO NOTHING
1840
1841 ESCCU2 LDAB NEWROW
1842 CLR NEWROW
1843 SUBB #$20 ADJUST TO ROW ADDRESS
1844 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1845 BHI RETESC ELSE RETURN DOING NOTHING
1846 BRA NEWCUR GO SET NEW CURSOR IF SO
1847 *
1848 *************************** DELETE LINE FROM SCREEN
1849
1850 ESCDLL BSR CRETN GO COL. ZERO
1851 LDB ROWADX
1852 CMPB #NUMLIN-1
1853 BEQ SCROL3
1854 BRA SCROL1 AND DELETE THIS LINE
1855
1856 *************************** INSERT LINE INTO SCREEN
1857
1858 ESCINL BSR CRETN GO TO COL. ZERO
1859 LDAB ROWADX
1860 CMPB #NUMLIN-1
1861 BEQ ESCCLL
1862 *
1863 ** SCROLL SCREEN DOWN FROM CURSOR
1864 *
1865 LDX #SCREEN+SCNLEN-LINLEN
1866 ESCIN0 LDAA 0,-X
1867 STAA LINLEN,X
1868 LDA SCNLEN,X
1869 STA SCNLEN+LINLEN,X
1870 CPX CURSOR
1871 BNE ESCIN0
1872
1873 ****************** CLEAR FROM CURSOR TO END OF LINE
1874
1875 ESCCLL LDA COLADX GET CURRENT COLUMN
1876 LDX CURSOR GET CURSOR
1877 LDB #$20 AND CLEAR CHAR
1878 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
1879 STB ,X+ CLEAR TEXT
1880 INCA
1881 CMPA #LINLEN UNTIL END OF LINE
1882 BNE ESCLL1
1883 CLR ESCFLG
1884 RTS
1885
1886 *********************************** CARRIAGE RETURN
1887
1888 CRETN CLRA SET COLUMN ZERO
1889 POSCOL LDB ROWADX GET CURRENT ROW
1890
1891 *********** GENERATE NEW CURSOR POSITION AND RETURN
1892
1893 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1894 LDA #LINLEN ELSE ADD A LINE
1895 MUL LINLEN * ROWADX
1896 ADDB COLADX
1897 ADCA #0
1898 ADDD #SCREEN ADD SCREEN BASE.
1899 STD CURSOR SAVE NEW CURSOR
1900 TFR D,X GET CURSOR IN X
1901 RTS AND RETURN
1902
1903 ********************* UPDATE CURRENT COLUMN AND ROW
1904
1905 NEWCOL LDD COLADX GET ROW AND COLUMN
1906 INCA BUMP COLUMN
1907 CMPA #LINLEN ROLL?
1908 BNE NEWCUR BRANCH IF NOT
1909 CLRA ELSE RESET TO ZERO
1910 INCB AND BUMP ROW
1911 CMPB #NUMLIN
1912 BNE NEWCUR
1913 DECB BOTTOM ROW
1914 BSR NEWCUR
1915
1916 ********************************* SCROLL THE SCREEN
1917
1918 SCROLL LDX #SCREEN POINT TO SCREEN
1919 SCROL1 LDA SCNLEN+LINLEN,X
1920 STA SCNLEN,X
1921 LDAA LINLEN,X MOVE TWO BYTES
1922 STAA 0,X+ UP ONE LINE
1923 CMPX #SCREEN+SCNLEN-LINLEN
1924 BNE SCROL1 LOOP UNTIL DONE
1925 BRA SCROL3
1926
1927 **************** CLEAR FROM CURSOR TO END OF SCREEN
1928
1929 ESCCLS LDX CURSOR GET CURSOR
1930 SCROL3 LDAA #$20 GET A SPACE
1931 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
1932 STA ,X+ AND TEXT
1933 CMPX #SCREEN+SCNLEN
1934 BNE SCROL2 UNTIL DONE
1935 CLR ESCFLG
1936 RTS
1937 ENDIF ADSOPT
1937 ENDIF ADSOPT
1938 *
1939 IFD PRTOPT
1940 *************************************
1941 *
1942 ** PRINTER DRIVER ROUTINES
1943 *
1944 *************************************
1945 *
1946 ** PINIZ - INITIATE PRINTER PORT
1947 *
1948 PINIZ PSHS B
1949 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
1950 STD PADATA SET DDR AND SELECT DATA
1951 *
1952 ** RESET PRINTER
1953 LDB #PRESET
1954 STAB PADATA
1955 RESTLP INCB DELAY FOR RESET
1956 BNE RESTLP
1957 STAA PADATA ACCA=DIRMSK
1958 *
1959 ** INITALIZE PORT B (DATA PORT)
1960 LDAA #$2A
1961 STAA PBCTRL
1962 LDD #$FF2E ACCA=$FF ACCB =%00101110
1963 STD PBDATA PBDREG PBCTRL
1964 *
1965 ** SELECT 66 LINES/PAGE
1966 LDAA #$1B
1967 BSR POUTCH
1968 LDAA #'C
1969 BSR POUTCH
1970 LDAA #66
1971 PULS B
1972 *************************************
1973 *
1974 ** OUTPUT A CHARACTER TO THE PRINTER
1975 *
1976 *************************************
1977 POUTCH PSHS B
1978 LDAB PBDATA CLEAR INTERRUPT BIT
1979 *
1980 ** WAIT TILL NOT BUSY
1981 BUSYLP LDAB PADATA
1982 BITB #PERROR
1983 BEQ PEXIT
1984 TSTB
1985 BMI BUSYLP
1986 *
1987 ** NOW OUTPUT CHARACTER
1988 STAA PBDATA
1989 PEXIT PULS B,PC
1990 *************************************
1991 *
1992 ** PCHK TEST IFD PRINTER READY
1993 *
1994 *************************************
1995 PCHK TST PBCTRL TEST STATE OF CRB7
1996 RTS SET ON ACKNOWLEDGE
1997 ENDIF PRTOPT
1997 ENDIF PRTOPT
1998 *************************************
1999 *
2000 * MONITOR KEYBOARD COMMAND JUMP TABLE
2001 *
2002 *************************************
2003 *
2004 FD6A JMPTAB EQU *
2005 FD6A 01 FCB 1 " ^A "
2006 FD6B FB FC FDB ALTRA
2007 FD6D 02 FCB 2 " ^B "
2008 FD6E FB F1 FDB ALTRB
2009 FD70 03 FCB 3 " ^C "
2010 FD71 FC 07 FDB ALTRCC
2011 FD73 04 FCB 4 " ^D "
2012 FD74 FB E6 FDB ALTRDP
2013 FD76 10 FCB $10 " ^P "
2014 FD77 FB B9 FDB ALTRPC
2015 FD79 15 FCB $15 " ^U "
2016 FD7A FB C5 FDB ALTRU
2017 FD7C 18 FCB $18 " ^X "
2018 FD7D FB DB FDB ALTRX
2019 FD7F 19 FCB $19 " ^Y "
2020 FD80 FB D0 FDB ALTRY
2021 *
2022 FD82 42 FCC 'B'
2023 FD83 F9 5C FDB BRKPNT
2024 FD85 45 FCC 'E'
2025 FD86 F8 FD FDB MEMDUMP
2026 FD88 47 FCC 'G'
2027 FD89 F8 A5 FDB GO
2028 FD8B 4C FCC 'L'
2029 FD8C FA E6 FDB LOAD
2030 FD8E 50 FCC 'P'
2031 FD8F FB 44 FDB PUNCH
2032 FD91 4D FCC 'M'
2033 FD92 F8 A8 FDB MEMCHG
2034 FD94 52 FCC 'R'
2035 FD95 FC 75 FDB REGSTR
2036 FD97 53 FCC 'S'
2037 FD98 F8 F1 FDB DISSTK
2038 FD9A 58 FCC 'X'
2039 FD9B F9 88 FDB XBKPNT
2040 IFD MFDCOPT
2041 FD9D 44 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
2042 FD9E F9 D5 FDB MINBOOT
2043 ENDIF MFDCOPT
2044 IFD FPGAOPT
2045 FCC 'D' *** FPGA USES 'D' FOR CFBOOT
2046 FDB CFBOOT
2047 ENDIF FPGAOPT
2047 ENDIF FPGAOPT
2048 IFD DMAFOPT
2049 FDA0 55 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
2050 FDA1 FA 29 FDB DBOOT
2051 ELSE
2052 FCC 'U' *** IF NOT DMAF2, 'U' IS FOR USER
2053 FDB EXTEND
2054 ENDIF DMAFOPT
2054 ENDIF DMAFOPT
2055 IFD RTCOPT
2056 FCC 'T'
2057 FDB TIMSET
2058 ENDIF RTCOPT
2058 ENDIF RTCOPT
2059 *
2060 FDA3 TABEND EQU *
2061 *
2062 * ** 6809 VECTOR ADDRESSES **
2063 *
2064 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
2065 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
2066 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
2067 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
2068 * HIS OWN ROUTINES IF HE SO DESIRES.
2069 *
2070 *
2071 FDA3 F9 94 RAMVEC FDB SWIE USER-V
2072 FDA5 F8 A7 FDB RTI SWI3-V
2073 FDA7 F8 A7 FDB RTI SWI2-V
2074 FDA9 F8 A7 FDB RTI FIRQ-V
2075 FDAB F8 A7 FDB RTI IRQ-V
2076 FDAD F9 94 FDB SWIE SWI-V
2077 FDAF FF FF FDB $FFFF SVC-VO
2078 FDB1 FF FF FDB $FFFF SVC-VL
2079 *
2080 * PRINTABLE MESSAGE STRINGS
2081 *
2082 FDB3 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2083 FDB8 53 59 53 30 39 42 FCC 'SYS09BUG 1.2 FOR '
55 47 20 31 2E 32
1694 SOROU1 CMPA #$20 CONTROL CODES?
1695 BHS SOROU2
1696 BSR CONTRL BRANCH IF SO
1697 BRA RETURN
1698 *
1699 ** OUTPUT TEXT CHARACTER
1700 *
1701 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1702 LBSR NEWCOL UPDATE COLUMN
1703 *
1704 ** DISPLAY CURSOR AND RETURN
1705 *
1706 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1707 *
1708 ***************************************************
1709 * CONTROL CODE HANDLERS *
1710 ***************************************************
1711 *
1712 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1713 LBEQ BACKSP
1714 CMPA #$1B ESCAPE SEQUENCE?
1715 LBEQ SETESC
1716 CMPA #$1A CTRL Z - Clear Screen
1717 LBEQ CLRSCR
1718 CMPA #$16 CTRL ^ - Home
1719 LBEQ HOME
1720 CMPA #$D CTRL M - RETURN?
1721 LBEQ CRETN
1722 CMPA #$0C CTRL L - CHAR RIGHT
1723 LBEQ CHRIGHT
1724 CMPA #$0B CTRL K - MOVE UP ONE LINE
1725 LBEQ LINEUP
1726 CMPA #$0A CTRL J - LINE FEED
1727 BNE RETESC NONE OF THESE, RETURN
1728 *
1729 ***************************************** LINE FEED
1730 *
1731 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1732 INCB BUMP ROW
1733 CMPB #NUMLIN SCROLL TIME?
1734 LBNE NEWCUR POSITION CURSOR IF NOT
1735 LBRA SCROLL ELSE SCROLL IT
1736 *
1737 ***************************************** LINE FEED
1738 *
1739 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1740 TSTB AT TOP OF SCREEN ?
1741 LBEQ RETESC Yes, Ignore
1742 DECB No, Decrement ROW
1743 LBRA NEWCUR POSITION CURSOR
1744 *
1745 *********************************** BACK SPACE
1746 *
1747 BACKSP LDA COLADX
1748 BEQ RETESC RETURN
1749 DECA
1750 LBRA POSCOL POSITION CURSOR
1751 *
1752 *********************************** CURSOR RIGHT
1753 *
1754 CHRIGHT LDA COLADX
1755 INCA
1756 CMPA #LINLEN
1757 LBEQ RETESC
1758 LBRA POSCOL
1759 *
1760 *********************************** CURSOR RIGHT
1761 *
1762 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1763 LBRA NEWCUR
1764 *
1765 ***************************************************
1766 * ESCAPE HANDLERS *
1767 ***************************************************
1768 *
1769 ESCAPE LDAB ESCFLG GET FLAG
1770 CMPB #'= SETTING CURSOR?
1771 BEQ ESCCUR BRANCH IF SO
1772 CMPA #'Y CLEAR TO END OF SCREEN?
1773 LBEQ ESCCLS
1774 CMPA #'T CLEAR TO END OF LINE?
1775 BEQ ESCCLL
1776 CMPA #'= STARTING CURSOR SET?
1777 BNE CLRESC BRANCH IF NOT
1778 *
1779 ***************************** START ESCAPE SEQUENCE
1780 *
1781 SETESC STAA ESCFLG ELSE START CURSORING
1782 RTS AND RETURN
1783 *
1784 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1785 RETESC RTS SO RETURN
1786 *
1787 ********************************* SET SCREEN CURSOR
1788 *
1789 ESCCUR TST NEWROW ROW SET?
1790 BNE ESCCU1 BRANCH IF SO
1791 STAA NEWROW ELSE SET NEW ROW
1792 RTS AND RETURN
1793 *
1794 ESCCU1 CLR ESCFLG
1795 SUBA #$20 ADJUST COLUMN ADDRESS
1796 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1797 BHI RETESC NOT OK, DO NOTHING
1798 *
1799 ESCCU2 LDAB NEWROW
1800 CLR NEWROW
1801 SUBB #$20 ADJUST TO ROW ADDRESS
1802 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1803 BHI RETESC ELSE RETURN DOING NOTHING
1804 BRA NEWCUR GO SET NEW CURSOR IF SO
1805 *
1806 ****************** CLEAR FROM CURSOR TO END OF LINE
1807 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1808 BSR NEWCUR
1809 ESCCLL LDA COLADX
1810 LDB #$20 AND CLEAR CHAR
1811 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1812 INCA
1813 STA VDUCOL,X
1814 CMPA #LINLEN UNTIL END OF LINE
1815 BNE ESCCL1
1816 CLR ESCFLG
1817 RTS
1818 *
1819 *********************************** CARRIAGE RETURN
1820 *
1821 CRETN CLRA SET COLUMN ZERO
1822 POSCOL LDB ROWADX GET CURRENT ROW
1823 *
1824 *********** GENERATE NEW CURSOR POSITION AND RETURN
1825 *
1826 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1827 STA VDUCOL,X SET NEW COLUMN
1828 STB VDUROW,X SET NEW ROW
1829 RTS AND RETURN
1830 *
1831 ********************* UPDATE CURRENT COLUMN AND ROW
1832 *
1833 NEWCOL LDD COLADX GET ROW AND COLUMN
1834 INCA BUMP COLUMN
1835 CMPA #LINLEN ROLL?
1836 BNE NEWCUR BRANCH IF NOT
1837 CLRA ELSE RESET TO ZERO
1838 INCB AND BUMP ROW
1839 CMPB #NUMLIN
1840 BNE NEWCUR
1841 DECB BOTTOM ROW
1842 BSR NEWCUR
1843 *
1844 ********************************* SCROLL THE SCREEN
1845 *
1846 SCROLL LDB VDUOFF,X
1847 INCB
1848 CMPB #NUMLIN
1849 BLO SCROL1
1850 CLRB
1851 SCROL1 STB VDUOFF,X
1852 *
1853 **************** CLEAR FROM CURSOR TO END OF SCREEN
1854 *
1855 ESCCLS LDB COLADX GET CURSOR
1856 LDA #$20 GET A SPACE
1857 ESCCLS1 STB COLADX
1858 STB VDUCOL,X
1859 STA VDUCHR,X
1860 INCB
1861 CMPB #LINLEN
1862 BNE ESCCLS1
1863 *
1864 LDB ROWADX
1865 INCB
1866 CMPB #NUMLIN
1867 BEQ ESCCLS2
1868 STB ROWADX
1869 STB VDUROW,X
1870 CLRB
1871 BRA ESCCLS1
1872 *
1873 ESCCLS2 CLRB
1874 STB COLADX
1875 STB VDUCOL,X
1876 STB ESCFLG
1877 RTS
1878 ENDIF VDUOPT
1878 ENDIF VDUOPT
1879 *
1880 IFD DG640OPT
1881 ***************************************************
1882 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1883 * *
1884 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1885 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1886 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1887 * 16x64 BOARD). *
1888 ***************************************************
1889
1890 ***************************************************
1891 * INITIALIZE EMULATOR *
1892 ***************************************************
1893
1894 VINIZ LDX #0
1895 STX COLADX AND ROWADX
1896 STX NEWROW AND ESCFLG
1897 LDX #SCREEN POINT TO SCREEN
1898 STX CURSOR SET PROGRAM CURSOR
1899 LDA #$1B SEND ESCAPE
1900 BSR VOUTCH
1901 LDA #'Y CLEAR TO END OF SCREEN
1902 *
1903 ** VIDEO OUTPUT ROUTINE
1904 *
1905 VOUTCH PSHS A,B,X SAVE REGISTERS
1906 *
1907 ** CLEAR CURSOR
1908 LDX CURSOR
1909 LDB 0,X
1910 ANDB #$7F
1911 STB 0,X
1912 *
1913 ** CHECK FOR ESCAPE SEQUENCE
1914 TST ESCFLG ESCAPE ACTIVE?
1915 BEQ SOROU1 BRANCH IF NOT
1916 BSR ESCAPE ELSE DO ESCAPE
1917 BRA RETURN AND RETURN
1918 *
1919 ** CHECK FOR CONTROL CHARACTERS
1920 SOROU1 CMPA #$20 CONTROL CODES?
1921 BHS SOROU2
1922 BSR CONTRL BRANCH IF SO
1923 BRA RETURN
1924 *
1925 ** OUTPUT TEXT CHARACTER
1926 SOROU2 LDX CURSOR ELSE GET CURSOR
1927 STAA 0,X DISPLAY CHARACTER
1928 LBSR NEWCOL UPDATE COLUMN
1929 *
1930 ** DISPLAY CURSOR AND RETURN
1931 RETURN LDX CURSOR AND DISPLAY IT
1932 LDB ,X
1933 ORAB #$80 WITH REVID
1934 STB ,X
1935 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1936
1937 ***************************************************
1938 * CONTROL CODE HANDLERS *
1939 ***************************************************
1940
1941 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1942 LBEQ BACKSP
1943 CMPA #$1B ESCAPE SEQUENCE?
1944 LBEQ SETESC
1945 CMPA #$D CTRL M - RETURN?
1946 LBEQ CRETN
1947 CMPA #$0A CTRL J - LINE FEED
1948 BNE RETESC NONE OF THESE, RETURN
1949
1950 ***************************************** LINE FEED
1951
1952 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1953 INCB BUMP ROW
1954 CMPB #NUMLIN SCROLL TIME?
1955 LBNE NEWCUR POSITION CURSOR IF NOT
1956 LBRA SCROLL ELSE SCROLL IT
1957
1958 ***************************************** LINE FEED
1959
1960 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1961 TSTB AT TOP OF SCREEN ?
1962 BEQ RETESC Yes, Ignore
1963 DECB No, Decrement ROW
1964 LBRA NEWCUR POSITION CURSOR
1965
1966
1967 *********************************** BACK SPACE
1968
1969 BACKSP LDA COLADX
1970 BEQ RETESC RETURN
1971 DECA
1972 LBRA POSCOL POSITION CURSOR
1973
1974 *********************************** CURSOR RIGHT
1975
1976 CHRIGHT LDA COLADX
1977 INCA
1978 CMPA #LINLEN
1979 BEQ RETESC
1980 LBRA POSCOL
1981
1982 ***************************************************
1983 * ESCAPE HANDLERS *
1984 ***************************************************
1985
1986 ESCAPE LDAB ESCFLG GET FLAG
1987 CMPB #'= SETTING CURSOR?
1988 BEQ ESCCUR BRANCH IF SO
1989 CMPA #'Y CLEAR TO END OF SCREEN?
1990 LBEQ ESCCLS
1991 CMPA #'T CLEAR TO END OF LINE?
1992 BEQ ESCCLL
1993 CMPA #'E INSERT LINE?
1994 BEQ ESCINL
1995 CMPA #'R DELETE LINE?
1996 BEQ ESCDLL
1997 CMPA #'= STARTING CURSOR SET?
1998 BNE CLRESC BRANCH IF NOT
1999
2000 ***************************** START ESCAPE SEQUENCE
2001
2002 SETESC STAA ESCFLG ELSE START CURSORING
2003 RTS AND RETURN
2004
2005 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
2006 RETESC RTS SO RETURN
2007
2008 ********************************* SET SCREEN CURSOR
2009
2010 ESCCUR TST NEWROW ROW SET?
2011 BNE ESCCU1 BRANCH IF SO
2012 STAA NEWROW ELSE SET NEW ROW
2013 RTS AND RETURN
2014
2015 ESCCU1 CLR ESCFLG
2016 SUBA #$20 ADJUST COLUMN ADDRESS
2017 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
2018 BHI RETESC NOT OK, DO NOTHING
2019
2020 ESCCU2 LDAB NEWROW
2021 CLR NEWROW
2022 SUBB #$20 ADJUST TO ROW ADDRESS
2023 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
2024 BHI RETESC ELSE RETURN DOING NOTHING
2025 BRA NEWCUR GO SET NEW CURSOR IF SO
2026 *
2027 *************************** DELETE LINE FROM SCREEN
2028
2029 ESCDLL BSR CRETN GO COL. ZERO
2030 LDB ROWADX
2031 CMPB #NUMLIN-1
2032 BEQ SCROL3
2033 BRA SCROL1 AND DELETE THIS LINE
2034
2035 *************************** INSERT LINE INTO SCREEN
2036
2037 ESCINL BSR CRETN GO TO COL. ZERO
2038 LDAB ROWADX
2039 CMPB #NUMLIN-1
2040 BEQ ESCCLL
2041 *
2042 ** SCROLL SCREEN DOWN FROM CURSOR
2043 *
2044 LDX #SCREEN+SCNLEN-LINLEN
2045 ESCIN0 LDAA 0,-X
2046 STAA LINLEN,X
2047 LDA SCNLEN,X
2048 STA SCNLEN+LINLEN,X
2049 CPX CURSOR
2050 BNE ESCIN0
2051
2052 ****************** CLEAR FROM CURSOR TO END OF LINE
2053
2054 ESCCLL LDA COLADX GET CURRENT COLUMN
2055 LDX CURSOR GET CURSOR
2056 LDB #$20 AND CLEAR CHAR
2057 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
2058 STB ,X+ CLEAR TEXT
2059 INCA
2060 CMPA #LINLEN UNTIL END OF LINE
2061 BNE ESCLL1
2062 CLR ESCFLG
2063 RTS
2064
2065 *********************************** CARRIAGE RETURN
2066
2067 CRETN CLRA SET COLUMN ZERO
2068 POSCOL LDB ROWADX GET CURRENT ROW
2069
2070 *********** GENERATE NEW CURSOR POSITION AND RETURN
2071
2072 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
2073 LDA #LINLEN ELSE ADD A LINE
2074 MUL LINLEN * ROWADX
2075 ADDB COLADX
2076 ADCA #0
2077 ADDD #SCREEN ADD SCREEN BASE.
2078 STD CURSOR SAVE NEW CURSOR
2079 TFR D,X GET CURSOR IN X
2080 RTS AND RETURN
2081
2082 ********************* UPDATE CURRENT COLUMN AND ROW
2083
2084 NEWCOL LDD COLADX GET ROW AND COLUMN
2085 INCA BUMP COLUMN
2086 CMPA #LINLEN ROLL?
2087 BNE NEWCUR BRANCH IF NOT
2088 CLRA ELSE RESET TO ZERO
2089 INCB AND BUMP ROW
2090 CMPB #NUMLIN
2091 BNE NEWCUR
2092 DECB BOTTOM ROW
2093 BSR NEWCUR
2094
2095 ********************************* SCROLL THE SCREEN
2096
2097 SCROLL LDX #SCREEN POINT TO SCREEN
2098 SCROL1 LDA SCNLEN+LINLEN,X
2099 STA SCNLEN,X
2100 LDAA LINLEN,X MOVE TWO BYTES
2101 STAA 0,X+ UP ONE LINE
2102 CMPX #SCREEN+SCNLEN-LINLEN
2103 BNE SCROL1 LOOP UNTIL DONE
2104 BRA SCROL3
2105
2106 **************** CLEAR FROM CURSOR TO END OF SCREEN
2107
2108 ESCCLS LDX CURSOR GET CURSOR
2109 SCROL3 LDAA #$20 GET A SPACE
2110 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
2111 STA ,X+ AND TEXT
2112 CMPX #SCREEN+SCNLEN
2113 BNE SCROL2 UNTIL DONE
2114 CLR ESCFLG
2115 RTS
2116 ENDIF DG640OPT
2116 ENDIF DG640OPT
2117 *
2118 IFD PRTOPT
2119 *************************************
2120 *
2121 ** PRINTER DRIVER ROUTINES
2122 *
2123 *************************************
2124 *
2125 ** PINIZ - INITIATE PRINTER PORT
2126 *
2127 PINIZ PSHS B
2128 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
2129 STD PADATA SET DDR AND SELECT DATA
2130 *
2131 ** RESET PRINTER
2132 LDB #PRESET
2133 STAB PADATA
2134 RESTLP INCB DELAY FOR RESET
2135 BNE RESTLP
2136 STAA PADATA ACCA=DIRMSK
2137 *
2138 ** INITALIZE PORT B (DATA PORT)
2139 LDAA #$2A
2140 STAA PBCTRL
2141 LDD #$FF2E ACCA=$FF ACCB =%00101110
2142 STD PBDATA PBDREG PBCTRL
2143 *
2144 ** SELECT 66 LINES/PAGE
2145 LDAA #$1B
2146 BSR POUTCH
2147 LDAA #'C
2148 BSR POUTCH
2149 LDAA #66
2150 PULS B
2151 *************************************
2152 *
2153 ** OUTPUT A CHARACTER TO THE PRINTER
2154 *
2155 *************************************
2156 POUTCH PSHS B
2157 LDAB PBDATA CLEAR INTERRUPT BIT
2158 *
2159 ** WAIT TILL NOT BUSY
2160 BUSYLP LDAB PADATA
2161 BITB #PERROR
2162 BEQ PEXIT
2163 TSTB
2164 BMI BUSYLP
2165 *
2166 ** NOW OUTPUT CHARACTER
2167 STAA PBDATA
2168 PEXIT PULS B,PC
2169 *************************************
2170 *
2171 ** PCHK TEST IFD PRINTER READY
2172 *
2173 *************************************
2174 PCHK TST PBCTRL TEST STATE OF CRB7
2175 RTS SET ON ACKNOWLEDGE
2176 ENDIF PRTOPT
2176 ENDIF PRTOPT
2177 *************************************
2178 *
2179 * MONITOR KEYBOARD COMMAND JUMP TABLE
2180 *
2181 *************************************
2182 *
2183 FD6A JMPTAB EQU *
2184 FD6A 01 FCB 1 " ^A "
2185 FD6B FB FC FDB ALTRA
2186 FD6D 02 FCB 2 " ^B "
2187 FD6E FB F1 FDB ALTRB
2188 FD70 03 FCB 3 " ^C "
2189 FD71 FC 07 FDB ALTRCC
2190 FD73 04 FCB 4 " ^D "
2191 FD74 FB E6 FDB ALTRDP
2192 FD76 10 FCB $10 " ^P "
2193 FD77 FB B9 FDB ALTRPC
2194 FD79 15 FCB $15 " ^U "
2195 FD7A FB C5 FDB ALTRU
2196 FD7C 18 FCB $18 " ^X "
2197 FD7D FB DB FDB ALTRX
2198 FD7F 19 FCB $19 " ^Y "
2199 FD80 FB D0 FDB ALTRY
2200 *
2201 FD82 42 FCC 'B'
2202 FD83 F9 5C FDB BRKPNT
2203 FD85 45 FCC 'E'
2204 FD86 F8 FD FDB MEMDUMP
2205 FD88 47 FCC 'G'
2206 FD89 F8 A5 FDB GO
2207 FD8B 4C FCC 'L'
2208 FD8C FA E6 FDB LOAD
2209 FD8E 50 FCC 'P'
2210 FD8F FB 44 FDB PUNCH
2211 FD91 4D FCC 'M'
2212 FD92 F8 A8 FDB MEMCHG
2213 FD94 52 FCC 'R'
2214 FD95 FC 75 FDB REGSTR
2215 FD97 53 FCC 'S'
2216 FD98 F8 F1 FDB DISSTK
2217 FD9A 58 FCC 'X'
2218 FD9B F9 88 FDB XBKPNT
2219 IFD MFDCOPT
2220 FD9D 44 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
2221 FD9E F9 D5 FDB MINBOOT
2222 ENDIF MFDCOPT
2223 IFD CFOPT
2224 FCC 'D' *** FPGA USES 'D' FOR CFBOOT
2225 FDB CFBOOT
2226 ENDIF CFOPT
2226 ENDIF CFOPT
2227 IFD DMAFOPT
2228 FDA0 55 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
2229 FDA1 FA 29 FDB DBOOT
2230 ELSE
2231 FCC 'U' *** IF NOT DMAF2, 'U' IS FOR USER
2232 FDB EXTEND
2233 ENDIF DMAFOPT
2233 ENDIF DMAFOPT
2234 IFD RTCOPT
2235 FCC 'T'
2236 FDB TIMSET
2237 ENDIF RTCOPT
2237 ENDIF RTCOPT
2238 IFD TRAOPT
2239 FCC "T"
2240 FDB TRACE
2241 ENDIF TRAOPT
2241 ENDIF TRAOPT
2242 *
2243 FDA3 TABEND EQU *
2244 *
2245 * ** 6809 VECTOR ADDRESSES **
2246 *
2247 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
2248 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
2249 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
2250 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
2251 * HIS OWN ROUTINES IF HE SO DESIRES.
2252 *
2253 *
2254 FDA3 F9 94 RAMVEC FDB SWIE USER-V
2255 FDA5 F8 A7 FDB RTI SWI3-V
2256 FDA7 F8 A7 FDB RTI SWI2-V
2257 FDA9 F8 A7 FDB RTI FIRQ-V
2258 FDAB F8 A7 FDB RTI IRQ-V
2259 FDAD F9 94 FDB SWIE SWI-V
2260 FDAF FF FF FDB $FFFF SVC-VO
2261 FDB1 FF FF FDB $FFFF SVC-VL
2262 *
2263 * PRINTABLE MESSAGE STRINGS
2264 *
2265 FDB3 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2266 FDB8 53 59 53 30 39 42 FCC 'SYS09BUG 1.3 FOR '
55 47 20 31 2E 33
20 46 4F 52 20
2084 IFD FPGAOPT`
2085 FCC 'FPGA '
2086 ENDIF FPGAOPT
2086 ENDIF FPGAOPT
2087 IFD ADSOPT
2088 FCC 'ADS6809 '
2089 ENDIF ADSOPT
2089 ENDIF ADSOPT
2090 IFD SWTPOPT`
2091 FDC9 53 57 54 50 43 20 FCC 'SWTPC '
2092 ENDIF SWTPOPT
2093 FDCF 20 2D 20 FCC ' - '
2094 FDD2 04 FCB 4
2095 FDD3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
2267 IFD S3EOPT
2268 FCC 'S3E '
2269 ENDIF S3EOPT
2269 ENDIF S3EOPT
2270 IFD FPGAOPT
2271 FCC 'FPGA '
2272 ENDIF FPGAOPT
2272 ENDIF FPGAOPT
2273 IFD ADSOPT
2274 FCC 'ADS6809 '
2275 ENDIF ADSOPT
2275 ENDIF ADSOPT
2276 IFD SWTPOPT`
2277 FDC9 53 57 54 50 43 20 FCC 'SWTPC '
2278 ENDIF SWTPOPT
2279 FDCF 20 2D 20 FCC ' - '
2280 FDD2 04 FCB 4
2281 FDD3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2096 FDDA 3E MSG3 FCC '>'
2097 FDDB 04 FCB 4
2098 FDDC 57 48 41 54 3F MSG4 FCC 'WHAT?'
2099 FDE1 04 FCB 4
2100 FDE2 20 2D 20 MSG5 FCC ' - '
2101 FDE5 04 FCB 4'
2102 FDE6 20 20 53 50 3D MSG10 FCC ' SP='
2103 FDEB 04 FCB 4
2104 FDEC 20 20 50 43 3D MSG11 FCC ' PC='
2105 FDF1 04 FCB 4
2106 FDF2 20 20 55 53 3D MSG12 FCC ' US='
2107 FDF7 04 FCB 4
2108 FDF8 20 20 49 59 3D MSG13 FCC ' IY='
2109 FDFD 04 FCB 4
2110 FDFE 20 20 49 58 3D MSG14 FCC ' IX='
2111 FE03 04 FCB 4
2112 FE04 20 20 44 50 3D MSG15 FCC ' DP='
2113 FE09 04 FCB 4
2114 FE0A 20 20 41 3D MSG16 FCC ' A='
2115 FE0E 04 FCB 4
2116 FE0F 20 20 42 3D MSG17 FCC ' B='
2117 FE13 04 FCB 4
2118 FE14 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2119 FE1A 04 FCB 4
2120 FE1B 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
2282 FDDA 3E MSG3 FCC '>'
2283 FDDB 04 FCB 4
2284 FDDC 57 48 41 54 3F MSG4 FCC 'WHAT?'
2285 FDE1 04 FCB 4
2286 FDE2 20 2D 20 MSG5 FCC ' - '
2287 FDE5 04 FCB 4'
2288 FDE6 20 20 53 50 3D MSG10 FCC ' SP='
2289 FDEB 04 FCB 4
2290 FDEC 20 20 50 43 3D MSG11 FCC ' PC='
2291 FDF1 04 FCB 4
2292 FDF2 20 20 55 53 3D MSG12 FCC ' US='
2293 FDF7 04 FCB 4
2294 FDF8 20 20 49 59 3D MSG13 FCC ' IY='
2295 FDFD 04 FCB 4
2296 FDFE 20 20 49 58 3D MSG14 FCC ' IX='
2297 FE03 04 FCB 4
2298 FE04 20 20 44 50 3D MSG15 FCC ' DP='
2299 FE09 04 FCB 4
2300 FE0A 20 20 41 3D MSG16 FCC ' A='
2301 FE0E 04 FCB 4
2302 FE0F 20 20 42 3D MSG17 FCC ' B='
2303 FE13 04 FCB 4
2304 FE14 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2305 FE1A 04 FCB 4
2306 FE1B 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2121 FE23 53 31 MSG20 FCC 'S1'
2122 FE25 04 FCB 4
2123 IFD DATOPT
2124 *
2125 * POWER UP/ RESET/ NMI ENTRY POINT
2126 *
2127 FF00 ORG $FF00
2128 *
2129 *
2130 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11
2131 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO
2132 *
2133 *
2134 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2135 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2136 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2137 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2138 * STORED IN IT.
2139 *
2140 *
2141 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2142 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION
2143 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2144 *
2145 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2146 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2147 * PHYSICAL ADDRESSES.
2148 *
2149 FF0A 86 F0 LDA #$F0
2150 FF0C A7 84 STA ,X STORE $F0 AT $FFFF
2151 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2152 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2153 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2154 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0
2155 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2156 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2157 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER
2158 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2159 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2160 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN
2161 *
2162 *
2163 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2164 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2165 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2166 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2167 * IS STORED IN RAM IN THE LOCATION THAT IS
2168 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2169 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2170 * WHEN TESTING LOCATION $70A0, MEANING THERE
2171 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2172 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2173 * "7" IN THE $70A0 WILL BE STORED IN
2174 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2175 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2176 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2177 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2178 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2179 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2180 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2181 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2182 * OF RAM RESPONDS.
2183 *
2184 *
2185 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2186 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2187 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS
2188 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN
2189 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING
2190 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS
2191 FF32 44 LSRA TRANSLATION RAM.
2192 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D"
2193 *
2194 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER
2195 *
2196 *
2197 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2198 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2199 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2200 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2201 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2202 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2203 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2204 *
2205 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2206 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2207 *
2208 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2209 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2210 *
2211 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2212 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2213 *
2214 *
2215 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2216 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2217 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2218 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2219 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2220 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2221 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2222 * MEMORY ADDRESSED AS FOLLOWS....
2223 *
2224 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2225 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2226 *
2227 *
2228 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2229 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2230 FF40 6F 2E CLR 14,Y CLEAR $DFDE
2231 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2232 FF44 A7 2F STA 15,Y STORE AT $DFDF
2233 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2234 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2235 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2236 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2237 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2238 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2239 FF54 27 22 BEQ FINTAB SKIP IF FINISHED
2240 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2241 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2242 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2243 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION
2244 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2245 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2246 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2247 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2248 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2249 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2250 FF6E 44 LSRA
2251 FF6F 44 LSRA
2252 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2253 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2254 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2255 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2256 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2257 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE
2258 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE
2259 *
2260 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2261 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2262 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2263 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2264 *
2265 *
2266 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C"
2267 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2268 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2269 FF86 4A DECA ELSE POINT 4K LOWER
2270 FF87 2A F9 BPL FINDC GO TRY AGAIN
2271 FF89 20 14 BRA XFERTF
2272 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2273 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2274 *
2275 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2276 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2277 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2278 * ADDRESSES FROM $0000 AND UP....
2279 *
2280 FF8F 4F CLRA START AT ZERO
2281 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2282 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2283 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP
2284 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE
2285 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2286 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY
2287 FF9B 81 0C CMPA #$0C LAST ENTRY YET ?
2288 FF9D 2D F3 BLT COMPRS
2289 *
2290 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2291 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2292 * THE MP-09 CPU CARD.
2293 *
2294 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2295 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE
2296 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2297 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11
2298 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE
2299 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED
2300 *
2301 ELSE
2302 LRA RTS
2303 START LDS #STACK INITIALIZE STACK POINTER
2304 CLRB
2305 ENDIF DATOPT
2305 ENDIF DATOPT
2306 *
2307 FFAB 53 COMB SET "B" NON-ZERO
2308 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG
2309 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE
2307 FE23 53 31 MSG20 FCC 'S1'
2308 FE25 04 FCB 4
2309 IFD DATOPT
2310 *
2311 ** INTERRUPT JUMP VECTORS
2312 *
2313 FFB2 6E 9F DF C0 V1 JMP [STACK]
2314 FFB6 6E 9F DF C4 V2 JMP [SWI2]
2315 FFBA 6E 9F DF C6 V3 JMP [FIRQ]
2316 FFBE 6E 9F DF C8 V4 JMP [IRQ]
2317 FFC2 6E 9F DF CA V5 JMP [SWI]
2311 * POWER UP/ RESET/ NMI ENTRY POINT
2312 *
2313 FF00 ORG $FF00
2314 *
2315 *
2316 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11
2317 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO
2318 *
2319 * SWI3 ENTRY POINT
2320 *
2321 FFC6 1F 43 SWI3E TFR S,U
2322 FFC8 AE 4A LDX 10,U *$FFC8
2323 FFCA E6 80 LDB ,X+
2324 FFCC AF 4A STX 10,U
2325 FFCE 4F CLRA
2326 FFCF 58 ASLB
2327 FFD0 49 ROLA
2328 FFD1 BE DF CC LDX SVCVO
2329 FFD4 8C FF FF CMPX #$FFFF
2330 FFD7 27 0F BEQ SWI3Z
2331 FFD9 30 8B LEAX D,X
2332 FFDB BC DF CE CMPX SVCVL
2333 FFDE 22 08 BHI SWI3Z
2334 FFE0 34 10 PSHS X
2335 FFE2 EC C4 LDD ,U
2336 FFE4 AE 44 LDX 4,U
2337 FFE6 6E F1 JMP [,S++]
2338 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP
2339 FFEA EE 42 LDU 2,U
2340 FFEC 6E 9F DF C2 JMP [SWI3]
2341 *
2342 * 6809 VECTORS
2343 *
2344 FFF0 ORG $FFF0
2345 FFF0 FF B2 FDB V1 USER-V
2346 FFF2 FF C6 FDB SWI3E SWI3-V
2347 FFF4 FF B6 FDB V2 SWI2-V
2348 FFF6 FF BA FDB V3 FIRQ-V
2349 FFF8 FF BE FDB V4 IRQ-V
2350 FFFA FF C2 FDB V5 SWI-V
2351 FFFC FF B2 FDB V1 NMI-V
2352 FFFE FF 00 FDB START RESTART-V
2353 END START
2319 *
2320 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2321 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2322 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2323 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2324 * STORED IN IT.
2325 *
2326 *
2327 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2328 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION
2329 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2330 *
2331 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2332 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2333 * PHYSICAL ADDRESSES.
2334 *
2335 FF0A 86 F0 LDA #$F0
2336 FF0C A7 84 STA ,X STORE $F0 AT $FFFF
2337 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2338 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2339 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2340 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0
2341 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2342 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2343 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER
2344 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2345 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2346 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN
2347 *
2348 *
2349 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2350 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2351 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2352 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2353 * IS STORED IN RAM IN THE LOCATION THAT IS
2354 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2355 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2356 * WHEN TESTING LOCATION $70A0, MEANING THERE
2357 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2358 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2359 * "7" IN THE $70A0 WILL BE STORED IN
2360 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2361 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2362 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2363 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2364 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2365 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2366 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2367 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2368 * OF RAM RESPONDS.
2369 *
2370 *
2371 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2372 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2373 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS
2374 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN
2375 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING
2376 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS
2377 FF32 44 LSRA TRANSLATION RAM.
2378 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D"
2379 *
2380 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER
2381 *
2382 *
2383 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2384 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2385 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2386 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2387 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2388 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2389 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2390 *
2391 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2392 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2393 *
2394 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2395 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2396 *
2397 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2398 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2399 *
2400 *
2401 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2402 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2403 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2404 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2405 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2406 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2407 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2408 * MEMORY ADDRESSED AS FOLLOWS....
2409 *
2410 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2411 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2412 *
2413 *
2414 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2415 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2416 FF40 6F 2E CLR 14,Y CLEAR $DFDE
2417 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2418 FF44 A7 2F STA 15,Y STORE AT $DFDF
2419 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2420 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2421 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2422 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2423 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2424 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2425 FF54 27 22 BEQ FINTAB SKIP IF FINISHED
2426 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2427 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2428 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2429 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION
2430 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2431 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2432 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2433 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2434 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2435 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2436 FF6E 44 LSRA
2437 FF6F 44 LSRA
2438 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2439 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2440 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2441 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2442 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2443 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE
2444 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE
2445 *
2446 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2447 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2448 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2449 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2450 *
2451 *
2452 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C"
2453 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2454 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2455 FF86 4A DECA ELSE POINT 4K LOWER
2456 FF87 2A F9 BPL FINDC GO TRY AGAIN
2457 FF89 20 14 BRA XFERTF
2458 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2459 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2460 *
2461 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2462 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2463 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2464 * ADDRESSES FROM $0000 AND UP....
2465 *
2466 FF8F 4F CLRA START AT ZERO
2467 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2468 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2469 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP
2470 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE
2471 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2472 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY
2473 FF9B 81 0C CMPA #$0C LAST ENTRY YET ?
2474 FF9D 2D F3 BLT COMPRS
2475 *
2476 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2477 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2478 * THE MP-09 CPU CARD.
2479 *
2480 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2481 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE
2482 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2483 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11
2484 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE
2485 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED
2486 *
2487 ELSE
2488 LRA RTS
2489 START LDS #STACK INITIALIZE STACK POINTER
2490 CLRB
2491 ENDIF DATOPT
2491 ENDIF DATOPT
2492 *
2493 FFAB 53 COMB SET "B" NON-ZERO
2494 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG
2495 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE
2496 *
2497 ** INTERRUPT JUMP VECTORS
2498 *
2499 FFB2 6E 9F DF C0 V1 JMP [STACK]
2500 FFB6 6E 9F DF C4 V2 JMP [SWI2]
2501 FFBA 6E 9F DF C6 V3 JMP [FIRQ]
2502 FFBE 6E 9F DF C8 V4 JMP [IRQ]
2503 FFC2 6E 9F DF CA V5 JMP [SWI]
2504 *
2505 * SWI3 ENTRY POINT
2506 *
2507 FFC6 1F 43 SWI3E TFR S,U
2508 FFC8 AE 4A LDX 10,U *$FFC8
2509 FFCA E6 80 LDB ,X+
2510 FFCC AF 4A STX 10,U
2511 FFCE 4F CLRA
2512 FFCF 58 ASLB
2513 FFD0 49 ROLA
2514 FFD1 BE DF CC LDX SVCVO
2515 FFD4 8C FF FF CMPX #$FFFF
2516 FFD7 27 0F BEQ SWI3Z
2517 FFD9 30 8B LEAX D,X
2518 FFDB BC DF CE CMPX SVCVL
2519 FFDE 22 08 BHI SWI3Z
2520 FFE0 34 10 PSHS X
2521 FFE2 EC C4 LDD ,U
2522 FFE4 AE 44 LDX 4,U
2523 FFE6 6E F1 JMP [,S++]
2524 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP
2525 FFEA EE 42 LDU 2,U
2526 FFEC 6E 9F DF C2 JMP [SWI3]
2527 *
2528 * 6809 VECTORS
2529 *
2530 FFF0 ORG $FFF0
2531 FFF0 FF B2 FDB V1 USER-V
2532 FFF2 FF C6 FDB SWI3E SWI3-V
2533 FFF4 FF B6 FDB V2 SWI2-V
2534 FFF6 FF BA FDB V3 FIRQ-V
2535 FFF8 FF BE FDB V4 IRQ-V
2536 FFFA FF C2 FDB V5 SWI-V
2537 FFFC FF B2 FDB V1 NMI-V
2538 FFFE FF 00 FDB START RESTART-V
2539 END START
Program + Init Data = 1830 bytes
Error count = 0
/trunk/src/sys09bug/sys09bug_fpga_b4_0.vhd
0,0 → 1,16
INIT_00 => x"A780A610C6C0DF8E1074FE8E2EFA1AFB1EFB8FFBCEFCB9FC9BFCA1FC61F814F8",
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC65B0117E0DFBF00E08EF9265AA0",
INIT_02 => x"0317A3FE8E0C0417F62A5A19048B0327856D0DC64FD0DF8E47031784FE8E9F04",
INIT_03 => x"17408B981F5304175E86092C2081891FF1270D817F84370417B30217AAFE8E2E",
INIT_04 => x"20F00217ACFE8EF52674FE8C02300F2780E13BFE8E20C0022F60C14704174C04",
INIT_05 => x"17A4A60F0417A50317211F650217B2FE8E121F2D296B03173B341FBC2094ADC0",
INIT_06 => x"27A4A1A4A7390F260D8117275E81DD271881E127088111285E0317070417A503",
INIT_07 => x"0B031705201F30C0DF8E321FA20217BE203F31C2202131E503173F86E8031708",
INIT_08 => x"279A03170527E4AC011FF0C4201F0634F0C41000C3101F390124E1AC20340629",
INIT_09 => x"265A8E03172C031780A610C69603172E0317E4AEEE0117B2FE8E103439623203",
INIT_0a => x"29B70217BC20EE265A7703172E8602237E810425208180A610C6E1AE860317F5",
INIT_0b => x"3984A73F86A4AFA0A709273F8184A60F271035558DFFFF8E10341A24C0DF8C1E",
INIT_0c => x"4AAF0427268D1F304AAE431F39FB265A188D08C6E3DF8E104603163F86490317",
INIT_0d => x"A7A0A7A0A7FF8684A7A4A604263F8184A60A24C0DF8C21AEB9FE16480217068D",
INIT_0e => x"0186398D46E0B7E086408D393D3139F7265A0427A1ACA0A608C6E3DF8E1039A0",
INIT_0f => x"178D47E0B7208645E0B744E0B743E0B74F42E0B701862D8D47E0B7EF8641E0B7"
/trunk/src/sys09bug/sys09bug_fpga_b4_1.vhd
0,0 → 1,16
INIT_00 => x"E0B6F926808547E0B63B341F4AAF00C08EF42600C28C80A740E0B6218D00C08E",
INIT_01 => x"54545454A6E6D0DF8E104444444462A6363439F927088547E0B639F227408547",
INIT_02 => x"FCBD8435FD265A20C60434B63562E762EA62A70F8462A65858585853A6E6E4E7",
INIT_03 => x"0234A80117F12631813D273981230217F92653812A0217E2DF7F6802171186E3",
INIT_04 => x"E0EB02340C2904358E01170434E46AE46AE4EBE0EBE0E6103421299101172629",
INIT_05 => x"0117E26F1202161386E2DF731A02173F86BA27FFC102355FEB2080A70527E46A",
INIT_06 => x"2320008310062762A3E4ECF901171286E3FCBDE4AF0130492562AC4D2930344A",
INIT_07 => x"1780A684EB63EB62EB68011762AE750117981F03CB2F0017F3FE8E64E720C602",
INIT_08 => x"10347120028D396532B701171486C326E4AC62AF5B0117981F53F526646A6501",
INIT_09 => x"8D618D394AAF0229F68DF28D910017E50016F80016A101169035690017A4FE8E",
INIT_0a => x"498D3944AF0229D58DD18D5E8D3946AF0229E08DDC8D728D3948AF0229EB8DE7",
INIT_0b => x"8D3941A70229B18DB08D588D3942A70229BC8DBB8D6C8D3943A70229C78DC68D",
INIT_0c => x"BF0016311FF48DB6FE8E39F726048180A63F011739C4A7808A0429A68DA58D5F",
INIT_0d => x"8DC8FE8EE12044AED78DCEFE8EB4001643A6E18DD4FE8EF42048AEEA8DC2FE8E",
INIT_0e => x"D02042A6B38DDFFE8ED92041A6BC8DDAFE8ECF204AAEC58DBCFE8ED82046AECE",
INIT_0f => x"B2FE8EBF8DB88DB08DA98DA18D27FF17B2FE8E900016EBFE8EC4A6AA8DE4FE8E"
/trunk/src/sys09bug/sys09bug_fpga_b4_2.vhd
0,0 → 1,16
INIT_00 => x"3C29088D011F42290E8DB800172D86121F4D29098DD520CE8DC78DC08D17FF17",
INIT_01 => x"811D2530815B8D39E0AB04342829078D891F484848483229118D903561A71034",
INIT_02 => x"3439021A39578003226681072561813937800322468112254181393080032239",
INIT_03 => x"C602345120078B022F3981308B0F840235048D4444444402340235028D023510",
INIT_04 => x"207F84048D0627E2DF7D00F09F6E8235F1265A3F8D438D2D860225E46880A608",
INIT_05 => x"85E0DF9FA60234903501A6EE27018584A620E08E0926018584A6E0DFBE10342D",
INIT_06 => x"3501A70235FA27028584A6E0DFBE1234458D2086008D8235018520E0B6052601",
INIT_07 => x"A7FBDFFD0000CC30E08E39E2DFB7FF86016D84A7118684A70386E0DFBE138D90",
INIT_08 => x"8D0427FEDF7D30E08E16345986028D1B86FEDF7F01E702C6FDDFFD04E703E702",
INIT_09 => x"1A816C0027101B814100271008819635C5001784A70520098D042420810D2074",
INIT_0a => x"51260A81110027100B812C0027100C81990027100D814500271016818E002710",
INIT_0b => x"164A3327FBDFB67400165A3C0027105DFBDFFC9900168300261019C15CFBDFFC",
INIT_0c => x"2710598116273DC1FEDFF65800160000CC5B00162500271050814CFBDFB66800",
INIT_0d => x"2080FEDF7F39FDDFB70426FDDF7D39FEDF7F39FEDFB704263D81312754816E00",
INIT_0e => x"A74C84E720C6FBDFB6168D0000CC1B20E12218C120C0FDDF7FFDDFF6ED224F81",
INIT_0f => x"C15C4FF02650814CFBDFFC3903E702A7FBDFFDFCDFF64F39FEDF7FF726508102"
/trunk/src/sys09bug/sys09bug_fpga_b4_3.vhd
0,0 → 1,16
INIT_00 => x"2650C15C84A702E7FBDFF72086FBDFF604E75F012519C15C04E6E78D5AEA2619",
INIT_01 => x"FB0274FB0139FEDFF702E7FBDFF75FE4205F03E7FCDFF7082719C15CFCDFF6F4",
INIT_02 => x"505EFA4CA5F847FDF8455CF94248FB1953FB183DFB1531FB105EFB047FFB0369",
INIT_03 => x"94F9A7F8A7F8A7F8A7F894F992FC55D5F94488F958F1F853EDFB52A8F84DBCFA",
INIT_04 => x"20204147504620524F4620332E312047554239305359530000000A0DFFFFFFFF",
INIT_05 => x"43502020043D5053202004202D20043F54414857043E040000000A0D4B04202D",
INIT_06 => x"20043D412020043D50442020043D58492020043D59492020043D53552020043D",
INIT_07 => x"0000000000000000000004315343565A4E4948464504203A43432020043D4220",
INIT_08 => x"300B2784AC1084AF1084EEAA558E10A0D08E84A7F086FB264A80A70F86F0FF8E",
INIT_09 => x"2DA7D0DF8E10C0DFCE10FDFFB74444444443101F84EFD620ED26A0F08C00F089",
INIT_0a => x"1084AF10AA558E1084EE2227A0F08C00F08930FB2A4AA66F0C862FA7F0862E6F",
INIT_0b => x"2EA7D0DF8E10F186D520A5A70F88891F44444444101FD0DF8E1084EFE92684AC",
INIT_0c => x"8EF32D0C814C80E7A66F0427A6E6211F4F2CE7A66F1420F92A4A0526A6E60C86",
INIT_0d => x"9F6EC6DF9F6EC4DF9F6EC0DF9F6E62F816E2DFF753F9265A80A7A0A610C6F0FF",
INIT_0e => x"0822CEDFBC8B300F27FFFF8CCCDFBE49584F4AAF80E64AAE431FCADF9F6EC8DF",
INIT_0f => x"00FFB2FFC2FFBEFFBAFFB6FFC6FFB2FFC2DF9F6E42EE1F37F16E44AEC4EC1034"
/trunk/src/sys09bug/sys09bug_s3e.s19
0,0 → 1,60
S123F800F814F84BFC94FC8EFCACFCC1FB82FB11FB0DFEE88EFE67108E7FC0C610A680A72C
S123F820A05A26F98EE000BF7FD0170145C60C6FE25A26FB308CDDAF6A86D0A7E41F431728
S123F84004928EFE7717033A1701DE8EFE9C1702BC170440847F810D27F11F8981202C0942
S123F860865E17045C1F988B40170455170450C1602F02C0208EFE2EE180270F30028CFE8D
S123F8806726F58EFE9E1702F920C0AD9420BC1F343B170374292D1F128EFEA417026E1F30
S123F8A0211703AE170418A6A41703AE1704101703672811810827E1811827DD815E2717E6
S123F8C0810D260F39A7A4A1A427081703F1863F1703EE312120C2313F20BE1702AB1F32FA
S123F8E08E7FC0301F200517031429063420ACE12401391F10C30010C4F034061F20C4F044
S123F9001F01ACE427051703A3270332623934108EFEA41701F7AEE417033717039FC6105E
S123F920A6801703351703975A26F517038FAEE1C610A68081202504817E2302862E170338
S123F940805A26EE20BC1702C0291E8C7FC0241A34108EFFFF8D5B3510270FA684813F276C
S123F96009A7A0AFA4863FA78439170352863F16034F108E7FD3C6088D1E5A26FB391F439F
S123F980AE4A301F8D2C2704AF4A8D0C1702518E0000BF7FED16FEB3AE218C7FC0240AA64E
S123F9A084813F2604A6A4A78486FFA7A0A7A0A7A039108E7FD3C608A6A0ACA127045A26D1
S123F9C0F739313D3917015F291C1702F21702392914BF7FEDBE7FC0BF7FEB8EF9E7BF7FF9
S123F9E0C01700452020391F438636B7E071B6E0701701ECAE4AA684813F2724BE7FED27C0
S123FA001F301FBF7FED1F34860DB7E0708636B7E071B6E0708636B7E073863FB7E0713BC4
S123FA20BE7FEBBF7FC016FE228632B7E071863AB7E07386FFB7E0708600B7E0728636B74E
S123FA40E071863EB7E073393404C6205A26FD3584BDFCD686111702687F7FD217022A81BB
S123FA605326F91702238139273D813126F11701A83402292617019129213410E6E0EBE0E0
S123FA80EBE46AE46AE4340417018E3504290C3402EBE06AE42705A78020EB5F3502C1FFA8
S123FAA027BA863F17021A737FD286131602126FE217014A3430294DAC6225493001AFE415
S123FAC0BDFCD686121701F9ECE4A3622706108300202302C620E7648EFEE517002FCB035A
S123FAE01F98170175AE62170168EB62EB63EB84A6801701656A6426F5531F9817015BAF6C
S123FB0062ACE426C386141701B73265398D02207134108EFE9617006935901601A1160034
S123FB20F81600E51700918DF28DF62902AF4A398D618DE78DEB2902AF48398D728DDC8D9D
S123FB40E02902AF46398D5E8DD18DD52902AF44398D498DC68DC72902A743398D6C8DBB5A
S123FB608DBC2902A742398D588DB08DB12902A741398D5F8DA58DA629048A80A7C43917FC
S123FB80013FA680810426F7398EFEA88DF41F311600BF8EFEB48DEAAE4820F48EFEC68DA6
S123FBA0E1A6431600B48EFEC08DD7AE4420E18EFEBA8DCEAE4620D88EFEAE8DC5AE4A20D9
S123FBC0CF8EFECC8DBCA64120D98EFED18DB3A64220D08EFED68DAAA6C48EFEDD1600904A
S123FBE08EFEA417FF278DA18DA98DB08DB88DBF8EFEA417FF178DC08DC78DCE20D58D097E
S123FC00294D1F12862D1700B88D0E29421F018D08293C3410A76135908D112932484848B5
S123FC20481F898D0729283404ABE0398D5B8130251D81392203803039814125128146226A
S123FC400380373981612507816622038057391A0239341035028D023502340244444444A7
S123FC608D043502840F8B3081392F028B0720513402C608A68068E42502862D8D438D3F90
S123FC805A26F135826E9FF0007D7FD227068D04847F202D3410BE7FD0A684850126098EA1
S123FCA0E020A684850127EEA60135903402A69F7FD085012605B6E020850135828D00868E
S123FCC0208D453412BE7FD0A684850227FA3502A70135908D13BE7FD08603A7848611A7C6
S123FCE0846D0186FFB77FD2398EE030CC0000FD7FEFA702E703E704FD7FF1C602E7017F59
S123FD007FF2861B8D02865934168EE0307D7FF227048D74200D812024048D092005A78481
S123FD201700C53596810810270041811B1027006C811A1027008E811610270045810D10C7
S123FD40270099810C1027002C810B10270011810A2651FC7FEF5CC1191026008316009911
S123FD60FC7FEF5D1027003C5A160074B67FEF27334A160068B67FEF4C8150102700251668
S123FD80005BCC0000160058F67FF2C13D271681591027006E81542731813D2604B77FF26C
S123FDA0397F7FF2397D7FF12604B77FF1397F7FF28020814F22EDF67FF17F7FF1C020C101
S123FDC01822E1201BCC00008D16B67FEFC620E7844CA702815026F77F7FF2394FF67FF025
S123FDE0FD7FEFA702E70339FC7FEF4C815026F04F5CC11926EA5A8DE7E6045CC119250182
S123FE005FE704F67FEF8620F77FEFE702A7845CC15026F4F67FF05CC1192708F77FF0E773
S123FE20035F20E45FF77FEFE702F77FF23901FB6702FB5C03FB7204FB5110FB2415FB301F
S123FE4018FB4619FB3B42F94645F8E747F88F4CFA5150FAAF4DF89252FBE053F8DB58F978
S123FE607255FC8554F9C5F97EF891F891F891F891F97EFFFFFFFF0D0A00000053595330D0
S123FE803942554720312E3320464F522053334520202D20044B0D0A000000043E045748CB
S123FEA041543F04202D2004202053503D04202050433D04202055533D04202049593D0471
S123FEC0202049583D04202044503D042020413D042020423D04202043433A20044546486B
S123FEE0494E5A56435331043910CE7FC05F53F77FD216F91F6E9F7FC06E9F7FC46E9F7F46
S123FF00C66E9F7FC86E9F7FCA1F43AE4AE680AF4A4F5849BE7FCC8CFFFF270F308BBC7F05
S116FF20CE22083410ECC4AE446EF1371FEE426E9F7FC2B9
S113FFF0FEF5FF09FEF9FEFDFF01FF05FEF5FEE932
S9030000FC
/trunk/src/sys09bug/sys09bug_fpga_b16.vhd
0,0 → 1,64
INIT_00 => x"A780A610C6C0DF8E1074FE8E2EFA1AFB1EFB8FFBCEFCB9FC9BFCA1FC61F814F8",
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC65B0117E0DFBF00E08EF9265AA0",
INIT_02 => x"0317A3FE8E0C0417F62A5A19048B0327856D0DC64FD0DF8E47031784FE8E9F04",
INIT_03 => x"17408B981F5304175E86092C2081891FF1270D817F84370417B30217AAFE8E2E",
INIT_04 => x"20F00217ACFE8EF52674FE8C02300F2780E13BFE8E20C0022F60C14704174C04",
INIT_05 => x"17A4A60F0417A50317211F650217B2FE8E121F2D296B03173B341FBC2094ADC0",
INIT_06 => x"27A4A1A4A7390F260D8117275E81DD271881E127088111285E0317070417A503",
INIT_07 => x"0B031705201F30C0DF8E321FA20217BE203F31C2202131E503173F86E8031708",
INIT_08 => x"279A03170527E4AC011FF0C4201F0634F0C41000C3101F390124E1AC20340629",
INIT_09 => x"265A8E03172C031780A610C69603172E0317E4AEEE0117B2FE8E103439623203",
INIT_0a => x"29B70217BC20EE265A7703172E8602237E810425208180A610C6E1AE860317F5",
INIT_0b => x"3984A73F86A4AFA0A709273F8184A60F271035558DFFFF8E10341A24C0DF8C1E",
INIT_0c => x"4AAF0427268D1F304AAE431F39FB265A188D08C6E3DF8E104603163F86490317",
INIT_0d => x"A7A0A7A0A7FF8684A7A4A604263F8184A60A24C0DF8C21AEB9FE16480217068D",
INIT_0e => x"0186398D46E0B7E086408D393D3139F7265A0427A1ACA0A608C6E3DF8E1039A0",
INIT_0f => x"178D47E0B7208645E0B744E0B743E0B74F42E0B701862D8D47E0B7EF8641E0B7",
INIT_10 => x"E0B6F926808547E0B63B341F4AAF00C08EF42600C28C80A740E0B6218D00C08E",
INIT_11 => x"54545454A6E6D0DF8E104444444462A6363439F927088547E0B639F227408547",
INIT_12 => x"FCBD8435FD265A20C60434B63562E762EA62A70F8462A65858585853A6E6E4E7",
INIT_13 => x"0234A80117F12631813D273981230217F92653812A0217E2DF7F6802171186E3",
INIT_14 => x"E0EB02340C2904358E01170434E46AE46AE4EBE0EBE0E6103421299101172629",
INIT_15 => x"0117E26F1202161386E2DF731A02173F86BA27FFC102355FEB2080A70527E46A",
INIT_16 => x"2320008310062762A3E4ECF901171286E3FCBDE4AF0130492562AC4D2930344A",
INIT_17 => x"1780A684EB63EB62EB68011762AE750117981F03CB2F0017F3FE8E64E720C602",
INIT_18 => x"10347120028D396532B701171486C326E4AC62AF5B0117981F53F526646A6501",
INIT_19 => x"8D618D394AAF0229F68DF28D910017E50016F80016A101169035690017A4FE8E",
INIT_1a => x"498D3944AF0229D58DD18D5E8D3946AF0229E08DDC8D728D3948AF0229EB8DE7",
INIT_1b => x"8D3941A70229B18DB08D588D3942A70229BC8DBB8D6C8D3943A70229C78DC68D",
INIT_1c => x"BF0016311FF48DB6FE8E39F726048180A63F011739C4A7808A0429A68DA58D5F",
INIT_1d => x"8DC8FE8EE12044AED78DCEFE8EB4001643A6E18DD4FE8EF42048AEEA8DC2FE8E",
INIT_1e => x"D02042A6B38DDFFE8ED92041A6BC8DDAFE8ECF204AAEC58DBCFE8ED82046AECE",
INIT_1f => x"B2FE8EBF8DB88DB08DA98DA18D27FF17B2FE8E900016EBFE8EC4A6AA8DE4FE8E",
INIT_20 => x"3C29088D011F42290E8DB800172D86121F4D29098DD520CE8DC78DC08D17FF17",
INIT_21 => x"811D2530815B8D39E0AB04342829078D891F484848483229118D903561A71034",
INIT_22 => x"3439021A39578003226681072561813937800322468112254181393080032239",
INIT_23 => x"C602345120078B022F3981308B0F840235048D4444444402340235028D023510",
INIT_24 => x"207F84048D0627E2DF7D00F09F6E8235F1265A3F8D438D2D860225E46880A608",
INIT_25 => x"85E0DF9FA60234903501A6EE27018584A620E08E0926018584A6E0DFBE10342D",
INIT_26 => x"3501A70235FA27028584A6E0DFBE1234458D2086008D8235018520E0B6052601",
INIT_27 => x"A7FBDFFD0000CC30E08E39E2DFB7FF86016D84A7118684A70386E0DFBE138D90",
INIT_28 => x"8D0427FEDF7D30E08E16345986028D1B86FEDF7F01E702C6FDDFFD04E703E702",
INIT_29 => x"1A816C0027101B814100271008819635C5001784A70520098D042420810D2074",
INIT_2a => x"51260A81110027100B812C0027100C81990027100D814500271016818E002710",
INIT_2b => x"164A3327FBDFB67400165A3C0027105DFBDFFC9900168300261019C15CFBDFFC",
INIT_2c => x"2710598116273DC1FEDFF65800160000CC5B00162500271050814CFBDFB66800",
INIT_2d => x"2080FEDF7F39FDDFB70426FDDF7D39FEDF7F39FEDFB704263D81312754816E00",
INIT_2e => x"A74C84E720C6FBDFB6168D0000CC1B20E12218C120C0FDDF7FFDDFF6ED224F81",
INIT_2f => x"C15C4FF02650814CFBDFFC3903E702A7FBDFFDFCDFF64F39FEDF7FF726508102",
INIT_30 => x"2650C15C84A702E7FBDFF72086FBDFF604E75F012519C15C04E6E78D5AEA2619",
INIT_31 => x"FB0274FB0139FEDFF702E7FBDFF75FE4205F03E7FCDFF7082719C15CFCDFF6F4",
INIT_32 => x"505EFA4CA5F847FDF8455CF94248FB1953FB183DFB1531FB105EFB047FFB0369",
INIT_33 => x"94F9A7F8A7F8A7F8A7F894F992FC55D5F94488F958F1F853EDFB52A8F84DBCFA",
INIT_34 => x"20204147504620524F4620332E312047554239305359530000000A0DFFFFFFFF",
INIT_35 => x"43502020043D5053202004202D20043F54414857043E040000000A0D4B04202D",
INIT_36 => x"20043D412020043D50442020043D58492020043D59492020043D53552020043D",
INIT_37 => x"0000000000000000000004315343565A4E4948464504203A43432020043D4220",
INIT_38 => x"300B2784AC1084AF1084EEAA558E10A0D08E84A7F086FB264A80A70F86F0FF8E",
INIT_39 => x"2DA7D0DF8E10C0DFCE10FDFFB74444444443101F84EFD620ED26A0F08C00F089",
INIT_3a => x"1084AF10AA558E1084EE2227A0F08C00F08930FB2A4AA66F0C862FA7F0862E6F",
INIT_3b => x"2EA7D0DF8E10F186D520A5A70F88891F44444444101FD0DF8E1084EFE92684AC",
INIT_3c => x"8EF32D0C814C80E7A66F0427A6E6211F4F2CE7A66F1420F92A4A0526A6E60C86",
INIT_3d => x"9F6EC6DF9F6EC4DF9F6EC0DF9F6E62F816E2DFF753F9265A80A7A0A610C6F0FF",
INIT_3e => x"0822CEDFBC8B300F27FFFF8CCCDFBE49584F4AAF80E64AAE431FCADF9F6EC8DF",
INIT_3f => x"00FFB2FFC2FFBEFFBAFFB6FFC6FFB2FFC2DF9F6E42EE1F37F16E44AEC4EC1034"
/trunk/src/sys09bug/sys09bug_swtp.s19
44,7 → 44,7
S123FD60A7846D0186FFB7DFE23901FBFC02FBF103FC0704FBE610FBB915FBC518FBDB193F
S123FD80FBD042F95C45F8FD47F8A54CFAE650FB444DF8A852FC7553F8F158F98844F9D54D
S123FDA055FA29F994F8A7F8A7F8A7F8A7F994FFFFFFFF0D0A0000005359533039425547D8
S123FDC020312E3220464F5220535754504320202D20044B0D0A000000043E045748415449
S123FDC020312E3320464F5220535754504320202D20044B0D0A000000043E045748415448
S123FDE03F04202D2004202053503D04202050433D04202055533D04202049593D04202087
S123FE0049583D04202044503D042020413D042020423D04202043433A2004454648494ED4
S109FE205A56435331045D
/trunk/src/sys09bug/sys09bug_ads.lst
42,2345 → 42,2541
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * *** COMMANDS ***
0042 *
0043 * CONTROL A = ALTER THE "A" ACCUMULATOR
0044 * CONTROL B = ALTER THE "B" ACCUMULATOR
0045 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0046 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0047 * CONTROL P = ALTER THE PROGRAM COUNTER
0048 * CONTROL U = ALTER USER STACK POINTER
0049 * CONTROL X = ALTER "X" INDEX REGISTER
0050 * CONTROL Y = ALTER "Y" INDEX REGISTER
0051 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0052 * D = 5.25" MINIFLOPPY BOOT
0053 * E ssss-eeee = EXAMINE MEMORY
0054 * FROM STARTING ADDRESS ssss
0055 * TO ENDING ADDRESS eeee.
0056 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0057 * L = LOAD TAPE
0058 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0059 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0060 * R = DISPLAY REGISTER CONTENTS
0061 * S = DISPLAY STACK FROM ssss TO $DFC0
0062 * U = 8" DMAF2 FLOPPY BOOT
0063 * U = USER EXTENSION COMMANDS AT $F000
0064 * X = REMOVE ALL BREAKPOINTS
0065 *
0066 *
0067 *
0068 ***************************************************
0069 * OPTION SWITCHES
0070 ***************************************************
0071 *
0072 *
0073 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0074 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0075 ** FOR LOADING AND SAVING S1 RECORDS
0076 *
0077 *FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD
0078 00FF ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0079 *SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0080 *
0081 ***************************************************
0082 * MEMORY MAP EQUATES *
0083 ***************************************************
0084 E000 MONIO EQU $E000 I/O SPACE
0085 DFC0 MONRAM EQU $DFC0 STACK SPACE
0086 F800 MONROM EQU $F800 START OF ROM
0087 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0088 0000 EXTCMD EQU $00 EXTENDED OFFSET
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * *** COMMANDS ***
0049 *
0050 * CONTROL A = ALTER THE "A" ACCUMULATOR
0051 * CONTROL B = ALTER THE "B" ACCUMULATOR
0052 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0053 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0054 * CONTROL P = ALTER THE PROGRAM COUNTER
0055 * CONTROL U = ALTER USER STACK POINTER
0056 * CONTROL X = ALTER "X" INDEX REGISTER
0057 * CONTROL Y = ALTER "Y" INDEX REGISTER
0058 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0059 * D = 5.25" MINIFLOPPY BOOT
0060 * E ssss-eeee = EXAMINE MEMORY
0061 * FROM STARTING ADDRESS ssss
0062 * TO ENDING ADDRESS eeee.
0063 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0064 * L = LOAD TAPE
0065 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0066 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0067 * R = DISPLAY REGISTER CONTENTS
0068 * S = DISPLAY STACK FROM ssss TO $DFC0
0069 * U = 8" DMAF2 FLOPPY BOOT
0070 * U = USER EXTENSION COMMANDS AT $F000
0071 * X = REMOVE ALL BREAKPOINTS
0072 *
0073 *
0074 *
0075 ***************************************************
0076 * OPTION SWITCHES
0077 ***************************************************
0078 *
0079 *
0080 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0081 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0082 ** FOR LOADING AND SAVING S1 RECORDS
0083 *
0084 *S3EOPT EQU $FF SPARTAN3E STARTER
0085 *FPGAOPT EQU $FF FPGA VIDEO & PS2 KEYBOARD
0086 00FF ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0087 *SWTPOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0088 *
0089 ***************************************************
0090 IFD FPGAOPT
0091 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0092 ENDIF FPGAOPT
0092 ENDIF FPGAOPT
0093 *
0094 IFD ADSOPT
0095 *RTCOPT EQU $FF REAL TIME CLOCK
0096 00FF PRTOPT EQU $FF PRINTER DRIVERS
0097 00FF MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0098 ENDIF ADSOPT
0099 *
0100 IFD SWTPOPT
0101 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0102 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0103 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0104 ENDIF
0104 ENDIF
0105 *
0106 ***************************************************
0107 * SYS09BUG VARIABLE SPACE
0108 ***************************************************
0109 *
0110 DFC0 ORG MONRAM
0111 DFC0 STACK RMB 2 TOP OF INTERNAL STACK / USER VECTOR
0112 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0113 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0114 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0115 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0116 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0117 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0118 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0119 IFD DATOPT
0120 LRARAM RMB 16 LRA ADDRESSES
0121 ENDIF DATOPT
0121 ENDIF DATOPT
0122 DFD0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0123 DFD2 ECHO RMB 1 ECHO FLAG
0124 DFD3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0125 *
0126 IFD SWTPOPT
0127 *
0128 ***************************************************
0129 * SERIAL PORT *
0090 * MEMORY MAP EQUATES *
0091 ***************************************************
0092 E000 MONIO EQU $E000 I/O SPACE
0093 IFD S3EOPT
0094 MONRAM EQU $7FC0
0095 ELSE
0096 DFC0 MONRAM EQU $DFC0 STACK SPACE
0097 ENDIF S3EOPT
0098 F800 MONROM EQU $F800 START OF ROM
0099 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0100 0000 EXTCMD EQU $00 EXTENDED OFFSET
0101 ***************************************************
0102 IFD S3EOPT
0103 ACIAOPT EQU $FF ACIA AT PORT 0
0104 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0105 VDUOPT EQU $FF VDU AT $E030
0106 TRAOPT EQU $FF PIA TRACE TIMER
0107 ENDIF S3EOPT
0107 ENDIF S3EOPT
0108 IFD FPGAOPT
0109 ACIAOPT EQU $FF ACIA AT PORT 0
0110 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0111 VDUOPT EQU $FF VDU AT $E030
0112 CFOPT EQU $FF COMPACT FLASH AT $E040
0113 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0114 ENDIF FPGAOPT
0114 ENDIF FPGAOPT
0115 *
0116 IFD ADSOPT
0117 00FF DG640OPT EQU $FF DG640 VDU AT $E800
0118 *RTCOPT EQU $FF REAL TIME CLOCK
0119 00FF PRTOPT EQU $FF PRINTER DRIVERS
0120 00FF MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0121 ENDIF ADSOPT
0122 *
0123 IFD SWTPOPT
0124 ACIAOPT EQU $FF ACIA AT PORT 0
0125 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0126 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0127 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0128 ENDIF
0128 ENDIF
0129 *
0130 ***************************************************
0131 *
0132 ** ACIA SITS ON PORT 0
0133 *
0134 ACIAS EQU MONIO+$00 CONTROL PORT
0135 *
0136 ENDIF SWTPOPT
0136 ENDIF SWTPOPT
0137 IFD MFDCOPT
0138 *
0139 ***************************************************
0140 * MINIFLOPPY DRIVE *
0141 ***************************************************
0142 *
0143 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0144 *
0145 E014 DRVFDC EQU MONIO+$14
0146 E018 CMDFDC EQU MONIO+$18
0147 E01A SECFDC EQU MONIO+$1A
0148 E01B DATFDC EQU MONIO+$1B
0149 ENDIF MFDCOPT
0150 IFD FPGAOPT
0151 *
0152 ***************************************************
0153 * SERIAL PORT *
0154 ***************************************************
0155 *
0156 ** ACIA SITS ON PORT 0
0157 *
0158 ACIAS EQU MONIO+$00 CONTROL PORT
0159 *
0160 *
0161 ***************************************************
0162 * VDU8 PS/2 KEYBOARD PORT *
0163 ***************************************************
0131 * SYS09BUG VARIABLE SPACE
0132 ***************************************************
0133 *
0134 DFC0 ORG MONRAM
0135 DFC0 STACK EQU * TOP OF INTERNAL STACK
0136 DFC0 NMI RMB 2 USER NMI VECTOR
0137 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0138 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0139 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0140 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0141 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0142 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0143 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0144 IFD DATOPT
0145 LRARAM RMB 16 LRA ADDRESSES
0146 ENDIF DATOPT
0146 ENDIF DATOPT
0147 DFD0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0148 DFD2 ECHO RMB 1 ECHO FLAG
0149 DFD3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0150 IFD TRAOPT
0151 NMISAV RMB 2 NMI Jump Vector Backup
0152 TRACNT RMB 2 Trace Count
0153 ENDIF TRAOPT
0153 ENDIF TRAOPT
0154 *
0155 IFD ACIAOPT
0156 *
0157 ***************************************************
0158 * SERIAL PORT *
0159 ***************************************************
0160 *
0161 ** ACIA SITS ON PORT 0
0162 *
0163 ACIAS EQU MONIO+$00 CONTROL PORT
0164 *
0165 ** KEYBOARD SITS ON PORT 2
0166 *
0167 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0168 *
0169 ***************************************************
0170 * VDU8 DISPLAY DRIVER EQUATES *
0171 ***************************************************
0172 *
0173 ** VDU8 DISPLAY SITS ON PORT 3
0174 *
0175 VDU EQU MONIO+$30
0176 VDUCHR EQU 0 CHARACTER REGISTER
0177 VDUATT EQU 1 ATTRIBUTE REGISTER
0178 VDUCOL EQU 2 CURSOR COLUMN
0179 VDUROW EQU 3 CURSOR ROW
0180 VDUOFF EQU 4 ROW OFFSET
0181 *
0182 LINLEN EQU 80 LENGTH OF A LINE
0183 NUMLIN EQU 25 NUMBER OF LINES
0165 ENDIF ACIAOPT
0165 ENDIF ACIAOPT
0166 IFD MFDCOPT
0167 *
0168 ***************************************************
0169 * MINIFLOPPY DRIVE *
0170 ***************************************************
0171 *
0172 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0173 *
0174 E014 DRVFDC EQU MONIO+$14
0175 E018 CMDFDC EQU MONIO+$18
0176 E01A SECFDC EQU MONIO+$1A
0177 E01B DATFDC EQU MONIO+$1B
0178 ENDIF MFDCOPT
0179 IFD PS2OPT
0180 *
0181 ***************************************************
0182 * VDU8 PS/2 KEYBOARD PORT *
0183 ***************************************************
0184 *
0185 **************************************************
0186 * VDU8 DISPLAY DRIVER VARIABLES *
0187 **************************************************
0188 *
0189 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0190 COLADX RMB 1 CURSOR COLUMN
0191 ROWADX RMB 1 CURSOR ROW
0192 **************************************************
0193 *
0194 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0195 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0196 *
0197 ***************************************************
0198 * COMPACT FLASH EQUATES *
0199 ***************************************************
0200 *
0201 CF_BASE EQU MONIO+$40
0202 CF_DATA EQU CF_BASE+0
0203 CF_ERROR EQU CF_BASE+1 ; read error
0204 CF_FEATURE EQU CF_BASE+1 ; write feature
0205 CF_SECCNT EQU CF_BASE+2
0206 CF_SECNUM EQU CF_BASE+3
0207 CF_CYLLO EQU CF_BASE+4
0208 CF_CYLHI EQU CF_BASE+5
0209 CF_HEAD EQU CF_BASE+6
0210 CF_STATUS EQU CF_BASE+7 ; read status
0211 CF_COMAND EQU CF_BASE+7 ; write command
0212 *
0213 * Command Equates
0214 *
0215 CMDREAD EQU $20 ; Read Single sector
0216 CMDWRITE EQU $30 ; Write Single sector
0217 CMDFEATURE EQU $EF
0218 FEAT8BIT EQU $01 ; enable 8 bit transfers
0219 HEADLBA EQU $E0
0220 *
0221 * Status bit equates
0222 *
0223 BUSY EQU $80
0224 DRDY EQU $40
0225 DRQ EQU $08
0226 ERR EQU $01
0227 *
0228 ENDIF FPGAOPT
0228 ENDIF FPGAOPT
0229 *
0230 IFD RTCOPT
0231 *
0232 **************************************************
0233 * MM58167A REAL TIME CLOCK MEMORY MAP:
0234 **************************************************
0235 *
0236 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0237 *
0238 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0239 *
0240 * COUNTER AND COMPARITOR REGISTERS:
0241 *
0242 * Both the Clock Counter and Clock Comparitor
0243 * consist of 8 registers for holding the time.
0244 * The register offsets from the Counter and
0245 * Comparitor registers are listed above.
0185 ** KEYBOARD SITS ON PORT 2
0186 *
0187 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0188 ENDIF PS2OPT
0188 ENDIF PS2OPT
0189 IFD VDUOPT
0190 *
0191 ***************************************************
0192 * VDU8 DISPLAY DRIVER EQUATES *
0193 ***************************************************
0194 *
0195 ** VDU8 DISPLAY SITS ON PORT 3
0196 *
0197 VDU EQU MONIO+$30
0198 VDUCHR EQU 0 CHARACTER REGISTER
0199 VDUATT EQU 1 ATTRIBUTE REGISTER
0200 VDUCOL EQU 2 CURSOR COLUMN
0201 VDUROW EQU 3 CURSOR ROW
0202 VDUOFF EQU 4 ROW OFFSET
0203 *
0204 LINLEN EQU 80 LENGTH OF A LINE
0205 NUMLIN EQU 25 NUMBER OF LINES
0206 *
0207 **************************************************
0208 * VDU8 DISPLAY DRIVER VARIABLES *
0209 **************************************************
0210 *
0211 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0212 COLADX RMB 1 CURSOR COLUMN
0213 ROWADX RMB 1 CURSOR ROW
0214 **************************************************
0215 *
0216 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0217 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0218 ENDIF VDUOPT
0218 ENDIF VDUOPT
0219 IFD CFOPT
0220 *
0221 ***************************************************
0222 * COMPACT FLASH EQUATES *
0223 ***************************************************
0224 *
0225 ** COMPACT FLASH SITS AT PORT 4
0226 *
0227 CF_BASE EQU MONIO+$40
0228 CF_DATA EQU CF_BASE+0
0229 CF_ERROR EQU CF_BASE+1 ; read error
0230 CF_FEATURE EQU CF_BASE+1 ; write feature
0231 CF_SECCNT EQU CF_BASE+2
0232 CF_SECNUM EQU CF_BASE+3
0233 CF_CYLLO EQU CF_BASE+4
0234 CF_CYLHI EQU CF_BASE+5
0235 CF_HEAD EQU CF_BASE+6
0236 CF_STATUS EQU CF_BASE+7 ; read status
0237 CF_COMAND EQU CF_BASE+7 ; write command
0238 *
0239 * Command Equates
0240 *
0241 CMDREAD EQU $20 ; Read Single sector
0242 CMDWRITE EQU $30 ; Write Single sector
0243 CMDFEATURE EQU $EF
0244 FEAT8BIT EQU $01 ; enable 8 bit transfers
0245 HEADLBA EQU $E0
0246 *
0247 COUNTR EQU CLOCK+0
0248 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0249 *
0250 * CLOCK REGISTER OFFSETS:
0251 * These register offsets are used for the CLOCK
0252 * and comparitor ram CMPRAM.
0247 * Status bit equates
0248 *
0249 BUSY EQU $80
0250 DRDY EQU $40
0251 DRQ EQU $08
0252 ERR EQU $01
0253 *
0254 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0255 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0256 SECOND EQU 2
0257 MINUIT EQU 3
0258 HOUR EQU 4
0259 WKDAY EQU 5
0260 MTHDAY EQU 6
0261 MONTH EQU 7
0262 *
0263 * INTERRUPT OUTPUT REGISTERS:
0264 *
0265 * An interrupt output may be generated at the
0266 * following rates by setting the appropriate bit
0267 * in the Interrupt Control Register (CINTCR).
0268 * The Interrupt Status Register (CINTSR) must be
0269 * read to clear the interrupt and will return
0270 * the source of the interrupt.
0271 *
0272 * 1/Month Bit 7
0273 * 1/Week Bit 6
0274 * 1/Day Bit 5
0275 * 1/Hour Bit 4
0276 * 1/Minuite Bit 3
0277 * 1/Second Bit 2
0278 * 10/Second Bit 1
0279 * Comparitor Bit 0
0280 *
0281 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0282 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0283 *
0284 * COUNTER AND RAM RESETS; GO COMMAND.
0285 *
0286 * The counter and comparitor may be reset
0287 * by writing $FF into CTRRES and CMPRES
0288 * respectivly.
0289 * A write to the Go command register (GOCMND)
0290 * will reset the 1/1000ths, 1/100ths and 1/10ths
0291 * of a second counter.
0292 *
0293 CTRRES EQU CLOCK+18 COUNTER RESET
0294 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0295 GOCMND EQU CLOCK+21 GO COMMAND
0296 *
0297 * CLOCK STATUS REGISTER.
0298 *
0299 * The counter takes 61 usec. to rollover for
0300 * every 1KHz clock pulse. If the Status bit is
0301 * set after reading the counter, the counter
0302 * should be re-read to ensure the time is correct.
0303 *
0304 CLKSTA EQU CLOCK+20 STATUS BIT
0305 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0306 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0307 ENDIF RTCOPT
0307 ENDIF RTCOPT
0308 *
0309 IFD ADSOPT
0310 *
0311 ***************************************************
0312 * SERIAL PORT FOR DG640 *
0313 ***************************************************
0314 *
0315 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0316 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0317 *
0318 E400 ACIAS EQU MONIO+$400 CONTROL PORT
0319 *
0320 *
0321 ***************************************************
0322 * PRINTER INTERFACE *
0323 ***************************************************
0254 ENDIF CFOPT
0254 ENDIF CFOPT
0255 *
0256 IFD RTCOPT
0257 *
0258 **************************************************
0259 * MM58167A REAL TIME CLOCK MEMORY MAP:
0260 **************************************************
0261 *
0262 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0263 *
0264 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0265 *
0266 * COUNTER AND COMPARITOR REGISTERS:
0267 *
0268 * Both the Clock Counter and Clock Comparitor
0269 * consist of 8 registers for holding the time.
0270 * The register offsets from the Counter and
0271 * Comparitor registers are listed above.
0272 *
0273 COUNTR EQU CLOCK+0
0274 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0275 *
0276 * CLOCK REGISTER OFFSETS:
0277 * These register offsets are used for the CLOCK
0278 * and comparitor ram CMPRAM.
0279 *
0280 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0281 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0282 SECOND EQU 2
0283 MINUIT EQU 3
0284 HOUR EQU 4
0285 WKDAY EQU 5
0286 MTHDAY EQU 6
0287 MONTH EQU 7
0288 *
0289 * INTERRUPT OUTPUT REGISTERS:
0290 *
0291 * An interrupt output may be generated at the
0292 * following rates by setting the appropriate bit
0293 * in the Interrupt Control Register (CINTCR).
0294 * The Interrupt Status Register (CINTSR) must be
0295 * read to clear the interrupt and will return
0296 * the source of the interrupt.
0297 *
0298 * 1/Month Bit 7
0299 * 1/Week Bit 6
0300 * 1/Day Bit 5
0301 * 1/Hour Bit 4
0302 * 1/Minuite Bit 3
0303 * 1/Second Bit 2
0304 * 10/Second Bit 1
0305 * Comparitor Bit 0
0306 *
0307 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0308 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0309 *
0310 * COUNTER AND RAM RESETS; GO COMMAND.
0311 *
0312 * The counter and comparitor may be reset
0313 * by writing $FF into CTRRES and CMPRES
0314 * respectivly.
0315 * A write to the Go command register (GOCMND)
0316 * will reset the 1/1000ths, 1/100ths and 1/10ths
0317 * of a second counter.
0318 *
0319 CTRRES EQU CLOCK+18 COUNTER RESET
0320 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0321 GOCMND EQU CLOCK+21 GO COMMAND
0322 *
0323 * CLOCK STATUS REGISTER.
0324 *
0325 E404 PADATA EQU MONIO+$404
0326 E405 PACTRL EQU MONIO+$405
0327 E406 PBDATA EQU MONIO+$406
0328 E407 PBCTRL EQU MONIO+$407
0325 * The counter takes 61 usec. to rollover for
0326 * every 1KHz clock pulse. If the Status bit is
0327 * set after reading the counter, the counter
0328 * should be re-read to ensure the time is correct.
0329 *
0330 ** CB1 ACK. I/P
0331 ** CB2 STB. O/P
0332 ** PB0 - PB7 DATA 1 - 8 O/P
0333 ** PORT A BIT ASSIGNMENT
0334 *
0335 0080 PBUSY EQU $80 I/P
0336 0040 PEMPTY EQU $40 I/P
0337 0020 SELECT EQU $20 I/P
0338 0010 PERROR EQU $10 I/P
0339 0004 PRESET EQU %00000100 O/P PA3 = 0
0340 0008 AUTOFD EQU %00001000 O/P PA2 = 0
0341 000C DIRMSK EQU %00001100
0330 CLKSTA EQU CLOCK+20 STATUS BIT
0331 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0332 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0333 ENDIF RTCOPT
0333 ENDIF RTCOPT
0334 *
0335 IFD TRAOPT
0336 *
0337 **************************************************
0338 * PIA INTERRUPT TIMER
0339 **************************************************
0340 *
0341 ** PIA INTERRUPT TIMER SITS ON PORT 7
0342 *
0343 ***************************************************
0344 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0345 ***************************************************
0346 *
0347 ** VIDEO DISPLAY DEFINITIONS
0348 *
0349 E800 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0350 0040 LINLEN EQU 64 LENGTH OF A LINE
0351 0010 NUMLIN EQU 16 NUMBER OF LINES
0352 0400 SCNLEN EQU $400 LENGTH OF SCREEN
0353 *
0354 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0355 DFEB COLADX RMB 1 CURSOR COLUMN
0356 DFEC ROWADX RMB 1 CURSOR ROW
0357 *************************************************
0358 DFED CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0359 DFEF NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0360 DFF0 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0361 ENDIF ADSOPT
0362 *
0363 IFD DMAFOPT
0364 *
0365 ***************************************************
0366 * DMAF2 8" DRIVE *
0367 ***************************************************
0368 *
0369 ADDREG EQU $F000 ADDRESS REGISTER
0370 CNTREG EQU $F002 COUNT REGISTER
0371 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0372 PRIREG EQU $F014 DMA PRIORITY REGISTER
0373 AAAREG EQU $F015 ???
0374 BBBREG EQU $F016 ???
0375 COMREG EQU $F020 1791 COMMAND REGISTER
0376 SECREG EQU $F022 SECTOR REGISTER
0377 DRVREG EQU $F024 DRIVE SELECT LATCH
0378 CCCREG EQU $F040 ???
0379 ENDIF DMAFOPT
0379 ENDIF DMAFOPT
0380 IFD DATOPT
0381 **************************************************
0382 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0383 **************************************************
0384 *
0385 IC11 EQU $FFF0 DAT RAM CHIP
0386 TSTPAT EQU $55AA TEST PATTERN
0387 ENDIF DATOPT
0387 ENDIF DATOPT
0388 *
0389 ***************************************************
0390 * START OF ROM *
0391 ***************************************************
0392 *
0393 F800 ORG MONROM
0394 F800 F8 22 FDB MONITOR
0395 F802 F8 56 FDB NEXTCMD
0396 F804 FC 6A FDB INCH
0397 F806 FC 64 FDB INCHE
0398 F808 FC 79 FDB INCHEK
0399 F80A FC 87 FDB OUTCH
0400 F80C FB 58 FDB PDATA
0401 F80E FA E7 FDB PCRLF
0402 F810 FA E3 FDB PSTRNG
0403 F812 FF 0D FDB LRA
0404 *
0405 IFD ADSOPT
0406 F814 FE 4B FDB PCHK CHECK FOR PRINTER INPUT
0407 F816 FE 0D FDB PINIZ INITIATE PRINTER
0408 F818 FE 37 FDB POUTCH OUTPUT CH. TO PRINTER
0409 F81A FC AF FDB VINIZ
0410 F81C FC C4 FDB VOUTCH
0411 F81E FC 9C FDB ACINIZ
0412 F820 FC 89 FDB AOUTCH
0413 ENDIF ADSOPT
0414 *
0415 * MONITOR
0416 *
0417 * VECTOR ADDRESS STRING IS.....
0418 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0419 *
0420 F822 8E FE 88 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0421 F825 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0422 F829 C6 10 LDB #$10 BYTES TO MOVE = 16
0423 F82B A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0424 F82D A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0425 F82F 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0426 F830 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0427 *
0428 * CONTENTS FROM TO FUNCTION
0429 * $F8A1 $FE40 $DFC0 USER-V
0430 * $F8A1 $FE42 $DFC2 SWI3-V
0431 * $F8A1 $FE44 $DFC4 SWI2-V
0432 * $F8A1 $FE46 $DFC6 FIRQ-V
0433 * $F8A1 $FE48 $DFC8 IRQ-V
0434 * $FAB0 $FE4A $DFCA SWI-V
0435 * $FFFF $FE4C $DFCC SVC-VO
0436 * $FFFF $FE4E $DFCE SVC-VL
0437 *
0438 F832 8E E4 00 LDX #ACIAS
0439 F835 BF DF D0 STX CPORT STORE ADDR. IN RAM
0440 F838 17 01 42 LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0441 F83B C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0442 F83D 6F E2 CLRSTK CLR ,-S
0443 F83F 5A DECB
0444 F840 26 FB BNE CLRSTK
0445 F842 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0446 F845 AF 6A STX 10,S ON STACK
0447 F847 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0448 F849 A7 E4 STA ,S
0449 F84B 1F 43 TFR S,U
0450 F84D 17 04 4A LBSR IOINIZ INITIALIZE CONTROL PORT
0451 F850 8E FE 98 LDX #MSG1 POINT TO MONITOR MESSAGE
0452 F853 17 03 02 LBSR PDATA PRINT MSG
0453 *
0454 IFD DATOPT
0455 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0456 CLRA START TOTAL AT ZERO
0457 LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0458 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0459 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0460 ADDA #4 ELSE ADD 4K TO TOTAL
0461 DAA ADJ. TOTAL FOR DECIMAL
0462 RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0463 BPL FNDREL PRINT TOTAL OF RAM
0464 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0465 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0466 LBSR PDATA PRINT MSG
0467 ENDIF DATOPT
0467 ENDIF DATOPT
0468 *
0469 ***** NEXTCMD *****
0470 *
0471 F856 8E FE C1 NEXTCMD LDX #MSG3 POINT TO MSG ">"
0472 F859 17 02 87 LBSR PSTRNG PRINT MSG
0473 F85C 17 04 0B LBSR INCH GET ONE CHAR. FROM TERMINAL
0474 F85F 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0475 F861 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0476 F863 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0477 F865 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0478 F867 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0479 F869 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0480 F86B 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0481 F86D 17 04 17 LBSR OUTCH PRINT "^"
0482 F870 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0483 F872 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0484 F874 17 04 10 PRTCMD LBSR OUTCH PRNT CMD CHAR
0485 F877 17 04 0B LBSR OUT1S PRNT SPACE
0486 F87A C1 60 CMPB #$60
0487 F87C 2F 02 BLE NXTCH0
0488 F87E C0 20 SUBB #$20
0489 *
0490 ***** DO TABLE LOOKUP *****
0491 * FOR COMMAND FUNCTIONS
0343 ** PIA TIMER FOR SINGLE STEP / TRACE
0344 *
0345 * TADATA = Output = Timer preset register
0346 * TACTRL - CA1 = input = rising edge = NMI
0347 * - CA2 = Output = Timer Reset (Active High)
0348 * TBDATA = Input = Timer read back register
0349 * TBCTRL - CB1 = input = rising edge = FIRQ
0350 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0351 *
0352 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0353 * CRA1 = 1 CA1 Rising edge IRQ
0354 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0355 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0356 * CRA4 = 1 ] CA2 = Set/Reset output
0357 * CRA5 = 1 ]
0358 * CRA6 = X CA2 Input Interrupt Flag
0359 * CRA7 = X CA1 Interrupt Flag
0360 *
0361 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0362 * CRB1 = 1 CB1 Rising edge IRQ
0363 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0364 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0365 * CRB4 = 1 ] CB2 = Set/Reset output
0366 * CRB5 = 1 ]
0367 * CRB6 = X CB2 Input Interrupt Flag
0368 * CRB7 = X CB1 Interrupt Flag
0369 *
0370 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0371 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0372 *
0373 TADATA EQU MONIO+$70 Timer preset port
0374 TACTRL EQU MONIO+$71
0375 TBDATA EQU MONIO+$72 Timer read back port
0376 TBCTRL EQU MONIO+$73
0377 *
0378 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0379 *
0380 ENDIF TRAOPT
0380 ENDIF TRAOPT
0381 IFD ADSOPT
0382 *
0383 ***************************************************
0384 * SERIAL PORT FOR DG640 *
0385 ***************************************************
0386 *
0387 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0388 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0389 *
0390 E400 ACIAS EQU MONIO+$400 CONTROL PORT
0391 *
0392 ENDIF ADSOPT
0393 IFD PRTOPT
0394 *
0395 ***************************************************
0396 * PRINTER INTERFACE *
0397 ***************************************************
0398 *
0399 E404 PADATA EQU MONIO+$404
0400 E405 PACTRL EQU MONIO+$405
0401 E406 PBDATA EQU MONIO+$406
0402 E407 PBCTRL EQU MONIO+$407
0403 *
0404 ** CB1 ACK. I/P
0405 ** CB2 STB. O/P
0406 ** PB0 - PB7 DATA 1 - 8 O/P
0407 ** PORT A BIT ASSIGNMENT
0408 *
0409 0080 PBUSY EQU $80 I/P
0410 0040 PEMPTY EQU $40 I/P
0411 0020 SELECT EQU $20 I/P
0412 0010 PERROR EQU $10 I/P
0413 0004 PRESET EQU %00000100 O/P PA3 = 0
0414 0008 AUTOFD EQU %00001000 O/P PA2 = 0
0415 000C DIRMSK EQU %00001100
0416 ENDIF PRTOPT
0417 IFD DG640OPT
0418 *
0419 ***************************************************
0420 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0421 ***************************************************
0422 *
0423 ** VIDEO DISPLAY DEFINITIONS
0424 *
0425 E800 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0426 0040 LINLEN EQU 64 LENGTH OF A LINE
0427 0010 NUMLIN EQU 16 NUMBER OF LINES
0428 0400 SCNLEN EQU $400 LENGTH OF SCREEN
0429 *
0430 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0431 DFEB COLADX RMB 1 CURSOR COLUMN
0432 DFEC ROWADX RMB 1 CURSOR ROW
0433 *************************************************
0434 DFED CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0435 DFEF NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0436 DFF0 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0437 ENDIF DG640OPT
0438 *
0439 IFD DMAFOPT
0440 *
0441 ***************************************************
0442 * DMAF2 8" DRIVE *
0443 ***************************************************
0444 *
0445 ADDREG EQU $F000 ADDRESS REGISTER
0446 CNTREG EQU $F002 COUNT REGISTER
0447 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0448 PRIREG EQU $F014 DMA PRIORITY REGISTER
0449 AAAREG EQU $F015 ???
0450 BBBREG EQU $F016 ???
0451 COMREG EQU $F020 1791 COMMAND REGISTER
0452 SECREG EQU $F022 SECTOR REGISTER
0453 DRVREG EQU $F024 DRIVE SELECT LATCH
0454 CCCREG EQU $F040 ???
0455 ENDIF DMAFOPT
0455 ENDIF DMAFOPT
0456 IFD DATOPT
0457 **************************************************
0458 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0459 **************************************************
0460 *
0461 IC11 EQU $FFF0 DAT RAM CHIP
0462 TSTPAT EQU $55AA TEST PATTERN
0463 ENDIF DATOPT
0463 ENDIF DATOPT
0464 *
0465 ***************************************************
0466 * START OF ROM *
0467 ***************************************************
0468 *
0469 F800 ORG MONROM
0470 F800 F8 22 FDB MONITOR
0471 F802 F8 56 FDB NEXTCMD
0472 F804 FC 6A FDB INCH
0473 F806 FC 64 FDB INCHE
0474 F808 FC 79 FDB INCHEK
0475 F80A FC 87 FDB OUTCH
0476 F80C FB 58 FDB PDATA
0477 F80E FA E7 FDB PCRLF
0478 F810 FA E3 FDB PSTRNG
0479 F812 FF 0D FDB LRA
0480 *
0481 IFD ADSOPT
0482 F814 FE 4B FDB PCHK CHECK FOR PRINTER INPUT
0483 F816 FE 0D FDB PINIZ INITIATE PRINTER
0484 F818 FE 37 FDB POUTCH OUTPUT CH. TO PRINTER
0485 F81A FC AF FDB VINIZ
0486 F81C FC C4 FDB VOUTCH
0487 F81E FC 9C FDB ACINIZ
0488 F820 FC 89 FDB AOUTCH
0489 ENDIF ADSOPT
0490 *
0491 * MONITOR
0492 *
0493 F880 8E FE 4F NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0494 F883 E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0495 F885 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0496 F887 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0497 F889 8C FE 88 CMPX #TABEND REACHED END OF TABLE YET ?
0498 F88C 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0499 F88E 8E FE C3 LDX #MSG4 POINT TO MSG "WHAT?"
0500 F891 17 02 C4 LBSR PDATA PRINT MSG
0501 F894 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0502 F896 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0503 F898 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0504 *
0505 * "G" GO OR CONTINUE
0506 *
0507 F89A 1F 34 GO TFR U,S
0508 F89C 3B RTI RTI
0509 *
0510 ***** "M" MEMORY EXAMINE AND CHANGE *****
0511 *
0512 F89D 17 03 3F MEMCHG LBSR IN1ADR INPUT ADDRESS
0513 F8A0 29 2D BVS CHRTN IF NOT HEX, RETURN
0514 F8A2 1F 12 TFR X,Y SAVE ADDR IN "Y"
0515 F8A4 8E FE C9 MEMC2 LDX #MSG5 POINT TO MSG " - "
0516 F8A7 17 02 39 LBSR PSTRNG PRINT MSG
0517 F8AA 1F 21 TFR Y,X FETCH ADDRESS
0518 F8AC 17 03 79 LBSR OUT4H PRINT ADDR IN HEX
0519 F8AF 17 03 D3 LBSR OUT1S OUTPUT SPACE
0520 F8B2 A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0521 F8B4 17 03 79 LBSR OUT2H OUTPUT CONTENTS IN ASCII
0522 F8B7 17 03 CB LBSR OUT1S OUTPUT SPACE
0523 F8BA 17 03 32 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0524 F8BD 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0525 F8BF 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0526 F8C1 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0527 F8C3 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0528 F8C5 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0529 F8C7 81 5E CMPA #'^ IS IT AN UP ARROW?
0530 F8C9 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0531 F8CB 81 0D CMPA #$D IS IT A CR?
0532 F8CD 26 0F BNE FORWRD DISPLAY NEXT BYTE
0533 F8CF 39 CHRTN RTS EXIT ROUTINE
0534 *
0535 *
0536 F8D0 A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0537 F8D2 A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0538 F8D4 27 08 BEQ FORWRD $F972
0539 F8D6 17 03 AC LBSR OUT1S OUTPUT SPACE
0540 F8D9 86 3F LDA #'? LOAD QUESTION MARK
0541 F8DB 17 03 A9 LBSR OUTCH PRINT IT
0542 F8DE 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0543 F8E0 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0544 F8E2 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0545 F8E4 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0546 *
0547 * "S" DISPLAY STACK
0548 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0549 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0493 * VECTOR ADDRESS STRING IS.....
0494 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0495 *
0496 F822 8E FE 88 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0497 F825 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0498 F829 C6 10 LDB #$10 BYTES TO MOVE = 16
0499 F82B A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0500 F82D A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0501 F82F 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0502 F830 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0503 *
0504 * CONTENTS FROM TO FUNCTION
0505 * $F8A1 $FE40 $DFC0 USER-V
0506 * $F8A1 $FE42 $DFC2 SWI3-V
0507 * $F8A1 $FE44 $DFC4 SWI2-V
0508 * $F8A1 $FE46 $DFC6 FIRQ-V
0509 * $F8A1 $FE48 $DFC8 IRQ-V
0510 * $FAB0 $FE4A $DFCA SWI-V
0511 * $FFFF $FE4C $DFCC SVC-VO
0512 * $FFFF $FE4E $DFCE SVC-VL
0513 *
0514 F832 8E E4 00 LDX #ACIAS
0515 F835 BF DF D0 STX CPORT STORE ADDR. IN RAM
0516 F838 17 01 42 LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0517 F83B C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0518 F83D 6F E2 CLRSTK CLR ,-S
0519 F83F 5A DECB
0520 F840 26 FB BNE CLRSTK
0521 F842 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0522 F845 AF 6A STX 10,S ON STACK
0523 F847 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0524 F849 A7 E4 STA ,S
0525 F84B 1F 43 TFR S,U
0526 F84D 17 04 4A LBSR IOINIZ INITIALIZE CONTROL PORT
0527 F850 8E FE 98 LDX #MSG1 POINT TO MONITOR MESSAGE
0528 F853 17 03 02 LBSR PDATA PRINT MSG
0529 *
0530 IFD DATOPT
0531 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0532 CLRA START TOTAL AT ZERO
0533 LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0534 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0535 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0536 ADDA #4 ELSE ADD 4K TO TOTAL
0537 DAA ADJ. TOTAL FOR DECIMAL
0538 RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0539 BPL FNDREL PRINT TOTAL OF RAM
0540 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0541 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0542 LBSR PDATA PRINT MSG
0543 ENDIF DATOPT
0543 ENDIF DATOPT
0544 *
0545 IFD TRAOPT
0546 LBSR TRAINZ
0547 ENDIF TRAOPT
0547 ENDIF TRAOPT
0548 *
0549 ***** NEXTCMD *****
0550 *
0551 F8E6 17 02 76 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0552 F8E9 1F 32 TFR U,Y
0553 F8EB 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0554 F8EE 30 1F LEAX -1,X POINT TO CURRENT STACK
0555 F8F0 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0556 *
0557 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0558 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0559 * UPPER ADDRESS IN X-REG.
0560 * IF HEX ADDRESSES ARE INVALID (V)=1.
0561 *
0562 F8F2 17 02 DF MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0563 F8F5 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0564 F8F7 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0565 F8F9 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0566 F8FB 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0567 F8FD 39 EDPRTN RTS ;
0568 *
0569 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0570 * TO EVEN 16 BYTE BOUNDRIES.
0571 *
0572 * IF LOWER ADDR = $4532
0573 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0574 *
0575 * IF UPPER ADDR = $4567
0576 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0577 *
0578 * ENTER WITH LOWER ADDRESS IN X-REG.
0579 * -UPPER ADDRESS ON TOP OF STACK.
0580 *
0581 F8FE 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0582 F900 C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0583 F903 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0584 F905 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0585 F907 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0586 F909 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0587 F90B 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0588 F90D AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0589 F90F 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0590 F911 17 03 65 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0591 F914 27 03 BEQ EDUMP
0592 F916 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0593 F918 39 RTS ;
0594 *
0595 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0596 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0597 *
0598 F919 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0599 F91B 8E FE C9 LDX #MSG5 POINT TO MSG " - "
0600 F91E 17 01 C2 LBSR PSTRNG PRINT MSG
0601 F921 AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0602 F923 17 03 02 LBSR OUT4H PRINT THE ADDRESS
0603 F926 17 03 5A LBSR OUT2S 2 SPACES
0604 F929 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0605 F92B A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0606 F92D 17 03 00 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0607 F930 17 03 52 LBSR OUT1S OUTPUT SPACE
0608 F933 5A DECB $F9D1 DECREMENT BYTE COUNT
0609 F934 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0610 *
0611 * PRINT 16 ASCII CHARACTERS
0612 * IF NOT PRINTABLE OR NOT VALID
0613 * ASCII PRINT A PERIOD (.)
0614 F936 17 03 4A LBSR OUT2S 2 SPACES
0615 F939 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0616 F93B C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0617 F93D A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0618 F93F 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0619 F941 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0620 F943 81 7E CMPA #$7E IS IT VALID ASCII?
0621 F945 23 02 BLS PRASC IF SO PRINT IT
0622 F947 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0623 F949 17 03 3B PRASC LBSR OUTCH PRINT ASCII CHARACTER
0624 F94C 5A DECB DECREMENT COUNT
0625 F94D 26 EE BNE EDPASC
0626 F94F 20 BC BRA NXTLIN
0627 *
0628 ***** "B" SET BREAKPOINT *****
0629 *
0630 F951 17 02 8B BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0631 F954 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0632 F956 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0633 F959 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0634 F95B 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0635 F95D 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0636 F960 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0637 F962 35 10 PULS X POP BP ADDRESS FROM STACK
0638 F964 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0639 F966 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0640 F968 81 3F CMPA #$3F IS IT A SWI?
0641 F96A 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0642 F96C A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0643 F96E AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0644 F970 86 3F LDA #$3F LOAD A SWI ($3F)
0645 F972 A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0646 F974 39 EXITBP RTS ;
0647 *
0648 * INDICATE ERROR SETTING BREAKPOINT
0649 *
0650 F975 17 03 0D BPERR LBSR OUT1S OUTPUT SPACE
0651 F978 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0652 F97A 16 03 0A LBRA OUTCH PRINT "?"
0653 *
0654 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0655 *
0656 F97D 10 8E DF D3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0657 F981 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0658 F983 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0659 F985 5A DECB $FAAC DECREMENT BP COUNTER
0660 F986 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0661 F988 39 RTS
0662 *
0663 ***** SWI ENTRY POINT *****
0664 *
0665 F989 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0666 F98B AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0667 F98D 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0668 F98F 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0669 F991 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0670 F993 AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0671 F995 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0672 F997 17 02 1C REGPR LBSR REGSTR GO PRINT REGISTERS
0673 F99A 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0674 F99D AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0675 F99F 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0676 F9A2 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0677 F9A4 A6 84 LDA ,X GET DATA FROM BP ADDRESS
0678 F9A6 81 3F CMPA #$3F IS IT SWI?
0679 F9A8 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0680 F9AA A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0681 F9AC A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0682 F9AE 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0683 F9B0 A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0684 F9B2 A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0685 F9B4 A7 A0 STA ,Y+
0686 F9B6 39 RTS
0687 *
0688 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0689 *
0690 F9B7 10 8E DF D3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0691 F9BB C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0692 F9BD A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0693 F9BF AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0694 F9C1 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0695 F9C3 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0696 F9C4 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0697 F9C6 39 RTS ;
0698 *
0699 *
0700 F9C7 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0701 F9C9 39 RTS
0702 *
0703 IFD MFDCOPT
0704 *
0705 ** "U" MINI DISK BOOT
0706 *
0707 F9CA 7D E0 18 MINBOOT TST CMDFDC
0708 F9CD 7F E0 14 CLR DRVFDC
0709 F9D0 8E 00 00 LDX #$0000
0710 F9D3 30 01 LOOP LEAX $01,X
0711 F9D5 8C 00 00 CMPX #$0000
0712 F9D8 26 F9 BNE LOOP
0713 F9DA 86 0F LDA #$0F
0714 F9DC B7 E0 18 STA CMDFDC
0715 F9DF 8D 37 BSR DELAY
0716 F9E1 F6 E0 18 LOOP1 LDB CMDFDC
0717 F9E4 C5 01 BITB #$01
0718 F9E6 26 F9 BNE LOOP1
0719 F9E8 86 01 LDA #$01
0720 F9EA B7 E0 1A STA SECFDC
0721 F9ED 8D 29 BSR DELAY
0722 F9EF 86 8C LDA #$8C
0723 F9F1 B7 E0 18 STA CMDFDC
0724 F9F4 8D 22 BSR DELAY
0725 F9F6 8E C0 00 LDX #$C000
0726 F9F9 20 09 BRA LOOP3
0727 F9FB C5 02 LOOP2 BITB #$02
0728 F9FD 27 05 BEQ LOOP3
0729 F9FF B6 E0 1B LDA DATFDC
0730 FA02 A7 80 STA ,X+
0731 FA04 F6 E0 18 LOOP3 LDB CMDFDC
0732 FA07 C5 01 BITB #$01
0733 FA09 26 F0 BNE LOOP2
0734 FA0B C5 2C BITB #$2C
0735 FA0D 27 01 BEQ LOOP4
0736 FA0F 39 RTS
0737 *
0738 FA10 8E C0 00 LOOP4 LDX #$C000
0739 FA13 AF 4A STX $0A,U
0740 FA15 1F 34 TFR U,S
0741 FA17 3B RTI
0742 *
0743 FA18 C6 04 DELAY LDB #$04
0744 FA1A 5A LOOP5 DECB
0745 FA1B 26 FD BNE LOOP5
0746 FA1D 39 RTS
0747 ENDIF MFDCOPT
0748 *
0749 IFD DMAFOPT
0750 *
0751 *** "D" DISK BOOT FOR DMAF2 ***
0752 *
0753 DBOOT LDA #$DE
0754 STA DRVREG
0755 LDA #$FF
0756 STA PRIREG $FAF8
0757 STA CCREG
0758 STA AAAREG
0759 STA BBBREG
0760 TST CCREG
0761 LDA #$D8
0762 STA COMREG
0763 LBSR DLY
0764 DBOOT0 LDA COMREG
0765 BMI DBOOT0
0766 LDA #$09
0767 STA COMREG
0768 LBSR DLY
0769 *
0770 DISKWT LDA COMREG FETCH DRIVE STATUS
0771 BITA #1 TEST BUSY BIT
0772 BNE DISKWT LOOP UNTIL NOT BUSY
0773 *
0774 BITA #$10
0775 BNE DBOOT
0551 F856 8E FE C1 NEXTCMD LDX #MSG3 POINT TO MSG ">"
0552 F859 17 02 87 LBSR PSTRNG PRINT MSG
0553 F85C 17 04 0B LBSR INCH GET ONE CHAR. FROM TERMINAL
0554 F85F 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0555 F861 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0556 F863 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0557 F865 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0558 F867 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0559 F869 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0560 F86B 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0561 F86D 17 04 17 LBSR OUTCH PRINT "^"
0562 F870 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0563 F872 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0564 F874 17 04 10 PRTCMD LBSR OUTCH PRNT CMD CHAR
0565 F877 17 04 0B LBSR OUT1S PRNT SPACE
0566 F87A C1 60 CMPB #$60
0567 F87C 2F 02 BLE NXTCH0
0568 F87E C0 20 SUBB #$20
0569 *
0570 ***** DO TABLE LOOKUP *****
0571 * FOR COMMAND FUNCTIONS
0572 *
0573 F880 8E FE 4F NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0574 F883 E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0575 F885 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0576 F887 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0577 F889 8C FE 88 CMPX #TABEND REACHED END OF TABLE YET ?
0578 F88C 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0579 F88E 8E FE C3 LDX #MSG4 POINT TO MSG "WHAT?"
0580 F891 17 02 C4 LBSR PDATA PRINT MSG
0581 F894 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0582 F896 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0583 F898 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0584 *
0585 * "G" GO OR CONTINUE
0586 *
0587 F89A 1F 34 GO TFR U,S
0588 F89C 3B RTI RTI
0589 *
0590 ***** "M" MEMORY EXAMINE AND CHANGE *****
0591 *
0592 F89D 17 03 3F MEMCHG LBSR IN1ADR INPUT ADDRESS
0593 F8A0 29 2D BVS CHRTN IF NOT HEX, RETURN
0594 F8A2 1F 12 TFR X,Y SAVE ADDR IN "Y"
0595 F8A4 8E FE C9 MEMC2 LDX #MSG5 POINT TO MSG " - "
0596 F8A7 17 02 39 LBSR PSTRNG PRINT MSG
0597 F8AA 1F 21 TFR Y,X FETCH ADDRESS
0598 F8AC 17 03 79 LBSR OUT4H PRINT ADDR IN HEX
0599 F8AF 17 03 D3 LBSR OUT1S OUTPUT SPACE
0600 F8B2 A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0601 F8B4 17 03 79 LBSR OUT2H OUTPUT CONTENTS IN ASCII
0602 F8B7 17 03 CB LBSR OUT1S OUTPUT SPACE
0603 F8BA 17 03 32 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0604 F8BD 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0605 F8BF 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0606 F8C1 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0607 F8C3 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0608 F8C5 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0609 F8C7 81 5E CMPA #'^ IS IT AN UP ARROW?
0610 F8C9 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0611 F8CB 81 0D CMPA #$D IS IT A CR?
0612 F8CD 26 0F BNE FORWRD DISPLAY NEXT BYTE
0613 F8CF 39 CHRTN RTS EXIT ROUTINE
0614 *
0615 *
0616 F8D0 A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0617 F8D2 A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0618 F8D4 27 08 BEQ FORWRD $F972
0619 F8D6 17 03 AC LBSR OUT1S OUTPUT SPACE
0620 F8D9 86 3F LDA #'? LOAD QUESTION MARK
0621 F8DB 17 03 A9 LBSR OUTCH PRINT IT
0622 F8DE 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0623 F8E0 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0624 F8E2 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0625 F8E4 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0626 *
0627 * "S" DISPLAY STACK
0628 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0629 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0630 *
0631 F8E6 17 02 76 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0632 F8E9 1F 32 TFR U,Y
0633 F8EB 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0634 F8EE 30 1F LEAX -1,X POINT TO CURRENT STACK
0635 F8F0 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0636 *
0637 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0638 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0639 * UPPER ADDRESS IN X-REG.
0640 * IF HEX ADDRESSES ARE INVALID (V)=1.
0641 *
0642 F8F2 17 02 DF MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0643 F8F5 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0644 F8F7 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0645 F8F9 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0646 F8FB 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0647 F8FD 39 EDPRTN RTS ;
0648 *
0649 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0650 * TO EVEN 16 BYTE BOUNDRIES.
0651 *
0652 * IF LOWER ADDR = $4532
0653 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0654 *
0655 * IF UPPER ADDR = $4567
0656 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0657 *
0658 * ENTER WITH LOWER ADDRESS IN X-REG.
0659 * -UPPER ADDRESS ON TOP OF STACK.
0660 *
0661 F8FE 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0662 F900 C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0663 F903 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0664 F905 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0665 F907 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0666 F909 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0667 F90B 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0668 F90D AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0669 F90F 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0670 F911 17 03 65 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0671 F914 27 03 BEQ EDUMP
0672 F916 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0673 F918 39 RTS ;
0674 *
0675 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0676 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0677 *
0678 F919 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0679 F91B 8E FE C9 LDX #MSG5 POINT TO MSG " - "
0680 F91E 17 01 C2 LBSR PSTRNG PRINT MSG
0681 F921 AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0682 F923 17 03 02 LBSR OUT4H PRINT THE ADDRESS
0683 F926 17 03 5A LBSR OUT2S 2 SPACES
0684 F929 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0685 F92B A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0686 F92D 17 03 00 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0687 F930 17 03 52 LBSR OUT1S OUTPUT SPACE
0688 F933 5A DECB $F9D1 DECREMENT BYTE COUNT
0689 F934 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0690 *
0691 * PRINT 16 ASCII CHARACTERS
0692 * IF NOT PRINTABLE OR NOT VALID
0693 * ASCII PRINT A PERIOD (.)
0694 F936 17 03 4A LBSR OUT2S 2 SPACES
0695 F939 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0696 F93B C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0697 F93D A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0698 F93F 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0699 F941 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0700 F943 81 7E CMPA #$7E IS IT VALID ASCII?
0701 F945 23 02 BLS PRASC IF SO PRINT IT
0702 F947 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0703 F949 17 03 3B PRASC LBSR OUTCH PRINT ASCII CHARACTER
0704 F94C 5A DECB DECREMENT COUNT
0705 F94D 26 EE BNE EDPASC
0706 F94F 20 BC BRA NXTLIN
0707 *
0708 ***** "B" SET BREAKPOINT *****
0709 *
0710 F951 17 02 8B BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0711 F954 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0712 F956 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0713 F959 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0714 F95B 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0715 F95D 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0716 F960 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0717 F962 35 10 PULS X POP BP ADDRESS FROM STACK
0718 F964 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0719 F966 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0720 F968 81 3F CMPA #$3F IS IT A SWI?
0721 F96A 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0722 F96C A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0723 F96E AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0724 F970 86 3F LDA #$3F LOAD A SWI ($3F)
0725 F972 A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0726 F974 39 EXITBP RTS ;
0727 *
0728 * INDICATE ERROR SETTING BREAKPOINT
0729 *
0730 F975 17 03 0D BPERR LBSR OUT1S OUTPUT SPACE
0731 F978 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0732 F97A 16 03 0A LBRA OUTCH PRINT "?"
0733 *
0734 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0735 *
0736 F97D 10 8E DF D3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0737 F981 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0738 F983 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0739 F985 5A DECB $FAAC DECREMENT BP COUNTER
0740 F986 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0741 F988 39 RTS
0742 *
0743 ***** SWI ENTRY POINT *****
0744 *
0745 F989 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0746 F98B AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0747 F98D 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0748 F98F 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0749 F991 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0750 F993 AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0751 F995 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0752 F997 17 02 1C REGPR LBSR REGSTR GO PRINT REGISTERS
0753 *
0754 IFD TRAOPT
0755 LDX #0
0756 STX TRACNT
0757 ENDIF TRAOPT
0757 ENDIF TRAOPT
0758 *
0759 F99A 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0760 *
0761 F99D AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0762 F99F 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0763 F9A2 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0764 F9A4 A6 84 LDA ,X GET DATA FROM BP ADDRESS
0765 F9A6 81 3F CMPA #$3F IS IT SWI?
0766 F9A8 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0767 F9AA A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0768 F9AC A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0769 F9AE 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0770 F9B0 A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0771 F9B2 A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0772 F9B4 A7 A0 STA ,Y+
0773 F9B6 39 RTS
0774 *
0775 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0776 *
0777 LDX #$C000 LOGICAL ADDR. = $C000
0778 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0779 ORA #$10
0780 STA CCCREG
0781 TFR X,D
0782 COMA ;
0783 COMB ;
0784 STD ADDREG
0785 LDX #$FEFF LOAD DMA BYTE COUNT = $100
0786 STX CNTREG STORE IN COUNT REGISTER
0787 LDA #$FF LOAD THE CHANNEL REGISTER
0788 STA CCREG
0789 LDA #$FE SET CHANNEL 0
0790 STA PRIREG
0791 LDA #1 SET SECTOR TO "1"
0792 STA SECREG ISSUE COMMAND
0793 LDA #$8C SET SINGLE SECTOR READ
0794 STA COMREG ISSUE COMMAND
0795 BSR DLY
0796 *
0797 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0798 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0799 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0800 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0801 * IS STILL A ONE THE BOOT OPERATION WILL
0802 * BE STARTED OVER FROM THE BEGINING.
0803 *
0804 CLRB ;
0805 DBOOT1 PSHS B $FB55
0806 CLRB ;
0807 DBOOT2 TST CCREG
0808 BPL DBOOT3
0809 DECB ;
0810 BNE DBOOT2
0811 PULS B
0812 DECB
0813 BNE DBOOT1
0814 BRA DBOOT
0815 DBOOT3 PULS B
0816 LDA COMREG
0817 BITA #$1C
0818 BEQ DBOOT4
0819 RTS ;
0820 *
0821 *
0822 DBOOT4 LDB #$DE
0823 STB DRVREG
0824 LDX #$C000
0825 STX 10,U
0826 TFR U,S $FB7B
0827 RTI ;
0828 ENDIF DMAFOPT
0828 ENDIF DMAFOPT
0777 F9B7 10 8E DF D3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0778 F9BB C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0779 F9BD A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0780 F9BF AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0781 F9C1 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0782 F9C3 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0783 F9C4 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0784 F9C6 39 RTS ;
0785 *
0786 *
0787 F9C7 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0788 F9C9 39 RTS
0789 *
0790 IFD TRAOPT
0791 *
0792 ** TRACE from address AAAA BB bytes
0793 *
0794 TRACE LBSR ALTPC1 SET UP NEW PC
0795 BVS TREXIT ADDRESS ERROR, EXIT
0796 LBSR OUT1S
0797 LBSR IN1ADR Fetch Byte Count
0798 BVS TREXIT Byte Count error, EXIT
0799 STX TRACNT
0800 *
0801 LDX NMI Save NMI Vector
0802 STX NMISAV
0803 LDX #NMIE Set up NMI for Tracing
0804 STX NMI
0805 LBSR TRAINZ Initialise Hardware
0806 BRA TRACEG Start Trace
0807 TREXIT RTS
0808 *
0809 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0810 * CRA1 = 1 CA1 Rising edge IRQ
0811 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0812 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0813 * CRA4 = 1 ] CA2 = Set/Reset output
0814 * CRA5 = 1 ]
0815 * CRA6 = X CA2 Input Interrupt Flag
0816 * CRA7 = X CA1 Interrupt Flag
0817 *
0818 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0819 * CRB1 = 1 CB1 Rising edge IRQ
0820 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0821 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0822 * CRB4 = 1 ] CB2 = Set/Reset output
0823 * CRB5 = 1 ]
0824 * CRB6 = X CB2 Input Interrupt Flag
0825 * CRB7 = X CB1 Interrupt Flag
0826 *
0827 *
0828 ** TRACE NMI ENTRY POINT
0829 *
0830 IFD FPGAOPT
0831 *
0832 * COMPACT FLASH BOOT
0833 *
0834 CFBOOT BSR WAITRDY
0835 LDA #HEADLBA
0836 STA CF_HEAD
0837 BSR WAITRDY
0838 LDA #FEAT8BIT
0839 STA CF_FEATURE
0840 LDA #CMDFEATURE
0841 STA CF_COMAND
0842 BSR WAITRDY
0843 *
0844 * READ SECTORS FROM CF
0845 *
0846 CFREAD LDA #$01
0847 STA CF_SECCNT
0848 CLRA
0849 STA CF_SECNUM
0850 STA CF_CYLLO
0851 STA CF_CYLHI
0852 *
0853 LDA #CMDREAD ; IDE READ MULTIPLE
0854 STA CF_COMAND
0855 BSR WAITRDY
0856 LDX #$C000
0857 *
0858 * READ LOOP
0859 *
0860 RDLOOP BSR WAITDRQ
0861 LDA CF_DATA
0862 STA ,X+
0863 CMPX #$C200
0864 BNE RDLOOP
0865 *
0866 LDX #$C000
0867 STX $0A,U
0868 TFR U,S
0869 RTI
0870 *
0871 * WAIT UNTIL READY
0872 *
0873 WAITRDY LDA CF_STATUS
0874 BITA #BUSY
0875 BNE WAITRDY
0876 LDA CF_STATUS
0877 BITA #DRDY
0878 BEQ WAITRDY
0830 NMIE TFR S,U
0831 LDA #$36 Disable Interrupt, CA2 Low
0832 STA TACTRL
0833 LDA TADATA Clear Interrupt flag by reading data port
0834 *
0835 LBSR REGSTR DUMP REGISTERS
0836 *
0837 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0838 LDA ,X
0839 CMPA #$3F
0840 BEQ TRACEX EXIT ON SWI
0841 *
0842 LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0843 BEQ TRACEX YES, GO BACK TO THE MONITOR
0844 LEAX -1,X DECREMENT TRACE COUNT
0845 STX TRACNT
0846 *
0847 ** TRACE GO (RESUME SINGLE STEP)
0848 *
0849 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0850 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0851 STA TADATA
0852 LDA #$36 LOAD STROBE LOW
0853 STA TACTRL
0854 LDA TADATA CLEAR INTERRUPT
0855 LDA #$36 RELEASE RESET
0856 STA TBCTRL
0857 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0858 STA TACTRL
0859 RTI GO EXECUTE INSTRUCTION
0860 *
0861 TRACEX LDX NMISAV Restore NMI vector
0862 STX NMI
0863 LBRA NEXTCMD Jump back to the command loop.
0864 *
0865 ** TRACE HARDWARE INITIALISATION
0866 *
0867 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0868 STA TACTRL
0869 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0870 STA TBCTRL
0871 LDA #$FF PORTA = OUTPUT
0872 STA TADATA
0873 LDA #$00 PORTB = INPUT
0874 STA TBDATA
0875 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0876 STA TACTRL
0877 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0878 STA TBCTRL
0879 RTS
0880 *
0881 * WAIT FOR DATA REQUEST
0882 *
0883 WAITDRQ LDA CF_STATUS
0884 BITA #DRQ
0885 BEQ WAITDRQ
0886 RTS
0887 ENDIF FPGAOPT
0887 ENDIF FPGAOPT
0888 *
0889 IFD RTCOPT
0890 *
0891 * CLOCK INTER FACE UTILITY
0892 *
0893 * TIME <Hours> <Minuits> <Seconds>
0894 * If no argument is specified, the current time
0895 * will be displayed.
0896 *
0897 * READ A REGISTER FROM THE COUNTER.
0898 * The X Index rgister points to the register
0899 * to be read. The Status Register is checked
0900 * before and after the register is read before
0901 * returning a value in accumulator A
0902 *
0903 RDCLK TST CLKSTA
0904 BNE RDCLK
0905 RDCLK1 LDA 0,X
0906 TST CLKSTA
0907 BNE RDCLK1
0908 RTS
0909 *
0910 * MAIN PROGRAM:
0911 *
0912 TIMSET LDX #COUNTR POINT TO TIMER
0913 LBSR BYTE READ HOURS
0914 BVS SHOWTM NO ARG, DISP TIME
0915 STA HOUR,X
0916 LBSR OUT1S
0917 LBSR BYTE READ MINUITES
0918 BVS SHOWTM
0919 STA MINUIT,X
0920 LBSR OUT1S
0921 LBSR BYTE SECONDS.
0922 BVS SHOWTM
0923 STA SECOND,X
0924 *
0925 * DISPLAY CURRENT TIME
0926 *
0927 SHOWTM LBSR PCRLF
0928 LDX #COUNTR+HOUR
0929 LDB #3
0930 SHOWLP BSR RDCLK
0931 LBSR OUT2H
0932 LDA #':
0933 LBSR OUTCH
0934 LEAX -1,X
0935 DECB
0936 BNE SHOWLP
0937 RTS
0938 *
0939 * INITIATE CLOCK.
0940 * MASK INTERRUPTS.
0941 *
0942 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
0943 TST CINTSR CLEAR ANY INTERRUPTS
0944 RTS
0945 ENDIF RTCOPT
0945 ENDIF RTCOPT
0946 IFD DATOPT
0947 *
0948 ***** LRA LOAD REAL ADDRESS *****
0949 *
0950 * THE FOLLOWING CODE LOADS THE 20-BIT
0951 * PHYSICAL ADDRESS OF A MEMORY BYTE
0952 * INTO THE "A" AND "X" REGISTERS. THIS
0953 * ROUTINE IS ENTERED WITH THE LOGICAL
0954 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0955 * REGISTER. EXIT IS MADE WITH THE HIGH-
0956 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0957 * ADDRESS IN THE "A" REGISTER, AND THE
0958 * LOW-ORDER 16-BITS OF THE 20-BIT
0959 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0960 * ALL OTHER REGISTERS ARE PRESERVED.
0961 * THIS ROUTINE IS REQUIRED SINCE THE
0962 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0963 * PRESENT PHYSICAL ADDRESSES ON THE
0964 * SYSTEM BUS.
0965 *
0966 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
0967 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
0968 LSRA ;
0969 LSRA ADJ FOR INDEXED INTO
0970 LSRA CORRESPONDING LOCATION
0971 LSRA IN LRA TABLE
0972 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
0973 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
0974 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
0975 LSRB PHYSICAL ADDRESS.
0976 LSRB EXTENDED MS 4-BITS ARE RETURNED
0977 LSRB IN THE "A" ACCUMULATOR
0978 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
0979 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
0980 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0981 ASLB ADJ DATA FOR RELOCATION IN X REG
0982 ASLB ;
0983 ASLB $FB97
0984 ASLB ;
0985 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
0986 ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
0987 STA 2,S SAVE IT IN X REG ON STACK
0988 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
0989 *
0990 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0991 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
0992 * ON STACK
0993 PULS A,B,X,Y,PC POP REGS. FROM STACK
0994 ENDIF DATOPT
0994 ENDIF DATOPT
0995 *
0996 * DELAY LOOP
0997 *
0998 FA1E 34 04 DLY PSHS B SAVE CONTENTS OF "B"
0999 FA20 C6 20 LDB #$20 GET LOOP DELAY VALUE
1000 FA22 5A SUB1 DECB SUBTRACT ONE FROM VALUE
1001 FA23 26 FD BNE SUB1 LOOP UNTIL ZERO
1002 FA25 35 84 PULS B,PC RESTORE CONTENTS OF "B"
1003 * RTS ;
1004 *
1005 ***** "L" LOAD MIKBUG TAPE *****
1006 *
1007 FA27 BD FC 9C LOAD JSR ACINIZ
1008 FA2A 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
1009 FA2C 17 02 58 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
1010 FA2F 7F DF D2 CLR ECHO TURN OFF ECHO FLAG
1011 FA32 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
1012 FA35 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
1013 FA37 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
1014 FA39 17 02 23 LBSR ECHON
1015 FA3C 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
1016 FA3E 27 3D BEQ LOAD21 IF SO, EXIT LOAD
1017 FA40 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
1018 FA42 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
1019 FA44 17 01 A8 LBSR BYTE INPUT BYTE COUNT
1020 FA47 34 02 PSHS A PUSH COUNT ON STACK
1021 FA49 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
1022 FA4B 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
1023 FA4E 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
1024 FA50 34 10 PSHS X PUSH ADDR ON STACK
1025 FA52 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
1026 FA54 EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
1027 FA56 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
1028 FA58 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
1029 FA5A 6A E4 DEC ,S ADDRESS BYTES.
1030 FA5C 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
1031 FA5E 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
1032 FA61 35 04 PULS B POP CHECKSUM FROM STACK
1033 FA63 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
1034 FA65 34 02 PSHS A PUSH DATA BYTE ON STACK
1035 FA67 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
1036 FA69 6A E4 DEC ,S DECREMENT BYTE COUNT 1
1037 FA6B 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
1038 FA6D A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
1039 FA6F 20 EB BRA LOAD10 GET NEXT DATA BYTE
1040 FA71 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
1041 FA72 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
1042 FA74 C1 FF CMPB #$FF CHECKSUM OK?
1043 FA76 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
1044 FA78 86 3F LDA #'? LOAD (?) ERROR INDICATOR
1045 FA7A 17 02 0A LBSR OUTCH OUTPUT IT TO TERMINAL
1046 FA7D 73 DF D2 LOAD21 COM ECHO TURN ECHO ON
1047 FA80 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
1048 FA82 16 02 02 LBRA OUTCH OUTPUT IT
1049 *
1050 ***** "P" PUNCH MIKBUG TAPE *****
1051 *
1052 FA85 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
1053 FA87 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
1054 FA8A 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
1055 FA8C 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
1056 FA8E AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
1057 FA90 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
1058 FA92 30 01 LEAX 1,X INCREMENT END ADDRESS
1059 FA94 AF E4 STX ,S STORE END ADDR ON STACK
1060 FA96 BD FC 9C JSR ACINIZ
1061 FA99 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
1062 FA9B 17 01 E9 LBSR OUTCH OUTPUT IT TO TERMINAL
1063 FA9E EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
1064 FAA0 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
1065 FAA2 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
1066 FAA4 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
1067 FAA8 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
1068 FAAA C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
1069 FAAC E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
1070 FAAE 8E FF 0A LDX #MSG20 POINT TO MSG "S1"
1071 FAB1 17 00 2F LBSR PSTRNG PRINT MSG
1072 FAB4 CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
1073 FAB6 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
1074 FAB8 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
1075 FABB AE 62 LDX 2,S LOAD BEGIN ADDRESS
1076 FABD 17 01 68 LBSR OUT4H PUNCH ADDRESS
1077 FAC0 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
1078 FAC2 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
1079 FAC4 EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
1080 FAC6 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
1081 FAC8 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
1082 FACB 6A 64 DEC 4,S DECREMENT BYTE COUNT
1083 FACD 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
1084 FACF 53 COMB 1's COMPLIMENT CHECKSUM BYTE
1085 FAD0 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
1086 FAD2 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
1087 FAD5 AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
1088 FAD7 AC E4 CMPX ,S COMPARE IT TO END ADDR
1089 FAD9 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
1090 FADB 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
1091 FADD 17 01 A7 LBSR OUTCH OUTPUT IT
1092 FAE0 32 65 LEAS 5,S READJUST STACK POINTER
1093 FAE2 39 RTS ;
1094 *
1095 * PRINT STRING PRECEEDED BY A CR & LF.
1096 *
1097 FAE3 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1098 FAE5 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1099 *
1100 * PCRLF
1101 *
1102 FAE7 34 10 PCRLF PSHS X SAVE IX
1103 FAE9 8E FE BB LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1104 FAEC 17 00 69 LBSR PDATA PRINT MSG
1105 FAEF 35 90 PULS X,PC RESTORE IX & RETURN
1106 *
1107 * LONG BRANCHES TO COMMON ROUTINES
1108 *
1109 FAF1 16 01 91 JOUT1S LBRA OUT1S
1110 FAF4 16 00 F8 JBYTE LBRA BYTE
1111 FAF7 16 00 E5 JIN1ADR LBRA IN1ADR
1112 *
1113 * ALTER "PC" PROGRAM COUNTER
1114 *
1115 FAFA 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1116 FAFD 8D F2 BSR JOUT1S OUTPUT SPACE
1117 FAFF 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1118 FB01 29 02 BVS ALTPCD EXIT IF INVALID HEX
1119 FB03 AF 4A STX 10,U POKE IN NEW CONTENTS
1120 FB05 39 ALTPCD RTS ;
1121 *
1122 * ALTER "U" USER STACK POINTER
1123 *
1124 FB06 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1125 FB08 8D E7 BSR JOUT1S OUTPUT SPACE
1126 FB0A 8D EB BSR JIN1ADR
1127 FB0C 29 02 BVS ALTUD
1128 FB0E AF 48 STX 8,U
1129 FB10 39 ALTUD RTS ;
1130 *
1131 * ALTER "Y" INDEX REGISTER
1132 *
1133 FB11 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1134 FB13 8D DC BSR JOUT1S OUTPUT SPACE
1135 FB15 8D E0 BSR JIN1ADR
1136 FB17 29 02 BVS ALTYD
1137 FB19 AF 46 STX 6,U $F8F0
1138 FB1B 39 ALTYD RTS ;
1139 *
1140 * ALTER "X" INDEX REGISTER
1141 *
1142 FB1C 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1143 FB1E 8D D1 BSR JOUT1S OUTPUT SPACE
1144 FB20 8D D5 BSR JIN1ADR
1145 FB22 29 02 BVS ALTXD
1146 FB24 AF 44 STX 4,U
1147 FB26 39 ALTXD RTS ;
1148 *
1149 * ALTER "DP" DIRECT PAGE REGISTER
1150 *
1151 FB27 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1152 FB29 8D C6 BSR JOUT1S OUTPUT SPACE
1153 FB2B 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1154 FB2D 29 02 BVS ALTDPD
1155 FB2F A7 43 STA 3,U
1156 FB31 39 ALTDPD RTS ;
1157 *
1158 * ALTER "B" ACCUMULATOR
1159 *
1160 FB32 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1161 FB34 8D BB BSR JOUT1S OUTPUT SPACE
1162 FB36 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1163 FB38 29 02 BVS ALTBD
1164 FB3A A7 42 STA 2,U
1165 FB3C 39 ALTBD RTS $F91C
1166 *
1167 * ALTER "A" ACCUMULATOR
0881 ENDIF TRAOPT
0881 ENDIF TRAOPT
0882 IFD MFDCOPT
0883 *
0884 ** "U" MINI DISK BOOT
0885 *
0886 F9CA 7D E0 18 MINBOOT TST CMDFDC
0887 F9CD 7F E0 14 CLR DRVFDC
0888 F9D0 8E 00 00 LDX #$0000
0889 F9D3 30 01 LOOP LEAX $01,X
0890 F9D5 8C 00 00 CMPX #$0000
0891 F9D8 26 F9 BNE LOOP
0892 F9DA 86 0F LDA #$0F
0893 F9DC B7 E0 18 STA CMDFDC
0894 F9DF 8D 37 BSR DELAY
0895 F9E1 F6 E0 18 LOOP1 LDB CMDFDC
0896 F9E4 C5 01 BITB #$01
0897 F9E6 26 F9 BNE LOOP1
0898 F9E8 86 01 LDA #$01
0899 F9EA B7 E0 1A STA SECFDC
0900 F9ED 8D 29 BSR DELAY
0901 F9EF 86 8C LDA #$8C
0902 F9F1 B7 E0 18 STA CMDFDC
0903 F9F4 8D 22 BSR DELAY
0904 F9F6 8E C0 00 LDX #$C000
0905 F9F9 20 09 BRA LOOP3
0906 F9FB C5 02 LOOP2 BITB #$02
0907 F9FD 27 05 BEQ LOOP3
0908 F9FF B6 E0 1B LDA DATFDC
0909 FA02 A7 80 STA ,X+
0910 FA04 F6 E0 18 LOOP3 LDB CMDFDC
0911 FA07 C5 01 BITB #$01
0912 FA09 26 F0 BNE LOOP2
0913 FA0B C5 2C BITB #$2C
0914 FA0D 27 01 BEQ LOOP4
0915 FA0F 39 RTS
0916 *
0917 FA10 8E C0 00 LOOP4 LDX #$C000
0918 FA13 AF 4A STX $0A,U
0919 FA15 1F 34 TFR U,S
0920 FA17 3B RTI
0921 *
0922 FA18 C6 04 DELAY LDB #$04
0923 FA1A 5A LOOP5 DECB
0924 FA1B 26 FD BNE LOOP5
0925 FA1D 39 RTS
0926 ENDIF MFDCOPT
0927 *
0928 IFD DMAFOPT
0929 *
0930 *** "D" DISK BOOT FOR DMAF2 ***
0931 *
0932 DBOOT LDA #$DE
0933 STA DRVREG
0934 LDA #$FF
0935 STA PRIREG $FAF8
0936 STA CCREG
0937 STA AAAREG
0938 STA BBBREG
0939 TST CCREG
0940 LDA #$D8
0941 STA COMREG
0942 LBSR DLY
0943 DBOOT0 LDA COMREG
0944 BMI DBOOT0
0945 LDA #$09
0946 STA COMREG
0947 LBSR DLY
0948 *
0949 DISKWT LDA COMREG FETCH DRIVE STATUS
0950 BITA #1 TEST BUSY BIT
0951 BNE DISKWT LOOP UNTIL NOT BUSY
0952 *
0953 BITA #$10
0954 BNE DBOOT
0955 *
0956 LDX #$C000 LOGICAL ADDR. = $C000
0957 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0958 ORA #$10
0959 STA CCCREG
0960 TFR X,D
0961 COMA ;
0962 COMB ;
0963 STD ADDREG
0964 LDX #$FEFF LOAD DMA BYTE COUNT = $100
0965 STX CNTREG STORE IN COUNT REGISTER
0966 LDA #$FF LOAD THE CHANNEL REGISTER
0967 STA CCREG
0968 LDA #$FE SET CHANNEL 0
0969 STA PRIREG
0970 LDA #1 SET SECTOR TO "1"
0971 STA SECREG ISSUE COMMAND
0972 LDA #$8C SET SINGLE SECTOR READ
0973 STA COMREG ISSUE COMMAND
0974 BSR DLY
0975 *
0976 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0977 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0978 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0979 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0980 * IS STILL A ONE THE BOOT OPERATION WILL
0981 * BE STARTED OVER FROM THE BEGINING.
0982 *
0983 CLRB ;
0984 DBOOT1 PSHS B $FB55
0985 CLRB ;
0986 DBOOT2 TST CCREG
0987 BPL DBOOT3
0988 DECB ;
0989 BNE DBOOT2
0990 PULS B
0991 DECB
0992 BNE DBOOT1
0993 BRA DBOOT
0994 DBOOT3 PULS B
0995 LDA COMREG
0996 BITA #$1C
0997 BEQ DBOOT4
0998 RTS ;
0999 *
1000 *
1001 DBOOT4 LDB #$DE
1002 STB DRVREG
1003 LDX #$C000
1004 STX 10,U
1005 TFR U,S $FB7B
1006 RTI ;
1007 ENDIF DMAFOPT
1007 ENDIF DMAFOPT
1008 *
1009 IFD CFOPT
1010 *
1011 * COMPACT FLASH BOOT
1012 *
1013 CFBOOT BSR WAITRDY
1014 LDA #HEADLBA
1015 STA CF_HEAD
1016 BSR WAITRDY
1017 LDA #FEAT8BIT
1018 STA CF_FEATURE
1019 LDA #CMDFEATURE
1020 STA CF_COMAND
1021 BSR WAITRDY
1022 *
1023 * READ SECTORS FROM CF
1024 *
1025 CFREAD LDA #$01
1026 STA CF_SECCNT
1027 CLRA
1028 STA CF_SECNUM
1029 STA CF_CYLLO
1030 STA CF_CYLHI
1031 *
1032 LDA #CMDREAD ; IDE READ MULTIPLE
1033 STA CF_COMAND
1034 BSR WAITRDY
1035 LDX #$C000
1036 *
1037 * READ LOOP
1038 *
1039 RDLOOP BSR WAITDRQ
1040 LDA CF_DATA
1041 STA ,X+
1042 CMPX #$C200
1043 BNE RDLOOP
1044 *
1045 LDX #$C000
1046 STX $0A,U
1047 TFR U,S
1048 RTI
1049 *
1050 * WAIT UNTIL READY
1051 *
1052 WAITRDY LDA CF_STATUS
1053 BITA #BUSY
1054 BNE WAITRDY
1055 LDA CF_STATUS
1056 BITA #DRDY
1057 BEQ WAITRDY
1058 RTS
1059 *
1060 * WAIT FOR DATA REQUEST
1061 *
1062 WAITDRQ LDA CF_STATUS
1063 BITA #DRQ
1064 BEQ WAITDRQ
1065 RTS
1066 ENDIF CFOPT
1066 ENDIF CFOPT
1067 *
1068 IFD RTCOPT
1069 *
1070 * CLOCK INTER FACE UTILITY
1071 *
1072 * TIME <Hours> <Minuits> <Seconds>
1073 * If no argument is specified, the current time
1074 * will be displayed.
1075 *
1076 * READ A REGISTER FROM THE COUNTER.
1077 * The X Index rgister points to the register
1078 * to be read. The Status Register is checked
1079 * before and after the register is read before
1080 * returning a value in accumulator A
1081 *
1082 RDCLK TST CLKSTA
1083 BNE RDCLK
1084 RDCLK1 LDA 0,X
1085 TST CLKSTA
1086 BNE RDCLK1
1087 RTS
1088 *
1089 * MAIN PROGRAM:
1090 *
1091 TIMSET LDX #COUNTR POINT TO TIMER
1092 LBSR BYTE READ HOURS
1093 BVS SHOWTM NO ARG, DISP TIME
1094 STA HOUR,X
1095 LBSR OUT1S
1096 LBSR BYTE READ MINUITES
1097 BVS SHOWTM
1098 STA MINUIT,X
1099 LBSR OUT1S
1100 LBSR BYTE SECONDS.
1101 BVS SHOWTM
1102 STA SECOND,X
1103 *
1104 * DISPLAY CURRENT TIME
1105 *
1106 SHOWTM LBSR PCRLF
1107 LDX #COUNTR+HOUR
1108 LDB #3
1109 SHOWLP BSR RDCLK
1110 LBSR OUT2H
1111 LDA #':
1112 LBSR OUTCH
1113 LEAX -1,X
1114 DECB
1115 BNE SHOWLP
1116 RTS
1117 *
1118 * INITIATE CLOCK.
1119 * MASK INTERRUPTS.
1120 *
1121 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
1122 TST CINTSR CLEAR ANY INTERRUPTS
1123 RTS
1124 ENDIF RTCOPT
1124 ENDIF RTCOPT
1125 IFD DATOPT
1126 *
1127 ***** LRA LOAD REAL ADDRESS *****
1128 *
1129 * THE FOLLOWING CODE LOADS THE 20-BIT
1130 * PHYSICAL ADDRESS OF A MEMORY BYTE
1131 * INTO THE "A" AND "X" REGISTERS. THIS
1132 * ROUTINE IS ENTERED WITH THE LOGICAL
1133 * ADDRESS OF A MEMORY BYTE IN THE "IX"
1134 * REGISTER. EXIT IS MADE WITH THE HIGH-
1135 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
1136 * ADDRESS IN THE "A" REGISTER, AND THE
1137 * LOW-ORDER 16-BITS OF THE 20-BIT
1138 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
1139 * ALL OTHER REGISTERS ARE PRESERVED.
1140 * THIS ROUTINE IS REQUIRED SINCE THE
1141 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
1142 * PRESENT PHYSICAL ADDRESSES ON THE
1143 * SYSTEM BUS.
1144 *
1145 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
1146 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
1147 LSRA ;
1148 LSRA ADJ FOR INDEXED INTO
1149 LSRA CORRESPONDING LOCATION
1150 LSRA IN LRA TABLE
1151 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
1152 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
1153 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
1154 LSRB PHYSICAL ADDRESS.
1155 LSRB EXTENDED MS 4-BITS ARE RETURNED
1156 LSRB IN THE "A" ACCUMULATOR
1157 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
1158 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
1159 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
1160 ASLB ADJ DATA FOR RELOCATION IN X REG
1161 ASLB ;
1162 ASLB $FB97
1163 ASLB ;
1164 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
1165 ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
1166 STA 2,S SAVE IT IN X REG ON STACK
1167 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
1168 *
1169 FB3D 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1170 FB3F 8D B0 BSR JOUT1S OUTPUT SPACE
1171 FB41 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1172 FB43 29 02 BVS ALTAD
1173 FB45 A7 41 STA 1,U
1174 FB47 39 ALTAD RTS ;
1175 *
1176 * ALTER "CC" REGISTER
1177 *
1178 FB48 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1179 FB4A 8D A5 BSR JOUT1S OUTPUT SPACE
1180 FB4C 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1181 FB4E 29 04 BVS ALTCCD
1182 FB50 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1183 FB52 A7 C4 STA ,U
1184 FB54 39 ALTCCD RTS ;
1169 * PLUS LS NIBBLE OF LOGICAL ADDRESS
1170 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
1171 * ON STACK
1172 PULS A,B,X,Y,PC POP REGS. FROM STACK
1173 ENDIF DATOPT
1173 ENDIF DATOPT
1174 *
1175 * DELAY LOOP
1176 *
1177 FA1E 34 04 DLY PSHS B SAVE CONTENTS OF "B"
1178 FA20 C6 20 LDB #$20 GET LOOP DELAY VALUE
1179 FA22 5A SUB1 DECB SUBTRACT ONE FROM VALUE
1180 FA23 26 FD BNE SUB1 LOOP UNTIL ZERO
1181 FA25 35 84 PULS B,PC RESTORE CONTENTS OF "B"
1182 * RTS ;
1183 *
1184 ***** "L" LOAD MIKBUG TAPE *****
1185 *
1186 * PDATA
1187 *
1188 FB55 17 01 2F PRINT LBSR OUTCH
1189 FB58 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1190 FB5A 81 04 CMPA #4 IS IT EOT?
1191 FB5C 26 F7 BNE PRINT IF NOT EOT PRINT IT
1192 FB5E 39 RTS ;
1193 *
1194 * PRINT REGISTERS
1195 *
1196 FB5F 8E FE CD PRTSP LDX #MSG10 POINT TO MSG "SP="
1197 FB62 8D F4 BSR PDATA PRINT MSG
1198 FB64 1F 31 TFR U,X
1199 FB66 16 00 BF JOUT4H LBRA OUT4H
1200 *
1201 FB69 8E FE D9 PRTUS LDX #MSG12 POINT TO MSG "US="
1202 FB6C 8D EA BSR PDATA PRINT MSG
1203 FB6E AE 48 LDX 8,U
1204 FB70 20 F4 BRA JOUT4H
1205 *
1206 FB72 8E FE EB PRTDP LDX #MSG15 POINT TO MSG "DP="
1207 FB75 8D E1 BSR PDATA PRINT MSG
1208 FB77 A6 43 LDA 3,U
1209 FB79 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1210 *
1211 FB7C 8E FE E5 PRTIX LDX #MSG14 POINT TO MSG "IX="
1212 FB7F 8D D7 BSR PDATA PRINT MSG
1213 FB81 AE 44 LDX 4,U $FCE6
1214 FB83 20 E1 BRA JOUT4H
1215 *
1216 FB85 8E FE DF PRTIY LDX #MSG13 POINT TO MSG "IY="
1217 FB88 8D CE BSR PDATA PRINT MSG
1218 FB8A AE 46 LDX 6,U
1219 FB8C 20 D8 BRA JOUT4H
1220 *
1221 FB8E 8E FE D3 PRTPC LDX #MSG11 POINT TO MSG "PC="
1222 FB91 8D C5 BSR PDATA PRINT MSG
1223 FB93 AE 4A LDX 10,U
1224 FB95 20 CF BRA JOUT4H
1225 *
1226 FB97 8E FE F1 PRTA LDX #MSG16 POINT TO MSG "A="
1227 FB9A 8D BC BSR PDATA PRINT MSG
1228 FB9C A6 41 LDA 1,U
1229 FB9E 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1230 *
1231 FBA0 8E FE F6 PRTB LDX #MSG17 POINT TO MSG "B="
1232 FBA3 8D B3 BSR PDATA PRINT MSG
1233 FBA5 A6 42 LDA 2,U
1234 FBA7 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1235 *
1236 FBA9 8E FE FB PRTCC LDX #MSG18 POINT TO MSG "CC:"
1237 FBAC 8D AA BSR PDATA PRINT MSG
1238 FBAE A6 C4 LDA ,U
1239 FBB0 8E FF 02 LDX #MSG19 POINT TO MSG "EFHINZVC"
1240 FBB3 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1241 *
1242 * "R" DISPLAY REGISTERS
1243 *
1244 FBB6 8E FE C9 REGSTR LDX #MSG5 POINT TO MSG " - "
1245 FBB9 17 FF 27 LBSR PSTRNG PRINT MSG
1246 FBBC 8D A1 BSR PRTSP $FCBF
1247 FBBE 8D A9 BSR PRTUS $FCCA
1248 FBC0 8D B0 BSR PRTDP $FCD5
1249 FBC2 8D B8 BSR PRTIX $FCE0
1250 FBC4 8D BF BSR PRTIY $FCEB
1251 FBC6 8E FE C9 LDX #MSG5 POINT TO MSG " - "
1252 FBC9 17 FF 17 LBSR PSTRNG PRINT MSG
1253 FBCC 8D C0 BSR PRTPC $FCF5
1254 FBCE 8D C7 BSR PRTA $FCFF
1255 FBD0 8D CE BSR PRTB $FD09
1256 FBD2 20 D5 BRA PRTCC $FD13
1257 *
1258 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1259 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1260 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1261 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1262 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1263 * ADDRESS IS INPUT.
1264 *
1265 FBD4 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1266 FBD6 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1267 FBD8 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1268 FBDA 86 2D LDA #'-
1269 FBDC 17 00 A8 LBSR OUTCH PRINT " - "
1270 *
1271 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1272 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1273 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1274 *
1275 FBDF 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1276 FBE1 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1277 FBE3 1F 01 TFR D,X
1278 FBE5 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1279 FBE7 29 3C BVS NOTHEX
1280 FBE9 34 10 PSHS X
1281 FBEB A7 61 STA 1,S
1282 FBED 35 90 PULS X,PC
1283 *
1284 ***** INPUT BYTE (2 HEX CHAR.) *****
1285 *
1286 FBEF 8D 11 BYTE BSR INHEX GET HEX LEFT
1287 FBF1 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1288 FBF3 48 ASLA ;
1289 FBF4 48 ASLA ;
1290 FBF5 48 ASLA ; SHIFT INTO LEFT NIBBLE
1291 FBF6 48 ASLA ;
1292 FBF7 1F 89 TFR A,B PUT HEXL IN "B"
1293 FBF9 8D 07 BSR INHEX GET HEX RIGHT
1294 FBFB 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1295 FBFD 34 04 PSHS B PUSH HEXL ON STACK
1296 FBFF AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1297 FC01 39 RTS RETURN WITH HEX L&R IN "A"
1298 *
1299 *
1300 FC02 8D 5B INHEX BSR ECHON INPUT ASCII CHAR.
1301 FC04 81 30 CMPA #'0 IS IT > OR = "0" ?
1302 FC06 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1303 FC08 81 39 CMPA #'9 IS IT < OR = "9" ?
1304 FC0A 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1305 FC0C 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1306 FC0E 39 RTS ;
1307 *
1308 *
1309 FC0F 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1310 FC11 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1311 FC13 81 46 CMPA #'F IS IT < OR = "F" ?
1312 FC15 22 03 BHI INHEXL IF > IT AIN'T HEX
1313 FC17 80 37 SUBA #$37 ASCII ADJ. ALPHA
1314 FC19 39 RTS ;
1315 *
1316 FC1A 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1317 FC1C 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1318 FC1E 81 66 CMPA #'f IS IT < "f"
1319 FC20 22 03 BHI NOTHEX IF > IT AIN'T HEX
1320 FC22 80 57 SUBA #$57 ADJUST TO LOWER CASE
1321 FC24 39 RTS ;
1322 *
1323 *
1324 FC25 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1325 FC27 39 RTS ;
1326 *
1186 FA27 BD FC 9C LOAD JSR ACINIZ
1187 FA2A 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
1188 FA2C 17 02 58 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
1189 FA2F 7F DF D2 CLR ECHO TURN OFF ECHO FLAG
1190 FA32 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
1191 FA35 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
1192 FA37 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
1193 FA39 17 02 23 LBSR ECHON
1194 FA3C 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
1195 FA3E 27 3D BEQ LOAD21 IF SO, EXIT LOAD
1196 FA40 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
1197 FA42 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
1198 FA44 17 01 A8 LBSR BYTE INPUT BYTE COUNT
1199 FA47 34 02 PSHS A PUSH COUNT ON STACK
1200 FA49 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
1201 FA4B 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
1202 FA4E 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
1203 FA50 34 10 PSHS X PUSH ADDR ON STACK
1204 FA52 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
1205 FA54 EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
1206 FA56 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
1207 FA58 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
1208 FA5A 6A E4 DEC ,S ADDRESS BYTES.
1209 FA5C 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
1210 FA5E 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
1211 FA61 35 04 PULS B POP CHECKSUM FROM STACK
1212 FA63 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
1213 FA65 34 02 PSHS A PUSH DATA BYTE ON STACK
1214 FA67 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
1215 FA69 6A E4 DEC ,S DECREMENT BYTE COUNT 1
1216 FA6B 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
1217 FA6D A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
1218 FA6F 20 EB BRA LOAD10 GET NEXT DATA BYTE
1219 FA71 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
1220 FA72 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
1221 FA74 C1 FF CMPB #$FF CHECKSUM OK?
1222 FA76 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
1223 FA78 86 3F LDA #'? LOAD (?) ERROR INDICATOR
1224 FA7A 17 02 0A LBSR OUTCH OUTPUT IT TO TERMINAL
1225 FA7D 73 DF D2 LOAD21 COM ECHO TURN ECHO ON
1226 FA80 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
1227 FA82 16 02 02 LBRA OUTCH OUTPUT IT
1228 *
1229 ***** "P" PUNCH MIKBUG TAPE *****
1230 *
1231 FA85 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
1232 FA87 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
1233 FA8A 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
1234 FA8C 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
1235 FA8E AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
1236 FA90 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
1237 FA92 30 01 LEAX 1,X INCREMENT END ADDRESS
1238 FA94 AF E4 STX ,S STORE END ADDR ON STACK
1239 FA96 BD FC 9C JSR ACINIZ
1240 FA99 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
1241 FA9B 17 01 E9 LBSR OUTCH OUTPUT IT TO TERMINAL
1242 FA9E EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
1243 FAA0 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
1244 FAA2 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
1245 FAA4 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
1246 FAA8 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
1247 FAAA C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
1248 FAAC E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
1249 FAAE 8E FF 0A LDX #MSG20 POINT TO MSG "S1"
1250 FAB1 17 00 2F LBSR PSTRNG PRINT MSG
1251 FAB4 CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
1252 FAB6 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
1253 FAB8 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
1254 FABB AE 62 LDX 2,S LOAD BEGIN ADDRESS
1255 FABD 17 01 68 LBSR OUT4H PUNCH ADDRESS
1256 FAC0 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
1257 FAC2 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
1258 FAC4 EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
1259 FAC6 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
1260 FAC8 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
1261 FACB 6A 64 DEC 4,S DECREMENT BYTE COUNT
1262 FACD 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
1263 FACF 53 COMB 1's COMPLIMENT CHECKSUM BYTE
1264 FAD0 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
1265 FAD2 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
1266 FAD5 AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
1267 FAD7 AC E4 CMPX ,S COMPARE IT TO END ADDR
1268 FAD9 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
1269 FADB 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
1270 FADD 17 01 A7 LBSR OUTCH OUTPUT IT
1271 FAE0 32 65 LEAS 5,S READJUST STACK POINTER
1272 FAE2 39 RTS ;
1273 *
1274 * PRINT STRING PRECEEDED BY A CR & LF.
1275 *
1276 FAE3 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1277 FAE5 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1278 *
1279 * PCRLF
1280 *
1281 FAE7 34 10 PCRLF PSHS X SAVE IX
1282 FAE9 8E FE BB LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1283 FAEC 17 00 69 LBSR PDATA PRINT MSG
1284 FAEF 35 90 PULS X,PC RESTORE IX & RETURN
1285 *
1286 * LONG BRANCHES TO COMMON ROUTINES
1287 *
1288 FAF1 16 01 91 JOUT1S LBRA OUT1S
1289 FAF4 16 00 F8 JBYTE LBRA BYTE
1290 FAF7 16 00 E5 JIN1ADR LBRA IN1ADR
1291 *
1292 * ALTER "PC" PROGRAM COUNTER
1293 *
1294 FAFA 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1295 FAFD 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1296 FAFF 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1297 FB01 29 02 BVS ALTPCD EXIT IF INVALID HEX
1298 FB03 AF 4A STX 10,U POKE IN NEW CONTENTS
1299 FB05 39 ALTPCD RTS ;
1300 *
1301 * ALTER "U" USER STACK POINTER
1302 *
1303 FB06 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1304 FB08 8D E7 BSR JOUT1S OUTPUT SPACE
1305 FB0A 8D EB BSR JIN1ADR
1306 FB0C 29 02 BVS ALTUD
1307 FB0E AF 48 STX 8,U
1308 FB10 39 ALTUD RTS ;
1309 *
1310 * ALTER "Y" INDEX REGISTER
1311 *
1312 FB11 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1313 FB13 8D DC BSR JOUT1S OUTPUT SPACE
1314 FB15 8D E0 BSR JIN1ADR
1315 FB17 29 02 BVS ALTYD
1316 FB19 AF 46 STX 6,U $F8F0
1317 FB1B 39 ALTYD RTS ;
1318 *
1319 * ALTER "X" INDEX REGISTER
1320 *
1321 FB1C 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1322 FB1E 8D D1 BSR JOUT1S OUTPUT SPACE
1323 FB20 8D D5 BSR JIN1ADR
1324 FB22 29 02 BVS ALTXD
1325 FB24 AF 44 STX 4,U
1326 FB26 39 ALTXD RTS ;
1327 *
1328 FC28 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1329 FC2A 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1330 FC2C 8D 02 BSR OUTHL OUTPUT HEX LEFT
1331 FC2E 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1332 FC30 OUTHL EQU *
1333 FC30 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1334 FC32 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1335 FC33 44 LSRA ;
1336 FC34 44 LSRA ;
1337 FC35 44 LSRA ;
1338 FC36 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1339 FC38 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1340 FC3A 84 0F ANDA #$0F STRIP LEFT NIBBLE
1341 FC3C 8B 30 XASCII ADDA #$30 ASCII ADJ
1342 FC3E 81 39 CMPA #$39 IS IT < OR = "9" ?
1343 FC40 2F 02 BLE OUTC IF LESS, OUTPUT IT
1344 FC42 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1345 FC44 20 41 OUTC BRA OUTCH OUTPUT CHAR
1346 *
1347 * BINARY / ASCII --- THIS ROUTINE
1348 * OUTPUTS A BYTE IN ENHANCED
1349 * BINARY FORMAT. THE ENHANCEMENT
1350 * IS DONE BY SUBSTITUTING ASCII
1351 * LETTERS FOR THE ONES IN THE BYTE.
1352 * THE ASCII ENHANCEMENT LETTERS
1353 * ARE OBTAINED FROM THE STRING
1354 * POINTED TO BY THE INDEX REG. "X".
1355 *
1356 FC46 34 02 BIASCI PSHS A SAVE "A" ON STACK
1357 FC48 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1358 FC4A A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1359 FC4C 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1360 FC4E 25 02 BCS PRTBA IF ONE PRINT LETTER
1361 FC50 86 2D LDA #'- IF ZERO PRINT "-"
1362 FC52 8D 33 PRTBA BSR OUTCH PRINT IT
1363 FC54 8D 2F BSR OUT1S PRINT SPACE
1364 FC56 5A DECB SUB 1 FROM #BITS YET TO PRINT
1365 FC57 26 F1 BNE OUTBA
1366 FC59 35 82 PULS A,PC
1367 *
1368 * EXTENDED USER COMMANDS
1369 *
1370 FC5B 6E 9F F0 00 EXTEND JMP [MONEXT+EXTCMD]
1371 *
1372 *
1373 FC5F 7D DF D2 ECHON TST ECHO IS ECHO REQUIRED ?
1374 FC62 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1375 *
1376 * INCHE
1377 *
1378 * ---GETS CHARACTER FROM TERMINAL AND
1379 * ECHOS SAME. THE CHARACTER IS RETURNED
1380 * IN THE "A" ACCUMULATOR WITH THE PARITY
1381 * BIT MASKED OFF. ALL OTHER REGISTERS
1382 * ARE PRESERVED.
1383 *
1384 FC64 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1385 FC66 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1386 FC68 20 1D BRA OUTCH ECHO CHAR TO TERMINAL
1387 *
1388 * INCH
1389 *
1390 * GET CHARACTER FROM TERMINAL. RETURN
1391 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1392 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1393 * IS 8 BITS AND IS NOT ECHOED.
1394 *
1395 *
1396 FC6A 34 10 INCH PSHS X SAVE IX
1397 FC6C BE DF D0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1398 FC6F A6 84 LDA ,X FETCH PORT STATUS
1399 FC71 85 01 BITA #1 TEST READY BIT, RDRF ?
1400 IFD FPGAOPT
1401 BNE GETST1
1402 LDX #ACIAS
1403 LDA ,X
1404 BITA #1
1405 ENDIF FPGAOPT
1405 ENDIF FPGAOPT
1406 FC73 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1407 FC75 A6 01 GETST1 LDA 1,X FETCH CHAR
1408 FC77 35 90 PULS X,PC RESTORE IX
1409 *
1410 * INCHEK
1411 *
1412 * CHECK FOR A CHARACTER AVAILABLE FROM
1413 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1414 * FOR READ READY. ALL REGISTERS ARE
1415 * PRESERVED, AND THE "Z" BIT WILL BE
1416 * CLEAR IF A CHARACTER CAN BE READ.
1417 *
1418 *
1419 FC79 34 02 INCHEK PSHS A SAVE A ACCUM.
1420 FC7B A6 9F DF D0 LDA [CPORT] FETCH PORT STATUS
1421 FC7F 85 01 BITA #1 TEST READY BIT, RDRF ?
1422 IFD FPGAOPT
1423 BNE INCHEK1
1424 LDA ACIAS
1425 BITA #1 TEST READY BIT< RDRF ?
1426 ENDIF FPGAOPT
1426 ENDIF FPGAOPT
1427 FC81 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1428 *
1429 FC83 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1430 FC85 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1431 *
1432 *
1433 * OUTCH
1434 *
1435 * OUTPUT CHARACTER TO TERMINAL.
1436 * THE CHAR. TO BE OUTPUT IS
1437 * PASSED IN THE A REGISTER.
1438 * ALL REGISTERS ARE PRESERVED.
1439 *
1440 OUTCH IFD FPGAOPT
1441 BSR VOUTCH
1442 ENDIF FPGAOPT
1442 ENDIF FPGAOPT
1443 IFD ADSOPT
1444 FC87 8D 3B BSR VOUTCH
1445 ENDIF ADSOPT
1446 FC89 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1447 FC8B BE DF D0 LDX CPORT GET ADDR. OF TERMINAL
1448 FC8E A6 84 FETSTA LDA ,X FETCH PORT STATUS
1449 FC90 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1450 FC92 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1451 FC94 35 02 PULS A GET CHAR. FOR XMIT
1452 FC96 A7 01 STA 1,X XMIT CHAR.
1453 FC98 35 90 PULS X,PC RESTORE IX
1454 *
1455 * IO INITIALIZATION
1456 *
1457 FC9A IOINIZ EQU *
1458 IFD FPGAOPT
1459 BSR VINIZ
1460 ENDIF FPGAOPT
1460 ENDIF FPGAOPT
1461 IFD ADSOPT
1462 FC9A 8D 13 BSR VINIZ
1463 ENDIF ADSOPT
1464 FC9C BE DF D0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1465 FC9F 86 03 LDA #3 RESET ACIA PORT CODE
1466 FCA1 A7 84 STA ,X STORE IN CONTROL REGISTER
1467 FCA3 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1468 FCA5 A7 84 STA ,X STORE IN CONTROL REGISTER
1469 FCA7 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1470 FCA9 86 FF LDA #$FF TURN ON ECHO FLAG
1471 FCAB B7 DF D2 STA ECHO
1472 FCAE 39 RTS
1473 *
1474 IFD FPGAOPT
1475 *
1476 ***************************************************
1477 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1478 * *
1479 * 80 x 25 Characters
1480 *
1481 ***************************************************
1482 *
1483 ***************************************************
1484 * INITIALIZE EMULATOR *
1485 ***************************************************
1486 *
1487 VINIZ LDX #VDU
1488 LDD #0
1489 STD COLADX AND ROWADX
1490 STA VDUCOL,X
1491 STB VDUROW,X
1492 STB VDUOFF,X
1493 STD NEWROW AND ESCFLG
1494 LDB #$02
1495 STB VDUATT,X
1496 CLR ESCFLG
1497 LDA #$1B SEND ESCAPE
1498 BSR VOUTCH
1499 LDA #'Y CLEAR TO END OF SCREEN
1500 *
1501 ** VIDEO OUTPUT ROUTINE
1502 *
1503 VOUTCH PSHS A,B,X SAVE REGISTERS
1504 LDX #VDU POINT TO VDU REGISTERS
1505 *
1506 ** CHECK FOR ESCAPE SEQUENCE
1507 *
1508 TST ESCFLG ESCAPE ACTIVE?
1509 BEQ SOROU1 BRANCH IF NOT
1510 BSR ESCAPE ELSE DO ESCAPE
1511 BRA RETURN AND RETURN
1512 *
1513 ** CHECK FOR CONTROL CHARACTERS
1514 *
1515 SOROU1 CMPA #$20 CONTROL CODES?
1516 BHS SOROU2
1517 BSR CONTRL BRANCH IF SO
1518 BRA RETURN
1519 *
1520 ** OUTPUT TEXT CHARACTER
1521 *
1522 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1523 LBSR NEWCOL UPDATE COLUMN
1524 *
1525 ** DISPLAY CURSOR AND RETURN
1526 *
1527 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1528 *
1529 ***************************************************
1530 * CONTROL CODE HANDLERS *
1531 ***************************************************
1532 *
1533 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1534 LBEQ BACKSP
1535 CMPA #$1B ESCAPE SEQUENCE?
1536 LBEQ SETESC
1537 CMPA #$1A CTRL Z - Clear Screen
1538 LBEQ CLRSCR
1539 CMPA #$16 CTRL ^ - Home
1540 LBEQ HOME
1541 CMPA #$D CTRL M - RETURN?
1542 LBEQ CRETN
1543 CMPA #$0C CTRL L - CHAR RIGHT
1544 LBEQ CHRIGHT
1545 CMPA #$0B CTRL K - MOVE UP ONE LINE
1546 LBEQ LINEUP
1547 CMPA #$0A CTRL J - LINE FEED
1548 BNE RETESC NONE OF THESE, RETURN
1549 *
1550 ***************************************** LINE FEED
1551 *
1552 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1553 INCB BUMP ROW
1554 CMPB #NUMLIN SCROLL TIME?
1555 LBNE NEWCUR POSITION CURSOR IF NOT
1556 LBRA SCROLL ELSE SCROLL IT
1557 *
1558 ***************************************** LINE FEED
1559 *
1560 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1561 TSTB AT TOP OF SCREEN ?
1562 LBEQ RETESC Yes, Ignore
1563 DECB No, Decrement ROW
1564 LBRA NEWCUR POSITION CURSOR
1565 *
1566 *********************************** BACK SPACE
1567 *
1568 BACKSP LDA COLADX
1569 BEQ RETESC RETURN
1570 DECA
1571 LBRA POSCOL POSITION CURSOR
1572 *
1573 *********************************** CURSOR RIGHT
1574 *
1575 CHRIGHT LDA COLADX
1576 INCA
1577 CMPA #LINLEN
1578 LBEQ RETESC
1579 LBRA POSCOL
1580 *
1581 *********************************** CURSOR RIGHT
1582 *
1583 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1584 LBRA NEWCUR
1585 *
1586 ***************************************************
1587 * ESCAPE HANDLERS *
1588 ***************************************************
1589 *
1590 ESCAPE LDAB ESCFLG GET FLAG
1591 CMPB #'= SETTING CURSOR?
1592 BEQ ESCCUR BRANCH IF SO
1593 CMPA #'Y CLEAR TO END OF SCREEN?
1594 LBEQ ESCCLS
1595 CMPA #'T CLEAR TO END OF LINE?
1596 BEQ ESCCLL
1597 CMPA #'= STARTING CURSOR SET?
1598 BNE CLRESC BRANCH IF NOT
1599 *
1600 ***************************** START ESCAPE SEQUENCE
1601 *
1602 SETESC STAA ESCFLG ELSE START CURSORING
1603 RTS AND RETURN
1604 *
1605 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1606 RETESC RTS SO RETURN
1607 *
1608 ********************************* SET SCREEN CURSOR
1609 *
1610 ESCCUR TST NEWROW ROW SET?
1611 BNE ESCCU1 BRANCH IF SO
1612 STAA NEWROW ELSE SET NEW ROW
1613 RTS AND RETURN
1614 *
1615 ESCCU1 CLR ESCFLG
1616 SUBA #$20 ADJUST COLUMN ADDRESS
1617 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1618 BHI RETESC NOT OK, DO NOTHING
1619 *
1620 ESCCU2 LDAB NEWROW
1621 CLR NEWROW
1622 SUBB #$20 ADJUST TO ROW ADDRESS
1623 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1624 BHI RETESC ELSE RETURN DOING NOTHING
1625 BRA NEWCUR GO SET NEW CURSOR IF SO
1626 *
1627 ****************** CLEAR FROM CURSOR TO END OF LINE
1628 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1629 BSR NEWCUR
1630 ESCCLL LDA COLADX
1631 LDB #$20 AND CLEAR CHAR
1632 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1633 INCA
1634 STA VDUCOL,X
1635 CMPA #LINLEN UNTIL END OF LINE
1636 BNE ESCCL1
1637 CLR ESCFLG
1638 RTS
1639 *
1640 *********************************** CARRIAGE RETURN
1641 *
1642 CRETN CLRA SET COLUMN ZERO
1643 POSCOL LDB ROWADX GET CURRENT ROW
1644 *
1645 *********** GENERATE NEW CURSOR POSITION AND RETURN
1646 *
1647 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1648 STA VDUCOL,X SET NEW COLUMN
1649 STB VDUROW,X SET NEW ROW
1650 RTS AND RETURN
1651 *
1652 ********************* UPDATE CURRENT COLUMN AND ROW
1653 *
1654 NEWCOL LDD COLADX GET ROW AND COLUMN
1655 INCA BUMP COLUMN
1656 CMPA #LINLEN ROLL?
1657 BNE NEWCUR BRANCH IF NOT
1658 CLRA ELSE RESET TO ZERO
1659 INCB AND BUMP ROW
1660 CMPB #NUMLIN
1661 BNE NEWCUR
1662 DECB BOTTOM ROW
1663 BSR NEWCUR
1664 *
1665 ********************************* SCROLL THE SCREEN
1666 *
1667 SCROLL LDB VDUOFF,X
1668 INCB
1669 CMPB #NUMLIN
1670 BLO SCROL1
1671 CLRB
1672 SCROL1 STB VDUOFF,X
1673 *
1674 **************** CLEAR FROM CURSOR TO END OF SCREEN
1675 *
1676 ESCCLS LDB COLADX GET CURSOR
1677 LDA #$20 GET A SPACE
1678 ESCCLS1 STB COLADX
1679 STB VDUCOL,X
1680 STA VDUCHR,X
1681 INCB
1682 CMPB #LINLEN
1683 BNE ESCCLS1
1328 * ALTER "DP" DIRECT PAGE REGISTER
1329 *
1330 FB27 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1331 FB29 8D C6 BSR JOUT1S OUTPUT SPACE
1332 FB2B 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1333 FB2D 29 02 BVS ALTDPD
1334 FB2F A7 43 STA 3,U
1335 FB31 39 ALTDPD RTS ;
1336 *
1337 * ALTER "B" ACCUMULATOR
1338 *
1339 FB32 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1340 FB34 8D BB BSR JOUT1S OUTPUT SPACE
1341 FB36 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1342 FB38 29 02 BVS ALTBD
1343 FB3A A7 42 STA 2,U
1344 FB3C 39 ALTBD RTS $F91C
1345 *
1346 * ALTER "A" ACCUMULATOR
1347 *
1348 FB3D 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1349 FB3F 8D B0 BSR JOUT1S OUTPUT SPACE
1350 FB41 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1351 FB43 29 02 BVS ALTAD
1352 FB45 A7 41 STA 1,U
1353 FB47 39 ALTAD RTS ;
1354 *
1355 * ALTER "CC" REGISTER
1356 *
1357 FB48 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1358 FB4A 8D A5 BSR JOUT1S OUTPUT SPACE
1359 FB4C 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1360 FB4E 29 04 BVS ALTCCD
1361 FB50 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1362 FB52 A7 C4 STA ,U
1363 FB54 39 ALTCCD RTS ;
1364 *
1365 * PDATA
1366 *
1367 FB55 17 01 2F PRINT LBSR OUTCH
1368 FB58 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1369 FB5A 81 04 CMPA #4 IS IT EOT?
1370 FB5C 26 F7 BNE PRINT IF NOT EOT PRINT IT
1371 FB5E 39 RTS ;
1372 *
1373 * PRINT REGISTERS
1374 *
1375 FB5F 8E FE CD PRTSP LDX #MSG10 POINT TO MSG "SP="
1376 FB62 8D F4 BSR PDATA PRINT MSG
1377 FB64 1F 31 TFR U,X
1378 FB66 16 00 BF JOUT4H LBRA OUT4H
1379 *
1380 FB69 8E FE D9 PRTUS LDX #MSG12 POINT TO MSG "US="
1381 FB6C 8D EA BSR PDATA PRINT MSG
1382 FB6E AE 48 LDX 8,U
1383 FB70 20 F4 BRA JOUT4H
1384 *
1385 FB72 8E FE EB PRTDP LDX #MSG15 POINT TO MSG "DP="
1386 FB75 8D E1 BSR PDATA PRINT MSG
1387 FB77 A6 43 LDA 3,U
1388 FB79 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1389 *
1390 FB7C 8E FE E5 PRTIX LDX #MSG14 POINT TO MSG "IX="
1391 FB7F 8D D7 BSR PDATA PRINT MSG
1392 FB81 AE 44 LDX 4,U $FCE6
1393 FB83 20 E1 BRA JOUT4H
1394 *
1395 FB85 8E FE DF PRTIY LDX #MSG13 POINT TO MSG "IY="
1396 FB88 8D CE BSR PDATA PRINT MSG
1397 FB8A AE 46 LDX 6,U
1398 FB8C 20 D8 BRA JOUT4H
1399 *
1400 FB8E 8E FE D3 PRTPC LDX #MSG11 POINT TO MSG "PC="
1401 FB91 8D C5 BSR PDATA PRINT MSG
1402 FB93 AE 4A LDX 10,U
1403 FB95 20 CF BRA JOUT4H
1404 *
1405 FB97 8E FE F1 PRTA LDX #MSG16 POINT TO MSG "A="
1406 FB9A 8D BC BSR PDATA PRINT MSG
1407 FB9C A6 41 LDA 1,U
1408 FB9E 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1409 *
1410 FBA0 8E FE F6 PRTB LDX #MSG17 POINT TO MSG "B="
1411 FBA3 8D B3 BSR PDATA PRINT MSG
1412 FBA5 A6 42 LDA 2,U
1413 FBA7 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1414 *
1415 FBA9 8E FE FB PRTCC LDX #MSG18 POINT TO MSG "CC:"
1416 FBAC 8D AA BSR PDATA PRINT MSG
1417 FBAE A6 C4 LDA ,U
1418 FBB0 8E FF 02 LDX #MSG19 POINT TO MSG "EFHINZVC"
1419 FBB3 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1420 *
1421 * "R" DISPLAY REGISTERS
1422 *
1423 FBB6 8E FE C9 REGSTR LDX #MSG5 POINT TO MSG " - "
1424 FBB9 17 FF 27 LBSR PSTRNG PRINT MSG
1425 FBBC 8D A1 BSR PRTSP $FCBF
1426 FBBE 8D A9 BSR PRTUS $FCCA
1427 FBC0 8D B0 BSR PRTDP $FCD5
1428 FBC2 8D B8 BSR PRTIX $FCE0
1429 FBC4 8D BF BSR PRTIY $FCEB
1430 FBC6 8E FE C9 LDX #MSG5 POINT TO MSG " - "
1431 FBC9 17 FF 17 LBSR PSTRNG PRINT MSG
1432 FBCC 8D C0 BSR PRTPC $FCF5
1433 FBCE 8D C7 BSR PRTA $FCFF
1434 FBD0 8D CE BSR PRTB $FD09
1435 FBD2 20 D5 BRA PRTCC $FD13
1436 *
1437 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1438 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1439 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1440 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1441 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1442 * ADDRESS IS INPUT.
1443 *
1444 FBD4 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1445 FBD6 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1446 FBD8 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1447 FBDA 86 2D LDA #'-
1448 FBDC 17 00 A8 LBSR OUTCH PRINT " - "
1449 *
1450 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1451 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1452 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1453 *
1454 FBDF 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1455 FBE1 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1456 FBE3 1F 01 TFR D,X
1457 FBE5 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1458 FBE7 29 3C BVS NOTHEX
1459 FBE9 34 10 PSHS X
1460 FBEB A7 61 STA 1,S
1461 FBED 35 90 PULS X,PC
1462 *
1463 ***** INPUT BYTE (2 HEX CHAR.) *****
1464 *
1465 FBEF 8D 11 BYTE BSR INHEX GET HEX LEFT
1466 FBF1 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1467 FBF3 48 ASLA ;
1468 FBF4 48 ASLA ;
1469 FBF5 48 ASLA ; SHIFT INTO LEFT NIBBLE
1470 FBF6 48 ASLA ;
1471 FBF7 1F 89 TFR A,B PUT HEXL IN "B"
1472 FBF9 8D 07 BSR INHEX GET HEX RIGHT
1473 FBFB 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1474 FBFD 34 04 PSHS B PUSH HEXL ON STACK
1475 FBFF AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1476 FC01 39 RTS RETURN WITH HEX L&R IN "A"
1477 *
1478 *
1479 FC02 8D 5B INHEX BSR ECHON INPUT ASCII CHAR.
1480 FC04 81 30 CMPA #'0 IS IT > OR = "0" ?
1481 FC06 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1482 FC08 81 39 CMPA #'9 IS IT < OR = "9" ?
1483 FC0A 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1484 FC0C 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1485 FC0E 39 RTS ;
1486 *
1487 *
1488 FC0F 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1489 FC11 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1490 FC13 81 46 CMPA #'F IS IT < OR = "F" ?
1491 FC15 22 03 BHI INHEXL IF > IT AIN'T HEX
1492 FC17 80 37 SUBA #$37 ASCII ADJ. ALPHA
1493 FC19 39 RTS ;
1494 *
1495 FC1A 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1496 FC1C 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1497 FC1E 81 66 CMPA #'f IS IT < "f"
1498 FC20 22 03 BHI NOTHEX IF > IT AIN'T HEX
1499 FC22 80 57 SUBA #$57 ADJUST TO LOWER CASE
1500 FC24 39 RTS ;
1501 *
1502 *
1503 FC25 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1504 FC27 39 RTS ;
1505 *
1506 *
1507 FC28 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1508 FC2A 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1509 FC2C 8D 02 BSR OUTHL OUTPUT HEX LEFT
1510 FC2E 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1511 FC30 OUTHL EQU *
1512 FC30 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1513 FC32 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1514 FC33 44 LSRA ;
1515 FC34 44 LSRA ;
1516 FC35 44 LSRA ;
1517 FC36 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1518 FC38 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1519 FC3A 84 0F ANDA #$0F STRIP LEFT NIBBLE
1520 FC3C 8B 30 XASCII ADDA #$30 ASCII ADJ
1521 FC3E 81 39 CMPA #$39 IS IT < OR = "9" ?
1522 FC40 2F 02 BLE OUTC IF LESS, OUTPUT IT
1523 FC42 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1524 FC44 20 41 OUTC BRA OUTCH OUTPUT CHAR
1525 *
1526 * BINARY / ASCII --- THIS ROUTINE
1527 * OUTPUTS A BYTE IN ENHANCED
1528 * BINARY FORMAT. THE ENHANCEMENT
1529 * IS DONE BY SUBSTITUTING ASCII
1530 * LETTERS FOR THE ONES IN THE BYTE.
1531 * THE ASCII ENHANCEMENT LETTERS
1532 * ARE OBTAINED FROM THE STRING
1533 * POINTED TO BY THE INDEX REG. "X".
1534 *
1535 FC46 34 02 BIASCI PSHS A SAVE "A" ON STACK
1536 FC48 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1537 FC4A A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1538 FC4C 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1539 FC4E 25 02 BCS PRTBA IF ONE PRINT LETTER
1540 FC50 86 2D LDA #'- IF ZERO PRINT "-"
1541 FC52 8D 33 PRTBA BSR OUTCH PRINT IT
1542 FC54 8D 2F BSR OUT1S PRINT SPACE
1543 FC56 5A DECB SUB 1 FROM #BITS YET TO PRINT
1544 FC57 26 F1 BNE OUTBA
1545 FC59 35 82 PULS A,PC
1546 *
1547 * EXTENDED USER COMMANDS
1548 *
1549 FC5B 6E 9F F0 00 EXTEND JMP [MONEXT+EXTCMD]
1550 *
1551 *
1552 FC5F 7D DF D2 ECHON TST ECHO IS ECHO REQUIRED ?
1553 FC62 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1554 *
1555 * INCHE
1556 *
1557 * ---GETS CHARACTER FROM TERMINAL AND
1558 * ECHOS SAME. THE CHARACTER IS RETURNED
1559 * IN THE "A" ACCUMULATOR WITH THE PARITY
1560 * BIT MASKED OFF. ALL OTHER REGISTERS
1561 * ARE PRESERVED.
1562 *
1563 FC64 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1564 FC66 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1565 FC68 20 1D BRA OUTCH ECHO CHAR TO TERMINAL
1566 *
1567 * INCH
1568 *
1569 * GET CHARACTER FROM TERMINAL. RETURN
1570 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1571 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1572 * IS 8 BITS AND IS NOT ECHOED.
1573 *
1574 *
1575 FC6A 34 10 INCH PSHS X SAVE IX
1576 FC6C BE DF D0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1577 FC6F A6 84 LDA ,X FETCH PORT STATUS
1578 FC71 85 01 BITA #1 TEST READY BIT, RDRF ?
1579 IFD PS2OPT
1580 BNE GETST1
1581 LDX #PS2KBD
1582 LDA ,X
1583 BITA #1
1584 ENDIF PS2OPT
1584 ENDIF PS2OPT
1585 FC73 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1586 FC75 A6 01 GETST1 LDA 1,X FETCH CHAR
1587 FC77 35 90 PULS X,PC RESTORE IX
1588 *
1589 * INCHEK
1590 *
1591 * CHECK FOR A CHARACTER AVAILABLE FROM
1592 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1593 * FOR READ READY. ALL REGISTERS ARE
1594 * PRESERVED, AND THE "Z" BIT WILL BE
1595 * CLEAR IF A CHARACTER CAN BE READ.
1596 *
1597 *
1598 FC79 34 02 INCHEK PSHS A SAVE A ACCUM.
1599 FC7B A6 9F DF D0 LDA [CPORT] FETCH PORT STATUS
1600 FC7F 85 01 BITA #1 TEST READY BIT, RDRF ?
1601 IFD PS2OPT
1602 BNE INCHEK1
1603 LDA PS2KBD
1604 BITA #1 TEST READY BIT< RDRF ?
1605 ENDIF PS2OPT
1605 ENDIF PS2OPT
1606 FC81 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1607 *
1608 FC83 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1609 FC85 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1610 *
1611 *
1612 * OUTCH
1613 *
1614 * OUTPUT CHARACTER TO TERMINAL.
1615 * THE CHAR. TO BE OUTPUT IS
1616 * PASSED IN THE A REGISTER.
1617 * ALL REGISTERS ARE PRESERVED.
1618 *
1619 OUTCH IFD VDUOPT
1620 BSR VOUTCH
1621 ENDIF VDUOPT
1621 ENDIF VDUOPT
1622 IFD DG640OPT
1623 FC87 8D 3B BSR VOUTCH
1624 ENDIF DG640OPT
1625 FC89 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1626 FC8B BE DF D0 LDX CPORT GET ADDR. OF TERMINAL
1627 FC8E A6 84 FETSTA LDA ,X FETCH PORT STATUS
1628 FC90 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1629 FC92 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1630 FC94 35 02 PULS A GET CHAR. FOR XMIT
1631 FC96 A7 01 STA 1,X XMIT CHAR.
1632 FC98 35 90 PULS X,PC RESTORE IX
1633 *
1634 * IO INITIALIZATION
1635 *
1636 FC9A IOINIZ EQU *
1637 IFD VDUOPT
1638 BSR VINIZ
1639 ENDIF VDUOPT
1639 ENDIF VDUOPT
1640 IFD DG640OPT
1641 FC9A 8D 13 BSR VINIZ
1642 ENDIF DG640OPT
1643 FC9C BE DF D0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1644 FC9F 86 03 LDA #3 RESET ACIA PORT CODE
1645 FCA1 A7 84 STA ,X STORE IN CONTROL REGISTER
1646 FCA3 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1647 FCA5 A7 84 STA ,X STORE IN CONTROL REGISTER
1648 FCA7 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1649 FCA9 86 FF LDA #$FF TURN ON ECHO FLAG
1650 FCAB B7 DF D2 STA ECHO
1651 FCAE 39 RTS
1652 *
1653 IFD VDUOPT
1654 *
1655 ***************************************************
1656 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1657 * *
1658 * 80 x 25 Characters
1659 *
1660 ***************************************************
1661 *
1662 ***************************************************
1663 * INITIALIZE EMULATOR *
1664 ***************************************************
1665 *
1666 VINIZ LDX #VDU
1667 LDD #0
1668 STD COLADX AND ROWADX
1669 STA VDUCOL,X
1670 STB VDUROW,X
1671 STB VDUOFF,X
1672 STD NEWROW AND ESCFLG
1673 LDB #$02
1674 STB VDUATT,X
1675 CLR ESCFLG
1676 LDA #$1B SEND ESCAPE
1677 BSR VOUTCH
1678 LDA #'Y CLEAR TO END OF SCREEN
1679 *
1680 ** VIDEO OUTPUT ROUTINE
1681 *
1682 VOUTCH PSHS A,B,X SAVE REGISTERS
1683 LDX #VDU POINT TO VDU REGISTERS
1684 *
1685 LDB ROWADX
1686 INCB
1687 CMPB #NUMLIN
1688 BEQ ESCCLS2
1689 STB ROWADX
1690 STB VDUROW,X
1691 CLRB
1692 BRA ESCCLS1
1685 ** CHECK FOR ESCAPE SEQUENCE
1686 *
1687 TST ESCFLG ESCAPE ACTIVE?
1688 BEQ SOROU1 BRANCH IF NOT
1689 BSR ESCAPE ELSE DO ESCAPE
1690 BRA RETURN AND RETURN
1691 *
1692 ** CHECK FOR CONTROL CHARACTERS
1693 *
1694 ESCCLS2 CLRB
1695 STB COLADX
1696 STB VDUCOL,X
1697 STB ESCFLG
1698 RTS
1699 ENDIF FPGAOPT
1699 ENDIF FPGAOPT
1700 *
1701 IFD ADSOPT
1702 ***************************************************
1703 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1704 * *
1705 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1706 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1707 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1708 * 16x64 BOARD). *
1709 ***************************************************
1710
1711 ***************************************************
1712 * INITIALIZE EMULATOR *
1713 ***************************************************
1714
1715 FCAF 8E 00 00 VINIZ LDX #0
1716 FCB2 BF DF EB STX COLADX AND ROWADX
1717 FCB5 BF DF EF STX NEWROW AND ESCFLG
1718 FCB8 8E E8 00 LDX #SCREEN POINT TO SCREEN
1719 FCBB BF DF ED STX CURSOR SET PROGRAM CURSOR
1720 FCBE 86 1B LDA #$1B SEND ESCAPE
1721 FCC0 8D 02 BSR VOUTCH
1722 FCC2 86 59 LDA #'Y CLEAR TO END OF SCREEN
1723 *
1724 ** VIDEO OUTPUT ROUTINE
1725 *
1726 FCC4 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS
1727 *
1728 ** CLEAR CURSOR
1729 FCC6 BE DF ED LDX CURSOR
1730 FCC9 E6 84 LDB 0,X
1731 FCCB C4 7F ANDB #$7F
1732 FCCD E7 84 STB 0,X
1733 *
1734 ** CHECK FOR ESCAPE SEQUENCE
1735 FCCF 7D DF F0 TST ESCFLG ESCAPE ACTIVE?
1736 FCD2 27 04 BEQ SOROU1 BRANCH IF NOT
1737 FCD4 8D 5E BSR ESCAPE ELSE DO ESCAPE
1738 FCD6 20 10 BRA RETURN AND RETURN
1739 *
1740 ** CHECK FOR CONTROL CHARACTERS
1741 FCD8 81 20 SOROU1 CMPA #$20 CONTROL CODES?
1742 FCDA 24 04 BHS SOROU2
1743 FCDC 8D 15 BSR CONTRL BRANCH IF SO
1744 FCDE 20 08 BRA RETURN
1745 *
1746 ** OUTPUT TEXT CHARACTER
1747 FCE0 BE DF ED SOROU2 LDX CURSOR ELSE GET CURSOR
1748 FCE3 A7 84 STAA 0,X DISPLAY CHARACTER
1749 FCE5 17 00 E9 LBSR NEWCOL UPDATE COLUMN
1750 *
1751 ** DISPLAY CURSOR AND RETURN
1752 FCE8 BE DF ED RETURN LDX CURSOR AND DISPLAY IT
1753 FCEB E6 84 LDB ,X
1754 FCED CA 80 ORAB #$80 WITH REVID
1755 FCEF E7 84 STB ,X
1756 FCF1 35 96 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1757
1758 ***************************************************
1759 * CONTROL CODE HANDLERS *
1760 ***************************************************
1761
1762 FCF3 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1763 FCF5 10 27 00 27 LBEQ BACKSP
1764 FCF9 81 1B CMPA #$1B ESCAPE SEQUENCE?
1765 FCFB 10 27 00 52 LBEQ SETESC
1766 FCFF 81 0D CMPA #$D CTRL M - RETURN?
1767 FD01 10 27 00 B4 LBEQ CRETN
1768 FD05 81 0A CMPA #$0A CTRL J - LINE FEED
1769 FD07 26 4F BNE RETESC NONE OF THESE, RETURN
1770
1771 ***************************************** LINE FEED
1772
1773 FD09 FC DF EB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1774 FD0C 5C INCB BUMP ROW
1775 FD0D C1 10 CMPB #NUMLIN SCROLL TIME?
1776 FD0F 10 26 00 AA LBNE NEWCUR POSITION CURSOR IF NOT
1777 FD13 16 00 CC LBRA SCROLL ELSE SCROLL IT
1778
1779 ***************************************** LINE FEED
1780
1781 FD16 FC DF EB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1782 FD19 5D TSTB AT TOP OF SCREEN ?
1783 FD1A 27 3C BEQ RETESC Yes, Ignore
1784 FD1C 5A DECB No, Decrement ROW
1785 FD1D 16 00 9D LBRA NEWCUR POSITION CURSOR
1786
1787
1788 *********************************** BACK SPACE
1789
1790 FD20 B6 DF EB BACKSP LDA COLADX
1791 FD23 27 33 BEQ RETESC RETURN
1792 FD25 4A DECA
1793 FD26 16 00 91 LBRA POSCOL POSITION CURSOR
1794
1795 *********************************** CURSOR RIGHT
1796
1797 FD29 B6 DF EB CHRIGHT LDA COLADX
1798 FD2C 4C INCA
1799 FD2D 81 40 CMPA #LINLEN
1800 FD2F 27 27 BEQ RETESC
1801 FD31 16 00 86 LBRA POSCOL
1802
1803 ***************************************************
1804 * ESCAPE HANDLERS *
1805 ***************************************************
1806
1807 FD34 F6 DF F0 ESCAPE LDAB ESCFLG GET FLAG
1808 FD37 C1 3D CMPB #'= SETTING CURSOR?
1809 FD39 27 1E BEQ ESCCUR BRANCH IF SO
1810 FD3B 81 59 CMPA #'Y CLEAR TO END OF SCREEN?
1811 FD3D 10 27 00 B8 LBEQ ESCCLS
1812 FD41 81 54 CMPA #'T CLEAR TO END OF LINE?
1813 FD43 27 5D BEQ ESCCLL
1814 FD45 81 45 CMPA #'E INSERT LINE?
1815 FD47 27 3B BEQ ESCINL
1816 FD49 81 52 CMPA #'R DELETE LINE?
1817 FD4B 27 2C BEQ ESCDLL
1818 FD4D 81 3D CMPA #'= STARTING CURSOR SET?
1819 FD4F 26 04 BNE CLRESC BRANCH IF NOT
1820
1821 ***************************** START ESCAPE SEQUENCE
1822
1823 FD51 B7 DF F0 SETESC STAA ESCFLG ELSE START CURSORING
1824 FD54 39 RTS AND RETURN
1825
1826 FD55 7F DF F0 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1827 FD58 39 RETESC RTS SO RETURN
1828
1829 ********************************* SET SCREEN CURSOR
1830
1831 FD59 7D DF EF ESCCUR TST NEWROW ROW SET?
1832 FD5C 26 04 BNE ESCCU1 BRANCH IF SO
1833 FD5E B7 DF EF STAA NEWROW ELSE SET NEW ROW
1834 FD61 39 RTS AND RETURN
1835
1836 FD62 7F DF F0 ESCCU1 CLR ESCFLG
1837 FD65 80 20 SUBA #$20 ADJUST COLUMN ADDRESS
1838 FD67 81 3F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1839 FD69 22 ED BHI RETESC NOT OK, DO NOTHING
1840
1841 FD6B F6 DF EF ESCCU2 LDAB NEWROW
1842 FD6E 7F DF EF CLR NEWROW
1843 FD71 C0 20 SUBB #$20 ADJUST TO ROW ADDRESS
1844 FD73 C1 0F CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1845 FD75 22 E1 BHI RETESC ELSE RETURN DOING NOTHING
1846 FD77 20 44 BRA NEWCUR GO SET NEW CURSOR IF SO
1847 *
1848 *************************** DELETE LINE FROM SCREEN
1849
1850 FD79 8D 3E ESCDLL BSR CRETN GO COL. ZERO
1851 FD7B F6 DF EC LDB ROWADX
1852 FD7E C1 0F CMPB #NUMLIN-1
1853 FD80 27 7A BEQ SCROL3
1854 FD82 20 61 BRA SCROL1 AND DELETE THIS LINE
1855
1856 *************************** INSERT LINE INTO SCREEN
1857
1858 FD84 8D 33 ESCINL BSR CRETN GO TO COL. ZERO
1859 FD86 F6 DF EC LDAB ROWADX
1860 FD89 C1 0F CMPB #NUMLIN-1
1861 FD8B 27 15 BEQ ESCCLL
1862 *
1863 ** SCROLL SCREEN DOWN FROM CURSOR
1864 *
1865 FD8D 8E EB C0 LDX #SCREEN+SCNLEN-LINLEN
1866 FD90 A6 82 ESCIN0 LDAA 0,-X
1867 FD92 A7 88 40 STAA LINLEN,X
1868 FD95 A6 89 04 00 LDA SCNLEN,X
1869 FD99 A7 89 04 40 STA SCNLEN+LINLEN,X
1870 FD9D BC DF ED CPX CURSOR
1871 FDA0 26 EE BNE ESCIN0
1872
1873 ****************** CLEAR FROM CURSOR TO END OF LINE
1874
1875 FDA2 B6 DF EB ESCCLL LDA COLADX GET CURRENT COLUMN
1876 FDA5 BE DF ED LDX CURSOR GET CURSOR
1877 FDA8 C6 20 LDB #$20 AND CLEAR CHAR
1878 FDAA E7 89 04 00 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
1879 FDAE E7 80 STB ,X+ CLEAR TEXT
1880 FDB0 4C INCA
1881 FDB1 81 40 CMPA #LINLEN UNTIL END OF LINE
1882 FDB3 26 F5 BNE ESCLL1
1883 FDB5 7F DF F0 CLR ESCFLG
1884 FDB8 39 RTS
1885
1886 *********************************** CARRIAGE RETURN
1887
1888 FDB9 4F CRETN CLRA SET COLUMN ZERO
1889 FDBA F6 DF EC POSCOL LDB ROWADX GET CURRENT ROW
1890
1891 *********** GENERATE NEW CURSOR POSITION AND RETURN
1892
1893 FDBD FD DF EB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1894 FDC0 86 40 LDA #LINLEN ELSE ADD A LINE
1895 FDC2 3D MUL LINLEN * ROWADX
1896 FDC3 FB DF EB ADDB COLADX
1897 FDC6 89 00 ADCA #0
1898 FDC8 C3 E8 00 ADDD #SCREEN ADD SCREEN BASE.
1899 FDCB FD DF ED STD CURSOR SAVE NEW CURSOR
1900 FDCE 1F 01 TFR D,X GET CURSOR IN X
1901 FDD0 39 RTS AND RETURN
1902
1903 ********************* UPDATE CURRENT COLUMN AND ROW
1904
1905 FDD1 FC DF EB NEWCOL LDD COLADX GET ROW AND COLUMN
1906 FDD4 4C INCA BUMP COLUMN
1907 FDD5 81 40 CMPA #LINLEN ROLL?
1908 FDD7 26 E4 BNE NEWCUR BRANCH IF NOT
1909 FDD9 4F CLRA ELSE RESET TO ZERO
1910 FDDA 5C INCB AND BUMP ROW
1911 FDDB C1 10 CMPB #NUMLIN
1912 FDDD 26 DE BNE NEWCUR
1913 FDDF 5A DECB BOTTOM ROW
1914 FDE0 8D DB BSR NEWCUR
1915
1916 ********************************* SCROLL THE SCREEN
1917
1918 FDE2 8E E8 00 SCROLL LDX #SCREEN POINT TO SCREEN
1919 FDE5 A6 89 04 40 SCROL1 LDA SCNLEN+LINLEN,X
1920 FDE9 A7 89 04 00 STA SCNLEN,X
1921 FDED A6 88 40 LDAA LINLEN,X MOVE TWO BYTES
1922 FDF0 A7 80 STAA 0,X+ UP ONE LINE
1923 FDF2 8C EB C0 CMPX #SCREEN+SCNLEN-LINLEN
1924 FDF5 26 EE BNE SCROL1 LOOP UNTIL DONE
1925 FDF7 20 03 BRA SCROL3
1926
1927 **************** CLEAR FROM CURSOR TO END OF SCREEN
1928
1929 FDF9 BE DF ED ESCCLS LDX CURSOR GET CURSOR
1930 FDFC 86 20 SCROL3 LDAA #$20 GET A SPACE
1931 FDFE A7 89 04 00 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
1932 FE02 A7 80 STA ,X+ AND TEXT
1933 FE04 8C EC 00 CMPX #SCREEN+SCNLEN
1934 FE07 26 F5 BNE SCROL2 UNTIL DONE
1935 FE09 7F DF F0 CLR ESCFLG
1936 FE0C 39 RTS
1937 ENDIF ADSOPT
1938 *
1939 IFD PRTOPT
1940 *************************************
1941 *
1942 ** PRINTER DRIVER ROUTINES
1943 *
1944 *************************************
1945 *
1946 ** PINIZ - INITIATE PRINTER PORT
1947 *
1948 FE0D 34 04 PINIZ PSHS B
1949 FE0F CC 0C 04 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
1950 FE12 FD E4 04 STD PADATA SET DDR AND SELECT DATA
1951 *
1952 ** RESET PRINTER
1953 FE15 C6 04 LDB #PRESET
1954 FE17 F7 E4 04 STAB PADATA
1955 FE1A 5C RESTLP INCB DELAY FOR RESET
1956 FE1B 26 FD BNE RESTLP
1957 FE1D B7 E4 04 STAA PADATA ACCA=DIRMSK
1958 *
1959 ** INITALIZE PORT B (DATA PORT)
1960 FE20 86 2A LDAA #$2A
1961 FE22 B7 E4 07 STAA PBCTRL
1962 FE25 CC FF 2E LDD #$FF2E ACCA=$FF ACCB =%00101110
1963 FE28 FD E4 06 STD PBDATA PBDREG PBCTRL
1964 *
1965 ** SELECT 66 LINES/PAGE
1966 FE2B 86 1B LDAA #$1B
1967 FE2D 8D 08 BSR POUTCH
1968 FE2F 86 43 LDAA #'C
1969 FE31 8D 04 BSR POUTCH
1970 FE33 86 42 LDAA #66
1971 FE35 35 04 PULS B
1972 *************************************
1973 *
1974 ** OUTPUT A CHARACTER TO THE PRINTER
1975 *
1976 *************************************
1977 FE37 34 04 POUTCH PSHS B
1978 FE39 F6 E4 06 LDAB PBDATA CLEAR INTERRUPT BIT
1979 *
1980 ** WAIT TILL NOT BUSY
1981 FE3C F6 E4 04 BUSYLP LDAB PADATA
1982 FE3F C5 10 BITB #PERROR
1983 FE41 27 06 BEQ PEXIT
1984 FE43 5D TSTB
1985 FE44 2B F6 BMI BUSYLP
1986 *
1987 ** NOW OUTPUT CHARACTER
1988 FE46 B7 E4 06 STAA PBDATA
1989 FE49 35 84 PEXIT PULS B,PC
1990 *************************************
1991 *
1992 ** PCHK TEST IFD PRINTER READY
1993 *
1994 *************************************
1995 FE4B 7D E4 07 PCHK TST PBCTRL TEST STATE OF CRB7
1996 FE4E 39 RTS SET ON ACKNOWLEDGE
1997 ENDIF PRTOPT
1998 *************************************
1999 *
2000 * MONITOR KEYBOARD COMMAND JUMP TABLE
2001 *
2002 *************************************
2003 *
2004 FE4F JMPTAB EQU *
2005 FE4F 01 FCB 1 " ^A "
2006 FE50 FB 3D FDB ALTRA
2007 FE52 02 FCB 2 " ^B "
2008 FE53 FB 32 FDB ALTRB
2009 FE55 03 FCB 3 " ^C "
2010 FE56 FB 48 FDB ALTRCC
2011 FE58 04 FCB 4 " ^D "
2012 FE59 FB 27 FDB ALTRDP
2013 FE5B 10 FCB $10 " ^P "
2014 FE5C FA FA FDB ALTRPC
2015 FE5E 15 FCB $15 " ^U "
2016 FE5F FB 06 FDB ALTRU
2017 FE61 18 FCB $18 " ^X "
2018 FE62 FB 1C FDB ALTRX
2019 FE64 19 FCB $19 " ^Y "
2020 FE65 FB 11 FDB ALTRY
2021 *
2022 FE67 42 FCC 'B'
2023 FE68 F9 51 FDB BRKPNT
2024 FE6A 45 FCC 'E'
2025 FE6B F8 F2 FDB MEMDUMP
2026 FE6D 47 FCC 'G'
2027 FE6E F8 9A FDB GO
2028 FE70 4C FCC 'L'
2029 FE71 FA 27 FDB LOAD
2030 FE73 50 FCC 'P'
2031 FE74 FA 85 FDB PUNCH
2032 FE76 4D FCC 'M'
2033 FE77 F8 9D FDB MEMCHG
2034 FE79 52 FCC 'R'
2035 FE7A FB B6 FDB REGSTR
2036 FE7C 53 FCC 'S'
2037 FE7D F8 E6 FDB DISSTK
2038 FE7F 58 FCC 'X'
2039 FE80 F9 7D FDB XBKPNT
2040 IFD MFDCOPT
2041 FE82 44 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
2042 FE83 F9 CA FDB MINBOOT
2043 ENDIF MFDCOPT
2044 IFD FPGAOPT
2045 FCC 'D' *** FPGA USES 'D' FOR CFBOOT
2046 FDB CFBOOT
2047 ENDIF FPGAOPT
2047 ENDIF FPGAOPT
2048 IFD DMAFOPT
2049 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
2050 FDB DBOOT
2051 ELSE
2052 FE85 55 FCC 'U' *** IF NOT DMAF2, 'U' IS FOR USER
2053 FE86 FC 5B FDB EXTEND
2054 ENDIF DMAFOPT
2055 IFD RTCOPT
2056 FCC 'T'
2057 FDB TIMSET
2058 ENDIF RTCOPT
2058 ENDIF RTCOPT
2059 *
2060 FE88 TABEND EQU *
2061 *
2062 * ** 6809 VECTOR ADDRESSES **
2063 *
2064 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
2065 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
2066 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
2067 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
2068 * HIS OWN ROUTINES IF HE SO DESIRES.
2069 *
2070 *
2071 FE88 F9 89 RAMVEC FDB SWIE USER-V
2072 FE8A F8 9C FDB RTI SWI3-V
2073 FE8C F8 9C FDB RTI SWI2-V
2074 FE8E F8 9C FDB RTI FIRQ-V
2075 FE90 F8 9C FDB RTI IRQ-V
2076 FE92 F9 89 FDB SWIE SWI-V
2077 FE94 FF FF FDB $FFFF SVC-VO
2078 FE96 FF FF FDB $FFFF SVC-VL
2079 *
2080 * PRINTABLE MESSAGE STRINGS
2081 *
2082 FE98 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2083 FE9D 53 59 53 30 39 42 FCC 'SYS09BUG 1.2 FOR '
55 47 20 31 2E 32
1694 SOROU1 CMPA #$20 CONTROL CODES?
1695 BHS SOROU2
1696 BSR CONTRL BRANCH IF SO
1697 BRA RETURN
1698 *
1699 ** OUTPUT TEXT CHARACTER
1700 *
1701 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1702 LBSR NEWCOL UPDATE COLUMN
1703 *
1704 ** DISPLAY CURSOR AND RETURN
1705 *
1706 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1707 *
1708 ***************************************************
1709 * CONTROL CODE HANDLERS *
1710 ***************************************************
1711 *
1712 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1713 LBEQ BACKSP
1714 CMPA #$1B ESCAPE SEQUENCE?
1715 LBEQ SETESC
1716 CMPA #$1A CTRL Z - Clear Screen
1717 LBEQ CLRSCR
1718 CMPA #$16 CTRL ^ - Home
1719 LBEQ HOME
1720 CMPA #$D CTRL M - RETURN?
1721 LBEQ CRETN
1722 CMPA #$0C CTRL L - CHAR RIGHT
1723 LBEQ CHRIGHT
1724 CMPA #$0B CTRL K - MOVE UP ONE LINE
1725 LBEQ LINEUP
1726 CMPA #$0A CTRL J - LINE FEED
1727 BNE RETESC NONE OF THESE, RETURN
1728 *
1729 ***************************************** LINE FEED
1730 *
1731 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1732 INCB BUMP ROW
1733 CMPB #NUMLIN SCROLL TIME?
1734 LBNE NEWCUR POSITION CURSOR IF NOT
1735 LBRA SCROLL ELSE SCROLL IT
1736 *
1737 ***************************************** LINE FEED
1738 *
1739 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1740 TSTB AT TOP OF SCREEN ?
1741 LBEQ RETESC Yes, Ignore
1742 DECB No, Decrement ROW
1743 LBRA NEWCUR POSITION CURSOR
1744 *
1745 *********************************** BACK SPACE
1746 *
1747 BACKSP LDA COLADX
1748 BEQ RETESC RETURN
1749 DECA
1750 LBRA POSCOL POSITION CURSOR
1751 *
1752 *********************************** CURSOR RIGHT
1753 *
1754 CHRIGHT LDA COLADX
1755 INCA
1756 CMPA #LINLEN
1757 LBEQ RETESC
1758 LBRA POSCOL
1759 *
1760 *********************************** CURSOR RIGHT
1761 *
1762 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1763 LBRA NEWCUR
1764 *
1765 ***************************************************
1766 * ESCAPE HANDLERS *
1767 ***************************************************
1768 *
1769 ESCAPE LDAB ESCFLG GET FLAG
1770 CMPB #'= SETTING CURSOR?
1771 BEQ ESCCUR BRANCH IF SO
1772 CMPA #'Y CLEAR TO END OF SCREEN?
1773 LBEQ ESCCLS
1774 CMPA #'T CLEAR TO END OF LINE?
1775 BEQ ESCCLL
1776 CMPA #'= STARTING CURSOR SET?
1777 BNE CLRESC BRANCH IF NOT
1778 *
1779 ***************************** START ESCAPE SEQUENCE
1780 *
1781 SETESC STAA ESCFLG ELSE START CURSORING
1782 RTS AND RETURN
1783 *
1784 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1785 RETESC RTS SO RETURN
1786 *
1787 ********************************* SET SCREEN CURSOR
1788 *
1789 ESCCUR TST NEWROW ROW SET?
1790 BNE ESCCU1 BRANCH IF SO
1791 STAA NEWROW ELSE SET NEW ROW
1792 RTS AND RETURN
1793 *
1794 ESCCU1 CLR ESCFLG
1795 SUBA #$20 ADJUST COLUMN ADDRESS
1796 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1797 BHI RETESC NOT OK, DO NOTHING
1798 *
1799 ESCCU2 LDAB NEWROW
1800 CLR NEWROW
1801 SUBB #$20 ADJUST TO ROW ADDRESS
1802 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1803 BHI RETESC ELSE RETURN DOING NOTHING
1804 BRA NEWCUR GO SET NEW CURSOR IF SO
1805 *
1806 ****************** CLEAR FROM CURSOR TO END OF LINE
1807 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1808 BSR NEWCUR
1809 ESCCLL LDA COLADX
1810 LDB #$20 AND CLEAR CHAR
1811 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1812 INCA
1813 STA VDUCOL,X
1814 CMPA #LINLEN UNTIL END OF LINE
1815 BNE ESCCL1
1816 CLR ESCFLG
1817 RTS
1818 *
1819 *********************************** CARRIAGE RETURN
1820 *
1821 CRETN CLRA SET COLUMN ZERO
1822 POSCOL LDB ROWADX GET CURRENT ROW
1823 *
1824 *********** GENERATE NEW CURSOR POSITION AND RETURN
1825 *
1826 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1827 STA VDUCOL,X SET NEW COLUMN
1828 STB VDUROW,X SET NEW ROW
1829 RTS AND RETURN
1830 *
1831 ********************* UPDATE CURRENT COLUMN AND ROW
1832 *
1833 NEWCOL LDD COLADX GET ROW AND COLUMN
1834 INCA BUMP COLUMN
1835 CMPA #LINLEN ROLL?
1836 BNE NEWCUR BRANCH IF NOT
1837 CLRA ELSE RESET TO ZERO
1838 INCB AND BUMP ROW
1839 CMPB #NUMLIN
1840 BNE NEWCUR
1841 DECB BOTTOM ROW
1842 BSR NEWCUR
1843 *
1844 ********************************* SCROLL THE SCREEN
1845 *
1846 SCROLL LDB VDUOFF,X
1847 INCB
1848 CMPB #NUMLIN
1849 BLO SCROL1
1850 CLRB
1851 SCROL1 STB VDUOFF,X
1852 *
1853 **************** CLEAR FROM CURSOR TO END OF SCREEN
1854 *
1855 ESCCLS LDB COLADX GET CURSOR
1856 LDA #$20 GET A SPACE
1857 ESCCLS1 STB COLADX
1858 STB VDUCOL,X
1859 STA VDUCHR,X
1860 INCB
1861 CMPB #LINLEN
1862 BNE ESCCLS1
1863 *
1864 LDB ROWADX
1865 INCB
1866 CMPB #NUMLIN
1867 BEQ ESCCLS2
1868 STB ROWADX
1869 STB VDUROW,X
1870 CLRB
1871 BRA ESCCLS1
1872 *
1873 ESCCLS2 CLRB
1874 STB COLADX
1875 STB VDUCOL,X
1876 STB ESCFLG
1877 RTS
1878 ENDIF VDUOPT
1878 ENDIF VDUOPT
1879 *
1880 IFD DG640OPT
1881 ***************************************************
1882 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1883 * *
1884 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1885 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1886 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1887 * 16x64 BOARD). *
1888 ***************************************************
1889
1890 ***************************************************
1891 * INITIALIZE EMULATOR *
1892 ***************************************************
1893
1894 FCAF 8E 00 00 VINIZ LDX #0
1895 FCB2 BF DF EB STX COLADX AND ROWADX
1896 FCB5 BF DF EF STX NEWROW AND ESCFLG
1897 FCB8 8E E8 00 LDX #SCREEN POINT TO SCREEN
1898 FCBB BF DF ED STX CURSOR SET PROGRAM CURSOR
1899 FCBE 86 1B LDA #$1B SEND ESCAPE
1900 FCC0 8D 02 BSR VOUTCH
1901 FCC2 86 59 LDA #'Y CLEAR TO END OF SCREEN
1902 *
1903 ** VIDEO OUTPUT ROUTINE
1904 *
1905 FCC4 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS
1906 *
1907 ** CLEAR CURSOR
1908 FCC6 BE DF ED LDX CURSOR
1909 FCC9 E6 84 LDB 0,X
1910 FCCB C4 7F ANDB #$7F
1911 FCCD E7 84 STB 0,X
1912 *
1913 ** CHECK FOR ESCAPE SEQUENCE
1914 FCCF 7D DF F0 TST ESCFLG ESCAPE ACTIVE?
1915 FCD2 27 04 BEQ SOROU1 BRANCH IF NOT
1916 FCD4 8D 5E BSR ESCAPE ELSE DO ESCAPE
1917 FCD6 20 10 BRA RETURN AND RETURN
1918 *
1919 ** CHECK FOR CONTROL CHARACTERS
1920 FCD8 81 20 SOROU1 CMPA #$20 CONTROL CODES?
1921 FCDA 24 04 BHS SOROU2
1922 FCDC 8D 15 BSR CONTRL BRANCH IF SO
1923 FCDE 20 08 BRA RETURN
1924 *
1925 ** OUTPUT TEXT CHARACTER
1926 FCE0 BE DF ED SOROU2 LDX CURSOR ELSE GET CURSOR
1927 FCE3 A7 84 STAA 0,X DISPLAY CHARACTER
1928 FCE5 17 00 E9 LBSR NEWCOL UPDATE COLUMN
1929 *
1930 ** DISPLAY CURSOR AND RETURN
1931 FCE8 BE DF ED RETURN LDX CURSOR AND DISPLAY IT
1932 FCEB E6 84 LDB ,X
1933 FCED CA 80 ORAB #$80 WITH REVID
1934 FCEF E7 84 STB ,X
1935 FCF1 35 96 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1936
1937 ***************************************************
1938 * CONTROL CODE HANDLERS *
1939 ***************************************************
1940
1941 FCF3 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1942 FCF5 10 27 00 27 LBEQ BACKSP
1943 FCF9 81 1B CMPA #$1B ESCAPE SEQUENCE?
1944 FCFB 10 27 00 52 LBEQ SETESC
1945 FCFF 81 0D CMPA #$D CTRL M - RETURN?
1946 FD01 10 27 00 B4 LBEQ CRETN
1947 FD05 81 0A CMPA #$0A CTRL J - LINE FEED
1948 FD07 26 4F BNE RETESC NONE OF THESE, RETURN
1949
1950 ***************************************** LINE FEED
1951
1952 FD09 FC DF EB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1953 FD0C 5C INCB BUMP ROW
1954 FD0D C1 10 CMPB #NUMLIN SCROLL TIME?
1955 FD0F 10 26 00 AA LBNE NEWCUR POSITION CURSOR IF NOT
1956 FD13 16 00 CC LBRA SCROLL ELSE SCROLL IT
1957
1958 ***************************************** LINE FEED
1959
1960 FD16 FC DF EB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1961 FD19 5D TSTB AT TOP OF SCREEN ?
1962 FD1A 27 3C BEQ RETESC Yes, Ignore
1963 FD1C 5A DECB No, Decrement ROW
1964 FD1D 16 00 9D LBRA NEWCUR POSITION CURSOR
1965
1966
1967 *********************************** BACK SPACE
1968
1969 FD20 B6 DF EB BACKSP LDA COLADX
1970 FD23 27 33 BEQ RETESC RETURN
1971 FD25 4A DECA
1972 FD26 16 00 91 LBRA POSCOL POSITION CURSOR
1973
1974 *********************************** CURSOR RIGHT
1975
1976 FD29 B6 DF EB CHRIGHT LDA COLADX
1977 FD2C 4C INCA
1978 FD2D 81 40 CMPA #LINLEN
1979 FD2F 27 27 BEQ RETESC
1980 FD31 16 00 86 LBRA POSCOL
1981
1982 ***************************************************
1983 * ESCAPE HANDLERS *
1984 ***************************************************
1985
1986 FD34 F6 DF F0 ESCAPE LDAB ESCFLG GET FLAG
1987 FD37 C1 3D CMPB #'= SETTING CURSOR?
1988 FD39 27 1E BEQ ESCCUR BRANCH IF SO
1989 FD3B 81 59 CMPA #'Y CLEAR TO END OF SCREEN?
1990 FD3D 10 27 00 B8 LBEQ ESCCLS
1991 FD41 81 54 CMPA #'T CLEAR TO END OF LINE?
1992 FD43 27 5D BEQ ESCCLL
1993 FD45 81 45 CMPA #'E INSERT LINE?
1994 FD47 27 3B BEQ ESCINL
1995 FD49 81 52 CMPA #'R DELETE LINE?
1996 FD4B 27 2C BEQ ESCDLL
1997 FD4D 81 3D CMPA #'= STARTING CURSOR SET?
1998 FD4F 26 04 BNE CLRESC BRANCH IF NOT
1999
2000 ***************************** START ESCAPE SEQUENCE
2001
2002 FD51 B7 DF F0 SETESC STAA ESCFLG ELSE START CURSORING
2003 FD54 39 RTS AND RETURN
2004
2005 FD55 7F DF F0 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
2006 FD58 39 RETESC RTS SO RETURN
2007
2008 ********************************* SET SCREEN CURSOR
2009
2010 FD59 7D DF EF ESCCUR TST NEWROW ROW SET?
2011 FD5C 26 04 BNE ESCCU1 BRANCH IF SO
2012 FD5E B7 DF EF STAA NEWROW ELSE SET NEW ROW
2013 FD61 39 RTS AND RETURN
2014
2015 FD62 7F DF F0 ESCCU1 CLR ESCFLG
2016 FD65 80 20 SUBA #$20 ADJUST COLUMN ADDRESS
2017 FD67 81 3F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
2018 FD69 22 ED BHI RETESC NOT OK, DO NOTHING
2019
2020 FD6B F6 DF EF ESCCU2 LDAB NEWROW
2021 FD6E 7F DF EF CLR NEWROW
2022 FD71 C0 20 SUBB #$20 ADJUST TO ROW ADDRESS
2023 FD73 C1 0F CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
2024 FD75 22 E1 BHI RETESC ELSE RETURN DOING NOTHING
2025 FD77 20 44 BRA NEWCUR GO SET NEW CURSOR IF SO
2026 *
2027 *************************** DELETE LINE FROM SCREEN
2028
2029 FD79 8D 3E ESCDLL BSR CRETN GO COL. ZERO
2030 FD7B F6 DF EC LDB ROWADX
2031 FD7E C1 0F CMPB #NUMLIN-1
2032 FD80 27 7A BEQ SCROL3
2033 FD82 20 61 BRA SCROL1 AND DELETE THIS LINE
2034
2035 *************************** INSERT LINE INTO SCREEN
2036
2037 FD84 8D 33 ESCINL BSR CRETN GO TO COL. ZERO
2038 FD86 F6 DF EC LDAB ROWADX
2039 FD89 C1 0F CMPB #NUMLIN-1
2040 FD8B 27 15 BEQ ESCCLL
2041 *
2042 ** SCROLL SCREEN DOWN FROM CURSOR
2043 *
2044 FD8D 8E EB C0 LDX #SCREEN+SCNLEN-LINLEN
2045 FD90 A6 82 ESCIN0 LDAA 0,-X
2046 FD92 A7 88 40 STAA LINLEN,X
2047 FD95 A6 89 04 00 LDA SCNLEN,X
2048 FD99 A7 89 04 40 STA SCNLEN+LINLEN,X
2049 FD9D BC DF ED CPX CURSOR
2050 FDA0 26 EE BNE ESCIN0
2051
2052 ****************** CLEAR FROM CURSOR TO END OF LINE
2053
2054 FDA2 B6 DF EB ESCCLL LDA COLADX GET CURRENT COLUMN
2055 FDA5 BE DF ED LDX CURSOR GET CURSOR
2056 FDA8 C6 20 LDB #$20 AND CLEAR CHAR
2057 FDAA E7 89 04 00 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
2058 FDAE E7 80 STB ,X+ CLEAR TEXT
2059 FDB0 4C INCA
2060 FDB1 81 40 CMPA #LINLEN UNTIL END OF LINE
2061 FDB3 26 F5 BNE ESCLL1
2062 FDB5 7F DF F0 CLR ESCFLG
2063 FDB8 39 RTS
2064
2065 *********************************** CARRIAGE RETURN
2066
2067 FDB9 4F CRETN CLRA SET COLUMN ZERO
2068 FDBA F6 DF EC POSCOL LDB ROWADX GET CURRENT ROW
2069
2070 *********** GENERATE NEW CURSOR POSITION AND RETURN
2071
2072 FDBD FD DF EB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
2073 FDC0 86 40 LDA #LINLEN ELSE ADD A LINE
2074 FDC2 3D MUL LINLEN * ROWADX
2075 FDC3 FB DF EB ADDB COLADX
2076 FDC6 89 00 ADCA #0
2077 FDC8 C3 E8 00 ADDD #SCREEN ADD SCREEN BASE.
2078 FDCB FD DF ED STD CURSOR SAVE NEW CURSOR
2079 FDCE 1F 01 TFR D,X GET CURSOR IN X
2080 FDD0 39 RTS AND RETURN
2081
2082 ********************* UPDATE CURRENT COLUMN AND ROW
2083
2084 FDD1 FC DF EB NEWCOL LDD COLADX GET ROW AND COLUMN
2085 FDD4 4C INCA BUMP COLUMN
2086 FDD5 81 40 CMPA #LINLEN ROLL?
2087 FDD7 26 E4 BNE NEWCUR BRANCH IF NOT
2088 FDD9 4F CLRA ELSE RESET TO ZERO
2089 FDDA 5C INCB AND BUMP ROW
2090 FDDB C1 10 CMPB #NUMLIN
2091 FDDD 26 DE BNE NEWCUR
2092 FDDF 5A DECB BOTTOM ROW
2093 FDE0 8D DB BSR NEWCUR
2094
2095 ********************************* SCROLL THE SCREEN
2096
2097 FDE2 8E E8 00 SCROLL LDX #SCREEN POINT TO SCREEN
2098 FDE5 A6 89 04 40 SCROL1 LDA SCNLEN+LINLEN,X
2099 FDE9 A7 89 04 00 STA SCNLEN,X
2100 FDED A6 88 40 LDAA LINLEN,X MOVE TWO BYTES
2101 FDF0 A7 80 STAA 0,X+ UP ONE LINE
2102 FDF2 8C EB C0 CMPX #SCREEN+SCNLEN-LINLEN
2103 FDF5 26 EE BNE SCROL1 LOOP UNTIL DONE
2104 FDF7 20 03 BRA SCROL3
2105
2106 **************** CLEAR FROM CURSOR TO END OF SCREEN
2107
2108 FDF9 BE DF ED ESCCLS LDX CURSOR GET CURSOR
2109 FDFC 86 20 SCROL3 LDAA #$20 GET A SPACE
2110 FDFE A7 89 04 00 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
2111 FE02 A7 80 STA ,X+ AND TEXT
2112 FE04 8C EC 00 CMPX #SCREEN+SCNLEN
2113 FE07 26 F5 BNE SCROL2 UNTIL DONE
2114 FE09 7F DF F0 CLR ESCFLG
2115 FE0C 39 RTS
2116 ENDIF DG640OPT
2117 *
2118 IFD PRTOPT
2119 *************************************
2120 *
2121 ** PRINTER DRIVER ROUTINES
2122 *
2123 *************************************
2124 *
2125 ** PINIZ - INITIATE PRINTER PORT
2126 *
2127 FE0D 34 04 PINIZ PSHS B
2128 FE0F CC 0C 04 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
2129 FE12 FD E4 04 STD PADATA SET DDR AND SELECT DATA
2130 *
2131 ** RESET PRINTER
2132 FE15 C6 04 LDB #PRESET
2133 FE17 F7 E4 04 STAB PADATA
2134 FE1A 5C RESTLP INCB DELAY FOR RESET
2135 FE1B 26 FD BNE RESTLP
2136 FE1D B7 E4 04 STAA PADATA ACCA=DIRMSK
2137 *
2138 ** INITALIZE PORT B (DATA PORT)
2139 FE20 86 2A LDAA #$2A
2140 FE22 B7 E4 07 STAA PBCTRL
2141 FE25 CC FF 2E LDD #$FF2E ACCA=$FF ACCB =%00101110
2142 FE28 FD E4 06 STD PBDATA PBDREG PBCTRL
2143 *
2144 ** SELECT 66 LINES/PAGE
2145 FE2B 86 1B LDAA #$1B
2146 FE2D 8D 08 BSR POUTCH
2147 FE2F 86 43 LDAA #'C
2148 FE31 8D 04 BSR POUTCH
2149 FE33 86 42 LDAA #66
2150 FE35 35 04 PULS B
2151 *************************************
2152 *
2153 ** OUTPUT A CHARACTER TO THE PRINTER
2154 *
2155 *************************************
2156 FE37 34 04 POUTCH PSHS B
2157 FE39 F6 E4 06 LDAB PBDATA CLEAR INTERRUPT BIT
2158 *
2159 ** WAIT TILL NOT BUSY
2160 FE3C F6 E4 04 BUSYLP LDAB PADATA
2161 FE3F C5 10 BITB #PERROR
2162 FE41 27 06 BEQ PEXIT
2163 FE43 5D TSTB
2164 FE44 2B F6 BMI BUSYLP
2165 *
2166 ** NOW OUTPUT CHARACTER
2167 FE46 B7 E4 06 STAA PBDATA
2168 FE49 35 84 PEXIT PULS B,PC
2169 *************************************
2170 *
2171 ** PCHK TEST IFD PRINTER READY
2172 *
2173 *************************************
2174 FE4B 7D E4 07 PCHK TST PBCTRL TEST STATE OF CRB7
2175 FE4E 39 RTS SET ON ACKNOWLEDGE
2176 ENDIF PRTOPT
2177 *************************************
2178 *
2179 * MONITOR KEYBOARD COMMAND JUMP TABLE
2180 *
2181 *************************************
2182 *
2183 FE4F JMPTAB EQU *
2184 FE4F 01 FCB 1 " ^A "
2185 FE50 FB 3D FDB ALTRA
2186 FE52 02 FCB 2 " ^B "
2187 FE53 FB 32 FDB ALTRB
2188 FE55 03 FCB 3 " ^C "
2189 FE56 FB 48 FDB ALTRCC
2190 FE58 04 FCB 4 " ^D "
2191 FE59 FB 27 FDB ALTRDP
2192 FE5B 10 FCB $10 " ^P "
2193 FE5C FA FA FDB ALTRPC
2194 FE5E 15 FCB $15 " ^U "
2195 FE5F FB 06 FDB ALTRU
2196 FE61 18 FCB $18 " ^X "
2197 FE62 FB 1C FDB ALTRX
2198 FE64 19 FCB $19 " ^Y "
2199 FE65 FB 11 FDB ALTRY
2200 *
2201 FE67 42 FCC 'B'
2202 FE68 F9 51 FDB BRKPNT
2203 FE6A 45 FCC 'E'
2204 FE6B F8 F2 FDB MEMDUMP
2205 FE6D 47 FCC 'G'
2206 FE6E F8 9A FDB GO
2207 FE70 4C FCC 'L'
2208 FE71 FA 27 FDB LOAD
2209 FE73 50 FCC 'P'
2210 FE74 FA 85 FDB PUNCH
2211 FE76 4D FCC 'M'
2212 FE77 F8 9D FDB MEMCHG
2213 FE79 52 FCC 'R'
2214 FE7A FB B6 FDB REGSTR
2215 FE7C 53 FCC 'S'
2216 FE7D F8 E6 FDB DISSTK
2217 FE7F 58 FCC 'X'
2218 FE80 F9 7D FDB XBKPNT
2219 IFD MFDCOPT
2220 FE82 44 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
2221 FE83 F9 CA FDB MINBOOT
2222 ENDIF MFDCOPT
2223 IFD CFOPT
2224 FCC 'D' *** FPGA USES 'D' FOR CFBOOT
2225 FDB CFBOOT
2226 ENDIF CFOPT
2226 ENDIF CFOPT
2227 IFD DMAFOPT
2228 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
2229 FDB DBOOT
2230 ELSE
2231 FE85 55 FCC 'U' *** IF NOT DMAF2, 'U' IS FOR USER
2232 FE86 FC 5B FDB EXTEND
2233 ENDIF DMAFOPT
2234 IFD RTCOPT
2235 FCC 'T'
2236 FDB TIMSET
2237 ENDIF RTCOPT
2237 ENDIF RTCOPT
2238 IFD TRAOPT
2239 FCC "T"
2240 FDB TRACE
2241 ENDIF TRAOPT
2241 ENDIF TRAOPT
2242 *
2243 FE88 TABEND EQU *
2244 *
2245 * ** 6809 VECTOR ADDRESSES **
2246 *
2247 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
2248 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
2249 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
2250 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
2251 * HIS OWN ROUTINES IF HE SO DESIRES.
2252 *
2253 *
2254 FE88 F9 89 RAMVEC FDB SWIE USER-V
2255 FE8A F8 9C FDB RTI SWI3-V
2256 FE8C F8 9C FDB RTI SWI2-V
2257 FE8E F8 9C FDB RTI FIRQ-V
2258 FE90 F8 9C FDB RTI IRQ-V
2259 FE92 F9 89 FDB SWIE SWI-V
2260 FE94 FF FF FDB $FFFF SVC-VO
2261 FE96 FF FF FDB $FFFF SVC-VL
2262 *
2263 * PRINTABLE MESSAGE STRINGS
2264 *
2265 FE98 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2266 FE9D 53 59 53 30 39 42 FCC 'SYS09BUG 1.3 FOR '
55 47 20 31 2E 33
20 46 4F 52 20
2084 IFD FPGAOPT`
2085 FCC 'FPGA '
2086 ENDIF FPGAOPT
2086 ENDIF FPGAOPT
2087 IFD ADSOPT
2088 FEAE 41 44 53 36 38 30 FCC 'ADS6809 '
2267 IFD S3EOPT
2268 FCC 'S3E '
2269 ENDIF S3EOPT
2269 ENDIF S3EOPT
2270 IFD FPGAOPT
2271 FCC 'FPGA '
2272 ENDIF FPGAOPT
2272 ENDIF FPGAOPT
2273 IFD ADSOPT
2274 FEAE 41 44 53 36 38 30 FCC 'ADS6809 '
39 20
2089 ENDIF ADSOPT
2090 IFD SWTPOPT`
2091 FCC 'SWTPC '
2092 ENDIF SWTPOPT
2092 ENDIF SWTPOPT
2093 FEB6 20 2D 20 FCC ' - '
2094 FEB9 04 FCB 4
2095 FEBA 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
2275 ENDIF ADSOPT
2276 IFD SWTPOPT`
2277 FCC 'SWTPC '
2278 ENDIF SWTPOPT
2278 ENDIF SWTPOPT
2279 FEB6 20 2D 20 FCC ' - '
2280 FEB9 04 FCB 4
2281 FEBA 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2096 FEC1 3E MSG3 FCC '>'
2097 FEC2 04 FCB 4
2098 FEC3 57 48 41 54 3F MSG4 FCC 'WHAT?'
2099 FEC8 04 FCB 4
2100 FEC9 20 2D 20 MSG5 FCC ' - '
2101 FECC 04 FCB 4'
2102 FECD 20 20 53 50 3D MSG10 FCC ' SP='
2103 FED2 04 FCB 4
2104 FED3 20 20 50 43 3D MSG11 FCC ' PC='
2105 FED8 04 FCB 4
2106 FED9 20 20 55 53 3D MSG12 FCC ' US='
2107 FEDE 04 FCB 4
2108 FEDF 20 20 49 59 3D MSG13 FCC ' IY='
2109 FEE4 04 FCB 4
2110 FEE5 20 20 49 58 3D MSG14 FCC ' IX='
2111 FEEA 04 FCB 4
2112 FEEB 20 20 44 50 3D MSG15 FCC ' DP='
2113 FEF0 04 FCB 4
2114 FEF1 20 20 41 3D MSG16 FCC ' A='
2115 FEF5 04 FCB 4
2116 FEF6 20 20 42 3D MSG17 FCC ' B='
2117 FEFA 04 FCB 4
2118 FEFB 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2119 FF01 04 FCB 4
2120 FF02 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
2282 FEC1 3E MSG3 FCC '>'
2283 FEC2 04 FCB 4
2284 FEC3 57 48 41 54 3F MSG4 FCC 'WHAT?'
2285 FEC8 04 FCB 4
2286 FEC9 20 2D 20 MSG5 FCC ' - '
2287 FECC 04 FCB 4'
2288 FECD 20 20 53 50 3D MSG10 FCC ' SP='
2289 FED2 04 FCB 4
2290 FED3 20 20 50 43 3D MSG11 FCC ' PC='
2291 FED8 04 FCB 4
2292 FED9 20 20 55 53 3D MSG12 FCC ' US='
2293 FEDE 04 FCB 4
2294 FEDF 20 20 49 59 3D MSG13 FCC ' IY='
2295 FEE4 04 FCB 4
2296 FEE5 20 20 49 58 3D MSG14 FCC ' IX='
2297 FEEA 04 FCB 4
2298 FEEB 20 20 44 50 3D MSG15 FCC ' DP='
2299 FEF0 04 FCB 4
2300 FEF1 20 20 41 3D MSG16 FCC ' A='
2301 FEF5 04 FCB 4
2302 FEF6 20 20 42 3D MSG17 FCC ' B='
2303 FEFA 04 FCB 4
2304 FEFB 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2305 FF01 04 FCB 4
2306 FF02 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2121 FF0A 53 31 MSG20 FCC 'S1'
2122 FF0C 04 FCB 4
2123 IFD DATOPT
2124 *
2125 * POWER UP/ RESET/ NMI ENTRY POINT
2126 *
2127 ORG $FF00
2128 *
2129 *
2130 START LDX #IC11 POINT TO DAT RAM IC11
2131 LDA #$F GET COMPLIMENT OF ZERO
2132 *
2133 *
2134 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2135 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2136 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2137 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2138 * STORED IN IT.
2139 *
2140 *
2141 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2142 DECA GET COMP. VALUE FOR NEXT LOCATION
2143 BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2144 *
2145 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2146 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2147 * PHYSICAL ADDRESSES.
2148 *
2149 LDA #$F0
2150 STA ,X STORE $F0 AT $FFFF
2151 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2152 LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2153 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2154 STY ,X STORE TEST PATTERN AT $D0A0
2155 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2156 BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2157 LEAX -$1000,X ELSE POINT 4K LOWER
2158 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2159 BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2160 BRA START ELSE START ALL OVER AGAIN
2161 *
2162 *
2163 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2164 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2165 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2166 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2167 * IS STORED IN RAM IN THE LOCATION THAT IS
2168 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2169 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2170 * WHEN TESTING LOCATION $70A0, MEANING THERE
2171 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2172 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2173 * "7" IN THE $70A0 WILL BE STORED IN
2174 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2175 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2176 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2177 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2178 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2179 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2180 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2181 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2182 * OF RAM RESPONDS.
2183 *
2184 *
2185 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2186 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2187 COMA COMPLEMENT MSB OF THAT ADDRESS
2188 LSRA PUT MS 4 BITS OF ADDRESS IN
2189 LSRA LOCATION D0-D3 TO ALLOW STORING
2190 LSRA IT IN THE DYNAMIC ADDRESS
2191 LSRA TRANSLATION RAM.
2192 STA $FFFD STORE XLATION FACTOR IN DAT "D"
2193 *
2194 LDS #STACK INITIALIZE STACK POINTER
2195 *
2196 *
2197 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2198 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2199 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2200 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2201 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2202 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2203 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2204 *
2205 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2206 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2207 *
2208 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2209 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2210 *
2211 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2212 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2213 *
2214 *
2215 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2216 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2217 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2218 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2219 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2220 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2221 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2222 * MEMORY ADDRESSED AS FOLLOWS....
2223 *
2224 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2225 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2226 *
2227 *
2228 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2229 STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2230 CLR 14,Y CLEAR $DFDE
2231 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2232 STA 15,Y STORE AT $DFDF
2233 LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2234 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2235 DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2236 BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2237 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2238 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2239 BEQ FINTAB SKIP IF FINISHED
2240 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2241 LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2242 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2243 CMPY ,X VERIFY RAM AT TEST LOCATION
2244 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2245 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2246 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2247 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2248 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2249 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2250 LSRA
2251 LSRA
2252 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2253 EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2254 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2255 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2256 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2257 LDY #LRARAM POINT TO LRARAM TABLE
2258 STA 14,Y STORE $F1 AT $DFCE
2259 *
2260 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2261 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2262 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2263 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2264 *
2265 *
2266 LDA #$0C PRESET NUMBER HEX "C"
2267 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2268 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2269 DECA ELSE POINT 4K LOWER
2270 BPL FINDC GO TRY AGAIN
2271 BRA XFERTF
2272 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2273 STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2274 *
2275 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2276 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2277 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2278 * ADDRESSES FROM $0000 AND UP....
2279 *
2280 CLRA START AT ZERO
2281 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2282 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2283 BEQ PNTNXT IF IT'S ZER0 SKIP
2284 CLR A,Y ELSE ERASE FROM TABLE
2285 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2286 PNTNXT INCA GET OFFSET TO NEXT ENTRY
2287 CMPA #$0C LAST ENTRY YET ?
2288 BLT COMPRS
2289 *
2290 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2291 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2292 * THE MP-09 CPU CARD.
2293 *
2294 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2295 LDB #$10 GET NO. OF BYTES TO MOVE
2296 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2297 STA ,X+ POKE XLATION FACTOR IN IC11
2298 DECB SUB 1 FROM BYTES TO MOVE
2299 BNE FETCH CONTINUE UNTIL 16 MOVED
2300 *
2301 ELSE
2302 FF0D 39 LRA RTS
2303 FF0E 10 CE DF C0 START LDS #STACK INITIALIZE STACK POINTER
2304 FF12 5F CLRB
2305 ENDIF DATOPT
2306 *
2307 FF13 53 COMB SET "B" NON-ZERO
2308 FF14 F7 DF D2 STB ECHO TURN ON ECHO FLAG
2309 FF17 16 F9 08 LBRA MONITOR INITIALIZATION IS COMPLETE
2307 FF0A 53 31 MSG20 FCC 'S1'
2308 FF0C 04 FCB 4
2309 IFD DATOPT
2310 *
2311 ** INTERRUPT JUMP VECTORS
2312 *
2313 FF1A 6E 9F DF C0 V1 JMP [STACK]
2314 FF1E 6E 9F DF C4 V2 JMP [SWI2]
2315 FF22 6E 9F DF C6 V3 JMP [FIRQ]
2316 FF26 6E 9F DF C8 V4 JMP [IRQ]
2317 FF2A 6E 9F DF CA V5 JMP [SWI]
2311 * POWER UP/ RESET/ NMI ENTRY POINT
2312 *
2313 ORG $FF00
2314 *
2315 *
2316 START LDX #IC11 POINT TO DAT RAM IC11
2317 LDA #$F GET COMPLIMENT OF ZERO
2318 *
2319 * SWI3 ENTRY POINT
2320 *
2321 FF2E 1F 43 SWI3E TFR S,U
2322 FF30 AE 4A LDX 10,U *$FFC8
2323 FF32 E6 80 LDB ,X+
2324 FF34 AF 4A STX 10,U
2325 FF36 4F CLRA
2326 FF37 58 ASLB
2327 FF38 49 ROLA
2328 FF39 BE DF CC LDX SVCVO
2329 FF3C 8C FF FF CMPX #$FFFF
2330 FF3F 27 0F BEQ SWI3Z
2331 FF41 30 8B LEAX D,X
2332 FF43 BC DF CE CMPX SVCVL
2333 FF46 22 08 BHI SWI3Z
2334 FF48 34 10 PSHS X
2335 FF4A EC C4 LDD ,U
2336 FF4C AE 44 LDX 4,U
2337 FF4E 6E F1 JMP [,S++]
2338 FF50 37 1F SWI3Z PULU A,B,X,CC,DP
2339 FF52 EE 42 LDU 2,U
2340 FF54 6E 9F DF C2 JMP [SWI3]
2341 *
2342 * 6809 VECTORS
2343 *
2344 FFF0 ORG $FFF0
2345 FFF0 FF 1A FDB V1 USER-V
2346 FFF2 FF 2E FDB SWI3E SWI3-V
2347 FFF4 FF 1E FDB V2 SWI2-V
2348 FFF6 FF 22 FDB V3 FIRQ-V
2349 FFF8 FF 26 FDB V4 IRQ-V
2350 FFFA FF 2A FDB V5 SWI-V
2351 FFFC FF 1A FDB V1 NMI-V
2352 FFFE FF 0E FDB START RESTART-V
2353 END START
2319 *
2320 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2321 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2322 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2323 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2324 * STORED IN IT.
2325 *
2326 *
2327 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2328 DECA GET COMP. VALUE FOR NEXT LOCATION
2329 BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2330 *
2331 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2332 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2333 * PHYSICAL ADDRESSES.
2334 *
2335 LDA #$F0
2336 STA ,X STORE $F0 AT $FFFF
2337 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2338 LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2339 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2340 STY ,X STORE TEST PATTERN AT $D0A0
2341 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2342 BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2343 LEAX -$1000,X ELSE POINT 4K LOWER
2344 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2345 BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2346 BRA START ELSE START ALL OVER AGAIN
2347 *
2348 *
2349 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2350 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2351 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2352 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2353 * IS STORED IN RAM IN THE LOCATION THAT IS
2354 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2355 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2356 * WHEN TESTING LOCATION $70A0, MEANING THERE
2357 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2358 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2359 * "7" IN THE $70A0 WILL BE STORED IN
2360 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2361 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2362 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2363 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2364 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2365 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2366 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2367 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2368 * OF RAM RESPONDS.
2369 *
2370 *
2371 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2372 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2373 COMA COMPLEMENT MSB OF THAT ADDRESS
2374 LSRA PUT MS 4 BITS OF ADDRESS IN
2375 LSRA LOCATION D0-D3 TO ALLOW STORING
2376 LSRA IT IN THE DYNAMIC ADDRESS
2377 LSRA TRANSLATION RAM.
2378 STA $FFFD STORE XLATION FACTOR IN DAT "D"
2379 *
2380 LDS #STACK INITIALIZE STACK POINTER
2381 *
2382 *
2383 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2384 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2385 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2386 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2387 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2388 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2389 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2390 *
2391 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2392 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2393 *
2394 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2395 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2396 *
2397 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2398 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2399 *
2400 *
2401 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2402 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2403 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2404 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2405 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2406 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2407 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2408 * MEMORY ADDRESSED AS FOLLOWS....
2409 *
2410 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2411 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2412 *
2413 *
2414 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2415 STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2416 CLR 14,Y CLEAR $DFDE
2417 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2418 STA 15,Y STORE AT $DFDF
2419 LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2420 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2421 DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2422 BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2423 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2424 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2425 BEQ FINTAB SKIP IF FINISHED
2426 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2427 LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2428 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2429 CMPY ,X VERIFY RAM AT TEST LOCATION
2430 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2431 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2432 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2433 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2434 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2435 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2436 LSRA
2437 LSRA
2438 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2439 EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2440 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2441 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2442 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2443 LDY #LRARAM POINT TO LRARAM TABLE
2444 STA 14,Y STORE $F1 AT $DFCE
2445 *
2446 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2447 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2448 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2449 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2450 *
2451 *
2452 LDA #$0C PRESET NUMBER HEX "C"
2453 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2454 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2455 DECA ELSE POINT 4K LOWER
2456 BPL FINDC GO TRY AGAIN
2457 BRA XFERTF
2458 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2459 STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2460 *
2461 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2462 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2463 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2464 * ADDRESSES FROM $0000 AND UP....
2465 *
2466 CLRA START AT ZERO
2467 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2468 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2469 BEQ PNTNXT IF IT'S ZER0 SKIP
2470 CLR A,Y ELSE ERASE FROM TABLE
2471 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2472 PNTNXT INCA GET OFFSET TO NEXT ENTRY
2473 CMPA #$0C LAST ENTRY YET ?
2474 BLT COMPRS
2475 *
2476 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2477 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2478 * THE MP-09 CPU CARD.
2479 *
2480 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2481 LDB #$10 GET NO. OF BYTES TO MOVE
2482 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2483 STA ,X+ POKE XLATION FACTOR IN IC11
2484 DECB SUB 1 FROM BYTES TO MOVE
2485 BNE FETCH CONTINUE UNTIL 16 MOVED
2486 *
2487 ELSE
2488 FF0D 39 LRA RTS
2489 FF0E 10 CE DF C0 START LDS #STACK INITIALIZE STACK POINTER
2490 FF12 5F CLRB
2491 ENDIF DATOPT
2492 *
2493 FF13 53 COMB SET "B" NON-ZERO
2494 FF14 F7 DF D2 STB ECHO TURN ON ECHO FLAG
2495 FF17 16 F9 08 LBRA MONITOR INITIALIZATION IS COMPLETE
2496 *
2497 ** INTERRUPT JUMP VECTORS
2498 *
2499 FF1A 6E 9F DF C0 V1 JMP [STACK]
2500 FF1E 6E 9F DF C4 V2 JMP [SWI2]
2501 FF22 6E 9F DF C6 V3 JMP [FIRQ]
2502 FF26 6E 9F DF C8 V4 JMP [IRQ]
2503 FF2A 6E 9F DF CA V5 JMP [SWI]
2504 *
2505 * SWI3 ENTRY POINT
2506 *
2507 FF2E 1F 43 SWI3E TFR S,U
2508 FF30 AE 4A LDX 10,U *$FFC8
2509 FF32 E6 80 LDB ,X+
2510 FF34 AF 4A STX 10,U
2511 FF36 4F CLRA
2512 FF37 58 ASLB
2513 FF38 49 ROLA
2514 FF39 BE DF CC LDX SVCVO
2515 FF3C 8C FF FF CMPX #$FFFF
2516 FF3F 27 0F BEQ SWI3Z
2517 FF41 30 8B LEAX D,X
2518 FF43 BC DF CE CMPX SVCVL
2519 FF46 22 08 BHI SWI3Z
2520 FF48 34 10 PSHS X
2521 FF4A EC C4 LDD ,U
2522 FF4C AE 44 LDX 4,U
2523 FF4E 6E F1 JMP [,S++]
2524 FF50 37 1F SWI3Z PULU A,B,X,CC,DP
2525 FF52 EE 42 LDU 2,U
2526 FF54 6E 9F DF C2 JMP [SWI3]
2527 *
2528 * 6809 VECTORS
2529 *
2530 FFF0 ORG $FFF0
2531 FFF0 FF 1A FDB V1 USER-V
2532 FFF2 FF 2E FDB SWI3E SWI3-V
2533 FFF4 FF 1E FDB V2 SWI2-V
2534 FFF6 FF 22 FDB V3 FIRQ-V
2535 FFF8 FF 26 FDB V4 IRQ-V
2536 FFFA FF 2A FDB V5 SWI-V
2537 FFFC FF 1A FDB V1 NMI-V
2538 FFFE FF 0E FDB START RESTART-V
2539 END START
Program + Init Data = 1896 bytes
Error count = 0

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.