?login_element?

Subversion Repositories NedoOS

Rev

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

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