all repos — xyw @ 09909160cf03d85143caee8059e5d650b24658ac

A minimal virtual machine and assembler for terminals.

examples/factorial16.xyw

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
.include "_macros.xyw"

; Main program: calculate and print factorial of 7
$00 $07 fact JSRw 
PUTDw JSRw
$0A terminal.output STB
end JMPw

; Factorial subroutine
; a16 -- | [xy]
.label fact
  ; Save argument to both registers
  POPxyw
  .label fact.loop 
    ; Need to work with 16-bit comparisons
    ; but JCN only works with 8-bit values, so remove high byte first
    PSHyw $00 $00 EQUw SWP POP fact.end0 JCNw
    PSHyw $00 $01 EQUw SWP POP fact.end1 JCNw
    ; Decrement y and multiply
    DECyw PSHxw PSHyw MULxw POPxw
    fact.loop JMPw
  .label fact.end0
    ; Edge case: factorial of 0 is 1
    $1
    CLRxyw
    RTS
  .label fact.end1
    ; Return result
    PSHxw
    CLRxyw
    RTS

.include "lib/PUTDw.xyw"

.label end