Nein, es geht nicht im Forth, aber eine Sprache mit Forth-ähnlicher Syntax, also UPN:
Ich habe mir vor ein paar Tagen den Semi-Compiler PL1 (Quellcode für A86-Assembler ist ebenfalls enthalten) heruntergeladen und ein wenig damit rumprobiert.
Ich kam dann auf die Idee, ein Tool zum Auslesen und Anzeigen der Interruptvektortabelle zu basteln. In Assembler oder (Turbo) Pascal kein Problem, aber mit PL1 will es mir nicht gelingen.
Den Befehl "0 seg" kann ich nicht verwenden, weil dieser nicht das Segment für Peek (und Poke) auf 0 setzt, sondern stattdessen das aktuelle Segment zurückgibt. (Natürlich erst eine Weile den Fehler gesucht, bevor ich noch mal in die Anleitung geschaut habe.) Also habe ich es mit Int21.35 versucht, aber ich schaffe es nicht, an den Zeiger in ES:BX zu kommen.
Ich habe erfolglos viele Varianten ausprobiert. Da ich von Forth bzw. UPN nicht wirklich Ahnung habe, tippe ich darauf, dass ich da einfach noch ein Verständnisproblem habe, was sich auf dem Stack tut. Wäre daher dankbar, wenn sich das jemand mit mehr (Forth-)Erfahrung angucken würde.
Nachfolgend mein (nicht optimierter) Bastel-Code:
;= assign integer
;% dereference integer (load integer on top of stack)
;name push pointer to variable storage on top of stack
;INT 21 - DOS 2+ - GET INTERRUPT VECTOR
; AH = 35h
; AL = interrupt number
;Return: ES:BX -> current interrupt handler
18 alloc reg =
0x3500 reg % = ;ax
reg % 0x0021 int
; FALSCH
reg % 14 + hexword do
reg % free
nl
0x0815 hexword do
nl
;
proc hexword
dup
8 >>
hexbyte do
255 &
hexbyte do
endproc
;
proc hexbyte
dup
4 >> nibble =
if nibble % 10 <
nibble % str print
else
nibble % 55 + 8 << 1 | nibble = nibble print
endif
15 & nibble =
if nibble % 10 <
nibble % str print
else
nibble % 55 + 8 << 1 | nibble = nibble print
endif
endproc
Alles anzeigen