]> git.sur5r.net Git - cc65/blob - libsrc/atari/graphics.s
always use setcursor to update cursor settings
[cc65] / libsrc / atari / graphics.s
1 ;
2 ; Christian Groessler, October 2001
3 ;
4 ; this file provides an equivalent to the BASIC GRAPHICS function
5 ;
6 ; int __fastcall__ graphics(unsigned char mode);
7 ;
8 ;
9
10         .export _graphics
11         .constructor    initscrmem,28
12
13         .import findfreeiocb
14         .import __seterrno,__do_oserror,__oserror
15         .import fddecusage
16         .import clriocb
17         .import fdtoiocb
18         .import newfd
19         .import __graphmode_used
20         .importzp tmp1,tmp2,tmp3
21
22         .include        "atari.inc"
23         .include        "errno.inc"
24
25         .code
26
27 ; set new grapics mode
28 ; gets new mode in A
29 ; returns handle or -1 on error
30 ; uses tmp1, tmp2, tmp3, tmp4 (in subroutines)
31
32 .proc   _graphics
33
34 ;       tax
35 ;       and     #15             ; get required graphics mode
36 ;       cmp     #12
37 ;       bcs     invmode         ; invalid mode
38 ;       txa
39 ;       and     #$c0            ; invalid bits set?
40 ;       bne     invmode
41
42 ;       stx     tmp1
43         sta     tmp1            ; remember graphics mode
44
45 parmok: jsr     findfreeiocb
46         beq     iocbok          ; we found one
47
48         lda     #<EMFILE        ; "too many open files"
49         ldx     #>EMFILE
50 seterr: jsr     __seterrno
51         lda     #$FF
52         tax
53         rts                     ; return -1
54
55 ;invmode:ldx    #>EINVAL
56 ;       lda     #<EINVAL
57 ;       bne     seterr
58
59 iocbok: txa
60         tay                     ; move iocb # into Y
61         lda     #3
62         sta     tmp3            ; name length + 1
63         lda     #<scrdev
64         ldx     #>scrdev
65         jsr     newfd
66         tya
67         tax
68         bcs     doopen          ; C set: open needed
69
70         ldx     #0
71         lda     tmp2            ; get fd used
72         jsr     fdtoiocb
73         tax
74
75 doopen: txa
76         ;brk
77         pha
78         jsr     clriocb
79         pla
80         tax
81         lda     #<scrdev
82         sta     ICBAL,x
83         lda     #>scrdev
84         sta     ICBAH,x
85         lda     #OPEN
86         sta     ICCOM,x
87         lda     tmp1            ; get requested graphics mode
88         and     #15
89         sta     ICAX2,x
90         lda     tmp1
91         and     #$30
92         eor     #$10
93         ora     #12
94         sta     ICAX1,x
95
96         jsr     CIOV
97         bmi     cioerr
98
99         lda     tmp2            ; get fd
100         ldx     #0
101         stx     __oserror
102         rts
103
104 cioerr: jsr     fddecusage      ; decrement usage counter of fd as open failed
105         jmp     __do_oserror
106
107 .endproc        ; _graphics
108
109
110 ; calc. upper memory limit to use
111
112 .proc   initscrmem
113
114         lda     __graphmode_used
115         beq     ignore          ; mode 0 doesn't need adjustment
116         cmp     #32
117         bcs     ignore          ; invalid value
118
119         asl     a
120         tay
121         lda     APPMHI
122         sec
123         sbc     grmemusage,y
124         sta     APPMHI
125         lda     APPMHI+1
126         sbc     grmemusage+1,y
127         sta     APPMHI+1
128 ignore: rts
129
130 .endproc        ; initscrmem
131
132         .rodata
133
134 scrdev: .byte   "S:", 0
135
136
137 ; memory usage of the different graphics modes (0-31)
138 ; values < 0 of "bytes needed" are mappped to 0
139 ;               bytes needed    ; mode  ; val. of MEMTOP
140 grmemusage:
141         .word   0               ; 0     ; 39967
142         .word   0 ;-318         ; 1     ; 40285
143         .word   0 ;-568         ; 2     ; 40535
144         .word   0 ;-558         ; 3     ; 40525
145         .word   0 ;-298         ; 4     ; 40265
146         .word   182             ; 5     ; 39785
147         .word   1182            ; 6     ; 38785
148         .word   3198            ; 7     ; 36769
149         .word   7120            ; 8     ; 32847
150         .word   7146            ; 9     ; 32821
151         .word   7146            ; 10    ; 32821
152         .word   7146            ; 11    ; 32821
153         .word   162             ; 12    ; 39805
154         .word   0 ;-328         ; 13    ; 40295
155         .word   3278            ; 14    ; 36689
156         .word   7120            ; 15    ; 32847
157         .word   0               ; 16    ; 39967
158         .word   0 ;-320         ; 17    ; 40287
159         .word   0 ;-572         ; 18    ; 40539
160         .word   0 ;-560         ; 19    ; 40527
161         .word   0 ;-296         ; 20    ; 40263
162         .word   184             ; 21    ; 39783
163         .word   1192            ; 22    ; 38775
164         .word   3208            ; 23    ; 36759
165         .word   7146            ; 24    ; 32821
166         .word   7146            ; 25    ; 32821
167         .word   7146            ; 26    ; 32821
168         .word   7146            ; 27    ; 32821
169         .word   160             ; 28    ; 39807
170         .word   0 ;-332         ; 29    ; 40299
171         .word   3304            ; 30    ; 36663
172         .word   7146            ; 31    ; 32821
173
174 ; the program used to get these values (Atari BASIC):
175 ;  100 FILE=0
176 ;  110 IF FILE=1 THEN OPEN #1,8,0,"D:FREEMEM.OUT"
177 ;  120 IF FILE<>1 THEN OPEN #1,8,0,"E:"
178 ;  200 DIM G(32)
179 ;  210 FOR I=0 TO 32:GRAPHICS I:GOSUB 1000:G(I)=VAL:NEXT I
180 ;  220 GRAPHICS 0
181 ;  230 FOR I=0 TO 31:PRINT #1;I;":",G(I);" - ";G(0)-G(I):NEXT I
182 ;  240 CLOSE #1
183 ;  999 END
184 ;  1000 VAL=PEEK(741)+256*PEEK(742)
185 ;  1010 RETURN
186