Subversion Repositories ngs

Rev

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