USR(47)

Antworten
Werner
User
Beiträge: 33
Registriert: 14.09.2014, 21:29

USR(47)

Beitrag von Werner » 26.08.2019, 20:09

Hallo,
im SYNC Magazine May/June 1981 wird auf Seite 6 ein Verfahren beschrieben, mit dem 4K ROM die Länge von Character Strings zu bestimmen, also die in diesem ROM nicht vorhandene Funktion "LEN" nachzubilden. Hierbei wird eine Maschinenroutine unter der Adresse 47 aufgerufen, die die Adresse des Variablenspeicherendes zurückgibt. Mit Let A=USR(47)-2 habe ich dann die Adresse des letzten Zeichens im String. Funktioniert sehr gut, ist für mich aber rätselhaft.

Gehe ich im ROM-Listing zur Adresse 47 so lande ich mitten in einem JP NN -Befehl der SCAN-CALC-Subroutine.

Ich würde mich freuen, wenn mir jemand hier im Forum die Hintergründe erläutern könnte. Eine Erklärung soll im 1981-Februarheft der Zeitschrift "Personal Computer World" zu finden sein. Leider finde ich online keine Copy.

Gruss
Werner

Benutzeravatar
tokabln
User
Beiträge: 1634
Registriert: 10.11.2013, 00:24
Wohnort: D, Berlin (Mariendorf)

Re: USR(47)

Beitrag von tokabln » 27.08.2019, 17:05

Ich habe zwar keine direkte Antwort, aber nachfolgender Link könnte eventuell helfen an den gesuchten Artikel zu kommen. Dazu müsstest Du das Computer Museum anschreiben und die angegebene ID "CH3195" mit Bezug auf den Artikel einfach mal anfragen.

http://www.computinghistory.org.uk/det/ ... uary-1981/
Lieben Gruß Torsten
BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, T41, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e

Benutzeravatar
ZX-Heinz
User
Beiträge: 1794
Registriert: 05.12.2011, 14:45

Re: USR(47)

Beitrag von ZX-Heinz » 27.08.2019, 20:03

Werner hat geschrieben:
26.08.2019, 20:09
Gehe ich im ROM-Listing zur Adresse 47 so lande ich mitten in einem JP NN -Befehl der SCAN-CALC-Subroutine.
Das sieht wirklich komisch aus. Mit dem Disassembly EINES 4k ROMs aus dhuckes 8BitWiki landet man mitten in einem JP-Befehl der ScanCalc-Rout. Vielleicht entspricht dieses Disassembly nicht dem originalen ZX80-ROM? Hast Du das mal an der kritischen Stelle überprüft?

Benutzeravatar
tokabln
User
Beiträge: 1634
Registriert: 10.11.2013, 00:24
Wohnort: D, Berlin (Mariendorf)

Re: USR(47)

Beitrag von tokabln » 27.08.2019, 20:12

Hier mal ein kommentiertes Disassembly, welches wohl dem Original ROM entspricht.

https://k1.spdns.de/Vintage/Sinclair/80 ... source.htm
Lieben Gruß Torsten
BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, T41, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e

Benutzeravatar
ZX-Heinz
User
Beiträge: 1794
Registriert: 05.12.2011, 14:45

Re: USR(47)

Beitrag von ZX-Heinz » 27.08.2019, 22:24

Versuch einer Antwort:
47 = #2F: Dort steht ein #09 = ADD HL,BC.
Gefolgt von :
L0030: CALL L094F ; routine TEST-ROOM
RET NC ; return if not enough room.

PUSH BC ; save number of bytes required.
JP L0CF3 ; jump forward to RESERVE

;; RESERVE
L0CF3: LD HL,($400A) ; fetch start of WKG Space from E_LINE
PUSH HL ; preserve location.

LD HL,($400C) ; fetch location after WKG Space from D_FILE
DEC HL ; point to last byte of WKG space.

CALL L05D5 ; routine MAKE-ROOM creates the space after
; last byte sliding D-FILE up and updating
; D_FILE, DF_EA and DF_END

INC HL ; increase address
INC HL ; by two bytes

POP BC ; retrieve E_LINE which may have been updated
; by pointers
LD ($400A),BC ; restore E_LINE
POP BC ; restore the number of bytes required.

EX DE,HL ; switch - DE points to first
INC HL ; make HL point to last new byte
SCF ; signal success
RET ; return


Wenn wir am Ende anfangen, sehen wir, dass in BC die Information zur Anzahl der Bytes steht. Dieser Wert wird bei PRINT USR() zurück gegeben. Nun betrachten wir die Anzahl der PUSH und POP. Jeweils zwei, passt. Nun zur ersten Zeile: ADD HL,BC. CALL #094F in der zweiten Zeile beginnt mit LD HL,($4010), der Inhalt von Zeile 1 wird also hier bereits vergessen. Er schadet aber auch nicht.
Probiere doch einmal PRINT USR(#30 = 48) - 2, eigentlich sollte das auch funktionieren.

Werner
User
Beiträge: 33
Registriert: 14.09.2014, 21:29

Re: USR(47)

Beitrag von Werner » 27.08.2019, 23:55

Danke euch. "LET A=USR(48)-2" bringt tatsächlich das gleiche Ergebnis, Heinz. Dies ist allerdings noch nicht die Anzahl der Zeichen im String, sondern die Adresse des letzten Characters.
Ich habe auch das von Torsten angegebene Computermuseum angeschrieben. Vielleicht bringt der Artikel noch einige zusätzliche Infos.
Gruss
Werner

Antworten