как выполнить операцию mov [keys],1 в обработчике..??? а то при попытке выполнить mov [keys],1 в логе в цикле виводиться Код (Text): 00046603999e[CPU0 ] fetch_raw_descriptor: GDT: index (7f3f) fe7 > limit (1f) Код (Text): key: pusha in al,60h push ax mov al,20h out 20h,al pop ax mov bx,24 mov es,bx xor bx,bx mov bl,al add bx,ENGkey mov al,[bx] xor edi,edi stosb mov al,7 stosb mov [keys],1 popa iretd keys db 0 ENGkey db 0 ,'0','1','2','3','4','5','6' db '7','8','9','0','-','=',8 ,9 db 'q','w','e','r','t','y','u' db 'i','o','p','[',']',13 ,0 db 'a','s','d','f','g','h','j' db 'k','l',';',"'",'`',0 ,'\' db 'z','x','c','v','b','n','m' db ',','.','/',0 ,'*',0 ,' '
что значит строка лога..? Код (Text): 00014552412e[HD ] IO read(0x01f0) with drq == 0: last command was 00h
Надо так: Код (Text): mov dx,01f7h ;Ждем пока BSY=1, на случай если девайс занят m1: in al,dx test al,80h jnz m1 Т. Е. двойная ошибка. Подробнее см. здесь: http://www.wasm.ru/article.php?article=atazen01 ПС: метка s (так же, как m1) - это не по FASMовский Правильно делать так: Код (Text): @@: ... jnz @b Метка @@ называется безымянной. Их можно сделать сколько угодно. Метка @b ссылается на последнюю идущую перед ней @@, соответственно @f ссылается на последнюю идущую за ней @@.
1. А вообще смотри описание по каждой конкретной команде. 2. Код (Text): ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ... ata0-master: type=disk, path="disk.bin", heads=16, spt=63 В боксе напрямую жесткий диск подключить нельзя, только флоппик и CD/DVD.
Это может быть просто чистый бинарный файл размером 16x63xNx512 байт, где N - нужное количество цилиндров. Его разметку можно выполнить непосредственно в боксе, загрузившись с какого-либо сменного носителя и запустив подходящую программу. Если нужен образ с разметкой (не слишком большого размера), то можно попробовать его сделать прямо в fasm'е. Рядом была соответствующая тема. У меня есть наработки по созданию образа с MBR-FAT16, но я пока их не выкладываю. Вот пример разметки: Код (Text): include "makedisk.inc" PART_STATE = PS_ACTIVE PART_TYPE = 4 HEADS = 16 SPT = 63 file "../bootcode/disk/mbr/alter-2/alter-2.bin",440 db ?,?,?,?,0,0 db PART_STATE,1,1,0 db PART_TYPE,HEADS-1,(CYLINDERS-1) and 300h shr 2 + SPT,(CYLINDERS-1) and 0FFh dd SPT,(CYLINDERS*HEADS-1)*SPT db 3*16 dup 0 dw 0AA55h rb SPT*512-$ include "mkfat16.inc" IP_MEDIA = 0F8h IP_SPT = SPT IP_HEADS = HEADS orgimage "../bootcode/disk/fat16/boot.bin" orgdir root dent linkzimage,"LINK PK",FA_ARC findir root stof linkzimage,"../tools/sysinfo/sysinfo.bin" finimage MINSIZE,0 db HEADS*SPT*512-1 - ($+HEADS*SPT*512-1) mod (HEADS*SPT*512) dup 0 CYLINDERS=$/(HEADS*SPT*512)
помогите пожалуйса... почему после запуска процедуры PHDD программа зацикливается на коде процедуры ReadHDD_ID Код (Text): @@: in al,dx cmp al,80h jnz @b с содержимим al 01011000b Код (Text): HDDBase dw 1F0h,170h,1E8h,168h ChanelNumber dw ?;номер канала (1-4) HDDNumber db ?;Номер диска ATAFatures db ?;особености ATASectorCount db ?;Количество секторов ATASectorNumber db ?;Номер начального сектора ATACylinder dw ?;Номер начального цельндра ATAHead db ?;Номер начальной головки ATAAddresMode db ?;Режим адресации (0-CHS, 1-LBA) ATAComand db ?;Номер команды SectorAdres dd 0; HDDBasePort dw ?;Базовый адрес портов контролера HDD Buffer db 512 dup(?);Буфер HDDError db ?;Ошибка ERROR1 db 'ERROR1',0 ERROR2 db 'ERROR2',0 TSHDD db 'TEST-HDD',0 PHDD: pushad mov bx,16 mov ds,bx mov [ds:ChanelNumber],1 MasterS: mov [ds:HDDNumber],0 call ReadHDD_ID cmp [ds:HDDError],0 jne SlaveS SlaveS: mov esi,TSHDD mov edi,160 call Vvid mov esi,Buffer mov edi,320 call Vvid popad ret SendComandToHDD: pushad mov bx,16 mov ds,bx ;Проверка режима mov bl,[ds:ATAAddresMode] cmp bl,1 ja errorS ;Проверка канала mov bx,[ds:ChanelNumber] cmp bx,1 jb errorS cmp bx,4 ja errorS ;установить базовый адрес dec bx shl bx,1 mov ax,[ds:HDDBase+bx] mov [ds:HDDBasePort],ax ;запретить приревания HDD mov dx,[ds:HDDBasePort] add dx,206h mov al,1010b out dx,al ;ожидать освобождение HDD mov dx,[ds:HDDBasePort] add dx,7 ;проверить состояние BSY @@: in al,dx test al,80h jnz @b ;Вибрать нужный диск mov dx,[ds:HDDBasePort] add dx,6 ;адрес регистра головок mov al,[ds:HDDNumber] cmp al,1 ja errorS shl al,4 or al,10100000b out dx,al ;Ожидать пока диск не будет готов inc dx @@: in al,dx test al,80h ;состояние DSY jnz @b test al,40h ;состояние DRDY jz @b ;загрузить команду в регистры контолера mov dx,[ds:HDDBasePort] inc dx ;Регистр особенностей mov al,[ds:ATAFatures] out dx,al inc dx ;счетчик секторов mov al,[ds:ATASectorCount] out dx,al inc dx ;регистр номера сектора mov al,[ds:ATASectorNumber] out dx,al inc dx ;номер цилиндра (младший байт) mov ax,[ds:ATACylinder] out dx,al inc dx ;номер цилиндра (старший байт) mov al,ah out dx,al inc dx ;Номер головки/диска mov al,[ds:HDDNumber] shl al,4 cmp [ds:ATAHead],0fh ja errorS or al,[ds:ATAHead] or al,10100000b mov ah,[ds:ATAAddresMode] shl ah,6 or al,ah out dx,al ;Послать команду mov al,[ds:ATAComand] inc dx ;регистр команд out dx,al ;Сбрасываем ошибку mov [ds:HDDError],0 jmp ESE errorS: mov [ds:HDDError],1 mov esi,ERROR1 mov edi,60 call Vvid ESE: popad ret ReadHDD_ID: pushad mov bx,16 mov ds,bx ;Задать режим CHS mov [ds:ATAAddresMode],0 ;Послать команду индификации устройства mov [ds:ATAFatures],0 mov [ds:ATAHead],0 mov [ds:ATAComand],0ECh call SendComandToHDD ;Проверить код ошибки cmp [ds:HDDError],0 jne ERE ;ожидать освобождение HDD mov dx,[ds:HDDBasePort] add dx,7 ;проверить состояние BSY, ERR, DRQ @@: in al,dx cmp al,80h jnz @b test al,1 jnz errorR cmp al,08h jz @b ;Принять блок данных от контролера mov di,Buffer mov dx,[ds:HDDBasePort] mov cx,6 rep insw ;Сбрасываем ошибку mov [ds:HDDError],0 jmp ERE errorR: mov [ds:HDDError],1 mov esi,ERROR2 mov edi,60 call Vvid ERE: popad ret
Много букв, лень вникать в код. Отбрось все лишнее, а когда заработает, сделаешь универсальным, т.е. как положено. Порядок примерно такой: 1) выводишь 10100000b+(Device shl 4) в регистр устройства (1F6h); 2) ждешь готовности устройства; 3) выводишь код IDENTIFY DEVICE (0ECh) в регистр команд (1F7h); 4) ждешь обнуления флага занятости и установки флага готовности к передаче данных; 5) читаешь 256 слов из регистра данных (1F0h).
код такой..? Код (Text): mov dx,1f6h mov al,10100000b shl al,4 out dx,al mov dx,01f7h @@: in al,dx test al,80h jnz @b mov dx,01f7h mov al,0ECh out dx,al mov dx,01f7h @@: in al,dx test al,80h jnz @b test al,40h jz @b mov di,Buffer mov dx,01f0h mov cx,256 rep insw
Инструкция shl al,4 применена неправильно. Моя запись означает, что нужно использовать 10100000b для Device 0 и 10110000b для Device 1. В принципе твое может прокатить для Device 0, т.к. биты 7 и 5 считаются устаревшими, но это неправильно. Готовность устройства - это DRDY. Готовность к передаче данных - это DRQ. Флаг BSY не помешает проверять каждый раз (это, так сказать, сдерживающий флаг), но лично я ориентируюсь на DRDY и DRQ. Некоторые вообще задержки делают только по флагу BSY. Короче перед посылкой команды должно быть BSY=0/DRDY=1, перед приемом данных должно быть BSY=0/DRQ=1. Ты перед приемом данных делаешь test al,40h, а это проверка DRDY, а не DRQ. DRQ - это test al,8. И последнее. Если читать данные посредством rep insw, то в каждой паре символы поменяются местами.
правельный код такой..? Код (Text): mov bl,0 ;номер устройства mov dx,1f6h shl bl,4 mov al,10100000b add al,bl out dx,al mov dx,01f7h @@: in al,dx test al,40h jz @b mov dx,01f7h mov al,0ECh out dx,al mov dx,01f7h @@: in al,dx test al,8h jz @b mov di,Buffer mov dx,01f0h mov cx,256 rep insw если да то почему при тестировании в Bochs содержимое Buffer не меняется?
Уже близко. Не мешало бы проверить и BSY по крайней мере перед приемом данных. Ну и естественно флаг направления и регистр es должны быть настроены правильно.
У меня работает: Код (Text): org 7C00h jmp short @f nop rb 125 @@: xor ax,ax cli mov ss,ax mov sp,$$ sti jmp 0:@f @@: mov es,ax cld mov bl,0 ;íîìåð óñòðîéñòâà mov dx,1f6h shl bl,4 mov al,10100000b add al,bl out dx,al mov dx,01f7h @@: in al,dx test al,40h jz @b mov dx,01f7h mov al,0ECh out dx,al mov dx,01f7h @@: in al,dx test al,8h jz @b mov di,Buffer mov dx,01f0h mov cx,256 rep insw jmp $ rb 7DFEh-$ dw 0AA55h label Buffer Код (Text): Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00007E00 40 00 05 00 00 00 10 00 00 7E 00 02 3F 00 00 00 @........~..?... 00007E10 00 00 00 00 58 42 44 48 30 30 31 30 20 31 20 20 ....XBDH0010 1 00007E20 20 20 20 20 20 20 20 20 03 00 00 02 04 00 00 00 ........ 00007E30 00 00 00 00 00 00 65 47 65 6E 69 72 20 63 32 31 ......eGenir c21 00007E40 34 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 00007E50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 10 00 .. 00007E60 01 00 00 03 00 00 00 02 00 02 07 00 05 00 10 00 ................ 00007E70 3F 00 B0 13 00 00 00 00 B0 13 00 00 00 00 07 00 ?.°.....°....... 00007E80 00 00 78 00 78 00 78 00 78 00 00 00 00 00 00 00 ..x.x.x.x....... 00007E90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007EA0 7E 00 00 00 00 40 00 74 00 40 00 40 00 74 00 40 ~....@.t.@.@.t.@ 00007EB0 3F 00 00 00 00 00 00 00 00 00 01 60 00 00 00 00 ?..........`.... 00007EC0 00 00 00 00 00 00 00 00 B0 13 00 00 00 00 00 00 ........°....... 00007ED0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007EE0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007EF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007F90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007FA0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007FB0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007FC0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007FD0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007FE0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00007FF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................