?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4.         include "target.asm"
  5.  
  6.         ifdef EVO
  7.  
  8.         display "EVO version"
  9.  
  10. MEM_SLOT0=#37f7
  11. MEM_SLOT1=#77f7
  12. MEM_SLOT2=#b7f7
  13. MEM_SLOT3=#f7f7
  14.  
  15. INVMASK=#ff
  16.  
  17.         else
  18.  
  19.         display "ATM version"
  20.  
  21. MEM_SLOT0=#3ff7
  22. MEM_SLOT1=#7ff7
  23. MEM_SLOT2=#bff7
  24. MEM_SLOT3=#fff7
  25.  
  26. INVMASK=#7f
  27.  
  28.         endif
  29.  
  30.         ifdef DOS
  31.         display "DOS support"
  32.         endif
  33.  
  34.  
  35.         include "pages.asm"
  36. NUMBER_OF_PAGES=10
  37.  
  38. scrbase=0x4000
  39. sprmaxwid=32
  40. sprmaxhgt=32
  41. scrwid=160 ;double pixels
  42. scrhgt=200
  43. clswid=40 ;*8
  44. clshgt=200
  45.  
  46. STACK=0x4000
  47. tempsp=0x3f06 ;6 bytes for prspr
  48. INTSTACK=0x3f00
  49.  
  50.  
  51. SCR_PAGE1=(1^INVMASK)
  52. SCR_PAGE3=(3^INVMASK)
  53. SCR_PAGE5=(5^INVMASK)
  54. SCR_PAGE7=(7^INVMASK)
  55.  
  56. SPBUF_PAGE0=(8^INVMASK)
  57. SPBUF_PAGE1=(9^INVMASK)
  58. SPBUF_PAGE2=(10^INVMASK)
  59. SPBUF_PAGE3=(11^INVMASK)
  60.  
  61. SPTBL_PAGE=(6^INVMASK)
  62.  
  63. ;CC_PAGE0=(12^INVMASK)
  64. CC_PAGE1=(13^INVMASK)
  65. CC_PAGE2=(14^INVMASK)
  66. CC_PAGE3=(12^INVMASK)
  67.  
  68. SND_PAGE=(0^INVMASK)
  69. PAL_PAGE=(4^INVMASK)
  70. GFX_PAGE=(16^INVMASK)
  71.  
  72.  
  73. IMG_LIST =0xd000;#1000
  74.  
  75. ;смещения в SND_PAGE
  76.  
  77. AFX_INIT =#4000
  78. AFX_PLAY =#4003
  79. AFX_FRAME=#4006
  80. PT3_INIT =#4009
  81. PT3_FRAME=#400c
  82. PT3_MUTE =#400f ;NEW for TFM
  83. TURBOFMON=#4012 ;NEW for TFM
  84.  
  85. MUS_COUNT=#49fe
  86. SMP_COUNT=#49ff
  87. SFX_COUNT=#5000
  88.  
  89. MUS_LIST =#4a00
  90. SMP_LIST =#4d00
  91. SFX_DATA =#5100
  92.  
  93.  
  94.  
  95.         macro MDebug color
  96.         push af
  97.         ld a,color
  98.         out (#fe),a
  99.         pop af
  100.         endm
  101.  
  102.         macro MSetShadowScreen
  103.         ld a,(_screenActive)
  104.         ;ld bc,MEM_SLOT1
  105.         ;ld (_memSlot1),a
  106.         ;out (c),a
  107.         SETPG16K
  108.  
  109.         ;ld b,high MEM_SLOT2
  110.         sub 4
  111.         ;ld (_memSlot2),a
  112.         ;out (c),a
  113.         SETPG32KLOW
  114.         endm
  115.  
  116.         macro MRestoreMemMap012
  117.         ;ld bc,MEM_SLOT3
  118.         ld a,CC_PAGE3
  119.         ;out (c),a
  120.         SETPG32KHIGH
  121.  
  122.         ;ld b,high MEM_SLOT1
  123.         ld a,CC_PAGE1
  124.         ;ld (_memSlot1),a
  125.         ;out (c),a
  126.         SETPG16K
  127.  
  128.         ;ld b,high MEM_SLOT2
  129.         ld a,CC_PAGE2
  130.         ;ld (_memSlot2),a
  131.         ;out (c),a
  132.         SETPG32KLOW
  133.         endm
  134.  
  135.         macro MRestoreMemMap12
  136.         ;ld bc,MEM_SLOT1
  137.         ld a,CC_PAGE1
  138.         ;ld (_memSlot1),a
  139.         ;out (c),a
  140.         SETPG16K
  141.  
  142.         ;ld b,high MEM_SLOT2
  143.         ld a,CC_PAGE2
  144.         ;ld (_memSlot2),a
  145.         ;out (c),a
  146.         SETPG32KLOW
  147.         endm
  148.  
  149.         org PROGSTART
  150. begin
  151.         ld sp,STACK
  152.         OS_HIDEFROMPARENT
  153.  
  154. ;        ld b,25
  155. ;waitcls0
  156. ;        push bc
  157. ;        YIELD
  158. ;        pop bc
  159. ;        djnz waitcls0 ;чтобы nv не перехватил фокус при вызове через комстроку
  160.  
  161.         ld e,0
  162.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  163.         ld e,0
  164.         OS_SETSCREEN
  165.         ld e,0 ;color byte
  166.         OS_CLS
  167.         ld e,1
  168.         OS_SETSCREEN
  169.         ld e,0 ;color byte
  170.         OS_CLS
  171.        
  172.         OS_GETMAINPAGES
  173. ;dehl=номера страниц в 0000,4000,8000,c000
  174.         ld a,e
  175.         LD (pgmain4000),A
  176.         ld a,h
  177.         LD (pgmain8000),A
  178.         call setpgsmain40008000 ;записать в curpg...
  179.  
  180.         ;OS_GETSCREENPAGES
  181. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  182.         ;ld a,l
  183.         ;ld (setpgs_scr_low),a
  184.         ;xor e
  185.         ;ld (setpgs_scr_scrxor),a
  186.         ;ld a,h
  187.          ;ld (ttexpgs+31),a ;ld (IR128),a ;на всякой случай, для прерывания
  188.         ;xor l
  189.         ;ld (setpgs_scr_pgxor),a
  190.        
  191.         ld de,res_path
  192.         OS_CHDIR
  193.  
  194.         ld de,tpages
  195.         ld b,NUMBER_OF_PAGES
  196. loadloop0
  197.         push bc
  198.         push de
  199.         ld hl,texfilename
  200.         call loadpage
  201.         pop de
  202.         ld (de),a
  203.         inc e
  204.         ld hl,texfilename_pgnumend
  205. loadloop_nextdigit0
  206.         dec hl
  207.         ld a,(hl)
  208.         inc a
  209.         cp "0"+10
  210.         ld (hl),"0"
  211.         jr z,loadloop_nextdigit0
  212.         ld (hl),a
  213.         pop bc
  214.         djnz loadloop0
  215.        
  216.         if 1==0
  217.         call loadpage
  218.         ld (pgmusic),a
  219.         SETPG16K
  220.         push af
  221.         call 0x4000 ;init
  222.         pop af
  223.         ld hl,0x4005 ;play
  224.         OS_SETMUSIC
  225.         endif
  226.         call setpgsmain40008000
  227.        
  228.         call swapimer
  229.  
  230.         ld de,SUMMERPAL
  231.         OS_SETPAL
  232.  
  233.         ;jr $
  234.         ld c,10
  235.         ld b,2
  236.         ld de,0
  237. ;c=X, b=Y, de=tile
  238. ;координаты в тайлах
  239.         call _draw_tile
  240.         call _swap_screen
  241.        
  242.         jr $
  243. mainloop
  244.        
  245.         call changescrpg ;с этого момента можем видеть, что нарисовали
  246.        
  247. ;waitkey
  248.         halt ;в играх не юзаем YIELD, иначе может сработать чужой обработчик прерываний
  249. curkey=$+1
  250.         ld a,0
  251.         cp key_esc
  252.         jr nz,mainloop;waitkey
  253.        
  254.         call swapimer
  255. pgmusic=$+1
  256.         ld a,0
  257.         SETPG16K
  258.         ld hl,0x4008 ;stop
  259.         OS_SETMUSIC
  260.         halt
  261.         QUIT
  262.  
  263.         ds 0x0200-$
  264. tpages
  265.         ds 256 ;pages
  266.  
  267. loadpage
  268. ;заказывает страничку и грузит туда файл (имя файла в hl)
  269. ;out: hl=после имени файла, a=pg
  270.         push hl
  271.         OS_NEWPAGE
  272.         pop hl
  273.         ld a,e
  274.         push af ;pg
  275.         SETPG32KHIGH
  276.         push hl
  277.         ex de,hl
  278.         OS_OPENHANDLE
  279.         push bc
  280.         ld de,0xc000 ;addr
  281.         ld hl,0x4000 ;size
  282.         OS_READHANDLE
  283.         pop bc
  284.         OS_CLOSEHANDLE                
  285.         pop hl
  286.         ld b,1
  287.         xor a
  288.         cpir ;after 0
  289.         pop af ;pg
  290.         ret
  291.  
  292. SUMMERPAL
  293. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  294.         dw 0xffff,0xfefe,0x1d1d,0x3c3c,0xcdcd,0x4c4c,0x2c2c,0xecec
  295.         dw 0xfdfd,0x2d2d,0xeeee,0x3f3f,0xafaf,0x5d5d,0x4e4e,0x0c0c
  296. ;RSTPAL
  297. ;        STANDARDPAL
  298.  
  299.  
  300. texfilename
  301. texfilename_pgnumend=$+8
  302.         db "page_000.bin",0
  303.  
  304.  
  305. setpgsmain40008000
  306. pgmain4000=$+1
  307.         ld a,0
  308.         ;ld (curpg4000),a
  309.         SETPG16K
  310. pgmain8000=$+1
  311.         ld a,0
  312.         ;ld (curpg8000),a
  313.         SETPG32KLOW
  314.         ret
  315.  
  316. setpgsscr40008000_current
  317.         call getuser_scr_low_cur
  318.         ;ld (curpg4000),a ;TODO kill
  319.         SETPG16K
  320.         call getuser_scr_high_cur
  321.         ;ld (curpg8000),a ;TODO kill
  322.         SETPG32KLOW
  323.         ret
  324.  
  325. setpgsscr40008000
  326.         call getuser_scr_low
  327.         ;ld (curpg4000),a ;TODO kill
  328.         SETPG16K
  329.         call getuser_scr_high
  330.         ;ld (curpg8000),a ;TODO kill
  331.         SETPG32KLOW
  332.         ret
  333.  
  334. setpgscrlow4000
  335.         call getuser_scr_low
  336.         SETPG16K
  337.         ret
  338.  
  339. setpgscrhigh4000
  340.         call getuser_scr_high
  341.         SETPG16K
  342.         ret
  343.  
  344. getuser_scr_low
  345. getuser_scr_low_patch=$+1
  346. getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
  347.         ld a,(user_scr1_low) ;ok
  348.         ret
  349.  
  350. getuser_scr_high
  351. getuser_scr_high_patch=$+1
  352. getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
  353.         ld a,(user_scr1_high) ;ok
  354.         ret
  355.  
  356. getuser_scr_low_cur
  357. getuser_scr_low_cur_patch=$+1
  358. getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
  359.         ld a,(user_scr0_low) ;ok
  360.         ret
  361.  
  362. getuser_scr_high_cur
  363. getuser_scr_high_cur_patch=$+1
  364. getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
  365.         ld a,(user_scr0_high) ;ok
  366.         ret
  367.  
  368. changescrpg_current
  369. ;        ld a,(setpgs_scr_low)
  370. ;setpgs_scr_scrxor=$+1
  371. ;        xor 0
  372. ;        ld (setpgs_scr_low),a
  373.         ld hl,getuser_scr_low_patch
  374.         ld a,(hl)
  375.         xor getuser_scr_low_patchN
  376.         ld (hl),a
  377.         ld hl,getuser_scr_high_patch
  378.         ld a,(hl)
  379.         xor getuser_scr_high_patchN
  380.         ld (hl),a
  381.         ld hl,getuser_scr_low_cur_patch
  382.         ld a,(hl)
  383.         xor getuser_scr_low_cur_patchN
  384.         ld (hl),a
  385.         ld hl,getuser_scr_high_cur_patch
  386.         ld a,(hl)
  387.         xor getuser_scr_high_cur_patchN
  388.         ld (hl),a
  389.  
  390.         ld a,1
  391. curscrnum=$+1
  392.         xor 0
  393.         ld ($-1),a
  394.         ret
  395.        
  396. changescrpg
  397. ;TODO убрать
  398.         ;jr $
  399.         call changescrpg_current
  400.         ;ld (curscrnum_physical),a
  401.         ld e,a
  402.         OS_SETSCREEN
  403.         ret
  404.  
  405.  
  406.  
  407. setShadowScreen
  408.         MSetShadowScreen
  409.         ret
  410.  
  411. _clear_screen
  412.         and 15
  413.         ld l,a
  414.         ld h,high colorMaskTable
  415.         ld e,(hl)
  416.         call setShadowScreen
  417.         ld hl,#4000
  418.         ld (hl),e
  419.         ld de,#4001
  420.         ld bc,#7fff
  421.         call _fast_ldir
  422. RestoreMemMap12
  423.         MRestoreMemMap12
  424.         ret
  425.  
  426. _swap_screen
  427.         push ix
  428.         push iy
  429.  
  430.         ld a,(spritesActive)
  431.         or a
  432.         push af
  433.         jr z,.noSpr0
  434.         call setShadowScreen
  435.         call updateTilesToBuffer
  436.         call prspr
  437. .noSpr0
  438.  
  439.         halt
  440.  
  441.         ld a,(_screenActive)
  442.         xor 2
  443.         ld (_screenActive),a
  444.         ;ld e,a
  445.  
  446.         ;ld a,#10
  447.         ;bit 1,e
  448.         ;jr z,$+4
  449.         ;or #08
  450.         ;ld bc,#7ffd
  451.         ;out (c),a
  452.          rra
  453.          and 1 ;+cpl?
  454.          ld e,a
  455.          OS_SETSCREEN
  456.  
  457.         pop af
  458.         jr z,.noSpr1
  459.  
  460.         call setShadowScreen
  461.         call respr
  462.         call updateTilesFromBuffer
  463.         ;MRestoreMemMap012
  464.         call RestoreMemMap3;0
  465.         call RestoreMemMap12
  466. .noSpr1
  467.         pop iy
  468.         pop ix
  469.         ret
  470.  
  471. pal_get_address
  472.         ld h,0
  473.         ld l,a
  474.         add hl,hl
  475.         add hl,hl
  476.         add hl,hl
  477.         add hl,hl
  478.          set 7,h
  479.          set 6,h
  480.  
  481.         ;ld bc,MEM_SLOT0
  482.         ld a,PAL_PAGE
  483.         ;out (c),a
  484.         SETPG32KHIGH
  485.         ret
  486.  
  487.  
  488.  
  489. _pal_select
  490.         call pal_get_address
  491.  
  492.         ld de,_palette
  493.         ld bc,16
  494.         ldir
  495.  
  496.         ld a,d
  497.         ld (_palChange),a
  498. RestoreMemMap3;0
  499.         ;ld bc,MEM_SLOT0
  500.         ld a,CC_PAGE3;0
  501.         ;out (c),a
  502.         SETPG32KHIGH
  503.         ret
  504.  
  505.  
  506.  
  507. _pal_bright
  508.         cp 7
  509.         jr c,.l1
  510.         ld a,6
  511. .l1
  512.         ld h,a
  513.         ld l,0
  514.         srl h
  515.         rr l
  516.         srl h
  517.         rr l
  518.         ld (_palBright),hl
  519.         ld a,1
  520.         ld (_palChange),a
  521.         ret
  522.  
  523.  
  524.  
  525. _pal_copy
  526.         push de
  527.         call pal_get_address
  528.  
  529.         ld de,palTemp
  530.         ld bc,16
  531.         ldir
  532.  
  533.         ;ld bc,MEM_SLOT0
  534.         ld a,CC_PAGE3;0
  535.         ;out (c),a
  536.         SETPG32KHIGH
  537.  
  538.         pop de
  539.         ld hl,palTemp
  540.         ld bc,16
  541.         ldir
  542.  
  543.         ret
  544.  
  545.  
  546. prspr
  547. respr
  548.         ;TODO
  549.         ret
  550.  
  551.  
  552. ;более быстрая версия ldir, эффективна при bc>12
  553. ;из статьи на MSX Assembly Page
  554. ;в отличие от нормального ldir портит A и флаги
  555.  
  556. _fast_ldir
  557. DOSorTFM=0
  558.         ifdef DOS
  559. DOSorTFM=1
  560.         endif
  561.         ifdef TFM
  562. DOSorTFM=1
  563.         endif
  564.        
  565.         if DOSorTFM
  566.         ldir
  567.         ret
  568.         else
  569.  
  570.         xor a
  571.         sub c
  572.         and 63
  573.         add a,a
  574.         ld (.jump),a
  575. .jump=$+1
  576.         jr nz,.loop
  577. .loop
  578.         dup 64
  579.         ldi
  580.         edup
  581.         jp pe,.loop
  582.         ret
  583.  
  584.         endif ;~DOSorTFM
  585.  
  586.         align 256       ;#nn00
  587. tileUpdateXTable
  588.         dup 8
  589.         db #01,#02,#04,#08,#10,#20,#40,#80
  590.         edup
  591. .x=0
  592.         dup 64
  593.         db .x>>3
  594. .x=.x+1
  595.         edup
  596.  
  597.  
  598.         align 256       ;#nn00
  599. colorMaskTable
  600.         db #00,#09,#12,#1b,#24,#2d,#36,#3f      ;для двух пикселей
  601.         db #c0,#c9,#d2,#db,#e4,#ed,#f6,#ff
  602.         db #00,#01,#02,#03,#04,#05,#06,#07      ;для ink
  603.         db #40,#41,#42,#43,#44,#45,#46,#47
  604.         ds 16,0
  605.         db #00,#08,#10,#18,#20,#28,#30,#38      ;для paper
  606.         db #80,#88,#90,#98,#a0,#a8,#b0,#b8
  607.  
  608.  
  609.         align 256
  610. _sprqueue
  611. _sprqueue0      ;формат 4 байта на спрайт, idh,idl,y,x (idh=255 конец списка)
  612.         ds 256,255
  613. _sprqueue1
  614.         ds 256,255
  615.  
  616.         align 256       ;#nn00
  617. scrTable
  618. adr=#4000
  619.         dup 25
  620.         db low adr
  621. adr=adr+(40*8)
  622.         edup
  623.         align 32        ;#nn20
  624. adr=#4000
  625.         dup 25
  626.         db high adr
  627. adr=adr+(40*8)
  628.         edup
  629.  
  630. tileUpdateMap   ;битовая карта обновившихся знакомест, 64x25 бит
  631.         ds 8*25,0
  632.  
  633.         include "int.asm"
  634.         include "lib_tiles.asm"
  635.  
  636. ;переменные
  637.  
  638. musicPage               db 0
  639. tileOffset              dw 0
  640. spritesActive   db 0    ;1 если вывод спрайтов разрешён
  641. tileUpdate              db 0    ;1 если выводились тайлы, для системы обновления фона под спрайтами
  642. palTemp                 ds 16,0
  643. keysPrevState   ds 40,0
  644.         ifdef TFM
  645. ;turboFM                        db 0    ;!=0 если есть TFM
  646.         else
  647. turboSound              db 0    ;!=0 если есть TS
  648.         endif
  649.  
  650. ;экспортируемые переменные
  651.  
  652.         macro rgb222 b2,g2,r2
  653.         db (((r2&3)<<4)|((g2&3)<<2)|(b2&3))
  654.         endm
  655.  
  656.         align 16
  657. _palette
  658.         rgb222(0,0,0)
  659.         rgb222(0,0,2)
  660.         rgb222(2,0,0)
  661.         rgb222(2,0,2)
  662.         rgb222(0,2,0)
  663.         rgb222(0,2,2)
  664.         rgb222(2,2,0)
  665.         rgb222(2,2,2)
  666.         rgb222(0,0,0)
  667.         rgb222(0,0,3)
  668.         rgb222(3,0,0)
  669.         rgb222(3,0,3)
  670.         rgb222(0,3,0)
  671.         rgb222(0,3,3)
  672.         rgb222(3,3,0)
  673.         rgb222(3,3,3)
  674.  
  675. ;_memSlot1
  676. ;curpg4000
  677. ;        db 0
  678. ;_memSlot2
  679. ;curpg8000
  680. ;        db 0
  681. ;_memSlot3
  682. ;curpgc000
  683. ;        db 0
  684.  
  685. _borderCol      db 0
  686. _palBright      dw 3<<6
  687. _palChange      db 1
  688. _screenActive   db 0    ;~1 или ~3
  689. _mouse_dx       db 0
  690. _mouse_dy       db 0
  691. _mouse_x        db 80
  692. _mouse_y        db 100
  693. _mouse_cx1      db 0
  694. _mouse_cx2      db 160
  695. _mouse_cy1      db 0
  696. _mouse_cy2      db 200
  697. _mouse_btn      db 0
  698. _mouse_prev_dx  db 0
  699. _mouse_prev_dy  db 0
  700. _time           dd 0
  701.  
  702.         export changescrpg
  703.        
  704. res_path
  705.         db "nedoload",0 ;в этом относительном пути будут лежать все загружаемые данные игры
  706. end        
  707.  
  708.         display "begin=",begin
  709.         display "end=",end
  710.         display "Size ",/d,end-begin," bytes"
  711.        
  712.         savebin "nedoload.com",begin,end-begin
  713.        
  714.         ;LABELSLIST "..\us\user.l"
  715.