]> git.sur5r.net Git - cc65/commitdiff
TGI driver by Stefan Haubenthal
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 3 Jun 2004 21:27:56 +0000 (21:27 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 3 Jun 2004 21:27:56 +0000 (21:27 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3080 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/atmos/.cvsignore [new file with mode: 0644]
libsrc/atmos/Makefile
libsrc/atmos/atmos-240-200-2.s [new file with mode: 0644]

diff --git a/libsrc/atmos/.cvsignore b/libsrc/atmos/.cvsignore
new file mode 100644 (file)
index 0000000..3eecd7b
--- /dev/null
@@ -0,0 +1,5 @@
+*.emd
+*.joy
+*.mou
+*.ser
+*.tgi
index 0e56c99860f6fd3e3609b5eb264f1abd4dda0ae8..d95b15df557952685d63e6b89ae790ab2d9a9538 100644 (file)
 %.o:   %.s
        @$(AS) -g -o $@ $(AFLAGS) $<
 
+%.emd: %.o ../runtime/zeropage.o
+       @$(LD) -t module -o $@ $^
+
+%.joy: %.o ../runtime/zeropage.o
+       @$(LD) -t module -o $@ $^
+
+%.mou: %.o ../runtime/zeropage.o
+       @$(LD) -t module -o $@ $^
+
+%.ser: %.o ../runtime/zeropage.o
+       @$(LD) -t module -o $@ $^
+
+%.tgi: %.o ../runtime/zeropage.o
+       @$(LD) -t module -o $@ $^
+
 #--------------------------------------------------------------------------
 # Object files
 
-C_OBJS =
-
-S_OBJS  =       _scrsize.o      \
-                cclear.o        \
-                cgetc.o         \
-                chline.o        \
-                clock.o         \
-                clrscr.o        \
-                color.o         \
-                cputc.o         \
-                crt0.o          \
-                ctype.o         \
-                cvline.o        \
-                getenv.o        \
-                gotox.o         \
-                gotoxy.o        \
-                gotoy.o         \
-                kbhit.o         \
-                mainargs.o      \
-                oserrlist.o     \
-                revers.o        \
-                systime.o       \
-                sysuname.o      \
-                wherex.o        \
-                wherey.o        \
-                write.o
+OBJS  =        _scrsize.o      \
+        cclear.o        \
+        cgetc.o         \
+        chline.o        \
+        clock.o         \
+        clrscr.o        \
+        color.o         \
+        cputc.o         \
+        crt0.o          \
+        ctype.o         \
+        cvline.o        \
+        getenv.o        \
+        gotox.o         \
+        gotoxy.o        \
+        gotoy.o         \
+        kbhit.o         \
+        mainargs.o      \
+        oserrlist.o     \
+        revers.o        \
+        systime.o       \
+        sysuname.o      \
+        wherex.o        \
+        wherey.o        \
+        write.o
+
+#--------------------------------------------------------------------------
+# Drivers
+
+EMDS =
+
+JOYS =
+
+MOUS =
+
+SERS =
+
+TGIS = atmos-240-200-2.tgi
 
 #--------------------------------------------------------------------------
 # Targets
 
 .PHONY:        all clean zap
 
-all:           $(C_OBJS) $(S_OBJS)
+all:   $(OBJS) $(EMDS) $(JOYS) $(MOUS) $(SERS) $(TGIS)
+
+../runtime/zeropage.o:
+       $(MAKE) -C $(dir $@) $(notdir $@)
 
 clean:
-       @$(RM) $(C_OBJS:.c=.s) $(C_OBJS) $(S_OBJS)
+       @$(RM) $(OBJS) $(EMDS:.emd=.o) $(JOYS:.joy=.o) $(MOUS:.mou=.o) $(SERS:.ser=.o) $(TGIS:.tgi=.o)
 
 zap:   clean
+       @$(RM) $(EMDS) $(JOYS) $(MOUS) $(SERS) $(TGIS)
+
 
diff --git a/libsrc/atmos/atmos-240-200-2.s b/libsrc/atmos/atmos-240-200-2.s
new file mode 100644 (file)
index 0000000..6d664cd
--- /dev/null
@@ -0,0 +1,418 @@
+;
+; Graphics driver for the 240x200x2 mode on the Atmos
+;
+; Stefan Haubenthal <polluks@sdf.lonestar.org>
+;
+
+       .include        "zeropage.inc"
+
+       .include        "tgi-kernel.inc"
+       .include        "tgi-mode.inc"
+       .include        "tgi-error.inc"
+       .include        "atmos.inc"
+
+       .macpack        generic
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table and constants.
+
+.segment       "JUMPTABLE"
+
+; 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   240                     ; X resolution
+       .word   200                     ; Y resolution
+       .byte   2                       ; Number of drawing colors
+       .byte   1                       ; Number of screens available
+xsize: .byte   6                       ; System font X size
+       .byte   8                       ; System font Y size
+       .res    4, $00                  ; Reserved for future extensions
+
+; Next comes the jump table. Currently all entries must be valid and may point
+; to an RTS for test versions (function not implemented).
+
+       .word   INSTALL
+       .word   UNINSTALL
+       .word   INIT
+       .word   DONE
+       .word   GETERROR
+       .word   CONTROL
+       .word   CLEAR
+       .word   SETVIEWPAGE
+       .word   SETDRAWPAGE
+       .word   SETCOLOR
+       .word   SETPALETTE
+       .word   GETPALETTE
+       .word   GETDEFPALETTE
+       .word   SETPIXEL
+       .word   GETPIXEL
+       .word   LINE
+       .word   BAR
+       .word   _CIRCLE
+       .word   TEXTSTYLE
+       .word   OUTTEXT
+
+; ------------------------------------------------------------------------
+; Data.
+
+; 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
+RADIUS         = tmp1
+
+; Absolute variables used in the code
+
+.bss
+
+ERROR:         .res    1       ; Error code
+MODE:          .res    1       ; Graphics mode
+
+; Constants and tables
+PARAM1         = $2E1
+PARAM2         = $2E3
+PARAM3         = $2E5
+TEXT           = $EC21
+HIRES          = $EC33
+CURSET         = $F0C8
+CURMOV         = $F0FD
+DRAW           = $F110
+CHAR           = $F12D
+POINT          = $F1C8
+PAPER          = $F204
+INK            = $F210
+CIRCLE         = $F37F
+
+.rodata
+
+DEFPALETTE:    .byte   $00, $07
+
+.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:
+
+; ------------------------------------------------------------------------
+; 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
+
+; ------------------------------------------------------------------------
+; INIT: Changes an already installed device from text mode to graphics
+; mode.
+; Note that INIT/DONE may be called multiple times while the driver
+; is loaded, while INSTALL is only called once, so any code that is needed
+; to initializes variables and so on must go here. Setting palette and
+; clearing the screen is not needed because this is called by the graphics
+; kernel later.
+; The graphics kernel will never call INIT when a graphics mode is already
+; active, so there is no need to protect against that.
+;
+; Must set an error code: YES
+;
+
+INIT:
+
+; Switch into graphics mode
+
+       jsr     HIRES
+
+; 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           = TEXT
+
+; ------------------------------------------------------------------------
+; GETERROR: Return the error code in A and clear it.
+
+GETERROR:
+       ldx     #TGI_ERR_OK
+       lda     ERROR
+       stx     ERROR
+       rts
+
+; ------------------------------------------------------------------------
+; CONTROL: Platform/driver specific entry point.
+;
+; Must set an error code: YES
+;
+
+CONTROL:
+       sta     $213
+       lda     #TGI_ERR_OK
+       sta     ERROR
+       rts
+
+; ------------------------------------------------------------------------
+; CLEAR: Clears the screen.
+;
+; Must set an error code: NO
+;
+
+CLEAR          = HIRES
+
+; ------------------------------------------------------------------------
+; 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:
+
+; ------------------------------------------------------------------------
+; 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:
+       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:
+       sta     MODE
+       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:
+       ldy     #0
+       lda     (ptr1),y
+       sta     PARAM1
+       jsr     PAPER
+       ldy     #1
+       lda     (ptr1),y
+       sta     PARAM1
+       jsr     INK
+       lda     #TGI_ERR_OK
+       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:
+
+; ------------------------------------------------------------------------
+; GETDEFPALETTE: Return the default palette for the driver in A/X. All
+; drivers should return something reasonable here, even drivers that don't
+; support palettes, otherwise the caller has no way to determine the colors
+; of the (not changeable) palette.
+;
+; Must set an error code: NO (all drivers must have a default palette)
+;
+
+GETDEFPALETTE:
+       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:
+       lda     MODE
+mymode:        sta     PARAM3
+       lda     X1
+       sta     PARAM1
+       lda     Y1
+       sta     PARAM2
+       lda     #0
+       sta     PARAM1+1
+       sta     PARAM2+1
+       jmp     CURSET
+
+; ------------------------------------------------------------------------
+; 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:
+       lda     X1
+       sta     PARAM1
+       lda     Y1
+       sta     PARAM2
+       lda     #0
+       sta     PARAM1+1
+       sta     PARAM2+1
+       jsr     POINT
+       lda     PARAM1
+       and     #%00000001
+       ldx     #0
+       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:
+       jsr     SETPIXEL
+       lda     X2
+       sub     X1
+       sta     PARAM1
+       lda     X2+1
+       sbc     X1+1
+       sta     PARAM1+1
+       lda     Y2
+       sub     Y1
+       sta     PARAM2
+       lda     Y2+1
+       sbc     Y1+1
+       sta     PARAM2+1
+       lda     MODE
+       sta     PARAM3
+       jmp     DRAW
+
+; ------------------------------------------------------------------------
+; 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)
+;
+; Must set an error code: NO
+;
+
+BAR:
+       inc     Y2
+@L1:   lda     Y2
+       pha
+       lda     Y1
+       sta     Y2
+       jsr     LINE
+       pla
+       sta     Y2
+       inc     Y1
+       cmp     Y1
+       bne     @L1
+       rts
+
+; ------------------------------------------------------------------------
+; CIRCLE: Draw a circle around the center X1/Y1 (= ptr1/ptr2) with the
+; radius in tmp1 and the current drawing color.
+;
+; Must set an error code: NO
+;
+
+_CIRCLE:
+       lda     #3
+       jsr     mymode
+       lda     RADIUS
+       sta     PARAM1
+       lda     MODE
+       sta     PARAM2
+       jmp     CIRCLE
+
+; ------------------------------------------------------------------------
+; 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:
+       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:
+       lda     X1
+       sta     PARAM1
+       lda     Y1
+       sta     PARAM2
+       lda     #3
+       sta     PARAM3
+       jsr     CURSET
+
+       ldy     #0
+@next: lda     (ptr3),y
+       beq     @end
+       sta     PARAM1
+       lda     #0
+       sta     PARAM2
+       lda     MODE
+       sta     PARAM3
+       tya
+       pha
+       jsr     CHAR
+       lda     xsize
+       sta     PARAM1
+       lda     #0
+       sta     PARAM2
+       lda     #3
+       sta     PARAM3
+       jsr     CURMOV
+       pla
+       tay
+       iny
+       bne     @next
+@end:  rts