; Fil: EXEMPEL.ASM
; F|r: ABC800-serien, Av Kristoffer Eriksson 1987-05-27

ConWrite:   =     11
StmTbA:     =     65405
Y.Botm:     =     65292              ; Botten av BASIC-minnet
Y.ComTop:   =     65328              ; Toppen av COMMON-variablerna


; Ny l{nk i instruktionslistan.
L{nk.StmTab:DEFW  0                  ; Utrymme f|r gammal STMTBA.
StmTOffs:   DEFB  128                ; F|rsta instruktionskod.
            DEFB  2                  ; 1 instruktion i tabellen.
ExecPtr:    DEFW  ExecTab
            DEFW  TextTab
            DEFW  CmplTab

TextTab:    DEFB  80H
            DEFM  "HEJ"
            DEFB  0FFH

ExecTab:    DEFW  Exec.Hej

CmplTab:    DEFW  Cmpl.Hej

; Kompilera parametrar o dyl till instruktionen.
; Inmatad text vid (HL), Basic-koder till (DE).
Cmpl.Hej:   RET                      ; 'Hej' saknar parametrar.

; Exekvera instruktionen.
Exec.Hej:   PUSH  DE                 ; Skydda Basic-instruktions-pekaren.
            LD    HL,Hej.Text
            LD    BC,Hej.TextEnd - Hej.Text
            CALL  ConWrite           ; Skriv.
            POP   DE
            RET                      ; Slut.

Hej.Text:   DEFM  "Hej sj{lv!"
            DEFB  13, 10
Hej.TextEnd:
ResidentEnd:

;_ Initiering             _
Init:       LD    HL,(StmTba)        ; L{nka in den nya instruktionsl{nken.
            LD    (L{nk.StmTab),HL
            LD    HL,L{nk.StmTab
            LD    (StmTba),HL

            LD    HL,ResidentEnd
            LD    (Y.Botm),HL        ; Skydda det minne programmet ligger i.
            LD    (Y.ComTop),HL
            RET

NUL:        DEFM  "NUL:"
NULEnd:

            REL PUSH Init
            REL CALL                 ; Anropa Init innan relokeringen
                                     ; forts{tter.
            REL PUSH NUL
            REL PUSH NULEnd-NUL
            REL CHAIN                ; CHAIN:a NUL:, dvs avsluta och g|r NEW.
