]> git.sur5r.net Git - cc65/blob - libsrc/osic1p/osiscreen.inc
Merge remote-tracking branch 'upstream/master' into creativision
[cc65] / libsrc / osic1p / osiscreen.inc
1 ;\r
2 ; Macro definitions for screen layout modules\r
3 ;\r
4 \r
5         .include        "extzp.inc"\r
6         \r
7 .linecont +\r
8 \r
9 ;\r
10 ; Internal function for screensize()\r
11 ;\r
12 .macro  osi_screensize ScrWidth, ScrHeight\r
13                                 ; Macro implementation of internal screensize\r
14                                 ; function for given width and height in\r
15                                 ; characters\r
16                                 \r
17         .export         screensize\r
18 \r
19 .proc   screensize\r
20         ldx     #ScrWidth\r
21         ldy     #ScrHeight\r
22         rts\r
23 .endproc\r
24 .endmacro\r
25 \r
26 ;\r
27 ; void clrscr (void);\r
28 ;\r
29 .macro  osi_clrscr ScrBase, ScrRamSize\r
30 \r
31         .export         _clrscr\r
32 \r
33 .proc   _clrscr\r
34         lda     #<ScrBase       ; Fill whole video RAM with blanks by calling\r
35         ldx     #>ScrBase       ; memset appropriately\r
36         jsr     pushax\r
37         \r
38         lda     #' '\r
39         ldx     #$00\r
40         jsr     pushax\r
41         \r
42         lda     #<ScrRamSize\r
43         ldx     #>ScrRamSize\r
44         jsr     _memset\r
45 \r
46         lda     #$00            ; Cursor in upper left corner\r
47         sta     CURS_X\r
48         sta     CURS_Y\r
49         \r
50         jmp     plot            ; Set the cursor position\r
51 .endproc\r
52 \r
53 .endmacro\r
54 \r
55 ;\r
56 ; cputc/cputcxy for Challenger 1P\r
57 ; Based on PET/CBM implementation\r
58 ;\r
59 \r
60 .macro  osi_cputfuncs ScrBase, ScrFirstChar, ScrWidth, ScrHeight, \\r
61                          ScrollDist, ScrLo, ScrHi\r
62 \r
63                                 ; Number of characters to move for scrolling\r
64                                 ; by one line\r
65 ScrollLength    = (ScrHeight - 1) * ScrollDist\r
66 \r
67 ;\r
68 ; void cputcxy (unsigned char x, unsigned char y, char c);\r
69 ; void cputc (char c);\r
70 ;\r
71         .export         _cputcxy, _cputc, cputdirect, putchar\r
72         .export         newline, plot\r
73 \r
74 _cputcxy:\r
75         pha                     ; Save C\r
76         jsr     gotoxy          ; Set cursor, drop x and y\r
77         pla                     ; Restore C\r
78 \r
79 ; Plot a character - also used as internal function\r
80 \r
81 _cputc: cmp     #$0A            ; CR?\r
82         bne     L1\r
83         lda     #0\r
84         sta     CURS_X\r
85         beq     plot            ; Recalculate pointers\r
86 \r
87 L1:     cmp     #$0D            ; LF?\r
88         beq     newline         ; Recalculate pointers\r
89 \r
90 cputdirect:\r
91         jsr     putchar         ; Write the character to the screen\r
92 \r
93 ; Advance cursor position, register Y contains horizontal position after\r
94 ; putchar\r
95 \r
96         cpy     #(ScrWidth - 1) ; Check whether line is full\r
97         bne     L3\r
98         jsr     newline         ; New line\r
99         ldy     #$FF            ; + cr\r
100 L3:     iny\r
101         sty     CURS_X\r
102         rts\r
103 \r
104 newline:\r
105         inc     CURS_Y\r
106         lda     CURS_Y\r
107         cmp     #ScrHeight      ; Screen height\r
108         bne     plot\r
109         dec     CURS_Y          ; Bottom of screen reached, scroll\r
110 \r
111                                 ; Scroll destination address\r
112         lda     #<(ScrBase + ScrFirstChar)\r
113         ldx     #>(ScrBase + ScrFirstChar)\r
114         jsr     pushax\r
115         \r
116                                 ; Scroll source address\r
117         lda     #<(ScrBase + ScrFirstChar + ScrollDist)\r
118         ldx     #>(ScrBase + ScrFirstChar + ScrollDist)\r
119         jsr     pushax\r
120         \r
121                                 ; Number of characters to move\r
122         lda     #<ScrollLength\r
123         ldx     #>ScrollLength\r
124         jsr     _memmove\r
125 \r
126                                 ; Address of first character in last line\r
127                                 ; of screen\r
128         lda     #<(ScrBase + ScrFirstChar + ScrollLength)\r
129         sta     ptr1\r
130         lda     #>(ScrBase + ScrFirstChar + ScrollLength)\r
131         sta     ptr1+1\r
132         \r
133         ldy     #ScrWidth       ; Fill last line with blanks\r
134         lda     #' '\r
135 clrln:  sta     (ptr1),y\r
136         dey\r
137         bpl     clrln\r
138 \r
139 plot:   ldy     CURS_Y\r
140         lda     ScrLo,y\r
141         sta     SCREEN_PTR\r
142         lda     ScrHi,y\r
143         sta     SCREEN_PTR+1\r
144         rts\r
145 \r
146 ; Write one character to the screen without doing anything else, return X\r
147 ; position in register Y\r
148 \r
149 putchar:\r
150         ldy     CURS_X\r
151         sta     (SCREEN_PTR),y  ; Set char\r
152         rts\r
153         \r
154 .endmacro\r
155 \r
156 .macro osi_screen_funcs ScrBase, ScrRamSize, ScrFirstChar, \\r
157                         ScrWidth, ScrHeight, ScrollDist\r
158 \r
159         .import         gotoxy\r
160         .import         _memmove, _memset, pushax\r
161         .importzp       ptr1\r
162 \r
163 .rodata\r
164 \r
165 ; Screen address tables - offset to real screen\r
166 ScrTabLo:\r
167         .repeat ScrHeight, I\r
168         .byte <(ScrBase + ScrFirstChar + I * ScrollDist)\r
169         .endrep\r
170         \r
171 ScrTabHi:\r
172         .repeat ScrHeight, I\r
173         .byte >(ScrBase + ScrFirstChar + I * ScrollDist)\r
174         .endrep\r
175 \r
176 .code\r
177 \r
178 osi_cputfuncs   ScrBase, ScrFirstChar, ScrWidth, ScrHeight, \\r
179                          ScrollDist, ScrTabLo, ScrTabHi\r
180 osi_screensize  ScrWidth, ScrHeight\r
181 osi_clrscr      ScrBase, ScrRamSize\r
182 \r
183 .endmacro