#--------------------------------------------------------------------------
# Directories
-DIRS = devel \
- disk \
+DIRS = disk \
+ drivers \
file \
memory \
system
+++ /dev/null
-#
-# makefile for CC65 runtime library
-#
-
-#--------------------------------------------------------------------------
-# Object files
-
-S_OBJS += fio_module.o \
- joy_stddrv.o \
- mcbdefault.o \
- mouse_stddrv.o \
- tgi_colors.o \
- tgi_stddrv.o
+++ /dev/null
-;
-; Low level file I/O routines, ONLY for module loading OR sth similar
-;
-; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
-; 25.12.2002
-;
-; only ONE opened file at a time, only O_RDONLY flag
-
-; int open (const char* name, int flags, ...); /* May take a mode argument */
-; int __fastcall__ close (int fd);
-; int __fastcall__ read (int fd, void* buf, unsigned count);
-
-FILEDES = 3 ; first free to use file descriptor
-
- .include "geossym.inc"
- .include "const.inc"
- .include "errno.inc"
- .include "fcntl.inc"
-
- .importzp ptr1, ptr2, ptr3, tmp1
- .import addysp, popax
- .import __oserror
- .import _FindFile, _ReadByte
-
- .export _open, _close, _read
-
-
-;--------------------------------------------------------------------------
-; _open
-
-_open:
-
- cpy #4 ; correct # of arguments (bytes)?
- beq @parmok ; parameter count ok
- tya ; parm count < 4 shouldn't be needed to be...
- sec ; ...checked (it generates a c compiler warning)
- sbc #4
- tay
- jsr addysp ; fix stack, throw away unused parameters
-
-; Parameters ok. Pop the flags and save them into tmp3
-
-@parmok:
- jsr popax ; Get flags
- sta tmp1
- jsr popax ; Get name
- sta ptr1
- stx ptr1+1
-
- lda filedesc ; is there a file already open?
- bne @alreadyopen
-
- lda tmp1 ; check open mode
- and #(O_RDWR | O_CREAT)
- cmp #O_RDONLY ; only O_RDONLY is valid
- bne @badmode
-
- lda ptr1
- ldx ptr1+1
- jsr _FindFile ; try to find the file
- tax
- bne @oserror
-
- lda dirEntryBuf + OFF_DE_TR_SC ; tr&se for ReadByte (r1)
- sta f_track
- lda dirEntryBuf + OFF_DE_TR_SC + 1
- sta f_sector
- lda #<diskBlkBuf ; buffer for ReadByte (r4)
- sta f_buffer
- lda #>diskBlkBuf
- sta f_buffer+1
- ldx #0 ; offset for ReadByte (r5)
- stx f_offset
- stx f_offset+1
- lda #0 ; clear errors
- sta __oserror
- jsr __seterrno
- lda #FILEDES ; return fd
- sta filedesc
- rts
-@badmode:
- lda #EINVAL ; invalid parameters - invalid open mode
- .byte $2c ; skip
-@alreadyopen:
- lda #EMFILE ; too many opened files (there can be only one)
- jmp __directerrno ; set errno, clear oserror, return -1
-@oserror:
- jmp __mappederrno ; set platform error code, return -1
-
-_close:
- lda #0
- sta __oserror
- jsr __seterrno ; clear errors
- lda #0 ; clear fd
- sta filedesc
- tax
- rts
-
-_read:
- ; a/x - number of bytes
- ; popax - buffer ptr
- ; popax - fd, must be == to the above one
- ; return -1+__oserror or number of bytes read
-
- eor #$ff
- sta ptr1
- txa
- eor #$ff
- sta ptr1+1 ; -(# of bytes to read)-1
- jsr popax
- sta ptr2
- stx ptr2+1 ; buffer ptr
- jsr popax
- cmp #FILEDES ; lo-byte == FILEDES
- bne @filenotopen
- txa ; hi-byte == 0
- beq @fileok ; fd must be == FILEDES
-
-@filenotopen:
- lda #EBADF
- jmp __directerrno ; Sets _errno, clears _oserror, returns -1
-
-@fileok:
- lda #0
- sta ptr3
- sta ptr3+1 ; put 0 into ptr3 (number of bytes read)
- sta __oserror ; clear error flags
- jsr __seterrno
-
- lda f_track ; restore stuff for ReadByte
- ldx f_sector
- sta r1L
- stx r1H
- lda f_buffer
- ldx f_buffer+1
- sta r4L
- stx r4H
- lda f_offset
- ldx f_offset+1
- sta r5L
- stx r5H
-
- clc
- bcc @L3 ; branch always
-
-@L0: jsr _ReadByte
- ldy #0 ; store the byte
- sta (ptr2),y
- inc ptr2 ; increment target address
- bne @L1
- inc ptr2+1
-
-@L1: inc ptr3 ; increment byte count
- bne @L2
- inc ptr3+1
-
-@L2: lda __oserror ; was there error ?
- beq @L3
- cmp #BFR_OVERFLOW ; EOF?
- beq @done ; yes, we're done
- jmp __mappederrno ; no, we're screwed
-
-@L3: inc ptr1 ; decrement the count
- bne @L0
- inc ptr1+1
- bne @L0
-
-@done:
- lda r1L ; preserve data for ReadByte
- ldx r1H
- sta f_track
- stx f_sector
- lda r4L
- ldx r4H
- sta f_buffer
- stx f_buffer+1
- lda r5L
- ldx r5H
- sta f_offset
- stx f_offset+1
-
- lda ptr3 ; return byte count
- ldx ptr3+1
- rts
-
-.bss
-filedesc: .res 1 ; file open flag - 0 (no file opened) or 1
-f_track: .res 1 ; values preserved for ReadByte
-f_sector: .res 1
-f_offset: .res 2
-f_buffer: .res 2
+++ /dev/null
-;
-; Standard joystick driver for the C64. May be used multiple times when linked
-; to the statically application.
-;
-; Ullrich von Bassewitz, 2002-12-20
-;
-
- .include "zeropage.inc"
-
- .include "joy-kernel.inc"
- .include "joy-error.inc"
- .include "geossym.inc"
-
- .macpack generic
-
-
-; ------------------------------------------------------------------------
-; Header. Includes jump table
-
-.segment "JUMPTABLE"
-
-; Driver signature
-
- .byte $6A, $6F, $79 ; "joy"
- .byte JOY_API_VERSION ; Driver API version number
-
-; Button state masks (8 values)
-
- .byte $01 ; JOY_UP
- .byte $02 ; JOY_DOWN
- .byte $04 ; JOY_LEFT
- .byte $08 ; JOY_RIGHT
- .byte $10 ; JOY_FIRE
- .byte $00 ; Future expansion
- .byte $00 ; Future expansion
- .byte $00 ; Future expansion
-
-; Jump table.
-
- .word INSTALL
- .word UNINSTALL
- .word COUNT
- .word READ
-
-; ------------------------------------------------------------------------
-; Constants
-
-JOY_COUNT = 2 ; Number of joysticks we support
-
-
-; ------------------------------------------------------------------------
-; Data.
-
-
-.code
-
-; ------------------------------------------------------------------------
-; INSTALL routine. Is called after the driver is loaded into memory. If
-; possible, check if the hardware is present and determine the amount of
-; memory available.
-; Must return an JOY_ERR_xx code in a/x.
-;
-
-INSTALL:
- lda #<JOY_ERR_OK
- ldx #>JOY_ERR_OK
-; rts ; Run into UNINSTALL instead
-
-; ------------------------------------------------------------------------
-; UNINSTALL routine. Is called before the driver is removed from memory.
-; Can do cleanup or whatever. Must not return anything.
-;
-
-UNINSTALL:
- rts
-
-
-; ------------------------------------------------------------------------
-; COUNT: Return the total number of available joysticks in a/x.
-;
-
-COUNT:
- lda #<JOY_COUNT
- ldx #>JOY_COUNT
- rts
-
-; ------------------------------------------------------------------------
-; READ: Read a particular joystick passed in A.
-;
-
-READ:
- tax
- php
- sei ; disable IRQ
- lda $01
- pha
- lda #$35
- sta $01 ; enable I/O
-
- txa ; Joystick number into X
- bne joy2
-
-; Read joystick 1
-
-joy1:
- lda #$7F
- sta cia1base
- lda cia1base+1
-back: tay
- pla
- sta $01
- plp
- tya
- and #$1F
- eor #$1F
- rts
-
-; Read joystick 2
-
-joy2: ldx #0
- lda #$E0
- ldy #$FF
- sta cia1base+2
- lda cia1base+1
- sty cia1base+2
- jmp back
+++ /dev/null
-;
-; Graphics driver for the 320x200x2 and 640x200x2 modes on GEOS 64/128
-; 2010-08-17, Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
-; 2010-08-18, Greg King
-
- .include "zeropage.inc"
-
- .include "tgi-kernel.inc"
- .include "tgi-error.inc"
-
- .include "const.inc"
- .include "jumptab.inc"
- .include "geossym.inc"
- .include "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 signature,
-; and defines the capabilities of the driver.
-
- .byte $74, $67, $69 ; "tgi"
- .byte TGI_API_VERSION ; TGI API 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
-aspect: .word $00D4 ; Aspect ratio (based on 4/3 display)
- .byte 0 ; TGI driver flags
-
-; Next comes the jump table. With the exception of IRQ, 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
-
-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
-
-; 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:
- ; double the x resolution and halve the aspect ratio
-
- asl xres
- rol xres+1
-
- lsr aspect+1
- ror aspect
-
- ; 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
-
-; ------------------------------------------------------------------------
-; 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:
- 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: NO
-;
-
-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
- lda #1
-@L1: sta BITMASK
- jmp SetPattern ; need to have either 0 or 1
-
-; ------------------------------------------------------------------------
-; 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:
- jsr GETERROR ; clear error (if any)
-
- 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. 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:
- lda #<PALETTE
- ldx #>PALETTE
- 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 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
- 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
-
-; ------------------------------------------------------------------------
-; 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
-
-; ------------------------------------------------------------------------
-; 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 TEXTDIR
-; cmp #TGI_TEXT_HORIZONTAL ; this is equal 0
- bne @vertical
-
- lda X1 ; horizontal text output
- ldx X1+1
- ldy Y1
- sta r11L
- stx r11H
- sty r1H
- lda ptr3
- ldx ptr3+1
- sta r0L
- stx r0H
- jmp PutString
-
-@vertical:
- lda X1 ; vertical text output
- ldx X1+1
- ldy Y1
- sta r11L
- stx r11H
- sty r1H
- ldy #0
- lda (ptr3),y
- beq @end
- jsr PutChar
- inc ptr3
- bne @L1
- inc ptr3+1
-@L1: lda Y1
- clc
- adc #8
- sta Y1
- bne @vertical
-@end: 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
-
+++ /dev/null
-;
-; Extended memory driver for the VDC RAM available on all C128 machines
-; version for GEOS enters safe I/O config on C64 (transparent on C128)
-;
-; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
-; 06,20,25.12.2002
-
- .include "zeropage.inc"
-
- .include "em-kernel.inc"
- .include "em-error.inc"
-
-
- .macpack generic
-
-
-; ------------------------------------------------------------------------
-; Header. Includes jump table
-
-.segment "JUMPTABLE"
-
-; Driver signature
-
- .byte $65, $6d, $64 ; "emd"
- .byte EMD_API_VERSION ; EM API version number
-
-; Jump table.
-
- .word INSTALL
- .word UNINSTALL
- .word PAGECOUNT
- .word MAP
- .word USE
- .word COMMIT
- .word COPYFROM
- .word COPYTO
-
-; ------------------------------------------------------------------------
-; Constants
-
-VDC_ADDR_REG = $D600 ; VDC address
-VDC_DATA_REG = $D601 ; VDC data
-
-VDC_DATA_HI = 18 ; used registers
-VDC_DATA_LO = 19
-VDC_CSET = 28
-VDC_DATA = 31
-
-; ------------------------------------------------------------------------
-; Data.
-
-.data
-
-pagecount: .word 64 ; $0000-$3fff as 16k default
-curpage: .word $ffff ; currently mapped-in page (invalid)
-
-.bss
-
-window: .res 256 ; memory window
-
-.code
-
-; ------------------------------------------------------------------------
-; INSTALL routine. Is called after the driver is loaded into memory. If
-; possible, check if the hardware is present and determine the amount of
-; memory available.
-; Must return an EM_ERR_xx code in a/x.
-;
-
-INSTALL:
- ; do test for VDC presence here???
-
- php
- sei
- lda $01
- pha
- lda #$35
- sta $01
-
- ldx #VDC_CSET ; determine size of RAM...
- jsr vdcgetreg
- sta tmp1
- ora #%00010000
- jsr vdcputreg ; turn on 64k
-
- jsr settestadr1 ; save original value of test byte
- jsr vdcgetbyte
- 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 vdcputbyte ; 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 vdcputreg ; restore 16/64k flag
- jmp @endok ; and leave default values for 16k
-
-@have64k:
- lda #<256
- ldx #>256
- sta pagecount
- stx pagecount+1
-@endok:
- pla
- sta $01
- plp
- lda #<EM_ERR_OK
- ldx #>EM_ERR_OK
- rts
-
-test64k:
- sta tmp1
- sty ptr3
- lda #0
- sta ptr3+1
- jsr settestadr1
- lda tmp1
- jsr vdcputbyte ; write $55
- jsr settestadr1
- jsr vdcgetbyte ; read here
- pha
- jsr settestadr2
- jsr vdcgetbyte ; 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 vdcsetsrcaddr
-
-; ------------------------------------------------------------------------
-; UNINSTALL routine. Is called before the driver is removed from memory.
-; Can do cleanup or whatever. Must not return anything.
-;
-
-UNINSTALL:
- ;on C128 restore font and clear the screen?
- rts
-
-; ------------------------------------------------------------------------
-; PAGECOUNT: Return the total number of available pages in a/x.
-;
-
-PAGECOUNT:
- lda pagecount
- ldx pagecount+1
- rts
-
-; ------------------------------------------------------------------------
-; MAP: Map the page in a/x into memory and return a pointer to the page in
-; a/x. The contents of the currently mapped page (if any) may be discarded
-; by the driver.
-;
-
-MAP: sta curpage
- stx curpage+1
- sta ptr1+1
- ldy #0
- sty ptr1
-
- lda #<window
- sta ptr2
- lda #>window
- sta ptr2+1
-
- jsr transferin
-
- lda #<window
- ldx #>window
- rts
-
-; copy a single page from (ptr1):VDCRAM to (ptr2):RAM
-
-transferin:
- php
- sei
- lda $01
- pha
- lda #$35
- sta $01
- lda ptr1
- ldy ptr1+1
- jsr vdcsetsrcaddr ; set source address in VDC
- ldy #0
- ldx #VDC_DATA
- stx VDC_ADDR_REG
-@L0: bit VDC_ADDR_REG
- bpl @L0
- lda VDC_DATA_REG ; get 2 bytes at a time to speed-up
- sta (ptr2),y ; (in fact up to 8 bytes could be fetched with special VDC config)
- iny
- lda VDC_DATA_REG
- sta (ptr2),y
- iny
- bne @L0
- pla
- sta $01
- plp
- rts
-
-; ------------------------------------------------------------------------
-; USE: Tell the driver that the window is now associated with a given page.
-
-USE: sta curpage
- stx curpage+1 ; Remember the page
- lda #<window
- ldx #>window ; Return the window
-done: rts
-
-; ------------------------------------------------------------------------
-; COMMIT: Commit changes in the memory window to extended storage.
-
-COMMIT:
- lda curpage ; jump if no page mapped
- ldx curpage+1
- bmi done
- sta ptr1+1
- ldy #0
- sty ptr1
-
- lda #<window
- sta ptr2
- lda #>window
- sta ptr2+1
-
-; fall through to transferout
-
-; copy a single page from (ptr2):RAM to (ptr1):VDCRAM
-
-transferout:
- php
- sei
- lda $01
- pha
- lda #$35
- sta $01
- lda ptr1
- ldy ptr1+1
- jsr vdcsetsrcaddr ; set source address in VDC
- ldy #0
- ldx #VDC_DATA
- stx VDC_ADDR_REG
-@L0: bit VDC_ADDR_REG
- bpl @L0
- lda (ptr2),y ; speedup does not work for writing
- sta VDC_DATA_REG
- iny
- bne @L0
- pla
- sta $01
- plp
- rts
-
-; ------------------------------------------------------------------------
-; COPYFROM: Copy from extended into linear memory. A pointer to a structure
-; describing the request is passed in a/x.
-; The function must not return anything.
-;
-
-COPYFROM:
- jsr setup
- beq @L2 ; Skip if no full pages
-
-; Copy full pages
-
-@L1: jsr transferin
- inc ptr1+1
- inc ptr2+1
- dec tmp1
- bne @L1
-
-; Copy the remainder of the page
-
-@L2: ldy #EM_COPY::COUNT
- lda (ptr3),y ; Get bytes in last page
- beq @L4
- sta tmp1
-
-; Transfer the bytes in the last page
- php
- sei
- lda $01
- pha
- lda #$35
- sta $01
- ldy #0
-@L3: jsr vdcgetbyte
- sta (ptr2),y
- iny
- dec tmp1
- lda tmp1
- bne @L3
- pla
- sta $01
- plp
-@L4: rts
-
-; ------------------------------------------------------------------------
-; COPYTO: Copy from linear into extended memory. A pointer to a structure
-; describing the request is passed in a/x.
-; The function must not return anything.
-;
-
-COPYTO:
- jsr setup
- beq @L2 ; Skip if no full pages
-
-; Copy full pages
-
-@L1: jsr transferout
- inc ptr1+1
- inc ptr2+1
- dec tmp1
- bne @L1
-
-; Copy the remainder of the page
-
-@L2: ldy #EM_COPY::COUNT
- lda (ptr3),y ; Get bytes in last page
- beq @L4
- sta tmp1
-
-; Transfer the bytes in the last page
- php
- sei
- lda $01
- pha
- lda #$35
- sta $01
- ldy #0
-@L3: lda (ptr2),y
- jsr vdcputbyte
- iny
- dec tmp1
- lda tmp1
- bne @L3
- pla
- sta $01
- plp
-@L4: rts
-
-;-------------------------------------------------------------------------
-; Helper functions to handle VDC ram
-;
-
-vdcsetsrcaddr:
- ldx #VDC_DATA_LO
- stx VDC_ADDR_REG
-@L0: bit VDC_ADDR_REG
- bpl @L0
- sta VDC_DATA_REG
- dex
- tya
- stx VDC_ADDR_REG
- sta VDC_DATA_REG
- rts
-
-vdcgetbyte:
- ldx #VDC_DATA
-vdcgetreg:
- stx VDC_ADDR_REG
-@L0: bit VDC_ADDR_REG
- bpl @L0
- lda VDC_DATA_REG
- rts
-
-vdcputbyte:
- ldx #VDC_DATA
-vdcputreg:
- stx VDC_ADDR_REG
-@L0: bit VDC_ADDR_REG
- bpl @L0
- sta VDC_DATA_REG
- rts
-
-; ------------------------------------------------------------------------
-; Helper function for COPYFROM and COPYTO: Store the pointer to the request
-; structure and prepare data for the copy
-;
-
-setup:
- sta ptr3
- stx ptr3+1 ; Save the passed em_copy pointer
-
- ldy #EM_COPY::OFFS
- lda (ptr3),y
- sta ptr1
- ldy #EM_COPY::PAGE
- lda (ptr3),y
- sta ptr1+1 ; From
-
- ldy #EM_COPY::BUF
- lda (ptr3),y
- sta ptr2
- iny
- lda (ptr3),y
- sta ptr2+1 ; To
-
- ldy #EM_COPY::COUNT+1
- lda (ptr3),y ; Get number of pages
- sta tmp1
- rts
-
+++ /dev/null
-;
-; Name of the standard joystick driver
-;
-; Ullrich von Bassewitz, 2002-12-21
-;
-; const char joy_stddrv[];
-;
-
- .export _joy_stddrv
-
-.rodata
-
-_joy_stddrv: .asciiz "geos-stdjoy.joy"
-
+++ /dev/null
-;
-; Mouse callbacks for GEOS.
-;
-; GEOS has a built-in mouse architecture. Half of this file does nothing
-; -- it exists merely to allow portable programs to link and run.
-;
-; 2.7.2001, Maciej 'YTM/Elysium' Witkowiak
-; 2004-03-20, Ullrich von Bassewitz
-; 2004-09-24, Greg King
-;
-
-; .constructor init_pointer
- .export _mouse_def_callbacks
-
-; .include "mouse-kernel.inc"
-; .include "const.inc"
-; .include "geossym.inc"
- .include "jumptab.inc"
-
-; .macpack generic
-
-; The functions below must be interrupt-safe,
-; because they might be called from an interrupt-handler.
-
-.code
-
-; --------------------------------------------------------------------------
-; Hide the mouse pointer. Always called with interrupts disabled.
-
-hide := MouseOff
-
-; --------------------------------------------------------------------------
-; Show the mouse pointer. Always called with interrupts disabled.
-
-show := MouseUp
-
-; --------------------------------------------------------------------------
-; Move the mouse pointer X position to the value in .XA. Always called with
-; interrupts disabled.
-
-.proc movex
-
- rts
-
-.endproc
-
-; --------------------------------------------------------------------------
-; Move the mouse pointer Y position to the value in .XA. Always called with
-; interrupts disabled.
-
-.proc movey
-
- rts
-
-.endproc
-
-; --------------------------------------------------------------------------
-; Callback structure
-
-.rodata
-
-_mouse_def_callbacks:
- .addr hide
- .addr show
- .addr movex
- .addr movey
-
-
+++ /dev/null
-;
-; Name of the standard mouse driver
-;
-; 2010-01-25, Greg King
-;
-; const char mouse_stddrv[];
-;
- .export _mouse_stddrv
-
- .rodata
-_mouse_stddrv: .asciiz "geos-stdmou.mou"
+++ /dev/null
-;
-; Target-specific black & white values, for use by the target-shared TGI kernel
-;
-
- .include "tgi-kernel.inc"
-
-tgi_color_black = $00
-tgi_color_white = $01
+++ /dev/null
-;
-; Name of the standard tgi driver
-;
-; Oliver Schmidt, 2011-05-02
-;
-; const char tgi_stddrv[];
-;
-
- .export _tgi_stddrv
-
-.rodata
-
-_tgi_stddrv: .asciiz "geos-tgi.tgi"
--- /dev/null
+#
+# makefile for CC65 runtime library
+#
+
+#--------------------------------------------------------------------------
+# Object files
+
+S_OBJS += fio_module.o \
+ joy_stddrv.o \
+ mcbdefault.o \
+ mouse_stddrv.o \
+ tgi_colors.o \
+ tgi_stddrv.o
--- /dev/null
+;
+; Low level file I/O routines, ONLY for module loading OR sth similar
+;
+; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
+; 25.12.2002
+;
+; only ONE opened file at a time, only O_RDONLY flag
+
+; int open (const char* name, int flags, ...); /* May take a mode argument */
+; int __fastcall__ close (int fd);
+; int __fastcall__ read (int fd, void* buf, unsigned count);
+
+FILEDES = 3 ; first free to use file descriptor
+
+ .include "geossym.inc"
+ .include "const.inc"
+ .include "errno.inc"
+ .include "fcntl.inc"
+
+ .importzp ptr1, ptr2, ptr3, tmp1
+ .import addysp, popax
+ .import __oserror
+ .import _FindFile, _ReadByte
+
+ .export _open, _close, _read
+
+
+;--------------------------------------------------------------------------
+; _open
+
+_open:
+
+ cpy #4 ; correct # of arguments (bytes)?
+ beq @parmok ; parameter count ok
+ tya ; parm count < 4 shouldn't be needed to be...
+ sec ; ...checked (it generates a c compiler warning)
+ sbc #4
+ tay
+ jsr addysp ; fix stack, throw away unused parameters
+
+; Parameters ok. Pop the flags and save them into tmp3
+
+@parmok:
+ jsr popax ; Get flags
+ sta tmp1
+ jsr popax ; Get name
+ sta ptr1
+ stx ptr1+1
+
+ lda filedesc ; is there a file already open?
+ bne @alreadyopen
+
+ lda tmp1 ; check open mode
+ and #(O_RDWR | O_CREAT)
+ cmp #O_RDONLY ; only O_RDONLY is valid
+ bne @badmode
+
+ lda ptr1
+ ldx ptr1+1
+ jsr _FindFile ; try to find the file
+ tax
+ bne @oserror
+
+ lda dirEntryBuf + OFF_DE_TR_SC ; tr&se for ReadByte (r1)
+ sta f_track
+ lda dirEntryBuf + OFF_DE_TR_SC + 1
+ sta f_sector
+ lda #<diskBlkBuf ; buffer for ReadByte (r4)
+ sta f_buffer
+ lda #>diskBlkBuf
+ sta f_buffer+1
+ ldx #0 ; offset for ReadByte (r5)
+ stx f_offset
+ stx f_offset+1
+ lda #0 ; clear errors
+ sta __oserror
+ jsr __seterrno
+ lda #FILEDES ; return fd
+ sta filedesc
+ rts
+@badmode:
+ lda #EINVAL ; invalid parameters - invalid open mode
+ .byte $2c ; skip
+@alreadyopen:
+ lda #EMFILE ; too many opened files (there can be only one)
+ jmp __directerrno ; set errno, clear oserror, return -1
+@oserror:
+ jmp __mappederrno ; set platform error code, return -1
+
+_close:
+ lda #0
+ sta __oserror
+ jsr __seterrno ; clear errors
+ lda #0 ; clear fd
+ sta filedesc
+ tax
+ rts
+
+_read:
+ ; a/x - number of bytes
+ ; popax - buffer ptr
+ ; popax - fd, must be == to the above one
+ ; return -1+__oserror or number of bytes read
+
+ eor #$ff
+ sta ptr1
+ txa
+ eor #$ff
+ sta ptr1+1 ; -(# of bytes to read)-1
+ jsr popax
+ sta ptr2
+ stx ptr2+1 ; buffer ptr
+ jsr popax
+ cmp #FILEDES ; lo-byte == FILEDES
+ bne @filenotopen
+ txa ; hi-byte == 0
+ beq @fileok ; fd must be == FILEDES
+
+@filenotopen:
+ lda #EBADF
+ jmp __directerrno ; Sets _errno, clears _oserror, returns -1
+
+@fileok:
+ lda #0
+ sta ptr3
+ sta ptr3+1 ; put 0 into ptr3 (number of bytes read)
+ sta __oserror ; clear error flags
+ jsr __seterrno
+
+ lda f_track ; restore stuff for ReadByte
+ ldx f_sector
+ sta r1L
+ stx r1H
+ lda f_buffer
+ ldx f_buffer+1
+ sta r4L
+ stx r4H
+ lda f_offset
+ ldx f_offset+1
+ sta r5L
+ stx r5H
+
+ clc
+ bcc @L3 ; branch always
+
+@L0: jsr _ReadByte
+ ldy #0 ; store the byte
+ sta (ptr2),y
+ inc ptr2 ; increment target address
+ bne @L1
+ inc ptr2+1
+
+@L1: inc ptr3 ; increment byte count
+ bne @L2
+ inc ptr3+1
+
+@L2: lda __oserror ; was there error ?
+ beq @L3
+ cmp #BFR_OVERFLOW ; EOF?
+ beq @done ; yes, we're done
+ jmp __mappederrno ; no, we're screwed
+
+@L3: inc ptr1 ; decrement the count
+ bne @L0
+ inc ptr1+1
+ bne @L0
+
+@done:
+ lda r1L ; preserve data for ReadByte
+ ldx r1H
+ sta f_track
+ stx f_sector
+ lda r4L
+ ldx r4H
+ sta f_buffer
+ stx f_buffer+1
+ lda r5L
+ ldx r5H
+ sta f_offset
+ stx f_offset+1
+
+ lda ptr3 ; return byte count
+ ldx ptr3+1
+ rts
+
+.bss
+filedesc: .res 1 ; file open flag - 0 (no file opened) or 1
+f_track: .res 1 ; values preserved for ReadByte
+f_sector: .res 1
+f_offset: .res 2
+f_buffer: .res 2
--- /dev/null
+;
+; Standard joystick driver for the C64. May be used multiple times when linked
+; to the statically application.
+;
+; Ullrich von Bassewitz, 2002-12-20
+;
+
+ .include "zeropage.inc"
+
+ .include "joy-kernel.inc"
+ .include "joy-error.inc"
+ .include "geossym.inc"
+
+ .macpack generic
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+.segment "JUMPTABLE"
+
+; Driver signature
+
+ .byte $6A, $6F, $79 ; "joy"
+ .byte JOY_API_VERSION ; Driver API version number
+
+; Button state masks (8 values)
+
+ .byte $01 ; JOY_UP
+ .byte $02 ; JOY_DOWN
+ .byte $04 ; JOY_LEFT
+ .byte $08 ; JOY_RIGHT
+ .byte $10 ; JOY_FIRE
+ .byte $00 ; Future expansion
+ .byte $00 ; Future expansion
+ .byte $00 ; Future expansion
+
+; Jump table.
+
+ .word INSTALL
+ .word UNINSTALL
+ .word COUNT
+ .word READ
+
+; ------------------------------------------------------------------------
+; Constants
+
+JOY_COUNT = 2 ; Number of joysticks we support
+
+
+; ------------------------------------------------------------------------
+; Data.
+
+
+.code
+
+; ------------------------------------------------------------------------
+; INSTALL routine. Is called after the driver is loaded into memory. If
+; possible, check if the hardware is present and determine the amount of
+; memory available.
+; Must return an JOY_ERR_xx code in a/x.
+;
+
+INSTALL:
+ lda #<JOY_ERR_OK
+ ldx #>JOY_ERR_OK
+; rts ; Run into UNINSTALL instead
+
+; ------------------------------------------------------------------------
+; UNINSTALL routine. Is called before the driver is removed from memory.
+; Can do cleanup or whatever. Must not return anything.
+;
+
+UNINSTALL:
+ rts
+
+
+; ------------------------------------------------------------------------
+; COUNT: Return the total number of available joysticks in a/x.
+;
+
+COUNT:
+ lda #<JOY_COUNT
+ ldx #>JOY_COUNT
+ rts
+
+; ------------------------------------------------------------------------
+; READ: Read a particular joystick passed in A.
+;
+
+READ:
+ tax
+ php
+ sei ; disable IRQ
+ lda $01
+ pha
+ lda #$35
+ sta $01 ; enable I/O
+
+ txa ; Joystick number into X
+ bne joy2
+
+; Read joystick 1
+
+joy1:
+ lda #$7F
+ sta cia1base
+ lda cia1base+1
+back: tay
+ pla
+ sta $01
+ plp
+ tya
+ and #$1F
+ eor #$1F
+ rts
+
+; Read joystick 2
+
+joy2: ldx #0
+ lda #$E0
+ ldy #$FF
+ sta cia1base+2
+ lda cia1base+1
+ sty cia1base+2
+ jmp back
--- /dev/null
+;
+; Graphics driver for the 320x200x2 and 640x200x2 modes on GEOS 64/128
+; 2010-08-17, Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
+; 2010-08-18, Greg King
+
+ .include "zeropage.inc"
+
+ .include "tgi-kernel.inc"
+ .include "tgi-error.inc"
+
+ .include "const.inc"
+ .include "jumptab.inc"
+ .include "geossym.inc"
+ .include "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 signature,
+; and defines the capabilities of the driver.
+
+ .byte $74, $67, $69 ; "tgi"
+ .byte TGI_API_VERSION ; TGI API 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
+aspect: .word $00D4 ; Aspect ratio (based on 4/3 display)
+ .byte 0 ; TGI driver flags
+
+; Next comes the jump table. With the exception of IRQ, 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
+
+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
+
+; 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:
+ ; double the x resolution and halve the aspect ratio
+
+ asl xres
+ rol xres+1
+
+ lsr aspect+1
+ ror aspect
+
+ ; 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
+
+; ------------------------------------------------------------------------
+; 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:
+ 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: NO
+;
+
+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
+ lda #1
+@L1: sta BITMASK
+ jmp SetPattern ; need to have either 0 or 1
+
+; ------------------------------------------------------------------------
+; 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:
+ jsr GETERROR ; clear error (if any)
+
+ 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. 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:
+ lda #<PALETTE
+ ldx #>PALETTE
+ 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 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
+ 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
+
+; ------------------------------------------------------------------------
+; 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
+
+; ------------------------------------------------------------------------
+; 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 TEXTDIR
+; cmp #TGI_TEXT_HORIZONTAL ; this is equal 0
+ bne @vertical
+
+ lda X1 ; horizontal text output
+ ldx X1+1
+ ldy Y1
+ sta r11L
+ stx r11H
+ sty r1H
+ lda ptr3
+ ldx ptr3+1
+ sta r0L
+ stx r0H
+ jmp PutString
+
+@vertical:
+ lda X1 ; vertical text output
+ ldx X1+1
+ ldy Y1
+ sta r11L
+ stx r11H
+ sty r1H
+ ldy #0
+ lda (ptr3),y
+ beq @end
+ jsr PutChar
+ inc ptr3
+ bne @L1
+ inc ptr3+1
+@L1: lda Y1
+ clc
+ adc #8
+ sta Y1
+ bne @vertical
+@end: 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
+
--- /dev/null
+;
+; Extended memory driver for the VDC RAM available on all C128 machines
+; version for GEOS enters safe I/O config on C64 (transparent on C128)
+;
+; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
+; 06,20,25.12.2002
+
+ .include "zeropage.inc"
+
+ .include "em-kernel.inc"
+ .include "em-error.inc"
+
+
+ .macpack generic
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+.segment "JUMPTABLE"
+
+; Driver signature
+
+ .byte $65, $6d, $64 ; "emd"
+ .byte EMD_API_VERSION ; EM API version number
+
+; Jump table.
+
+ .word INSTALL
+ .word UNINSTALL
+ .word PAGECOUNT
+ .word MAP
+ .word USE
+ .word COMMIT
+ .word COPYFROM
+ .word COPYTO
+
+; ------------------------------------------------------------------------
+; Constants
+
+VDC_ADDR_REG = $D600 ; VDC address
+VDC_DATA_REG = $D601 ; VDC data
+
+VDC_DATA_HI = 18 ; used registers
+VDC_DATA_LO = 19
+VDC_CSET = 28
+VDC_DATA = 31
+
+; ------------------------------------------------------------------------
+; Data.
+
+.data
+
+pagecount: .word 64 ; $0000-$3fff as 16k default
+curpage: .word $ffff ; currently mapped-in page (invalid)
+
+.bss
+
+window: .res 256 ; memory window
+
+.code
+
+; ------------------------------------------------------------------------
+; INSTALL routine. Is called after the driver is loaded into memory. If
+; possible, check if the hardware is present and determine the amount of
+; memory available.
+; Must return an EM_ERR_xx code in a/x.
+;
+
+INSTALL:
+ ; do test for VDC presence here???
+
+ php
+ sei
+ lda $01
+ pha
+ lda #$35
+ sta $01
+
+ ldx #VDC_CSET ; determine size of RAM...
+ jsr vdcgetreg
+ sta tmp1
+ ora #%00010000
+ jsr vdcputreg ; turn on 64k
+
+ jsr settestadr1 ; save original value of test byte
+ jsr vdcgetbyte
+ 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 vdcputbyte ; 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 vdcputreg ; restore 16/64k flag
+ jmp @endok ; and leave default values for 16k
+
+@have64k:
+ lda #<256
+ ldx #>256
+ sta pagecount
+ stx pagecount+1
+@endok:
+ pla
+ sta $01
+ plp
+ lda #<EM_ERR_OK
+ ldx #>EM_ERR_OK
+ rts
+
+test64k:
+ sta tmp1
+ sty ptr3
+ lda #0
+ sta ptr3+1
+ jsr settestadr1
+ lda tmp1
+ jsr vdcputbyte ; write $55
+ jsr settestadr1
+ jsr vdcgetbyte ; read here
+ pha
+ jsr settestadr2
+ jsr vdcgetbyte ; 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 vdcsetsrcaddr
+
+; ------------------------------------------------------------------------
+; UNINSTALL routine. Is called before the driver is removed from memory.
+; Can do cleanup or whatever. Must not return anything.
+;
+
+UNINSTALL:
+ ;on C128 restore font and clear the screen?
+ rts
+
+; ------------------------------------------------------------------------
+; PAGECOUNT: Return the total number of available pages in a/x.
+;
+
+PAGECOUNT:
+ lda pagecount
+ ldx pagecount+1
+ rts
+
+; ------------------------------------------------------------------------
+; MAP: Map the page in a/x into memory and return a pointer to the page in
+; a/x. The contents of the currently mapped page (if any) may be discarded
+; by the driver.
+;
+
+MAP: sta curpage
+ stx curpage+1
+ sta ptr1+1
+ ldy #0
+ sty ptr1
+
+ lda #<window
+ sta ptr2
+ lda #>window
+ sta ptr2+1
+
+ jsr transferin
+
+ lda #<window
+ ldx #>window
+ rts
+
+; copy a single page from (ptr1):VDCRAM to (ptr2):RAM
+
+transferin:
+ php
+ sei
+ lda $01
+ pha
+ lda #$35
+ sta $01
+ lda ptr1
+ ldy ptr1+1
+ jsr vdcsetsrcaddr ; set source address in VDC
+ ldy #0
+ ldx #VDC_DATA
+ stx VDC_ADDR_REG
+@L0: bit VDC_ADDR_REG
+ bpl @L0
+ lda VDC_DATA_REG ; get 2 bytes at a time to speed-up
+ sta (ptr2),y ; (in fact up to 8 bytes could be fetched with special VDC config)
+ iny
+ lda VDC_DATA_REG
+ sta (ptr2),y
+ iny
+ bne @L0
+ pla
+ sta $01
+ plp
+ rts
+
+; ------------------------------------------------------------------------
+; USE: Tell the driver that the window is now associated with a given page.
+
+USE: sta curpage
+ stx curpage+1 ; Remember the page
+ lda #<window
+ ldx #>window ; Return the window
+done: rts
+
+; ------------------------------------------------------------------------
+; COMMIT: Commit changes in the memory window to extended storage.
+
+COMMIT:
+ lda curpage ; jump if no page mapped
+ ldx curpage+1
+ bmi done
+ sta ptr1+1
+ ldy #0
+ sty ptr1
+
+ lda #<window
+ sta ptr2
+ lda #>window
+ sta ptr2+1
+
+; fall through to transferout
+
+; copy a single page from (ptr2):RAM to (ptr1):VDCRAM
+
+transferout:
+ php
+ sei
+ lda $01
+ pha
+ lda #$35
+ sta $01
+ lda ptr1
+ ldy ptr1+1
+ jsr vdcsetsrcaddr ; set source address in VDC
+ ldy #0
+ ldx #VDC_DATA
+ stx VDC_ADDR_REG
+@L0: bit VDC_ADDR_REG
+ bpl @L0
+ lda (ptr2),y ; speedup does not work for writing
+ sta VDC_DATA_REG
+ iny
+ bne @L0
+ pla
+ sta $01
+ plp
+ rts
+
+; ------------------------------------------------------------------------
+; COPYFROM: Copy from extended into linear memory. A pointer to a structure
+; describing the request is passed in a/x.
+; The function must not return anything.
+;
+
+COPYFROM:
+ jsr setup
+ beq @L2 ; Skip if no full pages
+
+; Copy full pages
+
+@L1: jsr transferin
+ inc ptr1+1
+ inc ptr2+1
+ dec tmp1
+ bne @L1
+
+; Copy the remainder of the page
+
+@L2: ldy #EM_COPY::COUNT
+ lda (ptr3),y ; Get bytes in last page
+ beq @L4
+ sta tmp1
+
+; Transfer the bytes in the last page
+ php
+ sei
+ lda $01
+ pha
+ lda #$35
+ sta $01
+ ldy #0
+@L3: jsr vdcgetbyte
+ sta (ptr2),y
+ iny
+ dec tmp1
+ lda tmp1
+ bne @L3
+ pla
+ sta $01
+ plp
+@L4: rts
+
+; ------------------------------------------------------------------------
+; COPYTO: Copy from linear into extended memory. A pointer to a structure
+; describing the request is passed in a/x.
+; The function must not return anything.
+;
+
+COPYTO:
+ jsr setup
+ beq @L2 ; Skip if no full pages
+
+; Copy full pages
+
+@L1: jsr transferout
+ inc ptr1+1
+ inc ptr2+1
+ dec tmp1
+ bne @L1
+
+; Copy the remainder of the page
+
+@L2: ldy #EM_COPY::COUNT
+ lda (ptr3),y ; Get bytes in last page
+ beq @L4
+ sta tmp1
+
+; Transfer the bytes in the last page
+ php
+ sei
+ lda $01
+ pha
+ lda #$35
+ sta $01
+ ldy #0
+@L3: lda (ptr2),y
+ jsr vdcputbyte
+ iny
+ dec tmp1
+ lda tmp1
+ bne @L3
+ pla
+ sta $01
+ plp
+@L4: rts
+
+;-------------------------------------------------------------------------
+; Helper functions to handle VDC ram
+;
+
+vdcsetsrcaddr:
+ ldx #VDC_DATA_LO
+ stx VDC_ADDR_REG
+@L0: bit VDC_ADDR_REG
+ bpl @L0
+ sta VDC_DATA_REG
+ dex
+ tya
+ stx VDC_ADDR_REG
+ sta VDC_DATA_REG
+ rts
+
+vdcgetbyte:
+ ldx #VDC_DATA
+vdcgetreg:
+ stx VDC_ADDR_REG
+@L0: bit VDC_ADDR_REG
+ bpl @L0
+ lda VDC_DATA_REG
+ rts
+
+vdcputbyte:
+ ldx #VDC_DATA
+vdcputreg:
+ stx VDC_ADDR_REG
+@L0: bit VDC_ADDR_REG
+ bpl @L0
+ sta VDC_DATA_REG
+ rts
+
+; ------------------------------------------------------------------------
+; Helper function for COPYFROM and COPYTO: Store the pointer to the request
+; structure and prepare data for the copy
+;
+
+setup:
+ sta ptr3
+ stx ptr3+1 ; Save the passed em_copy pointer
+
+ ldy #EM_COPY::OFFS
+ lda (ptr3),y
+ sta ptr1
+ ldy #EM_COPY::PAGE
+ lda (ptr3),y
+ sta ptr1+1 ; From
+
+ ldy #EM_COPY::BUF
+ lda (ptr3),y
+ sta ptr2
+ iny
+ lda (ptr3),y
+ sta ptr2+1 ; To
+
+ ldy #EM_COPY::COUNT+1
+ lda (ptr3),y ; Get number of pages
+ sta tmp1
+ rts
+
--- /dev/null
+;
+; Name of the standard joystick driver
+;
+; Ullrich von Bassewitz, 2002-12-21
+;
+; const char joy_stddrv[];
+;
+
+ .export _joy_stddrv
+
+.rodata
+
+_joy_stddrv: .asciiz "geos-stdjoy.joy"
+
--- /dev/null
+;
+; Mouse callbacks for GEOS.
+;
+; GEOS has a built-in mouse architecture. Half of this file does nothing
+; -- it exists merely to allow portable programs to link and run.
+;
+; 2.7.2001, Maciej 'YTM/Elysium' Witkowiak
+; 2004-03-20, Ullrich von Bassewitz
+; 2004-09-24, Greg King
+;
+
+; .constructor init_pointer
+ .export _mouse_def_callbacks
+
+; .include "mouse-kernel.inc"
+; .include "const.inc"
+; .include "geossym.inc"
+ .include "jumptab.inc"
+
+; .macpack generic
+
+; The functions below must be interrupt-safe,
+; because they might be called from an interrupt-handler.
+
+.code
+
+; --------------------------------------------------------------------------
+; Hide the mouse pointer. Always called with interrupts disabled.
+
+hide := MouseOff
+
+; --------------------------------------------------------------------------
+; Show the mouse pointer. Always called with interrupts disabled.
+
+show := MouseUp
+
+; --------------------------------------------------------------------------
+; Move the mouse pointer X position to the value in .XA. Always called with
+; interrupts disabled.
+
+.proc movex
+
+ rts
+
+.endproc
+
+; --------------------------------------------------------------------------
+; Move the mouse pointer Y position to the value in .XA. Always called with
+; interrupts disabled.
+
+.proc movey
+
+ rts
+
+.endproc
+
+; --------------------------------------------------------------------------
+; Callback structure
+
+.rodata
+
+_mouse_def_callbacks:
+ .addr hide
+ .addr show
+ .addr movex
+ .addr movey
+
+
--- /dev/null
+;
+; Name of the standard mouse driver
+;
+; 2010-01-25, Greg King
+;
+; const char mouse_stddrv[];
+;
+ .export _mouse_stddrv
+
+ .rodata
+_mouse_stddrv: .asciiz "geos-stdmou.mou"
--- /dev/null
+;
+; Target-specific black & white values, for use by the target-shared TGI kernel
+;
+
+ .include "tgi-kernel.inc"
+
+tgi_color_black = $00
+tgi_color_white = $01
--- /dev/null
+;
+; Name of the standard tgi driver
+;
+; Oliver Schmidt, 2011-05-02
+;
+; const char tgi_stddrv[];
+;
+
+ .export _tgi_stddrv
+
+.rodata
+
+_tgi_stddrv: .asciiz "geos-tgi.tgi"