home *** CD-ROM | disk | FTP | other *** search
- DECLARE SUB EMSReleaseAllHandles ()
- DECLARE SUB EMSPageFrameAddress (Status%, address%)
- DECLARE SUB EMSPages (Status%, FreePages%, AllPages%)
- DECLARE SUB EMSFetchPages (Status%, howmany%, Handle%)
- DECLARE SUB EMSReleasePages (Status%, Handle%)
- DECLARE SUB EMSMapping (Status%, PageNo%, BlockNo%, Handle%)
- DECLARE SUB EMSVersion (Status%, ver%)
- DECLARE SUB EMSLockMapping (Status%, Handle%)
- DECLARE SUB EMSUnlockMapping (Status%, Handle%)
- DECLARE SUB EMSNoHandles (Status%, NoHandles%)
- DECLARE SUB EMSNoFetchedPages (Status%, Handle%, NoPages%)
- DECLARE FUNCTION EMSError$ (Status%)
- DECLARE SUB EMSStatus (Status AS INTEGER)
-
- '* ------------------------------------------------------- *
- '* EMM.BAS *
- '* stellt Prozeduren zum Zugriff auf erweiterten Speicher *
- '* unter LIM zur Verfügung. Zur Demonstration wird ein *
- '* Textfenster in den erweiterten Speicher gesichert. *
- '* (c) 1990 W.Rinke & TOOLBOX *
- '* ------------------------------------------------------- *
- TYPE Regs
- ax AS INTEGER
- bx AS INTEGER
- cx AS INTEGER
- dx AS INTEGER
- bp AS INTEGER
- si AS INTEGER
- di AS INTEGER
- Flags AS INTEGER
- ds AS INTEGER
- es AS INTEGER
- END TYPE
-
- DIM SHARED InRegs AS Regs, OutRegs AS Regs
- DIM VideoBuffer%(4000)
-
- CLS
-
- '* Feststellen, ob überhaupt EMS zur Verfügung steht
- EMSStatus (Status%)
- IF Status% = 0 THEN
-
- CALL EMSVersion(Status%, ver%)
- IF Status% <> 0 THEN
- PRINT EMSError$(Status%)
- END
- END IF
- PRINT "EMS-Version: "; STR$(ver% \ 10); ".";
- PRINT LTRIM$(STR$(ver% MOD 10))
-
- CALL EMSPages(Status%, FreePages%, AllPages%)
- IF Status% <> 0 THEN
- PRINT EMSError$(Status%)
- END
- END IF
- PRINT "Anzahl EMS-Seiten: "; AllPages%; " = ";
- PRINT USING "####"; AllPages% * 16;
- PRINT " KByte"
- PRINT "Freie EMS-Seiten: "; FreePages%; " = ";
- PRINT USING "####"; FreePages% * 16;
- PRINT " KByte"
-
- CALL EMSPageFrameAddress(Status%, address%)
- IF Status% <> 0 THEN
- PRINT EMSError$(Status%)
- END
- END IF
- PRINT "Adresse Page-Frame: "; HEX$(address%)
-
- CALL EMSFetchPages(Status%, 1, Handle%)
- '* eine Seite allokieren. Zugriff über den Handle
- IF Status% <> 0 THEN
- PRINT EMSError$(Status%)
- END
- END IF
- CALL EMSMapping(Status%, 0, 0, Handle%)
- '* Mapping setzen auf erste logische Seite im Page-Frame
- IF Status% <> 0 THEN
- EMSReleaseAllHandles
- PRINT EMSError$(Status%)
- END
- END IF
-
- DEF SEG = &H40
- VideoMode% = PEEK(&H49)
- DEF SEG
- IF VideoMode% = 7 THEN
- DEF SEG = &HB000
- ELSE
- DEF SEG = &HB800
- END IF
-
- FOR i% = 0 TO 3999
- VideoBuffer%(i%) = PEEK(i%)
- NEXT i%
-
- DEF SEG = address%
- FOR i% = 0 TO 3999
- POKE i%, VideoBuffer%(i%)
- NEXT i%
- DEF SEG
-
- PRINT "Bildschirm ist jetzt im EMS gesichert"
-
- PRINT : PRINT "Bitte eine Taste drücken"
- Taste$ = ""
- DO
- Taste$ = INKEY$
- LOOP UNTIL Taste$ <> ""
-
- CLS
- FOR i% = 0 TO 3999
- VideoBuffer%(i%) = 0
- NEXT i%
-
- PRINT "alter Bildschirm gelöscht."
- PRINT : PRINT "Bitte eine Taste drücken"
- Taste$ = ""
- DO
- Taste$ = INKEY$
- LOOP UNTIL Taste$ <> ""
-
- DEF SEG = address%
- FOR i% = 0 TO 3999
- VideoBuffer%(i%) = PEEK(i%)
- NEXT i%
-
- DEF SEG = &H40
- VideoMode% = PEEK(&H49)
- DEF SEG
- IF VideoMode% = 7 THEN
- DEF SEG = &HB000
- ELSE
- DEF SEG = &HB800
- END IF
-
- FOR i% = 0 TO 3999
- POKE i%, VideoBuffer%(i%)
- NEXT i%
-
- EMSReleaseAllHandles
-
- ELSE
- PRINT EMSError$(Status%)
- END
- END IF
-
- END
-
-
- FUNCTION EMSError$ (Status%)
- SELECT CASE Status%
- CASE IS = &H80
- EMSError$ = "Fehler in EMS-Software"
- CASE IS = &H81
- EMSError$ = "Fehler in EMS-Hardware"
- CASE IS = &H83
- EMSError$ = "ungültiger EMS-Handle"
- CASE IS = &H84
- EMSError$ = "ungültige EMS-Funktion"
- CASE IS = &H85
- EMSError$ = "keine EMS-Handles mehr verfügbar"
- CASE IS = &H87
- EMSError$ = "Überlauf im EMS-Seitenzähler"
- CASE IS = &H88
- EMSError$ = "Fehler im EMS-Seitenzähler"
- CASE IS = &H89
- EMSError$ = "Null EMS-Seiten angefordert"
- CASE IS = &H8A
- EMSError = "keine logische Seite für EMS-Handle"
- CASE IS = &H8B
- EMSError = "EMS-Seite außerhalb des gültigen Bereichs"
- CASE IS = &H8C
- EMSError = "Zuständiger EMS-Stack ohne Speicher"
- CASE IS = &H8D
- EMSError = "EMS-Handle bereits Stack zugewiesen"
- CASE IS = &H8E
- EMSError = "EMS-Handle ohne zuständigen Stack"
- CASE IS = &H8F
- EMSError = "Unbekannter EMS-Unterfunktions-Code"
- CASE ELSE
- EMSError = "EMS-Fehler"
- END SELECT
- END FUNCTION
-
- SUB EMSFetchPages (Status%, howmany%, Handle%)
- InRegs.ax = &H4300
- InRegs.bx = howmany%
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax
- Handle% = OutRegs.dx
- END SUB
-
- SUB EMSLockMapping (Status%, Handle%)
- InRegs.ax = &H4700
- InRegs.dx = Handle%
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax \ 256
- END SUB
-
- SUB EMSMapping (Status%, PageNo%, BlockNo%, Handle%)
- InRegs.ax = &H4400 + PageNo%
- InRegs.bx = BlockNo%
- InRegs.dx = Handle%
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- ststus% = OutRegs.ax
- END SUB
-
- SUB EMSNoFetchedPages (Status%, Handle%, NoPages%)
- InRegs.ax = &H4C00
- InRegs.dx = Handle%
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax
- NoPages% = OutRegs.bx
- END SUB
-
- SUB EMSNoHandles (Status%, NoHandles%)
- InRegs.ax = &H4B00
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax
- NoHandles% = OutRegs.bx
- END SUB
-
- SUB EMSPageFrameAddress (Status%, address%)
- InRegs.ax = &H4100
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax
- address% = OutRegs.bx
- END SUB
-
- SUB EMSPages (Status%, FreePages%, AllPages%)
- InRegs.ax = &H4200
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax
- FreePages% = OutRegs.bx
- AllPages% = OutRegs.dx
- END SUB
-
- SUB EMSReleaseAllHandles
- CALL EMSNoHandles(Status%, NoHandles%)
- IF Status% <> 0 THEN
- PRINT EMSError$(Status%)
- END
- END IF
- FOR i% = NoHandles% - 1 TO 1 STEP -1
- CALL EMSReleasePages(Status%, i%)
- IF Status% <> 0 THEN
- PRINT EMSError$(Status%)
- END
- END IF
- NEXT i%
- END SUB
-
- SUB EMSReleasePages (Status%, Handle%)
- InRegs.ax = &H4500
- InRegs.dx = Handle%
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax
- END SUB
-
- SUB EMSStatus (Status AS INTEGER)
- InRegs.ax = &H4000
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status = OutRegs.ax
- END SUB
-
- SUB EMSUnlockMapping (Status%, Handle%)
- InRegs.ax = &H4800
- InRegs.dx = Handle%
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax \ 256
- END SUB
-
- SUB EMSVersion (Status%, ver%)
- InRegs.ax = &H4600
- CALL INTERRUPT(&H67, InRegs, OutRegs)
- Status% = OutRegs.ax \ 256
- ver% = OutRegs.ax MOD 256
- END SUB
- '* ------------------------------------------------------- *
- '* Ende von EMM.BAS *
-