diff --git a/README.md b/README.md index 6757cd3..f2e63a2 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ ready-assembled projects: * `nibble.tal`: small demo drawing all the nibble dice * `audio-prototype0.tal`: first iteration of sequencer / tracker with nibble dice. the dice are used to read/write into memory: - you can manipulate the dice in order to change pulse period (1 byte), pitch (1 byte), adsr values (2 bytes), volume (1 byte), "bang" sequencing (?) (1 byte); to toggle a melody sequencer (1 bit), and/or modify the melody (8 bytes), and even the super low-res wave shape (8 bytes), for two audio devices (3 columns for the first one, 3 columns for the second one) +* `calculadora.tal`: experiment for an 8-bit rpn calculator, from before there was a console/vector available. for the moment it uses the keyboard input # media diff --git a/sketches/calculadura.tal b/sketches/calculadura.tal new file mode 100644 index 0000000..c693de0 --- /dev/null +++ b/sketches/calculadura.tal @@ -0,0 +1,162 @@ +( dev/console ) + +%RTN { JMP2r } +%print { DUP #18 DEO } +%printhex { DUP #19 DEO #0a #18 DEO } +%printnl { #0a #18 DEO } +%resetnumber { #00 STH } +%setnumber { #01 STH } + +|00 @System [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ] +|80 @Teclado [ &vector $2 &button $1 &key ] + +|0000 + + +( init ) + +|0100 ( -> ) + +( theme ) + #a1f3 .System/r DEO2 + #a14d .System/g DEO2 + #a16c .System/b DEO2 + + LIT 'h #18 DEO + LIT 'o #18 DEO + LIT 'l #18 DEO + LIT 'a #18 DEO + #0a #18 DEO ( \n ) + + ( #db ( 219 ) + ( #63 ,printdigits JSR ) + + ( printhex ) + + resetnumber ( estado de número ) + + + ;tecla .Teclado/vector DEO2 + +BRK + + +@tecla + ( get key ) + .Teclado/key DEI + + ( echo ) + print + + ( is digit? ) + DUP #2f GTH ,numGT JCN + + DUP #20 EQU ,spacebar JCN + + ( + ) + DUP #2b EQU ,add JCN + + ( - ) + DUP #2d EQU ,sub JCN + + ( * ) + DUP #2a EQU ,mul JCN + + ( / ) + DUP #2f EQU ,div JCN + + ( enter ) + DUP #0d EQU ,enter JCN + + POP ( descarta input leido ) +BRK + +@spacebar + POP + ( printhex ) + STHr POP + resetnumber +BRK + +@enter + POP + printnl + LIT '> #18 DEO + #20 #18 DEO + ,printdigits JSR + ( printhex ) + STHr POP + resetnumber +BRK + +@add + POP + ADD +BRK + +@sub + POP + SUB +BRK + +@mul + POP + MUL +BRK + +@div + POP + DIV +BRK + +@numGT + DUP #3a LTH ,numLT JCN +BRK + +@numLT ( is number ) + #30 SUB ( calculate number ) + STHr ,decimal JCN ( if not the first digit ) + setnumber ( estado de número ) +BRK + +@decimal + SWP #0a MUL + ADD + ( printhex ) + setnumber ( estado de número ) +BRK + +@printdigits ( subroutine to print a byte in decimal ) + DUP #64 DIV ( divide over 100 ) + DUP2 #64 MUL SUB SWP DUP ( get the remainder ) + ,&print3digits JCN ( jump if there are 3 digits ) + POP + + ( print 2 digits ) + DUP #0a DIV ( divide over 10 ) + DUP2 #0a MUL SUB SWP DUP ( get the remainder ) + ,&print2nddigit JCN ( jump if there are 2 digits ) + POP + ,&print1stdigit JMP + + &print2nddigit + #30 ADD #18 DEO + + &print1stdigit + #30 ADD #18 DEO + POP + printnl + RTN + + &print3digits + #30 ADD #18 DEO + + ( print 2 digits ) + ( same routine as above but without conditionals ) + DUP #0a DIV DUP2 #0a MUL SUB SWP + #30 ADD #18 DEO ( 2nd digit ) + #30 ADD #18 DEO ( 1st digit ) + + POP + printnl +RTN