> On Feb 27, 2025, at 4:22 PM, Folkert van Heusden via Freedos-devel
> <[email protected]> wrote:
>
> Hi,
>
> I'm writing a PC-emulator (8088 and 8086).
> At this point MS-DOS 6.22 works fine. I can type commands and start and
> play e.g. DOOM8088.
> Of course I also would like FreeDOS to run. Booting the installer floppy
> works fine to a certain point. I get the menu where I can select a
> language. After I press enter, I see the text asking if I'm sure to
> continue and that's the point where things fail: the keypress is
> registered by the bios (stored in the keyboard buffer, is what I read in
> the disassembly) but the FreeDOS kernel does not seem to pick it up.
> What should retrieve it? A timer or so? Any ideas?
>
> Thanks
>
>
> regards
Most of the text output and prompting in the installer are handled by V8Power
Tools.
Text input is not handled through DOS. The tools talk directly to the BIOS.
Same goes for their text output.
At the startup of the installer, when prompted to continue, the input is
handled by VASK.COM.
The input loop in VASK starts around line 110 [1].
But for simplicity, here is a copy (with some comments added)…
.WaitLoop:
GotoXY dx ; position cursor to
correct location
IdleCPU ; see below
mov ax, 0x0100
int 0x16 ; call BIOS keyboard
interrupt [3]
jz .WaitLoop ; is there no key
waiting repeat loop
mov ax, 0x0000
int 0x16 ; call BIOS keyboard
interrupt [4]
cmp al, 0x03 ; test for
CTRL+C
jne .NotCtrlC
mov al, [ControlC]
test al, al ; test if CTRL+C is
allowed
jz .NotExact ; no, then ignore
Terminate 0xc8 ; terminate with
special exit code
.NotCtrlC:
The IdleCPU function [2] is a little more complex. It will first try to use DOS
to perform the Idle for power reduction.
However if that is not supported, it will simply fall back on the CPU HLT
instruction. The CPU will remain idle until the
Next interrupt occurs (like keypress, timer tick, etc.).
The macro can also be set programmatically to not use either method which will
use more power.
%imacro IdleCPUHandler 0
IdleCPUHandlerProc:
pushf
push ax
mov al, [%%IdleCPUData]
cmp al, 1
ja %%NoIdle
je %%Alternate
; DOS 5.00+, Windows 3+ -- Release current VM time slice [5].
mov ax, 0x1680
int 0x2f
cmp al, 0x00
je %%Done
mov al, 1
mov [%%IdleCPUData], al
%%Alternate:
hlt
%%NoIdle:
%%Done:
pop ax
popf
ret
%%IdleCPUData:
db 0
%endmacro
%imacro IdleCPU 0
call IdleCPUHandlerProc
%endmacro
So, there really isn’t anything fancy or special going on.
:-)
Jerome
[1]
https://github.com/LoopZ/V8Power/blob/0fad04f5c46e02824c052569ba74d20d0289d6df/SOURCE/VASK.ASM#L110
[2]
https://github.com/LoopZ/V8Power/blob/0fad04f5c46e02824c052569ba74d20d0289d6df/SOURCE/COMMON.INC#L56
[3] https://fd.lod.bz/rbil/interrup/bios/1601.html#1792
[4] https://fd.lod.bz/rbil/interrup/bios/1600.html#1791
[5] https://fd.lod.bz/rbil/interrup/windows/2f1680.html#4575
_______________________________________________
Freedos-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freedos-devel