]> git.sur5r.net Git - cc65/blobdiff - libsrc/apple2/tgi/a2.hi.s
Removed IRQ support from TGI drivers.
[cc65] / libsrc / apple2 / tgi / a2.hi.s
index ce2814a1c9030c958c81aa12c3e61f15de7ccc1f..e06b4a617f8b71efceb814bbf14a3ebb540b47ac 100644 (file)
@@ -5,55 +5,57 @@
 ; Oliver Schmidt <ol.sc@web.de>
 ;
 
-       .include        "zeropage.inc"
+        .include        "zeropage.inc"
 
-       .include        "tgi-kernel.inc"
-       .include        "tgi-error.inc"
-       .include        "apple2.inc"
+        .include        "tgi-kernel.inc"
+        .include        "tgi-error.inc"
+        .include        "apple2.inc"
+
+        .macpack        module
 
 ; ------------------------------------------------------------------------
 
 ; Zero page stuff
 
-HBASL  :=      $26
-HMASK  :=      $30
-PAGE   :=      $E6
-SCALE  :=      $E7
-ROT    :=      $F9
+HBASL   :=      $26
+HMASK   :=      $30
+PAGE    :=      $E6
+SCALE   :=      $E7
+ROT     :=      $F9
 
 ; Graphics entry points, by cbmnut (applenut??) cbmnut@hushmail.com
 
-TEXT    :=     $F399   ; Return to text screen
-HGR2    :=     $F3D8   ; Initialize and clear hi-res page 2.
-HGR     :=     $F3E2   ; Initialize and clear hi-res page 1.
-HCLR    :=     $F3F2   ; Clear the current hi-res screen to black.
-BKGND   :=     $F3F6   ; Clear the current hi-res screen to the
+TEXT    :=      $F399   ; Return to text screen
+HGR2    :=      $F3D8   ; Initialize and clear hi-res page 2.
+HGR     :=      $F3E2   ; Initialize and clear hi-res page 1.
+HCLR    :=      $F3F2   ; Clear the current hi-res screen to black.
+BKGND   :=      $F3F6   ; Clear the current hi-res screen to the
                         ; last plotted color (from ($1C).
-HPOSN   :=     $F411   ; Positions the hi-res cursor without
+HPOSN   :=      $F411   ; Positions the hi-res cursor without
                         ; plotting a point.
                         ; Enter with (A) = Y-coordinate, and
                         ; (Y,X) = X-coordinate.
-HPLOT   :=     $F457   ; Calls HPOSN and tries to plot a dot at
+HPLOT   :=      $F457   ; Calls HPOSN and tries to plot a dot at
                         ; the cursor's position.  If you are
                         ; trying to plot a non-white color at
                         ; a complementary color position, no
                         ; dot will be plotted.
-HLIN    :=     $F53A   ; Draws a line from the last plotted
+HLIN    :=      $F53A   ; Draws a line from the last plotted
                         ; point or line destination to:
                         ; (X,A) = X-coordinate, and
                         ; (Y) = Y-coordinate.
-HFIND   :=     $F5CB   ; Converts the hi-res coursor's position
+HFIND   :=      $F5CB   ; Converts the hi-res coursor's position
                         ; back to X- and Y-coordinates; stores
                         ; X-coordinate at $E0,E1 and Y-coordinate
                         ; at $E2.
-DRAW    :=     $F601   ; Draws a shape.  Enter with (Y,X) = the
+DRAW    :=      $F601   ; Draws a shape.  Enter with (Y,X) = the
                         ; address of the shape table, and (A) =
                         ; the rotation factor.  Uses the current
                         ; color.
-XDRAW   :=     $F65D   ; Draws a shape by inverting the existing
+XDRAW   :=      $F65D   ; Draws a shape by inverting the existing
                         ; color of the dots the shape draws over.
                         ; Same entry parameters as DRAW.
-SETHCOL :=     $F6EC   ; Set the hi-res color to (X), where (X)
+SETHCOL :=      $F6EC   ; Set the hi-res color to (X), where (X)
                         ; must be between 0 and 7.
 
 ; ------------------------------------------------------------------------
@@ -61,100 +63,104 @@ SETHCOL :=        $F6EC   ; Set the hi-res color to (X), where (X)
 ; Variables mapped to the zero page segment variables. Some of these are
 ; used for passing parameters to the driver.
 
-X1     :=      ptr1
-Y1     :=      ptr2
-X2     :=      ptr3
-Y2     :=      ptr4
+X1      :=      ptr1
+Y1      :=      ptr2
+X2      :=      ptr3
+Y2      :=      ptr4
 
 ; ------------------------------------------------------------------------
 
-       .segment        "JUMPTABLE"
+        .ifdef  __APPLE2ENH__
+        module_header   _a2e_hi_tgi
+        .else
+        module_header   _a2_hi_tgi
+        .endif
 
 ; Header. Includes jump table and constants.
 
 ; First part of the header is a structure that has a magic and defines the
 ; capabilities of the driver
 
-       .byte   $74, $67, $69   ; "tgi"
-       .byte   TGI_API_VERSION ; TGI API version number
-       .word   280             ; X resolution
-       .word   192             ; Y resolution
-       .byte   8               ; Number of drawing colors
-pages: .byte   2               ; Number of screens available
-       .byte   7               ; System font X size
-       .byte   8               ; System font Y size
-       .word   $00EA           ; Aspect ratio (based on 4/3 display)
+        .byte   $74, $67, $69   ; "tgi"
+        .byte   TGI_API_VERSION ; TGI API version number
+        .addr   $0000           ; Library reference
+        .word   280             ; X resolution
+        .word   192             ; Y resolution
+        .byte   8               ; Number of drawing colors
+pages:  .byte   2               ; Number of screens available
+        .byte   7               ; System font X size
+        .byte   8               ; System font Y size
+        .word   $00EA           ; Aspect ratio (based on 4/3 display)
         .byte   0               ; TGI driver flags
 
 ; Next comes the jump table. With the exception of IRQ, all entries must be
 ; valid and may point to an RTS for test versions (function not implemented).
 
-               .addr   INSTALL
-               .addr   UNINSTALL
-               .addr   INIT
-               .addr   DONE
-               .addr   GETERROR
-               .addr   CONTROL
-               .addr   CLEAR
-               .addr   SETVIEWPAGE
-               .addr   SETDRAWPAGE
-               .addr   SETCOLOR
-               .addr   SETPALETTE
-               .addr   GETPALETTE
-               .addr   GETDEFPALETTE
-               .addr   SETPIXEL
-               .addr   GETPIXEL
-               .addr   LINE
-               .addr   BAR
-               .addr   TEXTSTYLE
-               .addr   OUTTEXT
-        .addr   0               ; IRQ entry is unused
+        .addr   INSTALL
+        .addr   UNINSTALL
+        .addr   INIT
+        .addr   DONE
+        .addr   GETERROR
+        .addr   CONTROL
+        .addr   CLEAR
+        .addr   SETVIEWPAGE
+        .addr   SETDRAWPAGE
+        .addr   SETCOLOR
+        .addr   SETPALETTE
+        .addr   GETPALETTE
+        .addr   GETDEFPALETTE
+        .addr   SETPIXEL
+        .addr   GETPIXEL
+        .addr   LINE
+        .addr   BAR
+        .addr   TEXTSTYLE
+        .addr   OUTTEXT
 
 ; ------------------------------------------------------------------------
 
-       .bss
+        .bss
 
 ; Absolute variables used in the code
 
-ERROR: .res    1               ; Error code
+ERROR:  .res    1               ; Error code
 
 ; ------------------------------------------------------------------------
 
-       .rodata
+        .rodata
 
 ; Constants and tables
 
 DEFPALETTE: .byte $00, $01, $02, $03, $04, $05, $06, $07
 
 FONT:
-       ; Beagle Bros Shape Mechanic font F.ASCII.SMALL
-       ; modified to exactly reproduce the text glyphs
-       .incbin "a2.hi.fnt"
+        ; Beagle Bros Shape Mechanic font F.ASCII.SMALL
+        ; modified to exactly reproduce the text glyphs
+        .incbin "a2.hi.fnt"
 
 ; ------------------------------------------------------------------------
 
-       .code
+        .code
 
 ; INSTALL routine. Is called after the driver is loaded into memory. May
 ; initialize anything that has to be done just once. Is probably empty
 ; most of the time.
 ; Must set an error code: NO
 INSTALL:
-       .ifdef  __APPLE2ENH__
-       ; No page switching if 80 column store is enabled
-       bit     RD80COL
-       bpl     :+
-       lda     #$01
-       sta     pages
-:      .endif
+        .ifdef  __APPLE2ENH__
+        ; No page switching if 80 column store is enabled
+        bit     RD80COL
+        bpl     :+
+        lda     #$01
+        sta     pages
+:       .endif
 
-       ; Fall through
+        ; Fall through
 
 ; UNINSTALL routine. Is called before the driver is removed from memory. May
 ; clean up anything done by INSTALL but is probably empty most of the time.
 ; Must set an error code: NO
 UNINSTALL:
-       rts
+        rts
 
 ; INIT: Changes an already installed device from text mode to graphics mode.
 ; Note that INIT/DONE may be called multiple times while the driver
@@ -166,132 +172,132 @@ UNINSTALL:
 ; active, so there is no need to protect against that.
 ; Must set an error code: YES
 INIT:
-       ; Switch into graphics mode
-       bit     MIXCLR
-       bit     HIRES
-       bit     TXTCLR
+        ; Switch into graphics mode
+        bit     MIXCLR
+        bit     HIRES
+        bit     TXTCLR
 
-       ; Beagle Bros Shape Mechanic fonts don't
-       ; scale well so use fixed scaling factor
-       lda     #$01
-       sta     SCALE
+        ; Beagle Bros Shape Mechanic fonts don't
+        ; scale well so use fixed scaling factor
+        lda     #$01
+        sta     SCALE
 
-       ; Done, reset the error code
-       lda     #TGI_ERR_OK
-       sta     ERROR
-       rts
+        ; Done, reset the error code
+        lda     #TGI_ERR_OK
+        sta     ERROR
+        rts
 
 ; DONE: Will be called to switch the graphics device back into text mode.
 ; The graphics kernel will never call DONE when no graphics mode is active,
 ; so there is no need to protect against that.
 ; Must set an error code: NO
 DONE:
-       ; Switch into text mode
-       bit     TXTSET
-       bit     LOWSCR
+        ; Switch into text mode
+        bit     TXTSET
+        bit     LOWSCR
 
-       .ifdef  __APPLE2ENH__
-       ; Limit SET80COL-HISCR to text
-       bit     LORES
-       .endif
+        .ifdef  __APPLE2ENH__
+        ; Limit SET80COL-HISCR to text
+        bit     LORES
+        .endif
 
-       ; Reset the text window top
-       lda     #$00
-       sta     WNDTOP
-       rts
+        ; Reset the text window top
+        lda     #$00
+        sta     WNDTOP
+        rts
 
 ; GETERROR: Return the error code in A and clear it.
 GETERROR:
-       lda     ERROR
-       ldx     #TGI_ERR_OK
-       stx     ERROR
-       rts
+        lda     ERROR
+        ldx     #TGI_ERR_OK
+        stx     ERROR
+        rts
 
 ; CONTROL: Platform/driver specific entry point.
 ; Must set an error code: YES
 CONTROL:
-       ; Check data msb and code to be 0
-       ora     ptr1+1
-       bne     err
-
-       ; Check data lsb to be [0..1]
-       lda     ptr1
-       cmp     #1+1
-       bcs     err
-
-       ; Set text window top
-       tax
-       beq     :+
-       lda     #20
-:      sta     WNDTOP
-
-       ; Switch 4 lines of text
-       .assert MIXCLR + 1 = MIXSET, error
-       lda     MIXCLR,x        ; No BIT absolute,X available
-
-       ; Done, reset the error code
-       lda     #TGI_ERR_OK
-       beq     :+              ; Branch always
-
-       ; Done, set the error code
-err:   lda     #TGI_ERR_INV_ARG
-:      sta     ERROR
-       rts
+        ; Check data msb and code to be 0
+        ora     ptr1+1
+        bne     err
+
+        ; Check data lsb to be [0..1]
+        lda     ptr1
+        cmp     #1+1
+        bcs     err
+
+        ; Set text window top
+        tax
+        beq     :+
+        lda     #20
+:       sta     WNDTOP
+
+        ; Switch 4 lines of text
+        .assert MIXCLR + 1 = MIXSET, error
+        lda     MIXCLR,x        ; No BIT absolute,X available
+
+        ; Done, reset the error code
+        lda     #TGI_ERR_OK
+        beq     :+              ; Branch always
+
+        ; Done, set the error code
+err:    lda     #TGI_ERR_INV_ARG
+:       sta     ERROR
+        rts
 
 ; CLEAR: Clears the screen.
 ; Must set an error code: NO
 CLEAR:
-       bit     $C082           ; Switch in ROM
-       jsr     HCLR
-       bit     $C080           ; Switch in LC bank 2 for R/O
-       rts
+        bit     $C082           ; Switch in ROM
+        jsr     HCLR
+        bit     $C080           ; Switch in LC bank 2 for R/O
+        rts
 
 ; SETVIEWPAGE: Set the visible page. Called with the new page in A (0..n).
 ; The page number is already checked to be valid by the graphics kernel.
 ; Must set an error code: NO (will only be called if page ok)
 SETVIEWPAGE:
-       tax
-       .assert LOWSCR + 1 = HISCR, error
-       lda     LOWSCR,x        ; No BIT absolute,X available
-       rts
+        tax
+        .assert LOWSCR + 1 = HISCR, error
+        lda     LOWSCR,x        ; No BIT absolute,X available
+        rts
 
 ; SETDRAWPAGE: Set the drawable page. Called with the new page in A (0..n).
 ; The page number is already checked to be valid by the graphics kernel.
 ; Must set an error code: NO (will only be called if page ok)
 SETDRAWPAGE:
-       tax
-       beq     :+
-       lda     #>$4000         ; Page 2
-       .byte   $2C             ; BIT absolute
-:      lda     #>$2000         ; Page 1
-       sta     PAGE
-       rts
+        tax
+        beq     :+
+        lda     #>$4000         ; Page 2
+        .byte   $2C             ; BIT absolute
+:       lda     #>$2000         ; Page 1
+        sta     PAGE
+        rts
 
 ; SETCOLOR: Set the drawing color (in A). The new color is already checked
 ; to be in a valid range (0..maxcolor-1).
 ; Must set an error code: NO (will only be called if color ok)
 SETCOLOR:
-       bit     $C082           ; Switch in ROM
-       tax
-       jsr     SETHCOL
-       bit     $C080           ; Switch in LC bank 2 for R/O
-       rts
+        bit     $C082           ; Switch in ROM
+        tax
+        jsr     SETHCOL
+        bit     $C080           ; Switch in LC bank 2 for R/O
+        rts
 
 ; SETPALETTE: Set the palette (not available with all drivers/hardware).
 ; A pointer to the palette is passed in ptr1. Must set an error if palettes
 ; are not supported
 ; Must set an error code: YES
 SETPALETTE:
-       lda     #TGI_ERR_INV_FUNC
-       sta     ERROR
-       rts
+        lda     #TGI_ERR_INV_FUNC
+        sta     ERROR
+        rts
 
 ; GETPALETTE: Return the current palette in A/X. Even drivers that cannot
 ; set the palette should return the default palette here, so there's no
 ; way for this function to fail.
 ; Must set an error code: NO
 GETPALETTE:
-       ; Fall through
+        ; Fall through
 
 ; GETDEFPALETTE: Return the default palette for the driver in A/X. All
 ; drivers should return something reasonable here, even drivers that don't
@@ -299,147 +305,147 @@ GETPALETTE:
 ; of the (not changeable) palette.
 ; Must set an error code: NO (all drivers must have a default palette)
 GETDEFPALETTE:
-       lda     #<DEFPALETTE
-       ldx     #>DEFPALETTE
-       rts
+        lda     #<DEFPALETTE
+        ldx     #>DEFPALETTE
+        rts
 
 ; SETPIXEL: Draw one pixel at X1/Y1 = ptr1/ptr2 with the current drawing
 ; color. The coordinates passed to this function are never outside the
 ; visible screen area, so there is no need for clipping inside this function.
 ; Must set an error code: NO
 SETPIXEL:
-       bit     $C082           ; Switch in ROM
-       ldx     X1
-       ldy     X1+1
-       lda     Y1
-       jsr     HPLOT
-       bit     $C080           ; Switch in LC bank 2 for R/O
-       rts
+        bit     $C082           ; Switch in ROM
+        ldx     X1
+        ldy     X1+1
+        lda     Y1
+        jsr     HPLOT
+        bit     $C080           ; Switch in LC bank 2 for R/O
+        rts
 
 ; GETPIXEL: Read the color value of a pixel and return it in A/X. The
 ; coordinates passed to this function are never outside the visible screen
 ; area, so there is no need for clipping inside this function.
 GETPIXEL:
-       bit     $C082           ; Switch in ROM
-       ldx     X1
-       ldy     X1+1
-       lda     Y1
-       jsr     HPOSN
-       lda     (HBASL),y
-       and     HMASK
-       asl
-       beq     :+              ; 0 (black)
-       lda     #$03            ; 3 (white)
-:      bcc     :+
-       adc     #$03            ; += 4 (black -> black2, white -> white2)
-:      ldx     #$00
-       bit     $C080           ; Switch in LC bank 2 for R/O
-       rts
+        bit     $C082           ; Switch in ROM
+        ldx     X1
+        ldy     X1+1
+        lda     Y1
+        jsr     HPOSN
+        lda     (HBASL),y
+        and     HMASK
+        asl
+        beq     :+              ; 0 (black)
+        lda     #$03            ; 3 (white)
+:       bcc     :+
+        adc     #$03            ; += 4 (black -> black2, white -> white2)
+:       ldx     #$00
+        bit     $C080           ; Switch in LC bank 2 for R/O
+        rts
 
 ; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and
 ; X2/Y2 = ptr3/ptr4 using the current drawing color.
 ; Must set an error code: NO
 LINE:
-       bit     $C082           ; Switch in ROM
-       ldx     X1
-       ldy     X1+1
-       lda     Y1
-       jsr     HPOSN
-       lda     X2
-       ldx     X2+1
-       ldy     Y2
-       jsr     HLIN
-       bit     $C080           ; Switch in LC bank 2 for R/O
-       rts
+        bit     $C082           ; Switch in ROM
+        ldx     X1
+        ldy     X1+1
+        lda     Y1
+        jsr     HPOSN
+        lda     X2
+        ldx     X2+1
+        ldy     Y2
+        jsr     HLIN
+        bit     $C080           ; Switch in LC bank 2 for R/O
+        rts
 
 ; BAR: Draw a filled rectangle with the corners X1/Y1, X2/Y2, where
 ; X1/Y1 = ptr1/ptr2 and X2/Y2 = ptr3/ptr4 using the current drawing color.
 ; Contrary to most other functions, the graphics kernel will sort and clip
 ; the coordinates before calling the driver, so on entry the following
 ; conditions are valid:
-;      X1 <= X2
-;      Y1 <= Y2
-;      (X1 >= 0) && (X1 < XRES)
-;      (X2 >= 0) && (X2 < XRES)
-;      (Y1 >= 0) && (Y1 < YRES)
-;      (Y2 >= 0) && (Y2 < YRES)
+;       X1 <= X2
+;       Y1 <= Y2
+;       (X1 >= 0) && (X1 < XRES)
+;       (X2 >= 0) && (X2 < XRES)
+;       (Y1 >= 0) && (Y1 < YRES)
+;       (Y2 >= 0) && (Y2 < YRES)
 ; Must set an error code: NO
 BAR:
-       inc     Y2
-:      lda     Y2
-       pha
-       lda     Y1
-       sta     Y2
-       jsr     LINE
-       pla
-       sta     Y2
-       inc     Y1
-       cmp     Y1
-       bne     :-
-       rts
+        inc     Y2
+:       lda     Y2
+        pha
+        lda     Y1
+        sta     Y2
+        jsr     LINE
+        pla
+        sta     Y2
+        inc     Y1
+        cmp     Y1
+        bne     :-
+        rts
 
 ; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in X and Y
 ; direction is passend in X/Y, the text direction is passed in A.
 ; Must set an error code: NO
 TEXTSTYLE:
-       cmp     #TGI_TEXT_VERTICAL
-       bne     :+
-       lda     #48
-:      sta     ROT
-       rts
+        cmp     #TGI_TEXT_VERTICAL
+        bne     :+
+        lda     #48
+:       sta     ROT
+        rts
 
 ; OUTTEXT: Output text at X/Y = ptr1/ptr2 using the current color and the
 ; current text style. The text to output is given as a zero terminated
 ; string with address in ptr3.
 ; Must set an error code: NO
 OUTTEXT:
-       bit     $C082           ; Switch in ROM
-       lda     X1
-       ldy     X1+1
-       ldx     ROT
-       php                     ; Save Z flag
-       beq     :+              ; Not horizontal
-       sec
-       sbc     #$07            ; Adjust X
-       bcs     :+
-       dey
-:      tax
-       lda     Y1
-       plp                     ; Restore Z flag
-       bne     :+              ; Not vertical
-       sec
-       sbc     #$07            ; Adjust Y
-:      jsr     HPOSN
-       clc
-       lda     FONT+2*99       ; "connection char"
-       adc     #<FONT
-       sta     ptr4
-       lda     FONT+2*99+1     ; "connection char"
-       adc     #>FONT
-       sta     ptr4+1
-       ldy     #$00
-:      lda     (ptr3),y
-       beq     :+
-       sty     tmp1            ; Save string index
-       sec
-       sbc     #$1F            ; No control chars
-       asl                     ; Offset * 2
-       tay
-       clc
-       lda     FONT,y
-       adc     #<FONT
-       tax
-       lda     FONT+1,y
-       adc     #>FONT
-       tay
-       lda     ROT
-       jsr     DRAW            ; Draw char from string
-       ldx     ptr4
-       ldy     ptr4+1
-       lda     ROT
-       jsr     DRAW            ; Draw "connection char"
-       ldy     tmp1            ; Restore string index
-       iny
-       bne     :-              ; Branch always
-:      bit     $C080           ; Switch in LC bank 2 for R/O
-       rts
+        bit     $C082           ; Switch in ROM
+        lda     X1
+        ldy     X1+1
+        ldx     ROT
+        php                     ; Save Z flag
+        beq     :+              ; Not horizontal
+        sec
+        sbc     #$07            ; Adjust X
+        bcs     :+
+        dey
+:       tax
+        lda     Y1
+        plp                     ; Restore Z flag
+        bne     :+              ; Not vertical
+        sec
+        sbc     #$07            ; Adjust Y
+:       jsr     HPOSN
+        clc
+        lda     FONT+2*99       ; "connection char"
+        adc     #<FONT
+        sta     ptr4
+        lda     FONT+2*99+1     ; "connection char"
+        adc     #>FONT
+        sta     ptr4+1
+        ldy     #$00
+:       lda     (ptr3),y
+        beq     :+
+        sty     tmp1            ; Save string index
+        sec
+        sbc     #$1F            ; No control chars
+        asl                     ; Offset * 2
+        tay
+        clc
+        lda     FONT,y
+        adc     #<FONT
+        tax
+        lda     FONT+1,y
+        adc     #>FONT
+        tay
+        lda     ROT
+        jsr     DRAW            ; Draw char from string
+        ldx     ptr4
+        ldy     ptr4+1
+        lda     ROT
+        jsr     DRAW            ; Draw "connection char"
+        ldy     tmp1            ; Restore string index
+        iny
+        bne     :-              ; Branch always
+:       bit     $C080           ; Switch in LC bank 2 for R/O
+        rts