Не срабатывает "ловушка" адреса - порт 28h (TRAP_A). Простые тесты:
Код:
mov ax, 0B800h
mov es,ax
mov di,0
mov al,'O' ; буква O
mov ah,7 ; белым по черному
mov cx,1 ; один раз
rep stosw
in ax,28h
call PrintHexAX
В итоге в AX у нас 8000h . Че такое '8' я хз, но следующие 3 байта явно смещение, по которому произошла запись. Здесь все ок, все работает как ожидалось.
Код:
mov ax, 0B800h
mov es,ax
mov di,0
mov al,'O' ; буква O
mov ah,7 ; белым по черному
mov cx,2 ; два раза
rep stosw
in ax,28h
call PrintHexAX
Что в AX? Правильно - тот же 8000h, хотя очень бы хотелось видеть там 8002h по логике, потому что второй символ у нас записался в B800:0002.
Ну и в довершение:
Код:
mov ax, 0B800h
mov es,ax
mov di,0
mov al,'O' ; буква O
mov ah,7 ; белым по черному
mov cx,3 ; три раза
rep stosw
in ax,28h
call PrintHexAX
В AX у нас 8004h как и должно быть.
Из этого следует, что глюка в аппаратной реализации защелки адреса. Тут уж я умываю руки. В качестве великого костыля конечно можно при вызове NMI рендерить не один символ, а два сразу - текущий и соседний, но во-первых это дополнительное место нужно, во-вторых исходников 91 года биоса нет, а 89 года BIOS уж очень какой-то неказистый.