Начал писать драйвер для сетевушки, имеющиеся драйвера на фасме работают через регистры io, а я буду работать через регистры в памяти, так удобнее.
В регистрах первые 6 байт это MAC адрес, и я его просто вывожу в свойствах.
Инициализация оказалась простой
Код:
init_rtl8139:
mov esi,rtlBUS
mov eax,20
call pci_r
xor al,al
mov [rtl8139BUS],eax ;[31:8]
mov [ebp],eax
add eax,37h ;55 Command Register
or byte[eax],10000b ;это ресет
@@: bt word[eax],4 ;проверка обнуления бита контроллером, куда мы 1 поставили, бит-4
jc @b
sub eax,7 ;48 Receive (Rx) Buffer Start Address
mov dword[eax],def70
add eax,12 ;60 Interrupt Mask Register
mov word[eax],01111111b
sub eax,5 ;55 Command Register
or byte[eax],01100b ;Receiver Transmitter Enable
ret
перезагрузка просто приводит устройство в предсказуемое состояние, после чего добавляем к этому состоянию нужные нам изменения для нашей работы с ней
У сетевушки RTL8111B/RTL8168B(она у меня на ноутбуке есть) тоже самое с регистрами, только сам адрес немного в другом месте и пакеты имеют приоритеты, так что пишу сразу два драйвера.
У моей сетевушки MAC адрес оказался 00 26 18 6d d1 21, а rtl8139 тестирую в QEMU пока, там он вводится самостоятельно в настройках.
Дальше нужно заняться приёмом передачей, это будет посложнее.