QUICBASI C 4.5 Программа теперь в QB64 - PullRequest
0 голосов
/ 03 февраля 2020

Я взял приложение QB45 и создал из него приложение QB64, содержащее более 100 000 строк кода. Все цены были жестко запрограммированы в программе, поэтому я начал читать из файлов CSV, но теперь мне нужна дата из файла CSV, не помещая каталог в текстовый файл и не читая дату. Я нашел этот код ниже

Проблема при запуске заключается в том, что ассемблер предназначен для 16-битных регистров, и я использую 32 или 64 с windows 7 и ядром i5. Может кто-нибудь помочь мне выяснить, как дата будет возвращена в более длинном значении int из регистра?

'===========================================================================

' Subject: GET/SET FILE DATE/TIME            Date: Unknown Date (00:00)   
' Author:  Matt Hart                         Code: QB, PDS               
' Keys:    GET,SET,FILE,DATE,TIME          Packet: DOS.ABC
'===========================================================================
' FILEDATE.BAS  by Matt Hart
'
' Gets or sets a file date/time
'
' GetFileDateTime returns the Date in MM-DD-YYYY format
'                     and the Time in HH:MM:SS
' SetFileDateTime expects the Date and Time in the same formats

    '$INCLUDE: 'QB.BI'    ' Use your path to QB or QBX.BI
    DEFINT A-Z
    DECLARE SUB GetFileDateTime (F$, Dat$, Tim$, Ecode%)
    DECLARE SUB SetFileDateTime (F$, Dat$, Tim$, Ecode%)

' ------------------------- Sample code
    F$ = LTRIM$(RTRIM$(COMMAND$))
    CALL GetFileDateTime(F$, Dat$, Tim$, Ecode)
    IF NOT Ecode THEN
           PRINT F$; " date is "; Dat$
           PRINT F$; " time is "; Tim$
    ELSE
           PRINT "1 Error = "; Ecode
           END
    END IF
    NewTim$ = "01:01:02"
    NewDat$ = "02-02-1980"
    CALL SetFileDateTime(F$, NewDat$, NewTim$, Ecode)
    IF Ecode THEN
           PRINT "2 Error = "; Ecode
           END
    END IF
    CALL GetFileDateTime(F$, Dat$, Tim$, Ecode)
    IF Ecode THEN
           PRINT "3 Error = "; Ecode
           END
    END IF
    PRINT F$; " new date is "; Dat$
    PRINT F$; " new time is "; Tim$
    CALL SetFileDateTime(F$, Dat$, Tim$, Ecode)
    IF Ecode THEN
           PRINT "4 Error = "; Ecode
           END
    END IF
    END
' ------------------------------------

SUB GetFileDateTime (F$, Dat$, Tim$, Ecode)
    Ecode = 0
    DIM InRegs AS RegTypeX
    DIM OutRegs AS RegTypeX
    InRegs.ax = &H3D00                          ' Open file function
    DIM FileName AS STRING * 128                ' Use fixed length
    FileName = F$ + CHR$(0)                     ' Must be ASCIIZ string
    InRegs.ds = VARSEG(FileName)                ' Fixed length makes these
    InRegs.dx = VARPTR(FileName)                ' come out right
    CALL INTERRUPTX(&H21, InRegs, OutRegs)      ' Open the file
    IF NOT OutRegs.flags THEN                   ' No error
           Handle = OutRegs.ax                     ' Save DOS file handle
           InRegs.ax = &H5700                      ' Get date/time function
           InRegs.bx = Handle
           CALL INTERRUPTX(&H21, InRegs, OutRegs)
           HMS& = OutRegs.cx                       ' Use long integer for
           IF HMS& < 0& THEN HMS& = 65536 + HMS&   ' positive numbers
           Hours = HMS& \ 2048&                    ' Hours is first 5 bits
           Minutes = (HMS& AND 2047&) \ 31&        ' Minutes is next 6 bits
           Seconds = HMS& AND 31&                  ' Seconds is last 5 bits
           H$ = LTRIM$(STR$(Hours))
           M$ = LTRIM$(STR$(Minutes)): IF LEN(M$) = 1 THEN M$ = "0" + M$
           S$ = LTRIM$(STR$(Seconds)): IF LEN(S$) = 1 THEN S$ = "0" + S$
           Tim$ = H$ + ":" + M$ + ":" + S$
           YMD& = OutRegs.dx                       ' Long int here too
           IF YMD& < 0 THEN YMD& = 65536 + YMD&    ' Convert to + if needed
           Year = 1980& + YMD& \ 512&              ' Year is first 7 bits
           Month = (YMD& AND 511&) \ 31&           ' Month is next 4 bits
           Day = YMD& AND 31&                      ' Day is last 5 bits
           Y$ = LTRIM$(STR$(Year))
           M$ = LTRIM$(STR$(Month))
           D$ = LTRIM$(STR$(Day)): IF LEN(D$) = 1 THEN D$ = "0" + D$
           Dat$ = M$ + "-" + D$ + "-" + Y$
           InRegs.ax = &H3E00                      ' Close file function
           InRegs.bx = Handle
           CALL INTERRUPTX(&H21, InRegs, OutRegs)  ' Close it
    ELSE

           Ecode = OutRegs.flags       ' Otherwise return error flags
    END IF
END SUB

SUB SetFileDateTime (F$, Dat$, Tim$, Ecode)
    Ecode = 0
    DIM InRegs AS RegTypeX
    DIM OutRegs AS RegTypeX
    InRegs.ax = &H3D00
    DIM FileName AS STRING * 128
    FileName = F$ + CHR$(0)
    InRegs.ds = VARSEG(FileName)
    InRegs.dx = VARPTR(FileName)
    CALL INTERRUPTX(&H21, InRegs, OutRegs)
    IF NOT OutRegs.flags THEN
           Handle = OutRegs.ax
           InRegs.ax = &H5701
           InRegs.bx = Handle
           Hours& = VAL(LEFT$(Tim$, 2)) * 2048&
           Minutes& = VAL(MID$(Tim$, 4, 2)) * 32&
           Seconds& = VAL(RIGHT$(Tim$, 2)) \ 2
           HMS& = Hours& + Minutes& + Seconds&
           IF HMS& > 65536 THEN
                  InRegs.cx = 65536 - HMS&
           ELSE
                  InRegs.cx = HMS&
           END IF
           Year& = (VAL(RIGHT$(Dat$, 4)) - 1980&) * 512&
           Month& = VAL(LEFT$(Dat$, 2)) * 32&
           Day& = VAL(MID$(Dat$, 4, 2))
           YMD& = Year& + Month& + Day&
           IF YMD& > 65536 THEN
                  InRegs.dx = 65536 - YMD&
           ELSE
                  InRegs.dx = YMD&
           END IF
           CALL INTERRUPTX(&H21, InRegs, OutRegs)
           InRegs.ax = &H3E00
           InRegs.bx = Handle
           CALL INTERRUPTX(&H21, InRegs, OutRegs)
    ELSE
           Ecode = OutRegs.flags
    END IF
END SUB
...