]> 4ch.mooo.com Git - 16.git/blob - 16/xx/modex.def
wwww
[16.git] / 16 / xx / modex.def
1 ;------------------------------------------------------------\r
2 ;\r
3 ; MODEX.DEF - Include file\r
4 ; Copyright (c) 1993-1994 by Alessandro Scotti\r
5 ;\r
6 JUMPS\r
7 LOCALS\r
8 \r
9 TRUE            EQU     1       ; Boolean constants\r
10 FALSE           EQU     0\r
11 \r
12 USE286  = FALSE                  ; TRUE enables 80286 instructions\r
13 USE386  = FALSE                  ; TRUE enables 80386 (and 80286) instructions\r
14 \r
15 IF USE286 EQ TRUE\r
16         P286\r
17 ENDIF\r
18 \r
19 IF USE386 EQ TRUE\r
20         P386\r
21         USE286  = TRUE\r
22 ENDIF\r
23 \r
24 MXVERSION       EQU     0128h   ; Library version (1.40)\r
25 \r
26 ;------------------------------------------------------------\r
27 ;\r
28 ; VGA definitions\r
29 ;\r
30 MISC    EQU     3C2h            ; Miscellaneous output\r
31 TS      EQU     3C4h            ; Timing Sequencer index register\r
32 GDC     EQU     3CEh            ; Graphics Data Controller index register\r
33 CRTC    EQU     3D4h            ; CRTC index register\r
34 STATUS  EQU     3DAh            ; Input Status register one\r
35 \r
36 ;------------------------------------------------------------\r
37 ;\r
38 ; Raster operators\r
39 ;\r
40 OP_SET          EQU     0\r
41 OP_MOVE         EQU     0       ; Same as OP_SET\r
42 OP_AND          EQU     1\r
43 OP_OR           EQU     2\r
44 OP_XOR          EQU     3\r
45 OP_TRANS        EQU     4\r
46 OP_ADD          EQU     5       ; Must be last op\r
47 \r
48 ;------------------------------------------------------------\r
49 ;\r
50 ; Polygon fill functions\r
51 ;\r
52 POLYSCANBUFSIZE EQU     4*1024\r
53 \r
54 ;------------------------------------------------------------\r
55 ; Macro to push registers, variables or flags onto the stack\r
56 ; Usage: .push "loc16"[,"loc16"...]\r
57 ; where "loc16" is a 16-bit register, a word-sized variable or the\r
58 ; keyword "FLAGS".\r
59 ; Exmpl: .push ax, flags, var1\r
60 ;        .pop  ax, flags, var1\r
61 ;\r
62 .push   MACRO   r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10\r
63     IFNB <r10>\r
64         .ERROR <.PUSH has more than 10 arguments>\r
65     ENDIF\r
66     IRP $reg, <r0, r1, r2, r3, r4, r5, r6, r7, r8, r9>\r
67         IFB <$reg>                      ;; Is argument blank?\r
68             EXITM                       ;; Yes, exit\r
69         ELSEIFIDNI <$reg>, <FLAGS>      ;; Is argument the keyword "FLAGS"?\r
70             pushf                       ;; Yes, push flags\r
71         ELSE\r
72             push    $reg                ;; Push argument\r
73         ENDIF\r
74     ENDM\r
75 ENDM\r
76 \r
77 ;------------------------------------------------------------\r
78 ; Macro to pop registers, variables or flags from the stack\r
79 ; Usage: .pop "loc16"[,"loc16"...]\r
80 ; where "loc16" is a 16-bit register, a word-sized variable or the\r
81 ; keyword "FLAGS".\r
82 ; Exmpl: .push ax, flags, var1\r
83 ;        .pop  ax, flags, var1\r
84 ;\r
85 .pop    MACRO   r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10\r
86     IFNB <r10>\r
87         .ERROR <.POP has more than 10 arguments>\r
88     ENDIF\r
89     IRP $reg, <r9, r8, r7, r6, r5, r4, r3, r2, r1, r0>\r
90         IFNB <$reg>                     ;; Is argument non-blank?\r
91             IFIDNI <$reg>, <FLAGS>      ;; Yes, is it the keyword "FLAGS"?\r
92                 popf                    ;; Yes, pop flags\r
93             ELSE\r
94                 pop     $reg            ;; Pop argument\r
95             ENDIF\r
96         ENDIF\r
97     ENDM\r
98 ENDM\r
99 \r
100 ;------------------------------------------------------------\r
101 ;\r
102 .enter  MACRO   localsize\r
103     IF USE286 EQ TRUE\r
104         enter   localsize, 0\r
105     ELSE\r
106         push    bp\r
107         mov     bp, sp\r
108         sub     sp, localsize\r
109     ENDIF\r
110 ENDM\r
111 \r
112 ;------------------------------------------------------------\r
113 ;\r
114 .leave  MACRO   argsize\r
115     IF USE286 EQ TRUE\r
116         leave\r
117     ELSE\r
118         mov     sp, bp\r
119         pop     bp\r
120     ENDIF\r
121     IFNB <argspace>\r
122         ret     argsize\r
123     ELSE\r
124         ret\r
125     ENDIF\r
126 ENDM\r
127 \r
128 ;------------------------------------------------------------\r
129 ;\r
130 .shr    MACRO   arg, count\r
131     IF USE286 EQ TRUE\r
132         shr     arg, count\r
133     ELSE\r
134         $temp = count\r
135         WHILE $temp GT 0\r
136             shr arg, 1\r
137             $temp = $temp-1\r
138         ENDM\r
139     ENDIF\r
140 ENDM\r
141 \r
142 ;------------------------------------------------------------\r
143 ;\r
144 .shl    MACRO   arg, count\r
145     IF USE286 EQ TRUE\r
146         shl     arg, count\r
147     ELSE\r
148         $temp = count\r
149         WHILE $temp GT 0\r
150             shl arg, 1\r
151             $temp = $temp-1\r
152         ENDM\r
153     ENDIF\r
154 ENDM\r
155 \r
156 ;------------------------------------------------------------\r
157 ;\r
158 .chk386 MACRO   name, jump\r
159     IF USE386 EQ FALSE\r
160         .OUT    "Warning: ", <name>, " needs a 386 or better to run!"\r
161         jmp     @@jump\r
162     ENDIF\r
163 ENDM\r