SPI USB support + wait in SD code

This commit is contained in:
S0urceror
2020-12-23 14:26:20 +01:00
parent fc0792fba1
commit 22525e6668
40 changed files with 24491 additions and 33 deletions

View File

@@ -114,6 +114,22 @@ signal address: std_logic_vector(31 downto 0) :=x"00000000";
signal led_on_count : integer range 0 to 200;
-- reg 000 - read/write data
-- reg 001 - read status
-- bit 7 = block written
-- bit 6 = block read
-- bit 5 = block busy
-- bit 4 = init busy
-- reg 001 - write control
-- 0 - block_read
-- 1 - block_write
-- reg 002 - LBA0
-- reg 003 - LBA1
-- reg 004 - LBA2
begin
process(n_wr)
begin
@@ -142,8 +158,8 @@ begin
dataOut <=
dout when regAddr = "000"
else status when regAddr = "001"
else "00000000";
else status when regAddr = "001"
else "00000000";
process(n_wr)
begin
@@ -444,7 +460,7 @@ begin
bit_counter := 7;
state <= write_block_byte;
byte_counter := byte_counter - 1;
sd_write_flag <= not sd_write_flag;
sd_write_flag <= not sd_write_flag; -- now sd_write_flag = host_write_flag
end if;
end if;

49
Components/USB/ch376s.v Normal file
View File

@@ -0,0 +1,49 @@
module ch376s
(
// interface
input clk, // system clock
input rd,
input wr,
input reset,
input a0,
// SPI wires
output sck, // SCK
output sdcs, // SCS
output sdo, // MOSI
input sdi, // MISO
// data
input [7:0] din,
output [7:0] dout
);
wire _ready;
wire [7:0] _dout;
spi SPI_Master
(
// Control/Data Signals,
.clk(clk), // FPGA Clock
.reset (reset),
.ready (_ready),
// TX (MOSI) Signals
.din(din), // Byte to transmit on MOSI
.wr (wr), // Data Valid Pulse with i_TX_Byte
// RX (MISO) Signals
.dout(_dout), // Byte received on MISO
.rd (rd),
// SPI Interface
.sck(sck),
.sdi(sdi),
.sdo(sdo),
.sdcs (sdcs)
);
assign dout=rd ? (a0 ? {7'b0000000,_ready} : _dout) : 8'bXXXXXXXX;
endmodule

View File

@@ -0,0 +1,89 @@
// part of NeoGS project (c) 2007-2008 NedoPC
//
// SPI mode 0 8-bit master module
//
// short diagram for speed=0 (Fclk/Fspi=2, no rdy shown)
//
// clk: ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ (positive edges)
// counter: 00|00|00|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|00|00|00 // internal!
// sck: ___________/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\_______
// sdo: --------< do7 | do6 | do5 | do4 | do3 | do2 | do1 | do0 >-------
// sdi: --------< di7 | di6 | di5 | di4 | di3 | di2 | di1 | di0 >-------
// bsync: ________/`````\_________________________________________________
// start: _____/``\_______________________________________________________
// din: -----<IN>-------------------------------------------------------
// dout: old old old old old old old old old old old old old | new new new
//
// data on sdo must be latched by slave on rising sck edge. data on sdo changes on falling edge of sck
//
// data from sdi is latched by master on positive edge of sck, while slave changes it on falling edge.
// WARNING: slave must emit valid di7 bit BEFORE first pulse on sck!
//
// start is synchronous pulse, which starts all transfer and also latches din data on the same clk edge
// as it is registered high. start can be given anytime (only when speed=0),
// so it is functioning then as synchronous reset. when speed!=0, there is global enable for majority of
// flipflops in the module, so start can't be accepted at any time
//
// dout updates with freshly received data at the clk edge in which sck goes high for the last time, thus
// latching last bit on sdi.
//
// sdo emits last bit shifted out after the transfer end
module spi
(
// interface
input clk, // system clock
input rd,
input wr,
input reset,
// SPI wires
output sck, // SCK
output sdcs, // SCS
output reg sdo, // MOSI
input sdi, // MISO
// data
input [7:0] din,
output reg [7:0] dout,
// output
output ready // start strobe, 1 clock length
);
reg [4:0] counter;
assign sck = counter[0];
assign sdcs = 1'b0; // slave always selected
assign ready = counter[4]; // 0 - transmission in progress
always @(posedge clk) begin
reg [7:0] shift;
if (reset) begin
counter[4] <= 5'b0;
end
else if (wr) begin
counter <= 5'b0;
sdo <= din[7];
shift[7:1] <= din[6:0];
end
else if (!ready) begin
counter <= counter + 5'd1;
// shift in (rising edge of SCK)
if (!sck) begin
shift[0] <= sdi;
if (&counter[3:1]) dout <= {shift[7:1], sdi};
end
// shift out (falling edge of sck)
if (sck) begin
sdo <= shift[7];
shift[7:1] <= shift[6:0]; // last bit remains after end of exchange
end
end
end
endmodule

View File

@@ -54,11 +54,16 @@ entity MicrocomputerZ80CPM is
ps2Clk : in std_logic;
ps2Data : in std_logic;
sdCS : out std_logic;
sdCS : out std_logic;
sdMOSI : out std_logic;
sdMISO : in std_logic;
sdSCLK : out std_logic;
driveLED : out std_logic :='1'
driveLED : out std_logic :='1';
usbCS : out std_logic;
usbMOSI : out std_logic;
usbMISO : in std_logic;
usbSCLK : out std_logic
);
end MicrocomputerZ80CPM;
@@ -75,6 +80,7 @@ architecture struct of MicrocomputerZ80CPM is
signal internalRam2DataOut : std_logic_vector(7 downto 0);
signal interface1DataOut : std_logic_vector(7 downto 0);
signal interface2DataOut : std_logic_vector(7 downto 0);
signal ch376sDataOut : std_logic_vector(7 downto 0);
signal sdCardDataOut : std_logic_vector(7 downto 0);
signal n_memWR : std_logic :='1';
@@ -95,6 +101,7 @@ architecture struct of MicrocomputerZ80CPM is
signal n_basRomCS : std_logic :='1';
signal n_interface1CS : std_logic :='1';
signal n_interface2CS : std_logic :='1';
signal n_ch376sCS : std_logic :='1';
signal n_sdCardCS : std_logic :='1';
signal serialClkCount : std_logic_vector(15 downto 0);
@@ -107,6 +114,28 @@ architecture struct of MicrocomputerZ80CPM is
--CPM
signal n_RomActive : std_logic := '0';
component ch376s is
port (
-- interface
clk : in std_logic;
rd : in std_logic;
wr : in std_logic;
reset : in std_logic;
a0 : in std_logic;
-- SPI wires
sck : out std_logic;
sdcs : out std_logic;
sdo : out std_logic; -- reg
sdi : in std_logic;
-- data
din : in std_logic_vector (7 downto 0);
dout : out std_logic_vector (7 downto 0) -- reg
);
end component;
begin
--CPM
-- Disable ROM if out 38. Re-enable when (asynchronous) reset pressed
@@ -234,6 +263,24 @@ port map(
clk => sdClock -- twice the spi clk
);
usb : ch376s
port map (
sdcs => usbCS,
sdo => usbMOSI,
sdi => usbMISO,
sck => usbSCLK,
wr => not (n_ch376sCS or n_ioWR),
rd => not (n_ch376sCS or n_ioRD),
dout => ch376sDataOut,
din => cpuDataOut,
a0 => cpuAddress (0),
reset => not N_RESET,
clk => sdClock
);
-- ____________________________________________________________________________________
-- MEMORY READ/WRITE LOGIC GOES HERE
@@ -250,6 +297,7 @@ n_memRD <= n_RD or n_MREQ;
n_basRomCS <= '0' when cpuAddress(15 downto 13) = "000" and n_RomActive = '0' else '1'; --8K at bottom of memory
n_interface1CS <= '0' when cpuAddress(7 downto 1) = "1000000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $80-$81
n_interface2CS <= '0' when cpuAddress(7 downto 1) = "1000001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $82-$83
n_ch376sCS <= '0' when cpuAddress(7 downto 1) = "0010000" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 2 Bytes $20-$21
n_sdCardCS <= '0' when cpuAddress(7 downto 3) = "10001" and (n_ioWR='0' or n_ioRD = '0') else '1'; -- 8 Bytes $88-$8F
n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
@@ -260,6 +308,7 @@ n_internalRam1CS <= not n_basRomCS; -- Full Internal RAM - 64 K
cpuDataIn <=
interface1DataOut when n_interface1CS = '0' else
interface2DataOut when n_interface2CS = '0' else
ch376sDataOut when n_ch376sCS = '0' else
sdCardDataOut when n_sdCardCS = '0' else
basRomData when n_basRomCS = '0' else
internalRam1DataOut when n_internalRam1CS= '0' else
@@ -272,6 +321,8 @@ x"FF";
-- SUB-CIRCUIT CLOCK SIGNALS
serialClock <= serialClkCount(15);
--sdClock <= clk;
process (clk)
begin
if rising_edge(clk) then
@@ -281,19 +332,20 @@ begin
else
cpuClkCount <= (others=>'0');
end if;
if cpuClkCount < 2 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
if cpuClkCount < 4 then -- 2 when 10MHz, 2 when 12.5MHz, 2 when 16.6MHz, 1 when 25MHz
cpuClock <= '0';
else
cpuClock <= '1';
end if;
if sdClkCount < 49 then -- 1MHz
if sdClkCount < 1 then -- 25MHz
sdClkCount <= sdClkCount + 1;
else
sdClkCount <= (others=>'0');
end if;
if sdClkCount < 25 then
if sdClkCount < 1 then -- 12,5Mhz
sdClock <= '0';
else
sdClock <= '1';

View File

@@ -70,7 +70,7 @@ set_global_assignment -name SEED 1
#set_global_assignment -name VERILOG_MACRO "USE_DDRAM=1"
#do not enable DEBUG_NOHDMI in release!
#set_global_assignment -name VERILOG_MACRO "DEBUG_NOHDMI=1"
# set_global_assignment -name VERILOG_MACRO "DEBUG_NOHDMI=1"
source sys/sys.tcl
set_global_assignment -name FAMILY "Cyclone V"
@@ -243,8 +243,6 @@ set_location_assignment PIN_W20 -to SW[3]
set_hps_location_assignment HPSINTERFACEPERIPHERALSPIMASTER_X52_Y72_N111 -to spi
set_hps_location_assignment HPSINTERFACEPERIPHERALUART_X52_Y67_N111 -to uart
set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:sys/build_id.tcl"
set_global_assignment -name CDF_FILE jtag.cdf
set_global_assignment -name QIP_FILE sys/sys.qip
source sys/sys_analog.tcl
set_location_assignment PIN_AF25 -to SDIO_DAT[0]
set_location_assignment PIN_AF23 -to SDIO_DAT[1]
@@ -295,6 +293,10 @@ set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED_*
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to BTN_*
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to BTN_*
set_global_assignment -name VERILOG_FILE Components/USB/spi_master_simple.v
set_global_assignment -name VERILOG_FILE Components/USB/ch376s.v
set_global_assignment -name CDF_FILE jtag.cdf
set_global_assignment -name QIP_FILE sys/sys.qip
set_global_assignment -name QIP_FILE rtl/pll.qip
set_global_assignment -name SYSTEMVERILOG_FILE MultiComp.sv
set_global_assignment -name VHDL_FILE Components/M6809/cpu09l.vhd
@@ -325,4 +327,5 @@ set_global_assignment -name QIP_FILE ROMS/Z80/Z80_CPM_BASIC_ROM.qip
set_global_assignment -name VHDL_FILE MicrocomputerZ80CPM.vhd
set_global_assignment -name VHDL_FILE Microcomputer6502Basic.vhd
set_global_assignment -name VHDL_FILE Microcomputer6809Basic.vhd
set_global_assignment -name VHDL_FILE MicrocomputerZ80Basic.vhd
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

Binary file not shown.

View File

@@ -159,7 +159,6 @@ module emu
);
assign ADC_BUS = 'Z;
assign USER_OUT = '1;
assign {SD_SCK, SD_MOSI, SD_CS} = 'Z;
assign {SDRAM_DQ, SDRAM_A, SDRAM_BA, SDRAM_CLK, SDRAM_CKE, SDRAM_DQML, SDRAM_DQMH, SDRAM_nWE, SDRAM_nCAS, SDRAM_nRAS, SDRAM_nCS} = 'Z;
assign {DDRAM_CLK, DDRAM_BURSTCNT, DDRAM_ADDR, DDRAM_DIN, DDRAM_BE, DDRAM_RD, DDRAM_WE} = 0;
@@ -176,13 +175,18 @@ assign VIDEO_ARX = 4;
assign VIDEO_ARY = 3;
assign VGA_SL = 0;
assign VGA_F1 = 0;
//assign CE_PIXEL=1;
assign AUDIO_S = 0;
assign AUDIO_L = 0;
assign AUDIO_R = 0;
assign AUDIO_MIX = 0;
// enable input on USER_IO[3] for ch376s MISO
//assign USER_OUT[0] = 1'b0;
//assign USER_OUT[1] = 1'b0;
//assign USER_OUT[3] = 1'b1;
//assign USER_OUT[6] = 1'b0;
`include "build_id.v"
localparam CONF_STR = {
"MultiComp;;",
@@ -351,27 +355,51 @@ begin
UART_TXD <= _txd[cpu_type];
end
reg [3:0] test;
always @(posedge clk_sys) begin
if (reset) begin
test <= 4'd0;
end
test <= test + 4'd1;
USER_OUT[0] <= test[0];
USER_OUT[1] <= test[0];
USER_OUT[2] <= test[0];
USER_OUT[3] <= test[1];
USER_OUT[4] <= test[2];
USER_OUT[5] <= test[3];
USER_OUT[6] <= test[3];
end
MicrocomputerZ80CPM MicrocomputerZ80CPM
(
.N_RESET(~reset & cpu_type == cpuZ80CPM),
.clk(cpu_type == cpuZ80CPM ? clk_sys : 0),
.R(_r[0][1:0]),
.G(_g[0][1:0]),
.B(_b[0][1:0]),
.HS(_hs[0]),
.VS(_vs[0]),
.hBlank(_hblank[0]),
.vBlank(_vblank[0]),
.cepix(_CE_PIXEL[0]),
.ps2Clk(PS2_CLK),
.ps2Data(PS2_DAT),
.sdCS(_SD_CS[0]),
.sdMOSI(_SD_MOSI[0]),
.sdMISO(sdmiso),
.sdSCLK(_SD_SCK[0]),
.driveLED(_driveLED[0]),
.rxd1 (UART_RXD),
.txd1 (_txd[0])
.N_RESET (~reset & cpu_type == cpuZ80CPM),
.clk (cpu_type == cpuZ80CPM ? clk_sys : 0),
.R (_r[0][1:0]),
.G (_g[0][1:0]),
.B (_b[0][1:0]),
.HS (_hs[0]),
.VS (_vs[0]),
.hBlank (_hblank[0]),
.vBlank (_vblank[0]),
.cepix (_CE_PIXEL[0]),
.ps2Clk (PS2_CLK),
.ps2Data (PS2_DAT),
.sdCS (_SD_CS[0]),
.sdMOSI (_SD_MOSI[0]),
.sdMISO (sdmiso),
.sdSCLK (_SD_SCK[0]),
.driveLED (_driveLED[0]),
.rxd1 (UART_RXD),
.txd1 (_txd[0]),
// CH376s via USERIO
//.usbSCLK (USER_OUT[2]),
//.usbMISO (USER_IN[3]),
//.usbMOSI (USER_OUT[4]),
//.usbCS (USER_OUT[5])
);
MicrocomputerZ80Basic MicrocomputerZ80Basic

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,579 @@
"TASM Z80 Assembler. "
/****************************************************************************
/* $Id: tasm80.tab 1.1 1993/07/31 01:12:40 toma Exp $
/****************************************************************************
/* This is the instruction set definition table
/* for the Z80 version of TASM.
/* Thomas N. Anderson, Speech Technology Incorporated
/* This table authored and submitted by Carl A. Wall, VE3APY.
/*
/* Class bits assigned as follows:
/* Bit-0 = Z80 (base instruction set)
/* Bit-1 = HD64180 (extended instructions)
/* See TASM manual for info on table structure.
/*
/*INSTR ARGS OP BYTES RULE CLASS SHIFT OR */
/*-------------------------------------------*/
ADC A,(HL) 8E 1 NOP 1
ADC A,(IX*) 8EDD 3 ZIX 1
ADC A,(IY*) 8EFD 3 ZIX 1
ADC A,A 8F 1 NOP 1
ADC A,B 88 1 NOP 1
ADC A,C 89 1 NOP 1
ADC A,D 8A 1 NOP 1
ADC A,E 8B 1 NOP 1
ADC A,H 8C 1 NOP 1
ADC A,L 8D 1 NOP 1
ADC A,* CE 2 NOP 1
ADC HL,BC 4AED 2 NOP 1
ADC HL,DE 5AED 2 NOP 1
ADC HL,HL 6AED 2 NOP 1
ADC HL,SP 7AED 2 NOP 1
ADD A,(HL) 86 1 NOP 1
ADD A,(IX*) 86DD 3 ZIX 1
ADD A,(IY*) 86FD 3 ZIX 1
ADD A,A 87 1 NOP 1
ADD A,B 80 1 NOP 1
ADD A,C 81 1 NOP 1
ADD A,D 82 1 NOP 1
ADD A,E 83 1 NOP 1
ADD A,H 84 1 NOP 1
ADD A,L 85 1 NOP 1
ADD A,* C6 2 NOP 1
ADD HL,BC 09 1 NOP 1
ADD HL,DE 19 1 NOP 1
ADD HL,HL 29 1 NOP 1
ADD HL,SP 39 1 NOP 1
ADD IX,BC 09DD 2 NOP 1
ADD IX,DE 19DD 2 NOP 1
ADD IX,IX 29DD 2 NOP 1
ADD IX,SP 39DD 2 NOP 1
ADD IY,BC 09FD 2 NOP 1
ADD IY,DE 19FD 2 NOP 1
ADD IY,IY 29FD 2 NOP 1
ADD IY,SP 39FD 2 NOP 1
AND (HL) A6 1 NOP 1
AND (IX*) A6DD 3 ZIX 1
AND (IY*) A6FD 3 ZIX 1
AND A A7 1 NOP 1
AND B A0 1 NOP 1
AND C A1 1 NOP 1
AND D A2 1 NOP 1
AND E A3 1 NOP 1
AND H A4 1 NOP 1
AND L A5 1 NOP 1
AND * E6 2 NOP 1
BIT *,(HL) 46CB 2 ZBIT 1
BIT *,(IX*) CBDD 4 ZBIT 1 0 4600
BIT *,(IY*) CBFD 4 ZBIT 1 0 4600
BIT *,A 47CB 2 ZBIT 1
BIT *,B 40CB 2 ZBIT 1
BIT *,C 41CB 2 ZBIT 1
BIT *,D 42CB 2 ZBIT 1
BIT *,E 43CB 2 ZBIT 1
BIT *,H 44CB 2 ZBIT 1
BIT *,L 45CB 2 ZBIT 1
CALL C,* DC 3 NOP 1
CALL M,* FC 3 NOP 1
CALL NC,* D4 3 NOP 1
CALL NZ,* C4 3 NOP 1
CALL P,* F4 3 NOP 1
CALL PE,* EC 3 NOP 1
CALL PO,* E4 3 NOP 1
CALL Z,* CC 3 NOP 1
CALL * CD 3 NOP 1
CCF "" 3F 1 NOP 1
CP (HL) BE 1 NOP 1
CP (IX*) BEDD 3 ZIX 1
CP (IY*) BEFD 3 ZIX 1
CP A BF 1 NOP 1
CP B B8 1 NOP 1
CP C B9 1 NOP 1
CP D BA 1 NOP 1
CP E BB 1 NOP 1
CP H BC 1 NOP 1
CP L BD 1 NOP 1
CP * FE 2 NOP 1
CPD "" A9ED 2 NOP 1
CPDR "" B9ED 2 NOP 1
CPIR "" B1ED 2 NOP 1
CPI "" A1ED 2 NOP 1
CPL "" 2F 1 NOP 1
DAA "" 27 1 NOP 1
DEC (HL) 35 1 NOP 1
DEC (IX*) 35DD 3 ZIX 1
DEC (IY*) 35FD 3 ZIX 1
DEC A 3D 1 NOP 1
DEC B 05 1 NOP 1
DEC BC 0B 1 NOP 1
DEC C 0D 1 NOP 1
DEC D 15 1 NOP 1
DEC DE 1B 1 NOP 1
DEC E 1D 1 NOP 1
DEC H 25 1 NOP 1
DEC HL 2B 1 NOP 1
DEC IX 2BDD 2 NOP 1
DEC IY 2BFD 2 NOP 1
DEC L 2D 1 NOP 1
DEC SP 3B 1 NOP 1
DI "" F3 1 NOP 1
DJNZ * 10 2 R1 1
EI "" FB 1 NOP 1
EX (SP),HL E3 1 NOP 1
EX (SP),IX E3DD 2 NOP 1
EX (SP),IY E3FD 2 NOP 1
EX AF,AF' 08 1 NOP 1
EX DE,HL EB 1 NOP 1
EXX "" D9 1 NOP 1
HALT "" 76 1 NOP 1
IM 0 46ED 2 NOP 1
IM 1 56ED 2 NOP 1
IM 2 5EED 2 NOP 1
IN A,(C) 78ED 2 NOP 1
IN B,(C) 40ED 2 NOP 1
IN C,(C) 48ED 2 NOP 1
IN D,(C) 50ED 2 NOP 1
IN E,(C) 58ED 2 NOP 1
IN H,(C) 60ED 2 NOP 1
IN L,(C) 68ED 2 NOP 1
IN A,(*) DB 2 NOP 1
IN0 A,(*) 38ED 3 NOP 2
IN0 B,(*) 00ED 3 NOP 2
IN0 C,(*) 08ED 3 NOP 2
IN0 D,(*) 10ED 3 NOP 2
IN0 E,(*) 18ED 3 NOP 2
IN0 H,(*) 20ED 3 NOP 2
IN0 L,(*) 28ED 3 NOP 2
INC (HL) 34 1 NOP 1
INC (IX*) 34DD 3 ZIX 1
INC (IY*) 34FD 3 ZIX 1
INC A 3C 1 NOP 1
INC B 04 1 NOP 1
INC BC 03 1 NOP 1
INC C 0C 1 NOP 1
INC D 14 1 NOP 1
INC DE 13 1 NOP 1
INC E 1C 1 NOP 1
INC H 24 1 NOP 1
INC HL 23 1 NOP 1
INC IX 23DD 2 NOP 1
INC IY 23FD 2 NOP 1
INC L 2C 1 NOP 1
INC SP 33 1 NOP 1
IND "" AAED 2 NOP 1
INDR "" BAED 2 NOP 1
INI "" A2ED 2 NOP 1
INIR "" B2ED 2 NOP 1
JP (HL) E9 1 NOP 1
JP (IX) E9DD 2 NOP 1
JP (IY) E9FD 2 NOP 1
JP C,* DA 3 NOP 1
JP M,* FA 3 NOP 1
JP NC,* D2 3 NOP 1
JP NZ,* C2 3 NOP 1
JP P,* F2 3 NOP 1
JP PE,* EA 3 NOP 1
JP PO,* E2 3 NOP 1
JP Z,* CA 3 NOP 1
JP * C3 3 NOP 1
JR C,* 38 2 R1 1
JR NC,* 30 2 R1 1
JR NZ,* 20 2 R1 1
JR Z,* 28 2 R1 1
JR * 18 2 R1 1
LD (BC),A 02 1 NOP 1
LD (DE),A 12 1 NOP 1
LD (HL),A 77 1 NOP 1
LD (HL),B 70 1 NOP 1
LD (HL),C 71 1 NOP 1
LD (HL),D 72 1 NOP 1
LD (HL),E 73 1 NOP 1
LD (HL),H 74 1 NOP 1
LD (HL),L 75 1 NOP 1
LD (HL),* 36 2 NOP 1
LD (IX*),A 77DD 3 ZIX 1
LD (IX*),B 70DD 3 ZIX 1
LD (IX*),C 71DD 3 ZIX 1
LD (IX*),D 72DD 3 ZIX 1
LD (IX*),E 73DD 3 ZIX 1
LD (IX*),H 74DD 3 ZIX 1
LD (IX*),L 75DD 3 ZIX 1
LD (IX*),* 36DD 4 ZIX 1
LD (IY*),A 77FD 3 ZIX 1
LD (IY*),B 70FD 3 ZIX 1
LD (IY*),C 71FD 3 ZIX 1
LD (IY*),D 72FD 3 ZIX 1
LD (IY*),E 73FD 3 ZIX 1
LD (IY*),H 74FD 3 ZIX 1
LD (IY*),L 75FD 3 ZIX 1
LD (IY*),* 36FD 4 ZIX 1
LD (*),A 32 3 NOP 1
LD (*),BC 43ED 4 NOP 1
LD (*),DE 53ED 4 NOP 1
LD (*),HL 22 3 NOP 1
LD (*),IX 22DD 4 NOP 1
LD (*),IY 22FD 4 NOP 1
LD (*),SP 73ED 4 NOP 1
LD A,(BC) 0A 1 NOP 1
LD A,(DE) 1A 1 NOP 1
LD A,(HL) 7E 1 NOP 1
LD A,(IX*) 7EDD 3 ZIX 1
LD A,(IY*) 7EFD 3 ZIX 1
LD A,A 7F 1 NOP 1
LD A,B 78 1 NOP 1
LD A,C 79 1 NOP 1
LD A,D 7A 1 NOP 1
LD A,E 7B 1 NOP 1
LD A,H 7C 1 NOP 1
LD A,I 57ED 2 NOP 1
LD A,L 7D 1 NOP 1
LD A,R 5FED 2 NOP 1
LD A,(*) 3A 3 NOP 1
LD A,* 3E 2 NOP 1
LD B,(HL) 46 1 NOP 1
LD B,(IX*) 46DD 3 ZIX 1
LD B,(IY*) 46FD 3 ZIX 1
LD B,A 47 1 NOP 1
LD B,B 40 1 NOP 1
LD B,C 41 1 NOP 1
LD B,D 42 1 NOP 1
LD B,E 43 1 NOP 1
LD B,H 44 1 NOP 1
LD B,L 45 1 NOP 1
LD B,* 06 2 NOP 1
LD BC,(*) 4BED 4 NOP 1
LD BC,* 01 3 NOP 1
LD C,(HL) 4E 1 NOP 1
LD C,(IX*) 4EDD 3 ZIX 1
LD C,(IY*) 4EFD 3 ZIX 1
LD C,A 4F 1 NOP 1
LD C,B 48 1 NOP 1
LD C,C 49 1 NOP 1
LD C,D 4A 1 NOP 1
LD C,E 4B 1 NOP 1
LD C,H 4C 1 NOP 1
LD C,L 4D 1 NOP 1
LD C,* 0E 2 NOP 1
LD D,(HL) 56 1 NOP 1
LD D,(IX*) 56DD 3 ZIX 1
LD D,(IY*) 56FD 3 ZIX 1
LD D,A 57 1 NOP 1
LD D,B 50 1 NOP 1
LD D,C 51 1 NOP 1
LD D,D 52 1 NOP 1
LD D,E 53 1 NOP 1
LD D,H 54 1 NOP 1
LD D,L 55 1 NOP 1
LD D,* 16 2 NOP 1
LD DE,(*) 5BED 4 NOP 1
LD DE,* 11 3 NOP 1
LD E,(HL) 5E 1 NOP 1
LD E,(IX*) 5EDD 3 ZIX 1
LD E,(IY*) 5EFD 3 ZIX 1
LD E,A 5F 1 NOP 1
LD E,B 58 1 NOP 1
LD E,C 59 1 NOP 1
LD E,D 5A 1 NOP 1
LD E,E 5B 1 NOP 1
LD E,H 5C 1 NOP 1
LD E,L 5D 1 NOP 1
LD E,* 1E 2 NOP 1
LD H,(HL) 66 1 NOP 1
LD H,(IX*) 66DD 3 ZIX 1
LD H,(IY*) 66FD 3 ZIX 1
LD H,A 67 1 NOP 1
LD H,B 60 1 NOP 1
LD H,C 61 1 NOP 1
LD H,D 62 1 NOP 1
LD H,E 63 1 NOP 1
LD H,H 64 1 NOP 1
LD H,L 65 1 NOP 1
LD H,* 26 2 NOP 1
LD HL,(*) 2A 3 NOP 1
LD HL,* 21 3 NOP 1
LD I,A 47ED 2 NOP 1
LD IX,(*) 2ADD 4 NOP 1
LD IX,* 21DD 4 NOP 1
LD IY,(*) 2AFD 4 NOP 1
LD IY,* 21FD 4 NOP 1
LD L,(HL) 6E 1 NOP 1
LD L,(IX*) 6EDD 3 ZIX 1
LD L,(IY*) 6EFD 3 ZIX 1
LD L,A 6F 1 NOP 1
LD L,B 68 1 NOP 1
LD L,C 69 1 NOP 1
LD L,D 6A 1 NOP 1
LD L,E 6B 1 NOP 1
LD L,H 6C 1 NOP 1
LD L,L 6D 1 NOP 1
LD L,* 2E 2 NOP 1
LD R,A 4FED 2 NOP 1
LD SP,(*) 7BED 4 NOP 1
LD SP,HL F9 1 NOP 1
LD SP,IX F9DD 2 NOP 1
LD SP,IY F9FD 2 NOP 1
LD SP,* 31 3 NOP 1
LDD "" A8ED 2 NOP 1
LDDR "" B8ED 2 NOP 1
LDI "" A0ED 2 NOP 1
LDIR "" B0ED 2 NOP 1
NEG "" 44ED 2 NOP 1
NOP "" 00 1 NOP 1
MLT BC 4CED 2 NOP 2
MLT DE 5CED 2 NOP 2
MLT HL 6CED 2 NOP 2
MLT SP 7CED 2 NOP 2
OR (HL) B6 1 NOP 1
OR (IX*) B6DD 3 ZIX 1
OR (IY*) B6FD 3 ZIX 1
OR A B7 1 NOP 1
OR B B0 1 NOP 1
OR C B1 1 NOP 1
OR D B2 1 NOP 1
OR E B3 1 NOP 1
OR H B4 1 NOP 1
OR L B5 1 NOP 1
OR * F6 2 NOP 1
OTDM "" 8BED 2 NOP 2
OTDMR "" 9BED 2 NOP 2
OTDR "" BBED 2 NOP 1
OTIM "" 83ED 2 NOP 2
OTIMR "" 93ED 2 NOP 2
OTIR "" B3ED 2 NOP 1
OUT (C),A 79ED 2 NOP 1
OUT (C),B 41ED 2 NOP 1
OUT (C),C 49ED 2 NOP 1
OUT (C),D 51ED 2 NOP 1
OUT (C),E 59ED 2 NOP 1
OUT (C),H 61ED 2 NOP 1
OUT (C),L 69ED 2 NOP 1
OUT (*),A D3 2 NOP 1
OUT0 (*),A 39ED 3 NOP 2
OUT0 (*),B 01ED 3 NOP 2
OUT0 (*),C 09ED 3 NOP 2
OUT0 (*),D 11ED 3 NOP 2
OUT0 (*),E 19ED 3 NOP 2
OUT0 (*),H 21ED 3 NOP 2
OUT0 (*),L 29ED 3 NOP 2
OUTD "" ABED 2 NOP 1
OUTI "" A3ED 2 NOP 1
POP AF F1 1 NOP 1
POP BC C1 1 NOP 1
POP DE D1 1 NOP 1
POP HL E1 1 NOP 1
POP IX E1DD 2 NOP 1
POP IY E1FD 2 NOP 1
PUSH AF F5 1 NOP 1
PUSH BC C5 1 NOP 1
PUSH DE D5 1 NOP 1
PUSH HL E5 1 NOP 1
PUSH IX E5DD 2 NOP 1
PUSH IY E5FD 2 NOP 1
RES *,(HL) 86CB 2 ZBIT 1
RES *,(IX*) CBDD 4 ZBIT 1 0 8600
RES *,(IY*) CBFD 4 ZBIT 1 0 8600
RES *,A 87CB 2 ZBIT 1
RES *,B 80CB 2 ZBIT 1
RES *,C 81CB 2 ZBIT 1
RES *,D 82CB 2 ZBIT 1
RES *,E 83CB 2 ZBIT 1
RES *,H 84CB 2 ZBIT 1
RES *,L 85CB 2 ZBIT 1
RET "" C9 1 NOP 1
RET C D8 1 NOP 1
RET M F8 1 NOP 1
RET NC D0 1 NOP 1
RET NZ C0 1 NOP 1
RET P F0 1 NOP 1
RET PE E8 1 NOP 1
RET PO E0 1 NOP 1
RET Z C8 1 NOP 1
RETI "" 4DED 2 NOP 1
RETN "" 45ED 2 NOP 1
RL (HL) 16CB 2 NOP 1
RL (IX*) CBDD 4 ZIX 1 0 1600
RL (IY*) CBFD 4 ZIX 1 0 1600
RL A 17CB 2 NOP 1
RL B 10CB 2 NOP 1
RL C 11CB 2 NOP 1
RL D 12CB 2 NOP 1
RL E 13CB 2 NOP 1
RL H 14CB 2 NOP 1
RL L 15CB 2 NOP 1
RLA "" 17 1 NOP 1
RLC (HL) 06CB 2 NOP 1
RLC (IX*) CBDD 4 ZIX 1 0 0600
RLC (IY*) CBFD 4 ZIX 1 0 0600
RLC A 07CB 2 NOP 1
RLC B 00CB 2 NOP 1
RLC C 01CB 2 NOP 1
RLC D 02CB 2 NOP 1
RLC E 03CB 2 NOP 1
RLC H 04CB 2 NOP 1
RLC L 05CB 2 NOP 1
RLCA "" 07 1 NOP 1
RLD "" 6FED 2 NOP 1
RR (HL) 1ECB 2 NOP 1
RR (IX*) CBDD 4 ZIX 1 0 1E00
RR (IY*) CBFD 4 ZIX 1 0 1E00
RR A 1FCB 2 NOP 1
RR B 18CB 2 NOP 1
RR C 19CB 2 NOP 1
RR D 1ACB 2 NOP 1
RR E 1BCB 2 NOP 1
RR H 1CCB 2 NOP 1
RR L 1DCB 2 NOP 1
RRA "" 1F 1 NOP 1
RRC (HL) 0ECB 2 NOP 1
RRC (IX*) CBDD 4 ZIX 1 0 0E00
RRC (IY*) CBFD 4 ZIX 1 0 0E00
RRC A 0FCB 2 NOP 1
RRC B 08CB 2 NOP 1
RRC C 09CB 2 NOP 1
RRC D 0ACB 2 NOP 1
RRC E 0BCB 2 NOP 1
RRC H 0CCB 2 NOP 1
RRC L 0DCB 2 NOP 1
RRCA "" 0F 1 NOP 1
RRD "" 67ED 2 NOP 1
RST 00H C7 1 NOP 1
RST 08H CF 1 NOP 1
RST 10H D7 1 NOP 1
RST 18H DF 1 NOP 1
RST 20H E7 1 NOP 1
RST 28H EF 1 NOP 1
RST 30H F7 1 NOP 1
RST 38H FF 1 NOP 1
SBC A,(HL) 9E 1 NOP 1
SBC A,(IX*) 9EDD 3 ZIX 1
SBC A,(IY*) 9EFD 3 ZIX 1
SBC A,A 9F 1 NOP 1
SBC A,B 98 1 NOP 1
SBC A,C 99 1 NOP 1
SBC A,D 9A 1 NOP 1
SBC A,E 9B 1 NOP 1
SBC A,H 9C 1 NOP 1
SBC A,L 9D 1 NOP 1
SBC HL,BC 42ED 2 NOP 1
SBC HL,DE 52ED 2 NOP 1
SBC HL,HL 62ED 2 NOP 1
SBC HL,SP 72ED 2 NOP 1
SBC A,* DE 2 NOP 1
SCF "" 37 1 NOP 1
SET *,(HL) C6CB 2 ZBIT 1
SET *,(IX*) CBDD 4 ZBIT 1 0 C600
SET *,(IY*) CBFD 4 ZBIT 1 0 C600
SET *,A C7CB 2 ZBIT 1
SET *,B C0CB 2 ZBIT 1
SET *,C C1CB 2 ZBIT 1
SET *,D C2CB 2 ZBIT 1
SET *,E C3CB 2 ZBIT 1
SET *,H C4CB 2 ZBIT 1
SET *,L C5CB 2 ZBIT 1
SLA (HL) 26CB 2 NOP 1
SLA (IX*) CBDD 4 ZIX 1 0 2600
SLA (IY*) CBFD 4 ZIX 1 0 2600
SLA A 27CB 2 NOP 1
SLA B 20CB 2 NOP 1
SLA C 21CB 2 NOP 1
SLA D 22CB 2 NOP 1
SLA E 23CB 2 NOP 1
SLA H 24CB 2 NOP 1
SLA L 25CB 2 NOP 1
SLP "" 76ED 2 NOP 2
SRA (HL) 2ECB 2 NOP 1
SRA (IX*) CBDD 4 ZIX 1 0 2E00
SRA (IY*) CBFD 4 ZIX 1 0 2E00
SRA A 2FCB 2 NOP 1
SRA B 28CB 2 NOP 1
SRA C 29CB 2 NOP 1
SRA D 2ACB 2 NOP 1
SRA E 2BCB 2 NOP 1
SRA H 2CCB 2 NOP 1
SRA L 2DCB 2 NOP 1
SRL (HL) 3ECB 2 NOP 1
SRL (IX*) CBDD 4 ZIX 1 0 3E00
SRL (IY*) CBFD 4 ZIX 1 0 3E00
SRL A 3FCB 2 NOP 1
SRL B 38CB 2 NOP 1
SRL C 39CB 2 NOP 1
SRL D 3ACB 2 NOP 1
SRL E 3BCB 2 NOP 1
SRL H 3CCB 2 NOP 1
SRL L 3DCB 2 NOP 1
SUB (HL) 96 1 NOP 1
SUB (IX*) 96DD 3 ZIX 1
SUB (IY*) 96FD 3 ZIX 1
SUB A 97 1 NOP 1
SUB B 90 1 NOP 1
SUB C 91 1 NOP 1
SUB D 92 1 NOP 1
SUB E 93 1 NOP 1
SUB H 94 1 NOP 1
SUB L 95 1 NOP 1
SUB * D6 2 NOP 1
TST A 3CED 2 NOP 2
TST B 04ED 2 NOP 2
TST C 0CED 2 NOP 2
TST D 14ED 2 NOP 2
TST E 1CED 2 NOP 2
TST H 24ED 2 NOP 2
TST L 2CED 2 NOP 2
TST (HL) 34ED 2 NOP 2
TST * 64ED 3 NOP 2
TSTIO * 74ED 3 NOP 2
XOR (HL) AE 1 NOP 1
XOR (IX*) AEDD 3 ZIX 1
XOR (IY*) AEFD 3 ZIX 1
XOR A AF 1 NOP 1
XOR B A8 1 NOP 1
XOR C A9 1 NOP 1
XOR D AA 1 NOP 1
XOR E AB 1 NOP 1
XOR H AC 1 NOP 1
XOR L AD 1 NOP 1
XOR * EE 2 NOP 1

View File

@@ -0,0 +1,199 @@
TASM RELEASE NOTES
RELEASE DATE/VERSION DESCRIPTION
-----------------------------------------------------------------------
10/01/85 Version 2.0 First version with external table def files.
01/01/86 Version 2.1 Added '*=' and '=' directives as
alternatives to .ORG and .EQU (for
more complete MOS Technology compatibility).
Enhanced parsing algorithm so it can
deal with more than one variable expression.
Added -d option
02/14/86 Version 2.2 Modified so instruction set definition
tables don't need to be compiled in.
Added 8051 tables.
Increased the number of labels allowed.
03/31/87 Version 2.3 Fixed bug that prevented location 0xffff
from being used and written to object file.
Most changes in wrtobj() and pr_hextab().
05/01/87 Version 2.4 Added multiple byte opcode support.
Added shift/or operation capability to
args from instruction set definition table.
Converted to MS C version 3.0
Added hashing to instruction set table
lookups to speed up.
11/01/87 Version 2.5 Added DB and DW directives.
Added escape capability in TEXT strings.
Fixed inst_lookup function to treat the
multiple wild card case a little better
Added 8080/8085 and Z80 tables.
Added sorting on label table.
Increased size of read buffer.
Speed enhancements.
Added DEFCONT (macro continuation) directive.
Converted to Microsoft C 5.0 compiler.
Added 6805 table (and related modops).
Added Z80 bit modop.
Minor speed up.
Fixed bug that enters infinite loop
when a macro invocation has no closing paren.
Added some three arg MODOPs.
8/15/88 Version 2.6.1 Added CODES/NOCODES directives
Fixed bug preventing directives in multiple
statement lines.
2.6.2 Added COMB_NIBBLE and COMB_NIBBLE_SWAP MODOPS
2/1/89 Version 2.7 Removed ad hoc heap and now use malloc()
Added MSFIRST and LSFIRST directives.
Added EXPORT directive.
Added symbol table file (-s flag).
Added NSEG/CSEG/BSEG/DSEG/XSEG directives
and the SYM/AVSYM directives to support
the Avocet avsim51 simulator.
Added support for TMS320.
Added -r flag to set read buffer size.
Converted expression evaluation from
signed 16 bit to signed 32 bit (enabling
apparent ability to use signed or unsigned
16 bit values).
4/20/89 Version 2.7.1 Return 0x20000 for undefined labels so that
(label+x) type stuff won't confuse zero
page addressing.
Added duplicate label error message on pass 1.
6/20/89 Version 2.7.2 Improved macro expansion capability.
No expansion in comments.
Context sensitive identifiers.
Revised exit codes.
6/27/89 Version 2.7.3 Added -a flag for strict error checking:
(1) No outer parens around expressions.
(2) Error message if unused argbytes remain
(3) Duplicate labels
Fixed so ']' can terminate expressions.
Removed parse() from tasm.c
8/19/89 Version 2.7.4 Added Motorola hex object format.
Fixed bug that complained when \ immediately
followed a opcode with no args.
Slightly improved error reporting (Errorbuf).
10/31/89 Version 2.7.5 Added TMS7000 support.
Fixed argv[] bug (only dimensioned to 10 in pass1.
12/23/89 Version 2.7.6 Improved handling of % (modulo vs binary
prefix ambiguity).
Fixed list so lines with more than
6 bytes go on second line.
03/04/90 Version 2.7.7 Fixed bug that left off 2 bytes if ORG
went backwards and all 64K was used.
Added a command line option to ignore
case on labels.
Added a couple MODOP rules for TMS9900.
Allow double quoted text strings for BYTE.
04/15/90 Version 2.7.8 Fixed expression evaluator bug (paren popping)
and changed expression evaluator to a more
conventional left to right evaluation order.
Added TURBOC ifdef's (from Lance Jump).
08/20/90 Version 2.8 Primarily a documentation update.
Added error check for AJMP/ACALL off of
current 2K block (8051).
10/15/90 Version 2.8.1 Minor speed up in label searching.
Fixed word addressing for TMS320
Version 2.8.2 Local labels.
More label table format options (long form
suppress local labels).
11/30/90 Version 2.8.3 Turbo C conversion.
DS directive added.
12/27/90 Version 2.8.4 Added COMMENTCHAR directive to change the
comment indicator in the first column.
This was done to support the assembly
files from the small C compiler (sc11)
for the 68CH11.
02/14/91 Version 2.8.5 Added LOCALLABELCHAR directive to
override the default "_" as the
prefix for local labels.
03/18/91 Version 2.8.6 Added some MODOPs in support of TMS320C25
04/20/91 Version 2.8.7 Fixed sign extend bug in CSWAP modop.
Increased MAXLABS to 10000 for big version.
05/05/91 Version 2.8.8 Fixed pointer bug in debug output in sort_labels().
05/20/91 Version 2.9 TMS320C25 table along with some MODOP enhancements
for it.
TASMTABS.DOC updated (but not TASM.DOC)
08/09/91 Version 2.9.1 Nested conditionals.
04/01/92 Version 2.9.2 Fixed long label clobber problem in
find_label() and save_label. Syntax
errors could result in a comment line
after an instruction being lumped together
with a label resulting in a long label.
The label functions were not testing for
labels that exceed the specified size.
Added CHK directive.
Added REL3 MODOD to support uPD75xxx.
Delinting and more ANSIfication.
Modifications due to feedback from B Provo:
Added FILL directive.
Allow multiple labels for EXPORT directive.
Allow address with END directive.
TASM.DOC update
11/25/92 Version 2.9.3 Improved error reporting for mismatched quotes.
Disallow the single quote character constants.
Convert to BCC++ 3.1
Provide filename,linenum on all error messages.
Modify format of error messages for compatibility
with the Brief editor.
Added ECHO directive to send output to console.
Performance improvements in macro processing.
"Type Safe" conversion (compatible with C++).
Improved error reporting for imbalanced ifdefs.
01/29/93 Version 2.9.4 Added rules for 8096 (I1,I2,I3,I4,I5,I6).
Generate error message on forward reference
in EQUate statements.
Eliminated -a option for enabling the detection
of branches of 2K page for 8051. This
is now built into the table.
Allow white space in double quotes for BYTE
directive. This previously worked for TEXT,
but not BYTE.
Fixed defect with Z80 4 byte indexed instructions.
Fixed macro defect. If the macro definition has
args but the invocation does not some garbage
gets expanded into the source line.
Z80 OTDR opcode was incorrect.
Z80 IN0/OUT0/INA instructions did not require
the parens around the args.
Some experimental support for windows verson of TASM.
10/24/93 Version 3.0 Documentation update. TASM.DOC, TASMTABS.DOC
and RELNOTES.DOC updated, but the functionality
remains unchanged from version 2.9.4.
06/16/94 Version 3.0.1 SPR 1006: Multiple macros on the same line
SPR 1007: -c with >8000h bytes used goes bonkers
SPR 1009: waddr correction for BLOCK/DS
SPR 1011: Escaped quotes in TEXT


View File

@@ -0,0 +1,8 @@
tasm -80 source\basMon.asm hexFiles\basMon.hex
tasm -80 source\cbios128.asm hexFiles\cbios128.hex
tasm -80 source\cpm22.asm hexFiles\cpm22.hex
tasm -80 source\form128.asm hexFiles\form128.hex
tasm -80 source\putsys.asm hexFiles\putsys.hex
tasm -80 source\download.asm hexFiles\download.hex
pause

View File

@@ -0,0 +1,343 @@
:0430040000000000C8
:18000000F3C3940000000000C332000000000000C31B000000000000CB
:18001800C35C003A0030FE002008CD630028FBDB81C9CD6A0028FBDB74
:1800300083C9F53A0030FE00200D1801F5CD500028FBF1D381C9F5CDC4
:18004800560028FBF1D383C9DB800FCB47C9DB820FCB47C93A0030FE23
:18006000002007DB80E601FE00C9DB82E601FE00C9D7FE0A28FBFE1B32
:1800780020023E03C9FE0D280AFE0C2804FE203801CFC93E0DCF3E0A80
:18009000CF3E0DC93128303E95D380D3823E00320030216503CD1B015F
:1800A8003E01320030216503CD1B01CD6300280F3E00320030CD1B003E
:1800C000FE20C2B3001814CD6A0028E73E01320030CD1B00FE20C2B307
:1800D8000018003E0CCD3C00CD4600CD2201219602CD1B0121EC00E50E
:1800F000CD22013E3ECFCD7100FE2038F9FE3ACA9901CD7D00E65FFE07
:1801080042CADA01FE47CA9301FE58CAF1013E3FCF18D57EB7C8CF231B
:1801200018F93E0DCF3E0ACFC9CD7100FE03C8FE2038F6C9CD29014762
:18013800CD29014FCD73014F7B915F79C9210000CD8C01FE0D200E3741
:18015000C9210000CD8C01FE0DC8FE2CC8FE0328EE29292929D630FECF
:180168000A3802D607E60F856F18E178D630FE0A3802D60707070707C3
:180180004779D630FE0A3802D60780C9CD7100CD7D00C9CD4501D8E518
:18019800C91E00CD340157CD340167CD34016FCD3401FE012009CD340A
:1801B000017BA7281E18157AA7280BCD340177233E2ECF1518F1CD3457
:1801C800017BA7C8215403CD1B01C9218A03CD1B01C9214203CD1B015B
:1801E000CD2901C8E65FFE43CA9503FE57CA9803C9210302CD1B01CD01
:1801F8002901C8E65FFE59CA2402C90D0A426F6F742043502F4D3F008F
:180210000D0A4C6F6164696E672043502F4D2E2E2E0D0A00211002CD31
:180228001B0106183E003204303205303206303207302100D022023063
:18024000CD6E021100022A0230192202303A04303C32043010EA3A0049
:1802580030F52AFEFFE93A0630D38C3A0530D38B3A0430D38AC9F5C56F
:18027000E5DB89FE8020FACD5E023E00D3890E040680DB89FEE020FADA
:18028800DB8877230520F30D20EEE1C1F1C943502F4D20426F6F7420EF
:1802A000524F4D20322E3020627920472E20536561726C650D0A0D0A6E
:1802B8004243206F72204257202D20524F4D20424153494320436F6CD4
:1802D000642F5761726D0D0A5820202020202020202D20426F6F74207C
:1802E80043502F4D20286C6F61642024443030302D2446464646290D50
:180300000A3A6E6E6E6E2E2E2E202D204C6F616420496E74656C2D48E1
:1803180065782066696C65207265636F72640D0A476E6E6E6E2020201B
:18033000202D2052756E206C6F63206E6E6E6E0D0A000D0A436F6C642D
:18034800206F72207761726D3F0D0A00436865636B73756D20657272D3
:180360006F720D0A000C5072657373205B53504143455D20746F2061AC
:180378006374697661746520636F6E736F6C650D0A00436F6D706C65F3
:1803900074650D0A00C39B03C33904DD210000C3A6034C0CC21321B09C
:1803A80030F9C3E11F117306066321B0301A77231305C2B503F9CD74DD
:1803C00008CD420E325A3132A931218804CDE014CD9108CD9A0BB7C278
:1803D800EF03210D32237CB5CA01047E472F77BE70CADD03C30104CDC0
:1803F000660CB7C24207EB2B3ED94677BE70C2CA032B110C32CD0A0ABF
:18040800DACA0311CEFF225F3119220A31CD4F082A0A3111EFFF19117D
:18042000A9317D936F7C9A67E5215104CDE014E1CD831B214204CDE072
:1804380014311631CD7408C38D0720427974657320667265650D0A0080
:18045000005A38302042415349432056657220342E37620D0A436F70AF
:18046800797269676874202843292031393738206279204D6963726F23
:18048000736F66740D0A00004D656D6F727920746F7000F819BC1A0EB0
:180498001AB330A0132517CE13821C611D9D18D01CD61DDC1D3D1E5229
:1804B0001E7917BD1E013152166A14EC1661167216DF1E721F8216B2BA
:1804C80016BC16C54E44C64F52CE455854C4415441C94E505554C44900
:1804E0004DD2454144CC4554C74F544FD2554EC946D24553544F5245D5
:1804F800C74F535542D2455455524ED2454DD3544F50CF5554CF4ECEFF
:18051000554C4CD7414954C44546D04F4B45C44F4B45D3435245454E50
:18052800CC494E4553C34C53D749445448CD4F4E49544F52D34554D278
:1805400045534554D052494E54C34F4E54CC495354C34C454152C34CFF
:180558004F4144C353415645CE4557D4414228D44FC64ED3504328D443
:1805700048454ECE4F54D3544550ABADAAAFDEC14E44CF52BEBDBCD35E
:18058800474EC94E54C14253D55352C65245C94E50D04F53D35152D20D
:1805A0004E44CC4F47C55850C34F53D3494ED4414EC1544ED045454BA8
:1805B800C445454BD04F494E54CC454ED3545224D6414CC15343C348C7
:1805D0005224C8455824C2494E24CC45465424D24947485424CD49444C
:1805E8002480E40BE10ABC0F310DC30EF811F20E480DEE0CD10CC00DA1
:18060000AA0BDD0C0C0D330DE20B3117A20D230C3717D6138017C81E24
:18061800330DAE1EA11EA61EDE1F04310731E40D100C560A8B0C330D8D
:18063000330D4E08796A1B799E177CDC187C3D197F8B1C505111465040
:18064800114E46534E52474F4446434F564F4D554C425344442F3049F8
:1806600044544D4F534C535354434E55464D4F4858424EC33904C36199
:180678000CD300C9D6006F7CDE006778DE00473E00C9000000354ACACF
:1806900099391C76982295B3980ADD479853D199990A1A9F9865BCCDEF
:1806A80098D6773E9852C74F80DB00C901FF1C000014001400000000AF
:1806C00000C38709C30000C30000C300000D32FEFFAA31204572726FB7
:1806D800720020696E20004F6B0D0A0000427265616B00210400397EEF
:1806F00023FE81C04E234623E569607AB3EBCA0507EBCD0A0A010D0040
:18070800E1C809C3EF06CD2807C5E3C1CD0A0A7E02C80B2BC31407E5E8
:180720002A8A31060009093EE53ED0956F3EFF9CDA37076739E1D81E27
:180738000CC356072A7931220C311E02011E14011E00011E12011E2266
:18075000011E0A011E18CD740832F530CD350E214906573E3FCD1B0A4B
:18076800197ECD1B0ACD9A0BCD1B0A21D306CDE0142A0C3111FEFFCD8F
:180780000A0ACAA6037CA53CC47B1B3EC1AF32F530CD350E21DF06CD3B
:18079800E01421FFFF220C31CD8709DA9A07CD9A0B3C3DCA9A07F5CDE7
:1807B000660CD5CD9E0847D1F1D27A0BD5C5AF327C31CD9A0BB7F5CD04
:1807C8002E08DAD307F1F5CA070DB7C5D2EA07EB2A86311A020313CD61
:1807E0000A0AC2DB076069228631D1F1CA11082A8631E3C109E5CD0EB4
:1807F80007E1228631EB74D12323732372231111311A772313B7C209EB
:1808100008CD5A0823EB626B7E23B6CA9A07232323AFBE23C22208EB2C
:18082800732372C316082A0E31444D7E23B62BC823237E23666FCD0AF8
:180840000A60697E23666F3FC83FD0C33108C02A0E31AF772377232217
:1808580086312A0E312B227E312A5F31227331AFCDAA0B2A8631228830
:1808700031228A31C12A0A31F9216331226131AF6F67228431327B31A0
:18088800228E31E5C52A7E31C93E3FCD1B0A3E20CD1B0AC3FE30AF329A
:1808A0005E310E051111317EFE20CA260947FE22CA4609B7CA4D093A25
:1808B8005E31B77EC22609FE3F3E9ECA26097EFE30DAD108FE3CDA26C8
:1808D00009D511CA04C5012209C5067F7EFE61DAEA08FE7BD2EA08E64C
:1808E8005F774EEB23B6F2EC08047EE67FC8B9C2EC08EBE5131AB7FA5E
:180900001E094F78FE88C20D09CD9A0B2B237EFE61DA1609E65FB9CA35
:18091800FC08E1C3EA0848F1EBC9EB79C1D12312130CD63ACA3409FEE1
:1809300049C23709325E31D654C2A708477EB7CA4D09B8CA2609231286
:180948000C13C33D092110311213121312C93AF430B73E0032F430C27D
:180960006A0905CA8709CD1B0A3E052BCA7E097ECD1B0AC39009052B00
:18097800CD1B0AC29009CD1B0ACD420EC387092111310601AF32F43049
:18099000CD450A4FFE7FCA56093AF430B7CAA9093E00CD1B0AAF32F4A8
:1809A8003079FE07CAED09FE03CC420E37C8FE0DCA3D0EFE15CA810926
:1809C000FE40CA7E09FE5FCA7609FE08CA7609FE12C2E809C5D5E53623
:1809D80000CDF21F211131CDE014E1D1C1C39009FE20DA900978FE49E6
:1809F0003E07D2020A7971327C312304CD1B0AC39009CD1B0A3E08C393
:180A0800FC097C92C07D93C97EE3BE23E3CA9A0BC34207F53AF530B77F
:180A2000C21515F1C5F5FE20DA3F0A3AF230473A5B3104CA3B0A05B8AD
:180A3800CC420E3C325B31F1C1CDDB1FC9CD9F1EE67FFE0FC03AF53033
:180A50002F32F530AFC9CD660CC0C1CD2E08C5CDAC0AE14E2346237852
:180A6800B1CA8D07CDB50ACDC50BC5CD420E5E235623E5EBCD831B3EE9
:180A800020E1CD1B0A7EB723CA620AF2820AD67F4F11CB041A13B7F205
:180A9800940A0DC2940AE67FCD1B0A1A13B7F29E0AC3850AE52AF830DD
:180AB00022F630E1C9E5D52AF63011FFFFED5A22F630D1E1F0E52AF8EB
:180AC8003022F630CD9F1EFE03CAD80AE1C3B50A2AF83022F630C33C6B
:180AE000043E64327B31CD480DC1E5CD310D22773121020039CDEF06BF
:180AF800D1C2110B09D52B562B5E2323E52A7731CD0A0AE1C2F50AD1FE
:180B1000F9EB0E08CD1F07E52A7731E3E52A0C31E3CD0A10CD100AA6A3
:180B2800CD0710E5CD351AE1C5D5010081515A7EFEAB3E01C24D0BCDDB
:180B40009A0BCD0710E5CD351ACDE919E1C5D5F533E52A7E31E3068179
:180B5800C533CDC50B227E317EFE3ACA7A0BB7C24207237E23B6CAEC28
:180B70000B235E2356EB220C31EBCD9A0B115A0BD5C8D680DA480DFE2B
:180B880025D24207074F0600EB21EA05094E2346C5EB237EFE3AD0FEA7
:180BA00020CA9A0BFE303F3C3DC9EB2A0E31CABF0BEBCD660CE5CD2E0D
:180BB800086069D1D2070D2B228C31EBC9DFC8D7FE1B2811FE03280DD9
:180BD000FE13C0D7FE11C8FE03280718F63EFF32FD30C0F6C0227E316D
:180BE80021F6FFC12A0C31F57DA43CCAFF0B2282312A7E31228431AF5D
:180C000032F530CD350EF121E506C27607C38D072A84317CB51E20CACA
:180C18005607EB2A8231220C31EBC9CD6817C032F130C9E52AFA300625
:180C3000004F0922FA30E1C97EFE41D8FE5B3FC9CD9A0BCD0710CDE95C
:180C480019FA610C3A9731FE90DA911A018090110000E5CD641AE1517B
:180C6000C81E08C356072B110000CD9A0BD0E5F5219819CD0A0ADA4247
:180C780007626B19291929F1D6305F160019EBE1C36A0CCA5E08CD4342
:180C90000C2BCD9A0BE52A5F31CAAE0CE1CD100A2CD5CD430C2BCD9A09
:180CA8000BC24207E3EB7D935F7C9A57DA3707E52A863101280009CD97
:180CC0000A0AD23707EB220A31E1225F31E1C35E08CA5A08CD5E0801B3
:180CD8005A0BC3ED0C0E03CD1F07C1E5E52A0C31E33E8CF533C5CD6620
:180CF0000CCD330DE52A0C31CD0A0AE123DC3108D42E0860692BD81E99
:180D08000EC35607C016FFCDEB06F9FE8C1E04C25607E1220C31237C6F
:180D2000B5C22B0D3A7C31B7C28C07215A0BE33EE1013A0E00060079C9
:180D380048477EB7C8B8C823FE22CA370DC33A0DCDFD11CD100AB4D5F1
:180D50003A5D31F5CD1910F1E3227E311FCD0C10CA9B0DE52A9431E500
:180D680023235E23562A0E31CD0A0AD28A0D2A0A31CD0A0AD1D2920D1B
:180D8000216F31CD0A0AD2920D3ED1CD4116EBCD7A14CD4116E1CD44B9
:180D98001AE1C9E5CD411AD1E1C9CD68177E47FE8CCAB10DCD100A8865
:180DB0002B4B0D78CA820BCD670CFE2CC0C3B20DCD19107EFE88CACE9B
:180DC8000DCD100AA92BCD0A10CDE919CA330DCD9A0BDAEE0CC3810BF6
:180DE0002BCD9A0BCA420EC8FEA5CA750EFEA8CA750EE5FE2CCA5E0E54
:180DF800FE3BCA980EC1CD1910E53A5D31B7C22E0ECD8E1BCD9E1436F6
:180E1000202A9431342A94313AF2304704CA2A0E043A5B31863DB8D4D6
:180E2800420ECDE314AFC4E314E1C3E00D3A5B31B7C8C3420E360021F4
:180E400010313E0DCD1B0A3E0ACD1B0AAF325B313AF1303DC8F5AFCDA4
:180E58001B0AF1C3530E3AF330473A5B31B8D4420ED2980ED60ED26C68
:180E70000E2FC38D0EF5CD6517CD100A292BF1D6A8E5CA880E3A5B31DC
:180E88002F83D2980E3C473E20CD1B0A05C2910EE1CD9A0BC3E70D3FA6
:180EA0005265646F2066726F6D2073746172740D0A003A7D31B7C23CDA
:180EB80007C1219F0ECDE014C38D08CD4B147EFE223E0032F530C2DD75
:180ED0000ECD9F14CD100A3BE5CDE3143EE5CD9108C1DAE90B237EB741
:180EE8002BC5CA300D362CC3F70EE52A8C31F6AF327D31E3C3030FCDFB
:180F0000100A2CCDFD11E3D57EFE2CCA2B0F3A7D31B7C2980F3E3FCD02
:180F18001B0ACD9108D1C1DAE90B237EB72BC5CA300DD53A5D31B7CA69
:180F3000550FCD9A0B5747FE22CA490F3A7D31B757CA460F163A062C5C
:180F48002BCDA214EB21600FE3D5C3630DCD9A0BCDF01AE3CD411AE148
:180F60002BCD9A0BCA6C0FFE2CC2B20EE32BCD9A0BC2FF0ED13A7D31E3
:180F7800B7EBC2C00BD5B621870FC4E014E1C93F45787472612069675B
:180F90006E6F7265640D0A00CD310DB7C2B10F237E23B61E06CA560711
:180FA800235E2356EB227931EBCD9A0BFE83C2980FC32B0F110000C467
:180FC000FD11227E31CDEB06C24807F9D57E23F5D5CD271AE3E5CD94FB
:180FD80017E1CD411AE1CD381AE5CD641AE1C190CD381ACAF70FEB2283
:180FF0000C316960C3560BF92A7E317EFE2CC25A0BCD9A0BCDBF0FCD44
:181008001910F6373A5D318FB7E8C35407CD100A282B1600D50E01CD65
:181020001F07CD90102280312A8031C178FE78D40A107E1600D6B3DAE3
:181038005110FE03D25110FE0117AABA57DA4207227531CD9A0BC335E5
:18105000107AB7C278117E227531D6ACD8FE07D05F3A5D313DB37BCA2B
:18106800D61507835F213406197856BAD023CD0A10C5012810C5434A76
:18108000CD1A1A58514E234623C52A7531C31C10AF325D31CD9A0B1E51
:1810980024CA5607DAF01ACD380CD2F710FE262012CD9A0BFE48CA341B
:1810B0001FFE42CAA41F1E02CA5607FEACCA9010FE2ECAF01AFEADCA6C
:1810C800E610FE22CA9F14FEAACAD811FEA7CA0314D6B6D20811CD1543
:1810E00010CD100A29C9167DCD1C102A8031E5CD121ACD0A10E1C9CD6C
:1810F800FD11E5EB2294313A5D31B7CC271AE1C90600074FC5CD9A0B52
:1811100079FE31DA2F11CD1510CD100A2CCD0B10EB2A9431E3E5EBCDBE
:181128006817EBE3C33711CDDE10E311F210D5019304094E236669E907
:1811400015FEADC8FE2DC814FE2BC8FEACC82BC9F6AFF5CD0A10CD4C17
:181158000CF1EBC1E3EBCD2A1AF5CD4C0CF1C17921C113C27311A34F85
:1811700078A2E9B34F78B2E9218A113A5D311F7A175F166478BAD0C37D
:1811880079108C1179B71FC1D1F5CD0C1021CE11E5CA641AAF325D31CE
:1811A000D5CD23167E23234E2346D1C5F5CD2716CD381AF157E17BB2D7
:1811B800C87AD601D8AFBB3CD0151D0ABE2303CAB6113FC3F4193C8F2D
:1811D000C1A0C6FF9FC3FB19165ACD1C10CD0A10CD4C0C7B2F4F7A2F54
:1811E800CDC113C1C328102BCD9A0BC8CD100A2C01EF11C5F6AF325C21
:181200003146CD380CDA4207AF4F325D31CD9A0BDA1912CD380CDA26E5
:18121800124FCD9A0BDA1A12CD380CD21A12D624C235123C325D310FC8
:18123000814FCD9A0B3A7B313DCAE212F245127ED628CABA12AF327BCC
:1812480031E550592A8E31CD0A0A119031CA2A192A8831EB2A8631CDAA
:181260000A0ACA7812799623C26D12789623CAAC1223232323C35F1222
:18127800E1E3D511FA10CD0A0AD1CAAF12E3E5C50106002A8A31E50906
:18129000C1E5CD0E07E1228A3160692288312B3600CD0A0AC29E12D1D7
:1812A80073237223EBE1C932973121DE06229431E1C9E52A5C31E35708
:1812C000D5C5CD400CC1F1EBE3E5EB3C577EFE2CCAC012CD100A29220A
:1812D8008031E1225C311E00D511E5F52A88313E19EB2A8A31EBCD0A13
:1812F0000ACA1A137EB923C2FC127EB8235E235623C2E8123A5C31B72E
:18130800C24B07F1444DCA2A1996CA78131E10C35607110400F1CA61C0
:181320000C712370234FCD1F07232322753171233A5C311779010B003B
:18133800D23D13C10371237023F5E5CDD51AEBE1F13DC23513F5424B74
:18135000EB19DA3707CD2807228A312B3600CD0A0AC25B1303572A7525
:18136800315EEB2909EB2B2B73237223F1DA9C13474F7E2316E15E232C
:181380005623E3F5CD0A0AD21513E5CDD51AD119F13D444DC27D132964
:1813980029C109EB2A8031C92A8A31EB210000393A5D31B7CABC13CDAC
:1813B0002316CD23152A0A31EB2A73317D934F7C9A41501E00215D31F6
:1813C800730690C3001A3A5B3147AFC3C213CD5914CD4B1401310DC569
:1813E000D5CD100A28CDFD11E5EB2B562B5EE1CD0A10CD100A29CD10A7
:1813F8000AB4444DE3712370C39814CD5914D5CDDE10CD0A10E35E2323
:1814100056237AB3CA4E077E23666FE52A8E31E3228E312A9231E52AFB
:181428009031E5219031D5CD411AE1CD07102BCD9A0BC24207E1229027
:1814400031E1229231E1228E31E1C9E52A0C31237CB5E1C01E16C356A3
:1814580007CD100AA73E80327B31B647CD0212C30A10CD0A10CD8E1B33
:18147000CD9E14CD2316017E16C57E2323E5CDF914E14E2346CD9214F7
:18148800E56FCD1616D1C9CDF914216F31E5772323732372E1C92B0645
:1814A0002250E50EFF237E0CB7CAB414BACAB414B8C2A514FE22CC9AD5
:1814B8000BE323EB79CD9214116F312A61312294313E01325D31CD44D0
:1814D0001ACD0A0A226131E17EC01E1EC3560723CD9E14CD2316CD382D
:1814E8001A1C1DC80ACD1B0AFE0DCC4C0E03C3EA14B70EF1F52A0A31D0
:18150000EB2A73312F4F06FF0923CD0A0ADA171522733123EBF1C9F105
:181518001E1ACA5607BFF501FB14C52A5F31227331210000E52A0A31E8
:18153000E5216331EB2A6131EBCD0A0A013415C288152A8631EB2A886F
:1815480031EBCD0A0ACA5B157E2323B7CD8B15C34515C1EB2A8A31EBD3
:18156000CD0A0ACAB115CD381A7BE509B7F25A15227531E14E0600095C
:181578000923EB2A7531EBCD0A0ACA5B15017A15C5F6807E23235E235E
:181590005623F0B7C8444D2A7331CD0A0A6069D8E1E3CD0A0AE3E560AD
:1815A80069D0C1F1F1E5D5C5C9D1E17DB4C82B462B4EE52B2B6E2600A3
:1815C0000950592B444D2A7331CD1107E171237069602BC32615C5E571
:1815D8002A9431E3CD9010E3CD0B107EE52A9431E5861E1CDA5607CDF6
:1815F0008F14D1CD2716E3CD2616E52A7131EBCD0D16CD0D16212510A7
:18160800E3E5C3C014E1E37E23234E23466F2C2DC80A120313C317167A
:18162000CD0B102A9431EBCD4116EBC0D550591B4E2A7331CD0A0AC2C9
:181638003F164709227331E1C92A61312B462B4E2B2BCD0A0AC0226165
:1816500031C901D113C5CD2016AF57325D317EB7C901D113C5CD561634
:18166800CA610C23235E23561AC93E01CD8F14CD6B172A713173C1C372
:18168000C014CD1B17AFE34FE57EB8DA901678110E00C5CDF914C1E12B
:18169800E5232346236668060009444DCD92146FCD1616D1CD2716C3BF
:1816B000C014CD1B17D1D51A90C38616EB7ECD20170405CA610CC51E10
:1816C800FFFE29CAD516CD100A2CCD6817CD100A29F1E3018816C53D4B
:1816E000BE0600D04F7E91BB47D843C9CD5616CA09185F23237E23664A
:1816F8006FE5194672E3C57EFE24C20A17CD341F180DFE25C21417CD68
:18171000A41F1803CDF01AC1E170C9EBCD100A29C1D1C543C9CD6B1784
:1817280032EF30CDEE30C3D113CD5517C3B630CD5517F51E002BCD9A06
:181740000BCA4B17CD100A2CCD6817C1CDEE30ABA0CA4C17C9CD6817C2
:1817580032EF3032B730CD100A2CC36817CD9A0BCD0710CD460C7AB714
:18177000C2610C2BCD9A0B7BC9CD4C0C1AC3D113CD0710CD4C0CD5CDC0
:18178800100A2CCD6817D112C921671CCD381AC3A317CD381A21C1D1F9
:1817A000CD121A78B7C83A9731B7CA2A1A90D2BD172F3CEBCD1A1AEB02
:1817B800CD2A1AC1D1FE19D0F5CD4F1A67F1CD6818B4219431F2E31739
:1817D000CD4818D229182334CA51072E01CD7E18C32918AF90477E9B13
:1817E8005F237E9A57237E994FDC54186863AF4779B7C216184A546543
:181800006F78D608FEE0C2F717AF329731C905297A1757798F4FF20E7E
:1818180018785C45B7CA29182197318677D20918C878219731B7FC3BD5
:181830001846237EE680A94FC32A1A1CC014C00CC00E8034C0C3510723
:181848007E835F237E8A57237E894FC92198317E2F77AF6F90477D9B49
:181860005F7D9A577D994FC90600D608DA7718435A510E00C36A18C621
:18187800096FAF2DC8791F4F7A1F577B1F5F781F47C37A1800000081B8
:1818900003AA561980F122768045AA3882CDE919B7EA610C2197317EAE
:1818A80001358011F30490F570D5C5CDA317C1D104CD3F19218C18CD07
:1818C0009A17219018CD311D018080110000CDA317F1CD641B013180F3
:1818D80011187221C1D1CDE919C82E00CDA7197932A631EB22A73101F0
:1818F0000000505821F417E5210019E5E52194317E23B7CA2C19E52EC3
:18190800081F6779D21A19E52AA73119EBE13AA631891F4F7A1F577B7C
:181920001F5F781F472D7CC20919E1C9435A514FC9CD1A1A012084115F
:181938000000CD2A1AC1D1CDE919CA45072EFFCDA71934342B7E32C250
:18195000302B7E32BE302B7E32BA3041EBAF4F575F32C530E5C57DCDC6
:18196800B930DE003FD2771932C530F1F137D2C1E1793C3D1FFA2A18FE
:18198000177B175F7A175779174F297817473AC5301732C53079B2B336
:18199800C26419E521973135E1C26419C3510778B7CACB197D21973177
:1819B000AE80471FA878F2CA19C68077CA2A19CD4F1A772BC9CDE9195C
:1819C8002FE1B7E1F20918C35107CD351A78B7C8C602DA510747CDA36D
:1819E0001721973134C0C351073A9731B7C83A9631FE2F179FC03CC9B6
:1819F800CDE91906881100002197314F70060023368017C3F117CDE94A
:181A100019F02196317EEE8077C9EB2A9431E3E52A9631E3E5EBC9CDC5
:181A2800381AEB2294316069229631EBC92194315E2356234E23462362
:181A4000C911943106041A77132305C2461AC92196317E07371F773FB5
:181A58001F2323777907371F4F1FAEC978B7CAE91921F219E5CDE91904
:181A700079C8219631AE79F8CD7E1A1FA9C92378BEC02B79BEC02B7A40
:181A8800BEC02B7B96C0E1E1C9474F575FB7C8E5CD351ACD4F1AAE672A
:181AA000FCB51A3E9890CD68187C17DC3B180600DC5418E1C91B7AA3BE
:181AB8003CC00BC92197317EFE983A9431D07ECD911A36987BF57917B6
:181AD000CDF117F1C921000078B1C83E1029DA1513EB29EBD2EB1A0905
:181AE800DA15133DC2DD1AC9FE2DF5CAFC1AFE2BCAFC1A2BCD091847BC
:181B0000575F2F4FCD9A0BDA4D1BFE2ECA281BFE45C22C1BCD9A0BCD21
:181B18004011CD9A0BDA6F1B14C22C1BAF935F0C0CCA041BE57B90F4EB
:181B3000451BF23B1BF5CD3119F13CC22F1BD1F1CC121AEBC9C8F5CDB8
:181B4800D219F13DC9D557788947C5E5D5CDD219F1D630CD641BE1C113
:181B6000D1C3041BCD1A1ACDFB19C1D1C3A3177B0707830786D6305FCB
:181B7800C31A1BE521DA06CDE014E1EBAF0698CD001A21DF14E5219903
:181B900031E5CDE9193620F29C1B362D233630CA521CE5FC121AAFF584
:181BA800CD581C01439111F84FCD641AB7E2C91BF1CD461BF5C3AB1B52
:181BC000CD3119F13CF5CD581CCD91173CCD911ACD2A1A010603F181DD
:181BD8003CFAE51BFE08D2E51B3C473E023D3DE1F5116B1C05C2F61B64
:181BF000362E2336302305362ECC3F1AC5E5D5CD351AE1062F047B9679
:181C08005F237A9E5723799E4F2B2BD2051CCD481823CD2A1AEBE17064
:181C200023C10DC2F61B05CA361C2B7EFE30CA2A1CFE2EC43F1AF1CADC
:181C3800551C364523362BF2461C362D2F3C062F04D60AD2481CC63AB3
:181C5000237023772371E1C901749411F723CD641AB7E1E2C01BE90054
:181C6800000080A08601102700E803006400000A000001000021121ADF
:181C8000E3E9CD1A1A21671CCD271AC1D1CDE91978CAD01CF29B1CB7DE
:181C9800CA4507B7CA0A18D5C579F67FCD351AF2B81CD5C5CDBC1AC113
:181CB000D1F5CD641AE17C1FE1229631E1229431DC7D1CCC121AD5C5F6
:181CC800CD9D18C1D1CDDE18CD1A1A013881113BAACDDE183A9731FEB9
:181CE00088D2C519CDBC1AC680C602DAC519F5218C18CD9417CDD5185F
:181CF800F1C1D1F5CDA017CD121A21101DCD401D110000C14AC3DE1892
:181D100008402E9474704F2E776E02887AE6A02A7C50AAAA7EFFFF7F9C
:181D28007F0000808100000081CD1A1A11DC18D5E5CD351ACDDE18E122
:181D4000CD1A1A7E23CD271A06F1C1D13DC8D5C5F5E5CDDE18E1CD3830
:181D58001AE5CDA317E1C3491DCDE91921C930FAC21D21EA30CD271AD8
:181D700021C930C886E6070600772387874F09CD381ACDDE183AC830EC
:181D88003CE6030600FE018832C83021C61D87874F09CD9417CD351A69
:181DA0007B59EE4F4F36802B46368021C730347ED6ABC2B91D770C1573
:181DB8001CCDF41721EA30C3411A772B772B77C39D1D68B1466899E945
:181DD000926910D1756821201ECD9417CD1A1A01498311DB0FCD2A1A91
:181DE800C1D1CD3F19CD1A1ACDBC1AC1D1CDA01721241ECD9A17CDE9DB
:181E00001937F20C1ECD9117CDE919B7F5F4121A21241ECD9417F1D4AE
:181E1800121A21281EC3311DDB0F49810000007F05BAD71E866426997E
:181E30008758342387E05DA586DA0F4983CD1A1ACDDC1DC1E1CD1A1A56
:181E4800EBCD2A1ACDD61DC33D19CDE919FC7D1CFC121A3A9731FE81A0
:181E6000DA6F1E0100815159CD3F19219A17E521791ECD311D21201EC9
:181E7800C9094AD73B78026E847BFEC12F7C74319A7D843D5A7DC87F38
:181E9000917EE4BB4C7E6CAAAA7F00000081C9D7C93E0CC3DB1FCD685D
:181EA800177B32F230C9CD0710CD4C0CED53F630ED53F830C9CD4C0CAE
:181EC000D5E146237EC3C213CD0710CD4C0CD5CD100A2CCD0710CD4CE7
:181ED8000CE3732372E1C9CD0A10CD4C0CC52199317AFE00280CCD1705
:181EF0001F78FE302802702371237BCD171F7AFE00200578FE302802D9
:181F080070237123AF772377C1219931C3701447E60FFE0A3802C6079C
:181F2000C6304F780F0F0F0FE60FFE0A3802C607C63047C9EB2100009A
:181F3800CD4D1FDA6D1F1805CD4D1F381F29292929B56F18F3131AFE47
:181F500020CA4D1FD630D8FE0A3805D607FE0AD8FE103FC9EB7A4BE598
:181F6800CDC113E1C91E26C35607CD0A10CD4C0CC52199310611057862
:181F8000FE012808CB13CB1230F41804CB13CB123E30CE007723052069
:181F9800F3AF772377C1219931C37014EB210000CDC11FDACF1FD63004
:181FB00029B56FCDC11F30F6EB7A4BE5CDC113E1C9131AFE20CAC11F24
:181FC800FE30D8FE323FC91E28C35607DD21FFFFC3A603C30800C30067
:181FE000003E0032FD30C3AD03ED45F5A0C1B83E00C9CD1B0AC3420E8D
:00000001FF

View File

@@ -0,0 +1,59 @@
:18E60000C351E7C3B5E7C31DE8C358E8C396E8C37EE8C38AE8C34CE847
:18E61800C3EFE8C3C7E8C3FBE8C300E9C305E9C30DE9C321E9C3C4E8E6
:18E63000C30AE900000000000000000DEB33E700008DEB000000000092
:18E648000000000DEB42E700008EEC00000000000000000DEB42E700FE
:18E66000008FED00000000000000000DEB42E7000090EE000000000087
:18E678000000000DEB42E7000091EF00000000000000000DEB42E700C8
:18E690000092F000000000000000000DEB42E7000093F100000000004B
:18E6A8000000000DEB42E7000094F200000000000000000DEB42E70092
:18E6C0000095F300000000000000000DEB42E7000096F400000000000F
:18E6D8000000000DEB42E7000097F500000000000000000DEB42E7005C
:18E6F0000098F600000000000000000DEB42E7000099F70000000000D3
:18E708000000000DEB42E700009AF800000000000000000DEB42E70025
:18E72000009BF900000000000000000DEB42E700009CFA8000051F01F1
:18E73800FB07FF01F000000001008000051F01FF07FF01F0000000003B
:18E7500000F331C1FB3E01D3383E95D380D382CDF9EA0C43502F4D2021
:18E7680042494F5320322E3020627920472E20536561726C652032302E
:18E7800031330D0A0D0A43502F4D20322E322028632920313937392040
:18E798006279204469676974616C2052657365617263680D0A00AF326B
:18E7B0000400C3F5E7F331C1FB060B3E0032C9FBD38CD38B2100D0DB00
:18E7C80089FE8020FA3AC9FBD38A3E00D389C50E040680DB89FEE02064
:18E7E000FADB8877230520F30D20EE3AC9FB3C32C9FBC110D2AF32CB78
:18E7F800FB32CDFB21800022D6FB3EC33200002103E6220100320500E9
:18E810002106D82206003A04004FC300D03A0300E60BFE0A280AFE0241
:18E828002814E603FE01200EDB80E601FE0028033EFFC93E00C9DB82B1
:18E84000E601FE0028033EFFC93E00C9F53A0300E608FE08201C180E1B
:18E85800F53A0300E603FE0228EBFE01200CF1DB80E601FE0028F8DB23
:18E8700081C9F1DB82E601FE0028F8DB83C9F53A0300E6C0FE40202670
:18E88800181AF53A0300E620FE20201A180EF53A0300E603FE0228DF6E
:18E8A000FE01200ACDB8E828FB79D381F1C9CDBEE828FB79D383F1C901
:18E8B800DB800FCB47C9DB820FCB47C93EFFC921000079FE10380D3A8F
:18E8D0000400B9C0AF32040032C1FBC932C1FBCB07CB07CB07CB0721C0
:18E8E80033E606004F09C93ACCFBB7200332CBFB010000ED43C2FBC94E
:18E90000ED43C4FBC9ED43D6FBC9C5E1C9AF32CDFB3E0132D4FB32D320
:18E91800FB3E0232D5FBC388E9AF32D4FB7932D5FBFE0220173E203284
:18E93000CDFB3AC1FB32CEFB2AC2FB22CFFB3AC4FB32D1FB3ACDFBB793
:18E9480028363D32CDFB3AC1FB21CEFBBEC280E921CFFBCD1FEAC28056
:18E96000E93AC4FB21D1FBBEC280E9347EFE80380936002ACFFB232207
:18E97800CFFBAF32D3FB1808AF32CDFB3C32D3FBAF32D2FB3AC4FBB7AB
:18E990001FB71F32CAFB21CBFB7E3601B728213AC1FB21C6FBBE201120
:18E9A80021C7FBCD1FEA20093ACAFB21C9FBBE28243ACCFBB7C4C4EA5D
:18E9C0003AC1FB32C6FB2AC2FB22C7FB3ACAFB32C9FB3AD3FBB7C4957E
:18E9D800EAAF32CCFB3AC4FBE6036F26002929292929292911D8FB1902
:18E9F000EB2AD6FB0E803AD4FBB720063E0132CCFBEB1A1377230D209E
:18EA0800F93AD5FBFE013AD2FBC0B7C0AF32CCFBCDC4EA3AD2FBC9EBD8
:18EA200021C2FB1ABEC013231ABEC92AC7FBCB05CB05CB05CB05CB0595
:18EA38007DE6E06F3AC9FB85329DFB2AC7FBCB0DCB0DCB0D7DE61F6F62
:18EA5000CB04CB04CB04CB04CB047CE620673AC6FBCB07CB07CB07CB7E
:18EA680007CB07CB07E6C08485329EFB3AC6FBCB0FCB0FE603329FFB0D
:18EA80003E0032A0FB3A9FFBD38C3A9EFBD38B3A9DFBD38AC9F5C5E578
:18EA9800DB89FE8020FACD2BEA3E00D3890E0421D8FB0680DB89FEE020
:18EAB00020FADB8877230520F30D20EEE1C1F1AF32D2FBC9F5C5E5DB80
:18EAC80089FE8020FACD2BEA3E01D3890E0421D8FB0680DB89FEA020EA
:18EAE000FAC5066410FEC17ED388230520ED0D20E8E1C1F1AF32D2FBC2
:15EAF800C9E3F5C57EFE0028074FCD96E82318F423C1F1E3C9AE
:04FB9D000000000064
:15FDD8003E01D338F1FE0128043E0118023E00320300C300E63B
:12FFE8003E01D33821004111000101008FEDB0C300E673
:02FFFE00D8FD2C
:00000001FF

View File

@@ -0,0 +1,6 @@
:18400000CD6440436865636B2043483337367320636F6D6D756E696320
:184018006174696F6E0D0A00CD644053656E6420410D0A003E05D320B5
:184030003E06D3203E41D320AFD320DB20EEFFCD644052656365697676
:1840480065642000CFCD64400D0A00C9063978FE2FC8D320AFDB20CF3F
:154060000518F3C9E3F5C57EFE002804CF2318F723C1F1E3C9AB
:00000001FF

View File

@@ -0,0 +1,238 @@
:18D00000C35CD3C358D37F00436F7079726967687420313937392028BE
:18D018006329206279204469676974616C20526573656172636820200E
:18D0300020202020000000000000000000000000000000000000000068
:18D04800000000000000000000000000000000000000000000000000D0
:18D06000000000000000000000000000000000000000000000000000B8
:18D078000000000000000000000000000000000008D000005F0E02C396
:18D090000500C5CD8CD0C1C93E0DCD92D03E0AC392D03E20C392D0C5DC
:18D0A800CD98D0E17EB7C823E5CD8CD0E1C3ACD00E0DC305005F0E0EAE
:18D0C000C30500CD050032EED73CC90E0FC3C3D0AF32EDD711CDD7C332
:18D0D800CBD00E10C3C3D00E11C3C3D00E12C3C3D011CDD7C3DFD00E11
:18D0F00013C30500CD0500B7C90E14C3F4D011CDD7C3F9D00E15C3F437
:18D10800D00E16C3C3D00E17C305001EFF0E20C30500CD13D18787877F
:18D120008721EFD7B6320400C93AEFD7320400C9FE61D8FE7BD0E65F10
:18D13800C93AABD7B7CA96D13AEFD7B73E00C4BDD011ACD7CDCBD0CA66
:18D1500096D13ABBD73D32CCD711ACD7CDF9D0C296D11107D0218000A6
:18D168000680CD42D421BAD73600233511ACD7CDDAD0CA96D13AEFD7CA
:18D18000B7C4BDD02108D0CDACD0CDC2D1CAA7D1CDDDD1C382D3CDDD6E
:18D19800D1CD1AD10E0A1106D0CD0500CD29D12107D0462378B7CABA4A
:18D1B000D17ECD30D17705C3ABD1772108D02288D0C90E0BCD0500B73A
:18D1C800C80E01CD0500B7C90E19C305001180000E1AC3050021ABD713
:18D1E0007EB7C83600AFCDBDD011ACD7CDEFD03AEFD7C3BDD01128D37F
:18D1F8002100D806061ABEC2CFD3132305C2FDD1C9CD98D02A8AD07E13
:18D21000FE20CA22D2B7CA22D2E5CD8CD0E123C30FD23E3FCD8CD0CD8C
:18D2280098D0CDDDD1C382D31AB7C8FE20DA09D2C8FE3DC8FE5FC8FE99
:18D240002EC8FE3AC8FE3BC8FE3CC8FE3EC8C91AB7C8FE20C013C34F74
:18D25800D2856FD024C93E0021CDD7CD59D2E5E5AF32F0D72A88D0EB61
:18D27000CD4FD2EB228AD0EBE11AB7CA89D2DE4047131AFE3ACA90D299
:18D288001B3AEFD777C396D27832F0D770130608CD30D2CAB9D223FE8A
:18D2A0002AC2A9D2363FC3ABD2771305C298D2CD30D2CAC0D213C3AFEF
:18D2B800D223362005C2B9D20603FE2EC2E9D213CD30D2CAE9D223FE87
:18D2D0002AC2D9D2363FC3DBD2771305C2C8D2CD30D2CAF0D213C3DFCF
:18D2E800D223362005C2E9D2060323360005C2F2D2EB2288D0E1010B22
:18D3000000237EFE3FC209D3040DC201D378B7C9444952204552412003
:18D31800545950455341564552454E2055534552001600000000211001
:18D33000D30E0079FE06D011CED706041ABEC24FD3132305C23CD31A15
:18D34800FE20C254D379C92305C24FD30CC333D3AF3207D031ABD7C573
:18D36000791F1F1F1FE60F5FCD15D1CDB8D032ABD7C179E60F32EFD789
:18D37800CDBDD03A07D0B7C298D331ABD7CD98D0CDD0D1C641CD8CD0C8
:18D390003E3ECD8CD0CD39D1118000CDD8D1CDD0D132EFD7CD5ED2C4DB
:18D3A80009D23AF0D7B7C2A5D6CD2ED321C1D35F160019197E23666FFD
:18D3C000E977D41FD55DD5ADD510D68ED6A5D621F3762200D02100D047
:18D3D800E901DFD3C3A7D052656164206572726F720001F0D3C3A7D0A3
:18D3F0004E6F2066696C6500CD5ED23AF0D7B7C209D221CED7010B0084
:18D408007EFE20CA33D423D630FE0AD209D25778E6E0C209D278070709
:18D420000780DA09D280DA09D282DA09D2470DC208D4C97EFE20C2092A
:18D43800D2230DC233D478C906037E12231305C242D4C921800081CD6C
:18D4500059D27EC9AF32CDD73AF0D7B7C83D21EFD7BEC8C3BDD03AF029
:18D46800D7B7C83D21EFD7BEC83AEFD7C3BDD0CD5ED2CD54D421CED7A4
:18D480007EFE20C28FD4060B363F2305C288D41E00D5CDE9D0CCEAD305
:18D49800CA1BD53AEED70F0F0FE6604F3E0ACD4BD417DA0FD5D17B1C90
:18D4B000D5E603F5C2CCD4CD98D0C5CDD0D1C1C641CD92D03E3ACD9219
:18D4C800D0C3D4D4CDA2D03E3ACD92D0CDA2D0060178CD4BD4E67FFE1E
:18D4E00020C2F9D4F1F5FE03C2F7D43E09CD4BD4E67FFE20CA0ED53E70
:18D4F80020CD92D00478FE0CD20ED5FE09C2D9D4CDA2D0C3D9D4F1CDAF
:18D51000C2D1C21BD5CDE4D0C398D4D1C386D7CD5ED2FE0BC242D5013D
:18D5280052D5CDA7D0CD39D12107D035C282D3237EFE59C282D3232211
:18D5400088D0CD54D411CDD7CDEFD03CCCEAD3C386D7416C6C20287986
:18D558002F6E293F00CD5ED2C209D2CD54D4CDD0D0CAA7D5CD98D0211E
:18D57000F1D736FF21F1D77EFE80DA87D5E5CDFED0E1C2A0D5AF773499
:18D58800218000CD59D27EFE1ACA86D7CD8CD0CDC2D1C286D7C374D581
:18D5A0003DCA86D7CDD9D3CD66D4C309D2CDF8D3F5CD5ED2C209D2CDFD
:18D5B80054D411CDD7D5CDEFD0D1CD09D1CAFBD5AF32EDD7F16F2600E0
:18D5D000291100017CB5CAF1D52BE521800019E5CDD8D111CDD7CD049C
:18D5E800D1D1E1C2FBD5C3D4D511CDD7CDDAD03CC201D60107D6CDA757
:18D60000D0CDD5D1C386D74E6F20737061636500CD5ED2C209D23AF002
:18D61800D7F5CD54D4CDE9D0C279D621CDD711DDD70610CD42D42A886D
:18D63000D0EBCD4FD2FE3DCA3FD6FE5FC273D6EB232288D0CD5ED2C270
:18D6480073D6F14721F0D77EB7CA59D6B870C273D670AF32CDD7CDE955
:18D66000D0CA6DD611CDD7CD0ED1C386D7CDEAD3C386D7CD66D4C309D7
:18D67800D20182D6CDA7D0C386D746696C652065786973747300CDF806
:18D69000D3FE10D209D25F3ACED7FE20CA09D2CD15D1C389D7CDF5D18A
:18D6A8003ACED7FE20C2C4D63AF0D7B7CA89D73D32EFD7CD29D1CDBDA9
:18D6C000D0C389D711D6D71AFE20C209D2D5CD54D4D12183D7CD40D4D5
:18D6D800CDD0D0CA6BD7210001E5EBCDD8D111CDD7CDF9D0C201D7E193
:18D6F000118000191100D07D937C9AD271D7C3E1D6E13DC271D7CD6682
:18D70800D4CD5ED221F0D7E57E32CDD73E10CD60D2E17E32DDD7AF32A4
:18D72000EDD7115C0021CDD70621CD42D42108D07EB7CA3ED7FE20CAFC
:18D738003ED723C330D706001181007E12B7CA4FD7042313C343D77879
:18D75000328000CD98D0CDD5D1CD1AD1CD000131ABD7CD29D1CDBDD00D
:18D76800C382D3CD66D4C309D2017AD7CDA7D0C386D7426164206C6F34
:18D78000616400434F4DCD66D4CD5ED23ACED7D62021F0D7B6C209D2D9
:18D79800C382D3000000000000000000000000000000000000242424F5
:18D7B000202020202053554200000000000000000000000000000000D7
:18D7C800000000000000202020202020202020202000000000002020A9
:18D7E00020202020202020202000000000000000000000000000000011
:18D7F8000000000000000000001600000000C311D899D8A5D8ABD8B135
:18D81000D8EB2243DBEB7B32D6E52100002245DB39220FDB3141DBAF06
:18D8280032E0E532DEE52174E5E579FE29D04B2147D85F160019195E9D
:18D8400023562A43DBEBE903E6C8DA90D9CEDA12E60FE6D4DAEDDAF34A
:18D85800DAF8DAE1D9FEDA7EE483E445E49CE4A5E4ABE4C8E4D7E4E0A9
:18D87000E4E6E4ECE4F5E4FEE404E50AE511E52CDD17E51DE526E52D5A
:18D88800E541E547E54DE50EE453E504DB04DB9BE521CAD8CDE5D8FE6C
:18D8A00003CA0000C921D5D8C3B4D821E1D8C3B4D821DCD8CDE5D8C372
:18D8B800000042646F7320457272204F6E20203A20244261642053650D
:18D8D00063746F722453656C6563742446696C6520522F4F24E5CDC9D1
:18D8E800D93A42DBC64132C6D801BAD8CDD3D9C1CDD3D9210EDB7E361D
:18D9000000B7C0C309E6CDFBD8CD14D9D8F54FCD90D9F1C9FE0DC8FEAF
:18D918000AC8FE09C8FE08C8FE20C93A0EDBB7C245D9CD06E6E601C87F
:18D93000CD09E6FE13C242D9CD09E6FE03CA0000AFC9320EDB3E01C913
:18D948003A0ADBB7C262D9C5CD23D9C1C5CD0CE6C1C53A0DDBB7C40FEF
:18D96000E6C179210CDBFE7FC834FE20D0357EB7C879FE08C279D93526
:18D97800C9FE0AC03600C979CD14D9D290D9F50E5ECD48D9F1F6404FD4
:18D9900079FE09C248D90E20CD48D93A0CDBE607C296D9C9CDACD90E98
:18D9A80020CD0CE60E08C30CE60E23CD48D9CDC9D93A0CDB210BDBBE49
:18D9C000D00E20CD48D9C3B9D90E0DCD48D90E0AC348D90AFE24C80312
:18D9D800C54FCD90D9C1C3D3D93A0CDB320BDB2A43DB4E23E50600C51B
:18D9F000E5CDFBD8E67FE1C1FE0DCAC1DAFE0ACAC1DAFE08C216DA7886
:18DA0800B7CAEFD9053A0CDB320ADBC370DAFE7FC226DA78B7CAEFD973
:18DA20007E052BC3A9DAFE05C237DAC5E5CDC9D9AF320BDBC3F1D9FEB9
:18DA380010C248DAE5210DDB3E019677E1C3EFD9FE18C25FDAE13A0B05
:18DA5000DB210CDBBED2E1D935CDA4D9C34EDAFE15C26BDACDB1D9E1D5
:18DA6800C3E1D9FE12C2A6DAC5CDB1D9C1E1E5C578B7CA8ADA234E059C
:18DA8000C5E5CD7FD9E1C1C378DAE53A0ADBB7CAF1D9210CDB96320ADF
:18DA9800DBCDA4D9210ADB35C299DAC3F1D9237704C5E54FCD7FD9E1B7
:18DAB000C17EFE0378C2BDDAFE01CA0000B9DAEFD9E1700E0DC348D9D9
:18DAC800CD06D9C301DBCD15E6C301DB793CCAE0DA3CCA06E6C30CE6B4
:18DAE000CD06E6B7CA91E5CD09E6C301DB3A0300C301DB21030071C9E9
:18DAF800EB4D44C3D3D9CD23D93245DBC93E01C301DB00020000000067
:18DB1000000000000000000000000000000000000000000000000000FD
:18DB2800000000000000000000000000000000000000000000000000E5
:18DB400000000000000000210BD85E2356EBE90C0DC81A771323C35063
:18DB5800DB3A42DB4FCD1BE67CB5C85E23562322B3E5232322B5E52394
:18DB70002322B7E52323EB22D0E521B9E50E08CD4FDB2ABBE5EB21C151
:18DB8800E50E0FCD4FDB2AC6E57C21DDE536FFB7CA9DDB36003EFFB700
:18DBA000C9CD18E6AF2AB5E57723772AB7E5772377C9CD27E6C3BBDB82
:18DBB800CD2AE6B7C82109D8C34ADB2AEAE50E02CDEADC22E5E522EC79
:18DBD000E521E5E54E23462AB7E55E23562AB5E57E23666F7993789AC1
:18DBE800D2FADBE52AC1E57B955F7A9C57E12BC3E4DBE52AC1E519DAB7
:18DC00000FDC7995789CDA0FDCEBE123C3FADBE1C5D5E5EB2ACEE51972
:18DC1800444DCD1EE6D12AB5E5732372D12AB7E5732372C179934F78C2
:18DC30009A472AD0E5EBCD30E64D44C321E621C3E54E3AE3E5B71F0DF7
:18DC4800C245DC473E08964F3AE2E50DCA5CDCB717C353DC80C92A43E9
:18DC6000DB11100019093ADDE5B7CA71DC6E2600C9095E2356EBC9CD06
:18DC78003EDC4F0600CD5EDC22E5E5C92AE5E57DB4C93AC3E52AE5E5A5
:18DC9000293DC290DC22E7E53AC4E54F3AE3E5A1B56F22E5E5C92A43DF
:18DCA800DB110C0019C92A43DB110F0019EB21110019C9CDAEDC7E3203
:18DCC000E3E5EB7E32E1E5CDA6DC3AC5E5A632E2E5C9CDAEDC3AD5E53D
:18DCD800FE02C2DEDCAF4F3AE3E58177EB3AE1E577C90C0DC87CB71F62
:18DCF000677D1F6FC3EBDC0E802AB9E5AF86230DC2FDDCC90C0DC829F7
:18DD0800C305DDC53A42DB4F210100CD04DDC179B56F78B467C92AAD92
:18DD2000E53A42DB4FCDEADC7DE601C921ADE54E2346CD0BDD22ADE5CD
:18DD38002AC8E523EB2AB3E5732372C9CD5EDD110900197E17D0210F8B
:18DD5000D8C34ADBCD1EDDC8210DD8C34ADB2AB9E53AE9E5856FD024C5
:18DD6800C92A43DB110E00197EC9CD69DD3600C9CD69DDF68077C92A0E
:18DD8000EAE5EB2AB3E57B96237A9EC9CD7FDDD813722B73C97B956F8E
:18DD98007A9C67C90EFF2AECE5EB2ACCE5CD95DDD0C5CDF7DC2ABDE51F
:18DDB000EB2AECE519C10CCAC4DDBEC8CD7FDDD0CD2CDDC977C9CD9C5D
:18DDC800DDCDE0DD0E01CDB8DBC3DADDCDE0DDCDB2DB21B1E5C3E3DDD5
:18DDE00021B9E54E2346C324E62AB9E5EB2AB1E50E80C34FDB21EAE50A
:18DDF8007E23BEC03CC921FFFF22EAE5C92AC8E5EB2AEAE52322EAE547
:18DE1000CD95DDD219DEC3FEDD3AEAE5E60306058705C220DE32E9E50B
:18DE2800B7C0C5CDC3DBCDD4DDC1C39EDD79E6073C5F57790F0F0FE6DA
:18DE40001F4F788787878787B14F780F0F0FE61F472ABFE5097E071DD7
:18DE5800C256DEC9D5CD35DEE6FEC1B10F15C264DE77C9CD5EDD111057
:18DE70000019C50E11D10DC8D53ADDE5B7CA88DEC5E54E0600C38EDE12
:18DE88000DC54E2346E579B0CA9DDE2AC6E57D917C98D45CDEE123C1DC
:18DEA000C375DE2AC6E50E03CDEADC23444D2ABFE53600230B78B1C20A
:18DEB800B1DE2ACAE5EB2ABFE5732372CDA1DB2AB3E53603233600CDBF
:18DED000FEDD0EFFCD05DECDF5DDC8CD5EDD3EE5BECAD2DE3A41DBBEC4
:18DEE800C2F6DE237ED624C2F6DE3D3245DB0E01CD6BDECD8CDDC3D2DC
:18DF0000DE3AD4E5C301DBC5F53AC5E52F4779A04FF1A091E61FC1C96C
:18DF18003EFF32D4E521D8E5712A43DB22D9E5CDFEDDCDA1DB0E00CD86
:18DF300005DECDF5DDCA94DF2AD9E5EB1AFEE5CA4ADFD5CD7FDDD1D2B6
:18DF480094DFCD5EDD3AD8E54F060079B7CA83DF1AFE3FCA7CDF78FEAC
:18DF60000DCA7CDFFE0C1ACA73DF96E67FC22DDFC37CDFC54ECD07DF8A
:18DF7800C1C22DDF1323040DC353DF3AEAE5E6033245DB21D4E57E1713
:18DF9000D0AF77C9CDFEDD3EFFC301DBCD54DD0E0CCD18DFCDF5DDC8F3
:18DFA800CD44DDCD5EDD36E50E00CD6BDECDC6DDCD2DDFC3A4DF5059F4
:18DFC00079B0CAD1DF0BD5C5CD35DE1FD2ECDFC1D12AC6E57B957A9CD8
:18DFD800D2F4DF13C5D5424BCD35DE1FD2ECDFD1C1C3C0DF173CCD643E
:18DFF000DEE1D1C979B0C2C0DF210000C90E001E20D506002A43DB09D4
:18E00800EBCD5EDDC1CD4FDBCDC3DBC3C6DDCD54DD0E0CCD18DF2A433B
:18E02000DB7E1110001977CDF5DDC8CD44DD0E101E0CCD01E0CD2DDFBA
:18E03800C327E00E0CCD18DFCDF5DDC80E001E0CCD01E0CD2DDFC340FF
:18E05000E00E0FCD18DFCDF5DDC8CDA6DC7EF5E5CD5EDDEB2A43DB0EA0
:18E0680020D5CD4FDBCD78DDD1210C00194E210F001946E1F17779BE1E
:18E0800078CA8BE03E00DA8BE03E802A43DB110F001977C97E23B62B57
:18E09800C01A7713231A771B2BC9AF3245DB32EAE532EBE5CD1EDDC0BD
:18E0B000CD69DDE680C00E0FCD18DFCDF5DDC8011000CD5EDD09EB2AA0
:18E0C80043DB090E103ADDE5B7CAE8E07EB71AC2DBE077B7C2E1E07EBB
:18E0E00012BEC21FE1C3FDE0CD94E0EBCD94E0EB1ABEC21FE113231AB4
:18E0F800BEC21FE10D13230DC2CDE001ECFF09EB091ABEDA17E17701C6
:18E11000030009EB097E123EFF32D2E5C310E02145DB35C9CD54DD2A27
:18E1280043DBE521ACE52243DB0E01CD18DFCDF5DDE12243DBC8EB2183
:18E140000F00190E11AF77230DC246E1210D001977CD8CDDCDFDDFC3E1
:18E1580078DDAF32D2E5CDA2E0CDF5DDC82A43DB010C00097E3CE61FEF
:18E1700077CA83E1473AC5E5A021D2E5A6CA8EE1C3ACE10102000934E0
:18E188007EE60FCAB6E10E0FCD18DFCDF5DDC2ACE13AD3E53CCAB6E14D
:18E1A000CD24E1CDF5DDCAB6E1C3AFE1CD5AE0CDBBDCAFC301DBCD05B7
:18E1B800DBC378DD3E0132D5E53EFF32D3E5CDBBDC3AE3E521E1E5BEFF
:18E1D000DAE6E1FE80C2FBE1CD5AE1AF32E3E53A45DBB7C2FBE1CD77D6
:18E1E800DCCD84DCCAFBE1CD8ADCCDD1DBCDB2DBC3D2DCC305DB3E0117
:18E2000032D5E53E0032D3E5CD54DD2A43DBCD47DDCDBBDC3AE3E5FE57
:18E2180080D205DBCD77DCCD84DC0E00C26EE2CD3EDC32D7E501000079
:18E23000B7CA3BE24F0BCD5EDC444DCDBEDF7DB4C248E23E02C301DBE0
:18E2480022E5E5EB2A43DB011000093ADDE5B73AD7E5CA64E2CD64DDBE
:18E2600073C36CE24F060009097323720E023A45DBB7C0C5CD8ADC3AA0
:18E27800D5E53D3DC2BBE2C1C5793D3DC2BBE2E52AB9E557772314F27F
:18E290008CE2CDE0DD2AE7E50E0222E5E5C5CDD1DBC1CDB8DB2AE5E539
:18E2A8000E003AC4E547A5B823C29AE2E122E5E5CDDADDCDD1DBC1C518
:18E2C000CDB8DBC13AE3E521E1E5BEDAD2E277340E020000210000F51F
:18E2D800CD69DDE67F77F1FE7FC200E33AD5E5FE01C200E3CDD2DCCD4C
:18E2F0005AE12145DB7EB7C2FEE23D32E3E53600C3D2DCAF32D5E5C585
:18E308002A43DBEB212100197EE67FF57E17237E17E61F4F7E1F1F1F1B
:18E320001FE60F47F1236E2C2D2E06C28BE32120001977210C001979BB
:18E3380096C247E3210E00197896E67FCA7FE3C5D5CDA2E0D1C12E03B8
:18E350003A45DB3CCA84E3210C001971210E001970CD51E03A45DB3CEB
:18E36800C27FE3C1C52E040CCA84E3CD24E12E053A45DB3CCA84E3C1F7
:18E38000AFC301DBE5CD69DD36C0E1C17D3245DBC378DD0EFFCD03E300
:18E39800CCC1E1C90E00CD03E3CC03E2C9EB194E0600210C00197E0FD0
:18E3B000E680814F3E0088477E0FE60F8047210E00197E87878787F5F2
:18E3C8008047F5E17DE1B5E601C90E0CCD18DF2A43DB11210019E57215
:18E3E00023722372CDF5DDCA0CE4CD5EDD110F00CDA5E3E1E55F7996F1
:18E3F80023789E237B9EDA06E4732B702B71CD2DDFC3E4E3E1C92A43B0
:18E41000DB112000CDA5E3212100197123702377C92AAFE53A42DB4F6D
:18E42800CDEADCE5EBCD59DBE1CC47DB7D1FD82AAFE54D44CD0BDD220F
:18E44000AFE5C3A3DE3AD6E52142DBBEC877C321E43EFF32DEE52A4355
:18E45800DB7EE61F3D32D6E5FE1ED275E43A42DB32DFE57E32E0E5E635
:18E47000E077CD45E43A41DB2A43DBB677C93E22C301DB21000022ADC4
:18E48800E522AFE5AF3242DB21800022B1E5CDDADDC321E4CD72DDCD55
:18E4A00051E4C351E0CD51E4C3A2E00E00EB7EFE3FCAC2E4CDA6DC7E03
:18E4B800FE3FC472DDCD51E40E0FCD18DFC3E9DD2AD9E52243DBCD514A
:18E4D000E4CD2DDFC3E9DDCD51E4CD9CDFC301DFCD51E4C3BCE1CD5181
:18E4E800E4C3FEE1CD72DDCD51E4C324E1CD51E4CD16E0C301DF2AAF6F
:18E50000E5C329E53A42DBC301DBEB22B1E5C3DADD2ABFE5C329E52A71
:18E51800ADE5C329E5CD51E4CD3BE0C301DF2ABBE52245DBC93AD6E531
:18E53000FEFFC23BE53A41DBC301DBE61F3241DBC9CD51E4C393E3CDDB
:18E5480051E4C39CE3CD51E4C3D2E32A43DB7D2F5F7C2F2AAFE5A45713
:18E560007DA35F2AADE5EB22AFE57DA36F7CA26722ADE5C93ADEE5B782
:18E57800CA91E52A43DB36003AE0E5B7CA91E5773ADFE532D6E5CD4563
:18E59000E42A0FDBF92A45DB7D44C9CD51E43E0232D5E50E00CD07E3BB
:18E5A800CC03E2C9E5000000008000000000000000000000000000007C
:18E5C00000000000000000000000000000000000000000000000000043
:18E5D8000000000000000000000000000000000000000000000000002B
:18E5F00000000000000000000000000000000000C30000C30000C300CA
:18E6080000C30000C30000C30000C30000C30000C30000C30000C300E2
:13E6200000C30000C30000C30000C30000C30000C3000055
:00000001FF

View File

@@ -0,0 +1,19 @@
:180100003E00326D02327102327202327002218000226E02CD3902FEE0
:1801180055CA2A02FE3A20F40E13115C00CD05000E16115C00CD050075
:18013000CD3902FE3E286147C5CD3902C14FCD4C02473A710280327194
:18014800023A72023C327202782A6E027723226E023A6D023C326D0249
:18016000FE8020320E15115C00CD05003E2ECD45023A70023CFE40208F
:180178000F3270023E0DCD45023E0ACD45023E00327002218000226EEE
:18019000023E00326D0218983A6D02FE00280D0E15115C00CD05003E4A
:1801A8002ECD45020E10115C00CD0500CD390247C5CD3902C14FCD4C5B
:1801C00002473A720290FE00281A3E0DCD45023E0ACD45021191020EF3
:1801D80009CD0500CD3902CD3902183CCD390247C5CD3902C14FCD4C8B
:1801F00002473A710290FE0028143E0DCD45023E0ACD45021176020EE5
:1802080009CD050018123E0DCD45023E0ACD45021173020E09CD0500AF
:180220000E201E00CD0500C30000CD3902CD65025F0E20CD0500C31473
:18023800011EFF0E06CD0500FE0028F5C90E025FCD0500C978D630FE40
:180250000A3802D607070707074779D630FE0A3802D60780C9D630FE27
:180268000AD8D607C90000000000004F4B243D3D3D3D3D3D4368656357
:180280006B73756D204572726F723D3D3D3D3D3D243D3D3D3D3D3D4636
:17029800696C65204C656E677468204572726F723D3D3D3D3D3D24D7
:00000001FF

View File

@@ -0,0 +1,15 @@
:204100003E00326D02327102327202327002218000226E02CD3902FE55CA2A02FE3A20F401
:204120000E13115C00CD05000E16115C00CD0500CD3902FE3E286147C5CD3902C14FCD4CB2
:2041400002473A7102803271023A72023C327202782A6E027723226E023A6D023C326D02F0
:20416000FE8020320E15115C00CD05003E2ECD45023A70023CFE40200F3270023E0DCD4537
:20418000023E0ACD45023E00327002218000226E023E00326D0218983A6D02FE00280D0E33
:2041A00015115C00CD05003E2ECD45020E10115C00CD0500CD390247C5CD3902C14FCD4C89
:2041C00002473A720290FE00281A3E0DCD45023E0ACD45021191020E09CD0500CD3902CDFB
:2041E0003902183CCD390247C5CD3902C14FCD4C02473A710290FE0028143E0DCD45023E8E
:204200000ACD45021176020E09CD050018123E0DCD45023E0ACD45021173020E09CD0500BA
:204220000E201E00CD0500C30000CD3902CD65025F0E20CD0500C314011EFF0E06CD050027
:20424000FE0028F5C90E025FCD0500C978D630FE0A3802D607070707074779D630FE0A38B1
:2042600002D60780C9D630FE0AD8D607C90000000000004F4B243D3D3D3D3D3D43686563EB
:204280006B73756D204572726F723D3D3D3D3D3D243D3D3D3D3D3D46696C65204C656E670E
:2042A0007468204572726F723D3D3D3D3D3D24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77
:00000001FF

View File

@@ -0,0 +1,16 @@
:18500000CDD55043502F4D20466F726D617474657220322E3020627918
:1850180020472E20536561726C6520323031330D0A003E4132E7503A50
:18503000E750CF3C32E7503E2032E6503AE650D38A3E00D38B3E00D37D
:185048008C3EE0CDA7503AE6503C32E650FE4020E311400021400006D5
:185060000F3AE750CF3C32E7503E0032E6503AE650D38A7DD38B7CD3A7
:185078008CCDA7503AE6503C32E650FE2020E7190520D6CDD5500D0A7A
:18509000466F726D617474696E6720636F6D706C6574650D0A00C9F59F
:1850A800C5E5DB89FE8020FA3E01D3890E0421E8500680DB89FEA0209C
:1850C000FAC5066410FEC17ED388230520ED0D20E5E1C1F1C9E3F5C5C7
:1850D8007EFE002804CF2318F723C1F1E3C90000E520202020202020D1
:1850F00020202020000000000000000000000000000000000000000028
:18510800E520202020202020202020200000000000000000000000004A
:185120000000000000000000E520202020202020202020200000000032
:1851380000000000000000000000000000000000E5202020202020209A
:18515000202020200000000000000000000000000000000000000000C7
:00000001FF

View File

@@ -0,0 +1,10 @@
:18500000CDBA5043502F4D2053797374656D205472616E736665722088
:18501800627920472E20536561726C6520323031322D31330D0A000601
:18503000183E0032CB5032CC5032CD5032CE502100D022CF50CD8C50FD
:185048001100022ACF501922CF503ACB503C32CB5010EACDBA500D0AD4
:1850600053797374656D207472616E7366657220636F6D706C657465B5
:185078000D0A00C93ACD50D38C3ACC50D38B3ACB50D38AC9F5C5E5DBE1
:1850900089FE8020FACD7C503E01D3890E040680DB89FEA020FAC50634
:1850A8006410FEC17ED388230520ED0D20E8E1C1F1C9E3F5C57EFE0025
:1150C0002804CF2318F723C1F1E3C900000000000031
:00000001FF

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,52 @@
:0430040000000000C8
:180000000D0A426F6F742043502F4D3F000D0A4C6F6164696E67204397
:18001800502F4D2E2E2E0D0A0043502F4D20426F6F7420524F4D203240
:180030002E3020627920472E20536561726C650D0A0D0A4243206F729A
:18004800204257202D20524F4D20424153494320436F6C642F5761720F
:180060006D0D0A5820202020202020202D20426F6F742043502F4D207C
:18007800286C6F61642024443030302D2446464646290D0A3A6E6E6E63
:180090006E2E2E2E202D204C6F616420496E74656C2D48657820666916
:1800A8006C65207265636F72640D0A476E6E6E6E202020202D20527526
:1800C0006E206C6F63206E6E6E6E0D0A000D0A436F6C64206F7220773C
:1800D80061726D3F0D0A00436865636B73756D206572726F720D0A00E6
:1800F0000C5072657373205B53504143455D20746F2061637469766100
:18010800746520636F6E736F6C650D0A00436F6D706C6574650D0A008C
:180120000000000020427974657320667265650D0A00005A38302042A3
:18013800415349432056657220342E37620D0A436F7079726967687457
:18015000202843292031393738206279204D6963726F736F66740D0A02
:1801680000004D656D6F727920746F7000000000000000B330000000B0
:1801800000000000000000000000000000000000000000000000000166
:18019800310000000000000000000000000000000000000000C54E44C7
:1801B000C64F52CE455854C4415441C94E505554C4494DD2454144CCA5
:1801C8004554C74F544FD2554EC946D24553544F5245C74F535542D2D3
:1801E000455455524ED2454DD3544F50CF5554CF4ECE554C4CD741499E
:1801F80054C44546D04F4B45C44F4B45D3435245454ECC494E4553C3FC
:180210004C53D749445448CD4F4E49544F52D34554D245534554D052FE
:18022800494E54C34F4E54CC495354C34C454152C34C4F4144C3534142
:180240005645CE4557D4414228D44FC64ED3504328D448454ECE4F543D
:18025800D3544550ABADAAAFDEC14E44CF52BEBDBCD3474EC94E54C104
:180270004253D55352C65245C94E50D04F53D35152D24E44CC4F47C530
:180288005850C34F53D3494ED4414EC1544ED045454BC445454BD04FC4
:1802A000494E54CC454ED3545224D6414CC15343C3485224C84558249B
:1802B800C2494E24CC45465424D24947485424CD4944248000000000C2
:1802D0000000B50300000000000000000000000000000000000000005E
:1802E80000000000000000000000000000000000000000000000980462
:1803000000009904043107310000000000000000000000000000790062
:18031800007900007C00007C00007F000050000046E8034E46534E52D5
:18033000474F4446434F564F4D554C425344442F304944544D4F534CD8
:18034800535354434E55464D4F4858424E000000354ACA99391C769866
:180360002295B3980ADD479853D199990A1A9F9865BCCD98D6773E9863
:1803780052C74F8001FF1C000014001400000000000D32FEFFAA31200A
:180390004572726F720020696E20004F6B0D0A0000427265616B003E40
:1803A8000101010101013E3EA6F6212C3E013AB43E88A9293F526564B3
:1803C0006F2066726F6D2073746172740D0A003B3EF62C3F4578747200
:1803D800612069676E6F7265640D0A00F628292CF600002CF629113E8A
:1803F000162829B4A70E112C29292C2C2C210000008103AA561980F1E3
:1804080022768045AA388221D2FE00000080A08601102700E8030064FD
:1804200000000A000001000008402E9474704F2E776E02887AE6A02AB5
:180438007C50AAAA7EFFFF7F7F00008081000000810668B1466899E941
:18045000926910D17568DB0F49810000007F05BAD71E8664269987586C
:18046800342387E05DA586DA0F4983094AD73B78026E847BFEC12F7CCB
:1804800074319A7D843D5A7DC87F917EE4BB4C7E6CAAAA7F0000008191
:010498002C37
:00000001FF

View File

@@ -0,0 +1,947 @@
0001 0000 ;==================================================================================
0002 0000 ; Contents of this file are copyright Grant Searle
0003 0000 ; Blocking/unblocking routines are the published version by Digital Research
0004 0000 ; (bugfixed, as found on the web)
0005 0000 ;
0006 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY
0007 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself.
0008 0000 ;
0009 0000 ; http://searle.hostei.com/grant/index.html
0010 0000 ;
0011 0000 ; eMail: home.micros01@btinternet.com
0012 0000 ;
0013 0000 ; If the above don't work, please perform an Internet search to see if I have
0014 0000 ; updated the web page hosting service.
0015 0000 ;
0016 0000 ;==================================================================================
0017 0000
0018 0000 ccp .EQU 0D000h ; Base of CCP.
0019 0000 bdos .EQU ccp + 0806h ; Base of BDOS.
0020 0000 bios .EQU ccp + 1600h ; Base of BIOS.
0021 0000
0022 0000 ; Set CP/M low memory datA, vector and buffer addresses.
0023 0000
0024 0000 iobyte .EQU 03h ; Intel standard I/O definition byte.
0025 0000 userdrv .EQU 04h ; Current user number and drive.
0026 0000 tpabuf .EQU 80h ; Default I/O buffer and command line storage.
0027 0000
0028 0000
0029 0000 SD_DATA .EQU 088H
0030 0000 SD_CONTROL .EQU 089H
0031 0000 SD_STATUS .EQU 089H
0032 0000 SD_LBA0 .EQU 08AH
0033 0000 SD_LBA1 .EQU 08BH
0034 0000 SD_LBA2 .EQU 08CH
0035 0000
0036 0000 RTS_HIGH .EQU 0D5H
0037 0000 RTS_LOW .EQU 095H
0038 0000
0039 0000 ACIA0_D .EQU $81
0040 0000 ACIA0_C .EQU $80
0041 0000 ACIA1_D .EQU $83
0042 0000 ACIA1_C .EQU $82
0043 0000
0044 0000 nmi .EQU 66H
0045 0000
0046 0000 blksiz .equ 4096 ;CP/M allocation size
0047 0000 hstsiz .equ 512 ;host disk sector size
0048 0000 hstspt .equ 32 ;host disk sectors/trk
0049 0000 hstblk .equ hstsiz/128 ;CP/M sects/host buff
0050 0000 cpmspt .equ hstblk * hstspt ;CP/M sectors/track
0051 0000 secmsk .equ hstblk-1 ;sector mask
0052 0000 ;compute sector mask
0053 0000 ;secshf .equ 2 ;log2(hstblk)
0054 0000
0055 0000 wrall .equ 0 ;write to allocated
0056 0000 wrdir .equ 1 ;write to directory
0057 0000 wrual .equ 2 ;write to unallocated
0058 0000
0059 0000 LF .EQU 0AH ;line feed
0060 0000 FF .EQU 0CH ;form feed
0061 0000 CR .EQU 0DH ;carriage RETurn
0062 0000
0063 0000 ;================================================================================================
0064 0000
0065 E600 .ORG bios ; BIOS origin.
0066 E600
0067 E600 ;================================================================================================
0068 E600 ; BIOS jump table.
0069 E600 ;================================================================================================
0070 E600 C3 51 E7 JP boot ; 0 Initialize.
0071 E603 C3 B5 E7 wboote: JP wboot ; 1 Warm boot.
0072 E606 C3 1D E8 JP const ; 2 Console status.
0073 E609 C3 58 E8 JP conin ; 3 Console input.
0074 E60C C3 96 E8 JP conout ; 4 Console OUTput.
0075 E60F C3 7E E8 JP list ; 5 List OUTput.
0076 E612 C3 8A E8 JP punch ; 6 punch OUTput.
0077 E615 C3 4C E8 JP reader ; 7 Reader input.
0078 E618 C3 EF E8 JP home ; 8 Home disk.
0079 E61B C3 C7 E8 JP seldsk ; 9 Select disk.
0080 E61E C3 FB E8 JP settrk ; 10 Select track.
0081 E621 C3 00 E9 JP setsec ; 11 Select sector.
0082 E624 C3 05 E9 JP setdma ; 12 Set DMA ADDress.
0083 E627 C3 0D E9 JP read ; 13 Read 128 bytes.
0084 E62A C3 21 E9 JP write ; 14 Write 128 bytes.
0085 E62D C3 C4 E8 JP listst ; 15 List status.
0086 E630 C3 0A E9 JP sectran ; 16 Sector translate.
0087 E633
0088 E633 ;================================================================================================
0089 E633 ; Disk parameter headers for disk 0 to 15
0090 E633 ;================================================================================================
0091 E633 dpbase:
0092 E633 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb0,0000h,alv00
0092 E639 00000DEB33E700008DEB
0093 E643 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv01
0093 E649 00000DEB42E700008EEC
0094 E653 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv02
0094 E659 00000DEB42E700008FED
0095 E663 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv03
0095 E669 00000DEB42E7000090EE
0096 E673 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv04
0096 E679 00000DEB42E7000091EF
0097 E683 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv05
0097 E689 00000DEB42E7000092F0
0098 E693 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv06
0098 E699 00000DEB42E7000093F1
0099 E6A3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv07
0099 E6A9 00000DEB42E7000094F2
0100 E6B3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv08
0100 E6B9 00000DEB42E7000095F3
0101 E6C3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv09
0101 E6C9 00000DEB42E7000096F4
0102 E6D3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv10
0102 E6D9 00000DEB42E7000097F5
0103 E6E3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv11
0103 E6E9 00000DEB42E7000098F6
0104 E6F3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv12
0104 E6F9 00000DEB42E7000099F7
0105 E703 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv13
0105 E709 00000DEB42E700009AF8
0106 E713 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv14
0106 E719 00000DEB42E700009BF9
0107 E723 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv15
0107 E729 00000DEB42E700009CFA
0108 E733
0109 E733 ; First drive has a reserved track for CP/M
0110 E733 dpb0:
0111 E733 80 00 .DW 128 ;SPT - sectors per track
0112 E735 05 .DB 5 ;BSH - block shift factor
0113 E736 1F .DB 31 ;BLM - block mask
0114 E737 01 .DB 1 ;EXM - Extent mask
0115 E738 FB 07 .DW 2043 ; (2047-4) DSM - Storage size (blocks - 1)
0116 E73A FF 01 .DW 511 ;DRM - Number of directory entries - 1
0117 E73C F0 .DB 240 ;AL0 - 1 bit set per directory block
0118 E73D 00 .DB 0 ;AL1 - "
0119 E73E 00 00 .DW 0 ;CKS - DIR check vector size (DRM+1)/4 (0=fixed disk)
0120 E740 01 00 .DW 1 ;OFF - Reserved tracks
0121 E742
0122 E742 dpb:
0123 E742 80 00 .DW 128 ;SPT - sectors per track
0124 E744 05 .DB 5 ;BSH - block shift factor
0125 E745 1F .DB 31 ;BLM - block mask
0126 E746 01 .DB 1 ;EXM - Extent mask
0127 E747 FF 07 .DW 2047 ;DSM - Storage size (blocks - 1)
0128 E749 FF 01 .DW 511 ;DRM - Number of directory entries - 1
0129 E74B F0 .DB 240 ;AL0 - 1 bit set per directory block
0130 E74C 00 .DB 0 ;AL1 - "
0131 E74D 00 00 .DW 0 ;CKS - DIR check vector size (DRM+1)/4 (0=fixed disk)
0132 E74F 00 00 .DW 0 ;OFF - Reserved tracks
0133 E751
0134 E751 ;================================================================================================
0135 E751 ; Cold boot
0136 E751 ;================================================================================================
0137 E751
0138 E751 boot:
0139 E751 F3 DI ; Disable interrupts.
0140 E752 31 C1 FB LD SP,biosstack ; Set default stack.
0141 E755
0142 E755 ; Turn off ROM
0143 E755
0144 E755 3E 01 LD A,$01
0145 E757 D3 38 OUT ($38),A
0146 E759
0147 E759 3E 95 LD A,RTS_LOW
0148 E75B D3 80 OUT (ACIA0_C),A ; Initialise ACIA0
0149 E75D D3 82 OUT (ACIA1_C),A ; Initialise ACIA1
0150 E75F
0151 E75F CD F9 EA CALL printInline
0152 E762 0C .DB FF
0153 E763 43502F4D2042 .TEXT "CP/M BIOS 2.0 by G. Searle 2013"
0153 E769 494F5320322E3020627920472E20536561726C652032303133
0154 E782 0D 0A .DB CR,LF
0155 E784 0D 0A .DB CR,LF
0156 E786 43502F4D2032 .TEXT "CP/M 2.2 "
0156 E78C 2E3220
0157 E78F 28 63 29 .TEXT "(c)"
0158 E792 203139373920 .TEXT " 1979 by Digital Research"
0158 E798 6279204469676974616C205265736561726368
0159 E7AB 0D 0A 00 .DB CR,LF,0
0160 E7AE
0161 E7AE ; CALL sdPreamble??
0162 E7AE
0163 E7AE AF XOR a ; Clear I/O & drive bytes.
0164 E7AF 32 04 00 LD (userdrv),A
0165 E7B2 C3 F5 E7 JP gocpm
0166 E7B5
0167 E7B5 ;================================================================================================
0168 E7B5 ; Warm boot
0169 E7B5 ;================================================================================================
0170 E7B5
0171 E7B5 wboot:
0172 E7B5 F3 DI ; Disable interrupts.
0173 E7B6 31 C1 FB LD SP,biosstack ; Set default stack.
0174 E7B9
0175 E7B9 06 0B LD B,11 ; Number of sectors to reload
0176 E7BB
0177 E7BB 3E 00 LD A,0
0178 E7BD 32 C9 FB LD (hstsec),A
0179 E7C0 D3 8C OUT (SD_LBA2),A
0180 E7C2 D3 8B OUT (SD_LBA1),A
0181 E7C4
0182 E7C4 21 00 D0 LD HL,ccp
0183 E7C7
0184 E7C7 wbRdAllSecs:
0185 E7C7
0186 E7C7 DB 89 wBrdWait1: IN A,(SD_STATUS)
0187 E7C9 FE 80 CP 128
0188 E7CB 20 FA JR NZ,wBrdWait1
0189 E7CD
0190 E7CD 3A C9 FB LD A,(hstsec)
0191 E7D0 D3 8A OUT (SD_LBA0),A
0192 E7D2
0193 E7D2 3E 00 LD A,$00 ; 00 = Read block
0194 E7D4 D3 89 OUT (SD_CONTROL),A
0195 E7D6 C5 PUSH BC
0196 E7D7
0197 E7D7 0E 04 LD c,4
0198 E7D9 wBrd4secs:
0199 E7D9 06 80 LD b,128
0200 E7DB wBrdByte:
0201 E7DB
0202 E7DB DB 89 wBrdWait2: IN A,(SD_STATUS)
0203 E7DD FE E0 CP 224 ; Read byte waiting
0204 E7DF 20 FA JR NZ,wBrdWait2
0205 E7E1
0206 E7E1 DB 88 IN A,(SD_DATA)
0207 E7E3
0208 E7E3 77 LD (HL),A
0209 E7E4 23 INC HL
0210 E7E5 05 dec b
0211 E7E6 20 F3 JR NZ, wBrdByte
0212 E7E8
0213 E7E8 0D dec c
0214 E7E9 20 EE JR NZ,wBrd4secs
0215 E7EB
0216 E7EB 3A C9 FB LD A,(hstsec)
0217 E7EE 3C INC A
0218 E7EF 32 C9 FB LD (hstsec),A
0219 E7F2
0220 E7F2 C1 POP BC
0221 E7F3
0222 E7F3 10 D2 DJNZ wbRdAllSecs
0223 E7F5 ;================================================================================================
0224 E7F5 ; Common code for cold and warm boot
0225 E7F5 ;================================================================================================
0226 E7F5
0227 E7F5 gocpm:
0228 E7F5 AF xor a ;0 to accumulator
0229 E7F6 32 CB FB ld (hstact),a ;host buffer inactive
0230 E7F9 32 CD FB ld (unacnt),a ;clear unalloc count
0231 E7FC
0232 E7FC 21 80 00 LD HL,tpabuf ; Address of BIOS DMA buffer.
0233 E7FF 22 D6 FB LD (dmaAddr),HL
0234 E802 3E C3 LD A,0C3h ; Opcode for 'JP'.
0235 E804 32 00 00 LD (00h),A ; Load at start of RAM.
0236 E807 21 03 E6 LD HL,wboote ; Address of jump for a warm boot.
0237 E80A 22 01 00 LD (01h),HL
0238 E80D 32 05 00 LD (05h),A ; Opcode for 'JP'.
0239 E810 21 06 D8 LD HL,bdos ; Address of jump for the BDOS.
0240 E813 22 06 00 LD (06h),HL
0241 E816 3A 04 00 LD A,(userdrv) ; Save new drive number (0).
0242 E819 4F LD c,A ; Pass drive number in C.
0243 E81A
0244 E81A C3 00 D0 JP ccp ; Start CP/M by jumping to the CCP.
0245 E81D
0246 E81D ;================================================================================================
0247 E81D ; Console I/O routines
0248 E81D ;================================================================================================
0249 E81D
0250 E81D
0251 E81D ;------------------------------------------------------------------------------------------------
0252 E81D const:
0253 E81D 3A 03 00 LD A,(iobyte)
0254 E820 E6 0B AND 00001011b ; Mask off console and high bit of reader
0255 E822 FE 0A CP 00001010b ; redirected to reader on UR1/2 (Serial A)
0256 E824 28 0A JR Z,constA
0257 E826 FE 02 CP 00000010b ; redirected to reader on TTY/RDR (Serial B)
0258 E828 28 14 JR Z,constB
0259 E82A
0260 E82A E6 03 AND $03 ; remove the reader from the mask - only console bits then remain
0261 E82C FE 01 CP $01
0262 E82E 20 0E JR NZ,constB
0263 E830 constA:
0264 E830 DB 80 IN A,(ACIA0_C) ; Status byte
0265 E832 E6 01 AND $01
0266 E834 FE 00 CP $0 ; Z flag set if no char
0267 E836 28 03 JR Z, dataAEmpty
0268 E838 3E FF LD A,0FFH
0269 E83A C9 RET
0270 E83B dataAEmpty:
0271 E83B 3E 00 LD A,0
0272 E83D C9 RET
0273 E83E
0274 E83E
0275 E83E constB:
0276 E83E DB 82 IN A,(ACIA1_C) ; Status byte
0277 E840 E6 01 AND $01
0278 E842 FE 00 CP $0 ; Z flag set if no char
0279 E844 28 03 JR Z, dataBEmpty
0280 E846 3E FF LD A,0FFH
0281 E848 C9 RET
0282 E849 dataBEmpty:
0283 E849 3E 00 LD A,0
0284 E84B C9 RET
0285 E84C
0286 E84C ;------------------------------------------------------------------------------------------------
0287 E84C reader:
0288 E84C F5 PUSH AF
0289 E84D 3A 03 00 reader2: LD A,(iobyte)
0290 E850 E6 08 AND $08
0291 E852 FE 08 CP $08
0292 E854 20 1C JR NZ,coninB
0293 E856 18 0E JR coninA
0294 E858 ;------------------------------------------------------------------------------------------------
0295 E858 conin:
0296 E858 F5 PUSH AF
0297 E859 3A 03 00 LD A,(iobyte)
0298 E85C E6 03 AND $03
0299 E85E FE 02 CP $02
0300 E860 28 EB JR Z,reader2 ; "BAT:" redirect
0301 E862 FE 01 CP $01
0302 E864 20 0C JR NZ,coninB
0303 E866
0304 E866
0305 E866 coninA:
0306 E866 F1 POP AF
0307 E867 waitForCharA:
0308 E867 DB 80 IN A,(ACIA0_C) ; Status byte
0309 E869 E6 01 AND $01
0310 E86B FE 00 CP $0 ; Z flag set if no char
0311 E86D 28 F8 JR Z, waitForCharA
0312 E86F DB 81 IN A,(ACIA0_D)
0313 E871
0314 E871 C9 RET ; Char ready in A
0315 E872
0316 E872
0317 E872 coninB:
0318 E872 F1 POP AF
0319 E873 waitForCharB:
0320 E873 DB 82 IN A,(ACIA1_C) ; Status byte
0321 E875 E6 01 AND $01
0322 E877 FE 00 CP $0 ; Z flag set if no char
0323 E879 28 F8 JR Z, waitForCharB
0324 E87B DB 83 IN A,(ACIA1_D)
0325 E87D
0326 E87D C9 RET ; Char ready in A
0327 E87E
0328 E87E ;------------------------------------------------------------------------------------------------
0329 E87E F5 list: PUSH AF ; Store character
0330 E87F 3A 03 00 list2: LD A,(iobyte)
0331 E882 E6 C0 AND $C0
0332 E884 FE 40 CP $40
0333 E886 20 26 JR NZ,conoutB1
0334 E888 18 1A JR conoutA1
0335 E88A
0336 E88A ;------------------------------------------------------------------------------------------------
0337 E88A F5 punch: PUSH AF ; Store character
0338 E88B 3A 03 00 LD A,(iobyte)
0339 E88E E6 20 AND $20
0340 E890 FE 20 CP $20
0341 E892 20 1A JR NZ,conoutB1
0342 E894 18 0E JR conoutA1
0343 E896
0344 E896 ;------------------------------------------------------------------------------------------------
0345 E896 F5 conout: PUSH AF
0346 E897 3A 03 00 LD A,(iobyte)
0347 E89A E6 03 AND $03
0348 E89C FE 02 CP $02
0349 E89E 28 DF JR Z,list2 ; "BAT:" redirect
0350 E8A0 FE 01 CP $01
0351 E8A2 20 0A JR NZ,conoutB1
0352 E8A4
0353 E8A4 CD B8 E8 conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting
0354 E8A7 28 FB JR Z,conoutA1 ; Loop until ACIA flag signals ready
0355 E8A9 79 LD A,C
0356 E8AA D3 81 OUT (ACIA0_D),A ; OUTput the character
0357 E8AC F1 POP AF
0358 E8AD C9 RET
0359 E8AE
0360 E8AE CD BE E8 conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting
0361 E8B1 28 FB JR Z,conoutB1 ; Loop until ACIA flag signals ready
0362 E8B3 79 LD A,C
0363 E8B4 D3 83 OUT (ACIA1_D),A ; OUTput the character
0364 E8B6 F1 POP AF
0365 E8B7 C9 RET
0366 E8B8
0367 E8B8 ;------------------------------------------------------------------------------------------------
0368 E8B8 CKACIA0
0369 E8B8 DB 80 IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready
0370 E8BA 0F RRCA ; Rotates RX status into Carry Flag,
0371 E8BB CB 47 BIT 0,A ; Set Zero flag if still transmitting character
0372 E8BD C9 RET
0373 E8BE
0374 E8BE CKACIA1
0375 E8BE DB 82 IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready
0376 E8C0 0F RRCA ; Rotates RX status into Carry Flag,
0377 E8C1 CB 47 BIT 0,A ; Set Zero flag if still transmitting character
0378 E8C3 C9 RET
0379 E8C4
0380 E8C4 ;------------------------------------------------------------------------------------------------
0381 E8C4 3E FF listst: LD A,$FF ; Return list status of 0xFF (ready).
0382 E8C6 C9 RET
0383 E8C7
0384 E8C7 ;================================================================================================
0385 E8C7 ; Disk processing entry points
0386 E8C7 ;================================================================================================
0387 E8C7
0388 E8C7 seldsk:
0389 E8C7 21 00 00 LD HL,$0000
0390 E8CA 79 LD A,C
0391 E8CB FE 10 CP 16 ; 16 for 128MB disk, 8 for 64MB disk
0392 E8CD 38 0D jr C,chgdsk ; if invalid drive will give BDOS error
0393 E8CF 3A 04 00 LD A,(userdrv) ; so set the drive back to a:
0394 E8D2 B9 CP C ; If the default disk is not the same as the
0395 E8D3 C0 RET NZ ; selected drive then return,
0396 E8D4 AF XOR A ; else reset default back to a:
0397 E8D5 32 04 00 LD (userdrv),A ; otherwise will be stuck in a loop
0398 E8D8 32 C1 FB LD (sekdsk),A
0399 E8DB C9 ret
0400 E8DC
0401 E8DC 32 C1 FB chgdsk: LD (sekdsk),A
0402 E8DF CB 07 RLC a ;*2
0403 E8E1 CB 07 RLC a ;*4
0404 E8E3 CB 07 RLC a ;*8
0405 E8E5 CB 07 RLC a ;*16
0406 E8E7 21 33 E6 LD HL,dpbase
0407 E8EA 06 00 LD b,0
0408 E8EC 4F LD c,A
0409 E8ED 09 ADD HL,BC
0410 E8EE
0411 E8EE C9 RET
0412 E8EF
0413 E8EF ;------------------------------------------------------------------------------------------------
0414 E8EF home:
0415 E8EF 3A CC FB ld a,(hstwrt) ;check for pending write
0416 E8F2 B7 or a
0417 E8F3 20 03 jr nz,homed
0418 E8F5 32 CB FB ld (hstact),a ;clear host active flag
0419 E8F8 homed:
0420 E8F8 01 00 00 LD BC,0000h
0421 E8FB
0422 E8FB ;------------------------------------------------------------------------------------------------
0423 E8FB ED 43 C2 FB settrk: LD (sektrk),BC ; Set track passed from BDOS in register BC.
0424 E8FF C9 RET
0425 E900
0426 E900 ;------------------------------------------------------------------------------------------------
0427 E900 ED 43 C4 FB setsec: LD (seksec),BC ; Set sector passed from BDOS in register BC.
0428 E904 C9 RET
0429 E905
0430 E905 ;------------------------------------------------------------------------------------------------
0431 E905 ED 43 D6 FB setdma: LD (dmaAddr),BC ; Set DMA ADDress given by registers BC.
0432 E909 C9 RET
0433 E90A
0434 E90A ;------------------------------------------------------------------------------------------------
0435 E90A C5 sectran: PUSH BC
0436 E90B E1 POP HL
0437 E90C C9 RET
0438 E90D
0439 E90D ;------------------------------------------------------------------------------------------------
0440 E90D read:
0441 E90D ;read the selected CP/M sector
0442 E90D AF xor a
0443 E90E 32 CD FB ld (unacnt),a
0444 E911 3E 01 ld a,1
0445 E913 32 D4 FB ld (readop),a ;read operation
0446 E916 32 D3 FB ld (rsflag),a ;must read data
0447 E919 3E 02 ld a,wrual
0448 E91B 32 D5 FB ld (wrtype),a ;treat as unalloc
0449 E91E C3 88 E9 jp rwoper ;to perform the read
0450 E921
0451 E921
0452 E921 ;------------------------------------------------------------------------------------------------
0453 E921 write:
0454 E921 ;write the selected CP/M sector
0455 E921 AF xor a ;0 to accumulator
0456 E922 32 D4 FB ld (readop),a ;not a read operation
0457 E925 79 ld a,c ;write type in c
0458 E926 32 D5 FB ld (wrtype),a
0459 E929 FE 02 cp wrual ;write unallocated?
0460 E92B 20 17 jr nz,chkuna ;check for unalloc
0461 E92D ;
0462 E92D ; write to unallocated, set parameters
0463 E92D 3E 20 ld a,blksiz/128 ;next unalloc recs
0464 E92F 32 CD FB ld (unacnt),a
0465 E932 3A C1 FB ld a,(sekdsk) ;disk to seek
0466 E935 32 CE FB ld (unadsk),a ;unadsk = sekdsk
0467 E938 2A C2 FB ld hl,(sektrk)
0468 E93B 22 CF FB ld (unatrk),hl ;unatrk = sectrk
0469 E93E 3A C4 FB ld a,(seksec)
0470 E941 32 D1 FB ld (unasec),a ;unasec = seksec
0471 E944 ;
0472 E944 chkuna:
0473 E944 ; check for write to unallocated sector
0474 E944 3A CD FB ld a,(unacnt) ;any unalloc remain?
0475 E947 B7 or a
0476 E948 28 36 jr z,alloc ;skip if not
0477 E94A ;
0478 E94A ; more unallocated records remain
0479 E94A 3D dec a ;unacnt = unacnt-1
0480 E94B 32 CD FB ld (unacnt),a
0481 E94E 3A C1 FB ld a,(sekdsk) ;same disk?
0482 E951 21 CE FB ld hl,unadsk
0483 E954 BE cp (hl) ;sekdsk = unadsk?
0484 E955 C2 80 E9 jp nz,alloc ;skip if not
0485 E958 ;
0486 E958 ; disks are the same
0487 E958 21 CF FB ld hl,unatrk
0488 E95B CD 1F EA call sektrkcmp ;sektrk = unatrk?
0489 E95E C2 80 E9 jp nz,alloc ;skip if not
0490 E961 ;
0491 E961 ; tracks are the same
0492 E961 3A C4 FB ld a,(seksec) ;same sector?
0493 E964 21 D1 FB ld hl,unasec
0494 E967 BE cp (hl) ;seksec = unasec?
0495 E968 C2 80 E9 jp nz,alloc ;skip if not
0496 E96B ;
0497 E96B ; match, move to next sector for future ref
0498 E96B 34 inc (hl) ;unasec = unasec+1
0499 E96C 7E ld a,(hl) ;end of track?
0500 E96D FE 80 cp cpmspt ;count CP/M sectors
0501 E96F 38 09 jr c,noovf ;skip if no overflow
0502 E971 ;
0503 E971 ; overflow to next track
0504 E971 36 00 ld (hl),0 ;unasec = 0
0505 E973 2A CF FB ld hl,(unatrk)
0506 E976 23 inc hl
0507 E977 22 CF FB ld (unatrk),hl ;unatrk = unatrk+1
0508 E97A ;
0509 E97A noovf:
0510 E97A ;match found, mark as unnecessary read
0511 E97A AF xor a ;0 to accumulator
0512 E97B 32 D3 FB ld (rsflag),a ;rsflag = 0
0513 E97E 18 08 jr rwoper ;to perform the write
0514 E980 ;
0515 E980 alloc:
0516 E980 ;not an unallocated record, requires pre-read
0517 E980 AF xor a ;0 to accum
0518 E981 32 CD FB ld (unacnt),a ;unacnt = 0
0519 E984 3C inc a ;1 to accum
0520 E985 32 D3 FB ld (rsflag),a ;rsflag = 1
0521 E988
0522 E988 ;------------------------------------------------------------------------------------------------
0523 E988 rwoper:
0524 E988 ;enter here to perform the read/write
0525 E988 AF xor a ;zero to accum
0526 E989 32 D2 FB ld (erflag),a ;no errors (yet)
0527 E98C 3A C4 FB ld a,(seksec) ;compute host sector
0528 E98F B7 or a ;carry = 0
0529 E990 1F rra ;shift right
0530 E991 B7 or a ;carry = 0
0531 E992 1F rra ;shift right
0532 E993 32 CA FB ld (sekhst),a ;host sector to seek
0533 E996 ;
0534 E996 ; active host sector?
0535 E996 21 CB FB ld hl,hstact ;host active flag
0536 E999 7E ld a,(hl)
0537 E99A 36 01 ld (hl),1 ;always becomes 1
0538 E99C B7 or a ;was it already?
0539 E99D 28 21 jr z,filhst ;fill host if not
0540 E99F ;
0541 E99F ; host buffer active, same as seek buffer?
0542 E99F 3A C1 FB ld a,(sekdsk)
0543 E9A2 21 C6 FB ld hl,hstdsk ;same disk?
0544 E9A5 BE cp (hl) ;sekdsk = hstdsk?
0545 E9A6 20 11 jr nz,nomatch
0546 E9A8 ;
0547 E9A8 ; same disk, same track?
0548 E9A8 21 C7 FB ld hl,hsttrk
0549 E9AB CD 1F EA call sektrkcmp ;sektrk = hsttrk?
0550 E9AE 20 09 jr nz,nomatch
0551 E9B0 ;
0552 E9B0 ; same disk, same track, same buffer?
0553 E9B0 3A CA FB ld a,(sekhst)
0554 E9B3 21 C9 FB ld hl,hstsec ;sekhst = hstsec?
0555 E9B6 BE cp (hl)
0556 E9B7 28 24 jr z,match ;skip if match
0557 E9B9 ;
0558 E9B9 nomatch:
0559 E9B9 ;proper disk, but not correct sector
0560 E9B9 3A CC FB ld a,(hstwrt) ;host written?
0561 E9BC B7 or a
0562 E9BD C4 C4 EA call nz,writehst ;clear host buff
0563 E9C0 ;
0564 E9C0 filhst:
0565 E9C0 ;may have to fill the host buffer
0566 E9C0 3A C1 FB ld a,(sekdsk)
0567 E9C3 32 C6 FB ld (hstdsk),a
0568 E9C6 2A C2 FB ld hl,(sektrk)
0569 E9C9 22 C7 FB ld (hsttrk),hl
0570 E9CC 3A CA FB ld a,(sekhst)
0571 E9CF 32 C9 FB ld (hstsec),a
0572 E9D2 3A D3 FB ld a,(rsflag) ;need to read?
0573 E9D5 B7 or a
0574 E9D6 C4 95 EA call nz,readhst ;yes, if 1
0575 E9D9 AF xor a ;0 to accum
0576 E9DA 32 CC FB ld (hstwrt),a ;no pending write
0577 E9DD ;
0578 E9DD match:
0579 E9DD ;copy data to or from buffer
0580 E9DD 3A C4 FB ld a,(seksec) ;mask buffer number
0581 E9E0 E6 03 and secmsk ;least signif bits
0582 E9E2 6F ld l,a ;ready to shift
0583 E9E3 26 00 ld h,0 ;double count
0584 E9E5 29 add hl,hl
0585 E9E6 29 add hl,hl
0586 E9E7 29 add hl,hl
0587 E9E8 29 add hl,hl
0588 E9E9 29 add hl,hl
0589 E9EA 29 add hl,hl
0590 E9EB 29 add hl,hl
0591 E9EC ; hl has relative host buffer address
0592 E9EC 11 D8 FB ld de,hstbuf
0593 E9EF 19 add hl,de ;hl = host address
0594 E9F0 EB ex de,hl ;now in DE
0595 E9F1 2A D6 FB ld hl,(dmaAddr) ;get/put CP/M data
0596 E9F4 0E 80 ld c,128 ;length of move
0597 E9F6 3A D4 FB ld a,(readop) ;which way?
0598 E9F9 B7 or a
0599 E9FA 20 06 jr nz,rwmove ;skip if read
0600 E9FC ;
0601 E9FC ; write operation, mark and switch direction
0602 E9FC 3E 01 ld a,1
0603 E9FE 32 CC FB ld (hstwrt),a ;hstwrt = 1
0604 EA01 EB ex de,hl ;source/dest swap
0605 EA02 ;
0606 EA02 rwmove:
0607 EA02 ;C initially 128, DE is source, HL is dest
0608 EA02 1A ld a,(de) ;source character
0609 EA03 13 inc de
0610 EA04 77 ld (hl),a ;to dest
0611 EA05 23 inc hl
0612 EA06 0D dec c ;loop 128 times
0613 EA07 20 F9 jr nz,rwmove
0614 EA09 ;
0615 EA09 ; data has been moved to/from host buffer
0616 EA09 3A D5 FB ld a,(wrtype) ;write type
0617 EA0C FE 01 cp wrdir ;to directory?
0618 EA0E 3A D2 FB ld a,(erflag) ;in case of errors
0619 EA11 C0 ret nz ;no further processing
0620 EA12 ;
0621 EA12 ; clear host buffer for directory write
0622 EA12 B7 or a ;errors?
0623 EA13 C0 ret nz ;skip if so
0624 EA14 AF xor a ;0 to accum
0625 EA15 32 CC FB ld (hstwrt),a ;buffer written
0626 EA18 CD C4 EA call writehst
0627 EA1B 3A D2 FB ld a,(erflag)
0628 EA1E C9 ret
0629 EA1F
0630 EA1F ;------------------------------------------------------------------------------------------------
0631 EA1F ;Utility subroutine for 16-bit compare
0632 EA1F sektrkcmp:
0633 EA1F ;HL = .unatrk or .hsttrk, compare with sektrk
0634 EA1F EB ex de,hl
0635 EA20 21 C2 FB ld hl,sektrk
0636 EA23 1A ld a,(de) ;low byte compare
0637 EA24 BE cp (HL) ;same?
0638 EA25 C0 ret nz ;return if not
0639 EA26 ; low bytes equal, test high 1s
0640 EA26 13 inc de
0641 EA27 23 inc hl
0642 EA28 1A ld a,(de)
0643 EA29 BE cp (hl) ;sets flags
0644 EA2A C9 ret
0645 EA2B
0646 EA2B ;================================================================================================
0647 EA2B ; Convert track/head/sector into LBA for physical access to the disk
0648 EA2B ;================================================================================================
0649 EA2B setLBAaddr:
0650 EA2B 2A C7 FB LD HL,(hsttrk)
0651 EA2E CB 05 RLC L
0652 EA30 CB 05 RLC L
0653 EA32 CB 05 RLC L
0654 EA34 CB 05 RLC L
0655 EA36 CB 05 RLC L
0656 EA38 7D LD A,L
0657 EA39 E6 E0 AND 0E0H
0658 EA3B 6F LD L,A
0659 EA3C 3A C9 FB LD A,(hstsec)
0660 EA3F 85 ADD A,L
0661 EA40 32 9D FB LD (lba0),A
0662 EA43
0663 EA43 2A C7 FB LD HL,(hsttrk)
0664 EA46 CB 0D RRC L
0665 EA48 CB 0D RRC L
0666 EA4A CB 0D RRC L
0667 EA4C 7D LD A,L
0668 EA4D E6 1F AND 01FH
0669 EA4F 6F LD L,A
0670 EA50 CB 04 RLC H
0671 EA52 CB 04 RLC H
0672 EA54 CB 04 RLC H
0673 EA56 CB 04 RLC H
0674 EA58 CB 04 RLC H
0675 EA5A 7C LD A,H
0676 EA5B E6 20 AND 020H
0677 EA5D 67 LD H,A
0678 EA5E 3A C6 FB LD A,(hstdsk)
0679 EA61 CB 07 RLC a
0680 EA63 CB 07 RLC a
0681 EA65 CB 07 RLC a
0682 EA67 CB 07 RLC a
0683 EA69 CB 07 RLC a
0684 EA6B CB 07 RLC a
0685 EA6D E6 C0 AND 0C0H
0686 EA6F 84 ADD A,H
0687 EA70 85 ADD A,L
0688 EA71 32 9E FB LD (lba1),A
0689 EA74
0690 EA74 3A C6 FB LD A,(hstdsk)
0691 EA77 CB 0F RRC A
0692 EA79 CB 0F RRC A
0693 EA7B E6 03 AND 03H
0694 EA7D 32 9F FB LD (lba2),A
0695 EA80
0696 EA80 3E 00 LD a,00H
0697 EA82 32 A0 FB LD (lba3),A
0698 EA85
0699 EA85 ; Transfer LBA to disk (LBA3 not used on SD card)
0700 EA85 3A 9F FB LD A,(lba2)
0701 EA88 D3 8C OUT (SD_LBA2),A
0702 EA8A 3A 9E FB LD A,(lba1)
0703 EA8D D3 8B OUT (SD_LBA1),A
0704 EA8F 3A 9D FB LD A,(lba0)
0705 EA92 D3 8A OUT (SD_LBA0),A
0706 EA94 C9 RET
0707 EA95
0708 EA95 ;================================================================================================
0709 EA95 ; Read physical sector from host
0710 EA95 ;================================================================================================
0711 EA95
0712 EA95 readhst:
0713 EA95 F5 PUSH AF
0714 EA96 C5 PUSH BC
0715 EA97 E5 PUSH HL
0716 EA98
0717 EA98 DB 89 rdWait1: IN A,(SD_STATUS)
0718 EA9A FE 80 CP 128
0719 EA9C 20 FA JR NZ,rdWait1
0720 EA9E
0721 EA9E CD 2B EA CALL setLBAaddr
0722 EAA1
0723 EAA1 3E 00 LD A,$00 ; 00 = Read block
0724 EAA3 D3 89 OUT (SD_CONTROL),A
0725 EAA5
0726 EAA5 0E 04 LD c,4
0727 EAA7 21 D8 FB LD HL,hstbuf
0728 EAAA rd4secs:
0729 EAAA 06 80 LD b,128
0730 EAAC rdByte:
0731 EAAC
0732 EAAC DB 89 rdWait2: IN A,(SD_STATUS)
0733 EAAE FE E0 CP 224 ; Read byte waiting
0734 EAB0 20 FA JR NZ,rdWait2
0735 EAB2
0736 EAB2 DB 88 IN A,(SD_DATA)
0737 EAB4
0738 EAB4 77 LD (HL),A
0739 EAB5 23 INC HL
0740 EAB6 05 dec b
0741 EAB7 20 F3 JR NZ, rdByte
0742 EAB9 0D dec c
0743 EABA 20 EE JR NZ,rd4secs
0744 EABC
0745 EABC E1 POP HL
0746 EABD C1 POP BC
0747 EABE F1 POP AF
0748 EABF
0749 EABF AF XOR a
0750 EAC0 32 D2 FB ld (erflag),a
0751 EAC3 C9 RET
0752 EAC4
0753 EAC4
0754 EAC4 ;================================================================================================
0755 EAC4 ; Write physical sector to host
0756 EAC4 ;================================================================================================
0757 EAC4
0758 EAC4 writehst:
0759 EAC4 F5 PUSH AF
0760 EAC5 C5 PUSH BC
0761 EAC6 E5 PUSH HL
0762 EAC7
0763 EAC7 DB 89 wrWait1: IN A,(SD_STATUS)
0764 EAC9 FE 80 CP 128
0765 EACB 20 FA JR NZ,wrWait1
0766 EACD
0767 EACD CD 2B EA CALL setLBAaddr
0768 EAD0
0769 EAD0 3E 01 LD A,$01 ; 01 = Write block
0770 EAD2 D3 89 OUT (SD_CONTROL),A
0771 EAD4
0772 EAD4 0E 04 LD c,4
0773 EAD6 21 D8 FB LD HL,hstbuf
0774 EAD9 wr4secs:
0775 EAD9 06 80 LD b,128
0776 EADB wrByte:
0777 EADB
0778 EADB DB 89 wrWait2: IN A,(SD_STATUS)
0779 EADD FE A0 CP 160 ; Write buffer empty
0780 EADF 20 FA JR NZ,wrWait2
0781 EAE1
0782 EAE1 ; UPDATE S0urceror, inserted wait cycle between IN and OUT
0783 EAE1 ; to resolve unknown write issue in sd_controller.vhd in combination
0784 EAE1 ; with MISTer virtual SD interface sys/sd_card.sv
0785 EAE1 ; which results in hangs or write errors.
0786 EAE1 C5 push bc
0787 EAE2 06 64 ld b,100
0788 EAE4 _again:
0789 EAE4 10 FE djnz _again
0790 EAE6 C1 pop bc
0791 EAE7 ; END UPDATE
0792 EAE7
0793 EAE7 7E LD A,(HL)
0794 EAE8 D3 88 OUT (SD_DATA),A
0795 EAEA 23 INC HL
0796 EAEB 05 dec b
0797 EAEC 20 ED JR NZ, wrByte
0798 EAEE
0799 EAEE 0D dec c
0800 EAEF 20 E8 JR NZ,wr4secs
0801 EAF1
0802 EAF1 E1 POP HL
0803 EAF2 C1 POP BC
0804 EAF3 F1 POP AF
0805 EAF4
0806 EAF4 AF XOR a
0807 EAF5 32 D2 FB ld (erflag),a
0808 EAF8 C9 RET
0809 EAF9
0810 EAF9 ;================================================================================================
0811 EAF9 ; Utilities
0812 EAF9 ;================================================================================================
0813 EAF9
0814 EAF9 printInline:
0815 EAF9 E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL
0816 EAFA F5 PUSH AF
0817 EAFB C5 PUSH BC
0818 EAFC 7E nextILChar: LD A,(HL)
0819 EAFD FE 00 CP 0
0820 EAFF 28 07 JR Z,endOfPrint
0821 EB01 4F LD C,A
0822 EB02 CD 96 E8 CALL conout ; Print to TTY
0823 EB05 23 iNC HL
0824 EB06 18 F4 JR nextILChar
0825 EB08 23 endOfPrint: INC HL ; Get past "null" terminator
0826 EB09 C1 POP BC
0827 EB0A F1 POP AF
0828 EB0B E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
0829 EB0C C9 RET
0830 EB0D
0831 EB0D ;================================================================================================
0832 EB0D ; Data storage
0833 EB0D ;================================================================================================
0834 EB0D
0835 EB0D dirbuf: .ds 128 ;scratch directory area
0836 EB8D alv00: .ds 257 ;allocation vector 0
0837 EC8E alv01: .ds 257 ;allocation vector 1
0838 ED8F alv02: .ds 257 ;allocation vector 2
0839 EE90 alv03: .ds 257 ;allocation vector 3
0840 EF91 alv04: .ds 257 ;allocation vector 4
0841 F092 alv05: .ds 257 ;allocation vector 5
0842 F193 alv06: .ds 257 ;allocation vector 6
0843 F294 alv07: .ds 257 ;allocation vector 7
0844 F395 alv08: .ds 257 ;allocation vector 8
0845 F496 alv09: .ds 257 ;allocation vector 9
0846 F597 alv10: .ds 257 ;allocation vector 10
0847 F698 alv11: .ds 257 ;allocation vector 11
0848 F799 alv12: .ds 257 ;allocation vector 12
0849 F89A alv13: .ds 257 ;allocation vector 13
0850 F99B alv14: .ds 257 ;allocation vector 14
0851 FA9C alv15: .ds 257 ;allocation vector 15
0852 FB9D
0853 FB9D 00 lba0 .DB 00h
0854 FB9E 00 lba1 .DB 00h
0855 FB9F 00 lba2 .DB 00h
0856 FBA0 00 lba3 .DB 00h
0857 FBA1
0858 FBA1 .DS 020h ; Start of BIOS stack area.
0859 FBC1 biosstack: .EQU $
0860 FBC1
0861 FBC1 sekdsk: .ds 1 ;seek disk number
0862 FBC2 sektrk: .ds 2 ;seek track number
0863 FBC4 seksec: .ds 2 ;seek sector number
0864 FBC6 ;
0865 FBC6 hstdsk: .ds 1 ;host disk number
0866 FBC7 hsttrk: .ds 2 ;host track number
0867 FBC9 hstsec: .ds 1 ;host sector number
0868 FBCA ;
0869 FBCA sekhst: .ds 1 ;seek shr secshf
0870 FBCB hstact: .ds 1 ;host active flag
0871 FBCC hstwrt: .ds 1 ;host written flag
0872 FBCD ;
0873 FBCD unacnt: .ds 1 ;unalloc rec cnt
0874 FBCE unadsk: .ds 1 ;last unalloc disk
0875 FBCF unatrk: .ds 2 ;last unalloc track
0876 FBD1 unasec: .ds 1 ;last unalloc sector
0877 FBD2 ;
0878 FBD2 erflag: .ds 1 ;error reporting
0879 FBD3 rsflag: .ds 1 ;read sector flag
0880 FBD4 readop: .ds 1 ;1 if read operation
0881 FBD5 wrtype: .ds 1 ;write operation type
0882 FBD6 dmaAddr: .ds 2 ;last dma address
0883 FBD8 hstbuf: .ds 512 ;host buffer
0884 FDD8
0885 FDD8 hstBufEnd: .EQU $
0886 FDD8
0887 FDD8 biosEnd: .EQU $
0888 FDD8
0889 FDD8 ; Disable the ROM, pop the active IO port from the stack (supplied by monitor),
0890 FDD8 ; then start CP/M
0891 FDD8 popAndRun:
0892 FDD8 3E 01 LD A,$01
0893 FDDA D3 38 OUT ($38),A
0894 FDDC
0895 FDDC F1 POP AF
0896 FDDD FE 01 CP $01
0897 FDDF 28 04 JR Z,consoleAtB
0898 FDE1 3E 01 LD A,$01 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is CRT:)
0899 FDE3 18 02 JR setIOByte
0900 FDE5 3E 00 consoleAtB: LD A,$00 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is TTY:)
0901 FDE7 32 03 00 setIOByte: LD (iobyte),A
0902 FDEA C3 00 E6 JP bios
0903 FDED
0904 FDED
0905 FDED ;=================================================================================
0906 FDED ; Relocate TPA area from 4100 to 0100 then start CP/M
0907 FDED ; Used to manually transfer a loaded program after CP/M was previously loaded
0908 FDED ;=================================================================================
0909 FDED
0910 FFE8 .org 0FFE8H
0911 FFE8 3E 01 LD A,$01
0912 FFEA D3 38 OUT ($38),A
0913 FFEC
0914 FFEC 21 00 41 LD HL,04100H
0915 FFEF 11 00 01 LD DE,00100H
0916 FFF2 01 00 8F LD BC,08F00H
0917 FFF5 ED B0 LDIR
0918 FFF7 C3 00 E6 JP bios
0919 FFFA
0920 FFFA ;=================================================================================
0921 FFFA ; Normal start CP/M vector
0922 FFFA ;=================================================================================
0923 FFFA
0924 FFFE .ORG 0FFFEH
0925 FFFE D8 FD .dw popAndRun
0926 0000
0927 0000 .END
tasm: Number of errors = 0

View File

@@ -0,0 +1,88 @@
0001 0000 LF .EQU 0AH ;line feed
0002 0000 FF .EQU 0CH ;form feed
0003 0000 CR .EQU 0DH ;carriage RETurn
0004 0000 DOT .EQU '.'
0005 0000 CH375_CMD_CHECK_EXIST .EQU 06H
0006 0000 CH375_CMD_RESET_ALL .EQU 05H
0007 0000
0008 4000 .ORG 4000H
0009 4000
0010 4000 CD 64 40 CALL printInline
0011 4003 436865636B20 .TEXT "Check CH376s communication"
0011 4009 43483337367320636F6D6D756E69636174696F6E
0012 401D 0D 0A 00 .DB CR,LF,0
0013 4020
0014 4020 CD 64 40 CALL printInline
0015 4023 53656E642041 .TEXT "Send A"
0016 4029 0D 0A 00 .DB CR,LF,0
0017 402C
0018 402C 3E 05 ld a, CH375_CMD_RESET_ALL
0019 402E D3 20 out (20h),a
0020 4030
0021 4030 3E 06 ld a, CH375_CMD_CHECK_EXIST
0022 4032 D3 20 out (20h),a
0023 4034 3E 41 ld a, 'A'
0024 4036 D3 20 out (20h),a
0025 4038 ; receive result
0026 4038 AF xor a
0027 4039 D3 20 out (20h),a
0028 403B DB 20 in a, (20h)
0029 403D EE FF xor 255
0030 403F
0031 403F CD 64 40 CALL printInline
0032 4042 526563656976 .TEXT "Received "
0032 4048 656420
0033 404B 00 .DB 0
0034 404C
0035 404C CF RST 08H ; print contents of A
0036 404D
0037 404D CD 64 40 CALL printInline
0038 4050 0D 0A 00 .DB CR,LF,0
0039 4053
0040 4053 C9 ret
0041 4054
0042 4054 ; LOOPBACK TEST
0043 4054
0044 4054 06 39 ld b, 39h
0045 4056 outer:
0046 4056 78 ld a, b
0047 4057 FE 2F cp 2fh
0048 4059 C8 ret z
0049 405A ; send out
0050 405A D3 20 out (20h),a
0051 405C ;inner:
0052 405C ; ld a, DOT
0053 405C ; rst 08h
0054 405C ; in a, (21h)
0055 405C ; bit 0,a
0056 405C ; jr z, inner
0057 405C AF xor a
0058 405D
0059 405D ; read back
0060 405D DB 20 in a, (20h)
0061 405F CF rst 08h ; should be 30h => 0..9
0062 4060
0063 4060 05 dec b
0064 4061 18 F3 jr outer
0065 4063
0066 4063 C9 ret
0067 4064
0068 4064 printInline:
0069 4064 E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL
0070 4065 F5 PUSH AF
0071 4066 C5 PUSH BC
0072 4067 7E nextILChar: LD A,(HL)
0073 4068 FE 00 CP 0
0074 406A 28 04 JR Z,endOfPrint
0075 406C CF RST 08H
0076 406D 23 INC HL
0077 406E 18 F7 JR nextILChar
0078 4070 23 endOfPrint: INC HL ; Get past "null" terminator
0079 4071 C1 POP BC
0080 4072 F1 POP AF
0081 4073 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
0082 4074 C9 RET
0083 4075
0084 4075
0085 4075 .END
tasm: Number of errors = 0

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,290 @@
0001 0000 ;==================================================================================
0002 0000 ; Contents of this file are copyright Grant Searle
0003 0000 ; HEX routine from Joel Owens.
0004 0000 ;
0005 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY
0006 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself.
0007 0000 ;
0008 0000 ; http://searle.hostei.com/grant/index.html
0009 0000 ;
0010 0000 ; eMail: home.micros01@btinternet.com
0011 0000 ;
0012 0000 ; If the above don't work, please perform an Internet search to see if I have
0013 0000 ; updated the web page hosting service.
0014 0000 ;
0015 0000 ;==================================================================================
0016 0000
0017 0000 TPA .EQU 100H
0018 0000 REBOOT .EQU 0H
0019 0000 BDOS .EQU 5H
0020 0000 CONIO .EQU 6
0021 0000 CONINP .EQU 1
0022 0000 CONOUT .EQU 2
0023 0000 PSTRING .EQU 9
0024 0000 MAKEF .EQU 22
0025 0000 CLOSEF .EQU 16
0026 0000 WRITES .EQU 21
0027 0000 DELF .EQU 19
0028 0000 SETUSR .EQU 32
0029 0000
0030 0000 CR .EQU 0DH
0031 0000 LF .EQU 0AH
0032 0000
0033 0000 FCB .EQU 05CH
0034 0000 BUFF .EQU 080H
0035 0000
0036 0100 .ORG TPA
0037 0100
0038 0100
0039 0100 3E 00 LD A,0
0040 0102 32 6D 02 LD (buffPos),A
0041 0105 32 71 02 LD (checkSum),A
0042 0108 32 72 02 LD (byteCount),A
0043 010B 32 70 02 LD (printCount),A
0044 010E 21 80 00 LD HL,BUFF
0045 0111 22 6E 02 LD (buffPtr),HL
0046 0114
0047 0114
0048 0114 CD 39 02 WAITLT: CALL GETCHR
0049 0117 FE 55 CP 'U'
0050 0119 CA 2A 02 JP Z,SETUSER
0051 011C FE 3A CP ':'
0052 011E 20 F4 JR NZ,WAITLT
0053 0120
0054 0120
0055 0120 0E 13 LD C,DELF
0056 0122 11 5C 00 LD DE,FCB
0057 0125 CD 05 00 CALL BDOS
0058 0128
0059 0128 0E 16 LD C,MAKEF
0060 012A 11 5C 00 LD DE,FCB
0061 012D CD 05 00 CALL BDOS
0062 0130
0063 0130 GETHEX:
0064 0130 CD 39 02 CALL GETCHR
0065 0133 FE 3E CP '>'
0066 0135 28 61 JR Z,CLOSE
0067 0137 47 LD B,A
0068 0138 C5 PUSH BC
0069 0139 CD 39 02 CALL GETCHR
0070 013C C1 POP BC
0071 013D 4F LD C,A
0072 013E
0073 013E CD 4C 02 CALL BCTOA
0074 0141
0075 0141 47 LD B,A
0076 0142 3A 71 02 LD A,(checkSum)
0077 0145 80 ADD A,B
0078 0146 32 71 02 LD (checkSum),A
0079 0149 3A 72 02 LD A,(byteCount)
0080 014C 3C INC A
0081 014D 32 72 02 LD (byteCount),A
0082 0150
0083 0150 78 LD A,B
0084 0151
0085 0151 2A 6E 02 LD HL,(buffPtr)
0086 0154
0087 0154 77 LD (HL),A
0088 0155 23 INC HL
0089 0156 22 6E 02 LD (buffPtr),HL
0090 0159
0091 0159 3A 6D 02 LD A,(buffPos)
0092 015C 3C INC A
0093 015D 32 6D 02 LD (buffPos),A
0094 0160 FE 80 CP 80H
0095 0162
0096 0162 20 32 JR NZ,NOWRITE
0097 0164
0098 0164 0E 15 LD C,WRITES
0099 0166 11 5C 00 LD DE,FCB
0100 0169 CD 05 00 CALL BDOS
0101 016C 3E 2E LD A,'.'
0102 016E CD 45 02 CALL PUTCHR
0103 0171
0104 0171 ; New line every 8K (64 dots)
0105 0171 3A 70 02 LD A,(printCount)
0106 0174 3C INC A
0107 0175 FE 40 CP 64
0108 0177 20 0F JR NZ,noCRLF
0109 0179 32 70 02 LD (printCount),A
0110 017C 3E 0D LD A,CR
0111 017E CD 45 02 CALL PUTCHR
0112 0181 3E 0A LD A,LF
0113 0183 CD 45 02 CALL PUTCHR
0114 0186 3E 00 LD A,0
0115 0188 32 70 02 noCRLF: LD (printCount),A
0116 018B
0117 018B 21 80 00 LD HL,BUFF
0118 018E 22 6E 02 LD (buffPtr),HL
0119 0191
0120 0191 3E 00 LD A,0
0121 0193 32 6D 02 LD (buffPos),A
0122 0196 NOWRITE:
0123 0196 18 98 JR GETHEX
0124 0198
0125 0198
0126 0198 CLOSE:
0127 0198
0128 0198 3A 6D 02 LD A,(buffPos)
0129 019B FE 00 CP 0
0130 019D 28 0D JR Z,NOWRITE2
0131 019F
0132 019F 0E 15 LD C,WRITES
0133 01A1 11 5C 00 LD DE,FCB
0134 01A4 CD 05 00 CALL BDOS
0135 01A7 3E 2E LD A,'.'
0136 01A9 CD 45 02 CALL PUTCHR
0137 01AC
0138 01AC NOWRITE2:
0139 01AC 0E 10 LD C,CLOSEF
0140 01AE 11 5C 00 LD DE,FCB
0141 01B1 CD 05 00 CALL BDOS
0142 01B4
0143 01B4 ; Byte count (lower 8 bits)
0144 01B4 CD 39 02 CALL GETCHR
0145 01B7 47 LD B,A
0146 01B8 C5 PUSH BC
0147 01B9 CD 39 02 CALL GETCHR
0148 01BC C1 POP BC
0149 01BD 4F LD C,A
0150 01BE
0151 01BE CD 4C 02 CALL BCTOA
0152 01C1 47 LD B,A
0153 01C2 3A 72 02 LD A,(byteCount)
0154 01C5 90 SUB B
0155 01C6 FE 00 CP 0
0156 01C8 28 1A JR Z,byteCountOK
0157 01CA
0158 01CA 3E 0D LD A,CR
0159 01CC CD 45 02 CALL PUTCHR
0160 01CF 3E 0A LD A,LF
0161 01D1 CD 45 02 CALL PUTCHR
0162 01D4
0163 01D4 11 91 02 LD DE,countErrMess
0164 01D7 0E 09 LD C,PSTRING
0165 01D9 CD 05 00 CALL BDOS
0166 01DC
0167 01DC ; Sink remaining 2 bytes
0168 01DC CD 39 02 CALL GETCHR
0169 01DF CD 39 02 CALL GETCHR
0170 01E2
0171 01E2 18 3C JR FINISH
0172 01E4
0173 01E4 byteCountOK:
0174 01E4
0175 01E4 ; Checksum
0176 01E4 CD 39 02 CALL GETCHR
0177 01E7 47 LD B,A
0178 01E8 C5 PUSH BC
0179 01E9 CD 39 02 CALL GETCHR
0180 01EC C1 POP BC
0181 01ED 4F LD C,A
0182 01EE
0183 01EE CD 4C 02 CALL BCTOA
0184 01F1 47 LD B,A
0185 01F2 3A 71 02 LD A,(checkSum)
0186 01F5 90 SUB B
0187 01F6 FE 00 CP 0
0188 01F8 28 14 JR Z,checksumOK
0189 01FA
0190 01FA 3E 0D LD A,CR
0191 01FC CD 45 02 CALL PUTCHR
0192 01FF 3E 0A LD A,LF
0193 0201 CD 45 02 CALL PUTCHR
0194 0204
0195 0204 11 76 02 LD DE,chkErrMess
0196 0207 0E 09 LD C,PSTRING
0197 0209 CD 05 00 CALL BDOS
0198 020C 18 12 JR FINISH
0199 020E
0200 020E checksumOK:
0201 020E 3E 0D LD A,CR
0202 0210 CD 45 02 CALL PUTCHR
0203 0213 3E 0A LD A,LF
0204 0215 CD 45 02 CALL PUTCHR
0205 0218
0206 0218 11 73 02 LD DE,OKMess
0207 021B 0E 09 LD C,PSTRING
0208 021D CD 05 00 CALL BDOS
0209 0220
0210 0220
0211 0220
0212 0220 FINISH:
0213 0220 0E 20 LD C,SETUSR
0214 0222 1E 00 LD E,0
0215 0224 CD 05 00 CALL BDOS
0216 0227
0217 0227 C3 00 00 JP REBOOT
0218 022A
0219 022A
0220 022A SETUSER:
0221 022A CD 39 02 CALL GETCHR
0222 022D CD 65 02 CALL HEX2VAL
0223 0230 5F LD E,A
0224 0231 0E 20 LD C,SETUSR
0225 0233 CD 05 00 CALL BDOS
0226 0236 C3 14 01 JP WAITLT
0227 0239
0228 0239
0229 0239 ; Get a char into A
0230 0239 ;GETCHR: LD C,CONINP
0231 0239 ; CALL BDOS
0232 0239 ; RET
0233 0239
0234 0239 ; Wait for a char into A (no echo)
0235 0239 GETCHR:
0236 0239 1E FF LD E,$FF
0237 023B 0E 06 LD C,CONIO
0238 023D CD 05 00 CALL BDOS
0239 0240 FE 00 CP 0
0240 0242 28 F5 JR Z,GETCHR
0241 0244 C9 RET
0242 0245
0243 0245 ; Write A to output
0244 0245 0E 02 PUTCHR: LD C,CONOUT
0245 0247 5F LD E,A
0246 0248 CD 05 00 CALL BDOS
0247 024B C9 RET
0248 024C
0249 024C
0250 024C ;------------------------------------------------------------------------------
0251 024C ; Convert ASCII characters in B C registers to a byte value in A
0252 024C ;------------------------------------------------------------------------------
0253 024C 78 BCTOA LD A,B ; Move the hi order byte to A
0254 024D D6 30 SUB $30 ; Take it down from Ascii
0255 024F FE 0A CP $0A ; Are we in the 0-9 range here?
0256 0251 38 02 JR C,BCTOA1 ; If so, get the next nybble
0257 0253 D6 07 SUB $07 ; But if A-F, take it down some more
0258 0255 07 BCTOA1 RLCA ; Rotate the nybble from low to high
0259 0256 07 RLCA ; One bit at a time
0260 0257 07 RLCA ; Until we
0261 0258 07 RLCA ; Get there with it
0262 0259 47 LD B,A ; Save the converted high nybble
0263 025A 79 LD A,C ; Now get the low order byte
0264 025B D6 30 SUB $30 ; Convert it down from Ascii
0265 025D FE 0A CP $0A ; 0-9 at this point?
0266 025F 38 02 JR C,BCTOA2 ; Good enough then, but
0267 0261 D6 07 SUB $07 ; Take off 7 more if it's A-F
0268 0263 80 BCTOA2 ADD A,B ; Add in the high order nybble
0269 0264 C9 RET
0270 0265
0271 0265 ; Change Hex in A to actual value in A
0272 0265 D6 30 HEX2VAL SUB $30
0273 0267 FE 0A CP $0A
0274 0269 D8 RET C
0275 026A D6 07 SUB $07
0276 026C C9 RET
0277 026D
0278 026D
0279 026D 00 buffPos .DB 0H
0280 026E 00 00 buffPtr .DW 0000H
0281 0270 00 printCount .DB 0H
0282 0271 00 checkSum .DB 0H
0283 0272 00 byteCount .DB 0H
0284 0273 4F 4B 24 OKMess .BYTE "OK$"
0285 0276 3D3D3D3D3D3DchkErrMess .BYTE "======Checksum Error======$"
0285 027C 436865636B73756D204572726F723D3D3D3D3D3D24
0286 0291 3D3D3D3D3D3DcountErrMess .BYTE "======File Length Error======$"
0286 0297 46696C65204C656E677468204572726F723D3D3D3D3D3D24
0287 02AF .END
tasm: Number of errors = 0

View File

@@ -0,0 +1,230 @@
0001 0000 ;==================================================================================
0002 0000 ; Contents of this file are copyright Grant Searle
0003 0000 ;
0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY
0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself.
0006 0000 ;
0007 0000 ; http://searle.hostei.com/grant/index.html
0008 0000 ;
0009 0000 ; eMail: home.micros01@btinternet.com
0010 0000 ;
0011 0000 ; If the above don't work, please perform an Internet search to see if I have
0012 0000 ; updated the web page hosting service.
0013 0000 ;
0014 0000 ;==================================================================================
0015 0000
0016 0000 numDrives .EQU 15 ; Not including A:
0017 0000
0018 0000
0019 0000 SD_DATA .EQU 088H
0020 0000 SD_CONTROL .EQU 089H
0021 0000 SD_STATUS .EQU 089H
0022 0000 SD_LBA0 .EQU 08AH
0023 0000 SD_LBA1 .EQU 08BH
0024 0000 SD_LBA2 .EQU 08CH
0025 0000
0026 0000 LF .EQU 0AH ;line feed
0027 0000 FF .EQU 0CH ;form feed
0028 0000 CR .EQU 0DH ;carriage RETurn
0029 0000
0030 0000 ;====================================================================================
0031 0000
0032 5000 .ORG 5000H ; Format program origin.
0033 5000
0034 5000
0035 5000 CD D5 50 CALL printInline
0036 5003 43502F4D2046 .TEXT "CP/M Formatter 2.0 by G. Searle 2013"
0036 5009 6F726D617474657220322E3020627920472E20536561726C652032303133
0037 5027 0D 0A 00 .DB CR,LF,0
0038 502A
0039 502A 3E 41 LD A,'A'
0040 502C 32 E7 50 LD (drvName),A
0041 502F
0042 502F ; There are 512 directory entries per disk, 4 DIR entries per sector
0043 502F ; So 128 x 128 byte sectors are to be initialised
0044 502F ; The drive uses 512 byte sectors, so 32 x 512 byte sectors per disk
0045 502F ; require initialisation
0046 502F
0047 502F ;Drive 0 (A:) is slightly different due to reserved track, so DIR sector starts at 32
0048 502F 3A E7 50 LD A,(drvName)
0049 5032 CF RST 08H ; Print drive letter
0050 5033 3C INC A
0051 5034 32 E7 50 LD (drvName),A
0052 5037
0053 5037 3E 20 LD A,$20
0054 5039 32 E6 50 LD (secNo),A
0055 503C
0056 503C processSectorA:
0057 503C
0058 503C 3A E6 50 LD A,(secNo)
0059 503F D3 8A OUT (SD_LBA0),A
0060 5041 3E 00 LD A,0
0061 5043 D3 8B OUT (SD_LBA1),A
0062 5045 3E 00 LD A,0
0063 5047 D3 8C OUT (SD_LBA2),A
0064 5049 3E E0 LD a,$E0
0065 504B
0066 504B CD A7 50 call writehst
0067 504E
0068 504E 3A E6 50 LD A,(secNo)
0069 5051 3C INC A
0070 5052 32 E6 50 LD (secNo),A
0071 5055 FE 40 CP $40
0072 5057 20 E3 JR NZ, processSectorA
0073 5059
0074 5059
0075 5059
0076 5059 ;Drive 1 onwards (B: etc) don't have reserved tracks, so sector starts at 0
0077 5059
0078 5059 11 40 00 LD DE,$0040 ; HL increment
0079 505C 21 40 00 LD HL,$0040 ; H = LBA2, L=LBA1, initialise for drive 1 (B:)
0080 505F
0081 505F 06 0F LD B,numDrives
0082 5061
0083 5061 processDirs:
0084 5061
0085 5061 3A E7 50 LD A,(drvName)
0086 5064 CF RST 08H ; Print drive letter
0087 5065 3C INC A
0088 5066 32 E7 50 LD (drvName),A
0089 5069
0090 5069 3E 00 LD A,0
0091 506B 32 E6 50 LD (secNo),A
0092 506E
0093 506E processSector:
0094 506E 3A E6 50 LD A,(secNo)
0095 5071 D3 8A OUT (SD_LBA0),A
0096 5073 7D LD A,L
0097 5074 D3 8B OUT (SD_LBA1),A
0098 5076 7C LD A,H
0099 5077 D3 8C OUT (SD_LBA2),A
0100 5079
0101 5079 CD A7 50 call writehst
0102 507C
0103 507C 3A E6 50 LD A,(secNo)
0104 507F 3C INC A
0105 5080 32 E6 50 LD (secNo),A
0106 5083 FE 20 CP $20
0107 5085 20 E7 JR NZ, processSector
0108 5087
0109 5087 19 ADD HL,DE
0110 5088
0111 5088 05 DEC B
0112 5089 20 D6 JR NZ,processDirs
0113 508B
0114 508B CD D5 50 CALL printInline
0115 508E 0D 0A .DB CR,LF
0116 5090 466F726D6174 .TEXT "Formatting complete"
0116 5096 74696E6720636F6D706C657465
0117 50A3 0D 0A 00 .DB CR,LF,0
0118 50A6
0119 50A6 C9 RET
0120 50A7
0121 50A7 ;================================================================================================
0122 50A7 ; Write physical sector to host
0123 50A7 ;================================================================================================
0124 50A7
0125 50A7 writehst:
0126 50A7 F5 PUSH AF
0127 50A8 C5 PUSH BC
0128 50A9 E5 PUSH HL
0129 50AA
0130 50AA DB 89 wrWait1: IN A,(SD_STATUS)
0131 50AC FE 80 CP 128
0132 50AE 20 FA JR NZ,wrWait1
0133 50B0
0134 50B0 ;CALL setLBAaddr
0135 50B0
0136 50B0 3E 01 LD A,$01 ; 01 = Write block
0137 50B2 D3 89 OUT (SD_CONTROL),A
0138 50B4
0139 50B4 0E 04 LD c,4
0140 50B6 wr4secs:
0141 50B6 21 E8 50 LD HL,dirData
0142 50B9 06 80 LD b,128
0143 50BB wrByte:
0144 50BB DB 89 wrWait2: IN A,(SD_STATUS)
0145 50BD FE A0 CP 160 ; Write buffer empty
0146 50BF 20 FA JR NZ,wrWait2
0147 50C1
0148 50C1 ;LD A,'.'
0149 50C1 ;RST 08H
0150 50C1
0151 50C1 ; UPDATE S0urceror, inserted wait cycle between IN and OUT
0152 50C1 ; to resolve unknown write issue in sd_controller.vhd in combination
0153 50C1 ; with MISTer virtual SD interface sys/sd_card.sv
0154 50C1 ; which results in hangs or write errors.
0155 50C1 C5 push bc
0156 50C2 06 64 ld b,100
0157 50C4 _again:
0158 50C4 10 FE djnz _again
0159 50C6 C1 pop bc
0160 50C7 ; END UPDATE
0161 50C7
0162 50C7 7E LD A,(HL)
0163 50C8 D3 88 OUT (SD_DATA),A
0164 50CA
0165 50CA 23 INC HL
0166 50CB 05 dec b
0167 50CC 20 ED JR NZ, wrByte
0168 50CE
0169 50CE 0D dec c
0170 50CF 20 E5 JR NZ,wr4secs
0171 50D1
0172 50D1 E1 POP HL
0173 50D2 C1 POP BC
0174 50D3 F1 POP AF
0175 50D4
0176 50D4 ;XOR a
0177 50D4 ;ld (erflag),a
0178 50D4 C9 RET
0179 50D5
0180 50D5 ;================================================================================================
0181 50D5 ; Utilities
0182 50D5 ;================================================================================================
0183 50D5
0184 50D5 printInline:
0185 50D5 E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL
0186 50D6 F5 PUSH AF
0187 50D7 C5 PUSH BC
0188 50D8 7E nextILChar: LD A,(HL)
0189 50D9 FE 00 CP 0
0190 50DB 28 04 JR Z,endOfPrint
0191 50DD CF RST 08H
0192 50DE 23 INC HL
0193 50DF 18 F7 JR nextILChar
0194 50E1 23 endOfPrint: INC HL ; Get past "null" terminator
0195 50E2 C1 POP BC
0196 50E3 F1 POP AF
0197 50E4 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
0198 50E5 C9 RET
0199 50E6
0200 50E6
0201 50E6 00 secNo .db 0
0202 50E7 00 drvName .db 0
0203 50E8
0204 50E8
0205 50E8 ; Directory data for 1 x 128 byte sector
0206 50E8 dirData:
0207 50E8 E52020202020 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00
0207 50EE 20202020202000000000
0208 50F8 000000000000 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
0208 50FE 00000000000000000000
0209 5108
0210 5108 E52020202020 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00
0210 510E 20202020202000000000
0211 5118 000000000000 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
0211 511E 00000000000000000000
0212 5128
0213 5128 E52020202020 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00
0213 512E 20202020202000000000
0214 5138 000000000000 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
0214 513E 00000000000000000000
0215 5148
0216 5148 E52020202020 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00
0216 514E 20202020202000000000
0217 5158 000000000000 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
0217 515E 00000000000000000000
0218 5168
0219 5168 .END
tasm: Number of errors = 0

View File

@@ -0,0 +1,166 @@
0001 0000 ;==================================================================================
0002 0000 ; Contents of this file are copyright Grant Searle
0003 0000 ;
0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY
0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself.
0006 0000 ;
0007 0000 ; http://searle.hostei.com/grant/index.html
0008 0000 ;
0009 0000 ; eMail: home.micros01@btinternet.com
0010 0000 ;
0011 0000 ; If the above don't work, please perform an Internet search to see if I have
0012 0000 ; updated the web page hosting service.
0013 0000 ;
0014 0000 ;==================================================================================
0015 0000
0016 0000 loadAddr .EQU 0D000h
0017 0000 numSecs .EQU 24 ; Number of 512 sectors to be loaded
0018 0000
0019 0000 SD_DATA .EQU 088H
0020 0000 SD_CONTROL .EQU 089H
0021 0000 SD_STATUS .EQU 089H
0022 0000 SD_LBA0 .EQU 08AH
0023 0000 SD_LBA1 .EQU 08BH
0024 0000 SD_LBA2 .EQU 08CH
0025 0000
0026 0000 LF .EQU 0AH ;line feed
0027 0000 FF .EQU 0CH ;form feed
0028 0000 CR .EQU 0DH ;carriage RETurn
0029 0000
0030 0000 ;================================================================================================
0031 0000
0032 5000 .ORG 5000H ; Loader origin.
0033 5000
0034 5000 CD BA 50 CALL printInline
0035 5003 43502F4D2053 .TEXT "CP/M System Transfer by G. Searle 2012-13"
0035 5009 797374656D205472616E7366657220627920472E20536561726C6520323031322D3133
0036 502C 0D 0A 00 .DB CR,LF,0
0037 502F
0038 502F 06 18 LD B,numSecs
0039 5031
0040 5031 3E 00 LD A,0
0041 5033 32 CB 50 LD (lba0),A
0042 5036 32 CC 50 ld (lba1),A
0043 5039 32 CD 50 ld (lba2),A
0044 503C 32 CE 50 ld (lba3),A
0045 503F 21 00 D0 LD HL,loadAddr
0046 5042 22 CF 50 LD (dmaAddr),HL
0047 5045 processSectors:
0048 5045
0049 5045 CD 8C 50 call writehst
0050 5048
0051 5048 11 00 02 LD DE,0200H
0052 504B 2A CF 50 LD HL,(dmaAddr)
0053 504E 19 ADD HL,DE
0054 504F 22 CF 50 LD (dmaAddr),HL
0055 5052 3A CB 50 LD A,(lba0)
0056 5055 3C INC A
0057 5056 32 CB 50 LD (lba0),A
0058 5059
0059 5059 10 EA djnz processSectors
0060 505B
0061 505B CD BA 50 CALL printInline
0062 505E 0D 0A .DB CR,LF
0063 5060 53797374656D .TEXT "System transfer complete"
0063 5066 207472616E7366657220636F6D706C657465
0064 5078 0D 0A 00 .DB CR,LF,0
0065 507B
0066 507B C9 RET
0067 507C
0068 507C ; =========================================================================
0069 507C ; Disk routines as used in CBIOS
0070 507C ; =========================================================================
0071 507C setLBAaddr:
0072 507C 3A CD 50 LD A,(lba2)
0073 507F D3 8C OUT (SD_LBA2),A
0074 5081 3A CC 50 LD A,(lba1)
0075 5084 D3 8B OUT (SD_LBA1),A
0076 5086 3A CB 50 LD A,(lba0)
0077 5089 D3 8A OUT (SD_LBA0),A
0078 508B C9 ret
0079 508C
0080 508C ;================================================================================================
0081 508C ; Write physical sector to host
0082 508C ;================================================================================================
0083 508C
0084 508C writehst:
0085 508C F5 PUSH AF
0086 508D C5 PUSH BC
0087 508E E5 PUSH HL
0088 508F
0089 508F DB 89 wrWait1: IN A,(SD_STATUS)
0090 5091 FE 80 CP 128
0091 5093 20 FA JR NZ,wrWait1
0092 5095
0093 5095 CD 7C 50 CALL setLBAaddr
0094 5098
0095 5098 3E 01 LD A,$01 ; 01 = Write block
0096 509A D3 89 OUT (SD_CONTROL),A
0097 509C
0098 509C 0E 04 LD c,4
0099 509E ;LD HL,hstbuf
0100 509E wr4secs:
0101 509E 06 80 LD b,128
0102 50A0 wrByte:
0103 50A0
0104 50A0 DB 89 wrWait2: IN A,(SD_STATUS)
0105 50A2 FE A0 CP 160 ; Write buffer empty
0106 50A4 20 FA JR NZ,wrWait2
0107 50A6
0108 50A6 ; UPDATE S0urceror, inserted wait cycle between IN and OUT
0109 50A6 ; to resolve unknown write issue in sd_controller.vhd in combination
0110 50A6 ; with MISTer virtual SD interface sys/sd_card.sv
0111 50A6 ; which results in hangs or write errors.
0112 50A6 C5 push bc
0113 50A7 06 64 ld b,100
0114 50A9 _again:
0115 50A9 10 FE djnz _again
0116 50AB C1 pop bc
0117 50AC ; END UPDATE
0118 50AC
0119 50AC 7E LD A,(HL)
0120 50AD D3 88 OUT (SD_DATA),A
0121 50AF 23 INC HL
0122 50B0 05 dec b
0123 50B1 20 ED JR NZ, wrByte
0124 50B3
0125 50B3 0D dec c
0126 50B4 20 E8 JR NZ,wr4secs
0127 50B6
0128 50B6 E1 POP HL
0129 50B7 C1 POP BC
0130 50B8 F1 POP AF
0131 50B9
0132 50B9 ;XOR a
0133 50B9 ;ld (erflag),a
0134 50B9 C9 RET
0135 50BA
0136 50BA
0137 50BA ;================================================================================================
0138 50BA ; Utilities
0139 50BA ;================================================================================================
0140 50BA
0141 50BA printInline:
0142 50BA E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL
0143 50BB F5 PUSH AF
0144 50BC C5 PUSH BC
0145 50BD 7E nextILChar: LD A,(HL)
0146 50BE FE 00 CP 0
0147 50C0 28 04 JR Z,endOfPrint
0148 50C2 CF RST 08H
0149 50C3 23 INC HL
0150 50C4 18 F7 JR nextILChar
0151 50C6 23 endOfPrint: INC HL ; Get past "null" terminator
0152 50C7 C1 POP BC
0153 50C8 F1 POP AF
0154 50C9 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
0155 50CA C9 RET
0156 50CB
0157 50CB 00 lba0 .DB 00h
0158 50CC 00 lba1 .DB 00h
0159 50CD 00 lba2 .DB 00h
0160 50CE 00 lba3 .DB 00h
0161 50CF 00 00 dmaAddr .dw 0
0162 50D1
0163 50D1 .END
tasm: Number of errors = 0

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,927 @@
;==================================================================================
; Contents of this file are copyright Grant Searle
; Blocking/unblocking routines are the published version by Digital Research
; (bugfixed, as found on the web)
;
; You have permission to use this for NON COMMERCIAL USE ONLY
; If you wish to use it elsewhere, please include an acknowledgement to myself.
;
; http://searle.hostei.com/grant/index.html
;
; eMail: home.micros01@btinternet.com
;
; If the above don't work, please perform an Internet search to see if I have
; updated the web page hosting service.
;
;==================================================================================
ccp .EQU 0D000h ; Base of CCP.
bdos .EQU ccp + 0806h ; Base of BDOS.
bios .EQU ccp + 1600h ; Base of BIOS.
; Set CP/M low memory datA, vector and buffer addresses.
iobyte .EQU 03h ; Intel standard I/O definition byte.
userdrv .EQU 04h ; Current user number and drive.
tpabuf .EQU 80h ; Default I/O buffer and command line storage.
SD_DATA .EQU 088H
SD_CONTROL .EQU 089H
SD_STATUS .EQU 089H
SD_LBA0 .EQU 08AH
SD_LBA1 .EQU 08BH
SD_LBA2 .EQU 08CH
RTS_HIGH .EQU 0D5H
RTS_LOW .EQU 095H
ACIA0_D .EQU $81
ACIA0_C .EQU $80
ACIA1_D .EQU $83
ACIA1_C .EQU $82
nmi .EQU 66H
blksiz .equ 4096 ;CP/M allocation size
hstsiz .equ 512 ;host disk sector size
hstspt .equ 32 ;host disk sectors/trk
hstblk .equ hstsiz/128 ;CP/M sects/host buff
cpmspt .equ hstblk * hstspt ;CP/M sectors/track
secmsk .equ hstblk-1 ;sector mask
;compute sector mask
;secshf .equ 2 ;log2(hstblk)
wrall .equ 0 ;write to allocated
wrdir .equ 1 ;write to directory
wrual .equ 2 ;write to unallocated
LF .EQU 0AH ;line feed
FF .EQU 0CH ;form feed
CR .EQU 0DH ;carriage RETurn
;================================================================================================
.ORG bios ; BIOS origin.
;================================================================================================
; BIOS jump table.
;================================================================================================
JP boot ; 0 Initialize.
wboote: JP wboot ; 1 Warm boot.
JP const ; 2 Console status.
JP conin ; 3 Console input.
JP conout ; 4 Console OUTput.
JP list ; 5 List OUTput.
JP punch ; 6 punch OUTput.
JP reader ; 7 Reader input.
JP home ; 8 Home disk.
JP seldsk ; 9 Select disk.
JP settrk ; 10 Select track.
JP setsec ; 11 Select sector.
JP setdma ; 12 Set DMA ADDress.
JP read ; 13 Read 128 bytes.
JP write ; 14 Write 128 bytes.
JP listst ; 15 List status.
JP sectran ; 16 Sector translate.
;================================================================================================
; Disk parameter headers for disk 0 to 15
;================================================================================================
dpbase:
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb0,0000h,alv00
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv01
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv02
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv03
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv04
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv05
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv06
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv07
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv08
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv09
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv10
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv11
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv12
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv13
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv14
.DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv15
; First drive has a reserved track for CP/M
dpb0:
.DW 128 ;SPT - sectors per track
.DB 5 ;BSH - block shift factor
.DB 31 ;BLM - block mask
.DB 1 ;EXM - Extent mask
.DW 2043 ; (2047-4) DSM - Storage size (blocks - 1)
.DW 511 ;DRM - Number of directory entries - 1
.DB 240 ;AL0 - 1 bit set per directory block
.DB 0 ;AL1 - "
.DW 0 ;CKS - DIR check vector size (DRM+1)/4 (0=fixed disk)
.DW 1 ;OFF - Reserved tracks
dpb:
.DW 128 ;SPT - sectors per track
.DB 5 ;BSH - block shift factor
.DB 31 ;BLM - block mask
.DB 1 ;EXM - Extent mask
.DW 2047 ;DSM - Storage size (blocks - 1)
.DW 511 ;DRM - Number of directory entries - 1
.DB 240 ;AL0 - 1 bit set per directory block
.DB 0 ;AL1 - "
.DW 0 ;CKS - DIR check vector size (DRM+1)/4 (0=fixed disk)
.DW 0 ;OFF - Reserved tracks
;================================================================================================
; Cold boot
;================================================================================================
boot:
DI ; Disable interrupts.
LD SP,biosstack ; Set default stack.
; Turn off ROM
LD A,$01
OUT ($38),A
LD A,RTS_LOW
OUT (ACIA0_C),A ; Initialise ACIA0
OUT (ACIA1_C),A ; Initialise ACIA1
CALL printInline
.DB FF
.TEXT "CP/M BIOS 2.0 by G. Searle 2013"
.DB CR,LF
.DB CR,LF
.TEXT "CP/M 2.2 "
.TEXT "(c)"
.TEXT " 1979 by Digital Research"
.DB CR,LF,0
; CALL sdPreamble??
XOR a ; Clear I/O & drive bytes.
LD (userdrv),A
JP gocpm
;================================================================================================
; Warm boot
;================================================================================================
wboot:
DI ; Disable interrupts.
LD SP,biosstack ; Set default stack.
LD B,11 ; Number of sectors to reload
LD A,0
LD (hstsec),A
OUT (SD_LBA2),A
OUT (SD_LBA1),A
LD HL,ccp
wbRdAllSecs:
wBrdWait1: IN A,(SD_STATUS)
CP 128
JR NZ,wBrdWait1
LD A,(hstsec)
OUT (SD_LBA0),A
LD A,$00 ; 00 = Read block
OUT (SD_CONTROL),A
PUSH BC
LD c,4
wBrd4secs:
LD b,128
wBrdByte:
wBrdWait2: IN A,(SD_STATUS)
CP 224 ; Read byte waiting
JR NZ,wBrdWait2
IN A,(SD_DATA)
LD (HL),A
INC HL
dec b
JR NZ, wBrdByte
dec c
JR NZ,wBrd4secs
LD A,(hstsec)
INC A
LD (hstsec),A
POP BC
DJNZ wbRdAllSecs
;================================================================================================
; Common code for cold and warm boot
;================================================================================================
gocpm:
xor a ;0 to accumulator
ld (hstact),a ;host buffer inactive
ld (unacnt),a ;clear unalloc count
LD HL,tpabuf ; Address of BIOS DMA buffer.
LD (dmaAddr),HL
LD A,0C3h ; Opcode for 'JP'.
LD (00h),A ; Load at start of RAM.
LD HL,wboote ; Address of jump for a warm boot.
LD (01h),HL
LD (05h),A ; Opcode for 'JP'.
LD HL,bdos ; Address of jump for the BDOS.
LD (06h),HL
LD A,(userdrv) ; Save new drive number (0).
LD c,A ; Pass drive number in C.
JP ccp ; Start CP/M by jumping to the CCP.
;================================================================================================
; Console I/O routines
;================================================================================================
;------------------------------------------------------------------------------------------------
const:
LD A,(iobyte)
AND 00001011b ; Mask off console and high bit of reader
CP 00001010b ; redirected to reader on UR1/2 (Serial A)
JR Z,constA
CP 00000010b ; redirected to reader on TTY/RDR (Serial B)
JR Z,constB
AND $03 ; remove the reader from the mask - only console bits then remain
CP $01
JR NZ,constB
constA:
IN A,(ACIA0_C) ; Status byte
AND $01
CP $0 ; Z flag set if no char
JR Z, dataAEmpty
LD A,0FFH
RET
dataAEmpty:
LD A,0
RET
constB:
IN A,(ACIA1_C) ; Status byte
AND $01
CP $0 ; Z flag set if no char
JR Z, dataBEmpty
LD A,0FFH
RET
dataBEmpty:
LD A,0
RET
;------------------------------------------------------------------------------------------------
reader:
PUSH AF
reader2: LD A,(iobyte)
AND $08
CP $08
JR NZ,coninB
JR coninA
;------------------------------------------------------------------------------------------------
conin:
PUSH AF
LD A,(iobyte)
AND $03
CP $02
JR Z,reader2 ; "BAT:" redirect
CP $01
JR NZ,coninB
coninA:
POP AF
waitForCharA:
IN A,(ACIA0_C) ; Status byte
AND $01
CP $0 ; Z flag set if no char
JR Z, waitForCharA
IN A,(ACIA0_D)
RET ; Char ready in A
coninB:
POP AF
waitForCharB:
IN A,(ACIA1_C) ; Status byte
AND $01
CP $0 ; Z flag set if no char
JR Z, waitForCharB
IN A,(ACIA1_D)
RET ; Char ready in A
;------------------------------------------------------------------------------------------------
list: PUSH AF ; Store character
list2: LD A,(iobyte)
AND $C0
CP $40
JR NZ,conoutB1
JR conoutA1
;------------------------------------------------------------------------------------------------
punch: PUSH AF ; Store character
LD A,(iobyte)
AND $20
CP $20
JR NZ,conoutB1
JR conoutA1
;------------------------------------------------------------------------------------------------
conout: PUSH AF
LD A,(iobyte)
AND $03
CP $02
JR Z,list2 ; "BAT:" redirect
CP $01
JR NZ,conoutB1
conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting
JR Z,conoutA1 ; Loop until ACIA flag signals ready
LD A,C
OUT (ACIA0_D),A ; OUTput the character
POP AF
RET
conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting
JR Z,conoutB1 ; Loop until ACIA flag signals ready
LD A,C
OUT (ACIA1_D),A ; OUTput the character
POP AF
RET
;------------------------------------------------------------------------------------------------
CKACIA0
IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready
RRCA ; Rotates RX status into Carry Flag,
BIT 0,A ; Set Zero flag if still transmitting character
RET
CKACIA1
IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready
RRCA ; Rotates RX status into Carry Flag,
BIT 0,A ; Set Zero flag if still transmitting character
RET
;------------------------------------------------------------------------------------------------
listst: LD A,$FF ; Return list status of 0xFF (ready).
RET
;================================================================================================
; Disk processing entry points
;================================================================================================
seldsk:
LD HL,$0000
LD A,C
CP 16 ; 16 for 128MB disk, 8 for 64MB disk
jr C,chgdsk ; if invalid drive will give BDOS error
LD A,(userdrv) ; so set the drive back to a:
CP C ; If the default disk is not the same as the
RET NZ ; selected drive then return,
XOR A ; else reset default back to a:
LD (userdrv),A ; otherwise will be stuck in a loop
LD (sekdsk),A
ret
chgdsk: LD (sekdsk),A
RLC a ;*2
RLC a ;*4
RLC a ;*8
RLC a ;*16
LD HL,dpbase
LD b,0
LD c,A
ADD HL,BC
RET
;------------------------------------------------------------------------------------------------
home:
ld a,(hstwrt) ;check for pending write
or a
jr nz,homed
ld (hstact),a ;clear host active flag
homed:
LD BC,0000h
;------------------------------------------------------------------------------------------------
settrk: LD (sektrk),BC ; Set track passed from BDOS in register BC.
RET
;------------------------------------------------------------------------------------------------
setsec: LD (seksec),BC ; Set sector passed from BDOS in register BC.
RET
;------------------------------------------------------------------------------------------------
setdma: LD (dmaAddr),BC ; Set DMA ADDress given by registers BC.
RET
;------------------------------------------------------------------------------------------------
sectran: PUSH BC
POP HL
RET
;------------------------------------------------------------------------------------------------
read:
;read the selected CP/M sector
xor a
ld (unacnt),a
ld a,1
ld (readop),a ;read operation
ld (rsflag),a ;must read data
ld a,wrual
ld (wrtype),a ;treat as unalloc
jp rwoper ;to perform the read
;------------------------------------------------------------------------------------------------
write:
;write the selected CP/M sector
xor a ;0 to accumulator
ld (readop),a ;not a read operation
ld a,c ;write type in c
ld (wrtype),a
cp wrual ;write unallocated?
jr nz,chkuna ;check for unalloc
;
; write to unallocated, set parameters
ld a,blksiz/128 ;next unalloc recs
ld (unacnt),a
ld a,(sekdsk) ;disk to seek
ld (unadsk),a ;unadsk = sekdsk
ld hl,(sektrk)
ld (unatrk),hl ;unatrk = sectrk
ld a,(seksec)
ld (unasec),a ;unasec = seksec
;
chkuna:
; check for write to unallocated sector
ld a,(unacnt) ;any unalloc remain?
or a
jr z,alloc ;skip if not
;
; more unallocated records remain
dec a ;unacnt = unacnt-1
ld (unacnt),a
ld a,(sekdsk) ;same disk?
ld hl,unadsk
cp (hl) ;sekdsk = unadsk?
jp nz,alloc ;skip if not
;
; disks are the same
ld hl,unatrk
call sektrkcmp ;sektrk = unatrk?
jp nz,alloc ;skip if not
;
; tracks are the same
ld a,(seksec) ;same sector?
ld hl,unasec
cp (hl) ;seksec = unasec?
jp nz,alloc ;skip if not
;
; match, move to next sector for future ref
inc (hl) ;unasec = unasec+1
ld a,(hl) ;end of track?
cp cpmspt ;count CP/M sectors
jr c,noovf ;skip if no overflow
;
; overflow to next track
ld (hl),0 ;unasec = 0
ld hl,(unatrk)
inc hl
ld (unatrk),hl ;unatrk = unatrk+1
;
noovf:
;match found, mark as unnecessary read
xor a ;0 to accumulator
ld (rsflag),a ;rsflag = 0
jr rwoper ;to perform the write
;
alloc:
;not an unallocated record, requires pre-read
xor a ;0 to accum
ld (unacnt),a ;unacnt = 0
inc a ;1 to accum
ld (rsflag),a ;rsflag = 1
;------------------------------------------------------------------------------------------------
rwoper:
;enter here to perform the read/write
xor a ;zero to accum
ld (erflag),a ;no errors (yet)
ld a,(seksec) ;compute host sector
or a ;carry = 0
rra ;shift right
or a ;carry = 0
rra ;shift right
ld (sekhst),a ;host sector to seek
;
; active host sector?
ld hl,hstact ;host active flag
ld a,(hl)
ld (hl),1 ;always becomes 1
or a ;was it already?
jr z,filhst ;fill host if not
;
; host buffer active, same as seek buffer?
ld a,(sekdsk)
ld hl,hstdsk ;same disk?
cp (hl) ;sekdsk = hstdsk?
jr nz,nomatch
;
; same disk, same track?
ld hl,hsttrk
call sektrkcmp ;sektrk = hsttrk?
jr nz,nomatch
;
; same disk, same track, same buffer?
ld a,(sekhst)
ld hl,hstsec ;sekhst = hstsec?
cp (hl)
jr z,match ;skip if match
;
nomatch:
;proper disk, but not correct sector
ld a,(hstwrt) ;host written?
or a
call nz,writehst ;clear host buff
;
filhst:
;may have to fill the host buffer
ld a,(sekdsk)
ld (hstdsk),a
ld hl,(sektrk)
ld (hsttrk),hl
ld a,(sekhst)
ld (hstsec),a
ld a,(rsflag) ;need to read?
or a
call nz,readhst ;yes, if 1
xor a ;0 to accum
ld (hstwrt),a ;no pending write
;
match:
;copy data to or from buffer
ld a,(seksec) ;mask buffer number
and secmsk ;least signif bits
ld l,a ;ready to shift
ld h,0 ;double count
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
; hl has relative host buffer address
ld de,hstbuf
add hl,de ;hl = host address
ex de,hl ;now in DE
ld hl,(dmaAddr) ;get/put CP/M data
ld c,128 ;length of move
ld a,(readop) ;which way?
or a
jr nz,rwmove ;skip if read
;
; write operation, mark and switch direction
ld a,1
ld (hstwrt),a ;hstwrt = 1
ex de,hl ;source/dest swap
;
rwmove:
;C initially 128, DE is source, HL is dest
ld a,(de) ;source character
inc de
ld (hl),a ;to dest
inc hl
dec c ;loop 128 times
jr nz,rwmove
;
; data has been moved to/from host buffer
ld a,(wrtype) ;write type
cp wrdir ;to directory?
ld a,(erflag) ;in case of errors
ret nz ;no further processing
;
; clear host buffer for directory write
or a ;errors?
ret nz ;skip if so
xor a ;0 to accum
ld (hstwrt),a ;buffer written
call writehst
ld a,(erflag)
ret
;------------------------------------------------------------------------------------------------
;Utility subroutine for 16-bit compare
sektrkcmp:
;HL = .unatrk or .hsttrk, compare with sektrk
ex de,hl
ld hl,sektrk
ld a,(de) ;low byte compare
cp (HL) ;same?
ret nz ;return if not
; low bytes equal, test high 1s
inc de
inc hl
ld a,(de)
cp (hl) ;sets flags
ret
;================================================================================================
; Convert track/head/sector into LBA for physical access to the disk
;================================================================================================
setLBAaddr:
LD HL,(hsttrk)
RLC L
RLC L
RLC L
RLC L
RLC L
LD A,L
AND 0E0H
LD L,A
LD A,(hstsec)
ADD A,L
LD (lba0),A
LD HL,(hsttrk)
RRC L
RRC L
RRC L
LD A,L
AND 01FH
LD L,A
RLC H
RLC H
RLC H
RLC H
RLC H
LD A,H
AND 020H
LD H,A
LD A,(hstdsk)
RLC a
RLC a
RLC a
RLC a
RLC a
RLC a
AND 0C0H
ADD A,H
ADD A,L
LD (lba1),A
LD A,(hstdsk)
RRC A
RRC A
AND 03H
LD (lba2),A
LD a,00H
LD (lba3),A
; Transfer LBA to disk (LBA3 not used on SD card)
LD A,(lba2)
OUT (SD_LBA2),A
LD A,(lba1)
OUT (SD_LBA1),A
LD A,(lba0)
OUT (SD_LBA0),A
RET
;================================================================================================
; Read physical sector from host
;================================================================================================
readhst:
PUSH AF
PUSH BC
PUSH HL
rdWait1: IN A,(SD_STATUS)
CP 128
JR NZ,rdWait1
CALL setLBAaddr
LD A,$00 ; 00 = Read block
OUT (SD_CONTROL),A
LD c,4
LD HL,hstbuf
rd4secs:
LD b,128
rdByte:
rdWait2: IN A,(SD_STATUS)
CP 224 ; Read byte waiting
JR NZ,rdWait2
IN A,(SD_DATA)
LD (HL),A
INC HL
dec b
JR NZ, rdByte
dec c
JR NZ,rd4secs
POP HL
POP BC
POP AF
XOR a
ld (erflag),a
RET
;================================================================================================
; Write physical sector to host
;================================================================================================
writehst:
PUSH AF
PUSH BC
PUSH HL
wrWait1: IN A,(SD_STATUS)
CP 128
JR NZ,wrWait1
CALL setLBAaddr
LD A,$01 ; 01 = Write block
OUT (SD_CONTROL),A
LD c,4
LD HL,hstbuf
wr4secs:
LD b,128
wrByte:
wrWait2: IN A,(SD_STATUS)
CP 160 ; Write buffer empty
JR NZ,wrWait2
; UPDATE S0urceror, inserted wait cycle between IN and OUT
; to resolve unknown write issue in sd_controller.vhd in combination
; with MISTer virtual SD interface sys/sd_card.sv
; which results in hangs or write errors.
push bc
ld b,100
_again:
djnz _again
pop bc
; END UPDATE
LD A,(HL)
OUT (SD_DATA),A
INC HL
dec b
JR NZ, wrByte
dec c
JR NZ,wr4secs
POP HL
POP BC
POP AF
XOR a
ld (erflag),a
RET
;================================================================================================
; Utilities
;================================================================================================
printInline:
EX (SP),HL ; PUSH HL and put RET ADDress into HL
PUSH AF
PUSH BC
nextILChar: LD A,(HL)
CP 0
JR Z,endOfPrint
LD C,A
CALL conout ; Print to TTY
iNC HL
JR nextILChar
endOfPrint: INC HL ; Get past "null" terminator
POP BC
POP AF
EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
RET
;================================================================================================
; Data storage
;================================================================================================
dirbuf: .ds 128 ;scratch directory area
alv00: .ds 257 ;allocation vector 0
alv01: .ds 257 ;allocation vector 1
alv02: .ds 257 ;allocation vector 2
alv03: .ds 257 ;allocation vector 3
alv04: .ds 257 ;allocation vector 4
alv05: .ds 257 ;allocation vector 5
alv06: .ds 257 ;allocation vector 6
alv07: .ds 257 ;allocation vector 7
alv08: .ds 257 ;allocation vector 8
alv09: .ds 257 ;allocation vector 9
alv10: .ds 257 ;allocation vector 10
alv11: .ds 257 ;allocation vector 11
alv12: .ds 257 ;allocation vector 12
alv13: .ds 257 ;allocation vector 13
alv14: .ds 257 ;allocation vector 14
alv15: .ds 257 ;allocation vector 15
lba0 .DB 00h
lba1 .DB 00h
lba2 .DB 00h
lba3 .DB 00h
.DS 020h ; Start of BIOS stack area.
biosstack: .EQU $
sekdsk: .ds 1 ;seek disk number
sektrk: .ds 2 ;seek track number
seksec: .ds 2 ;seek sector number
;
hstdsk: .ds 1 ;host disk number
hsttrk: .ds 2 ;host track number
hstsec: .ds 1 ;host sector number
;
sekhst: .ds 1 ;seek shr secshf
hstact: .ds 1 ;host active flag
hstwrt: .ds 1 ;host written flag
;
unacnt: .ds 1 ;unalloc rec cnt
unadsk: .ds 1 ;last unalloc disk
unatrk: .ds 2 ;last unalloc track
unasec: .ds 1 ;last unalloc sector
;
erflag: .ds 1 ;error reporting
rsflag: .ds 1 ;read sector flag
readop: .ds 1 ;1 if read operation
wrtype: .ds 1 ;write operation type
dmaAddr: .ds 2 ;last dma address
hstbuf: .ds 512 ;host buffer
hstBufEnd: .EQU $
biosEnd: .EQU $
; Disable the ROM, pop the active IO port from the stack (supplied by monitor),
; then start CP/M
popAndRun:
LD A,$01
OUT ($38),A
POP AF
CP $01
JR Z,consoleAtB
LD A,$01 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is CRT:)
JR setIOByte
consoleAtB: LD A,$00 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is TTY:)
setIOByte: LD (iobyte),A
JP bios
;=================================================================================
; Relocate TPA area from 4100 to 0100 then start CP/M
; Used to manually transfer a loaded program after CP/M was previously loaded
;=================================================================================
.org 0FFE8H
LD A,$01
OUT ($38),A
LD HL,04100H
LD DE,00100H
LD BC,08F00H
LDIR
JP bios
;=================================================================================
; Normal start CP/M vector
;=================================================================================
.ORG 0FFFEH
.dw popAndRun
.END

Binary file not shown.

View File

@@ -0,0 +1,85 @@
LF .EQU 0AH ;line feed
FF .EQU 0CH ;form feed
CR .EQU 0DH ;carriage RETurn
DOT .EQU '.'
CH375_CMD_CHECK_EXIST .EQU 06H
CH375_CMD_RESET_ALL .EQU 05H
.ORG 4000H
CALL printInline
.TEXT "Check CH376s communication"
.DB CR,LF,0
CALL printInline
.TEXT "Send A"
.DB CR,LF,0
ld a, CH375_CMD_RESET_ALL
out (20h),a
ld a, CH375_CMD_CHECK_EXIST
out (20h),a
ld a, 'A'
out (20h),a
; receive result
xor a
out (20h),a
in a, (20h)
xor 255
CALL printInline
.TEXT "Received "
.DB 0
RST 08H ; print contents of A
CALL printInline
.DB CR,LF,0
ret
; LOOPBACK TEST
ld b, 39h
outer:
ld a, b
cp 2fh
ret z
; send out
out (20h),a
;inner:
; ld a, DOT
; rst 08h
; in a, (21h)
; bit 0,a
; jr z, inner
xor a
; read back
in a, (20h)
rst 08h ; should be 30h => 0..9
dec b
jr outer
ret
printInline:
EX (SP),HL ; PUSH HL and put RET ADDress into HL
PUSH AF
PUSH BC
nextILChar: LD A,(HL)
CP 0
JR Z,endOfPrint
RST 08H
INC HL
JR nextILChar
endOfPrint: INC HL ; Get past "null" terminator
POP BC
POP AF
EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
RET
.END

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,287 @@
;==================================================================================
; Contents of this file are copyright Grant Searle
; HEX routine from Joel Owens.
;
; You have permission to use this for NON COMMERCIAL USE ONLY
; If you wish to use it elsewhere, please include an acknowledgement to myself.
;
; http://searle.hostei.com/grant/index.html
;
; eMail: home.micros01@btinternet.com
;
; If the above don't work, please perform an Internet search to see if I have
; updated the web page hosting service.
;
;==================================================================================
TPA .EQU 100H
REBOOT .EQU 0H
BDOS .EQU 5H
CONIO .EQU 6
CONINP .EQU 1
CONOUT .EQU 2
PSTRING .EQU 9
MAKEF .EQU 22
CLOSEF .EQU 16
WRITES .EQU 21
DELF .EQU 19
SETUSR .EQU 32
CR .EQU 0DH
LF .EQU 0AH
FCB .EQU 05CH
BUFF .EQU 080H
.ORG TPA
LD A,0
LD (buffPos),A
LD (checkSum),A
LD (byteCount),A
LD (printCount),A
LD HL,BUFF
LD (buffPtr),HL
WAITLT: CALL GETCHR
CP 'U'
JP Z,SETUSER
CP ':'
JR NZ,WAITLT
LD C,DELF
LD DE,FCB
CALL BDOS
LD C,MAKEF
LD DE,FCB
CALL BDOS
GETHEX:
CALL GETCHR
CP '>'
JR Z,CLOSE
LD B,A
PUSH BC
CALL GETCHR
POP BC
LD C,A
CALL BCTOA
LD B,A
LD A,(checkSum)
ADD A,B
LD (checkSum),A
LD A,(byteCount)
INC A
LD (byteCount),A
LD A,B
LD HL,(buffPtr)
LD (HL),A
INC HL
LD (buffPtr),HL
LD A,(buffPos)
INC A
LD (buffPos),A
CP 80H
JR NZ,NOWRITE
LD C,WRITES
LD DE,FCB
CALL BDOS
LD A,'.'
CALL PUTCHR
; New line every 8K (64 dots)
LD A,(printCount)
INC A
CP 64
JR NZ,noCRLF
LD (printCount),A
LD A,CR
CALL PUTCHR
LD A,LF
CALL PUTCHR
LD A,0
noCRLF: LD (printCount),A
LD HL,BUFF
LD (buffPtr),HL
LD A,0
LD (buffPos),A
NOWRITE:
JR GETHEX
CLOSE:
LD A,(buffPos)
CP 0
JR Z,NOWRITE2
LD C,WRITES
LD DE,FCB
CALL BDOS
LD A,'.'
CALL PUTCHR
NOWRITE2:
LD C,CLOSEF
LD DE,FCB
CALL BDOS
; Byte count (lower 8 bits)
CALL GETCHR
LD B,A
PUSH BC
CALL GETCHR
POP BC
LD C,A
CALL BCTOA
LD B,A
LD A,(byteCount)
SUB B
CP 0
JR Z,byteCountOK
LD A,CR
CALL PUTCHR
LD A,LF
CALL PUTCHR
LD DE,countErrMess
LD C,PSTRING
CALL BDOS
; Sink remaining 2 bytes
CALL GETCHR
CALL GETCHR
JR FINISH
byteCountOK:
; Checksum
CALL GETCHR
LD B,A
PUSH BC
CALL GETCHR
POP BC
LD C,A
CALL BCTOA
LD B,A
LD A,(checkSum)
SUB B
CP 0
JR Z,checksumOK
LD A,CR
CALL PUTCHR
LD A,LF
CALL PUTCHR
LD DE,chkErrMess
LD C,PSTRING
CALL BDOS
JR FINISH
checksumOK:
LD A,CR
CALL PUTCHR
LD A,LF
CALL PUTCHR
LD DE,OKMess
LD C,PSTRING
CALL BDOS
FINISH:
LD C,SETUSR
LD E,0
CALL BDOS
JP REBOOT
SETUSER:
CALL GETCHR
CALL HEX2VAL
LD E,A
LD C,SETUSR
CALL BDOS
JP WAITLT
; Get a char into A
;GETCHR: LD C,CONINP
; CALL BDOS
; RET
; Wait for a char into A (no echo)
GETCHR:
LD E,$FF
LD C,CONIO
CALL BDOS
CP 0
JR Z,GETCHR
RET
; Write A to output
PUTCHR: LD C,CONOUT
LD E,A
CALL BDOS
RET
;------------------------------------------------------------------------------
; Convert ASCII characters in B C registers to a byte value in A
;------------------------------------------------------------------------------
BCTOA LD A,B ; Move the hi order byte to A
SUB $30 ; Take it down from Ascii
CP $0A ; Are we in the 0-9 range here?
JR C,BCTOA1 ; If so, get the next nybble
SUB $07 ; But if A-F, take it down some more
BCTOA1 RLCA ; Rotate the nybble from low to high
RLCA ; One bit at a time
RLCA ; Until we
RLCA ; Get there with it
LD B,A ; Save the converted high nybble
LD A,C ; Now get the low order byte
SUB $30 ; Convert it down from Ascii
CP $0A ; 0-9 at this point?
JR C,BCTOA2 ; Good enough then, but
SUB $07 ; Take off 7 more if it's A-F
BCTOA2 ADD A,B ; Add in the high order nybble
RET
; Change Hex in A to actual value in A
HEX2VAL SUB $30
CP $0A
RET C
SUB $07
RET
buffPos .DB 0H
buffPtr .DW 0000H
printCount .DB 0H
checkSum .DB 0H
byteCount .DB 0H
OKMess .BYTE "OK$"
chkErrMess .BYTE "======Checksum Error======$"
countErrMess .BYTE "======File Length Error======$"
.END

View File

@@ -0,0 +1,220 @@
;==================================================================================
; Contents of this file are copyright Grant Searle
;
; You have permission to use this for NON COMMERCIAL USE ONLY
; If you wish to use it elsewhere, please include an acknowledgement to myself.
;
; http://searle.hostei.com/grant/index.html
;
; eMail: home.micros01@btinternet.com
;
; If the above don't work, please perform an Internet search to see if I have
; updated the web page hosting service.
;
;==================================================================================
numDrives .EQU 15 ; Not including A:
SD_DATA .EQU 088H
SD_CONTROL .EQU 089H
SD_STATUS .EQU 089H
SD_LBA0 .EQU 08AH
SD_LBA1 .EQU 08BH
SD_LBA2 .EQU 08CH
LF .EQU 0AH ;line feed
FF .EQU 0CH ;form feed
CR .EQU 0DH ;carriage RETurn
;====================================================================================
.ORG 5000H ; Format program origin.
CALL printInline
.TEXT "CP/M Formatter 2.0 by G. Searle 2013"
.DB CR,LF,0
LD A,'A'
LD (drvName),A
; There are 512 directory entries per disk, 4 DIR entries per sector
; So 128 x 128 byte sectors are to be initialised
; The drive uses 512 byte sectors, so 32 x 512 byte sectors per disk
; require initialisation
;Drive 0 (A:) is slightly different due to reserved track, so DIR sector starts at 32
LD A,(drvName)
RST 08H ; Print drive letter
INC A
LD (drvName),A
LD A,$20
LD (secNo),A
processSectorA:
LD A,(secNo)
OUT (SD_LBA0),A
LD A,0
OUT (SD_LBA1),A
LD A,0
OUT (SD_LBA2),A
LD a,$E0
call writehst
LD A,(secNo)
INC A
LD (secNo),A
CP $40
JR NZ, processSectorA
;Drive 1 onwards (B: etc) don't have reserved tracks, so sector starts at 0
LD DE,$0040 ; HL increment
LD HL,$0040 ; H = LBA2, L=LBA1, initialise for drive 1 (B:)
LD B,numDrives
processDirs:
LD A,(drvName)
RST 08H ; Print drive letter
INC A
LD (drvName),A
LD A,0
LD (secNo),A
processSector:
LD A,(secNo)
OUT (SD_LBA0),A
LD A,L
OUT (SD_LBA1),A
LD A,H
OUT (SD_LBA2),A
call writehst
LD A,(secNo)
INC A
LD (secNo),A
CP $20
JR NZ, processSector
ADD HL,DE
DEC B
JR NZ,processDirs
CALL printInline
.DB CR,LF
.TEXT "Formatting complete"
.DB CR,LF,0
RET
;================================================================================================
; Write physical sector to host
;================================================================================================
writehst:
PUSH AF
PUSH BC
PUSH HL
wrWait1: IN A,(SD_STATUS)
CP 128
JR NZ,wrWait1
;CALL setLBAaddr
LD A,$01 ; 01 = Write block
OUT (SD_CONTROL),A
LD c,4
wr4secs:
LD HL,dirData
LD b,128
wrByte:
wrWait2: IN A,(SD_STATUS)
CP 160 ; Write buffer empty
JR NZ,wrWait2
;LD A,'.'
;RST 08H
; UPDATE S0urceror, inserted wait cycle between IN and OUT
; to resolve unknown write issue in sd_controller.vhd in combination
; with MISTer virtual SD interface sys/sd_card.sv
; which results in hangs or write errors.
push bc
ld b,100
_again:
djnz _again
pop bc
; END UPDATE
LD A,(HL)
OUT (SD_DATA),A
INC HL
dec b
JR NZ, wrByte
dec c
JR NZ,wr4secs
POP HL
POP BC
POP AF
;XOR a
;ld (erflag),a
RET
;================================================================================================
; Utilities
;================================================================================================
printInline:
EX (SP),HL ; PUSH HL and put RET ADDress into HL
PUSH AF
PUSH BC
nextILChar: LD A,(HL)
CP 0
JR Z,endOfPrint
RST 08H
INC HL
JR nextILChar
endOfPrint: INC HL ; Get past "null" terminator
POP BC
POP AF
EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
RET
secNo .db 0
drvName .db 0
; Directory data for 1 x 128 byte sector
dirData:
.DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.END

View File

@@ -0,0 +1,163 @@
;==================================================================================
; Contents of this file are copyright Grant Searle
;
; You have permission to use this for NON COMMERCIAL USE ONLY
; If you wish to use it elsewhere, please include an acknowledgement to myself.
;
; http://searle.hostei.com/grant/index.html
;
; eMail: home.micros01@btinternet.com
;
; If the above don't work, please perform an Internet search to see if I have
; updated the web page hosting service.
;
;==================================================================================
loadAddr .EQU 0D000h
numSecs .EQU 24 ; Number of 512 sectors to be loaded
SD_DATA .EQU 088H
SD_CONTROL .EQU 089H
SD_STATUS .EQU 089H
SD_LBA0 .EQU 08AH
SD_LBA1 .EQU 08BH
SD_LBA2 .EQU 08CH
LF .EQU 0AH ;line feed
FF .EQU 0CH ;form feed
CR .EQU 0DH ;carriage RETurn
;================================================================================================
.ORG 5000H ; Loader origin.
CALL printInline
.TEXT "CP/M System Transfer by G. Searle 2012-13"
.DB CR,LF,0
LD B,numSecs
LD A,0
LD (lba0),A
ld (lba1),A
ld (lba2),A
ld (lba3),A
LD HL,loadAddr
LD (dmaAddr),HL
processSectors:
call writehst
LD DE,0200H
LD HL,(dmaAddr)
ADD HL,DE
LD (dmaAddr),HL
LD A,(lba0)
INC A
LD (lba0),A
djnz processSectors
CALL printInline
.DB CR,LF
.TEXT "System transfer complete"
.DB CR,LF,0
RET
; =========================================================================
; Disk routines as used in CBIOS
; =========================================================================
setLBAaddr:
LD A,(lba2)
OUT (SD_LBA2),A
LD A,(lba1)
OUT (SD_LBA1),A
LD A,(lba0)
OUT (SD_LBA0),A
ret
;================================================================================================
; Write physical sector to host
;================================================================================================
writehst:
PUSH AF
PUSH BC
PUSH HL
wrWait1: IN A,(SD_STATUS)
CP 128
JR NZ,wrWait1
CALL setLBAaddr
LD A,$01 ; 01 = Write block
OUT (SD_CONTROL),A
LD c,4
;LD HL,hstbuf
wr4secs:
LD b,128
wrByte:
wrWait2: IN A,(SD_STATUS)
CP 160 ; Write buffer empty
JR NZ,wrWait2
; UPDATE S0urceror, inserted wait cycle between IN and OUT
; to resolve unknown write issue in sd_controller.vhd in combination
; with MISTer virtual SD interface sys/sd_card.sv
; which results in hangs or write errors.
push bc
ld b,100
_again:
djnz _again
pop bc
; END UPDATE
LD A,(HL)
OUT (SD_DATA),A
INC HL
dec b
JR NZ, wrByte
dec c
JR NZ,wr4secs
POP HL
POP BC
POP AF
;XOR a
;ld (erflag),a
RET
;================================================================================================
; Utilities
;================================================================================================
printInline:
EX (SP),HL ; PUSH HL and put RET ADDress into HL
PUSH AF
PUSH BC
nextILChar: LD A,(HL)
CP 0
JR Z,endOfPrint
RST 08H
INC HL
JR nextILChar
endOfPrint: INC HL ; Get past "null" terminator
POP BC
POP AF
EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
RET
lba0 .DB 00h
lba1 .DB 00h
lba2 .DB 00h
lba3 .DB 00h
dmaAddr .dw 0
.END

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
`define BUILD_DATE "201121"
`define BUILD_DATE "201221"