Код:
DEVICE ZXSPECTRUM48
DISPLAY "END=", END
STARTFORSNA EQU #8000
ORG STARTFORSNA
DI
LD SP,#8000
CALL DECRUN
LD HL,#2020,DE,#90E0,BC,#10a5:CALL TRIUGOL:JR $
TRIUGOL ;[ рисовалка треугольников с текстурой
; HL=вершина1, DE=вершина2, BC=вершина3
LD (AAA),HL,(BBB),DE,(CCC),BC
SORT ;[ сортировка пузырьковым методом
LD B,2
SORT1 PUSH BC:LD B,2:LD IX,AAA
SORT2 LD A,(IX+1):CP (IX+3):JP C,SORT3
LD H,(IX+3):LD L,(IX+2):LD C,(IX)
LD (IX+3),A:LD (IX+2),C:LD (IX+1),H:LD (IX),L
SORT3 INC IX,IX:DJNZ SORT2
POP BC:DJNZ SORT1 ;]
LD HL,(BBB),DE,(AAA),LY,D
LD A,H:CP D:JP Z,TRIU2
SUB D:LD C,A:EXA
CALL CALK
PUSH DE:EXX:POP DE:EXX
LD HL,(CCC),DE,(AAA)
LD A,H:SUB D:LD C,A
CALL CALK
PUSH DE:EXX:POP BC:EXX
LD HL,(AAA),B,L,C,0:LD (CRD1+1),BC,(CRD2+1),BC
CALL TRI3
EXA:LD B,A
CALL TRI2
LD HL,(CCC),DE,(BBB)
LD A,H:SUB D:LD C,A:EXA
CALL CALK
PUSH DE:EXX:POP DE:EXX
TRIU1 EXA:OR A:RET Z:LD B,A:JP TRI2
TRIU2 LD HL,(CCC),DE,(AAA)
LD A,H:SUB D:RET Z
LD C,A:EXA
CALL CALK
PUSH DE:EXX:POP DE:EXX
LD HL,(CCC),DE,(BBB)
LD A,H:SUB D:LD C,A
CALL CALK
PUSH DE:EXX:POP BC:EXX
LD HL,(AAA),DE,(BBB)
LD B,L,C,0,(CRD1+1),BC
LD B,E,(CRD2+1),BC
CALL TRI3
JP TRIU1
LINEM LD A,LY:AND 7:PUSH HL
L_TEXTU LD HL,(F_MASK),E,A,D,0:ADD HL,DE
LD A,(HL)
CPL ; CPL если нужна инверсия, NOP если не нужна
POP HL:LD HY,A
LD A,B:SUB C:JP NC,LINEM1
LD A,B:LD B,C:LD C,A
LINEM1 LD A,C,D,#F8:AND D:RRA:RRA:RRA:ADD A,L:LD L,A
LD A,C:AND D:LD E,A
LD A,B:AND D:CP E
JP NZ,LINEM3
LD A,C:AND 7:ADD A,low MASKA_A:LD E,A
LD A,high MASKA_A:ADC A,0:LD D,A
LD A,(DE)
LD C,A
LD A,B:AND 7:ADD A,8:ADD A,low MASKA_A:LD E,A:LD A,D:ADC A,0:LD D,A
LD A,(DE):AND C:LD E,A:CPL:AND (HL)
LD B,A:LD A,E:AND HY:OR B:LD (HL),A
RET
LINEM3 LD E,C
LD A,C:AND D:LD C,A
LD A,E:AND 7:ADD A,low MASKA_A:LD E,A
LD A,high MASKA_A:ADC A,0:LD D,A
LD A,(DE):LD E,A:CPL:AND (HL):LD (HL),A
LD A,E:AND HY:OR (HL):LD (HL),A:INC L
LD A,B:AND 7:ADD A,8:ADD A,low MASKA_A:LD E,A
LD A,D:ADC A,0:LD D,A
LD A,(DE):LD E,A
LD A,B:AND #F8:SUB C:SUB 8:JP Z,LINEM4
RRA:RRA:RRA:LD B,A:LD A,HY
LINEM5 LD (HL),A
INC L:DJNZ LINEM5
LINEM4 LD A,E:CPL:AND (HL):LD B,A:LD A,E:AND HY:OR B:LD (HL),A ;**
RET
CALK LD B,0
LD A,L:SUB E:LD E,B:JP NC,CALK1
NEG:LD D,A:CALL DIV
LD A,E:CPL:LD E,A
LD A,D:CPL:LD D,A
INC DE
RET
CALK1 LD D,A:JP DIV
TRI2 PUSH BC:EXX
CRD1 LD HL,0:ADD HL,DE:LD (CRD1+1),HL
LD A,H:LD (TRI2_+1),A
CRD2 LD HL,0:ADD HL,BC:LD (CRD2+1),HL
LD A,H:EXX
TRI2_ LD C,0:LD B,A:LD L,(IX):LD H,(IX+1)
CALL LINEM
INC LY:INC IX,IX
POP BC:DJNZ TRI2
RET
TRI3 LD L,H:LD H,0:LD BC,TSCRB:ADD HL,HL:ADD HL,BC:PUSH HL:POP IX
RET
;]
DIV ;[ DE = DE/BC с округлением ответа
PUSH 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
JP C,$+5
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
;]
DECRUN ;[ делаем табличку адресов в экране
LD DE,#4000:LD HL,TSCRB:LD B,#c0
DECR4 LD (HL),E:INC HL:LD (HL),D:INC HL:CALL DW_DE
DECR5 DJNZ DECR4
DW_DE INC D:LD A,D:AND 7:RET NZ
LD A,E:ADD A,32:LD E,A:RET C
LD A,D:SUB 8:LD D,A
RET
;]
;[
AAA DW 0
BBB DW 0
CCC DW 0
F_MASK DW #3C00+8*"D" ; адрес знакоместа чем заливать
TSCRB DS 384
;]
MASKA_A DB #FF,#7F,#3F,#1F,#0F,#07,#03,#01,#80,#C0,#E0,#F0,#F8,#FC,#FE,#FF
END
SAVESNA "basic-poly_text.sna",STARTFORSNA
LABELSLIST "user.l"