1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-22 12:30:41 +00:00

added dio interface, standard mouse and joystick functions, osmaperrno

git-svn-id: svn://svn.cc65.org/cc65/trunk@773 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
izydorst 2001-07-03 20:24:28 +00:00
parent 6a988b4859
commit 823329443f
16 changed files with 871 additions and 11 deletions

View File

@ -114,6 +114,7 @@ geoslib:
for i in geos common runtime; do \
CC=$(CC) \
AS=$(AS) \
AR=$(AR) \
CFLAGS="-Osir -g -t geos -I../../include" \
AFLAGS="-t geos" \
$(MAKE) -C $$i || exit 1; \

View File

@ -2,14 +2,7 @@
# Makefile for GEOS lib
# for cc65
#
# Maciej 'YTM/Alliance' Witkowiak
export CC = ../../../src/cc65
export CFLAGS = -O
export AS = ../../../src/ca65/ca65
export ASFLAGS =
AR = ../../src/ar65/ar65
# Maciej 'YTM/Elysium' Witkowiak
OBJ_DIRS=disk dlgbox file graph menuicon memory mousesprite process system

View File

@ -8,7 +8,7 @@
@$(AS) -o $@ $(AFLAGS) $<
S_OBJS = crt0.o
S_OBJS = crt0.o oserror.o
all: $(S_OBJS)

View File

@ -0,0 +1,86 @@
;
; Ullrich von Bassewitz, 17.05.2000
; GEOS port: Maciej 'YTM/Elysium' Witkowiak
; 2.7.2001
;
; int __fastcall__ _osmaperrno (unsigned char oserror);
; /* Map a system specific error into a system independent code */
;
.export __osmaperrno
.include "../../common/errno.inc"
.include "../inc/const.inc"
.code
__osmaperrno:
ldx #ErrTabSize
@L1: cmp ErrTab-2,x ; Search for the error code
beq @L2 ; Jump if found
dex
dex
bne @L1 ; Next entry
; Code not found, return EINVAL
lda #<EINVAL
ldx #>EINVAL
rts
; Found the code
@L2: lda ErrTab-1,x
ldx #$00 ; High byte always zero
rts
.rodata
ErrTab:
.byte NO_BLOCKS, EINVAL ; ???
.byte INV_TRACK, EINVAL ; invalid track&sector pair
.byte INSUFF_SPACE, ENOSPC ; out of space
.byte FULL_DIRECTORY, ENOSPC ; directory is full
.byte FILE_NOT_FOUND, ENOENT ; file not found
.byte BAD_BAM, EIO ; bam inconsistent
.byte UNOPENED_VLIR, EINVAL ; using VLIR file without opening
.byte INV_RECORD, EINVAL ; using >128 VLIR record number
.byte OUT_OF_RECORDS, ENOSPC ; cannot insert/add record
.byte STRUCT_MISMAT, EINVAL ; ???
.byte BFR_OVERFLOW, ENOMEM ; file longer than buffer or end of file
.byte CANCEL_ERR, EIO ; ???
.byte DEV_NOT_FOUND, ENODEV ; device not found
.byte INCOMPATIBLE, EINVAL ; ???
; .byte 20, ; Read error
; .byte 21, ; Read error
; .byte 22, ; Read error
; .byte 23, ; Read error
; .byte 24, ; Read error
; .byte 25, ; Write error
.byte 26, EACCES ; Write protect on
; .byte 27, ; Read error
; .byte 28, ; Write error
; .byte 29, ; Disk ID mismatch
; .byte 30, ; Syntax error
; .byte 31, ; Syntax error
; .byte 32, ; Syntax error
.byte 33, EINVAL ; Syntax error (invalid file name)
.byte 34, EINVAL ; Syntax error (no file given)
; .byte 39, ; Syntax error
; .byte 50, ; Record not present
; .byte 51, ; Overflow in record
; .byte 52, ; File too large
.byte 60, EINVAL ; Write file open
.byte 61, EINVAL ; File not open
.byte 62, ENOENT ; File not found
.byte 63, EEXIST ; File exists
.byte 64, EINVAL ; File type mismatch
; .byte 65, ; No block
; .byte 66, ; Illegal track or sector
; .byte 67, ; Illegal system track or sector
.byte 70, EBUSY ; No channel
; .byte 71, ; Directory error
; .byte 72, ; Disk full
; .byte 73, ; DOS version mismatch
ErrTabSize = (* - ErrTab)

View File

@ -11,7 +11,8 @@ S_OBJS = blkalloc.o calcblksfree.o changediskdevice.o chkdkgeos.o enterturbo.o e
findbambit.o freeblock.o getblock.o getdirhead.o getptrcurdknm.o newdisk.o\
nxtblkalloc.o opendisk.o purgeturbo.o putblock.o putdirhead.o readblock.o\
readbuff.o setnextfree.o setgeosdisk.o writeblock.o writebuff.o verwriteblock.o\
gettrse.o
gettrse.o\
dio_openclose.o dio_cts.o dio_stc.o dio_read.o dio_write.o dio_writev.o
all: $(S_OBJS)

188
libsrc/geos/disk/dio_cts.s Normal file
View File

@ -0,0 +1,188 @@
;
; Maciej 'YTM/Elysium' Witkowiak
; 2.7.2001
;
;
; unsigned char __fastcall__ dio_phys_to_log(dhandle_t handle,
; dio_phys_pos *physpos, /* input */
; sectnum_t *sectnum); /* output */
;
; dhandle_t - 16bit (ptr)
; sectnum_t - 16bit
;
.export _dio_phys_to_log
.export sectab_1541_l, sectab_1541_h ; for log_to_phys
.import popax,__oserror
.importzp ptr1,ptr2,ptr3,tmp1,tmp2,tmp3,tmp4
.include "../inc/dio.inc"
.include "../inc/geossym.inc"
.include "../inc/const.inc"
.proc _dio_phys_to_log
sta ptr1
stx ptr1+1 ; pointer to result
jsr popax
sta ptr2
stx ptr2+1 ; pointer to input structure
jsr popax
sta ptr3
stx ptr3+1 ; pointer to handle
ldy #sst_flag
lda (ptr3),y
and #128
beq _inv_hand ; handle not open or invalid
ldy #diopp_head
bne _inv_data ; there is only head 0
ldy #diopp_track
lda (ptr2),y
beq _inv_data ; there is no track 0
sta tmp1
iny
lda (ptr2),y
bne _inv_data ; there are no more than 256 tracks
dec tmp1 ; normalize track to start from 0
ldy #diopp_sector
lda (ptr2),y
sta tmp2
iny
lda (ptr2),y
bne _inv_data ; there are no more than 256 sectors
; tmp1 (int) holds track+sector, translate it using device info
ldy #sst_driveno
lda (ptr3),y
tay
lda driveType,y
and #%00000011 ; this is for RamDrive compatibility
cmp #DRV_1541
beq dio_cts1541
cmp #DRV_1571
beq dio_cts1571
cmp #DRV_1581
beq dio_cts1581
; unknown device, return what you have got
dio_ctsend:
ldy #1
lda tmp2
sta (ptr1),y
dey
lda tmp1
sta (ptr1),y
ldx #0
txa
ret:
sta __oserror
rts ; return success
; errors
_inv_data:
lda #INV_TRACK
.byte $2c
_inv_hand:
lda #INCOMPATIBLE
ldx #0
beq ret
; device-depended stuff, tmp1=track-1, tmp2=sector
dio_cts1541:
ldy tmp1
cpy #35
bcs _inv_data
lda sectab_1541_l,y
clc
adc tmp2
sta tmp1
lda sectab_1541_h,y
adc #0
sta tmp2
jmp dio_ctsend
dio_cts1571:
lda tmp1
cmp #70
bcs _inv_data
cmp #35 ; last track of one side
bcs _sub35
jmp dio_cts1541 ; track <=35 - same as 1541
_sub35:
sec
sbc #35
sta tmp1
jsr dio_cts1541 ; get offset on second side of disk
lda tmp1 ; add second side base
clc
adc #<683
sta tmp1
lda tmp2
adc #>683
sta tmp2
jmp dio_ctsend
dio_cts1581:
; 1581 has 80 tracks, 40 sectors each secnum=track*40+sector
ldx #0
stx tmp3
stx tmp4
lda tmp1
beq _nomult
cmp #80
bcs _inv_data
; mul40 by Christian Groessler
sta tmp4
asl a
rol tmp3
asl a
rol tmp3 ; val * 4
adc tmp4
bcc L1
inc tmp3 ; val * 5
L1: asl a
rol tmp3 ; val * 10
asl a
rol tmp3
asl a
rol tmp3 ; val * 40 = AX
ldx tmp3
sta tmp3
stx tmp4
_nomult:
lda tmp2
clc
adc tmp3
sta tmp1
lda tmp4
adc #0
sta tmp2
jmp dio_ctsend
.endproc
.rodata
sectab_1541_l:
.byte $00, $15, $2a, $3f, $54, $69, $7e, $93
.byte $a8, $bd, $d2, $e7, $fc, $11, $26, $3b
.byte $50, $65, $78, $8b, $9e, $b1, $c4, $d7
.byte $ea, $fc, $0e, $20, $32, $44, $56, $67
.byte $78, $89, $9a, $ab
sectab_1541_h:
.byte $00, $00, $00, $00, $00, $00, $00, $00
.byte $00, $00, $00, $00, $00, $01, $01, $01
.byte $01, $01, $01, $01, $01, $01, $01, $01
.byte $01, $01, $02, $02, $02, $02, $02, $02
.byte $02, $02, $02, $02

View File

@ -0,0 +1,84 @@
;
; Maciej 'YTM/Elysium' Witkowiak
;
; based on Atari version by Christian Groessler
; 2.7.2001
;
; dhandle_t __fastcall__ dio_open (driveid_t drive_id);
; unsigned char __fastcall__ dio_close (dhandle_t handle);
;
; dio_open sets given device as current and initializes disk
; dio_close does nothing special
.export _dio_open, _dio_close
.import __oserror, _OpenDisk
.importzp ptr1, tmp1
.include "../inc/dio.inc"
.include "../inc/jumptab.inc"
.include "../inc/geossym.inc"
.include "../inc/const.inc"
.bss
sectsizetab:
.res 4 * sst_size ; this is hardcoded
.code
.proc _dio_open
pha
tax
lda driveType,x ; check if there's a device
bne _inv_drive
clc
adc #8 ; normalize devnum
sta curDevice
jsr SetDevice
jsr _OpenDisk ; take care for errors there
pla
tay ; drive #
asl a ; make index from drive id
asl a
tax
lda #0
sta sectsizetab+sst_sectsize,x
lda #128
sta sectsizetab+sst_flag,x ; set flag that drive is "open"
lda #1
sta sectsizetab+sst_sectsize+1,x
tya
sta sectsizetab+sst_driveno,x
stx tmp1
lda #<sectsizetab
clc
adc tmp1
sta tmp1
lda #>sectsizetab
adc #0
tax
lda tmp1
rts
_inv_drive:
lda #DEV_NOT_FOUND
sta __oserror
lda #0
tax
rts
.endproc
.proc _dio_close
sta ptr1
stx ptr1+1
lda #0
ldy #sst_flag
sta (ptr1),y
sta __oserror ; success
tax
rts ; return no error
.endproc

View File

@ -0,0 +1,32 @@
;
; Maciej 'YTM/Elysium' Witkowiak
; 2.7.2001
;
; this function is used by dio_read and dio_write to fix parameters (secnum)
;
.import popax,pushax,_dio_log_to_phys
.export dio_params,dio_secnum
.include "../inc/geossym.inc"
.bss
dio_secnum: .res 2
.code
.proc dio_params
sta r4L
stx r4H
jsr popax
sta dio_secnum
stx dio_secnum
lda #<dio_secnum
ldx #>dio_secnum
jsr pushax
lda #<r1L
ldx #>r1H
jmp _dio_log_to_phys
.endproc

View File

@ -0,0 +1,25 @@
;
; Maciej 'YTM/Elysium' Witkowiak
; 2.7.2001
;
; this file provides the _dio_read function
;
; unsigned char __fastcall__ dio_read(dhandle_t handle,sectnum_t sect_num,void *buffer);
; dhandle_t - 16bit (ptr)
; sectnum_t - 16bit
;
.import dio_params
.export _dio_read
.include "../inc/geossym.inc"
.include "../inc/jumptab.inc"
.proc _dio_read
jsr dio_params
jsr ReadBlock
stx errno
txa
rts
.endproc

180
libsrc/geos/disk/dio_stc.s Normal file
View File

@ -0,0 +1,180 @@
;
; Maciej 'YTM/Elysium' Witkowiak
; 2.7.2001
;
; unsigned char __fastcall__ dio_log_to_phys(dhandle_t handle,
; sectnum_t *sectnum, /* input */
; dio_phys_pos *physpos); /* output */
;
; dhandle_t - 16bit (ptr)
; sectnum_t - 16bit
;
.export _dio_log_to_phys
.importzp ptr1,ptr2,ptr3,tmp1,tmp2
.import popax,__oserror
.import sectab_1541_l, sectab_1541_h
.include "../inc/dio.inc"
.include "../inc/geossym.inc"
.include "../inc/const.inc"
.proc _dio_log_to_phys
; check device type
sta ptr1
stx ptr1+1 ; pointer to result (struct dio_phys_pos)
jsr popax
sta ptr2
stx ptr2+1 ; pointer to input structure (pointer to int)
jsr popax
sta ptr3
stx ptr3+1 ; pointer to handle
ldy #sst_flag
lda (ptr3),y
and #128
beq _inv_hand ; handle not open or invalid
; fill in all we have
ldy #diopp_head
lda #0 ; head 0
sta (ptr1),y
ldy #diopp_track+1
sta (ptr1),y ; track <256
ldy #diopp_sector+1
sta (ptr1),y ; sector <256
ldy #0
lda (ptr2),y
sta tmp1
iny
lda (ptr2),y
sta tmp2
; get drive info
ldy #sst_driveno
lda (ptr3),y
tay
lda driveType,y
and #%00000011 ; this is for RamDrive compatibility
cmp #DRV_1541
beq dio_stc1541
cmp #DRV_1571
beq dio_stc1571
cmp #DRV_1581
beq dio_stc1581
; ...
dio_stcend:
ldy #diopp_track
lda tmp1
sta (ptr1),y
ldy #diopp_sector
lda tmp2
sta (ptr1),y
ldx #0
txa
_ret:
sta __oserror
rts ; return success
; errors
_inv_data:
lda #INV_TRACK
.byte $2c
_inv_hand:
lda #INCOMPATIBLE
ldx #0
beq _ret
dio_stc1541:
; if 1541:
; - compare with table to find track
; - subtract and find sector
ldx #0 ; index=(track-1)
_loop41:
lda tmp2
cmp sectab_1541_h+1,x
bne _nxt
lda tmp1
cmp sectab_1541_l+1,x
bcc _found
_nxt: inx
cpx #35
bne _loop41
beq _inv_data
_found:
lda tmp1
sec
sbc sectab_1541_l,x
sta tmp2
_fndend:
inx
stx tmp1
jmp dio_stcend
dio_stc1571:
; if 1571:
; - check size, if too big - subtract and add 35 to track
; - fall down to 1541
lda tmp2
cmp #>683
bne _cnt71
lda tmp1
cmp #<683
bcc dio_stc1541
_cnt71:
lda tmp1
sec
sbc #<683
sta tmp1
lda tmp2
sbc #>683
sta tmp2
jsr dio_stc1541 ; will fall through here
ldy #diopp_track
lda (ptr1),y
clc
adc #35
sta (ptr1),y
lda #0
beq _ret
; if 1581:
; - subtract 40 in loop (at most 80 times) to find track
; - the remainder is sector
dio_stc1581:
ldx #0 ; index=(track-1)
_loop81:
lda tmp2
bne _sub81
lda tmp1
cmp #40
bcc _got81
_sub81: lda tmp1
sec
sbc #40
sta tmp1
lda tmp2
sbc #0
sta tmp2
inx
cpx #81
bne _loop81
beq _inv_data
_got81: lda tmp1
sta tmp2
inx
stx tmp1
jmp dio_stcend
.endproc

View File

@ -0,0 +1,25 @@
;
; Maciej 'YTM/Elysium' Witkowiak
; 2.7.2001
;
; this file provides the _dio_write function
;
; unsigned char __fastcall__ dio_write(dhandle_t handle,sectnum_t sect_num,const void *buffer);
; dhandle_t - 16bit (ptr)
; sectnum_t - 16bit
;
.import dio_params
.export _dio_write
.include "../inc/geossym.inc"
.include "../inc/jumptab.inc"
.proc _dio_write
jsr dio_params
jsr WriteBlock
stx errno
txa
rts
.endproc

View File

@ -0,0 +1,25 @@
;
; Maciej 'YTM/Elysium' Witkowiak
; 2.7.2001
;
; this file provides the _dio_write function
;
; unsigned char __fastcall__ dio_write_verify(dhandle_t handle,sectnum_t sect_num,const void *buffer);
; dhandle_t - 16bit (ptr)
; sectnum_t - 16bit
;
.import dio_params
.export _dio_write_verify
.include "../inc/geossym.inc"
.include "../inc/jumptab.inc"
.proc _dio_write_verify
jsr dio_params
jsr VerWriteBlock
stx errno
txa
rts
.endproc

19
libsrc/geos/inc/dio.inc Normal file
View File

@ -0,0 +1,19 @@
;-------------------------------------------------------------------------
; OFFSETS INTO SECTSIZETAB (DIO functions)
;-------------------------------------------------------------------------
sst_flag = 0 ; length 1
sst_sectsize = 1 ; 2
sst_driveno = 3 ; 1 (drive #)
sst_size = 4 ; size of one entry
; if changed, adapt diopncls.s
;-------------------------------------------------------------------------
; OFFSETS INTO dio_phys_pos
;-------------------------------------------------------------------------
diopp_head = 0 ; head
diopp_track = 1 ; track / cylinder
diopp_sector = 3 ; sector
diopp_size = 5 ; size of structure

View File

@ -11,7 +11,8 @@
S_OBJS = startmousemode.o clearmousemode.o mouseup.o mouseoff.o\
drawsprite.o possprite.o enablsprite.o disablsprite.o\
ismseinregion.o inittextprompt.o promptoff.o prompton.o\
getnextchar.o
getnextchar.o\
mouse.o readjoy.o
all: $(S_OBJS)

View File

@ -0,0 +1,160 @@
;
; Maciej 'YTM/Elysium' Witkowiak
;
; 2.7.2001
;
; Wrapper for GEOS standard input device interface
;
.export _mouse_init, _mouse_done
.export _mouse_hide, _mouse_show
.export _mouse_box, _mouse_info
.export _mouse_x, _mouse_y
.export _mouse_move, _mouse_buttons
.import popax, popsreg, addysp1
.importzp sp, sreg
.include "../inc/const.inc"
.include "../inc/jumptab.inc"
.include "../inc/geossym.inc"
; .macpack generic
.code
; --------------------------------------------------------------------------
;
; unsigned char __fastcall__ mouse_init (unsigned char port,
; unsigned char sprite,
; unsigned char type);
;
_mouse_init:
jsr popax ; ignore all parameters
jsr StartMouseMode
jsr MouseOff
lda #0
sta mouseTop
sta mouseLeft
sta mouseLeft+1
lda #199
sta mouseBottom
lda #<319
sta mouseRight
lda #>319
sta mouseRight+1
lda #0
; --------------------------------------------------------------------------
;
; void mouse_done (void);
;
_mouse_done:
rts
; --------------------------------------------------------------------------
;
; void mouse_hide (void);
;
_mouse_hide = MouseOff
; --------------------------------------------------------------------------
;
; void mouse_show (void);
;
_mouse_show = MouseUp
; --------------------------------------------------------------------------
;
; void __fastcall__ mouse_box (int minx, int miny, int maxx, int maxy);
;
_mouse_box:
ldy #0 ; Stack offset
sta mouseBottom
; stx YMax+1 ; maxy
lda (sp),y
sta mouseRight
iny
lda (sp),y
sta mouseRight+1 ; maxx
iny
lda (sp),y
sta mouseTop
iny
; lda (sp),y
; sta YMin+1 ; miny
iny
lda (sp),y
sta mouseLeft
iny
lda (sp),y
sta mouseLeft+1 ; minx
jmp addysp1 ; Drop params, return
; --------------------------------------------------------------------------
;
; int __fastcall__ mouse_x (void);
;
_mouse_x:
lda mouseXPos
ldx mouseXPos+1
rts
; --------------------------------------------------------------------------
;
; int __fastcall__ mouse_y (void);
;
_mouse_y:
lda mouseYPos
ldx #0
rts
; --------------------------------------------------------------------------
;
; void mouse_info (...);
;
_mouse_info:
rts
; --------------------------------------------------------------------------
;
; void __fastcall__ mouse_move (int x, int y);
;
_mouse_move:
jsr popsreg ; Get X
sei ; Disable interrupts
sta mouseYPos
; stx YPos+1
lda sreg
ldx sreg+1
sta mouseXPos
stx mouseXPos+1
rts
; --------------------------------------------------------------------------
;
; unsigned char mouse_buttons (void);
;
_mouse_buttons:
lda pressFlag
and #SET_MOUSE
lsr
rts

View File

@ -0,0 +1,40 @@
;
; Ullrich von Bassewitz, 23.09.1998
;
; unsigned readjoy (unsigned char joy);
;
.export _readjoy
.include "../inc/geossym.inc"
.proc _readjoy
tax ; Joystick number into X
bne joy2
; Read joystick 1
joy1: lda #$7F
sei
sta cia1base
lda cia1base+1
cli
and #$1F
eor #$1F
rts
; Read joystick 2
joy2: ldx #0
lda #$E0
ldy #$FF
sta cia1base+2
lda cia1base+1
sty cia1base+2
and #$1F
eor #$1F
rts
.endproc