Отредактировал для фасм. Работает. Теперь ,если не лень можно разобрать логику.
компилировать fasm tasmed.asm tasmed.com
;tasmed.asm
use16
org 100h
mov sp,08FEh
;Возвращает значение вектора прерывания для INT (AL); то есть,
;загружает в BX 0000:[AL*4], а в ES - 0000:[(AL*4)+2].
;Эта функция изменяет сегментный регистр ES.
mov ax,3508h
int 21h
mov word [old_int08h],bx
mov word [old_int08h+2],es
mov ax,7FFFh ;значение для инициализации счётчика таймера
call TimerIO
;Устанавливает значение элемента таблицы векторов прерываний для
;прерывания с номером AL равным DS:DX.
mov ax,2508h
mov dx,new_int08h
int 021h
mov ax,cs
mov bx,090Dh ;скорее это адрес буфера для выводимых пикселей
shr bx,04h
add ax,bx ;преобразуем этот адрес в сегментный
mov word [programdata+778],ax
mov es,ax
xor di,di
xor eax,eax
mov cx,4000h
rep stosd
push cs
pop es
mov di,0468h
mov cx,00C0h
rep stosd
; AL=30H: Get EGA information
; BH = table pointer request code
; 0 = return ES:BP => current INT 1fH graphics font addr
; 1 = return ES:BP => current INT 44H graphics font addr
; 2 = return ES:BP => ROM 8x14 font table addr
; 3 = return ES:BP => ROM 8x8 double dot font table addr
; 4 = return ES:BP => ROM 8x8 double dot addr (top)
; 5 = return ES:BP => ROM 9x14 alternate table addr
; Выход: CX = font points (font-definition bytes per character)
; DL = screen rows
mov ax,1130h
mov bh,06h ;???
int 10h
;
mov word [programdata+778-4],bp
mov word [programdata+778-2],es
push 00h
pop es
push dword [es:programdata+10]
pop dword [programdata+2]
mov ax,0013h
int 10h
mov cx,0055h
xor bx,bx
___00000006A:
mov di,bx
shl di,1
add di,bx
mov ax,bx
shl ax,06h
cwd
div cx
mov dl,al
mov dh,3Fh
sub dh,dl
add di,0468h
mov [di+0001h],dl
mov [di+00FFh],dl
mov [di+0100h],dh
mov [di+01FEh],dh
mov [di+0200h],dl
inc bx
cmp bx,0055h
jb ___00000006A
xor ax,ax
mov cx,0300h
mov si,0468h
mov dx,03C8h
out dx,al
inc dx
rep outsb
___0000000AA:
cmp byte [perem3],00h
je ___0000000AA ;пока perem3=0 ждём прерывание от таймера - иначе выход
mov byte [perem3],000h
mov es,word [programdata+778]
inc byte [perem2]
cmp byte [programdata],000h
je ___0000000E9
dec byte [programdata]
jne ___0000001EF
;завершение программы
mov ax,2508h
mov dx,word [cs:old_int08h]
mov ds,word [cs:old_int08h+2]
int 21h
mov ax,0FFFFh
call TimerIO
mov ax,0003h ;установка видеорежима 3
int 10h
int 20h ;exit dos--------------------------------------
___0000000E9:
mov cl,byte [perem2]
test cl,3Fh
jne ___0000001AD
mov si,word [perem]
push si
xor cx,cx
lodsb
___0000000FC:
inc cx
lodsb
cmp al,20h
jae ___0000000FC
mov bx,045Dh
cmp si,bx
jb ___00000010C
mov si, message;
___00000010C:
mov word [perem],si
dec word [perem]
pop si
dec cx
jcxz ___00000011A
jmp ___00000011D
___00000011A:
jmp ___0000001AD
___00000011D:
lodsb
movzx bp,al
jcxz ___000000125
jmp ___000000128
___000000125:
jmp ___0000001AD
___000000128:
mov ax,bp
shl ax,02h
mul cx
mov bx,00A0h
sub bx,ax
add bx,9600h
push cx
mov cx,bp
___00000013B:
sub bx,0A00h
loop ___00000013B
pop cx
___000000142:
lodsb
push ds
pusha
xor ah,ah
shl ax,04h
lds si,dword [programdata+778-4]
add si,ax
xor dx,dx
push dx
mov ah,07h
lodsb
___000000156:
push bx
mov cx,0008h
___00000015A:
mov dx,0001h
push cx
mov cl,ah
shl dl,cl
pop cx
test al,dl
je ___00000017F
push ax
push cx
mov al,0FFh
mov di,bx
mov cx,bp
___00000016F:
push cx
mov cx,bp
rep stosb
pop cx
add di,0140h
sub di,bp
loop ___00000016F
pop cx
pop ax
___00000017F:
dec ah
add bx,bp
or ah,ah
jns ___00000018A
lodsb
mov ah,07h
___00000018A:
loop ___00000015A
pop bx
push cx
mov cx,bp
___000000190:
add bx,0140h
loop ___000000190
pop cx
pop dx
inc dx
push dx
cmp dx,0010h
jb ___000000156
pop dx
popa
pop ds
push cx
mov cx,bp
___0000001A5:
add bx,0008h
loop ___0000001A5
pop cx
loop ___000000142
___0000001AD:
call ___00000027F
mov cx,ax
and cx,01Fh
___0000001B5:
push cx
call ___00000027F
and ax,001Fh
inc ax
shl ax,1
mov si,ax
call ___00000027F
xor dx,dx
mov cx,12Ch
div cx
mov di,dx
add di,0FA00h
call ___00000027F
or al,080h
dec al
mov cx,si
___0000001DA:
stosb
mov [es:di+0013Fh],al
mov [es:di+0027Fh],al
mov [es:di+003BFh],al
loop ___0000001DA
pop cx
loop ___0000001B5
___0000001EF:
push es
pop ds
mov di,00280h ;" Ђ"
___0000001F4:
xor ax,ax
mov cl,byte [cs:perem2]
movzx dx,byte [di-0001h]
add ax,dx
mov dl,[di+01h]
add ax,dx
mov dl,[di]
add ax,dx
mov dl,[di+0140h]
add ax,dx
shr ax,02h ;" "
mov dl,[di-0140h] ; [di][0FEC0h]
add ax,dx
shr ax,1
cmp al,80h
jbe ___000000223
dec al
jmp ___00000022D
___000000223:
cmp al,02h ;" "
jbe ___00000022B
sub al,03h ;" "
jmp ___00000022D
___00000022B:
xor al,al
___00000022D:
mov [di-0280h],al ; [di][0FD80h],al
mov [di-0140h],al ; [di][0FEC0h],al
inc di
cmp di,0FF00h
jb ___0000001F4
push cs
push 0A000h ;" "
pop es
mov ds,word [cs:programdata+778]
mov cx,4000h ;"@ "
xor si,si
xor di,di
rep movsd
pop ds
cmp byte [programdata],00
jne ___0000000AA
mov ah,01h ;" "
int 16h
je ___0000000AA
push cs
mov es,word [cs:programdata+778]
mov di,0FA00h
mov cx,03C0h
xor ax,ax
rep stosw
pop ds
xor ah,ah
int 16h
mov byte [programdata],050h
jmp ___0000000AA
___00000027F :
mov eax,dword [programdata+2]
imul eax,eax,04Dh
inc eax
mov dword [programdata+2],eax
retn
new_int08h :
inc byte [ cs:perem3]
inc byte [cs:perem1]
cmp byte [cs:perem1],02h
jne ___0000002AB
mov byte [ cs:perem1],00h
db 0eah
old_int08h rw 2 ;переход на старый обработчик через 2 раза
___0000002AB:
push ax
mov al,020h
out 020h,al
pop ax
iret
;endp
TimerIO:
cli
push ax
mov al,36h
; 00110110b Channel 0 ,Access mode: lobyte/hibyte ,Mode 3 (square wave generator)
;Binary mode: 0 = 16-bit binary
out 43h,al ;Mode/Command register (write only, a read is ignored)
pop ax
;Установка начального значения счётчика from ax register
out 40h,al ;Channel 0 data port (read/write)
mov al,ah
out 40h,al
;счётчик непрерывно уменьшается на 2 каждый такт синхронизации, а при достижении
;нулевого значения или при переполнении состояние выхода канала меняется на
;противоположное, и счёт начинается с начала.
sti
retn
db 00h
message db 06h, 'Eugeny', 07h
db 'Nonko', 03h, 'also known as', 04h, 'CodeMaster', 03h
db 'presents', 06h, 'TASMED', 04h
db 'the', 04h, 'ultimate', 05h
db 'editor', 04h, 'for', 04h, 'assembly', 04h, 'language', 04h
db 'programs',00h, 06h, 'You', 06h, 'can', 05h, 'register', 04h
db 'it', 03h, 'absolutely', 07h, 'free',00h, 07h, 'LMD', 06h, '4ever!', 00h
perem dw 003c2h
perem1 db 0
perem2 db 0
perem3 db 0
programdata db 0
;EOF