/* Podprogram: czINT ---------------------------------------*/ ; Czytanie liczby całkowitej z dalekopisu lub czytnika ; Zakres liczb: -274877906944 .. +274877906943 ; Format liczby: ===-0123456789= gdzie: ; = === -- kończący znak SP lub LF, możliwe też wiodące ; +,- -- znak liczby dodatniej,ujemnej, brak=dodatnia ; 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,czINT+0 ;czytanie z czytnika nr 0 ; SKSB B6,czINT+1 ;czytanie z dalekopisu: 1 ; SKSB B6,czINT+2 ;czytanie z czytnika nr 2 ; SKSB B6,czINT+B6 ;czytanie z urządzenia nr B6 ; Wyniki: ; B7 = wczytana liczba całkowita 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 -- 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 /*------------------------------------------------------------*/ czINT A = [*+3] ..czINT+6 ;czytanie z czytnika nr 0 A = [*+3] ..czINT+6 ;czytanie z dalekopisu: 1 A = [*+3] ..czINT+6 ;czytanie z czytnika nr 2 WE 0 ..#czI1 WE 1 ..#czI1 WE 2 ..#czI1 [#czIW] = A + B6 ;rozkaz czytania i adres powrotu ; [#czIL] = 0 ;początkowa wielkość liczby #czI0 EQU * A = [#czIA] ;rozkaz 'B7=A-0' :302... [#czI3] = A ; dla liczby bez znaku A = 0c2000 ;flagi: brakCyfr, jestZnakSPLF [#czIF] = A ..#czIW ;czIW ==> tu wykona się rozkaz: 'WE 0', 'WE 1' lub 'WE 2' #czI1 EQU * ;znak wczytany SKLC B1++,++..++ ;inkrementacja licznika znaków A = A << 17 B6 = A = A & 31 ;znak w skali k21 NIC ..+++B6 ;------ SKLC B1--,#czIB ..#czIB ;0 = 'NU' ;błąd A = 3 ..#czIC ;1 = '3' B1 = 0 ..#czIS ;2 = 'LF' ;koniec A = [#czIM] ..#czIZ ;3 = '-' ;liczba ze znakiem - #czIS A = [#czIF] ..#czIX ;4 = 'SP' ;koniec A = 0c1000 ..#czIK ;5 = ''' ;błąd A = 8 ..#czIC ;6 = '8' #czIC [#czIF] = 0 ..#czI2 ;7 = '7' ;jest cyfra SKLC B1--,#czIW ..#czIW ;8 = 'CR' ;ignorowany A = 0c1000 ..#czIK ;9 = '*' ;błąd A = 4 ..#czIC ;10= '4' A = 0c1000 ..#czIK ;11= ';' ;błąd A = 0c1000 ..#czIK ;12= ',' ;błąd A = 0c1000 ..#czIK ;13= '!' ;błąd A = 0c1000 ..#czIK ;14= ':' ;błąd A = 0c1000 ..#czIK ;15= '(' ;błąd A = 5 ..#czIC ;16= '5' A = [#czIP] ..#czIZ ;17= '+' ;liczba ze znakiem + A = 0c1000 ..#czIK ;18= ')' ;błąd A = 2 ..#czIC ;19= '2' #czIB A = 0c1000 ..#czIK ;20= 'Ł' ;błąd A = 6 ..#czIC ;21= '6' A = 0 ..#czIC ;22= '0' A = 1 ..#czIC ;23= '1' A = 9 ..#czIC ;24= '9' [#czIL] = 0 ..#czI0 ;25= '?' ;skasowanie i od nowa A = 0c1000 ..#czIK ;26= '&' ;błąd SKLC B1--,#czIB ..#czIB ;27= 'FS' ;błąd A = 0c1000 ..#czIK ;28= '.' ;błąd A = 0c1000 ..#czIK ;29= '/' ;błąd A = 0c1000 ..#czIK ;30= '=' ;błąd SKLC B1--,#czIB ..#czIB ;31= 'LS' ;błąd ;------ #czI2 A = A >> 17 ..#czI3 ;cyfra do skali k38 ;czI3 ==> tu wykona się rozkaz: 'B7=A-0', 'B7=A+0' lub 'B7=0-A' #czI4 A = [#czIL] B7 = A + B7 B7 = A + B7 A = A << 3 SKV #czIV ;nadmiar wykrywamy dopiero teraz [#czIL] = A + B7 SKV #czIV ..#czIW ;nadmiar lub po następną cyfrę #czIV A = 0c4000 ..#czIK ;nadmiar - za wielka liczba #czIX SKZ #czIK ;gdy były cyfry - kończący odstęp [#czI3] ;czy był znak liczby SKU #czIB ..#czIW ;gdy był znak - błąd #czIZ [#czIF] ;czy to początek liczby SKZ #czIB ; nie, już były cyfry - błąd [#czI3] ;czy był już znak liczby SKU #czIB ; tak, był znak - błąd [#czI3] = A ..#czIW ;rozkaz dla liczby ze znakiem #czIK A = A + B6 ;wstawienie znaku kończącego B6 = [#czIW] ;przywrócenie adresu powrotu B7 = [#czIL] ;wczytana liczba A = A + [#czIF]..B6 ;powrót z podprogramu #czIA B7 = A-0 ..#czI4 ;rozkaz :302... dla liczby bez znaku #czIP B7 = A+0 ..#czI4 ;rozkaz :402... dla liczby z plusem #czIM B7 = 0-A ..#czI4 ;rozkaz :502... dla liczby z minusem #czIW EQU 0c17572 ;rozkaz WE 0,ret, WE 1,ret lub WE 2,ret #czI3 EQU 0c17573 ;rozkaz B7=A-0, B7=A+0 lub B7=0-A #czIF EQU 0c17576 ;flagi: brak cyfr, błędny znak końcowy #czIL EQU 0c17577 ;wynikowa liczba /*----- Koniec czINT -----------------------------------------*/ KONIEC ---