создание ОС на FASM

Тема в разделе "WASM.OS.DEVEL", создана пользователем vova65, 21 сен 2011.

  1. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    как выполнить операцию mov [keys],1 в обработчике..???

    а то при попытке выполнить mov [keys],1 в логе в цикле виводиться

    Код (Text):
    1. 00046603999e[CPU0 ] fetch_raw_descriptor: GDT: index (7f3f) fe7 > limit (1f)
    Код (Text):
    1. key:
    2. pusha
    3. in al,60h
    4.  
    5. push ax
    6. mov al,20h
    7. out 20h,al
    8. pop ax
    9.  
    10. mov bx,24
    11. mov es,bx
    12.  
    13. xor bx,bx
    14. mov bl,al
    15.  
    16. add bx,ENGkey
    17. mov al,[bx]
    18.  
    19. xor edi,edi
    20.   stosb
    21.   mov al,7
    22.   stosb
    23.  
    24. mov [keys],1
    25.  
    26. popa
    27. iretd
    28. keys db 0
    29. ENGkey db 0  ,'0','1','2','3','4','5','6'
    30.        db '7','8','9','0','-','=',8  ,9
    31.        db 'q','w','e','r','t','y','u'
    32.        db 'i','o','p','[',']',13 ,0
    33.        db 'a','s','d','f','g','h','j'
    34.        db 'k','l',';',"'",'`',0  ,'\'
    35.        db 'z','x','c','v','b','n','m'
    36.        db ',','.','/',0  ,'*',0  ,' '
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Сохраняй/настраивай/восстанавливай используемые сегментные регистры.
     
  3. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    что значит строка лога..?

    Код (Text):
    1. 00014552412e[HD   ] IO read(0x01f0) with drq == 0: last command was 00h
     
  4. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Тебе перевести что ли? Читаешь из регистра данных при DRQ=0.
     
  5. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    По каким причинам код может зацикливатся..?

    Код (Text):
    1. mov  dx,01f7h
    2. s:
    3. in   al,dx
    4. test al,08h
    5. jz   s
     
  6. 418ImATeapot

    418ImATeapot New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2011
    Сообщения:
    6
    Надо так:
    Код (Text):
    1. mov dx,01f7h       ;Ждем пока BSY=1, на случай если девайс занят
    2. m1:
    3. in   al,dx
    4. test al,80h
    5. jnz  m1
    Т. Е. двойная ошибка.

    Подробнее см. здесь: http://www.wasm.ru/article.php?article=atazen01

    ПС: метка s (так же, как m1) - это не по FASMовский

    Правильно делать так:
    Код (Text):
    1. @@:
    2.  ...
    3. jnz @b
    Метка @@ называется безымянной. Их можно сделать сколько угодно.
    Метка @b ссылается на последнюю идущую перед ней @@, соответственно @f ссылается на последнюю идущую за ней @@.
     
  7. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    В каких случаях при работе с ATA контролером возникает ошибка ABRT???
     
  8. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    помогите пожалуйса...
    как в Bochs подключить ata диск..?
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    1.
    А вообще смотри описание по каждой конкретной команде.

    2.
    Код (Text):
    1. ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
    2. ...
    3. ata0-master: type=disk, path="disk.bin", heads=16, spt=63
    В боксе напрямую жесткий диск подключить нельзя, только флоппик и CD/DVD.
     
  10. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    как правильно создать disk.bin..?
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Это может быть просто чистый бинарный файл размером 16x63xNx512 байт, где N - нужное количество цилиндров. Его разметку можно выполнить непосредственно в боксе, загрузившись с какого-либо сменного носителя и запустив подходящую программу.

    Если нужен образ с разметкой (не слишком большого размера), то можно попробовать его сделать прямо в fasm'е. Рядом была соответствующая тема. У меня есть наработки по созданию образа с MBR-FAT16, но я пока их не выкладываю. Вот пример разметки:
    Код (Text):
    1. include "makedisk.inc"
    2.  
    3. PART_STATE = PS_ACTIVE
    4. PART_TYPE = 4
    5.  
    6. HEADS = 16
    7. SPT = 63
    8.  
    9. file "../bootcode/disk/mbr/alter-2/alter-2.bin",440
    10. db ?,?,?,?,0,0
    11. db PART_STATE,1,1,0
    12. db PART_TYPE,HEADS-1,(CYLINDERS-1) and 300h shr 2 + SPT,(CYLINDERS-1) and 0FFh
    13. dd SPT,(CYLINDERS*HEADS-1)*SPT
    14. db 3*16 dup 0
    15. dw 0AA55h
    16.  
    17. rb SPT*512-$
    18.  
    19. include "mkfat16.inc"
    20.  
    21. IP_MEDIA = 0F8h
    22. IP_SPT = SPT
    23. IP_HEADS = HEADS
    24.  
    25. orgimage "../bootcode/disk/fat16/boot.bin"
    26.  
    27. orgdir root
    28. dent linkzimage,"LINK    PK",FA_ARC
    29. findir root
    30.  
    31. stof linkzimage,"../tools/sysinfo/sysinfo.bin"
    32.  
    33. finimage MINSIZE,0
    34.  
    35. db HEADS*SPT*512-1 - ($+HEADS*SPT*512-1) mod (HEADS*SPT*512) dup 0
    36.  
    37. CYLINDERS=$/(HEADS*SPT*512)
     
  12. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    помогите пожалуйса...

    почему после запуска процедуры PHDD программа зацикливается на коде процедуры ReadHDD_ID
    Код (Text):
    1. @@:
    2. in al,dx
    3. cmp al,80h
    4. jnz @b
    с содержимим al 01011000b

    Код (Text):
    1. HDDBase dw 1F0h,170h,1E8h,168h
    2. ChanelNumber dw ?;номер канала (1-4)
    3. HDDNumber db ?;Номер диска
    4. ATAFatures db ?;особености
    5. ATASectorCount db ?;Количество секторов
    6. ATASectorNumber db ?;Номер начального сектора
    7. ATACylinder dw ?;Номер начального цельндра
    8. ATAHead db ?;Номер начальной головки
    9. ATAAddresMode db ?;Режим адресации (0-CHS, 1-LBA)
    10. ATAComand db ?;Номер команды
    11. SectorAdres dd 0;
    12. HDDBasePort dw ?;Базовый адрес портов контролера HDD
    13. Buffer db 512 dup(?);Буфер
    14. HDDError db ?;Ошибка
    15. ERROR1 db 'ERROR1',0
    16. ERROR2 db 'ERROR2',0
    17. TSHDD db 'TEST-HDD',0
    18.  
    19. PHDD:
    20. pushad
    21. mov bx,16
    22. mov ds,bx
    23.  
    24. mov [ds:ChanelNumber],1
    25. MasterS:
    26. mov [ds:HDDNumber],0
    27. call ReadHDD_ID
    28. cmp [ds:HDDError],0
    29. jne SlaveS
    30.  
    31. SlaveS:
    32.  
    33. mov esi,TSHDD
    34. mov edi,160
    35. call Vvid
    36.  
    37. mov esi,Buffer
    38. mov edi,320
    39. call Vvid
    40.  
    41. popad
    42. ret
    43.  
    44. SendComandToHDD:
    45. pushad
    46. mov bx,16
    47. mov ds,bx
    48. ;Проверка режима
    49. mov bl,[ds:ATAAddresMode]
    50. cmp bl,1
    51. ja errorS
    52. ;Проверка канала
    53. mov bx,[ds:ChanelNumber]
    54. cmp bx,1
    55. jb errorS
    56. cmp bx,4
    57. ja errorS
    58. ;установить базовый адрес
    59. dec bx
    60. shl bx,1
    61. mov ax,[ds:HDDBase+bx]
    62. mov [ds:HDDBasePort],ax
    63. ;запретить приревания HDD
    64. mov dx,[ds:HDDBasePort]
    65. add dx,206h
    66. mov al,1010b
    67. out dx,al
    68. ;ожидать освобождение HDD
    69. mov dx,[ds:HDDBasePort]
    70. add dx,7
    71. ;проверить состояние BSY
    72. @@:
    73. in al,dx
    74. test al,80h
    75. jnz @b
    76. ;Вибрать нужный диск
    77. mov dx,[ds:HDDBasePort]
    78. add dx,6 ;адрес регистра головок
    79. mov al,[ds:HDDNumber]
    80. cmp al,1
    81. ja errorS
    82. shl al,4
    83. or al,10100000b
    84. out dx,al
    85. ;Ожидать пока диск не будет готов
    86. inc dx
    87. @@:
    88. in al,dx
    89. test al,80h ;состояние DSY
    90. jnz @b
    91. test al,40h ;состояние DRDY
    92. jz @b
    93. ;загрузить команду в регистры контолера
    94. mov dx,[ds:HDDBasePort]
    95. inc dx ;Регистр особенностей
    96. mov al,[ds:ATAFatures]
    97. out dx,al
    98. inc dx ;счетчик секторов
    99. mov al,[ds:ATASectorCount]
    100. out dx,al
    101. inc dx ;регистр номера сектора
    102. mov al,[ds:ATASectorNumber]
    103. out dx,al
    104. inc dx ;номер цилиндра (младший байт)
    105. mov ax,[ds:ATACylinder]
    106. out dx,al
    107. inc dx ;номер цилиндра (старший байт)
    108. mov al,ah
    109. out dx,al
    110. inc dx ;Номер головки/диска
    111. mov al,[ds:HDDNumber]
    112. shl al,4
    113. cmp [ds:ATAHead],0fh
    114. ja errorS
    115. or al,[ds:ATAHead]
    116. or al,10100000b
    117. mov ah,[ds:ATAAddresMode]
    118. shl ah,6
    119. or al,ah
    120. out dx,al
    121. ;Послать команду
    122. mov al,[ds:ATAComand]
    123. inc dx ;регистр команд
    124. out dx,al
    125. ;Сбрасываем ошибку
    126. mov [ds:HDDError],0
    127. jmp ESE
    128. errorS:
    129. mov [ds:HDDError],1
    130. mov esi,ERROR1
    131. mov edi,60
    132. call Vvid
    133. ESE:
    134. popad
    135. ret
    136.  
    137. ReadHDD_ID:
    138. pushad
    139. mov bx,16
    140. mov ds,bx
    141. ;Задать режим CHS
    142. mov [ds:ATAAddresMode],0
    143. ;Послать команду индификации устройства
    144. mov [ds:ATAFatures],0
    145. mov [ds:ATAHead],0
    146. mov [ds:ATAComand],0ECh
    147. call SendComandToHDD
    148. ;Проверить код ошибки
    149. cmp [ds:HDDError],0
    150. jne ERE
    151. ;ожидать освобождение HDD
    152. mov dx,[ds:HDDBasePort]
    153. add dx,7
    154. ;проверить состояние BSY, ERR, DRQ
    155. @@:
    156. in al,dx
    157. cmp al,80h
    158. jnz @b
    159. test al,1
    160. jnz errorR
    161. cmp al,08h
    162. jz @b
    163. ;Принять блок данных от контролера
    164. mov di,Buffer
    165. mov dx,[ds:HDDBasePort]
    166. mov cx,6
    167. rep insw
    168.  
    169.  
    170. ;Сбрасываем ошибку
    171. mov [ds:HDDError],0
    172. jmp ERE
    173. errorR:
    174. mov [ds:HDDError],1
    175. mov esi,ERROR2
    176. mov edi,60
    177. call Vvid
    178. ERE:
    179. popad
    180. ret
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Видимо, потому что 01011000b неравно 80h :)
     
  14. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    это понятно... :)
    непонятно как исправить код в процедурах чтоб этого не было...? :dntknw:(
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Много букв, лень вникать в код. Отбрось все лишнее, а когда заработает, сделаешь универсальным, т.е. как положено. Порядок примерно такой:

    1) выводишь 10100000b+(Device shl 4) в регистр устройства (1F6h);
    2) ждешь готовности устройства;
    3) выводишь код IDENTIFY DEVICE (0ECh) в регистр команд (1F7h);
    4) ждешь обнуления флага занятости и установки флага готовности к передаче данных;
    5) читаешь 256 слов из регистра данных (1F0h).
     
  16. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    код такой..?

    Код (Text):
    1. mov dx,1f6h
    2. mov al,10100000b
    3. shl al,4
    4. out dx,al
    5.  
    6. mov  dx,01f7h
    7. @@:        
    8. in   al,dx
    9. test al,80h
    10. jnz  @b
    11.  
    12. mov dx,01f7h
    13. mov al,0ECh
    14. out dx,al
    15.  
    16. mov  dx,01f7h
    17. @@:                  
    18. in   al,dx
    19. test al,80h
    20. jnz  @b
    21. test al,40h
    22. jz   @b
    23.  
    24.  
    25. mov di,Buffer
    26. mov dx,01f0h      
    27. mov cx,256      
    28. rep insw
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Инструкция 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, то в каждой паре символы поменяются местами.
     
  18. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    правельный код такой..?

    Код (Text):
    1. mov bl,0 ;номер устройства
    2. mov dx,1f6h
    3. shl bl,4
    4. mov al,10100000b
    5. add al,bl
    6. out dx,al
    7.  
    8. mov  dx,01f7h
    9. @@:        
    10. in   al,dx
    11. test al,40h
    12. jz  @b
    13.  
    14. mov dx,01f7h
    15. mov al,0ECh
    16. out dx,al
    17.  
    18. mov  dx,01f7h
    19. @@:                  
    20. in   al,dx
    21. test al,8h
    22. jz   @b
    23.  
    24.  
    25. mov di,Buffer
    26. mov dx,01f0h      
    27. mov cx,256      
    28. rep insw
    если да то почему при тестировании в Bochs содержимое Buffer не меняется?
     
  19. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Уже близко. Не мешало бы проверить и BSY по крайней мере перед приемом данных. Ну и естественно флаг направления и регистр es должны быть настроены правильно.
     
  20. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    У меня работает:
    Код (Text):
    1. org 7C00h
    2.  
    3. jmp short @f
    4. nop
    5. rb 125
    6. @@:
    7. xor ax,ax
    8. cli
    9. mov ss,ax
    10. mov sp,$$
    11. sti
    12. jmp 0:@f
    13. @@:
    14. mov es,ax
    15. cld
    16.  
    17. mov bl,0 ;íîìåð óñòðîéñòâà
    18. mov dx,1f6h
    19. shl bl,4
    20. mov al,10100000b
    21. add al,bl
    22. out dx,al
    23.  
    24. mov  dx,01f7h
    25. @@:        
    26. in   al,dx
    27. test al,40h
    28. jz  @b
    29.  
    30. mov dx,01f7h
    31. mov al,0ECh
    32. out dx,al
    33.  
    34. mov  dx,01f7h
    35. @@:                  
    36. in   al,dx
    37. test al,8h
    38. jz   @b
    39.  
    40. mov di,Buffer
    41. mov dx,01f0h      
    42. mov cx,256      
    43. rep insw
    44.  
    45. jmp $
    46.  
    47. rb 7DFEh-$
    48. dw 0AA55h
    49. label Buffer
    Код (Text):
    1. Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    2.  
    3. 00007E00  40 00 05 00 00 00 10 00 00 7E 00 02 3F 00 00 00  @........~..?...
    4. 00007E10  00 00 00 00 58 42 44 48 30 30 31 30 20 31 20 20  ....XBDH0010 1  
    5. 00007E20  20 20 20 20 20 20 20 20 03 00 00 02 04 00 00 00          ........
    6. 00007E30  00 00 00 00 00 00 65 47 65 6E 69 72 20 63 32 31  ......eGenir c21
    7. 00007E40  34 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20  43              
    8. 00007E50  20 20 20 20 20 20 20 20 20 20 20 20 20 20 10 00                ..
    9. 00007E60  01 00 00 03 00 00 00 02 00 02 07 00 05 00 10 00  ................
    10. 00007E70  3F 00 B0 13 00 00 00 00 B0 13 00 00 00 00 07 00  ?.°.....°.......
    11. 00007E80  00 00 78 00 78 00 78 00 78 00 00 00 00 00 00 00  ..x.x.x.x.......
    12. 00007E90  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    13. 00007EA0  7E 00 00 00 00 40 00 74 00 40 00 40 00 74 00 40  ~....@.t.@.@.t.@
    14. 00007EB0  3F 00 00 00 00 00 00 00 00 00 01 60 00 00 00 00  ?..........`....
    15. 00007EC0  00 00 00 00 00 00 00 00 B0 13 00 00 00 00 00 00  ........°.......
    16. 00007ED0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    17. 00007EE0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    18. 00007EF0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    19. 00007F00  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    20. 00007F10  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    21. 00007F20  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    22. 00007F30  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    23. 00007F40  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    24. 00007F50  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    25. 00007F60  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    26. 00007F70  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    27. 00007F80  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    28. 00007F90  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    29. 00007FA0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    30. 00007FB0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    31. 00007FC0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    32. 00007FD0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    33. 00007FE0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    34. 00007FF0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................