FizzBuzz/Assembly: Difference between revisions

Content added Content deleted
(moved 6502 / 68000 / 8086 Assembly)
(moved z80 Assembly)
Line 392: Line 392:
buzz: ;The "buzz" string.
buzz: ;The "buzz" string.
db "buzz"</lang>
db "buzz"</lang>

=={{header|Z80 Assembly}}==
For the Amstrad CPC (should work with e.g. the built-in assembler in JavaCPC; use <tt>call &4000</tt> to start from BASIC):
<lang z80>org &4000 ; put code at memory address 0x4000
wr_char equ &bb5a ; write ASCII character in register A to screen
cursor equ &bb78 ; get cursor position

push bc
push de
push hl

ld b,100 ; loop from 100 to 1
loop:

; check for Fizz condition
ld a,(count3)
dec a
jr nz,next3
push bc
ld b,4
ld de,fizz
printfizz:
ld a,(de)
call wr_char
inc de
djnz printfizz
pop bc
ld a,3
next3:
ld (count3),a

; check for Buzz condition
ld a,(count5)
dec a
jr nz,next5
push bc
ld b,4
ld de,buzz
printbuzz:
ld a,(de)
call wr_char
inc de
djnz printbuzz
pop bc
ld a,5
next5:
ld (count5),a

; test if cursor is still in first column
; (i.e., no Fizz or Buzz has been printed)
call cursor
ld a,h
dec a
jr nz,skipnum

; print number
push bc
ld b,3
ld de,count
loop2:
ld a,(de)
call wr_char
inc de
djnz loop2
pop bc

skipnum:
; print carriage return/line feed
ld a,13
call wr_char
ld a,10
call wr_char

; increment rightmost digit
ld hl,count+2
inc (hl)
ld a,(hl)
; check if value is 10 (ASCII 58)
; if so, set to 48 (ASCII 0) and increase 10's digit
cp 58
jr nz,noinc
ld a,48
ld (count+2),a
ld (hl),a
dec hl
inc (hl)

ld a,(hl)
; check second-to-right digit, if it is 10 (0), carry over to 100's
cp 58
jr nz,noinc
ld a,48
ld (count+1),a
ld (hl),a
dec hl
inc (hl)

noinc:

djnz loop

pop hl
pop de
pop bc

; return to BASIC
ret

count:
db "001"

count3:
db 3

count5:
db 5

fizz:
db "Fizz"

buzz:
db "Buzz"</lang>