PAGE ,132 TITLE ACORN ATOM TERMINAL V2.15 ; --------------------------------------------------------------------------- ; 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. ; --------------------------- december 1993 --------------------------------- HERCULES = 0 ; ZET HIER 1 VOOR HERCULES CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG ORG 100H AAT: JMP ATOMTERM ;---------------------------------------------------------------------------- IF HERCULES INCLUDE HERCULES.INC INCLUDE HERCFONT.INC ELSE INCLUDE EGA.INC INCLUDE EGAFONT.INC ENDIF INCLUDE SETUP.INC INCLUDE SOUND.INC INCLUDE ATOMERR.INC INCLUDE EXEC.INC INCLUDE RANDACC.INC ;---------------------------------------------------------------------------- ERR_MSG DB '*** Ongeldig commando : $' CRLF DB 10,13,'$' 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 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 (ESC OF DEL) PRNNR DB 0 ; NUMMER VAN GESELECTEERDE PRINTERPOORT CENR DB 0 ; CRITICAL ERRORNUMMER VIDEOKAART DB ? ; KEUZE VAN OPGEGEVEN VIDEO KAART PPI_ADDR DW ? ; BASISADRES VAN 8255 OP ATOMKAART FILEATTR EQU THIS BYTE TEMP DW 15 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 ? ; " ADRES_B000 DB 00H ; ATOM ADRES, GEBRUIKT IN 8255 EMULATIE 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, LOCK, 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, READ_B001, READ_B002 DW WRITE_B000, EGAFONT, EGA8X14,EGA8X8 DW 173 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 LEESCOM, LEESCOM, LEESCOM, CTRL_U , CTRL_V , CTRL_W DW CTRL_X , LEESCOM, 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 SETKEY DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH RESETKEY DB 001H,002H,004H,008H,010H,020H,040H,080H KEYMATRIX DB 16 DUP (0FFH) FILEBUFFER DB 256 DUP (?) ; 256 BYTES VOOR DISK BEWERKINGEN MUISMASKER DB 64 DUP (0FFH) ; MASKERS VOOR GRAFISCHE MUISCURSOR ; --------------------------------------------------------------------------- ; 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 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 ZOEK_IN_TABEL PROC NEAR MOV AH,99H ; LAADT CODE VOOR NIET GEVONDEN CMP AL,3AH ; TEST OP HOOGSTE SCANCODE JA NIET_IN_MATRIX ; SPRING ALS CODE NIET VOOR KAN KOMEN XOR AH,AH ; MAAK EEN INDEX VAN DE SCANCODE MOV SI,AX ; ZET IN INDEXREGISTER MOV AL,KBMATRIX[SI] ; LEES POSITIE IN ATOM KEYBOARD CMP AL,99H ; TEST OF TOETS IN MATRIX VOORKOMT JE NIET_IN_MATRIX ; NEE, DAN SPRINGEN MOV DI,AX ; ZET POSITIE IN DI AND DI,0007H ; BEPAAL DE BITPOSITIE VAN TOETS MOV SI,AX ; ZET POSITIE OOK IN SI AND SI,00F0H ; BEPAAL DE RIJ VAN TOETS SHR SI,1 ; SCHUIF VIER MAAL RECHTS SHR SI,1 ; de positie van de toets in de SHR SI,1 ; matrix is nu bekend; in SI staat SHR SI,1 ; de rij en in DI de kolom (=bit) MOV AL,KEYMATRIX[SI]; LEES STATUS VAN ATOM TOETSENBORD CLC ; WIS CARRY, WANT TOETS IS BEKEND JMP SHORT ZOEK_EIND ; GEDWONGEN SPRONG NIET_IN_MATRIX: STC ; TOETS KOMT NIET VOOR IN TABEL ZOEK_EIND: RET ; EINDE ROUTINE ZOEK_IN_TABEL ENDP NEWINT09 PROC PUSH AX ; SAVE AX PUSH DI ; SAVE INDEXREGISTERS PUSH SI CMP ADRES_B000,0FFH ; TEST OF 8255 EMULATIE UITSTAAT JE MAIN_INT09 ; JA, DAN OVERSLAAN XOR AH,AH ; RESET AH IN AL,60H ; LEES SCANCODE VAN TOETSENBORD TEST AL,80H ; TEST OF BREAK/MAKE JZ MAKE ; SPRING INDIEN MAKE BREAK: AND AL,7FH ; WIS HOGE BIT (break bit) CALL ZOEK_IN_TABEL ; ZOEK SCANCODE IN TABEL OP JC MAIN_INT09 ; SPRING INDIEN NIET GEVONDEN OR AL,RESETKEY[DI] ; RESET TOETS BIT MOV KEYMATRIX[SI],AL; ZET RESULTAAT IN KEYBOARD MATRIX JMP SHORT MAIN_INT09 MAKE: CALL ZOEK_IN_TABEL ; ZOEK SCANCODE IN TABEL OP JC MAIN_INT09 ; SPRING INDIEN NIET GEVONDEN AND AL,SETKEY[DI] ; SET TOETS BIT MOV KEYMATRIX[SI],AL; ZET RESULTAAT IN KEYBOARD MATRIX MAIN_INT09: POP SI ; HERSTEL INDEXREGISTERS POP DI 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 JNE INT09END 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 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-SUBROUTINES ; --------------------------------------------------------------------------- LEESBYTE PROC NEAR PUSH DX ; SAVE GEBRUIKTE REGISTERS LEESBYTE1: MOV DX,PPI_ADDR ; LAADT STATUSREGISTER ADRES ADD DX,2 IN AL,DX ; LEES STATUSREGISTER TEST AL,00100000B ; TEST OP INPUT BUFFER FULL JZ LEESBYTE1 ; SPRING INDIEN GEEN BYTE ONTVANGEN SUB DX,2 ; POORTADRES VERLAGEN IN AL,DX ; LEES DATA POP DX ; HERSTEL DX REGISTER RET ; EINDE ROUTINE LEESBYTE ENDP ZENDBYTE PROC NEAR PUSH DX ; SAVE GEBRUIKTE REGISTERS PUSH AX MOV DX,PPI_ADDR ; LAADT ADRES STATUSREGISTER ADD DX,2 ZENDBYTE1: IN AL,DX ; LEES STATUSREGISTER TEST AL,00000010B ; TEST OP OUTPUT BUFFER EMPTY JZ ZENDBYTE1 ; SPRING ALS VORIG TEKEN NIET GELEZEN DEC DX ; POORTADRES VERLAGEN POP AX ; HAAL DATA VAN STACK OUT DX,AL ; VERSTUUR DATA POP DX ; HERSTEL DX RET ; EINDE ROUTINE ZENDBYTE ENDP ; --------------------------------------------------------------------------- ; HOOFDPROGRAMMA INITIALISATIE ; --------------------------------------------------------------------------- ATOMTERM PROC NEAR 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 ; --------------------------------------------------------------------------- ; 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 ; --------------------------------------------------------------------------- ; INSTELLINGEN 8255 EN INITIALISATIE HARD EN SOFTWARE INSTELLINGEN ; --------------------------------------------------------------------------- MOV DX,PPI_ADDR ; LAADT ADRES COMMAND REGISTER 8255 ADD DX,3 MOV AL,0B4H ; LAADT INSTELLING OUT DX,AL ; STEL PPI IN MOV AL,0FH ; MAAK PC7 HOOG (resetlijn 6502) OUT DX,AL RESET: CALL JOYCALLI ; CALLIBREER JOYSTICK 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 DX,PPI_ADDR ; LAADT ADRES COMMAND REGISTER 8255 ADD DX,3 MOV AL,0EH ; GEEF RESETPULS OUT DX,AL ; PC7 LAAG MOV CX,00FFH ; WACHT KORTE TIJD RESETPAUSE: LOOP RESETPAUSE MOV AL,0FH ; OUT DX,AL ; PC7 HOOG 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: CALL LEESBYTE ; LEES EERSTE COMMANDO VAN ATOM PUSH AX ; SAVE GELEZEN BYTE IF HERCULES MOV AX,0007H ; LAADT BEELDSCHERM INSTELLING ELSE MOV AX,0002H ENDIF INT 10H ; ZET VIDEO MODE 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 IF HERCULES MOV BX,0B000H ; ZET ES NAAR VIDEORAM ELSE MOV BX,0B800H ENDIF 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: 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 IF HERCULES CALL TEXT ; EN VERLAAT EV. GRAFISCHE MODE ENDIF 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: 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 LEESBYTE ; LEES X COORDINAAT ADD AL,VENSTER_XLO ; TEL ER DE VENSTER OFFSET BIJ MOV DL,AL ; ZET X COORDINAAT IN DL CALL LEESBYTE ; 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 ; --------------------------------------------------------------------------- ; COMMANDO'S ; --------------------------------------------------------------------------- ERROR: MOV AH,9 ; DRUK FOUTMELDING AF LEA DX,ERR_MSG INT 21H MOV AL,COMMANDONR ; LAADT COMMANDONR 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 NIBBLE_H ; SPRING GEWOON CIJFER ADD AL,07 ; MAAK ER EEN LETTER VAN NIBBLE_H: ADD AL,'0' ; MAAK ER EEN HEX DIGIT VAN MOV DL,AL ; ZET KARAKTER IN DL INT 21H ; DRUK DIGIT AF MOV AL,COMMANDONR ; LAADT COMMANDONR AND AL,0FH ; VERWAARLOOS HOGE NIBBLE CMP AL,10 ; TEST OP HEXADECIMALE DIGIT JB NIBBLE_L ; SPRING BIJ GEWOON CIJFER ADD AL,07 ; MAAK ER EEN LETTER VAN NIBBLE_L: ADD AL,'0' ; MAAK ER EEN HEX DIGIT VAN MOV DL,AL ; ZET TEKEN IN DL INT 21H ; DRUK DIGIT AF 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 IF HERCULES SHL BX,1 ; X := X*2+OFFSET ADD BX,104 ELSE ADD BX,32 ENDIF IF HERCULES MOV CX,DX ; Y := Y*2 - Y/2 voor hercules SHR DX,1 ; (Y/2) XCHG DX,CX SHL DX,1 ; (Y*2) SUB DX,CX ADD DX,30 ELSE ADD DX,4 ; Y := Y + 4 voor cga/ega ENDIF 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 IF HERCULES SHR TEMP+2,1 ; TEST OP EVEN/ONEVEN BEELDLIJN JC ENDSIMUL ; SPRING BIJ ONEVEN BEELDLIJN INC DX ; VERHOOG BEELDLIJN CALL PIXEL ; ROEP PLOT ROUTINE AAN DEC BX ; VERLAAG X-COORDINAAT CALL PIXEL ; ROEP PLOT ROUTINE AAN ENDIF ENDSIMUL: JMP LEESCOM ; GA NAAR HOOFDLUS IGRAPH: INITGRAPH ; SCHAKEL NAAR GRAFISCHE MODE 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 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 CALL WRITE ; SCHRIJF HET KARAKTER CMP AL,0 JNE SCHRIJFLUS ; SPRING INDIEN NOG TEKENS VOLGEN 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 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 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 LOCK: 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 FINDFIRST ; LEES DE FILENAAM MOV AH,2FH ; DOS FUNCTIE: DTA OPVRAGEN INT 21H MOV TEMP,BX ; BEWAAR DTA ADRES 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 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 PUSH BX ; SAVE FILE HANDLE MOV BX,TEMP ; HAAL DTA ADRES TERUG ADD BX,26 ; BEPAAL FILE LENGTE ADRES MOV SI,04 ; ZET INDEX REGISTER MOV AL,ES:[BX] ; LEES BYTE VAN FILE LENGTE MOV AH,ES:[BX+1] SUB AX,16 ; TREK ER DE HEADER LENGTE VAN AF MOV FILEBUFFER[SI],AL INC SI MOV FILEBUFFER[SI],AH INC SI MOV AL,ES:[BX+2] MOV AH,ES:[BX+3] SBB AX,00 MOV FILEBUFFER[SI],AL INC SI MOV FILEBUFFER[SI],AH 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 BX ; FILE HANDLE TERUG HALEN 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 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 KNAAGDIER: CALL LEESREGS ; 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 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 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 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 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: IF HERCULES CALL LEESBYTE ; LEES MODE CMP AL,03H ; TEST OP 80 KOLOMS TEKSTMODE JNE HGMOD EXITGRAPH ; INITIALISEER TEKST MODE JMP SHORT HTMOD HGMOD: INITGRAPH ; INITIALISEER GRAFISCHE MODE HTMOD: NOP ; DUMMY INSTRUKTIE ELSE CALL LEESBYTE ; LEES VIDEO MODE XOR AH,AH ; VIDEO FUNCTIE 00 UITVOEREN INT 10H ENDIF ; --------------------------------------------------------------------------- ; Versie 2.xx zet hier het grafisch venster uit, plaatst de oorsprong ; terug naar 0,0 en zet beeldpagina 0 voor. ; --------------------------------------------------------------------------- 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 VENSTER_YLO,24 JMP LEESCOM ; EINDE COMMANDO VIDEOCOL: CALL LEESBYTE ; LEES KLEUR MOV KLEUR,AL ; ZET NIEUWE KLEUR JMP LEESCOM ; EINDE COMMANDO SCHRIJFPIX: IF HERCULES JMP GPLOT ; APARTE ROUTINE VOOR HERCULES ELSE 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 SCHRIJFGEENPIX: JMP LEESCOM ; EINDE COMMANDO ENDIF WINDOW: MOV CX,4 ; AANTAL TE LEZEN BYTES XOR DI,DI ; LAADT POINTER WINDOW1: CALL LEESBYTE ; 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 LEESBYTE ; 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 HFILL: 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 GRENSKLEUR MOV BL,AL ; ZET GRENSKLEUR IN BL ADD CX,OORSPRONG_X ; PAS COORDINATEN AAN ADD DX,OORSPRONG_Y ; AAN EV. VERSCHOVEN OORSPRONG CMP DX,GWINDOW_YLO ; TEST OF Y-COORDINAAT IN VENSTER IS JA HFILL_END ; SPRING INDIEN ONDER ONDERGRENS CMP DX,GWINDOW_YRB JB HFILL_END ; SPRING INDIEN BOVEN BOVENGRENS MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER PUSH CX ; BEWAAR X-COORDINAAT MOV AH,0DH ; NUMMER VAN DOSFUNCTIE HFILL_R: CMP CX,GWINDOW_XRB ; TEST OP GRENS VAN GRAFISCH VENSTER JA HFILL_L ; SPRING INDIEN BOVEN RECHTERGRENS INT 10H ; VRAAG KLEUR VAN PIXEL OP CMP AL,BL ; TEST OP GRENSKLEUR JE HFILL_L ; SPRING INDIEN RECHTER GRENS BEREIKT MOV AL,KLEUR ; LAADT KLEURNUMMER DEC AH ; AH WORDT DOS FUNCTIENUMMER 0C INT 10H ; KLEUR PIXEL INC CX ; VERHOOG X COORDINAAT, 1 PUNT RECHTS INC AH ; AH VERHOGEN TOT FUNCTIE 0D JMP SHORT HFILL_R ; SPRING VOOR VOLGEND PIXEL HFILL_L: POP CX ; HAAL BEGINPUNT TERUG DEC CX ; EEN POSITIE NAAR LINKS HFILL_L1: CMP CX,GWINDOW_XLO ; TEST OP GRENS VAN GRAFISCH VENSTER JB HFILL_END ; SPRING INDIEN ONDER LINKERGRENS INT 10H ; VRAAG KLEUR VAN PIXEL OP CMP AL,BL ; TEST OP GRENSKLEUR JE HFILL_END ; SPRING INDIEN RECHTER GRENS BEREIKT MOV AL,KLEUR ; LAADT KLEURNUMMER DEC AH ; AH WORDT DOS FUNCTIENUMMER 0C INT 10H ; KLEUR PIXEL DEC CX ; VERLAAG X COORDINAAT, 1 PUNT LINKS INC AH ; AH VERHOGEN TOT FUNCTIE 0D JMP SHORT HFILL_L1 ; SPRING VOOR VOLGEND PIXEL HFILL_END: JMP LEESCOM ; EINDE ROUTINE VFILL: 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 GRENSKLEUR MOV BL,AL ; ZET GRENSKLEUR IN BL ADD CX,OORSPRONG_X ; PAS COORDINATEN AAN ADD DX,OORSPRONG_Y ; AAN EV. VERSCHOVEN OORSPRONG CMP CX,GWINDOW_XRB ; TEST OF X-COORDINAAT IN VENSTER IS JA HFILL_END ; SPRING INDIEN OVER RECHTERGRENS CMP CX,GWINDOW_XLO JB HFILL_END ; SPRING INDIEN ONDER LINKERGRENS MOV BH,SCHERMPAG ; LAADT SCHERMPAGINA NUMMER PUSH DX ; BEWAAR Y-COORDINAAT MOV AH,0DH ; NUMMER VAN DOSFUNCTIE VFILL_U: CMP DX,GWINDOW_YLO ; TEST OF GRENS VAN VENSTER BEREIKT JA VFILL_D ; SPRING INDIEN OVER ONDERGRENS INT 10H ; VRAAG KLEUR VAN PIXEL OP CMP AL,BL ; TEST OP GRENSKLEUR JE VFILL_D ; SPRING INDIEN ONDER GRENS BEREIKT MOV AL,KLEUR ; LAADT KLEURNUMMER DEC AH ; AH WORDT DOS FUNCTIENUMMER 0C INT 10H ; KLEUR PIXEL INC DX ; VERHOOG Y COORDINAAT, 1 PUNT OMLAAG INC AH ; AH VERHOGEN TOT FUNCTIE 0D JMP SHORT VFILL_U ; SPRING VOOR VOLGEND PIXEL VFILL_D: POP DX ; HAAL BEGINPUNT TERUG DEC DX ; EEN POSITIE OMHOOG VFILL_D1: CMP DX,GWINDOW_YRB ; TEST OF GRENS VAN VENSTER BEREIKT JB VFILL_END ; SPRING INDIEN OVER BOVENGRENS INT 10H ; VRAAG KLEUR VAN PIXEL OP CMP AL,BL ; TEST OP GRENSKLEUR JE VFILL_END ; SPRING INDIEN BOVEN GRENS BEREIKT MOV AL,KLEUR ; LAADT KLEURNUMMER DEC AH ; AH WORDT DOS FUNCTIENUMMER 0C INT 10H ; KLEUR PIXEL DEC DX ; VERLAAG Y COORDINAAT, 1 PUNT OMHOOG INC AH ; AH VERHOGEN TOT FUNCTIE 0D JMP SHORT VFILL_D1 ; SPRING VOOR VOLGEND PIXEL VFILL_END: JMP LEESCOM ; EINDE ROUTINE GWINDOW: MOV CX,8 ; AANTAL TE LEZEN BYTES XOR DI,DI ; LAADT POINTER GWINDOW1: CALL LEESBYTE ; 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 MOV GWINDOW_XLO,0 ; RESET GRAFISCH VENSTER OP 0,-1,-1,0 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 LEESBYTE ; 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 EVEN ; LAAT STACK OP EVEN ADRES BEGINNEN STACK DW 256 DUP (?) ; STACK ALTIJD OP EINDE VAN PROGRAMMA ENDSTACK EQU THIS WORD ; LATEN STAAN ! ATOMTERM ENDP CSEG ENDS END AAT