Anleitung: FPC und MSDOS Cross-Compiler

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Re: Anleitung: FPC und MSDOS

Beitragvon Mathias » 6. Nov 2016, 17:20 Re: Anleitung: FPC und MSDOS

Mathias hat geschrieben:Ich bin ein bisschen weiter gekommen, beim kompilieren meines alten Programmes.
Unter TP hatte ich LevelBild direkt als absolute in den VRAM deklariert.
Mit der forto-Schleife das Bild in den VRAM zu schreiben hat geklappt, auch kommt später das Menü richtig, welches mit der abolute-Deklaration verstückelt kam.
Ersetze ich dir forto-Schleife durch ein Move, dann habe ich den gleichen Fehler, wie mit dem absolute.
Es sieht so aus, wie wen nach dem Move, GotoXY nicht mehr richtig geht.

Code: Alles auswählen
type
  BildTyp = Array[0..3999] of Byte;
var
  fLevel            : file of Bildtyp;             { Fr Level Bilder ab Disk }
//  LevelBild         : Bildtyp absolute $B800:0000; { BS Adresse }
  LevelBild         : Bildtyp;  // FPC Cross8086
....
begin
  str1:='1';
  DateiName := LevelPfad + 'Level' + Str1 + '.SCR';
  assign(fLevel,DateiName);                         { Level Laden }
  reset(flevel);
  read(fLevel, Levelbild);
  close(flevel);
//  move(LevelBild, Mem[$B800:$0000], 4000);
  for i := 0 to 3999 do Mem[$B800:i] := LevelBild[i];
 
 // Menü zeichnen und Spiel starten.
 ...
end.


Weis jemand woran das liegen könnte ? :roll:

Diese Problem mit dem absolute habe ich jetzt auch gelöst, man muss den Compiler mit -WmLarge aufrufen.
Ich habe die Anleitung im ersten Post angepasst.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3781
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 7. Nov 2016, 17:05 Re: Anleitung: FPC und MSDOS

Inline Assembler schein nicht zu funktionieren. :cry:

Code: Alles auswählen
function JoyLinks  : boolean;
begin
  INLINE( $1E/$50/$52/$56/$BA/$01/$02/
          $B4/$01/$BE/$00/$00/$8E/$DE/
          $FA/$EE/$46/$EC/$84/$C4/$75/
          $FA/$FB/$89/$36/$64/$12/$5E/
          $5A/$58/$1F);
  x := MemW[0:$1264];
  if x < 20 then Joylinks := true
            else Joylinks := false;
end;

musste ich durch
Code: Alles auswählen
function JoyLinks  : boolean;
begin
  asm
    db $1E, $50, $52, $56, $BA, $01, $02,
    db $B4, $01, $BE, $00, $00, $8E, $DE,
    db $FA, $EE, $46, $EC, $84, $C4, $75,
    db $FA, $FB, $89, $36, $64, $12, $5E,
    db $5A, $58, $1F
  end;
  x := MemW[0:$1264];
  if x < 20 then Joylinks := true
            else Joylinks := false;
end;

ersetzen.

Gibt es dafür evtl. ein Kompiler-Schalter oder was ähnliches, oder ist es mit den DB-Anweisungen die einzige Alternative ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3781
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon marcov » 7. Nov 2016, 18:20 Re: Anleitung: FPC und MSDOS

Keine Idee. Normal ist das kein Problem weil inline Assembler meistens nur genutzt wird für Instruktionen die der BP Assembler nicht kennt. FPC soll sie aber alle schon erkennen.

Also versuche die Befehle aus zu schreiben.
marcov
 
Beiträge: 1028
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon Mathias » 7. Nov 2016, 19:28 Re: Anleitung: FPC und MSDOS

Also versuche die Befehle aus zu schreiben.

Bei einem neuen Project würde ich dies machen, aber hier geht es um alte Projecte. Ich weis nicht mal, was der Inline-Code macht.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3781
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon marcov » 7. Nov 2016, 20:54 Re: Anleitung: FPC und MSDOS

Mathias hat geschrieben:
Also versuche die Befehle aus zu schreiben.

Bei einem neuen Project würde ich dies machen, aber hier geht es um alte Projecte. Ich weis nicht mal, was der Inline-Code macht.


Nutze die db Methode und sehe Output (-al) nach.
marcov
 
Beiträge: 1028
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon Mathias » 8. Nov 2016, 16:52 Re: Anleitung: FPC und MSDOS

Nutze die db Methode und sehe Output (-al) nach.

Ich habe mit
Code: Alles auswählen
c:\FPC\3.0.0\bin\i386-win32\ppcross8086.exe -WmLarge -al PACMAN.lpr

Aber ich sehe nichts.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3781
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon marcov » 8. Nov 2016, 21:11 Re: Anleitung: FPC und MSDOS

Es funktioniert tatsächlich nicht

ppcross8086 -al PACMAN.lpr -Fud:\pp16\units\msdos\* -s

und dann sich joystick.s ansehen:

Code: Alles auswählen
SECTION _TEXT use16 class=CODE align=1
   GLOBAL JOYSTICK_$$_JOYLINKS$$BOOLEAN
JOYSTICK_$$_JOYLINKS$$BOOLEAN:
..@c1:
; [JOYSTICK.PAS]
; [22] begin
%LINE 22+0 JOYSTICK.PAS
      push   bp
..@c3:
..@c4:
      mov   bp,sp
..@c5:
      sub   sp,2
; Var $result located at bp-1, size=OS_8
CPU 8086
 
   DB   30,80,82,86,186,1,2,180,1,190,0,0,142,222,250,238,70,236,132,196,117,250,251,137,54,100,18,94
   DB   90,88,31
CPU 8086
 
; [30] x := MemW[0:$1264];
%LINE 30+0
      mov   ax,0
      mov   es,ax
      mov   ax,word [es:+4708]
      mov   word [U_$JOYSTICK_$$_X],ax
; [31] if x < 20 then Joylinks := true
%LINE 31+0
      cmp   word [U_$JOYSTICK_$$_X],20
      jl   ..@j5
      jmp   ..@j6
..@j5:
      mov   byte [bp-1],1
      jmp   ..@j7
..@j6:
; [32] else Joylinks := false;
%LINE 32+0
      mov   byte [bp-1],0
..@j7:
; [33] end;
%LINE 33+0
      mov   al,byte [bp-1]
      mov   sp,bp
      pop   bp
      ret
..@c2:


Also db werden nur kopiert nicht decodiert. FPC liefert kein objdump fuer 8086, also dann sind die Möglichkeiten das mit FPC zu tun zu enden, und muss man nach ein externen Disassembler umsehen, oder db stehen lassen
marcov
 
Beiträge: 1028
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon Nixsager » 8. Nov 2016, 21:14 Re: Anleitung: FPC und MSDOS

Kann man nicht nach der Adresse von DB suchen, und dann dahin springen?
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 8. Nov 2016, 21:35 Re: Anleitung: FPC und MSDOS

Ich habe mal diesen einfachen Code mit -s übersetzt.
Code: Alles auswählen
program test;  // test.pas
{$ASMMODE   intel}
uses
  Crt, ports;
begin
  asm
    mov ax,$13
    int $10
  end;
  repeat
    Mem[$A000:random(64000)] := random(256);
  until KeyPressed;
end.


Da wurde ein Ordner "test.sl mit erzeugt, welcher mehrere test0s*.s enthält.
"test0s2.s hat folgenden Inhalt.

Code: Alles auswählen
BITS 16
CPU 8086
SECTION TEST_TEXT use16 class=code
SECTION .rodata class=data
SECTION .data class=data
SECTION .fpc class=data
SECTION .bss class=bss
GROUP dgroup rodata data fpc bss
SECTION TEST_TEXT
 
SECTION TEST_TEXT
   ALIGN 2
   GLOBAL PASCALMAIN
PASCALMAIN:
   GLOBAL _main
_main:
; Temps allocated between bp-4 and bp+0
; [test.pas]
; [5] begin
      push   bp
      mov   bp,sp
      sub   sp,4
      call   far FPC_INITIALIZEUNITS
; [7] mov ax,$13
      mov   ax,19
; [8] int $10
      int   byte 16
   ALIGN 2
..@j3:
; [11] Mem[$A000:random(64000)] := random(256);
      mov   ax,0
      push   ax
      mov   ax,-1536
      push   ax
      call   far SYSTEM_$$_RANDOM$LONGINT$$LONGINT
      mov   dx,0
      mov   word [bp-4],ax
      mov   word [bp-2],dx
      add   word [bp-2],-24576
      mov   ax,0
      push   ax
      mov   ax,256
      push   ax
      call   far SYSTEM_$$_RANDOM$LONGINT$$LONGINT
      mov   es,word [bp-2]
      mov   bx,word [bp-4]
      mov   byte [es:bx],al
; [12] until KeyPressed;
      call   far CRT_$$_KEYPRESSED$$BOOLEAN
      test   al,al
      jne   ..@j5
      jmp   ..@j3
..@j5:
; [13] end.
      call   far FPC_DO_EXIT
      mov   sp,bp
      pop   bp
      retf
; End asmlist al_procedures
; Begin asmlist al_globals
EXTERN   FPC_DO_EXIT
EXTERN   CRT_$$_KEYPRESSED$$BOOLEAN
EXTERN   SYSTEM_$$_RANDOM$LONGINT$$LONGINT
EXTERN   FPC_INITIALIZEUNITS


ppcross8086 -al PACMAN.lpr -Fud:\pp16\units\msdos\* -s

und dann sich joystick.s ansehen:

Wieso gibt es bei dir nur eine Daten, bei mir hat es mehrere jostick0s*.s gegeben.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3781
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon marcov » 8. Nov 2016, 22:26 Re: Anleitung: FPC und MSDOS

Nixsager hat geschrieben:Kann man nicht nach der Adresse von DB suchen, und dann dahin springen?


Ja, ein label definieren. ABer was helft das ?
marcov
 
Beiträge: 1028
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon marcov » 8. Nov 2016, 22:27 Re: Anleitung: FPC und MSDOS

Mathias hat geschrieben:Gibt es dafür evtl. ein Kompiler-Schalter oder was ähnliches, oder ist es mit den DB-Anweisungen die einzige Alternative ?


Eine Kompiler schalter weniger. Man soll Smartlinking (-CX/-XXs) nicht mitgeben oder im fpc.cfg haben
marcov
 
Beiträge: 1028
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon Nixsager » 8. Nov 2016, 22:28 Re: Anleitung: FPC und MSDOS

DB sind doch Ursprünglich ASM-Coder oder?

Wenn das so ist den einfach in den Speicher schreiben bzw. ist er ja schon weil er im Programm ist.

Und dann in einer Routine einfach zu der Stelle springen wo er steht.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon marcov » 8. Nov 2016, 23:27 Re: Anleitung: FPC und MSDOS

Nixsager hat geschrieben:DB sind doch Ursprünglich ASM-Coder oder?


db heißt nur "füge diese Bytes hier ein".

Aber mit db in asm wird es schon ausgeführt, und geht es danach weiter.

Wenn das so ist den einfach in den Speicher schreiben bzw. ist er ja schon weil er im Programm ist.

Und dann in einer Routine einfach zu der Stelle springen wo er steht.


Mann weißt nicht ob es eine komplette Routine ist, also mit RET beendet wird. Es kann eben nur reine Data sein.

zb: (nicht getestet, solche Tricks sein ein paar Jahre her)

label etwas;
asm
mov ax cs:[etwas]
leave
ret;
etwas:
db $11 // meine data
end;

Kommt etwas weniger vor in TP, aber ist ganz normal in Systeme mit Xlarge Model. (ein data und const segment pro unit, wie zb Topspeed)
marcov
 
Beiträge: 1028
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon Nixsager » 8. Nov 2016, 23:30 Re: Anleitung: FPC und MSDOS

marcov hat geschrieben:Mann weißt nicht ob es eine komplette Routine ist, also mit RET beendet wird. Es kann eben nur reine Data sein.

Wenn das so ist, würde ich sagen, das der Code dann so oder so unsicher.
Am besten mit einem Dissambler den Code überprüfen und anpassen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Jole » 9. Nov 2016, 13:15 Re: Anleitung: FPC und MSDOS

@Mathias: Hier mal der Inline code als Assembler code
Code: Alles auswählen
 
  function Joylinks : boolean;
  begin
    asm
      push ds
      push ax
      push dx
      push si
      mov dx,0201h
      mov ah,01h
      mov si,0000h
      mov ds,si
      cli
      out dx,al
    @L1:
      inc si
      in al,dx
      test ah,al
      jnz @L1
      sti
      mov [1264h],si
      pop si
      pop dx
      pop ax
      pop ds
{
      push es
      xor ax,ax
      mov es,ax
      Mov Ax, es:[$1264]
      pop es
      mov @result,True
      cmp x,20
      jb @L1
      mov @result,false
    @L1:
}
    end; {asm}
 
{ das könnte man auch durch assembler ersetzen, siehe oben}
    x := MemW[0:$1264];
    if x < 20 then Joylinks := true
      else Joylinks := false;
end;
 

Ob das jetzt aber weiter hilft? Für so kleine Inlinecodes leistet der gute alte DOS Deguger immer noch sehr gute Dienste.
Jole
 
Beiträge: 116
Registriert: 4. Jul 2014, 13:39
OS, Lazarus, FPC: Linux | 
CPU-Target: amd64
Nach oben

» Weitere Beiträge siehe nächste Seite »
VorherigeNächste

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried