Subversion Repositories pentevo

Rev

Rev 1046 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 26.12.2022 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 MOMPASS > 1
  146.         IF (CHARFROMSTR (DATE,__POS)) <> '/'
  147. MMOUNTH := MMOUNTH * 10 + (CHARFROMSTR (DATE,__POS) - '0')
  148. __POS := __POS + 2
  149.         ELSE
  150. __POS := __POS + 1
  151.         ENDIF
  152.         ENDIF
  153. ; извлечение даты
  154. DDATE := (CHARFROMSTR (DATE,__POS) - '0')
  155. __POS := __POS + 1
  156.         IF MOMPASS > 1
  157.         IF (CHARFROMSTR (DATE,__POS) <> '/')
  158. DDATE := DDATE * 10 + (CHARFROMSTR (DATE,__POS) - '0')
  159. __POS := __POS + 2
  160.         ELSE
  161. __POS := __POS + 1
  162.         ENDIF
  163.         ENDIF
  164. ; извлечение года
  165. YYEAR := (CHARFROMSTR (DATE,__POS) - '0')
  166. __POS := __POS + 1
  167.         IF MOMPASS > 1
  168.         WHILE __POS < SIZEDATE
  169.         IF (CHARFROMSTR (DATE,__POS) <> '/')
  170. YYEAR := YYEAR * 10 + (CHARFROMSTR (DATE,__POS) - '0')
  171. __POS := __POS + 1
  172.         ENDIF
  173.         ENDM
  174.         ENDIF
  175.         IF YYEAR > 99
  176. YYEAR := YYEAR - 2000
  177.         ENDIF
  178.  
  179. ; генерация времени
  180. ; "9:28:8"
  181. SIZETIME        EQU STRLEN (TIME)
  182. __POS := 0
  183. ; извлечение часа
  184. HHOUR := CHARFROMSTR (TIME, __POS) - '0'
  185. __POS := __POS + 1
  186.         IF MOMPASS > 1
  187.         IF (CHARFROMSTR (TIME, __POS) <> ':')
  188. HHOUR := HHOUR * 10 + CHARFROMSTR (TIME, __POS) - '0'
  189. __POS := __POS + 2
  190.         ELSE
  191. __POS := __POS + 1
  192.         ENDIF
  193.         ENDIF
  194. ; извлечение минут
  195. MMINUTE := CHARFROMSTR (TIME, __POS) - '0'
  196. __POS := __POS + 1
  197.         IF MOMPASS > 1
  198.         IF (CHARFROMSTR (TIME, __POS) <> ':')
  199. MMINUTE := MMINUTE * 10 + CHARFROMSTR (TIME, __POS) - '0'
  200. __POS := __POS + 2
  201.         ELSE
  202. __POS := __POS + 1
  203.         ENDIF
  204.         ENDIF
  205. ; извлечение секунд
  206. SSECUND := CHARFROMSTR (TIME, __POS) - '0'
  207. __POS := __POS + 1
  208.         IF MOMPASS > 1
  209.         IF __POS < SIZETIME
  210. SSECUND := SSECUND * 10 + CHARFROMSTR (TIME, __POS) - '0'
  211.         ENDIF
  212.         ENDIF
  213.  
  214. DATA_VERS       EQU DDATE + (MMOUNTH << 5) + (YYEAR<<9) + 0x8000                        ;уже упаковано
  215.  
  216. FAT_DATE        EQU DDATE + (MMOUNTH << 5) + ((2000 + YYEAR - 1980) & 0x7F) << 9
  217. FAT_TIME        EQU SSECUND / 2 + (MMINUTE << 5) + (HHOUR << 11)
  218.  
  219. ; генерация даты и времени в текстовом виде
  220. TEXTDATE        MACRO
  221.                 DB (DDATE / 10) + '0', (DDATE # 10) + '0', '.'
  222.                 DB MMOUNTH / 10 + '0', MMOUNTH # 10 + '0', '.'
  223.                 DB CHARFROMSTR (DATE, SIZEDATE - 4), CHARFROMSTR (DATE, SIZEDATE - 3)
  224.                 DB CHARFROMSTR (DATE, SIZEDATE - 2), CHARFROMSTR (DATE, SIZEDATE - 1)
  225.                 ENDM
  226.  
  227. TEXTTIME        MACRO
  228.                 DB HHOUR/10 + '0', HHOUR#10 + '0', '.'
  229.                 DB MMINUTE/10 + '0', MMINUTE#10 + '0', '.'
  230.                 DB SSECUND/10 + '0', SSECUND#10 + '0'
  231.                 ENDM
  232.  
  233. ; вызов RST 8 с параметрами
  234. RST8            MACRO N1,N2,N3
  235.                 RST 8
  236.                 DB N1
  237.         IFNB N2
  238.                 DB N2
  239.         ENDIF
  240.         IFNB N3
  241.                 DB N3
  242.         ENDIF
  243.                 ENDM
  244.  
  245. BYTE            EQU 1
  246. WORD            EQU 2
  247. JUMP            EQU 3
  248. DWORD           EQU 4
  249. QWORD           EQU 8
  250.  
  251. BITMASK         MACRO NAME,NUM
  252. B_NAME          EQU NUM
  253. M_NAME          EQU 1<<NUM
  254.                 ENDM
  255.  
  256. ; генерация метки с резервированием места и размера области
  257. SETVAR          MACRO NAME,SIZE
  258. NAME            EQU INITVAR             ; номер имени
  259.         IFNB SIZE
  260. INITVAR := INITVAR+SIZE
  261. NAME_Size       EQU SIZE                ; размер
  262.         ELSE
  263. INITVAR := INITVAR+BYTE
  264. NAME_Size       EQU BYTE
  265.         ENDIF
  266. NAME_CurAdr     EQU $                   ; текущий адрес
  267.                 ENDM
  268.  
  269. ; перенос метки назад на указанное число байт
  270. SUBVAR          MACRO SIZE
  271. INITVAR := INITVAR-SIZE
  272.                 ENDM
  273.  
  274. ; перенос метки вперед на указанное число байт
  275. ADDVAR          MACRO SIZE
  276. INITVAR := INITVAR+SIZE
  277.                 ENDM
  278.  
  279. ; инициализация переменной для резервирования указанным числом
  280. ; или 0 при отсуствии второго параметра
  281. INIT_VAR        MACRO START
  282.         IFNB START
  283. INITVAR := START
  284.         ELSE
  285. INITVAR := 0
  286.         ENDIF
  287.                 ENDM
  288.  
  289. ; выравнивание для генерации меток на границу 256 байт
  290. SETVAR_ALIGN    MACRO
  291. INITVAR := INITVAR + 0x100 - (INITVAR & 0xFF)
  292.                 ENDM
  293.  
  294. ; выравнивание текущего адреса на границу 256 байт
  295. ALIGN           MACRO BYTES,FILL
  296.         IFNB
  297.                 DB BYTES - ($ & (BYTES - 1)) DUP (0)
  298.         ELSE
  299.                 DB BYTES - ($ & (BYTES - 1)) DUP (FILL)
  300.         ENDIF
  301.                 ENDM
  302.  
  303. MALIGN          MACRO
  304.         IF LOW($) = 0
  305.                 DUPL (HIGH($) << 8) - $,0
  306.         ELSE
  307.                 DUPL ((HIGH($) + 1) << 8) - $,0
  308.         ENDIF
  309.                 ENDM
  310.  
  311. ; выравнивание до сектора с учетом адреса компиляции
  312. DALIGN          MACRO ADDRESS
  313.         IF LOW(ADDRESS)
  314.                 DB LOW (-$)+LOW(ADDRESS) DUP(0)
  315.         ELSE
  316.                 DB LOW (-$) DUP (0)
  317.         ENDIF
  318.                 ENDM
  319.  
  320. ; преобразование 16 битного числа в текст
  321. WORD2TXT        MACRO WORD
  322. $$DEC1 := (WORD)/10000
  323. $$TMP := WORD-$$DEC1*10000
  324. $$DEC2 := $$TMP/1000
  325. $$TMP := $$TMP-$$DEC2*1000
  326. $$DEC3 := $$TMP/100
  327. $$TMP := $$TMP-$$DEC3*100
  328. $$DEC4 := $$TMP/10
  329. $$TMP := $$TMP-$$DEC4*10
  330. $$DEC5 := $$TMP
  331.         DB $$DEC1+'0',$$DEC2+'0',$$DEC3+'0',$$DEC4+'0',$$DEC5+'0'
  332.                 ENDM
  333.  
  334. WINHDR          MACRO X,Y,V,H,CWIN,CCUR,FLAGS,NUMPKT,TEKPKT,NUMKOL, \
  335.                         ADRTXT,ADRPRG,ADRMOUSE,ADRHOTKEY
  336.                 DB X,Y,V,H,CWIN,CCUR,FLAGS,NUMPKT
  337.                 DW TEKPKT,NUMKOL,ADRTXT,ADRPRG,ADRMOUSE,ADRHOTKEY
  338.                 ENDM
  339.