Нужно программно воспроизвести те обращения к регистрам контроллера, которые происходят при работе драйвера из ПЗУ ( и при запуске чтения ленты в "ручном режиме" ).
...
Сейчас я добавил в эмуляцию регистров контроллера появление в регистре 176732 данных с ленты, выполнил команду SHW/IST:TP и получил на экране имеенно те байты, которые показывал в регистре 176732. После завершения дампа блока ( когда я показал в регистре 176730 не 014, а 044 ) - драйвер повторил процедуру чтения, снова подав коды 033407 + 02.
Получается, что команда SHW/IST:TP - последовательно выводит дамп всех блоков ленты ( причём, на экране содержимое отдельных блоков никак не разделяется ).
Такие команды использовал драйвер из ПЗУ для чтения блока ленты:
Код:
BiT #40, @#176730
BNE Ready
BiS #20, @#176730
1$:
BiT #40, @#176730
BEq 1$
Ready:
Mov #33407, @#176732
Mov #1, @#176730
2$:
BiT #40, @#176730
BEq 2$
BiT #10, @#176730
BEq OK
MovB @#176732, R4
BPl Error
ASR R4
BCS Abort
OK:
Mov #2, @#176732
Mov #1, @#176730
3$:
BiT #60, @#176730
BNE Done
BiT #10, @#176730
BEQ 3$
MovB @#176732, (R1)+
Inc R0
Br 3$
Done:
Вариант "нашей" программы, доработанный для лучшего соответствия коду ПЗУ:
Код:
005000 Clr R0
012701 Mov #Buffer, R1
020000
012702 Mov #TPS, R2
176730
012703 Mov #TPD, R3
176732
032712 BiT #40, (R2)
000040
001001 BNE 1$
000000 Halt
1$:
012713 Mov #33407, (R3)
033407
012712 Mov #1, (R2)
000001
2$:
032712 BiT #40, (R2)
000040
001775 BEq 2$
032712 BiT #10, (R2)
000010
001406 BEq 7$
111304 MovB (R3), R4
100401 BMi 6$
000000 Halt
6$:
006204 ASR R4
103001 BCC 7$
000000 Halt
7$:
012713 Mov #2, (R3)
000002
012712 Mov #1, (R2)
000001
4$:
032712 BiT #60, (R2)
000060
001006 BNE 3$
032712 BiT #10, (R2)
000010
001772 BEq 4$
111321 MovB (R3), (R1)+
005200 Inc R0
000767 Br 4$
3$:
000000 Halt
При любых "нештатных" ситуациях происходит останов.
В эмуляторе эта программа читает данные с ленты так же успешно, как и драйвер из ПЗУ.