; *****************************************
; ; TRANS (C) JUERGEN WEBER 1986/1987 ; ; ***************************************** ORG #8000 ENT $ DESTI1:EQU #C5F0 ; TRANS KOMMT AN 3 DESTI2:EQU #CDF0 ; VERSCHIEDENEN STELLEN IN DESTI3:EQU #D5F0 ; SCREENRAM (DAMIT AUCH TEXT MOEGLICH) DESTI4:EQU #DDF0 AUTO:EQU #BD80 ; ZWISCHENSPEICHER FUER FILEDATEN TYP:EQU #BD82 START:EQU #BD83 LEN:EQU #BD85 DISCA1:EQU #BD8B DISCA2:EQU #BD8D QU:EQU #BD87 ZI:EQU #BD89 FNAME1:EQU #EE00 FNAME2:EQU #E600 LADE:EQU #3B ; DORT KOMMT JEDES FILE HIN INBUF:EQU LADE OBUF:EQU INBUF+#800 BEGIN: INC A JR Z,SETSYM RST 0 DEFM " TRANS VERS. " DEFM "15.6.87 " ; LETZTE AENDERUNG UE:DEFB #66,0,#66,#66 ; ue DEFB #66,#66,#3E,0 DEFB #66,0,#3C,#66 ; oe DEFB #66,#66,#3C,0 DEFB #CC,0,#78,#C ; CC CALL Z,nn DEFB #7C,#CC,#76,0 SYMTAB:EQU #BD61 SETSYM: LD SP,#6000 LD DE,"{" ; SYMBOL AFTER 123 LD HL,SYMTAB ; SYMBOLTABELLE CALL #BBAB ; TXT SET M TABLE CALL #BB00 ; KM INITIALISE CALL #BB51 ; TXT INITIALISE CALL #BBBA ; GRA INITIALISE CALL #BBFF ; SCR INITIALISE LD DE,SYMTAB LD HL,UE LD BC,8*3 LDIR ; MATRIX KOPIEREN LD C,7 LD HL,#B0FF CALL #BCCE ; AMSDOS INITIALISIEREN LD A,2 LD BC,#F0F ; INK 2,15 CALL #BC32 LD A,3 ; INK 3,11,24 LD BC,#A18 CALL #BC32 LD HL,#A0F ; SPEED INK 20,30 CALL #BC3E AMSDOS: LD BC,#BC06 ; 25 ZEILEN ANZEIGEN OUT (C),C LD BC,#BD19 OUT (C),C ; DEFAULT LD HL,MENU CALL PRINT ; MENUE AUSGEBEN LD DE,539 ; ** DIE FOLGENDE ROUTINE LD HL,358 ; ZEICHNET EINEN STERN CALL #BBC0 ; MOVE 539,358 LD A,3 ; GRA PEN 3 CALL #BBDE LD A,"W" ; TAG:?"W";:TAGOFF CALL #BBFC LD A,2 CALL #BBDE ; GRA PEN 2 LD DE,480 LD HL,290 CALL #BBC0 ; MOVE 480,290 LD IX,DRDATA ; ECKEN DES STERNS LD B,5 ; 5 ECKEN PLOOP: PUSH BC LD E,(IX+0) LD D,(IX+1) LD L,(IX+2) LD H,(IX+3) CALL #BBF6 ; DRAW DE,HL LD B,4 PL1:INC IX DJNZ PL1 POP BC DJNZ PLOOP LD HL,DISK CALL KLFCOM L1: CALL #BB06 ; INKEY$ CP "0" JP Z,0 ; PROGRAMMENDE CP 13 ; ENTER JR NZ,$+4 LD A,"4" ; FUEHRT ZU DISC-DISC SUB "1" JR C,L1 ; <"1" LD I,A CP 6 ; LAUFWERK WECHSELN JP Z,CHNDRI JR NC,L1 ; ANDERE TASTE ALS "1"-"5" CP 5 JP Z,USER ; USER SETZEN CP 4 JP Z,LOESCH CP 1 ; TAPE-DISC LD HL,TAPEIN JR Z,W1 CP 3 ; DISC-DISC LD HL,DISK JR Z,W1 SPEED?: LD HL,FAST ; "AUFZEICH..." CALL PRINT SPE: CALL #BB06 ; INKEY$ CP 13 ; ENTER = SPEED WRITE 1 JR NZ,$+4 LD A,"2" CP "1" LD HL,#14E ;SPEED WRITE 1 LD B,#19 JR Z,SETSP CP "2" LD HL,#A7 LD B,#32 JR Z,SETSP CP "3" LD B,#A LD HL,#7E JR NZ,SPE SETSP:LD A,B CALL #BC68 ; CAS SET SPEED LD HL,TAPEOU LD A,I JR Z,W1 ; DISC-TAPE LD HL,TAPE W1: CALL KLFCOM LD A,2 CALL #BC0E ;MODE 2 LD HL,#4F12 ;WINDOW 1,80,1,19 LD DE,0 CALL #BB66 ;WINDOW ENABLE LD BC,#BC06 ; NUR 13H ZEILEN OUT (C),C LD BC,#BD13 OUT (C),C LD HL,PROG ; * PROGRAMM IN SCHIRMRAM * LD DE,PROG+DIST1 LD BC,PROG2-PROG LDIR LD HL,PROG2 LD DE,PROG2+DIST2 LD BC,USER-PROG2 LDIR LD HL,AMSDOS LD DE,AMSDOS+DIST3 LD BC,PROG-AMSDOS LDIR LD HL,USER LD DE,USER+DIST4 LD BC,FINIS-USER LDIR JP DESTI1 KLFCOM: XOR A ;KEIN PARAMETER DEFB #FD ; LD LX,A LD L,A CALL #BCD4 ;KL FIND COMMAND JP NC,0 ; RESET DEFB #FD ; LD A,LY LD A,L ; PARAMETERZAHL JP #1B ; KL FAR PCHL FAST: DEFB 12 ;CLS DEFB 31,1,9 DEFM "Aufzeichnungsgeschwindigkeit ?" DEFB 31,10,13 DEFM "1 1000 Baud" DEFB 31,10,15 DEFM "2 2000 Baud" DEFB 31,10,17 DEFM "3 3600 Bau" DEFB "d"+128 TAPEOU:DEFM "TAPE.OU" ; KOMMANDOS FUR KL FIND COMMAND DEFB "T"+128 TAPEIN:DEFM "TAPE.I" DEFB "N"+128 TAPE:DEFM "TAP" DEFB "E"+128 DISK:DEFM "DIS" DEFB "C"+128 ERA:DEFB "E","R","A"+128 DRDATA:; ECKPUNKTE DES STERNS DEFW 545,399,610,290,480,370,609,370,480,290 PROG: LD SP,#C000 ANFA: CALL #BC92 ;OUT ABANDON CALL #BC7D ;IN ABANDON ;************************************* ; UBERTRAGUNGSRICHTUNG AUSGEBEN ;************************************* LD HL,CLEAN+DIST2 ; CLS:LOCATE 26,1 CALL PRINT+DIST1 LD A,I LD B,A INC B ; WIEOFT 11+4 ZUM TABBEGINN LD HL,CAS1-15+DIST2 LD DE,15 TABLOO:ADD HL,DE DJNZ TABLOO CALL PRINT+DIST1 ; HL=TITELSTRING PUSH HL LD HL,CAS5+DIST2 ; "TRANSFER" CALL PRINT+DIST1 POP HL LD E,(HL) ; SPAETERER STRING INC HL LD D,(HL) LD (DISCA2),DE ;ZIELNAME INC HL LD E,(HL) INC HL LD D,(HL) PUSH DE ; QUELLNAME LD DE,LADE ; BUFFER LD A,I JR Z,CAT CP 3 ; DISC-DISC CAT: LD A,11 ; CURSOR HOCH PUSH AF CALL Z,#BC9B ;CAT POP AF CALL Z,#BB5A ; *************************** ; QUELLNAMEN HOLEN ; *************************** LD HL,ST0+DIST2 ; "NAME AUF.." CALL PRINT+DIST1 POP HL CALL PRINT+DIST1 ; "DISK/KAS" LD HL,ST4+DIST2 CALL PRINT+DIST1 ; "SETTE LD HL,FNAME1 PUSH HL CALL GETLEN+DIST1 ; EDIT UND LAENGE FESTSTELLEN POP HL LD DE,INBUF ; BUFFER ; ***************** ; OPENIN ; ***************** CALL #BC77 ;CAS IN OPEN JP NC,DELAY+DIST2 PUSH HL POP IX ; HEADER LD (TYP),A ; FILEDATEN RETTEN LD (START),DE LD (LEN),BC LD H,(IX+27) LD L,(IX+26) ; AUTOSTART LD (AUTO),HL CALL TSTORT+DIST2 ; TEST AUF GUELTIGEN BEREICH ; ****************** ; FILEDATEN AUSGEBEN ; ****************** PUSH HL LD HL,TYPSTR+DIST2 LD A,(TYP) PUSH AF AND %1110 ADD A,#24 ; CHARAKTER CODE HERSTELLEN LD (ENTYP+DIST2),A CALL PRINT+DIST1 POP AF CALL BYTOUT+DIST1 LD A,B ; WENN ASCII DANN LAENGE 0 OR C JP Z,ASCII+DIST1 LD HL,STASTR+DIST2 ; "START" CALL PRINT+DIST1 LD H,D LD L,E ; START CALL ZWBOUT+DIST1 ; HEZZAHL IN HL AUSGEBEN LD HL,LENSTR+DIST2 CALL PRINT+DIST1 LD H,B ; "LAENGE LD L,C CALL ZWBOUT+DIST1 ; HEZZAHL IN HL AUSGEBEN LD HL,ATOSTR+DIST2 ; "AUTOSTART" CALL PRINT+DIST1 POP HL ; AUTOSTART CALL ZWBOUT+DIST1 ; HEZZAHL IN HL AUSGEBEN LD A,11 CALL #BB5A ; CSR ^ ; ************** ; LADEN ; ************** IND: LD HL,LADE ;ES WIRD JEDES FILE NACH 3B GELADEN CALL #BC83 ;CAS IN DIRECT JP NC,DELAY+DIST2 CALL #BC7A ;IN CLOSE ; ************ ; OUT OPEN ; ************ CALL OOPEN+DIST1 ; NAMENEINGABE,OUT OPEN LD HL,LADE-1 ;DATEN ZUR VERSCHIEBUNG LD DE,(LEN) ;DES FILES FESTSTELLEN ADD HL,DE LD (QU),HL ; OBERGRENZE DER ZWISCHENLAGERUNG LD HL,(START) LD B,H ; HIGHBYTE LADEADR DEC HL ADD HL,DE LD (ZI),HL ; OBERGRENZE NORMAL LD A,#BF SUB B ; HIGHBYTE ADRESSE >BF? JP C,PROG2+DIST2 ; NACH PROG2 SCREEN ; ********** ; SAVEN ; ********** CALL VERSCH+DIST1 JP NC,DELAY+DIST2 CALL #BC8F ;OUT CLOSE ANFVEC:JP ANFA+DIST1+6 ; '6' DA AUF ANFA ABANDON ; *************** ; ASCIIUEBERTRAGUNG ; *************** ASCII: LD A,I CP 3 JR Z,ASDD ; ASCII DISC-DISC CALL OOPEN+DIST1 ASC: CALL #BC80 ;IN CHAR JR NC,ASFER ;EOF MET CALL #BC95 ;OUT CHAR DELVEC:JP NC,DELAY+DIST2 JR ASC ASFER: JP Z,DELAY+DIST2 ; (C)ANCEL... CALL #BC8F ; CAS OUT CLOSE JP ANFA+DIST1+3 ; IN ABANDON ASDD:; ASCII DISC-DISC LD HL,OBUF+#800-1 LD BC,#AC00-OBUF-#800 ; MAX. SPEICHER A1: CPI JP PO,MEMFUL+DIST1 CALL #BC80 ; CAS IN CHAR LD (HL),A JR C,A1 JR Z,DELVEC CALL #BC7A ; CAS IN CLOSE CALL OOPEN+DIST1 LD HL,OBUF+#800 A2:LD A,(HL) CP #1A ; EOF JR Z,ASFER+3 CALL #BC95 ; CAS OUT CHAR JR NC,DELVEC INC HL JR A2 MEMFUL: LD HL,MEMORY+DIST2 CALL PRINT+DIST1 JR DELVEC ; ********* OOPEN: ; ********* LD A,I CP 3 ; DISC-DISC LD A,10 CALL #BB5A ; LF LD HL,DESDIS+DIST2 ; "DISK EINLEGEN" CALL Z,PRINT+DIST1 LD HL,ST0+DIST2 ; "NAME AUF" CALL PRINT+DIST1 LD HL,(DISCA2) ; "KASSETTE/DISKETTE" CALL PRINT+DIST1 LD HL,ST4+DIST2 ; "BUCHSTABEN" CALL PRINT+DIST1 LD HL,FNAME2 PUSH HL CALL GETLEN+DIST1 LD HL,LINEF+DIST2 CALL PRINT+DIST1 ; ** WURDE NUR ENTER GEDRUECKT ? LD A,B OR A ; LAENGE=0 LD DE,FNAME1 ; NACH ENTER 1. NAMEN ANNEHMEN POP HL JR NZ,INPOK EX DE,HL PUSH HL CALL GETEIN+DIST1 ; NAMENSLAENGE NACH B HOLEN POP HL INPOK: LD DE,OBUF ; BUFFER CALL #BC8C ;CAS OUT OPEN JP NC,DELAY+DIST2 RET ;******** VERSCH: ;******** LD HL,(QU) ; PROGRAMM AN TATSAECHLICHE LD DE,(ZI) ; BRINGEN (NOETIG FUER OUT DIRECT) LD BC,(LEN) LDDR VSCHSC: LD A,(TYP) CP 1 JR NZ,$+3 XOR A ; UNPROTECT LD HL,(START) LD DE,(LEN) LD BC,(AUTO) JP #BC98 ;CAS OUT DIRECT GETLEN: CALL EDIT+DIST1 PUSH HL LD HL,LINEF+DIST2 CALL PRINT+DIST1 POP HL GETEIN: LD B,#FF LOOP1:INC B ; NAMENSLAENGE NACH B LD A,(HL) OR A INC HL JR NZ,LOOP1 RET ZWBOUT: LD A,H ; HIGHBYTE CALL BYTOUT+DIST1 LD A,L BYTOUT:PUSH AF RRA RRA RRA RRA ; HIGHNIBBEL NACH UNTEN CALL NIBOUT+DIST1 POP AF NIBOUT:AND #0F ; NUR UNTERES NIBBLE ADD A,"0" CP ":" JR C,LETTER ADD A,"@"-"9" LETTER:JP #BB5A ; TXT OUTPUT PRINT: PUSH AF LD A,(HL) BIT 7,A ; STRINGENDE? RES 7,A ; BIT 7 LOESCHEN OUTP:CALL #BB5A ;TXT OUTPUT INC HL JR Z,PRINT+1 POP AF RET ; BIT 7 GESETZT. EDIT:PUSH AF CALL CLIN+DIST1 RETU:JP NC,INITP+DIST2 POP AF RET CLIN:CALL #BB09 ; CLEAR INPUT JR C,CLIN PUSH HL CALL #B915 ; KL PROBE ROM LD A,H ; VERSION POP HL LD (HL),0 ; EINGABEPUFFER LOESCHEN RRA ; BIT 0 => CY JP C,#BD5B ; 664 RRA ; BIT 1 => CY JP C,#BD5E ; 6128 JP #BD3A ; 464 ; ******************* ; SCREEN UEBERTRAGUNG ; ******************* PROG2:; FILE IM SCREENRAM LD HL,EXCHN+DIST2 ; VERTAUSCHER SICHERN LD DE,#9000 LD BC,PROG3-EXCHN LDIR LD HL,LADE+#3FFF ; ENDE SCHIRM LD DE,#FFFF ; ENDE PROGRAMM LD IY,#7FFF ; ENDE ZWISCHENSPEICHER LD BC,#4000 PUSH BC JP #9000 EXCHN:; SCREENS VERTAUSCHEN LD A,(DE) ; PROGRAMM LDD ; (HL)=>(DE) LD (IY),A ; ZWISCHENSPEICHER DEC IY JP PO,PROG3+DIST2-#8000 JR EXCHN PROG3:; =SCRLDR LD A,#40 CALL #BC08 ; SCR SET BASE CALL VSCHSC+DIST1-#8000 POP BC ; #4000 PUSH AF ; CY LD H,B LD L,C LD DE,#C000 LD A,D ; #C0 LDIR ; NACH OBEN CALL #BC08 ; SCR SET BASE POP AF JP ANFVEC+DIST1-3 ; WIE NORMALES SAVE ENDEN INITP: LD HL,AMSDOS+DIST3 LD DE,AMSDOS LD BC,PROG-AMSDOS LDIR LD HL,PROG+DIST1 LD DE,PROG LD BC,PROG2-PROG LDIR LD HL,PROG2+DIST2 LD DE,PROG2 LD BC,USER-PROG2 LDIR LD HL,USER+DIST4 LD DE,USER LD BC,FINIS-USER LDIR JP AMSDOS DELAY:; VERZOEGERUNGSSCHLEIFE NACH CALL ZOGE+DIST2 JP PROG+DIST1 ; VON VORNE ZOGE:LD B,0 WL:HALT DJNZ WL LD A,7 JP #BB5A TSTORT:; TEST AUF GUELTIGEN SPEICHERBEREICH PUSH HL PUSH DE PUSH BC LD HL,(START) PUSH HL LD DE,-#3B ADD HL,DE POP HL JR NC,WARN ; START VOR 3B LD DE,-#AC00 PUSH HL ADD HL,DE POP HL JR NC,WARNOK ; <AC00 LD DE,-#C000 PUSH HL ADD HL,DE POP HL JR NC,WARN WARNOK:POP BC POP DE POP HL RET WARN:LD HL,WRNSTR+DIST2 CALL PRINT+DIST1 JR WARNOK WRNSTR:DEFB 13,10,7 DEFM "Warnung. Ung{ltiger Speicherbereich" DEFB 13,10,"."+128 ST0:DEFB 13,10 DEFM "Name auf" DEFB " "+128 ST1:DEFM "Dis" DEFB "k"+128 ST2:DEFM "Kas" DEFB "s"+128 ST4: DEFM "ette ( <ESC> => Men{) ?" LINEF:DEFB 13,138 CLEAN:DEFB 12,31,26,1,24,32+128 CAS1:DEFM "Disc - Tap" DEFB "e"+128 DEFW ST2+DIST2,ST1+DIST2 CAS2:DEFM "Tape - Dis" DEFB "c"+128 DEFW ST1+DIST2,ST2+DIST2 CAS3:DEFM "Tape - Tap" DEFB "e"+128 DEFW ST2+DIST2,ST2+DIST2 CAS4:DEFM "Disc - Dis" DEFB "c"+128 DEFW ST1+DIST2,ST1+DIST2 CAS5:DEFM " Transfer " DEFB 24,30,138 DESDIS:DEFB 13,10 DEFM "Legen Sie bitte die " DEFM "Ziel" DEFM "diskette ein " DEFB "!",13,10+128 MEMORY:DEFM "Asciifile zu lang" DEFB "."+128 TYPSTR:DEFB 13,10 DEFM "Filetyp: " ENTYP:DEFB "*"," ","&"+128 STASTR:DEFM " Anfang: " DEFB "&"+128 LENSTR:DEFM " L}nge: " DEFB "&"+128 ATOSTR:DEFM " Autostart: " DEFB "&"+128 USER: LD HL,USRSTR CALL PRINT LD A,(#AC01) PUSH AF RRA RRA RRA RRA CALL NIBOUT POP AF CALL NIBOUT LD HL,USTR1 CALL PRINT CALL EING ; EIN NIBBLE LD C,A LD A,0 JR Z,JPAMS ; ENTER CALL EING ; UNTERES NIBBLE LD D,A LD A,C JR Z,JPAMS ; ENTER ANGETROFFEN RLCA RLCA RLCA RLCA ; WIRD OBERES NIBBLE OR D JPAMS:LD (#AC01),A ; USER SETZEN CALL NZ,ZOGE ; 2 SEKUNDEN WARTEN JP AMSDOS ; EINGABE VON HEXZAHLEN ;EIN NIBBLE EING: CALL #BB81 CALL #BB06 CALL #BB84 CP 13 ; ENTER JR NZ,NOTEN RET NOTEN: LD B,A SUB "0" JR C,EING ;JA CP 9+1 JR C,FERTIG LD A,B HZAHL:AND 223 ; UPPER$ LD B,A ; ASCII CP "A" JR C,EING CP "F"+1 JR NC,EING SUB "A"-10 FERTIG:PUSH AF LD A,B CALL #BB5A POP AF RET LOESCH: LD HL,DISK CALL KLFCOM LD HL,LOES CALL PRINT LD DE,LADE ; BUFFER CALL #BC9B ; CAT LD A,11 CALL #BB5A ; CSR HOCH LD HL,ST0 ; "NAME AUF" CALL PRINT LD HL,ST1 ; "DISK" CALL PRINT LD HL,ST4 ; "KETTE..." CALL PRINT LD HL,#6000 ; PLATZ FUER NAME CALL CLIN ; EDITOR JP NC,AMSDOS ; ESCAPE CALL GETEIN ; LAENGE NACH B HOLEN ;** STRINGDESCRIPTOR ERZEUGEN ** DESCRI:EQU #54FF LD IX,#5000 LD HL,DESCRI LD (IX),L LD (IX+1),H LD (HL),B ; LAENGE INC HL LD (HL),L ; 0 INC HL LD (HL),#60 ; NAME LD HL,ERA LD A,1 ; 1 PARAMETER CALL KLFCOM+1 ; NAME FINDEN UND AUSFUEHREN CALL ZOGE JR LOESCH LOES: DEFB 4,2,31,26,1,24 DEFM " L|schen " DEFB 24+128 USRSTR: DEFB 4,1,31,1,10 DEFM "Bisheriger User " DEFB "&"+128 USTR1:DEFB 13,10,10 DEFM "Neue Usernummer ? " DEFB "&"+128 CHNDRI: LD HL,DRISTR CALL PRINT LD A,(#AC00) ; AKTUELLES DRIVE ADD A,"A" CALL #BB5A ; DRIVE AUSGEBEN LD HL,NEWDRI CALL PRINT GETDRI:CALL #BB06 LD B,0 ; DRIVE 0 CP 13 ; ENTER => A JR Z,NWDR AND 223 ; UPPER$ SUB "A" JR Z,NWDR-1 CP 1 JR NZ,GETDRI LD B,A NWDR:LD A,B LD (#AC00),A JP AMSDOS DRISTR: DEFB 12,31,1,8 DEFM "Angemeldetes Laufwerk:" DEFB " "+128 NEWDRI:DEFB 13,10,10 DEFM "Neues Laufwerk ?" DEFB " "+128 JR C,GETDRI MENU:DEFB 4,1 DEFB 31,7,3 DEFM "TRANS" YPOS:EQU 4 XPOS:EQU 7 DEFB 31,XPOS,YPOS+2 DEFM "Men{" DEFB 31,XPOS,YPOS+4 DEFM "1 Disc-Tape" DEFB 31,XPOS,YPOS+6 DEFM "2 Tape-Disc" DEFB 31,XPOS,YPOS+8 DEFM "3 Tape-Tape" DEFB 31,XPOS,YPOS+10 DEFM "4 Disc-Disc" DEFB 31,XPOS,YPOS+12 DEFM "5 File l|schen" DEFB 31,XPOS,YPOS+14 DEFM "6 User setzen" DEFB 31,XPOS,YPOS+16 DEFM "7 Drive wechseln" DEFB 31,XPOS,YPOS+18 DEFM "0 Ende" DEFB 31,7,25 DEFM "(C) 1986,87 J{rgen Webe" JUREND:DEFB "r"+128 FINIS: ZAENGE:EQU FINIS-BEGIN ZAENG1:EQU PROG-BEGIN ZAENG2:EQU PROG2-PROG ZAENG3:EQU USER-PROG2 ZAENG4:EQU FINIS-USER DIST1:EQU DESTI1-PROG DIST2:EQU DESTI2-PROG2 DIST3:EQU DESTI3-AMSDOS DIST4:EQU DESTI4-USER |