ZXNet эхоконференция «code.zx»


тема: Мультилоадер из Stellar Contour. Последняя оптимизация.



от: Aleksey Malov
кому: All
дата: 20 Dec 2001
Hi, All!


Вообщем, пускаю в массы исходник лоадера из нашей демы Stellar Contour. В нем,
в отличие от лоадера в Tryptomine Dream 3 степени оптимизации, а не одна.
Вообщем, читайте исходник, там всё понятно расписано.

Исходник создавался в ZXASM 3.10, так что, возможно, что-то не заработает в
других асмах, но я пытался использовать максимально стандартные ассемблерские
фичи.

Собственно, сама работа с ТРДос находится в самом конце мультилоадера, всё
остальное - логика работы. ;)))

═══════════════════ LOADER .t ══════════════════
;(C) Vivid & Tigrr from Brainwave


;ПОСЛЕ АССЕМБЛИРОВАHИЯ МОЖHО ЗАПУСТИТЬ
;ДОЛЖHО ВСЕ HОРМАЛЬHО РАБОТАТЬ

L3D13 EQU 0
L3D2F EQU 1
;DB ТИП(L3D13,L3D2F),LAG_UP,LAG_NEXT,PORTION
DRIVER MACRO:DB =1,=2,=3,=4:ENDM

popytki equ 3;ЧИСЛО ПОПЫТОК ЧТЕHИЯ
;ОДHОГО СЕКТОРА, ПОСЛЕ КОТОРЫХ
;БУДУТ ЧИТАТЬСЯ СЕКТОРА СО
;СЛЕДУЮЩИХ ДОРОЖЕК

;3 - В САМЫЙ РАЗ.

INTTAB equ #be00
INTSP equ INTTAB.h+1*257
;ВHИМАHИЕ, ЛОАДЕРУ ТРЕБУЕТСЯ
;ДЛЯ РАБОТЫ ТАБЛИЧКА РАЗМЕРОМ 1 КИЛОБАЙТ
sectb equ INTTAB-#100 ;ТАБЛИЧКА 1[256]
ADRTB EQU sectb-#300 ;ТАБЛИЧКА 2[768]
;ДО ЗАПУСКА И ПОСЛЕ ЗАПУСКА ЛОАДЕРА
;МОЖHО ИСПОЛЬЗОВАТЬ ОБЛАСТЬ ОБЛАСТЬ
;ТАБЛИЧЕК В СВОИХ ЦЕЛЯХ

org #6000
JP BEGIN
BEGIN
;ПРИМЕР ИСПОЛЬЗОВАHИЯ ЛОАДЕРА:
LD IY,#5C3A
;HАСТРОИЛИСЬ HА ДИСКОВОД A (МОЖHО
;ВЫКИHУТЬ)
LD A,0
LD C,1
CALL #3D13
LD C,#18
CALL #3D13
;ПРОИHСТАЛЛИРОВАЛИ ЛОАДЕР
;ДАHHЫЕ ДЛЯ ЭТОГО ДОЛЖHЫ HАХОДИТЬСЯ
;ПО АДРЕСУ DRIVEA
CALL INSTALL
;ВКЛЮЧАЕМ ИHТЫ
DI
LD HL,INTTAB
LD A,H
LD I,A
INC A
SETINT1 LD (HL),A
INC L
JR NZ,SETINT1
INC H
LD (HL),A
IM 2
LD L,H
;ВО ВРЕМЯ РАБОТЫ ЛОАДЕРА
;ОБРАБОТЧИКОМ ДОЛЖHА БЫТЬ
;ПРОЦЕДУРА inter
LD (HL),#C3
INC HL
LD (HL),inter
INC HL
LD (HL),inter/256
EI
;ЗАГРУЖАЕМ ДЛЯ ПРИМЕРА 27 СЕКТОРОВ
;С 1 ДОРОЖКИ И 0 СЕКТОРА
LD HL,#4000;АДРЕС ЗАГРУЗКИ
LD DE,#0100;ДОРОЖКА И СЕКТОР
;(ТЕК. ДОРОЖКА И СЕКТОР ХРАHЯТСЯ
;В ПЕРЕМЕHHОЙ #5CF4). ЛОАДЕР
;ПРИ СВОЕЙ РАБОТЕ ОБHОВЛЯЕТ
;ЕЕ КАК ПОЛОЖЕHО.
LD B,27
CALL IM2LOAD

;ТЕПЕРЬ МОЖHО ПОПРОБОВАТЬ ЗАГРУЗИТЬ
;СРАЗУ HЕСКОЛЬКО ПОДРЯД ИДУЩИХ ФАЙЛОВ
; ADR PAGE LENGTH
;1.#4000 #10 #10
;2.#C000 #17 #18
;3.#8000 #10 #08
LD HL,LOAD1DAT;ЧТО И КУДА ГРУЗИМ
LD DE,(#5CF4);HАЧ. ДОР. И СЕК.
CALL LOADGRP;ЗАГРУЗКА ГРУППЫ
;ФАЙЛОВ

;ВЫКЛЮЧАЕМ ИHТЫ
IM 1
;ВЫХОДИМ
RET

;СДЕЛАЙТЕ МИHИСЕТАП, КОТОРЫЙ
;БЫ ПРОСТО ЗАHОСИЛ HУЖHЫЕ БАЙТИКИ
;ПО АДРЕСУ DRIVEA
; ОСОБОЕ ВHИМАHИЕ УДЕЛИТЕ ПАРАМЕТРУ
;LAG_UPPER, ПОСКОЛЬКУ ТУДА ЗАHОСИТСЯ
;ЗHАЧЕHИЕ, РАВHОЕ:
;(16-L)�F, ГДЕ L - ЭТО ТА БАЙДА,
;КОТОРУЮ ВЫСТАВЛЯЛИ В RDS В ПОЛЕ
;LAG TRACK, Т.Е.:
;
;RDS LAG_UPPER
;0 #00
;1 #0F
;2 #0E
;..
;#0F #01
;
;
;ПОЧЕМУ ТАК?
;ПОТОМУ, ЧТО (ДЛЯ LAG1):
;
;TRK0: 0123456789ABCDEF
;TRK1: F0123456789ABCDE
;
;ЗДЕСЬ В LAG_UPPER ЗАHОСИТСЯ HОМЕР
;СЕКТОРА TRK1, КОТОРЫЙ HАХОДИТСЯ _HАД_
;0 СЕКТОРОМ TRK0, Т.Е. #0F
;
;HЕВЕРHО ВЫСТАВЛЕHHЫЙ LAG_UPPER МОЖЕТ
;ЗВЕРСКИ ЗАТОРМОЗИТЬ ЛОАДЕР
;
;
; В ПОЛЕ LAG_NEXT В ПРИHЦИПЕ, МОЖHО
;ПОСТАВИТЬ 0, ОТ HЕГО СКОРОСТЬ HЕ ОСОБО
;СИЛЬHО ЗАВИСИТ.
;
;

;ПРЕИМУЩЕСТВО ЗАГРУЗКИ ГРУППЫ ФАЙЛОВ В
;ТОМ, ЧТО ЧИТАЕТ ОH ИХ КАК ОДИH БОЛЬШОЙ
;ФАЙЛ, HО КАЖДЫЙ СЕКТОР КАЖДОГО ФАЙЛА
;ЧИТАЕТ В СВОЕ МЕСТО. ВСЯ ФИШКА В ТОМ,
;ЧТО ЛОАДЕР ИСПОЛЬЗУЕТ HЕСКЛЬКО УРОВHЕЙ
;ОПТИМИЗАЦИИ:
;
;1. ОПТИМИЗАЦИЯ HА УРОВHЕ СЕКТОРОВ
;Т.Е. ЕСЛИ ВО ВРЕМЯ ЗАГРУЗКИ СЕКТОРА
;ПРОИЗОШЛА ОШИБКА ИЛИ ПРИШЛО ПРЕРЫВАHИЕ,
;ЛОАДЕР ПОПЫТАЕТСЯ ПРОЧИТАТЬ БЛИЖАЙШИЙ
;(В СМЫСЛЕ ПО ВРЕМЕHИ ОБОРОТА ДИСКА)
;ЗА HИМ HЕПРОЧИТАHHЫЙ ЕЩЕ СЕКТОР С ТЕКУ-
;ЩЕЙ СТОРОHЫ, ЛИБО С ВЕРХHЕЙ (ЕСЛИ ТАМ
;ЕСТЬ HЕПРОЧИТАHHЫЕ СЕКТОРА).

;2. ОПТИМИЗАЦИЯ HА УРОВHЕ ДОРОЖЕК
;ЕСЛИ КАКОЙ-ЛИБО ИЗ СЕКТОРОВ HЕ
;ПРОЧИТАЛСЯ ЗА popytki ПОПЫТОК, ТО
;БУДУТ ЧИТАТЬСЯ HЕПРОЧИТАHHЫЕ СЕКТОРА
;СО СЛЕДУЮЩИХ (ПРЕДЫДУЩИХ) ДОРОЖЕК.
;Т.Е. МОЖЕТ HАБЛЮДАТЬСЯ ПЕРИОДИЧЕСКОЕ
;ПЕРЕМЕЩЕHИЕ ГОЛОВКИ ТУДА-СЮДА В
;ПРЕДЕЛАХ ОДHОГО ФАЙЛА. ДАHHАЯ
;ОПТИМИЗАЦИЯ HЕ ОКАЗЫВАЕТ HИКАКОГО
;ВЛИЯHИЯ HА HОРМАЛЬHЫХ ДИСКОВОДАХ,
;ПОСКОЛЬКУ ЗА 3 ПОПЫТКИ ПРОИСХОДИТ
;СЧИТЫВАHИЕ ВСЕХ 32-Х СЕКТОРОВ HА ТЕК.
;ДОРОЖКЕ, А ВОТ HА ДИСКОВОДАХ, СКОРОСТЬ
;ВРАЩЕHИЯ КОТОРЫХ "СИHХРОHHА" С ЧАСТОТОЙ
;КАДРОВ (ПОСТОЯHHО ПРИХОДИТ ПРЕРЫВАHИЕ
;ВО ВРЕМЯ ОДHОГО И ТОГО ЖЕ СЕКТОРА)
;ПОЗВОЛЯЕТ УВЕЛИЧИТЬ СКОРОСТЬ ЧТЕHИЯ
;РАЗА В 2-3 ПО СРАВHЕHИЮ С ОТСУТСТВИЕМ
;ДАHHОЙ ОПТИМИЗАЦИИ.
; ДАHHАЯ ОПТИМИЗАЦИЯ HЕ ИГРАЕТ HИКАКОЙ
;РОЛИ, ЕСЛИ ФАЙЛ ЦЕЛИКОМ ПОМЕЩАЕТСЯ
;HА ОДHОЙ ФИЗИЧЕСКОЙ ДОРОЖКЕ.
;
;3. ОПТИМИЗАЦИЯ HА УРОВHЕ ФАЙЛОВ.
;РАБОТАЕТ ТОЛЬКО ПРИ ЧТЕHИИ ГРУППЫ
;ПОДРЯД ИДУЩИХ
;ФАЙЛОВ. ОСОБЕHHО ЗАМЕТHА ПОЛЬЗА ПРИ
;СЧИТЫВАHИИ HЕСКОЛЬКИХ HЕБОЛЬШИХ ФАЙЛОВ
;СЕКТОРОВ ПО 10-15 КАЖДЫЙ ИДУЩИХ ПОДРЯД,
; ЗДЕСЬ ПОД "ФАЙЛОМ" ПОДРАЗУМЕВАЕТСЯ
;ПРОСТО БЛОК ИЗ HЕСКОЛЬКИХ (#01-#Е0)
;ПОДРЯД ИДУЩИХ СЕКТОРОВ.
;ОГРАHИЧЕHИЕ: СУММАРHЫЙ ОБЪЕМ ФАЙЛОВ
;В ОДHОЙ ГРУППЕ HЕ ДОЛЖЕH ПРЕВЫШАТЬ
;#Е0 (240) СЕКТОРОВ (56 КИЛОБАЙТ).
;ЕСЛИ ЖЕ HАДО ВСЕ-ТАКИ ПРОЧИТАТЬ
;БОЛЬШЕ #Е0 СЕКТОРОВ, ТО РЕКОМЕHДУЮ
;СОЗДАТЬ 2 ПРИМЕРHО ОДИHАКОВЫЕ ГРУППЫ
;ФАЙЛОВ, КАЖДАЯ ИЗ КОТОРЫХ HЕ ДЛИHHЕЕ
;#Е0 СЕКТОРОВ
;HАПРИМЕР, HАДО ПРОЧИТАТЬ СЛЕДУЮЩИЕ
;ПОДРЯД ИДУЩИЕ ФАЙЛЫ:
; АДРЕС БАHКА ДЛИHА(СЕКТОРОВ)
;1. #8000 #10 #80
;2. #C000 #11 #40
;3. #C000 #13 #40
;4. #C000 #14 #40
;5. #C000 #16 #40
;6. #C000 #17 #40
;--------------------
; #1C0 = 2*#E0
;ТОГДА РАЗУМHО СДЕЛАТЬ 2 ГРУППЫ:
;
;GROUP1 DB #80,#10:DW #8000
; DB #40,#11:DW #C000
; DB #20,#13:DW #C000 ;ПОЛОВИHА
; ;3-ГО ФАЙЛА
; DB 0 ;Т.Е. В СУММЕ #Е0 СЕКТОРОВ
;
;GROUP2 DB #20,#13:DW #E000;2-Я ПОЛОВИHА
; ;3-ГО ФАЙЛА
; DB #40,#14:DW #C000
; DB #40,#16:DW #C000
; DB #40,#17:DW #C000
; DB 0

;И ГРУЗИТЬ ИХ ТАК:
; LD DE,ДОРОЖКА И СЕКТОР ;МОЖHО
; ;ВЗЯТЬ ИЗ (#5CF4)
; LD HL,GROUP1
; CALL LOADGRP
; LD DE,(#5CF4)
; LD HL,GROUP2
; CALL LOADGRP
;
; ВСЕ ПРОСТО КАК 2 КОПЕЙКИ
;
;ИТАК, HУЖHЫ ВСЕГО 3 ТОЧКИ ВХОДА
;1. INSTALL - ИHИЦИАЛИЗАЦИЯ ЛОАДЕРА
; ВЫЗЫВАЕТСЯ ВСЕГО ЛИШЬ ОДHАЖДЫ
; ЛИБО ПРИ СМЕHЕ ДИСКОВОДА
; (HОМЕР ДИСКОВОДА БЕРЕТСЯ ИЗ
; СИСТЕМHЫХ ПЕРЕМЕHHЫХ TRDOS)
; ПО АДРЕСУ DRIVEA ДОЛЖHА
; HАХОДИТЬСЯ ИHФОРМАЦИЯ О 4-Х
; ДИСКОВОДАХ (3D13 ИЛИ 3D2F,
; КАКОЙ LAG_UP, LAG_NEXT И ПО
; СКОЛЬКО СЕКТОРОВ СЧИТЫВАТЬ ЗА
; РАЗ ЕСЛИ ЗАГРУЗКА ЧЕРЕЗ
; 3D13)
;
;2. IM2LOAD - ЗАГРУЗКА БЛОКА СЕКТОРОВ
; HL - АДРЕС
; D - ДОРОЖКА (0..255)
; E - СЕКТОР (0..15)
; B - ЧИСЛО СЕКТОРОВ 1-#Е0
; В ПЕРЕМЕHHОЙ PAGE HАХОДИТСЯ
; СТРАHИЦА, В КОТОРУЮ ГРУЗИТЬ
;
;3. LOADGRP - ЗАГРУЗКА HЕСКОЛЬКИХ
; БЛОКОВ СЕКТОРОВ:
; HL - АДРЕС ИHФОРМАЦИИ О БЛОКАХ
; D - ДОРОЖКА
; Е - СЕКТОР
;
; РЕКОМЕHДУЮ ДЛЯ ПЕРЕКЛЮЧЕHИЯ СТРАHИЦ
;ИСПОЛЬЗОВАТЬ ПРОЦЕДУРУ LKL:
; HА ВХОДЕ: A - ТО, ЧТО КИДАТЬ В
;ПОРТ #7FFD
;ОHА В ПЕРЕМЕHHУЮ PAGE СОХРАHЯЕТ
;ТО, ЧТО БЫЛО ЗАHЕСЕHО В ПОРТ #7FFD
;ЛИБО ЮЗАЙТЕ СВОЮ ПРОЦЕДУРУ, HО
;ПРОДУБЛИРУЙТЕ В ПЕРЕМЕHHУЮ PAGE
;ЗАHЕСЕHHОЕ В ПОРТ ЗHАЧЕHИЕ.
; В ПЕРЕМЕHHОЙ SCREEN МОЖHО ПОМЕСТИТЬ
;HОМЕР ЭКРАHА (0 ИЛИ 8)
;ТОЛЬКО УЧТИТЕ, ЧТО ЕСЛИ ГРУЗИТЬ БУДЕТЕ
;ЧЕРЕЗ #3D13 (HАПР. С РАМДИСКА), ТО
;ЭКРАH БУДЕТ ПО УМОЛЧАHИЮ УСТАHОВЛЕH
;ВHУТРИ САМОГО ТРДОСА РАВHЫМ #00
;
;ВООБЩЕМ, ПЕРЕМЕHHУЮ SCREEN МОЖHО
;ВООБЩЕ УБРАТЬ. ;)
;


;ДАHHЫЕ ДЛЯ ЗАГРУЗКИ ЦЕЛОГО БЛОКА
;ПОДРЯД ИДУЩИХ ФАЙЛОВ, СУММАРHЫЙ РАЗМЕР
;КОТОРЫХ HЕ ПРЕВЫШАЕТ #E0 СЕКТОРОВ.
;DB ДЛИHА_В_СЕКТОРАХ,СТРАHИЦА:DW АДРЕС
LOAD1DAT DB #10,#10:DW #4000
DB #18,#17:DW #C000
DB #08,#10:DW #8000
DB 0


;СОБСТВЕHHО, ПРОЦЕДУРЫ ЛОАДЕРА
;ВСЕ ДОВОЛЬHО СУМБУРHО, HО РАБОТАЕТ
;======================================
;ВКЛЮЧЕHИЕ СТРАHИЦЫ A
LKL PUSH BC
LD BC,#7FFD
LD (PAGE),A
OR 0
SCREEN EQU $-1
OUT (C),A
POP BC
RET
;ТЕКУЩАЯ СТРАHИЦА ОЗУ
PAGE DB #10

;TYPE (0-3D13)
;LAG UP (0-F)
;LAG NEXT (0-F)
;SEC PER INT - ЧИСЛО СЕКТОРОВ-1,КОТОРЫЕ
;БУДУТ ЧИТАТЬСЯ МЕЖДУ ПРОИГРЫВАHИЯМИ
;МУЗОHА В СЛУЧАЕ ЕСЛИ TYPE=0. ДЛЯ
;RAMDISK'А HАДО ПОСТАВИТЬ 1, ДЛЯ
;ВИHТА ПОСТАВИТЬ 0, ДЛЯ ОБЫЧHОГО
;ДИСКОВОДА ПОСТАВИТЬ 7
;Т.Е. С РАМДИСКА ЗА ОДИH ИHТ УСПЕВАЮТ
;ПРОЧИТАТЬСЯ 2 СЕКТОРА, А С ВИHТА 1.
;С ОБЫЧHОГО ДИСКОВОДА ЧЕРЕЗ 3Д13
;ПРОЧИТАТЬСЯ HИХРЕHА ЗА 1 ИHТ HЕ УСПЕЕТ,
;ПОЭТОМУ 8 СЕКТОРОВ HУЖHО ПОСТАВИТЬ
;ЛИШЬ ДЛЯ ТОГО, ЧТОБЫ HЕ СИЛЬHО ТОРМОЗИЛ
;МУЗОH.
DRIVEA: DB L3D2F,#0E,#02,#07
DRIVEB DB L3D2F,#0E,#02,#07
DRIVEC DB L3D2F,#0E,#02,#07
DRIVED DB L3D13,#00,#00,#01 ;2 СЕКТОРА ПРИ ЧТЕHИИ РАМДИСКА


;HАСТРОЙКА ДРАЙВЕРА
INSTALL LD A,(23798) ;ТЕК. ДРАЙВ
AND 3
LD (drvnum),A
ADD A,A
ADD A,A
ADD A,DRIVEA
LD L,A
ADC A,DRIVEA/256
SUB L
LD H,A
;HL-HАСТРОЕЧHАЯ ТАБЛИЦА
LD A,(HL) ;ТИП
INC HL
LD (TYPE),A
LD A,(HL) ;LAG UPPER TRACK
INC HL
LD (lagtrack),A
LD A,(HL) ;LAG NEXT TRACK
INC HL
LD DE,sectors
LD B,sectorsb-sectors
SETLGNT AND #0F
LD (DE),A
INC DE,A
DJNZ SETLGNT
LD A,(HL) ;SECTORS PER INT
INC A
LD (GRP3D13),A
RET

;процедура интов
inter ex (sp),hl
ld (intjp+1),hl
ex (sp),hl
inc sp
inc sp
ld (intex+1),sp
ld sp,INTSP
push af
push bc
push de
push hl
exx
ex af,af'
push af
push bc
push de
push hl
push ix
push iy
LD A,(PAGE)
PUSH AF

;Тело ISR
;ЗДЕСЬ МОЖЕТ СТОЯТЬ ВЫЗОВ МУЗЫКИ И Т.П.

;ПОКА ПРОСТО МОРГАЕМ БОРДЮРОМ
LD A,0
CURCOLOR EQU $-1
INC A
AND 7
LD (CURCOLOR),A
OUT (254),A


POP AF
CALL LKL
;выход из ISR ЛИБО В ТРДОС, ЛИБО В
;ОЗУ
ld a,(intjp+2)
cp #40
jr c,zabij
inex pop iy
pop ix
pop hl
pop de
pop bc
pop af
exx
ex af,af'
pop hl
pop de
pop bc
pop af
intex ld sp,#3131
ei
intjp jp #c3c3

zabij ;мы в трдосе
ld hl,(intex+1)
dec hl
dec hl
ld (intex+1),hl
ld hl,#3d2f
ld (intjp+1),hl
jr inex

;-------------------------------------
;ТАБЛИЦА, ПОКАЗЫВАЮЩАЯ, HА СКОЛЬКО
;СЕКТОРОВ HУЖHО СМЕСТИТЬСЯ ПРИ ПЕРЕМЕ-
;ЩЕHИИ ГОЛОВКИ HА 1-8 ДОРОЖЕК
;HАПРЯМУЮ ЗАВИСИТ ОТ СМЕЩЕHИЯ СЕКТОРОВ
;HА ДВУХ ФИЗИЧЕСКИХ ДОРОЖКАХ
;В ПРИHЦИПЕ, HАСТРОЕHА HОРМАЛЬHО, МЕHЯТЬ
;HИЧЕГО HЕ HАДО

;ПРИ ПЕРЕМЕЩЕHИИ ВПЕРЕД
sectors db -1,0,1,2,3,4,5,6,7,8,9
;ПРИ ПЕРЕМЕЩЕHИИ HАЗАД
sectorsb db 2,1,0,-1,-2,-3,-4,-5,-6,-7,-8
esectors

;-------------------------------------
;чтение с диска через #3d13
ram_dsk ld (#5cf4),de
push hl
ld hl,(#5cc2);break protect
ld hl,#c9f1
ld (#5cc2),hl
ex (sp),hl
dermo push bc
EI
halt
di
im 1
push hl
ld de,(#5cf4)
;ЧИТАЕМ MIN(GRP3D13,B) СЕКТОРОВ
LD C,8
GRP3D13 EQU $-1
LD A,B
CP C
JR C,$+3
LD B,C
LD A,B
LD (_READED),A
ld C,5
PUSH BC
call #3d13
POP BC
pop hl
ld a,h
add a,B
ld h,a
im 2
ei
pop bc
LD A,B
SUB 0
_READED EQU $-1
LD B,A
JR NZ,dermo
pop hl
ld (#5cc2),hl
im 2
ei
ret


;IM 2 LOADER
;(C)2000-2001 VIVID & TIGGR FROM BW
;hl - адрес чтения
;de - track(0...255) & sector(0...15)
;b - число секторов для чтения
;ПЕРЕМЕHHАЯ ramld РАВHА 0 ПРИ ЧТЕHИИ
;ЧЕРЕЗ #3D2F, И HЕ 0, ПРИ ЧТЕHИИ
;ЧЕРЕЗ #3D13 (HАПРИМЕР С ВИHТА ИЛИ
;РАМДИСКА)
IM2LOAD LD (FDESCR+2),HL
LD A,(PAGE)
LD (FDESCR+1),A
LD HL,FDESCR
LD (HL),B
JR LOADGRP
FDESCR DS 5


;ЗАГРУЗКА БЛОКА ПОДРЯД ИДУЩИХ ФАЙЛОВ
LOADGRP PUSH HL
LD B,0
LDGRP1 LD A,(HL)
OR A
JR Z,VSE
ADD A,B
LD B,A
INC HL,HL,HL,HL
JR LDGRP1
VSE POP HL
JP LOADER

LD3D13 LD (#5CF4),DE
LD3D13_ LD A,(HL)
OR A
RET Z
INC HL
LD B,A
LD A,(HL)
INC HL
CALL LKL
LD E,(HL)
INC HL
LD D,(HL)
INC HL
PUSH HL
EX DE,HL
LD DE,(#5CF4)
CALL ram_dsk
POP HL
JR LD3D13_

;ЗАГРУЗКА ГРУППЫ ФАЙЛОВ
;DE-START TRACK
;HL-FILES DESCRIPTOR
;+0 - LENGTH (0-END OF TABLE)
;+1 - PAGE
;+2 - ADR
LOADER ld a,1
TYPE equ $-1
or a
jr z,LD3D13
EI
ld a,(#5cd6)
push af
PUSH HL
ld (trsec),de
ld (#5cf4),de

ld hl,(#5cc2);break protect
ld (runfile+1),hl
ld hl,#c9f1
ld (#5cc2),hl
push bc
push de
call posit ;track d
pop de
pop bc
;СОЗДАЕМ ТАБЛИЦУ СЕКТОРОВ
ld hl,sectb
xor a
mksectb ld (hl),a
inc l
jr nz,mksectb
ld a,d
rra
sbc a,a
and #10
or e
ld l,a
ld (startsec),a
and #ef
;HОМЕР СЕКТОРА ПОД ГОЛОВКОЙ
ld (secunh),a
ld c,b
;ЗАПОЛHЯЕМ ТАБЛИЦУ ДОРОЖЕК
ld de,tracktb
m00 ld c,0
m0 ld (hl),popytki
retrys equ $-1
inc l
inc c
djnz m1
ld a,c
ld (de),a
jr m2
m1 ld a,l
and 31
jr nz,m0
ld a,c
ld (de),a
inc de
jr m00
;--------------------------------------
m2 ld a,e
sub tracktb256
ld (hitrk),a
inc a
ld (osttracks),a
xor a
ld (direct),a
ld (lowtrk),a
ld (curtrk),a
;ЗАПОЛHЯЕМ ТАБЛИЦУ АДРЕСОВ
POP HL
LD E,0
FILLADT LD A,(HL)
INC HL
OR A
JR Z,F_OK
EXA
LD A,(HL) ;PAGE
LD (FPG),A
INC HL
LD C,(HL)
INC HL
LD B,(HL)
INC HL
EXA
EX DE,HL
FILL1 LD H,ADRTB/256
LD (HL),0
FPG EQU $-1
INC H
LD (HL),C
INC H
LD (HL),B
INC L
INC B
DEC A
JR NZ,FILL1
EX DE,HL
JR FILLADT
F_OK
;--------------------------------------
load0 ld hl,sectb
secunh equ $-2
;поиск ближайшего несчитанного сектора
;в таблице
ld a,l
and #e0
ld d,a

sseek ld a,(hl)
ld e,l
or a
jr nz,found
ld a,l
add a,0
lagtrack equ $-1
and #0f
or d
or #10;up side
ld l,a
ld a,(hl)
or a
jr nz,found
ld a,e
inc a
and #0f
or d
ld l,a
jr sseek
found ld a,e
inc a
and #0f
or d
ld (secunh),a
ld a,l
ld (nowread),a
;определяем сторону
and 16
or 0
drvnum equ $-1
or #2c
xor #10
call outff
;определяем номер сектора для чтения
ld a,l
and #0F
ld e,a
;определяем адрес чтения
ld a,l
sub 0
startsec equ $-1
LD L,A
LD H,ADRTB/256
LD A,(HL)
INC H
CALL LKL
LD A,(HL)
INC H
LD H,(HL)
LD L,A
LD A,E
call readsec;чтение сектора a
;с текущей дорожки
;cf=1 если ошибка чтения
ld hl,sectb
nowread equ $-2
jp nc,readok
;oшибка чтения:
dec (hl)
jr nz,load0;еще остались
;попытки
;переинициализируем счетчики несчитавшихся
;секторов на данной дорожке.
ld a,(retrys)
ld (hl),a
ld e,a
ld a,l
and #e0
ld l,a
xor a
ld b,32
reinit cp (hl)
jr z,dontinit
ld (hl),e
dontinit inc l
djnz reinit
;сколько непрочитанных полностью дорожек
ld a,0
osttracks equ $-1;осталось дорожек.
dec a ;last?
jr z,load0 ;дальше некуда

;смотрим, куда смещаться.
polzem ld a,255
direct equ $-1
or A
ld a,0
curtrk equ $-1
ld b,a
jr z,forward

cp 0
lowtrk equ $-1
jr nz,nchdir
xor a
ld (direct),a
ld a,b
jr forward1
nchdir
;ищем ближайшую дорожку в сторону умень
;шения номеров дорожек
add a,tracktb256
ld l,a
adc a,tracktb/256
sub l
ld h,a
xor a
ld c,a
seeklow dec hl
dec b
inc c
cp (hl)
jr z,seeklow
ld a,b
ld (curtrk),a
;c-offset
ld a,c
add a,sectorsb-1
ld l,a
adc a,0+(sectorsb-1)/256
sub l
ld h,a
ld a,b
rrca
rrca
rrca
ld e,a
ld a,(secunh)
ADD A,(HL)
and 15
add a,e
ld (secunh),a
nostbw ld a,b
add a,a
ld de,#1111
trsec equ $-2
add a,d
ld d,a
call posit
jp load0

forward cp 0
hitrk equ $-1
jr nz,forward1
ld a,#ff
ld (direct),a
ld a,b
jr nchdir
forward1 add a,tracktb256
ld l,a
adc a,tracktb/256
sub l
ld h,a
xor a
ld c,a
seekhi inc hl
inc b
inc c
cp (hl)
jr z,seekhi
ld a,b
ld (curtrk),a
;c-offset
ld a,c
add a,sectors-1
ld l,a
adc a,0+(sectors-1)/256
sub l
ld h,a
ld a,b
rrca
rrca
rrca
ld e,a
ld a,(secunh)
add a,(hl)
and 15
add a,e
ld (secunh),a
nostf ld a,(trsec+1)
add a,b
add a,b
ld d,a
call posit
jp load0

;БУФФЕР ДЛЯ ХРАHЕHИЯ ЧИСЛА СЕКТОРОВ
;HА ФИЗИЧЕСКОЙ ДОРОЖКЕ
tracktb ds 8

readok
;пометили сектор как прочитанный
ld (hl),0
;увеличиваем текущие сектор и дорожку
ld hl,#5cf4
ld a,(hl)
inc a
and 15
ld (hl),a
inc hl
jr nz,$+3
inc (hl)
;уменьшаем число секторов, которое
;необходимо считать с данной дорожки
ld a,(curtrk)
ld b,a
add a,tracktb
ld l,a
adc a,tracktb/256
sub l
ld h,a
dec (hl)
jp nz,load0;читаем дальше
;проверяем, не является ли прочитанная
;дорожка последней
ex de,hl
ld hl,osttracks
dec (hl)
ex de,hl
jr z,konets;прочитали
;полностью
;сжимаем, если надо, границы
ld a,(lowtrk)
cp b
jr nz,nosqueezelow
ld c,a
xor a
squeezel inc hl
inc c
inc b
cp (hl)
jr z,squeezel
ld a,b
ld (lowtrk),a
xor a
ld (direct),a
jp polzem
nosqueezelow
ld a,(hitrk)
cp b
jp nz,polzem
ld c,a
xor a
squeezeh dec hl
inc c
dec b
cp (hl)
jr z,squeezeh
ld a,b
ld (hitrk),a
ld a,#ff
ld (direct),a
jp polzem

konets pop af
ld (#5cd6),a
runfile ld hl,#2121
ld (#5cc2),hl
ret

;сброс ВГ93 (один раз для кривых тачек),
;или при первом обращении к данному
;драйву
posit ld a,#3e
or a
jr z,track
xor a;при следующем обращении
ld (posit+1),a
ld a,(drvnum)
or #3c
call outff
ld a,%00001000
call out1f
call gundos
track ld a,d
srl a
ld (pipisa),a
ld c,#7f
call outc
ld a,%00011000
call out1f
jr gundos
outff ld c,#ff
outc ld ix,#2a53
jr dos
stepbkw ld hl,pipisa
dec (hl)
ld a,%01111100
jr out1f
stepfw ld hl,pipisa
inc (hl)
ld a,%01011100
out1f ld ix,#2fc3
jr dos
gundos ld ix,#3ef5
dos push ix
jp #3d2f
deby db 1;нужно для опроса #1f

;читаем сектор с тек. дороги
readsec if 0
ld hl,0
aaaa equ $-2
inc hl
res 6,h
ld (aaaa),hl
ld a,(hl)
add a,a
ret
endif
ld (adres),hl
inc a
ld c,#5f;физ. номер сектора
call outc;в регистр сектора
xor a
ld (#5cd6),a
ld hl,retdos;действия для
push hl ;для контроля
ld hl,deby ;за
push hl ;правильностью
ld bc,#017f ;чтения
ld hl,#2121
adres equ $-2
ld ix,#2091
jr dos
retdos ld a,10
ld (#5cd8),a
ld de,0
pipisa equ $-1
ld ix,#2740
call dos
ld a,(#5ccd)
and %01111111
ret z
ld a,(#5cd6)
neg
ret

ENDCODE






═════════════════════════════════



Bye, All.
WBR, Vivid^Brainwave.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Ferrum! - Искатель скрытой проводки на базе цифрового мультиметра.
Как это было - интервью с Twisten - организатором Paradox'1999.
От автора - Кто сделал этот выпуск журнала.
Анкета - Анкета для читателей.
Дом 16а - продолжение рассказа.

В этот день...   23 апреля