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
![]() |