*AICCOM31.ASM - AIC COMMUNICATION ROUTINES - POLLING OR INTERRUPT  
        .data                  ;assemble into data section
PBASE   .word   808000h        ;peripheral base address
SETSP   .word   0E970300h      ;serial port set-up data
ATABLE  .word   AICSEC         ;SP0 AIC init table address
        .text                  ;assemble into text section
AICSET  PUSH    AR0            ;save AR0
        PUSH    AR1            ;save AR1
        PUSH    R0             ;save R0
        PUSH    R1             ;save R1
        LDI     @PBASE,AR0     ;AR0 -> 808000h
        LDI     1,R0           ;timer CLK=H1/2*(AIC master CLK)
        STI     R0,*+AR0(28h)  ;timer period reg(TCLK0=6.25 MHZ)
        LDI     03C1h,R0       ;init timer global register
        STI     R0,*+AR0(20h)  ;reset timer 
        LDI     62h,IOF        ;AIC reset = 0
        LDI     @ATABLE,AR1    ;AR1 -> AIC init data
        RPTS    99             ;repeat next instr 100 times
        NOP                    ;keep IOF low for a while
        LDI     131h,R0        ;X & R port control register data
        STI     R0,*+AR0(42h)  ;FSX/DX/CLKX=SP operational pins
        STI     R0,*+AR0(43h)  ;FSR/DR/CLKR=SP operational pins
        LDI     @SETSP,R0      ;RESET->SP:16 bits,ext clks,std mode
        STI     R0,*+AR0(40h)  ;FSX=output&INT enable SP global reg
        LDI     0,R0           ;R0 = 0
        STI     R0,*+AR0(48h)  ;clear serial port XMIT register
        OR      06h,IOF        ;bring AIC out of reset
        LDI     03h,RC         ;RC=3 to transmit 4 values
        RPTB    SECEND         ;repeat 4 data transmit of sec com
        CALL    TWAIT          ;wait for data transmit
        LDI     03h,R0         ;value for secondary XMIT request
        STI     R0,*+AR0(48h)  ;secondary XMIT request to AIC
        CALL    TWAIT          ;wait for data transmit
        LDI     *AR1++(1),R0   ;AR1 -> next AIC init data
SECEND  STI     R0,*+AR0(48h)  ;DTR = current AIC data
        POP     R1             ;restore R1
        POP     R0             ;restore R0
        POP     AR1            ;restore AR1
        POP     AR0            ;restore AR0
        RETS                   ;return from subroutine
AICSET_I                       ;---CONFIG FOR INTERRUPT -----------
        CALL    AICSET         ;call AICSET routine
        LDI     0h,IF          ;clear IF register
        OR      10h,IE         ;enable EXINT0 CPU interrupt
        OR      2000h,ST       ;global interrupt enable
        RETS                   ;return from subroutine     
;--------------------TRANSMIT WAIT ROUTINE-------------------------
TWAIT   PUSH    AR0            ;save AR0
        PUSH    R0             ;save R0
        LDI     @PBASE,AR0     ;AR0 -> 0808000h
TW1     LDI     *+AR0(40h),R0  ;R0=content of SP global control reg
        AND     02h,R0         ;see if transmit buffer is ready
        BZ      TW1            ;if not ready, try again
        POP     R0             ;restore R0
        POP     AR0            ;restore AR0
        RETS                   ;return from subroutine
;--------------------AIC TRANSFER ROUTINE--------------------------
AICIO_I LDI     R7,R6          ;copy output to modify for AIC
        LSH     2,R6           ;two LSB must=0 for primary AIC comm
IO      PUSH    AR0            ;save AR0 
        LDI     @PBASE,AR0     ;AR0 -> 0808000h
        STI     R6,*+AR0(48h)  ;DTR = next data for AIC D/A
        LDI     *+AR0(4Ch),R6  ;R6 = DRR data from AIC A/D
        LSH     16,R6          ;left shift for sign extension
        ASH     -18,R6         ;right shift keeping sign
        POP     AR0            ;restore AR0
        RETS                   ;return from subroutine
;--------------------AIC POLLING ROUTINE---------------------------
AICIO_P CALL    TWAIT          ;wait for data to be transferred
        CALL    AICIO_I        ;call AIC transfer routine
        RETS                   ;return from subroutine     
SW_IO   PUSH    AR0            ;save AR0
        LDI     @PBASE,AR0     ;AR0 -> 0808000h
        LDI     R7,R6          ;copy output to modify for AIC
        LSH     2,R6           ;prepare for secondary AIC com
        OR      03h,R6         ;set two LSB for secondary com
        CALL    TWAIT          ;wait for data to be transferred
        CALL    IO             ;call AIC transfer routine
        CALL    TWAIT          ;wait for data to be transferred
        STI     R1,*+AR0(48h)  ;DTR = next data for AIC control
        POP     AR0            ;restore AR0
        RETS                   ;return from subroutine
;SUBROUTINES FOR PRIMARY OR AUXILIARY INPUT
IOPRI   PUSH    R1             ;save R1
        LDI     063h,R1        ;load secondary com data into R1
        CALL    SW_IO          ;call IO routine to switch inputs
        POP     R1             ;restore R1
        RETS                   ;return from subroutine
IOAUX   PUSH    R1             ;save R1
        LDI     073h,R1        ;load secondary com data into R1
        CALL    SW_IO          ;call IO routine to switch inputs
        POP     R1             ;restore R1
        RETS                   ;return from subroutine
            
























