Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Запись содержимого видеобуфера в файл


Автор: sharq 17.12.2005, 01:36
Пишу резидентную программу, которая при нажатие на Ctrl записывала бы содержимое видеобуфера в файл.
Вот мой код:
Код

resident segment 'code'
    assume CS: resident, DS: resident
    org 100h
my proc far
    jmp init    ; not if jump on section init
    
    old_28 dd 0 ; for store system of 28 int, cause 09 isn't reENTERable
    old_09 dd 0 ; for store system of 09 int
    
    flag   db 0 ; flag 1-write to file
    handle dw 0 ; file handle
    symbol db 0 ; symbol
    file   db 'video.txt', 0 ; file
    
    ; new obrabotchik 09
    new_09 proc
        push AX
        
        in  AL, 60h 
        cmp AL, 29 ; ctrl down
        je PROCESS
        jmp STOP
        
        PROCESS:
            mov CS:flag, 1
            jmp STOP
        
        STOP:
            pop AX
            jmp CS:old_09
        
    new_09 endp
    
    ; new obrabotchik 28
    new_28 proc
        cmp CS:flag, 1
        je WRITE
        jmp CS:old_28
        
        WRITE:
            push AX
            push BX
            
            ; create file
            push CS
            pop  DS
            ; mov AX, seg CS:file
            ; mov DS, AX
            mov DX, offset CS:file
            mov AH, 3ch
            mov CX, 0
            int 21h
            
            jmp writebuffer
            
            RETURN:
                mov CS:flag, 0
                
                pop BX
                pop AX
                
                jmp CS:old_28
    new_28 endp
    
    ; write content videobuffer to file
    writebuffer proc
        push AX
        push ES
        push DS
        push BX
        
        ; open file for write
        push CS
        pop  DS
        
        mov DX, offset CS:file
        mov AH, 3dh
        mov CX, 1
        int 21h
        mov CS:handle, AX
        
        ;start of videobuffer
        mov AX, 0b800h
        mov ES, AX
        
        mov BX, 0
        mov CX, 25
        LOOPROW:
            push CX
            
            mov CX, 160
            MYLOOP:
                push CX
                
                mov AL, ES:[BX]
                mov CS:symbol, AL
                inc BX
                
                push BX
                
                push CS
                pop DS
                mov DX, offset CS:symbol
                mov AH, 40h
                mov BX, CS:handle
                mov CX, 1
                int 21h
                
                pop BX
                
                pop CX
            loop MYLOOP
            
            pop CX
        loop LOOPROW
        
        pop BX
        pop DS
        pop ES
        pop AX
        
        ;iret
        jmp RETURN
    writebuffer endp
    
    res_size = $ - my
    
    ; section init
    init proc
        
        ; save system 09
        mov AX, 3509h
        int 21h
        mov word ptr old_09, BX
        mov word ptr old_09 + 2, ES
        
        ; save system 28
        mov AX, 3528h
        int 21h
        mov word ptr old_28, BX
        mov word ptr old_28 + 2, ES
        
        ; replace
        mov AX, 2509h
        mov DX, offset new_09
        int 21h
        mov AX, 2528h
        mov DX, offset new_28
        int 21h
        
        ; load
        mov DX, (res_size + 10Fh)/16
        mov AX, 3100h
        int 21h
    init endp
    
resident ends
    end my


Компилирую под tasm'ом, запускаю из-под nc.
При нажатие на ctrl и при выходе из nc - создается файл, размером 4000 б - вроде все правильно, но содержимое не синего окошка nc, а командной строки, причем кажlая буква отделена от другой символом bel. И все записывается в строчку.
Код

A<bel>s<bel>s<bel>e<bel>m<bel>b<bel>l<bel>i<bel>n<bel>g<bel><bel> f<bel>i<bel>l<bel>e<bel>:   


Как записать правильно содержимое видеобуфера, без символов bel и как есть (т.е. не в строчку)?
Наверно, я записываю не тот лист видеобуфера.

И еще: почему файл создается только при выходе из nc?

smile

Автор: sharq 19.12.2005, 11:38
Проблема решилась. Просто надо писать 2 байта, а не один. smile

Код

                mov SI, 0
                mov CX, 2
                LOOPSYMBOL:
                    mov AL, ES:[BX]
                    mov CS:symbol[SI], AL
                    inc BX
                    inc SI
                loop LOOPSYMBOL


Для того, чтобы все писать не в строчку, а как есть, нужно ставить 13 символ.

smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)