;; input m0[0] start address ;; [X ] [Y ] [D1 ] ;; mov 0,ct0 ;; mov mc0,ra0 ;; variables: ;; m0[0] ;; m0[1] dma read value (local); post-shift 4-byte remainder (global) ;; m0[2] saved accumulator (global) setup: ;; [X ] [Y ] [D1 ] mov 1,ct0 mov 0,ct3 mov 0,mc0 mov 0,mc0 mvi parse_base10,pc mov 1,lop ;; parse_base10 return mov all,mc3 mvi parse_base10,pc mov 1,lop ;; parse_base10 return mov all,mc3 nop nop nop parse_base10: ;; [X ] [Y ] [D1 ] mov 1,ct0 mov m0,p mov m0,a add jmp nz,parse_loop clr a ; delay slot dma_next_chunk: ;; dma d0,mc0,1 ;; begin fake number 0x39322033 "92 3" mvi 0x393220,pl add mov alu,a mov 0x33,pl rl8 mov alu,a mov 1,ct0 add mov all,mc0 ;; end fake number end_dma_next_chunk: parse_loop: ;; extract first (leftmost) digit mov 1,ct0 mov mc0,a mov 0x7f,pl or jmp s,end_of_input rl8 mov alu,a mov 10,rx ; m0[2] 0x00000000 jmp z,dma_next_chunk and mov m0,y mov all,pl ;; MUL: post-multiplication accumulator ;; P: post-mask digit ;; A: pre-xor string mov 1,ct0 xor clr a mov all,mc0 ; m0[1] 0x20323300 add mov alu,a mov 0x30,pl ; 0x30 ascii '0' ;; A: post-mask digit ;; sub mov alu,a mov 10,pl ;; if ((0x39 - 0x30) < 0) goto non_digit; jmp s,non_digit ;; possibly set S flag for `jmp ns,non_digit` sub mov 2,ct0 ; sub in delay slot ;; if (((0x39 - 0x30) - 10) >= 0) goto non_digit; jmp ns,non_digit mov mul,p mov 2,ct0 ; mov in delay slot ;; P: accumulator * 10 result digit: ;; we have a valid digit; add it to the accumulator; save to m0[2] ;; [X ] [Y ] [D1 ] jmp parse_loop add mov all,mc0 ; add in delay slot ; m0[2] 0x00000009 non_digit: ;; this is not a valid digit; return and clear the accumulator as A ;; [X ] [Y ] [D1 ] btm mov m0,a mov 0,mc0 ; clr in delay slot ; m0[2] ;; m0: ;; 00000000 32330000 00000009 0000000 end_of_input: btm clr a