Вот мой вариант, вроде даже работал. Правда полностью так и не проверил, руки не дошли.
Код:
PutPix:
call GetPixAddr
lxi B, shltbl
add C
mov C, A
mov A, B
aci 0
mov B, A
di
MAPMEM 0FFh
ldax B
ora m
mov m, A
MAPMEM 0FCh
ei
ret
shltbl: 128,64,32,16,8,4,2,1
; вычисляет адрес видеопамяти
; на входе:
; A - координата Y [0..191]
; C - координата X [0..255]
; на выходе:
; HL - адрес знакоместа
; A - смещение в байте по X [0..7]
; вычисляем по формуле:
; HI(addr) = (y/8)*256
; LO(addr) = (x & F8)+(y%8)
;(y%8)*32+(x/8)
GetPixAddr:
mov L, A
rar
rar
rar
ani 11111b
mov H, A ; H = (Y >> 3) * 256
mov A, L
ani 111b
mov L, A ; L = Y % 8
mov A, C
ani 11111000b
add L
mov L, A
mov A, C
ani 111b
ret
Делал "в лоб", так что вряд ли это самый оптимальный вариант.