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