why doesnt this basic fill routine work?

The place for codemasters or beginners to talk about programming any language for the Spectrum.
Post Reply
BenHanson
Drutt
Posts: 9
Joined: Sat Oct 03, 2020 2:22 pm

Re: why doesnt this basic fill routine work?

Post by BenHanson »

Here is the ASM version:

Code: Select all

  ORG 32768
  LD C, 94 ; X
  LD B, 100 ; Y
Plot:
  CALL SetBit
Right:
  INC C
  CALL GetBit
  AND (HL)
  JR NZ, SkipRight
  PUSH BC
  CALL Plot
  POP BC
SkipRight:
  DEC C
Left:
  DEC C
  CALL GetBit
  AND (HL)
  JR NZ, SkipLeft
  PUSH BC
  CALL Plot
  POP BC
SkipLeft:
  INC C
Up:
  INC B
  CALL GetBit
  AND (HL)
  JR NZ, SkipUp
  PUSH BC
  CALL Plot
  POP BC
SkipUp:
  DEC B
Down:
  DEC B
  CALL GetBit
  AND (HL)
  JR NZ, SkipDown
  PUSH BC
  CALL Plot
  POP BC
SkipDown:
  INC B
  RET
GetBit:
  PUSH BC
  CALL 22AAh ; PIXEL-ADD
  POP BC
  PUSH BC
  LD B, A
  INC B
  XOR A
  SCF
Loop:
  RRA
  DJNZ Loop
  POP BC
  RET
SetBit:
  CALL GetBit
  OR (HL)
  LD (HL), A
  RET
Then:

Code: Select all

10 CIRCLE 128,88,40: CIRCLE 128,88,30
20 RANDOMIZE USR 32768
hikoki
Manic Miner
Posts: 576
Joined: Thu Nov 16, 2017 10:54 am

Re: why doesnt this basic fill routine work?

Post by hikoki »

Another way of filling is DRAWing INVERSEd lines between PLOTs

Code: Select all

10 BORDER 0: PAPER 0: INK 0: BRIGHT 0: CLS 
9001 LET x$="055197195055055192189054051043048041037018029043052039106066057088078055048066016"
9002 LET y$="159131124151142116108135088090136137095071065088085066044019024043048030033047065"
9100 GO TO 9400
9200 LET x2=VAL (x$(g TO g+2)): LET y2=VAL (y$(g TO g+2)): RETURN 
9300 LET x1=x2: LET y1=y2: RETURN 
9400 LET g=1: GO SUB 9200: FOR g=1 TO LEN x$ STEP 3: GO SUB 9300: GO SUB 9200: IF x2<0 THEN LET g=g+1: GO SUB 9200: GO SUB 9300
9500 PLOT INVERSE 1;x1,y1: DRAW INVERSE 1; PAPER 2;x2-x1,y2-y1: NEXT g
Post Reply