Compare commits

...
Author SHA1 Message Date
Leency 068181928d apps/open: start the letter search from the top when nothing is selected
Test PR / Build (en_US) (pull_request) Successful in 1m46s
Test PR / Build (ru_RU) (pull_request) Successful in 1m55s
Test PR / Build (es_ES) (pull_request) Successful in 2m1s
last_x/last_y are -1 until the first selection, so the search began 64
bytes below the list, compared junk bytes and could select index -2.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 12:17:48 +03:00
Leency 593bf4e25e apps/open: fix the crash on keys starting a search past the list end (fix #587)
Test PR / Build (en_US) (pull_request) Successful in 1m59s
Test PR / Build (ru_RU) (pull_request) Successful in 2m29s
Test PR / Build (es_ES) (pull_request) Successful in 2m32s
The type-to-search loop stopped only when its pointer was exactly equal to
the end of the list. When the search started past the end, it read beyond
the program's memory and page-faulted.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 03:44:31 +03:00
Leency 15396a0304 drivers: add i2chid HID-over-I2C touchpad driver (#692)
Build system / Build (es_ES) (push) Successful in 3m6s
Build system / Build (en_US) (push) Successful in 3m10s
Build system / Build (ru_RU) (push) Successful in 3m15s
Build system / Publish Images (push) Successful in 3m33s
I2C touchpad driver.
Tested on Олег Александрович and my GF laptop.

Assisted-by: Claude Opus 5
Reviewed-on: #692
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-09-16 10:28:47 +00:00
Leency 0969869ba8 derivers/hdaudio: irq polling (#679)
Build system / Build (en_US) (push) Successful in 3m3s
Build system / Build (es_ES) (push) Successful in 3m7s
Build system / Build (ru_RU) (push) Successful in 3m14s
Build system / Publish Images (push) Successful in 4m45s
Now I have sound on a pretty new UEFI machine (AMD 4500U) without IRQ attached. Also ran regression on 3 BIOS machines. All OK.

drivers/hdaudio: attach IRQ before enabling interrupts, poll when no IRQ line

- attach the interrupt handler before azx_init_chip enables GIE/CIE: an
  unclaimed level IRQ made the kernel (irq_serv .try_other_irqs) call and
  relink foreign handlers onto our line, corrupting the dispatch list
- no interrupt line (INTLINE=0xFF, UEFI without CSM): fall back to RIRB
  polling plus a 10 ms TimerHS driving hda_irq; sound works on AMD Renoir
- acknowledge all STATESTS bits instead of codec №2 only
- serialize RIRB readers (timer/IRQ vs command thread) with aspinlock
- fix azx_int_disable (edx reused after azx_readl), quiesce before attach
- zero the unsolicited-event ring pointers, mask its write index
- move 'data fixups' after code and data so fasm converges

Reviewed-on: #679
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-09-16 04:55:24 +00:00
Doczom dd3af88a30 Kernel: The source value has been changed for bgrlockpid
Check kernel codestyle / Check kernel codestyle (pull_request) Successful in 21s
Test PR / Build (en_US) (pull_request) Successful in 2m13s
Test PR / Build (ru_RU) (pull_request) Successful in 2m16s
Test PR / Build (es_ES) (pull_request) Successful in 2m20s
Build system / Build (en_US) (push) Successful in 3m5s
Build system / Build (ru_RU) (push) Successful in 3m12s
Build system / Build (es_ES) (push) Successful in 3m16s
Build system / Publish Images (push) Successful in 3m46s
for bgrlockpid, the source value was changed from current_slot_idx to APPDATA.tid
2026-09-14 21:56:19 +00:00
Doczom 85ae0c8703 Kernel: The APPDATA.debugger_slot field has been changed to APPDATA.debugger_thread
The APPDATA.debugger_slot field has been changed to APPDATA.debugger_thread. The API for the internal functions of the kernel has been changed. Mathematical expressions have been replaced with constants and the code has been cleaned up.
2026-09-14 21:56:19 +00:00
Doczom 2ad11d3acc Kernel/fpu.inc: added edi case preservation for *_restore functions. Added a description of the functions 2026-09-14 21:56:19 +00:00
Doczom 450054a86c Kernel: the value source has been changed for fpu_owner and timer_list_owner
for fpu_owner and timer_list_owner, the value source has been changed from current_slot_idx to current_slot
2026-09-14 21:56:19 +00:00
IgorA b0055ba472 msgbox: increasing the window width for long text (#690)
Build system / Build (en_US) (push) Successful in 3m4s
Build system / Build (ru_RU) (push) Successful in 3m7s
Build system / Build (es_ES) (push) Successful in 3m15s
Build system / Publish Images (push) Successful in 3m10s
Reviewed-on: #690
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Co-authored-by: IgorA <aie85playm@gmail.com>
2026-09-14 12:33:21 +00:00
IgorA f711f9286b optimize import: (#689)
Build system / Build (es_ES) (push) Successful in 2m58s
Build system / Build (en_US) (push) Successful in 3m12s
Build system / Build (ru_RU) (push) Successful in 3m15s
Build system / Publish Images (push) Successful in 3m43s
color_dialog, fspeed, hdd_info, mgb, skincfg, zsea

Reviewed-on: #689
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Co-authored-by: IgorA <aie85playm@gmail.com>
2026-09-13 20:31:16 +00:00
36 changed files with 4450 additions and 916 deletions

No files matched your search

+1
View File
@@ -598,6 +598,7 @@ tup.append_table(img_files, {
{"DRIVERS/VT823X.SYS", VAR_DRVS .. "/audio/vt823x.sys"},
{"DRIVERS/SIS.SYS", VAR_DRVS .. "/audio/sis.sys"},
{"DRIVERS/SDHCI.SYS", "../drivers/sdhci/sdhci.sys"},
{"DRIVERS/I2CHID.SYS", VAR_DRVS .. "/i2chid/i2chid.sys"},
})
tup.append_table(extra_files, {
{"HD_Load/9x2klbr/", VAR_PROGS .. "/hd_load/9x2klbr/9x2klbr.exe"},
+2 -1
View File
@@ -6,8 +6,9 @@
#/SYS/CROPFLAT "XS800 YS480" 1 # set limits of screen
#/SYS/LOADDRV COMMOUSE 1 # serial mouse driver
#/SYS/DEVELOP/BOARD "" 0 # Load DEBUG board
#/SYS/LOADDRV RDC 0 # videodriver for RDC M2010/M2012
/SYS/SETUP BOOT 0 # Load device settings
/SYS/LOADDRV RDC 0 # videodriver for RDC M2010/M2012
/SYS/LOADDRV I2CHID 0 # Start I2C touchpad driver
/SYS/@TASKBAR "" 0 # Start taskbar
/SYS/ESKIN "" 0 # Set style
/SYS/@ICON "" 0 # Multithread desktop icons
+16
View File
@@ -5,6 +5,22 @@ font smoothing=sbp
font height=9
speaker mute=off
[touchpad]
speed=100
; how far a finger must move before the pointer follows, in pad units;
; larger is steadier under a pressing finger, 0 turns the filter off
jitter=1
; the same, for a finger that landed on the button strip: it is pressing
; rather than steering there, so it needs a stricter margin
jitter_buttons=45
scroll_step=64
scroll_invert=0
tap_enable=1
tap_drag=1
right_click=1
button_zone=15
right_split=50
[mouse]
speed=4
acceleration=3
+102 -17
View File
@@ -273,8 +273,8 @@ RIRB_INT_RESPONSE equ 0x01
RIRB_INT_OVERRUN equ 0x04
RIRB_INT_MASK equ 0x05
; STATESTS int mask: SD2,SD1,SD0
STATESTS_INT_MASK equ 0x07
; STATESTS int mask: SDIWAKE[14:0], a 16-bit register
STATESTS_INT_MASK equ 0x7FFF
AZX_MAX_CODECS equ 4
; SD_CTL bits
@@ -402,6 +402,7 @@ struc AC_CNTRL ;AC controller base class
.response_reset dd 0
.polling_mode db 0
.poll_count db 0
.no_irq db 0 ; no interrupt line: a thread runs hda_irq
.posbuf dd ?
.start_wallclk dd ? ; start + minimum wallclk
.period_wallclk dd ? ; wallclk for period
@@ -505,8 +506,6 @@ macro spin_unlock
pop ebx eax
}
data fixups
end data
include '../../struct.inc'
include '../../macros.inc'
@@ -607,9 +606,6 @@ if IRQ_REMAP
invoke SysMsgBoardStr
end if
mov ebx, [ctrl.int_line]
invoke AttachIntHandler, ebx, hda_irq, dword 0
;Asper This part is from "azx_probe" proc. [
call azx_codec_create
cmp eax, 0
@@ -858,13 +854,13 @@ end if
mov edx, ICH6_REG_SD_STS + SDO_OFS
call azx_readb
mov bl, al
mov cl, al
mov al, SD_INT_MASK
mov edx, ICH6_REG_SD_STS + SDO_OFS
call azx_writeb
test bl, SD_INT_COMPLETE
test cl, SD_INT_COMPLETE
jz @f
mov eax, [ctrl.civ_val]
@@ -901,13 +897,13 @@ end if
;if 0
; clear state status int
mov edx, ICH6_REG_STATESTS
call azx_readb
test al, 0x04
call azx_readw
and eax, STATESTS_INT_MASK
jz @f
mov al, 0x04
; ack all state-change bits, else the level IRQ line stays asserted
mov edx, ICH6_REG_STATESTS
call azx_writeb
call azx_writew
@@:
;end if
or eax, 1
@@ -915,6 +911,24 @@ end if
ret
endp
; Stand-in for the interrupt when no interrupt line is available. A thread,
; not a TimerHS callback: the kernel calls timer callbacks with the global
; timer list lock held, and hda_irq may stall and refill the audio buffer.
; hda_irq runs with interrupts off, as it would in IRQ context: it holds
; aspinlock, which azx_rirb_get_response waits for with interrupts off, so
; a holder that could be preempted would hang the machine.
proc hda_poll_thread
.loop:
pushfd
cli
call hda_irq
popfd
mov eax, 5 ; delay, sleeping instead of spinning
mov ebx, 1 ; 10 ms; a 16 KB period is ~85 ms at 48 kHz
int 0x40
jmp .loop
endp
align 4
proc create_primary_buff
@@ -1203,6 +1217,26 @@ end if
; allocate CORB/RIRB
call azx_alloc_cmd_io
; attach the IRQ handler BEFORE the controller may raise interrupts:
; azx_init_chip enables GIE/CIE and a codec state-change can fire
; right away; an unclaimed level IRQ makes the
; kernel poll foreign handlers and relink their IRQH nodes onto our
; line (see irq_serv .try_other_irqs), corrupting the dispatch list
; a warm reboot can leave GIE and a stale completion bit behind, and
; civ_val is never resynced, so silence the controller before attaching
call azx_int_disable
mov ebx, [ctrl.int_line]
invoke AttachIntHandler, ebx, hda_irq, dword 0
test eax, eax
jnz @f
; No usable interrupt line (INTLINE=0xFF on boards that route INTx only
; through ACPI _PRT or MSI, which the kernel does not parse). The
; controller still latches INTSTS/SD_STS, we only lose the wakeup - so
; poll the RIRB for codec replies and run the interrupt handler from a
; thread. A flag of its own: polling_mode is the timeout recovery state.
mov [ctrl.no_irq], 1
@@:
; initialize chip
call azx_init_pci
@@ -1210,6 +1244,32 @@ end if
call azx_init_chip
;] Asper
; no IRQ line: let a polling thread stand in for the interrupt.
; Started only now - earlier, hda_irq could ack STATESTS in the window
; before reset_controller reads it into codec_mask
cmp [ctrl.no_irq], 0
je @f
push esi edi ; CreateThread clobbers them, START needs esi
mov ebx, 1
mov ecx, hda_poll_thread
xor edx, edx
invoke CreateThread
pop edi esi
test eax, eax
jns .thread_ok
; nothing would ever complete a period and playback would stall,
; so fail the init rather than register a service that hangs
mov esi, msgNoIrqThread
invoke SysMsgBoardStr
xor eax, eax
ret
.thread_ok:
if DEBUG
mov esi, msgNoIrqPoll
invoke SysMsgBoardStr
end if
@@:
xor eax, eax
inc eax
ret
@@ -1243,7 +1303,7 @@ endl
; clear STATESTS
mov eax, STATESTS_INT_MASK
mov edx, ICH6_REG_STATESTS
call azx_writeb
call azx_writew
; reset controller
mov edx, ICH6_REG_GCTL
@@ -1454,6 +1514,12 @@ endp
proc azx_alloc_cmd_io
push eax ecx edx
; the unsolicited-event ring lives in reserved storage, so its
; pointers hold garbage until we clear them here - do it before
; reset_controller enables unsolicited responses in GCTL
mov [unsol_events.rp], 0
mov [unsol_events.wp], 0
; single page (at least 4096 bytes) must suffice for both ringbuffers
invoke KernelAlloc, 4096
mov [ctrl.rb], eax
@@ -1654,14 +1720,24 @@ endl
mov ecx, 1000;+1000
.next_try:
mov al, [ctrl.polling_mode]
test al, al
or al, [ctrl.no_irq]
jnz .poll
mov ah, [do_poll]
test ah, ah
jz @f
.poll:
spin_lock_irq
; take the lock hda_irq holds so two RIRB readers never overlap
push eax ebx
mov eax, aspinlock
.poll_lock:
mov ebx, SPINLOCK_BUSY
lock xchg [eax], ebx
cmp ebx, SPINLOCK_FREE
jnz .poll_lock
pop ebx eax
call azx_update_rirb
mov [aspinlock], SPINLOCK_FREE
spin_unlock_irq
@@:
mov eax, [ctrl.rirb_cmd]
@@ -1942,6 +2018,7 @@ proc azx_int_disable
mov ebx, ICH6_INT_CTRL_EN or ICH6_INT_GLOBAL_EN
xor ebx, -1
and eax, ebx
mov edx, ICH6_REG_INTCTL ; azx_readl turned edx into the absolute address
call azx_writel
pop edx ebx eax
ret
@@ -1957,9 +2034,9 @@ proc azx_int_clear
call azx_writeb
; clear STATESTS
mov al, STATESTS_INT_MASK
mov ax, STATESTS_INT_MASK
mov edx, ICH6_REG_STATESTS
call azx_writeb
call azx_writew
; clear rirb status
mov al, RIRB_INT_MASK
@@ -2696,6 +2773,7 @@ proc snd_hda_queue_unsol_event stdcall, res:dword, res_ex:dword
; only carries EBX across iterations and reloads the rest, and TimerHS
; preserves EBX too - so by using scratch regs only we need no saves.
mov eax, [unsol_events.wp]
and eax, HDA_UNSOL_QUEUE_SIZE - 1 ; never index the ring wild
lea edx, [eax+1]
and edx, HDA_UNSOL_QUEUE_SIZE - 1 ; next write pos (size must be 2^n)
cmp edx, [unsol_events.rp]
@@ -2998,6 +3076,7 @@ sz_sound_srv db 'SOUND',0
msgInit db 'detect hardware...',13,10,0
msgFail db 'device not found',13,10,0
msgNoIrqThread db 'no IRQ line: cannot create polling thread',13,10,0
msgAttchIRQ db 'IRQ line not supported', 13,10,0
msgInvIRQ db 'IRQ line not assigned or invalid', 13,10,0
msgPlay db 'start play', 13,10,0
@@ -3067,6 +3146,7 @@ if DEBUG
msgTCSEL db 'PCI TCSEL ',0
msgTV db 'HDA test version ',TEST_VERSION_NUMBER,13,10,0
msgGCap db 'GCAP = ',0
msgNoIrqPoll db 'no IRQ line: polling thread',13,10,0
end if
if USE_SINGLE_MODE
@@ -3101,6 +3181,11 @@ end if
;] Asper
; relocation table lives after all code and initialized data: placed before the
; code its size feeds back into every relocation site and fasm may never converge
data fixups
end data
aspinlock dd SPINLOCK_FREE
codec CODEC
+3
View File
@@ -0,0 +1,3 @@
if tup.getconfig("NO_FASM") ~= "" then return end
ROOT = "../.."
tup.rule("i2chid.asm", "fasm %f %o " .. tup.getconfig("PESTRIP_CMD") .. tup.getconfig("KPACK_CMD"), "%B.sys")
+438
View File
@@ -0,0 +1,438 @@
; Synopsys DesignWare I2C master, polled (PIO) mode only.
; This is the controller inside Intel LPSS blocks (Skylake and newer, plus
; Atom-derived SoCs); the same IP is used by many other vendors.
;
; The register file is always accessed as dwords. The controller must be
; disabled to change IC_TAR, so every transfer disables it, programs the
; target address, enables it back and feeds the TX FIFO by hand.
; ------------------------------ Registers ------------------------------------
DwIcCon = 0x00
DwIcTar = 0x04
DwIcDataCmd = 0x10
DwIcSsSclHcnt = 0x14
DwIcSsSclLcnt = 0x18
DwIcFsSclHcnt = 0x1C
DwIcFsSclLcnt = 0x20
DwIcIntrStat = 0x2C
DwIcIntrMask = 0x30
DwIcRawIntrStat = 0x34
DwIcRxTl = 0x38
DwIcTxTl = 0x3C
DwIcClrIntr = 0x40
DwIcClrTxAbrt = 0x54
DwIcEnable = 0x6C
DwIcStatus = 0x70
DwIcTxflr = 0x74
DwIcRxflr = 0x78
DwIcSdaHold = 0x7C
DwIcTxAbrtSource = 0x80
DwIcEnableStatus = 0x9C
DwIcCompParam1 = 0xF4
DwIcCompVersion = 0xF8
DwIcCompType = 0xFC
; "DW_apb_i2c" component signature ('DW' + 0x0140).
DW_COMP_TYPE_VALUE = 0x44570140
; IC_CON: master, standard speed (100 kHz), restarts allowed, slave disabled.
DW_CON_MASTER = 1 shl 0
DW_CON_SPEED_STD = 1 shl 1
DW_CON_SPEED_FAST = 2 shl 1
DW_CON_RESTART_EN = 1 shl 5
DW_CON_SLAVE_DIS = 1 shl 6
; IC_DATA_CMD bits above the data byte.
DW_CMD_READ = 1 shl 8
DW_CMD_STOP = 1 shl 9
DW_CMD_RESTART = 1 shl 10
; IC_STATUS bits
DW_STAT_TFNF = 1 shl 1 ; TX FIFO not full
DW_STAT_TFE = 1 shl 2 ; TX FIFO empty
DW_STAT_RFNE = 1 shl 3 ; RX FIFO not empty
DW_STAT_MST_ACT = 1 shl 5 ; master FSM busy
; IC_RAW_INTR_STAT bits
DW_INT_TX_ABRT = 1 shl 6
; SCL timing for standard mode. The LPSS input clock is 100 MHz on the PCH
; parts and 133 MHz on the Atom-derived SoCs (Apollo Lake, Gemini Lake), and
; nothing in PCI config space says which one this is, so the counts are
; picked to satisfy the fast-mode minimums at the fastest of them: at
; 133 MHz that is tHIGH = 0.98 us and tLOW = 1.5 us, 400 kHz. On a 100 MHz
; part the same counts run the bus at 300 kHz, which is just as legal.
; Fast mode rather than standard: HID over I2C requires every device to
; support it, that is what Windows drives them at, and a polled host pays
; for every byte with busy-waiting - at 100 kHz a 64-byte input read costs
; 6 ms, more than a fast pad takes to produce the next report, and the
; backlog that builds up plays back as the cursor coasting after the finger
; has stopped. SDA hold stays well below tLOW.
DW_FS_HCNT = 130
DW_FS_LCNT = 200
DW_SDA_HOLD = 28
; The AMD FCH feeds its DesignWare masters from a 150 MHz reference, so
; the same minimums need more counts there: 145/225 give tHIGH = 0.97 us,
; tLOW = 1.5 us, again 400 kHz; SDA hold 45 = 300 ns.
DW_AMD_FS_HCNT = 145
DW_AMD_FS_LCNT = 225
DW_AMD_SDA_HOLD = 45
; A transfer gives up after [XferTimeout] hundredths of a second. The init
; value must cover a full report descriptor read: descriptors run up to 2 KB
; and the bus may be as slow as 77 kHz, so at 9 SCL cycles per byte a single
; transfer takes ~240 ms of wall-clock time. Polling is generous too now that it runs in its own thread
; rather than in a timer callback - a wedged bus costs this thread its slice
; and nothing else.
DW_TIMEOUT_INIT = 60
DW_TIMEOUT_POLL = 20
; Disables the controller and waits until it reports itself disabled.
; in: ebx = MMIO base. Clobbers eax, ecx.
proc dw_ctrl_disable
mov dword [ebx+DwIcEnable], 0
mov ecx, 100000
@@:
test dword [ebx+DwIcEnableStatus], 1
jz .done
pause
loop @b
.done:
ret
endp
; Aborts a stuck transfer cleanly: the ABORT bit makes the master issue STOP,
; flush the TX FIFO and raise TX_ABRT, which releases a slave that is holding
; the bus (a clock-stretching touchpad, for instance). Simply disabling the
; controller in the middle of a byte would leave SDA held low and every
; following transfer would time out too. Older cores without the ABORT bit
; just ignore the write and fall through after the wait.
; in: ebx = MMIO base. Clobbers eax, ecx.
proc dw_ctrl_abort
mov dword [ebx+DwIcEnable], 3
mov ecx, 100000
@@:
test dword [ebx+DwIcRawIntrStat], DW_INT_TX_ABRT
jnz @f
pause
loop @b
@@:
mov eax, [ebx+DwIcClrTxAbrt]
call dw_ctrl_disable
ret
endp
; One idle step of a transfer wait loop.
; A healthy transfer is over within a few milliseconds, well inside the
; first two timer ticks, and spins through them: a transfer that yields
; its slice is at the scheduler's mercy for the rest of it. Past that the
; bus is stuck or crawling, and the wait gives up the CPU a tick at a time
; instead of burning a core until XferTimeout.
; in: eax = ticks elapsed since the transfer began. Preserves all but eax.
DW_SPIN_TICKS = 2
proc dw_wait_step
cmp eax, DW_SPIN_TICKS
jae .yield
pause
ret
.yield:
push ebx
movi ebx, 1
invoke Delay ; preserves every register
pop ebx
ret
endp
; One-time controller setup after mapping.
; in: ebx = MMIO base.
proc dw_ctrl_init
push eax ecx
call dw_ctrl_disable
mov dword [ebx+DwIcCon], DW_CON_MASTER + DW_CON_SPEED_FAST + \
DW_CON_RESTART_EN + DW_CON_SLAVE_DIS
; The counts come from variables: they depend on the reference clock, which
; is decided by whoever found the controller (PCI LPSS or AMD FCH). The
; standard-mode registers get the same values scaled up so that they are
; sane should anything ever switch the speed bits back.
mov eax, [DwHcnt]
mov [ebx+DwIcFsSclHcnt], eax
lea eax, [eax*4]
mov [ebx+DwIcSsSclHcnt], eax
mov eax, [DwLcnt]
mov [ebx+DwIcFsSclLcnt], eax
lea eax, [eax*4]
mov [ebx+DwIcSsSclLcnt], eax
mov eax, [DwSdaHold]
mov [ebx+DwIcSdaHold], eax
mov dword [ebx+DwIcIntrMask], 0
mov dword [ebx+DwIcRxTl], 0
mov dword [ebx+DwIcTxTl], 0
mov eax, [ebx+DwIcClrIntr]
pop ecx eax
ret
endp
; One combined I2C transaction: optional write phase, then optional read phase
; with a repeated START between them. Fully polled.
; out: eax = 0 on success, IC_TX_ABRT_SOURCE value on NAK/abort, -1 on timeout.
proc dw_xfer stdcall uses ebx esi edi, addr:dword, wbuf:dword, wlen:dword, \
rbuf:dword, rlen:dword
locals
wsent dd ?
rqueued dd ?
rgot dd ?
t0 dd ?
endl
mov ebx, [I2cMmio]
call dw_ctrl_disable
mov eax, [addr]
mov [ebx+DwIcTar], eax
mov eax, [ebx+DwIcClrIntr]
mov dword [ebx+DwIcEnable], 1
xor eax, eax
mov [wsent], eax
mov [rqueued], eax
mov [rgot], eax
invoke GetTimerTicks
mov [t0], eax
.loop:
; Abort (NAK and friends) ends the transfer immediately.
test dword [ebx+DwIcRawIntrStat], DW_INT_TX_ABRT
jnz .abort
; Drain the RX FIFO first so it can never overflow.
test dword [ebx+DwIcStatus], DW_STAT_RFNE
jz .no_rx
mov edx, [rgot]
cmp edx, [rlen]
jae .no_rx
mov eax, [ebx+DwIcDataCmd]
mov edi, [rbuf]
mov [edi+edx], al
inc edx
mov [rgot], edx
jmp .loop
.no_rx:
; Feed the write phase.
mov eax, [wsent]
cmp eax, [wlen]
jae .push_reads
test dword [ebx+DwIcStatus], DW_STAT_TFNF
jz .check_done
mov esi, [wbuf]
movzx edx, byte [esi+eax]
inc eax
cmp eax, [wlen]
jne @f
cmp [rlen], 0
jne @f
or edx, DW_CMD_STOP ; last byte of a write-only transfer
@@:
mov [ebx+DwIcDataCmd], edx
mov [wsent], eax
jmp .loop
.push_reads:
; Feed read commands, at most 8 outstanding so the RX FIFO keeps up.
mov eax, [rqueued]
cmp eax, [rlen]
jae .check_done
mov edx, eax
sub edx, [rgot]
cmp edx, 8
jae .check_done
test dword [ebx+DwIcStatus], DW_STAT_TFNF
jz .check_done
mov edx, DW_CMD_READ
test eax, eax
jnz @f
cmp [wlen], 0
je @f
or edx, DW_CMD_RESTART ; repeated START after the write phase
@@:
mov ecx, [rlen]
dec ecx
cmp eax, ecx
jne @f
or edx, DW_CMD_STOP
@@:
mov [ebx+DwIcDataCmd], edx
inc eax
mov [rqueued], eax
jmp .loop
.check_done:
mov eax, [rgot]
cmp eax, [rlen]
jne .not_done
mov eax, [wsent]
cmp eax, [wlen]
jne .not_done
mov eax, [ebx+DwIcStatus]
test eax, DW_STAT_TFE
jz .not_done
test eax, DW_STAT_MST_ACT
jnz .not_done
call dw_ctrl_disable
xor eax, eax
ret
.not_done:
invoke GetTimerTicks
sub eax, [t0]
cmp eax, [XferTimeout]
jae .timeout
call dw_wait_step
jmp .loop
.abort:
mov esi, [ebx+DwIcTxAbrtSource]
mov eax, [ebx+DwIcClrTxAbrt]
call dw_ctrl_disable
mov eax, esi
test eax, eax
jnz @f
or eax, 0x80000000
@@:
ret
.timeout:
call dw_ctrl_abort
or eax, -1
ret
endp
; Reads one HID input report as a single continuous bus transaction, the way
; interrupt-driven hosts (Windows, Linux) do it: the optional register-address
; write and every read command are queued into the TX FIFO before the bytes
; start flowing, so nothing on the wire depends on how fast the host loop
; runs. The previous adaptive read (fetch 2 length bytes, decide, fetch the
; rest, stop short) was cut down on the wire to 3 bytes for an empty poll -
; and the SIPODEV/Hantick touchpad firmwares are exactly the kind of thing
; that wedges when an input read is shorter than the frame they prepared.
; rlen should not exceed the TX FIFO depth (IC_COMP_PARAM_1 bits 23:16, plus
; one) or the queue loop degrades to feeding the FIFO on the fly, which
; reintroduces pauses.
; in: addr = slave, wlen bytes at wbuf written first (0 = plain read),
; rlen bytes read into buf.
; out: eax = 0 ok, IC_TX_ABRT_SOURCE on NAK/abort, -1 on timeout.
; Timeout check for the dw_read_block wait spots; expands inside the proc so
; [t0] and [XferTimeout] resolve in the caller's own frame.
macro BLOCK_TICK fail_label {
invoke GetTimerTicks
sub eax, [t0]
cmp eax, [XferTimeout]
jae fail_label
call dw_wait_step
}
proc dw_read_block stdcall uses ebx esi edi, addr:dword, wbuf:dword, wlen:dword, buf:dword, rlen:dword
locals
rgot dd ?
t0 dd ?
endl
mov ebx, [I2cMmio]
call dw_ctrl_disable
mov eax, [addr]
mov [ebx+DwIcTar], eax
mov eax, [ebx+DwIcClrIntr]
mov dword [ebx+DwIcEnable], 1
invoke GetTimerTicks
mov [t0], eax
mov [rgot], 0
; Write phase: the register address bytes, no STOP - the read continues the
; same transaction after a repeated START.
xor ecx, ecx
.wr:
cmp ecx, [wlen]
jae .queue_reads
test dword [ebx+DwIcRawIntrStat], DW_INT_TX_ABRT
jnz .abort
test dword [ebx+DwIcStatus], DW_STAT_TFNF
jz .wr_wait
mov esi, [wbuf]
movzx edx, byte [esi+ecx]
mov [ebx+DwIcDataCmd], edx
inc ecx
jmp .wr
.wr_wait:
BLOCK_TICK .timeout
jmp .wr
.queue_reads:
xor ecx, ecx
.rq:
cmp ecx, [rlen]
jae .drain
test dword [ebx+DwIcRawIntrStat], DW_INT_TX_ABRT
jnz .abort
test dword [ebx+DwIcStatus], DW_STAT_TFNF
jz .rq_wait
mov edx, DW_CMD_READ
test ecx, ecx
jnz .not_first
cmp [wlen], 0
je .not_first
or edx, DW_CMD_RESTART
.not_first:
mov eax, [rlen]
dec eax
cmp ecx, eax
jne @f
or edx, DW_CMD_STOP
@@:
mov [ebx+DwIcDataCmd], edx
inc ecx
; Drain opportunistically so a FIFO shallower than rlen cannot deadlock the
; queue loop (the RX side fills while the TX side is full).
test dword [ebx+DwIcStatus], DW_STAT_RFNE
jz .rq
call .take_byte
jmp .rq
.rq_wait:
BLOCK_TICK .timeout
jmp .rq
.drain:
test dword [ebx+DwIcRawIntrStat], DW_INT_TX_ABRT
jnz .abort
test dword [ebx+DwIcStatus], DW_STAT_RFNE
jz .chk
call .take_byte
jmp .drain
; Moves one byte from the RX FIFO into the caller's buffer. Exactly rlen
; reads are queued into freshly flushed FIFOs, so a byte beyond rlen should
; never arrive; if one does anyway it is still taken off the FIFO, so the
; drain loop cannot stall on it, but it is dropped rather than written
; past the end of the buffer.
.take_byte:
mov edx, [rgot]
mov eax, [ebx+DwIcDataCmd]
cmp edx, [rlen]
jae @f
mov edi, [buf]
mov [edi+edx], al
inc edx
mov [rgot], edx
@@:
retn
.chk:
mov eax, [rgot]
cmp eax, [rlen]
jne .wait
test dword [ebx+DwIcStatus], DW_STAT_MST_ACT
jnz .wait
call dw_ctrl_disable
xor eax, eax
ret
.wait:
BLOCK_TICK .timeout
jmp .drain
.abort:
mov esi, [ebx+DwIcTxAbrtSource]
mov eax, [ebx+DwIcClrTxAbrt]
call dw_ctrl_disable
mov eax, esi
test eax, eax
jnz @f
or eax, 0x80000000
@@:
ret
.timeout:
call dw_ctrl_abort
or eax, -1
ret
endp
+646
View File
@@ -0,0 +1,646 @@
; Minimal HID report descriptor parser.
;
; The goal is not a full HID implementation: the parser walks the descriptor
; once and remembers the bit layout of the first input report that contains
; relative X and relative Y (Generic Desktop / X, Y) - i.e. the mouse
; compatibility collection that every I2C mouse and every Windows Precision
; Touchpad exposes. Buttons (Usage Page 9) and a relative wheel found in the
; same report are picked up too. Absolute (digitizer) reports are advanced
; over but otherwise ignored.
;
; Report IDs are honoured: bit positions are counted separately per report ID
; and the chosen ID is checked in every incoming packet.
;
; Alongside the mouse report, the parser also maps the touchpad (Windows
; Precision Touchpad) report: the report that carries Tip Switch usages.
; Each Tip Switch opens a new finger block; the absolute X and Y that follow
; it belong to that finger; Contact Count and the Button-page fields of the
; same report are recorded too. Once the pad is switched into touchpad mode
; those offsets are what the frame decoder reads - every vendor lays the
; frame out differently, and only the descriptor knows how.
HID_MAX_FINGERS = 5
HID_MAX_USAGES = 16
HID_MAX_REPIDS = 16
; Returns the pointer to the input bit counter of the current report ID,
; allocating a new slot on first use.
; out: ebx -> dword bit counter. Clobbers eax, ecx.
proc hid_get_bits_slot
mov eax, [p_report_id]
xor ecx, ecx
.scan:
cmp ecx, [p_idcnt]
jae .add
cmp eax, [p_ids+ecx*4]
jz .found
inc ecx
jmp .scan
.add:
cmp ecx, HID_MAX_REPIDS
jb @f
dec ecx ; table full: reuse the last slot
jmp .found
@@:
mov [p_ids+ecx*4], eax
mov dword [p_bits+ecx*4], 0
mov dword [p_fbits+ecx*4], 0
inc [p_idcnt]
.found:
lea ebx, [p_bits+ecx*4]
ret
endp
; Handles one Input main item. v_flags = item data (bit 2 = relative).
proc hid_process_input
push eax ebx ecx edx
call hid_get_bits_slot
mov eax, [ebx]
mov [v_base], eax
; Advance the counter over this field right away.
mov eax, [p_report_size]
imul eax, [p_report_count]
add [ebx], eax
; Remember the largest logical maximum ever attached to Generic Desktop X
; and Y. The mouse collection declares a tiny relative range there while
; the touchpad collection declares the real surface extents, so the
; maximum over the whole descriptor is the size of the pad - which is what
; the button zones are measured against, and it differs per model.
cmp [p_usage_cnt], 0
je .no_extent
xor ecx, ecx
.ext_loop:
cmp ecx, [p_usage_cnt]
jae .no_extent
mov eax, [p_usages+ecx*4]
cmp eax, 0x00010030
jne .ext_y
mov eax, [p_log_max]
cmp eax, [t_padmaxx]
jbe .ext_next
mov [t_padmaxx], eax
jmp .ext_next
.ext_y:
cmp eax, 0x00010031
jne .ext_next
mov eax, [p_log_max]
cmp eax, [t_padmaxy]
jbe .ext_next
mov [t_padmaxy], eax
.ext_next:
inc ecx
jmp .ext_loop
.no_extent:
; Button-style field: Usage Minimum/Maximum on the Button page.
cmp [p_usage_min], -1
je .not_buttons
cmp [p_usage_max], -1
je .not_buttons
cmp [p_usage_page], 9
jne .not_buttons
cmp [p_report_size], 1 ; buttons are always 1-bit fields
jne .done
mov eax, [v_base]
mov ecx, [p_report_count]
call hid_note_buttons
jmp .done
.not_buttons:
cmp [p_usage_cnt], 0
je .done
call hid_note_touchpad
; Usage-list field: look for GD/X, GD/Y, GD/Wheel among the usages.
test [v_flags], 4 ; only relative fields are interesting
jz .done
xor ecx, ecx
.usage_loop:
cmp ecx, [p_report_count]
jae .done
; usage index = min(field index, usage count - 1): a short usage list
; applies its last usage to the remaining fields.
mov edx, [p_usage_cnt]
dec edx
mov eax, ecx
cmp eax, edx
jbe @f
mov eax, edx
@@:
mov eax, [p_usages+eax*4]
cmp eax, 0x00010030
je .is_x
cmp eax, 0x00010031
je .is_y
cmp eax, 0x00010038
je .is_wheel
.next_usage:
inc ecx
jmp .usage_loop
.is_x:
test [t_have], 1
jnz .next_usage
call hid_claim_report_id
jc .next_usage
call hid_field_offset
mov [t_xoff], eax
mov eax, [p_report_size]
mov [t_xsize], eax
or [t_have], 1
jmp .next_usage
.is_y:
test [t_have], 2
jnz .next_usage
call hid_claim_report_id
jc .next_usage
call hid_field_offset
mov [t_yoff], eax
mov eax, [p_report_size]
mov [t_ysize], eax
or [t_have], 2
jmp .next_usage
.is_wheel:
test [t_have], 8
jnz .next_usage
mov eax, [t_id]
cmp eax, -1 ; wheel never claims a report on its own
je .next_usage
cmp eax, [p_report_id]
jne .next_usage
call hid_field_offset
mov [t_woff], eax
mov eax, [p_report_size]
mov [t_wsize], eax
or [t_have], 8
jmp .next_usage
.done:
pop edx ecx ebx eax
ret
endp
; Records a run of 1-bit Button-page fields starting at bit eax, ecx of them.
; The mouse decoder wants the buttons of ITS report: an item from some other
; report is kept only until a better one turns up, and .eof drops it if it
; still does not match. The touchpad report keeps its own copy.
proc hid_note_buttons
push eax ecx edx
cmp ecx, 8
jbe @f
mov ecx, 8
@@:
mov edx, [p_report_id]
cmp edx, [t_ptp_id]
jne .mouse
cmp [t_pbtn_cnt], 0
jne .mouse
mov [t_pbtn_off], eax
mov [t_pbtn_cnt], ecx
.mouse:
cmp [t_btncnt], 0
je .take
mov edx, [t_btnid]
cmp edx, [t_id] ; already the chosen report's: keep
je .done
mov edx, [p_report_id]
cmp edx, [t_btnid] ; a second run in the same report: keep the first
je .done
.take:
mov [t_btnoff], eax
mov [t_btncnt], ecx
mov eax, [p_report_id]
mov [t_btnid], eax
.done:
pop edx ecx eax
ret
endp
; Walks the usages of the current input item looking for the touchpad
; fields. Field k takes usage min(k, count-1), as in the mouse search.
proc hid_note_touchpad
push eax ebx ecx edx
xor ecx, ecx
.field:
cmp ecx, [p_report_count]
jae .done
mov edx, [p_usage_cnt]
dec edx
mov eax, ecx
cmp eax, edx
jbe @f
mov eax, edx
@@:
mov ebx, [p_usages+eax*4] ; ebx = usage of field ecx
call hid_field_offset ; eax = its bit offset
cmp ebx, 0x000D0042 ; Tip Switch: a new finger
je .tip
cmp ebx, 0x000D0054 ; Contact Count
je .count
cmp ebx, 0x000D0051 ; Contact Identifier
je .cid
cmp ebx, 0x00010030
je .x
cmp ebx, 0x00010031
je .y
shr ebx, 16
cmp ebx, 9 ; buttons written as a usage list
jne .next
push ecx
neg ecx
add ecx, [p_report_count] ; the fields from here to the end
call hid_note_buttons
pop ecx
jmp .done ; one run per item is enough
.tip:
cmp [t_ptp_id], -1
jne @f
mov edx, [p_report_id]
mov [t_ptp_id], edx ; the first report with fingers is the one
@@:
call hid_in_ptp
jne .next
mov edx, [t_fcount]
cmp edx, HID_MAX_FINGERS
jae .next
mov [t_ftip+edx*4], eax
mov dword [t_fxs+edx*4], 0
mov dword [t_fys+edx*4], 0
mov dword [t_fcids+edx*4], 0
inc [t_fcount]
jmp .next
.cid:
call hid_in_ptp
jne .next
mov edx, [t_fcount]
test edx, edx
jz .next
dec edx
cmp dword [t_fcids+edx*4], 0
jne .next
mov [t_fcid+edx*4], eax
mov eax, [p_report_size]
mov [t_fcids+edx*4], eax
jmp .next
.count:
call hid_in_ptp
jne .next
mov [t_ccnt_off], eax
mov eax, [p_report_size]
mov [t_ccnt_size], eax
jmp .next
.x:
test [v_flags], 4 ; absolute only; relative is the mouse
jnz .next
call hid_in_ptp
jne .next
mov edx, [t_fcount]
test edx, edx
jz .next
dec edx
cmp dword [t_fxs+edx*4], 0
jne .next
mov [t_fx+edx*4], eax
mov eax, [p_report_size]
mov [t_fxs+edx*4], eax
jmp .next
.y:
test [v_flags], 4
jnz .next
call hid_in_ptp
jne .next
mov edx, [t_fcount]
test edx, edx
jz .next
dec edx
cmp dword [t_fys+edx*4], 0
jne .next
mov [t_fy+edx*4], eax
mov eax, [p_report_size]
mov [t_fys+edx*4], eax
.next:
inc ecx
jmp .field
.done:
pop edx ecx ebx eax
ret
endp
; ZF set when the current item belongs to the touchpad report.
proc hid_in_ptp
push eax
mov eax, [p_report_id]
cmp eax, [t_ptp_id]
pop eax
ret
endp
; Size in bytes of the feature report with id eax; 0 when the descriptor
; never mentioned one.
proc hid_feature_bytes
push ecx
xor ecx, ecx
@@:
cmp ecx, [p_idcnt]
jae .none
cmp eax, [p_ids+ecx*4]
je .found
inc ecx
jmp @b
.found:
mov eax, [p_fbits+ecx*4]
add eax, 7
shr eax, 3
pop ecx
ret
.none:
xor eax, eax
pop ecx
ret
endp
; Locks the candidate report ID to the current one, or fails (CF=1) when a
; different report already holds X/Y.
proc hid_claim_report_id
mov eax, [t_id]
cmp eax, -1
jne @f
mov eax, [p_report_id]
mov [t_id], eax
clc
ret
@@:
cmp eax, [p_report_id]
jne .taken
clc
ret
.taken:
stc
ret
endp
; Bit offset of field #ecx of the current item.
; in: ecx = field index. out: eax = v_base + ecx * report_size.
proc hid_field_offset
mov eax, [p_report_size]
imul eax, ecx
add eax, [v_base]
ret
endp
; Parses the report descriptor.
; in: esi -> descriptor, ecx = length.
; out: eax = 1 and f_* variables filled if a usable report was found.
proc hid_parse_report_desc uses ebx esi edi
lea edi, [esi+ecx]
xor eax, eax
mov [p_usage_page], eax
mov [p_report_size], eax
mov [p_report_count], eax
mov [p_report_id], eax
mov [p_uses_repid], eax
mov [p_usage_cnt], eax
mov [p_idcnt], eax
mov [p_log_max], eax
mov [t_padmaxx], eax
mov [t_padmaxy], eax
mov [t_have], eax
mov [t_btncnt], eax
mov [t_wsize], eax
mov [p_usage_min], -1
mov [p_usage_max], -1
mov [t_id], -1
mov [t_btnid], -2
mov [t_ptp_id], -1
mov [t_fcount], eax
mov [t_ccnt_size], eax
mov [t_pbtn_cnt], eax
mov [t_ptp_bytes], eax
.loop:
cmp esi, edi
jae .eof
movzx eax, byte [esi]
inc esi
cmp al, 0xFE
je .long_item
mov ecx, eax
and ecx, 3
cmp ecx, 3
jne @f
inc ecx ; size code 3 means 4 bytes
@@:
lea ebx, [esi+ecx]
cmp ebx, edi
ja .eof
xor edx, edx
jecxz .no_data
cmp ecx, 1
jne @f
movzx edx, byte [esi]
jmp .have_data
@@:
cmp ecx, 2
jne @f
movzx edx, word [esi]
jmp .have_data
@@:
mov edx, [esi]
.have_data:
add esi, ecx
.no_data:
and eax, 0xFC
; Global items
cmp al, 0x04
je .g_usage_page
cmp al, 0x84
je .g_report_id
cmp al, 0x74
je .g_report_size
cmp al, 0x94
je .g_report_count
cmp al, 0x24
je .g_log_max
; Local items
cmp al, 0x08
je .l_usage
cmp al, 0x18
je .l_usage_min
cmp al, 0x28
je .l_usage_max
; Main items
cmp al, 0x80
je .m_input
cmp al, 0x90
je .m_clear_locals
cmp al, 0xB0
je .m_feature
cmp al, 0xA0
je .m_clear_locals
cmp al, 0xC0
je .m_clear_locals
jmp .loop
.g_usage_page:
and edx, 0xFFFF
mov [p_usage_page], edx
jmp .loop
.g_report_id:
mov [p_report_id], edx
mov [p_uses_repid], 1
jmp .loop
.g_report_size:
mov [p_report_size], edx
jmp .loop
.g_report_count:
mov [p_report_count], edx
jmp .loop
.g_log_max:
mov [p_log_max], edx
jmp .loop
.l_usage:
mov ebx, [p_usage_cnt]
cmp ebx, HID_MAX_USAGES
jae .loop
cmp ecx, 4 ; 4-byte usage carries its own page
je @f
mov eax, [p_usage_page]
shl eax, 16
or edx, eax
@@:
mov [p_usages+ebx*4], edx
inc [p_usage_cnt]
jmp .loop
.l_usage_min:
mov [p_usage_min], edx
jmp .loop
.l_usage_max:
mov [p_usage_max], edx
jmp .loop
.m_input:
mov [v_flags], edx
call hid_process_input
jmp .m_clear_locals ; input bits are not feature bits
.m_feature:
; Feature reports are only ever written, never decoded, but writing one
; needs its exact size: a SET_REPORT shorter than the report is ignored by
; some firmwares (the Elan Input Mode report has two bytes, mode and the
; selective-reporting switches - one byte does nothing there).
call hid_get_bits_slot
mov eax, [p_report_size]
imul eax, [p_report_count]
add [p_fbits+ecx*4], eax
.m_clear_locals:
xor eax, eax
mov [p_usage_cnt], eax
mov [p_usage_min], -1
mov [p_usage_max], -1
jmp .loop
.long_item:
cmp esi, edi
jae .eof
movzx ecx, byte [esi]
lea esi, [esi+ecx+2]
jmp .loop
.eof:
; Size of the touchpad report, when there is one.
mov eax, [t_ptp_id]
cmp eax, -1
je .no_ptp
xor ecx, ecx
@@:
cmp ecx, [p_idcnt]
jae .no_ptp
cmp eax, [p_ids+ecx*4]
je @f
inc ecx
jmp @b
@@:
mov eax, [p_bits+ecx*4]
add eax, 7
shr eax, 3
mov [t_ptp_bytes], eax
.no_ptp:
; Success needs relative X and Y in the same report - or, failing that, a
; touchpad report with at least one complete finger, which is then the only
; thing the device will be driven through.
mov eax, [t_have]
and eax, 3
cmp eax, 3
je .have_mouse
cmp [t_fcount], 0
je .fail
cmp dword [t_fxs], 0
je .fail
cmp dword [t_fys], 0
je .fail
mov [f_repid], -1 ; no mouse report to match
mov [f_bytes], 0
mov [t_btncnt], 0
movi eax, 1
ret
.have_mouse:
; Keep buttons/wheel only when they live in the chosen report.
mov eax, [t_btnid]
cmp eax, [t_id]
je @f
mov [t_btncnt], 0
@@:
; Final layout.
mov eax, [t_id]
mov [f_repid], eax
xor ecx, ecx
@@:
cmp ecx, [p_idcnt]
jae .no_bits
cmp eax, [p_ids+ecx*4]
je .got_bits
inc ecx
jmp @b
.got_bits:
mov eax, [p_bits+ecx*4]
add eax, 7
shr eax, 3
mov [f_bytes], eax
movi eax, 1
ret
.no_bits:
.fail:
xor eax, eax
ret
endp
; Extracts an unsigned field from an input report.
; in: esi -> report data, eax = bit offset, ecx = bit count (1..24).
; out: eax = value.
proc hid_extract_u
push ebx ecx edx
mov edx, eax
shr edx, 3
mov ebx, [esi+edx] ; buffer has spare bytes at the end
and eax, 7
push ecx
mov ecx, eax
shr ebx, cl
pop ecx
neg ecx
add ecx, 32
shl ebx, cl
shr ebx, cl
mov eax, ebx
pop edx ecx ebx
ret
endp
; Same, sign-extended.
proc hid_extract_s
push ebx ecx edx
mov edx, eax
shr edx, 3
mov ebx, [esi+edx]
and eax, 7
push ecx
mov ecx, eax
shr ebx, cl
pop ecx
neg ecx
add ecx, 32
shl ebx, cl
sar ebx, cl
mov eax, ebx
pop edx ecx ebx
ret
endp
File diff suppressed because it is too large. Load diff
+26
View File
@@ -0,0 +1,26 @@
[touchpad]
; pointer speed in percent of the driver's default (on top of the [mouse]
; speed above; pads differ in resolution)
speed=100
; how far a finger must move before the pointer follows, in pad units;
; larger is steadier under a pressing finger, 0 turns the filter off
jitter=1
; the same, for a finger that landed on the button strip: it is pressing
; rather than steering there, so it needs a stricter margin
jitter_buttons=45
; pad units of two-finger travel per wheel step, and the direction
scroll_step=64
scroll_invert=0
; turn a short, still touch into a click: one finger left, two right,
; three middle
tap_enable=1
; tap, then touch again at once and move: the button stays down for that
; second touch - this is how text is selected and how one draws
tap_drag=1
; right click: 0 never, 1 bottom-right corner, 2 by finger count (two
; fingers right, three middle), 3 either
right_click=1
; button strip along the bottom edge, in percent of the surface: its
; height, and where its left half ends
button_zone=15
right_split=50
+72
View File
@@ -0,0 +1,72 @@
; Asks the I2C touchpad driver to read its settings again.
;
; The driver takes everything it can be tuned with from the [touchpad] section
; of /sys/settings/system.ini, and it reads that file once while loading. This
; tells it to read the file again, so editing a setting takes effect straight
; away instead of at the next boot.
;
; There is no window: the outcome goes to the debug board, the way the driver
; reports everything else.
format binary as ""
use32
db 'MENUET01'
dd 1, start, i_end, mem, mem, 0, 0
include '../../programs/macros.inc'
SRV_RELOAD_CONF = 1
start:
; 1. Find the driver's service by name.
mcall 68, 16, srv_name
test eax, eax
jz .no_driver
mov [ioctl.handle], eax
; 2. Ask it to reload. No data travels either way: the driver reads the file
; itself, so the settings file stays the only place they are written down.
mcall 68, 17, ioctl
test eax, eax
jnz .refused
mov esi, msg_ok
jmp .say
.no_driver:
mov esi, msg_no_driver
jmp .say
.refused:
mov esi, msg_refused
.say:
call board_str
or eax, -1
mcall
; Writes a zero-terminated string to the debug board.
; in: esi -> string
board_str:
lodsb
test al, al
jz .done
mov cl, al
mcall 63, 1
jmp board_str
.done:
ret
srv_name db 'I2CHID', 0
align 4
ioctl:
.handle dd 0
.io_code dd SRV_RELOAD_CONF
.input dd 0
.inp_size dd 0
.output dd 0
.out_size dd 0
msg_ok db 'tpreload: touchpad settings reloaded', 13, 10, 0
msg_no_driver db 'tpreload: the I2C touchpad driver is not loaded', 13, 10, 0
msg_refused db 'tpreload: the driver refused the request', 13, 10, 0
i_end:
rb 1024
mem:
+1
View File
@@ -139,6 +139,7 @@ import core,\
RegKeyboard,\
DelKeyboard,\
Sleep,\
Delay,\
GetTimerTicks,\
\
strncat,\
+6 -1
View File
@@ -183,6 +183,8 @@ EFLAGS_ID = 0x200000 ; id flag
IRQ_PIC = 0
IRQ_APIC = 1
IO_MAP_SIZE = 65536/8 ; 8192 or 2 PAGE_SIZE
struct TSS
_back rw 2
_esp0 rd 1
@@ -290,6 +292,9 @@ sys_proc = OS_BASE + 0x008E000
SLOT_BASE = OS_BASE + 0x0090000
APPDATA_IDLE_THREAD = SLOT_BASE + sizeof.APPDATA*1 ; poiner to IDLE thread
APPDATA_OS_THREAD = SLOT_BASE + sizeof.APPDATA*2 ; poiner to OS thread
VGABasePtr = OS_BASE + 0x00A0000
virtual at OS_BASE + 0x05FFF80
@@ -570,7 +575,7 @@ struct APPDATA
ipc_start dd ? ;+160
ipc_size dd ? ;+164
occurred_events dd ? ;+168 ; mask which accumulates occurred events
debugger_slot dd ? ;+172 ; index in SLOT_BASE array
debugger_thread dd ? ;+172 ; pointer to APPDATA or 0
terminate_protection dd ? ;+176
keyboard_mode db ? ;+180
rb 3
+41 -77
View File
@@ -8,8 +8,8 @@
; diamond, 2006
sys_debug_services:
cmp ebx, 9
ja @f
cmp ebx, sys_debug_services_table.count
jae @f
jmp dword [sys_debug_services_table + ebx*4]
@@:
ret
@@ -26,7 +26,9 @@ sys_debug_services_table:
dd debug_write_process_memory
dd debug_terminate
dd debug_set_drx
.count = ($ - sys_debug_services_table)/4
endg
debug_set_event_data:
; in: ecx = pointer
; destroys eax
@@ -34,22 +36,20 @@ debug_set_event_data:
mov [eax + APPDATA.dbg_event_mem], ecx
ret
get_debuggee_slot:
get_debuggee_thread:
; in: ecx=PID
; out: CF=1 if error
; CF=0 and eax=slot*0x20 if ok
; CF=0 and eax = pointer to APPDATA if ok
; out: interrupts disabled
cli
mov eax, ecx
call pid_to_slot
;call pid_to_appdata
call pid_to_thread
test eax, eax
jz .ret_bad
shl eax, BSF sizeof.APPDATA
push ebx
mov ebx, [current_slot_idx]
cmp [SLOT_BASE + eax + APPDATA.debugger_slot], ebx
;cmp [eax + APPDATA.debugger_slot], ebx
mov ebx, [current_slot]
cmp [eax + APPDATA.debugger_thread], ebx
pop ebx
jnz .ret_bad
; clc ; automatically
@@ -61,10 +61,9 @@ get_debuggee_slot:
debug_detach:
; in: ecx=pid
; destroys eax,ebx
call get_debuggee_slot
call get_debuggee_thread
jc .ret
and dword [eax + SLOT_BASE + APPDATA.debugger_slot], 0
;and dword [eax + APPDATA.debugger_slot], 0
and dword [eax + APPDATA.debugger_thread], 0
call do_resume
.ret:
sti
@@ -72,40 +71,27 @@ debug_detach:
debug_terminate:
; in: ecx=pid
call get_debuggee_slot
call get_debuggee_thread
jc debug_detach.ret
mov ecx, eax
shr ecx, BSF sizeof.APPDATA
;movzx ecx, ch ; del when sysfn_term... will using APPDATA
; push 2
; pop ebx
mov edx, esi ; what?
movzx ecx, ch ; del when sysfn_term... will using APPDATA
jmp sysfn_terminate
debug_suspend:
; in: ecx=pid
; destroys eax,ecx
; { Patch by Coldy (rev. 7125), reason: http://board.kolibrios.org/viewtopic.php?f=1&t=1712&p=75957#p75957
; cli
; mov eax, ecx
; call pid_to_slot
; shl eax, 5
; jz .ret
call get_debuggee_slot
call get_debuggee_thread
jc .ret
; } End patch
mov cl, [SLOT_BASE + eax + APPDATA.state] ; process state
;mov cl, [eax + APPDATA.state] ; process state
mov cl, [eax + APPDATA.state] ; process state
test cl, cl
jz .1
cmp cl, TSTATE_WAITING
jnz .ret
mov cl, TSTATE_WAIT_SUSPENDED
.2:
mov [SLOT_BASE + eax + APPDATA.state], cl
;mov [eax + APPDATA.state], cl
mov [eax + APPDATA.state], cl
.ret:
sti
ret
@@ -114,16 +100,14 @@ debug_suspend:
jmp .2
do_resume:
mov cl, [SLOT_BASE + eax + APPDATA.state]
;mov cl, [eax + APPDATA.state]
mov cl, [eax + APPDATA.state]
cmp cl, TSTATE_RUN_SUSPENDED
jz .1
cmp cl, TSTATE_WAIT_SUSPENDED
jnz .ret
mov cl, TSTATE_WAITING
.2:
mov [SLOT_BASE + eax + APPDATA.state], cl
;mov [eax + APPDATA.state], cl
mov [eax + APPDATA.state], cl
.ret:
ret
.1:
@@ -133,11 +117,9 @@ do_resume:
debug_resume:
; in: ecx=pid
; destroys eax,ebx
cli
mov eax, ecx
call pid_to_slot
shl eax, BSF sizeof.APPDATA
jz .ret
call get_debuggee_thread
jc .ret
call do_resume
.ret:
sti
@@ -160,21 +142,15 @@ debug_getcontext:
inc ebx ; 1 - get sse context
; TODO legacy 32-bit FPU/MMX context
.std_ctx:
call get_debuggee_slot
call get_debuggee_thread
jc .ret
shr eax, BSF sizeof.APPDATA
;movzx ebp, ah
cmp eax, [fpu_owner]
;cmp ebp, [fpu_owner]
jne @f
inc bh ; set swap context flag
@@:
shl eax, BSF sizeof.APPDATA
mov edi, esi
mov eax, [SLOT_BASE + eax + APPDATA.pl0_stack]
;mov eax, [eax + APPDATA.pl0_stack]
mov eax, [eax + APPDATA.pl0_stack]
lea esi, [eax + RING0_STACK_SIZE]
.ring0:
@@ -240,11 +216,10 @@ debug_setcontext:
cmp edx, 28h
jnz .ret
call get_debuggee_slot
call get_debuggee_thread
jc .stiret
; mov esi, edx
mov eax, [eax + SLOT_BASE+APPDATA.pl0_stack]
;mov eax, [eax + APPDATA.pl0_stack]
mov eax, [eax + APPDATA.pl0_stack]
lea edi, [eax + RING0_STACK_SIZE]
.ring0:
@@ -277,15 +252,16 @@ debug_setcontext:
ret
debug_set_drx:
call get_debuggee_slot
call get_debuggee_thread
jc .errret
mov ebp, eax
lea eax, [eax + SLOT_BASE + APPDATA.dbg_regs]
;lea eax, [eax + APPDATA.dbg_regs]
lea eax, [eax + APPDATA.dbg_regs]
; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3
; [eax+10]=dr7
cmp esi, OS_BASE
jae .errret
cmp dl, 3
ja .errret
mov ecx, dr7
@@ -306,10 +282,7 @@ debug_set_drx:
btr dword [eax + 10h], edx ; clear L<i> bit
test byte [eax + 10h], 55h
jnz .okret
; imul eax, ebp, tss_step/32
; and byte [eax + tss_data + TSS._trap], not 1
and [SLOT_BASE + ebp + APPDATA.dbg_state], not 1
;and [ebp + APPDATA.dbg_state], not 1
and [ebp + APPDATA.dbg_state], not 1
.okret:
and dword [esp + SYSCALL_STACK.eax], 0
sti
@@ -354,10 +327,7 @@ debug_set_drx:
not ebx
and [eax + 10h+2], bx
or [eax + 10h+2], dx ; set R/W and LEN fields
; imul eax, ebp, tss_step/32
; or byte [eax + tss_data + TSS._trap], 1
or [SLOT_BASE + ebp + APPDATA.dbg_state], 1
;or [ebp + APPDATA.dbg_state], 1
or [ebp + APPDATA.dbg_state], 1
jmp .okret
debug_read_process_memory:
@@ -368,10 +338,9 @@ debug_read_process_memory:
; esi=address in debuggee
; out: [esp+36]=sizeof(read)
; destroys all
call get_debuggee_slot
call get_debuggee_thread
jc .err
shr eax, BSF sizeof.APPDATA
;movzx eax,ah
mov ecx, edi
call read_process_memory
sti
@@ -389,10 +358,9 @@ debug_write_process_memory:
; esi=address in debuggee
; out: [esp+36]=sizeof(write)
; destroys all
call get_debuggee_slot
call get_debuggee_thread
jc debug_read_process_memory.err
shr eax, BSF sizeof.APPDATA
;movzx eax,ah
mov ecx, edi
call write_process_memory
sti
@@ -400,7 +368,7 @@ debug_write_process_memory:
ret
debugger_notify:
; in: eax=debugger slot
; in: eax=debugger thread
; ecx=size of debug message
; [esp+4]..[esp+4+ecx]=message
; interrupts must be disabled!
@@ -410,9 +378,7 @@ debugger_notify:
mov edi, [timer_ticks]
add edi, 500 ; 5 sec timeout
.1:
mov eax, ebp
shl eax, BSF sizeof.APPDATA
mov esi, [SLOT_BASE + eax + APPDATA.dbg_event_mem]
mov esi, [ebp + APPDATA.dbg_event_mem]
test esi, esi
jz .ret
; read buffer header
@@ -466,8 +432,6 @@ debugger_notify:
pop edx
call write_process_memory
; new debug event
mov eax, ebp
shl eax, BSF sizeof.APPDATA
or [SLOT_BASE + eax + APPDATA.occurred_events], EVENT_DEBUG
or [ebp + APPDATA.occurred_events], EVENT_DEBUG
.ret:
ret
+49 -37
View File
@@ -150,10 +150,10 @@ init_avx512:
ret
; param
; eax= 512 bytes memory area aligned on a 16-byte boundary
align 4
; @brief Export function - Save FPU context in buffer
; @param eax - 512 bytes memory area aligned on a 16-byte boundary
; @return not return
fpu_save:
push ecx
push esi
@@ -166,7 +166,7 @@ fpu_save:
mov edi, eax
mov ecx, [fpu_owner]
mov esi, [current_slot_idx]
mov esi, [current_slot]
cmp ecx, esi
jne .save
@@ -175,14 +175,11 @@ fpu_save:
.save:
mov [fpu_owner], esi
shl ecx, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + ecx + APPDATA.fpu_state]
mov eax, [ecx + APPDATA.fpu_state]
call save_context
; first 512 bytes of XSAVE area have the same format as FXSAVE
shl esi, BSF sizeof.APPDATA
mov esi, [SLOT_BASE + esi + APPDATA.fpu_state]
mov esi, [esi + APPDATA.fpu_state]
mov ecx, 512/4
cld
rep movsd
@@ -194,14 +191,16 @@ fpu_save:
pop ecx
ret
; @brief Export function - Get size from AVX context
; @return size of buffer
avx_save_size:
mov eax, [xsave_area_size]
ret
; param
; eax= avx_save_size() bytes memory area aligned on a 64-byte boundary
align 4
; @brief Export function - Save AVX context in buffer
; @param eax - avx_save_size() bytes memory area aligned on a 64-byte boundary
; @return not return
avx_save:
push ecx
push esi
@@ -214,7 +213,7 @@ avx_save:
mov edi, eax
mov ecx, [fpu_owner]
mov esi, [current_slot_idx]
mov esi, [current_slot]
cmp ecx, esi
jne .save
@@ -223,13 +222,10 @@ avx_save:
.save:
mov [fpu_owner], esi
shl ecx, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + ecx + APPDATA.fpu_state]
mov eax, [ecx + APPDATA.fpu_state]
call save_context
shl esi, BSF sizeof.APPDATA
mov esi, [SLOT_BASE + esi + APPDATA.fpu_state]
mov esi, [esi + APPDATA.fpu_state]
mov ecx, [xsave_area_size]
add ecx, 3
shr ecx, 2
@@ -264,9 +260,13 @@ save_fpu_context:
align 4
; @brief Export function - Restore FPU context
; @param eax - 512 bytes memory area aligned on a 16-byte boundary
; @return not return
fpu_restore:
push ecx
push esi
push edi
mov esi, eax
@@ -274,7 +274,7 @@ fpu_restore:
cli
mov ecx, [fpu_owner]
mov eax, [current_slot_idx]
mov eax, [current_slot]
cmp ecx, eax
jne .copy
@@ -284,6 +284,8 @@ fpu_restore:
fxrstor [esi]
popfd
pop edi
pop esi
pop ecx
ret
@@ -291,24 +293,31 @@ fpu_restore:
fnclex ;fix possible problems
frstor [esi]
popfd
pop edi
pop esi
pop ecx
ret
.copy:
shl eax, BSF sizeof.APPDATA
mov edi, [SLOT_BASE + eax + APPDATA.fpu_state]
mov edi, [eax + APPDATA.fpu_state]
mov ecx, 512/4
cld
rep movsd
popfd
pop edi
pop esi
pop ecx
ret
align 4
; @brief Export function - Restore AVX context
; @param eax - avx_save_size() bytes memory area aligned on a 64-byte boundary
; @return not return
avx_restore:
push ecx
push esi
push edi
mov esi, eax
@@ -316,7 +325,7 @@ avx_restore:
cli
mov ecx, [fpu_owner]
mov eax, [current_slot_idx]
mov eax, [current_slot]
cmp ecx, eax
jne .copy
@@ -329,6 +338,8 @@ avx_restore:
xrstor [esi]
pop edx
popfd
pop edi
pop esi
pop ecx
ret
@@ -338,6 +349,8 @@ avx_restore:
fxrstor [esi]
popfd
pop edi
pop esi
pop ecx
ret
@@ -345,18 +358,21 @@ avx_restore:
fnclex ;fix possible problems
frstor [esi]
popfd
pop edi
pop esi
pop ecx
ret
.copy:
shl eax, BSF sizeof.APPDATA
mov edi, [SLOT_BASE + eax + APPDATA.fpu_state]
mov edi, [eax + APPDATA.fpu_state]
mov ecx, [xsave_area_size]
add ecx, 3
shr ecx, 2
cld
rep movsd
popfd
pop edi
pop esi
pop ecx
ret
@@ -370,21 +386,19 @@ except_7: ;#NM exception handler
mov es, ax
mov ebx, [fpu_owner]
cmp ebx, [current_slot_idx]
cmp ebx, [current_slot]
je .exit
shl ebx, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + ebx + APPDATA.fpu_state]
mov eax, [ebx + APPDATA.fpu_state]
bt [cpu_caps + (CAPS_OSXSAVE/32)*4], CAPS_OSXSAVE mod 32
jnc .no_xsave
mov ecx, eax
mov eax, [xsave_eax]
mov edx, [xsave_edx]
xsave [ecx]
mov ebx, [current_slot_idx]
mov ebx, [current_slot]
mov [fpu_owner], ebx
shl ebx, BSF sizeof.APPDATA
mov ecx, [SLOT_BASE + ebx + APPDATA.fpu_state]
mov ecx, [ebx + APPDATA.fpu_state]
xrstor [ecx]
.exit:
restore_ring3_context
@@ -394,24 +408,22 @@ except_7: ;#NM exception handler
jnc .no_SSE
fxsave [eax]
mov ebx, [current_slot_idx]
mov ebx, [current_slot]
mov [fpu_owner], ebx
shl ebx, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + ebx + APPDATA.fpu_state]
mov eax, [ebx + APPDATA.fpu_state]
fxrstor [eax]
restore_ring3_context
iret
.no_SSE:
fnsave [eax]
mov ebx, [current_slot_idx]
mov ebx, [current_slot]
mov [fpu_owner], ebx
shl ebx, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + ebx + APPDATA.fpu_state]
mov eax, [ebx + APPDATA.fpu_state]
frstor [eax]
restore_ring3_context
iret
iglobal
fpu_owner dd 2
fpu_owner dd APPDATA_OS_THREAD
endg
+20 -26
View File
@@ -605,7 +605,7 @@ proc page_fault_handler
mov edi, [.err_addr]
and edi, -PAGE_SIZE
mov ecx, 1024
mov ecx, PAGE_SIZE/4
xor eax, eax
;cld ;caller is duty for this
rep stosd
@@ -664,7 +664,7 @@ proc page_fault_handler
cmp ebx, tss._io_map_0
jb .fail
cmp ebx, tss._io_map_0+8192
cmp ebx, tss._io_map_0 + IO_MAP_SIZE
jae .fail
; io permission map
@@ -695,7 +695,7 @@ proc page_fault_handler
endp
; returns number of mapped bytes
proc map_mem_ipc stdcall, lin_addr:dword,slot:dword,\
proc map_mem_ipc stdcall, lin_addr:dword,thread:dword,\
ofs:dword,buf_size:dword,req_access:dword
locals
count dd ?
@@ -706,9 +706,8 @@ proc map_mem_ipc stdcall, lin_addr:dword,slot:dword,\
cmp [buf_size], 0
jz .exit
mov eax, [slot]
shl eax, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + eax + APPDATA.process]
mov eax, [thread]
mov eax, [eax + APPDATA.process]
test eax, eax
jz .exit
@@ -732,7 +731,7 @@ proc map_mem_ipc stdcall, lin_addr:dword,slot:dword,\
shr edx, 12
and edx, 0x3FF
.map:
stdcall safe_map_page, [slot], [req_access], [ofs]
stdcall safe_map_page, [process], [req_access], [ofs]
jnc .exit
add [count], PAGE_SIZE
add [ofs], PAGE_SIZE
@@ -758,7 +757,7 @@ proc map_mem_ipc stdcall, lin_addr:dword,slot:dword,\
ret
endp
proc map_memEx stdcall, lin_addr:dword,slot:dword,\
proc map_memEx stdcall, lin_addr:dword,thread:dword,\
ofs:dword,buf_size:dword,req_access:dword
locals
count dd ?
@@ -769,9 +768,8 @@ proc map_memEx stdcall, lin_addr:dword,slot:dword,\
cmp [buf_size], 0
jz .exit
mov eax, [slot]
shl eax, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + eax + APPDATA.process]
mov eax, [thread]
mov eax, [eax + APPDATA.process]
test eax, eax
jz .exit
@@ -795,7 +793,7 @@ proc map_memEx stdcall, lin_addr:dword,slot:dword,\
shr edx, 12
and edx, 0x3FF
.map:
stdcall safe_map_page, [slot], [req_access], [ofs]
stdcall safe_map_page, [process], [req_access], [ofs]
jnc .exit
add [count], PAGE_SIZE
add [ofs], PAGE_SIZE
@@ -826,7 +824,7 @@ endp
; in: edi = linear address to map
; out: CF cleared <=> failed
; destroys: only eax
proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
proc safe_map_page stdcall, process:dword, req_access:dword, ofs:dword
mov eax, [esi + edx*4]
test al, PG_READ
jz .not_present
@@ -861,9 +859,7 @@ proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
cli
cld
push ebx ecx
mov eax, [slot]
shl eax, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + eax + APPDATA.process]
mov eax, [process]
mov eax, [eax + PROC.dlls_list_ptr]
test eax, eax
jz .no_hdll
@@ -953,7 +949,7 @@ sys_IPC:
proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
locals
dst_slot dd ?
dst_thread dd ?
dst_offset dd ?
buf_size dd ?
used_buf dd ?
@@ -963,13 +959,12 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
cli
mov eax, [PID]
call pid_to_slot
call pid_to_thread
test eax, eax
jz .no_pid
mov [dst_slot], eax
shl eax, BSF sizeof.APPDATA
mov edi, [SLOT_BASE + eax + APPDATA.ipc_start] ;is ipc area defined?
mov [dst_thread], eax
mov edi, [eax + APPDATA.ipc_start] ;is ipc area defined?
test edi, edi
jz .no_ipc_area
@@ -977,7 +972,7 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
and ebx, 0xFFF
mov [dst_offset], ebx
mov esi, [SLOT_BASE + eax + APPDATA.ipc_size]
mov esi, [eax + APPDATA.ipc_size]
mov [buf_size], esi
mov ecx, [ipc_tmp]
@@ -990,7 +985,7 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
pop edi esi
@@:
mov [used_buf], ecx
stdcall map_mem_ipc, ecx, [dst_slot], \
stdcall map_mem_ipc, ecx, [dst_thread], \
edi, esi, PG_SWR
mov edi, [dst_offset]
@@ -1039,9 +1034,8 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
mov [page_tabs + ebx*4], eax
invlpg [edx]
mov eax, [dst_slot]
shl eax, BSF sizeof.APPDATA
or [SLOT_BASE + eax + APPDATA.occurred_events], EVENT_IPC
mov eax, [dst_thread]
or [eax + APPDATA.occurred_events], EVENT_IPC
push 0
jmp .ret
.no_pid:
+2 -3
View File
@@ -139,14 +139,13 @@ do_change_task:
mov eax, [xsave_eax]
mov edx, [xsave_edx]
xsave [ecx]
mov ecx, [current_slot_idx]
mov [fpu_owner], ecx
mov ecx, [current_slot]
mov [fpu_owner], ecx
mov ecx, [ecx + APPDATA.fpu_state]
xrstor [ecx]
.no_xsave:
; set CR0.TS
cmp bh, byte[fpu_owner] ;bh == incoming task (new)
cmp ebx, [fpu_owner] ;ebx == incoming task (new)
clts ;clear a task switch flag
je @f
mov eax, cr0 ;and set it again if the owner
+19 -16
View File
@@ -165,7 +165,7 @@ exc_c: ; exceptions (all but 7th - #NM)
jnz IRetToUserHook
@@:
cli
mov eax, [esi + APPDATA.debugger_slot]
mov eax, [esi + APPDATA.debugger_thread]
test eax, eax
jnz .debug
; not debuggee => say error and terminate
@@ -514,28 +514,30 @@ destroy_thread:
@@:
mov eax, [esi + APPOBJ.fd]
test eax, eax
jz @F
jz @f
cmp eax, esi
je @F
je @f
push esi
call [eax + APPOBJ.destroy]
DEBUGF 1,"%s",msg_obj_destroy
pop esi
jmp @B
jmp @b
@@:
mov esi, [.slot]
shl esi, BSF sizeof.APPDATA
add esi, SLOT_BASE
cmp [fpu_owner], esi ; if user fpu last -> fpu user = 2
jne @F
jne @f
mov [fpu_owner], 2
mov eax, [SLOT_BASE + sizeof.APPDATA*2 + APPDATA.fpu_state]
mov [fpu_owner], APPDATA_OS_THREAD
mov eax, [APPDATA_OS_THREAD + APPDATA.fpu_state]
clts
bt [cpu_caps], CAPS_SSE
jnc .no_SSE
fxrstor [eax]
jmp @F
jmp @f
.no_SSE:
fnclex
frstor [eax]
@@ -544,8 +546,8 @@ destroy_thread:
mov [KEY_COUNT], byte 0 ; empty keyboard buffer
mov [BTN_COUNT], byte 0 ; empty button buffer
; remove defined hotkeys
mov esi, [.slot]
mov eax, hotkey_list
.loop:
cmp [eax+8], esi
@@ -638,7 +640,7 @@ destroy_thread:
pushad
mov edi, esi
shl edi, BSF sizeof.APPDATA
mov eax, [SLOT_BASE + edi + APPDATA.debugger_slot]
mov eax, [SLOT_BASE + edi + APPDATA.debugger_thread]
test eax, eax
jz .nodebug
movi ecx, 8
@@ -666,12 +668,12 @@ destroy_thread:
add edi, SLOT_BASE
mov eax, [edi + APPDATA.io_map]
cmp eax, [SLOT_BASE + sizeof.APPDATA+APPDATA.io_map]
cmp eax, [APPDATA_IDLE_THREAD + APPDATA.io_map]
je @F
call free_page
@@:
mov eax, [edi+APPDATA.io_map+4]
cmp eax, [SLOT_BASE+sizeof.APPDATA+APPDATA.io_map+4]
cmp eax, [APPDATA_IDLE_THREAD + APPDATA.io_map+4]
je @F
call free_page
@@:
@@ -712,12 +714,12 @@ destroy_thread:
call free_cd_channel
and [cd_status], 0
@@:
pop esi
cmp [bgrlockpid], esi
jnz @f
and [bgrlockpid], 0
and [bgrlock], 0
@@:
pop esi
pusha ; remove all port reservations
mov edx, esi
@@ -778,14 +780,15 @@ destroy_thread:
mov edi, esi ; do not run this process slot
shl edi, BSF sizeof.APPDATA
mov [SLOT_BASE + edi + APPDATA.state], TSTATE_FREE
add edi, SLOT_BASE
mov [edi + APPDATA.state], TSTATE_FREE
; debugger test - terminate all debuggees
mov eax, 2
mov ecx, SLOT_BASE + 2*sizeof.APPDATA + APPDATA.debugger_slot
mov ecx, APPDATA_OS_THREAD + APPDATA.debugger_thread
.xd0:
cmp eax, [thread_count]
ja .xd1
cmp dword [ecx], esi
cmp dword [ecx], edi
jnz @f
and dword [ecx], 0
pushad
+19 -22
View File
@@ -537,21 +537,21 @@ pid_to_slot:
align 4
proc read_process_memory
;Input:
; eax - process slot
; eax - process thread
; ecx - buffer address
; edx - buffer size
; esi - start address in other process
;Output:
; eax - number of bytes read.
locals
slot dd ?
thread dd ?
buff dd ?
r_count dd ?
offset dd ?
tmp_r_cnt dd ?
endl
mov [slot], eax
mov [thread], eax
mov [buff], ecx
and [r_count], 0
mov [tmp_r_cnt], edx
@@ -577,7 +577,7 @@ proc read_process_memory
push ecx
stdcall map_memEx, [proc_mem_map], \
[slot], ebx, ecx, PG_READ
[thread], ebx, ecx, PG_READ
pop ecx
mov esi, [offset]
@@ -607,7 +607,7 @@ endp
align 4
proc write_process_memory
;Input:
; eax - process slot
; eax - process thread
; ecx - buffer address
; edx - buffer size
; esi - start address in other process
@@ -615,14 +615,14 @@ proc write_process_memory
; eax - number of bytes written
locals
slot dd ?
thread dd ?
buff dd ?
w_count dd ?
offset dd ?
tmp_w_cnt dd ?
endl
mov [slot], eax
mov [thread], eax
mov [buff], ecx
and [w_count], 0
mov [tmp_w_cnt], edx
@@ -647,7 +647,7 @@ proc write_process_memory
mov ebx, [offset]
push ecx
stdcall map_memEx, [proc_mem_map], \
[slot], ebx, ecx, PG_SWR
[thread], ebx, ecx, PG_SWR
pop ecx
mov edi, [offset]
@@ -906,7 +906,7 @@ common_app_entry:
stdcall free_kernel_space, [ebp+APP_HDR.img_base]
stdcall kernel_free, ebp
mov ebx, [current_slot]
cmp [ebx + APPDATA.debugger_slot], 0
cmp [ebx + APPDATA.debugger_thread], 0
je .exit
mov [ebx + APPDATA.state], TSTATE_RUN_SUSPENDED
mov [ebx + APPDATA.state], TSTATE_RUN_SUSPENDED
@@ -1054,8 +1054,8 @@ proc set_app_params stdcall,slot:dword, params:dword, flags:dword
; set if debuggee
test byte [flags], 1
jz .no_debug
mov eax, [current_slot_idx]
mov [SLOT_BASE + ebx + APPDATA.debugger_slot], eax
mov eax, [current_slot]
mov [SLOT_BASE + ebx + APPDATA.debugger_thread], eax
.no_debug:
mov [SLOT_BASE + ebx + APPDATA.state], dl
lea edx, [SLOT_BASE + ebx]
@@ -1074,27 +1074,24 @@ get_curr_slot:
mov eax, [current_slot]
ret
pid_to_appdata:
;Input:
; eax - pid of process
;Output:
; eax - 0 - not found or pointer on APPDATA
; @brief Get pointer to APPDATA by PID
; @param eax - TID of thread
; @return eax - 0 - not found or pointer on APPDATA
pid_to_thread:
push ebx
push ecx
mov ebx, [thread_count]
shl ebx, BSF sizeof.APPDATA ; multiply by size
; skip first process in the task table
mov ecx, SLOT_BASE
add ebx, ecx
mov ecx, APPDATA_IDLE_THREAD
.loop:
add ecx, sizeof.APPDATA
cmp [ecx + APPDATA.state], TSTATE_FREE
jz @f ;skip empty slots
cmp [ecx + APPDATA.tid], eax
jz .pid_found
@@:
cmp ecx, ebx
jb .loop
add ecx, sizeof.APPDATA
dec ebx
jnz .loop
pop ecx
pop ebx
+1 -1
View File
@@ -48,7 +48,7 @@ endg
; This internal function acquires the lock for the global list.
lock_timer_list:
mov edx, [current_slot_idx]
mov edx, [current_slot]
@@:
xor eax, eax
lock cmpxchg [timer_list_owner], edx
+4 -2
View File
@@ -193,7 +193,8 @@ align 4
;--------------------------------------
align 4
@@:
mov eax, [current_slot_idx]
mov eax, [current_slot]
mov eax, [eax + APPDATA.tid]
mov [bgrlockpid], eax
cmp [img_background], static_background_data
jz .nomem
@@ -241,7 +242,8 @@ nosb6:
jnz nosb7
cmp [bgrlock], 0
jz .err
mov eax, [current_slot_idx]
mov eax, [current_slot]
mov eax, [eax + APPDATA.tid]
cmp [bgrlockpid], eax
jnz .err
mov eax, ecx
+2
View File
@@ -1997,6 +1997,8 @@ align 4
; esi - slot
push eax ecx edx esi
xchg eax, esi
shl eax, BSF sizeof.APPDATA
add eax, SLOT_BASE
lea ecx, [esp + 12]
mov edx, 1
call read_process_memory
+17 -18
View File
@@ -55,7 +55,6 @@ launcher_start db 1
endg
max_processes = 255
tss_step = 128 + 8192 ; tss & i/o - 65535 ports, * 256=557056*4
os_stack = os_data_l - gdts ; GDTs
os_code = os_code_l - gdts
@@ -389,7 +388,7 @@ high_code:
mov edi, tss._io_map_0
xor eax, eax
not eax
mov ecx, 8192/4
mov ecx, IO_MAP_SIZE/4
rep stosd ; access to 4096*8=65536 ports
mov ax, tss0
@@ -410,7 +409,7 @@ high_code:
stdcall alloc_kernel_space, 0x50000 ; FIXME check size
mov [default_io_map], eax
add eax, 0x2000
add eax, IO_MAP_SIZE
mov [ipc_tmp], eax
mov ebx, 0x1000
@@ -535,7 +534,7 @@ high_code:
dec ecx
jns @b
mov edx, SLOT_BASE + sizeof.APPDATA*1
mov edx, APPDATA_IDLE_THREAD
mov ebx, [os_stack_seg]
add ebx, RING0_STACK_SIZE
add ebx, [xsave_area_size]
@@ -547,7 +546,7 @@ high_code:
mov ecx, IDLE_PRIORITY
call scheduler_add_thread
mov edx, SLOT_BASE + sizeof.APPDATA*2
mov edx, APPDATA_OS_THREAD
mov ebx, [os_stack_seg]
call setup_os_slot
mov dword [edx], 'OS'
@@ -556,7 +555,7 @@ high_code:
mov [current_slot_idx], 2
mov [thread_count], 2
mov [current_slot], SLOT_BASE + sizeof.APPDATA*2
mov [current_slot], APPDATA_OS_THREAD
; Move other CPUs to deep sleep, if it is useful
uglobal
@@ -848,15 +847,15 @@ include "detect/vortex86.inc" ; Vortex86 SoC detection code
call reserve_irqs_ports
mov [SLOT_BASE + APPDATA.window], window_data
mov [SLOT_BASE + sizeof.APPDATA + APPDATA.window], window_data + sizeof.WDATA
mov [SLOT_BASE + sizeof.APPDATA*2 + APPDATA.window], window_data + sizeof.WDATA*2
mov [APPDATA_IDLE_THREAD + APPDATA.window], background_window
mov [APPDATA_OS_THREAD + APPDATA.window], window_data + sizeof.WDATA*2
mov [window_data + WDATA.thread], SLOT_BASE
mov [window_data + sizeof.WDATA + WDATA.thread], SLOT_BASE + sizeof.APPDATA
mov [window_data + sizeof.WDATA*2 + WDATA.thread], SLOT_BASE + sizeof.APPDATA*2
mov [background_window + WDATA.thread], APPDATA_IDLE_THREAD
mov [window_data + sizeof.WDATA*2 + WDATA.thread], APPDATA_OS_THREAD
call init_display
mov eax, [def_cursor]
mov [window_data + sizeof.WDATA + WDATA.cursor], eax
mov [background_window + WDATA.cursor], eax
mov [window_data + sizeof.WDATA*2 + WDATA.cursor], eax
; PRINT CPU FREQUENCY
@@ -953,14 +952,14 @@ include "detect/vortex86.inc" ; Vortex86 SoC detection code
; Protect I/O permission map
mov esi, [default_io_map]
stdcall map_page, esi, [SLOT_BASE + sizeof.APPDATA + APPDATA.io_map], PG_READ
stdcall map_page, esi, [APPDATA_IDLE_THREAD + APPDATA.io_map], PG_READ
add esi, 0x1000
stdcall map_page, esi, [SLOT_BASE + sizeof.APPDATA + APPDATA.io_map + 4], PG_READ
stdcall map_page, esi, [APPDATA_IDLE_THREAD + APPDATA.io_map + 4], PG_READ
stdcall map_page, tss._io_map_0, \
[SLOT_BASE + sizeof.APPDATA + APPDATA.io_map], PG_READ
[APPDATA_IDLE_THREAD + APPDATA.io_map], PG_READ
stdcall map_page, tss._io_map_1, \
[SLOT_BASE + sizeof.APPDATA + APPDATA.io_map + 4], PG_READ
[APPDATA_IDLE_THREAD + APPDATA.io_map + 4], PG_READ
; SET KEYBOARD PARAMETERS
mov al, 0xf6 ; reset keyboard, scan enabled
@@ -1865,7 +1864,7 @@ sysfn_shutdown: ; 18.9 = system shutdown
; out: Z/z -- is/not kernel thread
is_kernel_thread:
mov eax, [eax + APPDATA.process]
cmp eax, [SLOT_BASE + 2*sizeof.APPDATA + APPDATA.process] ; OS
cmp eax, [APPDATA_OS_THREAD + APPDATA.process] ; OS
ret
;------------------------------------------------------------------------------
sysfn_terminate: ; 18.2 = TERMINATE
@@ -2065,7 +2064,7 @@ sysfn_zmodif:
;------------------------------------------------------------------------------
sysfn_getidletime: ; 18.4 = GET IDLETIME
mov eax, [SLOT_BASE + sizeof.APPDATA + APPDATA.cpu_usage]
mov eax, [APPDATA_IDLE_THREAD + APPDATA.cpu_usage]
mov [esp + SYSCALL_STACK.eax], eax
ret
;------------------------------------------------------------------------------
@@ -2825,7 +2824,7 @@ no_mark_system_shutdown:
align 4
noshutdown:
mov eax, [thread_count] ; termination
mov ebx, SLOT_BASE + sizeof.APPDATA + APPDATA.state
mov ebx, APPDATA_IDLE_THREAD + APPDATA.state
mov esi, 1
;--------------------------------------
align 4
+2 -1
View File
@@ -148,9 +148,10 @@ ReadNoteByte:
push esi
mov eax, [pidProcessNote]
call pid_to_slot
call pid_to_thread
test eax, eax
jz .failed
lea ecx, [esp+12]
mov edx, 1
mov esi, [memAdrNote]
+45 -42
View File
@@ -3,6 +3,7 @@ public EXPORTS
section '.flat' code readable align 16
include '../../../macros.inc'
include '../../../KOSfuncs.inc'
include 'strlen.inc'
MB_FIRST_BUT_ID equ 3 ;идентификатор 1-й кнопки на сообщении
@@ -18,14 +19,8 @@ MB_TEXT_OFFSET equ 2 ;ᬥ饭
align 4
start:
mov eax,48
mov ebx,3
mov ecx,sc
mov edx,sizeof.system_colors
mcall
mov eax,40
mov ebx,0x27
mcall
mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
mcall SF_SET_EVENTS_MASK, EVM_MOUSE + EVM_BUTTON + EVM_KEY + EVM_REDRAW
;-- clear id pressed button ---
mov ebx,[mb_text]
@@ -39,9 +34,7 @@ start:
align 4
red_win:
mov eax,12
mov ebx,1
mcall
mcall SF_REDRAW,SSF_BEGIN_DRAW
xor eax,eax
mov bx,word[mb_left]
@@ -56,7 +49,7 @@ red_win:
add edi,MB_TEXT_OFFSET ;Caption
mcall
mcall 9,mb_procinfo,-1
mcall SF_THREAD_INFO,mb_procinfo,-1
mov eax,dword[mb_procinfo.client_box.width]
sub eax,[but_width]
@@ -64,7 +57,6 @@ red_win:
add eax,MB_BUT_OTX_1
mov [ot_left],eax
mov eax,4 ;рисование текста
mov bx,MB_BUT_OTX_1
shl ebx,16
mov bx,MB_BUT_OTY_1
@@ -76,13 +68,12 @@ red_win:
call strlen
call linlen
cmp eax,0
je @f
or eax,eax
jz @f
mov esi,eax
push eax
mov eax,4
int 0x40
mcall SF_DRAW_TEXT
pop eax
add edx,eax
@@ -95,25 +86,24 @@ red_win:
@@:
call MsgBoxDrawAllBut
mcall 12,2
mcall SF_REDRAW,SSF_END_DRAW
align 4
still:
mov eax,10
mcall
mcall SF_WAIT_EVENT
cmp al,1 ;изм. положение окна
cmp al,EV_REDRAW
jz red_win
cmp al,2
cmp al,EV_KEY
jz key
cmp al,3
cmp al,EV_BUTTON
jz button
jmp still
align 4
key:
mcall 2
mcall SF_GET_KEY
cmp ah,13
jne @f
mov ah,[mb_key_foc]
@@ -153,7 +143,7 @@ key:
align 4
button:
mcall 17 ;получить код нажатой кнопки
mcall SF_GET_BUTTON
cmp ah,MB_FIRST_BUT_ID
jge close
cmp ah,1
@@ -169,8 +159,8 @@ close:
mov byte[ebx],ah
;*** call msgbox functions ***
cmp ah,0
je @f
or ah,ah
jz @f
cmp dword[mb_funct],0
je @f
xor ebx,ebx
@@ -182,7 +172,7 @@ close:
je @f
call dword[ebx]
@@:
mcall -1 ;выход из программы
mcall SF_TERMINATE_PROCESS
align 4
MsgBoxDrawAllBut:
@@ -202,8 +192,8 @@ MsgBoxDrawAllBut:
mov esi,edx
call strlen
cmp eax,0
je @f
or eax,eax
jz @f
call MsgBoxDrawButton
inc ecx
@@ -253,8 +243,7 @@ MsgBoxDrawButton:
ror ebx,16
mov bx,ax
mov eax,8
int 0x40
mcall SF_DEFINE_BUTTON
pop edx ebx eax
;caption
@@ -264,8 +253,7 @@ MsgBoxDrawButton:
mov ecx,[sc.work_button]
@@:
mov esi,eax
mov eax,4
int 0x40
mcall SF_DRAW_TEXT
pop ecx
ret
@@ -284,6 +272,25 @@ MsgBoxReInit:
add esi,eax ;add len of caption
mov [txtMsg],esi
;--- calc window width ---
push eax ebx esi
.cycle:
call strlen
mov ebx,eax
call linlen
add esi,eax
sub ebx,eax
imul eax,6
add eax,10+2*SF_DRAW_TEXT
cmp [mb_width],ax
jge @f
mov [mb_width],ax
@@:
inc esi
cmp ebx,5 ;length of the remaining text
jg .cycle
pop esi ebx eax
;--- go to first button text --- buttons 1...MB_MAX_BUT
mov ebx,txtBut
mov cx,MB_MAX_BUT
@@ -320,12 +327,11 @@ MsgBoxReInit:
add eax,MB_BUT_HEIGHT
add ax,5 ;height of border
mov [mb_height],ax
mcall 48,4 ;skin height
mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
add [mb_height],ax
;--- calc window top ---
mov eax,14
int 0x40
mcall SF_GET_SCREEN_SIZE
mov word[mb_top],ax
mov ax,word[mb_height]
sub word[mb_top],ax
@@ -367,6 +373,7 @@ MsgBoxReInit:
;input:
; [esp+8] = pointer to msgbox text
; [esp+12] = thread stack
align 4
MsgBoxCreate:
push ebp
@@ -374,11 +381,7 @@ MsgBoxCreate:
m2m dword[mb_text],dword[ebp+8]
push eax ebx ecx edx
mov eax,51
mov ebx,1
mov ecx,start
mov edx,dword[ebp+12];thread
int 0x40
mcall SF_THREAD_CONTROL,SSF_CREATE_THREAD,start,[ebp+12]
mov dword[mb_funct],0
pop edx ecx ebx eax
+2 -78
View File
@@ -474,7 +474,7 @@ system_dir_ProcLib db '/sys/lib/proc_lib.obj',0
;---------------------------------------------------------------------
l_libs_start:
library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, \
Box_lib_import, plugins_directory
import_box_lib, plugins_directory
library02 l_libs system_dir_Libini+9, library_path, system_dir_Libini, \
Libini_import, plugins_directory
@@ -728,83 +728,7 @@ aIni_set_int db 'ini_set_int',0
aIni_set_color db 'ini_set_color',0
;---------------------------------------------------------------------
align 4
Box_lib_import:
;init_lib dd a_init
;version_lib dd a_version
edit_box_draw dd aEdit_box_draw
edit_box_key dd aEdit_box_key
edit_box_mouse dd aEdit_box_mouse
;version_ed dd aVersion_ed
init_checkbox dd aInit_checkbox
check_box_draw dd aCheck_box_draw
check_box_mouse dd aCheck_box_mouse
;version_ch dd aVersion_ch
option_box_draw dd aOption_box_draw
option_box_mouse dd aOption_box_mouse
;version_op dd aVersion_op
scrollbar_ver_draw dd aScrollbar_ver_draw
scrollbar_ver_mouse dd aScrollbar_ver_mouse
scrollbar_hor_draw dd aScrollbar_hor_draw
scrollbar_hor_mouse dd aScrollbar_hor_mouse
;version_scrollbar dd aVersion_scrollbar
dinamic_button_draw dd aDbutton_draw
dinamic_button_mouse dd aDbutton_mouse
;version_dbutton dd aVersion_dbutton
menu_bar_draw dd aMenu_bar_draw
menu_bar_mouse dd aMenu_bar_mouse
menu_bar_activate dd aMenu_bar_activate
;version_menu_bar dd aVersion_menu_bar
;FileBrowser_draw dd aFileBrowser_draw
;FileBrowser_mouse dd aFileBrowser_mouse
;FileBrowser_key dd aFileBrowser_key
;Version_FileBrowser dd aVersion_FileBrowser
dd 0
dd 0
;a_init db 'lib_init',0
;a_version db 'version',0
aEdit_box_draw db 'edit_box_draw',0
aEdit_box_key db 'edit_box_key',0
aEdit_box_mouse db 'edit_box_mouse',0
;aVersion_ed db 'version_ed',0
aInit_checkbox db 'init_checkbox2',0
aCheck_box_draw db 'check_box_draw2',0
aCheck_box_mouse db 'check_box_mouse2',0
;aVersion_ch db 'version_ch2',0
aOption_box_draw db 'option_box_draw',0
aOption_box_mouse db 'option_box_mouse',0
;aVersion_op db 'version_op',0
aScrollbar_ver_draw db 'scrollbar_v_draw',0
aScrollbar_ver_mouse db 'scrollbar_v_mouse',0
aScrollbar_hor_draw db 'scrollbar_h_draw',0
aScrollbar_hor_mouse db 'scrollbar_h_mouse',0
;aVersion_scrollbar db 'version_scrollbar',0
aDbutton_draw db 'dbutton_draw',0
aDbutton_mouse db 'dbutton_mouse',0
;aVersion_dbutton db 'version_dbutton',0
aMenu_bar_draw db 'menu_bar_draw',0
aMenu_bar_mouse db 'menu_bar_mouse',0
aMenu_bar_activate db 'menu_bar_activate',0
;aVersion_menu_bar db 'version_menu_bar',0
;aFileBrowser_draw db 'FileBrowser_draw',0
;aFileBrowser_mouse db 'FileBrowser_mouse',0
;aFileBrowser_key db 'FileBrowser_key',0
;aVersion_FileBrowser db 'version_FileBrowser',0
include '../../develop/libraries/box_lib/import.inc'
;---------------------------------------------------------------------
align 4
load_directory_pointer dd 0
+2 -4
View File
@@ -421,8 +421,7 @@ draw_scrollbars:
jbe @f
cmp [scroll_bar_data_vertical.cur_area],0
je @f
push dword scroll_bar_data_vertical
call [scrollbar_ver_draw]
stdcall [scrollbar_v_draw], scroll_bar_data_vertical
; draw_scroll_bar_vertical scroll_bar_data_vertical
inc [draw_scrollbar_counter]
@@:
@@ -434,8 +433,7 @@ draw_scrollbars:
jbe @f
cmp [scroll_bar_data_horizontal.cur_area],0
je @f
push dword scroll_bar_data_horizontal
call [scrollbar_hor_draw]
stdcall [scrollbar_h_draw], scroll_bar_data_horizontal
; draw_scroll_bar_horizontal scroll_bar_data_horizontal
inc [draw_scrollbar_counter]
@@:
+21 -42
View File
@@ -18,49 +18,28 @@ draw_window:
call draw_other
push dword menu_data_1
call [menu_bar_draw]
push dword menu_data_2
call [menu_bar_draw]
push dword menu_data_3
call [menu_bar_draw]
push dword menu_data_4
call [menu_bar_draw]
push dword menu_data_5
call [menu_bar_draw]
push dword menu_data_6
call [menu_bar_draw]
stdcall [menu_bar_draw], menu_data_1
stdcall [menu_bar_draw], menu_data_2
stdcall [menu_bar_draw], menu_data_3
stdcall [menu_bar_draw], menu_data_4
stdcall [menu_bar_draw], menu_data_5
stdcall [menu_bar_draw], menu_data_6
push dword dinamic_button_data_1
call [dinamic_button_draw]
push dword dinamic_button_data_2
call [dinamic_button_draw]
push dword dinamic_button_data_3
call [dinamic_button_draw]
push dword dinamic_button_data_4
call [dinamic_button_draw]
push dword dinamic_button_data_5
call [dinamic_button_draw]
push dword dinamic_button_data_6
call [dinamic_button_draw]
push dword dinamic_button_data_7
call [dinamic_button_draw]
push dword dinamic_button_data_8
call [dinamic_button_draw]
push dword dinamic_button_data_9
call [dinamic_button_draw]
push dword dinamic_button_data_10
call [dinamic_button_draw]
push dword dinamic_button_data_11
call [dinamic_button_draw]
push dword dinamic_button_data_12
call [dinamic_button_draw]
push dword dinamic_button_data_13
call [dinamic_button_draw]
push dword dinamic_button_data_14
call [dinamic_button_draw]
push dword dinamic_button_data_15
call [dinamic_button_draw]
stdcall [dbutton_draw], dinamic_button_data_1
stdcall [dbutton_draw], dinamic_button_data_2
stdcall [dbutton_draw], dinamic_button_data_3
stdcall [dbutton_draw], dinamic_button_data_4
stdcall [dbutton_draw], dinamic_button_data_5
stdcall [dbutton_draw], dinamic_button_data_6
stdcall [dbutton_draw], dinamic_button_data_7
stdcall [dbutton_draw], dinamic_button_data_8
stdcall [dbutton_draw], dinamic_button_data_9
stdcall [dbutton_draw], dinamic_button_data_10
stdcall [dbutton_draw], dinamic_button_data_11
stdcall [dbutton_draw], dinamic_button_data_12
stdcall [dbutton_draw], dinamic_button_data_13
stdcall [dbutton_draw], dinamic_button_data_14
stdcall [dbutton_draw], dinamic_button_data_15
mcall 13,<225,2>,<3,22>,0x677EA0 ;0x052B64
mcall ,<280,2>
+27 -50
View File
@@ -1,20 +1,20 @@
;---------------------------------------------------------------------
mouse:
mcall 18,7
mcall SF_SYSTEM,SSF_GET_ACTIVE_WINDOW
cmp [active_process],eax
jne still
mcall 37,7
mcall SF_MOUSE_GET,SSF_SCROLL_DATA
mov [mouse_scroll_data],eax
mov eax,[mouse_position]
mov [mouse_position_old],eax
mcall 37,1
mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
mov [mouse_position],eax
mov eax,[mouse_keys]
mov [mouse_keys_old],eax
mcall 37,2
mcall SF_MOUSE_GET,SSF_BUTTON
mov [mouse_keys],eax
cmp [soi],dword 0
@@ -32,8 +32,7 @@ mouse:
cmp eax,[scroll_bar_data_horizontal.cur_area]
jbe .vertical
push dword scroll_bar_data_horizontal
call [scrollbar_hor_mouse]
stdcall [scrollbar_h_mouse], scroll_bar_data_horizontal
; mouse_scroll_bar_horizontal scroll_bar_data_horizontal
cmp [scroll_bar_data_horizontal.redraw],0
@@ -50,8 +49,7 @@ mouse:
cmp eax,[scroll_bar_data_vertical.cur_area]
jbe .menu_bar
push dword scroll_bar_data_vertical
call [scrollbar_ver_mouse]
stdcall [scrollbar_v_mouse], scroll_bar_data_vertical
; mouse_scroll_bar_vertical scroll_bar_data_vertical
cmp [scroll_bar_data_vertical.redraw],0
@@ -83,8 +81,7 @@ mouse:
.menu_bar_1:
call .set_mouse_flag
@@:
push dword menu_data_1
call [menu_bar_mouse]
stdcall [menu_bar_mouse], menu_data_1
; mouse_menubar menu_data_1
cmp [menu_data_1.click],dword 1
jne .menu_bar_2
@@ -95,8 +92,7 @@ mouse:
;--------------------------------------------
.menu_bar_2:
; Edit
push dword menu_data_2
call [menu_bar_mouse]
stdcall [menu_bar_mouse], menu_data_2
; mouse_menubar menu_data_2
cmp [menu_data_2.click],dword 1
jne .menu_bar_3
@@ -107,8 +103,7 @@ mouse:
;--------------------------------------------
.menu_bar_3:
; View
push dword menu_data_3
call [menu_bar_mouse]
stdcall [menu_bar_mouse], menu_data_3
; mouse_menubar menu_data_3
cmp [menu_data_3.click],dword 1
jne .menu_bar_4
@@ -119,8 +114,7 @@ mouse:
;--------------------------------------------
.menu_bar_4:
; Zoom
push dword menu_data_4
call [menu_bar_mouse]
stdcall [menu_bar_mouse], menu_data_4
; mouse_menubar menu_data_4
cmp [menu_data_4.click],dword 1
jne .menu_bar_5
@@ -131,8 +125,7 @@ mouse:
;--------------------------------------------
.menu_bar_5:
; Tools
push dword menu_data_5
call [menu_bar_mouse]
stdcall [menu_bar_mouse], menu_data_5
; mouse_menubar menu_data_5
cmp [menu_data_5.click],dword 1
jne .menu_bar_6
@@ -143,8 +136,7 @@ mouse:
;--------------------------------------------
.menu_bar_6:
; Help
push dword menu_data_6
call [menu_bar_mouse]
stdcall [menu_bar_mouse], menu_data_6
; mouse_menubar menu_data_6
cmp [menu_data_6.click],dword 1
jne .mouse_dinamic_button
@@ -155,8 +147,7 @@ mouse:
;---------------------------------------------------
.mouse_dinamic_button:
; open file
push dword dinamic_button_data_1
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_1
; mouse_dinamic_button dinamic_button_data_1
mov eax,dinamic_button_data_1.click
cmp [eax],dword 1
@@ -166,8 +157,7 @@ mouse:
;-------------------------------------------------
@@:
; reload file
push dword dinamic_button_data_2
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_2
; mouse_dinamic_button dinamic_button_data_2
mov eax,dinamic_button_data_2.click
cmp [eax],dword 1
@@ -177,8 +167,7 @@ mouse:
;-------------------------------------------------
@@:
; left limit
push dword dinamic_button_data_3
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_3
; mouse_dinamic_button dinamic_button_data_3
mov eax,dinamic_button_data_3.click
cmp [eax],dword 1
@@ -188,8 +177,7 @@ mouse:
;-------------------------------------------------
@@:
; left arrow
push dword dinamic_button_data_4
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_4
; mouse_dinamic_button dinamic_button_data_4
mov eax,dinamic_button_data_4.click
cmp [eax],dword 1
@@ -199,8 +187,7 @@ mouse:
;-------------------------------------------------
@@:
; slide show
push dword dinamic_button_data_5
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_5
; mouse_dinamic_button dinamic_button_data_5
mov eax,dinamic_button_data_5.click
cmp [eax],dword 1
@@ -210,8 +197,7 @@ mouse:
;-------------------------------------------------
@@:
; right arrow
push dword dinamic_button_data_6
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_6
; mouse_dinamic_button dinamic_button_data_6
mov eax,dinamic_button_data_6.click
cmp [eax],dword 1
@@ -221,8 +207,7 @@ mouse:
;-------------------------------------------------
@@:
; right limit
push dword dinamic_button_data_7
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_7
; mouse_dinamic_button dinamic_button_data_7
mov eax,dinamic_button_data_7.click
cmp [eax],dword 1
@@ -232,8 +217,7 @@ mouse:
;-------------------------------------------------
@@:
; zoom +
push dword dinamic_button_data_8
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_8
; mouse_dinamic_button dinamic_button_data_8
mov eax,dinamic_button_data_8.click
cmp [eax],dword 1
@@ -243,8 +227,7 @@ mouse:
;-------------------------------------------------
@@:
; zoom -
push dword dinamic_button_data_9
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_9
; mouse_dinamic_button dinamic_button_data_9
mov eax,dinamic_button_data_9.click
cmp [eax],dword 1
@@ -254,8 +237,7 @@ mouse:
;-------------------------------------------------
@@:
; zoom 100%
push dword dinamic_button_data_10
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_10
; mouse_dinamic_button dinamic_button_data_10
mov eax,dinamic_button_data_10.click
cmp [eax],dword 1
@@ -265,8 +247,7 @@ mouse:
;-------------------------------------------------
@@:
; rotate clockwise
push dword dinamic_button_data_11
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_11
; mouse_dinamic_button dinamic_button_data_11
mov eax,dinamic_button_data_11.click
cmp [eax],dword 1
@@ -276,8 +257,7 @@ mouse:
;-------------------------------------------------
@@:
; rotate counter-clockwise
push dword dinamic_button_data_12
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_12
; mouse_dinamic_button dinamic_button_data_12
mov eax,dinamic_button_data_12.click
cmp [eax],dword 1
@@ -287,8 +267,7 @@ mouse:
;-------------------------------------------------
@@:
; file information
push dword dinamic_button_data_13
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_13
; mouse_dinamic_button dinamic_button_data_13
mov eax,dinamic_button_data_13.click
cmp [eax],dword 1
@@ -298,8 +277,7 @@ mouse:
;-------------------------------------------------
@@:
; wallpaper
push dword dinamic_button_data_14
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_14
; mouse_dinamic_button dinamic_button_data_14
mov eax,dinamic_button_data_14.click
cmp [eax],dword 1
@@ -309,8 +287,7 @@ mouse:
;-------------------------------------------------
@@:
; settings
push dword dinamic_button_data_15
call [dinamic_button_mouse]
stdcall [dbutton_mouse], dinamic_button_data_15
; mouse_dinamic_button dinamic_button_data_15
mov eax,dinamic_button_data_15.click
cmp [eax],dword 1
+8 -8
View File
@@ -451,19 +451,19 @@ mouse:
;--------------------------------------
align 4
.red:
stdcall [scrollbar_ver_mouse], scroll_bar_data_red
stdcall [scrollbar_v_mouse], scroll_bar_data_red
cmp [scroll_bar_data_red.delta2],0
jne @f
;--------------------------------------
align 4
.green:
stdcall [scrollbar_ver_mouse], scroll_bar_data_green
stdcall [scrollbar_v_mouse], scroll_bar_data_green
cmp [scroll_bar_data_green.delta2],0
jne @f
;--------------------------------------
align 4
.blue:
stdcall [scrollbar_ver_mouse], scroll_bar_data_blue
stdcall [scrollbar_v_mouse], scroll_bar_data_blue
cmp [scroll_bar_data_blue.delta2],0
jne @f
;--------------------------------------
@@ -499,9 +499,9 @@ draw_tone:
;---------------------------------------------------------------------
align 4
draw_scrollbars:
stdcall [scrollbar_ver_draw], scroll_bar_data_red
stdcall [scrollbar_ver_draw], scroll_bar_data_green
stdcall [scrollbar_ver_draw], scroll_bar_data_blue
stdcall [scrollbar_v_draw], scroll_bar_data_red
stdcall [scrollbar_v_draw], scroll_bar_data_green
stdcall [scrollbar_v_draw], scroll_bar_data_blue
ret
;---------------------------------------------------------------------
align 4
@@ -512,7 +512,7 @@ draw_history_frame:
mov [frame_data.draw_text_flag],dword 1
mov [frame_data.text_pointer],dword history_text
stdcall [Frame_draw], frame_data
stdcall [frame_draw], frame_data
ret
;---------------------------------------------------------------------
align 4
@@ -590,7 +590,7 @@ newcol:
mov [frame_data.x],ebx
mov [frame_data.y],ecx
stdcall [Frame_draw], frame_data
stdcall [frame_draw], frame_data
pop ecx ebx
+2 -93
View File
@@ -23,102 +23,11 @@ system_dir_Boxlib db '/sys/lib/box_lib.obj',0
align 4
l_libs_start:
library01 l_libs system_dir_Boxlib+9,file_name,system_dir_Boxlib,\
Box_lib_import,plugins_directory
import_box_lib,plugins_directory
end_l_libs:
;---------------------------------------------------------------------
;---------------------------------------------------------------------
align 4
Box_lib_import:
;init_lib dd a_init
;version_lib dd a_version
edit_box_draw dd aEdit_box_draw
edit_box_key dd aEdit_box_key
edit_box_mouse dd aEdit_box_mouse
edit_box_set_text dd aEdit_box_set_text
;version_ed dd aVersion_ed
;check_box_draw dd aCheck_box_draw
;check_box_mouse dd aCheck_box_mouse
;version_ch dd aVersion_ch
;option_box_draw dd aOption_box_draw
;option_box_mouse dd aOption_box_mouse
;version_op dd aVersion_op
scrollbar_ver_draw dd aScrollbar_ver_draw
scrollbar_ver_mouse dd aScrollbar_ver_mouse
;scrollbar_hor_draw dd aScrollbar_hor_draw
;scrollbar_hor_mouse dd aScrollbar_hor_mouse
;version_scrollbar dd aVersion_scrollbar
;dinamic_button_draw dd aDbutton_draw
;dinamic_button_mouse dd aDbutton_mouse
;version_dbutton dd aVersion_dbutton
;menu_bar_draw dd aMenu_bar_draw
;menu_bar_mouse dd aMenu_bar_mouse
;menu_bar_activate dd aMenu_bar_activate
;version_menu_bar dd aVersion_menu_bar
;FileBrowser_draw dd aFileBrowser_draw
;FileBrowser_mouse dd aFileBrowser_mouse
;FileBrowser_key dd aFileBrowser_key
;Version_FileBrowser dd aVersion_FileBrowser
;PathShow_prepare dd sz_PathShow_prepare
;PathShow_draw dd sz_PathShow_draw
;Version_path_show dd szVersion_path_show
Frame_draw dd sz_Frame_draw
;Version_frame dd szVersion_frame
dd 0,0
;a_init db 'lib_init',0
;a_version db 'version',0
aEdit_box_draw db 'edit_box_draw',0
aEdit_box_key db 'edit_box_key',0
aEdit_box_mouse db 'edit_box_mouse',0
aEdit_box_set_text db 'edit_box_set_text',0
;aVersion_ed db 'version_ed',0
;aCheck_box_draw db 'check_box_draw',0
;aCheck_box_mouse db 'check_box_mouse',0
;aVersion_ch db 'version_ch',0
;aOption_box_draw db 'option_box_draw',0
;aOption_box_mouse db 'option_box_mouse',0
;aVersion_op db 'version_op',0
aScrollbar_ver_draw db 'scrollbar_v_draw',0
aScrollbar_ver_mouse db 'scrollbar_v_mouse',0
;aScrollbar_hor_draw db 'scrollbar_h_draw',0
;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0
;aVersion_scrollbar db 'version_scrollbar',0
;aDbutton_draw db 'dbutton_draw',0
;aDbutton_mouse db 'dbutton_mouse',0
;aVersion_dbutton db 'version_dbutton',0
;aMenu_bar_draw db 'menu_bar_draw',0
;aMenu_bar_mouse db 'menu_bar_mouse',0
;aMenu_bar_activate db 'menu_bar_activate',0
;aVersion_menu_bar db 'version_menu_bar',0
;aFileBrowser_draw db 'FileBrowser_draw',0
;aFileBrowser_mouse db 'FileBrowser_mouse',0
;aFileBrowser_key db 'FileBrowser_key',0
;aVersion_FileBrowser db 'version_FileBrowser',0
;sz_PathShow_prepare db 'PathShow_prepare',0
;sz_PathShow_draw db 'PathShow_draw',0
;szVersion_path_show db 'version_PathShow',0
sz_Frame_draw db 'frame_draw',0
;szVersion_frame db 'version_frame',0
include '../../develop/libraries/box_lib/import.inc'
;---------------------------------------------------------------------
align 4
scroll_bar_data_red:
+3 -85
View File
@@ -100,7 +100,7 @@ macro mz text,str1,str2,str3 {
}
;---------------------------------------------------------------------
START:
; load_library boxlib_name,buf_cmd_lin,system_path,Box_lib_import
; load_library boxlib_name,buf_cmd_lin,system_path,import_box_lib
mcall SF_SYS_MISC,SSF_HEAP_INIT
load_libraries l_libs_start,end_l_libs
@@ -1669,7 +1669,7 @@ system_dir_ProcLib db '/sys/lib/proc_lib.obj',0
align 4
l_libs_start:
library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, Box_lib_import
library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, import_box_lib
library02 l_libs system_dir_ProcLib+9, library_path, system_dir_ProcLib, ProcLib_import
@@ -1714,89 +1714,7 @@ aOpenDialog_Init db 'OpenDialog_init',0
aOpenDialog_Start db 'OpenDialog_start',0
;aOpenDialog_Version db 'Version_OpenDialog',0
;---------------------------------------------------------------------
align 4
Box_lib_import:
;init_lib dd a_init
;version_lib dd a_version
edit_box_draw dd aEdit_box_draw
edit_box_key dd aEdit_box_key
edit_box_mouse dd aEdit_box_mouse
;version_ed dd aVersion_ed
;check_box_draw dd aCheck_box_draw
;check_box_mouse dd aCheck_box_mouse
;version_ch dd aVersion_ch
option_box_draw dd aOption_box_draw
option_box_mouse dd aOption_box_mouse
;version_op dd aVersion_op
;scrollbar_ver_draw dd aScrollbar_ver_draw
;scrollbar_ver_mouse dd aScrollbar_ver_mouse
;scrollbar_hor_draw dd aScrollbar_hor_draw
;scrollbar_hor_mouse dd aScrollbar_hor_mouse
;version_scrollbar dd aVersion_scrollbar
;dinamic_button_draw dd aDbutton_draw
;dinamic_button_mouse dd aDbutton_mouse
;version_dbutton dd aVersion_dbutton
;menu_bar_draw dd aMenu_bar_draw
;menu_bar_mouse dd aMenu_bar_mouse
;menu_bar_activate dd aMenu_bar_activate
;version_menu_bar dd aVersion_menu_bar
;FileBrowser_draw dd aFileBrowser_draw
;FileBrowser_mouse dd aFileBrowser_mouse
;FileBrowser_key dd aFileBrowser_key
;Version_FileBrowser dd aVersion_FileBrowser
PathShow_prepare dd sz_PathShow_prepare
PathShow_draw dd sz_PathShow_draw
;Version_path_show dd szVersion_path_show
dd 0,0
;a_init db 'lib_init',0
;a_version db 'version',0
aEdit_box_draw db 'edit_box_draw',0
aEdit_box_key db 'edit_box_key',0
aEdit_box_mouse db 'edit_box_mouse',0
;aVersion_ed db 'version_ed',0
;aCheck_box_draw db 'check_box_draw',0
;aCheck_box_mouse db 'check_box_mouse',0
;aVersion_ch db 'version_ch',0
aOption_box_draw db 'option_box_draw',0
aOption_box_mouse db 'option_box_mouse',0
;aVersion_op db 'version_op',0
;aScrollbar_ver_draw db 'scrollbar_v_draw',0
;aScrollbar_ver_mouse db 'scrollbar_v_mouse',0
;aScrollbar_hor_draw db 'scrollbar_h_draw',0
;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0
;aVersion_scrollbar db 'version_scrollbar',0
;aDbutton_draw db 'dbutton_draw',0
;aDbutton_mouse db 'dbutton_mouse',0
;aVersion_dbutton db 'version_dbutton',0
;aMenu_bar_draw db 'menu_bar_draw',0
;aMenu_bar_mouse db 'menu_bar_mouse',0
;aMenu_bar_activate db 'menu_bar_activate',0
;aVersion_menu_bar db 'version_menu_bar',0
;aFileBrowser_draw db 'FileBrowser_draw',0
;aFileBrowser_mouse db 'FileBrowser_mouse',0
;aFileBrowser_key db 'FileBrowser_key',0
;aVersion_FileBrowser db 'version_FileBrowser',0
sz_PathShow_prepare db 'PathShow_prepare',0
sz_PathShow_draw db 'PathShow_draw',0
;szVersion_path_show db 'version_PathShow',0
include '../../develop/libraries/box_lib/import.inc'
;---------------------------------------------------------------------
PathShow_data_1:
.type dd 0 ;+0
+5 -1
View File
@@ -440,6 +440,10 @@ end if
push eax
stdcall get_index
test eax, eax ; nothing selected yet: last_x/last_y are -1
jns @f
or eax, -1 ; start the search from the first item
@@:
inc eax
mov ecx, eax
@@ -455,7 +459,7 @@ end if
shl esi, 5
add esi, list
@@:
cmpe ebx, esi, @f
cmpge ebx, esi, @f ; >=, not ==: the search may start past the list end
movzx edx, byte [ebx]
stdcall downcase_char, edx
+2 -91
View File
@@ -120,7 +120,7 @@ aButtonStyle db 'buttons_gradient',0
l_libs_start:
library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, \
Box_lib_import
import_box_lib
library02 l_libs system_dir_ProcLib+9, library_path, system_dir_ProcLib, \
ProcLib_import
@@ -150,96 +150,7 @@ aColorDialog_Init db 'ColorDialog_init',0
aColorDialog_Start db 'ColorDialog_start',0
;aOpenDialog_Version db 'Version_OpenDialog',0
;---------------------------------------------------------------------
align 4
Box_lib_import:
;init_lib dd a_init
;version_lib dd a_version
;edit_box_draw dd aEdit_box_draw
;edit_box_key dd aEdit_box_key
;edit_box_mouse dd aEdit_box_mouse
;version_ed dd aVersion_ed
;check_box_draw dd aCheck_box_draw
;check_box_mouse dd aCheck_box_mouse
;version_ch dd aVersion_ch
;option_box_draw dd aOption_box_draw
;option_box_mouse dd aOption_box_mouse
;version_op dd aVersion_op
;scrollbar_ver_draw dd aScrollbar_ver_draw
;scrollbar_ver_mouse dd aScrollbar_ver_mouse
;scrollbar_hor_draw dd aScrollbar_hor_draw
;scrollbar_hor_mouse dd aScrollbar_hor_mouse
;version_scrollbar dd aVersion_scrollbar
;dinamic_button_draw dd aDbutton_draw
;dinamic_button_mouse dd aDbutton_mouse
;version_dbutton dd aVersion_dbutton
;menu_bar_draw dd aMenu_bar_draw
;menu_bar_mouse dd aMenu_bar_mouse
;menu_bar_activate dd aMenu_bar_activate
;version_menu_bar dd aVersion_menu_bar
;FileBrowser_draw dd aFileBrowser_draw
;FileBrowser_mouse dd aFileBrowser_mouse
;FileBrowser_key dd aFileBrowser_key
;Version_FileBrowser dd aVersion_FileBrowser
PathShow_prepare dd sz_PathShow_prepare
PathShow_draw dd sz_PathShow_draw
;Version_path_show dd szVersion_path_show
Frame_draw dd sz_Frame_draw
;Version_frame dd szVersion_frame
dd 0,0
;a_init db 'lib_init',0
;a_version db 'version',0
;aEdit_box_draw db 'edit_box_draw',0
;aEdit_box_key db 'edit_box_key',0
;aEdit_box_mouse db 'edit_box_mouse',0
;aVersion_ed db 'version_ed',0
;aCheck_box_draw db 'check_box_draw',0
;aCheck_box_mouse db 'check_box_mouse',0
;aVersion_ch db 'version_ch',0
;aOption_box_draw db 'option_box_draw',0
;aOption_box_mouse db 'option_box_mouse',0
;aVersion_op db 'version_op',0
;aScrollbar_ver_draw db 'scrollbar_v_draw',0
;aScrollbar_ver_mouse db 'scrollbar_v_mouse',0
;aScrollbar_hor_draw db 'scrollbar_h_draw',0
;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0
;aVersion_scrollbar db 'version_scrollbar',0
;aDbutton_draw db 'dbutton_draw',0
;aDbutton_mouse db 'dbutton_mouse',0
;aVersion_dbutton db 'version_dbutton',0
;aMenu_bar_draw db 'menu_bar_draw',0
;aMenu_bar_mouse db 'menu_bar_mouse',0
;aMenu_bar_activate db 'menu_bar_activate',0
;aVersion_menu_bar db 'version_menu_bar',0
;aFileBrowser_draw db 'FileBrowser_draw',0
;aFileBrowser_mouse db 'FileBrowser_mouse',0
;aFileBrowser_key db 'FileBrowser_key',0
;aVersion_FileBrowser db 'version_FileBrowser',0
sz_PathShow_prepare db 'PathShow_prepare',0
sz_PathShow_draw db 'PathShow_draw',0
;szVersion_path_show db 'version_PathShow',0
sz_Frame_draw db 'frame_draw',0
;szVersion_frame db 'version_frame',0
include '../../develop/libraries/box_lib/import.inc'
;---------------------------------------------------------------------
PathShow_data_1:
.type dd 0 ;+0
+3 -6
View File
@@ -456,8 +456,7 @@ newcol:
mov [frame_data.x],ebx
mov [frame_data.y],ecx
push dword frame_data
call [Frame_draw]
stdcall [frame_draw], frame_data
pop ecx ebx
@@ -560,15 +559,13 @@ draw_window:
mov [frame_data.font_color],eax
mov [frame_data.draw_text_flag],dword 1
push dword frame_data
call [Frame_draw]
stdcall [frame_draw], frame_data
;-----------------------------------
mov [frame_data.x],dword frame_2.x shl 16+frame_2.w
mov [frame_data.y],dword frame_2.y shl 16+frame_2.height
mov [frame_data.text_pointer],dword select_skin_text
push dword frame_data
call [Frame_draw]
stdcall [frame_draw], frame_data
;-----------------------------------
call draw_PathShow
;-----------------------------------
+2 -93
View File
@@ -28,7 +28,7 @@ include_debug_strings
;-----------------------------------------------------------------------------
l_libs_start:
library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, Box_lib_import
library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, import_box_lib
library02 l_libs system_dir_ProcLib+9, library_path, system_dir_ProcLib, ProcLib_import
@@ -59,98 +59,7 @@ aOpenDialog_Start db 'OpenDialog_start',0
;aColorDialog_Start db 'ColorDialog_start',0
;aColorDialog_Version db 'Version_ColorDialog',0
;-----------------------------------------------------------------------------
align 4
Box_lib_import:
;init_lib dd a_init
;version_lib dd a_version
;edit_box_draw dd aEdit_box_draw
;edit_box_key dd aEdit_box_key
;edit_box_mouse dd aEdit_box_mouse
;version_ed dd aVersion_ed
init_checkbox dd aInit_checkbox
check_box_draw dd aCheck_box_draw
check_box_mouse dd aCheck_box_mouse
;version_ch dd aVersion_ch
;option_box_draw dd aOption_box_draw
;option_box_mouse dd aOption_box_mouse
;version_op dd aVersion_op
;scrollbar_ver_draw dd aScrollbar_ver_draw
;scrollbar_ver_mouse dd aScrollbar_ver_mouse
;scrollbar_hor_draw dd aScrollbar_hor_draw
;scrollbar_hor_mouse dd aScrollbar_hor_mouse
;version_scrollbar dd aVersion_scrollbar
;dinamic_button_draw dd aDbutton_draw
;dinamic_button_mouse dd aDbutton_mouse
;version_dbutton dd aVersion_dbutton
;menu_bar_draw dd aMenu_bar_draw
;menu_bar_mouse dd aMenu_bar_mouse
;menu_bar_activate dd aMenu_bar_activate
;version_menu_bar dd aVersion_menu_bar
;FileBrowser_draw dd aFileBrowser_draw
;FileBrowser_mouse dd aFileBrowser_mouse
;FileBrowser_key dd aFileBrowser_key
;Version_FileBrowser dd aVersion_FileBrowser
PathShow_prepare dd sz_PathShow_prepare
PathShow_draw dd sz_PathShow_draw
;Version_path_show dd szVersion_path_show
;Frame_draw dd sz_Frame_draw
;Version_frame dd szVersion_frame
dd 0,0
;a_init db 'lib_init',0
;a_version db 'version',0
;aEdit_box_draw db 'edit_box_draw',0
;aEdit_box_key db 'edit_box_key',0
;aEdit_box_mouse db 'edit_box_mouse',0
;aVersion_ed db 'version_ed',0
aInit_checkbox db 'init_checkbox2',0
aCheck_box_draw db 'check_box_draw2',0
aCheck_box_mouse db 'check_box_mouse2',0
;aVersion_ch db 'version_ch2',0
;aOption_box_draw db 'option_box_draw',0
;aOption_box_mouse db 'option_box_mouse',0
;aVersion_op db 'version_op',0
;aScrollbar_ver_draw db 'scrollbar_v_draw',0
;aScrollbar_ver_mouse db 'scrollbar_v_mouse',0
;aScrollbar_hor_draw db 'scrollbar_h_draw',0
;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0
;aVersion_scrollbar db 'version_scrollbar',0
;aDbutton_draw db 'dbutton_draw',0
;aDbutton_mouse db 'dbutton_mouse',0
;aVersion_dbutton db 'version_dbutton',0
;aMenu_bar_draw db 'menu_bar_draw',0
;aMenu_bar_mouse db 'menu_bar_mouse',0
;aMenu_bar_activate db 'menu_bar_activate',0
;aVersion_menu_bar db 'version_menu_bar',0
;aFileBrowser_draw db 'FileBrowser_draw',0
;aFileBrowser_mouse db 'FileBrowser_mouse',0
;aFileBrowser_key db 'FileBrowser_key',0
;aVersion_FileBrowser db 'version_FileBrowser',0
sz_PathShow_prepare db 'PathShow_prepare',0
sz_PathShow_draw db 'PathShow_draw',0
;szVersion_path_show db 'version_PathShow',0
;sz_Frame_draw db 'frame_draw',0
;szVersion_frame db 'version_frame',0
include '../../develop/libraries/box_lib/import.inc'
;-----------------------------------------------------------------------------
PathShow_data:
.type dd 0 ;+0
+5 -101
View File
@@ -91,7 +91,8 @@ include '../../macros.inc'
include '../../proc32.inc'
;include '../../debug.inc'
include '../../develop/libraries/box_lib/box_lib.mac'
include '../../develop/libraries/box_lib/load_lib.mac'
include '../../KOSfuncs.inc'
include '../../load_lib.mac'
include 'lang.inc' ; Language support for locales: it_IT, ru_RU (CP866), en_US
@use_library
;---------------------------------------------------------------------
@@ -964,27 +965,12 @@ end if
system_dir_Boxlib db '/sys/lib/box_lib.obj',0
system_dir_ProcLib db '/sys/lib/proc_lib.obj',0
;---------------------------------------------------------------------
head_f_i:
if lang eq it_IT
head_f_l db 'Errore Sistema',0
else
head_f_l db 'System error',0
end if
err_message_found_lib1 db 'box_lib.obj - Not found!',0
err_message_found_lib2 db 'proc_lib.obj - Not found!',0
err_message_import1 db 'box_lib.obj - Wrong import!',0
err_message_import2 db 'proc_lib.obj - Wrong import!',0
;---------------------------------------------------------------------
align 4
l_libs_start:
library01 l_libs system_dir_Boxlib+9, cur_dir_path, library_path, system_dir_Boxlib, \
err_message_found_lib1, head_f_l, Box_lib_import, err_message_import1, head_f_i
library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, import_box_lib
library02 l_libs system_dir_ProcLib+9, cur_dir_path, library_path, system_dir_ProcLib, \
err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i
library02 l_libs system_dir_ProcLib+9, library_path, system_dir_ProcLib, ProcLib_import
end_l_libs:
;---------------------------------------------------------------------
@@ -1059,89 +1045,7 @@ aOpenDialog_Init db 'OpenDialog_init',0
aOpenDialog_Start db 'OpenDialog_start',0
;aOpenDialog_Version db 'Version_OpenDialog',0
;---------------------------------------------------------------------
align 4
Box_lib_import:
;init_lib dd a_init
;version_lib dd a_version
edit_box_draw dd aEdit_box_draw
edit_box_key dd aEdit_box_key
edit_box_mouse dd aEdit_box_mouse
;version_ed dd aVersion_ed
;check_box_draw dd aCheck_box_draw
;check_box_mouse dd aCheck_box_mouse
;version_ch dd aVersion_ch
;option_box_draw dd aOption_box_draw
;option_box_mouse dd aOption_box_mouse
;version_op dd aVersion_op
;scrollbar_ver_draw dd aScrollbar_ver_draw
;scrollbar_ver_mouse dd aScrollbar_ver_mouse
;scrollbar_hor_draw dd aScrollbar_hor_draw
;scrollbar_hor_mouse dd aScrollbar_hor_mouse
;version_scrollbar dd aVersion_scrollbar
;dinamic_button_draw dd aDbutton_draw
;dinamic_button_mouse dd aDbutton_mouse
;version_dbutton dd aVersion_dbutton
;menu_bar_draw dd aMenu_bar_draw
;menu_bar_mouse dd aMenu_bar_mouse
;menu_bar_activate dd aMenu_bar_activate
;version_menu_bar dd aVersion_menu_bar
;FileBrowser_draw dd aFileBrowser_draw
;FileBrowser_mouse dd aFileBrowser_mouse
;FileBrowser_key dd aFileBrowser_key
;Version_FileBrowser dd aVersion_FileBrowser
;PathShow_prepare dd sz_PathShow_prepare
;PathShow_draw dd sz_PathShow_draw
;Version_path_show dd szVersion_path_show
dd 0,0
;a_init db 'lib_init',0
;a_version db 'version',0
aEdit_box_draw db 'edit_box_draw',0
aEdit_box_key db 'edit_box_key',0
aEdit_box_mouse db 'edit_box_mouse',0
;aVersion_ed db 'version_ed',0
;aCheck_box_draw db 'check_box_draw',0
;aCheck_box_mouse db 'check_box_mouse',0
;aVersion_ch db 'version_ch',0
;aOption_box_draw db 'option_box_draw',0
;aOption_box_mouse db 'option_box_mouse',0
;aVersion_op db 'version_op',0
;aScrollbar_ver_draw db 'scrollbar_v_draw',0
;aScrollbar_ver_mouse db 'scrollbar_v_mouse',0
;aScrollbar_hor_draw db 'scrollbar_h_draw',0
;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0
;aVersion_scrollbar db 'version_scrollbar',0
;aDbutton_draw db 'dbutton_draw',0
;aDbutton_mouse db 'dbutton_mouse',0
;aVersion_dbutton db 'version_dbutton',0
;aMenu_bar_draw db 'menu_bar_draw',0
;aMenu_bar_mouse db 'menu_bar_mouse',0
;aMenu_bar_activate db 'menu_bar_activate',0
;aVersion_menu_bar db 'version_menu_bar',0
;aFileBrowser_draw db 'FileBrowser_draw',0
;aFileBrowser_mouse db 'FileBrowser_mouse',0
;aFileBrowser_key db 'FileBrowser_key',0
;aVersion_FileBrowser db 'version_FileBrowser',0
;sz_PathShow_prepare db 'PathShow_prepare',0
;sz_PathShow_draw db 'PathShow_draw',0
;szVersion_path_show db 'version_PathShow',0
include '../../develop/libraries/box_lib/import.inc'
;---------------------------------------------------------------------
; for EDITBOX
align 4