; ------------------------------------------------- ; Register definitions ; ------------------------------------------------- include "../../../lib/jasm/cregs.inc.jsm" include "xregs.inc.jsm" ; ------------------------------------------------- ; Constants ; ------------------------------------------------- BURST_LEN: equ 8 SD_CMD_WRITE: equ 0x06 SD_CMD_READ: equ 0x05 START_ADDR0: equ 0x00 START_ADDR1: equ 0x00 START_ADDR2: equ 0x20 END_ADDR0: equ 0xF8 END_ADDR1: equ 0xFF END_ADDR2: equ 0xFF PEN_TIMEOUT0: equ 0xE8 PEN_TIMEOUT1: equ 0x03 PEN_BUFSIZE: equ 64 ; External RAM/ROM xmem crlf: dc 13, 10, 0 greet_txt: dc "SDRAM Test", 0 msg_txt0: dc "Clearing SDRAM", 0 msg_txt1: dc "Writing SDRAM", 0 msg_txt2: dc "Reading SDRAM", 0 msg_txt3: dc "Reading Bitmap", 0 verify_ok: dc "Verify OK", 0 verify_nok: dc "Failed at ", 0 dot: dc ".", 0 org 0x80 sdram_data: db 8 ; SDRAM data window at X:0x80 ; Internal RAM cmem 0 block_cnt: db 1 round_cnt: db 1 bmp_offset: db 4 pixel_buf: db 32 pen_rx_buf: db 128 pen_rx_ptr_r: db 1 pen_rx_ptr_w: db 1 pen_timeout: db 2 pen_bit_cnt_w: db 1 pen_octet_w: db 1 pen_octet_r: db 1 pen_last_state: db 1 pen_enable: db 1 pen_bit_cnt_r: db 1 ; ------------------------------------------------- ; Program ; ------------------------------------------------- code reset: org 0x000 jmp main ; ------------------------------------------------- ; ISR ; ------------------------------------------------- org 0x001 pen_isr: push R0 push R1 push R2 u_get_nxt: xin R1, (btn_port) movc R0, (pen_octet_w) and R1, 0x20 shl R1 shl R1 shl R1 rolc R0 movc (pen_octet_w), R0 movc R1, (pen_bit_cnt_w) inc R1 movc (pen_bit_cnt_w), R1 cmp R1, 8 jne ex_uart_isr mov R1, 0 movc (pen_bit_cnt_w), R1 movc R2, (pen_rx_ptr_w) movc (R2), R0 inc R2 cmp R2, pen_rx_buf+128 jne u_upd_nxt mov R2, pen_rx_buf u_upd_nxt: movc (pen_rx_ptr_w), R2 ex_uart_isr: call Timer_isr pop R2 pop R1 pop R0 reti Timer_isr: xin R0, (btn_port) and R0, 0x20 shr R0 xin R1, (ctrl_reg) and R1, 0xEF or R0, R1 xout (ctrl_reg), R0 xin R0, (btn_port) and R0, 0x01 jz btn_chk2 mov R0, vga_read_addr xout (R0), 0x00 inc R0 xout (R0), 0x00 inc R0 xout (R0), 0x00 jmp ex_t_isr btn_chk2: xin R0, (btn_port) and R0, 0x02 jz ex_t_isr mov R0, vga_read_addr xout (R0), 0x00 inc R0 xout (R0), 0x00 inc R0 xout (R0), 0x20 ex_t_isr: ret ; ------------------------------------------------- ; Main ; ------------------------------------------------- main: call pen_init call LCD_init mov R0, 0x00 xout (led_port), R0 mov R0, CTRL_VGA_ENABLE xout (ctrl_reg), R0 xin R0, (ctrl_reg) or R0, CTRL_TIMER_ENABLE xout (ctrl_reg), R0 mov R0, 0x03 cout (cpu_int_ctrl), R0 ; Clear LCD mov R0, LCD_CMD_CLEAR call LCD_writecmd mov R0, 0 mov R1, 0xC0 xout (reg_color_red), R1 xout (reg_color_grn), R1 xout (reg_color_blu), R1 call cg_wait_rdy call cg_clr_screen ; Print greeting message mov R1, greet_txt call LCD_putsx mov R1, greet_txt call cg_puts mov R1, crlf call cg_puts_clr xin R0, (ctrl_reg) and R0, 0xCF xout (ctrl_reg), R0 mov R0, 0 movc (round_cnt), R0 mov R0, 0x0F xout (timer_reload+0), R0 mov R0, 0x27 xout (timer_reload+1), R0 mov R0, 0x00 xout (timer_reload+2), R0 main_loop: call do_clear call write_uart_data ML1: call do_write call do_read movc R0, (round_cnt) inc R0 movc (round_cnt), R0 jmp ML1 ; ---------------------------------------------------------- ; SDRAM clear ; ---------------------------------------------------------- do_clear: ; Clear LCD mov R0, LCD_CMD_CLEAR call LCD_writecmd ; Print Clear message mov R1, msg_txt0 call LCD_putsx mov R1, msg_txt0 call cg_clr_puts mov R1, crlf call cg_puts_clr ; Set SDRAM address register to 0 mov R0, 0 mov R1, 0 mov R2, 0 call AddrCnt_Init ; Fill SDR Buffer with zeros mov R0, sdram_data mov R15, 8 buf_clr_loop: movx (R0), 0 inc R0 dec R15 jnz buf_clr_loop sdr_clear: mov R2, BURST_LEN poll_clear_full: xin R0, (sdram_reg) xout (led_port), R0 and R0, FIFO_STAT_WRITE_DATA_FULL jnz poll_clear_full ; Fill FIFO mov R0, FIFO_CTRL_IS_WRITE xout (sdram_reg), R0 sub R2, 2 jnz poll_clear_full ; Start SDR write call wait_cmd_rdy mov R0, SD_CMD_WRITE xout (sdram_reg), R0 xin R0, (sdram_addr+0) cmp R0, END_ADDR0 jne next_addr_c xin R0, (sdram_addr+1) cmp R0, END_ADDR1 jne next_addr_c xin R0, (sdram_addr+2) cmp R0, END_ADDR2 jeq clear_finished ; Advance address counter next_addr_c: mov R0, BURST_LEN call AddrCnt_Inc jmp sdr_clear clear_finished: call AddrCnt_Disp call delay1s ret ; ---------------------------------------------------------- ; SDRAM Write ; ---------------------------------------------------------- write_uart_data: ; Clear LCD mov R0, LCD_CMD_CLEAR call LCD_writecmd ; Print Clear message mov R1, msg_txt3 call LCD_putsx mov R1, msg_txt3 call cg_clr_puts mov R1, crlf call cg_puts_clr ; Set SDRAM address register to 0 ; mov R0, 0xF8 ; 800x600 ; mov R1, 0x52 ; 800x600 ; mov R2, 0x07 ; 800x600 pen_restart: mov R0, 0x00 ; 1280x1024 mov R1, 0x00 ; 1280x1024 mov R2, 0x00 ; 1280x1024 call AddrCnt_Init call pen_init chk_pen_off: xin R0, (btn_port) and R0, 0x20 jnz chk_pen_off mov R0, 1 chk_pen_on: xin R0, (btn_port) and R0, 0x20 jz chk_pen_on movc R0, (pen_rx_ptr_w) sub R0, 5 cmp R0, pen_rx_buf+128 jlt set_rx_ptr sub R0, 128 set_rx_ptr: movc (pen_rx_ptr_r), R0 ; Fill SDR Buffer get_pen: mov R1, pixel_buf wls0: call pen_getchar movc (R1), R0 inc R1 cmp R1, pixel_buf+8 jne wls0 ; Start SDR write xin R0, (sdram_addr+0) push R0 xin R0, (sdram_addr+1) push R0 xin R0, (sdram_addr+2) push R0 mov R15, 64 write_sd_block: mov R2, BURST_LEN mov R1, pixel_buf copy_sdram: mov R3, sdram_data copy_pixel: movc R0, (R1) movx (R3), R0 inc R3 movx (R3), R0 inc R3 movx (R3), R0 inc R3 inc R1 cmp R3, sdram_data+6 jne copy_pixel pwf: xin R0, (sdram_reg) xout (led_port), R0 and R0, FIFO_STAT_WRITE_DATA_FULL jnz pwf ; Fill FIFO mov R0, FIFO_CTRL_IS_WRITE xout (sdram_reg), R0 sub R2, 2 jnz copy_sdram call wait_cmd_rdy mov R0, SD_CMD_WRITE xout (sdram_reg), R0 ; call AddrCnt_Disp xin R0, (sdram_addr+1) add R0, 0x05 xout (sdram_addr+1), R0 xin R0, (sdram_addr+2) addc R0, 0x00 xout (sdram_addr+2), R0 dec R15 jnz write_sd_block ; Advance address counter pop R0, xout (sdram_addr+2), R0 pop R0 xout (sdram_addr+1), R0 pop R0 xout (sdram_addr+0), R0 xin R0, (sdram_addr+0) cmp R0, 0xF8 jne next_addr xin R0, (sdram_addr+1) cmp R0, 0x04 jne next_addr xin R0, (sdram_addr+2) cmp R0, 0x00 jeq pen_restart next_addr: mov R0, BURST_LEN call AddrCnt_Inc jmp get_pen sdw_fin: call delay1s ret ; ---------------------------------------------------------- ; SDRAM Write ; ---------------------------------------------------------- do_write: ; Clear LCD mov R0, LCD_CMD_CLEAR call LCD_writecmd ; Print Write message mov R1, msg_txt1 call LCD_putsx mov R1, msg_txt1 call cg_clr_puts mov R1, crlf call cg_puts_clr ; Set SDRAM address register to 0 mov R0, START_ADDR0 mov R1, START_ADDR1 mov R2, START_ADDR2 call AddrCnt_Init movc R0, (round_cnt) movc (block_cnt), R0 sdr_write: mov R2, BURST_LEN ; Fill SDR Buffer sdr_burst_wr: movc R1, (block_cnt) mov R0, sdram_data mov R15, 8 write_loop: movx (R0), R1 inc R0 inc R1 dec R15 jnz write_loop poll_write_full: xin R0, (sdram_reg) xout (led_port), R0 and R0, FIFO_STAT_WRITE_DATA_FULL jnz poll_write_full ; Fill FIFO mov R0, FIFO_CTRL_IS_WRITE xout (sdram_reg), R0 movc R0, (block_cnt) inc R0 movc (block_cnt), R0 sub R2, 2 jnz sdr_burst_wr ; Start SDR write call wait_cmd_rdy mov R0, SD_CMD_WRITE xout (sdram_reg), R0 xin R0, (sdram_addr+0) cmp R0, END_ADDR0 jne next_addr_w xin R0, (sdram_addr+1) cmp R0, END_ADDR1 jne next_addr_w xin R0, (sdram_addr+2) cmp R0, END_ADDR2 jeq write_finished ; Advance address counter next_addr_w: mov R0, BURST_LEN call AddrCnt_Inc jmp sdr_write write_finished: call AddrCnt_Disp call delay1s ret ; ---------------------------------------------------------- ; SDRAM Verify ; ---------------------------------------------------------- do_read: ; Clear LCD mov R0, LCD_CMD_CLEAR call LCD_writecmd ; Print Read message mov R1, msg_txt2 call LCD_putsx mov R1, msg_txt2 call cg_clr_puts mov R1, crlf call cg_puts_clr ; Set SDRAM address register to 0 mov R0, START_ADDR0 mov R1, START_ADDR1 mov R2, START_ADDR2 call AddrCnt_Init movc R0, (round_cnt) movc (block_cnt), R0 ; flush_data flush_data: xin R0, (sdram_reg) xout (led_port), R0 and R0, FIFO_STAT_READ_DATA_EMPTY jnz sdr_read mov R0, FIFO_CTRL_IS_READ xout (sdram_reg), R0 jmp flush_data sdr_read: ; Start SDR read call wait_cmd_rdy mov R0, SD_CMD_READ xout (sdram_reg), R0 mov R3, BURST_LEN ; Wait last read poll_read_fin: xin R0, (sdram_reg) xout (led_port), R0 and R0, FIFO_STAT_READ_DATA_EMPTY jnz poll_read_fin ; Verify SDR Buffer movc R1, (block_cnt) mov R0, sdram_data mov R15, 8 read_loop: movx R2, (R0) cmp R2, R1 jne verify_error inc R0 inc R1 dec R15 jnz read_loop ; Advance Read-FIFO mov R0, FIFO_CTRL_IS_READ xout (sdram_reg), R0 movc R0, (block_cnt) inc R0 movc (block_cnt), R0 sub R3, 2 jnz poll_read_fin xin R0, (sdram_addr+0) cmp R0, END_ADDR0 jne next_addr_r xin R0, (sdram_addr+1) cmp R0, END_ADDR1 jne next_addr_r xin R0, (sdram_addr+2) cmp R0, END_ADDR2 jeq read_finished ; Advance address counter next_addr_r: mov R0, BURST_LEN call AddrCnt_Inc jmp sdr_read ; ---------------------------------------------------------- wait_cmd_rdy: push R0 wait4cmd: xin R0, (sdram_reg) xout (led_port), R0 and R0, FIFO_STAT_CMD_FULL jnz wait4cmd pop R0 ret ; ---------------------------------------------------------- read_finished: no_error: mov R0, LCD_CMD_CLEAR call LCD_writecmd mov R1, verify_ok call LCD_putsx mov R0, LCD_CMD_Z2 call LCD_writecmd call print_addr mov R1, verify_ok call cg_clr_puts mov R1, crlf call cg_puts_clr jmp ende verify_error: mov R0, LCD_CMD_CLEAR call LCD_writecmd mov R1, verify_nok call LCD_putsx call print_addr call print_data mov R1, verify_nok call cg_clr_puts mov R1, crlf call cg_puts_clr xin R0, (ctrl_reg) or R0, 0x10 xout (ctrl_reg), R0 jmp ende ende: call delay1s ret ; ------------------------------------------------- AddrCnt_Init: xout (sdram_addr+0), R0 xout (sdram_addr+1), R1 xout (sdram_addr+2), R2 ret ; ------------------------------------------------- ; Parameter ; R0: increment value AddrCnt_Inc: push R1 push R2 push R3 xin R1, (sdram_addr+0) xin R2, (sdram_addr+1) xin R3, (sdram_addr+2) add R1, R0 addc R2, 0 addc R3, 0 xout (sdram_addr+0), R1 xout (sdram_addr+1), R2 xout (sdram_addr+2), R3 pop R3 pop R2 pop R1 ret ; ------------------------------------------------- ; Parameter ; R0: decrement value AddrCnt_Dec: push R1 push R2 push R3 xin R1, (sdram_addr+0) xin R2, (sdram_addr+1) xin R3, (sdram_addr+2) sub R1, R0 subc R2, 0 subc R3, 0 xout (sdram_addr+0), R1 xout (sdram_addr+1), R2 xout (sdram_addr+2), R3 pop R3 pop R2 pop R1 ret ; ------------------------------------------------- ; Display Address counter AddrCnt_Disp: mov R0, LCD_CMD_Z2 call LCD_writecmd call print_addr ret ; ------------------------------------------------- ; PutHexByte ; R0 : Byte value PutHexByte: push R1 call bin2hex call LCD_writechar mov R0, R1 call LCD_writechar pop R1 ret ; ------------------------------------------------- print_addr: push R0 xin R0, (sdram_addr+2) call PutHexByte xin R0, (sdram_addr+1) call PutHexByte xin R0, (sdram_addr+0) call PutHexByte pop R0 ret ; ------------------------------------------------- ; R1 : ptr to byte array print_dword: push R0 add R1, 3 movc R0, (R1) call PutHexByte dec R1 movc R0, (R1) call PutHexByte dec R1 movc R0, (R1) call PutHexByte dec R1 movc R0, (R1) call PutHexByte pop R0 ret ; ------------------------------------------------- print_data: push R0 mov R0, LCD_CMD_Z2 call LCD_writecmd movx R0, (sdram_data+7) call PutHexByte movx R0, (sdram_data+6) call PutHexByte movx R0, (sdram_data+5) call PutHexByte movx R0, (sdram_data+4) call PutHexByte movx R0, (sdram_data+3) call PutHexByte movx R0, (sdram_data+2) call PutHexByte movx R0, (sdram_data+1) call PutHexByte movx R0, (sdram_data+0) call PutHexByte pop R0 ret ; ------------------------------------------------- pen_init: push R0 mov R0, 0 movc (pen_enable), R0 call delay10ms mov R0, pen_rx_buf movc (pen_rx_ptr_r), R0 movc (pen_rx_ptr_w), R0 mov R0, PEN_TIMEOUT0 movc (pen_timeout+0), R0 mov R0, PEN_TIMEOUT1 movc (pen_timeout+1), R0 mov R0, 0 movc (pen_bit_cnt_w), R0 movc (pen_octet_w), R0 movc (pen_octet_r), R0 mov R0, 7 movc (pen_bit_cnt_r), R0 pop R0 ret ; ------------------------------------------------- ; Params: none ; Return: ; R0 : received character pen_getchar: push R1 push R2 push R3 movc R3, (pen_octet_r) movc R1, (pen_rx_ptr_r) movc R2, (pen_bit_cnt_r) inc R2 cmp R2, 8 jne u_upd_r_ptr mov R2, 0 pen_wait_rx: movc R0, (pen_rx_ptr_w) cmp R0, R1 jeq pen_wait_rx movc R3, (R1) inc R1 cmp R1, pen_rx_buf+128 jne u_upd_r_ptr mov R1, pen_rx_buf u_upd_r_ptr: movc (pen_rx_ptr_r), R1 movc (pen_bit_cnt_r), R2 ex_pen_gc: mov R0, 0xFF shl R3 jnc pen_is_zero mov R0, 0x00 pen_is_zero: movc (pen_octet_r), R3 pop R3 pop R2 pop R1 ret ; ------------------------------------------------- include "../../../lib/jasm/utils.inc.jsm" include "../../../lib/jasm/lcd.inc.jsm" include "../../../lib/jasm/cg.inc.jsm" include "../../../lib/jasm/delays.inc.jsm" include "../../../lib/jasm/uart.inc.jsm"