From 46f1085e2d4ae2ee16271567d06c6206b1cafd91 Mon Sep 17 00:00:00 2001 From: "ol.sc" Date: Tue, 23 Oct 2012 19:42:57 +0000 Subject: [PATCH] Fixed several aspects of the GEOS CONIO implementation: - cputc was drawing at the wrong position, therefore one line had to be removed as a workaround. - chline, cvline were drawing one pixel to large lines. - cclear was drawing an in both directions one pixel to big rect. - the cursor was drawn at wrong times at wrong places in a wrong size. git-svn-id: svn://svn.cc65.org/cc65/trunk@5874 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/geos-common/conio/Makefile | 1 - libsrc/geos-common/conio/_scrsize.s | 12 +++++------- libsrc/geos-common/conio/cclear.s | 9 ++++++++- libsrc/geos-common/conio/cgetc.s | 20 ++++++++++++++------ libsrc/geos-common/conio/chline.s | 13 +++++++++++-- libsrc/geos-common/conio/clrscr.s | 3 --- libsrc/geos-common/conio/cputc.s | 27 +++++++++------------------ libsrc/geos-common/conio/cursor.s | 28 ---------------------------- libsrc/geos-common/conio/cvline.s | 10 ++++++---- libsrc/geos-common/conio/gotoxy.s | 12 +++++------- libsrc/geos-common/system/extzp.s | 4 +--- 11 files changed, 59 insertions(+), 80 deletions(-) delete mode 100644 libsrc/geos-common/conio/cursor.s diff --git a/libsrc/geos-common/conio/Makefile b/libsrc/geos-common/conio/Makefile index 228364759..7f53de176 100644 --- a/libsrc/geos-common/conio/Makefile +++ b/libsrc/geos-common/conio/Makefile @@ -11,7 +11,6 @@ S_OBJS += _scrsize.o \ chline.o \ clrscr.o \ cputc.o \ - cursor.o \ cvline.o \ dummies.o \ gotoxy.o \ diff --git a/libsrc/geos-common/conio/_scrsize.s b/libsrc/geos-common/conio/_scrsize.s index da6b2d33d..31d64e1f4 100644 --- a/libsrc/geos-common/conio/_scrsize.s +++ b/libsrc/geos-common/conio/_scrsize.s @@ -24,18 +24,16 @@ initscrsize: .byte $2c L1: lda #40 ; 40 columns (more or less) sta xsize - lda #24 ; something like that for Y size + lda #25 ; something like that for Y size .else lda #70 ; 70 columns (more or less) sta xsize - lda #23 ; something like that for Y size + lda #24 ; something like that for Y size .endif sta ysize - ldx #1 - stx cursor_r - dex - stx cursor_c - txa + lda #0 + sta cursor_c + sta cursor_r jmp _cursor ; home and update cursor .code diff --git a/libsrc/geos-common/conio/cclear.s b/libsrc/geos-common/conio/cclear.s index 7b5710dd6..ac93803d9 100644 --- a/libsrc/geos-common/conio/cclear.s +++ b/libsrc/geos-common/conio/cclear.s @@ -30,7 +30,7 @@ _cclear: lda cursor_y ; level sta r2L clc - adc #8 + adc #7 sta r2H txa ; right end clc @@ -40,6 +40,13 @@ _cclear: ldx #r4 ldy #3 jsr DShiftLeft + clc ; one pixel less + lda r4L + sbc #0 + sta r4L + lda r4L+1 + sbc #0 + sta r4L+1 lda curPattern ; store current pattern pha lda #0 ; set pattern to clear diff --git a/libsrc/geos-common/conio/cgetc.s b/libsrc/geos-common/conio/cgetc.s index b24ca54e7..94fd55ef0 100644 --- a/libsrc/geos-common/conio/cgetc.s +++ b/libsrc/geos-common/conio/cgetc.s @@ -7,25 +7,25 @@ ; unsigned char cgetc (void); .export _cgetc - .import update_cursor - .importzp cursor_x, cursor_y, cursor_flag + .import cursor + .importzp cursor_x, cursor_y .include "jumptab.inc" .include "geossym.inc" _cgetc: ; show cursor if needed - lda cursor_flag + lda cursor beq L0 - jsr update_cursor +; prepare cursor + lda #7 + jsr InitTextPrompt lda cursor_x ldx cursor_x+1 sta stringX stx stringX+1 lda cursor_y - sec - sbc curHeight sta stringY jsr PromptOn @@ -33,7 +33,15 @@ L0: jsr GetNextChar tax beq L0 pha + +; from 'The Hitchhiker's Guide To GEOS' + php + sei jsr PromptOff + lda #0 + sta alphaFlag + plp + pla ldx #0 rts diff --git a/libsrc/geos-common/conio/chline.s b/libsrc/geos-common/conio/chline.s index d4b4c20a9..c6310a11e 100644 --- a/libsrc/geos-common/conio/chline.s +++ b/libsrc/geos-common/conio/chline.s @@ -28,17 +28,26 @@ _chline: lda cursor_x+1 sta r3L+1 lda cursor_y ; level - sec - sbc #4 ; in the middle of a cell + clc + adc #4 ; in the middle of a cell sta r11L txa ; right end clc adc cursor_c sta cursor_c sta r4L + lda #0 + sta r4L+1 ldx #r4 ldy #3 jsr DShiftLeft + clc ; one pixel less + lda r4L + sbc #0 + sta r4L + lda r4L+1 + sbc #0 + sta r4L+1 lda #%11111111 ; pattern jsr HorizontalLine jsr fixcursor diff --git a/libsrc/geos-common/conio/clrscr.s b/libsrc/geos-common/conio/clrscr.s index e8f30b700..72fcb40ff 100644 --- a/libsrc/geos-common/conio/clrscr.s +++ b/libsrc/geos-common/conio/clrscr.s @@ -14,8 +14,6 @@ .include "const.inc" _clrscr: - lda #ST_WR_FORE | ST_WR_BACK - sta dispBufferOn lda curPattern ; save current pattern pha lda #0 ; set pattern to clear @@ -25,7 +23,6 @@ _clrscr: stx r3H stx r2L stx cursor_c - inx stx cursor_r jsr fixcursor ; home cursor .ifdef __GEOS_CBM__ diff --git a/libsrc/geos-common/conio/cputc.s b/libsrc/geos-common/conio/cputc.s index f0bbb766d..dbc4f45c1 100644 --- a/libsrc/geos-common/conio/cputc.s +++ b/libsrc/geos-common/conio/cputc.s @@ -22,7 +22,7 @@ ; HOME = KEY_ENTER, KEY_HOME = REV_ON, ; UPLINE = ?, KEY_UPARROW = GOTOY, ... - .export _cputcxy, _cputc, update_cursor + .export _cputcxy, _cputc .import _gotoxy, fixcursor .import popa .import xsize,ysize @@ -63,38 +63,29 @@ L2: php lda cursor_x+1 sta r11H lda cursor_y + clc + adc #6 ; 6 pixels down to the baseline sta r1H txa jsr PutChar plp - bcs update_cursor + bcs fix_cursor inc cursor_c lda cursor_c cmp xsize ; hit right margin? - bne update_cursor + bne fix_cursor lda #0 ; yes - do cr+lf sta cursor_c do_lf: inc cursor_r lda cursor_r cmp ysize ; hit bottom margin? - bne update_cursor + bne fix_cursor dec cursor_r ; yes - stay in the last line -update_cursor: - jsr fixcursor - lda cursor_x - sta r4L - lda cursor_x+1 - sta r4H - lda cursor_y - sec - sbc curHeight - sta r5L - lda #1 ; update cursor prompt position - sta r3L - jmp PosSprite +fix_cursor: + jmp fixcursor do_cr: lda #0 sta cursor_c - beq update_cursor + beq fix_cursor diff --git a/libsrc/geos-common/conio/cursor.s b/libsrc/geos-common/conio/cursor.s deleted file mode 100644 index 7ba3c6fff..000000000 --- a/libsrc/geos-common/conio/cursor.s +++ /dev/null @@ -1,28 +0,0 @@ -; -; Maciej 'YTM/Elysium' Witkowiak -; -; 27.10.2001, 23.12.2002 - -; unsigned char cursor (unsigned char onoff); - - .export _cursor - .import update_cursor - .importzp cursor_flag - - .include "jumptab.inc" - .include "geossym.inc" - -_cursor: - - tay ; onoff into Y - ldx #0 ; High byte of result - lda cursor_flag ; Get old value - pha - sty cursor_flag ; Set new value - tya - beq L1 - lda curHeight ; prepare cursor - jsr InitTextPrompt - jsr update_cursor ; place it on screen -L1: pla - rts diff --git a/libsrc/geos-common/conio/cvline.s b/libsrc/geos-common/conio/cvline.s index 70475cef5..e60af74a3 100644 --- a/libsrc/geos-common/conio/cvline.s +++ b/libsrc/geos-common/conio/cvline.s @@ -25,7 +25,7 @@ _cvline: tax lda cursor_x ; x position clc - adc #4 ; in the middle of cell + adc #3 ; in the middle of cell sta r4L lda cursor_x+1 adc #0 @@ -36,10 +36,12 @@ _cvline: clc adc cursor_r sta cursor_r + asl a + asl a + asl a + clc ; one pixel less + sbc #0 sta r3H - asl r3H - asl r3H - asl r3H lda #%11111111 ; pattern jsr VerticalLine jsr fixcursor diff --git a/libsrc/geos-common/conio/gotoxy.s b/libsrc/geos-common/conio/gotoxy.s index 585757473..1464eea27 100644 --- a/libsrc/geos-common/conio/gotoxy.s +++ b/libsrc/geos-common/conio/gotoxy.s @@ -20,12 +20,10 @@ _gotox: _gotoy: sta cursor_r - inc cursor_r jmp fixcursor _gotoxy: sta cursor_r - inc cursor_r jsr popa sta cursor_c @@ -35,12 +33,12 @@ fixcursor: sta cursor_x lda #0 sta cursor_x+1 - lda cursor_r - sta cursor_y ldx #cursor_x ldy #3 jsr DShiftLeft - asl cursor_y - asl cursor_y - asl cursor_y + lda cursor_r + asl a + asl a + asl a + sta cursor_y rts diff --git a/libsrc/geos-common/system/extzp.s b/libsrc/geos-common/system/extzp.s index 77f3e88e6..5ef1c2060 100644 --- a/libsrc/geos-common/system/extzp.s +++ b/libsrc/geos-common/system/extzp.s @@ -5,7 +5,7 @@ ; zeropage locations for exclusive use by the library ; - .exportzp cursor_x, cursor_y, cursor_flag + .exportzp cursor_x, cursor_y .exportzp cursor_c, cursor_r .segment "EXTZP" : zeropage @@ -14,8 +14,6 @@ cursor_x: .res 2 ; Cursor column (0-319/639) cursor_y: .res 1 ; Cursor row (0-199) -cursor_flag: - .res 1 ; Cursor on/off (0-off) cursor_c: .res 1 ; Cursor column (0-39/79) -- 2.39.5