                PAGE    ,132
TITLE           ACORN ATOM TERMINAL V2.15

; ---------------------------------------------------------------------------
; In versie 2.xx zijn nieuwe commando's en control codes toegevoegd. Enkele
; bestaande routines zijn wat aangepast. Met name routines die met het scherm
; werken zijn gewijzigd in verband met het ondersteunen van meerdere scherm-
; pagina's in tekst mode.
; Routines waar ingrijpende wijzigingen zijn aangebracht zijn voorzien van
; extra commentaar omtrent de functie en plaats van de wijziging. In de
; meeste gevallen zijn dat de grafische routines voor extended video. Alle
; routines zijn upwards compatible met de routines uit versie 1.xx.
; --------------------------- december 1993 ---------------------------------

HERCULES = 0    ; ZET HIER 1 VOOR HERCULES

CSEG            SEGMENT PARA PUBLIC 'CODE'
                ASSUME  CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG

                ORG     100H
AAT:            JMP     ATOMTERM

;----------------------------------------------------------------------------
IF HERCULES
        INCLUDE HERCULES.INC
        INCLUDE HERCFONT.INC
ELSE
        INCLUDE EGA.INC
        INCLUDE EGAFONT.INC
ENDIF
INCLUDE         SETUP.INC
INCLUDE         SOUND.INC
INCLUDE         ATOMERR.INC
INCLUDE         EXEC.INC
INCLUDE         RANDACC.INC
;----------------------------------------------------------------------------

ERR_MSG         DB      '*** Ongeldig commando : $'

CRLF            DB      10,13,'$'

TOONH           DB      ?          ; TOONHOOGTE BELL SIGNAAL
TOOND           DB      ?          ; TOONDUUR BELL SIGNAAL
REGELS          DB      ?          ; AANTAL AFGEDRUKTE REGELS IN PAGEMODE
SCHERMSTATUS    DB      ?          ; CONTROLE VOOR TEKST NAAR SCHERM STUREN
PRINTERSTATUS   DB      ?          ; CONTROLE VOOR TEKEN NAAR PRINTER STUREN
PAGEMODE        DB      ?          ; CONTROLE VOOR PAGEMODE AAN/UIT
CAPSSTATUS      DB      ?          ; STATUS VAN CAPS LOCK TOETS
COMMANDONR      DB      ?          ; GEBRUIKT VOOR OPSLAG VAN COMMANDO NUMMER
MSB             DB      0FFH       ; CONTROLE VOOR BIT 7 WEL/NIET STRIPPEN
KLEUR           DB      7          ; TEKST ATTRIBUUT BIJ OPSTARTEN
CURLINES        DW      0607H      ; VORM VAN DE CURSOR
VENSTER_XLO     DB      0          ; COORDINATEN TEKSTVENSTER
VENSTER_YLO     DB      24         ;     "
VENSTER_XRB     DB      79         ;     "
VENSTER_YRB     DB      0          ;     "
GWINDOW_XLO     DW      0          ; COORDINATEN GRAFISCH VENSTER
GWINDOW_YLO     DW      -1         ;     "
GWINDOW_XRB     DW      -1         ;     "
GWINDOW_YRB     DW      0          ;     "
OORSPRONG_X     DW      0          ; OFFSET VOOR GRAFISCHE OORSPRONG
OORSPRONG_Y     DW      0          ;     "
SCHERMPAG       DB      0          ; SCHERMPAGINA NUMMER VOOR BEWERKINGEN
RESETTOETS      DB      83         ; CODE VOOR RESET TOETS (ESC OF DEL)
PRNNR           DB      0          ; NUMMER VAN GESELECTEERDE PRINTERPOORT
CENR            DB      0          ; CRITICAL ERRORNUMMER
VIDEOKAART      DB      ?          ; KEUZE VAN OPGEGEVEN VIDEO KAART
PPI_ADDR        DW      ?          ; BASISADRES VAN 8255 OP ATOMKAART
FILEATTR        EQU     THIS BYTE
TEMP            DW      15 DUP (?) ; GEBRUIKT VOOR WERKRUIMTE DIV. ROUTINES
OFF09           DW      ?          ; OPSLAG OUDE TOETSENBORD INTERRUPT VECTOR
SEG09           DW      ?          ;     "
OFF60           DW      ?          ; OPSLAG OUDE INT60 VECTOR
SEG60           DW      ?          ;     "
JOY_LINKS       DW      ?          ; NEUTRAALSTAND VAN JOYSTICK
JOY_RECHTS      DW      ?          ;     "
JOY_BOVEN       DW      ?          ;     "
JOY_ONDER       DW      ?          ;     "
ADRES_B000      DB      00H        ; ATOM ADRES, GEBRUIKT IN 8255 EMULATIE

COMTABEL        DW      DRUKAF  , KEY    , COPY  , GPLOT , IGRAPH, SIMULATE4
                DW      RAMFNT  , SCHRIJF, SCHAAL, CURSOR_ON, CURSOR_OFF
                DW      LOADFILE, SAVEFILE, CAT, CHDIR, RMDIR, MKDIR
                DW      DELETE, LOCK, UNLOCK, DRIVE, MSDOS, HIDE, UNHIDE
                DW      INFO, GELUID, BLIEP, ERRMSG, KNAAGDIER, DEFMUISMASKER
                DW      CURSORPOS,VIDEO, SERPOORT, PARPOORT,DOSFUNCTIE
                DW      PORT_IN, PORT_OUT,UDS, MOUSE_MOT,WHOAMI,CLEAR0
                DW      PALET,CLEAR1,CLEAR1A,CLEAR2,CLEAR2A,CLEAR3,CLEAR3A
                DW      CLEAR4,CLEAR4A,VIDEOMOD,VIDEOCOL,SCHRIJFPIX,WINDOW
                DW      WINDOW_OFF,JOYSTICK,CALLIBRATE,BIT7,BIOSKEY,SHELL
                DW      ZOEKFILE, ZOEKNEXT,LPT, RAF_OPEN, RAF_SLUIT
                DW      RAF_SCHRIJF, RAF_LEZEN, RAF_MOVE_PTR, RAF_LEES_EXT
                DW      MOUSEKAR, VERSIE, TEKEN2LPT, CGABITMAP, HFILL, VFILL
                DW      ROEP61,GWINDOW, GWOFF, OORSPRONG, VIEWSCHERM
                DW      WERKSCHERM, CURSORDEF, READ_B001, READ_B002
                DW      WRITE_B000, EGAFONT, EGA8X14,EGA8X8
                DW      173 DUP (ERROR)

CTRLTAB         DW      LEESCOM, CTRL_A , CTRL_B , CTRL_C , CTRL_D , CTRL_E
                DW      CTRL_F , CTRL_G , CTRL_H , CTRL_I , CTRL_J , CTRL_K
                DW      CTRL_L , CTRL_M , CTRL_N , CTRL_O , CTRL_P , CTRL_Q
                DW      LEESCOM, LEESCOM, LEESCOM, CTRL_U , CTRL_V , CTRL_W
                DW      CTRL_X , LEESCOM, CTRL_Z , LEESCOM, CTRL_KM, CTRL_MN
                DW      HOME   , CTRL_SL

KEYTAB          DB      00H,71H,2CH,51H,44H,45H,46H,47H,40H,10H,17H,16H,15H
                DB      14H,13H,2BH,4AH,4BH,4CH,4DH,4EH,4FH,48H,18H,1FH,1EH
                DB      1DH,1CH,23H,43H,53H,54H,55H,56H,39H,50H,20H,27H,26H
                DB      25H,24H,3CH,00H,1BH,73H,74H,75H,76H,77H,70H,28H,2FH
                DB      2EH,2DH,00H,06H,00H,37H,00H,3DH,3EH,3FH,38H,0EH,0DH
                DB      0CH,0BH,08H,0FH,00H,00H,09H,2AH,21H,04H,33H,00H,31H
                DB      07H,0AH,32H,29H,1AH,19H,00H,00H,00H,67H,68H,69H,04H
                DB      64H,65H,66H,07H,61H,62H,63H,60H,6AH

KBMATRIX        DB      99H,05H,21H,11H,01H,92H,82H,72H,62H,52H
                DB      42H,31H,02H,32H,41H,51H,04H,45H,23H,95H
                DB      75H,25H,65H,84H,24H,14H,80H,60H,61H,99H
                DB      63H,85H,33H,13H,03H,94H,74H,64H,54H,22H
                DB      73H,50H,99H,70H,15H,35H,43H,55H,53H,34H
                DB      44H,12H,93H,83H,99H,99H,99H,90H,40H

SETKEY          DB      0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
RESETKEY        DB      001H,002H,004H,008H,010H,020H,040H,080H
KEYMATRIX       DB      16 DUP (0FFH)
                
FILEBUFFER      DB      256 DUP (?)     ; 256 BYTES VOOR DISK BEWERKINGEN

MUISMASKER      DB      64 DUP (0FFH)   ; MASKERS VOOR GRAFISCHE MUISCURSOR

; ---------------------------------------------------------------------------
; SUBROUTINES VOOR SYSTEEM (DIENEN NIET DOOR GEBRUIKER AANGEROEPEN TE WORDEN)
; ---------------------------------------------------------------------------

CTRLBREAK       PROC    NEAR
                IRET                    ; CTRL-BREAK NEGEREN
CTRLBREAK       ENDP

CRITERR         PROC    NEAR
                MOV     AX,DI           ; FOUTCODE NAAR AX
                MOV     CENR,AL         ; ZET IN CE-VLAG
                MOV     AL,3            ; DOS FUNCTIE BEEINDIGEN MET FOUTCODE
                IRET
CRITERR         ENDP

HEX             PROC    NEAR
                MOV     DH,AL
                MOV     AH,2            ; DOS FUNCTIE : TEKENUITVOER
                MOV     CL,4            ; LAADT AANTAL SCHUIFOPDRACHTEN
                SHR     AL,CL           ; ZET HOGE NIBBLE IN LAGE NIBBLE
                CMP     AL,10           ; TEST OP HEXADECIMALE DIGIT
                JB      HOGENIBB        ; SPRING GEWOON CIJFER
                ADD     AL,07           ; MAAK ER EEN LETTER VAN
HOGENIBB:       ADD     AL,'0'          ; MAAK ER EEN HEX DIGIT VAN
                MOV     DL,AL           ; ZET KARAKTER IN DL
                INT     21H             ; DRUK DIGIT AF
                MOV     AL,DH
                AND     AL,0FH          ; VERWAARLOOS HOGE NIBBLE
                CMP     AL,10           ; TEST OP HEXADECIMALE DIGIT
                JB      LAGENIBB        ; SPRING GEWOON CIJFER
                ADD     AL,07           ; MAAK ER EEN LETTER VAN
LAGENIBB:       ADD     AL,'0'          ; MAAK ER EEN HEX DIGIT VAN
                MOV     DL,AL           ; ZET TEKEN IN DL
                INT     21H             ; DRUK DIGIT AF
                RET
HEX             ENDP

reset_keyboard	PROC NEAR
                push    ax
                push    ds
                push    cs
                pop     ds
                cli
                in      al,61H
                mov     ah,al
                or      al,80H
                out     61H,al
                xchg    ah,al
                out     61H,al
                mov     al,20H
                out     20H,al
                sti
                mov     al,0CH
                push    ax
                xor     ax,ax                  ;segment BIOS variabelen
                mov     ds,ax
                pop     ax                      ;'al' = 'keymask'
                not     al                      ;complement van 'keymask'
                and     ds:[417H],al            ;toetsenbord status byte
                pop     ds
                pop     ax
                ret
reset_keyboard	ENDP

ZOEK_IN_TABEL   PROC    NEAR
                MOV     AH,99H          ; LAADT CODE VOOR NIET GEVONDEN
                CMP     AL,3AH          ; TEST OP HOOGSTE SCANCODE
                JA      NIET_IN_MATRIX  ; SPRING ALS CODE NIET VOOR KAN KOMEN
                XOR     AH,AH           ; MAAK EEN INDEX VAN DE SCANCODE
                MOV     SI,AX           ; ZET IN INDEXREGISTER
                MOV     AL,KBMATRIX[SI] ; LEES POSITIE IN ATOM KEYBOARD
                CMP     AL,99H          ; TEST OF TOETS IN MATRIX VOORKOMT
                JE      NIET_IN_MATRIX  ; NEE, DAN SPRINGEN
                MOV     DI,AX           ; ZET POSITIE IN DI
                AND     DI,0007H        ; BEPAAL DE BITPOSITIE VAN TOETS
                MOV     SI,AX           ; ZET POSITIE OOK IN SI
                AND     SI,00F0H        ; BEPAAL DE RIJ VAN TOETS
                SHR     SI,1            ; SCHUIF VIER MAAL RECHTS
                SHR     SI,1            ;  de positie van de toets in de
                SHR     SI,1            ;  matrix is nu bekend; in SI staat
                SHR     SI,1            ;  de rij en in DI de kolom (=bit)
                MOV     AL,KEYMATRIX[SI]; LEES STATUS VAN ATOM TOETSENBORD
                CLC                     ; WIS CARRY, WANT TOETS IS BEKEND
                JMP     SHORT ZOEK_EIND ; GEDWONGEN SPRONG
NIET_IN_MATRIX: STC                     ; TOETS KOMT NIET VOOR IN TABEL
ZOEK_EIND:      RET                     ; EINDE ROUTINE
ZOEK_IN_TABEL   ENDP

NEWINT09        PROC
                PUSH    AX              ; SAVE AX
                PUSH    DI              ; SAVE INDEXREGISTERS
                PUSH    SI
                CMP     ADRES_B000,0FFH ; TEST OF 8255 EMULATIE UITSTAAT
                JE      MAIN_INT09      ; JA, DAN OVERSLAAN
                XOR     AH,AH           ; RESET AH
                IN      AL,60H          ; LEES SCANCODE VAN TOETSENBORD
                TEST    AL,80H          ; TEST OF BREAK/MAKE
                JZ      MAKE            ; SPRING INDIEN MAKE
BREAK:          AND     AL,7FH          ; WIS HOGE BIT (break bit)
                CALL    ZOEK_IN_TABEL   ; ZOEK SCANCODE IN TABEL OP
                JC      MAIN_INT09      ; SPRING INDIEN NIET GEVONDEN
                OR      AL,RESETKEY[DI] ; RESET TOETS BIT
                MOV     KEYMATRIX[SI],AL; ZET RESULTAAT IN KEYBOARD MATRIX
                JMP     SHORT MAIN_INT09
MAKE:           CALL    ZOEK_IN_TABEL   ; ZOEK SCANCODE IN TABEL OP
                JC      MAIN_INT09      ; SPRING INDIEN NIET GEVONDEN
                AND     AL,SETKEY[DI]   ; SET TOETS BIT
                MOV     KEYMATRIX[SI],AL; ZET RESULTAAT IN KEYBOARD MATRIX
MAIN_INT09:     POP     SI              ; HERSTEL INDEXREGISTERS
                POP     DI
                PUSH    DS              ; LEES KEYBOARD STATUS
                XOR     AX,AX           ; UIT BIOSVARIABELEN
                MOV     DS,AX
                MOV     AL,DS:[417H]
                AND     AL,0Fh
                POP     DS
                CMP     AL,0CH          ; IS CTRL-ALT?
                JNE     INT09END        ; SPRING INDIEN NIET
                IN      AL,60H          ; LEES SCAN CODE
                CMP     AL,RESETTOETS   ; IS RESET TOETS OOK GEDRUKT
                JNE     INT09END
                CALL    RESET_KEYBOARD  ; SPREEKT VOOR ZICH
                MOV     AX,CS           ; INHOUD VAN CS NAAR AX
                MOV     DS,AX           ; ZET IN DS
                MOV     SS,AX           ; EN IN SS
                LEA     AX,ENDSTACK-2   ; RESET STACK POINTER
                MOV     SP,AX
                JMP     RESET           ; RESET ATOM EN BEGIN OPNIEUW
INT09END:       POP     AX              ; HERSTEL AX
                JMP     DWORD PTR CS:OFF09
NEWINT09        ENDP

; ---------------------------------------------------------------------------
; INT60 HANDLER, vanaf versie 2.xx
;       AH = 0  -> zend byte in AL van pc naar atom
;       AH = 1  -> lees byte in AL van atom naar pc
;       AH = 2  -> lees statusregister in AL, DX = basisadres 8255 ppi
;       Na aanroep van deze interrupt is de carry vlag gewist als de functie
;       uitgevoerd is en gezet bij een fout (niet herkende functie). Alleen
;       AL en DX kunnen veranderd zijn. Overige registers blijven ongewijzigd
; ---------------------------------------------------------------------------

NEWINT60        PROC
                PUSH    DS              ; SAVE DS OP STACK
                PUSH    CS              ; CS NAAR DS KOPIEREN
                POP     DS
                CMP     AH,0            ; FUNCTIE 0 ?
                JE      NEWINT60_0      ; JA, DAN GA FUNCTIE UITVOEREN
                CMP     AH,1            ; IDEM VOOR FUNCTIES 1 EN 2
                JE      NEWINT60_1
                CMP     AH,2
                JE      NEWINT60_2
                STC                     ; ONBEKENDE FUNCTIE, ZET CARRY
                JMP     SHORT ENDINTR60 ; SPRING NAAR EINDE VAN ROUTINE
NEWINT60_0:     CALL    ZENDBYTE        ; STUUR BYTE NAAR DE ATOM
                JMP     SHORT ENDINT60  ; SPRING NAAR EINDE
NEWINT60_1:     CALL    LEESBYTE        ; LEES BYTE VAN ATOM
                JMP     SHORT ENDINT60  ; SPRING NAAR EINDE
NEWINT60_2:     MOV     DX,PPI_ADDR     ; LAADT STATUSREGISTER ADRES
                ADD     DX,2
                IN      AL,DX           ; LEES STATUSREGISTER
                SUB     DX,2            ; DX WORDT BASISADRES PPI
ENDINT60:       CLC                     ; WIS CARRY, FUNCTIE IS GEVOERD
ENDINTR60:      POP     DS              ; DS HERSTELLEN
                IRET                    ; EINDE INTERRUPT ROUTINE
NEWINT60        ENDP

; ---------------------------------------------------------------------------
; COMMUNICATIE-SUBROUTINES
; ---------------------------------------------------------------------------

LEESBYTE        PROC    NEAR
                PUSH    DX              ; SAVE GEBRUIKTE REGISTERS
LEESBYTE1:      MOV     DX,PPI_ADDR     ; LAADT STATUSREGISTER ADRES
                ADD     DX,2
                IN      AL,DX           ; LEES STATUSREGISTER
                TEST    AL,00100000B    ; TEST OP INPUT BUFFER FULL
                JZ      LEESBYTE1       ; SPRING INDIEN GEEN BYTE ONTVANGEN
                SUB     DX,2            ; POORTADRES VERLAGEN
                IN      AL,DX           ; LEES DATA
                POP     DX              ; HERSTEL DX REGISTER
                RET                     ; EINDE ROUTINE
LEESBYTE        ENDP

ZENDBYTE        PROC    NEAR
                PUSH    DX              ; SAVE GEBRUIKTE REGISTERS
                PUSH    AX
                MOV     DX,PPI_ADDR     ; LAADT ADRES STATUSREGISTER
                ADD     DX,2
ZENDBYTE1:      IN      AL,DX           ; LEES STATUSREGISTER
                TEST    AL,00000010B    ; TEST OP OUTPUT BUFFER EMPTY
                JZ      ZENDBYTE1       ; SPRING ALS VORIG TEKEN NIET GELEZEN
                DEC     DX              ; POORTADRES VERLAGEN
                POP     AX              ; HAAL DATA VAN STACK
                OUT     DX,AL           ; VERSTUUR DATA
                POP     DX              ; HERSTEL DX
                RET                     ; EINDE ROUTINE
ZENDBYTE        ENDP

; ---------------------------------------------------------------------------
; HOOFDPROGRAMMA INITIALISATIE
; ---------------------------------------------------------------------------

ATOMTERM        PROC    NEAR
                SETUP                   ; ZET HARDWARE INSTELLINGEN
TESTATOM:       CMP     PPI_ADDR,0      ; TEST OF ATOM AANWEZIG IS
                JNE     INIT            ; SPRING INDIEN ATOM AANWEZIG
                LEA     DX,GEENATOM     ; LAADT TEKST VOOR FOUTMELDING
                MOV     AH,09H          ; DRUK TEKST AF
                INT     21H
                MOV     AX,4C01H        ; PROGRAMMA EINDIGEN MET FOUTCODE 1
                INT     21H

; ---------------------------------------------------------------------------
; ZET NIEUWE VECTOREN EN INITIALISEER STACK POINTER
; ---------------------------------------------------------------------------

INIT:           MOV     DX,OFFSET CTRLBREAK
                MOV     AX,2523H        ; ZET NIEUWE CTRL-BREAK HANDLER
                INT     21H
                MOV     DX,OFFSET CRITERR
                MOV     AX,2524H        ; ZET NIEUWE CRITICAL ERROR HANDLER
                INT     21H
                MOV     AX,3509H           ; SAVE OUDE INT09 HANDLER
                INT     21H
                MOV     OFF09,BX
                MOV     SEG09,ES
                MOV     DX,OFFSET NEWINT09 ; ZET NIEUWE INT09 HANDLER
                MOV     AX,2509H
                INT     21H
                MOV     AX,3560H           ; SAVE OUDE INT60 HANDLER
                INT     21H
                MOV     OFF60,BX
                MOV     SEG60,ES
                MOV     DX,OFFSET NEWINT60 ; ZET NIEUWE INT60 HANDLER
                MOV     AX,2560H
                INT     21H
                MOV     DX,OFFSET RAMFONT
                MOV     AX,251FH        ; ZET POINTER NAAR CGA BITMAP
                INT     21H
                LEA     AX,ENDSTACK-2   ; RESET STACK POINTER
                MOV     SP,AX
                
; ---------------------------------------------------------------------------
; NIET GEBRUIKTE GEHEUGENRUIMTE VRIJGEVEN
; ---------------------------------------------------------------------------

                LEA     BX,ENDSTACK     ; LAADT LAATSTE ADRES
                ADD     BX,15           ; PARAGRAAF VOLMAKEN
                MOV     CL,4            ; AANTAL BENODIGDE PARA'S BEREKENEN
                SHR     BX,CL
                PUSH    CS              ; CS REGISTER COPIEREN NAAR ES REG.
                POP     ES
                MOV     AH,4AH          ; DOS FUNCTIE 4A
                INT     21H             ; GERESERVEERD GEHEUGEN VERANDEREN

; ---------------------------------------------------------------------------
; INSTELLINGEN 8255 EN INITIALISATIE HARD EN SOFTWARE INSTELLINGEN
; ---------------------------------------------------------------------------

                MOV     DX,PPI_ADDR     ; LAADT ADRES COMMAND REGISTER 8255
                ADD     DX,3
                MOV     AL,0B4H         ; LAADT INSTELLING
                OUT     DX,AL           ; STEL PPI IN
                MOV     AL,0FH          ; MAAK PC7 HOOG (resetlijn 6502)
                OUT     DX,AL
RESET:          CALL    JOYCALLI        ; CALLIBREER JOYSTICK
                MOV     KLEUR,07H       ; RESET SCHERM ATTRIBUUT
                MOV     VENSTER_XRB,79  ; RESET VENSTER
                MOV     VENSTER_YRB,0
                MOV     VENSTER_XLO,0
                MOV     VENSTER_YLO,24
                MOV     DX,PPI_ADDR     ; LAADT ADRES COMMAND REGISTER 8255
                ADD     DX,3
                MOV     AL,0EH          ; GEEF RESETPULS
                OUT     DX,AL           ; PC7 LAAG
                MOV     CX,00FFH        ; WACHT KORTE TIJD
RESETPAUSE:     LOOP    RESETPAUSE
                MOV     AL,0FH          ;
                OUT     DX,AL           ; PC7 HOOG
GEENRESET:      MOV     AH,2            ; BEPAAL CAPS LOCK STATUS
                INT     16H
                AND     AL,01000000B
                MOV     CAPSSTATUS,AL   ; ZET CAPS VLAG
                MOV     TOONH,50        ; ZET BELL TOONHOOGTE
                MOV     TOOND,04        ; ZET BELL TOONDUUR
                MOV     PRINTERSTATUS,0 ; PRINTER DISABLED
                MOV     SCHERMSTATUS,1  ; SCHERM AAN
                MOV     PAGEMODE,0      ; PAGEMODE UIT
                MOV     SCHERMPAG,0     ; SCHERMPAGINA 0

; ---------------------------------------------------------------------------
; COMMANDO INTERPRETER
; ---------------------------------------------------------------------------

CLEARSCR:       CALL    LEESBYTE        ; LEES EERSTE COMMANDO VAN ATOM
                PUSH    AX              ; SAVE GELEZEN BYTE
                IF HERCULES
                  MOV     AX,0007H      ; LAADT BEELDSCHERM INSTELLING
                ELSE
                  MOV     AX,0002H
                ENDIF
                INT     10H             ; ZET VIDEO MODE
                MOV     REGELS,0        ; RESET REGELTELLER VOOR PAGEMODE
                POP     AX              ; HAAL DATA TERUG
                JMP     SHORT LABEL1    ; GEDWONGEN SPRONG
LEESCOM:        CALL    LEESBYTE        ; LEES COMMANDO VAN ATOM
LABEL1:         CMP     AL,00H          ; TEST OF EEN COMMANDO GEGEVEN WORDT
                JNE     DRUKAF          ; SPRING VOOR KARAKTER AFDRUKKEN
                JMP     COMMANDO        ; GA COMMANDO UITVOEREN
DRUKAF:         CMP     AL,02H          ; PRINTER AAN/UIT DIRECT UITVOEREN
                JE      GOTOCTRL
                CMP     AL,03H
                JNE     DRUKAF2
GOTOCTRL:       JMP     CTRLCODE1
DRUKAF2:        CMP     PRINTERSTATUS,0 ; TEST OF PRINTER AAN STAAT
                JE      DRUKAF0         ; SPRING INDIEN PRINTER UIT STAAT
                MOV     AH,02H          ; PRINTER STATUS LEZEN
                MOV     DL,PRNNR        ; LEES PRINTERNUMMER
                XOR     DH,DH
                INT     17H
                CMP     AH,90H          ; KIJK OF PRINTER GEREED IS
                JE      NAAR_PRINTER    ; JA, DAN SPRING OM AF TE DRUKKEN
                IF HERCULES
                  MOV     BX,0B000H     ; ZET ES NAAR VIDEORAM
                ELSE
                  MOV     BX,0B800H
                ENDIF
                MOV     ES,BX
                MOV     BX,WORD PTR ES:0 ; LEES SCHERMDATA
                MOV     ES:0,8750H      ; KNIPPERENDE 'P' LINKSBOVEN IN BEELD
PRINTER_OFF:    MOV     AH,02H
                INT     17H             ; WACHT TOT PRINTER GEREED IS
                CMP     AH,90H
                JNE     PRINTER_OFF     ; SPRING ALS NOG STEEDS FOUT
                MOV     WORD PTR ES:0,BX ; HERSTEL SCHERMDATA
NAAR_PRINTER:   XOR     AH,AH           ; PRINTER FUNCTIE: TEKEN AFDRUKKEN
                INT     17H
DRUKAF0:        CMP     AL,' '          ; TEST OF KARAKTER EEN CTRL CODE IS
                JB      CTRLCODE        ; JA, SPRING NAAR APARTE ROUTINE
DRUKAF1:        MOV     AH,SCHERMSTATUS ; TEST OF SCHERM AAN STAAT
                CMP     AH,00
                JZ      LEESCOM         ; SPRING INDIEN SCHERM UIT
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
DOSPRINT:       AND     AL,MSB          ; STEL 7e BIT IN
                CMP     AL,7FH          ; TEST OP BACKSPACE
                JNE     DOSPRINT2
                MOV     AH,03H          ; CURSOR POSITIE OPVRAGEN
                INT     10H
                CMP     DL,VENSTER_XLO  ; CURSOR AAN BEGIN VAN REGEL ?
                JE      DOSPRINT1       ; JA, CURSOR EERST NAAR VORIGE REGEL
                DEC     DL              ; CURSOR EEN POSITIE NAAR LINKS
DOSPRINT_WIS:   MOV     AH,02H
                INT     10H
                MOV     AX,0A20H        ; VERVOLGENS EEN SPATIE AFDRUKKEN
                MOV     CX,1
                INT     10H
                JMP     LEESCOM         ; EINDE ROUTINE

DOSPRINT1:      CMP     DH,VENSTER_YRB  ; OP BOVENSTE SCHERMREGEL?
                JE      CTRL_G          ; DAN IS ER NIETS TE DELETEN!
                DEC     DH              ; CURSOR EEN REGEL OMHOOG
                MOV     DL,VENSTER_XRB  ; EN NAAR EIND VAN REGEL
                JMP     SHORT DOSPRINT_WIS

DOSPRINT2:      MOV     AH,09H          ; VIDEO: TEKEN EN ATTR SCHRIJVEN
                MOV     BL,KLEUR        ; ATTRIBUUT
                MOV     CX,1            ; TEKEN SLECHTS EEN KEER AFDRUKKEN
                INT     10H             ; FUNCTIE UITVOEREN
                JMP     CTRL_I          ; GA VERDER MET CURSOR OPSCHUIVEN

CTRLCODE:       CMP     AL,06H          ; SCHERM AANZETTEN ALTIJD UITVOEREN
                JE      CTRLCODE1
                MOV     AH,SCHERMSTATUS ; TEST OF SCHERM AAN STAAT
                OR      AH,AH
                JNZ     CTRLCODE1       ; JA, DAN CTRLCODE UITVOEREN
                JMP     LEESCOM         ; ANDERS OVERSLAAN
CTRLCODE1:      MOV     BL,AL
                SHL     BL,1            ; MAAK WORD POINTER
                MOV     BH,0            ;
                JMP     CTRLTAB[BX]     ; SPRING NAAR CODE AFHANDELING

COMMANDO:       CALL    LEESBYTE        ; LEES COMMANDO NUMMER
                MOV     COMMANDONR,AL   ; BERG COMMANDO NUMMER OP
                MOV     AH,0            ; MAAK HOGE BYTE AX 0
                SHL     AX,1            ; MAAK ER EEN WORD POINTER VAN
                MOV     BX,AX           ; ZET TABEL OFFSET IN BASE REGISTER
                JMP     COMTABEL[BX]    ; SPRING NAAR COMMANDO

; ---------------------------------------------------------------------------
; CONTROL CODE AFHANDELING (versie 1.xx)
; ---------------------------------------------------------------------------

CTRL_B:         MOV     PRINTERSTATUS,1 ; ZET PRINTER AAN
                JMP     LEESCOM         ; EINDE

CTRL_C:         MOV     PRINTERSTATUS,0 ; ZET PRINTER UIT
                JMP     LEESCOM         ; EINDE

CTRL_F:         MOV     SCHERMSTATUS,1  ; ZET SCHERM AAN
                IF      HERCULES
                  CALL    TEXT          ; EN VERLAAT EV. GRAFISCHE MODE
                ENDIF
                JMP     LEESCOM         ; EINDE

CTRL_G:         SOUND   TOONH,TOOND     ; BLIEP
                JMP     LEESCOM

CTRL_H:         MOV     AH,03H          ; VRAAG CURSORPOSITIE
                MOV     BH,SCHERMPAG    ; LAADT SCHERM PAGINA
                INT     10H
                CMP     DL,VENSTER_XLO  ; CURSOR OP BEGIN VAN REGEL?
                JE      PREVLINE_H      ; JA, DAN CURSOR NAAR VORIGE REGEL
                DEC     DL              ; VERLAAG X-COORDINAAT
                JMP     ZETCURSOR       ; ZET CURSOR OP NIEUWE POSITIE
PREVLINE_H:     MOV     DL,VENSTER_XRB  ; CURSOR NAAR EIND VAN REGEL
                JMP     OMHOOG          ; CURSOR REGEL OMHOOG

CTRL_I:         MOV     AH,03H          ; VRAAG CURSORPOSITIE
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
                CMP     DL,VENSTER_XRB  ; CURSOR OP EINDE REGEL?
                JE      NEXTLINE_I      ; JA, DAN NAAR VOLGENDE REGEL
                INC     DL              ; VERHOOG X-COORDINAAT
                JMP     ZETCURSOR       ; ZET CURSOR OP NIEUWE POSITIE
NEXTLINE_I:     MOV     DL,VENSTER_XLO  ; CURSOR NAAR BEGIN VAN REGEL
                JMP     OMLAAG          ; CURSOR REGEL OMLAAG

CTRL_J:         MOV     AH,03H          ; VRAAG CURSORPOSITIE
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
OMLAAG:         INC     REGELS          ; VERHOOG REGELTELLER VOOR PAGEMODE
                CMP     DH,VENSTER_YLO  ; CURSOR OP ONDERSTE REGEL?
                JE      SCROLL_DOWN     ; JA, GA DAN SCROLLEN
                INC     DH              ; CURSOR EEN REGEL OMLAAG
                JMP     ZETCURSOR
SCROLL_DOWN:    CMP     PAGEMODE,0      ; TEST OF PAGEMODE AAN STAAT
                JE      SCR_DOWN1       ; NEE, DAN SPRINGEN
                MOV     AL,VENSTER_YLO  ; BEREKEN VENSTERHOOGTE
                SUB     AL,VENSTER_YRB
                CMP     AL,REGELS       ; VERGELIJK OF MAX AANTAL REGELS
                JAE     SCR_DOWN1       ; NEE, DAN SPRINGEN MAAR
                MOV     AH,08H          ; PAGE MODE EN VENSTER VOL,
                INT     21H             ; WACHT OP TOETSAANSLAG
                MOV     REGELS,0        ; RESET REGELTELLER
SCR_DOWN1:      PUSH    DX              ; SAVE CURSOR COORDINATEN
                MOV     AX,0601H        ; SCROLL VENSTER EEN REGEL OMHOOG (!)
SCROLL:         MOV     CH,VENSTER_YRB  ; VENSTER COORDINATEN
                MOV     CL,VENSTER_XLO
                MOV     DH,VENSTER_YLO
                MOV     DL,VENSTER_XRB
                MOV     BH,KLEUR        ; ATTRIBUUT VAN NIEUWE REGEL
                INT     10H             ; SCROLL HET VENSTER
                POP     DX              ; HAAL CURSOR POSITIE TERUG
                JMP     ZETCURSOR       ; ZET CURSOR OP ZIJN PLAATS
      
CTRL_K:         MOV     AH,03H          ; VRAAG CURSORPOSITIE
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
OMHOOG:         CMP     DH,VENSTER_YRB  ; CURSOR OP BOVENSTE SCHERMREGEL?
                JE      SCROLL_UP       ; JA, GA DAN SCROLLEN
                DEC     DH              ; VERLAAG Y-COORDINAAT
                JMP     ZETCURSOR       ; ZET CURSOR OP NIEUWE POSITIE
SCROLL_UP:      PUSH    DX              ; SAVE CURSOR COORDINATEN
                MOV     AX,0701H        ; SCROLL VENSTER EEN REGEL OMLAAG (!)
                JMP     SHORT SCROLL

ZETCURSOR:      MOV     AH,02H          ; ZET CURSOR OP DL,DH
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
                JMP     LEESCOM         ; GA NAAR HOOFDLUS

CTRL_L:         MOV     CX,CURLINES     ; LEES DE CURSOR DEFINITIE
                CALL    CDEF            ; ZET CURSOR AAN
                MOV     AH,0FH          ; SCHERMBREEDTE OPVRAGEN
                INT     10H
                DEC     AH              ; MET EEN VERMINDEREN
                MOV     VENSTER_XRB,AH  ; RESET VENSTER
                MOV     VENSTER_YRB,0
                MOV     VENSTER_XLO,0
                MOV     VENSTER_YLO,24
                MOV     DX,0            ; LAADT NIEUWE CURSOR POSITIE
                PUSH    DX              ; ZET OP STACK
                MOV     REGELS,0        ; RESET REGELTELLER VOOR PAGEMODE
                MOV     AX,0600H        ; LAADT AX VOOR SCHERM WISSEN
                JMP     SCROLL          ; WIS SCHERM EN ZET CURSOR

CTRL_M:         MOV     AH,03H          ; VRAAG CURSORPOSITIE
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
                MOV     DL,VENSTER_XLO  ; CURSOR NAAR BEGIN VAN REGEL
                JMP     SHORT ZETCURSOR

CTRL_N:         MOV     PAGEMODE,1      ; ZET PAGEMODE AAN
                MOV     REGELS,0        ; RESET REGELTELLER
                JMP     LEESCOM         ; EINDE

CTRL_O:         MOV     PAGEMODE,0      ; ZET PAGEMODE UIT
                JMP     LEESCOM         ; EINDE

CTRL_P:         MOV     DL,VENSTER_XLO  ; ZET CURSOR IN LINKER BOVENHOEK
                MOV     DH,VENSTER_YRB
                PUSH    DX              ; ZET OP STACK    (niet verwijderen!)
                MOV     AX,0600H        ; VENSTER WISSEN
                JMP     SCROLL

CTRL_U:         MOV     SCHERMSTATUS,0  ; ZET SCHERM UIT
                JMP     LEESCOM         ; EINDE

HOME:           MOV     DL,VENSTER_XLO  ; CURSOR COORDINAAT NAAR LINKSBOVEN
                MOV     DH,VENSTER_YRB
                MOV     REGELS,0        ; RESET REGELTELLER VOOR PAGEMODE
                JMP     ZETCURSOR       ; ZET CURSOR OP NIEUWE POSITIE

; ---------------------------------------------------------------------------
; CONTROL CODE UITBREIDINGEN (versie 2.xx)
; ---------------------------------------------------------------------------

CTRL_A:         JMP     TEKEN2LPT       ; TEKEN ALLEEN NAAR PRINTER

CTRL_D:         JMP     VIEWSCHERM      ; ZET NIEUW SCHERM IN BEELD

CTRL_E:         JMP     WERKSCHERM      ; ZET HET SCHERMNUMMER VOOR BEWERKING

CTRL_Q:         JMP     VIDEOCOL        ; VERANDER KLEUR

CTRL_V:         JMP     VIDEOMOD        ; PC VIDEO MODE ZETTEN

CTRL_W:         JMP     CGABITMAP       ; KARAKTER DEFINIEREN

CTRL_X:         JMP     GWINDOW         ; GRAFISCH VENSTER DEFINIEREN

CTRL_Z:         CALL    GWINDOWOFF      ; RESET GRAFISCH VENSTER
                JMP     WINDOW_OFF      ; TEKST WINDOW UITZETTEN

CTRL_KM:        JMP     WINDOW          ; TEKST WINDOW DEFINIEREN

CTRL_SL:        CALL    LEESBYTE        ; LEES X COORDINAAT
                ADD     AL,VENSTER_XLO  ; TEL ER DE VENSTER OFFSET BIJ
                MOV     DL,AL           ; ZET X COORDINAAT IN DL
                CALL    LEESBYTE        ; LEES Y COORDINAAT
                ADD     AL,VENSTER_YRB  ; TEL ER DE VENSTER OFFSET BIJ
                MOV     DH,AL           ; ZET Y COORDINAAT IN DH
                JMP     ZETCURSOR       ; ZET CURSOR OP GEGEVEN POSITIE

CTRL_MN:        JMP     OORSPRONG       ; GRAFISCHE OORSPRONG ZETTEN

; ---------------------------------------------------------------------------
; COMMANDO'S
; ---------------------------------------------------------------------------

ERROR:          MOV     AH,9            ; DRUK FOUTMELDING AF
                LEA     DX,ERR_MSG
                INT     21H
                MOV     AL,COMMANDONR   ; LAADT COMMANDONR
                MOV     AH,2            ; DOS FUNCTIE : TEKENUITVOER
                MOV     CL,4            ; LAADT AANTAL SCHUIFOPDRACHTEN
                SHR     AL,CL           ; ZET HOGE NIBBLE IN LAGE NIBBLE
                CMP     AL,10           ; TEST OP HEXADECIMALE DIGIT
                JB      NIBBLE_H        ; SPRING GEWOON CIJFER
                ADD     AL,07           ; MAAK ER EEN LETTER VAN
NIBBLE_H:       ADD     AL,'0'          ; MAAK ER EEN HEX DIGIT VAN
                MOV     DL,AL           ; ZET KARAKTER IN DL
                INT     21H             ; DRUK DIGIT AF
                MOV     AL,COMMANDONR   ; LAADT COMMANDONR
                AND     AL,0FH          ; VERWAARLOOS HOGE NIBBLE
                CMP     AL,10           ; TEST OP HEXADECIMALE DIGIT
                JB      NIBBLE_L        ; SPRING BIJ GEWOON CIJFER
                ADD     AL,07           ; MAAK ER EEN LETTER VAN
NIBBLE_L:       ADD     AL,'0'          ; MAAK ER EEN HEX DIGIT VAN
                MOV     DL,AL           ; ZET TEKEN IN DL
                INT     21H             ; DRUK DIGIT AF
                MOV     DL,10           ; GEEF NOG EEN CR/LF
                INT     21H
                MOV     DL,13
                INT     21H
                JMP     LEESCOM         ; GA NAAR BEGIN VAN HOOFDLUS


KEY:            MOV     AH,2            ; LEES KEYBOARD STATUS
                INT     16H
                MOV     DX,0            ; RESET ATOM KEYBOARD STATUS BYTE
TST_SHIFT:      TEST    AL,00000011B    ; TEST OP SHIFTTOETS
                JE      TST_CTRL        ; SPRING INDIEN GEEN SHIFTTOETS
                OR      DL,10000000B    ; ZET SHIFT BIT
TST_CTRL:       TEST    AL,00000100B    ; TEST OP CONTROL TOETS
                JE      TST_ALT         ; SPRING INDIEN GEEN CONTROL TOETS
                OR      DL,01000000B    ; ZET CONTROL BIT
TST_ALT:        TEST    AL,00001000B    ; TEST OP ALT TOETS
                JE      TST_CAPS        ; SPRING INDIEN GEEN ALT TOETS
                OR      DL,00100000B    ; ZET ALT BIT
TST_CAPS:       AND     AL,01000000B    ; BEPAAL CAPS LOCK STATUS
                CMP     AL,CAPSSTATUS   ; TEST OP WISSELING
                JE      TST_KEY         ; SPRING INDIEN GELIJK
                MOV     CAPSSTATUS,AL   ; ZET NIEUWE CAPS LOCK STATUS
                MOV     DH,43H          ; LAADT SCANCODE VOOR CAPSTOETS
                OR      DL,00000001B    ; ZET TOETS VLAG
                JMP     ENDKEY          ; SPRING ALTIJD

TST_KEY:        MOV     AH,1            ; KIJK OF EEN TOETS IN BUFFER IS
                INT     16H
                JZ      ENDKEY          ; SPRING INDIEN GEEN TOETS GEDRUKT
                MOV     AH,0            ; HAAL KARAKTER UIT BUFFER
                INT     16H

                CMP     AH,46H          ; KIJK OF SCANCODE BOVEN 46H LIGT
                JLE     NEWKEY          ; NEE, DAN IS NIETS AAN DE HAND
                CMP     AL,00H          ; TEST OF NUMLOCK AAN
                JE      NEWKEY          ; JA, DAN OOK NIETS AAN DE HAND
                ADD     AH,10H          ; ANDERS MAAK AANPASSING
NEWKEY:         MOV     BL,AH           ; ZET SCAN CODE IN INDEXREGISTER
                MOV     BH,00H
                MOV     DH,KEYTAB[BX]   ; ZET NIEUWE SCANCODE IN DL
                OR      DL,00000001B    ; ZET TOETS VLAG

ENDKEY:         MOV     AL,DH           ; STUUR SCAN CODE NAAR ATOM
                CALL    ZENDBYTE
                MOV     AL,DL           ; STUUR STATUSBYTE NAAR ATOM
                CALL    ZENDBYTE
                JMP     LEESCOM         ; GA NAAR BEGIN VAN HOOFDLUS

COPY:           MOV     AH,08H          ; LEES TEKEN OP CURSOR POSITIE
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
                CALL    ZENDBYTE        ; STUUR GELEZEN TEKEN NAAR ATOM
                JMP     LEESCOM         ; GA NAAR HOOFDLUS

GPLOT:          CALL    LEESBYTE        ; LEES X-COORDINAAT LOW-BYTE
                MOV     BL,AL
                CALL    LEESBYTE        ; LEES X-COORDINAAT HIGH-BYTE
                MOV     BH,AL
                CALL    LEESBYTE        ; LEES Y-COORDINAAT LOW-BYTE
                MOV     DL,AL
                CALL    LEESBYTE        ; LEES Y-COORDINAAT HIGH-BYTE
                MOV     DH,AL
                CALL    LEESBYTE        ; LAADT PLOT OPDRACHT
                XOR     BP,BP           ; BEELDPAGINA 0 (GRAFISCH 1 PAGINA !)
                CALL    PIXEL           ; ROEP PLOT ROUTINE AAN
                JMP     LEESCOM         ; GA NAAR HOOFDLUS

SIMULATE4:      CALL    LEESBYTE        ; LEES X-COORDINAAT LOW-BYTE
                MOV     BL,AL
                CALL    LEESBYTE        ; LEES X-COORDINAAT HIGH-BYTE
                MOV     BH,AL
                CALL    LEESBYTE        ; LEES Y-COORDINAAT LOW-BYTE
                MOV     DL,AL
                CALL    LEESBYTE        ; LEES Y-COORDINAAT HIGH-BYTE
                MOV     DH,AL
                CALL    LEESBYTE        ; LAADT PLOT OPDRACHT
                CMP     BX,255          ; TEST OP OVERSCHRIJDING MAX. X
                JA      ENDSIMUL
                CMP     DX,191          ; TEST OP OVERSCHRIJDING MAX. Y
                JA      ENDSIMUL
                MOV     TEMP+0,BX       ; BERG COORDINATEN OP
                MOV     TEMP+2,DX
                IF HERCULES
                  SHL     BX,1            ; X := X*2+OFFSET
                  ADD     BX,104
                ELSE
                  ADD     BX,32
                ENDIF
                IF HERCULES
                  MOV     CX,DX         ; Y := Y*2 - Y/2   voor hercules
                  SHR     DX,1          ;  (Y/2)
                  XCHG    DX,CX
                  SHL     DX,1          ;  (Y*2)
                  SUB     DX,CX
                  ADD     DX,30
                ELSE
                  ADD     DX,4          ; Y := Y + 4       voor cga/ega
                ENDIF
                XOR     BP,BP           ; BEELDPAGINA 0 (GRAFISCH 1 PAGINA !)
                CALL    PIXEL           ; ROEP PLOT ROUTINE AAN
                INC     BX              ; VERHOOG X-COORDINAAT
                CALL    PIXEL           ; ROEP PLOT ROUTINE AAN
                IF HERCULES
                  SHR     TEMP+2,1      ; TEST OP EVEN/ONEVEN BEELDLIJN
                  JC      ENDSIMUL      ; SPRING BIJ ONEVEN BEELDLIJN
                  INC     DX            ; VERHOOG BEELDLIJN
                  CALL    PIXEL         ; ROEP PLOT ROUTINE AAN
                  DEC     BX            ; VERLAAG X-COORDINAAT
                  CALL    PIXEL         ; ROEP PLOT ROUTINE AAN
                ENDIF
ENDSIMUL:       JMP     LEESCOM         ; GA NAAR HOOFDLUS

IGRAPH:         INITGRAPH               ; SCHAKEL NAAR GRAFISCHE MODE
                MOV     AX,0500H        ; BEELDPAGINA 0 ACTUEEL MAKEN
                INT     10H
                MOV     SCHERMPAG,0
                JMP     LEESCOM         ; GA NAAR HOOFDLUS
                                                          
RAMFNT:         MOV     DI,0            ; RESET INDEX
RAMF1:          CALL    LEESBYTE        ; LEES FILENAAM
                MOV     FILEBUFFER[DI],AL ; ZET IN GEHEUGEN
                INC     DI              ; VERHOOG POINTER
                CMP     AL,0            ; TEST OP EINDE FILENAAM
                JNE     RAMF1           ; SPRING INDIEN NOG EEN KARAKTER VOLGT
                LEA     DX,FILEBUFFER   ; LAADT BEGINADRES VAN FONT
                CALL    LOADFONT        ; LAADT HET FONT
                JC      RAMF2           ; SPRING INDIEN EEN FOUT OPGETREDEN
                MOV     AL,0            ; CODE VOOR GEEN FOUT
RAMF2:          CALL    ZENDBYTE        ; GEEF RESULTAAT TERUG NAAR ATOM
                JMP     LEESCOM         ; GA NAAR HOOFDLUS

SCHRIJF:        CALL    LEESBYTE        ; LEES X-COORDINAAT
                MOV     BL,AL
                CALL    LEESBYTE
                MOV     BH,AL
                CALL    LEESBYTE        ; LEES Y-COORDINAAT
                MOV     DL,AL
                CALL    LEESBYTE
                MOV     DH,AL
                MOV     AH,00           ; AH DIENT 0 TE ZIJN
SCHRIJFLUS:     CALL    LEESBYTE        ; LEES AF TE DRUKKEN KARAKTER
                CALL    WRITE           ; SCHRIJF HET KARAKTER
                CMP     AL,0
                JNE     SCHRIJFLUS      ; SPRING INDIEN NOG TEKENS VOLGEN
                JMP     LEESCOM         ; GA NAAR HOOFDLUS

SCHAAL:         MOV     AH,0            ; HOGE BYTE SCHAALFACTOR IS 0
                CALL    LEESBYTE        ; LEES HORIZONTALE SCHAAL
                MOV     SCALE_X,AX      ; ZET HORIZONTALE SCHAAL
                CALL    LEESBYTE        ; LEES VERTIKALE SCHAAL
                MOV     SCALE_Y,AX      ; ZET VERTIKALE SCHAAL
                JMP     LEESCOM         ; GA NAAR HOOFDLUS

CURSOR_ON:      MOV     CX,CURLINES     ; LEES CURSOR DEFINITIE
                JMP     SHORT CURSOR_SET

CURSOR_OFF:     MOV     CX,0FFFFH       ; ZET ILLEGALE CURSORLIJNEN
CURSOR_SET:     CALL    CDEF
                JMP     LEESCOM         ; GA NAAR HOOFDLUS
                
MSDOS:          EXITGRAPH               ; VERLAAT GRAPHISCHE MODE
                MOV     DX,[OFF09]      ; HERSTEL OUDE INT09 HANDLER
                MOV     AX,[SEG09]
                MOV     DS,AX
                MOV     AX,2509H
                INT     21H
                MOV     DX,[OFF60]      ; HERSTEL OUDE INT60 HANDLER
                MOV     AX,[SEG60]
                MOV     DS,AX
                MOV     AX,2560H
                INT     21H
                MOV     AX,4C00H        ; PROGRAMMA EINDIGEN MET FOUTCODE 0
                INT     21H             ; BEEINDIG HET PROGRAMMA

LEESNAAM        PROC    NEAR
                XOR     DI,DI           ; RESET INDEX
LEESNAAM1:      CALL    LEESBYTE        ; LEES FILENAAM
                MOV     FILEBUFFER[DI],AL ; ZET IN GEHEUGEN
                INC     DI              ; VERHOOG POINTER
                CMP     AL,0            ; TEST OP EINDE FILENAAM
                JNE     LEESNAAM1       ; SPRING INDIEN NOG EEN KARAKTER VOLGT
                ; ZOEK NAAR EINDE VAN PAD
LEESNAAM2:      DEC     DI              ; VERLAAG INDEX
                OR      DI,DI           ; TEST OP BEGIN VAN FILENAAM
                JZ      LEESNAAM3       ; SPRING INDIEN 0 (GEEN PAD GEGEVEN)
                CMP     FILEBUFFER[DI],'\'
                JE      LEESNAAM3       ; SPRING INDIEN (LAATSTE) \ GEVONDEN
                CMP     FILEBUFFER[DI],':'
                JE      LEESNAAM3       ; SPRING INDIEN : GEVONDEN
                JMP SHORT LEESNAAM2     ; ZOEK VERDER
LEESNAAM3:      RET
LEESNAAM        ENDP

LOADFILE:       CALL    LEESNAAM        ; LEES DE FILENAAM
                MOV     AX,3D00H        ; DOS FUNCTIE: BESTAND OPENENEN
                MOV     DX,OFFSET FILEBUFFER
                INT     21H
                JC      FILE_ERROR      ; SPRING INDIEN EEN FOUT OPGETREDEN
                MOV     BX,AX           ; BERG DE HANDLE OP
                XOR     AX,AX           ; AX := 0
                CALL    ZENDBYTE        ; GEEF AAN DAT FILE GEOPEND IS
LOADFILE1:      MOV     AH,3FH          ; DOS FUNCTIE: BESTAND LEZEN
                MOV     DX,OFFSET FILEBUFFER
                MOV     CX,255          ; AANTAL TE LEZEN BYTES
                INT     21H             ; LEES DATABLOK
                CALL    ZENDBYTE        ; GEEF BLOKLENGTE AAN ATOM
                CMP     AL,00H          ; TEST OF LAATSTE BLOK GELEZEN IS
                JZ      ENDFILE         ; SPRING INDIEN EINDE FILE
                MOV     CX,AX           ; LAADT TELLER
                XOR     SI,SI           ; RESET INDEX REGISTER
PC2ATOM:        MOV     AL,FILEBUFFER[SI] ; LEES DATA
                INC     SI
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                LOOP    PC2ATOM
                JMP     SHORT LOADFILE1 ; SPRING ALTIJD VOOR VOLGEND BLOK
ENDFILE:        MOV     AH,3EH          ; DOS FUNCTIE: BESTAND SLUITEN
                INT     21H
                JMP     LEESCOM         ; EINDE COMMANDO

FILE_ERROR: 
FILE_ERROR1:    CALL    ZENDBYTE        ; ERRORCODE NAAR ATOM STUREN
                JMP     LEESCOM         ; EINDE COMMANDO

SAVEFILE:       CALL    LEESNAAM        ; LEES DE FILENAAM
                MOV     AH,3CH          ; DOS FUNCTIE: BESTAND AANMAKEN
                MOV     CX,00H          ; BESTAND ATTRIBUUT
                MOV     DX,OFFSET FILEBUFFER
                INT     21H
                JC      FILE_ERROR
                MOV     BX,AX           ; BERG DE HANDLE OP
                XOR     AX,AX           ; AX := 0
                CALL    ZENDBYTE        ; GEEF AAN DAT FILE GEOPEND IS
SAVEFILE2:      CALL    LEESBYTE        ; LEES BLOKLENGTE VAN ATOM
                CMP     AL,0            ; TEST OP EINDE FILE
                JE      ENDFILE
                MOV     CX,AX           ; ZET LENGTE IN TELLER
                MOV     AH,AL           ; SAVE LENGTE IN AH
                XOR     DI,DI           ; CLEAR INDEX
ATOM2PC:        CALL    LEESBYTE        ; LEES DATABYTE
                MOV     FILEBUFFER[DI],AL ; ZET DATA IN BUFFER
                INC     DI
                LOOP    ATOM2PC         ; SPRING INDIEN NIET ALLE BYTE GEHAD
                MOV     CL,AH           ; ZET BLOKLENGTE IN CX
                MOV     AH,40H          ; DOS FUNCTIE: BESTAND SCHRIJVEN
                MOV     DX,OFFSET FILEBUFFER
                INT     21H             ; SCHRIJF DATABLOK
                CALL    ZENDBYTE        ; AANTAL GESCHREVEN BYTES NAAR ATOM
                JMP     SHORT SAVEFILE2 ; GEDWONGEN SPRONG

CAT:            CALL    LEESNAAM        ; LEES FILENAAM
                CMP     FILEBUFFER,0    ; TEST OP BLANCO FILENAAM
                JNE     CAT1            ; SPRING INDIEN NAAM GEGEVEN
                MOV     FILEBUFFER,'*'  ; ZET ANDERS ZOEKPAD *.*
                MOV     FILEBUFFER+1,'.'
                MOV     FILEBUFFER+2,'*'
                MOV     FILEBUFFER+3,0
                MOV     AH,09H          ; CURSOR NAAR VOLGENDE REGEL
                MOV     DX,OFFSET CRLF
                INT     21H
CAT1:           MOV     AH,4EH          ; DOS FUNCTIE: ZOEK EERSTE BESTAND
                MOV     CX,00010000B    ; FILE ATTRIBUUT
                MOV     DX,OFFSET FILEBUFFER
                INT     21H             ; VOER FUNCTIE UIT
                JNC     CAT2            ; SPRING INDIEN GEEN FOUT
                JMP     ZENDRESULT
CAT2:           MOV     AH,2FH          ; DOS FUNCTIE: OPVRAGEN DTA
                INT     21H
                PUSH    DS              ; SAVE DATA SEGMENT
                PUSH    ES              ; ES NAAR DS COPIEREN
                POP     DS
                ADD     BX,21           ; FILE ATTRIBUUT IN DTA[21]
                MOV     AX,[BX]         ; FILE ATTRIBUUT OPBERGEN
                MOV     FILEATTR,AL     ; ATTRIBUUT NAAR AL
                MOV     AH,02H          ; GEBRUIKT VOOR DOS FUNCTIE 02
                AND     AL,00010000B    ; TEST OP DIRECTORY
                JZ      CAT2A           ; SPRING INDIEN GEEN DIRECTORY
                MOV     DL,'<'
                INT     21H             ; PRINT TEKEN IN DL
CAT2A:          ADD     BX,9            ; FILENAAM STAAT VANAF DTA[30]
CAT3:           MOV     DL,[BX]         ; LEES KARAKTER VAN FILENAAM
                INC     BX              ; VERHOOG INDEX
                CMP     DL,0            ; TEST OP EINDE FILENAAM
                JE      CAT4            ; SPRING INDIEN EINDE FILENAAM
                INT     21H             ; ANDERS PRINT TEKEN IN DL
                JMP     SHORT CAT3
CAT4:           MOV     AL,FILEATTR     ; TEST NOGMAALS OP DIRECTORY
                AND     AL,00010000B
                JZ      CAT4A           ; SPRING INDIEN GEEN DIRECTORY
                MOV     DL,'>'
                INT     21H             ; PRINT TEKEN IN DL
CAT4A:          MOV     AH,03H          ; HAAL CURSOR POSITIE
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
                AND     DX,000FH        ; ALLEEN LAAGSTE VIER BITS VAN BELANG
                XOR     DX,000FH        ; INVERTEER LAAGSTE VIER BITS
                MOV     CX,DX           ; LAADT TELLER VOOR AANTAL SPATIES
                INC     CX
                MOV     AH,02H          ; DOS FUNCTIE: TEKEN UITVOEREN
                MOV     DL,' '          ; PRINT SPATIES
CAT5:           INT     21H
                LOOP    CAT5
                MOV     AH,4FH          ; DOS FUNCTIE: ZOEK VOLGENDE BESTAND
                MOV     DX,OFFSET FILEBUFFER
                INT     21H
                JNC     CAT2            ; SPRING INDIEN NOG EEN FILE GEVONDEN
                MOV     AH,09H          ; CURSOR NAAR NIEUWE REGEL
                MOV     DX,OFFSET CRLF
                INT     21H
                MOV     AL,0            ; LAADT RESULTAAT CODE
                POP     DS              ; HERSTEL DATASEGMENT
ZENDRESULT:     CALL    ZENDBYTE        ; STUUR NAAR ATOM
                JMP     LEESCOM         ; VOLGEND COMMANDO UITVOEREN

DIR             PROC    NEAR
                CALL    LEESNAAM        ; LEES DIRECTORY
                CMP     FILEBUFFER+1,':'; TEST OF DRIVE AANGEGEVEN IS
                JNE     DIR1            ; SPRING INDIEN GEEN DRIVE AANGEGEVEN
                MOV     AL,FILEBUFFER   ; LEES OPGEGEVEN DRIVE LETTER
                SUB     AL,'A'          ; MAAK ER DRIVE CODE VAN
                STC                     ; ER IS EEN DRIVE AANDUIDING
                JMP     SHORT DIR2
DIR1:           CLC                     ; ER IS GEEN DRIVE AANDUIDING
DIR2:           RET
DIR             ENDP

CHDIR:          CALL    DIR             ; LEES NIEUWE DIRECTORY
                JNC     CHDIR1          ; SPRING INDIEN GEEN DRIVE AANDUIDING
                CMP     FILEBUFFER+2,0  ; TEST OP LEGE DIRECTORY AANDUIDING
                JNE     CHDIR5          ; SPRING INDIEN DIRECTORY OPGEGEVEN
                JMP     SHORT CHDIR2
CHDIR1:         CMP     FILEBUFFER,0    ; TEST OP LEGE DIRECTORY AANDUIDING
                JNE     CHDIR5
                MOV     AH,19H          ; DOS FUNCTIE: HAAL DRIVE CODE
                INT     21H
CHDIR2:         MOV     DL,AL           ; ZET DRIVE CODE IN DL
                INC     DL              ; VERHOOG DRIVE CODE MET '1'
                MOV     AH,47H          ; DOS FUNCTIE: HAAL ACTUELE DIR
                MOV     SI,OFFSET FILEBUFFER
                INT     21H
                JNC     CHDIR3
                JMP     FILE_ERROR      ; SPRING INDIEN FOUT GEDETECTEERD
CHDIR3:         MOV     AL,00H          ; RESULT CODE NAAR ATOM
                CALL    ZENDBYTE
                MOV     AL,0FFH         ; GEEF AAN DAT ER NOG TEKST VOLGT
                CALL    ZENDBYTE
                MOV     AL,DL           ; GEEF DRIVE CODE AAN ATOM
                CALL    ZENDBYTE
                XOR     SI,SI           ; RESET POINTER
CHDIR4:         MOV     AL,FILEBUFFER[SI] ; LEES KARAKTER
                INC     SI              ; VERHOOG POINTER
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                CMP     AL,00H          ; TEST OP EINDE STRING
                JNE     CHDIR4          ; SPRING INDIEN NOG TEKENS VOLGEN
                JMP     LEESCOM         ; GA VOLGEND COMMANDO HALEN

CHDIR5:         MOV     AH,3BH          ; DOS FUNCTIE: WIJZIG ACTUELE DIR
                JMP     SHORT DIRFUNCTIE; SPRING ALTIJD

RMDIR:          CALL    DIR             ; LEES DIRECTORY
                MOV     AH,3AH          ; DOS FUNCTIE: WIS DIRECTORY
                JMP     SHORT DIRFUNCTIE; SPRING ALTIJD

MKDIR:          CALL    DIR             ; LEES DIRECTORY
                MOV     AH,39H          ; DOS FUNCTIE: MAAK DIRECTORY
DIRFUNCTIE:     MOV     DX,OFFSET FILEBUFFER
                INT     21H             ; VOER FUNCTIE UIT
                JNC     DIRFUNCTIE1     ; SPRING INDIEN FOUTLOOS
                JMP     FILE_ERROR      ; SPRING NAAR FOUT AFHANDELING
DIRFUNCTIE1:    XOR     AL,AL           ; GEEF AAN DAT ER NIETS FOUT WAS
                CALL    ZENDBYTE
                CALL    ZENDBYTE        ; GEEF AAN DAT ER GEEN TEKST VOLGT
                JMP     LEESCOM         ; EINDE ROUTINE, NAAR VOLGEND COMMANDO

FINDFIRST       PROC    NEAR
                CALL    LEESNAAM        ; LEES FILESPEC
                MOV     AH,4EH          ; DOS FUNCTIE: ZOEK EERSTE BESTAND
                MOV     DX,OFFSET FILEBUFFER
                INT     21H
                RET                     ; EINDE ROUTINE
FINDFIRST       ENDP

FINDNEXT        PROC    NEAR
                MOV     AH,4FH          ; DOS FUNCTIE: ZOEK VOLGENDE BESTAND
                INT     21H
                RET                     ; EINDE ROUTINE
FINDNEXT        ENDP

ZET_PAD         PROC    NEAR
                XOR     SI,SI           ; RESET SI
                OR      DI,DI           ; IS EEN PAD OPGEGEVEN ?
                JZ      ZET_FNAAM       ; SPRING ALS GEEN PAD GEGEVEN IS
                INC     DI              ; VERHOOG OM LAATSTE \ MEE TE KOPIEREN
ZETPAD1:        CMP     SI,DI           ; PAD GEHEEL GEKOPIEERD ?
                JE      ZET_FNAAM       ; JA, GA DAN FILENAAM KOPIEREN
                MOV     AL,FILEBUFFER[SI]      ; LEES KARAKTER VAN PAD
                MOV     FILEBUFFER+80H[SI],AL  ; ZET IN PAD EN FILE BUFFER
                INC     SI              ; VERHOOG POINTER
                JMP     SHORT ZETPAD1
ZET_FNAAM:      MOV     AH,2FH          ; DOS FUNCTIE: DTA OPVRAGEN
                INT     21H
                ADD     BX,30           ; FILENAAM STAAT OP DTA[30]
ZETPAD2:        MOV     AL,ES:[BX]      ; LEES KARAKTER VAN FILENAAM
                MOV     FILEBUFFER+80H[SI],AL
                INC     BX              ; VERHOOG POINTERS
                INC     SI
                OR      AL,AL           ; ALLE KARAKTERS GEHAD ?
                JNZ     ZETPAD2         ; NEE, DAN SPRING VOOR VOLGENDE
                MOV     DX,OFFSET FILEBUFFER+80H  ; ZET DX NAAR BEGIN VAN PAD
                DEC     DI              ; VERLAAG DI I.V.M. VERHOGEN
                RET                     ; EINDE ROUTINE
ZET_PAD         ENDP

ATTRIB          PROC    NEAR
                MOV     AX,4300H        ; DOS FUNCTIE: OPVRAGEN ATTRIBUUT
                INT     21H
                RET                     ; EINDE ROUTINE
ATTRIB          ENDP
                    
DELETE:         MOV     CX,0000H        ; ALLEEN NORMALE FILES WISSEN
                CALL    FINDFIRST       ; ZOEK EERSTE FILE
                JNC     DELETE1         ; SPRING INDIEN BESTAND GEVONDEN
                JMP     FILE_ERROR
DELETE1:        CALL    ZET_PAD         ; ZET KOMPLEET PAD VOOR GEVONDEN FILE
                CALL    ATTRIB          ; VRAAG ATTRIBUUT
                AND     CX,00DFH        ; RESET ARCHIVE BIT
                CMP     CX,0000H        ; ALLEEN WISSEN ALS ATTRIBUUT 0 IS
                JNE     DELETE2         ; SPRING ALS NIET GEWIST MAG WORDEN
                MOV     AH,41H          ; DOS FUNCTIE: BESTAND WISSEN
                INT     21H
                JNC     DELETE2         ; SPRING INDIEN GEEN FOUT
                JMP     FILE_ERROR
DELETE2:        CALL    FINDNEXT
                JNC     DELETE1         ; SPRING INDIEN NOG EEN FILE GEVONDEN
                XOR     AL,AL           ; GEEF AAN DAT ALLES GOED IS
                CALL    ZENDBYTE
                JMP     LEESCOM         ; VOLGEND COMMANDO

LOCK:           MOV     CX,0000H        ; ALLEEN NORMALE FILES
                CALL    FINDFIRST       ; ZOEK EERSTE FILE
                JNC     LOCK1           ; SPRING INDIEN BESTAND GEVONDEN
                JMP     FILE_ERROR
LOCK1:          CALL    ZET_PAD         ; ZET KOMPLEET PAD VOOR GEVONDEN FILE
                CALL    ATTRIB          ; VRAAG ATTRIBUUT OP
                MOV     AX,4301H        ; DOS FUNCTIE: ATTRIBUUT WIJZIGEN
                OR      CX,0001H        ; BESTAND READ-ONLY
                INT     21H
                JNC     LOCK2           ; SPRING INDIEN GEEN FOUT
                JMP     FILE_ERROR
LOCK2:          CALL    FINDNEXT
                JNC     LOCK1           ; SPRING INDIEN NOG EEN FILE GEVONDEN
                XOR     AL,AL           ; GEEF AAN DAT ALLES GOED IS
                CALL    ZENDBYTE
                JMP     LEESCOM         ; VOLGEND COMMANDO
                 
UNLOCK:         MOV     CX,0001H        ; ALLEEN READ-ONLY FILES
                CALL    FINDFIRST       ; ZOEK EERSTE FILE
                JNC     UNLOCK1         ; SPRING INDIEN BESTAND GEVONDEN
                JMP     FILE_ERROR
UNLOCK1:        CALL    ZET_PAD         ; ZET KOMPLEET PAD VOOR GEVONDEN FILE
                CALL    ATTRIB          ; ATTRIBUUT OPVRAGEN
                MOV     AX,4301H        ; DOS FUNCTIE: ATTRIBUUT WIJZIGEN
                AND     CX,0FFFEH       ; BESTAND READ/WRITE
                INT     21H
                JNC     UNLOCK2         ; SPRING INDIEN GEEN FOUT
                JMP     FILE_ERROR
UNLOCK2:        CALL    FINDNEXT
                JNC     UNLOCK1         ; SPRING INDIEN NOG EEN FILE GEVONDEN
                XOR     AL,AL           ; GEEF AAN DAT ALLES GOED IS
                CALL    ZENDBYTE
                JMP     LEESCOM         ; VOLGEND COMMANDO

DRIVE:          CALL    LEESBYTE        ; LEES DRIVE CODE
                MOV     DL,AL           ; DRIVE CODE NAAR DL
                MOV     AH,0EH          ; DOS FUNCTIE: ACTUELE DRIVE KIEZEN
                INT     21H
                JMP     LEESCOM         ; VOLGEND COMMANDO

HIDE:           MOV     CX,0001H        ; NORMALE EN READ-ONLY FILES
                CALL    FINDFIRST       ; ZOEK EERSTE FILE
                JNC     HIDE1           ; SPRING INDIEN BESTAND GEVONDEN
                JMP     FILE_ERROR
HIDE1:          CALL    ZET_PAD         ; ZET KOMPLEET PAD VOOR GEVONDEN FILE
                CALL    ATTRIB          ; VRAAG ATTRIBUUT OP
                MOV     AX,4301H        ; DOS FUNCTIE: ATTRIBUUT WIJZIGEN
                OR      CX,0002H        ; BESTAND HIDDEN
                INT     21H
                JNC     HIDE2           ; SPRING INDIEN GEEN FOUT
                JMP     FILE_ERROR
HIDE2:          CALL    FINDNEXT
                JNC     HIDE1           ; SPRING INDIEN NOG EEN FILE GEVONDEN
                XOR     AL,AL           ; GEEF AAN DAT ALLES GOED IS
                CALL    ZENDBYTE
                JMP     LEESCOM         ; VOLGEND COMMANDO
                 
UNHIDE:         MOV     CX,0002H        ; ALLEEN READ-ONLY FILES
                CALL    FINDFIRST       ; ZOEK EERSTE FILE
                JNC     UNHIDE1         ; SPRING INDIEN BESTAND GEVONDEN
                JMP     FILE_ERROR
UNHIDE1:        CALL    ZET_PAD         ; ZET KOMPLEET PAD VOOR GEVONDEN FILE
                CALL    ATTRIB          ; ATTRIBUUT OPVRAGEN
                MOV     AX,4301H        ; DOS FUNCTIE: ATTRIBUUT WIJZIGEN
                AND     CX,0FFFDH       ; BESTAND NOT HIDDEN
                INT     21H
                JNC     UNHIDE2         ; SPRING INDIEN GEEN FOUT
                JMP     FILE_ERROR
UNHIDE2:        CALL    FINDNEXT
                JNC     UNHIDE1         ; SPRING INDIEN NOG EEN FILE GEVONDEN
                XOR     AL,AL           ; GEEF AAN DAT ALLES GOED IS
                CALL    ZENDBYTE
                JMP     LEESCOM         ; VOLGEND COMMANDO

INFO:           CALL    FINDFIRST       ; LEES DE FILENAAM
                MOV     AH,2FH          ; DOS FUNCTIE: DTA OPVRAGEN
                INT     21H
                MOV     TEMP,BX         ; BEWAAR DTA ADRES
                MOV     AX,4300H        ; DOS FUNCTIE: BESTAND ATTRIB OPVRAGEN
                MOV     DX,OFFSET FILEBUFFER
                INT     21H
                JNC     INFO1
                JMP     FILE_ERROR      ; SPRING INDIEN EEN FOUT OPGETREDEN
INFO1:          PUSH    CX              ; BEWAAR ATTRIBUUT
                XOR     AX,AX           ; AX := 0
                CALL    ZENDBYTE        ; GEEF AAN DAT FILE GEVONDEN IS
                MOV     AX,3D00H        ; DOS FUNCTIE: BESTAND OPENEN
                INT     21H
                MOV     BX,AX           ; ZET HANDLE IN BX
INFO2:          MOV     AH,3FH          ; DOS FUNCTIE: BESTAND LEZEN
                MOV     DX,OFFSET FILEBUFFER
                MOV     CX,04           ; AANTAL TE LEZEN BYTES
                INT     21H             ; LEES DATABLOK
                PUSH    BX              ; SAVE FILE HANDLE
                MOV     BX,TEMP         ; HAAL DTA ADRES TERUG
                ADD     BX,26           ; BEPAAL FILE LENGTE ADRES
                MOV     SI,04           ; ZET INDEX REGISTER
                MOV     AL,ES:[BX]      ; LEES BYTE VAN FILE LENGTE
                MOV     AH,ES:[BX+1]
                SUB     AX,16           ; TREK ER DE HEADER LENGTE VAN AF
                MOV     FILEBUFFER[SI],AL
                INC     SI
                MOV     FILEBUFFER[SI],AH
                INC     SI
                MOV     AL,ES:[BX+2]
                MOV     AH,ES:[BX+3]
                SBB     AX,00
                MOV     FILEBUFFER[SI],AL
                INC     SI
                MOV     FILEBUFFER[SI],AH
                MOV     CX,16           ; LAADT TELLER
                XOR     SI,SI           ; RESET INDEX
INFO3:          MOV     AL,FILEBUFFER[SI] ; LEES DATA
                INC     SI              ; VERHOOG INDEX
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                LOOP    INFO3           ; SPRING INDIEN NIET ALLES GEHAD
                POP     BX              ; FILE HANDLE TERUG HALEN
                POP     AX              ; HAAL ATTRIBUUT VAN STACK
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                MOV     AX,5700H        ; DOS FUNCTIE: TIJD EN DATUM OPVRAGEN
                INT     21H
                MOV     AH,3EH          ; DOS FUNCTIE: BESTAND SLUITEN
                INT     21H
                MOV     AL,CL           ; STUUR TIJD NAAR ATOM
                CALL    ZENDBYTE
                MOV     AL,CH
                CALL    ZENDBYTE
                MOV     AL,DL           ; STUUR DATUM NAAR ATOM
                CALL    ZENDBYTE
                MOV     AL,DH
                CALL    ZENDBYTE
                JMP     LEESCOM         ; EINDE ROUTINE, GA NAAR VOLGEND CMD
                
GELUID:         CALL    LEESBYTE        ; LEES TOONHOOGTE
                MOV     BL,AL           ; ZET IN BL
                CALL    LEESBYTE        ; LEES TOONDUUR
                MOV     DL,AL           ; ZET IN DL
                CALL    PLAY_TUNE       ; MAAK HET GELUID
                JMP     LEESCOM         ;

BLIEP:          CALL    LEESBYTE        ; LEES TOONHOOGTE
                MOV     TOONH,AL        ; ZET TOONHOOGTE
                CALL    LEESBYTE        ; LEES TOONDUUR
                MOV     TOOND,AL        ; ZET TOONDUUR
                JMP     LEESCOM

ERRMSG:         CALL    LEESBYTE        ; LEES FOUTCODE VAN ATOM
                XOR     AH,AH           ; RESET AH
                SHL     AX,1            ; VERDUBBEL INDEX
                MOV     SI,AX           ; ERROR STRING INDEX NAAR SI
                MOV     DX,WORD PTR ERRORTABEL[SI] ; ERROR STRING ADRES NAAR DX
                MOV     AH,09H          ; DOS FUNCTIE: STRING AFDRUKKEN
                INT     21H
                JMP     LEESCOM         ; EINDE COMMANDO

KNAAGDIER:      CALL    LEESREGS        ; LEES ALGEMENE REGISTERS
                CMP     AX,0009H        ; TEST OP FUNCTIE 9
                JNE     MUIS1
                PUSH    DS              ; DATA SEGMENT NAAR
                POP     ES              ; EXTRA SEGMENT COPIEREN
                MOV     DX,OFFSET MUISMASKER ;
MUIS1:          INT     33H             ; VOER MUISFUNCTIE UIT
                CALL    ZENDREGS        ; STUUR REGISTERS NAAR ATOM
                JMP     LEESCOM         ; EINDE COMMANDO

DEFMUISMASKER:  XOR     DI,DI           ; RESET INDEX REGISTER
DEFMUISMASKER1: CALL    LEESBYTE        ; LEES DATA
                MOV     MUISMASKER[DI],AL ; ZET IN GEHEUGEN
                INC     DI              ; VERHOOG INDEX
                CMP     DI,64           ; TEST OF ALLE DATA GELEZEN
                JNE     DEFMUISMASKER1  ; SPRING ALS NOG DATA VOLGEN
                JMP     LEESCOM         ; EINDE COMMANDO

CURSORPOS:      MOV     AH,3            ; FUNCTIE 3 VAN INT 10H
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
                MOV     AL,DL           ; ZEND X-POS NAAR ATOM
                CALL    ZENDBYTE
                MOV     AL,DH           ; ZEND Y-POS NAAR ATOM
                CALL    ZENDBYTE
                JMP     LEESCOM         ; EINDE COMMANDO

VIDEO:          CALL    LEESREGS        ; LEES ALGEMENE REGISTERS
                INT     10H             ; VOER VIDEO INTERRUPT UIT
                CALL    ZENDREGS        ; RESULTATEN TERUG
                JMP     LEESCOM

SERPOORT:       CALL    LEESREGS        ; LEES ALGEMENE REGISTERS
                INT     14H             ; VOER INTERRUPT UIT
                CALL    ZENDREGS        ; RESULTATEN TERUG
                JMP     LEESCOM

BIOSKEY:        CALL    LEESREGS        ; LEES ALGEMENE REGISTERS
                INT     16H             ; VOER INTERRUPT UIT
                CALL    ZENDREGS        ; RESULTATEN TERUG
                JMP     LEESCOM

PARPOORT:       CALL    LEESREGS        ; LEES ALGEMENE REGISTERS
                INT     17H             ; VOER INTERRUPT UIT
                CALL    ZENDREGS        ; RESULTATEN TERUG
                JMP     LEESCOM

DOSFUNCTIE:     CALL    LEESREGS        ; LEES ALGEMENE REGISTERS
                INT     21H             ; VOER DOS INTERRUPT UIT
                CALL    ZENDREGS        ; RESULTATEN TERUG
                JMP     LEESCOM

LEESREGS        PROC    NEAR
                CALL    LEESBYTE        ; LEES AL
                MOV     AH,AL           ; WIS BERG AL TIJDELIJK OP
                CALL    LEESBYTE        ; LEES AH
                XCHG    AL,AH           ; WISSEL AH EN AL OM
                PUSH    AX              ; BEWAAR AX
                CALL    LEESBYTE        ; LEES REGISTERS BX,CX EN DX
                MOV     BL,AL
                CALL    LEESBYTE
                MOV     BH,AL
                CALL    LEESBYTE
                MOV     CL,AL
                CALL    LEESBYTE
                MOV     CH,AL
                CALL    LEESBYTE
                MOV     DL,AL
                CALL    LEESBYTE
                MOV     DH,AL
                POP     AX              ; HAAL FUNCTIE NUMMER TERUG
                RET
LEESREGS        ENDP
                
ZENDREGS        PROC    NEAR
                CALL    ZENDBYTE        ; STUUR AX, BX, CX EN DX NAAR ATOM
                MOV     AL,AH
                CALL    ZENDBYTE
                MOV     AL,BL
                CALL    ZENDBYTE
                MOV     AL,BH
                CALL    ZENDBYTE
                MOV     AL,CL
                CALL    ZENDBYTE
                MOV     AL,CH
                CALL    ZENDBYTE
                MOV     AL,DL
                CALL    ZENDBYTE
                MOV     AL,DH
                CALL    ZENDBYTE
                RET
ZENDREGS        ENDP

PORT_IN:        CALL    LEESBYTE        ; LEES I/O ADRES
                MOV     DL,AL           ; ZET DIT ADRES IN DX
                CALL    LEESBYTE
                MOV     DH,AL
                IN      AL,DX           ; LEES BYTE VAN PORT
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                JMP     LEESCOM         ; EINDE COMMANDO

PORT_OUT:       CALL    LEESBYTE        ; LEES I/O ADRES
                MOV     DL,AL           ; ZET DIT ADRES IN DX
                CALL    LEESBYTE
                MOV     DH,AL
                CALL    LEESBYTE        ; LEES DATA
                OUT     DX,AL           ; STUUR DATA NAAR PORT
                JMP     LEESCOM         ; EINDE COMMANDO

UDS:            CALL    LEESBYTE        ; LEES NUMMER VAN HET KARAKTER
                XOR     AH,AH           ; WIS AH
                MOV     CL,4            ; LAADT VERMENIGVULDIGINGSFACTOR
                SHL     AX,CL           ; BEREKEN INDEX
                MOV     DI,AX           ; RESULTAAT NAAR INDEXREGISTER
                MOV     CX,16           ; LAADT TELLER
UDSREAD:        CALL    LEESBYTE        ; LEES DATA
                MOV     RAMFONT[DI],AL  ; ZET IN KARAKTERTABEL
                INC     DI              ; VERHOOG POINTER
                LOOP    UDSREAD
                JMP     LEESCOM         ; EINDE ROUTINE

MOUSE_MOT:      MOV     AX,11           ; OPVRAGEN MUIS VERPLAATSING
                INT     33H
                MOV     AL,0            ; LAADT (VOORLOPING) RESULTAAT
                TEST    CX,0FFFFH       ; BEPAAL TEKEN VAN CX
                JZ      MOUSE_MOT1      ; INDIEN GEEN HOR. BEWEGING SPRINGEN
                JS      MOUSE_MOT2      ; SPRING INDIEN NEGATIEF
                INC     AL              ; MUIS WAS NAAR RECHTS, VERHOOG AL
                JMP     SHORT MOUSE_MOT1
MOUSE_MOT2:     DEC     AL              ; MUIS WAS NAAR LINKS, VERLAAG AL
MOUSE_MOT1:     CALL    ZENDBYTE        ; RESULTAAT NAAR ATOM
                TEST    DX,0FFFFH       ; BEPAAL TEKEN VAN DX
                JZ      MOUSE_MOT3      ; INDIEN GEEN VER. BEWEGING SPRINGEN
                JS      MOUSE_MOT4      ; SPRING INDIEN NEGATIEF
                INC     AL              ; MUIS WAS NAAR OMLAAG, VERHOOG AL
                JMP     SHORT MOUSE_MOT3
MOUSE_MOT4:     DEC     AL              ; MUIS WAS NAAR OMHOOG, VERLAAG AL
MOUSE_MOT3:     CALL    ZENDBYTE        ; RESULTAAT NAAR ATOM
                MOV     AX,03H          ; LEES BUTTON STATUS VAN MUIS
                INT     33H
                MOV     AL,BL           ; KNOPPEN NAAR AL
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                JMP     LEESCOM         ; EINDE COMMANDO

WHOAMI:         INT     11H             ; VRAAG SYSTEEM CONFIGURATIE OP
                AND     AX,1100111011110001B ; SOMMIGE BITS NIET VAN TOEPASSING
                MOV     BL,VIDEOKAART   ; LEES CODE VOOR VIDEOKAART
                AND     BL,00110000B    ; TEST OP HERCULES
                CMP     BL,30H
                JNE     WHOAMI1         ; SPRING INDIEN GEEN HERCULES
                OR      AL,00001000B    ; ZET HERCULESBIT INDIEN ZO
WHOAMI1:        MOV     BX,0F000H       ; ZET ES NAAR BIOS SEGMENT
                MOV     ES,BX
                MOV     SI,0FFFEH       ; SI WIJST NAAR PC TYPE BYTE
                MOV     BL,ES:[SI]      ; LEES PC TYPE
                CMP     BL,0FCH         ; IS HET EEN AT?
                JNE     GEEN_AT         ; SPRING ALS HET GEEN AT IS
                OR      AL,00000100B    ; ZET AT BIT
GEEN_AT:        OR      AH,VIDEOKAART   ; NEEM VIDEOTYPE MEE
                CALL    ZENDBYTE        ; STUUR HET RESULTAAT NAAR ATOM
                MOV     AL,AH
                CALL    ZENDBYTE
                JMP     LEESCOM         ; EINDE COMMANDO

PALET:          CALL    LEESBYTE        ; LEES PALETNUMMER
                MOV     AH,0BH          ; NUMMER VAN VIDEO FUNCTIE
                XOR     BH,BH           ; RESET BH
                TEST    AL,80H          ; BEPAAL OPDRACHT
                JNZ     PALET1          ; SPRING ALS ACHTERGR.KLEUR WIJZIGEN
                INC     BH              ; BH := 1 ALS PALET WIJZIGEN
PALET1:         AND     AL,01111111B    ; KLEURNUMMER BEPALEN
                MOV     BL,AL           ; ZET KLEURNUMMER IN BL
                INT     10H             ; VOER FUNCTIE UIT
                JMP     LEESCOM         ; EINDE COMMANDO

VIDEOMOD:       IF HERCULES
                  CALL    LEESBYTE      ; LEES MODE
                  CMP     AL,03H        ; TEST OP 80 KOLOMS TEKSTMODE
                  JNE     HGMOD
                  EXITGRAPH             ; INITIALISEER TEKST MODE
                  JMP SHORT HTMOD
HGMOD:            INITGRAPH             ; INITIALISEER GRAFISCHE MODE
HTMOD:            NOP                   ; DUMMY INSTRUKTIE
                ELSE
                  CALL    LEESBYTE      ; LEES VIDEO MODE
                  XOR     AH,AH         ; VIDEO FUNCTIE 00 UITVOEREN
                  INT     10H
                ENDIF
; ---------------------------------------------------------------------------
; Versie 2.xx zet hier het grafisch venster uit, plaatst de oorsprong
; terug naar 0,0 en zet beeldpagina 0 voor.
; ---------------------------------------------------------------------------
                MOV     OORSPRONG_X,0
                MOV     OORSPRONG_Y,0
                CALL    GWINDOWOFF
                MOV     AX,0500H        ; BEELDPAGINA 0 KIEZEN
                INT     10H
                MOV     SCHERMPAG,0
WINDOW_OFF:     MOV     AH,0FH          ; SCHERMBREEDTE OPVRAGEN
                INT     10H
                DEC     AH              ; MET EEN VERMINDEREN
                MOV     VENSTER_XRB,AH  ; RESET VENSTER
                MOV     VENSTER_YRB,0
                MOV     VENSTER_XLO,0
                MOV     VENSTER_YLO,24
                JMP     LEESCOM         ; EINDE COMMANDO

VIDEOCOL:       CALL    LEESBYTE        ; LEES KLEUR
                MOV     KLEUR,AL        ; ZET NIEUWE KLEUR
                JMP     LEESCOM         ; EINDE COMMANDO

SCHRIJFPIX:     IF HERCULES
                  JMP     GPLOT         ; APARTE ROUTINE VOOR HERCULES
                ELSE
                  CALL    LEESBYTE      ; LEES COORDINATEN
                  MOV     CL,AL
                  CALL    LEESBYTE
                  MOV     CH,AL
                  CALL    LEESBYTE
                  MOV     DL,AL
                  CALL    LEESBYTE
                  MOV     DH,AL
                  CALL    LEESBYTE      ; LEES PLOTOPDRACHT
; ---------------------------------------------------------------------------
; Versie 2.xx telt bij de ontvangen coordinaten de offset voor de verschoven
; oorsprong op. Daarna wordt gekeken of de absolute coordinaten binnen het
; grafische venster vallen. Zo nee, dan wordt er niets geplot.
; ---------------------------------------------------------------------------
                  ADD     CX,OORSPRONG_X; COORDINATEN AANPASSEN
                  ADD     DX,OORSPRONG_Y
                  CMP     CX,GWINDOW_XLO; TEST OF X BINNEN VENSTER VALT
                  JB      SCHRIJFGEENPIX; NEE, DAN GEEN PIXEL PLOTTEN
                  CMP     CX,GWINDOW_XRB
                  JA      SCHRIJFGEENPIX
                  CMP     DX,GWINDOW_YRB; TEST OF Y BINNEN VENSTER VALT
                  JB      SCHRIJFGEENPIX; NEE, DAN GEEN PIXEL PLOTTEN
                  CMP     DX,GWINDOW_YLO
                  JA      SCHRIJFGEENPIX
; ---------------------------------------------------------------------------
                  CMP     AL,1          ; TEST OP PIXEL ZETTEN
                  JE      SCHRIJFPIX1
                  CMP     AL,2          ; TEST OP PIXEL INVERTEREN
                  JE      SCHRIJFPIX2
                  XOR     AL,AL         ; PIXEL WISSEN IN OVERIGE GEVALLEN
                  JMP     SHORT SCHRIJFPIX3
SCHRIJFPIX1:      MOV     AL,KLEUR      ; ZET KLEUR IN AL
                  JMP     SHORT SCHRIJFPIX3
SCHRIJFPIX2:      MOV     AL,KLEUR      ; ZET KLEUR IN AL
                  OR      AL,80H        ; ZET BIT 7 VOOR INVERTEREN
SCHRIJFPIX3:      XOR     BX,BX         ; SCHERMPAGINA 0 (GRAFISCH 1 PAGINA !)
                  MOV     AH,0CH        ; VIDEO FUNCTIE 0C UITVOEREN
                  INT     10H
SCHRIJFGEENPIX:   JMP     LEESCOM       ; EINDE COMMANDO
                ENDIF

WINDOW:         MOV     CX,4            ; AANTAL TE LEZEN BYTES
                XOR     DI,DI           ; LAADT POINTER
WINDOW1:        CALL    LEESBYTE        ; LEES COORDINAAT
                MOV     VENSTER_XLO[DI],AL
                INC     DI              ; VERHOOG POINTER
                LOOP    WINDOW1
                MOV     DL,VENSTER_XLO  ; LAADT NIEUWE CURSOR POSITIE
                MOV     DH,VENSTER_YRB
                MOV     REGELS,0        ; RESET REGELTELLER VOOR PAGEMODE
                JMP     ZETCURSOR       ; EINDE COMMANDO

JOYSTICK:       CALL    _JOYSTICK
                CALL    ZENDBYTE        ; STUUR RESULTAAT NAAR ATOM
                JMP     LEESCOM

_JOYSTICK:      CALL    LEESSTICK       ; LEES JOYSTICK UIT
                MOV     AH,AL           ; ZET TOETSEN IN AH
                MOV     AL,0FFH         ; RESET JOYSTICK STATUS
                CMP     BX,JOY_LINKS    ; TEST LINKS
                JG      JOYSTICK1       ; SPRING INDIEN NIET LINKS
                AND     AL,11111101B    ; ZET "LINKS" BIT
                JMP     SHORT JOYSTICK2
JOYSTICK1:      CMP     BX,JOY_RECHTS   ; TEST RECHTS
                JL      JOYSTICK2       ; SPRING INDIEN NIET RECHTS
                AND     AL,11110111B    ; ZET "RECHTS" BIT
JOYSTICK2:      CMP     CX,JOY_BOVEN    ; TEST OMHOOG
                JG      JOYSTICK3       ; SPRING INDIEN NIET OMHOOG
                AND     AL,11101111B    ; ZET "OMHOOG" BIT
                JMP     JOYSTICK4
JOYSTICK3:      CMP     CX,JOY_ONDER    ; TEST OMLAAG
                JL      JOYSTICK4       ; SPRING INDIEN NIET OMLAAG
                AND     AL,11111011B    ; ZET "OMLAAG" BIT
JOYSTICK4:      AND     AH,00110000B    ; TEST JOYSTICK TOETSEN
                CMP     AH,30H
                JE      JOYSTICK5       ; SPRING INDIEN GEEN TOETS GEDRUKT
                AND     AL,11111110B    ; ZET "VUUR" BIT
JOYSTICK5:      RET                     ; EINDE ROUTINE

CALLIBRATE:     CALL    JOYCALLI        ; CALLIBREER JOYSTICK
                JMP     LEESCOM         ; EINDE COMMANDO

LEESSTICK       PROC    NEAR
                MOV     DX,201H         ; LAADT ADRES VAN GAME-POORT
                XOR     BX,BX           ; RESET TELLER HORIZONTAAL
                XOR     CX,CX           ; RESET TELLER VERTIKAAL
                OUT     DX,AL           ; GEEF TRIGGERPULS
LEESSTICK1:     IN      AL,DX           ; LEES TRIGGERS
                TEST    AL,1            ; TEST HORIZONTAAL BIT
                JZ      LEESSTICK2      ; SPRING INDIEN 0
                INC     BX              ; VERHOOG HORIZONTAAL TELLER
LEESSTICK2:     TEST    AL,2            ; TEST VERTIKAAL BIT
                JZ      LEESSTICK3      ; SPRING INDIEN 0
                INC     CX              ; VERHOOG VERTIKAAL TELLER
LEESSTICK3:     CMP     BX,500H         ; TIME-OUT ALS GEEN KNUPPEL AANWEZIG
                JE      ENDSTICK
                TEST    AL,3            ; TEST OF BEIDE RICHTINGEN KLAAR
                JNZ     LEESSTICK1      ; SPRING INDIEN NOG NIET KLAAR
ENDSTICK:       RET                     ; EINDE ROUTINE
LEESSTICK       ENDP

JOYCALLI        PROC    NEAR
                CALL    LEESSTICK       ; LEES JOYSTICK STAND
                MOV     AX,BX           ; COPIEER WAARDE IN AX
                SHR     AX,1            ; ZET LINKER MARGE
                MOV     JOY_LINKS,AX
                ADD     BX,AX           ; ZET RECHTER MARGE
                MOV     JOY_RECHTS,BX
                MOV     AX,CX           ; COPIEER WAARDE IN AX
                SHR     AX,1            ; ZET BOVEN MARGE
                MOV     JOY_BOVEN,AX
                ADD     CX,AX           ; ZET ONDER MARGE
                MOV     JOY_ONDER,CX
                RET                     ; EINDE ROUTINE
JOYCALLI        ENDP

BIT7:           CALL    LEESBYTE        ; LEES WAARDE
                MOV     CL,7            ; LAADT TELLER
                SHL     AL,CL           ; ZET BIT 0 OP POSITIE 7
                OR      AL,7FH          ; BIT 0..6 NIET WIJZIGEN
                MOV     MSB,AL          ; BERG OP IN GEHEUGEN
                JMP     LEESCOM         ; EINDE COMMANDO

ZOEKFILE:       MOV     CX,0FFFFH       ; ZOEKEN NAAR ALLE BESTANDEN
                CALL    FINDFIRST       ; LEES FILESPEC EN ZOEK FILE
                JNC     ZOEK1           ; SPRING ALS GEEN FOUT IS OPGETREDEN
                JMP     FILE_ERROR
ZOEK1:          XOR     AL,AL           ; GEEF AAN DAT DTA VOLGT
                CALL    ZENDBYTE
                MOV     AH,2FH          ; DOS FUNCTIE: DTA OPVRAGEN
                INT     21H
                ADD     BX,21           ; ALLEEN VANAF OFFSET 21 OVERSTUREN
                MOV     SI,BX           ; ZET BEGIN DTA IN INDEXREGISTER
                MOV     CX,22
ZOEK2:          MOV     AL,[SI]         ; LEES DATA UIT DTA
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                INC     SI              ; VERHOOG INDEX
                LOOP    ZOEK2           ; SPRING INDIEN NOG DATA VOLGEN
                JMP     LEESCOM         ; EINDE COMMANDO

ZOEKNEXT:       CALL    FINDNEXT        ; ZOEK VOLGENDE FILE
                JNC     ZOEK1           ; INDIEN GEVONDEN STUUR DTA NAAR ATOM
                JMP     FILE_ERROR      ; ANDERS EINDE COMMANDO

LPT:            CALL    LEESBYTE        ; LEES GESELECTEERDE PRINTER
                CMP     AL,0            ; ALLEEN STATUS OPVRAGEN?
                JNE     LPT1            ; NEE, DAN SPRINGEN
                MOV     AL,PRNNR        ; LAADT HUIDIG PRINTERNUMMER
                INC     AL
LPT1:           DEC     AL              ; VERLAAG PRINTERNUMMER
                MOV     PRNNR,AL        ; ZET IN PRINTERNUMMER
                XOR     AH,AH           ; WIS AH
                MOV     DX,AX           ; ZET PRINTERNUMMER IN DX
                MOV     AH,02H          ; PRINTER STATUS OPVRAGEN
                INT     17H
                MOV     AL,AH           ; STUUR STATUS NAAR ATOM
                CALL    ZENDBYTE
                JMP     LEESCOM         ; EINDE COMMANDO

MOUSEKAR:       MOV     AH,03H          ; INT 10H, FUNCTIE 3: CURSORPOS HALEN
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H
                PUSH    DX              ; BEWAAR CURSORPOSITIE OP STACK
                MOV     AX,0003H        ; OPVRAGEN MUISPOSITIE
                INT     33H
                SHR     DX,1            ; MUISCOORDINATEN DOOR 8 DELEN
                SHR     DX,1
                SHR     DX,1
                SHR     CX,1
                SHR     CX,1
                SHR     CX,1
                MOV     DH,DL           ; KOLOM NAAR DH
                MOV     DL,CL           ; REGEL NAAR DL
                MOV     AH,02H
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                INT     10H             ; TEKST CURSOR VERPLAATSEN
                MOV     AH,08H          ; TEKEN OP CURSORPOSITIE LEZEN
                INT     10H
                CALL    ZENDBYTE        ; STUUR TEKEN NAAR ATOM
                POP     DX              ; CURSOR WEER NAAR OORSPR. PLAATS
                MOV     AH,02H
                INT     10H
                JMP     LEESCOM

; ---------------------------------------------------------------------------
; Uitbreiding commando's versie 2.xx
; ---------------------------------------------------------------------------

TEKEN2LPT:      CALL    LEESBYTE        ; LEES HET TEKEN
                CMP     PRINTERSTATUS,0 ; TEST OF PRINTER AANGEZET IS MET $2
                JE      PRINTER_UIT     ; NIET DOEN ALS PRINTER UIT STAAT
                XOR     AH,AH           ; PRINTER FUNCTIE: TEKEN UITVOEREN
                MOV     DL,PRNNR        ; KIES GESELECTEERDE PRINTER
                XOR     DH,DH
                INT     17H             ; STUUR TEKEN NAAR PRINTER
PRINTER_UIT:    JMP     LEESCOM         ; EINDE COMMANDO

CGABITMAP:      CALL    LEESBYTE        ; LEES NUMMER VAN KARAKTER
                AND     AL,7FH          ; BIT 7 MOET 0 ZIJN, (128...255)
                XOR     AH,AH
                MOV     CL,3            ; VERMENIGVULDIG MET 8
                SHL     AX,CL
                MOV     DI,AX           ; ZET OFFSET IN DI REGISTER
                MOV     CX,8            ; LAADT AANTAL TE LEZEN BYTES
                JMP     UDSREAD         ; GA DATA INLEZEN

HFILL:          CALL    LEESBYTE        ; LEES COORDINATEN
                MOV     CL,AL
                CALL    LEESBYTE
                MOV     CH,AL
                CALL    LEESBYTE
                MOV     DL,AL
                CALL    LEESBYTE
                MOV     DH,AL
                CALL    LEESBYTE        ; LEES GRENSKLEUR
                MOV     BL,AL           ; ZET GRENSKLEUR IN BL
                ADD     CX,OORSPRONG_X  ; PAS COORDINATEN AAN
                ADD     DX,OORSPRONG_Y  ;   AAN EV. VERSCHOVEN OORSPRONG
                CMP     DX,GWINDOW_YLO  ; TEST OF Y-COORDINAAT IN VENSTER IS
                JA      HFILL_END       ; SPRING INDIEN ONDER ONDERGRENS
                CMP     DX,GWINDOW_YRB
                JB      HFILL_END       ; SPRING INDIEN BOVEN BOVENGRENS
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                PUSH    CX              ; BEWAAR X-COORDINAAT
                MOV     AH,0DH          ; NUMMER VAN DOSFUNCTIE
HFILL_R:        CMP     CX,GWINDOW_XRB  ; TEST OP GRENS VAN GRAFISCH VENSTER
                JA      HFILL_L         ; SPRING INDIEN BOVEN RECHTERGRENS
                INT     10H             ; VRAAG KLEUR VAN PIXEL OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JE      HFILL_L         ; SPRING INDIEN RECHTER GRENS BEREIKT
                MOV     AL,KLEUR        ; LAADT KLEURNUMMER
                DEC     AH              ; AH WORDT DOS FUNCTIENUMMER 0C
                INT     10H             ; KLEUR PIXEL
                INC     CX              ; VERHOOG X COORDINAAT, 1 PUNT RECHTS
                INC     AH              ; AH VERHOGEN TOT FUNCTIE 0D
                JMP     SHORT HFILL_R   ; SPRING VOOR VOLGEND PIXEL
HFILL_L:        POP     CX              ; HAAL BEGINPUNT TERUG
                DEC     CX              ; EEN POSITIE NAAR LINKS
HFILL_L1:       CMP     CX,GWINDOW_XLO  ; TEST OP GRENS VAN GRAFISCH VENSTER
                JB      HFILL_END       ; SPRING INDIEN ONDER LINKERGRENS
                INT     10H             ; VRAAG KLEUR VAN PIXEL OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JE      HFILL_END       ; SPRING INDIEN RECHTER GRENS BEREIKT
                MOV     AL,KLEUR        ; LAADT KLEURNUMMER
                DEC     AH              ; AH WORDT DOS FUNCTIENUMMER 0C
                INT     10H             ; KLEUR PIXEL
                DEC     CX              ; VERLAAG X COORDINAAT, 1 PUNT LINKS
                INC     AH              ; AH VERHOGEN TOT FUNCTIE 0D
                JMP     SHORT HFILL_L1  ; SPRING VOOR VOLGEND PIXEL
HFILL_END:      JMP     LEESCOM         ; EINDE ROUTINE

VFILL:          CALL    LEESBYTE        ; LEES COORDINATEN
                MOV     CL,AL
                CALL    LEESBYTE
                MOV     CH,AL
                CALL    LEESBYTE
                MOV     DL,AL
                CALL    LEESBYTE
                MOV     DH,AL
                CALL    LEESBYTE        ; LEES GRENSKLEUR
                MOV     BL,AL           ; ZET GRENSKLEUR IN BL
                ADD     CX,OORSPRONG_X  ; PAS COORDINATEN AAN
                ADD     DX,OORSPRONG_Y  ;   AAN EV. VERSCHOVEN OORSPRONG
                CMP     CX,GWINDOW_XRB  ; TEST OF X-COORDINAAT IN VENSTER IS
                JA      HFILL_END       ; SPRING INDIEN OVER RECHTERGRENS
                CMP     CX,GWINDOW_XLO
                JB      HFILL_END       ; SPRING INDIEN ONDER LINKERGRENS
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                PUSH    DX              ; BEWAAR Y-COORDINAAT
                MOV     AH,0DH          ; NUMMER VAN DOSFUNCTIE
VFILL_U:        CMP     DX,GWINDOW_YLO  ; TEST OF GRENS VAN VENSTER BEREIKT
                JA      VFILL_D         ; SPRING INDIEN OVER ONDERGRENS
                INT     10H             ; VRAAG KLEUR VAN PIXEL OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JE      VFILL_D         ; SPRING INDIEN ONDER GRENS BEREIKT
                MOV     AL,KLEUR        ; LAADT KLEURNUMMER
                DEC     AH              ; AH WORDT DOS FUNCTIENUMMER 0C
                INT     10H             ; KLEUR PIXEL
                INC     DX              ; VERHOOG Y COORDINAAT, 1 PUNT OMLAAG
                INC     AH              ; AH VERHOGEN TOT FUNCTIE 0D
                JMP     SHORT VFILL_U   ; SPRING VOOR VOLGEND PIXEL
VFILL_D:        POP     DX              ; HAAL BEGINPUNT TERUG
                DEC     DX              ; EEN POSITIE OMHOOG
VFILL_D1:       CMP     DX,GWINDOW_YRB  ; TEST OF GRENS VAN VENSTER BEREIKT
                JB      VFILL_END       ; SPRING INDIEN OVER BOVENGRENS
                INT     10H             ; VRAAG KLEUR VAN PIXEL OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JE      VFILL_END       ; SPRING INDIEN BOVEN GRENS BEREIKT
                MOV     AL,KLEUR        ; LAADT KLEURNUMMER
                DEC     AH              ; AH WORDT DOS FUNCTIENUMMER 0C
                INT     10H             ; KLEUR PIXEL
                DEC     DX              ; VERLAAG Y COORDINAAT, 1 PUNT OMHOOG
                INC     AH              ; AH VERHOGEN TOT FUNCTIE 0D
                JMP     SHORT VFILL_D1  ; SPRING VOOR VOLGEND PIXEL
VFILL_END:      JMP     LEESCOM         ; EINDE ROUTINE

GWINDOW:        MOV     CX,8            ; AANTAL TE LEZEN BYTES
                XOR     DI,DI           ; LAADT POINTER
GWINDOW1:       CALL    LEESBYTE        ; LEES COORDINAAT
                MOV     BYTE PTR GWINDOW_XLO[DI],AL
                INC     DI              ; VERHOOG POINTER
                LOOP    GWINDOW1
                JMP     LEESCOM         ; EINDE ROUTINE

GWOFF:          CALL    GWINDOWOFF      ; RESET GRAFISCH VENSTER
                JMP     LEESCOM         ; EINDE COMMANDO
               
GWINDOWOFF      PROC    NEAR
                MOV     GWINDOW_XLO,0   ; RESET GRAFISCH VENSTER OP 0,-1,-1,0
                MOV     GWINDOW_YLO,-1
                MOV     GWINDOW_XRB,-1
                MOV     GWINDOW_YRB,0
                RET                     ; EINDE ROUTINE
GWINDOWOFF      ENDP

OORSPRONG:      MOV     CX,4            ; AANTAL TE LEZEN BYTES
                XOR     DI,DI           ; LAADT POINTER
OORSPRONG1:     CALL    LEESBYTE        ; LEES COORDINAAT
                MOV     BYTE PTR OORSPRONG_X[DI],AL
                INC     DI              ; VERHOOG POINTER
                LOOP    OORSPRONG1
                JMP     LEESCOM         ; EINDE ROUTINE

VIEWSCHERM:     CALL    LEESBYTE        ; LEES SCHERM PAGINA NUMMER
                MOV     AH,05H          ; KIES ZICHTBARE PAGINA
                INT     10H
                JMP     LEESCOM         ; EINDE ROUTINE

WERKSCHERM:     CALL    LEESBYTE        ; LEES SCHERM PAGINA NUMMER
                MOV     SCHERMPAG,AL    ; ZET NIEUW PAGINA NUMMER
                JMP     LEESCOM         ; EINDE ROUTINE

CURSORDEF:      CALL    LEESBYTE        ; LEES BOVENSTE LIJN VAN DE CURSOR
                MOV     AH,AL           ; ZET IN AH
                CALL    LEESBYTE        ; LEES ONDERSTE LIJN VAN DE CURSOR
                MOV     CURLINES,AX     ; BERG CURSOR DEFINITIE OP
                JMP     CURSOR_ON       ; ZET DE NIEUWE CURSOR OP HET SCHERM

WRITE_B000:     CALL    LEESBYTE        ; LEES GESCHREVEN DATA
                CMP     AL,0FFH         ; TEST OP UITZETTEN VAN EMULATIE
                JE      WR1             ; JA, DAN SPRINGEN
                AND     AL,0FH          ; ALLEEN VIER LAAGSTE BITS VAN BELANG
WR1:            MOV     ADRES_B000,AL   ; BERG WAARDE OP IN ADRES B000
                JMP     LEESCOM         ; EINDE COMMANDO

READ_B001:      CALL    _JOYSTICK       ; LEES JOYSTICK
                MOV     BL,AL           ; BEWAAR STATUS VAN JOYSTICK
                MOV     AH,2            ; LEES KEYBOARD STATUS
                INT     16H
                TEST    AL,00000011B    ; TEST OP SHIFTTOETS
                JE      READ1           ; SPRING INDIEN GEEN SHIFTTOETS
                AND     BL,01111111B    ; ZET SHIFT BIT
READ1:          TEST    AL,00000100B    ; TEST OP CONTROL TOETS
                JE      READ2           ; SPRING INDIEN GEEN CONTROL TOETS
                AND     BL,10111111B    ; ZET CTRL BIT
READ2:          XOR     AH,AH           ; BEPAAL RIJ VAN KEYBOARD MATRIX
                MOV     AL,ADRES_B000
                CMP     AL,0FFH         ; KIJK OF 8255 EMULATIE AANSTAAT
                JE      READ2A          ; SPRING INDIEN NIET AKTIEF
                MOV     SI,AX           ; ZET RIJ IN INDEXREGISTER
                MOV     AL,BL           ; ZET RESULTAAT IN AL
                AND     AL,KEYMATRIX[SI]; LEES STATUS VAN ATOM-TOETSENBORD
READ2A:         CALL    ZENDBYTE        ; STUUR NAAR DE ATOM
                JMP     LEESCOM         ; EINDE ROUTINE

READ_B002:      MOV     BL,6FH          ; ZET INITIELE WAARDE
                MOV     AH,2            ; LEES KEYBOARD STATUS
                INT     16H
                TEST    AL,08H          ; TEST OP ALT TOETS
                JE      READ3           ; SPRING INDIEN GEEN ALT TOETS
                AND     BL,0BFH         ; WIS BIT VOOR ALT TOETS
READ3:          IN      AL,40H          ; LEES LAGE BYTE VAN TIMER 0
                TEST    AL,02H          ; TEST LAGE BIT "2400 HZ"
                JE      READ4           ; SPRING INDIEN 0
                OR      BL,10H          ; ZET "2400 HZ" BIT
READ4:          IN      AL,40H          ; LEES HOGE BYTE VAN TIMER 0
                TEST    AL,80H          ; TEST HOGE BIT "60 HZ"
                JE      READ5           ; SPRING INDIEN 0
                OR      BL,80H          ; ZET "60 HZ" BIT
READ5:          MOV     AL,BL           ; ZET RESULTAAT IN AL
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                JMP     LEESCOM         ; EINDE ROUTINE

EGAFONT:        MOV     BX,1000H        ; 16 BYTES PER TEKEN, TEKENSET 0
                MOV     CX,256          ; 256 TEKENS IN DE TABEL
                MOV     DX,0000H        ; ASCII WAARDE VAN EERSTE TEKEN
                PUSH    CS              ; SEGMENT ADRES VAN FONTTABEL
                POP     ES              ; IN ES ZETTEN
                MOV     AX,OFFSET RAMFONT
                MOV     BP,AX           ; ZET OFFSET ADRES VAN FONTTABEL
                MOV     AX,1110H        ; INT 10, FUNCTIE 11, SUBFUNCTIE 10
                INT     10H
                JMP     LEESCOM         ; EINDE ROUTINE

EGA8X14:        MOV     AX,1111H        ; 8*14 TEKENSET LADEN EN AKTIVEREN
                JMP     SHORT _EGA8X8   ; GEDWONGEN SPRONG

EGA8X8:         MOV     AX,1112H        ; 8*8 TEKENSET LADEN EN AKTIVEREN
_EGA8X8:        XOR     BL,BL           ; EGA TEKENTABEL 0
                INT     10H             ; FUNCTIE UITVOEREN
                JMP     LEESCOM         ; EINDE ROUTINE

; ---------------------------------------------------------------------------
; Via INT 61H kunnen externe commando's worden toegevoegd met een specifieke
; functie (bijvoorbeeld pattern fill routines). Het subcommandonummer kan
; gegeven worden in bijvoorbeeld het AH register. Parameters en resultaten
; kunnen via de registers AX, BX, CX en DX gegeven worden. Eventuele extra
; communicatie kan plaatsvinden via INT 60H.
; ---------------------------------------------------------------------------

ROEP61:         INT     61H             ; ROEP USER INTERRUPT 61H OP
                JMP     LEESCOM

                EVEN                    ; LAAT STACK OP EVEN ADRES BEGINNEN
STACK           DW      256 DUP (?)     ; STACK ALTIJD OP EINDE VAN PROGRAMMA
ENDSTACK        EQU     THIS WORD       ; LATEN STAAN !
ATOMTERM        ENDP
CSEG            ENDS
                END     AAT
