Где я могу найти список RTC, используемых в российских ZX клонов ?
Мне нужен список портов + описание. (или код драйвера)
Вид для печати
Где я могу найти список RTC, используемых в российских ZX клонов ?
Мне нужен список портов + описание. (или код драйвера)
Стандартом стало подключение по Глюку
#DFF7 - задаёт номер регистра, с которым мы хотим работать;
#BFF7 - порт данных, через него передаются данные в микросхему/из неё;
#EFF7 - бит 7 этого порта управляет доступом к микросхеме (0 - доступа нет, 1 - доступ есть).
Тут подробно http://zxbyte.ru/index.php?id=89
Драйвер http://vrcp.ru/zx/systems/VRCPsys5.zip
описание в vrcpcmos.W
Reverse эмулирует DIVMMC ? Я могу написать драйвер RTC для ESXDOS, но мне нужно знать адреса порты, увидеть обработчик для чтения RTC.
CMOS_ON EQU 0X80
CMOS_OFF EQU 0
CMOS_SET_ADR EQU 0XDFF7 ;АДРЕС ПОРТА УСТАНОВКИ АДРЕСА CMOS ЯЧЕЙКИ
CMOS_RD_WR EQU 0XBFF7 ;АДРЕС ПОРТА ЧТЕНИЯ/ЗАПИСИ БАЙТ CMOS
PENT_CONF EQU 0XEFF7 ;АДРЕС ПОРТА КОНФИГА РЕЖИМА ПЕНТАГОНА
;НА ВХОДЕ: H-АДРЕС ЯЧЕЙКИ
; L-ПРОЧИТАННОЕ ЗНАЧЕНИЕ
READCMOS DI
PUSH BC
LD BC,PENT_CONF
LD A,CMOS_ON ;РАЗРЕШЕНИЕ ДОСТУПА К КМОСУ
OUT (C),A
LD B,HIGH (CMOS_SET_ADR) ;СТАРШИЙ БАЙТ АДРЕСА
OUT (C),H
LD B,HIGH (CMOS_RD_WR) ;СТАРШИЙ БАЙТ АДРЕСА
IN L,(C)
JR OFF_CMOS
;НА ВХОДЕ: H-АДРЕС ЯЧЕЙКИ
; L-ЧТО ТУДА ЗАПИСАТЬ
WRITECMOS DI
PUSH BC
LD BC,PENT_CONF
LD A,CMOS_ON ;РАЗРЕШЕНИЕ ДОСТУПА К КМОСУ
OUT (C),A
LD B,HIGH (CMOS_SET_ADR) ;СТАРШИЙ БАЙТ АДРЕСА
OUT (C),H
LD B,HIGH (CMOS_RD_WR) ;СТАРШИЙ БАЙТ АДРЕСА
OUT (C),L
OFF_CMOS LD A,CMOS_OFF ;ЗАПРЕТ ДОСТУПА К КМОСУ
LD B,HIGH (PENT_CONF) ;СТАРШИЙ БАЙТ АДРЕСА
OUT (C),A
POP BC
LD A,L
AND A
RET
Вернее позволяет задать желаемую структуру цифрового устройства в виде принципиальной электрической схемы или программы.
Пример:
I2C Interface SoftCore:Код:; -----------------------------------------------------------------------------
; I2C PCF8583 to MC14818 loader
; -----------------------------------------------------------------------------
RTC_INIT LD BC,#0000
LD HL,#8000
CALL I2C_GET
LD A,#80
LD BC,#EFF7
OUT(C),A
; REGISTER B
LD A,#0B
LD B,#DF
OUT (C),A
LD A,#82
LD B,#BF
OUT (C),A
; SECONDS
LD A,#00
LD B,#DF
OUT (C),A
LD A,(#8002)
LD B,#BF
OUT (C),A
; MINUTES
LD A,#02
LD B,#DF
OUT (C),A
LD A,(#8003)
LD B,#BF
OUT (C),A
; HOURS
LD A,#04
LD B,#DF
OUT (C),A
LD A,(#8004)
AND #3F
LD B,#BF
OUT (C),A
; DAY OF THE WEEK
LD A,#06
LD B,#DF
OUT (C),A
LD A,(#8006)
AND #E0
RLCA
RLCA
RLCA
INC A
LD B,#BF
OUT (C),A
; DATE OF THE MONTH
LD A,#07
LD B,#DF
OUT (C),A
LD A,(#8005)
AND #3F
LD B,#BF
OUT (C),A
; MONTH
LD A,#08
LD B,#DF
OUT (C),A
LD A,(#8006)
AND #1F
LD B,#BF
OUT (C),A
; YEAR
LD A,#09
LD B,#DF
OUT (C),A
LD A,(#8005)
AND #C0
RLCA
RLCA
LD HL,#8010 ; ячейка для хранения года (8 бит)
ADD A,(HL) ; год из PCF + поправка из ячейки
LD B,#BF
OUT (C),A
; REGISTER B
LD A,#0B
LD B,#DF
OUT (C),A
LD A,#02
LD B,#BF
OUT (C),A
LD A,#00
LD BC,#EFF7
OUT(C),A
; -----------------------------------------------------------------------------
; I2C PCF8583
; -----------------------------------------------------------------------------
; Ports:
; #8C: Data (write/read)
; bit 7-0 = Stores I2C read/write data
; #8C: Address (write)
; bit 7-1 = Holds the first seven address bits of the I2C slave device
; bit 0 = I2C 1:read/0:write bit
; #9C: Command/Status Register (write)
; bit 7-2 = Reserved
; bit 1-0 = 00: IDLE; 01: START; 10: nSTART; 11: STOP
; #9C: Command/Status Register (read)
; bit 7-2 = Reserved
; bit 1 = 1:ERROR (I2C transaction error)
; bit 0 = 1:BUSY (I2C bus busy)
; HL= адрес буфера
; B = длина (0=256 байт)
; C = адрес
I2C_GET LD A,%11111101 ; START
OUT (#9C),A
LD A,%10100000 ; SLAVE ADDRESS W
OUT (#8C),A
CALL I2C_ACK
LD A,%11111110 ; NSTART
OUT (#9C),A
LD A,C ; WORD ADDRESS
OUT (#8C),A
CALL I2C_ACK
LD A,%11111101 ; START
OUT (#9C),A
LD A,%10100001 ; SLAVE ADDRESS R
OUT (#8C),A
CALL I2C_ACK
LD A,%11111100 ; IDLE
OUT (#9C),A
I2C_GET2 OUT (#8C),A
CALL I2C_ACK
IN A,(#8C)
LD (HL),A
INC HL
LD A,B
CP 2
JR NZ,I2C_GET1
LD A,%11111111 ; STOP
OUT (#9C),A
I2C_GET1 DJNZ I2C_GET2
RET
; Wait ACK
I2C_ACK IN A,(#9C)
RRCA ; ACK?
JR C,I2C_ACK
RRCA ; ERROR?
RET
Manual I2CКод:-------------------------------------------------------------------[15.10.2011]
-- I2C Controller for PCF8583
-------------------------------------------------------------------------------
-- V0.1 15.10.2011 первая версия
-- The I2C core provides for four register addresses
-- that the CPU can read or writen to:
-- Address 0 -> DATA (write/read) or SLAVE ADDRESS (write)
-- Address 1 -> Command/Status Register (write/read)
-- Data Buffer (write/read):
-- bit 7-0 = Stores I2C read/write data
-- or
-- bit 7-1 = Holds the first seven address bits of the I2C slave device
-- bit 0 = I2C 1:read/0:write bit
-- Command/Status Register (write):
-- bit 7-2 = Reserved
-- bit 1-0 = 00: IDLE; 01: START; 10: nSTART; 11: STOP
-- Command/Status Register (read):
-- bit 7-2 = Reserved
-- bit 1 = ERROR (I2C transaction error)
-- bit 0 = BUSY (I2C bus busy)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity i2c is
port (
-- CPU Interface Signals
RESET : in std_logic;
CLK : in std_logic;
ENA : in std_logic; -- 400KHz (4T = SCL clock frequency 100 kHz)
A : in std_logic;
DI : in std_logic_vector(7 downto 0);
DO : out std_logic_vector(7 downto 0);
WR : in std_logic;
-- I2C Interface Signals
I2C_SCL : inout std_logic;
I2C_SDA : inout std_logic);
end i2c;
architecture rtc_arch of i2c is
type state_t is (s_idle, s_start, s_data, s_ack, s_stop, s_done);
signal state : state_t;
signal data_buf : std_logic_vector(7 downto 0);
signal go : std_logic;
signal mode : std_logic_vector(1 downto 0);
signal shift_reg : std_logic_vector(7 downto 0);
signal ack : std_logic;
signal nbit : std_logic_vector(2 downto 0);
signal phase : std_logic_vector(1 downto 0);
signal scl : std_logic;
signal sda : std_logic;
signal rw_bit : std_logic;
signal rw_flag : std_logic;
begin
-- Read CPU bus into internal registers
cpu_write : process (CLK, RESET, WR)
begin
if CLK'event and CLK = '1' then
if WR = '1' then
if A = '0' then
data_buf <= DI;
else
mode <= DI(1 downto 0);
end if;
end if;
end if;
end process;
process (RESET, CLK, ENA, WR, A, state)
begin
if RESET = '1' or state = s_data then
go <= '0';
elsif CLK'event and CLK = '1' then
if WR = '1' then
if A = '0' then
go <= '1';
end if;
end if;
end if;
end process;
-- Provide data for the CPU to read
cpu_read : process (A, state, shift_reg, ack, go)
begin
DO(7 downto 2) <= "111111";
if A = '0' then
DO <= shift_reg;
else
if (state = s_idle and go = '0') then
DO(0) <= '0';
else
DO(0) <= '1';
end if;
DO(1) <= ack;
end if;
end process;
-- 0123 0123 01230123012301230123012301230123 0123 0123 0123
-- SCL ---- ---- __--__--__--__--__--__--__--__-- __-- ---- ----
-- SDA ---- --__ _< 7 X 6 X 5 X 4 X 3 X 2 X 1 X 0 >x x ----
-- Reset Start Data/Slave address/Word address Ack Stop Done
-- I2C transfer state machine
i2c_proc : process (RESET, CLK, ENA, go)
begin
if RESET = '1' then
scl <= '1';
sda <= '1';
state <= s_idle;
ack <= '0'; -- No error
phase <= "00";
elsif CLK'event and CLK = '1' then
if ENA = '1' then
phase <= phase + "01"; -- Next phase by default
-- STATE: IDLE
if state = s_idle then
phase <= "00";
if go = '1' then
shift_reg <= data_buf;
nbit <= "000";
if mode = "01" then
rw_flag <= data_buf(0); -- 1= Read; 0= Write
rw_bit <= '0';
state <= s_start;
else
rw_bit <= rw_flag;
state <= s_data;
end if;
end if;
-- STATE: START
elsif state = s_start then -- Generate START condition
case phase is
when "00" =>
scl <= '1';
sda <= '1';
when "10" =>
sda <= '0';
when "11" =>
state <= s_data; -- Advance to next state
when others => null;
end case;
-- STATE: DATA
elsif state = s_data then -- Generate data
case phase is
when "00" =>
scl <= '0'; -- Drop SCL
when "01" =>
if rw_bit = '0' then -- Write Data
sda <= shift_reg(7); -- Output data and shift (MSb first)
else
sda <= '1';
end if;
when "10" =>
scl <= '1'; -- Raise SCL
shift_reg <= shift_reg(6 downto 0) & I2C_SDA; -- Input data and shift (MSb first)
when "11" =>
if nbit = "111" then -- Next bit or advance to next state when done
state <= s_ack;
else
nbit <= nbit + "001";
end if;
when others => null;
end case;
-- STATE: ACK
elsif state = s_ack then -- Generate ACK clock and check for error condition
case phase is
when "00" =>
scl <= '0'; -- Drop SCL
when "01" =>
if (rw_bit = '0' or mode = "11") then
sda <= '1';
else
sda <= '0';
end if;
when "10" =>
scl <= '1'; -- Raise SCL
ack <= I2C_SDA; -- Sample ack bit
when "11" =>
if mode(1) = '0' then
state <= s_idle;
else
state <= s_stop;
end if;
when others => null;
end case;
-- STATE: STOP
elsif state = s_stop then -- Generate STOP condition
case phase is
when "00" =>
scl <= '0';
when "01" =>
if mode = "11" then
sda <= '0';
else
sda <= '1';
end if;
when "10" =>
scl <= '1';
when "11" =>
state <= s_done;
when others => null;
end case;
-- STATE: DONE
else
scl <= '1';
sda <= '1';
if phase = "11" then
state <= s_idle;
end if;
end if;
end if;
end if;
end process;
-- Create open-drain outputs for I2C bus
I2C_SCL <= '0' when scl = '0' else 'Z';
I2C_SDA <= '0' when sda = '0' else 'Z';
end rtc_arch;
VELESOFT, если есть стандарт, то я его просто поддержу в конфигурации для ReVerSE.
А много ли часов подключено по Глюку? Есть ещё ведь стандарты СМУКа и Мультикарты.