Mona86


 Года два назад я нацелился на порт программы Mona 256B для Atari. Программа была портирована на разныее платформы, почему бы и не нацелиться на старый компьютер? Алгоритм уже описан, эмуляторы найдены, и вот пришел час. Программа переделана с примера boot sector:

org 100h
use16
    push 0xA000
    pop es
    mov si, brush
    xor cx, cx

    mov ax, 0x0013
    int 0x10

    mov ebx, 0x7EC80000

part_loop:
    lodsw
    mov bx, ax
    
    mov bp, 64
    sub bp, cx
    shl bp, 5
    mov sp, bp
    
len_loop:
    shl ebx, 1
    jnc not_carry
    xor ebx, 0x04C11DB7
    mov dh, bl
    not_carry:

    and dh, 0x82
    je dir_00
    jpe dir_82
    js dir_80
    dir_02:
inc al
jmp dir_end
    dir_82:
dec al
jmp dir_end
    dir_00:
inc ah
jmp dir_end 
    dir_80:
dec ah
    dir_end:
    
    and ax, 0x7F7F
    cmp ah, 96
    jae skip

    movzx di, ah
    movzx bp, al
    imul di, 320
    add di, bp
    mov bp, cx
    and bp, 3
    mov dl, byte[bp + color]
    mov [es:di], dl
    skip:
    
    dec sp
    jnz len_loop
    inc cx
    cmp cx, 64
    jl part_loop    
    jmp $
  
color:
    db 0x43, 0x42, 0x06, 0x00
    
brush:
    dw 0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B
    dw 0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2
    dw 0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347
    dw 0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051
    dw 0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C
    dw 0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7
    dw 0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B
    dw 0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139

Теперь можно переписать код на 8086. Только надо заменить построение точки на вызов прерывания 10h


Долго просидел над кодом, и вот результат - не похожа на оригинал. Я перепробовал разные варианты, пересмотрел исходники, и тут нашел причину:


;compilation: tinyasm -f bin ml.asm -o ml.com
cpu 8086
org 0x100
; use16
    mov si, brush
    xor cx, cx
push cs
pop ds
    mov ax, 4
    int 0x10
;    mov ah, 0Bh
;    mov bx, 0000h       ; high intensity
;    int 10h
;
;    mov     ah, 0Bh         ; interrupt 10B
;    mov     bx, 0x100           ; bh=1 = 4 pallette mode
;    mov     bl, 0           ; 0 = warm colors (r,g,b) 1 = cool (c,m,w)
;    int     10h             ; bios int
;    mov ebx, 0x7EC80000
mov di,0x7EC8
xor dh,dh
part_loop:
    lodsw
    mov bx, ax
push dx
    mov dx, 64
    sub dx, cx
   push cx
  mov cl,5
    shl dx,cl
  pop cx
    mov bp, dx
pop dx
len_loop:
add bx,bx
adc di,di
    jnc not_carry
    ;xor ebx, 0x04C11DB7
    xor bx,0x1DB7
    xor di,0x04C1
    mov dh, bl
not_carry:
    and dh, 0x82
    je dir_00
    jpe dir_82
    js dir_80
dir_02:
inc al
jmp dir_end
dir_82:
dec al
jmp dir_end
dir_00:
inc ah
jmp dir_end 
dir_80:
dec ah
dir_end:
    
    and ax, 0x7F7F
    cmp ah, 95
    ja skip
;plot
push dx
push ax
push bx
push cx
push cx
; movzx dx,ah ;Y
mov dl,ah
xor dh,dh
; movzx cx,al ;X
mov cl,al
xor ch,ch
pop bx
and bx,3
mov al,[bx+color]
; xor bh,bh
mov ah,0x0C
int 0x10;CX=x,Dx=y,BH=#page,AL=color, AH=$0C
pop cx
pop bx
pop ax
pop dx
skip:
    
    dec bp
    jnz len_loop
    inc cx
    cmp cx, 64
    jl part_loop
    
    mov ah,1
    int 0x21
    ret
  
color:
    db 3,1,2,0
    
brush:
    dw 0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B
    dw 0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2
    dw 0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347
    dw 0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051
    dw 0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C
    dw 0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7
    dw 0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B
    dw 0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139

Исходники+программа.  В идеале можно увеличить рисунок, если влезет в размер. Займусь, когда будет время.

Комментарии