terug.gif
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 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
terug.gif