Subversion Repositories pentevo

Rev

Rev 1047 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 10.02.2024 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. ; генерация метки с резервированием места и размера области
  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
  362.