home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 03 / heimwerk / emm.bas next >
Encoding:
BASIC Source File  |  1989-12-19  |  6.9 KB  |  283 lines

  1. DECLARE SUB EMSReleaseAllHandles ()
  2. DECLARE SUB EMSPageFrameAddress (Status%, address%)
  3. DECLARE SUB EMSPages (Status%, FreePages%, AllPages%)
  4. DECLARE SUB EMSFetchPages (Status%, howmany%, Handle%)
  5. DECLARE SUB EMSReleasePages (Status%, Handle%)
  6. DECLARE SUB EMSMapping (Status%, PageNo%, BlockNo%, Handle%)
  7. DECLARE SUB EMSVersion (Status%, ver%)
  8. DECLARE SUB EMSLockMapping (Status%, Handle%)
  9. DECLARE SUB EMSUnlockMapping (Status%, Handle%)
  10. DECLARE SUB EMSNoHandles (Status%, NoHandles%)
  11. DECLARE SUB EMSNoFetchedPages (Status%, Handle%, NoPages%)
  12. DECLARE FUNCTION EMSError$ (Status%)
  13. DECLARE SUB EMSStatus (Status AS INTEGER)
  14.  
  15. '* ------------------------------------------------------- *
  16. '*                      EMM.BAS                            *
  17. '*  stellt Prozeduren zum Zugriff auf erweiterten Speicher *
  18. '*  unter LIM zur Verfügung. Zur Demonstration wird ein    *
  19. '*  Textfenster in den erweiterten Speicher gesichert.     *
  20. '*            (c) 1990 W.Rinke & TOOLBOX                   *
  21. '* ------------------------------------------------------- *
  22. TYPE Regs
  23.   ax AS INTEGER
  24.   bx AS INTEGER
  25.   cx AS INTEGER
  26.   dx AS INTEGER
  27.   bp AS INTEGER
  28.   si AS INTEGER
  29.   di AS INTEGER
  30.   Flags AS INTEGER
  31.   ds AS INTEGER
  32.   es AS INTEGER
  33. END TYPE
  34.  
  35. DIM SHARED InRegs AS Regs, OutRegs AS Regs
  36. DIM VideoBuffer%(4000)
  37.  
  38. CLS
  39.  
  40. '* Feststellen, ob überhaupt EMS zur Verfügung steht
  41. EMSStatus (Status%)
  42. IF Status% = 0 THEN
  43.  
  44.   CALL EMSVersion(Status%, ver%)
  45.   IF Status% <> 0 THEN
  46.     PRINT EMSError$(Status%)
  47.     END
  48.   END IF
  49.   PRINT "EMS-Version:       "; STR$(ver% \ 10); ".";
  50.   PRINT LTRIM$(STR$(ver% MOD 10))
  51.  
  52.   CALL EMSPages(Status%, FreePages%, AllPages%)
  53.   IF Status% <> 0 THEN
  54.     PRINT EMSError$(Status%)
  55.     END
  56.   END IF
  57.   PRINT "Anzahl EMS-Seiten: "; AllPages%; "   = ";
  58.   PRINT USING "####"; AllPages% * 16;
  59.   PRINT " KByte"
  60.   PRINT "Freie  EMS-Seiten: "; FreePages%; "   = ";
  61.   PRINT USING "####"; FreePages% * 16;
  62.   PRINT " KByte"
  63.  
  64.   CALL EMSPageFrameAddress(Status%, address%)
  65.   IF Status% <> 0 THEN
  66.     PRINT EMSError$(Status%)
  67.     END
  68.   END IF
  69.   PRINT "Adresse Page-Frame: "; HEX$(address%)
  70.  
  71.   CALL EMSFetchPages(Status%, 1, Handle%)
  72.   '* eine Seite allokieren. Zugriff über den Handle
  73.   IF Status% <> 0 THEN
  74.     PRINT EMSError$(Status%)
  75.     END
  76.   END IF
  77.   CALL EMSMapping(Status%, 0, 0, Handle%)
  78.   '* Mapping setzen auf erste logische Seite im Page-Frame
  79.   IF Status% <> 0 THEN
  80.     EMSReleaseAllHandles
  81.     PRINT EMSError$(Status%)
  82.     END
  83.   END IF
  84.  
  85.   DEF SEG = &H40
  86.     VideoMode% = PEEK(&H49)
  87.   DEF SEG
  88.   IF VideoMode% = 7 THEN
  89.     DEF SEG = &HB000
  90.   ELSE
  91.     DEF SEG = &HB800
  92.   END IF
  93.  
  94.   FOR i% = 0 TO 3999
  95.     VideoBuffer%(i%) = PEEK(i%)
  96.   NEXT i%
  97.  
  98.   DEF SEG = address%
  99.   FOR i% = 0 TO 3999
  100.     POKE i%, VideoBuffer%(i%)
  101.   NEXT i%
  102.   DEF SEG
  103.  
  104.   PRINT "Bildschirm ist jetzt im EMS gesichert"
  105.  
  106.   PRINT : PRINT "Bitte eine Taste drücken"
  107.   Taste$ = ""
  108.   DO
  109.     Taste$ = INKEY$
  110.   LOOP UNTIL Taste$ <> ""
  111.  
  112.   CLS
  113.   FOR i% = 0 TO 3999
  114.     VideoBuffer%(i%) = 0
  115.   NEXT i%
  116.  
  117.   PRINT "alter Bildschirm gelöscht."
  118.   PRINT : PRINT "Bitte eine Taste drücken"
  119.   Taste$ = ""
  120.   DO
  121.     Taste$ = INKEY$
  122.   LOOP UNTIL Taste$ <> ""
  123.  
  124.   DEF SEG = address%
  125.   FOR i% = 0 TO 3999
  126.     VideoBuffer%(i%) = PEEK(i%)
  127.   NEXT i%
  128.  
  129.   DEF SEG = &H40
  130.     VideoMode% = PEEK(&H49)
  131.   DEF SEG
  132.   IF VideoMode% = 7 THEN
  133.     DEF SEG = &HB000
  134.   ELSE
  135.     DEF SEG = &HB800
  136.   END IF
  137.  
  138.   FOR i% = 0 TO 3999
  139.     POKE i%, VideoBuffer%(i%)
  140.   NEXT i%
  141.  
  142.   EMSReleaseAllHandles
  143.  
  144. ELSE
  145.   PRINT EMSError$(Status%)
  146.   END
  147. END IF
  148.  
  149. END
  150.  
  151.  
  152. FUNCTION EMSError$ (Status%)
  153.   SELECT CASE Status%
  154.     CASE IS = &H80
  155.       EMSError$ = "Fehler in EMS-Software"
  156.     CASE IS = &H81
  157.       EMSError$ = "Fehler in EMS-Hardware"
  158.     CASE IS = &H83
  159.       EMSError$ = "ungültiger EMS-Handle"
  160.     CASE IS = &H84
  161.       EMSError$ = "ungültige EMS-Funktion"
  162.     CASE IS = &H85
  163.       EMSError$ = "keine EMS-Handles mehr verfügbar"
  164.     CASE IS = &H87
  165.       EMSError$ = "Überlauf im EMS-Seitenzähler"
  166.     CASE IS = &H88
  167.       EMSError$ = "Fehler im EMS-Seitenzähler"
  168.     CASE IS = &H89
  169.       EMSError$ = "Null EMS-Seiten angefordert"
  170.     CASE IS = &H8A
  171.       EMSError = "keine logische Seite für EMS-Handle"
  172.     CASE IS = &H8B
  173.       EMSError = "EMS-Seite außerhalb des gültigen Bereichs"
  174.     CASE IS = &H8C
  175.       EMSError = "Zuständiger EMS-Stack ohne Speicher"
  176.     CASE IS = &H8D
  177.       EMSError = "EMS-Handle bereits Stack zugewiesen"
  178.     CASE IS = &H8E
  179.       EMSError = "EMS-Handle ohne zuständigen Stack"
  180.     CASE IS = &H8F
  181.       EMSError = "Unbekannter EMS-Unterfunktions-Code"
  182.     CASE ELSE
  183.       EMSError = "EMS-Fehler"
  184.   END SELECT
  185. END FUNCTION
  186.  
  187. SUB EMSFetchPages (Status%, howmany%, Handle%)
  188.   InRegs.ax = &H4300
  189.   InRegs.bx = howmany%
  190.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  191.   Status% = OutRegs.ax
  192.   Handle% = OutRegs.dx
  193. END SUB
  194.  
  195. SUB EMSLockMapping (Status%, Handle%)
  196.   InRegs.ax = &H4700
  197.   InRegs.dx = Handle%
  198.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  199.   Status% = OutRegs.ax \ 256
  200. END SUB
  201.  
  202. SUB EMSMapping (Status%, PageNo%, BlockNo%, Handle%)
  203.   InRegs.ax = &H4400 + PageNo%
  204.   InRegs.bx = BlockNo%
  205.   InRegs.dx = Handle%
  206.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  207.   ststus% = OutRegs.ax
  208. END SUB
  209.  
  210. SUB EMSNoFetchedPages (Status%, Handle%, NoPages%)
  211.   InRegs.ax = &H4C00
  212.   InRegs.dx = Handle%
  213.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  214.   Status% = OutRegs.ax
  215.   NoPages% = OutRegs.bx
  216. END SUB
  217.  
  218. SUB EMSNoHandles (Status%, NoHandles%)
  219.   InRegs.ax = &H4B00
  220.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  221.   Status% = OutRegs.ax
  222.   NoHandles% = OutRegs.bx
  223. END SUB
  224.  
  225. SUB EMSPageFrameAddress (Status%, address%)
  226.   InRegs.ax = &H4100
  227.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  228.   Status% = OutRegs.ax
  229.   address% = OutRegs.bx
  230. END SUB
  231.  
  232. SUB EMSPages (Status%, FreePages%, AllPages%)
  233.   InRegs.ax = &H4200
  234.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  235.   Status% = OutRegs.ax
  236.   FreePages% = OutRegs.bx
  237.   AllPages% = OutRegs.dx
  238. END SUB
  239.  
  240. SUB EMSReleaseAllHandles
  241.   CALL EMSNoHandles(Status%, NoHandles%)
  242.   IF Status% <> 0 THEN
  243.     PRINT EMSError$(Status%)
  244.     END
  245.   END IF
  246.   FOR i% = NoHandles% - 1 TO 1 STEP -1
  247.     CALL EMSReleasePages(Status%, i%)
  248.     IF Status% <> 0 THEN
  249.       PRINT EMSError$(Status%)
  250.       END
  251.     END IF
  252.   NEXT i%
  253. END SUB
  254.  
  255. SUB EMSReleasePages (Status%, Handle%)
  256.   InRegs.ax = &H4500
  257.   InRegs.dx = Handle%
  258.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  259.   Status% = OutRegs.ax
  260. END SUB
  261.  
  262. SUB EMSStatus (Status AS INTEGER)
  263.   InRegs.ax = &H4000
  264.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  265.   Status = OutRegs.ax
  266. END SUB
  267.  
  268. SUB EMSUnlockMapping (Status%, Handle%)
  269.   InRegs.ax = &H4800
  270.   InRegs.dx = Handle%
  271.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  272.   Status% = OutRegs.ax \ 256
  273. END SUB
  274.  
  275. SUB EMSVersion (Status%, ver%)
  276.   InRegs.ax = &H4600
  277.   CALL INTERRUPT(&H67, InRegs, OutRegs)
  278.   Status% = OutRegs.ax \ 256
  279.   ver% = OutRegs.ax MOD 256
  280. END SUB
  281. '* ------------------------------------------------------- *
  282. '*                   Ende von EMM.BAS                      *
  283.