Skip to content

Commit edf832f

Browse files
authored
Merge pull request #236 from ivop/overscan
OSI Overscan area
2 parents 779e67a + 8d9be24 commit edf832f

File tree

2 files changed

+101
-37
lines changed

2 files changed

+101
-37
lines changed

src/arch/osi/osi.S

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,42 @@ drive_number: .fill 1
5858
sector_num: .fill 3
5959
dma: .fill 2
6060

61+
; Invisible overscan areas:
62+
;
63+
; 32x32 --> 24x26 worst case, hidden: 6L, 2R, 3T, 3B
64+
; 64x32 --> 48x26 worst case, hidden: 13L, 3R, 3T, 3B
65+
; 64x16 --> 48x12 worst case, hidden: 13L, 3R, 2T, 2B
66+
6167
#if OSI400
62-
SCREEN_WIDTH = 32
63-
SCREEN_HEIGHT = 32
64-
SCREEN_PAGES = 4
68+
XSCREEN_WIDTH = 32
69+
XSCREEN_HEIGHT = 32
70+
XSCREEN_PAGES = 4
71+
SCREEN_WIDTH = 24
72+
SCREEN_HEIGHT = 26
73+
SCREEN_LMARGIN = 6
74+
SCREEN_TMARGIN = 3
6575
#elif OSI500
66-
SCREEN_WIDTH = 64
67-
SCREEN_HEIGHT = 32
68-
SCREEN_PAGES = 8
76+
XSCREEN_WIDTH = 64
77+
XSCREEN_HEIGHT = 32
78+
XSCREEN_PAGES = 8
79+
SCREEN_WIDTH = 48
80+
SCREEN_HEIGHT = 26
81+
SCREEN_LMARGIN = 13
82+
SCREEN_TMARGIN = 3
6983
CONTROL = $de00
7084
#elif OSI600
71-
SCREEN_WIDTH = 64
72-
SCREEN_HEIGHT = 16
73-
SCREEN_PAGES = 4
85+
XSCREEN_WIDTH = 64
86+
XSCREEN_HEIGHT = 16
87+
XSCREEN_PAGES = 4
88+
SCREEN_WIDTH = 48
89+
SCREEN_HEIGHT = 12
90+
SCREEN_LMARGIN = 13
91+
SCREEN_TMARGIN = 2
7492
CONTROL = $d800
7593
#endif
7694

95+
#define SCREEN_HOMEPOS_OFFSET SCREEN_LMARGIN+(SCREEN_TMARGIN * XSCREEN_WIDTH)
96+
7797
#ifdef FLOPPY8
7898
PAGES_PER_TRACK = 12
7999
#else
@@ -105,7 +125,7 @@ init:
105125

106126
lda #>SCREENMEM
107127
sta ptr+1
108-
ldx #SCREEN_PAGES
128+
ldx #XSCREEN_PAGES
109129
lda #' '
110130

111131
zloop ; clear screen
@@ -413,16 +433,25 @@ zproc calculate_cursor_address
413433
inc ptr+1
414434
zendif
415435

436+
lda ptr
437+
clc
438+
adc #SCREEN_HOMEPOS_OFFSET ; offset is always < 256
439+
sta ptr
440+
zif_cs
441+
inc ptr+1
442+
zendif
416443
rts
417444
zendproc
418445

419446
zproc scroll_up
420-
lda #<(SCREENMEM)
447+
lda #<(SCREENMEM+SCREEN_TMARGIN*XSCREEN_WIDTH)
421448
sta ptr
422-
lda #<(SCREENMEM+SCREEN_WIDTH)
423-
sta ptr1
424-
lda #>SCREENMEM
449+
lda #>(SCREENMEM+SCREEN_TMARGIN*XSCREEN_WIDTH)
425450
sta ptr+1
451+
452+
lda #<(SCREENMEM+(SCREEN_TMARGIN+1)*XSCREEN_WIDTH)
453+
sta ptr1
454+
lda #>(SCREENMEM+(SCREEN_TMARGIN+1)*XSCREEN_WIDTH)
426455
sta ptr1+1
427456

428457
ldy #0
@@ -438,14 +467,14 @@ zproc scroll_up
438467
inc ptr1+1
439468
zendif
440469
lda ptr1+1
441-
cmp #>(SCREENMEM+SCREEN_PAGES*256)
470+
cmp #>(SCREENMEM+XSCREEN_PAGES*256)
442471
zuntil_eq
443472

444473
lda #' '
445474
zloop ; Clear last line
446475
sta (ptr),y
447476
iny
448-
cpy #SCREEN_WIDTH
477+
cpy #XSCREEN_WIDTH
449478
zuntil_eq
450479

451480
rts

src/arch/osi/utils/tty540b.S

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,21 @@ cury: .fill 1
2727

2828
drv_zp_end:
2929

30+
; Invisible overscan areas:
31+
;
32+
; 64x32 --> 48x26 worst case, hidden: 13L, 3R, 3T, 3B
33+
; 64x16 --> 48x12 worst case, hidden: 13L, 3R, 2T, 2B
34+
3035
#if OSI630
3136

32-
SCREEN_WIDTH = 64
33-
SCREEN_HEIGHT = 16
37+
XSCREEN_WIDTH = 64
38+
XSCREEN_HEIGHT = 16
39+
40+
SCREEN_WIDTH = 48
41+
SCREEN_HEIGHT = 12
42+
SCREEN_LMARGIN = 13
43+
SCREEN_TMARGIN = 2
44+
SCREEN_BMARGIN = 2
3445

3546
CONTROL = $d800
3647

@@ -42,16 +53,24 @@ INVERSE = $01
4253
CURSORXOR = (NORMAL ^ INVERSE)
4354

4455
SCREENMEM = $d000
45-
SECLASTLINE = $d380
46-
LASTLINE = $d3c0
56+
SECLASTLINE = $d380 - SCREEN_BMARGIN*XSCREEN_WIDTH + SCREEN_LMARGIN
57+
LASTLINE = $d3c0 - SCREEN_BMARGIN*XSCREEN_WIDTH + SCREEN_LMARGIN
58+
FIRSTLINE = $d000 + SCREEN_TMARGIN*XSCREEN_WIDTH + SCREEN_LMARGIN
59+
SECLINE = $d040 + SCREEN_TMARGIN*XSCREEN_WIDTH + SCREEN_LMARGIN
4760

4861
COLORMEM = $d400
4962
COLORXOR = ((SCREENMEM ^ COLORMEM) / 256)
5063

5164
#else
5265

53-
SCREEN_WIDTH = 64
54-
SCREEN_HEIGHT = 32
66+
XSCREEN_WIDTH = 64
67+
XSCREEN_HEIGHT = 32
68+
69+
SCREEN_WIDTH = 48
70+
SCREEN_HEIGHT = 26
71+
SCREEN_LMARGIN = 13
72+
SCREEN_TMARGIN = 3
73+
SCREEN_BMARGIN = 3
5574

5675
CONTROL = $de00
5776

@@ -63,14 +82,18 @@ INVERSE = $0f
6382
CURSORXOR = (NORMAL ^ INVERSE)
6483

6584
SCREENMEM = $d000
66-
SECLASTLINE = $d780
67-
LASTLINE = $d7c0
85+
SECLASTLINE = $d780 - SCREEN_BMARGIN*XSCREEN_WIDTH + SCREEN_LMARGIN
86+
LASTLINE = $d7c0 - SCREEN_BMARGIN*XSCREEN_WIDTH + SCREEN_LMARGIN
87+
FIRSTLINE = $d000 + SCREEN_TMARGIN*XSCREEN_WIDTH + SCREEN_LMARGIN
88+
SECLINE = $d040 + SCREEN_TMARGIN*XSCREEN_WIDTH + SCREEN_LMARGIN
6889

6990
COLORMEM = $e000
7091
COLORXOR = ((SCREENMEM ^ COLORMEM) / 256)
7192

7293
#endif
7394

95+
#define SCREEN_HOMEPOS_OFFSET SCREEN_LMARGIN+(SCREEN_TMARGIN * XSCREEN_WIDTH)
96+
7497
; -------------------------------------------------------------------------
7598

7699
zproc main
@@ -317,7 +340,7 @@ stylebg=.+1
317340
lda #NORMAL
318341
sta (ptr1),y
319342

320-
cpy #SCREEN_WIDTH-1
343+
cpy #XSCREEN_WIDTH-1
321344
zif_ne
322345
inc curx
323346
zendif
@@ -369,17 +392,20 @@ zproc screen540b_getchar
369392
zendproc
370393

371394
zproc screen540b_scrollup
372-
lda #0
395+
lda #<FIRSTLINE
373396
sta ptr
374397
sta ptr2
375-
lda #SCREEN_WIDTH
398+
lda #>FIRSTLINE
399+
sta ptr+1
400+
eor #COLORXOR
401+
sta ptr2+1
402+
403+
lda #<SECLINE
376404
sta ptr1
377405
sta ptr3
378-
lda #>SCREENMEM
379-
sta ptr+1
406+
lda #>SECLINE
380407
sta ptr1+1
381408
eor #COLORXOR
382-
sta ptr2+1
383409
sta ptr3+1
384410

385411
ldx #SCREEN_HEIGHT-1
@@ -403,9 +429,8 @@ zproc screen540b_scrollup
403429

404430
lda ptr1
405431
clc
406-
adc #SCREEN_WIDTH
432+
adc #XSCREEN_WIDTH
407433
sta ptr1
408-
sta ptr3
409434
zif_cs
410435
inc ptr1+1
411436
inc ptr3+1
@@ -435,11 +460,13 @@ zproc screen540b_scrolldown
435460
sta ptr
436461
sta ptr2
437462
lda #>LASTLINE
438-
sta ptr1+1
439463
sta ptr+1
440464
eor #COLORXOR
441-
sta ptr3+1
442465
sta ptr2+1
466+
lda #>SECLASTLINE
467+
sta ptr1+1
468+
eor #COLORXOR
469+
sta ptr3+1
443470

444471
ldx #SCREEN_HEIGHT-1
445472
zloop
@@ -462,7 +489,7 @@ zproc screen540b_scrolldown
462489

463490
lda ptr1
464491
sec
465-
sbc #SCREEN_WIDTH
492+
sbc #XSCREEN_WIDTH
466493
sta ptr1
467494
sta ptr3
468495
zif_cc
@@ -591,10 +618,18 @@ zproc calculate_cursor_address
591618
adc #>SCREENMEM ; only MSB because SCREENMEM is page aligned
592619
sta ptr+1
593620

594-
eor #COLORXOR
595-
sta ptr1+1
596621
lda ptr
622+
clc
623+
adc #SCREEN_HOMEPOS_OFFSET ; offset is always < 256
624+
sta ptr
597625
sta ptr1
626+
zif_cs
627+
inc ptr+1
628+
zendif
629+
630+
lda ptr+1
631+
eor #COLORXOR
632+
sta ptr1+1
598633

599634
rts
600635
zendproc

0 commit comments

Comments
 (0)