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