; ***************************************************************************
; 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: PUSH BX ; BEWAAR HOR. EN VERT. TELLERS
; XOR BX,BX ; SCHERMPAGINA 0
; MOV AH,0DH ; BIOS FUNCTIE: PIXEL CX,DX OPVRAGEN
; INT 10H ; VRAAG PIXEL OP
CALL GETPIX ; 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
CALL PUTPIX ; 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
CALL PUTPIX ; 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
CALL PUTPIX ; 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
|