;**********************************************************************; ;* 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 : input.inc *; ;* auteur : Roland Leurs *; ;* The Atomic Development Studio *; ;* ontwikkeld : feb 1996 *; ;* laatste update : *; ;*--------------------------------------------------------------------*; ;* assembleren : als include file opnemen in debug.asm *; ;**********************************************************************; iwrk equ work+$18 ;zeer tijdelijke werkruimte input ldx #0 ;reset pointer stx iwrk stx iwrk+1 ;reset getal stx iwrk+2 stx iwrk+3 stx iwrk+4 input_loop jsr rdch ;lees karakter cpx #0 ;als eerste invoer #, ' en - toestaan bne input_lab2 ;spring als niet eerste karakter ; ldy #1 ;zet invoertype op hexadecimaal cmp #'#' ;hexadecimale invoer? beq input_lab1 ; ldy #2 ;zet invoertype op ascii cmp #'''' ;karakter invoer? beq input_lab1 ; ldy #3 ;zet invoertype negatief cmp #'-' ;negatieve decimale invoer? beq input_lab1 bne input_lab2 input_error lda #7 ;geef beep jsr wrch jmp input_loop ;ga volgend teken lezen input_lab1 sta iwrk+4 ;zet invoer type jsr wrch inx jmp input_loop ;volgend teken lezen input_lab2 cmp #13 ;test op einde invoer beq input_calc ;spring bij einde invoer cmp #127 ;test op delete beq input_delete cmp #'0' ;cijfer? bcc input_lab4 cmp #':' ;is '9'+1 bcs input_lab4 input_lab3 cpx #12 ;max invoer lengte bereikt? beq input_error sta iwrk+4,x ;berg digit op in geheugen jsr wrch ;laat ook zien inx ;verhoog invoer teller bne input_loop ;anders volgende karakter lezen input_lab4 ldy iwrk+4 ;test invoer type cpy #'''' ;ascii invoer? beq input_lab3 ;dan alles mogelijk cpy #'#' ;hexadecimaal? bne input_error ;nee, dan ongeldig karakter, straffen! and #11011111b ;maak hoofdletter cmp #'A' ;test op hexadecimaal digit bcc input_error cmp #'G' bcs input_error bne input_lab3 ;opbergen input_delete cpx #0 ;cursor al op begin? beq input_error ;ja, dan negeren dex ;pointer terugzetten jsr wrch ;wis vorig karakter van scherm jmp input_loop ;volgend karakter lezen input_calc sta iwrk+4,x ;sluit string af ldx #0 ;reset pointer lda iwrk+4 ;lees input mode cmp #'''' ;test op ascii bne input_calc1 jmp input_ascii input_calc1 cmp #'#' ;test op hexadecimaal bne input_decimaal jmp input_hex input_decimaal lda iwrk+4,x ;lees digit cmp #'-' ;negatief getal? bne input_dec1 inx input_dec1 lda iwrk+4,x ;lees karakter cmp #13 beq input_dec_neg ;spring indien laatste karakter input_dec2 sec ;ascii>decimaal aanpassing voor digit sbc #'0' sta iwrk+4,x clc ;wis carry voor schuiven asl iwrk ;schuif links rol iwrk+1 rol iwrk+2 rol iwrk+3 ldy #3 ;zet resultaat even op stack input_dec3 lda iwrk,y pha dey bpl input_dec3 ldy #1 input_dec4 clc ;wis carry voor schuiven asl iwrk ;schuif links rol iwrk+1 rol iwrk+2 rol iwrk+3 dey ;twee maal schuiven bpl input_dec4 clc ;wis carry voor optellen pla adc iwrk ;tel inhoud van stack erbij op sta iwrk pla adc iwrk+1 sta iwrk+1 pla adc iwrk+2 sta iwrk+2 pla adc iwrk+3 sta iwrk+3 clc ;wis carry voor optellen lda iwrk+4,x adc iwrk ;tel digit op bij resultaat sta iwrk lda iwrk+1 adc #0 sta iwrk+1 lda iwrk+2 adc #0 sta iwrk+2 lda iwrk+3 adc #0 sta iwrk+3 inx bne input_dec1 ;spring voor volgende getal input_dec_neg lda iwrk+4 ;test op negatief getal cmp #'-' beq input_is_neg ;indien negatief dan aanpassen jmp input_einde ;indien positief dan klaar input_is_neg ldy #1 ;wis teller clc ;wis carry lda #$FF ;bereken 2-complement eor iwrk adc #1 sta iwrk input_dec5 lda #$FF eor iwrk,y adc #0 sta iwrk,y iny cpy #4 bne input_dec5 jmp input_einde input_ascii lda iwrk+5 ;lees karakter sta iwrk ;berg op in resultaat jmp input_einde ;einde routine input_hex inx ;verhoog pointer lda iwrk+4,x ;lees karakter cmp #13 ;einde string? beq input_einde input_hex1 ldy #0 ;reset teller input_hex2 clc ;wis carry voor schuiven asl iwrk ;schuif links rol iwrk+1 rol iwrk+2 rol iwrk+3 iny ;verhoog index cpy #4 ;vier maal geschoven? bne input_hex2 ;nee, verder schuiven lda iwrk+4,x ;lees digit cmp #'A' ;hexadecimaal digit bcc input_hex3 sbc #$07 ;aanpassen van hexadecimaal digit input_hex3 sec sbc #'0' clc ;wis carry voor optellen adc iwrk ;tel digit op bij resultaat sta iwrk lda iwrk+1 adc #0 sta iwrk+1 lda iwrk+2 adc #0 sta iwrk+2 lda iwrk+3 adc #0 sta iwrk+3 jmp input_hex ;spring voor volgende digit input_einde rts ;einde routine