diff --git a/pat80-io-devices/composite-pal-adapter/software/avr-assembly/character_generator.asm b/pat80-io-devices/composite-pal-adapter/software/avr-assembly/character_generator.asm index 5280842..8982337 100644 --- a/pat80-io-devices/composite-pal-adapter/software/avr-assembly/character_generator.asm +++ b/pat80-io-devices/composite-pal-adapter/software/avr-assembly/character_generator.asm @@ -9,8 +9,8 @@ .equ LINE_COLUMNS = 52 ; number of columns (characters or chunks) per line ; Draws character in register A to the screen at current coords (Y) -; @param A (r0) ascii code to display -; @modifies r0 (A), r1, r2, r3, r16 (HIGH_ACCUM), Y, Z +; @param r16 (HIGH_ACCUM) ascii code to display +; @modifies r0 (A), r1, r2, r3, r16 (HIGH_ACCUM), r17, Y, Z draw_char: ; Glyph's first byte is at: ; glyph_pointer = font_starting_mem_pos + (ascii_code * number_of_bytes_per_font) @@ -22,13 +22,13 @@ draw_char: mov r3, YH ; Load first glyph position on Z - ldi ZH, high(FONT) - ldi ZL, low(FONT) - ; Obtain offset multiplying ascii_code * number_of_bytes_per_fontr1 - ldi HIGH_ACCUM, FONT_HEIGHT - mul A, HIGH_ACCUM ; result overwrites r0 and r1! + ldi ZH, high(FONT<<1) + ldi ZL, low(FONT<<1) + ; Obtain offset multiplying ascii_code * number_of_bytes_per_font + ldi r17, FONT_HEIGHT + mul HIGH_ACCUM, r17 ; result overwrites r0 and r1! ; 16-bit addition between gliph's first byte position and offset (and store result in Z) - add ZL, A + add ZL, r0 adc ZH, r1 ; Z contain our glyph's first byte position: draw it ; The drawing consist of FONT_HEIGHT cycles. Every glyph byte is placed on its own line @@ -49,3 +49,11 @@ draw_char: mov YH, r3 adiw YH:YL,1 ; just increment pre-char-drawing-saved chunk cursor position by 1 ret + +; Sets the cursor to 0,0 and clears fine position +cursor_pos_home: + ; Set Y to framebuffer start + ldi YH, high(FRAMEBUFFER) + ldi YL, low(FRAMEBUFFER) + clr POS_FINE + ret \ No newline at end of file diff --git a/pat80-io-devices/composite-pal-adapter/software/avr-assembly/communication.asm b/pat80-io-devices/composite-pal-adapter/software/avr-assembly/communication.asm index d16673f..b045eea 100644 --- a/pat80-io-devices/composite-pal-adapter/software/avr-assembly/communication.asm +++ b/pat80-io-devices/composite-pal-adapter/software/avr-assembly/communication.asm @@ -31,10 +31,3 @@ comm_init: brne comm_wait_byte ; if not 0, repeat h_picture_loop jmp comm_init ; filled all memory: reset framebuffer position -; Sets the cursor to 0,0 and clears fine position -cursor_pos_home: - ; Set Y to framebuffer start - ldi YH, high(FRAMEBUFFER<<1) - ldi YL, low(FRAMEBUFFER<<1) - clr POS_FINE - ret diff --git a/pat80-io-devices/composite-pal-adapter/software/avr-assembly/main.asm b/pat80-io-devices/composite-pal-adapter/software/avr-assembly/main.asm index b15fb5f..96aa01d 100644 --- a/pat80-io-devices/composite-pal-adapter/software/avr-assembly/main.asm +++ b/pat80-io-devices/composite-pal-adapter/software/avr-assembly/main.asm @@ -68,29 +68,61 @@ main: ldi HIGH_ACCUM, 0x00 out DDRB, HIGH_ACCUM ; set port as input (used as data bus) + ; clear ram + ;*** Load data into ram *** + ; Set X to 0x0100 + ldi r27, high(FRAMEBUFFER) + ldi r26, low(FRAMEBUFFER) + load_mem_loop: + clr r17 + st X+, r17 + ; if reached the last framebuffer byte, exit cycle + cpi r27, 0b00111110 + brne load_mem_loop ; if not 0, repeat h_picture_loop + cpi r26, 0b11000000 + brne load_mem_loop ; if not 0, repeat h_picture_loop + ; test draw character routine - ser r17 - test_draw_loop: - ldi r16, 'P' - mov A, HIGH_ACCUM - call draw_char - ldi HIGH_ACCUM, 'A' - mov A, HIGH_ACCUM - call draw_char - ldi HIGH_ACCUM, 'T' - mov A, HIGH_ACCUM - call draw_char - ldi HIGH_ACCUM, '8' - mov A, HIGH_ACCUM - call draw_char - ldi HIGH_ACCUM, '0' - mov A, HIGH_ACCUM - call draw_char - ldi HIGH_ACCUM, ' ' - mov A, HIGH_ACCUM - call draw_char - dec r17 - breq test_draw_loop + ;call cursor_pos_home + ldi HIGH_ACCUM, 'P' + call draw_char + ldi HIGH_ACCUM, 'A' + call draw_char + ldi HIGH_ACCUM, 'T' + call draw_char + ldi HIGH_ACCUM, '8' + call draw_char + ldi HIGH_ACCUM, '0' + call draw_char + ldi HIGH_ACCUM, ' ' + call draw_char + ldi HIGH_ACCUM, 'H' + call draw_char + ldi HIGH_ACCUM, 'o' + call draw_char + ldi HIGH_ACCUM, 'm' + call draw_char + ldi HIGH_ACCUM, 'e' + call draw_char + ldi HIGH_ACCUM, ' ' + call draw_char + ldi HIGH_ACCUM, 'c' + call draw_char + ldi HIGH_ACCUM, 'o' + call draw_char + ldi HIGH_ACCUM, 'm' + call draw_char + ldi HIGH_ACCUM, 'p' + call draw_char + ldi HIGH_ACCUM, 'u' + call draw_char + ldi HIGH_ACCUM, 't' + call draw_char + ldi HIGH_ACCUM, 'e' + call draw_char + ldi HIGH_ACCUM, 'r' + call draw_char + ; *** timer setup (use 16-bit counter TC1) *** @@ -109,7 +141,7 @@ main: ; Timer setup completed. ; Wait for data (it never exits) - jmp comm_init + ;jmp comm_init forever: jmp forever