add set dd addr from charcount

This commit is contained in:
Matthias@Dell 2024-01-15 09:19:05 +01:00
parent c61de15048
commit 5ee9610616
2 changed files with 113 additions and 37 deletions

View File

@ -20,7 +20,32 @@ INCLUDE_LCD = 1
.scope lcd .scope lcd
LCD_IO = IO1 LCD_IO = IO1
Import lcd,init,clear,print,print_char,set_position,set_custom_char Import lcd,init,clear,print,print_char,set_position,set_custom_char
Import lcd,_cmd,_wait_nbusy,_write_ram,_read_ram Import lcd,_cmd,_wait_nbusy,_write_ram,_read_ram,_charcount
; PIN MASKS
E = %10000000
RW = %01000000
RS = %00100000
RA_MASK = %11100000
; LCD Instructions (see datasheet for more)
CMD_CLEAR = %00000001 ; clear display
CMD_ENTRY_MODE = %00000110 ; auto-shift cursor
CMD_DISPLAY_ON = %00001111 ; everything on, with blinking cursor
CMD_SHIFT_CUR_LEFT = %00101000 ; shift the display to the left
CMD_SHIFT_DIS_LEFT = %00111000 ; shift the display to the left
CMD_SHIFT_DIS_RIGHT = %00110000 ; shift the display to the right
CMD_SHIFT_CUR_RIGHT = %00100000 ; shift the display to the right
CMD_FUNCTION_SET = %00111000 ; 8-bit, 4 lines, 5x7 font
CMD_SET_CG_ADDRESS = %01000000 ; or with the address
CMD_SET_ADDRESS = %10000000 ; or with the address
; LCD Constants
LINE1 = $00
LINE2 = $40
LINE3 = $10
LINE4 = $50
.endscope
;;******************************************************************************** ;;********************************************************************************
;; @macro Clear the screen and print a null-terminated string ;; @macro Clear the screen and print a null-terminated string
@ -73,29 +98,38 @@ Import lcd,_cmd,_wait_nbusy,_write_ram,_read_ram
jsr lcd::print jsr lcd::print
.endmacro .endmacro
; PIN MASKS
E = %10000000
RW = %01000000
RS = %00100000
RA_MASK = %11100000 ;;********************************************************************************
;; @macro Print a null-terminated string
;; @param message: Address of the message or string literal
;;********************************************************************************
.macro lcd_SetCursor pos
.if .match (pos, a)
.elseif .match (pos, x)
txa
.elseif .match (pos, y)
tya
.else
lda #pos
.endif
sta lcd::_charcount
jsr lcd::_set_dd_ram_addr_from__charcount
.endmacro
;;********************************************************************************
;; @macro Print a null-terminated string
;; @param message: Address of the message or string literal
;;********************************************************************************
.macro lcd_AdvanceCursor n
.ifblank n
inc lcd::_charcount
.else
lda lcd::_charcount
add n
sta lcd::_charcount
.endif
jsr lcd::_set_dd_ram_addr_from__charcount
.endmacro
; LCD Instructions (see datasheet for more)
CMD_CLEAR = %00000001 ; clear display
CMD_ENTRY_MODE = %00000110 ; auto-shift cursor
CMD_DISPLAY_ON = %00001111 ; everything on, with blinking cursor
CMD_SHIFT_CUR_LEFT = %00101000 ; shift the display to the left
CMD_SHIFT_DIS_LEFT = %00111000 ; shift the display to the left
CMD_SHIFT_DIS_RIGHT = %00110000 ; shift the display to the right
CMD_SHIFT_CUR_RIGHT = %00100000 ; shift the display to the right
CMD_FUNCTION_SET = %00111000 ; 8-bit, 4 lines, 5x7 font
CMD_SET_CG_ADDRESS = %01000000 ; or with the address
CMD_SET_ADDRESS = %10000000 ; or with the address
; LCD Constants
LINE1 = $00
LINE2 = $40
LINE3 = $10
LINE4 = $50
.endscope
.endif ; guard .endif ; guard

View File

@ -5,10 +5,10 @@
.endif .endif
Export lcd,init,clear,print,print_char,set_position,set_custom_char Export lcd,init,clear,print,print_char,set_position,set_custom_char
Export lcd,_cmd,_wait_nbusy,_write_ram,_read_ram Export lcd,_cmd,_wait_nbusy,_write_ram,_read_ram,_charcount
; RAM VARIABLES ; RAM VARIABLES
.bss .bss
charcount: .res 1 _charcount: .res 1
; TODO when clockspeeds are more than 1MHz, _cmd, _write_ram and _read_ram might need to be adjusted ; TODO when clockspeeds are more than 1MHz, _cmd, _write_ram and _read_ram might need to be adjusted
.code .code
@ -36,7 +36,7 @@ charcount: .res 1
lda #lcd::CMD_ENTRY_MODE lda #lcd::CMD_ENTRY_MODE
jsr _cmd jsr _cmd
stz charcount stz _charcount
rts rts
.endproc .endproc
@ -61,17 +61,17 @@ charcount: .res 1
cmp #$10 cmp #$10
bge @line3 bge @line3
bra @set bra @set
; @line1: ; starts at $00, charcount at $00 ; @line1: ; starts at $00, _charcount at $00
@line2: ; starts at $40, charcount at $10 @line2: ; starts at $40, _charcount at $10
sbc #$30 ; carry is already set sbc #$30 ; carry is already set
bra @set bra @set
@line3: ; starts at $10, charcount at $20 @line3: ; starts at $10, _charcount at $20
add #$10 add #$10
bra @set bra @set
@line4: ; starts at $50, charcount at $30 @line4: ; starts at $50, _charcount at $30
sbc #$20 sbc #$20
@set: @set:
sta charcount sta _charcount
pla pla
pha pha
ora #lcd::CMD_SET_ADDRESS ora #lcd::CMD_SET_ADDRESS
@ -82,7 +82,7 @@ charcount: .res 1
@invalid: @invalid:
pla ; otherwise stack corruption pla ; otherwise stack corruption
lda #$13 lda #$13
sta charcount sta _charcount
lda #(lcd::CMD_SET_ADDRESS | (lcd::LINE2 + 3)) lda #(lcd::CMD_SET_ADDRESS | (lcd::LINE2 + 3))
jsr _cmd jsr _cmd
lda #(lcd::LINE2 + 3) lda #(lcd::LINE2 + 3)
@ -99,7 +99,7 @@ charcount: .res 1
;; @modifies A ;; @modifies A
;;******************************************************************************** ;;********************************************************************************
.proc clear .proc clear
stz charcount stz _charcount
lda #lcd::CMD_CLEAR lda #lcd::CMD_CLEAR
jsr _cmd jsr _cmd
rts rts
@ -131,7 +131,7 @@ charcount: .res 1
.proc print_char .proc print_char
pha pha
jsr _write_ram jsr _write_ram
inc charcount inc _charcount
jsr _break_line jsr _break_line
pla ; put char back in a pla ; put char back in a
.endproc .endproc
@ -286,11 +286,53 @@ charcount: .res 1
;;******************************************************************************** ;;********************************************************************************
;; @function Set the LCD DD-RAM Address so that text linebreaks after 16 chars ;; @function Set the LCD DD-RAM Address from the character count
;; @details
;; Sets the DD-RAM Address so that a line break occurs after 16 characters
;; If _charcount is more than $40, the position will be set to line 1.
;;********************************************************************************
.proc _set_dd_ram_addr_from__charcount
cmp #$40 ; set to line1 when full
bcs @wrap_to_line1
cmp #$10
bcc @line1
cmp #$20
bcc @line3
; bra @line4
@line4:
clc
adc #$20 ; _charcount $30-$3f -> $50 - $5f
bra @set_address
@wrap_to_line1:
sbc #$40
and #%00001111
; now every _charcount is mapped between 0 and $3f
bra @set_address
@line2:
adc #$30 ; _charcount $10-$1f -> $40 - $4f
bra @set_address
@line3:
sec
sbc #$10 ; _charcount $20-$2f -> $10 - $1f
bra @set_address
@line1: ; _charcount $00-$1f -> $00 - $0f - nothing to do
@set_address:
ora #lcd::CMD_SET_ADDRESS
jsr _cmd
rts
.endproc
;;********************************************************************************
;; @function Set the LCD DD-RAM Address to te next line if the end of the line was reached
;; @details
;; If the cursor is past the end of a line, the DD-RAM Address is set to the next line.
;; If _charcount is more than $40, the position will be set to line 1.
;; This function is intended to be used with to set the correct address when
;; auto-shift is enabled
;;******************************************************************************** ;;********************************************************************************
.proc _break_line .proc _break_line
; check if checks are necessary ; check if checks are necessary
lda charcount lda _charcount
beq @line1 beq @line1
bit #%10001111 ; ($10 | $20 | $30 | $40) = %01110000 bit #%10001111 ; ($10 | $20 | $30 | $40) = %01110000
beq @check beq @check
@ -307,7 +349,7 @@ charcount: .res 1
bge @line1 bge @line1
rts rts
@line1: @line1:
stz charcount stz _charcount
lda #(lcd::CMD_SET_ADDRESS | lcd::LINE1) lda #(lcd::CMD_SET_ADDRESS | lcd::LINE1)
jsr _cmd jsr _cmd
rts rts