/* Podprogram: czNAT+1 ---------------------------------------*/ ; Czytanie liczby naturalnej z dalekopisu ; Zakres liczb: 0 .. 274877906943 ; 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,czNAT+1 ;czytanie z dalekopisu: 1 ; Wyniki: ; B7 = wczytana liczba naturalna 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 /*------------------------------------------------------------*/ czNAT A = A + [#czNF]..B6 ;<====== niedozwolony punkt wejścia [#czNW] = B6 ;czNAT+1 -- dozwolony punkt wejścia ;<====== niedozwolony punkt wejścia [#czNL] = 0 ;początkowa wielkość liczby #czN0 EQU * A = 0c2000 ;flagi: brakCyfr, jestZnakSPLF [#czNF] = A #czN1 EQU * WE 1 ;wczytanie znaku z dalekopisu SKLC B1++,++..++ ;inkrementacja licznika znaków A = A << 17 B6 = A = A & 31 ;znak w skali k21 NIC ..+++B6 ;------ SKLC B1--,#czNB ..#czNB ;0 = 'NU' ;błąd A = 3 ..#czNC ;1 = '3' B1 = 0 ..#czNS ;2 = 'LF' ;koniec A = 0c1000 ..#czNK ;3 = '-' ;błąd #czNS A = [#czNF] ..#czNX ;4 = 'SP' ;koniec A = 0c1000 ..#czNK ;5 = ''' ;błąd A = 8 ..#czNC ;6 = '8' #czNC [#czNF] = 0 ..#czN2 ;7 = '7' ;jest cyfra SKLC B1--,#czN1 ..#czN1 ;8 = 'CR' ;ignorowany A = 0c1000 ..#czNK ;9 = '*' ;błąd A = 4 ..#czNC ;10= '4' A = 0c1000 ..#czNK ;11= ';' ;błąd A = 0c1000 ..#czNK ;12= ',' ;błąd A = 0c1000 ..#czNK ;13= '!' ;błąd A = 0c1000 ..#czNK ;14= ':' ;błąd A = 0c1000 ..#czNK ;15= '(' ;błąd A = 5 ..#czNC ;16= '5' A = 0c1000 ..#czNK ;17= '+' ;błąd A = 0c1000 ..#czNK ;18= ')' ;błąd A = 2 ..#czNC ;19= '2' #czNB A = 0c1000 ..#czNK ;20= 'Ł' ;błąd A = 6 ..#czNC ;21= '6' A = 0 ..#czNC ;22= '0' A = 1 ..#czNC ;23= '1' A = 9 ..#czNC ;24= '9' [#czNL] = 0 ..#czN0 ;25= '?' ;skasowanie i od nowa A = 0c1000 ..#czNK ;26= '&' ;błąd SKLC B1--,#czNB ..#czNB ;27= 'FS' ;błąd A = 0c1000 ..#czNK ;28= '.' ;błąd A = 0c1000 ..#czNK ;29= '/' ;błąd A = 0c1000 ..#czNK ;30= '=' ;błąd SKLC B1--,#czNB ..#czNB ;31= 'LS' ;błąd ;------ #czN2 A = A >> 17 ;cyfra do skali k38 B7 = A A = [#czNL] B7 = A + B7 B7 = A + B7 A = A << 3 SKV #czNV ;nadmiar wykrywamy dopiero teraz [#czNL] = A + B7 SKV #czNV ..#czN1 ;nadmiar lub po następną cyfrę #czNV A = 0c4000 ..#czNK ;nadmiar - za wielka liczba #czNX SKZ #czNK ..#czN1 ;gdy były cyfry - kończący odstęp #czNK A = A + B6 ;wstawienie znaku kończącego B6 = [#czNW] ;przywrócenie adresu powrotu B7 = [#czNL] ..czNAT ;wczytana liczba #czNW EQU 0c17572 ;adres powrotu EQU 0c17573 #czNF EQU 0c17576 ;flagi: brak cyfr, błędny znak końcowy #czNL EQU 0c17577 ;wynikowa liczba /*----- Koniec czNAT -----------------------------------------*/ KONIEC ---