QBASIC - maskinkode - INT21 gox.gif (837 bytes)Assembler: INT21
gox.gif (837 bytes)MASM: Qbasic - INT21

Rutinen Int21h kan benytes til at udføre MS-DOS API sytemkald.

 

INT21 funktioner:
19 : Get Default Drive
2A : Get Date
2C : Get Time

3306 : Get MS-DOS Version
36 : Get Disk Free Space
47 : Get Current Directory
6521 : Convert String : konverterer små bogstaver (også æ, ø og å) til store - og omvendt

 

2A : Get Date
Definitions
TYPE Tregs
  ax AS INTEGER
  bx AS INTEGER
  cx AS INTEGER
  dx AS INTEGER
  si AS INTEGER
  di AS INTEGER
  ec AS INTEGER
END TYPE
 
  alle benyttede CPU-registre
  + ec: error code
 
DECLARE SUB init ()
DECLARE SUB Int21h ()
  initialiserer: indlæser maskinkoden
  udfører INT21 kaldet
Registrenes Integer-data skal ofte opdeles i byte-værdier: den høje og den lave:
DECLARE FUNCTION Hi% (I%)
DECLARE FUNCTION Lo% (I%)
  returnerer den høje byte
  returnerer den lave byte
 
DIM SHARED i21 AS STRING * 80
DIM SHARED r AS Tregs
DIM SHARED int21 AS INTEGER
  til maskinkoden
  til register-data
  til maskinkodens startadresse
 
Program
I programmet vises datoen på to måder:
- først med Qbasic's datofunktion DATE$
- derefter hentes systemets dato med INT21, som også kan vise ugedagen (0-6 for søndag-lørdag):
PRINT "DATE: "; DATE$
 DATE: 06-29-2002
r.ax = &H2A00
Int21h
  INT 21 funktion 2Ah "Get Date"
  INT 21 kaldes
PRINT "Year   :"; r.cx
PRINT "Month  :"; Hi(r.dx)
PRINT "Day    :"; Lo(r.dx)
PRINT "Weekday:"; Lo(r.ax)
 Year   : 2002
 Month  : 6
 Day    : 29
 Weekday: 6
 
Subroutines and Functions
SUB init
  int21 = VARPTR(i21)
  BLOAD "int21.bin", int21
END SUB
 
 
  Maskinkoden i int21.bin >MASM: Qbasic - INT21
 
SUB Int21h
  CALL ABSOLUTE(r, int21)
END SUB
 
FUNCTION Hi% (w%)
  Hi% = (&HFF00& AND w%) \ &H100
END FUNCTION
 
FUNCTION Lo% (w%)
  Lo% = &HFF AND w%
END FUNCTION

 

2C : Get Time

Det meste dette program er identisk med programmet Get Date

Definitions
TYPE Tregs
  ax AS INTEGER
  bx AS INTEGER
  cx AS INTEGER
  dx AS INTEGER
  si AS INTEGER
  di AS INTEGER
  ec AS INTEGER
END TYPE
  
  
DECLARE SUB init ()
DECLARE SUB Int21h ()
DECLARE FUNCTION Hi% (I%)
DECLARE FUNCTION Lo% (I%)
  
initialiserer: indlæser maskinkoden
udfører INT21 kaldet og returnerer en fejlkode
returnerer den høje byte
returnerer den lave byte
DIM SHARED i21 AS STRING * 80
DIM SHARED r AS Tregs
DIM SHARED int21 AS INTEGER
til maskinkoden
til register-data
til maskinkodens startadresse
 
Program
I programmet vises klokken på to måder:
- først med Qbasic's funktion TIME$
- derefter hentes systemetklokken med INT21:
PRINT "TIME: "; TIME$
  
TIME: 21:07:03
r.ax = &H2C00
Int21h
INT 21 funktion 2Ch "Get TIme"
INT 21 kaldes
PRINT "Hour  :"; Hi(r.cx)
PRINT "Minute:"; Lo(r.cx)
PRINT "Second:"; Hi(r.dx)
Hour  : 21
Minute: 7
Second: 3
 
Subroutines and Functions
SUB init
  int21 = VARPTR(i21)
  BLOAD "int21.bin", int21
END SUB
  
 
 
  Maskinkoden i int21.bin >MASM: Qbasic - INT21
SUB Int21h%
  CALL ABSOLUTE(r, int21)
END SUB
  
FUNCTION Hi% (w%)
  Hi% = (&HFF00& AND w%) \ &H100
END FUNCTION
  
FUNCTION Lo% (w%)
  Lo% = &HFF AND w%
END FUNCTION