.po10 VEB Mikroelektronik M}hlhausen, den 10.6.87 "Wilhelm Pieck" M}hlhausen F A B A S ********* Daó  Programí FABAÓ beinhalteô einå freé definierbarå  Festpunkt- Arithmetik¬ diå iî BASIC-Programmeî nutzbaò ist. Daó Zahlenformaô isô gegebeî durcè diå Anzahì der ª g}ltigeî Stelleî (gradzahlig© und ª Nachkommastelleî (gradzahlig). Eó  bestehô  auó  eineò  Kombinatioî  voî  Maschinen- unä  BASIC- Routinen¬  diå einmaì gemeinsaí eingegeben¬ bzw® voí Banä geladeî unä  danacè durcè weiterå selbsô zõ schreibendå  BASIC- Programmå erg{nzô werden. Daó  Programí  enth{lô BASIC-Zeileî zuò Einf}hrunç unä  Einarbei tung® Siå werdeî iî deò Regeì beé deò Programmentwicklunç bzw® aí Endå  deò  Arbeiô f}ò daó fertigå Programí zõ  l|scheî  seiî  (aâ Zeilå  240)®  F}ò  deî Anwendeò steheî jå nacè  gew{hlteî  Formaô mehrerå  Registeò zuò Verf}gung®  Diå Registeò ° bió ² werdeî f}ò diå  Arithmetië genutzt¬  diå Registeò aâ ³ sinä freé  verf}gbar® Siå  sinä  bió  zuí Speicherplatú 140È  nutzbar®  Dar}beò  hinauó k|nneî  Registeò  iî freé w{hlbareî  Speicherbereicheî  definierô werden® Es existieren Unterprogramme f}r folgende Funktionen: a) Eingabe von Zahlen b) Anzeige von Zahlen c) Register}bergabe: Inhalt von N nach M e© Arithmetikº  +¬  -¬ *¬ /¬ ¥ (REG± Operatoò REG2¬ Ergebnió nacè REG0) f) Rundungsroutine g) Hilfsroutine f}r Programmierarbeiten Diå Funktioneî á bió ã werdeî }beò GOSUB¬  diå Funktioneî ä bió ç werdeî }beò CALLª aufgerufen. Achtung! Dá diå Maschinenprogrammå iî eineò extreí langeî Zeilå ° unterge brachô sind¬  daræ dieså Zeilå nichô editierô werden® Dieså Zeilå daræ nuò w{hrenä deò Programmablaufó Datenwertå Null enthalten. F}ò  allå Programmierungsarbeiten¬  u.a®  beií  Zeileî  eingeben¬ l|schen¬  editiereî usw®  m}sseî diå Null-Wertå beseitigô werden® Deshalâ existiereî diå zweé Hilfsroutinen. Dieseó  Programí isô nuò miô deí Moduì M00¶ BASIà auæ deí  KC85/² bzw® auæ deí Kà 85/³ verwendbar® Definition der Register ----------------------- F}ò  Registeò steheî diå Speicherpl{tzå ° bió 140È zuò Verf}gung® Jedå  Zahì haô ù g}ltigå Stelleî unä davoî ø Stelleî  hinteò  deí Komma®  Beidå  Zahleî m}sseî geradzahliç sein®  Danî gilô f}ò diå Wertå deò Variablen: SB = y/2 (Stellenbyte) NK = x/2 (Nachkommmabyte) .pa ŠDiå  jeweiligå Registerl{ngå betr{gô abeò (SB+1)Byte®  Daó  erstå Byte jedes Registers ist n{mlich das zus{tzliche Vorzeichenbyte. Es bedeuten hier: 0 - 254 : + 255 : - Die Bezeichnung und der Aufruf der Register erfolgt mit: N = 0 bis Z wobei gilt: 320 Z <_ ---- - 1 SB+1 Dieså  Grenzå muþ voí Programmiereò durcè daó Programí  }berwachô werdeî  bzw®  voí Anwendeò }berpr}fô werden®  Andernfalló bestehô die Gefahr, da~ der Stack des Betriebssystems zerst|rt wird. Diå Speicherpl{tzå 422È bió 428È innerhalâ deó Programmó sinä zuò Variablen}bergabå bestimmt® Eó gilt: Dezimal HEX Bedeutung 1058/1059 422/423 Adresse N 1060/1061 424/425 Adresse M 1062 426 Stellenbyte SB 1063 427 Nachkommabyte NK 1064 428 Reservebyte RS Diå   Anfangsadresseî  eineó  jedeî  Registeró  wirä  gem{þ   deò definierteî Funktioî FNR(N) = N * (SB + 1) berechnet. F}r das Ende gilt: FNE(N) = (N + 1) * (SB + 1) - 1 (BASIC- Zeile 230) Miô   dieseî   beideî   Funktioneî  k|nneî  }beò   Π  iî   jedeí Speicherbereicè  Registeò  definierô unä  genutzô  werden¬  dabeé gilt: N * (SB + 1) <_ Adresse <_ (N + 1) + (SB+1) Zõ  Beginî  stehô  daó Vorzeichen¬  aí Endå  diå  niederwertigstå Ziffer. .pa ŠUnterprogramme in Maschinencode ------------------------------- CALL * 40A Rundungsma~routine f}r eine Zahl. Eó  erfolgô  Erh|hunç  deò  Zahl¬   alsï  meisô Nachkommazahl; vorher Register N festlegen. DOKE 1056, FNR (N) CALL * 429 wandelt Maschinencode in arbeitsf{hige Version FF ---> 0 Es sind dann nicht m|glich: * Zeilen l|schen * Editieren * Eingeben * Speichern usw. CALL ª 43´   wandelô  Maschinencodå   iî   speicherbare¬ editierbare (incl. RENUMBER)- Form 0 ---> FF CALÌ ª 45³ kopierô deî Inhalô voî Registeò Î nacè Registeò Í; vorher: DOKE 1056, FNR (N) DOKE 1058, FNR (M) CALL * 469 Addition (REG0) = (REG1) + (REG2) CALL * 4D1 Subtraktion (REG0) = (REG1) - (REG2) CALL * 537 Multiplikation (REG0) = (REG1) * (REG2) CALL * 5D2 Division (REG0) = (REG1) / (REG2) CALL * 5D5 Prozent (REG0) = (REG1) / (REG2) * 100 Beé alleî Arithmetikroutineî erfolgô einå exaktå Rundung®  Ergibô sicè beé deò Berechnunç eiî ]berlauf¬  sï kanî einå Fehleranzeigå mittels BASIC-Zeile 210 erfolgen. Beim Fehler ist (RS)=|0. Beé  Fehleranzeigå  isô  nacè Bet{tigunç  irgendeineò  Tastå  deò g}ltige¬ niederzahligå Zahlenteiì miô richtigeí Vorzeicheî ií REÇ ° abgelegt. .pa ŠEin- und Ausgaberoutinen ------------------------ Diå Ein- unä diå Ausgaberoutineî wurdeî iî BASIà geschrieben® Siå ben|tigeî daheò etwaó mehò Zeit® Dieså Zeiô isô voî deò gew{hlteî Stellenzahì abh{ngig® (Jå gr|~eò diå Stellenzahì destï l{ngeò isô diå  Zeiô  f}ò diå Ein- unä Ausgabe)®  Diå Ausgabå  alleò  Zahleî erfolgô generelì rechtsb}ndiç ohnå f}hrendå Nullen¬  abeò miô deí Vorzeichen (nur negative) ganz links. Diå  Eingabå  akzeptierô  vielf{ltigå  Formate¬   allerdingó  miô folgenden Voraussetzungen: a) - oder + zu Beginn der Zahl (+ kann entfallen) b© Zahì daræ nuò eineî Dezimalpunkô enthalteî (sonsô  fehlerhaftå Eingabå ohnå Fehleranzeige¬ deò erstå Punkô wird gew{hlt). c© Kommá  isô iî deò Zahì nichô zul{ssig®  (Eó  erfolgô  Zur}ck weisunç deò Zahì unä Neueingabå wirä gefordert.) d© Zahì daræ nichô mehò Stelleî voò deí Dezimalpunkô  enthalten¬ aló daó Maximalformaô erlaubô (keinå Fehleranzeige¬  ]bernahmå deò m|glicheî niederwertigeî Stellen.) e© Diå Nachkommazahì kanî beliebiç lanç odeò kurú seiî (Erg{nzunç durcè   zus{tzlichå  Nullen¬   bzw®   exaktå  Rundunç  erfolgô automatisch). f) Bei ganzen Zahlen kann der Dezimalpunkt entfallen. g) F}hrende Nullen vor dem Dezimalpunkt k|nnen entfallen. Eó  seieî 1° g}ltigå Stelleî unä ²  Nachkommastelleî  festgelegt¬ dann sind g}ltige Angaben: 12 1234.5 1234.567 intern auf 1234.57 gerundet -12 -12.3 -.33 .45 Fehlerhafte Eingaben mit Zur}ckweisung infolge Komma sind: 123,3 1153,7 usw. Fehlerhafte Eingaben ohne Zur}ckweisung sind: 1.234.56 zwei Punkte --> intern: 1.23 1A3A.57 enth{lt A --> intern: 1030.57 Alle nicht g}ltigen Zeichen werden als 0 interpretiert! Zu lange Zahlen verlieren die vorderen Stellen. 1234567890.33 --> intern 34567890.33 Eingabe des Programms --------------------- Daó  Maschinenprogramí  liegô aló Hex-Dumð unä daó  Basicprogramí aló  Listinç dieseò Beschreibunç bei®  Uí  daó  Maschinenprogramí einzugeben¬  isô eó notwendig¬  deî BASIC-Interpreteò zõ starten® Dadurcè  wirä  ersô  einmaì einå  Grundinitialisierunç  erreicht® Anschlie~enä  isô  deò BASIC-Interpreteò miô  BYÅ  zõ  verlassen® Jetzô  kanî  miô deò Systemanweisunç MODIFÙ odeò  DISPLAÙ  (siehå Systembeschreibung©  deò  Maschinencodå voî deò Adresså 400È  bió zuò Adresså 700È eingegebeî werden® Solltå einå Unterbrechunç deò ŠEingabå notwendiç sein¬  kanî deò bisheò eingegebenå Texô miô deò Systemanweisunç  SAVÅ  (siehå  Systembeschreibung©  geretteô  unä sp{teò miô LOAÄ wiedeò eingeladeî werden® Isô diå Eingabå beendet¬ m}sseî nocè diå Speicherzelleî 03D7È unä 03D8È ge{nderô werden: %MODIFY 03D7 03D7 02 03D8 07 03D9 . Jetzô  muþ  miô REBASIà deò BASIC-Interpreteò  wiedeò  aufgerufeî werden®  Bevoò nuî daó Basicprogramí eingegebeî werdeî kann¬  isô diå Anweisunç CALL*43´ einzugeben¬  dá sicè ií  Maschinenprogramí Nulleî  befinden®  Daó Basicprogramí starteô beé RUÎ iî deò Zeilå 230¬  dá  iî deò Zeilå ° (Maschinenprogrammzeile© aí  Anfanç  diå Anweisung GOTO 230 untergebracht ist. Solì  daó  Programí auæ Kassettå gespeicherô werden¬  isô  vorheò wiedeò  CALL*43´  aufzurufen®   Nuî  kanî  miô  CSAVE"FABAS¢  daó Programm gerettet werden. Wahl der Variablen ------------------ globale Variablen sind: N Registernummer SB Stellenbyte NK Nachkommabyte RS Reservebyte lokale Variablen sind: Eingabe: A$ enth{lt Zahl als ASCII-Kette A,B,C,D,I,L,X,Y,S$ Ausgabe: A,B,I,L,X,Y Beschreibung des Hilfsprogramms: -------------------------------- Miô deí Hilfsprogramí kanî wiå miô eineí Taschenrechneò gerechneô werden®   Eó   isô  bzgl®   Geschwindigkeiô  nichô  volì  optimaì gestaltet. Es erlaubt folgende Eingaben bei Anzeige: 1. Zahl = T Transport von Register N nach Register M E Eingabe einer Zahl in Register N A Anzeige der Zahl im Register N F Funktionswahl f}r Operation zwischen REG1 und Reg2 --> Ergebnis in REG0 Alle Zahleneingaben gehen in Register 1. Bei Anzeige: 2. Zahl = kanî  nuò  einå Zahì ií Registeò ²  eingegebeî  werden®  Beé  deò Anzeige "Funktion" sind +, -, *, /, und % m|glich. Mit diesen Befehlen sind vielf{ltige Rechnungen m|glich. Das Programm FABAS und die Beschreibung dazu wurden von Prof. Dr. H. V|lz erarbeitet. .pa ŠBASIC-Listing: ------------- 1 !----------------------------* 2 ! *** FABAS *** * 3 ! Festkomma-Arithmetik BASIC * 4 ! Prof. Dr. H. V|lz * 5 !----------------------------* 6 !ANZEIGEROUTINE 7 !============== 10 L=FNR(N):X=SB-NK+1:IFPEEK(L)=255THENPRINT"-";:ELSEPRINT" "; 20 Y=0:FORI=1TOSB:A=PEEK(L+I):IFI=XTHENPRINT".";:Y=1 30 B=(AAND240)/16:A=AAND15 40 IFY+A+B=0THENPRINT" ";:NEXT:RETURN 50 IFY+B=0THENPRINT" ";RIGHT$(STR$(A),1);:Y=1:NEXT:RETURN 60 Y=1:PRINTRIGHT$(STR$(B),1);RIGHT$(STR$(A),1);:NEXT:RETURN 65 !EINGABEROUTINE 66 !============== 70 L=LEN(A$):S$=LEFT$(A$,1):C=0:D=0:IFS$="-"THEND=255 80 IFS$="-"ORS$="+"THENL=L-1:A$=RIGHT$(A$,L) 90 A$="00"+A$:L=L+2:X=L+1 100 FORI=1TOL:IFMID$(A$,I,1)="."THENX=I:I=L 110 NEXT:Y=NK+NK-L+X 120 IFY<>0THENL=L+Y 130 IFY>0THENFORX=1TOY:A$=A$+"0":NEXT 140 IFY<0THENC=VAL(MID$(A$,L+1,1)):A$=LEFT$(A$,L) 150 Y=FNR(N)+SB: 160 FORX=L-1TOL-SB-SB-2STEP-2:A=0:IFX=L-NK-NK-1THENX=X-1 170 IFX>0THENA=VAL(MID$(A$,X,2)) 180 B=INT(A/10):A=16*B+A-10*B:POKEY,A:Y=Y-1 190 NEXT:IFC=>5THENDOKE1058,FNR(N)+SB:CALL*40A 200 POKEFNR(N),D:RETURN 205 !]BERLAUFANZEIGE 206 !=============== 210 IFPEEK(1064)THENPRINT"Ueberlauf":INPUTX 220 RETURN 225 !PROGRAMMSTART 226 !============= 230 CALL*429:CLS:DEFFNR(N)=N*(SB+1):DEFFNE(N)=(N+1)*(SB+1)-1 235 !AB HIER ARBEITSVERSION 236 !====================== 240 INPUT"Stellenzahl = ";SB:SB=INT(SB/2+.5):POKE1062,SB 250 INPUT"Nachkommazahl = ";NK:NK=INT(NK/2+.5):POKE1063,NK 260 PRINT:INPUT"1.Zahl = ";A$:IFA$="T"GOTO380 270 IFA$="E"GOTO390 280 IFA$="A"GOTO400 290 IFA$="F"GOTO310 300 N=1:GOSUB70:INPUT"2.Zahl = ";A$:N=2:GOSUB70 310 INPUT"Funktion";A$:IFA$="+"THENCALL*469:GOTO370 320 IFA$="-"THENCALL*4D1:GOTO370 330 IFA$="*"THENCALL*537:GOTO370 340 IFA$="/"THENCALL*5D2:GOTO370 350 IFA$="%"THENCALL*5D5:GOTO370 360 PRINT"Falsche Eingabe":GOTO260 370 GOSUB210:N=0:GOSUB10:GOTO260 380 INPUT"REG. N->M";N,M:DOKE1058,FNR(N):DOKE1060,FNR(M) :CALL*453:GOTO260 390 INPUT"REG";N:INPUT"Zahl = ";A$:GOSUB70:GOTO260 400 INPUT"REG";N:GOSUB10:GOTO260