ORCA-C/Scanner.asm

1 line
15 KiB
NASM
Raw Normal View History

mcopy scanner.macros **************************************************************** * * Convertsl - Convert a string to a long integer * * Inputs: * str - pointer to the string * * Outputs: * Returns the value. * * Notes: * Assumes the string is valid. * **************************************************************** * Convertsl start val equ 0 return value subroutine (4:str),4 stz val initialize the number to zero stz val+2 lda [str] set X to the number of characters and #$00FF tax ldy #1 Y is the disp into the string lb1 asl val val := val*10 rol val+2 ph2 val+2 lda val asl val rol val+2 asl val rol val+2 adc val sta val pla adc val+2 sta val+2 lda [str],Y add in the new digit and #$000F adc val sta val bcc lb2 inc val+2 lb2 iny next character dex bne lb1 return 4:val end **************************************************************** * * KeyPress - Has a key been presed? * * If a key has not been pressed, this function returns * false. If a key has been pressed, it clears the key * strobe. If the key was an open-apple ., a terminal exit * is performed; otherwise, the function returns true. * **************************************************************** * KeyPress start KeyPressGS kpRec lda kpAvailable beq rts ReadKeyGS rkRec lda rkKey cmp #'.' bne lb1 lda rkModifiers and #$0100 beq lb1 ph2 #4 jsl TermError lb1 lda #1 rts rtl kpRec dc i'3' kpKey ds 2 kpModifiers ds 2 kpAvailable ds 2 rkRec dc i'2' rkKey ds 2 rkModifiers ds 2 end **************************************************************** * * NextCh - Read the next character from the file, skipping comments * * Outputs: * ch - character read * **************************************************************** * NextCh start eofChar equ 0 end of file character eolChar equ 13 end of line character stackFrameSize equ 14 size of the work space maxPath equ 255 max length of a path name fp equ 1 file record pointer; work pointer p1 equ 5 work pointer p2 equ 9 cch equ 13 enum (illegal,ch_special,ch_dash,ch_plus,ch_lt,ch_gt,ch_eq,ch_exc),0 enum (ch_and,ch_bar,ch_dot,ch_white,ch_eol,ch_eof,ch_char,ch_string) enum (ch_asterisk,ch_slash,ch_percent,ch_carot,ch_pound,letter,digit) tsc create stack frame sec sbc #stackFrameSize tcs phd tcd ! {flag for preprocessor check} ! if lastWasReturn then ! lastWasReturn := charKinds[ord(ch)] in [ch_eol,ch_white] ! else ! lastWasReturn := charKinds[ord(ch)] = ch_eol; lda ch asl A tax lda charKinds,X ldy #1 cmp #ch_eol beq pf2 ldx lastWasReturn beq pf1 cmp #ch_white beq pf2 pf1 dey pf2 sty lastWasReturn ! 1: lab1 anop ! if chPtr = eofPtr then begin {flag end of file if we're there} lda chPtr cmp eofPtr bne la1 lda chPtr+2 cmp eofPtr+2 beq la2 la1 brl lb5 la2 anop ! if not lastWasReturn then begin ! lastWasReturn := true; ! needWriteLine := true; ! ch := chr(eolChar); ! goto le2; ! end; {if} lda lastWasReturn bne la3 lda #1 sta lastWasReturn sta needWriteLine lda #eolChar sta ch brl le2 ! ch := chr(eofChar); la3 stz ch ! if needWriteLine then beg