Subversion Repositories NedoOS

Rev

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

  1. atm=1
  2.  
  3. ;ZX data:
  4. ;music=0;1
  5.  
  6. debug=0
  7. demorec=0
  8. demoplay=0;1
  9.  
  10. ;control:
  11. doublespeed=0;1
  12. doublerotate=1
  13. autostrafe=1
  14. kempston=0;1
  15. mouse=1
  16. mindist=118 ;max=111 ;111 излом ;120 застрял в дверях
  17.  
  18. colour=7
  19. ceilingcolour=0
  20. floorcolour=colour*9
  21.  
  22. showfps=0
  23. showscans=0
  24. crosshair=0
  25.  
  26. sprites=1;0
  27.  
  28. scale64=3;1
  29.  
  30. ;render:
  31. scrwid=32 ;chr$
  32. scrtopx=(32-scrwid)/2
  33.         if atm
  34. scrhgt=200;128 ;pixels
  35. scrhgtpix=scrhgt
  36. Ycenter=100
  37. Ytop=Ycenter-(scrhgt/2)
  38. Ybottom=Ycenter+(scrhgt/2)
  39. scrbase=0x4000+4
  40. scrtop=Ytop*40+scrbase
  41.         else
  42. scrhgt=16;24 ;chr$ (10,12,...,24)
  43. scrhgtpix=scrhgt*8
  44. scrtop=(24-scrhgt)*16+#4000+scrtopx
  45. attrtop=(scrtop/8)&0x300+(0xff&scrtop)+0x5800
  46. lowscrtop=#4800+scrtopx
  47. lowattrtop=(lowscrtop/8)&0x300+(0xff&lowscrtop)+0x5800
  48. lowscrhgt=8 ;chr$
  49. lowscrhgtpix=lowscrhgt*8
  50.         endif
  51.  
  52.         IF scale64
  53. maxscale=63
  54.  IF scale64-3 == 0
  55. lowmaxscale=28 ;fit in low screen
  56.  ELSE
  57. lowmaxscale=19 ;fit in low screen
  58.  ENDIF
  59.         ELSE
  60. maxscale=127
  61. lowmaxscale=25 ;fit in low screen
  62.         ENDIF
  63. mapdifbit=5;7
  64. lores=0
  65.         IF atm == 0
  66. optres=1&(1-lores) ;+22t на мелких, выигрыш на крупных
  67.         ELSE
  68. lores=1
  69. optres=0
  70.         ENDIF
  71. optfast=0
  72. loresspr=0|atm
  73. optresspr=1&(1-loresspr) ;выигрыш на крупных
  74. loresspr_hires=loresspr&(1-lores)
  75. pixperchr=8>>lores
  76. corr_coord=1
  77. interpolate=4;16;0
  78.  
  79. doublescr=1
  80.  
  81.         align 256
  82. distbuf;=#BA00 ;#300 ;ID,texx,dist
  83.         ds 0x300
  84. scrbuf=#6040
  85.         if atm == 0
  86. lowscrbuf=(scrhgtpix-lowscrhgtpix)/2+scrbuf
  87.         endif
  88. scrbufflag=scrbuf&#FF00+32
  89. dropline=scrhgt*8+(0xff&scrbuf) ;Y=192
  90. map=scrbuf-#3F ;+0 занят dropline, +32 занят флагом высоких
  91. mapend=map+#2000
  92. invmap=1
  93.  
  94.         if atm == 0
  95. tscale=#C000 ;128x64, множители 0 и 63 выдают константы 0 и 3
  96.              ;64x64 при scale64=1
  97.         endif
  98.  
  99. timer
  100.         dw 0
  101.  
  102.       IF atm
  103.        MACRO setpgfast pg
  104.         LD A,pg
  105.         setpgafast
  106.        ENDM
  107.        MACRO setpgafast
  108.         ;LD (curpg),A
  109.         ;LD BC,#FFF7
  110.         ;OUT (C),A
  111.         SETPG32KHIGH
  112.        ENDM
  113.       ELSE ;~atm
  114.        MACRO setpg pg
  115.         LD A,pg
  116.         setpgA
  117.        ENDM
  118.        MACRO setpgA
  119.         CALL SETPGA
  120.        ENDM
  121.        MACRO setpgfast pg
  122.         LD A,pg
  123.         setpgafast
  124.        ENDM
  125.        MACRO setpgafast
  126.         LD (curpg),A
  127.         LD BC,#7FFD
  128.         OUT (C),A
  129.        ENDM
  130.       ENDIF ;~atm
  131.      
  132.  
  133.  
  134. wascorrlogd
  135.         INCBIN "corlogd_"
  136.         ORG $-256
  137.        DUP 256
  138.         DB {$+(scrtopx*8)}&0xff
  139.        EDUP
  140.        IF lores
  141.         ORG $-256
  142. _=$
  143.        DUP 128
  144.         DB {_}&0xff
  145. _=_+2
  146.        EDUP
  147.         DS 128
  148.        ENDIF
  149. wasda
  150.         INCBIN "da"
  151.         ORG $-256
  152.        DUP 256
  153.         DB 0xff&({$}+128)
  154.        EDUP
  155.         ORG $-256
  156.        DUP 256
  157.         DB 0xff&({$+(scrtopx*8)})
  158.        EDUP
  159.        IF lores
  160.         ORG $-256
  161. _=$
  162.        DUP 128
  163.         DB {_}&0xff
  164. _=_+2
  165.        EDUP
  166.         DS 128
  167.        ENDIF
  168.  
  169.        IF showfps
  170. PRDIG
  171.         LD L,15
  172.         INC L
  173.         SUB C
  174.         jr NC,$-2
  175.         ADD A,C
  176.         PUSH AF
  177.         LD A,L
  178.         ADD A,A
  179.         ADD A,A
  180.         ADD A,A
  181.         INC A
  182.         LD L,A
  183.         LD H,#3D
  184.         PUSH DE
  185.         LD B,6
  186.         LD A,(HL)
  187.         ld (DE),A
  188.         INC L,D
  189.         DJNZ $-4
  190.         POP DE
  191.         POP AF
  192.         INC E
  193.         RET
  194.        ENDIF
  195.  
  196. TEXCODEGO
  197.        IF atm == 0
  198.         LD HL,0;-2
  199.         ADD HL,SP
  200.         LD (clscrbufsp),HL
  201.         LD (eorfillsp),HL
  202.        endif
  203.  
  204.        IF atm
  205.         call setpgmap4000
  206.        ENDIF
  207.         CALL RECMAP
  208.  
  209.         LD HL,tcos
  210. REtcos0
  211.        DUP 2;4
  212.         SRA (HL)
  213.        EDUP
  214.         INC L
  215.         jr NZ,REtcos0
  216.  
  217. ZXLOOP
  218.        if atm
  219.        call changescrpg
  220. ;        ld a,1
  221. ;curscreen=$+1
  222. ;        xor 1
  223. ;        ld (curscreen),a
  224. ;         add a,a
  225. ;         add a,a
  226. ;         add a,a
  227. ;         ld (imer_curscreen_value),a
  228.         ld hl,(timer)
  229.         ld (endoflastredrawtimer),hl
  230.        endif
  231.  
  232.        IF atm == 0
  233.         LD A,pgscale
  234.         CALL SETPG
  235.        ENDIF
  236.  
  237. ;------------------------
  238.        IF atm
  239.         call setpgmap4000
  240.        ENDIF
  241.         LD HL,(timer)
  242. oldtimer=$+1
  243.         LD BC,0
  244.         LD (oldtimer),HL
  245.         OR A
  246.         SBC HL,BC
  247.         jr Z,nONTIMER
  248.          ld bc,8
  249.          or a
  250.          sbc hl,bc
  251.          add hl,bc
  252.          jr c,ONTIMER0
  253.          ld h,b
  254.          ld l,c ;hl<=8
  255. ONTIMER0
  256.         PUSH HL
  257.         CALL CONTROL
  258.         POP HL
  259.         DEC HL
  260.         LD A,H
  261.         OR L
  262.         jr NZ,ONTIMER0
  263. nONTIMER
  264.        IF atm == 0
  265.        IF doublescr
  266.         LD A,#10
  267.         CALL SETPG
  268.        ENDIF
  269.        ENDIF
  270.        ;HALT
  271.         CALL SCAN
  272.  
  273.        IF doublescr
  274. ;ждать флаг ожидания готовности экрана (включается по прерыванию)
  275. ;иначе будет так:
  276. ;фрейм 1:
  277. ;видим экран0, рисуем экран1
  278. ;фрейм 2:
  279. ;видим экран0, закончили рисовать экран1, [вот тут нужно ожидание], начали рисовать экран0 (хотя его видим)
  280. ;фрейм 3:
  281. ;видим экран1
  282. ;готовность - это когда текущий таймер != таймер конца прошлой отрисовки
  283. ;проверяем оба таймера, а то могло случиться системное прерывание
  284. EmulatePPU_waitforscreenready0
  285.         ld hl,(timer)
  286. endoflastredrawtimer=$+1
  287.         ld de,0
  288.         or a
  289.         sbc hl,de
  290.         jr z,EmulatePPU_waitforscreenready0
  291.        ENDIF
  292.  
  293.        IF atm
  294. pgscalersnum=$+1
  295.         LD A,0
  296.         setpgafast
  297.        
  298. ;        LD A,2
  299. ;setpgs_scr_xor=$+1
  300. ;        XOR 2
  301. ;        LD ($-1),A
  302. ;setpgs_scr_low=$+1
  303. ;        XOR 0xff-1;#7F-pgattr1
  304. ;        ld (curscrpg_low),a
  305. ;       PUSH AF
  306. ;        SETPG16K
  307.        call getuser_scr_low
  308.        SETPG16K
  309.         CALL DWCLSALL
  310.         xor a;LD A,0
  311.         CALL DRAWWALLS
  312.        call getuser_scr_high
  313.        SETPG16K
  314. ;       POP AF
  315. ;setpgs_scr_high_xor_low=$+1
  316. ;        XOR 4;pgattr1^pgpix1
  317. ;        SETPG16K
  318.        
  319.         CALL DWCLSALL
  320.         LD A,1
  321.         CALL DRAWWALLS
  322.        IF sprites
  323.        CALL SCANMONS
  324.        CALL DRAWSPRITES
  325.        ENDIF
  326.  
  327.        ELSE ;~atm
  328.  
  329.         CALL CLSCRBUF
  330.         CALL DRAWWALLS
  331.         CALL CHECKHEIGHTS
  332.        IF sprites
  333.        CALL SCANMONS
  334.        CALL DRAWSPRITES
  335.        ENDIF
  336.        IF crosshair
  337.         CALL CROSSHAIR
  338.        ENDIF
  339.        IF doublescr
  340.         LD A,(curscr)
  341. newscr=$+1
  342.         CP 0
  343.         jr Z,nohalt
  344.         HALT ;if CPU is too fast
  345. nohalt
  346.         LD A,#17
  347.         CALL SETPG
  348.        ENDIF
  349.         CALL EORFILL
  350.        IF doublescr
  351.         LD A,(newscr)
  352.         XOR 8
  353.         LD (newscr),A
  354.        ENDIF
  355.        ENDIF
  356. ;-----------------------
  357.        IF showfps
  358.         LD HL,IMfps
  359.         INC (HL)
  360.        ENDIF
  361.        
  362. curkey=$+1
  363.         ld a,0
  364.         cp key_esc
  365.         jr z,ZXLOOPQUIT
  366.         cp key_redraw
  367.         call z,redraw
  368.        
  369.        ;LD A,0xfe
  370.        ;IN A,(0xFE)
  371.        ;rra ;caps shift
  372.        ;JP c,ZXLOOP
  373.        ;LD A,0x7F
  374.        ;IN A,(0xFE)
  375.        ;RRA ;space
  376.        ;JP NC,ZXLOOPQUIT
  377.        
  378.         jr ZXLOOP
  379. ZXLOOPQUIT
  380.         ret
  381.  
  382. redraw
  383.         xor a
  384.         ld (curkey),a ;чтобы redraw не повторялся
  385.         call redraw_cls
  386.         ld a,1
  387. redraw_cls
  388.         ld (curscrnum),a ;for interrupt
  389.         ld e,a
  390.         OS_SETSCREEN
  391.         ld e,0
  392.         OS_CLS
  393.         ret
  394.  
  395.         INCLUDE "WSCAN10.asm"
  396.         INCLUDE "WREND.asm"
  397.         INCLUDE "WCTRL.asm"
  398.  
  399. ;переменные рендера (обновляются в начале рендера)
  400. curXx
  401. curx    DB #80
  402. curX    DB #0
  403. curYy
  404. cury    DB #80
  405. curY    DB #0
  406. curxy   DW 0
  407. curyx   DW 0
  408. curYX   DW 0
  409. curangle
  410.         DW tsin
  411. demobegin
  412.        IF demoplay
  413.         INCBIN "demorec9"
  414.        ELSE
  415.         DB %00111111 ;all keys released
  416.        ENDIF
  417.  
  418.         ;DISPLAY "PROG END=",$
  419.  
  420.         align 256 ;DS .(-$)
  421. tables
  422. wastables
  423. shift=tables-$
  424. tlogd2sca=$+shift
  425.        IF scale64
  426.        IF scale64 == 3
  427.         INCBIN "logd2sc3"
  428.        ELSE
  429.         INCBIN "logd2sc2"
  430.        ENDIF
  431.        ELSE
  432.         INCBIN "logd2sc_"
  433.        ENDIF
  434. tsqr2=$+shift
  435.         INCBIN "sqr2int"
  436. tlogd=$+shift
  437.         INCBIN "logd"
  438. tcorrlogd=$+shift
  439.        DUP 256
  440.         DB {wascorrlogd+$-tcorrlogd}&0xff
  441.        EDUP
  442. tcos=$+shift
  443.         INCBIN "cos"
  444. tlogcos=$+shift
  445.         INCBIN "pluslcos"
  446. tda=$+shift
  447.        DUP 256
  448.         DB {wasda+$-tda}&0xff
  449.        EDUP
  450. tctg=$+shift
  451.         INCBIN "plusctg"
  452. tsin=$+shift
  453.         INCBIN "sin"
  454. tscaljps=$+shift
  455.         ds 256;INCBIN "scaljps"
  456. tID=$+shift
  457.         MACRO WALL pgnum,num2
  458.         DB pgnum,num2;-pgnum,num2
  459.         ENDM
  460.        DUP 64+16 ;skip and 0..15
  461.         WALL 0,#02
  462.        EDUP
  463.         MACRO PGWALL pgnum
  464.         WALL pgnum,#02
  465.         WALL pgnum,#42
  466.         WALL pgnum,#82
  467.         WALL pgnum,#C2
  468.         ENDM
  469.         PGWALL 0
  470.         PGWALL 1
  471.         PGWALL 2
  472.         PGWALL 3
  473.         PGWALL 4
  474.        DUP 64-16-20 ;?..63
  475.         WALL 0,#02
  476.        EDUP
  477. cursprites=$+shift
  478.         DS 256
  479. ltables=$-wastables
  480.  
  481. RECMAP
  482.         LD HL,WASMAP
  483.         LD DE,0x4000
  484.        PUSH DE
  485.         LD BC,szMAP
  486.         LDIR
  487.        POP HL
  488.         LD DE,level
  489.         LD BC,endlev-level
  490.         LDIR
  491.        
  492.           ld de,MONSTRS
  493.        
  494.        if atm
  495.        LD A,(YX+1) ;Y
  496.        SUB 0xA0
  497.        SUB map/256+31
  498.        CPL
  499.        LD (IMcurYy+1),A
  500.        LD A,(YX) ;X
  501.        INC A
  502.        LD (IMcurXx+1),A
  503.        endif
  504. INImons LD A,(HL)
  505.         LDI
  506.         AND (HL)
  507.         LDI
  508.         INC A
  509.         JR Z,INImonsQ
  510.         LD BC,6
  511.         LDIR
  512.         JR INImons
  513. INImonsQ ;
  514.        EXD
  515.        if atm
  516.         LD H,map/256+31
  517.        else
  518.         LD H,map/256
  519.        endif
  520.        IF invmap
  521.        LD L,map&0xff
  522.        LD C,1
  523.        JR GETMAPL
  524.        ENDIF
  525. GETMAP0
  526.        IF invmap
  527.         LD L,0xff&(map+32)
  528.        ELSE
  529.         LD L,map&0xff
  530.        ENDIF
  531.         LD C,2
  532. GETMAPL LD B,32;33
  533. GETMAP1 LD A,(DE)
  534.         INC DE
  535.         LD (HL),0
  536.         CP 13
  537.         JR Z,GETMCR
  538.        IF atm
  539.        jr NC,GMNRLE
  540.         LD A,(DE)
  541.         INC DE
  542.        DEC A
  543. GMRLE
  544.         INC L
  545.         LD (HL),0
  546.         DEC B
  547.         DEC A
  548.         jr NZ,GMRLE
  549.         LD A,32
  550. GMNRLE
  551.        ENDIF
  552.         CP 32
  553.         JR Z,GETMAPE
  554.        IF atm
  555.       CP 64    ;
  556.       jr NC,$+4  ;
  557.       ADD A,64 ;todo kill
  558.        ADD A,128-64
  559.        ELSE
  560.        SUB "1";+128
  561.       CPL
  562.       ADD A,A
  563.      CP -20
  564.      jr NC,$+4
  565.      LD A,-20
  566.        ENDIF
  567.        LD (HL),A
  568. GETMAPE INC L
  569.         DJNZ GETMAP1
  570.         JR GETMOK
  571. GETMCR  LD (HL),0
  572.         INC L
  573.         DJNZ GETMCR
  574. GETMOK
  575.        IF invmap
  576.        LD L,map&0xff
  577.        ENDIF
  578.         DEC C
  579.         jr NZ,GETMAPL
  580.        if atm
  581.         LD A,H
  582.         DEC H
  583.         CP map/256
  584.         JR NZ,GETMAP0
  585.        else
  586.         INC H
  587.         BIT 6,H
  588.         JR Z,GETMAP0
  589.        endif
  590.  
  591.         if invmap
  592.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  593. remons0
  594.         LD A,(HL) ;X
  595.          inc (hl)
  596.         INC A
  597.        jr Z,remonsq
  598.         ;ld a,0xff&(map+32+map+0)
  599.         ;sub (hl)
  600.         ;ld (hl),a ;???
  601.         INC L
  602.         inc L
  603.         LD A,(HL) ;Y
  604.        SUB 0xA0
  605.        SUB map/256+31
  606.        CPL
  607.         ld (hl),a
  608.         LD A,L
  609.         ADD A,6
  610.         LD L,A
  611.         JP NC,remons0
  612.         INC H
  613.         JP remons0
  614. remonsq
  615.         endif
  616.  
  617.        IF atm == 0
  618.         LD HL,#4000
  619.         CALL INICLS
  620.        IF doublescr
  621.         LD A,#17
  622.         CALL SETPG
  623.         LD HL,#C000
  624.         CALL INICLS
  625.        ENDIF        
  626.         XOR A
  627.         LD H,scrbuf/256
  628.         LD C,scrwid
  629. PRECLS  LD L,scrbuf&0xff
  630.         LD B,scrhgtpix
  631.         LD (HL),A
  632.         INC L
  633.         DJNZ $-2
  634.         INC H
  635.         DEC C
  636.         jr NZ,PRECLS
  637.        ENDIF
  638.  
  639.         LD BC,#FBDF
  640.         IN A,(C)
  641.         LD (mouseoldx),A
  642.         RET
  643.        
  644.        if atm==0
  645. INICLS
  646.         LD D,H
  647.         ld E,1
  648.         LD BC,#1800
  649.         LD (HL),L
  650.         LDIR
  651.         LD BC,767
  652.         LD (HL),colour
  653.         LDIR
  654.         RET
  655.        endif
  656.