ПРИВЕТ!!! ALL!!
================
ВОт реализовано позиционирование сама строка
и атрибуты
==================
Procedure InitTV; assembler;
asm
mov ax,0003h
int 10h
end;
Procedure WK;Assembler;
asm
mov ax,0
int 16h
xor ax,ax
end;
Procedure OS(x,y : Byte; S : String; c : Byte);
Begin
asm
push ds
mov ax,ss
mov ds,ax
lea si,y
mov ax,80
mov cx,[si]
mul cx
lea si,x
mov cx,[si]
add ax,cx
mov cx,0002h
mul cx
mov di,ax
mov ax,0b800h
mov es,ax
lea si,S
mov ah,0
mov al,[si]
mov cx,ax
inc si
@out:
mov al,[si] {Symbol}
mov ah,c {attribut}
inc si {nex symbol}
mov es:[di],ax {to video memory}
inc di {movenau to video memory}
inc di {increment 2 se also for 1 symbol 2 byte memory}
loop @out
pop ds
end;
end;
BEGIN
InitTV;
OS(36,10,'Hello',254);
WK;
END.
А зачем так сложно?
Procedure OS(x,y : Byte; S : String; c : Byte);Assembler;Должно работать...
Asm
PUSH DS
MOV AX,SS
MOV DS,AX
MOV AX,$B800
MOV AL,[y]
MOV BL,80
MUL BL
ADD AL,[x]
CBW
MOV DI,AX
LEA SI,[s]
MOV CL,[SI]
XOR CH,CH
INC SI
MOV AH,[c]
CLD
@@1:
LODSB
STOSW
LOOP @@1
POP DS
End;
А шо такое CBW? Какая-то фишка с флагами?
Procedure OS(x,y : Byte; S : String; c : Byte);Assembler;
Asm
PUSH DS
MOV AX,SS
MOV DS,AX
MOV AX,$B800
MOV AL,[y]
MOV BL,80
MUL BL
ADD AL,[x]
CBW
MOV DI,AX
LEA SI,[s]
MOV CL,[SI]
XOR CH,CH
INC SI
MOV AH,[c]
CLD
@@1:
LODSB
STOSW
LOOP @@1
POP DS
End;
BlackShadow
кроме того
CBW
рушит адресс в регистре AX
===========
запусти через отладчик и все увидишь
to BlackShadow
еще забыл адресс умножить на 2 т.к. два байта под символ
насчет флага DF сним и так все нормально
короче вот
Procedure OS(x,y : Byte; S : String; c : Byte);
begin
Asm
PUSH DS
MOV AX,SS
MOV DS,AX
MOV AX,$B800
mov es,ax
MOV AL,[y]
MOV BL,80
MUL BL
ADD AL,[x]
mov cx,2
mul cx
xor cx,cx
MOV dI,AX
LEA si,s
MOV cl,[si]
INC si
MOV Ah,[c]
@@1:
LODSB
STOSW
LOOP @@1
POP DS
End;
end;
begin
asm
mov ax,0003h
int 10h
end;
OS(10,15,'Hello User',4);
asm
mov ax,0
int 16h
end;
end.
FreeMan
CBW преобразование байта в слово
Я уже почитал в TechHelp'e, но всё-равно спасибо!
Товарисчи!!
Кто же юзает MUL, если все изначально преполагалось для оптимизации и скорости?? (или не так).
Вот мой вариант:
Uses
CRt;
Const
S:String = 'Assembler - forever!';
X:Word = 60;
Y:Word = 24;
C:Byte = $07;
Procedure WriteXY(X,Y:Word; C:Byte; StrOffset:Word);Assembler;
asm
mov ax,$B800
mov es,ax
mov ax,Y
mov bx,ax
shl ax,5
shl bx,3
add ax,bx
shl ax,1
add ax,X
shl ax,1
mov di,ax
mov si,StrOffset
mov ah,C
xor ch,ch
mov cl,[si]
inc si
@Next:
lodsb
stosw
loop @Next
end;
Begin
CLrScr;
WriteXY(X,Y,C,Ofs(S));
GotoXY(X+1,Y+1);
Write('є');
End.
:D
===========
Я на это и расчитывал что кто нибудь наконец применит SHL
или SHR
самая быстрая операция процессора точнее его самая любимая
:D
============
Я ленивый
Ну SHR конечно не прокатит...
Может как-нибудь переписать модуль CRT??
Shadow, про ES согласен - забыл.
Про "сбивается адрес в AX" - так он там уже за даром не нужен.
И вообще, уболтал. Дома продебугю.
GLuk
Там много переписывать не надо, исходник у меня есть, посижу как-нибудь
А насчет SHR, дык там просто незачем делить.. ;)
GLuk
нееет Я так понял что SHR там в CRT модуле не работает или работает но нетак
или имеет какието особенности так в чем прикол то
Shadow - Это вопрос или предложение??
Чой-то не догнал краями?
SHR вроде бы везде работает, или может имеешь в виду, что при написании модуля CRT не использовалась инструкция SHR??
Значит мы оба не понимаем
Все догнано и понято , дык что там насчет CRT??
SHR не прокатит только потому, что делить дам просто незачем, при реализации просчета смещения к нужному знакоместу. Как ты правильно понял деление там просто не нужно...
А CRT переписать под новые процы (386+), так для интересу.
Исходники CRT у меня где-то были, а под 386 там ничего не реализовано, лишь базовые возможности 8086...