346 lines
6.9 KiB
ArmAsm
346 lines
6.9 KiB
ArmAsm
!******************************************************************************
|
|
*******************************************************************************
|
|
|
|
W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1985
|
|
|
|
Standalone Module rm.s
|
|
|
|
Bearbeiter: P. Hoge
|
|
Datum: 04/01/87 11:20:45
|
|
Version: 1.2
|
|
|
|
*******************************************************************************
|
|
|
|
Device Treiber zum Laden von Wega Procedure Dateien
|
|
von einem Local System wie GDS 6000 unter UDOS ueber
|
|
den Console TTY Kanal.
|
|
|
|
Der Modul liegt leider nur als PLZ/ASM Quelle vor.
|
|
Bei Aenderungen der Struktur iob in saio.h und
|
|
der inode in inode.h mussen die Referenzen zu dieser
|
|
Struktur per Hand geaendert werden.
|
|
|
|
*******************************************************************************
|
|
******************************************************************************!
|
|
|
|
|
|
|
|
rm_s module
|
|
|
|
|
|
constant
|
|
|
|
TTIN := %04
|
|
TTWR := %06
|
|
|
|
FLAG0 := %3F0 !relative Adresse zu Beginn Monitor RAM!
|
|
|
|
SOH := %01
|
|
ESC := %1B
|
|
ETX := %03
|
|
ACK := %06
|
|
CAN := %18
|
|
STX := %02
|
|
EOT := %04
|
|
NAK := %15
|
|
|
|
typ := %01 !binary file!
|
|
|
|
!Referenzen auf iob Struktur!
|
|
|
|
constant
|
|
|
|
iob_i_ino_i_number := 6 !in rm Pointer auf Filename!
|
|
iob_i_unit := 80
|
|
iob_i_ma := 98
|
|
iob_i_cc := 100
|
|
|
|
|
|
internal
|
|
|
|
rmflag1 word
|
|
rmflag2 word
|
|
|
|
MSG_OERR array [* byte] := 'rm: cannot open file on local system%l%00'
|
|
MSG_RERR array [* byte] := 'rm: read error from local system%l%00'
|
|
MSG_WERR array [* byte] := 'rm: cannot write to local system%l%00'
|
|
|
|
|
|
|
|
!*------------------------------------------ Proceduren ---------------------*!
|
|
|
|
|
|
global
|
|
|
|
|
|
!*----------------------------------------------------------------------------*
|
|
*
|
|
*rmopen
|
|
* Open Request
|
|
*
|
|
* Nur Open fuer Read moeglich
|
|
* rmopen sendet an das Local System den Filenamen, das Local
|
|
* System beginnt mit dem Senden des 1. Datenblocks, falls die
|
|
* Datei vorhanden ist.
|
|
* input r7: Pointer auf Struktur iob
|
|
*
|
|
*---------------------------------------------------------------------------*!
|
|
|
|
_rmopen procedure
|
|
entry
|
|
pushl @r15, rr8
|
|
ldctl r8, PSAP
|
|
sub r8, #(%400-FLAG0)
|
|
setb @r8, #0 !control S und esc abschalten!
|
|
|
|
ldk r8, #0
|
|
ld rmflag1, r8 !init rmflag!
|
|
ld rmflag2, r8
|
|
|
|
ld iob_i_unit(r7), #'r'!remote open drive nr setzen!
|
|
|
|
bitb @r7, #1 !bit 1 = 1 = open for write!
|
|
jp nz, rmwerror !write nicht moeglich!
|
|
|
|
ldk r0, #SOH !Kommando Send file an local!
|
|
sc #TTWR
|
|
ldb rl0, #ESC
|
|
sc #TTWR
|
|
ldb rl0, #'S'
|
|
sc #TTWR
|
|
sc #TTIN !acknowledge von local!
|
|
|
|
ldb rl0, #typ !file typ an local!
|
|
sc #TTWR
|
|
sc #TTIN !acknowledge von local!
|
|
|
|
!Ausgabe filename an local!
|
|
ld r2, iob_i_ino_i_number(r7) !file name Pointer!
|
|
ldb rh7, #10 !retries!
|
|
ld r5, r2
|
|
rmo0: ldb rl7, #0 !Checksumme init!
|
|
ld r2, r5
|
|
ldb rl0, #STX !Start of Text!
|
|
sc #TTWR
|
|
|
|
rmo1: ldb rl0 ,@r2 !Zeichen von filename!
|
|
inc r2, #1
|
|
cpb rl0, #0 !ende filename ?!
|
|
jr z, rmo2
|
|
xorb rl7, rl0 !Checksumme berechnen!
|
|
sc #TTWR
|
|
jr rmo1
|
|
|
|
rmo2: ldb rl0, #ETX !end of text!
|
|
sc #TTWR
|
|
exb rl0, rl7
|
|
sc #TTWR !Checksumme ausgeben!
|
|
sc #TTIN !Warten auf Quittung!
|
|
resb rl3, #7
|
|
cpb rl3, #ACK
|
|
ldk r2, #0 !kein Fehler!
|
|
jp z, rmclose4
|
|
|
|
cpb rl3, #CAN !Abbrechen ?!
|
|
jr z,rmoerr
|
|
dbjnz rh7, rmo0 !naechster Versuch!
|
|
|
|
rmoerr:
|
|
lda r7, MSG_OERR
|
|
jr rmerror
|
|
end _rmopen
|
|
|
|
!*----------------------------------------------------------------------------*
|
|
*rmclose
|
|
* Close Request
|
|
*
|
|
* rm beendet die Fileuebertragung mit dem Local System
|
|
*
|
|
*---------------------------------------------------------------------------*!
|
|
|
|
_rmclose procedure
|
|
entry
|
|
pushl @r15, rr8
|
|
ldctl r8, PSAP
|
|
sub r8, #(%400-FLAG0)
|
|
setb @r8, #0 !control S und esc abschalten!
|
|
|
|
test rmflag2
|
|
jr nz, rmclose3 !file war schon zu Ende!
|
|
ldb rl0, #CAN !file transfer abbrechen!
|
|
sc #TTWR
|
|
jr rmclose1
|
|
end _rmclose
|
|
|
|
!*----------------------------------------------------------------------------*
|
|
*
|
|
*rmstrategy
|
|
* Block Read Request (Write nicht moeglich)
|
|
*
|
|
* Einlesen eines Blocks der eroeffneten Datei vom Local System
|
|
* input r7: Pointer auf iob Struktur
|
|
*
|
|
*---------------------------------------------------------------------------*!
|
|
|
|
_rmstrat procedure
|
|
entry
|
|
pushl @r15, rr8
|
|
ldctl r8, PSAP
|
|
sub r8, #(%400-FLAG0)
|
|
setb @r8, #0 !control S und esc abschalten!
|
|
|
|
cp r6, #1 !Read!
|
|
jr nz,rmwerror !write nicht moeglich!
|
|
|
|
rmst1: test rmflag2
|
|
jr z,rmst2
|
|
|
|
ldk r2, #0 !file schon close!
|
|
jr rmclose3
|
|
|
|
rmst2: ld r8, iob_i_ma(r7) !Lade Adr!
|
|
ld r9, iob_i_cc(r7) !Laenge!
|
|
test r9
|
|
jr z, rmst3 !0 nicht zulaessig!
|
|
|
|
rmstloop:
|
|
push @r15, r7
|
|
calr rmread !64 byte von local!
|
|
pop r7, @r15
|
|
test r2
|
|
jr z,rmst4
|
|
|
|
rmst3: lda r7, MSG_RERR
|
|
jr rmerror !Read Error!
|
|
|
|
rmst4: ld r2, iob_i_cc(r7) !Laenge!
|
|
cpb rl3, #EOT
|
|
jr nz,rmst5
|
|
|
|
sub r9, r6 !file uebertragen!
|
|
jr c, rmclose1
|
|
sub r2, r9 !uebertragene Anzahl Byte!
|
|
jr rmclose1
|
|
|
|
rmst5: sub r9, r6
|
|
jr z, rmclose3 !1 Block fertig uebertragen!
|
|
jr c, rmclose3
|
|
jr rmstloop
|
|
end _rmstrat
|
|
|
|
!*----------------------------------------------------------------------------*
|
|
* Unterprogramme
|
|
*---------------------------------------------------------------------------*!
|
|
|
|
internal
|
|
|
|
rmread procedure !Lesen 1 Block von local System (64 Byte)!
|
|
entry
|
|
ldb rh7, #10 !retries!
|
|
ldk r2, #0 !kein Fehler!
|
|
ldk r6, #0 !init lenght!
|
|
test rmflag1
|
|
jr z, rmr0 !Sprung 1.Aufruf!
|
|
ldb rl0, #ACK !Ack fuer letzen Aufruf!
|
|
sc #TTWR
|
|
|
|
rmr0: ldb rl7, #0 !Checksumme init!
|
|
ld rmflag1, #-1
|
|
ld r5, r8 !Buffer Pointer retten!
|
|
|
|
sc #TTIN
|
|
resb rl3, #7
|
|
cpb rl3, #EOT
|
|
ret z !file fertig uebertragen!
|
|
|
|
cpb rl3, #CAN
|
|
jr z, rmrerr !local gibt Abbruch!
|
|
cpb rl3, #ESC
|
|
jr z, rmrerr !local gibt Abbruch!
|
|
|
|
cpb rl3, #STX !Start of text muss 1.Zeichen sein!
|
|
jr nz, rmr2 !warten auf ETX und Uebertragung wiederholen!
|
|
|
|
sc #TTIN
|
|
ldb rh4, rl3 !high count!
|
|
sc #TTIN
|
|
ldb rl4, rl3 !low count!
|
|
ld r6, r4
|
|
rmr1: sc #TTIN !Daten lesen!
|
|
ldb @r8, rl3 !in Buffer!
|
|
inc r8, #1
|
|
xorb rl7, rl3 !Checksumme berechnen!
|
|
djnz r4, rmr1
|
|
|
|
rmr2: sc #TTIN !warten auf ETX!
|
|
resb rl3, #7
|
|
cpb rl3, #ESC
|
|
jr z, rmrerr
|
|
cpb rl3, #CAN
|
|
jr z, rmrerr
|
|
cpb rl3, #ETX
|
|
jr nz, rmr2
|
|
|
|
sc #TTIN !Checksumme!
|
|
cpb rl3, rl7 !uebertragene = berechnete ?!
|
|
ldb rl3, #0 !falls zufaellig EOT!
|
|
ret z !ja!
|
|
|
|
decb rl7, #1
|
|
jr z, rmrerr !Abbruch!
|
|
|
|
ldb rl0, NAK !n mal wiederholen!
|
|
ld r8, r5 !Buffer Pointer auf Anfang zurueck!
|
|
sc #TTWR
|
|
jr rmr0
|
|
|
|
rmrerr: ld r2, #-1
|
|
ret
|
|
end rmread
|
|
|
|
|
|
rmerror procedure
|
|
entry
|
|
ldb rl0, #CAN !remote abbrechen!
|
|
sc #TTWR
|
|
sc #TTIN
|
|
jr rmerror1
|
|
end rmerror
|
|
|
|
rmwerror procedure
|
|
entry
|
|
lda r7, MSG_WERR
|
|
end rmwerror
|
|
|
|
rmerror1 procedure
|
|
entry
|
|
call _printf
|
|
ld r2, #-1
|
|
jr rmclose2
|
|
end rmerror1
|
|
|
|
rmclose1 procedure
|
|
entry
|
|
sc #TTIN
|
|
end rmclose1
|
|
|
|
rmclose2 procedure
|
|
entry
|
|
ld rmflag2, #-1 !remote close!
|
|
end rmclose2
|
|
|
|
rmclose3 procedure
|
|
entry
|
|
ldctl r8, PSAP
|
|
sub r8, #(%400-FLAG0)
|
|
resb @r8, #0 !FLAG0 im Monitor RAM ruecksetzen!
|
|
end rmclose3
|
|
|
|
rmclose4 procedure
|
|
entry
|
|
popl rr8, @r15
|
|
ret
|
|
end rmclose4
|
|
|
|
end rm_s
|