Пишу резидентную программу, которая при нажатие на 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?
|