TITLE ACORN ATOM TERMINAL V4.30; --------------- versie 1.xx ----------------- augustus 1993 --------------- ; Initiele versie met basis-support. ; --------------- versie 2.xx ----------------- december 1993 --------------- ; In versie 2.xx zijn nieuwe commando's en control codes toegevoegd. Enkele ; bestaande routines zijn wat aangepast. Met name routines die met het scherm ; werken zijn gewijzigd in verband met het ondersteunen van meerdere scherm- ; pagina's in tekst mode. ; Routines waar ingrijpende wijzigingen zijn aangebracht zijn voorzien van ; extra commentaar omtrent de functie en plaats van de wijziging. In de ; meeste gevallen zijn dat de grafische routines voor extended video. Alle ; routines zijn upwards compatible met de routines uit versie 1.xx. ; --------------- versie 2.20 -------------------- maart 1994 --------------- ; Vanaf versie 2.20 is er geen specifieke ondersteuning meer voor Hercules- ; kaarten. Herculeskaarten kunnen met het bij versie 2.xx geleverde MSHERC ; programma toch gebruik maken van deze ATOM.COM. ; Uitbreidingen zijn o.a. toevoeging van grafische uitbreidingen. ; --------------- versie 3.xx ------------------ oktober 1995 --------------- ; Diverse nieuwe commando's. Bij initialiseren van CLEAR 0 wordt geprobeerd ; om ATOMVDU.FNT automatisch te laden vanuit de directory C:\ATOM\FONT. ; --------------- versie 3.11 ----------------- december 1995 --------------- ; Versie 3.11 is voornamelijk een testversie voor de floating point ; uitbreidingen die gebruik maken van de 80387 en hoger. ; --------------- versie 3.12 -------------------- april 1996 --------------- ; Versie 3.12 bevat diverse uitbreidingen. O.a. sleur & pleur support voor ; OS/2 en Windows95. ; --------------- versie 4.00 ------------------ augustus 1997 -------------- ; Versie 4.00 verbeterde soundroutine; niet meer gebaseerd op gewijzigde ; timer interrupt. Nu volgens tijd in bios-variabele. ; Routines voor communicatie met losse Atom via AIC-kabel. Implementatie ; XMS geheugen v2.00 (hierdoor is losse driver niet meer nodig). ; Sprite implementatie tot 1024 sprites. ; --------------- versie 4.1x --------------------- maart 1998 -------------- ; Versie 4.1x levert een betere ondersteuning aan de implementatie van ; BBC Basic op de Atom-in-PC kaart. Een instelbare optie voor Atom/BBC mode ; wijzigt de afhandeling van control codes. Verder is het aantal beschikbare ; control codes uitgebreid conform BBC basic specificaties. ; --------------- versie 4.2x ------------------- januari 1999 -------------- ; In versie 4.2x loopt de ontwikkeling van BBC Basic support verder, ; daarnaast implementatie van FastVideo voor CLEAR4 emulatie en Direct ; Video Access voor snellere EGA/VGA graphics in 16 kleuren modi. ; --------------------------------------------------------------------------- CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG ORG 100H AAT: JMP ATOMTERM ; -------------------------------------------------------------------------- ; CONSTANTEN, VARIABELEN EN TABELLEN ; -------------------------------------------------------------------------- CRLF DB 10,13,'$' ERR_MSG DB '*** Ongeldig commando : $' FUN_ERR DB ', subfunctie : $' MOD_ERR DB '*** Videomode niet ondersteund door ' DB 'videokaart',10,13,'$' ATOMVDUFNT DB 'C:\ATOM\FONT\ATOMVDU.FNT',0 TOONH DB ? ; TOONHOOGTE BELL SIGNAAL TOOND DB ? ; TOONDUUR BELL SIGNAAL REGELS DB ? ; AANTAL AFGEDRUKTE REGELS IN PAGEMODE SCHERMSTATUS DB ? ; CONTROLE VOOR TEKST NAAR SCHERM STUREN PRINTERSTATUS DB ? ; CONTROLE VOOR TEKEN NAAR PRINTER STUREN PAGEMODE DB ? ; CONTROLE VOOR PAGEMODE AAN/UIT CAPSSTATUS DB ? ; STATUS VAN CAPS LOCK TOETS COMMANDONR DB ? ; GEBRUIKT VOOR OPSLAG VAN COMMANDO NUMMER MSB DB 0FFH ; CONTROLE VOOR BIT 7 WEL/NIET STRIPPEN KLEUR DB 7 ; TEKST ATTRIBUUT BIJ OPSTARTEN KLEUR_EO DW 0 ; PIXEL=(PIXEL AND LB) XOR HB CURLINES DW 0607H ; VORM VAN DE CURSOR VENSTER_XLO DB 0 ; COORDINATEN TEKSTVENSTER VENSTER_YLO DB 24 ; " VENSTER_XRB DB 79 ; " VENSTER_YRB DB 0 ; " GWINDOW_XLO DW 0 ; COORDINATEN GRAFISCH VENSTER GWINDOW_YLO DW -1 ; " GWINDOW_XRB DW -1 ; " GWINDOW_YRB DW 0 ; " OORSPRONG_X DW 0 ; OFFSET VOOR GRAFISCHE OORSPRONG OORSPRONG_Y DW 0 ; " SCHERMPAG DB 0 ; SCHERMPAGINA NUMMER VOOR BEWERKINGEN RESETTOETS DB 83 ; CODE VOOR RESET TOETS (DEL, esc OF F12) PRNNR DB 0 ; NUMMER VAN GESELECTEERDE PRINTERPOORT CENR DB 0 ; CRITICAL ERRORNUMMER VIDEOKAART DB ? ; KEUZE VAN OPGEGEVEN VIDEO KAART ATOMPALET DB ? ; ATOM COLOUR PALET STATUS PPI_ADDR DW ? ; BASISADRES VAN 8255 OP ATOMKAART PRT_ADDR DW ? ; BASISADRES VAN PRINTERPOORT VOOR AIC FILEATTR EQU THIS BYTE TEMP DW 32 DUP (?) ; GEBRUIKT VOOR WERKRUIMTE DIV. ROUTINES OFF09 DW ? ; OPSLAG OUDE TOETSENBORD INTERRUPT VECTOR SEG09 DW ? ; " OFF60 DW ? ; OPSLAG OUDE INT60 VECTOR SEG60 DW ? ; " JOY_LINKS DW ? ; NEUTRAALSTAND VAN JOYSTICK JOY_RECHTS DW ? ; " JOY_BOVEN DW ? ; " JOY_ONDER DW ? ; " DVA_ACTIVE DB 00H ; DIRECT VIDEO ACCESS ACTIEF VLAG FUN_CODE DB ? ; SUBFUNCTIE ERROR CODE WACHT_HW DW 00H ; HI-WOORD WACHTTIJD VOOR FUNCTIE 5EH WACHT_LW DW 01H ; LO-WOORD WACHTTIJD VOOR FUNCTIE 5EH WACHT_VLAG DB ? ; VLAG VOOR WACHTTIJD - FUNCTIE 5EH LINE_STYLE DW 0FFFFH ; DEFAULT LIJN STIJL RESETYPE DB 0 ; RESET TYPE: TERMINAL START KEYBUFFSTAT DW 0 ; STATUS VAN AUTORUN BUFFER VIDEOTABEL DW 32 DUP (-1); TABEL MET ONDERSTEUNDE VIDEO MODI PAINTPAGE DB 0 ; XMS PAGE NUMMER VOOR PAINT PATRONEN SPRPAGE DB 0 ; XMS PAGE NUMMER VOOR SPRITES SPRMAX DW 0 ; HOOGSTE SPRITE NUMMER SPROFFSETL DW ? ; OFFSET BEGINADRES VAN SPRITES IN XMSGEHEUGEN SPROFFSETH DW ? SPRCURR DW ? ; HUIDIGE SPRITENUMMER IN FUNCTIE JERRY DB 0 ; MUIS DETECTIE VLAG CLEAR4MUIS DB 0 ; MUIS ACTIEF BIJ CLEAR4 EMULATIE BBC DB 0 ; CONTROL CODE SWITCH ATOM(0)/BBC(1) MODE BBCFCOLT DB 7 ; BBC TEXT FOREGROUND COLOUR BBCBCOLT DB 0 ; BBC TEXT BACKGROUND COLOUR BBCFCOLG DB 7 ; BBC GRAPHICS FOREGROUND COLOUR BBCBCOLG DB 0 ; BBC GRAPHICS BACKGROUND COLOUR BBCGCOL DB 0 ; BBC GRAPHICS GCOL OPTION BBCPCOLOUR DB ? ; BBC PIXEL COLOUR BBCOLDX DW ? ; BBC LAST PLOTTED FYSICAL PIXEL X BBCOLDY DW ? ; BBC LAST PLOTTED FYSICAL PIXEL Y BBCX1 DW ? ; BBC LAST GRAPHICS POSITION BBCY1 DW ? ; BBC LAST GRAPHICS POSITION BBCX2 DW ? ; BBC PRE LAST GRAPHICS POSITION BBCY2 DW ? ; BBC PRE LAST GRAPHICS POSITION BBCXT DB 0 ; BBC TEXT POSITION BBCYT DB 0 ; BBC TEXT POSITION BBCSCREEN DB ? ; BBC MODE BBCPWIDTH DB ? ; BBC GRAPHICS PIXEL WIDTH BBCPMASK DB ? ; BBC GRAPHICS PIXEL NR OF BITS COMTABEL DW DRUKAF, KEY, COPY, GPLOT, IGRAPH, SIMULATE4 DW RAMFNT, SCHRIJF, SCHAAL, CURSOR_ON, CURSOR_OFF DW LOADFILE, SAVEFILE, CAT, CHDIR, RMDIR, MKDIR DW DELETE, FLOCK, UNLOCK, DRIVE, MSDOS, HIDE, UNHIDE DW INFO, GELUID, BLIEP, ERRMSG, KNAAGDIER, DEFMUISMASKER DW CURSORPOS, VIDEO, SERPOORT, PARPOORT, DOSFUNCTIE DW PORT_IN, PORT_OUT,UDS, MOUSE_MOT,WHOAMI,CLEAR0 DW PALET,CLEAR1,CLEAR1A,CLEAR2,CLEAR2A,CLEAR3,CLEAR3A DW CLEAR4,CLEAR4A,VIDEOMOD,VIDEOCOL,SCHRIJFPIX,WINDOW DW WINDOW_OFF,JOYSTICK,CALLIBRATE,BIT7,BIOSKEY,SHELL DW ZOEKFILE, ZOEKNEXT,LPT, RAF_OPEN, RAF_SLUIT DW RAF_SCHRIJF, RAF_LEZEN, RAF_MOVE_PTR, RAF_LEES_EXT DW MOUSEKAR, VERSIE, TEKEN2LPT, CGABITMAP, HFILL, VFILL DW ROEP61,GWINDOW, GWOFF, OORSPRONG, VIEWSCHERM DW WERKSCHERM, CURSORDEF, ERROR, ERROR, ERROR DW EGAFONT, EGA8X14, EGA8X8, PUTWIN, GETWIN DW SHAPES, DIR_VID_ACC, KOPYPAGE, ASCII_SCAN, WACHTEN DW PAINT, INITCLEAR0, RAF_BLOCK, FPFUN, AIC, XMS DW SPRITES DW 159 DUP (ERROR) CTRLTAB DW LEESCOM, CTRL_A , CTRL_B , CTRL_C , CTRL_D , CTRL_E DW CTRL_F , CTRL_G , CTRL_H , CTRL_I , CTRL_J , CTRL_K DW CTRL_L , CTRL_M , CTRL_N , CTRL_O , CTRL_P , CTRL_Q DW CTRL_R , CTRL_S , CTRL_T , CTRL_U , CTRL_V , CTRL_W DW CTRL_X , CTRL_Y, CTRL_Z , LEESCOM, CTRL_KM, CTRL_MN DW HOME , CTRL_SL KEYTAB DB 00H,71H,2CH,51H,44H,45H,46H,47H,40H,10H,17H,16H,15H DB 14H,13H,2BH,4AH,4BH,4CH,4DH,4EH,4FH,48H,18H,1FH,1EH DB 1DH,1CH,23H,43H,53H,54H,55H,56H,39H,50H,20H,27H,26H DB 25H,24H,3CH,00H,1BH,73H,74H,75H,76H,77H,70H,28H,2FH DB 2EH,2DH,00H,06H,00H,37H,00H,3DH,3EH,3FH,38H,0EH,0DH DB 0CH,0BH,08H,0FH,00H,00H,09H,2AH,21H,04H,33H,00H,31H DB 07H,0AH,32H,29H,1AH,19H,00H,00H,00H,67H,68H,69H,04H DB 64H,65H,66H,07H,61H,62H,63H,60H,6AH ;KBMATRIX DB 99H,05H,21H,11H,01H,92H,82H,72H,62H,52H ; DB 42H,31H,02H,32H,41H,51H,04H,45H,23H,95H ; DB 75H,25H,65H,84H,24H,14H,80H,60H,61H,99H ; DB 63H,85H,33H,13H,03H,94H,74H,64H,54H,22H ; DB 73H,50H,99H,70H,15H,35H,43H,55H,53H,34H ; DB 44H,12H,93H,83H,99H,99H,99H,90H,40H TWINTAB DB 24,24,24,24,24,24,24,24,24,24 DB 24,24,24,24,24,24,24,29,24,24 DB 24,24,29,29,24,24,29,36,36,47 DB 47,24 ; Onderstaande tabellen bevatten een aantal parameters voor de acht BBC modi PWIDTHTAB DB 1,2,4,0,2,4,0,0 ; pixelgrootte PMASKTAB DB 1,3,15,0,1,3,0,0 ; aantal bits per pixel BBCSCRTAB DB 18,18,18,3,18,18,1,1 ; pc videomode BBCDEFCOL DB 1,3,7,1,1,3,1,1 ; default voorgrondkleur BBCPALET2 DB 0,7,2,3,4,5,6,1 ; palet 2 kleuren modi BBCPALET4 DB 0,4,6,7,3,5,2,1 ; palet 4 kleuren modi BBCPALET16 DB 0,4,2,6,1,5,3,7 ; palet 16 kleuren mode DB 0,4,2,6,1,5,3,7 ; en dat noemen ze 16 kleuren BBCMAXX DB 79,39,19,79,39,19,39,39 ; aantal karakters per regel BBCMAXY DB 31,31,31,24,31,31,24,24 ; aantal regels per scherm BBCDOTPATTRN DW 0C0C0H,0F0F0H,0FF00H ; stippellijn patronen DW 00000H,0F0F0H,0FF00H ;---------------------------------------------------------------------------- ; INCLUDE ROUTINES ;---------------------------------------------------------------------------- INCLUDE ATOMISA.INC ;INCLUDE REMATOM.INC ;INCLUDE RASERIAL.INC INCLUDE MUIZPTR.INC INCLUDE EGA.INC INCLUDE EGAFONT.INC INCLUDE SETUP.INC INCLUDE SOUND.INC INCLUDE ATOMERR.INC INCLUDE EXEC.INC INCLUDE RANDACC.INC INCLUDE GRAPHICS.INC INCLUDE 80x87.INC INCLUDE XMS.INC INCLUDE SPRITES.INC INCLUDE DVA16.INC INCLUDE AWINDOWS.INC ;---------------------------------------------------------------------------- P286 P287 ; --------------------------------------------------------------------------- ; SUBROUTINES VOOR SYSTEEM (DIENEN NIET DOOR GEBRUIKER AANGEROEPEN TE WORDEN) ; --------------------------------------------------------------------------- CTRLBREAK PROC NEAR IRET ; CTRL-BREAK NEGEREN CTRLBREAK ENDP CRITERR PROC NEAR MOV AX,DI ; FOUTCODE NAAR AX MOV CENR,AL ; ZET IN CE-VLAG MOV AL,3 ; DOS FUNCTIE BEEINDIGEN MET FOUTCODE IRET CRITERR ENDP HEX PROC NEAR ; Druk AL af als hexadecimaal getal MOV DH,AL MOV AH,2 ; DOS FUNCTIE : TEKENUITVOER MOV CL,4 ; LAADT AANTAL SCHUIFOPDRACHTEN SHR AL,CL ; ZET HOGE NIBBLE IN LAGE NIBBLE CMP AL,10 ; TEST OP HEXADECIMALE DIGIT JB HOGENIBB ; SPRING GEWOON CIJFER ADD AL,07 ; MAAK ER EEN LETTER VAN HOGENIBB: ADD AL,'0' ; MAAK ER EEN HEX DIGIT VAN MOV DL,AL ; ZET KARAKTER IN DL INT 21H ; DRUK DIGIT AF MOV AL,DH AND AL,0FH ; VERWAARLOOS HOGE NIBBLE CMP AL,10 ; TEST OP HEXADECIMALE DIGIT JB LAGENIBB ; SPRING GEWOON CIJFER ADD AL,07 ; MAAK ER EEN LETTER VAN LAGENIBB: ADD AL,'0' ; MAAK ER EEN HEX DIGIT VAN MOV DL,AL ; ZET TEKEN IN DL INT 21H ; DRUK DIGIT AF RET HEX ENDP reset_keyboard PROC NEAR push ax push ds push cs pop ds cli in al,61H mov ah,al or al,80H out 61H,al xchg ah,al out 61H,al mov al,20H out 20H,al sti mov al,0CH push ax xor ax,ax ;segment BIOS variabelen mov ds,ax pop ax ;'al' = 'keymask' not al ;complement van 'keymask' and ds:[417H],al ;toetsenbord status byte pop ds pop ax ret reset_keyboard ENDP NEWINT09 PROC PUSH AX ; SAVE AX PUSH DS ; LEES KEYBOARD STATUS XOR AX,AX ; UIT BIOSVARIABELEN MOV DS,AX MOV AL,DS:[417H] AND AL,0Fh POP DS CMP AL,0CH ; IS CTRL-ALT? JNE INT09END ; SPRING INDIEN NIET IN AL,60H ; LEES SCAN CODE CMP AL,RESETTOETS ; IS RESET TOETS OOK GEDRUKT JE NEWINT09_1 ; JA DAN RESET PROGRAMMA STACK CMP AL,4FH ; IS CTRL-ALT-END JNE INT09END CALL RESET_KEYBOARD ; SPREEKT VOOR ZICH JMP MSDOS ; GA PROGRAMMA BEEINDIGEN NEWINT09_1: CALL RESET_KEYBOARD ; SPREEKT VOOR ZICH MOV AX,CS ; INHOUD VAN CS NAAR AX MOV DS,AX ; ZET IN DS MOV SS,AX ; EN IN SS LEA AX,ENDSTACK-2 ; RESET STACK POINTER MOV SP,AX MOV RESETYPE,1 ; ZET RESET TYPE JMP RESET ; RESET ATOM EN BEGIN OPNIEUW INT09END: POP AX ; HERSTEL AX JMP DWORD PTR CS:OFF09 NEWINT09 ENDP ; --------------------------------------------------------------------------- ; INT60 HANDLER, vanaf versie 2.xx ; AH = 0 -> zend byte in AL van pc naar atom ; AH = 1 -> lees byte in AL van atom naar pc ; AH = 2 -> lees statusregister in AL, DX = basisadres 8255 ppi ; Na aanroep van deze interrupt is de carry vlag gewist als de functie ; uitgevoerd is en gezet bij een fout (niet herkende functie). Alleen ; AL en DX kunnen veranderd zijn. Overige registers blijven ongewijzigd ; --------------------------------------------------------------------------- NEWINT60 PROC PUSH DS ; SAVE DS OP STACK PUSH CS ; CS NAAR DS KOPIEREN POP DS CMP AH,0 ; FUNCTIE 0 ? JE NEWINT60_0 ; JA, DAN GA FUNCTIE UITVOEREN CMP AH,1 ; IDEM VOOR FUNCTIES 1 EN 2 JE NEWINT60_1 CMP AH,2 JE NEWINT60_2 STC ; ONBEKENDE FUNCTIE, ZET CARRY JMP SHORT ENDINTR60 ; SPRING NAAR EINDE VAN ROUTINE NEWINT60_0: CALL ZENDBYTE ; STUUR BYTE NAAR DE ATOM JMP SHORT ENDINT60 ; SPRING NAAR EINDE NEWINT60_1: CALL LEESBYTE ; LEES BYTE VAN ATOM JMP SHORT ENDINT60 ; SPRING NAAR EINDE NEWINT60_2: MOV DX,PPI_ADDR ; LAADT STATUSREGISTER ADRES ADD DX,2 IN AL,DX ; LEES STATUSREGISTER SUB DX,2 ; DX WORDT BASISADRES PPI ENDINT60: CLC ; WIS CARRY, FUNCTIE IS GEVOERD ENDINTR60: POP DS ; DS HERSTELLEN IRET ; EINDE INTERRUPT ROUTINE NEWINT60 ENDP ; --------------------------------------------------------------------------- ; COMMUNICATIE-SUBROUTINE voor bbc-basic ; --------------------------------------------------------------------------- LEESBBC PROC NEAR ; ALT. LEES BYTE IN BBC MODE CALL LEESBYTE ; LEES BYTE VAN ATOM CMP AL,0 ; TEST OP EEN NULL-BYTE JNE LEESBBC1 ; NIEKS AAN DE HAND INDIEN GEEN NULL CMP BBC,1 ; TEST OP BBC MODE JNE LEESBBC1 ; NIEKS AAN DE HAND IN ATOM MODE CALL LEESBYTE ; NULL BYTE IN BBC MODE TWEE KEER LEZEN LEESBBC1: RET ; EINDE ROUTINE LEESBBC ENDP ; --------------------------------------------------------------------------- ; HOOFDPROGRAMMA INITIALISATIE ; --------------------------------------------------------------------------- ATOMTERM PROC NEAR MOV AX,0002H INT 10H ; ZET VIDEO MODE MOV DX,OFFSET error0 MOV AH,09H INT 21H ; call melding ; alleen bij test versies ! SETUP ; ZET HARDWARE INSTELLINGEN TESTATOM: CMP PPI_ADDR,0 ; TEST OF ATOM AANWEZIG IS JNE INIT ; SPRING INDIEN ATOM AANWEZIG LEA DX,GEENATOM ; LAADT TEKST VOOR FOUTMELDING MOV AH,09H ; DRUK TEKST AF INT 21H MOV AX,4C01H ; PROGRAMMA EINDIGEN MET FOUTCODE 1 INT 21H ; --------------------------------------------------------------------------- ; ZET NIEUWE VECTOREN EN INITIALISEER STACK POINTER ; --------------------------------------------------------------------------- INIT: MOV DX,OFFSET CTRLBREAK MOV AX,2523H ; ZET NIEUWE CTRL-BREAK HANDLER INT 21H MOV DX,OFFSET CRITERR MOV AX,2524H ; ZET NIEUWE CRITICAL ERROR HANDLER INT 21H MOV AX,3509H ; SAVE OUDE INT09 HANDLER INT 21H MOV OFF09,BX MOV SEG09,ES MOV DX,OFFSET NEWINT09 ; ZET NIEUWE INT09 HANDLER MOV AX,2509H INT 21H MOV AX,3560H ; SAVE OUDE INT60 HANDLER INT 21H MOV OFF60,BX MOV SEG60,ES MOV DX,OFFSET NEWINT60 ; ZET NIEUWE INT60 HANDLER MOV AX,2560H INT 21H MOV DX,OFFSET RAMFONT MOV AX,251FH ; ZET POINTER NAAR CGA BITMAP INT 21H LEA AX,ENDSTACK-2 ; RESET STACK POINTER MOV SP,AX XOR AX,AX ; BEPAAL AANWEZIGHEID VAN MUIS INT 33H ; (voor functie sprmouse) NOT AL ; INVERTEER RESULTAAT AND AL,01000000B ; ALLEEN BIT 6 OPSLAAN MOV JERRY,AL ; ZET MUISVLAG (40h=geen muis) ; --------------------------------------------------------------------------- ; NIET GEBRUIKTE GEHEUGENRUIMTE VRIJGEVEN ; --------------------------------------------------------------------------- LEA BX,ENDSTACK ; LAADT LAATSTE ADRES ADD BX,15 ; PARAGRAAF VOLMAKEN MOV CL,4 ; AANTAL BENODIGDE PARA'S BEREKENEN SHR BX,CL PUSH CS ; CS REGISTER COPIEREN NAAR ES REG. POP ES MOV AH,4AH ; DOS FUNCTIE 4A INT 21H ; GERESERVEERD GEHEUGEN VERANDEREN ; --------------------------------------------------------------------------- ; INITIALISATIE HARD EN SOFTWARE INSTELLINGEN ; --------------------------------------------------------------------------- CALL HW_INIT ; INITIALISEER DE HARDWARE RESET: MOV AX,0040H ; BIOS VAR. SEGMENT NAAR ES MOV ES,AX MOV AL,ES:17H ; KEYBOARD STATUS NAAR AL AND AL,0FH ; RESET INS, CAPS, NUM EN SCROLL OR AL,60H ; ZET CAPS EN NUM AAN MOV ES:17H,AL ; NIEUWE KEYBOARD STATUS NAAR RAM MOV AH,1 ; DOE KEYBOARD SCAN INT 16H ; - past leds automatisch aan - CALL JOYCALLI ; CALLIBREER JOYSTICK IN AL,61H ; LUIDSPREKER STUURBIT INLEZEN AND AL,11111100B ; TWEE LAAGSTE BITS WISSEN OUT 61H,AL ; LUIDSPREKER UIT MOV KLEUR,07H ; RESET SCHERM ATTRIBUUT MOV VENSTER_XRB,79 ; RESET VENSTER MOV VENSTER_YRB,0 MOV VENSTER_XLO,0 MOV VENSTER_YLO,24 MOV FUN_CODE,0 ; RESET SUBFUNCTIE ERROR CODE MOV BBC,0 ; STANDAARD IN ATOM MODE WERKEN CALL HW_RESET ; RESET DE ATOM-KAART GEENRESET: MOV AH,2 ; BEPAAL CAPS LOCK STATUS INT 16H AND AL,01000000B MOV CAPSSTATUS,AL ; ZET CAPS VLAG MOV TOONH,50 ; ZET BELL TOONHOOGTE MOV TOOND,04 ; ZET BELL TOONDUUR MOV PRINTERSTATUS,0 ; PRINTER DISABLED MOV SCHERMSTATUS,1 ; SCHERM AAN MOV PAGEMODE,0 ; PAGEMODE UIT MOV SCHERMPAG,0 ; SCHERMPAGINA 0 ; --------------------------------------------------------------------------- ; COMMANDO INTERPRETER ; --------------------------------------------------------------------------- CLEARSCR: MOV AX,0002H INT 10H ; ZET VIDEO MODE CALL LEESBYTE ; LEES EERSTE COMMANDO VAN ATOM PUSH AX ; SAVE GELEZEN BYTE MOV REGELS,0 ; RESET REGELTELLER VOOR PAGEMODE POP AX ; HAAL DATA TERUG JMP SHORT LABEL1 ; GEDWONGEN SPRONG LEESCOM: CALL LEESBYTE ; LEES COMMANDO VAN ATOM LABEL1: CMP AL,00H ; TEST OF EEN COMMANDO GEGEVEN WORDT JNE DRUKAF ; SPRING VOOR KARAKTER AFDRUKKEN JMP COMMANDO ; GA COMMANDO UITVOEREN DRUKAF: CMP AL,02H ; PRINTER AAN/UIT DIRECT UITVOEREN JE GOTOCTRL CMP AL,03H JNE DRUKAF2 GOTOCTRL: JMP CTRLCODE1 DRUKAF2: CMP PRINTERSTATUS,0 ; TEST OF PRINTER AAN STAAT JE DRUKAF0 ; SPRING INDIEN PRINTER UIT STAAT MOV AH,02H ; PRINTER STATUS LEZEN MOV DL,PRNNR ; LEES PRINTERNUMMER XOR DH,DH INT 17H CMP AH,90H ; KIJK OF PRINTER GEREED IS JE NAAR_PRINTER ; JA, DAN SPRING OM AF TE DRUKKEN MOV BX,0B800H ; ZET ES NAAR VIDEORAM MOV ES,BX MOV BX,WORD PTR ES:0 ; LEES SCHERMDATA MOV ES:0,8750H ; KNIPPERENDE 'P' LINKSBOVEN IN BEELD PRINTER_OFF: MOV AH,02H INT 17H ; WACHT TOT PRINTER GEREED IS CMP AH,90H JNE PRINTER_OFF ; SPRING ALS NOG STEEDS FOUT MOV WORD PTR ES:0,BX ; HERSTEL SCHERMDATA NAAR_PRINTER: XOR AH,AH ; PRINTER FUNCTIE: TEKEN AFDRUKKEN INT 17H DRUKAF0: CMP AL,' ' ; TEST OF KARAKTER EEN CTRL CODE IS JB CTRLCODE ; JA, SPRING NAAR APARTE ROUTINE DRUKAF1: MOV AH,SCHERMSTATUS ; TEST OF SCHERM AAN STAAT CMP AH,00 JZ LEESCOM ; SPRING INDIEN SCHERM UIT MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER DOSPRINT: AND AL,MSB ; STEL 7e BIT IN CMP AL,7FH ; TEST OP BACKSPACE JNE DOSPRINT2 MOV AH,03H ; CURSOR POSITIE OPVRAGEN INT 10H CMP DL,VENSTER_XLO ; CURSOR AAN BEGIN VAN REGEL ? JE DOSPRINT1 ; JA, CURSOR EERST NAAR VORIGE REGEL DEC DL ; CURSOR EEN POSITIE NAAR LINKS DOSPRINT_WIS: MOV AH,02H INT 10H MOV AX,0A20H ; VERVOLGENS EEN SPATIE AFDRUKKEN MOV CX,1 INT 10H JMP LEESCOM ; EINDE ROUTINE DOSPRINT1: CMP DH,VENSTER_YRB ; OP BOVENSTE SCHERMREGEL? JE CTRL_G ; DAN IS ER NIETS TE DELETEN! DEC DH ; CURSOR EEN REGEL OMHOOG MOV DL,VENSTER_XRB ; EN NAAR EIND VAN REGEL JMP SHORT DOSPRINT_WIS DOSPRINT2: MOV AH,09H ; VIDEO: TEKEN EN ATTR SCHRIJVEN MOV BL,KLEUR ; ATTRIBUUT MOV CX,1 ; TEKEN SLECHTS EEN KEER AFDRUKKEN INT 10H ; FUNCTIE UITVOEREN JMP CTRL_I ; GA VERDER MET CURSOR OPSCHUIVEN CTRLCODE: MOV COMMANDONR,00H ; ZET FICTIEF COMMANDONUMMER CMP AL,06H ; SCHERM AANZETTEN ALTIJD UITVOEREN JE CTRLCODE1 MOV AH,SCHERMSTATUS ; TEST OF SCHERM AAN STAAT OR AH,AH JNZ CTRLCODE1 ; JA, DAN CTRLCODE UITVOEREN JMP LEESCOM ; ANDERS OVERSLAAN CTRLCODE1: MOV BL,AL SHL BL,1 ; MAAK WORD POINTER MOV BH,0 ; JMP CTRLTAB[BX] ; SPRING NAAR CODE AFHANDELING COMMANDO: CALL LEESBYTE ; LEES COMMANDO NUMMER MOV COMMANDONR,AL ; BERG COMMANDO NUMMER OP MOV AH,0 ; MAAK HOGE BYTE AX 0 SHL AX,1 ; MAAK ER EEN WORD POINTER VAN MOV BX,AX ; ZET TABEL OFFSET IN BASE REGISTER JMP COMTABEL[BX] ; SPRING NAAR COMMANDO ; --------------------------------------------------------------------------- ; CONTROL CODE AFHANDELING (versie 1.xx) ; --------------------------------------------------------------------------- CTRL_B: MOV PRINTERSTATUS,1 ; ZET PRINTER AAN JMP LEESCOM ; EINDE CTRL_C: MOV PRINTERSTATUS,0 ; ZET PRINTER UIT JMP LEESCOM ; EINDE CTRL_F: MOV SCHERMSTATUS,1 ; ZET SCHERM AAN JMP LEESCOM ; EINDE CTRL_G: SOUND TOONH,TOOND ; BLIEP JMP LEESCOM CTRL_H: MOV AH,03H ; VRAAG CURSORPOSITIE MOV BH,SCHERMPAG ; LAADT SCHERM PAGINA INT 10H CMP DL,VENSTER_XLO ; CURSOR OP BEGIN VAN REGEL? JE PREVLINE_H ; JA, DAN CURSOR NAAR VORIGE REGEL DEC DL ; VERLAAG X-COORDINAAT JMP ZETCURSOR ; ZET CURSOR OP NIEUWE POSITIE PREVLINE_H: MOV DL,VENSTER_XRB ; CURSOR NAAR EIND VAN REGEL JMP OMHOOG ; CURSOR REGEL OMHOOG CTRL_I: MOV AH,03H ; VRAAG CURSORPOSITIE MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H CMP DL,VENSTER_XRB ; CURSOR OP EINDE REGEL? JE NEXTLINE_I ; JA, DAN NAAR VOLGENDE REGEL INC DL ; VERHOOG X-COORDINAAT JMP ZETCURSOR ; ZET CURSOR OP NIEUWE POSITIE NEXTLINE_I: MOV DL,VENSTER_XLO ; CURSOR NAAR BEGIN VAN REGEL JMP OMLAAG ; CURSOR REGEL OMLAAG CTRL_J: MOV AH,03H ; VRAAG CURSORPOSITIE MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H OMLAAG: INC REGELS ; VERHOOG REGELTELLER VOOR PAGEMODE CMP DH,VENSTER_YLO ; CURSOR OP ONDERSTE REGEL? JE SCROLL_DOWN ; JA, GA DAN SCROLLEN INC DH ; CURSOR EEN REGEL OMLAAG JMP ZETCURSOR SCROLL_DOWN: CMP PAGEMODE,0 ; TEST OF PAGEMODE AAN STAAT JE SCR_DOWN1 ; NEE, DAN SPRINGEN MOV AL,VENSTER_YLO ; BEREKEN VENSTERHOOGTE SUB AL,VENSTER_YRB CMP AL,REGELS ; VERGELIJK OF MAX AANTAL REGELS JAE SCR_DOWN1 ; NEE, DAN SPRINGEN MAAR MOV AH,08H ; PAGE MODE EN VENSTER VOL, INT 21H ; WACHT OP TOETSAANSLAG MOV REGELS,0 ; RESET REGELTELLER SCR_DOWN1: PUSH DX ; SAVE CURSOR COORDINATEN MOV AX,0601H ; SCROLL VENSTER EEN REGEL OMHOOG (!) SCROLL: MOV CH,VENSTER_YRB ; VENSTER COORDINATEN MOV CL,VENSTER_XLO MOV DH,VENSTER_YLO MOV DL,VENSTER_XRB MOV BH,KLEUR ; ATTRIBUUT VAN NIEUWE REGEL INT 10H ; SCROLL HET VENSTER POP DX ; HAAL CURSOR POSITIE TERUG JMP ZETCURSOR ; ZET CURSOR OP ZIJN PLAATS CTRL_K: MOV AH,03H ; VRAAG CURSORPOSITIE MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H OMHOOG: CMP DH,VENSTER_YRB ; CURSOR OP BOVENSTE SCHERMREGEL? JE SCROLL_UP ; JA, GA DAN SCROLLEN DEC DH ; VERLAAG Y-COORDINAAT JMP ZETCURSOR ; ZET CURSOR OP NIEUWE POSITIE SCROLL_UP: PUSH DX ; SAVE CURSOR COORDINATEN MOV AX,0701H ; SCROLL VENSTER EEN REGEL OMLAAG (!) JMP SHORT SCROLL ZETCURSOR: MOV AH,02H ; ZET CURSOR OP DL,DH MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H JMP LEESCOM ; GA NAAR HOOFDLUS CTRL_L: CMP BBC,1 ; TEST OP BBC MODE JE CTRL_P ; IN BBC MODE IS DAT CLW MOV CX,CURLINES ; LEES DE CURSOR DEFINITIE CALL CDEF ; ZET CURSOR AAN MOV AH,0FH ; SCHERMBREEDTE OPVRAGEN INT 10H DEC AH ; MET EEN VERMINDEREN MOV VENSTER_XRB,AH ; RESET VENSTER MOV VENSTER_YRB,0 MOV VENSTER_XLO,0 MOV VENSTER_YLO,24 MOV DX,0 ; LAADT NIEUWE CURSOR POSITIE PUSH DX ; ZET OP STACK MOV REGELS,0 ; RESET REGELTELLER VOOR PAGEMODE MOV AX,0600H ; LAADT AX VOOR SCHERM WISSEN JMP SCROLL ; WIS SCHERM EN ZET CURSOR CTRL_M: MOV AH,03H ; VRAAG CURSORPOSITIE MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H MOV DL,VENSTER_XLO ; CURSOR NAAR BEGIN VAN REGEL JMP SHORT ZETCURSOR CTRL_N: MOV PAGEMODE,1 ; ZET PAGEMODE AAN MOV REGELS,0 ; RESET REGELTELLER JMP LEESCOM ; EINDE CTRL_O: MOV PAGEMODE,0 ; ZET PAGEMODE UIT JMP LEESCOM ; EINDE CTRL_P: MOV DL,VENSTER_XLO ; ZET CURSOR IN LINKER BOVENHOEK MOV DH,VENSTER_YRB PUSH DX ; ZET OP STACK (niet verwijderen!) MOV AX,0600H ; VENSTER WISSEN JMP SCROLL CTRL_U: MOV SCHERMSTATUS,0 ; ZET SCHERM UIT JMP LEESCOM ; EINDE HOME: MOV DL,VENSTER_XLO ; CURSOR COORDINAAT NAAR LINKSBOVEN MOV DH,VENSTER_YRB MOV REGELS,0 ; RESET REGELTELLER VOOR PAGEMODE JMP ZETCURSOR ; ZET CURSOR OP NIEUWE POSITIE ; --------------------------------------------------------------------------- ; CONTROL CODE UITBREIDINGEN (versie 2.xx) ; --------------------------------------------------------------------------- CTRL_A: JMP TEKEN2LPT ; TEKEN ALLEEN NAAR PRINTER CTRL_D: JMP VIEWSCHERM ; ZET NIEUW SCHERM IN BEELD CTRL_E: JMP WERKSCHERM ; ZET HET SCHERMNUMMER VOOR BEWERKING CTRL_Q: JMP VIDEOCOL ; VERANDER KLEUR CTRL_V: JMP VIDEOMOD ; PC VIDEO MODE ZETTEN CTRL_W: JMP CGABITMAP ; KARAKTER DEFINIEREN CTRL_X: JMP GWINDOW ; GRAFISCH VENSTER DEFINIEREN CTRL_Z: CALL GWINDOWOFF ; RESET GRAFISCH VENSTER JMP WINDOW_OFF ; TEKST WINDOW UITZETTEN CTRL_KM: JMP WINDOW ; TEKST WINDOW DEFINIEREN CTRL_SL: CALL LEESBBC ; LEES X COORDINAAT ADD AL,VENSTER_XLO ; TEL ER DE VENSTER OFFSET BIJ MOV DL,AL ; ZET X COORDINAAT IN DL CALL LEESBBC ; LEES Y COORDINAAT ADD AL,VENSTER_YRB ; TEL ER DE VENSTER OFFSET BIJ MOV DH,AL ; ZET Y COORDINAAT IN DH JMP ZETCURSOR ; ZET CURSOR OP GEGEVEN POSITIE CTRL_MN: JMP OORSPRONG ; GRAFISCHE OORSPRONG ZETTEN ; --------------------------------------------------------------------------- ; CONTROL CODE UITBREIDINGEN (versie 4.1x ivm BBC Basic) ; --------------------------------------------------------------------------- CTRL_R: CALL LEESBBC ; LEES GCOL OPTIE MOV BBCGCOL,AL ; ZET IN WERKRUIMTE CALL LEESBBC ; LEES KLEURNUMMER TEST AL,80H ; TEST VOORGROND/ACHTERGROND JZ CTRL_R1 ; SPRING INDIEN VOORGRONDKLEUR AND AL,0FH ; WIS HOGE NIBBLE MOV BBCBCOLG,AL ; ZET ACHTERGRONDKLEUR JMP LEESCOM ; VOLGEND COMMANDO CTRL_R1: MOV BBCFCOLG,AL ; ZET VOORGRONDKLEUR JMP LEESCOM ; VOLGEND COMMANDO CTRL_S: CALL LEESBBC ; LEES LOGISCH KLEURNUMMER MOV BL,AL ; ZET IN BL CALL LEESBBC ; LEES FYSIEK KLEURNUMMER MOV BH,AL ; ZET IN BH CALL CTRL_S1 ; WIJZIG HET PALET JMP LEESCOM ; EINDE ROUTINE CTRL_S1: MOV AL,BH ; LIJKT ONZINNIG, NIET WEGHALEN! XOR AH,AH ; WIS AH MOV SI,AX ; ZET IN INDEXREGISTER MOV BH,BBCPALET16[SI]; LEES FYSIEK KLEURNUMMER MOV AX,1000H ; LAADT BIOS FUNCTIE CODE INT 10H ; WIJZIG HET PALET RET ; EINDE ROUTINE CTRL_T: CALL _CTRL_T ; RESET VIDEO PARAMETERS JMP LEESCOM ; EINDE ROUTINE _CTRL_T: MOV AL,BBCSCREEN ; LAADT BBC SCHERM MODE XOR AH,AH ; CLEAR HOGE BYTE MOV SI,AX ; ZET IN INDEXREGISTER MOV BBCBCOLT,0 ; RESET DEFAULT ACHTERGRONDKLEUR MOV AL,BBCDEFCOL[SI]; LEES DEFAULT VOORGRONDKLEUR CALL _VIDEOCOL ; STEL KLEUR IN LEA SI,BBCPALET2 ; LAADT ADRES DEFAULT PALET CMP BBCSCREEN,1 ; BEPAAL ADRES PALET INFO JE _CTRL_T4 CMP BBCSCREEN,5 JE _CTRL_T4 CMP BBCSCREEN,2 JE _CTRL_T16 JMP SHORT _CTRL_T1 _CTRL_T4: LEA SI,BBCPALET4 JMP SHORT _CTRL_T1 _CTRL_T16: LEA SI,BBCPALET16 _CTRL_T1: MOV BL,0 ; LAADT LAAGSTE LOGISCHE KLEURNUMMER _CTRL_T2: MOV BH,[SI] ; LAADT BIJBEHORENDE FYSIEKE KLEUR INC SI ; VERHOOG INDEX MOV AX,1000H ; LAADT FUNCTIE INT 10H ; VOER BIOSFUNCTIE UIT INC BL ; VERHOOG LOGISCH KLEURNUMMER CMP BL,8 ; BIJ 8e KLEUR INDEX AANPASSEN JNE _CTRL_T3 ; SPRING INDIEN NIET 8 LEA SI,BBCPALET16+8 ; LAADT ADRES HOGE PALETREEKS _CTRL_T3: CMP BL,16 ; TEST OP LAATSTE KLEUR JNE _CTRL_T2 ; SPRING INDIEN NIET DE LAATSTE RET ; DIT MOET HET ZIJN CTRL_Y: CALL LEESBBC ; LEES PLOT COMMANDO MOV LINE_STYLE,0FFFFH; ZET LIJN TYPE MASKER CMP AL,16 ; TEST OP STIPPELLIJN JB CTRL_Y1 ; SPRING INDIEN LAGER CMP AL,31 JA CTRL_Y1 ; OF HOGER SUB AL,16 ; ROUTINES VERDER GELIJK AAN 0-15 MOV DL,BBCSCREEN ; LEES SCHERMMODE XOR DH,DH ; RESET DH SHL DX,1 ; BEPAAL INDEX VOOR COMMANDO MOV SI,DX ; ZET IN INDEXREGISTER MOV DX,BBCDOTPATTRN[SI] ; LAADT STIPPELLIJN PATROON MOV LINE_STYLE,DX ; ZET IN GEHEUGEN CTRL_Y1: XOR AH,AH ; RESET AH SHL AX,1 ; BEPAAL TABEL INDEX VOOR COMMANDO MOV BX,AX ; ZET IN INDEXREGISTER CALL WORD PTR BBCPLOTTAB[BX] ; VOER PLOT COMMANDO UIT JMP LEESCOM ; EINDE ROUTINE ; --------------------------------------------------------------------------- ; COMMANDO'S ; --------------------------------------------------------------------------- ERROR: MOV AH,9 ; DRUK FOUTMELDING AF LEA DX,ERR_MSG INT 21H MOV AL,COMMANDONR ; LAADT COMMANDONR CALL HEX ; DRUK COMMANDONUMMER AF MOV AL,FUN_CODE ; TEST OP SUBFUNCTIE FOUT PUSH AX ; ZET AX OP STACK CMP AL,0 ; TEST OP SUBFUNCTIE NUMMER JZ ERRORA ; SPRING INDIEN GEEN SUBFUNCTIE MOV AH,9 ; DRUK TWEEDE FOUTMELDING AF LEA DX,FUN_ERR INT 21H POP AX ; HAAL AX (errorcode) TERUG CALL HEX ; ZET OP SCHERM MOV FUN_CODE,0 ; RESET FOUTCODE ERRORA: MOV DL,10 ; GEEF NOG EEN CR/LF INT 21H MOV DL,13 INT 21H JMP LEESCOM ; GA NAAR BEGIN VAN HOOFDLUS KEY: MOV AH,2 ; LEES KEYBOARD STATUS INT 16H MOV DX,0 ; RESET ATOM KEYBOARD STATUS BYTE TST_SHIFT: TEST AL,00000011B ; TEST OP SHIFTTOETS JE TST_CTRL ; SPRING INDIEN GEEN SHIFTTOETS OR DL,10000000B ; ZET SHIFT BIT TST_CTRL: TEST AL,00000100B ; TEST OP CONTROL TOETS JE TST_ALT ; SPRING INDIEN GEEN CONTROL TOETS OR DL,01000000B ; ZET CONTROL BIT TST_ALT: TEST AL,00001000B ; TEST OP ALT TOETS JE TST_CAPS ; SPRING INDIEN GEEN ALT TOETS OR DL,00100000B ; ZET ALT BIT TST_CAPS: AND AL,01000000B ; BEPAAL CAPS LOCK STATUS CMP AL,CAPSSTATUS ; TEST OP WISSELING JE TST_KEY ; SPRING INDIEN GELIJK MOV CAPSSTATUS,AL ; ZET NIEUWE CAPS LOCK STATUS MOV DH,43H ; LAADT SCANCODE VOOR CAPSTOETS OR DL,00000001B ; ZET TOETS VLAG JMP ENDKEY ; SPRING ALTIJD TST_KEY: MOV AH,1 ; KIJK OF EEN TOETS IN BUFFER IS INT 16H JZ ENDKEY ; SPRING INDIEN GEEN TOETS GEDRUKT MOV AH,0 ; HAAL KARAKTER UIT BUFFER INT 16H CMP AH,46H ; KIJK OF SCANCODE BOVEN 46H LIGT JLE NEWKEY ; NEE, DAN IS NIETS AAN DE HAND CMP AL,00H ; TEST OF NUMLOCK AAN JE NEWKEY ; JA, DAN OOK NIETS AAN DE HAND ADD AH,10H ; ANDERS MAAK AANPASSING NEWKEY: MOV BL,AH ; ZET SCAN CODE IN INDEXREGISTER MOV BH,00H MOV DH,KEYTAB[BX] ; ZET NIEUWE SCANCODE IN DL OR DL,00000001B ; ZET TOETS VLAG ENDKEY: MOV AL,DH ; STUUR SCAN CODE NAAR ATOM CALL ZENDBYTE MOV AL,DL ; STUUR STATUSBYTE NAAR ATOM CALL ZENDBYTE JMP LEESCOM ; GA NAAR BEGIN VAN HOOFDLUS COPY: MOV AH,08H ; LEES TEKEN OP CURSOR POSITIE MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H CALL ZENDBYTE ; STUUR GELEZEN TEKEN NAAR ATOM JMP LEESCOM ; GA NAAR HOOFDLUS GPLOT: CALL LEESBYTE ; LEES X-COORDINAAT LOW-BYTE MOV BL,AL CALL LEESBYTE ; LEES X-COORDINAAT HIGH-BYTE MOV BH,AL CALL LEESBYTE ; LEES Y-COORDINAAT LOW-BYTE MOV DL,AL CALL LEESBYTE ; LEES Y-COORDINAAT HIGH-BYTE MOV DH,AL CALL LEESBYTE ; LAADT PLOT OPDRACHT XOR BP,BP ; BEELDPAGINA 0 (GRAFISCH 1 PAGINA !) CALL PIXEL ; ROEP PLOT ROUTINE AAN JMP LEESCOM ; GA NAAR HOOFDLUS SIMULATE4: CALL LEESBYTE ; LEES X-COORDINAAT LOW-BYTE MOV BL,AL CALL LEESBYTE ; LEES X-COORDINAAT HIGH-BYTE MOV BH,AL CALL LEESBYTE ; LEES Y-COORDINAAT LOW-BYTE MOV DL,AL CALL LEESBYTE ; LEES Y-COORDINAAT HIGH-BYTE MOV DH,AL CALL LEESBYTE ; LAADT PLOT OPDRACHT CMP BX,255 ; TEST OP OVERSCHRIJDING MAX. X JA ENDSIMUL CMP DX,191 ; TEST OP OVERSCHRIJDING MAX. Y JA ENDSIMUL MOV TEMP+0,BX ; BERG COORDINATEN OP MOV TEMP+2,DX ADD BX,32 ADD DX,4 ; Y := Y + 4 XOR BP,BP ; BEELDPAGINA 0 (GRAFISCH 1 PAGINA !) CALL PIXEL ; ROEP PLOT ROUTINE AAN INC BX ; VERHOOG X-COORDINAAT CALL PIXEL ; ROEP PLOT ROUTINE AAN ENDSIMUL: JMP LEESCOM ; GA NAAR HOOFDLUS IGRAPH: INITGRAPH ; SCHAKEL NAAR GRAFISCHE MODE IGRAPH1: MOV ATOMPALET,0 ; Z/W KLEUREN PALET MOV AX,0500H ; BEELDPAGINA 0 ACTUEEL MAKEN INT 10H MOV SCHERMPAG,0 JMP LEESCOM ; GA NAAR HOOFDLUS RAMFNT: MOV DI,0 ; RESET INDEX RAMF1: CALL LEESBYTE ; LEES FILENAAM MOV FILEBUFFER[DI],AL ; ZET IN GEHEUGEN INC DI ; VERHOOG POINTER CMP AL,0 ; TEST OP EINDE FILENAAM JNE RAMF1 ; SPRING INDIEN NOG EEN KARAKTER VOLGT LEA DX,FILEBUFFER ; LAADT BEGINADRES VAN FONT FILENAAM CALL LOADFONT ; LAADT HET FONT JC RAMF2 ; SPRING INDIEN EEN FOUT OPGETREDEN MOV AL,0 ; CODE VOOR GEEN FOUT RAMF2: CALL ZENDBYTE ; GEEF RESULTAAT TERUG NAAR ATOM JMP LEESCOM ; GA NAAR HOOFDLUS SCHRIJF: CALL LEESBYTE ; LEES X-COORDINAAT MOV BL,AL CALL LEESBYTE MOV BH,AL CALL LEESBYTE ; LEES Y-COORDINAAT MOV DL,AL CALL LEESBYTE MOV DH,AL MOV AH,00 ; AH DIENT 0 TE ZIJN SCHRIJFLUS: CALL LEESBYTE ; LEES AF TE DRUKKEN KARAKTER CMP AL,0 ; TEST OP EINDE VAN STRING JE SCHRIJFLUSEND CALL WRITE ; SCHRIJF HET KARAKTER JMP SHORT SCHRIJFLUS; SPRING VOOR VOLGEND KARAKTER SCHRIJFLUSEND: JMP LEESCOM ; GA NAAR HOOFDLUS SCHAAL: MOV AH,0 ; HOGE BYTE SCHAALFACTOR IS 0 CALL LEESBYTE ; LEES HORIZONTALE SCHAAL MOV SCALE_X,AX ; ZET HORIZONTALE SCHAAL CALL LEESBYTE ; LEES VERTIKALE SCHAAL MOV SCALE_Y,AX ; ZET VERTIKALE SCHAAL JMP LEESCOM ; GA NAAR HOOFDLUS CURSOR_ON: MOV CX,CURLINES ; LEES CURSOR DEFINITIE JMP SHORT CURSOR_SET CURSOR_OFF: MOV CX,0FFFFH ; ZET ILLEGALE CURSORLIJNEN CURSOR_SET: CALL CDEF JMP LEESCOM ; GA NAAR HOOFDLUS MSDOS: EXITGRAPH ; VERLAAT GRAPHISCHE MODE IN AL,61H ; LUIDSPREKER STUURBIT INLEZEN AND AL,11111100B ; TWEE LAAGSTE BITS WISSEN OUT 61H,AL ; LUIDSPREKER UIT CMP XMSPAGES,0 ; TEST OF XMS GEHEUGEN GEBRUIKT IS JE MSDOS1 ; SPRING INDIEN GEEN XMS GEHEUGEN MOV AH,0AH ; XMS GEHEUGEN VRIJGEVEN MOV DX,XMSHANDLE ; LAADT XMS HANDLE CALL DWORD PTR [XMSDRV] ;PROBEER GEHEUGEN VRIJ TE GEVEN MSDOS1: PUSH DS ; BEWAAR DATA SEGMENT REGISTER MOV DX,[OFF09] ; HERSTEL OUDE INT09 HANDLER MOV AX,[SEG09] MOV DS,AX MOV AX,2509H INT 21H MOV DX,[OFF60] ; HERSTEL OUDE INT60 HANDLER MOV AX,[SEG60] MOV DS,AX MOV AX,2560H INT 21H POP DS ; HERSTEL DATA SEGMENT REGISTER CALL SHUTDOWN ; REMOTE ATOM SHUTDOWN COMMANDO MOV AX,4C00H ; PROGRAMMA EINDIGEN MET FOUTCODE 0 INT 21H ; BEEINDIG HET PROGRAMMA LEESNAAM PROC NEAR XOR DI,DI ; RESET INDEX LEESNAAM1: CALL LEESBYTE ; LEES FILENAAM MOV FILEBUFFER[DI],AL ; ZET IN GEHEUGEN INC DI ; VERHOOG POINTER CMP AL,0 ; TEST OP EINDE FILENAAM JNE LEESNAAM1 ; SPRING INDIEN NOG EEN KARAKTER VOLGT ; ZOEK NAAR EINDE VAN PAD LEESNAAM2: DEC DI ; VERLAAG INDEX OR DI,DI ; TEST OP BEGIN VAN FILENAAM JZ LEESNAAM3 ; SPRING INDIEN 0 (GEEN PAD GEGEVEN) CMP FILEBUFFER[DI],'\' JE LEESNAAM3 ; SPRING INDIEN (LAATSTE) \ GEVONDEN CMP FILEBUFFER[DI],':' JE LEESNAAM3 ; SPRING INDIEN : GEVONDEN JMP SHORT LEESNAAM2 ; ZOEK VERDER LEESNAAM3: RET LEESNAAM ENDP LOADFILE: CALL LEESNAAM ; LEES DE FILENAAM MOV AX,3D00H ; DOS FUNCTIE: BESTAND OPENENEN MOV DX,OFFSET FILEBUFFER INT 21H JC FILE_ERROR ; SPRING INDIEN EEN FOUT OPGETREDEN MOV BX,AX ; BERG DE HANDLE OP XOR AX,AX ; AX := 0 CALL ZENDBYTE ; GEEF AAN DAT FILE GEOPEND IS LOADFILE1: MOV AH,3FH ; DOS FUNCTIE: BESTAND LEZEN MOV DX,OFFSET FILEBUFFER MOV CX,255 ; AANTAL TE LEZEN BYTES INT 21H ; LEES DATABLOK CALL ZENDBYTE ; GEEF BLOKLENGTE AAN ATOM CMP AL,00H ; TEST OF LAATSTE BLOK GELEZEN IS JZ ENDFILE ; SPRING INDIEN EINDE FILE MOV CX,AX ; LAADT TELLER XOR SI,SI ; RESET INDEX REGISTER PC2ATOM: MOV AL,FILEBUFFER[SI] ; LEES DATA INC SI CALL ZENDBYTE ; STUUR NAAR ATOM LOOP PC2ATOM JMP SHORT LOADFILE1 ; SPRING ALTIJD VOOR VOLGEND BLOK ENDFILE: MOV AH,3EH ; DOS FUNCTIE: BESTAND SLUITEN INT 21H JMP LEESCOM ; EINDE COMMANDO FILE_ERROR: FILE_ERROR1: CALL ZENDBYTE ; ERRORCODE NAAR ATOM STUREN JMP LEESCOM ; EINDE COMMANDO SAVEFILE: CALL LEESNAAM ; LEES DE FILENAAM MOV AH,3CH ; DOS FUNCTIE: BESTAND AANMAKEN MOV CX,00H ; BESTAND ATTRIBUUT MOV DX,OFFSET FILEBUFFER INT 21H JC FILE_ERROR MOV BX,AX ; BERG DE HANDLE OP XOR AX,AX ; AX := 0 CALL ZENDBYTE ; GEEF AAN DAT FILE GEOPEND IS SAVEFILE2: CALL LEESBYTE ; LEES BLOKLENGTE VAN ATOM CMP AL,0 ; TEST OP EINDE FILE JE ENDFILE MOV CX,AX ; ZET LENGTE IN TELLER MOV AH,AL ; SAVE LENGTE IN AH XOR DI,DI ; CLEAR INDEX ATOM2PC: CALL LEESBYTE ; LEES DATABYTE MOV FILEBUFFER[DI],AL ; ZET DATA IN BUFFER INC DI LOOP ATOM2PC ; SPRING INDIEN NIET ALLE BYTE GEHAD MOV CL,AH ; ZET BLOKLENGTE IN CX MOV AH,40H ; DOS FUNCTIE: BESTAND SCHRIJVEN MOV DX,OFFSET FILEBUFFER INT 21H ; SCHRIJF DATABLOK CALL ZENDBYTE ; AANTAL GESCHREVEN BYTES NAAR ATOM JMP SHORT SAVEFILE2 ; GEDWONGEN SPRONG CAT: CALL LEESNAAM ; LEES FILENAAM CMP FILEBUFFER,0 ; TEST OP BLANCO FILENAAM JNE CAT1 ; SPRING INDIEN NAAM GEGEVEN MOV FILEBUFFER,'*' ; ZET ANDERS ZOEKPAD *.* MOV FILEBUFFER+1,'.' MOV FILEBUFFER+2,'*' MOV FILEBUFFER+3,0 MOV AH,09H ; CURSOR NAAR VOLGENDE REGEL MOV DX,OFFSET CRLF INT 21H CAT1: MOV AH,4EH ; DOS FUNCTIE: ZOEK EERSTE BESTAND MOV CX,00010000B ; FILE ATTRIBUUT MOV DX,OFFSET FILEBUFFER INT 21H ; VOER FUNCTIE UIT JNC CAT2 ; SPRING INDIEN GEEN FOUT JMP ZENDRESULT CAT2: MOV AH,2FH ; DOS FUNCTIE: OPVRAGEN DTA INT 21H PUSH DS ; SAVE DATA SEGMENT PUSH ES ; ES NAAR DS COPIEREN POP DS ADD BX,21 ; FILE ATTRIBUUT IN DTA[21] MOV AX,[BX] ; FILE ATTRIBUUT OPBERGEN MOV FILEATTR,AL ; ATTRIBUUT NAAR AL MOV AH,02H ; GEBRUIKT VOOR DOS FUNCTIE 02 AND AL,00010000B ; TEST OP DIRECTORY JZ CAT2A ; SPRING INDIEN GEEN DIRECTORY MOV DL,'<' INT 21H ; PRINT TEKEN IN DL CAT2A: ADD BX,9 ; FILENAAM STAAT VANAF DTA[30] CAT3: MOV DL,[BX] ; LEES KARAKTER VAN FILENAAM INC BX ; VERHOOG INDEX CMP DL,0 ; TEST OP EINDE FILENAAM JE CAT4 ; SPRING INDIEN EINDE FILENAAM INT 21H ; ANDERS PRINT TEKEN IN DL JMP SHORT CAT3 CAT4: MOV AL,FILEATTR ; TEST NOGMAALS OP DIRECTORY AND AL,00010000B JZ CAT4A ; SPRING INDIEN GEEN DIRECTORY MOV DL,'>' INT 21H ; PRINT TEKEN IN DL CAT4A: MOV AH,03H ; HAAL CURSOR POSITIE MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H AND DX,000FH ; ALLEEN LAAGSTE VIER BITS VAN BELANG XOR DX,000FH ; INVERTEER LAAGSTE VIER BITS MOV CX,DX ; LAADT TELLER VOOR AANTAL SPATIES INC CX MOV AH,02H ; DOS FUNCTIE: TEKEN UITVOEREN MOV DL,' ' ; PRINT SPATIES CAT5: INT 21H LOOP CAT5 MOV AH,4FH ; DOS FUNCTIE: ZOEK VOLGENDE BESTAND MOV DX,OFFSET FILEBUFFER INT 21H JNC CAT2 ; SPRING INDIEN NOG EEN FILE GEVONDEN MOV AH,09H ; CURSOR NAAR NIEUWE REGEL MOV DX,OFFSET CRLF INT 21H MOV AL,0 ; LAADT RESULTAAT CODE POP DS ; HERSTEL DATASEGMENT ZENDRESULT: CALL ZENDBYTE ; STUUR NAAR ATOM JMP LEESCOM ; VOLGEND COMMANDO UITVOEREN DIR PROC NEAR CALL LEESNAAM ; LEES DIRECTORY CMP FILEBUFFER+1,':'; TEST OF DRIVE AANGEGEVEN IS JNE DIR1 ; SPRING INDIEN GEEN DRIVE AANGEGEVEN MOV AL,FILEBUFFER ; LEES OPGEGEVEN DRIVE LETTER SUB AL,'A' ; MAAK ER DRIVE CODE VAN STC ; ER IS EEN DRIVE AANDUIDING JMP SHORT DIR2 DIR1: CLC ; ER IS GEEN DRIVE AANDUIDING DIR2: RET DIR ENDP CHDIR: CALL DIR ; LEES NIEUWE DIRECTORY JNC CHDIR1 ; SPRING INDIEN GEEN DRIVE AANDUIDING CMP FILEBUFFER+2,0 ; TEST OP LEGE DIRECTORY AANDUIDING JNE CHDIR5 ; SPRING INDIEN DIRECTORY OPGEGEVEN JMP SHORT CHDIR2 CHDIR1: CMP FILEBUFFER,0 ; TEST OP LEGE DIRECTORY AANDUIDING JNE CHDIR5 MOV AH,19H ; DOS FUNCTIE: HAAL DRIVE CODE INT 21H CHDIR2: MOV DL,AL ; ZET DRIVE CODE IN DL INC DL ; VERHOOG DRIVE CODE MET '1' MOV AH,47H ; DOS FUNCTIE: HAAL ACTUELE DIR MOV SI,OFFSET FILEBUFFER INT 21H JNC CHDIR3 JMP FILE_ERROR ; SPRING INDIEN FOUT GEDETECTEERD CHDIR3: MOV AL,00H ; RESULT CODE NAAR ATOM CALL ZENDBYTE MOV AL,0FFH ; GEEF AAN DAT ER NOG TEKST VOLGT CALL ZENDBYTE MOV AL,DL ; GEEF DRIVE CODE AAN ATOM CALL ZENDBYTE XOR SI,SI ; RESET POINTER CHDIR4: MOV AL,FILEBUFFER[SI] ; LEES KARAKTER INC SI ; VERHOOG POINTER CALL ZENDBYTE ; STUUR NAAR ATOM CMP AL,00H ; TEST OP EINDE STRING JNE CHDIR4 ; SPRING INDIEN NOG TEKENS VOLGEN JMP LEESCOM ; GA VOLGEND COMMANDO HALEN CHDIR5: MOV AH,3BH ; DOS FUNCTIE: WIJZIG ACTUELE DIR JMP SHORT DIRFUNCTIE; SPRING ALTIJD RMDIR: CALL DIR ; LEES DIRECTORY MOV AH,3AH ; DOS FUNCTIE: WIS DIRECTORY JMP SHORT DIRFUNCTIE; SPRING ALTIJD MKDIR: CALL DIR ; LEES DIRECTORY MOV AH,39H ; DOS FUNCTIE: MAAK DIRECTORY DIRFUNCTIE: MOV DX,OFFSET FILEBUFFER INT 21H ; VOER FUNCTIE UIT JNC DIRFUNCTIE1 ; SPRING INDIEN FOUTLOOS JMP FILE_ERROR ; SPRING NAAR FOUT AFHANDELING DIRFUNCTIE1: XOR AL,AL ; GEEF AAN DAT ER NIETS FOUT WAS CALL ZENDBYTE CALL ZENDBYTE ; GEEF AAN DAT ER GEEN TEKST VOLGT JMP LEESCOM ; EINDE ROUTINE, NAAR VOLGEND COMMANDO FINDFIRST PROC NEAR CALL LEESNAAM ; LEES FILESPEC MOV AH,4EH ; DOS FUNCTIE: ZOEK EERSTE BESTAND MOV DX,OFFSET FILEBUFFER INT 21H RET ; EINDE ROUTINE FINDFIRST ENDP FINDNEXT PROC NEAR MOV AH,4FH ; DOS FUNCTIE: ZOEK VOLGENDE BESTAND INT 21H RET ; EINDE ROUTINE FINDNEXT ENDP ZET_PAD PROC NEAR XOR SI,SI ; RESET SI OR DI,DI ; IS EEN PAD OPGEGEVEN ? JZ ZET_FNAAM ; SPRING ALS GEEN PAD GEGEVEN IS INC DI ; VERHOOG OM LAATSTE \ MEE TE KOPIEREN ZETPAD1: CMP SI,DI ; PAD GEHEEL GEKOPIEERD ? JE ZET_FNAAM ; JA, GA DAN FILENAAM KOPIEREN MOV AL,FILEBUFFER[SI] ; LEES KARAKTER VAN PAD MOV FILEBUFFER+80H[SI],AL ; ZET IN PAD EN FILE BUFFER INC SI ; VERHOOG POINTER JMP SHORT ZETPAD1 ZET_FNAAM: MOV AH,2FH ; DOS FUNCTIE: DTA OPVRAGEN INT 21H ADD BX,30 ; FILENAAM STAAT OP DTA[30] ZETPAD2: MOV AL,ES:[BX] ; LEES KARAKTER VAN FILENAAM MOV FILEBUFFER+80H[SI],AL INC BX ; VERHOOG POINTERS INC SI OR AL,AL ; ALLE KARAKTERS GEHAD ? JNZ ZETPAD2 ; NEE, DAN SPRING VOOR VOLGENDE MOV DX,OFFSET FILEBUFFER+80H ; ZET DX NAAR BEGIN VAN PAD DEC DI ; VERLAAG DI I.V.M. VERHOGEN RET ; EINDE ROUTINE ZET_PAD ENDP ATTRIB PROC NEAR MOV AX,4300H ; DOS FUNCTIE: OPVRAGEN ATTRIBUUT INT 21H RET ; EINDE ROUTINE ATTRIB ENDP DELETE: MOV CX,0000H ; ALLEEN NORMALE FILES WISSEN CALL FINDFIRST ; ZOEK EERSTE FILE JNC DELETE1 ; SPRING INDIEN BESTAND GEVONDEN JMP FILE_ERROR DELETE1: CALL ZET_PAD ; ZET KOMPLEET PAD VOOR GEVONDEN FILE CALL ATTRIB ; VRAAG ATTRIBUUT AND CX,00DFH ; RESET ARCHIVE BIT CMP CX,0000H ; ALLEEN WISSEN ALS ATTRIBUUT 0 IS JNE DELETE2 ; SPRING ALS NIET GEWIST MAG WORDEN MOV AH,41H ; DOS FUNCTIE: BESTAND WISSEN INT 21H JNC DELETE2 ; SPRING INDIEN GEEN FOUT JMP FILE_ERROR DELETE2: CALL FINDNEXT JNC DELETE1 ; SPRING INDIEN NOG EEN FILE GEVONDEN XOR AL,AL ; GEEF AAN DAT ALLES GOED IS CALL ZENDBYTE JMP LEESCOM ; VOLGEND COMMANDO FLOCK: MOV CX,0000H ; ALLEEN NORMALE FILES CALL FINDFIRST ; ZOEK EERSTE FILE JNC LOCK1 ; SPRING INDIEN BESTAND GEVONDEN JMP FILE_ERROR LOCK1: CALL ZET_PAD ; ZET KOMPLEET PAD VOOR GEVONDEN FILE CALL ATTRIB ; VRAAG ATTRIBUUT OP MOV AX,4301H ; DOS FUNCTIE: ATTRIBUUT WIJZIGEN OR CX,0001H ; BESTAND READ-ONLY INT 21H JNC LOCK2 ; SPRING INDIEN GEEN FOUT JMP FILE_ERROR LOCK2: CALL FINDNEXT JNC LOCK1 ; SPRING INDIEN NOG EEN FILE GEVONDEN XOR AL,AL ; GEEF AAN DAT ALLES GOED IS CALL ZENDBYTE JMP LEESCOM ; VOLGEND COMMANDO UNLOCK: MOV CX,0001H ; ALLEEN READ-ONLY FILES CALL FINDFIRST ; ZOEK EERSTE FILE JNC UNLOCK1 ; SPRING INDIEN BESTAND GEVONDEN JMP FILE_ERROR UNLOCK1: CALL ZET_PAD ; ZET KOMPLEET PAD VOOR GEVONDEN FILE CALL ATTRIB ; ATTRIBUUT OPVRAGEN MOV AX,4301H ; DOS FUNCTIE: ATTRIBUUT WIJZIGEN AND CX,0FFFEH ; BESTAND READ/WRITE INT 21H JNC UNLOCK2 ; SPRING INDIEN GEEN FOUT JMP FILE_ERROR UNLOCK2: CALL FINDNEXT JNC UNLOCK1 ; SPRING INDIEN NOG EEN FILE GEVONDEN XOR AL,AL ; GEEF AAN DAT ALLES GOED IS CALL ZENDBYTE JMP LEESCOM ; VOLGEND COMMANDO DRIVE: CALL LEESBYTE ; LEES DRIVE CODE MOV DL,AL ; DRIVE CODE NAAR DL MOV AH,0EH ; DOS FUNCTIE: ACTUELE DRIVE KIEZEN INT 21H JMP LEESCOM ; VOLGEND COMMANDO HIDE: MOV CX,0001H ; NORMALE EN READ-ONLY FILES CALL FINDFIRST ; ZOEK EERSTE FILE JNC HIDE1 ; SPRING INDIEN BESTAND GEVONDEN JMP FILE_ERROR HIDE1: CALL ZET_PAD ; ZET KOMPLEET PAD VOOR GEVONDEN FILE CALL ATTRIB ; VRAAG ATTRIBUUT OP MOV AX,4301H ; DOS FUNCTIE: ATTRIBUUT WIJZIGEN OR CX,0002H ; BESTAND HIDDEN INT 21H JNC HIDE2 ; SPRING INDIEN GEEN FOUT JMP FILE_ERROR HIDE2: CALL FINDNEXT JNC HIDE1 ; SPRING INDIEN NOG EEN FILE GEVONDEN XOR AL,AL ; GEEF AAN DAT ALLES GOED IS CALL ZENDBYTE JMP LEESCOM ; VOLGEND COMMANDO UNHIDE: MOV CX,0002H ; ALLEEN READ-ONLY FILES CALL FINDFIRST ; ZOEK EERSTE FILE JNC UNHIDE1 ; SPRING INDIEN BESTAND GEVONDEN JMP FILE_ERROR UNHIDE1: CALL ZET_PAD ; ZET KOMPLEET PAD VOOR GEVONDEN FILE CALL ATTRIB ; ATTRIBUUT OPVRAGEN MOV AX,4301H ; DOS FUNCTIE: ATTRIBUUT WIJZIGEN AND CX,0FFFDH ; BESTAND NOT HIDDEN INT 21H JNC UNHIDE2 ; SPRING INDIEN GEEN FOUT JMP FILE_ERROR UNHIDE2: CALL FINDNEXT JNC UNHIDE1 ; SPRING INDIEN NOG EEN FILE GEVONDEN XOR AL,AL ; GEEF AAN DAT ALLES GOED IS CALL ZENDBYTE JMP LEESCOM ; VOLGEND COMMANDO INFO: CALL LEESNAAM ; LEES DE FILENAAM MOV AX,4300H ; DOS FUNCTIE: BESTAND ATTRIB OPVRAGEN MOV DX,OFFSET FILEBUFFER INT 21H JNC INFO1 JMP FILE_ERROR ; SPRING INDIEN EEN FOUT OPGETREDEN INFO1: PUSH CX ; BEWAAR ATTRIBUUT XOR AX,AX ; AX := 0 CALL ZENDBYTE ; GEEF AAN DAT FILE GEVONDEN IS MOV AH,2FH ; DOS FUNCTIE: DTA OPVRAGEN INT 21H MOV TEMP,BX ; BEWAAR DTA ADRES MOV AX,3D00H ; DOS FUNCTIE: BESTAND OPENEN INT 21H MOV BX,AX ; ZET HANDLE IN BX INFO2: MOV AH,3FH ; DOS FUNCTIE: BESTAND LEZEN MOV DX,OFFSET FILEBUFFER MOV CX,04 ; AANTAL TE LEZEN BYTES INT 21H ; LEES DATABLOK MOV AX,4202H ; DOS FUNCTIE: VERPLAATS BEST.POINTER XOR CX,CX ; pointer = 0 XOR DX,DX ; t.o.v. einde INT 21H ; dx:ax is nu lengte van bestand SUB AX,16 ; TREK ER DE HEADER LENGTE VAN AF SBB DX,0 MOV FILEBUFFER[4],AL MOV FILEBUFFER[5],AH MOV FILEBUFFER[6],DL MOV FILEBUFFER[7],DH MOV CX,16 ; LAADT TELLER XOR SI,SI ; RESET INDEX INFO3: MOV AL,FILEBUFFER[SI] ; LEES DATA INC SI ; VERHOOG INDEX CALL ZENDBYTE ; STUUR NAAR ATOM LOOP INFO3 ; SPRING INDIEN NIET ALLES GEHAD POP AX ; HAAL ATTRIBUUT VAN STACK CALL ZENDBYTE ; STUUR NAAR ATOM MOV AX,5700H ; DOS FUNCTIE: TIJD EN DATUM OPVRAGEN INT 21H MOV AH,3EH ; DOS FUNCTIE: BESTAND SLUITEN INT 21H MOV AL,CL ; STUUR TIJD NAAR ATOM CALL ZENDBYTE MOV AL,CH CALL ZENDBYTE MOV AL,DL ; STUUR DATUM NAAR ATOM CALL ZENDBYTE MOV AL,DH CALL ZENDBYTE JMP LEESCOM ; EINDE ROUTINE, GA NAAR VOLGEND CMD GELUID: CALL LEESBYTE ; LEES TOONHOOGTE MOV BL,AL ; ZET IN BL CALL LEESBYTE ; LEES TOONDUUR MOV DL,AL ; ZET IN DL XOR DH,DH ; TOONDUUR IS TEGENWOORDIG 16 BITS CALL PLAY_TUNE ; MAAK HET GELUID JMP LEESCOM ; BLIEP: CALL LEESBYTE ; LEES TOONHOOGTE MOV TOONH,AL ; ZET TOONHOOGTE CALL LEESBYTE ; LEES TOONDUUR MOV TOOND,AL ; ZET TOONDUUR JMP LEESCOM ERRMSG: CALL LEESBYTE ; LEES FOUTCODE VAN ATOM XOR AH,AH ; RESET AH SHL AX,1 ; VERDUBBEL INDEX MOV SI,AX ; ERROR STRING INDEX NAAR SI MOV DX,WORD PTR ERRORTABEL[SI] ; ERROR STRING ADRES NAAR DX MOV AH,09H ; DOS FUNCTIE: STRING AFDRUKKEN INT 21H JMP LEESCOM ; EINDE COMMANDO ; --------------------------------------------------------------------------- ; MUIS COMMANDO'S ; Vanaf terminal versie 4 zijn de muiscommando's vanaf #80 toegevoegd. Deze ; bieden voor de meest gebruikte muisfuncties een beter toegankelijk ; alternatief in plaats van de klassieke aanroep. ; --------------------------------------------------------------------------- KNAAGDIER: CALL LEESBYTE ; LEES COMMANDO TEST AL,80H ; TEST HOGE BIT JNZ MUIS2 ; SPRING INDIEN V4 COMMANDO CALL LEESREGS2 ; LEES ALGEMENE REGISTERS CMP AX,0009H ; TEST OP FUNCTIE 9 JNE MUIS1 PUSH DS ; DATA SEGMENT NAAR POP ES ; EXTRA SEGMENT COPIEREN MOV DX,OFFSET MUISMASKER ; MUIS1: INT 33H ; VOER MUISFUNCTIE UIT CALL ZENDREGS ; STUUR REGISTERS NAAR ATOM JMP LEESCOM ; EINDE COMMANDO MUIS2: MOV FUN_CODE,AL ; ZET AL IN WERKRUIMTE AND AL,7FH ; RESET HOGE BIT CMP AL,09 ; TEST OP GELDIGE FUNCTIE JLE MUIS3 ; SPRING INDIEN GELDIG JMP ERROR ; GEEF FOUTMELDING EN BEEINDIG ROUTINE MUIS3: MOV AH,0 ; MAAK HOGE BYTE AX 0 SHL AX,1 ; MAAK ER EEN WORD POINTER VAN MOV BX,AX ; ZET TABEL OFFSET IN BASE REGISTER CALL WORD PTR MUISTAB[BX] ; SPRING NAAR SUBFUNCTIE JMP LEESCOM ; EINDE ROUTINE MUISTAB: DW MUISINIT, MUISCLR4, MUISSTAT, MUISAAN DW MUISUIT, MUISPOS4, MUISDEF, XMUISDEF, MUISVLAG DW AWMOUSE MUISINIT: MOV AX,000H ; LAADT MUISFUNCTIE INT 33H ; ROEP MUISFUNCTIE AAN AND AL,BL ; BEPAAL AANTAL MUISKNOPPEN CALL ZENDBYTE ; STUUR NAAR ATOM MOV CLEAR4MUIS,0 ; GEEN MUIS IN CLEAR 4 RET ; EINDE ROUTINE MUISCLR4: MOV CLEAR4MUIS,1 ; ZET MUIS VLAG AAN MOV AX,0007H ; HORIZONTALE GRENZEN VASTLEGGEN MOV CX,64 ; LAAGSTE HORIZONTALE GRENS MOV DX,574 ; HOOGSTE HORIZONTALE GRENS INT 33H ; ROEP MUISFUNCTIE AAN MOV AX,0008H ; VERTIKALE GRENZEN VASTLEGGEN MOV CX,2 ; LAAGSTE VERTIKALE GRENS MOV DX,197 ; HOOGSTE VERTIKALE GRENS INT 33H ; ROEP MUISFUNCTIE AAN CALL MUISAAN ; ZET MUISCURSOR AAN MOV AX,0 ; LAADT MUISCURSOR NUMMER JMP SHORT MUISDEF1 ; ZET MUISCURSOR MUISAAN: MOV CLEAR4MUIS,1 ; ZET MUISVLAG AAN MOV AX,0001 ; MUISCURSOR AANZETTEN INT 33H ; ROEP MUISFUNCTIE AAN RET ; EINDE ROUTINE MUISUIT: MOV AX,0002 ; MUISCURSOR UITZETTEN INT 33H ; ROEP MUISFUNCTIE AAN MOV CLEAR4MUIS,0 ; GEEN MUIS IN CLEAR 4 RET ; EINDE ROUTINE MUISSTAT: MOV AX,0003H ; MUISPOSITIE OPVRAGEN INT 33H ; ROEP MUISFUNCTIE AAN MOV AL,CL ; STUUR X-COORDINAAT NAAR ATOM CALL ZENDBYTE MOV AL,CH CALL ZENDBYTE MOV AL,DL ; STUUR Y-COORDINAAT NAAR ATOM CALL ZENDBYTE MOV AL,DH CALL ZENDBYTE MOV AL,BL ; STUUR KNOPPENSTATUS NAAR ATOM CALL ZENDBYTE RET ; EINDE ROUTINE MUISPOS4: MOV AX,0003H ; MUISPOSITIE OPVRAGEN INT 33H ; ROEP MUISFUNCTIE AAN SUB CX,64 ; X=(X-64)/2 SHR CX,1 MOV AL,CL ; STUUR X POSITIE NAAR ATOM CALL ZENDBYTE MOV AX,260 ; STUUR Y POSITIE NAAR ATOM SUB AX,DX CALL ZENDBYTE MOV AL,BL ; STUUR KNOPPENSTATUS NAAR ATOM CALL ZENDBYTE RET ; EINDE ROUTINE MUISDEF: CALL LEESBYTE ; LEES MUISCURSORNUMMER XOR AH,AH ; RESET HOGE BYTE MUISDEF1: SHL AX,5 ; BEREKEN INDEX IN MUIS CURSOR TABEL LEA BX,MUISCUR0 ; LAADT ADRES MET MUISCURSORS ADD AX,BX MOV SI,AX ; ZET IN INDEX REGISTER PUSH CS ; ZET CS IN ES POP ES CLD ; KOPIEER IN VOORWAARTSE RICHTING LEA DI,MUISMASKER ; LAADT BESTEMMING MOV CX,16 ; AANTAL TE KOPIEREN BYTES REP MOVSB ; KOPIEER MUIS SCREEN MASK ADD AX,16 ; VERHOOG SOURCE ADRES LEA DI,MUISMASKER+32; LAADT BESTEMMING MOV CX,16 ; AANTAL TE KOPIEREN BYTES REP MOVSB ; KOPIEER MUIS CURSOR MASK MOV DI,16 ; SET INDEX REGISTER MUISDEF2: MOV WORD PTR MUISMASKER+14[DI],0FFFFH MOV WORD PTR MUISMASKER+46[DI],00000H DEC DI ; VERLAAG DI TELLER DEC DI JNZ MUISDEF2 MOV DX,OFFSET MUISMASKER MOV BX,CX ; BX EN CX MOETEN 0 ZIJN MOV AX,0009H ; MUISFUNCTIE LADEN INT 33H RET ; EINDE ROUTINE XMUISDEF: CALL LEESBYTE ; LEES MUISCURSORNUMMER XOR AH,AH ; RESET HOGE BYTE XMUISDEF1: SHL AX,5 ; BEREKEN INDEX IN MUIS CURSOR TABEL LEA BX,MUISCUR0 ; LAADT ADRES MET MUISCURSORS ADD AX,BX MOV SI,AX ; ZET IN INDEX REGISTER LEA DI,MUISMASKER ; LAADT BESTEMMING MOV CX,8 ; AANTAL TE KOPIEREN WORDS XMUISDEF2: MOV AX,WORD PTR [SI] ; LEES DATA VAN SCREENMASK MOV [DI],AX ; ZET IN MUISMASKER INC DI ; VERHOOG POINTER INC DI ; VERHOOG POINTER MOV [DI],AX ; NOGMAALS IN MUISMASKER ZETTEN INC DI ; POINTER WEER VERHOGEN INC DI ; POINTER WEER VERHOGEN INC SI INC SI LOOP XMUISDEF2 ; DOE DIT ACHT KEER MOV CX,8 ; AANTAL TE KOPIEREN WORDS XMUISDEF3: MOV BX,WORD PTR [SI] ; LEES DATA VAN CURSORMASK MOV DX,8 ; LAADT TELLER XMUISDEF4: SHL BX,1 ; SCHUIF HOOGSTE BIT IN CARRY PUSHF ; BEWAAR CARRY RCL AX,1 ; SCHUIF BIT IN AX POPF ; HAAL CARRY TERUG RCL AX,1 ; SCHUIF NOGMAALS IN AX SHL BX,1 ; VOLGENDE BIT VAN BX VERWAARLOZEN DEC DX ; VERLAAG TELLER JNZ XMUISDEF4 ; SPRING INDIEN NOG BITS VOLGEN MOV [DI],AX ; ZET DATA IN CURSORMASKER INC DI ; VERHOOG POINTER INC DI ; VERHOOG POINTER MOV [DI],AX ; ZET DATA NOGMAALS IN CURSORMASKER INC DI ; POINTER WEER VERHOGEN INC DI ; POINTER WEER VERHOGEN INC SI INC SI LOOP XMUISDEF3 ; DOE DIT ACHT KEER PUSH CS ; ZET CS IN ES POP ES MOV DX,OFFSET MUISMASKER MOV BX,CX ; BX EN CX MOETEN 0 ZIJN MOV AX,0009H ; MUISFUNCTIE LADEN INT 33H RET ; EINDE ROUTINE MUISVLAG: CALL LEESBYTE ; LEES DATA CMP JERRY,40H ; TEST OF MUISDRIVER ACTIEF JE MUISVLAG1 ; SPRING ALS GEEN MUISDRIVER ACTIEF IS AND AL,00000001 ; ALLEEN LAAGSTE BIT GELDT MOV CLEAR4MUIS,AL ; ZET VLAGGETJE MUISVLAG1: RET ; EINDE ROUTINE DEFMUISMASKER: XOR DI,DI ; RESET INDEX REGISTER DEFMUISMASKER1: CALL LEESBYTE ; LEES DATA MOV MUISMASKER[DI],AL ; ZET IN GEHEUGEN INC DI ; VERHOOG INDEX CMP DI,64 ; TEST OF ALLE DATA GELEZEN JNE DEFMUISMASKER1 ; SPRING ALS NOG DATA VOLGEN JMP LEESCOM ; EINDE COMMANDO CURSORPOS: MOV AH,3 ; FUNCTIE 3 VAN INT 10H MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H MOV AL,DL ; ZEND X-POS NAAR ATOM CALL ZENDBYTE MOV AL,DH ; ZEND Y-POS NAAR ATOM CALL ZENDBYTE JMP LEESCOM ; EINDE COMMANDO VIDEO: CALL LEESREGS ; LEES ALGEMENE REGISTERS INT 10H ; VOER VIDEO INTERRUPT UIT CALL ZENDREGS ; RESULTATEN TERUG JMP LEESCOM SERPOORT: CALL LEESREGS ; LEES ALGEMENE REGISTERS INT 14H ; VOER INTERRUPT UIT CALL ZENDREGS ; RESULTATEN TERUG JMP LEESCOM BIOSKEY: CALL LEESREGS ; LEES ALGEMENE REGISTERS INT 16H ; VOER INTERRUPT UIT MOV DH,0 ; DH REGISTER WORDT 0 JZ BIOSKEY1 ; INDIEN GEEN TOETS GEDRUKT SPRINGEN OR DH,1 ; ER IS EEN TOETS GEDRUKT, ZET BIT BIOSKEY1: CALL ZENDREGS ; RESULTATEN TERUG JMP LEESCOM PARPOORT: CALL LEESREGS ; LEES ALGEMENE REGISTERS INT 17H ; VOER INTERRUPT UIT CALL ZENDREGS ; RESULTATEN TERUG JMP LEESCOM DOSFUNCTIE: CALL LEESREGS ; LEES ALGEMENE REGISTERS INT 21H ; VOER DOS INTERRUPT UIT CALL ZENDREGS ; RESULTATEN TERUG JMP LEESCOM LEESREGS PROC NEAR CALL LEESBYTE ; LEES AL LEESREGS2: MOV AH,AL ; WIS BERG AL TIJDELIJK OP CALL LEESBYTE ; LEES AH XCHG AL,AH ; WISSEL AH EN AL OM PUSH AX ; BEWAAR AX CALL LEESBYTE ; LEES REGISTERS BX,CX EN DX MOV BL,AL CALL LEESBYTE MOV BH,AL CALL LEESBYTE MOV CL,AL CALL LEESBYTE MOV CH,AL CALL LEESBYTE MOV DL,AL CALL LEESBYTE MOV DH,AL POP AX ; HAAL FUNCTIE NUMMER TERUG RET LEESREGS ENDP ZENDREGS PROC NEAR CALL ZENDBYTE ; STUUR AX, BX, CX EN DX NAAR ATOM MOV AL,AH CALL ZENDBYTE MOV AL,BL CALL ZENDBYTE MOV AL,BH CALL ZENDBYTE MOV AL,CL CALL ZENDBYTE MOV AL,CH CALL ZENDBYTE MOV AL,DL CALL ZENDBYTE MOV AL,DH CALL ZENDBYTE RET ZENDREGS ENDP PORT_IN: CALL LEESBYTE ; LEES I/O ADRES MOV DL,AL ; ZET DIT ADRES IN DX CALL LEESBYTE MOV DH,AL IN AL,DX ; LEES BYTE VAN PORT CALL ZENDBYTE ; STUUR NAAR ATOM JMP LEESCOM ; EINDE COMMANDO PORT_OUT: CALL LEESBYTE ; LEES I/O ADRES MOV DL,AL ; ZET DIT ADRES IN DX CALL LEESBYTE MOV DH,AL CALL LEESBYTE ; LEES DATA OUT DX,AL ; STUUR DATA NAAR PORT JMP LEESCOM ; EINDE COMMANDO UDS: CALL LEESBYTE ; LEES NUMMER VAN HET KARAKTER XOR AH,AH ; WIS AH MOV CL,4 ; LAADT VERMENIGVULDIGINGSFACTOR SHL AX,CL ; BEREKEN INDEX MOV DI,AX ; RESULTAAT NAAR INDEXREGISTER MOV CX,16 ; LAADT TELLER UDSREAD: CALL LEESBYTE ; LEES DATA MOV RAMFONT[DI],AL ; ZET IN KARAKTERTABEL INC DI ; VERHOOG POINTER LOOP UDSREAD JMP LEESCOM ; EINDE ROUTINE MOUSE_MOT: MOV AX,11 ; OPVRAGEN MUIS VERPLAATSING INT 33H MOV AL,0 ; LAADT (VOORLOPING) RESULTAAT TEST CX,0FFFFH ; BEPAAL TEKEN VAN CX JZ MOUSE_MOT1 ; INDIEN GEEN HOR. BEWEGING SPRINGEN JS MOUSE_MOT2 ; SPRING INDIEN NEGATIEF INC AL ; MUIS WAS NAAR RECHTS, VERHOOG AL JMP SHORT MOUSE_MOT1 MOUSE_MOT2: DEC AL ; MUIS WAS NAAR LINKS, VERLAAG AL MOUSE_MOT1: CALL ZENDBYTE ; RESULTAAT NAAR ATOM TEST DX,0FFFFH ; BEPAAL TEKEN VAN DX JZ MOUSE_MOT3 ; INDIEN GEEN VER. BEWEGING SPRINGEN JS MOUSE_MOT4 ; SPRING INDIEN NEGATIEF INC AL ; MUIS WAS NAAR OMLAAG, VERHOOG AL JMP SHORT MOUSE_MOT3 MOUSE_MOT4: DEC AL ; MUIS WAS NAAR OMHOOG, VERLAAG AL MOUSE_MOT3: CALL ZENDBYTE ; RESULTAAT NAAR ATOM MOV AX,03H ; LEES BUTTON STATUS VAN MUIS INT 33H MOV AL,BL ; KNOPPEN NAAR AL CALL ZENDBYTE ; STUUR NAAR ATOM JMP LEESCOM ; EINDE COMMANDO WHOAMI: INT 11H ; VRAAG SYSTEEM CONFIGURATIE OP AND AX,1100111011110001B ; SOMMIGE BITS NIET VAN TOEPASSING MOV BL,VIDEOKAART ; LEES CODE VOOR VIDEOKAART AND BL,00110000B ; TEST OP HERCULES CMP BL,30H JNE WHOAMI1 ; SPRING INDIEN GEEN HERCULES OR AL,00001000B ; ZET HERCULESBIT INDIEN ZO WHOAMI1: MOV BX,0F000H ; ZET ES NAAR BIOS SEGMENT MOV ES,BX MOV SI,0FFFEH ; SI WIJST NAAR PC TYPE BYTE MOV BL,ES:[SI] ; LEES PC TYPE CMP BL,0FCH ; IS HET EEN AT? JNE GEEN_AT ; SPRING ALS HET GEEN AT IS OR AL,00000100B ; ZET AT BIT GEEN_AT: OR AH,VIDEOKAART ; NEEM VIDEOTYPE MEE TEST_X87: MOV BX,AX ; ZET CONFIGURATIE EVEN IN BX XOR AX,AX ; MAAK AX 0 FINIT ; INIT DE 80x87 FSTSW AX ; LEES STATUSREGISTER OR AL,AL ; 80x87 AANWEZIG JNE GEEN_X87 ; SPRING INDIEN NIET AANWEZIG OR BL,00000010B ; WEL AANWEZIG, ZET BIT 1 GEEN_X87: MOV AX,BX ; ZET CONFIGURATIE WEER IN AX CALL ZENDBYTE ; STUUR HET RESULTAAT NAAR ATOM MOV AL,AH CALL ZENDBYTE JMP LEESCOM ; EINDE COMMANDO PALET: CALL LEESBYTE ; LEES PALETNUMMER MOV AH,0BH ; NUMMER VAN VIDEO FUNCTIE XOR BH,BH ; RESET BH TEST AL,80H ; BEPAAL OPDRACHT JNZ PALET1 ; SPRING ALS ACHTERGR.KLEUR WIJZIGEN INC BH ; BH := 1 ALS PALET WIJZIGEN PALET1: AND AL,01111111B ; KLEURNUMMER BEPALEN MOV BL,AL ; ZET KLEURNUMMER IN BL INT 10H ; VOER FUNCTIE UIT JMP LEESCOM ; EINDE COMMANDO VIDEOMOD: CALL LEESBBC ; LEES VIDEO MODE CMP BBC,0 ; TEST OP BBC MODUS JE VIDEOMOD0 ; SPRING IN ATOM MODE CMP AL,7 ; TEST OP GELDIGE VIDEO MODE JG VIDMODERR ; SPRING INDIEN ONGELDIG MOV BBCSCREEN,AL ; ZET VIDEO MODE IN GEHEUGEN XOR AH,AH ; AH WORDT 0 MOV SI,AX ; ZET VIDEOMODE IN INDEXREGISTER MOV AL,PWIDTHTAB[SI]; LEES PIXEL GROOTTE MOV BBCPWIDTH,AL ; ZET IN GEHEUGEN MOV AL,PMASKTAB[SI] ; LEES AANTAL KLEURBITS PER PIXEL MOV BBCPMASK,AL ; ZET IN GEHEUGEN MOV VENSTER_XLO,0 ; RESET TEKSTVENSTER MOV AL,BBCMAXY[SI] MOV VENSTER_YLO,AL MOV AL,BBCMAXX[SI] MOV VENSTER_XRB,AL MOV VENSTER_YRB,0 MOV OORSPRONG_X,0 MOV OORSPRONG_Y,0 CALL GWINDOWOFF MOV AL,BBCSCRTAB[SI]; LAADT PC VIDEO MODE INT 10H ; ZET VIDEOKAART IN VGA 640*480*16 CALL _CTRL_T ; PALET NOG INSTELLEN JMP LEESCOM ; EINDE COMMANDO VIDEOMOD0: ADD AL,5 ; VOOR TABEL EERST 5 ERBIJ TELLEN CMP AL,32 ; TEST OP GELDIGE PARAMETER JAE VIDMODERR ; FOUTMELDING BIJ ONGELDIGE PARAMETER XOR AH,AH ; AH := 00 MOV DI,AX ; ZET VIDEOMODE IN INDEXREGISTER SHL AX,1 ; HET IS EEN WORD POINTER MOV SI,AX ; ZET IN INDEX REGISTER MOV AX,VIDEOTABEL[SI] ; LEES MODE UIT TABEL CMP AX,0FFFFH ; TEST OP GELDIGE MODE JNE VIDEOMOD1 VIDMODERR: LEA DX,MOD_ERR ; LAADT POINTER NAAR FOUTMELDING MOV AH,09H ; LAADT DOS FUNCTIE NUMMER INT 21H ; ZET FOUTMELDING OP HET SCHERM JMP LEESCOM ; COMMANDO AFBREKEN VIDEOMOD1: CMP AH,01H ; TEST OP VESA MODE JNE VIDEOMOD2 MOV BX,AX ; VESA VIDEO MODE NAAR BX REGISTER MOV AX,4F02H ; VESA FUNCTIE NUMMER IN AX LADEN JMP SHORT VIDEOMOD3 ; SPRING ALTIJD VIDEOMOD2: CMP AH,0FFH ; TEST OP DIRECT VIDEO ACCESS MODE JNE VIDEOMOD3 ; SPRING BIJ NORMALE VIDEO MODE XOR AH,AH ; CLEAR AH SHL AX,1 ; VERMENIGVULDIG OFFSET VOOR TABEL MOV DI,AX ; ZET IN INDEXREGISTER CALL DVAMODE[DI] ; INITIALISEER VIDEOMODE MOV DVA_ACTIVE,1 ; DIRECT VIDEO ACCESS ACTIEF JMP SHORT VIDEOMOD4 ; SPRING ALTIJD VIDEOMOD3: INT 10H ; STEL MODE IN MOV DVA_ACTIVE,0 ; DIRECT VIDEO ACCESS NIET ACTIEF ; --------------------------------------------------------------------------- ; Versie 2.xx zet hier het grafisch venster uit, plaatst de oorsprong ; terug naar 0,0 en zet beeldpagina 0 voor. Versie 4.xx zet tevens het ; tekstwindow goed voor de bekende grafische modi. ; --------------------------------------------------------------------------- VIDEOMOD4: MOV OORSPRONG_X,0 MOV OORSPRONG_Y,0 CALL GWINDOWOFF MOV AX,0500H ; BEELDPAGINA 0 KIEZEN INT 10H MOV SCHERMPAG,0 WINDOW_OFF: MOV AH,0FH ; SCHERMBREEDTE OPVRAGEN INT 10H DEC AH ; MET EEN VERMINDEREN MOV VENSTER_XRB,AH ; RESET VENSTER MOV VENSTER_YRB,0 MOV VENSTER_XLO,0 MOV AL,TWINTAB[DI] ; LEES HOOGTE VAN VENSTER UIT TABEL MOV VENSTER_YLO,AL MOV KLEUR_EO,0 ; RESET PIXEL BEWERKINGSMASKER MOV LINE_STYLE,0FFFFH ; RESET LINE STYLE JMP LEESCOM ; EINDE COMMANDO VIDEOCOL: CALL LEESBBC ; LEES KLEUR CALL _VIDEOCOL ; STEL KLEUR IN JMP LEESCOM ; EINDE COMMANDO _VIDEOCOL: CMP BBC,1 ; TEST OP BBC MODE JNE VIDEOCOL_ATOM TEST AL,80H ; TEST VOORGROND/ACHTERGROND JZ VIDEOCOL1 ; SPRING INDIEN VOORGRONDKLEUR AND AL,0FH ; WIS HOGE NIBBLE MOV BBCBCOLT,AL ; ZET ACHTERGRONDKLEUR MOV AL,BBCFCOLT ; LAADT VOORGRONDKLEUR JMP SHORT VIDEOCOL2 ; SPRING ALTIJD VIDEOCOL1: AND AL,0FH ; WIS HOGE NIBBLE MOV BBCFCOLT,AL ; ZET VOORGRONDKLEUR VIDEOCOL2: MOV AH,BBCBCOLT ; LAADT ACHTERGRONDKLEUR IN AH SHL AH,4 ; SCHUIF VIERMAAL LINKS OR AL,AH ; BEPAAL PC TEKST ATTRIBUUT VIDEOCOL_ATOM: MOV KLEUR,AL ; ZET NIEUWE KLEUR RET ; EINDE COMMANDO SCHRIJFPIX: CALL LEESBYTE ; LEES COORDINATEN MOV CL,AL CALL LEESBYTE MOV CH,AL CALL LEESBYTE MOV DL,AL CALL LEESBYTE MOV DH,AL CALL LEESBYTE ; LEES PLOTOPDRACHT ; --------------------------------------------------------------------------- ; Versie 2.xx telt bij de ontvangen coordinaten de offset voor de verschoven ; oorsprong op. Daarna wordt gekeken of de absolute coordinaten binnen het ; grafische venster vallen. Zo nee, dan wordt er niets geplot. ; --------------------------------------------------------------------------- ADD CX,OORSPRONG_X; COORDINATEN AANPASSEN ADD DX,OORSPRONG_Y CMP CX,GWINDOW_XLO; TEST OF X BINNEN VENSTER VALT JB SCHRIJFGEENPIX; NEE, DAN GEEN PIXEL PLOTTEN CMP CX,GWINDOW_XRB JA SCHRIJFGEENPIX CMP DX,GWINDOW_YRB; TEST OF Y BINNEN VENSTER VALT JB SCHRIJFGEENPIX; NEE, DAN GEEN PIXEL PLOTTEN CMP DX,GWINDOW_YLO JA SCHRIJFGEENPIX ; --------------------------------------------------------------------------- CMP AL,1 ; TEST OP PIXEL ZETTEN JE SCHRIJFPIX1 CMP AL,2 ; TEST OP PIXEL INVERTEREN JE SCHRIJFPIX2 XOR AL,AL ; PIXEL WISSEN IN OVERIGE GEVALLEN JMP SHORT SCHRIJFPIX3 SCHRIJFPIX1: MOV AL,KLEUR ; ZET KLEUR IN AL JMP SHORT SCHRIJFPIX3 SCHRIJFPIX2: MOV AL,KLEUR ; ZET KLEUR IN AL OR AL,80H ; ZET BIT 7 VOOR INVERTEREN SCHRIJFPIX3: ; XOR BX,BX ; SCHERMPAGINA 0 (GRAFISCH 1 PAGINA !) ; MOV AH,0CH ; VIDEO FUNCTIE 0C UITVOEREN ; INT 10H CALL PUTPIX ; PLOT PIXEL SCHRIJFGEENPIX: JMP LEESCOM ; EINDE COMMANDO WINDOW: MOV CX,4 ; AANTAL TE LEZEN BYTES XOR DI,DI ; LAADT POINTER WINDOW1: CALL LEESBBC ; LEES COORDINAAT MOV VENSTER_XLO[DI],AL INC DI ; VERHOOG POINTER LOOP WINDOW1 MOV DL,VENSTER_XLO ; LAADT NIEUWE CURSOR POSITIE MOV DH,VENSTER_YRB MOV REGELS,0 ; RESET REGELTELLER VOOR PAGEMODE JMP ZETCURSOR ; EINDE COMMANDO JOYSTICK: CALL _JOYSTICK CALL ZENDBYTE ; STUUR RESULTAAT NAAR ATOM JMP LEESCOM _JOYSTICK: CALL LEESSTICK ; LEES JOYSTICK UIT MOV AH,AL ; ZET TOETSEN IN AH MOV AL,0FFH ; RESET JOYSTICK STATUS CMP BX,JOY_LINKS ; TEST LINKS JG JOYSTICK1 ; SPRING INDIEN NIET LINKS AND AL,11111101B ; ZET "LINKS" BIT JMP SHORT JOYSTICK2 JOYSTICK1: CMP BX,JOY_RECHTS ; TEST RECHTS JL JOYSTICK2 ; SPRING INDIEN NIET RECHTS AND AL,11110111B ; ZET "RECHTS" BIT JOYSTICK2: CMP CX,JOY_BOVEN ; TEST OMHOOG JG JOYSTICK3 ; SPRING INDIEN NIET OMHOOG AND AL,11101111B ; ZET "OMHOOG" BIT JMP JOYSTICK4 JOYSTICK3: CMP CX,JOY_ONDER ; TEST OMLAAG JL JOYSTICK4 ; SPRING INDIEN NIET OMLAAG AND AL,11111011B ; ZET "OMLAAG" BIT JOYSTICK4: AND AH,00110000B ; TEST JOYSTICK TOETSEN CMP AH,30H JE JOYSTICK5 ; SPRING INDIEN GEEN TOETS GEDRUKT AND AL,11111110B ; ZET "VUUR" BIT JOYSTICK5: RET ; EINDE ROUTINE CALLIBRATE: CALL JOYCALLI ; CALLIBREER JOYSTICK JMP LEESCOM ; EINDE COMMANDO LEESSTICK PROC NEAR MOV DX,201H ; LAADT ADRES VAN GAME-POORT XOR BX,BX ; RESET TELLER HORIZONTAAL XOR CX,CX ; RESET TELLER VERTIKAAL OUT DX,AL ; GEEF TRIGGERPULS LEESSTICK1: IN AL,DX ; LEES TRIGGERS TEST AL,1 ; TEST HORIZONTAAL BIT JZ LEESSTICK2 ; SPRING INDIEN 0 INC BX ; VERHOOG HORIZONTAAL TELLER LEESSTICK2: TEST AL,2 ; TEST VERTIKAAL BIT JZ LEESSTICK3 ; SPRING INDIEN 0 INC CX ; VERHOOG VERTIKAAL TELLER LEESSTICK3: CMP BX,500H ; TIME-OUT ALS GEEN KNUPPEL AANWEZIG JE ENDSTICK TEST AL,3 ; TEST OF BEIDE RICHTINGEN KLAAR JNZ LEESSTICK1 ; SPRING INDIEN NOG NIET KLAAR ENDSTICK: RET ; EINDE ROUTINE LEESSTICK ENDP JOYCALLI PROC NEAR CALL LEESSTICK ; LEES JOYSTICK STAND MOV AX,BX ; COPIEER WAARDE IN AX SHR AX,1 ; ZET LINKER MARGE MOV JOY_LINKS,AX ADD BX,AX ; ZET RECHTER MARGE MOV JOY_RECHTS,BX MOV AX,CX ; COPIEER WAARDE IN AX SHR AX,1 ; ZET BOVEN MARGE MOV JOY_BOVEN,AX ADD CX,AX ; ZET ONDER MARGE MOV JOY_ONDER,CX RET ; EINDE ROUTINE JOYCALLI ENDP BIT7: CALL LEESBYTE ; LEES WAARDE MOV CL,7 ; LAADT TELLER SHL AL,CL ; ZET BIT 0 OP POSITIE 7 OR AL,7FH ; BIT 0..6 NIET WIJZIGEN MOV MSB,AL ; BERG OP IN GEHEUGEN JMP LEESCOM ; EINDE COMMANDO ZOEKFILE: MOV CX,0FFFFH ; ZOEKEN NAAR ALLE BESTANDEN CALL FINDFIRST ; LEES FILESPEC EN ZOEK FILE JNC ZOEK1 ; SPRING ALS GEEN FOUT IS OPGETREDEN JMP FILE_ERROR ZOEK1: XOR AL,AL ; GEEF AAN DAT DTA VOLGT CALL ZENDBYTE MOV AH,2FH ; DOS FUNCTIE: DTA OPVRAGEN INT 21H ADD BX,21 ; ALLEEN VANAF OFFSET 21 OVERSTUREN MOV SI,BX ; ZET BEGIN DTA IN INDEXREGISTER MOV CX,22 ZOEK2: MOV AL,[SI] ; LEES DATA UIT DTA CALL ZENDBYTE ; STUUR NAAR ATOM INC SI ; VERHOOG INDEX LOOP ZOEK2 ; SPRING INDIEN NOG DATA VOLGEN JMP LEESCOM ; EINDE COMMANDO ZOEKNEXT: CALL FINDNEXT ; ZOEK VOLGENDE FILE JNC ZOEK1 ; INDIEN GEVONDEN STUUR DTA NAAR ATOM JMP FILE_ERROR ; ANDERS EINDE COMMANDO LPT: CALL LEESBYTE ; LEES GESELECTEERDE PRINTER CMP AL,0 ; ALLEEN STATUS OPVRAGEN? JNE LPT1 ; NEE, DAN SPRINGEN MOV AL,PRNNR ; LAADT HUIDIG PRINTERNUMMER INC AL LPT1: DEC AL ; VERLAAG PRINTERNUMMER MOV PRNNR,AL ; ZET IN PRINTERNUMMER XOR AH,AH ; WIS AH MOV DX,AX ; ZET PRINTERNUMMER IN DX MOV AH,02H ; PRINTER STATUS OPVRAGEN INT 17H MOV AL,AH ; STUUR STATUS NAAR ATOM CALL ZENDBYTE JMP LEESCOM ; EINDE COMMANDO MOUSEKAR: MOV AH,03H ; INT 10H, FUNCTIE 3: CURSORPOS HALEN MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H PUSH DX ; BEWAAR CURSORPOSITIE OP STACK MOV AX,0003H ; OPVRAGEN MUISPOSITIE INT 33H SHR DX,1 ; MUISCOORDINATEN DOOR 8 DELEN SHR DX,1 SHR DX,1 SHR CX,1 SHR CX,1 SHR CX,1 MOV DH,DL ; KOLOM NAAR DH MOV DL,CL ; REGEL NAAR DL MOV AH,02H MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER INT 10H ; TEKST CURSOR VERPLAATSEN MOV AH,08H ; TEKEN OP CURSORPOSITIE LEZEN INT 10H CALL ZENDBYTE ; STUUR TEKEN NAAR ATOM POP DX ; CURSOR WEER NAAR OORSPR. PLAATS MOV AH,02H INT 10H JMP LEESCOM ; --------------------------------------------------------------------------- ; Uitbreiding commando's versie 2.xx ; --------------------------------------------------------------------------- TEKEN2LPT: CALL LEESBBC ; LEES HET TEKEN CMP PRINTERSTATUS,0 ; TEST OF PRINTER AANGEZET IS MET $2 JE PRINTER_UIT ; NIET DOEN ALS PRINTER UIT STAAT XOR AH,AH ; PRINTER FUNCTIE: TEKEN UITVOEREN MOV DL,PRNNR ; KIES GESELECTEERDE PRINTER XOR DH,DH INT 17H ; STUUR TEKEN NAAR PRINTER PRINTER_UIT: JMP LEESCOM ; EINDE COMMANDO CGABITMAP: CALL LEESBYTE ; LEES NUMMER VAN KARAKTER AND AL,7FH ; BIT 7 MOET 0 ZIJN, (128...255) XOR AH,AH MOV CL,3 ; VERMENIGVULDIG MET 8 SHL AX,CL MOV DI,AX ; ZET OFFSET IN DI REGISTER MOV CX,8 ; LAADT AANTAL TE LEZEN BYTES JMP UDSREAD ; GA DATA INLEZEN GWINDOW: MOV CX,8 ; AANTAL TE LEZEN BYTES XOR DI,DI ; LAADT POINTER GWINDOW1: CALL LEESBBC ; LEES COORDINAAT MOV BYTE PTR GWINDOW_XLO[DI],AL INC DI ; VERHOOG POINTER LOOP GWINDOW1 JMP LEESCOM ; EINDE ROUTINE GWOFF: CALL GWINDOWOFF ; RESET GRAFISCH VENSTER JMP LEESCOM ; EINDE COMMANDO GWINDOWOFF PROC NEAR CMP BBC,0 ; TEST OP BBC MODE JE GWINDOWOFFATOM ; SPRING IN ATOM MODE MOV GWINDOW_XLO,-1279 ; RESET GRAFISCH VENSTER MOV GWINDOW_YLO,-1023 MOV GWINDOW_XRB,1279 MOV GWINDOW_YRB,1023 RET ; EINDE ROUTINE GWINDOWOFFATOM: MOV GWINDOW_XLO,0 ; RESET GRAFISCH VENSTER MOV GWINDOW_YLO,-1 MOV GWINDOW_XRB,-1 MOV GWINDOW_YRB,0 RET ; EINDE ROUTINE GWINDOWOFF ENDP OORSPRONG: MOV CX,4 ; AANTAL TE LEZEN BYTES XOR DI,DI ; LAADT POINTER OORSPRONG1: CALL LEESBBC ; LEES COORDINAAT MOV BYTE PTR OORSPRONG_X[DI],AL INC DI ; VERHOOG POINTER LOOP OORSPRONG1 JMP LEESCOM ; EINDE ROUTINE VIEWSCHERM: CALL LEESBYTE ; LEES SCHERM PAGINA NUMMER MOV AH,05H ; KIES ZICHTBARE PAGINA INT 10H JMP LEESCOM ; EINDE ROUTINE WERKSCHERM: CALL LEESBYTE ; LEES SCHERM PAGINA NUMMER MOV SCHERMPAG,AL ; ZET NIEUW PAGINA NUMMER JMP LEESCOM ; EINDE ROUTINE CURSORDEF: CALL LEESBYTE ; LEES BOVENSTE LIJN VAN DE CURSOR MOV AH,AL ; ZET IN AH CALL LEESBYTE ; LEES ONDERSTE LIJN VAN DE CURSOR MOV CURLINES,AX ; BERG CURSOR DEFINITIE OP JMP CURSOR_ON ; ZET DE NIEUWE CURSOR OP HET SCHERM ;WRITE_B000: CALL LEESBYTE ; LEES GESCHREVEN DATA ; CMP AL,0FFH ; TEST OP UITZETTEN VAN EMULATIE ; JE WR1 ; JA, DAN SPRINGEN ; AND AL,0FH ; ALLEEN VIER LAAGSTE BITS VAN BELANG ;WR1: MOV ADRES_B000,AL ; BERG WAARDE OP IN ADRES B000 ; JMP LEESCOM ; EINDE COMMANDO ;READ_B001: CALL _JOYSTICK ; LEES JOYSTICK ; MOV BL,AL ; BEWAAR STATUS VAN JOYSTICK ; MOV AH,2 ; LEES KEYBOARD STATUS ; INT 16H ; TEST AL,00000011B ; TEST OP SHIFTTOETS ; JE READ1 ; SPRING INDIEN GEEN SHIFTTOETS ; AND BL,01111111B ; ZET SHIFT BIT ;READ1: TEST AL,00000100B ; TEST OP CONTROL TOETS ; JE READ2 ; SPRING INDIEN GEEN CONTROL TOETS ; AND BL,10111111B ; ZET CTRL BIT ;READ2: XOR AH,AH ; BEPAAL RIJ VAN KEYBOARD MATRIX ; MOV AL,ADRES_B000 ; CMP AL,0FFH ; KIJK OF 8255 EMULATIE AANSTAAT ; JE READ2A ; SPRING INDIEN NIET AKTIEF ; MOV SI,AX ; ZET RIJ IN INDEXREGISTER ; MOV AL,BL ; ZET RESULTAAT IN AL ; AND AL,KEYMATRIX[SI]; LEES STATUS VAN ATOM-TOETSENBORD ;READ2A: CALL ZENDBYTE ; STUUR NAAR DE ATOM ; JMP LEESCOM ; EINDE ROUTINE ;READ_B002: MOV BL,6FH ; ZET INITIELE WAARDE ; MOV AH,2 ; LEES KEYBOARD STATUS ; INT 16H ; TEST AL,08H ; TEST OP ALT TOETS ; JE READ3 ; SPRING INDIEN GEEN ALT TOETS ; AND BL,0BFH ; WIS BIT VOOR ALT TOETS ;READ3: IN AL,40H ; LEES LAGE BYTE VAN TIMER 0 ; TEST AL,02H ; TEST LAGE BIT "2400 HZ" ; JE READ4 ; SPRING INDIEN 0 ; OR BL,10H ; ZET "2400 HZ" BIT ;READ4: IN AL,40H ; LEES HOGE BYTE VAN TIMER 0 ; TEST AL,80H ; TEST HOGE BIT "60 HZ" ; JE READ5 ; SPRING INDIEN 0 ; OR BL,80H ; ZET "60 HZ" BIT ;READ5: MOV AL,BL ; ZET RESULTAAT IN AL ; CALL ZENDBYTE ; STUUR NAAR ATOM ; JMP LEESCOM ; EINDE ROUTINE EGAFONT: MOV BX,1000H ; 16 BYTES PER TEKEN, TEKENSET 0 MOV CX,256 ; 256 TEKENS IN DE TABEL MOV DX,0000H ; ASCII WAARDE VAN EERSTE TEKEN PUSH CS ; SEGMENT ADRES VAN FONTTABEL POP ES ; IN ES ZETTEN MOV AX,OFFSET RAMFONT MOV BP,AX ; ZET OFFSET ADRES VAN FONTTABEL MOV AX,1110H ; INT 10, FUNCTIE 11, SUBFUNCTIE 10 INT 10H JMP LEESCOM ; EINDE ROUTINE EGA8X14: MOV AX,1111H ; 8*14 TEKENSET LADEN EN AKTIVEREN JMP SHORT _EGA8X8 ; GEDWONGEN SPRONG EGA8X8: MOV AX,1112H ; 8*8 TEKENSET LADEN EN AKTIVEREN _EGA8X8: XOR BL,BL ; EGA TEKENTABEL 0 INT 10H ; FUNCTIE UITVOEREN JMP LEESCOM ; EINDE ROUTINE ; --------------------------------------------------------------------------- ; Via INT 61H kunnen externe commando's worden toegevoegd met een specifieke ; functie (bijvoorbeeld pattern fill routines). Het subcommandonummer kan ; gegeven worden in bijvoorbeeld het AH register. Parameters en resultaten ; kunnen via de registers AX, BX, CX en DX gegeven worden. Eventuele extra ; communicatie kan plaatsvinden via INT 60H. ; --------------------------------------------------------------------------- ROEP61: INT 61H ; ROEP USER INTERRUPT 61H OP JMP LEESCOM ; --------------------------------------------------------------------------- ; Nieuwe commando's vanaf versie 3.xx - Juli 1994 ; --------------------------------------------------------------------------- READMEM: CALL LEESBYTE ; LEES OFFSET LB MOV BL,AL ; ZET OFFSET IN BX CALL LEESBYTE MOV BH,AL CALL LEESBYTE ; LEES SEGMENT LB MOV AH,AL ; ZET SEGMENT IN CX CALL LEESBYTE XCHG AH,AL MOV ES,AX ; ZET SEGMENT ADRES IN ES MOV AL,ES:BX ; LEES DATA CALL ZENDBYTE ; STUUR NAAR ATOM JMP LEESCOM WRITEMEM: CALL LEESBYTE ; LEES OFFSET LB MOV BL,AL ; ZET OFFSET IN BX CALL LEESBYTE MOV BH,AL CALL LEESBYTE ; LEES SEGMENT LB MOV AH,AL ; ZET SEGMENT IN CX CALL LEESBYTE XCHG AH,AL MOV ES,AX ; ZET SEGMENT ADRES IN ES CALL LEESBYTE ; LEES DATA MOV ES:BX,AL ; SCHRIJF DATA JMP LEESCOM SETFONTDRV: CALL LEESBYTE ; LEES DRIVELETTER MOV ATOMVDUFNT,AL ; ZET IN FONT-PAD JMP LEESCOM ; EINDE FUNCTIE SWITCH2BBC: CALL LEESBYTE ; LAADT MODE (0=ATOM, 1=BBC BASIC) MOV BBC,AL ; STEL VLAG IN JMP LEESCOM ; EINDE FUNCTIE GTEXT_ATTR: CALL _GTEXT_ATTR ; LEES ATTRIBUUT JMP LEESCOM ; EINDE FUNCTIE DIR_VID_ACC: CALL LEESBYTE ; LEES SUBFUNCTIE CMP AL,0 JE DIR_VID_RD ; FUNCTIE 0: LEES DIRECT VIDEO CMP AL,1 JE DIR_VID_WR ; FUNCTIE 1: SCHRIJF DIRECT VIDEO CMP AL,2 JE DIR_VID_MOVE ; FUNCTIE 2: BLOK KOPIEREN CMP AL,3 ; FUNCTIE 3: LEES PC GEHEUGEN JE READMEM CMP AL,4 ; FUNCTIE 4: SCHRIJF PC GEHEUGEN JE WRITEMEM CMP AL,59H ; FUNCTIE #59: ZET ATOMVDU FONT DRIVE JE SETFONTDRV CMP AL,5AH ; FUNCTIE #5A: SWITCH ATOM/BBC MODE JE SWITCH2BBC CMP AL,5BH ; FUNCTIE #5B: RESET TYPE OPVRAGEN JE GETRESET CMP AL,5CH ; FUNCTIE #5C: RESET TYPE INSTELLEN JE SETRESET CMP AL,5EH ; FUNCTIE #5E: GTEXT ATTRIBUUT JE GTEXT_ATTR CMP AL,5DH ; FUNCTIE #5D: RESET ATOM JE DO_RESET MOV FUN_CODE,AL ; ONBEKENDE FUNCTIE, JMP ERROR ; GEEF FOUTMELDING DIR_VID_RD: CALL LEESBYTE ; LEES LSB VIDEO OFFSET ADRES VAN ATOM MOV AH,AL CALL LEESBYTE ; LEES MSB VIDEO OFFSET ADRES VAN ATOM XCHG AH,AL ; WISSEL MSB EN LSB MOV BX,0B000H ; LAADT VIDEO SEGMENT MOV ES,BX ; ZET IN ES REGISTER MOV SI,AX ; ZET OFFSET IN SI REGISTER MOV AL,ES:[SI] ; LEES DATA DIE OP HET SCHERM STAAT CALL ZENDBYTE ; STUUR NAAR ATOM JMP LEESCOM ; EINDE COMMANDO DIR_VID_WR: CALL LEESBYTE ; LEES LSB VIDEO OFFSET ADRES VAN ATOM MOV AH,AL CALL LEESBYTE ; LEES MSB VIDEO OFFSET ADRES VAN ATOM XCHG AL,AH ; WISSEL MSB EN LSB MOV BX,0B000H ; LAADT VIDEO SEGMENT MOV ES,BX ; ZET IN ES REGISTER MOV SI,AX ; ZET OFFSET IN SI REGISTER CALL LEESBYTE ; LEES DATA MOV ES:[SI],AL ; ZET DATA OP HET SCHERM JMP LEESCOM ; EINDE COMMANDO DIR_VID_MOVE: CALL LEESBYTE ; LEES LSB SOURCE ADRES MOV AH,AL ; ZET IN AH CALL LEESBYTE ; LEES MSB SOURCE ADRES XCHG AH,AL ; WISSEL AL EN AH MOV SI,AX ; ZET IN INDEXREGISTER CALL LEESBYTE ; LEES LSB BESTEMMINGS ADRES MOV AH,AL ; ZET IN AH CALL LEESBYTE ; LEES MSB BESTEMMINGS ADRES XCHG AH,AL ; WISSEL AL EN AH MOV DI,AX ; ZET IN INDEXREGISTER CALL LEESBYTE ; LEES LSB VAN LENGTE MOV AH,AL ; ZET IN AH CALL LEESBYTE ; LEES MSB VAN LENGTE XCHG AH,AL ; WISSEL AL EN AH MOV CX,AX ; ZET IN INDEXREGISTER MOV AX,0B000H ; LAADT VIDEO SEGMENT ADRES PUSH DS ; ZET DS OP STACK MOV DS,AX ; ZET DS NAAR VIDEO GEHEUGEN MOV ES,AX ; ZET ES NAAR VIDEO GEHEUGEN REP MOVSB ; KOPIEER GEHEUGENBLOK POP DS ; HAAL DS WEER TERUG JMP LEESCOM ; EINDE ROUTINE GETRESET: MOV AL,RESETYPE ; LEES LAATSTE RESET TYPE CALL ZENDBYTE ; STUUR NAAR ATOM JMP LEESCOM ; EINDE FUNCTIE SETRESET: CALL LEESBYTE ; LEES RESET TYPE MOV RESETYPE,AL ; ZET TYPE IN WERKRUIMTE JMP LEESCOM ; EINDE FUNCTIE DO_RESET: JMP RESET ; RESET DE ATOM _GTEXT_ATTR: CALL LEESBYTE ; LEES GTEXT ATTRIBUUT MOV TEKENATTR,AL ; ZET ATTRIBUUT IN WERKRUIMTE TEST AL,00100000B ; TEST OP DUBBELE HOOGTE JZ _GTEXT_ATTR1 ; SPRING BIJ ENKELE HOOGTE MOV SCALE_Y,2 ; ZET DUBBELE HOOGTE JMP SHORT _GTEXT_ATTR2 _GTEXT_ATTR1: MOV SCALE_Y,1 ; ZET ENKELE HOOGTE _GTEXT_ATTR2: MOV SCALE_X,1 ; ZET ENKELE BREEDTE RET ; EINDE ROUTINE ; --------------------------------------------------------------------------- ; Het nu volgende commando 'WACHTEN' bevat meerdere functies. Hierbij wordt ; meteen na het commando een subfunctie verwacht. Afhankelijk van deze sub- ; functie wordt een aktie uitgevoerd: ; ; subfunctie 0: wacht een vooraf ingestelde tijd ; subfunctie 1: stel wachttijd voor functies 0, 2 en 6 in ; subfunctie 2: vlag zetten na wachttijd ; subfunctie 3: vlag uitzetten ; subfunctie 4: wacht 1/60e seconde ; subfunctie 5: wacht 1/50e seconde ; subfunctie 6: laat toon horen gedurende wachttijd ; ; Dit commando maakt gebruikt van BIOS interrupt 15h dat alleen in AT's ; geimplementeerd is. Dit commando werkt niet op een XT ! Hierop wordt niet ; getest, dus dat zal de Atom vooraf zelf moeten doen. ; --------------------------------------------------------------------------- WACHTEN: CALL LEESBYTE ; LEES SUBFUNCTIE CMP AL,0 ; zoek uit welke subfunctie uit- JE WACHT_0 ; gevoerd moet worden en spring CMP AL,1 ; naar de betreffende routine JE WACHT_1 CMP AL,2 JE WACHT_2 CMP AL,3 JE WACHT_3 CMP AL,4 JE WACHT_4 CMP AL,5 JE WACHT_5 CMP AL,6 JE WACHT_6 MOV FUN_CODE,AL ; ONBEKENDE SUBFUNCTIE JMP ERROR ; GEEF FOUTMELDING WACHT_0: MOV CX,WACHT_HW ; LAADT WACHTTIJD (microseconden) MOV DX,WACHT_LW WACHT_0A: MOV AX,8600H ; LAADT BIOS FUNCTIE CODE INT 15H ; VOER BIOS CALL UIT CALL ZENDBYTE ; STUUR DUMMY NAAR ATOM JMP LEESCOM WACHT_1: CALL LEESBYTE ; LEES LW WACHTTIJD VAN ATOM MOV AH,AL CALL LEESBYTE XCHG AH,AL MOV WACHT_LW,AX ; STEL LW WACHTTIJD IN CALL LEESBYTE ; LEES HW WACHTTIJD VAN ATOM MOV AH,AL CALL LEESBYTE XCHG AH,AL MOV WACHT_HW,AX ; STEL HW WACHTTIJD IN JMP LEESCOM ; EINDE COMMANDO WACHT_2: MOV WACHT_VLAG,0 ; RESET VLAG MOV CX,WACHT_HW ; LAADT WACHTTIJD MOV DX,WACHT_LW LEA BX,WACHT_VLAG ; LAADT OFFSET ADRES VAN DE VLAG PUSH CS POP ES ; LAADT SEGMENT ADRES VAN DE VLAG MOV AX,8300H ; LAADT FUNCTIE NUMMER INT 15H ; VOER BIOS CALL UIT JMP LEESCOM ; EINDE COMMANDO WACHT_3: MOV AL,WACHT_VLAG ; LEES DE VLAG CALL ZENDBYTE ; STUUR NAAR ATOM JMP LEESCOM ; EINDE COMMANDO WACHT_4: MOV DX,16666 ; LAADT WACHTTIJD VOOR 1/60e SECONDE MOV CX,0 ; HI WOORD IS 0 JMP WACHT_0A ; GA WACHTEN WACHT_5: MOV DX,20000 ; LAADT WACHTTIJD VOOR 1/50e SECONDE MOV CX,0 ; HI WOORD IS 0 JMP WACHT_0A ; GA WACHTEN WACHT_6: CALL LEESBYTE ; LEES TOONHOOGTE MOV BL,AL ; ZET IN BX-REGISTER CALL LEESBYTE MOV BH,AL MOV CX,WACHT_HW ; LAADT WACHTTIJD (microseconden) MOV DX,WACHT_LW WACHT_6A: CMP BX,0 ; TEST OP FREQUENTIE 0 JE WACHT_6B ; INDIEN 0 LUIDSPREKER NIET AANZETTEN MOV AL,182 ; OPWEKKING TOON VOORBEREIDEN OUT 43H,AL ; WAARDE NAAR TIMER-COMMAND-REGISTER MOV AL,BL ; NOOTWAARDE IN AL LADEN OUT 42H,AL ; LO-BYTE NAAR TIMER-COUNTER-REGISTER MOV AL,BH ; HI-BYTE NAAR AL OUT 42H,AL ; EN OOK NAAR TIMER-COUNTER-REGISTER IN AL,61H ; LUIDSPREKER-STUURBIT INLEZEN OR AL,11B ; TWEE LAAGSTE BITS SCHAKELEN OUT 61H,AL ; LUIDSPREKER AAN WACHT_6B: PUSH BX ; BX EVEN BEWAREN MOV AX,8600H ; LAADT BIOS FUNCTIE CODE INT 15H ; VOER BIOS CALL UIT POP BX ; BX WEER TERUGHALEN CMP BX,0 ; TEST NOGMAALS OP FREQUENTIE 0 JZ WACHT_6C ; INDIEN 0 LUIDSPREKER NIET UITZETTEN IN AL,61H ; LUIDSPREKER-STUURBIT INLEZEN AND AL,11111100B ; TWEE LAAGSTE BITS WISSEN OUT 61H,AL ; LUIDSPREKER UIT WACHT_6C: JMP LEESCOM ; EINDE COMMANDO INITCLEAR0: INITGRAPH ; ZET KAART IN GRAFISCHE MODE LEA DX,ATOMVDUFNT ; LAADT BEGINADRES VAN FONT FILENAAM CALL LOADFONT ; LAADT HET FONT MOV AH,0BH ; SELECTEER PAL 0 (GROEN/ROOD/GEEL) MOV BX,0100H INT 10H JMP IGRAPH1 ; GA VERDER BIJ HET IGRAPH COMMANDO ; ----------------------------------------------------------------------------- ; Kopypage: schermen kopieren, onderling en van/naar disk. ; subfunctie 0 : kopieer van bron naar bestemming ; subfunctie 1 : schrijf pagina naar disk ; subfunctie 2 : lees pagina van disk ; ----------------------------------------------------------------------------- KOPYPAGE: CALL LEESBYTE ; LEES SUBFUNCTIE MOV FUN_CODE,AL ; ZET FUNCTIENUMMER IN WERKRUIMTE CMP AL,0 JE S_COPY ; FUNCTIE 0, SCREENCOPY CMP AL,1 JE S_SAVE ; FUNCTIE 1, SCHERM NAAR DISK CMP AL,2 JE S_SAVE ; FUNCTIE 2, SCHERM VAN DISK JMP ERROR ; GEEF FOUTMELDING S_COPY: CALL LEESBYTE ; LEES SOURCE PAGINA NUMMER CALL VIDOFFS ; BEREKEN OFFSET MOV SI,AX ; ZET IN INDEXREGISTER SI CALL LEESBYTE ; LEES DEST PAGINA NUMMER MOV DX,1000H ; LAADT BLOKLENGTE BIJ 80 KOLOMMEN CALL KOL8040 ; PAS AAN BIJ 40 KOLOMMEN MOV CX,DX ; ZET BLOKLENGTE IN DX CALL VIDOFFS ; BEREKEN OFFSET MOV DI,AX ; ZET IN INDEXREGISTER DI CALL VIDSEGM ; BEPAAL VIDEO SEGMENT PUSH DS ; BEWAAR DS OP STACK MOV DS,AX ; ZET DS NAAR VIDEO GEHEUGEN MOV ES,AX ; ZET ES NAAR VIDEO GEHEUGEN REP MOVSB ; KOPIEER GEHEUGENBLOK POP DS ; HAAL DS WEER TERUG JMP LEESCOM ; EINDE ROUTINE S_SAVE: PUSH DS ; SAVE DS XOR AH,AH ; AH WORDT 0 CALL LEESBYTE ; LEES PAGINA NUMMER MOV BX,AX ; BERG OP IN BX REGISTER CALL LEESBYTE ; LEES FILE HANDLE XCHG BX,AX ; AX:=SCHERMPAGINA, BX:=HANDLE PUSH AX ; BEWAAR SCHERMPAGINA OP STACK CALL RESET_FP ; RESET FILEPOINTER MOV DX,1000H ; LAADT LENGTE VOOR 80 KOLOMMEN CALL KOL8040 ; PAS AAN BIJ 40 KOLOMMEN MOV CX,DX ; ZET AANTAL TE SCHRIJVEN BYTES IN CX CALL VIDSEGM ; LAADT VIDEO SEGMENT IN AX MOV DS,AX ; ZET IN DATA SEGMENT REGISTER POP AX ; HAAL PAGINANUMMER TERUG CALL VIDOFFS ; LAADT VIDEO OFFSET IN AX MOV DX,AX ; ZET IN DX REGISTER MOV AH,40H ; LAADT DOS FUNCTIE NUMMER VOOR SAVE CMP CS:FUN_CODE,1 ; BEPAAL LOAD/SAVE FUNCTIE JE S_SAVE1 ; SPRING INDIEN SAVE DEC AH ; VOOR LOAD GELDT DOS FUNCTIE 3FH S_SAVE1: INT 21H ; SCHRIJF/LEES PAGINA POP DS ; HAAL DS REGISTER TERUG JMP LEESCOM ; EINDE COMMANDO VIDSEGM PROC NEAR MOV AX,0B800H ; LAADT DEFAULT VIDEO SEGMENT CMP VIDEOKAART,30H ; TEST OP HERCULESKAART JNE VIDSEGM1 ; SPRING INDIEN KLEURENKAART MOV AX,0B000H ; LAADT HERCULES VIDEO SEGMENT VIDSEGM1: RET ; EINDE SUBROUTINE VIDSEGM ENDP VIDOFFS PROC NEAR PUSH DX ; BEWAAR GEBRUIKTE REGISTERS OP STACK PUSH DI PUSH SI XOR AH,AH ; AH := 0 MOV DX,1000H ; LAADT DX MET PAGINA GROOTTE 80 KOL CALL KOL8040 ; MAAK AANPASSING BIJ 40 KOLOMMEN MUL DX ; BEREKEN OFFSET POP SI ; HERSTEL GEBRUIKTE REGISTERS POP DI POP DX RET ; EINDE ROUTINE VIDOFFS ENDP KOL8040 PROC NEAR PUSH AX ; BEWAAR GEBRUIKTE REGISTERS PUSH BX PUSH SI PUSH DI MOV AH,0FH ; LAADT AH MET VIDEOFUNCTIE INT 10H ; VRAAG SCHERMMODE OP CMP AL,2 ; TEST OP 80 KOLOMMEN MODE JAE KOL80401 ; SPRING INDIEN 80 KOLOMMEN SHR DX,1 ; DEEL OFFSET DOOR 2 KOL80401: POP DI ; HERSTEL GEBRUIKTE REGISTERS POP SI POP BX POP AX RET ; EINDE ROUTINE KOL8040 ENDP ASCII_SCAN: CMP KEYBUFFSTAT,0 ; BEVAT AUTORUN CMDLINE NOG TEKENS JNE ASCII_BUFFER ; JA, DAN ANDERE ROUTINE VOLGEN MOV AH,2 ; LEES KEYBOARD STATUS INT 16H ASCII_SCAN1: TEST AL,00000011B ; TEST OP SHIFTTOETS JZ ASCII_SCAN2 ; SPRING INDIEN GEEN SHIFTTOETS OR AL,00000010B ; ZET SHIFT BIT ASCII_SCAN2: AND AL,11111110B ; RESET KEY BIT PUSH AX ; BEWAAR KEYBOARD STATUS MOV AH,1 ; KIJK OF EEN TOETS IN BUFFER IS INT 16H POP AX ; HAAL KEYBOARD STATUS TERUG JNZ ASCII_SCAN3 ; SPRING INDIEN EEN TOETS GEDRUKT IS CALL ZENDBYTE ; STUUR STATUS NAAR ATOM JMP LEESCOM ; EINDE COMMANDO (geen toets gedrukt) ASCII_SCAN3: OR AL,00000001B ; ZET KEY-BIT CALL ZENDBYTE ; STUUR STATUS NAAR ATOM MOV AH,0 ; HAAL KARAKTER UIT BUFFER INT 16H CALL ZENDBYTE ; STUUR ASCII WAARDE NAAR ATOM MOV AL,AH CALL ZENDBYTE ; STUUR SCAN WAARDE NAAR ATOM JMP LEESCOM ; GA NAAR BEGIN VAN HOOFDLUS ASCII_BUFFER: MOV SI,KEYBUFFSTAT ; LAADT POINTER MOV AL,61H ; STUUR KEYBOARD STATUSBIT NAAR ATOM CALL ZENDBYTE MOV AL,MUISMASKER-1[SI] ; LEES TEKEN UIT BUFFER INC KEYBUFFSTAT ; VERLOOG POINTER MOV AH,AL ; BEWAAR TEKEN IN AH CALL ZENDBYTE ; STUUR KARAKTER NAAR ATOM MOV AL,0FFH ; STUUR DUMMY SCAN CODE NAAR ATOM CALL ZENDBYTE CMP AH,0DH ; LAATSTE KARAKTER? JNE ASCII_BUF1 MOV KEYBUFFSTAT,0 ; CLEAR POINTER NA LAATSTE KARAKTER ASCII_BUF1: JMP LEESCOM ; EINDE ROUTINE ; ----------------------------------------------------------------------------- ; Communicatie api voor Atom-aan-PC via AIC kabel ; ----------------------------------------------------------------------------- AIC: CALL LEESBYTE ; LEES SUBFUNCTIE VAN ATOM MOV FUN_CODE,AL ; ZET SUBFUNCTIE NUMMER CMP AL,0 ; SUBFUNCTIE 0 JE AICINIT ; INITIALISEER AICCOM CMP AL,1 ; SUBFUNCTIE 1 JE AIC_ZEND ; STUUR BYTE NAAR ATOM-AAN-PC CMP AL,2 ; SUBFUNCTIE 2 JE AIC_LEES ; LEES BYTE VAN ATOM-AAN-PC JMP ERROR ; BIJ ONGELDIGE FUNCTIECODE AICINIT: CALL LEESBYTE ; LEES ADRES VAN PRINTERPOORT MOV DL,AL ; ZET IN DX CALL LEESBYTE MOV DH,AL MOV PRT_ADDR,DX ; LAADT ADRES PRINTERPOORT ADC DX,2 ; VERHOOG TOT CONTROLPOORT MOV AL,00000000B ; STROBE/ACK SIGNAAL HOOG OUT DX,AL JMP LEESCOM ; EINDE ROUTINE AIC_ZEND: CALL LEESBYTE ; LEES TE VERZENDEN BYTE CALL ZENDNIBBLE ; STUUR LAGE NIBBLE NAAR PC SHR AL,4 ; SCHUIF HOGE NAAR LAGE NIBBLE CALL ZENDNIBBLE JMP LEESCOM ; EINDE ROUTINE ZENDNIBBLE PROC NEAR MOV DX,PRT_ADDR ; LAADT BASISADRES PRINTERPOORT PUSH AX ; SAVE REGISTERS AND AL,01111111B ; CLEAR STROBE BIT OUT DX,AL ; ZET DATA OP POORT INC DX ; LAADT ADRES STATUSPOORT AIC_ZEND1: IN AL,DX ; LEES STATUS TEST AL,10000000B ; TEST ATOM ACK (wordt geinverteerd!) JE AIC_ZEND1 ; WACHT TOT SIGNAAL LAAG IS DEC DX ; LAADT ADRES PRINTER OUTPUT POORT OR AL,10000000B ; HAAL STROBE SIGNAAL WEER WEG OUT DX,AL INC DX ; LAADT ADRES PRINTER STATUS POORT AIC_ZEND2: IN AL,DX ; LEES STATUS TEST AL,10000000B ; TEST ATOM ACK (wordt geinverteerd!) JNE AIC_ZEND2 ; WACHT TOT SIGNAAL HOOG IS POP AX ; HAAL REGISTERS TERUG VAN STACK RET ; EINDE ZENDROUTINE ZENDNIBBLE ENDP AIC_LEES: CALL LEESNIBB ; LEES LAAGSTE DRIE BITS AH SHR AH,4 ; SCHUIF VIER MAAL RECHTS MOV BH,AH ; ZET DATA TIJDELIJK IN BH CALL LEESNIBB ; LEES BITS 4..6 IN AH SHR AH,1 ; SCHUIF EEN MAAL LINKS OR BH,AH ; VOEG BITS SAMEN CALL LEESNIBB ; LEES HOOGSTE TWEE BITS SHL AH,1 OR BH,AH ; VOEG BITS SAMEN MOV AL,BH ; ZET ONTVANGEN BYTE IN AL CALL ZENDBYTE ; STUUR ONTVANGEN BYTE NAAR ATOM JMP LEESCOM ; EINDE ROUTINE LEESNIBB PROC NEAR MOV DX,PRT_ADDR ; LAADT BASISADRES PRINTERPOORT INC DX ; LAADT ADRES PRINTER STATUS LEESNIBB1: IN AL,DX ; LEES DATA EN STATUS TEST AL,00001000B ; CONTROLEER DATA GELDIG (error=laag) JNE LEESNIBB1 AND AL,01110000B ; ALLEEN b4...b6 BEVATTEN DATA MOV AH,AL ; ZET DATA IN AH MOV AL,00000001B ; GEEF ACK TERUG INC DX ; LAADT DX MET PRINTER CONTROL POORT OUT DX,AL ; MAAK ACK LIJN LAAG DEC DX ; LAADT DX MET PRINTER STATUS POORT LEESNIBB2: IN AL,DX ; WACHT TOT STROBE VERVALT TEST AL,00001000B JE LEESNIBB2 INC DX ; DX WORDT PRINTER CONTROL POORT MOV AL,00000000B ; HAAL ACK WEG OUT DX,AL RET ; EINDE ROUTINE LEESNIBB ENDP ATOMTERM ENDP EVEN ; DYNAMISCH DATABLOK OP EVEN ADRES PATTERNS EQU THIS BYTE ; 16 KB PAINTPATRONEN EN SPRITE ADMIN XMSBUFFER = PATTERNS + 4000H ; 16 KB BUFFER VOOR XMS RAMFONT = XMSBUFFER + 4000H ; 4 KB OPSLAG VAN FONT FILEBUFFER = RAMFONT + 1000H ; 2 KB BUFFER VOOR DISK EN SPRITES MUISMASKER = FILEBUFFER + 800H ; 64 BYTES MASKER GRAFISCHE MUISCURSOR PRGSTACK = MUISMASKER + 40H ; 512 BYTES PROGRAMMA STACK ENDSTACK = PRGSTACK + 200H ; EINDE STACK en einde dyn. datablok CSEG ENDS END AAT