From 6f14319eb6d48f44f26ec1f8379bc25e114b495d Mon Sep 17 00:00:00 2001 From: cuz Date: Thu, 3 Jun 2004 21:27:56 +0000 Subject: [PATCH] TGI driver by Stefan Haubenthal git-svn-id: svn://svn.cc65.org/cc65/trunk@3080 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/atmos/.cvsignore | 5 + libsrc/atmos/Makefile | 85 ++++--- libsrc/atmos/atmos-240-200-2.s | 418 +++++++++++++++++++++++++++++++++ 3 files changed, 481 insertions(+), 27 deletions(-) create mode 100644 libsrc/atmos/.cvsignore create mode 100644 libsrc/atmos/atmos-240-200-2.s diff --git a/libsrc/atmos/.cvsignore b/libsrc/atmos/.cvsignore new file mode 100644 index 000000000..3eecd7b49 --- /dev/null +++ b/libsrc/atmos/.cvsignore @@ -0,0 +1,5 @@ +*.emd +*.joy +*.mou +*.ser +*.tgi diff --git a/libsrc/atmos/Makefile b/libsrc/atmos/Makefile index 0e56c9986..d95b15df5 100644 --- a/libsrc/atmos/Makefile +++ b/libsrc/atmos/Makefile @@ -14,45 +14,76 @@ %.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 = +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 -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 +#-------------------------------------------------------------------------- +# 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 index 000000000..6d664cdf5 --- /dev/null +++ b/libsrc/atmos/atmos-240-200-2.s @@ -0,0 +1,418 @@ +; +; Graphics driver for the 240x200x2 mode on the Atmos +; +; Stefan Haubenthal +; + + .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 + 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