Использование прямого программирования видеобуфера - Assembler

Узнай цену своей работы

Формулировка задачи:

подскажите как проще вывести на экран используя прямое программирование видеобуфера вывести такое изображение?

Решение задачи: «Использование прямого программирования видеобуфера»

textual
Листинг программы
.286
        assume  cs:cseg, ds:dseg, ss:sseg
cseg    segment
start:
    mov ax, dseg
    mov ds, ax
    mov es, ax
 
    MOV AX, 0013h ; AH=0 AL=13h
    INT 10h
    PUSH 0A000h
    POP ES; позиционируем ES на область видеопамяти
;предварительные установки
    MOV DI,X ; в DI координаты начальной точки по X
    MOV AX,320; длина строки экрана
    MUL Y; умножаем на Y
    ADD DI,AX; и складываем с X
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,30h 
    call  verticalLineDN
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,15h     
    call  diagonalLineLeftUP
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,6h
    call  gorizontalLine
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Bh
    call  diagonalLineLeftDN             
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,0Ah
    call  verticalLineDN
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,06h
    STD
    call  gorizontalLine     
    CLD
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,20h
    call  verticalLineUP
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,13h
    call  diagonalLineRightUP
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,6h
    call  gorizontalLine        
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,0Eh
    call  diagonalLineRightDN 
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Dh
    call  verticalLineUP        
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Dh
    call  diagonalLineLeftDN 
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,5h
    call  diagonalLineRightUP
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Dh
    call  diagonalLineLeftUP         
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,22h
    STD
    call  gorizontalLine 
    CLD
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,8h
    call  verticalLineUP     
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,22h
    call  gorizontalLine
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Eh
    call  diagonalLineRightUP
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,7h
    call  gorizontalLine 
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Eh
    call  diagonalLineRightDN            
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,22h
    call  verticalLineUP   
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,06h
    call  gorizontalLine    
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,22h
    call  verticalLineDN
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Eh
    call  diagonalLineLeftUP
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,7h
    call  gorizontalLine
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Eh
    call  diagonalLineLeftDN    
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,22h
    call  gorizontalLine
    DEC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,8h
    call  verticalLineDN        
    INC  COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,26h
    STD
    call  gorizontalLine
    CLD
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Eh
    call  diagonalLineRightDN
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,7h
    STD
    call  gorizontalLine    
    CLD
    INC COLOR
    MOV AL,COLOR; цвет линии
    MOV CX,1Bh
    call  diagonalLineRightUP      
 
 
    jmp  exit 
gorizontalLine proc
; рисуем горизонтальную линию
;CX=dlina stroki
    REP STOSB 
    ret
gorizontalLine endp     
 
 
verticalLineDN proc
;CX=dlina stroki
A1: MOV ES:[DI],AL; рисуем точку на строке
    ADD DI,320; переход на следующую строку
    LOOP A1
    
    ret
verticalLineDN endp 
 
verticalLineUP proc
;CX=dlina stroki
A4: MOV ES:[DI],AL; рисуем точку на строке
    SUB DI,320; переход на следующую строку
    LOOP A4
    
    ret
verticalLineUP endp
 
diagonalLineLeftDN proc
;CX=dlina stroki
    A2: MOV ES:[DI],AL; рисуем точку на строке
    ADD DI,319; переход на следующую строку
    LOOP A2
    
    ret
diagonalLineLeftDN endp
 
diagonalLineLeftUP proc
;CX=dlina stroki
    A5: MOV ES:[DI],AL; рисуем точку на строке
    SUB DI,319; переход на следующую строку
    LOOP A5
    
    ret
diagonalLineLeftUP endp
 
diagonalLineRightDN proc
;CX=dlina stroki
A3: MOV ES:[DI],AL; рисуем точку на строке
    ADD DI,321; переход на следующую строку
    LOOP A3
    
    ret
diagonalLineRightDN endp 
 
diagonalLineRightUP proc
;CX=dlina stroki
A8: MOV ES:[DI],AL; рисуем точку на строке
    SUB DI,321; переход на следующую строку
    LOOP A8
    
    ret
diagonalLineRightUP endp
 
exit:    
    ; wait for any key....    
    mov ah, 1
    int 21h
    
        mov     ax, 4C00h
        int     21h
 
cseg    ends
 
 
        ; data
dseg    segment byte
    x dw 90h
    y dw 50h
    color db 0h
    n  dw 30
dseg    ends
 
 
        ; stack
sseg    segment stack
 
        db      100h    dup(?)
 
sseg    ends
end start

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы