/* Podprogram: czUINT ---------------------------------------*/ ; Czytanie liczby bez znaku z dalekopisu lub czytnika ; Zakres liczb: 0 .. 549755813887 ; Format liczby: ====0123456789= gdzie: ; = === -- kończący znak SP lub LF, możliwe też wiodące ; 0123456789 -- cyfry liczby ; Znak CR -- ignorowany ; Znak ? -- skasowanie liczby, by czytać ją ponownie ; Inne kody (w tym NU,FS,LS) -- błędne zakończenie liczby ; Argumenty: ; B1 = licznik znaków w wierszu (pozycja karetki) ; Dalekopis lub czytnik ustawiony na poczet cyfr ; Wywołanie: ; SKSB B6,czUINT+0 ;czytanie z czytnika nr 0 ; SKSB B6,czUINT+1 ;czytanie z dalekopisu: 1 ; SKSB B6,czUINT+2 ;czytanie z czytnika nr 2 ; SKSB B6,czUINT+B6 ;czytanie z urządzenia nr B6 ; Wyniki: ; B7 = wczytana liczba bez znaku w skali k38 ; B1 = zaktualizowany licznik znaków w wierszu (pozycja) ; A = ostatni wczytany znak w skali k21, oraz ; kod powrotu (nr błędu) w skali k12: ; =0 -- jest liczba zakończona znakiem SP lub LF ; =1 -- jest liczba, ale zakończona błędnym znakiem ; =2 xx brak cyfr, jest kończący znak SP,LF, B7=0 ; =3 -- brak cyfr, jest błędny znak kończący,B7=0 ; =4 -- za duża liczba (nadmiar), B7=śmieć ; Pozostałe rejestry odtworzone /*------------------------------------------------------------*/ czUINT A = [*+3] ..czUINT+6 ;czytanie z czytnika nr 0 A = [*+3] ..czUINT+6 ;czytanie z dalekopisu: 1 A = [*+3] ..czUINT+6 ;czytanie z czytnika nr 2 WE 0 ..#czU1 WE 1 ..#czU1 WE 2 ..#czU1 [#czUW] = A + B6 ;rozkaz czytania i adres powrotu ; [#czUL] = 0 ;początkowa wielkość liczby #czU0 EQU * A = 0c2000 ;flagi: brakCyfr, jestZnakSPLF [#czUF] = A ..#czUW ;czUW ==> tu wykona się rozkaz: 'WE 0', 'WE 1' lub 'WE 2' #czU1 EQU * ;znak wczytany SKLC B1++,++..++ ;inkrementacja licznika znaków A = A << 17 B6 = A = A & 31 ;znak w skali k21 NIC ..+++B6 ;------ SKLC B1--,#czUB ..#czUB ;0 = 'NU' ;błąd A = 3 ..#czUC ;1 = '3' B1 = 0 ..#czUS ;2 = 'LF' ;koniec A = 0c1000 ..#czUK ;3 = '-' ;błąd #czUS A = [#czUF] ..#czUX ;4 = 'SP' ;koniec A = 0c1000 ..#czUK ;5 = ''' ;błąd A = 8 ..#czUC ;6 = '8' #czUC [#czUF] = 0 ..#czU2 ;7 = '7' ;jest cyfra SKLC B1--,#czUW ..#czUW ;8 = 'CR' ;ignorowany A = 0c1000 ..#czUK ;9 = '*' ;błąd A = 4 ..#czUC ;10= '4' A = 0c1000 ..#czUK ;11= ';' ;błąd A = 0c1000 ..#czUK ;12= ',' ;błąd A = 0c1000 ..#czUK ;13= '!' ;błąd A = 0c1000 ..#czUK ;14= ':' ;błąd A = 0c1000 ..#czUK ;15= '(' ;błąd A = 5 ..#czUC ;16= '5' A = 0c1000 ..#czUK ;17= '+' ;błąd A = 0c1000 ..#czUK ;18= ')' ;błąd A = 2 ..#czUC ;19= '2' #czUB A = 0c1000 ..#czUK ;20= 'Ł' ;błąd A = 6 ..#czUC ;21= '6' A = 0 ..#czUC ;22= '0' A = 1 ..#czUC ;23= '1' A = 9 ..#czUC ;24= '9' [#czUL] = 0 ..#czU0 ;25= '?' ;skasowanie i od nowa A = 0c1000 ..#czUK ;26= '&' ;błąd SKLC B1--,#czUB ..#czUB ;27= 'FS' ;błąd A = 0c1000 ..#czUK ;28= '.' ;błąd A = 0c1000 ..#czUK ;29= '/' ;błąd A = 0c1000 ..#czUK ;30= '=' ;błąd SKLC B1--,#czUB ..#czUB ;31= 'LS' ;błąd ;------ #czU2 A = A >> 17 ;cyfra do skali k38 B7 = A A = [#czUL] SKU #czUV ;bit znaku już zajęty, nadmiar A - [#czUU] ;czy nowa cyfra się zmieści SKM #czU3 ;zmieści się SKW #czUV ;nie zmieści się, nadmiar A = B7 ;tylko cyfra <= 7 się zmieści A = A >> 3 SKNZ #czUV ;nie zmieści się, nadmiar A = [#czUL] #czU3 B7 = A + B7 B7 = A + B7 A = A << 3 [#czUL] = A + B7..#czUW ;i po następną cyfrę #czUV A = 0c4000 ..#czUK ;nadmiar - za wielka liczba #czUU DEFS 54975581388 ;max liczba bez ostatniej cyfry #czUX SKZ #czUK ..#czUW ;gdy były cyfry - kończący odstęp #czUK A = A + B6 ;wstawienie znaku kończącego B6 = [#czUW] ;przywrócenie adresu powrotu B7 = [#czUL] ;wczytana liczba A = A + [#czUF]..B6 ;powrót z podprogramu #czUW EQU 0c17572 ;rozkaz WE 0,ret, WE 1,ret lub WE 2,ret EQU 0c17573 #czUF EQU 0c17576 ;flagi: brak cyfr, błędny znak końcowy #czUL EQU 0c17577 ;wynikowa liczba /*----- Koniec czUINT ----------------------------------------*/ KONIEC ---