
|
MSX hooks Henk, 00-00-00
EUROPOORT-BBS programmers info
MSX-hooks. [ Uit het 'MSX-handboek voor gevorderden' en
'Machinetaal voor MSX-computers' ]
------------------------------------------------------
Naast het werkgeheugen wordt er door het OS ook geheugen gereserceerd
voor de zgn. RAM-haken (Ram-hooks). Deze RAM-haken vormen een uitbrei-
dings mogelijkheid voor MSX-BASIC en het OS.Ze worden zogezegd gebruikt
om nieuwe toepassingen aan de MSX 'vast te haken'.
Een RAM-Haak is een gebied van vijf bytes, gereserveerd voor zeer een
zeer korte machinetaalroutine die over het algemeen zal bestaan uit een
sprong naar een bepaald adres waar een afhandelingsroutine staat. Elke
RAM-haak wordt aangeroepen op bepaalde momenten(verschillend per haak),
waarop het mogelijk is het OS te onderscheppen en bepaalde zaken zelf
anders te implementeren. Over het algemeen zal deze eigen implementatie
verzorgd zijn in een pagina in een andere gleuf(slot). De vijf bytes
die per haak beschikbaar zijn, zijn dan net voldoende voor een
intergleuf(interslot)-aanroep van de eigen routine via de OS- ingang
CALLF(0030). Deze ingang kan namelijk aangeroepen worden door een RST
&H30-instructie, gevolgd door een byte voor een gleuf(slot)-aan duiding
en twee bytes voor een geheugenadres(zie BIOS). Het laatste byte is dan
een RET-instructie.
Bij het initialiseren van het ram geheugen worden alle RAM-haken(hooks)
door het OS gevuld met vijf RET-instructies, zodat het aanroepen van
een haak geen effect heeft. Als een bepaalde routine in een bepaalde
ROM geimplementeerd is, kan de initialisatieroutine van die ROM (zie
systeem-variabelen) de benodigde RAM-haken vullen meet een aanroep van
CALLF die naar de implementatie verwijst.
aanroepende
routine aanroepende
| | +0|---------------| | routine |
| | / | RST 30 |/------|------------|
| | / +1|---------------| | |
| | / |Slot aanduiding| | |
+0|---------|/ +2|---------------| | |
|Call haak| |Adres in slot | | |
+3|---------|\ +4|---------------| | |
| | \ | RET | | |
| | \ +5|---------------| | |
| | | |\------|------------|
| | |---------------| | RET |
Het gebruik van de RAM-haken(hooks).
Het systeem van gebruik van de RAM-haken is nog eens weergegeven in
de afbeelding hierboven.
Om een CALLF-interslot-aanroep te kunnen gebruiken, moet het slot van
bestemming bekend zijn. Voordat een RAM-haak kan worden ingevuld, moet
de ROM-initialisatieroutine weten in welke gleuf(slot) hij zich bevindt
De gleuf(slot) van bestemming is als byte gecodeerd, waarin de bits de
volgende bvetekenis hebben:
Bit 7 Gleuf(slot) is wel/niet uitgebreid. 1=wel
Bit 6-4 Ongebruikt.
Bit 3-2 Nummer secundaire gleuf(slot) 0-3
Bit 1-0 Nummer primaire gleuf(slot) 0-3
De volgende machinetaalroutine bepaalt de gleuf(slot) waarin hij zich
bevindt, en codeert deze informatie volgens bovenstaand patroon. Bij
het verlaten van deze routine staat de codering in het A-register.
RSLREG EQU &H138 ;OS-ingang voor bepalen primaire slot.
EXPTBL EQU &HFCC1 ;Tabel met informatie of de gleuf uit-
gebreid is.
B8000 EQU 1 ;Zet dit op 1 als de routine zich be-
vindt in het bereik 8000-BFFF
CALL RSLREG ;Ingeschakelde primaire gleuven.
RRC ;Zoek juiste element op binnen
RRC ;de ingeschakelde gleuven.
IF B8000 ;Macro, wordt alleen geassembleerd
RRC ;als routine in het bereik 8000-BFFF.
RRC ;Neem in dat geval volgende elementen.
ENDIF
AND &HB11 ;Selecteer relevante deel
LD C,A
LD B,0
LD HL,EXPTBL ;Zoek element binnen EXPTLB op
ADD HL,BC
OR (HL) ;Bit 7 hoog indien uitgebreid.
LD C,A ;Berg tijdelijk op
INC HL
INC HL
INC HL
INC HL
LD A,(HL) ;Huidige ingeschakelde secundair slot
IF B8000 ;Macro, geassembleerd als B8000=1
RRC ;Schuif juiste element in bit 2,3
RRC
ENDIF AND &HB1100 ;Selecteer relevante deel
OR C ;Combineer met de reeds gevonden infor-
matie
RET ;Klaar
De RAM-haken zijn ruwweg in drie groepen in te delen:
-OS RAM-haken. Dit zijn de RAM-haken die vanuit het OS aangeroepen
worden.
-BASIC-uitbreiding RAM-haken. Dit zijn RAM-haken die horen bij een
BASIC sleutelwoord dat in standaard MSX-BASIC niet geimplementeerd is.
Met gebruik van deze haken kunnen deze sleutelwoorden benut worden in
de implementatie van DISK-BASIC.
-DISK BASIC aanroepen. Deze RAM-haken dienen enkel en alleen voor het
implementeren van DISK BASIC. De RAM-haken in deze categorie horen
echter niet speciaal bij een sleutelwoord, zoals de hierboven genoemde
haken.
-BASIC interpreter RAM-haken. Dit zijn haken die vanuit de BASIC inter-
preter aangeroepen worden. De momenten en de omstandigheden van de aan
roep zijn over het algemeen nogal obscuur, en deze haken zijn in feite
niet bruikbaar zonder grondige kennis van de interpreter.
Van alle RAM-haken wordt de indeling in een van deze groepen gemeld.
Van de OS RAM-haken is bovendien het moment van aanroep en het doel van
de haak gegeven. Van de BASIC uitbreidingshaken is vermeld bij welk
sleutelwoord ze horen. De BASIC interpreter-haken en DISK BASIC-haken
zijn over het algemeen verder niet gedocumenteerd.
FD9A H.KEYI
Groep OS
Aanroep: aan het begin van de interrupt afhandeligsroutine, voordat
getest is of de interrupt van de VDP afkomstig is.
Doel : om anderen interrupts dan de VDP-interrupt te kunnen toelaten
bijvoorbeeld via een cartridge aansluiting. De RS232 maakt
hiervan gebruik. De routine moet zelf testen of de interrupt
van de juiste bron afkomstig is.
FD9F H.TIMI
Groep OS
Aanroep: aan het begin van de interrupt-afhandelingsroutine, op het
moment dat vast staat dat de interrupt van de VDP afkomstig
is.
Doel : om de VDP-interrupt voor andere doeleinden te kunnen gebrui-
ken.
FDA4 H.CHPU
Groep OS
Aanroep: aan het begin van CHPUT(00A2), de routine die een teken op
het scherm zet.
Doel : om andere uitvoerapparaten dan het beeldscherm als stan-
daard uitvoer te kunnen gebruiken.
FDA9 H.DSPC
Groep OS
Aanroep: aan het begin van de routine die de cursor op het scherm
zichbaar maakt.
Doel : om andere uitvoerapparaten dan het beeldscherm als stan-
daard te kunnen gebruiken.
FDAE H.ERAC
Groep OS
Aanroep: aan het begin van de routine die de cursor van het scherm
verwijdert.
Doel : om andere uitvoerapparaten dan het beeldscherm als stan-
daard uitvoer te kunnen gebruiken.
FDB3 H.DSPF
Groep OS
Aanroep: aan het begin van DSPFNK(00CF), de routine die de tekst
van de functietoetsen op het scherm zet.
Doel : om andere uitvoerapparaten dan het beeldscherm als stan-
daard te kunnen gebruiken.
FDB8 H.ERAF
Groep OS
Aanroep: aan het begin van ERAFNK(00CC), de routine die de tekst
van de functietoetsen van het scherm verwijdert.
Doel : om andere uitvoerapparaten dan het beeldscherm als stan
daard uitvoer te kunnen gebruiken.
FDBD H.TOTE
Groep OS
Aanroep: aan het begin van TOTEXT(00D2), de routine die het scherm
geforceerd in een andere tekstmode zet.
Doel : om andere uitvoerapparaten dan het beeldscherm als stan-
daard te kunnen gebruiken.
FDC2 H.CHGE
Groep OS
Aanroep: aan het begin van CHGET(009F), de routine die een teken uit
de toetsenbordbuffer leest.
Doel : om andere invoerapparaten dan het toetsenbord als standaard
invoer te kunnen gebruiken.
FDC7 H.INIP
Groep OS
Aanroep: aan het begin van de OS-routine die bij initialisatie van een
tekst-modus de patroontabel vult met de patronen van de stan-
daard(ASCII-)tekens.
Doel : om andere tekens dan die in de ASCII-tabel als standaard te
gebruiken.
FDCC H.KEYC
Groep OS
Aanroep: aan het begin van de routine die samengestelde toetsaanslagen
(de SHIFT-, CODE-,GRAPH en/of CTRL-toets samen met een andere
ontcijfert en er een ASCII-code bij zoekt, die in de toetsen-
bordbuffer wordt omgezet.
Doel : om andere toetsenbordconstructies mogelijk te maken.
FDD1 H.KYEA
Groep OS
Aanroep: aan het begin van de routine die enkelvoudige toetsaanslagen
verwerkt en er een ASCII-code aan toewijst die in de toetsen-
bordbuffer wordt gezet.
FDD6 H.NMI
Groep OS
Aanroep: vanaf ingang NMI (0066)
Doel : om het gebruik van NMI-interrupts mogelijk te maken.
FDDB H.PINL
Groep OS
Aanroep: aan het begin van PINLIN(00AE), de routine die de versie van
de scherm-editor vertegenwoordigt die in directe programmeer
modus gebruikt wordt.
Doel : om een andere implementatie van de scherm-editor of een ander
standaard invoerapparaat mogelijk te maken.
FDE0 H.QINL
Groep OS
Aanroep: aan het begin van QINLIN(00B4), de routine die na het afdruk-
ken van een vraagteken en een spatie de scherm-editor aan-
roept.
Doel : om een andere implementatie van de scherm-editor of een ander
standaard invoerapparaat mogelijk te maken.
FDE5 H.INLI
Groep OS
Aanroep: aan het begin van INLIN(00B1), de routine waarin de scherm-
editor geimplementeerd is.
Doel : om een andere implementatie van de scherm-editor of een ander
standaard invoerapparaat mogelijk te maken.
FDEA H.ONGO
Groep BASIC-interpreter
FDEF H.DSKO
Groep BASIC-sleutelwoord.
Doel : Implementeren van de functie DSKO$
De volgende hooks zijn niet verder gedocumenteerd, vandaar dat alleen
het adres en de naam genoemd worden. Alle hooks vallen onder de groep
'BASIC-sleutelwoord' met als doel' het implementeren van functie/state-
ment'.
FDF4 H.SETS
Groep BASIC-sleutelwoord.
Doel : implementeren van het SET-statement.
FDF9 H.NAME (RENAME)
FDFE H.KILL (KILL)
FE03 H.IPL (Initial Program Load)
FE08 H.COPY (COPY)
FE0D H.CMD (CMD)
FE12 H.DSKF (Disk-Free, DSKF)
FE17 H.DSKI (Disk-input, DSKI$)
FE1C H.ATTR (Attr$)
FE21 H.LSET (Left Set, LSET)
FE26 H.RSET (Right Set, RSET)
FE2B H.FIEL (Field)
FE30 H.MKI$ (MaKe Integer, MKI$)
FE35 H.MKS$ (MaKe Single, MKS$)
FE3A H.MKD$ (MaKe Double, MKD$)
FE3F H.CVI (ConVert Int., CVI)
FE44 H.CVS (ConVert single, CVS)
FE49 H.CVD (CoVert double, CVD)
FE4E H.HGETP
Groep DISK-BASIC-aanroep
Aanroep:bij het opzoeken van de waarde van PTRFIL(F864)
FE53 H.SETF
Groep DISK-BASIC-aanroep
Aanroep:wanneer aan PTRFIL(F864) een nieuwe waarde wordt gegeven.
FE58 H.NOFO
Groep DISK-BASIC-aanroep
Aanroep:bij een OPEN-statement zonder FOR-gedeelte.
FE5D H.NULO
Groep DISK-BASIC
Aanroep:bij een operatie via file-buffer 0.
FE62 H.NTFL
Groep DISK-BASIC aanroep.
Aanroep:bij een operatie via een file-buffer met een ander nummer dan 0
FE67 H.MERG
Groep DISK-BASIC aanroep.
Aanroep:bij het uitvoeren van een MERGE-statement
FE6C H.SAVE
Groep DISK BASIC aanroep
Aanroep:bij het uitvoeren van een SAVE-statement voor diskette.
FE71 H.BINS
Groep DISK BASIC aanroep
Aanroep:bij het uitvoeren van een BSAVE-statement voor diskette.
FE76 H.BINL
Groep DISK-BASIC aanroep
Aanroep:bij het uitvoeren van een BLOAD-statement voor diskette.
FE7B H.FILE
Groep DISK BASIC
Doel het implementeren van het FILES-statement.
FE80 H.DGET
Groep DISK BASIC aanroep
FE85 H.FILO
Groep DISK BASIC aanroep
FE8A H.INDS
Groep DISK BASIC aanroep
FE8F H.RSLF
Groep DISK BASIC aanroep
Aanroep:voor het opnieuw selecteren van het vorige diskette station
voor diskette I/O
FE94 H.SAVD
Groep DISK BASIC aanroep
Aanroep:voor het onthouden van het huidige geselecteerde diskette-
station.
FE99 H.LOC
Groep BASIC sleutelwoord
Doel om de functie LOC te implementeren
FE9E H.LOF
Groep BASIC sleutelwoord
Doel om de functie LOF te implementeren.
FEA3 H.EOF
Groep DISK BASIC aanroep
Aanroep:bij het uitvoeren van de functie EOF voor diskette.
FEA8 H.FPOS
Groep BASIC sleutelwoord
Doel om de functie FPOS te implementeren
FEAD H.BAKU
Groep DISK-BASIC aanroep
FEB2 H.PARD
Groep BASIC interpreter.
Aanroep:bij het ontleden van een apparaatnaam in een fileaanduiding.
FEB7 H.NODE
Groep BASIC interpreter
Aanroep:wanneer een file-aanduiding zonder apparaatnaam wordt aange-
troffen.
FEBC H.POSD
Groep DISK BASIC aanroep.
FEC1 H.DEVN
Groep BASIC interpreter
Aanroep:bij het opzoeken van een apparaat met een bepaalde naam.
FEC6 H.GEND
Groep BASIC interpreter
FECB H.RUNC
Groep BASIC interpreter
AAnroep:bij het terugzetten van variabele waarden tijdens het voor-
bereidende werk in een RUN-statement.
FED0 H.CLEA
Groep BASIC interpreter
Aanroep:bij het uitvoeren van een CLEAR-statement.
FED5 H.LOPD
Groep BASIC interpreter
FEDA H.STKE
Groep BASIC interpreter
FEDF H.ISFL
Groep OS
Aanroep:aan het bein van de routine ISFLIO(014A) waarin getest wordt
of er op dit moment file-I/O plaats vindt.
Doel om nieuwe in en uitvoer apparaten te implementeren.
FEE4 H.OUTD
Groep OS
Aanroep:aan het begin van de routine OUTDO(0018) die een teken weg-
schrijft naar scherm, printer of ander uitvoerapparaat.
Doel om nieuwe uitvoerapparaten te implementeren.
Onderstaande hooks vallen alle onder de groep BASIC interpreter, tus-
ssen () is de aanroep vermeld voor zover bekend.
FEE9 H.CRDO
FEEE H.DSKC
FEF3 H.DOGR (voor het uitvoeren van elke grafische actie.)
FEF8 H.PRGE (bij het beeindigen van een BASIC-programma.)
FEFD H.ERRP
FF02 H.ERRF
FF07 H.READ
FF0C H.MAIN
FF11 H.DIRD (bij het uitvoeren van een statement in directe modus.)
FF16 H.FINI
FF1B H.FINE
FF20 H.CRUN (bij het coderen van een zojuist ingetypt BASIC-
statement)
FF25 H.CRUS (bij het coderen van van een zojuist ingetypt BASIC-
statement.)
FF2A H.ISRE (wanneer een sleutelwoord is gevonden bij het coderen
van een zojuist ingetypt BASIC-statement.)
FF2F H.NTFN (wanneer een functie is gevonden bij het coderen van
een zojuist ingetypt BASIC-statement.)
FF34 H.NOTR (wanneer een niet-sleutelwoord is gevonden bij het co-
deren van een zojuist ingetypt BASIC-statement.)
FF39 H.SNGF (FOR)
FF3E H.NEWS (nieuw statement verwerken op zelfde regel)
FF43 H.GONE (Signalering uitvoerpunt in statemanet verwerking)
FF48 H.CHRG (standaard CHGET)
FF4D H.RETU (RETURN)
FF52 H.PRTF (PRINT)
FF57 H.COMP (PRINT, zoeken naar exclusieve tekens)
FF5C H.FINP (PRINT, einde)
FF61 H.TRMN (invoer-error)
FF66 H.FRME (expressie-evaluatie)
FF6B H.NTPL (expressie-evaluatie)
FF70 H.EVAL (factor-evaluatie)
FF75 H.OKNO (factor-evaluatie)
FF7A H.FING (factor-evaluatie)
FF7F H.ISMI (bij toewijzing van een waarde aan een substring bv.
MID$)
FF84 H.WIDT (bij het uitvoeren van het WIDTH-statement)
FF89 H.LIST (bij het uitvoeren van een LIST-statement)
FF8E H.BUFL (standaard BUFLIN)
FF93 H.FRQI (standaard FRQINT, integer-omrekening)
FF98 H.SCNE (omzetting van regelnummer naar adres)
FF9D H.FRET (standaard FRETM)
FFA2 H.PTRG (standaard PRTGET)
FFA7 H.PHYD
Groep OS
Aanroep:vanuit routine PHYDIO(0144), dier operaties moet uitvoeren
op opslagapparaten zoals een diskettestation.
Doel om PHYDIO te implementeren.
FFAC H.FORM
Groep OS
Aanroep:vanuit de routine FORMAT(0147) die opslagapparaten zoals een
diskettestation moet initialiseren.
Doel om FORMAT te implementeren.
FFB1 H.ERRO
Groep BASIC-interpreter
Aanroep:vanuit de foutafhandelingsroutine.
FFB6 H.LPTO
Groep OS
Aanroep:aan het begin van LPTOUT(00A5), de routine die een teken naar
de printer stuurt.
Doel om speciale printers te kunnen aansturen (eventueel met ander-
soortige aansluitingen).
FFBB H.LPTS
Groep OS
Aanroep:aan het begin van LPTSTT(00A8), de routine die de instellingen
van de printer onderzoekt.
Doel om speciale printers te kunnen aansturen(eventueel met ander-
soortige aansluitingen).
FCC0 H.SCRE
Groep BASIC interpreter
Aanroep:bij het uitvoeren van een SCREEN-statement.
FCC5 H.PLAY
Groep BASIC interpreter
Aanroep:bij het uitvoeren van het PLAY-statement.
FFCA H.BEXT
Groep OS
Doel het installeren van apparaat-uitbreidingen die extra OS-
routines bevatten.
---------------------------------------------------------------------
Interessante boeken en/of textfiles over het MSX-Systeem
MSX-Handboek voor gevorderden (Kluwer)
Machinetaal voor MSX-computers(Kluwer)
ROM-BIOS handbook (Terminal Software)
(vertaling 'MSX-REDBOOK')
Sony technical databook (Sony)
MSX-2 Zakboekje (Stark)
* DISKVAR1.TXT (Disk Rom-Ram (Ramon van der Winkel)
* DISKR&R.TXT (Disk Ram en Rom adressen)
(Albert Siersema en Peter Kelders)
= DISKVAR2.TXT
Verder kunt u de diverse tijdschriften erop naslaan die over hooks,
system work-area, BIOS en BASIC-interpreter geschreven hebben.
Gebruikte termen: Haak (Hook) &HFD9A-&HFFCA
OS (BIOS) &H0000-&3FFF
BASIC interpreter &H4000-&H7FFF
System-area &HF380-&HFD99
De vertaling 'HAAK' is zo uit het boek overgenomen en is dus geen ver-
taling van mijzelf. De samensteller van deze tekstfile draagt geen ver-
antwoordelijkheid voor verkeerd gebruik van het hierboven genoemde en
de daardoor eventueel ontstaande schade aan soft en/of hardware.
Groeten Henk, sysop Europoort-BBS.
* = deze zijn tevens te laden uit pascalbbs 24 hrs: 010-4764177
|