Простая реализация, без рекурсии. Способов рисования ковра нашлось немало.
;cls
mov #40000,R0
cl:
CLRB 37777(R0)
SOB R0,cl
;build table
;0:0,0
;1:0,1
;2:0,2
;3:1,0
;4:1,1
;5:1,2
;6:2,0
;7:2,1
;8:2,2
;9:3,0
;10:3,1
;11:3,2
;12:4,0
;13:4,1
;14:4,2
;15:5,0
;16:5,1
;17:5,2
CLR R1 ;%3
CLR R2 ;/3
bt:
MOVB R2,div3t(R0);/3
MOVB R1,div3t+256.(R0) ;%3
INC R1
CMP #3,R1
BNE noi
CLR R1
INC R2
noi:
INC R0
CMP #256.,R0
BNE bt
; For x=0 To 243
CLR R1 ; R1=x
xlp:
; For y=0 To 243
CLR R2 ; R2=y
ylp:
; xx.l=x
MOV R1,R3 ;R3=xx
; yy.l=y
MOV R2,R4 ;R4=yy
CLR R5
; While xx<>0 And yy<>0
wlp:
; TST R3
; BNE noexw
; TST R4
; BEQ exw
;noexw:
; If xx%3<>1 Or yy%3<>1
MOVB div3t+256.(R3),R0
BIC #0xFF00,R0
CMP #1,R0
BNE bra1
MOVB div3t+256.(R4),R0
BIC #0xFF00,R0
CMP #1,R0
BEQ bra2
bra1:
; np=1
MOV #1,R5 ;???
BR nxt
; Else
bra2:
; np=0
CLR R5
; Break
BR exw
; EndIf
nxt:
; xx/3
MOVB div3t(R3),R3
; yy/3
MOVB div3t(R4),R4
BIC #0xFF00,R3
BIC #0xFF00,R4
TST R3
BEQ exw
TST R4
BNE wlp
; Wend
exw:
CMP #0,R5
BEQ eif ;nexy
; If np
; Box(x, y, 1,1,$FFFFFF);
MOV R2,R5
SWAB R5;Y
CLRB R5
CLC
ROR R5
ASR R5
MOV R1,R0 ;X
SWAB R0
CLRB R0
SWAB R0
; BIC #0xFF00,R0
CLC
ROR R0
ASR R0
ADD R0,R5
ADD #40000,R5
MOV R1,R0
BIC #0b1111111111111100,R0
MOVB BITWEI(R0),R4
BISB R4,(R5)
; EndIf
eif:
nexy:
; Next y
INC R2
CMP #243.,R2
BNE ylp
; Next x
INC R1
CMP #243.,R1
BNE xlp
HALT
BITWEI:
.byte 0b00000011
.byte 0b00001100
.byte 0b00110000
.byte 0b11000000
div3t:
.EVEN
.END
Комментарии
Отправить комментарий