Subversion Repositories ngs

Rev

Rev 115 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 115 Rev 181
Line 1... Line 1...
1
 
1
 
2
;LAST UPDATE: 16.04.2014 savelij
2
; LAST UPDATE: 10.02.2024 savelij
-
 
3
 
-
 
4
; автоопределение кодировки работает неправильно
3
 
5
 
4
                RELAXED ON
6
                RELAXED ON
5
                CPU Z80UNDOC
7
                CPU Z80UNDOC
6
 
8
 
7
BUILD_DEBUG     EQU 1
9
BUILD_DEBUG     EQU 0
-
 
10
 
-
 
11
        IFDEF DOS_FE
-
 
12
;TESTEMUFDD     ; сборка для тестирования эмулятора
-
 
13
        ENDIF
8
 
14
 
-
 
15
; вставка текстовой строки с нулем в окончании
9
DZ              MACRO DEFZ
16
DZ              MACRO DEFZ
10
                DB DEFZ,0
17
                DB DEFZ,0
11
                ENDM
18
                ENDM
12
 
19
 
-
 
20
; вставка текстовой строки с установкой 7 бита у последнего символа
13
DC              MACRO DEFC
21
DC              MACRO DEFC
14
                IF STRLEN(DEFC)>1
22
        IF STRLEN(DEFC)>1
15
                DB SUBSTR(DEFC,0,STRLEN(DEFC)-1)
23
                DB SUBSTR(DEFC,0,STRLEN(DEFC)-1)
16
                ENDIF
24
        ENDIF
17
                IF STRLEN(DEFC)>0
25
        IF STRLEN(DEFC)>0
18
                DB CHARFROMSTR(DEFC,STRLEN(DEFC)-1)|80H
26
                DB CHARFROMSTR(DEFC,STRLEN(DEFC)-1)|80H
19
                ENDIF
27
        ENDIF
20
                ENDM
28
                ENDM
21
 
29
 
-
 
30
; генерация заголовка Hobeta файла
22
SUM_HOB         MACRO STR,AA,BB,CC
31
SUM_HOB         MACRO STR,AA,BB,CC
23
                DB STR
32
                DB STR
24
                DW AA
33
                DW AA
25
                DW BB
34
                DW BB
26
                DB 0
35
                DB 0
Line 45... Line 54...
45
$$I := ($$I+$$S+HIGH (CC)+(HIGH (CC)*0X100))&0XFFFF
54
$$I := ($$I+$$S+HIGH (CC)+(HIGH (CC)*0X100))&0XFFFF
46
$$S := $$S+1
55
$$S := $$S+1
47
                DW $$I
56
                DW $$I
48
                ENDM
57
                ENDM
49
 
58
 
-
 
59
; заполнение области указанным байтом или нулем при отсуствии второго параметра
50
DUPL            MACRO LEN,FILL
60
DUPL            MACRO LEN,FILL
51
DUPL:
61
DUPL:
52
$$N             EQU (LEN) / 1024
62
$$N             EQU (LEN) / 1024
53
$$M             EQU (LEN) # 1024
63
$$M             EQU (LEN) # 1024
54
                REPT $$N
64
                REPT $$N
55
                DB 1024 DUP(FILL)
65
                DB 1024 DUP(FILL)
56
                ENDM
66
                ENDM
57
                IF $$M <> 0
67
        IF $$M <> 0
-
 
68
        IFB FILL
-
 
69
                DB $$M DUP(0)
-
 
70
        ELSE
58
                DB $$M DUP(FILL)
71
                DB $$M DUP(FILL)
59
                ENDIF
72
        ENDIF
-
 
73
        ENDIF
60
                ENDM
74
                ENDM
61
 
75
 
-
 
76
; старший байт слова
62
HIGH            FUNCTION X,((X >> 8) & 0XFF)
77
HIGH            FUNCTION X,((X >> 8) & 0XFF)
-
 
78
; младший байт слова
63
LOW             FUNCTION X,(X & 0XFF)
79
LOW             FUNCTION X,(X & 0XFF)
64
 
80
 
-
 
81
; вызов подпрограммы в другой странице ROM
65
PCALL           MACRO ADR,PAGE
82
ROMCALL         MACRO ADR,PAGE
66
                RST 0X30
83
                RST 0X30
67
                DW ADR
84
                DW ADR
68
                DB PAGE
85
                DB PAGE
69
                ENDM
86
                ENDM
70
 
87
 
-
 
88
; вызов подпрограммы в другой странице RAM
-
 
89
RAMCALL         MACRO ADR,PAGE
-
 
90
                RST 0X20
-
 
91
                DW ADR
-
 
92
                DB PAGE
-
 
93
                ENDM
-
 
94
 
-
 
95
; запись в порт ATM Turbo 2+
71
ATMPORT         MACRO PORT,BYTE
96
ATMPORT         MACRO PORT,BYTE
72
                LD BC,PORT
97
                LD BC,PORT
-
 
98
        IF BYTE = 0
-
 
99
                XOR A
-
 
100
        ELSE
73
                LD A,BYTE
101
                LD A,BYTE
-
 
102
        ENDIF
74
                OUT (C),A
103
                OUT (C),A
75
                ENDM
104
                ENDM
76
 
105
 
-
 
106
; запись в порт расширенных портов PentEvo
77
EVOPORT         MACRO PORT,BYTE
107
EVOPORT         MACRO PORT,BYTE
78
                LD BC,PORT
108
                LD BC,PORT
-
 
109
        IF BYTE = 0
-
 
110
                XOR A
-
 
111
        ELSE
79
                LD A,BYTE
112
                LD A,BYTE
-
 
113
        ENDIF
80
                OUT (C),A
114
                OUT (C),A
81
                ENDM
115
                ENDM
82
 
116
 
-
 
117
; включение бита (битов) в порту 0xBF
83
PEC_ON          MACRO BYTE
118
PEC_ON          MACRO BYTE
84
                IN A,(PEVO_CONF)
119
                IN A,(PEVO_CONF)
85
                OR BYTE
120
                OR BYTE
86
                OUT (PEVO_CONF),A
121
                OUT (PEVO_CONF),A
87
                ENDM
122
                ENDM
88
 
123
 
-
 
124
; сброс бита (битов) в порту 0xBF
89
PEC_OFF         MACRO BYTE
125
PEC_OFF         MACRO BYTE
90
                IN A,(PEVO_CONF)
126
                IN A,(PEVO_CONF)
91
                AND BYTE!0XFF
127
                AND BYTE!0XFF
92
                OUT (PEVO_CONF),A
128
                OUT (PEVO_CONF),A
93
                ENDM
129
                ENDM
94
 
130
 
-
 
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"
95
SIZEDATE        EQU STRLEN (DATE)
140
SIZEDATE        EQU STRLEN (DATE)
-
 
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
96
 
171
 
-
 
172
; генерация времени
-
 
173
; "9:28:8"
-
 
174
SIZETIME        EQU STRLEN (TIME)
97
                IF SIZEDATE=10
175
__POS := 0
-
 
176
; извлечение часа
98
MMOUNTH         EQU (CHARFROMSTR (DATE,0)-0X30)*10+(CHARFROMSTR (DATE,1)-0X30)
177
HHOUR := CHARFROMSTR (TIME, __POS) - '0'
-
 
178
__POS := __POS + 1
99
DDATE           EQU (CHARFROMSTR (DATE,3)-0X30)*10+(CHARFROMSTR (DATE,4)-0X30)
179
        IF (CHARFROMSTR (TIME,__POS)) <= '9'
100
YYEAR           EQU (CHARFROMSTR (DATE,8)-0X30)*10+(CHARFROMSTR (DATE,9)-0X30)
180
HHOUR := HHOUR * 10 + CHARFROMSTR (TIME, __POS) - '0'
101
                ELSEIF SIZEDATE=8
181
__POS := __POS + 1
-
 
182
        ENDIF
102
MMOUNTH         EQU (CHARFROMSTR (DATE,0)-0X30)
183
__POS := __POS + 1
103
DDATE           EQU (CHARFROMSTR (DATE,2)-0X30)
184
; извлечение минут
104
YYEAR           EQU (CHARFROMSTR (DATE,6)-0X30)*10+(CHARFROMSTR (DATE,7)-0X30)
185
MMINUTE := CHARFROMSTR (TIME, __POS) - '0'
105
                ELSEIF (CHARFROMSTR (DATE,1))=0X2F
186
__POS := __POS + 1
106
MMOUNTH         EQU (CHARFROMSTR (DATE,0)-0X30)
187
        IF (CHARFROMSTR (TIME,__POS)) <= '9'
107
DDATE           EQU (CHARFROMSTR (DATE,2)-0X30)*10+(CHARFROMSTR (DATE,3)-0X30)
188
MMINUTE := MMINUTE * 10 + CHARFROMSTR (TIME, __POS) - '0'
108
YYEAR           EQU (CHARFROMSTR (DATE,7)-0X30)*10+(CHARFROMSTR (DATE,8)-0X30)
189
__POS := __POS + 1
109
                ELSE
190
        ENDIF
-
 
191
__POS := __POS + 1
110
MMOUNTH         EQU (CHARFROMSTR (DATE,0)-0X30)*10+(CHARFROMSTR (DATE,1)-0X30)
192
; извлечение секунд
111
DDATE           EQU (CHARFROMSTR (DATE,3)-0X30)
193
SSECUND := CHARFROMSTR (TIME, __POS) - '0'
-
 
194
__POS := __POS + 1
-
 
195
        IF __POS < SIZETIME
112
YYEAR           EQU (CHARFROMSTR (DATE,7)-0X30)*10+(CHARFROMSTR (DATE,8)-0X30)
196
SSECUND := SSECUND * 10 + CHARFROMSTR (TIME, __POS) - '0'
113
                ENDIF
197
        ENDIF
114
DATA_VERS       EQU DDATE+(MMOUNTH<<5)+(YYEAR<<9)+0X8000                        ;УЖЕ УПАКОВАНО
-
 
115
 
198
 
-
 
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
; генерация даты и времени в текстовом виде
116
TEXTDATE        MACRO
205
TEXTDATE        MACRO
-
 
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)
-
 
210
                ENDM
-
 
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
117
                IF DDATE<10
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
; генерация метки с резервированием места и размера области
118
TDATE           DB DDATE+0X30
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
119
                ELSE
269
        ELSE
120
TDATE           DB ((DDATE/10)+0X30),(DDATE#10)+0X30
270
INITVAR := 0
121
                ENDIF
271
        ENDIF
122
                DB "."
272
                ENDM
-
 
273
 
-
 
274
; выравнивание для генерации меток на границу 256 байт
123
                IF MMOUNTH<10
275
SETVAR_ALIGN    MACRO
-
 
276
INITVAR := INITVAR + 0x100 - (INITVAR & 0xFF)
-
 
277
                ENDM
-
 
278
 
-
 
279
; выравнивание текущего адреса на границу 256 байт
124
TMOUNTH         DB MMOUNTH+0X30
280
ALIGN           MACRO BYTES,FILL
-
 
281
        IFNB
-
 
282
                DB BYTES - ($ & (BYTES - 1)) DUP (0)
125
                ELSE
283
        ELSE
126
TMOUNTH         DB MMOUNTH/10+0X30,MMOUNTH#10+0X30
284
                DB BYTES - ($ & (BYTES - 1)) DUP (FILL)
127
                ENDIF
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
128
                DB ".",CHARFROMSTR (DATE,SIZEDATE-4),CHARFROMSTR (DATE,SIZEDATE-3)
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
129
                DB CHARFROMSTR (DATE,SIZEDATE-2),CHARFROMSTR (DATE,SIZEDATE-1)
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)
130
                ENDM
361
                ENDM