home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / lib4a86 / lib / macros.mac < prev    next >
Text File  |  1992-02-15  |  12KB  |  530 lines

  1. ;
  2. ; MACROS.MAC   - allgemeine Macros und EQUs
  3. ;                (für den Assembler A86)
  4. ;
  5. ;                (c) Bernd Schemmer 1992
  6. ;                Letzter Update: 03.02.1992
  7. ;
  8. ;
  9. ;; ----------------------------
  10. ;;
  11. ; ■ EQUs für die Tastencodes
  12. ;
  13.   LF            EQU  0Ah        ; Linefeed
  14.   TAB           EQU  09h        ; Tabulator
  15.   CR            EQU  0Dh        ; Return
  16.   CTRL_Z        EQU 01Ah        ; CTRL-Z
  17.   ESC           EQU 01Bh        ; ESC
  18.   BLANK         EQU 020h        ; Leerzeichen
  19.  
  20.   NULL          EQU  00h        ; Nullbyte
  21. ;
  22. ;; ----------------------------
  23. ;;
  24. ; ■ Handles für die Standard Ein/Ausgabekanäle
  25. ;
  26.   STDIN         EQU 0
  27.   STDOUT        EQU 1
  28.   STDERR        EQU 2
  29.   STDAUX        EQU 3
  30.   STDPRINT      EQU 4
  31. ;
  32. ;
  33. ; ----------------------------
  34. ; DefString
  35. ;
  36. ; Funktion: Macro zum Definieren eines Strings (mit Längenbyte)
  37. ;
  38. ; Aufruf:   DefString NameDesStrings, maxLänge {,Inhalt_1} {...} {,inhalt_n}
  39. ;
  40. ; Bes.:     Falls maxLänge größer als die Länge von Inhalt ist, wird
  41. ;           der Rest des Strings mit Leerzeichen aufgefüllt.
  42. ;
  43. ;           Falls für maxLänge Null angegeben wird, wird der
  44. ;           String nur mit der Länge von Inhalt angelegt, in
  45. ;           allen anderen Fällen darf MaxLänge NICHT kleiner
  46. ;           als der Inhalt sein!
  47. ;           Zeichenketten für Inhalt müssen in Hochkommata oder
  48. ;           Gänsefüßchen angegeben werden!
  49. ;
  50. #if !DefString                ; nur definieren, falls noch nicht vorhanden
  51.  
  52. DefString MACRO
  53.  
  54. #1       db #1_LENGTH         ; #1 = Name des Strings
  55.  
  56. ##if #NL GE 3                 ; String evtl. initialisieren
  57.  #RX3L
  58.          db #X
  59.  #ER
  60. ##endif
  61.                               ; Länge des Stringinhaltes ermitteln
  62.          #1_LENGTH EQU ($ - Offset #1) -1
  63.  
  64. ##if  #2 NE 0                 ; und evtl. restlichen Bytes des Strings mit
  65.                               ; Leerzeichen initialisieren
  66.          db (#2 - #1_LENGTH) dup (' ')
  67. ##endif
  68.  
  69. #EM
  70.  
  71. #endif
  72.  
  73. ;
  74. ; ----------------------------
  75. ; MakeMsg
  76. ;
  77. ; Funktion: Macro zur Deklaration einer Zeichenkette mit angehängten
  78. ;           CR/LF und einer Konstanten mit der Länge der Zeichenkette
  79. ;
  80. ; Aufruf:   MakeMsg name, inhalt_1 {,Inhalt_2} {...} {,Inhalt_n}
  81. ;
  82. ; Bes.:     Das Macro definiert eine Variable name und eine Konstante
  83. ;           name_length.
  84. ;           Zeichenketten für Inhalt müssen in Hochkommata oder
  85. ;           Gänsefüßchen angegeben werden!
  86. ;
  87. ;
  88. MakeMsg MACRO
  89. #1       db
  90.          #RX2L
  91.            db #X
  92.          #ER
  93.          db CR,LF
  94.          #1_LENGTH EQU ($ - Offset #1)
  95. #EM
  96. ;
  97. ; ----------------------------
  98. ; MakeMsg1
  99. ;
  100. ; Funktion: Macro zur Deklaration einer Zeichenkette OHNE angehängtem
  101. ;           CR/LF und einer Konstanten mit der Länge der Zeichenkette
  102. ;
  103. ; Aufruf:   MakeMsg name, inhalt_1 {,Inhalt_1} {...} {,inhalt_n}
  104. ;
  105. ; Bes.:     Das Macro definiert eine Variable name und eine Konstante
  106. ;           name_length
  107. ;           Zeichenketten für Inhalt müssen in Hochkommata oder
  108. ;           Gänsefüßchen angegeben werden!
  109. ;
  110. ;
  111. MakeMsg1 MACRO
  112. #1       db
  113.          #RX2L
  114.            db #X
  115.          #ER
  116.          #1_LENGTH EQU ($ - Offset #1)
  117. #EM
  118. ;
  119. ; ----------------------------
  120. ; GetLength
  121. ;
  122. ; Funktion:  Macro zur Deklaration der Länge einer Zeichenkette als
  123. ;         Konstanten
  124. ;
  125. ; Aufruf:    GetLength Name_Der_Zeichenkette
  126. ;            (direkt nach der Deklaration!)        
  127. ;
  128. GetLength MACRO
  129.          #1_LENGTH EQU $ - Offset #1
  130. #EM
  131. ;
  132. ; ----------------------------
  133. ; Write_String
  134. ;
  135. ; Funktion:  Macro zur Ausgabe einer Zeichenkette auf die Standard-
  136. ;            Ausgabe
  137. ;
  138. ; Aufruf:    Write_String Name_Der_Zeichenkette
  139. ;
  140. ; Bes.:      Die Länge der Zeichenkette muß über die Konstante
  141. ;            Name_Der_Zeichenkette_LENGTH ermittelbar sein.
  142. ;
  143. ;            Verändert keine Register
  144. ;
  145. Write_String MACRO
  146.          push dx,cx,ds
  147.          mov ds,cs
  148.  
  149.          mov dx,offset #1
  150.          mov cx,#1_LENGTH
  151.          call OutputMsg
  152.          pop ds,cx,dx
  153. #EM
  154. ;
  155. ; ----------------------------
  156. ; TestDOSVersion
  157. ;
  158. ; Funktion:  Ermittelt und testet die DOS-Version
  159. ;
  160. ; Aufruf:    TestDOSVersion {major,minor}
  161. ;
  162. ; Parameter: major, minor  = mindestens nötige DOS-Version
  163. ;                            major = Hauptversion
  164. ;                            minor = Unterversion
  165. ;                            (Voreinstellung: 3.30)
  166. ;
  167. ; Ausgabe:   AX = DOS-Version (AH =Hauptversion, AL = Unterversion)
  168. ;
  169. ; Bes.:      Falls die akt. DOS-Version zu alt ist, gibt das Macro
  170. ;            eine Fehlermeldung über die Funktion 09h des Interrupt
  171. ;            21h aus und beendet das Programm über die Funktion 00h
  172. ;            des Interrupt 21h.
  173. ;
  174. TestDOSVersion MACRO
  175.          mov ah,030h
  176.          int 021h
  177.          xchg ah,al
  178. ##IF #NL EQ 2
  179.          cmp ax, #1 BY #2
  180. ##ELSE
  181.          cmp ax, 031Eh        ; Voreinstellung: 3.30
  182. ##ENDIF
  183.          jae >m1              ; DOS-Version okay
  184.  
  185.                               ; Falsche DOS-Version
  186.          mov dx,offset m0
  187.          mov ds,cs
  188.          mov ah,09h
  189.          int 021h             ; Fehlermeldung ausgeben
  190.          mov ah,0
  191.          int 021h             ; Programm beenden
  192.  
  193. ; ------------------
  194.                               ; Text der Fehlermeldung
  195. m0 db 'Falsche DOS-Version!',0Dh,0Ah,'$'
  196. ; ------------------
  197. m1:
  198. #EM
  199. ;
  200. ; ----------------------------
  201. ; EndProcess
  202. ;
  203. ; Funktion: Beendet einen Prozess
  204. ;
  205. ; Aufruf:   EndProcess {returncode}
  206. ;
  207. EndProcess MACRO
  208. ##IF #NL EQ 1
  209.   ##IF "#1" = "AL"
  210.   ##ELSE
  211.      mov al,#1
  212.   ##ENDIF
  213. ##ENDIF
  214.      mov ah,04ch
  215.      int 021h
  216. #EM
  217. ;
  218. ; ----------------------------
  219. ; KeepProcess
  220. ;
  221. ; Funktion: Beendet ein Prozess, aber behält ihn im Speicher
  222. ;
  223. ; Aufruf:   KeepProcess {returncode}
  224. ;
  225. ; Eingabe:  DX = Anzahl resident zu haltender Paragraphen
  226. ;
  227. KeepProcess MACRO
  228. ##IF #NL EQ 1
  229.   ##IF "#1" = "AL"
  230.   ##ELSE
  231.      mov al,#1
  232.   ##ENDIF
  233. ##ENDIF
  234.      mov ah,031h
  235.      int 021h
  236. #EM
  237. ;
  238. ; ----------------------------
  239. ; GetProcessReturnCode
  240. ;
  241. ; Funktion: Ermittelt den Returncode eines Prozesses
  242. ;
  243. ; Ausgabe:  AH = Exit Code des Prozesses:
  244. ;                00 - Prozess endete normal
  245. ;                01 - Prozess wurde über CTRL-C abgebrochen
  246. ;                02 - Prozess über einen kritischen Fehler beendet
  247. ;                03 - Prozess über Funktion 31h des Interrupt 21h beendet
  248. ;           AL = Returncode des Prozesses
  249. ;
  250. GetProcessReturnCode MACRO
  251.          mov ah,04Dh
  252.          int 021h
  253. #EM
  254. ;
  255. ; ----------------------------
  256. ; GetAktPSP
  257. ;
  258. ; Funktion: Ermittelt die Adresse des akt. PSPs
  259. ;
  260. ; Aufruf:   GetAktPSP
  261. ;
  262. ; Ausgabe:  BX = akt. PSP-Segment
  263. ;
  264. GetAktPSP MACRO
  265.          mov ah,051h
  266.          int 021h
  267. #EM
  268. ;
  269. ; ----------------------------
  270. ; SetAktPSP
  271. ;
  272. ; Funktion: Setzt die Adresse des akt. PSPs
  273. ;
  274. ; Aufruf:   SetAktPSP
  275. ;
  276. ; Eingabe:  BX = neues PSP-Segment
  277. ;
  278. SetAktPSP MACRO
  279.          mov ah,050h
  280.          int 021h
  281. #EM
  282. ;
  283. ; ----------------------------
  284. ; GetSetAktPSP
  285. ;
  286. ; Funktion: Ermittelt und setzt die Adresse des akt. PSPs
  287. ;
  288. ; Aufruf:   GetSetAktPSP
  289. ;
  290. ; Eingabe:  BX = neues PSP-Segment
  291. ;
  292. ; Ausgabe:  BX = altes PSP-Segment
  293. ;
  294. GetSetAktPSP MACRO
  295.          push dx
  296.  
  297.          push bx              ; neues PSP sichern
  298.          GetAktPSP            ; altes PSP ermitteln
  299.          mov dx,bx            ; altes PSP in DX sichern
  300.          pop bx               ; BX = neues PSP
  301.          SetAktPSP            ; neues PSP setzen
  302.          mov bx,dx            ; BX = altes PS
  303.  
  304.          pop dx
  305. #EM
  306. ;
  307. ; ----------------------------
  308. ; GetIntVector
  309. ;
  310. ; Funktion: Ermittelt die Adresse eines Interrupt-Vectors
  311. ;
  312. ; Aufruf:   GetIntVector
  313. ;
  314. ; Eingabe:  AL = Nummer des Vectors
  315. ;
  316. ; Ausgabe:  ES:BX -> Adresse des Vectors
  317. ;
  318. GetIntVector MACRO
  319.          mov ah,035h
  320.          int 021h
  321. #EM
  322. ;
  323. ; ----------------------------
  324. ; SetIntVector
  325. ;
  326. ; Funktion: Setzt die Adresse eines Interrupt-Vectors
  327. ;
  328. ; Aufruf:   SetIntVector
  329. ;
  330. ; Eingabe:  AL = Nummer des Vectors
  331. ;           ES:BX -> neue Adresse für den Interrupt-Vector
  332. ;
  333. SetIntVector MACRO
  334.          mov ah,025h
  335.          int 021h
  336. #EM
  337. ;
  338. ; ----------------------------
  339. ; GetSetIntVector
  340. ;
  341. ; Funktion: Ermittelt und setzt die Adresse eines Interrupt-Vectors
  342. ;
  343. ; Aufruf:   GetSetIntVector
  344. ;
  345. ; Eingabe:  AL = Nummer des Vectors
  346. ;           ES:BX -> neue Adresse für den Interrupt-Vector
  347. ;
  348. ; Ausgabe:  DS:DX -> alte Adresse des Interrupt-Vectors
  349. ;
  350. GetSetIntVector MACRO
  351.          GetIntVector
  352.          SetIntVector
  353. #EM
  354. ;
  355. ; ----------------------------
  356. ; SetVerifyFlag
  357. ;
  358. ; Funktion: Setzt das Verify-Flag
  359. ;
  360. ; Aufruf:   SetVerifyFlag
  361. ;
  362. ; Eingabe:  AL = neuer Wert
  363. ;                AL = 0 ->> Verify off
  364. ;                AL = 1 ->> Verify on
  365. ;
  366. SetVerifyFlag MACRO
  367.          push dx
  368.          mov dl,0             ; für DOS-Version vor 3.0
  369.          mov ah,02Eh
  370.          int 021h
  371.          pop dx
  372. #EM
  373. ;
  374. ; ----------------------------
  375. ; GetVerifyFlag
  376. ;
  377. ; Funktion: Ermittelt den Wert des Verify-Flags
  378. ;
  379. ; Aufruf:   GetVerifyFlag
  380. ;
  381. ; Ausgabe:  AL = akt. Wert des Verify-Flags
  382. ;                AL = 0 ->> Verify off
  383. ;                AL = 1 ->> Verify on
  384. ;
  385. GetVerifyFlag MACRO
  386.          mov ah,054h
  387.          int 021h
  388. #EM
  389. ;
  390. ; ----------------------------
  391. ; GetSetVerifyFlag
  392. ;
  393. ; Funktion: Ermittelt und setzt den Wert des Verify-Flags
  394. ;
  395. ; Aufruf:   GetSetVerifyFlag
  396. ;
  397. ; Eingabe:  AL = neuer Wert des Verify-Flags
  398. ;                AL = 0 ->> Verify off
  399. ;                AL = 1 ->> Verify on
  400. ;
  401. ; Ausgabe:  AH = alter Wert des Verify-Flags
  402. ;           AL = neuer Wert des Verify-Flags
  403. ;
  404. GetSetVerifyFlag MACRO
  405.          push bx
  406.          mov bl,al            ; neuer Wert nach BL
  407.          GetVerifyFLag
  408.          mov bh,al            ; alter Wert nach BH
  409.          mov al,bl            ; neuen Wert nach AL
  410.          SetVerifyFlag        ; und neuen Wert setzen
  411.          mov ax,bx
  412.          pop bx
  413. #EM
  414. ;
  415. ; ----------------------------
  416. ; SetBreakFlag
  417. ;
  418. ; Funktion: Setzt das Break-Flag
  419. ;
  420. ; Aufruf:   SetBreakFlag
  421. ;
  422. ; Eingabe:  AL = neuer Wert des BreakFlags
  423. ;                AL = 0 ->> Break off
  424. ;                AL = 1 ->> Break on
  425. ;
  426. SetBreakFlag MACRO
  427.          push dx
  428.          mov dl,al
  429.          mov ax,03301h
  430.          int 021h
  431.          pop dx
  432. #EM
  433. ;
  434. ; ----------------------------
  435. ; GetBreakFlag
  436. ;
  437. ; Funktion: Ermittelt den Wert des Break-Flags
  438. ;
  439. ; Aufruf:   GetBreakFlag
  440. ;
  441. ; Ausgabe:  AL = akt. Wert des Break-Flags
  442. ;                AL = 0 ->> Break off
  443. ;                AL = 1 ->> Break on
  444. ;
  445. GetBreakFlag MACRO
  446.          push dx
  447.          mov ax,03300h
  448.          int 021h
  449.          mov al,dl
  450.          pop dx
  451. #EM
  452. ;
  453. ; ----------------------------
  454. ; GetSetBreakFlag
  455. ;
  456. ; Funktion: Ermittelt und setzt den Wert des Break-Flags
  457. ;
  458. ; Aufruf:   GetSetBreakFlag
  459. ;
  460. ; Eingabe:  AL = neuer Wert des Break-Flags
  461. ;                AL = 0 ->> Break off
  462. ;                AL = 1 ->> Break on
  463. ;
  464. ; Ausgabe:  AH = alter Wert des Break-Flags
  465. ;           AL = neuer Wert des Break-Flags
  466. ;
  467. GetSetBreakFlag MACRO
  468.          push dx
  469.          mov dh,al            ; DH = neuer Wert des Break-Flags
  470.          mov dl,al            ; DL = neuer Wert des Break-Flags
  471.          mov ax,03302h        ; Flag ermitteln und setzen
  472.          int 021h             ; DL = alter Wert des Break-Flags
  473.          xchg dh,dl           ; DH = alter Wert
  474.                               ; DL = neuer Wert
  475.          mov ax,dx
  476.          pop dx
  477. #EM
  478. ;
  479. ; ----------------------------
  480. ; SetDTA
  481. ;
  482. ; Funktion: Setzt die DTA auf eine neue Adresse
  483. ;
  484. ; Aufruf:   SetDTA
  485. ;
  486. ; Eingabe:  DS:DX -> neue DTA
  487. ;
  488. SetDTA MACRO
  489.          mov ah,01Ah
  490.          int 021h
  491. #EM
  492. ;
  493. ; ----------------------------
  494. ; GetDTA
  495. ;
  496. ; Funktion: Ermittelt die Adresse der DTA
  497. ;
  498. ; Aufruf:   GetDTA
  499. ;
  500. ; Eingabe:  ES:BX -> DTA
  501. ;
  502. GetDTA MACRO
  503.          mov ah,02Fh
  504.          int 021h
  505. #EM
  506. ;
  507. ; ----------------------------
  508. ; GetSetDTA
  509. ;
  510. ; Funktion: Setzt und ermittelt die Adresse der DTA
  511. ;
  512. ; Aufruf:   GetSetDTA
  513. ;
  514. ; Eingabe:  DS:DX -> neue DTA
  515. ;
  516. ; Ausgabe:  ES:BX -> alte DTA
  517. ;
  518. GetSetDTA MACRO
  519.          GetDTA
  520.          SetDTA
  521. #EM
  522. ;
  523. ; ***** END OF PUBLIC *****
  524.  
  525. ; interne Routinen
  526.  
  527. ; ----------------------------
  528.  
  529. ;
  530.