Newer
Older
uBix-Retro / dump / oa-2.0.9 / sysapps / fs / fsiec.a65
/****************************************************************************
   
    OS/A65 Version 2.0.0
    Multitasking Operating System for 6502 Computers

    Copyright (C) 1989-1998 Andre Fachat 

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

****************************************************************************/

/*
 * TODO:
 *
 * This file is only loosely adapted to the 1.4 code.
 * In fact the push flag and the error code features have to 
 * be implemented.
 */

#ifndef ROM

#ifndef FSIEC_DEVICE
#define	FSIEC_DEVICE	"siec_gecko.a65"
#endif

/*#define   INVERT*/
#define   PARALLEL    
/*#define   NOCMD*/
/*#define   NOFS*/
/*#define   SHOW*/           /* test-define */
#define   NOLOOP
/*#define   NOPRG*/
#define   STDTST

#endif	/* ROM */

          .(
#ifdef ROM
start     .word ende            ; pointer to end of file in ROM
#ifdef FSIEC_AS_INIT
          .byt  PK_INIT+$80     ; file type = filesystem + auto-execute bit
#else
          .byt  PK_FS+$80       ; file type = filesystem + auto-execute bit
#endif
          .word PRG             ; execution start
          .byt  16              ; RAM size in 256-byte blocks
          .byt  >$ff-ROMSTART; $ff-start ; shared mem size in 256-byte blocks
          .byt  0               ; priority
          .word 0               ; stdin, stdout/stderr device number
          .asc  "fsiec",0,0     ; command line

#else	/* ROM */

;#include  "stdio.a65"
#include  "kdefs.i65"
#include  "kernel.i65"
#include  "fdefs.i65"

#ifdef NOPRG

          .word $800
          *=$800
          jmp PRG

#else
;          .word $800
          *=$800
          .word 0
          .byt PK_PRG    ;PK_FS+$80
          .byt 8
          .word 0
          .word PRG
          .byt <-1

#endif
#endif          

#include  "fsdef.i65"

#ifndef FSIEC_ANZDRV
#define	FSIEC_ANZDRV	4
#endif

#define   MAXLEN    64

#define   MAXFILE   6
#define   BUFSIZE   128


#define   FT_MOD         0
#define   FT_STR         1
#define   FT_BYT         2
#define   FT_BYT2        3
#define   FT_ST          4
#define   FT_BYT3        5
#define   FT_DRV         6
#define   FT_BUF         7
#define   FT_SLEN        8
#define   FT_MOD_FRE     0
#define   FT_MOD_IN      1
#define   FT_MOD_OUT     2
#define   FT_MOD_EOF     3
#define   FT_MOD_DIR     4
#define   ANZ_FT         16

#if 0

#ifndef NOMMU
-syszp    =$40
-sysmem   =$300
-sysblk   =$800
#endif

#echo fsiec:
#print syszp
#print sysmem
#print sysblk

#endif

	.data
IECBUF	  .dsb MAXLEN

	.zero
fzei      .word 0
bzei      .word 0

	.data
owntask   .byt 0
cnt       .byt 0
cmd       .byt 0
anz       .byt 0
client    .byt 0
actfil    .byt 0
ftab      .dsb F_SLEN*MAXFILE

	.bss
buf       .dsb MAXFILE*BUFSIZE

	.text

#ifdef SHOW
	.data
showcnt   .byt 0
	.text
#endif

PRG       .(
          stx owntask

#ifdef SHOW
          lda #0
          sta showcnt
#endif
          jsr IECINIT		/* init interface */
          bcs fterm

#ifndef NOLOOP
          jsr iniftab
          jsr iniass
          jsr inipfad
          jsr iniunit
#endif
          ldx #<-1
          jsr setzei     ; init setzei (actfil)
          ldx #0
          stx anz
p1        jsr setzei
          lda #F_FL_FRE
          ldy #F_FL
          sta (fzei),y
          inx
          cpx #MAXFILE
          bcc p1

#ifndef NOFS
	  ; we now inherit PCBUF from FORK - if started as PK_FS, not PK_INIT
	  ; clc
	  ; ldx #SEM_SENDBUF
	  ; jsr PSEM

          lda #FSIEC_ANZDRV         ; 2 Drives
          sta PCBUF+FM_REG_DRVS
          lda owntask
          sta PCBUF+FM_REG_ENV
          lda #FM_REG
          ldx #SEND_FM   
          ldy #2
          jsr SEND

	  php
	  ldx #SEM_SENDBUF
	  jsr VSEM
	  plp

          bcs fterm
#else
	  ; if we don't need it, we have to release it now
	  ldx #SEM_SENDBUF
	  jsr VSEM
#endif

          .(
	  jsr getif
          ldx #20        ; nach dem Einschalten Autostart VC1541 
x0        jsr setti      ; ueberspringen
x1        jsr fragti
          beq x1
          dex
          bne x0
	  jsr freif
          .)

          jmp loop
fterm      
	  jmp TERM


          .(
#ifdef SHOW

	.data
dx        .byt 0
	.text

&&CRLFOUT
          lda #13
          jsr OUT
          lda #10
&&OUT
          stx dx
/*          ldx #$3c
          stx $e888
          sei
          ldx #$10
          stx $eff8
          ldx showcnt
          sta $8000,x
          inc showcnt*/
          ldx #STDOUT
          jsr SOUT
          ldx dx
          rts
#endif

&&SOUT    pha
          jsr PUTC
          pla            
          bcc ok         
          jsr YIELD
          jmp SOUT
ok        clc
          rts
          .)

#ifdef SHOW

&HEXOUT   .(
          pha
          lsr
          lsr
          lsr
          lsr
          jsr nib
          pla
          and #$0f
          jsr nib
          lda #0
h1        clc
          adc #251            ; prim
          bne h1
          jmp YIELD   
nib       clc
          adc #"0"
          cmp #"9"+1
          bcc out
          adc #"A"-("9"+1)-1
out       jmp OUT
          .)
          
&savdata  .(
          pha
          tya
          pha
          sei
          lda #$18
          sta $eff8
          ldy #0
sd1       lda $300,y
          sta $8000,y
          lda $400,y
          sta $8100,y
          lda $500,y
          sta $8200,y
          lda $600,y
          sta $8300,y
          iny
          bne sd1
          pla
          tay
          pla
          cli
          rts
          .)
#endif

/**************************************************************************/

loop      
#ifndef NOLOOP
          jsr INLOOP		; check for ATN on bus 
#endif
          jsr YIELD
#ifdef NOFS
          jmp loop
#else
				/* no loop -> RECEIVE may block */
				/* TODO: multithread! */
#ifdef NOLOOP			
	  lda anz		; check if we have open files
	  bne l1xxx		; if no then
	  sec			; block while trying to RECEIVE
	  .byt $24
#endif
l1xxx
          clc
          jsr RECEIVE		; check for fs command
          bcs l1
          jsr rxmess
l1        
	  ; check all open streams and read/write new data if needed
	  ldx #0
          stx anz
          stx cnt
l2        jsr setzei
          ldy #F_FL
          lda (fzei),y
          cmp #F_FL_EOF+1
          bcc l2a
          jmp nextl

l2a       inc anz
          ldy #F_MODE
          lda (fzei),y
          cmp #F_MODE_RD
          bne l3

ol
#if 0	/*ndef OLDROM*/
	.zero
b2zei 	.word 0
	.text

	  ldy #F_LEN
	  lda (fzei),y
	  sec
	  ldy #F_BYT
	  sbc (fzei),y
	  beq l4
	  pha
	  lda (fzei),y
	  clc
	  adc bzei
	  sta b2zei
	  lda bzei+1
	  adc #0
	  sta b2zei+1

	  ldy #F_STR
	  lda (fzei),y
	  tax
	  pla
	  ldy #b2zei
	  jsr PUTB
	  bcs l5n
	  ldy #F_BYT
	  adc (fzei),y
	  sta (fzei),y
	  jmp ol
#else
          ldy #F_BYT
          lda (fzei),y
          ldy #F_LEN
          cmp (fzei),y
          beq l4
          pha
          ldy #F_STR
          lda (fzei),y
          tax
          pla
          tay
          lda (bzei),y
          jsr PUTC
          bcs l5n
          ldy #F_BYT
          lda (fzei),y
          clc
          adc #1
          sta (fzei),y
          jmp ol
#endif
l4
          ldy #F_FL
          lda (fzei),y
          cmp #F_FL_EOF
          bne l4a
          ldy #F_STR
          lda (fzei),y
          tax
          lda #SC_EOF
          jsr STRCMD
          jsr close
          jmp nextl
l4a       jsr clrbuf
          jsr loadbuf
          bcc l5

	  and #%10111111	; check status
	  beq eofonly
;.byt 2
	  ldy #F_STR
	  lda (fzei),y
	  tax
	  lda #SC_SSTAT
	  ldy #SCE_WERRM	; unrecoverable error
	  jsr STRCMD
eofonly  
          ldy #F_FL
          lda #F_FL_EOF
          sta (fzei),y
l5        jmp nextl

l5n       cmp #E_NUL
          bne l5
          ldy #F_STR
          lda (fzei),y
          tax
          lda #SC_EOF
          jsr STRCMD
          jsr close
          jmp nextl

l3        cmp #F_MODE_WR
          bne l8
il          
#if 0 	/*ndef OLDROM*/
	  lda #BUFSIZE
	  sec
	  ldy #F_BYT
	  sbc (fzei),y
	  beq l6

	  pha
	  lda (fzei),y
	  clc
	  adc bzei
	  sta b2zei
	  lda bzei+1
	  adc #0
	  sta b2zei+1

	  ldy #F_STR
	  lda (fzei),y
	  tax
	  pla
	  ldy #bzei
	  jsr GETB
	  bcs l7
	  ldy #F_BYT
	  adc (fzei),y
	  sta (fzei),y
	  jmp il
#else
          ldy #F_BYT
          lda (fzei),y
          cmp #BUFSIZE
          beq l6
          pha
          ldy #F_STR
          lda (fzei),y
          tax
          pla
          tay
          jsr GETC
          bcs l7
          sta (bzei),y
          ldy #F_BYT
          lda (fzei),y   
          clc
          adc #1
          sta (fzei),y
          jmp il
#endif

l7        cmp #E_EOF
          bne l8
          ldy #F_STR
          lda (fzei),y
          tax
          lda #SC_NUL
          jsr STRCMD
          jsr savebuf
	  bcc noserr

serr	  ldy #F_STR
	  lda (fzei),y
	  tax
	  ldy #SCE_RERRM
	  lda #SC_SSTAT
	  jsr STRCMD
noserr
          jsr close
          jmp nextl

l6        jsr savebuf
	  bcs serr
          jsr clrbuf
          jmp nextl

l8 nextl  inc cnt
          ldx cnt
          cpx #MAXFILE
          bcs endloop
          jmp l2
endloop   jmp loop
          .)

/**************************************************************************/

savebuf   .(
	  jsr getif

          jsr setfpar
          clc
          ldy #F_BYT
          lda (fzei),y
          beq lbe 
          jsr LISTEN
          jsr SECLISTEN
          lda #0
lb1       tay
          lda (bzei),y
          jsr IECOUT
          iny
          bcs lbe
          tya
          ldy #F_BYT
          cmp (fzei),y
          bcc lb1
lbe       php
	  jsr geterr
	  pha
          jsr UNLISTEN
	  jsr freif
	  pla
          plp
          rts
          .)
 
loadbuf   .(
	.data
dirtst    .byt 0
	.text
	  jsr getif

          ldy #F_FL
          lda (fzei),y
          cmp #F_FL_DIR
          beq loadirbuf
          jsr setfpar
          jsr TALK
          jsr SECTALK
          ldy #0
lb1       jsr IECIN
          sta (bzei),y
          iny
          bcs lbe
          cpy #BUFSIZE
          bcc lb1
          clc
lbe	  
	  php
	  jsr geterr
	  pha
          tya
          ldy #F_LEN
          sta (fzei),y
          jsr UNTALK
	  jsr freif
	  pla
          plp
          rts

loadirbuf 
;.byt 2
	  jsr setfpar
          jsr TALK
          jsr SECTALK
          jsr IECIN
	  bcs gdxx
          jsr IECIN
	  bcs gdxx
          lda #FS_DIR_MOD_FRE
          ldy #FS_DIR_MODE
          sta (bzei),y
          ldy #FS_DIR_LEN
          lda #0
          sta (bzei),y
          iny
          jsr IECIN
          bcs gdxx
          sta (bzei),y
          iny
          jsr IECIN
          bcs gdxx
          sta (bzei),y
          iny
          lda #0
          sta (bzei),y
          ldx #6
          ldy #FS_DIR_YEAR
gd1       lda data-FS_DIR_YEAR,y
          sta (bzei),y
          iny
          dex
          bne gd1
gd2       jsr IECIN
gdxx      bcs gdxx2
          cmp #34
          beq gd2x
          cmp #18        ; revers
          bne gd2
          lda #FS_DIR_MOD_NAM
          ldy #FS_DIR_MODE
          sta (bzei),y
gd2y      jsr IECIN
          bcs gdxx2
          cmp #34
          bne gd2y
          beq gd3a
gd2x      ldy #FS_DIR_MODE
          lda #FS_DIR_MOD_FIL
          sta (bzei),y
gd3a      ldy #FS_DIR_NAME
gd3       jsr IECIN
          bcs gdxx2
          cmp #34
          beq gd4
          jsr CBM2ASC
          sta (bzei),y
          iny
          cpy #BUFSIZE-7
          bcc gd3
          jmp gde
gd4       
          lda #","
          sta (bzei),y
          iny
          sty dirtst
gd5       jsr IECIN
gdxx2     bcs gdx
          cmp #" "
          beq gd5
          cmp #0
          beq gdy2
          bne gd6
gd6a      jsr IECIN
          bcs gdx
gd6       jsr CBM2ASC
          sta (bzei),y
          cmp #0
          beq gd6b2
          cmp #" "
          beq gd6b
          iny
          cpy #BUFSIZE-1
          bcc gd6a
          
gd6b      jsr IECIN
          bcs gdx 
          cmp #0
          bne gd6b
          
gd6b2     lda #0
          sta (bzei),y
          iny
          tya
          ldy #F_LEN
          sta (fzei),y
          
          ldy dirtst
          lda (bzei),y
          cmp #"d"
          bne gde
          iny
          lda (bzei),y
          cmp #"i"
          bne gde
          iny
          lda (bzei),y
          cmp #"r"
          bne gde
          ldy #FS_DIR_MODE
          lda (bzei),y
          cmp #FS_DIR_MOD_FIL
          bne gde
          lda #FS_DIR_MOD_DIR
          sta (bzei),y
          lda dirtst
          ldy #F_LEN
          sta (fzei),y
          tay
          dey
          lda #0
          sta (bzei),y 
          
gde       ;jsr IECIN
          ;bcs gdx
          ;cmp #0
          ;bne gde
gdy2      clc
          bcc gdy
gdx       ldy #FS_DIR_NAME
          lda #0
          sta (bzei),y
          iny
          tya
          ldy #F_LEN
          sta (fzei),y
gdy       php
;.byt 2
	  jsr geterr
	  pha
          jsr UNTALK
	  jsr freif
	  pla
          plp
          rts

data      .byt 91,4,7,13,6,0
          .)
  
close     jsr setfpar
          jsr IECLOSE
          lda #F_FL_FRE
          ldy #F_FL
          sta (fzei),y
          rts

/**************************************************************************/

rxmess    .(
;.byt 2
          stx client
          cmp #FS_OPEN_RD
          bne rx1a
          lda #"r"
          bne rxop
rx1a      cmp #FS_OPEN_WR
          bne rx1b
rx1ab     lda #"w"
          bne rxop
rx1b      cmp #FS_OPEN_AP
          beq rx1x
          cmp #FS_OPEN_OW
          beq rx1ab
          jmp rx1
rx1x      lda #"a"
rxop      sta cmd
          lda PCBUF+FS_OPEN_PFAD
          bne rxepfad
          jsr getfre
          bcs rxe1
          lda PCBUF+FS_OPEN_DRV
          ldy #F_DEV
          sta (fzei),y
          jsr setfpar
          lda cmd
          jsr setfnpar
          jsr IECOPEN
          bcs rxe2
          jsr DISKST
          bcs rxe2
          lda PCBUF+FS_OPEN_STR
          ldy #F_STR
          sta (fzei),y
          lda #0
          ldy #F_DRV     
          sta (fzei),y
          lda #F_FL_OK
          ldy #F_FL
          sta (fzei),y
          jsr clrbuf
          lda cmd
          cmp #"r"
          bne rxr1
          lda #F_MODE_RD
          .byt $2c
rxr1      lda #F_MODE_WR
          ldy #F_MODE
          sta (fzei),y

          lda #E_OK
          ldx owntask
          ldy actfil
          jmp endrx

rxe2      jsr IECLOSE
          lda #E_FNODRV
          .byt $2c
rxepfad   lda #E_FNOPATH
          .byt $2c
namlenerr lda #E_FNAMLEN
          .byt $2c
rxe1      lda #E_FNOFIL
          .byt $2c
rxe0      lda #E_NOTIMP
endrx     sta PCBUF+FS_X_ERR
          ldx owntask
          stx PCBUF+FS_X_ENV
          sty PCBUF+FS_X_FIL
          ldy #FS_X_SLEN
          ldx client
          jmp SEND

rx1       cmp #FS_OPEN_DR
          beq rx1aa
          jmp rxcmds
rx1aa     lda PCBUF+FS_OPEN_PFAD
          bne rxepfad
          ldx PCBUF+FS_OPEN_DRV
          jsr setzei
          ldy #F_FL
          lda (fzei),y
          cmp #F_FL_FRE
          bne rxe1          
          lda PCBUF+FS_OPEN_DRV
          ldy #F_DEV
          sta (fzei),y
          jsr setfpar
          lda PCBUF+FS_OPEN_STR
          ldy #F_STR
          sta (fzei),y

	.(
	; remove leading DIRSIGN, as all names are assumed global
	lda PCBUF+FS_OPEN_NAME
	cmp #DIRSIGN
	bne noglobal
	ldy #<-1
l0	iny
	lda PCBUF+FS_OPEN_NAME+1,y
	sta PCBUF+FS_OPEN_NAME,y
	bne l0
noglobal
	.)
          lda PCBUF+FS_OPEN_NAME
          bne xx1a
          sta PCBUF+FS_OPEN_NAME+1
          lda #"*"
          sta PCBUF+FS_OPEN_NAME

xx1a      lda #"$"
          sta PCBUF+FS_OPEN_NAME-2
          lda #":"
          cmp PCBUF+FS_OPEN_NAME+1
          bne xx1a2
          lda #" "
xx1a2     sta PCBUF+FS_OPEN_NAME-1

          ldy #0
xx1       lda PCBUF+FS_OPEN_NAME-2,y
          beq xx2
          iny 
          bne xx1
xx2       tya
          ldy #>(PCBUF+FS_OPEN_NAME-2)
          ldx #<(PCBUF+FS_OPEN_NAME-2)
          jsr SETFNPAR
          jsr IECOPEN
;.byt 2
/*.( :bcc lll1: inc $d021: lll1 .)*/
rxe2a     bcs rxe2b
          jsr DISKST
/*.( :bcc lll1: inc $d020: lll1 .)*/
          bcs rxe2a
	jsr getif
#if 0 /*def NMIDEV*/
	lda #NMI_OFF
	jsr CTRLNMI
#endif
          jsr TALK
          jsr SECTALK
          jsr IECIN
          jsr IECIN
          jsr UNTALK
	jsr freif
#if 0 /*def NMIDEV*/
	lda #NMI_ON
	jsr CTRLNMI
#endif
          lda #0
          ldy #F_DRV     
          sta (fzei),y
          lda #F_FL_DIR
          ldy #F_FL
          sta (fzei),y
          jsr clrbuf
          lda #F_MODE_RD
          ldy #F_MODE
          sta (fzei),y

          lda #E_OK
          ldx owntask
          ldy actfil
          jmp endrx
          
rxe2b     jmp rxe2

rxcmds    
#ifdef    NOCMD
          jmp rxe0
#else
          pha
          lda PCBUF+FS_CMD_DRV
          clc
          adc #8
          tax
          ldy #15
          jsr SETFPAR
          pla
          ldx PCBUF+FS_CMD_PFAD
          beq rcr0
          jmp rxepfad
rcr0      cmp #FS_RENAME
          bne rxc2
          lda #"r"
          sta IECBUF
          
          lda #":"
          cmp PCBUF+FS_CMD_NAME+1
          bne rcr0a
          lda #" "
rcr0a     sta IECBUF+1

          ldy #FS_CMD_NAME
rcr1      lda PCBUF,y 
          beq rcr2
          iny
          bne rcr1
rcr2      ldx #2
          iny
rcr3      lda PCBUF,y
          beq rcr4
          sta IECBUF,x
          iny
          inx
          cpx #MAXLEN
          bcc rcr3
          jmp namlenerr
rcr4      lda #"="
          sta IECBUF,x
          inx
          ldy #FS_CMD_NAME
rcr5      lda PCBUF,y
          sta IECBUF,x
          beq rcr6
          iny
          inx
          cpx #MAXLEN
          bcc rcr5
          jmp namlenerr
rcr6      txa
          ldx #<IECBUF
          ldy #>IECBUF
cmds      jsr SETFNPAR
          jsr IECOPEN    
          jsr DISKST
          php
          jsr IECLOSE
          plp
          lda #E_OK
          bcc rcr7
          lda #E_NODEV
rcr7      jmp endrx

rxc2      cmp #FS_DELETE
          bne rxc3
          lda #"s"
scmds     sta PCBUF+FS_CMD_NAME-2
          lda #":"
          cmp PCBUF+FS_CMD_NAME+1
          bne sc1
          lda #" "
sc1       sta PCBUF+FS_CMD_NAME-1
          ldy #0
rcd1      lda PCBUF+FS_CMD_NAME-2,y
          beq rcd2
          iny
          bne rcd1
rcd2      tya
          ldx #<(PCBUF+FS_CMD_NAME-2)
          ldy #>(PCBUF+FS_CMD_NAME-1)
          jmp cmds
    
rxc3      cmp #FS_FORMAT 
          bne rxc4
          lda #"n"
          bne scmds      

rxc4      cmp #FS_CHKDSK
          bne rxc5
          lda #"v"
          bne scmds
          
rxc5      cmp #FS_CLOSE
          bne rxc6
          ldx PCBUF+FS_CMD_FIL
          cpx #MAXFILE
          bcs rxc5e
          jsr setzei
          ldy #F_FL
          lda (fzei),y
          cmp #F_FL_FRE
          beq rxc5e
          ldy #F_MODE
          lda (fzei),y
          cmp #F_MODE_WR
          bne rxc5a
          jsr savebuf
rxc5a     jsr close
          lda #E_OK
          .byt $2c
rxc5e     lda #E_ILLPAR
          jmp endrx

rxc6      jmp rxe0 

#endif
#endif
          .)

/**************************************************************************/

getbuf    .(
          ;ldx #0
          ;.byt $2c
&getfre  
          ldx #FSIEC_ANZDRV
          stx cnt
gf1       jsr setzei
          ldx cnt
          ldy #F_FL
          lda (fzei),y
          cmp #F_FL_FRE  
          clc
          beq gf2
          inc cnt
          ldx cnt
          cpx #MAXFILE
          bcc gf1
gf2       rts
          .)
          
#ifndef NOFS
setfnpar  .(

	.data
div       .byt 0
	.text

          pha
          ldy #0
          sty div
sfn0      lda PCBUF+FS_OPEN_NAME,y
          beq sfn1
;          cmp #","
;          bne sfn2
;          sta div
;sfn2
          iny
          bne sfn0
sfn1  
;          lda div
;          bne sfn3
;          lda #","
;          sta PCBUF+FS_OPEN_NAME,y
;          iny
;#ifndef OLDHACK
;          lda #"p"
;#else
;	  lda #"P"
;#endif
;          sta PCBUF+FS_OPEN_NAME,y
;          iny
sfn3      lda #","
          sta PCBUF+FS_OPEN_NAME,y
          iny
          pla
#ifdef OLDHACK
	  eor #$20
#endif
          sta PCBUF+FS_OPEN_NAME,y
          iny
	  ldx #<PCBUF+FS_OPEN_NAME
	  lda PCBUF+FS_OPEN_NAME
	  cmp #DIRSIGN
	  bne sfnn
	  dey
	  inx
sfnn
	  tya
          ldy #>PCBUF+FS_OPEN_NAME
          jmp SETFNPAR
          .)
          
setfpar   ldy #F_DEV
          lda (fzei),y
          clc
          adc #8
          tax
          ldy #0
          lda actfil
          cmp #FSIEC_ANZDRV
          bcc sfp1
          clc
          adc #2
          tay
sfp1      jmp SETFPAR
          
clrbuf    lda #0
          ldy #F_LEN
          sta (fzei),y
          ldy #F_BYT
          sta (fzei),y
          rts
#endif

setzei    .(             ; setzt zeiger, x=filenr
          cpx actfil
          beq sz1
          stx actfil
          txa
          asl
          asl
          asl
          clc
          adc #<ftab
          sta fzei
          lda #>ftab
          adc #0
          sta fzei+1
          txa
#if 1
	lsr
	pha
	lda #0
	ror		; clears carry
	adc #<buf
	sta bzei
	pla
	adc #>buf
	sta bzei+1
#else
          clc
          adc #>buf*2
          lsr
          sta bzei+1
          lda #<buf*2
          ror
          sta bzei
#endif
sz1       rts
          .)

ASC2CBM   .(             ; ringtausch $20->$a0->$40->$20
          cmp #"A"
          bcc tuok
          cmp #"Z"+1
          bcs tu2
          ora #$80
          bne tuok
tu2       cmp #"a"
          bcc tuok
          cmp #"z"+1
          bcs tu3
          sbc #$1f
          bne tuok
tu3       cmp #"A"+$80
          bcc tuok
          cmp #"Z"+$81
          bcs tuok
          adc #$a0
tuok      rts
          .)

CBM2ASC   .(             ; ringtausch $a0->$20->$40->$a0
          cmp #"A"
          bcc tlok
          cmp #"Z"+1
          bcs tl2
          adc #$20
          bne tlok
tl2       cmp #"a"
          bcc tlok
          cmp #"z"+1
          bcs tl3
          adc #$60
          bne tlok
tl3       cmp #"A"+$80
          bcc tlok
          cmp #"Z"+$81
          bcs tlok
          and #$7f
tlok      rts
          .)
          
/************************** IEC-Routinen **********************************/
/* hier Blocktiefe 1 */

          .(
	.zero
namzei    .word 0

	.data
secadr    .byt 0
devadr    .byt 0
namlen    .byt 0
status    .byt 0

	.text

#ifndef NOFS

          .(
&&SETFNPAR sta namlen
          stx namzei
          sty namzei+1
          rts
&&SETFPAR  stx devadr
          sty secadr
          rts
&&IECLOSE  
	jsr getif
#if 0 /*def NMIDEV*/
	lda #NMI_OFF
	jsr CTRLNMI
#endif
	  jsr LISTEN
          lda secadr
          and #$ef
          ora #$e0
          jsr seclisten
          jsr UNLISTEN
	jsr freif
#if 0 /*def NMIDEV*/
	lda #NMI_ON
	jsr CTRLNMI
#endif
          clc
          rts
&&IECOPEN  
	  jsr getif
	  lda #0
          sta status
          jsr LISTEN
;lda status:;sta $e000
          lda secadr
          ora #$f0
          jsr seclisten
;lda status:;sta $e001
          lda status
          bmi opend
          lda namlen
          beq nonam
          ldy #0
op1       lda (namzei),y
          jsr ASC2CBM         ;jsr TOUPPER
#ifdef SHOW
          pha
          JSR OUT
          pla
#endif
          jsr IECOUT
          iny
          cpy namlen
          bne op1
#ifdef SHOW
          jsr CRLFOUT
#endif
nonam     jsr UNLISTEN

;inc $d020
          ;clc
          ;rts
	  lda #E_OK
	  .byt $2c
opend     lda #E_NODEV
          ;sec
	pha
	jsr freif
	pla
#if 0 /*def NMIDEV*/
	pha
	lda #NMI_ON
	jsr CTRLNMI
	pla
#endif
	cmp #1
          rts
          
&&DISKST  
	  jsr getif 
	  lda #0
          sta status
          jsr TALK
          lda #$6f
          jsr sectalk
          jsr IECIN
          cmp #"1"
          beq lx1
          cmp #"0"
          bne lx
lx1       lda status
          bne lx
          clc
          .byt $24
lx        sec
          php
tya
pha 
ldy #0    
lxxx0
jsr IECIN
;sta $e000,y
iny
lda status
beq lxxx0
pla
tay 
          jsr UNTALK
	  jsr freif
          plp
          rts
          .)
#endif

/******************* here is the interface to the device *****************/

&TALK	lda #$40
	.byt $2c
&LISTEN	lda #$20
	ora devadr
atnout	.(
	pha

	lda #0
	sta status

	bit bytfl
	bpl l1

	sec
	ror eoifl
	jsr iecout
	
	lsr bytfl	; clear flags
	lsr eoifl	; clear flags
l1
	pla
	sta byte
	jsr iec0out
	cli
	rts
	.)

&SECTALK
	lda secadr
	ora #$60
	jmp sectalk

&SECLISTEN
	lda secadr
	ora #$60
	jmp seclisten

&IECOUT	.(
          sei
          pha
          clc
          bit bytfl
          bmi iout
          sec
          ror bytfl
          bne endout

iout      jsr iecout
          
endout    pla
          sta byte

 	  lda status
	  cmp #1
          cli
          rts
	.)

&geterr	.(
	lda status
	rts
	.)

seterror .(
	ora status
	sta status
	rts
	.)

/* 
 * device routines are:
 *  getif		get interface -> PSEM(SEM_?IEC), CTRLNMI(NMI_OFF),...
 *  freif		release interface -> VSEM(S*IEC), CTRLNMI(NMI_ON),...
 *  IECINIT		inits the device
 *  iec0out		sends a byte with ATN set
 *  sectalk		send sectalk
 *  seclisten		send seclisten
 *  IECIN		receive byte
 *  iecout		send byte
 *  UNLISTEN		send unlisten
 *  UNTALK		send untalk
 */

/* if not defined works if object file to link */
#ifdef FSIEC_DEVICE
#include FSIEC_DEVICE
#endif

#undef FSIEC_DEVICE
#undef FSIEC_ANZDRV
#undef MAXLEN 
#undef MAXFILE 
#undef BUFSIZE

	.)

ende      .)