Subversion Repositories pentevo

Rev

Rev 1120 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 13.02.2025 savelij
  3.  
  4. ; автоопределение кодировки работает неправильно
  5.  
  6.                 RELAXED ON
  7.                 CPU Z80UNDOC
  8.  
  9. BUILD_DEBUG     EQU 0
  10.  
  11.         IFDEF DOS_FE
  12. ;TESTEMUFDD     ; сборка для тестирования эмулятора
  13.         ENDIF
  14.  
  15. ; вставка текстовой строки с нулем в окончании
  16. DZ              MACRO DEFZ
  17.                 DB DEFZ,0
  18.                 ENDM
  19.  
  20. ; вставка текстовой строки с установкой 7 бита у последнего символа
  21. DC              MACRO DEFC
  22.         IF STRLEN(DEFC) > 1
  23.                 DB SUBSTR(DEFC,0,STRLEN(DEFC)-1)
  24.         ENDIF
  25.         IF STRLEN(DEFC) > 0
  26.                 DB CHARFROMSTR(DEFC,STRLEN(DEFC)-1)|80H
  27.         ENDIF
  28.                 ENDM
  29.  
  30. ; генерация заголовка Hobeta файла
  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.  
  59. ; заполнение области указанным байтом или нулем при отсуствии второго параметра
  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
  67.         IF $$M <> 0
  68.         IFB FILL
  69.                 DB $$M DUP(0)
  70.         ELSE
  71.                 DB $$M DUP(FILL)
  72.         ENDIF
  73.         ENDIF
  74.                 ENDM
  75.  
  76. ; старший байт слова
  77. HIGH            FUNCTION X,((X >> 8) & 0xFF)
  78. ; младший байт слова
  79. LOW             FUNCTION X,(X & 0xFF)
  80.  
  81. ; вызов подпрограммы в другой странице ROM
  82. ROMCALL         MACRO ADR,PAGE
  83.                 RST 0x30
  84.                 DW ADR
  85.                 DB PAGE
  86.                 ENDM
  87.  
  88. ; вызов подпрограммы в другой странице RAM
  89. RAMCALL         MACRO ADR,PAGE
  90.                 RST 0x20
  91.                 DW ADR
  92.                 DB PAGE
  93.                 ENDM
  94.  
  95. ; запись в порт ATM Turbo 2+
  96. ATMPORT         MACRO PORT,BYTE
  97.                 LD BC,PORT
  98.         IF BYTE = 0
  99.                 XOR A
  100.         ELSE
  101.                 LD A,BYTE
  102.         ENDIF
  103.                 OUT (C),A
  104.                 ENDM
  105.  
  106. ; запись в порт расширенных портов PentEvo
  107. EVOPORT         MACRO PORT,BYTE
  108.                 LD BC,PORT
  109.         IF BYTE = 0
  110.                 XOR A
  111.         ELSE
  112.                 LD A,BYTE
  113.         ENDIF
  114.                 OUT (C),A
  115.                 ENDM
  116.  
  117. ; включение бита (битов) в порту 0xBF
  118. PEC_ON          MACRO BYTE
  119.                 IN A,(PEVO_CONF)
  120.                 OR BYTE
  121.                 OUT (PEVO_CONF),A
  122.                 ENDM
  123.  
  124. ; сброс бита (битов) в порту 0xBF
  125. PEC_OFF         MACRO BYTE
  126.                 IN A,(PEVO_CONF)
  127.                 AND BYTE!0xFF
  128.                 OUT (PEVO_CONF),A
  129.                 ENDM
  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"
  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
  171.  
  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
  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. ; генерация даты и времени в текстовом виде
  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
  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. _BITMASK        MACRO NAME,NUM
  242. .B_NAME         EQU NUM
  243. .M_NAME         EQU 1 << NUM
  244.                 ENDM
  245. ; генерация метки с резервированием места и размера области (вверх по памяти)
  246. SETVAR          MACRO NAME,SIZE
  247. NAME            EQU INITVAR             ; номер имени
  248.         IFNB SIZE
  249. INITVAR := INITVAR + SIZE
  250. NAME_Size       EQU SIZE                ; размер
  251.         ELSE
  252. INITVAR := INITVAR + BYTE
  253. NAME_Size       EQU BYTE
  254.         ENDIF
  255. NAME_CurAdr     EQU $                   ; текущий адрес
  256.                 ENDM
  257.  
  258. ; генерация метки с резервированием места и размера области (вниз по памяти)
  259. MINUSVAR        MACRO NAME,SIZE
  260.         IFNB SIZE
  261. INITVAR := INITVAR - SIZE
  262. NAME_Size       EQU SIZE                ; размер
  263.         ELSE
  264. INITVAR := INITVAR - BYTE
  265. NAME_Size       EQU BYTE
  266.         ENDIF
  267. NAME_CurAdr     EQU $                   ; текущий адрес
  268. NAME            EQU INITVAR             ; номер имени
  269.                 ENDM
  270.  
  271. ; перенос метки назад на указанное число байт
  272. SUBVAR          MACRO SIZE
  273. INITVAR := INITVAR - SIZE
  274.                 ENDM
  275.  
  276. ; перенос метки вперед на указанное число байт
  277. ADDVAR          MACRO SIZE
  278. INITVAR := INITVAR + SIZE
  279.                 ENDM
  280.  
  281. ; инициализация переменной для резервирования указанным числом
  282. ; или 0 при отсуствии второго параметра
  283. INIT_VAR        MACRO START
  284.         IFNB START
  285. INITVAR := START
  286.         ELSE
  287. INITVAR := 0
  288.         ENDIF
  289.                 ENDM
  290.  
  291. ; выравнивание для генерации меток на границу 256 байт
  292. SETVAR_ALIGN    MACRO
  293. INITVAR := INITVAR + 0x100 - (INITVAR & 0xFF)
  294.                 ENDM
  295.  
  296. ; выравнивание текущего адреса на границу 256 байт
  297. ALIGN           MACRO BYTES,FILL
  298.         IFNB
  299.                 DB BYTES - ($ & (BYTES - 1)) DUP (0)
  300.         ELSE
  301.                 DB BYTES - ($ & (BYTES - 1)) DUP (FILL)
  302.         ENDIF
  303.                 ENDM
  304.  
  305. MALIGN          MACRO
  306.         IF LOW($) = 0
  307.                 DUPL (HIGH($) << 8) - $,0
  308.         ELSE
  309.                 DUPL ((HIGH($) + 1) << 8) - $,0
  310.         ENDIF
  311.                 ENDM
  312.  
  313. ; выравнивание до сектора с учетом адреса компиляции
  314. DALIGN          MACRO ADDRESS
  315.         IF LOW (ADDRESS)
  316.                 DB LOW (LOW (-$)+LOW(ADDRESS)) DUP(0)
  317.         ELSE
  318.                 DB LOW (-$) DUP (0)
  319.         ENDIF
  320.                 ENDM
  321.  
  322. ; преобразование 16 битного числа в текст
  323. WORD2TXT        MACRO WORD
  324. $$DEC1 := (WORD)/10000
  325. $$TMP := WORD-$$DEC1*10000
  326. $$DEC2 := $$TMP/1000
  327. $$TMP := $$TMP-$$DEC2*1000
  328. $$DEC3 := $$TMP/100
  329. $$TMP := $$TMP-$$DEC3*100
  330. $$DEC4 := $$TMP/10
  331. $$TMP := $$TMP-$$DEC4*10
  332. $$DEC5 := $$TMP
  333.         DB $$DEC1+'0',$$DEC2+'0',$$DEC3+'0',$$DEC4+'0',$$DEC5+'0'
  334.                 ENDM
  335.  
  336. WINHDR          MACRO X,Y,V,H,CWIN,CCUR,FLAGS,NUMPKT,TEKPKT,NUMKOL, \
  337.                         ADRTXT,ADRPRG,ADRMOUSE,ADRHOTKEY
  338.                 DB X,Y,V,H,CWIN,CCUR,FLAGS,NUMPKT
  339.                 DW TEKPKT,NUMKOL,ADRTXT,ADRPRG,ADRMOUSE,ADRHOTKEY
  340.                 ENDM
  341.  
  342. ; генерация метки с резервированием места и размера области (вверх по памяти)
  343. _SETVAR         MACRO NAME, SIZE
  344. NAME            EQU .CURRVAR            ; номер имени
  345.         IFNB SIZE
  346. .CURRVAR := .CURRVAR + SIZE
  347. NAME_Size       EQU SIZE                ; размер
  348.         ELSE
  349. .CURRVAR := .CURRVAR + BYTE
  350. NAME_Size       EQU BYTE
  351.         ENDIF
  352. NAME_CurAdr     EQU $                   ; текущий адрес
  353.                 ENDM
  354.  
  355. ; перенос метки назад на указанное число байт
  356. _SUBVAR         MACRO SIZE
  357. .CURRVAR := .CURRVAR - SIZE
  358.                 ENDM
  359.  
  360. ; перенос метки вперед на указанное число байт
  361. _ADDVAR         MACRO SIZE
  362. .CURRVAR := .CURRVAR + SIZE
  363.                 ENDM
  364.  
  365. ; генерация метки с резервированием места и размера области (вниз по памяти)
  366. _MINUSVAR       MACRO NAME, SIZE
  367.         IFNB SIZE
  368. .CURRVAR := .CURRVAR - SIZE
  369. NAME_Size       EQU SIZE                ; размер
  370.         ELSE
  371. .CURRVAR := .CURRVAR - BYTE
  372. NAME_Size       EQU BYTE
  373.         ENDIF
  374. NAME_CurAdr     EQU $                   ; текущий адрес
  375. NAME            EQU .CURRVAR            ; номер имени
  376.                 ENDM
  377.  
  378.  
  379. ; инициализация переменной для резервирования указанным числом
  380. ; или 0 при отсуствии второго параметра
  381. _INIT_VAR       MACRO START
  382.         IFNB START
  383. .CURRVAR := START
  384.         ELSE
  385. .CURRVAR := 0
  386.         ENDIF
  387.                 ENDM
  388.  
  389. ; выравнивание для генерации меток на границу 256 байт
  390. _SETVAR_ALIGN   MACRO
  391. .CURRVAR := .CURRVAR + 0x100 - (.CURRVAR & 0xFF)
  392.                 ENDM
  393.