Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Patchtabelle für CP/M Turbo Pascal 3.02A » Themenansicht

Autor Thread - Seiten: -1-
000
17.03.2022, 20:56 Uhr
Frieder



Hallo in die Runde,

ich suche für CP/M Turbo Pascal 3.02A eine Patchtabelle, mit deren Hilfe ich mit dem HEX-Editor Änderungen am Programm vornehmen kann. TINST.COM hilft mir hier nicht weiter, es geht um die korrekte Prozessierung von Inline-Assemblercode. Ich habe so eine Tabelle schon mal gesehen, finde sie aber nicht wieder. Für Wordstar gibt es so etwas, z.B. WS30PAT.DOC

Hat jemand eine Idee?

Danke und viele Grüße, Frieder
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
17.03.2022, 22:09 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Was genau suchst Du? Die Terminal-Steuercodes?
Die gibt es z.B. hier: https://hc-ddr.hucki.net/wiki/doku.php/cpm/turbo_pascal/tinst
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
17.03.2022, 23:31 Uhr
jde

Avatar von jde

Ich hatte für zum Einbinden von Assembler Unterprogrammen ein in Pascal geschriebenes Programm inlass. Keine Ahnung wer der Autor war. In meiner noch vorhandenen Turbo Pascal Quelle steht nur 1986 U.K..
Damit war ich sehr zufrieden. Das Programm hat aus einfachen Assembler Quelltexten Turbo Pascal Inline Code erzeugt.
Ausschnitt aus inlass.pas (hat noch weitere Include Dateien):

Quellcode:

PROGRAM INLASS_80; {INLINE-Assembler fuer Turbo-Pascal }

{$V-}

CONST
  KommentarAnfang   = ';';
  ArgumentTrennung  = ',';
  LabelEnde         = ':';

TYPE
  Zeile             = STRING[80];
  string14          = STRING[14];
  LabelString       = STRING[8];

VAR
  Source,
  Objekt,
  PRNFile           : text;
  PC                : integer;
  FileName          : string14;
  FehlerZahl        : integer;
  First,
  KommentarFlag     : boolean;
  SOU_Device,
  PRN_Device,
  OBJ_Device        : STRING[2];
  Ext               : STRING[3];
  PunktPos          : byte;
  Antwort           : char;
  KommStr           : STRING[1];

{ $I PARAMSTR.BIB}  (*Kann ab Turbo-Pascal 3.0 weggelassen werden*)
{$I INLASCLN.INC}
{$I INLAERR.INC}
{$I INLABAUM.INC}
{$I INLABRCH.INC}
{$I INLA-Z80.INC}
{$I INLAINL.INC}
{$I INLADOPS.INC}

BEGIN
  ClrScr; writeln('INLINE-Assembler fuer Turbo-Pascal':55);
  writeln(        '----------------------------------':55);
  writeln;writeln('Version Jan. 1986 U.K.':49); writeln;
  FehlerZahl :=0; KommentarFlag := true;
  SOU_Device :=''; OBJ_Device := ''; PRN_Device := '';
  IF ParamCount=0 THEN BEGIN
    write('source file> '); readln(FileName);
    write('Source als Kommentar (J/N)? ');
    REPEAT
      read(kbd,Antwort); Antwort := upcase(Antwort)
    UNTIL Antwort IN ['J','N']; writeln(Antwort);
    KommentarFlag := Antwort='J' END
  ELSE BEGIN
    FileName := ParamStr(1);
    IF ParamCount>1 THEN BEGIN
      KommStr := ParamStr(2);
      KommentarFlag := NOT (KommStr[1] IN ['N','n'])
    END
  END;

  PunktPos := pos('.',FileName);
  IF PunktPos>0 THEN BEGIN
    Ext := copy(FileName,PunktPos+1,length(FileName)-PunktPos);
    IF Ext<>'' THEN
      WHILE length(Ext)<3 DO
        Ext := Ext+Ext[1];
    delete(FileName,PunktPos,length(FileName)-PunktPos+1) END
  ELSE
    Ext := '';

  IF Ext<>'' THEN BEGIN
    SOU_Device := Ext[1]+':';
    OBJ_Device := Ext[2]+':';
    PRN_Device := Ext[3]+':'
  END;

  assign(Source, SOU_Device+FileName+'.SOU');
  assign(Objekt, OBJ_Device+FileName+'.INL'); rewrite(Objekt);
  assign(PRNFile,PRN_Device+FileName+'.PRN'); rewrite(PRNFile);
  VarListe := NIL;
  writeln(SOU_Device+FileName+'.SOU');
  writeln('-> ',OBJ_Device+FileName+'.INL');
  writeln('-> ',PRN_Device+FileName+'.PRN');
  writeln(PRNFile,'PASS 1'); DoPass(1);
  writeln(PRNFile,'PASS 2'); DoPass(2);
  writeln(PRNFile);
  VariablenListe(VarListe);
  close(PRNFile); close(Objekt);
  writeln(FehlerZahl,' Fehler.')
END.



Hat z.B. aus folgendem Assembler Quellcode:

Quellcode:

;
; GDC Routinen fuer CAD in TURBO Pascal
;
; (C) 1987 by JDE, Jonny Jonas Erfurt
;
; created: 28-Jul-87  last update: 4-Aug-87
;
    .z80
takt    equ    16        ; Schiebetaktfrequenz
;
; Konstanten aus der Terminalberechnung
;
pitch    equ    64        ; Adressabstand zwischen zwei Pixelzeilen
Aw    equ    40        ; Aktive Worte je Zeile
HS    equ    1        ; Breite Hori. Syn.
    if    takt eq 16
HFP    equ    10        ; Breite hori. vordere Schwarzschulter
HBP    equ    11        ; Breite hori. hintere Schwarzschulter
    else
HFP    equ    7        ; Breite hori. vordere Schwarzschulter
HBP    equ    8        ; Breite hori. hintere Schwarzschulter
    endif
AL    equ    200        ; Aktive Zeilen (je Bild)
VS    equ    1        ; Breite des Vertikalsynchronimpulses
VFP    equ    56         ; Breite vert. vordere Schwarzschulter
VBP    equ    56        ; Breite vert. hintere Schwarzschulter
;
LPCR    equ    0        ; Zeilen je Zeichenzeile
BR    equ    3        ; Blinkrate
CTop    equ    0        ; Kursoroberzeile
CBot    equ    0        ; Kursorunterzeile
;
sc    equ    Nob        ; nob/bli blinkender Kursor n/j
dic    equ    Noc        ; noc/cur Kursor dargestellt n/j
;
vsyntyp    equ    mas        ; Master
worktyp equ    gra+nof+ref+noi ; siehe oben
;
; I/O-Adressen
;
Status    equ     4ch         ; Status lesen / Parameter schreiben
Data    equ     4dh         ; Daten Lesen / Kommando Schreiben
Zoom    equ     48h         ; Konstante fuer Hardwarezoom schreiben
;
; GDC-Kommandos
;
wdat     equ    00100000b    ;20h Schreibtyp setzen/ Daten Schreiben
curs     equ    01001001b    ;49h Kursor setzen
mask     equ    01001010b    ;4ah Schreibmaske setzen
figs     equ    01001100b    ;4ch Parameter fuer Figurenzeichnen setzen
figd    equ    01101100b    ;6ch Start fuer Figurenzeichnen
pram    equ    01110000b    ;70h Setzen von Bytes im Parameterram
zoomc    equ    01000110b    ;46h Zetzen der Zoomfaktoren
sync     equ    00001111b    ;0fh Einstellen der Betriebsparameter
pitchc     equ    01000111b    ;47h Einstellen des Zeilenadressabstandes
blank    equ    00001100b    ;0ch Bildschirm Dunkeltasten
unblank    equ    00001101b    ;0dh Bildschirm einschalten
start    equ    01101011b    ;6bh Starten der Darstellung
cchar    equ    01001011b    ;4bh Setzen der Parameter fuer Charactermode
gchrd     equ    01101000b    ;68h Starten der Zeichnens von Character
reset     equ    00000000b    ;00h Resetcode/ Betriebsparameter setzen
vsync    equ    01101110b    ;6eh Vertikalsynchron-Mode setzen
;
; Schreibbetriebsarten
;
trep    equ    0        ; Replace mit dem Muster
txor    equ    1        ; Xor mit dem Muster
tres    equ    2        ; Setze Musterpunkte zurueck
tset    equ    3        ; Setze Muster
;
; Betriebsarten fuer den GDC
;
mix     equ    0         ; Mixed-Mode
gra    equ    2         ; Grafic-Mode
cha    equ    20h         ; Character-Mode
;
noi    equ    0         ; ohne Zeilensprung
inr    equ    8         ; mit Zeilensprung beide Bilder identisch
int    equ    9         ; mit Zeilensprung doppelte Anzahl Zeilen
;
nor    equ    0         ; kein Refresh fuer dynamische Speicher
ref    equ    4         ; Refresh fuer dynamische Speicher
;
fla    equ    0         ; Schreiben in Bildbereich und Austastluecke
nof    equ    10h         ; Schreiben nur in der Austastluecke
;
; Verikalsynchronbetriebsart
;
Mas    equ    1         ; Master GDC liefert Vsyn
Slave    equ    0         ; Slave  GDC empfaengt Vsyn ( fuer mehrere GDC's)
;
; Kursorbetriebsarten
;
NoC    equ    0         ; ohne Kursor
Cur    equ    1         ; mit
;
Bli    equ    0         ; Blinkender Kursor
NoB    equ    1         ; fester Kursor
;
wlines    equ    16        ; Zeilen Textwindow
mulhlde    equ    6f5h        ; integer multiplikation
divdehl    equ    70fh        ; integer division
;
; Sprungtabelle fuer TURBO
;
comman:    jp    cmd        ; Procedure Command(P:Byte);
param:    jp    par        ; Procedure Parameter(P:Byte);
setxy:    jp    setxy1        ; Procedure SetXY(X,Y:Integer);
setber:    jp    setbe1        ; Procedure SetBer(Len,XAnf,YAnf,Nr:Integer);
setzoom:jp    setzo1        ; Procedure SetZoom(DZ,WZ:Byte);
setmask:jp    setma1        ; Procedure SetMask(Mask:Integer);
setpat:    jp    setpa1        ; Procedure SetPattern(Patttern:Integer);
clrscr:    jp    clrsc1        ; Procedure ClearScreen;
exit:    jp    exitgr        ; Procedure Exitgraf;
paraw:    jp    paraw1        ; Procedure ParameterWord(P:Integer);
austast:jp    austa        ; Procedure AustastLuecke;
;
; Procedure Command(P:Byte);
;
cmd:    pop    hl
    ex    (sp),hl
cmd1:    in    a,(status)
    and    2
    jr    nz,cmd1        ; fifo full
    ld    a,l
    out    (data),a
    ret
;
; Procedure Parameter(P:Byte);
;
par:    pop    hl
    ex    (sp),hl
par1:    in    a,(status)
    and    2
    jr    nz,par1        ; fifo full
    ld    a,l
    out    (status),a
    ret
;
;
; Procedure ParameterWord(P:Integer);
;
paraw1:    pop    hl        ; Parameter High und Low Byte ausgeben
    ex    (sp),hl
paraw2:    call    par1
    ld    l,h
    jr    par1
;
div16:    ld    b,4
shftr:    srl    h
    rr    l
    djnz    shftr
    ret
;
; Procedure SetXY(X,Y:Integer);
;
setxy1:    ld    l,curs
    call    cmd1
    pop    iy        ; ret addr.
    pop    de        ; Y
    ld    hl,(maxy##)
    or    a
    sbc    hl,de
    ld    de,(wordpl##)
    call    mulhlde
    ex    de,hl        ; Ergebnis nach DE
    pop    hl        ; X
    ld    c,l        ; save low x
    call    div16
    add    hl,de
    call    par1
    ld    l,h
    call    par1
    ld    l,c
    sla    l
    sla    l
    sla    l
    sla    l
    call    par1
    jp    (iy)
;
; Procedure SetBer(len,xanf,yanf,nr:Integer);
;
setbe1:    pop    iy        ; ret addr.
setbe2:    pop    hl        ; nr des Bereiches
    sla    l
    sla    l
    ld    a,pram
    add    a,l
    ld    l,a
    call    cmd1        ; Bereich 0 oder 1 setzen
    pop    de        ; YAnf
    ld    hl,(wordpl##)
    call    mulhlde
    ex    de,hl        ; Ergebnis nach DE
    pop    hl        ; XAnf
    ld    b,4        ; div 16
    call    shftr
    add    hl,de
    call    par1
    ld    l,h
    call    par1
    pop    de
    ld    l,e
    sla    l
    sla    l
    sla    l
    sla    l
    call    par1
    ex    de,hl
    call    div16
    ld    a,l
    and    3fh
    ld    l,a
    call    par1
    jp    (iy)
;
; Procedure SetZoom(DZ,WZ:Byte);
;
setzo1:    pop    iy        ; Return Adresse
    pop    de        ; WriteZoom in DE
    pop    hl        ; DarstellZoom in HL
    ld    d,l        ; DZ in D, WZ in E
    push    de
    ld    a,l
    or    10h
    out    (zoom),a    ; HardwareZoom
    ld    h,0
    inc    l
    ld    de,(GXMax##)
    push    hl
    call    divdehl
    ld    (DarX##),hl
    pop    hl
    ld    de,(GYMax##)
    call    divdehl
    ld    (DarY##),hl
    ld    l,zoomc
    call    cmd1
    pop    de        ; DZ in D, WZ in E
    ld    a,d        ; DZ nach A
    sla    a
    sla    a
    sla    a
    sla    a
    add    a,e        ; + WZ
    ld    l,a
    call    par1
    ld    hl,1        ; keine statuszeile
    ld    a,d
    cp    2
    jr    nc,setzo2
    ld    l,wlines    ; groesse statuszeile
setzo2:    push    hl        ; len
    ld    de,0
    push    de        ; xanf
    ld    hl,(maxy##)
    inc    hl
    push    hl        ; yanf
    push    de        ; nr
    jp    setbe2
;
; Procedure SetPattern(pat:Integer);
;
setpa1:    ld    l,pram+8
    jr    setma2
;
; Procedure SetMask(ma:Integer);
;
setma1:    ld    l,mask
setma2:    call    cmd1
    pop    hl        ; Return adr.
    ex    (sp),hl        ; Parameter holen
    call    par1
    ld    l,h
    call    par1
    ret
;
; Procedure ClearScreen;
;
clrsc1:    ld    hl,clrtab
    call    tabout
    ret
;
;
; Initialisierung des GDC
;
exitgr:    call    austa        ; warten austastluecke
    xor    a
    out    (zoom),a
    xor    a
    out    (data),a
    ld    hl,exitab
    call    tabout
    ld    c,0ch        ; clear screen
    call    0de0ch
    ld    c,82h        ; cursor on
    jp    0de0ch
;
austa:    in    a,(status)    ; warten ende austastluecke
    and    00100000b
    jr    nz,austa
austa1:    in    a,(status)    ; warten auf anfang austastluecke
    and    00100000b
    jr    z,austa1
    ret
;
; Unterprogrammm zur Tabellenausgabe von Kommandos und Parametern
; an den GDC HL zeigt auf den Tabellenanfang
; (HL) - Anzahl der Kommandos
; dann wiederholt sich der folgende Tabellenaufbau fuer alle Kommandos
; (HL+1) Anzahl der Parameter fuer das 1.Kommando-1 (Kommando zaehlt mit)
; (HL+2) Kommando 1
; (HL+..... Parameter
; (HL+n) Anzahl der Parameter fuer das 2.Kommando-1
;
tabout:    ld    c,m        ; Kommandozahl
    inc    hl
ininex:    ld    b,m        ; Parameterzahl
    inc    hl
comm2:    in    a,(status)    ; Warten auf FIFO leer
    and    0ch
    cp    4
    jr    nz,comm2
    ld    a,m
    inc    hl        ; Kommando holen und ausgeben
    out    (data),a    ; Kommando ausgeben
    dec    b        ; Test auf keine Parameter
    jr    z,iniwet
inipar:    ld    a,m        ; Parameter ausgeben
    inc    hl
    out    (status),a
    djnz    inipar
iniwet:    dec    c        ; Test auf letztes Kommando
    jr    nz,ininex
    ret
;
;
; Tabelle mit den Kommanndos und Parametern fuer die Initialisierung
;
exitab:    db    8    ; 8 Kommandos
    db    1
    db    reset
    db    9
    db    sync
    db    worktyp
    db    ((Aw-2) and 11111110b)
    db    (vs and 111b) shl 5 +((hs-1) and 11111b)
    db    (hfp-1) shl 2 + (vs and 11000b) shr 3
    db    (hbp and 111111b)
    db    (vfp and 111111b)
    db    (al and 11111111b)
    db    (al and 1100000000b) shr 8 + vbp shl 2
    db    1
    db    vsync + (vsyntyp and 1)
    db    2
    db    pitchc
    db    pitch
    db    4
    db    cchar
    db    lpcr
    db    (br and 11b) shl 6 + sc shl 5 +ctop
    db    (cbot and 11111b) shl 3 + (br and 11100b) shr 2
    db    2
    db    zoomc
    db    0
    db    1
    db    start
    db    1
    db    unblank
;
clrtab:    db    10
    db    3,curs,0,0
    db    3,mask,-1,-1
    db    4,figs,2,-1,3fh
    db    3,wdat,0,0
    db    4,figs,2,-1,3fh
    db    3,wdat,0,0
    db    4,figs,2,-1,3fh
    db    3,wdat,0,0
    db    4,figs,2,-1,3fh
    db    3,wdat,0,0
    end




dieses Pascal Programm gemacht:


Quellcode:

begin {Modul GDCMAC}
    inline (
  {0000}  $C3/*+32   /$C3/*+41   /$C3/*+67   /$C3/*+113  /$C3/*+172  /$C3/
  {0010}  *+253  /$C3/*+246  /$C3/*+262  /$C3/*+266  /$C3/*+29   /$C3/*+285  /
  {0021}  $E1/$E3/$DB/$4C/$E6/$02/$20/$FA/$7D/$D3/$4D/$C9/$E1/$E3/$DB/$4C/
  {0031}  $E6/$02/$20/$FA/$7D/$D3/$4C/$C9/$E1/$E3/$CD/*-13   /$6C/$18/$EE/
  {0041}  $06/$04/$CB/$3C/$CB/$1D/$10/$FA/$C9/$2E/$49/$CD/*-42   /$FD/$E1/
  {0051}  $D1/$2A/MAXY   /$B7/$ED/$52/$ED/$5B/WORDPL /$CD/$F5/$06/$EB/$E1/
  {0061}  $4D/$CD/*-34   /$19/$CD/*-56   /$6C/$CD/*-60   /$69/$CB/$25/$CB/
  {0071}  $25/$CB/$25/$CB/$25/$CD/*-72   /$FD/$E9/$FD/$E1/$E1/$CB/$25/$CB/
  {0081}  $25/$3E/$70/$85/$6F/$CD/*-100  /$D1/$2A/WORDPL /$CD/$F5/$06/$EB/
  {0091}  $E1/$06/$04/$CD/*-82   /$19/$CD/*-106  /$6C/$CD/*-110  /$D1/$6B/
  {00A1}  $CB/$25/$CB/$25/$CB/$25/$CB/$25/$CD/*-123  /$EB/$CD/*-109  /$7D/
  {00B1}  $E6/$3F/$6F/$CD/*-134  /$FD/$E9/$FD/$E1/$D1/$E1/$55/$D5/$7D/$F6/
  {00C1}  $10/$D3/$48/$26/$00/$2C/$ED/$5B/GXMAX  /$E5/$CD/$0F/$07/$22/DARX   /
  {00D2}  $E1/$ED/$5B/GYMAX  /$CD/$0F/$07/$22/DARY   /$2E/$46/$CD/*-189  /
  {00E2}  $D1/$7A/$CB/$27/$CB/$27/$CB/$27/$CB/$27/$83/$6F/$CD/*-192  /$21/
  {00F2}  $01/$00/$7A/$FE/$02/$30/$02/$2E/$10/$E5/$11/$00/$00/$D5/$2A/MAXY   /
  {0103}  $23/$E5/$D5/$C3/*-138  /$2E/$78/$18/$02/$2E/$4A/$CD/*-237  /$E1/
  {0113}  $E3/$CD/*-230  /$6C/$CD/*-234  /$C9/$21/*+103  /$CD/*+41   /$C9/
  {0123}  $CD/*+24   /$AF/$D3/$48/$AF/$D3/$4D/$21/*+57   /$CD/*+25   /$0E/
  {0133}  $0C/$CD/$0C/$DE/$0E/$82/$C3/$0C/$DE/$DB/$4C/$E6/$20/$20/$FA/$DB/
  {0143}  $4C/$E6/$20/$28/$FA/$C9/$4E/$23/$46/$23/$DB/$4C/$E6/$0C/$FE/$04/
  {0153}  $20/$F8/$7E/$23/$D3/$4D/$05/$28/$06/$7E/$23/$D3/$4C/$10/$FA/$0D/
  {0163}  $20/$E6/$C9/$08/$01/$00/$09/$0F/$16/$26/$20/$24/$0B/$38/$C8/$E0/
  {0173}  $01/$6F/$02/$47/$40/$04/$4B/$00/$E0/$00/$02/$46/$00/$01/$6B/$01/
  {0183}  $0D/$0A/$03/$49/$00/$00/$03/$4A/$FF/$FF/$04/$4C/$02/$FF/$3F/$03/
  {0193}  $20/$00/$00/$04/$4C/$02/$FF/$3F/$03/$20/$00/$00/$04/$4C/$02/$FF/
  {01A3}  $3F/$03/$20/$00/$00/$04/$4C/$02/$FF/$3F/$03/$20/$00/$00)
  end;  {GDCMAC}



Jemand Interesse?

Gruß
Jonny

Dieser Beitrag wurde am 17.03.2022 um 23:39 Uhr von jde editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
18.03.2022, 06:35 Uhr
Frieder



Hallo Volker und Jonny,

danke für Eure Antworten. Den Inlass-Assembler habe ich auch und er hat schon gute Dienste geleistet, aber darum geht es nicht.

Ich habe mehrere gepatchte Versionen von TURBO.COM 3.02A. Meistens sind es nur die Terminaleinstellungen, die angepasst wurden. Aber nur mit einer dieser Versionen (von einer Diskette für den MC80/30) bin ich in der Lage, INLINE-Code korrekt zu übersetzen. Es handelt sich um eine in Assembler geschriebene Ansteuerung für eine SIO und das Drumherum ist in Turbo Pascal. Jetzt interessiert mich, welche Bytes in TURBO.COM dafür zuständig sind.

Viele Grüße, Frieder
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
18.03.2022, 08:40 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Hallo Frieder,

mir ist immer noch unklar, was Du willst. Die SIO-Port-Adresse ändern?

Es gibt keine festen Adressen z.B. für SIO-Ports. Das wird ja im Pascal-Programm definiert und dann irgendwo im erzeugten MC-Code eingebrannt.
Es gibt keinen Pascal-Decompiler. Hier musst Du ggf. das Programm disassemblieren und nach passenden IN / OUT-Konstrukten schauen.

Wenn Du Terminal-Einstellungen ändern willst, steht der Patch-Bereich am Anfang des Programms. Diese Bytes sind dokumentiert. Aber darum geht es ja nicht?

Oder suchst Du ein Pascal, was auf Deinem Rechner vernünftig läuft?

Oder suchst Du die Quellen von INLASS?
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 18.03.2022 um 08:40 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
18.03.2022, 08:44 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

@jde: INLASS ist von Ulrich Kern, das Programm INLASS ist 1986 beim Vogel-Verlag in der Reihe Chip Spezial Turbo Pascal, Ausgabe 2, im Quellcode veröffentlicht worden. Der Quellcode liegt vor. Mindestens das Rahmenprogramm hast du ja auch :-)
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
18.03.2022, 09:39 Uhr
Frieder



Hallo Volker,

vor 32 Jahren hatte ich ein Programm für die Kommunikation zweier Rechner über SIO geschrieben. Das Programm ist in Turbo Pascal erstellt und die gesamte SIO-Steuerung ist mit Assembler gebaut und als INLINE-Code eingebunden. Ich hatte damals die Kommunikation von AC1 zu einem MC80/30 über IFSS realsiert. Das läuft alles.

So, jetzt kommts:
Wenn man die Pascal-Quelle SIO.PAS in eine SIO.COM compilieren will, dann ist es NICHT egal, welchen TURBO.COM man dafür nimmt. Der Pascal-Code läuft in jedem Fall, aber der INLINE-Code nicht. Wenn ich meine verschiedenen TURBO.COM im Binärmodus vergleiche, dann sehe ich viele Unterschiede. Etliche dieser Unterschiede sind sicherlich den unterschiedlichen Terminaleinstellungen und Tastenbelegungen geschuldet, aber es muss auch noch weitere Unterschiede geben. Deshalb die Patchtabelle.

Viele Grüße,
Frieder
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
18.03.2022, 10:25 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Du sucht also Patches f. Turbo selbst?

Eine solche finale Patch-Liste habe ich nicht parat. H. Oppermann hatte sicher was dazu zusammengetragen, aber das finde ich nicht. In der c't gab es einige Beiträge.
Du kannst Dir auch die Opermann-Quellen von Turbo Pascal 2.0/3.0/3.01 anschauen, da sind die Unterschiede auch zu sehen.

Die in der DDR verbreitete Version 3.02A ist eine gepatchte Version 3.00, von Borland selbst gab es nur Version 3.00A und 3.01A.

Pascal-Versionen
http://www.z80.eu/pas-compiler.html

diverses, auch Patche etc:
http://www.primrosebank.net/computers/cpm/cpm_uc_de.htm
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
18.03.2022, 12:42 Uhr
Bert




Zitat:
Frieder schrieb
Wenn man die Pascal-Quelle SIO.PAS in eine SIO.COM compilieren will, dann ist es NICHT egal, welchen TURBO.COM man dafür nimmt. Der Pascal-Code läuft in jedem Fall, aber der INLINE-Code nicht.


Nicht, das ich davon Ahnung hätte, aber das klingt, als wenn die Pascal-Compiler auf unterschiedlichen Wegen die Parameter zum ASM-Unterprogramm und zurück schicken.

Wie komplex ist denn der ASM-Teil? Vielleicht kann man den mit Pascal nachprogrammieren?!

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
18.03.2022, 13:10 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

@Frieder: Wenn Du die Quelle SIO.PAS hast , die auch inline-Code enthält
wie oben dargstellt:

inline ( $C3/*+32/$C3/*+41/$C3/*+67 ... );

kannst vor dem inline code dir entweder einen String ablegen oder mit print ausgeben, und so die Stelle im COM-Programm finden, ab der der inline-Code tatsächlich abgelegt ist.

DUMMY:="INLINE BEGINN";
inline ( $C3/*+32/$C3/*+41/$C3/*+67 ... );
DUMMY:="INLINE ENDE";

Hilft dir das?

Ist denn den Inline-Code-Abschnitt mit fixen Adressen erzeugt oder mit Offset-Syntax wie "*+"?

Turbo Pascal hat in Version 3.00 vs. 3.01 keine Änderung im Compiler-Abschnitt für Inline-Konstrukte. Das Ergebnis müsste mit allen Turbo-Pascal Versionen 3.x gleich sein.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
18.03.2022, 13:20 Uhr
Frieder



Hallo Volker,
danke für die Links. Ich hatte bereits die Befürchtung, dass ich da tiefer in die Materie einsteigen muss... Ich melde mich.

Hallo Bert,
tja, vor 30 Jahren wurden oftmals Programmänderungen so vorgenommen, dass man die Binarys mit dem HEX-Editor bearbeitet hat, bis ein zufriedenstellendes Ergebnis vorlag. Leider war es damals genauso wie heute, dass zu wenig dokumentiert wurde. Die TURBO.COM - Versionen unterscheiden sich in wenigen Bytes, jetzt muss ich "nur noch" herausfinden, woran es genau liegt.
Der ASM-Teil von meinem Programm ist sehr Hardware-nah und auch zeitkritisch, da lohnt sich die Einbindung von Assemblercode in jedem Fall.

Viele Grüße,
Frieder
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek