Kaynağa Gözat

+ enabled compilation of the 'fv' package for i8086-msdos

git-svn-id: trunk@37744 -
nickysn 7 yıl önce
ebeveyn
işleme
aebc0a74f7
2 değiştirilmiş dosya ile 104 ekleme ve 40 silme
  1. 1 1
      packages/fv/fpmake.pp
  2. 103 39
      packages/fv/src/time.pas

+ 1 - 1
packages/fv/fpmake.pp

@@ -20,7 +20,7 @@ begin
     P.Author := 'Leon De Boer and Pierre Mueller';
     P.License := 'LGPL with modification, ';
     P.HomepageURL := 'www.freepascal.org';
-    P.OSes := [beos,haiku,freebsd,darwin,iphonesim,solaris,netbsd,openbsd,linux,win16,win32,win64,os2,emx,netware,netwlibc,go32v2,aix,dragonfly]+AllAmigaLikeOSes;
+    P.OSes := [beos,haiku,freebsd,darwin,iphonesim,solaris,netbsd,openbsd,linux,win16,win32,win64,os2,emx,netware,netwlibc,go32v2,msdos,aix,dragonfly]+AllAmigaLikeOSes;
     P.Email := '';
     P.Description := 'Free Vision, a portable Turbo Vision clone.';
     P.NeedLibC:= false;

+ 103 - 39
packages/fv/src/time.pas

@@ -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 }