|
@@ -264,18 +264,32 @@ PROCEDURE SetTime (Hour, Minute, Second, Sec100: Word);
|
|
|
END;
|
|
|
{$ENDIF}
|
|
|
{$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
|
|
|
- BEGIN
|
|
|
- ASM
|
|
|
- MOVB Hour, %CH; { Fetch hour }
|
|
|
- MOVB Minute, %CL; { Fetch minute }
|
|
|
- MOVB Second, %DH; { Fetch second }
|
|
|
- MOVB Sec100, %DL; { Fetch hundredths }
|
|
|
- MOVW $0x2D00, %AX; { Set function id }
|
|
|
- PUSHL %EBP; { Save register }
|
|
|
- INT $0x21; { BIOS set time }
|
|
|
- POPL %EBP; { Restore register }
|
|
|
- END;
|
|
|
- END;
|
|
|
+ {$IFDEF BIT_16}
|
|
|
+ ASSEMBLER;
|
|
|
+ ASM
|
|
|
+ MOV CH, BYTE PTR Hour; { Fetch hour }
|
|
|
+ MOV CL, BYTE PTR Minute; { Fetch minute }
|
|
|
+ MOV DH, BYTE PTR Second; { Fetch second }
|
|
|
+ MOV DL, BYTE PTR Sec100; { Fetch hundredths }
|
|
|
+ MOV AX, $2D00; { Set function id }
|
|
|
+ PUSH BP; { Safety save register }
|
|
|
+ INT $21; { Set the time }
|
|
|
+ POP BP; { Restore register }
|
|
|
+ END;
|
|
|
+ {$ELSE}
|
|
|
+ BEGIN
|
|
|
+ ASM
|
|
|
+ MOVB Hour, %CH; { Fetch hour }
|
|
|
+ MOVB Minute, %CL; { Fetch minute }
|
|
|
+ MOVB Second, %DH; { Fetch second }
|
|
|
+ MOVB Sec100, %DL; { Fetch hundredths }
|
|
|
+ MOVW $0x2D00, %AX; { Set function id }
|
|
|
+ PUSHL %EBP; { Save register }
|
|
|
+ INT $0x21; { BIOS set time }
|
|
|
+ POPL %EBP; { Restore register }
|
|
|
+ END;
|
|
|
+ END;
|
|
|
+ {$ENDIF}
|
|
|
{$ENDIF}
|
|
|
{$ENDIF}
|
|
|
{$IFDEF OS_WIN16} { 16 BIT WINDOWS CODE }
|
|
@@ -377,33 +391,83 @@ PROCEDURE GetTime (Var Hour, Minute, Second, Sec100: Word);
|
|
|
STOSW; { Return hours }
|
|
|
END;
|
|
|
{$ENDIF}
|
|
|
- {$IFDEF OS_GO32} { FPC COMPATABLE ASM }
|
|
|
- BEGIN
|
|
|
- (* ASM
|
|
|
- MOVW $0x2C00, %AX; { Set function id }
|
|
|
- PUSHL %EBP; { Save register }
|
|
|
- INT $0x21; { System get time }
|
|
|
- POPL %EBP; { Restore register }
|
|
|
- XORB %AH, %AH; { Clear register }
|
|
|
- MOVB %DL, %AL; { Transfer register }
|
|
|
- MOVL Sec100, %EDI; { EDI -> Sec100 }
|
|
|
- MOVW %AX, (%EDI); { Return Sec100 }
|
|
|
- MOVB %DH, %AL; { Transfer register }
|
|
|
- MOVL Second, %EDI; { EDI -> Second }
|
|
|
- MOVW %AX, (%EDI); { Return Second }
|
|
|
- MOVB %CL, %AL; { Transfer register }
|
|
|
- MOVL Minute, %EDI; { EDI -> Minute }
|
|
|
- MOVW %AX, (%EDI); { Return minute }
|
|
|
- MOVB %CH, %AL; { Transfer register }
|
|
|
- MOVL Hour, %EDI; { EDI -> Hour }
|
|
|
- MOVW %AX, (%EDI); { Return hour }
|
|
|
- END; *)
|
|
|
- { direct call of real interrupt seems to render the system
|
|
|
- unstable on Win2000 because some registers are not properly
|
|
|
- restored if a mouse interrupt is generated while the Dos
|
|
|
- interrupt is called... PM }
|
|
|
- Dos.GetTime(Hour,Minute,Second,Sec100);
|
|
|
- END;
|
|
|
+ {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
|
|
|
+ {$IFDEF BIT_16}
|
|
|
+ {$IFDEF FPC_X86_DATA_NEAR}
|
|
|
+ ASSEMBLER;
|
|
|
+ ASM
|
|
|
+ MOV AX, $2C00; { Set function id }
|
|
|
+ PUSH BP; { Safety save register }
|
|
|
+ INT $21; { System get time }
|
|
|
+ POP BP; { Restore register }
|
|
|
+ XOR AH, AH; { Clear register }
|
|
|
+ CLD; { Strings go forward }
|
|
|
+ MOV AL, DL; { Transfer register }
|
|
|
+ PUSH DS
|
|
|
+ POP ES
|
|
|
+ MOV DI, Sec100; { ES:DI -> hundredths }
|
|
|
+ STOSW; { Return hundredths }
|
|
|
+ MOV AL, DH; { Transfer register }
|
|
|
+ MOV DI, Second; { ES:DI -> seconds }
|
|
|
+ STOSW; { Return seconds }
|
|
|
+ MOV AL, CL; { Transfer register }
|
|
|
+ MOV DI, Minute; { ES:DI -> minutes }
|
|
|
+ STOSW; { Return minutes }
|
|
|
+ MOV AL, CH; { Transfer register }
|
|
|
+ MOV DI, Hour; { ES:DI -> hours }
|
|
|
+ STOSW; { Return hours }
|
|
|
+ END;
|
|
|
+ {$ELSE FPC_X86_DATA_NEAR}
|
|
|
+ ASSEMBLER;
|
|
|
+ ASM
|
|
|
+ MOV AX, $2C00; { Set function id }
|
|
|
+ PUSH BP; { Safety save register }
|
|
|
+ INT $21; { System get time }
|
|
|
+ POP BP; { Restore register }
|
|
|
+ XOR AH, AH; { Clear register }
|
|
|
+ CLD; { Strings go forward }
|
|
|
+ MOV AL, DL; { Transfer register }
|
|
|
+ LES DI, Sec100; { ES:DI -> hundredths }
|
|
|
+ STOSW; { Return hundredths }
|
|
|
+ MOV AL, DH; { Transfer register }
|
|
|
+ LES DI, Second; { ES:DI -> seconds }
|
|
|
+ STOSW; { Return seconds }
|
|
|
+ MOV AL, CL; { Transfer register }
|
|
|
+ LES DI, Minute; { ES:DI -> minutes }
|
|
|
+ STOSW; { Return minutes }
|
|
|
+ MOV AL, CH; { Transfer register }
|
|
|
+ LES DI, Hour; { ES:DI -> hours }
|
|
|
+ STOSW; { Return hours }
|
|
|
+ END;
|
|
|
+ {$ENDIF}
|
|
|
+ {$ELSE}
|
|
|
+ BEGIN
|
|
|
+ (* ASM
|
|
|
+ MOVW $0x2C00, %AX; { Set function id }
|
|
|
+ PUSHL %EBP; { Save register }
|
|
|
+ INT $0x21; { System get time }
|
|
|
+ POPL %EBP; { Restore register }
|
|
|
+ XORB %AH, %AH; { Clear register }
|
|
|
+ MOVB %DL, %AL; { Transfer register }
|
|
|
+ MOVL Sec100, %EDI; { EDI -> Sec100 }
|
|
|
+ MOVW %AX, (%EDI); { Return Sec100 }
|
|
|
+ MOVB %DH, %AL; { Transfer register }
|
|
|
+ MOVL Second, %EDI; { EDI -> Second }
|
|
|
+ MOVW %AX, (%EDI); { Return Second }
|
|
|
+ MOVB %CL, %AL; { Transfer register }
|
|
|
+ MOVL Minute, %EDI; { EDI -> Minute }
|
|
|
+ MOVW %AX, (%EDI); { Return minute }
|
|
|
+ MOVB %CH, %AL; { Transfer register }
|
|
|
+ MOVL Hour, %EDI; { EDI -> Hour }
|
|
|
+ MOVW %AX, (%EDI); { Return hour }
|
|
|
+ END; *)
|
|
|
+ { direct call of real interrupt seems to render the system
|
|
|
+ unstable on Win2000 because some registers are not properly
|
|
|
+ restored if a mouse interrupt is generated while the Dos
|
|
|
+ interrupt is called... PM }
|
|
|
+ Dos.GetTime(Hour,Minute,Second,Sec100);
|
|
|
+ END;
|
|
|
+ {$ENDIF}
|
|
|
{$ENDIF}
|
|
|
{$ENDIF}
|
|
|
{$IFDEF OS_WIN16} { 16 BIT WINDOWS CODE }
|