Working EOL

This commit is contained in:
Daniele Verducci su MatissePenguin 2021-02-15 21:23:12 +01:00
parent 706dbe56e1
commit d3604ca3ab
4 changed files with 43 additions and 27 deletions

View File

@ -48,7 +48,7 @@ draw_char:
; Char drawing is complete. Increment cursor position ; Char drawing is complete. Increment cursor position
inc POS_COLUMN inc POS_COLUMN
; Check if end of line ; Check if end of line
cpi POS_COLUMN, 52 cpi POS_COLUMN, LINE_COLUMNS
breq draw_char_eol breq draw_char_eol
; Reset chunk position to first glyph line of next column ; Reset chunk position to first glyph line of next column
mov YL, r2 ; first restore Y mov YL, r2 ; first restore Y
@ -63,7 +63,7 @@ draw_char:
brne draw_char_end brne draw_char_end
cpi YL, low(FRAMEBUFFER_END + 1) cpi YL, low(FRAMEBUFFER_END + 1)
brne draw_char_end brne draw_char_end
; End of screen reached! Scroll framebuffer by 1 line (=52*FONT_HEIGHT bytes) ; End of screen reached! Scroll framebuffer by 1 line (=46*FONT_HEIGHT bytes)
; TODO ; TODO
draw_char_end: draw_char_end:
ret ret

View File

@ -9,7 +9,7 @@
; INTERNAL POINTER: ; INTERNAL POINTER:
; Internally, the last screen position is represented by 24 bits in two registers: ; Internally, the last screen position is represented by 24 bits in two registers:
; POS_COARSE: Register Y (16-bit, r31 and r30): Coarse position. Points to one of the chunks ; POS_COARSE: Register Y (16-bit, r31 and r30): Coarse position. Points to one of the chunks
; (character columns). 52 chunks per row, 304 rows. Used for character position, as ; (character columns). 46 chunks per row, 304 rows. Used for character position, as
; 1 chunk = 1 byte = 1 character. ; 1 chunk = 1 byte = 1 character.
; POS_FINE: Register r24: Fine position. Represents the bit inside the chunk selected by POS_COARSE. ; POS_FINE: Register r24: Fine position. Represents the bit inside the chunk selected by POS_COARSE.
; Ignored in character mode (the character is always aligned to column). Used in graphic mode. ; Ignored in character mode (the character is always aligned to column). Used in graphic mode.

View File

@ -26,8 +26,8 @@
; *** reserved registers *** ; *** reserved registers ***
; Cursor Position ; Cursor Position
; 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 ; POS_COLUMN (0-103) represents the column on a pair of rows: 0 to 46 is the first row, 47 to 92 the second one
; POS_ROWP (0-152) represent the pair of rows. POS_ROWP = 5 means the 10th and 11th rows ; POS_ROWP (0-128) represent the pair of rows. POS_ROWP = 5 means the 10th and 11th rows
; POS_FINE represents fine position (bit inside coarse-position-pointed chunk) in graphic mode. ; POS_FINE represents fine position (bit inside coarse-position-pointed chunk) in graphic mode.
.def POS_COLUMN = r21 .def POS_COLUMN = r21
.def POS_ROWP = r20 .def POS_ROWP = r20
@ -87,21 +87,7 @@ main:
cpi r26, 0b11000000 cpi r26, 0b11000000
brne load_mem_loop ; if not 0, repeat h_picture_loop brne load_mem_loop ; if not 0, repeat h_picture_loop
; test draw character routine
call cursor_pos_home
ldi r19, 14
dctest:
ldi r18, 0x21
draw_chars:
mov HIGH_ACCUM, r18
call draw_char
inc r18
cpi r18, 0x7E
brne draw_chars
dec r19
brne dctest
; *** timer setup (use 16-bit counter TC1) *** ; *** timer setup (use 16-bit counter TC1) ***
; The Power Reduction TC1 and TC3 bits in the Power Reduction Registers (PRR0.PRTIM1 and ; The Power Reduction TC1 and TC3 bits in the Power Reduction Registers (PRR0.PRTIM1 and
@ -121,6 +107,39 @@ main:
; Wait for data (it never exits) ; Wait for data (it never exits)
; jmp comm_init ; jmp comm_init
; test draw character routine
call cursor_pos_home
dctest:
ldi r18, 0x21
draw_chars:
mov HIGH_ACCUM, r18
call draw_char
inc r18
cpi r18, 0x7E
brne dc_continue
ldi r18, 0x21
dc_continue:
; wait
ser r19
dc_wait_loop_1:
ser r20
dc_wait_loop_2:
nop
nop
nop
nop
dec r20
brne dc_wait_loop_2
dec r19
brne dc_wait_loop_1
brne draw_chars
jmp dctest
forever: forever:
jmp forever jmp forever

View File

@ -4,7 +4,7 @@
; ******************************************* ; *******************************************
; Implemented following timings in http://blog.retroleum.co.uk/electronics-articles/pal-tv-timing-and-voltages/ ; Implemented following timings in http://blog.retroleum.co.uk/electronics-articles/pal-tv-timing-and-voltages/
; Every line, for 52 times, it loads a byte from memory into PORTA register and then shifts the byte to the left to show another bit (do it 7 times) ; Every line, for 46 times, it loads a byte from memory into PORTA register and then shifts the byte to the left to show another bit (do it 7 times)
; This also displays byte's MSB pixel "for free", as the video pin is PD7 (last bit of PORTA). ; This also displays byte's MSB pixel "for free", as the video pin is PD7 (last bit of PORTA).
; This module generates a Composite PAL monochrome signal with a resolution ; This module generates a Composite PAL monochrome signal with a resolution
@ -153,16 +153,13 @@ draw_picture:
push XH push XH
push XL push XL
; set X register to framebuffer start 0x0100 ; set X register to framebuffer start
; (set it a byte before, because it will be incremented at first) ldi r27, high(FRAMEBUFFER)
clr r27 ldi r26, low(FRAMEBUFFER)
ldi r26, 0xFF
; start 304 picture lines ; start 304 picture lines
ldi LINE_COUNTER, 256 ; line counter ldi LINE_COUNTER, 256 ; line counter
h_picture_loop: h_picture_loop:
; ***************** DRAW FIRST LINE *********************
; **** start line sync: 4uS, 96 cycles @ 24Mhz ; **** start line sync: 4uS, 96 cycles @ 24Mhz
; video pin goes low before sync ; video pin goes low before sync
clr VG_HIGH_ACCUM ; 1 cycle clr VG_HIGH_ACCUM ; 1 cycle