┌────────────────────────────────────────┐
│░░░░░░░░░░░ Программирование ░░░░░░░░░░░│
└────────────────────────────────────────┘
Драйвер памяти
(C) Pawel/RS
Этот драйвер является переработкой,
опубликованного в ZX-FORMAT'е 5.Теперь на-
личие 128-й памяти определяется не по ПЗУ,
в процессе теста не портятся байты в бан-
ках, таблица используемых банков формиру-
ется специальной подпрограммкой, что зна-
чительно сокращает и объем ассемблерного
текста и объектного кода. Кроме этого дра-
йвер реорганизован с целью выделить блоки
ненужные после проведения теста памяти.
После теста количество доступных банков
хранится в переменной PAGE, а тип компью-
тера в TYPE, для расшифровки ее комбинации
битов, вам придется почитать ZX-FORMAT.
Переключение логических банков осуществля-
ется подпрограммой ONPAGE. Данный драйвер
успешно был использован в REAL COMMANDERе,
а также в более древней программке, потре-
ковом копировщике REALCOPY. Его надежность
проверена многолетней эксплуатацией этих
программ.
;Memory driver
;(C) Pawel/RS
;(C) Creator
;Перед работой с драйвером вызовите подп-
;рограмму START, для инициализации и опре-
;деления свободной памяти.
;Подключение логического банка, номер в A,
;нумерация начинается с нуля.
ONPAGE PUSH BC
PUSH HL
LD C,A
LD B,0
LD HL,TABL_PG
ADD HL,BC
LD A,(HL)
POP HL
POP BC
EX_RAM DI
PUSH HL
PUSH AF
PUSH BC
LD HL,TYPE
BIT 1,(HL)
JR NZ,ZS256
BIT 2,(HL)
JR NZ,PROFI
BIT 3,(HL)
JR NZ,TURBO_2
BIT 4,(HL)
JR NZ,ATM1
BIT 0,(HL)
JR NZ,SPECCY
BIT 7,(HL)
JR NZ,SPECCY
JR TDK
TURBO_2 PUSH AF
PUSH IX
AND 24
CPL
LD BC,#FFF7
CALL OUTC_A
POP IX
POP AF
JP SPECCY
ATM1 LD BC,#FDFD
PUSH AF
RRCA
RRCA
RRCA
AND 3
JR HOME
PROFI LD BC,#DFFD
PUSH AF
RRCA
RRCA
RRCA
AND 7
JR HOME
ZS256 PUSH AF
LD B,A
AND %00001000
RLCA
LD C,A
LD A,B
AND %00110000
RLCA
RLCA
ADD A,C
LD BC,#1FFD
HOME OUT (C),A
NOP
POP AF
SPECCY LD B,A
AND 24
RLCA
RLCA
RLCA
LD C,A
LD A,B
AND 7
ADD A,C
OR 16
LD BC,#7FFD
OUT (C),A
NOP
TDK POP BC
POP AF
POP HL
RET
OUTC_A LD IX,10835
PUSH IX
JP 15663
;Инициализация и тест памяти, вызывается
;в начале работы, после чего память зани-
;маемую программой ниже, можно использо-
;вать по своему усмотрению.
START CALL TEST
LD A,(8)
CP #2A ;если SCORPION, то
RET Z ;удалить из списка
LD C,8 ;8-й банк, исполь-
JP DEBUG ;зующийся монитором.
TEST CALL TABINIT
XOR A
LD (TYPE),A
INC A
LD (PAGE),A
DI
LD A,(#08)
CP #C3
JR NZ,ITURBO
LD HL,TYPE
SET 7,(HL)
ITURBO LD HL,(1111)
LD BC,#FFF7
LD A,%00011111
CALL OUTC_A
LD DE,(#C000+1111)
AND A
SBC HL,DE
LD BC,#FFF7
LD A,255
CALL OUTC_A
JR NZ,IDFFD
LD HL,TYPE
SET 3,(HL)
JR I7FFD
MM_ATM DB #DB,#1F,#C9
IDFFD LD HL,#80
LD DE,#1000
LD BC,#DFFD
OUT (C),D
NOP
LD A,(HL)
INC (HL)
CP (HL)
LD (HL),A
OUT (C),E
NOP
JR Z,I1FFD
LD HL,TYPE
SET 2,(HL)
OUT (C),D
NOP
LD B,#7F
OUT (C),D
NOP
LD B,#DF
OUT (C),E
NOP
JR I7FFD
I1FFD LD DE,#1110
LD B,#1F
OUT (C),D
NOP
LD A,(HL)
INC (HL)
CP (HL)
LD (HL),A
OUT (C),E
NOP
JR Z,IFDFD
XOR A
OUT (C),A
LD HL,TYPE
SET 1,(HL)
JP I7FFD
IFDFD LD B,C
LD HL,#FFFF
OUT (C),D
NOP
LD B,#7F
OUT (C),D
NOP
LD A,(HL)
LD (RBT2+1),A
LD (HL),D
LD B,C
OUT (C),E
NOP
LD B,#7F
OUT (C),D
NOP
LD A,(HL)
LD (RBT+1),A
LD (HL),E
LD B,C
OUT (C),D
NOP
LD B,#7F
OUT (C),D
NOP
LD A,(HL)
CP D
JR NZ,I7FFD
LD HL,TYPE
SET 4,(HL)
I7FFD LD HL,#FFFF
LD B,#7F
OUT (C),E
NOP
LD A,(HL)
LD (RBT0+1),A
LD (HL),E
OUT (C),D
NOP
LD (HL),D
OUT (C),E
NOP
LD A,D
CP (HL)
JR Z,SIZED
LD HL,TYPE
SET 0,(HL)
SIZED LD HL,#FFFF
RBT0 LD (HL),0
LD B,C
OUT (C),E
NOP
LD B,#7F
OUT (C),D
NOP
RBT LD (HL),0
LD B,C
OUT (C),D
NOP
LD B,#7F
OUT (C),D
NOP
RBT2 LD (HL),0
CALL VIRT
LD A,(PAGE)
CP 8
JR C,ENDING
LD A,(TYPE)
CP 1
JR NZ,ENDING
LD HL,TYPE
SET 5,(HL)
ENDING XOR A
CALL EX_RAM
EI
RET
VIRT LD IX,#C000
LD HL,VTABL+63
LD B,64
V_R11 LD A,B
DEC A
CALL EX_RAM
LD C,(IX+0)
LD (HL),C
LD (IX+0),A
DEC HL
DJNZ V_R11
PUSH AF
LD A,LENTABL-1
LD (PAGE),A
POP AF
LD DE,TABL_PG
V_R20 LD A,(DE)
CP #FF
JR Z,V_R30
CALL EX_RAM
CP (IX+0)
JR Z,V_R22
PUSH DE
LD HL,TABL_PG+LENTABL
AND A
SBC HL,DE
PUSH HL
POP BC
PUSH DE
POP HL
INC HL
LDIR
PUSH HL
LD HL,PAGE
DEC (HL)
POP HL
POP DE
DEC DE
V_R22 INC DE
JR V_R20
V_R30 LD B,64
LD HL,VTABL
V_R31 LD A,64
SUB B
CALL EX_RAM
LD A,(HL)
LD (IX+0),A
INC HL
DJNZ V_R31
RET
;удаление из таблицы банка с номером в
;регистре C, вызывать сразу после теста.
DEBUG PUSH DE
POP HL
NO_PG1 DEC DE
LD A,(DE)
CP #FF
JR Z,NO_PG2
CP C
JR NZ,NO_PG1
SBC HL,DE
PUSH HL
POP BC
PUSH DE
POP HL
INC HL
LDIR
PUSH HL
LD HL,PAGE
DEC (HL)
POP HL
DEC HL
DEC HL
NO_PG2 EX DE,HL
RET
;Создание таблицы банков, с исключением
;не использующихся, в данном варианте
;удаляются 2-й и 5-й банки.
TABINIT LD HL,TABL_PG-1
LD (HL),255
INC HL
XOR A
TABI1 LD (HL),A
INC A
CP 2
JR Z,TABI1A
CP 5
JR Z,TABI1A
JR TABI2
TABI1A INC A
TABI2 INC HL
CP LENTABL+1
JR NZ,TABI1
LD (HL),255
LD HL,VTABL
PUSH HL
POP DE
INC DE
LD BC,63
LD (HL),0
LDIR
RET
LENTABL EQU 62 ;максимальное количес-
;тво использующихся
;банков.
DB 0 ;код начала таблицы
TABL_PG DS LENTABL+1
TYPE DB 0 ;тип компьютера
PAGE DB 0 ;общее число доступных
;банков
VTABL EQU 23296 ;таблица банков, ис-
;пользуется только
;при тесте, 64 байта
-----------
16.09.98
''''''''''''''''''''''''''''''''''''''''''