]> git.sur5r.net Git - cc65/blobdiff - libsrc/atari/graphics.s
Added "popptr1" which is of common use to save some bytes.
[cc65] / libsrc / atari / graphics.s
index 120865f826871254ba7e4eb79da1f4374701f245..ab26ed0da90bb4f36dcbaee73fb6a00fe34e372e 100644 (file)
 ;
 ;
 
-       .export __graphics
+        .export __graphics
 
-       .import findfreeiocb
-       .import __do_oserror,__oserror
-       .import fddecusage
-       .import clriocb
-       .import fdtoiocb
-       .import newfd
-       .importzp tmp1,tmp2,tmp3
+        .import findfreeiocb
+        .import __oserror
+        .import fddecusage
+        .import clriocb
+        .import fdtoiocb
+        .import newfd
+        .import scrdev
+        .importzp tmp1,tmp2,tmp3
 
-       .include        "atari.inc"
-       .include        "errno.inc"
+        .include        "atari.inc"
+        .include        "errno.inc"
 
-       .code
+        .code
 
 ; set new grapics mode
 ; gets new mode in A
 ; returns handle or -1 on error
 ; uses tmp1, tmp2, tmp3, tmp4 (in subroutines)
 
-.proc  __graphics
-
-;      tax
-;      and     #15             ; get required graphics mode
-;      cmp     #12
-;      bcs     invmode         ; invalid mode
-;      txa
-;      and     #$c0            ; invalid bits set?
-;      bne     invmode
-
-;      stx     tmp1
-       sta     tmp1            ; remember graphics mode
-
-parmok:        jsr     findfreeiocb
-       beq     iocbok          ; we found one
-
-       lda     #<EMFILE        ; "too many open files"
-seterr:        jsr     __mappederrno   ; @@@ probably not correct to set errno here @@@
-       rts                     ; return -1
-
-;invmode:ldx   #>EINVAL
-;      lda     #<EINVAL
-;      bne     seterr
-
-iocbok:        txa
-       tay                     ; move iocb # into Y
-       lda     #3
-       sta     tmp3            ; name length + 1
-       lda     #<scrdev
-       ldx     #>scrdev
-       jsr     newfd
-       tya
-       tax
-       bcs     doopen          ; C set: open needed
-
-       ldx     #0
-       lda     tmp2            ; get fd used
-       jsr     fdtoiocb
-       tax
-
-doopen:        txa
-       ;brk
-       pha
-       jsr     clriocb
-       pla
-       tax
-       lda     #<scrdev
-       sta     ICBAL,x
-       lda     #>scrdev
-       sta     ICBAH,x
-       lda     #OPEN
-       sta     ICCOM,x
-       lda     tmp1            ; get requested graphics mode
-       and     #15
-       sta     ICAX2,x
-       lda     tmp1
-       and     #$30
-       eor     #$10
-       ora     #12
-       sta     ICAX1,x
-
-       jsr     CIOV
-       bmi     cioerr
-
-       lda     tmp2            ; get fd
-       ldx     #0
-       stx     __oserror
-       rts
-
-cioerr:        jsr     fddecusage      ; decrement usage counter of fd as open failed
-       jmp     __do_oserror
-
-.endproc       ; __graphics
-
-
-       .rodata
-
-scrdev:        .byte   "S:", 0
+.proc   __graphics
+
+;       tax
+;       and     #15             ; get required graphics mode
+;       cmp     #12
+;       bcs     invmode         ; invalid mode
+;       txa
+;       and     #$c0            ; invalid bits set?
+;       bne     invmode
+
+;       stx     tmp1
+        sta     tmp1            ; remember graphics mode
+
+parmok: jsr     findfreeiocb
+        beq     iocbok          ; we found one
+
+        lda     #<EMFILE        ; "too many open files"
+seterr: jsr     __mappederrno   ; @@@ probably not correct to set errno here @@@
+        rts                     ; return -1
+
+;invmode:ldx    #>EINVAL
+;       lda     #<EINVAL
+;       bne     seterr
+
+iocbok: txa
+        tay                     ; move iocb # into Y
+        lda     #3
+        sta     tmp3            ; name length + 1
+        lda     #<scrdev
+        ldx     #>scrdev
+        jsr     newfd
+        tya
+        tax
+        bcs     doopen          ; C set: open needed
+
+        ldx     #0
+        lda     tmp2            ; get fd used
+        jsr     fdtoiocb
+        tax
+
+doopen: txa
+        ;brk
+        pha
+        jsr     clriocb
+        pla
+        tax
+        lda     #<scrdev
+        sta     ICBAL,x
+        lda     #>scrdev
+        sta     ICBAH,x
+        lda     #OPEN
+        sta     ICCOM,x
+        lda     tmp1            ; get requested graphics mode
+        and     #15
+        sta     ICAX2,x
+        lda     tmp1
+        and     #$30
+        eor     #$10
+        ora     #12
+        sta     ICAX1,x
+
+        jsr     CIOV
+        bmi     cioerr
+
+        lda     tmp2            ; get fd
+        ldx     #0
+        stx     __oserror
+        rts
+
+cioerr: sty     tmp3            ; remember error code
+        lda     #CLOSE
+        sta     ICCOM,x
+        jsr     CIOV            ; close IOCB again since open failed
+        jsr     fddecusage      ; and decrement usage counter of fd
+        lda     tmp3            ; put error code into A
+        jmp     __mappederrno
+
+.endproc        ; __graphics