; Lots of useful functions here! ; lenum - Reads a number in decimal base (range 0-255) ; escnum - Writes a number in decimal base (range 0-255) ; printstring - Prints a null-terminated string ; newline - Prints a newline (CRLF) org 01000h LF: equ 0Ah FF: equ 0Ch CR: equ 0Dh inicializacao: mov SP,0 mov AB,hello_str call printstring main_loop: call lenum jeqz A,fim call newline call escnum call newline jr main_loop fim: ; halt jmp 0FFFh ;There is a HALT instruction at that ROM address. ;The machine will be at IP 1000h after that. hello_str: db CR,LF,"Bem vindo ao ""echoador"" de numeros!",CR,LF,"Sao aceitos numeros de 0 a 255.",CR,LF,"Numeros maiores que 255 sao exibidos modulo 256.",CR,LF,"Digite 0 para parar.",CR,LF,0 ;Imprime uma quebra de linha (CRLF) ;Todos os registradores sao preservados newline: push B mov B,CR out B mov B,LF out B pop B ret ;Imprime uma string terminada por nulo (cujo endereco esta em AB) printstring: mov CD,AB printstring_loop: mov A,[CD] jeqz A,printstring_end out A inc CD jr printstring_loop printstring_end: ret ;Deixa o numero lido em A ;O ultimo caractere eh lido e descartado ;(na verdade, o ultimo caractere eh deixado em B) lenum: mov A,0 lenum_char: in B sub B,"0" jc lenum_fim cmp B,10 jnc lenum_fim ;A entrada esta valida ;Multiplicar A por dez mov D,A shl A shl A add A,D shl A add A,B jr lenum_char lenum_fim: add B,"0" ret ;Recebe o numero a ser impresso em A escnum: mov D,10 ;Coloca a base no D mov B,A ;Coloca o numero em B sub A,B ;Zera A mov C,A ;Zera C push C ;Empilha a marca de fim de pilha escnum_div: div AB,D ;Divide o numero add A,"0" ;Achei o caractere push A ;Coloco na pilha mov A,C ;Re-zero A jneqz B,escnum_div escnum_write: pop A jeqz A,escnum_fim out A jr escnum_write escnum_fim: ret