.z80 aseg org 100h hpr1 equ 30h ;Haltepunktadresse fuer HP aus JHP bzw. QHP hpr2 equ 38h ;Haltepunkadresse fuer HP1/HP2 oder OPC ohpr1 ohpr1 equ 0f7h ;HP-Code fuer RST-Befehl JHP/QHP ohpr2 equ 0ffh ;HP-Code fuer RST-Befehl HP1/HP2 ;bei Implementierung entsprechend einstellen ld hl,lad ld de,09a00h ld bc,end-L8000 ldir jp L8000 lad: .phase 09a00h L8000: jp L80E3 L80E3: ld hl,(6) ;Warmstartadresse ld (L8000+1),hl ;Start des Monitor L89C4: ld hl,end+80h ;Stack fuer Monitorprogramm ld (spnorm),hl ;Adresse Stacknormal ld sp,hl ld hl,B8102 ;Registerbelegung auf Null stellen ld de,W8137+1 ;Arbeitszellen initialisieren call L8961 ;von - mit Null ld hl,L8000-10h ;Stack fuer Anwender ld (W8114),hl ld a,0C3H ;OPC fuer JP ld hl,L8000 ld (6),hl ;BDOS-Aufruf umlenken call L8955 ;Adr. NMI-ISR auf 66h eintragen ld (hpr1),a ;JP auf (RST 30), HP aus JHP bzw. QHP ld hl,L8CBE ;Adr. Serviceroutine ld (hpr1+1),hl ld (hpr2),a ;JP auf (RST 38), HP wegen HP1/HP2 oder OPC ohpr2 ld hl,L8C0B ;Adr. Serviceroutine ld (hpr2+1),hl ld a,3fh ;max. moegl. Eingabelaenge ld (inmax),a ;eintragen xor a ld (prff),a ;Drucker aus ld a,0fh ;Zeilenlaenge fuer Ausgabeformat T/L ld (lline),a ld a,i ld (B811A),a ;OS-Interrupt-Tabelle als Standard ld a,3 ld (jhptab+40),a ld (qhptab+60),a ;HP-Tab.enden kennzeichnen ld hl,MAB60 ;Monitorkopf anzeigen call strout ;Aufrufschleife bei Rueckkehr aus Kommandos L8A3E: xor a ld (mrstat),a ld c,":" ;Eingabeaufforderung call ccout ld hl,L8A3E ;Rueckkehradresse kellern push hl L8A57: ld b,40h ;Laenge Befehlspuffer call L86A3 ;Eingabe call getch call convkg ;Wandlung klein --> gross cp 0dh ;ENTER fuer Kommandofortsetzung jr nz,L8A57A ld a,(kdopuf) L8A57A: ld (kdopuf),a sub "a" jp m,LAA06 cp 1Ah jp nc,LAA06 add a,a ld e,a ld d,0 ld hl,W8A7D ;Tabelle der Befehlsadressen add hl,de ld a,(hl) inc hl ld h,(hl) ld l,a jp (hl) ;entspr. Befehl verzweigen ; W8A7D: defW L8AB1 ;A-Assembler defW back ;B-Abspeichern File defW L8AC0 ;C-Fortsetzung eines Programms defW dump ;D-Dump mit Auswahl x,h,a defW L8ACE ;E-Speichervergleich defW L8ADA ;F-Speicherfuellen defW L8AE6 ;G-Programmstart defW L8AED ;H-Addition/Subtraktion defW indir ;I-Input Direktkanal defW L8B00 ;J-Haltepunkte defW L8B3C ;K-Kontollsumme ueber Bereich defW L8B3F ;L-Rueckuebersetzen defW L8B46 ;M-Speicherinhalt verschieben defW L8B52 ;N-Einstellen Sender/Empfaenger defW L8B56 ;O-Output Direktkanal defW L8B59 ;P-Programm anstelle Protokollzeile defW L8B65 ;Q-Haltepunkte mit Programm defW L8BA1 ;R-Laden File defW L8BA4 ;S-Display ein Byte, Modifikation defW L8BAB ;T-Abarbeitung n Befehle mit Protokoll defW L8BB2 ;U-Empfaenger Lesen File von Kassette defW L8BBE ;V-Sender Schreiben File auf Kassette defW L8BCA ;W-Abarbeiten n Befehle, Protokollzeile nach Befehl n defW L8BD6 ;X-Ausgabe Protokollzeile defW L8BF6 ;Y-frei defW L8BF9 ;Z-frei ;Warmstart Monitor L82E6: ld hl,L8000-10h ld (W8114),hl L82EC: xor a ;Drucker aus ld (prff),a L82F1: ld sp,(spnorm) jp L8A3E ;Fehlerbehandlung LAA06: call mran5 ;Assa -Fehler cp "s" ;Kdo "S" keine Fehlermeldung, hier nur Verlassen jr z,L82F1 ld c,"?" ;Fehleranzeige call ccout jr L82F1 ;Auswert-Puffer einstellen L879E: ld de,conpu push de ld a,"0" ld (de),a inc de ld a,0FFh ld b,1Fh L87AA: ld (de),a inc de djnz L87AA pop de ret ;Wandlung der Eingabeparameter aus ASCII-Puffer in HEXA-Stack(vor SP) ;1.Wort: Anzahl der Parameter n <--- SP ;2.Wort: Parameter n ;.... ;n.Wort: Parameter 1 parstc: call L879E ;Konvertierungspuffer 'conpu' intialisieren xor a ld (W81C4),a ;Parameterzaehler loeschen call getch ;1.Zeichen aus Eingabepuffer holen L87BA: cp 0dh ;keine Parameter jr z,L87E2 L87BE: cp " " ;Blockung zwischen den Parametern uebergehen jr z,L87CB cp "," jr z,L87CB ld (de),a ;Zeichen in eintragen inc de ;-Zeiger weiterstellen L87C4: call getch ;weitere Zeichen cp 0dh ;Ende ? jr nz,L87BE ;nein L87CB: push af ld de,conpu call L860D ;Eingabeparameter konvertieren, Hexa-Wert in jr z,LAA06 ;Fehler call L879E ; loeschen pop af ;Zeichen zurueck ex (sp),hl ;Parameterwert in Stack push hl ;Rueckkehradresse retten ld hl,W81C4 inc (hl) ;Parameterzaehler erhoehen cp " " ;? weitere Parameter jr z,L87C4 ;ja cp "," jr z,L87C4 L87E2: ld h,0 ld a,(W81C4) ;Parameteranzahl ld l,a ex (sp),hl ;in Stack eintragen push hl ;Ruechkehradresse zurueck ret ;Konvertierung ASCII-String ab in Hexa-Wert in L860D: push de ;Zeiger auf Konvertierungspuffer merken ld b,0 L8610: ld a,(de) cp 0FFh ;String-Ende jr z,L8619 inc b ;Stringlaenge feststellen inc de jr L8610 L8619: dec de ;letztes Zeichen ld a,(de) ld c,10 ;Zahlenbasis dezimal cp "z" jr z,L8633 ld c,8 ;oktal cp "o" jr z,L8633 ld c,2 ;binaer cp "l" jr z,L8633 ld c,16 ;hexa cp "h" jr nz,L8634 ;ohne Kennung stets als Hexa L8633: dec b ;Kennung von Stringlaenge ab L8634: ld hl,0 L8637: push bc push hl pop de L863A: dec c ;Zahlenbasis jr z,L8642 ;als Zaehler der Stellensumme add hl,de jr c,L8660 ;Fehler Ueberlauf jr L863A L8642: pop bc ;Stringlaenge pop de ;Zeiger auf ld a,(de) call mran1 ;+Wandl. gross call L8664 ;obere ASCII-Tetrade weg, untere auf Binaerwert cp 0ah jr c,L864E sub 7 L864E: cp c jr nc,L8662 add a,l ld l,a ld a,h adc a,0 ld h,a jr c,L8662 push de djnz L8637 pop de or 0FFh ;Z=0 fehlerfreie Wandlung in ret L8660: pop bc ;Fehler pop de L8662: xor a ;Z=1 ret L8664: push af sub ":" ;Test auf Ziffern jr c,L866D sub 6 jr c,L8672 L866D: pop af inc de sub "0" ret L8672: pop af ret ;Parameteruebernahme aus Stackbereich nach B8132 ff. L850F: push bc ;Register retten push hl push de push af ld (W812C),sp ;Rettungsbereich merken ld hl,8 ;4 Rettungseintraege add hl,sp ld sp,hl ex (sp),hl ;Rueckkehradresse ld (W812E),hl pop hl pop bc ld hl,B8132 ;MR-Parameterpuffer ld b,c ld (hl),b ;Anzahl Uebergabeparameter dec b inc b jr z,L853D ;keine Parameter ld d,b rlc c ld b,0 add hl,bc ld b,d L8536: pop de ;Parameter entnehmen ld (hl),d ;eintragen dec hl ld (hl),e dec hl djnz L8536 L853D: ld hl,(W812E) push hl ld (W812E),sp ld sp,(W812C) pop af pop de pop hl pop bc ld sp,(W812E) ret L8961: xor a ;Loeschen Bereich bis L8962: ld (hl),a call L842E ;Test = inc hl jr nz,L8962 ret getch: call L8350 ;Zeichen aus M8200 entnehmen call convkg ;Wandlung Klein-->Gross cp 0Dh ;Puffer leer bzw. entleert jr z,L8686 cp " " jr z,L8688 cp 3 jr z,L868B L8686: scf ret L8688: scf ccf ret L868B: or a ret ;Wandlung Gross-->Klein convkg: cp "A" ret c cp 5eh ret nc or 20h ret ;Puffer bis + mit Null Loeschen pufclr: push hl push bc xor a L86AD: ld (hl),a inc hl djnz L86AD pop bc pop hl ret ;Eingabe einer Zeile , max. Laenge in , Puffer wird zuvor geloescht L86A3: push de push hl L86A5: push bc ld hl,M8200 ;Eingabepuffer call pufclr ;mit Null loeschen ld (inlen),a ;Eigabelaenge Null L86B8: call charin cp 10h ;^P betaetigt jr nz,L86BB ld a,(prff) ;Printer-FF or a ;kippen jr z,LAB26 xor a ;Printer aus LAB20: ld (prff),a jr L86B8 LAB26: ld a,3 ;Printer ein jr LAB20 ;Auswertung von Steuerzeichen L86BB: cp 3 ;^C jp z,0 ;WBOOT cp 8 ;Kursor links jp z,L8768 cp 7Fh ;DEL jr z,L86F1 cp 15h ;^U jr z,L870D cp 12h ;^R jr z,L8718 ld (hl),a ;Zeichen in Puffer ablegen cp 0Dh ;Eingabeende jr z,L8732 cp 18h ;^X jp z,L8792 cp 20h jr c,L86B8 ;alle anderen Zeichen < 20h uebergehen ld c,a call ccout ;Eingabe anzeigen inc hl ld a,(inlen) inc a ld (inlen),a dec b jp z,L8747 jr L86B8 L86F1: ld a,(inlen) ;DEL-Behandlung or a ;Laenge Eingabe Null jr z,L86B8 ld c,"/" call ccout dec hl ld c,(hl) ;geloeschtes Zeichen anzeigen call ccout ld (hl),0Dh ;Eingabeende kennzeichnen ld a,(inlen) dec a ld (inlen),a inc b jr L86B8 ;weiter Tastatur abfragen L870D: ld c,"#" ;^U-Behandlung call ccout ;alte Zeile abschliessen call newl L8715: pop bc ;mit neuer Zeileneingabe beginnen jp L86A5 L8718: push hl ;^R-Behandlung ld hl,M8200 call newl ld a,(inlen) ;Laenge Eingabe or a jr z,L872F push bc ld b,a L8727: ld c,(hl) ;Rumpfzeile neu anzeigen call ccout inc hl djnz L8727 pop bc L872F: pop hl jp L86B8 ;weiter Tast.abfrage ;Eingabeende durch ENTER L8732: ld hl,M8200 ;Beginn Eingabepuffer ld (inpoi),hl ld a,0FFh L8740: call newl pop bc pop hl pop de ret L8747: call charin ;Reaktion max. Eingabelaenge erreicht cp 3 ;^C jr z,L8740 cp 8 ;^H,<- jr z,L8768 cp 7Fh ;DEL jr z,L86F1 cp 15h ;^U jr z,L870D cp 12h ;^R jr z,L8718 cp 0Dh ;ENTER jr z,L8732 cp 18h ;^X jr z,L8792 jr L8747 L8768: ld a,(inlen) ;^H-Behandlung, <- or a jp z,L86B8 ;Eingabelaenge Null call L877B ;Sequenz <-,space,<- ausgeben jp L86B8 ;weiter Tast.abfr. ;Steuercodesequenz fuer Loeschen Zeichen auf Kursorposition L877B: call L878C ;<- inc b dec hl ld (hl),0dh ;Ende neu setzen ld a,(inlen) dec a ;Laenge erniedrigen ld (inlen),a call space ;Zeichen ueberschreiben L878C: ld c,8 ;Kursor links call ccout ret L8792: ld a,(inlen) ;^X-Behandlung or a jp z,L8715 call L877B ;Puffer und Anzeigezeile loeschen jr L8792 ;Eingabe eines Zeichens, Grossbuchstaben werden gewandelt charin: call dircon jp convkg ;Ausgabe eines Leerzeichens space: push bc ld c," " jr L832D ;Zeilenschaltung newl: push bc ld c,0ah ;neue Zeile lf call ccout ld c,0dh ;Zeilenanfang cr L832D: call ccout pop bc ret ;Zeichen aus Eingabepuffer entnehmen L8350: push hl ld hl,inlen ;Laenge Eingabe ld a,(hl) or a ;? Eingabepuffer leer bzw. entleert ld a,0dh jr z,L8363 ;ja dec (hl) ;Laengenzaehler erniedrigen ld hl,(inpoi) ;Zeiger im Eingabepuffer ld a,(hl) ;Zeichen entnehmen inc hl ld (inpoi),hl L8363: pop hl ret ;Ausgabe Zeichenkette bis 03 strout: push hl push bc push af L8368: ld c,(hl) ld a,c cp 3 ;Zeichenketten-Ende jr z,L837D cp 0dh jr z,L8378 call ccout L8375: inc hl jr L8368 L8378: call newl jr L8375 L837D: pop af pop bc pop hl ret ;Ausgabe Register A mit unveraenderten Registern praan: push hl push de push bc push af call L8386 jr L8342 ;Ausgabe Register HL mit unveraenderten Registern prhlan: push hl push de push bc push af call L8381 L8342: pop af pop bc pop de pop hl ret ; L8381: ld a,h call L8386 ld a,l L8386: push af rrca rrca rrca rrca and 0Fh call L8393 pop af and 0Fh L8393: call L839A call ccout ret L839A: add a,90h daa adc a,40h daa ld c,a ret L83A2: sub "0" ret c add a,0e9h ret c add a,6 jp p,L83AF add a,7 L83AF: add a,0ah or a ret ;Konsoleneingabe direkt dircon: push bc push de push hl dirc1: ld c,6 ;dircon ld e,0ffh call 5 or a jr z,dirc1 jr ccout2 ;Zeichen in auf Bildschirm ausgeben ccout: push bc push de push hl push af ld e,c ;Zeichen uebergeben ld a,(prff) ;Drucker paralell ? or a jr z,ccout1 push de ld c,5 ;list call 5 pop de ccout1: ld c,2 ;conout call 5 pop af ccout2: pop hl pop de pop bc ret ;Tastaturstatus abfragen, Zeichen ggf. einlesen LA9D0: push hl push de push bc push af ld hl,la9d1 push hl ;Rueckkehradresse merken ld hl,(1) ;WBOOT-Adresse inc hl inc hl inc hl ;Adr. BIOS-CONST (Konsolenstatus) jp (hl) la9d1: or a ;=0: kein Zeichen bereit call nz,LA9E3 pop af pop bc pop de pop hl ret ; LA9E3: call charin cp 13h ;^S Anzeige Stopp ret nz LA9E9: call charin cp 13h ;^S Anzeige weiter ret z cp 1bh ;ESC: Anzeige verlassen jp nz,LA9E9 call newl jp L82F1 ;zurueck in Kdo.-Schleife ;-------------------------------------------------------------------- ;Kdo "X", Ausgabe einer Protokollzeile L8BD6: call getch ;naechstes Zeichen jr z,L8BEE ;folgt nicht jp nc,L82EC cp "'" ;Hintergrundregister jr z,L8BF2 push af push bc push de push hl call L8D5C ;Identifikation Register, Aenderungsmoeglichkeit pop hl pop de pop bc pop af ret L8BEE: call L840B ;Protokollzeile mit Vordergrundregister ret L8BF2: call L83B3 ;Protokollzeile mit Hintergrundregister ret ;Register-Ermittlung und Aenderungsmoeglichkeit L8D5C: ld hl,M8DD9 push af call getch jp z,L8D7C ;kein weiteres Zeichen jp nc,L82EC push af call getch ;naechstes Zeichen pop bc ;= 2.Zeichen pop de ;= 1.Zeichen jr nz,tdopp ;noch Zeichen ld a,d cp "i" ;? Indexregister jr nz,L8D87 ld a,b ;welches ld hl,M8DF5 jr L8D98 tdopp: ld c,a call getch jr nz,L8D92 ;Fehler ld a,c cp "'" ;Hintergrund ? jr nz,L8D92 ld hl,dopph ;Doppelregister Hintergrund jr L8D98 L8D7C: pop af ;1.Zeichen cp "s" ;"XS" fuer SP jr z,L8D95 cp "p" ;"XP"fuer PC jr z,L8D95 jr L8D98 L8D87: ld a,b ;2.Zeichen cp "'" ;Hintergrund jr nz,vdopp ;nein ld a,d ;1.Zeichen ld hl,M8DFC jr L8D98 L8D92: jp LAA06 ;Fehler vdopp: ld hl,doppv ;Doppelregister Vordergrund jr L8D98 L8D95: ld hl,M8E15 ;Eingabe fuer SP bzw. PC L8D98: cp (hl) ;Tabellenposition festlegen jr z,L8DA7 push af ld a,(hl) or a jp m,LAA06 ;Tabellenende inc hl inc hl inc hl ;naechste Zeile pop af jr L8D98 L8DA7: call space inc hl push hl ;Tabellenpos. merken ld e,(hl) ;Offset zu Registerpuffer ld d,0 ld hl,B8102 ;Anfang Puffer Registerinhalte add hl,de ex de,hl pop hl ;Tabellenpos. zurueck inc hl ld b,(hl) ;Registerlaenge ld a,(de) ;Registerinhalt aus Puffer call praan ;anzeigen dec b jr z,L8DC3 ;8 Bit-Register dec de ld a,(de) ;LOW-Inhalt call praan ;anzeigen L8DC3: inc b ld c,"-" call ccout push bc ld b,4 ;max. 4 Byte Hexa-Eingabe call L87F6 ;Z=1, Hexa-Wert in ; Z=0 keine Eingabe pop bc ;Bytezahl des Registers ret nz ld a,l ;Eingabe in Registerpuffer eintragen ld (de),a dec b ret z inc de ld a,h ld (de),a ret ;Tabelle ueber Stelle Register im Puffer und Registerlaenge ;1.Stelle: Registername; 2.Stelle: Offset im Puffer; 3.Stelle: Laenge M8DD9: defm 'a' ;Vordergrundregister Einzeln defb 3,1 defm 'b' defb 0Bh,1 defm 'c' defb 0Ah,1 defm 'd' defb 0Dh,1 defm 'e' defb 0Ch,1 defm 'h' defb 17h,1 defm 'l' defb 16h,1 defm 'f' defb 2,1 defm 'i' defb 18h,1 defb 0FFh ;Tabellenende M8DF5: defm 'x' ;Indexregister defb 0Fh,2 defm 'y' defb 11h,2,0FFh M8DFC: defm 'a' ;Hintergrundregister Einzeln defb 1,1 defm 'b' defb 5,1 defm 'c' defb 4,1 defm 'd' defb 7,1 defm 'e' defb 6,1 defm 'h' defb 9,1 defm 'l' defb 8,1 defm 'f' defb 0,1,0ffh M8E15: defm 's' ;PC und SP defb 13h,2 defm 'p' defb 15h,2,0ffh doppv: defm 'l' ;Doppelregister Vordergrund defb 17h,2 defm 'c' defb 0bh,2 defm 'e' defb 0dh,2,0ffh dopph: defm 'l' ;Doppelregister Hintergrund defb 9,2 defm 'c' defb 5,2 defm 'e' defb 7,2,0ffh ; ;Anzeige Register Hintergrund L83B3: push hl push de push bc push af ld hl,(B8102) ;Flagregister anzeigen call L84C0 ;mit Auswertung der einzelnen Flags ld de,M8493 ;Textzeile Registernamen Hintergrund call L84B2 ;Blockung durch (') ld a,(B8103) ; call L846B ld hl,(W8106) ; call L847A ld hl,(W8108) ; call L847A ld hl,(W810A) ; call L847A call L84B2 ld a,(B8102) ; call L846B ld de,M849D ;Textzeile Indexregister call L84A7 ld a,(B8104) ; call L846B ld hl,(W8110) ; call L8471 ld hl,(W8112) ; call L8471 call L84A7 ld a,(B811A) ;Interrupt-Register call praan L8405: call newl jp L8342 ;zurueck zur Aufrufschleife ;Test Aufrufstand: Aufruf einer Reaktion oder Ausgabe Vordergrundregister L840B: push hl push de push bc push af ld hl,S81C6 bit 7,(hl) jr nz,L841C call L8434 ;Anzeige der Vordergrundregister jp L8342 ;Register zurueck, RET L841C: ld hl,L8342 ;Rueckkehraktion push hl ;einstellen ld hl,(W81CE) jp (hl) ;Aufruf Space mal L8424: push bc ld c," " L8427: call ccout djnz L8427 pop bc ret L842E: push hl or a sbc hl,de pop hl ret ;Anzeige Inhalt Vordergrund L8434: push hl push de push bc push af call L84BD ;Zustand Flagregister anzeigen ld de,M8487 ;Textzeile Registernamen call L84A7 ;Registername anzeigen, Blockung durch '=' ld a,(B8105) ;Inhalt aus Registerpuffer call L846B ; anzeigen ld hl,(W810C) ;Inhalt aus Registerpuffer call L8471 ; anzeigen ld hl,(W810E) ; call L8471 ld hl,(W8118) ; call L8471 ld hl,(W8114) ;SP call L8471 ld hl,(W8116) ;PC call L8471 call L84E6 ;Rueckuebersetzung PC-Befehl jp L8342 ;zurueck zur Aufrufschleife L846B: call praan ;Inhalt Register anzeigen jp space L8471: call L84A7 ;Anzeige Registername bis '=' L8474: call prhlan ;Inhalt anzeigen jp space L847A: call L84B2 ;Anzeige Registername bis ' jr L8474 M847F: defm 'SZXXXXXC' M8487: defm 'A=B=D=H=S=P=' M8493: defm 'A''B''D''H''F''' M849D: defm 'F=IX=IY=I=' L84A7: ld a,(de) ;Anzeige Zeichenkette bis einschliesslich (=) ld c,a call ccout cp '=' ;Abbruch inc de jr nz,L84A7 ret L84B2: ld a,(de) ;Anzeige Zeichenkette bis einschl. (') ld c,a call ccout cp '''' ;Abbruch inc de jr nz,L84B2 ret ;Anzeige der Flagzustaende L84BD: ld hl,(B8104) ;Inhalt Flagregister im Registerpuffer L84C0: ld b,8 ;Anzahl Flagpositionen ld de,M847F ;Text Flagzeile L84C5: ld a,(de) cp "X" ;Test ob Inhalt angezeigt werden soll jr z,L84E0 ;nein ld c,a ;Flagname anzeigen call ccout rlc l ;Bitposition aktivieren ld c,"0" jr nc,L84D6 ld c,"1" L84D6: call ccout ;Belegung 1 oder 0 anzeigen inc de djnz L84C5 call space ret L84E0: inc de ;Zeiger fuer naechstes Flag weiterstellen dec b rlc l jr L84C5 ;Ausfuehrung des Kdos "C", Continue L8AC0: call parstc ;Parameter in Stackbereich wandeln call L850F ;Parameter aus Stack in Uebergabebereich call L892C ;Scharfmachen der HP aus beiden HP-Tabelle, RST 30 call L8862 ;unklar, Wenn 0,S81C6 nicht gesetzt zurueck ld a,(B8132) ;Parameterzahl bei Kdo-Aufruf or a jr z,L92A6 ;keine uebergeben xor a ld (mrstat),a ld a,(B8132) ld b,a ;Anzahl uebergebener Haltepunkte ld c,0FFh push bc ld hl,W8133 ;Adr. HP-Adresse im Uebergabebereich jp L9126 ;wie Kdo "G" weiter mit eintragen HP L92A6: call L8E2A ;HP1, HP2 entspechend Befehlsart scharfmachen ld hl,S81C6 set 3,(hl) jp L9146 ; ;Kdo "G": Programmstart bei Adresse HP1 HP2 L8AE6: call parstc ;Uebernahme Eingabeparameter in Stackbereich call L850F ;Parameter aus Stack in Bereich ld a,(B8132) ;Parameteranzahl or a jr z,L9146 ;keine Parameter ld hl,(W8133) ;1. Parameter: Programmstart ld (W8116),hl ;als Anwender-PC eintragen cp 1 ;nur ein Parameter ? jr z,L9146 ;keine Haltepunkte dec a ld b,a ld c,0FFh push bc ld hl,W8135 ;2. Parameter HP1 L9126: ld de,W8120 L9129: ldi ldi ;auf HP-Feld eintragen inc de djnz L9129 ;ggf. auch HP2 pop bc ld hl,(W8120) ;Adr. HP1 ld a,(hl) ;OPC abholen ld (B8122),a ;und in HP1-Zeile eintragen ld (hl),ohpr2 ;OPC fuer RST38 fuer HP=scharf dec b jr z,L9146 ;kein HP2 ld hl,(W8123) ;Adr. HP2 ld a,(hl) ;OPC abholen ld (B8125),a ;und in HP2-Zeile eintragen ld (hl),ohpr2 ;OPC fuer RST38 fuer HP=scharf L9146: call L892C ;HP aus JHP und QHP mit OPC fuer RST30 scharfmachen call L891E ;in JHP und QHP suchen, ob HP1/HP2 enthalten, ggf. dort aufloesen jp nz,L8C6B ;Ruecklesen der Anwenderregister und Start Anwenderprogramm call L889D ;Fehler: HP1/HP2 aufloesen jp LAA06 ;Hilfsprogramme HP-Bearbeitung L8556: ld hl,(W8133) ;1.Parameter: HP-Nr. ld a,l cp 10 ;max. 10 HP erlaubt jp nc,LAA06 ;Fehler ld b,l call L859B ;entsprechend bit6, JHP bzw. QHP aktivieren dec b inc b jr z,L8572 ;der Nr. entsprechende Zeile in HP-Tabelle gefunden L8567: call L8596 ;in HP-Tab. 4 Zeichen weiter call L85C2 ;? welche HP-Tab. aktiv call nz,L8598 ;QHP aktiv, 2 Zeichen weiter djnz L8567 L8572: ld a,(hl) cp 0FFh ;? Zeile belegt ret LA8F2: call L859B ;entsprechend 6, JHP oder QHP aktiv LA8F5: ld a,(hl) ;Zeilenanfang in aktiver HP-Tabelle cp 3 ;Ende HP-Tabelle ret z cp 0FFh ;? gueltige HP-Eintragung jr z,LA908 ;ja call L8596 ;HL=HL+4, Zeilenlaenge in JHP LA900: call L85C2 ;QHP aktiv ? call nz,L8598 ;ja, HL=HL+2 jr LA8F5 LA908: call L857E ;HP-Adresse aus Tabelle nach ld a,(hl) ;Programm-OPC ld (bc),a ;im Programmbereich eintragen inc hl jr LA900 L8576: ld a,(hl) ;1. Zeichen HP-Tab.-zeile cp 0FFh ;HP aktiv push af ld (hl),0 ;HP loeschen call L857E ;HP-Adresse nach pop af ret nz ;HP war aktiv ld a,(hl) ;OPC ins Anwenderprogramm zurueck ld (bc),a ret L857E: inc hl ;Adresse nach L857F: ld c,(hl) inc hl ld b,(hl) inc hl ret L8584: ld (hl),0FFh ;Eintragen HP in Tabelle und aktivieren ld bc,(W8135) ;2. Parameter: HP-Adresse call L8591 ;Adresse eintragen inc hl ld a,(bc) ;OPC auf HP ld (hl),a ;uebernehmen, bleibt in Anwenderprogramm erhalten ret L8591: inc hl ;Adresse aus in HP-Tab.-Zeile eintragen ld (hl),c inc hl ld (hl),b ret L8596: inc hl ;4 Positionen weiter inc hl L8598: inc hl ;Zusatzeinsprung 2 Positionen weiter inc hl ret L859B: ld hl,jhptab ;Aktivieren der gueltigen HP-Tabelle call L85C2 ;Entscheidung ueber bit6, ret z ;JHP ld hl,qhptab ;QHP ret L85A6: ld a,(mrstat) bit 4,a jr nz,L85B2 ;Kdo "T" aktiv bit 5,a jr nz,L85B2 ;Kdo "W" aktiv xor a ;Ziel Z=1 L85B2: ld a,(hl) ;bei "T" und "W" aktiv Z=0, OPC des HP entnehmen ld (hl),ohpr2 ;HP-Zeile aus HP1/HP2-Bereich aktivieren ret L85B6: ld hl,mrstat ;QHP gueltig set 6,(hl) ret L85BC: ld hl,mrstat ;JHP gueltig res 6,(hl) ret L85C2: ld a,(mrstat) ;Test JHP oder QHP gueltig bit 6,a ret L85C8: ld hl,(W8133) ;Parameteruebernahme, 1.= ld de,(W8135) ;2.= ld bc,(W8137) ;3.= ret L8862: ld hl,S81C6 bit 0,(hl) ret z ld hl,(W81C7) ;Stand Anwender-PC ld a,(B81C9) ;OPC auf Anwender-PC ld (hl),a ;zurueck ld hl,mrstat set 4,(hl) ;wie bei Kdo "T" ret L8875: call L859B ;entsprechend 6, QHP bzw. JHP aktivieren L8878: ld a,(hl) cp 3 ;Ende HP-Tabelle jr z,L889A inc hl cp 0ffh ;gueltiger HP-Eintrag jr z,L888D inc hl ;Platz fuer HP-Nr. uebergehen L8883: inc hl ;Platz fuer HP-Adresse uebergehen L8884: inc hl call L85C2 ;Test QHP aktiv call nz,L8598 ;ja, Platz fuer Reaktionsadresse uebergehen jr L8878 ;naechste HP-Tab.zeile L888D: ld a,(hl) ;gueltige HP-Eintragung, LOW(HP-Adresse) inc hl cp e jr nz,L8883 ;nicht identisch mit Vorgabeadresse ld a,(hl) ;HIGH(HP-Adr.) inc hl cp d jr nz,L8884 ;nicht identisch ld a,(hl) ;OPC auf HP ld (de),a ;ins Anwenderprogramm zurueck ret ;Vorgabeadresse gefunden, OPC zurueck, Z=1 L889A: or 0FFh ;Z=0, HP-Tab.ende erreicht, Vorgabeadr. nicht gefunden ret L889D: ld hl,(W8120) ;HP1/HP2 aufloesen ld a,h or l jr z,L88A8 ;kein HP1 ld a,(B8122) ;OPC von HP1 ld (hl),a ;ins Anwenderprogramm zurueck L88A8: ld hl,(W8123) ld a,h or l jr z,L88B3 ;HP2 nicht vorhanden ld a,(B8125) ;OPC von HP2 ld (hl),a ;ins Anwenderprogramm zurueck L88B3: ld hl,W8120 ;Beginn Ablage HP1/HP2 L88B6: ld b,6 xor a L88B9: ld (hl),a ;Ablagebereich loeschen inc hl djnz L88B9 ret L88BE: ld hl,(W8126) ;alternative HP1/HP2 aufloesen ld a,h or l jr z,L88C9 ;kein altn. HP1 ld a,(B8128) ;OPC zurueck ld (hl),a L88C9: ld hl,(W8129) ld a,h or l jr z,L88D4 ;kein altn. HP2 ld a,(B812B) ;OPC zurueck ld (hl),a L88D4: ld hl,W8126 ;Beginn Ablage altn. HP1/HP2 jr L88B6 ;Ablagebereich loeschen L88D9: ld hl,B8132 ; ld b,(hl) ;Anzahl der Eingabeparameter dec b inc b jr z,L88EF ;keine Parameter L88E1: inc hl ld e,(hl) ;Anfang Parameter inc hl ld d,(hl) push bc push hl call L8875 ;in gueltiger HP-Tabelle Wert suchen pop hl ;Z=1: Wert als HP-Adresse gefunden, OPC zurueck pop bc ret z djnz L88E1 ;suchen mit naechstem Eingabeparameter L88EF: or 0FFh ;Z=0: Parameterwert nicht in HP-Tabelle gefunden ret L88F2: call L859B ;entsprechend 6, JHP oder QHP aktiv L88F5: ld a,(hl) ;Zeilenanfang in aktiver HP-Tabelle cp 3 ;Ende HP-Tabelle ret z cp 0FFh ;? gueltige HP-Eintragung jr z,L8908 ;ja call L8596 ;HL=HL+4, Zeilenlaenge in JHP L8900: call L85C2 ;QHP aktiv ? call nz,L8598 ;ja, HL=HL+2 jr L88F5 L8908: call L857E ;HP-Adresse aus Tabelle nach push hl ld hl,(W8116) ;Anwender-PC or a sbc hl,bc ;Test: Anwender-PC=Haltepunktadresse pop hl jr z,L8910 ;ja: nicht aktivieren ld a,ohpr1 ;OPC fuer RST 30 ld (bc),a ;im Programmbereich eintragen L8910: inc hl jr L8900 L8911: push de ld de,(W8135) ;2.Parameter: HP-Adresse call L891E pop de jp z,LAA06 ;Fehler ret ;Z=0 L891E: call L85BC ;JHP aktivieren call L88D9 ; in HP-Tab. suchen ret z ;gefunden, OPC zurueck call L85B6 ;QHP aktivieren jp L88D9 ; in HP-Tab. suchen, ggf. OPC zurueck ;Entaktivieren der in Tabellen JHP und QHP vermerkten Haltepunkte LA92C: call L85BC ;res 6, ,HP-Tabelle fuer "J" aktivieren call LA8F2 ;OPC auf HP-Adressen in Programm eintragen call L85B6 ;set 6, ,HP-Tabelle fuer "Q" aktivieren call LA8F2 ;OPC zurueck jp L8A3E ;zurueck zur Aufrufschleife ;Scharfmachen der in Tabellen JHP und QHP vermerkten Haltepunkte L892C: call L85BC ;res 6, ,HP-Tabelle fuer "J" aktivieren call L88F2 ;HP-Adressen in Programm mit RST 30 scharf machen call L85B6 ;set 6, ,HP-Tabelle fuer "Q" aktivieren jp L88F2 ;HP mit RST 30 scharf machen ;Service-Routine fuer RTS38: aktiviert durch HP1/HP2 oder OPC ohpr2 L8C0B: ld (W8118),hl ;Anwender- retten pop hl ;Rueckkehradresse dec hl ;wegen RST-Befehl um ein Byte zurueck ld (W8116),hl ;Anwender-PC retten ld (W8114),sp ;SP ablegen ld sp,W8114 ;Ablegen der Inhalte der Anwender-Register push iy push ix push de push bc exx push hl push de push bc push af ld a,i ld (B811A),a ex af,af' push af ld sp,(spnorm) ;Monitor-SP ld hl,S81C6 bit 0,(hl) jp nz,L8C8A ld a,(mrstat) bit 4,a ;Kdo"T" jr nz,L8CA5 bit 5,a ;Kdo"W" jr z,L8C42 set 0,a ;Protokoll aus ld (mrstat),a jr L8CA5 L8C42: call L889D ;HP1/HP2aufloesen L8C47: ld hl,S81C6 bit 3,(hl) ;gesetzt durch Kdo"C" ohne Parameter res 3,(hl) jr nz,L8C6B ld a,(mrstat) bit 2,a ;soll Reaktionsroutine Radr von QHP aufgerufen werden call nz,L8C94 ;ja ld a,(mrstat) bit 0,a ;soll Protokollzeile angezeigt werden call z,L840B ;ja ld a,(mrstat) bit 1,a jp z,LA92C ;HP-Tab. aufloesen, zurueck zur Aufrufschleife L8C68: call L8E2A ;Befehlsanalyse, ggf HP1/HP2 setzen ;Zustand Anwenderprogramm vor Unterbrechung herstellen L8C6B: ld sp,B8102 ;Registerbereich pop af ;Anwender-Register zurueck ex af,af' ld a,(B811A) ld i,a pop af pop bc pop de pop hl exx pop bc pop de pop ix pop iy pop hl ld sp,hl ld hl,(W8116) push hl ld hl,(W8118) ret ;zurueck ins Anwenderprogramm L8C8A: ld hl,(W81C7) ;Anwender-PC bei HP aus JHP oder QHP ld (hl),ohpr1 ;OPC fuer RST30 call L889D ;HP1/HP2 aufloesen jr L8CB9 L8C94: ld hl,mrstat set 0,(hl) ld hl,(W8137) ;QHP zugeordnete RADR ld a,h or l jp z,L840B ;RADR=0, Protokollzeile wieder ein jp (hl) ;Reaktionsroutine aufrufen L8CA5: ld hl,mrstat+1 ;Zaehler Anzahl Befehlszeilen bei Kdo "T" ld a,(hl) cp 1 ;alle Zeilen abgearbeitet jr z,L8CB0 ;ja dec (hl) ;Zaehler erniedrigen jr L8CB9 L8CB0: dec hl ;hl Zeiger auf mrstat res 1,(hl) bit 5,(hl) jr z,L8CB9 L8CB7: res 0,(hl) L8CB9: call L88BE ;alternative HP1/HP2 aufloesen jr L8C47 ;Service-Routine fuer RST30, Erreichen HP aus JHP bzw. QHP L8CBE: ld (W8118),hl ;Anwender- retten pop hl ;Rueckkehradresse dec hl ;wegen RST-Befehl um ein Byte zurueck ld (W8116),hl ;Anwender-PC retten ld (W8114),sp ;SP ablegen ld sp,W8114 ;Ablegen der Inhalte der Anwender-Register push iy push ix push de push bc exx push hl push de push bc push af ld a,i ld (B811A),a ex af,af' push af hpauf: ld sp,(spnorm) ;Monitor-Stack call L889D ;HP1/HP2 aufloesen ld de,(W8116) ;Anwender-PC call L85BC ;JHP in aktivieren, (bit6=0) call L8875 ;Adresse suchen, ggf. HP aufloesen jr z,L8D0A ;ein HP aus JHP hat SR aufgerufen call L85B6 ;QHP in aktivieren, (bit6=1) call L8875 ;Adresse suchen, ggf. HP aufloesen jr z,L8D03 ;ein HP aus QHP hat SR aufgerufen ld hl,mrstat ;kein HP aus JHP bzw. QHP hat SR aktiviert ld (hl),0 ; loeschen jp L8C47 ;weiter in RST38-SR L8D03: inc hl ;QHP: Adresse Reaktionsroutine ld a,(hl) inc hl ld h,(hl) ld l,a ld (W8137),hl ;uebertragen ld hl,mrstat set 0,(hl) set 2,(hl) L8D0A: ld (W81C7),de ;Anwender-PC (=HP-Adresse) zwischenspeichern ld (B81C9),a ;OPC vom aktuellen Anwender-Befehl, aus QHP entnommen ld hl,S81C6 set 0,(hl) ld hl,mrstat bit 5,(hl) ;Kdo"W" jr nz,L8CB7 bit 4,(hl) ;Kdo"T" jp z,L8C47 L8D22: ld hl,mrstat res 1,(hl) jr L8CB7 ;NMI-Aktivierung L8955: ld a,0C3h ;OPC fuer JP ld (66h),a ;auf NMI-Adresse eintragen ld hl,L8D29 ;Adresse NMI-Serviceroutine ld (67h),hl ;eintragen ret ;NMI-Serviceroutine L8D29: ld (W8118),hl ;Anwender- retten ld hl,L8D33 ;Aktion ausserhalb gesperrten NMI ex (sp),hl retn ;Behandlung NMI aktiv L8D33: ld (W8116),hl ;Anwender-PC retten ld (W8114),sp ;Anwender-SP ld sp,W8114 ;SP wird Zeiger auf Registerpuffer push iy ;Ablage der Anwender-Registerinhalte push ix push de push bc exx push hl push de push bc push af ld a,i ld (B811A),a ex af,af' push af ld sp,(spnorm) ;Monitor-SP laden call L889D ;ggf. gesetzte HP1/HP2 aufloesen call L840B ;Ausgabe Protokkzeile wie bei Kdo. "X" jp L8A3E ;zurueck zur Aufrufschleife ;Ermittlung Befehlsart und dementsprechend Aktivierung von HP1 und HP2 L8E2A: call LA9D0 ;Tastaturstatus abfragen ld hl,(W8116) ;Stand Anwender-PC ld e,(hl) ;OPC ld d,0 push hl ld hl,W8EE4 ;Tabelle Befehlslaenge,-art add hl,de ld a,(hl) ;OPC-Info and 0E0h ;Befehlsart jr nz,L8E53 ;Verzweigungsbefehle mit Adressmodifikation ld a,(hl) and 3 ;Befehlslaenge ld e,a pop hl L8E3F: add hl,de ;PC des naechsten Befehls L8E40: call L85A6 ;Austausch OPC-->a mit OPC fuer RST 38 jr nz,L8E4C ;Z=1 wenn in bit 4 + 5 nicht gesetzt ld (W8120),hl ;HP-Adresse eintragen, HP1 ld (B8122),a ;Programm-OPC zwischenspeichern ret L8E4C: ld (W8126),hl ;dto ld (B8128),a ret ;Behandlung Befehlsart L8E53: cp 20h ;? Test Relativ-Spruenge jr nz,L8E82 ;nein pop hl ;Programm-PC inc hl ld a,(hl) ;Sprungweite or a push af inc hl ;PC Nachfolge-Befehl call L8E6F ;RST 38 eintragen fuer HP2 pop af ;Sprungweite zurueck jp m,L8E67 ;rueckwaerts ld e,a jr L8E3F L8E67: neg or a ld e,a sbc hl,de ;Sprungziel berechnen jr L8E40 ;als HP1 scharfmachen und eintragen L8E6F: call L85A6 ;Austausch OPC-->a mit OPC fuer RST 38 jr nz,L8E7B ;Z=1 wenn in bit 4 + 5 nicht gesetzt ld (W8123),hl ;HP-Adresse eintragen, HP2 ld (B8125),a ;Programm-OPC zwischenspeichern ret L8E7B: ld (W8129),hl ;dto ld (B812B),a ret L8E82: cp 40h ;? Test Absoloutsprung, UP-Aufruf jr nz,L8E92 ;nein pop hl inc hl ld e,(hl) ;Sprungziel inc hl ld d,(hl) inc hl call L8E6F ;PC Befehlsnachfolger als HP2 scharfmachen L8E8F: ex de,hl L8E90: jr L8E40 ;Sprungziel als HP1 scharfmachen L8E92: cp 60h ;? Test Rueckkehr-Befehle jr nz,L8EA3 ;nein pop hl inc hl call L8E6F ;Folge-PC als HP2 scharfmachen ld hl,(W8114) ;Programm-SP ld e,(hl) inc hl ld d,(hl) ;Rueckkehradresse jr L8E8F ;als HP1 scharfmachen L8EA3: cp 80h ;? RST-Befehle pop hl ;Anwender-PC jr nz,L8EA8 ;nein ld a,e ;OPC cp ohpr1 ;RST fuer Tabellen-HP jr nz,L8E90 ld a,(mrstat) bit 5,a ;Kdo "W" jr z,L8E90 ld hl,S81C6 ;HP auf aktueller Schrittzeile res 0,(hl) ld hl,hpauf ;Aufloesen und protokollieren ex (sp),hl ret L8EA8: cp 0A0h ;? jp (hl) jr nz,L8EB1 ;nein ld hl,(W8118) ;Inhalt Anwender- jr L8E90 ;als HP1 scharfmachen L8EB1: cp 0C0h ;? Gruppe ED-Befehle jr nz,L8EC2 ;nein inc hl ld a,(hl) ;2. Byte OPC inc hl and 47h cp 43h ;16Bit Lade-Befehle (4 Byte lang) jr nz,L8E90 ;nein, 2 Byte lang, Folge-PC als HP1 inc hl ;Ladeadresse uebergehen inc hl jr L8E90 ;Folge-PC als HP1 scharfmachen L8EC2: inc hl ;Gruppe Index-Befehle ld e,(hl) ;OPC2 holen push hl ld hl,W8EE4 ;Befehlsart,-laenge wie HL-Befehl add hl,de ld a,(hl) and 1Ch rrca rrca ld e,a pop hl ld a,(hl) ;OPC2 dec hl cp 0E9h ;jp (ix), jp (iy) jp nz,L8E3F ;nein ld a,(hl) ;OPC1, welches Indexregister cp 0DDh ;ix ld hl,(W8110) ;Anwender- jr z,L8E90 ;als HP1 scharfmachen ld hl,(W8112) ;Anwender- jr L8E90 ;-------------------------------------------------------------------- ;Tabelle OPC-Artinformationen: Befehlslaenge W8EE4: defb 1,3,1,1,1,1,2,1 ;0-7 defb 1,9,1,1,1,1,2,1 ;8-f defb 22h,3,1,1,1,1,2,1 ;10-17 defb 22h,9,1,1,1,1,2,1 ;18-1f defb 22h,13h,13h,9,1,1,2,1 ;20-27 defb 22h,9,13h,9,1,1,2,1 ;28-2f defb 22h,3,3,1,0Dh,0Dh,12h,1 ;30-37 defb 22h,9,3,1,1,1,2,1 ;38-3f defb 1,1,1,1,1,1,0Dh,1 ;40-47 defb 1,1,1,1,1,1,0Dh,1 ;48-4f defb 1,1,1,1,1,1,0Dh,1 ;50-57 defb 1,1,1,1,1,1,0Dh,1 ;58-5f defb 1,1,1,1,1,1,0Dh,1 ;60-67 defb 1,1,1,1,1,1,0Dh,1 ;68-6f defb 0Dh,0Dh,0Dh,0Dh,0Dh,0Dh,1,0Dh ;70-77 defb 1,1,1,1,1,1,0Dh,1 ;78-7f defb 1,1,1,1,1,1,0Dh,1 ;80-87 defb 1,1,1,1,1,1,0Dh,1 ;88-8f defb 1,1,1,1,1,1,0Dh,1 ;90-97 defb 1,1,1,1,1,1,0Dh,1 ;98-9f defb 1,1,1,1,1,1,0Dh,1 ;a0-a7 defb 1,1,1,1,1,1,0Dh,1 ;a8-af defb 1,1,1,1,1,1,0Dh,1 ;b0-b7 defb 1,1,1,1,1,1,0Dh,1 ;b8-bf defb 61h,1,43h,43h,43h,1,2,81h ;c0-c7 defb 61h,61h,43h,12h,43h,43h,2,81h ;c8-cf defb 61h,1,43h,2,43h,1,2,81h ;d0-d7 defb 61h,1,43h,2,43h,0e0h,2,81h ;d8-df defb 61h,9,43h,9,43h,9,2,81h ;e0-e7 defb 61h,0a9h,43h,1,43h,0c0h,2,81h ;e8-ef defb 61h,1,43h,1,43h,1,2,81h ;f0-f7 defb 61h,9,43h,1,43h,0e0h,2,81h ;f8-ff ;-------------------------------------------------------------------- ;Kdo "J": Organistion der Haltepunkte ohne Reaktionsroutine L8B00: call getch ;naechstes Zeichen jp z,LAA06 ;Fehler jp nc,L82EC cp "s" ;"JS" Setzen eines Haltepunktes jr z,L8B1C cp "d" ;"JD" Loeschen eines Haltepunktes jr z,L8B28 cp "o" ;"JO" Ausgabe aller Haltepunkte jp z,L9066 cp "r" ;"JR" Loeschen aller Haltepunkte jp z,L9045 jp LAA06 ;Fehler L8B1C: call parstc ;"JS", Parameter in Stack cp 2 ;2 Parameter erforderlich jp nz,LAA06 ;Fehler jp L901A L8B28: call parstc ;"JD" cp 1 ;1 Parameter erforderlich jp nz,LAA06 jp L9031 ;Kdo "Q": Organisation der Haltepunkte mit Reaktionsadressen L8B65: call getch ;naechstes Zeichen aus Kdo-Eingabe jp z,LAA06 ;Fehler jp nc,L82EC cp "s" ;"QS" Setzen eines HP jr z,L8B81 cp "d" ;"QL" Loeschen eines HP jr z,L8B8D cp "o" ;"QO" Ausgabe aller HP jp z,L9100 cp "r" ;"QR" Loeschen aller HP jp z,L90F8 jp LAA06 ;Fehler L8B81: call parstc ;"QS", Eingabeparameter in Stackbereich cp 3 ;3 Parameter erforderlich jp nz,LAA06 ;Fehler jp L90C4 L8B8D: call parstc ;"QL" cp 1 ;1 Parameter erforderlich jp nz,LAA06 jp L90ED ;Routine fuer "JS": Setzen HP-Nr. Adr. L901A: call L850F ;Parameter aus Stack in Bereich push af push hl push bc call L8911 ;in JHP u. QHP Adresse suchen, ggf. aufloesen call L85BC ;in JHP anwaehlen (bit6=0) call L8556 ;in JHP Zeile entsprechend Nr. suchen, Test ob frei jp z,LAA06 ;nein call L8584 ;in Zeile HP-Adresse und OPC eintragen, Zeile kennzeichnen jr L9062 ;Routine fuer "JD": Loeschen HP-Nr. L9031: call L850F push af push hl call L85BC ;in JHP anwaehlen (bit6=0) L9039: push bc call L8556 ;in JHP Zeile entsprechend Nr. suchen, Test ob belegt jp nz,LAA06 ;nein, Fehler call L8576 ;HP in Zeile loeschen, OPC zurueck ins Programm jr L905D ;Routine fuer "JR":Loeschen aller HP's L9045: push af push hl call L85BC ;in JHP anwaehlen (bit6=0) L904A: push bc call L859B ;entsprechend JHP oder QHP anwaehlen L904E: call L8576 ;HP in Zeile loeschen, OPC zurueck ins Programm inc hl call L85C2 ;Test QHP aktiv, (?bit6=1) call nz,L8598 ;2 x inc hl (in QHP Reaktionsadr. uebergehen ld a,(hl) cp 3 ;Ende HP-Tabelle erreicht jr nz,L904E ;nein L905D: ld hl,S81C6 res 0,(hl) ;Status HP-Tabelle geloescht setzen L9062: pop bc ;Ende, Austritt zur Aufrufschleife pop hl pop af ret ;Routine fuer "JO": Ausgabe aller HP's L9066: push af push hl call L85BC ;in JHP anwaehlen (bit6=0) L906B: push bc push de xor a ;HP-Nr. Zaehler stellen ld (B81A3),a call L859B ;entsprechend JHP oder QHP anwaehlen L9075: ld a,(hl) ;HP-Kennzeichen or a jr z,L90AF ;nicht aktiv cp 3 ;Ende HP-Tabelle jr z,L90C1 ld a,(B81A3) ;HP-Nr. call praan ;Anzeigen call space call L857E ;HP-Adresse nach push hl push bc pop hl call prhlan ;HP-Adresse anzeigen call space pop hl ld a,(hl) ;OPC vom HP inc hl call praan ;anzeigen call L85C2 ;Test QHP aktiv, (?bit6=1) jr z,L90AA ;nein call space call L857F ;Adresse Reaktionsprogramm nach push hl push bc pop hl call prhlan ;Reaktionsadresse anzeigen pop hl L90AA: call newl jr L90B8 L90AF: call L8596 ;naechste HP-Zeile einstellen call L85C2 ;Test QHP aktiv, (?bit6=1) call nz,L8598 ;ja, laengere Zeile L90B8: ld a,(B81A3) ;HP-Nr.zaehler erhoehen inc a ld (B81A3),a jr L9075 ;weiter mit Anzeige L90C1: pop de ;Ende HP-Tabelle erreicht jr L9062 ;fertig ;Routine fuer "QS": Setzen HP-Nr. Adr Radr L90C4: call L850F ;Parameter aus Stack nach Bereich push af push hl push bc call L8911 ;in JHP u. QHP Adresse suchen, ggf. aufloesen ld hl,mrstat ld (hl),42h ;QHP aktiv(bit6=1), ld hl,(W8137) ;3. Parameter Radr push hl call L8556 ;in QHP Zeile entsprechend Nr. suchen, Test ob frei jp z,LAA06 ;nein, Fehler call L8584 ;Zeile aktivieren, Haltepunkt und OPC eintragen pop bc ;Adresse Reaktionsroutine call L8591 ;in HP-Zeile eintragen jp L9062 ;zurueck zur Aufrufschleife ;Routine fuer "QD": Loeschen HP-Nr. L90ED: call L850F ;Parameter aus Stack nach Bereich push af push hl call L85B6 ;in QHP anwaehlen (bit6=1) jp L9039 ;weiter wie bei "JD" ;Routine fuer "QR": Loeschen aller HP L90F8: push af push hl call L85B6 ;in QHP anwaehlen (bit6=1) jp L904A ;weiter wie bei "JR" ;Routine fuer "QO": Anzeige aller HP L9100: push af push hl call L85B6 ;in QHP anwaehlen (bit6=1) jp L906B ;weiter wie bei "JO" ;Kdo "T": Befehlsabarbeitung ueber n Zeilen mit jeweiliger Protokollzeile L8BAB: call parstc ;Eingabeparameter in Stackbereich uebertragen call L850F ;Parameter aus Stack in Bereich ld a,(B8132) ;Anzahl der Parameter or a jr z,L8FF8 ;keine Parameter call L9001 ;Befehlsanzahl in Zaehler eintragen L8FF0: ld (hl),12h ;T-Status in eintragen, (bit4,1) L8FF2: call L8862 ld hl,S81C6 res 0,(hl) call L8E2A ;Befehlsanalyse, davon abh. HP1/HP2 jp L8C6B L8FF8: ld a,(lline) ;Standardausgabelaenge ld e,a call L9001+4 ;in Zaehler eintragen jr L8FF0 L9001: ld de,(W8133) ;1. Parameter: Anzahl Befehlszeilen ld hl,mrstat+1 ;Zaehler fuer Befehlszeilen ld a,e or a jr nz,L900D inc a L900D: ld (hl),a ;Anahl in Zaehler eintragen dec hl ret ;Kdo "W":Abarbeitung von n Befehlen, Protokollzeile nach n-ten Befehl L8BCA: call parstc ;Eingabeparameter in Stackbereich uebertragen cp 1 ;nur ein Parameter jp nz,LAA06 ;Fehler call L850F ;Parameter aus Stack in Bereich call L9001 ;Befehlsanzahl in Zaehler eintragen ld (hl),23h ;W-Status in eintragen,(bit5,1,0) call L892C ;HP aus JHP und QHP mit RST30 scharfmachen jr L8FF2 ;weiter wie bei "T" ;Pdo "P": Programm ab Adr. anstelle Protokollzeile abarbeiten L8B59: call parstc ;Parameter in Stack ablegen cp 1 ;Anzahl der Parameter = 1 jp nz,LAA06 ;nein, Fehler L9372: call L850F ;Parameter aus Stack in Bereich push hl push af ld hl,(W8133) ;1.Parameter=Adresse Programm ld a,h or l jr z,L9389 ;Programm-Adresse <> Null ld (W81CE),hl ;Programm-Adresse eintragen ld hl,S81C6 ;Status Kdo "P" kennzeichnen set 7,(hl) ;Kdo "X" wertet aus und startet Programm L9386: pop af pop hl ret L9389: ld hl,S81C6 res 7,(hl) ;Status Kdo "P" zuruecknehmen jr L9386 ;Kdo "R": Einlesen Datei von Diskette L8BA1: call fcbfil ;Dateinamen in FCB eintragen call L94E3 ;Datei eroeffnen cp 0ffh ;Fehler, nicht vorhanden jp z,LAA06 call parstc ;Eingabeparameter in Stackbereich call L850F ;Parameter aus Stack in Bereich ld a,(B8132) ;Anzahl der Parameter or a jr z,stdlad ;keine Ladeadresse ld hl,(W8133) ;1.Parameter jr L94BB stdlad: ld hl,100h ;Standardladeadresse ld (W8133),hl ;fuer Anzeige merken L94BB: push hl ld de,5Ch ;Standard-FCB ld c,14h ;BDOS-Fkt.: naechsten Satz lesen call L8000 pop hl or a ;=0:erfolgreiche Operation jr nz,L94D6 ;Dateiende ld de,80h ;Adresse Standard-DMA ld c,80h ;Sektorgroesse L94CD: ld a,(de) ;Sektor in Programmbereich uebertragen inc de ld (hl),a inc hl dec c jr nz,L94CD jr L94BB ;naechsten Sektor einlesen L94D6: push hl ;Endadresse merken call L8955 ;Ende Datei, NMI eintragen ld hl,rkopf call strout ld hl,(W8133) ;Ladeadresse call ranz pop hl call ranz ld hl,(W8118) ;Anwender-PC call ranz jp newl ranz: call prhlan ;anzeigen call space call space jp space L94E3: push hl ;BDOS-Fkt.: Datei eroeffnen push de push bc xor a ld (5Bh),a ld c,0Fh ld de,5Ch ;Standard-FCB call L8000 pop bc pop de pop hl ret fcbfil: xor a ld (7Ch),a ld hl,5ch ;Adresse Standard-FCB ld (hl),a ;Bezugs-Laufwerk als Default-Wert einl: call mran2 ;Zeichen aus Eingabepuffer M8200 entnehmen ld b,a ;1.Zeichen zwischenspeichern call mran2 ;naechstes Zeichen cp ":" ;LW-Angabe erfolgt ? ld c,a ;2.Zeichen zwischenspeichern ld a,b ;1.Zeichen zurueck jr nz,bezlw ;nein sub 40h ;LW-Codierung erreichen ld (hl),a ;LW-Codierung eintragen jr einl bezlw: inc hl ;Zeiger auf Namensfeld im FCB ld (hl),b ;1.Zeichen in Namensfeld eintragen inc hl ld a,c ;2.Zeichen ld c,8 ;Name max. 8 Zeichen cp 0dh ;Eingabeende jr z,fcberr ;ja L9472: ld (hl),a inc hl dec c jr z,fcberr call mran2 cp "." ;Dateiklassifikator jr z,L9482 ;uebergehen cp " " jr z,fcberr cp "," jr z,fcberr cp 0dh ;Eingabeende jr nz,L9472 fcberr: jp LAA06 L9482: dec c jr z,L948A ld (hl)," " ;Rest des Namens mit Space auffuellen inc hl jr L9482 L948A: ld c,4 cp "." jr nz,L94A1 ld hl,65h ;Adresse Klassifikator im FCB L9493: call mran2 ;Zeichen entnehmen cp " " ;Eingabeende jr z,L94A1 cp 0dh jr z,L94A1 cp "," jr z,L94A1 ld (hl),a inc hl dec c jp z,LAA06 ;Klassifikator zu lang jr L9493 L94A1: dec c jr z,L94A9 ld (hl)," " ;Rest Klassifikatorfeld auffuellen inc hl jr L94A1 L94A9: ld (hl),0 ret ;Kdo "S": Byteweises Anzeigen und Modifikation in Hexa und in ASCII L8BA4: call parstc ;Eingabeparameter in Stackbereich uebertragen call L850F ;Parameter aus Stack in Bereich ld hl,0 ld (smod),hl ;Richtung vorwaerts/Darstellung Hexa ld hl,(lbyte) ;letzte Anzeigeadresse ld a,(B8132) ;Anzahl Parameter or a jr z,LAA38 ;kein Parameter ld hl,(W8133) ;1.Parameter: Anzeigeadresse ld (lbyte),hl LAA38: call prhlan ;Adresse anzeigen ld b,2 call L8424 ; x Space anzeigen ld a,(smod) or a ;Test Anzeigeart Hexa oder ASCII jr nz,LAA79 ld a,(hl) ;Darstellung Hexa call praan ;Ursprungsinhalt anzeigen ld c,"-" call ccout ld b,2 call L86A3 ;max. Zeichen Eingabe abfordern call mran3 cp "-" ;Richtung aendern jr z,LAA9F cp "=" ;Darstellungsart aendern jr z,LAAA8 cp 0Dh ;ENTER fuer weiter jr z,LAA6B call L8800 ;Eingabe wandeln in Hexa ld a,l LAA67: ld hl,(lbyte) ld (hl),a ;eintragen des geaenderten Wertes LAA6B: ld a,(smod+1) ;Richtung der Anzeige or a inc hl jr z,LAA74 ;vorwaerts dec hl ;rueckwaerts dec hl LAA74: ld (lbyte),hl ;neue Anzeigeadr. eintragen jr LAA38 LAA79: ld c,(hl) ;Anzeige als ASCII ld a,c call L9279 ;Test ASCII-Zeichen call c,L9276 ;nein, Darstellung als Punkt call ccout ld c,"-" call ccout ld b,1 call L86A3 ;max. 1 Zeichen Eingabe call getch cp "-" ;Richtung jr z,LAA9F cp "=" ;Darstellung jr z,LAAA8 cp 0Dh ;ENTER fuer weiter jr z,LAA6B jr LAA67 LAA9F: ld a,(smod+1) ;Anzeigerichtung aendern cpl ld (smod+1),a jr LAA6B LAAA8: ld a,(smod) ;Darstellungsart aendern cpl ld (smod),a jr LAA38 ;Eingabe einer Zahl, Wandlung, Aufruf von "X" L87F6: call L86A3 call mran3 cp 0Dh ;Eingabe-Ende jr z,L881E ;Eingabe wandeln in Hexa, Aufruf von Kdo "S" L8800: ld hl,0 ;ASCII-Eingabe wandeln in Hexa-Zahl L8803: push af sub "9"+1 jr c,L880C ;Ziffer sub 6 ;Buchstaben jp c,LAA06 ;nein, Sonderzeichen=Fehler L880C: pop af call L83A2 jp c,LAA06 ;Fehler add hl,hl add hl,hl add hl,hl add hl,hl or l ld l,a call mran3 ret z ;kein Zeichen mehr jr L8803 L881E: or a ret ;Kdo "DH": Hexa-Dump ab AAdr bis EAdr L8AC7: call parstc ;Eingabeparameter in Stackbereich uebertragen call L850F ;Parameter aus Stack in Bereich push af push bc push de push hl ld hl,mrstat res 7,(hl) ;D-Status in einstellen ld hl,(ldump) ;letzte Hex-Dump-Adresse L9206: ld a,(B8132) ;Anzahl der Parameter or a jr z,L9212 ;keine Parameter dec a ld hl,(W8133) ;1.Parameter: Anfangsadresse jr nz,L925E ;noch weiterer Parameter L9212: push hl ld de,10h ;Weite Hexa-Zeile call L9280 ;bit7,, "D" oder "I" aktiv jr z,L921E ;"D" ld de,30h ;Weite ASCII-Zeile L921E: ld a,(lline) ;Standard-Ausgabelaenge(Zeilenzahl) ld b,a L9222: add hl,de ;Berechnung Endadresse djnz L9222 dec hl ex de,hl ;Endadresse in pop hl ;Anfangsadresse zurueck L9228: call prhlan ;Anzeige Adresse ld b,10h ;Weite hexa call L9280 ;"DH" oder "DA" aktiv jr z,L9234 ;"DH" ld b,30h ;Weite ASCII L9234: call space L9237: ld c,(hl) ;Byte aus Anzeigebereich holen call L9280 ;"DH" oder "DA" jr nz,L9264 ;"DA" ld a,c call praan L9241: call LA9D0 ;Tastaturstatus abfragen call L842E ;Test - inc hl jr z,L9254 ;=, Endadresse erreicht call L9280 ;"DH" oder "DA" call z,space ;"DH" djnz L9237 mha3: call L9280 ;"DH" oder "DA" jr nz,mha31 ;"DA" push de push hl or a ld de,10h sbc hl,de ;Zeilenanfangsadresse pop de push de ;Zeilenendadresse call crc16 ld b,3 call L8424 ; x mal Space call prhlan pop hl pop de mha31: call newl jr L9228 L9254: call L9280 ;Anzeige-Ende jr nz,L9270 ;"DA" ld a,10h sub b ld b,a ld a,e sub b ld e,a ld (ldump),hl ;ENDadresse als letzte Dump-Adresse eintragen ex de,hl nop call crc16 ld b,4 call L8424 call prhlan jr L9273 L925E: ld de,(W8135) ;2.Parameter: ENDadresse jr L9228 L9264: ld a,c ;ASCII-Anzeige call L9279 ;Test darstellbares Zeichen call c,L9276 ;nein, Darstellung als Punkt call ccout ;Zeichen in darstellen jr L9241 L9270: ld (liso),hl ;letzte ASCII-Dump-Adresse merken L9273: jp L91DB L9276: ld c,"." ;Darstellung nicht ASCII ret L9279: sub " " ;Test ASCII-Zeichen ret c ;nein cp 5Fh ccf ret L9280: ld a,(mrstat) ;Test aktives Kdo "DH"(0) oder aktives "DA"(1) bit 7,a ret ;Kdo "DA": ASCII-(ISO-)Dump L8AF9: call parstc ;Eingabeparameter in Stackbereich uebertragen call L850F ;Parameter aus Stack in Bereich push af push bc push de push hl ld hl,mrstat set 7,(hl) ld hl,(liso) ;letzte ASCII-Dump-Adresse jp L9206 ;weiter bei Kdo "DH" ;Kdo "E": Speichervergleich von AAdr bis EAdr mit ZAdr L8ACE: call parstc ;Eingabeparameter in Stackbereich bringen cp 3 ;3 Parameter erforderlich jp nz,LAA06 ;Fehler call L850F ;Parameter aus Stack in Bereich push af push bc push de push hl call L85C8 ;Uebernahme Parameter in Register 1., 2., 3. L915C: ld a,(bc) ;Byte aus Testbereich cp (hl) ;Vergleich mit Muster call nz,L916A ;keine Identitaet call L842E ;Test - inc hl inc bc jr nz,L915C ;Endadresse Testbereich noch nicht erreicht jp L91DE ;gemeinsamer Austritt, Register zurueck L916A: push bc ;keine Identitaet bie Vergleich "E" call prhlan ;Adresse im Musterbereich anzeigen ld b,2 call L8424 ; x space ausgeben ld a,(hl) ;Musterbyte call praan ;anzeigen call space pop bc ld a,(bc) ;Vergleichsbyte call praan call LA9D0 ;Tastaturabfrage jp newl ;Kdo "M": Verschieben Speicherbereich von AAdr bis EAdr nach ZAdr (vor u. rueck) L8B46: call parstc ;Eingabeparameter in Stackbereich bringen cp 3 ;3 Parameter erforderlich jp nz,LAA06 ;Fehler call L850F ;Parameter aus Stack in Bereich push af push bc push de push hl call L85C8 ;Uebernahme Parameter in Register 1., 2., 3. or a ex de,hl sbc hl,de jp c,LAA06 ;Fehler Endadresse push af push bc push de push hl call L85C8 ;Uebernahme Parameter in Register 1., 2., 3. L91A2: ld (hl),c ;Musterbyte eintragen call L842E ;Test - inc hl jr nz,L91A2 ;Endadresse noch nicht erreicht jp L91DE ;gemeinsamer Austritt, Register zurueck ;Kdo "H": Addition bzw. Subtraktion L8AED: call parstc ;Eingabeparameter in Stackbereich bringen cp 2 ;2 Parameter erforderlich jr nz,hconv ;nein call L850F ;Parameter aus Stack in Bereich push af push bc push de push hl call L85C8 ;Uebernahme Parameter in Register 1., 2., 3. ld b,2 call L8424 ; x Space ausgeben ld c,"+" ;Addition anzeigen call ccout call space push hl add hl,de ;Operation ausfuehren call L91E3 ;Ergebnisanzeige ld b,3 call L8424 ; x Space ausgeben ld c,"-" ;Subtraktion anzeigen call ccout call space pop hl or a sbc hl,de ;Operation ausfuehren call L91E3 ;Ergebnisanzeige L91DB: call newl L91DE: pop hl ;gemeinsamer Austritt fuer "E","H","F","M" pop de pop bc pop af ret hconv: cp 1 ;ein Parameter jp nz,LAA06 ;Fehler call L850F ;Parameter aus Stack in Bereich push af ;Darstellung verschiedener Konvertierungen push bc push de push hl call L85C8 ;Parameterwert nach push hl call L91E3 ;hexa und dezimal ld b,4 call L8424 ; x Space pop hl ld d,l ld b,8 ld a,5 hconv1: rlc l ;Binaerdarstellung ld c,"0" jr nc,hconv2 ld c,"1" hconv2: call ccout cp b call z,space ;Tertadentrennung djnz hconv1 ld c,"b" ;Typkennzeichen call ccout ld b,3 call L8424 ld c,d call L9279 ;Test ASCII call c,ccout ;ja jr L91DB L91E3: call prhlan ;Ergebnisanzeige hexa und dezimal ld c,"h" ;Kennung Hexazahl call ccout call space call L85D4 ;Wandlung Hexa-->ASCII-Darstellung Dezimalzahl ld c,"z" ;Kennung Dezimalzahl call ccout ret ;Konvertierung Hexa-Zahl in Dezimal, ASCII darstellen L85D4: push de ld de,10000 call L85F6 ld de,1000 call L85F6 ld de,100 call L85F6 ld de,10 call L85F6 ld a,"0" ;obere Tetrade fuer ASCII or l ld c,a call ccout ;Zeichen ausgeben pop de ret L85F6: push bc call L8603 ld a,"0" or b ld c,a call ccout pop bc ret L8603: or a ld b,0ffh L8606: inc b sbc hl,de jr nc,L8606 add hl,de ret ; MAB60: defm 'Monitor MR80/20.2.87' defb 0dh,3 rkopf: defm 'Load ' defm 'Next ' defm ' PC' defb 0dh,3 ; L898F: ld a,(hl) cp 0dh ret z ld (de),a inc hl inc de jr L898F ;Kdo "Y": L8BF6: jp LAA06 ;Kdo "L": Rueckuebersetzen L8B3F: call parstc ;Eingabeparameter in Stackbereich call L850F ;Parameter aus Stack in Bereich push af push bc push de push hl ld hl,(llis) ;letzte List-Adresse assein: ld a,1 ;EInsprung vom Assembler ld (B81F8),a ld a,(B8132) ;Anzahl Parameter or a jr z,L92DE ;keine ld hl,(W8133) ;1.Parameter: Beginn des Listing dec a jr nz,L933A ;2.Parameter: Ende des Listing nach L92DE: ld de,0FFFFh ;kein 2.Parameter L92E1: ld (lisanf),hl ;List-Anfang ld (lisend),de ;List-Ende eintragen L92E8: ld hl,(lisanf) call prhlan ;List-Adresse anzeigen ld b,2 call L8424 ; x Space ld de,lispuf ;Puffer fuer Rueckuebersetzung call L80A7 ;Aufruf des Rueckuebersetzers call L9353 ;Anzeige der OPC als Dump call L84F1 ;Anzeige der Mnemonik aus Puffer call LA9D0 ;Tastaturstatus abfragen ld hl,(pcdis) ;naechster Anwender-Befehl ld (lisanf),hl ;als Zeiger eintragen ld de,(lisend) ex de,hl or a sbc hl,de ;Endadresse erreicht jr c,L934A ld a,(B8132) ;Anzahl der Parameter or a jr z,L9327 ;keine dec a jr nz,L92E8 ;auch Listende L9327: ld a,(lline) ;nur Listanfang, Standardausgabe Zeilenzahl ld b,a ld a,(B81F8) ;aktueller Zeilenzaehler cp b jr z,L9340 ;eine Bildschirmseite voll L9331: inc a ;Zeilenzaehler erhoehen ld (B81F8),a ;und ablegen L9335: jr L92E8 L933A: ld de,(W8135) ;2.Parameter: Listende jr L92E1 L9340: ld a,(B8132) ;Bildschirmseite voll cp 2 ;nur Listanfang wurde uebergeben jr nz,L934A ;ja, Ende Listlauf xor a jr L9331 ;Zeilenzaehler neu stellen L934A: ld hl,(lisanf) ;Ende Listlauf, Listende ld (llis),hl ;als letzte Listadresse eintragen jp L91DE ;Register zurueck, Aufrufschleife ;Anzeige der OPC zum uebersetzten Befehl als Hex-Dump L9353: ld hl,(lisanf) ;aktueller List-Zeiger ld c,b ;Befehlslaenge L9357: ld a,(hl) ;OPC holen call praan ;anzeigen call space inc hl djnz L9357 ld a,4 ;max. Befehlslaenge sub c ;-tatsaechliche Laenge ld b,a inc b L9366: call space ;Formatierung zum Mnemonikanzeigefeld call space call space djnz L9366 ret ;Rueckuebersetzung und Anzeige des PC-Befehls fuer Protokollzeile L84E6: ld hl,(W8116) ;PC aus Registerpuffer ld de,lispuf ;Puffer zur Uebernahme der Mnemonik call L80A7 ;Aufruf Rueckuebersetzer L84F1: ld hl,(W8137) ;Zeiger auf ld (hl),0dh ;NL inc hl ld (hl),3 ;Ende Listpuffer ld hl,lispuf jp strout ;Puffer anzeigen snewl: ld a,0dh JR lisein komma: LD A,"," JR lisein horztb: LD A,9 JR lisein sspace: LD A," " JR lisein rghlan: LD A,H ;Inhalt in als ASCII eintragen CALL rgaan LD A,L rgaan: PUSH AF ;Inhalt in als ASCII eintragen RRA RRA RRA RRA CALL L0416 POP AF L0416: AND 0fh add a,"0" CP ":" JR C,lisein add a,7 lisein: PUSH HL ld hl,(W8137) ;aktueller Zeiger auf ld (hl),a inc hl ;Zeiger erhoehen ld (W8137),hl ;Zeiger ablegen pop hl ret mnan4: CALL L0453 ;Anzeige von bis zu 4 Stellen Mnemonik JR sspace mnan6: call L045 ;Anzeige von bis zu 6 Stellen Mnemonik jr sspace L045: ld b,6 jr L0455 L0453: LD B,4 L0455: LD A,(HL) INC HL cp 9 ;HT uebergehen jr z,ers CP " " ;Ende Anzeige RET Z ers1: CALL lisein DJNZ L0455 RET ers: ld a," " jr ers1 ;1 Zeichen aus Objektprogramm holen, Zeiger inkrementieren getopc: PUSH HL LD HL,(pcdis) LD A,(HL) INC HL LD (pcdis),HL POP HL RET ;Rueckuebersetzung eines Befehls, Mnemonik als ASCII in Listpuffer L80A7: ld (W8137),de ;Zeiger Listpuffer ablegen ld (pcdis),hl call reasmn ld hl,(pcdis) ;Anfangsadresse Rueck.Befehl ld de,(lisanf) ;Adresse Nachfolgebefehl or a sbc hl,de ld b,l ;= Befehlslaenge ret ;Untersuchung des Operationscodes, Gewinnung der Mnemonik reasmn: CALL getopc ;1 Byte holen, Zeiger inkrementieren reas1: LD HL,(trix) CP 0ddh ;Vorsatzbyte fuer IX-Operationen JR Z,L0E0B LD HL,(triy) CP 0fdh ;Vorsatzbyte fuer IY-Operationen JR Z,L0E0B LD HL,(trhl) JR L0E0E L0E0B: CALL getopc ;2.Byte holen L0E0E: LD (regpuf),HL ;Register merken LD B,0 LD D,A CP 0cbh ;Signalbyte CB JR Z,L0E3F CP 0edh ;Signalbyte ED JR Z,L0E54 LD HL,topc1 ;nop,rlca,rrca,rla,rra,daa,cpl,scf,ccf,halt,exx,de,ei LD C,0dh CPIR JR Z,L0E67 ;gefunden LD C,8 ;cp,or,xor,and,sbc,sub,adc,add mit n CPIR JR NZ,L0E7C ;nicht gefunden ;1-Byte-Arithmetik-/Logikbefehle LD HL,tmnem2 ;Tabelle Mnemonik Arithmetikbefehle SLA C ld a,c SLA C ;Mnemonikadresse ermitteln add a,c ld c,a ;durch Multiplikation mit 6 ADD HL,BC CALL mnan6 ;Anzeige der Mnemonik L0E36: CALL getopc ;2.Byte holen LD E,A ;8 Bit Operand CALL L08D5 ;als B-Marke in Mtab eintragen XOR A RET ;Signalbyte CB L0E3F: CALL getopc ;2.Byte Operationscode holen LD D,A ;merken BIT 4,H ;Test Indexbefehl (Bit 4=1) JR Z,L0E74 LD E,D ;Indexbefehl, 3.Byte =Offset CALL getopc ;4.Byte opreationscode holen LD D,A and 6 sub 6 ;Test zulaessiger OPC fuer Indexregister jr z,cbne ;ja ld hl,tmnnot ;fehlerhaften Operationscode anzeigen call mnan4 ld a,(regpuf+1) ;Test welches Indexregister ld hl,dderr bit 0,a jr z,cberr ld hl,fderr cberr: call mnan4 ;Vor-/Signalbyte anzeigen ld a,e ;Offset call rgaan ld a,d ;Fehlerbyte call rgaan xor a ret cbne: CALL L0888 ;Mnemonik ermitteln CALL L0944 ;Operand zusammenstellen XOR A RET ;Signalbyte ED L0E54: CALL getopc ;2.Byte Operationscode holen LD D,A LD HL,t2opc ;IN,OUT,Blocklade-/-suchbefehle LD C,18h ;IMx,rld,rrd,neg CPIR JP NZ,L10BE ;nicht enthalten LD HL,t2mnem ;Tabelle der Mnemoniks JR L0E6A ;nop,rlca,rrca,rla,rra,daa,cpl,scf,ccf,halt,exx,de,ei L0E67: LD HL,tmnem1 L0E6A: SLA C SLA C ADD HL,BC ;Adresse der Mnemonik einstellen CALL L0453 ;und anzeigen XOR A RET ;Vorsatzbyte CB ohne Indexregister L0E74: CALL L0888 ;Operation ermitteln CALL L0914 ;Register/Bitposition XOR A RET ;Eingabe ueber Direktadresse L0E7C: LD HL,M0372 CP 0dbh ;in a,(n) ? JR NZ,L0E97 ;nein CALL mnan4 ;Anzeige Mnemonik LD A,"a" ;Zielregister CALL lisein CALL komma CALL getopc ;Direktadresse holen LD E,A CALL L098B ;Direktadresse in Klammern anzeigen XOR A RET ;Ausgabe ueber Direktadresse L0E97: LD HL,M0375 CP 0d3h ;out (n),a ? JR NZ,L0EB2 ;nein CALL mnan4 CALL getopc ;Direktadresse holen LD E,A CALL L098B CALL komma LD A,"a" CALL lisein XOR A RET ;unbedingte UP-Rueckkehr L0EB2: LD HL,M0379 CP 0c9h ;ret ? JR NZ,L0EBF ;nein jp mnan4 ;unbedingter UP-Aufruf L0EBF: LD HL,M037D CP 0cdh ;call ? JR NZ,L0ECE ;nein CALL mnan4 jp L08E7 ;Aufrufadresse anzeigen ;unbedingter Sprung L0ECE: LD HL,M0381 CP 0c3h ;jp ? JR NZ,L0EEC ;nein CALL mnan4 ;Mnemonik 'jp' anzeigen jp L08E7 ;Sprungziel anzeigen ;unbedingter Sprung auf Adresse L0EEC: CP 0e9h ;jp (hl) ? JR NZ,L0EF9 ;nein CALL mnan4 ;Mnemonik 'jp' anzeigen jp L0981 ;(hl) anzeigen ;Registertausch af,af' L0EF9: LD HL,M038B CP 8 ;ex af,af' ? JR NZ,L0F0B ;nein CALL mnan4 LD HL,M0399 ;Text af,af' L0444: ld a,(hl) ;Zeichen holen bis Ende 24h cp 24h ret z call lisein inc hl jr L0444 ;Tausch hl <--> sp L0F0B: CP 0e3h ;ex (sp),hl ? JR NZ,L0F19 ;nein CALL mnan4 LD D,30h CALL L096B JR L0F33 ;Tausch de <--> hl L0F19: CP 0ebh ;ex de,hl ? JR NZ,L0F24 ;nein CALL mnan4 LD D,10h JR L0F30 ;hl -->sp L0F24: LD HL,M038E CP 0f9h ;ld sp,hl ? JR NZ,L0F3B ;nein CALL mnan4 LD D,30h L0F30: CALL L0851 L0F33: CALL komma jp L0876 ;Ladebefehle Register --> Register L0F3B: AND 0c0h CP 40h ;OPC zwischen 40h und 7fh ? JR NZ,L0F4F ;nein CALL mnan4 ;ld anzeigen CALL L0881 CALL L0933 ;Zielregister anzeigen CALL komma JR L0F5F ;Quellregister ;Arithmetik-/Logigbefehle mit Einzelregistern L0F4F: CP 80h ;OPC zwischen 80h und bfh ? JR NZ,L0F67 ;nein LD A,D ;Operationscode zurueck AND 38h RRCA ld c,a rrca add a,c ;Division durch 6 LD C,A LD HL,tmnem2 ADD HL,BC CALL mnan6 L0F5F: LD A,D AND 7 CALL L0933 XOR A RET ;Einzelregister in-/dekrementieren L0F67: LD A,D AND 0c7h LD HL,M0391 SUB 4 ;inc ? JR Z,L0F77 ;ja LD HL,M0395 DEC A ;dec ? JR NZ,L0F82 ;nein L0F77: CALL mnan4 CALL L0881 CALL L0933 XOR A RET ;Laden von Einzelregistern L0F82: LD HL,M038E DEC A ;ld r,n ? JR NZ,L0F97 ;nein CALL mnan4 CALL L0881 CALL L0933 CALL komma JP L0E36 ;Laden von Doppelregistern L0F97: LD A,D AND 0cfh DEC A ;ld dd,nn ? JR NZ,L0FAB ;nein CALL mnan4 ;ld anzeigen CALL L0851 ;Zielregister CALL komma CALL L08E7 ;Operand als W-Marke eintragen und anzeigen XOR A RET ;Laden L0FAB: DEC A ;ld (dd),a ? JR NZ,L0FC8 ;nein CALL mnan4 CALL L0966 CALL komma LD A,D CP 22h ;ld ( ),hl ? JR Z,L0FC3 ;ja LD A,"a" CALL lisein XOR A RET L0FC3: CALL L0876 XOR A RET ; L0FC8: CP 8 ;ld a,(dd) JR NZ,L0FE6 ;nein CALL mnan4 LD A,D CP 2ah ;ld hl,( ) ? JR Z,L0FDB ;j LD A,"a" CALL lisein JR L0FDE L0FDB: CALL L0876 L0FDE: CALL komma CALL L0966 XOR A RET ;Doppelregister in-/dekrementieren L0FE6: LD HL,M0391 DEC A ;inc ? JR Z,L0FF3 ;ja LD HL,M0395 CP 8 ;dec ? JR NZ,L0FF8 ;nein L0FF3: CALL mnan4 JR L1008 ;16 Bit Addition L0FF8: LD HL,tmnem2 CP 6 ;add xx,dd ? JR NZ,L100D ;nein CALL mnan4 CALL L0876 CALL komma L1008: CALL L0851 XOR A RET ;relative Spruenge L100D: LD A,D CP 40h JR NC,L104E ;OPC > 40H LD HL,M0387 CP 10h ;djnz ? JR Z,L1030 ;ja LD HL,M0384 ;jr anzeigen CALL mnan4 LD A,D CP 18h ;unbedingter Relativsprung ? JR Z,L1033 ;ja SUB 20h ;Bedingung ermitteln und anzeigen LD D,A CALL L086E CALL komma JR L1033 L1030: CALL mnan4 ;djnz anzeigen L1033: CALL getopc ;Sprungdistanz holen OR A LD D,0 JP P,L103D ;positive Sprungweite DEC D L103D: LD E,A LD HL,(pcdis) ;Sprungziel errechnen ADD HL,DE EX DE,HL jp L08E7+3 ;Marke eintragen ;bedingte UP-Rueckkehr L104E: LD HL,M0379 AND 7 ;ret cond ? JR NZ,L105D ;nein CALL mnan4 ;ret anzeigen CALL L086E ;Bedingung ermitteln und anzeigen XOR A RET ;bedingte Absolutspruenge/UP-Aufrufe L105D: LD HL,M0381 LD C,"C" ;C-TYP CP 2 ;Sprung JR Z,L106D ;ja LD HL,M037D CP 4 ;UP-Aufruf JR NZ,L107B ;nein L106D: CALL mnan4 CALL L086E CALL komma CALL L08E7 XOR A RET ;RST-Befehle L107B: LD HL,M03A8 CP 7 ;rst ? JR NZ,L108F ;nein CALL mnan4 CALL L0881 ;rst-Nummer ermitteln, in ld hl,rstadr ;Tabelle der RST-Adressen sla a sla a ;Multiplikation mit 4 add a,l ;Nummer in Adresse umsetzen ld l,a jr nc,lm107B inc h lm107B: call mnan4 XOR A RET ;Kelleroperationen L108F: LD HL,M03B0 CP 1 ;pop JR Z,L1099 ;ja LD HL,M03AC ;push L1099: CALL mnan4 LD A,D AND 0f0h CP 0f0h JR NZ,L10A5 LD D,40h L10A5: CALL L0851 XOR A RET L10B8: CALL L0453 ;Anzeige der ISR-Rueckkehroperation LD A,1 ;Kennzeichnen fuer LIST-Lauf RET ;weiter ED L10BE: CP 7ch ;Test zulaessig fuer ED-Befehl JP NC,L115A ;nein, Anzeige ??= CP 40h JP C,L115A ;nein LD HL,M0372 AND 87h ;IN ueber indirekte Toradressen JR NZ,L10E0 ;nein CALL mnan4 CALL L0881 CALL L0914 LD HL,M03B7 CALL L0453 XOR A RET ; L10E0: LD HL,M0375 DEC A ;OUT ueber indirekte Toradressen JR NZ,L10F7 ;nein CALL mnan4 LD HL,M03BB CALL L0453 CALL L0881 CALL L0914 XOR A RET ;16 Bit Arithmetik L10F7: LD A,D AND 8fh LD HL,tmnsbc CP 2 ;sbc hl,dd ? JR Z,L1108 ;ja LD HL,tmnadc CP 0ah ;adc hl,dd ? JR NZ,L1110 ;nein L1108: CALL mnan4 CALL L0876 JR L111F ;indirekt Laden 16 Bit L1110: LD HL,M038E PUSH AF CALL mnan4 ;ld anzeigen POP AF CP 3 ;ld (adr),dd ? JR NZ,L1127 ;nein CALL L0975 L111F: CALL komma CALL L0851 XOR A RET L1127: CP 0bh ;ld dd,(adr) ? JR NZ,L1136 ;nein CALL L0851 CALL komma CALL L0975 XOR A RET ;Interrupt-/Refresh-Register L1136: LD A,D AND 0efh LD B,"i" CP 47h ;I-Register JR Z,L1145 ;ja LD B,"r" CP 4fh ;R-Register JR NZ,L115A ;nein, Anzeige ??= L1145: LD A,"a" BIT 4,D ;Test Ziel oder Quelle JR NZ,L114E ; = Ziel LD A,B ; = Quelle LD B,"a" L114E: CALL lisein CALL komma LD A,B CALL lisein XOR A RET ;Anzeige nicht erkannter OPC ??= in ED-Bereich L115A: LD HL,tmnnot CALL mnan4 LD HL,M03B4 ;ed CALL L0453 LD A,D ;fehlerhaftes Byte CALL rgaan XOR A RET L0851: LD A,D CP 40h JR Z,L0858 AND 30h L0858: LD HL,M0334 ;'bcde' RRA L085C: RRA RRA LD C,A LD B,0 ADD HL,BC LD A,(HL) CALL lisein INC HL LD A,(HL) CP 20h RET Z L086B: JP lisein L086E: LD A,D AND 38h LD HL,M0324 ;Konditionen JR L085C L0876: LD A,(regpuf) CALL lisein LD A,(regpuf+1) JR L086B L0881: LD A,D ;Ermittlung Einzelregister AND 38h RRCA RRCA RRCA RET L0888: PUSH DE ;Untersuchung Verschiebe-Befehle LD A,D RRA AND 7ch CP 20h JR C,L0898 RRA RRA RRA AND 0ch add a,1ch L0898: LD HL,M033E LD C,A LD B,0 ADD HL,BC CALL mnan4 LD A,D CP 40h JR C,L08B2 ;Verschiebebefehle CALL L0881 add a,30h CALL lisein ;Bit-Nr. anzeigen bei allen Bit-Befehlen CALL komma L08B2: LD A,D AND 7 POP DE RET L08D5: call tvorn ld a,e call rgaan JR hexm ;Wort nach gtword: CALL getopc LD E,A CALL getopc LD D,A RET L08E7: CALL gtword call tvorn ;ggf Vornull ausgeben EX DE,HL call rghlan ;Operandenwort anzeigen hexm: ld a,"H" jp lisein tvorn: cp 0a0h ret c LD A,"0" ;Vornull L0905: jp lisein L0914: INC A CP 5 JR C,L0926 add a,2 CP 8 JR C,L0926 add a,3 CP 0dh JR NZ,L0926 XOR A L0926: add a,"a" CP 6dh JP NZ,lisein LD HL,M036A JP L0453 ;Behandlung Indexregister im Bereich 40h-7fh L0933: CP 6 ;ix,iy/hl-Zeile JR NZ,L0914 ;nein LD A,(regpuf) BIT 0,A ;Identifikation ob "h" oder "i" LD A,6 JR Z,L0914 ;"h"=68h, Bit 0 = 0 CALL getopc ;Offset zur Basisadresse ix,iy LD E,A L0944: LD A,"(" CALL lisein ;anzeigen CALL L0876 ;entsprechendes Indexregister anzeigen LD A,E OR A JR Z,L0961 ;Offset = 0 LD C,"+" JP P,L095A ;Offsetvorzeichen NEG LD E,A LD C,"-" L095A: LD A,C CALL lisein ;anzeigen push de ;Operation in retten CALL L08D5 pop de L0961: LD A,")" JP lisein ; L0966: LD A,D CP " " JR NC,L0975 L096B: LD A,"(" CALL lisein CALL L0851 JR L0961 L0975: LD A,"(" CALL lisein PUSH DE CALL L08E7 POP DE JR L0961 L0981: LD A,"(" CALL lisein CALL L0876 JR L0961 L098B: LD A,"(" CALL lisein CALL L08D5 JR L0961 ;Tabelle von Operationscodes topc1: DEFB 0,7,0fh,17h,1fh,27h,2fh,37h,3fh,76h,0d9h,0f3h,0fbh ;nop,rlca,rrca,rla,rra,daa,cpl,scf,ccf,halt,exx,de,ei ; topc2: DEFB 0FEH,0F6H,0EEH,0E6H,0DEH,0D6H,0CEH,0C6H ;cp,or,xor,and,sbc,sub,adc,add mit n ; t2opc: DEFB 44H,46H,56H,5EH,67H,6FH,45H,4DH,0A0H,0A1H,0A2H,0A3H,0A8H DEFB 0A9H,0AAH,0ABH,0B0H,0B1H,0B2H,0B3H,0B8H,0B9H,0BAH,0BBH ;2.Byte hinter Signalbyte ED topc3: defb 10h,18h ;OPC fuer jr,djnz ;Tabelle der dazugehoerigen Mnemoniks tmnem2: DEFM 'add' defb 9,'a,' tmnadc: DEFM 'adc' defb 9,'a,' DEFM 'sub ' tmnsbc: DEFM 'sbc' defb 9,'a,' DEFM 'and ' DEFM 'xor ' DEFM 'or ' DEFM 'cp ' ; tmnem1: DEFM 'ei ' DEFM 'di ' DEFM 'exx ' DEFM 'halt' DEFM 'ccf ' DEFM 'scf ' DEFM 'cpl ' DEFM 'daa ' DEFM 'rra ' DEFM 'rla ' DEFM 'rrca' DEFM 'rlca' tm1end: DEFM 'nop ' ; t2mnem: DEFM 'otdr' DEFM 'indr' DEFM 'cpdr' DEFM 'lddr' DEFM 'otir' DEFM 'inir' DEFM 'cpir' DEFM 'ldir' DEFM 'outd' DEFM 'ind ' DEFM 'cpd ' DEFM 'ldd ' DEFM 'outi' DEFM 'ini ' DEFM 'cpi ' DEFM 'ldi ' DEFM 'reti' DEFM 'retn' DEFM 'rld ' DEFM 'rrd ' DEFM 'im 2' DEFM 'im 1' DEFM 'im 0' tm2end: DEFM 'neg ' ; defm 'add adc sub sbc and xor or ' t3mnem: defm 'cp ' rstadr: defm '0 ' defm '8 ' defm '10h ' defm '18h ' defm '20h ' defm '28h ' defm '30h ' defm '38h ' M0324: DEFM 'nzz ncc popep m ' M0334: DEFM 'bcde' regpuf: DEFM 'hl' ;Puffer fuer Register-Ermittlung M033A: DEFM 's' M033B: DEFM 'p' M033C: DEFM 'af' M033E: DEFM 'rlc ' M0342: DEFM 'rrc ' M0346: DEFM 'rl ' M034A: DEFM 'rr ' M034E: DEFM 'sla ' M0352: DEFM 'sra ' M0356: DEFM 'sli ' M035A: DEFM 'srl ' M035E: DEFM 'bit ' M0362: DEFM 'res ' M0366: DEFM 'set ' M036A: DEFM '(' trhl: DEFM 'hl' M036D: DEFM ')' trix: DEFM 'ix' triy: DEFM 'iy' M0372: DEFM 'in ' M0375: DEFM 'out ' M0379: DEFM 'ret ' M0381: DEFM 'jp ' M037D: DEFM 'call' M0384: DEFM 'jr ' M0387: DEFM 'djnz' M038B: DEFM 'ex ' M038E: DEFM 'ld ' M0391: DEFM 'inc ' M0395: DEFM 'dec ' M0399: DEFM 'af,af' DEFB 027H DEFB 024H M03A0: DEFM 'reti' M03A4: DEFM 'retn' M03A8: DEFM 'rst ' M03AC: DEFM 'push' M03B0: DEFM 'pop ' M03B4: DEFM 'ed ' M03B7: DEFM ',(c)' M03BB: DEFM '(c),' dderr: defm 'ddcb ' fderr: defm 'fdcb ' tmnnot: defm '??= ' defm 'b c d e h l (hl a bc de hl sp ix iy ' M0FEB: defm 'af (ix+(iy+(bc (de (c (sp (ix ' M1003: defm '(iy im ' ;Konvertierungsbereich ASCII--->HEXA conpu: defs 20h W81C4: defW 0 ;Parameterzaehler bei Zahlenkonvertierung ; ldump: defW 0 ;letzte Display-Adresse "D" liso: defw 0 ;letzte Displayadresse "I" llis: defw 0 ;letzte List-Adresse lbyte: defW 0 ;letzte Display-Adresse "S" kdod: defb 0 ;Kdo-Typ bei Wiederholung lmix: defw 0 ;letzte Anzeige gemischter Speicherabzug kdopuf: defb 0 ;Kommandopuffer fuer Wiederholung lisanf: defW 0 ;aktueller Zeiger im List-Bereich pcdis: DEFW 100H ;Zeiger innerhalb Rueck.Befehl mnempf: defs 4 ;ASCII-Puffer fuer Mnemonikuntersuchung lchr: defb 0 ;Letztes Zeichen Mnemonikteil lassa: defW 0 ;Adresse Befehlsanfang poiopc: defW 0 ;Zeiger OP-Codeablage innerhalb Mnemonikuntersuchung assasp: defW 0 ;Puffer Monitor-SP lisend: defW 0 ;List-Ende lispuf: defs 019h ;Puffer fuer Rueckuebersetzungstext prff: defB 0 ;Drucker-FF, 0=aus smod: defB 0 ;Darstellung Hexa=0, ASCII=FF bei "S" defB 0 ;Richtung vorw.=0, rueckw.=FF inpoi: defW M8200 ;Zeiger auf Eingabepuffer inmax: defB 3Fh ;max. moegl. Eingabelaenge inlen: defB 0 ;tatsaechliche Eingabelaenge M8200: defm 'V8000 A9FF 700' ;Eingabepuffer defb 00Dh defs 035h spnorm: defW 0 lline: defb 15 ;Standardausgabelaenge sysdat: defb 8 ;Puffer fuer Systemdatum ;Puffer fuer Registerinhalte Anwenderprogramm B8102: defB 0 ;F' B8103: defB 0 ;A' B8104: defB 0 ;F B8105: defB 0 ;A W8106: defW 0 ;BC' W8108: defW 0 ;DE' W810A: defW 0 ;HL' W810C: defW 0 ;BC W810E: defW 0 ;DE W8110: defW 0 ;IX W8112: defW 0 ;IY W8114: defW 0 ;SP W8116: defW 0 ;PC W8118: defW 0 ;HL B811A: defB 0 ;I ; mrstat: defB 0 ;Status Monitor ;Bit 7=0: "DA" aktiv; 7=1: "DH" aktiv ;Bit 6=0: JHP aktiv; 6=1: QHP aktiv ;Bit 5=0: ; 5=1: "W" aktiv ;Bit 4=0: ; 4=1: "T" aktiv ;Bit 3=0: ; 3=1: ;Bit 2=0: ; 2=1: Ausfuehren Reaktionsroutine ;Bit 1=0:Rueckkehr Aufruf; 1=1: Befehlsanalyse, Anwenderprogr. ;Bit 0=0:mit Protokollzeile; 0=1 ohne defB 0 ;Zaehler Anzahl abgearbeiteter Befehle "T" S81C6: defb 0 ;Hinweis auf Programmfortsetzung im Monitor ;Bit 7=0: Anzeige Vordergrungregister; 7=1 Routine entspr. "P" ;Bit 3=1 HP1/HP2 scharf ;Bit 0=0 HP-Tabellen geloescht W8120: defW 0 ;Adresse HP1 B8122: defB 0 ;OPC von HP1 W8123: defW 0 ;Adresse HP2 B8125: defB 0 ;OPC von HP2 W8126: defW 0 ;Adresse HP1 alternativ B8128: defB 0 ;OPC von HP1 altn. W8129: defW 0 ;Adresse HP2 alternativ B812B: defB 0 ;OPC von HP2 altn. W812C: defw 0 ;Zwischenspeicher Anwender-PC W812E: defw 0 ;Zwischenspeicher Anwender-Rueckkehradresse W8130: defw 0 ;Zwischenspeicher Anwenderregister ;Haltepunkttabelle fuer J-Punkte JHP jhptab: defs 40 ;10 Haltepunkte a 4 Byte defB 3 ;Ende ;Haltepunktabelle fuer Q-Punkte(mit Reaktionsadresse) QHP qhptab: defs 60 ;10 Haltepunkte a 6 Byte defB 3 ;Ende B81A3: defB 0 ;HP-Nr.-Zaehler bei Ausgabe aller HP aus JHP bzw. QHP W81C7: defW 0 ;Puffer Anwender-PC bei Reaktionsroutinen B81C9: defB 0 ;OPC von Anwender-PC W81CE: defW 0 ;Puffer Programmadresse "P" B81F7: defB 0 ;Befehlslaenge des rueckuebersetzten Befehls B81F8: defB 0 ;Zeilenzaehler bei LIST auf Bildschirm ;Uebergabebereich von Eingabeparametern aus Stack B8132: defB 0 ;Parameterzahl W8133: defW 0 ;1.Parameter W8135: defW 0 ;2.Parameter W8137: defW 0 ;3.Parameter ;-------------------------------------------------------------------- ;CRC16-Routine ;=Anfangsadresse DATA; =Endadresse+1 ;=CRC16-Pruefsumme; Z=1 wenn =0 crc16: push bc push ix push hl pop ix ;DATA-Zeiger or a ex de,hl sbc hl,de push hl pop bc ;Laenge ld hl,0ffffh ;Error Check Startwert ld de,0a001h crc16a: ld a,(ix) ;naechstes Byte inc ix xor l ld l,a push bc ld b,8 crc16b: srl h rr l jr nc,crc16c ld a,e xor l ld l,a ld a,d xor h ld h,a crc16c: djnz crc16b pop bc ;Laenge dec bc ld a,c or b jr nz,crc16a ;weiter pop ix pop bc ld a,h or l ret ;Pruefsumme in ;Kdo "A": Aufruf des Assembler/Editor L8AB1: call parstc ;Parameter fuer Adresse call L850F ld hl,(lassa) ld a,(B8132) or a jr z,A0DDB ld hl,(W8133) ;Aufrufadresse ld (lassa),hl jr A0DDB fmnem: ld a,(mnempf) cp 'l' ;Listing angefordert jr nz,fmne1 call newl ld hl,(lassa) call mran4 ;Rueckuebersetzung einer Seite call newl jr fmne2 fmne1: call newl ld c,'?' ;Fehler falsche Mnemonik call ccout fmne2: ld hl,(assasp) ld sp,hl ;Eintrittspunkt Aufruf ASSA A0DDB: ld hl,0 add hl,sp ld (assasp),hl ;SP retten ld hl,(lassa) ld (poiopc),hl A0DE2: ld (lisanf),hl call prhlan ;Adressanzeige ld b,2 call L8424 ; x mal Space ld de,lispuf call L80A7 ;REAS-Aufruf call L9353 ;alten OPC anzeigen ld hl,(W8137) ;Zeiger im lispuf ld (hl),3 ;Stringende markieren ld hl,lispuf call strout ld c,'-' call ccout ld b,40h call L86A3 ;Mnemonik-Eingabe call A03FD ;Mnemonik-Auswertung call newl ld hl,(poiopc) ld (lassa),hl jr A0DE2 A0DF7: ld hl,(assasp) ;SP zurueck ld sp,hl ret ;Ende ASSA A021C: call A039F A021F: cp '+' ret z cp '-' ret z cp '9' ret nc cp '0' ret c ld c,a xor a ld a,c ret A023E: cp ')' ret z cp ' ' ret z cp 9 ret z cp ',' ret z cp 0dh ret z cp 7fh jp z,A0DDB ret ;Uebernahme Teil der Anweisungszeile in Untersuchungspuffer A025E: call getch A0261: cp 0dh ;Eingabeende jp z,fmnem call A023E ;spezielle Zeichen als Anfang nicht jr z,A025E ;uebergehen ld c,4 ld hl,mnempf A0271: ld (hl),' ' ;Untersuchungspuffer loeschen inc hl dec c jr nz,A0271 ld c,5 ld hl,mnempf A027D: ld (hl),a ;Zeichen in Puffer eintragen call A021F ;Ende Quellteil suchen jr z,A0298 A0287: call getch call A023E ;Ende Quellzeilenteil suchen jr z,A0298 inc hl dec c jp z,fmnem ;Eingabe zu lang jr A027D A0298: ld (lchr),a ;spezielles Zeichen merken ld a,(mnempf) cp ' ' ret ;Zahlenkonvertierung A1C7D: ld de,0 cp '-' ;Relativadr.: negative Distanz jr z,l02a6 l02a1: cp '+' ;Reladr.: Positive Distanz jr z,l02a2 l02a4: call mran6 ;Absolutadr., Konvertierung ex de,hl ;Hexa-Wert nach l02a7: cp '+' ;folgt weiterer Operand ? jr nz,l02a5 ;nein l02a2: push de call getch call mran6 ;Konvertierung ASCII in Hexa- pop bc add hl,bc ex de,hl jr l02a7 l02a5: cp '-' ;folgt weiterer Operand ret nz ;nein, =vollstaendiger Wert des Ausdrucks l02a6: call getch push de ;Minuend retten call mran6 ;Subtrahend berechnen ex de,hl pop hl ;Minuend zurueck or a sbc hl,de ;Ausfuehrung der Subtraktion ex de,hl ;Ergebnis nach jr l02a7 ;Operandenanalyse: Ausdrucksaufloesung unter Beachtung negativer Zahlen A02A1: push de cp 'a' jp nc,fmnem ;fuehrende Null call A1C7D ;Ausdrucksaufloesung, Hexa-Ergebnis in ld b,d ;High-Teil ld a,e ;Low-Teil pop de dec b inc b ret ;Offsetberechnung A02BD: ld a,(lchr) ;Offsetvorzeichen cp ')' ;Indexregister ohne Offset-Angabe jr nz,A02C0 xor a ;kein Offset ret A02C0: call A02A1 ret A02D0: call getch ;Vorzeichen holen call A021F jr nz,A02C0 xor a ret ;Registerermittlung A02D6: rla rla rla and 38h ret A02DC: rla rla rla rla and 30h ret ;Vergleich zweier Zeichen A02E3: ld de,(mnempf) A02E8: ld a,e cp (hl) jr nz,A02F2 inc hl ld a,d cp (hl) ret z dec hl A02F2: dec hl dec hl dec c jr nz,A02E8 dec c ret A02FA: ld c,1 ;einmalige Vergleichsoperation A02FC: ld b,4 ;Vergleich von 4 Zeichen push de ld de,mnempf ;IST-Kette A0302: ld a,(de) cp (hl) ;=SOLL-Kette jr nz,A030F ;keine Gleichheit inc hl inc de dec b jr nz,A0302 pop de ;Vergleich erfolgreich beendet, Z=1 ret ; entspricht Position in SOLL-Ketten-Tabelle A030F: inc hl ;SOLL-Ketten-Ende suchen dec b jr nz,A030F ld de,0FFF8h add hl,de ;auf Vorgaenger einstellen pop de inc de dec c ;alle Vergleiche durch jr nz,A02FC ;nein dec c ;Z=0, Vergleich nicht erfolgreich ret A0320: call A0327 ;Identifikation von Indexregistern jp nz,fmnem ret A0327: cp 4 ;IX jp nz,A0331 ld a,0DDh ;Vorsatzbyte jp A03F4 ;eintragen A0331: cp 5 ;IY ret nz ;kein Indexregister ld a,0FDh ;Vorsatzbyte jp A03F4 ;Ermittlung von Bitpositionen A0339: push bc call A025E jp z,fmnem cp 30h jp c,fmnem cp 38h jp nc,fmnem and 0Fh pop bc ret A034E: push bc ;Registererkennung mit Fuellen Analysepuffer push de call A0261 jr A035B A0356: push bc ;Registererkennung push de call A025E A035B: jp z,fmnem ld hl,mnempf+3 ;Vorzeichen im Offset bei Indexregistern ld a,(hl) cp '-' jp nz,A0369 ld (hl),'+' ;in IST-Kette wegen Vergleich ersetzen A0369: ld c,17h ld hl,M1003 ;Registertabelle call A02FC ;Suchen in Tabelle jr nz,A0377 ;nicht gefunden, Z=0 ld a,c cp 16h ;Beruecksichtigung Index ohne Offset jr c,l036a sub 6 ld c,a ld a,')' ld (lchr),a l036a: dec c xor a ;gefunden, Z=1, ld a,c ;Position uebergeben A0377: pop de pop bc ret A037A: push bc push de jr A038F ;Suche Doppelregister A037F: push bc push de call A0261 ;Fuellen Analysepuffer mit jr A038C A0387: push bc push de call A025E ;Fuellen Analysepuffer , vorher Zeichen holen A038C: jp z,fmnem A038F: ld c,7 ;Anzahl der Tabellenzeilen ld hl,M0FEB ;Tabelle Doppelregister call A02FC jp nz,fmnem ;nicht gefunden dec c ld a,c pop de pop bc ret A039F: push bc A03A0: call getch cp 0Dh ;Eingabeende jp z,fmnem call A023E ;als Anfang jr z,A03A0 ;uebergehen cp '(' pop bc ret A03B2: call A0387 A03B5: cp 6 ;Position nicht zulaessig jp z,fmnem ret A03BB: call A0387 cp 3 ;Position nicht zulaessig jp z,fmnem cp 6 ;Wechsel 6 auf 3 ret nz ld a,3 ret A03C9: call A0356 A03CC: cp 7 ;nur zulaessig jp nz,fmnem ret A03D2: call A0261 ;Analysepuffer fuellen ld hl,M0324+14 ;Bedingungen ld c,8 call A02E3 jp nz,fmnem dec c ld a,c call A02D6 ;Linksverschiebung ret A03E6: call A03D2 ;Bed. Relativspr.: Bedingungsermittlung push af call A039F ;naechstes Zeichen call A02A1 ;Sprungweite ermitteln ld c,a pop af ret A03F3: ld a,(de) ;OPC aus Tabelle entnehmen A03F4: call space call praan ld hl,(poiopc) ;Zeiger auf Uebersetzungsbereich ld (hl),a ;OPC eintragen inc hl ld (poiopc),hl ret A03FD: call getch cp 0Dh ;Eingabeende, Verlassen ASSA jp z,A0DF7 cp 1bh ;ESC: Verlassen ASSA jp z,A0DF7 call htout call A0261 ;Analysepuffer mit Operation fuellen jp z,fmnem ;Beginn der Mnemonikanalyse ld c,0dh ;Zeilenzahl ld hl,tm1end ;1 Byte-Befehle ld de,topc1 call A02FC jr nz,a0421 ;nicht jr A03F3 ;OPC aus Tabelle nehmen, eintragen a0421: ld hl,M1003+4 ;seperate 'im'-Erkennung call A02FA jr nz,A0430 call A039F ;Nr. des Modus holen und eintragen ld (mnempf+3),a A0430: ld c,18h ld hl,tm2end ld de,t2opc ;rld-otdr call A02FC jr nz,A0446 ;nicht ld a,0EDh ;Signalbyte eintragen call A03F4 jp A03F3 ;OPC entnehmen und eintragen A0446: ld c,2 ld hl,M0387 ;jr,djnz ld de,topc3 call A02FC jr nz,A04AE ;nicht ld a,(de) ;OPC entnehmen ld d,a call A021C ;Test zulaessiger Operandenbeginn jr nz,A0463 ;nein call A02A1 ;Wandlung Operand nach ld c,a ;Low-Teil Operand jr A0469 A0463: call A03E6 ;Untersuchung bedingt Relativ-Sprung or 20h ;Ergaenzung obere Tetrade OPC ld d,a ;OPC merken A0469: ld hl,(poiopc) ;Adresse des Auftretens Relativ-Sprung inc hl inc hl ;Laenge jr weiter ld a,b ;High-Teil Sprungoperand cp 0 jr nz,lj461 ;Sprungadresse absolut angegeben ld a,c or a jp m,lj462 ;keine zulaessig positive Sprungweite lj464: ld b,a jr A0499-1 ;OPC und Sprungweite eintragen lj461: cp 0ffh jr nz,lj463 ld a,c or a jp p,lj462 ;keine zulaessig negative Sprungweite jr lj464 lj463: ld a,c ;Berechnung Sprungweite aus Absolutadressen lj462: sub l ld c,a ld a,b sbc a,h cp 0 jr nz,A0480 ld a,c or a jp m,fmnem jr A048A A0480: cp 0FFh jp nz,fmnem ld a,c or a jp p,fmnem A048A: ld b,c ;Sprungweite ld a,d ;OPC A0499: call A03F4 ;eintragen ld a,b ;Sprungweite eintragen jp A03F4 ; A048F: call A02DC ;Linksverschiebung or b A0493: ld c,e ld b,d A0495: call A03F4 ld a,c jr A0499 ;ld Doppelregistee,nn A04A0: call A02DC ;Register ermitteln or b A04A4: call A03F4 ld a,c call A02A1 ;nn ermitteln jr A0499 ; A04AE: ld c,8 ld de,0f8h ld hl,M035A ;Rot. u. Verschieben call A02FC jr nz,A04C5 ld a,e cpl rlca rlca rlca ld c,a jr A04E2 A04C5: ld de,0fdh ld c,3 ld hl,M0366 ;Bittest-,-manipulationsbefehle call A02FC jr nz,A052E ld a,e cpl add a,1 rrca rrca ld c,a call A0339 ;Bitposition ermitteln call A02D6 or c ld c,a A04E2: call A0356 ;Operand holen cp 8 jp c,A0500 sbc a,0bh ;Indexregister call A0320 ;entspr. Vorsatzbyte eintragen ld a,6 or c ld b,a ld a,0CBh ;Signalbyte call A03F4 ;eintragen push bc call A02BD ;Offset ermitteln pop bc jp A0499 A0500: or c ld b,a ld a,0CBh ;Signalbyte jp A0499 A0507: call A0356 ;Operand holen jr nz,A051E cp 8 jr c,A0529 sbc a,0bh call A0320 ;Indexregister ld a,c or 6 or b jp A062A A051E: ld d,a ld a,0C6h or b ld b,a jp A062A A0526: call A02D6 A0529: or c or b jp A03F4 A052E: ld c,8 ld hl,t3mnem ;Arithmetik-Befehle call A02FC jr nz,A059E dec c ld a,c call A02D6 ld b,a ld c,80h cp 20h jr nc,A0507 cp 10h jr z,A0507 call A0356 ;Operand holen cp 7 ;Register jr z,A0507 sbc a,8 ld c,a cp 2 jr nz,A057B ld a,b or a jr z,A0583 cp 8 jr z,A0566 xor a A0566: or 42h ld b,a call A03B2 cp 4 jp nc,fmnem call A02DC or b ld b,a ld a,0edh ;Vorsatzbyte jp A0499 A057B: call A0320 ;Indexregister ld a,b or a jp nz,fmnem A0583: call A03B2 cp c jr nz,A058F ld a,2 jp A0599 A058F: cp 4 jp nc,fmnem cp 2 jp z,fmnem A0599: ld c,9 jp A0782 A059E: ld c,2 ld hl,M0395 ;dec,inc call A02FC jr nz,A05E0 ld d,c inc c inc c inc c call A0356 jp nz,fmnem cp 8 jr c,A05DD sbc a,8 call A03B5 call A0327 jr nz,A05C5 ld a,2 A05C5: cp 7 jr c,A05D5 sbc a,3 call A0320 ld a,33h add a,d jr A062A A05D5: rlca dec c dec d jr z,A05DD ld c,0bh A05DD: jp A0526 A05E0: ld c,1 ld hl,M038E ;Lade-Befehle call A02FC jp nz,A0745 call A039F cp '(' ;indirekt jp z,A06B9 call A034E cp 8 jr nc,A065B ld d,a A05FC: call A02D6 or 40h ld b,a call A0356 jr z,A0616 ;Quelle nicht Register cp 'r' ;Refresh-Register jr nz,a5fc1 ld a,d call A03CC ;Test nur ld b,5fh ;OPC2 jr A0665 a5fc1: cp 'i' jr nz,A0640 ld a,d call A03CC ld b,57h jr A0665 A0616: cp 8 jr nc,A061F or b jp A03F4 A061F: sbc a,0bh call A0327 ;Indexregister jr nz,A0633 ld a,6 or b A062A: call A03F4 call A02BD ;Offset ermitteln jp A03F4 A0633: sbc a,6 ld c,a ld a,d call A03CC ld a,c ld c,0Ah jp A0782 A0640: cp '(' ;Operand indirekt jr z,A064D ld a,b or 6 and 3Fh A064A: jr A062A A064D: ld a,d ;Zielregister call A03CC ld d,3Ah ;OPC ld a,(mnempf+1) ld c,a ld a,d jp A04A4 A065B: cp 'r' jr nz,a65b1 call A03C9 ;naechster Teil, Test nur ld b,4fh jr A0665 a65b1: cp 'i' jr nz,A066A call A03C9 ld b,47h A0665: ld a,0EDh jp A0499 A066A: call A037A ld b,a call A0327 jr nz,A0676 ld b,2 A0676: call A0356 jr nz,A0694 call A037A ld c,a ld a,b cp 3 jp nz,fmnem ld a,c cp 2 jp z,A068F call A0320 ;Indexregister A068F: ld a,0F9h jp A03F4 A0694: cp 28h jr z,A06A0 ld c,a ld a,b ld b,1 jp A04A0 A06A0: ld a,(mnempf+1) ld c,a ld a,b cp 2 jr nz,A06AF ld a,2ah jp A04A4 A06AF: ld a,0EDh call A03F4 ld a,b ld b,4Bh jp A04A0 A06B9: call A021C jr z,A06DF cp 'i' ;Ziel Indexregister jr z,A070E call A037F ld c,a cp 2 ld a,6 jp z,A05FC jp nc,fmnem ld b,2 call A0356 call A03CC ld a,c ld c,b jp A0782 A06DF: call A1C7D ;Zahlenkonvertierung call A039F cp 'a' ;ld (adr),a jr nz,A06EF ld a,32h ;OPC jp A0493 A06EF: call A037F ;Doppelregister cp 2 jr z,A06FD ;ld (adr),hl call A0327 jr nz,A0702 A06FD: ld a,22h ;OPC jp A0493 A0702: push af ld a,0EDh ;Signalbyte call A03F4 pop af ld b,43h ;Maske fuer OPC ld (adr),rr jp A048F A070E: call A039F ;Feststellung rr bei Indexreg. cp 'x' ld b,4 jr z,A071E cp 'y' jp nz,fmnem inc b A071E: ld a,b call A0320 call A02D0 ;Offset holen ld b,a call A0356 jr z,A0736 ;Quelle=Register ld d,a ld a,36h ;OPC call A03F4 ld a,b ;Offset jp A064A A0736: cp 6 jp z,fmnem cp 8 jp nc,fmnem or 70h jp A0499 A0745: ld c,1 ld hl,M03A8 ;RST-Befehle call A02FC jr nz,A0761 call A02D0 ld c,a and 7 jp nz,fmnem ld a,c and 0F8h or 0C7h jp A03F4 A0761: ld c,2 ld hl,M03B0 ;push,pop call A02FC jr nz,A0789 dec c jr nz,A0775 ld c,0C5h ;OPC push jr A0777 A0775: ld c,0C1h ;OPC A0777: call A03BB call A0327 jr nz,A0782 ld a,2 A0782: call A02DC or c jp A03F4 A0789: ld c,2 ld hl,M037D ;jp,call call A02FC jr nz,A07D2 dec c ld d,c call A021C jr z,A07C5 cp '(' jr z,A07B0 ;Indirekter Sprung push de call A03E6 ;Bedingung ermitteln, Bildung Sprungadresse pop de or 0c0h ;OPC-Maske ld e,a inc d ld a,d add a,d or e jp A0495 A07B0: ld a,d or a jp nz,fmnem call A03B2 cp 2 jr z,A07C0 call A0320 A07C0: ld a,0e9h ;jp (hl) jp A03F4 A07C5: ld c,a ld a,d or a ld a,0c3h ;jp jp z,A04A4 ld a,0cdh ;call jp A04A4 A07D2: ld hl,M0379 ;ret call A02FA jr nz,A07F0 call getch cp 0dh jr z,A07EB ;ohne Bedingung call A03D2 ;Bedingung ermitteln or 0c0h jp A03F4 A07EB: ld a,0c9h jp A03F4 A07F0: ld c,2 ld hl,M0375 ;in, out call A02FC jr nz,A0845 call A0356 ;Zielregister jr z,A0811 dec c jp z,fmnem call A02BD ld b,a call A03C9 ld a,0d3h ;OPC fuer out jp A0499 A0811: ld e,a call A0356 jr z,A0825 dec c jp nz,fmnem ld a,e call A03CC ld a,0dbh ;OPC fuer in jp A062A A0825: ld d,a dec c jr z,A082D ld a,e ld e,d ld d,a A082D: cp 13h jp nz,fmnem ld a,0edh ;in,out ueber call A03F4 ld a,e cp 8 jp nc,fmnem call A03B5 ld b,40h ;Maske fuer OPC-Bildung jp A0526 A0845: ld hl,M038B ;ex call A02FA jp nz,fmnem call A0356 cp 14h jr nz,A0868 call A0356 cp 0ah jr z,A0863 sbc a,8 call A0320 A0863: ld a,0E3h ;ex (sp),hl jp A03F4 A0868: cp 0Eh jr z,A0872 cp 16h jr nz,A0877 A0872: ld a,8 ;ex af,af' jp A03F4 A0877: cp 9 jp nz,fmnem call A0356 cp 0ah jp nz,fmnem ld a,0EBh ;ex de,hl jp A03F4 ;Kdo "K": Pruefsumme ueber Speicherbereich L8B3C: call parstc ;Eingabeadressen in Stackbereich cp 2 ;2 Adressen erforderlich jp nz,LAA06 ;Fehler call L850F ;Parameter aus Stack in Bereich push af push bc push de push hl call L85C8 ;Uebernahme Parameter in Register 1., 2. inc de call crc16 ;Pruefsumme errechnen push hl ;CRC-Rest merken ld hl,tpr call strout pop hl call prhlan ;CRC-Rest anzeigen jp L91DB ;NL und Register zurueck tpr: defm 'Pruefsumme: ' defb 3 ;Kdo "O": direkte Ausgabe auf Toradresse L8B56: call parstc ;Eingabeparameter in Stackbereich uebertragen cp 2 ;zwei Parameter erforderlich jp nz,LAA06 ;Verkehrt call L850F ;Parameter aus Stack in Bereich push af push bc ld a,(W8133) ;Toradresse ld c,a ld a,(W8135) ;Kanalwort out (c),a ;Ausgabe pop bc pop bc ret ;Kdo "I": direkte Eingabe ueber Toradresse indir: call parstc ;Eingabeparameter in Stackbereich cp 1 jp nz,LAA06 call L850F ;Parameter aus Stack in Bereich push af push bc ld a,(W8133) ;Toradresse ld c,a in a,(c) ;Kanalwort einlesen push bc ld c,"i" call ccout pop bc ld b,a ld a,c call praan ;Anzeige Toradresse ld a,b call space call praan ;Anzeige Kanalwort call newl pop bc pop af ret ;Kdo "D": Anzeige Speicherabzug ab Adr. mit Typ x,a,h dump: call getch ;naechstes Zeichen jr z,wied ;Kommandowiederholung jp nc,L82EC ld (kdod),a ;Typ fuer Wiederholung merken dump1: cp "x" ;gemischte Anzeige jr z,kdump cp "h" ;Hexa mit CRC jp z,L8AC7 cp "a" ;Darstellung als ASCII jp z,L8AF9 xor a ld (kdod),a jp LAA06 wied: ld a,(kdod) jr dump1 ;Kdo "DX": gemischter Speicherabzug kdump: call parstc ;Eingabeparameter in Stackbereich uebertragen call L850F ;Parameter aus Stack in Bereich push af push bc push de push hl ld hl,(lmix) ;letzte Mix-Dump-Adresse ld a,(B8132) ;Anzahl der Parameter or a jr z,kdp1 ;keine Parameter dec a ld hl,(W8133) ;1.Parameter: Anfangsadresse jr z,kdp1 ;kein weiterer Parameter ld de,(W8135) ;2.Parameter: ENDadresse jr kdp4 kdp1: push hl ld de,10h ;Weite Hexa-Zeile ld a,(lline) ;Standard-Ausgabelaenge(Zeilenzahl) ld b,a kdp3: add hl,de ;Berechnung Endadresse djnz kdp3 dec hl ex de,hl ;Endadresse in pop hl ;Anfangsadresse zurueck kdp4: inc de ld b,5 call L8424 ; mal Space ld b,10h dp2: ld a,3 and b call z,space ld a,b neg add a,10h call praan ;Kopfleiste 0-0F call space djnz dp2 call newl ld b,70 dp3: ld c,"-" ;unterstreichen call ccout djnz dp3 call newl dweit: ld a,l and 0fh ;Anzeigebeginn auf Adresse Null ld c,a ;Leerpositionen merken inc c ld a,l and 0f0h ;Anfangsadresse nullen ld l,a push hl call prhlan ;Anzeige Adresse ld b,10h ;Anzahl Anzeigepositionen push bc dp4: dec c jr z,dp5 call space ;Anfangspositionen mit Space auffuellen call space LD A,3 AND B CALL Z,space CALL space inc hl djnz dp4 dp5: LD A,3 AND B ;Blockung in 4-er Gruppen CALL Z,space CALL space LD A,(HL) ;Byte aus Anzeigebereich INC HL CALL praan call LA9D0 ;Tastaturstatus abfragen call L842E ;Test - jr z,dp6 jr nc,dp6 ;=, Endadresse erreicht djnz dp5 dp6: call space pop bc ;Anzahl Leer- und Gesamtpositionen pop hl ;Startadresse dp8: dec c jr z,dp7 call space ;Leerpositionen bei ASCII auffuellen dec b inc hl jr dp8 dp7: LD A,(HL) ;ASCII-Darstellung ld c,a call L9279 ;Test darstellbares Zeichen call c,L9276 ;nein, Darstellung als Punkt call ccout call LA9D0 ;Tastaturstatus abfragen inc hl call L842E ;Test - jr z,dp1 ;=, Endadresse erreicht djnz dp7 call newl jp dweit ;weiter anzeigen dp1: call newl ;Zeile voll ld (lmix),hl ;ENDadresse als letzte Dump-Adresse eintragen jp L91DE ; ;Kdo "N": Einstellen des Senders und des Empfaengers L8B52: jp LAA06 ;Kdo "U": Datei auf Kassette schreiben in KC85-Format L8BB2: call parstc cp 3 jp nz,LAA06 jp mbout ;File auf Magnetband ausgeben mbout equ LAA06 ;Kdo "V": Datei von Kassette im KC58-Format lesen L8BBE: call parstc cp 3 jp nz,LAA06 jp mbin ;File von Magnetband einlesen mbin equ LAA06 ;Z L8BF9: jp LAA06 ;Kdo "B": Retten einer Datei von Aadr. bis Eadr back: call fcbfil ;Dateiname in FCB(5ch) eintragen call L94E3 ;Datei eroeffnen cp 0ffh jp nz,LAA06 ;Fehler, schon vorhanden call parstc ;Eingabeparameter in Stackbereich call L850F ;Parameter aus Stack in Bereich ld a,(B8132) ;Anzahl der Parameter cp 2 ;2 Parameter erforderlich ld de,5ch ld c,22 ;BDOS-Fkt.: Datei eroeffnen call L8000 cp 0ffh jp z,LAA06 ;Fehler Directory voll ld hl,(W8133) ;1.Parameter ba1: ld bc,80h push bc pop de ldir push hl ld de,5Ch ;Standard-FCB ld c,21 ;BDOS-Fkt.: naechsten Satz schreiben call L8000 pop hl or a ;=0:erfolgreiche Operation jr nz,dcl ;Dateiende ld de,(W8135) ;ENDadresse call L842E ;Test - jr c,ba1 ;weiter auslagern dcl: ld de,5ch ld c,16 ;BDOS-Fkt.: Datei schliessen call L8000 call L8955 ;Ende Datei, NMI eintragen jp newl ;Wandlung klein-->gross u Auswertewecken convgk: cp 'a' ret c cp 7eh ret nc and 0dfh ret mran1: call convgk jp L8664 mran2: call L8350 jr convgk mran3: call getch push af call convgk ld b,a pop af ld a,b ret mran4: push af push bc push de push hl xor a ld (B8132),a jp assein mran5: ld a,(kdopuf) cp "a" ;ASSA hat eigene Fehlerbehandlung jp z,fmne1 ret mran6: push de push af call L879E ; init pop af mra61: ld (de),a inc de call getch jr z,mra62 ;Ende cp ')' jr nz,mra61 call A021F jr z,mra61 mra62: ld de,conpu push af call L860D jp z,fmne1 ;Fehler bei Konvertierung pop af pop de ret htout: push bc ld b,5 ld c,9 htout1: call ccout djnz htout1 pop bc ret end: .dephase end