попались на глаза описание GARNIZON, про "ленивое" чтение
решил посмотрел на RKDOS 2.95
полез смотреть
в общем, вызывает уважение сколько авторы в него впихнули, да и код местами красив
собственно весь дос я не стал копать, посмотрел только чтение/запись
то что описывал GARNIZON, там сделать можно
но в самом досе этого всего нет и близко,
просто чтение/запись секторов
т.к. сектор таки да, сами процессим, все красивости описаные GARNIZON леко сделать,
но надо серьезно дос под это писать
и есть сомнение что на рк хватит скорости на эти умности.
дос тоже местами вызвает уважение
там есть каналы вода.вывода и реализованы bat файлы, круто
из забавного
используют OUT в порты, прикольно
вот пример
Код:
RAM:EE1D FDC_HOME: ; CODE XREF: RAM:E094p
RAM:EE1D ; FDC_HOME+Cj ...
RAM:EE1D DB F1 in a, (xF001_B_STAT)
RAM:EE1F E6 20 and fdc_TRK00
RAM:EE21 CA 48 EE jp z, ret_IOERROR
RAM:EE24 ;
RAM:EE24 3E 03 ld a, ppi_1_|ppi_b1_StepIn
RAM:EE26 CD 8A ED call doSTEP ; A- setC direction
RAM:EE29 C3 1D EE jp FDC_HOME
RAM:EE29 ; End of function FDC_HOME
RAM:ED8A ; A- setC direction
RAM:ED8A
RAM:ED8A doSTEP: ; CODE XREF: stepOut+6j
RAM:ED8A ; FDC_HOME+9p
RAM:ED8A 21 03 F0 ld hl, FDC_PPI_RUS
RAM:ED8D 77 ld (hl), a
RAM:ED8E 36 08 ld (hl), ppi_0_|ppi_b4_Step
RAM:ED90 3E 02 ld a, 2
RAM:ED92
RAM:ED92 loc_ED92: ; CODE XREF: doSTEP+9j
RAM:ED92 3D dec a
RAM:ED93 C2 92 ED jp nz, loc_ED92
RAM:ED96 36 09 ld (hl), ppi_1_|ppi_b4_Step
RAM:ED98
RAM:ED98 loc_ED98: ; CODE XREF: doSTEP+Fj
RAM:ED98 3D dec a
RAM:ED99 C2 98 ED jp nz, loc_ED98
RAM:ED9C C9 ret
напоминаю что OUT F1 = STA F1F1
что при такой дишефрации портов как в РК = STA F001
по идее это ставит крест на запуск доса на Z80 (вроде тут пробегало??)
вот еще код, кусок чтения сектора
Код:
RAM:EDC6 Find_Address_Label: ; CODE XREF: FindSector+36j
RAM:EDC6 ; FindSector+40j
RAM:EDC6 1B dec de
RAM:EDC7 7A ld a, d
RAM:EDC8 B3 or e
RAM:EDC9 CA 47 EE jp z, pop_RET_IOERROR
RAM:EDCC
RAM:EDCC loc_EDCC: ; CODE XREF: FindSector+30j
RAM:EDCC 34 inc (hl)
RAM:EDCD F2 CC ED jp p, loc_EDCC ; pc7 - DataREADY
RAM:EDD0 ;
RAM:EDD0 0A ld a, (bc) ; DATA_LOCK F004
RAM:EDD1 D6 EA sub 0EAh ; 'ъ'
RAM:EDD3 C2 C6 ED jp nz, Find_Address_Label
RAM:EDD6
RAM:EDD6 loc_EDD6: ; CODE XREF: FindSector+3Aj
RAM:EDD6 B6 or (hl)
RAM:EDD7 F2 D6 ED jp p, loc_EDD6
RAM:EDDA ;
RAM:EDDA 0A ld a, (bc)
RAM:EDDB D6 D3 sub 0D3h ; 'L'
RAM:EDDD C2 C6 ED jp nz, Find_Address_Label
RAM:EDE0
RAM:EDE0 loc_EDE0: ; CODE XREF: FindSector+44j
RAM:EDE0 B6 or (hl)
RAM:EDE1 F2 E0 ED jp p, loc_EDE0
RAM:EDE4 ;
RAM:EDE4 0A ld a, (bc) ; Track
RAM:EDE5 5F ld e, a
RAM:EDE6
RAM:EDE6 loc_EDE6: ; CODE XREF: FindSector+4Aj
RAM:EDE6 34 inc (hl)
RAM:EDE7 F2 E6 ED jp p, loc_EDE6
RAM:EDEA ;
RAM:EDEA 0A ld a, (bc) ; Sector
RAM:EDEB 57 ld d, a
RAM:EDEC
RAM:EDEC loc_EDEC: ; CODE XREF: FindSector+50j
RAM:EDEC 34 inc (hl)
RAM:EDED F2 EC ED jp p, loc_EDEC
RAM:EDF0 ;
RAM:EDF0 0A ld a, (bc)
RAM:EDF1 93 sub e
RAM:EDF2 92 sub d ; calc CRC
RAM:EDF3 C2 47 EE jp nz, pop_RET_IOERROR
p.s. дальше копать - врядли буду, уже малоинтересно
.ida могу желающим отдать