MACRO EXOS n
RST 30H
DB n
ENDM
ORG 0F0H
;16 bájtos EXOS fejléc
DB 0,5 ;5-ös típus, vagyis gépi kódú felhasználói program
DW VEGE-100H ;hossz 16 biten
DB 0,0,0,0,0,0,0,0,0,0,0,0 ;többi bájt nem használt
;program kezdete, 100H-ra töltödik be
LD SP,100H ;felhasználói veremmutató beállítása, 164 bájt szabad
;Az EXOS-nak saját belsõ verme van a rendszerszegmensben
;EXOS hívások vagy EXOS megszakítás kiszolgálása esetén
;8 bájt kerül felhasználásra a felhasználói verembõl
LD HL,HIBA
LD (0BFF8H),HL ;EXOS melegindítási rutin címének beállítása
;ez a rutin fut le a Reset gomb egyszeri megnyomásakor
;jelen esetben ugyanazt a kilépési rutint használjuk,
;amit egyéb hibák esetén is. A HIBA rutin felszabadítja
;a programunk által használt memóriát, majd szabályosan
;kilép a villogó ENTERPRISE felírathoz.
;így a reset megnyomásakor a program szabályosan kilép,
;nem történik teljes hidegindítás, így a gépben lévõ
;adatok (pl RAMDISK vagy rendszerbõvítõk) megõrzõdnek
LD A,12 ;memória várakozások
OUT (191),A ;tiltása (opcionális :-)
;keretszín feketére állítása
LD BC,100H+27 ;B=1 írás kódja
;C=27 rendszerváltozó száma (BORDER)
LD D,0 ;változó új értéke
EXOS 16 ;EXOS változó kezelése
CALL VID ;egy videó szegmens igénylése
JP NZ,HIBA ;ha nem sikerült, akkor kilépés
LD A,C ;kapott szegmens számának
LD (VIDS),A ;letárolása
OUT (0B3H),A ;szegmens belapozása a 3. lapra
LD DE,0 ;szegmensszám alsó
RRA ;két bitje
RR D ;lesz a videócím
RRA ;felsõ két
RR D ;bítje
LD (VIDCIM1),DE ;ezzel adjuk majd meg
;a pixel adatok helyét
LD HL,3F00H ;a pixel adatok mögött
ADD HL,DE ;lesz a képernyõt leíró
LD (LPTCIM),HL ;sorparaméter tábla videó címe
EXOS 24 ;szegmens igénylése
JP NZ,HIBA ;ha nem sikerült, akkor kilépés
LD A,C ;kapott szegmens számának
LD (P1S),A ;letárolása
OUT (0B1H),A ;és belapozása az 1. lapra
EXOS 24 ;szegmens igénylése
JP NZ,HIBA ;ha nem sikerült, akkor kilépés
LD A,C ;kapott szegmens számának
LD (P2S),A ;letárolása
OUT (0B2H),A ;és belapozása a 2. lapra
LD HL,4000H ;minden
LD DE,4001H ;kapott
LD (HL),L ;memória
LD BC,0C000H ;törlése
LDIR
LD HL,LPT ;sorparaméter tábla
LD DE,0FF00H ;másolása a videó
LD BC,LPTH ;szegmens végére
LDIR
LD HL,(LPTCIM) ;LPT videó címe
LD B,4 ;4 bittel elforgatás
LPTA: SRL H
RR L
DJNZ LPTA
LD A,L ;alsó bájt
OUT (82H),A ;kiküldése NICK-nek
LD A,H ;felsõ 4 bit
OR 0C0H ;NICK futás engedélyezése,
;és áttérés az új LPT-re
;az aktuális képkocka végén
OUT (83H),A ;kiküldés NICK-nek
;készen áll a memória, és felépült a 320x200-as 4 színû képernyõ
;kezdõdhet a fõprogram
DI
LD A,8 ;SPACE sorának
OUT (0B5H),A ;kijelõlése a billentyûzet mátrixban
SPACE IN A,(0B5H) ;billentyûzet mátrix kijelölt sorának olvasása
BIT 6,A ;SPACE gomb lenyomva?
JR NZ,SPACE ;várakozás, ha nem
JP HIBA ;kilépés
;EP billentyûzetmátrix:
; b7 b6 b5 b4 b3 b2 b1 b0
;Sor 80H 40H 20H 10H 08H 04H 02H 01H
; 0 B.SH. Z X V C B \ N
; 1 CTRL A S F D G LOCK H
; 2 TAB W E T R Y Q U
; 3 ESC 2 3 5 4 6 1 7
; 4 F1 F2 F7 F5 F6 F3 F8 F4
; 5 ERASE ^ 0 - 9 8
; 6 ] : L ; K J
; 7 ALT ENTER BAL HOLD FEL JOBB LE STOP
; 8 INS SPACE J.SH. . / , DEL M
; 9 [ P @ 0 I
HIBA: DI
LD SP,100H ;felhasználói veremmutató beállítása
LD A,255 ;rendszerszegmens
OUT (0B2H),A ;2. lapra
LD HL,HIBA
LD (0BFF8H),HL ;melegindítási cím beállítása
LD HL,(0BFF4H) ;EXOS LPT címe
SET 6,H ;konvertálás videócímmé
LD B,4 ;4 bittel elforgatás
ELPT: SRL H
RR L
DJNZ ELPT
LD A,L ;alsó bájt
OUT (82H),A ;kiküldése NICK-nek
LD A,H ;felsõ 4 bit
OR 0C0H ;NICK futás engedélyezése,
;és áttérés az új LPT-re
;az aktuális képkocka végén
OUT (83H),A ;kiküldés NICK-nek
LD A,0F5H ;eredeti
LD HL,1837H ;EXOS IRQ rutin
LD (38H),A ;kezdetének
LD (39H),HL ;visszaállítása
;arra az esetre, ha a 38H-ra
;helyezett JP-vel átvettük volna
;saját rutinnal az IRQ kezelést
LD C,40H ;felhasználói RAM felszabadítása
EXOS 0 ;rendszer reset hívása
LD A,1 ;1-es ROM szegmens
OUT (0B3H),A ;3-as lapra
LD A,6 ;6-os funkció=bejelentkezõ képernyõ
JP 0C00DH ;vezérlés átadása a ROM-nak, vagyis kilépés
;videószegmens igénylõ rutin
VID: LD HL,VEGE ;puffer terület
LD (HL),0 ;lista elejének jelzése
KER: EXOS 24 ;szegmens igénylése
JR Z,NAMIVAN ;siker esetén szegmensszám vizsgálat
CP 7FH ;hibakód=a kiutalt szegmens a rendszerrel
;megosztott közös használatú?
JP NZ,HIBA ;egyéb hiba esetén kilépés
NAMIVAN: EX AF,AF' ;hibakód háttérbe
LD A,C ;kapott szegmens száma
CP 0FCH ;<0FCh?, azaz mint a legkisebb
;videószegmens
JR NC,NEMKER ;kilépés hamár videó
;szegmenst kaptunk
INC HL ;következõ puffercím
LD (HL),C ;szegmensszám letárolása
JR KER ;újabb szegmens igénylése
NEMKER PUSH BC ;szegmensszám mentése
VISSZA LD C,(HL) ;felesleges szegmens
EXOS 25 ;felszabadítása
DEC HL ;elözõ puffercím
JR Z,VISSZA ;felszabadítás folytatása
;amikor a lista elején lévõ 0-val hívjuk
;a szegmens felszabadítása funkciót, akkor
;hiba keletkezik, amely az NZ flag-gel kilép
;a ciklusból (0=ROM, így nem lehet felszabadítani)
EX AF,AF' ;hibakód elõtérbe
POP BC ;kapott szegmensszám
OR A ;Z flag beállítása a hibakód alapján
;NZ jelzi ha megosztott szegmenst kaptunk
RET
VIDS DB 0
P1S DB 0
P2S DB 0
LPTCIM DW 0
;NICK sorparaméter tábla (LPT)
LPT: DB -200 ;200 sor
DB 32H ;0 01 1 001 0
;VINT=0, nincs megszakítás
;Colour Mode=01, 4 szín mód
;VRES=1, teljes függõleges felbontás
;Video Mode=001, pixel grafikus mód
;Reload=0, még nincs vége az LPT-nek
DB 11 ;bal margó=11
DB 51 ;jobb margó=51
VIDCIM1: DW 0 ;elsõdleges videócím, pixel adatok kezdete
DW 0 ;másodlagos videócím, pixel grafikánál nem használt
PALETTE: DB 0,36,219,73,0,0,0,0 ;fekete, kék, sárga, piros (a nem használt színek feketék)
DB -50,12H,63,0,0,0,0,0,0,0,0,0,0,0,0,0
;50 keretszínû sor, ez határozza meg a also margó nagyságat,
DB -3,16,63,0,0,0,0,0,0,0,0,0,0,0,0,0
;3 fekete sor, a szinkronizáció kikapcsolva
DB -4,16,6,63,0,0,0,0,0,0,0,0,0,0,0,0
;4 sor, a szinkronizacio bekapcsolva
DB -1,90H,63,32,0,0,0,0,0,0,0,0,0,0,0,0
;1 sor, a szinkronizáció a sor felénél kikapcsol,
;a NICK chip ennél a sornal ad megszakitást
DB 252,12H,6,63,0,0,0,0,0,0,0,0,0,0,0,0
;4 fekete sor
DB -50,13H,63,0,0,0,0,0,0,0,0,0,0,0,0,0
;50 keretszínû sor, ez határozza meg a felsõ margó nagyságát
LPTH: EQU $-LPT ;LPT hossza
VEGE EQU $ ;programkód vége, innentõl szabad terület
END