Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
ekremkocak
Posts: 20 Joined: Sat Feb 21, 2015 10:39 am
Post
by ekremkocak » Mon Jan 31, 2022 3:19 am
The procedure does not run when a key is pressed on the keyboard
Code: Select all
procedure Main(); stdcall;
begin
cls(0);
WriteStr(0,0,'Hello World',4);
init_idt;
init_pic;
init_timer(100);
asm
sti
end;
LIST('/'); // <----- Floppy Read List ok
FloppyReset(0);
While True do
begin
end;
end;
procedure keyboard_callback();
var
Scancode:byte;
begin
if (ReadPortB($64) and $1)=1 then
begin
Scancode:=ReadPortB($60);
case Scancode of
2:begin
LIST('/'); // <----- Floppy Read List error
end;
end;
end;
ekremkocak
Posts: 20 Joined: Sat Feb 21, 2015 10:39 am
Post
by ekremkocak » Mon Jan 31, 2022 3:30 am
Code: Select all
const
PIC1 = $20;
PIC2 = $A0;
ICW1 = $11;
ICW4 = $01;
type
TDWORD = record
case Byte of
0:(Value32:DWORD);
1:(LoWord, HiWord: WORD);
end;
TIDTEntry = packed record
base_low : WORD;
selector : WORD;
always_0 : BYTE;
flags : BYTE;
base_high : WORD;
end;
TIDTPtr = packed record
limit : word;
base : LongWord;
end;
var
IDTTables : array[0..255] of TIDTEntry;
IDTPtr : TIDTPtr;
procedure setup_int(Number : Byte; Base : TDWord; Selector : Word; Flags : Byte); forward;
procedure init_idt; forward;
procedure init_pic; forward;
procedure keys_isr(); register; assembler;
asm
pushad
push gs
push fs
push es
push ds
call keyboard_callback
mov dx, $20
mov al, $20
out dx, al
pop ds
pop es
pop fs
pop gs
popad
iretd
end;
procedure timer_isr(); register; assembler;
asm
pushad
push gs
push fs
push es
push ds
call TimerHandler
mov dx, $20
mov al, $20
out dx, al
pop ds
pop es
pop fs
pop gs
popad
iretd
end;
procedure floppy_isr(); register; assembler;
asm
pushad
push gs
push fs
push es
push ds
call FloppyHandler
mov dx, $20
mov al, $20
out dx, al
pop ds
pop es
pop fs
pop gs
popad
iretd
end;
procedure unknown_interrupt_isr(); register; assembler;
asm
pushad
push gs
push fs
push es
push ds
mov dx, $20
mov al, $20
out dx, al
pop ds
pop es
pop fs
pop gs
popad
iretd
end;
procedure setup_int(Number : Byte; Base : TDWord; Selector : Word; Flags : Byte);
begin
IDTTables[Number].base_high:= Base.HiWord;
IDTTables[Number].base_low:= (Base.LoWord ); // and $0000FFFF
IDTTables[Number].selector:= Selector;
IDTTables[Number].flags:= Flags;
IDTTables[Number].always_0:= $00;
end;
procedure Init_idt;
var
i:integer;
begin
for i:=0 to 255 do
begin
setup_int(i, TDWord(@unknown_interrupt_isr), $08,$8E);
end;
setup_int(32, TDWORD(@timer_isr), $08,$8E);
setup_int(33, TDWORD(@keys_isr), $08,$8E);
setup_int(38, TDWORD(@floppy_isr), $08,$8E);
IDTPtr.limit := (SizeOf(TIDTEntry)*256)-1;
IDTPtr.base := DWord(@IDTTables);
asm
lidt [IDTPtr]
end;
end;
procedure init_pic;
begin
WritePortB(PIC1, ICW1);
WritePortB(PIC2, ICW1);
WritePortB(PIC1 + 1, pic1);
WritePortB(PIC2 + 1, pic2);
WritePortB(PIC1 + 1, 4);
WritePortB(PIC2 + 1, 2);
WritePortB(PIC1 + 1, ICW4);
WritePortB(PIC2 + 1, ICW4);
WritePortB(PIC1 + 1, 0);
WritePortB(PIC2 + 1, 0);
end;
Klakap
Member
Posts: 297 Joined: Sat Mar 10, 2018 10:16 am
Post
by Klakap » Mon Jan 31, 2022 10:30 am
Are you in real or in protected mode? If you use GRUB, did you already set your own GDT table?
ekremkocak
Posts: 20 Joined: Sat Feb 21, 2015 10:39 am
Post
by ekremkocak » Mon Jan 31, 2022 10:42 am
GDT ok, the program works fine on qemu, virtualbox and real pc. but when I press a key on the keyboard, normal functions are ok but IRQ0 time delay or floppy IRQ6 LIST('/'); not working.
ekremkocak
Posts: 20 Joined: Sat Feb 21, 2015 10:39 am
Post
by ekremkocak » Mon Jan 31, 2022 10:47 am
While do <<<---- OK
Code: Select all
procedure Main(); stdcall;
begin
cls(0);
WriteStr(0,0,'Hello World',4);
init_idt;
// init_pic;
init_timer(100);
asm
sti
end;
LIST('/'); // <----- List ok
FloppyReset(0);
While True do
begin
keyboard_callback(); //<---- List OK
end;
end;
ekremkocak
Posts: 20 Joined: Sat Feb 21, 2015 10:39 am
Post
by ekremkocak » Mon Jan 31, 2022 10:51 am
IRQ1
CLS PRINT OK
DELAY, LIST ERROR (IRQ0 IRQ6)
Octocontrabass
Member
Posts: 5563 Joined: Mon Mar 25, 2013 7:01 pm
Post
by Octocontrabass » Mon Jan 31, 2022 10:53 am
If you run your code in QEMU with "-d int", which interrupts appear in the log?
ekremkocak
Posts: 20 Joined: Sat Feb 21, 2015 10:39 am
Post
by ekremkocak » Mon Jan 31, 2022 12:24 pm
SMM: enter
EAX=00000001 EBX=80000070 ECX=00000cf8 EDX=000000b3
ESI=02000000 EDI=0009fb8c EBP=0009fb24 ESP=0009fb14
EIP=000e0aa0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0018 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
CS =0010 00000000 ffffffff 00cf9b00 DPL=0 CS32 [-RA]
SS =0018 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
DS =0018 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000fb867 00000030
IDT= 000f0000 00000000
CR0=60000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=0000002d CCD=00000001 CCO=LOGICB
SMM: after RSM
EAX=00000001 EBX=80000070 ECX=00000cf8 EDX=000000b3
ESI=02000000 EDI=0009fb8c EBP=0009fb24 ESP=0009fb14
EIP=000e0aa0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0018 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0010 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0018 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0018 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000fb867 00000030
IDT= 000f0000 00000000
CR0=60000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=ffffff9c CCO=EFLAGS
0: v=21 e=0000 i=0 cpl=0 IP=0008:0014db70 pc=0014db70 SP=0010:00067a78 EAX=0000002e
EAX=0000002e EBX=00034820 ECX=00402e00 EDX=00000040
ESI=0003499b EDI=00000000 EBP=00067a9c ESP=00067a78
EIP=0014db70 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 00163044 00001fff
IDT= 0016283c 000007ff
Octocontrabass
Member
Posts: 5563 Joined: Mon Mar 25, 2013 7:01 pm
Post
by Octocontrabass » Mon Jan 31, 2022 12:43 pm
Looks like you're receiving at least one keyboard interrupt. Where's the rest of the log?
Octocontrabass
Member
Posts: 5563 Joined: Mon Mar 25, 2013 7:01 pm
Post
by Octocontrabass » Mon Jan 31, 2022 1:50 pm
There are floppy disk and keyboard IRQs in your log, so those seem to be working fine. Which key are you pressing? It looks like your keyboard handler only responds to one specific scan code.
I don't see any timer IRQs. How are you setting up the timer?
ekremkocak
Posts: 20 Joined: Sat Feb 21, 2015 10:39 am
Post
by ekremkocak » Wed Feb 02, 2022 3:14 am
When a function is called from IRQ1 on IRQ6 or IRQ0, it goes into an infinite loop.
procedure IRQ6wait;
begin
while FloppyDiskIRQ = true do ; <--- error
end;
procedure IRQ0Delay(Ticks: LongWord);
var
ETicks: LongWord;
begin
ETicks:=TimerTicks+Ticks;
while TimerTicks<ETicks do ; <----- error
end;
Octocontrabass
Member
Posts: 5563 Joined: Mon Mar 25, 2013 7:01 pm
Post
by Octocontrabass » Wed Feb 02, 2022 11:14 am
Does your compiler know those variables are changed by the IRQ handler? By default, the compiler assumes interrupt handlers will not modify any variables, so the loops you wrote can be optimized into infinite loops.
I'm not very familiar with Pascal, but I think some compilers support a "volatile" keyword that works similar to "volatile" in C. Your compiler's manual should explain it in more detail.
Also, according to the QEMU log you posted earlier, the timer is not raising any IRQs. You may not be initializing the timer correctly.