Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 01.08.2021 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. SIZEDATE        EQU STRLEN (DATE)
  140. SIZETIME        EQU STRLEN (TIME)
  141.  
  142.         IF SIZEDATE=10
  143. MMOUNTH         EQU (CHARFROMSTR (DATE,0)-'0')*10+(CHARFROMSTR (DATE,1)-'0')
  144. DDATE           EQU (CHARFROMSTR (DATE,3)-'0')*10+(CHARFROMSTR (DATE,4)-'0')
  145. YYEAR           EQU (CHARFROMSTR (DATE,8)-'0')*10+(CHARFROMSTR (DATE,9)-'0')
  146.         ELSEIF SIZEDATE=8
  147. MMOUNTH         EQU (CHARFROMSTR (DATE,0)-'0')
  148. DDATE           EQU (CHARFROMSTR (DATE,2)-'0')
  149. YYEAR           EQU (CHARFROMSTR (DATE,6)-'0')*10+(CHARFROMSTR (DATE,7)-'0')
  150.         ELSEIF (CHARFROMSTR (DATE,1)) = '/'
  151. MMOUNTH         EQU (CHARFROMSTR (DATE,0)-'0')
  152. DDATE           EQU (CHARFROMSTR (DATE,2)-'0')*10+(CHARFROMSTR (DATE,3)-'0')
  153. YYEAR           EQU (CHARFROMSTR (DATE,7)-'0')*10+(CHARFROMSTR (DATE,8)-'0')
  154.         ELSE
  155. MMOUNTH         EQU (CHARFROMSTR (DATE,0)-'0')*10+(CHARFROMSTR (DATE,1)-'0')
  156. DDATE           EQU (CHARFROMSTR (DATE,3)-'0')
  157. YYEAR           EQU (CHARFROMSTR (DATE,7)-'0')*10+(CHARFROMSTR (DATE,8)-'0')
  158.         ENDIF
  159.  
  160. ; генерация времени
  161. _OffSet_ := 2
  162. $$TMP := CHARFROMSTR (TIME, 0) - '0'
  163.         IF CHARFROMSTR (TIME, 1) <> ':'
  164. HHOUR           EQU $$TMP * 10 + CHARFROMSTR (TIME, 1) - '0'
  165. _OffSet_ := 3
  166.         ELSE
  167. HHOUR           EQU $$TMP
  168.         ENDIF
  169. $$TMP := CHARFROMSTR (TIME, _OffSet_) - '0'
  170.         IF CHARFROMSTR (TIME, _OffSet_ + 1) <> ':'
  171. MMINUTE         EQU $$TMP * 10 + CHARFROMSTR (TIME, _OffSet_ + 1) - '0'
  172. _OffSet_ := _OffSet_ + 3
  173.         ELSE
  174. MMINUTE         EQU $$TMP
  175. _OffSet_ := _OffSet_ + 2
  176.         ENDIF
  177. $$TMP := CHARFROMSTR (TIME, _OffSet_) - '0'
  178.         IF CHARFROMSTR (TIME, _OffSet_ + 1) > ' '
  179. SSECUND         EQU $$TMP * 10 + CHARFROMSTR (TIME, _OffSet_ + 1) - '0'
  180.         ELSE
  181. SSECUND         EQU $$TMP
  182.         ENDIF
  183.  
  184. DATA_VERS       EQU DDATE+(MMOUNTH<<5)+(YYEAR<<9)+0X8000                        ;уже упаковано
  185.  
  186. FAT_DATE        EQU DDATE+(MMOUNTH<<5)+((2000+YYEAR-1980)&0x7F)<<9
  187. FAT_TIME        EQU SSECUND/2+(MMINUTE<<5)+(HHOUR<<11)
  188.  
  189. ; генерация даты и времени в текстовом виде
  190. TEXTDATE        MACRO
  191. TDATE           DB ((DDATE/10)+'0'),(DDATE#10)+'0'
  192.                 DB "."
  193. TMOUNTH         DB MMOUNTH/10+'0',MMOUNTH#10+'0'
  194.                 DB ".",CHARFROMSTR (DATE,SIZEDATE-4),CHARFROMSTR (DATE,SIZEDATE-3)
  195.                 DB CHARFROMSTR (DATE,SIZEDATE-2),CHARFROMSTR (DATE,SIZEDATE-1)
  196.                 ENDM
  197.  
  198. ; вызов RST 8 с параметрами
  199. RST8            MACRO N1,N2,N3
  200.                 RST 8
  201.                 DB N1
  202.         IFNB N2
  203.                 DB N2
  204.         ENDIF
  205.         IFNB N3
  206.                 DB N3
  207.         ENDIF
  208.                 ENDM
  209.  
  210. BYTE            EQU 1
  211. WORD            EQU 2
  212. JUMP            EQU 3
  213. DWORD           EQU 4
  214. QWORD           EQU 8
  215.  
  216. BITMASK         MACRO NAME,NUM
  217. B_NAME          EQU NUM
  218. M_NAME          EQU 1<<NUM
  219.                 ENDM
  220.  
  221. ; генерация метки с резервированием места и размера области
  222. SETVAR          MACRO NAME,SIZE
  223. NAME            EQU INITVAR             ; номер имени
  224.                 IFNB SIZE
  225. INITVAR := INITVAR+SIZE
  226. NAME_Size       EQU SIZE                ; размер
  227.                 ELSE
  228. INITVAR := INITVAR+BYTE
  229. NAME_Size       EQU BYTE
  230.                 ENDIF
  231. __NAME          EQU $                   ; текущий адрес
  232.                 ENDM
  233.  
  234. ; перенос метки назад на указанное число байт
  235. SUBVAR          MACRO SIZE
  236. INITVAR := INITVAR-SIZE
  237.                 ENDM
  238.  
  239. ; перенос метки вперед на указанное число байт
  240. ADDVAR          MACRO SIZE
  241. INITVAR := INITVAR+SIZE
  242.                 ENDM
  243.  
  244. ; инициализация переменной для резервирования указанным числом
  245. ; или 0 при отсуствии второго параметра
  246. INIT_VAR        MACRO START
  247.                 IFNB START
  248. INITVAR := START
  249.                 ELSE
  250. INITVAR := 0
  251.                 ENDIF
  252.                 ENDM
  253.  
  254. ; выравнивание для генерации меток на границу 256 байт
  255. SETVAR_ALIGN    MACRO
  256. INITVAR := INITVAR + 0x100 - (INITVAR & 0xFF)
  257.                 ENDM
  258.  
  259. ; выравнивание текущего адреса на границу 256 байт
  260. ALIGN           MACRO BYTES,FILL
  261.         IFNB
  262.                 DB BYTES - ($ & (BYTES - 1)) DUP (0)
  263.         ELSE
  264.                 DB BYTES - ($ & (BYTES - 1)) DUP (FILL)
  265.         ENDIF
  266.                 ENDM
  267.  
  268. MALIGN          MACRO
  269.         IF LOW($) = 0
  270.                 DUPL (HIGH($) << 8) - $,0
  271.         ELSE
  272.                 DUPL ((HIGH($) + 1) << 8) - $,0
  273.         ENDIF
  274.                 ENDM
  275.  
  276. ; выравнивание до сектора с учетом адреса компиляции
  277. DALIGN          MACRO ADDRESS
  278.         IF LOW(ADDRESS)
  279.                 DB LOW (-$)+LOW(ADDRESS) DUP(0)
  280.         ELSE
  281.                 DB LOW (-$) DUP (0)
  282.         ENDIF
  283.                 ENDM
  284.  
  285. ; преобразование 16 битного числа в текст
  286. WORD2TXT        MACRO WORD
  287. $$DEC1 := (WORD)/10000
  288. $$TMP := WORD-$$DEC1*10000
  289. $$DEC2 := $$TMP/1000
  290. $$TMP := $$TMP-$$DEC2*1000
  291. $$DEC3 := $$TMP/100
  292. $$TMP := $$TMP-$$DEC3*100
  293. $$DEC4 := $$TMP/10
  294. $$TMP := $$TMP-$$DEC4*10
  295. $$DEC5 := $$TMP
  296.         DB $$DEC1+'0',$$DEC2+'0',$$DEC3+'0',$$DEC4+'0',$$DEC5+'0'
  297.                 ENDM
  298.