?login_element?

Subversion Repositories NedoOS

Rev

Rev 555 | Blame | Compare with Previous | Last modification | View Log | Download

  1. preview=1 ;CAPS=thumbnail
  2.  
  3. ONEPAGEYUV=0;1 ;TODO YUV в одном потоке на несколько страниц с чередованием составляющих? (чтобы картинку можно было шире 1024), но будет проблема с масштабированием SAMPLE на границе страниц
  4.  
  5. JPGPAGESTART=0xc000 ;в одной страничке до 16 строк до 0x400 пикселей каждая
  6. ;TODO 0x8000 с двойными страницами под составляющую (чтобы картинку можно было шириной 2048)
  7. ;TODO составляющие хранить вертикально и рендерить прямо в них, без переброски с масштабированием
  8.  
  9. ;таблицы умножения в pg0 ;TODO в 0x4000+
  10. ;заполняются в GENMTAB
  11. _D0=0xd0 ;два набора, второй в +0x18
  12. _D2=_D0+0x02
  13. _D4=_D0+0x04
  14. _D6=_D0+0x06
  15. _D8=_D0+0x08
  16. _DA=_D0+0x0a
  17. _DC=_D0+0x0c
  18. _DE=_D0+0x0e
  19. _E0=_D0+0x10
  20. _E2=_D0+0x12
  21. _E4=_D0+0x14
  22. _E6=_D0+0x16
  23.  
  24. ;FREE=0x8000 ;динамическая память, размер=0x13be для girl.jpg, izba1024.jpg, =0x12be для карлсон.jpg
  25.  
  26. ;LINE1=0x3300;0x9400 ;буфер строки 0x400*3?
  27.  
  28. JPEGCLEARADDR=FREE;0xa000
  29. JPEGCLEARSZ=0xc000-JPEGCLEARADDR
  30.  
  31. G716C=0xa000 ;CR tab (add to Y->R)
  32. G7174=G716C+0x200 ;CR tab (add to Y->G)
  33. G7178=G7174+0x200 ;CB tab (add to Y->B)
  34. G7170=G7178+0x200 ;CB tab (add to Y->G)
  35.  
  36. _thuffs=0xad00 ;размер=0x214 (girl.jpg, izba1024.jpg, карлсон.jpg) - временный буфер, после maketree не нужен
  37.  
  38. SAMPLE=0xac00 ;DS #80 ;блок 8x8 (по 2 байта), потом оттуда читаем через стек (подряд, один раз) ;перед ним немного места под стек
  39. SAMTAB=SAMPLE+0x80 ;DS #80
  40.  
  41. ;таблица обрубания переполнения
  42. PLTAB=0xad00 ;DS #300
  43. PTAB=PLTAB+0x100
  44.  
  45. VAR=0xaa00 ;было в #4200
  46. VARS=VAR ;???
  47. VARSsz=0x123
  48.  ;+#48 = ??? [2] в jpgreadsizes, должно быть =8
  49.  ;+#4e = ??? только запись
  50.  ;+#50-51 = ??? только запись
  51.  ;+#52-53 = ??? только запись
  52.  ;+#56-#57 = ??? результат выделения динамической памяти в jpgreadsizes
  53. ;+#5A-#69=табл pQTB
  54. ;+#6A-#79=табл pLHTB
  55. ;+#7A-#89=табл pHHTB
  56. ;+#C2=период вызова M18E7A (чанк M141FE)
  57. ;+#120=здесь он считается
  58. ;+#110-#11F=табл.накопленных DC, 4? записи по 2 байта (+E0*2 байт???)
  59. ;+#120=какой-то счётчик?
  60. ;+#122=что-то write only???
  61.  
  62. ;DISKBUF=0xb000
  63.        
  64.        MACRO rdbytecheckFFSCF
  65.         rdbyte
  66.         CP -1
  67.         CALL NC,RDFF
  68.        ENDM  
  69.  
  70. RDFF
  71.         CALL RDBYTE
  72.         INC A
  73.         JR Z,RDFF ;может быть много #FF
  74.         SUB 2 ;#FF кодировано как #FF,#00
  75.         RET
  76.  
  77. GENMTAB
  78.         LD E,0
  79.         CALL SETPG
  80.        LD HL,_D0<<8
  81. s=2
  82. k=1<<s
  83. f=#E8-#D0
  84.         LD DE,#1151*2/k
  85.         CALL GEN
  86.         LD DE,#187E*2/k ;D2
  87.         CALL GEN
  88.         LD DE,#3B21*2/k ;D4
  89.         CALL GEN
  90.         LD DE,#25A1*2/k ;D6
  91.         CALL GEN
  92.         LD DE,#0C7C*2/k ;D8
  93.         CALL GEN
  94.         LD DE,#1CCD*2/k ;DA
  95.         CALL GEN
  96.         LD DE,#300B*2/k ;DC
  97.         CALL GEN
  98.         LD DE,#3EC5*2/k ;DE
  99.         CALL GEN
  100.         LD DE,#5203*2/k ;E0
  101.         CALL GEN
  102.         LD DE,#6254*2/k ;E2
  103.         CALL GEN
  104.         LD DE,#41B3*2/k ;E4
  105.         CALL GEN
  106.         LD DE,#098E*2/k ;E6
  107.         CALL GEN
  108. s2=5
  109. k=1<<s2
  110.         LD DE,#1151*2/k ;E8
  111.         CALL GENA
  112.         LD DE,#187E*2/k ;EA
  113.         CALL GENA
  114.         LD DE,#3B21*2/k ;EC
  115.         CALL GENA
  116.         LD DE,#25A1*2/k ;EE
  117.         CALL GENA
  118.         LD DE,#0C7C*2/k ;F0
  119.         CALL GENA
  120.         LD DE,#1CCD*2/k ;F2
  121.         CALL GENA
  122.         LD DE,#300B*2/k ;F4
  123.         CALL GENA
  124.         LD DE,#3EC5*2/k ;F6
  125.         CALL GENA
  126.         LD DE,#5203*2/k ;F8
  127.         CALL GENA
  128.         LD DE,#6254*2/k ;FA
  129.         CALL GENA
  130.         LD DE,#41B3*2/k ;FC
  131.         CALL GENA
  132.         LD DE,#098E*2/k ;FE
  133. GENA
  134.         LD IX,0
  135.         LD C,0
  136. GM0A    LD B,128
  137. GM1A    LD A,HX
  138.         LD (HL),A
  139.         INC H
  140.         LD (HL),C
  141.         DEC H
  142.         ADD IX,DE
  143.         JR NC,$+3
  144.         INC C
  145.         INC L
  146.         DJNZ GM1A
  147.         XOR A
  148.         SUB LX
  149.         LD LX,A
  150.         LD A,B;0
  151.         SBC A,HX
  152.         LD HX,A
  153.         SBC A,A
  154.         SUB C
  155.         LD C,A
  156.         INC L
  157.         DEC L
  158.         JR NZ,GM0A
  159.        INC H
  160.        inc H
  161.         RET
  162. GEN
  163.         LD IX,0
  164.         LD BC,0
  165. GM1     LD (HL),C
  166.         INC H
  167.         LD (HL),B
  168.         DEC H
  169.         ADD IX,DE
  170.         JR NC,$+3
  171.         INC BC
  172.         INC L
  173.         JR NZ,GM1
  174.        INC H
  175.        inc H
  176.         RET
  177.  
  178. M18E7A
  179.        ;IFN rdcyc
  180.        ; LD A,(RDCYC)
  181.        ; OR A
  182.        ; JR NZ,rDCOK
  183.        ;ENDIF
  184. FMR1    rdbyte
  185.         INC A
  186.         JR NZ,FMR1
  187. FMR2    rdbyte
  188.         INC A
  189.         JR Z,FMR2
  190.         DEC A
  191.         JR Z,FMR1
  192. rDCOK
  193.         LD A,(VAR+#E0)
  194.         ADD A,A
  195.         LD B,A ;не больше #10? (см. ниже VAR+#120)
  196.         LD HL,VAR+#110
  197.         XOR A
  198. cLHT    LD (HL),A
  199.         INC HL
  200.         DJNZ cLHT
  201.        ;IFN rdcyc
  202.        ; LD (RDCYC),A
  203.        ;ENDIF
  204.        LD A,128
  205.        LD (BITER),A
  206.         LD A,(VAR+#C2)
  207.         LD (VAR+#120),A
  208.         RET
  209.  
  210. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  211. RDSAMP
  212.         IF preview
  213.        ;LD A,(cOLPOI) ;0=B/W
  214.        ;OR A
  215.        ;SCF
  216.        ;JR NZ,RDSAnGR
  217.        ;LD A,(pSMPPG_1) ;1/2/5
  218.        ;CP 2 ;1/2/5 (2/5=CB/CR=SKIP)
  219. ;RDSAnGR
  220.        ;IFN fCS
  221.        CALL getCS
  222.        ;ELSE
  223.        ;CALL C,8026
  224.        ;ENDIF
  225.          LD A,prevdj
  226.          ld BC,#202
  227.         JR NC,$+7
  228.         LD A,YBITdj
  229.         ld BC,#FCFA
  230.        LD (YBITjr),A
  231.        LD A,C
  232.        ld (HORdjnz),A
  233.        LD A,B
  234.        ld (VERdjnz),A
  235.         ENDIF
  236.        ;DI
  237.         LD (pSPS1_1),SP
  238.         LD SP,SAMPLE+#80
  239.         LD HL,0
  240.        DUP #40
  241.         PUSH HL
  242.        EDUP
  243. pSPS1_1=$+1
  244.         LD SP,0
  245. pLHTB_2=$+2
  246.         LD IX,0
  247.         CALL dehuf
  248.         OR A
  249.        LD H,A
  250.        ld L,A
  251.        CALL NZ,RDBITS
  252.         EX DE,HL
  253. pHCNT   LD HL,(VAR+#110)
  254.         ADD HL,DE
  255. pHCNT2  LD (VAR+#110),HL
  256.         EX DE,HL
  257. pQTBDC_1=$+1
  258.         LD A,(0) ;ok
  259.         CALL MULDE_AQ
  260.         LD (SAMPLE),HL
  261. PRMODE=$+1
  262.     LD A,0
  263.     CP #C2
  264.     JR Z,BRKLP
  265.        LD A,#02
  266. ;63 коэффициента AC
  267. SCNLP1
  268.         ex af,af'
  269. pHHTB_2=$+2
  270.        LD IX,0
  271.        CALL dehuf
  272.        LD L,A
  273.       LD H,R4A0F/256
  274.       LD H,(HL)
  275.        AND #0F
  276.        JR NZ,YBIT
  277. YBITjr=$-1
  278.        LD A,H
  279.        CP #20 ;L=#F0?
  280.        JR NZ,BRKLP
  281.        ex af,af'
  282.        ADD A,32
  283.        JP P,SCNLP1
  284.        JR BRKLP
  285. prevYBIT
  286. prevdj=$-YBITjr-1
  287.         LD B,A
  288.         LD DE,BITER
  289.         LD A,(DE)
  290. skBLP   ADD A,A
  291.         JR Z,skNEW
  292.         DJNZ skBLP
  293.         LD (DE),A
  294.         ex af,af'
  295.        ADD A,H
  296.       JP P,SCNLP1
  297.       JR BRKLP
  298. skNEW
  299.        rdbytecheckFFSCF
  300.        RLA
  301.        DJNZ skBLP
  302.        LD (DE),A
  303.        ex af,af'
  304.         ADD A,H
  305.        JP P,SCNLP1
  306.        JR BRKLP
  307. YBIT
  308. YBITdj=$-YBITjr-1
  309.         ex af,af'
  310.        ADD A,H
  311.       LD E,A
  312.       ld D,Qorder/256
  313.        ex af,af'
  314.        CALL RDBITS
  315.         EX DE,HL
  316.        LD A,(HL)
  317.        LD (Qadr),A
  318. pQTB    LD BC,0
  319.         ADD HL,BC
  320.         LD A,(HL)
  321.         CALL MULDE_AQ
  322. Qadr=$+1
  323.        LD (SAMPLE),HL
  324.         ex af,af'
  325.       JP P,SCNLP1
  326. BRKLP
  327.        LD E,0
  328.        CALL SETPG
  329. ;---------------------------
  330.       ;DI ;из-за iy?
  331.       PUSH IY
  332.        LD IX,SAMPLE
  333.        LD B,8
  334. HORLP
  335.        PUSH BC
  336.       PUSH IX
  337.       POP HL
  338.        INC L
  339.        XOR A
  340.        LD B,7
  341.        INC L
  342.        OR (HL)
  343.        INC L
  344.        OR (HL)
  345.        DJNZ $-4
  346. HORdjnz=$-1
  347.        JR NZ,NOEMPH
  348.        LD A,(IX)
  349.        ld D,(IX+1)
  350.       DUP 2+s
  351.        SRA D
  352.        RRA
  353.       EDUP
  354.       PUSH IX
  355.       POP HL
  356.        LD B,8
  357.        LD (HL),A
  358.        INC L
  359.        inc L
  360.        DJNZ $-3
  361.        JP HORZOK
  362. NOEMPH
  363.       LD C,(IX+4)
  364.       ld B,(IX+5)
  365.       LD L,(IX+#C)
  366.       ld H,(IX+#D)
  367.       PUSH HL
  368.       ADC HL,BC
  369.       LD D,_D0
  370.       CALL NZ,MULLONG
  371.       LD H,B
  372.        LD B,L
  373.       LD L,C
  374.       LD D,_D2
  375.       LD A,H
  376.       OR L
  377.       CALL NZ,MULLONG
  378.        LD A,L
  379.        ADD A,B
  380.        LD C,A
  381.       POP HL
  382.       LD D,_D4
  383.       LD A,H
  384.       OR L
  385.       CALL NZ,MULLONG
  386.        LD A,B
  387.        SUB L
  388.        LD B,A
  389.       LD L,(IX)
  390.       ld H,(IX+1)
  391.       LD E,(IX+8)
  392.       ld D,(IX+9)
  393.       PUSH HL
  394.       ADD HL,DE
  395.       LD A,L
  396.       DUP 2+s
  397.       SRA H
  398.       RRA
  399.       EDUP
  400.        ADD A,C
  401.      LD LY,A
  402.        SUB C,C
  403.       POP HL
  404.       SBC HL,DE
  405.      LD E,A
  406.       LD A,L
  407.       DUP 2+s
  408.       SRA H
  409.       RRA
  410.       EDUP
  411.        ADD A,B
  412.      LD C,A
  413.        SUB B
  414.        sub B
  415.      LD B,A
  416.      EXX
  417.  
  418.       LD L,(IX+#A)
  419.       ld H,(IX+#B)
  420.       LD E,(IX+6)
  421.       ld D,(IX+7)
  422.      PUSH DE
  423.      PUSH HL
  424.       ADD HL,DE
  425.       EX DE,HL
  426.       LD C,(IX+#E)
  427.       ld B,(IX+#F)
  428.       ADD HL,BC
  429.      PUSH DE
  430.      PUSH BC
  431.      PUSH HL
  432.      PUSH BC
  433.       EX DE,HL
  434.       ADD HL,BC
  435.       LD C,(IX+2)
  436.       ld B,(IX+3)
  437.       ADC HL,BC
  438.       LD D,_D6
  439.       CALL NZ,MULLONG
  440.      LD A,L
  441.      ex af,af'
  442.        LD L,(IX+#A)
  443.        ld H,(IX+#B)
  444.        ADC HL,BC
  445.        LD D,_D8
  446.        CALL NZ,MULLONG
  447.       ex af,af'
  448.        SUB L
  449.      LD HY,A
  450.      ADD A,L
  451.      ex af,af'
  452.       POP HL
  453.        ADC HL,BC
  454.        LD D,_DA
  455.        CALL NZ,MULLONG
  456.        LD H,B
  457.         LD B,L
  458.        LD L,C
  459.        LD D,_DC
  460.        LD A,H
  461.        OR L
  462.        CALL NZ,MULLONG
  463.       LD A,HY
  464.         SUB B
  465.         ADD A,L
  466.         LD L,A
  467.       ADD A,LY
  468.         LD (IX),A
  469.         SUB L
  470.         sub L
  471.         LD (IX+#E),A
  472.  
  473.       POP HL
  474.        LD D,_DE
  475.        LD A,H
  476.        OR L
  477.        CALL NZ,MULLONG
  478.       ex af,af'
  479.        SUB L
  480.        LD C,A
  481.  
  482.      POP HL
  483.       LD D,_E6
  484.       LD A,H
  485.       OR L
  486.       CALL NZ,MULLONG
  487.        LD A,C
  488.        SUB B
  489.        ADD A,L
  490.        LD L,A
  491.      EXX
  492.      ADD A,E
  493.      EXX
  494.        LD (IX+6),A
  495.        SUB L
  496.        sub L
  497.        LD (IX+8),A
  498.  
  499.      POP HL
  500.       LD D,_E0
  501.       LD A,H
  502.       OR L
  503.       CALL NZ,MULLONG
  504.        LD B,L
  505.  
  506.      POP HL
  507.       LD D,_E4
  508.       LD A,H
  509.       OR L
  510.       CALL NZ,MULLONG
  511.      LD A,HY
  512.        ADD A,L
  513.        SUB B
  514.        LD L,A
  515.      EXX
  516.      ADD A,B
  517.      EXX
  518.        LD (IX+4),A
  519.        SUB L
  520.        sub L
  521.        LD (IX+#A),A
  522.  
  523.      POP HL
  524.       LD D,_E2
  525.       LD A,H
  526.       OR L
  527.       CALL NZ,MULLONG
  528.        LD A,L
  529.        SUB B
  530.        ADD A,C
  531.        LD L,A
  532.      EXX
  533.      ADD A,C
  534.      EXX
  535.        LD (IX+2),A
  536.        SUB L
  537.        sub L
  538.        LD (IX+#C),A
  539. HORZOK
  540.        LD DE,16
  541.        ADD IX,DE
  542.        POP BC
  543.        DEC B
  544.        JP NZ,HORLP
  545. ;---------------------------
  546.        LD IX,SAMPLE
  547.        LD B,8
  548. VERULP
  549.        PUSH BC
  550.        PUSH IX
  551.        POP HL
  552.        XOR A
  553.        LD DE,16
  554.        LD B,7
  555.        ADD HL,DE
  556.        OR (HL)
  557.        DJNZ $-2
  558. VERdjnz=$-1
  559.        JR NZ,NOEMPV
  560.        LD A,(IX)
  561.       ADD A,A
  562.       LD L,A
  563.       SBC A,A
  564.       LD H,A
  565.        PUSH IX
  566.        LD B,8
  567. fLULP   LD (IX),L
  568.        ld (IX+1),H
  569.        ADD IX,DE
  570.        DJNZ fLULP
  571.        POP IX
  572.        JP VERTUOK
  573. NOEMPV
  574.        LD A,(IX+#60)
  575.        LD E,(IX+#20)
  576.        ADD A,E
  577.        LD L,A
  578.       LD H,_D0+f
  579.       LD C,(HL)
  580.       INC H
  581.       LD B,(HL)
  582.        LD L,E
  583.       INC H
  584.       LD A,(HL)
  585.       INC H
  586.       LD H,(HL)
  587.       ld L,A
  588.        ADD HL,BC
  589.       EX DE,HL
  590.         LD A,(IX)
  591.         ADD A,(IX+#40)
  592.       ADD A,A
  593.       LD L,A
  594.       SBC A,A
  595.       LD H,A
  596.        SBC HL,DE
  597.      PUSH HL
  598.       ;LD (vLC6_1),HL
  599.        ADD HL,DE
  600.        add HL,DE
  601.        LD (nPD0H_1),HL
  602.  
  603.        LD L,(IX+#60)
  604.       LD H,_D4+f
  605.       LD E,(HL)
  606.       INC H
  607.       LD D,(HL)
  608.      LD H,B
  609.      ld L,C
  610.        SBC HL,DE
  611.        EX DE,HL
  612.         LD A,(IX)
  613.         SUB (IX+#40)
  614.       ADD A,A
  615.       LD L,A
  616.       SBC A,A
  617.       LD H,A
  618.        SBC HL,DE
  619.      PUSH HL
  620.       ;LD (vLC2_1),HL
  621.        ADD HL,DE
  622.        add HL,DE
  623.        LD (vLC0E_1),HL
  624.  
  625.        LD A,(IX+#50)
  626.        LD (vLC20_1),A
  627.        LD E,A
  628.        LD A,(IX+#30)
  629.        LD (vLC1C_1),A
  630.        LD C,A
  631.        ADD A,E
  632.        LD (vLC24_1),A
  633.        LD A,(IX+#70)
  634.        LD (vLC14_1),A
  635.       LD B,A
  636.        ADD A,C
  637.        LD (vLC28_1),A
  638.        ADD A,E
  639.       LD C,(IX+#10)
  640.       ADD A,C
  641.        LD L,A
  642.       LD H,_D6+f
  643.       LD A,(HL)
  644.       INC H
  645.       LD H,(HL)
  646.       ld L,A
  647.      PUSH HL
  648.       LD A,E
  649.       ADD A,C
  650.        LD L,A
  651.       LD H,_D8+f
  652.       LD E,(HL)
  653.       INC H
  654.       LD D,(HL)
  655.      POP HL
  656.      PUSH HL
  657.       SBC HL,DE
  658.        LD (nPD3H_1),HL
  659.        EX DE,HL
  660.  
  661.       LD A,B
  662.       ADD A,C
  663.       LD L,A
  664.        LD A,C
  665.       LD H,_DA+f
  666.       LD C,(HL)
  667.       INC H
  668.       LD B,(HL)
  669.        LD L,A
  670.       INC H
  671.       LD A,(HL)
  672.       INC H
  673.       LD H,(HL)
  674.       ld L,A
  675.        SBC HL,BC
  676.        ADD HL,DE
  677.       EX DE,HL
  678. nPD0H_1=$+1
  679.        LD HL,0
  680.        SBC HL,DE
  681.        LD (IX+#70),L
  682.        ld (IX+#71),H
  683.        ADD HL,DE
  684.        add HL,DE
  685.        LD (IX),L
  686.        ld (IX+1),H
  687. vLC28_1=$+1
  688.       LD HL,+(_DE+f)<<8
  689.       LD E,(HL)
  690.       INC H
  691.       LD D,(HL)
  692.      POP HL
  693.       SBC HL,DE
  694.      LD D,H
  695.      ld E,L
  696.      SBC HL,BC
  697.      PUSH HL
  698.  
  699. vLC24_1=$+1
  700.       LD HL,+(_E0+f)<<8
  701.       LD C,(HL)
  702.       INC H
  703.       LD B,(HL)
  704. vLC1C_1=$+1
  705.       LD HL,+(_E2+f)<<8
  706.       LD A,(HL)
  707.       INC H
  708.       LD H,(HL)
  709.       ld L,A
  710.        SBC HL,BC
  711.        ADD HL,DE
  712.       EX DE,HL
  713. vLC0E_1=$+1
  714.        LD HL,0
  715.        SBC HL,DE
  716.        LD (IX+#60),L
  717.        ld (IX+#61),H
  718.        ADD HL,DE
  719.        add HL,DE
  720.        LD (IX+#10),L
  721.        ld (IX+#11),H
  722.  
  723. vLC14_1=$+1
  724.       LD HL,+(_E6+f)<<8
  725.       LD E,(HL)
  726.       INC H
  727.       LD D,(HL)
  728.      POP HL
  729.        ADD HL,DE
  730.       EX DE,HL
  731.  
  732. vLC20_1=$+1
  733.       LD HL,+(_E4+f)<<8
  734.       LD A,(HL)
  735.       INC H
  736.       LD H,(HL)
  737.       ld L,A
  738.        SBC HL,BC
  739. nPD3H_1=$+1
  740.        LD BC,0
  741.        ADD HL,BC
  742.       LD B,H
  743.       ld C,L
  744.      POP HL
  745.        SBC HL,BC
  746.        LD (IX+#50),L
  747.        ld (IX+#51),H
  748.        ADD HL,BC
  749.        add HL,BC
  750.        LD (IX+#20),L
  751.        ld (IX+#21),H
  752.  
  753.      POP HL
  754.        SBC HL,DE
  755.        LD (IX+#40),L
  756.        ld (IX+#41),H
  757.        ADD HL,DE
  758.        add HL,DE
  759.        LD (IX+#30),L
  760.        ld (IX+#31),H
  761. VERTUOK
  762.        INC LX
  763.        inc LX
  764.        POP BC
  765.        DEC B
  766.        JP NZ,VERULP
  767.       POP IY
  768.       ;EI
  769.        RET
  770.  
  771. ;twice
  772. ;/21331 CALLS
  773. ;150t=1s
  774. MULDE_AQ
  775.       LD HL,0
  776.       RLA
  777.      JP NC,$+6
  778.      LD H,D
  779.      ld L,E
  780.      ADD HL,HL
  781.        DUP 6
  782.       RLA
  783.       JR NC,$+3
  784.       ADD HL,DE
  785.       ADD HL,HL
  786.        EDUP
  787.       RLA
  788.       RET NC
  789.       ADD HL,DE
  790.       RET
  791.  
  792. ;/65537 CALLS
  793. ;50t=1s
  794. RD1B
  795. BITER=$+1
  796.        LD A,128
  797.        ADD A,A
  798.        JR Z,rD1NOLD
  799.        LD (BITER),A
  800.        RET
  801. rD1NOLD
  802.        rdbytecheckFFSCF
  803.        RLA
  804. rD1OLD  LD (BITER),A
  805.        RET
  806. ;2
  807. RDBITS
  808.        LD B,A
  809.       CALL RD1B
  810.       DEC B
  811.       JR NC,RDBITSm
  812.        LD HL,1
  813.       RET Z
  814. rDBLP   ADD A,A
  815.        JR Z,rDNEW
  816. rDNEWQ
  817.        ADC HL,HL
  818.        DJNZ rDBLP
  819.        LD (BITER),A
  820.        RET
  821. RDBITSm
  822.        LD HL,-2
  823.       JR Z,rDBITsmQ
  824. rDBLPm  ADD A,A
  825.        JR Z,rDNEWm
  826. rDNEWQm
  827.        ADC HL,HL
  828.        DJNZ rDBLPm
  829.        LD (BITER),A
  830. rDBITsmQ
  831.       INC HL
  832.        RET
  833. rDNEW
  834.        rdbytecheckFFSCF
  835.        RLA
  836.        JP rDNEWQ
  837. rDNEWm
  838.        rdbytecheckFFSCF
  839.        RLA
  840.        JP rDNEWQm
  841.  
  842. ;хаффман
  843. ;/25364 CALLS
  844. ;150t=1s
  845. dehuf
  846. ;ix в районе FREE
  847.        LD A,(BITER)
  848.        ADD A,A
  849.        CALL Z,rD1NOLD
  850.       LD DE,0
  851.       RL E
  852.        JP fNDHLP
  853. hD1NOLD
  854.        rdbytecheckFFSCF
  855.        RLA
  856.        JP $+6
  857. rDNXT
  858.        ADD A,A
  859.        JR Z,hD1NOLD
  860.       RL E
  861.       rl D
  862.        INC IX
  863.        inc IX
  864. fNDHLP
  865.        LD L,(IX+1)
  866.        ld H,(IX)
  867.       INC HL
  868.       SCF
  869.        SBC HL,DE
  870.        JP C,rDNXT
  871.        LD (BITER),A
  872.        LD H,(IX+#482-#43C)
  873.        ld L,(IX+#483-#43C)
  874.        ADD HL,DE
  875.        LD A,(HL)
  876.        RET
  877.  
  878. MSHTAB
  879.        LD A,H
  880.        OR A
  881. MSHTABA
  882.           ;JR mSH3216
  883.        JR NZ,mSH3216 ;HL>=256: полноценное умножение
  884.        LD H,D
  885.        LD E,(HL)
  886.        INC H
  887.        LD D,(HL)
  888.        EX DE,HL
  889.        RET
  890. mSH3216
  891.        EX DE,HL
  892.       LD L,64;16
  893.        LD A,(HL)
  894.        LD H,0
  895.        RRA
  896.        JR NC,$+7
  897.        ADD HL,DE
  898.        RR H
  899.        rr L
  900.       DUP 5;3
  901.        RRA
  902.        JR NC,$+3
  903.        ADD HL,DE
  904.        RR H
  905.        rr L
  906.       EDUP
  907.        RET
  908.  
  909. ;hl=nnnn
  910. ;d=multable/256 (512 bytes)
  911. ;out: hl
  912. MULLONG
  913.        BIT 7,H
  914.        JP Z,MSHTAB
  915.        XOR A
  916.        SUB L
  917.        LD L,A
  918.        SBC A,A
  919.        SUB H
  920.        LD H,A
  921.        CALL MSHTABA
  922.        XOR A
  923.        SUB L
  924.        LD L,A
  925.        SBC A,A
  926.        SUB H
  927.        LD H,A
  928.        RET
  929.  
  930. M1696A
  931. ;перекодируем 2-байтные данные из SAMPLE (-#180..+#180) в однобайтные в строке блоков
  932. ;hl=адрес блока в строке блоков LSZX*8
  933.        ;DI
  934.        LD (pSPS3_1),SP
  935.         ;LD DE,(LSZXM8)
  936.         ;INC DE
  937. LSZXm7=$+1
  938.         ld de,0
  939.        LD SP,SAMPLE
  940.        EXX
  941.        LD DE,PTAB+#80 ;таблица обрубания переполнения
  942.        LD B,8
  943. cOPLOOP  DUP 7
  944.         POP HL
  945.         ADD HL,DE
  946.         LD A,(HL)
  947.         EXX
  948.         LD (HL),A
  949.         INC HL
  950.         EXX
  951.         EDUP
  952.         POP HL
  953.         ADD HL,DE
  954.         LD A,(HL)
  955.         EXX
  956.         LD (HL),A
  957.        ADD HL,DE ;de=LSZX-7
  958.        EXX
  959.        DJNZ cOPLOOP
  960. pSPS3_1=$+1
  961.        LD SP,0
  962.        ;EI
  963.        RET
  964.  
  965. ;HL=(pLNADR+1)
  966. M166AA
  967. ;перекодируем 2-байтные данные из SAMPLE в однобайтные в строке блоков, с увеличением в 2 раза
  968. ;hl=адрес блока в строке блоков LSZX*8
  969.        ;DI
  970.        LD (pSPS6_1),SP
  971. pLSMH2_1=$+1
  972.        LD BC,0
  973.        LD SP,SAMPLE
  974.        LD (pLSS_1),BC
  975.        EXX
  976.        LD DE,PTAB+#80 ;таблица обрубания переполнения
  977.        LD B,8
  978. pXSCL_1=$+1
  979.        JR IN3
  980. IN2
  981.        POP HL
  982.        ADD HL,DE
  983.        LD A,(HL)
  984.        EXX
  985.       LD (pLLIN_1),HL
  986.       DUP 7
  987.        LD (HL),A
  988.        INC HL
  989.        LD (HL),A
  990.        INC HL
  991.        EXX
  992.        POP HL
  993.        ADD HL,DE
  994.        LD A,(HL)
  995.        EXX
  996.       EDUP
  997.        LD (HL),A
  998.        INC HL
  999.        LD (HL),A
  1000.        INC HL
  1001. pYSCL_1=$+1
  1002.        LD A,0
  1003. C2LP
  1004.        ADD HL,BC
  1005.       EX DE,HL
  1006. pLLIN_1=$+1
  1007.        LD HL,0
  1008.        dup 16
  1009.        ldi
  1010.        edup
  1011.       EX DE,HL
  1012. pLSS_1=$+1
  1013.        LD BC,0
  1014.        DEC A
  1015.        JR NZ,C2LP
  1016.        ADD HL,BC
  1017.        EXX
  1018.        DJNZ IN2
  1019.        JP pSPS6
  1020. IN3
  1021.        POP HL
  1022.        ADD HL,DE
  1023.        LD A,(HL)
  1024.        EXX
  1025.       LD (pLLIN1_1),HL
  1026.       DUP 7
  1027.        LD (HL),A
  1028.        INC HL
  1029.        LD (HL),A
  1030.        INC HL
  1031.        LD (HL),A
  1032.        INC HL
  1033.        EXX
  1034.        POP HL
  1035.        ADD HL,DE
  1036.        LD A,(HL)
  1037.        EXX
  1038.       EDUP
  1039.        LD (HL),A
  1040.        INC HL
  1041.        LD (HL),A
  1042.        INC HL
  1043.        LD (HL),A
  1044.        INC HL
  1045.        LD A,(pYSCL_1)
  1046. C3LP
  1047.        ADD HL,BC
  1048.       EX DE,HL
  1049. pLLIN1_1=$+1
  1050.        LD HL,0
  1051.        dup 24
  1052.        ldi
  1053.        edup
  1054.       EX DE,HL
  1055.        LD BC,(pLSS_1)
  1056.        DEC A
  1057.        JR NZ,C3LP
  1058.        ADD HL,BC
  1059.        EXX
  1060.        DEC B
  1061.        JP NZ,IN3
  1062. pSPS6
  1063. pSPS6_1=$+1
  1064.        LD SP,0
  1065.        ;EI
  1066.        RET
  1067.  
  1068. M1675A
  1069. ;перекодируем 2-байтные данные из SAMPLE в однобайтные в строке блоков, с увеличением в 2 раза по X?
  1070. ;hl=адрес блока в строке блоков LSZX*8
  1071.        ;DI
  1072.        LD (pSPS5_1),SP
  1073. pLSMH_1=$+1
  1074.        LD DE,0
  1075.        LD SP,SAMPLE
  1076.        EXX
  1077.        LD DE,PTAB+#80 ;таблица обрубания переполнения
  1078.        LD C,8
  1079. Co3LOOP
  1080.       DUP 7
  1081.        POP HL
  1082.        ADD HL,DE
  1083.        LD A,(HL)
  1084.        EXX
  1085.        LD (HL),A
  1086.        INC HL
  1087.        LD (HL),A
  1088.        INC HL
  1089.        EXX
  1090.       EDUP
  1091.        POP HL
  1092.        ADD HL,DE
  1093.        LD A,(HL)
  1094.        EXX
  1095.        LD (HL),A
  1096.        INC HL
  1097.        LD (HL),A
  1098.        INC HL
  1099.        ADD HL,DE
  1100.        EXX
  1101.        DEC C
  1102.        JR NZ,Co3LOOP
  1103. pSPS5_1=$+1
  1104.        LD SP,0
  1105.        ;EI
  1106.        RET
  1107.  
  1108. ;pg1 = Y -> G?
  1109. ;pg2 = Cb -> R
  1110. ;pg5 = Cr -> B
  1111. ;по одним и тем же адресам, начиная с JPGPAGESTART(0xc000) -> BGR
  1112.        
  1113. ;TODO с учётом масштабирования пропускать строки
  1114. jpgconvRGB
  1115. ;HL=JPGPAGESTART
  1116. ;A=(MAXV8) ;высота полноценного блока
  1117. jpgconvRGBlines0
  1118. jpglinecount=$+1
  1119.        ld de,0
  1120.        dec de
  1121.        bit 7,d
  1122.        ret nz ;строки сверх высоты картинки не выводить
  1123.        ld (jpglinecount),de
  1124.        push af
  1125.         ;bit 0,e
  1126.         ;jp z,jpgconvRGBlineskip ;TODO с учётом зума
  1127.         call islinevisible
  1128.         jp nz,jpgconvRGBlineskip
  1129.        push hl
  1130.        
  1131. ;1.читать в LINE каждую составляющую отдельно, 2.перекодировать каждую составляющую отдельно, 3. записывать сразу в bmp (BGR)
  1132.        ld e,1
  1133.        call SETPG
  1134.        ld de,LINE1
  1135.        ld bc,(curpicwid)
  1136. jpgcnvcopylineY0
  1137.        ldi
  1138.        inc de
  1139.        inc de
  1140.        jp pe,jpgcnvcopylineY0
  1141.        pop hl
  1142.        push hl
  1143.        ld e,2
  1144.        call SETPG
  1145.        ld de,LINE1+1
  1146.        ld bc,(curpicwid)
  1147. jpgcnvcopylineCB0
  1148.        ldi
  1149.        inc de
  1150.        inc de
  1151.        jp pe,jpgcnvcopylineCB0
  1152.        pop hl
  1153.        push hl
  1154.        ld e,5
  1155.        call SETPG
  1156.        ld de,LINE1+2
  1157.        ld bc,(curpicwid)
  1158. jpgcnvcopylineCR0
  1159.        ldi
  1160.        inc de
  1161.        inc de
  1162.        jp pe,jpgcnvcopylineCR0
  1163. ;этот фрагмент=55481
  1164.        
  1165.        ld hl,LINE1
  1166.        ld bc,(curpicwid)
  1167. jpgconvRGBpixels0
  1168.        LD A,(HL) ;Y
  1169.        inc hl
  1170.        LD (pY8_),A
  1171.        LD A,(HL) ;CB
  1172.        inc hl
  1173.        LD (pCB8_),A
  1174.        LD A,(HL) ;CR
  1175.        EXX
  1176.       LD L,A ;CR
  1177.       LD H,G716C/256 ;CR tab (add to Y->R) ;k>=0?
  1178.        LD E,(HL)
  1179.        INC H
  1180.        LD D,(HL)
  1181.       INC H ;G7174/256 ;CR tab (add to Y->G) ;k<0?
  1182.        LD C,(HL)
  1183.        INC H
  1184.        LD B,(HL)
  1185. pY8_=$+1
  1186.        LD HL,PTAB ;таблица обрубания переполнения + Y
  1187.       EX DE,HL
  1188.        ADD HL,DE ;de=таблица обрубания переполнения + Y
  1189.        LD A,(HL) ;R без контраста
  1190.        exx
  1191.        ld (hl),a ;R без контраста
  1192.        exx
  1193.  
  1194. pCB8_=$+1
  1195.        LD HL,G7170 ;CB tab (add to Y->G)
  1196.       DEC H
  1197.       LD A,(HL)
  1198.       DEC H ;G7178/256 ;CB tab (add to Y->B) ;k<0?
  1199.       LD L,(HL)
  1200.       LD H,A
  1201.        ADD HL,BC
  1202.        ADD HL,DE ;de=таблица обрубания переполнения + Y
  1203.        LD A,(HL) ;G без контраста
  1204.        ex af,af'
  1205.  
  1206.        LD HL,(pCB8_) ;G7170+ ;CB tab (add to Y->G) ;k>=0?
  1207.         LD C,(HL)
  1208.         INC H
  1209.         LD B,(HL)
  1210.        EX DE,HL ;hl=таблица обрубания переполнения + Y
  1211.         ADD HL,BC
  1212.          ld a,(hl) ;B без контраста
  1213.         EXX
  1214.         dec hl
  1215.         dec hl
  1216.         LD (HL),A ;B без контраста
  1217.         inc hl
  1218.          ex af,af'
  1219.         ld (hl),a ;G без контраста
  1220.        inc hl
  1221.        cpi
  1222.        jp pe,jpgconvRGBpixels0 ;один проход цикла = 358
  1223. ;цикл=171870
  1224.  
  1225.        ld hl,LINE1
  1226.        ld bc,(curpicwidx3)
  1227. ;hl=откуда копируем строку
  1228. ;bc=сколько байт копируем
  1229.        ;push hl
  1230.        ;call putline ;30644
  1231.        ;pop hl
  1232.        call drawscreenline_frombuf ;конвертируем LINEGIF в LINEPIXELS и выводим её на экран ;меняет, потом восстанавливает 0x4000, 0x8000
  1233.        call keepconvertedline ;запоминаем сконверченную строку из LINEPIXELS
  1234.  
  1235.        pop hl
  1236. jpgconvRGBlineskip
  1237.         call inccury
  1238.        LD DE,(LSZX) ;ширина строки, округлённая вверх до полноценного блока
  1239.        ADD HL,DE ;следующая строка блока
  1240.        pop af
  1241.        dec a
  1242.        JP NZ,jpgconvRGBlines0 ;на всю высоту полноценного блока ;одна строка = 258150
  1243.        RET ;4 130 590
  1244.  
  1245. jpgconvBW
  1246. ;HL=JPGPAGESTART
  1247. ;A=(MAXV8) ;высота полноценного блока
  1248.        ;ld e,1
  1249.        ;call SETPG
  1250. jpgconvBWlines0
  1251.        ld de,(jpglinecount)
  1252.        dec de
  1253.        bit 7,d
  1254.        ret nz ;строки сверх высоты картинки не выводить
  1255.        ld (jpglinecount),de
  1256.        push af
  1257.         ;bit 0,e
  1258.         ;jp z,jpgconvBWlineskip ;TODO с учётом зума
  1259.         call islinevisible
  1260.         jp nz,jpgconvBWlineskip
  1261.        push hl
  1262.         ld e,1
  1263.         call SETPG
  1264.        
  1265. ;1.читать в LINE составляющую Y во все три составляющих RGB, 2. записывать сразу в bmp (BGR)
  1266.        ld de,LINE1
  1267.        ld bc,(curpicwid)
  1268. jpgconvBWcopylineY0
  1269.        ld a,(hl)
  1270.        ld (de),a
  1271.        inc de
  1272.        ld (de),a
  1273.        inc de
  1274.        ldi
  1275.        jp pe,jpgconvBWcopylineY0
  1276.        
  1277.        ld hl,LINE1
  1278.        ld bc,(curpicwidx3)
  1279. ;hl=откуда копируем строку
  1280. ;bc=сколько байт копируем
  1281.        ;push hl
  1282.        ;call putline ;30644
  1283.        ;pop hl
  1284.        call drawscreenline_frombuf ;конвертируем LINEGIF в LINEPIXELS и выводим её на экран ;меняет, потом восстанавливает 0x4000, 0x8000
  1285.        call keepconvertedline ;запоминаем сконверченную строку из LINEPIXELS
  1286.  
  1287.        pop hl
  1288. jpgconvBWlineskip
  1289.         call inccury
  1290.        LD DE,(LSZX) ;ширина строки, округлённая вверх до полноценного блока
  1291.        ADD HL,DE ;следующая строка блока
  1292.        pop af
  1293.        dec a
  1294.        JP NZ,jpgconvBWlines0 ;на всю высоту полноценного блока
  1295.        ret
  1296.        
  1297.  
  1298.  
  1299.  
  1300. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1301. JPEG_CLPG=0
  1302.        if JPEG_CLPG
  1303. clpg
  1304.        ld hl,0xc000
  1305.        ld de,0xc001
  1306.        ld bc,0x3fff
  1307.        ld (hl),l ;0
  1308.        ldir
  1309.        ret
  1310.        endif
  1311.  
  1312. readjpeg
  1313.        if JPEG_CLPG
  1314.        ld e,0
  1315.        call SETPG
  1316.        call clpg
  1317.        ld e,1
  1318.        call SETPG
  1319.        call clpg
  1320.        ld e,2
  1321.        call SETPG
  1322.        call clpg
  1323.        ld e,5
  1324.        call SETPG
  1325.        call clpg
  1326.        endif
  1327.  
  1328.        ld hl,JPEGCLEARADDR
  1329.        ld de,JPEGCLEARADDR+1
  1330.        ld bc,JPEGCLEARSZ-1
  1331.        ld (hl),0
  1332.        ldir
  1333.  
  1334.        ld hl,LINE1
  1335.        ld de,LINE1+1
  1336.        ld (hl),BACKGROUNDCOLORLEVEL
  1337.        ld bc,LINE1_sz-1
  1338.        ldir ;чтобы справа в остатке знакоместа была чернота (потом можно убрать, когда readchr будет это делать)
  1339.        
  1340.        ;ld hl,VARS
  1341.        ;ld de,VARS+1
  1342.        ;ld bc,VARSsz-1
  1343.        ;ld (hl),0
  1344.        ;ldir ;какие-то переменные ожидаются в 0 - TODO найти какие
  1345.        
  1346.        ;LD HL,jpgputline
  1347.        ;LD (pPROC+1),HL
  1348.        LD HL,FREE
  1349.        LD (MEMDN),HL
  1350.       ;LD HL,JPGPAGESTART
  1351.        ;LD (pSCR2+1),HL
  1352.       ;IFN buf9000
  1353.       ;LD A,DISKBUF/256+(DISKBUFsz/256)
  1354.       ;LD (RDBYHend),A
  1355.       ;LD IY,DISKBUF+DISKBUFsz-1
  1356.       ;ELSE
  1357.       ; LD H,L
  1358.       ; LD (BFLEN),HL
  1359.       ;ENDIF
  1360.       ;LD A,(SCRPRC)
  1361.       ;LD (WASCRPRC),A ;настройка наложения на старый экран?
  1362.        ;CALL iNITJPG
  1363.         ld hl,SAMTAB
  1364.         ld (pPST_1),hl
  1365.  
  1366.        CALL FBMARK
  1367.        CALL LBMARK
  1368.        ;CALL pSCAL ;установка масштабов
  1369.        ;CALL SETPG7
  1370.       ;CALL PRSIZES
  1371. ;once
  1372. GMAXC
  1373.        LD A,(CNUM)
  1374.        LD B,A
  1375.        LD IX,(VAR+#56)
  1376.        PUSH IX
  1377.        push BC
  1378.        LD HL,#101
  1379.       LD DE,18
  1380. gMAXS   LD A,(IX+2)
  1381.        CP H
  1382.        JR C,$+3
  1383.        LD H,A
  1384.        LD A,(IX+3)
  1385.        CP L
  1386.        JR C,$+3
  1387.        LD L,A
  1388.        ADD IX,DE
  1389.        DJNZ gMAXS
  1390.       ;LD A,H
  1391.       ;LD (MAXH),A
  1392.       ;LD A,L
  1393.        LD (MAXV),HL;A
  1394.        POP BC
  1395.        pop IX
  1396. rESCLP  PUSH BC
  1397.        LD DE,(curpicwid)
  1398.        LD A,(IX+2)
  1399.        CALL MULDE_A
  1400.        LD DE,(MAXH)
  1401.        ADD HL,DE
  1402.        DEC HL
  1403.        CALL DIVHL_DE
  1404.       LD (IX+7),C
  1405.       LD (IX+8),B
  1406.        LD DE,(curpichgt)
  1407.        LD A,(IX+3)
  1408.        CALL MULDE_A
  1409.        LD DE,(MAXV)
  1410.        ADD HL,DE
  1411.        DEC HL
  1412.        CALL DIVHL_DE
  1413.       LD (IX+9),C
  1414.       LD (IX+#0A),B
  1415.       LD DE,18
  1416.       ADD IX,DE
  1417.        POP BC
  1418.        DJNZ rESCLP
  1419.  
  1420. ;SELECT OUTPUT
  1421.        ;CALL 8026
  1422.        ;LD A,(PIXPOI)
  1423.        ;JR C,$+4
  1424.        ;LD A,3
  1425.        ;LD (pIXPOI),A
  1426.        ;LD BC,0
  1427.        ;JR NC,bC_JR
  1428.        ;LD A,(BRIGP)
  1429.        ;LD HL,CONTP
  1430.        ;OR (HL)
  1431.        ;LD B,A
  1432.        ;INC B
  1433.        ;DEC C
  1434. ;bC_JR
  1435.       ;IFN fCS
  1436.       ;LD A,C,(rdCS+1),A
  1437.       CALL rdCSU ;первоначальное чтение CS
  1438.       ;ENDIF
  1439.      
  1440.        LD A,(CNUM)
  1441.        ;LD (VAR+#C8),A
  1442.        ;LD (VAR+#CA),A
  1443.        DEC A
  1444.         ld hl,jpgconvBW
  1445.        JR Z,YEGRSC ;greyscale image
  1446.        CP 2
  1447.        CALL NZ,ERROR ;not YUV
  1448.        LD HL,jpgconvRGB
  1449.        ;JR sTCF
  1450. YEGRSC
  1451.        ;LD HL,CNVTOGR
  1452.        ;DJNZ $+5
  1453.        ;LD HL,EMPTY
  1454. sTCF
  1455.      ;LD (cOLPOI),A
  1456.        LD (jpgconv_patch),HL ;процедура конверсии YUV -> RGB
  1457.        ;DEC A
  1458.        ;ADD A,A
  1459.        ;LD HL,CLADR
  1460.        ;CALL HLA   ;HL+=A
  1461.        ;CALL DEGRB ;DE=(HL)
  1462.        ;EX DE,HL
  1463.        ;LD (pCLRS+1),HL        
  1464.  
  1465.        ;push iy
  1466.        ;call reserve_bmp_pages
  1467.        ;pop iy
  1468.        
  1469. ;всё до render=203762
  1470. render
  1471.        ld hl,(curpichgt)
  1472.        ld (jpglinecount),hl
  1473.        
  1474.        CALL YCCTAB ;103518
  1475.        CALL GENMTAB ;430734
  1476.       ;CALL MAKCTB
  1477.      PUSH IY
  1478.       CALL setsamplescalers ;1253
  1479.       CALL maketrees;M18E08 ;110466
  1480.      POP IY
  1481.        
  1482. ;заполняем после maketrees, поверх её буфера
  1483.        LD l,0
  1484. cNTBLP  LD H,PLTAB/256 ;таблица отсечения переполнения
  1485.        ld (hl),0
  1486.        inc h
  1487.        LD (HL),L
  1488.        inc h
  1489.        LD (HL),-1
  1490.        INC L
  1491.        JR NZ,cNTBLP
  1492.  
  1493.        LD A,(MAXV)
  1494.        ADD A,A
  1495.        ADD A,A
  1496.        ADD A,A
  1497.        LD (MAXV8),A
  1498.        LD A,(MAXH)
  1499.        ADD A,A
  1500.        ADD A,A
  1501.        ADD A,A
  1502.        LD (MAXH8),A
  1503.        LD HL,(curpicwid)
  1504.        CALL ROUND ;HL=k*A (>=HL)
  1505.        LD (LSZX),HL
  1506.        LD DE,7
  1507.       OR A
  1508.        SBC HL,DE
  1509.        LD (LSZXm7),HL
  1510.        ADD HL,DE
  1511.        LD DE,(MAXH8)
  1512.       OR A
  1513.        SBC HL,DE
  1514.        LD (pLSMH_1),HL
  1515.        LD (pLSMH2_1),HL
  1516.        ADD HL,DE
  1517.        ADD HL,HL
  1518.        ADD HL,HL
  1519.        ADD HL,HL
  1520.        LD (BLSZ),HL
  1521.       CALL MAKTS
  1522. ;этот блок=27612
  1523.      
  1524. ;рендер
  1525.        LD A,(pichgt_inblocks) ;высота картинки в полноценных блоках
  1526.        LD B,A ;0x16
  1527. YLOOP   PUSH BC
  1528. ;рендерим строку из полноценных блоков
  1529.        LD HL,JPGPAGESTART
  1530.        LD (LPNT),HL
  1531.        LD A,(picwid_inblocks) ;ширина картинки в полноценных блоках
  1532.        LD B,A ;0x1e
  1533. XLOP    PUSH BC
  1534.        CALL rENDLIN ;147235 один вызов
  1535.        LD HL,(LPNT)
  1536.        LD DE,(MAXH8)
  1537.        ADD HL,DE
  1538.        LD (LPNT),HL
  1539.        POP BC
  1540.        DJNZ XLOP
  1541. ;6 007 979 цикл по горизонтали
  1542.        
  1543.        LD HL,JPGPAGESTART
  1544.        LD A,(MAXV8) ;высота полноценного блока
  1545. jpgconv_patch=$+1
  1546.        CALL jpgconvRGB ;перекодируем в bmp ;4 130 590 один вызов
  1547. ;следующая строка из полноценных блоков
  1548.        POP BC
  1549.        DJNZ YLOOP
  1550.        
  1551. pNFX   LD DE,0 ;какая получилась высота с округлением вверх на полноценный блок ;0x160
  1552.       LD HL,(curpichgt) ;0x15c
  1553.       OR A
  1554.       SBC HL,DE
  1555.       RET Z
  1556.       RET C ;в girl.jpg выход по CY
  1557. ;высота с округлением вверх получилась меньше реальной??? это как??? TODO
  1558.      
  1559. ;что происходит после рендера??? TODO
  1560.      
  1561.       LD HL,JPGPAGESTART
  1562.        LD (LPNT),HL
  1563.  
  1564. rENDLIN
  1565.        LD HL,VAR+#110
  1566.        LD (pHCNT+1),HL
  1567.        LD (pHCNT2+1),HL
  1568.        LD A,(VAR+#C2)
  1569.       OR A
  1570.        JR Z,gOREAD
  1571.        LD A,(VAR+#120)
  1572.       OR A
  1573.       CALL Z,M18E7A
  1574.        LD HL,VAR+#120
  1575.        DEC (HL)
  1576. gOREAD  LD HL,JF44 ;адрес таблицы из 4 функций
  1577.        LD (pSFUNC+1),HL
  1578.        
  1579.        LD IX,SPGTB ;таблица из 3 страниц 1/2/5 ;TODO убрать
  1580.        LD HL,SAMTAB
  1581. NXRS    LD A,(IX)
  1582.        INC IX
  1583.        LD (pSMPPG+1),A ;страничка 1/2/5 ;TODO убрать
  1584.        
  1585.        LD A,(HL) ;число слоёв?
  1586.        INC HL
  1587.        OR A
  1588.       RET Z
  1589.        PUSH IX
  1590.        LD B,A
  1591. ;перебираем все слои?
  1592. NXRS1   PUSH BC
  1593.        LD E,(HL)
  1594.        INC HL
  1595.        LD D,(HL)
  1596.        INC HL
  1597.       PUSH HL
  1598.       LD HL,(LPNT)
  1599.       ADD HL,DE
  1600.       LD (pLNADR+1),HL
  1601.       POP HL
  1602.        LD E,(HL)
  1603.        INC HL
  1604.        LD D,(HL)
  1605.        INC HL
  1606.       INC DE
  1607.       LD (pQTBDC_1),DE
  1608.      DEC DE
  1609.      dec DE
  1610.       LD A,D
  1611.       SUB Qorder/256
  1612.       LD D,A
  1613.       LD (pQTB+1),DE
  1614.        LD E,(HL)
  1615.        INC HL
  1616.        LD D,(HL)
  1617.        INC HL
  1618.        LD C,(HL)
  1619.        INC HL
  1620.        LD B,(HL)
  1621.        INC HL
  1622.       PUSH HL
  1623.       LD HL,#43C;16
  1624.       ADD HL,DE
  1625.       LD (pLHTB_2),HL
  1626.       SBC HL,DE
  1627.       ADD HL,BC
  1628.       LD (pHHTB_2),HL
  1629.       POP HL
  1630.        LD A,(HL)
  1631.       ADD A,-1
  1632.       SBC A,A
  1633.       AND IN3-IN2
  1634.        LD (pXSCL_1),A ;jr disp
  1635.        INC HL
  1636.        LD A,(HL)
  1637.        LD (pYSCL_1),A
  1638.        INC HL
  1639.        PUSH HL
  1640.        CALL RDSAMP
  1641.        if !ONEPAGEYUV
  1642. pSMPPG  LD E,0 ;1/2/5 номер слоя
  1643.        CALL SETPG
  1644.        endif
  1645. pLNADR  LD HL,0
  1646.        if ONEPAGEYUV
  1647.        LD E,1
  1648.        CALL SETPG ;TODO убрать
  1649. pSMPPG  LD A,0 ;1/2/5 номер слоя
  1650.        ;пересчёт HL в зависимости от номера слоя
  1651.        cp 2
  1652.        jr nz,$+6
  1653.         set 3,h
  1654.         jr $+6
  1655.        jr c,$+4
  1656.        set 4,h
  1657.        endif
  1658. pSFUNC  CALL 0 ;текущий адрес в таблице 4 функций ;по идее должно быть M1696A, M166AA, M1675A или EMPTY? перекладывает SAMPLE в нужный слой с нужным масштабированием
  1659.        POP HL
  1660.        POP BC
  1661.        DJNZ NXRS1 ;следующий слой?
  1662.        
  1663.        EX DE,HL
  1664.        LD HL,(pHCNT+1)
  1665.        INC HL
  1666.        inc HL
  1667.        LD (pHCNT+1),HL
  1668.        ;LD HL,(pHCNT2+1) ;зачем? TODO
  1669.        ;INC HL
  1670.        ;inc HL
  1671.        LD (pHCNT2+1),HL
  1672.        LD HL,(pSFUNC+1)
  1673.       INC HL
  1674.       inc HL
  1675.       inc HL
  1676.        LD (pSFUNC+1),HL
  1677.        EX DE,HL
  1678.        POP IX
  1679.       JP NXRS
  1680.  
  1681. ROUNDm8
  1682.        ADD A,A
  1683.        ADD A,A
  1684.        ADD A,A
  1685. ;3 times
  1686. ROUND
  1687.        LD E,A
  1688.        LD D,0
  1689.       ADD HL,DE
  1690.       DEC HL
  1691.       PUSH HL
  1692.       CALL QUAHL_DE ;DE=HLmodDE
  1693.       POP HL
  1694.       OR A
  1695.       SBC HL,DE ;HL=k*A (>=HL)
  1696.        RET
  1697. ;once
  1698. MAKTS
  1699.        LD HL,(curpicwid)
  1700.        LD A,(MAXH8)
  1701.       LD E,A
  1702.       LD D,0
  1703.       ADD HL,DE ;
  1704.       DEC HL    ;для округления вверх
  1705.       CALL DIVHL_DE
  1706.       LD (picwid_inblocks),BC
  1707.        LD HL,(curpichgt)
  1708.        LD A,(MAXV8)
  1709.       LD E,A
  1710.       LD D,0
  1711.       ADD HL,DE ;
  1712.       DEC HL    ;для округления вверх
  1713.       CALL DIVHL_DE
  1714.       LD D,B
  1715.       ld E,C
  1716.        LD (pichgt_inblocks),DE
  1717.        LD A,(MAXV8)
  1718.        CALL MULDE_A
  1719.        LD (pNFX+1),HL ;какая получилась высота с округлением на полноценный блок
  1720.        LD HL,VAR+#E2
  1721.        LD A,(CNUM)
  1722.        LD B,A
  1723. RCLP1   PUSH BC
  1724.        push HL
  1725.        CALL GETIXHL
  1726.       LD B,(IX+2)
  1727.       ld C,(IX+3)
  1728.       LD (IX+#B),B
  1729.       ld (IX+#C),C
  1730.       LD L,(IX+7)
  1731.       ld H,(IX+8)
  1732.        LD A,B
  1733.        CALL ROUNDm8 ;HL=k*A*8 (>=HL)
  1734.        XOR A
  1735.        ADD A,C
  1736.        DJNZ $-1
  1737.        LD (IX+#0D),A
  1738.       LD (IX+#E),L
  1739.       ld (IX+#F),H
  1740.       LD L,(IX+9)
  1741.       ld H,(IX+#A)
  1742.        LD A,C
  1743.        CALL ROUNDm8 ;HL=k*A*8 (>=HL)
  1744.       LD (IX+#10),L
  1745.       ld (IX+#11),H
  1746. pPST_1=$+1
  1747.        LD HL,SAMTAB
  1748.        LD A,(IX+#D)
  1749.        LD (HL),A
  1750.        INC HL
  1751.        LD DE,0
  1752.        LD C,(IX+3)
  1753. YMTLP   PUSH DE
  1754.        LD B,(IX+2)
  1755. XMTLP   PUSH BC
  1756.        PUSH DE
  1757.        LD (HL),E
  1758.        INC HL
  1759.        LD (HL),D
  1760.        INC HL
  1761.       EX DE,HL
  1762.       LD HL,VAR+#5A
  1763.        LD A,(IX+4)
  1764.       ADD A,A
  1765.       ADD A,L
  1766.       LD L,A
  1767.        LDI
  1768.        LDI
  1769.        LD A,(IX+5)
  1770.       ADD A,A
  1771.       ADD A,0xff&(VAR+#6A)
  1772.       LD L,A
  1773.        LDI
  1774.        LDI
  1775.        LD A,(IX+6)
  1776.       ADD A,A
  1777.       ADD A,0xff&(VAR+#7A)
  1778.       LD L,A
  1779.        LDI
  1780.        LDI
  1781.        LD A,(MAXH)
  1782.        LD B,(IX+2)
  1783.        CALL DIV8
  1784.       SUB 2
  1785.        LD (DE),A
  1786.        INC DE
  1787.        LD A,(MAXV)
  1788.        LD B,(IX+3)
  1789.        CALL DIV8
  1790.        DEC A
  1791.        LD (DE),A
  1792.        INC DE
  1793.       POP HL
  1794.        LD BC,8
  1795.        ADD HL,BC
  1796.       EX DE,HL
  1797.       POP BC
  1798.        DJNZ XMTLP
  1799.       POP DE
  1800.       PUSH HL
  1801.        LD HL,(BLSZ)
  1802.        ADD HL,DE
  1803.       EX DE,HL
  1804.       POP HL
  1805.        DEC C
  1806.        JR NZ,YMTLP
  1807.        LD (pPST_1),HL
  1808.       EX DE,HL
  1809.        POP HL
  1810.        INC HL
  1811.        inc HL
  1812.        POP BC
  1813.       DEC B
  1814.       JP NZ,RCLP1
  1815.       EX DE,HL
  1816.       LD (HL),B
  1817.        RET
  1818. ;         Y CB CR
  1819. SPGTB
  1820.        DB 1,2,5
  1821. ;once
  1822. setsamplescalers
  1823.        LD A,(VAR+#BE)
  1824.        OR A
  1825.        CALL NZ,ERROR
  1826.        LD A,(VAR+#E0)
  1827.        LD B,A
  1828.        LD HL,VAR+#E2
  1829.        LD IY,JF44+1 ;адрес таблицы из 4 функций
  1830. uPFLP
  1831.        PUSH HL
  1832.        CALL GETIXHL
  1833.       LD HL,(MAXH)
  1834.       LD A,(MAXV)
  1835.       LD E,A
  1836.       LD H,(IX+2)
  1837.       LD D,(IX+3)
  1838.        LD A,H
  1839.        CP L
  1840.        JR NZ,uPF1
  1841.        LD A,D
  1842.        CP E
  1843.       JR NZ,uPF1
  1844.       LD HL,M1696A ;без увеличения
  1845.       JR uPFOK
  1846. uPF1    LD A,H
  1847.        ADD A,A
  1848.        CP L
  1849.        JR NZ,uPF2
  1850.        LD A,D
  1851.        CP E
  1852.       JR NZ,uPF2
  1853.       LD HL,M1675A ;с увеличением в 2 раза по X?
  1854.       JR uPFOK
  1855. uPF2    LD A,H
  1856.        CP L
  1857.        JR NZ,uPF3
  1858.        LD A,D
  1859.        ADD A,A
  1860.        CP E
  1861.       JR NZ,uPF3
  1862.       LD HL,ERROR ;M16810
  1863.       JR uPFOK
  1864. uPF3    LD A,L
  1865.       SUB H
  1866.       CALL C,ERROR
  1867.       JR NZ,$-4
  1868.        LD A,E
  1869.       SUB D
  1870.       CALL C,ERROR
  1871.       JR NZ,$-4
  1872.        LD HL,M166AA ;с увеличением в 2 раза
  1873.       ;LD A,(cOLPOI) ;0=B/W режим показа
  1874.       ;OR A
  1875.       ;JR NZ,$+5
  1876.       ;LD HL,EMPTY
  1877. uPFOK   LD (IY),L
  1878.        LD (IY+1),H ;кладём адрес функции в таблицу из 4 функций
  1879.        LD DE,3
  1880.        ADD IY,DE
  1881.        POP HL
  1882.        INC HL
  1883.        inc HL
  1884.        DJNZ uPFLP
  1885.        RET
  1886. ;once
  1887. maketrees;M18E08
  1888.       LD A,128
  1889.       LD (BITER),A
  1890.       LD A,(VAR+#E0)
  1891.       LD B,A
  1892.        LD HL,VAR+#E2
  1893.        LD DE,VAR+#110
  1894. hUFLP   PUSH BC
  1895.        push HL
  1896.        push DE
  1897.        CALL GETIXHL
  1898.        LD A,(IX+5)
  1899.        LD HL,VAR+#6A
  1900.       CALL maketree;m18950
  1901.       LD A,(PRMODE)
  1902.       CP #C2
  1903.        LD A,(IX+6)
  1904.        LD HL,VAR+#7A
  1905.       CALL NZ,maketree;m18950
  1906.        POP DE
  1907.        XOR A
  1908.        LD (DE),A
  1909.        INC DE
  1910.        POP HL
  1911.        INC HL
  1912.        inc HL
  1913.        POP BC
  1914.        DJNZ hUFLP
  1915.        ;LD (VAR+#122),A ;TODO зачем?
  1916.        LD A,(VAR+#C2)
  1917.        LD (VAR+#120),A
  1918.        RET
  1919.  
  1920. ;построение дерева
  1921. ;twice
  1922. maketree;m18950
  1923. ;_thuffs - временный буфер, после этой процедуры не нужен
  1924. ;дерево создаётся в районе FREE по указателю в [[hl+a*2]]
  1925.       ADD A,A
  1926.       LD E,A
  1927.       LD D,0
  1928.       ADD HL,DE
  1929.       LD E,(HL)
  1930.       INC HL
  1931.       LD D,(HL)
  1932.       LD A,D
  1933.       OR E
  1934.       CALL Z,ERROR
  1935.        PUSH IX
  1936.        EX DE,HL
  1937.        LD (pHFT),HL
  1938.        LD DE,_thuffs+#0207
  1939.         push de
  1940.        LD A,1
  1941. l3      LD B,(HL)
  1942.        INC HL
  1943.        INC B
  1944.        LD (DE),A
  1945.        INC DE
  1946.        DJNZ $-2
  1947.        DEC DE
  1948.        INC A
  1949.        CP 17
  1950.        JR NZ,l3
  1951.       XOR A
  1952.       LD (DE),A
  1953.         ;jr $
  1954.         pop ix ;LD IX,_thuffs+#0207
  1955.       LD HL,_thuffs+#0004
  1956.       LD D,A
  1957.       ld E,A ;de=0
  1958.        LD C,(IX)
  1959. ;что-то хитрое
  1960. l5      LD A,(IX)
  1961.        CP C
  1962.        JR NZ,l4
  1963.        INC IX
  1964.        LD (HL),D
  1965.        INC HL
  1966.        LD (HL),E
  1967.        INC HL
  1968.        INC DE
  1969.        JR l5
  1970. l4      SLA E
  1971.        RL D
  1972.        INC C
  1973.        LD A,(IX)
  1974.        OR A
  1975.        JR NZ,l5
  1976. pHFT=$+2
  1977.        LD IY,0
  1978.        PUSH IY
  1979.        LD DE,#43C
  1980.        ADD IY,DE
  1981.       LD H,A
  1982.       ld L,A
  1983.       LD DE,2+#480
  1984.        EXX
  1985.        POP HL
  1986.        EXX
  1987.        LD B,16
  1988. L8      PUSH BC
  1989.        EXX
  1990.        LD A,(HL)
  1991.       INC HL
  1992.        EXX
  1993.       OR A
  1994.        JR Z,L7
  1995.        LD IX,(pHFT)
  1996.       ;LD BC,#480
  1997.       ;ADD IX,BC
  1998.        ADD IX,DE
  1999.        LD (IX),H
  2000.        LD (IX+1),L
  2001.       PUSH HL
  2002.        LD IX,(pHFT)
  2003.        ADD IX,DE
  2004.        ADD HL,HL
  2005.        LD BC,_thuffs+#0004
  2006.        ADD HL,BC
  2007.        LD B,(HL)
  2008.        INC HL
  2009.        LD C,(HL)
  2010.       LD (IX+#416-#480),B
  2011.       LD (IX+#417-#480),C
  2012.       POP HL
  2013.        LD C,A
  2014.        LD B,0
  2015.        ADD HL,BC
  2016.       PUSH HL
  2017.        ADD HL,HL
  2018.        LD BC,_thuffs+#0002
  2019.        ADD HL,BC
  2020.        LD B,(HL)
  2021.        INC HL
  2022.        LD C,(HL)
  2023.       POP HL
  2024.        JR $+5
  2025. L7      LD BC,-1
  2026.        LD (IY),B
  2027.        LD (IY+1),C
  2028.        INC IY
  2029.        inc IY
  2030.        INC DE
  2031.        inc DE
  2032.        POP BC
  2033.        DJNZ L8
  2034.        LD HL,(pHFT)
  2035.        LD DE,#47C
  2036.        ADD HL,DE
  2037.       LD (HL),B
  2038.        INC HL
  2039.        LD (HL),#0F
  2040.        INC HL
  2041.       DEC B
  2042.       LD (HL),B
  2043.        INC HL
  2044.       LD (HL),B
  2045. ;(+482)=(+482)-(+418)+A+16
  2046.       LD HL,(pHFT)
  2047.       LD BC,16
  2048.       ADD HL,BC
  2049.       EX DE,HL
  2050.       LD IX,#482-16
  2051.       ADD IX,DE
  2052.       LD A,C
  2053. REHUF0
  2054.       LD H,(IX)
  2055.       LD L,(IX+1)
  2056.       LD B,(IX+#418-#482)
  2057.       LD C,(IX+#419-#482)
  2058.       OR A
  2059.       SBC HL,BC
  2060.       ADD HL,DE
  2061.       LD (IX),H
  2062.       LD (IX+1),L
  2063.       INC IX
  2064.       inc IX
  2065.       DEC A
  2066.       JR NZ,REHUF0
  2067.        POP IX
  2068.        RET          
  2069.  
  2070. FBMARK
  2071.        ;CALL RDBYTE ;уже прочитали в browser
  2072.        ;INC A
  2073.        ;CALL NZ,ERROR2
  2074.        CALL RDBYTE
  2075.        CP #D8
  2076.        CALL NZ,ERROR2
  2077.        LD IX,VARS+#8A
  2078.        LD B,#10
  2079.       LD HL,1
  2080. ARTLP  LD (IX),H
  2081.       LD (IX+#10),L
  2082.        LD (IX+#20),5
  2083.        INC IX
  2084.        DJNZ ARTLP
  2085.        LD (VARS+#50),HL
  2086.        LD (VARS+#52),HL
  2087.        DEC L
  2088.        LD (VARS+#C2),HL
  2089.       LD A,H
  2090.        LD (VARS+#4E),A
  2091.        LD (VARS+#BE),A
  2092.        CALL PRCMARK1
  2093.       LD (PRMODE),A ;значения #c2, #c3, какие ещё?
  2094.       CP #C3
  2095.        CALL NC,ERROR4
  2096.        CALL jpgreadsizes
  2097. MRKP3
  2098.        LD A,(CNUM)
  2099.       CP 1
  2100.        JR Z,MRKPOK
  2101.       CP 3
  2102.        JR NZ,mRKPC4
  2103.        LD A,(VARS+#4A)
  2104.        OR A
  2105.        RET NZ
  2106.        LD IX,(VARS+#56)
  2107.        LD A,1
  2108.        CP (IX)
  2109.        CALL NZ,ERROR
  2110.        INC A
  2111.        CP (IX+#12)
  2112.       JR NZ,mRKP4
  2113.        INC A
  2114.        CP (IX+#24)
  2115.        JR Z,MRKPOK
  2116. mRKP4   LD A,4
  2117.        CP (IX+#12)
  2118.        CALL NZ,ERROR
  2119.        INC A
  2120.        CP (IX+#24)
  2121.        CALL NZ,ERROR
  2122.        DEC A
  2123.        JR MRKPOK
  2124. mRKPC4  CP 4
  2125.        CALL NZ,ERROR
  2126.        INC A
  2127. MRKPOK  LD (VARS+#4A),A
  2128.        RET
  2129. ;twice
  2130. PRCMARK1
  2131.        CALL PRCMARK
  2132. pMRK_1=$+1
  2133.        LD A,0
  2134.        RET
  2135.  
  2136. MPHT    CALL P_HTAB
  2137. PRCMARK
  2138.        ;jr $
  2139.       CALL RDBYTE
  2140.       INC A
  2141.       JR NZ,$-4
  2142.       CALL RDBYTE
  2143.        LD (pMRK_1),A
  2144.        SUB #C0
  2145.       JP C,ERROR4
  2146.        RET Z
  2147.        SUB 4
  2148.       RET C
  2149.        JR Z,MPHT
  2150.        SUB 8
  2151.       RET C
  2152.        JP Z,ERROR ;MPAT
  2153.        SUB 3
  2154.       RET C
  2155.        RET Z
  2156.        SUB 9
  2157.        JP C,ERROR4
  2158.        SUB 3
  2159.       RET C
  2160.        JR Z,MPQT
  2161.        SUB 2
  2162.        JR Z,M141FE
  2163.        SUB 3
  2164.        JR Z,MPAPP
  2165.        LD A,(pMRK_1)
  2166.        CALL RDWORDHSBLSBtohl
  2167.        DEC HL
  2168.        dec HL
  2169. SKPM    CALL RDBYTE
  2170.        DEC HL
  2171.        LD A,H
  2172.        OR L
  2173.        JR NZ,SKPM
  2174.        JR PRCMARK
  2175.  
  2176. MPQT    CALL P_QTAB
  2177.        JR PRCMARK
  2178.  
  2179. M141FE
  2180.        CALL RDWORDHSBLSBtohl
  2181.       LD A,L
  2182.       SUB 4
  2183.       OR H
  2184.        CALL NZ,ERROR
  2185.        CALL RDWORDHSBLSBtohl
  2186.        LD (VAR+#C2),HL
  2187.        JR PRCMARK
  2188.  
  2189. MPAPP   CALL P_APP0
  2190.        JR PRCMARK
  2191.  
  2192. ;once
  2193. P_APP0
  2194.        CALL RDWORDHSBLSBtohl
  2195.       LD DE,-16
  2196.       ADD HL,DE
  2197.        LD (pAPPR_1),HL
  2198.        CALL RDBYTE
  2199.        CP "J"
  2200.       JR NZ,ERR2_
  2201.        CALL RDBYTE
  2202.        CP "F"
  2203.       JR NZ,ERR2_
  2204.        CALL RDBYTE
  2205.        CP "I"
  2206.       JR NZ,ERR2_
  2207.        CALL RDBYTE
  2208.        CP "F"
  2209. ERR2_  JP NZ,ERROR2
  2210.  
  2211.        CALL RDBYTE
  2212.        OR A
  2213.        CALL NZ,ERROR
  2214.        CALL RDWORDHSBLSBtohl
  2215.        CALL RDBYTE
  2216.        LD (VARS+#4E),A
  2217.        CALL RDWORDHSBLSBtohl
  2218.        LD (VARS+#50),HL
  2219.        CALL RDWORDHSBLSBtohl
  2220.        LD (VARS+#52),HL
  2221.        CALL RDWORDHSBLSBtohl
  2222. pAPPR_1=$+1
  2223.        LD BC,0
  2224. APPSL   LD A,B
  2225.        OR C
  2226.        RET Z
  2227.        CALL RDBYTE
  2228.        DEC BC
  2229.        JR APPSL
  2230.        
  2231. ;once
  2232. P_QTAB
  2233.        CALL RDWORDHSBLSBtohl
  2234.        DEC HL
  2235.        dec HL ;len
  2236. NQTB   PUSH HL
  2237.        rdbyte
  2238.        LD B,A
  2239.        RRCA
  2240.        RRCA
  2241.        RRCA
  2242.        RRCA
  2243.        AND #0F
  2244.       LD DE,#41
  2245.       JR Z,$+4
  2246.       LD E,#81
  2247.       PUSH DE
  2248.       LD C,A
  2249.        LD A,B
  2250.        AND #0F
  2251.        CP 4
  2252.        CALL NC,ERROR
  2253.       ADD A,A
  2254.       LD HL,VARS+#5B
  2255.       ADD A,L
  2256.       LD L,A
  2257.        LD D,(HL)
  2258.        DEC HL
  2259.        LD E,(HL)
  2260.        LD A,D
  2261.        OR E
  2262.        JR NZ,QTP
  2263.       PUSH HL
  2264.        LD DE,#80
  2265.        CALL ALLDNP ;не портит bc! hl=указатель на выделенную память
  2266.       EX DE,HL
  2267.       POP HL
  2268.       LD (HL),E
  2269.       INC HL
  2270.       LD (HL),D
  2271. QTP     EX DE,HL
  2272.        LD B,#40
  2273. pQPRC   LD A,C
  2274.       OR A
  2275.       CALL NZ,RDBYTE
  2276.        LD (HL),A
  2277.        INC HL
  2278.        rdbyte
  2279.        LD (HL),A
  2280.        INC HL
  2281.        DJNZ pQPRC
  2282.       POP DE
  2283.       POP HL
  2284.       OR A
  2285.       SBC HL,DE
  2286.       RET Z
  2287.       RET C
  2288.        JR NQTB
  2289.        
  2290. ;выделение динамической памяти
  2291. ;de=размер (реально очищается на 1 байт больше)
  2292. ;out: hl=указатель на выделенную память
  2293. ALLDNP  
  2294.        if 1==0 ;не чистим
  2295.        CALL ALLDN
  2296.        LD E,0
  2297.        CALL SETPG
  2298.        PUSH HL
  2299.        push DE
  2300.        push BC
  2301.        LD E,L
  2302.        ld D,H
  2303.        INC DE
  2304. pCLR_=$+1
  2305.        LD BC,0
  2306.        LD (HL),0
  2307.        LDIR
  2308.        POP BC
  2309.        pop DE
  2310.        pop HL
  2311.        RET
  2312. ALLDN
  2313.        LD (pCLR_),DE
  2314.        endif
  2315.        
  2316.       LD HL,(MEMDN)
  2317.       EX DE,HL
  2318.        ADD HL,DE
  2319.        LD (MEMDN),HL
  2320.       EX DE,HL
  2321.        RET  
  2322.  
  2323. ;once
  2324. jpgreadsizes
  2325.        CALL RDWORDHSBLSBtohl
  2326.       PUSH HL ;pFSML
  2327.        CALL RDBYTE
  2328.        CP 8
  2329.        CALL NZ,ERROR
  2330.        LD (VARS+#48),A
  2331.        CALL RDWORDHSBLSBtohl
  2332.        call setpichgt
  2333.        CALL RDWORDHSBLSBtohl
  2334.        call setpicwid
  2335.  
  2336.        call reservefirstframeaddr
  2337.        call initframe ;один раз на картинку после setpicwid, setpichgt ;заказывает память под конверченный кадр
  2338.  
  2339.        CALL RDBYTE
  2340.        LD (CNUM),A
  2341.        LD B,A
  2342.        ADD A,A
  2343.        ADD A,B
  2344.        ADD A,8
  2345.       POP HL
  2346.        CP L
  2347.        CALL NZ,ERROR
  2348.        LD HL,(CNUM) ;16bit!!!
  2349.        ADD HL,HL
  2350.        LD E,L
  2351.        ld D,H
  2352.        ADD HL,HL
  2353.        ADD HL,HL
  2354.        ADD HL,HL
  2355.        ADD HL,DE
  2356.        EX DE,HL
  2357.        CALL ALLDNP ;hl=указатель на выделенную память
  2358.        LD (VARS+#56),HL
  2359.       PUSH HL
  2360.       POP IX
  2361.       LD D,0
  2362.        LD A,(CNUM)
  2363.        LD B,A
  2364. sFLP    LD (IX+1),D
  2365.        CALL RDBYTE
  2366.        LD (IX),A
  2367.        CALL RDBYTE
  2368.       LD C,A
  2369.       RRCA
  2370.       RRCA
  2371.       RRCA
  2372.       RRCA
  2373.       AND #0F
  2374.       LD (IX+2),A
  2375.       LD A,C
  2376.       AND #0F
  2377.       LD (IX+3),A
  2378.        CALL RDBYTE
  2379.        LD (IX+4),A
  2380.        INC D
  2381.       PUSH BC
  2382.       LD BC,18
  2383.       ADD IX,BC
  2384.       POP BC
  2385.        DJNZ sFLP
  2386.        RET
  2387. ;once
  2388. LBMARK
  2389.        CALL PRCMARK1
  2390.       SUB #D9
  2391.       ;OR A
  2392.       RET Z
  2393.       DEC A
  2394.        CALL NZ,ERROR
  2395.        CALL STSCAN
  2396.        SCF
  2397.        RET
  2398.  
  2399. ;once
  2400. STSCAN
  2401.        LD IX,VARS+#E2
  2402.        CALL RDWORDHSBLSBtohl
  2403.        CALL RDBYTE
  2404.        LD (VARS+#E0),A
  2405.        LD B,A
  2406.       ADD A,A
  2407.       ADD A,3
  2408.       LD E,A
  2409.       XOR A
  2410.       LD D,A
  2411.       SBC HL,DE
  2412.       PUSH HL; pSKPSCN
  2413. sCCLP   PUSH BC
  2414.        LD HL,(VAR+#56)
  2415.        LD A,(CNUM)
  2416.        LD B,A
  2417.        CALL RDBYTE
  2418.        LD DE,18
  2419. sCCLP1  CP (HL)
  2420.        JR Z,sCCF1
  2421.        DEC B
  2422.        CALL Z,ERROR
  2423.        ADD HL,DE
  2424.        JR sCCLP1
  2425. sCCF1  LD (IX),L
  2426.       LD (IX+1),H
  2427.       LD E,5
  2428.        ADD HL,DE
  2429.        CALL RDBYTE
  2430.       LD B,A
  2431.       RRCA
  2432.       RRCA
  2433.       RRCA
  2434.       RRCA
  2435.       AND #0F
  2436.       LD (HL),A
  2437.       LD A,B
  2438.       INC HL
  2439.       AND #0F
  2440.       LD (HL),A
  2441.        INC IX
  2442.        inc IX
  2443.        POP BC
  2444.        DJNZ sCCLP
  2445.       POP BC
  2446. rdmany LD A,B
  2447.       OR C
  2448.       RET Z
  2449.       DEC BC
  2450.       rdbyte
  2451.       JR rdmany ;APPSL
  2452.      
  2453. ;once
  2454. P_HTAB
  2455.        CALL RDWORDHSBLSBtohl
  2456.        DEC HL
  2457.        dec HL
  2458. rDHNT  PUSH HL ;pHML
  2459.        LD DE,#4A2 ;под дерево?
  2460.        CALL ALLDNP ;hl=указатель на выделенную память
  2461.        rdbyte
  2462.        LD IX,VARS+#6A
  2463.       CP #10
  2464.       JR C,$+6
  2465.        LD IX,VARS+#7A
  2466.       AND #0F
  2467.       ADD A,A
  2468.       LD E,A
  2469.       LD D,0
  2470.       ADD IX,DE
  2471.       LD (IX),L
  2472.       LD (IX+1),H
  2473.       PUSH HL
  2474.       POP IX
  2475.       LD H,D
  2476.       ld L,D
  2477.        LD B,#10
  2478. rDHHD   rdbyte
  2479.        LD (IX),A
  2480.        INC IX
  2481.       LD E,A
  2482.       ADD HL,DE
  2483.        DJNZ rDHHD
  2484.       LD A,H
  2485.       OR A
  2486.        CALL NZ,ERROR
  2487.       LD B,L
  2488. rDHTB   rdbyte
  2489.        LD (IX),A
  2490.        INC IX
  2491.       DJNZ rDHTB
  2492.       LD DE,17
  2493.       ADD HL,DE
  2494.       EX DE,HL
  2495.       POP HL
  2496.       ;OR A
  2497.       SBC HL,DE
  2498.        RET Z
  2499.        CALL M,ERROR
  2500.        JR rDHNT
  2501.  
  2502. ;5 times
  2503. ;/8 CALLS
  2504. DIVHL_DE
  2505.        LD BC,-1
  2506.        OR A
  2507. dIV11   SBC HL,DE
  2508.        INC BC
  2509.        JR NC,dIV11
  2510.        RET
  2511. ;once
  2512. ;/7 CALLS
  2513. QUAHL_DE
  2514. ;de = hl mod de
  2515.        OR A
  2516.        SBC HL,DE
  2517.        JR NC,$-2
  2518.        ADD HL,DE
  2519.        EX DE,HL
  2520.        RET
  2521.        
  2522. GETIXHL
  2523.       LD A,(HL)
  2524.       LD LX,A
  2525.       INC HL
  2526.       LD A,(HL)
  2527.       LD HX,A
  2528.        RET
  2529.  
  2530. ;twice
  2531. ;/12 CALLS
  2532. DIV8
  2533.        LD C,-1
  2534.       INC C
  2535.       SUB B
  2536.       JR NC,$-2
  2537.        LD A,C
  2538. EMPTY
  2539.        RET  
  2540.        
  2541. SETPG
  2542. ;e=0/1 задают вручную, 1/2/5 по таблице (цветовые составляющие)
  2543. ;сохраняет af,bc,de,hl
  2544.        push af
  2545.        push bc
  2546.        push hl
  2547.        ld a,e
  2548.  
  2549.        ;cp 0
  2550.        ;jr z,setpgok
  2551.        ;cp 1
  2552.        ;jr z,setpgok
  2553.        ;cp 2
  2554.        ;jr z,setpgok
  2555.        ;cp 5
  2556.        ;jr z,setpgok
  2557.        ;jr $
  2558. ;setpgok
  2559.        
  2560.        ld hl,tpgs
  2561.        add a,l
  2562.        ld l,a
  2563.        adc a,h
  2564.        sub l
  2565.        ld h,a
  2566.        ld a,(hl)
  2567.        SETPG32KHIGH
  2568.        
  2569.        pop hl
  2570.        pop bc
  2571.        pop af
  2572.        ret
  2573.        
  2574. tpgs
  2575.        ds 6
  2576.        
  2577.        
  2578. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2579. ;once
  2580. YCCTAB
  2581.        ;LD A,0xce;100;(SATURP)
  2582.        ;ADD A,100
  2583.        ;LD DE,327
  2584.        ;CALL MULDE_A
  2585. ;HL=0..FFFF
  2586.      LD HL,#3fde;#8000
  2587.        LD (YCCHL),HL
  2588. ;CR tab (add to Y->R)
  2589.       LD IX,G716C+128
  2590.       LD HL,-#B3
  2591.       LD DE,1
  2592.        EXX
  2593.        LD DE,#66EA
  2594.       CALL XtBLP
  2595. ;CB tab (add to Y->G)
  2596.       LD IX,G7170+128
  2597.       LD HL,-#E2
  2598.      LD DE,1
  2599.        EXX
  2600.        LD DE,#C5A2
  2601.       CALL XtBLP
  2602. ;CR tab (add to Y->G)
  2603.       LD IX,G7174+128
  2604.       LD HL,#5B
  2605.       LD DE,-1
  2606.        EXX
  2607.        LD DE,0xffff&(-#B6D2)
  2608.       CALL XtBLP
  2609. ;CB tab (add to Y->B)
  2610.       LD IX,G7178+128
  2611.       LD HL,#2C
  2612.      LD DE,-1
  2613.        EXX
  2614.        LD DE,-#581A
  2615. XtBLP
  2616. ;HL'<HL>=a[0]
  2617. ;DE'DE=da=(a[255]-a[0])/255
  2618. ;*(SATURP+100)
  2619.        EXX
  2620.        LD A,E
  2621.        EXX
  2622.         LD E,D
  2623.         ld D,A
  2624. YCCHL=$+1
  2625.         LD BC,0
  2626.        PUSH HL
  2627.         CALL MUL16LONG ;DE*BC
  2628.       ADD HL,HL
  2629.        EX (SP),HL
  2630.         PUSH BC
  2631.         EXX
  2632.         POP BC
  2633.         EX DE,HL
  2634.         CALL MUL16LONG ;DE*BC
  2635.       ADD HL,HL
  2636.         EXX
  2637.        POP BC
  2638.         LD A,B
  2639.         ld D,C
  2640.        EXX
  2641.        LD E,A
  2642.         RLA
  2643.         SBC A,A
  2644.         LD D,A
  2645.        EXX
  2646. XtBLp
  2647.         EXX
  2648.         LD B,0
  2649. tBLP4  LD (IX-128),L
  2650.        INC IX
  2651.        LD (IX+127),H
  2652.         EXX
  2653.         ADD HL,DE
  2654.         EXX
  2655.         ADC HL,DE
  2656.         DJNZ tBLP4
  2657.         RET  
  2658.  
  2659. MUL16LONG
  2660. ;BC>0
  2661.         BIT 7,D
  2662.         JP Z,MUL1616
  2663.         XOR A
  2664.         SUB E
  2665.         LD E,A
  2666.         SBC A,A
  2667.         SUB D
  2668.         LD D,A
  2669.         CALL MUL1616
  2670.         XOR A
  2671.         SUB L
  2672.         LD L,A
  2673.         SBC A,A
  2674.         SUB H
  2675.         LD H,A
  2676.         RET
  2677.        
  2678. MUL1616
  2679.         LD HL,0
  2680. ;DE>0
  2681. ;FFFF=*2
  2682.         LD A,C
  2683.        DUP 8
  2684.         RRA
  2685.         JR NC,$+3
  2686.         ADD HL,DE
  2687.         RR H
  2688.         rr L
  2689.        EDUP
  2690.         LD A,B
  2691.        DUP 7
  2692.         RRA
  2693.         JR NC,$+3
  2694.         ADD HL,DE
  2695.         RR H
  2696.         rr L
  2697.        EDUP
  2698.         RRA
  2699.         RET NC
  2700.         ADD HL,DE
  2701.         RET
  2702.  
  2703. ;3 times
  2704. ;/7 CALLS
  2705. MULDE_A
  2706.         LD HL,0
  2707. mUL11   ADD HL,DE
  2708.         DEC A
  2709.         JR NZ,mUL11
  2710.         RET  
  2711.  
  2712. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2713.  
  2714. MEMDN   DW FREE ;указатель на динамическую память
  2715.         ;display "MEMDN=",MEMDN
  2716.  
  2717. JF44    
  2718.         JP 0
  2719. ;JF48    
  2720.         JP 0
  2721. ;JF4C    
  2722.         JP 0
  2723. ;JF50    
  2724.         JP 0
  2725.  
  2726. CNUM    DW 0 ;число слоёв? HSB=0!!!
  2727.  
  2728. picwid_inblocks   DW 0 ;ширина картинки в полноценных блоках
  2729. pichgt_inblocks   DW 0 ;высота картинки в полноценных блоках
  2730. MAXV    DB 0
  2731. MAXH    DB 0
  2732. BLSZ    DW 0
  2733. MAXH8   DW 0 ;ширина полноценного блока картинки ;по идее 8 или 16
  2734. MAXV8   DW 0 ;высота полноценного блока картинки ;по идее 8 или 16
  2735. LPNT    DW 0 ;указатель на графику полноценного блока (растёт от JPGPAGESTART(0xc000) в строке блоков LSZX*MAXV8, по окончании строки блоков опять начинается с JPGPAGESTART)
  2736. LSZX    DW 0 ;ширина картинки с округлением вверх до полноценного блока
  2737.  
  2738.         align 256
  2739. R4A0F
  2740.         DS 16,2
  2741.         DS 16,4
  2742.         DS 16,6
  2743.         DS 16,8
  2744.         DS 16,10
  2745.         DS 16,12
  2746.         DS 16,14
  2747.         DS 16,16
  2748.         DS 16,18
  2749.         DS 16,20
  2750.         DS 16,22
  2751.         DS 16,24
  2752.         DS 16,26
  2753.         DS 16,28
  2754.         DS 16,30
  2755.         DS 16,32
  2756.        DW 2
  2757.        
  2758. Qorder
  2759.         DW 2*#00,2*#01,2*#08,2*#10,2*#09,2*#02,2*#03,2*#0A
  2760.         DW 2*#11,2*#18,2*#20,2*#19,2*#12,2*#0B,2*#04,2*#05
  2761.         DW 2*#0C,2*#13,2*#1A,2*#21,2*#28,2*#30,2*#29,2*#22
  2762.         DW 2*#1B,2*#14,2*#0D,2*#06,2*#07,2*#0E,2*#15,2*#1C
  2763.         DW 2*#23,2*#2A,2*#31,2*#38,2*#39,2*#32,2*#2B,2*#24
  2764.         DW 2*#1D,2*#16,2*#0F,2*#17,2*#1E,2*#25,2*#2C,2*#33
  2765.         DW 2*#3A,2*#3B,2*#34,2*#2D,2*#26,2*#1F,2*#27,2*#2E
  2766.         DW 2*#35,2*#3C,2*#3D,2*#36,2*#2F,2*#37,2*#3E,2*#3F
  2767.  
  2768.  
  2769.