Skip to content

Latest commit

 

History

History
165 lines (129 loc) · 5.09 KB

assembly_cursus_4.md

File metadata and controls

165 lines (129 loc) · 5.09 KB

De assembly cursus gaat verder... ASSEMBLY (4)

                         ����
                         ����
                         ����
                         ����

Het schiet eindelijk een beetje op met deze cursus, maar ja, deze cursus is ook maar een kwestie van inspiratie. Voor deze keer heb ik wat routines in elkaar geknutseld om de 2 extra kleuren van de MSX 2 in screen 0 te kunnen gebruiken. Ik ga niet vertellen hoe je ze aan moet zetten enzo, want dat is een kwestie van wat VDP-registertjes vullen. Nee, deze tekst gaat over hoe snel de kleuren op een bepaalde positie te zetten of weg te halen.

Normaal gesproken begint de tabel op adres 2048 in het VRAM. Deze tabel is 240 bytes groot (=24*80 bits), tenzij je het aantal lijnen op 26,5 zet, want dan is deze tabel 270 bytes groot. Vergeet dan ook niet om deze tabel te verplaatsen als je meer dan 24 regels gebruikt, want de schermtabel overschrijft dan de kleur-tabel (de schermtabel is dan 2160 bytes groot).

Maar goed, ��n byte van de kleurtabel geeft voor 8 plaatsen aan of ze aan (1) of uit (0) staan. Adres 2048 geeft dus van coordinaten (0,0) tot (7,0) aan of ze aan of uit staan, adres 2049 van (8,0) tot (15,0) enz. Een regel gebruikt dan 10 bytes (=80 bits). Het adres van een coordinaat kun je dan uitrekenen door de y-coordinaat met 10 te vermenigvuldigen, de x-coordinaat door 8 te delen, deze 2 optellen en bij 2048 (het startadres van de tabel) op te tellen. De volgende routine doet dat:

; Bereken adres in kleurtabel ; In: D: x-coordinaat : E: y-coordinaat ; Uit: HL: adres in kleurtabel

CALCAD: LD HL,2048 ; Start kleurtabel

     LD    A,D              ; Deel X door 8
     SRL   A
     SRL   A
     SRL   A
     CALL  HLA              ; en tel bij HL op

     LD    A,E              ; Vermenigvuldig Y met 10
     ADD   A,A
     LD    B,A
     ADD   A,A
     ADD   A,A
     ADD   A,B
     CALL  HLA              ; en tel bij HL op
     RET                    ; Einde

De routine HLA doet niets anders dan HL en A bijelkaar op te tellen en maakt alleen gebruik van de registers A en HL. Deze routine ziet er als volgt uit:

HLA: ADD A,L LD L,A RET NC INC H RET

Nu kunnen we het adres berekenen van een karakter. Nu moeten we nog het bitnummer berekenen. De volgende routine doet dat:

CALCBT: LD A,D ; Laad x-coordinaat AND 7 ; laagste 3 bits LD B,A ; aantal keren schuiven LD A,128 ; eerste positie is 128 RET Z ; Positie = 0? Ja -> klaar! DIVIDE: RRA ; Deel positie door 2 DJNZ DIVIDE ; Herhalen RET

Nu hebben we het bitmasker om een karakter aan te zetten. Als je een karakter uit wilt zetten, moet je dit masker inverteren (XOR 255). We kunnen voorts een routine schrijven die karakters aan en uitzet. Hier komen ze:

WRTVDP: EQU #47 WRTVRM: EQU #0177 RDVRM: EQU #0174 BIGFIL: EQU #016B

; CLS-routine CLS: LD HL,2048 LD BC,240 LD A,0 JP BIGFIL

; Print-routine ; In: D: X-coordinaat ; E: Y-coordinaat ; B: aantal PUT: PUSH BC

     CALL  CALCAD           ; Bereken adres

     CALL  RDVRM            ; Lees oude byte
     LD    C,A              ; Opslaan in C

     CALL  CALCBT           ; Bereken bitmasker

     OR    C                ; Originele byte eroverheen
     CALL  WRTVRM           ; Wegschrijven

     INC   D                ; Pas X aan
     LD    A,D
     CP    80               ; Laatste positie?
     JP    C,PUT1           ; Nee -> Y niet aanpassen

     LD    D,0              ; Pas X en Y aan
     INC   E

PUT1: POP BC DJNZ PUT ; Herhaal routine RET

; Verwijder alternatieve kleuren ; In: D: X-coordinaat ; E: Y-coordinaat ; B: aantal UNPUT: PUSH BC

     CALL  CALCAD           ; Bereken adres

     CALL  RDVRM            ; Lees byte
     LD    C,A              ; Sla het op

     CALL  CALCBT           ; Bereken bitmasker

     CPL                    ; Inverteer het
     AND   C                ; Originele masker erover
     CALL  WRTVRM           ; Schrijf byte weg

     INC   D                ; Pas X aan
     LD    A,D
     CP    80               ; Laatste positie?
     JP    C,UNPUT1         ; Nee -> Y niet aanpassen

     LD    D,0              ; Pas X en Y aan
     INC   E

UNPUT1: POP BC DJNZ UNPUT ; Herhaal routine RET

Deze routines kunnen natuurlijk nog wat aanpassingen gebruiken, zoals de routines CALCBT en CALCAD direct in de code te gebruiken, maar voor een cursus moet dat juist niet omdat het dan een beetje onoverzichtelijker wordt. De routines zelf spreken voor zich, want er staat genoeg commentaar bij. Oh ja, de routines staan ook op diskette en wel in de file ALTCOL.ASM. Tot een volgende keer!

Vincent