;**********************************************************************; ;* A T O M I C D E B U G G E R *; ;*--------------------------------------------------------------------*; ;* doel : machinetaal debugger voor Atom-in-PC met *; ;* ondersteuning van 6502, 65C02 en 65802 *; ;*--------------------------------------------------------------------*; ;* filenaam : mda.inc *; ;* auteur : Roland Leurs *; ;* The Atomic Development Studio *; ;* ontwikkeld : augustus 1998 *; ;* laatste update : *; ;*--------------------------------------------------------------------*; ;* assembleren : als include file opnemen in debug.asm *; ;**********************************************************************; hwrk equ work+$58 vdusavex equ hwrk+5 vdusavey equ hwrk+6 hposx equ hwrk+7 hposy equ hwrk+8 hattr equ hwrk+9 hmem equ hwrk+10 queueptr equ hwrk+12 queue equ hwrk+13 hcurxy stx hposx ;berg nieuwe cursorpositie op sty hposy ldy #4 ;load teller lda hposy ;laadt nieuwe y positie sta hwrk+2 ;zet in werkruimte sta hwrk lda #0 ;laadt hoge byte nieuwe y positie sta hwrk+1 ;zet in werkruimte sta hwrk+3 hcurxy1 asl hwrk ;schuif links rol hwrk+1 asl hwrk+2 rol hwrk+3 dey ;verlaag teller bne hcurxy1 ;spring indien nog meer te schuiven is asl hwrk+2 ;(hwrk)=y*16,(hwrk+2)=y*64 rol hwrk+3 asl hwrk+2 rol hwrk+3 clc ;clear carry voor optellen lda hwrk ;bereken (hwrk)+(hwrk+2)+x adc hwrk+2 ; d.i. het nieuwe cursoradres sta hwrk lda hwrk+1 adc hwrk+3 sta hwrk+1 clc lda hwrk adc hposx sta hmem ;zet als pointer naar videoram pha ;bewaar lage byte op stack lda hwrk+1 adc #0 sta hmem+1 tay ;zet hoge hoge byte in y register ldx #$0E ;laadt CRT registernummer jsr hcrt ;stuur byte naar CRT pla ;haal lage byte cursoradres van stack tay ;zet in y register inx ;verhoog CRT registernummer jsr hcrt ;stuur byte naar CRT asl hmem ;bereken pointer naar videoram rol hmem+1 rts ;einde routine hcrt lda #$24 ;laadt pc-commando nummer jsr pccom ;stuur naar pc lda #$B4 ;laadt lage byte I/O adres jsr zendbyte ;stuur naar pc lda #$03 ;laadt hoge byte I/O adres jsr zendbyte ;stuur naar pc txa ;laadt registernummer jsr zendbyte ;stuur naar pc lda #$24 ;laadt pc-commando nummer jsr pccom ;stuur naar pc lda #$B5 ;laadt lage byte I/O adres jsr zendbyte ;stuur naar pc lda #$03 ;laadt hoge byte I/O adres jsr zendbyte ;stuur naar pc tya ;laadt registerdata jmp zendbyte ;stuur naar pc en einde routine hcuroff ldy #$FF ;laadt eerste cursorlijn hcuroff1 ldx #$0A ;laadt registernummer jsr hcrt ;zet crt ldy #13 ;laadt laatste cursorlijn inx ;verhoog registernummer jmp hcrt ;zet crt en einde routine hcuron ldy #$00 ;laadt eerste cursorlijn beq hcuroff1 ;zet crt en einde routine hwrch pha ;save karakter lda #$5B ;geef pc commando #5B01 jsr pccom lda #$01 ; d.i. schrijf direct naar videoram jsr zendbyte lda hmem ;stuur adres jsr zendbyte lda hmem+1 jsr zendbyte pla ;haal data terug jsr zendbyte ;stuur naar pc inc hmem ;verhoog videoram adres bne hwrch1 inc hmem+1 hwrch1 lda #$5B ;geef pc commando #5B01 jsr pccom lda #$01 ; d.i. schrijf direct naar videoram jsr zendbyte lda hmem ;stuur adres jsr zendbyte lda hmem+1 jsr zendbyte lda hattr ;laadt attribuut jsr zendbyte ;stuur naar pc inc hposx ;verhoog cursorpositie ldx hposx ;laadt x cursorpositie cpx #80 ;test op einde regel bne hwrch2 ;spring als geen einde regel ldx #0 ;cursor naar begin van regel stx hposx inc hposy ;bij einde regelpostitie verhogen hwrch2 ldy hposy ;laadt y cursorpositie cpy #25 ;test op einde scherm beq hwrch3 ;spring bij geen einde scherm jsr hcurxy ;zet cursor op nieuwe plaats hwrch3 rts ;einde routine vdu_init lda #30 ;wis scherm jsr vdu jsr hcuron ;zet cursor aan lda #0 ;reset vdu queue pointer sta queueptr rts ;einde routine vdu10 ldy hposy ;laadt cursor y positie cpy #24 ;op laatste regel? beq vdu10_1 ;ja, dan niets doen iny ;verhoog regelnummer ldx hposx ;niets doen aan x positie jsr hcurxy ;zet cursor een regel lager vdu10_1 jmp vdu_end vdu13 ldy hposy ;laadt y positie ldx #0 ;laadt nieuwe x positie jsr hcurxy ;cursor naar begin van regel jmp vdu_end vdu9 ldx hposx ;laadt cursor x positie cpx #79 ;op laatste karakter? beq vdu9_2 ;ja, dan ook y verhogen inx ;verhoog positie vdu9_1 ldy hposy ;niets doen aan y positie jsr hcurxy ;zet cursor een teken verder jmp vdu_end vdu9_2 ldx #0 ;cursor naar begin van regel stx hposx beq vdu10 ;verder via vdu10 vdu8 ldx hposx ;laadt cursor x positie cpx #00 ;op eerste karakter? beq vdu10_1 ;ja, dan niets doen dex ;verlaag positie jmp vdu9_1 vdu pha ;save accu stx vdusavex ;save x register sty vdusavey ;save y register lda queueptr ;laadt queue pointer beq vdu1 ;spring indien queue leeg is dec queueptr ;verlaag queue pointer beq vdu2 ;spring bij laatste karakter in queue tax ;zet queue pointer als index pla ;haal karakter van stack pha sta queue,x ;zet data in queue jmp vdu_end ;spring naar einde vdu1 pla ;haal data van stack pha cmp #10 ;test op vdu10 beq vdu10 cmp #13 ;test op vdu13 beq vdu13 cmp #9 ;test op vdu9 beq vdu9 cmp #8 ;test op vdu8 beq vdu8 cmp #30 ;test op vdu30 beq vdu30 cmp #127 ;test op delete beq vdu127 cmp #31 ;test op vdu31 beq q31 ;open queue voor vdu31 cmp #17 ;test op vdu17 beq q17 ;open queue voor vdu17 cmp #12 ;test op vdu12 beq vdu12 ;wis scherm met default attribuut cmp #16 ;test op vdu16 beq vdu16 ;wis scherm met huidig attribuut cmp #7 ;test op bell beq vdu7 jsr hwrch ;druk teken af in andere gevallen jmp vdu_end ;einde routine vdu2 pla ;haal data van stack pha sta queue+1 ;zet in queue lda queue ;laadt queue functie cmp #31 ;test op vdu31,x,y beq vdu31 ;spring bij vdu31 cmp #17 ;test op vdu17,c beq vdu17 ;spring bij vdu17 jmp vdu_end ;onbekende functie vdu_end pla ;herstel registers ldx vdusavex ldy vdusavey rts ;einde routine q31 ldx #31 ;laadt functienummer lda #2 ;laadt queue lengte q31_1 sta queueptr ;zet als queue pointer stx queue ;zet functienummer jmp vdu_end ;einde routine q17 ldx #17 ;laadt functienummer lda #1 ;laadt queue lengte bne q31_1 ;spring altijd vdu31 ldx queue+2 ;laadt nieuwe x positie ldy queue+1 ;laadt nieuwe y positie jsr hcurxy ;zet cursor op nieuwe positie vdu31_1 jmp vdu_end ;einde routine vdu17 jmp _vdu17 ;spring naar routine vdu30 jsr _vdu30 ;cursor naar linker bovenhoek jmp vdu_end vdu127 lda #8 ;cursor een positie achteruit jsr vdu lda #' ' ;wis teken op cursorpositie jsr vdu lda #8 ;cursor nogmaals achteruit jsr vdu jmp vdu_end vdu7 lda #7 ;geef bell signaal jsr zendbyte jmp vdu_end _vdu30 ldx #0 ;laadt nieuwe cursorpositie ldy #0 jsr hcurxy ;zet cursor op nieuwe positie rts ;einde routine vdu12 lda #7 ;laadt default attribuut sta hattr ;zet nieuw attribuut vdu16 jsr _vdu30 ;cursor naar links boven lda #<2000 ;laadt aantal te printen spaties sta queue ;zet in werkruimte lda #>2000 sta queue+1 vdu16_1 lda #' ' ;laadt spatie jsr hwrch ;schrijf naar scherm dec queue ;verlaag teller lda queue cmp #$FF bne vdu16_2 dec queue+1 vdu16_2 ora queue+1 ;alles gewist bne vdu16_1 ;nee, dan volgende jmp vdu30 ;einde routine _vdu17 ldx #7 ;laadt aantal kleuren _vdu17_1 lda vgacol,x ;lees vga kleurwaarde cmp queue+1 ;waarde in tabel? beq _vdu17_2 ;ja, dan spring dex ;verlaag index bpl _vdu17_1 ;zoek verder inx ;zet pointer naar begin van tabel _vdu17_2 lda mdacol,x ;lees mda kleurwaarde sta hattr ;berg op in geheugen jmp vdu_end ;einde routine vgacol .db $09,$70,$0E,$0F,$30,$0D,$4F mdacol .db $07,$70,$07,$0F,$70,$0F,$70 set_vga lda swrch ;zet interne wrch routine naar default sta iwrch lda swrch+1 sta iwrch+1 rts ;einde routine set_mda jsr cur_on_vga ;vga cursor aan lda #vdu sta iwrch+1 rts ;einde routine getvideo lda options ;laadt optie byte lsr a ;schuif monitor bit in carry rts ;da's alles