]> git.sur5r.net Git - cc65/commitdiff
Merge pull request #504 from jedeoric/master
authorOliver Schmidt <ol.sc@web.de>
Sun, 22 Oct 2017 11:14:55 +0000 (11:14 +0000)
committerGitHub <noreply@github.com>
Sun, 22 Oct 2017 11:14:55 +0000 (11:14 +0000)
[Telestrat] TGI initialization,  some bugs (clrscr) correction, cgetc optimization, irq management

asminc/telestrat.inc
include/telestrat.h
libsrc/telestrat/cgetc.s
libsrc/telestrat/clrscr.s
libsrc/telestrat/irq.s [new file with mode: 0644]
libsrc/telestrat/libref.s [new file with mode: 0644]
libsrc/telestrat/tgi/telestrat-228-200-3.s [new file with mode: 0644]
libsrc/telestrat/tgi/telestrat-240-200-2.s [new file with mode: 0644]
libsrc/telestrat/tgi_colors.s [new file with mode: 0644]
libsrc/telestrat/tgi_stat_stddrv.s [new file with mode: 0644]

index 8e6a66bbdc613238af0402f4f3464df2e2ce23e0..424047725f2524aa69caec15106ab2886d4fb443 100644 (file)
@@ -1,7 +1,7 @@
 ;
 ; Oric Telemon definition
-; Telemon 2.4 & Telemon 3.0
-; For telemon 3.0 check http://orix.oric.org
+; Telemon 2.4 & Telemon 3.x
+; For telemon 3.x check http://orix.oric.org
 ;
 
 
@@ -15,6 +15,15 @@ FUNCTKEY        = $A5
 
 FNAME_LEN       = 11            ; maximum length of file-name
 
+; ---------------------------------------------------------------------------
+; I/O Identifier
+; this identifers are used for channel management
+; 
+
+XKBD            = $80           ; Keyboard
+XRSE            = $83           ; RS232 in
+XSCR            = $88           ; Screen
+XRSS            = $90           ; RS232 out
 
 
 ; ---------------------------------------------------------------------------
@@ -34,10 +43,7 @@ TR5             := $11
 TR6             := $12
 TR7             := $13
 
-
-
-
-PTR_READ_DEST   := $2C           ; used for XFREAD and XWRITE only in telemon 3.0
+PTR_READ_DEST   := $2C           ; used for XFREAD and XWRITE only in telemon 3.x
 
 HRSX            := $46
 HRSY            := $47
@@ -48,11 +54,43 @@ HRS3            := $51
 HRS4            := $53
 HRS5            := $55
 
-
+HRSFB           := $57
+
+; RS232T
+; b0-b3 : speed 
+;         1111 => 19200 bps  (please note that telestrat can't handle this speed without stopping all IRQ except ACIA's one)
+;         1100 =>  9600 bps  (default from telemon)
+;         1110 =>  4800 bps 
+;         1010 =>  2400 bps 
+;         1000 =>  1200 bps 
+;         0111 =>   600 bps 
+;         0110 =>   300 bps 
+;         0101 =>   150 bps 
+;         0010 =>    75 bps 
+
+; b4    : 0 external clock, 1 internal clock
+; b6-b5 : 00 8 bits
+;         01 7 bits
+;         10 6 bits
+;         11 5 bits
+; b7    : 0  a stop  
+
+RS232T          := $59
+
+; RS232C 
+; b0-b3 : 0
+; b4    : 1 if echo
+; b5    : 1 if parity
+; b7-b6 : 00 in/out parity odd
+;       : 01 on/out parity even
+;       : 10 parity sent, answer not tested
+;       : 11 SPACE SENT, reception not tested
+
+RS232C          := $5A
 
 ; ---------------------------------------------------------------------------
 ; Low memory
-
+IRQVec          := $02FB        ; "fast" interrupt vector
 
 
 
@@ -78,7 +116,7 @@ PRA2    .byte                   ; Port Register A without handshaking
 .endstruct
 
 
-.struct VIA2                     ; Versatile Interface Adapter
+.struct VIA2                    ; Versatile Interface Adapter
         .res    $0320
 PRB     .byte                   ; Port Register B
 PRA     .byte                   ; Port Register A
@@ -110,7 +148,7 @@ SCREEN          := $BB80
 ; ---------------------------------------------------------------------------
 ; ROM entries
 
-; primitives telemon 2.4 
+; telemon primitives (2.4 & 3.x)
 XRD0             = $08
 XRDW0            = $0C
 XWR0             = $10 
@@ -119,13 +157,13 @@ XTEXT            = $19
 XHIRES           = $1A
 XFILLM           = $1C
 XMINMA           = $1F
-XVARS            = $24          ; only in TELEMON 3.0, in telemon 2.4, it's XNOMFI ($24)
-XFREAD           = $27          ; only in TELEMON 3.0
-XOPEN            = $30          ; only in TELEMON 3.0
+XVARS            = $24          ; only in TELEMON 3.x, in telemon 2.4, it's XNOMFI ($24)
+XFREAD           = $27          ; only in TELEMON 3.x
+XOPEN            = $30          ; only in TELEMON 3.x
 XCOSCR           = $34          ; switch off cursor
 XCSSCR           = $35          ; switch on cursor
-XCLOSE           = $3A          ; only in TELEMON 3.0 Close file
-XFWRITE          = $3B          ; only in TELEMON 3.0 write file
+XCLOSE           = $3A          ; only in TELEMON 3.x Close file
+XFWRITE          = $3B          ; only in TELEMON 3.x write file
 XSONPS           = $40
 XOUPS            = $42
 XPLAY            = $43
@@ -133,10 +171,20 @@ XSOUND           = $44
 XMUSIC           = $45 
 XZAP             = $46
 XSHOOT           = $47
+XSOUT            = $67          ; Send A register to RS232, available in telemon 2.4 & 3.x
+XHRSSE           = $8C          ; Put in X and Y
+XDRAWA           = $8D          ; Draw a line 
+XDRAWR           = $8E          ; Draw a line 
 XCIRCL           = $8F
 XCURSE           = $90
+XCURMO           = $91
 XPAPER           = $92
 XINK             = $93
+XBOX             = $94
+XABOX            = $95
+XFILL            = $96
+XCHAR            = $97
+XSCHAR           = $98          ; Draw a string
 XEXPLO           = $9C 
 XPING            = $9D
 
@@ -151,6 +199,7 @@ SCRX             := $220
 SCRY             := $224
 ADSCRL           := $218
 ADSCRH           := $21C
+HRSPAT           := $2AA        ; Hires pattern : it's used to draw pattern for a line or a circle
 IRQVECTOR        := $2FA
 
 
index 5a090647b69250d49d83408708d9b4f2f148b8dd..1865f19a04937d9a8afc0e6c44f3851fa63d1861 100644 (file)
 
 
 
+
+/* Color defines */
+#define COLOR_BLACK     0x00
+#define COLOR_RED       0x01
+#define COLOR_GREEN     0x02
+#define COLOR_YELLOW    0x03
+#define COLOR_BLUE      0x04
+#define COLOR_MAGENTA   0x05
+#define COLOR_CYAN      0x06
+#define COLOR_WHITE     0x07
+
+/* TGI color defines */
+/* White and red are swapped, so that the pallete
+** driver is compatible with black-and-white drivers.
+*/
+#define TGI_COLOR_BLACK         COLOR_BLACK
+#define TGI_COLOR_WHITE         1
+#define TGI_COLOR_GREEN         COLOR_GREEN
+#define TGI_COLOR_YELLOW        COLOR_YELLOW
+#define TGI_COLOR_BLUE          COLOR_BLUE
+#define TGI_COLOR_MAGENTA       COLOR_MAGENTA
+#define TGI_COLOR_CYAN          COLOR_CYAN
+#define TGI_COLOR_RED           7
+
+
+extern void telestrat_228_200_3_tgi[];
+extern void telestrat_240_200_2_tgi[];      /* Referred to by tgi_static_stddrv[] */
+
+/* Define hardware */
+#include <_6522.h>
+#define VIA     (*(struct __6522*)0x300)
+
+
+
+/* These are defined to be FUNCT + NumberKey */
+#define CH_F1           0xB1
+#define CH_F2           0xB2
+#define CH_F3           0xB3
+#define CH_F4           0xB4
+#define CH_F5           0xB5
+#define CH_F6           0xB6
+#define CH_F7           0xB7
+#define CH_F8           0xB8
+#define CH_F9           0xB9
+#define CH_F10          0xB0
+
+
+
+/* Character codes */
+#define CH_ULCORNER     '+'
+#define CH_URCORNER     '+'
+#define CH_LLCORNER     '+'
+#define CH_LRCORNER     '+'
+#define CH_TTEE         '+'
+#define CH_BTEE         '+'
+#define CH_LTEE         '+'
+#define CH_RTEE         '+'
+#define CH_CROSS        '+'
+#define CH_CURS_UP       11
+#define CH_CURS_DOWN     10
+#define CH_CURS_LEFT      8
+#define CH_CURS_RIGHT     9
+#define CH_DEL          127
+#define CH_ENTER         13
+#define CH_STOP           3
+#define CH_LIRA          95
+#define CH_ESC           27
+
+
+
 void oups();
 void ping();
 void zap();
index 2b0fc7758ef9a834b4d2136c442f0c7e3f2e0714..6a6b23318ab436eb3a2238ff271d716c31d43b6c 100644 (file)
@@ -10,7 +10,7 @@
 .proc _cgetc
         ; this routine could be quicker if we wrote in page 2 variables, 
         ; but it's better to use telemon routine in that case, because telemon can manage 4 I/O
-        lda     cursor       ; if cursor equal to 0, then switch off cursor
+        ldx     cursor       ; if cursor equal to 0, then switch off cursor
         beq     switchoff_cursor
        
         ldx     #$00         ; x is the first screen
@@ -18,7 +18,7 @@
         jmp     loop         ; could be replaced by a bne/beq but 'jmp' is cleaner than a bne/beq which could expect some matters
         
 switchoff_cursor:        
-        ldx     #$00         ; x is the first screen
+        ; at this step X is equal to $00, X must be set, because it's the id of the screen (telestrat can handle 4 virtuals screen)
         BRK_TELEMON(XCOSCR)  ; switch off cursor        
         
 loop:   
index f2b8fafc16e8f41a3a2b1bb191395ec1e17adc20..31c8ee205a790abc7226e0e5cd5b2e3baf7fa712 100644 (file)
@@ -9,6 +9,9 @@
     .include   "telestrat.inc"
 
 .proc _clrscr
+    ; Switch to text mode
+    BRK_TELEMON(XTEXT) 
+
     lda     #<SCREEN
     ldy     #>SCREEN
     sta     RES
diff --git a/libsrc/telestrat/irq.s b/libsrc/telestrat/irq.s
new file mode 100644 (file)
index 0000000..9027f26
--- /dev/null
@@ -0,0 +1,59 @@
+;
+; IRQ handling (Oric version)
+;
+
+        .export         initirq, doneirq
+        .import         callirq
+
+        .include        "telestrat.inc"
+
+; ------------------------------------------------------------------------
+
+.segment        "ONCE"
+
+initirq:
+        lda     IRQVec
+        ldx     IRQVec+1
+        sta     IRQInd+1
+        stx     IRQInd+2
+        lda     #<IRQStub
+        ldx     #>IRQStub
+        jmp     setvec
+
+; ------------------------------------------------------------------------
+
+.code
+
+doneirq:
+        lda     IRQInd+1
+        ldx     IRQInd+2
+setvec: sei
+        sta     IRQVec
+        stx     IRQVec+1
+        cli
+        rts
+
+; ------------------------------------------------------------------------
+
+.segment        "LOWCODE"
+
+IRQStub:
+        cld                             ; Just to be sure
+        pha
+        txa
+        pha
+        tya
+        pha
+        jsr     callirq                 ; Call the functions
+        pla
+        tay
+        pla
+        tax
+        pla
+        jmp     IRQInd                  ; Jump to the saved IRQ vector
+
+; ------------------------------------------------------------------------
+
+.data
+
+IRQInd: jmp     $0000
diff --git a/libsrc/telestrat/libref.s b/libsrc/telestrat/libref.s
new file mode 100644 (file)
index 0000000..bdd0a67
--- /dev/null
@@ -0,0 +1,8 @@
+;
+; Jede (jede@oric.org), 2017-10-16
+;
+
+        .export         tgi_libref
+        .import         _exit
+
+tgi_libref      := _exit
diff --git a/libsrc/telestrat/tgi/telestrat-228-200-3.s b/libsrc/telestrat/tgi/telestrat-228-200-3.s
new file mode 100644 (file)
index 0000000..e20c2c8
--- /dev/null
@@ -0,0 +1,336 @@
+;
+; Graphics driver for the 228x200x3 palette mode on the Telestrat
+;
+; Jede (jede@oric.org), 2017-10-15
+
+        .include        "zeropage.inc"
+
+        .include        "tgi-kernel.inc"
+        .include        "tgi-error.inc"
+        .include        "telestrat.inc"
+
+        .macpack        generic
+        .macpack        module
+
+XSIZE   =       6               ; System font width
+YSIZE   =       8               ; System font height
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table and constants.
+
+        module_header   _telestrat_228_200_3_tgi
+
+; The first part of the header is a structure that has a signature,
+; and defines the capabilities of the driver.
+
+        .byte   "tgi"
+        .byte   TGI_API_VERSION ; TGI API version number
+        .addr   $0000           ; Library reference
+        .word   228             ; x resolution
+        .word   200             ; y resolution
+        .byte   3               ; Number of drawing colors
+        .byte   1               ; Number of screens available
+        .byte   XSIZE           ; System font x size
+        .byte   YSIZE           ; System font y size
+        .word   $011C           ; Aspect ratio (based on 4/3 display)
+        .byte   0               ; TGI driver flags
+
+; Next comes the jump table. Currently, 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   CIRCLE
+        .addr   TEXTSTYLE
+        .addr   OUTTEXT
+        .addr   0               ; IRQ entry is unused
+
+; ------------------------------------------------------------------------
+; Data.
+
+; Variables mapped to the zero-page segment variables. These are
+; used for passing parameters to the driver.
+
+X1      :=      ptr1
+Y1      :=      ptr2
+X2      :=      ptr3
+Y2      :=      ptr4
+
+; Absolute variables used in the code
+
+.bss
+
+ERROR:          .res    1       ; Error code
+MODE:           .res    1       ; Graphics mode
+PALETTE:        .res    2
+
+; Constant table
+
+.rodata
+
+; Default colors: black background, white foreground
+; (The third "color" actually flips a pixel
+; between the foreground and background colors.)
+;
+DEFPALETTE:     .byte   0, 1
+
+.code
+
+; ------------------------------------------------------------------------
+; 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 called only once. So, any code that is needed
+; to initialize variables and so on must go here. Setting palette and
+; clearing the screen are not needed because they are called by the graphics
+; kernel later.
+; The graphics kernel never will 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.
+        BRK_TELEMON(XHIRES)
+       
+; Done, reset the error code.
+
+        lda     #TGI_ERR_OK
+        sta     ERROR
+        rts
+
+; ------------------------------------------------------------------------
+; GETERROR: Return the error code in A, and clear it.
+
+GETERROR:
+        ldx     #TGI_ERR_OK
+        lda     ERROR
+        stx     ERROR
+        rts
+; ------------------------------------------------------------------------
+; 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 probably is empty most of the time.
+;
+; Must set an error code: NO
+;
+
+UNINSTALL:
+        rts
+
+; ------------------------------------------------------------------------
+; DONE: Will be called to switch the graphics device back into text mode.
+; The graphics kernel never will call DONE when no graphics mode is active,
+; so there is no need to protect against that.
+;
+; Must set an error code: NO
+;
+
+DONE:
+        BRK_TELEMON(XTEXT)
+        rts
+; ------------------------------------------------------------------------
+; CONTROL: Platform-/driver-specific entry point.
+;
+; Must set an error code: YES
+;
+
+CONTROL:
+        ; not done yet
+        rts
+
+; ------------------------------------------------------------------------
+; CLEAR: Clears the screen.
+;
+; Must set an error code: NO
+;
+
+CLEAR:
+        ; not done yet
+        rts
+
+; ------------------------------------------------------------------------
+; SETVIEWPAGE: Set the visible page. Called with the new page in A (0..n).
+; The page number already is checked to be valid, by the graphics kernel.
+;
+; Must set an error code: NO (will be called only if page OK)
+;
+
+SETVIEWPAGE:
+
+; ------------------------------------------------------------------------
+; SETDRAWPAGE: Set the drawable page. Called with the new page in A (0..n).
+; The page number already is checked to be valid, by the graphics kernel.
+;
+; Must set an error code: NO (will be called only if page OK)
+;
+
+SETDRAWPAGE:
+        rts
+
+; ------------------------------------------------------------------------
+; SETCOLOR: Set the drawing color (in A). The new color already is checked
+; to be in a valid range (0..maxcolor-1).
+;
+; Must set an error code: NO (will be called only if color OK)
+;
+
+SETCOLOR:
+        ; not done yet
+        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:
+        ; not done yet
+        rts
+
+flipcolor:
+        ; not done yet
+        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:
+        ; not done yet
+        rts
+
+; ------------------------------------------------------------------------
+; 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 co-ordinates 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 X1
+        sta HRS1
+        lda Y1
+        sta HRS2
+        
+        lda #$80
+        sta HRSFB
+        
+        BRK_TELEMON(XCURSE)
+        
+        rts
+
+; ------------------------------------------------------------------------
+; GETPIXEL: Read the color value of a pixel, and return it in A/X. The
+; co-ordinates passed to this function are never outside the visible screen
+; area, so there is no need for clipping inside this function.
+
+GETPIXEL:
+        ; not done yet
+        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:
+        ; not done yet
+        rts
+
+CIRCLE:
+        ; not done yet
+        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 co-ordinates 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:
+        ; not done yet
+        rts
+
+; ------------------------------------------------------------------------
+; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in the x
+; and y directions is passed 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 its address in ptr3.
+;
+; Must set an error code: NO
+;
+
+OUTTEXT:
+        ; not done yet
+        rts
diff --git a/libsrc/telestrat/tgi/telestrat-240-200-2.s b/libsrc/telestrat/tgi/telestrat-240-200-2.s
new file mode 100644 (file)
index 0000000..fcc1ce3
--- /dev/null
@@ -0,0 +1,329 @@
+;
+; Graphics driver for the 240x200x2 monochrome mode on the Atmos
+;
+; Jede (jede@oric.org), 2017-10-15
+
+
+        .include        "zeropage.inc"
+
+        .include        "tgi-kernel.inc"
+        .include        "tgi-error.inc"
+        .include        "telestrat.inc"
+
+        .macpack        generic
+        .macpack        module
+
+XSIZE   =       6                       ; System font width
+YSIZE   =       8                       ; System font height
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table and constants.
+
+        module_header   _telestrat_240_200_2_tgi
+
+; 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
+        .addr   $0000                   ; Library reference
+        .word   240                     ; X resolution
+        .word   200                     ; Y resolution
+        .byte   2                       ; Number of drawing colors
+        .byte   1                       ; Number of screens available
+        .byte   XSIZE                   ; System font X size
+        .byte   YSIZE                   ; System font Y size
+        .word   $011C                   ; Aspect ratio (based on 4/3 display)
+        .byte   0                       ; TGI driver flags
+
+; Next comes the jump table. Currently 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
+
+; ------------------------------------------------------------------------
+; 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
+
+; Absolute variables used in the code
+
+.bss
+
+ERROR:          .res    1       ; Error code
+MODE:           .res    1       ; Graphics mode
+
+; Constant table
+
+.rodata
+
+DEFPALETTE:     .byte   0, 1
+
+.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
+
+        BRK_TELEMON(XHIRES)
+
+; 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:
+        BRK_TELEMON(XTEXT)
+        rts
+
+; ------------------------------------------------------------------------
+; 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:
+        ; not done yet
+        rts
+
+; ------------------------------------------------------------------------
+; CLEAR: Clears the screen.
+;
+; Must set an error code: NO
+;
+
+CLEAR:
+        ; not done yet
+        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:
+
+; ------------------------------------------------------------------------
+; 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:
+        ;not done yet
+        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       ; This resolution has no palette
+        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:
+        ; not done yet
+        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 X1
+        sta HRS1
+        lda Y1
+        sta HRS2
+        
+        lda #$80       ; curset on 
+        sta HRSFB
+        
+        BRK_TELEMON(XCURSE)
+
+        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:
+        ; not done yet
+        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:
+        ; not done yet
+        rts
+
+CIRCLE:    
+        ; not done yet
+        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)
+;
+; Must set an error code: NO
+;
+
+BAR:
+        ; not done yet
+        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:
+        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:
+        ; Not done yet
+        rts
diff --git a/libsrc/telestrat/tgi_colors.s b/libsrc/telestrat/tgi_colors.s
new file mode 100644 (file)
index 0000000..6ef3729
--- /dev/null
@@ -0,0 +1,8 @@
+;
+; Target-specific black & white values for use by the target-shared TGI kernel
+;
+
+        .include        "tgi-kernel.inc"
+
+        .export         tgi_color_black:zp = $00
+        .export         tgi_color_white:zp = $01
diff --git a/libsrc/telestrat/tgi_stat_stddrv.s b/libsrc/telestrat/tgi_stat_stddrv.s
new file mode 100644 (file)
index 0000000..2b0d967
--- /dev/null
@@ -0,0 +1,14 @@
+;
+; Address of the static standard tgi driver
+;
+; Jede (jede@oric.org), 2017-10-15
+;
+; const void tgi_static_stddrv[];
+;
+
+        .export _tgi_static_stddrv
+        .import _telestrat_240_200_2_tgi
+
+.rodata
+
+_tgi_static_stddrv := _telestrat_240_200_2_tgi