;; extends the sample in textbook, by tsaiwn@csie.nctu ORG $A0 ; .start 0A0h ( $A0 ) LOAD 5,6c ; LD 5,6C A0: 15 6C; Load from mem[6c] Load 6,6D ; LD 6,6D A2: 16 6D ; ADD 0,5,6 ; A4: 50 56 ; R0:= R5 + R6 ; ADDI 0,5,6 STORE 0,6E ; A6: 30 6E ; Store 0,6E ; ST 0,6E A8: HALT ; A8: C0 00 ; HALT ; HLT ;; iiStr := '156C166D5056306EC000'; ;; addToMem(pc, iiStr); LDI 1,01 ; AA: 2101 ; R1 := 1; LDI 2,00 ; AC: 2200 ; R2 := 0; LDI 5,30 ; AE: 2530 ; R5 :='0'; ==30h B0: LDI 7,0F ; B0: 270f ; R7 :=0fh; LDI 8,6C ; B2: 286C ; R8 := 6C ;; iiStr := '210122002530270f286C'; ;; addToMem(pc, iiStr); Again: ;LOOP (repeat .. until) B4: LDI 0,4D ; 204D ; 'M' PUTC ; d100 ; print char in R0 B8: LDI 0,28 ; 2028 ; '(' PUTC ; d100 ; print char in R0 LDI 0,30 ; 2030 ; '0' PUTC ; d100 ; print char in R0 ;; iiStr := '204Dd1002028d1002030d100'; ;; addToMem(pc, iiStr); C0: MOV 8,0 ; 4080 ; copy R8 to R0 ADD 0,0,2 ; 5002 ; R0 := R0+R2; STORE 0,RDATA+1 ; 30?? ; ?? =D9 LDI A,#PHHH ;2A?? ; ?? = cc ;;iiStr := '4080500230d92acc'; ;;addToMem(pc, iiStr); C8: STORE A,PRTR0RTN+1 ; 3A?? ; store return address; ??=27 JUMP 0,PRTR0 ; B0?? ; CALL PRTR0; ??=10 PHHH: cc: LDI 0,68 ; 2068 ; 'h' PUTC ; d100 ; print char in R0 ;;iiStr := '3a27B0102068d100'; ;;addToMem(pc, iiStr); D0: LDI 0,29 ; 2029 ; ')' PUTC ; d100 ; print char in R0 LDI 0,3D ; 203D ; '=' PUTC ; d100 ; print char in R0 ;;iiStr := '2029d100203Dd100'; ;;addToMem(pc, iiStr); RDATA: ;; Read DATA from memory into R0 D8: LOAD 0,?? ; 10ff ; ?? = 6C, 6D, 6E LDI A,#PCRLF ;2A?? ; ?? = E0 STORE A,PRTR0RTN+1 ; 3A?? ; store return address ;??=27 JUMP 0,PRTR0 ; B0?? ; CALL PRTR0 to print the data; ??=10 ;;iiStr := '10ff2aE03a27B010'; ;;addToMem(pc, iiStr); PCRLF: ;; will return to this location after Call PRTR0 E0: LDI 0,0D ; 200D ;CR PUTC ; d100 ; print char in R0 LDI 0,0A ; 200A ;LF PUTC ; d100 ; print char in R0 ;;iiStr := '200Dd100200Ad100'; ;;addToMem(pc, iiStr); E8: ADD 2,2,1 ; 5221 ;R2:= R2+1 LDI 0, 3 ; 2003 ; R0:=3; JUMP 2,DONE ; B2?? ;if(R2==3) goto DONE ; ??=F0 JUMP 0,Again ; B0?? ;goto Again (Loop 3 times);??=B4 ;;iiStr := '52212003B2f0B0B4'; ;;addToMem(pc, iiStr); DONE: F0: HALT ; C000 JMP 0,A0 ; B0A0 ; goto A0 (Begin) NOP ; 0000 iiStr := 'C000B0A00000'; addToMem(pc, iiStr); ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; Routines to print (R0 >> 4), (R0 &0xf) ORG $10 ; start @ 10h ( $10 = 10h = 16) ;; Subroutine to print R0 in Hexa format PRTR0: ; Print R0 as 2 HexaDigits W010: MOV R0, Rd ; 400d ;copy R0 to Rd (backup into Rd) ROTR R0, 4 ; A004 ; get the Left hexaDigit AND 0,0,7 ; 8007 ;R7 has 0fh LDI A, #here ; 2A1c ;;iiStr := '400dA00480072A1c'; ;;addToMem(pc, iiStr); W018: ;; prepare to call PHSUB (prepare the return addr) STORE A, PHSUBRTN+1 ;3A?? ;?? =41 JUMP R0, PHSUB ;B0?? ;??=28 ;CALL PHSUB ;;now try to print the right most 4 bits here: w01c: MOV Rd, R0 ; 40d0 ;R0:= Rd; AND 0,0,7 ; 8007 ;R7 has 0fh ;;iiStr := '3a41B02840d08007'; (*41 ; 28 *) ;;addToMem(pc, iiStr); W020: LDI A, #PRTR0RTN ; 2A?? ; ?? = 26 STORE A, PHSUBRTN+1 ;3A?? ;?? =41 JUMP R0, PHSUB ;B0?? ;??=28 ;CALL PHSUB PRTR0RTN: w026: JUMP R0, ff ; RETURN ;B0ff ; ff will be replaced ;; ;;iiStr := '2A263a41B028B0ff'; ;;addToMem(pc, iiStr); PHSUB: ; Subroutine to print hex in R0 W028: MOV 0,C ; 400C ;mov r0 to Rc (backup) LDI 0,09 ; 2009 ; #9 JMP C,OK2 ; BC?? ;if(rC==9)goto OK2; ??=3c LDI 0,08 ; 2008 ; binary 1000 ;;iiStr := '400C2009BC3c2008'; ;;addToMem(pc, iiStr); W030: JMP C,OK2 ; BC?? ;if(rc==8)goto OK2 ; ??=3c and A,C,0 ; 8ac0 ;RA := rC and 08h LDI 0,00 ; 2000 JMP A,OK2 ; BA??; if(rA==0)go to OK2 (i.e., RC <= 7);??=3c ;;iiStr := 'BC3c8AC02000BA3c'; ;;addToMem(pc, iiStr); W038: LDI 0,07 ; 2007 ;R0:= #7 ; for 10..15 (ABCDEF) ADD C,C,0 ; 5CC0 ;RC:=RC+#7 OK2: w03c: ADD 0,C,5 ; 50C5 ;R0:= rC + 30h (R5 has 030h) PUTC ; D100 ; print char in R0 ;;iiStr := '20075CC050C5D100'; ;;addToMem(pc, iiStr); PHSUBRTN: W040: JUMP R0, ff ; RETURN BR R0, A0 ; B0A0 ; this is only for man to check NOP ; 0000 ;;iiStr := 'B0ffB0A00000'; ;;addToMem(pc, iiStr); PC $A0 ; set program counter to $A0 (= 160 decimal) SETPC $A0 ; in case that if PC $A0 not work :-) ; note your LOADER might not recognize this Directive END ; END of the Program