]> git.sur5r.net Git - cc65/blob - libsrc/osic1p/osiscreen.inc
Merge pull request #215 from greg-king5/c64-init
[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     popa            ; Get Y\r
77         jsr     _gotoxy         ; Set cursor, drop x\r
78         pla                     ; Restore C\r
79 \r
80 ; Plot a character - also used as internal function\r
81 \r
82 _cputc: cmp     #$0A            ; CR?\r
83         bne     L1\r
84         lda     #0\r
85         sta     CURS_X\r
86         beq     plot            ; Recalculate pointers\r
87 \r
88 L1:     cmp     #$0D            ; LF?\r
89         beq     newline         ; Recalculate pointers\r
90 \r
91 cputdirect:\r
92         jsr     putchar         ; Write the character to the screen\r
93 \r
94 ; Advance cursor position, register Y contains horizontal position after\r
95 ; putchar\r
96 \r
97         cpy     #(ScrWidth - 1) ; Check whether line is full\r
98         bne     L3\r
99         jsr     newline         ; New line\r
100         ldy     #$FF            ; + cr\r
101 L3:     iny\r
102         sty     CURS_X\r
103         rts\r
104 \r
105 newline:\r
106         inc     CURS_Y\r
107         lda     CURS_Y\r
108         cmp     #ScrHeight      ; Screen height\r
109         bne     plot\r
110         dec     CURS_Y          ; Bottom of screen reached, scroll\r
111 \r
112                                 ; Scroll destination address\r
113         lda     #<(ScrBase + ScrFirstChar)\r
114         ldx     #>(ScrBase + ScrFirstChar)\r
115         jsr     pushax\r
116         \r
117                                 ; Scroll source address\r
118         lda     #<(ScrBase + ScrFirstChar + ScrollDist)\r
119         ldx     #>(ScrBase + ScrFirstChar + ScrollDist)\r
120         jsr     pushax\r
121         \r
122                                 ; Number of characters to move\r
123         lda     #<ScrollLength\r
124         ldx     #>ScrollLength\r
125         jsr     _memmove\r
126 \r
127                                 ; Address of first character in last line\r
128                                 ; of screen\r
129         lda     #<(ScrBase + ScrFirstChar + ScrollLength)\r
130         sta     ptr1\r
131         lda     #>(ScrBase + ScrFirstChar + ScrollLength)\r
132         sta     ptr1+1\r
133         \r
134         ldy     #ScrWidth       ; Fill last line with blanks\r
135         lda     #' '\r
136 clrln:  sta     (ptr1),y\r
137         dey\r
138         bpl     clrln\r
139 \r
140 plot:   ldy     CURS_Y\r
141         lda     ScrLo,y\r
142         sta     SCREEN_PTR\r
143         lda     ScrHi,y\r
144         sta     SCREEN_PTR+1\r
145         rts\r
146 \r
147 ; Write one character to the screen without doing anything else, return X\r
148 ; position in register Y\r
149 \r
150 putchar:\r
151         ldy     CURS_X\r
152         sta     (SCREEN_PTR),y  ; Set char\r
153         rts\r
154         \r
155 .endmacro\r
156 \r
157 .macro osi_screen_funcs ScrBase, ScrRamSize, ScrFirstChar, \\r
158                         ScrWidth, ScrHeight, ScrollDist\r
159 \r
160         .import         popa, _gotoxy\r
161         .import         _memmove, _memset, pushax\r
162         .importzp       ptr1\r
163 \r
164 .rodata\r
165 \r
166 ; Screen address tables - offset to real screen\r
167 ScrTabLo:\r
168         .repeat ScrHeight, I\r
169         .byte <(ScrBase + ScrFirstChar + I * ScrollDist)\r
170         .endrep\r
171         \r
172 ScrTabHi:\r
173         .repeat ScrHeight, I\r
174         .byte >(ScrBase + ScrFirstChar + I * ScrollDist)\r
175         .endrep\r
176 \r
177 .code\r
178 \r
179 osi_cputfuncs   ScrBase, ScrFirstChar, ScrWidth, ScrHeight, \\r
180                          ScrollDist, ScrTabLo, ScrTabHi\r
181 osi_screensize  ScrWidth, ScrHeight\r
182 osi_clrscr      ScrBase, ScrRamSize\r
183 \r
184 .endmacro