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 |