From 0264d31e7c07629f27e7289dfe513934fe0bd9db Mon Sep 17 00:00:00 2001 From: izydorst Date: Tue, 31 Dec 2002 15:35:55 +0000 Subject: [PATCH] new GEOSZP segment for library use, added GEOS tgi driver, fixes in GEOS conio git-svn-id: svn://svn.cc65.org/cc65/trunk@1864 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/Makefile | 1 + libsrc/geos/conio/_scrsize.s | 9 +- libsrc/geos/conio/cursor.s | 12 +- libsrc/geos/devel/Makefile | 4 +- libsrc/geos/devel/crt0.s | 5 + libsrc/geos/devel/geos-tgi.s | 977 +++++++++++++++++++++++++++++ libsrc/geos/devel/geoszp.s | 18 + libsrc/geos/devel/tgi_mode_table.s | 23 + src/ld65/cfg/geos.cfg | 1 + 9 files changed, 1036 insertions(+), 14 deletions(-) create mode 100644 libsrc/geos/devel/geos-tgi.s create mode 100644 libsrc/geos/devel/geoszp.s create mode 100644 libsrc/geos/devel/tgi_mode_table.s diff --git a/libsrc/Makefile b/libsrc/Makefile index 062062d8f..84fb45baa 100644 --- a/libsrc/Makefile +++ b/libsrc/Makefile @@ -208,6 +208,7 @@ geoslib: done cp geos/devel/*.emd . cp geos/devel/*.joy . + cp geos/devel/geos-tgi.tgi geos-tgi.tgi #----------------------------------------------------------------------------- # CBM PET machines diff --git a/libsrc/geos/conio/_scrsize.s b/libsrc/geos/conio/_scrsize.s index ea79357d8..847b94803 100644 --- a/libsrc/geos/conio/_scrsize.s +++ b/libsrc/geos/conio/_scrsize.s @@ -10,6 +10,8 @@ .include "../inc/geossym.inc" .export xsize, ysize + .importzp cursor_r, cursor_c + .import _cursor .constructor initscrsize .code @@ -23,7 +25,12 @@ L1: lda #40 ; 40 columns (more or less) sta xsize lda #24 ; something like that for Y size sta ysize - rts + ldx #1 + stx cursor_r + dex + stx cursor_c + txa + jmp _cursor ; home and update cursor .bss diff --git a/libsrc/geos/conio/cursor.s b/libsrc/geos/conio/cursor.s index 24f14a80d..5dab5c1e3 100644 --- a/libsrc/geos/conio/cursor.s +++ b/libsrc/geos/conio/cursor.s @@ -6,10 +6,9 @@ ; unsigned char cursor (unsigned char onoff); - .exportzp cursor_x, cursor_y, cursor_flag - .exportzp cursor_c, cursor_r .export _cursor .import update_cursor + .importzp cursor_flag .include "../inc/jumptab.inc" .include "../inc/geossym.inc" @@ -27,12 +26,3 @@ _cursor: jsr update_cursor ; place it on screen L1: pla rts - -.zeropage - -cursor_x: .res 2 ; Cursor column (word) -cursor_y: .res 1 ; Cursor row -cursor_flag: .res 1 ; Cursor on/off (0-off) - -cursor_c: .res 1 ; Cursor column (0-39/79) -cursor_r: .res 1 ; Cursor row (0-24) diff --git a/libsrc/geos/devel/Makefile b/libsrc/geos/devel/Makefile index df2cd54f0..ebe4e2a7a 100644 --- a/libsrc/geos/devel/Makefile +++ b/libsrc/geos/devel/Makefile @@ -16,7 +16,7 @@ %.tgi: %.o ../../runtime/zeropage.o @$(LD) -t module -o $@ $^ -S_OBJS = crt0.o oserror.o oserrlist.o randomize.o fio_module.o +S_OBJS = crt0.o geoszp.o oserror.o oserrlist.o randomize.o fio_module.o tgi_mode_table.o #-------------------------------------------------------------------------- # Drivers @@ -25,7 +25,7 @@ EMDS = geos-vdc.emd JOYS = geos-stdjoy.joy -TGIS = +TGIS = geos-tgi.tgi all: $(S_OBJS) $(EMDS) $(JOYS) $(TGIS) diff --git a/libsrc/geos/devel/crt0.s b/libsrc/geos/devel/crt0.s index fe8e42627..d43ee0fbf 100644 --- a/libsrc/geos/devel/crt0.s +++ b/libsrc/geos/devel/crt0.s @@ -14,6 +14,11 @@ .importzp sp .export _exit +; ------------------------------------------------------------------------ +; Create an empty GEOSZP segment to avoid linker warnings + +.segment "GEOSZP", zeropage + ; ------------------------------------------------------------------------ ; Create an empty LOWCODE segment to avoid linker warnings diff --git a/libsrc/geos/devel/geos-tgi.s b/libsrc/geos/devel/geos-tgi.s new file mode 100644 index 000000000..02d459942 --- /dev/null +++ b/libsrc/geos/devel/geos-tgi.s @@ -0,0 +1,977 @@ +; +; Graphics driver for the 320x200x2 or 640x200x2 mode on GEOS 64/128 +; Maciej 'YTM/Elysium' Witkowiak +; 28-31.12.2002 +; +; - not tested OutText +; - not tested on VDC +; - erratic Circle when needs to clip + + .include "zeropage.inc" + + .include "tgi-kernel.inc" + .include "tgi-mode.inc" + .include "tgi-error.inc" + + .include "../inc/const.inc" + .include "../inc/jumptab.inc" + .include "../inc/geossym.inc" + .include "../inc/geossym2.inc" + + .macpack generic + +; ------------------------------------------------------------------------ +; Constants + +VDC_ADDR_REG = $D600 ; VDC address +VDC_DATA_REG = $D601 ; VDC data + +VDC_DSP_HI = 12 ; registers used +VDC_DSP_LO = 13 +VDC_DATA_HI = 18 +VDC_DATA_LO = 19 +VDC_VSCROLL = 24 +VDC_HSCROLL = 25 +VDC_COLORS = 26 +VDC_CSET = 28 +VDC_COUNT = 30 +VDC_DATA = 31 + +; ------------------------------------------------------------------------ +; 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 $00 ; TGI version number +xres: .word 320 ; X resolution +yres: .word 200 ; Y resolution + .byte 2 ; Number of drawing colors +pages: .byte 1 ; Number of screens available + .byte 8 ; 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). A future version may +; allow for emulation: In this case the vector will be zero. Emulation means +; that the graphics kernel will emulate the function by using lower level +; primitives - for example ploting a line by using calls to SETPIXEL. + + .word INSTALL + .word DEINSTALL + .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 HORLINE + .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 + +ADDR = tmp1 +TEMP = tmp3 +TEMP2 = tmp4 +TEMP3 = sreg +TEMP4 = sreg+1 + +; Circle stuff +XX = ptr3 ; (2) CIRCLE +YY = ptr4 ; (2) CIRCLE +MaxO = sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway) +XS = regsave ; (2) CIRCLE +YS = regsave+2 ; (2) CIRCLE + +; Absolute variables used in the code + +.bss + +SCRBASE: .res 1 ; High byte of screen base (64k VDC only) + +ERROR: .res 1 ; Error code +PALETTE: .res 2 ; The current palette + +BITMASK: .res 1 ; $00 = clear, $01 = set pixels + +OLDCOLOR: .res 1 ; colors before entering gfx mode + +; Line routine stuff (combined with CIRCLE to save space) + +OGora: .res 2 +OUkos: .res 2 +Y3: .res 2 + +; Text output stuff +TEXTMAGX: .res 1 +TEXTMAGY: .res 1 +TEXTDIR: .res 1 + +; Constants and tables + +.rodata + +DEFPALETTE: .byte $00, $0f ; White on black +PALETTESIZE = * - DEFPALETTE + +; color translation table (indexed by VIC color) +COLTRANS: .byte $00, $0f, $08, $06, $0a, $04, $02, $0c + .byte $0d, $0b, $09, $01, $0e, $05, $03, $07 + ; colors BROWN and GRAY3 are wrong + +.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: + lda version ; if GEOS 1.0... + and #$f0 + cmp #$10 + beq @L40 + lda c128Flag ; at least GEOS 2.0, but we're on C128? + bpl @L40 + lda graphMode ; GEOS 2.0, C128, but is 80 column screen enabled? + bmi @L80 +@L40: rts ; leave default values for 40 column screen + + ; check for VDC version and update register $19 value + +@L80: + lda #<640 + ldx #>640 + sta xres + stx xres+1 + + ; update number of available screens + + ldx #VDC_CSET ; determine size of RAM... + jsr VDCReadReg + sta tmp1 + ora #%00010000 + jsr VDCWriteReg ; turn on 64k + + jsr settestadr1 ; save original value of test byte + jsr VDCReadByte + sta tmp2 + + lda #$55 ; write $55 here + ldy #ptr1 + jsr test64k ; read it here and there + lda #$aa ; write $aa here + ldy #ptr2 + jsr test64k ; read it here and there + + jsr settestadr1 + lda tmp2 + jsr VDCWriteByte ; restore original value of test byte + + lda ptr1 ; do bytes match? + cmp ptr1+1 + bne @have64k + lda ptr2 + cmp ptr2+1 + bne @have64k + + ldx #VDC_CSET + lda tmp1 + jsr VDCWriteReg ; restore 16/64k flag + jmp @endok ; and leave default values for 16k + +@have64k: + lda #4 + sta pages +@endok: + lda #0 + sta SCRBASE ; draw page 0 as default + rts + +test64k: + sta tmp1 + sty ptr3 + lda #0 + sta ptr3+1 + jsr settestadr1 + lda tmp1 + jsr VDCWriteByte ; write $55 + jsr settestadr1 + jsr VDCReadByte ; read here + pha + jsr settestadr2 + jsr VDCReadByte ; and there + ldy #1 + sta (ptr3),y + pla + dey + sta (ptr3),y + rts + +settestadr1: + ldy #$02 ; test page 2 (here) + .byte $2c +settestadr2: + ldy #$42 ; or page 64+2 (there) + lda #0 + jmp VDCSetSourceAddr + +; ------------------------------------------------------------------------ +; DEINSTALL 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 +; + +DEINSTALL: + rts + + +; ------------------------------------------------------------------------ +; INIT: Changes an already installed device from text mode to graphics +; mode. The number of the graphics mode is passed to the function in A. +; 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: + ; ignore passed parameter + ldx #$01 + stx BITMASK ; solid black as pattern + lda #1 + jsr SetPattern + lda #ST_WR_FORE ; write only on foreground + sta dispBufferOn + + lda graphMode + bmi @L80 + +; Remember current color value (40 columns) + lda screencolors + sta OLDCOLOR + jmp @L99 + +; Remember current color value (80 columns) +@L80: lda scr80colors + sta OLDCOLOR +@L99: lda #0 + jsr SETVIEWPAGE ; switch into viewpage 0 + +; 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: YES +; + +DONE: + lda #0 + jsr SETVIEWPAGE ; switch into viewpage 0 + + lda graphMode + bmi @L80 + + lda OLDCOLOR + sta screencolors ; restore color for 40 columns + ldx #0 +@L1: sta COLOR_MATRIX,x + sta COLOR_MATRIX+$0100,x + sta COLOR_MATRIX+$0200,x + sta COLOR_MATRIX+1000-256,x + inx + bne @L1 + rts + +@L80: lda OLDCOLOR ; restore color for 80 columns + ldx #VDC_COLORS + jmp VDCWriteReg + +; ------------------------------------------------------------------------ +; 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: + lda #TGI_ERR_INV_FUNC + sta ERROR + rts + +; ------------------------------------------------------------------------ +; CLEAR: Clears the screen. +; +; Must set an error code: NO +; + +CLEAR: + lda curPattern + pha + lda #0 + jsr SetPattern + ldx #0 + stx r3L + stx r3H + stx r2L + lda #199 + sta r2H + lda graphMode + bpl @L40 + lda #>639 ; 80 columns + ldx #<639 + bne @L99 +@L40: lda #>319 ; 40 columns + ldx #<319 +@L99: sta r4H + stx r4L + jsr Rectangle + pla + sta curPattern + 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: + ldx graphMode + bmi @L80 + rts +@L80: clc + ror + ror + ror + ldx #VDC_DSP_HI + jmp VDCWriteReg + +; ------------------------------------------------------------------------ +; 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: + ldx graphMode + bmi @L80 + rts +@L80: clc + ror + ror + ror + sta SCRBASE + 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: + tax + beq @L1 + inx +@L1: stx BITMASK + txa ; need to have either 0 or 1 + jmp SetPattern + +; ------------------------------------------------------------------------ +; 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 #PALETTESIZE - 1 +@L1: lda (ptr1),y ; Copy the palette + and #$0F ; Make a valid color + sta PALETTE,y + dey + bpl @L1 + +; Put colors from palette into screen + + lda graphMode + bmi @L80 + + lda PALETTE+1 ; foreground + asl a + asl a + asl a + asl a + ora PALETTE ; background + ldx #0 +@L2: sta COLOR_MATRIX,x + sta COLOR_MATRIX+$0100,x + sta COLOR_MATRIX+$0200,x + sta COLOR_MATRIX+1000-256,x + inx + bne @L2 + rts + +@L80: ldy PALETTE+1 ; Foreground color + lda COLTRANS,y + asl a + asl a + asl a + asl a + ldy PALETTE ; Background color + ora COLTRANS,y + + ldx #VDC_COLORS + jmp VDCWriteReg + +; ------------------------------------------------------------------------ +; GETPALETTE: Return the current palette in A/X. Must return NULL and set an +; error if palettes are not supported. +; +; Must set an error code: YES +; + +GETPALETTE: + lda #PALETTE + rts + +; ------------------------------------------------------------------------ +; GETDEFPALETTE: Return the default palette for the driver in A/X. Must +; return NULL and set an error of palettes are not supported. +; +; Must set an error code: YES +; + +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 +; + +SETPIXELCLIP: + lda Y1+1 + bmi @finito ; y<0 + lda X1+1 + bmi @finito ; x<0 + lda xres + ldx xres+1 + sta ADDR + stx ADDR+1 + ldx #ADDR + lda X1 + ldy X1+1 + jsr icmp ; if (xres= 0) && (X1 < XRES) +; (X2 >= 0) && (X2 < XRES) +; (Y1 >= 0) && (Y1 < YRES) +; (Y2 >= 0) && (Y2 < YRES) +; +; Must set an error code: NO +; + +BAR: + lda X1 + ldx X1+1 + ldy Y1 + sta r3L + stx r3H + sty r2L + lda X2 + ldx X2+1 + ldy Y2 + sta r4L + stx r4H + sty r2H + jmp Rectangle + +; ------------------------------------------------------------------------ +; 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 RADIUS + bne @L1 + jmp SETPIXELCLIP ; Plot as a point + +@L1: sta XX + ; x = r; + lda #0 + sta XX+1 + sta YY + sta YY+1 + sta MaxO + sta MaxO+1 + ; y =0; mo=0; + lda X1 + ldx X1+1 + sta XS + stx XS+1 + lda Y1 + ldx Y1+1 + sta YS + stx YS+1 ; XS/YS to remember the center + + ; while (y +; 31.12.2002 +; +; zeropage locations for exclusive use by the library +; + + .exportzp cursor_x, cursor_y, cursor_flag + .exportzp cursor_c, cursor_r + +.segment "GEOSZP", zeropage + +cursor_x: .res 2 ; Cursor column (word) +cursor_y: .res 1 ; Cursor row +cursor_flag: .res 1 ; Cursor on/off (0-off) + +cursor_c: .res 1 ; Cursor column (0-39/79) +cursor_r: .res 1 ; Cursor row (0-24) diff --git a/libsrc/geos/devel/tgi_mode_table.s b/libsrc/geos/devel/tgi_mode_table.s new file mode 100644 index 000000000..24e2bc88c --- /dev/null +++ b/libsrc/geos/devel/tgi_mode_table.s @@ -0,0 +1,23 @@ +; +; Maciej 'YTM/Elysium' Witkowiak +; 28.12.2002 +; +; GEOS mode table for tgi_map_mode +; + + .export _tgi_mode_table + + .include "tgi-mode.inc" + +;---------------------------------------------------------------------------- +; Mode table. Contains entries of mode and driver name, the driver name being +; null terminated. A mode with code zero terminates the list. +; BEWARE: The current implementation of tgi_map_mode does not work with tables +; larger that 255 bytes! + +.rodata + +_tgi_mode_table: + .byte TGI_MODE_320_200_2, "GEOS-TGI.TGI", 0 + .byte TGI_MODE_640_200_2, "GEOS-TGI.TGI", 0 + .byte 0 ; End marker diff --git a/src/ld65/cfg/geos.cfg b/src/ld65/cfg/geos.cfg index 690f73f87..6e161c9ec 100644 --- a/src/ld65/cfg/geos.cfg +++ b/src/ld65/cfg/geos.cfg @@ -12,6 +12,7 @@ SEGMENTS { DATA: load = RAM, type = rw; BSS: load = RAM, type = bss, define = yes; ZEROPAGE: load = ZP, type = zp; + GEOSZP: load = ZP, type = zp; } FEATURES { CONDES: segment = RODATA, -- 2.39.5