]> git.sur5r.net Git - cc65/commitdiff
new GEOSZP segment for library use, added GEOS tgi driver, fixes in GEOS conio
authorizydorst <izydorst@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 31 Dec 2002 15:35:55 +0000 (15:35 +0000)
committerizydorst <izydorst@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 31 Dec 2002 15:35:55 +0000 (15:35 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1864 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/Makefile
libsrc/geos/conio/_scrsize.s
libsrc/geos/conio/cursor.s
libsrc/geos/devel/Makefile
libsrc/geos/devel/crt0.s
libsrc/geos/devel/geos-tgi.s [new file with mode: 0644]
libsrc/geos/devel/geoszp.s [new file with mode: 0644]
libsrc/geos/devel/tgi_mode_table.s [new file with mode: 0644]
src/ld65/cfg/geos.cfg

index 062062d8f532bcdc063352c314e42ce8d860c818..84fb45baab3784d5e54ff8390e0bbc5606f30ce6 100644 (file)
@@ -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
index ea79357d8b7a2c3bdcb69ab1dcc05ca05f7dd461..847b94803acc729dbfe1222b665b48eae9a49f78 100644 (file)
@@ -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
 
index 24f14a80de09a67637f26e73d35e2319a17c50a6..5dab5c1e390003ae405d0b207fc0f9b9c68378d7 100644 (file)
@@ -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)
index df2cd54f00c4ac1b094cbc8c11f8255b77bbf69a..ebe4e2a7a8724663fa2403954d9a47a10d83f23d 100644 (file)
@@ -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)
 
index fe8e42627267a9350bd6e061e3dd219397698f99..d43ee0fbf869300da9451e85c43197aef32d16be 100644 (file)
        .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 (file)
index 0000000..02d4599
--- /dev/null
@@ -0,0 +1,977 @@
+;
+; Graphics driver for the 320x200x2 or 640x200x2 mode on GEOS 64/128
+; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
+; 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
+        ldx     #>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
+        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
+;
+
+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<x1)
+       bcs     @cont           ; !(xres<x1)
+@finito:rts
+@cont: lda     yres
+       ldx     yres+1
+       sta     ADDR
+       stx     ADDR+1
+       ldx     #ADDR
+       lda     Y1
+       ldy     Y1+1
+       jsr     icmp            ; if (yres<y1)
+       bcc     @finito
+
+SETPIXEL:
+       lda     X1
+       ldx     X1+1
+       ldy     Y1
+       sta     r3L
+       stx     r3H
+       sty     r11L
+       sec
+       lda     BITMASK         ; set or clear C flag
+       bne     @L1
+       clc
+@L1:   lda     #0
+       jmp     DrawPoint
+
+; ------------------------------------------------------------------------
+; 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
+       ldx     X1+1
+       ldy     Y1
+       sta     r3L
+       stx     r3H
+       sty     r11L
+       jsr     TestPoint
+       ldx     #0
+       bcc     @L1
+       inx
+@L1:   txa
+       ldx     #0
+       rts
+
+; ------------------------------------------------------------------------
+; HORLINE: Draw a horizontal line from X1/Y to X2/Y, where X1 = ptr1,
+; Y = ptr2 and X2 = ptr3, using the current drawing color.
+;
+; This is a special line drawing entry used when the line is know to be
+; horizontal, for example by the BAR emulation routine. If the driver does
+; not have special code for horizontal lines, it may just copy Y to Y2 and
+; proceed with the generic line drawing code.
+;
+; Note: Line coordinates will always be sorted (Y1 <= X2) and clipped.
+;
+; Must set an error code: NO
+;
+
+HORLINE:
+       lda     X1
+       ldx     X1+1
+       ldy     Y1
+       sta     r3L
+       stx     r3H
+       sty     r11L
+       lda     X2
+       ldx     X2+1
+       sta     r4L
+       stx     r4H
+       lda     BITMASK
+       beq     @L1
+       lda     #%11111111              ; pattern
+@L1:   jmp     HorizontalLine
+
+; ------------------------------------------------------------------------
+; 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:
+       lda     X1
+       ldx     X1+1
+       ldy     Y1
+       sta     r3L
+       stx     r3H
+       sty     r11L
+       lda     X2
+       ldx     X2+1
+       ldy     Y2
+       sta     r4L
+       stx     r4H
+       sty     r11H
+       sec
+       lda     BITMASK         ; set or clear C flag
+       bne     @L1
+       clc
+@L1:   lda     #0
+       jmp     DrawLine
+
+; ------------------------------------------------------------------------
+; 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:
+       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<x) {
+@L013B:        ldx     #YY
+       lda     XX
+       ldy     XX+1
+       jsr     icmp
+       bcc     @L12
+       rts
+@L12:  ; plot points in 8 slices...
+       lda     XS
+       clc
+       adc     XX
+       sta     X1
+       lda     XS+1
+       adc     XX+1
+       sta     X1+1            ; x1 = xs+x
+       lda     YS
+       clc
+       adc     YY
+       sta     Y1
+       pha
+       lda     YS+1
+       adc     YY+1
+       sta     Y1+1            ; (stack)=ys+y, y1=(stack)
+       pha
+       jsr     SETPIXELCLIP    ; plot(xs+x,ys+y)
+       lda     YS
+       sec
+       sbc     YY
+       sta     Y1
+       sta     Y3
+       lda     YS+1
+       sbc     YY+1
+       sta     Y1+1            ; y3 = y1 = ys-y
+       sta     Y3+1
+       jsr     SETPIXELCLIP    ; plot(xs+x,ys-y)
+       pla
+       sta     Y1+1
+       pla
+       sta     Y1              ; y1 = ys+y
+       lda     XS
+       sec
+       sbc     XX
+       sta     X1
+       lda     XS+1
+       sbc     XX+1
+       sta     X1+1
+       jsr     SETPIXELCLIP    ; plot (xs-x,ys+y)
+       lda     Y3
+       sta     Y1
+       lda     Y3+1
+       sta     Y1+1
+       jsr     SETPIXELCLIP    ; plot (xs-x,ys-y)
+
+       lda     XS
+       clc
+       adc     YY
+       sta     X1
+       lda     XS+1
+       adc     YY+1
+       sta     X1+1            ; x1 = xs+y
+       lda     YS
+       clc
+       adc     XX
+       sta     Y1
+       pha
+       lda     YS+1
+       adc     XX+1
+       sta     Y1+1            ; (stack)=ys+x, y1=(stack)
+       pha
+       jsr     SETPIXELCLIP    ; plot(xs+y,ys+x)
+       lda     YS
+       sec
+       sbc     XX
+       sta     Y1
+       sta     Y3
+       lda     YS+1
+       sbc     XX+1
+       sta     Y1+1            ; y3 = y1 = ys-x
+       sta     Y3+1
+       jsr     SETPIXELCLIP    ; plot(xs+y,ys-x)
+       pla
+       sta     Y1+1
+       pla
+       sta     Y1              ; y1 = ys+x(stack)
+       lda     XS
+       sec
+       sbc     YY
+       sta     X1
+       lda     XS+1
+       sbc     YY+1
+       sta     X1+1
+       jsr     SETPIXELCLIP    ; plot (xs-y,ys+x)
+       lda     Y3
+       sta     Y1
+       lda     Y3+1
+       sta     Y1+1
+       jsr     SETPIXELCLIP    ; plot (xs-y,ys-x)
+
+       ; og = mo+y+y+1
+       lda     MaxO
+       ldx     MaxO+1
+       clc
+       adc     YY
+       tay
+       txa
+       adc     YY+1
+       tax
+       tya
+       clc
+       adc     YY
+       tay
+       txa
+       adc     YY+1
+       tax
+       tya
+       clc
+       adc     #1
+       bcc     @L0143
+       inx
+@L0143:        sta     OGora
+       stx     OGora+1
+       ; ou = og-x-x+1
+       sec
+       sbc     XX
+       tay
+       txa
+       sbc     XX+1
+       tax
+       tya
+       sec
+       sbc     XX
+       tay
+       txa
+       sbc     XX+1
+       tax
+       tya
+       clc
+       adc     #1
+       bcc     @L0146
+       inx
+@L0146:        sta     OUkos
+       stx     OUkos+1
+       ; ++y
+       inc     YY
+       bne     @L0148
+       inc     YY+1
+@L0148:        ; if (abs(ou)<abs(og))
+       lda     OUkos
+       ldy     OUkos+1
+       jsr     abs
+       sta     TEMP3
+       sty     TEMP4
+       lda     OGora
+       ldy     OGora+1
+       jsr     abs
+       ldx     #TEMP3
+       jsr     icmp
+       bpl     @L0149
+       ; { --x;
+       sec
+       lda     XX
+       sbc     #1
+       sta     XX
+       bcs     @L014E
+       dec     XX+1
+@L014E:        ; mo = ou; }
+       lda     OUkos
+       ldx     OUkos+1
+       jmp     @L014G
+       ; else { mo = og }
+@L0149:        lda     OGora
+       ldx     OGora+1
+@L014G:        sta     MaxO
+       stx     MaxO+1
+       ; }
+        jmp    @L013B
+
+; ------------------------------------------------------------------------
+; 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:
+        stx     TEXTMAGX
+        sty     TEXTMAGY
+        sta     TEXTDIR
+        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
+       ldx     X1+1
+       ldy     Y1
+       sta     r11L
+       stx     r11H
+       sty     r1H
+       lda     ptr3
+       ldx     ptr3+1
+       sta     r0L
+       stx     r0H
+       jmp     PutString
+
+;-------------
+; copies of some runtime routines
+
+abs:
+       ; a/y := abs(a/y)
+       dey
+       iny
+       bpl     @L1
+       ; negay
+       clc
+       eor     #$ff
+       adc     #1
+       pha
+       tya
+       eor     #$ff
+       adc     #0
+       tay
+       pla
+@L1:   rts
+
+icmp:
+       ; compare a/y to zp,x
+       sta     TEMP            ; TEMP/TEMP2 - arg2
+       sty     TEMP2
+       lda     $0,x
+       pha
+       lda     $1,x
+       tay
+       pla
+       tax
+       tya                     ; x/a - arg1 (a=high)
+
+       sec
+       sbc     TEMP2
+       bne     @L4
+       cpx     TEMP
+       beq     @L3
+       adc     #$ff
+       ora     #$01
+@L3:   rts
+@L4:   bvc     @L3
+       eor     #$ff
+       ora     #$01
+       rts
+
+;-------------
+; VDC helpers
+
+VDCSetSourceAddr:
+       pha
+       tya
+       ldx     #VDC_DATA_HI
+       jsr     VDCWriteReg
+       pla
+       ldx     #VDC_DATA_LO
+       bne     VDCWriteReg
+
+VDCReadByte:
+       ldx     #VDC_DATA
+VDCReadReg:
+       stx     VDC_ADDR_REG
+@L0:   bit     VDC_ADDR_REG
+       bpl     @L0
+       lda     VDC_DATA_REG
+       rts
+
+VDCWriteByte:
+       ldx     #VDC_DATA
+VDCWriteReg:
+       stx     VDC_ADDR_REG
+@L0:   bit     VDC_ADDR_REG
+       bpl     @L0
+       sta     VDC_DATA_REG
+       rts
+
diff --git a/libsrc/geos/devel/geoszp.s b/libsrc/geos/devel/geoszp.s
new file mode 100644 (file)
index 0000000..be55e3d
--- /dev/null
@@ -0,0 +1,18 @@
+;
+; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
+; 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 (file)
index 0000000..24e2bc8
--- /dev/null
@@ -0,0 +1,23 @@
+;
+; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
+; 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
index 690f73f8758996410e6d4fa34522d41b2e958732..6e161c9ec10342fe8d78c7cf35a0d351461a7cd7 100644 (file)
@@ -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,