]> git.sur5r.net Git - cc65/blob - libsrc/atari/graphics.s
Fixed _textcolor definition.
[cc65] / libsrc / atari / graphics.s
1 ;
2 ; Christian Groessler, June 2004
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
12         .import findfreeiocb
13         .import __oserror
14         .import fddecusage
15         .import clriocb
16         .import fdtoiocb
17         .import newfd
18         .import scrdev
19         .importzp tmp1,tmp2,tmp3
20
21         .include        "atari.inc"
22         .include        "errno.inc"
23
24         .code
25
26 ; set new grapics mode
27 ; gets new mode in A
28 ; returns handle or -1 on error
29 ; uses tmp1, tmp2, tmp3, tmp4 (in subroutines)
30
31 .proc   __graphics
32
33 ;       tax
34 ;       and     #15             ; get required graphics mode
35 ;       cmp     #12
36 ;       bcs     invmode         ; invalid mode
37 ;       txa
38 ;       and     #$c0            ; invalid bits set?
39 ;       bne     invmode
40
41 ;       stx     tmp1
42         sta     tmp1            ; remember graphics mode
43
44 parmok: jsr     findfreeiocb
45         beq     iocbok          ; we found one
46
47         lda     #<EMFILE        ; "too many open files"
48 seterr: jsr     __mappederrno   ; @@@ probably not correct to set errno here @@@
49         rts                     ; return -1
50
51 ;invmode:ldx    #>EINVAL
52 ;       lda     #<EINVAL
53 ;       bne     seterr
54
55 iocbok: txa
56         tay                     ; move iocb # into Y
57         lda     #3
58         sta     tmp3            ; name length + 1
59         lda     #<scrdev
60         ldx     #>scrdev
61         jsr     newfd
62         tya
63         tax
64         bcs     doopen          ; C set: open needed
65
66         ldx     #0
67         lda     tmp2            ; get fd used
68         jsr     fdtoiocb
69         tax
70
71 doopen: txa
72         ;brk
73         pha
74         jsr     clriocb
75         pla
76         tax
77         lda     #<scrdev
78         sta     ICBAL,x
79         lda     #>scrdev
80         sta     ICBAH,x
81         lda     #OPEN
82         sta     ICCOM,x
83         lda     tmp1            ; get requested graphics mode
84         and     #15
85         sta     ICAX2,x
86         lda     tmp1
87         and     #$30
88         eor     #$10
89         ora     #12
90         sta     ICAX1,x
91
92         jsr     CIOV
93         bmi     cioerr
94
95         lda     tmp2            ; get fd
96         ldx     #0
97         stx     __oserror
98         rts
99
100 cioerr: sty     tmp3            ; remember error code
101         lda     #CLOSE
102         sta     ICCOM,x
103         jsr     CIOV            ; close IOCB again since open failed
104         jsr     fddecusage      ; and decrement usage counter of fd
105         lda     tmp3            ; put error code into A
106         jmp     __mappederrno
107
108 .endproc        ; __graphics