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