ACNews #54 21 января 2009

Программирование - Быстрое преобразование координат.

SIGNOFS EQU     #C000
SINOFS  EQU     #C100
COSOFS  EQU     #C200
PROCROT EQU     #C300
MULTAB  EQU     #C400

ALPHA   DEFW    SIGNOFS+#40
BETA    DEFW    SIGNOFS+#00
GAMMA   DEFW    SIGNOFS+#00

ROTATE
LD      A,SINBANK
CALL    BANK

LD      HL,(ALPHA)
LD      A,(HL)
LD      (_ALPCAL),A
INC     H
LD      A,(HL)
LD      (_ASIN),A
INC     H
LD      A,(HL)
LD      (_ACOS),A

LD      HL,(BETA)
LD      A,(HL)
LD      (_BETCAL),A
INC     H
LD      A,(HL)
LD      (_BSIN),A
INC     H
LD      A,(HL)
LD      (_BCOS),A

LD      HL,(GAMMA)
LD      A,(HL)
LD      (_GAMCAL),A
INC     H
LD      A,(HL)
LD      (_GSIN),A
INC     H
LD      A,(HL)
LD      (_GCOS),A

NVERT   EQU     \$+1
LD      B,0
LD      L,0
LD      LX,0
...R1
LD      H,VTXЗDH
LD      HX,VTXЗDIH
EXX
LD      C,(IX+0)
INC     HX
LD      B,(IX+0)
INC     HX

_ASIN   EQU     \$+1
LD      H,0
_ACOS   EQU     \$+1
LD      D,0
_ALPCAL EQU     \$+1
CALL    PROCROT         ;INP CB, OUTP AB
EX      AF,AF`
LD      C,B
LD      B,(IX+0)
;A`=X,C=Y,B=Z
_BSIN   EQU     \$+1
LD      H,0
_BCOS   EQU     \$+1
LD      D,0
_BETCAL EQU     \$+1
CALL    PROCROT
EX      AF,AF`          ;PUT Y
LD      C,B
LD      B,A
;A`=Y,C=Z,B=X
_GSIN   EQU     \$+1
LD      H,0
_GCOS   EQU     \$+1
LD      D,0
_GAMCAL EQU     \$+1
CALL    PROCROT
;A=Z,B=X,A`=Y
SRA     A
LD      (_CZ),A
LD      A,B
EXX
SRA     A
LD      (HL),A
INC     H
EX      AF,AF`
SRA     A
LD      (HL),A
INC     H
_CZ     EQU     \$+1
LD      (HL),0
INC     L
INC     LX
DJNZ    ...R1
LD      A,WRKBANK
JP      BANK
QROT_E
;################################

; X`=X*COS(F)#Y*SIN(F)
; Y`=X*SIN(F)+Y*COS(F)

;C=X    DE=COS
;B=Y    HL=SIN
;OUTP A=X,B=Y
PROC_INST

;COS SIN
; +   +
CH_I    EQU     \$#PROC_INST
LD      L,C
LD      E,B
LD      A,(DE)
LD      L,B
LD      E,C
LD      B,A
LD      A,(DE)
SUB     (HL)
RET
; #   +
CH_II   EQU     \$#PROC_INST
LD      L,C
LD      E,B
EX      DE,HL
LD      A,(DE)
SUB     (HL)
LD      L,C
LD      E,B
LD      B,A
LD      A,(DE)
NEG
RET
; #   #
CH_III  EQU     \$#PROC_INST
LD      L,C
LD      E,B
LD      A,(DE)
NEG
LD      L,B
LD      E,C
LD      B,A
EX      DE,HL
LD      A,(DE)
SUB     (HL)
RET
; +   #
CH_IV   EQU     \$#PROC_INST
LD      L,C
LD      E,B
LD      A,(DE)
SUB     (HL)
LD      L,B
LD      E,C
LD      B,A
LD      A,(DE)
RET
;COS SIN
; 1   0
U0      EQU     \$#PROC_INST
LD      A,C
RET
; 1  #P
UMЗб0   EQU     \$#PROC_INST
LD      L,C
LD      A,B
SUB     (HL)
LD      L,B
LD      B,A
LD      A,C
RET
; 1  +P
UBO     EQU     \$#PROC_INST
LD      L,C
LD      A,B
LD      L,B
LD      B,A
LD      A,C
SUB     (HL)
RET

;COS SIN
; 0   1
U90     EQU     \$#PROC_INST
XOR     A
SUB     B
LD      B,C
RET
;#P   1
UB90    EQU     \$#PROC_INST
LD      E,B
EX      DE,HL
LD      A,C
SUB     (HL)
LD      B,A
XOR     A
SUB     L
LD      L,C
SUB     (HL)
RET
;+P   1
UM90    EQU     \$#PROC_INST
LD      E,B
LD      A,(DE)
LD      L,A
LD      E,C
LD      A,(DE)
SUB     B
LD      B,L
RET

;COS SIN
;#1   0
U180    EQU     \$#PROC_INST
XOR     A
SUB     B
LD      B,A
XOR     A
SUB     C
RET
;#1  #P
UB180   EQU     \$#PROC_INST
LD      L,C
XOR     A
SUB     B
SUB     (HL)
LD      L,B
LD      B,A
LD      A,(HL)
SUB     C
RET
;#1  +P
UM180   EQU     \$#PROC_INST
LD      L,C
LD      A,(HL)
SUB     B
LD      L,B
LD      B,A
XOR     A
SUB     C
SUB     (HL)
RET

;COS SIN
; 0  #1
U270    EQU     \$#PROC_INST
XOR     A
SUB     C
LD      C,A
LD      A,B
LD      B,C
RET
;#P  #1
UM270   EQU     \$#PROC_INST
LD      E,B
EX      DE,HL
XOR     A
SUB     C
SUB     (HL)
LD      B,A
LD      A,L
LD      L,C
SUB     (HL)
RET

;COS SIN
;+P  #1
UB270   EQU     \$#PROC_INST
LD      E,B
EX      DE,HL
LD      A,(HL)
SUB     C
LD      B,A
LD      A,L
LD      L,C
RET

PROC_LEN EQU    \$#PROC_INST

;##########################

GEN_ROTATE
LD      A,SINBANK
CALL    BANK

XOR     A
LD      (PREV),A

LD      IX,MULTAB##0100
LD      HL,SINЧ
LD      DE,SINOFS
INST_MUL
LD      A,(HL)
INC     HL
PREV    EQU     \$+1
CP      0
JR      Z,_SKIP

LD      (PREV),A
INC     HX
EXX

LD      E,A
XOR     A
LD      D,A
LD      L,A
LD      H,A

LD      B,128
...1
LD      (IX),A
INC     LX
LD      A,H
DJNZ    ...1

NEG
LD      (IX),A
INC     LX

XOR     A
SUB     L
LD      L,A     ;L=0#L
SBC     A,H     ;0#L#H#C
SUB     L       ;#(0#L)
LD      H,A             ;24

LD      B,127
...2
LD      A,H
LD      (IX),A
INC     LX
DJNZ    ...2
EXX
_SKIP
LD      A,HX
INC     E
LD      (DE),A

LD      A,(HL)
RLA
;       CP      #80
JR      NC,INST_MUL

LD      HL,SINOFS+#44
LD      B,#3C
LD      A,(DE)
LD      (HL),A
DEC     E
INC     L
DJNZ    \$#4
EX      DE,HL
LD      C,#80
LDIR

LD      L,#40
LD      A,(HL)
LD      (DE),A
INC     L
INC     E
JR      NZ,\$#4

LD      DE,SIGNOFS
LD      HL,SIGNOFS_INST
I_OFS
LD      B,(HL)
INC     HL
LD      A,(HL)
INC     HL
LD      (DE),A
INC     E
DJNZ    \$#2
JR      NZ,I_OFS

LD      HL,PROC_INST
LD      DE,PROCROT
LD      BC,PROC_LEN
CALL    NLDIR
LD      A,WRKBANK
JP      BANK

SINЧ
DEFB        #03,#06,#09,#0D,#10,#13,#16
;       DEFB    #00,#03,#06,#09,#0D,#10,#13,#16
DEFB    #19,#1C,#1F,#22,#25,#28,#2B,#2E
DEFB    #31,#34,#37,#3A,#3C,#3F,#42,#44
DEFB    #47,#4A,#4C,#4F,#51,#54,#56,#58
DEFB    #5B,#5D,#5F,#61,#63,#65,#67,#69
DEFB    #6A,#6C,#6E,#6F,#71,#72,#74,#75
DEFB    #76,#77,#79,#7A,#7A,#7B,#7C,#7D
DEFB    #7E,#7E,#7F,#7F,#7F,#80; #80,#80

;       DEFB    #80,#80,#80,#80,#7F,#7F,#7F,#7E

SIGNOFS_INST

DEFB    1,U0,3,UBO,57,CH_I,3,UM90
DEFB    1,U90,3,UB90,57,CH_II,3,UM180
DEFB    1,U180,3,UB180,57,CH_III,3,UM270
DEFB    1,U270,3,UB270,57,CH_IV,3,UMЗб0

Другие статьи номера:

Программирование - Быстрое преобразование координат.

Похожие статьи:

В этот день...   30 ноября