Subversion Repositories NedoOS

Rev

Rev 583 | Rev 837 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

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