написал такой нехитрый код, компильнул в fasm и закинул на дискету rawwriter`ом:
| Код | boot_program equ 07c00h ;position for boot code
jmp start_boot
msg db 'Boot master',0 x db ? y db ?
start_boot: xor ax,ax ; ax=0 mov ss,ax ; ss=0 mov sp,boot_program ; sp=0x7C00 push ss ; pop ds ; ds=0
; вывод на экран сообщение msg mov si,msg+boot_program loop_loading: lodsb or al,al jz move_cursor mov ah,0eh mov bx,07h int 010h jmp loop_loading
; перемещаем курсор по экрану move_cursor: ; читаем данные о текущем положени курсора mov ah, 3 mov bh, 0 int 10h mov [x], dl ; запоминаем положение mov [y], dh
wait_cursor: ; читаем символы введенные с клавы mov ah, 0 int 16h ; обрабатываем cmp al, 0 jnz wait_cursor cmp ah, 72 ;up jz press_up cmp ah, 80 ;down jz press_down cmp ah, 75 ;left jz press_left cmp ah, 77 ;right jz press_right jmp wait_cursor ; если нажаты не стрелки
press_up: ; задаем новую позицию курсора cmp [y], 0 ; чтобы за экран не выскакивал jz wait_cursor mov ah, 2 mov bh, 0 mov dh, [y] dec dh ; уменьшаем координату на 1 int 10h jmp move_cursor press_down: cmp [y], 24 ; чтобы за экран не выскакивал jz wait_cursor ; задаем новую позицию курсора mov ah, 2 mov bh, 0 mov dh, [y] inc dh ; уыеличиваем координату на 1 int 10h jmp move_cursor press_left: cmp [x], 0 ; чтобы за экран не выскакивал jz wait_cursor ; задаем новую позицию курсора mov ah, 2 mov bh, 0 mov dl, [x] dec dl ; уменьшаем координату на 1 int 10h jmp move_cursor press_right: cmp [x], 79; чтобы за экран не выскакивал jz wait_cursor ; задаем новую позицию курсора mov ah, 2 mov bh, 0 mov dl, [x] inc dl ; увеличиваем координату на 1 int 10h jmp move_cursor
dw 55h,0AAh ; boot signature
|
суть кода в том, что при загрузке с дискеты можно курсором на клавиатуре перещать курсор по экрану. вопрос в том, что где-то здесь есть ошибка - работает этот код "через раз". почему, может кто увидел? |