Login

Subversion Repositories NedoOS

Rev

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

;XECUTE MOUSE
;TAKE COORDINATES FROM CURPOS==MX

MOUSE   LD      HL,(COORD)
        LD      BC,#FBDF
        LD      DE,(OLDCO)
        IN      A,(C)
        LD      (OLDCO),A
        SUB     E
        JR      Z,NM_X
        JP      P,MX_PL
        ADD     A,L
        JR      C,ZER_X
        XOR     A
ZER_X   LD      L,A
        JR      NM_X
MX_PL   ADD     A,L
        JR      C,BEX_Z
        CP      248     ;MAXIMUM X
        JR      C,BEX_B
BEX_Z   LD      A,248   ;MAXIMUM X
BEX_B   LD      L,A
NM_X    LD      B,#FF
        IN      A,(C)
        LD      (OLDCO+1),A
        SUB     D
        JR      Z,NM_Y
        NEG
        JP      P,MY_PL
        ADD     A,H
        JR      C,ZER_Y
        XOR     A
ZER_Y   LD      H,A
        JR      NM_Y
MY_PL   ADD     A,H
        JR      C,BEY_Z
        CP      #BE     ;MAXIMUM Y
        JR      C,BEY_B
BEY_Z   LD      A,#BE   ;MAXIMUM Y
BEY_B   LD      H,A
NM_Y    LD      A,H
        CP      #FF
        JR      C,BIGY
        LD      H,#FF
BIGY    CP      #00     ;MINIMUM Y
        JR      NC,SMALY
        LD      H,#00   ;MINIMUM Y
SMALY   LD      A,L
        CP      #FF
        JR      C,DIRY
        LD      L,#FF
DIRY    CP      #00     ;MINIMUM X
        JR      NC,DIMENS
        LD      L,#00   ;MINIMUM X
DIMENS  LD      (COORD),HL
        LD BC,#FADF
        LD HL,CONTRB
        IN A,(C)
        CPL
        AND 7
        RLCA
        RLCA
        RLCA
        RLCA
        OR (HL)
        LD (HL),A
        RET

;========================Мeнeджер памяти========
        if 1==1
MEM_kungs
MEM_snd LD A,3 ;страница с эффектами
        JR MEM
        endif
MEM_humans
MEM4    LD A,4
        JR MEM
MEM_char1 ;креат 25-26
MEM0    XOR A
        JR MEM
MEM1    LD A,1
        JR MEM
MEM_char0 ;креат 18-24
MEM6    LD A,6
        JR MEM
MEM7    LD      A,7
MEM    
        if 1==1
        ;OR     %11000
         jp _128
        else
        OR      %11000
_128    LD      BC,#7FFD
        LD      (R128),A
        OUT     (C),A
        RET
        endif

;--------scr сlr/mov
OFFD    LD      DE,DSCR+#1AFE
        JR      offx

;TODO убрать в EGA
OFFS    CALL    MEM7
        LD      DE,SCR+#1AFE
offx    PUSH DE
        POP HL
        INC HL
        LD      BC,768
        LD      (HL),0
        LDDR
        LD      BC,6143
        LD      (HL),255
        LDDR
        RET

COPY     ;копир.экр
        if EGA
        ret
        else
        LD      BC,6144
CY_     LD      HL,DSCR
        LD      DE,SCR
        LDIR
        RET

COPYAT  LD      BC,6912
        JR CY_
        endif

;поиск по таблицам

WT      RLCA
        ADD     A,L
        LD      L,A
        JR      NC,WT_
        INC     H
WT_     LD      A,(HL)
        INC     HL
        LD      H,(HL)
        LD      L,A
        RET


BT      PUSH    HL
        ADD     A,L
        LD      L,A
        JR      NC,BT_
        INC     H
BT_     LD      A,(HL)
        POP     HL
        RET


DA      ADD A,A
WA      ADD A,A
BA      ADD A,L
        LD L,A
        LD A,(HL)
        RET NC
        INC H
        LD A,(HL)
        RET

;-----W_GrLib-------------------------------
;PUTsHL DEFW 0
;SCRADR DEFB SCR/256
;ATRADR DEFB #D8
;FONT   DEFW WFONT

PCOORD
;de(0-191,0-255) -- hl
        if EGA
        ;jr $
        ld a,e ;x
        srl a
        push bc
        ld c,d ;y
        ld b,0
        ld l,c ;y
        srl a ;x bit 0
        ;ld h,0x40/32/2
        ;jr nc,$+4 ;x bit 0
        ; ld h,0x80/32/2
         ld h,b;0
         rl h
         inc h ;0x40/32/2 или 0x80/32/2
        srl a ;x bit 1
         rl h
        add hl,hl
        add hl,hl
        add hl,bc
        add hl,hl
        add hl,hl
        add hl,hl ;y*40+scrbase
         add a,scrbase&0xff
;a=x/4
        add a,l
        ld l,a
        adc a,h
        sub l
        ld h,a ;hl=scr ;не может быть переполнения при отрицательных x? maxhl = 199*40 + 127 = 8087
        pop bc
        ret
       
        else
        LD      A,D
        RRCA
        RRCA
        RRCA
        LD      L,A
        AND     %00011000
        LD      H,A
        LD      A,D
        AND     %00000111
        ADD     A,H
        LD      H,A
        LD      A,(SCRADR)
        ADD     A,H
        LD      H,A
        LD      A,L
        LD      L,E
        RRA
        RR      L
        RRA
        RR      L
        RRA
        RR      L
        RET
        endif ;~EGA


SCOORD  LD      A,(SCRADR) ;de(0-23,0-31)--hl
        ADD     A,D
        AND     %11111000
        LD      H,A
        LD      A,D
        RRCA
        RRCA
        RRCA
        AND     %11100000
        OR      E
        LD      L,A
        RET

STD     LD      A,DSCR/256 ;выбор тенев.экрана
        JR      SELSCR
STS     LD      A,SCR/256 ;выб.осн.экр
SELSCR  LD      (SCRADR),A ;A-screen address
        ADD     A,#18
        LD      (ATRADR),A; A-attr address
        RET

ACOORD  LD A,L ;коорд атр HL->HL
        RLA
        RLA
        RLA
        SRL H
        RRA
        SRL H
        RRA
        SRL H
        RRA
        LD L,A
        LD A,(ATRADR)
        ADD A,H
        LD H,A
        RET

ATRBAR  ;HL - adr in scr; BC-size(yx) ;E-COLOR
        if EGA
;TODO
        ret
        else
        CALL ACOORD
ATRBA0  LD D,L
        LD A,C
ATRBA1  LD (HL),E
        INC L
        DEC A
        JR NZ,ATRBA1
        LD A,D
        ADD A,32
        LD L,A
        JR NC,ATRBA2
        INC H
ATRBA2  DJNZ ATRBA0
        RET
        endif

        if EGA==0
PUTSYM
;HL - adr in scr; DE-adr spr; BC-size(yx)
        PUSH DE
        EX DE,HL
        CALL SCOORD
        LD (PUTsHL),HL
        POP HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        LD (SET_SP+1),SP
        LD SP,HL
        LD HL,(PUTsHL)
        LD A,B
YS2     LD (PUTsHL),HL
        EX AF,AF
YS0     LD (HL),E
        INC H
        LD (HL),D
        INC H
        POP DE
        LD (HL),E
        INC H
        LD (HL),D
        INC H
        POP DE
        LD (HL),E
        INC H
        LD (HL),D
        INC H
        POP DE
        LD (HL),E
        INC H
        LD (HL),D
        INC H
        POP DE
        LD A,L
        ADD A,32
        LD L,A
        JR C,YS1
        LD A,H
        SUB 8
        LD H,A
YS1     DJNZ YS0
        LD HL,(PUTsHL)
        INC L
        EX AF,AF
        LD B,A
        DEC C
        JR NZ,YS2
YSR     JP SET_SP
        endif

;-------------------------------КОНЕЦ W_Gr.Lib

PRINTS  ;печать строки HL(конец 127)
        LD A,(HL)
        CP #7F
        RET Z
        CALL PRINT
        INC HL
        JR PRINTS

PRINT   ;печать символа А в поз DE(yx)
        PUSHs
        if EGA
        call prchar
        else
        LD C,A
        CALL SCOORD
        EX DE,HL
        LD A,C
        ADD A,A
        LD BC,(FONT)
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,BC
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        endif
        POPs
        INC E
        RET

        if 1==0
t5inc   LD HL,tst5B ;[**]
        LD B,tst5E-tst5B
t5inc0  INC (HL)
        INC HL
        DJNZ t5inc0
        RET
        endif

;--------РАБОТА С КУРСОРОМ---

MMOV    ;обр.управл
        CALL CONTR
        LD BC,#BFFE ;'Enter' || 'x'
        IN A,(C)
        RRA
        JR NC,eMOV
        LD B,#FE
        IN A,(C)
        BIT 2,A
        JR Z,eMOV
        XOR A
        LD (BENTER),A
_422    LD A,(CONTRB)
        LD D,A
        AND #20 ;'Caps' || R.butt?
        LD E,A
        LD BC,#FEFE
        IN A,(C)
        AND 1
        OR E
        LD (BCAP),A
        LD      C,D
        LD      DE,(ENDX)  ;move
        LD      B,D
        LD      HL,(MX)
        LD      (MXOLD),HL
        RR      C
        JR      NC,_1
        LD      A,L
        ADD     A,B
        JR      C,_11A
        CP      E
        JR      C,_11B
_11A    LD      A,E
_11B    LD      L,A
        LD      D,0
_1      RR      C
        JR      NC,_2
        LD      A,L
        SUB     B
        JR      NC,_21
        XOR     A
_21     LD      L,A
        LD      D,0
_2      RR      C
        JR      NC,_3
        LD      A,H
        ADD     A,B
        CP      189
        JR      C,_31
        LD      A,189
_31     LD      H,A
        LD      D,0
_3      RR      C
        JR      NC,_4
        LD      A,H
        SUB     B
        JR      NC,_41
        XOR     A
_41     LD      H,A
        LD      D,0
_4      LD      (MX),HL
        LD      A,D
        OR      A
        LD      A,step_B ;нач шаг
        JR      NZ,_42
        LD      A,(MtSTEP)
        LD      DE,(M_STEP)
        ADD     A,1
        CP      E
        JR      C,_42
        LD      A,E
_42     LD      (MtSTEP),A
        RET
eMOV    LD A,1
        LD (BENTER),A
        LD A,(isMAP)
        OR A
        LD A,0
        JR Z,_42
        CALL MEM7
        CALL MAPwin
        CALL MX3PX
        CALL movWIN
        CALL MAPwin
        JP _422

B_OFF   LD HL,B_ONOF
        LD A,(HL)
        OR A
        RET Z
        LD (HL),0
        LD HL,(BATR)
        LD DE,B_ABUF
        LD A,(DE)
        INC DE
        LD (HL),A
        LD HL,(BADR)
        LD B,8
B_o1    LD A,(DE)
        LD (HL),A
        INC DE
        INC H
        DJNZ B_o1
        RET

B_IMGM  DEFB #55,#81,#19,#BD,#3D,#99,#01,#FF

;курсор скролла? TODO!!!
BL_ONN  EXX
        LD A,(BY)
        CP B
        JR NZ,_BL
        PUSH BC
        LD HL,(BX) ;модиф B_ONN
        LD (BXOLD),HL
        PUSH HL
        CALL STS
        CALL ACOORD
        LD (UATR),HL
        LD A,(HL)
        LD (U_ABUF),A
        LD A,(COLRsc)
        LD (HL),A
        POP DE
        CALL SCOORD
        LD (UADR),HL
        LD DE,U_BUF
        LD BC,B_IMGM
        LD A,8
B_n4    PUSH AF
        LD A,(HL)
        LD (DE),A
        LD A,(BC)
        LD (HL),A
        INC H
        INC BC
        INC DE
        POP AF
        DEC A
        JR NZ,B_n4
        POP BC
_BL     EXX
        RET

B_U2B   LD HL,BY
        LD DE,UBY
        LD BC,14
        LDIR
        LD A,1
        LD (B_ONOF),A
        RET

B_SET0  EXX
        LD B,-1
        EXX
        RET

B_SETI  EXX
        LD B,26
        EXX
        CALL B_NXTI
B_NXTI  EXX
        DEC B
        LD A,(UBY)
        SUB -2
        JR b_n_

B_SETN  EXX
        LD B,-3
        EXX
        CALL B_NXTN
B_NXTN  EXX
        INC B
        LD A,(UBY)
        SUB 2
b_n_    SUB B
        JR NZ,_BL
        PUSH BC
        CALL B_OFF
        POP BC
        EXX
        RET

B_NXT0  EXX
        INC B
        LD A,(UBY)
        JR b_n_

        if 1==0
t5dec   LD HL,tst5B ;[**]
        LD B,tst5E-tst5B
t5dec0  DEC (HL)
        INC HL
        DJNZ t5dec0
        RET
        endif

BMOV    LD HL,(MX) ;преобр MX->BX->PX
           INC L
           INC L ;коррекц
        SRL L
        SRL L
        SRL L
        SRL H
        SRL H
        SRL H
        LD (BX),HL
        LD A,(isMAP)
        OR A
        JR NZ,mB1
        SRL L
        SRL H
        LD DE,(X0)
        ADD HL,DE
        LD (PX),HL
        RET
mB1     CALL MX3PX
        LD (PX),BC
        RET

        if 1==0
tst5B   DEFB 1+#AF      ;0:0076 TST#5   XOR A [**]
        DEFB 1+#21,1+#00,1+#C0  ;0:0077     LD HL,#C000
        DEFB 1+#01,1+#00,1+#34  ;0:0078     LD BC,#3400
        DEFB 1+#96      ;0:0079 tst50   SUB (HL)
        DEFB 1+#07      ;0:0080         RLCA
        DEFB 1+#23      ;0:0081         INC HL
        DEFB 1+#0D      ;0:0082         DEC C
        DEFB 1+#20,1+#FA        ;0:0083           JR NZ,tst50
        DEFB 1+#05      ;0:0084         DEC B
        DEFB 1+#20,1+#F7        ;0:0085           JR NZ,tst50
        DEFB 1+#21,1+#AF,1+#F4  ;0:0086     LD HL,#F4AF
        DEFB 1+#BE      ;0:0087         CP (HL)
tst5E   RET
        endif

MX3PX   LD HL,(MX) ;MX/3->PX
           INC L
           INC L
        LD E,L
        LD L,3
        CALL DIVB
        LD A,E
        CP 64
        JR C,mB2
        LD A,63
mB2     LD C,A
        LD E,H
        CALL DIVB
        LD B,E
        RET

        if 1==0
        PUSH HL
_TST#5  LD A,(isTST5) ;[**]
        OR A
        RET Z
        CALL t5dec
        CALL tst5B
        PUSH AF
        CALL t5inc
        XOR A
        LD (isTST5),A
        POP AF
        RET Z
        POP HL
        CALL OFFD
        endif