; Нужные остатки кода из "Primit1.asm"

Primitiv_code


;SNP_MODE DB 0

;RCOD    LD A,H
;        LD H,L
;        LD L,A
;        RET

LINE
         ; de -first pixel , bc -last pixel
        ld l,c
        ld h,b
        ex de,hl

        ; Bresenham's line algorithm
        ; de - first pixel , hl - last pixel

.lineB  call .plot  ; вывод начальной точки
.lineN
        push hl
        or a
        sbc hl,de         ; проверяем на нулевую длину
        pop hl
       ret z

.noequ        ; de - y0x0 , hl - y1x1

        ld a,l
        ld l,#1C   ; inc e
        sub e      ;dx x1-x0
       jr nc, 1F
        neg
        inc l      ; l=#1D - dec e : dx<0  (.Xstep)
1
        ld b,a       ; b = |x1-x0|   (.dX)

        ld a,h
        ld h,#14   ; inc d
        sub d      ; dy y1-y0
       jr nc, 1F
        neg
        inc h     ; h=#15 - dec d : dy<0   (.Ystep)
1
        ld c,a     ; c =  |y1-y0|    (.dY)

        cp b        ; dx > dy ведём линию по X , dy > dx ведём линию по Y
       jr c,1F
        ld c,b      ; меняем местами X и Y
        ld b,a
        ld a,h
        ld h,l
        ld l,a
        ld a,c
1
        ld (.dERR),a
        ld a,b
        ld (.dM),a
        ld a,l
        ld (.Step1),a
        ld a,h
        ld (.Step2),a


        ld hl,0     ; err- проверка ; de - y0x0
.loopln
        push bc

.Step1   inc e       ;Xstep x=x+1  / x=x-1 / y=y+1 / y=y-1
         ld bc,0

.dERR  EQU $-2        ;dERR   dY or dX
         add hl,bc    ; err=err+dY or err+dX
1
         ld bc,0
.dM EQU $-2           ; dX or dY
        bit 7,h
       jr nz,1F
        push hl
         add hl,hl
         or a
         sbc hl,bc
        pop hl
       jr c,1F      ; if (err*2 < dM) goto 1F
        sbc hl,bc   ; err = err-dM
.Step2  inc d       ;Ystep y=y+1  / y=y-1 / x=x+1 / x=x-1
1
        call .plot
        pop bc
      djnz .loopln
        ret

.plot                      ; вход de: e=y , d=x (иногда e=x, d=y)
        push hl,de,bc
        call PLOT_SNP      ; вывод точки меняется от условий
.plotADR EQU $-2
        pop bc,de,hl
        ret


PLOTT   EQU     #BC00

INSTALL_PLOT
        XOR A
        LD (FLAGOBJ),A
.i
        LD HL,PLOTT
        LD DE,#4000
install_plot
        LD B,E
        LD C,#80
        LD HX,4
L_3     LD LX,8
L_2     LD A,8
L_1     LD (HL),E
        INC H
        LD (HL),D
        INC H
        LD (HL),B
        INC H
        LD (HL),C
        RRC C
        DEC H
        DEC H
        DEC H
        INC HL
        INC D
        DEC A
        JR NZ,L_1
        INC B
        LD A,B
        AND 31
        LD B,A
        LD A,D
        SUB 8
        LD D,A
        LD A,E
        ADD A,#20
        LD E,A
        DEC LX
        JR NZ,L_2
        LD A,D
        ADD A,8
        LD D,A
        DEC HX
        JR NZ,L_3
        RET

SET_SNP LD (PLOT_SNP+1),HL
        RET

PLOT_SNP JP PLOT

;PLOT_C  LD A,E
;        CP 192
;        RET NC
;        PUSH DE
;        DUP 3
;        SRL D
;        SRL E
;        EDUP
;        CALL RASCHA_
;        LD A,(HL)
;        CALL MIXCOL
;        LD (HL),A
;        POP DE
Plot_XA   rra
         ret c
PLOT    LD A,E
        CP 192
        RET NC
plott   LD L,E
        LD H,high PLOTT
        LD A,(HL)
        INC H
        LD B,(HL)
        INC H
        LD L,D
        ADD A,(HL)
        LD C,A
        INC H
        LD A,(BC)
;modepl  OR (HL)
;        NOP
;        LD (BC),A
;        RET
        ld l,(hl)
       jp modeplt
aplottout EQU $-2
plottout    ld a,l
            ex af,af'   ; маска точки
            ld h,b
            ld a,c
            rra
            rl h
            xor h
            and #10
            xor h
            and #1F
            add a,low DMSKbuff
.lowBFbyte EQU $-1
            ld l,a
            ld h,high DMSKbuff  ; high DMSKbuff = high TxBUFF
            ld a,(hl)    ; байт пикс. маски
.msi_and     nop   ; nop/cpl инверсия маски при сите и and plottout
            ld l,a
            ex af,af'
            ld (.msi__),a
            and l
            ld l,a       ; маска точки
            ld a,(bc)
           jp modeplt
.mSjpAdr   EQU $-2

.mSieve     ld h,a
            and 1
.msi__  EQU $-1
             cpl
             or l
             and h    ; сито сделано

modeplt      or l
             nop
             ld (bc),a
            ret

PLOT_C  ld a,e
        cp 192
       ret nc
        call PLOT
        ld a,b
        rra
        rra
        rra
        and 3
        or #58
        ld b,a
        ld a,(bc)
        call MIXCOL
        ld (bc),a
       ret


;MODE_PL LD A,(SNP_MODE)
;        AND A
;        JR Z,OR_PL
;        DEC A
;        JR Z,XOR_PL
;        DEC A
;        JR Z,AND_PL
;        LD HL,#0000
;        JR or_pl_

;OR_PL   LD HL,#00B6
;        XOR A
;or_pl   LD (GMODE),A
;or_pl_  LD (modepl),HL
;        RET
;XOR_PL  LD HL,#AE00
;        LD A,1
;        JR or_pl
;AND_PL  LD HL,#AEB6
;        LD A,2
;        JR or_pl

SET_PL_MODE  ; in a = 0-xor, 1-or, 2-and, 3-nop
             ld hl,XOR_PL
             ld c,a ;все по 5 байтов используем выборку по 5
             add a,a
             add a,a
             add a,c  ; *5
             ld c,a
             ld b,0
             add hl,bc
            jp (hl)
XOR_PL   ld hl,#00AD  ; [xor l:nop]
        jr 1F
OR_PL    ld hl,#00B5  ; [or l : nop]
        jr 1F
AND_PL   ld hl,#ADB5  ; [or l:xor l]
        jr 4F
NOP_PL   ld hl,#0000  ; [nop:nop]
1        push de,bc
         call 1F
         pop bc,de
        ret
1        ld c,0        ; [nop]
2        ld de,plottout.mSieve
         ld a,(Sieve)
         or a
        jr nz,3F
         ld de,modeplt
3        ld (modeplt),hl
         ld (plottout.mSjpAdr),de
         ld a,c
         ld (plottout.msi_and),a
        ret
4        ld a,(Sieve)
         or a
        jr z,1B
         ld c,#2F   ; [cpl]
         ld h,0     ; 0 or #AD  [nop or xor l]
ANDplEqAD_  EQU $-1
        jr 2B



; X1    DB 0   ; теперь в 'Selectbox.asm' встроены в код для экономии /DA v 4.0d
; X2    DB 0
; Y1    DB 0
; Y2    DB 0


;GET_BIGX
;        LD A,D
;        CP B
;        JR C,dbigx
;        LD A,B
;        LD B,D
;        LD D,A
;dbigx   LD A,B
;        LD (X1),A
;        LD A,D
;        LD (X2),A
;        RET

;GET_BIGY
;        LD A,E
;        CP C
;        JR C,dbigy
;        LD A,E
;        LD E,C
;        LD C,A
;dbigy   LD A,C
;        LD (Y1),A
;        LD A,E
;        LD (Y2),A
;        RET

;-------------------------------------------------------------

SQRT    LD A,H       ;HL = SQRT (HL)
        OR L         ;ВЫЧИСЛЯЕМ КВАДРАТНЫЙ КОРЕНЬ,
        RET Z        ;ИСПОЛЬЗУЯ ПРИ ЭТОМ ВСЕГО ОДНО ДЕЛЕНИЕ!
        LD D,H       ;(C) CARDINAL/PGC/BDA
        LD E,L
        LD BC,#E000
        ADD HL,BC
        JR C,SQRT2
        LD H,D
        LD L,E
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        LD B,12
SQRTL   ADD HL,HL
        JR C,SQRT1
        DJNZ SQRTL
        LD HL,1
        RET
SQRT2   XOR A
        ADD HL,BC
        JR NC,SQRT3
        INC A
        JP SQRT2+1
SQRT3   LD HL,TABL1
        LD C,A
        JP SQRT1+4
SQRT1   LD HL,TABL
        LD C,B
        LD B,0
        ADD HL,BC
        LD C,(HL)
SQRT_   PUSH BC
        CALL Div
        EX DE,HL
        POP BC
        ADD HL,BC
        SRL H
        RR L
        RET

TABL    DEFB 2,2,2,3,5,7,10,14,19,27,39,55,77
TABL1   DEFB 109,142,169,192,212,231,248
;----------------------------------------------
                              ; v3.12
X2dehl   ; dehl=2*dehl
          add hl,hl
          rl e
          rl d
         ret

dehlADDbc  ; dehl=dehl+bc ; bc saved
           add hl,bc
          ret nc
           inc de
          ret

dehlSUBaAbc             ; dehl=dehl-aa'bc
              or a
              sbc hl,bc
              ld b,a
              ex af,af'
              ld c,a
              ex af,af'   ; возврат fc
              ex de,hl
              sbc hl,bc
              ex de,hl
             ret

dehlADDaAbc             ; dehl=dehl+aa'bc
              add hl,bc
              ld b,a
              ex af,af'
              ld c,a
              ex af,af'   ; возврат fc
              ex de,hl
              adc hl,bc
              ex de,hl
             ret

mulDEHL       ; dehl=de*hl
          ld b,h
          ld c,l

;mulDEBC      ; dehl=de*bc
;          ld hl,0
;          DUP 16
;           add hl,hl
;           ex de,hl
;           adc hl,hl
;           ex de,hl
;          jr nc,1F
;           add hl,bc
;          jr nc,1F
;           inc de
;1
;          EDUP
;         ret

mulDEBC      ; dehl=de*bc
           push af
           ld hl,0
           ld a,16
1          add hl,hl
           ex de,hl
           adc hl,hl
           ex de,hl
          jr nc,2F
           add hl,bc
          jr nc,2F
           inc de
2          dec a
          jr nz,1B
           pop af
          ret


; ---------------------------------------

mulsHL  ld a,l  ;HL = H*L
       jr MULS
mulsAA  ld h,a  ; hl=a*a   ; v3.12

MULS    push de  ; hl = a*h
        LD L,0 ;HL = A*H
        LD D,L
        LD E,A
        DUP 8
        ADD HL,HL
        JR NC,$+3
        ADD HL,DE
        EDUP
        pop de
        RET


; HL=B*C
Mult     ld h,b
         ld a,c
        jr MULS

;Mult    XOR A
;        CP B
;        JR Z,ZERO_HL
;        CP C
;        JR Z,ZERO_HL
;        LD E,C
;        LD HL,0
;        LD D,0
;L1      ADD HL,DE
;        DJNZ L1
;       RET
;ZERO_HL LD HL,0
;        RET


DIV     LD B,D
        LD C,E
        LD D,H
        LD E,L
        CALL Div
        LD H,D
        LD L,E
        RET

Div     PUSH BC         ;DE = DE/BC С ОКРУГЛЕНИЕМ ОТВЕТА
        LD A,B
        CPL
        LD B,A
        LD A,C
        CPL
        LD C,A
        INC BC
        LD HL,0
        LD A,E
        ADD A,A
        RL D
        DUP 16
        ADC HL,HL
        ADD HL,BC
        JR C,$+4
        SBC HL,BC
        RLA
        RL D
        EDUP
        LD E,A
        POP BC
        SRL B
        RR C
        OR A
        SBC HL,BC
        RET C
        INC DE
        RET

Div3         push bc   ;   a=a/3, set flag Z - if modulo = 2 ; /DA
             ld c,0
1             sub 3
             jr c,2F
              inc c
             jr 1B
2             add a,3
              cp 2
              ld a,c
             pop bc
            ret

INTCOUNT                         ; счетчик пропусков прерываний
                ld a,3
.intcount EQU $-1
               dec a
               ld (.intcount),a
              ret nz
               ld a,3
MaxCount  EQU $-1
               ld (INTCOUNT.intcount),a
               xor a
              ret


;  ***  HL = (DE * C) /256    ; из GUI

MLdec256  ld hl,0
          ld a,c
1         or a
         jr z,3F
          rra
         jr nc, 2F
          add hl,de
2         sla e
          rl d
         jr 1B
3         ld l,h
          ld h,a
         ret

;   HL = HL/DE

DivHLDE_                 ; из GUI
          ex de,hl
          ld c,l
          ld b,h
          call Div    ; DE = DE/BC С ОКРУГЛЕНИЕМ ОТВЕТА
          ex de,hl
         ret

; курсорчик
WinCur
SnapeCur DB #1F,#A0,#5F,#00,#1F,#A0,#FF,#00
         DB #FF,#00,#FF,#00,#FF,#00,#FF,#00
         DB #FF,#00,#FF,#00                  ;,#FF,#00,#FF,#00  ; - лишнее /DA
         ; DB #FF,#00,#FF,#00,#FF,#00,#FF,#00

WinCurDISP  EQU #0101

EraserCur   DB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF    ; курсор ластика
            DB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF
            DB #FF,#00,#FF,#00

ErasCurDISP EQU #0303

;--------------------------------------

       DISPLAY "Primitive len   :",/a, $-Primitiv_code