
Сообщение от
ZXMAK
так есть такой api, заносишь адрес нужной инструкции IN или OUT в стек и делаешь jp в трдос окно, оттуда делается ret на инструкцию и обратно.
К сожалению, нет. Не было такого API. Где-то в коде TR-DOS был фрагмент OUT(C),A: RET. С его помощью решался вопрос записи в порты. Но для чтения портов свистопляска требовалась практически со всеми, а особенно - IN #1F. Считать #1F, да без побочных эффектов - это было тайное искусство. Исторически разные люди решали эту задачу по-разному, с большим или меньшим успехом.
Вот моя карта точек входа в TR-DOS V5.03 из дискового драйвера (radisk), которую я взял из публикации "Low-level disk driver" в каком-то из журналов, то ли ZX-Ревю, то ли ZX-Format, то ли уже не помню:
Код:
OUT_C_A:
PUSH HL
LD HL,2A53H
EX (SP),HL
JP 3D30H
DMA_RD: PUSH HL
LD HL,3FD5H
EX (SP),HL
JP 3D30H
DMA_WR: PUSH HL
LD HL,3FBAH
EX (SP),HL
JP 3D30H
WT_IRQ: PUSH HL
LD HL,3FE5H
EX (SP),HL
JP 3D30H
IRZ: LD HL,3F33H
PUSH HL
JP 3D30H
IN_1F: PUSH HL
PUSH BC
PUSH DE
XOR A
LD C,3FH
CALL OUT_C_A
LD A,0AH
LD C,05FH
CALL OUT_C_A
LD D,01H
CALL IRZ
CALL GET_POS
LD C,3FH
CALL OUT_C_A
LD A,B
POP DE
POP BC
POP HL
RET
И, для сравнения, их же реализация в случае "открытого" доступа к портам контроллера:
Код:
OUT_C_A:
OUT (C),A
RET
DMA_RD: LD B,4
DRD1: IN A,(0FFH)
AND 0C0H
JR NZ,DRD2
INC DE
LD A,E
OR D
JR NZ,DRD1
DJNZ DRD1
RET
DMA_WR: LD B,4
DWR1: IN A,(0FFH)
AND 0C0H
JR NZ,DWR2
INC DE
LD A,E
OR D
JR NZ,DWR1
DJNZ DWR1
RET
WT_IRQ: IN A,(0FFH)
AND 0C0H
JP Z,WT_IRQ
RET M
DRD2: INI
JP WT_IRQ
DWR3: IN A,(0FFH)
AND 0C0H
JP Z,DWR3
RET M
DWR2: OUTI
JP DWR3
IN_1F: IN A,(1FH)
RET
Что еще важно: подпрограммы DMA_RD и DMA_WR (прием и передача данных чтения и записи сектора) должны были вызываться именно те, что были в TR-DOS. Попытка реализовать тот же функционал на других функциях доступа к портам терпела неудачу: не хватало скорости процессора.
Вот весь мой драйвер дисководаradisk.zip.