First working text mode without end of screen scroll
This commit is contained in:
parent
9d6e6efd13
commit
467197fd23
@ -27,7 +27,7 @@ draw_char:
|
|||||||
; Obtain offset multiplying ascii_code * number_of_bytes_per_font
|
; Obtain offset multiplying ascii_code * number_of_bytes_per_font
|
||||||
ldi r17, FONT_HEIGHT
|
ldi r17, FONT_HEIGHT
|
||||||
mul HIGH_ACCUM, r17 ; result overwrites r0 and r1!
|
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)
|
; 16-bit addition between gliph's first byte position and offset (and store result in Z) to obtain our glyph position
|
||||||
add ZL, r0
|
add ZL, r0
|
||||||
adc ZH, r1
|
adc ZH, r1
|
||||||
; Z contain our glyph's first byte position: draw it
|
; Z contain our glyph's first byte position: draw it
|
||||||
@ -44,19 +44,66 @@ draw_char:
|
|||||||
; Decrement loop counter and exit if reached 0
|
; Decrement loop counter and exit if reached 0
|
||||||
dec HIGH_ACCUM
|
dec HIGH_ACCUM
|
||||||
brne draw_char_loop
|
brne draw_char_loop
|
||||||
; Char drawing is complete. Set chunk cursor position to next char first line
|
|
||||||
|
; Char drawing is complete. Increment cursor position
|
||||||
|
inc POS_COLUMN
|
||||||
|
; Check if end of line
|
||||||
|
cpi POS_COLUMN, 52
|
||||||
|
breq draw_char_eol
|
||||||
|
; Reset chunk position to first glyph line of next column
|
||||||
mov YL, r2 ; first restore Y
|
mov YL, r2 ; first restore Y
|
||||||
mov YH, r3
|
mov YH, r3
|
||||||
adiw YH:YL,1 ; just increment pre-char-drawing-saved chunk cursor position by 1
|
adiw YH:YL,1 ; just increment pre-char-drawing-saved chunk cursor position by 1
|
||||||
ret
|
ret
|
||||||
|
draw_char_eol:
|
||||||
|
clr POS_COLUMN ; reset column to 0
|
||||||
|
adiw YH:YL,1 ; increment chunk cursor position by 1 (begin of next line on screen)
|
||||||
|
; Check if end of screen
|
||||||
|
cpi YH, high(FRAMEBUFFER_END + 1)
|
||||||
|
brne draw_char_end
|
||||||
|
cpi YL, low(FRAMEBUFFER_END + 1)
|
||||||
|
brne draw_char_end
|
||||||
|
; End of screen reached! Scroll framebuffer by 1 line (=52*FONT_HEIGHT bytes)
|
||||||
|
; TODO
|
||||||
|
draw_char_end:
|
||||||
|
ret
|
||||||
|
|
||||||
; Sets the cursor to 0,0 and clears fine position
|
; Sets the cursor to 0,0 and clears fine position
|
||||||
cursor_pos_home:
|
cursor_pos_home:
|
||||||
; Set Y to framebuffer start
|
; Set all positions to 0
|
||||||
;ldi YH, high(FRAMEBUFFER)
|
clr POS_COLUMN
|
||||||
;ldi YL, low(FRAMEBUFFER)
|
clr POS_ROWP
|
||||||
ldi YH, high(0x0068)
|
|
||||||
ldi YL, low(0x0068)
|
|
||||||
clr POS_FINE
|
clr POS_FINE
|
||||||
|
; Load framebuffer start position to Y
|
||||||
|
ldi YH, high(FRAMEBUFFER)
|
||||||
|
ldi YL, low(FRAMEBUFFER)
|
||||||
|
; ldi YH, high(0x1000)
|
||||||
|
; ldi YL, low(0x1000)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; Updates framebuffer pointer (Y) to point to current text cursor position (POS_COLUMN, POS_ROWP)
|
||||||
|
; Usage:
|
||||||
|
; ldi POS_COLUMN, 55
|
||||||
|
; ldi POS_ROWP, 13
|
||||||
|
; call set_framebuffer_pointer_to_text_cursor ; (sets cursor to 4th character of second row in 13th row-pair = column 4, row 27 on screen)
|
||||||
|
; @modifies Y, R0, R1
|
||||||
|
set_framebuffer_pointer_to_text_cursor:
|
||||||
|
; Load framebuffer start position to Y
|
||||||
|
ldi YH, high(FRAMEBUFFER)
|
||||||
|
ldi YL, low(FRAMEBUFFER)
|
||||||
|
; Obtain offset between 0,0 and current cursor position
|
||||||
|
mul POS_COLUMN, POS_ROWP ; result is in r1,r0
|
||||||
|
; Sum offset to Y
|
||||||
|
add YL, r0
|
||||||
|
adc YH, r1
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; Draws a newline
|
||||||
|
; Moves cursor to start of following screen line
|
||||||
|
; Takes care of particular cases, i.e. end of screen (shifts all screen up by one line)
|
||||||
|
draw_carriage_return:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,9 +29,12 @@
|
|||||||
|
|
||||||
; *** reserved registers ***
|
; *** reserved registers ***
|
||||||
; Cursor Position
|
; Cursor Position
|
||||||
.def POS_COLUMN = r21 ; absolute coarse position on line (0 to 51)
|
; POS_COLUMN (0-103) represents the column on a pair of rows: 0 to 51 is the first row, 52 to 103 the second one
|
||||||
.def POS_ROW = r20 ; absolute coarse position on line (0 to 51)
|
; POS_ROWP (0-152) represent the pair of rows. POS_ROWP = 5 means the 10th and 11th rows
|
||||||
.def POS_FINE = r24 ; fine position (bit inside coarse-position-pointed byte)
|
; POS_FINE represents fine position (bit inside coarse-position-pointed chunk) in graphic mode.
|
||||||
|
.def POS_COLUMN = r21
|
||||||
|
.def POS_ROWP = r20
|
||||||
|
.def POS_FINE = r24
|
||||||
; Internal registers
|
; Internal registers
|
||||||
.def A = r0 ; accumulator
|
.def A = r0 ; accumulator
|
||||||
.def STATUS = r25 ; signal status (see STATUS TABLE)
|
.def STATUS = r25 ; signal status (see STATUS TABLE)
|
||||||
@ -52,6 +55,7 @@
|
|||||||
|
|
||||||
; memory
|
; memory
|
||||||
.equ FRAMEBUFFER = 0x0100
|
.equ FRAMEBUFFER = 0x0100
|
||||||
|
.equ FRAMEBUFFER_END = 0x3EC0
|
||||||
|
|
||||||
; start vector
|
; start vector
|
||||||
.org 0x0000
|
.org 0x0000
|
||||||
@ -88,14 +92,54 @@ main:
|
|||||||
|
|
||||||
; test draw character routine
|
; test draw character routine
|
||||||
call cursor_pos_home
|
call cursor_pos_home
|
||||||
ldi r18, 0x30
|
ldi r18, 0x21
|
||||||
draw_chars:
|
draw_chars:
|
||||||
mov HIGH_ACCUM, r18
|
mov HIGH_ACCUM, r18
|
||||||
call draw_char
|
call draw_char
|
||||||
inc r18
|
inc r18
|
||||||
cpi r18, 0x64
|
cpi r18, 0x7E
|
||||||
brne draw_chars
|
brne draw_chars
|
||||||
|
|
||||||
|
ldi r18, 0x21
|
||||||
|
draw_chars2:
|
||||||
|
mov HIGH_ACCUM, r18
|
||||||
|
call draw_char
|
||||||
|
inc r18
|
||||||
|
cpi r18, 0x7E
|
||||||
|
brne draw_chars2
|
||||||
|
|
||||||
|
ldi r18, 0x21
|
||||||
|
draw_chars3:
|
||||||
|
mov HIGH_ACCUM, r18
|
||||||
|
call draw_char
|
||||||
|
inc r18
|
||||||
|
cpi r18, 0x7E
|
||||||
|
brne draw_chars3
|
||||||
|
|
||||||
|
ldi r18, 0x21
|
||||||
|
draw_chars4:
|
||||||
|
mov HIGH_ACCUM, r18
|
||||||
|
call draw_char
|
||||||
|
inc r18
|
||||||
|
cpi r18, 0x7E
|
||||||
|
brne draw_chars4
|
||||||
|
|
||||||
|
ldi r18, 0x21
|
||||||
|
draw_chars5:
|
||||||
|
mov HIGH_ACCUM, r18
|
||||||
|
call draw_char
|
||||||
|
inc r18
|
||||||
|
cpi r18, 0x7E
|
||||||
|
brne draw_chars5
|
||||||
|
|
||||||
|
ldi r18, 0x21
|
||||||
|
draw_chars6:
|
||||||
|
mov HIGH_ACCUM, r18
|
||||||
|
call draw_char
|
||||||
|
inc r18
|
||||||
|
cpi r18, 0x7E
|
||||||
|
brne draw_chars6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; *** timer setup (use 16-bit counter TC1) ***
|
; *** timer setup (use 16-bit counter TC1) ***
|
||||||
|
Loading…
Reference in New Issue
Block a user