\ EM78447A.F \ ============================================================ \ EM78M447A/B 8-BIT MICROCONTROLLER === ASSEMBLER === \ ============================================================ \ FORGET OVERLAY RAM0 2000 ORG \ CODE U2/ ( N ... N/2 ) C=0 3 R>A RRC 3 A>R 2 R>A RRC 2 A>R RET : EM78447.PROGRAM.AREA 0 ; VARIABLE CP' EM78447.PROGRAM.AREA CP' ! \ : @' 2/ @ ; : CELL/ 2 / ; : CELL* 2 * ; : HERE' CP' @ CELL/ ; : ALLOT' ( N ... ) CELL* CP' +! ; : ,' ( N ... ) CP' @ ! 1 ALLOT' ; : ORG' CELL* CP' ! ; : LABEL' HERE 2/ ' 3 + @ ! ; \ DOES> HAS TO BE CHANGED. 4 ' DOES> 0C + ( A812 ) C! \ : DOES> R> FLIP HERE 3 - ! ; \ 8.BITS OP.CODE => 3 : DOES>' R> FLIP HERE 4 - ! ; \ 16.BITS OP.CODE => 4 \ : DOES>" R> FLIP HERE 5 - ! ; \ 24.BITS OP.CODE => 5 \ : DOES>"' R> FLIP HERE 6 - ! ; \ 32.BITS OP.CODE => 6 : 3B.CHECK ( B ... ) 0 7 BETWEEN NOT IF ABORT" B IS NOT IN THE RANGE 0 ~ 7 " THEN ; : 4R.CHECK ( R ... ) 0 0F BETWEEN NOT IF ABORT" R IS NOT IN THE RANGE 0 ~ 0F " THEN ; : 6R.CHECK ( R ... ) 0 3F BETWEEN NOT IF ABORT" R IS NOT IN THE RANGE 0 ~ 3F " THEN ; : 8#.CHECK ( # ... ) 0 0FF BETWEEN NOT IF ABORT" # IS NOT IN THE RANGE 0 ~ FF " THEN ; : 10#.CHECK ( # ... ) 0 3FF BETWEEN NOT IF ABORT" # IS NOT IN THE RANGE 0 ~ 3FF " THEN ; DEFER ,, ' ,' IS ,, : 13C: CREATE , DOES>' R> @ ,, ; : 9C4R: CREATE , DOES>' DUP 4R.CHECK R> @ + ,, ; : 7C6R: CREATE , DOES>' DUP 6R.CHECK R> @ + ,, ; : 4C3B6R: CREATE , DOES>' DUP 3B.CHECK 40 * OVER 6R.CHECK + R> @ + ,, ; : 3C10#: CREATE , DOES>' DUP 10#.CHECK R> @ + ,, ; : 5C8#: CREATE , DOES>' DUP 8#.CHECK R> @ + ,, ; 0 13C: NOP 1 13C: DAA 2 13C: CONTW : A>CONT CONTW ; 3 13C: SLEP : SLEEP SLEP ; 4 13C: WDTC : WDT=0 WDTC ; 10 13C: ENI : EI ENI ; 11 13C: DISI : DI DISI ; 12 13C: RET 13 13C: RETI 14 13C: CONT_R : CONT>R CONT_R ; 20 13C: TBL 80 13C: CLR_A : A=0 CLR_A ; 1E02 13C: INT 0 9C4R: IOW_R : A>IOCR IOW_R ; 10 9C4R: IOR_R : IOCR>A IOR_R ; 40 7C6R: MOV_R,A : A>R MOV_R,A ; C0 7C6R: CLR_R : R=0 CLR_R ; 100 7C6R: SUB_A,R : R-A>A SUB_A,R ; 140 7C6R: SUB_R,A : R-A SUB_R,A ; 180 7C6R: DEC_A,R : R-1>A DEC_A,R ; 1C0 7C6R: DEC_R : R- DEC_R ; 200 7C6R: OR_A,R : AoR>A OR_A,R ; 240 7C6R: OR_R,A : RoA OR_R,A ; 280 7C6R: AND_A,R : AnR AND_A,R ; 2C0 7C6R: AND_R,A : RnA AND_R,A ; 300 7C6R: XOR_A,R : AxR XOR_A,R ; 340 7C6R: XOR_R,A : AxR XOR_R,A ; 380 7C6R: ADD_A,R : A+R ADD_A,R ; 3C0 7C6R: ADD_R,A : R+A ADD_R,A ; 400 7C6R: MOV_A,R : R>A MOV_A,R ; 440 7C6R: MOV_R,R : R:0 MOV_R,R ; 480 7C6R: COM_A,R : /R>A COM_A,R ; 4C0 7C6R: COM_R : /R COM_R ; 500 7C6R: INC_A,R : R+1>A INC_A,R ; 540 7C6R: INC_R : R+ INC_R ; 580 7C6R: DJZ_A,R : R-1=0?>A DJZ_A,R ; 5C0 7C6R: DJZ_R : R-1=0? INC_A,R ; 600 7C6R: RRC_A,R : RRCR>A RRC_A,R ; 640 7C6R: RRC_R : RRCR RRC_R ; 680 7C6R: RLC_A,R : RLCR>A RLC_A,R ; 6C0 7C6R: RLC_R : RLCR RLC_R ; 700 7C6R: SWAP_A,R : SWAPAR SWAP_A,R ; 740 7C6R: SWAP_R : SWAPR SWAP_R ; 780 7C6R: JZ_A,R : R+1=0?>A JZ_A,R ; 7C0 7C6R: JZ_R : R+1=0? JZ_R ; 800 4C3B6R: BC_R,b : RB=0 BC_R,b ; A00 4C3B6R: BS_R,b : RB=1 BS_R,b ; C00 4C3B6R: JBC_R,b : RB=0? JBC_R,b ; E00 4C3B6R: JBS_R,b : RB=1? JBS_R,b ; C00 7C6R: SWAP_A,R : SWAPAR SWAP_A,R ; 1000 3C10#: CALL 1400 3C10#: JMP 1800 5C8#: MOV_A,K : #>A MOV_A,K ; 1900 5C8#: OR_A,K : Ao# OR_A,K ; 1A00 5C8#: AND_A,K : An# AND_A,K ; 1B00 5C8#: XOR_A,K : Ax# XOR_A,K ; 1C00 5C8#: RETL_# : #>A,RET RETL_# ; 1D00 5C8#: SUB_A,K : #-A SUB_A,K ; 1F00 5C8#: ADD_A,K : A+# ADD_A,K ; 700 7C6R: SWAP_A,R : SWAPAR SWAP_A,R ; 700 7C6R: SWAP_A,R : SWAPAR SWAP_A,R ; 700 7C6R: SWAP_A,R : SWAPAR SWAP_A,R ; 700 7C6R: SWAP_A,R : SWAPAR SWAP_A,R ; 700 7C6R: SWAP_A,R : SWAPAR SWAP_A,R ; 700 7C6R: SWAP_A,R : SWAPAR SWAP_A,R ; \ ============================================================== \ CONDITIONAL STRUCTURE : +!' ( N ADDR ... ) 2 * +! ; : !' ( N ADDR ... ) 2 * ! ; \ : HERE' HERE 2 / ; : IF'RB=0 ( R B ... ) RB=1? HERE' 0 JMP ; : IF'RB=1 ( R B ... ) RB=0? HERE' 0 JMP ; : IF'R+1=0 ( R ... ) R-1=0? HERE' 0 JMP ; : IF'R-1=0 ( R ... ) R+1=0? HERE' 0 JMP ; : IF'R+1=0>A ( R ... ) R-1=0?>A HERE' 0 JMP ; : IF'R-1=0>A ( R ... ) R+1=0?>A HERE' 0 JMP ; : THEN' ( ADDR ... ) HERE' SWAP +!' ; : ELSE' ( ADDR ... ADDR' ) HERE' 0 JMP SWAP THEN' ; : BEGIN' HERE' ; : AGAIN' JMP ; : UNTIL'RB=0 ( R B ... ) RB=0? JMP ; : UNTIL'RB=1 ( R B ... ) RB=1? JMP ; : UNTIL'R+1=0 ( R ... ) R+1=0? JMP ; : UNTIL'R-1=0 ( R ... ) R-1=0? JMP ; : UNTIL'R+1=0>A ( R ... ) R+1=0?>A JMP ; : UNTIL'R-1=0>A ( R ... ) R-1=0?>A JMP ; : WHILE'RB=0 ( R B ... ) IF'RB=1 ; : WHILE'RB=1 ( R B ... ) IF'RB=0 ; : WHILE'R+1=0 ( R ... ) R+1=0? ; : WHILE'R-1=0 ( R ... ) R-1=0? ; : WHILE'R+1=0>A ( R ... ) R+1=0?>A ; : WHILE'R-1=0>A ( R ... ) R-1=0?>A ; : REPEAT' SWAP AGAIN' THEN' ; \ ======================================================= \ DISASSEMBLER FOR EM78447 \ ======================================================= : 13C.GROUP ( N ... ) CASE 0 OF 8 SPACES ." NOP \ NOP " ENDOF 1 OF 8 SPACES ." DAA \ DAA " ENDOF 2 OF 8 SPACES ." A>CONT \ CONTW " ENDOF 3 OF 8 SPACES ." SLEEP \ SLEP " ENDOF 4 OF 8 SPACES ." WDT=0 \ WDTC " ENDOF 10 OF 8 SPACES ." EI \ ENI " ENDOF 11 OF 8 SPACES ." DI \ DISI " ENDOF 12 OF 8 SPACES ." RET \ RET " ENDOF 13 OF 8 SPACES ." RETI \ RETI " ENDOF 14 OF 8 SPACES ." CONT>A \ CONTR " ENDOF 20 OF 8 SPACES ." TBL \ TBL " ENDOF 80 OF 8 SPACES ." A=0 \ CLRA " ENDOF 1E02 OF 8 SPACES ." INT \ INT " ENDOF DROP ENDCASE ; : R, ( N ... ) 4 SPACES 3F AND 2 .R 2 SPACES ; \ : F,D ( N ... ) 2 SPACES 7F AND . ; : 7C6R.GROUP ( N ... ) DUP 1FC0 AND CASE 40 OF R, ." A>R \ MOV_R,A " ENDOF C0 OF R, ." R=0 \ CLR_R " ENDOF 100 OF R, ." R-A>A \ SUB_A,R " ENDOF 140 OF R, ." R-A \ SUB_R,A " ENDOF 180 OF R, ." R-1>A \ DEC_A,R " ENDOF 1C0 OF R, ." R- \ DEC_R " ENDOF 200 OF R, ." AoR \ OR_A,R " ENDOF 240 OF R, ." RoA \ OR_R,A " ENDOF 280 OF R, ." AnR \ AND_A,R " ENDOF 2C0 OF R, ." RnA \ AND_R,A " ENDOF 300 OF R, ." AxR \ XOR_A,R " ENDOF 340 OF R, ." RxA \ XOR_R,A " ENDOF 380 OF R, ." A+R \ ADD_A,R " ENDOF 3C0 OF R, ." R+A \ ADD_R,A " ENDOF 400 OF R, ." R>A \ MOV_A,R " ENDOF 440 OF R, ." R:0 \ MOV_R,A " ENDOF 480 OF R, ." /R>A \ COM_A,R " ENDOF 4C0 OF R, ." /R \ COM_R " ENDOF 500 OF R, ." R+1>A \ INC_A,R " ENDOF 540 OF R, ." R+ \ INC_R " ENDOF 580 OF R, ." R-1=0?>A \ DJZ_A,R " ENDOF 5C0 OF R, ." R-1=0? \ DJZ_R " ENDOF 600 OF R, ." RRCR>A \ RRC_A,R " ENDOF 640 OF R, ." RRCR \ RRC_R " ENDOF 680 OF R, ." RLCR>A \ DEC_A,R " ENDOF 6C0 OF R, ." RLCR \ RLC_R " ENDOF 700 OF R, ." SWAPAR \ SWAPAR " ENDOF 740 OF R, ." SWAPR \ SWAPR " ENDOF 780 OF R, ." R+1=0?>A \ JZ_A,R " ENDOF 7C0 OF R, ." R+1=0? \ JZ_R " ENDOF 2DROP ENDCASE ; : R,B ( N ... ) 1FF AND 40 /MOD SWAP 2 .R 2 SPACES . 2 SPACES ; : 4C3B6R.GROUP ( N ... ) DUP 1E00 AND CASE 0800 OF R,B ." RB=0 \ BC_R,b " ENDOF 0A00 OF R,B ." RB=1 \ BS_R,b " ENDOF 0C00 OF R,B ." RB=0? \ JBC_R,b " ENDOF 0E00 OF R,B ." RB=1? \ JBS_R,b " ENDOF 2DROP ENDCASE ; : 8# ( N ... ) 4 SPACES 0FF AND 2 .R 2 SPACES ; : 8#' ( N ... ) 0FF AND . ; : 10# ( N ... ) 2 SPACES 3FF AND 4 .R 2 SPACES ; : 10#' ( N ... ) 3FF AND . ; : 5C8#.GROUP ( N ... ) DUP 1F00 AND CASE 1800 OF 8# ." #>A \ MOV_A,K " ENDOF 1900 OF 8# ." Ao# \ OR_A,K " ENDOF 1A00 OF 8# ." An# \ AND_A,K " ENDOF 1B00 OF 8# ." Ax# \ XOR_A,K " ENDOF 1C00 OF 8# ." #>A,RET \ RETL_K " ENDOF 1D00 OF 8# ." #-A \ SUB_A,K " ENDOF 1F00 OF 8# ." A+# \ ADD_A,K " ENDOF 2DROP ENDCASE ; : 3C10#.GROUP ( N ... ) DUP 1C00 AND CASE 1000 OF 10# ." CALL \ CALL " ENDOF 1400 OF 10# ." JMP \ JMP " ENDOF 2DROP ENDCASE ; : 4R ( R ... ) 0F AND 6 .R 2 SPACES ; \ : 9C4R.GROUP ( N ... ) DUP 1FF0 AND \ CASE \ 0 OF DUP 5 6 BETWEEN OVER 0B 0F BETWEEN OR \ IF 4R ." A>IOCR \ IOWR " ELSE DROP THEN ENDOF \ \ 0 OF 4R ." A>IOCR \ IOWR " ENDOF \ 10 OF 4R ." IOCR>A \ IORR " ENDOF \ 2DROP \ ENDCASE ; : 9C4R.GROUP ( N ... ) >R R@ 1FF0 AND DUP R@ 1FE0 AND 0 = IF R@ 0F AND DUP 5 6 BETWEEN SWAP 0B 0F BETWEEN OR IF CASE 0 OF 4R ." A>IOCR \ IOWR " ENDOF 10 OF 4R ." IOCR>A \ IORR " ENDOF 2DROP ENDCASE ELSE 2DROP THEN ELSE 2DROP THEN R> DROP ; : DISASSEM ( ADDR ... ADDR' ) BASE @ >R HEX >R ." ( " R@ U2/ .XXXX 2 SPACES R@ @ .XXXX ." )" 6 SPACES R@ @ DUP 13C.GROUP DUP 4C3B6R.GROUP DUP 7C6R.GROUP DUP 5C8#.GROUP DUP 9C4R.GROUP 3C10#.GROUP R> 2 + R> BASE ! ; : U ( ADDR ... ADDR' ) 2 * 10 0 DO CR DISASSEM LOOP 2/ ; : NEW.DISASSEM ( ... ) [ ' DISASSEM FLIP ] LITERAL [ ' PRINT.A.LINE.OF.ASM.INSTRUCTION ] LITERAL 02 OVER C! 1+ ! ; : END ; NEW.DISASSEM \ ===================================================================== \ FORTH TO PIC COMPILER PIC 16C84 SEP. 7, 2001 16C84C.SEQ F2P4.SEQ \ ===================================================================== : CODE. CREATE -2 ALLOT [ ' doLIT FLIP ] LITERAL , HERE' , 22 C, ; : L: CODE. ; : :. CODE. ; : ;' RET ; : ;. RET ; : END-CODE. RET ; : END-CODE. RET ; : SEE' ' DUP >R INST R> 3 + @ U ; : SEE. SEE' ; \ =========================================================================== : SP+ 0 R+ ; : SP- 0 R- ; : N>T (0)>A ; : T>N A>(0) ; : TnN An(0) ; : ToN Ao(0) ; : TxN Ax(0) ; : T>T1 5 A>R ; : T1>T 5 R>A ; : T>T2 6 A>R ; : T2>T 6 R>A ; : T>T3 7ÄA>R ; : T3>T 7 R>A ; \ \ =========================================================================== 10 ORG' \ ADD, SUB, RL, RR AFFECTS CY CODE. '2DROP SP+ : 2DROP. '2DROP CALL ; \ CY CODE. 'DROP N>T L: 'NIP SP+ RET : DROP. 'DROP CALL ; \ IS CODE. '?DUP 0 To# Z=0? RET : NIP. 'NIP CALL ; \ UNAFFEC CODE. 'DUP SP- T>N RET : DUP. 'DUP CALL ; \ TED. CODE. 'AND TnN 'NIP JMP CODE. 'OR ToN 'NIP JMP CODE. 'XOR TxN 'NIP JMP CODE. 'OVER DUP. SP+ N>T SP- RET CODE. 'SWAP T>T1 N>T2 T1>N T2>T RET \ T<->N CODE. 'ROT T>T1 N>T2 T1>N SP+ N>T1 T2>N SP- T1>T RET CODE. '0= 0 To# Z=1? T=FF RET CODE. '= N-T T=FF Z=1? T=0 'NIP JMP CODE. '> N- N-T T=FF CY=0? T+ 'NIP JMP CODE. '< N-T 0 #>T CY=0? 'NIP JMP Z=1? T=FF 'NIP JMP CODE. '- N-T>T 'NIP JMP : [-] N-T>T 'NIP JMP ; CODE. '+ T+N 'NIP JMP : [+] T+N 'NIP JMP ; CODE. '1+ 1 T+# RET : [1+] 1 T+# ; CODE. '2+ 2 T+# RET : [2+] 2 T+# ; CODE. '1- FF T+# RET : [1-] FF T+# ; CODE. '2- FE T+# RET : [2-] FE T+# ; CODE. '2* CY=0 T>T1 T1 RLCR>T RET CODE. '2/ CY=0 T>T1 T1 RRCR>T RET CODE. 'D+ T>T1 N>T2 2DROP. T1+T N+T2 CY=0? T1 R+ T1>T RET CODE. 'D- T>T1 N>T2 2DROP. T-T1 T2-N CY=0? T1 R- T1>T RET CODE. 'S>D DUP. T=0 RET ( N ... N 0 ) CODE. 'INVERT FF Tx# RET CODE. 'ABS T>T1 T1 7 RB=1? RET CODE. 'NEGATE 0 #-T RET : [NEGATE] 0 #-T ; \ -T CODE. '* \ ( N1 N2 ... N1*N2.LOW N1*N2.HIGH ) T>T2 8 #>T1 N>T N=0 \ LOW BYTE BEGIN' CY=0 T2 0 RB=0? N+T RRCN T2 RRCR T1 UNTIL'R-1=0 SP+ T2>T RET CODE. '@ T>T1 SP>T3 T1>SP N>T1 T3>SP T1>T RET CODE. 'TT1 T>T1 N>T2 SP>T3 T1>SP RET CODE. '! 'TT1 CALL T2>N L: L1 T3>SP '2DROP JMP CODE. '+! 'TT1 CALL N+T2 L1 JMP CODE. 'DO T>T1 N>T2 SP>T3 RSP->SP T2>N SP- T1>N SP>RSP T3>SP 'DROP JMP CODE. 'LEAVE T>T1 SP>T3 RSP+>SP N->T DUP. T3>SP T1>T RET CODE. 'LOOP T>T1 SP>T3 RSP>SP N+ DROP. TxN Z=1? FROM' SP+>RSP T3>SP T1>T CY=1 RET TO' SP->RSP T3>SP T1>T CY=0 RET CODE. '+LOOP T>T1 SP>T3 RSP>SP T1>T N+T N+>T SP+ N-T>T CY=0? FROM' SP+>RSP CY=1 L: L1 T3>SP 'DROP JMP TO' SP->RSP CY=0 L1 JMP CODE. 'TT2 DUP. SP>T1 RSP>SP RET : TT2. 'TT2 CALL ; CODE. 'I TT2. L: 'TT2 N>T2 L: 'TT3 T1>SP T2>T RET \ (RSP+0)>T CODE. 'I' TT2. SP+ 'TT2 JMP \ (RSP+1)>T CODE. 'J TT2. SP+2 'TT2 JMP \ (RSP+2)>T CODE. 'R> TT2. N>T2 SP+>RSP 'TT3 JMP \ (RSP)>T RSP+1 CODE. '>R T>T2 SP>T1 RSP->SP T2>N SP>RSP T1>SP 'DROP JMP CODE. 'R@ 'I JMP \ RSP-1 T>(RSP) : .. ( N ... ) DUP. #>T ; \ LEFT DATA ON THE STACK CODE. 'DELAY.T HERE' 1+ CALL CODE. 'DELAY.T/2 20 .. CODE. 'DELAY ( A ... ) BEGIN' UNTIL'T-1=0 'DROP JMP : DELAY.T/2. 'DELAY.T/2 CALL ; \ MACRO INSTRUCTION : DELAY.T. 'DELAY.T CALL ; \ MACRO CODE. 'EMIT T<>0? 'DROP JMP T>T1 9 #>T2 CY=0 ( START BIT 0 ) L: L1 CY=1? HERE' 3 + JMP TX=1 HERE' 2 + JMP TX=0 DELAY.T. T1 RRCR T2 R-? L1 JMP TX=1 DELAY.T. 'DROP JMP ( STOP BIT 1 ) : EMIT. 'EMIT CALL ; \ MACRO : [@RX] CY=0 RX RB=0? CY=1 ; \ ( ... CY ) CODE. 'CR 0A .. EMIT. 0D .. 'EMIT JMP CODE. 'KEY 9 #>T2 BEGIN' RX UNTIL'RB=0 DELAY.T/2. ( START BIT 0 ) BEGIN' [@RX] T1 RRCR DELAY.T. T2 UNTIL'R-1=0 T1>T RET \ ========================================================================== : ?DUP. '?DUP CALL ; : AND. 'AND CALL ; : XOR. 'XOR CALL ; : OR. 'OR CALL ; : OVER. 'OVER CALL ; : SWAP. 'SWAP CALL ; : ROT. 'ROT CALL ; : =. '= CALL ; : 0=. '0= CALL ; : >. '> CALL ; : <. '< CALL ; : -. '- CALL ; : +. '+ CALL ; : D+. 'D+ CALL ; : D-. 'D- CALL ; : 1+. '1+ CALL ; : 2*. '2* CALL ; : 2/. '2/ CALL ; : S>D. 'S>D CALL ; : INVERT. 'INVERT CALL ; : ABS. 'ABS CALL ; : NEGATE. 'NEGATE CALL ; : *. '* CALL ; : @. '@ CALL ; : !. '! CALL ; : +!. '+! CALL ; : DO. 'DO CALL ; : LEAVE' 'LEAVE CALL ; : LOOP. 'LOOP CALL ; : +LOOP. '+LOOP CALL ; : I. 'I CALL ; : I'. 'I' CALL ; : J. 'J CALL ; : >R. '>R CALL ; : R>. 'R> CALL ; : R@. 'R@ CALL ; : CR. 'CR CALL ; : KEY. 'KEY CALL ;