@DobriyParen

Как в векторную графику на картинке написать название и автора указать tasm?

.model small
    .stack
    .code
xc  equ word ptr [bp+10]
yc  equ word ptr [bp+8]
rad equ word ptr [bp+6]
color   equ byte ptr [bp+4]
 
; внутренние переменные
; эти переменные существуют только в процессе работы процедуры
circX   equ word ptr [bp-2]
circY   equ word ptr [bp-4]
circD   equ word ptr [bp-6]
 
if 1
; вывод точки
; x=cx, y=dx, color=al
plot:   push di
    push es
    cmp cx,320 ; координаты выходят за границы экрана ?
    jnc pl1
    cmp dx,200
    jnc pl1
    push ax
    mov ax,320 ; di=320*y+x
    mul dx
    add ax,cx
    mov di,ax
    mov ax,0A000h
    mov es,ax
    pop ax
    mov es:[di],al ; выводим точку
pl1:    pop es
    pop di
    ret
endif
 
drawCircle:
;    putpixel(xc+x, yc+y, RED)
    mov cx,xc
    add cx,circx
    mov dx,yc
    add dx,circy
        call plot
;    putpixel(xc-x, yc+y, RED)
    mov cx,xc
    sub cx,circx
    mov dx,yc
    add dx,circy
        call plot
;    putpixel(xc+x, yc-y, RED)
    mov cx,xc
    add cx,circx
    mov dx,yc
    sub dx,circy
        call plot
;    putpixel(xc-x, yc-y, RED)
    mov cx,xc
    sub cx,circx
    mov dx,yc
    sub dx,circy
        call plot
;    putpixel(xc+y, yc+x, RED)
    mov cx,xc
    add cx,circy
    mov dx,yc
    add dx,circx
        call plot
;    putpixel(xc-y, yc+x, RED)
    mov cx,xc
    sub cx,circy
    mov dx,yc
    add dx,circx
        call plot
;    putpixel(xc+y, yc-x, RED)
    mov cx,xc
    add cx,circy
    mov dx,yc
    sub dx,circx
        call plot
;    putpixel(xc-y, yc-x, RED)
    mov cx,xc
    sub cx,circy
    mov dx,yc
    sub dx,circx
        call plot
    ret
 
circle  proc
    push bp   ; пролог Сохраняем bp в стеке
    mov bp,sp ; далее мы адресуем переменные с помощью bp
    sub sp,16 ; выделяем место под локальные переменные
    push ax
    push bx
    push cx
    push dx
 
;x = 0: y = r
;d = 3 - 2 * r
;drawCircle(xc, yc, x, y)
    mov ax,0
    mov circx,ax
    mov ax,rad
    mov circy,ax
    mov ax,rad
    add ax,ax
    sub ax,3
    neg ax
    mov circd,ax
    mov al,color
    call drawCircle
; while (y >= x)
circle0:mov ax,circy
    cmp ax,circx
    jl circle1
; x=x+1
    inc circx
;' update d, x, y
;if (d > 0) then
;   y=y-1:d = d + 4 * (x - y) + 10
;else
;        d = d + 4 * x + 6
;end if
    cmp circd,0
    jle circle2
    dec circy
    mov ax,circx
    sub ax,circy
    add ax,ax
    add ax,ax
    add ax,circd
    add ax,10
    mov circd,ax
    jmp circle3
circle2:mov ax,circx
    add ax,ax
    add ax,ax
    add ax,circd
    add ax,6
    mov circd,ax
circle3:
; drawCircle(xc, yc, x, y)
    mov al,color
    call drawCircle
; wend
    jmp circle0
circle1:
    pop dx
    pop cx
    pop bx
    pop ax
    mov sp,bp ; эпилог, восстанавливаем sp
    pop bp    ; восстанавливаем bp
    ret 8    ; делаем возврат и продвигаем стек на 4*2=8 байт (т к 4 аргументов хранилось в стеке)
circle  endp
 
; ******** drawline ********
 
; аргументы вызова - координаты линии и цвет
; эти переменные заносятся в стек перед вызовом drawline
; см invoke
x1  equ word ptr [bp+12]
y1  equ word ptr [bp+10]
x2  equ word ptr [bp+8]
y2  equ word ptr [bp+6]
col equ byte ptr [bp+4]
 
; внутренние переменные drawline
; эти переменные существуют только в процессе работы drawline
deltaX  equ word ptr [bp-2]
deltaY  equ word ptr [bp-4]
signX   equ word ptr [bp-6]
signY   equ word ptr [bp-8]
er  equ word ptr [bp-10]
er2 equ word ptr [bp-12]
 
; вывод линии
; SUB drawLine (x1, y1, x2, y2, col)
; Пример вызова:
; invoke drawline, <10,10,310,10,15>
 
drawline proc
    push bp   ; пролог Сохраняем bp в стеке
    mov bp,sp ; далее мы адресуем переменные с помощью bp
    sub sp,16 ; выделяем место под локальные переменные
    push ax
    push bx
    push cx
    push dx
;deltaX = ABS(x2 - x1)
    mov ax,x2
    sub ax,x1
    jge lin1
    neg ax
lin1:   mov deltaX,ax
;deltaY = ABS(y2 - y1)
    mov ax,y2
    sub ax,y1
    jge lin2
    neg ax
lin2:   mov deltaY,ax
;IF x1 < x2 THEN signX = 1 ELSE signX = -1
    mov bx,1
    mov ax,x1
    cmp ax,x2
    JL  lin3
    neg bx
lin3:   mov signX,bx
;iF y1 < y2 THEN signY = 1 ELSE signY = -1
    mov bx,1
    mov ax,y1
    cmp ax,y2
    JL  lin4
    neg bx
lin4:   mov signY,bx
;er = deltaX - deltaY
    mov ax,deltaX
    sub ax,deltaY
    mov er,ax
;PSET (x2, y2), col
    mov cx,x2
    mov dx,y2
    mov al,col
    call plot
; основной цикл построения линии
;WHILE (x1 <> x2) OR (y1 <> y2)
wil1:   mov ax,x1
    cmp ax,x2
    jnz wil2
    mov ax,y1
    cmp ax,y2
    jnz wil2
    jmp wend
wil2:   
;PSET (x1, y1), col
    mov cx,x1
    mov dx,y1
    mov al,col
    call plot
;er2 = er * 2
    mov ax,er
    add ax,ax
    mov er2,ax
;IF (er2 > -deltaY) THEN er = er - deltaY: x1 = x1 + signX
    mov ax,er2
    add ax,deltaY
    JLE lin5
    mov ax,er
    sub ax,deltaY
    mov er,ax
    mov ax,x1
    add ax,signX
    mov x1,ax
lin5:
;IF (er2 < deltaX) THEN er = er + deltaX: y1 = y1 + signY
    mov ax,er2
    cmp ax,deltaX
    jge lin6
    mov ax,er
    add ax,deltaX
    mov er,ax
    mov ax,y1
    add ax,signY
    mov y1,ax
;WEND
lin6:   jmp wil1
wend:   pop dx
    pop cx
    pop bx
    pop ax
    mov sp,bp ; эпилог, восстанавливаем sp
    pop bp    ; восстанавливаем bp
    ret 10    ; делаем возврат и продвигаем стек на 5*2=10 байт (т к 5 аргументов хранилось в стеке)
drawline endp
 
if 1
; макро вызова drawline См lst.lst, какой код генерит это макро
 
invoke macro CallProc,Params
    IRP P,<Params>
        mov ax, P
        push ax
        
    endm
    call CallProc
endm
 
bgfill: push es
    mov di,0A000h
    mov es,di
    mov al,11
    mov ah,al
    mov cx,320*100
    mov di,0
    cld
    rep stosw
    pop es
    ret
 
 
start:  push cs
    pop  ds
    push cs
    pop  es
; граф режим 320*200*256 цветов 
    mov ax,13h
    int 10h
; цвет неба
    call bgfill
; ракета
    invoke drawline, <70,128,171,79,0>
        invoke drawline, <171,79,208,76,0>
        invoke drawline, <208,76,192,107,0>
        invoke drawline, <192,107,93,160,0>
        invoke drawline, <93,160,70,128,0>
        invoke drawline, <171,79,192,107,0>
; боковые треугольники
    invoke drawline, <70,128,44,115,0>
    invoke drawline, <44,115,93,116,0>
 
        invoke drawline, <93,160,96,185,0>
        invoke drawline, <96,185,115,150,0>
; центральный треугольник
        invoke drawline, <104,134,67,163,0>
        invoke drawline, <104,134,53,144,0>
        invoke drawline, <67,163,53,144,0>
; окна
        invoke circle,<160,103,10,0>
        invoke circle,<128,120,10,0>
; солнышко
    mov cx,30
m1:     invoke circle,<270,45,cx,14>
        invoke circle,<271,45,cx,14>
    loop m1
; ожидание нажатия на клавишу
    mov ah,0
    int 16h
; текстовый режим
    mov ax,3
    int 10h
; выход в дос
    mov ax,4C00h
    int 21h
endif
    end start
Буду очень рад если поможете в моём случае хочу написать на картинке косм корабль и автора всё. Помогите если не сложно
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
freeExec
@freeExec
Участник OpenStreetMap
Загружают шрифт представляющий из себя набор-маску для каждого символа, где какие пиксели должны гореть. И копируют в нужную область буфера каждый нужный символ.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы