Subversion Repositories pentevo

Rev

Rev 1026 | Rev 1031 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 13.10.2022 savelij
  3.  
  4. ; автоопределение кодировки работает неправильно
  5.  
  6.                 RELAXED ON
  7.                 CPU Z80UNDOC
  8.  
  9. BUILD_DEBUG     EQU 0
  10. REZIDENT        ; включение резидента в сборку
  11.  
  12.         IFDEF DOS_FE
  13. ;TESTEMUFDD     ; сборка для тестирования эмулятора
  14.         ENDIF
  15.  
  16. ; вставка текстовой строки с нулем в окончании
  17. DZ              MACRO DEFZ
  18.                 DB DEFZ,0
  19.                 ENDM
  20.  
  21. ; вставка текстовой строки с установкой 7 бита у последнего символа
  22. DC              MACRO DEFC
  23.         IF STRLEN(DEFC)>1
  24.                 DB SUBSTR(DEFC,0,STRLEN(DEFC)-1)
  25.         ENDIF
  26.         IF STRLEN(DEFC)>0
  27.                 DB CHARFROMSTR(DEFC,STRLEN(DEFC)-1)|80H
  28.         ENDIF
  29.                 ENDM
  30.  
  31. ; генерация заголовка Hobeta файла
  32. SUM_HOB         MACRO STR,AA,BB,CC
  33.                 DB STR
  34.                 DW AA
  35.                 DW BB
  36.                 DB 0
  37.                 DB CC
  38. $$I := 0
  39. $$S := 0
  40.                 REPT 9
  41. $$N := CHARFROMSTR (STR,STRLEN(STR)+$$S-9)
  42. $$I := ($$I+$$S+$$N+($$N*256))&0XFFFF
  43. $$S := $$S+1
  44.                 ENDM
  45. $$I := ($$I+$$S+LOW (AA)+(LOW (AA)*0X100))&0XFFFF
  46. $$S := $$S+1
  47. $$I := ($$I+$$S+HIGH (AA)+(HIGH (AA)*0X100))&0XFFFF
  48. $$S := $$S+1
  49. $$I := ($$I+$$S+LOW (BB)+(LOW (BB)*0X100))&0XFFFF
  50. $$S := $$S+1
  51. $$I := ($$I+$$S+HIGH (BB)+(HIGH (BB)*0X100))&0XFFFF
  52. $$S := $$S+1
  53. $$I := ($$I+$$S+LOW (CC)+(LOW (CC)*0X100))&0XFFFF
  54. $$S := $$S+1
  55. $$I := ($$I+$$S+HIGH (CC)+(HIGH (CC)*0X100))&0XFFFF
  56. $$S := $$S+1
  57.                 DW $$I
  58.                 ENDM
  59.  
  60. ; заполнение области указанным байтом или нулем при отсуствии второго параметра
  61. DUPL            MACRO LEN,FILL
  62. DUPL:
  63. $$N             EQU (LEN) / 1024
  64. $$M             EQU (LEN) # 1024
  65.                 REPT $$N
  66.                 DB 1024 DUP(FILL)
  67.                 ENDM
  68.         IF $$M <> 0
  69.         IFB FILL
  70.                 DB $$M DUP(0)
  71.         ELSE
  72.                 DB $$M DUP(FILL)
  73.         ENDIF
  74.         ENDIF
  75.                 ENDM
  76.  
  77. ; старший байт слова
  78. HIGH            FUNCTION X,((X >> 8) & 0XFF)
  79. ; младший байт слова
  80. LOW             FUNCTION X,(X & 0XFF)
  81.  
  82. ; вызов подпрограммы в другой странице ROM
  83. ROMCALL         MACRO ADR,PAGE
  84.                 RST 0X30
  85.                 DW ADR
  86.                 DB PAGE
  87.                 ENDM
  88.  
  89. ; вызов подпрограммы в другой странице RAM
  90. RAMCALL         MACRO ADR,PAGE
  91.                 RST 0X20
  92.                 DW ADR
  93.                 DB PAGE
  94.                 ENDM
  95.  
  96. ; запись в порт ATM Turbo 2+
  97. ATMPORT         MACRO PORT,BYTE
  98.                 LD BC,PORT
  99.         IF BYTE = 0
  100.                 XOR A
  101.         ELSE
  102.                 LD A,BYTE
  103.         ENDIF
  104.                 OUT (C),A
  105.                 ENDM
  106.  
  107. ; запись в порт расширенных портов PentEvo
  108. EVOPORT         MACRO PORT,BYTE
  109.                 LD BC,PORT
  110.         IF BYTE = 0
  111.                 XOR A
  112.         ELSE
  113.                 LD A,BYTE
  114.         ENDIF
  115.                 OUT (C),A
  116.                 ENDM
  117.  
  118. ; включение бита (битов) в порту 0xBF
  119. PEC_ON          MACRO BYTE
  120.                 IN A,(PEVO_CONF)
  121.                 OR BYTE
  122.                 OUT (PEVO_CONF),A
  123.                 ENDM
  124.  
  125. ; сброс бита (битов) в порту 0xBF
  126. PEC_OFF         MACRO BYTE
  127.                 IN A,(PEVO_CONF)
  128.                 AND BYTE!0XFF
  129.                 OUT (PEVO_CONF),A
  130.                 ENDM
  131.  
  132. ; чтение порта 0x7FFD
  133. READ_7FFD       MACRO
  134.                 LD A,HIGH (RD_7FFD)
  135.                 IN A,(LOW (RD_7FFD))
  136.                 ENDM
  137.  
  138. ; генерация даты
  139. ; LINUX         DATE: "10/07/21"
  140. ; WIN32         DATE: "10/7/2021"
  141. SIZEDATE        EQU STRLEN (DATE)
  142. __POS := 0
  143. ; извлечение месяца
  144. MMOUNTH := (CHARFROMSTR (DATE,__POS) - '0')
  145. __POS := __POS + 1
  146.         IF MOMPASS > 1
  147.         IF (CHARFROMSTR (DATE,__POS)) <> '/'
  148. MMOUNTH := MMOUNTH * 10 + (CHARFROMSTR (DATE,__POS) - '0')
  149. __POS := __POS + 2
  150.         ELSE
  151. __POS := __POS + 1
  152.         ENDIF
  153.         ENDIF
  154. ; извлечение даты
  155. DDATE := (CHARFROMSTR (DATE,__POS) - '0')
  156. __POS := __POS + 1
  157.         IF MOMPASS > 1
  158.         IF (CHARFROMSTR (DATE,__POS) <> '/')
  159. DDATE := DDATE * 10 + (CHARFROMSTR (DATE,__POS) - '0')
  160. __POS := __POS + 2
  161.         ELSE
  162. __POS := __POS + 1
  163.         ENDIF
  164.         ENDIF
  165. ; извлечение года
  166. YYEAR := (CHARFROMSTR (DATE,__POS) - '0')
  167. __POS := __POS + 1
  168.         IF MOMPASS > 1
  169.         WHILE __POS < SIZEDATE
  170.         IF (CHARFROMSTR (DATE,__POS) <> '/')
  171. YYEAR := YYEAR * 10 + (CHARFROMSTR (DATE,__POS) - '0')
  172. __POS := __POS + 1
  173.         ENDIF
  174.         ENDM
  175.         ENDIF
  176.         IF YYEAR > 99
  177. YYEAR := YYEAR - 2000
  178.         ENDIF
  179.  
  180. ; генерация времени
  181. ; "9:28:8"
  182. SIZETIME        EQU STRLEN (TIME)
  183. __POS := 0
  184. ; извлечение часа
  185. HHOUR := CHARFROMSTR (TIME, __POS) - '0'
  186. __POS := __POS + 1
  187.         IF MOMPASS > 1
  188.         IF (CHARFROMSTR (TIME, __POS) <> ':')
  189. HHOUR := HHOUR * 10 + CHARFROMSTR (TIME, __POS) - '0'
  190. __POS := __POS + 2
  191.         ELSE
  192. __POS := __POS + 1
  193.         ENDIF
  194.         ENDIF
  195. ; извлечение минут
  196. MMINUTE := CHARFROMSTR (TIME, __POS) - '0'
  197. __POS := __POS + 1
  198.         IF MOMPASS > 1
  199.         IF (CHARFROMSTR (TIME, __POS) <> ':')
  200. MMINUTE := MMINUTE * 10 + CHARFROMSTR (TIME, __POS) - '0'
  201. __POS := __POS + 2
  202.         ELSE
  203. __POS := __POS + 1
  204.         ENDIF
  205.         ENDIF
  206. ; извлечение секунд
  207. SSECUND := CHARFROMSTR (TIME, __POS) - '0'
  208. __POS := __POS + 1
  209.         IF MOMPASS > 1
  210.         IF __POS < SIZETIME
  211. SSECUND := SSECUND * 10 + CHARFROMSTR (TIME, __POS) - '0'
  212.         ENDIF
  213.         ENDIF
  214.  
  215. DATA_VERS       EQU DDATE + (MMOUNTH << 5) + (YYEAR<<9) + 0x8000                        ;уже упаковано
  216.  
  217. FAT_DATE        EQU DDATE + (MMOUNTH << 5) + ((2000 + YYEAR - 1980) & 0x7F) << 9
  218. FAT_TIME        EQU SSECUND / 2 + (MMINUTE << 5) + (HHOUR << 11)
  219.  
  220. ; генерация даты и времени в текстовом виде
  221. TEXTDATE        MACRO
  222.                 DB (DDATE / 10) + '0', (DDATE # 10) + '0', '.'
  223.                 DB MMOUNTH / 10 + '0', MMOUNTH # 10 + '0', '.'
  224.                 DB CHARFROMSTR (DATE, SIZEDATE - 4), CHARFROMSTR (DATE, SIZEDATE - 3)
  225.                 DB CHARFROMSTR (DATE, SIZEDATE - 2), CHARFROMSTR (DATE, SIZEDATE - 1)
  226.                 ENDM
  227.  
  228. TEXTTIME        MACRO
  229.                 DB HHOUR/10 + '0', HHOUR#10 + '0', '.'
  230.                 DB MMINUTE/10 + '0', MMINUTE#10 + '0', '.'
  231.                 DB SSECUND/10 + '0', SSECUND#10 + '0'
  232.                 ENDM
  233.  
  234. ; вызов RST 8 с параметрами
  235. RST8            MACRO N1,N2,N3
  236.                 RST 8
  237.                 DB N1
  238.         IFNB N2
  239.                 DB N2
  240.         ENDIF
  241.         IFNB N3
  242.                 DB N3
  243.         ENDIF
  244.                 ENDM
  245.  
  246. BYTE            EQU 1
  247. WORD            EQU 2
  248. JUMP            EQU 3
  249. DWORD           EQU 4
  250. QWORD           EQU 8
  251.  
  252. BITMASK         MACRO NAME,NUM
  253. B_NAME          EQU NUM
  254. M_NAME          EQU 1<<NUM
  255.                 ENDM
  256.  
  257. ; генерация метки с резервированием места и размера области
  258. SETVAR          MACRO NAME,SIZE
  259. NAME            EQU INITVAR             ; номер имени
  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.                 ENDM
  269.  
  270. ; перенос метки назад на указанное число байт
  271. SUBVAR          MACRO SIZE
  272. INITVAR := INITVAR-SIZE
  273.                 ENDM
  274.  
  275. ; перенос метки вперед на указанное число байт
  276. ADDVAR          MACRO SIZE
  277. INITVAR := INITVAR+SIZE
  278.                 ENDM
  279.  
  280. ; инициализация переменной для резервирования указанным числом
  281. ; или 0 при отсуствии второго параметра
  282. INIT_VAR        MACRO START
  283.         IFNB START
  284. INITVAR := START
  285.         ELSE
  286. INITVAR := 0
  287.         ENDIF
  288.                 ENDM
  289.  
  290. ; выравнивание для генерации меток на границу 256 байт
  291. SETVAR_ALIGN    MACRO
  292. INITVAR := INITVAR + 0x100 - (INITVAR & 0xFF)
  293.                 ENDM
  294.  
  295. ; выравнивание текущего адреса на границу 256 байт
  296. ALIGN           MACRO BYTES,FILL
  297.         IFNB
  298.                 DB BYTES - ($ & (BYTES - 1)) DUP (0)
  299.         ELSE
  300.                 DB BYTES - ($ & (BYTES - 1)) DUP (FILL)
  301.         ENDIF
  302.                 ENDM
  303.  
  304. MALIGN          MACRO
  305.         IF LOW($) = 0
  306.                 DUPL (HIGH($) << 8) - $,0
  307.         ELSE
  308.                 DUPL ((HIGH($) + 1) << 8) - $,0
  309.         ENDIF
  310.                 ENDM
  311.  
  312. ; выравнивание до сектора с учетом адреса компиляции
  313. DALIGN          MACRO ADDRESS
  314.         IF LOW(ADDRESS)
  315.                 DB LOW (-$)+LOW(ADDRESS) DUP(0)
  316.         ELSE
  317.                 DB LOW (-$) DUP (0)
  318.         ENDIF
  319.                 ENDM
  320.  
  321. ; преобразование 16 битного числа в текст
  322. WORD2TXT        MACRO WORD
  323. $$DEC1 := (WORD)/10000
  324. $$TMP := WORD-$$DEC1*10000
  325. $$DEC2 := $$TMP/1000
  326. $$TMP := $$TMP-$$DEC2*1000
  327. $$DEC3 := $$TMP/100
  328. $$TMP := $$TMP-$$DEC3*100
  329. $$DEC4 := $$TMP/10
  330. $$TMP := $$TMP-$$DEC4*10
  331. $$DEC5 := $$TMP
  332.         DB $$DEC1+'0',$$DEC2+'0',$$DEC3+'0',$$DEC4+'0',$$DEC5+'0'
  333.                 ENDM
  334.  
  335. WINHDR          MACRO X,Y,V,H,CWIN,CCUR,FLAGS,NUMPKT,TEKPKT,NUMKOL, \
  336.                         ADRTXT,ADRPRG,ADRMOUSE,ADRHOTKEY
  337.                 DB X,Y,V,H,CWIN,CCUR,FLAGS,NUMPKT
  338.                 DW TEKPKT,NUMKOL,ADRTXT,ADRPRG,ADRMOUSE,ADRHOTKEY
  339.                 ENDM
  340.