**=========Registers PORTA EQU $0000 ;PORT A(0) : OUTPUT DDRA EQU $0004 PORTB equ $0001 ;PORT B(0) : OUTPUT DDRB equ $0005 PORTC equ $0002 ;PORT C(0) : INPUT ( LONG OR SHORT PULSE ) DDRC equ $0006 INTSCR equ $001D ;IRQ Status and Control Register * BEGIN equ $8000 * **=========Main Program * ORG BEGIN INIT: * *=========initialize for main program======== * SEI ;DISABLE INTERRUPT MOV #$FF,DDRA MOV #$FF,DDRB MOV #$00,DDRC BCLR 0,PORTA ;OUTPUT LOW BCLR 0,PORTB LDA #$01 ;ENABLE IRQ INTERRUPT WITH EDGE TRIGGER AND LEVEL TRIGGER STA INTSCR CLI START: LDA #$01 ;TEST THE FIRST BIT OF PORTC BIT PORTC ;DETERMINE LONG OR SHORT PULSE REGIME BNE LONG ;IF Z!=0, LONG PULSE REGIME SHORT: SEI ;SHORT PULSE REGIME, DISABLE IRQ INTERRUPT LDHX #0000 ;CLEAR TIME COUNTER BSET 0,PORTA ;OUTPUT HIGH BSET 0,PORTB S_T_H_LOOP: AIX #1 ;INCREASE H:X CPHX #S_T_H BLO S_T_H_LOOP ;LESS THAN S_T_H, INCREASE NEXT LDHX #0000 ;CLEAR TIME COUNTER BCLR 0,PORTA ;OUTPUT LOW BCLR 0,PORTB S_T_L_LOOP: AIX #1 ;INCREASE H:X CPHX #S_T_L BLO S_T_L_LOOP ;LESS THAN S_T_L, INCREASE NEXT BRA START ;RETURN TO THE MAIN RUNNING LOOP LONG: BRA START ;RETURN TO THE MAIN RUNNING LOOP * *========= ISR_IRQ ======== * ISR_IRQ: ;IRQ INTERRUPT SERVICE SEI LDA #$03 ;DISABLE IRQ INTERRUPT STA INTSCR LDHX #0000 ;CLEAR TIME COUNTER BSET 0,PORTA ;OUTPUT HIGH BSET 0,PORTB L_T_H_LOOP: * LDA #00 *INNER_1: * INCA * CMP #TIMES * BLO INNER_1 AIX #1 ;INCREASE H:X CPHX #L_T_H BLO L_T_H_LOOP ;LESS THAN L_T_H, INCREASE NEXT BCLR 0,PORTA ;OUTPUT LOW BCLR 0,PORTB L_T_L_LOOP: ;ADD A LOW LEVEL AFTER OUTPUT LDA #00 INNER_2: INCA CMP #TIMES BLO INNER_2 AIX #1 ;INCREASE H:X CPHX #L_T_L BLO L_T_L_LOOP ;LESS THAN L_T_L, INCREASE NEXT LDA #$01 ;ENABLE IRQ INTERRUPT STA INTSCR CLI RTI * *========= Vector Table ========== * ORG $DFFA IRQ_VECTOR DW ISR_IRQ ORG $DFFE RESET_VECTOR DW INIT * *========= DATA STORE ========== * S_T_H EQU $0013 ;SHORT PULSE WIDTH, 70us S_T_L EQU $30C2 ;SHORT PULSE INTERVAL, 40ms *L_T_H EQU $0C30 ;LONG PULSE WIDTH, 10ms L_T_H EQU $FFFF ;LONG PULSE WIDTH, 10ms L_T_L EQU $FFFF ;LONG PULSE WIDTH, 25000*0.4us=10ms TIMES EQU $0F