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


тема: Мультилоадер. Ускоренная версия.



от: Aleksey Malov
кому: All
дата: 01 May 2000
Приветствую тебя, All!

Теперь мы с Tigrr'ом домучали данного монстра. Hа моем Скорпе на 3.5.fdd при
длине кадра 75240 тактов при чтении всего диска (640k) достигнута средняя
скорость чтения в 10500 байт/сек. Т.е. сабж работтает почти с той же скоростью,
что и в Napalm'е, только напрочь отсутствуют завывания музона, т.к. загрузка
идет с разрешенными прерываниями.
Алгоритм загрузки следующий:
1. читаем n'ый сектор с дорожки.
2. Если загрузка завершилась успешно, то помечаем данный сектор в таблице как
прочитанный (#ff).
3. Если же сектор оказался сбойный или во время его чтения пришло прерывание,
то читаем следующий сектор на дорожке (по другому адресу), а не этот же сектор,
как другие лоадеры.
4. Повторяем пункты 1-3, пока не прочитаем всю дорожку или пока не кончится
весь файл.
5. Если файл не кончился, то повторяем пункты 1-4 для следующих дорожек.

Исходник приблизительно такой:

═══════════════════ mult.src.t ══════════════════

sectb equ #ff00;таблица секторов
;должна располагаться
;по круглому (#xx00) адресу
inttab equ #be00;интовая таблица
intsp equ #bfbf;стек isr
muzon equ #c000
interl equ 2; число, подбором которого можно регулировать
;скорость чтения - данное число - число секторов, которое
;будет пропущено при переходе на следующую дорожку.
;При числе 2 лоадер на моем дисководе читает 10500 байт/секунду

org #8000
;тестовая процедура
ENT $
ld hl,muz
ld de,muzon
ld bc,emuz-muz
ldir
call muzon
ld a,8;число символов
;имени файла для
;поиска
ld (23814),a
ld a,(23798);номер
;дисковода
ld (drvnum),a
ld c,1;инициализируем
call #3d13;дисковод
ld hl,findscr
ld de,#5cdd
ld bc,8
ldir
ld c,#0a
call #3d13
ld a,c
cp #ff
ret z
ld c,8
call #3d13
ld de,(#5ceb)
ld (trsec),de
call int_on
ld hl,0
ld (count),hl
ld b,40
suxx00 push bc
ld hl,#4000
ld b,#1b
ld c,1
ld a,0
ld de,#1106
trsec equ $-2
call loader
pop bc
djnz suxx00
call int_off
call #c008;вырубаем музон
ei
LD HL,#2758;корректный
EXX ;возврат в бейсик
ld bc,(count);счетчик интов
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
;Тело инты
call muzon+5;играем музон
ld hl,#2121
count equ $-2;счетчик интов
inc hl
ld (count),hl

;выход из инты
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

;процедура включения int'ов
int_on di
ld hl,inttab
ld de,inttab+1
ld b,e
ld c,l
ld a,h
ld i,a
ld (hl),inttab/256+1
ldir
ld a,#c3
ld hl,inter
ld (inttab/256+inttab+257),a
ld (inttab/256+inttab+258),hl
im 2
ei
ret
int_off di
ld a,63
ld i,a
im 1
ei
ret

;hl - адрес чтения
;de - track(0...255) & sector(0...15)
;b - число секторов для чтения
loader ld a,(drvnum)
cp 3
jp z,ram_dsk
ld a,(#5cd6)
push af
push de
push bc
ld (readadr),hl
ld hl,(#5cc2);break protect
ld (runfile+1),hl
ld hl,#c9f1
ld (#5cc2),hl
call posit ;track d
pop bc
pop de
xor a
ld (secunh),a
ld (#5cf4),de
load1 push de
ld hl,sectb+31
ld a,#ff
ld (hl),a
dec l
jp p,$-2
ld a,d
rra
sbc a,a
and 16
or e
ld l,a
ld (fstsec),a
cpl
add a,33
cp b
jr c,$+3
ld a,b;число секторов
;к-е надо с дороги
;считать
ld c,a
ld (secontrk),a
loadf ld (hl),l
inc l
dec a
jr nz,loadf
load2 push bc
load3 ld hl,sectb;номер сектора
secunh equ $-2;под головкой
ld a,l
seek cp (hl)
jr z,found
xor 16
ld l,a
cp (hl)
jr z,found
inc a
and #1f
ld l,a
jr seek
found ld (secunh),a
and 16
or 3
drvnum equ $-1
or #2c
;устанавливаем номер стороны
xor #10
call outff
ld a,l
ld c,l
sub 0
fstsec equ $-1
;определяем адрес считывания сектора
ld hl,#2121
readadr equ $-2
add a,h
ld h,a
ld a,c
and 15
call readsec;чтение сектора
;с текущей дорожки
;cf=1 если ошибка чтения
jr nc,readok
;ошибка, проверяем следующий сектор
ld hl,secunh
inc (hl)
res 5,(hl)
jr load3
readok
;увеличиваем текущие сектор и дорожку
ld hl,#5cf4
ld a,(hl)
inc a
and 15
ld (hl),a
inc hl
jr nz,$+3
inc (hl)
;помечаем сектор в таблице как прочитанный
ld hl,(secunh)
ld (hl),#ff
;головка теперь над следующим сектором
inc l
res 5,l
ld (secunh),hl
pop bc
;смотрим сколько секторов еще осталось
;считать
dec b
dec c
jr nz,load2
ld a,l
add a,interl
and 31
LD (secunh),a
;след. дорожка
ld hl,readadr+1
ld a,(hl)
add a,0
secontrk equ $-1
ld (hl),a
pop af
ld e,0;переходим на след.
inc a;дорожку
inc a
and #fe
ld d,a
inc b
dec b
jr nz,ostalos
pop af
ld (#5cd6),a
runfile ld hl,#2121
ld (#5cc2),hl
ret
;шаг на следующую дорожку
ostalos call stepfw
jp load1

;сброс ВГ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
call gundos
ret

;чтение с диска d через #3d13
ram_dsk ld a,b
push af
push de
push hl
ld a,3
ld c,1
call #3d13
pop hl
pop de
ld (#5cf4),de
pop af
;читаем по 2 сектора с рам-диска за
;прерывание
dermo ei
halt
di
call ramld
jr z,eramd
call ramld
jr nz,dermo
eramd ei
ret
ramld push af
push hl
ld bc,#0105
ld de,(#5cf4)
call #3d13
pop hl
pop af
inc h
dec a
ret
;читаем сектор с тек. дороги
readsec ld (adres),hl
inc a
ld c,#5f;физ. номер сектора
call outc;в регистр сектора
ld a,1
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
jp 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)
dec a
ret z
scf ;ошибка, cf=1
ret
outff ld c,#ff
outc ld ix,#2a53
jr dos
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

findscr db "BWpictrs";имя файля
;для теста
muz insert "AlmRave.C";имя музона
emuz ;для теста


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



Желаю вам здоровья, счастья и творческих узбеков.
Aleksey Malov aka VIVID/Brainwave.




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

Похожие статьи:
Новости - Новости из Плещениц от SatSoft'а.
Реклама - 30.01.2002 года вышел очередной (10-й) номер полиграфической газеты "Абзац"!
Paradoх 2oo2 - Paradoх 2oo2 глaзaми opгaнизaтopa Klim/oНgXXL.
Игры - Обзор Dizzy X, Space crusade.
KAK EWERKу ПО ЕБАЛУ ДАЛИ - Oднажды я поехал к Midnight Shadow...

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