P8000/UDOS/WEGA/K.ACT.S

1019 lines
12 KiB
ArmAsm

;*************************************************************
;
; P8000 KOPPELSOFTWARE
; MODUL: UDOS-DATEI E/A
; (angepasste REMOTE-Software)
; VERSION: 2.0
;
;*************************************************************
EXTERNAL BUF
EXTERNAL WAIT LODNET SNDNET
EXTERNAL SNDACK UEB16
GLOBAL LOAD SEND
GLOBAL ACTFLG
XFERSZ: EQU 64
BFRLEN: EQU 1000H
RL: EQU 200H ;RL=0 = DEFAULT RL
BINARY: EQU 0
QUERY: EQU 1
FILDES: EQU 2
EXEC: EQU 4
MAGIC: EQU 0D607H
S0BC EQU 27H
S0BD EQU 26H
SYSTEM: EQU 1003H
DATE: EQU 0FA2H
BTOHEX EQU 0BDFH ;AUS PROM-TEIL
SOH: EQU 01H
STX: EQU 02H
ETX: EQU 03H
EOT: EQU 04H
ACK: EQU 06H
NAK: EQU 15H ;CTRL-U
CAN: EQU 18H
ESC: EQU 1BH
;ZEITGETEILTER FLOPPY-ZUGRIFF
DISK: CALL SYSTEM
DLOOP: CALL UEB16
LD A,(IY+10)
BIT 7,A
JR Z,DLOOP
BIT 6,A
DEND: RET
;AUSGABE AUF CONSOLE
OUTAS:
LD A,(HL)
LD B,A
INC HL
SFREE IN A,(S0BC)
BIT 2,A ;SENDEPUFFER LEER
JR Z,SFREE ;NEIN
LD A,(HL) ;ZEICHEN
OUT (S0BD),A ;AUSGEBEN
INC HL
DJNZ SFREE
RET
ERROR:
LD HL,ERMSG1
CALL OUTAS
LD HL,NAMLEN
CALL OUTAS
LD A,(IY+10)
LD HL,ERNR
CALL BTOHEX
LD HL,ERMSG2
CALL OUTAS
RET
ERMSG1 DEFB 5
DEFM 'File '
ERMSG2 DEFB 11
DEFM ' Error '
ERNR: DEFW 2020H
DEFB 0DH
DEFB 0AH
NETSND: LD A,(HL)
CP 80H
RET Z
INC HL
PUSH HL
CALL SNDNET
POP HL
JR NETSND
WLODNET CALL LODNET
JR Z,WLODNET
RET
TRNBYT:
CALL LODNET
JR Z,TRNBYT
RET
MSKTRN:
CALL WLODNET
AND 7FH
RET
WAITAK:
CALL WLODNET
AND 7FH
CP ACK
RET ;ZERO IF ACK,NONZERO IF NOT
;START REQUEST
STRTRQ:
CALL SNDACK
CALL WLODNET
LD (FLGBYT),A ;WAIT FOR THE FLAGBYTE
CALL SNDACK ;ACKNOWLEDGE IF GOT
CALL FILNAM
LD IX,FLP
LD (IX),0
LD A,(FLGBYT)
BIT BINARY,A
JR Z,ASCTYP
BIT EXEC,A
JR Z,BINTYP
SET 7,(IX) ;SET PROCEDURE TYPE-FILE
RET
BINTYP:
SET 4,(IX)
RET
ASCTYP:
SET 5,(IX)
RET
;******************************************************
;LOAD REQUEST
LOAD:
RES 2,(HL)
CALL STRTRQ
BIT FILDES,A
JR Z,LOAD1
CALL CLRBUF ;DESCRIPTOR EINLESEN
LD HL,80H
LD (ABFRLEN),HL ;NEW LENGTH
LD HL,ACTFLG
SET 7,(HL)
LD DE,DARRAY
LD HL,DATE
LD BC,8
LDIR
CALL SNDACK
JR WAISTX
LOAD1:
LD (IX+01),01 ;OPEN FOR OUTPUT
LD HL,RL ;RECORD LENGTH
CALL OPNFIL
JR Z,REDTRN ;WITH NO ERROR READY FOR TRANSFER
CALL ERROR ;THERE OCCURED ANOTHER ERROR
JP CANCEL ;SEND THE CANCEL-REQUEST
REDTRN:
CALL CLRBUF
CALL SNDACK ;ACKNOWLEDGE FOR A GOOD FILE
WAISTX:
CALL MSKTRN
CP STX
JR Z,STXFON
CP CAN
JP Z,CANCIN
CP ESC
JP Z,CANCIN
JR WAISTX
STXFON:
LD HL,CHKSUM
LD (HL),0
CALL TRNBYT ;BLOCK LENGTH
LD D,A
PUSH DE
CALL TRNBYT
POP DE
LD E,A
PUSH DE ;COUNT
LD HL,CHKBFR
MORCHR:
PUSH DE
PUSH HL
CALL TRNBYT
POP HL
POP DE
LD C,A
LD A,(CHKSUM)
XOR C
LD (CHKSUM),A
LD (HL),C
INC HL
DEC DE
LD A,D
OR E
JR NZ,MORCHR
LOKETX:
CALL MSKTRN
CP ETX
JR NZ,LOKETX
CALL WLODNET
LD C,A
LD A,(CHKSUM)
CP C
LD HL,CHKBFR
POP DE ;COUNT
JR Z,PUTBUF
LD A,NAK
CALL SNDNET
JR WAISTX
PUTBUF:
LD A,(HL)
CALL PUTBFR
JP NZ,CANCEL
DEC DE
INC HL
LD A,D
OR E
JR NZ,PUTBUF
GIVACK:
CALL SNDACK
JR WAISTX
;++++++++++
;CANCEL LOAD
CANCEL:
LD A,CAN
CALL SNDNET
CALL WAITAK ;WAIT FOR THE BACK-CANCEL
JP CLOSE
CANCIN:
JP CLOSEW ;WAIT FOR THE NEXT ACTIONS
;++++++++++
;WRITE DATA BYTES TO BUFFER
;WRITE TO DISK WHEN BUFFER FULL
PUTBFR:
PUSH HL
PUSH BC
PUSH DE
LD HL,(ABUF)
LD BC,(ABFRLEN)
LD (HL),A
INC HL
DEC BC ;INCREMENT POINTER,REDUCE COUNT
LD (ABUF),HL
LD (ABFRLEN),BC
LD A,B
OR C
JR Z,PUTBFW ;IF BUFFER FULL WRITE IT TO THE FILE
XOR A
PUTB1: POP DE
POP BC
POP HL
RET
PUTBFW:
LD A,(ACTFLG)
BIT 7,A
RES 7,A
LD (ACTFLG),A
JR NZ,WRTDES
CALL WRTFIL
PUSH AF
CALL CLRBUF
; LD HL,PUNKT
; CALL OUTAS
POP AF
JR PUTB1
;++++++++++
;WRITE DESCRIPTOR RECORD
WRTDES:
LD HL,(BUF)
LD A,L
LD L,H
LD H,A
LD DE,MAGIC
OR A
SBC HL,DE
JR Z,WRTD1
LD HL,NODES ;ERROR NO DESCRIPTOR
WRTD0: CALL OUTAS
XOR A
INC A
JR PUTB1
WRTD1: LD DE,(BUF+15) ;RL
LD HL,BFRLEN
OR A
SBC HL,DE
LD HL,NORL
JR C,WRTD0 ;RL TO LARGE
LD DE,FILPRM ;MOVE
LD HL,BUF+12
LD BC,74H
LDIR
LD DE,DATE
LD HL,BUF+18H
LD BC,8
LDIR
LD A,(BUF+13H)
LD (PROP),A
POP DE
POP BC
POP HL
POP HL ;RET FROM PUTBFR
JP LOAD1
;+++++++++
;WRITE A BUFFER TO DISK
WRTFIL:
LD HL,BFRLEN
LD BC,(ABFRLEN)
AND A
SBC HL,BC
RET Z ; IF THERE IS NOTHING TO WRITE DO NOTHING
LD (FILDL),HL
LD A,(FLGBYT)
BIT FILDES,A
JR NZ,WF0
EX DE,HL
LD HL,(FILSMT+2)
ADD HL,DE
LD (FILSMT+2),HL
DEC HL
LD (HIGADR),HL
EX DE,HL
WF0: LD DE,(FILRL)
WF1: OR A
SBC HL,DE
JR Z,WF2
JR NC,WF1
WF2: ADD HL,DE
LD A,(FLP)
BIT 5,A
JR Z,WF3
DEC HL ;ASCII FILE, EOF NOT COUNT
WF3: LD (FILST1),HL ;NUMBER OF BYTES IN LAST RECORD
LD IY,FILVEC
CALL DISK
RET Z ;IF NO ERRORS RETURN
CALL ERROR ;IF THERE WAS ONE DISPLAY IT
XOR A
INC A
RET ;NONZERO RETURN SHOWS ERROR
;++++++++++
;CLEAR BUFFER
CLRBUF: LD HL,BUF
LD (ABUF),HL
LD DE,BUF+1
LD BC,BFRLEN
LD (ABFRLEN),BC
DEC BC
LD (HL),-1
LDIR
RET
;******************************************************
;CLOSE FILE
CLOSEW:
LD A,(FLP)
BIT 5,A ;ASCII ?
JR Z,CLOSE1
LD A,-1 ;EOF - MARK
CALL PUTBFR
CLOSE1: CALL WRTFIL
LD A,(FLGBYT)
BIT FILDES,A
JR Z,CLOSE
LD DE,DATE
LD HL,DARRAY
LD BC,8
LDIR
LD A,(PROP)
LD (FILPRP),A
CLOSE:
; LD HL,NEWLN
; CALL OUTAS
LD IY,FILCLS
LD (IY+4),74H
CALL SYSTEM
CALL SNDACK ;SEND THE ACKNOWLEDGE FOR READY
JP WAIT
;******************************************************
;SEND REQUEST
SEND:
RES 1,(HL)
CALL STRTRQ
LD (IX+01),0 ;OPEN FOR INPUT
LD HL,0 ;DEFAULT RL
CALL OPNFIL
PUSH AF
CALL NZ,ERROR ;NZ IST ERROR-RETURN
POP AF
JP NZ,CANCL ;CANCEL THIS FILEREQUEST
;READY FOR TRANSFER
CALL SNDACK ;FOR FILENAME IS OPEN OK
LD IY,FILRDV
LD (IY+0AH),0
LD HL,0
LD (BFCNT),HL
LD A,(FLGBYT)
BIT FILDES,A
JR Z,REDLOP
SNDDESC: ;SEND DESCRIPTOR RECORD
LD HL,BUF
LD (BUFPOI),HL
LD B,6
LD DE,MAGIC
SNDD1: LD (HL),D
INC HL
LD (HL),E
INC HL
DJNZ SNDD1
EX DE,HL
LD HL,FILPRM
LD BC,74H
LDIR
LD HL,80H
LD (BFCNT),HL
REDLOP:
LD HL,ACTFLG
BIT 5,(HL)
RES 5,(HL)
JP NZ,DONRED
LD HL,(BFCNT)
LD DE,(BUFPOI)
LD IX,CHKBFR
LD BC,XFERSZ
LD (CCOUNT),BC
LDLOP:
LD A,H
OR L
JR Z,NEWRED
PUSH HL
AND A ;RESET CARRY
SBC HL,BC ;BUFCNT-XFERSZ > 0 ?
POP HL
CALL C,CHKS ;SET ACTUAL COUNT INSTEAD OF XFERSZ
LD A,(FLP)
BIT 5,A
JR Z,OVCHK1
LD A,(DE)
CP 0FFH ;IS THERE ASCII-EOF ?
JR Z,ASCEOF
OVCHK1:
LD A,(DE)
INC DE
DEC HL
LD (BFCNT),HL
LD (BUFPOI),DE
LD (IX),A
DEC BC
INC IX
LD A,B
OR C
JP Z,SNDREC
JR LDLOP
ASCEOF:
LD HL,(CCOUNT)
AND A
SBC HL,BC ;ACTUAL COUNT FOR RECORD
LD (CCOUNT),HL
LD HL,ACTFLG
SET 5,(HL)
JP SNDREC
;++++++++++
;READ FROM DISK TO BUFFER
NEWRED:
LD A,(ACTFLG)
RES 6,A
LD (ACTFLG),A
LD IY,FILRDV
LD A,(IY+0AH)
CP 0C9H
JR Z,DONRED
LD HL,BFRLEN
LD (RDVLEN),HL
CALL DISK
LD A,(IY+0AH)
CP 0C9H
JR Z,NEWEND
BIT 6,A
PUSH AF
CALL NZ,ERROR
POP AF
JP NZ,CANCL
CALL SUBREC
JR Z,NEWEND
; LD HL,PUNKT
; CALL OUTAS
NEWR0: LD HL,(RDVLEN)
NEWR1: LD (BFCNT),HL
LD DE,BUF
LD (BUFPOI),DE
JP REDLOP
NEWEND: LD (IY+0AH),0C9H
LD HL,(FILST1)
LD A,L
OR H
JR Z,NEWR0 ;NUMBER OF BYTES IN LAST
;RECORD NOT USED
PUSH DE
LD DE,(FILRL)
LD HL,(RDVLEN)
LD A,L
AND 7FH
JR NZ,NEWR0
SBC HL,DE
LD DE,(FILST1)
ADD HL,DE
POP DE
JR NEWR1
;++++++++++
;END FILE TRANSFER
DONRED:
LD A,EOT
CALL SNDNET
JP CLOSE
;++++++++++
;SET ACTUELL TRANSFER BLOCK LENGTH TO NUMBER OF LAST CHARACTERS
CHKS:
LD A,(ACTFLG)
BIT 6,A
RET NZ
LD B,H
LD C,L
LD (CCOUNT),BC
SET 6,A
LD (ACTFLG),A
RET
;++++++++++
;DECREMENT RECORD COUNT
SUBREC: LD DE,(FILRL)
LD HL,BFRLEN
LD BC,0
SUBR1: INC BC
OR A
SBC HL,DE
JR NZ,SUBR1
LD HL,(FILPRM+1)
OR A
SBC HL,BC
LD (FILPRM+1),HL
RET
;++++++++++
;SEND A BLOCK TO NET
SNDREC:
LD HL,(CCOUNT)
LD A,H
OR L
JP Z,REDLOP
LD A,STX
CALL SNDNET
LD BC,(CCOUNT)
LD A,B
PUSH BC
CALL SNDNET
POP BC
LD A,C
CALL SNDNET
LD DE,CHKBFR
LD HL,CHKSUM
LD (HL),0
LD BC,(CCOUNT)
TRALOP:
LD A,(DE)
INC DE
DEC BC
PUSH AF
XOR (HL)
LD (HL),A
POP AF
PUSH BC
PUSH DE
PUSH HL
CALL SNDNET
POP HL
POP DE
POP BC
LD A,B
OR C
JR NZ,TRALOP
LD A,ETX
CALL SNDNET
LD A,(CHKSUM)
CALL SNDNET
CALL WAITAK
JP Z,REDLOP
CP NAK ;WAS IT A NAK
JR Z,SNDREC ;TRY IT AGAIN
JP CLOSE
;++++++++++
;CANCEL SEND
CANCL:
LD A,CAN
CALL SNDNET
CALL WAITAK
CANIN:
LD IY,FILCLS
LD (IY+4),74H
CALL DISK
CALL SNDACK
JP WAIT
;******************************************************
;GET FILENAME
FILNAM:
CALL MSKTRN
CP STX
JR NZ,FRAMER
XOR A
LD (CHKSUM),A ;INITIALIZE CHECKSUM
LD C,A ;INITIALIZE NAME-LENGTH COUNTER
LD HL,NAMBUF
MORNAM:
PUSH BC
PUSH HL
CALL MSKTRN ;ONLY ASCII-CHARACTERS FOR FILENAME
POP HL
POP BC
LD B,A
CP ETX ;HAVE WE REACHED THE END ?
JR Z,ENDNAM
INC C
LD A,32
CP C
JR C,MORN1 ;ONLY 32 CHARACTERS FOR FILENAME ALLOWED
LD (HL),B
INC HL
MORN1:
LD A,(CHKSUM)
XOR B
LD (CHKSUM),A
JR MORNAM
ENDNAM:
LD (HL),0DH
CALL WLODNET
LD B,A
LD A,(CHKSUM)
CP B
JR NZ,SUMERR ;CHECKSUMERROR IN FILENAME !
RET
;++++++++++
;FILENAME ERROR
SUMERR:
; LD HL,SUMEMS
; CALL OUTAS
LD A,NAK
CALL SNDNET ;GIVE A NONACKNOWLEDGE FOR THE WRONG FILENAME
JR FILNAM
;TRY IT AGAIN TO GET THE NAME CORRECT
SUMEMS:
DEFB 28
DEFM 'CHECKSUM ERROR IN FILENAME '
DEFB 0DH
FRAMER:
POP HL ;FROM ROUTINE FILNAM
POP HL ;FROM ROUNTINE STRTRQ
CP CAN
JP Z,CANIN
; LD HL,FRAMSG
; CALL OUTAS
JP CANCL
FRAMSG:
DEFB 36 ;LENGTH OF MSG
DEFM 'RECORD - FRAMING ERROR IN FILENAME'
DEFB 0DH
DEFB 0AH
;*****************************
;OPEN FILE
OPNFIL:
LD A,(FLGBYT)
BIT FILDES,A
JR NZ,OPNF
LD (FILRL),HL
LD (FILST1),HL
LD HL,0
LD (LOWADR),HL
LD (HIGADR),HL
LD (STKSIZ),HL
LD (FILSMT),HL
LD (FILSMT+2),HL
LD (FILSMT+4),HL
LD (FILSMT+6),HL
OPNF: XOR A
LD (FILSPV),A
LD (FILPRP),A
CALL ISNAME
RET NZ
LD A,(IX+1)
OR A
JR Z,OPN0
PUSH IX
LD IY,FILINI ;I REQUEST BEI WRITE
CALL SYSTEM
POP IX
OPN0: PUSH IX
LD IY,FILASV ;ASSIGN REQUEST
CALL SYSTEM
POP IX
RET NZ
LD A,'*'
LD (FILSPV+1),A
LD IY,FILOPN ;OPEN REQUEST
LD A,(IX+1)
LD (FILSPV),A
LD A,(FLGBYT)
BIT FILDES,A
JR Z,OPN1
BIT BINARY,A ;DESCRIPTOR TRANSFER ONLY
JR Z,OPN3 ;TYPE BINARY
JR OPN2
OPN1: LD A,(IX)
LD (FILPRM),A
OPN2: LD (IY+4),74H
CALL SYSTEM
LD A,(FLGBYT)
BIT FILDES,A
JR NZ,OPN4
LD A,(FLP)
AND 20H
LD B,A
LD A,(FILPRM)
LD (FLP),A
AND 20H
CP B
JR Z,OPN4
OPN3: LD (IY+0AH),48H ;INVALID FILE TYPE
OPN4: LD A,(IY+0AH)
BIT 6,A
JR Z,FILOKM
CP 0D0H ;DUPLICATE FILE ERROR ?
RET
;++++++++++
;FILE OK
FILOKM:
XOR A
RET
;++++++++++
;FILE NAME OK ?
ISNAME:
LD HL,NAMBUF
LD C,0 ;COUNT
LD A,(HL)
CP 0DH
JR Z,NAMERR
NAMLOP:
LD A,(HL)
CP 0DH ;CR ERREICHT
JR Z,ENDLEN
CP ';'
JR Z,NAMERR
CP ' '
JR Z,NAMERR
CP 09H
JR Z,NAMERR
INC HL
INC C
LD A,C
CP 33
JR NZ,NAMLOP
LD (HL),0DH
ENDLEN:
LD HL,NAMLEN
LD (HL),C
INC HL ;NAMBUF
XOR A
RET
NAMERR: LD A,46H ;INVALID FILE NAME
OR A
RET
FILVEC: ;FILE WRITE BIN
DEFB 05
DEFB 0FH
DEFW BUF
FILDL: DEFS 2
DEFW DEND
DEFW DEND
DEFB 0
DEFW 0
FILRDV: ;FILE READ BIN
DEFB 05
DEFB 0BH
DEFW BUF
RDVLEN: DEFS 2
DEFW DEND
DEFW DEND
DEFB 0
DEFW 0
FILCLS: ;FILE CLOSE
DEFB 05
DEFB 06
DEFW FILPRM
DEFW 74H
DEFW 0
DEFW 0
DEFB 0
DEFW 0
FILINI: ;DOS INIT
DEFB 05
DEFB 00
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFB 0
DEFW 0
FILASV: ;FILE ASSIGN
DEFB 05
DEFB 02
DEFW NAMBUF
DEFW 0
DEFW 0
DEFW 0
DEFB 0
DEFW FILSPV
FILOPN: ;FILE OPEN
DEFB 05
DEFB 04
DEFW FILPRM
DEFW 74H
DEFW 0
DEFW 0
DEFB 0
DEFW FILSPV
FILOK1:
DEFB 7
DEFB 0DH
DEFB 0AH
DEFM 'FILE '
FILOK2:
DEFB 9
DEFM ' OF TYPE '
PROTYP:
DEFB 9
DEFM 'PROCEDURE'
ASTYP:
DEFB 5
DEFM 'ASCII'
BNTYP:
DEFB 6
DEFM 'BINARY'
OPENED:
DEFB 24
DEFM ' IS OPEN FOR TRANSFER '
DEFB 0DH
DEFB 0AH
PUNKT:
DEFB 1
DEFM '.'
NEWLN:
DEFB 2
DEFB 0DH
DEFB 0AH
LOGOUT:
DEFM 'logout'
DEFB 0AH
DEFB 80H
NODES: DEFB NODESL
DEFM 'INVALID DESCRIPTOR'
DEFB 0DH
DEFB 0AH
NODESL: EQU $-NODES-1
NORL: DEFB NORLL
DEFM 'RECORD LENGTH TO LARGE'
DEFB 0DH
DEFB 0AH
NORLL: EQU $-NORL-1
;******************************************************
;FILE DESCRIPTOR
FILPRM: DEFB 0
DEFW 0
FILRL: DEFW 0
FILSTO: DEFS 2
FILPRP: DEFS 1
FILSA: DEFW 0
FILST1: DEFS 18
FILSMT: DEFS 82
LOWADR: DEFS 2
HIGADR: DEFS 2
STKSIZ: DEFS 2
PROP: DEFS 1
DARRAY: DEFS 8
;******************************************************
ACTFLG: DEFS 1
CHKSUM: DEFS 1
FLGBYT: DEFS 1
FLP: DEFS 2
BUFPOI: DEFS 2
BFCNT: DEFS 2
CCOUNT: DEFS 2
NAMLEN: DEFS 1
NAMBUF: DEFS 33
FILSPV: DEFS 35
ABUF DEFS 2
ABFRLEN DEFS 2
CHKBFR: DEFS XFERSZ+1