?login_element?

Subversion Repositories NedoOS

Rev

Rev 1542 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. INIMOUS
  2. ;TODO для ATM читать начальные координаты мыши
  3.        if !ATM
  4. ;при проверке наличия мыши требует память 0xb8b9..0xbb00
  5.         EI
  6.         HALT
  7.         LD HL,#BA00
  8.         PUSH HL
  9.         POP DE
  10.         INC E
  11.         LD B,E
  12.         ld C,L
  13.         LD (HL),#B9
  14.         LD A,H
  15.         LDIR
  16.         DEC (HL)
  17.         LD HL,#C9AF
  18.         LD (#B9B8),HL
  19.         LD (#B8B9),HL
  20.         LD I,A
  21.         IM 2
  22.         EI
  23.         HALT ;test databus == 0xff
  24.         IM 1
  25.         LD A,#80
  26.         OUT (127),A
  27.         JR NZ,NOMOUSE ;databus != 0xff
  28.        LD A,-1
  29.         LD BC,0xfadf
  30.         IN C,(C)
  31.         LD A,0xfb
  32.         IN A,(#DF)
  33.         LD B,A
  34.         LD (OLDXmouse),A
  35.         LD A,0xff
  36.         IN A,(#DF)
  37.         LD (OLDYmouse),A
  38.         CP B
  39.         RET NZ
  40.         CP C
  41.         RET NZ
  42. ;all 3 mouse ports equal => no mouse
  43. NOMOUSE
  44.         ld hl,0x003e
  45.         ld (mouseXportreadpatch),hl
  46.         ld (mouseYportreadpatch),hl
  47.         ;LD A,62
  48.         ;LD (OLDX-2),A
  49.         ;LD (OLDY-2),A
  50.         ;XOR A
  51.         ;LD (OLDX-1),A
  52.         ;LD (OLDY-1),A
  53.        endif
  54.         RET
  55.  
  56. ;onint
  57. MOUSE
  58. nokeytimer=$+1
  59.         ld a,0;-1 ;счётчик фреймов, где не использовалось управление
  60.         inc a
  61.         jr nz,$+3
  62.         dec a
  63.         ex af,af' ;'
  64.         CALL INKEY
  65.        ld a,b
  66.        ld (cursorkeys),a
  67.         LD A,C
  68. MOUSEx=$+1
  69.         LD HL,maxXwin/2
  70. MOUSEy=$+1
  71.         LD B,waterYwin+4
  72. ARVEL=$+1
  73.         LD DE,0
  74. KEY=$+1
  75.         CP 0
  76.         LD (KEY),A
  77.         call nz,resetnokeytimer
  78.     ;корректируем скорости
  79.         RRA
  80.         RRA
  81.         CPL
  82.         ;JR NZ,MANTORM
  83.         AND 15
  84.         JR NZ,MANnTORMOZ
  85.         LD A,128 ;(a&15) == 0
  86.         CP D
  87.         JR NC,$+3
  88.         INC D
  89.         SRA D
  90.         call nz,resetnokeytimer
  91.         CP E
  92.         JR NC,$+3
  93.         INC E
  94.         SRA E
  95.         call nz,resetnokeytimer
  96. MANnTORMOZ
  97.         RRA
  98.         JR nc,$+3
  99.         dec D
  100.         RRA
  101.         JR nc,$+3
  102.         inc D
  103.         RRA
  104.         JR nc,$+3
  105.         inc E
  106.         RRA
  107.         JR nc,$+3
  108.         dec E
  109.     ;корректируем X
  110.         LD A,0xfb
  111. mouseXportreadpatch=$
  112.         IN A,(#DF)
  113. OLDXmouse=$+1
  114.         LD C,0
  115.         LD (OLDXmouse),A
  116.         SUB C
  117.         call nz,resetnokeytimer
  118.         ADD A,E
  119.         LD E,A
  120.         JP Z,MXQQ
  121.         JP P,MXP
  122. ;dx<0
  123.       ; SRA A
  124.        PUSH BC
  125.        LD C,A
  126.        LD B,-1
  127.        ADD HL,BC
  128.        POP BC
  129.        ;ADD A,L
  130.         jr C,MXQ
  131.        CALL MXZRO
  132.        LD HL,0
  133.        ;CALL NC,MXZRO
  134.         JR MXQ
  135. MXP   ; DEC A
  136.       ; SRL A
  137.        ;SUB -8
  138.        PUSH BC
  139.        LD C,A
  140.        LD B,0
  141.        ADD HL,BC
  142.        LD BC,maxXwin
  143.        SBC HL,BC
  144.        ADD HL,BC
  145.        POP BC
  146.        jr C,MXQ ;x<maxXwin
  147.        CALL MXZRO
  148.        LD HL,maxXwin
  149.        ;ADD A,L
  150.        ;CALL C,MXZRO
  151.        ;SUB 8
  152. MXQ    ;LD L,A
  153. MXQQ
  154.     ;корректируем Y
  155.         LD A,0xff
  156. mouseYportreadpatch=$
  157.         IN A,(#DF)
  158. OLDYmouse=$+1
  159.         LD C,0
  160.         LD (OLDYmouse),A
  161.         SUB C
  162.         call nz,resetnokeytimer
  163.         SUB D
  164.         JR Z,MYQQ
  165.         CPL
  166.         JP M,MYP
  167.       ; SRA A
  168.         ADD A,B
  169.         JR C,MYQ
  170.         XOR A
  171.         LD D,A
  172.         JR MYQ
  173. MYP   ; INC A
  174.       ; SRA A
  175.         ADD A,B
  176.         CP maxYwin;/2;64
  177.         JR C,MYQ
  178.         XOR A
  179.         LD D,A
  180.         LD A,maxYwin;/2;64
  181. MYQ     LD B,A
  182. MYQQ    LD A,B
  183.         LD (MOUSEy),A
  184.         LD (ARVEL),DE
  185.  
  186.        ex af,af' ;' ;a=счётчик фреймов, где не использовалось управление
  187.        ld (nokeytimer),a ;счётчик фреймов, где не использовалось управление
  188.  
  189.        if STICKMOUSEXTOGRID
  190. ;TODO отключать во время полёта снаряда, не получится через манипуляцию nokeytimer
  191.         or a
  192.         jr z,Mouse_stickskip ;управление использовалось
  193.         ld a,l
  194.         and 7
  195.         jr z,Mouse_stickskip;Mouse_stickdomoveq ;уже прилипли к сетке
  196. mouse_oldmdx=$+1
  197.         ld a,0 ;последний -dx, не равный 0
  198.         rla
  199.         inc hl
  200.         jr c,Mouse_stickdomoveq ;old dx>=0
  201.         dec hl
  202.         dec hl
  203. Mouse_stickskip ;управление использовалось
  204.         ld a,(MOUSEx)
  205.         sub l
  206.         jr z,Mouse_stickdomoveq
  207.         ld (mouse_oldmdx),a
  208. Mouse_stickdomoveq
  209.        endif
  210.  
  211.         LD (MOUSEx),HL
  212.         RET
  213.  
  214. resetnokeytimer
  215.        ex af,af' ;'
  216.         xor a ;счётчик фреймов, где не использовалось управление
  217.        ex af,af' ;'
  218.         ret
  219.  
  220. MXZRO
  221.         XOR A
  222.         SUB E
  223.         JP P,$+4
  224.         INC A
  225.         SRA A
  226.         LD E,A
  227.        ;XOR A
  228.         RET
  229.  
  230. INKEY
  231.         ld bc,0xffff
  232.         LD A,0xbf
  233.         IN A,(-2)
  234.         RRA
  235.         JR C,$+4
  236.         RES 1,b ;enter
  237.         LD A,0x7f
  238.         IN A,(-2)
  239.         CPL
  240.         AND 31
  241.         jr z,$+4
  242.         RES 0,b ;space
  243.         ld a,0xdf
  244.         IN A,(-2)
  245.         RRA
  246.         JR C,$+4
  247.         RES 4,C ;P
  248.         RRA
  249.         JR C,$+4
  250.         RES 5,C ;O
  251.         LD A,-5
  252.         IN A,(-2)
  253.         RRA
  254.         JR C,$+4
  255.         RES 2,C
  256.         LD A,-3
  257.         IN A,(-2)
  258.         RRA
  259.         JR C,$+4
  260.         RES 3,C
  261.         ld a,0xfe
  262.         in a,(0xfe)
  263.         rra
  264.         jr nc,INKEY_cursor
  265.         ld a,0xef
  266.         IN A,(0xfe)
  267.         RRCA
  268.         RLA
  269.         RLA
  270.         OR #C3
  271.         and c
  272.         LD C,A ;11LRDU11
  273.         ret
  274. INKEY_cursor
  275.         ld a,0xf7
  276.         in a,(0xfe)
  277.         bit 4,a ;5=L
  278.         jr nz,$+4
  279.         res 5,b
  280.         ld a,0xef
  281.         IN A,(0xfe) ;DUR??
  282.         bit 2,a
  283.         jr nz,$+4
  284.         res 4,b
  285.         rra
  286.         or 0xf3
  287.         and b
  288.         ld b,a ;11LRDUef cursor
  289.         ret
  290.