Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с Bios
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
dron4ik
Всем привет. Программа должна выводить системное время и дату на экран большими буквами...все работает кроме символа " : " находящегося между минутами и секундами, этот символ должен мигать а он у мя не мигает..( помогите пожалуйста разобраться что не так..(

			     DATASG  SEGMENT 'DATA'
NUMBERS LABEL BYTE
DB 7CH, 0C6H, 0CEH, 0DEH, 0F6H, 0E6H, 7CH, 00 ;0 КОД 0

DB 30H, 70H, 30H, 30H, 30H, 30H, 0FCH, 00 ;1 КОД 1

DB 78H, 0CCH, 0CH, 38H, 60H, 0CCH, 0FCH, 00 ;2 КОД 2

DB 78H, 0CCH, 0CH, 38H, 0CH, 0CCH, 78H, 00 ;3 КОД 3

DB 1CH, 3CH, 6CH, 0CCH, 0FEH, 0CH, 1EH, 00 ;4 КОД 4

DB 0FCH, 0C0H, 0F8H, 0CH, 0CH, 0CCH, 78H, 00 ;5 КОД 5

DB 38H, 60H, 0C0H, 0F8H, 0CCH, 0CCH, 78H, 00 ;6 КОД 6

DB 0FCH, 0CCH, 0CH, 18H, 30H, 30H, 30H, 00 ;7 КОД 7

DB 78H, 0CCH, 0CCH, 78H, 0CCH, 0CCH, 78H, 00 ;8 КОД 8

DB 78H, 0CCH, 0CCH, 7CH, 0CH, 18H, 70H, 00 ;9 КОД 9

DB 00, 30H, 30H, 00, 00, 30H, 30H, 00 ;: КОД А

DB 06, 0CH, 18H, 30H, 60H, 0C0H, 80H, 00 ;/ КОД В


DELT EQU 9
DATASG ENDS

STACKSG SEGMENT STACK 'STACK'
DB 100H DUP(?)
STACKSG ENDS

CODESG SEGMENT 'CODE'
ASSUME CS: CODESG, SS: STACKSG, DS: DATASG

PRINT PROC
;IN: AL - КОД СИМВОЛА; BH - СТРОКА НАЧАЛА ПЕЧАТИ; BL - СТОЛБЕЦ НАЧАЛА ПЕЧАТИ
PUSHF
PUSH AX
PUSH DX
PUSH CX
PUSH DS
PUSH SI
PUSH ES
PUSH DI

XOR AH, AH
MOV CL, 8
MUL CL
MOV SI, AX

MOV AX, DATASG
MOV DS, AX
MOV AX, 0B800H
MOV ES, AX

;DESTONATION INDEX: DI=(80*(BH-CL)+BL)*2
MOV AL, BH
MOV CL, 80
MUL CL
XOR CH, CH
MOV CL, BL
ADD AX, CX
MOV CX, 2
MUL CX
MOV DI, AX

MOV AH, 1AH
MOV CX, 8
PRINT_IC:
PUSH CX
PUSH DI

LODSB

MOV CX, 8
PRINT_EC:
ROL AL, 1
PUSH AX
AND AL, 1
JNZ ONE
MOV AL, ' '
JMP PRINTP
ONE: MOV AL, '&'
PRINTP: STOSW
POP AX
LOOP PRINT_EC

POP DI
ADD DI, 160
POP CX
LOOP PRINT_IC
POP DI
POP ES
POP SI
POP DS
POP CX
POP DX
POP AX
POPF
RET
PRINT ENDP

CLS PROC
PUSHF
PUSH AX
PUSH CX

PUSH DI
PUSH ES

MOV AH, 05
MOV AL, 0
INT 10H

MOV AX, 0B800h
MOV ES, AX
MOV CX, 2000
XOR DI, DI
MOV AH, 1AH
MOV AL, ' '
REP STOSW

POP ES
POP DI
POP CX
POP AX
POPF

RET
CLS ENDP

TIMEPRT PROC
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX

MOV BX, 0107H
MOV AH, 2CH
INT 21H

XOR AH, AH
MOV AL, CH
MOV CH, 10
DIV CH
CALL PRINT





ADD BL, 8
MOV AL, AH
CALL PRINT

ADD BL, 8
MOV AL, 0AH
CALL PRINT

ADD BL, 8
XOR AH, AH
MOV AL, CL
DIV CH
CALL PRINT

ADD BL, 8
MOV AL, AH
CALL PRINT

ADD BL, 8
MOV AL, 0AH
CALL PRINT

ADD BL, 8
XOR AH, AH
MOV AL, DH
DIV CH
CALL PRINT

ADD BL, 8
MOV AL, AH
CALL PRINT

POP DX
POP CX
POP BX
POP AX
POPF
RET
TIMEPRT ENDP

DATAPRT PROC
PUSHF
PUSH AX
PUSH BX

PUSH CX
PUSH DX

MOV BX, 0900H

MOV AH, 2AH
INT 21H

MOV AX, CX
PUSH DX
XOR DX, DX
MOV CX, 1000
DIV CX
CALL PRINT
ADD BX, 8
MOV AX, DX
XOR DX, DX
MOV CX, 100
DIV CX
CALL PRINT

ADD BX, 8
MOV AX, DX
XOR DX, DX
MOV CX, 10
DIV CX
CALL PRINT

ADD BX, 8
MOV AX, DX
CALL PRINT

ADD BX, 8
MOV AX, 0BH
CALL PRINT

ADD BX, 8
POP DX
XOR AH, AH
MOV AL, DH
DIV CL
CALL PRINT

ADD BX, 8
MOV AL, AH
CALL PRINT

ADD BX, 8
MOV AX, 0BH
CALL PRINT

ADD BX, 8
XOR AH, AH
MOV AL, DL
DIV CL
CALL PRINT

ADD BX, 8
MOV AL, AH
CALL PRINT

POP DX
POP CX
POP BX
POP AX
POPF
RET
DATAPRT ENDP

BEGIN:
MAIN PROC
CALL CLS

GET_KEY:
MOV AH,0 ;номер функции для "чтения"
INT 1AH ;получаем значение счетчика
ADD DX, DELT ;добавляем время задержки к младшему слову
MOV BX,DX ;запоминаем требуемое значение в BX

DCCL: INT 1AH ;получаем значение счетчика
CMP DX,BX ;сравниваем с искомым
JB DCCL ;если не равен, то повторяем снова

CALL TIMEPRT
CALL DATAPRT

MOV AH, 06
MOV DL, 0FFH
INT 21H
CMP AL, 27
JNZ GET_KEY

CALL CLS
MOV AX, 4C00H
INT 21H
MAIN ENDP
CODESG ENDS
END BEGIN
AndNot
VGA видеокарты в текстовом видеорежиме могут работать в двух режимах:
1 - режим повышенной яркости цвета фона (это цвета от 8 до 15)
2 - режим мерцания символов (тогда цвета фона от 8 до 15 не доступны).
Дело в том, что за повышенную яркость фона и мерцание символов отвечает один и тот же бит байта атрибутов символов - самый старший бит в цвете фона байта атрибутов. По умолчанию BIOS включает режим повышенной яркости фона и нужно самому переключить режимы. Режим мерцания включается так:
        mov     ax, 1003h
mov bl, 1
int 10h

После этого все символы на экране, у которых установлен старший бит цвета фона, начнут мигать.
Переключиться обратно можно точно так же, но задав BL = 0.
xmavr
Здравствуйте!
Подскажите пожалуйста, что за значения написаны в сегменте данных?

 DB	     7CH, 0C6H,	0CEH, 0DEH, 0F6H, 0E6H,	7CH, 00	     ;0	КОД 0
DB 30H, 70H, 30H, 30H, 30H, 30H, 0FCH, 00 ;1 КОД 1
DB 78H, 0CCH, 0CH, 38H, 60H, 0CCH, 0FCH, 00 ;2 КОД 2
DB 78H, 0CCH, 0CH, 38H, 0CH, 0CCH, 78H, 00 ;3 КОД 3
DB 1CH, 3CH, 6CH, 0CCH, 0FEH, 0CH, 1EH, 00 ;4 КОД 4
DB 0FCH, 0C0H, 0F8H, 0CH, 0CH, 0CCH, 78H, 00 ;5 КОД 5
DB 38H, 60H, 0C0H, 0F8H, 0CCH, 0CCH, 78H, 00 ;6 КОД 6
DB 0FCH, 0CCH, 0CH, 18H, 30H, 30H, 30H, 00 ;7 КОД 7
DB 78H, 0CCH, 0CCH, 78H, 0CCH, 0CCH, 78H, 00 ;8 КОД 8
DB 78H, 0CCH, 0CCH, 7CH, 0CH, 18H, 70H, 00 ;9 КОД 9
DB 00, 30H, 30H, 00, 00, 30H, 30H, 00 ;: КОД А
DB 06, 0CH, 18H, 30H, 60H, 0C0H, 80H, 00 ;/ КОД В


И по какому принципу записаны эти значения...
IUnknown
Цитата
Подскажите пожалуйста, что за значения написаны в сегменте данных?
А ты переведи эти значения в двоичные (7CH = 0111_1100, 0C6H = 1100_0110 и так далее), и нарисуй строка за строкой на бумаге. Единица - есть пиксел, ноль - нету. В каждой строке - одно значение:

.*****..
**...**.
**..***.
**.****.
****.**.
***..**.
.*****..
........


Ничего не замечаешь? Что нарисовано?
xmavr
IUnknown, большое спасибо good.gif
Оказывается все элементарно просто, достаточно перевести в двоичную систему и все встает на свои места
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.