; ------------------------------------------------- ; Constants ; ------------------------------------------------- include "../../../lib/jasm/cregs.inc.jsm" ; XIO registers reg_led: equ 0x00 ; R/W reg_pcmmode: equ 0x01 ; R/W reg_encrypt_src: equ 0x02 ; R/W reg_cmd_addr: equ 0x04 ; WO reg_cmd_data: equ 0x06 ; WO lcd_port: equ 0x08 ; R/W reg_pcmin_dc_adj_left: equ 0x0D ; R/W reg_pcmin_dc_adj_right: equ 0x0F ; R/W reg_encrypt_const0: equ 0x11 ; R/W reg_encrypt_const1: equ 0x12 ; R/W reg_encrypt_const2: equ 0x13 ; R/W reg_encrypt_const3: equ 0x14 ; R/W reg_stat_addr: equ 0x04 ; RO reg_stat_data: equ 0x06 ; RO reg_btn: equ 0x80 ; RO reg_dip: equ 0x81 ; RO reg_pcm_left: equ 0x82 ; RO reg_pcm_right: equ 0x84 ; RO reg_stat_hw: equ 0xA0 ; RO reg_beef: equ 0x8E ; reg_stat_hw ; Bits omsk_ac_rdy: equ 0x01 omsk_cmd_rdy: equ 0x02 omsk_stat_rdy: equ 0x04 ; Flag masks omsk_led0: equ 0x01 omsk_led1: equ 0x02 omsk_led2: equ 0x04 omsk_led3: equ 0x08 amsk_led0: equ 0xFE amsk_led1: equ 0xFD amsk_led2: equ 0xFB amsk_led3: equ 0xF7 omsk_btn_W: equ 0x01 omsk_btn_N: equ 0x02 omsk_btn_E: equ 0x04 omsk_btn_S: equ 0x08 omsk_btn_C: equ 0x10 DC_CORR_PCM: equ 0xFF40 COUNT_RELOAD: equ 0x0200 BTN_BOUNCE_RELOAD: equ 0x0400 ; ------------------------------------------------- ; On-Chip memory ; ------------------------------------------------- cmem 0 stat_addr: db 2 stat_data: db 2 count: db 2 btn_bounce_cnt: db 2 btn_state: db 1 btn_last: db 1 audio_vol: db 1 cipher_vol: db 1 vol_was_set: db 1 xmem msg_dsi: dc "DSI GmbH Bremen ", 0 msg_dsi2: dc "October 2007 ", 0 msg_byp1: dc " Encryption ", 0 msg_byp2: dc " Bypass ", 0 msg_ecb: dc "ECB-128 encrypt.", 0 msg_cbc: dc "CBC-128 encrypt.", 0 msg_audio: dc " Audio data ", 0 msg_incdata: dc " Increm. blocks ", 0 msg_setvol: dc "Volume : ", 0 msg_blank16: dc " ", 0 ac97_cfg_addr: dc 0x00, 0x2A ; W: Extended Audio CTRL/STATUS dc 0x00, 0x1A ; W: Record select dc 0x00, 0x1C ; W: Record gain dc 0x00, 0x2C ; W: PCM DAC rate dc 0x00, 0x32 ; W: PCM ADC rate dc 0x00, 0x20 ; W: General purpose dc 0x00, 0x02 ; W: Master volume dc 0x00, 0x04 ; W: Headphone volume dc 0x00, 0x18 ; W: PCM volume ac97_cfg_data: dc 0x01, 0x00 ; W: VRA=1 dc 0x04, 0x04 ; W: Record source = LINE_IN dc 0x00, 0x00 ; W: Record gain = 0dB dc 0x80, 0xBB ; W: DAC rate 8000Hz dc 0x80, 0xBB ; W: ADC rate 8000Hz ; dc 0x80, 0xBB ; W: DAC rate 48000Hz ; dc 0x80, 0xBB ; W: ADC rate 48000Hz dc 0x00, 0x80 ; W: POP=1 dc 0x00, 0x00 ; W: Master volume = 0dB dc 0x00, 0x80 ; W: Headphone volume = 0dB, muted dc 0x0A, 0x0A ; W: PCM volume = -3dB ; ------------------------------------------------- ; Program ; ------------------------------------------------- code org 0x000 reset: jmp init org 0x001 jmp frame_isr ; ------------------------------------------------- ; Main ; ------------------------------------------------- init: mov R0, COUNT_RELOAD'low mov R1, COUNT_RELOAD'high movc (count+0), R0 movc (count+1), R1 mov R0, 0x00 xout (reg_led), R0 mov R0, 0xFF xout (reg_encrypt_const0), R0 mov R0, 0x3b xout (reg_encrypt_const1), R0 mov R0, 0x9c xout (reg_encrypt_const2), R0 mov R0, 0x01 xout (reg_encrypt_const3), R0 mov R0, 0x00 movc (btn_state), R0 movc (btn_last), R0 mov R0, BTN_BOUNCE_RELOAD'low movc (btn_bounce_cnt+0), R0 mov R0, BTN_BOUNCE_RELOAD'high movc (btn_bounce_cnt+1), R0 mov R0, 0x0A movc (audio_vol), R0 mov R0, 0x0C movc (cipher_vol), R0 call LCD_init ; Print Hello world mov R0, LCD_CMD_CLEAR call LCD_writecmd mov R1, msg_dsi call LCD_putsx mov R0, LCD_CMD_Z2 call LCD_writecmd mov R1, msg_dsi2 call LCD_putsx call delay1s wait_ac_rdy: xin R0, (reg_stat_hw) and R0, omsk_ac_rdy jz wait_ac_rdy ; Send AC97 Status register read-request (CODEC_ID) mov R0, 0x00 ; Addr(LSW) mov R1, 0x80 ; Addr(MSW) mov R2, 0x00 ; Data(LSW) mov R3, 0x00 ; Data(MSW) call AC_status_io movc (stat_addr+0), R0 movc (stat_addr+1), R1 movc (stat_data+0), R2 movc (stat_data+1), R3 ; Initialize AC97 ; check status ac97_rdy_lp: mov R0, 0x00 mov R1, 0xA6 mov R2, 0x00 mov R3, 0x00 call AC_status_io and R2, 0x0F cmp R2, 0x0F jne ac97_rdy_lp mov R15, 9 mov R7, ac97_cfg_addr mov R8, ac97_cfg_data ac97_init_lp: movx R0, (R7) inc R7 movx R1, (R7) inc R7 movx R2, (R8) inc R8 movx R3, (R8) inc R8 call AC_status_io dec R15 jnz ac97_init_lp ; Set PCM mode call set_pcm_byp ; PCM-IN: Set DC correction LEFT mov R0, DC_CORR_PCM'high xout (reg_pcmin_dc_adj_left+1), R0 mov R0, DC_CORR_PCM'low xout (reg_pcmin_dc_adj_left+0), R0 ; PCM-IN: Set DC correction RIGHT mov R0, DC_CORR_PCM'high xout (reg_pcmin_dc_adj_right+1), R0 mov R0, DC_CORR_PCM'low xout (reg_pcmin_dc_adj_right+0), R0 ; Enable Interrupt mov R0, 0x07 cout (cpu_int_ctrl), R0 ; ----------------------------------------------------- ; Check buttons ; ----------------------------------------------------- main: movc R0, (btn_state) tst R0 jnz chk_vol mov R1, 0 movc (vol_was_set), R1 chk_vol: and R0, 0x10 jz chk_ecb movc R0, (btn_state) cmp R0, 0x14 jeq incvol cmp R0, 0x11 jeq decvol movc R1, (vol_was_set) tst R1 jnz main call set_pcm_byp jmp main incvol: movc R0, (audio_vol) cmp R0, 0x00 jeq main dec R0 movc (audio_vol), R0 call set_audio_vol mov R0, LCD_CMD_Z1 call LCD_writecmd mov R1, msg_blank16 call LCD_putsx mov R0, LCD_CMD_Z1 call LCD_writecmd mov R1, msg_setvol call LCD_putsx mov R0, 0x1F movc R1, (audio_vol) sub R0, R1 call PutHexByte call delay100ms call delay100ms mov R0, 1 movc (vol_was_set), R0 jmp main decvol: movc R0, (audio_vol) cmp R0, 0x1F jeq main inc R0 movc (audio_vol), R0 call set_pcm_byp mov R0, LCD_CMD_Z1 call LCD_writecmd mov R1, msg_blank16 call LCD_putsx mov R0, LCD_CMD_Z1 call LCD_writecmd mov R1, msg_setvol call LCD_putsx mov R0, 0x1F movc R1, (audio_vol) sub R0, R1 call PutHexByte call delay100ms call delay100ms mov R0, 1 movc (vol_was_set), R0 jmp main chk_ecb: movc R0, (btn_state) and R0, 0x09 jz chk_cbc mov R1, 0x01 and R0, 0x01 jne ecb_set_now mov R1, 0x00 ecb_set_now: xout (reg_encrypt_src), R1 call set_pcm_ecb jmp main chk_cbc: movc R0, (btn_state) and R0, 0x06 jz ex_chk mov R1, 0x01 and R0, 0x04 jne cbc_set_now mov R1, 0x00 cbc_set_now: xout (reg_encrypt_src), R1 call set_pcm_cbc ex_chk: jmp main ; ----------------------------------------------------- set_pcm_byp: ; Set PCM mode mov R0, 0x00 xout (reg_pcmmode), R0 ; Switch on LED mov R0, 0x06 xout (reg_led), R0 call set_audio_vol ; Set LCD text mov R0, LCD_CMD_Z1 call LCD_writecmd mov R1, msg_byp1 call LCD_putsx mov R0, LCD_CMD_Z2 call LCD_writecmd mov R1, msg_byp2 call LCD_putsx ret set_pcm_ecb: ; Set PCM mode mov R0, 0x01 xout (reg_pcmmode), R0 ; Switch on LED mov R0, 0x08 xout (reg_led), R0 call set_cipher_vol ; Set LCD text mov R0, LCD_CMD_Z1 call LCD_writecmd mov R1, msg_ecb call LCD_putsx mov R1, msg_audio xin R0, (reg_encrypt_src) and R0, 0x01 jnz ecb_print mov R1, msg_incdata ecb_print: mov R0, LCD_CMD_Z2 call LCD_writecmd call LCD_putsx ret set_pcm_cbc: ; Set PCM mode mov R0, 0x02 xout (reg_pcmmode), R0 ; Switch on LED mov R0, 0x01 xout (reg_led), R0 call set_cipher_vol ; Set LCD text mov R0, LCD_CMD_Z1 call LCD_writecmd mov R1, msg_cbc call LCD_putsx xin R0, (reg_encrypt_src) and R0, 0x01 jnz cbc_print mov R1, msg_incdata cbc_print: mov R0, LCD_CMD_Z2 call LCD_writecmd call LCD_putsx ret ; ------------------------------------------------- set_audio_vol: ; Set PCM volume mov R0, 0x00 ; Addr(LSW) mov R1, 0x18 ; Addr(MSW) movc R2, (audio_vol) ; Data(LSW) movc R3, (audio_vol) ; Data(MSW) call AC_status_io movc (stat_addr+0), R0 movc (stat_addr+1), R1 movc (stat_data+0), R2 movc (stat_data+1), R3 ret ; ------------------------------------------------- set_cipher_vol: ; Set PCM volume mov R0, 0x00 ; Addr(LSW) mov R1, 0x18 ; Addr(MSW) movc R2, (cipher_vol) ; Data(LSW) movc R3, (cipher_vol) ; Data(MSW) call AC_status_io movc (stat_addr+0), R0 movc (stat_addr+1), R1 movc (stat_data+0), R2 movc (stat_data+1), R3 ret ; ------------------------------------------------- frame_isr: push R0 push R1 push R2 push R3 movc R0, (count+0) movc R1, (count+1) dec R0 subc R1, 0 movc (count+0), R0 movc (count+1), R1 tst R1 jnz ex_fisr tst R0 jnz ex_fisr mov R0, COUNT_RELOAD'low mov R1, COUNT_RELOAD'high movc (count+0), R0 movc (count+1), R1 xin R0, (reg_encrypt_const0) xin R1, (reg_encrypt_const1) xin R2, (reg_encrypt_const2) xin R3, (reg_encrypt_const3) inc R0 addc R1, 0 addc R2, 0 addc R3, 0 xout (reg_encrypt_const0), R0 xout (reg_encrypt_const1), R1 xout (reg_encrypt_const2), R2 xout (reg_encrypt_const3), R3 ;Sample switches and buttons ex_fisr: xin R0, (reg_btn) movc R1, (btn_bounce_cnt+1) movc R2, (btn_bounce_cnt+0) tst R1 jnz dec_bounce tst R2 jz btn_is_valid dec_bounce: dec R2 subc R1, 0 movc (btn_bounce_cnt+1), R1 movc (btn_bounce_cnt+0), R2 movc R1, (btn_last) xin R0, (reg_btn) movc (btn_last), R0 cmp R0, R1 jeq exit_isr jmp bounce_wait btn_is_valid: movc (btn_state), R0 bounce_wait: mov R1, BTN_BOUNCE_RELOAD'high movc (btn_bounce_cnt+1), R1 mov R1, BTN_BOUNCE_RELOAD'low movc (btn_bounce_cnt+0), R1 exit_isr: pop R3 pop R2 pop R1 pop R0 reti ; ------------------------------------------------- ; AC Read/Write register ; R0 : IN/OUT AC register address 7..0. Written, if cmd was READ (i.e. address[15] = 1) ; R1 : IN/OUT AC register address 15..8. Written, if cmd was READ (i.e. address[15] = 1) ; R2 : IN/OUT AC register data 7..0. Written, if cmd was READ (i.e. address[15] = 1) ; R3 : IN/OUT AC register data 15..8. Written, if cmd was READ (i.e. address[15] = 1) AC_status_io: call wait_cmd_rdy xout (reg_cmd_addr+1), R1 xout (reg_cmd_addr+0), R0 xout (reg_cmd_data+1), R3 xout (reg_cmd_data+0), R2 ; Check if command was read and R1, 0x80 jnz wait_read ret ; Wait for READ command being processed wait_read: call wait_stat_rdy ; Read AC97 Status register address xin R1, (reg_stat_addr+1) xin R0, (reg_stat_addr+0) ; Read AC97 Status register data xin R3, (reg_stat_data+1) xin R2, (reg_stat_data+0) ret ; ------------------------------------------------- wait_cmd_rdy: push R0 wcr_loop: xin R0, (reg_stat_hw) and R0, omsk_cmd_rdy jz wcr_loop pop R0 ret ; ------------------------------------------------- wait_stat_rdy: push R0 wsr_loop: xin R0, (reg_stat_hw) and R0, omsk_stat_rdy jz wsr_loop pop R0 ret ; ------------------------------------------------- ; PutHexByte ; R0 : Byte value PutHexByte: call bin2hex call LCD_writechar mov R0, R1 call LCD_writechar ret include "../../../lib/jasm/delays.inc.jsm" include "../../../lib/jasm/lcd.inc.jsm" include "../../../lib/jasm/utils.inc.jsm"