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 |