Av: Bj|rn Kornefalk <4463>    1985-05-04 00.51.21
 ; April 1985  Bj|rn Kornefalk <4463>
 ; (C) saknas
 ; Skapar enheten MOD som simulerar
 ; en ramfloppy
 ; Kr{ver 64 K minne typ det som anv{ndes
 ; i Mikrodatorn nr 9 - 83
 ;
 ; Programmet {r en prototyp som
 ; bara klarar att lagra ett program
 ; }t g}ngen.
 ;
 ; Max 120 sektorers program kan lagras
 ; (127 om det {ndras lite)
 ; Obs! l{ngs ned i minnet (adress
 ;      0-102 g}t det inte att lagra
 ;      n}gon data pga PIO, NMI som
 ;      hoppar till adress 52,54 resp 102
 ;
 ; Hoppas p} en b{ttre version snabbt!
 ;
 ; upptar 455 bytes inklusive buffert
 ;
INPUT   EQU 21     ; basicens inputrutin
PRINT   EQU 27     ; basicens printrutin
ERR3    EQU 1791   ; error minnet fullt
ASCII   EQU 6240   ; HL->ascii
        ORG 63800  ; startadress
        DEFW 0     ; n{sta enhet
        DEFM "MOD" ; enhetsnamn
        DEFW TABELL ; l{nk till hopptabell
TABELL: JP OPEN    ; OPEN-rutin
        JP OPEN    ; PREPARE-rutin
        JP CLOSE   ; CLOSE-rutin
        JP INPUT   ; INPUT #x
        JP PRINT   ; PRINT #x
        JP BL_IN   ; Block till buffert
        JP BL_UT   ; Block fr}n buffert
BUFF    DEFS 256   ; Buffert 256 bytes
OPEN    LD HL,BUFF
        LD (IX+7),120 ; max radl{ngd
        LD (IX+8),L   ; buffertadress
        LD (IX+9),H
        LD (IX+10),L  ; buffertpekare
        LD (IX+11),H
        LD (IX+12),1  ; b|rja p} sektor 1
        LD (IX+13),253 ; 253 bytes/sektor
        LD (IX+14),0  ; inget skrivet
        LD (HL),3     ; l{gg ned End of text
        DI            ; St{ng av PIO:n
        HALT          ; V{nta p} NMI
        LD HL,0  ; Flytta de 256 bytes
        LD BC,1  ; f|rsta bytes fr}n
LOOP    LD A,0    ; minneskarta 0
        OUT (7),A ; till 1
        LD D,(HL) ; (Se Mikrodator
        LD A,1    ;  nr 10-83)
        OUT (7),A
        LD (HL),D
        INC HL
        DJNZ LOOP
        DEC C
        JR NZ,LOOP
        LD HL,0    ; Ny interuptadress
        LD (52),HL ; f|r PIO:n
        LD (54),HL
        LD (HL),251 ; kod f|r EI
        INC HL
        LD (HL),237 ; halv kod f|r RET I
        INC HL
        LD (HL),77  ; andra halvan
        XOR A
        OUT (7),A
        EI          ; till}t PIO:n att
        RET         ; arbeta
CLOSE   BIT 7,(IX+14) ; N}got skrivet?
        RET Z      ; Om inte s} return
BL_UT   LD A,(IX+12) ; blocknummer
        CP 120 ; Minnet slut (kan s{ttas till 127 om karta 2 eller 3 anv{nds)
        JP Z,ERR3 ; i s} fall ge felmeddelande
        LD L,A
        LD H,0
        LD DE,32755
        CALL ASCII ; skriv ut sektornummer p} sk{rmen
        LD HL,BUFF
        LD D,(IX+12) ; Sektoradress
        LD E,0
        INC (IX+12)
        LD BC,253    ; 253 tecken (255 kan anv{ndas)
        CALL L7DIR  ; Skifta minneskarta g|r LDIR
        LD (IX+13),253 ; 253 lediga tecken
        SET 0,(IX+14)  ; markera utskriven buffert
        LD HL,BUFF
        EX DE,HL
        RET      ; forts{tt i basictolken
BL_IN   LD H,(IX+12) ; Sektoradress
        LD L,0
        LD A,H
        CP 120     ; minnet fullt?
        JP Z,ERR3  ; ge error i s} fall
        INC (IX+12) ; |ka sektortalet
        LD DE,BUFF
        LD BC,253
        CALL L7DIR ; skifta minneskarta, g|r LDIR
        LD HL,BUFF
        RET        ; forts{tt i basicen
L7DIR   LD A,1
        OUT (7),A  ; minneskarta 1
        LDIR       ; flytta sektor till buffert
        XOR A      ; eller tv{rt om
        OUT (7),A  ; A=0, minneskarta 0
        RET
        END
