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:Š¿