Rev 115 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
115 | savelij | 1 | |
181 | savelij | 2 | ; LAST UPDATE: 10.02.2024 savelij |
115 | savelij | 3 | |
181 | savelij | 4 | ; автоопределение кодировки работает неправильно |
5 | |||
115 | savelij | 6 | RELAXED ON |
7 | CPU Z80UNDOC |
||
8 | |||
181 | savelij | 9 | BUILD_DEBUG EQU 0 |
115 | savelij | 10 | |
181 | savelij | 11 | IFDEF DOS_FE |
12 | ;TESTEMUFDD ; сборка для тестирования эмулятора |
||
13 | ENDIF |
||
14 | |||
15 | ; вставка текстовой строки с нулем в окончании |
||
115 | savelij | 16 | DZ MACRO DEFZ |
17 | DB DEFZ,0 |
||
18 | ENDM |
||
19 | |||
181 | savelij | 20 | ; вставка текстовой строки с установкой 7 бита у последнего символа |
115 | savelij | 21 | DC MACRO DEFC |
181 | savelij | 22 | IF STRLEN(DEFC)>1 |
115 | savelij | 23 | DB SUBSTR(DEFC,0,STRLEN(DEFC)-1) |
181 | savelij | 24 | ENDIF |
25 | IF STRLEN(DEFC)>0 |
||
115 | savelij | 26 | DB CHARFROMSTR(DEFC,STRLEN(DEFC)-1)|80H |
181 | savelij | 27 | ENDIF |
115 | savelij | 28 | ENDM |
29 | |||
181 | savelij | 30 | ; генерация заголовка Hobeta файла |
115 | savelij | 31 | SUM_HOB MACRO STR,AA,BB,CC |
32 | DB STR |
||
33 | DW AA |
||
34 | DW BB |
||
35 | DB 0 |
||
36 | DB CC |
||
37 | $$I := 0 |
||
38 | $$S := 0 |
||
39 | REPT 9 |
||
40 | $$N := CHARFROMSTR (STR,STRLEN(STR)+$$S-9) |
||
41 | $$I := ($$I+$$S+$$N+($$N*256))&0XFFFF |
||
42 | $$S := $$S+1 |
||
43 | ENDM |
||
44 | $$I := ($$I+$$S+LOW (AA)+(LOW (AA)*0X100))&0XFFFF |
||
45 | $$S := $$S+1 |
||
46 | $$I := ($$I+$$S+HIGH (AA)+(HIGH (AA)*0X100))&0XFFFF |
||
47 | $$S := $$S+1 |
||
48 | $$I := ($$I+$$S+LOW (BB)+(LOW (BB)*0X100))&0XFFFF |
||
49 | $$S := $$S+1 |
||
50 | $$I := ($$I+$$S+HIGH (BB)+(HIGH (BB)*0X100))&0XFFFF |
||
51 | $$S := $$S+1 |
||
52 | $$I := ($$I+$$S+LOW (CC)+(LOW (CC)*0X100))&0XFFFF |
||
53 | $$S := $$S+1 |
||
54 | $$I := ($$I+$$S+HIGH (CC)+(HIGH (CC)*0X100))&0XFFFF |
||
55 | $$S := $$S+1 |
||
56 | DW $$I |
||
57 | ENDM |
||
58 | |||
181 | savelij | 59 | ; заполнение области указанным байтом или нулем при отсуствии второго параметра |
115 | savelij | 60 | DUPL MACRO LEN,FILL |
61 | DUPL: |
||
62 | $$N EQU (LEN) / 1024 |
||
63 | $$M EQU (LEN) # 1024 |
||
64 | REPT $$N |
||
65 | DB 1024 DUP(FILL) |
||
66 | ENDM |
||
181 | savelij | 67 | IF $$M <> 0 |
68 | IFB FILL |
||
69 | DB $$M DUP(0) |
||
70 | ELSE |
||
115 | savelij | 71 | DB $$M DUP(FILL) |
181 | savelij | 72 | ENDIF |
73 | ENDIF |
||
115 | savelij | 74 | ENDM |
75 | |||
181 | savelij | 76 | ; старший байт слова |
115 | savelij | 77 | HIGH FUNCTION X,((X >> 8) & 0XFF) |
181 | savelij | 78 | ; младший байт слова |
115 | savelij | 79 | LOW FUNCTION X,(X & 0XFF) |
80 | |||
181 | savelij | 81 | ; вызов подпрограммы в другой странице ROM |
82 | ROMCALL MACRO ADR,PAGE |
||
115 | savelij | 83 | RST 0X30 |
84 | DW ADR |
||
85 | DB PAGE |
||
86 | ENDM |
||
87 | |||
181 | savelij | 88 | ; вызов подпрограммы в другой странице RAM |
89 | RAMCALL MACRO ADR,PAGE |
||
90 | RST 0X20 |
||
91 | DW ADR |
||
92 | DB PAGE |
||
93 | ENDM |
||
94 | |||
95 | ; запись в порт ATM Turbo 2+ |
||
115 | savelij | 96 | ATMPORT MACRO PORT,BYTE |
97 | LD BC,PORT |
||
181 | savelij | 98 | IF BYTE = 0 |
99 | XOR A |
||
100 | ELSE |
||
115 | savelij | 101 | LD A,BYTE |
181 | savelij | 102 | ENDIF |
115 | savelij | 103 | OUT (C),A |
104 | ENDM |
||
105 | |||
181 | savelij | 106 | ; запись в порт расширенных портов PentEvo |
115 | savelij | 107 | EVOPORT MACRO PORT,BYTE |
108 | LD BC,PORT |
||
181 | savelij | 109 | IF BYTE = 0 |
110 | XOR A |
||
111 | ELSE |
||
115 | savelij | 112 | LD A,BYTE |
181 | savelij | 113 | ENDIF |
115 | savelij | 114 | OUT (C),A |
115 | ENDM |
||
116 | |||
181 | savelij | 117 | ; включение бита (битов) в порту 0xBF |
115 | savelij | 118 | PEC_ON MACRO BYTE |
119 | IN A,(PEVO_CONF) |
||
120 | OR BYTE |
||
121 | OUT (PEVO_CONF),A |
||
122 | ENDM |
||
123 | |||
181 | savelij | 124 | ; сброс бита (битов) в порту 0xBF |
115 | savelij | 125 | PEC_OFF MACRO BYTE |
126 | IN A,(PEVO_CONF) |
||
127 | AND BYTE!0XFF |
||
128 | OUT (PEVO_CONF),A |
||
129 | ENDM |
||
130 | |||
181 | savelij | 131 | ; чтение порта 0x7FFD |
132 | READ_7FFD MACRO |
||
133 | LD A,HIGH (RD_7FFD) |
||
134 | IN A,(LOW (RD_7FFD)) |
||
135 | ENDM |
||
136 | |||
137 | ; генерация даты |
||
138 | ; LINUX DATE: "10/07/21" |
||
139 | ; WIN32 DATE: "10/7/2021" |
||
115 | savelij | 140 | SIZEDATE EQU STRLEN (DATE) |
181 | savelij | 141 | __POS := 0 |
142 | ; извлечение месяца |
||
143 | MMOUNTH := (CHARFROMSTR (DATE,__POS) - '0') |
||
144 | __POS := __POS + 1 |
||
145 | IF (CHARFROMSTR (DATE,__POS)) > '/' |
||
146 | MMOUNTH := MMOUNTH * 10 + (CHARFROMSTR (DATE,__POS)) -'0' |
||
147 | __POS := __POS + 1 |
||
148 | ENDIF |
||
149 | __POS := __POS + 1 |
||
150 | ; извлечение даты |
||
151 | DDATE := (CHARFROMSTR (DATE,__POS) - '0') |
||
152 | __POS := __POS + 1 |
||
153 | IF (CHARFROMSTR (DATE,__POS)) > '/' |
||
154 | DDATE := DDATE * 10 + (CHARFROMSTR (DATE,__POS)) - '0' |
||
155 | __POS := __POS + 1 |
||
156 | ENDIF |
||
157 | __POS := __POS + 1 |
||
158 | ; извлечение года |
||
159 | YYEAR := (CHARFROMSTR (DATE,__POS) - '0') |
||
160 | __POS := __POS + 1 |
||
161 | WHILE (CHARFROMSTR (DATE,__POS)) > '/' |
||
162 | YYEAR := YYEAR * 10 + (CHARFROMSTR (DATE,__POS)) - '0' |
||
163 | __POS := __POS + 1 |
||
164 | IF __POS > SIZEDATE |
||
165 | EXITM |
||
166 | ENDIF |
||
167 | ENDM |
||
168 | IF YYEAR > 99 |
||
169 | YYEAR := YYEAR - 2000 |
||
170 | ENDIF |
||
115 | savelij | 171 | |
181 | savelij | 172 | ; генерация времени |
173 | ; "9:28:8" |
||
174 | SIZETIME EQU STRLEN (TIME) |
||
175 | __POS := 0 |
||
176 | ; извлечение часа |
||
177 | HHOUR := CHARFROMSTR (TIME, __POS) - '0' |
||
178 | __POS := __POS + 1 |
||
179 | IF (CHARFROMSTR (TIME,__POS)) <= '9' |
||
180 | HHOUR := HHOUR * 10 + CHARFROMSTR (TIME, __POS) - '0' |
||
181 | __POS := __POS + 1 |
||
182 | ENDIF |
||
183 | __POS := __POS + 1 |
||
184 | ; извлечение минут |
||
185 | MMINUTE := CHARFROMSTR (TIME, __POS) - '0' |
||
186 | __POS := __POS + 1 |
||
187 | IF (CHARFROMSTR (TIME,__POS)) <= '9' |
||
188 | MMINUTE := MMINUTE * 10 + CHARFROMSTR (TIME, __POS) - '0' |
||
189 | __POS := __POS + 1 |
||
190 | ENDIF |
||
191 | __POS := __POS + 1 |
||
192 | ; извлечение секунд |
||
193 | SSECUND := CHARFROMSTR (TIME, __POS) - '0' |
||
194 | __POS := __POS + 1 |
||
195 | IF __POS < SIZETIME |
||
196 | SSECUND := SSECUND * 10 + CHARFROMSTR (TIME, __POS) - '0' |
||
197 | ENDIF |
||
115 | savelij | 198 | |
181 | savelij | 199 | DATA_VERS EQU DDATE + (MMOUNTH << 5) + (YYEAR<<9) + 0x8000 ;уже упаковано |
200 | |||
201 | FAT_DATE EQU DDATE + (MMOUNTH << 5) + ((2000 + YYEAR - 1980) & 0x7F) << 9 |
||
202 | FAT_TIME EQU SSECUND / 2 + (MMINUTE << 5) + (HHOUR << 11) |
||
203 | |||
204 | ; генерация даты и времени в текстовом виде |
||
115 | savelij | 205 | TEXTDATE MACRO |
181 | savelij | 206 | DB (DDATE / 10) + '0', (DDATE # 10) + '0', '.' |
207 | DB MMOUNTH / 10 + '0', MMOUNTH # 10 + '0', '.' |
||
208 | DB CHARFROMSTR (DATE, SIZEDATE - 4), CHARFROMSTR (DATE, SIZEDATE - 3) |
||
209 | DB CHARFROMSTR (DATE, SIZEDATE - 2), CHARFROMSTR (DATE, SIZEDATE - 1) |
||
115 | savelij | 210 | ENDM |
181 | savelij | 211 | |
212 | TEXTTIME MACRO |
||
213 | DB HHOUR/10 + '0', HHOUR#10 + '0', '.' |
||
214 | DB MMINUTE/10 + '0', MMINUTE#10 + '0', '.' |
||
215 | DB SSECUND/10 + '0', SSECUND#10 + '0' |
||
216 | ENDM |
||
217 | |||
218 | ; вызов RST 8 с параметрами |
||
219 | RST8 MACRO N1,N2,N3 |
||
220 | RST 8 |
||
221 | DB N1 |
||
222 | IFNB N2 |
||
223 | DB N2 |
||
224 | ENDIF |
||
225 | IFNB N3 |
||
226 | DB N3 |
||
227 | ENDIF |
||
228 | ENDM |
||
229 | |||
230 | BYTE EQU 1 |
||
231 | WORD EQU 2 |
||
232 | JUMP EQU 3 |
||
233 | DWORD EQU 4 |
||
234 | QWORD EQU 8 |
||
235 | |||
236 | BITMASK MACRO NAME,NUM |
||
237 | B_NAME EQU NUM |
||
238 | M_NAME EQU 1<<NUM |
||
239 | ENDM |
||
240 | |||
241 | ; генерация метки с резервированием места и размера области |
||
242 | SETVAR MACRO NAME,SIZE |
||
243 | NAME EQU INITVAR ; номер имени |
||
244 | IFNB SIZE |
||
245 | INITVAR := INITVAR+SIZE |
||
246 | NAME_Size EQU SIZE ; размер |
||
247 | ELSE |
||
248 | INITVAR := INITVAR+BYTE |
||
249 | NAME_Size EQU BYTE |
||
250 | ENDIF |
||
251 | NAME_CurAdr EQU $ ; текущий адрес |
||
252 | ENDM |
||
253 | |||
254 | ; перенос метки назад на указанное число байт |
||
255 | SUBVAR MACRO SIZE |
||
256 | INITVAR := INITVAR-SIZE |
||
257 | ENDM |
||
258 | |||
259 | ; перенос метки вперед на указанное число байт |
||
260 | ADDVAR MACRO SIZE |
||
261 | INITVAR := INITVAR+SIZE |
||
262 | ENDM |
||
263 | |||
264 | ; инициализация переменной для резервирования указанным числом |
||
265 | ; или 0 при отсуствии второго параметра |
||
266 | INIT_VAR MACRO START |
||
267 | IFNB START |
||
268 | INITVAR := START |
||
269 | ELSE |
||
270 | INITVAR := 0 |
||
271 | ENDIF |
||
272 | ENDM |
||
273 | |||
274 | ; выравнивание для генерации меток на границу 256 байт |
||
275 | SETVAR_ALIGN MACRO |
||
276 | INITVAR := INITVAR + 0x100 - (INITVAR & 0xFF) |
||
277 | ENDM |
||
278 | |||
279 | ; выравнивание текущего адреса на границу 256 байт |
||
280 | ALIGN MACRO BYTES,FILL |
||
281 | IFNB |
||
282 | DB BYTES - ($ & (BYTES - 1)) DUP (0) |
||
283 | ELSE |
||
284 | DB BYTES - ($ & (BYTES - 1)) DUP (FILL) |
||
285 | ENDIF |
||
286 | ENDM |
||
287 | |||
288 | MALIGN MACRO |
||
289 | IF LOW($) = 0 |
||
290 | DUPL (HIGH($) << 8) - $,0 |
||
291 | ELSE |
||
292 | DUPL ((HIGH($) + 1) << 8) - $,0 |
||
293 | ENDIF |
||
294 | ENDM |
||
295 | |||
296 | ; выравнивание до сектора с учетом адреса компиляции |
||
297 | DALIGN MACRO ADDRESS |
||
298 | IF LOW (ADDRESS) |
||
299 | DB LOW (LOW (-$)+LOW(ADDRESS)) DUP(0) |
||
300 | ELSE |
||
301 | DB LOW (-$) DUP (0) |
||
302 | ENDIF |
||
303 | ENDM |
||
304 | |||
305 | ; преобразование 16 битного числа в текст |
||
306 | WORD2TXT MACRO WORD |
||
307 | $$DEC1 := (WORD)/10000 |
||
308 | $$TMP := WORD-$$DEC1*10000 |
||
309 | $$DEC2 := $$TMP/1000 |
||
310 | $$TMP := $$TMP-$$DEC2*1000 |
||
311 | $$DEC3 := $$TMP/100 |
||
312 | $$TMP := $$TMP-$$DEC3*100 |
||
313 | $$DEC4 := $$TMP/10 |
||
314 | $$TMP := $$TMP-$$DEC4*10 |
||
315 | $$DEC5 := $$TMP |
||
316 | DB $$DEC1+'0',$$DEC2+'0',$$DEC3+'0',$$DEC4+'0',$$DEC5+'0' |
||
317 | ENDM |
||
318 | |||
319 | WINHDR MACRO X,Y,V,H,CWIN,CCUR,FLAGS,NUMPKT,TEKPKT,NUMKOL, \ |
||
320 | ADRTXT,ADRPRG,ADRMOUSE,ADRHOTKEY |
||
321 | DB X,Y,V,H,CWIN,CCUR,FLAGS,NUMPKT |
||
322 | DW TEKPKT,NUMKOL,ADRTXT,ADRPRG,ADRMOUSE,ADRHOTKEY |
||
323 | ENDM |
||
324 | |||
325 | ; генерация метки с резервированием места и размера области |
||
326 | _SETVAR MACRO NAME, SIZE |
||
327 | NAME EQU .CURRVAR ; номер имени |
||
328 | IFNB SIZE |
||
329 | .CURRVAR := .CURRVAR + SIZE |
||
330 | .NAME_Size EQU SIZE ; размер |
||
331 | ELSE |
||
332 | .CURRVAR := .CURRVAR + BYTE |
||
333 | .NAME_Size EQU BYTE |
||
334 | ENDIF |
||
335 | .NAME_CurAdr EQU $ ; текущий адрес |
||
336 | ENDM |
||
337 | |||
338 | ; перенос метки назад на указанное число байт |
||
339 | _SUBVAR MACRO SIZE |
||
340 | .CURRVAR := .CURRVAR - SIZE |
||
341 | ENDM |
||
342 | |||
343 | ; перенос метки вперед на указанное число байт |
||
344 | _ADDVAR MACRO SIZE |
||
345 | .CURRVAR := .CURRVAR + SIZE |
||
346 | ENDM |
||
347 | |||
348 | ; инициализация переменной для резервирования указанным числом |
||
349 | ; или 0 при отсуствии второго параметра |
||
350 | _INIT_VAR MACRO START |
||
351 | IFNB START |
||
352 | .CURRVAR := START |
||
353 | ELSE |
||
354 | .CURRVAR := 0 |
||
355 | ENDIF |
||
356 | ENDM |
||
357 | |||
358 | ; выравнивание для генерации меток на границу 256 байт |
||
359 | _SETVAR_ALIGN MACRO |
||
360 | .CURRVAR := .CURRVAR + 0x100 - (.CURRVAR & 0xFF) |
||
361 | ENDM |