; *************************************************************************** ; In deze include-file staan de sprite routines van ATOM.COM vanaf ; versie 4.xx. Elke sprite is 32x32 pixels in maximaal 256 kleuren. ; De opzet is om de administratie en het plaatsen van de sprites door de PC ; uit te laten voeren en dus een hogere snelheid te bereiken. De sprites ; werken alleen in extended video modi. Per sprite is 2kb XMS geheugen nodig. ; *************************************************************************** ; Auteur : Roland Leurs ; Datum : 22 augustus 1997 ; *************************************************************************** ; ; --------------------------------------------------------------------------- ; Sprite routines vanaf versie 4.0. ; De volgende functies zijn geimplementeerd: ; functie 00: Definieer sprite base en initialisatie ; functie 01: Definieer sprite ; functie 02: Plaats sprite op het scherm ; functie 03: Verwijder sprite van het scherm ; functie 04: Verplaats sprite op het scherm ; functie 05: Plaats sprite op scherm, zonder administratie ; functie 06: Opvragen sprite coordinaten ; functie 07: Test overlap van twee sprites ; functie 08: Test overlap van een sprite met muis ; functie 09: Tekent een voorgedefinieerd Acorn logo ; ; Functie 00 geeft het aantal beschikbare sprites terug aan de Atom. De ; functies 01 t/m 07 geven minimaal een statusbyte terug. De afzonderlijke ; bits hebben de volgende betekenis: ; +---+---+---+---+---+---+---+---+ ; | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ; +---+---+---+---+---+---+---+---+ ; | | | | | | | | ; | | | | | | | +---- muis button 1 (alleen functie 08) ; | | | | | | +-------- muis button 2 (alleen functie 08) ; | | | | | +------------ muis button 3 (alleen functie 08) ; | | | | +---------------- niet gebruikt (altijd 0) ; | | | +-------------------- geen sprites beschikbaar ; | | +------------------------ ongeldig spritenummer 1 ; | +---------------------------- ongeldig spritenummer 2 of geen muis ; +-------------------------------- overlap tussen sprite 1 en 2 cq muis ; ; Gebruikte variabelen: ; SPRPAGE - BASISPAGINA VAN SPRITES ; SPROFFSET - OFFSET BEGINADRES VAN SPRITES IN XMSGEHEUGEN ; SPRMAX - MAXIMAAL AANTAL SPRITES ; SPRCURR - HUIDIGE SPRITENUMMER IN FUNCTIE ; ; Punt van aandacht: statuscode lijkt ok als geen sprites beschikbaar zijn ; en het opgegeven spritenummer is 0... ; --------------------------------------------------------------------------- ; --------------------------------------------------------------------------- ; Sprite commando ; --------------------------------------------------------------------------- SPRITES: CALL LEESBYTE ; LEES FUNCTIENUMMER MOV FUN_CODE,AL ; ZET AL IN WERKRUIMTE CMP AL,09 ; TEST OP GELDIGE FUNCTIE JLE SPRITES1 ; SPRING INDIEN GELDIG JMP ERROR ; GEEF FOUTMELDING EN BEEINDIG ROUTINE SPRITES1: 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 SPRTAB[BX] ; SPRING NAAR SUBFUNCTIE JMP LEESCOM ; EINDE ROUTINE SPRTAB: DW SPRBASE, SPRDEF, SPRPUT, SPRUNSET DW SPRMOVE, SPRDRAW, SPRCOOR, SPRHIT DW SPRMOUSE, SPREIKEL ; --------------------------------------------------------------------------- ; Sprite functies ; --------------------------------------------------------------------------- SPRBASE PROC NEAR ; FUNCTIE 00 XOR BX,BX ; RESET AANTAL SPRITES CALL LEESBYTE ; LEES XMS PAGINA NUMMER CMP XMSPAGES,AL ; VERGELIJK MET MAXIMAAL PAGINA NR JC SPRBASE2 ; INDIEN GROTER DAN ONGELDIG MOV AH,XMSPAGES ; LAADT HOOGSTE PAGINA NR CMP AH,0 ; IS HET 0? JZ SPRBASE2 ; INDIEN 0 IS ER GEEN XMS GEHEUGEN MOV SPRPAGE,AL ; ZET BASISADRES IN WERKRUIMTE SUB AH,AL ; BEREKEN AANTAL PAGES VOOR SPRITES MOV BL,AH ; ZET AANTAL PAGES IN BL SHL BX,3 ; VERMENIGVULDIG MET 8 (sprites/page) ADD BX,7 ; TEL ER EEN PAGINA BIJ (8 sprites) CMP BX,03FFH ; INDIEN AANTAL GROTER DAN 1023 JLE SPRBASE1 MOV BX,03FFH ; DAN MAXIMUM AANTAL SPRITES LADEN SPRBASE1: PUSH BX ; BEWAAR AANTAL SPRITES OP STACK MOV AL,SPRPAGE ; LAADT SPRITE BASE PAGINANR IN AX XOR AH,AH MOV BX,4000H ; LAADT BX MET PAGINA GROOTTE (16 kb) MUL BX ; BEREKEN OFFSET ADRES IN XMS MOV SPROFFSETL,AX ; SLA OFFSET OP IN GEHEUGEN MOV SPROFFSETH,DX POP BX ; HAAL AANTAL SPRITES WEER VAN STACK SPRBASE2: MOV SPRMAX,BX ; ZET MAXIMUM IN GEHEUGEN MOV AL,BL ; STUUR AANTAL BESCHIKBARE SPRITES CALL ZENDBYTE ; NAAR DE ATOM MOV AL,BH CALL ZENDBYTE RET ; EINDE ROUTINE SPRBASE ENDP SPRDEF PROC NEAR ; FUNCTIE 01 CALL SPRGETNR ; LEES SPRITE NUMMER JLE SPRDEF1 ; SPRING INDIEN OK OR AL,20H ; ZET FOUTCODE JMP ZENDBYTE ; EINDE ROUTINE SPRDEF1: CALL ZENDBYTE ; STUUR OK STATUS NAAR ATOM MOV CX,1024 ; AANTAL TE LEZEN BYTES XOR DI,DI ; RESET POINTER SPRDEF2: CALL LEESBYTE ; LEES DATA MOV FILEBUFFER[DI],AL ; ZET IN BUFFER INC DI ; VERHOOG POINTER LOOP SPRDEF2 ; SPRING ALS NOG BYTES VOLGEN XOR CX,CX ; MAAK CX 0 CALL BUF2SPR ; ZET SPRITE IN XMS GEHEUGEN RET ; EINDE ROUTINE SPRDEF ENDP SPRPUT PROC NEAR ; FUNCTIE 02 CALL SPRGETNR ; LEES SPRITE NUMMER JLE SPRPUT1 ; SPRING INDIEN OK OR AL,20H ; ZET FOUTCODE JMP ZENDBYTE ; STUUR NAAR ATOM SPRPUT1: CALL ZENDBYTE ; STUUR OK STATUS NAAR ATOM ; Onderstaande routine wordt ook gebruikt door de sprmove functie: SPRPUT2: CALL LEESBYTE ; LEES X-COORDINAAT MOV CL,AL ; ZET IN CX REGISTER CALL LEESBYTE MOV CH,AL CALL LEESBYTE ; LEES Y-COORDINAAT MOV DL,AL ; ZET IN DX REGISTER CALL LEESBYTE MOV DH,AL ADD CX,OORSPRONG_X ; PAS COORDINATEN AAN ADD DX,OORSPRONG_Y MOV BX,SPRCURR ; LAADT HUIDIG SPRITENUMMER IN BX SHL BX,2 ; VERM. SPRITENR MET 4 LEA AX,PATTERNS+3FFCH ; LAADT ADRES VAN SPRITE ADMIN SUB AX,BX ; BEREKEN ADRES SPRITE INFO MOV DI,AX ; ZET IN INDEXREGISTER MOV WORD PTR [DI],CX MOV WORD PTR 2[DI],DX MOV TEMP,CX ; BEWAAR X-COORDINAAT IN WERKRUIMTE PUSH DX ; BEWAAR Y-COORDINAAT OP STACK XOR CX,CX ; CX WORDT 0 IVM SPR2BUF CALL SPR2BUF ; LEES SPRITE UIT XMS GEHEUGEN MOV CX,TEMP ; HERSTEL X-COORDINAAT POP DX ; HERSTEL Y-COORDINAAT XOR DI,DI ; RESET POINTER MOV BH,32 ; LAADT VERTIKALE TELLER SPRPUT3: MOV BL,32 ; LAADT HORIZONTALE TELLER SPRPUT4: MOV AH,0DH ; BIOS FUNCTIE: PIXEL CX,DX OPVRAGEN PUSH BX ; BEWAAR HOR. EN VERT. TELLERS XOR BX,BX ; SCHERMPAGINA 0 INT 10H ; VRAAG PIXEL OP MOV FILEBUFFER+400H[DI],AL ; ZET IN GEHEUGEN MOV AL,FILEBUFFER[DI] ; LEES SPRITE PIXEL CMP AL,255 ; TEST OP ACHTERGRONDKLEUR JE SPRPUT5 ; SPRING ALS ACHTERGRONDKLEUR MOV AH,0CH ; BIOS FUNCTIE: PIXEL CX,DX PLOTTEN INT 10H ; PLOT PIXEL SPRPUT5: POP BX ; HAAL TELLERS TERUG INC DI ; VERHOOG TABELPOINTER INC CX ; VERHOOG X-COORDINAAT DEC BL ; VERLAAG HORIZONTALE TELLER JNZ SPRPUT4 ; GEEN EINDE REGEL, VOLGENDE PIXEL MOV CX,TEMP ; NIEUWE REGEL, RESET X-COORDINAAT INC DX ; VERHOOG Y-COORDINAAT DEC BH ; VERLAAG VERTIKALE TELLER JNZ SPRPUT3 ; GEEN EINDE SPRITE, VOLGENDE REGEL MOV CX,400H ; CX WORDT 400H IVM BUF2SPR CALL BUF2SPR ; ZET OUDE SCHERMINFO IN XMS GEHEUGEN RET ; EINDE ROUTINE SPRPUT ENDP SPRUNSET PROC NEAR ; FUNCTIE 03 CALL SPRGETNR ; LEES SPRITE NUMMER JLE SPRUNSET1 ; SPRING INDIEN OK OR AL,20H ; ZET FOUTCODE JMP ZENDBYTE ; STUUR NAAR ATOM ; Onderstaande routine wordt ook gebruikt door de sprmove functie: SPRUNSET1: CALL ZENDBYTE ; STUUR OK STATUS NAAR ATOM CALL SPRGETPOS ; LEES SPRITE POSITIE IN CX,DX MOV TEMP,CX ; ZET X-COORDINAAT IN WERKRUIMTE PUSH DX ; BEWAAR Y-COORDINAAT OP STACK MOV CX,0400H ; CX=400H IVM SPR2BUF CALL SPR2BUF ; LEES SCHERMDATA IN BUFFER MOV CX,TEMP ; HERSTEL X-COORDINAAT POP DX ; HERSTEL Y-COORDINAAT MOV DI,400H ; SET POINTER MOV BH,32 ; LAADT VERTIKALE TELLER SPRUNSET3: MOV BL,32 ; LAADT HORIZONTALE TELLER SPRUNSET4: PUSH BX ; BEWAAR HOR. EN VERT. TELLERS XOR BX,BX ; SCHERMPAGINA 0 MOV AL,FILEBUFFER[DI] ; LEES SPRITE PIXEL MOV AH,0CH ; BIOS FUNCTIE: PIXEL CX,DX PLOTTEN INT 10H ; PLOT PIXEL POP BX ; HAAL TELLERS TERUG INC DI ; VERHOOG TABELPOINTER INC CX ; VERHOOG X-COORDINAAT DEC BL ; VERLAAG HORIZONTALE TELLER JNZ SPRUNSET4 ; GEEN EINDE REGEL, VOLGENDE PIXEL MOV CX,TEMP ; NIEUWE REGEL, RESET X-COORDINAAT INC DX ; VERHOOG Y-COORDINAAT DEC BH ; VERLAAG VERTIKALE TELLER JNZ SPRUNSET3 ; GEEN EINDE SPRITE, VOLGENDE REGEL RET ; EINDE ROUTINE SPRUNSET ENDP SPRMOVE PROC NEAR ; FUNCTIE 04 CALL SPRUNSET ; VERWIJDER SPRITE VAN HET SCHERM JMP SPRPUT2 ; VRAAG NIEUWE POS EN PLAATS SPRITE SPRMOVE ENDP SPRDRAW PROC NEAR ; FUNCTIE 02 MOV BX,SPRCURR ; BEWAAR HUIDIG SPRITENUMMER MOV TEMP+2,BX CALL SPRGETNR ; LEES SPRITE NUMMER JLE SPRDRAW1 ; SPRING INDIEN OK OR AL,20H ; ZET FOUTCODE JMP ZENDBYTE ; STUUR NAAR ATOM SPRDRAW1: CALL ZENDBYTE ; STUUR OK STATUS NAAR ATOM CALL LEESBYTE ; LEES X-COORDINAAT MOV CL,AL ; ZET IN CX REGISTER CALL LEESBYTE MOV CH,AL CALL LEESBYTE ; LEES Y-COORDINAAT MOV DL,AL ; ZET IN DX REGISTER CALL LEESBYTE MOV DH,AL ADD CX,OORSPRONG_X ; PAS COORDINATEN AAN ADD DX,OORSPRONG_Y MOV TEMP,CX ; BEWAAR X-COORDINAAT IN WERKRUIMTE CMP BX,TEMP+2 ; VERGELIJK HUIDIG EN VORIG SPRITENR JE SPRDRAW2 ; INDIEN GELIJK NIET UIT XMS LADEN PUSH DX ; BEWAAR Y-COORDINAAT OP STACK XOR CX,CX ; CX WORDT 0 IVM SPR2BUF CALL SPR2BUF ; LEES SPRITE UIT XMS GEHEUGEN MOV CX,TEMP ; HERSTEL X-COORDINAAT POP DX ; HERSTEL Y-COORDINAAT SPRDRAW2: XOR DI,DI ; RESET POINTER MOV BH,32 ; LAADT VERTIKALE TELLER SPRDRAW3: MOV BL,32 ; LAADT HORIZONTALE TELLER SPRDRAW4: PUSH BX ; BEWAAR HOR. EN VERT. TELLERS XOR BX,BX ; SCHERMPAGINA 0 MOV AL,FILEBUFFER[DI] ; LEES SPRITE PIXEL CMP AL,255 ; TEST OP ACHTERGRONDKLEUR JE SPRDRAW5 ; SPRING ALS ACHTERGRONDKLEUR MOV AH,0CH ; BIOS FUNCTIE: PIXEL CX,DX PLOTTEN INT 10H ; PLOT PIXEL SPRDRAW5: POP BX ; HAAL TELLERS TERUG INC DI ; VERHOOG TABELPOINTER INC CX ; VERHOOG X-COORDINAAT DEC BL ; VERLAAG HORIZONTALE TELLER JNZ SPRDRAW4 ; GEEN EINDE REGEL, VOLGENDE PIXEL MOV CX,TEMP ; NIEUWE REGEL, RESET X-COORDINAAT INC DX ; VERHOOG Y-COORDINAAT DEC BH ; VERLAAG VERTIKALE TELLER JNZ SPRDRAW3 ; GEEN EINDE SPRITE, VOLGENDE REGEL RET ; EINDE ROUTINE SPRDRAW ENDP SPRCOOR PROC NEAR ; FUNCTIE 06 CALL SPRGETNR ; LEES SPRITE NUMMER JLE SPRCOOR1 ; SPRING INDIEN OK OR AL,20H ; ZET FOUTCODE JMP ZENDBYTE ; STUUR NAAR ATOM SPRCOOR1: CALL ZENDBYTE ; STUUR OK STATUS NAAR ATOM CALL SPRGETPOS ; LEES SPRITE POSITIE IN CX,DX 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 RET ; EINDE ROUTINE SPRCOOR ENDP SPRHIT PROC NEAR ; FUNCTIE 08 CALL SPRGETNR ; LEES SPRITE NUMMER#1 JLE SPRHIT0 ; SPRING INDIEN GELDIG NUMMER OR AL,20H ; ZET FOUTVLAG VOOR SPRITE#1 SPRHIT0: MOV AH,AL ; ZET STATUS IN AH MOV TEMP,BX ; BEWAAR SPRITE NUMMER#1 CALL SPRGETNR ; LEES SPRITE NUMMER#2 JLE SPRHIT5 ; SPRING INDIEN GELDIG NUMMER MOV AL,40H ; ZET FOUTVLAG VOOR SPRITE#2 SPRHIT5: OR AL,AH ; MERGE STATUS VOOR BEIDE SPRITE NRS JNZ SPRHIT4 ; SPRING INDIEN FOUT OPGETREDEN CALL SPRGETPOS ; LEES COORDINATEN VAN SPRITE#2 MOV BX,TEMP ; HAAL SPRITE NUMMER#1 VAN STACK PUSH CX ; SAVE X2 OP STACK PUSH DX ; SAVE Y2 OP STACK CALL SPRGETPOS ; LEES COORDINATEN VAN SPRITE#1 POP BX ; LAADT Y2 IN BX POP AX ; LAADT X2 IN AX SUB AX,CX ; BEREKEN VERSCHIL IN X-COORDINATEN JNS SPRHIT1 ; SPRING INDIEN POSITIEF NEG AX ; BEPAAL ABSOLUTE WAARDE VAN AX SPRHIT1: SUB BX,DX ; BEREKEN VERSCHIL IN Y-COORDINATEN JNS SPRHIT2 ; SPRING INDIEN POSITIEF NEG BX ; BEPAAL ABSOLUTE WAARDE VAN BX SPRHIT2: CMP AX,31 ; TEST OF |X2-X1|<32 JA SPRHIT3 ; NEE, SPRING CMP BX,31 ; TEST OF |Y2-Y1|<32 JA SPRHIT3 MOV AL,10000000B ; LAADT HIT-FLAG JMP SHORT SPRHIT4 ; SPRING ALTIJD SPRHIT3: XOR AL,AL ; GEEN FOUT, MAAR GEEN OVERLAG SPRHIT4: CALL ZENDBYTE ; STUUR STATUS NAAR ATOM RET ; EINDE ROUTINE SPRHIT ENDP SPRMOUSE PROC NEAR ; FUNCTIE 07 CALL SPRGETNR ; LEES SPRITE NUMMER JLE SPRMOUSE1 ; SPRING INDIEN GELDIG NUMMER OR AL,20H ; LAADT FOUTSTATUS SPRMOUSE1: OR AL,JERRY ; LAADT MUIS STATUS JNZ SPRMOUSE5 ; SPRING INDIEN EEN FOUT OPGETREDEN MOV AH,0FH ; SCHERMBREEDTE OPVRAGEN INT 10H MOV BYTE PTR TEMP+2,AH MOV AX,0003H ; LAADT MUISFUNCTIE NUMMER INT 33H ; BEPAAL POSITIE EN KNOPSTATUS MOV BYTE PTR TEMP,BL; BEWAAR KNOPSTATUS CMP BYTE PTR TEMP+2,40 JNE SPRMOUSE1A ; SPRING INDIEN GEEN 40 KOL.MODE SHR CX,1 ; IN 40 KOL.MODE XMUIS HALVEREN SPRMOUSE1A: PUSH CX ; BEWAAR XMUIS OP STACK PUSH DX ; BEWAAR YMUIS OP STACK MOV BX,SPRCURR ; LAADT HUIDIG SPRITENUMMER CALL SPRGETPOS ; LEES POSITIE VAN SPRITE IN CX,DX ADD CX,16 ; BEPAAL MIDDELPUNT VAN SPRITE ADD DX,16 POP BX ; LAADT YMUIS IN BX POP AX ; LAADT XMUIS IN BX SUB AX,CX ; BEREKEN VERSCHIL IN X-COORDINATEN JNS SPRMOUSE2 ; SPRING INDIEN POSITIEF NEG AX ; BEPAAL ABSOLUTE WAARDE VAN AX SPRMOUSE2: SUB BX,DX ; BEREKEN VERSCHIL IN Y-COORDINATEN JNS SPRMOUSE3 ; SPRING INDIEN POSITIEF NEG BX ; BEPAAL ABSOLUTE WAARDE VAN BX SPRMOUSE3: CMP AX,16 ; TEST OF |XMUIS-X1|<16 JA SPRMOUSE4 ; NEE, SPRING CMP BX,16 ; TEST OF |YMUIS-Y1|<16 JA SPRMOUSE4 MOV AL,10000000B ; LAADT HIT-FLAG OR AL,BYTE PTR TEMP; MENG MET KNOPPEN STATUS JMP SHORT SPRMOUSE5 ; SPRING ALTIJD SPRMOUSE4: XOR AL,AL ; GEEN FOUT, MAAR GEEN OVERLAG SPRMOUSE5: CALL ZENDBYTE ; STUUR STATUS NAAR ATOM RET ; EINDE ROUTINE SPRMOUSE ENDP SPREIKEL PROC ; TEKEN ACORN LOGO CALL LEESBYTE ; LEES X-COORDINAAT MOV CL,AL ; ZET IN CX REGISTER CALL LEESBYTE MOV CH,AL CALL LEESBYTE ; LEES Y-COORDINAAT MOV DL,AL ; ZET IN DX REGISTER CALL LEESBYTE MOV DH,AL ADD CX,OORSPRONG_X ; PAS COORDINATEN AAN ADD DX,OORSPRONG_Y MOV TEMP,CX ; VOOR LATER GEBRUIK MOV SI,0 ; RESET SOURCE POINTER MOV DI,SI ; RESET SPRITE DATA POINTER SPREIKEL1: MOV AX,SPRLOGO[SI] ; LEES DATA UIT TABEL MOV BH,16 ; LAADT PIXEL TELLER SPREIKEL2: SHL AX,1 ; SCHUIF DATA BIT IN CARRY JNC SPREIKEL3 ; SPRING INDIEN ACHTERGRONDKLEUR MOV BL,2 ; LAADT PIXELKLEUR GROEN CMP SI,96 ; LAATSTE STUKJE MOET BRUIN WORDEN JL SPREIKEL4 MOV BL,6 ; LAADT PIXELKLEUR BRUIN JMP SHORT SPREIKEL4 ; SPRING ALTIJD SPREIKEL3: MOV BL,255 ; LAADT ACHTERGRONDKLEUR SPREIKEL4: MOV FILEBUFFER[DI],BL ; ZET SPRITE DATA INC DI ; VERHOOG SPRITE DATA POINTER DEC BH ; VERLAAG PIXEL TELLER JNZ SPREIKEL2 ; SPRING VOOR VOLGENDE PIXEL INC SI ; VERHOOG SOURCE POINTER INC SI ; VERHOOG SOURCE POINTER CMP SI,128 ; TEST OP LAATSTE WORD JNE SPREIKEL1 ; SPRING INDIEN NOG NIET KLAAR JMP SPRDRAW2 ; GA EIKEL TEKENEN SPREIKEL ENDP ; --------------------------------------------------------------------------- ; Sprite subroutines (alleen voor intern gebruik) ; --------------------------------------------------------------------------- SPRGETNR PROC NEAR ; LEEST SPRITENUMMER VAN ATOM CALL LEESBYTE ; LEES LAGE BYTE VAN SPRITENUMMER MOV BL,AL ; ZET IN BL CALL LEESBYTE ; LEES HOGE BYTE VAN SPRITENUMMER MOV BH,AL ; ZET IN BH MOV SPRCURR,BX ; ZET IN WERKRUIMTE XOR AL,AL ; RESET STATUSBYTE CMP SPRMAX,0 ; TEST OF SRITES BESCHIKBAAR ZIJN JNE SPRGETNR1 ; SPRING ALS OK MOV AL,10H ; LAADT STATUSCODE SPRGETNR1: CMP BX,SPRMAX ; VERGELIJK MET HOOGSTE SPRITENUMMER RET ; EINDE ROUTINE SPRGETNR ENDP SPRGETPOS PROC NEAR ; LEEST SPRITEPOSITIE IN CX,DX SHL BX,2 ; VERM. SPRITENUMMER MET 4 LEA AX,PATTERNS+3FFCH ; LAADT ADRES SPRITEADMIN SUB AX,BX ; BEREKEN ADRES SPRITE INFORMATIE MOV DI,AX ; ZET ADRES IN INDEXREGISTER MOV CX,WORD PTR [DI] ; ZET X-COORDINAAT IN CX MOV DX,WORD PTR 2[DI] ; ZET Y-COORDINAAT IN DX RET ; EINDE SUBROUTINE SPRGETPOS ENDP SPR2BUF PROC NEAR ; KOPIEERT SPRITE UIT XMS GEHEUGEN MOV COPYTBL[0],0400H ; ZET BLOKLENGTE IN DATATABEL MOV COPYTBL[2],0000H MOV DX,XMSHANDLE ; ZET HANDLE IN DATATABEL MOV COPYTBL[4],DX MOV AX,SPRCURR ; BEREKEN OFFSET IN XMS GEHEUGEN MOV BX,800H MUL BX ; OFFSET STAAT NU IN DX:AX ADD AX,CX ; SPRITE: CX=0; SCHERM: CX=400H ADD AX,SPROFFSETL ; TEL BASIS OFFSET ER BIJ OP ADC DX,SPROFFSETH MOV COPYTBL[6],AX ; ZET ADRES IN DATATABEL MOV COPYTBL[8],DX MOV COPYTBL[10],0 ; COPY NAAR CONVENTIONEEL GEHEUGEN MOV DX,OFFSET FILEBUFFER ;ZET BUFFER ADRES IN TABEL ADD DX,CX ; SPRITE: CX=0; SCHERM: CX=400H MOV COPYTBL[12],DX MOV COPYTBL[14],DS MOV AH,0BH ; LAADT FUNCTIENUMMER LEA SI,COPYTBL ; LAADT POINTER NAAR TABEL CALL DWORD PTR [XMSDRV] ; VOER OPDRACHT UIT RET ; EINDE ROUTINE SPR2BUF ENDP BUF2SPR PROC NEAR ; KOPIEERT SPRITE NAAR XMS GEHEUGEN MOV COPYTBL[0],0400H ; ZET BLOKLENGTE IN DATATABEL MOV COPYTBL[2],0000H MOV COPYTBL[4],0 ; COPY UIT CONVENTIONEEL GEHEUGEN MOV DX,OFFSET FILEBUFFER ;ZET BUFFER ADRES IN TABEL ADD DX,CX ; SPRITE: CX=0; SCHERM: CX=400H MOV COPYTBL[6],DX MOV COPYTBL[8],DS MOV DX,XMSHANDLE ; ZET XMS HANDLE IN DATATABEL MOV COPYTBL[10],DX MOV AX,SPRCURR ; BEREKEN OFFSET IN XMS GEHEUGEN MOV BX,800H MUL BX ; OFFSET STAAT NU IN DX:AX ADD AX,CX ; SPRITE: CX=0; SCHERM: CX=400H ADD AX,SPROFFSETL ; TEL BASIS OFFSET ER BIJ OP ADC DX,SPROFFSETH MOV COPYTBL[12],AX ; ZET ADRES IN DATATABEL MOV COPYTBL[14],DX MOV AH,0BH ; LAADT FUNCTIENUMMER LEA SI,COPYTBL ; LAADT POINTER NAAR TABEL CALL DWORD PTR [XMSDRV] ; VOER OPDRACHT UIT RET ; EINDE ROUTINE BUF2SPR ENDP SPRLOGO DW 0000000000001111B, 1110000000000000B DW 0000000000011111B, 1111000000000000B DW 0000000000111111B, 1111100000000000B DW 0000000001111111B, 1111110000000000B DW 0000000011111111B, 1111111000000000B DW 0000000111111111B, 1111111100000000B DW 0000000111111111B, 1111111100000000B DW 0000001111111111B, 1111111110000000B DW 0000001111111111B, 1111111110000000B DW 0000011111111111B, 1111111111000000B DW 0000011111111111B, 1111111111000000B DW 0000011111111111B, 1111111111000000B DW 0000011111111111B, 1111111111000000B DW 0000011111111111B, 1111111111000000B DW 0000011111111111B, 1111111111000000B DW 0000011111111111B, 1111111111000000B DW 0000011111111111B, 1111111111000000B DW 0000000111111111B, 1111111100000000B DW 0000000111111111B, 1111111100000000B DW 0000000000000000B, 0000000000000000B DW 0000000000000000B, 0000000000000000B DW 0000000001111111B, 1111110000000000B DW 0000000000111111B, 1111100000000000B DW 0000000000001111B, 1110000000000000B DW 0000000000000111B, 1100000000000000B DW 0000000000000011B, 1000000000000000B DW 0000000000000011B, 1000000000000000B DW 0000111111000011B, 1000000000000000B DW 0000111111111111B, 1111000000000000B DW 0000000000111111B, 1111111100000000B DW 0000000000000000B, 0000111111111000B DW 0000000000000000B, 0000000001111000B