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.




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

Похожие статьи:
Мозаика - Некоторые замечания по поводу отечественных программ : Dizzy, 48 Утюгов, Войны Эмбера, Soldier of Future.
Архив - описание игры "ITALY 90".
Слава! Слава! Слава!
Комьюнити - Как это было в Бразилии: история развития Спектрума в Бразилии от Paulo Silva.
Разное - Конкурс специальных корреспондентов для журнала.

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