Q1 Example Programs
Contents
- Subtraction Subroutine
- Multiplication Subroutine
- Greatest Common Divisor
- Fibonacci Sequence
- Sieve of Eratosthenes
Subtraction Subroutine
The Q1 doesn't directly support subtraction, but it is pretty easy to implement as shown below.
; Compute A = C - B ; 6 bytes sub: not mab inc mab add ret
Multiplication Subroutine
Like subtraction, multiplication isn't directly supported. Here's one solution.
; Compute B = B * C ; 50 bytes mult: stb mult_x stc mult_y clr sta mult_result mult_loop: ldb mult_x shr sta mult_x ldb mult_y jc mult_bit_set jz mult_done j mult_not_set mult_bit_set: ldc mult_result add sta mult_result mult_not_set: shl sta mult_y j mult_loop mult_done: ldb mult_result ret mult_x: db 0 mult_y: db 0 mult_result: db 0
Greatest Common Divisor
This subroutine computes the greatest common divisor of two 8-bit non-zero unsigned integers.
; Compute B = GCD(B, C) ; 45 bytes gcd: stb gcd_x stc gcd_y gcd_loop: ldb gcd_y not mab inc mab ldc gcd_x add jz gcd_result_x jc gcd_x_greater mab not mab inc sta gcd_y j gcd_loop gcd_x_greater: sta gcd_x j gcd_loop gcd_result_x: ldb gcd_x ret gcd_x: db 0 gcd_y: db 0
Fibonacci Sequence
This program computes the largest Fibonacci number that fits in 8 bits and then halts.
; Compute the largest Fibonacci number that fits in 8 bits. ; 32 bytes fib: ldb fib_init stb fib_n1 stb fib_n2 fib_loop: ldb fib_n1 ldc fib_n2 stb fib_n2 add jc fib_done sta fib_n1 j fib_loop fib_done: hlt fib_n1: db 1 fib_n2: db 1 fib_init: db 1
Sieve of Eratosthenes
This program computes the largest prime number that fits in 8 bits and then halts.
; Sieve of Eratosthenes ; 85 + 256 bytes sieve: ldb sieve_zero stb sieve_init_index + 2 sieve_init_loop: ldb sieve_zero sieve_init_index: stb sieve_primes ldb sieve_init_index + 2 inc sta sieve_init_index + 2 jc sieve_init_done j sieve_init_loop sieve_init_done: mab inc sta sieve_next_test + 2 sieve_next_num: ldb sieve_next_test + 2 inc jc sieve_done sta sieve_next_test + 2 sieve_next_test: ldb sieve_primes inc jc sieve_next_num ldb sieve_next_test + 2 stb sieve_largest stb sieve_index + 2 sieve_loop: ldb sieve_index + 2 ldc sieve_largest add jc sieve_next_num sta sieve_index + 2 ldb sieve_neg1 sieve_index: stb sieve_primes sieve_zero: j sieve_loop sieve_done: ldb sieve_largest hlt sieve_neg1: db 255 sieve_largest: db 0 org 256 sieve_primes: