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.




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

Похожие статьи:
Оттяг - Тест "На сколько ты любишь пиво".
С битой по миру - Картинки в де(рь)моголовах (зуакулисье ASCii'2002).
Почтовый ящик - Письма по играм
Census action - новая версия списка Спектрумовских никнеймов, насчитывающая около пяти с половиной сотен пунктов.
Обьявления - различныe модификации вашeго компьютeра: расширeниe памяти до 128 килобайт; подключeниe мyзыкального сопроцeссора AY-8910.

В этот день...   8 мая