BSAVEASM ;********** PROGRAMM BSAVE ************* ; * ;Abspeichern von BASIC-Programmen auf * ;MC-Ebene mit AUTO-Start auf Diskette * ;oder Kassette. * ;Es wird automatisch der Dateityp .KCB * ;vergeben, um die Files von reinen * ;MC-Programmen unterscheiden zu k|nnen.* ; * ;Test, ob BASIC initialisiert wurde. * ; * ;BASIC-Programmspeicher kann auf 7FFFH * ;begrenzt werden, um Programme kompa- * ;tibel zum KC85/3 zu machen. * ; * ; ` ml 26.01.93 * ;*************************************** BUF EQU 0B700H ARGN EQU 0B781H ARG1 EQU 0B782H ARG2 EQU 0B784H ARG3 EQU 0B786H NUMNX EQU 0B796H NUMVX EQU 0B787H WINON EQU 0B79CH WINLG EQU 0B79EH CURSO EQU 0B7A0H COLOR EQU 0B7A3H CCTL0 EQU 0B7A6H CCTL1 EQU 0B7A8H PV1 EQU 0F003H CRT EQU 00H LF EQU 0AH CLS EQU 0CH CR EQU 0DH KBD EQU 04H WAIT EQU 14H ERRM EQU 19H HLHX EQU 1AH HLDE EQU 1BH AHEX EQU 1CH OSTR EQU 23H OCHR EQU 24H CRLF EQU 2CH DABR EQU 32H SAVE EQU 36H ;------------------ ORG 0BA00H ;BASIC-Autostart: ; BSTART: IN A,(88H) OR 80H ;BASIC-ROM on AND 0FBH ;IRM off OUT (88H),A LD A,(IX+4) OR 60H ;BASIC-Ebene OUT (86H),A LD (IX+4),A LD A,89H ;RUN LD (362H),A JP 0C41FH ;----------------------- STARTE: DW 7F7FH DB 'BSAVE' DB 1 ; ;Test, ob BASIC initialisiert wurde: ;START: LD A,(0300H) CP 0C3H JR NZ,NBAS LD A,(0303H) CP 0C3H JR NZ,NBAS LD HL,035FH LD E,(HL) INC HL LD D,(HL) LD HL,0400H SBC HL,DE JR C,AANZ NBAS: CALL PV1 DB OSTR DB 'BASIC nicht ' DB 'initialisiert!' DB 7,CR,LF NOP RET ; ;Adressen anzeigen: ; AANZ: CALL INIT CALL PV1 DB OSTR DB CLS,LF DB ' BASIC-Programm als ' DB 'MC-File abspeichern' DB LF,LF NOP LD A,19 LD (CURSO),A CALL PV1 DB OSTR DB ' ` ML-Soft' DB 27H,'93',CR,LF NOP LD A,'_' LD B,40 UNST: CALL PV1 DB CRT DJNZ UNST CALL PV1 DB OSTR DB CR,LF DB 'Anfangsadresse: 0300H' DB CR,LF DB 'Endadresse : ' NOP LD HL,(03D7H) CALL PV1 DB HLHX CALL PV1 DB OSTR DB 8,'H',CR,LF NOP LD A,H AND 80H JR Z,EOK CALL PV1 DB OSTR DB CR,LF DB '--> Programm zu gro~!' DB 7,CR,LF NOP RET EOK: CALL PV1 DB OSTR DB 'Startadresse : 0370H' DB CR,LF DB 'BASIC-RAM-Ende: ' NOP LD HL,(03B0H) CALL PV1 DB HLHX CALL PV1 DB OSTR DB 8,'H',CR,LF,LF NOP LD A,H AND 80H JR Z,RAOK LD DE,(0356H) SBC HL,DE ;HL=0100H EX DE,HL LD HL,7FFFH SBC HL,DE ;HL=7EFFH PUSH HL LD HL,(03D7H) LD DE,100H ADD HL,DE POP DE ;DE=7EFFH SBC HL,DE JR NC,RAOK ;Begr. n. m|gl. CALL PV1 DB OSTR DB 'RAM auf 7FFFH ' DB 'begrenzen (y/n) ? ' NOP YN: CALL PV1 DB KBD CP 3 JP Z,BRK AND 0DFH CP 'N' JR Z,RAOK CP 'Y' JR NZ,YN ; ;RAM begrenzen: ; LD A,10H LD (CURSO),A CALL PV1 DB OSTR DB 0BH,0BH DB '7FFFH' DB CR,LF,LF NOP EX DE,HL LD (0356H),HL LD HL,7FFFH LD (03B0H),HL LD (03C4H),HL LD HL,(03D7H) LD (03D9H),HL LD (03DBH),HL ; ;Startprogramm eintragen: ; RAOK: LD HL,BSTART LD DE,0370H LD BC,STARTE-BSTART LDIR LD C,0EH CALL NAME RET C ;BRK PUSH HL ;Name LD HL,BUF LD B,128 CLR: LD M,0 INC HL DJNZ CLR LD HL,(3D7H);END-Adr. LD (BUF+19),HL EX DE,HL LD HL,300H ;ANF-Adr. LD (BUF+17),HL LD HL,370H ;START-Adr. LD (BUF+21),HL CALL PV1 DB CRLF LD A,3 LD (BUF+16),A POP HL PUSH HL LD DE,BUF LD BC,8 LDIR ;Dateiname INC HL LDI LDI ;..typ LDI LD BC,0FC80H IN A,(C) CP 0A7H ;Floppy? JR NZ,KASS CALL PV1 DB OSTR DB 2,LF,2 DB 'assette oder ' DB 'iskette ? ' NOP INKEY: CALL PV1 DB KBD CP 3 JP Z,BRK AND 0DFH CP 'D' JR Z,ANZK CP 'K' JR NZ,INKEY ANZK: CALL PV1 DB CRT CP 'D' JR Z,DISK CALL PV1 DB CRLF KASS: LD DE,ARGN LD HL,BUF+16 LD BC,7 LDIR POP HL ;Name CALL PV1 DB SAVE RET DISK: POP HL CALL PV1 DB CRLF LD HL,BUF LD DE,0B80H;Anzahl(E) LD BC,81F2H;Portadr. ADR: OUTI INC B INC B DEC E JR NZ,ADR LD A,D CALL STEUER JR Z,NERR 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',CR,LF,7 NOP RET ERRTX: LD A,2 ;CLLN CALL PV1 DB CRT LD BC,00F1H;Fehlertext ERRT1: IN A,(C) INC B AND A RET Z ;00=Ende CALL PV1 DB OCHR JR ERRT1 NERR: LD BC,81F2H BIT 3,D ;open? JR Z,L02 ;nein LD HL,(BUF+17);Anf.-Adr. L02: PUSH HL LD DE,(BUF+19);End-Adr. AND A SBC HL,DE ;fertig? POP HL LD BC,81F2H LD DE,0380H JR C,ADR ;nein LD A,43H ;write-close CALL STEUER JR NZ,ERROR RET ;------- ;FLOAD mit Adressanzeige ; ;--------------- DW 7F7FH DB 'BLOAD' DB 1 CALL INIT CALL NAME12 RET C LD A,9 ;Lesen open CALL STEUER JP NZ,ERROR LD BC,90F2H IN A,(C) ;ARGN LD (NUMNX),A CP 2 JR C,FE3 ;wenn<2 CP 4 JR C,BLOC ;wenn<4 FE3: CALL PV1 DB OSTR DB 'Keine CAOS-Datei !' DB 7,CR,LF NOP RET BLOC: 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' CALL PV1 DB HLDE ;Aadr, Eadr EX AF,AF' JR C,NST4 ;keine Startadr EX (SP),HL LD (NUMVX),HL CALL PV1 DB HLHX ;Sadr POP HL NST4: CALL PV1 DB CRLF LST: LD A,1 ;Lesen normal CALL STEUER JP NZ,ERROR DEC C LOA: INI ;Daten -> (HL) INC B INC B PUSH HL SBC HL,DE ;fertig? POP HL JR NC,LOST ;ja LD A,B AND A ;neuer Block? JR NZ,LOA ;nein JR LST ;ja LOST: LD A,(NUMNX) CP 3 RET C ;kein Start CALL PV1 DB OSTR DB 'Programm starten? ' DB '(y/n): ' NOP CALL PV1 DB KBD ;Taste? PUSH AF CALL PV1 DB OCHR ;anzeigen CALL PV1 DB CRLF POP AF CP 'Y' JR Z,ST CP 'y' RET NZ ST: LD HL,(NUMVX) JP (HL) ;Start Programm ;------- DW 7F7FH DB 'DIR' DB 1 CALL INIT LD A,CLS CALL PV1 DB CRT LD A,0DH ;Directory open WDI: CALL STEUER JP NZ,ERROR BIT 2,A ;Ende JR NZ,STAT 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 LD A,' ' CALL PV1 DB OCHR INC B DEC D JR NZ,NA3 LD E,2 CALL ANZ LD A,5 ;Dir weiter JR WDI ;------- DW 7F7FH DB 'STAT' DB 1 LD BC,83F1H IN A,(C) CP 20H ;DEP ab 2.0? JR C,STAT ;nein LD A,1DH ;Status open CALL STEUER JP NZ,ERROR LD E,20 LD B,82H CALL ANZ ;Disk-total STAT: LD A,15H ;Status normal CALL STEUER JP NZ,ERROR 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 7F7FH DB 'REN' DB 1 CALL NAME12 RET C LD A,29H ;Ren old CALL STEUER CALL NAME12 RET C LD A,21H ;Ren new OUT: CALL STEUER JP NZ,ERROR RET ;------- DW 7F7FH DB 'ERA' DB 1 CALL NAME12 RET C LD A,11H ;Era JR OUT ;------- DW 7F7FH DB 'SETRO' DB 1 CALL NAME12 RET C LD A,25H ;Setro JR OUT ;------- DW 7F7FH DB 'SETWR' DB 1 CALL NAME12 RET C LD A,31H ;Setwr JR OUT ; ;--- Unterprogramme --- ; INIT: LD HL,0 LD (WINON),HL LD HL,2028H LD (WINLG),HL LD A,29H LD (COLOR),A LD HL,0EE00H LD (CCTL0),HL LD HL,0FE00H LD (CCTL1),HL RET ;------- ; ;Name eingeben: ; NAME12: LD C,12H NAME: CALL PV1 DB OSTR DB 2,'Name : .KCB' NOP LD A,6 LD (CURSO),A NAM1: LD HL,(CURSO) NAM: CALL PV1 DB KBD CP 3 JP Z,BRK END: CP 8 JR C,NAM ; < 8 CP LF JR C,ASC ; < 10 (CUU,CUD) CP CR JR Z,ENTER CP 20H JR C,NAM ; < 20H ASC: CALL PV1 DB CRT LD A,(CURSO) CP 6 JR C,MA2 CP C JR C,NAM1 MA2: LD (CURSO),HL JR NAM ENTER: CALL PV1 DB CRLF LD DE,(CURSO) DEC D LD E,6 CALL PV1 DB DABR PUSH HL LD E,12 LD BC,82F3H NAM2: LD A,M OUT (C),A ;Name ausgeben INC HL INC B DEC E JR NZ,NAM2 POP HL RET ;------- ;Steuerbyte ausgeben: ; STEUER: LD BC,80F3H OUT (C),A ;Steuerbyte NRDY: PUSH BC LD A,1 CALL PV1 DB WAIT POP BC IN A,(C) BIT 0,A JR NZ,NRDY BIT 7,A ;Fehler? RET ;------- DW 7F7FH DB 'LW' DB 1 LW: LD BC,83F1H IN A,(C) CP 20H ;DEP ab 2.0? JR NC,LW1 ;ja CALL PV1 DB OSTR DB 'DEP.COM ab Version ' DB '2.0 erforderlich !' DB 7,CR,LF NOP RET LW1: CALL PV1 DB OSTR DB 2,'>' ;Eingabesymbol NOP LKBD: CALL PV1 DB KBD ;Taste abwarten LD D,1 CP CR JR Z,LANZ ;nur anzeigen CP 3 JR Z,BRK BIT 5,A JR Z,LW2 SUB 20H ;klein->gro~ LW2: CALL PV1 DB OCHR LD BC,81F1H OUT (C),A CALL PV1 DB CRLF LD D,3 ;Anforderung LANZ: LD BC,80F1H OUT (C),D SCHL1: IN A,(C) BIT 0,A ;R}ckmeldung? JR NZ,SCHL1;nein BIT 7,A ;Fehler? JP NZ,ERROR;ja LD BC,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 BRK: CALL PV1 DB CRLF SCF ;BRK-Flag! RET ;------- DS 0C000H-$  À@Àt(Àp6ÀnTop of Text: End of Text: Start of MC: ASM-Offset : õÛˆB CRLF SCF ;BRK-Flag! RET ;------- DS 0C000H-$  À@Àt(Àp6ÀnTop of Text: End of Text: Start of MC: ASM-Offset : õÛˆ