Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 24.05.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. DZ              MACRO DEFZ
  17.                 DB DEFZ,0
  18.                 ENDM
  19.  
  20. DC              MACRO DEFC
  21.                 IF STRLEN(DEFC)>1
  22.                 DB SUBSTR(DEFC,0,STRLEN(DEFC)-1)
  23.                 ENDIF
  24.                 IF STRLEN(DEFC)>0
  25.                 DB CHARFROMSTR(DEFC,STRLEN(DEFC)-1)|80H
  26.                 ENDIF
  27.                 ENDM
  28.  
  29. SUM_HOB         MACRO STR,AA,BB,CC
  30.                 DB STR
  31.                 DW AA
  32.                 DW BB
  33.                 DB 0
  34.                 DB CC
  35. $$I := 0
  36. $$S := 0
  37.                 REPT 9
  38. $$N := CHARFROMSTR (STR,STRLEN(STR)+$$S-9)
  39. $$I := ($$I+$$S+$$N+($$N*256))&0XFFFF
  40. $$S := $$S+1
  41.                 ENDM
  42. $$I := ($$I+$$S+LOW (AA)+(LOW (AA)*0X100))&0XFFFF
  43. $$S := $$S+1
  44. $$I := ($$I+$$S+HIGH (AA)+(HIGH (AA)*0X100))&0XFFFF
  45. $$S := $$S+1
  46. $$I := ($$I+$$S+LOW (BB)+(LOW (BB)*0X100))&0XFFFF
  47. $$S := $$S+1
  48. $$I := ($$I+$$S+HIGH (BB)+(HIGH (BB)*0X100))&0XFFFF
  49. $$S := $$S+1
  50. $$I := ($$I+$$S+LOW (CC)+(LOW (CC)*0X100))&0XFFFF
  51. $$S := $$S+1
  52. $$I := ($$I+$$S+HIGH (CC)+(HIGH (CC)*0X100))&0XFFFF
  53. $$S := $$S+1
  54.                 DW $$I
  55.                 ENDM
  56.  
  57. DUPL            MACRO LEN,FILL
  58. DUPL:
  59. $$N             EQU (LEN) / 1024
  60. $$M             EQU (LEN) # 1024
  61.                 REPT $$N
  62.                 DB 1024 DUP(FILL)
  63.                 ENDM
  64.                 IF $$M <> 0
  65.                 IFB FILL
  66.                 DB $$M DUP(0)
  67.                 ELSE
  68.                 DB $$M DUP(FILL)
  69.                 ENDIF
  70.                 ENDIF
  71.                 ENDM
  72.  
  73. HIGH            FUNCTION X,((X >> 8) & 0XFF)
  74. LOW             FUNCTION X,(X & 0XFF)
  75.  
  76. ROMCALL         MACRO ADR,PAGE
  77.                 RST 0X30
  78.                 DW ADR
  79.                 DB PAGE
  80.                 ENDM
  81.  
  82. RAMCALL         MACRO ADR,PAGE
  83.                 RST 0X20
  84.                 DW ADR
  85.                 DB PAGE
  86.                 ENDM
  87.  
  88. ATMPORT         MACRO PORT,BYTE
  89.                 LD BC,PORT
  90.         IF BYTE = 0
  91.                 XOR A
  92.         ELSE
  93.                 LD A,BYTE
  94.         ENDIF
  95.                 OUT (C),A
  96.                 ENDM
  97.  
  98. EVOPORT         MACRO PORT,BYTE
  99.                 LD BC,PORT
  100.         IF BYTE = 0
  101.                 XOR A
  102.         ELSE
  103.                 LD A,BYTE
  104.         ENDIF
  105.                 OUT (C),A
  106.                 ENDM
  107.  
  108. PEC_ON          MACRO BYTE
  109.                 IN A,(PEVO_CONF)
  110.                 OR BYTE
  111.                 OUT (PEVO_CONF),A
  112.                 ENDM
  113.  
  114. PEC_OFF         MACRO BYTE
  115.                 IN A,(PEVO_CONF)
  116.                 AND BYTE!0XFF
  117.                 OUT (PEVO_CONF),A
  118.                 ENDM
  119.  
  120. READ_7FFD       MACRO
  121.                 LD A,HIGH (RD_7FFD)
  122.                 IN A,(LOW (RD_7FFD))
  123.                 ENDM
  124.  
  125. SIZEDATE        EQU STRLEN (DATE)
  126. SIZETIME        EQU STRLEN (TIME)
  127.  
  128.                 IF SIZEDATE=10
  129. MMOUNTH         EQU (CHARFROMSTR (DATE,0)-'0')*10+(CHARFROMSTR (DATE,1)-'0')
  130. DDATE           EQU (CHARFROMSTR (DATE,3)-'0')*10+(CHARFROMSTR (DATE,4)-'0')
  131. YYEAR           EQU (CHARFROMSTR (DATE,8)-'0')*10+(CHARFROMSTR (DATE,9)-'0')
  132.                 ELSEIF SIZEDATE=8
  133. MMOUNTH         EQU (CHARFROMSTR (DATE,0)-'0')
  134. DDATE           EQU (CHARFROMSTR (DATE,2)-'0')
  135. YYEAR           EQU (CHARFROMSTR (DATE,6)-'0')*10+(CHARFROMSTR (DATE,7)-'0')
  136.                 ELSEIF (CHARFROMSTR (DATE,1))=0X2F
  137. MMOUNTH         EQU (CHARFROMSTR (DATE,0)-'0')
  138. DDATE           EQU (CHARFROMSTR (DATE,2)-'0')*10+(CHARFROMSTR (DATE,3)-'0')
  139. YYEAR           EQU (CHARFROMSTR (DATE,7)-'0')*10+(CHARFROMSTR (DATE,8)-'0')
  140.                 ELSE
  141. MMOUNTH         EQU (CHARFROMSTR (DATE,0)-'0')*10+(CHARFROMSTR (DATE,1)-'0')
  142. DDATE           EQU (CHARFROMSTR (DATE,3)-'0')
  143. YYEAR           EQU (CHARFROMSTR (DATE,7)-'0')*10+(CHARFROMSTR (DATE,8)-'0')
  144.                 ENDIF
  145.  
  146.                 IF SIZETIME=7
  147. HHOUR           EQU (CHARFROMSTR (TIME,0)-'0')
  148. MMINUTE         EQU (CHARFROMSTR (TIME,2)-'0')*10+(CHARFROMSTR (TIME,3)-'0')
  149. SSECUND         EQU (CHARFROMSTR (TIME,5)-'0')*10+(CHARFROMSTR (TIME,6)-'0')
  150.                 ELSE
  151. HHOUR           EQU (CHARFROMSTR (TIME,0)-'0')*10+(CHARFROMSTR (TIME,1)-'0')
  152. MMINUTE         EQU (CHARFROMSTR (TIME,3)-'0')*10+(CHARFROMSTR (TIME,4)-'0')
  153. SSECUND         EQU (CHARFROMSTR (TIME,6)-'0')*10+(CHARFROMSTR (TIME,7)-'0')
  154.                 ENDIF
  155.  
  156. DATA_VERS       EQU DDATE+(MMOUNTH<<5)+(YYEAR<<9)+0X8000                        ;уже упаковано
  157.  
  158. FAT_DATE        EQU DDATE+(MMOUNTH<<5)+((2000+YYEAR-1980)&0x7F)<<9
  159. FAT_TIME        EQU SSECUND/2+(MMINUTE<<5)+(HHOUR<<11)
  160.  
  161. TEXTDATE        MACRO
  162. TDATE           DB ((DDATE/10)+'0'),(DDATE#10)+'0'
  163.                 DB "."
  164. TMOUNTH         DB MMOUNTH/10+'0',MMOUNTH#10+'0'
  165.                 DB ".",CHARFROMSTR (DATE,SIZEDATE-4),CHARFROMSTR (DATE,SIZEDATE-3)
  166.                 DB CHARFROMSTR (DATE,SIZEDATE-2),CHARFROMSTR (DATE,SIZEDATE-1)
  167.                 ENDM
  168.  
  169. RST8            MACRO N1,N2,N3
  170.                 RST 8
  171.                 DB N1
  172.                 IFNB N2
  173.                 DB N2
  174.                 ENDIF
  175.                 IFNB N3
  176.                 DB N3
  177.                 ENDIF
  178.                 ENDM
  179.  
  180. BYTE            EQU 1
  181. WORD            EQU 2
  182. JUMP            EQU 3
  183. DWORD           EQU 4
  184. QWORD           EQU 8
  185.  
  186. BITMASK         MACRO NAME,NUM
  187. B_NAME          EQU NUM
  188. M_NAME          EQU 1<<NUM
  189.                 ENDM
  190.  
  191. SETVAR          MACRO NAME,SIZE
  192. NAME            EQU INITVAR
  193.                 IFNB SIZE
  194. INITVAR := INITVAR+SIZE
  195. NAME_Size       EQU SIZE
  196.                 ELSE
  197. INITVAR := INITVAR+BYTE
  198. NAME_Size       EQU BYTE
  199.                 ENDIF
  200.                 ENDM
  201.  
  202. SUBVAR          MACRO SIZE
  203. INITVAR := INITVAR-SIZE
  204.                 ENDM
  205.  
  206. ADDVAR          MACRO SIZE
  207. INITVAR := INITVAR+SIZE
  208.                 ENDM
  209.  
  210. INIT_VAR        MACRO START
  211.                 IFNB START
  212. INITVAR := START
  213.                 ELSE
  214. INITVAR := 0
  215.                 ENDIF
  216.                 ENDM
  217.  
  218. SETVAR_ALIGN    MACRO
  219. INITVAR := INITVAR + 0x100 - (INITVAR & 0xFF)
  220.                 ENDM
  221.  
  222. ALIGN           MACRO BYTES,FILL
  223.         IFNB
  224.                 DB BYTES - ($ & (BYTES - 1)) DUP (0)
  225.         ELSE
  226.                 DB BYTES - ($ & (BYTES - 1)) DUP (FILL)
  227.         ENDIF
  228.                 ENDM
  229.  
  230. MALIGN          MACRO
  231.         IF LOW($) = 0
  232.                 DUPL (HIGH($) << 8) - $,0
  233.         ELSE
  234.                 DUPL ((HIGH($) + 1) << 8) - $,0
  235.         ENDIF
  236.                 ENDM
  237.  
  238. ; выравнивание до сектора с учетом адреса компиляции
  239. DALIGN          MACRO ADDRESS
  240.         IF LOW(ADDRESS)
  241.                 DB LOW (-$)+LOW(ADDRESS) DUP(0)
  242.         ELSE
  243.                 DB LOW (-$) DUP (0)
  244.         ENDIF
  245.                 ENDM
  246.  
  247. ; преобразование 16 битного числа в текст
  248. WORD2TXT        MACRO WORD
  249. $$DEC1 := (WORD)/10000
  250. $$TMP := WORD-$$DEC1*10000
  251. $$DEC2 := $$TMP/1000
  252. $$TMP := $$TMP-$$DEC2*1000
  253. $$DEC3 := $$TMP/100
  254. $$TMP := $$TMP-$$DEC3*100
  255. $$DEC4 := $$TMP/10
  256. $$TMP := $$TMP-$$DEC4*10
  257. $$DEC5 := $$TMP
  258.         DB $$DEC1+'0',$$DEC2+'0',$$DEC3+'0',$$DEC4+'0',$$DEC5+'0'
  259.                 ENDM
  260.