diff --git a/Asuro.iso b/Asuro.iso index a0343626..c2dd42a6 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index b5356ff0..97aa3f61 100755 Binary files a/bin/kernel.bin and b/bin/kernel.bin differ diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index b5356ff0..97aa3f61 100755 Binary files a/iso/boot/asuro.bin and b/iso/boot/asuro.bin differ diff --git a/lib/ACE.ppu b/lib/ACE.ppu index f09f6baf..5726294d 100644 Binary files a/lib/ACE.ppu and b/lib/ACE.ppu differ diff --git a/lib/BPE.ppu b/lib/BPE.ppu index cef367a8..52bdf541 100644 Binary files a/lib/BPE.ppu and b/lib/BPE.ppu differ diff --git a/lib/BTSSE.ppu b/lib/BTSSE.ppu index 3844ea25..7f6a9642 100644 Binary files a/lib/BTSSE.ppu and b/lib/BTSSE.ppu differ diff --git a/lib/CFE.ppu b/lib/CFE.ppu index 72772343..2b5481e5 100644 Binary files a/lib/CFE.ppu and b/lib/CFE.ppu differ diff --git a/lib/CSOE.ppu b/lib/CSOE.ppu index 7ce44af3..33ea2127 100644 Binary files a/lib/CSOE.ppu and b/lib/CSOE.ppu differ diff --git a/lib/DBGE.ppu b/lib/DBGE.ppu index cdb3ac1e..3f9b2930 100644 Binary files a/lib/DBGE.ppu and b/lib/DBGE.ppu differ diff --git a/lib/DBZ.ppu b/lib/DBZ.ppu index da43c006..e678332f 100644 Binary files a/lib/DBZ.ppu and b/lib/DBZ.ppu differ diff --git a/lib/DFE.ppu b/lib/DFE.ppu index 9493cbec..1ca3e655 100644 Binary files a/lib/DFE.ppu and b/lib/DFE.ppu differ diff --git a/lib/E1000.ppu b/lib/E1000.ppu index a4baaf7a..dc238369 100644 Binary files a/lib/E1000.ppu and b/lib/E1000.ppu differ diff --git a/lib/GPF.ppu b/lib/GPF.ppu index 674d61b2..da4c1fbf 100644 Binary files a/lib/GPF.ppu and b/lib/GPF.ppu differ diff --git a/lib/IDE.ppu b/lib/IDE.ppu index e616918a..3a6855a3 100644 Binary files a/lib/IDE.ppu and b/lib/IDE.ppu differ diff --git a/lib/IDOE.ppu b/lib/IDOE.ppu index 5f238954..2f3a16e9 100644 Binary files a/lib/IDOE.ppu and b/lib/IDOE.ppu differ diff --git a/lib/IOPE.ppu b/lib/IOPE.ppu index b61e8d94..95fcd9d6 100644 Binary files a/lib/IOPE.ppu and b/lib/IOPE.ppu differ diff --git a/lib/MCE.ppu b/lib/MCE.ppu index fac3ffb0..02e5227c 100644 Binary files a/lib/MCE.ppu and b/lib/MCE.ppu differ diff --git a/lib/NCE.ppu b/lib/NCE.ppu index 8f8853b0..11fc788d 100644 Binary files a/lib/NCE.ppu and b/lib/NCE.ppu differ diff --git a/lib/NMIE.ppu b/lib/NMIE.ppu index 20dc215f..99703d94 100644 Binary files a/lib/NMIE.ppu and b/lib/NMIE.ppu differ diff --git a/lib/OOBE.ppu b/lib/OOBE.ppu index f96c7df6..613dc294 100644 Binary files a/lib/OOBE.ppu and b/lib/OOBE.ppu differ diff --git a/lib/PCI.ppu b/lib/PCI.ppu index c0c3bd0a..d086f035 100644 Binary files a/lib/PCI.ppu and b/lib/PCI.ppu differ diff --git a/lib/PF.ppu b/lib/PF.ppu index 18be69bb..a855d547 100644 Binary files a/lib/PF.ppu and b/lib/PF.ppu differ diff --git a/lib/PS2_KEYBOARD_ISR.ppu b/lib/PS2_KEYBOARD_ISR.ppu index 73aa63ab..31843339 100644 Binary files a/lib/PS2_KEYBOARD_ISR.ppu and b/lib/PS2_KEYBOARD_ISR.ppu differ diff --git a/lib/RTC.ppu b/lib/RTC.ppu index bb2e61ac..b7d9e2d7 100644 Binary files a/lib/RTC.ppu and b/lib/RTC.ppu differ diff --git a/lib/SFE.ppu b/lib/SFE.ppu index 0ead53d9..e89cef5a 100644 Binary files a/lib/SFE.ppu and b/lib/SFE.ppu differ diff --git a/lib/SNPE.ppu b/lib/SNPE.ppu index 49c7e257..b3758921 100644 Binary files a/lib/SNPE.ppu and b/lib/SNPE.ppu differ diff --git a/lib/TMR_0_ISR.ppu b/lib/TMR_0_ISR.ppu index a7094f66..f956d2b1 100644 Binary files a/lib/TMR_0_ISR.ppu and b/lib/TMR_0_ISR.ppu differ diff --git a/lib/UIE.ppu b/lib/UIE.ppu index 63c116d7..6e8b2275 100644 Binary files a/lib/UIE.ppu and b/lib/UIE.ppu differ diff --git a/lib/USB.ppu b/lib/USB.ppu index 3b5ddf3b..0963d543 100644 Binary files a/lib/USB.ppu and b/lib/USB.ppu differ diff --git a/lib/arp.ppu b/lib/arp.ppu index 6cd83a9a..d68d1352 100644 Binary files a/lib/arp.ppu and b/lib/arp.ppu differ diff --git a/lib/asuro.ppu b/lib/asuro.ppu index a6173b28..fd27a06a 100644 Binary files a/lib/asuro.ppu and b/lib/asuro.ppu differ diff --git a/lib/bios_data_area.ppu b/lib/bios_data_area.ppu index ac540914..4c1950d5 100644 Binary files a/lib/bios_data_area.ppu and b/lib/bios_data_area.ppu differ diff --git a/lib/console.o b/lib/console.o index f6b54c67..098617e0 100644 Binary files a/lib/console.o and b/lib/console.o differ diff --git a/lib/console.ppu b/lib/console.ppu index 225c84b6..93a15f13 100644 Binary files a/lib/console.ppu and b/lib/console.ppu differ diff --git a/lib/cpu.ppu b/lib/cpu.ppu new file mode 100644 index 00000000..5ce150ff Binary files /dev/null and b/lib/cpu.ppu differ diff --git a/lib/drivermanagement.ppu b/lib/drivermanagement.ppu index 99a8ff1a..92c5fcf1 100644 Binary files a/lib/drivermanagement.ppu and b/lib/drivermanagement.ppu differ diff --git a/lib/fat32.ppu b/lib/fat32.ppu index 562cdcb2..8ae27acb 100644 Binary files a/lib/fat32.ppu and b/lib/fat32.ppu differ diff --git a/lib/idt.ppu b/lib/idt.ppu index 5066fb63..7cfb2e93 100644 Binary files a/lib/idt.ppu and b/lib/idt.ppu differ diff --git a/lib/ipv4.ppu b/lib/ipv4.ppu index dfae377b..311c113b 100644 Binary files a/lib/ipv4.ppu and b/lib/ipv4.ppu differ diff --git a/lib/irq.ppu b/lib/irq.ppu index 4b4039f5..a2bdbded 100644 Binary files a/lib/irq.ppu and b/lib/irq.ppu differ diff --git a/lib/isrmanager.ppu b/lib/isrmanager.ppu index fd55df11..5a6a9ec5 100644 Binary files a/lib/isrmanager.ppu and b/lib/isrmanager.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 2aff3703..def55963 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/keyboard.ppu b/lib/keyboard.ppu index 4f7afa61..645ab552 100644 Binary files a/lib/keyboard.ppu and b/lib/keyboard.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 31e2fa47..0bf7edfb 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index e7bb48fa..66eb27dd 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index 2eb662ec..c4830098 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/lists.ppu b/lib/lists.ppu index a0ece310..57ba0bf0 100644 Binary files a/lib/lists.ppu and b/lib/lists.ppu differ diff --git a/lib/lmemorymanager.ppu b/lib/lmemorymanager.ppu index c6e204e5..d57b3469 100644 Binary files a/lib/lmemorymanager.ppu and b/lib/lmemorymanager.ppu differ diff --git a/lib/memview.ppu b/lib/memview.ppu index e65963d1..0d17b415 100644 Binary files a/lib/memview.ppu and b/lib/memview.ppu differ diff --git a/lib/mouse.ppu b/lib/mouse.ppu index 1a15ecdf..132fc942 100644 Binary files a/lib/mouse.ppu and b/lib/mouse.ppu differ diff --git a/lib/netutils.ppu b/lib/netutils.ppu index 5b4313b1..4bfb9b6b 100644 Binary files a/lib/netutils.ppu and b/lib/netutils.ppu differ diff --git a/lib/pmemorymanager.ppu b/lib/pmemorymanager.ppu index 8a0cca4b..e3da2cba 100644 Binary files a/lib/pmemorymanager.ppu and b/lib/pmemorymanager.ppu differ diff --git a/lib/serial.ppu b/lib/serial.ppu index f425cf10..9ddf0dde 100644 Binary files a/lib/serial.ppu and b/lib/serial.ppu differ diff --git a/lib/splash.ppu b/lib/splash.ppu index 7956a5f8..1a7d4444 100644 Binary files a/lib/splash.ppu and b/lib/splash.ppu differ diff --git a/lib/storagemanagement.ppu b/lib/storagemanagement.ppu index 28f44425..7f325071 100644 Binary files a/lib/storagemanagement.ppu and b/lib/storagemanagement.ppu differ diff --git a/lib/strings.ppu b/lib/strings.ppu index afaf9617..83ddb938 100644 Binary files a/lib/strings.ppu and b/lib/strings.ppu differ diff --git a/lib/terminal.ppu b/lib/terminal.ppu index e6a5a539..18d62f60 100644 Binary files a/lib/terminal.ppu and b/lib/terminal.ppu differ diff --git a/lib/tracer.ppu b/lib/tracer.ppu index d68e3dbf..2271b095 100644 Binary files a/lib/tracer.ppu and b/lib/tracer.ppu differ diff --git a/lib/util.ppu b/lib/util.ppu index 44e85175..abf3ff78 100644 Binary files a/lib/util.ppu and b/lib/util.ppu differ diff --git a/lib/vmemorymanager.ppu b/lib/vmemorymanager.ppu index 659fa9a1..de79ddea 100644 Binary files a/lib/vmemorymanager.ppu and b/lib/vmemorymanager.ppu differ diff --git a/src/cpu.pas b/src/cpu.pas new file mode 100644 index 00000000..dbbb9119 --- /dev/null +++ b/src/cpu.pas @@ -0,0 +1,257 @@ +unit cpu; + +interface + +uses + console, util, RTC, terminal; + +type + PCapabilities_Old = ^TCapabilities_Old; + TCapabilities_Old = bitpacked record + FPU : Boolean; + VME : Boolean; + DE : Boolean; + PSE : Boolean; + TSC : Boolean; + MSR : Boolean; + PAE : Boolean; + MCE : Boolean; + CX8 : Boolean; + APIC : Boolean; + RESV0 : Boolean; + SEP : Boolean; + MTRR : Boolean; + PGE : Boolean; + MCA : Boolean; + CMOV : Boolean; + PAT : Boolean; + PSE36 : Boolean; + PSN : Boolean; + CLF : Boolean; + RESV1 : Boolean; + DTES : Boolean; + ACPI : Boolean; + MMX : Boolean; + FXSR : Boolean; + SSE : Boolean; + SSE2 : Boolean; + SS : Boolean; + HTT : Boolean; + TM1 : Boolean; + IA64 : Boolean; + PBE : Boolean; + end; + PCapabilities_New = ^TCapabilities_New; + TCapabilities_New = bitpacked record + SSE3 : Boolean; + PCLMUL : Boolean; + DTES64 : Boolean; + MONITOR : Boolean; + DS_CPL : Boolean; + VMX : Boolean; + SMX : Boolean; + EST : Boolean; + TM2 : Boolean; + SSSE3 : Boolean; + CID : Boolean; + RESV0 : Boolean; + FMA : Boolean; + CX16 : Boolean; + ETPRD : Boolean; + PDCM : Boolean; + RESV1 : Boolean; + PCIDE : Boolean; + DCA : Boolean; + SSE4_1 : Boolean; + SSE4_2 : Boolean; + x2APIC : Boolean; + MOVBE : Boolean; + POPCNT : Boolean; + RESV2 : Boolean; + AES : Boolean; + XSAVE : Boolean; + OSXSAVE : Boolean; + AVX : Boolean; + RESV3 : Boolean; + RESV4 : Boolean; + RESV5 : Boolean; + end; + TClockSpeed = record + Hz : uint32; + MHz : uint32; + GHz : uint32; + end; + TCPUID = record + ClockSpeed : TClockSpeed; + Identifier : Array[0..12] of Char; + Capabilities0 : PCapabilities_Old; + Capabilities1 : PCapabilities_New; + end; + +var + CPUID : TCPUID; + CAP_OLD, CAP_NEW : uint32; + +procedure init(); + +implementation + +procedure getCPUIdentifier; +var + id0, id1, id2 : uint32; + id : pchar; + i : uint32; + +begin + asm + PUSH EAX + PUSH EBX + PUSH ECX + PUSH EDX + MOV EAX, 0 + CPUID + MOV id0, EBX + MOV id1, EDX + MOV id2, ECX + POP EDX + POP ECX + POP EBX + POP EAX + end; + CPUID.Identifier[12]:= char(0); + id:= pchar(@id0); + for i:=0 to 3 do begin + CPUID.Identifier[0+i]:= id[i]; + end; + id:= pchar(@id1); + for i:=0 to 3 do begin + CPUID.Identifier[4+i]:= id[i]; + end; + id:= pchar(@id2); + for i:=0 to 3 do begin + CPUID.Identifier[8+i]:= id[i]; + end; +end; + +procedure getCPUCapabilities; +begin + asm + PUSH EAX + PUSH EBX + PUSH ECX + PUSH EDX + MOV EAX, 1 + CPUID + MOV CAP_OLD, EDX + MOV CAP_NEW, ECX + POP EDX + POP ECX + POP EBX + POP EAX + end; +end; + +procedure getCPUClockSpeed; +var + t1, t2 : TDateTime; + c : uint32; + + +begin + c:= 0; + t1:= getDateTime; + t2:= getDateTime; + while (t1.Seconds = t2.Seconds) do begin + inc(c); + t2:= getDateTime; + end; + CPUID.ClockSpeed.Hz:= c; + CPUID.ClockSpeed.MHz:= CPUID.ClockSpeed.Hz div 1000; + CPUID.ClockSpeed.GHz:= CPUID.ClockSpeed.MHz div 1000; +end; + +procedure printCapabilities(WND : HWND); +begin + { Old Capabilities } + if CPUID.Capabilities0^.FPU then writestringWND('FPU', WND); + if CPUID.Capabilities0^.VME then writestringWND(', VME', WND); + if CPUID.Capabilities0^.DE then writestringWND(', DE', WND); + if CPUID.Capabilities0^.PSE then writestringWND(', PSE', WND); + if CPUID.Capabilities0^.TSC then writestringWND(', TSC', WND); + if CPUID.Capabilities0^.MSR then writestringWND(', MSR', WND); + if CPUID.Capabilities0^.PAE then writestringWND(', PAE', WND); + if CPUID.Capabilities0^.MCE then writestringWND(', MCE', WND); + if CPUID.Capabilities0^.CX8 then writestringWND(', CX8', WND); + if CPUID.Capabilities0^.APIC then writestringWND(', APIC', WND); + if CPUID.Capabilities0^.SEP then writestringWND(', SEP', WND); + if CPUID.Capabilities0^.MTRR then writestringWND(', MTRR', WND); + if CPUID.Capabilities0^.PGE then writestringWND(', PGE', WND); + if CPUID.Capabilities0^.MCA then writestringWND(', MCA', WND); + if CPUID.Capabilities0^.CMOV then writestringWND(', CMOV', WND); + if CPUID.Capabilities0^.PAT then writestringWND(', PAT', WND); + if CPUID.Capabilities0^.PSE36 then writestringWND(', PSE36', WND); + if CPUID.Capabilities0^.PSN then writestringWND(', PSN', WND); + if CPUID.Capabilities0^.CLF then writestringWND(', CLF', WND); + if CPUID.Capabilities0^.DTES then writestringWND(', DTES', WND); + if CPUID.Capabilities0^.ACPI then writestringWND(', ACPI', WND); + if CPUID.Capabilities0^.MMX then writestringWND(', MMX', WND); + if CPUID.Capabilities0^.FXSR then writestringWND(', FXSR', WND); + if CPUID.Capabilities0^.SSE then writestringWND(', SSE', WND); + if CPUID.Capabilities0^.SSE2 then writestringWND(', SSE2', WND); + if CPUID.Capabilities0^.SS then writestringWND(', SS', WND); + if CPUID.Capabilities0^.HTT then writestringWND(', HTT', WND); + if CPUID.Capabilities0^.TM1 then writestringWND(', TM1', WND); + if CPUID.Capabilities0^.IA64 then writestringWND(', IA64', WND); + if CPUID.Capabilities0^.PBE then writestringWND(', PBE', WND); + { Newer Capabilities } + if CPUID.Capabilities1^.SSE3 then writestringWND(', SSE3', WND); + if CPUID.Capabilities1^.PCLMUL then writestringWND(', PCLMUL', WND); + if CPUID.Capabilities1^.DTES64 then writestringWND(', DTES64', WND); + if CPUID.Capabilities1^.MONITOR then writestringWND(', MONITOR', WND); + if CPUID.Capabilities1^.DS_CPL then writestringWND(', DS_CPL', WND); + if CPUID.Capabilities1^.VMX then writestringWND(', VMX', WND); + if CPUID.Capabilities1^.SMX then writestringWND(', SMX', WND); + if CPUID.Capabilities1^.EST then writestringWND(', EST', WND); + if CPUID.Capabilities1^.TM2 then writestringWND(', TM2', WND); + if CPUID.Capabilities1^.SSSE3 then writestringWND(', SSSE3', WND); + if CPUID.Capabilities1^.CID then writestringWND(', CID', WND); + if CPUID.Capabilities1^.FMA then writestringWND(', FMA', WND); + if CPUID.Capabilities1^.CX16 then writestringWND(', CX16', WND); + if CPUID.Capabilities1^.ETPRD then writestringWND(', ETPRD', WND); + if CPUID.Capabilities1^.PDCM then writestringWND(', PDCM', WND); + if CPUID.Capabilities1^.PCIDE then writestringWND(', PCIDE', WND); + if CPUID.Capabilities1^.DCA then writestringWND(', DCA', WND); + if CPUID.Capabilities1^.SSE4_1 then writestringWND(', SSE4_1', WND); + if CPUID.Capabilities1^.SSE4_2 then writestringWND(', SSE4_2', WND); + if CPUID.Capabilities1^.x2APIC then writestringWND(', x2APIC', WND); + if CPUID.Capabilities1^.MOVBE then writestringWND(', MOVBE', WND); + if CPUID.Capabilities1^.POPCNT then writestringWND(', POPCNT', WND); + if CPUID.Capabilities1^.AES then writestringWND(', AES', WND); + if CPUID.Capabilities1^.XSAVE then writestringWND(', XSAVE', WND); + if CPUID.Capabilities1^.OSXSAVE then writestringWND(', OSXSAVE', WND); + if CPUID.Capabilities1^.AVX then writestringWND(', AVX', WND); + writestringlnWND(' ', WND); +end; + +procedure Terminal_Command_CPU(Params : PParamList); +begin + writeStringWND('Vendor: ', getTerminalHWND); + writeStringLnWND(@CPUID.Identifier[0], getTerminalHWND); + writeStringWND('CPU Clock: ', getTerminalHWND); + writeIntWND(CPUID.ClockSpeed.MHz, getTerminalHWND); + writeStringlnWND('MHz', getTerminalHWND); + writeStringWND('CPU Capabilities: ', getTerminalHWND); + printCapabilities(getTerminalHWND); +end; + +procedure init(); +begin + terminal.registerCommand('CPU', @Terminal_Command_CPU, 'CPU Info.'); + CPUID.Capabilities0:= PCapabilities_Old(@CAP_OLD); + CPUID.Capabilities1:= PCapabilities_New(@CAP_NEW); + getCPUIdentifier; + getCPUCapabilities; + getCPUClockSpeed; +end; + +end. \ No newline at end of file diff --git a/src/driver/hid/keyboard.pas b/src/driver/hid/keyboard.pas index c01f38af..9d0b19cf 100644 --- a/src/driver/hid/keyboard.pas +++ b/src/driver/hid/keyboard.pas @@ -21,6 +21,9 @@ type TKeyInfo = packed record key_code : byte; is_down_code : boolean; //true when pressing down, false when releasing + SHIFT_DOWN : boolean; + CTRL_DOWN : boolean; + ALT_DOWN : boolean; end; PKeyInfo = ^TKeyInfo; @@ -31,7 +34,9 @@ var key_matrix : array [1..256] of TKeyInfo; key_matrix_shift : array [1..256] of TKeyInfo; captin_hook : pp_hook_method = nil; - is_shift : boolean = false; + is_shift : boolean = false; + is_ctrl : boolean = false; + is_alt : boolean = false; procedure init(keyboard_layout : array of TKeyInfo); procedure hook(proc : pp_hook_method); @@ -43,20 +48,36 @@ uses drivermanagement; procedure callback(scan_code : void); +var + info : TKeyInfo; + begin - //console.writehex(uint8(scan_code)); + //console.writestring('[Keyboard] Scancode: '); + //console.writeintln(uint32(scan_code)); + info.SHIFT_DOWN:= is_shift; + info.CTRL_DOWN:= is_ctrl; + info.ALT_DOWN:= is_alt; if is_shift then begin if key_matrix_shift[uint8(scan_code)].key_code <> 0 then begin - if captin_hook <> nil then captin_hook(key_matrix_shift[uint8(scan_code)]); + if captin_hook <> nil then begin + info.key_code:= key_matrix_shift[uint8(scan_code)].key_code; + captin_hook(info); + end; end; end else begin if key_matrix[uint8(scan_code)].key_code <> 0 then begin - if captin_hook <> nil then captin_hook(key_matrix[uint8(scan_code)]); + if captin_hook <> nil then begin + info.key_code:= key_matrix[uint8(scan_code)].key_code; + captin_hook(info); + end; end; end; - if uint8(scan_code) = 42 then is_shift := true; if uint8(scan_code) = 170 then is_shift := false; + if uint8(scan_code) = 29 then is_ctrl := true; + if uint8(scan_code) = 157 then is_ctrl := false; + if uint8(scan_code) = 56 then is_alt := true; + if uint8(scan_code) = 184 then is_alt := false; end; function load(ptr : void) : boolean; diff --git a/src/include/asuro.pas b/src/include/asuro.pas index fadbb0fb..de9f0ed4 100644 --- a/src/include/asuro.pas +++ b/src/include/asuro.pas @@ -3,11 +3,11 @@ unit asuro; interface const - VERSION = '1.0.0-651a'; + VERSION = '1.0.0-653a'; VERSION_MAJOR = '1'; VERSION_MINOR = '0'; VERSION_SUB = '0'; - REVISION = '651'; + REVISION = '653'; RELEASE = 'a'; implementation diff --git a/src/include/bios_data_area.pas b/src/include/bios_data_area.pas index 075f3089..93f7fc92 100644 --- a/src/include/bios_data_area.pas +++ b/src/include/bios_data_area.pas @@ -49,9 +49,18 @@ type end; PMCFG = ^TMCFG; + TCounters = record + c16 : uint16; + c32 : uint32; + c64 : uint64; + end; + const BDA : PBDA = PBDA($C0000400); +var + Counters : TCounters; + procedure tick_update(data : void); implementation @@ -61,7 +70,11 @@ uses procedure tick_update(data : void); begin - BDA^.Ticks:= BDA^.Ticks + 1; + //BDA^.Ticks:= BDA^.Ticks + 1; + inc(BDA^.Ticks); + inc(Counters.c16); + inc(Counters.c32); + inc(Counters.c64); end; end. diff --git a/src/include/util.pas b/src/include/util.pas index 954ec494..735ef7b6 100644 --- a/src/include/util.pas +++ b/src/include/util.pas @@ -46,6 +46,10 @@ procedure BSOD(fault : pchar; info : pchar); procedure psleep(t : uint16); procedure sleep(seconds : uint32); +function get16bitcounter : uint16; +function get32bitcounter : uint32; +function get64bitcounter : uint64; + function BCDToUint8(bcd : uint8) : uint8; procedure resetSystem(); @@ -339,6 +343,21 @@ begin halt_and_catch_fire; end; +function get16bitcounter : uint16; +begin + get16bitcounter:= bios_data_area.Counters.c16; +end; + +function get32bitcounter : uint32; +begin + get32bitcounter:= bios_data_area.Counters.c32; +end; + +function get64bitcounter : uint64; +begin + get64bitcounter:= bios_data_area.Counters.c64; +end; + procedure BSOD(fault : pchar; info : pchar); var trace : pchar; diff --git a/src/kernel.pas b/src/kernel.pas index 0b01fcef..ee3f608b 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -40,7 +40,8 @@ uses serial, shell, memview, - splash; + splash, + cpu; procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; @@ -144,6 +145,9 @@ begin { Console Init } console.init(); + { CPUID } + cpu.init(); + { Serial Init } serial.init(); diff --git a/src/prog/memview.pas b/src/prog/memview.pas index 7964c571..cabf0d9a 100644 --- a/src/prog/memview.pas +++ b/src/prog/memview.pas @@ -117,19 +117,29 @@ begin tmHex:printmemoryashex(MEM_LOC, 176, 16, ' ', true); tmChar:printmemoryaschar(MEM_LOC, 176, 16, ' ', true); end; - end; end; procedure OnKeyPressed(info : TKeyInfo); begin - if info.key_code = 16 then begin - dec(MEM_LOC, 16); - NEW_LOC:= true; - end; - if info.key_code = 18 then begin - inc(MEM_LOC, 16); - NEW_LOC:= true; + if info.CTRL_DOWN then begin + if info.key_code = 16 then begin + dec(MEM_LOC, 176); + NEW_LOC:= true; + end; + if info.key_code = 18 then begin + inc(MEM_LOC, 176); + NEW_LOC:= true; + end; + end else begin + if info.key_code = 16 then begin + dec(MEM_LOC, 16); + NEW_LOC:= true; + end; + if info.key_code = 18 then begin + inc(MEM_LOC, 16); + NEW_LOC:= true; + end; end; if info.key_code = uint8('c') then begin Mode:= tmChar;