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ásLPTA: 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átrixbanSPACE 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ásELPT: 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éseKER: 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ésNAMIVAN: 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éseNEMKER PUSH BC ;szegmensszám mentéseVISSZA 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 0P1S DB 0P2S DB 0LPTCIM 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ó=51VIDCIM1: DW 0 ;elsődleges videócím, pixel adatok kezdete DW 0 ;másodlagos videócím, pixel grafikánál nem használtPALETTE: 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 hosszaVEGE EQU $ ;programkód vége, innentől szabad terület END
HEADER 5 ;5-ös típus, vagyis gépi kódú felhasználói program OBJECT filename.com ;lefordított program fájl neve ORG 0100H ;program kezdete, 100H-ra töltödik be