?login_element?

Subversion Repositories NedoOS

Rev

Rev 1474 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. STACK=0x4000
  5.  
  6. FILE888TO=0x4000 ;,0x4800
  7. FILE888FROM=0xb800
  8. T888FOUND=0x8800 ;temp
  9.  
  10. deblcscradr=0xc000
  11.  
  12. grfadr=#4000
  13. grfatr=grfadr+#84
  14.        
  15.         org PROGSTART
  16. cmd_begin
  17.  
  18.         ld sp,STACK
  19.        
  20.         ld e,3 ;6912
  21.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  22.        
  23.         OS_GETMAINPAGES
  24. ;dehl=номера страниц в 0000,4000,8000,c000
  25.         ld a,e
  26.         ld (codepg4000),a
  27.         ld a,h
  28.         ld (temppg8000),a
  29.         ld a,l
  30.         ld (highpgc000),a
  31.  
  32.         ;OS_GETSCREENPAGES
  33. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  34.         ;ld a,e
  35.         ;ld (setpgs_scr_low),a
  36.         ;;ld (setpgs_scr_attr),a
  37.         ;ld a,d
  38.         ;ld (setpgs_scr_high),a
  39.         ;;ld (setpgs_scr_pixels),a
  40.         ;ld a,l
  41.         ;ld (setpgs_scr2_low),a
  42.         ;ld a,h
  43.         ;ld (setpgs_scr2_high),a
  44.        
  45.        
  46.         ld hl,COMMANDLINE
  47.         call skipword
  48.         call skipspaces
  49.         ld a,(hl)
  50.         or a
  51.         jr nz,$+5
  52.          ld hl,defaultfilename
  53.         push hl
  54.         call findlastdot ;out: de = after last dot or start
  55.         ex de,hl
  56. ;commandline might contain spaces after extension
  57.         ld de,curext
  58.         ldi
  59.         ld a,(hl)
  60.         sub ' '
  61.         ld (de),a
  62.         jr z,curextq
  63.         ldi
  64.         ld a,(hl)
  65.         sub ' '
  66.         ld (de),a
  67.         jr z,curextq
  68.         ldi
  69. curextq
  70.        
  71.         pop de
  72.        
  73.         ;ld de,filename
  74.         call openstream_file
  75.         or a
  76.         jr nz,openerror
  77.        
  78.         call setpgs_scr
  79.         ld hl,0xc000
  80.         ld bc,0x1800
  81.         call fillzero
  82.         ld bc,0x2ff
  83.         ld (hl),7
  84.         ldir
  85.  
  86.         call runext
  87.         jr nc,wrongfile;quit
  88.        
  89.         ;ld bc,quit
  90.         ;push bc
  91.        
  92.         ld a,(filehandle)
  93.         ld b,a
  94.         OS_GETFILESIZE ;dehl=filesize
  95.         ld a,h
  96.         sub 0x1b
  97.         or l
  98.         or d
  99.         or e
  100.         jp z,loadscr ;TODO ещё 6913
  101.         ld a,h
  102.         sub 0x18
  103.         or l
  104.         or d
  105.         or e
  106.         jp z,loadscr
  107.        if 1==0
  108.         ld a,h
  109.         sub 0x08
  110.         or l
  111.         or d
  112.         or e
  113.         jr z,loadfnt
  114.         ld a,h
  115.         sub 0x03
  116.         or l
  117.         or d
  118.         or e
  119.         jr z,loadfnt
  120.         ld a,h
  121.         sub 0x1b*2
  122.         or l
  123.         or d
  124.         or e
  125.         jp z,loadimg
  126.         ld a,h
  127.         sub 0x18*3
  128.         or l
  129.         or d
  130.         or e
  131.         jr z,load3
  132.        endif
  133.  
  134.  
  135. ;wrong file
  136.         call closestream_file
  137.        
  138. wrongfile
  139. openerror
  140.         ld hl,-1
  141.         ;jr quit
  142. ;quit
  143.         QUIT
  144.  
  145. ;readerror
  146. ;;TODO restore stack
  147. ;        call closestream_file
  148. ;        jr error
  149.        
  150. zxsattr
  151.        
  152. loadzxs
  153.         call setpgs_scr
  154.         ld de,0x6000           
  155.         call readstream_file
  156.         call closestream_file
  157. ; Атрибуты
  158.         ld de,0x6000 + 1676
  159.         ld hl,0xd800
  160.         ld bc,32
  161. zxs_attr_0
  162.         ld a,(de)
  163.         ld (hl),a
  164.         inc de
  165.         ld bc,32
  166.         add hl,bc
  167.         ld a,h
  168.         cp 0xdb
  169.         jr nz,zxs_attr_0
  170.         ld h,0xd8
  171.         inc l
  172.         ld a,l
  173.         cp c
  174.         jr nz,zxs_attr_0
  175.        
  176. ; Символы
  177.         ld ix,0x6000 + 908
  178.         ld de,0xc000
  179.        
  180. zxs_sym_0
  181.         ld a,(ix+0)
  182.         ld l,a
  183.         ld h,0
  184.         add hl,hl
  185.         add hl,hl
  186.         add hl,hl
  187.         ld bc,0x6000 + 12
  188.         add hl,bc
  189.                 dup 8
  190.                 ld a,(hl)
  191.                 ld (de),a
  192.                 inc d
  193.                 inc hl
  194.                 edup
  195.         inc ix
  196.         call d_de
  197.         ld a,d
  198.         cp 0xd8
  199.         jr nz,zxs_sym_0
  200.         inc e
  201.         ld a,d
  202.         sub 0x18
  203.         ld d,a
  204.         ld a,e
  205.         cp 32
  206.         jr nz,zxs_sym_0
  207. ; Бордер
  208.         display $
  209.         ld e,0
  210.         ld hl,0x6000 + 2444
  211.         ld a,(hl)
  212.         inc hl
  213.         or a
  214.         jr z,zxs_no_r
  215.         inc e
  216.         inc e
  217. zxs_no_r
  218.         ld a,(hl)
  219.         inc hl
  220.         or a
  221.         jr z,zxs_no_g
  222.         inc e
  223.         inc e
  224.         inc e
  225.         inc e
  226. zxs_no_g
  227.         ld a,(hl)
  228.         inc hl
  229.         or a
  230.         jr z,zxs_no_b
  231.         inc e
  232. zxs_no_b
  233.         OS_SETBORDER
  234.         jr waitkeyquit
  235. d_de
  236.         ld a,e
  237.         add a,32
  238.         ld e,a
  239.         ret c
  240.         ld a,d
  241.         sub 8
  242.         ld d,a
  243.         ret
  244.        
  245. loadatr
  246. load53c
  247.         ld hl,0xd800
  248.         ld de,0xd801
  249.         ld bc,0x2ff
  250.         ld (hl),l
  251.         ldir
  252.         ld hl,0xc000
  253.         ld a,0x55
  254.         ld b,24
  255. load53c0
  256.         ld (hl),a
  257.         inc l
  258.         jr nz,$-2
  259.         cpl
  260.         inc h
  261.         djnz load53c0
  262.         ex de,hl ;ld de,0xd800
  263.         ld hl,0x300
  264.         call readstream_file
  265.         call closestream_file
  266.         jr waitkeyquit
  267. loadscr
  268. ;hl=size
  269. ;TODO кнопку A выключения/переключения атрибутов
  270.         ld de,0xc000
  271.         call readstream_file
  272.         call closestream_file
  273. waitkeyquit
  274. control0
  275.         call yieldgetkeynolang
  276.         jr z,control0
  277. waitkeyq        
  278.         ld hl,0
  279. ;проверяем стрелки
  280.         cp key_left
  281.         jr z,quitwithkey
  282.         cp key_right
  283.         jr z,quitwithkey
  284.         cp key_up
  285.         jr z,quitwithkey
  286.         cp key_down
  287.         jr z,quitwithkey
  288.         QUIT
  289. quitwithkey
  290. ;возвращаем код клавиши (для nv)
  291.         ld l,a
  292.         QUIT
  293.  
  294. loadplc
  295. ;hl=size
  296.         ld de,0x6000
  297.         push de
  298.         call readstream_file
  299.         call closestream_file
  300.         pop hl
  301.         call deblc
  302.         jr waitkeyquit
  303.        
  304. loadfnt
  305. ;hl=size
  306.         ld de,0xc000
  307.         push de
  308.         call readstream_file
  309.         call closestream_file
  310.         pop hl
  311. ;на случай линейного шрифта - рисуем его снизу
  312.         ld e,0
  313. loadfnt0
  314.         ld d,0xd0
  315.         ld b,8
  316. loadfnt1
  317.         ld a,(hl)
  318.         inc hl
  319.         ld (de),a
  320.         inc d
  321.         djnz loadfnt1
  322.         inc e
  323.         jr nz,loadfnt0
  324.         jr waitkeyquit
  325.        
  326. loadmlt
  327.         call read4000
  328.         call closestream_file
  329.         call cleanafter8000
  330.         ld e,2
  331.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  332.         ld hl,0x4000
  333.         ld de,0xc000+4 ;pixels
  334.         call convmgpixelscr_hlde
  335.         ;ld hl,convmcattrline
  336.         ;ld (convmgpixelscr_linepatch),hl
  337.         ld hl,0x5800
  338.         ld de,0x8000+4 ;attrs
  339.         ld bc,0xc001 ;b=hgt in chrs ;c=hgt of chr
  340.         call convmgattrs
  341.         ;ld lx,40
  342.         ;call convmgattrlines
  343.         ;call convmgpixelscr_hlde
  344.         ;ld hl,convmcline
  345.         ;ld (convmgpixelscr_linepatch),hl
  346.         jp waitkeyquit
  347.  
  348. loadmc
  349.         call read4000
  350.         call closestream_file
  351.         call cleanafter8000
  352.         ld e,2
  353.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  354.         call convmcscr
  355.         jp waitkeyquit
  356.  
  357. convmcscr
  358.         ld hl,0x4000
  359.         ld de,0xc000+4 ;pixels
  360.         ld b,192
  361. loadmclines0
  362.         push bc
  363.         call convmcline
  364.         ex de,hl
  365.         ld c,40
  366.         add hl,bc
  367.         ex de,hl
  368.         pop bc
  369.         djnz loadmclines0
  370.         ;ld bc,0xc001
  371.         ;jr convmgattrs
  372. ;convmcattrs
  373.         ld de,0x8000+4 ;attrs
  374.         ld bc,0xc020
  375. convmcattrlines
  376. convmcattrlines0
  377.         push bc
  378.         ld b,0
  379.         call convmcattrline
  380.         ex de,hl
  381.         ld c,40
  382.         add hl,bc
  383.         ex de,hl
  384.         pop bc
  385.         djnz convmcattrlines0
  386.         ret
  387.        
  388. readconvmg1attrs
  389.         ld hl,0x0c00
  390.         call read4000
  391.         ld de,0x8000+4+8 ;attrs
  392.         ld bc,0xc010
  393.         jr convmcattrlines
  394.  
  395. readconvmg1attrs8
  396.         ld hl,0x0c00
  397.         call read4000
  398.         ld de,0x8000+4 ;attrs
  399.         ld b,24
  400. convmg1attr8lines0
  401.         push bc
  402.         ld b,8
  403. convmg1attr8lines1
  404.         push hl
  405.         push bc
  406.         ld bc,8
  407.         call convmcattrline
  408.         ex de,hl
  409.         ld c,24
  410.         add hl,bc
  411.         ex de,hl
  412.         ld c,8
  413.         call convmcattrline
  414.         ex de,hl
  415.         ld c,40-24
  416.         add hl,bc
  417.         ex de,hl
  418.         pop bc
  419.         pop hl
  420.         djnz convmg1attr8lines1
  421.         ld c,16
  422.         add hl,bc
  423.         pop bc
  424.         djnz convmg1attr8lines0
  425.         ret
  426.        
  427. readconvmgattrs
  428.         push bc
  429.         call read4000
  430.         pop bc
  431. convmgattrs
  432. ;hl=from
  433. ;de=attrs addr
  434. ;b=hgt in chrs
  435. ;c=hgt of chr
  436.         ld de,0x8000+4 ;attrs
  437.         ld lx,40
  438. convmgattrlines
  439. ;hl=from
  440. ;de=attrs addr
  441. ;b=hgt in chrs
  442. ;c=hgt of chr
  443. ;lx=40/80 step
  444. convmg2attrlines0
  445.         push bc
  446.         ld b,c;2
  447. convmg2attrlines1
  448.         push hl
  449.         push bc
  450.         ld bc,32
  451.         call convmcattrline
  452.         ex de,hl
  453.         ld c,lx;40
  454.         add hl,bc
  455.         ex de,hl
  456.         pop bc
  457.         pop hl
  458.         djnz convmg2attrlines1
  459.         ld c,32
  460.         add hl,bc
  461.         pop bc
  462.         djnz convmg2attrlines0
  463.         ret
  464.        
  465. convmcattrline
  466.         push de
  467. convmcattrline0
  468.         ld a,(hl)
  469.         ld (de),a
  470.         set 5,d
  471.         ldi
  472.         res 5,d
  473.         jp pe,convmcattrline0
  474.         pop de
  475.         ret
  476.  
  477. convmcline
  478.         push de
  479.         ld b,32
  480. convmcline0
  481.         dup 4
  482.         rl (hl)
  483.         rla
  484.         add a,a
  485.         edup
  486.         ld c,a
  487.         rrca
  488.         or c
  489.         ld (de),a
  490.         set 5,d
  491.         dup 4
  492.         rl (hl)
  493.         rla
  494.         add a,a
  495.         edup
  496.         ld c,a
  497.         rrca
  498.         or c
  499.         ld (de),a
  500.         res 5,d
  501.         inc de
  502.         inc hl
  503.         djnz convmcline0
  504.         pop de
  505.         ret
  506.  
  507. readconvmgpixelscr
  508.         call cleanafter8000
  509.         call read40001800
  510.         ;ld hl,0x4000
  511.         ld de,0xc000+4 ;pixels
  512. convmgpixelscr_hlde
  513.         ld b,192
  514. convmglines0
  515.         push bc
  516.         push hl
  517.          ;ld bc,32 ;for convmcattrline
  518. ;convmgpixelscr_linepatch=$+1
  519.         call convmcline ;/convmcattrline
  520.         pop hl
  521.         call downhl
  522.         ex de,hl
  523.         ld c,40
  524.         add hl,bc
  525.         ex de,hl
  526.         pop bc
  527.         djnz convmglines0
  528.         ret
  529.        
  530. loadmcx
  531.         call cleanafter8000
  532.         ld e,2
  533.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  534.         ld hl,0x1800*2
  535.         call read4000
  536.         call convmcscr
  537.         call setpgs_scr2
  538.         call cleanafter8000
  539.         ld hl,0x1800*2
  540.         call read4000
  541.         call convmcscr
  542. loadmcxq
  543.         call closestream_file
  544.         jp waitkeyblink
  545.  
  546. loadmg2
  547.         ld bc,0x6002
  548.         ld hl,0x0c00
  549.         jr loadmg_go
  550. loadmg4
  551.         ld bc,0x3004
  552.         ld hl,0x0600
  553.         jr loadmg_go
  554. loadmg8
  555.         ld bc,0x1808
  556.         ld hl,0x0300
  557. loadmg_go
  558.         push bc
  559.         push hl
  560.         call cleanafter8000
  561.         ld e,2
  562.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  563.         ld hl,0x100 ;header
  564.         call read4000
  565.         call readconvmgpixelscr
  566.         call setpgs_scr2
  567.         call readconvmgpixelscr
  568.         call setpgs_scr
  569.         pop hl
  570.         pop bc
  571.         push bc
  572.         push hl
  573.         call readconvmgattrs
  574.         call setpgs_scr2
  575.         pop hl
  576.         pop bc
  577.         call readconvmgattrs
  578.         jr loadmcxq
  579.  
  580. loadmg1
  581.         call cleanafter8000
  582.         ld e,2
  583.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  584.         ld hl,0x100 ;header
  585.         call read4000
  586.         call readconvmgpixelscr
  587.         call setpgs_scr2
  588.         call readconvmgpixelscr
  589.         call setpgs_scr
  590.         call readconvmg1attrs
  591.         call setpgs_scr2
  592.         call readconvmg1attrs
  593.         call setpgs_scr
  594.         call readconvmg1attrs8
  595.         call setpgs_scr2
  596.         call readconvmg1attrs8
  597.         jr loadmcxq
  598.  
  599. read40001800
  600.         ld hl,0x1800
  601. read4000
  602.         ld de,0x4000
  603.         push de
  604.         call readstream_file
  605.         pop hl
  606.         ret
  607.        
  608.  
  609. loadgrf
  610. ;hl=size
  611.         push hl
  612.         call cleanafter8000
  613.         ld e,2
  614.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  615.         pop hl
  616.         call setpgtemp8000
  617.         ld de,grfadr
  618.         push de
  619.         call readstream_file
  620.         call closestream_file
  621.         pop hl;LD HL,grfadr
  622.         LD DE,TPAL
  623.         push de
  624.         CALL GRFPAL
  625.         pop de;LD de,TPAL
  626.         OS_SETPAL
  627.         CALL GRF2ATM
  628.         jp waitkeyquit
  629. TPAL
  630.         ds 32
  631.  
  632. cleanafter8000
  633.         ld hl,0x8000
  634.         ld bc,0xffff-0x8000
  635.         jp fillzero
  636.  
  637. loadrmode
  638. ;scr1 (6144 спрайтом) (первый фрейм)
  639. ;scr2 (6144 спрайтом) (второй фрейм)
  640. ;attr1 (768) ;G/M/C - низ(нечет) первого фрейма
  641. ;attr2 (768) ;R/C/M - низ(нечет) второго фрейма
  642. ;attr3 (768) ;B/Y - верх(чёт) второго фрейма - переставим на 1-й из-за интерлейса
  643. ;attr4 (768) ;W - верх(чёт) первого фрейма - переставим на 2-й из-за интерлейса
  644.         call cleanafter8000
  645.         ld e,2
  646.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  647.         call read40001800
  648.         call convmcscr
  649.         call setpgs_scr2
  650.         call cleanafter8000
  651.         call read40001800
  652.         call convmcscr
  653. ;attr1 (768) ;G/M/C - низ(нечет) первого фрейма
  654.         call setpgs_scr
  655.         ld de,0x8000+4+40 ;attrs
  656.         call readrmodeattrs
  657. ;attr2 (768) ;R/C/M - низ(нечет) второго фрейма
  658.         call setpgs_scr2
  659.         ld de,0x8000+4+40 ;attrs
  660.         call readrmodeattrs
  661. ;attr3 (768) ;B/Y - верх(чёт) второго фрейма - переставим на 1-й из-за интерлейса
  662.         call setpgs_scr
  663.         call readrmodeattrs_top
  664. ;attr4 (768) ;W - верх(чёт) первого фрейма - переставим на 2-й из-за интерлейса
  665.         call setpgs_scr2
  666.         call readrmodeattrs_top
  667.         jp loadmcxq
  668.  
  669. readrmodeattrs_top
  670.         ld de,0x8000+4 ;attrs
  671. readrmodeattrs
  672. ;de=attrs
  673.         push de
  674.         ld hl,0x300
  675.         call read4000
  676.         pop de
  677.         ld bc,0x1804
  678.         ld lx,80
  679.         jp convmgattrlines
  680.        
  681.         if 1==0
  682. ;TODO
  683.         call setEGA ;keeps hl
  684.         ld de,0x4000
  685.         call readstream_file
  686.         call closestream_file
  687. ;0. найти все цвета attr1,attr2,attr3,attr4
  688. ;1. сгенерировать палитру (все комбинации attr4+attr3 2*3 шт, все комбинации attr1+attr2 4*4 шт) со ссылками на спецпалитру
  689. ;2. включить спецпалитру
  690. ;3. сконвертировать пиксели с учётом атрибутов
  691.  
  692.         LD de,TRMODEPAL
  693.         OS_SETPAL
  694.        
  695.         jp waitkeyquit
  696.        
  697. TRMODEPAL
  698. ;0, r, c, m, g, y, gc, w, mr, mc, [M], [C], bw, yw, [rw], [cw]
  699. ;используем уровни 8 (2 на ATM), 15 (3 на ATM)
  700. _0=5*0
  701. _1=5*1;8
  702. _2=5*2;15
  703. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  704. ;high B, high b, low B, low b
  705.         macro palcol r,g,b ;0..15
  706.         db 0xff - (((g&1)<<7) + ((r&1)<<6) + ((b&1)<<5) + ((g&2)<<3) + (r&2) + ((b&2)>>1))
  707.         db 0xff - (((g&4)<<5) + ((r&4)<<4) + ((b&4)<<3) + ((g&8)<<1) + ((r&8)>>2) + ((b&8)>>3))
  708.         endm
  709.         palcol _0,_0,_0 ;0
  710.         palcol _1,_0,_0 ;r
  711.         palcol _0,_1,_1 ;c
  712.         palcol _1,_0,_1 ;m
  713.         palcol _0,_1,_0 ;g
  714.         palcol _1,_1,_0 ;y
  715.         palcol _0,_2,_1 ;gc
  716.         palcol _1,_1,_1 ;w
  717.         palcol _2,_0,_1 ;mr
  718.         palcol _1,_1,_2 ;mc
  719.         palcol _2,_0,_2 ;[M]
  720.         palcol _0,_2,_2 ;[C]
  721.         palcol _1,_1,_2 ;bw
  722.         palcol _2,_2,_1 ;yw
  723.         palcol _2,_1,_1 ;[rw]
  724.         palcol _1,_2,_2 ;[cw]
  725.         endif
  726.        
  727. load16c
  728.         ;jr $
  729.         call setEGA ;keeps hl
  730.         ld hl,0x8000
  731.         ld de,0x8000
  732.         call readstream_file
  733.         ld de,TPAL;curpal
  734.         ld hl,32
  735.         call readstream_file
  736.         call closestream_file
  737.         ld de,TPAL;curpal
  738.         OS_SETPAL
  739.         jp waitkeyquit
  740.  
  741.        
  742. load3
  743. ;B,R,G
  744. ;hl=size
  745.         call setEGA ;keeps hl
  746.  
  747. ;0.чёрная палитра (уже)
  748. ;1.загрузим в 0x4000
  749. ;2.перекодируем в 0x8800
  750. ;3.копируем в 0x8000
  751. ;4.нормальная палитра
  752.         ld de,0x4000
  753.         call readstream_file
  754.         call closestream_file
  755. conv3
  756.         call cleanafter8800
  757.         ld hl,0x4000
  758.         ld de,0x8800 +4
  759.         ld b,192
  760. load3lines
  761.         push bc
  762.         call load3line ;out: de=next line
  763.         call downhl
  764.         pop bc
  765.         djnz load3lines
  766. conv3q
  767.         ld hl,0x8800
  768.         ld de,0x8000
  769.         call load3copylayer
  770.         ld de,0xa000
  771.         call load3copylayer
  772.         ld de,0xc000
  773.         call load3copylayer
  774.         ld de,0xe000
  775.         call load3copylayer
  776.         ld de,palstandard
  777.         OS_SETPAL
  778.         jp waitkeyquit
  779.  
  780. loady
  781. ;packed R,G,B (run from 0xb800, depack to 0xb800, depacker at 0x5b00)
  782.         call setEGA ;keeps hl
  783.         ld de,0xb800
  784.         call readstream_file
  785.         call closestream_file
  786.         ld a,(0xb800)
  787.         cp 0xf3
  788.         ret nz
  789.         call 0xb800
  790.         ld hl,0xb800
  791.         ld de,0x4000+0x1800
  792.         ld bc,0x1800*2
  793.         ldir
  794.         ld de,0x4000
  795.         ld bc,0x1800
  796.         ldir
  797.         ;ld b,192
  798.         jr conv3;loadplusq
  799.  
  800. loadplus
  801. ;MultiStudio
  802. ;B,R,G sprites (hgt=128)
  803. ;hl=size
  804.         call setEGA ;keeps hl
  805. ;0.чёрная палитра (уже)
  806. ;1.загрузим в 0x4000
  807. ;2.перекодируем в 0x8800
  808. ;3.копируем в 0x8000
  809. ;4.нормальная палитра
  810.         ld de,0x4000
  811.         ld hl,0x1000
  812.         call readstream_file
  813.         ld de,0x4000+0x1800
  814.         ld hl,0x1000
  815.         call readstream_file
  816.         ld de,0x4000+(2*0x1800)
  817.         ld hl,0x1000
  818.         call readstream_file
  819.         call closestream_file
  820.         call cleanafter8800
  821.         ld b,128
  822. loadplusq
  823.         ld hl,0x4000
  824.         ld de,0x8800 +4
  825. loadpluslines
  826.         push bc
  827.         call load3line ;out: de=next line
  828.         ld bc,32
  829.         add hl,bc
  830.         pop bc
  831.         djnz loadpluslines
  832.         jp conv3q
  833.        
  834. loadimg
  835.         ld de,0xc000
  836.         ld hl,0x1b00
  837.         push de
  838.         push hl
  839.         call readstream_file
  840.         call setpgs_scr2
  841.         pop hl
  842.         pop de
  843.         call readstream_file
  844.         call closestream_file
  845. waitkeyblink
  846. controlimg0
  847.         ld a,1
  848.         xor 0
  849.         ld ($-1),a
  850.         ld e,a
  851.         OS_SETSCREEN ;e=screen=0..1
  852.         call yieldgetkeynolang
  853.         jr z,controlimg0
  854.         jp waitkeyq
  855.        
  856. load888
  857.         call setEGA ;keeps hl
  858.         ;jr $
  859.         ld de,FILE888FROM
  860.         call readstream_file
  861.         call closestream_file
  862.         call DEP888
  863.         jp conv3
  864.        
  865. cleanafter8800
  866.         ld hl,0x8800
  867.         ld bc,0xffff-0x8800
  868.         jp fillzero
  869.  
  870. palstandard
  871.         STANDARDPAL
  872. palblack
  873.         ds 32,0xf3
  874.  
  875. load3copylayer
  876.         ld bc,40*192
  877.         ldir
  878.         push hl
  879.         ex de,hl
  880.         ld bc,40*(200-192)-1
  881.         call fillzero
  882.         pop hl
  883.         ret
  884.  
  885. load3line
  886.         ;push de
  887.         call load3subline
  888.         ;set 6,d
  889.         ld bc,40*192*2
  890.         ex de,hl
  891.         add hl,bc
  892.         ex de,hl
  893.         call load3subline
  894.         ;res 6,d
  895.         ;set 5,d
  896.         ld bc,-(40*192)
  897.         ex de,hl
  898.         add hl,bc
  899.         ex de,hl
  900.         call load3subline
  901.         ;set 6,d
  902.         ld bc,40*192*2
  903.         ex de,hl
  904.         add hl,bc
  905.         ex de,hl
  906.         call load3subline
  907.         ld bc,40-(40*192*3)
  908.         ex de,hl
  909.         add hl,bc
  910.         ex de,hl
  911.         ret
  912.  
  913. load3subline
  914.         push de
  915.         push hl
  916.         ld a,h
  917.         ld (load3_h0),a
  918.         ld (load3_h0a),a
  919.         add a,0x18
  920.         ;ld (load3_h1),a
  921.         ;ld (load3_h1a),a
  922.         ld b,a
  923.         add a,0x18
  924.         ;ld (load3_h2),a
  925.         ;ld (load3_h2a),a
  926.         ld c,a
  927. load3subline0
  928. ;load3_h2=$+1
  929.         ld h,c;0
  930.         rl (hl)
  931.         rla
  932. ;load3_h1=$+1
  933.         ld h,b;0
  934.         rl (hl)
  935.         rla
  936. load3_h0=$+1
  937.         ld h,0
  938.         rl (hl)
  939.         rla
  940.         ;a=%GRB
  941.         add a,a
  942.         add a,a
  943.         ;a=%GRB00
  944. ;load3_h2a=$+1
  945.         ld h,c;0
  946.         rl (hl)
  947.         rla
  948. ;load3_h1a=$+1
  949.         ld h,b;0
  950.         rl (hl)
  951.         rla
  952. load3_h0a=$+1
  953.         ld h,0
  954.         rl (hl)
  955.         rla
  956.         ;a=%GRB00grb
  957.         rlca
  958.         rlca
  959.         rlca
  960.         ;a=%00grbGRB
  961.         ld (de),a
  962.         inc de
  963.         inc l
  964.         ld a,l
  965.         and 0x1f
  966.         jr nz,load3subline0
  967.         pop hl
  968.         pop de
  969.         ret
  970.  
  971. downhl
  972.         inc h
  973.         ld a,h
  974.         and 7
  975.         ret nz
  976.         ld a,l
  977.         add a,32
  978.         ld l,a
  979.         ret c
  980.         ld a,h
  981.         sub 8
  982.         ld h,a
  983.         ret
  984.        
  985. setEGA
  986. ;keeps hl
  987.         push hl
  988.         ld de,palblack
  989.         OS_SETPAL
  990.         ld e,0
  991.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  992.         ld hl,0x8000
  993.         ld bc,0x7fff
  994.         call fillzero
  995.         pop hl
  996.         ret
  997.  
  998. fillzero
  999.         ld d,h
  1000.         ld e,l
  1001.         inc de
  1002.         ld (hl),0
  1003.         ldir
  1004.         ret
  1005.  
  1006. yieldgetkeynolang
  1007. ;out: z=nokey
  1008.         YIELDGETKEY
  1009.         ld a,c
  1010.         ret
  1011.  
  1012. setpgcode4000
  1013. codepg4000=$+1
  1014.         ld a,0
  1015.         SETPG16K
  1016.         ret
  1017.  
  1018. setpgtemp8000
  1019. temppg8000=$+1
  1020.         ld a,0
  1021.         SETPG32KLOW
  1022.         ret
  1023.  
  1024. setpghighc000
  1025. highpgc000=$+1
  1026.         ld a,0
  1027.         SETPG32KHIGH
  1028.         ret
  1029.  
  1030. setpgs_scr
  1031.         ld a,(user_scr0_low) ;ok
  1032.         SETPG32KLOW
  1033.         ld a,(user_scr0_high) ;ok
  1034.         SETPG32KHIGH
  1035.         ret
  1036.        
  1037. setpgs_scr2
  1038.         ld a,(user_scr1_low) ;ok
  1039.         SETPG32KLOW
  1040.         ld a,(user_scr1_high) ;ok
  1041.         SETPG32KHIGH
  1042.         ret
  1043.  
  1044. skipword
  1045. ;hl=string
  1046. ;out: hl=terminator/space addr
  1047. getword0
  1048.         ld a,(hl)
  1049.         or a
  1050.         ret z
  1051.         cp ' '
  1052.         ret z
  1053.         inc hl
  1054.         jr getword0
  1055.  
  1056. skipspaces
  1057. ;hl=string
  1058. ;out: hl=after last space
  1059.         ld a,(hl)
  1060.         cp ' '
  1061.         ret nz
  1062.         inc hl
  1063.         jr skipspaces
  1064.  
  1065. ;hl = poi to filename in string
  1066. ;out: de = after last dot or start
  1067. findlastdot
  1068.         ld d,h
  1069.         ld e,l ;de = after last dot
  1070. findlastdot0
  1071.         ld a,[hl]
  1072.         inc hl
  1073.         or a
  1074.         ret z
  1075.         cp '.'
  1076.         jr nz,findlastdot0
  1077.         jr findlastdot
  1078.  
  1079. strcplow
  1080. ;hl=s1 (lowercase)
  1081. ;de=s2 (any case)
  1082. ;out: Z (equal, hl=terminator of s1+1, de=terminator of s2+1), NZ (not equal, hl=erroraddr in s1, de=erroraddr in s2)
  1083. strcplow0.
  1084.         ld a,[de] ;s2
  1085.          or a
  1086.          jr z,$+4
  1087.          or 0x20
  1088.         cp [hl] ;s1
  1089.         ret nz
  1090.         inc hl
  1091.         inc de
  1092.         or a
  1093.         jr nz,strcplow0.
  1094.         ret ;z
  1095.  
  1096. runext
  1097. ;out: CY=error
  1098.         ld hl,extlist ;list of internal commands
  1099. strcpexec0
  1100.         ld c,(hl)
  1101.         inc hl
  1102.         ld b,(hl)
  1103.         inc hl
  1104.         ld a,b
  1105.         cp -1
  1106.         jr z,runext_error ;a!=0: no such ext
  1107.         ld de,curext
  1108.         push hl
  1109.         call strcplow
  1110.         pop hl
  1111.         jr nz,strcpexec_fail
  1112.         ld (runextaddr),bc
  1113.         ld a,(filehandle)
  1114.         ld b,a
  1115.         OS_GETFILESIZE ;dehl=filesize
  1116. runextaddr=$+1
  1117.         call 0
  1118.         or a
  1119.         ret
  1120. strcpexec_fail
  1121.         ld b,-1 ;чтобы точно найти терминатор
  1122.         xor a
  1123.         cpir ;найдём обязательно
  1124.         jr strcpexec0
  1125.  
  1126. runext_error
  1127. ;no such ext
  1128.         scf
  1129.         ret
  1130.        
  1131. extlist
  1132.         dw loadplus
  1133.         db "+",0
  1134.         dw loadplus
  1135.         db "-",0
  1136.         dw load3
  1137.         db "3",0
  1138.         dw load888
  1139.         db "888",0
  1140.         dw loadatr
  1141.         db "atr",0
  1142.         dw loadzxs
  1143.         db "zxs",0
  1144.         dw load53c
  1145.         db "53c",0
  1146.         dw loadfnt
  1147.         db "fnt",0
  1148.         dw loady
  1149.         db "y",0
  1150.         dw loadimg
  1151.         db "img",0
  1152.         dw loadplc
  1153.         db "plc",0
  1154.         dw loadgrf
  1155.         db "grf",0
  1156.         dw loadmc
  1157.         db "mc",0
  1158.         dw loadmcx
  1159.         db "mcx",0
  1160.         dw loadchr
  1161.         db "ch$",0
  1162.         dw loadmg1
  1163.         db "mg1",0
  1164.         dw loadmg2
  1165.         db "mg2",0
  1166.         dw loadmg4
  1167.         db "mg4",0
  1168.         dw loadmg8
  1169.         db "mg8",0
  1170.         dw loadrmode
  1171.         db "rm",0
  1172.         dw load16c
  1173.         db "16c",0
  1174.         dw loadmlt
  1175.         db "mlt",0
  1176.        
  1177.         dw -1 ;end of list
  1178.        
  1179.  
  1180.        
  1181. defaultfilename
  1182.         db "m:/scr/rockwell.888",0
  1183. curext
  1184.         ds 3
  1185.         db 0
  1186.  
  1187. ;oldtimer
  1188. ;        dw 0
  1189.        
  1190.        
  1191.         include "deblc.asm"
  1192.         include "chr.asm"
  1193.         include "888.asm"
  1194.         include "grf.asm"
  1195.         include "../_sdk/file.asm"
  1196.        
  1197. cmd_end
  1198.  
  1199.         display "Size ",/d,cmd_end-cmd_begin," bytes"
  1200.  
  1201.         savebin "view.com",cmd_begin,cmd_end-cmd_begin
  1202.        
  1203.         LABELSLIST "../../us/user.l",1
  1204.