?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. scrbase=0x4000
  5. prarr_scrbase=0x8000
  6. sprmaxwid=32
  7. sprmaxhgt=32
  8. scrwid=160 ;double pixels
  9. scrwidpix=scrwid*2
  10. scrhgt=200
  11.  
  12. STACK=0x3ff0
  13. tempsp=0x3f06 ;6 bytes for prspr
  14. INTSTACK=0x3f00
  15.  
  16. nofocuskey=0xff
  17.  
  18. NPIECES=20*12
  19. PIECESZ=8
  20.  
  21. SAVING=1;0
  22.  
  23.         org PROGSTART
  24. begin
  25.         jp GO ;patched by prspr
  26. GO
  27.         ld sp,STACK
  28.         OS_HIDEFROMPARENT
  29.         ld e,0+0x80 ;EGA
  30.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode) +8=noturbo, +0x80=keep gfx pages
  31.         ld de,emptypal
  32.         OS_SETPAL ;включаем чёрную палитру, чтобы было незаметно переброску экрана
  33.         ld e,0
  34.         OS_CLS ;очистили текущий экран
  35.  
  36.         OS_GETMAINPAGES
  37. ;dehl=pages in 0000,4000,8000,c000
  38.         ld a,e
  39.         ld (pgmain4000),a
  40.         ld a,h
  41.         ld (pgmain8000),a
  42.         ld a,l
  43.         ld (pgmainc000),a
  44.  
  45.         ld a,r
  46.         ld (rndseed1),a
  47.         OS_GETTIMER ;dehl=timer
  48.         ld (rndseed2),hl
  49.          ld (oldupdtimer),hl
  50.  
  51.         ld de,path
  52.         OS_CHDIR
  53.        
  54.          if SAVING
  55.         ld de,filename
  56.         OS_OPENHANDLE
  57.         ;ld a,-1
  58.         or a
  59.         jr nz,noloadini
  60.         push bc
  61.         ld de,SAVEDATA
  62.         ld hl,SAVEDATAsz
  63.         OS_READHANDLE
  64.         pop bc
  65.         OS_CLOSEHANDLE
  66.         jr loadiniq
  67. noloadini
  68.         xor a
  69.         ld (level),a
  70.         call genxy
  71. loadiniq
  72.          else
  73.         call genxy
  74.          endif
  75.  
  76.         OS_NEWPAGE ;заказали новую страницу, чтобы грузить туда данные
  77.         ld a,e
  78.         ld (pggriddata0),a ;запомнили её номер
  79.         OS_NEWPAGE ;заказали другую новую страницу, чтобы грузить туда данные
  80.         ld a,e
  81.         ld (pggriddata1),a ;запомнили её номер
  82.  
  83.         OS_NEWPAGE ;заказали новую страницу, чтобы грузить туда данные
  84.         ld a,e
  85.         ld (pgpicdata0),a ;запомнили её номер
  86.         OS_NEWPAGE ;заказали другую новую страницу, чтобы грузить туда данные
  87.         ld a,e
  88.         ld (pgpicdata1),a ;запомнили её номер
  89.  
  90.         OS_NEWPAGE ;заказали новую страницу, чтобы грузить туда данные
  91.         ld a,e
  92.         ld (pgscrdata0),a ;запомнили её номер
  93.         OS_NEWPAGE ;заказали другую новую страницу, чтобы грузить туда данные
  94.         ld a,e
  95.         ld (pgscrdata1),a ;запомнили её номер
  96.  
  97.         ld a,(pggriddata0)
  98.         ld de,filenamegrid0 ;имя файла
  99.         ld hl,0xc000 ;куда грузим
  100.         call loadfile_in_ahl ;загрузили один экранный файл в одну страницу
  101.         ld a,(pggriddata1)
  102.         ld de,filenamegrid1 ;имя файла
  103.         ld hl,0xc000 ;куда грузим
  104.         call loadfile_in_ahl ;загрузили другой экранный файл в другую страницу
  105.  
  106.         ld a,(pgpicdata0)
  107.         ld de,filenamepic0 ;имя файла
  108.         ld hl,0xc000 ;куда грузим
  109.         call loadfile_in_ahl ;загрузили один экранный файл в одну страницу
  110.         ld a,(pgpicdata1)
  111.         ld de,filenamepic1 ;имя файла
  112.         ld hl,0xc000 ;куда грузим
  113.         call loadfile_in_ahl ;загрузили другой экранный файл в другую страницу
  114.  
  115. ;сейчас у нас включены страницы программы, как было
  116.  
  117. ;pic (0x8000) & grid (0xc000) -> scr (0x4000)
  118.         ld a,(pgpicdata0)
  119.         SETPG8000
  120.         ld a,(pggriddata0)
  121.         SETPGC000
  122.         ld a,(pgscrdata0)
  123.         SETPG4000
  124.         call addgridpg
  125.         if 0
  126.         ld hl,0x8000+8000 ;там в картинке палитра (по байту на цвет)
  127.         ld de,pal
  128.         ld b,16
  129. copypal0
  130.         ld a,(hl)
  131.         inc hl
  132.         ld (de),a
  133.         inc de
  134.         ld (de),a
  135.         inc de
  136.         djnz copypal0 ;скопировали палитру в pal (по 2 байта на цвет)
  137.         endif
  138.        
  139.         ld a,(pgpicdata1)
  140.         SETPG8000
  141.         ld a,(pggriddata1)
  142.         SETPGC000
  143.         ld a,(pgscrdata1)
  144.         SETPG4000
  145.         call addgridpg
  146.  
  147.         ld ix,pieces ;x,y,pg,addr
  148.        
  149.         ld hl,0x4000-1-(8*40)
  150.         push hl
  151.         ld de,mask00-4
  152.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  153.         ld b,+(20-2)/2
  154. piecelinetop0
  155.         push bc
  156.         ld de,mask10-4
  157.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  158.         ld de,mask20-4
  159.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  160.         pop bc
  161.         djnz piecelinetop0
  162.         ld de,mask30-4
  163.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  164.         pop hl
  165.         ld bc,40*16
  166.         add hl,bc
  167.  
  168.          ld b,+(12-2)/2
  169. piecelines0
  170.          push bc
  171.        
  172.         push hl
  173.         ld de,mask01-4
  174.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  175.         ld b,+(20-2)/2
  176. piecelineodd0
  177.         push bc
  178.         ld de,mask11-4
  179.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  180.         ld de,mask21-4
  181.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  182.         pop bc
  183.         djnz piecelineodd0
  184.         ld de,mask31-4
  185.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  186.         pop hl
  187.         ld bc,40*16
  188.         add hl,bc
  189.  
  190.         push hl
  191.         ld de,mask02-4
  192.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  193.         ld b,+(20-2)/2
  194. piecelineeven0
  195.         push bc
  196.         ld de,mask21-4;mask12-4
  197.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  198.         ld de,mask11-4;mask22-4
  199.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  200.         pop bc
  201.         djnz piecelineeven0
  202.         ld de,mask32-4
  203.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  204.         pop hl
  205.         ld bc,40*16
  206.         add hl,bc
  207.        
  208.          pop bc
  209.          djnz piecelines0
  210.  
  211.         ld de,mask03-4
  212.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  213.         ld b,+(20-2)/2
  214. piecelinebottom0
  215.         push bc
  216.         ld de,mask13-4
  217.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  218.         ld de,mask23-4
  219.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  220.         pop bc
  221.         djnz piecelinebottom0
  222.         ld de,mask33-4
  223.         call reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  224.  
  225.         call swapimer
  226.  
  227. ;теперь надо вывести загруженные данные на экран
  228.         ld a,(pgscrdata0)
  229.         SETPGC000 ;включили страницу с данными в c000
  230.         ld a,(user_scr0_low) ;ok
  231.         SETPG4000 ;включили пол-экрана в 4000
  232.         ld hl,0xc000
  233.         ld de,0x4000
  234.         ld bc,0x4000
  235.         ldir ;перебросили на экран
  236.  
  237.         ld a,(pgscrdata1)
  238.         SETPGC000 ;включили страницу с данными в c000
  239.         ld a,(user_scr0_high) ;ok
  240.         SETPG4000 ;включили другие пол-экрана в 4000
  241.         ld hl,0xc000
  242.         ld de,0x4000
  243.         ld bc,0x4000
  244.         ldir ;перебросили на экран
  245.  
  246.         call setpgsscr40008000_current ;включили страницы экрана
  247.        
  248.         ld de,palsneg;pal;sprpal
  249.         OS_SETPAL ;включили палитру спрайтов;картинки
  250.        
  251.         call setpgsmain40008000 ;включили страницу программы в 4000, как было
  252.         call setpgmainc000 ;включили страницу программы в c000, как было
  253.  
  254.         ;call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  255.  
  256.         if 0
  257.         ld a,(timer)
  258.         ld (uvoldtimer),a
  259.         endif
  260. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;        
  261. ;главный цикл
  262. mainloop
  263.  
  264.         call prlevel
  265.  
  266.         ld a,(user_scr0_low) ;ok
  267.         SETPGC000 ;включили страницу с данными в c000
  268.         ld a,(user_scr1_low) ;ok
  269.         SETPG4000 ;включили пол-экрана в 4000
  270.         ld hl,0xc000
  271.         ld de,0x4000
  272.         ld bc,0x4000
  273.         ldir ;перебросили на экран
  274.  
  275.         ld a,(user_scr0_high) ;ok
  276.         SETPGC000 ;включили страницу с данными в c000
  277.         ld a,(user_scr1_high) ;ok
  278.         SETPG4000 ;включили другие пол-экрана в 4000
  279.         ld hl,0xc000
  280.         ld de,0x4000
  281.         ld bc,0x4000
  282.         ldir ;перебросили на экран
  283.  
  284.         ;ld e,0
  285.         ;OS_CLS
  286.         ;ld e,1
  287.         ;OS_SETSCREEN
  288.         ld a,1
  289.         ld (curscrnum_int),a
  290.         halt;YIELD
  291.  
  292. ;вывод фона или восстановление фона под спрайтами
  293. ;... рекомендую взять из sprexamp!
  294. restorer_cursprlist=$+1
  295.         ld hl,sprlist1
  296.         ld de,sprlist1^sprlist2
  297.         ld a,h
  298.         xor d
  299.         ld h,a
  300.         ld a,l
  301.         xor e
  302.         ld l,a
  303.         ld (restorer_cursprlist),hl
  304.        push hl ;curlist
  305.  
  306. ;вывод спрайтов
  307. ;...
  308.         call setpgsscr40008000 ;включили страницы экрана
  309.         ld hl,0x4000
  310.         ld de,0x4001
  311.         ld bc,0x7fff
  312.         ld (hl),l;0
  313.         ldir
  314.  
  315.         ;ld hl,sprlist1
  316.        pop hl
  317.         ld (cursprlistaddr),hl
  318.  
  319.         call drawpieces
  320.  
  321.         ;ld e,0
  322.         ;OS_SETSCREEN
  323.         xor a
  324.         ld (curscrnum_int),a
  325.  
  326.         ld de,scrwid/4 + (256*scrhgt) ;d=hgt,e=wid (/8)
  327.         ld hl,0x4000 ;hl=scr
  328.         call copyimgega_curtodefault ;копируем картинку на экран-буфер
  329.  
  330.         ;call endkeepspr
  331.         ;jr $
  332.  
  333. ;включены страницы экрана
  334.  
  335. key=$+1
  336.         ld a,0
  337.  
  338.         jr mouseloop_go
  339. mouseloop
  340. ;1. всё выводим
  341. ;2. ждём событие
  342. ;[3. всё стираем]
  343. ;4. обрабатываем событие (без перерисовки)
  344. ;5. всё стираем
  345.  
  346.         if 1
  347.         ld a,(clickstate)
  348.         or a
  349.         jr z,mouseloop_nomove
  350.         call ahl_coords
  351.         cp 200-32-8
  352.         jr c,mouseloop_nomove
  353.          ld a,1
  354.          ld (invalidatetime),a
  355.        
  356. mouseloop_nomove
  357.         endif
  358.  
  359.         ld a,(key)
  360.         cp nofocuskey
  361.         call nz,prlevelifneeded
  362.  
  363. mouseloop_go
  364. ;сейчас всё выведено, кроме стрелки
  365.         ld a,(key)
  366.         cp nofocuskey
  367.         jr z,mouseloop_noprarr
  368.  
  369.         ld a,(clickstate)
  370.         or a
  371.         jr z,mouseloop_arr
  372.         ld ix,(curpiece)
  373.         ld a,hx
  374.         or a
  375.         jr z,mouseloop_noprarr
  376.         call setpgsscr40008000
  377.         call ahl_coords
  378.         srl h
  379.         rr l
  380.         sub 8
  381.         ld (ix+1),a ;y активной части кусочка
  382.         ld a,l ;arrx2
  383.         sub 8/2
  384.         ld (ix+0),a ;x2 активной части кусочка
  385.         call drawpiece
  386.         jr mouseloop_noprarr
  387. mouseloop_arr
  388.         call setpgsscr8000c000
  389.         call ahl_coords
  390.         call shapes_memorizearr
  391.         call ahl_coords
  392.         call shapes_prarr8c
  393. mouseloop_noprarr
  394. mainloop_nothing0
  395.         call updatetime
  396. ;в это время стрелка видна
  397.         YIELD ;halt
  398.         call control
  399.         jr nz,mainloop_something
  400.  
  401.          ld a,(invalidatetime)
  402.          or a
  403.         jr z,mainloop_nothing0
  404.  
  405. mainloop_something
  406. ;что-то изменилось
  407.         ld a,(key)
  408.         cp nofocuskey
  409.         jr z,mouseloop_norearr
  410.         ;ld a,(key);(curkey)
  411.         cp key_esc
  412.         jp z,quit
  413.         cp key_enter
  414.         jp z,shuffle
  415.        
  416.         ld a,(clickstate)
  417.         or a
  418.         jr z,mouseloop_rearr
  419.         ld ix,(curpiece)
  420.         ld a,hx
  421.         or a
  422.         jr z,mouseloop_norearr
  423.         call setpgsscr40008000
  424.         ld a,(ix+0) ;x2 активной части кусочка
  425.         add a,8/2 ;>=0
  426.         sub (8/2)+(8/2)
  427.         jr nc,$+3
  428.         xor a
  429.         cp scrwid-(5*4)
  430.         jr c,$+4
  431.         ld a,scrwid-(5*4)
  432.         srl a
  433.         srl a
  434.         ld e,a
  435. ;e=x/8 >=0
  436.         ld a,(ix+1) ;y активной части кусочка
  437.         add a,8 ;>=0
  438.         sub 8+8
  439.         jr nc,$+3
  440.         xor a
  441.         cp scrhgt-32
  442.         jr c,$+4
  443.         ld a,scrhgt-32
  444.         ld c,a
  445. ;c=y >=0
  446.         ld b,0
  447.         ld l,c
  448.         ld h,b;0
  449.         add hl,hl ;y*2
  450.         add hl,hl ;y*4
  451.         add hl,bc ;y*5
  452.         add hl,hl ;y*10
  453.         add hl,hl ;y*20
  454.         add hl,hl ;y*40
  455.         ld d,b;0
  456.         add hl,de ;+x/8
  457.         ld bc,0x4000
  458.         add hl,bc
  459.         ;ld hl,0x4000 ;hl=scr
  460.         ;ld de,scrwid/4 + (256*scrhgt) ;d=hgt,e=wid (/8)
  461.         ld de,5 + (256*32) ;d=hgt,e=wid (/8)        
  462.         call copyimgega_defaulttocur
  463.  
  464.         jr mouseloop_norearr
  465. mouseloop_rearr
  466.         call setpgsscr8000c000
  467.         ld a,(oldarry)
  468.         ld hl,(oldarrx)
  469.         call shapes_rearr
  470. mouseloop_norearr
  471. ;сейчас всё выведено, кроме стрелки
  472.  
  473.         ld a,(mousebuttons)
  474.         and 1
  475. top_oldmousebuttons=$+1
  476.         ld c,1
  477.         ld (top_oldmousebuttons),a
  478.         xor c
  479.         rra
  480.         jp nc,mouseloop ;не нажали и не отжали
  481.        
  482.         ld a,c ;old
  483.         rra
  484.         jp nc,mouse_unfire ;было нажато (теперь отжато)
  485.        
  486. ;mouse_fire
  487.         call findpiece ;out: CY=not found, ix=curpiece
  488.         jp c,mouseloop ;findpieceq
  489.         ld a,1
  490.         ld (clickstate),a
  491.        
  492. ;вывести все кусочки, кроме текущего:
  493.        
  494.         jp mouse_q ;mouseloop
  495.  
  496. mouse_unfire
  497.         xor a
  498.         ld (clickstate),a
  499.         ld ix,(curpiece)
  500.         ld hl,0
  501.         ld (curpiece),hl
  502.         ld a,hx
  503.         or a
  504.         jr z,mouse_unfire_nopiece
  505.         ld (ix+7),1 ;moved
  506. ;округлим координаты текущего кусочка
  507.         ld a,(ix+0) ;x2
  508.         add a,4/2
  509.         and 0xfc
  510.         ld (ix+0),a
  511.         ld a,(ix+1) ;y
  512.         add a,4
  513.         and 0xf8
  514.         ld (ix+1),a
  515. mouse_unfire_nopiece
  516. ;проверка x,y = ideal x,y для всех кусочков
  517.         ld ix,pieces
  518.         ld b,NPIECES
  519. checkwin0
  520.         ld a,(ix+6) ;idealy
  521.         cp (ix+1) ;y
  522.         jr nz,checkwin_no
  523.         ld a,(ix+5) ;idealx2
  524.         cp (ix+0) ;x2
  525.         jr nz,checkwin_no
  526.         ld de,PIECESZ
  527.         add ix,de
  528.         djnz checkwin0
  529. ;победа!
  530.         call showwin
  531.         YIELDGETKEYLOOP ;ждём кнопку
  532.         call prlevel;ifneeded
  533.         YIELDGETKEYLOOP ;ждём кнопку
  534.         jp quit
  535. checkwin_no
  536.  
  537. mouse_q
  538.         call setpgsmain40008000 ;включили страницы программы в 4000,8000, как было
  539.         jp mainloop
  540. shuffle
  541. ;ставим случайные координаты всем кусочкам, которые ещё не двигали
  542.         call genxy
  543.         ld b,0
  544. shuffle0
  545.         push bc
  546.         ;call swappieces ;нельзя менять порядок! иначе неправильно разрезается при перезагрузке!
  547.         pop bc
  548.         djnz shuffle0
  549.         jp mainloop
  550.        
  551. quit        
  552.         call unreservepages
  553.        
  554.         ;YIELDGETKEYLOOP ;ждём кнопку
  555.         call swapimer
  556.          if SAVING
  557.         ld de,filename
  558.         OS_CREATEHANDLE
  559.         push bc
  560.         ld de,SAVEDATA
  561.         ld hl,SAVEDATAsz
  562.         OS_WRITEHANDLE
  563.         pop bc
  564.         OS_CLOSEHANDLE
  565.          endif
  566.         QUIT
  567.  
  568. drawpieces
  569. ;вывести все кусочки, кроме текущего
  570.         ld ix,pieces
  571.         ld b,NPIECES
  572. drawpieces0
  573.          push bc
  574.         push ix
  575.         pop de
  576.         ld hl,(curpiece)
  577.         or a
  578.         sbc hl,de
  579.         ;jr z,drawpieces0_skip
  580.          push ix
  581.         call nz,drawpiece
  582.          pop ix
  583. drawpieces0_skip
  584.          ld bc,PIECESZ
  585.          add ix,bc
  586.          pop bc
  587.          djnz drawpieces0
  588.         ret
  589.  
  590. drawpiece
  591.         ld l,(ix+2) ;pg
  592.         ld h,tpg/256
  593.         ld a,(hl)
  594.         SETPGC000
  595.         ld a,(ix+0) ;x
  596.         add a,sprmaxwid-1-(8/2) ;8=размер левого поля кусочка пазла
  597.         ld e,a
  598.         ld a,(ix+1) ;y
  599.         add a,-8 ;8=размер верхнего поля кусочка пазла
  600.         ld c,a
  601.         ld l,(ix+3)
  602.         ld h,(ix+4)
  603.         push hl
  604.         pop iy
  605.         ;ld iy,tmp
  606.         ;ld e,60 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  607.         ;ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  608.         ;call keepspr
  609.         jp prspr
  610.  
  611. findpiece
  612.         call ahl_coords
  613.         srl h
  614.         rr l ;l=arrx2
  615.         ld h,a ;h=arry
  616. ;ищем кусочек под стрелкой (последний подходящий в списке)
  617. ;координаты кусочка указывают на левый верхний угол активной части
  618. ;стрелка должна быть +0..15 к ним (по x +0..7)
  619.         ld ix,pieces + (NPIECES*PIECESZ)
  620.         ld b,NPIECES
  621. findpiece0
  622.         ld de,-PIECESZ
  623.         add ix,de
  624.         ld a,h ;arry
  625.         sub (ix+1) ;y
  626.         cp 16
  627.         jr nc,findpiece_no
  628.         ld a,l ;arrx2
  629.         sub (ix+0) ;x2
  630.         cp 8
  631.         jr c,findpiece_ok
  632. findpiece_no
  633.         djnz findpiece0
  634.         scf
  635.         ld ix,0
  636.         ret;jr findpieceq
  637. findpiece_ok
  638.         or a
  639.         ld (curpiece),ix
  640.         ret
  641.  
  642. ahl_coords
  643.         ld a,(arry)
  644.         ld hl,(arrx)
  645.         ret
  646.  
  647.         if 0
  648. clspg4000
  649.         ld hl,0x4000
  650.         ld d,h
  651.         ld e,l
  652.         inc e
  653.         ld bc,0x3fff
  654.         ld (hl),l;0
  655.         ldir
  656.         ret
  657.         endif
  658.  
  659. reservepiece ;hl=scr, de=mask-4, out: hl+=2 ;ix+=5
  660.          push hl
  661.          push ix
  662.         push hl ;scr
  663.         ex de,hl ;hl=mask-4
  664.         call getmask
  665.         ld a,(pgscrdata0)
  666.         SETPG4000
  667.         ld a,(pgscrdata1)
  668.         SETPG8000
  669.         pop hl ;scr
  670.         ld de,tmp-2
  671.         call maskpiece
  672.         ld bc,mask10-mask00 ;sprsize
  673.         push bc
  674.         ;jr $
  675.         call reserve_mem
  676.         pop bc
  677.          pop ix
  678.          ld (ix+2),a ;pg
  679.          push bc
  680.          ld c,a
  681.          ld b,tpg/256
  682.          ld a,(bc)
  683.         SETPGC000
  684.          pop bc
  685.         push de
  686.         ld hl,tmp-4
  687.         ldir
  688.         pop de
  689.          pop hl
  690.          inc de
  691.          inc de
  692.          inc de
  693.          inc de ;указатели на спрайты на +4
  694.          ld (ix+3),e
  695.          ld (ix+4),d
  696.          ld c,PIECESZ
  697.          add ix,bc
  698.          inc hl
  699.          inc hl
  700.         ret
  701.  
  702. getmask
  703.         ld a,(pgmain4000)
  704.         SETPG4000
  705.         ld de,tmp-4
  706.         ld bc,mask10-mask00
  707.         ldir
  708.         ret
  709.  
  710. maskpiece
  711. ;0x4000,0x8000 = scrdata
  712. ;hl=0x4000+
  713. ;de=спрайт маски (без заголовка): 0,mask, в конце стоблца 2-байтный адрес
  714. ;туда же кладём результат наложения: and(~mask),or(scrdata&mask)
  715.         ld lx,32/8
  716. maskpiececolumns0
  717.         call maskpiececolumn
  718.         ld bc,0x4000
  719.         add hl,bc
  720.         call maskpiececolumn
  721.         ld bc,0x2000-0x4000
  722.         add hl,bc
  723.         call maskpiececolumn
  724.         ld bc,0x4000
  725.         add hl,bc
  726.         call maskpiececolumn
  727.         ld bc,-0x2000-0x4000+1
  728.         add hl,bc
  729.         dec lx
  730.         jr nz,maskpiececolumns0
  731.         ret
  732.  
  733. maskpiececolumn
  734.         push hl
  735.         ld bc,40
  736.         ld hx,32
  737. maskpiece1
  738.         inc de
  739.         ld a,(de) ;mask
  740.         dec de
  741.         cpl
  742.         ld (de),a
  743.         cpl
  744.         inc de
  745.         and (hl) ;scrdata
  746.         ld (de),a      
  747.         inc de
  748.         add hl,bc
  749.         dec hx
  750.         jr nz,maskpiece1
  751.         inc de
  752.         inc de
  753.         pop hl
  754.         ret
  755.  
  756. addgridpg
  757. ;pic (0x8000) & grid (0xc000) -> scr (0x4000)
  758.         ld hl,0x8000
  759.         ld bc,0x4000
  760. addgrid0
  761.         ld a,(hl)
  762.         set 6,h
  763.         and (hl)
  764.         res 7,h
  765.         ld (hl),a
  766.         res 6,h
  767.         set 7,h
  768.         cpi
  769.         jp pe,addgrid0
  770.         ret
  771.        
  772. keepspr
  773. cursprlistaddr=$+1
  774.         ld hl,0
  775.         ld (hl),e ;x
  776.         inc hl
  777.         ld (hl),c ;y
  778.         inc hl
  779.         ld a,(iy-1)
  780.         ld (hl),a ;hgt
  781.         inc hl
  782.         ld (cursprlistaddr),hl
  783.         ret
  784.        
  785. endkeepspr
  786.         ld hl,(cursprlistaddr)
  787.         ld (hl),200
  788.         ret
  789.  
  790. showwin
  791.         ld a,(pgpicdata0)
  792.         SETPGC000 ;включили страницу с данными в c000
  793.         ld a,(user_scr0_low) ;ok
  794.         SETPG4000 ;включили пол-экрана в 4000
  795.         ld hl,0xc000
  796.         ld de,0x4000
  797.         ld bc,0x4000
  798.         ldir ;перебросили на экран
  799.  
  800.         ld a,(pgpicdata1)
  801.         SETPGC000 ;включили страницу с данными в c000
  802.         ld a,(user_scr0_high) ;ok
  803.         SETPG4000 ;включили другие пол-экрана в 4000
  804.         ld hl,0xc000
  805.         ld de,0x4000
  806.         ld bc,0x4000
  807.         ldir ;перебросили на экран
  808.         ret
  809.  
  810. sprlist1
  811.         ds 3*128,200
  812. sprlist2
  813.         ds 3*128,200
  814.  
  815. pal
  816.         ds 32 ;тут будет палитра картинки
  817. emptypal
  818.         ds 32,0xff ;палитра, где все цвета чёрные
  819.         include "pal.ast"
  820.  
  821. loadfile_in_ahl
  822. ;de=имя файла
  823. ;hl=куда грузим (0xc000)
  824. ;a=в какой странице
  825.         SETPGC000 ;включили страницу A в 0xc000
  826.         push hl ;куда грузим
  827.         OS_OPENHANDLE
  828.         pop de ;куда грузим
  829.         push bc ;b=handle
  830.         ld hl,0x4000 ;столько грузим (если столько есть в файле)
  831.         OS_READHANDLE
  832.         pop bc ;b=handle
  833.         OS_CLOSEHANDLE
  834.         jp setpgmainc000 ;включили страницу программы в c000, как было
  835.  
  836. primgega_onescreen
  837. ;b=hgt,c=wid (/2)
  838. ;de=gfx
  839. ;hl=scr
  840. primgega0
  841.         push bc
  842.         ld hx,b
  843.         push hl
  844.         ld bc,40
  845. primgegacolumn0
  846.         ld a,(de)
  847.         inc de
  848.         ld (hl),a
  849.         add hl,bc
  850.         dec hx
  851.         jr nz,primgegacolumn0
  852.         pop hl
  853.         ld a,0x9f;0xa0
  854.         cp h
  855.         ld bc,0x4000
  856.         adc hl,bc
  857.         jp pe,primgegacolumn0q ;в половине случаев
  858. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  859.          inc a
  860.         xor h
  861.         ld h,a
  862. primgegacolumn0q
  863.         pop bc
  864.         dec c
  865.         jr nz,primgega0
  866.         ret
  867.  
  868.  
  869. copyimgega_curtodefault
  870. ;d=hgt,e=wid (/8)
  871. ;hl=scr
  872.         call getuser_scr_low_cur
  873.         SETPG4000 ;set "from" page in 4000
  874.         call getuser_scr_low
  875.         SETPGC000 ;set "to" page in c000
  876.         call copyimgegalayer
  877.         call getuser_scr_high_cur
  878.         SETPG16K ;set "from" page in 4000
  879.         call getuser_scr_high
  880. copyimgegaq
  881.         SETPGC000 ;set "to" page in c000
  882.         call copyimgegalayer
  883.         call setpgmainc000
  884.         jp setpgsmain40008000
  885.  
  886. copyimgega_defaulttocur
  887. ;d=hgt,e=wid (/8)
  888. ;hl=scr
  889.         call getuser_scr_low
  890.         SETPG4000 ;set "from" page in 4000
  891.         call getuser_scr_low_cur
  892.         SETPGC000 ;set "to" page in c000
  893.         call copyimgegalayer
  894.         call getuser_scr_high
  895.         SETPG4000 ;set "from" page in 4000
  896.         call getuser_scr_high_cur
  897.         jr copyimgegaq ;set "to" page in c000, copy
  898.  
  899.         if 0
  900. copyimgega_defaulttoshadow
  901. ;d=hgt,e=wid (/8)
  902. ;hl=scr
  903.         ld a,(pgscrdata0)
  904.         SETPG4000 ;set "from" page in 4000
  905.         call getuser_scr_low
  906.         SETPGC000 ;set "to" page in c000
  907.         call copyimgegalayer
  908.         ld a,(pgscrdata1)
  909.         SETPG4000 ;set "from" page in 4000
  910.         call getuser_scr_high
  911.         jr copyimgegaq ;set "to" page in c000, copy
  912.         endif
  913.  
  914. copyimgegalayer
  915.         push hl
  916.         ld hx,e ;wid/8
  917. copyimgega0
  918.         push de
  919.         push hl
  920.         ld b,d ;hgt
  921.         ld de,40-0x8000
  922. copyimgegacolumn0
  923.         ld a,(hl)
  924.         set 5,h
  925.         ld c,(hl)
  926.          set 7,h
  927.         ld (hl),c
  928.         res 5,h
  929.         ld (hl),a
  930.         add hl,de
  931.         djnz copyimgegacolumn0
  932.         pop hl
  933.         pop de
  934.         inc hl
  935.         dec hx
  936.         jr nz,copyimgega0
  937.         pop hl
  938.         ret
  939.        
  940. genxy
  941. ;случайные координаты (если не двигали кусочек)
  942.         ld ix,pieces ;x,y,pg,addr
  943.         ld b,NPIECES
  944. genxy0
  945.         ld a,(ix+7)
  946.         or a
  947.         jr nz,genxy_moved
  948.          ld c,+(320-16-32)/4
  949.          call rnd
  950.          add a,a
  951.          add a,16/2
  952.         ;ld a,(ix+5) ;ideal x2
  953.          ld (ix+0),a ;x2
  954.          ld c,+(192-16-32)/4
  955.          call rnd
  956.          add a,a
  957.          add a,a
  958.          add a,16
  959.         ;ld a,(ix+6) ;ideal y
  960.          ld (ix+1),a ;y
  961. genxy_moved
  962.         ld de,PIECESZ
  963.         add ix,de
  964.         djnz genxy0
  965.         ret
  966.  
  967. swappieces
  968. ;случайный обмен порядка (если не двигали кусочек)
  969.         ld c,NPIECES
  970.         call rnd
  971.         call getpiece_a
  972.         ld bc,7
  973.         add hl,bc
  974.         bit 0,(hl)
  975.         ret nz
  976.         ;sbc hl,bc
  977.         ex de,hl
  978.         ld c,NPIECES
  979.         call rnd
  980.         call getpiece_a
  981.         ld bc,7
  982.         add hl,bc
  983.         bit 0,(hl)
  984.         ret nz
  985.         ;sbc hl,bc
  986.         ld b,PIECESZ
  987. swappieces0
  988.         ld c,(hl)
  989.         ld a,(de)
  990.         ld (hl),a
  991.         ld a,c
  992.         ld (de),a
  993.         dec hl
  994.         dec de
  995.         djnz swappieces0
  996.         ret
  997. getpiece_a
  998.         ld c,a
  999.         ld b,0
  1000.         ld hl,pieces
  1001.         dup PIECESZ
  1002.         add hl,bc
  1003.         edup
  1004.         ret
  1005.  
  1006. rnd
  1007. ;0..c-1
  1008.         ;ld a,r
  1009.         push de
  1010.         push hl
  1011.         call func_rnd
  1012.         pop hl
  1013.         pop de
  1014. rnd0
  1015.         sub c
  1016.         jr nc,rnd0
  1017.         add a,c
  1018.         ret
  1019.  
  1020. func_rnd
  1021. ;Patrik Rak
  1022. rndseed1=$+1
  1023.         ld  hl,0xA280   ; xz -> yw
  1024. rndseed2=$+1
  1025.         ld  de,0xC0DE   ; yw -> zt
  1026.         ld  (rndseed1),de  ; x = y, z = w
  1027.         ld  a,e         ; w = w ^ ( w << 3 )
  1028.         add a,a
  1029.         add a,a
  1030.         add a,a
  1031.         xor e
  1032.         ld  e,a
  1033.         ld  a,h         ; t = x ^ (x << 1)
  1034.         add a,a
  1035.         xor h
  1036.         ld  d,a
  1037.         rra             ; t = t ^ (t >> 1) ^ w
  1038.         xor d
  1039.         xor e
  1040.         ld  h,l         ; y = z
  1041.         ld  l,a         ; w = t
  1042.         ld  (rndseed2),hl
  1043.         ;ex de,hl
  1044.         ;ld hl,0
  1045.         ;res 7,c ;int
  1046.         ret
  1047.  
  1048. pgscrdata0
  1049.         db 0
  1050. pgscrdata1
  1051.         db 0
  1052. pgpicdata0
  1053.         db 0
  1054. pgpicdata1
  1055.         db 0
  1056. pggriddata0
  1057.         db 0
  1058. pggriddata1
  1059.         db 0
  1060.  
  1061. clickstate
  1062.         db 0
  1063.  
  1064. curpiece
  1065.         dw 0
  1066.  
  1067. curkey
  1068.         db 0
  1069. joystate
  1070. ;bit - button (ZX key)
  1071. ;7 - A (A)
  1072. ;6 - B (S)
  1073. ;5 - Select (Space)
  1074. ;4 - Start (Enter)
  1075. ;3 - Up (7)
  1076. ;2 - Down (6)
  1077. ;1 - Left (5)
  1078. ;0 - Right (8)
  1079.         db 0
  1080.  
  1081. SAVEDATA
  1082. level
  1083.         db 0
  1084. ;curx
  1085. ;       db 0
  1086. ;cury
  1087. ;       db 0
  1088.  
  1089. cur_h
  1090.         db 0
  1091. cur_m
  1092.         db 0
  1093. cur_s
  1094.         db 0
  1095. cur_f
  1096.         db 0
  1097.  
  1098. tlevel
  1099. ttime
  1100.         ;db "TIME "
  1101.         db "00:00:00"
  1102. ttimeh1=$-8
  1103. ttimeh2=$-7
  1104. ttimem1=$-5
  1105. ttimem2=$-4
  1106. ttimes1=$-2
  1107. ttimes2=$-1
  1108. ;nextlevelon=$ ;этот флаг надо сохранять
  1109.         db 0
  1110.  
  1111. ;у нас 20x12 = 240 кусочков
  1112. pieces
  1113. _y=0
  1114.         dup 12
  1115. _x=0
  1116.         dup 20
  1117.         db 0,0 ;x,y
  1118.         db 0 ;pg (виртуальная в tpg)
  1119.         dw 0 ;addr
  1120.         db _x,_y ;ideal x,y
  1121.         db 0 ;0=not moved
  1122. _x=_x+8
  1123.         edup
  1124. _y=_y+16
  1125.         edup
  1126.  
  1127. SAVEDATAsz=$-SAVEDATA
  1128.  
  1129. path
  1130.         db "puzzle",0
  1131. filenamepic0
  1132.         db "0pic0.bmpx",0
  1133. filenamepic1
  1134.         db "1pic0.bmpx",0
  1135. filenamegrid0
  1136.         db "0grid.bmpx",0
  1137. filenamegrid1
  1138.         db "1grid.bmpx",0
  1139.  
  1140. filename
  1141.         db "puzzle.ini",0
  1142.  
  1143.         include "mem.asm"
  1144.         include "dynmem.asm"
  1145.         include "int.asm"
  1146.  
  1147.         include "prspr.asm"
  1148.  
  1149. div4signedup
  1150.         or a
  1151.         jp m,$+5
  1152.         add a,3
  1153.         sra a
  1154.         sra a
  1155.         ret
  1156.  
  1157. prtext
  1158. ;bc=координаты
  1159. ;hl=text
  1160.         ld a,(hl)
  1161.         or a
  1162.         ret z
  1163.         call prcharxy
  1164.         inc hl
  1165.         inc c
  1166.         jr prtext
  1167.  
  1168. prnum
  1169.         ld bc,1000
  1170.         call prdig
  1171.         ld bc,100
  1172.         call prdig
  1173.         ld bc,10
  1174.         call prdig
  1175.         ld bc,1
  1176. prdig
  1177.         ld a,'0'-1
  1178. prdig0
  1179.         inc a
  1180.         or a
  1181.         sbc hl,bc
  1182.         jr nc,prdig0
  1183.         add hl,bc
  1184.         ;push hl
  1185.         ;call prchar
  1186.         ;pop hl
  1187.         ;ret
  1188. prchar
  1189. ;a=code
  1190. ;de=screen
  1191.         push de
  1192.         push hl
  1193.         call prcharin
  1194.         pop hl
  1195.         pop de
  1196.         inc e
  1197.         ret
  1198.        
  1199. calcscraddr
  1200. ;bc=yx
  1201. ;можно портить bc
  1202.         ex de,hl
  1203.         ld a,c ;x
  1204.         ld l,b ;y
  1205.         ld h,0
  1206.         ld b,h
  1207.         ld c,l
  1208.         add hl,hl
  1209.         add hl,hl
  1210.         add hl,bc ;*5
  1211.          add hl,hl
  1212.          add hl,hl
  1213.          add hl,hl ;*40
  1214.          add hl,hl
  1215.          add hl,hl
  1216.          add hl,hl
  1217.         add a,l
  1218.         ld l,a
  1219.         ld a,h
  1220.         adc a,0x80
  1221.         ld h,a
  1222.         ex de,hl
  1223.         ret
  1224.  
  1225. prcharxy
  1226. ;a=code
  1227. ;bc=yx
  1228.         push de
  1229.         push hl
  1230.         push bc
  1231.         push af
  1232.         call calcscraddr
  1233.         pop af
  1234.         call prcharin
  1235.         pop bc
  1236.         pop hl
  1237.         pop de
  1238.         ret
  1239.        
  1240. prcharin
  1241.         sub 32
  1242.         ld l,a
  1243.         ld h,0
  1244.          add hl,hl
  1245.          add hl,hl
  1246.          add hl,hl
  1247.          add hl,hl
  1248.          add hl,hl
  1249.         ;ld bc,font-(32*32)
  1250.         ;add hl,bc
  1251.         ld a,h
  1252.         add a,font/256
  1253.         ld h,a
  1254. prcharin_go
  1255.         ex de,hl
  1256.        
  1257.         ld bc,40
  1258.         push hl
  1259.         push hl
  1260.         dup 8
  1261.         ld a,(de) ;font
  1262.         ld (hl),a ;scr
  1263.         inc de
  1264.         add hl,bc
  1265.         edup
  1266.         pop hl
  1267.         set 6,h
  1268.         ;ld d,font/256
  1269.         dup 8
  1270.         ld a,(de) ;font
  1271.         ld (hl),a ;scr
  1272.         inc de
  1273.         add hl,bc
  1274.         edup
  1275.         pop hl
  1276.         set 5,h
  1277.         push hl
  1278.         ;ld d,font/256
  1279.         dup 8
  1280.         ld a,(de) ;font
  1281.         ld (hl),a ;scr
  1282.         inc de
  1283.         add hl,bc
  1284.         edup
  1285.         pop hl
  1286.         set 6,h
  1287.         ;ld d,font/256
  1288.         dup 8
  1289.         ld a,(de) ;font
  1290.         ld (hl),a ;scr
  1291.         inc de
  1292.         add hl,bc
  1293.         edup        
  1294.         ret
  1295.  
  1296.         macro SHAPESPROC name
  1297. name
  1298.         endm
  1299.  
  1300.         include "prarrow.asm"
  1301.  
  1302.         include "control.asm"
  1303.  
  1304. prlevelifneeded
  1305.         xor a
  1306. invalidatetime=$+1
  1307.         cp 0
  1308.         ret z
  1309. prlevel
  1310.         call setpgsscr8000c000
  1311.         ;ld a,(level)
  1312.         ;inc a
  1313.         ;ld hl,tleveldig1
  1314.         ;call dectotxt12
  1315.         ;ld (tleveldig2),a
  1316.         ;ld a,b
  1317.         ;ld (tleveldig1),a
  1318.         ld a,(cur_h)
  1319.         ld hl,ttimeh1
  1320.         call dectotxt12
  1321.         ld a,(cur_m)
  1322.         ld hl,ttimem1
  1323.         call dectotxt12
  1324.         ld a,(cur_s)
  1325.         ld hl,ttimes1
  1326.         call dectotxt12
  1327.        
  1328.          xor a
  1329.          ld (invalidatetime),a
  1330.        
  1331.         ld bc,24*256+20-4
  1332.         ld hl,tlevel
  1333.         jp prtext
  1334.  
  1335. dectotxt12
  1336.         ld b,'0'-1
  1337.         inc b
  1338.         sub 10
  1339.         jr nc,$-3
  1340.         add a,'0'+10
  1341.          ld (hl),b
  1342.          inc hl
  1343.          ld (hl),a
  1344.         ret
  1345.  
  1346. updatetime
  1347.         OS_GETTIMER ;dehl=timer
  1348.         ld de,(oldupdtimer)
  1349.         ld (oldupdtimer),hl
  1350.         or a
  1351.         sbc hl,de ;hl=frames
  1352.         ret z
  1353.         ld b,h
  1354.         ld c,l
  1355. updatetime0
  1356.         call inctime
  1357.         ;dec bc
  1358.         ;ld a,b
  1359.         ;or c
  1360.         ;jr nz,updatetime0
  1361.         cpi
  1362.         jp pe,updatetime0
  1363.         ret
  1364. inctime
  1365.         ld hl,cur_f
  1366.         inc (hl)
  1367.         ld a,(hl)
  1368.         sub 50
  1369.         ret c
  1370.         ld (hl),a
  1371.          ld a,1
  1372.          ld (invalidatetime),a
  1373.         ld hl,cur_s
  1374.         inc (hl)
  1375.         ld a,(hl)
  1376.         sub 60
  1377.         ret c
  1378.         ld (hl),a
  1379.         ld hl,cur_m
  1380.         inc (hl)
  1381.         ld a,(hl)
  1382.         sub 60
  1383.         ret c
  1384.         ld (hl),a
  1385.         ld hl,cur_h
  1386.         inc (hl)
  1387.         ret
  1388.  
  1389. oldupdtimer
  1390.         dw 0
  1391.  
  1392.         align 256
  1393. font
  1394.         display "font=",font
  1395.         incbin "fontgfx"
  1396.         align 256
  1397. tpg
  1398.         ds 256
  1399.  
  1400.         ds 4
  1401. tmp
  1402.  
  1403.         ds 0x3f00-(mask10-mask00)-$
  1404.  
  1405.         ds 0x4000-$
  1406.         include "spr.ast"
  1407.  
  1408. end
  1409.  
  1410.         ;display "End=",end
  1411.         ;display "Free after end=",/d,#c000-end
  1412.         ;display "Size ",/d,end-begin," bytes"
  1413.        
  1414.         savebin "puzzle.com",begin,end-begin
  1415.        
  1416.         LABELSLIST "../../../us/user.l",1
  1417.