#asm ARG1 EQU 6 ARG2 EQU 8 #endasm /* Enable interrupts */ e_int() { #asm CLI #endasm } /* Disable interrupts */ d_int() { #asm SEI #endasm } /* Bit_set: Called with 1's in the position to be set */ bit_set(addr,val) int addr; char val; { #asm LDX ARG2,Y LDAB ARG1+1,Y ORAB 0,X STAB 0,X #endasm } /* Bit_clr: Called with 1's in the position to be cleared */ bit_clr(addr,val) int addr; char val; { #asm LDX ARG2,Y LDAB ARG1+1,Y COMB ANDB 0,X STAB 0,X #endasm } /* Pokeb: Write a byte to address */ pokeb(addr,val) unsigned int addr; unsigned char val; { #asm LDX ARG2,Y LDAB ARG1+1,Y STAB 0,X #endasm } /* Poke: Write a word to address */ poke(addr,val) unsigned int addr; int val; { #asm LDX ARG2,Y LDD ARG1,Y STD 0,X #endasm } /* Peekb: Read a byte from address */ peekb(addr) unsigned int addr; { #asm LDX ARG1,Y CLRA LDAB 0,X #endasm } /* Peek: Read a word from address */ peek(addr) unsigned int addr; { #asm LDX ARG1,Y LDD 0,X #endasm } /* Printdec: Print a decimal number */ printdec(num) int num; { #asm LDX ARG1,Y * get number LDY #5 * num of digits LDX #10 decdvlp IDIV * least significant digit in B PSHB * save it LDD #10 XGDX DEY BNE decdvlp * * have five digs saved on stack; start printing when not zero * LDAB #5 * num digs to output decoutlp PULA ADDA #'0' JSR .OUTA DECB BNE decoutlp #endasm } /* Delay: Delay ms miliseconds */ delay(ms) int ms; { /*Uses OC5 to do delay; OC5 not available if delay(ms) is used NOTE: Must enable interrupt before calling delay */ #asm LDX ARG1,Y * time (ms) to delay LDY #BASE Point to register block BCLR TFLG1,Y $F7Clear any pending OC5F flag LOOP CPX #0 BEQ DONE LDD TCNT,Y Get current timer count ADDD #2000 What will count be in 1mS? STD TI4O5,Y Set OC5 to trigger then LP1 BRCLR TFLG1,Y $08 LP1 Loop here till OC5F=1 BCLR TFLG1,Y $F7 Clear OC5F DEX BNE LOOP Continue to delay DONE #endasm }