2014-11-25 76 views
0

我必须创建一个矩阵屏幕保护程序的简单实现,就像电影中的汇编程序一样,只使用视频内存(文本)。除了随机数发生器用于获取随机字符外,我已经完成了大部分结构布局,但是我希望能够帮助缩小这些过程中的一些步骤及其实现。8086汇编语言创建矩阵屏幕保护程序

我必须使用类似下面的代码:

;Matrix 
;This program displays a matrix wallpaper 
.model small 
.386 
.stack 100h 
.data 

.code 
main proc 

    mov ax, 0b800h 
    mov es, ax 

    mov bx, 39 ; row 
    mov cx, 12 ; colum 

    mov ax, 160 
    mul cx 
    shl bx,1 
    add bx, ax 

    mov al, 'A' 
    mov ah, 0ah 
    mov es:[bx], ax 

    mov ax, 4c00h 
    int 21h 

main endp 
end main 

,但是这是我到目前为止有:

;Matrix 
;This program creates a matrix wallpaper 
.model small 
.386 
.stack 100h 
.data 

speed dword 2147483647 
X dw, ? 
Y dw, ? 
ch dw, ? 
att dw, ? 

.code 
main proc 
    mov ax, @data 
    mov ds, ax 

    ; setup interrupt 

    push ds 
    mov ax, @code 
    mov ds, ax 
    mov ah, 25h 
    mov al, 9 
    mov dx, offset My_int 
    int 21h 
    pop ds 

    ; matrix program, makes the rain effect 

Loo2: 
    ; for(y = 23; y > 0; y--) 
    L1: 
     ; for(x = 0; x <= 79; x++) 
     L2: 
      ; SgetCh(x, y, ch, attribute) 
      call SgetCh 
      ; SputCh(x, y, ch, attribute) 
      call SgetCh 
      ; BusyWait 
      call BusyWait 

    jmp Loo2  

    mov ax, 4c00h 
    int 21h 
main endp 
;*************** 
My_int proc 
    ;cli   ; diable interrupts 
    ;mov ax, mystack ; reset SS 
    ;mov ss, ax 
    ;mov sp, 100h  ; reset SP 
    ;sti   ; reenable interrupt 

    mov ax, 4c00h 
    int 21h 
    iret 
My_int endp 
;*************** 
BusyWait proc 

    ret 
BusyWait endp 
;*************** 
SgetCh proc 

    ret 
SgetCh endp 
;*************** 
SputCh proc 

    ret 
SputCh endp 
;*************** 
end main 

回答

0

这里是我很久以前写的代码。也许你可以使用它:

mov ax, 19 
int 10h ; 320x200 with 256 colors 
mov ax, 0a000h 
mov es, ax ;set the di segment to the graphics memory 
xor bl, bl ;bl will be used to store the number of the picture 
new: 
inc bl 
hlt ;here the processor will wait (very shortly and in an unregular period) 
xor cx, cx 
xor dx, dx ;cx and dx represent the coordinates 
xor di, di ;set di to offset of the begin of the screen. 
a: 
mov al, cl 
xor al, dl 
add al, dl 
add al, bl ;create a color 
stosb ;write pixel 
inc cx 
cmp cx, 320 ;refresh coordinates 
jne a 
xor cx, cx 
inc dx 
cmp dx, 200 
jne a 
mov ah, 1 ;check whether a key had been pressed 
int 16h 
jz new ;If no key had been pressed, show next picture 
mov ax, 3 
int 10h 
mov ax, 4c00h 
int 21h 
+0

这是一个很好的答案,但我不能使用dram的图形部分。我必须'mov ax,0b800h'和'mov es,ax'。 – Zen20636 2014-11-26 04:09:56

0

当你从键盘中断处理程序中终止程序时,你会发生什么?它肯定不会恢复中断向量!

由于屏幕上的所有绘图都是在主程序中完成的,因此不需要更改任何中断。正如即将退出程序作为BIOS功能“读取键盘状态”(在JMP Loo2被插入)返回与ZF = 0

这些线

mov bx, 39 ; row 
mov cx, 12 ; colum 

不对应于代码随后。你混合了列和行的含义。