DIENST ASM ;*************************************
;*** ***
;*** SERVICE-CAOS-DIENSTPROGRAMM ***
;*** ***
;*** -f}r DEP.COM ab Version 2.0 ***
;*** -Laufwerk- und USER-Wechsel ***
;*** -Fehlertexte aus Koppel-RAM ***
;*** -MC und BASIC-Schnittstelle ***
;*** ***
;*** DIENST.ASM ` ml 08.08.93 ***
;*************************************
;
;bei Aenderungen darauf achten, da~
;JUMP auf Adresse BE00H bleibt!
;-------------------------------------
;Schnittstellenbeschreibung:
;
;Name Nr. Adresse Infos
;
;FLOAD 0 00D8 Name ab Adr. 0
;FSAVE 1 00DB Name ab Adr. 0
;DIR 2 00DE
;STAT 3 00E1
;REN 4 00E4 Namen eingeben
;SETRO 5 00E7 Name eingeben
;SETWR 6 00EA Name eingeben
;ERA 7 00ED Name eingeben
;
;DRIVE 8 00F0 LW eingeben
;USER 9 00F3 User eingeben
;TYPTX 10 00F6 Name eingeben
;TYPTP 11 00F9 Name eingeben
;DUMP 12 00FC Name eingeben
;----------------------------
ARGN EQU 0B781H
ARG1 EQU ARGN+1
ARG2 EQU ARG1+2
NUMNX EQU 0B796H
NUMVX EQU 0B797H
WINON EQU 0B79CH
WINLG EQU 0B79EH
CURSO EQU 0B7A0H
PV1 EQU 0F003H
CRT EQU 00H
LF EQU 0AH
CLS EQU 0CH
CR EQU 0DH
ESC EQU 1BH
KBD EQU 04H
WAIT EQU 14H
LARG EQU 15H
INLIN EQU 17H
ERRM EQU 19H
HLHX EQU 1AH
HLDE EQU 1BH
AHEX EQU 1CH
ZSUCH EQU 1DH
GARG EQU 22H
OSTR EQU 23H
OCHR EQU 24H
BRKT EQU 2AH
SPACE EQU 2BH
CRLF EQU 2CH
CSTB EQU 42H
IRMON EQU 0F018H
IRMOF EQU 0F01BH
;---------------
ORG 0BA00H
START: LD HL,BAS
LD DE,00D8H
LD BC,TOP-BAS
LDIR ;BASIC-Treiber
RET ;kopieren
;-------
;BASIC-Schnittstelle:
;--------------------
BAS: LD A,0 ;CALL*D8
DB 1
LD A,1 ;CALL*DB
DB 1
LD A,2 ;CALL*DE
DB 1
LD A,3 ;CALL*E1
DB 1
LD A,4 ;CALL*E4
DB 1
LD A,5 ;CALL*E7
DB 1
LD A,6 ;CALL*EA
DB 1
LD A,7 ;CALL*ED
;neu:
DB 1
LD A,8 ;CALL*F0
DB 1
LD A,9 ;CALL*F3
DB 1
LD A,10 ;CALL*F6
DB 1
LD A,11 ;CALL*F9
DB 1
LD A,12 ;CALL*FC
;
CALL IRMON
CALL JUMP
CALL IRMOF
RET
;---------------
;Men}aufbau:
;
TOP: DW 7F7FH
DB 'DIENST'
DB 1
AND A ;Argument?
JP NZ,DJUMP;ja
LD HL,0
LD (WINON),HL
LD HL,2028H
LD (WINLG),HL
LD (IX+9),0B0H
JR MEN
DW 0B0B0H
DB 'QUIT'
DB 1
POP HL ;Stack clear
LD (IX+9),7FH
RET
DW 0B0B0H
DB 'MENU'
DB 1
POP HL ;Stack clear
MEN: CALL PV1
DB OSTR
DB CLS,LF
DB '>>> CAOS-Disketten-'
DB 'Dienstprogramme <<<'
DB CR,LF,LF,0
LD HL,TOP ;Suchbeginn
LD BC,BOT-TOP;Suchl{nge
MEN1: CALL PROMPT
CALL PV1
DB BRKT ;BRK?
JR C,MEN8
LD A,(IX+9);Prolog
MEN2: CPIR
JP PO,MEN8 ;fertig?
CPI
JR NZ,MEN2 ;2mal?
MEN3: LD A,M
CP 2 ;Epilog?
JR C,MEN4
CP 30H
JR C,MEN1 ;< '0'
CP 5FH
JR NC,MEN1 ;> 'Z'
CALL PV1
DB OCHR ;Men}wort
INC HL ;anzeigen
DEC BC
JR MEN3
MEN4: CALL LFCR
JR MEN1 ;weitersuchen
;
MEN5: POP HL
MEN6: CALL PV1
DB ERRM ;Error
LOOP: CALL PROM2 ;ohne CLL
MEN8: CALL PV1
DB INLIN ;Eingabe
INC DE
INC DE
INC DE
LD A,(DE)
CP 20H
JR Z,LOOP ;Leerzeichen
AND A
JR Z,LOOP ;nichts
LD A,(IX+9)
LD HL,TOP
LD BC,BOT-TOP
CALL PV1
DB ZSUCH ;Men}wort such.
JR NC,MEN6 ;nicht vorhand.
PUSH HL
CALL PV1
DB GARG ;Argumente
JR C,MEN5 ;Fehler
LD HL,LOOP ;RET-Adr
EX (SP),HL
INC HL
PUSH HL
CALL PV1
DB LARG
RET ;Ansprung
;-------
;Laufwerksprompt anzeigen:
;
PROMPT: LD A,2
CALL PV1
DB CRT
PROM2: LD BC,83F1H
IN A,(C)
CP 20H ;DEP ab 2.0?
JR C,STERN ;nein
DEC B
DEC B ;81F1H
IN A,(C)
CALL PV1
DB OCHR ;Laufwerk
INC B
IN A,(C) ;akt. User
AND 0FH
ADD 90H
DAA ;Hex-Umrechn.
ADC 40H
DAA
CALL PV1
DB OCHR ;Userbereich
JR PEND
STERN: CALL PV1
DB OSTR
DB '**',0 ;bei alter Vers.
PEND: LD A,'>'
CALL PV1
DB OCHR
RET
;---------------
DW 0B0B0H
DB 'TYPTX'
DB 1
TYPTX: CALL NAME
CALL OPEN ;read-open
RET C ;Fehler
TYPX1: LD A,1 ;read
CALL STEUER
RET C ;Fehler
DEC C
TYPX2: IN A,(C)
CP 3 ;CAOS-Ende?
JR Z,LFCR
LD E,0FFH
CALL TYPOUT ;anzeigen
JR C,LFCR ;BRK
INC B
JR NZ,TYPX2;weiter
JR TYPX1 ;neuen Block
;---------------
DW 0B0B0H
DB 'TYPTP'
DB 1
TYPTP: CALL NAME
CALL OPEN ;read-open
RET C ;Fehler
JR TYPT2
TYPT1: LD A,1
CALL STEUER
RET C ;Fehler
TYPT2: DEC C
TYPT3: IN A,(C)
CP 1AH ;TP-Ende?
JR Z,LFCR
LD E,7FH
CALL TYPOUT ;anzeigen
JR C,LFCR ;BRK
INC B
JR NZ,TYPT3;weiter
JR TYPT1 ;neuen Block
LFCR: CALL PV1
DB CRLF
RET
;---------------
DW 0B0B0H
DB 'DUMP'
DB 1
DUMP: CALL NAME
CALL OPEN ;read-open
RET C ;Fehler
LD BC,90F2H
IN A,(C) ;ARGN
CP 2
JR C,CPM ;wenn<2
CP 10
JR C,CAOS ;wenn<10
CPM: LD HL,100H
JR DUM1
CAOS: INC B
IN L,(C)
INC B
IN H,(C) ;HL=Ladeadr
LD DE,7FH
SBC HL,DE ;Vorblock!
DUM1: LD B,80H
JR DUM4
DUM2: LD A,1 ;read
CALL STEUER
RET C ;Fehler
DUM3: DEC C
DUM4: CALL DUMOUT
RET C ;BRK
LD A,B
AND A
JR NZ,DUM4
JR DUM2
;---------------
DW 0B0B0H
DB 'DRIVE'
DB 1
DRIVE: LD BC,83F1H
IN A,(C)
CP 20H ;DEP ab 2.0?
JR C,FE1 ;nein
CALL PV1
DB OSTR
DB 'Laufwerk:',0
LKBD: CALL PV1
DB KBD ;Taste abwarten
LD D,1
CP CR
JR Z,LANZ ;nur anzeigen
CP 3
JR Z,LFCR
LD D,3 ;LW anfordern
BIT 5,A
JR Z,LW1
SUB 20H ;klein->gro~
LW1: CALL PV1
DB OCHR
LD B,81H
LW2: OUT (C),A
LANZ: CALL LFCR
LD B,80H
OUT (C),D
SCHL1: IN A,(C)
BIT 0,A ;R}ckmeldung?
JR NZ,SCHL1;nein
RLCA ;Fehler?
JP C,ERROR ;ja
RET
;---------------
DW 0B0B0H
DB 'USER'
DB 1
USER: LD BC,83F1H
IN A,(C)
CP 20H ;DEP ab 2.0?
JR NC,US1
FE1: CALL PV1
DB OSTR
DB 'DEP.COM ab Version '
DB '2.0 erforderlich !'
DB 7,CR,LF,0
RET
US1: CALL PV1
DB OSTR
DB 'User:',0
CALL PV1
DB KBD ;Eingabe
LD D,1
CP CR
JR Z,LANZ ;nur anzeigen
CP 20H
JP C,LFCR ;Steuerzeichen
CALL PV1
DB OCHR ;anzeigen
SUB '0'
CP 10
JR C,US2
SUB 7
US2: LD B,82H
LD D,5 ;USER anfordern
JR LW2
;---------------
DW 0B0B0H
DB 'FLOAD'
DB 1
CALL NAME
FLOAD: LD A,9 ;Lesen open
CALL STEUER
RET C ;Fehler
LD BC,90F2H
IN A,(C) ;ARGN
LD (NUMNX),A
CP 2
JR C,FE3 ;wenn<2
CP 10
JR C,FLOC ;wenn<10
FE3: CALL PV1
DB OSTR
DB 'Keine CAOS-Datei !'
DB 7,CR,LF,0
RET
FLOC: INC B
IN L,(C)
INC B
IN H,(C) ;HL=Ladeadr
INC B
IN E,(C)
INC B
IN D,(C) ;DE=Endadr
CP 3
JR C,NST1 ;keine Startadr
PUSH HL
INC B
IN L,(C)
INC B
IN H,(C) ;Startadr
EX (SP),HL
NST1: EX AF,AF'
LD A,(ARGN)
AND A
JR Z,NST3 ;ohne Offset
LD BC,(ARG1);Offset
ADD HL,BC
EX DE,HL
ADD HL,BC
EX DE,HL
EX AF,AF'
JR C,NST2 ;keine Startadr
EX (SP),HL
ADD HL,BC
EX (SP),HL
NST2: EX AF,AF'
NST3: CALL PV1
DB HLDE
EX AF,AF'
JR C,NST4 ;keine Startadr
EX (SP),HL
LD (NUMVX),HL
CALL PV1
DB HLHX
POP HL
NST4: CALL LFCR
LST: LD A,1 ;Lesen normal
CALL STEUER
RET C ;Fehler
DEC C
LOA: INI ;Daten -> (HL)
AND A
SBC HL,DE
ADD HL,DE
JR Z,LOST ;Lade-Ende
INC B
INC B
JR NZ,LOA
JR LST ;neuen Block
LOST: LD A,(NUMNX)
CP 3
RET C ;kein Start
CALL PV1
DB OSTR
DB 'Programm starten? '
DB '(j/n): ',0
CALL PV1
DB KBD ;Taste?
PUSH AF
CALL PV1
DB OCHR ;anzeigen
CALL LFCR
POP AF
CP 'J'
JR Z,ST
CP 'j'
RET NZ
ST: LD HL,(NUMVX)
JP (HL) ;Start!
;-------
;read-open:
OPEN: LD A,9
CALL STEUER
RET C ;Fehler!
JP CCLS
;---------------
FSAVE: LD A,(ARGN)
CP 2 ;2 Argumente?
JR C,FE2 ;nein
JR FSAB
;-------
DW 0B0B0H
DB 'FSAVE'
DB 1
CP 2 ;2 Argumente?
JR NC,FSA ;ja
FE2: CALL PV1
DB OSTR
DB 'zu wenig Argumente !'
DB 7,CR,LF,0
RET
FSA: CALL NAME
FSAB: LD HL,ARGN
LD DE,0B0BH;Schreib open
LD BC,91F2H
SAVE: OUTI
INC B
INC B
DEC E
JR NZ,SAVE
LD A,D
CALL STEUER
RET C ;Fehler
LD A,0
LD (ARGN),A
LD BC,81F2H
BIT 3,D
JR Z,SOPE ;wenn open
LD HL,(ARG1)
SOPE: PUSH HL
LD DE,(ARG2)
AND A
SBC HL,DE
POP HL
LD BC,81F2H
LD DE,0380H;Schreib normal
JR NC,SCLO
JR SAVE
SCLO: LD A,43H ;Schreib close
JP STEUER
;---------------
;Sprungtabelle:
TAB: DW FLOAD
DW FSAVE
DW DIR
DW STAT
DW REN
DW SETRO
DW SETWR
DW ERA
DW DRIVE
DW USER
DW TYPTX
DW TYPTP
DW DUMP
;---------------
DJUMP: LD A,L ;Nummer
LD DE,ARG1
LD HL,ARG2
LD BC,18
LDIR ;Argumente
; JR JUMP ;verschieben
;Sprungverteiler:
JUMP: CP 13 ;Anzahl Routinen
RET NC ;zu gro~!
PUSH AF
LD HL,11
CALL NAMOUT ;Name ausgeben
LD HL,TAB
POP AF
ADD A
LD D,0
LD E,A
ADD HL,DE
LD A,M ;Tab. lesen
INC HL
LD H,M
LD L,A
JP (HL) ;Ansprung
;-------
STEUER: LD BC,80F3H
OUT (C),A ;Steuerbyte 1
STEU: PUSH BC
LD A,1
CALL PV1
DB WAIT
POP BC
IN A,(C)
BIT 0,A
JR NZ,STEU ;fertig ?
RLCA ;Fehler ?
RET NC
ERROR: LD BC,83F1H
IN A,(C)
CP 20H ;DEP ab 2.0?
JR NC,ERRTX;ja
LD BC,81F3H
IN A,(C) ;Fehlernummer
CALL PV1
DB AHEX
CALL PV1
DB OSTR
DB '-Error',7,CR,LF,0
SCF ;Fehler-Flag
RET
ERRTX: LD B,0 ;Fehlertext
ERRT1: IN A,(C)
SCF ;Fehler-Flag
RET Z ;00=Ende
INC B
CALL PV1
DB OCHR
JR ERRT1
;---------------
DW 0B0B0H
DB 'DIR'
DB 1
DIR: LD A,0DH ;Directory open
WDI: CALL STEUER
RET C ;Fehler
BIT 3,A ;Ende?
LD A,15H
JR NZ,STAT1
LD D,3 ;3 Namen
LD B,82H
NA3: LD E,9 ;Name
CALL ANZ
PUSH AF
LD E,2 ;Typ
CALL ANZ
POP AF
BIT 7,A
LD A,' ' ;WR
JR Z,WR
LD A,'*' ;RO
WR: CALL PV1
DB OCHR
CALL PV1
DB SPACE
INC B
DEC D
JR NZ,NA3
LD E,2
CALL ANZ
LD A,5 ;Dir weiter
JR WDI
;---------------
DW 0B0B0H
DB 'STAT'
DB 1
STAT: LD A,1DH ;Status+open!
STAT1: CALL STEUER
RET C ;Fehler
LD E,20
LD B,82H
ANZ: IN A,(C)
PUSH AF
AND 7FH
INC B
PUSH DE
PUSH BC
CALL PV1
DB OCHR
POP BC
POP DE
POP AF
DEC E
JR NZ,ANZ
RET
;---------------
DW 0B0B0H
DB 'REN'
DB 1
REN: CALL NAME
LD A,29H ;Ren old
CALL STEUER
RET C ;Fehler
CALL NAME
LD A,21H ;Ren new
OUT: JP STEUER
;---------------
DW 0B0B0H
DB 'ERA'
DB 1
ERA: CALL NAME
LD A,11H ;Era
JR OUT
;---------------
DW 0B0B0H
DB 'SETRO'
DB 1
SETRO: CALL NAME
LD A,25H ;Setro
JR OUT
;---------------
DW 0B0B0H
DB 'SETWR'
DB 1
SETWR: CALL NAME
LD A,31H ;Setwr
JR OUT
;-------
NAME: CALL PV1
DB OSTR
DB 'Name :'
DB 0
CALL PV1
DB INLIN
LD HL,17 ;Ende Name
ADD HL,DE
NAMOUT: LD E,12
LD BC,8EF3H
NAM: OUTD ;Name ausgeben
DEC E
JR NZ,NAM
LD B,80H
RET
;-------
TYPOUT: AND E ;Maske!
CP 20H
JR NC,ASCII;>1FH
CP LF
JR Z,ASCII
CP CR
JR Z,ASCII
CP 9
JR Z,TABU
BIT 7,E
JR NZ,POINT;CAOS-Datei
ADD A,40H
CP '_'
JR Z,ASCII ;Trennstrich
LD D,A
LD A,'^'
CALL ASCII
RET C ;BRK
LD A,D
JR ASCII
TABU: CALL PV1
DB SPACE
LD A,(CURSO)
AND 7
JR NZ,TABU
JR ASCI2
POINT: LD A,'.'
ASCII: CALL PV1
DB OCHR
ASCI2: LD A,(CURSO+1)
INC A
LD HL,WINLG+1
CP (HL) ;Seite voll?
JR NZ,GO
CALL PV1 ;warten auf
DB KBD ;Taste
CP 3 ;BRK?
SCF
RET Z
CALL CCLS
GO: AND A ;CY=0
RET
;-------
DUMOUT: PUSH BC
CALL PV1
DB HLHX ;Adresse
DUMO1: IN A,(C)
CALL PV1
DB AHEX
CALL PV1
DB SPACE
INC B
LD A,7
AND B ;8*Hexwert
JR NZ,DUMO1
CALL PV1
DB SPACE
POP BC
DUMO2: IN A,(C)
CALL PV1
DB CSTB
INC B
INC HL
LD A,7
AND B ;8*ASCII
JR NZ,DUMO2
CALL LFCR
LD DE,(WINLG)
LD A,(CURSO+1)
INC A
CP D ;BS voll?
CCF
RET NZ
CALL PV1
DB KBD
CP 3 ;BRK?
SCF
RET Z ;ja
;-------
;neue BS-Seite einstellen:
CCLS: LD A,CLS
CALL PV1
DB CRT
LD A,LF
CALL PV1
DB CRT
AND A ;CY=0
RET
;-------
BOT: DS 0C000H-$
END
»¿
BOT:¿
CCLS:Š¿
CALL PV1
DB CRT
LD A,LF
CALL PV1
DB CRT
AND A ;CY=0
RET
;-------
BOT: DS 0C000H-$
END
»¿
BOT:¿
CCLS:Š¿
Detected encoding: ANSI (CP1252) | 4
|
|